Merge branch 'main' into pr/301
2
.github/workflows/docker-publish.yml
vendored
@ -100,7 +100,7 @@ jobs:
|
|||||||
REVISION=${{ fromJSON(steps.meta.outputs.json).labels['org.opencontainers.image.revision'] }}
|
REVISION=${{ fromJSON(steps.meta.outputs.json).labels['org.opencontainers.image.revision'] }}
|
||||||
# https://github.com/docker/setup-qemu-action#about
|
# https://github.com/docker/setup-qemu-action#about
|
||||||
# platforms: linux/amd64,linux/arm64,linux/riscv64,linux/ppc64le,linux/s390x,linux/386,linux/mips64le,linux/mips64,linux/arm/v7,linux/arm/v6
|
# platforms: linux/amd64,linux/arm64,linux/riscv64,linux/ppc64le,linux/s390x,linux/386,linux/mips64le,linux/mips64,linux/arm/v7,linux/arm/v6
|
||||||
platforms: linux/amd64,linux/arm64,linux/arm/v7,linux/arm/v6
|
platforms: linux/amd64,linux/arm64,linux/arm/v7
|
||||||
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
|
||||||
|
|
||||||
|
|||||||
6
.vscode/settings.json
vendored
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
{
|
||||||
|
"files.exclude": {
|
||||||
|
"**/.next": true,
|
||||||
|
"**/node_modules": true
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -11,7 +11,7 @@ RUN <<EOF
|
|||||||
set -xe
|
set -xe
|
||||||
apk add libc6-compat
|
apk add libc6-compat
|
||||||
apk add --virtual .gyp python3 make g++
|
apk add --virtual .gyp python3 make g++
|
||||||
yarn global add pnpm
|
npm install -g pnpm
|
||||||
EOF
|
EOF
|
||||||
|
|
||||||
RUN --mount=type=cache,id=pnpm-store,target=/root/.local/share/pnpm/store pnpm fetch | grep -v "cross-device link not permitted\|Falling back to copying packages from store"
|
RUN --mount=type=cache,id=pnpm-store,target=/root/.local/share/pnpm/store pnpm fetch | grep -v "cross-device link not permitted\|Falling back to copying packages from store"
|
||||||
@ -31,7 +31,7 @@ COPY . .
|
|||||||
|
|
||||||
RUN <<EOF
|
RUN <<EOF
|
||||||
set -xe
|
set -xe
|
||||||
yarn next telemetry disable
|
npm run telemetry
|
||||||
mkdir config && echo '-' > config/settings.yaml
|
mkdir config && echo '-' > config/settings.yaml
|
||||||
NEXT_PUBLIC_BUILDTIME=$BUILDTIME NEXT_PUBLIC_VERSION=$VERSION NEXT_PUBLIC_REVISION=$REVISION npm run build
|
NEXT_PUBLIC_BUILDTIME=$BUILDTIME NEXT_PUBLIC_VERSION=$VERSION NEXT_PUBLIC_REVISION=$REVISION npm run build
|
||||||
EOF
|
EOF
|
||||||
|
|||||||
77
README.md
@ -1,12 +1,19 @@
|
|||||||
<p align="center">
|
<p align="center">
|
||||||
<br>
|
|
||||||
<picture>
|
<picture>
|
||||||
<source media="(prefers-color-scheme: dark)" srcset="images/homepage-dark.png">
|
<source media="(prefers-color-scheme: dark)" srcset="images/banner_light@2x.png">
|
||||||
<img src="images/homepage-light.png" width="65%">
|
<img src="images/banner_dark@2x.png" width="65%">
|
||||||
</picture>
|
</picture>
|
||||||
<br><br>
|
</p>
|
||||||
|
|
||||||
|
<p align="center">
|
||||||
|
A modern <em>(fully static, fast)</em>, secure <em>(fully proxied)</em>, highly customizable application dashboard with integrations for more than 25 services and translations for over 15 languages. Easily configured via YAML files (or discovery via docker labels).
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p align="center">
|
||||||
<img src="images/1.png" />
|
<img src="images/1.png" />
|
||||||
<br>
|
</p>
|
||||||
|
|
||||||
|
<p align="center">
|
||||||
<img src="images/2.png" width="19%" />
|
<img src="images/2.png" width="19%" />
|
||||||
<img src="images/3.png" width="19%" />
|
<img src="images/3.png" width="19%" />
|
||||||
<img src="images/4.png" width="19%" />
|
<img src="images/4.png" width="19%" />
|
||||||
@ -20,17 +27,18 @@
|
|||||||
</p>
|
</p>
|
||||||
|
|
||||||
<p align="center">
|
<p align="center">
|
||||||
<a href="https://github.com/benphelps/homepage/actions/workflows/docker-publish.yml"><img src="https://github.com/benphelps/homepage/actions/workflows/docker-publish.yml/badge.svg" alt="Docker"></a>
|
<a href="https://github.com/benphelps/homepage/actions/workflows/docker-publish.yml"><img src="https://github.com/benphelps/homepage/actions/workflows/docker-publish.yml/badge.svg" alt="Docker"></a>
|
||||||
<a href="https://hosted.weblate.org/engage/homepage/"><img src="https://hosted.weblate.org/widgets/homepage/-/homepage/svg-badge.svg" alt="Weblate"></a>
|
<a href="https://hosted.weblate.org/engage/homepage/"><img src="https://hosted.weblate.org/widgets/homepage/-/homepage/svg-badge.svg" alt="Weblate"></a>
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
## Features
|
## Features
|
||||||
|
|
||||||
- Fast! The entire site is statically generated at build time, so you can expect instant load times
|
- **Fast!** The entire site is statically generated at build time, so you can expect instant load times
|
||||||
|
- **Secure!** Every API request to backend services goes through a proxy server, so your API keys are never exposed to the frontend client.
|
||||||
- Images built for AMD64 (x86_64), ARM64, ARMv7 and ARMv6
|
- Images built for AMD64 (x86_64), ARM64, ARMv7 and ARMv6
|
||||||
- Supports all Raspberry Pi's, most SBCs & Apple Silicon
|
- Supports all Raspberry Pi's, most SBCs & Apple Silicon
|
||||||
- Full i18n support with automatic language detection
|
- Full i18n support with automatic language detection
|
||||||
- Translations for Chinese, Dutch, French, German, Hebrew, Hungarian, Norwegian Bokmål, Polish, Portuguese, Russian, Spanish and Swedish
|
- Translations for Catalan, Chinese, Dutch, Finnish, French, German, Hebrew, Hungarian, Norwegian Bokmål, Polish, Portuguese, Portuguese (Brazil), Romainian, Russian, Spanish, Swedish and Yue
|
||||||
- Want to help translate? [Join the Weblate project](https://hosted.weblate.org/engage/homepage/)
|
- Want to help translate? [Join the Weblate project](https://hosted.weblate.org/engage/homepage/)
|
||||||
- Service & Web Bookmarks
|
- Service & Web Bookmarks
|
||||||
- Docker Integration
|
- Docker Integration
|
||||||
@ -39,17 +47,17 @@
|
|||||||
- Service Integration
|
- Service Integration
|
||||||
- Sonarr, Radarr, Readarr, Prowlarr, Bazarr, Lidarr, Emby, Jellyfin, Tautulli (Plex)
|
- Sonarr, Radarr, Readarr, Prowlarr, Bazarr, Lidarr, Emby, Jellyfin, Tautulli (Plex)
|
||||||
- Ombi, Overseerr, Jellyseerr, Jackett, NZBGet, SABnzbd, ruTorrent, Transmission, qBittorrent
|
- Ombi, Overseerr, Jellyseerr, Jackett, NZBGet, SABnzbd, ruTorrent, Transmission, qBittorrent
|
||||||
- Portainer, Traefik, Speedtest Tracker, PiHole, AdGuard Home, Nginx Proxy Manager, Gotify, Syncthing Relay Server
|
- Portainer, Traefik, Speedtest Tracker, PiHole, AdGuard Home, Nginx Proxy Manager, Gotify, Syncthing Relay Server, Authentic, Proxmox
|
||||||
- Information Providers
|
- Information Providers
|
||||||
- Coin Market Cap, Mastodon
|
- Coin Market Cap, Mastodon
|
||||||
- Information & Utility Widgets
|
- Information & Utility Widgets
|
||||||
- System Stats (Disk, CPU, Memory)
|
- System Stats (Disk, CPU, Memory)
|
||||||
- Weather via WeatherAPI.com or OpenWeatherMap
|
- Weather via WeatherAPI.com or OpenWeatherMap
|
||||||
- Automatic location detection (with HTTPS), or manual location selection
|
|
||||||
- Search Bar
|
- Search Bar
|
||||||
- Customizable
|
- Customizable
|
||||||
- 21 theme colors with light and dark mode support
|
- 21 theme colors with light and dark mode support
|
||||||
- Background image support
|
- Background image support
|
||||||
|
- Column and Row layout options
|
||||||
|
|
||||||
## Support & Suggestions
|
## Support & Suggestions
|
||||||
|
|
||||||
@ -140,26 +148,43 @@ Huge thanks to the all the contributors who have helped make this project what i
|
|||||||
|
|
||||||
- [aidenpwnz](https://github.com/benphelps/homepage/commits?author=aidenpwnz) - Nginx Proxy Manager, Search Bar Widget
|
- [aidenpwnz](https://github.com/benphelps/homepage/commits?author=aidenpwnz) - Nginx Proxy Manager, Search Bar Widget
|
||||||
- [AlexFullmoon](https://github.com/benphelps/homepage/commits?author=AlexFullmoon) - OpenWeatherMap Widget
|
- [AlexFullmoon](https://github.com/benphelps/homepage/commits?author=AlexFullmoon) - OpenWeatherMap Widget
|
||||||
- [AmadeusGraves](https://github.com/benphelps/homepage/commits?author=AmadeusGraves) - Spanish Translation
|
|
||||||
- [andrii-kryvoviaz](https://github.com/benphelps/homepage/commits?author=andrii-kryvoviaz) - Background opacity option
|
- [andrii-kryvoviaz](https://github.com/benphelps/homepage/commits?author=andrii-kryvoviaz) - Background opacity option
|
||||||
- [boerniee](https://github.com/benphelps/homepage/commits?author=boerniee) - German Translation
|
|
||||||
- [comradekingu](https://github.com/benphelps/homepage/commits?author=comradekingu) - Norwegian Bokmål Translation
|
|
||||||
- Daniel Varga - German & Hungarian Translation
|
|
||||||
- [deffcolony](https://github.com/benphelps/homepage/commits?author=deffcolony) - Dutch Translation
|
|
||||||
- [desolaris](https://github.com/benphelps/homepage/commits?author=desolaris) - Russian Translation
|
|
||||||
- [DevPGSV](https://github.com/benphelps/homepage/commits?author=DevPGSV) - Syncthing Relay Server & Mastodon widgets
|
- [DevPGSV](https://github.com/benphelps/homepage/commits?author=DevPGSV) - Syncthing Relay Server & Mastodon widgets
|
||||||
- [ilusi0n](https://github.com/benphelps/homepage/commits?author=ilusi0n) - Jellyseerr Integration
|
- [ilusi0n](https://github.com/benphelps/homepage/commits?author=ilusi0n) - Jellyseerr Integration
|
||||||
- [ItsJustMeChris](https://github.com/benphelps/homepage/commits?author=ItsJustMeChris) - Coin Market Cap Widget
|
- [ItsJustMeChris](https://github.com/benphelps/homepage/commits?author=ItsJustMeChris) - Coin Market Cap Widget
|
||||||
- [jackblk](https://github.com/benphelps/homepage/commits?author=jackblk) - Vietnamese Translation
|
- [JazzFisch](https://github.com/benphelps/homepage/commits?author=JazzFisch) - Readarr, Bazarr, Lidarr, SABnzbd, Transmission, qBittorrent, Proxmox Integrations & countless more improvements
|
||||||
- [JazzFisch](https://github.com/benphelps/homepage/commits?author=JazzFisch) - Readarr, Bazarr, Lidarr, SABnzbd, Transmission & qBittorrent Integrations
|
- [josways](https://github.com/benphelps/homepage/commits?author=josways) - Baidu search provider
|
||||||
- [juanmanuelbc](https://github.com/benphelps/homepage/commits?author=juanmanuelbc) - Spanish and Catalan Translations
|
- [mauricio-kalil](https://github.com/benphelps/homepage/commits?author=mauricio-kalil) - Portuguese (Brazil)
|
||||||
- [modem7](https://github.com/benphelps/homepage/commits?author=modem7) - Impvoed Docker Image
|
- [modem7](https://github.com/benphelps/homepage/commits?author=modem7) - Impvoed Docker Image
|
||||||
- [nicedc](https://github.com/benphelps/homepage/commits?author=nicedc) - Chinese Translation
|
- [MountainGod2](https://github.com/benphelps/homepage/discussions/243) - Homepage Logo
|
||||||
- [Nonoss117](https://github.com/benphelps/homepage/commits?author=Nonoss117) - French Translation
|
|
||||||
- [pacoculebras](https://github.com/benphelps/homepage/commits?author=pacoculebras) - Catalan Translation
|
|
||||||
- [psychodracon](https://github.com/benphelps/homepage/commits?author=psychodracon) - Polish Translation
|
|
||||||
- [quod](https://github.com/benphelps/homepage/commits?author=quod) - Fixed Typos
|
- [quod](https://github.com/benphelps/homepage/commits?author=quod) - Fixed Typos
|
||||||
- [schklom](https://github.com/benphelps/homepage/commits?author=schklom) - ARM64, ARMv7 and ARMv6
|
- [schklom](https://github.com/benphelps/homepage/commits?author=schklom) - ARM64, ARMv7 and ARMv6
|
||||||
- [ShlomiPorush](https://github.com/benphelps/homepage/commits?author=ShlomiPorush) - Hebrew Translation
|
|
||||||
- [SuperDOS](https://github.com/benphelps/homepage/commits?author=SuperDOS) - Swedish Translation
|
|
||||||
- [xicopitz](https://github.com/benphelps/homepage/commits?author=xicopitz) - Gotify & Prowlarr Integration
|
- [xicopitz](https://github.com/benphelps/homepage/commits?author=xicopitz) - Gotify & Prowlarr Integration
|
||||||
|
|
||||||
|
### Translators
|
||||||
|
|
||||||
|
- [3vilson](https://github.com/benphelps/homepage/commits?author=3vilson) - German
|
||||||
|
- [4lenz1](https://github.com/benphelps/homepage/commits?author=4lenz1) - Chinese
|
||||||
|
- [AmadeusGraves](https://github.com/benphelps/homepage/commits?author=AmadeusGraves) - Spanish
|
||||||
|
- [boerniee](https://github.com/benphelps/homepage/commits?author=boerniee) - German
|
||||||
|
- [brunoccr](https://github.com/benphelps/homepage/commits?author=brunoccr) - Portuguese (Brazil)
|
||||||
|
- [C8opmBM](https://github.com/benphelps/homepage/commits?author=C8opmBM) - Romainian
|
||||||
|
- [comradekingu](https://github.com/benphelps/homepage/commits?author=comradekingu) - Norwegian Bokmål
|
||||||
|
- Daniel Varga - German & Hungarian
|
||||||
|
- [deffcolony](https://github.com/benphelps/homepage/commits?author=deffcolony) - Dutch
|
||||||
|
- [desolaris](https://github.com/benphelps/homepage/commits?author=desolaris) - Russian
|
||||||
|
- [ericlokz](https://github.com/benphelps/homepage/commits?author=ericlokz) - Yue
|
||||||
|
- [FunsKiTo](https://github.com/benphelps/homepage/commits?author=FunsKiTo) - Spanish
|
||||||
|
- [jackblk](https://github.com/benphelps/homepage/commits?author=jackblk) - Vietnamese
|
||||||
|
- [juanmanuelbc](https://github.com/benphelps/homepage/commits?author=juanmanuelbc) - Spanish and Catalan
|
||||||
|
- [ling0412](https://github.com/benphelps/homepage/commits?author=ling0412) - Chinese
|
||||||
|
- [milotype](https://github.com/benphelps/homepage/commits?author=milotype) - Croatian
|
||||||
|
- [nicedc](https://github.com/benphelps/homepage/commits?author=nicedc) - Chinese
|
||||||
|
- [Nonoss117](https://github.com/benphelps/homepage/commits?author=Nonoss117) - French
|
||||||
|
- [pacoculebras](https://github.com/benphelps/homepage/commits?author=pacoculebras) - Catalan
|
||||||
|
- [Prilann](https://github.com/benphelps/homepage/commits?author=Prilann) - German
|
||||||
|
- [psychodracon](https://github.com/benphelps/homepage/commits?author=psychodracon) - Polish
|
||||||
|
- Sascha Jelinek - German
|
||||||
|
- [ShlomiPorush](https://github.com/benphelps/homepage/commits?author=ShlomiPorush) - Hebrew
|
||||||
|
- [SuperDOS](https://github.com/benphelps/homepage/commits?author=SuperDOS) - Swedish
|
||||||
|
- [kaihu](https://github.com/benphelps/homepage/commits?author=kaihu) - Finnish
|
||||||
|
|||||||
BIN
images/banner_dark@2x.png
Normal file
|
After Width: | Height: | Size: 31 KiB |
BIN
images/banner_light@2x.png
Normal file
|
After Width: | Height: | Size: 30 KiB |
|
Before Width: | Height: | Size: 15 KiB |
|
Before Width: | Height: | Size: 15 KiB |
@ -32,7 +32,8 @@
|
|||||||
"shvl": "^3.0.0",
|
"shvl": "^3.0.0",
|
||||||
"swr": "^1.3.0",
|
"swr": "^1.3.0",
|
||||||
"tough-cookie": "^4.1.2",
|
"tough-cookie": "^4.1.2",
|
||||||
"winston": "^3.8.2"
|
"winston": "^3.8.2",
|
||||||
|
"xml-js": "^1.6.11"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@tailwindcss/forms": "^0.5.3",
|
"@tailwindcss/forms": "^0.5.3",
|
||||||
|
|||||||
@ -40,6 +40,7 @@ specifiers:
|
|||||||
tough-cookie: ^4.1.2
|
tough-cookie: ^4.1.2
|
||||||
typescript: ^4.8.3
|
typescript: ^4.8.3
|
||||||
winston: ^3.8.2
|
winston: ^3.8.2
|
||||||
|
xml-js: ^1.6.11
|
||||||
|
|
||||||
dependencies:
|
dependencies:
|
||||||
'@headlessui/react': 1.7.2_biqbaboplfbrettd7655fr4n2y
|
'@headlessui/react': 1.7.2_biqbaboplfbrettd7655fr4n2y
|
||||||
@ -65,6 +66,7 @@ dependencies:
|
|||||||
swr: 1.3.0_react@18.2.0
|
swr: 1.3.0_react@18.2.0
|
||||||
tough-cookie: 4.1.2
|
tough-cookie: 4.1.2
|
||||||
winston: 3.8.2
|
winston: 3.8.2
|
||||||
|
xml-js: 1.6.11
|
||||||
|
|
||||||
devDependencies:
|
devDependencies:
|
||||||
'@tailwindcss/forms': 0.5.3_tailwindcss@3.1.8
|
'@tailwindcss/forms': 0.5.3_tailwindcss@3.1.8
|
||||||
@ -2554,6 +2556,10 @@ packages:
|
|||||||
resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==}
|
resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==}
|
||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
|
/sax/1.2.4:
|
||||||
|
resolution: {integrity: sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==}
|
||||||
|
dev: false
|
||||||
|
|
||||||
/scheduler/0.23.0:
|
/scheduler/0.23.0:
|
||||||
resolution: {integrity: sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==}
|
resolution: {integrity: sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==}
|
||||||
dependencies:
|
dependencies:
|
||||||
@ -3000,6 +3006,13 @@ packages:
|
|||||||
/wrappy/1.0.2:
|
/wrappy/1.0.2:
|
||||||
resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==}
|
resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==}
|
||||||
|
|
||||||
|
/xml-js/1.6.11:
|
||||||
|
resolution: {integrity: sha512-7rVi2KMfwfWFl+GpPg6m80IVMWXLRjO+PxTq7V2CDhoGak0wzYzFgUY2m4XJ47OGdXd8eLE8EmwfAmdjw7lC1g==}
|
||||||
|
hasBin: true
|
||||||
|
dependencies:
|
||||||
|
sax: 1.2.4
|
||||||
|
dev: false
|
||||||
|
|
||||||
/xtend/4.0.2:
|
/xtend/4.0.2:
|
||||||
resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==}
|
resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==}
|
||||||
engines: {node: '>=0.4'}
|
engines: {node: '>=0.4'}
|
||||||
|
|||||||
BIN
public/android-chrome-192x192.png
Normal file
|
After Width: | Height: | Size: 2.2 KiB |
BIN
public/android-chrome-512x512.png
Normal file
|
After Width: | Height: | Size: 6.9 KiB |
BIN
public/apple-touch-icon.png
Normal file
|
After Width: | Height: | Size: 1.4 KiB |
BIN
public/favicon-16x16.png
Normal file
|
After Width: | Height: | Size: 465 B |
BIN
public/favicon-32x32.png
Normal file
|
After Width: | Height: | Size: 595 B |
|
Before Width: | Height: | Size: 15 KiB |
BIN
public/homepage.ico
Normal file
|
After Width: | Height: | Size: 15 KiB |
277
public/locales/bg/common.json
Normal file
@ -0,0 +1,277 @@
|
|||||||
|
{
|
||||||
|
"sabnzbd": {
|
||||||
|
"queue": "Опашка",
|
||||||
|
"timeleft": "Оставащо Време",
|
||||||
|
"rate": "Rate"
|
||||||
|
},
|
||||||
|
"rutorrent": {
|
||||||
|
"active": "Акитивен",
|
||||||
|
"upload": "Споделяне",
|
||||||
|
"download": "Сваляне"
|
||||||
|
},
|
||||||
|
"widget": {
|
||||||
|
"missing_type": "Липсваща приставка: {{type}}",
|
||||||
|
"api_error": "API Грешка",
|
||||||
|
"status": "Статус"
|
||||||
|
},
|
||||||
|
"weather": {
|
||||||
|
"current": "Текущо местоположение",
|
||||||
|
"allow": "Разреши",
|
||||||
|
"updating": "Обновяване",
|
||||||
|
"wait": "Моля изчакайте"
|
||||||
|
},
|
||||||
|
"search": {
|
||||||
|
"placeholder": "Търсене…"
|
||||||
|
},
|
||||||
|
"resources": {
|
||||||
|
"cpu": "CPU",
|
||||||
|
"total": "Общо",
|
||||||
|
"free": "Свободни",
|
||||||
|
"used": "Заети",
|
||||||
|
"load": "Натоварване"
|
||||||
|
},
|
||||||
|
"unifi": {
|
||||||
|
"users": "Потребители",
|
||||||
|
"uptime": "Активен от",
|
||||||
|
"days": "Дни",
|
||||||
|
"wan": "WAN",
|
||||||
|
"lan_users": "LAN Потребители",
|
||||||
|
"wlan_users": "WLAN Потребители",
|
||||||
|
"up": "UP",
|
||||||
|
"down": "DOWN",
|
||||||
|
"wait": "Моля изчакайте",
|
||||||
|
"lan": "LAN",
|
||||||
|
"wlan": "WLAN",
|
||||||
|
"devices": "Devices",
|
||||||
|
"lan_devices": "LAN Devices",
|
||||||
|
"wlan_devices": "WLAN Devices"
|
||||||
|
},
|
||||||
|
"docker": {
|
||||||
|
"offline": "Изключен",
|
||||||
|
"rx": "RX",
|
||||||
|
"tx": "TX",
|
||||||
|
"mem": "MEM",
|
||||||
|
"cpu": "CPU"
|
||||||
|
},
|
||||||
|
"emby": {
|
||||||
|
"playing": "Възпроизвежда",
|
||||||
|
"transcoding": "Конвертира",
|
||||||
|
"bitrate": "Bitrate",
|
||||||
|
"no_active": "Няма активни потоци"
|
||||||
|
},
|
||||||
|
"tautulli": {
|
||||||
|
"playing": "Възпроизвежда",
|
||||||
|
"transcoding": "Конвертира",
|
||||||
|
"bitrate": "Честота",
|
||||||
|
"no_active": "Няма активни потоци"
|
||||||
|
},
|
||||||
|
"nzbget": {
|
||||||
|
"rate": "Rate",
|
||||||
|
"remaining": "Остава",
|
||||||
|
"downloaded": "Изтеглени"
|
||||||
|
},
|
||||||
|
"plex": {
|
||||||
|
"streams": "Активни Потоци",
|
||||||
|
"movies": "Филми",
|
||||||
|
"tv": "Сериали"
|
||||||
|
},
|
||||||
|
"transmission": {
|
||||||
|
"download": "Сваляне",
|
||||||
|
"upload": "Upload",
|
||||||
|
"leech": "Leech",
|
||||||
|
"seed": "Seed"
|
||||||
|
},
|
||||||
|
"qbittorrent": {
|
||||||
|
"download": "Download",
|
||||||
|
"upload": "Upload",
|
||||||
|
"leech": "Leech",
|
||||||
|
"seed": "Seed"
|
||||||
|
},
|
||||||
|
"sonarr": {
|
||||||
|
"wanted": "Wanted",
|
||||||
|
"queued": "Queued",
|
||||||
|
"series": "Series"
|
||||||
|
},
|
||||||
|
"radarr": {
|
||||||
|
"wanted": "Wanted",
|
||||||
|
"queued": "Queued",
|
||||||
|
"movies": "Movies",
|
||||||
|
"missing": "Missing"
|
||||||
|
},
|
||||||
|
"lidarr": {
|
||||||
|
"wanted": "Wanted",
|
||||||
|
"queued": "Queued",
|
||||||
|
"albums": "Albums"
|
||||||
|
},
|
||||||
|
"readarr": {
|
||||||
|
"wanted": "Wanted",
|
||||||
|
"queued": "Queued",
|
||||||
|
"books": "Books"
|
||||||
|
},
|
||||||
|
"bazarr": {
|
||||||
|
"missingEpisodes": "Missing Episodes",
|
||||||
|
"missingMovies": "Missing Movies"
|
||||||
|
},
|
||||||
|
"ombi": {
|
||||||
|
"pending": "Pending",
|
||||||
|
"approved": "Approved",
|
||||||
|
"available": "Available"
|
||||||
|
},
|
||||||
|
"jellyseerr": {
|
||||||
|
"pending": "Pending",
|
||||||
|
"approved": "Approved",
|
||||||
|
"available": "Available"
|
||||||
|
},
|
||||||
|
"overseerr": {
|
||||||
|
"pending": "Pending",
|
||||||
|
"approved": "Approved",
|
||||||
|
"available": "Available"
|
||||||
|
},
|
||||||
|
"pihole": {
|
||||||
|
"queries": "Queries",
|
||||||
|
"blocked": "Blocked",
|
||||||
|
"gravity": "Gravity"
|
||||||
|
},
|
||||||
|
"adguard": {
|
||||||
|
"queries": "Queries",
|
||||||
|
"blocked": "Blocked",
|
||||||
|
"filtered": "Filtered",
|
||||||
|
"latency": "Latency"
|
||||||
|
},
|
||||||
|
"speedtest": {
|
||||||
|
"upload": "Upload",
|
||||||
|
"download": "Download",
|
||||||
|
"ping": "Ping"
|
||||||
|
},
|
||||||
|
"portainer": {
|
||||||
|
"running": "Running",
|
||||||
|
"stopped": "Stopped",
|
||||||
|
"total": "Total"
|
||||||
|
},
|
||||||
|
"traefik": {
|
||||||
|
"routers": "Routers",
|
||||||
|
"services": "Services",
|
||||||
|
"middleware": "Middleware"
|
||||||
|
},
|
||||||
|
"npm": {
|
||||||
|
"enabled": "Enabled",
|
||||||
|
"disabled": "Disabled",
|
||||||
|
"total": "Total"
|
||||||
|
},
|
||||||
|
"coinmarketcap": {
|
||||||
|
"configure": "Configure one or more crypto currencies to track",
|
||||||
|
"1hour": "1 Hour",
|
||||||
|
"1day": "1 Day",
|
||||||
|
"7days": "7 Days",
|
||||||
|
"30days": "30 Days"
|
||||||
|
},
|
||||||
|
"gotify": {
|
||||||
|
"apps": "Applications",
|
||||||
|
"clients": "Clients",
|
||||||
|
"messages": "Messages"
|
||||||
|
},
|
||||||
|
"prowlarr": {
|
||||||
|
"enableIndexers": "Indexers",
|
||||||
|
"numberOfGrabs": "Grabs",
|
||||||
|
"numberOfQueries": "Queries",
|
||||||
|
"numberOfFailGrabs": "Fail Grabs",
|
||||||
|
"numberOfFailQueries": "Fail Queries"
|
||||||
|
},
|
||||||
|
"authentik": {
|
||||||
|
"loginsLast24H": "Logins (24h)",
|
||||||
|
"users": "Users",
|
||||||
|
"failedLoginsLast24H": "Failed Logins (24h)"
|
||||||
|
},
|
||||||
|
"jackett": {
|
||||||
|
"configured": "Configured",
|
||||||
|
"errored": "Errored"
|
||||||
|
},
|
||||||
|
"strelaysrv": {
|
||||||
|
"numActiveSessions": "Sessions",
|
||||||
|
"numConnections": "Connections",
|
||||||
|
"dataRelayed": "Relayed",
|
||||||
|
"transferRate": "Rate"
|
||||||
|
},
|
||||||
|
"mastodon": {
|
||||||
|
"user_count": "Users",
|
||||||
|
"status_count": "Posts",
|
||||||
|
"domain_count": "Domains"
|
||||||
|
},
|
||||||
|
"proxmox": {
|
||||||
|
"mem": "MEM",
|
||||||
|
"cpu": "CPU",
|
||||||
|
"lxc": "LXC",
|
||||||
|
"vms": "VMs"
|
||||||
|
},
|
||||||
|
"glances": {
|
||||||
|
"cpu": "CPU",
|
||||||
|
"mem": "MEM",
|
||||||
|
"wait": "Please wait"
|
||||||
|
},
|
||||||
|
"changedetectionio": {
|
||||||
|
"totalObserved": "Total Observed",
|
||||||
|
"diffsDetected": "Diffs Detected"
|
||||||
|
},
|
||||||
|
"wmo": {
|
||||||
|
"0-day": "Sunny",
|
||||||
|
"57-day": "Freezing Drizzle",
|
||||||
|
"57-night": "Freezing Drizzle",
|
||||||
|
"96-day": "Thunderstorm With Hail",
|
||||||
|
"96-night": "Thunderstorm With Hail",
|
||||||
|
"0-night": "Clear",
|
||||||
|
"1-day": "Mainly Sunny",
|
||||||
|
"1-night": "Mainly Clear",
|
||||||
|
"2-day": "Partly Cloudy",
|
||||||
|
"2-night": "Partly Cloudy",
|
||||||
|
"3-day": "Cloudy",
|
||||||
|
"3-night": "Cloudy",
|
||||||
|
"45-day": "Foggy",
|
||||||
|
"45-night": "Foggy",
|
||||||
|
"48-day": "Foggy",
|
||||||
|
"48-night": "Foggy",
|
||||||
|
"51-day": "Light Drizzle",
|
||||||
|
"51-night": "Light Drizzle",
|
||||||
|
"53-day": "Drizzle",
|
||||||
|
"53-night": "Drizzle",
|
||||||
|
"55-day": "Heavy Drizzle",
|
||||||
|
"55-night": "Heavy Drizzle",
|
||||||
|
"56-day": "Light Freezing Drizzle",
|
||||||
|
"56-night": "Light Freezing Drizzle",
|
||||||
|
"61-day": "Light Rain",
|
||||||
|
"61-night": "Light Rain",
|
||||||
|
"63-day": "Rain",
|
||||||
|
"63-night": "Rain",
|
||||||
|
"65-day": "Heavy Rain",
|
||||||
|
"65-night": "Heavy Rain",
|
||||||
|
"66-day": "Freezing Rain",
|
||||||
|
"66-night": "Freezing Rain",
|
||||||
|
"67-day": "Freezing Rain",
|
||||||
|
"67-night": "Freezing Rain",
|
||||||
|
"71-day": "Light Snow",
|
||||||
|
"71-night": "Light Snow",
|
||||||
|
"73-day": "Snow",
|
||||||
|
"73-night": "Snow",
|
||||||
|
"75-day": "Heavy Snow",
|
||||||
|
"75-night": "Heavy Snow",
|
||||||
|
"77-day": "Snow Grains",
|
||||||
|
"77-night": "Snow Grains",
|
||||||
|
"80-day": "Light Showers",
|
||||||
|
"80-night": "Light Showers",
|
||||||
|
"81-day": "Showers",
|
||||||
|
"81-night": "Showers",
|
||||||
|
"82-day": "Heavy Showers",
|
||||||
|
"82-night": "Heavy Showers",
|
||||||
|
"85-day": "Snow Showers",
|
||||||
|
"85-night": "Snow Showers",
|
||||||
|
"86-day": "Snow Showers",
|
||||||
|
"86-night": "Snow Showers",
|
||||||
|
"95-day": "Thunderstorm",
|
||||||
|
"95-night": "Thunderstorm",
|
||||||
|
"99-day": "Thunderstorm With Hail",
|
||||||
|
"99-night": "Thunderstorm With Hail"
|
||||||
|
},
|
||||||
|
"quicklaunch": {
|
||||||
|
"bookmark": "Bookmark",
|
||||||
|
"service": "Service"
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -33,13 +33,14 @@
|
|||||||
"total": "Total",
|
"total": "Total",
|
||||||
"free": "Lliure",
|
"free": "Lliure",
|
||||||
"used": "Usat",
|
"used": "Usat",
|
||||||
"load": "Càrrega"
|
"load": "Càrrega",
|
||||||
|
"cpu": "CPU"
|
||||||
},
|
},
|
||||||
"docker": {
|
"docker": {
|
||||||
"rx": "RX",
|
"rx": "Rebut",
|
||||||
"tx": "TX",
|
"tx": "Transmès",
|
||||||
"mem": "MEM",
|
"mem": "Memòria",
|
||||||
"cpu": "CPU",
|
"cpu": "Processador",
|
||||||
"offline": "Fora de línia"
|
"offline": "Fora de línia"
|
||||||
},
|
},
|
||||||
"emby": {
|
"emby": {
|
||||||
@ -72,7 +73,8 @@
|
|||||||
"radarr": {
|
"radarr": {
|
||||||
"wanted": "Volgut",
|
"wanted": "Volgut",
|
||||||
"queued": "En cua",
|
"queued": "En cua",
|
||||||
"movies": "Pel·lícules"
|
"movies": "Pel·lícules",
|
||||||
|
"missing": "Missing"
|
||||||
},
|
},
|
||||||
"readarr": {
|
"readarr": {
|
||||||
"wanted": "Volgut",
|
"wanted": "Volgut",
|
||||||
@ -170,8 +172,106 @@
|
|||||||
"transferRate": "Velocitat"
|
"transferRate": "Velocitat"
|
||||||
},
|
},
|
||||||
"authentik": {
|
"authentik": {
|
||||||
"users": "Users",
|
"users": "Usuaris",
|
||||||
"loginsLast24H": "Logins (24h)",
|
"loginsLast24H": "Inicis de sessió (24h)",
|
||||||
"failedLoginsLast24H": "Failed Logins (24h)"
|
"failedLoginsLast24H": "Errors d'inici de sessió (24h)"
|
||||||
|
},
|
||||||
|
"proxmox": {
|
||||||
|
"vms": "VMs",
|
||||||
|
"mem": "Memòria",
|
||||||
|
"cpu": "Processador",
|
||||||
|
"lxc": "LXC"
|
||||||
|
},
|
||||||
|
"unifi": {
|
||||||
|
"users": "Usuaris",
|
||||||
|
"uptime": "System Uptime",
|
||||||
|
"days": "Días",
|
||||||
|
"wan": "WAN",
|
||||||
|
"lan_users": "LAN Users",
|
||||||
|
"wlan_users": "WLAN Users",
|
||||||
|
"up": "UP",
|
||||||
|
"down": "DOWN",
|
||||||
|
"wait": "Si us plau, espereu",
|
||||||
|
"lan": "LAN",
|
||||||
|
"wlan": "WLAN",
|
||||||
|
"devices": "Devices",
|
||||||
|
"lan_devices": "LAN Devices",
|
||||||
|
"wlan_devices": "WLAN Devices"
|
||||||
|
},
|
||||||
|
"plex": {
|
||||||
|
"streams": "Transmissions actives",
|
||||||
|
"movies": "Pel·lícules",
|
||||||
|
"tv": "Programes de TV"
|
||||||
|
},
|
||||||
|
"glances": {
|
||||||
|
"cpu": "Processador",
|
||||||
|
"mem": "Memòria",
|
||||||
|
"wait": "Si us plau, espereu"
|
||||||
|
},
|
||||||
|
"changedetectionio": {
|
||||||
|
"totalObserved": "Total Observed",
|
||||||
|
"diffsDetected": "Diffs Detected"
|
||||||
|
},
|
||||||
|
"wmo": {
|
||||||
|
"66-day": "Freezing Rain",
|
||||||
|
"95-day": "Thunderstorm",
|
||||||
|
"95-night": "Thunderstorm",
|
||||||
|
"96-day": "Thunderstorm With Hail",
|
||||||
|
"0-day": "Sunny",
|
||||||
|
"0-night": "Clear",
|
||||||
|
"1-day": "Mainly Sunny",
|
||||||
|
"1-night": "Mainly Clear",
|
||||||
|
"2-day": "Partly Cloudy",
|
||||||
|
"2-night": "Partly Cloudy",
|
||||||
|
"3-day": "Cloudy",
|
||||||
|
"3-night": "Cloudy",
|
||||||
|
"45-day": "Foggy",
|
||||||
|
"45-night": "Foggy",
|
||||||
|
"48-day": "Foggy",
|
||||||
|
"48-night": "Foggy",
|
||||||
|
"51-day": "Light Drizzle",
|
||||||
|
"51-night": "Light Drizzle",
|
||||||
|
"53-day": "Drizzle",
|
||||||
|
"53-night": "Drizzle",
|
||||||
|
"55-day": "Heavy Drizzle",
|
||||||
|
"55-night": "Heavy Drizzle",
|
||||||
|
"56-day": "Light Freezing Drizzle",
|
||||||
|
"56-night": "Light Freezing Drizzle",
|
||||||
|
"65-night": "Heavy Rain",
|
||||||
|
"57-day": "Freezing Drizzle",
|
||||||
|
"57-night": "Freezing Drizzle",
|
||||||
|
"61-day": "Light Rain",
|
||||||
|
"61-night": "Light Rain",
|
||||||
|
"63-day": "Rain",
|
||||||
|
"63-night": "Rain",
|
||||||
|
"65-day": "Heavy Rain",
|
||||||
|
"66-night": "Freezing Rain",
|
||||||
|
"67-day": "Freezing Rain",
|
||||||
|
"67-night": "Freezing Rain",
|
||||||
|
"71-day": "Light Snow",
|
||||||
|
"71-night": "Light Snow",
|
||||||
|
"73-day": "Snow",
|
||||||
|
"73-night": "Snow",
|
||||||
|
"75-day": "Heavy Snow",
|
||||||
|
"75-night": "Heavy Snow",
|
||||||
|
"77-day": "Snow Grains",
|
||||||
|
"77-night": "Snow Grains",
|
||||||
|
"80-day": "Light Showers",
|
||||||
|
"80-night": "Light Showers",
|
||||||
|
"81-day": "Showers",
|
||||||
|
"81-night": "Showers",
|
||||||
|
"82-day": "Heavy Showers",
|
||||||
|
"82-night": "Heavy Showers",
|
||||||
|
"85-day": "Snow Showers",
|
||||||
|
"85-night": "Snow Showers",
|
||||||
|
"86-day": "Snow Showers",
|
||||||
|
"86-night": "Snow Showers",
|
||||||
|
"96-night": "Thunderstorm With Hail",
|
||||||
|
"99-day": "Thunderstorm With Hail",
|
||||||
|
"99-night": "Thunderstorm With Hail"
|
||||||
|
},
|
||||||
|
"quicklaunch": {
|
||||||
|
"bookmark": "Bookmark",
|
||||||
|
"service": "Service"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -11,7 +11,8 @@
|
|||||||
"total": "Gesamt",
|
"total": "Gesamt",
|
||||||
"free": "Frei",
|
"free": "Frei",
|
||||||
"used": "Gebraucht",
|
"used": "Gebraucht",
|
||||||
"load": "Belastung"
|
"load": "Last",
|
||||||
|
"cpu": "CPU"
|
||||||
},
|
},
|
||||||
"docker": {
|
"docker": {
|
||||||
"rx": "Rx",
|
"rx": "Rx",
|
||||||
@ -24,13 +25,13 @@
|
|||||||
"playing": "Spielen",
|
"playing": "Spielen",
|
||||||
"transcoding": "Transcodierung",
|
"transcoding": "Transcodierung",
|
||||||
"bitrate": "Bitrate",
|
"bitrate": "Bitrate",
|
||||||
"no_active": "Keine aktive Streams"
|
"no_active": "Keine aktiven Streams"
|
||||||
},
|
},
|
||||||
"tautulli": {
|
"tautulli": {
|
||||||
"playing": "Spielen",
|
"playing": "Spielen",
|
||||||
"transcoding": "Transcodierung",
|
"transcoding": "Transcodierung",
|
||||||
"bitrate": "Bitrate",
|
"bitrate": "Bitrate",
|
||||||
"no_active": "Keine aktiven streamen"
|
"no_active": "Keine aktiven Streams"
|
||||||
},
|
},
|
||||||
"rutorrent": {
|
"rutorrent": {
|
||||||
"active": "Aktiv",
|
"active": "Aktiv",
|
||||||
@ -40,12 +41,13 @@
|
|||||||
"sonarr": {
|
"sonarr": {
|
||||||
"wanted": "Gesucht",
|
"wanted": "Gesucht",
|
||||||
"queued": "In Warteschlange",
|
"queued": "In Warteschlange",
|
||||||
"series": "Serie"
|
"series": "Serien"
|
||||||
},
|
},
|
||||||
"radarr": {
|
"radarr": {
|
||||||
"wanted": "Gesucht",
|
"wanted": "Gesucht",
|
||||||
"queued": "In Warteschlange",
|
"queued": "In Warteschlange",
|
||||||
"movies": "Filme"
|
"movies": "Filme",
|
||||||
|
"missing": "Missing"
|
||||||
},
|
},
|
||||||
"readarr": {
|
"readarr": {
|
||||||
"wanted": "Gesucht",
|
"wanted": "Gesucht",
|
||||||
@ -170,8 +172,106 @@
|
|||||||
"transferRate": "Bewerten"
|
"transferRate": "Bewerten"
|
||||||
},
|
},
|
||||||
"authentik": {
|
"authentik": {
|
||||||
"users": "Users",
|
"users": "Benutzer",
|
||||||
"loginsLast24H": "Logins (24h)",
|
"loginsLast24H": "Anmeldungen (24h)",
|
||||||
"failedLoginsLast24H": "Failed Logins (24h)"
|
"failedLoginsLast24H": "fehlerhafte Anmeldungen (24h)"
|
||||||
|
},
|
||||||
|
"proxmox": {
|
||||||
|
"mem": "RAM",
|
||||||
|
"cpu": "CPU",
|
||||||
|
"lxc": "LXC",
|
||||||
|
"vms": "VMs"
|
||||||
|
},
|
||||||
|
"unifi": {
|
||||||
|
"users": "Benutzer",
|
||||||
|
"uptime": "System-Betriebszeit",
|
||||||
|
"days": "Tage",
|
||||||
|
"wan": "WAN",
|
||||||
|
"lan_users": "LAN Benutzer",
|
||||||
|
"wlan_users": "WLAN Benutzer",
|
||||||
|
"up": "SENDEN",
|
||||||
|
"down": "EMPFANGEN",
|
||||||
|
"wait": "Bitte warten",
|
||||||
|
"lan": "LAN",
|
||||||
|
"wlan": "WLAN",
|
||||||
|
"devices": "Devices",
|
||||||
|
"lan_devices": "LAN Devices",
|
||||||
|
"wlan_devices": "WLAN Devices"
|
||||||
|
},
|
||||||
|
"plex": {
|
||||||
|
"streams": "Aktive Streams",
|
||||||
|
"movies": "Filme",
|
||||||
|
"tv": "TV Sendungen"
|
||||||
|
},
|
||||||
|
"glances": {
|
||||||
|
"cpu": "CPU",
|
||||||
|
"mem": "RAM",
|
||||||
|
"wait": "Bitte warten"
|
||||||
|
},
|
||||||
|
"changedetectionio": {
|
||||||
|
"totalObserved": "Total Observed",
|
||||||
|
"diffsDetected": "Diffs Detected"
|
||||||
|
},
|
||||||
|
"wmo": {
|
||||||
|
"0-day": "Sunny",
|
||||||
|
"0-night": "Clear",
|
||||||
|
"1-day": "Mainly Sunny",
|
||||||
|
"1-night": "Mainly Clear",
|
||||||
|
"2-day": "Partly Cloudy",
|
||||||
|
"2-night": "Partly Cloudy",
|
||||||
|
"3-day": "Cloudy",
|
||||||
|
"57-day": "Freezing Drizzle",
|
||||||
|
"61-day": "Light Rain",
|
||||||
|
"65-night": "Heavy Rain",
|
||||||
|
"66-day": "Freezing Rain",
|
||||||
|
"66-night": "Freezing Rain",
|
||||||
|
"3-night": "Cloudy",
|
||||||
|
"45-day": "Foggy",
|
||||||
|
"45-night": "Foggy",
|
||||||
|
"48-day": "Foggy",
|
||||||
|
"48-night": "Foggy",
|
||||||
|
"51-day": "Light Drizzle",
|
||||||
|
"51-night": "Light Drizzle",
|
||||||
|
"55-day": "Heavy Drizzle",
|
||||||
|
"53-day": "Drizzle",
|
||||||
|
"53-night": "Drizzle",
|
||||||
|
"55-night": "Heavy Drizzle",
|
||||||
|
"56-day": "Light Freezing Drizzle",
|
||||||
|
"56-night": "Light Freezing Drizzle",
|
||||||
|
"57-night": "Freezing Drizzle",
|
||||||
|
"61-night": "Light Rain",
|
||||||
|
"63-day": "Rain",
|
||||||
|
"63-night": "Rain",
|
||||||
|
"65-day": "Heavy Rain",
|
||||||
|
"67-day": "Freezing Rain",
|
||||||
|
"67-night": "Freezing Rain",
|
||||||
|
"71-day": "Light Snow",
|
||||||
|
"71-night": "Light Snow",
|
||||||
|
"73-day": "Snow",
|
||||||
|
"73-night": "Snow",
|
||||||
|
"75-day": "Heavy Snow",
|
||||||
|
"75-night": "Heavy Snow",
|
||||||
|
"77-day": "Snow Grains",
|
||||||
|
"77-night": "Snow Grains",
|
||||||
|
"80-day": "Light Showers",
|
||||||
|
"80-night": "Light Showers",
|
||||||
|
"81-day": "Showers",
|
||||||
|
"81-night": "Showers",
|
||||||
|
"82-day": "Heavy Showers",
|
||||||
|
"82-night": "Heavy Showers",
|
||||||
|
"85-day": "Snow Showers",
|
||||||
|
"85-night": "Snow Showers",
|
||||||
|
"86-day": "Snow Showers",
|
||||||
|
"86-night": "Snow Showers",
|
||||||
|
"95-day": "Thunderstorm",
|
||||||
|
"95-night": "Thunderstorm",
|
||||||
|
"96-day": "Thunderstorm With Hail",
|
||||||
|
"96-night": "Thunderstorm With Hail",
|
||||||
|
"99-day": "Thunderstorm With Hail",
|
||||||
|
"99-night": "Thunderstorm With Hail"
|
||||||
|
},
|
||||||
|
"quicklaunch": {
|
||||||
|
"bookmark": "Bookmark",
|
||||||
|
"service": "Service"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -25,11 +25,28 @@
|
|||||||
"placeholder": "Search…"
|
"placeholder": "Search…"
|
||||||
},
|
},
|
||||||
"resources": {
|
"resources": {
|
||||||
|
"cpu": "CPU",
|
||||||
"total": "Total",
|
"total": "Total",
|
||||||
"free": "Free",
|
"free": "Free",
|
||||||
"used": "Used",
|
"used": "Used",
|
||||||
"load": "Load"
|
"load": "Load"
|
||||||
},
|
},
|
||||||
|
"unifi": {
|
||||||
|
"users": "Users",
|
||||||
|
"uptime": "System Uptime",
|
||||||
|
"days": "Days",
|
||||||
|
"wan": "WAN",
|
||||||
|
"lan": "LAN",
|
||||||
|
"wlan": "WLAN",
|
||||||
|
"devices": "Devices",
|
||||||
|
"lan_devices": "LAN Devices",
|
||||||
|
"wlan_devices": "WLAN Devices",
|
||||||
|
"lan_users": "LAN Users",
|
||||||
|
"wlan_users": "WLAN Users",
|
||||||
|
"up": "UP",
|
||||||
|
"down": "DOWN",
|
||||||
|
"wait": "Please wait"
|
||||||
|
},
|
||||||
"docker": {
|
"docker": {
|
||||||
"rx": "RX",
|
"rx": "RX",
|
||||||
"tx": "TX",
|
"tx": "TX",
|
||||||
@ -43,6 +60,10 @@
|
|||||||
"bitrate": "Bitrate",
|
"bitrate": "Bitrate",
|
||||||
"no_active": "No Active Streams"
|
"no_active": "No Active Streams"
|
||||||
},
|
},
|
||||||
|
"changedetectionio": {
|
||||||
|
"totalObserved": "Total Observed",
|
||||||
|
"diffsDetected": "Diffs Detected"
|
||||||
|
},
|
||||||
"tautulli": {
|
"tautulli": {
|
||||||
"playing": "Playing",
|
"playing": "Playing",
|
||||||
"transcoding": "Transcoding",
|
"transcoding": "Transcoding",
|
||||||
@ -54,6 +75,11 @@
|
|||||||
"remaining": "Remaining",
|
"remaining": "Remaining",
|
||||||
"downloaded": "Downloaded"
|
"downloaded": "Downloaded"
|
||||||
},
|
},
|
||||||
|
"plex": {
|
||||||
|
"streams": "Active Streams",
|
||||||
|
"movies": "Movies",
|
||||||
|
"tv": "TV Shows"
|
||||||
|
},
|
||||||
"sabnzbd": {
|
"sabnzbd": {
|
||||||
"rate": "Rate",
|
"rate": "Rate",
|
||||||
"queue": "Queue",
|
"queue": "Queue",
|
||||||
@ -83,6 +109,7 @@
|
|||||||
},
|
},
|
||||||
"radarr": {
|
"radarr": {
|
||||||
"wanted": "Wanted",
|
"wanted": "Wanted",
|
||||||
|
"missing": "Missing",
|
||||||
"queued": "Queued",
|
"queued": "Queued",
|
||||||
"movies": "Movies"
|
"movies": "Movies"
|
||||||
},
|
},
|
||||||
@ -158,7 +185,7 @@
|
|||||||
"clients": "Clients",
|
"clients": "Clients",
|
||||||
"messages": "Messages"
|
"messages": "Messages"
|
||||||
},
|
},
|
||||||
"prowlarr":{
|
"prowlarr": {
|
||||||
"enableIndexers": "Indexers",
|
"enableIndexers": "Indexers",
|
||||||
"numberOfGrabs": "Grabs",
|
"numberOfGrabs": "Grabs",
|
||||||
"numberOfQueries": "Queries",
|
"numberOfQueries": "Queries",
|
||||||
@ -184,5 +211,78 @@
|
|||||||
"users": "Users",
|
"users": "Users",
|
||||||
"loginsLast24H": "Logins (24h)",
|
"loginsLast24H": "Logins (24h)",
|
||||||
"failedLoginsLast24H": "Failed Logins (24h)"
|
"failedLoginsLast24H": "Failed Logins (24h)"
|
||||||
|
},
|
||||||
|
"proxmox": {
|
||||||
|
"mem": "MEM",
|
||||||
|
"cpu": "CPU",
|
||||||
|
"lxc": "LXC",
|
||||||
|
"vms": "VMs"
|
||||||
|
},
|
||||||
|
"glances": {
|
||||||
|
"cpu": "CPU",
|
||||||
|
"mem": "MEM",
|
||||||
|
"wait": "Please wait"
|
||||||
|
},
|
||||||
|
"quicklaunch": {
|
||||||
|
"bookmark": "Bookmark",
|
||||||
|
"service": "Service"
|
||||||
|
},
|
||||||
|
"wmo": {
|
||||||
|
"0-day": "Sunny",
|
||||||
|
"0-night": "Clear",
|
||||||
|
"1-day": "Mainly Sunny",
|
||||||
|
"1-night": "Mainly Clear",
|
||||||
|
"2-day": "Partly Cloudy",
|
||||||
|
"2-night": "Partly Cloudy",
|
||||||
|
"3-day": "Cloudy",
|
||||||
|
"3-night": "Cloudy",
|
||||||
|
"45-day": "Foggy",
|
||||||
|
"45-night": "Foggy",
|
||||||
|
"48-day": "Foggy",
|
||||||
|
"48-night": "Foggy",
|
||||||
|
"51-day": "Light Drizzle",
|
||||||
|
"51-night": "Light Drizzle",
|
||||||
|
"53-day": "Drizzle",
|
||||||
|
"53-night": "Drizzle",
|
||||||
|
"55-day": "Heavy Drizzle",
|
||||||
|
"55-night": "Heavy Drizzle",
|
||||||
|
"56-day": "Light Freezing Drizzle",
|
||||||
|
"56-night": "Light Freezing Drizzle",
|
||||||
|
"57-day": "Freezing Drizzle",
|
||||||
|
"57-night": "Freezing Drizzle",
|
||||||
|
"61-day": "Light Rain",
|
||||||
|
"61-night": "Light Rain",
|
||||||
|
"63-day": "Rain",
|
||||||
|
"63-night": "Rain",
|
||||||
|
"65-day": "Heavy Rain",
|
||||||
|
"65-night": "Heavy Rain",
|
||||||
|
"66-day": "Freezing Rain",
|
||||||
|
"66-night": "Freezing Rain",
|
||||||
|
"67-day": "Freezing Rain",
|
||||||
|
"67-night": "Freezing Rain",
|
||||||
|
"71-day": "Light Snow",
|
||||||
|
"71-night": "Light Snow",
|
||||||
|
"73-day": "Snow",
|
||||||
|
"73-night": "Snow",
|
||||||
|
"75-day": "Heavy Snow",
|
||||||
|
"75-night": "Heavy Snow",
|
||||||
|
"77-day": "Snow Grains",
|
||||||
|
"77-night": "Snow Grains",
|
||||||
|
"80-day": "Light Showers",
|
||||||
|
"80-night": "Light Showers",
|
||||||
|
"81-day": "Showers",
|
||||||
|
"81-night": "Showers",
|
||||||
|
"82-day": "Heavy Showers",
|
||||||
|
"82-night": "Heavy Showers",
|
||||||
|
"85-day": "Snow Showers",
|
||||||
|
"85-night": "Snow Showers",
|
||||||
|
"86-day": "Snow Showers",
|
||||||
|
"86-night": "Snow Showers",
|
||||||
|
"95-day": "Thunderstorm",
|
||||||
|
"95-night": "Thunderstorm",
|
||||||
|
"96-day": "Thunderstorm With Hail",
|
||||||
|
"96-night": "Thunderstorm With Hail",
|
||||||
|
"99-day": "Thunderstorm With Hail",
|
||||||
|
"99-night": "Thunderstorm With Hail"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -11,13 +11,14 @@
|
|||||||
"total": "Total",
|
"total": "Total",
|
||||||
"free": "Libre",
|
"free": "Libre",
|
||||||
"used": "Usado",
|
"used": "Usado",
|
||||||
"load": "Carga"
|
"load": "Carga",
|
||||||
|
"cpu": "CPU"
|
||||||
},
|
},
|
||||||
"docker": {
|
"docker": {
|
||||||
"rx": "RX",
|
"rx": "Recibido",
|
||||||
"tx": "TX",
|
"tx": "Transmitido",
|
||||||
"mem": "MEM",
|
"mem": "Memoria",
|
||||||
"cpu": "CPU",
|
"cpu": "Procesador",
|
||||||
"offline": "Desconectado"
|
"offline": "Desconectado"
|
||||||
},
|
},
|
||||||
"emby": {
|
"emby": {
|
||||||
@ -38,17 +39,18 @@
|
|||||||
"download": "Bajada"
|
"download": "Bajada"
|
||||||
},
|
},
|
||||||
"sonarr": {
|
"sonarr": {
|
||||||
"wanted": "Más deseado",
|
"wanted": "Buscando",
|
||||||
"queued": "En cola",
|
"queued": "En cola",
|
||||||
"series": "Series"
|
"series": "Series"
|
||||||
},
|
},
|
||||||
"radarr": {
|
"radarr": {
|
||||||
"wanted": "Más deseado",
|
"wanted": "Buscando",
|
||||||
"queued": "En cola",
|
"queued": "En cola",
|
||||||
"movies": "Películas"
|
"movies": "Películas",
|
||||||
|
"missing": "No Encontrado"
|
||||||
},
|
},
|
||||||
"readarr": {
|
"readarr": {
|
||||||
"wanted": "Más deseado",
|
"wanted": "Buscando",
|
||||||
"queued": "En cola",
|
"queued": "En cola",
|
||||||
"books": "Libros"
|
"books": "Libros"
|
||||||
},
|
},
|
||||||
@ -143,7 +145,7 @@
|
|||||||
},
|
},
|
||||||
"lidarr": {
|
"lidarr": {
|
||||||
"queued": "En cola",
|
"queued": "En cola",
|
||||||
"wanted": "Más deseado",
|
"wanted": "Buscando",
|
||||||
"albums": "Álbumes"
|
"albums": "Álbumes"
|
||||||
},
|
},
|
||||||
"adguard": {
|
"adguard": {
|
||||||
@ -170,8 +172,106 @@
|
|||||||
"transferRate": "Velocidad"
|
"transferRate": "Velocidad"
|
||||||
},
|
},
|
||||||
"authentik": {
|
"authentik": {
|
||||||
"users": "Users",
|
"users": "Usuarios",
|
||||||
"loginsLast24H": "Logins (24h)",
|
"loginsLast24H": "Inicios de sesión (24h)",
|
||||||
"failedLoginsLast24H": "Failed Logins (24h)"
|
"failedLoginsLast24H": "Inicios de sesión fallidos (24h)"
|
||||||
|
},
|
||||||
|
"proxmox": {
|
||||||
|
"mem": "Memoria",
|
||||||
|
"cpu": "Procesador",
|
||||||
|
"lxc": "Contenedores Linux",
|
||||||
|
"vms": "Máquinas Virtuales"
|
||||||
|
},
|
||||||
|
"unifi": {
|
||||||
|
"up": "LEVANTADO",
|
||||||
|
"users": "Usuarios",
|
||||||
|
"uptime": "Tiempo de actividad",
|
||||||
|
"days": "Días",
|
||||||
|
"wan": "Red WAN",
|
||||||
|
"lan_users": "Usuarios LAN",
|
||||||
|
"wlan_users": "Usuarios WLAN",
|
||||||
|
"down": "CAÍDO",
|
||||||
|
"wait": "Espere por favor",
|
||||||
|
"lan": "LAN",
|
||||||
|
"wlan": "WLAN",
|
||||||
|
"devices": "Dispositivos",
|
||||||
|
"lan_devices": "Dispositivos LAN",
|
||||||
|
"wlan_devices": "Dispositivos WLAN"
|
||||||
|
},
|
||||||
|
"plex": {
|
||||||
|
"streams": "Transmisiones activas",
|
||||||
|
"movies": "Películas",
|
||||||
|
"tv": "Programas de TV"
|
||||||
|
},
|
||||||
|
"glances": {
|
||||||
|
"cpu": "Procesador",
|
||||||
|
"mem": "Memoria",
|
||||||
|
"wait": "Espere por favor"
|
||||||
|
},
|
||||||
|
"changedetectionio": {
|
||||||
|
"totalObserved": "Observados en Total",
|
||||||
|
"diffsDetected": "Diffs Detected"
|
||||||
|
},
|
||||||
|
"wmo": {
|
||||||
|
"48-night": "Niebla",
|
||||||
|
"51-day": "Light Drizzle",
|
||||||
|
"51-night": "Light Drizzle",
|
||||||
|
"2-day": "Parcialmente Nuboso",
|
||||||
|
"0-day": "Soleado",
|
||||||
|
"0-night": "Despejado",
|
||||||
|
"1-day": "Mayormente Soleado",
|
||||||
|
"1-night": "Mayormente Despejado",
|
||||||
|
"2-night": "Parcialmente Nuboso",
|
||||||
|
"3-day": "Nubaldo",
|
||||||
|
"3-night": "Nublado",
|
||||||
|
"45-day": "Niebla",
|
||||||
|
"45-night": "Niebla",
|
||||||
|
"48-day": "Niebla",
|
||||||
|
"53-day": "Drizzle",
|
||||||
|
"53-night": "Drizzle",
|
||||||
|
"55-day": "Heavy Drizzle",
|
||||||
|
"55-night": "Heavy Drizzle",
|
||||||
|
"56-day": "Light Freezing Drizzle",
|
||||||
|
"56-night": "Light Freezing Drizzle",
|
||||||
|
"57-day": "Freezing Drizzle",
|
||||||
|
"57-night": "Freezing Drizzle",
|
||||||
|
"61-day": "Light Rain",
|
||||||
|
"61-night": "Light Rain",
|
||||||
|
"67-day": "Granizo",
|
||||||
|
"63-day": "Rain",
|
||||||
|
"63-night": "Lluvia",
|
||||||
|
"65-day": "Chubascos",
|
||||||
|
"65-night": "Chubascos",
|
||||||
|
"66-day": "Granizo",
|
||||||
|
"66-night": "Granizo",
|
||||||
|
"67-night": "Granizo",
|
||||||
|
"71-day": "Nevada Leve",
|
||||||
|
"71-night": "Nevada Leva",
|
||||||
|
"73-day": "Nevada",
|
||||||
|
"73-night": "Nevada",
|
||||||
|
"75-day": "Fuertes Nevadas",
|
||||||
|
"75-night": "Fuertes Nevadas",
|
||||||
|
"77-day": "Nevada Leve",
|
||||||
|
"77-night": "Nevada Leve",
|
||||||
|
"80-day": "llovizna",
|
||||||
|
"80-night": "Llovizna",
|
||||||
|
"81-day": "Lluvia",
|
||||||
|
"81-night": "Lluvia",
|
||||||
|
"82-day": "Chubascos",
|
||||||
|
"82-night": "Chubascos",
|
||||||
|
"85-day": "Chubascos",
|
||||||
|
"85-night": "Snow Showers",
|
||||||
|
"86-day": "Snow Showers",
|
||||||
|
"86-night": "Snow Showers",
|
||||||
|
"95-day": "Thunderstorm",
|
||||||
|
"95-night": "Thunderstorm",
|
||||||
|
"96-day": "Thunderstorm With Hail",
|
||||||
|
"96-night": "Thunderstorm With Hail",
|
||||||
|
"99-day": "Thunderstorm With Hail",
|
||||||
|
"99-night": "Thunderstorm With Hail"
|
||||||
|
},
|
||||||
|
"quicklaunch": {
|
||||||
|
"bookmark": "Bookmark",
|
||||||
|
"service": "Service"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
277
public/locales/fi/common.json
Normal file
@ -0,0 +1,277 @@
|
|||||||
|
{
|
||||||
|
"widget": {
|
||||||
|
"missing_type": "Puuttuva härpäkkeen tyyppi: {{type}}",
|
||||||
|
"api_error": "API-virhe",
|
||||||
|
"status": "Tila"
|
||||||
|
},
|
||||||
|
"weather": {
|
||||||
|
"current": "Nykyinen sijainti",
|
||||||
|
"allow": "Klikkaa salliaksesi",
|
||||||
|
"updating": "Päivitetään",
|
||||||
|
"wait": "Odota, ole hyvä"
|
||||||
|
},
|
||||||
|
"search": {
|
||||||
|
"placeholder": "Hae…"
|
||||||
|
},
|
||||||
|
"resources": {
|
||||||
|
"cpu": "CPU",
|
||||||
|
"total": "Yhteensä",
|
||||||
|
"free": "Vapaana",
|
||||||
|
"used": "Käytetty",
|
||||||
|
"load": "Kuorma"
|
||||||
|
},
|
||||||
|
"docker": {
|
||||||
|
"rx": "RX",
|
||||||
|
"tx": "TX",
|
||||||
|
"mem": "RAM",
|
||||||
|
"cpu": "CPU",
|
||||||
|
"offline": "Offline"
|
||||||
|
},
|
||||||
|
"emby": {
|
||||||
|
"playing": "Toistaa",
|
||||||
|
"transcoding": "Transkoodaa",
|
||||||
|
"bitrate": "Bittinopeus",
|
||||||
|
"no_active": "Ei aktiivisia striimejä"
|
||||||
|
},
|
||||||
|
"tautulli": {
|
||||||
|
"playing": "Toistaa",
|
||||||
|
"transcoding": "Transkoodaa",
|
||||||
|
"bitrate": "Bittinopeus",
|
||||||
|
"no_active": "Ei aktiivisia striimejä"
|
||||||
|
},
|
||||||
|
"nzbget": {
|
||||||
|
"rate": "Nopeus",
|
||||||
|
"remaining": "Jäljellä",
|
||||||
|
"downloaded": "Ladattu"
|
||||||
|
},
|
||||||
|
"sabnzbd": {
|
||||||
|
"rate": "Nopeus",
|
||||||
|
"queue": "Jono",
|
||||||
|
"timeleft": "Aikaa jäljellä"
|
||||||
|
},
|
||||||
|
"rutorrent": {
|
||||||
|
"active": "Aktiivinen",
|
||||||
|
"upload": "Lähetys",
|
||||||
|
"download": "Lataus"
|
||||||
|
},
|
||||||
|
"transmission": {
|
||||||
|
"download": "Lataus",
|
||||||
|
"upload": "Lähetys",
|
||||||
|
"leech": "Lataajia",
|
||||||
|
"seed": "Lähettäjiä"
|
||||||
|
},
|
||||||
|
"qbittorrent": {
|
||||||
|
"download": "Lataus",
|
||||||
|
"upload": "Lähetys",
|
||||||
|
"leech": "Lataajia",
|
||||||
|
"seed": "Lähettäjiä"
|
||||||
|
},
|
||||||
|
"sonarr": {
|
||||||
|
"wanted": "Haluttu",
|
||||||
|
"queued": "Jonossa",
|
||||||
|
"series": "Sarja"
|
||||||
|
},
|
||||||
|
"radarr": {
|
||||||
|
"wanted": "Haluttu",
|
||||||
|
"queued": "Jonossa",
|
||||||
|
"movies": "Elokuvia",
|
||||||
|
"missing": "Missing"
|
||||||
|
},
|
||||||
|
"lidarr": {
|
||||||
|
"wanted": "Haluttu",
|
||||||
|
"queued": "Jonossa",
|
||||||
|
"albums": "Albumeja"
|
||||||
|
},
|
||||||
|
"readarr": {
|
||||||
|
"wanted": "Haluttu",
|
||||||
|
"queued": "Jonossa",
|
||||||
|
"books": "Kirjoja"
|
||||||
|
},
|
||||||
|
"bazarr": {
|
||||||
|
"missingEpisodes": "Puuttuvia jaksoja",
|
||||||
|
"missingMovies": "Puuttuvia elokuvia"
|
||||||
|
},
|
||||||
|
"ombi": {
|
||||||
|
"pending": "Vireillä",
|
||||||
|
"approved": "Hyväksytty",
|
||||||
|
"available": "Saatavilla"
|
||||||
|
},
|
||||||
|
"jellyseerr": {
|
||||||
|
"pending": "Vireillä",
|
||||||
|
"approved": "Hyväksytty",
|
||||||
|
"available": "Saatavilla"
|
||||||
|
},
|
||||||
|
"overseerr": {
|
||||||
|
"pending": "Vireillä",
|
||||||
|
"approved": "Hyväksytty",
|
||||||
|
"available": "Saatavilla"
|
||||||
|
},
|
||||||
|
"pihole": {
|
||||||
|
"queries": "Kyselyjä",
|
||||||
|
"blocked": "Estetty",
|
||||||
|
"gravity": "Vakavuus"
|
||||||
|
},
|
||||||
|
"adguard": {
|
||||||
|
"queries": "Kyselyjä",
|
||||||
|
"blocked": "Estetty",
|
||||||
|
"filtered": "Suodatettu",
|
||||||
|
"latency": "Viive"
|
||||||
|
},
|
||||||
|
"speedtest": {
|
||||||
|
"upload": "Lähetys",
|
||||||
|
"download": "Lataus",
|
||||||
|
"ping": "Viive"
|
||||||
|
},
|
||||||
|
"portainer": {
|
||||||
|
"running": "Käynnissä",
|
||||||
|
"stopped": "Pysäytetty",
|
||||||
|
"total": "Yhteensä"
|
||||||
|
},
|
||||||
|
"traefik": {
|
||||||
|
"routers": "Reitittimiä",
|
||||||
|
"services": "Palveluja",
|
||||||
|
"middleware": "Middlewareja"
|
||||||
|
},
|
||||||
|
"npm": {
|
||||||
|
"enabled": "Käytössä",
|
||||||
|
"disabled": "Poissa käytöstä",
|
||||||
|
"total": "Yhteensä"
|
||||||
|
},
|
||||||
|
"coinmarketcap": {
|
||||||
|
"configure": "Määritä yksi tai useampi kryptovaluutta seurattavaksi",
|
||||||
|
"1hour": "1 tunti",
|
||||||
|
"1day": "1 päivä",
|
||||||
|
"7days": "7 päivää",
|
||||||
|
"30days": "30 päivää"
|
||||||
|
},
|
||||||
|
"gotify": {
|
||||||
|
"apps": "Sovelluksia",
|
||||||
|
"clients": "Asiakasohjelmia",
|
||||||
|
"messages": "Viestejä"
|
||||||
|
},
|
||||||
|
"prowlarr": {
|
||||||
|
"enableIndexers": "Indeksoijia",
|
||||||
|
"numberOfGrabs": "Nappauksia",
|
||||||
|
"numberOfQueries": "Hakuja",
|
||||||
|
"numberOfFailGrabs": "Epäonnistuneita nappauksia",
|
||||||
|
"numberOfFailQueries": "Epäonnistuneita kyselyjä"
|
||||||
|
},
|
||||||
|
"jackett": {
|
||||||
|
"configured": "Määritettyjä",
|
||||||
|
"errored": "Virheellisiä"
|
||||||
|
},
|
||||||
|
"strelaysrv": {
|
||||||
|
"numActiveSessions": "Istuntoja",
|
||||||
|
"numConnections": "Yhteyksiä",
|
||||||
|
"dataRelayed": "Välitetty",
|
||||||
|
"transferRate": "Nopeus"
|
||||||
|
},
|
||||||
|
"mastodon": {
|
||||||
|
"user_count": "Käyttäjiä",
|
||||||
|
"status_count": "Kirjoituksia",
|
||||||
|
"domain_count": "Verkkotunnuksia"
|
||||||
|
},
|
||||||
|
"authentik": {
|
||||||
|
"users": "Käyttäjiä",
|
||||||
|
"loginsLast24H": "Kirjautumisia (24h)",
|
||||||
|
"failedLoginsLast24H": "Epäonnistuneita kirjautumisia (24h)"
|
||||||
|
},
|
||||||
|
"proxmox": {
|
||||||
|
"mem": "RAM",
|
||||||
|
"cpu": "CPU",
|
||||||
|
"lxc": "LXC",
|
||||||
|
"vms": "VKt"
|
||||||
|
},
|
||||||
|
"unifi": {
|
||||||
|
"users": "Users",
|
||||||
|
"uptime": "System Uptime",
|
||||||
|
"lan_users": "LAN Users",
|
||||||
|
"wlan_users": "WLAN Users",
|
||||||
|
"wait": "Please wait",
|
||||||
|
"days": "Days",
|
||||||
|
"wan": "WAN",
|
||||||
|
"up": "UP",
|
||||||
|
"down": "DOWN",
|
||||||
|
"devices": "Devices",
|
||||||
|
"lan_devices": "LAN Devices",
|
||||||
|
"lan": "LAN",
|
||||||
|
"wlan": "WLAN",
|
||||||
|
"wlan_devices": "WLAN Devices"
|
||||||
|
},
|
||||||
|
"plex": {
|
||||||
|
"streams": "Active Streams",
|
||||||
|
"movies": "Movies",
|
||||||
|
"tv": "TV Shows"
|
||||||
|
},
|
||||||
|
"glances": {
|
||||||
|
"wait": "Please wait",
|
||||||
|
"cpu": "CPU",
|
||||||
|
"mem": "MEM"
|
||||||
|
},
|
||||||
|
"changedetectionio": {
|
||||||
|
"totalObserved": "Total Observed",
|
||||||
|
"diffsDetected": "Diffs Detected"
|
||||||
|
},
|
||||||
|
"wmo": {
|
||||||
|
"3-day": "Cloudy",
|
||||||
|
"3-night": "Cloudy",
|
||||||
|
"45-day": "Foggy",
|
||||||
|
"0-day": "Sunny",
|
||||||
|
"0-night": "Clear",
|
||||||
|
"1-day": "Mainly Sunny",
|
||||||
|
"1-night": "Mainly Clear",
|
||||||
|
"2-day": "Partly Cloudy",
|
||||||
|
"2-night": "Partly Cloudy",
|
||||||
|
"45-night": "Foggy",
|
||||||
|
"48-day": "Foggy",
|
||||||
|
"48-night": "Foggy",
|
||||||
|
"51-day": "Light Drizzle",
|
||||||
|
"51-night": "Light Drizzle",
|
||||||
|
"53-day": "Drizzle",
|
||||||
|
"53-night": "Drizzle",
|
||||||
|
"55-day": "Heavy Drizzle",
|
||||||
|
"55-night": "Heavy Drizzle",
|
||||||
|
"56-day": "Light Freezing Drizzle",
|
||||||
|
"56-night": "Light Freezing Drizzle",
|
||||||
|
"57-day": "Freezing Drizzle",
|
||||||
|
"57-night": "Freezing Drizzle",
|
||||||
|
"61-day": "Light Rain",
|
||||||
|
"61-night": "Light Rain",
|
||||||
|
"63-day": "Rain",
|
||||||
|
"63-night": "Rain",
|
||||||
|
"65-day": "Heavy Rain",
|
||||||
|
"65-night": "Heavy Rain",
|
||||||
|
"66-day": "Freezing Rain",
|
||||||
|
"66-night": "Freezing Rain",
|
||||||
|
"67-day": "Freezing Rain",
|
||||||
|
"67-night": "Freezing Rain",
|
||||||
|
"71-day": "Light Snow",
|
||||||
|
"71-night": "Light Snow",
|
||||||
|
"73-day": "Snow",
|
||||||
|
"73-night": "Snow",
|
||||||
|
"75-day": "Heavy Snow",
|
||||||
|
"80-night": "Light Showers",
|
||||||
|
"75-night": "Heavy Snow",
|
||||||
|
"77-day": "Snow Grains",
|
||||||
|
"77-night": "Snow Grains",
|
||||||
|
"80-day": "Light Showers",
|
||||||
|
"81-day": "Showers",
|
||||||
|
"81-night": "Showers",
|
||||||
|
"82-day": "Heavy Showers",
|
||||||
|
"82-night": "Heavy Showers",
|
||||||
|
"85-day": "Snow Showers",
|
||||||
|
"85-night": "Snow Showers",
|
||||||
|
"86-day": "Snow Showers",
|
||||||
|
"86-night": "Snow Showers",
|
||||||
|
"95-day": "Thunderstorm",
|
||||||
|
"95-night": "Thunderstorm",
|
||||||
|
"96-day": "Thunderstorm With Hail",
|
||||||
|
"96-night": "Thunderstorm With Hail",
|
||||||
|
"99-day": "Thunderstorm With Hail",
|
||||||
|
"99-night": "Thunderstorm With Hail"
|
||||||
|
},
|
||||||
|
"quicklaunch": {
|
||||||
|
"bookmark": "Bookmark",
|
||||||
|
"service": "Service"
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -11,7 +11,8 @@
|
|||||||
"total": "Total",
|
"total": "Total",
|
||||||
"free": "Libre",
|
"free": "Libre",
|
||||||
"used": "Utilisé",
|
"used": "Utilisé",
|
||||||
"load": "Charge"
|
"load": "Charge",
|
||||||
|
"cpu": "CPU"
|
||||||
},
|
},
|
||||||
"docker": {
|
"docker": {
|
||||||
"rx": "Rx",
|
"rx": "Rx",
|
||||||
@ -45,7 +46,8 @@
|
|||||||
"radarr": {
|
"radarr": {
|
||||||
"wanted": "Demande",
|
"wanted": "Demande",
|
||||||
"queued": "En attente",
|
"queued": "En attente",
|
||||||
"movies": "Films"
|
"movies": "Films",
|
||||||
|
"missing": "Manquant"
|
||||||
},
|
},
|
||||||
"readarr": {
|
"readarr": {
|
||||||
"wanted": "Demande",
|
"wanted": "Demande",
|
||||||
@ -170,8 +172,106 @@
|
|||||||
"transferRate": "Débit"
|
"transferRate": "Débit"
|
||||||
},
|
},
|
||||||
"authentik": {
|
"authentik": {
|
||||||
"users": "Users",
|
"users": "Utilisateurs",
|
||||||
"loginsLast24H": "Logins (24h)",
|
"loginsLast24H": "Cnx. (24h)",
|
||||||
"failedLoginsLast24H": "Failed Logins (24h)"
|
"failedLoginsLast24H": "Cnx. échouées (24h)"
|
||||||
|
},
|
||||||
|
"proxmox": {
|
||||||
|
"mem": "Mém",
|
||||||
|
"cpu": "Cpu",
|
||||||
|
"lxc": "LxC",
|
||||||
|
"vms": "VMs"
|
||||||
|
},
|
||||||
|
"unifi": {
|
||||||
|
"users": "Utilisateurs",
|
||||||
|
"uptime": "Disponibilité du système",
|
||||||
|
"days": "Jours",
|
||||||
|
"wan": "WAN",
|
||||||
|
"lan_users": "Utilisateurs LAN",
|
||||||
|
"wlan_users": "Utilisateurs WLAN",
|
||||||
|
"up": "UP",
|
||||||
|
"down": "DOWN",
|
||||||
|
"wait": "Merci de patienter",
|
||||||
|
"lan": "LAN",
|
||||||
|
"wlan": "WLAN",
|
||||||
|
"devices": "Équipt.",
|
||||||
|
"lan_devices": "Équipt. LAN",
|
||||||
|
"wlan_devices": "Équipt. WLAN"
|
||||||
|
},
|
||||||
|
"plex": {
|
||||||
|
"streams": "Flux actif",
|
||||||
|
"movies": "Films",
|
||||||
|
"tv": "Séries TV"
|
||||||
|
},
|
||||||
|
"glances": {
|
||||||
|
"cpu": "Cpu",
|
||||||
|
"mem": "Mém",
|
||||||
|
"wait": "Merci de patienter"
|
||||||
|
},
|
||||||
|
"changedetectionio": {
|
||||||
|
"totalObserved": "Total Observé",
|
||||||
|
"diffsDetected": "Diffs Detectées"
|
||||||
|
},
|
||||||
|
"wmo": {
|
||||||
|
"1-day": "Principalement ensoleillé",
|
||||||
|
"1-night": "Principalement clair",
|
||||||
|
"2-day": "Partiellement couvert",
|
||||||
|
"2-night": "Partiellement couvert",
|
||||||
|
"3-day": "Couvert",
|
||||||
|
"3-night": "Couvert",
|
||||||
|
"63-night": "Pluie",
|
||||||
|
"65-day": "Pluie forte",
|
||||||
|
"85-day": "Averses de neige",
|
||||||
|
"85-night": "Averses de neige",
|
||||||
|
"86-day": "Averses de neige",
|
||||||
|
"0-night": "Ciel clair",
|
||||||
|
"45-day": "Brumeux",
|
||||||
|
"45-night": "Brumeux",
|
||||||
|
"48-day": "Brumeux",
|
||||||
|
"48-night": "Brumeux",
|
||||||
|
"51-day": "Bruine légère",
|
||||||
|
"51-night": "Bruine légère",
|
||||||
|
"53-day": "Bruine",
|
||||||
|
"53-night": "Bruine",
|
||||||
|
"55-day": "Bruine épaisse",
|
||||||
|
"55-night": "Bruine épaisse",
|
||||||
|
"56-day": "Légère bruine verglaçante",
|
||||||
|
"56-night": "Légère bruine verglaçante",
|
||||||
|
"57-day": "Bruine verglaçante",
|
||||||
|
"57-night": "Bruine verglaçante",
|
||||||
|
"61-day": "Pluie légère",
|
||||||
|
"61-night": "Pluie légère",
|
||||||
|
"63-day": "Pluie",
|
||||||
|
"65-night": "Pluie forte",
|
||||||
|
"66-day": "Pluie verglaçante",
|
||||||
|
"66-night": "Pluie verglaçante",
|
||||||
|
"67-day": "Pluie verglaçante",
|
||||||
|
"67-night": "Pluie verglaçante",
|
||||||
|
"71-day": "Neige légère",
|
||||||
|
"71-night": "Neige légère",
|
||||||
|
"73-day": "Neige",
|
||||||
|
"73-night": "Neige",
|
||||||
|
"75-day": "Neige abondante",
|
||||||
|
"75-night": "Neige abondante",
|
||||||
|
"77-day": "Grains de neige",
|
||||||
|
"77-night": "Grains de neige",
|
||||||
|
"80-day": "Averses légères",
|
||||||
|
"80-night": "Averses légères",
|
||||||
|
"81-day": "Averses",
|
||||||
|
"81-night": "Averses",
|
||||||
|
"82-day": "Averses fortes",
|
||||||
|
"82-night": "Averses fortes",
|
||||||
|
"86-night": "Averses de neige",
|
||||||
|
"95-day": "Orage",
|
||||||
|
"95-night": "Orage",
|
||||||
|
"96-day": "Orage avec grêle",
|
||||||
|
"96-night": "Orage avec grêle",
|
||||||
|
"99-day": "Orage avec grêle",
|
||||||
|
"99-night": "Orage avec grêle",
|
||||||
|
"0-day": "Ensoleillé"
|
||||||
|
},
|
||||||
|
"quicklaunch": {
|
||||||
|
"bookmark": "Bookmark",
|
||||||
|
"service": "Service"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -17,7 +17,8 @@
|
|||||||
"total": "סה\"כ",
|
"total": "סה\"כ",
|
||||||
"free": "פנוי",
|
"free": "פנוי",
|
||||||
"used": "בשימוש",
|
"used": "בשימוש",
|
||||||
"load": "עומס"
|
"load": "עומס",
|
||||||
|
"cpu": "CPU"
|
||||||
},
|
},
|
||||||
"docker": {
|
"docker": {
|
||||||
"rx": "RX",
|
"rx": "RX",
|
||||||
@ -73,7 +74,8 @@
|
|||||||
"radarr": {
|
"radarr": {
|
||||||
"wanted": "מבוקש",
|
"wanted": "מבוקש",
|
||||||
"queued": "בתור",
|
"queued": "בתור",
|
||||||
"movies": "סרטים"
|
"movies": "סרטים",
|
||||||
|
"missing": "Missing"
|
||||||
},
|
},
|
||||||
"lidarr": {
|
"lidarr": {
|
||||||
"wanted": "מבוקש",
|
"wanted": "מבוקש",
|
||||||
@ -173,5 +175,103 @@
|
|||||||
"users": "Users",
|
"users": "Users",
|
||||||
"loginsLast24H": "Logins (24h)",
|
"loginsLast24H": "Logins (24h)",
|
||||||
"failedLoginsLast24H": "Failed Logins (24h)"
|
"failedLoginsLast24H": "Failed Logins (24h)"
|
||||||
|
},
|
||||||
|
"proxmox": {
|
||||||
|
"mem": "MEM",
|
||||||
|
"cpu": "CPU",
|
||||||
|
"lxc": "LXC",
|
||||||
|
"vms": "VMs"
|
||||||
|
},
|
||||||
|
"unifi": {
|
||||||
|
"users": "Users",
|
||||||
|
"uptime": "System Uptime",
|
||||||
|
"days": "Days",
|
||||||
|
"wan": "WAN",
|
||||||
|
"lan_users": "LAN Users",
|
||||||
|
"wlan_users": "WLAN Users",
|
||||||
|
"up": "UP",
|
||||||
|
"down": "DOWN",
|
||||||
|
"wait": "Please wait",
|
||||||
|
"lan": "LAN",
|
||||||
|
"wlan": "WLAN",
|
||||||
|
"devices": "Devices",
|
||||||
|
"lan_devices": "LAN Devices",
|
||||||
|
"wlan_devices": "WLAN Devices"
|
||||||
|
},
|
||||||
|
"plex": {
|
||||||
|
"streams": "Active Streams",
|
||||||
|
"movies": "Movies",
|
||||||
|
"tv": "TV Shows"
|
||||||
|
},
|
||||||
|
"glances": {
|
||||||
|
"cpu": "CPU",
|
||||||
|
"mem": "MEM",
|
||||||
|
"wait": "Please wait"
|
||||||
|
},
|
||||||
|
"changedetectionio": {
|
||||||
|
"totalObserved": "Total Observed",
|
||||||
|
"diffsDetected": "Diffs Detected"
|
||||||
|
},
|
||||||
|
"wmo": {
|
||||||
|
"80-day": "Light Showers",
|
||||||
|
"0-day": "Sunny",
|
||||||
|
"0-night": "Clear",
|
||||||
|
"1-day": "Mainly Sunny",
|
||||||
|
"2-night": "Partly Cloudy",
|
||||||
|
"1-night": "Mainly Clear",
|
||||||
|
"2-day": "Partly Cloudy",
|
||||||
|
"3-day": "Cloudy",
|
||||||
|
"3-night": "Cloudy",
|
||||||
|
"45-day": "Foggy",
|
||||||
|
"45-night": "Foggy",
|
||||||
|
"48-day": "Foggy",
|
||||||
|
"48-night": "Foggy",
|
||||||
|
"57-night": "Freezing Drizzle",
|
||||||
|
"51-day": "Light Drizzle",
|
||||||
|
"51-night": "Light Drizzle",
|
||||||
|
"53-day": "Drizzle",
|
||||||
|
"53-night": "Drizzle",
|
||||||
|
"55-day": "Heavy Drizzle",
|
||||||
|
"55-night": "Heavy Drizzle",
|
||||||
|
"56-day": "Light Freezing Drizzle",
|
||||||
|
"61-day": "Light Rain",
|
||||||
|
"56-night": "Light Freezing Drizzle",
|
||||||
|
"57-day": "Freezing Drizzle",
|
||||||
|
"61-night": "Light Rain",
|
||||||
|
"63-day": "Rain",
|
||||||
|
"63-night": "Rain",
|
||||||
|
"65-day": "Heavy Rain",
|
||||||
|
"65-night": "Heavy Rain",
|
||||||
|
"66-day": "Freezing Rain",
|
||||||
|
"66-night": "Freezing Rain",
|
||||||
|
"67-day": "Freezing Rain",
|
||||||
|
"67-night": "Freezing Rain",
|
||||||
|
"71-day": "Light Snow",
|
||||||
|
"71-night": "Light Snow",
|
||||||
|
"73-day": "Snow",
|
||||||
|
"73-night": "Snow",
|
||||||
|
"75-day": "Heavy Snow",
|
||||||
|
"95-night": "Thunderstorm",
|
||||||
|
"75-night": "Heavy Snow",
|
||||||
|
"77-day": "Snow Grains",
|
||||||
|
"77-night": "Snow Grains",
|
||||||
|
"80-night": "Light Showers",
|
||||||
|
"81-day": "Showers",
|
||||||
|
"81-night": "Showers",
|
||||||
|
"82-day": "Heavy Showers",
|
||||||
|
"82-night": "Heavy Showers",
|
||||||
|
"85-day": "Snow Showers",
|
||||||
|
"85-night": "Snow Showers",
|
||||||
|
"86-day": "Snow Showers",
|
||||||
|
"86-night": "Snow Showers",
|
||||||
|
"95-day": "Thunderstorm",
|
||||||
|
"96-day": "Thunderstorm With Hail",
|
||||||
|
"96-night": "Thunderstorm With Hail",
|
||||||
|
"99-day": "Thunderstorm With Hail",
|
||||||
|
"99-night": "Thunderstorm With Hail"
|
||||||
|
},
|
||||||
|
"quicklaunch": {
|
||||||
|
"bookmark": "Bookmark",
|
||||||
|
"service": "Service"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,18 +1,19 @@
|
|||||||
{
|
{
|
||||||
"weather": {
|
"weather": {
|
||||||
"current": "Tranutačna lokacija",
|
"current": "Trenutna lokacija",
|
||||||
"allow": "Pritisni za dozvoljavanje",
|
"allow": "Pritisni za dozvoljavanje",
|
||||||
"updating": "Aktualiziranje",
|
"updating": "Aktualiziranje",
|
||||||
"wait": "Pričekaj"
|
"wait": "Molimo pričekajte"
|
||||||
},
|
},
|
||||||
"search": {
|
"search": {
|
||||||
"placeholder": "Traži …"
|
"placeholder": "Traži…"
|
||||||
},
|
},
|
||||||
"resources": {
|
"resources": {
|
||||||
"total": "Ukupno",
|
"total": "Ukupno",
|
||||||
"free": "Slobodno",
|
"free": "Slobodno",
|
||||||
"used": "Korišteno",
|
"used": "Korišteno",
|
||||||
"load": "Opterećenje"
|
"load": "Opterećenje",
|
||||||
|
"cpu": "CPU"
|
||||||
},
|
},
|
||||||
"sabnzbd": {
|
"sabnzbd": {
|
||||||
"rate": "Stopa",
|
"rate": "Stopa",
|
||||||
@ -64,7 +65,7 @@
|
|||||||
"tx": "TX",
|
"tx": "TX",
|
||||||
"mem": "MEM",
|
"mem": "MEM",
|
||||||
"cpu": "CPU",
|
"cpu": "CPU",
|
||||||
"offline": "Odspojen"
|
"offline": "Izvan mreže"
|
||||||
},
|
},
|
||||||
"emby": {
|
"emby": {
|
||||||
"playing": "Reprodukcija",
|
"playing": "Reprodukcija",
|
||||||
@ -102,7 +103,8 @@
|
|||||||
"radarr": {
|
"radarr": {
|
||||||
"wanted": "Željeno",
|
"wanted": "Željeno",
|
||||||
"queued": "U redu čekanja",
|
"queued": "U redu čekanja",
|
||||||
"movies": "Filmovi"
|
"movies": "Filmovi",
|
||||||
|
"missing": "Missing"
|
||||||
},
|
},
|
||||||
"lidarr": {
|
"lidarr": {
|
||||||
"wanted": "Željeno",
|
"wanted": "Željeno",
|
||||||
@ -173,5 +175,103 @@
|
|||||||
"users": "Users",
|
"users": "Users",
|
||||||
"loginsLast24H": "Logins (24h)",
|
"loginsLast24H": "Logins (24h)",
|
||||||
"failedLoginsLast24H": "Failed Logins (24h)"
|
"failedLoginsLast24H": "Failed Logins (24h)"
|
||||||
|
},
|
||||||
|
"proxmox": {
|
||||||
|
"mem": "MEM",
|
||||||
|
"cpu": "CPU",
|
||||||
|
"lxc": "LXC",
|
||||||
|
"vms": "VMs"
|
||||||
|
},
|
||||||
|
"unifi": {
|
||||||
|
"users": "Korisnici",
|
||||||
|
"uptime": "Vrijeme rada sustava",
|
||||||
|
"days": "Dani",
|
||||||
|
"wan": "WAN",
|
||||||
|
"lan_users": "LAN Korisnici",
|
||||||
|
"wlan_users": "WLAN Korisnici",
|
||||||
|
"up": "Upaljen",
|
||||||
|
"down": "Ugašen",
|
||||||
|
"wait": "Molimo pričekajte",
|
||||||
|
"lan": "LAN",
|
||||||
|
"wlan": "WLAN",
|
||||||
|
"devices": "Devices",
|
||||||
|
"lan_devices": "LAN Devices",
|
||||||
|
"wlan_devices": "WLAN Devices"
|
||||||
|
},
|
||||||
|
"plex": {
|
||||||
|
"streams": "Active Streams",
|
||||||
|
"movies": "Movies",
|
||||||
|
"tv": "TV Shows"
|
||||||
|
},
|
||||||
|
"glances": {
|
||||||
|
"cpu": "CPU",
|
||||||
|
"mem": "MEM",
|
||||||
|
"wait": "Please wait"
|
||||||
|
},
|
||||||
|
"changedetectionio": {
|
||||||
|
"totalObserved": "Total Observed",
|
||||||
|
"diffsDetected": "Diffs Detected"
|
||||||
|
},
|
||||||
|
"wmo": {
|
||||||
|
"0-day": "Sunny",
|
||||||
|
"0-night": "Clear",
|
||||||
|
"1-day": "Mainly Sunny",
|
||||||
|
"1-night": "Mainly Clear",
|
||||||
|
"2-day": "Partly Cloudy",
|
||||||
|
"45-day": "Foggy",
|
||||||
|
"45-night": "Foggy",
|
||||||
|
"48-day": "Foggy",
|
||||||
|
"2-night": "Partly Cloudy",
|
||||||
|
"3-day": "Cloudy",
|
||||||
|
"3-night": "Cloudy",
|
||||||
|
"48-night": "Foggy",
|
||||||
|
"51-day": "Light Drizzle",
|
||||||
|
"51-night": "Light Drizzle",
|
||||||
|
"53-day": "Drizzle",
|
||||||
|
"53-night": "Drizzle",
|
||||||
|
"55-day": "Heavy Drizzle",
|
||||||
|
"55-night": "Heavy Drizzle",
|
||||||
|
"56-day": "Light Freezing Drizzle",
|
||||||
|
"56-night": "Light Freezing Drizzle",
|
||||||
|
"57-day": "Freezing Drizzle",
|
||||||
|
"57-night": "Freezing Drizzle",
|
||||||
|
"61-day": "Light Rain",
|
||||||
|
"61-night": "Light Rain",
|
||||||
|
"63-day": "Rain",
|
||||||
|
"63-night": "Rain",
|
||||||
|
"65-day": "Heavy Rain",
|
||||||
|
"65-night": "Heavy Rain",
|
||||||
|
"66-day": "Freezing Rain",
|
||||||
|
"66-night": "Freezing Rain",
|
||||||
|
"67-day": "Freezing Rain",
|
||||||
|
"67-night": "Freezing Rain",
|
||||||
|
"75-night": "Heavy Snow",
|
||||||
|
"77-day": "Snow Grains",
|
||||||
|
"71-day": "Light Snow",
|
||||||
|
"71-night": "Light Snow",
|
||||||
|
"73-day": "Snow",
|
||||||
|
"73-night": "Snow",
|
||||||
|
"75-day": "Heavy Snow",
|
||||||
|
"77-night": "Snow Grains",
|
||||||
|
"80-day": "Light Showers",
|
||||||
|
"80-night": "Light Showers",
|
||||||
|
"81-day": "Showers",
|
||||||
|
"81-night": "Showers",
|
||||||
|
"82-day": "Heavy Showers",
|
||||||
|
"82-night": "Heavy Showers",
|
||||||
|
"85-day": "Snow Showers",
|
||||||
|
"85-night": "Snow Showers",
|
||||||
|
"86-day": "Snow Showers",
|
||||||
|
"86-night": "Snow Showers",
|
||||||
|
"95-day": "Thunderstorm",
|
||||||
|
"95-night": "Thunderstorm",
|
||||||
|
"96-day": "Thunderstorm With Hail",
|
||||||
|
"96-night": "Thunderstorm With Hail",
|
||||||
|
"99-day": "Thunderstorm With Hail",
|
||||||
|
"99-night": "Thunderstorm With Hail"
|
||||||
|
},
|
||||||
|
"quicklaunch": {
|
||||||
|
"bookmark": "Bookmark",
|
||||||
|
"service": "Service"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -3,7 +3,8 @@
|
|||||||
"total": "Összes",
|
"total": "Összes",
|
||||||
"free": "Szabad",
|
"free": "Szabad",
|
||||||
"used": "Használt",
|
"used": "Használt",
|
||||||
"load": "Terhelés"
|
"load": "Terhelés",
|
||||||
|
"cpu": "CPU"
|
||||||
},
|
},
|
||||||
"docker": {
|
"docker": {
|
||||||
"rx": "RX",
|
"rx": "RX",
|
||||||
@ -87,7 +88,8 @@
|
|||||||
"radarr": {
|
"radarr": {
|
||||||
"wanted": "Keresett",
|
"wanted": "Keresett",
|
||||||
"queued": "Sorban áll",
|
"queued": "Sorban áll",
|
||||||
"movies": "Filmek"
|
"movies": "Filmek",
|
||||||
|
"missing": "Missing"
|
||||||
},
|
},
|
||||||
"ombi": {
|
"ombi": {
|
||||||
"pending": "Függőben",
|
"pending": "Függőben",
|
||||||
@ -173,5 +175,103 @@
|
|||||||
"users": "Users",
|
"users": "Users",
|
||||||
"loginsLast24H": "Logins (24h)",
|
"loginsLast24H": "Logins (24h)",
|
||||||
"failedLoginsLast24H": "Failed Logins (24h)"
|
"failedLoginsLast24H": "Failed Logins (24h)"
|
||||||
|
},
|
||||||
|
"proxmox": {
|
||||||
|
"mem": "MEM",
|
||||||
|
"cpu": "CPU",
|
||||||
|
"lxc": "LXC",
|
||||||
|
"vms": "VMs"
|
||||||
|
},
|
||||||
|
"unifi": {
|
||||||
|
"users": "Users",
|
||||||
|
"uptime": "System Uptime",
|
||||||
|
"days": "Days",
|
||||||
|
"wan": "WAN",
|
||||||
|
"lan_users": "LAN Users",
|
||||||
|
"wlan_users": "WLAN Users",
|
||||||
|
"up": "UP",
|
||||||
|
"down": "DOWN",
|
||||||
|
"wait": "Please wait",
|
||||||
|
"lan": "LAN",
|
||||||
|
"wlan": "WLAN",
|
||||||
|
"devices": "Devices",
|
||||||
|
"lan_devices": "LAN Devices",
|
||||||
|
"wlan_devices": "WLAN Devices"
|
||||||
|
},
|
||||||
|
"plex": {
|
||||||
|
"streams": "Active Streams",
|
||||||
|
"movies": "Movies",
|
||||||
|
"tv": "TV Shows"
|
||||||
|
},
|
||||||
|
"glances": {
|
||||||
|
"cpu": "CPU",
|
||||||
|
"mem": "MEM",
|
||||||
|
"wait": "Please wait"
|
||||||
|
},
|
||||||
|
"changedetectionio": {
|
||||||
|
"totalObserved": "Total Observed",
|
||||||
|
"diffsDetected": "Diffs Detected"
|
||||||
|
},
|
||||||
|
"wmo": {
|
||||||
|
"0-day": "Sunny",
|
||||||
|
"0-night": "Clear",
|
||||||
|
"3-day": "Cloudy",
|
||||||
|
"3-night": "Cloudy",
|
||||||
|
"45-day": "Foggy",
|
||||||
|
"53-day": "Drizzle",
|
||||||
|
"56-night": "Light Freezing Drizzle",
|
||||||
|
"57-day": "Freezing Drizzle",
|
||||||
|
"1-day": "Mainly Sunny",
|
||||||
|
"1-night": "Mainly Clear",
|
||||||
|
"2-day": "Partly Cloudy",
|
||||||
|
"2-night": "Partly Cloudy",
|
||||||
|
"45-night": "Foggy",
|
||||||
|
"48-day": "Foggy",
|
||||||
|
"48-night": "Foggy",
|
||||||
|
"51-day": "Light Drizzle",
|
||||||
|
"51-night": "Light Drizzle",
|
||||||
|
"57-night": "Freezing Drizzle",
|
||||||
|
"61-day": "Light Rain",
|
||||||
|
"61-night": "Light Rain",
|
||||||
|
"53-night": "Drizzle",
|
||||||
|
"55-day": "Heavy Drizzle",
|
||||||
|
"55-night": "Heavy Drizzle",
|
||||||
|
"56-day": "Light Freezing Drizzle",
|
||||||
|
"63-day": "Rain",
|
||||||
|
"63-night": "Rain",
|
||||||
|
"65-day": "Heavy Rain",
|
||||||
|
"65-night": "Heavy Rain",
|
||||||
|
"66-day": "Freezing Rain",
|
||||||
|
"66-night": "Freezing Rain",
|
||||||
|
"67-day": "Freezing Rain",
|
||||||
|
"67-night": "Freezing Rain",
|
||||||
|
"71-day": "Light Snow",
|
||||||
|
"71-night": "Light Snow",
|
||||||
|
"73-day": "Snow",
|
||||||
|
"73-night": "Snow",
|
||||||
|
"75-day": "Heavy Snow",
|
||||||
|
"75-night": "Heavy Snow",
|
||||||
|
"77-day": "Snow Grains",
|
||||||
|
"77-night": "Snow Grains",
|
||||||
|
"80-day": "Light Showers",
|
||||||
|
"80-night": "Light Showers",
|
||||||
|
"81-day": "Showers",
|
||||||
|
"81-night": "Showers",
|
||||||
|
"82-day": "Heavy Showers",
|
||||||
|
"82-night": "Heavy Showers",
|
||||||
|
"85-day": "Snow Showers",
|
||||||
|
"85-night": "Snow Showers",
|
||||||
|
"86-day": "Snow Showers",
|
||||||
|
"86-night": "Snow Showers",
|
||||||
|
"95-day": "Thunderstorm",
|
||||||
|
"95-night": "Thunderstorm",
|
||||||
|
"96-day": "Thunderstorm With Hail",
|
||||||
|
"96-night": "Thunderstorm With Hail",
|
||||||
|
"99-day": "Thunderstorm With Hail",
|
||||||
|
"99-night": "Thunderstorm With Hail"
|
||||||
|
},
|
||||||
|
"quicklaunch": {
|
||||||
|
"bookmark": "Bookmark",
|
||||||
|
"service": "Service"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -34,7 +34,7 @@
|
|||||||
"middleware": "Middleware"
|
"middleware": "Middleware"
|
||||||
},
|
},
|
||||||
"widget": {
|
"widget": {
|
||||||
"missing_type": "Missing Widget Type: {{type}}",
|
"missing_type": "Tipo del Widget Mancante: {{type}}",
|
||||||
"api_error": "Errore API",
|
"api_error": "Errore API",
|
||||||
"status": "Stato"
|
"status": "Stato"
|
||||||
},
|
},
|
||||||
@ -45,7 +45,8 @@
|
|||||||
"total": "Totale",
|
"total": "Totale",
|
||||||
"free": "Libero",
|
"free": "Libero",
|
||||||
"used": "In utilizzo",
|
"used": "In utilizzo",
|
||||||
"load": "Load"
|
"load": "Carica",
|
||||||
|
"cpu": "CPU"
|
||||||
},
|
},
|
||||||
"rutorrent": {
|
"rutorrent": {
|
||||||
"active": "Attivo",
|
"active": "Attivo",
|
||||||
@ -54,18 +55,19 @@
|
|||||||
},
|
},
|
||||||
"sonarr": {
|
"sonarr": {
|
||||||
"series": "Serie",
|
"series": "Serie",
|
||||||
"wanted": "Rchiesti",
|
"wanted": "Richiesti",
|
||||||
"queued": "In coda"
|
"queued": "In coda"
|
||||||
},
|
},
|
||||||
"radarr": {
|
"radarr": {
|
||||||
"wanted": "Richiesti",
|
"wanted": "Richiesti",
|
||||||
"queued": "In coda",
|
"queued": "In coda",
|
||||||
"movies": "Film"
|
"movies": "Film",
|
||||||
|
"missing": "Mancanti"
|
||||||
},
|
},
|
||||||
"readarr": {
|
"readarr": {
|
||||||
"wanted": "Wanted",
|
"wanted": "Richiesti",
|
||||||
"queued": "Queued",
|
"queued": "In coda",
|
||||||
"books": "Books"
|
"books": "Libri"
|
||||||
},
|
},
|
||||||
"ombi": {
|
"ombi": {
|
||||||
"pending": "In attesa",
|
"pending": "In attesa",
|
||||||
@ -109,11 +111,11 @@
|
|||||||
"downloaded": "Scaricato"
|
"downloaded": "Scaricato"
|
||||||
},
|
},
|
||||||
"coinmarketcap": {
|
"coinmarketcap": {
|
||||||
"configure": "Configure one or more crypto currencies to track",
|
"configure": "Configurare una o più criptomonete da seguire",
|
||||||
"1day": "1 Day",
|
"1day": "1 Giorno",
|
||||||
"7days": "7 Days",
|
"7days": "7 Giorni",
|
||||||
"1hour": "1 Hour",
|
"1hour": "1 Ora",
|
||||||
"30days": "30 Days"
|
"30days": "30 Giorni"
|
||||||
},
|
},
|
||||||
"gotify": {
|
"gotify": {
|
||||||
"apps": "Applicazioni",
|
"apps": "Applicazioni",
|
||||||
@ -134,23 +136,23 @@
|
|||||||
"seed": "Seed"
|
"seed": "Seed"
|
||||||
},
|
},
|
||||||
"jackett": {
|
"jackett": {
|
||||||
"configured": "Configured",
|
"configured": "Configurato",
|
||||||
"errored": "Errored"
|
"errored": "Errore"
|
||||||
},
|
},
|
||||||
"bazarr": {
|
"bazarr": {
|
||||||
"missingEpisodes": "Missing Episodes",
|
"missingEpisodes": "Episodi Mancanti",
|
||||||
"missingMovies": "Missing Movies"
|
"missingMovies": "Film Mancanti"
|
||||||
},
|
},
|
||||||
"lidarr": {
|
"lidarr": {
|
||||||
"wanted": "Wanted",
|
"wanted": "Mancanti",
|
||||||
"queued": "Queued",
|
"queued": "In coda",
|
||||||
"albums": "Albums"
|
"albums": "Albums"
|
||||||
},
|
},
|
||||||
"adguard": {
|
"adguard": {
|
||||||
"queries": "Queries",
|
"queries": "Queries",
|
||||||
"blocked": "Blocked",
|
"blocked": "Bloccati",
|
||||||
"filtered": "Filtered",
|
"filtered": "Filtrati",
|
||||||
"latency": "Latency"
|
"latency": "Latenza"
|
||||||
},
|
},
|
||||||
"qbittorrent": {
|
"qbittorrent": {
|
||||||
"download": "Download",
|
"download": "Download",
|
||||||
@ -159,19 +161,117 @@
|
|||||||
"seed": "Seed"
|
"seed": "Seed"
|
||||||
},
|
},
|
||||||
"mastodon": {
|
"mastodon": {
|
||||||
"user_count": "Users",
|
"user_count": "Utenti",
|
||||||
"status_count": "Posts",
|
"status_count": "Posts",
|
||||||
"domain_count": "Domains"
|
"domain_count": "Domini"
|
||||||
},
|
},
|
||||||
"strelaysrv": {
|
"strelaysrv": {
|
||||||
"numActiveSessions": "Sessions",
|
"numActiveSessions": "Sessioni",
|
||||||
"numConnections": "Connections",
|
"numConnections": "Connessioni",
|
||||||
"dataRelayed": "Relayed",
|
"dataRelayed": "Ritrasmettessi",
|
||||||
"transferRate": "Rate"
|
"transferRate": "Velocità"
|
||||||
},
|
},
|
||||||
"authentik": {
|
"authentik": {
|
||||||
"users": "Users",
|
"users": "Utenti",
|
||||||
"loginsLast24H": "Logins (24h)",
|
"loginsLast24H": "Accessi (24h)",
|
||||||
"failedLoginsLast24H": "Failed Logins (24h)"
|
"failedLoginsLast24H": "Accessi Falliti (24h)"
|
||||||
|
},
|
||||||
|
"proxmox": {
|
||||||
|
"mem": "MEM",
|
||||||
|
"cpu": "CPU",
|
||||||
|
"lxc": "LXC",
|
||||||
|
"vms": "Macchine Virtuali"
|
||||||
|
},
|
||||||
|
"unifi": {
|
||||||
|
"users": "Utenti",
|
||||||
|
"uptime": "System Uptime",
|
||||||
|
"days": "Giorni",
|
||||||
|
"wan": "WAN",
|
||||||
|
"lan_users": "Utenti LAN",
|
||||||
|
"wait": "Attendere prego",
|
||||||
|
"wlan_users": "Utenti WLAN",
|
||||||
|
"up": "UP",
|
||||||
|
"down": "DOWN",
|
||||||
|
"lan": "LAN",
|
||||||
|
"wlan": "WLAN",
|
||||||
|
"devices": "Dispositivi",
|
||||||
|
"lan_devices": "Dispositivi LAN",
|
||||||
|
"wlan_devices": "Dispositivi WLAN"
|
||||||
|
},
|
||||||
|
"plex": {
|
||||||
|
"streams": "Trasmissioni attive",
|
||||||
|
"movies": "Film",
|
||||||
|
"tv": "Programma televisivo"
|
||||||
|
},
|
||||||
|
"glances": {
|
||||||
|
"cpu": "CPU",
|
||||||
|
"mem": "MEM",
|
||||||
|
"wait": "Attendere prego"
|
||||||
|
},
|
||||||
|
"changedetectionio": {
|
||||||
|
"totalObserved": "Total Observed",
|
||||||
|
"diffsDetected": "Diffs Detected"
|
||||||
|
},
|
||||||
|
"wmo": {
|
||||||
|
"65-day": "Heavy Rain",
|
||||||
|
"2-night": "Parzialmente Nuvoloso",
|
||||||
|
"0-day": "Solleggiato",
|
||||||
|
"0-night": "Clear",
|
||||||
|
"1-day": "Mainly Sunny",
|
||||||
|
"1-night": "Mainly Clear",
|
||||||
|
"2-day": "Parzialmente Nuvoloso",
|
||||||
|
"3-day": "Cloudy",
|
||||||
|
"3-night": "Cloudy",
|
||||||
|
"45-day": "Nebbioso",
|
||||||
|
"45-night": "Nebbioso",
|
||||||
|
"48-day": "Nebbioso",
|
||||||
|
"48-night": "Nebbioso",
|
||||||
|
"51-day": "Pioggerella Leggera",
|
||||||
|
"51-night": "Pioggerella Leggera",
|
||||||
|
"53-day": "Pioggerella",
|
||||||
|
"53-night": "Pioggerella",
|
||||||
|
"55-day": "Pioggerella Pesante",
|
||||||
|
"55-night": "Pioggerella Pesante",
|
||||||
|
"56-day": "Light Freezing Drizzle",
|
||||||
|
"56-night": "Light Freezing Drizzle",
|
||||||
|
"57-day": "Freezing Drizzle",
|
||||||
|
"57-night": "Freezing Drizzle",
|
||||||
|
"61-day": "Pioggia Leggera",
|
||||||
|
"61-night": "Pioggia Leggera",
|
||||||
|
"63-day": "Pioggia",
|
||||||
|
"63-night": "Pioggia",
|
||||||
|
"65-night": "Heavy Rain",
|
||||||
|
"66-day": "Freezing Rain",
|
||||||
|
"66-night": "Freezing Rain",
|
||||||
|
"67-day": "Freezing Rain",
|
||||||
|
"67-night": "Freezing Rain",
|
||||||
|
"71-day": "Light Snow",
|
||||||
|
"71-night": "Light Snow",
|
||||||
|
"73-day": "Neve",
|
||||||
|
"73-night": "Neve",
|
||||||
|
"75-day": "Heavy Snow",
|
||||||
|
"75-night": "Heavy Snow",
|
||||||
|
"77-day": "Snow Grains",
|
||||||
|
"77-night": "Snow Grains",
|
||||||
|
"80-day": "Light Showers",
|
||||||
|
"80-night": "Light Showers",
|
||||||
|
"81-day": "Showers",
|
||||||
|
"81-night": "Showers",
|
||||||
|
"82-day": "Heavy Showers",
|
||||||
|
"82-night": "Heavy Showers",
|
||||||
|
"85-day": "Snow Showers",
|
||||||
|
"85-night": "Snow Showers",
|
||||||
|
"86-day": "Snow Showers",
|
||||||
|
"86-night": "Snow Showers",
|
||||||
|
"95-day": "Thunderstorm",
|
||||||
|
"95-night": "Thunderstorm",
|
||||||
|
"96-day": "Thunderstorm With Hail",
|
||||||
|
"96-night": "Thunderstorm With Hail",
|
||||||
|
"99-day": "Thunderstorm With Hail",
|
||||||
|
"99-night": "Thunderstorm With Hail"
|
||||||
|
},
|
||||||
|
"quicklaunch": {
|
||||||
|
"bookmark": "Bookmark",
|
||||||
|
"service": "Service"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -11,7 +11,8 @@
|
|||||||
"total": "Totalt",
|
"total": "Totalt",
|
||||||
"free": "Ledig",
|
"free": "Ledig",
|
||||||
"used": "Brukt",
|
"used": "Brukt",
|
||||||
"load": "Last inn"
|
"load": "Last inn",
|
||||||
|
"cpu": "CPU"
|
||||||
},
|
},
|
||||||
"docker": {
|
"docker": {
|
||||||
"rx": "Mottatt",
|
"rx": "Mottatt",
|
||||||
@ -45,7 +46,8 @@
|
|||||||
"radarr": {
|
"radarr": {
|
||||||
"wanted": "Ønsket",
|
"wanted": "Ønsket",
|
||||||
"queued": "I kø",
|
"queued": "I kø",
|
||||||
"movies": "Filmer"
|
"movies": "Filmer",
|
||||||
|
"missing": "Missing"
|
||||||
},
|
},
|
||||||
"readarr": {
|
"readarr": {
|
||||||
"wanted": "Wanted",
|
"wanted": "Wanted",
|
||||||
@ -173,5 +175,103 @@
|
|||||||
"users": "Users",
|
"users": "Users",
|
||||||
"loginsLast24H": "Logins (24h)",
|
"loginsLast24H": "Logins (24h)",
|
||||||
"failedLoginsLast24H": "Failed Logins (24h)"
|
"failedLoginsLast24H": "Failed Logins (24h)"
|
||||||
|
},
|
||||||
|
"proxmox": {
|
||||||
|
"mem": "MEM",
|
||||||
|
"cpu": "CPU",
|
||||||
|
"lxc": "LXC",
|
||||||
|
"vms": "VMs"
|
||||||
|
},
|
||||||
|
"unifi": {
|
||||||
|
"users": "Users",
|
||||||
|
"uptime": "System Uptime",
|
||||||
|
"days": "Days",
|
||||||
|
"wan": "WAN",
|
||||||
|
"lan_users": "LAN Users",
|
||||||
|
"wlan_users": "WLAN Users",
|
||||||
|
"up": "UP",
|
||||||
|
"down": "DOWN",
|
||||||
|
"wait": "Please wait",
|
||||||
|
"lan": "LAN",
|
||||||
|
"wlan": "WLAN",
|
||||||
|
"devices": "Devices",
|
||||||
|
"lan_devices": "LAN Devices",
|
||||||
|
"wlan_devices": "WLAN Devices"
|
||||||
|
},
|
||||||
|
"plex": {
|
||||||
|
"streams": "Active Streams",
|
||||||
|
"movies": "Movies",
|
||||||
|
"tv": "TV Shows"
|
||||||
|
},
|
||||||
|
"glances": {
|
||||||
|
"cpu": "CPU",
|
||||||
|
"mem": "MEM",
|
||||||
|
"wait": "Please wait"
|
||||||
|
},
|
||||||
|
"changedetectionio": {
|
||||||
|
"totalObserved": "Total Observed",
|
||||||
|
"diffsDetected": "Diffs Detected"
|
||||||
|
},
|
||||||
|
"wmo": {
|
||||||
|
"2-day": "Partly Cloudy",
|
||||||
|
"2-night": "Partly Cloudy",
|
||||||
|
"3-day": "Cloudy",
|
||||||
|
"3-night": "Cloudy",
|
||||||
|
"45-day": "Foggy",
|
||||||
|
"45-night": "Foggy",
|
||||||
|
"0-day": "Sunny",
|
||||||
|
"0-night": "Clear",
|
||||||
|
"1-day": "Mainly Sunny",
|
||||||
|
"1-night": "Mainly Clear",
|
||||||
|
"48-day": "Foggy",
|
||||||
|
"48-night": "Foggy",
|
||||||
|
"51-day": "Light Drizzle",
|
||||||
|
"51-night": "Light Drizzle",
|
||||||
|
"53-day": "Drizzle",
|
||||||
|
"53-night": "Drizzle",
|
||||||
|
"55-day": "Heavy Drizzle",
|
||||||
|
"55-night": "Heavy Drizzle",
|
||||||
|
"56-day": "Light Freezing Drizzle",
|
||||||
|
"56-night": "Light Freezing Drizzle",
|
||||||
|
"63-day": "Rain",
|
||||||
|
"57-day": "Freezing Drizzle",
|
||||||
|
"57-night": "Freezing Drizzle",
|
||||||
|
"61-day": "Light Rain",
|
||||||
|
"61-night": "Light Rain",
|
||||||
|
"63-night": "Rain",
|
||||||
|
"65-day": "Heavy Rain",
|
||||||
|
"65-night": "Heavy Rain",
|
||||||
|
"66-day": "Freezing Rain",
|
||||||
|
"66-night": "Freezing Rain",
|
||||||
|
"67-day": "Freezing Rain",
|
||||||
|
"67-night": "Freezing Rain",
|
||||||
|
"71-day": "Light Snow",
|
||||||
|
"71-night": "Light Snow",
|
||||||
|
"73-day": "Snow",
|
||||||
|
"73-night": "Snow",
|
||||||
|
"75-day": "Heavy Snow",
|
||||||
|
"75-night": "Heavy Snow",
|
||||||
|
"77-day": "Snow Grains",
|
||||||
|
"77-night": "Snow Grains",
|
||||||
|
"80-day": "Light Showers",
|
||||||
|
"80-night": "Light Showers",
|
||||||
|
"81-day": "Showers",
|
||||||
|
"81-night": "Showers",
|
||||||
|
"82-day": "Heavy Showers",
|
||||||
|
"82-night": "Heavy Showers",
|
||||||
|
"85-day": "Snow Showers",
|
||||||
|
"95-day": "Thunderstorm",
|
||||||
|
"85-night": "Snow Showers",
|
||||||
|
"86-day": "Snow Showers",
|
||||||
|
"86-night": "Snow Showers",
|
||||||
|
"95-night": "Thunderstorm",
|
||||||
|
"96-day": "Thunderstorm With Hail",
|
||||||
|
"96-night": "Thunderstorm With Hail",
|
||||||
|
"99-day": "Thunderstorm With Hail",
|
||||||
|
"99-night": "Thunderstorm With Hail"
|
||||||
|
},
|
||||||
|
"quicklaunch": {
|
||||||
|
"bookmark": "Bookmark",
|
||||||
|
"service": "Service"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -8,7 +8,8 @@
|
|||||||
"total": "Totaal",
|
"total": "Totaal",
|
||||||
"free": "Vrij",
|
"free": "Vrij",
|
||||||
"used": "Gebruikt",
|
"used": "Gebruikt",
|
||||||
"load": "Load"
|
"load": "Load",
|
||||||
|
"cpu": "CPU"
|
||||||
},
|
},
|
||||||
"docker": {
|
"docker": {
|
||||||
"rx": "RX",
|
"rx": "RX",
|
||||||
@ -61,7 +62,8 @@
|
|||||||
"radarr": {
|
"radarr": {
|
||||||
"movies": "Films",
|
"movies": "Films",
|
||||||
"wanted": "Gezocht",
|
"wanted": "Gezocht",
|
||||||
"queued": "In de wachtrij"
|
"queued": "In de wachtrij",
|
||||||
|
"missing": "Missing"
|
||||||
},
|
},
|
||||||
"readarr": {
|
"readarr": {
|
||||||
"wanted": "Wanted",
|
"wanted": "Wanted",
|
||||||
@ -173,5 +175,103 @@
|
|||||||
"users": "Users",
|
"users": "Users",
|
||||||
"loginsLast24H": "Logins (24h)",
|
"loginsLast24H": "Logins (24h)",
|
||||||
"failedLoginsLast24H": "Failed Logins (24h)"
|
"failedLoginsLast24H": "Failed Logins (24h)"
|
||||||
|
},
|
||||||
|
"proxmox": {
|
||||||
|
"mem": "MEM",
|
||||||
|
"cpu": "CPU",
|
||||||
|
"lxc": "LXC",
|
||||||
|
"vms": "VMs"
|
||||||
|
},
|
||||||
|
"unifi": {
|
||||||
|
"users": "Users",
|
||||||
|
"lan_users": "LAN Users",
|
||||||
|
"uptime": "System Uptime",
|
||||||
|
"days": "Days",
|
||||||
|
"wan": "WAN",
|
||||||
|
"wlan_users": "WLAN Users",
|
||||||
|
"up": "UP",
|
||||||
|
"down": "DOWN",
|
||||||
|
"wait": "Please wait",
|
||||||
|
"lan": "LAN",
|
||||||
|
"wlan": "WLAN",
|
||||||
|
"devices": "Devices",
|
||||||
|
"lan_devices": "LAN Devices",
|
||||||
|
"wlan_devices": "WLAN Devices"
|
||||||
|
},
|
||||||
|
"plex": {
|
||||||
|
"streams": "Active Streams",
|
||||||
|
"movies": "Movies",
|
||||||
|
"tv": "TV Shows"
|
||||||
|
},
|
||||||
|
"glances": {
|
||||||
|
"cpu": "CPU",
|
||||||
|
"mem": "MEM",
|
||||||
|
"wait": "Please wait"
|
||||||
|
},
|
||||||
|
"changedetectionio": {
|
||||||
|
"totalObserved": "Total Observed",
|
||||||
|
"diffsDetected": "Diffs Detected"
|
||||||
|
},
|
||||||
|
"wmo": {
|
||||||
|
"0-day": "Sunny",
|
||||||
|
"0-night": "Clear",
|
||||||
|
"1-day": "Mainly Sunny",
|
||||||
|
"1-night": "Mainly Clear",
|
||||||
|
"3-day": "Cloudy",
|
||||||
|
"99-night": "Thunderstorm With Hail",
|
||||||
|
"3-night": "Cloudy",
|
||||||
|
"2-day": "Partly Cloudy",
|
||||||
|
"2-night": "Partly Cloudy",
|
||||||
|
"45-day": "Foggy",
|
||||||
|
"45-night": "Foggy",
|
||||||
|
"48-day": "Foggy",
|
||||||
|
"48-night": "Foggy",
|
||||||
|
"51-day": "Light Drizzle",
|
||||||
|
"51-night": "Light Drizzle",
|
||||||
|
"53-day": "Drizzle",
|
||||||
|
"53-night": "Drizzle",
|
||||||
|
"55-night": "Heavy Drizzle",
|
||||||
|
"55-day": "Heavy Drizzle",
|
||||||
|
"56-day": "Light Freezing Drizzle",
|
||||||
|
"56-night": "Light Freezing Drizzle",
|
||||||
|
"57-day": "Freezing Drizzle",
|
||||||
|
"57-night": "Freezing Drizzle",
|
||||||
|
"61-day": "Light Rain",
|
||||||
|
"61-night": "Light Rain",
|
||||||
|
"63-day": "Rain",
|
||||||
|
"63-night": "Rain",
|
||||||
|
"65-day": "Heavy Rain",
|
||||||
|
"65-night": "Heavy Rain",
|
||||||
|
"66-day": "Freezing Rain",
|
||||||
|
"66-night": "Freezing Rain",
|
||||||
|
"67-day": "Freezing Rain",
|
||||||
|
"67-night": "Freezing Rain",
|
||||||
|
"71-day": "Light Snow",
|
||||||
|
"71-night": "Light Snow",
|
||||||
|
"73-day": "Snow",
|
||||||
|
"73-night": "Snow",
|
||||||
|
"75-day": "Heavy Snow",
|
||||||
|
"75-night": "Heavy Snow",
|
||||||
|
"77-day": "Snow Grains",
|
||||||
|
"77-night": "Snow Grains",
|
||||||
|
"80-day": "Light Showers",
|
||||||
|
"80-night": "Light Showers",
|
||||||
|
"81-day": "Showers",
|
||||||
|
"81-night": "Showers",
|
||||||
|
"82-night": "Heavy Showers",
|
||||||
|
"85-day": "Snow Showers",
|
||||||
|
"82-day": "Heavy Showers",
|
||||||
|
"85-night": "Snow Showers",
|
||||||
|
"86-day": "Snow Showers",
|
||||||
|
"86-night": "Snow Showers",
|
||||||
|
"95-day": "Thunderstorm",
|
||||||
|
"95-night": "Thunderstorm",
|
||||||
|
"96-day": "Thunderstorm With Hail",
|
||||||
|
"96-night": "Thunderstorm With Hail",
|
||||||
|
"99-day": "Thunderstorm With Hail"
|
||||||
|
},
|
||||||
|
"quicklaunch": {
|
||||||
|
"bookmark": "Bookmark",
|
||||||
|
"service": "Service"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -12,7 +12,8 @@
|
|||||||
"used": "Użyte",
|
"used": "Użyte",
|
||||||
"load": "Obciążenie",
|
"load": "Obciążenie",
|
||||||
"total": "Całkowite",
|
"total": "Całkowite",
|
||||||
"free": "Wolne"
|
"free": "Wolne",
|
||||||
|
"cpu": "CPU"
|
||||||
},
|
},
|
||||||
"emby": {
|
"emby": {
|
||||||
"no_active": "Brak aktywnych strumieni",
|
"no_active": "Brak aktywnych strumieni",
|
||||||
@ -89,7 +90,8 @@
|
|||||||
"radarr": {
|
"radarr": {
|
||||||
"wanted": "Poszukiwane",
|
"wanted": "Poszukiwane",
|
||||||
"queued": "W kolejce",
|
"queued": "W kolejce",
|
||||||
"movies": "Filmy"
|
"movies": "Filmy",
|
||||||
|
"missing": "Missing"
|
||||||
},
|
},
|
||||||
"lidarr": {
|
"lidarr": {
|
||||||
"wanted": "Poszukiwane",
|
"wanted": "Poszukiwane",
|
||||||
@ -159,19 +161,117 @@
|
|||||||
"seed": "Seed"
|
"seed": "Seed"
|
||||||
},
|
},
|
||||||
"mastodon": {
|
"mastodon": {
|
||||||
"user_count": "Users",
|
"user_count": "Użytkownicy",
|
||||||
"status_count": "Posts",
|
"status_count": "Posts",
|
||||||
"domain_count": "Domains"
|
"domain_count": "Domeny"
|
||||||
},
|
},
|
||||||
"strelaysrv": {
|
"strelaysrv": {
|
||||||
"numActiveSessions": "Sessions",
|
"numActiveSessions": "Sesje",
|
||||||
"numConnections": "Connections",
|
"numConnections": "Połączenia",
|
||||||
"dataRelayed": "Relayed",
|
"dataRelayed": "Relayed",
|
||||||
"transferRate": "Rate"
|
"transferRate": "Rate"
|
||||||
},
|
},
|
||||||
"authentik": {
|
"authentik": {
|
||||||
"users": "Users",
|
"users": "Użytkownicy",
|
||||||
"loginsLast24H": "Logins (24h)",
|
"loginsLast24H": "Logowania (24h)",
|
||||||
"failedLoginsLast24H": "Failed Logins (24h)"
|
"failedLoginsLast24H": "Nieudane logowania (24h)"
|
||||||
|
},
|
||||||
|
"proxmox": {
|
||||||
|
"mem": "MEM",
|
||||||
|
"cpu": "CPU",
|
||||||
|
"lxc": "LXC",
|
||||||
|
"vms": "VMs"
|
||||||
|
},
|
||||||
|
"unifi": {
|
||||||
|
"users": "Użytkownicy",
|
||||||
|
"uptime": "Czas pracy systemu",
|
||||||
|
"days": "Dni",
|
||||||
|
"wan": "WAN",
|
||||||
|
"lan_users": "LAN Users",
|
||||||
|
"wlan_users": "WLAN Users",
|
||||||
|
"up": "UP",
|
||||||
|
"down": "DOWN",
|
||||||
|
"wait": "Please wait",
|
||||||
|
"lan": "LAN",
|
||||||
|
"wlan": "WLAN",
|
||||||
|
"devices": "Devices",
|
||||||
|
"lan_devices": "LAN Devices",
|
||||||
|
"wlan_devices": "WLAN Devices"
|
||||||
|
},
|
||||||
|
"plex": {
|
||||||
|
"streams": "Active Streams",
|
||||||
|
"movies": "Movies",
|
||||||
|
"tv": "TV Shows"
|
||||||
|
},
|
||||||
|
"glances": {
|
||||||
|
"cpu": "CPU",
|
||||||
|
"mem": "MEM",
|
||||||
|
"wait": "Please wait"
|
||||||
|
},
|
||||||
|
"changedetectionio": {
|
||||||
|
"diffsDetected": "Diffs Detected",
|
||||||
|
"totalObserved": "Total Observed"
|
||||||
|
},
|
||||||
|
"wmo": {
|
||||||
|
"77-day": "Snow Grains",
|
||||||
|
"0-day": "Słoneczny",
|
||||||
|
"0-night": "Clear",
|
||||||
|
"1-day": "Mainly Sunny",
|
||||||
|
"1-night": "Mainly Clear",
|
||||||
|
"2-day": "Partly Cloudy",
|
||||||
|
"2-night": "Partly Cloudy",
|
||||||
|
"3-day": "Cloudy",
|
||||||
|
"3-night": "Cloudy",
|
||||||
|
"45-day": "Foggy",
|
||||||
|
"45-night": "Foggy",
|
||||||
|
"48-day": "Foggy",
|
||||||
|
"48-night": "Foggy",
|
||||||
|
"51-day": "Light Drizzle",
|
||||||
|
"51-night": "Light Drizzle",
|
||||||
|
"53-day": "Drizzle",
|
||||||
|
"53-night": "Drizzle",
|
||||||
|
"55-day": "Heavy Drizzle",
|
||||||
|
"55-night": "Heavy Drizzle",
|
||||||
|
"56-day": "Light Freezing Drizzle",
|
||||||
|
"56-night": "Light Freezing Drizzle",
|
||||||
|
"57-day": "Freezing Drizzle",
|
||||||
|
"57-night": "Freezing Drizzle",
|
||||||
|
"61-day": "Light Rain",
|
||||||
|
"61-night": "Light Rain",
|
||||||
|
"63-day": "Rain",
|
||||||
|
"63-night": "Rain",
|
||||||
|
"65-day": "Heavy Rain",
|
||||||
|
"65-night": "Heavy Rain",
|
||||||
|
"66-day": "Freezing Rain",
|
||||||
|
"66-night": "Freezing Rain",
|
||||||
|
"67-day": "Freezing Rain",
|
||||||
|
"67-night": "Freezing Rain",
|
||||||
|
"71-day": "Light Snow",
|
||||||
|
"71-night": "Light Snow",
|
||||||
|
"73-day": "Snow",
|
||||||
|
"73-night": "Snow",
|
||||||
|
"75-day": "Heavy Snow",
|
||||||
|
"75-night": "Heavy Snow",
|
||||||
|
"77-night": "Snow Grains",
|
||||||
|
"80-day": "Light Showers",
|
||||||
|
"80-night": "Light Showers",
|
||||||
|
"81-day": "Showers",
|
||||||
|
"81-night": "Showers",
|
||||||
|
"82-day": "Heavy Showers",
|
||||||
|
"82-night": "Heavy Showers",
|
||||||
|
"85-day": "Snow Showers",
|
||||||
|
"85-night": "Snow Showers",
|
||||||
|
"86-day": "Snow Showers",
|
||||||
|
"86-night": "Snow Showers",
|
||||||
|
"95-day": "Thunderstorm",
|
||||||
|
"95-night": "Thunderstorm",
|
||||||
|
"96-day": "Thunderstorm With Hail",
|
||||||
|
"96-night": "Thunderstorm With Hail",
|
||||||
|
"99-day": "Thunderstorm With Hail",
|
||||||
|
"99-night": "Thunderstorm With Hail"
|
||||||
|
},
|
||||||
|
"quicklaunch": {
|
||||||
|
"bookmark": "Bookmark",
|
||||||
|
"service": "Service"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -45,7 +45,8 @@
|
|||||||
"total": "Total",
|
"total": "Total",
|
||||||
"free": "Livre",
|
"free": "Livre",
|
||||||
"used": "Usado",
|
"used": "Usado",
|
||||||
"load": "Carregamento"
|
"load": "Carregamento",
|
||||||
|
"cpu": "CPU"
|
||||||
},
|
},
|
||||||
"docker": {
|
"docker": {
|
||||||
"rx": "Rx",
|
"rx": "Rx",
|
||||||
@ -91,7 +92,8 @@
|
|||||||
"radarr": {
|
"radarr": {
|
||||||
"wanted": "Desejado",
|
"wanted": "Desejado",
|
||||||
"queued": "Na fila",
|
"queued": "Na fila",
|
||||||
"movies": "Filmes"
|
"movies": "Filmes",
|
||||||
|
"missing": "Missing"
|
||||||
},
|
},
|
||||||
"lidarr": {
|
"lidarr": {
|
||||||
"wanted": "Desejado",
|
"wanted": "Desejado",
|
||||||
@ -173,5 +175,103 @@
|
|||||||
"users": "Users",
|
"users": "Users",
|
||||||
"loginsLast24H": "Logins (24h)",
|
"loginsLast24H": "Logins (24h)",
|
||||||
"failedLoginsLast24H": "Failed Logins (24h)"
|
"failedLoginsLast24H": "Failed Logins (24h)"
|
||||||
|
},
|
||||||
|
"proxmox": {
|
||||||
|
"mem": "MEM",
|
||||||
|
"cpu": "CPU",
|
||||||
|
"lxc": "LXC",
|
||||||
|
"vms": "VMs"
|
||||||
|
},
|
||||||
|
"unifi": {
|
||||||
|
"users": "Users",
|
||||||
|
"uptime": "System Uptime",
|
||||||
|
"days": "Days",
|
||||||
|
"wan": "WAN",
|
||||||
|
"lan_users": "LAN Users",
|
||||||
|
"wlan_users": "WLAN Users",
|
||||||
|
"up": "UP",
|
||||||
|
"down": "DOWN",
|
||||||
|
"wait": "Please wait",
|
||||||
|
"lan": "LAN",
|
||||||
|
"wlan": "WLAN",
|
||||||
|
"devices": "Devices",
|
||||||
|
"lan_devices": "LAN Devices",
|
||||||
|
"wlan_devices": "WLAN Devices"
|
||||||
|
},
|
||||||
|
"plex": {
|
||||||
|
"streams": "Active Streams",
|
||||||
|
"movies": "Movies",
|
||||||
|
"tv": "TV Shows"
|
||||||
|
},
|
||||||
|
"glances": {
|
||||||
|
"cpu": "CPU",
|
||||||
|
"mem": "MEM",
|
||||||
|
"wait": "Please wait"
|
||||||
|
},
|
||||||
|
"changedetectionio": {
|
||||||
|
"totalObserved": "Total Observed",
|
||||||
|
"diffsDetected": "Diffs Detected"
|
||||||
|
},
|
||||||
|
"wmo": {
|
||||||
|
"1-night": "Mainly Clear",
|
||||||
|
"2-day": "Partly Cloudy",
|
||||||
|
"2-night": "Partly Cloudy",
|
||||||
|
"3-day": "Cloudy",
|
||||||
|
"3-night": "Cloudy",
|
||||||
|
"45-day": "Foggy",
|
||||||
|
"45-night": "Foggy",
|
||||||
|
"48-day": "Foggy",
|
||||||
|
"48-night": "Foggy",
|
||||||
|
"56-night": "Light Freezing Drizzle",
|
||||||
|
"57-day": "Freezing Drizzle",
|
||||||
|
"99-day": "Thunderstorm With Hail",
|
||||||
|
"99-night": "Thunderstorm With Hail",
|
||||||
|
"0-day": "Sunny",
|
||||||
|
"53-day": "Drizzle",
|
||||||
|
"0-night": "Clear",
|
||||||
|
"1-day": "Mainly Sunny",
|
||||||
|
"51-day": "Light Drizzle",
|
||||||
|
"51-night": "Light Drizzle",
|
||||||
|
"53-night": "Drizzle",
|
||||||
|
"55-day": "Heavy Drizzle",
|
||||||
|
"55-night": "Heavy Drizzle",
|
||||||
|
"56-day": "Light Freezing Drizzle",
|
||||||
|
"57-night": "Freezing Drizzle",
|
||||||
|
"61-day": "Light Rain",
|
||||||
|
"61-night": "Light Rain",
|
||||||
|
"63-day": "Rain",
|
||||||
|
"63-night": "Rain",
|
||||||
|
"65-day": "Heavy Rain",
|
||||||
|
"65-night": "Heavy Rain",
|
||||||
|
"66-day": "Freezing Rain",
|
||||||
|
"66-night": "Freezing Rain",
|
||||||
|
"67-day": "Freezing Rain",
|
||||||
|
"67-night": "Freezing Rain",
|
||||||
|
"71-day": "Light Snow",
|
||||||
|
"71-night": "Light Snow",
|
||||||
|
"73-day": "Snow",
|
||||||
|
"73-night": "Snow",
|
||||||
|
"75-day": "Heavy Snow",
|
||||||
|
"75-night": "Heavy Snow",
|
||||||
|
"77-day": "Snow Grains",
|
||||||
|
"77-night": "Snow Grains",
|
||||||
|
"80-day": "Light Showers",
|
||||||
|
"80-night": "Light Showers",
|
||||||
|
"81-day": "Showers",
|
||||||
|
"81-night": "Showers",
|
||||||
|
"82-day": "Heavy Showers",
|
||||||
|
"82-night": "Heavy Showers",
|
||||||
|
"85-day": "Snow Showers",
|
||||||
|
"85-night": "Snow Showers",
|
||||||
|
"86-day": "Snow Showers",
|
||||||
|
"86-night": "Snow Showers",
|
||||||
|
"95-day": "Thunderstorm",
|
||||||
|
"95-night": "Thunderstorm",
|
||||||
|
"96-day": "Thunderstorm With Hail",
|
||||||
|
"96-night": "Thunderstorm With Hail"
|
||||||
|
},
|
||||||
|
"quicklaunch": {
|
||||||
|
"bookmark": "Bookmark",
|
||||||
|
"service": "Service"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -11,7 +11,8 @@
|
|||||||
"total": "Total",
|
"total": "Total",
|
||||||
"free": "Livre",
|
"free": "Livre",
|
||||||
"used": "Usado",
|
"used": "Usado",
|
||||||
"load": "Carregar"
|
"load": "Carregar",
|
||||||
|
"cpu": "CPU"
|
||||||
},
|
},
|
||||||
"docker": {
|
"docker": {
|
||||||
"rx": "Rx",
|
"rx": "Rx",
|
||||||
@ -45,7 +46,8 @@
|
|||||||
"radarr": {
|
"radarr": {
|
||||||
"wanted": "Desejado",
|
"wanted": "Desejado",
|
||||||
"queued": "Fila",
|
"queued": "Fila",
|
||||||
"movies": "Filmes"
|
"movies": "Filmes",
|
||||||
|
"missing": "Missing"
|
||||||
},
|
},
|
||||||
"readarr": {
|
"readarr": {
|
||||||
"wanted": "Desejados",
|
"wanted": "Desejados",
|
||||||
@ -184,5 +186,103 @@
|
|||||||
"loginsLast24H": "Logins (24h)",
|
"loginsLast24H": "Logins (24h)",
|
||||||
"failedLoginsLast24H": "Failed Logins (24h)",
|
"failedLoginsLast24H": "Failed Logins (24h)",
|
||||||
"users": "Users"
|
"users": "Users"
|
||||||
|
},
|
||||||
|
"proxmox": {
|
||||||
|
"mem": "MEM",
|
||||||
|
"cpu": "CPU",
|
||||||
|
"lxc": "LXC",
|
||||||
|
"vms": "VMs"
|
||||||
|
},
|
||||||
|
"unifi": {
|
||||||
|
"users": "Users",
|
||||||
|
"uptime": "System Uptime",
|
||||||
|
"days": "Days",
|
||||||
|
"wan": "WAN",
|
||||||
|
"lan_users": "LAN Users",
|
||||||
|
"wlan_users": "WLAN Users",
|
||||||
|
"up": "UP",
|
||||||
|
"down": "DOWN",
|
||||||
|
"wait": "Please wait",
|
||||||
|
"lan": "LAN",
|
||||||
|
"wlan": "WLAN",
|
||||||
|
"devices": "Devices",
|
||||||
|
"lan_devices": "LAN Devices",
|
||||||
|
"wlan_devices": "WLAN Devices"
|
||||||
|
},
|
||||||
|
"plex": {
|
||||||
|
"streams": "Active Streams",
|
||||||
|
"movies": "Movies",
|
||||||
|
"tv": "TV Shows"
|
||||||
|
},
|
||||||
|
"glances": {
|
||||||
|
"cpu": "CPU",
|
||||||
|
"mem": "MEM",
|
||||||
|
"wait": "Please wait"
|
||||||
|
},
|
||||||
|
"changedetectionio": {
|
||||||
|
"totalObserved": "Total Observed",
|
||||||
|
"diffsDetected": "Diffs Detected"
|
||||||
|
},
|
||||||
|
"wmo": {
|
||||||
|
"0-day": "Sunny",
|
||||||
|
"0-night": "Clear",
|
||||||
|
"1-day": "Mainly Sunny",
|
||||||
|
"1-night": "Mainly Clear",
|
||||||
|
"2-day": "Partly Cloudy",
|
||||||
|
"2-night": "Partly Cloudy",
|
||||||
|
"3-day": "Cloudy",
|
||||||
|
"3-night": "Cloudy",
|
||||||
|
"99-night": "Thunderstorm With Hail",
|
||||||
|
"45-day": "Foggy",
|
||||||
|
"45-night": "Foggy",
|
||||||
|
"48-day": "Foggy",
|
||||||
|
"48-night": "Foggy",
|
||||||
|
"51-day": "Light Drizzle",
|
||||||
|
"51-night": "Light Drizzle",
|
||||||
|
"53-day": "Drizzle",
|
||||||
|
"53-night": "Drizzle",
|
||||||
|
"55-day": "Heavy Drizzle",
|
||||||
|
"55-night": "Heavy Drizzle",
|
||||||
|
"56-day": "Light Freezing Drizzle",
|
||||||
|
"56-night": "Light Freezing Drizzle",
|
||||||
|
"57-day": "Freezing Drizzle",
|
||||||
|
"57-night": "Freezing Drizzle",
|
||||||
|
"66-day": "Freezing Rain",
|
||||||
|
"61-day": "Light Rain",
|
||||||
|
"61-night": "Light Rain",
|
||||||
|
"63-day": "Rain",
|
||||||
|
"63-night": "Rain",
|
||||||
|
"65-day": "Heavy Rain",
|
||||||
|
"66-night": "Freezing Rain",
|
||||||
|
"65-night": "Heavy Rain",
|
||||||
|
"67-day": "Freezing Rain",
|
||||||
|
"67-night": "Freezing Rain",
|
||||||
|
"71-day": "Light Snow",
|
||||||
|
"71-night": "Light Snow",
|
||||||
|
"73-day": "Snow",
|
||||||
|
"73-night": "Snow",
|
||||||
|
"75-day": "Heavy Snow",
|
||||||
|
"75-night": "Heavy Snow",
|
||||||
|
"77-day": "Snow Grains",
|
||||||
|
"77-night": "Snow Grains",
|
||||||
|
"80-day": "Light Showers",
|
||||||
|
"80-night": "Light Showers",
|
||||||
|
"81-day": "Showers",
|
||||||
|
"81-night": "Showers",
|
||||||
|
"82-day": "Heavy Showers",
|
||||||
|
"82-night": "Heavy Showers",
|
||||||
|
"85-day": "Snow Showers",
|
||||||
|
"85-night": "Snow Showers",
|
||||||
|
"86-day": "Snow Showers",
|
||||||
|
"86-night": "Snow Showers",
|
||||||
|
"95-day": "Thunderstorm",
|
||||||
|
"95-night": "Thunderstorm",
|
||||||
|
"96-day": "Thunderstorm With Hail",
|
||||||
|
"96-night": "Thunderstorm With Hail",
|
||||||
|
"99-day": "Thunderstorm With Hail"
|
||||||
|
},
|
||||||
|
"quicklaunch": {
|
||||||
|
"bookmark": "Bookmark",
|
||||||
|
"service": "Service"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -3,7 +3,8 @@
|
|||||||
"used": "Utilizați",
|
"used": "Utilizați",
|
||||||
"load": "Sarcină",
|
"load": "Sarcină",
|
||||||
"total": "Total",
|
"total": "Total",
|
||||||
"free": "Disponibili"
|
"free": "Disponibili",
|
||||||
|
"cpu": "Procesor"
|
||||||
},
|
},
|
||||||
"docker": {
|
"docker": {
|
||||||
"rx": "RX",
|
"rx": "RX",
|
||||||
@ -111,7 +112,8 @@
|
|||||||
"radarr": {
|
"radarr": {
|
||||||
"queued": "În coadă",
|
"queued": "În coadă",
|
||||||
"wanted": "Dorite",
|
"wanted": "Dorite",
|
||||||
"movies": "Filme"
|
"movies": "Filme",
|
||||||
|
"missing": "Missing"
|
||||||
},
|
},
|
||||||
"lidarr": {
|
"lidarr": {
|
||||||
"wanted": "Dorite",
|
"wanted": "Dorite",
|
||||||
@ -170,8 +172,106 @@
|
|||||||
"domain_count": "Domenii"
|
"domain_count": "Domenii"
|
||||||
},
|
},
|
||||||
"authentik": {
|
"authentik": {
|
||||||
"users": "Users",
|
"users": "Utilizatori",
|
||||||
"loginsLast24H": "Logins (24h)",
|
"loginsLast24H": "Autentificări (24h)",
|
||||||
"failedLoginsLast24H": "Failed Logins (24h)"
|
"failedLoginsLast24H": "Conectări eșuate (24h)"
|
||||||
|
},
|
||||||
|
"proxmox": {
|
||||||
|
"vms": "Masini Virtuale",
|
||||||
|
"mem": "Memorie",
|
||||||
|
"cpu": "Procesor",
|
||||||
|
"lxc": "Container"
|
||||||
|
},
|
||||||
|
"unifi": {
|
||||||
|
"users": "Utilizatori",
|
||||||
|
"uptime": "Timp de funcționare a sistemului",
|
||||||
|
"days": "Zile",
|
||||||
|
"wan": "WAN",
|
||||||
|
"lan_users": "Utilizatori LAN",
|
||||||
|
"wlan_users": "Utilizatori WLAN",
|
||||||
|
"up": "Pornit",
|
||||||
|
"down": "Oprit",
|
||||||
|
"wait": "Va rugam asteptati",
|
||||||
|
"lan": "LAN",
|
||||||
|
"wlan": "WLAN",
|
||||||
|
"devices": "Devices",
|
||||||
|
"lan_devices": "LAN Devices",
|
||||||
|
"wlan_devices": "WLAN Devices"
|
||||||
|
},
|
||||||
|
"plex": {
|
||||||
|
"streams": "Fluxuri active",
|
||||||
|
"movies": "Filme",
|
||||||
|
"tv": "Seriale"
|
||||||
|
},
|
||||||
|
"glances": {
|
||||||
|
"cpu": "Procesor",
|
||||||
|
"mem": "Memorie",
|
||||||
|
"wait": "Te rugam sa astepti"
|
||||||
|
},
|
||||||
|
"changedetectionio": {
|
||||||
|
"totalObserved": "Total Observed",
|
||||||
|
"diffsDetected": "Diffs Detected"
|
||||||
|
},
|
||||||
|
"wmo": {
|
||||||
|
"55-day": "Heavy Drizzle",
|
||||||
|
"55-night": "Heavy Drizzle",
|
||||||
|
"77-night": "Snow Grains",
|
||||||
|
"80-day": "Light Showers",
|
||||||
|
"99-night": "Thunderstorm With Hail",
|
||||||
|
"0-day": "Sunny",
|
||||||
|
"0-night": "Clear",
|
||||||
|
"1-day": "Mainly Sunny",
|
||||||
|
"1-night": "Mainly Clear",
|
||||||
|
"2-day": "Partly Cloudy",
|
||||||
|
"2-night": "Partly Cloudy",
|
||||||
|
"3-day": "Cloudy",
|
||||||
|
"3-night": "Cloudy",
|
||||||
|
"45-day": "Foggy",
|
||||||
|
"45-night": "Foggy",
|
||||||
|
"48-day": "Foggy",
|
||||||
|
"48-night": "Foggy",
|
||||||
|
"51-day": "Light Drizzle",
|
||||||
|
"51-night": "Light Drizzle",
|
||||||
|
"53-day": "Drizzle",
|
||||||
|
"53-night": "Drizzle",
|
||||||
|
"56-day": "Light Freezing Drizzle",
|
||||||
|
"56-night": "Light Freezing Drizzle",
|
||||||
|
"57-day": "Freezing Drizzle",
|
||||||
|
"57-night": "Freezing Drizzle",
|
||||||
|
"63-day": "Rain",
|
||||||
|
"63-night": "Rain",
|
||||||
|
"61-day": "Light Rain",
|
||||||
|
"61-night": "Light Rain",
|
||||||
|
"65-day": "Heavy Rain",
|
||||||
|
"65-night": "Heavy Rain",
|
||||||
|
"66-day": "Freezing Rain",
|
||||||
|
"66-night": "Freezing Rain",
|
||||||
|
"67-day": "Freezing Rain",
|
||||||
|
"67-night": "Freezing Rain",
|
||||||
|
"71-day": "Light Snow",
|
||||||
|
"71-night": "Light Snow",
|
||||||
|
"73-day": "Snow",
|
||||||
|
"73-night": "Snow",
|
||||||
|
"75-day": "Heavy Snow",
|
||||||
|
"75-night": "Heavy Snow",
|
||||||
|
"77-day": "Snow Grains",
|
||||||
|
"80-night": "Light Showers",
|
||||||
|
"81-day": "Showers",
|
||||||
|
"81-night": "Showers",
|
||||||
|
"82-day": "Heavy Showers",
|
||||||
|
"82-night": "Heavy Showers",
|
||||||
|
"85-day": "Snow Showers",
|
||||||
|
"85-night": "Snow Showers",
|
||||||
|
"86-day": "Snow Showers",
|
||||||
|
"86-night": "Snow Showers",
|
||||||
|
"95-day": "Thunderstorm",
|
||||||
|
"95-night": "Thunderstorm",
|
||||||
|
"96-day": "Thunderstorm With Hail",
|
||||||
|
"96-night": "Thunderstorm With Hail",
|
||||||
|
"99-day": "Thunderstorm With Hail"
|
||||||
|
},
|
||||||
|
"quicklaunch": {
|
||||||
|
"bookmark": "Bookmark",
|
||||||
|
"service": "Service"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -11,7 +11,8 @@
|
|||||||
"total": "Всего",
|
"total": "Всего",
|
||||||
"free": "Свободно",
|
"free": "Свободно",
|
||||||
"used": "Использовано",
|
"used": "Использовано",
|
||||||
"load": "Load"
|
"load": "Load",
|
||||||
|
"cpu": "CPU"
|
||||||
},
|
},
|
||||||
"docker": {
|
"docker": {
|
||||||
"rx": "Rx",
|
"rx": "Rx",
|
||||||
@ -45,7 +46,8 @@
|
|||||||
"radarr": {
|
"radarr": {
|
||||||
"wanted": "Хотел",
|
"wanted": "Хотел",
|
||||||
"queued": "В очереди",
|
"queued": "В очереди",
|
||||||
"movies": "Фильмы"
|
"movies": "Фильмы",
|
||||||
|
"missing": "Missing"
|
||||||
},
|
},
|
||||||
"readarr": {
|
"readarr": {
|
||||||
"wanted": "Wanted",
|
"wanted": "Wanted",
|
||||||
@ -173,5 +175,103 @@
|
|||||||
"users": "Users",
|
"users": "Users",
|
||||||
"loginsLast24H": "Logins (24h)",
|
"loginsLast24H": "Logins (24h)",
|
||||||
"failedLoginsLast24H": "Failed Logins (24h)"
|
"failedLoginsLast24H": "Failed Logins (24h)"
|
||||||
|
},
|
||||||
|
"proxmox": {
|
||||||
|
"mem": "MEM",
|
||||||
|
"cpu": "CPU",
|
||||||
|
"lxc": "LXC",
|
||||||
|
"vms": "VMs"
|
||||||
|
},
|
||||||
|
"unifi": {
|
||||||
|
"users": "Users",
|
||||||
|
"uptime": "System Uptime",
|
||||||
|
"days": "Days",
|
||||||
|
"wan": "WAN",
|
||||||
|
"lan_users": "LAN Users",
|
||||||
|
"wlan_users": "WLAN Users",
|
||||||
|
"up": "UP",
|
||||||
|
"down": "DOWN",
|
||||||
|
"wait": "Please wait",
|
||||||
|
"lan": "LAN",
|
||||||
|
"wlan": "WLAN",
|
||||||
|
"devices": "Devices",
|
||||||
|
"lan_devices": "LAN Devices",
|
||||||
|
"wlan_devices": "WLAN Devices"
|
||||||
|
},
|
||||||
|
"plex": {
|
||||||
|
"streams": "Active Streams",
|
||||||
|
"movies": "Movies",
|
||||||
|
"tv": "TV Shows"
|
||||||
|
},
|
||||||
|
"glances": {
|
||||||
|
"cpu": "CPU",
|
||||||
|
"mem": "MEM",
|
||||||
|
"wait": "Please wait"
|
||||||
|
},
|
||||||
|
"changedetectionio": {
|
||||||
|
"totalObserved": "Total Observed",
|
||||||
|
"diffsDetected": "Diffs Detected"
|
||||||
|
},
|
||||||
|
"wmo": {
|
||||||
|
"0-day": "Sunny",
|
||||||
|
"0-night": "Clear",
|
||||||
|
"71-night": "Light Snow",
|
||||||
|
"73-day": "Snow",
|
||||||
|
"73-night": "Snow",
|
||||||
|
"75-day": "Heavy Snow",
|
||||||
|
"75-night": "Heavy Snow",
|
||||||
|
"77-day": "Snow Grains",
|
||||||
|
"77-night": "Snow Grains",
|
||||||
|
"80-day": "Light Showers",
|
||||||
|
"80-night": "Light Showers",
|
||||||
|
"81-day": "Showers",
|
||||||
|
"1-day": "Mainly Sunny",
|
||||||
|
"1-night": "Mainly Clear",
|
||||||
|
"2-day": "Partly Cloudy",
|
||||||
|
"2-night": "Partly Cloudy",
|
||||||
|
"3-day": "Cloudy",
|
||||||
|
"3-night": "Cloudy",
|
||||||
|
"45-day": "Foggy",
|
||||||
|
"45-night": "Foggy",
|
||||||
|
"48-day": "Foggy",
|
||||||
|
"48-night": "Foggy",
|
||||||
|
"51-day": "Light Drizzle",
|
||||||
|
"51-night": "Light Drizzle",
|
||||||
|
"53-day": "Drizzle",
|
||||||
|
"53-night": "Drizzle",
|
||||||
|
"55-day": "Heavy Drizzle",
|
||||||
|
"55-night": "Heavy Drizzle",
|
||||||
|
"56-day": "Light Freezing Drizzle",
|
||||||
|
"56-night": "Light Freezing Drizzle",
|
||||||
|
"57-day": "Freezing Drizzle",
|
||||||
|
"57-night": "Freezing Drizzle",
|
||||||
|
"61-day": "Light Rain",
|
||||||
|
"61-night": "Light Rain",
|
||||||
|
"63-day": "Rain",
|
||||||
|
"63-night": "Rain",
|
||||||
|
"65-day": "Heavy Rain",
|
||||||
|
"65-night": "Heavy Rain",
|
||||||
|
"66-day": "Freezing Rain",
|
||||||
|
"66-night": "Freezing Rain",
|
||||||
|
"67-day": "Freezing Rain",
|
||||||
|
"67-night": "Freezing Rain",
|
||||||
|
"71-day": "Light Snow",
|
||||||
|
"81-night": "Showers",
|
||||||
|
"82-day": "Heavy Showers",
|
||||||
|
"82-night": "Heavy Showers",
|
||||||
|
"85-day": "Snow Showers",
|
||||||
|
"85-night": "Snow Showers",
|
||||||
|
"86-day": "Snow Showers",
|
||||||
|
"86-night": "Snow Showers",
|
||||||
|
"95-day": "Thunderstorm",
|
||||||
|
"95-night": "Thunderstorm",
|
||||||
|
"96-day": "Thunderstorm With Hail",
|
||||||
|
"96-night": "Thunderstorm With Hail",
|
||||||
|
"99-day": "Thunderstorm With Hail",
|
||||||
|
"99-night": "Thunderstorm With Hail"
|
||||||
|
},
|
||||||
|
"quicklaunch": {
|
||||||
|
"bookmark": "Bookmark",
|
||||||
|
"service": "Service"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
277
public/locales/sr/common.json
Normal file
@ -0,0 +1,277 @@
|
|||||||
|
{
|
||||||
|
"widget": {
|
||||||
|
"missing_type": "Missing Widget Type: {{type}}",
|
||||||
|
"api_error": "API Error",
|
||||||
|
"status": "Status"
|
||||||
|
},
|
||||||
|
"weather": {
|
||||||
|
"current": "Current Location",
|
||||||
|
"allow": "Click to allow",
|
||||||
|
"updating": "Updating",
|
||||||
|
"wait": "Please wait"
|
||||||
|
},
|
||||||
|
"search": {
|
||||||
|
"placeholder": "Search…"
|
||||||
|
},
|
||||||
|
"resources": {
|
||||||
|
"cpu": "CPU",
|
||||||
|
"total": "Total",
|
||||||
|
"free": "Free",
|
||||||
|
"used": "Used",
|
||||||
|
"load": "Load"
|
||||||
|
},
|
||||||
|
"unifi": {
|
||||||
|
"users": "Users",
|
||||||
|
"uptime": "System Uptime",
|
||||||
|
"days": "Days",
|
||||||
|
"wan": "WAN",
|
||||||
|
"lan": "LAN",
|
||||||
|
"wlan": "WLAN",
|
||||||
|
"devices": "Devices",
|
||||||
|
"lan_devices": "LAN Devices",
|
||||||
|
"wlan_devices": "WLAN Devices",
|
||||||
|
"lan_users": "LAN Users",
|
||||||
|
"wlan_users": "WLAN Users",
|
||||||
|
"up": "UP",
|
||||||
|
"down": "DOWN",
|
||||||
|
"wait": "Please wait"
|
||||||
|
},
|
||||||
|
"docker": {
|
||||||
|
"rx": "RX",
|
||||||
|
"tx": "TX",
|
||||||
|
"mem": "MEM",
|
||||||
|
"cpu": "CPU",
|
||||||
|
"offline": "Offline"
|
||||||
|
},
|
||||||
|
"emby": {
|
||||||
|
"playing": "Playing",
|
||||||
|
"transcoding": "Transcoding",
|
||||||
|
"bitrate": "Bitrate",
|
||||||
|
"no_active": "No Active Streams"
|
||||||
|
},
|
||||||
|
"tautulli": {
|
||||||
|
"playing": "Playing",
|
||||||
|
"transcoding": "Transcoding",
|
||||||
|
"bitrate": "Bitrate",
|
||||||
|
"no_active": "No Active Streams"
|
||||||
|
},
|
||||||
|
"nzbget": {
|
||||||
|
"rate": "Rate",
|
||||||
|
"remaining": "Remaining",
|
||||||
|
"downloaded": "Downloaded"
|
||||||
|
},
|
||||||
|
"plex": {
|
||||||
|
"streams": "Active Streams",
|
||||||
|
"movies": "Movies",
|
||||||
|
"tv": "TV Shows"
|
||||||
|
},
|
||||||
|
"sabnzbd": {
|
||||||
|
"rate": "Rate",
|
||||||
|
"queue": "Queue",
|
||||||
|
"timeleft": "Time Left"
|
||||||
|
},
|
||||||
|
"rutorrent": {
|
||||||
|
"active": "Active",
|
||||||
|
"upload": "Upload",
|
||||||
|
"download": "Download"
|
||||||
|
},
|
||||||
|
"transmission": {
|
||||||
|
"download": "Download",
|
||||||
|
"upload": "Upload",
|
||||||
|
"leech": "Leech",
|
||||||
|
"seed": "Seed"
|
||||||
|
},
|
||||||
|
"qbittorrent": {
|
||||||
|
"download": "Download",
|
||||||
|
"upload": "Upload",
|
||||||
|
"leech": "Leech",
|
||||||
|
"seed": "Seed"
|
||||||
|
},
|
||||||
|
"sonarr": {
|
||||||
|
"wanted": "Wanted",
|
||||||
|
"queued": "Queued",
|
||||||
|
"series": "Series"
|
||||||
|
},
|
||||||
|
"radarr": {
|
||||||
|
"wanted": "Wanted",
|
||||||
|
"queued": "Queued",
|
||||||
|
"movies": "Movies",
|
||||||
|
"missing": "Missing"
|
||||||
|
},
|
||||||
|
"lidarr": {
|
||||||
|
"wanted": "Wanted",
|
||||||
|
"queued": "Queued",
|
||||||
|
"albums": "Albums"
|
||||||
|
},
|
||||||
|
"readarr": {
|
||||||
|
"wanted": "Wanted",
|
||||||
|
"queued": "Queued",
|
||||||
|
"books": "Books"
|
||||||
|
},
|
||||||
|
"bazarr": {
|
||||||
|
"missingEpisodes": "Missing Episodes",
|
||||||
|
"missingMovies": "Missing Movies"
|
||||||
|
},
|
||||||
|
"ombi": {
|
||||||
|
"pending": "Pending",
|
||||||
|
"approved": "Approved",
|
||||||
|
"available": "Available"
|
||||||
|
},
|
||||||
|
"jellyseerr": {
|
||||||
|
"pending": "Pending",
|
||||||
|
"approved": "Approved",
|
||||||
|
"available": "Available"
|
||||||
|
},
|
||||||
|
"overseerr": {
|
||||||
|
"pending": "Pending",
|
||||||
|
"approved": "Approved",
|
||||||
|
"available": "Available"
|
||||||
|
},
|
||||||
|
"pihole": {
|
||||||
|
"queries": "Queries",
|
||||||
|
"blocked": "Blocked",
|
||||||
|
"gravity": "Gravity"
|
||||||
|
},
|
||||||
|
"adguard": {
|
||||||
|
"queries": "Queries",
|
||||||
|
"blocked": "Blocked",
|
||||||
|
"filtered": "Filtered",
|
||||||
|
"latency": "Latency"
|
||||||
|
},
|
||||||
|
"speedtest": {
|
||||||
|
"upload": "Upload",
|
||||||
|
"download": "Download",
|
||||||
|
"ping": "Ping"
|
||||||
|
},
|
||||||
|
"portainer": {
|
||||||
|
"running": "Running",
|
||||||
|
"stopped": "Stopped",
|
||||||
|
"total": "Total"
|
||||||
|
},
|
||||||
|
"traefik": {
|
||||||
|
"routers": "Routers",
|
||||||
|
"services": "Services",
|
||||||
|
"middleware": "Middleware"
|
||||||
|
},
|
||||||
|
"npm": {
|
||||||
|
"enabled": "Enabled",
|
||||||
|
"disabled": "Disabled",
|
||||||
|
"total": "Total"
|
||||||
|
},
|
||||||
|
"coinmarketcap": {
|
||||||
|
"configure": "Configure one or more crypto currencies to track",
|
||||||
|
"1hour": "1 Hour",
|
||||||
|
"1day": "1 Day",
|
||||||
|
"7days": "7 Days",
|
||||||
|
"30days": "30 Days"
|
||||||
|
},
|
||||||
|
"gotify": {
|
||||||
|
"apps": "Applications",
|
||||||
|
"clients": "Clients",
|
||||||
|
"messages": "Messages"
|
||||||
|
},
|
||||||
|
"prowlarr": {
|
||||||
|
"enableIndexers": "Indexers",
|
||||||
|
"numberOfGrabs": "Grabs",
|
||||||
|
"numberOfQueries": "Queries",
|
||||||
|
"numberOfFailGrabs": "Fail Grabs",
|
||||||
|
"numberOfFailQueries": "Fail Queries"
|
||||||
|
},
|
||||||
|
"jackett": {
|
||||||
|
"configured": "Configured",
|
||||||
|
"errored": "Errored"
|
||||||
|
},
|
||||||
|
"strelaysrv": {
|
||||||
|
"numActiveSessions": "Sessions",
|
||||||
|
"numConnections": "Connections",
|
||||||
|
"dataRelayed": "Relayed",
|
||||||
|
"transferRate": "Rate"
|
||||||
|
},
|
||||||
|
"mastodon": {
|
||||||
|
"user_count": "Users",
|
||||||
|
"status_count": "Posts",
|
||||||
|
"domain_count": "Domains"
|
||||||
|
},
|
||||||
|
"authentik": {
|
||||||
|
"users": "Users",
|
||||||
|
"loginsLast24H": "Logins (24h)",
|
||||||
|
"failedLoginsLast24H": "Failed Logins (24h)"
|
||||||
|
},
|
||||||
|
"proxmox": {
|
||||||
|
"mem": "MEM",
|
||||||
|
"cpu": "CPU",
|
||||||
|
"lxc": "LXC",
|
||||||
|
"vms": "VMs"
|
||||||
|
},
|
||||||
|
"glances": {
|
||||||
|
"cpu": "CPU",
|
||||||
|
"mem": "MEM",
|
||||||
|
"wait": "Please wait"
|
||||||
|
},
|
||||||
|
"changedetectionio": {
|
||||||
|
"totalObserved": "Total Observed",
|
||||||
|
"diffsDetected": "Diffs Detected"
|
||||||
|
},
|
||||||
|
"wmo": {
|
||||||
|
"48-night": "Foggy",
|
||||||
|
"51-day": "Light Drizzle",
|
||||||
|
"51-night": "Light Drizzle",
|
||||||
|
"53-day": "Drizzle",
|
||||||
|
"99-night": "Thunderstorm With Hail",
|
||||||
|
"0-day": "Sunny",
|
||||||
|
"0-night": "Clear",
|
||||||
|
"1-day": "Mainly Sunny",
|
||||||
|
"1-night": "Mainly Clear",
|
||||||
|
"2-day": "Partly Cloudy",
|
||||||
|
"2-night": "Partly Cloudy",
|
||||||
|
"3-day": "Cloudy",
|
||||||
|
"3-night": "Cloudy",
|
||||||
|
"45-day": "Foggy",
|
||||||
|
"45-night": "Foggy",
|
||||||
|
"48-day": "Foggy",
|
||||||
|
"53-night": "Drizzle",
|
||||||
|
"55-day": "Heavy Drizzle",
|
||||||
|
"55-night": "Heavy Drizzle",
|
||||||
|
"56-day": "Light Freezing Drizzle",
|
||||||
|
"56-night": "Light Freezing Drizzle",
|
||||||
|
"57-day": "Freezing Drizzle",
|
||||||
|
"57-night": "Freezing Drizzle",
|
||||||
|
"61-day": "Light Rain",
|
||||||
|
"61-night": "Light Rain",
|
||||||
|
"63-day": "Rain",
|
||||||
|
"63-night": "Rain",
|
||||||
|
"65-day": "Heavy Rain",
|
||||||
|
"65-night": "Heavy Rain",
|
||||||
|
"66-day": "Freezing Rain",
|
||||||
|
"66-night": "Freezing Rain",
|
||||||
|
"67-day": "Freezing Rain",
|
||||||
|
"67-night": "Freezing Rain",
|
||||||
|
"71-day": "Light Snow",
|
||||||
|
"71-night": "Light Snow",
|
||||||
|
"73-day": "Snow",
|
||||||
|
"73-night": "Snow",
|
||||||
|
"75-day": "Heavy Snow",
|
||||||
|
"75-night": "Heavy Snow",
|
||||||
|
"77-day": "Snow Grains",
|
||||||
|
"77-night": "Snow Grains",
|
||||||
|
"80-day": "Light Showers",
|
||||||
|
"80-night": "Light Showers",
|
||||||
|
"81-day": "Showers",
|
||||||
|
"81-night": "Showers",
|
||||||
|
"82-day": "Heavy Showers",
|
||||||
|
"82-night": "Heavy Showers",
|
||||||
|
"85-day": "Snow Showers",
|
||||||
|
"85-night": "Snow Showers",
|
||||||
|
"86-day": "Snow Showers",
|
||||||
|
"86-night": "Snow Showers",
|
||||||
|
"95-day": "Thunderstorm",
|
||||||
|
"95-night": "Thunderstorm",
|
||||||
|
"96-day": "Thunderstorm With Hail",
|
||||||
|
"96-night": "Thunderstorm With Hail",
|
||||||
|
"99-day": "Thunderstorm With Hail"
|
||||||
|
},
|
||||||
|
"quicklaunch": {
|
||||||
|
"bookmark": "Bookmark",
|
||||||
|
"service": "Service"
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -14,7 +14,8 @@
|
|||||||
"load": "Laddar",
|
"load": "Laddar",
|
||||||
"total": "Total",
|
"total": "Total",
|
||||||
"free": "Ledigt",
|
"free": "Ledigt",
|
||||||
"used": "Använt"
|
"used": "Använt",
|
||||||
|
"cpu": "CPU"
|
||||||
},
|
},
|
||||||
"docker": {
|
"docker": {
|
||||||
"rx": "RX",
|
"rx": "RX",
|
||||||
@ -67,7 +68,8 @@
|
|||||||
"radarr": {
|
"radarr": {
|
||||||
"wanted": "Eftersöker",
|
"wanted": "Eftersöker",
|
||||||
"queued": "I kö",
|
"queued": "I kö",
|
||||||
"movies": "Filmer"
|
"movies": "Filmer",
|
||||||
|
"missing": "Missing"
|
||||||
},
|
},
|
||||||
"lidarr": {
|
"lidarr": {
|
||||||
"wanted": "Eftersöker",
|
"wanted": "Eftersöker",
|
||||||
@ -170,8 +172,106 @@
|
|||||||
"transferRate": "Rate"
|
"transferRate": "Rate"
|
||||||
},
|
},
|
||||||
"authentik": {
|
"authentik": {
|
||||||
"users": "Users",
|
"users": "Användare",
|
||||||
"loginsLast24H": "Logins (24h)",
|
"loginsLast24H": "Inloggningar (24h)",
|
||||||
"failedLoginsLast24H": "Failed Logins (24h)"
|
"failedLoginsLast24H": "Misslyckade inloggningar (24h)"
|
||||||
|
},
|
||||||
|
"proxmox": {
|
||||||
|
"mem": "MEM",
|
||||||
|
"cpu": "CPU",
|
||||||
|
"lxc": "LXC",
|
||||||
|
"vms": "VMs"
|
||||||
|
},
|
||||||
|
"unifi": {
|
||||||
|
"users": "Användare",
|
||||||
|
"uptime": "Upptid",
|
||||||
|
"days": "Dagar",
|
||||||
|
"wan": "WAN",
|
||||||
|
"lan_users": "LAN-användare",
|
||||||
|
"wlan_users": "WLAN-användare",
|
||||||
|
"up": "SKICKAT",
|
||||||
|
"down": "MOTTAGIT",
|
||||||
|
"wait": "Vänligen vänta",
|
||||||
|
"lan": "LAN",
|
||||||
|
"wlan": "WLAN",
|
||||||
|
"devices": "Devices",
|
||||||
|
"lan_devices": "LAN Devices",
|
||||||
|
"wlan_devices": "WLAN Devices"
|
||||||
|
},
|
||||||
|
"plex": {
|
||||||
|
"streams": "Aktiva strömmar",
|
||||||
|
"movies": "Filmer",
|
||||||
|
"tv": "TV-serier"
|
||||||
|
},
|
||||||
|
"glances": {
|
||||||
|
"cpu": "CPU",
|
||||||
|
"mem": "MEM",
|
||||||
|
"wait": "Vänligen vänta"
|
||||||
|
},
|
||||||
|
"changedetectionio": {
|
||||||
|
"totalObserved": "Total Observed",
|
||||||
|
"diffsDetected": "Diffs Detected"
|
||||||
|
},
|
||||||
|
"wmo": {
|
||||||
|
"1-day": "Mainly Sunny",
|
||||||
|
"1-night": "Mainly Clear",
|
||||||
|
"2-day": "Partly Cloudy",
|
||||||
|
"2-night": "Partly Cloudy",
|
||||||
|
"0-day": "Sunny",
|
||||||
|
"0-night": "Clear",
|
||||||
|
"3-day": "Cloudy",
|
||||||
|
"3-night": "Cloudy",
|
||||||
|
"45-day": "Foggy",
|
||||||
|
"45-night": "Foggy",
|
||||||
|
"48-day": "Foggy",
|
||||||
|
"48-night": "Foggy",
|
||||||
|
"51-day": "Light Drizzle",
|
||||||
|
"51-night": "Light Drizzle",
|
||||||
|
"53-day": "Drizzle",
|
||||||
|
"53-night": "Drizzle",
|
||||||
|
"55-day": "Heavy Drizzle",
|
||||||
|
"55-night": "Heavy Drizzle",
|
||||||
|
"56-day": "Light Freezing Drizzle",
|
||||||
|
"56-night": "Light Freezing Drizzle",
|
||||||
|
"57-day": "Freezing Drizzle",
|
||||||
|
"57-night": "Freezing Drizzle",
|
||||||
|
"61-day": "Light Rain",
|
||||||
|
"61-night": "Light Rain",
|
||||||
|
"63-day": "Rain",
|
||||||
|
"63-night": "Rain",
|
||||||
|
"65-day": "Heavy Rain",
|
||||||
|
"65-night": "Heavy Rain",
|
||||||
|
"66-day": "Freezing Rain",
|
||||||
|
"66-night": "Freezing Rain",
|
||||||
|
"67-day": "Freezing Rain",
|
||||||
|
"67-night": "Freezing Rain",
|
||||||
|
"71-day": "Light Snow",
|
||||||
|
"71-night": "Light Snow",
|
||||||
|
"73-day": "Snow",
|
||||||
|
"75-night": "Heavy Snow",
|
||||||
|
"77-day": "Snow Grains",
|
||||||
|
"73-night": "Snow",
|
||||||
|
"77-night": "Snow Grains",
|
||||||
|
"75-day": "Heavy Snow",
|
||||||
|
"80-day": "Light Showers",
|
||||||
|
"80-night": "Light Showers",
|
||||||
|
"81-day": "Showers",
|
||||||
|
"81-night": "Showers",
|
||||||
|
"82-day": "Heavy Showers",
|
||||||
|
"82-night": "Heavy Showers",
|
||||||
|
"85-day": "Snow Showers",
|
||||||
|
"85-night": "Snow Showers",
|
||||||
|
"86-day": "Snow Showers",
|
||||||
|
"86-night": "Snow Showers",
|
||||||
|
"95-day": "Thunderstorm",
|
||||||
|
"96-night": "Thunderstorm With Hail",
|
||||||
|
"99-day": "Thunderstorm With Hail",
|
||||||
|
"95-night": "Thunderstorm",
|
||||||
|
"99-night": "Thunderstorm With Hail",
|
||||||
|
"96-day": "Thunderstorm With Hail"
|
||||||
|
},
|
||||||
|
"quicklaunch": {
|
||||||
|
"bookmark": "Bookmark",
|
||||||
|
"service": "Service"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
277
public/locales/te/common.json
Normal file
@ -0,0 +1,277 @@
|
|||||||
|
{
|
||||||
|
"readarr": {
|
||||||
|
"books": "పుస్తకాలు",
|
||||||
|
"wanted": "కావలెను",
|
||||||
|
"queued": "క్యూయూఎడ్"
|
||||||
|
},
|
||||||
|
"adguard": {
|
||||||
|
"blocked": "నిరోధించబడింది",
|
||||||
|
"filtered": "ఫిల్టర్ చేయబడింది",
|
||||||
|
"latency": "జాప్యం",
|
||||||
|
"queries": "ప్రశ్నలు"
|
||||||
|
},
|
||||||
|
"strelaysrv": {
|
||||||
|
"numActiveSessions": "సెషన్స్",
|
||||||
|
"numConnections": "కనెక్షన్లు",
|
||||||
|
"dataRelayed": "రెలయెడఁ",
|
||||||
|
"transferRate": "రేటు"
|
||||||
|
},
|
||||||
|
"widget": {
|
||||||
|
"missing_type": "విడ్జెట్ లేదు: {{type}}",
|
||||||
|
"api_error": "API లోపం",
|
||||||
|
"status": "హోదా"
|
||||||
|
},
|
||||||
|
"weather": {
|
||||||
|
"current": "ప్రస్తుత స్తలం",
|
||||||
|
"allow": "అనుమతించడానికి క్లిక్ చేయండి",
|
||||||
|
"updating": "నవీకరిస్తోంది",
|
||||||
|
"wait": "దయచేసి వేచి ఉండండి"
|
||||||
|
},
|
||||||
|
"search": {
|
||||||
|
"placeholder": "వెతకండి…"
|
||||||
|
},
|
||||||
|
"resources": {
|
||||||
|
"cpu": "సీపియూ",
|
||||||
|
"total": "మొత్తం",
|
||||||
|
"free": "మిగిలింది",
|
||||||
|
"used": "ఉపయోగించబడిన",
|
||||||
|
"load": "లోడ్"
|
||||||
|
},
|
||||||
|
"docker": {
|
||||||
|
"rx": "RX",
|
||||||
|
"tx": "TX",
|
||||||
|
"mem": "MEM",
|
||||||
|
"cpu": "సీపియూ",
|
||||||
|
"offline": "ఆఫ్లైన్"
|
||||||
|
},
|
||||||
|
"emby": {
|
||||||
|
"playing": "ఆడుతున్నారు",
|
||||||
|
"transcoding": "ట్రాన్స్కోడింగ్",
|
||||||
|
"bitrate": "బిట్రేట్",
|
||||||
|
"no_active": "యాక్టివ్ స్ట్రీమ్లు లేవు"
|
||||||
|
},
|
||||||
|
"tautulli": {
|
||||||
|
"playing": "ఆడుతున్నారు",
|
||||||
|
"transcoding": "ట్రాన్స్కోడింగ్",
|
||||||
|
"bitrate": "బిట్రేట్",
|
||||||
|
"no_active": "యాక్టివ్ స్ట్రీమ్లు లేవు"
|
||||||
|
},
|
||||||
|
"nzbget": {
|
||||||
|
"rate": "రేట్",
|
||||||
|
"remaining": "మిగిలింది",
|
||||||
|
"downloaded": "డౌన్లోడ్ చేయబడింది"
|
||||||
|
},
|
||||||
|
"sabnzbd": {
|
||||||
|
"rate": "రేట్",
|
||||||
|
"queue": "వరుస",
|
||||||
|
"timeleft": "మిగిలి వున్న సమయం"
|
||||||
|
},
|
||||||
|
"rutorrent": {
|
||||||
|
"active": "చురుకుగా",
|
||||||
|
"upload": "అప్లోడ్",
|
||||||
|
"download": "డౌన్లోడ్"
|
||||||
|
},
|
||||||
|
"transmission": {
|
||||||
|
"download": "డౌన్లోడ్",
|
||||||
|
"upload": "అప్లోడ్",
|
||||||
|
"leech": "జలగ",
|
||||||
|
"seed": "సీడ్"
|
||||||
|
},
|
||||||
|
"qbittorrent": {
|
||||||
|
"download": "డౌన్లోడ్",
|
||||||
|
"upload": "అప్లోడ్",
|
||||||
|
"leech": "లీచ్",
|
||||||
|
"seed": "సీడ్"
|
||||||
|
},
|
||||||
|
"sonarr": {
|
||||||
|
"wanted": "కావలెను",
|
||||||
|
"queued": "క్యూయూఎడ్",
|
||||||
|
"series": "సిరీస్"
|
||||||
|
},
|
||||||
|
"radarr": {
|
||||||
|
"wanted": "కావలెను",
|
||||||
|
"queued": "క్యూయూఎడ్",
|
||||||
|
"movies": "సినిమాలు",
|
||||||
|
"missing": "మిస్సింగ్"
|
||||||
|
},
|
||||||
|
"lidarr": {
|
||||||
|
"wanted": "కావలెను",
|
||||||
|
"queued": "క్యూయూఎడ్",
|
||||||
|
"albums": "ఆల్బములు"
|
||||||
|
},
|
||||||
|
"bazarr": {
|
||||||
|
"missingEpisodes": "ఎపిసోడ్లు లేవు",
|
||||||
|
"missingMovies": "సినిమాలు లేవు"
|
||||||
|
},
|
||||||
|
"ombi": {
|
||||||
|
"pending": "పెండింగ్",
|
||||||
|
"approved": "ఆమోదించబడింది",
|
||||||
|
"available": "అందుబాటులో వున్నవి"
|
||||||
|
},
|
||||||
|
"jellyseerr": {
|
||||||
|
"pending": "పెండింగ్",
|
||||||
|
"approved": "ఆమోదించబడింది",
|
||||||
|
"available": "అందుబాటులో"
|
||||||
|
},
|
||||||
|
"overseerr": {
|
||||||
|
"pending": "పెండింగ్",
|
||||||
|
"approved": "ఆమోదించబడింది",
|
||||||
|
"available": "అందుబాటులో"
|
||||||
|
},
|
||||||
|
"pihole": {
|
||||||
|
"queries": "ప్రశ్నలు",
|
||||||
|
"blocked": "నిరోధించబడింది",
|
||||||
|
"gravity": "గురుత్వాకర్షణ"
|
||||||
|
},
|
||||||
|
"speedtest": {
|
||||||
|
"upload": "అప్లోడ్",
|
||||||
|
"download": "డౌన్లోడ్",
|
||||||
|
"ping": "పింగ్"
|
||||||
|
},
|
||||||
|
"portainer": {
|
||||||
|
"running": "నడుస్తున్నవి",
|
||||||
|
"stopped": "ఆగిపోయినవి",
|
||||||
|
"total": "మొత్తం"
|
||||||
|
},
|
||||||
|
"traefik": {
|
||||||
|
"routers": "రౌటర్లు",
|
||||||
|
"services": "సేవలు",
|
||||||
|
"middleware": "మిడిల్వేర్"
|
||||||
|
},
|
||||||
|
"npm": {
|
||||||
|
"enabled": "ప్రారంభించబడింది",
|
||||||
|
"disabled": "డిసేబ్లెడ్",
|
||||||
|
"total": "మొత్తం"
|
||||||
|
},
|
||||||
|
"coinmarketcap": {
|
||||||
|
"configure": "ట్రాక్ చేయడానికి ఒకటి లేదా అంతకంటే ఎక్కువ క్రిప్టో కరెన్సీలను కాన్ఫిగర్ చేయండి",
|
||||||
|
"1hour": "1 గంట",
|
||||||
|
"1day": "1 రోజు",
|
||||||
|
"7days": "7 రోజులు",
|
||||||
|
"30days": "30 రోజులు"
|
||||||
|
},
|
||||||
|
"gotify": {
|
||||||
|
"apps": "అప్లికేషన్లు",
|
||||||
|
"clients": "ఖాతాదారులు",
|
||||||
|
"messages": "సందేశాలు"
|
||||||
|
},
|
||||||
|
"prowlarr": {
|
||||||
|
"enableIndexers": "సూచికలు",
|
||||||
|
"numberOfGrabs": "గ్రాబ్స్",
|
||||||
|
"numberOfQueries": "ప్రశ్నలు",
|
||||||
|
"numberOfFailGrabs": "ఫెయిల్ గ్రాబ్స్",
|
||||||
|
"numberOfFailQueries": "విఫలమైన ప్రశ్నలు"
|
||||||
|
},
|
||||||
|
"jackett": {
|
||||||
|
"configured": "కాన్ఫిగర్ చేయబడింది",
|
||||||
|
"errored": "పొరపాటు జరిగింది"
|
||||||
|
},
|
||||||
|
"mastodon": {
|
||||||
|
"user_count": "వినియోగదారులు",
|
||||||
|
"status_count": "పోస్ట్లు",
|
||||||
|
"domain_count": "డొమైన్లు"
|
||||||
|
},
|
||||||
|
"authentik": {
|
||||||
|
"users": "వినియోగదారులు",
|
||||||
|
"loginsLast24H": "లాగిన్లు (24గం)",
|
||||||
|
"failedLoginsLast24H": "విఫలమైన లాగిన్లు (24గం)"
|
||||||
|
},
|
||||||
|
"proxmox": {
|
||||||
|
"mem": "MEM",
|
||||||
|
"cpu": "సీపియూ",
|
||||||
|
"lxc": "LXC",
|
||||||
|
"vms": "విఎంలు"
|
||||||
|
},
|
||||||
|
"unifi": {
|
||||||
|
"users": "వినియోగదారులు",
|
||||||
|
"uptime": "సిస్టమ్ సమయము",
|
||||||
|
"days": "రోజులు",
|
||||||
|
"wan": "WAN",
|
||||||
|
"lan_users": "LAN వినియోగదారులు",
|
||||||
|
"wlan_users": "WLAN వినియోగదారులు",
|
||||||
|
"up": "అప్",
|
||||||
|
"down": "డౌన్",
|
||||||
|
"wait": "దయచేసి వేచి ఉండండి",
|
||||||
|
"lan": "లాన్",
|
||||||
|
"wlan": "WLAN",
|
||||||
|
"devices": "పరికరాలు",
|
||||||
|
"lan_devices": "LAN పరికరాలు",
|
||||||
|
"wlan_devices": "WLAN పరికరాలు"
|
||||||
|
},
|
||||||
|
"plex": {
|
||||||
|
"streams": "యాక్టివ్ స్ట్రీమ్లు",
|
||||||
|
"movies": "సినిమాలు",
|
||||||
|
"tv": "దూరదర్శిని కార్యక్రమాలు"
|
||||||
|
},
|
||||||
|
"glances": {
|
||||||
|
"cpu": "సీపియూ",
|
||||||
|
"mem": "MEM",
|
||||||
|
"wait": "దయచేసి వేచి ఉండండి"
|
||||||
|
},
|
||||||
|
"changedetectionio": {
|
||||||
|
"totalObserved": "Total Observed",
|
||||||
|
"diffsDetected": "Diffs Detected"
|
||||||
|
},
|
||||||
|
"wmo": {
|
||||||
|
"0-day": "Sunny",
|
||||||
|
"0-night": "Clear",
|
||||||
|
"57-night": "Freezing Drizzle",
|
||||||
|
"73-day": "Snow",
|
||||||
|
"73-night": "Snow",
|
||||||
|
"75-day": "Heavy Snow",
|
||||||
|
"75-night": "Heavy Snow",
|
||||||
|
"77-day": "Snow Grains",
|
||||||
|
"77-night": "Snow Grains",
|
||||||
|
"80-day": "Light Showers",
|
||||||
|
"80-night": "Light Showers",
|
||||||
|
"81-day": "Showers",
|
||||||
|
"81-night": "Showers",
|
||||||
|
"82-day": "Heavy Showers",
|
||||||
|
"82-night": "Heavy Showers",
|
||||||
|
"85-day": "Snow Showers",
|
||||||
|
"85-night": "Snow Showers",
|
||||||
|
"1-day": "Mainly Sunny",
|
||||||
|
"1-night": "Mainly Clear",
|
||||||
|
"2-day": "Partly Cloudy",
|
||||||
|
"2-night": "Partly Cloudy",
|
||||||
|
"3-day": "Cloudy",
|
||||||
|
"3-night": "Cloudy",
|
||||||
|
"45-day": "Foggy",
|
||||||
|
"45-night": "Foggy",
|
||||||
|
"48-day": "Foggy",
|
||||||
|
"48-night": "Foggy",
|
||||||
|
"51-day": "Light Drizzle",
|
||||||
|
"51-night": "Light Drizzle",
|
||||||
|
"53-day": "Drizzle",
|
||||||
|
"53-night": "Drizzle",
|
||||||
|
"55-day": "Heavy Drizzle",
|
||||||
|
"55-night": "Heavy Drizzle",
|
||||||
|
"56-day": "Light Freezing Drizzle",
|
||||||
|
"56-night": "Light Freezing Drizzle",
|
||||||
|
"57-day": "Freezing Drizzle",
|
||||||
|
"61-day": "Light Rain",
|
||||||
|
"61-night": "Light Rain",
|
||||||
|
"63-day": "Rain",
|
||||||
|
"63-night": "Rain",
|
||||||
|
"65-day": "Heavy Rain",
|
||||||
|
"65-night": "Heavy Rain",
|
||||||
|
"66-day": "Freezing Rain",
|
||||||
|
"66-night": "Freezing Rain",
|
||||||
|
"67-day": "Freezing Rain",
|
||||||
|
"67-night": "Freezing Rain",
|
||||||
|
"71-day": "Light Snow",
|
||||||
|
"71-night": "Light Snow",
|
||||||
|
"86-day": "Snow Showers",
|
||||||
|
"86-night": "Snow Showers",
|
||||||
|
"95-day": "Thunderstorm",
|
||||||
|
"95-night": "Thunderstorm",
|
||||||
|
"96-day": "Thunderstorm With Hail",
|
||||||
|
"96-night": "Thunderstorm With Hail",
|
||||||
|
"99-day": "Thunderstorm With Hail",
|
||||||
|
"99-night": "Thunderstorm With Hail"
|
||||||
|
},
|
||||||
|
"quicklaunch": {
|
||||||
|
"bookmark": "Bookmark",
|
||||||
|
"service": "Service"
|
||||||
|
}
|
||||||
|
}
|
||||||
277
public/locales/tr/common.json
Normal file
@ -0,0 +1,277 @@
|
|||||||
|
{
|
||||||
|
"widget": {
|
||||||
|
"missing_type": "Kayıp Araç Türü: {{type}}",
|
||||||
|
"api_error": "API Hatası",
|
||||||
|
"status": "Durum"
|
||||||
|
},
|
||||||
|
"weather": {
|
||||||
|
"current": "Mevcut Konum",
|
||||||
|
"allow": "İzin vermek için tıklayın",
|
||||||
|
"updating": "Güncelleniyor",
|
||||||
|
"wait": "Lütfen bekleyin"
|
||||||
|
},
|
||||||
|
"search": {
|
||||||
|
"placeholder": "Ara…"
|
||||||
|
},
|
||||||
|
"resources": {
|
||||||
|
"cpu": "İşlemci",
|
||||||
|
"total": "Toplam",
|
||||||
|
"free": "Boşta",
|
||||||
|
"used": "Kullanımda",
|
||||||
|
"load": "Yük"
|
||||||
|
},
|
||||||
|
"unifi": {
|
||||||
|
"users": "Kullanıcılar",
|
||||||
|
"uptime": "Çalışma Süresi",
|
||||||
|
"days": "Günler",
|
||||||
|
"wan": "WAN",
|
||||||
|
"lan_users": "LAN Kullanıcıları",
|
||||||
|
"wlan_users": "WLAN Kullanıcıları",
|
||||||
|
"up": "Yukarı",
|
||||||
|
"down": "Aşağı",
|
||||||
|
"wait": "Lütfen bekleyin",
|
||||||
|
"lan": "LAN",
|
||||||
|
"wlan": "WLAN",
|
||||||
|
"devices": "Aygıtlar",
|
||||||
|
"lan_devices": "LAN Aygıtları",
|
||||||
|
"wlan_devices": "WLAN Aygıtları"
|
||||||
|
},
|
||||||
|
"docker": {
|
||||||
|
"rx": "Gelen Veri",
|
||||||
|
"tx": "Giden Veri",
|
||||||
|
"mem": "Bellek",
|
||||||
|
"cpu": "İşlemci",
|
||||||
|
"offline": "Çevrimdışı"
|
||||||
|
},
|
||||||
|
"emby": {
|
||||||
|
"playing": "Oynatılıyor",
|
||||||
|
"transcoding": "Dönüştürülüyor",
|
||||||
|
"bitrate": "Bit Oranı",
|
||||||
|
"no_active": "Aktif akış yok"
|
||||||
|
},
|
||||||
|
"tautulli": {
|
||||||
|
"playing": "Oynatılıyor",
|
||||||
|
"transcoding": "Dönüştürülüyor",
|
||||||
|
"bitrate": "Bit Oranı",
|
||||||
|
"no_active": "Aktif akış yok"
|
||||||
|
},
|
||||||
|
"nzbget": {
|
||||||
|
"rate": "Oran",
|
||||||
|
"remaining": "Kalan",
|
||||||
|
"downloaded": "İndirilen"
|
||||||
|
},
|
||||||
|
"plex": {
|
||||||
|
"streams": "Aktif Akış",
|
||||||
|
"movies": "Filmler",
|
||||||
|
"tv": "TV Showları"
|
||||||
|
},
|
||||||
|
"sabnzbd": {
|
||||||
|
"rate": "Oran",
|
||||||
|
"queue": "Kuyruk",
|
||||||
|
"timeleft": "Kalan Zaman"
|
||||||
|
},
|
||||||
|
"rutorrent": {
|
||||||
|
"active": "Aktif",
|
||||||
|
"upload": "Yükleme",
|
||||||
|
"download": "İndirme"
|
||||||
|
},
|
||||||
|
"transmission": {
|
||||||
|
"download": "İndirme",
|
||||||
|
"upload": "Yükleme",
|
||||||
|
"leech": "İsteyen",
|
||||||
|
"seed": "Sunan"
|
||||||
|
},
|
||||||
|
"qbittorrent": {
|
||||||
|
"download": "İndirme",
|
||||||
|
"upload": "Yükleme",
|
||||||
|
"leech": "İsteyen",
|
||||||
|
"seed": "Sunan"
|
||||||
|
},
|
||||||
|
"sonarr": {
|
||||||
|
"wanted": "Aranan",
|
||||||
|
"queued": "Kuyrukta",
|
||||||
|
"series": "Seriler"
|
||||||
|
},
|
||||||
|
"radarr": {
|
||||||
|
"wanted": "Aranan",
|
||||||
|
"queued": "Kuyrukta",
|
||||||
|
"movies": "Filmler",
|
||||||
|
"missing": "Kayıp"
|
||||||
|
},
|
||||||
|
"lidarr": {
|
||||||
|
"wanted": "Aranan",
|
||||||
|
"queued": "Kuyrukta",
|
||||||
|
"albums": "Albümler"
|
||||||
|
},
|
||||||
|
"readarr": {
|
||||||
|
"wanted": "Aranan",
|
||||||
|
"queued": "Kuyrukta",
|
||||||
|
"books": "Kitaplar"
|
||||||
|
},
|
||||||
|
"bazarr": {
|
||||||
|
"missingEpisodes": "Kayıp Bölümler",
|
||||||
|
"missingMovies": "Kayıp Filmler"
|
||||||
|
},
|
||||||
|
"ombi": {
|
||||||
|
"pending": "Bekliyor",
|
||||||
|
"approved": "Onaylı",
|
||||||
|
"available": "Kullanılabilir"
|
||||||
|
},
|
||||||
|
"jellyseerr": {
|
||||||
|
"pending": "Bekliyor",
|
||||||
|
"approved": "Onaylı",
|
||||||
|
"available": "Kullanılabilir"
|
||||||
|
},
|
||||||
|
"overseerr": {
|
||||||
|
"pending": "Bekliyor",
|
||||||
|
"approved": "Onaylı",
|
||||||
|
"available": "Kullanılabilir"
|
||||||
|
},
|
||||||
|
"pihole": {
|
||||||
|
"queries": "Sorgular",
|
||||||
|
"blocked": "Engellenen",
|
||||||
|
"gravity": "Yer Çekimi"
|
||||||
|
},
|
||||||
|
"adguard": {
|
||||||
|
"queries": "Sorgular",
|
||||||
|
"blocked": "Engellenen",
|
||||||
|
"filtered": "Filtrelenen",
|
||||||
|
"latency": "Gecikme"
|
||||||
|
},
|
||||||
|
"speedtest": {
|
||||||
|
"upload": "Yükleme",
|
||||||
|
"download": "İndirme",
|
||||||
|
"ping": "Ping"
|
||||||
|
},
|
||||||
|
"portainer": {
|
||||||
|
"running": "Çalışıyor",
|
||||||
|
"stopped": "Durduruldu",
|
||||||
|
"total": "Toplam"
|
||||||
|
},
|
||||||
|
"traefik": {
|
||||||
|
"routers": "Yönlendiriciler",
|
||||||
|
"services": "Hizmetler",
|
||||||
|
"middleware": "Ara Katman"
|
||||||
|
},
|
||||||
|
"npm": {
|
||||||
|
"enabled": "Etkin",
|
||||||
|
"disabled": "Devre Dışı",
|
||||||
|
"total": "Toplam"
|
||||||
|
},
|
||||||
|
"coinmarketcap": {
|
||||||
|
"configure": "İzleme için bir veya daha fazla kripto para birimi yapılandırın",
|
||||||
|
"1hour": "1 Saat",
|
||||||
|
"1day": "1 Gün",
|
||||||
|
"7days": "7 Gün",
|
||||||
|
"30days": "30 Gün"
|
||||||
|
},
|
||||||
|
"gotify": {
|
||||||
|
"apps": "Uygulamalar",
|
||||||
|
"clients": "Alıcılar",
|
||||||
|
"messages": "İletiler"
|
||||||
|
},
|
||||||
|
"prowlarr": {
|
||||||
|
"enableIndexers": "Dizin Oluşturucular",
|
||||||
|
"numberOfGrabs": "Yakalama Sayısı",
|
||||||
|
"numberOfQueries": "Sorgu Sayısı",
|
||||||
|
"numberOfFailGrabs": "Başarısız Yakalama Sayısı",
|
||||||
|
"numberOfFailQueries": "Başarısız Sorgu Sayısı"
|
||||||
|
},
|
||||||
|
"jackett": {
|
||||||
|
"configured": "Yapılandırılmış",
|
||||||
|
"errored": "Hatalı"
|
||||||
|
},
|
||||||
|
"strelaysrv": {
|
||||||
|
"numActiveSessions": "Aktif Sezonlar",
|
||||||
|
"numConnections": "Bağlantı Sayısı",
|
||||||
|
"dataRelayed": "Aktarılan",
|
||||||
|
"transferRate": "Oran"
|
||||||
|
},
|
||||||
|
"mastodon": {
|
||||||
|
"user_count": "Kullanıcılar",
|
||||||
|
"status_count": "Gönderiler",
|
||||||
|
"domain_count": "Etki Alanları"
|
||||||
|
},
|
||||||
|
"authentik": {
|
||||||
|
"users": "Kullanıcılar",
|
||||||
|
"loginsLast24H": "Girişler (24 Saat)",
|
||||||
|
"failedLoginsLast24H": "Başarısız Girişler (24 Saat)"
|
||||||
|
},
|
||||||
|
"proxmox": {
|
||||||
|
"mem": "Bellek",
|
||||||
|
"cpu": "İşlemci",
|
||||||
|
"lxc": "LXC",
|
||||||
|
"vms": "Sanal Makineler"
|
||||||
|
},
|
||||||
|
"glances": {
|
||||||
|
"cpu": "İşlemci",
|
||||||
|
"mem": "Bellek",
|
||||||
|
"wait": "Lütfen bekleyiniz"
|
||||||
|
},
|
||||||
|
"changedetectionio": {
|
||||||
|
"totalObserved": "Toplam Gözlenen",
|
||||||
|
"diffsDetected": "Farklar Algılandı"
|
||||||
|
},
|
||||||
|
"wmo": {
|
||||||
|
"99-day": "Thunderstorm With Hail",
|
||||||
|
"0-day": "Sunny",
|
||||||
|
"0-night": "Clear",
|
||||||
|
"1-day": "Mainly Sunny",
|
||||||
|
"1-night": "Mainly Clear",
|
||||||
|
"2-day": "Partly Cloudy",
|
||||||
|
"2-night": "Partly Cloudy",
|
||||||
|
"3-day": "Cloudy",
|
||||||
|
"3-night": "Cloudy",
|
||||||
|
"45-day": "Foggy",
|
||||||
|
"45-night": "Foggy",
|
||||||
|
"48-day": "Foggy",
|
||||||
|
"48-night": "Foggy",
|
||||||
|
"51-day": "Light Drizzle",
|
||||||
|
"51-night": "Light Drizzle",
|
||||||
|
"53-day": "Drizzle",
|
||||||
|
"53-night": "Drizzle",
|
||||||
|
"55-day": "Heavy Drizzle",
|
||||||
|
"55-night": "Heavy Drizzle",
|
||||||
|
"56-day": "Light Freezing Drizzle",
|
||||||
|
"56-night": "Light Freezing Drizzle",
|
||||||
|
"57-day": "Freezing Drizzle",
|
||||||
|
"57-night": "Freezing Drizzle",
|
||||||
|
"61-day": "Light Rain",
|
||||||
|
"61-night": "Light Rain",
|
||||||
|
"63-day": "Rain",
|
||||||
|
"63-night": "Rain",
|
||||||
|
"65-day": "Heavy Rain",
|
||||||
|
"65-night": "Heavy Rain",
|
||||||
|
"66-day": "Freezing Rain",
|
||||||
|
"66-night": "Freezing Rain",
|
||||||
|
"67-day": "Freezing Rain",
|
||||||
|
"67-night": "Freezing Rain",
|
||||||
|
"71-day": "Light Snow",
|
||||||
|
"71-night": "Light Snow",
|
||||||
|
"73-day": "Snow",
|
||||||
|
"73-night": "Snow",
|
||||||
|
"75-day": "Heavy Snow",
|
||||||
|
"75-night": "Heavy Snow",
|
||||||
|
"77-day": "Snow Grains",
|
||||||
|
"77-night": "Snow Grains",
|
||||||
|
"80-day": "Light Showers",
|
||||||
|
"80-night": "Light Showers",
|
||||||
|
"81-day": "Showers",
|
||||||
|
"81-night": "Showers",
|
||||||
|
"82-day": "Heavy Showers",
|
||||||
|
"95-night": "Thunderstorm",
|
||||||
|
"82-night": "Heavy Showers",
|
||||||
|
"85-day": "Snow Showers",
|
||||||
|
"85-night": "Snow Showers",
|
||||||
|
"86-day": "Snow Showers",
|
||||||
|
"86-night": "Snow Showers",
|
||||||
|
"95-day": "Thunderstorm",
|
||||||
|
"96-day": "Thunderstorm With Hail",
|
||||||
|
"96-night": "Thunderstorm With Hail",
|
||||||
|
"99-night": "Thunderstorm With Hail"
|
||||||
|
},
|
||||||
|
"quicklaunch": {
|
||||||
|
"bookmark": "Bookmark",
|
||||||
|
"service": "Service"
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -11,7 +11,8 @@
|
|||||||
"total": "Tổng",
|
"total": "Tổng",
|
||||||
"free": "Dư",
|
"free": "Dư",
|
||||||
"used": "Đã dùng",
|
"used": "Đã dùng",
|
||||||
"load": "Load"
|
"load": "Load",
|
||||||
|
"cpu": "CPU"
|
||||||
},
|
},
|
||||||
"docker": {
|
"docker": {
|
||||||
"rx": "RX",
|
"rx": "RX",
|
||||||
@ -45,7 +46,8 @@
|
|||||||
"radarr": {
|
"radarr": {
|
||||||
"wanted": "Wanted",
|
"wanted": "Wanted",
|
||||||
"queued": "Queued",
|
"queued": "Queued",
|
||||||
"movies": "Phim"
|
"movies": "Phim",
|
||||||
|
"missing": "Missing"
|
||||||
},
|
},
|
||||||
"readarr": {
|
"readarr": {
|
||||||
"wanted": "Đang tìm",
|
"wanted": "Đang tìm",
|
||||||
@ -173,5 +175,103 @@
|
|||||||
"users": "Users",
|
"users": "Users",
|
||||||
"loginsLast24H": "Logins (24h)",
|
"loginsLast24H": "Logins (24h)",
|
||||||
"failedLoginsLast24H": "Failed Logins (24h)"
|
"failedLoginsLast24H": "Failed Logins (24h)"
|
||||||
|
},
|
||||||
|
"proxmox": {
|
||||||
|
"mem": "MEM",
|
||||||
|
"cpu": "CPU",
|
||||||
|
"lxc": "LXC",
|
||||||
|
"vms": "VMs"
|
||||||
|
},
|
||||||
|
"unifi": {
|
||||||
|
"users": "Users",
|
||||||
|
"uptime": "System Uptime",
|
||||||
|
"days": "Days",
|
||||||
|
"wan": "WAN",
|
||||||
|
"lan_users": "LAN Users",
|
||||||
|
"wlan_users": "WLAN Users",
|
||||||
|
"up": "UP",
|
||||||
|
"down": "DOWN",
|
||||||
|
"wait": "Please wait",
|
||||||
|
"lan": "LAN",
|
||||||
|
"wlan": "WLAN",
|
||||||
|
"devices": "Devices",
|
||||||
|
"lan_devices": "LAN Devices",
|
||||||
|
"wlan_devices": "WLAN Devices"
|
||||||
|
},
|
||||||
|
"plex": {
|
||||||
|
"streams": "Active Streams",
|
||||||
|
"movies": "Movies",
|
||||||
|
"tv": "TV Shows"
|
||||||
|
},
|
||||||
|
"glances": {
|
||||||
|
"cpu": "CPU",
|
||||||
|
"mem": "MEM",
|
||||||
|
"wait": "Please wait"
|
||||||
|
},
|
||||||
|
"changedetectionio": {
|
||||||
|
"totalObserved": "Total Observed",
|
||||||
|
"diffsDetected": "Diffs Detected"
|
||||||
|
},
|
||||||
|
"wmo": {
|
||||||
|
"0-day": "Sunny",
|
||||||
|
"0-night": "Clear",
|
||||||
|
"63-day": "Rain",
|
||||||
|
"63-night": "Rain",
|
||||||
|
"80-day": "Light Showers",
|
||||||
|
"81-day": "Showers",
|
||||||
|
"95-day": "Thunderstorm",
|
||||||
|
"95-night": "Thunderstorm",
|
||||||
|
"96-day": "Thunderstorm With Hail",
|
||||||
|
"96-night": "Thunderstorm With Hail",
|
||||||
|
"99-day": "Thunderstorm With Hail",
|
||||||
|
"99-night": "Thunderstorm With Hail",
|
||||||
|
"1-day": "Mainly Sunny",
|
||||||
|
"1-night": "Mainly Clear",
|
||||||
|
"2-day": "Partly Cloudy",
|
||||||
|
"2-night": "Partly Cloudy",
|
||||||
|
"3-day": "Cloudy",
|
||||||
|
"3-night": "Cloudy",
|
||||||
|
"45-day": "Foggy",
|
||||||
|
"45-night": "Foggy",
|
||||||
|
"48-day": "Foggy",
|
||||||
|
"48-night": "Foggy",
|
||||||
|
"51-day": "Light Drizzle",
|
||||||
|
"51-night": "Light Drizzle",
|
||||||
|
"53-day": "Drizzle",
|
||||||
|
"53-night": "Drizzle",
|
||||||
|
"55-day": "Heavy Drizzle",
|
||||||
|
"55-night": "Heavy Drizzle",
|
||||||
|
"56-day": "Light Freezing Drizzle",
|
||||||
|
"56-night": "Light Freezing Drizzle",
|
||||||
|
"57-day": "Freezing Drizzle",
|
||||||
|
"57-night": "Freezing Drizzle",
|
||||||
|
"61-day": "Light Rain",
|
||||||
|
"61-night": "Light Rain",
|
||||||
|
"65-day": "Heavy Rain",
|
||||||
|
"65-night": "Heavy Rain",
|
||||||
|
"66-day": "Freezing Rain",
|
||||||
|
"66-night": "Freezing Rain",
|
||||||
|
"67-day": "Freezing Rain",
|
||||||
|
"67-night": "Freezing Rain",
|
||||||
|
"77-night": "Snow Grains",
|
||||||
|
"80-night": "Light Showers",
|
||||||
|
"71-day": "Light Snow",
|
||||||
|
"71-night": "Light Snow",
|
||||||
|
"73-day": "Snow",
|
||||||
|
"73-night": "Snow",
|
||||||
|
"75-day": "Heavy Snow",
|
||||||
|
"75-night": "Heavy Snow",
|
||||||
|
"77-day": "Snow Grains",
|
||||||
|
"81-night": "Showers",
|
||||||
|
"82-day": "Heavy Showers",
|
||||||
|
"82-night": "Heavy Showers",
|
||||||
|
"85-day": "Snow Showers",
|
||||||
|
"85-night": "Snow Showers",
|
||||||
|
"86-day": "Snow Showers",
|
||||||
|
"86-night": "Snow Showers"
|
||||||
|
},
|
||||||
|
"quicklaunch": {
|
||||||
|
"bookmark": "Bookmark",
|
||||||
|
"service": "Service"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -35,7 +35,8 @@
|
|||||||
"total": "全部",
|
"total": "全部",
|
||||||
"free": "剩餘",
|
"free": "剩餘",
|
||||||
"used": "用咗",
|
"used": "用咗",
|
||||||
"load": "負荷"
|
"load": "負荷",
|
||||||
|
"cpu": "CPU"
|
||||||
},
|
},
|
||||||
"docker": {
|
"docker": {
|
||||||
"rx": "接收",
|
"rx": "接收",
|
||||||
@ -73,7 +74,8 @@
|
|||||||
"radarr": {
|
"radarr": {
|
||||||
"wanted": "想睇",
|
"wanted": "想睇",
|
||||||
"queued": "排緊隊",
|
"queued": "排緊隊",
|
||||||
"movies": "電影"
|
"movies": "電影",
|
||||||
|
"missing": "Missing"
|
||||||
},
|
},
|
||||||
"lidarr": {
|
"lidarr": {
|
||||||
"wanted": "想睇",
|
"wanted": "想睇",
|
||||||
@ -170,8 +172,106 @@
|
|||||||
"domain_count": "域"
|
"domain_count": "域"
|
||||||
},
|
},
|
||||||
"authentik": {
|
"authentik": {
|
||||||
|
"users": "用戶",
|
||||||
|
"loginsLast24H": "登錄( 24小时)",
|
||||||
|
"failedLoginsLast24H": "登錄失敗( 24鐘頭)"
|
||||||
|
},
|
||||||
|
"proxmox": {
|
||||||
|
"mem": "MEM",
|
||||||
|
"cpu": "CPU",
|
||||||
|
"lxc": "LXC",
|
||||||
|
"vms": "VMs"
|
||||||
|
},
|
||||||
|
"unifi": {
|
||||||
"users": "Users",
|
"users": "Users",
|
||||||
"loginsLast24H": "Logins (24h)",
|
"uptime": "System Uptime",
|
||||||
"failedLoginsLast24H": "Failed Logins (24h)"
|
"days": "Days",
|
||||||
|
"wan": "WAN",
|
||||||
|
"lan_users": "LAN Users",
|
||||||
|
"wlan_users": "WLAN Users",
|
||||||
|
"up": "UP",
|
||||||
|
"down": "DOWN",
|
||||||
|
"wait": "Please wait",
|
||||||
|
"lan": "LAN",
|
||||||
|
"wlan": "WLAN",
|
||||||
|
"devices": "Devices",
|
||||||
|
"lan_devices": "LAN Devices",
|
||||||
|
"wlan_devices": "WLAN Devices"
|
||||||
|
},
|
||||||
|
"plex": {
|
||||||
|
"streams": "Active Streams",
|
||||||
|
"movies": "Movies",
|
||||||
|
"tv": "TV Shows"
|
||||||
|
},
|
||||||
|
"glances": {
|
||||||
|
"cpu": "CPU",
|
||||||
|
"mem": "MEM",
|
||||||
|
"wait": "Please wait"
|
||||||
|
},
|
||||||
|
"changedetectionio": {
|
||||||
|
"totalObserved": "Total Observed",
|
||||||
|
"diffsDetected": "Diffs Detected"
|
||||||
|
},
|
||||||
|
"wmo": {
|
||||||
|
"55-day": "Heavy Drizzle",
|
||||||
|
"55-night": "Heavy Drizzle",
|
||||||
|
"56-day": "Light Freezing Drizzle",
|
||||||
|
"63-day": "Rain",
|
||||||
|
"65-night": "Heavy Rain",
|
||||||
|
"66-day": "Freezing Rain",
|
||||||
|
"75-day": "Heavy Snow",
|
||||||
|
"75-night": "Heavy Snow",
|
||||||
|
"77-day": "Snow Grains",
|
||||||
|
"77-night": "Snow Grains",
|
||||||
|
"81-night": "Showers",
|
||||||
|
"82-day": "Heavy Showers",
|
||||||
|
"82-night": "Heavy Showers",
|
||||||
|
"99-day": "Thunderstorm With Hail",
|
||||||
|
"99-night": "Thunderstorm With Hail",
|
||||||
|
"0-day": "Sunny",
|
||||||
|
"0-night": "Clear",
|
||||||
|
"1-day": "Mainly Sunny",
|
||||||
|
"1-night": "Mainly Clear",
|
||||||
|
"2-day": "Partly Cloudy",
|
||||||
|
"2-night": "Partly Cloudy",
|
||||||
|
"3-day": "Cloudy",
|
||||||
|
"3-night": "Cloudy",
|
||||||
|
"45-day": "Foggy",
|
||||||
|
"45-night": "Foggy",
|
||||||
|
"48-day": "Foggy",
|
||||||
|
"51-day": "Light Drizzle",
|
||||||
|
"48-night": "Foggy",
|
||||||
|
"51-night": "Light Drizzle",
|
||||||
|
"53-day": "Drizzle",
|
||||||
|
"53-night": "Drizzle",
|
||||||
|
"56-night": "Light Freezing Drizzle",
|
||||||
|
"57-day": "Freezing Drizzle",
|
||||||
|
"57-night": "Freezing Drizzle",
|
||||||
|
"61-day": "Light Rain",
|
||||||
|
"61-night": "Light Rain",
|
||||||
|
"63-night": "Rain",
|
||||||
|
"65-day": "Heavy Rain",
|
||||||
|
"66-night": "Freezing Rain",
|
||||||
|
"67-day": "Freezing Rain",
|
||||||
|
"67-night": "Freezing Rain",
|
||||||
|
"80-night": "Light Showers",
|
||||||
|
"71-day": "Light Snow",
|
||||||
|
"71-night": "Light Snow",
|
||||||
|
"73-day": "Snow",
|
||||||
|
"73-night": "Snow",
|
||||||
|
"80-day": "Light Showers",
|
||||||
|
"81-day": "Showers",
|
||||||
|
"85-day": "Snow Showers",
|
||||||
|
"85-night": "Snow Showers",
|
||||||
|
"86-day": "Snow Showers",
|
||||||
|
"86-night": "Snow Showers",
|
||||||
|
"95-day": "Thunderstorm",
|
||||||
|
"95-night": "Thunderstorm",
|
||||||
|
"96-day": "Thunderstorm With Hail",
|
||||||
|
"96-night": "Thunderstorm With Hail"
|
||||||
|
},
|
||||||
|
"quicklaunch": {
|
||||||
|
"bookmark": "Bookmark",
|
||||||
|
"service": "Service"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -11,7 +11,8 @@
|
|||||||
"total": "共",
|
"total": "共",
|
||||||
"free": "空闲",
|
"free": "空闲",
|
||||||
"used": "已用",
|
"used": "已用",
|
||||||
"load": "负载"
|
"load": "负载",
|
||||||
|
"cpu": "CPU"
|
||||||
},
|
},
|
||||||
"docker": {
|
"docker": {
|
||||||
"rx": "接收",
|
"rx": "接收",
|
||||||
@ -45,7 +46,8 @@
|
|||||||
"radarr": {
|
"radarr": {
|
||||||
"wanted": "想看",
|
"wanted": "想看",
|
||||||
"queued": "队列",
|
"queued": "队列",
|
||||||
"movies": "电影"
|
"movies": "电影",
|
||||||
|
"missing": "Missing"
|
||||||
},
|
},
|
||||||
"readarr": {
|
"readarr": {
|
||||||
"wanted": "订阅",
|
"wanted": "订阅",
|
||||||
@ -91,7 +93,7 @@
|
|||||||
"current": "当前定位",
|
"current": "当前定位",
|
||||||
"allow": "点击并允许",
|
"allow": "点击并允许",
|
||||||
"updating": "更新中",
|
"updating": "更新中",
|
||||||
"wait": "请稍后"
|
"wait": "请稍候"
|
||||||
},
|
},
|
||||||
"overseerr": {
|
"overseerr": {
|
||||||
"pending": "待办",
|
"pending": "待办",
|
||||||
@ -160,18 +162,116 @@
|
|||||||
},
|
},
|
||||||
"mastodon": {
|
"mastodon": {
|
||||||
"user_count": "用户",
|
"user_count": "用户",
|
||||||
"status_count": "Posts",
|
"status_count": "帖子",
|
||||||
"domain_count": "Domains"
|
"domain_count": "域"
|
||||||
},
|
},
|
||||||
"strelaysrv": {
|
"strelaysrv": {
|
||||||
"numActiveSessions": "Sessions",
|
"numActiveSessions": "会话",
|
||||||
"dataRelayed": "Relayed",
|
"dataRelayed": "中继",
|
||||||
"numConnections": "Connections",
|
"numConnections": "连接",
|
||||||
"transferRate": "Rate"
|
"transferRate": "速度"
|
||||||
},
|
},
|
||||||
"authentik": {
|
"authentik": {
|
||||||
"users": "Users",
|
"users": "用户",
|
||||||
"loginsLast24H": "Logins (24h)",
|
"loginsLast24H": "登录 (24h)",
|
||||||
"failedLoginsLast24H": "Failed Logins (24h)"
|
"failedLoginsLast24H": "登录失败 (24h)"
|
||||||
|
},
|
||||||
|
"proxmox": {
|
||||||
|
"mem": "内存",
|
||||||
|
"cpu": "处理器",
|
||||||
|
"lxc": "LXC",
|
||||||
|
"vms": "VMs"
|
||||||
|
},
|
||||||
|
"unifi": {
|
||||||
|
"users": "用户",
|
||||||
|
"uptime": "系统运行时间",
|
||||||
|
"days": "天",
|
||||||
|
"wan": "广域网",
|
||||||
|
"lan_users": "局域网用户",
|
||||||
|
"wlan_users": "无线局域网用户",
|
||||||
|
"up": "向上",
|
||||||
|
"down": "向下",
|
||||||
|
"wait": "请稍候",
|
||||||
|
"lan": "LAN",
|
||||||
|
"wlan": "WLAN",
|
||||||
|
"devices": "Devices",
|
||||||
|
"lan_devices": "LAN Devices",
|
||||||
|
"wlan_devices": "WLAN Devices"
|
||||||
|
},
|
||||||
|
"plex": {
|
||||||
|
"streams": "活动流",
|
||||||
|
"movies": "电影",
|
||||||
|
"tv": "电视节目"
|
||||||
|
},
|
||||||
|
"glances": {
|
||||||
|
"cpu": "处理器",
|
||||||
|
"mem": "内存",
|
||||||
|
"wait": "请稍等"
|
||||||
|
},
|
||||||
|
"changedetectionio": {
|
||||||
|
"totalObserved": "Total Observed",
|
||||||
|
"diffsDetected": "Diffs Detected"
|
||||||
|
},
|
||||||
|
"wmo": {
|
||||||
|
"0-day": "Sunny",
|
||||||
|
"0-night": "Clear",
|
||||||
|
"1-day": "Mainly Sunny",
|
||||||
|
"3-day": "Cloudy",
|
||||||
|
"3-night": "Cloudy",
|
||||||
|
"45-day": "Foggy",
|
||||||
|
"48-day": "Foggy",
|
||||||
|
"51-day": "Light Drizzle",
|
||||||
|
"73-night": "Snow",
|
||||||
|
"75-day": "Heavy Snow",
|
||||||
|
"1-night": "Mainly Clear",
|
||||||
|
"2-day": "Partly Cloudy",
|
||||||
|
"2-night": "Partly Cloudy",
|
||||||
|
"45-night": "Foggy",
|
||||||
|
"48-night": "Foggy",
|
||||||
|
"51-night": "Light Drizzle",
|
||||||
|
"53-day": "Drizzle",
|
||||||
|
"53-night": "Drizzle",
|
||||||
|
"55-day": "Heavy Drizzle",
|
||||||
|
"55-night": "Heavy Drizzle",
|
||||||
|
"56-day": "Light Freezing Drizzle",
|
||||||
|
"56-night": "Light Freezing Drizzle",
|
||||||
|
"57-day": "Freezing Drizzle",
|
||||||
|
"57-night": "Freezing Drizzle",
|
||||||
|
"61-day": "Light Rain",
|
||||||
|
"61-night": "Light Rain",
|
||||||
|
"63-day": "Rain",
|
||||||
|
"63-night": "Rain",
|
||||||
|
"65-day": "Heavy Rain",
|
||||||
|
"65-night": "Heavy Rain",
|
||||||
|
"66-day": "Freezing Rain",
|
||||||
|
"66-night": "Freezing Rain",
|
||||||
|
"67-day": "Freezing Rain",
|
||||||
|
"67-night": "Freezing Rain",
|
||||||
|
"71-day": "Light Snow",
|
||||||
|
"71-night": "Light Snow",
|
||||||
|
"73-day": "Snow",
|
||||||
|
"75-night": "Heavy Snow",
|
||||||
|
"77-day": "Snow Grains",
|
||||||
|
"77-night": "Snow Grains",
|
||||||
|
"80-day": "Light Showers",
|
||||||
|
"80-night": "Light Showers",
|
||||||
|
"81-day": "Showers",
|
||||||
|
"81-night": "Showers",
|
||||||
|
"82-day": "Heavy Showers",
|
||||||
|
"82-night": "Heavy Showers",
|
||||||
|
"85-day": "Snow Showers",
|
||||||
|
"85-night": "Snow Showers",
|
||||||
|
"86-day": "Snow Showers",
|
||||||
|
"86-night": "Snow Showers",
|
||||||
|
"95-day": "Thunderstorm",
|
||||||
|
"95-night": "Thunderstorm",
|
||||||
|
"96-day": "Thunderstorm With Hail",
|
||||||
|
"96-night": "Thunderstorm With Hail",
|
||||||
|
"99-day": "Thunderstorm With Hail",
|
||||||
|
"99-night": "Thunderstorm With Hail"
|
||||||
|
},
|
||||||
|
"quicklaunch": {
|
||||||
|
"bookmark": "Bookmark",
|
||||||
|
"service": "Service"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -41,7 +41,8 @@
|
|||||||
"total": "Total",
|
"total": "Total",
|
||||||
"free": "Free",
|
"free": "Free",
|
||||||
"used": "Used",
|
"used": "Used",
|
||||||
"load": "Load"
|
"load": "Load",
|
||||||
|
"cpu": "CPU"
|
||||||
},
|
},
|
||||||
"nzbget": {
|
"nzbget": {
|
||||||
"rate": "Rate",
|
"rate": "Rate",
|
||||||
@ -61,7 +62,8 @@
|
|||||||
"radarr": {
|
"radarr": {
|
||||||
"movies": "Movies",
|
"movies": "Movies",
|
||||||
"wanted": "Wanted",
|
"wanted": "Wanted",
|
||||||
"queued": "Queued"
|
"queued": "Queued",
|
||||||
|
"missing": "Missing"
|
||||||
},
|
},
|
||||||
"sonarr": {
|
"sonarr": {
|
||||||
"wanted": "Wanted",
|
"wanted": "Wanted",
|
||||||
@ -173,5 +175,103 @@
|
|||||||
"users": "Users",
|
"users": "Users",
|
||||||
"loginsLast24H": "Logins (24h)",
|
"loginsLast24H": "Logins (24h)",
|
||||||
"failedLoginsLast24H": "Failed Logins (24h)"
|
"failedLoginsLast24H": "Failed Logins (24h)"
|
||||||
|
},
|
||||||
|
"proxmox": {
|
||||||
|
"mem": "MEM",
|
||||||
|
"cpu": "CPU",
|
||||||
|
"lxc": "LXC",
|
||||||
|
"vms": "VMs"
|
||||||
|
},
|
||||||
|
"unifi": {
|
||||||
|
"users": "Users",
|
||||||
|
"uptime": "System Uptime",
|
||||||
|
"days": "Days",
|
||||||
|
"wan": "WAN",
|
||||||
|
"lan_users": "LAN Users",
|
||||||
|
"wlan_users": "WLAN Users",
|
||||||
|
"up": "UP",
|
||||||
|
"down": "DOWN",
|
||||||
|
"wait": "Please wait",
|
||||||
|
"lan": "LAN",
|
||||||
|
"wlan": "WLAN",
|
||||||
|
"devices": "Devices",
|
||||||
|
"lan_devices": "LAN Devices",
|
||||||
|
"wlan_devices": "WLAN Devices"
|
||||||
|
},
|
||||||
|
"plex": {
|
||||||
|
"streams": "Active Streams",
|
||||||
|
"movies": "Movies",
|
||||||
|
"tv": "TV Shows"
|
||||||
|
},
|
||||||
|
"glances": {
|
||||||
|
"cpu": "CPU",
|
||||||
|
"mem": "MEM",
|
||||||
|
"wait": "Please wait"
|
||||||
|
},
|
||||||
|
"changedetectionio": {
|
||||||
|
"totalObserved": "Total Observed",
|
||||||
|
"diffsDetected": "Diffs Detected"
|
||||||
|
},
|
||||||
|
"wmo": {
|
||||||
|
"0-day": "Sunny",
|
||||||
|
"0-night": "Clear",
|
||||||
|
"71-day": "Light Snow",
|
||||||
|
"71-night": "Light Snow",
|
||||||
|
"1-day": "Mainly Sunny",
|
||||||
|
"1-night": "Mainly Clear",
|
||||||
|
"2-day": "Partly Cloudy",
|
||||||
|
"2-night": "Partly Cloudy",
|
||||||
|
"3-day": "Cloudy",
|
||||||
|
"3-night": "Cloudy",
|
||||||
|
"45-day": "Foggy",
|
||||||
|
"45-night": "Foggy",
|
||||||
|
"48-day": "Foggy",
|
||||||
|
"48-night": "Foggy",
|
||||||
|
"51-day": "Light Drizzle",
|
||||||
|
"51-night": "Light Drizzle",
|
||||||
|
"53-day": "Drizzle",
|
||||||
|
"53-night": "Drizzle",
|
||||||
|
"55-day": "Heavy Drizzle",
|
||||||
|
"55-night": "Heavy Drizzle",
|
||||||
|
"56-day": "Light Freezing Drizzle",
|
||||||
|
"56-night": "Light Freezing Drizzle",
|
||||||
|
"57-day": "Freezing Drizzle",
|
||||||
|
"57-night": "Freezing Drizzle",
|
||||||
|
"61-day": "Light Rain",
|
||||||
|
"61-night": "Light Rain",
|
||||||
|
"63-day": "Rain",
|
||||||
|
"63-night": "Rain",
|
||||||
|
"65-day": "Heavy Rain",
|
||||||
|
"65-night": "Heavy Rain",
|
||||||
|
"66-day": "Freezing Rain",
|
||||||
|
"66-night": "Freezing Rain",
|
||||||
|
"67-day": "Freezing Rain",
|
||||||
|
"67-night": "Freezing Rain",
|
||||||
|
"73-day": "Snow",
|
||||||
|
"73-night": "Snow",
|
||||||
|
"75-day": "Heavy Snow",
|
||||||
|
"75-night": "Heavy Snow",
|
||||||
|
"77-day": "Snow Grains",
|
||||||
|
"77-night": "Snow Grains",
|
||||||
|
"80-day": "Light Showers",
|
||||||
|
"80-night": "Light Showers",
|
||||||
|
"81-day": "Showers",
|
||||||
|
"81-night": "Showers",
|
||||||
|
"82-day": "Heavy Showers",
|
||||||
|
"82-night": "Heavy Showers",
|
||||||
|
"85-day": "Snow Showers",
|
||||||
|
"85-night": "Snow Showers",
|
||||||
|
"86-day": "Snow Showers",
|
||||||
|
"86-night": "Snow Showers",
|
||||||
|
"95-day": "Thunderstorm",
|
||||||
|
"95-night": "Thunderstorm",
|
||||||
|
"96-day": "Thunderstorm With Hail",
|
||||||
|
"96-night": "Thunderstorm With Hail",
|
||||||
|
"99-day": "Thunderstorm With Hail",
|
||||||
|
"99-night": "Thunderstorm With Hail"
|
||||||
|
},
|
||||||
|
"quicklaunch": {
|
||||||
|
"bookmark": "Bookmark",
|
||||||
|
"service": "Service"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
BIN
public/mstile-144x144.png
Normal file
|
After Width: | Height: | Size: 1.2 KiB |
BIN
public/mstile-150x150.png
Normal file
|
After Width: | Height: | Size: 1.2 KiB |
BIN
public/mstile-310x150.png
Normal file
|
After Width: | Height: | Size: 1.3 KiB |
BIN
public/mstile-310x310.png
Normal file
|
After Width: | Height: | Size: 2.7 KiB |
BIN
public/mstile-70x70.png
Normal file
|
After Width: | Height: | Size: 958 B |
23
public/safari-pinned-tab.svg
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
<?xml version="1.0" standalone="no"?>
|
||||||
|
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 20010904//EN"
|
||||||
|
"http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd">
|
||||||
|
<svg version="1.0" xmlns="http://www.w3.org/2000/svg"
|
||||||
|
width="700.000000pt" height="700.000000pt" viewBox="0 0 700.000000 700.000000"
|
||||||
|
preserveAspectRatio="xMidYMid meet">
|
||||||
|
<metadata>
|
||||||
|
Created by potrace 1.14, written by Peter Selinger 2001-2017
|
||||||
|
</metadata>
|
||||||
|
<g transform="translate(0.000000,700.000000) scale(0.100000,-0.100000)"
|
||||||
|
fill="#000000" stroke="none">
|
||||||
|
<path d="M1682 5688 c-141 -24 -253 -147 -287 -316 -5 -24 -10 -3658 -5 -4029
|
||||||
|
0 -33 0 -33 168 108 92 77 178 151 192 162 14 12 75 64 136 114 62 51 114 99
|
||||||
|
116 105 2 7 4 209 3 449 l-1 436 276 0 c151 0 277 -4 280 -8 3 -4 5 -98 4
|
||||||
|
-208 0 -111 2 -201 4 -201 3 0 117 95 132 110 3 3 73 61 155 130 168 140 167
|
||||||
|
139 250 209 51 43 62 48 75 37 13 -12 524 -441 654 -550 28 -22 68 -57 91 -76
|
||||||
|
23 -19 66 -55 95 -80 30 -25 86 -72 125 -105 38 -33 140 -118 225 -190 85 -71
|
||||||
|
166 -139 180 -151 14 -13 70 -60 124 -106 55 -46 133 -111 174 -145 41 -35 77
|
||||||
|
-61 80 -59 4 2 7 607 7 1344 -1 1197 1 1341 15 1344 8 2 163 3 343 3 l328 0
|
||||||
|
-4 685 c-1 377 -6 695 -9 706 -26 90 -93 186 -161 233 -86 58 30 55 -1924 55
|
||||||
|
-991 1 -1819 -2 -1841 -6z"/>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 1.2 KiB |
@ -1,10 +1,13 @@
|
|||||||
|
import ErrorBoundary from "components/errorboundry";
|
||||||
import List from "components/bookmarks/list";
|
import List from "components/bookmarks/list";
|
||||||
|
|
||||||
export default function BookmarksGroup({ group }) {
|
export default function BookmarksGroup({ group }) {
|
||||||
return (
|
return (
|
||||||
<div key={group.name} className="basis-full md:basis-1/2 lg:basis-1/3 xl:basis-1/4 flex-1 p-1">
|
<div key={group.name} className="basis-full md:basis-1/2 lg:basis-1/3 xl:basis-1/4 flex-1">
|
||||||
<h2 className="text-theme-800 dark:text-theme-300 text-xl font-medium">{group.name}</h2>
|
<h2 className="text-theme-800 dark:text-theme-300 text-xl font-medium">{group.name}</h2>
|
||||||
|
<ErrorBoundary>
|
||||||
<List bookmarks={group.bookmarks} />
|
<List bookmarks={group.bookmarks} />
|
||||||
|
</ErrorBoundary>
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -11,7 +11,7 @@ export default function Item({ bookmark }) {
|
|||||||
<a
|
<a
|
||||||
href={bookmark.href}
|
href={bookmark.href}
|
||||||
title={bookmark.name}
|
title={bookmark.name}
|
||||||
target={settings.target ?? "_blank"}
|
target={bookmark.target ?? settings.target ?? "_blank"}
|
||||||
className="block w-full text-left cursor-pointer transition-all h-15 mb-3 rounded-md font-medium text-theme-700 dark:text-theme-200 dark:hover:text-theme-300 shadow-md shadow-theme-900/10 dark:shadow-theme-900/20 bg-theme-100/20 hover:bg-theme-300/20 dark:bg-white/5 dark:hover:bg-white/10"
|
className="block w-full text-left cursor-pointer transition-all h-15 mb-3 rounded-md font-medium text-theme-700 dark:text-theme-200 dark:hover:text-theme-300 shadow-md shadow-theme-900/10 dark:shadow-theme-900/20 bg-theme-100/20 hover:bg-theme-300/20 dark:bg-white/5 dark:hover:bg-white/10"
|
||||||
>
|
>
|
||||||
<div className="flex">
|
<div className="flex">
|
||||||
|
|||||||
40
src/components/errorboundry.jsx
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
import React from "react";
|
||||||
|
|
||||||
|
export default class ErrorBoundary extends React.Component {
|
||||||
|
constructor(props) {
|
||||||
|
super(props);
|
||||||
|
this.state = { error: null, errorInfo: null };
|
||||||
|
}
|
||||||
|
|
||||||
|
componentDidCatch(error, errorInfo) {
|
||||||
|
// Catch errors in any components below and re-render with error message
|
||||||
|
this.setState({
|
||||||
|
error,
|
||||||
|
errorInfo,
|
||||||
|
});
|
||||||
|
|
||||||
|
// You can also log error messages to an error reporting service here
|
||||||
|
// eslint-disable-next-line no-console
|
||||||
|
console.error(error, errorInfo);
|
||||||
|
}
|
||||||
|
|
||||||
|
render() {
|
||||||
|
const { error, errorInfo } = this.state;
|
||||||
|
if (errorInfo) {
|
||||||
|
// Error path
|
||||||
|
return (
|
||||||
|
<div className="inline-block text-sm bg-rose-100 text-rose-900 dark:bg-rose-900 dark:text-rose-100 rounded-md p-2 m-1">
|
||||||
|
<div className="font-medium mb-1">Something went wrong.</div>
|
||||||
|
<details className="text-xs font-mono whitespace-pre">
|
||||||
|
<summary>{error && error.toString()}</summary>
|
||||||
|
{errorInfo.componentStack}
|
||||||
|
</details>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Normally, just render children
|
||||||
|
const { children } = this.props;
|
||||||
|
return children;
|
||||||
|
}
|
||||||
|
}
|
||||||
114
src/components/favicon.jsx
Normal file
@ -0,0 +1,114 @@
|
|||||||
|
/* eslint-disable @next/next/no-img-element */
|
||||||
|
/* eslint-disable jsx-a11y/alt-text */
|
||||||
|
import { useRef, useEffect, useContext } from "react";
|
||||||
|
|
||||||
|
import themes from "utils/styles/themes";
|
||||||
|
import { ColorContext } from "utils/contexts/color";
|
||||||
|
|
||||||
|
export function Svg({ svgRef = null }) {
|
||||||
|
const { color } = useContext(ColorContext);
|
||||||
|
|
||||||
|
const { iconStart, iconEnd } = themes[color];
|
||||||
|
|
||||||
|
return (
|
||||||
|
<svg
|
||||||
|
ref={svgRef}
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
viewBox="0 0 1024 1024"
|
||||||
|
style={{
|
||||||
|
enableBackground: "new 0 0 1024 1024",
|
||||||
|
}}
|
||||||
|
xmlSpace="preserve"
|
||||||
|
className="w-full h-full"
|
||||||
|
>
|
||||||
|
<style>
|
||||||
|
{
|
||||||
|
".st0{display:none}.st3{stroke-linecap:square}.st3,.st4{fill:none;stroke:#fff;stroke-miterlimit:10}.st6{display:inline;fill:#333}.st7{fill:#fff}"
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
<g id="Icon">
|
||||||
|
<path
|
||||||
|
d="M771.9 191c27.7 0 50.1 26.5 50.1 59.3v186.4l-100.2.3V250.3c0-32.8 22.4-59.3 50.1-59.3z"
|
||||||
|
style={{
|
||||||
|
fill: iconStart,
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
<linearGradient
|
||||||
|
id="homepage_favicon_gradient"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
x1={200.746}
|
||||||
|
y1={225.015}
|
||||||
|
x2={764.986}
|
||||||
|
y2={789.255}
|
||||||
|
>
|
||||||
|
<stop
|
||||||
|
offset={0}
|
||||||
|
style={{
|
||||||
|
stopColor: iconStart,
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
<stop
|
||||||
|
offset={1}
|
||||||
|
style={{
|
||||||
|
stopColor: iconEnd,
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
</linearGradient>
|
||||||
|
<path
|
||||||
|
d="M721.8 250.3c0-32.7 22.4-59.3 50.1-59.3H253.1c-27.7 0-50.1 26.5-50.1 59.3v582.2l90.2-75.7-.1-130.3H375v61.8l88-73.8 258.8 217.9V250.6"
|
||||||
|
style={{
|
||||||
|
fill: "url(#homepage_favicon_gradient})",
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
export default function Favicon() {
|
||||||
|
const svgRef = useRef();
|
||||||
|
const imgRef = useRef();
|
||||||
|
const canvasRef = useRef();
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
const svg = svgRef.current;
|
||||||
|
const img = imgRef.current;
|
||||||
|
const canvas = canvasRef.current;
|
||||||
|
|
||||||
|
if (!svg || !img || !canvas) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const xml = new XMLSerializer().serializeToString(svg);
|
||||||
|
|
||||||
|
const svg64 = Buffer.from(xml).toString("base64");
|
||||||
|
const b64Start = "data:image/svg+xml;base64,";
|
||||||
|
|
||||||
|
// prepend a "header"
|
||||||
|
const image64 = b64Start + svg64;
|
||||||
|
|
||||||
|
// set it as the source of the img element
|
||||||
|
img.onload = () => {
|
||||||
|
// draw the image onto the canvas
|
||||||
|
canvas.getContext("2d").drawImage(img, 0, 0);
|
||||||
|
// canvas.width = 256;
|
||||||
|
// canvas.height = 256;
|
||||||
|
|
||||||
|
const link = window.document.createElement("link");
|
||||||
|
link.type = "image/x-icon";
|
||||||
|
link.rel = "shortcut icon";
|
||||||
|
link.href = canvas.toDataURL("image/x-icon");
|
||||||
|
document.getElementsByTagName("head")[0].appendChild(link);
|
||||||
|
};
|
||||||
|
|
||||||
|
img.src = image64;
|
||||||
|
}, []);
|
||||||
|
|
||||||
|
return (
|
||||||
|
<div className="hidden">
|
||||||
|
<Svg svgRef={svgRef} />
|
||||||
|
<img width={64} height={64} ref={imgRef} />
|
||||||
|
<canvas width={64} height={64} ref={canvasRef} />
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
160
src/components/quicklaunch.jsx
Normal file
@ -0,0 +1,160 @@
|
|||||||
|
import { useTranslation } from "react-i18next";
|
||||||
|
import { useEffect, useState, useRef, useCallback, useContext } from "react";
|
||||||
|
import classNames from "classnames";
|
||||||
|
|
||||||
|
import { resolveIcon } from "./services/item";
|
||||||
|
|
||||||
|
import { SettingsContext } from "utils/contexts/settings";
|
||||||
|
|
||||||
|
export default function QuickLaunch({servicesAndBookmarks, searchString, setSearchString, isOpen, close, searchDescriptions}) {
|
||||||
|
const { t } = useTranslation();
|
||||||
|
const { settings } = useContext(SettingsContext);
|
||||||
|
|
||||||
|
const searchField = useRef();
|
||||||
|
|
||||||
|
const [results, setResults] = useState([]);
|
||||||
|
const [currentItemIndex, setCurrentItemIndex] = useState(null);
|
||||||
|
|
||||||
|
function openCurrentItem(newWindow) {
|
||||||
|
const result = results[currentItemIndex];
|
||||||
|
window.open(result.href, newWindow ? "_blank" : result.target ?? settings.target ?? "_blank");
|
||||||
|
}
|
||||||
|
|
||||||
|
const closeAndReset = useCallback(() => {
|
||||||
|
close(false);
|
||||||
|
setTimeout(() => {
|
||||||
|
setSearchString("");
|
||||||
|
setCurrentItemIndex(null);
|
||||||
|
}, 200); // delay a little for animations
|
||||||
|
}, [close, setSearchString, setCurrentItemIndex]);
|
||||||
|
|
||||||
|
function handleSearchChange(event) {
|
||||||
|
setSearchString(event.target.value.toLowerCase())
|
||||||
|
}
|
||||||
|
|
||||||
|
function handleSearchKeyDown(event) {
|
||||||
|
if (!isOpen) return;
|
||||||
|
|
||||||
|
if (event.key === "Escape") {
|
||||||
|
closeAndReset();
|
||||||
|
event.preventDefault();
|
||||||
|
} else if (event.key === "Enter" && results.length) {
|
||||||
|
closeAndReset();
|
||||||
|
openCurrentItem(event.metaKey);
|
||||||
|
} else if (event.key === "ArrowDown" && results[currentItemIndex + 1]) {
|
||||||
|
setCurrentItemIndex(currentItemIndex + 1);
|
||||||
|
event.preventDefault();
|
||||||
|
} else if (event.key === "ArrowUp" && currentItemIndex > 0) {
|
||||||
|
setCurrentItemIndex(currentItemIndex - 1);
|
||||||
|
event.preventDefault();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function handleItemHover(event) {
|
||||||
|
setCurrentItemIndex(parseInt(event.target?.dataset?.index, 10));
|
||||||
|
}
|
||||||
|
|
||||||
|
function handleItemClick(event) {
|
||||||
|
closeAndReset();
|
||||||
|
openCurrentItem(event.metaKey);
|
||||||
|
}
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
if (searchString.length === 0) setResults([]);
|
||||||
|
else {
|
||||||
|
let newResults = servicesAndBookmarks.filter(r => {
|
||||||
|
const nameMatch = r.name.toLowerCase().includes(searchString);
|
||||||
|
let descriptionMatch;
|
||||||
|
if (searchDescriptions) {
|
||||||
|
descriptionMatch = r.description?.toLowerCase().includes(searchString)
|
||||||
|
r.priority = nameMatch ? 2 * (+nameMatch) : +descriptionMatch; // eslint-disable-line no-param-reassign
|
||||||
|
}
|
||||||
|
return nameMatch || descriptionMatch;
|
||||||
|
});
|
||||||
|
|
||||||
|
if (searchDescriptions) {
|
||||||
|
newResults = newResults.sort((a, b) => b.priority - a.priority);
|
||||||
|
}
|
||||||
|
|
||||||
|
setResults(newResults);
|
||||||
|
|
||||||
|
if (newResults.length) {
|
||||||
|
setCurrentItemIndex(0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}, [searchString, servicesAndBookmarks, searchDescriptions]);
|
||||||
|
|
||||||
|
|
||||||
|
const [hidden, setHidden] = useState(true);
|
||||||
|
useEffect(() => {
|
||||||
|
function handleBackdropClick(event) {
|
||||||
|
if (event.target?.tagName === "DIV") closeAndReset();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isOpen) {
|
||||||
|
searchField.current.focus();
|
||||||
|
document.body.addEventListener('click', handleBackdropClick);
|
||||||
|
setHidden(false);
|
||||||
|
} else {
|
||||||
|
document.body.removeEventListener('click', handleBackdropClick);
|
||||||
|
searchField.current.blur();
|
||||||
|
setTimeout(() => {
|
||||||
|
setHidden(true);
|
||||||
|
}, 300); // disable on close
|
||||||
|
}
|
||||||
|
|
||||||
|
}, [isOpen, closeAndReset]);
|
||||||
|
|
||||||
|
function highlightText(text) {
|
||||||
|
const parts = text.split(new RegExp(`(${searchString})`, 'gi'));
|
||||||
|
return <span>{parts.map(part => part.toLowerCase() === searchString.toLowerCase() ? <span className="bg-theme-300/10">{part}</span> : part)}</span>;
|
||||||
|
}
|
||||||
|
|
||||||
|
return (
|
||||||
|
<div className={classNames(
|
||||||
|
"relative z-10 ease-in-out duration-300 transition-opacity",
|
||||||
|
hidden && !isOpen && "hidden",
|
||||||
|
!hidden && isOpen && "opacity-100",
|
||||||
|
!isOpen && "opacity-0",
|
||||||
|
)} role="dialog" aria-modal="true">
|
||||||
|
<div className="fixed inset-0 bg-gray-500 bg-opacity-50" />
|
||||||
|
<div className="fixed inset-0 z-10 overflow-y-auto">
|
||||||
|
<div className="flex min-h-full min-w-full items-start justify-center text-center">
|
||||||
|
<dialog className="mt-[10%] min-w-[80%] max-w-[90%] md:min-w-[40%] rounded-md p-0 block font-medium text-theme-700 dark:text-theme-200 dark:hover:text-theme-300 shadow-md shadow-theme-900/10 dark:shadow-theme-900/20 bg-theme-50 dark:bg-theme-800">
|
||||||
|
<input placeholder="Search" className={classNames(
|
||||||
|
results.length > 0 && "rounded-t-md",
|
||||||
|
results.length === 0 && "rounded-md",
|
||||||
|
"w-full p-4 m-0 border-0 border-b border-slate-700 focus:border-slate-700 focus:outline-0 focus:ring-0 text-sm md:text-xl text-theme-700 dark:text-theme-200 bg-theme-60 dark:bg-theme-800"
|
||||||
|
)} type="text" autoCorrect="false" ref={searchField} value={searchString} onChange={handleSearchChange} onKeyDown={handleSearchKeyDown} />
|
||||||
|
{results.length > 0 && <ul className="max-h-[60vh] overflow-y-auto m-2">
|
||||||
|
{results.map((r, i) => (
|
||||||
|
<li key={r.name}>
|
||||||
|
<button type="button" data-index={i} onMouseEnter={handleItemHover} className={classNames(
|
||||||
|
"flex flex-row w-full items-center justify-between rounded-md text-sm md:text-xl py-2 px-4 cursor-pointer text-theme-700 dark:text-theme-200",
|
||||||
|
i === currentItemIndex && "bg-theme-300/50 dark:bg-theme-700/50",
|
||||||
|
)} onClick={handleItemClick}>
|
||||||
|
<div className="flex flex-row items-center mr-4 pointer-events-none">
|
||||||
|
<div className="w-5 text-xs mr-4">
|
||||||
|
{r.icon && resolveIcon(r.icon)}
|
||||||
|
{r.abbr && r.abbr}
|
||||||
|
</div>
|
||||||
|
<div className="flex flex-col md:flex-row text-left items-baseline mr-4 pointer-events-none">
|
||||||
|
<span className="mr-4">{r.name}</span>
|
||||||
|
{r.description &&
|
||||||
|
<span className="text-xs text-theme-600 text-light">
|
||||||
|
{searchDescriptions && r.priority < 2 ? highlightText(r.description) : r.description}
|
||||||
|
</span>
|
||||||
|
}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div className="text-xs text-theme-600 font-bold pointer-events-none">{r.abbr ? t("quicklaunch.bookmark") : t("quicklaunch.service")}</div>
|
||||||
|
</button>
|
||||||
|
</li>
|
||||||
|
))}
|
||||||
|
</ul>}
|
||||||
|
</dialog>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
@ -1,4 +1,3 @@
|
|||||||
import Image from "next/future/image";
|
|
||||||
import classNames from "classnames";
|
import classNames from "classnames";
|
||||||
import { useContext, useState } from "react";
|
import { useContext, useState } from "react";
|
||||||
|
|
||||||
@ -38,22 +37,20 @@ export default function Item({ service }) {
|
|||||||
(hasLink ? (
|
(hasLink ? (
|
||||||
<a
|
<a
|
||||||
href={service.href}
|
href={service.href}
|
||||||
target={settings.target ?? "_blank"}
|
target={service.target ?? settings.target ?? "_blank"}
|
||||||
rel="noreferrer"
|
rel="noreferrer"
|
||||||
className="flex-shrink-0 flex items-center justify-center w-12 "
|
className="flex-shrink-0 flex items-center justify-center w-12 "
|
||||||
>
|
>
|
||||||
<Image src={resolveIcon(service.icon)} width={32} height={32} alt="logo" />
|
{resolveIcon(service.icon)}
|
||||||
</a>
|
</a>
|
||||||
) : (
|
) : (
|
||||||
<div className="flex-shrink-0 flex items-center justify-center w-12 ">
|
<div className="flex-shrink-0 flex items-center justify-center w-12 ">{resolveIcon(service.icon)}</div>
|
||||||
<Image src={resolveIcon(service.icon)} width={32} height={32} alt="logo" />
|
|
||||||
</div>
|
|
||||||
))}
|
))}
|
||||||
|
|
||||||
{hasLink ? (
|
{hasLink ? (
|
||||||
<a
|
<a
|
||||||
href={service.href}
|
href={service.href}
|
||||||
target={settings.target ?? "_blank"}
|
target={service.target ?? settings.target ?? "_blank"}
|
||||||
rel="noreferrer"
|
rel="noreferrer"
|
||||||
className="flex-1 flex items-center justify-between rounded-r-md "
|
className="flex-1 flex items-center justify-between rounded-r-md "
|
||||||
>
|
>
|
||||||
|
|||||||
@ -1,5 +1,6 @@
|
|||||||
import { useTranslation } from "next-i18next";
|
import { useTranslation } from "next-i18next";
|
||||||
|
|
||||||
|
import ErrorBoundary from "components/errorboundry";
|
||||||
import components from "widgets/components";
|
import components from "widgets/components";
|
||||||
|
|
||||||
export default function Widget({ service }) {
|
export default function Widget({ service }) {
|
||||||
@ -8,7 +9,11 @@ export default function Widget({ service }) {
|
|||||||
const ServiceWidget = components[service.widget.type];
|
const ServiceWidget = components[service.widget.type];
|
||||||
|
|
||||||
if (ServiceWidget) {
|
if (ServiceWidget) {
|
||||||
return <ServiceWidget service={service} />;
|
return (
|
||||||
|
<ErrorBoundary>
|
||||||
|
<ServiceWidget service={service} />
|
||||||
|
</ErrorBoundary>
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
return (
|
return (
|
||||||
|
|||||||
@ -1,6 +1,9 @@
|
|||||||
|
import { useTranslation } from "next-i18next";
|
||||||
import classNames from "classnames";
|
import classNames from "classnames";
|
||||||
|
|
||||||
export default function Block({ value, label }) {
|
export default function Block({ value, label }) {
|
||||||
|
const { t } = useTranslation();
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div
|
<div
|
||||||
className={classNames(
|
className={classNames(
|
||||||
@ -9,7 +12,7 @@ export default function Block({ value, label }) {
|
|||||||
)}
|
)}
|
||||||
>
|
>
|
||||||
<div className="font-thin text-sm">{value === undefined || value === null ? "-" : value}</div>
|
<div className="font-thin text-sm">{value === undefined || value === null ? "-" : value}</div>
|
||||||
<div className="font-bold text-xs uppercase">{label}</div>
|
<div className="font-bold text-xs uppercase">{t(label)}</div>
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,4 +1,4 @@
|
|||||||
export default function Container({ error = false, children }) {
|
export default function Container({ error = false, children, service }) {
|
||||||
if (error) {
|
if (error) {
|
||||||
return (
|
return (
|
||||||
<div className="bg-theme-200/50 dark:bg-theme-900/20 rounded m-1 flex-1 flex flex-col items-center justify-center p-1">
|
<div className="bg-theme-200/50 dark:bg-theme-900/20 rounded m-1 flex-1 flex flex-col items-center justify-center p-1">
|
||||||
@ -7,5 +7,12 @@ export default function Container({ error = false, children }) {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
return <div className="relative flex flex-row w-full">{children}</div>;
|
let visibleChildren = children;
|
||||||
|
const fields = service?.widget?.fields;
|
||||||
|
const type = service?.widget?.type;
|
||||||
|
if (fields && type) {
|
||||||
|
visibleChildren = children.filter(child => fields.some(field => `${type}.${field}` === child?.props?.label));
|
||||||
|
}
|
||||||
|
|
||||||
|
return <div className="relative flex flex-row w-full">{visibleChildren}</div>;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -3,6 +3,8 @@ import useSWR from "swr";
|
|||||||
import { compareVersions } from "compare-versions";
|
import { compareVersions } from "compare-versions";
|
||||||
import { MdNewReleases } from "react-icons/md";
|
import { MdNewReleases } from "react-icons/md";
|
||||||
|
|
||||||
|
import cachedFetch from "utils/proxy/cached-fetch";
|
||||||
|
|
||||||
export default function Version() {
|
export default function Version() {
|
||||||
const { t, i18n } = useTranslation();
|
const { t, i18n } = useTranslation();
|
||||||
|
|
||||||
@ -10,7 +12,9 @@ export default function Version() {
|
|||||||
const revision = process.env.NEXT_PUBLIC_REVISION ?? "dev";
|
const revision = process.env.NEXT_PUBLIC_REVISION ?? "dev";
|
||||||
const version = process.env.NEXT_PUBLIC_VERSION ?? "dev";
|
const version = process.env.NEXT_PUBLIC_VERSION ?? "dev";
|
||||||
|
|
||||||
const { data: releaseData } = useSWR("https://api.github.com/repos/benphelps/homepage/releases");
|
const cachedFetcher = (resource) => cachedFetch(resource, 5).then((res) => res.json());
|
||||||
|
|
||||||
|
const { data: releaseData } = useSWR("https://api.github.com/repos/benphelps/homepage/releases", cachedFetcher);
|
||||||
|
|
||||||
// use Intl.DateTimeFormat to format the date
|
// use Intl.DateTimeFormat to format the date
|
||||||
const formatDate = (date) => {
|
const formatDate = (date) => {
|
||||||
@ -27,7 +31,23 @@ export default function Version() {
|
|||||||
return (
|
return (
|
||||||
<div className="flex flex-row items-center">
|
<div className="flex flex-row items-center">
|
||||||
<span className="text-xs text-theme-500 dark:text-theme-400">
|
<span className="text-xs text-theme-500 dark:text-theme-400">
|
||||||
|
{version === "main" || version === "dev" || version === "nightly" ? (
|
||||||
|
<>
|
||||||
{version} ({revision.substring(0, 7)}, {formatDate(buildTime)})
|
{version} ({revision.substring(0, 7)}, {formatDate(buildTime)})
|
||||||
|
</>
|
||||||
|
) : (
|
||||||
|
releaseData &&
|
||||||
|
compareVersions(latestRelease.tag_name, version) > 0 && (
|
||||||
|
<a
|
||||||
|
href={`https://github.com/benphelps/homepage/releases/tag/${version}`}
|
||||||
|
target="_blank"
|
||||||
|
rel="noopener noreferrer"
|
||||||
|
className="ml-2 text-xs text-theme-500 dark:text-theme-400 flex flex-row items-center"
|
||||||
|
>
|
||||||
|
{version} ({revision.substring(0, 7)}, {formatDate(buildTime)})
|
||||||
|
</a>
|
||||||
|
)
|
||||||
|
)}
|
||||||
</span>
|
</span>
|
||||||
{version === "main" || version === "dev" || version === "nightly"
|
{version === "main" || version === "dev" || version === "nightly"
|
||||||
? null
|
? null
|
||||||
|
|||||||
110
src/components/widgets/glances/glances.jsx
Normal file
@ -0,0 +1,110 @@
|
|||||||
|
import useSWR from "swr";
|
||||||
|
import { BiError } from "react-icons/bi";
|
||||||
|
import { FaMemory } from "react-icons/fa";
|
||||||
|
import { FiCpu } from "react-icons/fi";
|
||||||
|
import { useTranslation } from "next-i18next";
|
||||||
|
|
||||||
|
import UsageBar from "../resources/usage-bar";
|
||||||
|
|
||||||
|
export default function Widget({ options }) {
|
||||||
|
const { t, i18n } = useTranslation();
|
||||||
|
|
||||||
|
const { data, error } = useSWR(
|
||||||
|
`/api/widgets/glances?${new URLSearchParams({ lang: i18n.language, ...options }).toString()}`, {
|
||||||
|
refreshInterval: 1500,
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
if (error || data?.error) {
|
||||||
|
return (
|
||||||
|
<div className="flex flex-col justify-center first:ml-0 ml-4">
|
||||||
|
<div className="flex flex-row items-center justify-end">
|
||||||
|
<div className="flex flex-row items-center">
|
||||||
|
<BiError className="w-8 h-8 text-theme-800 dark:text-theme-200" />
|
||||||
|
<div className="flex flex-col ml-3 text-left">
|
||||||
|
<span className="text-theme-800 dark:text-theme-200 text-sm">{t("widget.api_error")}</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!data) {
|
||||||
|
return (
|
||||||
|
<div className="flex flex-col max-w:full sm:basis-auto self-center grow-0 flex-wrap ml-4">
|
||||||
|
<div className="flex flex-row self-center flex-wrap justify-between">
|
||||||
|
<div className="flex-none flex flex-row items-center mr-3 py-1.5">
|
||||||
|
<FiCpu className="text-theme-800 dark:text-theme-200 w-5 h-5" />
|
||||||
|
<div className="flex flex-col ml-3 text-left min-w-[85px]">
|
||||||
|
<div className="text-theme-800 dark:text-theme-200 text-xs flex flex-row justify-between">
|
||||||
|
<div className="pl-0.5 text-xs">
|
||||||
|
{t("glances.wait")}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<UsageBar percent="0" />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div className="flex-none flex flex-row items-center mr-3 py-1.5">
|
||||||
|
<FaMemory className="text-theme-800 dark:text-theme-200 w-5 h-5" />
|
||||||
|
<div className="flex flex-col ml-3 text-left min-w-[85px]">
|
||||||
|
<div className="text-theme-800 dark:text-theme-200 text-xs flex flex-row justify-between">
|
||||||
|
<div className="pl-0.5 text-xs">
|
||||||
|
{t("glances.wait")}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<UsageBar percent="0" />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{options.label && (
|
||||||
|
<div className="ml-6 pt-1 text-center text-theme-800 dark:text-theme-200 text-xs">{options.label}</div>
|
||||||
|
)}
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
return (
|
||||||
|
<div className="flex flex-col max-w:full sm:basis-auto self-center grow-0 flex-wrap ml-4">
|
||||||
|
<div className="flex flex-row self-center flex-wrap justify-between">
|
||||||
|
<div className="flex-none flex flex-row items-center mr-3 py-1.5">
|
||||||
|
<FiCpu className="text-theme-800 dark:text-theme-200 w-5 h-5" />
|
||||||
|
<div className="flex flex-col ml-3 text-left min-w-[85px]">
|
||||||
|
<div className="text-theme-800 dark:text-theme-200 text-xs flex flex-row justify-between">
|
||||||
|
<div className="pl-0.5">
|
||||||
|
{t("common.number", {
|
||||||
|
value: data.cpu,
|
||||||
|
style: "unit",
|
||||||
|
unit: "percent",
|
||||||
|
maximumFractionDigits: 0,
|
||||||
|
})}
|
||||||
|
</div>
|
||||||
|
<div className="pr-1">{t("glances.cpu")}</div>
|
||||||
|
</div>
|
||||||
|
<UsageBar percent={data.cpu} />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div className="flex-none flex flex-row items-center mr-3 py-1.5">
|
||||||
|
<FaMemory className="text-theme-800 dark:text-theme-200 w-5 h-5" />
|
||||||
|
<div className="flex flex-col ml-3 text-left min-w-[85px]">
|
||||||
|
<div className="text-theme-800 dark:text-theme-200 text-xs flex flex-row justify-between">
|
||||||
|
<div className="pl-0.5">
|
||||||
|
{t("common.number", {
|
||||||
|
value: data.mem,
|
||||||
|
style: "unit",
|
||||||
|
unit: "percent",
|
||||||
|
maximumFractionDigits: 0,
|
||||||
|
})}
|
||||||
|
</div>
|
||||||
|
<div className="pr-1">{t("glances.mem")}</div>
|
||||||
|
</div>
|
||||||
|
<UsageBar percent={data.mem} />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{options.label && (
|
||||||
|
<div className="pt-1 text-center text-theme-800 dark:text-theme-200 text-xs">{options.label}</div>
|
||||||
|
)}
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
56
src/components/widgets/logo/logo.jsx
Normal file
@ -0,0 +1,56 @@
|
|||||||
|
export default function Logo() {
|
||||||
|
return (
|
||||||
|
<div className="w-12 h-12 flex flex-row items-center align-middle mr-3 self-center">
|
||||||
|
<svg
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
viewBox="0 0 1024 1024"
|
||||||
|
style={{
|
||||||
|
enableBackground: "new 0 0 1024 1024",
|
||||||
|
}}
|
||||||
|
xmlSpace="preserve"
|
||||||
|
className="w-full h-full"
|
||||||
|
>
|
||||||
|
<style>
|
||||||
|
{
|
||||||
|
".st0{display:none}.st3{stroke-linecap:square}.st3,.st4{fill:none;stroke:#fff;stroke-miterlimit:10}.st6{display:inline;fill:#333}.st7{fill:#fff}"
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
<g id="Icon">
|
||||||
|
<path
|
||||||
|
d="M771.9 191c27.7 0 50.1 26.5 50.1 59.3v186.4l-100.2.3V250.3c0-32.8 22.4-59.3 50.1-59.3z"
|
||||||
|
style={{
|
||||||
|
fill: "rgba(var(--color-logo-start))",
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
<linearGradient
|
||||||
|
id="homepage_logo_gradient"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
x1={200.746}
|
||||||
|
y1={225.015}
|
||||||
|
x2={764.986}
|
||||||
|
y2={789.255}
|
||||||
|
>
|
||||||
|
<stop
|
||||||
|
offset={0}
|
||||||
|
style={{
|
||||||
|
stopColor: "rgba(var(--color-logo-start))",
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
<stop
|
||||||
|
offset={1}
|
||||||
|
style={{
|
||||||
|
stopColor: "rgba(var(--color-logo-stop))",
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
</linearGradient>
|
||||||
|
<path
|
||||||
|
d="M721.8 250.3c0-32.7 22.4-59.3 50.1-59.3H253.1c-27.7 0-50.1 26.5-50.1 59.3v582.2l90.2-75.7-.1-130.3H375v61.8l88-73.8 258.8 217.9V250.6"
|
||||||
|
style={{
|
||||||
|
fill: "url(#homepage_logo_gradient)",
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
7
src/components/widgets/openmeteo/icon.jsx
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
import mapIcon from "utils/weather/owm-condition-map";
|
||||||
|
|
||||||
|
export default function Icon({ condition, timeOfDay }) {
|
||||||
|
const IconComponent = mapIcon(condition, timeOfDay);
|
||||||
|
|
||||||
|
return <IconComponent className="w-10 h-10 text-theme-800 dark:text-theme-200" />;
|
||||||
|
}
|
||||||
130
src/components/widgets/openmeteo/openmeteo.jsx
Normal file
@ -0,0 +1,130 @@
|
|||||||
|
import useSWR from "swr";
|
||||||
|
import { useState } from "react";
|
||||||
|
import { BiError } from "react-icons/bi";
|
||||||
|
import { WiCloudDown } from "react-icons/wi";
|
||||||
|
import { MdLocationDisabled, MdLocationSearching } from "react-icons/md";
|
||||||
|
import { useTranslation } from "next-i18next";
|
||||||
|
|
||||||
|
import Icon from "./icon";
|
||||||
|
|
||||||
|
function Widget({ options }) {
|
||||||
|
const { t } = useTranslation();
|
||||||
|
|
||||||
|
const { data, error } = useSWR(
|
||||||
|
`/api/widgets/openmeteo?${new URLSearchParams({ ...options }).toString()}`
|
||||||
|
);
|
||||||
|
|
||||||
|
if (error || data?.error) {
|
||||||
|
return (
|
||||||
|
<div className="flex flex-col justify-center first:ml-0 ml-4 mr-2">
|
||||||
|
<div className="flex flex-row items-center justify-end">
|
||||||
|
<div className="flex flex-col items-center">
|
||||||
|
<BiError className="w-8 h-8 text-theme-800 dark:text-theme-200" />
|
||||||
|
<div className="flex flex-col ml-3 text-left">
|
||||||
|
<span className="text-theme-800 dark:text-theme-200 text-sm">{t("widget.api_error")}</span>
|
||||||
|
<span className="text-theme-800 dark:text-theme-200 text-xs">-</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!data) {
|
||||||
|
return (
|
||||||
|
<div className="flex flex-col justify-center first:ml-0 ml-4 mr-2">
|
||||||
|
<div className="flex flex-row items-center justify-end">
|
||||||
|
<div className="flex flex-col items-center">
|
||||||
|
<WiCloudDown className="w-8 h-8 text-theme-800 dark:text-theme-200" />
|
||||||
|
</div>
|
||||||
|
<div className="flex flex-col ml-3 text-left">
|
||||||
|
<span className="text-theme-800 dark:text-theme-200 text-sm">{t("weather.updating")}</span>
|
||||||
|
<span className="text-theme-800 dark:text-theme-200 text-xs">{t("weather.wait")}</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
const unit = options.units === "metric" ? "celsius" : "fahrenheit";
|
||||||
|
const timeOfDay = data.current_weather.time > data.daily.sunrise[0] && data.current_weather.time < data.daily.sunset[0] ? "day" : "night";
|
||||||
|
|
||||||
|
return (
|
||||||
|
<div className="flex flex-col justify-center first:ml-0 ml-4 mr-2">
|
||||||
|
<div className="flex flex-row items-center justify-end">
|
||||||
|
<div className="flex flex-col items-center">
|
||||||
|
<Icon condition={data.current_weather.weathercode} timeOfDay={timeOfDay} />
|
||||||
|
</div>
|
||||||
|
<div className="flex flex-col ml-3 text-left">
|
||||||
|
<span className="text-theme-800 dark:text-theme-200 text-sm">
|
||||||
|
{options.label && `${options.label}, `}
|
||||||
|
{t("common.number", {
|
||||||
|
value: data.current_weather.temperature,
|
||||||
|
style: "unit",
|
||||||
|
unit,
|
||||||
|
})}
|
||||||
|
</span>
|
||||||
|
<span className="text-theme-800 dark:text-theme-200 text-xs">{t(`wmo.${data.current_weather.weathercode}-${timeOfDay}`)}</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
export default function OpenMeteo({ options }) {
|
||||||
|
const { t } = useTranslation();
|
||||||
|
const [location, setLocation] = useState(false);
|
||||||
|
const [requesting, setRequesting] = useState(false);
|
||||||
|
|
||||||
|
if (!location && options.latitude && options.longitude) {
|
||||||
|
setLocation({ latitude: options.latitude, longitude: options.longitude });
|
||||||
|
}
|
||||||
|
|
||||||
|
const requestLocation = () => {
|
||||||
|
setRequesting(true);
|
||||||
|
if (typeof window !== "undefined") {
|
||||||
|
navigator.geolocation.getCurrentPosition(
|
||||||
|
(position) => {
|
||||||
|
setLocation({ latitude: position.coords.latitude, longitude: position.coords.longitude });
|
||||||
|
setRequesting(false);
|
||||||
|
},
|
||||||
|
() => {
|
||||||
|
setRequesting(false);
|
||||||
|
},
|
||||||
|
{
|
||||||
|
enableHighAccuracy: true,
|
||||||
|
maximumAge: 1000 * 60 * 60 * 3,
|
||||||
|
timeout: 1000 * 30,
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
// if (!requesting && !location) requestLocation();
|
||||||
|
|
||||||
|
if (!location) {
|
||||||
|
return (
|
||||||
|
<button
|
||||||
|
type="button"
|
||||||
|
onClick={() => requestLocation()}
|
||||||
|
className="flex flex-col justify-center first:ml-0 ml-4 mr-2"
|
||||||
|
>
|
||||||
|
<div className="flex flex-row items-center justify-end">
|
||||||
|
<div className="flex flex-col items-center">
|
||||||
|
{requesting ? (
|
||||||
|
<MdLocationSearching className="w-6 h-6 text-theme-800 dark:text-theme-200 animate-pulse" />
|
||||||
|
) : (
|
||||||
|
<MdLocationDisabled className="w-6 h-6 text-theme-800 dark:text-theme-200" />
|
||||||
|
)}
|
||||||
|
</div>
|
||||||
|
<div className="flex flex-col ml-3 text-left">
|
||||||
|
<span className="text-theme-800 dark:text-theme-200 text-sm">{t("weather.current")}</span>
|
||||||
|
<span className="text-theme-800 dark:text-theme-200 text-xs">{t("weather.allow")}</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</button>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
return <Widget options={{ ...location, ...options }} />;
|
||||||
|
}
|
||||||
@ -16,9 +16,9 @@ function Widget({ options }) {
|
|||||||
|
|
||||||
if (error || data?.cod === 401 || data?.error) {
|
if (error || data?.cod === 401 || data?.error) {
|
||||||
return (
|
return (
|
||||||
<div className="flex flex-col justify-center first:ml-0 ml-4">
|
<div className="flex flex-col justify-center first:ml-auto ml-4 mr-2">
|
||||||
<div className="flex flex-row items-center justify-end">
|
<div className="flex flex-row items-center justify-end">
|
||||||
<div className="flex flex-col items-center">
|
<div className="hidden sm:flex flex-col items-center">
|
||||||
<BiError className="w-8 h-8 text-theme-800 dark:text-theme-200" />
|
<BiError className="w-8 h-8 text-theme-800 dark:text-theme-200" />
|
||||||
<div className="flex flex-col ml-3 text-left">
|
<div className="flex flex-col ml-3 text-left">
|
||||||
<span className="text-theme-800 dark:text-theme-200 text-sm">{t("widget.api_error")}</span>
|
<span className="text-theme-800 dark:text-theme-200 text-sm">{t("widget.api_error")}</span>
|
||||||
@ -32,9 +32,9 @@ function Widget({ options }) {
|
|||||||
|
|
||||||
if (!data) {
|
if (!data) {
|
||||||
return (
|
return (
|
||||||
<div className="flex flex-col justify-center first:ml-0 ml-4">
|
<div className="flex flex-col justify-center first:ml-auto ml-4 mr-2">
|
||||||
<div className="flex flex-row items-center justify-end">
|
<div className="flex flex-row items-center justify-end">
|
||||||
<div className="flex flex-col items-center">
|
<div className="hidden sm:flex flex-col items-center">
|
||||||
<WiCloudDown className="w-8 h-8 text-theme-800 dark:text-theme-200" />
|
<WiCloudDown className="w-8 h-8 text-theme-800 dark:text-theme-200" />
|
||||||
</div>
|
</div>
|
||||||
<div className="flex flex-col ml-3 text-left">
|
<div className="flex flex-col ml-3 text-left">
|
||||||
@ -49,9 +49,9 @@ function Widget({ options }) {
|
|||||||
const unit = options.units === "metric" ? "celsius" : "fahrenheit";
|
const unit = options.units === "metric" ? "celsius" : "fahrenheit";
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="flex flex-col justify-center first:ml-0 ml-4">
|
<div className="flex flex-col justify-center first:ml-auto ml-2 mr-2">
|
||||||
<div className="flex flex-row items-center justify-end">
|
<div className="flex flex-row items-center justify-end">
|
||||||
<div className="flex flex-col items-center">
|
<div className="hidden sm:flex flex-col items-center">
|
||||||
<Icon
|
<Icon
|
||||||
condition={data.weather[0].id}
|
condition={data.weather[0].id}
|
||||||
timeOfDay={data.dt > data.sys.sunrise && data.dt < data.sys.sundown ? "day" : "night"}
|
timeOfDay={data.dt > data.sys.sunrise && data.dt < data.sys.sundown ? "day" : "night"}
|
||||||
@ -102,9 +102,13 @@ export default function OpenWeatherMap({ options }) {
|
|||||||
|
|
||||||
if (!location) {
|
if (!location) {
|
||||||
return (
|
return (
|
||||||
<button type="button" onClick={() => requestLocation()} className="flex flex-col justify-center first:ml-0 ml-4">
|
<button
|
||||||
|
type="button"
|
||||||
|
onClick={() => requestLocation()}
|
||||||
|
className="flex flex-col justify-center first:ml-auto ml-4 mr-2"
|
||||||
|
>
|
||||||
<div className="flex flex-row items-center justify-end">
|
<div className="flex flex-row items-center justify-end">
|
||||||
<div className="flex flex-col items-center">
|
<div className="hidden sm:flex flex-col items-center">
|
||||||
{requesting ? (
|
{requesting ? (
|
||||||
<MdLocationSearching className="w-6 h-6 text-theme-800 dark:text-theme-200 animate-pulse" />
|
<MdLocationSearching className="w-6 h-6 text-theme-800 dark:text-theme-200 animate-pulse" />
|
||||||
) : (
|
) : (
|
||||||
|
|||||||
@ -30,7 +30,7 @@ export default function Cpu({ expanded }) {
|
|||||||
<div className="flex flex-col ml-3 text-left min-w-[85px]">
|
<div className="flex flex-col ml-3 text-left min-w-[85px]">
|
||||||
<div className="text-theme-800 dark:text-theme-200 text-xs flex flex-row justify-between">
|
<div className="text-theme-800 dark:text-theme-200 text-xs flex flex-row justify-between">
|
||||||
<div className="pl-0.5">-</div>
|
<div className="pl-0.5">-</div>
|
||||||
<div className="pr-1">{t("docker.cpu")}</div>
|
<div className="pr-1">{t("resources.cpu")}</div>
|
||||||
</div>
|
</div>
|
||||||
{expanded && (
|
{expanded && (
|
||||||
<div className="text-theme-800 dark:text-theme-200 text-xs flex flex-row justify-between">
|
<div className="text-theme-800 dark:text-theme-200 text-xs flex flex-row justify-between">
|
||||||
@ -59,7 +59,7 @@ export default function Cpu({ expanded }) {
|
|||||||
maximumFractionDigits: 0,
|
maximumFractionDigits: 0,
|
||||||
})}
|
})}
|
||||||
</div>
|
</div>
|
||||||
<div className="pr-1">{t("docker.cpu")}</div>
|
<div className="pr-1">{t("resources.cpu")}</div>
|
||||||
</div>
|
</div>
|
||||||
{expanded && (
|
{expanded && (
|
||||||
<div className="text-theme-800 dark:text-theme-200 text-xs flex flex-row justify-between">
|
<div className="text-theme-800 dark:text-theme-200 text-xs flex flex-row justify-between">
|
||||||
|
|||||||
@ -5,7 +5,7 @@ import Memory from "./memory";
|
|||||||
export default function Resources({ options }) {
|
export default function Resources({ options }) {
|
||||||
const { expanded } = options;
|
const { expanded } = options;
|
||||||
return (
|
return (
|
||||||
<div className="flex flex-col max-w:full sm:basis-auto self-center m-auto flex-wrap">
|
<div className="flex flex-col max-w:full sm:basis-auto self-center grow-0 flex-wrap">
|
||||||
<div className="flex flex-row self-center flex-wrap justify-between">
|
<div className="flex flex-row self-center flex-wrap justify-between">
|
||||||
{options.cpu && <Cpu expanded={expanded} />}
|
{options.cpu && <Cpu expanded={expanded} />}
|
||||||
{options.memory && <Memory expanded={expanded} />}
|
{options.memory && <Memory expanded={expanded} />}
|
||||||
|
|||||||
@ -56,7 +56,7 @@ export default function Search({ options }) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<form className="flex-col relative h-8 my-4 min-w-full md:min-w-fit grow first:ml-0 ml-4" onSubmit={handleSubmit}>
|
<form className="flex-col relative h-8 my-4 min-w-fit grow first:ml-0 ml-4" onSubmit={handleSubmit}>
|
||||||
<div className="flex absolute inset-y-0 left-0 items-center pl-3 pointer-events-none w-full text-theme-800 dark:text-white" />
|
<div className="flex absolute inset-y-0 left-0 items-center pl-3 pointer-events-none w-full text-theme-800 dark:text-white" />
|
||||||
<input
|
<input
|
||||||
type="text"
|
type="text"
|
||||||
|
|||||||
137
src/components/widgets/unifi_console/unifi_console.jsx
Normal file
@ -0,0 +1,137 @@
|
|||||||
|
import { BiError, BiWifi, BiCheckCircle, BiXCircle, BiNetworkChart } from "react-icons/bi";
|
||||||
|
import { MdSettingsEthernet } from "react-icons/md";
|
||||||
|
import { useTranslation } from "next-i18next";
|
||||||
|
import { SiUbiquiti } from "react-icons/si";
|
||||||
|
|
||||||
|
import useWidgetAPI from "utils/proxy/use-widget-api";
|
||||||
|
|
||||||
|
export default function Widget({ options }) {
|
||||||
|
const { t } = useTranslation();
|
||||||
|
|
||||||
|
// eslint-disable-next-line no-param-reassign
|
||||||
|
options.type = "unifi_console";
|
||||||
|
const { data: statsData, error: statsError } = useWidgetAPI(options, "stat/sites", { index: options.index });
|
||||||
|
|
||||||
|
if (statsError || statsData?.error) {
|
||||||
|
return (
|
||||||
|
<div className="flex flex-col justify-center first:ml-0 ml-4">
|
||||||
|
<div className="flex flex-row items-center justify-end">
|
||||||
|
<div className="flex flex-col items-center">
|
||||||
|
<BiError className="w-8 h-8 text-theme-800 dark:text-theme-200" />
|
||||||
|
<div className="flex flex-col ml-3 text-left">
|
||||||
|
<span className="text-theme-800 dark:text-theme-200 text-sm">{t("widget.api_error")}</span>
|
||||||
|
<span className="text-theme-800 dark:text-theme-200 text-xs">-</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
const defaultSite = statsData?.data?.find(s => s.name === "default");
|
||||||
|
|
||||||
|
if (!defaultSite) {
|
||||||
|
return (
|
||||||
|
<div className="flex flex-col justify-center first:ml-0 ml-4">
|
||||||
|
<div className="flex flex-row items-center justify-end">
|
||||||
|
<div className="flex flex-col items-center">
|
||||||
|
<SiUbiquiti className="w-5 h-5 text-theme-800 dark:text-theme-200" />
|
||||||
|
</div>
|
||||||
|
<div className="flex flex-col ml-3 text-left">
|
||||||
|
<span className="text-theme-800 dark:text-theme-200 text-xs">{t("unifi.wait")}</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
const wan = defaultSite.health.find(h => h.subsystem === "wan");
|
||||||
|
const lan = defaultSite.health.find(h => h.subsystem === "lan");
|
||||||
|
const wlan = defaultSite.health.find(h => h.subsystem === "wlan");
|
||||||
|
[wan, lan, wlan].forEach(s => {
|
||||||
|
s.up = s.status === "ok" // eslint-disable-line no-param-reassign
|
||||||
|
s.show = s.status !== "unknown" // eslint-disable-line no-param-reassign
|
||||||
|
});
|
||||||
|
const name = wan.gw_name ?? defaultSite.desc;
|
||||||
|
const uptime = wan["gw_system-stats"] ? wan["gw_system-stats"].uptime : null;
|
||||||
|
|
||||||
|
return (
|
||||||
|
<div className="flex-none flex flex-row items-center mr-3 py-1.5">
|
||||||
|
<div className="flex flex-col">
|
||||||
|
<div className="flex flex-row ml-3 mb-0.5">
|
||||||
|
<SiUbiquiti className="text-theme-800 dark:text-theme-200 w-3 h-3 mr-1" />
|
||||||
|
<div className="text-theme-800 dark:text-theme-200 text-xs font-bold flex flex-row justify-between">
|
||||||
|
{name}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div className="flex flex-row ml-3 text-[10px] justify-between">
|
||||||
|
{uptime && <div className="flex flex-row" title={t("unifi.uptime")}>
|
||||||
|
<div className="pr-0.5 text-theme-800 dark:text-theme-200">
|
||||||
|
{t("common.number", {
|
||||||
|
value: uptime / 86400,
|
||||||
|
maximumFractionDigits: 1,
|
||||||
|
})}
|
||||||
|
</div>
|
||||||
|
<div className="pr-1 text-theme-800 dark:text-theme-200">{t("unifi.days")}</div>
|
||||||
|
</div>}
|
||||||
|
{wan.show && <div className="flex flex-row">
|
||||||
|
<div className="pr-1 text-theme-800 dark:text-theme-200">{t("unifi.wan")}</div>
|
||||||
|
{wan.up
|
||||||
|
? <BiCheckCircle className="text-theme-800 dark:text-theme-200 h-4 w-3" />
|
||||||
|
: <BiXCircle className="text-theme-800 dark:text-theme-200 h-4 w-3" />
|
||||||
|
}
|
||||||
|
</div>}
|
||||||
|
{!wan.show && !lan.show && wlan.show && <div className="flex flex-row">
|
||||||
|
<div className="pr-1 text-theme-800 dark:text-theme-200">{t("unifi.wlan")}</div>
|
||||||
|
{wlan.up
|
||||||
|
? <BiCheckCircle className="text-theme-800 dark:text-theme-200 h-4 w-3" />
|
||||||
|
: <BiXCircle className="text-theme-800 dark:text-theme-200 h-4 w-3" />
|
||||||
|
}
|
||||||
|
</div>}
|
||||||
|
{!wan.show && !wlan.show && lan.show && <div className="flex flex-row">
|
||||||
|
<div className="pr-1 text-theme-800 dark:text-theme-200">{t("unifi.lan")}</div>
|
||||||
|
{lan.up
|
||||||
|
? <BiCheckCircle className="text-theme-800 dark:text-theme-200 h-4 w-3" />
|
||||||
|
: <BiXCircle className="text-theme-800 dark:text-theme-200 h-4 w-3" />
|
||||||
|
}
|
||||||
|
</div>}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div className="flex flex-col">
|
||||||
|
{wlan.show && <div className="flex flex-row ml-3 py-0.5">
|
||||||
|
<BiWifi className="text-theme-800 dark:text-theme-200 w-4 h-4 mr-1" />
|
||||||
|
<div className="text-theme-800 dark:text-theme-200 text-xs flex flex-row justify-between" title={t("unifi.users")}>
|
||||||
|
<div className="pr-0.5">
|
||||||
|
{t("common.number", {
|
||||||
|
value: wlan.num_user,
|
||||||
|
maximumFractionDigits: 0,
|
||||||
|
})}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>}
|
||||||
|
{lan.show && <div className="flex flex-row ml-3 pb-0.5">
|
||||||
|
<MdSettingsEthernet className="text-theme-800 dark:text-theme-200 w-4 h-4 mr-1" />
|
||||||
|
<div className="text-theme-800 dark:text-theme-200 text-xs flex flex-row justify-between" title={t("unifi.users")}>
|
||||||
|
<div className="pr-0.5">
|
||||||
|
{t("common.number", {
|
||||||
|
value: lan.num_user,
|
||||||
|
maximumFractionDigits: 0,
|
||||||
|
})}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>}
|
||||||
|
{(wlan.show && !lan.show || !wlan.show && lan.show) && <div className="flex flex-row ml-3 py-0.5">
|
||||||
|
<BiNetworkChart className="text-theme-800 dark:text-theme-200 w-4 h-4 mr-1" />
|
||||||
|
<div className="text-theme-800 dark:text-theme-200 text-xs flex flex-row justify-between" title={t("unifi.devices")}>
|
||||||
|
<div className="pr-0.5">
|
||||||
|
{t("common.number", {
|
||||||
|
value: wlan.show ? wlan.num_adopted : lan.num_adopted,
|
||||||
|
maximumFractionDigits: 0,
|
||||||
|
})}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
@ -16,7 +16,7 @@ function Widget({ options }) {
|
|||||||
|
|
||||||
if (error || data?.error) {
|
if (error || data?.error) {
|
||||||
return (
|
return (
|
||||||
<div className="flex flex-col justify-center first:ml-0 ml-4">
|
<div className="flex flex-col justify-center first:ml-0 ml-4 mr-2">
|
||||||
<div className="flex flex-row items-center justify-end">
|
<div className="flex flex-row items-center justify-end">
|
||||||
<div className="flex flex-col items-center">
|
<div className="flex flex-col items-center">
|
||||||
<BiError className="w-8 h-8 text-theme-800 dark:text-theme-200" />
|
<BiError className="w-8 h-8 text-theme-800 dark:text-theme-200" />
|
||||||
@ -32,7 +32,7 @@ function Widget({ options }) {
|
|||||||
|
|
||||||
if (!data) {
|
if (!data) {
|
||||||
return (
|
return (
|
||||||
<div className="flex flex-col justify-center first:ml-0 ml-4">
|
<div className="flex flex-col justify-center first:ml-0 ml-4 mr-2">
|
||||||
<div className="flex flex-row items-center justify-end">
|
<div className="flex flex-row items-center justify-end">
|
||||||
<div className="flex flex-col items-center">
|
<div className="flex flex-col items-center">
|
||||||
<WiCloudDown className="w-8 h-8 text-theme-800 dark:text-theme-200" />
|
<WiCloudDown className="w-8 h-8 text-theme-800 dark:text-theme-200" />
|
||||||
@ -49,7 +49,7 @@ function Widget({ options }) {
|
|||||||
const unit = options.units === "metric" ? "celsius" : "fahrenheit";
|
const unit = options.units === "metric" ? "celsius" : "fahrenheit";
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="flex flex-col justify-center first:ml-0 ml-4">
|
<div className="flex flex-col justify-center first:ml-0 ml-4 mr-2">
|
||||||
<div className="flex flex-row items-center justify-end">
|
<div className="flex flex-row items-center justify-end">
|
||||||
<div className="flex flex-col items-center">
|
<div className="flex flex-col items-center">
|
||||||
<Icon condition={data.current.condition.code} timeOfDay={data.current.is_day ? "day" : "night"} />
|
<Icon condition={data.current.condition.code} timeOfDay={data.current.is_day ? "day" : "night"} />
|
||||||
@ -103,7 +103,11 @@ export default function WeatherApi({ options }) {
|
|||||||
|
|
||||||
if (!location) {
|
if (!location) {
|
||||||
return (
|
return (
|
||||||
<button type="button" onClick={() => requestLocation()} className="flex flex-col justify-center first:ml-0 ml-4">
|
<button
|
||||||
|
type="button"
|
||||||
|
onClick={() => requestLocation()}
|
||||||
|
className="flex flex-col justify-center first:ml-0 ml-4 mr-2"
|
||||||
|
>
|
||||||
<div className="flex flex-row items-center justify-end">
|
<div className="flex flex-row items-center justify-end">
|
||||||
<div className="flex flex-col items-center">
|
<div className="flex flex-col items-center">
|
||||||
{requesting ? (
|
{requesting ? (
|
||||||
|
|||||||
@ -1,5 +1,7 @@
|
|||||||
import dynamic from "next/dynamic";
|
import dynamic from "next/dynamic";
|
||||||
|
|
||||||
|
import ErrorBoundary from "components/errorboundry";
|
||||||
|
|
||||||
const widgetMappings = {
|
const widgetMappings = {
|
||||||
weatherapi: dynamic(() => import("components/widgets/weather/weather")),
|
weatherapi: dynamic(() => import("components/widgets/weather/weather")),
|
||||||
openweathermap: dynamic(() => import("components/widgets/openweathermap/weather")),
|
openweathermap: dynamic(() => import("components/widgets/openweathermap/weather")),
|
||||||
@ -7,13 +9,21 @@ const widgetMappings = {
|
|||||||
search: dynamic(() => import("components/widgets/search/search")),
|
search: dynamic(() => import("components/widgets/search/search")),
|
||||||
greeting: dynamic(() => import("components/widgets/greeting/greeting")),
|
greeting: dynamic(() => import("components/widgets/greeting/greeting")),
|
||||||
datetime: dynamic(() => import("components/widgets/datetime/datetime")),
|
datetime: dynamic(() => import("components/widgets/datetime/datetime")),
|
||||||
|
logo: dynamic(() => import("components/widgets/logo/logo"), { ssr: false }),
|
||||||
|
unifi_console: dynamic(() => import("components/widgets/unifi_console/unifi_console")),
|
||||||
|
glances: dynamic(() => import("components/widgets/glances/glances")),
|
||||||
|
openmeteo: dynamic(() => import("components/widgets/openmeteo/openmeteo")),
|
||||||
};
|
};
|
||||||
|
|
||||||
export default function Widget({ widget }) {
|
export default function Widget({ widget }) {
|
||||||
const InfoWidget = widgetMappings[widget.type];
|
const InfoWidget = widgetMappings[widget.type];
|
||||||
|
|
||||||
if (InfoWidget) {
|
if (InfoWidget) {
|
||||||
return <InfoWidget options={widget.options} />;
|
return (
|
||||||
|
<ErrorBoundary>
|
||||||
|
<InfoWidget options={widget.options} />
|
||||||
|
</ErrorBoundary>
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
return (
|
return (
|
||||||
|
|||||||
@ -8,12 +8,15 @@ export default function Document() {
|
|||||||
name="description"
|
name="description"
|
||||||
content="A highly customizable homepage (or startpage / application dashboard) with Docker and service API integrations."
|
content="A highly customizable homepage (or startpage / application dashboard) with Docker and service API integrations."
|
||||||
/>
|
/>
|
||||||
|
<meta name="apple-mobile-web-app-capable" content="yes" />
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no" />
|
||||||
|
<link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon.png?v=4" />
|
||||||
|
<link rel="icon" type="image/png" sizes="32x32" href="/favicon-32x32.png?v=4" />
|
||||||
|
<link rel="icon" type="image/png" sizes="16x16" href="/favicon-16x16.png?v=4" />
|
||||||
|
<link rel="manifest" href="/site.webmanifest?v=4" />
|
||||||
|
<link rel="mask-icon" href="/safari-pinned-tab.svg?v=4" color="#1e9cd7" />
|
||||||
</Head>
|
</Head>
|
||||||
<body
|
<body>
|
||||||
className="
|
|
||||||
relative w-full h-full bg-theme-50 dark:bg-theme-800 transition duration-150 ease-in-out
|
|
||||||
"
|
|
||||||
>
|
|
||||||
<Main />
|
<Main />
|
||||||
<NextScript />
|
<NextScript />
|
||||||
</body>
|
</body>
|
||||||
|
|||||||
@ -1,59 +0,0 @@
|
|||||||
import https from "https";
|
|
||||||
|
|
||||||
import getRawBody from "raw-body";
|
|
||||||
|
|
||||||
import { httpRequest, httpsRequest } from "utils/proxy/http";
|
|
||||||
|
|
||||||
export const config = {
|
|
||||||
api: {
|
|
||||||
bodyParser: false,
|
|
||||||
},
|
|
||||||
};
|
|
||||||
|
|
||||||
export default async function handler(req, res) {
|
|
||||||
const headers = ["X-API-Key", "Authorization"].reduce((obj, key) => {
|
|
||||||
if (req.headers && Object.prototype.hasOwnProperty.call(req.headers, key.toLowerCase())) {
|
|
||||||
// eslint-disable-next-line no-param-reassign
|
|
||||||
obj[key] = req.headers[key.toLowerCase()];
|
|
||||||
}
|
|
||||||
return obj;
|
|
||||||
}, {});
|
|
||||||
|
|
||||||
const url = new URL(req.query.url);
|
|
||||||
|
|
||||||
if (url.protocol === "https:") {
|
|
||||||
// this agent allows us to bypass the certificate check
|
|
||||||
// which is required for most self-signed certificates
|
|
||||||
const httpsAgent = new https.Agent({
|
|
||||||
rejectUnauthorized: false,
|
|
||||||
});
|
|
||||||
|
|
||||||
const [status, contentType, data] = await httpsRequest(url, {
|
|
||||||
agent: httpsAgent,
|
|
||||||
method: req.method,
|
|
||||||
headers,
|
|
||||||
body:
|
|
||||||
req.method === "GET" || req.method === "HEAD"
|
|
||||||
? null
|
|
||||||
: await getRawBody(req, {
|
|
||||||
encoding: "utf8",
|
|
||||||
}),
|
|
||||||
});
|
|
||||||
|
|
||||||
res.setHeader("Content-Type", contentType);
|
|
||||||
return res.status(status).send(data);
|
|
||||||
}
|
|
||||||
const [status, contentType, data] = await httpRequest(url, {
|
|
||||||
method: req.method,
|
|
||||||
headers,
|
|
||||||
body:
|
|
||||||
req.method === "GET" || req.method === "HEAD"
|
|
||||||
? null
|
|
||||||
: await getRawBody(req, {
|
|
||||||
encoding: "utf8",
|
|
||||||
}),
|
|
||||||
});
|
|
||||||
|
|
||||||
res.setHeader("Content-Type", contentType);
|
|
||||||
return res.status(status).send(data);
|
|
||||||
}
|
|
||||||
14
src/pages/api/theme.js
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
import checkAndCopyConfig, { getSettings } from "utils/config/config";
|
||||||
|
|
||||||
|
export default function handler({ res }) {
|
||||||
|
checkAndCopyConfig("settings.yaml");
|
||||||
|
const settings = getSettings();
|
||||||
|
|
||||||
|
const color = settings.color || "slate";
|
||||||
|
const theme = settings.theme || "dark";
|
||||||
|
|
||||||
|
return res.status(200).json({
|
||||||
|
color,
|
||||||
|
theme,
|
||||||
|
});
|
||||||
|
}
|
||||||
40
src/pages/api/widgets/glances.js
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
import { httpProxy } from "utils/proxy/http";
|
||||||
|
import createLogger from "utils/logger";
|
||||||
|
import { getPrivateWidgetOptions } from "utils/config/widget-helpers";
|
||||||
|
|
||||||
|
const logger = createLogger("glances");
|
||||||
|
|
||||||
|
export default async function handler(req, res) {
|
||||||
|
const { index } = req.query;
|
||||||
|
|
||||||
|
const privateWidgetOptions = await getPrivateWidgetOptions("glances", index);
|
||||||
|
|
||||||
|
const url = privateWidgetOptions?.url;
|
||||||
|
if (!url) {
|
||||||
|
const errorMessage = "Missing Glances URL";
|
||||||
|
logger.error(errorMessage);
|
||||||
|
return res.status(400).json({ error: errorMessage });
|
||||||
|
}
|
||||||
|
|
||||||
|
const apiUrl = `${url}/api/3/quicklook`;
|
||||||
|
const headers = {
|
||||||
|
"Accept-Encoding": "application/json"
|
||||||
|
};
|
||||||
|
if (privateWidgetOptions.username && privateWidgetOptions.password) {
|
||||||
|
headers.Authorization = `Basic ${Buffer.from(`${privateWidgetOptions.username}:${privateWidgetOptions.password}`).toString("base64")}`
|
||||||
|
}
|
||||||
|
const params = { method: "GET", headers };
|
||||||
|
|
||||||
|
const [status, contentType, data] = await httpProxy(apiUrl, params);
|
||||||
|
|
||||||
|
if (status === 401) {
|
||||||
|
logger.error("Authorization failure getting data from glances API. Data: %s", data);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (status !== 200) {
|
||||||
|
logger.error("HTTP %d getting data from glances API. Data: %s", status, data);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (contentType) res.setHeader("Content-Type", contentType);
|
||||||
|
return res.status(status).send(data);
|
||||||
|
}
|
||||||
8
src/pages/api/widgets/openmeteo.js
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
import cachedFetch from "utils/proxy/cached-fetch";
|
||||||
|
|
||||||
|
export default async function handler(req, res) {
|
||||||
|
const { latitude, longitude, units, cache } = req.query;
|
||||||
|
const degrees = units === "imperial" ? "fahrenheit" : "celsius";
|
||||||
|
const apiUrl = `https://api.open-meteo.com/v1/forecast?latitude=${latitude}&longitude=${longitude}&daily=sunrise,sunset¤t_weather=true&temperature_unit=${degrees}&timezone=auto`;
|
||||||
|
return res.send(await cachedFetch(apiUrl, cache));
|
||||||
|
}
|
||||||
29
src/pages/browserconfig.xml.jsx
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
import { getSettings } from "utils/config/config";
|
||||||
|
import themes from "utils/styles/themes";
|
||||||
|
|
||||||
|
export async function getServerSideProps({ res }) {
|
||||||
|
const settings = getSettings();
|
||||||
|
|
||||||
|
const color = settings.color || "slate";
|
||||||
|
const theme = settings.theme || "dark";
|
||||||
|
|
||||||
|
const xml = `<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<browserconfig>
|
||||||
|
<msapplication>
|
||||||
|
<tile>
|
||||||
|
<square150x150logo src="/mstile-150x150.png?v=2"/>
|
||||||
|
<TileColor>${themes[color][theme]}</TileColor>
|
||||||
|
</tile>
|
||||||
|
</msapplication>
|
||||||
|
</browserconfig>`;
|
||||||
|
|
||||||
|
res.setHeader("Content-Type", "text/xml");
|
||||||
|
res.write(xml);
|
||||||
|
res.end();
|
||||||
|
|
||||||
|
return {
|
||||||
|
props: {},
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
export default function BrowserConfig() {}
|
||||||
@ -2,6 +2,7 @@
|
|||||||
import useSWR, { SWRConfig } from "swr";
|
import useSWR, { SWRConfig } from "swr";
|
||||||
import Head from "next/head";
|
import Head from "next/head";
|
||||||
import dynamic from "next/dynamic";
|
import dynamic from "next/dynamic";
|
||||||
|
import classNames from "classnames";
|
||||||
import { useTranslation } from "next-i18next";
|
import { useTranslation } from "next-i18next";
|
||||||
import { useEffect, useContext, useState } from "react";
|
import { useEffect, useContext, useState } from "react";
|
||||||
import { BiError } from "react-icons/bi";
|
import { BiError } from "react-icons/bi";
|
||||||
@ -12,12 +13,15 @@ import BookmarksGroup from "components/bookmarks/group";
|
|||||||
import Widget from "components/widgets/widget";
|
import Widget from "components/widgets/widget";
|
||||||
import Revalidate from "components/toggles/revalidate";
|
import Revalidate from "components/toggles/revalidate";
|
||||||
import createLogger from "utils/logger";
|
import createLogger from "utils/logger";
|
||||||
|
import useWindowFocus from "utils/hooks/window-focus";
|
||||||
import { getSettings } from "utils/config/config";
|
import { getSettings } from "utils/config/config";
|
||||||
import { ColorContext } from "utils/contexts/color";
|
import { ColorContext } from "utils/contexts/color";
|
||||||
import { ThemeContext } from "utils/contexts/theme";
|
import { ThemeContext } from "utils/contexts/theme";
|
||||||
import { SettingsContext } from "utils/contexts/settings";
|
import { SettingsContext } from "utils/contexts/settings";
|
||||||
import { bookmarksResponse, servicesResponse, widgetsResponse } from "utils/config/api-response";
|
import { bookmarksResponse, servicesResponse, widgetsResponse } from "utils/config/api-response";
|
||||||
import useWindowFocus from "utils/hooks/window-focus";
|
import ErrorBoundary from "components/errorboundry";
|
||||||
|
import themes from "utils/styles/themes";
|
||||||
|
import QuickLaunch from "components/quicklaunch";
|
||||||
|
|
||||||
const ThemeToggle = dynamic(() => import("components/toggles/theme"), {
|
const ThemeToggle = dynamic(() => import("components/toggles/theme"), {
|
||||||
ssr: false,
|
ssr: false,
|
||||||
@ -74,7 +78,7 @@ export async function getStaticProps() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export default function Index({ initialSettings, fallback }) {
|
function Index({ initialSettings, fallback }) {
|
||||||
const windowFocused = useWindowFocus();
|
const windowFocused = useWindowFocus();
|
||||||
const [stale, setStale] = useState(false);
|
const [stale, setStale] = useState(false);
|
||||||
const { data: errorsData } = useSWR("/api/validate");
|
const { data: errorsData } = useSWR("/api/validate");
|
||||||
@ -119,7 +123,7 @@ export default function Index({ initialSettings, fallback }) {
|
|||||||
|
|
||||||
if (errorsData && errorsData.length > 0) {
|
if (errorsData && errorsData.length > 0) {
|
||||||
return (
|
return (
|
||||||
<div className="w-full container m-auto justify-center p-10">
|
<div className="w-full h-screen container m-auto justify-center p-10 pointer-events-none">
|
||||||
<div className="flex flex-col">
|
<div className="flex flex-col">
|
||||||
{errorsData.map((error, i) => (
|
{errorsData.map((error, i) => (
|
||||||
<div
|
<div
|
||||||
@ -143,11 +147,20 @@ export default function Index({ initialSettings, fallback }) {
|
|||||||
|
|
||||||
return (
|
return (
|
||||||
<SWRConfig value={{ fallback, fetcher: (resource, init) => fetch(resource, init).then((res) => res.json()) }}>
|
<SWRConfig value={{ fallback, fetcher: (resource, init) => fetch(resource, init).then((res) => res.json()) }}>
|
||||||
|
<ErrorBoundary>
|
||||||
<Home initialSettings={initialSettings} />
|
<Home initialSettings={initialSettings} />
|
||||||
|
</ErrorBoundary>
|
||||||
</SWRConfig>
|
</SWRConfig>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const headerStyles = {
|
||||||
|
boxed:
|
||||||
|
"m-4 mb-0 sm:m-8 sm:mb-0 rounded-md shadow-md shadow-theme-900/10 dark:shadow-theme-900/20 bg-theme-100/20 dark:bg-white/5 p-3",
|
||||||
|
underlined: "m-4 mb-0 sm:m-8 sm:mb-1 border-b-2 pb-4 border-theme-800 dark:border-theme-200/50",
|
||||||
|
clean: "m-4 mb-0 sm:m-8 sm:mb-0",
|
||||||
|
};
|
||||||
|
|
||||||
function Home({ initialSettings }) {
|
function Home({ initialSettings }) {
|
||||||
const { i18n } = useTranslation();
|
const { i18n } = useTranslation();
|
||||||
const { theme, setTheme } = useContext(ThemeContext);
|
const { theme, setTheme } = useContext(ThemeContext);
|
||||||
@ -162,12 +175,7 @@ function Home({ initialSettings }) {
|
|||||||
const { data: bookmarks } = useSWR("/api/bookmarks");
|
const { data: bookmarks } = useSWR("/api/bookmarks");
|
||||||
const { data: widgets } = useSWR("/api/widgets");
|
const { data: widgets } = useSWR("/api/widgets");
|
||||||
|
|
||||||
const wrappedStyle = {};
|
const servicesAndBookmarks = [...services.map(sg => sg.services).flat(), ...bookmarks.map(bg => bg.bookmarks).flat()]
|
||||||
if (settings && settings.background) {
|
|
||||||
wrappedStyle.backgroundImage = `url(${settings.background})`;
|
|
||||||
wrappedStyle.backgroundSize = "cover";
|
|
||||||
wrappedStyle.opacity = settings.backgroundOpacity ?? 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
if (settings.language) {
|
if (settings.language) {
|
||||||
@ -183,16 +191,59 @@ function Home({ initialSettings }) {
|
|||||||
}
|
}
|
||||||
}, [i18n, settings, color, setColor, theme, setTheme]);
|
}, [i18n, settings, color, setColor, theme, setTheme]);
|
||||||
|
|
||||||
|
const [searching, setSearching] = useState(false);
|
||||||
|
const [searchString, setSearchString] = useState("");
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
function handleKeyDown(e) {
|
||||||
|
if (e.target.tagName === "BODY") {
|
||||||
|
if (String.fromCharCode(e.keyCode).match(/(\w|\s)/g) && !(e.altKey || e.ctrlKey || e.metaKey || e.shiftKey)) {
|
||||||
|
setSearching(true);
|
||||||
|
} else if (e.key === "Escape") {
|
||||||
|
setSearchString("");
|
||||||
|
setSearching(false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
document.addEventListener('keydown', handleKeyDown);
|
||||||
|
|
||||||
|
return function cleanup() {
|
||||||
|
document.removeEventListener('keydown', handleKeyDown);
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
<Head>
|
<Head>
|
||||||
<title>{settings.title || "Homepage"}</title>
|
<title>{initialSettings.title || "Homepage"}</title>
|
||||||
{settings.base && <base href={settings.base} />}
|
{initialSettings.base && <base href={initialSettings.base} />}
|
||||||
{settings.favicon && <link rel="icon" href={settings.favicon} />}
|
{initialSettings.favicon ? (
|
||||||
|
<link rel="icon" href={initialSettings.favicon} />
|
||||||
|
) : (
|
||||||
|
<link rel="shortcut icon" href="/homepage.ico" />
|
||||||
|
)}
|
||||||
|
<meta
|
||||||
|
name="msapplication-TileColor"
|
||||||
|
content={themes[initialSettings.color || "slate"][initialSettings.theme || "dark"]}
|
||||||
|
/>
|
||||||
|
<meta name="theme-color" content={themes[initialSettings.color || "slate"][initialSettings.theme || "dark"]} />
|
||||||
</Head>
|
</Head>
|
||||||
<div className="fixed w-full h-full m-0 p-0" style={wrappedStyle} />
|
<div className="relative container m-auto flex flex-col justify-between z-10">
|
||||||
<div className="relative w-full container m-auto flex flex-col h-screen justify-between">
|
<div
|
||||||
<div className="flex flex-row flex-wrap m-8 pb-4 mt-10 border-b-2 border-theme-800 dark:border-theme-200 justify-between">
|
className={classNames(
|
||||||
|
"flex flex-row flex-wrap justify-between",
|
||||||
|
headerStyles[initialSettings.headerStyle || "underlined"]
|
||||||
|
)}
|
||||||
|
>
|
||||||
|
<QuickLaunch
|
||||||
|
servicesAndBookmarks={servicesAndBookmarks}
|
||||||
|
searchString={searchString}
|
||||||
|
setSearchString={setSearchString}
|
||||||
|
isOpen={searching}
|
||||||
|
close={setSearching}
|
||||||
|
searchDescriptions={settings.quicklaunch?.searchDescriptions}
|
||||||
|
/>
|
||||||
{widgets && (
|
{widgets && (
|
||||||
<>
|
<>
|
||||||
{widgets
|
{widgets
|
||||||
@ -201,7 +252,7 @@ function Home({ initialSettings }) {
|
|||||||
<Widget key={i} widget={widget} />
|
<Widget key={i} widget={widget} />
|
||||||
))}
|
))}
|
||||||
|
|
||||||
<div className="ml-4 flex flex-wrap basis-full grow sm:basis-auto justify-between md:justify-end mt-2 md:mt-0">
|
<div className="m-auto sm:ml-2 flex flex-wrap grow sm:basis-auto justify-between md:justify-end">
|
||||||
{widgets
|
{widgets
|
||||||
.filter((widget) => rightAlignedWidgets.includes(widget.type))
|
.filter((widget) => rightAlignedWidgets.includes(widget.type))
|
||||||
.map((widget, i) => (
|
.map((widget, i) => (
|
||||||
@ -213,15 +264,15 @@ function Home({ initialSettings }) {
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
{services && (
|
{services && (
|
||||||
<div className="flex flex-wrap p-8 items-start">
|
<div className="flex flex-wrap p-4 sm:p-8 sm:pt-4 items-start pb-2">
|
||||||
{services.map((group) => (
|
{services.map((group) => (
|
||||||
<ServicesGroup key={group.name} services={group} layout={settings.layout?.[group.name]} />
|
<ServicesGroup key={group.name} services={group} layout={initialSettings.layout?.[group.name]} />
|
||||||
))}
|
))}
|
||||||
</div>
|
</div>
|
||||||
)}
|
)}
|
||||||
|
|
||||||
{bookmarks && (
|
{bookmarks && (
|
||||||
<div className="grow flex flex-wrap pt-0 p-8">
|
<div className="grow flex flex-wrap pt-0 p-4 sm:p-8">
|
||||||
{bookmarks.map((group) => (
|
{bookmarks.map((group) => (
|
||||||
<BookmarksGroup key={group.name} group={group} />
|
<BookmarksGroup key={group.name} group={group} />
|
||||||
))}
|
))}
|
||||||
@ -229,9 +280,9 @@ function Home({ initialSettings }) {
|
|||||||
)}
|
)}
|
||||||
|
|
||||||
<div className="flex p-8 pb-0 w-full justify-end">
|
<div className="flex p-8 pb-0 w-full justify-end">
|
||||||
{!settings?.color && <ColorToggle />}
|
{!initialSettings?.color && <ColorToggle />}
|
||||||
<Revalidate />
|
<Revalidate />
|
||||||
{!settings?.theme && <ThemeToggle />}
|
{!initialSettings?.theme && <ThemeToggle />}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div className="flex p-8 pt-4 w-full justify-end">
|
<div className="flex p-8 pt-4 w-full justify-end">
|
||||||
@ -241,3 +292,38 @@ function Home({ initialSettings }) {
|
|||||||
</>
|
</>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export default function Wrapper({ initialSettings, fallback }) {
|
||||||
|
const wrappedStyle = {};
|
||||||
|
if (initialSettings && initialSettings.background) {
|
||||||
|
const opacity = initialSettings.backgroundOpacity ?? 1;
|
||||||
|
const opacityValue = 1 - opacity;
|
||||||
|
wrappedStyle.backgroundImage = `
|
||||||
|
linear-gradient(
|
||||||
|
rgb(var(--bg-color) / ${opacityValue}),
|
||||||
|
rgb(var(--bg-color) / ${opacityValue})
|
||||||
|
),
|
||||||
|
url(${initialSettings.background})`;
|
||||||
|
wrappedStyle.backgroundPosition = "center";
|
||||||
|
wrappedStyle.backgroundSize = "cover";
|
||||||
|
}
|
||||||
|
|
||||||
|
return (
|
||||||
|
<div
|
||||||
|
id="page_wrapper"
|
||||||
|
className={classNames(
|
||||||
|
"relative",
|
||||||
|
initialSettings.theme && initialSettings.theme,
|
||||||
|
initialSettings.color && `theme-${initialSettings.color}`
|
||||||
|
)}
|
||||||
|
>
|
||||||
|
<div
|
||||||
|
id="page_container"
|
||||||
|
className="fixed overflow-auto w-full h-full bg-theme-50 dark:bg-theme-800 transition-all"
|
||||||
|
style={wrappedStyle}
|
||||||
|
>
|
||||||
|
<Index initialSettings={initialSettings} fallback={fallback} />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|||||||
42
src/pages/site.webmanifest.jsx
Normal file
@ -0,0 +1,42 @@
|
|||||||
|
import checkAndCopyConfig, { getSettings } from "utils/config/config";
|
||||||
|
import themes from "utils/styles/themes";
|
||||||
|
|
||||||
|
export async function getServerSideProps({ res }) {
|
||||||
|
checkAndCopyConfig("settings.yaml");
|
||||||
|
const settings = getSettings();
|
||||||
|
|
||||||
|
const color = settings.color || "slate";
|
||||||
|
const theme = settings.theme || "dark";
|
||||||
|
|
||||||
|
const manifest = {
|
||||||
|
name: settings.title || "Homepage",
|
||||||
|
short_name: settings.title || "Homepage",
|
||||||
|
icons: [
|
||||||
|
{
|
||||||
|
src: "/android-chrome-192x192.png?v=2",
|
||||||
|
sizes: "192x192",
|
||||||
|
type: "image/png",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
src: "/android-chrome-512x512.png?v=2",
|
||||||
|
sizes: "512x512",
|
||||||
|
type: "image/png",
|
||||||
|
},
|
||||||
|
],
|
||||||
|
theme_color: themes[color][theme],
|
||||||
|
background_color: themes[color][theme],
|
||||||
|
display: "standalone",
|
||||||
|
};
|
||||||
|
|
||||||
|
res.setHeader("Content-Type", "application/manifest+json");
|
||||||
|
res.write(JSON.stringify(manifest));
|
||||||
|
res.end();
|
||||||
|
|
||||||
|
return {
|
||||||
|
props: {},
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
export default function Webmanifest() {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
BIN
src/styles/font/Manrope.ttf
Normal file
@ -9,33 +9,48 @@
|
|||||||
padding: 0;
|
padding: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
html,
|
||||||
body {
|
body {
|
||||||
font-family: Manrope, "Manrope-Fallback", Arial, sans-serif;
|
font-family: Manrope, "Manrope-Fallback", Arial, sans-serif;
|
||||||
overflow: overlay;
|
overflow: hidden;
|
||||||
|
text-rendering: optimizeLegibility;
|
||||||
|
-webkit-font-smoothing: antialiased;
|
||||||
|
-moz-osx-font-smoothing: grayscale;
|
||||||
}
|
}
|
||||||
|
|
||||||
.light body::-webkit-scrollbar {
|
#page_wrapper {
|
||||||
|
width: 100vw;
|
||||||
|
height: 100vh;
|
||||||
|
margin: 0;
|
||||||
|
padding: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.light {
|
||||||
|
--bg-color: var(--color-50);
|
||||||
|
--scrollbar-thumb: rgb(var(--color-300));
|
||||||
|
--scrollbar-track: rgb(var(--color-200));
|
||||||
|
}
|
||||||
|
|
||||||
|
.dark {
|
||||||
|
--bg-color: var(--color-800);
|
||||||
|
--scrollbar-thumb: rgb(var(--color-600));
|
||||||
|
--scrollbar-track: rgb(var(--color-700));
|
||||||
|
}
|
||||||
|
|
||||||
|
#page_container {
|
||||||
|
overflow: auto;
|
||||||
|
scrollbar-color: var(--scrollbar-thumb) var(--scrollbar-track);
|
||||||
|
}
|
||||||
|
|
||||||
|
::-webkit-scrollbar {
|
||||||
width: 0.75em;
|
width: 0.75em;
|
||||||
}
|
}
|
||||||
|
|
||||||
.light body::-webkit-scrollbar-track {
|
::-webkit-scrollbar-track {
|
||||||
background-color: rgb(var(--color-200));
|
background-color: var(--scrollbar-track);
|
||||||
}
|
}
|
||||||
|
|
||||||
.light body::-webkit-scrollbar-thumb {
|
::-webkit-scrollbar-thumb {
|
||||||
background-color: rgb(var(--color-300));
|
background-color: var(--scrollbar-thumb);
|
||||||
border-radius: 0.25em;
|
|
||||||
}
|
|
||||||
|
|
||||||
.dark body::-webkit-scrollbar {
|
|
||||||
width: 0.75em;
|
|
||||||
}
|
|
||||||
|
|
||||||
.dark body::-webkit-scrollbar-track {
|
|
||||||
background-color: rgb(var(--color-700));
|
|
||||||
}
|
|
||||||
|
|
||||||
.dark body::-webkit-scrollbar-thumb {
|
|
||||||
background-color: rgb(var(--color-600));
|
|
||||||
border-radius: 0.25em;
|
border-radius: 0.25em;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -13,49 +13,16 @@
|
|||||||
|
|
||||||
@font-face {
|
@font-face {
|
||||||
font-family: "Manrope";
|
font-family: "Manrope";
|
||||||
font-weight: 200;
|
font-weight: 200 800;
|
||||||
src: local("Manrope"), url("./font/Manrope.woff2") format("woff2");
|
font-style: normal;
|
||||||
|
src: local("Manrope"), url("./font/Manrope.woff2") format("woff2"), url("./font/Manrope.ttf") format("ttf");
|
||||||
font-display: swap;
|
font-display: swap;
|
||||||
}
|
}
|
||||||
|
|
||||||
@font-face {
|
@font-face {
|
||||||
font-family: "Manrope";
|
font-family: "Manrope";
|
||||||
font-weight: 300;
|
font-weight: 200 800;
|
||||||
src: local("Manrope"), url("./font/Manrope.woff2") format("woff2");
|
fint-style: italic;
|
||||||
font-display: swap;
|
src: local("Manrope"), url("./font/Manrope.woff2") format("woff2"), url("./font/Manrope.ttf") format("ttf");
|
||||||
}
|
|
||||||
|
|
||||||
@font-face {
|
|
||||||
font-family: "Manrope";
|
|
||||||
font-weight: 400;
|
|
||||||
src: local("Manrope"), url("./font/Manrope.woff2") format("woff2");
|
|
||||||
font-display: swap;
|
|
||||||
}
|
|
||||||
|
|
||||||
@font-face {
|
|
||||||
font-family: "Manrope";
|
|
||||||
font-weight: 500;
|
|
||||||
src: local("Manrope"), url("./font/Manrope.woff2") format("woff2");
|
|
||||||
font-display: swap;
|
|
||||||
}
|
|
||||||
|
|
||||||
@font-face {
|
|
||||||
font-family: "Manrope";
|
|
||||||
font-weight: 600;
|
|
||||||
src: local("Manrope"), url("./font/Manrope.woff2") format("woff2");
|
|
||||||
font-display: swap;
|
|
||||||
}
|
|
||||||
|
|
||||||
@font-face {
|
|
||||||
font-family: "Manrope";
|
|
||||||
font-weight: 700;
|
|
||||||
src: local("Manrope"), url("./font/Manrope.woff2") format("woff2");
|
|
||||||
font-display: swap;
|
|
||||||
}
|
|
||||||
|
|
||||||
@font-face {
|
|
||||||
font-family: "Manrope";
|
|
||||||
font-weight: 800;
|
|
||||||
src: local("Manrope"), url("./font/Manrope.woff2") format("woff2");
|
|
||||||
font-display: swap;
|
font-display: swap;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -9,6 +9,9 @@
|
|||||||
--color-700: 40 40 40;
|
--color-700: 40 40 40;
|
||||||
--color-800: 255 255 255;
|
--color-800: 255 255 255;
|
||||||
--color-900: 255 255 255;
|
--color-900: 255 255 255;
|
||||||
|
|
||||||
|
--color-logo-start: 128 128 128 / 20%;
|
||||||
|
--color-logo-stop: 128 128 128 / 40%;
|
||||||
}
|
}
|
||||||
|
|
||||||
.theme-slate {
|
.theme-slate {
|
||||||
@ -22,6 +25,9 @@
|
|||||||
--color-700: 51 65 85;
|
--color-700: 51 65 85;
|
||||||
--color-800: 30 41 59;
|
--color-800: 30 41 59;
|
||||||
--color-900: 15 23 42;
|
--color-900: 15 23 42;
|
||||||
|
|
||||||
|
--color-logo-start: 148 163 184;
|
||||||
|
--color-logo-stop: 51 65 85;
|
||||||
}
|
}
|
||||||
|
|
||||||
.theme-gray {
|
.theme-gray {
|
||||||
@ -35,6 +41,9 @@
|
|||||||
--color-700: 55 65 81;
|
--color-700: 55 65 81;
|
||||||
--color-800: 31 41 55;
|
--color-800: 31 41 55;
|
||||||
--color-900: 17 24 39;
|
--color-900: 17 24 39;
|
||||||
|
|
||||||
|
--color-logo-start: 156 163 175;
|
||||||
|
--color-logo-stop: 55 65 81;
|
||||||
}
|
}
|
||||||
|
|
||||||
.theme-zinc {
|
.theme-zinc {
|
||||||
@ -48,6 +57,9 @@
|
|||||||
--color-700: 63 63 70;
|
--color-700: 63 63 70;
|
||||||
--color-800: 39 39 42;
|
--color-800: 39 39 42;
|
||||||
--color-900: 24 24 27;
|
--color-900: 24 24 27;
|
||||||
|
|
||||||
|
--color-logo-start: 161 161 170;
|
||||||
|
--color-logo-stop: 63 63 70;
|
||||||
}
|
}
|
||||||
|
|
||||||
.theme-neutral {
|
.theme-neutral {
|
||||||
@ -61,6 +73,9 @@
|
|||||||
--color-700: 64 64 64;
|
--color-700: 64 64 64;
|
||||||
--color-800: 38 38 38;
|
--color-800: 38 38 38;
|
||||||
--color-900: 23 23 23;
|
--color-900: 23 23 23;
|
||||||
|
|
||||||
|
--color-logo-start: 163 163 163;
|
||||||
|
--color-logo-stop: 64 64 64;
|
||||||
}
|
}
|
||||||
|
|
||||||
.theme-stone {
|
.theme-stone {
|
||||||
@ -74,6 +89,9 @@
|
|||||||
--color-700: 68 64 60;
|
--color-700: 68 64 60;
|
||||||
--color-800: 41 37 36;
|
--color-800: 41 37 36;
|
||||||
--color-900: 28 25 23;
|
--color-900: 28 25 23;
|
||||||
|
|
||||||
|
--color-logo-start: 168 162 158;
|
||||||
|
--color-logo-stop: 68 64 60;
|
||||||
}
|
}
|
||||||
|
|
||||||
.theme-red {
|
.theme-red {
|
||||||
@ -87,6 +105,9 @@
|
|||||||
--color-700: 185 28 28;
|
--color-700: 185 28 28;
|
||||||
--color-800: 153 27 27;
|
--color-800: 153 27 27;
|
||||||
--color-900: 127 29 29;
|
--color-900: 127 29 29;
|
||||||
|
|
||||||
|
--color-logo-start: 248 113 113;
|
||||||
|
--color-logo-stop: 185 28 28;
|
||||||
}
|
}
|
||||||
|
|
||||||
.theme-orange {
|
.theme-orange {
|
||||||
@ -100,6 +121,9 @@
|
|||||||
--color-700: 194 65 12;
|
--color-700: 194 65 12;
|
||||||
--color-800: 154 52 18;
|
--color-800: 154 52 18;
|
||||||
--color-900: 124 45 18;
|
--color-900: 124 45 18;
|
||||||
|
|
||||||
|
--color-logo-start: 251 146 60;
|
||||||
|
--color-logo-stop: 194 65 12;
|
||||||
}
|
}
|
||||||
|
|
||||||
.theme-amber {
|
.theme-amber {
|
||||||
@ -113,6 +137,9 @@
|
|||||||
--color-700: 180 83 9;
|
--color-700: 180 83 9;
|
||||||
--color-800: 146 64 14;
|
--color-800: 146 64 14;
|
||||||
--color-900: 120 53 15;
|
--color-900: 120 53 15;
|
||||||
|
|
||||||
|
--color-logo-start: 251 191 36;
|
||||||
|
--color-logo-stop: 180 83 9;
|
||||||
}
|
}
|
||||||
|
|
||||||
.theme-yellow {
|
.theme-yellow {
|
||||||
@ -126,6 +153,9 @@
|
|||||||
--color-700: 161 98 7;
|
--color-700: 161 98 7;
|
||||||
--color-800: 133 77 14;
|
--color-800: 133 77 14;
|
||||||
--color-900: 113 63 18;
|
--color-900: 113 63 18;
|
||||||
|
|
||||||
|
--color-logo-start: 250 204 21;
|
||||||
|
--color-logo-stop: 161 98 7;
|
||||||
}
|
}
|
||||||
|
|
||||||
.theme-lime {
|
.theme-lime {
|
||||||
@ -139,6 +169,9 @@
|
|||||||
--color-700: 77 124 15;
|
--color-700: 77 124 15;
|
||||||
--color-800: 63 98 18;
|
--color-800: 63 98 18;
|
||||||
--color-900: 54 83 20;
|
--color-900: 54 83 20;
|
||||||
|
|
||||||
|
--color-logo-start: 163 230 53;
|
||||||
|
--color-logo-stop: 77 124 15;
|
||||||
}
|
}
|
||||||
|
|
||||||
.theme-green {
|
.theme-green {
|
||||||
@ -152,6 +185,9 @@
|
|||||||
--color-700: 21 128 61;
|
--color-700: 21 128 61;
|
||||||
--color-800: 22 101 52;
|
--color-800: 22 101 52;
|
||||||
--color-900: 20 83 45;
|
--color-900: 20 83 45;
|
||||||
|
|
||||||
|
--color-logo-start: 74 222 128;
|
||||||
|
--color-logo-stop: 21 128 61;
|
||||||
}
|
}
|
||||||
|
|
||||||
.theme-emerald {
|
.theme-emerald {
|
||||||
@ -165,6 +201,9 @@
|
|||||||
--color-700: 4 120 87;
|
--color-700: 4 120 87;
|
||||||
--color-800: 6 95 70;
|
--color-800: 6 95 70;
|
||||||
--color-900: 6 78 59;
|
--color-900: 6 78 59;
|
||||||
|
|
||||||
|
--color-logo-start: 52 211 153;
|
||||||
|
--color-logo-stop: 4 120 87;
|
||||||
}
|
}
|
||||||
|
|
||||||
.theme-teal {
|
.theme-teal {
|
||||||
@ -178,6 +217,9 @@
|
|||||||
--color-700: 15 118 110;
|
--color-700: 15 118 110;
|
||||||
--color-800: 17 94 89;
|
--color-800: 17 94 89;
|
||||||
--color-900: 19 78 74;
|
--color-900: 19 78 74;
|
||||||
|
|
||||||
|
--color-logo-start: 45 212 191;
|
||||||
|
--color-logo-stop: 15 118 110;
|
||||||
}
|
}
|
||||||
|
|
||||||
.theme-cyan {
|
.theme-cyan {
|
||||||
@ -191,6 +233,9 @@
|
|||||||
--color-700: 14 116 144;
|
--color-700: 14 116 144;
|
||||||
--color-800: 21 94 117;
|
--color-800: 21 94 117;
|
||||||
--color-900: 22 78 99;
|
--color-900: 22 78 99;
|
||||||
|
|
||||||
|
--color-logo-start: 34 211 238;
|
||||||
|
--color-logo-stop: 14 116 144;
|
||||||
}
|
}
|
||||||
|
|
||||||
.theme-sky {
|
.theme-sky {
|
||||||
@ -204,6 +249,9 @@
|
|||||||
--color-700: 3 105 161;
|
--color-700: 3 105 161;
|
||||||
--color-800: 7 89 133;
|
--color-800: 7 89 133;
|
||||||
--color-900: 12 74 110;
|
--color-900: 12 74 110;
|
||||||
|
|
||||||
|
--color-logo-start: 56 189 248;
|
||||||
|
--color-logo-stop: 3 105 161;
|
||||||
}
|
}
|
||||||
|
|
||||||
.theme-blue {
|
.theme-blue {
|
||||||
@ -217,6 +265,9 @@
|
|||||||
--color-700: 29 78 216;
|
--color-700: 29 78 216;
|
||||||
--color-800: 30 64 175;
|
--color-800: 30 64 175;
|
||||||
--color-900: 30 58 138;
|
--color-900: 30 58 138;
|
||||||
|
|
||||||
|
--color-logo-start: 96 165 250;
|
||||||
|
--color-logo-stop: 29 78 216;
|
||||||
}
|
}
|
||||||
|
|
||||||
.theme-indigo {
|
.theme-indigo {
|
||||||
@ -230,6 +281,9 @@
|
|||||||
--color-700: 67 56 202;
|
--color-700: 67 56 202;
|
||||||
--color-800: 55 48 163;
|
--color-800: 55 48 163;
|
||||||
--color-900: 49 46 129;
|
--color-900: 49 46 129;
|
||||||
|
|
||||||
|
--color-logo-start: 129 140 248;
|
||||||
|
--color-logo-stop: 67 56 202;
|
||||||
}
|
}
|
||||||
|
|
||||||
.theme-violet {
|
.theme-violet {
|
||||||
@ -243,6 +297,9 @@
|
|||||||
--color-700: 109 40 217;
|
--color-700: 109 40 217;
|
||||||
--color-800: 91 33 182;
|
--color-800: 91 33 182;
|
||||||
--color-900: 76 29 149;
|
--color-900: 76 29 149;
|
||||||
|
|
||||||
|
--color-logo-start: 167 139 250;
|
||||||
|
--color-logo-stop: 109 40 217;
|
||||||
}
|
}
|
||||||
|
|
||||||
.theme-purple {
|
.theme-purple {
|
||||||
@ -256,6 +313,9 @@
|
|||||||
--color-700: 126 34 206;
|
--color-700: 126 34 206;
|
||||||
--color-800: 107 33 168;
|
--color-800: 107 33 168;
|
||||||
--color-900: 88 28 135;
|
--color-900: 88 28 135;
|
||||||
|
|
||||||
|
--color-logo-start: 192 132 252;
|
||||||
|
--color-logo-stop: 126 34 206;
|
||||||
}
|
}
|
||||||
|
|
||||||
.theme-fuchsia {
|
.theme-fuchsia {
|
||||||
@ -269,6 +329,9 @@
|
|||||||
--color-700: 162 28 175;
|
--color-700: 162 28 175;
|
||||||
--color-800: 134 25 143;
|
--color-800: 134 25 143;
|
||||||
--color-900: 112 26 117;
|
--color-900: 112 26 117;
|
||||||
|
|
||||||
|
--color-logo-start: 232 121 249;
|
||||||
|
--color-logo-stop: 162 28 175;
|
||||||
}
|
}
|
||||||
|
|
||||||
.theme-pink {
|
.theme-pink {
|
||||||
@ -282,6 +345,9 @@
|
|||||||
--color-700: 190 24 93;
|
--color-700: 190 24 93;
|
||||||
--color-800: 157 23 77;
|
--color-800: 157 23 77;
|
||||||
--color-900: 131 24 67;
|
--color-900: 131 24 67;
|
||||||
|
|
||||||
|
--color-logo-start: 244 114 182;
|
||||||
|
--color-logo-stop: 190 24 93;
|
||||||
}
|
}
|
||||||
|
|
||||||
.theme-rose {
|
.theme-rose {
|
||||||
@ -295,4 +361,7 @@
|
|||||||
--color-700: 190 18 60;
|
--color-700: 190 18 60;
|
||||||
--color-800: 159 18 57;
|
--color-800: 159 18 57;
|
||||||
--color-900: 136 19 55;
|
--color-900: 136 19 55;
|
||||||
|
|
||||||
|
--color-logo-start: 251 113 133;
|
||||||
|
--color-logo-stop: 190 18 60;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -6,6 +6,7 @@ import yaml from "js-yaml";
|
|||||||
|
|
||||||
import checkAndCopyConfig from "utils/config/config";
|
import checkAndCopyConfig from "utils/config/config";
|
||||||
import { servicesFromConfig, servicesFromDocker, cleanServiceGroups } from "utils/config/service-helpers";
|
import { servicesFromConfig, servicesFromDocker, cleanServiceGroups } from "utils/config/service-helpers";
|
||||||
|
import { cleanWidgetGroups, widgetsFromConfig } from "utils/config/widget-helpers";
|
||||||
|
|
||||||
export async function bookmarksResponse() {
|
export async function bookmarksResponse() {
|
||||||
checkAndCopyConfig("bookmarks.yaml");
|
checkAndCopyConfig("bookmarks.yaml");
|
||||||
@ -14,6 +15,8 @@ export async function bookmarksResponse() {
|
|||||||
const fileContents = await fs.readFile(bookmarksYaml, "utf8");
|
const fileContents = await fs.readFile(bookmarksYaml, "utf8");
|
||||||
const bookmarks = yaml.load(fileContents);
|
const bookmarks = yaml.load(fileContents);
|
||||||
|
|
||||||
|
if (!bookmarks) return [];
|
||||||
|
|
||||||
// map easy to write YAML objects into easy to consume JS arrays
|
// map easy to write YAML objects into easy to consume JS arrays
|
||||||
const bookmarksArray = bookmarks.map((group) => ({
|
const bookmarksArray = bookmarks.map((group) => ({
|
||||||
name: Object.keys(group)[0],
|
name: Object.keys(group)[0],
|
||||||
@ -27,19 +30,17 @@ export async function bookmarksResponse() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
export async function widgetsResponse() {
|
export async function widgetsResponse() {
|
||||||
checkAndCopyConfig("widgets.yaml");
|
let configuredWidgets;
|
||||||
|
|
||||||
const widgetsYaml = path.join(process.cwd(), "config", "widgets.yaml");
|
try {
|
||||||
const fileContents = await fs.readFile(widgetsYaml, "utf8");
|
configuredWidgets = cleanWidgetGroups(await widgetsFromConfig());
|
||||||
const widgets = yaml.load(fileContents);
|
} catch (e) {
|
||||||
|
console.error("Failed to load widgets, please check widgets.yaml for errors or remove example entries.");
|
||||||
|
if (e) console.error(e);
|
||||||
|
configuredWidgets = [];
|
||||||
|
}
|
||||||
|
|
||||||
// map easy to write YAML objects into easy to consume JS arrays
|
return configuredWidgets;
|
||||||
const widgetsArray = widgets.map((group) => ({
|
|
||||||
type: Object.keys(group)[0],
|
|
||||||
options: { ...group[Object.keys(group)[0]] },
|
|
||||||
}));
|
|
||||||
|
|
||||||
return widgetsArray;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
export async function servicesResponse() {
|
export async function servicesResponse() {
|
||||||
|
|||||||
@ -59,7 +59,7 @@ export async function servicesFromDocker() {
|
|||||||
let constructedService = null;
|
let constructedService = null;
|
||||||
|
|
||||||
Object.keys(container.Labels).forEach((label) => {
|
Object.keys(container.Labels).forEach((label) => {
|
||||||
if (label.startsWith("homepage")) {
|
if (label.startsWith("homepage.")) {
|
||||||
if (!constructedService) {
|
if (!constructedService) {
|
||||||
constructedService = {
|
constructedService = {
|
||||||
container: container.Names[0].replace(/^\//, ""),
|
container: container.Names[0].replace(/^\//, ""),
|
||||||
@ -113,6 +113,7 @@ export function cleanServiceGroups(groups) {
|
|||||||
// whitelisted set of keys to pass to the frontend
|
// whitelisted set of keys to pass to the frontend
|
||||||
const {
|
const {
|
||||||
type, // all widgets
|
type, // all widgets
|
||||||
|
fields,
|
||||||
server, // docker widget
|
server, // docker widget
|
||||||
container,
|
container,
|
||||||
currency, // coinmarketcap widget
|
currency, // coinmarketcap widget
|
||||||
@ -121,6 +122,7 @@ export function cleanServiceGroups(groups) {
|
|||||||
|
|
||||||
cleanedService.widget = {
|
cleanedService.widget = {
|
||||||
type,
|
type,
|
||||||
|
fields: fields || null,
|
||||||
service_name: service.name,
|
service_name: service.name,
|
||||||
service_group: serviceGroup.name,
|
service_group: serviceGroup.name,
|
||||||
};
|
};
|
||||||
|
|||||||
80
src/utils/config/widget-helpers.js
Normal file
@ -0,0 +1,80 @@
|
|||||||
|
import { promises as fs } from "fs";
|
||||||
|
import path from "path";
|
||||||
|
|
||||||
|
import yaml from "js-yaml";
|
||||||
|
|
||||||
|
import checkAndCopyConfig from "utils/config/config";
|
||||||
|
|
||||||
|
const exemptWidgets = ["search"];
|
||||||
|
|
||||||
|
export async function widgetsFromConfig() {
|
||||||
|
checkAndCopyConfig("widgets.yaml");
|
||||||
|
|
||||||
|
const widgetsYaml = path.join(process.cwd(), "config", "widgets.yaml");
|
||||||
|
const fileContents = await fs.readFile(widgetsYaml, "utf8");
|
||||||
|
const widgets = yaml.load(fileContents);
|
||||||
|
|
||||||
|
if (!widgets) return [];
|
||||||
|
|
||||||
|
// map easy to write YAML objects into easy to consume JS arrays
|
||||||
|
const widgetsArray = widgets.map((group, index) => ({
|
||||||
|
type: Object.keys(group)[0],
|
||||||
|
options: {
|
||||||
|
index,
|
||||||
|
...group[Object.keys(group)[0]]
|
||||||
|
},
|
||||||
|
}));
|
||||||
|
return widgetsArray;
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function cleanWidgetGroups(widgets) {
|
||||||
|
return widgets.map((widget, index) => {
|
||||||
|
const sanitizedOptions = widget.options;
|
||||||
|
const optionKeys = Object.keys(sanitizedOptions);
|
||||||
|
if (!exemptWidgets.includes(widget.type)) {
|
||||||
|
["url", "username", "password", "key"].forEach((pO) => {
|
||||||
|
if (optionKeys.includes(pO)) {
|
||||||
|
// allow URL in search
|
||||||
|
if (widget.type !== "search" && pO !== "key") {
|
||||||
|
delete sanitizedOptions[pO];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
type: widget.type,
|
||||||
|
options: {
|
||||||
|
index,
|
||||||
|
...sanitizedOptions
|
||||||
|
},
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function getPrivateWidgetOptions(type, widgetIndex) {
|
||||||
|
const widgets = await widgetsFromConfig();
|
||||||
|
|
||||||
|
const privateOptions = widgets.map((widget) => {
|
||||||
|
const {
|
||||||
|
index,
|
||||||
|
url,
|
||||||
|
username,
|
||||||
|
password,
|
||||||
|
key
|
||||||
|
} = widget.options;
|
||||||
|
|
||||||
|
return {
|
||||||
|
type: widget.type,
|
||||||
|
options: {
|
||||||
|
index,
|
||||||
|
url,
|
||||||
|
username,
|
||||||
|
password,
|
||||||
|
key
|
||||||
|
},
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
return (type !== undefined && widgetIndex !== undefined) ? privateOptions.find(o => o.type === type && o.options.index === parseInt(widgetIndex, 10))?.options : privateOptions;
|
||||||
|
}
|
||||||
@ -20,7 +20,7 @@ export function ColorProvider({ initialTheme, children }) {
|
|||||||
const [color, setColor] = useState(getInitialColor);
|
const [color, setColor] = useState(getInitialColor);
|
||||||
|
|
||||||
const rawSetColor = (rawColor) => {
|
const rawSetColor = (rawColor) => {
|
||||||
const root = window.document.documentElement;
|
const root = window.document.getElementById("page_wrapper");
|
||||||
|
|
||||||
root.classList.remove(`theme-${lastColor}`);
|
root.classList.remove(`theme-${lastColor}`);
|
||||||
root.classList.add(`theme-${rawColor}`);
|
root.classList.add(`theme-${rawColor}`);
|
||||||
|
|||||||
@ -22,7 +22,7 @@ export function ThemeProvider({ initialTheme, children }) {
|
|||||||
const [theme, setTheme] = useState(getInitialTheme);
|
const [theme, setTheme] = useState(getInitialTheme);
|
||||||
|
|
||||||
const rawSetTheme = (rawTheme) => {
|
const rawSetTheme = (rawTheme) => {
|
||||||
const root = window.document.documentElement;
|
const root = window.document.getElementById("page_wrapper");
|
||||||
const isDark = rawTheme === "dark";
|
const isDark = rawTheme === "dark";
|
||||||
|
|
||||||
root.classList.remove(isDark ? "light" : "dark");
|
root.classList.remove(isDark ? "light" : "dark");
|
||||||
|
|||||||
@ -2,7 +2,7 @@ export function formatApiCall(url, args) {
|
|||||||
const find = /\{.*?\}/g;
|
const find = /\{.*?\}/g;
|
||||||
const replace = (match) => {
|
const replace = (match) => {
|
||||||
const key = match.replace(/\{|\}/g, "");
|
const key = match.replace(/\{|\}/g, "");
|
||||||
return args[key];
|
return args[key] || "";
|
||||||
};
|
};
|
||||||
|
|
||||||
return url.replace(/\/+$/, "").replace(find, replace);
|
return url.replace(/\/+$/, "").replace(find, replace);
|
||||||
|
|||||||
@ -1,8 +1,13 @@
|
|||||||
import cache from "memory-cache";
|
import cache from "memory-cache";
|
||||||
|
|
||||||
|
const defaultDuration = 5;
|
||||||
|
|
||||||
export default async function cachedFetch(url, duration) {
|
export default async function cachedFetch(url, duration) {
|
||||||
const cached = cache.get(url);
|
const cached = cache.get(url);
|
||||||
|
|
||||||
|
// eslint-disable-next-line no-param-reassign
|
||||||
|
duration = duration || defaultDuration;
|
||||||
|
|
||||||
if (cached) {
|
if (cached) {
|
||||||
return cached;
|
return cached;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -29,6 +29,8 @@ export default async function credentialedProxyHandler(req, res) {
|
|||||||
headers["X-gotify-Key"] = `${widget.key}`;
|
headers["X-gotify-Key"] = `${widget.key}`;
|
||||||
} else if (widget.type === "authentik") {
|
} else if (widget.type === "authentik") {
|
||||||
headers.Authorization = `Bearer ${widget.key}`;
|
headers.Authorization = `Bearer ${widget.key}`;
|
||||||
|
} else if (widget.type === "proxmox") {
|
||||||
|
headers.Authorization = `PVEAPIToken=${widget.username}=${widget.password}`;
|
||||||
} else {
|
} else {
|
||||||
headers["X-API-Key"] = `${widget.key}`;
|
headers["X-API-Key"] = `${widget.key}`;
|
||||||
}
|
}
|
||||||
|
|||||||
142
src/utils/styles/themes.js
Normal file
@ -0,0 +1,142 @@
|
|||||||
|
const themes = {
|
||||||
|
white: {
|
||||||
|
light: "#ffffff",
|
||||||
|
iconStart: "#ffffff",
|
||||||
|
iconEnd: "#282828",
|
||||||
|
dark: "#ffffff",
|
||||||
|
},
|
||||||
|
slate: {
|
||||||
|
light: "#f8fafc",
|
||||||
|
iconStart: "#94a3b8",
|
||||||
|
iconEnd: "#334155",
|
||||||
|
dark: "#1e293b",
|
||||||
|
},
|
||||||
|
gray: {
|
||||||
|
light: "#f9fafb",
|
||||||
|
iconStart: "#9ca3af",
|
||||||
|
iconEnd: "#374151",
|
||||||
|
dark: "#1f2937",
|
||||||
|
},
|
||||||
|
zinc: {
|
||||||
|
light: "#fafafa",
|
||||||
|
iconStart: "#a1a1aa",
|
||||||
|
iconEnd: "#3f3f46",
|
||||||
|
dark: "#27272a",
|
||||||
|
},
|
||||||
|
neutral: {
|
||||||
|
light: "#fafafa",
|
||||||
|
iconStart: "#a3a3a3",
|
||||||
|
iconEnd: "#404040",
|
||||||
|
dark: "#262626",
|
||||||
|
},
|
||||||
|
stone: {
|
||||||
|
light: "#fafaf9",
|
||||||
|
iconStart: "#a8a29e",
|
||||||
|
iconEnd: "#44403c",
|
||||||
|
dark: "#292524",
|
||||||
|
},
|
||||||
|
red: {
|
||||||
|
light: "#fef2f2",
|
||||||
|
iconStart: "#f87171",
|
||||||
|
iconEnd: "#b91c1c",
|
||||||
|
dark: "#991b1b",
|
||||||
|
},
|
||||||
|
orange: {
|
||||||
|
light: "#fff7ed",
|
||||||
|
iconStart: "#fb923c",
|
||||||
|
iconEnd: "#c2410c",
|
||||||
|
dark: "#9a3412",
|
||||||
|
},
|
||||||
|
amber: {
|
||||||
|
light: "#fffbeb",
|
||||||
|
iconStart: "#fbbf24",
|
||||||
|
iconEnd: "#b45309",
|
||||||
|
dark: "#92400e",
|
||||||
|
},
|
||||||
|
yellow: {
|
||||||
|
light: "#fefce8",
|
||||||
|
iconStart: "#facc15",
|
||||||
|
iconEnd: "#a16207",
|
||||||
|
dark: "#854d0e",
|
||||||
|
},
|
||||||
|
lime: {
|
||||||
|
light: "#f7fee7",
|
||||||
|
iconStart: "#a3e635",
|
||||||
|
iconEnd: "#4d7c0f",
|
||||||
|
dark: "#3f6212",
|
||||||
|
},
|
||||||
|
green: {
|
||||||
|
light: "#f0fdf4",
|
||||||
|
iconStart: "#4ade80",
|
||||||
|
iconEnd: "#15803d",
|
||||||
|
dark: "#166534",
|
||||||
|
},
|
||||||
|
emerald: {
|
||||||
|
light: "#ecfdf5",
|
||||||
|
iconStart: "#34d399",
|
||||||
|
iconEnd: "#047857",
|
||||||
|
dark: "#065f46",
|
||||||
|
},
|
||||||
|
teal: {
|
||||||
|
light: "#f0fdfa",
|
||||||
|
iconStart: "#2dd4bf",
|
||||||
|
iconEnd: "#0f766e",
|
||||||
|
dark: "#115e59",
|
||||||
|
},
|
||||||
|
cyan: {
|
||||||
|
light: "#ecfeff",
|
||||||
|
iconStart: "#22d3ee",
|
||||||
|
iconEnd: "#0e7490",
|
||||||
|
dark: "#155e75",
|
||||||
|
},
|
||||||
|
sky: {
|
||||||
|
light: "#f0f9ff",
|
||||||
|
iconStart: "#38bdf8",
|
||||||
|
iconEnd: "#0369a1",
|
||||||
|
dark: "#075985",
|
||||||
|
},
|
||||||
|
blue: {
|
||||||
|
light: "#eff6ff",
|
||||||
|
iconStart: "#60a5fa",
|
||||||
|
iconEnd: "#1d4ed8",
|
||||||
|
dark: "#1e40af",
|
||||||
|
},
|
||||||
|
indigo: {
|
||||||
|
light: "#eef2ff",
|
||||||
|
iconStart: "#818cf8",
|
||||||
|
iconEnd: "#4338ca",
|
||||||
|
dark: "#3730a3",
|
||||||
|
},
|
||||||
|
violet: {
|
||||||
|
light: "#f5f3ff",
|
||||||
|
iconStart: "#a78bfa",
|
||||||
|
iconEnd: "#6d28d9",
|
||||||
|
dark: "#5b21b6",
|
||||||
|
},
|
||||||
|
purple: {
|
||||||
|
light: "#faf5ff",
|
||||||
|
iconStart: "#c084fc",
|
||||||
|
iconEnd: "#7e22ce",
|
||||||
|
dark: "#6b21a8",
|
||||||
|
},
|
||||||
|
fuchsia: {
|
||||||
|
light: "#fdf4ff",
|
||||||
|
iconStart: "#e879f9",
|
||||||
|
iconEnd: "#a21caf",
|
||||||
|
dark: "#86198f",
|
||||||
|
},
|
||||||
|
pink: {
|
||||||
|
light: "#fdf2f8",
|
||||||
|
iconStart: "#f472b6",
|
||||||
|
iconEnd: "#be185d",
|
||||||
|
dark: "#9d174d",
|
||||||
|
},
|
||||||
|
rose: {
|
||||||
|
light: "#fff1f2",
|
||||||
|
iconStart: "#fb7185",
|
||||||
|
iconEnd: "#be123c",
|
||||||
|
dark: "#9f1239",
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
export default themes;
|
||||||
@ -17,11 +17,11 @@ export default function Component({ service }) {
|
|||||||
|
|
||||||
if (!adguardData) {
|
if (!adguardData) {
|
||||||
return (
|
return (
|
||||||
<Container>
|
<Container service={service}>
|
||||||
<Block label={t("adguard.queries")} />
|
<Block label="adguard.queries" />
|
||||||
<Block label={t("adguard.blocked")} />
|
<Block label="adguard.blocked" />
|
||||||
<Block label={t("adguard.filtered")} />
|
<Block label="adguard.filtered" />
|
||||||
<Block label={t("adguard.latency")} />
|
<Block label="adguard.latency" />
|
||||||
</Container>
|
</Container>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@ -30,12 +30,12 @@ export default function Component({ service }) {
|
|||||||
adguardData.num_replaced_safebrowsing + adguardData.num_replaced_safesearch + adguardData.num_replaced_parental;
|
adguardData.num_replaced_safebrowsing + adguardData.num_replaced_safesearch + adguardData.num_replaced_parental;
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Container>
|
<Container service={service}>
|
||||||
<Block label={t("adguard.queries")} value={t("common.number", { value: adguardData.num_dns_queries })} />
|
<Block label="adguard.queries" value={t("common.number", { value: adguardData.num_dns_queries })} />
|
||||||
<Block label={t("adguard.blocked")} value={t("common.number", { value: adguardData.num_blocked_filtering })} />
|
<Block label="adguard.blocked" value={t("common.number", { value: adguardData.num_blocked_filtering })} />
|
||||||
<Block label={t("adguard.filtered")} value={t("common.number", { value: filtered })} />
|
<Block label="adguard.filtered" value={t("common.number", { value: filtered })} />
|
||||||
<Block
|
<Block
|
||||||
label={t("adguard.latency")}
|
label="adguard.latency"
|
||||||
value={t("common.ms", { value: adguardData.avg_processing_time * 1000, style: "unit", unit: "millisecond" })}
|
value={t("common.ms", { value: adguardData.avg_processing_time * 1000, style: "unit", unit: "millisecond" })}
|
||||||
/>
|
/>
|
||||||
</Container>
|
</Container>
|
||||||
|
|||||||
@ -19,10 +19,10 @@ export default function Component({ service }) {
|
|||||||
|
|
||||||
if (!usersData || !loginsData || !failedLoginsData) {
|
if (!usersData || !loginsData || !failedLoginsData) {
|
||||||
return (
|
return (
|
||||||
<Container>
|
<Container service={service}>
|
||||||
<Block label={t("authentik.users")} />
|
<Block label="authentik.users" />
|
||||||
<Block label={t("authentik.loginsLast24H")} />
|
<Block label="authentik.loginsLast24H" />
|
||||||
<Block label={t("authentik.failedLoginsLast24H")} />
|
<Block label="authentik.failedLoginsLast24H" />
|
||||||
</Container>
|
</Container>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@ -38,10 +38,10 @@ export default function Component({ service }) {
|
|||||||
);
|
);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Container>
|
<Container service={service}>
|
||||||
<Block label={t("authentik.users")} value={t("common.number", { value: usersData.pagination.count })} />
|
<Block label="authentik.users" value={t("common.number", { value: usersData.pagination.count })} />
|
||||||
<Block label={t("authentik.loginsLast24H")} value={t("common.number", { value: loginsLast24H })} />
|
<Block label="authentik.loginsLast24H" value={t("common.number", { value: loginsLast24H })} />
|
||||||
<Block label={t("authentik.failedLoginsLast24H")} value={t("common.number", { value: failedLoginsLast24H })} />
|
<Block label="authentik.failedLoginsLast24H" value={t("common.number", { value: failedLoginsLast24H })} />
|
||||||
</Container>
|
</Container>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -13,22 +13,22 @@ export default function Component({ service }) {
|
|||||||
const { data: moviesData, error: moviesError } = useWidgetAPI(widget, "movies");
|
const { data: moviesData, error: moviesError } = useWidgetAPI(widget, "movies");
|
||||||
|
|
||||||
if (episodesError || moviesError) {
|
if (episodesError || moviesError) {
|
||||||
return <Container error={t("widget.api_error")} />;
|
return <Container error="widget.api_error" />;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!episodesData || !moviesData) {
|
if (!episodesData || !moviesData) {
|
||||||
return (
|
return (
|
||||||
<Container>
|
<Container service={service}>
|
||||||
<Block label={t("bazarr.missingEpisodes")} />
|
<Block label="bazarr.missingEpisodes" />
|
||||||
<Block label={t("bazarr.missingMovies")} />
|
<Block label="bazarr.missingMovies" />
|
||||||
</Container>
|
</Container>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Container>
|
<Container service={service}>
|
||||||
<Block label={t("bazarr.missingEpisodes")} value={t("common.number", { value: episodesData.total })} />
|
<Block label="bazarr.missingEpisodes" value={t("common.number", { value: episodesData.total })} />
|
||||||
<Block label={t("bazarr.missingMovies")} value={t("common.number", { value: moviesData.total })} />
|
<Block label="bazarr.missingMovies" value={t("common.number", { value: moviesData.total })} />
|
||||||
</Container>
|
</Container>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
33
src/widgets/changedetectionio/component.jsx
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
import { useTranslation } from "next-i18next";
|
||||||
|
|
||||||
|
import Container from "components/services/widget/container";
|
||||||
|
import Block from "components/services/widget/block";
|
||||||
|
import useWidgetAPI from "utils/proxy/use-widget-api";
|
||||||
|
|
||||||
|
export default function Component({ service }) {
|
||||||
|
const { t } = useTranslation();
|
||||||
|
|
||||||
|
const { widget } = service;
|
||||||
|
|
||||||
|
const { data } = useWidgetAPI(widget, "info");
|
||||||
|
|
||||||
|
if (!data) {
|
||||||
|
return <Container error="widget.api_error" />;
|
||||||
|
}
|
||||||
|
|
||||||
|
const totalObserved = Object.keys(data).length;
|
||||||
|
let diffsDetected = 0;
|
||||||
|
|
||||||
|
Object.keys(data).forEach((key) => {
|
||||||
|
if (data[key].last_checked === data[key].last_changed) {
|
||||||
|
diffsDetected += 1;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
return (
|
||||||
|
<Container service={service}>
|
||||||
|
<Block label="changedetectionio.diffsDetected" value={t("common.number", { value: diffsDetected })} />
|
||||||
|
<Block label="changedetectionio.totalObserved" value={t("common.number", { value: totalObserved })} />
|
||||||
|
</Container>
|
||||||
|
);
|
||||||
|
}
|
||||||
15
src/widgets/changedetectionio/widget.js
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
import credentialedProxyHandler from "utils/proxy/handlers/credentialed";
|
||||||
|
|
||||||
|
const widget = {
|
||||||
|
api: "{url}/api/v1/{endpoint}",
|
||||||
|
proxyHandler: credentialedProxyHandler,
|
||||||
|
|
||||||
|
mappings: {
|
||||||
|
info: {
|
||||||
|
method: "GET",
|
||||||
|
endpoint: "watch",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
export default widget;
|
||||||
@ -30,7 +30,7 @@ export default function Component({ service }) {
|
|||||||
|
|
||||||
if (!symbols || symbols.length === 0) {
|
if (!symbols || symbols.length === 0) {
|
||||||
return (
|
return (
|
||||||
<Container>
|
<Container service={service}>
|
||||||
<Block value={t("coinmarketcap.configure")} />
|
<Block value={t("coinmarketcap.configure")} />
|
||||||
</Container>
|
</Container>
|
||||||
);
|
);
|
||||||
@ -42,7 +42,7 @@ export default function Component({ service }) {
|
|||||||
|
|
||||||
if (!statsData || !dateRange) {
|
if (!statsData || !dateRange) {
|
||||||
return (
|
return (
|
||||||
<Container>
|
<Container service={service}>
|
||||||
<Block value={t("coinmarketcap.configure")} />
|
<Block value={t("coinmarketcap.configure")} />
|
||||||
</Container>
|
</Container>
|
||||||
);
|
);
|
||||||
@ -51,7 +51,7 @@ export default function Component({ service }) {
|
|||||||
const { data } = statsData;
|
const { data } = statsData;
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Container>
|
<Container service={service}>
|
||||||
<div className={classNames(service.description ? "-top-10" : "-top-8", "absolute right-1")}>
|
<div className={classNames(service.description ? "-top-10" : "-top-8", "absolute right-1")}>
|
||||||
<Dropdown options={dateRangeOptions} value={dateRange} setValue={setDateRange} />
|
<Dropdown options={dateRangeOptions} value={dateRange} setValue={setDateRange} />
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@ -4,6 +4,7 @@ const components = {
|
|||||||
adguard: dynamic(() => import("./adguard/component")),
|
adguard: dynamic(() => import("./adguard/component")),
|
||||||
authentik: dynamic(() => import("./authentik/component")),
|
authentik: dynamic(() => import("./authentik/component")),
|
||||||
bazarr: dynamic(() => import("./bazarr/component")),
|
bazarr: dynamic(() => import("./bazarr/component")),
|
||||||
|
changedetectionio: dynamic(() => import("./changedetectionio/component")),
|
||||||
coinmarketcap: dynamic(() => import("./coinmarketcap/component")),
|
coinmarketcap: dynamic(() => import("./coinmarketcap/component")),
|
||||||
docker: dynamic(() => import("./docker/component")),
|
docker: dynamic(() => import("./docker/component")),
|
||||||
emby: dynamic(() => import("./emby/component")),
|
emby: dynamic(() => import("./emby/component")),
|
||||||
@ -18,8 +19,10 @@ const components = {
|
|||||||
ombi: dynamic(() => import("./ombi/component")),
|
ombi: dynamic(() => import("./ombi/component")),
|
||||||
overseerr: dynamic(() => import("./overseerr/component")),
|
overseerr: dynamic(() => import("./overseerr/component")),
|
||||||
pihole: dynamic(() => import("./pihole/component")),
|
pihole: dynamic(() => import("./pihole/component")),
|
||||||
|
plex: dynamic(() => import("./plex/component")),
|
||||||
portainer: dynamic(() => import("./portainer/component")),
|
portainer: dynamic(() => import("./portainer/component")),
|
||||||
prowlarr: dynamic(() => import("./prowlarr/component")),
|
prowlarr: dynamic(() => import("./prowlarr/component")),
|
||||||
|
proxmox: dynamic(() => import("./proxmox/component")),
|
||||||
qbittorrent: dynamic(() => import("./qbittorrent/component")),
|
qbittorrent: dynamic(() => import("./qbittorrent/component")),
|
||||||
radarr: dynamic(() => import("./radarr/component")),
|
radarr: dynamic(() => import("./radarr/component")),
|
||||||
readarr: dynamic(() => import("./readarr/component")),
|
readarr: dynamic(() => import("./readarr/component")),
|
||||||
@ -31,6 +34,7 @@ const components = {
|
|||||||
tautulli: dynamic(() => import("./tautulli/component")),
|
tautulli: dynamic(() => import("./tautulli/component")),
|
||||||
traefik: dynamic(() => import("./traefik/component")),
|
traefik: dynamic(() => import("./traefik/component")),
|
||||||
transmission: dynamic(() => import("./transmission/component")),
|
transmission: dynamic(() => import("./transmission/component")),
|
||||||
|
unifi: dynamic(() => import("./unifi/component")),
|
||||||
};
|
};
|
||||||
|
|
||||||
export default components;
|
export default components;
|
||||||
|
|||||||
@ -31,23 +31,25 @@ export default function Component({ service }) {
|
|||||||
|
|
||||||
if (!statsData || !statusData) {
|
if (!statsData || !statusData) {
|
||||||
return (
|
return (
|
||||||
<Container>
|
<Container service={service}>
|
||||||
<Block label={t("docker.cpu")} />
|
<Block label="docker.cpu" />
|
||||||
<Block label={t("docker.mem")} />
|
<Block label="docker.mem" />
|
||||||
<Block label={t("docker.rx")} />
|
<Block label="docker.rx" />
|
||||||
<Block label={t("docker.tx")} />
|
<Block label="docker.tx" />
|
||||||
</Container>
|
</Container>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const network = statsData.stats.networks?.eth0 || statsData.stats.networks?.network;
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Container>
|
<Container service={service}>
|
||||||
<Block label={t("docker.cpu")} value={t("common.percent", { value: calculateCPUPercent(statsData.stats) })} />
|
<Block label="docker.cpu" value={t("common.percent", { value: calculateCPUPercent(statsData.stats) })} />
|
||||||
<Block label={t("docker.mem")} value={t("common.bytes", { value: statsData.stats.memory_stats.usage })} />
|
<Block label="docker.mem" value={t("common.bytes", { value: statsData.stats.memory_stats.usage })} />
|
||||||
{statsData.stats.networks && (
|
{network && (
|
||||||
<>
|
<>
|
||||||
<Block label={t("docker.rx")} value={t("common.bytes", { value: statsData.stats.networks.eth0.rx_bytes })} />
|
<Block label="docker.rx" value={t("common.bytes", { value: network.rx_bytes })} />
|
||||||
<Block label={t("docker.tx")} value={t("common.bytes", { value: statsData.stats.networks.eth0.tx_bytes })} />
|
<Block label="docker.tx" value={t("common.bytes", { value: network.tx_bytes })} />
|
||||||
</>
|
</>
|
||||||
)}
|
)}
|
||||||
</Container>
|
</Container>
|
||||||
|
|||||||
@ -17,11 +17,22 @@ export default function Component({ service }) {
|
|||||||
return <Container error={t("widget.api_error")} />;
|
return <Container error={t("widget.api_error")} />;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
if (!appsData || !messagesData || !clientsData) {
|
||||||
return (
|
return (
|
||||||
<Container>
|
<Container service={service}>
|
||||||
<Block label={t("gotify.apps")} value={appsData?.length} />
|
<Block label="gotify.apps" />
|
||||||
<Block label={t("gotify.clients")} value={clientsData?.length} />
|
<Block label="gotify.clients" />
|
||||||
<Block label={t("gotify.messages")} value={messagesData?.messages?.length} />
|
<Block label="gotify.messages" />
|
||||||
|
</Container>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
return (
|
||||||
|
<Container service={service}>
|
||||||
|
<Block label="gotify.apps" value={appsData?.length} />
|
||||||
|
<Block label="gotify.clients" value={clientsData?.length} />
|
||||||
|
<Block label="gotify.messages" value={messagesData?.messages?.length} />
|
||||||
</Container>
|
</Container>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||