Merge branch 'main' into fix/icon
This commit is contained in:
commit
d76a18565c
141 changed files with 7378 additions and 551 deletions
9
.all-contributorsrc
Normal file
9
.all-contributorsrc
Normal file
|
@ -0,0 +1,9 @@
|
|||
{
|
||||
"projectName": "homepage",
|
||||
"projectOwner": "benphelps",
|
||||
"files": [
|
||||
"README.md"
|
||||
],
|
||||
"imageSize": 100,
|
||||
"contributors": []
|
||||
}
|
30
.github/ISSUE_TEMPLATE/bug_report.md
vendored
30
.github/ISSUE_TEMPLATE/bug_report.md
vendored
|
@ -1,30 +0,0 @@
|
|||
---
|
||||
name: Bug report
|
||||
about: Create a report to help us improve
|
||||
title: "[Bug] "
|
||||
labels: ''
|
||||
assignees: ''
|
||||
|
||||
---
|
||||
|
||||
**Describe the bug**
|
||||
A clear and concise description of what the bug is.
|
||||
|
||||
**Expected behavior**
|
||||
A clear and concise description of what you expected to happen.
|
||||
|
||||
**Screenshots**
|
||||
If applicable, add screenshots to help explain your problem.
|
||||
|
||||
**Configuration**
|
||||
If applicable,
|
||||
```yaml
|
||||
# Please provide your service, widget or otherwise related configuration here
|
||||
```
|
||||
|
||||
**Additional context**
|
||||
Add any other context about the problem here. This includes things like:
|
||||
- Service version or API version
|
||||
- Docker version
|
||||
- Deployment method
|
||||
- Sample YAML configurations
|
66
.github/ISSUE_TEMPLATE/bug_report.yml
vendored
Normal file
66
.github/ISSUE_TEMPLATE/bug_report.yml
vendored
Normal file
|
@ -0,0 +1,66 @@
|
|||
name: Bug report
|
||||
description: Create a report to help us improve
|
||||
title: "[Bug] "
|
||||
labels: ["bug"]
|
||||
body:
|
||||
- type: markdown
|
||||
attributes:
|
||||
value: |
|
||||
Have a question? 👉 [Start a new discussion](https://github.com/benphelps/homepage/discussions/new) or [ask in chat](https://discord.gg/SaPGSzrEZC).
|
||||
|
||||
Before opening an issue, please double check:
|
||||
|
||||
- [The troubleshooting guide](https://gethomepage.dev/en/more/troubleshooting/).
|
||||
- [The homepage documentation](https://gethomepage.dev/)
|
||||
- [Existing issues](https://github.com/benphelps/homepage/search?q=&type=issues) and [discussions](https://github.com/benphelps/homepage/search?q=&type=discussions).
|
||||
- type: textarea
|
||||
id: description
|
||||
attributes:
|
||||
label: Description
|
||||
description: A clear and concise description of what the bug is. If applicable, add screenshots to help explain your problem.
|
||||
placeholder: |
|
||||
Currently homepage does not work when...
|
||||
|
||||
[Screenshot if applicable]
|
||||
validations:
|
||||
required: true
|
||||
- type: textarea
|
||||
id: reproduction
|
||||
attributes:
|
||||
label: Steps to reproduce
|
||||
description: Steps to reproduce the behavior.
|
||||
placeholder: |
|
||||
1. Go to '...'
|
||||
2. Click on '....'
|
||||
3. See error
|
||||
validations:
|
||||
required: true
|
||||
- type: input
|
||||
id: version
|
||||
attributes:
|
||||
label: homepage version
|
||||
placeholder: e.g. v0.4.18 (4ea2798)
|
||||
validations:
|
||||
required: true
|
||||
- type: dropdown
|
||||
id: install-method
|
||||
attributes:
|
||||
label: Installation method
|
||||
options:
|
||||
- Docker
|
||||
- Unraid
|
||||
- Source
|
||||
- Other (please describe above)
|
||||
validations:
|
||||
required: true
|
||||
- type: textarea
|
||||
id: config
|
||||
attributes:
|
||||
label: Configuration
|
||||
description: Please provide any relevant service, widget or otherwise related configuration here
|
||||
render: yaml
|
||||
- type: textarea
|
||||
id: other
|
||||
attributes:
|
||||
label: Other
|
||||
description: Any other relevant details. E.g. service version or API version, docker version, etc.
|
17
.github/ISSUE_TEMPLATE/feature_request.md
vendored
17
.github/ISSUE_TEMPLATE/feature_request.md
vendored
|
@ -1,17 +0,0 @@
|
|||
---
|
||||
name: Feature request
|
||||
about: Suggest an idea for this project
|
||||
title: "[Feature Request] "
|
||||
labels: ''
|
||||
assignees: ''
|
||||
|
||||
---
|
||||
|
||||
**Is your feature request related to a service? Please describe.**
|
||||
A clear and concise description of what you would like to see from this service.
|
||||
|
||||
**Is your feature request related to a problem? Please describe.**
|
||||
A clear and concise description of what the problem is. Ex. I would like it if [...]
|
||||
|
||||
**Additional context**
|
||||
Add any other context or screenshots about the feature request here.
|
17
.github/ISSUE_TEMPLATE/feature_request.yml
vendored
Normal file
17
.github/ISSUE_TEMPLATE/feature_request.yml
vendored
Normal file
|
@ -0,0 +1,17 @@
|
|||
name: Feature request
|
||||
description: Suggest an idea for this project
|
||||
title: "[Feature Request] "
|
||||
labels: ["enhancement"]
|
||||
body:
|
||||
- type: textarea
|
||||
id: description
|
||||
attributes:
|
||||
label: Description
|
||||
description: A clear and concise description of what you would like to see.
|
||||
validations:
|
||||
required: true
|
||||
- type: textarea
|
||||
id: other
|
||||
attributes:
|
||||
label: Other
|
||||
description: Add any other context or information about the feature request here.
|
16
.github/workflows/docker-publish.yml
vendored
16
.github/workflows/docker-publish.yml
vendored
|
@ -43,7 +43,7 @@ jobs:
|
|||
if: github.event_name != 'pull_request'
|
||||
uses: sigstore/cosign-installer@main
|
||||
with:
|
||||
cosign-release: 'v1.11.0' # optional
|
||||
cosign-release: 'v1.13.1' # optional
|
||||
|
||||
# Setup QEMU
|
||||
# https://github.com/marketplace/actions/docker-setup-buildx#with-qemu
|
||||
|
@ -109,13 +109,13 @@ jobs:
|
|||
# repository is public to avoid leaking data. If you would like to publish
|
||||
# transparency data even for private images, pass --force to cosign below.
|
||||
# https://github.com/sigstore/cosign
|
||||
- name: Sign the published Docker image
|
||||
if: ${{ github.event_name != 'pull_request' }}
|
||||
env:
|
||||
COSIGN_EXPERIMENTAL: "true"
|
||||
# This step uses the identity token to provision an ephemeral certificate
|
||||
# against the sigstore community Fulcio instance.
|
||||
run: echo "${{ steps.meta.outputs.tags }}" | xargs -I {} cosign sign {}@${{ steps.build-and-push.outputs.digest }}
|
||||
# - name: Sign the published Docker image
|
||||
# if: ${{ github.event_name != 'pull_request' }}
|
||||
# env:
|
||||
# COSIGN_EXPERIMENTAL: "true"
|
||||
# # This step uses the identity token to provision an ephemeral certificate
|
||||
# # against the sigstore community Fulcio instance.
|
||||
# run: echo "${{ steps.meta.outputs.tags }}" | xargs -I {} cosign sign {}@${{ steps.build-and-push.outputs.digest }}
|
||||
|
||||
# Temp fix
|
||||
# https://github.com/docker/build-push-action/issues/252
|
||||
|
|
10
Dockerfile
10
Dockerfile
|
@ -1,7 +1,7 @@
|
|||
# syntax = docker/dockerfile:latest
|
||||
|
||||
# Install dependencies only when needed
|
||||
FROM node:current-alpine AS deps
|
||||
FROM docker.io/node:18-alpine AS deps
|
||||
|
||||
WORKDIR /app
|
||||
|
||||
|
@ -11,7 +11,7 @@ RUN <<EOF
|
|||
set -xe
|
||||
apk add libc6-compat
|
||||
apk add --virtual .gyp python3 make g++
|
||||
yarn global add pnpm
|
||||
npm install -g pnpm
|
||||
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"
|
||||
|
@ -19,7 +19,7 @@ RUN --mount=type=cache,id=pnpm-store,target=/root/.local/share/pnpm/store pnpm f
|
|||
RUN --mount=type=cache,id=pnpm-store,target=/root/.local/share/pnpm/store pnpm install -r --offline
|
||||
|
||||
# Rebuild the source code only when needed
|
||||
FROM node:current-alpine AS builder
|
||||
FROM docker.io/node:18-alpine AS builder
|
||||
WORKDIR /app
|
||||
|
||||
ARG BUILDTIME
|
||||
|
@ -31,13 +31,13 @@ COPY . .
|
|||
|
||||
RUN <<EOF
|
||||
set -xe
|
||||
yarn next telemetry disable
|
||||
npm run telemetry
|
||||
mkdir config && echo '-' > config/settings.yaml
|
||||
NEXT_PUBLIC_BUILDTIME=$BUILDTIME NEXT_PUBLIC_VERSION=$VERSION NEXT_PUBLIC_REVISION=$REVISION npm run build
|
||||
EOF
|
||||
|
||||
# Production image, copy all the files and run next
|
||||
FROM node:current-alpine AS runner
|
||||
FROM docker.io/node:18-alpine AS runner
|
||||
LABEL org.opencontainers.image.title "Homepage"
|
||||
LABEL org.opencontainers.image.description "A self-hosted services landing page, with docker and service integrations."
|
||||
LABEL org.opencontainers.image.url="https://github.com/benphelps/homepage"
|
||||
|
|
58
README.md
58
README.md
|
@ -38,7 +38,7 @@
|
|||
- Images built for AMD64 (x86_64), ARM64, ARMv7 and ARMv6
|
||||
- Supports all Raspberry Pi's, most SBCs & Apple Silicon
|
||||
- Full i18n support with automatic language detection
|
||||
- Translations for Catalan, Chinese, Dutch, Finnish, French, German, Hebrew, Hungarian, Norwegian Bokmål, Polish, Portuguese, Portuguese (Brazil), Romainian, Russian, Spanish, Swedish and Yue
|
||||
- Translations for Catalan, Chinese, Dutch, Finnish, French, German, Hebrew, Hungarian, Malay, Norwegian Bokmål, Polish, Portuguese, Portuguese (Brazil), Romanian, Russian, Spanish, Swedish and Yue
|
||||
- Want to help translate? [Join the Weblate project](https://hosted.weblate.org/engage/homepage/)
|
||||
- Service & Web Bookmarks
|
||||
- Docker Integration
|
||||
|
@ -67,7 +67,7 @@ If you have a more specific issue, please open an issue on the [Issues](https://
|
|||
|
||||
## Getting Started
|
||||
|
||||
For configuration options, examples and more, [please check out the Wiki](https://github.com/benphelps/homepage/wiki).
|
||||
For configuration options, examples and more, [please check out the homepage site](http://gethomepage.dev).
|
||||
|
||||
### With Docker
|
||||
|
||||
|
@ -122,7 +122,7 @@ Configuration files will be genereted and placed on the first request.
|
|||
Configuration is done in the /config directory using .yaml files. Refer to each config for
|
||||
the specific configuration options.
|
||||
|
||||
You may also check [the wiki](https://github.com/benphelps/homepage/wiki) for detailed configuration instructions, examples and more.
|
||||
You may also check [the homepage site](http://gethomepage.dev) for detailed configuration instructions, examples and more.
|
||||
|
||||
## Development
|
||||
|
||||
|
@ -144,47 +144,17 @@ This is a [Next.js](https://nextjs.org/) application, see their doucmentation fo
|
|||
|
||||
## Contributors
|
||||
|
||||
Huge thanks to the all the contributors who have helped make this project what it is today! In alphabetical order:
|
||||
<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->
|
||||
<!-- prettier-ignore-start -->
|
||||
<!-- markdownlint-disable -->
|
||||
|
||||
- [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
|
||||
- [andrii-kryvoviaz](https://github.com/benphelps/homepage/commits?author=andrii-kryvoviaz) - Background opacity option
|
||||
- [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
|
||||
- [ItsJustMeChris](https://github.com/benphelps/homepage/commits?author=ItsJustMeChris) - Coin Market Cap Widget
|
||||
- [JazzFisch](https://github.com/benphelps/homepage/commits?author=JazzFisch) - Readarr, Bazarr, Lidarr, SABnzbd, Transmission, qBittorrent, Proxmox Integrations & countless more improvements
|
||||
- [josways](https://github.com/benphelps/homepage/commits?author=josways) - Baidu search provider
|
||||
- [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
|
||||
- [MountainGod2](https://github.com/benphelps/homepage/discussions/243) - Homepage Logo
|
||||
- [quod](https://github.com/benphelps/homepage/commits?author=quod) - Fixed Typos
|
||||
- [schklom](https://github.com/benphelps/homepage/commits?author=schklom) - ARM64, ARMv7 and ARMv6
|
||||
- [xicopitz](https://github.com/benphelps/homepage/commits?author=xicopitz) - Gotify & Prowlarr Integration
|
||||
<!-- markdownlint-restore -->
|
||||
<!-- prettier-ignore-end -->
|
||||
|
||||
### Translators
|
||||
<!-- ALL-CONTRIBUTORS-LIST:END -->
|
||||
|
||||
- [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
|
||||
|
||||
|
||||
<!-- ALL-CONTRIBUTORS-BADGE:START - Do not remove or modify this section -->
|
||||
[](#contributors)
|
||||
<!-- ALL-CONTRIBUTORS-BADGE:END -->
|
||||
|
|
331
public/locales/ar/common.json
Normal file
331
public/locales/ar/common.json
Normal file
|
@ -0,0 +1,331 @@
|
|||
{
|
||||
"widget": {
|
||||
"missing_type": "نوع القطعة مفقود: {{type}}",
|
||||
"api_error": "API خطأ",
|
||||
"status": "الحالة",
|
||||
"information": "Information",
|
||||
"url": "URL",
|
||||
"raw_error": "Raw Error",
|
||||
"response_data": "Response Data"
|
||||
},
|
||||
"weather": {
|
||||
"current": "الموقع الحالي",
|
||||
"allow": "اضغط للسماح",
|
||||
"updating": "جاري التحديث",
|
||||
"wait": "الرجاء الانتظار"
|
||||
},
|
||||
"search": {
|
||||
"placeholder": "بحث …"
|
||||
},
|
||||
"resources": {
|
||||
"cpu": "المعالج",
|
||||
"total": "المجموع",
|
||||
"free": "متاح",
|
||||
"used": "مستخدم",
|
||||
"load": "الضغط"
|
||||
},
|
||||
"unifi": {
|
||||
"users": "المستخدمون",
|
||||
"uptime": "مدة تشغيل النظام",
|
||||
"days": "ايام",
|
||||
"wan": "WAN",
|
||||
"lan": "LAN",
|
||||
"wlan": "WLAN",
|
||||
"devices": "الاجهزة",
|
||||
"lan_devices": "LAN اجهزة",
|
||||
"wlan_devices": "WLAN احهزة",
|
||||
"lan_users": "LAN مستخدمين",
|
||||
"wlan_users": "WLAN مستخدمين",
|
||||
"up": "اعلي",
|
||||
"down": "اسفل",
|
||||
"wait": "الرجاء الانتظار"
|
||||
},
|
||||
"wmo": {
|
||||
"73-day": "Snow",
|
||||
"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-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"
|
||||
},
|
||||
"docker": {
|
||||
"rx": "RX",
|
||||
"tx": "TX",
|
||||
"mem": "الرام",
|
||||
"cpu": "المعالج",
|
||||
"offline": "غير متصل"
|
||||
},
|
||||
"emby": {
|
||||
"playing": "يعمل الان",
|
||||
"transcoding": "التحويل",
|
||||
"bitrate": "معدل البت",
|
||||
"no_active": "No Active Streams"
|
||||
},
|
||||
"changedetectionio": {
|
||||
"totalObserved": "Total Observed",
|
||||
"diffsDetected": "Diffs Detected"
|
||||
},
|
||||
"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",
|
||||
"missing": "Missing",
|
||||
"queued": "Queued",
|
||||
"movies": "Movies"
|
||||
},
|
||||
"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"
|
||||
},
|
||||
"quicklaunch": {
|
||||
"bookmark": "Bookmark",
|
||||
"service": "Service"
|
||||
},
|
||||
"homebridge": {
|
||||
"available_update": "System",
|
||||
"updates": "Updates",
|
||||
"update_available": "Update Available",
|
||||
"up_to_date": "Up to Date",
|
||||
"child_bridges": "Child Bridges",
|
||||
"child_bridges_status": "{{ok}}/{{total}}"
|
||||
},
|
||||
"watchtower": {
|
||||
"containers_scanned": "Scanned",
|
||||
"containers_updated": "Updated",
|
||||
"containers_failed": "Failed"
|
||||
},
|
||||
"autobrr": {
|
||||
"approvedPushes": "Approved",
|
||||
"rejectedPushes": "Rejected",
|
||||
"filters": "Filters",
|
||||
"indexers": "Indexers"
|
||||
},
|
||||
"tubearchivist": {
|
||||
"downloads": "Queue",
|
||||
"videos": "Videos",
|
||||
"channels": "Channels",
|
||||
"playlists": "Playlists"
|
||||
},
|
||||
"truenas": {
|
||||
"load": "System Load",
|
||||
"uptime": "Uptime",
|
||||
"alerts": "Alerts",
|
||||
"time": "{{value, number(style: unit; unitDisplay: long;)}}"
|
||||
},
|
||||
"navidrome": {
|
||||
"nothing_streaming": "No Active Streams",
|
||||
"please_wait": "Please Wait"
|
||||
},
|
||||
"pyload": {
|
||||
"speed": "Speed",
|
||||
"active": "Active",
|
||||
"queue": "Queue",
|
||||
"total": "Total"
|
||||
},
|
||||
"gluetun": {
|
||||
"public_ip": "Public IP",
|
||||
"region": "Region",
|
||||
"country": "Country"
|
||||
},
|
||||
"hdhomerun": {
|
||||
"channels": "Channels",
|
||||
"hd": "HD"
|
||||
}
|
||||
}
|
|
@ -12,7 +12,11 @@
|
|||
"widget": {
|
||||
"missing_type": "Липсваща приставка: {{type}}",
|
||||
"api_error": "API Грешка",
|
||||
"status": "Статус"
|
||||
"status": "Статус",
|
||||
"information": "Information",
|
||||
"url": "URL",
|
||||
"raw_error": "Raw Error",
|
||||
"response_data": "Response Data"
|
||||
},
|
||||
"weather": {
|
||||
"current": "Текущо местоположение",
|
||||
|
@ -39,7 +43,12 @@
|
|||
"wlan_users": "WLAN Потребители",
|
||||
"up": "UP",
|
||||
"down": "DOWN",
|
||||
"wait": "Моля изчакайте"
|
||||
"wait": "Моля изчакайте",
|
||||
"lan": "LAN",
|
||||
"wlan": "WLAN",
|
||||
"devices": "Devices",
|
||||
"lan_devices": "LAN Devices",
|
||||
"wlan_devices": "WLAN Devices"
|
||||
},
|
||||
"docker": {
|
||||
"offline": "Изключен",
|
||||
|
@ -90,7 +99,8 @@
|
|||
"radarr": {
|
||||
"wanted": "Wanted",
|
||||
"queued": "Queued",
|
||||
"movies": "Movies"
|
||||
"movies": "Movies",
|
||||
"missing": "Missing"
|
||||
},
|
||||
"lidarr": {
|
||||
"wanted": "Wanted",
|
||||
|
@ -201,5 +211,121 @@
|
|||
"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"
|
||||
},
|
||||
"homebridge": {
|
||||
"available_update": "System",
|
||||
"updates": "Updates",
|
||||
"update_available": "Update Available",
|
||||
"up_to_date": "Up to Date",
|
||||
"child_bridges": "Child Bridges",
|
||||
"child_bridges_status": "{{ok}}/{{total}}"
|
||||
},
|
||||
"autobrr": {
|
||||
"rejectedPushes": "Rejected",
|
||||
"filters": "Filters",
|
||||
"indexers": "Indexers",
|
||||
"approvedPushes": "Approved"
|
||||
},
|
||||
"watchtower": {
|
||||
"containers_scanned": "Scanned",
|
||||
"containers_updated": "Updated",
|
||||
"containers_failed": "Failed"
|
||||
},
|
||||
"tubearchivist": {
|
||||
"downloads": "Queue",
|
||||
"videos": "Videos",
|
||||
"channels": "Channels",
|
||||
"playlists": "Playlists"
|
||||
},
|
||||
"truenas": {
|
||||
"load": "System Load",
|
||||
"uptime": "Uptime",
|
||||
"alerts": "Alerts",
|
||||
"time": "{{value, number(style: unit; unitDisplay: long;)}}"
|
||||
},
|
||||
"navidrome": {
|
||||
"nothing_streaming": "No Active Streams",
|
||||
"please_wait": "Please Wait"
|
||||
},
|
||||
"pyload": {
|
||||
"speed": "Speed",
|
||||
"active": "Active",
|
||||
"queue": "Queue",
|
||||
"total": "Total"
|
||||
},
|
||||
"gluetun": {
|
||||
"public_ip": "Public IP",
|
||||
"region": "Region",
|
||||
"country": "Country"
|
||||
},
|
||||
"hdhomerun": {
|
||||
"channels": "Channels",
|
||||
"hd": "HD"
|
||||
}
|
||||
}
|
||||
|
|
|
@ -2,7 +2,11 @@
|
|||
"widget": {
|
||||
"missing_type": "Falta el tipus de widget: {{type}}",
|
||||
"api_error": "Error d'API",
|
||||
"status": "Estat"
|
||||
"status": "Estat",
|
||||
"information": "Information",
|
||||
"url": "URL",
|
||||
"raw_error": "Raw Error",
|
||||
"response_data": "Response Data"
|
||||
},
|
||||
"weather": {
|
||||
"allow": "Feu clic per permetre",
|
||||
|
@ -73,7 +77,8 @@
|
|||
"radarr": {
|
||||
"wanted": "Volgut",
|
||||
"queued": "En cua",
|
||||
"movies": "Pel·lícules"
|
||||
"movies": "Pel·lícules",
|
||||
"missing": "Missing"
|
||||
},
|
||||
"readarr": {
|
||||
"wanted": "Volgut",
|
||||
|
@ -182,24 +187,145 @@
|
|||
"lxc": "LXC"
|
||||
},
|
||||
"unifi": {
|
||||
"users": "Users",
|
||||
"users": "Usuaris",
|
||||
"uptime": "System Uptime",
|
||||
"days": "Days",
|
||||
"days": "Días",
|
||||
"wan": "WAN",
|
||||
"lan_users": "LAN Users",
|
||||
"wlan_users": "WLAN Users",
|
||||
"up": "UP",
|
||||
"down": "DOWN",
|
||||
"wait": "Please wait"
|
||||
"wait": "Si us plau, espereu",
|
||||
"lan": "LAN",
|
||||
"wlan": "WLAN",
|
||||
"devices": "Devices",
|
||||
"lan_devices": "LAN Devices",
|
||||
"wlan_devices": "WLAN Devices"
|
||||
},
|
||||
"plex": {
|
||||
"streams": "Active Streams",
|
||||
"movies": "Movies",
|
||||
"tv": "TV Shows"
|
||||
"streams": "Transmissions actives",
|
||||
"movies": "Pel·lícules",
|
||||
"tv": "Programes de TV"
|
||||
},
|
||||
"glances": {
|
||||
"cpu": "CPU",
|
||||
"mem": "MEM",
|
||||
"wait": "Please wait"
|
||||
"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"
|
||||
},
|
||||
"homebridge": {
|
||||
"available_update": "System",
|
||||
"updates": "Updates",
|
||||
"update_available": "Update Available",
|
||||
"up_to_date": "Up to Date",
|
||||
"child_bridges": "Child Bridges",
|
||||
"child_bridges_status": "{{ok}}/{{total}}"
|
||||
},
|
||||
"autobrr": {
|
||||
"approvedPushes": "Approved",
|
||||
"rejectedPushes": "Rejected",
|
||||
"filters": "Filters",
|
||||
"indexers": "Indexers"
|
||||
},
|
||||
"watchtower": {
|
||||
"containers_scanned": "Scanned",
|
||||
"containers_updated": "Updated",
|
||||
"containers_failed": "Failed"
|
||||
},
|
||||
"tubearchivist": {
|
||||
"downloads": "Queue",
|
||||
"videos": "Videos",
|
||||
"channels": "Channels",
|
||||
"playlists": "Playlists"
|
||||
},
|
||||
"truenas": {
|
||||
"load": "System Load",
|
||||
"uptime": "Uptime",
|
||||
"alerts": "Alerts",
|
||||
"time": "{{value, number(style: unit; unitDisplay: long;)}}"
|
||||
},
|
||||
"navidrome": {
|
||||
"nothing_streaming": "No Active Streams",
|
||||
"please_wait": "Please Wait"
|
||||
},
|
||||
"pyload": {
|
||||
"speed": "Speed",
|
||||
"active": "Active",
|
||||
"queue": "Queue",
|
||||
"total": "Total"
|
||||
},
|
||||
"gluetun": {
|
||||
"public_ip": "Public IP",
|
||||
"region": "Region",
|
||||
"country": "Country"
|
||||
},
|
||||
"hdhomerun": {
|
||||
"channels": "Channels",
|
||||
"hd": "HD"
|
||||
}
|
||||
}
|
||||
|
|
331
public/locales/cs/common.json
Normal file
331
public/locales/cs/common.json
Normal file
|
@ -0,0 +1,331 @@
|
|||
{
|
||||
"tubearchivist": {
|
||||
"videos": "Videa",
|
||||
"channels": "Kanály",
|
||||
"playlists": "Playlisty",
|
||||
"downloads": "Fronta"
|
||||
},
|
||||
"truenas": {
|
||||
"load": "Vytížení systému",
|
||||
"uptime": "Doba spuštění",
|
||||
"alerts": "Upozornění",
|
||||
"time": "{{value, number(style: unit; unitDisplay: long;)}}"
|
||||
},
|
||||
"widget": {
|
||||
"missing_type": "Chybí typ widgetu: {{type}}",
|
||||
"api_error": "Chyba API",
|
||||
"status": "Status",
|
||||
"information": "Information",
|
||||
"url": "URL",
|
||||
"raw_error": "Raw Error",
|
||||
"response_data": "Response Data"
|
||||
},
|
||||
"weather": {
|
||||
"current": "Aktuální poloha",
|
||||
"allow": "Klikni pro povolení",
|
||||
"updating": "Probíhá aktualizace",
|
||||
"wait": "Počkejte prosím"
|
||||
},
|
||||
"search": {
|
||||
"placeholder": "Hledat…"
|
||||
},
|
||||
"resources": {
|
||||
"cpu": "CPU",
|
||||
"total": "Celkem",
|
||||
"free": "Volné",
|
||||
"used": "Využité",
|
||||
"load": "Vytížení"
|
||||
},
|
||||
"unifi": {
|
||||
"users": "Uživatelé",
|
||||
"uptime": "Čas od startu systému",
|
||||
"days": "Dnů",
|
||||
"wan": "WAN",
|
||||
"lan": "LAN",
|
||||
"wlan": "WLAN",
|
||||
"devices": "Zařízení",
|
||||
"lan_devices": "LAN Zařízení",
|
||||
"wlan_devices": "WLAN Zařízení",
|
||||
"lan_users": "LAN Uživatelé",
|
||||
"wlan_users": "WLAN Uživatelé",
|
||||
"up": "BĚŽÍ",
|
||||
"down": "NEBĚŽÍ",
|
||||
"wait": "Počkejte prosím"
|
||||
},
|
||||
"docker": {
|
||||
"rx": "RX",
|
||||
"tx": "TX",
|
||||
"mem": "RAM",
|
||||
"cpu": "CPU",
|
||||
"offline": "Offline"
|
||||
},
|
||||
"emby": {
|
||||
"playing": "Přehrává",
|
||||
"transcoding": "Transkódování",
|
||||
"bitrate": "Bitrate",
|
||||
"no_active": "Žádný aktivní stream"
|
||||
},
|
||||
"changedetectionio": {
|
||||
"totalObserved": "Celkem zjištěno",
|
||||
"diffsDetected": "Rozdíly detekovány"
|
||||
},
|
||||
"tautulli": {
|
||||
"playing": "Přehrává",
|
||||
"transcoding": "Transkódování",
|
||||
"bitrate": "Bitrate",
|
||||
"no_active": "Žádný aktivní stream"
|
||||
},
|
||||
"nzbget": {
|
||||
"rate": "Rychlost",
|
||||
"remaining": "Zbývá",
|
||||
"downloaded": "Staženo"
|
||||
},
|
||||
"plex": {
|
||||
"streams": "Aktivní streamy",
|
||||
"movies": "Filmy",
|
||||
"tv": "Seriály"
|
||||
},
|
||||
"sabnzbd": {
|
||||
"rate": "Rychlost",
|
||||
"queue": "Fronta",
|
||||
"timeleft": "Zbývající čas"
|
||||
},
|
||||
"rutorrent": {
|
||||
"active": "Aktivní",
|
||||
"upload": "Nahrávání",
|
||||
"download": "Stahování"
|
||||
},
|
||||
"transmission": {
|
||||
"download": "Stahování",
|
||||
"upload": "Nahrávání",
|
||||
"leech": "Leecher",
|
||||
"seed": "Seeder"
|
||||
},
|
||||
"qbittorrent": {
|
||||
"download": "Stahování",
|
||||
"upload": "Nahrávání",
|
||||
"leech": "Leecher",
|
||||
"seed": "Seeder"
|
||||
},
|
||||
"sonarr": {
|
||||
"wanted": "Hledaný",
|
||||
"queued": "Ve frontě",
|
||||
"series": "Seriály"
|
||||
},
|
||||
"radarr": {
|
||||
"wanted": "Hledaný",
|
||||
"missing": "Chybějící",
|
||||
"queued": "Ve frontě",
|
||||
"movies": "Filmy"
|
||||
},
|
||||
"lidarr": {
|
||||
"wanted": "Hledaný",
|
||||
"queued": "Ve frontě",
|
||||
"albums": "Alba"
|
||||
},
|
||||
"readarr": {
|
||||
"wanted": "Hledaný",
|
||||
"queued": "Ve frontě",
|
||||
"books": "Knihy"
|
||||
},
|
||||
"bazarr": {
|
||||
"missingEpisodes": "Chybějící epizody",
|
||||
"missingMovies": "Chybějící filmy"
|
||||
},
|
||||
"ombi": {
|
||||
"pending": "Čeká",
|
||||
"approved": "Schváleno",
|
||||
"available": "Dostupný"
|
||||
},
|
||||
"jellyseerr": {
|
||||
"pending": "Čeká",
|
||||
"approved": "Schváleno",
|
||||
"available": "Dostupný"
|
||||
},
|
||||
"overseerr": {
|
||||
"pending": "Čeká",
|
||||
"approved": "Schváleno",
|
||||
"available": "Dostupný"
|
||||
},
|
||||
"pihole": {
|
||||
"queries": "Dotazy",
|
||||
"blocked": "Blokováno",
|
||||
"gravity": "Gravitace"
|
||||
},
|
||||
"adguard": {
|
||||
"queries": "Dotazy",
|
||||
"blocked": "Blokováno",
|
||||
"filtered": "Filtrováno",
|
||||
"latency": "Odezva"
|
||||
},
|
||||
"speedtest": {
|
||||
"upload": "Nahrávání",
|
||||
"download": "Stahování",
|
||||
"ping": "Ping"
|
||||
},
|
||||
"portainer": {
|
||||
"running": "Běží",
|
||||
"stopped": "Zastaveno",
|
||||
"total": "Celkově"
|
||||
},
|
||||
"traefik": {
|
||||
"routers": "Routery",
|
||||
"services": "Služby",
|
||||
"middleware": "Prostředník"
|
||||
},
|
||||
"npm": {
|
||||
"enabled": "Povoleno",
|
||||
"disabled": "Zakázáno",
|
||||
"total": "Celkově"
|
||||
},
|
||||
"coinmarketcap": {
|
||||
"configure": "Nakonfigurujte alespoň jednu crypto měnu ke sledování",
|
||||
"1hour": "1 Hodina",
|
||||
"1day": "1 Den",
|
||||
"7days": "7 Dní",
|
||||
"30days": "30 Dní"
|
||||
},
|
||||
"wmo": {
|
||||
"1-night": "Převážně jasno",
|
||||
"2-day": "Polojasno",
|
||||
"0-day": "Slunečno",
|
||||
"0-night": "Jasno",
|
||||
"1-day": "Převážně slunečno",
|
||||
"2-night": "Polojasno",
|
||||
"3-day": "Oblačno",
|
||||
"3-night": "Oblačno",
|
||||
"45-day": "Mlha",
|
||||
"45-night": "Mlha",
|
||||
"48-day": "Mlha",
|
||||
"48-night": "Mlha",
|
||||
"51-day": "Lehké mrholení",
|
||||
"53-day": "Mrholení",
|
||||
"53-night": "Mrholení",
|
||||
"55-day": "Silné mrholení",
|
||||
"55-night": "Silné mrholení",
|
||||
"56-day": "Mírné mrznoucí mrholení",
|
||||
"56-night": "Mírné mrznoucí mrholení",
|
||||
"57-day": "Mrznoucí mrholení",
|
||||
"57-night": "Mrznoucí mrholení",
|
||||
"61-day": "Slabý déšť",
|
||||
"61-night": "Slabý déšť",
|
||||
"51-night": "Lehké mrholení",
|
||||
"63-day": "Déšť",
|
||||
"63-night": "Déšť",
|
||||
"65-day": "Silný déšť",
|
||||
"65-night": "Silný déšť",
|
||||
"66-day": "Mrznoucí déšť",
|
||||
"66-night": "Mrznoucí déšť",
|
||||
"67-day": "Mrznoucí déšť",
|
||||
"67-night": "Mrznoucí déšť",
|
||||
"71-day": "Slabé sněžení",
|
||||
"73-night": "Sněžení",
|
||||
"75-day": "Silné sněžení",
|
||||
"75-night": "Silné sněžení",
|
||||
"77-day": "Sněhová zrna",
|
||||
"71-night": "Slabé sněžení",
|
||||
"73-day": "Sněžení",
|
||||
"77-night": "Sněhová zrna",
|
||||
"80-day": "Lehké přeháňky",
|
||||
"80-night": "Lehké přeháňky",
|
||||
"81-day": "Přeháňky",
|
||||
"81-night": "Přeháňky",
|
||||
"82-day": "Silné přeháňky",
|
||||
"82-night": "Silné přeháňky",
|
||||
"85-day": "Déšť se sněhem",
|
||||
"85-night": "Déšť se sněhem",
|
||||
"86-day": "Déšť se sněhem",
|
||||
"86-night": "Déšť se sněhem",
|
||||
"95-day": "Bouřka",
|
||||
"95-night": "Bouřka",
|
||||
"96-day": "Bouřka s krupobitím",
|
||||
"96-night": "Bouřka s krupobitím",
|
||||
"99-day": "Bouřka s krupobitím",
|
||||
"99-night": "Bouřka s krupobitím"
|
||||
},
|
||||
"gotify": {
|
||||
"apps": "Aplikace",
|
||||
"clients": "Klienti",
|
||||
"messages": "Zprávy"
|
||||
},
|
||||
"prowlarr": {
|
||||
"enableIndexers": "Indexery",
|
||||
"numberOfGrabs": "Uchopení",
|
||||
"numberOfQueries": "Dotazy",
|
||||
"numberOfFailGrabs": "Neúspěšné uchopení",
|
||||
"numberOfFailQueries": "Neúspěšné dotazy"
|
||||
},
|
||||
"jackett": {
|
||||
"configured": "Konfigurováno",
|
||||
"errored": "Chybné"
|
||||
},
|
||||
"strelaysrv": {
|
||||
"numActiveSessions": "Sezení",
|
||||
"numConnections": "Připojení",
|
||||
"dataRelayed": "Přenášení",
|
||||
"transferRate": "Tempo"
|
||||
},
|
||||
"mastodon": {
|
||||
"user_count": "Uživatelé",
|
||||
"status_count": "Příspěvky",
|
||||
"domain_count": "Domény"
|
||||
},
|
||||
"authentik": {
|
||||
"users": "Uživatelé",
|
||||
"loginsLast24H": "Příhlášení (24h)",
|
||||
"failedLoginsLast24H": "Neúspěšná přihlášení (24h)"
|
||||
},
|
||||
"proxmox": {
|
||||
"mem": "RAM",
|
||||
"cpu": "CPU",
|
||||
"lxc": "LXC",
|
||||
"vms": "Virtuální Stroje"
|
||||
},
|
||||
"glances": {
|
||||
"cpu": "CPU",
|
||||
"mem": "RAM",
|
||||
"wait": "Prosím počkejte"
|
||||
},
|
||||
"quicklaunch": {
|
||||
"bookmark": "Záložka",
|
||||
"service": "Služba"
|
||||
},
|
||||
"homebridge": {
|
||||
"update_available": "Dostupná aktualizace",
|
||||
"up_to_date": "Aktuální",
|
||||
"available_update": "Systém",
|
||||
"updates": "Aktualizace",
|
||||
"child_bridges": "Podřadné můstky",
|
||||
"child_bridges_status": "{{ok}}/{{total}}"
|
||||
},
|
||||
"watchtower": {
|
||||
"containers_scanned": "Naskenováno",
|
||||
"containers_updated": "Aktualizováno",
|
||||
"containers_failed": "Chyba"
|
||||
},
|
||||
"autobrr": {
|
||||
"approvedPushes": "Schváleno",
|
||||
"rejectedPushes": "Zamítnuto",
|
||||
"filters": "Filtry",
|
||||
"indexers": "Indexery"
|
||||
},
|
||||
"navidrome": {
|
||||
"nothing_streaming": "No Active Streams",
|
||||
"please_wait": "Please Wait"
|
||||
},
|
||||
"pyload": {
|
||||
"speed": "Speed",
|
||||
"active": "Active",
|
||||
"queue": "Queue",
|
||||
"total": "Total"
|
||||
},
|
||||
"gluetun": {
|
||||
"public_ip": "Public IP",
|
||||
"region": "Region",
|
||||
"country": "Country"
|
||||
},
|
||||
"hdhomerun": {
|
||||
"channels": "Channels",
|
||||
"hd": "HD"
|
||||
}
|
||||
}
|
331
public/locales/da/common.json
Normal file
331
public/locales/da/common.json
Normal file
|
@ -0,0 +1,331 @@
|
|||
{
|
||||
"plex": {
|
||||
"movies": "Film",
|
||||
"tv": "TV-Shows",
|
||||
"streams": "Aktive Streams"
|
||||
},
|
||||
"radarr": {
|
||||
"queued": "I Kø",
|
||||
"movies": "Film",
|
||||
"wanted": "Ønskede",
|
||||
"missing": "Mangler"
|
||||
},
|
||||
"lidarr": {
|
||||
"wanted": "Ønsket",
|
||||
"queued": "I Kø",
|
||||
"albums": "Albums"
|
||||
},
|
||||
"jellyseerr": {
|
||||
"available": "Tilgængelig",
|
||||
"pending": "Afventer",
|
||||
"approved": "Godkendt"
|
||||
},
|
||||
"overseerr": {
|
||||
"pending": "Afventer",
|
||||
"approved": "Godkendt",
|
||||
"available": "Tilgængelig"
|
||||
},
|
||||
"adguard": {
|
||||
"queries": "Forespørgsler",
|
||||
"blocked": "Blokerede",
|
||||
"filtered": "Filtreret",
|
||||
"latency": "Latency"
|
||||
},
|
||||
"speedtest": {
|
||||
"upload": "Upload",
|
||||
"download": "Download",
|
||||
"ping": "Ping"
|
||||
},
|
||||
"npm": {
|
||||
"total": "Total",
|
||||
"enabled": "Aktiveret",
|
||||
"disabled": "Deaktiveret"
|
||||
},
|
||||
"coinmarketcap": {
|
||||
"30days": "30 Dage",
|
||||
"1day": "1 Dag",
|
||||
"configure": "Konfigurer en eller flere crypto valutaer til tracking",
|
||||
"7days": "7 Dage",
|
||||
"1hour": "1 time"
|
||||
},
|
||||
"strelaysrv": {
|
||||
"numActiveSessions": "Sessioner",
|
||||
"dataRelayed": "Videresendt",
|
||||
"numConnections": "Forbindelser",
|
||||
"transferRate": "Rate"
|
||||
},
|
||||
"mastodon": {
|
||||
"domain_count": "Domæner",
|
||||
"status_count": "Indlæg",
|
||||
"user_count": "Brugere"
|
||||
},
|
||||
"authentik": {
|
||||
"users": "Brugere",
|
||||
"loginsLast24H": "Login (24 timer)",
|
||||
"failedLoginsLast24H": "Mislykkede logins (24 timer)"
|
||||
},
|
||||
"glances": {
|
||||
"cpu": "CPU",
|
||||
"mem": "RAM",
|
||||
"wait": "Vent venligst"
|
||||
},
|
||||
"wmo": {
|
||||
"1-day": "Hovedsageligt solrigt",
|
||||
"48-day": "Tåget",
|
||||
"48-night": "Tåget",
|
||||
"51-day": "Let støvregn",
|
||||
"51-night": "Let støvregn",
|
||||
"66-night": "Frysende regn",
|
||||
"67-day": "Frysende regn",
|
||||
"67-night": "Frysende regn",
|
||||
"71-day": "Let Sne",
|
||||
"75-night": "Kraftig Sne",
|
||||
"86-day": "Snebyger",
|
||||
"86-night": "Snebyger",
|
||||
"95-day": "Tordenvejr",
|
||||
"99-day": "Tordenvejr med hagl",
|
||||
"99-night": "Tordenvejr med hagl",
|
||||
"0-day": "Solrig",
|
||||
"0-night": "Klart",
|
||||
"1-night": "Hovedsageligt klart",
|
||||
"2-day": "Delvist skyet",
|
||||
"2-night": "Delvist skyet",
|
||||
"3-day": "Skyet",
|
||||
"3-night": "Skyet",
|
||||
"45-day": "Tåget",
|
||||
"65-day": "Kraftig regn",
|
||||
"65-night": "Kraftig regn",
|
||||
"45-night": "Tåget",
|
||||
"53-day": "Støvregn",
|
||||
"53-night": "Støvregn",
|
||||
"55-day": "Kraftig støvregn",
|
||||
"55-night": "Kraftig støvregn",
|
||||
"56-day": "Let frysende støvregn",
|
||||
"56-night": "Let frysende støvregn",
|
||||
"57-day": "Frysende støvregn",
|
||||
"57-night": "Frysende støvregn",
|
||||
"61-day": "Let Regn",
|
||||
"61-night": "Let Regn",
|
||||
"63-day": "Regn",
|
||||
"63-night": "Regn",
|
||||
"66-day": "Frysende regn",
|
||||
"71-night": "Let Sne",
|
||||
"73-day": "Sne",
|
||||
"73-night": "Sne",
|
||||
"75-day": "Kraftig Sne",
|
||||
"77-day": "Snekorn",
|
||||
"80-day": "Lette byger",
|
||||
"80-night": "Lette byger",
|
||||
"81-day": "Byger",
|
||||
"77-night": "Snekorn",
|
||||
"81-night": "Byger",
|
||||
"82-day": "Kraftige Byger",
|
||||
"82-night": "Kraftige Byger",
|
||||
"85-day": "Snebyger",
|
||||
"85-night": "Snebyger",
|
||||
"95-night": "Tordenvejr",
|
||||
"96-day": "Tordenvejr med hagl",
|
||||
"96-night": "Tordenvejr med hagl"
|
||||
},
|
||||
"homebridge": {
|
||||
"available_update": "System",
|
||||
"updates": "Opdateringer",
|
||||
"update_available": "Opdateringer tilgængelige",
|
||||
"up_to_date": "Opdateret",
|
||||
"child_bridges": "Child Bridges",
|
||||
"child_bridges_status": "{{ok}}/{{total}}"
|
||||
},
|
||||
"widget": {
|
||||
"missing_type": "Manglende Widget Type: {{type}}",
|
||||
"api_error": "API fejl",
|
||||
"status": "Status",
|
||||
"information": "Information",
|
||||
"url": "URL",
|
||||
"raw_error": "Raw Error",
|
||||
"response_data": "Response Data"
|
||||
},
|
||||
"weather": {
|
||||
"current": "Nuværende lokation",
|
||||
"allow": "Klik for at tillade",
|
||||
"updating": "Opdaterer",
|
||||
"wait": "Vent venligst"
|
||||
},
|
||||
"search": {
|
||||
"placeholder": "Søg…"
|
||||
},
|
||||
"resources": {
|
||||
"cpu": "CPU",
|
||||
"total": "Total",
|
||||
"free": "Fri",
|
||||
"used": "Brugt",
|
||||
"load": "Belastning"
|
||||
},
|
||||
"unifi": {
|
||||
"users": "Brugere",
|
||||
"uptime": "System Oppetid",
|
||||
"days": "Dage",
|
||||
"wan": "WAN",
|
||||
"lan": "LAN",
|
||||
"wlan": "Wifi",
|
||||
"devices": "Enheder",
|
||||
"lan_devices": "LAN Enheder",
|
||||
"wlan_devices": "WLAN Enheder",
|
||||
"lan_users": "LAN Brugere",
|
||||
"wlan_users": "WLAN Brugere",
|
||||
"up": "Oppe",
|
||||
"down": "NED",
|
||||
"wait": "Vent venligst"
|
||||
},
|
||||
"docker": {
|
||||
"cpu": "CPU",
|
||||
"rx": "RX",
|
||||
"tx": "TX",
|
||||
"mem": "RAM",
|
||||
"offline": "Offline"
|
||||
},
|
||||
"emby": {
|
||||
"playing": "Afspiller",
|
||||
"transcoding": "Transcoder",
|
||||
"bitrate": "Bitrate",
|
||||
"no_active": "Ingen Aktive Streams"
|
||||
},
|
||||
"changedetectionio": {
|
||||
"totalObserved": "Total Observeret",
|
||||
"diffsDetected": "Forskelle Detekteret"
|
||||
},
|
||||
"tautulli": {
|
||||
"playing": "Afspiller",
|
||||
"transcoding": "Transcoder",
|
||||
"bitrate": "Bitrate",
|
||||
"no_active": "Ingen Aktive Streams"
|
||||
},
|
||||
"nzbget": {
|
||||
"rate": "Rate",
|
||||
"remaining": "Manglende",
|
||||
"downloaded": "Hentet"
|
||||
},
|
||||
"sabnzbd": {
|
||||
"rate": "Rate",
|
||||
"queue": "Kø",
|
||||
"timeleft": "Resterende tid"
|
||||
},
|
||||
"rutorrent": {
|
||||
"active": "Aktive",
|
||||
"upload": "Upload",
|
||||
"download": "Download"
|
||||
},
|
||||
"transmission": {
|
||||
"upload": "Upload",
|
||||
"download": "Download",
|
||||
"leech": "Leech",
|
||||
"seed": "Seed"
|
||||
},
|
||||
"qbittorrent": {
|
||||
"upload": "Upload",
|
||||
"download": "Download",
|
||||
"leech": "Leech",
|
||||
"seed": "Seed"
|
||||
},
|
||||
"sonarr": {
|
||||
"wanted": "Ønsket",
|
||||
"queued": "I Kø",
|
||||
"series": "Serier"
|
||||
},
|
||||
"readarr": {
|
||||
"wanted": "Ønskede",
|
||||
"queued": "I Kø",
|
||||
"books": "Bøger"
|
||||
},
|
||||
"bazarr": {
|
||||
"missingEpisodes": "Manglende Afsnit",
|
||||
"missingMovies": "Manglende Film"
|
||||
},
|
||||
"ombi": {
|
||||
"pending": "Afventer",
|
||||
"approved": "Godkendt",
|
||||
"available": "Tilgængelig"
|
||||
},
|
||||
"pihole": {
|
||||
"blocked": "Blokerede",
|
||||
"gravity": "Gravity",
|
||||
"queries": "Forespørgsler"
|
||||
},
|
||||
"portainer": {
|
||||
"running": "Kørende",
|
||||
"stopped": "Stoppede",
|
||||
"total": "Total"
|
||||
},
|
||||
"traefik": {
|
||||
"routers": "Routere",
|
||||
"services": "Services",
|
||||
"middleware": "Middleware"
|
||||
},
|
||||
"gotify": {
|
||||
"apps": "Applikationer",
|
||||
"clients": "Klienter",
|
||||
"messages": "Beskeder"
|
||||
},
|
||||
"prowlarr": {
|
||||
"enableIndexers": "Indeksører",
|
||||
"numberOfGrabs": "Grabs",
|
||||
"numberOfQueries": "Forespørgsler",
|
||||
"numberOfFailGrabs": "Fail Grabs",
|
||||
"numberOfFailQueries": "Fejl forespørgsler"
|
||||
},
|
||||
"jackett": {
|
||||
"configured": "Konfigureret",
|
||||
"errored": "Fejlede"
|
||||
},
|
||||
"proxmox": {
|
||||
"mem": "RAM",
|
||||
"cpu": "CPU",
|
||||
"lxc": "LXC",
|
||||
"vms": "VMs"
|
||||
},
|
||||
"quicklaunch": {
|
||||
"bookmark": "Bogmærker",
|
||||
"service": "Service"
|
||||
},
|
||||
"watchtower": {
|
||||
"containers_scanned": "Scannet",
|
||||
"containers_updated": "Opdateret",
|
||||
"containers_failed": "Fejlet"
|
||||
},
|
||||
"autobrr": {
|
||||
"indexers": "Indeksører",
|
||||
"approvedPushes": "Godkendte",
|
||||
"rejectedPushes": "Afviste",
|
||||
"filters": "Filtre"
|
||||
},
|
||||
"tubearchivist": {
|
||||
"downloads": "Kø",
|
||||
"videos": "Videoer",
|
||||
"channels": "Kanaler",
|
||||
"playlists": "Afspilningslister"
|
||||
},
|
||||
"truenas": {
|
||||
"load": "Systembelastning",
|
||||
"uptime": "Oppetid",
|
||||
"alerts": "Advarsler",
|
||||
"time": "{{value, number(style: unit; unitDisplay: long;)}}"
|
||||
},
|
||||
"navidrome": {
|
||||
"nothing_streaming": "Ingen Aktive Streams",
|
||||
"please_wait": "Vent venligst"
|
||||
},
|
||||
"pyload": {
|
||||
"speed": "Hastighed",
|
||||
"active": "Aktive",
|
||||
"queue": "Kø",
|
||||
"total": "Total"
|
||||
},
|
||||
"gluetun": {
|
||||
"public_ip": "Public IP",
|
||||
"region": "Region",
|
||||
"country": "Country"
|
||||
},
|
||||
"hdhomerun": {
|
||||
"channels": "Channels",
|
||||
"hd": "HD"
|
||||
}
|
||||
}
|
|
@ -2,7 +2,11 @@
|
|||
"widget": {
|
||||
"missing_type": "Fehlender Widget-Typ: {{type}}",
|
||||
"api_error": "API-Fehler",
|
||||
"status": "Status"
|
||||
"status": "Status",
|
||||
"url": "URL",
|
||||
"information": "Information",
|
||||
"raw_error": "Raw Error",
|
||||
"response_data": "Response Data"
|
||||
},
|
||||
"search": {
|
||||
"placeholder": "Suche…"
|
||||
|
@ -46,7 +50,8 @@
|
|||
"radarr": {
|
||||
"wanted": "Gesucht",
|
||||
"queued": "In Warteschlange",
|
||||
"movies": "Filme"
|
||||
"movies": "Filme",
|
||||
"missing": "Fehlt"
|
||||
},
|
||||
"readarr": {
|
||||
"wanted": "Gesucht",
|
||||
|
@ -190,7 +195,12 @@
|
|||
"wlan_users": "WLAN Benutzer",
|
||||
"up": "SENDEN",
|
||||
"down": "EMPFANGEN",
|
||||
"wait": "Bitte warten"
|
||||
"wait": "Bitte warten",
|
||||
"lan": "LAN",
|
||||
"wlan": "WLAN",
|
||||
"devices": "Geräte",
|
||||
"lan_devices": "LAN-Geräte",
|
||||
"wlan_devices": "WLAN Geräte"
|
||||
},
|
||||
"plex": {
|
||||
"streams": "Aktive Streams",
|
||||
|
@ -198,8 +208,124 @@
|
|||
"tv": "TV Sendungen"
|
||||
},
|
||||
"glances": {
|
||||
"cpu": "CPU",
|
||||
"cpu": "Prozessor",
|
||||
"mem": "RAM",
|
||||
"wait": "Bitte warten"
|
||||
},
|
||||
"changedetectionio": {
|
||||
"totalObserved": "Gesamt beobachtet",
|
||||
"diffsDetected": "Erkannte Differenzen"
|
||||
},
|
||||
"wmo": {
|
||||
"0-day": "Sonnig",
|
||||
"0-night": "Klar",
|
||||
"1-day": "Überwiegend sonnig",
|
||||
"1-night": "Überwiegend klar",
|
||||
"2-day": "Teilweise bewölkt",
|
||||
"2-night": "Teilweise bewölkt",
|
||||
"3-day": "bewölkt",
|
||||
"57-day": "Gefrierender Nieselregen",
|
||||
"61-day": "Leichter Regen",
|
||||
"65-night": "Starker Regen",
|
||||
"66-day": "Gefrierender Regen",
|
||||
"66-night": "Gefrierender Regen",
|
||||
"3-night": "Bewölkt",
|
||||
"45-day": "Neblig",
|
||||
"45-night": "Neblig",
|
||||
"48-day": "Neblig",
|
||||
"48-night": "Neblig",
|
||||
"51-day": "Leichter Nieselregen",
|
||||
"51-night": "Leichter Nieselregen",
|
||||
"55-day": "Starker Nieselregen",
|
||||
"53-day": "Nieselregen",
|
||||
"53-night": "Nieselregen",
|
||||
"55-night": "Starker Nieselregen",
|
||||
"56-day": "Leichter gefrierender Nieselregen",
|
||||
"56-night": "Leichter eisiger Nieselregen",
|
||||
"57-night": "Gefrierender Nieselregen",
|
||||
"61-night": "Leichter Regen",
|
||||
"63-day": "Regen",
|
||||
"63-night": "Regen",
|
||||
"65-day": "Starker Regen",
|
||||
"67-day": "Gefrierender Regen",
|
||||
"67-night": "Gefrierender Regen",
|
||||
"71-day": "Leichter Schneefall",
|
||||
"71-night": "Leichter Schnee",
|
||||
"73-day": "Schnee",
|
||||
"73-night": "Schnee",
|
||||
"75-day": "Schwerer Schnee",
|
||||
"75-night": "Schwerer Schnee",
|
||||
"77-day": "Schneegriesel",
|
||||
"77-night": "Schneegriesel",
|
||||
"80-day": "Leichter Schauer",
|
||||
"80-night": "Leichter Schauer",
|
||||
"81-day": "Schauer",
|
||||
"81-night": "Schauer",
|
||||
"82-day": "Starke Regenschauer",
|
||||
"82-night": "Starke Regenschauer",
|
||||
"85-day": "Schneeschauer",
|
||||
"85-night": "Schneeregen",
|
||||
"86-day": "Schneeregen",
|
||||
"86-night": "Schneeregen",
|
||||
"95-day": "Gewitter",
|
||||
"95-night": "Gewitter",
|
||||
"96-day": "Gewitter mit Hagel",
|
||||
"96-night": "Gewitter mit Hagel",
|
||||
"99-day": "Gewitter mit Hagel",
|
||||
"99-night": "Gewitter mit Hagel"
|
||||
},
|
||||
"quicklaunch": {
|
||||
"bookmark": "Lesezeichen",
|
||||
"service": "Dienst"
|
||||
},
|
||||
"homebridge": {
|
||||
"available_update": "System",
|
||||
"updates": "Aktualisierungen",
|
||||
"update_available": "Aktualisierung verfügbar",
|
||||
"up_to_date": "Aktuell",
|
||||
"child_bridges": "Child Bridges",
|
||||
"child_bridges_status": "{{ok}}/{{total}}"
|
||||
},
|
||||
"autobrr": {
|
||||
"approvedPushes": "Genehmigt",
|
||||
"rejectedPushes": "Abgelehnt",
|
||||
"filters": "Filter",
|
||||
"indexers": "Indexer"
|
||||
},
|
||||
"watchtower": {
|
||||
"containers_scanned": "Überprüft",
|
||||
"containers_updated": "Aktualisiert",
|
||||
"containers_failed": "Fehlgeschlagen"
|
||||
},
|
||||
"tubearchivist": {
|
||||
"downloads": "Warteschlange",
|
||||
"videos": "Videos",
|
||||
"channels": "Kanäle",
|
||||
"playlists": "Wiedergabelisten"
|
||||
},
|
||||
"truenas": {
|
||||
"load": "Systembelastung",
|
||||
"uptime": "Betriebszeit",
|
||||
"alerts": "Warnungen",
|
||||
"time": "{{value, number(style: unit; unitDisplay: long;)}}"
|
||||
},
|
||||
"navidrome": {
|
||||
"nothing_streaming": "No Active Streams",
|
||||
"please_wait": "Please Wait"
|
||||
},
|
||||
"pyload": {
|
||||
"speed": "Speed",
|
||||
"active": "Active",
|
||||
"queue": "Queue",
|
||||
"total": "Total"
|
||||
},
|
||||
"gluetun": {
|
||||
"public_ip": "Public IP",
|
||||
"region": "Region",
|
||||
"country": "Country"
|
||||
},
|
||||
"hdhomerun": {
|
||||
"channels": "Channels",
|
||||
"hd": "HD"
|
||||
}
|
||||
}
|
||||
|
|
|
@ -13,13 +13,17 @@
|
|||
"widget": {
|
||||
"missing_type": "Missing Widget Type: {{type}}",
|
||||
"api_error": "API Error",
|
||||
"status": "Status"
|
||||
"information": "Information",
|
||||
"status": "Status",
|
||||
"url": "URL",
|
||||
"raw_error": "Raw Error",
|
||||
"response_data": "Response Data"
|
||||
},
|
||||
"weather": {
|
||||
"current": "Current Location",
|
||||
"allow": "Click to allow",
|
||||
"updating": "Updating",
|
||||
"wait": "Please wait"
|
||||
"current": "Current Location",
|
||||
"allow": "Click to allow",
|
||||
"updating": "Updating",
|
||||
"wait": "Please wait"
|
||||
},
|
||||
"search": {
|
||||
"placeholder": "Search…"
|
||||
|
@ -36,6 +40,11 @@
|
|||
"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",
|
||||
|
@ -55,6 +64,10 @@
|
|||
"bitrate": "Bitrate",
|
||||
"no_active": "No Active Streams"
|
||||
},
|
||||
"changedetectionio": {
|
||||
"totalObserved": "Total Observed",
|
||||
"diffsDetected": "Diffs Detected"
|
||||
},
|
||||
"tautulli": {
|
||||
"playing": "Playing",
|
||||
"transcoding": "Transcoding",
|
||||
|
@ -100,6 +113,7 @@
|
|||
},
|
||||
"radarr": {
|
||||
"wanted": "Wanted",
|
||||
"missing": "Missing",
|
||||
"queued": "Queued",
|
||||
"movies": "Movies"
|
||||
},
|
||||
|
@ -128,9 +142,9 @@
|
|||
"available": "Available"
|
||||
},
|
||||
"overseerr": {
|
||||
"pending": "Pending",
|
||||
"approved": "Approved",
|
||||
"available": "Available"
|
||||
"pending": "Pending",
|
||||
"approved": "Approved",
|
||||
"available": "Available"
|
||||
},
|
||||
"pihole": {
|
||||
"queries": "Queries",
|
||||
|
@ -138,10 +152,10 @@
|
|||
"gravity": "Gravity"
|
||||
},
|
||||
"adguard": {
|
||||
"queries": "Queries",
|
||||
"blocked": "Blocked",
|
||||
"filtered": "Filtered",
|
||||
"latency": "Latency"
|
||||
"queries": "Queries",
|
||||
"blocked": "Blocked",
|
||||
"filtered": "Filtered",
|
||||
"latency": "Latency"
|
||||
},
|
||||
"speedtest": {
|
||||
"upload": "Upload",
|
||||
|
@ -158,6 +172,10 @@
|
|||
"services": "Services",
|
||||
"middleware": "Middleware"
|
||||
},
|
||||
"navidrome": {
|
||||
"nothing_streaming": "No Active Streams",
|
||||
"please_wait": "Please Wait"
|
||||
},
|
||||
"npm": {
|
||||
"enabled": "Enabled",
|
||||
"disabled": "Disabled",
|
||||
|
@ -175,7 +193,7 @@
|
|||
"clients": "Clients",
|
||||
"messages": "Messages"
|
||||
},
|
||||
"prowlarr":{
|
||||
"prowlarr": {
|
||||
"enableIndexers": "Indexers",
|
||||
"numberOfGrabs": "Grabs",
|
||||
"numberOfQueries": "Queries",
|
||||
|
@ -212,5 +230,113 @@
|
|||
"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"
|
||||
},
|
||||
"homebridge": {
|
||||
"available_update": "System",
|
||||
"updates": "Updates",
|
||||
"update_available": "Update Available",
|
||||
"up_to_date": "Up to Date",
|
||||
"child_bridges": "Child Bridges",
|
||||
"child_bridges_status": "{{ok}}/{{total}}"
|
||||
},
|
||||
"watchtower":{
|
||||
"containers_scanned": "Scanned",
|
||||
"containers_updated": "Updated",
|
||||
"containers_failed": "Failed"
|
||||
},
|
||||
"autobrr": {
|
||||
"approvedPushes": "Approved",
|
||||
"rejectedPushes": "Rejected",
|
||||
"filters": "Filters",
|
||||
"indexers": "Indexers"
|
||||
},
|
||||
"tubearchivist": {
|
||||
"downloads": "Queue",
|
||||
"videos": "Videos",
|
||||
"channels": "Channels",
|
||||
"playlists": "Playlists"
|
||||
},
|
||||
"truenas": {
|
||||
"load": "System Load",
|
||||
"uptime": "Uptime",
|
||||
"alerts": "Alerts",
|
||||
"time": "{{value, number(style: unit; unitDisplay: long;)}}"
|
||||
},
|
||||
"pyload": {
|
||||
"speed": "Speed",
|
||||
"active": "Active",
|
||||
"queue": "Queue",
|
||||
"total": "Total"
|
||||
},
|
||||
"gluetun": {
|
||||
"public_ip": "Public IP",
|
||||
"region": "Region",
|
||||
"country": "Country"
|
||||
},
|
||||
"hdhomerun": {
|
||||
"channels": "Channels",
|
||||
"hd": "HD"
|
||||
}
|
||||
}
|
||||
|
|
|
@ -2,7 +2,11 @@
|
|||
"widget": {
|
||||
"missing_type": "Falta el tipo de widget: {{type}}",
|
||||
"api_error": "Error de API",
|
||||
"status": "Estado"
|
||||
"status": "Estado",
|
||||
"information": "Information",
|
||||
"url": "URL",
|
||||
"raw_error": "Raw Error",
|
||||
"response_data": "Response Data"
|
||||
},
|
||||
"search": {
|
||||
"placeholder": "Buscar…"
|
||||
|
@ -46,7 +50,8 @@
|
|||
"radarr": {
|
||||
"wanted": "Buscando",
|
||||
"queued": "En cola",
|
||||
"movies": "Películas"
|
||||
"movies": "Películas",
|
||||
"missing": "No Encontrado"
|
||||
},
|
||||
"readarr": {
|
||||
"wanted": "Buscando",
|
||||
|
@ -81,7 +86,7 @@
|
|||
"traefik": {
|
||||
"routers": "Enrutadores",
|
||||
"services": "Servicios",
|
||||
"middleware": "Middleware"
|
||||
"middleware": "Software intermedio"
|
||||
},
|
||||
"npm": {
|
||||
"enabled": "Activado",
|
||||
|
@ -190,16 +195,137 @@
|
|||
"lan_users": "Usuarios LAN",
|
||||
"wlan_users": "Usuarios WLAN",
|
||||
"down": "CAÍDO",
|
||||
"wait": "Espere por favor"
|
||||
"wait": "Espere por favor",
|
||||
"lan": "LAN",
|
||||
"wlan": "WLAN",
|
||||
"devices": "Dispositivos",
|
||||
"lan_devices": "Dispositivos LAN",
|
||||
"wlan_devices": "Dispositivos WLAN"
|
||||
},
|
||||
"plex": {
|
||||
"streams": "Transmisiones Activas",
|
||||
"movies": "Peliculas",
|
||||
"tv": "Programas TV"
|
||||
"streams": "Transmisiones activas",
|
||||
"movies": "Películas",
|
||||
"tv": "Programas de TV"
|
||||
},
|
||||
"glances": {
|
||||
"cpu": "Procesador",
|
||||
"mem": "Memoria",
|
||||
"wait": "Espere por favor"
|
||||
},
|
||||
"changedetectionio": {
|
||||
"totalObserved": "Total Observados",
|
||||
"diffsDetected": "Diferencias detectadas"
|
||||
},
|
||||
"wmo": {
|
||||
"48-night": "Niebla",
|
||||
"51-day": "Llovizna ligera",
|
||||
"51-night": "Llovizna ligera",
|
||||
"2-day": "Parcialmente nuboso",
|
||||
"0-day": "Soleado",
|
||||
"0-night": "Despejado",
|
||||
"1-day": "Mayormente soleado",
|
||||
"1-night": "Mayormente despejado",
|
||||
"2-night": "Parcialmente nuboso",
|
||||
"3-day": "Nublado",
|
||||
"3-night": "Nublado",
|
||||
"45-day": "Niebla",
|
||||
"45-night": "Niebla",
|
||||
"48-day": "Niebla",
|
||||
"53-day": "Llovizna",
|
||||
"53-night": "Llovizna",
|
||||
"55-day": "Llovizna pesada",
|
||||
"55-night": "Llovizna pesada",
|
||||
"56-day": "Llovizna helada ligera",
|
||||
"56-night": "Llovizna helada ligera",
|
||||
"57-day": "Llovizna helada",
|
||||
"57-night": "Llovizna helada",
|
||||
"61-day": "Lluvia ligera",
|
||||
"61-night": "Lluvia ligera",
|
||||
"67-day": "Granizo",
|
||||
"63-day": "Lluvia",
|
||||
"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": "Lluvia de nieve",
|
||||
"86-day": "Lluvia de nieve",
|
||||
"86-night": "Lluvia de nieve",
|
||||
"95-day": "Tormenta",
|
||||
"95-night": "Tormenta",
|
||||
"96-day": "Tormenta con granizo",
|
||||
"96-night": "Tormenta con granizo",
|
||||
"99-day": "Tormenta con granizo",
|
||||
"99-night": "Tormenta con granizo"
|
||||
},
|
||||
"quicklaunch": {
|
||||
"bookmark": "Marcadores",
|
||||
"service": "Servicio"
|
||||
},
|
||||
"homebridge": {
|
||||
"available_update": "Sistema",
|
||||
"updates": "Actualizaciones",
|
||||
"update_available": "Actualización disponible",
|
||||
"up_to_date": "Actualizado",
|
||||
"child_bridges": "Child Bridges",
|
||||
"child_bridges_status": "{{ok}}/{{total}}"
|
||||
},
|
||||
"autobrr": {
|
||||
"approvedPushes": "Aprobado",
|
||||
"rejectedPushes": "Rechazado",
|
||||
"filters": "Filtros",
|
||||
"indexers": "Indexadores"
|
||||
},
|
||||
"watchtower": {
|
||||
"containers_scanned": "Escaneado",
|
||||
"containers_updated": "Actualizado",
|
||||
"containers_failed": "Fallido"
|
||||
},
|
||||
"tubearchivist": {
|
||||
"downloads": "Cola",
|
||||
"videos": "Vídeos",
|
||||
"channels": "Canales",
|
||||
"playlists": "Listas de reproducción"
|
||||
},
|
||||
"truenas": {
|
||||
"load": "Carga del sistema",
|
||||
"uptime": "Tiempo de la actividad",
|
||||
"alerts": "Alertas",
|
||||
"time": "{{value, number(style: unit; unitDisplay: long;)}}"
|
||||
},
|
||||
"navidrome": {
|
||||
"nothing_streaming": "Sin transmisiones activas",
|
||||
"please_wait": "Espere por favor"
|
||||
},
|
||||
"pyload": {
|
||||
"speed": "Velocidad",
|
||||
"active": "Activo",
|
||||
"queue": "Cola",
|
||||
"total": "Total"
|
||||
},
|
||||
"gluetun": {
|
||||
"public_ip": "IP pública",
|
||||
"region": "Región",
|
||||
"country": "País"
|
||||
},
|
||||
"hdhomerun": {
|
||||
"channels": "Channels",
|
||||
"hd": "HD"
|
||||
}
|
||||
}
|
||||
|
|
|
@ -2,7 +2,11 @@
|
|||
"widget": {
|
||||
"missing_type": "Puuttuva härpäkkeen tyyppi: {{type}}",
|
||||
"api_error": "API-virhe",
|
||||
"status": "Tila"
|
||||
"status": "Tila",
|
||||
"information": "Information",
|
||||
"url": "URL",
|
||||
"raw_error": "Raw Error",
|
||||
"response_data": "Response Data"
|
||||
},
|
||||
"weather": {
|
||||
"current": "Nykyinen sijainti",
|
||||
|
@ -74,7 +78,8 @@
|
|||
"radarr": {
|
||||
"wanted": "Haluttu",
|
||||
"queued": "Jonossa",
|
||||
"movies": "Elokuvia"
|
||||
"movies": "Elokuvia",
|
||||
"missing": "Missing"
|
||||
},
|
||||
"lidarr": {
|
||||
"wanted": "Haluttu",
|
||||
|
@ -190,7 +195,12 @@
|
|||
"days": "Days",
|
||||
"wan": "WAN",
|
||||
"up": "UP",
|
||||
"down": "DOWN"
|
||||
"down": "DOWN",
|
||||
"devices": "Devices",
|
||||
"lan_devices": "LAN Devices",
|
||||
"lan": "LAN",
|
||||
"wlan": "WLAN",
|
||||
"wlan_devices": "WLAN Devices"
|
||||
},
|
||||
"plex": {
|
||||
"streams": "Active Streams",
|
||||
|
@ -201,5 +211,121 @@
|
|||
"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"
|
||||
},
|
||||
"homebridge": {
|
||||
"available_update": "System",
|
||||
"updates": "Updates",
|
||||
"update_available": "Update Available",
|
||||
"up_to_date": "Up to Date",
|
||||
"child_bridges": "Child Bridges",
|
||||
"child_bridges_status": "{{ok}}/{{total}}"
|
||||
},
|
||||
"autobrr": {
|
||||
"approvedPushes": "Approved",
|
||||
"rejectedPushes": "Rejected",
|
||||
"filters": "Filters",
|
||||
"indexers": "Indexers"
|
||||
},
|
||||
"watchtower": {
|
||||
"containers_scanned": "Scanned",
|
||||
"containers_updated": "Updated",
|
||||
"containers_failed": "Failed"
|
||||
},
|
||||
"tubearchivist": {
|
||||
"downloads": "Queue",
|
||||
"videos": "Videos",
|
||||
"channels": "Channels",
|
||||
"playlists": "Playlists"
|
||||
},
|
||||
"truenas": {
|
||||
"load": "System Load",
|
||||
"uptime": "Uptime",
|
||||
"alerts": "Alerts",
|
||||
"time": "{{value, number(style: unit; unitDisplay: long;)}}"
|
||||
},
|
||||
"navidrome": {
|
||||
"nothing_streaming": "No Active Streams",
|
||||
"please_wait": "Please Wait"
|
||||
},
|
||||
"pyload": {
|
||||
"speed": "Speed",
|
||||
"active": "Active",
|
||||
"queue": "Queue",
|
||||
"total": "Total"
|
||||
},
|
||||
"gluetun": {
|
||||
"public_ip": "Public IP",
|
||||
"region": "Region",
|
||||
"country": "Country"
|
||||
},
|
||||
"hdhomerun": {
|
||||
"channels": "Channels",
|
||||
"hd": "HD"
|
||||
}
|
||||
}
|
||||
|
|
|
@ -2,7 +2,11 @@
|
|||
"widget": {
|
||||
"missing_type": "Type de widget manquant: {{type}}",
|
||||
"api_error": "Erreur de l'API",
|
||||
"status": "Statut"
|
||||
"status": "Statut",
|
||||
"information": "Information",
|
||||
"url": "URL",
|
||||
"raw_error": "Raw Error",
|
||||
"response_data": "Response Data"
|
||||
},
|
||||
"search": {
|
||||
"placeholder": "Recherche…"
|
||||
|
@ -46,7 +50,8 @@
|
|||
"radarr": {
|
||||
"wanted": "Demande",
|
||||
"queued": "En attente",
|
||||
"movies": "Films"
|
||||
"movies": "Films",
|
||||
"missing": "Manquant"
|
||||
},
|
||||
"readarr": {
|
||||
"wanted": "Demande",
|
||||
|
@ -190,7 +195,12 @@
|
|||
"wlan_users": "Utilisateurs WLAN",
|
||||
"up": "UP",
|
||||
"down": "DOWN",
|
||||
"wait": "Merci de patienter"
|
||||
"wait": "Merci de patienter",
|
||||
"lan": "LAN",
|
||||
"wlan": "WLAN",
|
||||
"devices": "Équipt.",
|
||||
"lan_devices": "Équipt. LAN",
|
||||
"wlan_devices": "Équipt. WLAN"
|
||||
},
|
||||
"plex": {
|
||||
"streams": "Flux actif",
|
||||
|
@ -201,5 +211,121 @@
|
|||
"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": "Signet",
|
||||
"service": "Service"
|
||||
},
|
||||
"homebridge": {
|
||||
"available_update": "Système",
|
||||
"updates": "Mises à jour",
|
||||
"update_available": "Mise à jour disponible",
|
||||
"up_to_date": "À jour",
|
||||
"child_bridges": "Child Bridges",
|
||||
"child_bridges_status": "{{ok}}/{{total}}"
|
||||
},
|
||||
"autobrr": {
|
||||
"approvedPushes": "Approuvé",
|
||||
"rejectedPushes": "Rejeté",
|
||||
"filters": "Filtres",
|
||||
"indexers": "Indexeur"
|
||||
},
|
||||
"watchtower": {
|
||||
"containers_scanned": "Scanné",
|
||||
"containers_updated": "Mis à jour",
|
||||
"containers_failed": "Échoué"
|
||||
},
|
||||
"tubearchivist": {
|
||||
"downloads": "Queue",
|
||||
"videos": "Vidéos",
|
||||
"channels": "Chaînes",
|
||||
"playlists": "Playlists"
|
||||
},
|
||||
"truenas": {
|
||||
"load": "Charge Système",
|
||||
"uptime": "Démarré depuis",
|
||||
"alerts": "Alertes",
|
||||
"time": "{{value, number(style: unit; unitDisplay: long;)}}"
|
||||
},
|
||||
"navidrome": {
|
||||
"nothing_streaming": "Aucun flux actif",
|
||||
"please_wait": "Merci de patienter"
|
||||
},
|
||||
"pyload": {
|
||||
"speed": "Débit",
|
||||
"active": "Actif",
|
||||
"queue": "Queue",
|
||||
"total": "Total"
|
||||
},
|
||||
"gluetun": {
|
||||
"public_ip": "IP Publique",
|
||||
"region": "Région",
|
||||
"country": "Pays"
|
||||
},
|
||||
"hdhomerun": {
|
||||
"channels": "Channels",
|
||||
"hd": "HD"
|
||||
}
|
||||
}
|
||||
|
|
|
@ -2,7 +2,11 @@
|
|||
"widget": {
|
||||
"missing_type": "סוג ווידג'ט חסר: {{type}}",
|
||||
"api_error": "שגיאת API",
|
||||
"status": "סטטוס"
|
||||
"status": "סטטוס",
|
||||
"information": "Information",
|
||||
"url": "URL",
|
||||
"raw_error": "Raw Error",
|
||||
"response_data": "Response Data"
|
||||
},
|
||||
"weather": {
|
||||
"current": "מיקום נוכחי",
|
||||
|
@ -74,7 +78,8 @@
|
|||
"radarr": {
|
||||
"wanted": "מבוקש",
|
||||
"queued": "בתור",
|
||||
"movies": "סרטים"
|
||||
"movies": "סרטים",
|
||||
"missing": "Missing"
|
||||
},
|
||||
"lidarr": {
|
||||
"wanted": "מבוקש",
|
||||
|
@ -190,7 +195,12 @@
|
|||
"wlan_users": "WLAN Users",
|
||||
"up": "UP",
|
||||
"down": "DOWN",
|
||||
"wait": "Please wait"
|
||||
"wait": "Please wait",
|
||||
"lan": "LAN",
|
||||
"wlan": "WLAN",
|
||||
"devices": "Devices",
|
||||
"lan_devices": "LAN Devices",
|
||||
"wlan_devices": "WLAN Devices"
|
||||
},
|
||||
"plex": {
|
||||
"streams": "Active Streams",
|
||||
|
@ -201,5 +211,121 @@
|
|||
"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"
|
||||
},
|
||||
"homebridge": {
|
||||
"available_update": "System",
|
||||
"updates": "Updates",
|
||||
"update_available": "Update Available",
|
||||
"up_to_date": "Up to Date",
|
||||
"child_bridges": "Child Bridges",
|
||||
"child_bridges_status": "{{ok}}/{{total}}"
|
||||
},
|
||||
"autobrr": {
|
||||
"approvedPushes": "Approved",
|
||||
"rejectedPushes": "Rejected",
|
||||
"filters": "Filters",
|
||||
"indexers": "Indexers"
|
||||
},
|
||||
"watchtower": {
|
||||
"containers_scanned": "Scanned",
|
||||
"containers_updated": "Updated",
|
||||
"containers_failed": "Failed"
|
||||
},
|
||||
"tubearchivist": {
|
||||
"downloads": "Queue",
|
||||
"videos": "Videos",
|
||||
"channels": "Channels",
|
||||
"playlists": "Playlists"
|
||||
},
|
||||
"truenas": {
|
||||
"load": "System Load",
|
||||
"uptime": "Uptime",
|
||||
"alerts": "Alerts",
|
||||
"time": "{{value, number(style: unit; unitDisplay: long;)}}"
|
||||
},
|
||||
"navidrome": {
|
||||
"nothing_streaming": "No Active Streams",
|
||||
"please_wait": "Please Wait"
|
||||
},
|
||||
"pyload": {
|
||||
"speed": "Speed",
|
||||
"active": "Active",
|
||||
"queue": "Queue",
|
||||
"total": "Total"
|
||||
},
|
||||
"gluetun": {
|
||||
"public_ip": "Public IP",
|
||||
"region": "Region",
|
||||
"country": "Country"
|
||||
},
|
||||
"hdhomerun": {
|
||||
"channels": "Channels",
|
||||
"hd": "HD"
|
||||
}
|
||||
}
|
||||
|
|
331
public/locales/hi/common.json
Normal file
331
public/locales/hi/common.json
Normal file
|
@ -0,0 +1,331 @@
|
|||
{
|
||||
"widget": {
|
||||
"missing_type": "Missing Widget Type: {{type}}",
|
||||
"api_error": "API Error",
|
||||
"status": "Status",
|
||||
"information": "Information",
|
||||
"url": "URL",
|
||||
"raw_error": "Raw Error",
|
||||
"response_data": "Response Data"
|
||||
},
|
||||
"weather": {
|
||||
"current": "Current Location",
|
||||
"allow": "Click to allow",
|
||||
"updating": "Updating",
|
||||
"wait": "Please wait"
|
||||
},
|
||||
"readarr": {
|
||||
"queued": "Queued",
|
||||
"books": "Books",
|
||||
"wanted": "Wanted"
|
||||
},
|
||||
"bazarr": {
|
||||
"missingEpisodes": "Missing Episodes",
|
||||
"missingMovies": "Missing Movies"
|
||||
},
|
||||
"ombi": {
|
||||
"pending": "Pending",
|
||||
"approved": "Approved",
|
||||
"available": "Available"
|
||||
},
|
||||
"jellyseerr": {
|
||||
"pending": "Pending",
|
||||
"approved": "Approved",
|
||||
"available": "Available"
|
||||
},
|
||||
"traefik": {
|
||||
"services": "Services",
|
||||
"middleware": "Middleware",
|
||||
"routers": "Routers"
|
||||
},
|
||||
"mastodon": {
|
||||
"domain_count": "Domains",
|
||||
"user_count": "Users",
|
||||
"status_count": "Posts"
|
||||
},
|
||||
"authentik": {
|
||||
"users": "Users",
|
||||
"loginsLast24H": "Logins (24h)",
|
||||
"failedLoginsLast24H": "Failed Logins (24h)"
|
||||
},
|
||||
"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"
|
||||
},
|
||||
"changedetectionio": {
|
||||
"totalObserved": "Total Observed",
|
||||
"diffsDetected": "Diffs Detected"
|
||||
},
|
||||
"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",
|
||||
"missing": "Missing",
|
||||
"queued": "Queued",
|
||||
"movies": "Movies"
|
||||
},
|
||||
"lidarr": {
|
||||
"wanted": "Wanted",
|
||||
"queued": "Queued",
|
||||
"albums": "Albums"
|
||||
},
|
||||
"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"
|
||||
},
|
||||
"navidrome": {
|
||||
"nothing_streaming": "No Active Streams",
|
||||
"please_wait": "Please Wait"
|
||||
},
|
||||
"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"
|
||||
},
|
||||
"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"
|
||||
},
|
||||
"homebridge": {
|
||||
"available_update": "System",
|
||||
"updates": "Updates",
|
||||
"update_available": "Update Available",
|
||||
"up_to_date": "Up to Date",
|
||||
"child_bridges": "Child Bridges",
|
||||
"child_bridges_status": "{{ok}}/{{total}}"
|
||||
},
|
||||
"watchtower": {
|
||||
"containers_scanned": "Scanned",
|
||||
"containers_updated": "Updated",
|
||||
"containers_failed": "Failed"
|
||||
},
|
||||
"autobrr": {
|
||||
"approvedPushes": "Approved",
|
||||
"rejectedPushes": "Rejected",
|
||||
"filters": "Filters",
|
||||
"indexers": "Indexers"
|
||||
},
|
||||
"tubearchivist": {
|
||||
"downloads": "Queue",
|
||||
"videos": "Videos",
|
||||
"channels": "Channels",
|
||||
"playlists": "Playlists"
|
||||
},
|
||||
"truenas": {
|
||||
"load": "System Load",
|
||||
"uptime": "Uptime",
|
||||
"time": "{{value, number(style: unit; unitDisplay: long;)}}",
|
||||
"alerts": "Alerts"
|
||||
},
|
||||
"pyload": {
|
||||
"speed": "Speed",
|
||||
"active": "Active",
|
||||
"queue": "Queue",
|
||||
"total": "Total"
|
||||
},
|
||||
"gluetun": {
|
||||
"public_ip": "Public IP",
|
||||
"region": "Region",
|
||||
"country": "Country"
|
||||
},
|
||||
"hdhomerun": {
|
||||
"channels": "Channels",
|
||||
"hd": "HD"
|
||||
}
|
||||
}
|
|
@ -1,6 +1,6 @@
|
|||
{
|
||||
"weather": {
|
||||
"current": "Tranutačna lokacija",
|
||||
"current": "Trenutačna lokacija",
|
||||
"allow": "Pritisni za dozvoljavanje",
|
||||
"updating": "Aktualiziranje",
|
||||
"wait": "Pričekaj"
|
||||
|
@ -17,7 +17,7 @@
|
|||
},
|
||||
"sabnzbd": {
|
||||
"rate": "Stopa",
|
||||
"queue": "Red",
|
||||
"queue": "Red čekanja",
|
||||
"timeleft": "Preostalo vrijeme"
|
||||
},
|
||||
"overseerr": {
|
||||
|
@ -28,7 +28,7 @@
|
|||
"pihole": {
|
||||
"queries": "Upiti",
|
||||
"blocked": "Blokirano",
|
||||
"gravity": "Ozbiljnost"
|
||||
"gravity": "Čuvanje podataka"
|
||||
},
|
||||
"adguard": {
|
||||
"latency": "Kašnjenje",
|
||||
|
@ -58,14 +58,18 @@
|
|||
"widget": {
|
||||
"missing_type": "Nedostajuća vrsta widgeta: {{type}}",
|
||||
"api_error": "API greška",
|
||||
"status": "Stanje"
|
||||
"status": "Stanje",
|
||||
"information": "Information",
|
||||
"url": "URL",
|
||||
"raw_error": "Raw Error",
|
||||
"response_data": "Response Data"
|
||||
},
|
||||
"docker": {
|
||||
"rx": "RX",
|
||||
"tx": "TX",
|
||||
"mem": "MEM",
|
||||
"cpu": "CPU",
|
||||
"offline": "Odspojen"
|
||||
"offline": "Nepovezan"
|
||||
},
|
||||
"emby": {
|
||||
"playing": "Reprodukcija",
|
||||
|
@ -92,26 +96,27 @@
|
|||
"transmission": {
|
||||
"download": "Preuzimanje",
|
||||
"upload": "Prijenos",
|
||||
"leech": "Krvopija",
|
||||
"seed": "Prijenos preuzetog sadržaja"
|
||||
"leech": "Leecher",
|
||||
"seed": "Seeder"
|
||||
},
|
||||
"sonarr": {
|
||||
"wanted": "Željeno",
|
||||
"wanted": "Zatraženo",
|
||||
"queued": "U redu čekanja",
|
||||
"series": "Serije"
|
||||
},
|
||||
"radarr": {
|
||||
"wanted": "Željeno",
|
||||
"wanted": "Zatraženo",
|
||||
"queued": "U redu čekanja",
|
||||
"movies": "Filmovi"
|
||||
"movies": "Filmovi",
|
||||
"missing": "Nedostaje"
|
||||
},
|
||||
"lidarr": {
|
||||
"wanted": "Željeno",
|
||||
"wanted": "Zatraženo",
|
||||
"queued": "U redu čekanja",
|
||||
"albums": "Albumi"
|
||||
},
|
||||
"readarr": {
|
||||
"wanted": "Željeno",
|
||||
"wanted": "Zatraženo",
|
||||
"queued": "U redu čekanja",
|
||||
"books": "Knjige"
|
||||
},
|
||||
|
@ -142,7 +147,7 @@
|
|||
"traefik": {
|
||||
"routers": "Ruteri",
|
||||
"services": "Usluge",
|
||||
"middleware": "Middleware"
|
||||
"middleware": "Posrednički softver"
|
||||
},
|
||||
"gotify": {
|
||||
"clients": "Klijenti",
|
||||
|
@ -156,8 +161,8 @@
|
|||
"qbittorrent": {
|
||||
"download": "Preuzimanje",
|
||||
"upload": "Prijenos",
|
||||
"leech": "Krvopija",
|
||||
"seed": "Prijenos preuzetog sadržaja"
|
||||
"leech": "Leecher",
|
||||
"seed": "Seeder"
|
||||
},
|
||||
"mastodon": {
|
||||
"user_count": "Korisnici",
|
||||
|
@ -171,35 +176,156 @@
|
|||
"transferRate": "Stopa"
|
||||
},
|
||||
"authentik": {
|
||||
"users": "Users",
|
||||
"loginsLast24H": "Logins (24h)",
|
||||
"failedLoginsLast24H": "Failed Logins (24h)"
|
||||
"users": "Korisnici",
|
||||
"loginsLast24H": "Prijave (24 h)",
|
||||
"failedLoginsLast24H": "Neuspjele prijave (24 h)"
|
||||
},
|
||||
"proxmox": {
|
||||
"mem": "MEM",
|
||||
"cpu": "CPU",
|
||||
"lxc": "LXC",
|
||||
"vms": "VMs"
|
||||
"lxc": "Linux kontejner",
|
||||
"vms": "Virtualni uređaji"
|
||||
},
|
||||
"unifi": {
|
||||
"users": "Users",
|
||||
"uptime": "System Uptime",
|
||||
"days": "Days",
|
||||
"users": "Korisnici",
|
||||
"uptime": "Radno vrijeme sustava",
|
||||
"days": "Dani",
|
||||
"wan": "WAN",
|
||||
"lan_users": "LAN Users",
|
||||
"wlan_users": "WLAN Users",
|
||||
"up": "UP",
|
||||
"down": "DOWN",
|
||||
"wait": "Please wait"
|
||||
"lan_users": "LAN korisnici",
|
||||
"wlan_users": "WLAN korisnici",
|
||||
"up": "SLANJE",
|
||||
"down": "PRIMANJE",
|
||||
"wait": "Pričekaj",
|
||||
"lan": "LAN",
|
||||
"wlan": "WLAN",
|
||||
"devices": "Uređaji",
|
||||
"lan_devices": "LAN uređaji",
|
||||
"wlan_devices": "WLAN uređaji"
|
||||
},
|
||||
"plex": {
|
||||
"streams": "Active Streams",
|
||||
"movies": "Movies",
|
||||
"tv": "TV Shows"
|
||||
"streams": "Aktivni prijenosi",
|
||||
"movies": "Filmovi",
|
||||
"tv": "TV emisije"
|
||||
},
|
||||
"glances": {
|
||||
"cpu": "CPU",
|
||||
"mem": "MEM",
|
||||
"wait": "Please wait"
|
||||
"wait": "Pričekaj"
|
||||
},
|
||||
"changedetectionio": {
|
||||
"totalObserved": "Ukupno promatrano",
|
||||
"diffsDetected": "Otkrivene razlike"
|
||||
},
|
||||
"wmo": {
|
||||
"0-day": "Sunčano",
|
||||
"0-night": "Vedro",
|
||||
"1-day": "Pretežno sunčano",
|
||||
"1-night": "Pretežno verdo",
|
||||
"2-day": "Djelimično oblačno",
|
||||
"45-day": "Maglovito",
|
||||
"45-night": "Maglovito",
|
||||
"48-day": "Maglovito",
|
||||
"2-night": "Djelimično oblačno",
|
||||
"3-day": "Oblačno",
|
||||
"3-night": "Oblačno",
|
||||
"48-night": "Maglovito",
|
||||
"51-day": "Laka rosulja",
|
||||
"51-night": "Laka rosulja",
|
||||
"53-day": "Rosulja",
|
||||
"53-night": "Rosulja",
|
||||
"55-day": "Jaka rosulja",
|
||||
"55-night": "Jaka rosulja",
|
||||
"56-day": "Laka ledena rosulja",
|
||||
"56-night": "Laka ledena rosulja",
|
||||
"57-day": "Ledena rosulja",
|
||||
"57-night": "Ledena rosulja",
|
||||
"61-day": "Laka kiša",
|
||||
"61-night": "Laka kiša",
|
||||
"63-day": "Kiša",
|
||||
"63-night": "Kiša",
|
||||
"65-day": "Jaka kiša",
|
||||
"65-night": "Jaka kiša",
|
||||
"66-day": "Ledena kiša",
|
||||
"66-night": "Ledena kiša",
|
||||
"67-day": "Ledena kiša",
|
||||
"67-night": "Ledena kiša",
|
||||
"75-night": "Jaki snijeg",
|
||||
"77-day": "Zrnati snijeg",
|
||||
"71-day": "Laki snijeg",
|
||||
"71-night": "Laki snijeg",
|
||||
"73-day": "Snijeg",
|
||||
"73-night": "Snijeg",
|
||||
"75-day": "Jaki snijeg",
|
||||
"77-night": "Zrnati snijeg",
|
||||
"80-day": "Laki pljuskovi",
|
||||
"80-night": "Laki pljuskovi",
|
||||
"81-day": "Pljuskovi",
|
||||
"81-night": "Pljuskovi",
|
||||
"82-day": "Jaki pljuskovi",
|
||||
"82-night": "Jaki pljuskovi",
|
||||
"85-day": "Snježni pljuskovi",
|
||||
"85-night": "Snježni pljuskovi",
|
||||
"86-day": "Snježni pljuskovi",
|
||||
"86-night": "Snježni pljuskovi",
|
||||
"95-day": "Oluja",
|
||||
"95-night": "Oluja",
|
||||
"96-day": "Oluja s tučom",
|
||||
"96-night": "Oluja s tučom",
|
||||
"99-day": "Oluja s tučom",
|
||||
"99-night": "Oluja s tučom"
|
||||
},
|
||||
"quicklaunch": {
|
||||
"bookmark": "Straničnik",
|
||||
"service": "Usluga"
|
||||
},
|
||||
"homebridge": {
|
||||
"available_update": "Sustav",
|
||||
"updates": "Aktualiziranja",
|
||||
"update_available": "Dostupna je nova verzija",
|
||||
"up_to_date": "Aktualno",
|
||||
"child_bridges": "Podređeni mosotvi",
|
||||
"child_bridges_status": "{{ok}}/{{total}}"
|
||||
},
|
||||
"autobrr": {
|
||||
"rejectedPushes": "Odbijeno",
|
||||
"approvedPushes": "Odobreno",
|
||||
"filters": "Filtri",
|
||||
"indexers": "Indeksatori"
|
||||
},
|
||||
"watchtower": {
|
||||
"containers_scanned": "Skenirano",
|
||||
"containers_updated": "Aktualizirano",
|
||||
"containers_failed": "Neuspjelo"
|
||||
},
|
||||
"tubearchivist": {
|
||||
"downloads": "Red čekanja",
|
||||
"videos": "Videa",
|
||||
"channels": "Kanali",
|
||||
"playlists": "Playliste"
|
||||
},
|
||||
"truenas": {
|
||||
"load": "Opterećenje sustava",
|
||||
"uptime": "Radno vrijeme",
|
||||
"alerts": "Upozorenja",
|
||||
"time": "{{value, number(style: unit; unitDisplay: long;)}}"
|
||||
},
|
||||
"navidrome": {
|
||||
"nothing_streaming": "Nema aktivnih prijenosa",
|
||||
"please_wait": "Pričekaj"
|
||||
},
|
||||
"pyload": {
|
||||
"speed": "Brzina",
|
||||
"active": "Aktivno",
|
||||
"queue": "Red čekanja",
|
||||
"total": "Ukupno"
|
||||
},
|
||||
"gluetun": {
|
||||
"public_ip": "Public IP",
|
||||
"region": "Region",
|
||||
"country": "Country"
|
||||
},
|
||||
"hdhomerun": {
|
||||
"channels": "Channels",
|
||||
"hd": "HD"
|
||||
}
|
||||
}
|
||||
|
|
|
@ -30,7 +30,11 @@
|
|||
"widget": {
|
||||
"missing_type": "Hiányzó Widget Típus: {{type}}",
|
||||
"api_error": "API Hiba",
|
||||
"status": "Státusz"
|
||||
"status": "Státusz",
|
||||
"information": "Information",
|
||||
"url": "URL",
|
||||
"raw_error": "Raw Error",
|
||||
"response_data": "Response Data"
|
||||
},
|
||||
"weather": {
|
||||
"current": "Aktuális hely",
|
||||
|
@ -88,7 +92,8 @@
|
|||
"radarr": {
|
||||
"wanted": "Keresett",
|
||||
"queued": "Sorban áll",
|
||||
"movies": "Filmek"
|
||||
"movies": "Filmek",
|
||||
"missing": "Missing"
|
||||
},
|
||||
"ombi": {
|
||||
"pending": "Függőben",
|
||||
|
@ -190,7 +195,12 @@
|
|||
"wlan_users": "WLAN Users",
|
||||
"up": "UP",
|
||||
"down": "DOWN",
|
||||
"wait": "Please wait"
|
||||
"wait": "Please wait",
|
||||
"lan": "LAN",
|
||||
"wlan": "WLAN",
|
||||
"devices": "Devices",
|
||||
"lan_devices": "LAN Devices",
|
||||
"wlan_devices": "WLAN Devices"
|
||||
},
|
||||
"plex": {
|
||||
"streams": "Active Streams",
|
||||
|
@ -201,5 +211,121 @@
|
|||
"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"
|
||||
},
|
||||
"homebridge": {
|
||||
"available_update": "System",
|
||||
"updates": "Updates",
|
||||
"update_available": "Update Available",
|
||||
"up_to_date": "Up to Date",
|
||||
"child_bridges": "Child Bridges",
|
||||
"child_bridges_status": "{{ok}}/{{total}}"
|
||||
},
|
||||
"autobrr": {
|
||||
"approvedPushes": "Approved",
|
||||
"rejectedPushes": "Rejected",
|
||||
"filters": "Filters",
|
||||
"indexers": "Indexers"
|
||||
},
|
||||
"watchtower": {
|
||||
"containers_scanned": "Scanned",
|
||||
"containers_updated": "Updated",
|
||||
"containers_failed": "Failed"
|
||||
},
|
||||
"tubearchivist": {
|
||||
"downloads": "Queue",
|
||||
"videos": "Videos",
|
||||
"channels": "Channels",
|
||||
"playlists": "Playlists"
|
||||
},
|
||||
"truenas": {
|
||||
"load": "System Load",
|
||||
"uptime": "Uptime",
|
||||
"alerts": "Alerts",
|
||||
"time": "{{value, number(style: unit; unitDisplay: long;)}}"
|
||||
},
|
||||
"navidrome": {
|
||||
"nothing_streaming": "No Active Streams",
|
||||
"please_wait": "Please Wait"
|
||||
},
|
||||
"pyload": {
|
||||
"speed": "Speed",
|
||||
"active": "Active",
|
||||
"queue": "Queue",
|
||||
"total": "Total"
|
||||
},
|
||||
"gluetun": {
|
||||
"public_ip": "Public IP",
|
||||
"region": "Region",
|
||||
"country": "Country"
|
||||
},
|
||||
"hdhomerun": {
|
||||
"channels": "Channels",
|
||||
"hd": "HD"
|
||||
}
|
||||
}
|
||||
|
|
|
@ -34,9 +34,13 @@
|
|||
"middleware": "Middleware"
|
||||
},
|
||||
"widget": {
|
||||
"missing_type": "Missing Widget Type: {{type}}",
|
||||
"missing_type": "Tipo del Widget Mancante: {{type}}",
|
||||
"api_error": "Errore API",
|
||||
"status": "Stato"
|
||||
"status": "Stato",
|
||||
"url": "URL",
|
||||
"information": "Information",
|
||||
"raw_error": "Raw Error",
|
||||
"response_data": "Response Data"
|
||||
},
|
||||
"search": {
|
||||
"placeholder": "Cerca…"
|
||||
|
@ -45,7 +49,7 @@
|
|||
"total": "Totale",
|
||||
"free": "Libero",
|
||||
"used": "In utilizzo",
|
||||
"load": "Load",
|
||||
"load": "Carica",
|
||||
"cpu": "CPU"
|
||||
},
|
||||
"rutorrent": {
|
||||
|
@ -55,18 +59,19 @@
|
|||
},
|
||||
"sonarr": {
|
||||
"series": "Serie",
|
||||
"wanted": "Rchiesti",
|
||||
"wanted": "Richiesti",
|
||||
"queued": "In coda"
|
||||
},
|
||||
"radarr": {
|
||||
"wanted": "Richiesti",
|
||||
"queued": "In coda",
|
||||
"movies": "Film"
|
||||
"movies": "Film",
|
||||
"missing": "Mancanti"
|
||||
},
|
||||
"readarr": {
|
||||
"wanted": "Wanted",
|
||||
"queued": "Queued",
|
||||
"books": "Books"
|
||||
"wanted": "Richiesti",
|
||||
"queued": "In coda",
|
||||
"books": "Libri"
|
||||
},
|
||||
"ombi": {
|
||||
"pending": "In attesa",
|
||||
|
@ -110,11 +115,11 @@
|
|||
"downloaded": "Scaricato"
|
||||
},
|
||||
"coinmarketcap": {
|
||||
"configure": "Configure one or more crypto currencies to track",
|
||||
"1day": "1 Day",
|
||||
"7days": "7 Days",
|
||||
"1hour": "1 Hour",
|
||||
"30days": "30 Days"
|
||||
"configure": "Configurare una o più criptomonete da seguire",
|
||||
"1day": "1 Giorno",
|
||||
"7days": "7 Giorni",
|
||||
"1hour": "1 Ora",
|
||||
"30days": "30 Giorni"
|
||||
},
|
||||
"gotify": {
|
||||
"apps": "Applicazioni",
|
||||
|
@ -122,11 +127,11 @@
|
|||
"messages": "Messaggi"
|
||||
},
|
||||
"prowlarr": {
|
||||
"enableIndexers": "Indexers",
|
||||
"enableIndexers": "Indicizzatori",
|
||||
"numberOfGrabs": "Grabs",
|
||||
"numberOfQueries": "Queries",
|
||||
"numberOfFailGrabs": "Fail Grabs",
|
||||
"numberOfFailQueries": "Fail Queries"
|
||||
"numberOfFailGrabs": "Grabs Falliti",
|
||||
"numberOfFailQueries": "Queries Fallite"
|
||||
},
|
||||
"transmission": {
|
||||
"download": "Download",
|
||||
|
@ -135,23 +140,23 @@
|
|||
"seed": "Seed"
|
||||
},
|
||||
"jackett": {
|
||||
"configured": "Configured",
|
||||
"errored": "Errored"
|
||||
"configured": "Configurato",
|
||||
"errored": "Errore"
|
||||
},
|
||||
"bazarr": {
|
||||
"missingEpisodes": "Missing Episodes",
|
||||
"missingMovies": "Missing Movies"
|
||||
"missingEpisodes": "Episodi Mancanti",
|
||||
"missingMovies": "Film Mancanti"
|
||||
},
|
||||
"lidarr": {
|
||||
"wanted": "Wanted",
|
||||
"queued": "Queued",
|
||||
"wanted": "Mancanti",
|
||||
"queued": "In coda",
|
||||
"albums": "Albums"
|
||||
},
|
||||
"adguard": {
|
||||
"queries": "Queries",
|
||||
"blocked": "Blocked",
|
||||
"filtered": "Filtered",
|
||||
"latency": "Latency"
|
||||
"blocked": "Bloccati",
|
||||
"filtered": "Filtrati",
|
||||
"latency": "Latenza"
|
||||
},
|
||||
"qbittorrent": {
|
||||
"download": "Download",
|
||||
|
@ -160,46 +165,167 @@
|
|||
"seed": "Seed"
|
||||
},
|
||||
"mastodon": {
|
||||
"user_count": "Users",
|
||||
"user_count": "Utenti",
|
||||
"status_count": "Posts",
|
||||
"domain_count": "Domains"
|
||||
"domain_count": "Domini"
|
||||
},
|
||||
"strelaysrv": {
|
||||
"numActiveSessions": "Sessions",
|
||||
"numConnections": "Connections",
|
||||
"dataRelayed": "Relayed",
|
||||
"transferRate": "Rate"
|
||||
"numActiveSessions": "Sessioni",
|
||||
"numConnections": "Connessioni",
|
||||
"dataRelayed": "Ritrasmettessi",
|
||||
"transferRate": "Velocità"
|
||||
},
|
||||
"authentik": {
|
||||
"users": "Users",
|
||||
"loginsLast24H": "Logins (24h)",
|
||||
"failedLoginsLast24H": "Failed Logins (24h)"
|
||||
"users": "Utenti",
|
||||
"loginsLast24H": "Accessi (24h)",
|
||||
"failedLoginsLast24H": "Accessi Falliti (24h)"
|
||||
},
|
||||
"proxmox": {
|
||||
"mem": "MEM",
|
||||
"cpu": "CPU",
|
||||
"lxc": "LXC",
|
||||
"vms": "VMs"
|
||||
"vms": "Macchine Virtuali"
|
||||
},
|
||||
"unifi": {
|
||||
"users": "Users",
|
||||
"uptime": "System Uptime",
|
||||
"days": "Days",
|
||||
"users": "Utenti",
|
||||
"uptime": "Uptime di Sistema",
|
||||
"days": "Giorni",
|
||||
"wan": "WAN",
|
||||
"lan_users": "LAN Users",
|
||||
"wait": "Please wait",
|
||||
"wlan_users": "WLAN Users",
|
||||
"lan_users": "Utenti LAN",
|
||||
"wait": "Attendere prego",
|
||||
"wlan_users": "Utenti WLAN",
|
||||
"up": "UP",
|
||||
"down": "DOWN"
|
||||
"down": "DOWN",
|
||||
"lan": "LAN",
|
||||
"wlan": "WLAN",
|
||||
"devices": "Dispositivi",
|
||||
"lan_devices": "Dispositivi LAN",
|
||||
"wlan_devices": "Dispositivi WLAN"
|
||||
},
|
||||
"plex": {
|
||||
"streams": "Active Streams",
|
||||
"movies": "Movies",
|
||||
"tv": "TV Shows"
|
||||
"streams": "Trasmissioni attive",
|
||||
"movies": "Film",
|
||||
"tv": "Programma televisivo"
|
||||
},
|
||||
"glances": {
|
||||
"cpu": "CPU",
|
||||
"mem": "MEM",
|
||||
"wait": "Please wait"
|
||||
"wait": "Attendere prego"
|
||||
},
|
||||
"changedetectionio": {
|
||||
"totalObserved": "Totale Osservato",
|
||||
"diffsDetected": "Differenze Rilevate"
|
||||
},
|
||||
"wmo": {
|
||||
"65-day": "Pioggia Intensa",
|
||||
"2-night": "Parzialmente Nuvoloso",
|
||||
"0-day": "Solleggiato",
|
||||
"0-night": "Pulisci",
|
||||
"1-day": "Principalmente Soleggiato",
|
||||
"1-night": "Principalmente Sereno",
|
||||
"2-day": "Parzialmente Nuvoloso",
|
||||
"3-day": "Nuvoloso",
|
||||
"3-night": "Nuvoloso",
|
||||
"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": "Leggera Pioggia Gelata",
|
||||
"56-night": "Leggera Pioggia Gelata",
|
||||
"57-day": "Pioggerella Gelata",
|
||||
"57-night": "Pioggerella Gelata",
|
||||
"61-day": "Pioggia Leggera",
|
||||
"61-night": "Pioggia Leggera",
|
||||
"63-day": "Pioggia",
|
||||
"63-night": "Pioggia",
|
||||
"65-night": "Pioggia Intensa",
|
||||
"66-day": "Grandine",
|
||||
"66-night": "Grandine",
|
||||
"67-day": "Grandine",
|
||||
"67-night": "Grandine",
|
||||
"71-day": "Leggera Nevicata",
|
||||
"71-night": "Leggera Nevicata",
|
||||
"73-day": "Neve",
|
||||
"73-night": "Neve",
|
||||
"75-day": "Nevicata Intensa",
|
||||
"75-night": "Nevicata Intensa",
|
||||
"77-day": "Fiocchi di Neve",
|
||||
"77-night": "Fiocchi di Neve",
|
||||
"80-day": "Leggeri Rovesci",
|
||||
"80-night": "Leggeri Rovesci",
|
||||
"81-day": "Rovesci",
|
||||
"81-night": "Rovesci",
|
||||
"82-day": "Intensi Rovesci",
|
||||
"82-night": "Intensi Rovesci",
|
||||
"85-day": "Rovesci di Neve",
|
||||
"85-night": "Rovesci di Neve",
|
||||
"86-day": "Rovesci di Neve",
|
||||
"86-night": "Rovesci di Neve",
|
||||
"95-day": "Temporale",
|
||||
"95-night": "Temporale",
|
||||
"96-day": "Temporale con grandine",
|
||||
"96-night": "Temporale con grandine",
|
||||
"99-day": "Temporale con grandine",
|
||||
"99-night": "Temporale con grandine"
|
||||
},
|
||||
"quicklaunch": {
|
||||
"bookmark": "Segnalibro",
|
||||
"service": "Servizio"
|
||||
},
|
||||
"homebridge": {
|
||||
"available_update": "Sistema",
|
||||
"updates": "Aggiornamenti",
|
||||
"update_available": "Aggiornamento Disponibile",
|
||||
"up_to_date": "Aggiornato",
|
||||
"child_bridges": "Child Bridges",
|
||||
"child_bridges_status": "{{ok}}/{{total}}"
|
||||
},
|
||||
"autobrr": {
|
||||
"approvedPushes": "Approvato",
|
||||
"rejectedPushes": "Rifiutato",
|
||||
"filters": "Filtri",
|
||||
"indexers": "Indicizzatori"
|
||||
},
|
||||
"watchtower": {
|
||||
"containers_scanned": "Scansionato",
|
||||
"containers_updated": "Aggiornato",
|
||||
"containers_failed": "Fallito"
|
||||
},
|
||||
"tubearchivist": {
|
||||
"downloads": "Coda",
|
||||
"videos": "Video",
|
||||
"channels": "Canali",
|
||||
"playlists": "Playlists"
|
||||
},
|
||||
"truenas": {
|
||||
"load": "Carico di Sistema",
|
||||
"uptime": "Uptime",
|
||||
"alerts": "Alerts",
|
||||
"time": "{{value, number(style: unit; unitDisplay: long;)}}"
|
||||
},
|
||||
"navidrome": {
|
||||
"nothing_streaming": "Nessun Sistema Attivo",
|
||||
"please_wait": "Attendere, Prego"
|
||||
},
|
||||
"pyload": {
|
||||
"speed": "Velocità",
|
||||
"active": "Attivo",
|
||||
"queue": "Coda",
|
||||
"total": "Totale"
|
||||
},
|
||||
"gluetun": {
|
||||
"public_ip": "Public IP",
|
||||
"region": "Region",
|
||||
"country": "Country"
|
||||
},
|
||||
"hdhomerun": {
|
||||
"channels": "Channels",
|
||||
"hd": "HD"
|
||||
}
|
||||
}
|
||||
|
|
331
public/locales/ms/common.json
Normal file
331
public/locales/ms/common.json
Normal file
|
@ -0,0 +1,331 @@
|
|||
{
|
||||
"resources": {
|
||||
"cpu": "CPU",
|
||||
"total": "Jumlah",
|
||||
"free": "Bebas",
|
||||
"used": "Telah diguna",
|
||||
"load": "Beban"
|
||||
},
|
||||
"unifi": {
|
||||
"uptime": "Masa Operasi Sistem",
|
||||
"users": "Pengguna",
|
||||
"days": "Hari",
|
||||
"wan": "WAN",
|
||||
"lan": "LAN",
|
||||
"wlan": "WLAN",
|
||||
"devices": "Peranti",
|
||||
"lan_devices": "Peranti LAN",
|
||||
"wlan_devices": "Peranti WLAN",
|
||||
"lan_users": "Pengguna LAN",
|
||||
"wlan_users": "Pengguna WLAN",
|
||||
"up": "HIDUP",
|
||||
"down": "MATI",
|
||||
"wait": "Sila tunggu"
|
||||
},
|
||||
"lidarr": {
|
||||
"queued": "Dibaris Gilir",
|
||||
"albums": "Album",
|
||||
"wanted": "Mahu"
|
||||
},
|
||||
"readarr": {
|
||||
"wanted": "Mahu",
|
||||
"queued": "Dibaris Gilir",
|
||||
"books": "Buku"
|
||||
},
|
||||
"jellyseerr": {
|
||||
"pending": "Tertangguh",
|
||||
"approved": "Lulus",
|
||||
"available": "Sudah Ada"
|
||||
},
|
||||
"coinmarketcap": {
|
||||
"30days": "30 Hari",
|
||||
"configure": "Konfigurasikan satu atau lebih matawang crypto untuk dipantau",
|
||||
"1hour": "1 Jam",
|
||||
"1day": "1 Hari",
|
||||
"7days": "7 Hari"
|
||||
},
|
||||
"gotify": {
|
||||
"apps": "Aplikasi",
|
||||
"clients": "Klien",
|
||||
"messages": "Mesej"
|
||||
},
|
||||
"proxmox": {
|
||||
"mem": "MEM",
|
||||
"cpu": "CPU",
|
||||
"lxc": "LXC",
|
||||
"vms": "Mesin Maya"
|
||||
},
|
||||
"glances": {
|
||||
"cpu": "CPU",
|
||||
"mem": "MEM",
|
||||
"wait": "Sila tunggu"
|
||||
},
|
||||
"quicklaunch": {
|
||||
"bookmark": "Tandabuku",
|
||||
"service": "Servis"
|
||||
},
|
||||
"wmo": {
|
||||
"0-day": "Terik",
|
||||
"0-night": "Cerah",
|
||||
"1-day": "Sebahagian Besar Terik",
|
||||
"1-night": "Sebahagian Besar Cerah",
|
||||
"63-day": "Hujan",
|
||||
"63-night": "Hujan",
|
||||
"2-day": "Sebahagian Mendung",
|
||||
"2-night": "Sebahagian Mendung",
|
||||
"3-day": "Mendung",
|
||||
"3-night": "Mendung",
|
||||
"45-day": "Berkabus",
|
||||
"45-night": "Berkabus",
|
||||
"48-day": "Berkabus",
|
||||
"48-night": "Berkabus",
|
||||
"51-day": "Gerimis",
|
||||
"51-night": "Gerimis",
|
||||
"53-day": "Renyai",
|
||||
"53-night": "Renyai",
|
||||
"55-day": "Renyai Kuat",
|
||||
"55-night": "Renyai Kuat",
|
||||
"56-day": "Gerimis Sejuk Ringan",
|
||||
"56-night": "Gerimis Sejuk Ringan",
|
||||
"57-day": "Gerimis Sejuk",
|
||||
"57-night": "Gerimis Sejuk",
|
||||
"61-day": "Hujan Renyai",
|
||||
"61-night": "Hujan Renyai",
|
||||
"65-day": "Hujan Lebat",
|
||||
"65-night": "Hujan Lebat",
|
||||
"66-day": "Hujan Sejuk",
|
||||
"66-night": "Hujan Sejuk",
|
||||
"67-day": "Hujan Sejuk",
|
||||
"67-night": "Hujan Sejuk",
|
||||
"71-day": "Salji Ringan",
|
||||
"71-night": "Salji Ringan",
|
||||
"73-day": "Salji",
|
||||
"73-night": "Salji",
|
||||
"75-day": "Salji Lebat",
|
||||
"75-night": "Salji Lebat",
|
||||
"81-day": "Rintik",
|
||||
"77-day": "Butiran Salji",
|
||||
"77-night": "Butiran Salji",
|
||||
"80-day": "Rintik Ringan",
|
||||
"80-night": "Rintik Ringan",
|
||||
"81-night": "Rintik",
|
||||
"82-day": "Rintik Lebat",
|
||||
"82-night": "Rintik Lebat",
|
||||
"85-day": "Rintik Salji",
|
||||
"85-night": "Rintik Salji",
|
||||
"86-day": "Rintik Salji",
|
||||
"86-night": "Rintik Salji",
|
||||
"95-day": "Ribut",
|
||||
"95-night": "Ribut",
|
||||
"96-day": "Ribut Hujan Batu",
|
||||
"96-night": "Ribut Hujan Batu",
|
||||
"99-day": "Ribut Hujan Batu",
|
||||
"99-night": "Ribut Hujan Batu"
|
||||
},
|
||||
"widget": {
|
||||
"missing_type": "Jenis Widget Hilang: {{type}}",
|
||||
"api_error": "Masalah API",
|
||||
"status": "Status",
|
||||
"information": "Information",
|
||||
"url": "URL",
|
||||
"raw_error": "Raw Error",
|
||||
"response_data": "Response Data"
|
||||
},
|
||||
"weather": {
|
||||
"current": "Lokasi Sekarang",
|
||||
"allow": "Klik untuk benarkan",
|
||||
"updating": "Mengemas kini",
|
||||
"wait": "Sila tunggu"
|
||||
},
|
||||
"search": {
|
||||
"placeholder": "Carian…"
|
||||
},
|
||||
"nzbget": {
|
||||
"remaining": "Baki",
|
||||
"downloaded": "Telah Muat Turun",
|
||||
"rate": "Kadar"
|
||||
},
|
||||
"docker": {
|
||||
"rx": "RX",
|
||||
"tx": "TX",
|
||||
"mem": "MEM",
|
||||
"cpu": "CPU",
|
||||
"offline": "Luar talian"
|
||||
},
|
||||
"changedetectionio": {
|
||||
"totalObserved": "Jumlah Diperhatikan",
|
||||
"diffsDetected": "Perbezaan Dikesan"
|
||||
},
|
||||
"emby": {
|
||||
"playing": "Sedang dimainkan",
|
||||
"transcoding": "Transkoding",
|
||||
"bitrate": "Kadar bit",
|
||||
"no_active": "Tiada Strim Aktif"
|
||||
},
|
||||
"tautulli": {
|
||||
"playing": "Sedang Dimainkan",
|
||||
"transcoding": "Transkoding",
|
||||
"bitrate": "Kadar bit",
|
||||
"no_active": "Tiada Strim Aktif"
|
||||
},
|
||||
"plex": {
|
||||
"streams": "Strim Aktif",
|
||||
"movies": "Filem",
|
||||
"tv": "Rancangan TV"
|
||||
},
|
||||
"sabnzbd": {
|
||||
"rate": "Kadar",
|
||||
"queue": "Barisan",
|
||||
"timeleft": "Masa Tinggal"
|
||||
},
|
||||
"rutorrent": {
|
||||
"active": "Aktif",
|
||||
"upload": "Muat Naik",
|
||||
"download": "Muat Turun"
|
||||
},
|
||||
"transmission": {
|
||||
"leech": "Leech",
|
||||
"download": "Muat Turun",
|
||||
"upload": "Muat Naik",
|
||||
"seed": "Seed"
|
||||
},
|
||||
"qbittorrent": {
|
||||
"download": "Muat Turun",
|
||||
"upload": "Muat Naik",
|
||||
"leech": "Leech",
|
||||
"seed": "Seed"
|
||||
},
|
||||
"sonarr": {
|
||||
"wanted": "Mahu",
|
||||
"queued": "Dibaris Gilir",
|
||||
"series": "Bersiri"
|
||||
},
|
||||
"radarr": {
|
||||
"wanted": "Mahu",
|
||||
"missing": "Hilang",
|
||||
"queued": "Dibaris Gilir",
|
||||
"movies": "Filem"
|
||||
},
|
||||
"bazarr": {
|
||||
"missingEpisodes": "Episod Yang Hilang",
|
||||
"missingMovies": "Filem Yang Hilang"
|
||||
},
|
||||
"ombi": {
|
||||
"pending": "Tertunda",
|
||||
"approved": "Lulus",
|
||||
"available": "Sudah Ada"
|
||||
},
|
||||
"overseerr": {
|
||||
"pending": "Tertangguh",
|
||||
"approved": "Lulus",
|
||||
"available": "Sudah Ada"
|
||||
},
|
||||
"pihole": {
|
||||
"queries": "Permintaan",
|
||||
"blocked": "Disekat",
|
||||
"gravity": "Gravity"
|
||||
},
|
||||
"adguard": {
|
||||
"queries": "Permintaan",
|
||||
"blocked": "Disekat",
|
||||
"filtered": "Ditapis",
|
||||
"latency": "Kependaman"
|
||||
},
|
||||
"speedtest": {
|
||||
"upload": "Muat Naik",
|
||||
"download": "Muat Turun",
|
||||
"ping": "Ping"
|
||||
},
|
||||
"portainer": {
|
||||
"running": "Sedang Berjalan",
|
||||
"stopped": "Terhenti",
|
||||
"total": "Jumlah"
|
||||
},
|
||||
"traefik": {
|
||||
"routers": "Router",
|
||||
"services": "Servis",
|
||||
"middleware": "Perisian Tengah"
|
||||
},
|
||||
"npm": {
|
||||
"enabled": "Didayakan",
|
||||
"disabled": "Dinyahdayakan",
|
||||
"total": "Jumlah"
|
||||
},
|
||||
"prowlarr": {
|
||||
"enableIndexers": "Pengindeks",
|
||||
"numberOfGrabs": "Capai",
|
||||
"numberOfQueries": "Permintaan",
|
||||
"numberOfFailGrabs": "Capai Yang Ggagal",
|
||||
"numberOfFailQueries": "Permintaan Yang Gagal"
|
||||
},
|
||||
"jackett": {
|
||||
"configured": "Telah Dikonfigurasi",
|
||||
"errored": "Telah Tersalah"
|
||||
},
|
||||
"strelaysrv": {
|
||||
"numActiveSessions": "Sesi",
|
||||
"numConnections": "Penyambungan",
|
||||
"dataRelayed": "Disalurkan",
|
||||
"transferRate": "Kadar"
|
||||
},
|
||||
"mastodon": {
|
||||
"user_count": "Pengguna",
|
||||
"status_count": "Pos",
|
||||
"domain_count": "Domain"
|
||||
},
|
||||
"authentik": {
|
||||
"users": "Pengguna",
|
||||
"loginsLast24H": "Logmasuk (24j)",
|
||||
"failedLoginsLast24H": "Logmasuk Gagal (24j)"
|
||||
},
|
||||
"homebridge": {
|
||||
"child_bridges_status": "{{ok}}/{{total}}",
|
||||
"available_update": "Sistem",
|
||||
"updates": "Kemaskini",
|
||||
"update_available": "Kemaskini Tersedia",
|
||||
"up_to_date": "Terkemaskini",
|
||||
"child_bridges": "Jambatan Anak"
|
||||
},
|
||||
"watchtower": {
|
||||
"containers_scanned": "Terimbas",
|
||||
"containers_updated": "Dikemaskini",
|
||||
"containers_failed": "Gagal"
|
||||
},
|
||||
"autobrr": {
|
||||
"approvedPushes": "Lulus",
|
||||
"rejectedPushes": "Ditolak",
|
||||
"filters": "Tapisan",
|
||||
"indexers": "Pengindeks"
|
||||
},
|
||||
"tubearchivist": {
|
||||
"downloads": "Baris Gilir",
|
||||
"videos": "Video",
|
||||
"channels": "Saluran",
|
||||
"playlists": "Senarai Siar"
|
||||
},
|
||||
"truenas": {
|
||||
"load": "Beban Sistem",
|
||||
"uptime": "Masa Hidup",
|
||||
"alerts": "Amaran",
|
||||
"time": "{{value, number(style: unit; unitDisplay: long;)}}"
|
||||
},
|
||||
"navidrome": {
|
||||
"nothing_streaming": "Tiada Strim Aktif",
|
||||
"please_wait": "Sila tunggu"
|
||||
},
|
||||
"pyload": {
|
||||
"speed": "Kelajuan",
|
||||
"active": "Aktif",
|
||||
"queue": "Baris Gilir",
|
||||
"total": "Jumlah"
|
||||
},
|
||||
"gluetun": {
|
||||
"public_ip": "Public IP",
|
||||
"region": "Region",
|
||||
"country": "Country"
|
||||
},
|
||||
"hdhomerun": {
|
||||
"channels": "Channels",
|
||||
"hd": "HD"
|
||||
}
|
||||
}
|
|
@ -2,7 +2,11 @@
|
|||
"widget": {
|
||||
"missing_type": "Manglende miniprogramstype: {{type}}",
|
||||
"api_error": "API-feil",
|
||||
"status": "Status"
|
||||
"status": "Status",
|
||||
"information": "Information",
|
||||
"url": "URL",
|
||||
"raw_error": "Raw Error",
|
||||
"response_data": "Response Data"
|
||||
},
|
||||
"search": {
|
||||
"placeholder": "Søk …"
|
||||
|
@ -46,7 +50,8 @@
|
|||
"radarr": {
|
||||
"wanted": "Ønsket",
|
||||
"queued": "I kø",
|
||||
"movies": "Filmer"
|
||||
"movies": "Filmer",
|
||||
"missing": "Missing"
|
||||
},
|
||||
"readarr": {
|
||||
"wanted": "Wanted",
|
||||
|
@ -190,7 +195,12 @@
|
|||
"wlan_users": "WLAN Users",
|
||||
"up": "UP",
|
||||
"down": "DOWN",
|
||||
"wait": "Please wait"
|
||||
"wait": "Please wait",
|
||||
"lan": "LAN",
|
||||
"wlan": "WLAN",
|
||||
"devices": "Devices",
|
||||
"lan_devices": "LAN Devices",
|
||||
"wlan_devices": "WLAN Devices"
|
||||
},
|
||||
"plex": {
|
||||
"streams": "Active Streams",
|
||||
|
@ -201,5 +211,121 @@
|
|||
"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"
|
||||
},
|
||||
"homebridge": {
|
||||
"available_update": "System",
|
||||
"updates": "Updates",
|
||||
"update_available": "Update Available",
|
||||
"up_to_date": "Up to Date",
|
||||
"child_bridges": "Child Bridges",
|
||||
"child_bridges_status": "{{ok}}/{{total}}"
|
||||
},
|
||||
"autobrr": {
|
||||
"approvedPushes": "Approved",
|
||||
"rejectedPushes": "Rejected",
|
||||
"filters": "Filters",
|
||||
"indexers": "Indexers"
|
||||
},
|
||||
"watchtower": {
|
||||
"containers_scanned": "Scanned",
|
||||
"containers_updated": "Updated",
|
||||
"containers_failed": "Failed"
|
||||
},
|
||||
"tubearchivist": {
|
||||
"downloads": "Queue",
|
||||
"videos": "Videos",
|
||||
"channels": "Channels",
|
||||
"playlists": "Playlists"
|
||||
},
|
||||
"truenas": {
|
||||
"load": "System Load",
|
||||
"uptime": "Uptime",
|
||||
"alerts": "Alerts",
|
||||
"time": "{{value, number(style: unit; unitDisplay: long;)}}"
|
||||
},
|
||||
"navidrome": {
|
||||
"nothing_streaming": "No Active Streams",
|
||||
"please_wait": "Please Wait"
|
||||
},
|
||||
"pyload": {
|
||||
"speed": "Speed",
|
||||
"active": "Active",
|
||||
"queue": "Queue",
|
||||
"total": "Total"
|
||||
},
|
||||
"gluetun": {
|
||||
"public_ip": "Public IP",
|
||||
"region": "Region",
|
||||
"country": "Country"
|
||||
},
|
||||
"hdhomerun": {
|
||||
"channels": "Channels",
|
||||
"hd": "HD"
|
||||
}
|
||||
}
|
||||
|
|
|
@ -2,7 +2,11 @@
|
|||
"widget": {
|
||||
"missing_type": "Missing Widget Type: {{type}}",
|
||||
"api_error": "API Error",
|
||||
"status": "Status"
|
||||
"status": "Status",
|
||||
"information": "Information",
|
||||
"url": "URL",
|
||||
"raw_error": "Raw Error",
|
||||
"response_data": "Response Data"
|
||||
},
|
||||
"resources": {
|
||||
"total": "Totaal",
|
||||
|
@ -62,7 +66,8 @@
|
|||
"radarr": {
|
||||
"movies": "Films",
|
||||
"wanted": "Gezocht",
|
||||
"queued": "In de wachtrij"
|
||||
"queued": "In de wachtrij",
|
||||
"missing": "Missing"
|
||||
},
|
||||
"readarr": {
|
||||
"wanted": "Wanted",
|
||||
|
@ -190,7 +195,12 @@
|
|||
"wlan_users": "WLAN Users",
|
||||
"up": "UP",
|
||||
"down": "DOWN",
|
||||
"wait": "Please wait"
|
||||
"wait": "Please wait",
|
||||
"lan": "LAN",
|
||||
"wlan": "WLAN",
|
||||
"devices": "Devices",
|
||||
"lan_devices": "LAN Devices",
|
||||
"wlan_devices": "WLAN Devices"
|
||||
},
|
||||
"plex": {
|
||||
"streams": "Active Streams",
|
||||
|
@ -201,5 +211,121 @@
|
|||
"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"
|
||||
},
|
||||
"homebridge": {
|
||||
"available_update": "System",
|
||||
"updates": "Updates",
|
||||
"update_available": "Update Available",
|
||||
"up_to_date": "Up to Date",
|
||||
"child_bridges": "Child Bridges",
|
||||
"child_bridges_status": "{{ok}}/{{total}}"
|
||||
},
|
||||
"autobrr": {
|
||||
"approvedPushes": "Approved",
|
||||
"rejectedPushes": "Rejected",
|
||||
"filters": "Filters",
|
||||
"indexers": "Indexers"
|
||||
},
|
||||
"watchtower": {
|
||||
"containers_scanned": "Scanned",
|
||||
"containers_updated": "Updated",
|
||||
"containers_failed": "Failed"
|
||||
},
|
||||
"tubearchivist": {
|
||||
"downloads": "Queue",
|
||||
"videos": "Videos",
|
||||
"channels": "Channels",
|
||||
"playlists": "Playlists"
|
||||
},
|
||||
"truenas": {
|
||||
"load": "System Load",
|
||||
"uptime": "Uptime",
|
||||
"alerts": "Alerts",
|
||||
"time": "{{value, number(style: unit; unitDisplay: long;)}}"
|
||||
},
|
||||
"navidrome": {
|
||||
"nothing_streaming": "No Active Streams",
|
||||
"please_wait": "Please Wait"
|
||||
},
|
||||
"pyload": {
|
||||
"speed": "Speed",
|
||||
"active": "Active",
|
||||
"total": "Total",
|
||||
"queue": "Queue"
|
||||
},
|
||||
"gluetun": {
|
||||
"public_ip": "Public IP",
|
||||
"region": "Region",
|
||||
"country": "Country"
|
||||
},
|
||||
"hdhomerun": {
|
||||
"channels": "Channels",
|
||||
"hd": "HD"
|
||||
}
|
||||
}
|
||||
|
|
|
@ -52,7 +52,11 @@
|
|||
"widget": {
|
||||
"missing_type": "Brakujący typ widżetu: {{type}}",
|
||||
"api_error": "Błąd API",
|
||||
"status": "Stan"
|
||||
"status": "Stan",
|
||||
"url": "URL",
|
||||
"information": "Information",
|
||||
"raw_error": "Raw Error",
|
||||
"response_data": "Response Data"
|
||||
},
|
||||
"docker": {
|
||||
"rx": "RX",
|
||||
|
@ -90,7 +94,8 @@
|
|||
"radarr": {
|
||||
"wanted": "Poszukiwane",
|
||||
"queued": "W kolejce",
|
||||
"movies": "Filmy"
|
||||
"movies": "Filmy",
|
||||
"missing": "Missing"
|
||||
},
|
||||
"lidarr": {
|
||||
"wanted": "Poszukiwane",
|
||||
|
@ -148,32 +153,32 @@
|
|||
"errored": "Błędne"
|
||||
},
|
||||
"adguard": {
|
||||
"queries": "Queries",
|
||||
"blocked": "Blocked",
|
||||
"filtered": "Filtered",
|
||||
"latency": "Latency"
|
||||
"queries": "Zapytania",
|
||||
"blocked": "Zablokowane",
|
||||
"filtered": "Przefiltrowane",
|
||||
"latency": "Opóźnienia"
|
||||
},
|
||||
"qbittorrent": {
|
||||
"download": "Download",
|
||||
"upload": "Upload",
|
||||
"download": "Pobieranie",
|
||||
"upload": "Wysyłanie",
|
||||
"leech": "Leech",
|
||||
"seed": "Seed"
|
||||
},
|
||||
"mastodon": {
|
||||
"user_count": "Users",
|
||||
"user_count": "Użytkownicy",
|
||||
"status_count": "Posts",
|
||||
"domain_count": "Domains"
|
||||
"domain_count": "Domeny"
|
||||
},
|
||||
"strelaysrv": {
|
||||
"numActiveSessions": "Sessions",
|
||||
"numConnections": "Connections",
|
||||
"numActiveSessions": "Sesje",
|
||||
"numConnections": "Połączenia",
|
||||
"dataRelayed": "Relayed",
|
||||
"transferRate": "Rate"
|
||||
},
|
||||
"authentik": {
|
||||
"users": "Users",
|
||||
"loginsLast24H": "Logins (24h)",
|
||||
"failedLoginsLast24H": "Failed Logins (24h)"
|
||||
"users": "Użytkownicy",
|
||||
"loginsLast24H": "Logowania (24h)",
|
||||
"failedLoginsLast24H": "Nieudane logowania (24h)"
|
||||
},
|
||||
"proxmox": {
|
||||
"mem": "MEM",
|
||||
|
@ -182,24 +187,145 @@
|
|||
"vms": "VMs"
|
||||
},
|
||||
"unifi": {
|
||||
"users": "Users",
|
||||
"uptime": "System Uptime",
|
||||
"days": "Days",
|
||||
"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_users": "Użytkownicy LAN",
|
||||
"wlan_users": "Użytkownicy WLAN",
|
||||
"up": "Wysyłanie",
|
||||
"down": "Pobieranie",
|
||||
"wait": "Proszę czekać",
|
||||
"lan": "LAN",
|
||||
"wlan": "WLAN",
|
||||
"devices": "Urządzenia",
|
||||
"lan_devices": "Urządzenia LAN",
|
||||
"wlan_devices": "Urządzenia WLAN"
|
||||
},
|
||||
"plex": {
|
||||
"streams": "Active Streams",
|
||||
"movies": "Movies",
|
||||
"tv": "TV Shows"
|
||||
"movies": "Filmy",
|
||||
"tv": "Seriale"
|
||||
},
|
||||
"glances": {
|
||||
"cpu": "CPU",
|
||||
"mem": "MEM",
|
||||
"wait": "Please wait"
|
||||
"wait": "Proszę czekać"
|
||||
},
|
||||
"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": "Częściowo pochmurnie",
|
||||
"2-night": "Częściowo pochmurnie",
|
||||
"3-day": "Pochmurnie",
|
||||
"3-night": "Pochmurnie",
|
||||
"45-day": "Mgliście",
|
||||
"45-night": "Mgliście",
|
||||
"48-day": "Mgliście",
|
||||
"48-night": "Mgliście",
|
||||
"51-day": "Lekka mżawka",
|
||||
"51-night": "Lekka mżawka",
|
||||
"53-day": "Mżawka",
|
||||
"53-night": "Mżawka",
|
||||
"55-day": "Ciężka mżawka",
|
||||
"55-night": "Ciężka mżawka",
|
||||
"56-day": "Light Freezing Drizzle",
|
||||
"56-night": "Light Freezing Drizzle",
|
||||
"57-day": "Freezing Drizzle",
|
||||
"57-night": "Freezing Drizzle",
|
||||
"61-day": "Lekki deszcz",
|
||||
"61-night": "Lekki deszcz",
|
||||
"63-day": "Deszcz",
|
||||
"63-night": "Deszcz",
|
||||
"65-day": "Ciężki deszcz",
|
||||
"65-night": "Ciężki deszcz",
|
||||
"66-day": "Mroźny deszcz",
|
||||
"66-night": "Mroźny deszcz",
|
||||
"67-day": "Mroźny deszcz",
|
||||
"67-night": "Mroźny deszcz",
|
||||
"71-day": "Lekki śnieg",
|
||||
"71-night": "Lekki śnieg",
|
||||
"73-day": "Śnieg",
|
||||
"73-night": "Śnieg",
|
||||
"75-day": "Ciężki śnieg",
|
||||
"75-night": "Ciężki śnieg",
|
||||
"77-night": "Snow Grains",
|
||||
"80-day": "Lekkie opady",
|
||||
"80-night": "Lekkie opady",
|
||||
"81-day": "Opady",
|
||||
"81-night": "Opady",
|
||||
"82-day": "Ciężkie opady",
|
||||
"82-night": "Ciężkie opady",
|
||||
"85-day": "Opady śniegu",
|
||||
"85-night": "Opady śniegu",
|
||||
"86-day": "Opady śniegu",
|
||||
"86-night": "Opady śniegu",
|
||||
"95-day": "Burze z piorunami",
|
||||
"95-night": "Burze z piorunami",
|
||||
"96-day": "Burza z gradobiciem",
|
||||
"96-night": "Burza z gradobiciem",
|
||||
"99-day": "Burza z gradobiciem",
|
||||
"99-night": "Burza z gradobiciem"
|
||||
},
|
||||
"quicklaunch": {
|
||||
"bookmark": "Bookmark",
|
||||
"service": "Usługi"
|
||||
},
|
||||
"homebridge": {
|
||||
"available_update": "System",
|
||||
"updates": "Aktualizacje",
|
||||
"update_available": "Dostępna aktualizacja",
|
||||
"up_to_date": "Aktualny",
|
||||
"child_bridges": "Child Bridges",
|
||||
"child_bridges_status": "{{ok}}/{{total}}"
|
||||
},
|
||||
"autobrr": {
|
||||
"approvedPushes": "Approved",
|
||||
"rejectedPushes": "Rejected",
|
||||
"filters": "Filters",
|
||||
"indexers": "Indexers"
|
||||
},
|
||||
"watchtower": {
|
||||
"containers_scanned": "Scanned",
|
||||
"containers_updated": "Updated",
|
||||
"containers_failed": "Failed"
|
||||
},
|
||||
"tubearchivist": {
|
||||
"downloads": "Queue",
|
||||
"videos": "Videos",
|
||||
"channels": "Channels",
|
||||
"playlists": "Playlists"
|
||||
},
|
||||
"truenas": {
|
||||
"load": "System Load",
|
||||
"uptime": "Uptime",
|
||||
"alerts": "Alerts",
|
||||
"time": "{{value, number(style: unit; unitDisplay: long;)}}"
|
||||
},
|
||||
"navidrome": {
|
||||
"please_wait": "Please Wait",
|
||||
"nothing_streaming": "No Active Streams"
|
||||
},
|
||||
"pyload": {
|
||||
"speed": "Speed",
|
||||
"active": "Active",
|
||||
"queue": "Queue",
|
||||
"total": "Total"
|
||||
},
|
||||
"gluetun": {
|
||||
"public_ip": "Public IP",
|
||||
"region": "Region",
|
||||
"country": "Country"
|
||||
},
|
||||
"hdhomerun": {
|
||||
"channels": "Channels",
|
||||
"hd": "HD"
|
||||
}
|
||||
}
|
||||
|
|
|
@ -30,7 +30,11 @@
|
|||
"widget": {
|
||||
"missing_type": "Tipo de Widget ausente: {{type}}",
|
||||
"api_error": "Erro da API",
|
||||
"status": "Status"
|
||||
"status": "Status",
|
||||
"information": "Information",
|
||||
"url": "URL",
|
||||
"raw_error": "Raw Error",
|
||||
"response_data": "Response Data"
|
||||
},
|
||||
"weather": {
|
||||
"current": "Localização atual",
|
||||
|
@ -92,7 +96,8 @@
|
|||
"radarr": {
|
||||
"wanted": "Desejado",
|
||||
"queued": "Na fila",
|
||||
"movies": "Filmes"
|
||||
"movies": "Filmes",
|
||||
"missing": "Missing"
|
||||
},
|
||||
"lidarr": {
|
||||
"wanted": "Desejado",
|
||||
|
@ -190,7 +195,12 @@
|
|||
"wlan_users": "WLAN Users",
|
||||
"up": "UP",
|
||||
"down": "DOWN",
|
||||
"wait": "Please wait"
|
||||
"wait": "Please wait",
|
||||
"lan": "LAN",
|
||||
"wlan": "WLAN",
|
||||
"devices": "Devices",
|
||||
"lan_devices": "LAN Devices",
|
||||
"wlan_devices": "WLAN Devices"
|
||||
},
|
||||
"plex": {
|
||||
"streams": "Active Streams",
|
||||
|
@ -201,5 +211,121 @@
|
|||
"cpu": "CPU",
|
||||
"mem": "MEM",
|
||||
"wait": "Please wait"
|
||||
},
|
||||
"changedetectionio": {
|
||||
"totalObserved": "Observados",
|
||||
"diffsDetected": "Mudanças"
|
||||
},
|
||||
"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"
|
||||
},
|
||||
"homebridge": {
|
||||
"available_update": "System",
|
||||
"updates": "Updates",
|
||||
"update_available": "Update Available",
|
||||
"up_to_date": "Up to Date",
|
||||
"child_bridges": "Child Bridges",
|
||||
"child_bridges_status": "{{ok}}/{{total}}"
|
||||
},
|
||||
"autobrr": {
|
||||
"approvedPushes": "Approved",
|
||||
"rejectedPushes": "Rejected",
|
||||
"filters": "Filters",
|
||||
"indexers": "Indexers"
|
||||
},
|
||||
"watchtower": {
|
||||
"containers_scanned": "Scanned",
|
||||
"containers_updated": "Updated",
|
||||
"containers_failed": "Failed"
|
||||
},
|
||||
"tubearchivist": {
|
||||
"downloads": "Queue",
|
||||
"videos": "Videos",
|
||||
"channels": "Channels",
|
||||
"playlists": "Playlists"
|
||||
},
|
||||
"truenas": {
|
||||
"load": "System Load",
|
||||
"uptime": "Uptime",
|
||||
"alerts": "Alerts",
|
||||
"time": "{{value, number(style: unit; unitDisplay: long;)}}"
|
||||
},
|
||||
"navidrome": {
|
||||
"nothing_streaming": "No Active Streams",
|
||||
"please_wait": "Please Wait"
|
||||
},
|
||||
"pyload": {
|
||||
"speed": "Speed",
|
||||
"active": "Active",
|
||||
"queue": "Queue",
|
||||
"total": "Total"
|
||||
},
|
||||
"gluetun": {
|
||||
"public_ip": "Public IP",
|
||||
"region": "Region",
|
||||
"country": "Country"
|
||||
},
|
||||
"hdhomerun": {
|
||||
"channels": "Channels",
|
||||
"hd": "HD"
|
||||
}
|
||||
}
|
||||
|
|
|
@ -2,7 +2,11 @@
|
|||
"widget": {
|
||||
"missing_type": "Widget ausente: {{type}}",
|
||||
"api_error": "Erro da API",
|
||||
"status": "Status"
|
||||
"status": "Status",
|
||||
"information": "Information",
|
||||
"url": "URL",
|
||||
"raw_error": "Raw Error",
|
||||
"response_data": "Response Data"
|
||||
},
|
||||
"search": {
|
||||
"placeholder": "Pesquisar…"
|
||||
|
@ -46,7 +50,8 @@
|
|||
"radarr": {
|
||||
"wanted": "Desejado",
|
||||
"queued": "Fila",
|
||||
"movies": "Filmes"
|
||||
"movies": "Filmes",
|
||||
"missing": "Missing"
|
||||
},
|
||||
"readarr": {
|
||||
"wanted": "Desejados",
|
||||
|
@ -201,7 +206,12 @@
|
|||
"wlan_users": "WLAN Users",
|
||||
"up": "UP",
|
||||
"down": "DOWN",
|
||||
"wait": "Please wait"
|
||||
"wait": "Please wait",
|
||||
"lan": "LAN",
|
||||
"wlan": "WLAN",
|
||||
"devices": "Devices",
|
||||
"lan_devices": "LAN Devices",
|
||||
"wlan_devices": "WLAN Devices"
|
||||
},
|
||||
"plex": {
|
||||
"streams": "Active Streams",
|
||||
|
@ -212,5 +222,121 @@
|
|||
"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"
|
||||
},
|
||||
"homebridge": {
|
||||
"available_update": "System",
|
||||
"updates": "Updates",
|
||||
"update_available": "Update Available",
|
||||
"up_to_date": "Up to Date",
|
||||
"child_bridges": "Child Bridges",
|
||||
"child_bridges_status": "{{ok}}/{{total}}"
|
||||
},
|
||||
"autobrr": {
|
||||
"approvedPushes": "Approved",
|
||||
"rejectedPushes": "Rejected",
|
||||
"filters": "Filters",
|
||||
"indexers": "Indexers"
|
||||
},
|
||||
"watchtower": {
|
||||
"containers_scanned": "Scanned",
|
||||
"containers_updated": "Updated",
|
||||
"containers_failed": "Failed"
|
||||
},
|
||||
"tubearchivist": {
|
||||
"downloads": "Queue",
|
||||
"videos": "Videos",
|
||||
"channels": "Channels",
|
||||
"playlists": "Playlists"
|
||||
},
|
||||
"truenas": {
|
||||
"load": "System Load",
|
||||
"uptime": "Uptime",
|
||||
"alerts": "Alerts",
|
||||
"time": "{{value, number(style: unit; unitDisplay: long;)}}"
|
||||
},
|
||||
"navidrome": {
|
||||
"nothing_streaming": "No Active Streams",
|
||||
"please_wait": "Please Wait"
|
||||
},
|
||||
"pyload": {
|
||||
"queue": "Queue",
|
||||
"total": "Total",
|
||||
"speed": "Speed",
|
||||
"active": "Active"
|
||||
},
|
||||
"gluetun": {
|
||||
"region": "Region",
|
||||
"country": "Country",
|
||||
"public_ip": "Public IP"
|
||||
},
|
||||
"hdhomerun": {
|
||||
"channels": "Channels",
|
||||
"hd": "HD"
|
||||
}
|
||||
}
|
||||
|
|
|
@ -4,7 +4,7 @@
|
|||
"load": "Sarcină",
|
||||
"total": "Total",
|
||||
"free": "Disponibili",
|
||||
"cpu": "CPU"
|
||||
"cpu": "Procesor"
|
||||
},
|
||||
"docker": {
|
||||
"rx": "RX",
|
||||
|
@ -60,7 +60,11 @@
|
|||
"widget": {
|
||||
"missing_type": "Lipsește Tipul de Widget: {{type}}",
|
||||
"api_error": "Eroare API",
|
||||
"status": "Status"
|
||||
"status": "Status",
|
||||
"information": "Information",
|
||||
"url": "URL",
|
||||
"raw_error": "Raw Error",
|
||||
"response_data": "Response Data"
|
||||
},
|
||||
"search": {
|
||||
"placeholder": "Caută…"
|
||||
|
@ -112,7 +116,8 @@
|
|||
"radarr": {
|
||||
"queued": "În coadă",
|
||||
"wanted": "Dorite",
|
||||
"movies": "Filme"
|
||||
"movies": "Filme",
|
||||
"missing": "Missing"
|
||||
},
|
||||
"lidarr": {
|
||||
"wanted": "Dorite",
|
||||
|
@ -176,30 +181,151 @@
|
|||
"failedLoginsLast24H": "Conectări eșuate (24h)"
|
||||
},
|
||||
"proxmox": {
|
||||
"vms": "VMs",
|
||||
"mem": "MEM",
|
||||
"cpu": "CPU",
|
||||
"lxc": "LXC"
|
||||
"vms": "Masini Virtuale",
|
||||
"mem": "Memorie",
|
||||
"cpu": "Procesor",
|
||||
"lxc": "Container"
|
||||
},
|
||||
"unifi": {
|
||||
"users": "Users",
|
||||
"uptime": "System Uptime",
|
||||
"days": "Days",
|
||||
"users": "Utilizatori",
|
||||
"uptime": "Timp de funcționare a sistemului",
|
||||
"days": "Zile",
|
||||
"wan": "WAN",
|
||||
"lan_users": "LAN Users",
|
||||
"wlan_users": "WLAN Users",
|
||||
"up": "UP",
|
||||
"down": "DOWN",
|
||||
"wait": "Please wait"
|
||||
"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": "Active Streams",
|
||||
"movies": "Movies",
|
||||
"tv": "TV Shows"
|
||||
"streams": "Fluxuri active",
|
||||
"movies": "Filme",
|
||||
"tv": "Seriale"
|
||||
},
|
||||
"glances": {
|
||||
"cpu": "CPU",
|
||||
"mem": "MEM",
|
||||
"wait": "Please wait"
|
||||
"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"
|
||||
},
|
||||
"homebridge": {
|
||||
"update_available": "Update Available",
|
||||
"up_to_date": "Up to Date",
|
||||
"child_bridges": "Child Bridges",
|
||||
"available_update": "System",
|
||||
"updates": "Updates",
|
||||
"child_bridges_status": "{{ok}}/{{total}}"
|
||||
},
|
||||
"autobrr": {
|
||||
"approvedPushes": "Approved",
|
||||
"rejectedPushes": "Rejected",
|
||||
"filters": "Filters",
|
||||
"indexers": "Indexers"
|
||||
},
|
||||
"watchtower": {
|
||||
"containers_scanned": "Scanned",
|
||||
"containers_updated": "Updated",
|
||||
"containers_failed": "Failed"
|
||||
},
|
||||
"tubearchivist": {
|
||||
"downloads": "Queue",
|
||||
"videos": "Videos",
|
||||
"channels": "Channels",
|
||||
"playlists": "Playlists"
|
||||
},
|
||||
"truenas": {
|
||||
"load": "System Load",
|
||||
"uptime": "Uptime",
|
||||
"alerts": "Alerts",
|
||||
"time": "{{value, number(style: unit; unitDisplay: long;)}}"
|
||||
},
|
||||
"navidrome": {
|
||||
"nothing_streaming": "No Active Streams",
|
||||
"please_wait": "Please Wait"
|
||||
},
|
||||
"pyload": {
|
||||
"speed": "Speed",
|
||||
"active": "Active",
|
||||
"queue": "Queue",
|
||||
"total": "Total"
|
||||
},
|
||||
"gluetun": {
|
||||
"public_ip": "Public IP",
|
||||
"region": "Region",
|
||||
"country": "Country"
|
||||
},
|
||||
"hdhomerun": {
|
||||
"channels": "Channels",
|
||||
"hd": "HD"
|
||||
}
|
||||
}
|
||||
|
|
|
@ -2,7 +2,11 @@
|
|||
"widget": {
|
||||
"missing_type": "Отсутствует тип виджета: {{type}}",
|
||||
"api_error": "Ошибка API",
|
||||
"status": "Статус"
|
||||
"status": "Статус",
|
||||
"information": "Information",
|
||||
"url": "URL",
|
||||
"raw_error": "Raw Error",
|
||||
"response_data": "Response Data"
|
||||
},
|
||||
"search": {
|
||||
"placeholder": "Поиск…"
|
||||
|
@ -46,7 +50,8 @@
|
|||
"radarr": {
|
||||
"wanted": "Хотел",
|
||||
"queued": "В очереди",
|
||||
"movies": "Фильмы"
|
||||
"movies": "Фильмы",
|
||||
"missing": "Missing"
|
||||
},
|
||||
"readarr": {
|
||||
"wanted": "Wanted",
|
||||
|
@ -190,7 +195,12 @@
|
|||
"wlan_users": "WLAN Users",
|
||||
"up": "UP",
|
||||
"down": "DOWN",
|
||||
"wait": "Please wait"
|
||||
"wait": "Please wait",
|
||||
"lan": "LAN",
|
||||
"wlan": "WLAN",
|
||||
"devices": "Devices",
|
||||
"lan_devices": "LAN Devices",
|
||||
"wlan_devices": "WLAN Devices"
|
||||
},
|
||||
"plex": {
|
||||
"streams": "Active Streams",
|
||||
|
@ -201,5 +211,121 @@
|
|||
"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"
|
||||
},
|
||||
"homebridge": {
|
||||
"available_update": "System",
|
||||
"updates": "Updates",
|
||||
"update_available": "Update Available",
|
||||
"up_to_date": "Up to Date",
|
||||
"child_bridges_status": "{{ok}}/{{total}}",
|
||||
"child_bridges": "Child Bridges"
|
||||
},
|
||||
"autobrr": {
|
||||
"approvedPushes": "Approved",
|
||||
"rejectedPushes": "Rejected",
|
||||
"filters": "Filters",
|
||||
"indexers": "Indexers"
|
||||
},
|
||||
"watchtower": {
|
||||
"containers_scanned": "Scanned",
|
||||
"containers_updated": "Updated",
|
||||
"containers_failed": "Failed"
|
||||
},
|
||||
"tubearchivist": {
|
||||
"downloads": "Queue",
|
||||
"videos": "Videos",
|
||||
"channels": "Channels",
|
||||
"playlists": "Playlists"
|
||||
},
|
||||
"truenas": {
|
||||
"load": "System Load",
|
||||
"uptime": "Uptime",
|
||||
"alerts": "Alerts",
|
||||
"time": "{{value, number(style: unit; unitDisplay: long;)}}"
|
||||
},
|
||||
"navidrome": {
|
||||
"nothing_streaming": "No Active Streams",
|
||||
"please_wait": "Please Wait"
|
||||
},
|
||||
"pyload": {
|
||||
"speed": "Speed",
|
||||
"active": "Active",
|
||||
"queue": "Queue",
|
||||
"total": "Total"
|
||||
},
|
||||
"gluetun": {
|
||||
"public_ip": "Public IP",
|
||||
"region": "Region",
|
||||
"country": "Country"
|
||||
},
|
||||
"hdhomerun": {
|
||||
"channels": "Channels",
|
||||
"hd": "HD"
|
||||
}
|
||||
}
|
||||
|
|
331
public/locales/sr/common.json
Normal file
331
public/locales/sr/common.json
Normal file
|
@ -0,0 +1,331 @@
|
|||
{
|
||||
"widget": {
|
||||
"missing_type": "Missing Widget Type: {{type}}",
|
||||
"api_error": "API Error",
|
||||
"status": "Status",
|
||||
"information": "Information",
|
||||
"url": "URL",
|
||||
"raw_error": "Raw Error",
|
||||
"response_data": "Response Data"
|
||||
},
|
||||
"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"
|
||||
},
|
||||
"homebridge": {
|
||||
"available_update": "System",
|
||||
"updates": "Updates",
|
||||
"update_available": "Update Available",
|
||||
"up_to_date": "Up to Date",
|
||||
"child_bridges": "Child Bridges",
|
||||
"child_bridges_status": "{{ok}}/{{total}}"
|
||||
},
|
||||
"autobrr": {
|
||||
"approvedPushes": "Approved",
|
||||
"rejectedPushes": "Rejected",
|
||||
"filters": "Filters",
|
||||
"indexers": "Indexers"
|
||||
},
|
||||
"watchtower": {
|
||||
"containers_scanned": "Scanned",
|
||||
"containers_updated": "Updated",
|
||||
"containers_failed": "Failed"
|
||||
},
|
||||
"tubearchivist": {
|
||||
"downloads": "Queue",
|
||||
"videos": "Videos",
|
||||
"channels": "Channels",
|
||||
"playlists": "Playlists"
|
||||
},
|
||||
"truenas": {
|
||||
"load": "System Load",
|
||||
"uptime": "Uptime",
|
||||
"alerts": "Alerts",
|
||||
"time": "{{value, number(style: unit; unitDisplay: long;)}}"
|
||||
},
|
||||
"navidrome": {
|
||||
"nothing_streaming": "No Active Streams",
|
||||
"please_wait": "Please Wait"
|
||||
},
|
||||
"pyload": {
|
||||
"speed": "Speed",
|
||||
"active": "Active",
|
||||
"queue": "Queue",
|
||||
"total": "Total"
|
||||
},
|
||||
"gluetun": {
|
||||
"public_ip": "Public IP",
|
||||
"region": "Region",
|
||||
"country": "Country"
|
||||
},
|
||||
"hdhomerun": {
|
||||
"channels": "Channels",
|
||||
"hd": "HD"
|
||||
}
|
||||
}
|
|
@ -2,7 +2,11 @@
|
|||
"widget": {
|
||||
"missing_type": "Saknar Widget-typ: {{type}}",
|
||||
"api_error": "API-fel",
|
||||
"status": "Status"
|
||||
"status": "Status",
|
||||
"information": "Information",
|
||||
"url": "URL",
|
||||
"raw_error": "Raw Error",
|
||||
"response_data": "Response Data"
|
||||
},
|
||||
"weather": {
|
||||
"current": "Nuvarande plats",
|
||||
|
@ -68,7 +72,8 @@
|
|||
"radarr": {
|
||||
"wanted": "Eftersöker",
|
||||
"queued": "I kö",
|
||||
"movies": "Filmer"
|
||||
"movies": "Filmer",
|
||||
"missing": "Missing"
|
||||
},
|
||||
"lidarr": {
|
||||
"wanted": "Eftersöker",
|
||||
|
@ -171,9 +176,9 @@
|
|||
"transferRate": "Rate"
|
||||
},
|
||||
"authentik": {
|
||||
"users": "Users",
|
||||
"loginsLast24H": "Logins (24h)",
|
||||
"failedLoginsLast24H": "Failed Logins (24h)"
|
||||
"users": "Användare",
|
||||
"loginsLast24H": "Inloggningar (24h)",
|
||||
"failedLoginsLast24H": "Misslyckade inloggningar (24h)"
|
||||
},
|
||||
"proxmox": {
|
||||
"mem": "MEM",
|
||||
|
@ -182,24 +187,145 @@
|
|||
"vms": "VMs"
|
||||
},
|
||||
"unifi": {
|
||||
"users": "Users",
|
||||
"uptime": "System Uptime",
|
||||
"days": "Days",
|
||||
"users": "Användare",
|
||||
"uptime": "Upptid",
|
||||
"days": "Dagar",
|
||||
"wan": "WAN",
|
||||
"lan_users": "LAN Users",
|
||||
"wlan_users": "WLAN Users",
|
||||
"up": "UP",
|
||||
"down": "DOWN",
|
||||
"wait": "Please wait"
|
||||
"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": "Active Streams",
|
||||
"movies": "Movies",
|
||||
"tv": "TV Shows"
|
||||
"streams": "Aktiva strömmar",
|
||||
"movies": "Filmer",
|
||||
"tv": "TV-serier"
|
||||
},
|
||||
"glances": {
|
||||
"cpu": "CPU",
|
||||
"mem": "MEM",
|
||||
"wait": "Please wait"
|
||||
"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"
|
||||
},
|
||||
"homebridge": {
|
||||
"available_update": "System",
|
||||
"updates": "Updates",
|
||||
"update_available": "Update Available",
|
||||
"up_to_date": "Up to Date",
|
||||
"child_bridges": "Child Bridges",
|
||||
"child_bridges_status": "{{ok}}/{{total}}"
|
||||
},
|
||||
"autobrr": {
|
||||
"approvedPushes": "Approved",
|
||||
"rejectedPushes": "Rejected",
|
||||
"filters": "Filters",
|
||||
"indexers": "Indexers"
|
||||
},
|
||||
"watchtower": {
|
||||
"containers_scanned": "Scanned",
|
||||
"containers_updated": "Updated",
|
||||
"containers_failed": "Failed"
|
||||
},
|
||||
"tubearchivist": {
|
||||
"downloads": "Queue",
|
||||
"videos": "Videos",
|
||||
"channels": "Channels",
|
||||
"playlists": "Playlists"
|
||||
},
|
||||
"truenas": {
|
||||
"load": "System Load",
|
||||
"uptime": "Uptime",
|
||||
"alerts": "Alerts",
|
||||
"time": "{{value, number(style: unit; unitDisplay: long;)}}"
|
||||
},
|
||||
"navidrome": {
|
||||
"nothing_streaming": "No Active Streams",
|
||||
"please_wait": "Please Wait"
|
||||
},
|
||||
"pyload": {
|
||||
"speed": "Speed",
|
||||
"active": "Active",
|
||||
"queue": "Queue",
|
||||
"total": "Total"
|
||||
},
|
||||
"gluetun": {
|
||||
"public_ip": "Public IP",
|
||||
"region": "Region",
|
||||
"country": "Country"
|
||||
},
|
||||
"hdhomerun": {
|
||||
"channels": "Channels",
|
||||
"hd": "HD"
|
||||
}
|
||||
}
|
||||
|
|
|
@ -19,7 +19,11 @@
|
|||
"widget": {
|
||||
"missing_type": "విడ్జెట్ లేదు: {{type}}",
|
||||
"api_error": "API లోపం",
|
||||
"status": "హోదా"
|
||||
"status": "హోదా",
|
||||
"information": "Information",
|
||||
"url": "URL",
|
||||
"raw_error": "Raw Error",
|
||||
"response_data": "Response Data"
|
||||
},
|
||||
"weather": {
|
||||
"current": "ప్రస్తుత స్తలం",
|
||||
|
@ -91,7 +95,8 @@
|
|||
"radarr": {
|
||||
"wanted": "కావలెను",
|
||||
"queued": "క్యూయూఎడ్",
|
||||
"movies": "సినిమాలు"
|
||||
"movies": "సినిమాలు",
|
||||
"missing": "మిస్సింగ్"
|
||||
},
|
||||
"lidarr": {
|
||||
"wanted": "కావలెను",
|
||||
|
@ -190,7 +195,12 @@
|
|||
"wlan_users": "WLAN వినియోగదారులు",
|
||||
"up": "అప్",
|
||||
"down": "డౌన్",
|
||||
"wait": "దయచేసి వేచి ఉండండి"
|
||||
"wait": "దయచేసి వేచి ఉండండి",
|
||||
"lan": "లాన్",
|
||||
"wlan": "WLAN",
|
||||
"devices": "పరికరాలు",
|
||||
"lan_devices": "LAN పరికరాలు",
|
||||
"wlan_devices": "WLAN పరికరాలు"
|
||||
},
|
||||
"plex": {
|
||||
"streams": "యాక్టివ్ స్ట్రీమ్లు",
|
||||
|
@ -198,8 +208,124 @@
|
|||
"tv": "దూరదర్శిని కార్యక్రమాలు"
|
||||
},
|
||||
"glances": {
|
||||
"cpu": "CPU",
|
||||
"cpu": "సీపియూ",
|
||||
"mem": "MEM",
|
||||
"wait": "Please wait"
|
||||
"wait": "దయచేసి వేచి ఉండండి"
|
||||
},
|
||||
"changedetectionio": {
|
||||
"totalObserved": "మొత్తం గమనించబడింది",
|
||||
"diffsDetected": "తేడాలు గుర్తించబడ్డాయి"
|
||||
},
|
||||
"wmo": {
|
||||
"0-day": "సన్నీ",
|
||||
"0-night": "స్పష్టమైన",
|
||||
"57-night": "గడ్డకట్టే చినుకులు",
|
||||
"73-day": "మంచు",
|
||||
"73-night": "మంచు",
|
||||
"75-day": "భారీ మంచు",
|
||||
"75-night": "భారీ మంచు",
|
||||
"77-day": "మంచు గింజలు",
|
||||
"77-night": "మంచు గింజలు",
|
||||
"80-day": "తేలికపాటి జల్లులు",
|
||||
"80-night": "తేలికపాటి జల్లులు",
|
||||
"81-day": "జల్లులు",
|
||||
"81-night": "జల్లులు",
|
||||
"82-day": "భారీ వర్షాలు",
|
||||
"82-night": "భారీ వర్షాలు",
|
||||
"85-day": "మంచు జల్లులు",
|
||||
"85-night": "మంచు జల్లులు",
|
||||
"1-day": "ప్రధానంగా ఎండ",
|
||||
"1-night": "ప్రధానంగా స్పష్టంగా",
|
||||
"2-day": "పాక్షికంగా మేఘావృతమై ఉంటుంది",
|
||||
"2-night": "పాక్షికంగా మేఘావృతమై ఉంటుంది",
|
||||
"3-day": "మేఘావృతం",
|
||||
"3-night": "మేఘావృతం",
|
||||
"45-day": "పొగమంచు",
|
||||
"45-night": "పొగమంచు",
|
||||
"48-day": "పొగమంచు",
|
||||
"48-night": "పొగమంచు",
|
||||
"51-day": "తేలికపాటి చినుకులు",
|
||||
"51-night": "తేలికపాటి చినుకులు",
|
||||
"53-day": "చినుకులు",
|
||||
"53-night": "చినుకులు",
|
||||
"55-day": "భారీ చినుకులు",
|
||||
"55-night": "భారీ చినుకులు",
|
||||
"56-day": "తేలికపాటి గడ్డకట్టే చినుకులు",
|
||||
"56-night": "తేలికపాటి గడ్డకట్టే చినుకులు",
|
||||
"57-day": "గడ్డకట్టే చినుకులు",
|
||||
"61-day": "తేలికపాటి వర్షం",
|
||||
"61-night": "తేలికపాటి వర్షం",
|
||||
"63-day": "వర్షం",
|
||||
"63-night": "వర్షం",
|
||||
"65-day": "భారీవర్షం",
|
||||
"65-night": "భారీవర్షం",
|
||||
"66-day": "గడ్డకట్టే వర్షం",
|
||||
"66-night": "గడ్డకట్టే వర్షం",
|
||||
"67-day": "గడ్డకట్టే వర్షం",
|
||||
"67-night": "గడ్డకట్టే వర్షం",
|
||||
"71-day": "తేలికపాటి మంచు",
|
||||
"71-night": "తేలికపాటి మంచు",
|
||||
"86-day": "మంచు జల్లులు",
|
||||
"86-night": "మంచు జల్లులు",
|
||||
"95-day": "ఉరుము",
|
||||
"95-night": "ఉరుము",
|
||||
"96-day": "వడగళ్లతో కూడిన ఉరుములతో కూడిన వర్షం",
|
||||
"96-night": "వడగళ్లతో కూడిన ఉరుములతో కూడిన వర్షం",
|
||||
"99-day": "వడగళ్లతో కూడిన ఉరుములతో కూడిన వర్షం",
|
||||
"99-night": "వడగళ్లతో కూడిన ఉరుములతో కూడిన వర్షం"
|
||||
},
|
||||
"quicklaunch": {
|
||||
"bookmark": "బుక్మార్క్",
|
||||
"service": "సేవ"
|
||||
},
|
||||
"homebridge": {
|
||||
"available_update": "వ్యవస్థ",
|
||||
"updates": "నవీకరణలు",
|
||||
"update_available": "అందుబాటులో నవీకరణ",
|
||||
"up_to_date": "తాజాగా",
|
||||
"child_bridges": "పిల్ల వంతెనలు",
|
||||
"child_bridges_status": "{{ok}}/{{total}}"
|
||||
},
|
||||
"autobrr": {
|
||||
"rejectedPushes": "తిరస్కరించారు",
|
||||
"approvedPushes": "ఆమోదించబడింది",
|
||||
"filters": "ఫిల్టర్లు",
|
||||
"indexers": "సూచికలు"
|
||||
},
|
||||
"watchtower": {
|
||||
"containers_scanned": "స్కాన్ చేశారు",
|
||||
"containers_updated": "నవీకరించబడింది",
|
||||
"containers_failed": "విఫలమయ్యారు"
|
||||
},
|
||||
"tubearchivist": {
|
||||
"downloads": "Queue",
|
||||
"videos": "Videos",
|
||||
"channels": "Channels",
|
||||
"playlists": "Playlists"
|
||||
},
|
||||
"truenas": {
|
||||
"load": "System Load",
|
||||
"uptime": "Uptime",
|
||||
"alerts": "Alerts",
|
||||
"time": "{{value, number(style: unit; unitDisplay: long;)}}"
|
||||
},
|
||||
"navidrome": {
|
||||
"nothing_streaming": "No Active Streams",
|
||||
"please_wait": "Please Wait"
|
||||
},
|
||||
"pyload": {
|
||||
"speed": "Speed",
|
||||
"active": "Active",
|
||||
"queue": "Queue",
|
||||
"total": "Total"
|
||||
},
|
||||
"gluetun": {
|
||||
"public_ip": "Public IP",
|
||||
"region": "Region",
|
||||
"country": "Country"
|
||||
},
|
||||
"hdhomerun": {
|
||||
"channels": "Channels",
|
||||
"hd": "HD"
|
||||
}
|
||||
}
|
||||
|
|
331
public/locales/tr/common.json
Normal file
331
public/locales/tr/common.json
Normal file
|
@ -0,0 +1,331 @@
|
|||
{
|
||||
"widget": {
|
||||
"missing_type": "Kayıp Araç Türü: {{type}}",
|
||||
"api_error": "API Hatası",
|
||||
"status": "Durum",
|
||||
"information": "Information",
|
||||
"url": "URL",
|
||||
"raw_error": "Raw Error",
|
||||
"response_data": "Response Data"
|
||||
},
|
||||
"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": "Dolu İle Gök Gürültülü Fırtına",
|
||||
"0-day": "Güneşli",
|
||||
"0-night": "Açık",
|
||||
"1-day": "Çoğunlukla Güneşli",
|
||||
"1-night": "Çoğunlukla Açık",
|
||||
"2-day": "Parçalı Bulutlu",
|
||||
"2-night": "Parçalı Bulutlu",
|
||||
"3-day": "Bulutlu",
|
||||
"3-night": "Bulutlu",
|
||||
"45-day": "Sisli",
|
||||
"45-night": "Sisli",
|
||||
"48-day": "Sisli",
|
||||
"48-night": "Sisli",
|
||||
"51-day": "Az Çiseleyen Yağmur",
|
||||
"51-night": "Az Çiseleyen Yağmur",
|
||||
"53-day": "Çiseleyen Yağmur",
|
||||
"53-night": "Çiseleyen Yağmur",
|
||||
"55-day": "Çok Çiseleyen Yağmur",
|
||||
"55-night": "Çok Çiseleyen Yağmur",
|
||||
"56-day": "Soğuk Az Çiseleyen Yağmur",
|
||||
"56-night": "Soğuk Az Çiseleyen Yağmur",
|
||||
"57-day": "Soğuk Çiseleyen Yağmur",
|
||||
"57-night": "Soğuk Çiseleyen Yağmur",
|
||||
"61-day": "Hafif Yağmur",
|
||||
"61-night": "Hafif Yağmur",
|
||||
"63-day": "Yağmur",
|
||||
"63-night": "Yağmur",
|
||||
"65-day": "Çok Yağmur",
|
||||
"65-night": "Çok Yağmur",
|
||||
"66-day": "Dondurucu Yağmur",
|
||||
"66-night": "Dondurucu Yağmur",
|
||||
"67-day": "Dondurucu Yağmur",
|
||||
"67-night": "Dondurucu Yağmur",
|
||||
"71-day": "Hafif Kar",
|
||||
"71-night": "Hafif Kar",
|
||||
"73-day": "Kar",
|
||||
"73-night": "Kar",
|
||||
"75-day": "Çok Kar",
|
||||
"75-night": "Çok Kar",
|
||||
"77-day": "Kar Taneleri",
|
||||
"77-night": "Kar Taneleri",
|
||||
"80-day": "Hafif Sağanak",
|
||||
"80-night": "Hafif Sağanak",
|
||||
"81-day": "Sağanak",
|
||||
"81-night": "Sağanak",
|
||||
"82-day": "Yoğun Sağanak",
|
||||
"95-night": "Gök Gürültülü Fırtına",
|
||||
"82-night": "Yoğun Sağanak",
|
||||
"85-day": "Karlı Sağanak",
|
||||
"85-night": "Karlı Sağanak",
|
||||
"86-day": "Karlı Sağanak",
|
||||
"86-night": "Karlı Sağanak",
|
||||
"95-day": "Gök Gürültülü Fırtına",
|
||||
"96-day": "Dolu İle Gök Gürültülü Fırtına",
|
||||
"96-night": "Dolu İle Gök Gürültülü Fırtına",
|
||||
"99-night": "Dolu İle Gök Gürültülü Fırtına"
|
||||
},
|
||||
"quicklaunch": {
|
||||
"bookmark": "Yer İmi",
|
||||
"service": "Hizmet"
|
||||
},
|
||||
"homebridge": {
|
||||
"available_update": "Sistem",
|
||||
"updates": "Güncellemeler",
|
||||
"update_available": "Güncelleme Kullanılabilir",
|
||||
"up_to_date": "Güncel",
|
||||
"child_bridges": "Alt Köprüler",
|
||||
"child_bridges_status": "{{ok}}/{{total}}"
|
||||
},
|
||||
"autobrr": {
|
||||
"approvedPushes": "Onaylandı",
|
||||
"rejectedPushes": "Reddedildi",
|
||||
"filters": "Süzgeçler",
|
||||
"indexers": "Dizin Oluşturucular"
|
||||
},
|
||||
"watchtower": {
|
||||
"containers_scanned": "Tarandı",
|
||||
"containers_updated": "Güncellendi",
|
||||
"containers_failed": "Başarısız"
|
||||
},
|
||||
"tubearchivist": {
|
||||
"downloads": "Kuyruk",
|
||||
"videos": "Videolar",
|
||||
"channels": "Kanallar",
|
||||
"playlists": "Oynatma Listeleri"
|
||||
},
|
||||
"truenas": {
|
||||
"load": "Sistem Yükü",
|
||||
"uptime": "Çalışma Süresi",
|
||||
"alerts": "Alarmlar",
|
||||
"time": "{{value, number(style: unit; unitDisplay: long;)}}"
|
||||
},
|
||||
"navidrome": {
|
||||
"nothing_streaming": "Geçerli Akış Yok",
|
||||
"please_wait": "Lütfen Bekleyin"
|
||||
},
|
||||
"pyload": {
|
||||
"speed": "Hız",
|
||||
"active": "Geçerli",
|
||||
"queue": "Kuyruk",
|
||||
"total": "Toplam"
|
||||
},
|
||||
"gluetun": {
|
||||
"public_ip": "Public IP",
|
||||
"region": "Region",
|
||||
"country": "Country"
|
||||
},
|
||||
"hdhomerun": {
|
||||
"channels": "Channels",
|
||||
"hd": "HD"
|
||||
}
|
||||
}
|
|
@ -2,7 +2,11 @@
|
|||
"widget": {
|
||||
"missing_type": "Thiếu loại Widget: {{type}}",
|
||||
"api_error": "Lỗi API",
|
||||
"status": "Trạng thái"
|
||||
"status": "Trạng thái",
|
||||
"information": "Information",
|
||||
"url": "URL",
|
||||
"raw_error": "Raw Error",
|
||||
"response_data": "Response Data"
|
||||
},
|
||||
"search": {
|
||||
"placeholder": "Tìm kiếm…"
|
||||
|
@ -46,7 +50,8 @@
|
|||
"radarr": {
|
||||
"wanted": "Wanted",
|
||||
"queued": "Queued",
|
||||
"movies": "Phim"
|
||||
"movies": "Phim",
|
||||
"missing": "Missing"
|
||||
},
|
||||
"readarr": {
|
||||
"wanted": "Đang tìm",
|
||||
|
@ -190,7 +195,12 @@
|
|||
"wlan_users": "WLAN Users",
|
||||
"up": "UP",
|
||||
"down": "DOWN",
|
||||
"wait": "Please wait"
|
||||
"wait": "Please wait",
|
||||
"lan": "LAN",
|
||||
"wlan": "WLAN",
|
||||
"devices": "Devices",
|
||||
"lan_devices": "LAN Devices",
|
||||
"wlan_devices": "WLAN Devices"
|
||||
},
|
||||
"plex": {
|
||||
"streams": "Active Streams",
|
||||
|
@ -201,5 +211,121 @@
|
|||
"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"
|
||||
},
|
||||
"homebridge": {
|
||||
"available_update": "System",
|
||||
"updates": "Updates",
|
||||
"update_available": "Update Available",
|
||||
"up_to_date": "Up to Date",
|
||||
"child_bridges": "Child Bridges",
|
||||
"child_bridges_status": "{{ok}}/{{total}}"
|
||||
},
|
||||
"autobrr": {
|
||||
"approvedPushes": "Approved",
|
||||
"rejectedPushes": "Rejected",
|
||||
"filters": "Filters",
|
||||
"indexers": "Indexers"
|
||||
},
|
||||
"watchtower": {
|
||||
"containers_scanned": "Scanned",
|
||||
"containers_updated": "Updated",
|
||||
"containers_failed": "Failed"
|
||||
},
|
||||
"tubearchivist": {
|
||||
"downloads": "Queue",
|
||||
"videos": "Videos",
|
||||
"channels": "Channels",
|
||||
"playlists": "Playlists"
|
||||
},
|
||||
"truenas": {
|
||||
"load": "System Load",
|
||||
"uptime": "Uptime",
|
||||
"alerts": "Alerts",
|
||||
"time": "{{value, number(style: unit; unitDisplay: long;)}}"
|
||||
},
|
||||
"navidrome": {
|
||||
"nothing_streaming": "No Active Streams",
|
||||
"please_wait": "Please Wait"
|
||||
},
|
||||
"pyload": {
|
||||
"speed": "Speed",
|
||||
"active": "Active",
|
||||
"queue": "Queue",
|
||||
"total": "Total"
|
||||
},
|
||||
"gluetun": {
|
||||
"public_ip": "Public IP",
|
||||
"region": "Region",
|
||||
"country": "Country"
|
||||
},
|
||||
"hdhomerun": {
|
||||
"channels": "Channels",
|
||||
"hd": "HD"
|
||||
}
|
||||
}
|
||||
|
|
|
@ -20,7 +20,11 @@
|
|||
"widget": {
|
||||
"missing_type": "缺少小部件類型:{{type}}",
|
||||
"api_error": "API 錯誤",
|
||||
"status": "狀況"
|
||||
"status": "狀況",
|
||||
"url": "URL",
|
||||
"information": "Information",
|
||||
"raw_error": "Raw Error",
|
||||
"response_data": "Response Data"
|
||||
},
|
||||
"weather": {
|
||||
"current": "依家位置",
|
||||
|
@ -74,7 +78,8 @@
|
|||
"radarr": {
|
||||
"wanted": "想睇",
|
||||
"queued": "排緊隊",
|
||||
"movies": "電影"
|
||||
"movies": "電影",
|
||||
"missing": "Missing"
|
||||
},
|
||||
"lidarr": {
|
||||
"wanted": "想睇",
|
||||
|
@ -190,7 +195,12 @@
|
|||
"wlan_users": "WLAN Users",
|
||||
"up": "UP",
|
||||
"down": "DOWN",
|
||||
"wait": "Please wait"
|
||||
"wait": "Please wait",
|
||||
"lan": "LAN",
|
||||
"wlan": "WLAN",
|
||||
"devices": "Devices",
|
||||
"lan_devices": "LAN Devices",
|
||||
"wlan_devices": "WLAN Devices"
|
||||
},
|
||||
"plex": {
|
||||
"streams": "Active Streams",
|
||||
|
@ -201,5 +211,121 @@
|
|||
"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"
|
||||
},
|
||||
"homebridge": {
|
||||
"available_update": "System",
|
||||
"updates": "Updates",
|
||||
"update_available": "Update Available",
|
||||
"up_to_date": "Up to Date",
|
||||
"child_bridges": "Child Bridges",
|
||||
"child_bridges_status": "{{ok}}/{{total}}"
|
||||
},
|
||||
"autobrr": {
|
||||
"approvedPushes": "Approved",
|
||||
"rejectedPushes": "Rejected",
|
||||
"filters": "Filters",
|
||||
"indexers": "Indexers"
|
||||
},
|
||||
"watchtower": {
|
||||
"containers_scanned": "Scanned",
|
||||
"containers_updated": "Updated",
|
||||
"containers_failed": "Failed"
|
||||
},
|
||||
"tubearchivist": {
|
||||
"downloads": "Queue",
|
||||
"videos": "Videos",
|
||||
"channels": "Channels",
|
||||
"playlists": "Playlists"
|
||||
},
|
||||
"truenas": {
|
||||
"load": "System Load",
|
||||
"uptime": "Uptime",
|
||||
"alerts": "Alerts",
|
||||
"time": "{{value, number(style: unit; unitDisplay: long;)}}"
|
||||
},
|
||||
"navidrome": {
|
||||
"nothing_streaming": "No Active Streams",
|
||||
"please_wait": "Please Wait"
|
||||
},
|
||||
"pyload": {
|
||||
"speed": "Speed",
|
||||
"active": "Active",
|
||||
"queue": "Queue",
|
||||
"total": "Total"
|
||||
},
|
||||
"gluetun": {
|
||||
"public_ip": "Public IP",
|
||||
"region": "Region",
|
||||
"country": "Country"
|
||||
},
|
||||
"hdhomerun": {
|
||||
"channels": "Channels",
|
||||
"hd": "HD"
|
||||
}
|
||||
}
|
||||
|
|
|
@ -2,7 +2,11 @@
|
|||
"widget": {
|
||||
"missing_type": "缺少小部件类型:{{type}}",
|
||||
"api_error": "API错误",
|
||||
"status": "状态"
|
||||
"status": "状态",
|
||||
"information": "Information",
|
||||
"url": "URL",
|
||||
"raw_error": "Raw Error",
|
||||
"response_data": "Response Data"
|
||||
},
|
||||
"search": {
|
||||
"placeholder": "搜索…"
|
||||
|
@ -46,7 +50,8 @@
|
|||
"radarr": {
|
||||
"wanted": "想看",
|
||||
"queued": "队列",
|
||||
"movies": "电影"
|
||||
"movies": "电影",
|
||||
"missing": "丢失"
|
||||
},
|
||||
"readarr": {
|
||||
"wanted": "订阅",
|
||||
|
@ -190,7 +195,12 @@
|
|||
"wlan_users": "无线局域网用户",
|
||||
"up": "向上",
|
||||
"down": "向下",
|
||||
"wait": "请稍候"
|
||||
"wait": "请稍候",
|
||||
"lan": "局域网",
|
||||
"wlan": "无线局域网",
|
||||
"devices": "设备",
|
||||
"lan_devices": "局域网设备",
|
||||
"wlan_devices": "无线局域网设备"
|
||||
},
|
||||
"plex": {
|
||||
"streams": "活动流",
|
||||
|
@ -201,5 +211,121 @@
|
|||
"cpu": "处理器",
|
||||
"mem": "内存",
|
||||
"wait": "请稍等"
|
||||
},
|
||||
"changedetectionio": {
|
||||
"totalObserved": "观察到的总数",
|
||||
"diffsDetected": "检测到差异"
|
||||
},
|
||||
"wmo": {
|
||||
"0-day": "晴天",
|
||||
"0-night": "晴朗",
|
||||
"1-day": "主要是晴天",
|
||||
"3-day": "阴天",
|
||||
"3-night": "阴天",
|
||||
"45-day": "有雾",
|
||||
"48-day": "有雾",
|
||||
"51-day": "小雨",
|
||||
"73-night": "Snow",
|
||||
"75-day": "Heavy Snow",
|
||||
"1-night": "大部晴朗",
|
||||
"2-day": "多云",
|
||||
"2-night": "多云",
|
||||
"45-night": "有雾",
|
||||
"48-night": "有雾",
|
||||
"51-night": "小雨",
|
||||
"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": "书签",
|
||||
"service": "服务"
|
||||
},
|
||||
"homebridge": {
|
||||
"available_update": "System",
|
||||
"updates": "Updates",
|
||||
"update_available": "Update Available",
|
||||
"up_to_date": "Up to Date",
|
||||
"child_bridges": "Child Bridges",
|
||||
"child_bridges_status": "{{ok}}/{{total}}"
|
||||
},
|
||||
"autobrr": {
|
||||
"approvedPushes": "Approved",
|
||||
"rejectedPushes": "Rejected",
|
||||
"filters": "Filters",
|
||||
"indexers": "Indexers"
|
||||
},
|
||||
"watchtower": {
|
||||
"containers_scanned": "Scanned",
|
||||
"containers_updated": "Updated",
|
||||
"containers_failed": "Failed"
|
||||
},
|
||||
"tubearchivist": {
|
||||
"downloads": "Queue",
|
||||
"videos": "Videos",
|
||||
"channels": "Channels",
|
||||
"playlists": "Playlists"
|
||||
},
|
||||
"truenas": {
|
||||
"load": "System Load",
|
||||
"uptime": "Uptime",
|
||||
"alerts": "警报",
|
||||
"time": "{{value, number(style: unit; unitDisplay: long;)}}"
|
||||
},
|
||||
"navidrome": {
|
||||
"nothing_streaming": "暂无播放",
|
||||
"please_wait": "请等待"
|
||||
},
|
||||
"pyload": {
|
||||
"speed": "Speed",
|
||||
"active": "Active",
|
||||
"queue": "Queue",
|
||||
"total": "Total"
|
||||
},
|
||||
"gluetun": {
|
||||
"public_ip": "Public IP",
|
||||
"region": "Region",
|
||||
"country": "Country"
|
||||
},
|
||||
"hdhomerun": {
|
||||
"channels": "Channels",
|
||||
"hd": "HD"
|
||||
}
|
||||
}
|
||||
|
|
|
@ -2,7 +2,11 @@
|
|||
"widget": {
|
||||
"missing_type": "Missing Widget Type: {{type}}",
|
||||
"api_error": "API Error",
|
||||
"status": "Status"
|
||||
"status": "Status",
|
||||
"information": "Information",
|
||||
"url": "URL",
|
||||
"raw_error": "Raw Error",
|
||||
"response_data": "Response Data"
|
||||
},
|
||||
"weather": {
|
||||
"current": "Current Location",
|
||||
|
@ -62,7 +66,8 @@
|
|||
"radarr": {
|
||||
"movies": "Movies",
|
||||
"wanted": "Wanted",
|
||||
"queued": "Queued"
|
||||
"queued": "Queued",
|
||||
"missing": "Missing"
|
||||
},
|
||||
"sonarr": {
|
||||
"wanted": "Wanted",
|
||||
|
@ -190,7 +195,12 @@
|
|||
"wlan_users": "WLAN Users",
|
||||
"up": "UP",
|
||||
"down": "DOWN",
|
||||
"wait": "Please wait"
|
||||
"wait": "Please wait",
|
||||
"lan": "LAN",
|
||||
"wlan": "WLAN",
|
||||
"devices": "Devices",
|
||||
"lan_devices": "LAN Devices",
|
||||
"wlan_devices": "WLAN Devices"
|
||||
},
|
||||
"plex": {
|
||||
"streams": "Active Streams",
|
||||
|
@ -201,5 +211,121 @@
|
|||
"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"
|
||||
},
|
||||
"homebridge": {
|
||||
"available_update": "System",
|
||||
"updates": "Updates",
|
||||
"update_available": "Update Available",
|
||||
"up_to_date": "Up to Date",
|
||||
"child_bridges": "Child Bridges",
|
||||
"child_bridges_status": "{{ok}}/{{total}}"
|
||||
},
|
||||
"autobrr": {
|
||||
"approvedPushes": "Approved",
|
||||
"rejectedPushes": "Rejected",
|
||||
"filters": "Filters",
|
||||
"indexers": "Indexers"
|
||||
},
|
||||
"watchtower": {
|
||||
"containers_scanned": "Scanned",
|
||||
"containers_updated": "Updated",
|
||||
"containers_failed": "Failed"
|
||||
},
|
||||
"tubearchivist": {
|
||||
"downloads": "Queue",
|
||||
"videos": "Videos",
|
||||
"channels": "Channels",
|
||||
"playlists": "Playlists"
|
||||
},
|
||||
"truenas": {
|
||||
"load": "System Load",
|
||||
"uptime": "Uptime",
|
||||
"alerts": "Alerts",
|
||||
"time": "{{value, number(style: unit; unitDisplay: long;)}}"
|
||||
},
|
||||
"navidrome": {
|
||||
"nothing_streaming": "No Active Streams",
|
||||
"please_wait": "Please Wait"
|
||||
},
|
||||
"pyload": {
|
||||
"speed": "Speed",
|
||||
"active": "Active",
|
||||
"queue": "Queue",
|
||||
"total": "Total"
|
||||
},
|
||||
"gluetun": {
|
||||
"public_ip": "Public IP",
|
||||
"region": "Region",
|
||||
"country": "Country"
|
||||
},
|
||||
"hdhomerun": {
|
||||
"channels": "Channels",
|
||||
"hd": "HD"
|
||||
}
|
||||
}
|
||||
|
|
|
@ -3,7 +3,7 @@ import List from "components/bookmarks/list";
|
|||
|
||||
export default function BookmarksGroup({ group }) {
|
||||
return (
|
||||
<div key={group.name} className="basis-full md:basis-1/2 lg:basis-1/3 xl:basis-1/4 flex-1">
|
||||
<div key={group.name} className="flex-1">
|
||||
<h2 className="text-theme-800 dark:text-theme-300 text-xl font-medium">{group.name}</h2>
|
||||
<ErrorBoundary>
|
||||
<List bookmarks={group.bookmarks} />
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
import { useContext } from "react";
|
||||
|
||||
import { SettingsContext } from "utils/contexts/settings";
|
||||
import ResolvedIcon from "components/resolvedicon";
|
||||
|
||||
export default function Item({ bookmark }) {
|
||||
const { hostname } = new URL(bookmark.href);
|
||||
|
@ -11,12 +12,17 @@ export default function Item({ bookmark }) {
|
|||
<a
|
||||
href={bookmark.href}
|
||||
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"
|
||||
>
|
||||
<div className="flex">
|
||||
<div className="flex-shrink-0 flex items-center justify-center w-11 bg-theme-500/10 dark:bg-theme-900/50 text-theme-700 hover:text-theme-700 dark:text-theme-200 text-sm font-medium rounded-l-md">
|
||||
{bookmark.abbr}
|
||||
{bookmark.icon &&
|
||||
<div className="flex-shrink-0 w-5 h-5">
|
||||
<ResolvedIcon icon={bookmark.icon} />
|
||||
</div>
|
||||
}
|
||||
{!bookmark.icon && bookmark.abbr}
|
||||
</div>
|
||||
<div className="flex-1 flex items-center justify-between rounded-r-md ">
|
||||
<div className="flex-1 grow pl-3 py-2 text-xs">{bookmark.name}</div>
|
||||
|
|
160
src/components/quicklaunch.jsx
Normal file
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 ResolvedIcon from "./resolvedicon";
|
||||
|
||||
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 && <ResolvedIcon icon={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>
|
||||
);
|
||||
}
|
37
src/components/resolvedicon.jsx
Normal file
37
src/components/resolvedicon.jsx
Normal file
|
@ -0,0 +1,37 @@
|
|||
import Image from "next/future/image";
|
||||
|
||||
export default function ResolvedIcon({ icon }) {
|
||||
// direct or relative URLs
|
||||
if (icon.startsWith("http") || icon.startsWith("/")) {
|
||||
return <Image src={`${icon}`} width={32} height={32} alt="logo" />;
|
||||
}
|
||||
|
||||
// mdi- prefixed, material design icons
|
||||
if (icon.startsWith("mdi-")) {
|
||||
const iconName = icon.replace("mdi-", "").replace(".svg", "");
|
||||
return (
|
||||
<div
|
||||
style={{
|
||||
width: 32,
|
||||
height: 32,
|
||||
maxWidth: '100%',
|
||||
maxHeight: '100%',
|
||||
background: "linear-gradient(180deg, rgb(var(--color-logo-start)), rgb(var(--color-logo-stop)))",
|
||||
mask: `url(https://cdn.jsdelivr.net/npm/@mdi/svg@latest/svg/${iconName}.svg) no-repeat center / contain`,
|
||||
WebkitMask: `url(https://cdn.jsdelivr.net/npm/@mdi/svg@latest/svg/${iconName}.svg) no-repeat center / contain`,
|
||||
}}
|
||||
/>
|
||||
);
|
||||
}
|
||||
|
||||
// fallback to dashboard-icons
|
||||
const iconName = icon.replace(".png", "");
|
||||
return (
|
||||
<Image
|
||||
src={`https://cdn.jsdelivr.net/gh/walkxcode/dashboard-icons/png/${iconName}.png`}
|
||||
width={32}
|
||||
height={32}
|
||||
alt="logo"
|
||||
/>
|
||||
);
|
||||
}
|
|
@ -1,6 +1,7 @@
|
|||
import classNames from "classnames";
|
||||
|
||||
import List from "components/services/list";
|
||||
import ResolvedIcon from "components/resolvedicon";
|
||||
|
||||
export default function ServicesGroup({ services, layout }) {
|
||||
return (
|
||||
|
@ -11,7 +12,14 @@ export default function ServicesGroup({ services, layout }) {
|
|||
"flex-1 p-1"
|
||||
)}
|
||||
>
|
||||
<h2 className="text-theme-800 dark:text-theme-300 text-xl font-medium">{services.name}</h2>
|
||||
<div className="flex select-none items-center">
|
||||
{layout?.icon &&
|
||||
<div className="flex-shrink-0 mr-2 w-7 h-7">
|
||||
<ResolvedIcon icon={layout.icon} />
|
||||
</div>
|
||||
}
|
||||
<h2 className="text-theme-800 dark:text-theme-300 text-xl font-medium">{services.name}</h2>
|
||||
</div>
|
||||
<List services={services.services} layout={layout} />
|
||||
</div>
|
||||
);
|
||||
|
|
|
@ -1,4 +1,3 @@
|
|||
import Image from "next/future/image";
|
||||
import classNames from "classnames";
|
||||
import { useContext, useState } from "react";
|
||||
|
||||
|
@ -7,40 +6,7 @@ import Widget from "./widget";
|
|||
|
||||
import Docker from "widgets/docker/component";
|
||||
import { SettingsContext } from "utils/contexts/settings";
|
||||
|
||||
function resolveIcon(icon) {
|
||||
// direct or relative URLs
|
||||
if (icon.startsWith("http") || icon.startsWith("/")) {
|
||||
return <Image src={`${icon}`} width={32} height={32} alt="logo" />;
|
||||
}
|
||||
|
||||
// mdi- prefixed, material design icons
|
||||
if (icon.startsWith("mdi-")) {
|
||||
const iconName = icon.replace("mdi-", "").replace(".svg", "");
|
||||
return (
|
||||
<div
|
||||
style={{
|
||||
width: 32,
|
||||
height: 32,
|
||||
background: "linear-gradient(180deg, rgb(var(--color-logo-start)), rgb(var(--color-logo-stop)))",
|
||||
mask: `url(https://cdn.jsdelivr.net/npm/@mdi/svg@latest/svg/${iconName}.svg) no-repeat center / contain`,
|
||||
WebkitMask: `url(https://cdn.jsdelivr.net/npm/@mdi/svg@latest/svg/${iconName}.svg) no-repeat center / contain`,
|
||||
}}
|
||||
/>
|
||||
);
|
||||
}
|
||||
|
||||
// fallback to dashboard-icons
|
||||
const iconName = icon.replace(".png", "");
|
||||
return (
|
||||
<Image
|
||||
src={`https://cdn.jsdelivr.net/gh/walkxcode/dashboard-icons/png/${iconName}.png`}
|
||||
width={32}
|
||||
height={32}
|
||||
alt="logo"
|
||||
/>
|
||||
);
|
||||
}
|
||||
import ResolvedIcon from "components/resolvedicon";
|
||||
|
||||
export default function Item({ service }) {
|
||||
const hasLink = service.href && service.href !== "#";
|
||||
|
@ -71,20 +37,22 @@ export default function Item({ service }) {
|
|||
(hasLink ? (
|
||||
<a
|
||||
href={service.href}
|
||||
target={settings.target ?? "_blank"}
|
||||
target={service.target ?? settings.target ?? "_blank"}
|
||||
rel="noreferrer"
|
||||
className="flex-shrink-0 flex items-center justify-center w-12 "
|
||||
>
|
||||
{resolveIcon(service.icon)}
|
||||
<ResolvedIcon icon={service.icon} />
|
||||
</a>
|
||||
) : (
|
||||
<div className="flex-shrink-0 flex items-center justify-center w-12 ">{resolveIcon(service.icon)}</div>
|
||||
<div className="flex-shrink-0 flex items-center justify-center w-12 ">
|
||||
<ResolvedIcon icon={service.icon} />
|
||||
</div>
|
||||
))}
|
||||
|
||||
{hasLink ? (
|
||||
<a
|
||||
href={service.href}
|
||||
target={settings.target ?? "_blank"}
|
||||
target={service.target ?? settings.target ?? "_blank"}
|
||||
rel="noreferrer"
|
||||
className="flex-1 flex items-center justify-between rounded-r-md "
|
||||
>
|
||||
|
@ -117,7 +85,7 @@ export default function Item({ service }) {
|
|||
{service.container && service.server && (
|
||||
<div
|
||||
className={classNames(
|
||||
statsOpen && !statsClosing ? "max-h-[55px] opacity-100" : " max-h-[0] opacity-0",
|
||||
statsOpen && !statsClosing ? "max-h-[110px] opacity-100" : " max-h-[0] opacity-0",
|
||||
"w-full overflow-hidden transition-all duration-300 ease-in-out"
|
||||
)}
|
||||
>
|
||||
|
|
|
@ -7,7 +7,7 @@ export default function Block({ value, label }) {
|
|||
return (
|
||||
<div
|
||||
className={classNames(
|
||||
"bg-theme-200/50 dark:bg-theme-900/20 rounded m-1 flex-1 flex flex-col items-center justify-center p-1",
|
||||
"bg-theme-200/50 dark:bg-theme-900/20 rounded m-1 flex-1 flex flex-col items-center justify-center text-center p-1",
|
||||
value === undefined ? "animate-pulse" : ""
|
||||
)}
|
||||
>
|
||||
|
|
|
@ -1,17 +1,15 @@
|
|||
import Error from "./error";
|
||||
|
||||
export default function Container({ error = false, children, service }) {
|
||||
if (error) {
|
||||
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="font-thin text-sm">{error}</div>
|
||||
</div>
|
||||
);
|
||||
return <Error error={error} />
|
||||
}
|
||||
|
||||
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));
|
||||
visibleChildren = children.filter(child => fields.some(field => `${type}.${field}` === child?.props?.label));
|
||||
}
|
||||
|
||||
return <div className="relative flex flex-row w-full">{visibleChildren}</div>;
|
||||
|
|
50
src/components/services/widget/error.jsx
Normal file
50
src/components/services/widget/error.jsx
Normal file
|
@ -0,0 +1,50 @@
|
|||
import { useTranslation } from "react-i18next";
|
||||
import { IoAlertCircle } from "react-icons/io5";
|
||||
|
||||
function displayError(error) {
|
||||
return JSON.stringify(error[1] ? error[1] : error, null, 4);
|
||||
}
|
||||
|
||||
function displayData(data) {
|
||||
return (data.type === 'Buffer') ? Buffer.from(data).toString() : JSON.stringify(data, 4);
|
||||
}
|
||||
|
||||
export default function Error({ error }) {
|
||||
const { t } = useTranslation();
|
||||
|
||||
if (error?.data?.error) {
|
||||
error = error.data.error; // eslint-disable-line no-param-reassign
|
||||
}
|
||||
|
||||
return (
|
||||
<details className="px-1 pb-1">
|
||||
<summary className="block text-center mt-1 mb-0 mx-auto p-3 rounded bg-rose-900/80 hover:bg-rose-900/95 text-theme-900 cursor-pointer">
|
||||
<div className="flex items-center justify-center text-xs font-bold">
|
||||
<IoAlertCircle className="mr-1 w-5 h-5"/>{t("widget.api_error")} {error.message && t("widget.information")}
|
||||
</div>
|
||||
</summary>
|
||||
<div className="bg-white dark:bg-theme-200/50 mt-2 rounded text-rose-900 text-xs font-mono whitespace-pre-wrap break-all">
|
||||
<ul className="p-4">
|
||||
{error.message && <li>
|
||||
<span className="text-black">{t("widget.api_error")}:</span> {error.message}
|
||||
</li>}
|
||||
{error.url && <li className="mt-2">
|
||||
<span className="text-black">{t("widget.url")}:</span> {error.url}
|
||||
</li>}
|
||||
{error.rawError && <li className="mt-2">
|
||||
<span className="text-black">{t("widget.raw_error")}:</span>
|
||||
<div className="ml-2">
|
||||
{displayError(error.rawError)}
|
||||
</div>
|
||||
</li>}
|
||||
{error.data && <li className="mt-2">
|
||||
<span className="text-black">{t("widget.response_data")}:</span>
|
||||
<div className="ml-2">
|
||||
{displayData(error.data)}
|
||||
</div>
|
||||
</li>}
|
||||
</ul>
|
||||
</div>
|
||||
</details>
|
||||
);
|
||||
}
|
|
@ -27,10 +27,12 @@ export default function DateTime({ options }) {
|
|||
const dateFormat = new Intl.DateTimeFormat(i18n.language, { ...format });
|
||||
|
||||
return (
|
||||
<div className="flex flex-row items-center grow justify-end">
|
||||
<span className={`text-theme-800 dark:text-theme-200 ${textSizes[textSize || "lg"]}`}>
|
||||
{dateFormat.format(date)}
|
||||
</span>
|
||||
<div className="flex flex-col justify-center first:ml-0 ml-4">
|
||||
<div className="flex flex-row items-center grow justify-end">
|
||||
<span className={`text-theme-800 dark:text-theme-200 ${textSizes[textSize || "lg"]}`}>
|
||||
{dateFormat.format(date)}
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
|
7
src/components/widgets/openmeteo/icon.jsx
Normal file
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
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 }} />;
|
||||
}
|
|
@ -54,7 +54,7 @@ function Widget({ options }) {
|
|||
<div className="hidden sm:flex flex-col items-center">
|
||||
<Icon
|
||||
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.sunset ? "day" : "night"}
|
||||
/>
|
||||
</div>
|
||||
<div className="flex flex-col ml-3 text-left">
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
import { BiError, BiWifi, BiCheckCircle, BiXCircle } from "react-icons/bi";
|
||||
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";
|
||||
|
@ -12,7 +12,7 @@ export default function Widget({ options }) {
|
|||
options.type = "unifi_console";
|
||||
const { data: statsData, error: statsError } = useWidgetAPI(options, "stat/sites", { index: options.index });
|
||||
|
||||
if (statsError || statsData?.error) {
|
||||
if (statsError) {
|
||||
return (
|
||||
<div className="flex flex-col justify-center first:ml-0 ml-4">
|
||||
<div className="flex flex-row items-center justify-end">
|
||||
|
@ -48,71 +48,89 @@ export default function Widget({ options }) {
|
|||
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");
|
||||
const data = {
|
||||
name: wan.gw_name,
|
||||
uptime: wan["gw_system-stats"].uptime,
|
||||
up: wan.status === 'ok',
|
||||
wlan: {
|
||||
users: wlan.num_user,
|
||||
status: wlan.status
|
||||
},
|
||||
lan: {
|
||||
users: lan.num_user,
|
||||
status: lan.status
|
||||
}
|
||||
};
|
||||
[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">
|
||||
<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">
|
||||
{data.name}
|
||||
{name}
|
||||
</div>
|
||||
</div>
|
||||
<div className="flex flex-row ml-3 text-[10px] justify-between">
|
||||
<div className="flex flex-row" title={t("unifi.uptime")}>
|
||||
{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: data.uptime / 86400,
|
||||
value: uptime / 86400,
|
||||
maximumFractionDigits: 1,
|
||||
})}
|
||||
</div>
|
||||
<div className="pr-1 text-theme-800 dark:text-theme-200">{t("unifi.days")}</div>
|
||||
</div>
|
||||
<div className="flex flex-row">
|
||||
</div>}
|
||||
{wan.show && <div className="flex flex-row">
|
||||
<div className="pr-1 text-theme-800 dark:text-theme-200">{t("unifi.wan")}</div>
|
||||
{ data.up
|
||||
{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>
|
||||
</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">
|
||||
<div className="flex flex-row ml-3 py-0.5">
|
||||
{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: data.wlan.users,
|
||||
value: wlan.num_user,
|
||||
maximumFractionDigits: 0,
|
||||
})}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div className="flex flex-row ml-3 pb-0.5">
|
||||
</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: data.lan.users,
|
||||
value: lan.num_user,
|
||||
maximumFractionDigits: 0,
|
||||
})}
|
||||
</div>
|
||||
</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>
|
||||
);
|
||||
|
|
|
@ -12,6 +12,7 @@ const widgetMappings = {
|
|||
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 }) {
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
/* eslint-disable react/jsx-props-no-spreading */
|
||||
import { SWRConfig } from "swr";
|
||||
import { appWithTranslation } from "next-i18next";
|
||||
import Head from "next/head";
|
||||
|
||||
import "styles/globals.css";
|
||||
import "styles/theme.css";
|
||||
|
@ -18,6 +19,10 @@ function MyApp({ Component, pageProps }) {
|
|||
fetcher: (resource, init) => fetch(resource, init).then((res) => res.json()),
|
||||
}}
|
||||
>
|
||||
<Head>
|
||||
{/* https://nextjs.org/docs/messages/no-document-viewport-meta */}
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no" />
|
||||
</Head>
|
||||
<ColorProvider>
|
||||
<ThemeProvider>
|
||||
<SettingsProvider>
|
||||
|
|
|
@ -46,7 +46,7 @@ export default async function handler(req, res) {
|
|||
});
|
||||
} catch {
|
||||
res.status(500).send({
|
||||
error: "unknown error",
|
||||
error: {message: "Unknown error"},
|
||||
});
|
||||
}
|
||||
}
|
||||
|
|
8
src/pages/api/widgets/openmeteo.js
Normal file
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));
|
||||
}
|
|
@ -21,6 +21,7 @@ import { SettingsContext } from "utils/contexts/settings";
|
|||
import { bookmarksResponse, servicesResponse, widgetsResponse } from "utils/config/api-response";
|
||||
import ErrorBoundary from "components/errorboundry";
|
||||
import themes from "utils/styles/themes";
|
||||
import QuickLaunch from "components/quicklaunch";
|
||||
|
||||
const ThemeToggle = dynamic(() => import("components/toggles/theme"), {
|
||||
ssr: false,
|
||||
|
@ -34,7 +35,7 @@ const Version = dynamic(() => import("components/version"), {
|
|||
ssr: false,
|
||||
});
|
||||
|
||||
const rightAlignedWidgets = ["weatherapi", "openweathermap", "weather", "search", "datetime"];
|
||||
const rightAlignedWidgets = ["weatherapi", "openweathermap", "weather", "openmeteo", "search", "datetime"];
|
||||
|
||||
export async function getStaticProps() {
|
||||
let logger;
|
||||
|
@ -173,6 +174,8 @@ function Home({ initialSettings }) {
|
|||
const { data: services } = useSWR("/api/services");
|
||||
const { data: bookmarks } = useSWR("/api/bookmarks");
|
||||
const { data: widgets } = useSWR("/api/widgets");
|
||||
|
||||
const servicesAndBookmarks = [...services.map(sg => sg.services).flat(), ...bookmarks.map(bg => bg.bookmarks).flat()]
|
||||
|
||||
useEffect(() => {
|
||||
if (settings.language) {
|
||||
|
@ -188,6 +191,28 @@ function Home({ initialSettings }) {
|
|||
}
|
||||
}, [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 (
|
||||
<>
|
||||
<Head>
|
||||
|
@ -219,6 +244,14 @@ function Home({ initialSettings }) {
|
|||
headerStyles[initialSettings.headerStyle || "underlined"]
|
||||
)}
|
||||
>
|
||||
<QuickLaunch
|
||||
servicesAndBookmarks={servicesAndBookmarks}
|
||||
searchString={searchString}
|
||||
setSearchString={setSearchString}
|
||||
isOpen={searching}
|
||||
close={setSearching}
|
||||
searchDescriptions={settings.quicklaunch?.searchDescriptions}
|
||||
/>
|
||||
{widgets && (
|
||||
<>
|
||||
{widgets
|
||||
|
@ -247,7 +280,7 @@ function Home({ initialSettings }) {
|
|||
)}
|
||||
|
||||
{bookmarks && (
|
||||
<div className="grow flex flex-wrap pt-0 p-4 sm:p-8">
|
||||
<div className={`grow flex flex-wrap pt-0 p-4 sm:p-8 gap-2 grid-cols-1 lg:grid-cols-2 lg:grid-cols-${Math.min(6, bookmarks.length)}`}>
|
||||
{bookmarks.map((group) => (
|
||||
<BookmarksGroup key={group.name} group={group} />
|
||||
))}
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
---
|
||||
# For configuration options and examples, please see:
|
||||
# https://github.com/benphelps/homepage/wiki/Bookmarks
|
||||
# https://gethomepage.dev/en/configs/bookmarks
|
||||
|
||||
- Developer:
|
||||
- Github:
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
---
|
||||
# For configuration options and examples, please see:
|
||||
# https://github.com/benphelps/homepage/wiki/Docker-Integration
|
||||
# https://gethomepage.dev/en/configs/docker/
|
||||
|
||||
# my-docker:
|
||||
# host: 127.0.0.1
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
---
|
||||
# For configuration options and examples, please see:
|
||||
# https://github.com/benphelps/homepage/wiki/Services
|
||||
# https://gethomepage.dev/en/configs/services
|
||||
|
||||
- My First Group:
|
||||
- My First Service:
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
---
|
||||
# For configuration options and examples, please see:
|
||||
# https://github.com/benphelps/homepage/wiki/Settings
|
||||
# https://gethomepage.dev/en/configs/settings
|
||||
|
||||
providers:
|
||||
openweathermap: openweathermapapikey
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
---
|
||||
# For configuration options and examples, please see:
|
||||
# https://github.com/benphelps/homepage/wiki/Information-Widgets
|
||||
# https://gethomepage.dev/en/configs/widgets
|
||||
|
||||
- resources:
|
||||
cpu: true
|
||||
|
|
|
@ -4,7 +4,7 @@ import path from "path";
|
|||
|
||||
import yaml from "js-yaml";
|
||||
|
||||
import checkAndCopyConfig from "utils/config/config";
|
||||
import checkAndCopyConfig, { getSettings } from "utils/config/config";
|
||||
import { servicesFromConfig, servicesFromDocker, cleanServiceGroups } from "utils/config/service-helpers";
|
||||
import { cleanWidgetGroups, widgetsFromConfig } from "utils/config/widget-helpers";
|
||||
|
||||
|
@ -46,6 +46,7 @@ export async function widgetsResponse() {
|
|||
export async function servicesResponse() {
|
||||
let discoveredServices;
|
||||
let configuredServices;
|
||||
let initialSettings;
|
||||
|
||||
try {
|
||||
discoveredServices = cleanServiceGroups(await servicesFromDocker());
|
||||
|
@ -63,11 +64,20 @@ export async function servicesResponse() {
|
|||
configuredServices = [];
|
||||
}
|
||||
|
||||
try {
|
||||
initialSettings = await getSettings();
|
||||
} catch (e) {
|
||||
console.error("Failed to load settings.yaml, please check for errors");
|
||||
if (e) console.error(e);
|
||||
initialSettings = {};
|
||||
}
|
||||
|
||||
const mergedGroupsNames = [
|
||||
...new Set([discoveredServices.map((group) => group.name), configuredServices.map((group) => group.name)].flat()),
|
||||
];
|
||||
|
||||
const mergedGroups = [];
|
||||
const definedLayouts = initialSettings.layout ? Object.keys(initialSettings.layout) : null;
|
||||
|
||||
mergedGroupsNames.forEach((groupName) => {
|
||||
const discoveredGroup = discoveredServices.find((group) => group.name === groupName) || { services: [] };
|
||||
|
@ -78,7 +88,13 @@ export async function servicesResponse() {
|
|||
services: [...discoveredGroup.services, ...configuredGroup.services].filter((service) => service),
|
||||
};
|
||||
|
||||
mergedGroups.push(mergedGroup);
|
||||
if (definedLayouts) {
|
||||
const layoutIndex = definedLayouts.findIndex(layout => layout === mergedGroup.name);
|
||||
if (layoutIndex > -1) mergedGroups.splice(layoutIndex, 0, mergedGroup);
|
||||
else mergedGroups.push(mergedGroup);
|
||||
} else {
|
||||
mergedGroups.push(mergedGroup);
|
||||
}
|
||||
});
|
||||
|
||||
return mergedGroups;
|
||||
|
|
|
@ -5,6 +5,8 @@ import yaml from "js-yaml";
|
|||
|
||||
import checkAndCopyConfig from "utils/config/config";
|
||||
|
||||
const exemptWidgets = ["search"];
|
||||
|
||||
export async function widgetsFromConfig() {
|
||||
checkAndCopyConfig("widgets.yaml");
|
||||
|
||||
|
@ -29,11 +31,16 @@ export async function cleanWidgetGroups(widgets) {
|
|||
return widgets.map((widget, index) => {
|
||||
const sanitizedOptions = widget.options;
|
||||
const optionKeys = Object.keys(sanitizedOptions);
|
||||
["url", "username", "password", "key"].forEach((pO) => {
|
||||
if (optionKeys.includes(pO)) {
|
||||
delete sanitizedOptions[pO];
|
||||
}
|
||||
});
|
||||
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,
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
import getServiceWidget from "utils/config/service-helpers";
|
||||
import { formatApiCall } from "utils/proxy/api-helpers";
|
||||
import validateWidgetData from "utils/proxy/validate-widget-data";
|
||||
import { httpProxy } from "utils/proxy/http";
|
||||
import createLogger from "utils/logger";
|
||||
import widgets from "widgets/widgets";
|
||||
|
@ -31,6 +32,10 @@ export default async function credentialedProxyHandler(req, res) {
|
|||
headers.Authorization = `Bearer ${widget.key}`;
|
||||
} else if (widget.type === "proxmox") {
|
||||
headers.Authorization = `PVEAPIToken=${widget.username}=${widget.password}`;
|
||||
} else if (widget.type === "autobrr") {
|
||||
headers["X-API-Token"] = `${widget.key}`;
|
||||
} else if (widget.type === "tubearchivist") {
|
||||
headers.Authorization = `Token ${widget.key}`;
|
||||
} else {
|
||||
headers["X-API-Key"] = `${widget.key}`;
|
||||
}
|
||||
|
@ -50,6 +55,10 @@ export default async function credentialedProxyHandler(req, res) {
|
|||
logger.debug("HTTP Error %d calling %s//%s%s...", status, url.protocol, url.hostname, url.pathname);
|
||||
}
|
||||
|
||||
if (!validateWidgetData(widget, endpoint, data)) {
|
||||
return res.status(500).json({error: {message: "Invalid data", url, data}});
|
||||
}
|
||||
|
||||
if (contentType) res.setHeader("Content-Type", contentType);
|
||||
return res.status(status).send(data);
|
||||
}
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
import getServiceWidget from "utils/config/service-helpers";
|
||||
import { formatApiCall } from "utils/proxy/api-helpers";
|
||||
import validateWidgetData from "utils/proxy/validate-widget-data";
|
||||
import { httpProxy } from "utils/proxy/http";
|
||||
import createLogger from "utils/logger";
|
||||
import widgets from "widgets/widgets";
|
||||
|
@ -32,6 +33,11 @@ export default async function genericProxyHandler(req, res, map) {
|
|||
});
|
||||
|
||||
let resultData = data;
|
||||
|
||||
if (!validateWidgetData(widget, endpoint, resultData)) {
|
||||
return res.status(status).json({error: {message: "Invalid data", url, data: resultData}});
|
||||
}
|
||||
|
||||
if (status === 200 && map) {
|
||||
resultData = map(data);
|
||||
}
|
||||
|
@ -44,6 +50,7 @@ export default async function genericProxyHandler(req, res, map) {
|
|||
|
||||
if (status >= 400) {
|
||||
logger.debug("HTTP Error %d calling %s//%s%s...", status, url.protocol, url.hostname, url.pathname);
|
||||
return res.status(status).json({error: {message: "HTTP Error", url, data}});
|
||||
}
|
||||
|
||||
return res.status(status).send(resultData);
|
||||
|
|
|
@ -98,6 +98,6 @@ export async function httpProxy(url, params = {}) {
|
|||
catch (err) {
|
||||
logger.error("Error calling %s//%s%s...", url.protocol, url.hostname, url.pathname);
|
||||
logger.error(err);
|
||||
return [500, "application/json", { error: "Unexpected error" }, null];
|
||||
return [500, "application/json", { error: {message: err?.message ?? "Unknown error", url, rawError: err} }, null];
|
||||
}
|
||||
}
|
||||
|
|
|
@ -3,5 +3,11 @@ import useSWR from "swr";
|
|||
import { formatProxyUrl } from "./api-helpers";
|
||||
|
||||
export default function useWidgetAPI(widget, ...options) {
|
||||
return useSWR(formatProxyUrl(widget, ...options));
|
||||
const config = {};
|
||||
if (options?.refreshInterval) {
|
||||
config.refreshInterval = options.refreshInterval;
|
||||
}
|
||||
const { data, error } = useSWR(formatProxyUrl(widget, ...options), config);
|
||||
// make the data error the top-level error
|
||||
return { data, error: data?.error ?? error }
|
||||
}
|
||||
|
|
22
src/utils/proxy/validate-widget-data.js
Normal file
22
src/utils/proxy/validate-widget-data.js
Normal file
|
@ -0,0 +1,22 @@
|
|||
import widgets from "widgets/widgets";
|
||||
|
||||
export default function validateWidgetData(widget, endpoint, data) {
|
||||
let valid = true;
|
||||
let dataParsed;
|
||||
try {
|
||||
dataParsed = JSON.parse(data);
|
||||
} catch (e) {
|
||||
valid = false;
|
||||
}
|
||||
|
||||
if (dataParsed) {
|
||||
const validate = widgets[widget.type]?.mappings?.[endpoint]?.validate;
|
||||
validate.forEach(key => {
|
||||
if (dataParsed[key] === undefined) {
|
||||
valid = false;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
return valid;
|
||||
}
|
|
@ -12,9 +12,9 @@ export default function Component({ service }) {
|
|||
const { data: adguardData, error: adguardError } = useWidgetAPI(widget, "stats");
|
||||
|
||||
if (adguardError) {
|
||||
return <Container error={t("widget.api_error")} />;
|
||||
return <Container error={adguardError} />;
|
||||
}
|
||||
|
||||
|
||||
if (!adguardData) {
|
||||
return (
|
||||
<Container service={service}>
|
||||
|
|
|
@ -14,7 +14,8 @@ export default function Component({ service }) {
|
|||
const { data: failedLoginsData, error: failedLoginsError } = useWidgetAPI(widget, "login_failed");
|
||||
|
||||
if (usersError || loginsError || failedLoginsError) {
|
||||
return <Container error={t("widget.api_error")} />;
|
||||
const finalError = usersError ?? loginsError ?? failedLoginsError;
|
||||
return <Container error={finalError} />;
|
||||
}
|
||||
|
||||
if (!usersData || !loginsData || !failedLoginsData) {
|
||||
|
|
40
src/widgets/autobrr/component.jsx
Normal file
40
src/widgets/autobrr/component.jsx
Normal file
|
@ -0,0 +1,40 @@
|
|||
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: statsData, error: statsError } = useWidgetAPI(widget, "stats");
|
||||
const { data: filtersData, error: filtersError } = useWidgetAPI(widget, "filters");
|
||||
const { data: indexersData, error: indexersError } = useWidgetAPI(widget, "indexers");
|
||||
|
||||
if (statsError || filtersError || indexersError) {
|
||||
const finalError = statsError ?? filtersError ?? indexersError;
|
||||
return <Container error={finalError} />;
|
||||
}
|
||||
|
||||
if (!statsData || !filtersData || !indexersData) {
|
||||
return (
|
||||
<Container service={service}>
|
||||
<Block label="autobrr.approvedPushes" />
|
||||
<Block label="autobrr.rejectedPushes" />
|
||||
<Block label="autobrr.filters" />
|
||||
<Block label="autobrr.indexers" />
|
||||
</Container>
|
||||
);
|
||||
}
|
||||
|
||||
return (
|
||||
<Container service={service}>
|
||||
<Block label="autobrr.approvedPushes" value={t("common.number", { value: statsData.push_approved_count })} />
|
||||
<Block label="autobrr.rejectedPushes" value={t("common.number", { value: statsData.push_rejected_count })} />
|
||||
<Block label="autobrr.filters" value={t("common.number", { value: filtersData.length })} />
|
||||
<Block label="autobrr.indexers" value={t("common.number", { value: indexersData.length })} />
|
||||
</Container>
|
||||
);
|
||||
}
|
24
src/widgets/autobrr/widget.js
Normal file
24
src/widgets/autobrr/widget.js
Normal file
|
@ -0,0 +1,24 @@
|
|||
import credentialedProxyHandler from "utils/proxy/handlers/credentialed";
|
||||
|
||||
const widget = {
|
||||
api: "{url}/api/{endpoint}",
|
||||
proxyHandler: credentialedProxyHandler,
|
||||
|
||||
mappings: {
|
||||
stats: {
|
||||
endpoint: "release/stats",
|
||||
validate: [
|
||||
"push_approved_count",
|
||||
"push_rejected_count"
|
||||
]
|
||||
},
|
||||
filters: {
|
||||
endpoint: "filters",
|
||||
},
|
||||
indexers: {
|
||||
endpoint: "release/indexers",
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
export default widget;
|
|
@ -12,8 +12,9 @@ export default function Component({ service }) {
|
|||
const { data: episodesData, error: episodesError } = useWidgetAPI(widget, "episodes");
|
||||
const { data: moviesData, error: moviesError } = useWidgetAPI(widget, "movies");
|
||||
|
||||
if (episodesError || moviesError) {
|
||||
return <Container error="widget.api_error" />;
|
||||
if (moviesError || episodesError) {
|
||||
const finalError = moviesError ?? episodesError;
|
||||
return <Container error={finalError} />;
|
||||
}
|
||||
|
||||
if (!episodesData || !moviesData) {
|
||||
|
|
32
src/widgets/changedetectionio/component.jsx
Normal file
32
src/widgets/changedetectionio/component.jsx
Normal file
|
@ -0,0 +1,32 @@
|
|||
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, error } = useWidgetAPI(widget, "info");
|
||||
|
||||
if (error) {
|
||||
return <Container error={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
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;
|
|
@ -37,7 +37,7 @@ export default function Component({ service }) {
|
|||
}
|
||||
|
||||
if (statsError) {
|
||||
return <Container error={t("widget.api_error")} />;
|
||||
return <Container error={statsError} />;
|
||||
}
|
||||
|
||||
if (!statsData || !dateRange) {
|
||||
|
|
|
@ -3,16 +3,22 @@ import dynamic from "next/dynamic";
|
|||
const components = {
|
||||
adguard: dynamic(() => import("./adguard/component")),
|
||||
authentik: dynamic(() => import("./authentik/component")),
|
||||
autobrr: dynamic(() => import("./autobrr/component")),
|
||||
bazarr: dynamic(() => import("./bazarr/component")),
|
||||
changedetectionio: dynamic(() => import("./changedetectionio/component")),
|
||||
coinmarketcap: dynamic(() => import("./coinmarketcap/component")),
|
||||
docker: dynamic(() => import("./docker/component")),
|
||||
emby: dynamic(() => import("./emby/component")),
|
||||
gluetun: dynamic(() => import("./gluetun/component")),
|
||||
gotify: dynamic(() => import("./gotify/component")),
|
||||
hdhomerun: dynamic(() => import("./hdhomerun/component")),
|
||||
homebridge: dynamic(() => import("./homebridge/component")),
|
||||
jackett: dynamic(() => import("./jackett/component")),
|
||||
jellyfin: dynamic(() => import("./emby/component")),
|
||||
jellyseerr: dynamic(() => import("./jellyseerr/component")),
|
||||
lidarr: dynamic(() => import("./lidarr/component")),
|
||||
mastodon: dynamic(() => import("./mastodon/component")),
|
||||
navidrome: dynamic(() => import("./navidrome/component")),
|
||||
npm: dynamic(() => import("./npm/component")),
|
||||
nzbget: dynamic(() => import("./nzbget/component")),
|
||||
ombi: dynamic(() => import("./ombi/component")),
|
||||
|
@ -22,6 +28,7 @@ const components = {
|
|||
portainer: dynamic(() => import("./portainer/component")),
|
||||
prowlarr: dynamic(() => import("./prowlarr/component")),
|
||||
proxmox: dynamic(() => import("./proxmox/component")),
|
||||
pyload: dynamic(() => import("./pyload/component")),
|
||||
qbittorrent: dynamic(() => import("./qbittorrent/component")),
|
||||
radarr: dynamic(() => import("./radarr/component")),
|
||||
readarr: dynamic(() => import("./readarr/component")),
|
||||
|
@ -33,7 +40,10 @@ const components = {
|
|||
tautulli: dynamic(() => import("./tautulli/component")),
|
||||
traefik: dynamic(() => import("./traefik/component")),
|
||||
transmission: dynamic(() => import("./transmission/component")),
|
||||
tubearchivist: dynamic(() => import("./tubearchivist/component")),
|
||||
truenas: dynamic(() => import("./truenas/component")),
|
||||
unifi: dynamic(() => import("./unifi/component")),
|
||||
watchtower: dynamic(() => import("./watchtower/component")),
|
||||
};
|
||||
|
||||
export default components;
|
||||
|
|
|
@ -17,8 +17,9 @@ export default function Component({ service }) {
|
|||
|
||||
const { data: statsData, error: statsError } = useSWR(`/api/docker/stats/${widget.container}/${widget.server || ""}`);
|
||||
|
||||
if (statsError || statusError) {
|
||||
return <Container error={t("widget.api_error")} />;
|
||||
if (statsError || statsData?.error || statusError || statusData?.error) {
|
||||
const finalError = statsError ?? statsData?.error ?? statusError ?? statusData?.error;
|
||||
return <Container error={finalError} />;
|
||||
}
|
||||
|
||||
if (statusData && statusData.status !== "running") {
|
||||
|
|
|
@ -1,10 +1,10 @@
|
|||
import useSWR from "swr";
|
||||
import { useTranslation } from "next-i18next";
|
||||
import { BsVolumeMuteFill, BsFillPlayFill, BsPauseFill, BsCpu, BsFillCpuFill } from "react-icons/bs";
|
||||
import { MdOutlineSmartDisplay } from "react-icons/md";
|
||||
|
||||
import Container from "components/services/widget/container";
|
||||
import { formatProxyUrl, formatProxyUrlWithSegments } from "utils/proxy/api-helpers";
|
||||
import { formatProxyUrlWithSegments } from "utils/proxy/api-helpers";
|
||||
import useWidgetAPI from "utils/proxy/use-widget-api";
|
||||
|
||||
function ticksToTime(ticks) {
|
||||
const milliseconds = ticks / 10000;
|
||||
|
@ -157,7 +157,7 @@ export default function Component({ service }) {
|
|||
data: sessionsData,
|
||||
error: sessionsError,
|
||||
mutate: sessionMutate,
|
||||
} = useSWR(formatProxyUrl(widget, "Sessions"), {
|
||||
} = useWidgetAPI(widget, "Sessions", {
|
||||
refreshInterval: 5000,
|
||||
});
|
||||
|
||||
|
@ -172,7 +172,7 @@ export default function Component({ service }) {
|
|||
}
|
||||
|
||||
if (sessionsError) {
|
||||
return <Container error={t("widget.api_error")} />;
|
||||
return <Container error={sessionsError} />;
|
||||
}
|
||||
|
||||
if (!sessionsData) {
|
||||
|
|
|
@ -10,7 +10,7 @@ const widget = {
|
|||
},
|
||||
PlayControl: {
|
||||
method: "POST",
|
||||
enpoint: "Sessions/{sessionId}/Playing/{command}",
|
||||
endpoint: "Sessions/{sessionId}/Playing/{command}",
|
||||
segments: ["sessionId", "command"],
|
||||
},
|
||||
},
|
||||
|
|
31
src/widgets/gluetun/component.jsx
Normal file
31
src/widgets/gluetun/component.jsx
Normal file
|
@ -0,0 +1,31 @@
|
|||
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 { widget } = service;
|
||||
|
||||
const { data: gluetunData, error: gluetunError } = useWidgetAPI(widget, "ip");
|
||||
|
||||
if (gluetunError) {
|
||||
return <Container error={gluetunError} />;
|
||||
}
|
||||
|
||||
if (!gluetunData) {
|
||||
return (
|
||||
<Container service={service}>
|
||||
<Block label="gluetun.public_ip" />
|
||||
<Block label="gluetun.region" />
|
||||
<Block label="gluetun.country" />
|
||||
</Container>
|
||||
);
|
||||
}
|
||||
|
||||
return (
|
||||
<Container service={service}>
|
||||
<Block label="gluetun.public_ip" value={gluetunData.public_ip} />
|
||||
<Block label="gluetun.region" value={gluetunData.region} />
|
||||
<Block label="gluetun.country" value={gluetunData.country} />
|
||||
</Container>
|
||||
);
|
||||
}
|
19
src/widgets/gluetun/widget.js
Normal file
19
src/widgets/gluetun/widget.js
Normal file
|
@ -0,0 +1,19 @@
|
|||
import genericProxyHandler from "utils/proxy/handlers/generic";
|
||||
|
||||
const widget = {
|
||||
api: "{url}/v1/{endpoint}",
|
||||
proxyHandler: genericProxyHandler,
|
||||
|
||||
mappings: {
|
||||
ip: {
|
||||
endpoint: "publicip/ip",
|
||||
validate: [
|
||||
"public_ip",
|
||||
"region",
|
||||
"country"
|
||||
]
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
export default widget;
|
|
@ -1,12 +1,8 @@
|
|||
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: appsData, error: appsError } = useWidgetAPI(widget, "application");
|
||||
|
@ -14,7 +10,8 @@ export default function Component({ service }) {
|
|||
const { data: clientsData, error: clientsError } = useWidgetAPI(widget, "client");
|
||||
|
||||
if (appsError || messagesError || clientsError) {
|
||||
return <Container error={t("widget.api_error")} />;
|
||||
const finalError = appsError ?? messagesError ?? clientsError;
|
||||
return <Container error={finalError} />;
|
||||
}
|
||||
|
||||
|
||||
|
|
36
src/widgets/hdhomerun/component.jsx
Normal file
36
src/widgets/hdhomerun/component.jsx
Normal file
|
@ -0,0 +1,36 @@
|
|||
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: channelsData, error: channelsError } = useWidgetAPI(widget, "lineup");
|
||||
|
||||
if (channelsError) {
|
||||
return <Container error={channelsError} />;
|
||||
}
|
||||
|
||||
if (!channelsData) {
|
||||
return (
|
||||
<Container service={service}>
|
||||
<Block label="hdhomerun.channels" />
|
||||
<Block label="hdhomerun.hd" />
|
||||
</Container>
|
||||
);
|
||||
}
|
||||
|
||||
const hdChannels = channelsData?.filter((channel) => channel.HD === 1);
|
||||
|
||||
return (
|
||||
<Container service={service}>
|
||||
<Block label="hdhomerun.channels" value={channelsData.length } />
|
||||
<Block label="hdhomerun.hd" value={hdChannels.length} />
|
||||
|
||||
</Container>
|
||||
);
|
||||
}
|
14
src/widgets/hdhomerun/widget.js
Normal file
14
src/widgets/hdhomerun/widget.js
Normal file
|
@ -0,0 +1,14 @@
|
|||
import genericProxyHandler from "utils/proxy/handlers/generic";
|
||||
|
||||
const widget = {
|
||||
api: "{url}/{endpoint}",
|
||||
proxyHandler: genericProxyHandler,
|
||||
|
||||
mappings: {
|
||||
"lineup": {
|
||||
endpoint: "lineup.json",
|
||||
}
|
||||
},
|
||||
};
|
||||
|
||||
export default widget;
|
51
src/widgets/homebridge/component.jsx
Normal file
51
src/widgets/homebridge/component.jsx
Normal file
|
@ -0,0 +1,51 @@
|
|||
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: homebridgeData, error: homebridgeError } = useWidgetAPI(widget, "info");
|
||||
|
||||
if (homebridgeError) {
|
||||
return <Container error={homebridgeError} />;
|
||||
}
|
||||
|
||||
if (!homebridgeData) {
|
||||
return (
|
||||
<Container service={service}>
|
||||
<Block label="widget.status" />
|
||||
<Block label="homebridge.updates" />
|
||||
<Block label="homebridge.child_bridges" />
|
||||
</Container>
|
||||
);
|
||||
}
|
||||
|
||||
return (
|
||||
<Container service={service}>
|
||||
<Block
|
||||
label="widget.status"
|
||||
value={`${homebridgeData.status[0].toUpperCase()}${homebridgeData.status.substr(1)}`}
|
||||
/>
|
||||
<Block
|
||||
label="homebridge.updates"
|
||||
value={
|
||||
(homebridgeData.updateAvailable || homebridgeData.plugins?.updatesAvailable)
|
||||
? t("homebridge.update_available")
|
||||
: t("homebridge.up_to_date")}
|
||||
/>
|
||||
{homebridgeData?.childBridges?.total > 0 &&
|
||||
<Block
|
||||
label="homebridge.child_bridges"
|
||||
value={t("homebridge.child_bridges_status", {
|
||||
total: homebridgeData.childBridges.total,
|
||||
ok: homebridgeData.childBridges.running
|
||||
})}
|
||||
/>}
|
||||
</Container>
|
||||
);
|
||||
}
|
106
src/widgets/homebridge/proxy.js
Normal file
106
src/widgets/homebridge/proxy.js
Normal file
|
@ -0,0 +1,106 @@
|
|||
import cache from "memory-cache";
|
||||
|
||||
import { httpProxy } from "utils/proxy/http";
|
||||
import { formatApiCall } from "utils/proxy/api-helpers";
|
||||
import getServiceWidget from "utils/config/service-helpers";
|
||||
import createLogger from "utils/logger";
|
||||
import widgets from "widgets/widgets";
|
||||
|
||||
const proxyName = "homebridgeProxyHandler";
|
||||
const sessionTokenCacheKey = `${proxyName}__sessionToken`;
|
||||
const logger = createLogger(proxyName);
|
||||
|
||||
async function login(widget) {
|
||||
const endpoint = "auth/login";
|
||||
const api = widgets?.[widget.type]?.api
|
||||
const loginUrl = new URL(formatApiCall(api, { endpoint, ...widget }));
|
||||
const loginBody = { username: widget.username, password: widget.password };
|
||||
const headers = { "Content-Type": "application/json" };
|
||||
// eslint-disable-next-line no-unused-vars
|
||||
const [status, contentType, data, responseHeaders] = await httpProxy(loginUrl, {
|
||||
method: "POST",
|
||||
body: JSON.stringify(loginBody),
|
||||
headers,
|
||||
});
|
||||
|
||||
try {
|
||||
const { access_token: accessToken, expires_in: expiresIn } = JSON.parse(data.toString());
|
||||
|
||||
cache.put(sessionTokenCacheKey, accessToken, (expiresIn * 1000) - 5 * 60 * 1000); // expiresIn (s) - 5m
|
||||
return { accessToken };
|
||||
} catch (e) {
|
||||
logger.error("Unable to login to Homebridge API: %s", e);
|
||||
}
|
||||
|
||||
return { accessToken: false };
|
||||
}
|
||||
|
||||
async function apiCall(widget, endpoint) {
|
||||
const headers = {
|
||||
"content-type": "application/json",
|
||||
"Authorization": `Bearer ${cache.get(sessionTokenCacheKey)}`,
|
||||
}
|
||||
|
||||
const url = new URL(formatApiCall(widgets[widget.type].api, { endpoint, ...widget }));
|
||||
const method = "GET";
|
||||
|
||||
let [status, contentType, data, responseHeaders] = await httpProxy(url, {
|
||||
method,
|
||||
headers,
|
||||
});
|
||||
|
||||
if (status === 401) {
|
||||
logger.debug("Homebridge API rejected the request, attempting to obtain new session token");
|
||||
const { accessToken } = login(widget);
|
||||
headers.Authorization = `Bearer ${accessToken}`;
|
||||
|
||||
// retry the request, now with the new session token
|
||||
[status, contentType, data, responseHeaders] = await httpProxy(url, {
|
||||
method,
|
||||
headers,
|
||||
});
|
||||
}
|
||||
|
||||
if (status !== 200) {
|
||||
logger.error("Error getting data from Homebridge: %d. Data: %s", status, data);
|
||||
}
|
||||
|
||||
return { status, contentType, data: JSON.parse(data.toString()), responseHeaders };
|
||||
}
|
||||
|
||||
export default async function homebridgeProxyHandler(req, res) {
|
||||
const { group, service } = req.query;
|
||||
|
||||
if (!group || !service) {
|
||||
logger.debug("Invalid or missing service '%s' or group '%s'", service, group);
|
||||
return res.status(400).json({ error: "Invalid proxy service type" });
|
||||
}
|
||||
|
||||
const widget = await getServiceWidget(group, service);
|
||||
|
||||
if (!widget) {
|
||||
logger.debug("Invalid or missing widget for service '%s' in group '%s'", service, group);
|
||||
return res.status(400).json({ error: "Invalid proxy service type" });
|
||||
}
|
||||
|
||||
if (!cache.get(sessionTokenCacheKey)) {
|
||||
await login(widget);
|
||||
}
|
||||
|
||||
const { data: statusData } = await apiCall(widget, "status/homebridge");
|
||||
const { data: versionData } = await apiCall(widget, "status/homebridge-version");
|
||||
const { data: childBridgeData } = await apiCall(widget, "status/homebridge/child-bridges");
|
||||
const { data: pluginsData } = await apiCall(widget, "plugins");
|
||||
|
||||
return res.status(200).send({
|
||||
status: statusData?.status,
|
||||
updateAvailable: versionData?.updateAvailable,
|
||||
plugins: {
|
||||
updatesAvailable: pluginsData?.filter(p => p.updateAvailable).length,
|
||||
},
|
||||
childBridges: {
|
||||
running: childBridgeData?.filter(cb => cb.status === "ok").length,
|
||||
total: childBridgeData?.length
|
||||
}
|
||||
});
|
||||
}
|
14
src/widgets/homebridge/widget.js
Normal file
14
src/widgets/homebridge/widget.js
Normal file
|
@ -0,0 +1,14 @@
|
|||
import homebridgeProxyHandler from "./proxy";
|
||||
|
||||
const widget = {
|
||||
api: "{url}/api/{endpoint}",
|
||||
proxyHandler: homebridgeProxyHandler,
|
||||
|
||||
mappings: {
|
||||
info: {
|
||||
endpoint: "/",
|
||||
}
|
||||
},
|
||||
};
|
||||
|
||||
export default widget;
|
|
@ -12,7 +12,7 @@ export default function Component({ service }) {
|
|||
const { data: indexersData, error: indexersError } = useWidgetAPI(widget, "indexers");
|
||||
|
||||
if (indexersError) {
|
||||
return <Container error={t("widget.api_error")} />;
|
||||
return <Container error={indexersError} />;
|
||||
}
|
||||
|
||||
if (!indexersData) {
|
||||
|
|
|
@ -1,18 +1,14 @@
|
|||
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: statsData, error: statsError } = useWidgetAPI(widget, "request/count");
|
||||
|
||||
if (statsError) {
|
||||
return <Container error={t("widget.api_error")} />;
|
||||
return <Container error={statsError} />;
|
||||
}
|
||||
|
||||
if (!statsData) {
|
||||
|
|
|
@ -7,6 +7,11 @@ const widget = {
|
|||
mappings: {
|
||||
"request/count": {
|
||||
endpoint: "request/count",
|
||||
validate: [
|
||||
"pending",
|
||||
"approved",
|
||||
"available"
|
||||
]
|
||||
},
|
||||
},
|
||||
};
|
||||
|
|
|
@ -14,7 +14,8 @@ export default function Component({ service }) {
|
|||
const { data: queueData, error: queueError } = useWidgetAPI(widget, "queue/status");
|
||||
|
||||
if (albumsError || wantedError || queueError) {
|
||||
return <Container error={t("widget.api_error")} />;
|
||||
const finalError = albumsError ?? wantedError ?? queueError;
|
||||
return <Container error={finalError} />;
|
||||
}
|
||||
|
||||
if (!albumsData || !wantedData || !queueData) {
|
||||
|
|
|
@ -12,7 +12,7 @@ export default function Component({ service }) {
|
|||
const { data: statsData, error: statsError } = useWidgetAPI(widget, "instance");
|
||||
|
||||
if (statsError) {
|
||||
return <Container error={t("widget.api_error")} />;
|
||||
return <Container error={statsError} />;
|
||||
}
|
||||
|
||||
if (!statsData) {
|
||||
|
|
56
src/widgets/navidrome/component.jsx
Normal file
56
src/widgets/navidrome/component.jsx
Normal file
|
@ -0,0 +1,56 @@
|
|||
import { useTranslation } from "next-i18next";
|
||||
|
||||
import Container from "components/services/widget/container";
|
||||
import useWidgetAPI from "utils/proxy/use-widget-api";
|
||||
|
||||
function SinglePlayingEntry({ entry }) {
|
||||
const { username, artist, title, album } = entry;
|
||||
let fullTitle = title;
|
||||
if (artist) fullTitle = `${artist} - ${title}`;
|
||||
if (album) fullTitle += ` — ${album}`;
|
||||
if (username) fullTitle += ` (${username})`;
|
||||
|
||||
return (
|
||||
<div className="text-theme-700 dark:text-theme-200 relative h-5 w-full rounded-md bg-theme-200/50 dark:bg-theme-900/20 mt-1 flex">
|
||||
<div className="text-xs z-10 self-center ml-2 relative w-full h-4 grow mr-2">
|
||||
<div className="absolute w-full whitespace-nowrap text-ellipsis overflow-hidden">{fullTitle}</div>
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
export default function Component({ service }) {
|
||||
const { t } = useTranslation();
|
||||
|
||||
const { widget } = service;
|
||||
|
||||
const { data: navidromeData, error: navidromeError } = useWidgetAPI(widget, "getNowPlaying");
|
||||
|
||||
if (navidromeError || navidromeData?.["subsonic-response"]?.error) {
|
||||
return <Container error={navidromeError ?? navidromeData?.["subsonic-response"]?.error} />;
|
||||
}
|
||||
|
||||
if (!navidromeData) {
|
||||
return (
|
||||
<SinglePlayingEntry entry={{ title: t("navidrome.please_wait") }} />
|
||||
);
|
||||
}
|
||||
|
||||
const { nowPlaying } = navidromeData["subsonic-response"];
|
||||
if (!nowPlaying.entry) {
|
||||
// nothing playing
|
||||
return (
|
||||
<SinglePlayingEntry entry={{ title: t("navidrome.nothing_streaming") }} />
|
||||
);
|
||||
}
|
||||
|
||||
const nowPlayingEntries = Object.values(nowPlaying.entry);
|
||||
|
||||
return (
|
||||
<div className="flex flex-col pb-1 mx-1">
|
||||
{nowPlayingEntries.map((entry) => (
|
||||
<SinglePlayingEntry key={entry.id} entry={entry} />
|
||||
))}
|
||||
</div>
|
||||
);
|
||||
}
|
14
src/widgets/navidrome/widget.js
Normal file
14
src/widgets/navidrome/widget.js
Normal file
|
@ -0,0 +1,14 @@
|
|||
import genericProxyHandler from "utils/proxy/handlers/generic";
|
||||
|
||||
const widget = {
|
||||
api: "{url}/rest/{endpoint}?u={user}&t={token}&s={salt}&v=1.16.1&c=homepage&f=json",
|
||||
proxyHandler: genericProxyHandler,
|
||||
|
||||
mappings: {
|
||||
"getNowPlaying": {
|
||||
endpoint: "getNowPlaying",
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
export default widget;
|
|
@ -1,18 +1,14 @@
|
|||
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: infoData, error: infoError } = useWidgetAPI(widget, "nginx/proxy-hosts");
|
||||
|
||||
if (infoError) {
|
||||
return <Container error={t("widget.api_error")} />;
|
||||
return <Container error={infoError} />;
|
||||
}
|
||||
|
||||
if (!infoData) {
|
||||
|
|
|
@ -1,6 +1,33 @@
|
|||
import cache from "memory-cache";
|
||||
|
||||
import getServiceWidget from "utils/config/service-helpers";
|
||||
import { formatApiCall } from "utils/proxy/api-helpers";
|
||||
import { httpProxy } from "utils/proxy/http";
|
||||
import widgets from "widgets/widgets";
|
||||
import createLogger from "utils/logger";
|
||||
|
||||
const proxyName = "npmProxyHandler";
|
||||
const tokenCacheKey = `${proxyName}__token`;
|
||||
const logger = createLogger(proxyName);
|
||||
|
||||
async function login(loginUrl, username, password) {
|
||||
const authResponse = await httpProxy(loginUrl, {
|
||||
method: "POST",
|
||||
body: JSON.stringify({ identity: username, secret: password }),
|
||||
headers: {
|
||||
"Content-Type": "application/json",
|
||||
},
|
||||
});
|
||||
|
||||
const status = authResponse[0];
|
||||
const data = JSON.parse(Buffer.from(authResponse[2]).toString());
|
||||
|
||||
if (status === 200) {
|
||||
cache.put(tokenCacheKey, data.token);
|
||||
}
|
||||
|
||||
return [status, data.token ?? data];
|
||||
}
|
||||
|
||||
export default async function npmProxyHandler(req, res) {
|
||||
const { group, service, endpoint } = req.query;
|
||||
|
@ -14,27 +41,54 @@ export default async function npmProxyHandler(req, res) {
|
|||
|
||||
if (widget) {
|
||||
const url = new URL(formatApiCall(widgets[widget.type].api, { endpoint, ...widget }));
|
||||
|
||||
const loginUrl = `${widget.url}/api/tokens`;
|
||||
const body = { identity: widget.username, secret: widget.password };
|
||||
|
||||
const authResponse = await fetch(loginUrl, {
|
||||
method: "POST",
|
||||
body: JSON.stringify(body),
|
||||
headers: {
|
||||
"Content-Type": "application/json",
|
||||
},
|
||||
}).then((response) => response.json());
|
||||
let status;
|
||||
let contentType;
|
||||
let data;
|
||||
|
||||
let token = cache.get(tokenCacheKey);
|
||||
if (!token) {
|
||||
[status, token] = await login(loginUrl, widget.username, widget.password);
|
||||
if (status !== 200) {
|
||||
logger.debug(`HTTTP ${status} logging into npm api: ${data}`);
|
||||
return res.status(status).send(data);
|
||||
}
|
||||
}
|
||||
|
||||
const apiResponse = await fetch(url, {
|
||||
[status, contentType, data] = await httpProxy(url, {
|
||||
method: "GET",
|
||||
headers: {
|
||||
"Content-Type": "application/json",
|
||||
Authorization: `Bearer ${authResponse.token}`,
|
||||
Authorization: `Bearer ${token}`,
|
||||
},
|
||||
}).then((response) => response.json());
|
||||
});
|
||||
|
||||
return res.send(apiResponse);
|
||||
if (status === 403) {
|
||||
logger.debug(`HTTTP ${status} retrieving data from npm api, logging in and trying again.`);
|
||||
cache.del(tokenCacheKey);
|
||||
[status, token] = await login(loginUrl, widget.username, widget.password);
|
||||
|
||||
if (status !== 200) {
|
||||
logger.debug(`HTTTP ${status} logging into npm api: ${data}`);
|
||||
return res.status(status).send(data);
|
||||
}
|
||||
|
||||
// eslint-disable-next-line no-unused-vars
|
||||
[status, contentType, data] = await httpProxy(url, {
|
||||
method: "GET",
|
||||
headers: {
|
||||
"Content-Type": "application/json",
|
||||
Authorization: `Bearer ${token}`,
|
||||
},
|
||||
});
|
||||
}
|
||||
|
||||
if (status !== 200) {
|
||||
return res.status(status).send(data);
|
||||
}
|
||||
|
||||
return res.send(data);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -12,7 +12,7 @@ export default function Component({ service }) {
|
|||
const { data: statusData, error: statusError } = useWidgetAPI(widget, "status");
|
||||
|
||||
if (statusError) {
|
||||
return <Container error={t("widget.api_error")} />;
|
||||
return <Container error={statusError} />;
|
||||
}
|
||||
|
||||
if (!statusData) {
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Reference in a new issue