diff --git a/.dockerignore b/.dockerignore
index 47e82a105..00ee58159 100644
--- a/.dockerignore
+++ b/.dockerignore
@@ -33,7 +33,7 @@ tsconfig.json
 /ecosystem.config.js
 /extra/healthcheck.exe
 /extra/healthcheck
-
+extra/exe-builder
 
 ### .gitignore content (commented rules are duplicated)
 
@@ -48,6 +48,4 @@ dist-ssr
 #!/data/.gitkeep
 #.vscode
 
-
-
 ### End of .gitignore content
diff --git a/.github/ISSUE_TEMPLATE/security.md b/.github/ISSUE_TEMPLATE/security.md
new file mode 100644
index 000000000..26450ed3a
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/security.md
@@ -0,0 +1,19 @@
+---
+
+name: "Security Issue"
+about: "Just for alerting @louislam, do not provide any details here"
+title: "Security Issue"
+ref: "main"
+labels:
+
+- security
+
+---
+
+DO NOT PROVIDE ANY DETAILS HERE. Please privately report to https://github.com/louislam/uptime-kuma/security/advisories/new.
+
+
+Why need this issue? It is because GitHub Advisory do not send a notification to @louislam, it is a workaround to do so.
+
+Your GitHub Advisory URL:
+
diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md
index 4d2105d49..87e7f5ff7 100644
--- a/.github/PULL_REQUEST_TEMPLATE.md
+++ b/.github/PULL_REQUEST_TEMPLATE.md
@@ -16,7 +16,6 @@ Please delete any options that are not relevant.
 - User interface (UI)
 - New feature (non-breaking change which adds functionality)
 - Breaking change (fix or feature that would cause existing functionality to not work as expected)
-- Translation update
 - Other
 - This change requires a documentation update
 
diff --git a/.github/workflows/auto-test.yml b/.github/workflows/auto-test.yml
index b49a253c3..944627127 100644
--- a/.github/workflows/auto-test.yml
+++ b/.github/workflows/auto-test.yml
@@ -6,8 +6,12 @@ name: Auto Test
 on:
   push:
     branches: [ master ]
+    paths-ignore:
+      - '*.md'
   pull_request:
     branches: [ master ]
+    paths-ignore:
+      - '*.md'
 
 jobs:
   auto-test:
@@ -18,7 +22,7 @@ jobs:
     strategy:
       matrix:
         os: [macos-latest, ubuntu-latest, windows-latest]
-        node: [ 14, 16, 17, 18 ]
+        node: [ 14, 16, 18, 19 ]
         # See supported Node.js release schedule at https://nodejs.org/en/about/releases/
 
     steps:
@@ -36,6 +40,7 @@ jobs:
       env:
         HEADLESS_TEST: 1
         JUST_FOR_TEST: ${{ secrets.JUST_FOR_TEST }}
+
   check-linters:
     runs-on: ubuntu-latest
 
@@ -66,3 +71,19 @@ jobs:
     - run: npm install
     - run: npm run build
     - run: npm run cy:test
+
+  frontend-unit-tests:
+    needs: [ check-linters ]
+    runs-on: ubuntu-latest
+    steps:
+    - run: git config --global core.autocrlf false  # Mainly for Windows
+    - uses: actions/checkout@v3
+
+    - name: Use Node.js 14
+      uses: actions/setup-node@v3
+      with:
+        node-version: 14
+        cache: 'npm'
+    - run: npm install
+    - run: npm run build
+    - run: npm run cy:run:unit
diff --git a/.github/workflows/close-incorrect-issue.yml b/.github/workflows/close-incorrect-issue.yml
index 026022dfa..762bc9688 100644
--- a/.github/workflows/close-incorrect-issue.yml
+++ b/.github/workflows/close-incorrect-issue.yml
@@ -1,4 +1,3 @@
-
 name: Close Incorrect Issue
 
 on:
@@ -12,13 +11,13 @@ jobs:
     strategy:
       matrix:
         os: [ubuntu-latest]
-        node-version: [16.x]
+        node-version: [16]
 
     steps:
-    - uses: actions/checkout@v2
+    - uses: actions/checkout@v3
 
     - name: Use Node.js ${{ matrix.node-version }}
-      uses: actions/setup-node@v2
+      uses: actions/setup-node@v3
       with:
         node-version: ${{ matrix.node-version }}
         cache: 'npm'
diff --git a/.github/workflows/stale-bot.yml b/.github/workflows/stale-bot.yml
index 5b4568e1d..b39f68fc1 100644
--- a/.github/workflows/stale-bot.yml
+++ b/.github/workflows/stale-bot.yml
@@ -3,13 +3,13 @@ on:
   workflow_dispatch:
   schedule:
     - cron: '0 */6 * * *'
-#Run every 6 hours 
+#Run every 6 hours
 
 jobs:
   stale:
     runs-on: ubuntu-latest
     steps:
-      - uses: actions/stale@v5
+      - uses: actions/stale@v7
         with:
           stale-issue-message: 'We are clearing up our old issues and your ticket has been open for 3 months with no activity. Remove stale label or comment or this will be closed in 2 days.'
           close-issue-message: 'This issue was closed because it has been stalled for 2 days with no activity.'
diff --git a/.gitignore b/.gitignore
index 06dca04b4..9ed1e282b 100644
--- a/.gitignore
+++ b/.gitignore
@@ -20,3 +20,6 @@ cypress/screenshots
 /extra/healthcheck.exe
 /extra/healthcheck
 /extra/healthcheck-armv7
+
+extra/exe-builder/bin
+extra/exe-builder/obj
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index 12fd6ed41..4c6a5587b 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -1,6 +1,6 @@
 # Project Info
 
-First of all, thank you everyone who made pull requests for Uptime Kuma, I never thought GitHub Community can be that nice! And also because of this, I also never thought other people actually read my code and edit my code. It is not structured and commented so well, lol. Sorry about that.
+First of all, I want to thank everyone who made pull requests for Uptime Kuma. I never thought the GitHub Community would be so nice! Because of this, I also never thought that other people would actually read and edit my code. It is not very well structured or commented, sorry about that.
 
 The project was created with vite.js (vue3). Then I created a subdirectory called "server" for server part. Both frontend and backend share the same package.json.
 
@@ -17,8 +17,11 @@ The frontend code build into "dist" directory. The server (express.js) exposes t
 
 ## Directories
 
+- config (dev config files)
 - data (App data)
+- db (Base database and migration scripts)
 - dist (Frontend build)
+- docker (Dockerfiles)
 - extra (Extra useful scripts)
 - public (Frontend resources for dev only)
 - server (Server source code)
@@ -27,20 +30,23 @@ The frontend code build into "dist" directory. The server (express.js) exposes t
 
 ## Can I create a pull request for Uptime Kuma?
 
-Yes or no, it depends on what you will try to do. Since I don't want to waste your time, be sure to **create an empty draft pull request or open an issue, so we can discuss first**. Especially for a large pull request or you don't know it will be merged or not.
+Yes or no, it depends on what you will try to do. Since I don't want to waste your time, be sure to **create an empty draft pull request or open an issue, so we can have a discussion first**. Especially for a large pull request or you don't know it will be merged or not.
 
 Here are some references:
 
 ✅ Usually Accept:
-- Bug/Security fix
-- Translations
+- Bug fix
+- Security fix
 - Adding notification providers
+- Adding new language files (You should go to https://weblate.kuma.pet for existing languages)
+- Adding new language keys: `$t("...")`
 
 ⚠️ Discussion First
 - Large pull requests
 - New features
 
 ❌ Won't Merge
+- A dedicated pr for translating existing languages (You can now translate on https://weblate.kuma.pet) 
 - Do not pass auto test
 - Any breaking changes
 - Duplicated pull request
@@ -48,8 +54,13 @@ Here are some references:
 - UI/UX is not close to Uptime Kuma 
 - Existing logic is completely modified or deleted for no reason
 - A function that is completely out of scope
+- Convert existing code into other programming languages
 - Unnecessary large code changes (Hard to review, causes code conflicts to other pull requests)
 
+The above cases cannot cover all situations.
+
+I (@louislam) have the final say. If your pull request does not meet my expectations, I will reject it, no matter how much time you spend on it. Therefore, it is essential to have a discussion beforehand.
+
 I will mark your pull request in the [milestones](https://github.com/louislam/uptime-kuma/milestones), if I am plan to review and merge it.
 
 Also, please don't rush or ask for ETA, because I have to understand the pull request, make sure it is no breaking changes and stick to my vision of this project, especially for large pull requests.
@@ -72,13 +83,13 @@ Before deep into coding, discussion first is preferred. Creating an empty pull r
 
 ## Project Styles
 
-I personally do not like something need to learn so much and need to config so much before you can finally start the app.
+I personally do not like something that requires so many configurations before you can finally start the app. I hope Uptime Kuma installation could be as easy as like installing a mobile app.
 
-- Easy to install for non-Docker users, no native build dependency is needed (at least for x86_64), no extra config, no extra effort to get it run
+- Easy to install for non-Docker users, no native build dependency is needed (for x86_64/armv7/arm64), no extra config, no extra effort required to get it running
 - Single container for Docker users, no very complex docker-compose file. Just map the volume and expose the port, then good to go
-- Settings should be configurable in the frontend. Environment variable is not encouraged, unless it is related to startup such as `DATA_DIR`.
+- Settings should be configurable in the frontend. Environment variable is not encouraged, unless it is related to startup such as `DATA_DIR`
 - Easy to use
-- The web UI styling should be consistent and nice.
+- The web UI styling should be consistent and nice
 
 ## Coding Styles
 
@@ -87,7 +98,7 @@ I personally do not like something need to learn so much and need to config so m
 - Follow ESLint
 - Methods and functions should be documented with JSDoc
 
-## Name convention
+## Name Conventions
 
 - Javascript/Typescript: camelCaseType
 - SQLite: snake_case (Underscore)
@@ -101,7 +112,7 @@ I personally do not like something need to learn so much and need to config so m
 - IDE that supports ESLint and EditorConfig (I am using IntelliJ IDEA)
 - A SQLite GUI tool (SQLite Expert Personal is suggested)
 
-## Install dependencies
+## Install Dependencies for Development
 
 ```bash
 npm ci
@@ -119,6 +130,12 @@ Port `3000` and port `3001` will be used.
 npm run dev
 ```
 
+But sometimes, you would like to keep restart the server, but not the frontend, you can run these command in two terminals:
+```
+npm run start-frontend-dev
+npm run start-server-dev
+```
+
 ## Backend Server
 
 It binds to `0.0.0.0:3001` by default.
@@ -134,12 +151,15 @@ express.js is used for:
 
 ### Structure in /server/
 
+- jobs/ (Jobs that are running in another process)
 - model/ (Object model, auto mapping to the database table name)
 - modules/ (Modified 3rd-party modules)
+- monitor_types (Monitor Types)
 - notification-providers/ (individual notification logic)
 - routers/ (Express Routers)
 - socket-handler (Socket.io Handlers)
-- server.js (Server entry point and main logic)
+- server.js (Server entry point)
+- uptime-kuma-server.js (UptimeKumaServer class, main logic should be here, but some still in `server.js`)
 
 ## Frontend Dev Server
 
@@ -172,15 +192,11 @@ The data and socket logic are in `src/mixins/socket.js`.
 
 ## Unit Test
 
-It is an end-to-end testing. It is using Jest and Puppeteer.
-
 ```bash
 npm run build
 npm test
 ```
 
-By default, the Chromium window will be shown up during the test. Specifying `HEADLESS_TEST=1` for terminal environments.
-
 ## Dependencies
 
 Both frontend and backend share the same package.json. However, the frontend dependencies are eventually not used in the production environment, because it is usually also baked into dist files. So:
@@ -194,18 +210,12 @@ Both frontend and backend share the same package.json. However, the frontend dep
 
 ### Update Dependencies
 
-Install `ncu`
-https://github.com/raineorshine/npm-check-updates
-
-```bash
-ncu -u -t patch
-npm install
-```
-
 Since previously updating Vite 2.5.10 to 2.6.0 broke the application completely, from now on, it should update patch release version only.
 
 Patch release = the third digit ([Semantic Versioning](https://semver.org/))
 
+If for maybe security reasons, a library must be updated. Then you must need to check if there are any breaking changes.
+
 ## Translations
 
 Please read: https://github.com/louislam/uptime-kuma/tree/master/src/languages
@@ -225,12 +235,13 @@ https://github.com/louislam/uptime-kuma/issues?q=sort%3Aupdated-desc
 
 1. Draft a release note
 2. Make sure the repo is cleared
+3. If the healthcheck is updated, remember to re-compile it: `npm run build-docker-builder-go`
 3. `npm run release-final with env vars: `VERSION` and `GITHUB_TOKEN`
 4. Wait until the `Press any key to continue`
 5. `git push`
 6. Publish the release note as 1.X.X 
 7. Press any key to continue
-8. SSH to demo site server and update to 1.X.X
+8. Deploy to the demo server: `npm run deploy-demo-server`
 
 Checking:
 
diff --git a/README.md b/README.md
index 55a6ec504..a67007ce6 100644
--- a/README.md
+++ b/README.md
@@ -1,38 +1,39 @@
 # Uptime Kuma
 
 <a target="_blank" href="https://github.com/louislam/uptime-kuma"><img src="https://img.shields.io/github/stars/louislam/uptime-kuma" /></a> <a target="_blank" href="https://hub.docker.com/r/louislam/uptime-kuma"><img src="https://img.shields.io/docker/pulls/louislam/uptime-kuma" /></a> <a target="_blank" href="https://hub.docker.com/r/louislam/uptime-kuma"><img src="https://img.shields.io/docker/v/louislam/uptime-kuma/latest?label=docker%20image%20ver." /></a> <a target="_blank" href="https://github.com/louislam/uptime-kuma"><img src="https://img.shields.io/github/last-commit/louislam/uptime-kuma" /></a>  <a target="_blank" href="https://opencollective.com/uptime-kuma"><img src="https://opencollective.com/uptime-kuma/total/badge.svg?label=Open%20Collective%20Backers&color=brightgreen" /></a>
-[![GitHub Sponsors](https://img.shields.io/github/sponsors/louislam?label=GitHub%20Sponsors)](https://github.com/sponsors/louislam)
+[![GitHub Sponsors](https://img.shields.io/github/sponsors/louislam?label=GitHub%20Sponsors)](https://github.com/sponsors/louislam) <a href="https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/">
+<img src="https://weblate.kuma.pet/widgets/uptime-kuma/-/svg-badge.svg" alt="Translation status" />
+</a>
 
 <div align="center" width="100%">
     <img src="./public/icon.svg" width="128" alt="" />
 </div>
 
-It is a self-hosted monitoring tool like "Uptime Robot".
+Uptime Kuma is an easy-to-use self-hosted monitoring tool.
 
-<img src="https://uptime.kuma.pet/img/dark.jpg" width="700" alt="" />
+<img src="https://user-images.githubusercontent.com/1336778/212262296-e6205815-ad62-488c-83ec-a5b0d0689f7c.jpg" width="700" alt="" />
 
 ## 🥔 Live Demo
 
 Try it!
 
 - Tokyo Demo Server: https://demo.uptime.kuma.pet (Sponsored by [Uptime Kuma Sponsors](https://github.com/louislam/uptime-kuma#%EF%B8%8F-sponsors))
-- Europe Demo Server: https://demo.uptime-kuma.karimi.dev:27000 (Provided by [@mhkarimi1383](https://github.com/mhkarimi1383))
 
 It is a temporary live demo, all data will be deleted after 10 minutes. Use the one that is closer to you, but I suggest that you should install and try it out for the best demo experience.
 
 ## ⭐ Features
 
-* Monitoring uptime for HTTP(s) / TCP / HTTP(s) Keyword / Ping / DNS Record / Push / Steam Game Server / Docker Containers.
-* Fancy, Reactive, Fast UI/UX.
-* Notifications via Telegram, Discord, Gotify, Slack, Pushover, Email (SMTP), and [90+ notification services, click here for the full list](https://github.com/louislam/uptime-kuma/tree/master/src/components/notifications).
-* 20 second intervals.
-* [Multi Languages](https://github.com/louislam/uptime-kuma/tree/master/src/languages)
-* Multiple Status Pages
-* Map Status Page to Domain
-* Ping Chart
-* Certificate Info
-* Proxy Support
-* 2FA available
+* Monitoring uptime for HTTP(s) / TCP / HTTP(s) Keyword / Ping / DNS Record / Push / Steam Game Server / Docker Containers
+* Fancy, Reactive, Fast UI/UX
+* Notifications via Telegram, Discord, Gotify, Slack, Pushover, Email (SMTP), and [90+ notification services, click here for the full list](https://github.com/louislam/uptime-kuma/tree/master/src/components/notifications)
+* 20 second intervals
+* [Multi Languages](https://github.com/louislam/uptime-kuma/tree/master/src/lang)
+* Multiple status pages
+* Map status pages to specific domains
+* Ping chart
+* Certificate info
+* Proxy support
+* 2FA support
 
 ## 🔧 How to Install
 
@@ -44,14 +45,15 @@ docker run -d --restart=always -p 3001:3001 -v uptime-kuma:/app/data --name upti
 
 ⚠️ Please use a **local volume** only. Other types such as NFS are not supported.
 
-Browse to http://localhost:3001 after starting.
+Uptime Kuma is now running on http://localhost:3001
 
 ### 💪🏻 Non-Docker
 
 Required Tools: 
 - [Node.js](https://nodejs.org/en/download/) >= 14
+- [npm](https://docs.npmjs.com/cli/) >= 7
 - [Git](https://git-scm.com/downloads) 
-- [pm2](https://pm2.keymetrics.io/) - For run in background
+- [pm2](https://pm2.keymetrics.io/) - For running Uptime Kuma in the background
 
 ```bash
 # Update your npm to the latest version
@@ -73,7 +75,7 @@ pm2 start server/server.js --name uptime-kuma
 
 
 ```
-Browse to http://localhost:3001 after starting.
+Uptime Kuma is now running on http://localhost:3001
 
 More useful PM2 Commands
 
@@ -171,7 +173,7 @@ Check out the latest beta release here: https://github.com/louislam/uptime-kuma/
 If you want to report a bug or request a new feature, feel free to open a [new issue](https://github.com/louislam/uptime-kuma/issues).
 
 ### Translations
-If you want to translate Uptime Kuma into your language, please read: https://github.com/louislam/uptime-kuma/tree/master/src/languages
+If you want to translate Uptime Kuma into your language, please visit [Weblate Readme](https://github.com/louislam/uptime-kuma/blob/master/src/lang/README.md).
 
 Feel free to correct my grammar in this README, source code, or wiki, as my mother language is not English and my grammar is not that great.
 
diff --git a/SECURITY.md b/SECURITY.md
index d5941a97d..43dc7654b 100644
--- a/SECURITY.md
+++ b/SECURITY.md
@@ -2,9 +2,14 @@
 
 ## Reporting a Vulnerability
 
-Please report security issues to uptime@kuma.pet.
+1. Please report security issues to https://github.com/louislam/uptime-kuma/security/advisories/new.
+1. Please also create a empty security issues for alerting me, as GitHub Advisory do not send a notification, I probably will miss without this. https://github.com/louislam/uptime-kuma/issues/new?assignees=&labels=help&template=security.md
 
-Do not use the issue tracker or discuss it in the public as it will cause more damage.
+Do not use the public issue tracker or discuss it in the public as it will cause more damage.
+
+## Do you accept other 3rd-party bug bounty platforms?
+
+At this moment, I DO NOT accept other bug bounty platforms, because I am not familiar with these platforms and someone have tried to send a phishing link to me by this already. To minimize my own risk, please report through GitHub Advisories only. I will ignore all 3rd-party bug bounty platforms emails.
 
 ## Supported Versions
 
diff --git a/config/cypress.frontend.config.js b/config/cypress.frontend.config.js
new file mode 100644
index 000000000..eecdcb8dd
--- /dev/null
+++ b/config/cypress.frontend.config.js
@@ -0,0 +1,10 @@
+const { defineConfig } = require("cypress");
+
+module.exports = defineConfig({
+    e2e: {
+        supportFile: false,
+        specPattern: [
+            "test/cypress/unit/**/*.js"
+        ],
+    }
+});
diff --git a/db/patch-add-gamedig-monitor.sql b/db/patch-add-gamedig-monitor.sql
new file mode 100644
index 000000000..061bed302
--- /dev/null
+++ b/db/patch-add-gamedig-monitor.sql
@@ -0,0 +1,5 @@
+BEGIN TRANSACTION;
+
+ ALTER TABLE monitor
+     ADD game VARCHAR(255);
+ COMMIT
diff --git a/db/patch-add-google-analytics-status-page-tag.sql b/db/patch-add-google-analytics-status-page-tag.sql
new file mode 100644
index 000000000..5de6ff37b
--- /dev/null
+++ b/db/patch-add-google-analytics-status-page-tag.sql
@@ -0,0 +1,4 @@
+-- You should not modify if this have pushed to Github, unless it does serious wrong with the db.
+BEGIN TRANSACTION;
+ALTER TABLE status_page ADD google_analytics_tag_id VARCHAR;
+COMMIT;
diff --git a/db/patch-http-body-encoding.sql b/db/patch-http-body-encoding.sql
new file mode 100644
index 000000000..322c8b893
--- /dev/null
+++ b/db/patch-http-body-encoding.sql
@@ -0,0 +1,12 @@
+-- You should not modify if this have pushed to Github, unless it does serious wrong with the db.
+BEGIN TRANSACTION;
+
+ALTER TABLE monitor ADD http_body_encoding VARCHAR(25);
+
+COMMIT;
+
+BEGIN TRANSACTION;
+
+UPDATE monitor SET http_body_encoding = 'json' WHERE (type = 'http' or type = 'keyword') AND http_body_encoding IS NULL;
+
+COMMIT;
diff --git a/db/patch-ping-packet-size.sql b/db/patch-ping-packet-size.sql
new file mode 100644
index 000000000..d65ec8ed8
--- /dev/null
+++ b/db/patch-ping-packet-size.sql
@@ -0,0 +1,5 @@
+-- You should not modify if this have pushed to Github, unless it does serious wrong with the db.
+BEGIN TRANSACTION;
+ALTER TABLE monitor
+    ADD packet_size INTEGER DEFAULT 56 NOT NULL;
+COMMIT;
diff --git a/docker/alpine-base.dockerfile b/docker/alpine-base.dockerfile
index 1b8034f44..276d6e450 100644
--- a/docker/alpine-base.dockerfile
+++ b/docker/alpine-base.dockerfile
@@ -3,6 +3,6 @@ FROM node:16-alpine3.12
 WORKDIR /app
 
 # Install apprise, iputils for non-root ping, setpriv
-RUN apk add --no-cache iputils setpriv dumb-init python3 py3-cryptography py3-pip py3-six py3-yaml py3-click py3-markdown py3-requests py3-requests-oauthlib && \
-    pip3 --no-cache-dir install apprise==1.2.0 && \
+RUN apk add --no-cache iputils setpriv dumb-init python3 py3-cryptography py3-pip py3-six py3-yaml py3-click py3-markdown py3-requests py3-requests-oauthlib git && \
+    pip3 --no-cache-dir install apprise==1.2.1 && \
     rm -rf /root/.cache
diff --git a/docker/builder-go.dockerfile b/docker/builder-go.dockerfile
new file mode 100644
index 000000000..1d25843bc
--- /dev/null
+++ b/docker/builder-go.dockerfile
@@ -0,0 +1,16 @@
+############################################
+# Build in Golang
+# Run npm run build-healthcheck-armv7 in the host first, another it will be super slow where it is building the armv7 healthcheck
+############################################
+FROM golang:1.19-buster
+WORKDIR /app
+ARG TARGETPLATFORM
+COPY ./extra/ ./extra/
+
+# Compile healthcheck.go
+RUN apt update && \
+    apt --yes --no-install-recommends install curl && \
+    curl -sL https://deb.nodesource.com/setup_18.x | bash && \
+    apt --yes --no-install-recommends install nodejs && \
+    node ./extra/build-healthcheck.js $TARGETPLATFORM && \
+    apt --yes remove nodejs
diff --git a/docker/debian-base.dockerfile b/docker/debian-base.dockerfile
index 5ca4a7ed8..026189c47 100644
--- a/docker/debian-base.dockerfile
+++ b/docker/debian-base.dockerfile
@@ -10,8 +10,8 @@ WORKDIR /app
 # Stupid python3 and python3-pip actually install a lot of useless things into Debian, specify --no-install-recommends to skip them, make the base even smaller than alpine!
 RUN apt update && \
     apt --yes --no-install-recommends install python3 python3-pip python3-cryptography python3-six python3-yaml python3-click python3-markdown python3-requests python3-requests-oauthlib \
-        sqlite3 iputils-ping util-linux dumb-init && \
-    pip3 --no-cache-dir install apprise==1.2.0 && \
+        sqlite3 iputils-ping util-linux dumb-init git && \
+    pip3 --no-cache-dir install apprise==1.2.1 && \
     rm -rf /var/lib/apt/lists/* && \
     apt --yes autoremove
 
diff --git a/docker/dockerfile b/docker/dockerfile
index e084d649f..1799044af 100644
--- a/docker/dockerfile
+++ b/docker/dockerfile
@@ -1,19 +1,9 @@
 ############################################
 # Build in Golang
 # Run npm run build-healthcheck-armv7 in the host first, another it will be super slow where it is building the armv7 healthcheck
+# Check file: builder-go.dockerfile
 ############################################
-FROM golang:1.19.4-buster AS build_healthcheck
-WORKDIR /app
-ARG TARGETPLATFORM
-COPY ./extra/ ./extra/
-
-# Compile healthcheck.go
-RUN apt update
-RUN apt --yes --no-install-recommends install curl
-RUN curl -sL https://deb.nodesource.com/setup_18.x | bash
-RUN apt --yes --no-install-recommends install nodejs
-RUN node -v
-RUN node ./extra/build-healthcheck.js $TARGETPLATFORM
+FROM louislam/uptime-kuma:builder-go AS build_healthcheck
 
 ############################################
 # Build in Node.js
@@ -22,10 +12,13 @@ FROM louislam/uptime-kuma:base-debian AS build
 WORKDIR /app
 
 ENV PUPPETEER_SKIP_CHROMIUM_DOWNLOAD=1
+COPY .npmrc .npmrc
+COPY package.json package.json
+COPY package-lock.json package-lock.json
+RUN npm ci --omit=dev
 COPY . .
 COPY --from=build_healthcheck /app/extra/healthcheck /app/extra/healthcheck
-RUN npm ci --production && \
-    chmod +x /app/extra/entrypoint.sh
+RUN chmod +x /app/extra/entrypoint.sh
 
 ############################################
 # ⭐ Main Image
@@ -78,7 +71,7 @@ RUN npm ci
 
 EXPOSE 3000 3001
 VOLUME ["/app/data"]
-HEALTHCHECK --interval=60s --timeout=30s --start-period=180s --retries=5 CMD node extra/healthcheck.js
+HEALTHCHECK --interval=60s --timeout=30s --start-period=180s --retries=5 CMD extra/healthcheck
 CMD ["npm", "run", "start-pr-test"]
 
 ############################################
diff --git a/docker/dockerfile-alpine b/docker/dockerfile-alpine
index ab9255f95..43f26b8bb 100644
--- a/docker/dockerfile-alpine
+++ b/docker/dockerfile-alpine
@@ -3,10 +3,12 @@ WORKDIR /app
 
 ENV PUPPETEER_SKIP_CHROMIUM_DOWNLOAD=1
 
+COPY .npmrc .npmrc
+COPY package.json package.json
+COPY package-lock.json package-lock.json
+RUN npm ci --omit=dev
 COPY . .
-RUN npm ci --production && \
-    chmod +x /app/extra/entrypoint.sh
-
+RUN chmod +x /app/extra/entrypoint.sh
 
 FROM louislam/uptime-kuma:base-alpine AS release
 WORKDIR /app
diff --git a/extra/beta/update-version.js b/extra/beta/update-version.js
index df2cb40a6..3dafbe8d4 100644
--- a/extra/beta/update-version.js
+++ b/extra/beta/update-version.js
@@ -22,7 +22,8 @@ if (! exists) {
     fs.writeFileSync("package.json", JSON.stringify(pkg, null, 4) + "\n");
 
     // Also update package-lock.json
-    childProcess.spawnSync("npm", [ "install" ]);
+    const npm = /^win/.test(process.platform) ? "npm.cmd" : "npm";
+    childProcess.spawnSync(npm, [ "install" ]);
 
     commit(version);
     tag(version);
@@ -32,6 +33,10 @@ if (! exists) {
     process.exit(1);
 }
 
+/**
+ * Commit updated files
+ * @param {string} version Version to update to
+ */
 function commit(version) {
     let msg = "Update to " + version;
 
@@ -47,6 +52,10 @@ function commit(version) {
     console.log(res.stdout.toString().trim());
 }
 
+/**
+ * Create a tag with the specified version
+ * @param {string} version Tag to create
+ */
 function tag(version) {
     let res = childProcess.spawnSync("git", [ "tag", version ]);
     console.log(res.stdout.toString().trim());
@@ -55,6 +64,11 @@ function tag(version) {
     console.log(res.stdout.toString().trim());
 }
 
+/**
+ * Check if a tag exists for the specified version
+ * @param {string} version Version to check
+ * @returns {boolean} Does the tag already exist
+ */
 function tagExists(version) {
     if (! version) {
         throw new Error("invalid version");
diff --git a/extra/deploy-demo-server.js b/extra/deploy-demo-server.js
new file mode 100644
index 000000000..d5a517f90
--- /dev/null
+++ b/extra/deploy-demo-server.js
@@ -0,0 +1,59 @@
+require("dotenv").config();
+const { NodeSSH } = require("node-ssh");
+const readline = require("readline");
+const rl = readline.createInterface({ input: process.stdin,
+    output: process.stdout });
+const prompt = (query) => new Promise((resolve) => rl.question(query, resolve));
+
+(async () => {
+    try {
+        console.log("SSH to demo server");
+        const ssh = new NodeSSH();
+        await ssh.connect({
+            host: process.env.UPTIME_KUMA_DEMO_HOST,
+            port: process.env.UPTIME_KUMA_DEMO_PORT,
+            username: process.env.UPTIME_KUMA_DEMO_USERNAME,
+            privateKeyPath: process.env.UPTIME_KUMA_DEMO_PRIVATE_KEY_PATH
+        });
+
+        let cwd = process.env.UPTIME_KUMA_DEMO_CWD;
+        let result;
+
+        const version = await prompt("Enter Version: ");
+
+        result = await ssh.execCommand("git fetch --all", {
+            cwd,
+        });
+        console.log(result.stdout + result.stderr);
+
+        await prompt("Press any key to continue...");
+
+        result = await ssh.execCommand(`git checkout ${version} --force`, {
+            cwd,
+        });
+        console.log(result.stdout + result.stderr);
+
+        result = await ssh.execCommand("npm run download-dist", {
+            cwd,
+        });
+        console.log(result.stdout + result.stderr);
+
+        result = await ssh.execCommand("npm install --production", {
+            cwd,
+        });
+        console.log(result.stdout + result.stderr);
+
+        result = await ssh.execCommand("pm2 restart 1", {
+            cwd,
+        });
+        console.log(result.stdout + result.stderr);
+
+    } catch (e) {
+        console.log(e);
+    } finally {
+        rl.close();
+    }
+})();
+
+// When done reading prompt, exit program
+rl.on("close", () => process.exit(0));
diff --git a/extra/download-cloudflared.js b/extra/download-cloudflared.js
index 41519b7ca..74b9bad2a 100644
--- a/extra/download-cloudflared.js
+++ b/extra/download-cloudflared.js
@@ -25,6 +25,10 @@ if (platform === "linux/amd64") {
 const file = fs.createWriteStream("cloudflared.deb");
 get("https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-" + arch + ".deb");
 
+/**
+ * Download specified file
+ * @param {string} url URL to request
+ */
 function get(url) {
     http.get(url, function (res) {
         if (res.statusCode >= 300 && res.statusCode < 400 && res.headers.location) {
diff --git a/extra/download-dist.js b/extra/download-dist.js
index b04beec7a..a854ca8b2 100644
--- a/extra/download-dist.js
+++ b/extra/download-dist.js
@@ -47,6 +47,7 @@ function download(url) {
                     });
                 }
                 console.log("Done");
+                process.exit(0);
             });
 
             tarStream.on("error", () => {
diff --git a/extra/exe-builder/.gitignore b/extra/exe-builder/.gitignore
new file mode 100644
index 000000000..d52874b6c
--- /dev/null
+++ b/extra/exe-builder/.gitignore
@@ -0,0 +1 @@
+packages/
diff --git a/extra/exe-builder/App.config b/extra/exe-builder/App.config
new file mode 100644
index 000000000..97eb34aff
--- /dev/null
+++ b/extra/exe-builder/App.config
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="utf-8"?>
+<configuration>
+    <startup>
+        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7.2" />
+    </startup>
+
+  <runtime>
+    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
+      <dependentAssembly>
+        <assemblyIdentity name="System.Diagnostics.DiagnosticSource" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
+        <bindingRedirect oldVersion="0.0.0.0-4.0.1.0" newVersion="4.0.1.0" />
+      </dependentAssembly>
+      <dependentAssembly>
+        <assemblyIdentity name="System.Diagnostics.Tracing" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+        <bindingRedirect oldVersion="0.0.0.0-4.1.1.0" newVersion="4.1.1.0" />
+      </dependentAssembly>
+      <dependentAssembly>
+        <assemblyIdentity name="System.Reflection" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+        <bindingRedirect oldVersion="0.0.0.0-4.1.1.0" newVersion="4.1.1.0" />
+      </dependentAssembly>
+      <dependentAssembly>
+        <assemblyIdentity name="System.Runtime" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+        <bindingRedirect oldVersion="0.0.0.0-4.1.1.1" newVersion="4.1.1.1" />
+      </dependentAssembly>
+      <dependentAssembly>
+        <assemblyIdentity name="System.Runtime.InteropServices" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+        <bindingRedirect oldVersion="0.0.0.0-4.1.1.0" newVersion="4.1.1.0" />
+      </dependentAssembly>
+      <dependentAssembly>
+        <assemblyIdentity name="System.Runtime.CompilerServices.Unsafe" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+        <bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" />
+      </dependentAssembly>
+    </assemblyBinding>
+  </runtime>
+</configuration>
diff --git a/extra/exe-builder/DownloadForm.Designer.cs b/extra/exe-builder/DownloadForm.Designer.cs
new file mode 100644
index 000000000..26a474e9c
--- /dev/null
+++ b/extra/exe-builder/DownloadForm.Designer.cs
@@ -0,0 +1,84 @@
+using System.ComponentModel;
+
+namespace UptimeKuma {
+    partial class DownloadForm {
+        /// <summary>
+        /// Required designer variable.
+        /// </summary>
+        private IContainer components = null;
+
+        /// <summary>
+        /// Clean up any resources being used.
+        /// </summary>
+        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+        protected override void Dispose(bool disposing) {
+            if (disposing && (components != null)) {
+                components.Dispose();
+            }
+
+            base.Dispose(disposing);
+        }
+
+        #region Windows Form Designer generated code
+
+        /// <summary>
+        /// Required method for Designer support - do not modify
+        /// the contents of this method with the code editor.
+        /// </summary>
+        private void InitializeComponent() {
+            System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(DownloadForm));
+            this.progressBar = new System.Windows.Forms.ProgressBar();
+            this.label = new System.Windows.Forms.Label();
+            this.labelData = new System.Windows.Forms.Label();
+            this.SuspendLayout();
+            // 
+            // progressBar
+            // 
+            this.progressBar.Location = new System.Drawing.Point(12, 12);
+            this.progressBar.Name = "progressBar";
+            this.progressBar.Size = new System.Drawing.Size(472, 41);
+            this.progressBar.TabIndex = 0;
+            // 
+            // label
+            // 
+            this.label.Location = new System.Drawing.Point(12, 59);
+            this.label.Name = "label";
+            this.label.Size = new System.Drawing.Size(472, 23);
+            this.label.TabIndex = 1;
+            this.label.Text = "Preparing...";
+            // 
+            // labelData
+            // 
+            this.labelData.Location = new System.Drawing.Point(12, 82);
+            this.labelData.Name = "labelData";
+            this.labelData.Size = new System.Drawing.Size(472, 23);
+            this.labelData.TabIndex = 2;
+            // 
+            // DownloadForm
+            // 
+            this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 16F);
+            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+            this.ClientSize = new System.Drawing.Size(496, 117);
+            this.Controls.Add(this.labelData);
+            this.Controls.Add(this.label);
+            this.Controls.Add(this.progressBar);
+            this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;
+            this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
+            this.MaximizeBox = false;
+            this.Name = "DownloadForm";
+            this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
+            this.Text = "Uptime Kuma";
+            this.Load += new System.EventHandler(this.DownloadForm_Load);
+            this.ResumeLayout(false);
+        }
+
+        private System.Windows.Forms.Label labelData;
+
+        private System.Windows.Forms.Label label;
+
+        private System.Windows.Forms.ProgressBar progressBar;
+
+        #endregion
+    }
+}
+
diff --git a/extra/exe-builder/DownloadForm.cs b/extra/exe-builder/DownloadForm.cs
new file mode 100644
index 000000000..28a57c527
--- /dev/null
+++ b/extra/exe-builder/DownloadForm.cs
@@ -0,0 +1,204 @@
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Diagnostics;
+using System.IO;
+using System.IO.Compression;
+using System.Net;
+using System.Threading;
+using System.Threading.Tasks;
+using System.Windows.Forms;
+using Newtonsoft.Json;
+
+namespace UptimeKuma {
+    public partial class DownloadForm : Form {
+        private readonly Queue<DownloadItem> downloadQueue = new();
+        private readonly WebClient webClient = new();
+        private DownloadItem currentDownloadItem;
+
+        public DownloadForm() {
+            InitializeComponent();
+        }
+
+        private void DownloadForm_Load(object sender, EventArgs e) {
+            webClient.DownloadProgressChanged += DownloadProgressChanged;
+            webClient.DownloadFileCompleted += DownloadFileCompleted;
+
+            label.Text = "Reading latest version...";
+
+            // Read json from https://uptime.kuma.pet/version
+            var versionJson = new WebClient().DownloadString("https://uptime.kuma.pet/version");
+            var versionObj = JsonConvert.DeserializeObject<Version>(versionJson);
+
+            var nodeVersion = versionObj.nodejs;
+            var uptimeKumaVersion = versionObj.latest;
+            var hasUpdateFile = File.Exists("update");
+
+            if (!Directory.Exists("node")) {
+                downloadQueue.Enqueue(new DownloadItem {
+                    URL = $"https://nodejs.org/dist/v{nodeVersion}/node-v{nodeVersion}-win-x64.zip",
+                    Filename = "node.zip",
+                    TargetFolder = "node"
+                });
+            }
+
+            if (!Directory.Exists("core") || hasUpdateFile) {
+
+                // It is update, rename the core folder to core.old
+                if (Directory.Exists("core")) {
+                    // Remove the old core.old folder
+                    if (Directory.Exists("core.old")) {
+                        Directory.Delete("core.old", true);
+                    }
+
+                    Directory.Move("core", "core.old");
+                }
+
+                downloadQueue.Enqueue(new DownloadItem {
+                    URL = $"https://github.com/louislam/uptime-kuma/archive/refs/tags/{uptimeKumaVersion}.zip",
+                    Filename = "core.zip",
+                    TargetFolder = "core"
+                });
+
+                File.WriteAllText("version.json", versionJson);
+
+                // Delete the update file
+                if (hasUpdateFile) {
+                    File.Delete("update");
+                }
+            }
+
+            DownloadNextFile();
+        }
+
+        void DownloadNextFile() {
+            if (downloadQueue.Count > 0) {
+                var item = downloadQueue.Dequeue();
+
+                currentDownloadItem = item;
+
+                // Download if the zip file is not existing
+                if (!File.Exists(item.Filename)) {
+                    label.Text = item.URL;
+                    webClient.DownloadFileAsync(new Uri(item.URL), item.Filename);
+                } else {
+                    progressBar.Value = 100;
+                    label.Text = "Use local " + item.Filename;
+                    DownloadFileCompleted(null, null);
+                }
+            } else {
+                npmSetup();
+            }
+        }
+
+        void npmSetup() {
+            labelData.Text = "";
+
+            var npm = "..\\node\\npm.cmd";
+            var cmd = $"{npm} ci --production & {npm} run download-dist & exit";
+
+            var startInfo = new ProcessStartInfo {
+                FileName = "cmd.exe",
+                Arguments = $"/k \"{cmd}\"",
+                RedirectStandardOutput = false,
+                RedirectStandardError = false,
+                RedirectStandardInput = true,
+                UseShellExecute = false,
+                CreateNoWindow = false,
+                WorkingDirectory = "core"
+            };
+
+            var process = new Process();
+            process.StartInfo = startInfo;
+            process.EnableRaisingEvents = true;
+            process.Exited += (_, e) => {
+                progressBar.Value = 100;
+
+               if (process.ExitCode == 0) {
+                   Task.Delay(2000).ContinueWith(_ => {
+                       Application.Restart();
+                   });
+                   label.Text = "Done";
+               } else {
+                   label.Text = "Failed, exit code: " + process.ExitCode;
+               }
+
+            };
+            process.Start();
+            label.Text = "Installing dependencies and download dist files";
+            progressBar.Value = 50;
+            process.WaitForExit();
+        }
+
+        void DownloadProgressChanged(object sender, DownloadProgressChangedEventArgs e) {
+            progressBar.Value = e.ProgressPercentage;
+            var total = e.TotalBytesToReceive / 1024;
+            var current = e.BytesReceived / 1024;
+
+            if (total > 0) {
+                labelData.Text = $"{current}KB/{total}KB";
+            }
+        }
+
+        void DownloadFileCompleted(object sender, AsyncCompletedEventArgs e) {
+            Extract(currentDownloadItem);
+            DownloadNextFile();
+        }
+
+        void Extract(DownloadItem item) {
+            if (Directory.Exists(item.TargetFolder)) {
+                var dir = new DirectoryInfo(item.TargetFolder);
+                dir.Delete(true);
+            }
+
+            if (Directory.Exists("temp")) {
+                var dir = new DirectoryInfo("temp");
+                dir.Delete(true);
+            }
+
+            labelData.Text = $"Extracting {item.Filename}...";
+
+            ZipFile.ExtractToDirectory(item.Filename, "temp");
+
+            string[] dirList;
+
+            // Move to the correct level
+            dirList = Directory.GetDirectories("temp");
+
+
+
+            if (dirList.Length > 0) {
+                var dir = dirList[0];
+
+                // As sometime ExtractToDirectory is still locking the directory, loop until ok
+                while (true) {
+                    try {
+                        Directory.Move(dir, item.TargetFolder);
+                        break;
+                    } catch (Exception exception) {
+                        Thread.Sleep(1000);
+                    }
+                }
+
+            } else {
+                MessageBox.Show("Unexcepted Error: Cannot move extracted files, folder not found.");
+            }
+
+            labelData.Text = $"Extracted";
+
+            if (Directory.Exists("temp")) {
+                var dir = new DirectoryInfo("temp");
+                dir.Delete(true);
+            }
+
+            File.Delete(item.Filename);
+        }
+    }
+
+    public class DownloadItem {
+        public string URL { get; set; }
+        public string Filename { get; set; }
+        public string TargetFolder { get; set; }
+    }
+}
+
diff --git a/extra/exe-builder/DownloadForm.resx b/extra/exe-builder/DownloadForm.resx
new file mode 100644
index 000000000..e87e0c0d4
--- /dev/null
+++ b/extra/exe-builder/DownloadForm.resx
@@ -0,0 +1,377 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
+  <data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        AAABAAMAMDAAAAEAIACoJQAANgAAACAgAAABACAAqBAAAN4lAAAQEAAAAQAgAGgEAACGNgAAKAAAADAA
+        AABgAAAAAQAgAAAAAAAAJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAA////BPT09Bfu7u4e8fHxJPPz8yv19fUy9fX1M/Pz8yvx8fEk9vb2HPPz8xXMzMwFAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP//
+        /wHv7+8f7u7uPPPz81Tx8fFs8fHxgPHx8YLx8fGC8fHxgvHx8YLx8fGC8fHxgvHx8YLx8fGC8fHxgvHx
+        8YLx8fGB8fHxcfHx8V3x8fFI9PT0MOvr6w0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AADy8vIU8fHxS/Dw8Hbx8fGC8fHxgvHx8YLx8fGC8fHxgvHx8YLx8fGC8fHxgvHx8YLx8fGC8fHxgvHx
+        8YLx8fGC8fHxgvHx8YLx8fGC8fHxgvHx8YLx8fGC8fHxgvHx8YLx8fFr9PT0R/Dw8CIAAAABAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAA8vLyFPHx8Vnx8fGB8fHxgvHx8YLx8fGC8fHxgvHx8YLx8fGC8fHxgvHx8YLx8fGC8fHxgvHx
+        8YLx8fGC8fHxgvHx8YLx8fGC8fHxgvHx8YLx8fGC8fHxgvHx8YLx8fGC8fHxgvHx8YLx8fGC8fHxgvHx
+        8YLx8fFs9fX1Mb+/vwQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAICAgALy8vI88fHxfvHx8YLx8fGC8fHxgvHx8YLx8fGC8fHxgvHx8YLx8fGC8fHxgvHx
+        8YLx8fGC8fHxgvHx8YLx8fGC8fHxgvHx8YLx8fGC8fHxgvHx8YLx8fGC8fHxgvHx8YLx8fGC8fHxgvHx
+        8YLx8fGC8fHxgvHx8YLx8fGC8fHxgvLy8nby8vI8gICAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAzMzMBfHx8Vrx8fGC8fHxgvHx8YLx8fGC8fHxgvHx8YLx8fGC8fHxgvHx
+        8YLx8fGC8fHxgvHx8YLx8fGC8fHxgvHx8YLx8fGC8fHxgvHx8YLx8fGC8fHxgvHx8YLx8fGC8fHxgvHx
+        8YLx8fGC8fHxgvHx8YLx8fGC8fHxgvHx8YLx8fGC8fHxgvHx8YLx8fGC8vLyYf///wwAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADMzMwF8vLyYPHx8YLx8fGC8fHxgvHx8YLx8fGC8fHxgvHx
+        8YLx8fGC8fHxgvHx8YLx8fGC8fHxgvHx8YLx8fGC8fHxgvHx8YLx8fGC8fHxgvHx8YLx8fGC8fHxgvHx
+        8YLx8fGC8fHxgvHx8YLx8fGC8fHxgvHx8YLx8fGC8fHxgvHx8YLx8fGC8fHxgvHx8YLx8fGC8fHxgvHx
+        8W/z8/MWAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADv7+9R8fHxgvHx8YLx8fGC8fHxgvHx
+        8YLx8fGC8fHxgvHx8YLx8fGC8fHxgvHx8YLx8fGC8fHxgvHx8YLx8fGC8fHxgvHx8YLx8fGC8fHxgvHx
+        8YLx8fGC8fHxgvHx8YLx8fGC8fHxgvHx8YLx8fGC8fHxgvHx8YLx8fGC8fHxgvHx8YLx8fGC8fHxgvHx
+        8YLx8fGC8fHxgvHx8YLw8PB26urqDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPLy8ijx8fGC8fHxgvHx
+        8YLx8fGC8fHxgvHx8YLx8fGC8fHxgvHx8YLx8fGC8fHxgu7w7Ifj79ud2u7PtNLrw83P677dzeu85c3r
+        u+rM67rwzOu68c7rverQ68Dj0uvD3NbuyM3b7c+64u7apujv5ZPx8fGC8fHxgvHx8YLx8fGC8fHxgvHx
+        8YLx8fGC8fHxgvHx8YLx8fGC8fHxgvHx8YLx8fGC8fHxXgAAAAEAAAAAAAAAAAAAAAAAAAAA4+PjCfDw
+        8Hfx8fGC8fHxgvHx8YLx8fGC8fHxgvHx8YLx8fGC8fHxgvHx8YLd7tSmzeu92MbqsvvG6bH/xumy/8fq
+        s//H6rP/yOq0/8jqtf/J6rb/yeq2/8rrt//K67j/y+u4/8vruf/M67r/zOu7/83ru//Q7MDx1u7Kz9/t
+        163s8OuJ8fHxgvHx8YLx8fGC8fHxgvHx8YLx8fGC8fHxgvHx8YLx8fGC8fHxgu/v7y8AAAAAAAAAAAAA
+        AAAAAAAA7u7uPfHx8YLx8fGC8fHxgvHx8YLx8fGC8fHxgvHx8YLx8fGC5PDdl8jqtuTE6a7/xOmv/8Xp
+        sP/G6bH/xumx/8bpsv/H6rP/x+qz/8jqtP/I6rX/yeq2/8nqtv/K67f/yuu4/8vruP/L67n/zOu6/8zr
+        u//N67v/zey8/87svf/P67742e3Mx+jv5ZLx8fGC8fHxgvHx8YLx8fGC8fHxgvHx8YLx8fGC8fHxgvDw
+        8HWAgIACAAAAAAAAAACqqqoD8vLyc/Hx8YLx8fGC8fHxgvHx8YLx8fGC8fHxgvHx8YLf7degxOiu+cPo
+        rf/D6a7/xOmu/8Xpr//F6bD/xumx/8bpsf/G6bL/x+qz/8fqs//I6rT/yOq1/8nqtv/J6rb/yuu3/8rr
+        uP/L67j/y+u5/8zruv/M67v/zeu7/83svP/O7L3/zuy9/87svfzc7tK28fHxgvHx8YLx8fGC8fHxgvHx
+        8YLx8fGC8fHxgvHx8YLx8fEkAAAAAAAAAADz8/Mq8fHxgvHx8YLx8fGC8fHxgvHx8YLx8fGC8fHxgunv
+        5o3D6a/0wuis/8Lorf/D6K3/xOmu/8Tprv/F6a//xemw/8bpsf/G6bH/xumy/8fqs//H6rP/yOq0/8jq
+        tf/J6rb/yeq2/8rrt//K67j/y+u4/8vruf/M67r/zOu7/83ru//N7Lz/zuy9/87svf/O7L3/3e/TtPHx
+        8YLx8fGC8fHxgvHx8YLx8fGC8fHxgvHx8YLy8vJNAAAAAAAAAADy8vJM8fHxgvHx8YLx8fGC8fHxgvHx
+        8YLx8fGC8fHxgszqutDB6Kv/weir/8LorP/D6K3/w+it/8Tprv/E6a7/xemv/8XpsP/G6bH/xumx/8bp
+        sv/H6rP/x+qz/8jqtP/I6rX/yeq2/8nqtv/K67f/yuu4/8vruP/L67n/zOu6/8zru//N67v/zey8/87s
+        vf/O7L3/zuy++u3w6Yzx8fGC8fHxgvHx8YLx8fGC8fHxgvHx8YLy8vJ1AAAAAAAAAADx8fFr8fHxgvHx
+        8YLx8fGC8fHxgvHx8YLx8fGC6O/kjsDoqvzA6Kr/weir/8Loq//C6Kz/w+it/8Porf/E6a7/xOmu/8Xp
+        r//F6bD/xumx/8bpsf/G6bL/x+qz/8fqtP/I6rT/yOq1/8nqtv/J6rb/yuu3/8rruP/L67n/y+u5/8zr
+        uv/M67v/zeu7/83svP/O7L3/zuy9/93u07Xx8fGC8fHxgvHx8YLx8fGC8fHxgvHx8YLx8fGC////Bv//
+        /wfx8fGB8fHxgvHx8YLx8fGC8fHxgvHx8YLx8fGC1ezJsr/nqf/A56n/weiq/8Hoq//C6Kv/wuis/8Po
+        rf/D6K3/xOmu/8Pprv+856T/uOed/7bmmv+05Zf/teWZ/7jnnf+86KP/wOio/8fqs//J6rb/yeq2/8rr
+        t//K67j/y+u5/8vruf/M67r/zOu7/83ru//N7Lz/zuy9/9buyNLx8fGC8fHxgvHx8YLx8fGC8fHxgvHx
+        8YLx8fGC8vLyE/Ly8hPx8fGC8fHxgvHx8YLx8fGC8fHxgvHx8YLx8fGCy+q6zr/nqP/A56n/wOep/8Ho
+        qv/B6Kv/wuir/8LorP+u5Y//neF2/5bgav+V4Gr/luBr/5fhbP+Y4W7/meFv/5rhcf+b4nL/nOJ0/53i
+        dv+j5H//reaM/7nnnf/E6q//y+y4/8vruf/L67n/zOu6/8zru//N67v/zey8/9Lsxd/x8fGC8fHxgvHx
+        8YLx8fGC8fHxgvHx8YLx8fGC7+/vIPb29hzx8fGC8fHxgvHx8YLx8fGC8fHxgvHx8YLx8fGCx+m03L/n
+        qP+/56j/wOep/8Dnqf/B6Kr/weir/7nmn/+R32T/kt9l/5PfZ/+U4Gj/leBq/5bga/+X4W3/mOFu/5nh
+        b/+a4XH/m+Jy/5zidP+d4nX/nuN3/5/jeP+f4nn/weqq/8rruP/L67n/y+u5/8zruv/M67v/zeu7/9Ls
+        w+Lx8fGC8fHxgvHx8YLx8fGC8fHxgvHx8YLx8fGC8PDwI/Hx8SXx8fGC8fHxgvHx8YLx8fGC8fHxgvHx
+        8YLx8fGCxeix5L/nqP+/56j/v+eo/8Dnqf/A56n/weiq/7Pllv+Q3mP/kd9k/5LfZf+T32f/lOBo/5Xg
+        av+W4Gv/l+Ft/5jhbv+Z4W//muFx/5vicv+c4nT/neJ1/57jd/+f43j/xOmu/8rrt//K67j/y+u5/8vr
+        uf/M67r/zOu7/9Tsxtfx8fGC8fHxgvHx8YLx8fGC8fHxgvHx8YLx8fGC9PT0GO/v7yDx8fGC8fHxgvHx
+        8YLx8fGC8fHxgvHx8YLx8fGCx+m037/nqP+/56j/v+eo/7/nqP/A56n/wOip/7TmmP+P3mH/kN5j/5Hf
+        ZP+S32b/k99n/5TgaP+V4Gr/luBr/5fhbf+Y4W7/meFw/5rhcf+b4nL/nOJ0/53idf+h5Hz/yuu2/8nq
+        t//K67f/yuu4/8vruf/L67n/zOu6/9ftysrx8fGC8fHxgvHx8YLx8fGC8fHxgvHx8YLx8fGC7e3tDvT0
+        9Bfx8fGC8fHxgvHx8YLx8fGC8fHxgvHx8YLx8fGCyOq117/nqP+/56j/v+eo/7/nqP+/56j/wOep/7vn
+        of+O3mD/j95h/5DeY/+R32T/kt9m/5PfZ/+U4Gj/leBq/5bga/+X4W3/mOFu/5nhcP+a4nH/m+Jy/5zi
+        dP+r5Yr/yOq1/8nqtv/J6rf/yuu3/8rruP/L67n/y+u5/9zu1LHx8fGC8fHxgvHx8YLx8fGC8fHxgvHx
+        8YLz8/OA////A+7u7g/x8fGC8fHxgvHx8YLx8fGC8fHxgvHx8YLx8fGCz+q+xb/nqP+/56j/v+eo/7/n
+        qP+/56j/v+eo/8Dnqf+S4Gb/jt5g/4/eYf+Q3mP/kd9k/5LfZv+T32f/lOBo/5Xgav+W4Gv/l+Ft/5jh
+        bv+Z4XD/muJx/5vic/+4553/yOq0/8jqtf/J6rb/yeq3/8rrt//K67j/y+u5/+bw4Zfx8fGC8fHxgvHx
+        8YLx8fGC8fHxgvHx8YLx8fFrAAAAAP///wHz8/N88fHxgvHx8YLx8fGC8fHxgvHx8YLx8fGC1+zMrr/n
+        qP+/56j/v+eo/7/nqP+/56j/v+eo/7/nqP+f4Xn/jd5f/47eYP+P3mH/kN5j/5HfZP+S32b/k99n/5Tg
+        af+V4Gr/luBr/5fhbf+Y4W7/meFw/5vic//F6rD/x+q0/8jqtP/I6rX/yeq2/8nqt//K67f/zOu88u/x
+        74Px8fGC8fHxgvHx8YLx8fGC8fHxgvHx8YLv7+9QAAAAAAAAAADw8PBm8fHxgvHx8YLx8fGC8fHxgvHx
+        8YLx8fGC5e7gk7/nqP+/56j/v+eo/7/nqP+/56j/v+eo/7/nqP+u5I//jN1d/43eX/+O3mD/j95h/5De
+        Y/+R32T/kt9m/5PfZ/+U4Gn/leBq/5bga/+X4W3/mOFu/6rliP/G6rL/x+qz/8fqtP/I6rT/yOq1/8nq
+        tv/J6rf/1OzGy/Hx8YLx8fGC8fHxgvHx8YLx8fGC8fHxgvHx8YL19fUzAAAAAAAAAADy8vJO8fHxgvHx
+        8YLx8fGC8fHxgvHx8YLx8fGC8fHxgsPoru2/56j/v+eo/7/nqP+/56j/v+eo/7/nqP++6Kf/j95i/4zd
+        Xf+N3l//jt5g/4/eYv+Q3mP/kd9k/5LfZv+T32f/lOBp/5Xgav+W4Gz/l+Ft/7voov/G6bL/xuqy/8fq
+        s//H6rT/yOq1/8jqtf/J6rb/4e/Zo/Hx8YLx8fGC8fHxgvHx8YLx8fGC8fHxgvHx8YLw8PARAAAAAAAA
+        AADu7u4u8fHxgvHx8YLx8fGC8fHxgvHx8YLx8fGC8fHxgszpvMm/56j/v+eo/7/nqP+/56j/v+eo/7/n
+        qP+/56j/q+SL/4vdXP+M3V3/jd5f/47eYP+P3mL/kN9j/5HfZP+S32b/k99n/5Tgaf+V4Gr/qOOH/8Xp
+        sP/G6bH/xumy/8bqsv/H6rP/x+q0/8jqtf/K67jy8PHwhPHx8YLx8fGC8fHxgvHx8YLx8fGC8fHxgvHx
+        8WoAAAAAAAAAAAAAAADo6OgL8fHxgfHx8YLx8fGC8fHxgvHx8YLx8fGC8fHxguDv2J2/56j/v+eo/7/n
+        qP+/56j/v+eo/7/nqP+/56j/v+eo/6Xjgv+L3Vz/jN1d/43eX/+O3mD/j95i/5DfY/+R32T/kt9m/5Pf
+        Z/+k44D/xOmu/8XpsP/F6bD/xumx/8bpsv/G6rL/x+qz/8fqtP/W7cnB8fHxgvHx8YLx8fGC8fHxgvHx
+        8YLx8fGC8fHxgvPz80AAAAAAAAAAAAAAAAAAAAAA8PDwZ/Hx8YLx8fGC8fHxgvHx8YLx8fGC8fHxgvHx
+        8YLD6K/rv+eo/7/nqP+/56j/v+eo/7/nqP+/56j/v+eo/7/nqP+u5I//kt5n/4zdXf+N3l//jt5g/4/e
+        Yv+Q32P/luFs/67kj//D6K3/xOmu/8Tpr//F6bD/xemw/8bpsf/G6bL/xuqy/8fqtP7o7+WR8fHxgvHx
+        8YLx8fGC8fHxgvHx8YLx8fGC8fHxgvPz8xYAAAAAAAAAAAAAAAAAAAAA8vLyPPHx8YLx8fGC8fHxgvHx
+        8YLx8fGC8fHxgvHx8YLV7ci0v+eo/7/nqP+/56j/v+eo/7/nqP+/56j/v+eo/7/nqP+/56j/wOio/7Xl
+        mv+u5I7/rOSM/67kj/+35pz/wumr/8Lorf/D6K3/w+it/8Tprv/E6a//xemw/8XpsP/G6bH/xumy/9Ds
+        wNPx8fGC8fHxgvHx8YLx8fGC8fHxgvHx8YLx8fGC8vLyZQAAAAAAAAAAAAAAAAAAAAAAAAAA////DPHx
+        8YDx8fGC8fHxgvHx8YLx8fGC8fHxgvHx8YLx8fGCx+m03L/nqP+/56j/v+eo/7/nqP+/56j/v+eo/7/n
+        qP+/56j/v+eo/7/nqP+/56j/wOep/8Doqv/B6Kr/weir/8LorP/C6K3/w+it/8Porv/E6a7/xOmv/8Xp
+        sP/F6bD/yOq18uvw6Yvx8fGC8fHxgvHx8YLx8fGC8fHxgvHx8YLx8fGC7+/vMQAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAPHx8Vzx8fGC8fHxgvHx8YLx8fGC8fHxgvHx8YLx8fGC6O/ij8LorPG/56j/v+eo/7/n
+        qP+/56j/v+eo/7/nqP+/56j/v+eo/7/nqP+/56j/v+eo/8Dnqf/A6Kr/weiq/8Hoq//C6Kz/wuit/8Po
+        rf/D6K7/xOmu/8Tpr//F6bH74u/anvHx8YLx8fGC8fHxgvHx8YLx8fGC8fHxgvHx8YLw8PB6////BQAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAPPz8yrx8fGC8fHxgvHx8YLx8fGC8fHxgvHx8YLx8fGC8fHxguHu
+        2pnB56v2v+eo/7/nqP+/56j/v+eo/7/nqP+/56j/v+eo/7/nqP+/56j/v+eo/7/nqP/A56n/wOiq/8Ho
+        q//B6Kv/wuis/8Lorf/D6K3/w+mu/8Tprv3b7dKq8fHxgvHx8YLx8fGC8fHxgvHx8YLx8fGC8fHxgvHx
+        8YLx8fFJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHy8vJf8fHxgvHx8YLx8fGC8fHxgvHx
+        8YLx8fGC8fHxgvHx8YLi7tyXwumt8L/nqP+/56j/v+eo/7/nqP+/56j/v+eo/7/nqP+/56j/v+eo/7/n
+        qP+/56j/wOep/8Doqv/B6Kv/weir/8LorP/C6K3/xOiv+d7u1aTx8fGC8fHxgvHx8YLx8fGC8fHxgvHx
+        8YLx8fGC8fHxgvLy8nb///8KAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADv7+8Q8/Pze/Hx
+        8YLx8fGC8fHxgvHx8YLx8fGC8fHxgvHx8YLx8fGC6/Dpiszqu82/56j/v+eo/7/nqP+/56j/v+eo/7/n
+        qP+/56j/v+eo/7/nqP+/56j/v+eo/8Dnqf/A6Kr/weir/8Hoq//H6bTj5e7elfHx8YLx8fGC8fHxgvHx
+        8YLx8fGC8fHxgvHx8YLx8fGC8fHxgvPz8yoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAA9fX1MvHx8YLx8fGC8fHxgvHx8YLx8fGC8fHxgvHx8YLx8fGC8fHxgvHx8YLe7tShx+mz3r/n
+        qP+/56j/v+eo/7/nqP+/56j/v+eo/7/nqP+/56j/v+eo/7/nqP/A56n/xumy5drtz6rv8e+D8fHxgvHx
+        8YLx8fGC8fHxgvHx8YLx8fGC8fHxgvHx8YLx8fGC8vLyTgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAPHx8Unx8fGC8fHxgvHx8YLx8fGC8fHxgvHx8YLx8fGC8fHxgvHx
+        8YLx8fGC8fHxgubv45DU68e2y+q6z8XoseTD6a7uweir9MPpru7F6bHly+q50tLsxLrl796U8fHxgvHx
+        8YLx8fGC8fHxgvHx8YLx8fGC8fHxgvHx8YLx8fGC8fHxgvHx8YLy8vJh////AwAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wHx8fFZ8fHxgvHx8YLx8fGC8fHxgvHx
+        8YLx8fGC8fHxgvHx8YLx8fGC8fHxgvHx8YLx8fGC8fHxgvHx8YLx8fGC8fHxgvHx8YLx8fGC8fHxgvHx
+        8YLx8fGC8fHxgvHx8YLx8fGC8fHxgvHx8YLx8fGC8fHxgvHx8YLx8fGC8fHxgvHx8Wzf398IAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8D8/PzVfHx
+        8YLx8fGC8fHxgvHx8YLx8fGC8fHxgvHx8YLx8fGC8fHxgvHx8YLx8fGC8fHxgvHx8YLx8fGC8fHxgvHx
+        8YLx8fGC8fHxgvHx8YLx8fGC8fHxgvHx8YLx8fGC8fHxgvHx8YLx8fGC8fHxgvHx8YLx8fGC8PDwZujo
+        6AsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAA////AfHx8Ujx8fGC8fHxgvHx8YLx8fGC8fHxgvHx8YLx8fGC8fHxgvHx8YLx8fGC8fHxgvHx
+        8YLx8fGC8fHxgvHx8YLx8fGC8fHxgvHx8YLx8fGC8fHxgvHx8YLx8fGC8fHxgvHx8YLx8fGC8fHxgvHx
+        8YLx8fFa////BQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADz8/Mp8vLydvHx8YLx8fGC8fHxgvHx8YLx8fGC8fHxgvHx
+        8YLx8fGC8fHxgvHx8YLx8fGC8fHxgvHx8YLx8fGC8fHxgvHx8YLx8fGC8fHxgvHx8YLx8fGC8fHxgvHx
+        8YLx8fGC8/PzfPHx8TcAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////CvLy8lDz8/N/8fHxgvHx
+        8YLx8fGC8fHxgvHx8YLx8fGC8fHxgvHx8YLx8fGC8fHxgvHx8YLx8fGC8fHxgvHx8YLx8fGC8fHxgvHx
+        8YLx8fGC8fHxgvPz84Hx8fFa8PDwEQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AADw8PAR8vLyTvHx8X3x8fGC8fHxgvHx8YLx8fGC8fHxgvHx8YLx8fGC8fHxgvHx8YLx8fGC8fHxgvHx
+        8YLx8fGC8fHxgvHx8YLx8fF/8/PzVvT09BgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wXz8/Mq8/PzU/Hx8XDx8fGB8fHxgvHx8YLx8fGC8fHxgvHx
+        8YLx8fGC8fHxgvHx8YLy8vJz8fHxWO/v7y////8IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8G7e3tHfLy
+        8ifu7u4u8PDwNPT09C/y8vIo7+/vH+Pj4wkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAP///////wAA////////AAD///////8AAP//gAf//wAA//gAAD//AAD/wAAAB/8AAP+A
+        AAAB/wAA/gAAAAB/AAD8AAAAAD8AAPgAAAAAHwAA8AAAAAAPAADwAAAAAAcAAOAAAAAABwAA4AAAAAAD
+        AADAAAAAAAMAAMAAAAAAAwAAwAAAAAABAACAAAAAAAEAAIAAAAAAAQAAgAAAAAABAACAAAAAAAEAAIAA
+        AAAAAQAAgAAAAAABAACAAAAAAAMAAMAAAAAAAwAAwAAAAAADAADAAAAAAAMAAMAAAAAABwAAwAAAAAAH
+        AADgAAAAAAcAAOAAAAAADwAA4AAAAAAPAADwAAAAAB8AAPAAAAAAHwAA+AAAAAA/AAD8AAAAAD8AAPwA
+        AAAAfwAA/gAAAAD/AAD/AAAAAf8AAP+AAAAD/wAA/8AAAAf/AAD/8AAAH/8AAP/8AAA//wAA//8AAf//
+        AAD//+AP//8AAP///////wAA////////AAD///////8AACgAAAAgAAAAQAAAAAEAIAAAAAAAABAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAgICAAu/v7xD09PQX7u7uHvDw8CP29vYb8vLyFOrq6gwAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAICA
+        gALy8vIm7+/vT/Pz82fz8/N98fHxgvHx8YLx8fGC8fHxgvHx8YLx8fGC8fHxgvDw8Hrw8PBm7+/vUPT0
+        9C3o6OgLAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOPj
+        4wnz8/NC8vLydPHx8YLx8fGC8fHxgvHx8YLx8fGC8fHxgvHx8YLx8fGC8fHxgvHx8YLx8fGC8fHxgvHx
+        8YLx8fGC8fHxgvHx8YHy8vJj8/PzKoCAgAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AADx8fEl8vLydfHx8YLx8fGC8fHxgvHx8YLx8fGC8fHxgvHx8YLx8fGC8fHxgvHx8YLx8fGC8fHxgvHx
+        8YLx8fGC8fHxgvHx8YLx8fGC8fHxgvHx8YLx8fGC8fHxcfHx8SUAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAA9PT0LfHx8YDx8fGC8fHxgvHx8YLx8fGC8fHxgvHx8YLx8fGC8fHxgvHx8YLx8fGC8fHxgvHx
+        8YLx8fGC8fHxgvHx8YLx8fGC8fHxgvHx8YLx8fGC8fHxgvHx8YLx8fGC8/PzgPLy8j0AAAABAAAAAAAA
+        AAAAAAAAAAAAAO3t7Rzx8fGA8fHxgvHx8YLx8fGC8fHxgvHx8YLx8fGC8fHxgvHx8YLr8OmM5O7emeTv
+        3Z7h79mj5fDem+nv45Tu8u6H8fHxgvHx8YLx8fGC8fHxgvHx8YLx8fGC8fHxgvHx8YLx8fGC8fHxgvLy
+        8joAAAAAAAAAAAAAAAD///8E8fHxbvHx8YLx8fGC8fHxgvHx8YLx8fGC7vDshtns0K7N67zayeq288fq
+        s//I6rT/yOq1/8nqtv/K67f/y+u4/8vruf/P7L7w0+zF29vv0Lrn8OKX8fHxgvHx8YLx8fGC8fHxgvHx
+        8YLx8fGC8/PzfvPz8xUAAAAAAAAAAPX19TLx8fGC8fHxgvHx8YLx8fGC8fHxgt3u1KXF6rHzxOmv/8Xp
+        sP/G6bH/xumy/8fqs//I6rT/yOq1/8nqtv/K67f/y+u4/8vruf/M67v/zey8/87svf/S7MPj4u7Zp/Hx
+        8YLx8fGC8fHxgvHx8YLx8fGC8/PzVQAAAAAAAAAA8fHxavHx8YLx8fGC8fHxgvHx8YLf7defwuis/cPo
+        rf/E6a7/xOmv/8XpsP/G6bH/xumy/8fqs//I6rT/yOq1/8nqtv/K67f/y+u4/8vruv/M67v/zey8/87s
+        vf/N67z/3e7SufHx8YLx8fGC8fHxgvHx8YLz8/N8////Bf///w3x8fGC8fHxgvHx8YLx8fGC8fHxgsXp
+        sOnB6Kv/wuis/8Porf/E6a7/xOmv/8XpsP/G6bH/xumy/8fqs//I6rT/yOq1/8nqtv/K67f/y+u4/8vr
+        uv/M67v/zey8/87svf/O67z96/Hoj/Hx8YLx8fGC8fHxgvHx8YLy8vIm8/PzK/Hx8YLx8fGC8fHxgvHx
+        8YLg79icwOep/8Hoqv/B6Kv/wuis/8Porf/E6a7/wuit/73opP+76KL/u+eh/77opv/D6a3/yeu1/8nq
+        tv/K67f/y+u5/8zruv/M67v/zey8/87svf/d7tSz8fHxgvHx8YLx8fGC8fHxgvHx8Tby8vI68fHxgvHx
+        8YLx8fGC8fHxgtTrxre/56j/wOep/8Hoqv/B6Kv/uOad/53idv+V4Gn/leBq/5fhbP+Y4W//muFx/5vi
+        c/+e4Xb/puWD/7PmlP/D6a3/y+u5/8zruv/M67v/zey8/9rtzsHx8fGC8fHxgvHx8YLx8fGC8/PzQfPz
+        80Lx8fGC8fHxgvHx8YLx8fGC0OvAwr/nqP+/56j/wOep/8Hoqv+o44b/kd9k/5LfZv+U4Gj/leBq/5fh
+        bf+Y4W//muFx/5vic/+d4nX/n+N3/7fnm//K67j/y+u5/8zruv/M67v/2u3QvPHx8YLx8fGC8fHxgvHx
+        8YLy8vI98/PzP/Hx8YLx8fGC8fHxgvHx8YLQ6sK/v+eo/7/nqP+/56j/wOep/6jjhv+P3mL/kd9k/5Lf
+        Zv+U4Gj/leBr/5fhbf+Y4W//muFx/5zic/+d4nX/v+mm/8nqt//K67j/y+u5/8zruv/f79au8fHxgvHx
+        8YLx8fGC8fHxgvX19TLx8fE38fHxgvHx8YLx8fGC8fHxgtTrybO/56j/v+eo/7/nqP+/56j/sOSS/47e
+        YP+P3mL/kd9k/5LfZv+U4Gj/leBr/5fhbf+Z4W//muJx/5/jd//H6bP/yeq2/8nqt//K67j/y+u5/+nv
+        45Tx8fGC8fHxgvHx8YLx8fGC7+/vIPHx8SXx8fGC8fHxgvHx8YLx8fGC4e/Zm7/nqP+/56j/v+eo/7/n
+        qP+956X/jt5h/47eYP+P3mL/kd9k/5LfZv+U4Gn/luBr/5fhbf+Z4W//q+aK/8fqs//I6rT/yeq2/8nq
+        t//N7Lvw8fHxgvHx8YLx8fGC8fHxgvPz84D///8G6+vrDfHx8YLx8fGC8fHxgvHx8YLv8e+Dweis87/n
+        qP+/56j/v+eo/7/nqP+d4XX/jN1e/47eYP+P3mL/kd9k/5PfZ/+U4Gn/luBr/5fhbf+86KP/xuqy/8fq
+        s//I6rX/yeq2/9Tsx8nx8fGC8fHxgvHx8YLx8fGC8PDwaAAAAAAAAAAA8fHxbPHx8YLx8fGC8fHxgvHx
+        8YLM6rrMv+eo/7/nqP+/56j/v+eo/7blmv+N3V//jN1e/47eYP+Q3mL/kd9k/5PfZ/+U4Gn/qeSH/8Xp
+        sP/G6bH/xuqy/8fqs//I6rX/5fDem/Hx8YLx8fGC8fHxgvHx8YLz8/M/AAAAAAAAAADz8/NB8fHxgvHx
+        8YLx8fGC8fHxgt3s06O/56j/v+eo/7/nqP+/56j/v+eo/7Xmmf+U32n/jN1e/47eYP+Q3mL/k99o/6zk
+        i//D6a7/xemv/8XpsP/G6bH/xuqy/8vqu+jx8fGC8fHxgvHx8YLx8fGC8fHxgvPz8xUAAAAAAAAAAPT0
+        9Bfx8fGC8fHxgvHx8YLx8fGC8fHvg8Tpsee/56j/v+eo/7/nqP+/56j/v+eo/7/nqP+35pz/suWV/7Xm
+        mf/A6Kj/wuit/8Porf/E6a7/xemv/8XpsP/G6bH/3e3UqvHx8YLx8fGC8fHxgvHx8YLw8PBmAAAAAAAA
+        AAAAAAAAAAAAAPHx8W7x8fGC8fHxgvHx8YLx8fGC4u7cmMHnqvm/56j/v+eo/7/nqP+/56j/v+eo/7/n
+        qP+/56j/wOep/8Hoqv/C6Kz/wuit/8Porf/E6a7/xemv/9Hrwszx8fGC8fHxgvHx8YLx8fGC8fHxgvX1
+        9TEAAAAAAAAAAAAAAAAAAAAA7u7uO/Hx8YLx8fGC8fHxgvHx8YLx8fGC3e7SpMHoqfq/56j/v+eo/7/n
+        qP+/56j/v+eo/7/nqP+/56j/wOip/8Hoq//C6Kz/wuit/8Porf/O67zV8PHwhPHx8YLx8fGC8fHxgvHx
+        8YLy8vJ2////BQAAAAAAAAAAAAAAAAAAAACqqqoD8PDwafHx8YLx8fGC8fHxgvHx8YLx8fGC4O/YnMTo
+        ruy/56j/v+eo/7/nqP+/56j/v+eo/7/nqP+/56j/wOip/8Hoq//C6Kz90uvEwe/x74Px8fGC8fHxgvHx
+        8YLx8fGC8fHxgvPz8ykAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADz8/MW8fHxfPHx8YLx8fGC8fHxgvHx
+        8YLx8fGC8PLuhdXtyLXF6bHlv+eo/7/nqP+/56j/v+eo/7/nqP/B6Kv0zeq8zOXv4JTx8fGC8fHxgvHx
+        8YLx8fGC8fHxgvHx8YLy8vJNAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADy8vIm8fHxgPHx
+        8YLx8fGC8fHxgvHx8YLx8fGC8fHxgvHx8YLs8OmJ4e/Zm93u06Pf7def5+/hkvHx8YLx8fGC8fHxgvHx
+        8YLx8fGC8fHxgvHx8YLx8fGC8fHxXf///wIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AADy8vIo8/PzffHx8YLx8fGC8fHxgvHx8YLx8fGC8fHxgvHx8YLx8fGC8fHxgvHx8YLx8fGC8fHxgvHx
+        8YLx8fGC8fHxgvHx8YLx8fGC8fHxgvHx8VnMzMwFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAD29vYb8fHxbvHx8YLx8fGC8fHxgvHx8YLx8fGC8fHxgvHx8YLx8fGC8fHxgvHx
+        8YLx8fGC8fHxgvHx8YLx8fGC8fHxgvPz83/v7+9BgICAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADMzMwF8/PzQPLy8nnx8fGC8fHxgvHx8YLx8fGC8fHxgvHx
+        8YLx8fGC8fHxgvHx8YLx8fGC8fHxgvPz84Hx8fFc9PT0GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////B/X19TLx8fFc8PDwevHx
+        8YLx8fGC8fHxgvHx8YLx8fGC8fHxgPHx8Wv09PRE9PT0FwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAA7+/vEPb29hvw8PAj7+/vH/T09Be/v78EAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////////////8B///wAA//wAAD/wAAAP4AAAB+AA
+        AAfAAAADwAAAA4AAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAADwAAAA8AAAAPAAAAH4AAAB+AA
+        AA/wAAAP+AAAH/gAAD/+AAB//wAB///AA///+B////////////8oAAAAEAAAACAAAAABACAAAAAAAAAE
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////CfDw8BH///8GAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgICAAu7u7i7x8fFe8PDwevHx8YLx8fGC8fHxgvDw
+        8Hvx8fFs7+/vT/Dw8CMAAAABAAAAAAAAAAAAAAAA5ubmCvLy8l/x8fGC8fHxgvHx8YLx8fGC8fHxgvHx
+        8YLx8fGC8fHxgvHx8YLx8fGC8/PzZu7u7g8AAAAAAAAAAPHx8V3x8fGC8fHxgunv5o7Z7c200+vFytTs
+        xc7W7cnH2+7QueLu2qbu8OyH8fHxgvHx8YLx8fFu////BfHx8STx8fGC8fHxgtrtzq3D6a/8xemw/8bp
+        sv/I6rT/yeq2/8vruP/M67v/z+u++Nzu0bjx8fGC8fHxgu/v7zDx8fFI8fHxguzw6ojC56z3wuis/8Tp
+        rv/E6q3/weiq/8fqsv/J6rb/y+u5/8zru//N67z/6/HpjfHx8YLy8vJN8fHxXPHx8YLg79icv+eo/8Ho
+        qv+k4n//lOBo/5fhbf+a4XH/n+J5/7Pmlv/L67n/zOu7/+Xw353x8fGC8fHxXvHx8Vrx8fGC4O3Zm7/n
+        qP+/56j/nuF3/5HfZP+U4Gj/l+Ft/5ricf+x5pL/yeq3/8vruf/r8emN8fHxgu/v70/x8fFK8fHxguzw
+        6ojA6Kn8v+eo/6njiP+O3mD/kd9k/5Tgaf+X4W3/vuim/8jqtP/N67zr8fHxgvHx8YLy8vI68/PzK/Hx
+        8YLx8fGCx+m03L/nqP++6Kb/meBw/47eYP+S32X/q+SL/8XpsP/G6rL/1+zLvvHx8YLz8/OB8PDwEdXV
+        1Qbx8fF98fHxgt/t1Z/A56j9v+eo/7/nqP+656H/vuim/8Lorf/E6a7/yOq18Ovw6Yvx8fGC8vLyYwAA
+        AAAAAAAA8fHxR/Hx8YLx8fGC2O3NrMDnqfq/56j/v+eo/7/nqP/B6Kv/xumy7OTu3Zfx8fGC8/PzgfLy
+        8icAAAAAAAAAAP///wPz8/Nm8fHxgvHx8YLo7+SO0+zFuczquszM6bzJ1+zMru7w7Ibx8fGC8fHxgvHx
+        8UcAAAAAAAAAAAAAAAAAAAAA4+PjCfHx8Vzx8fGC8fHxgvHx8YLx8fGC8fHxgvHx8YLx8fGC8fHxgfPz
+        80D///8BAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB8/PzK/Ly8mDz8/N+8fHxgvHx8YLy8vJ68vLyUezs
+        7BsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAevr6w3j4+MJAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAP//AAD8fwAA4AcAAMADAACAAQAAgAEAAIABAACAAQAAgAEAAIAB
+        AADAAwAAwAMAAOAHAADwDwAA/n8AAP//AAA=
+</value>
+  </data>
+</root>
\ No newline at end of file
diff --git a/extra/exe-builder/FS.cs b/extra/exe-builder/FS.cs
new file mode 100644
index 000000000..99a636949
--- /dev/null
+++ b/extra/exe-builder/FS.cs
@@ -0,0 +1,65 @@
+using System.IO;
+using System.Reflection;
+
+namespace UptimeKuma {
+
+    /**
+     * Current Directory using App location
+     */
+    public class Directory {
+        private static string baseDir;
+
+        public static string FullPath(string path) {
+            return Path.Combine(GetBaseDir(), path);
+        }
+
+        public static string GetBaseDir() {
+            if (baseDir == null) {
+                baseDir = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
+            }
+            return baseDir;
+        }
+
+        public static bool Exists(string path) {
+            return System.IO.Directory.Exists(FullPath(path));
+        }
+
+        public static void Delete(string path, bool recursive) {
+            System.IO.Directory.Delete(FullPath(path), recursive);
+        }
+
+        public static void Move(string src, string dest) {
+            System.IO.Directory.Move(FullPath(src), FullPath(dest));
+        }
+
+        public static string[] GetDirectories(string path) {
+            return System.IO.Directory.GetDirectories(FullPath(path));
+        }
+    }
+
+    public class File {
+
+        private static string FullPath(string path) {
+            return Directory.FullPath(path);
+        }
+        public static bool Exists(string path) {
+            return System.IO.File.Exists(FullPath(path));
+        }
+
+        public static FileStream Create(string path) {
+            return System.IO.File.Create(FullPath(path));
+        }
+
+        public static string ReadAllText(string path) {
+            return System.IO.File.ReadAllText(FullPath(path));
+        }
+
+        public static void Delete(string path) {
+            System.IO.File.Delete(FullPath(path));
+        }
+
+        public static void WriteAllText(string path, string content) {
+            System.IO.File.WriteAllText(FullPath(path), content);
+        }
+    }
+}
diff --git a/extra/exe-builder/FodyWeavers.xml b/extra/exe-builder/FodyWeavers.xml
new file mode 100644
index 000000000..f1dea8fce
--- /dev/null
+++ b/extra/exe-builder/FodyWeavers.xml
@@ -0,0 +1,3 @@
+<Weavers xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="FodyWeavers.xsd">
+  <Costura />
+</Weavers>
\ No newline at end of file
diff --git a/extra/exe-builder/FodyWeavers.xsd b/extra/exe-builder/FodyWeavers.xsd
new file mode 100644
index 000000000..ff119f713
--- /dev/null
+++ b/extra/exe-builder/FodyWeavers.xsd
@@ -0,0 +1,141 @@
+<?xml version="1.0" encoding="utf-8"?>
+<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
+  <!-- This file was generated by Fody. Manual changes to this file will be lost when your project is rebuilt. -->
+  <xs:element name="Weavers">
+    <xs:complexType>
+      <xs:all>
+        <xs:element name="Costura" minOccurs="0" maxOccurs="1">
+          <xs:complexType>
+            <xs:all>
+              <xs:element minOccurs="0" maxOccurs="1" name="ExcludeAssemblies" type="xs:string">
+                <xs:annotation>
+                  <xs:documentation>A list of assembly names to exclude from the default action of "embed all Copy Local references", delimited with line breaks</xs:documentation>
+                </xs:annotation>
+              </xs:element>
+              <xs:element minOccurs="0" maxOccurs="1" name="IncludeAssemblies" type="xs:string">
+                <xs:annotation>
+                  <xs:documentation>A list of assembly names to include from the default action of "embed all Copy Local references", delimited with line breaks.</xs:documentation>
+                </xs:annotation>
+              </xs:element>
+              <xs:element minOccurs="0" maxOccurs="1" name="ExcludeRuntimeAssemblies" type="xs:string">
+                <xs:annotation>
+                  <xs:documentation>A list of runtime assembly names to exclude from the default action of "embed all Copy Local references", delimited with line breaks</xs:documentation>
+                </xs:annotation>
+              </xs:element>
+              <xs:element minOccurs="0" maxOccurs="1" name="IncludeRuntimeAssemblies" type="xs:string">
+                <xs:annotation>
+                  <xs:documentation>A list of runtime assembly names to include from the default action of "embed all Copy Local references", delimited with line breaks.</xs:documentation>
+                </xs:annotation>
+              </xs:element>
+              <xs:element minOccurs="0" maxOccurs="1" name="Unmanaged32Assemblies" type="xs:string">
+                <xs:annotation>
+                  <xs:documentation>A list of unmanaged 32 bit assembly names to include, delimited with line breaks.</xs:documentation>
+                </xs:annotation>
+              </xs:element>
+              <xs:element minOccurs="0" maxOccurs="1" name="Unmanaged64Assemblies" type="xs:string">
+                <xs:annotation>
+                  <xs:documentation>A list of unmanaged 64 bit assembly names to include, delimited with line breaks.</xs:documentation>
+                </xs:annotation>
+              </xs:element>
+              <xs:element minOccurs="0" maxOccurs="1" name="PreloadOrder" type="xs:string">
+                <xs:annotation>
+                  <xs:documentation>The order of preloaded assemblies, delimited with line breaks.</xs:documentation>
+                </xs:annotation>
+              </xs:element>
+            </xs:all>
+            <xs:attribute name="CreateTemporaryAssemblies" type="xs:boolean">
+              <xs:annotation>
+                <xs:documentation>This will copy embedded files to disk before loading them into memory. This is helpful for some scenarios that expected an assembly to be loaded from a physical file.</xs:documentation>
+              </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="IncludeDebugSymbols" type="xs:boolean">
+              <xs:annotation>
+                <xs:documentation>Controls if .pdbs for reference assemblies are also embedded.</xs:documentation>
+              </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="IncludeRuntimeReferences" type="xs:boolean">
+              <xs:annotation>
+                <xs:documentation>Controls if runtime assemblies are also embedded.</xs:documentation>
+              </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="UseRuntimeReferencePaths" type="xs:boolean">
+              <xs:annotation>
+                <xs:documentation>Controls whether the runtime assemblies are embedded with their full path or only with their assembly name.</xs:documentation>
+              </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="DisableCompression" type="xs:boolean">
+              <xs:annotation>
+                <xs:documentation>Embedded assemblies are compressed by default, and uncompressed when they are loaded. You can turn compression off with this option.</xs:documentation>
+              </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="DisableCleanup" type="xs:boolean">
+              <xs:annotation>
+                <xs:documentation>As part of Costura, embedded assemblies are no longer included as part of the build. This cleanup can be turned off.</xs:documentation>
+              </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="LoadAtModuleInit" type="xs:boolean">
+              <xs:annotation>
+                <xs:documentation>Costura by default will load as part of the module initialization. This flag disables that behavior. Make sure you call CosturaUtility.Initialize() somewhere in your code.</xs:documentation>
+              </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="IgnoreSatelliteAssemblies" type="xs:boolean">
+              <xs:annotation>
+                <xs:documentation>Costura will by default use assemblies with a name like 'resources.dll' as a satellite resource and prepend the output path. This flag disables that behavior.</xs:documentation>
+              </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="ExcludeAssemblies" type="xs:string">
+              <xs:annotation>
+                <xs:documentation>A list of assembly names to exclude from the default action of "embed all Copy Local references", delimited with |</xs:documentation>
+              </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="IncludeAssemblies" type="xs:string">
+              <xs:annotation>
+                <xs:documentation>A list of assembly names to include from the default action of "embed all Copy Local references", delimited with |.</xs:documentation>
+              </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="ExcludeRuntimeAssemblies" type="xs:string">
+              <xs:annotation>
+                <xs:documentation>A list of runtime assembly names to exclude from the default action of "embed all Copy Local references", delimited with |</xs:documentation>
+              </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="IncludeRuntimeAssemblies" type="xs:string">
+              <xs:annotation>
+                <xs:documentation>A list of runtime assembly names to include from the default action of "embed all Copy Local references", delimited with |.</xs:documentation>
+              </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Unmanaged32Assemblies" type="xs:string">
+              <xs:annotation>
+                <xs:documentation>A list of unmanaged 32 bit assembly names to include, delimited with |.</xs:documentation>
+              </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Unmanaged64Assemblies" type="xs:string">
+              <xs:annotation>
+                <xs:documentation>A list of unmanaged 64 bit assembly names to include, delimited with |.</xs:documentation>
+              </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="PreloadOrder" type="xs:string">
+              <xs:annotation>
+                <xs:documentation>The order of preloaded assemblies, delimited with |.</xs:documentation>
+              </xs:annotation>
+            </xs:attribute>
+          </xs:complexType>
+        </xs:element>
+      </xs:all>
+      <xs:attribute name="VerifyAssembly" type="xs:boolean">
+        <xs:annotation>
+          <xs:documentation>'true' to run assembly verification (PEVerify) on the target assembly after all weavers have been executed.</xs:documentation>
+        </xs:annotation>
+      </xs:attribute>
+      <xs:attribute name="VerifyIgnoreCodes" type="xs:string">
+        <xs:annotation>
+          <xs:documentation>A comma-separated list of error codes that can be safely ignored in assembly verification.</xs:documentation>
+        </xs:annotation>
+      </xs:attribute>
+      <xs:attribute name="GenerateXsd" type="xs:boolean">
+        <xs:annotation>
+          <xs:documentation>'false' to turn off automatic generation of the XML Schema file.</xs:documentation>
+        </xs:annotation>
+      </xs:attribute>
+    </xs:complexType>
+  </xs:element>
+</xs:schema>
\ No newline at end of file
diff --git a/extra/exe-builder/Program.cs b/extra/exe-builder/Program.cs
new file mode 100644
index 000000000..1385e8303
--- /dev/null
+++ b/extra/exe-builder/Program.cs
@@ -0,0 +1,197 @@
+using System;
+using System.Collections.Generic;
+using System.Diagnostics;
+using System.Drawing;
+using System.IO;
+using System.Linq;
+using System.Net;
+using System.Reflection;
+using System.Runtime.InteropServices;
+using System.Threading.Tasks;
+using System.Windows.Forms;
+using Microsoft.Win32;
+using Newtonsoft.Json;
+using UptimeKuma.Properties;
+
+namespace UptimeKuma {
+    static class Program {
+        /// <summary>
+        /// The main entry point for the application.
+        /// </summary>
+        [STAThread]
+        static void Main(string[] args) {
+            Application.EnableVisualStyles();
+            Application.SetCompatibleTextRenderingDefault(false);
+            Application.Run(new UptimeKumaApplicationContext());
+        }
+    }
+
+    public class UptimeKumaApplicationContext : ApplicationContext
+    {
+        const string appName = "Uptime Kuma";
+
+        private NotifyIcon trayIcon;
+        private Process process;
+
+        private MenuItem runWhenStarts;
+
+        private RegistryKey registryKey = Registry.CurrentUser.OpenSubKey("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run", true);
+
+        public UptimeKumaApplicationContext()
+        {
+            trayIcon = new NotifyIcon();
+
+            runWhenStarts = new MenuItem("Run when system starts", RunWhenStarts);
+            runWhenStarts.Checked = registryKey.GetValue(appName) != null;
+
+            trayIcon.Icon = Icon.ExtractAssociatedIcon(Assembly.GetExecutingAssembly().Location);
+            trayIcon.ContextMenu = new ContextMenu(new MenuItem[] {
+                new("Open", Open),
+                //new("Debug Console", DebugConsole),
+                runWhenStarts,
+                new("Check for Update...", CheckForUpdate),
+                new("Visit GitHub...", VisitGitHub),
+                new("About", About),
+                new("Exit", Exit),
+            });
+
+            trayIcon.MouseDoubleClick += new MouseEventHandler(Open);
+            trayIcon.Visible = true;
+
+            var hasUpdateFile = File.Exists("update");
+
+            if (!hasUpdateFile && Directory.Exists("core") && Directory.Exists("node") && Directory.Exists("core/node_modules") && Directory.Exists("core/dist")) {
+                // Go go go
+                StartProcess();
+            } else {
+                DownloadFiles();
+            }
+        }
+
+        void DownloadFiles() {
+            var form = new DownloadForm();
+            form.Closed += Exit;
+            form.Show();
+        }
+
+        private void RunWhenStarts(object sender, EventArgs e) {
+            if (registryKey == null) {
+                MessageBox.Show("Error: Unable to set startup registry key.");
+                return;
+            }
+
+            if (runWhenStarts.Checked) {
+                registryKey.DeleteValue(appName, false);
+                runWhenStarts.Checked = false;
+            } else {
+                registryKey.SetValue(appName, Application.ExecutablePath);
+                runWhenStarts.Checked = true;
+            }
+        }
+
+        void StartProcess() {
+            var startInfo = new ProcessStartInfo {
+                FileName = "node/node.exe",
+                Arguments = "server/server.js --data-dir=\"../data/\"",
+                RedirectStandardOutput = false,
+                RedirectStandardError = false,
+                UseShellExecute = false,
+                CreateNoWindow = true,
+                WorkingDirectory = "core"
+            };
+
+            process = new Process();
+            process.StartInfo = startInfo;
+            process.EnableRaisingEvents = true;
+            process.Exited += ProcessExited;
+
+            try {
+                process.Start();
+                //Open(null, null);
+
+            } catch (Exception e) {
+                MessageBox.Show("Startup failed: " + e.Message, "Uptime Kuma Error");
+            }
+        }
+
+        void StopProcess() {
+            process?.Kill();
+        }
+
+        void Open(object sender, EventArgs e) {
+            Process.Start("http://localhost:3001");
+        }
+
+        void DebugConsole(object sender, EventArgs e) {
+
+        }
+
+        void CheckForUpdate(object sender, EventArgs e) {
+            var needUpdate = false;
+
+            // Check version.json exists
+            if (File.Exists("version.json")) {
+                // Load version.json and compare with the latest version from GitHub
+                var currentVersionObj = JsonConvert.DeserializeObject<Version>(File.ReadAllText("version.json"));
+
+                var versionJson = new WebClient().DownloadString("https://uptime.kuma.pet/version");
+                var latestVersionObj = JsonConvert.DeserializeObject<Version>(versionJson);
+
+                // Compare version, if the latest version is newer, then update
+                if (new System.Version(latestVersionObj.latest).CompareTo(new System.Version(currentVersionObj.latest)) > 0) {
+                    var result = MessageBox.Show("A new version is available. Do you want to update?", "Update", MessageBoxButtons.YesNo);
+                    if (result == DialogResult.Yes) {
+                        // Create a empty file `update`, so the app will download the core files again at startup
+                        File.Create("update").Close();
+
+                        trayIcon.Visible = false;
+                        process?.Kill();
+
+                        // Restart the app, it will download the core files again at startup
+                        Application.Restart();
+                    }
+                } else {
+                    MessageBox.Show("You are using the latest version.");
+                }
+            }
+
+
+        }
+
+        void VisitGitHub(object sender, EventArgs e)
+        {
+            Process.Start("https://github.com/louislam/uptime-kuma");
+        }
+
+        void About(object sender, EventArgs e)
+        {
+            MessageBox.Show("Uptime Kuma Windows Runtime v1.0.0" + Environment.NewLine + "© 2023 Louis Lam", "Info");
+        }
+
+        void Exit(object sender, EventArgs e)
+        {
+            // Hide tray icon, otherwise it will remain shown until user mouses over it
+            trayIcon.Visible = false;
+            process?.Kill();
+            Application.Exit();
+        }
+
+        void ProcessExited(object sender, EventArgs e) {
+
+            if (process.ExitCode != 0) {
+                var line = "";
+                while (!process.StandardOutput.EndOfStream)
+                {
+                    line += process.StandardOutput.ReadLine();
+                }
+
+                MessageBox.Show("Uptime Kuma exited unexpectedly. Exit code: " + process.ExitCode + " " + line);
+            }
+
+            trayIcon.Visible = false;
+            Application.Exit();
+        }
+
+    }
+}
+
diff --git a/extra/exe-builder/Properties/AssemblyInfo.cs b/extra/exe-builder/Properties/AssemblyInfo.cs
new file mode 100644
index 000000000..2552870b3
--- /dev/null
+++ b/extra/exe-builder/Properties/AssemblyInfo.cs
@@ -0,0 +1,36 @@
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// General Information about an assembly is controlled through the following
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("Uptime Kuma")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("Uptime Kuma")]
+[assembly: AssemblyCopyright("Copyright © 2022 Louis Lam")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// Setting ComVisible to false makes the types in this assembly not visible
+// to COM components.  If you need to access a type in this assembly from
+// COM, set the ComVisible attribute to true on that type.
+[assembly: ComVisible(false)]
+
+// The following GUID is for the ID of the typelib if this project is exposed to COM
+[assembly: Guid("2DB53988-1D93-4AC0-90C4-96ADEAAC5C04")]
+
+// Version information for an assembly consists of the following four values:
+//
+//      Major Version
+//      Minor Version
+//      Build Number
+//      Revision
+//
+// You can specify all the values or you can default the Build and Revision Numbers
+// by using the '*' as shown below:
+// [assembly: AssemblyVersion("1.0.*")]
+[assembly: AssemblyVersion("1.0.0.0")]
+[assembly: AssemblyFileVersion("1.0.0.0")]
diff --git a/extra/exe-builder/Properties/Resources.Designer.cs b/extra/exe-builder/Properties/Resources.Designer.cs
new file mode 100644
index 000000000..8c8e559c5
--- /dev/null
+++ b/extra/exe-builder/Properties/Resources.Designer.cs
@@ -0,0 +1,62 @@
+//------------------------------------------------------------------------------
+// <auto-generated>
+//     This code was generated by a tool.
+//     Runtime Version:4.0.30319.42000
+//
+//     Changes to this file may cause incorrect behavior and will be lost if
+//     the code is regenerated.
+// </auto-generated>
+//------------------------------------------------------------------------------
+
+namespace UptimeKuma.Properties {
+    /// <summary>
+    ///   A strongly-typed resource class, for looking up localized strings, etc.
+    /// </summary>
+    // This class was auto-generated by the StronglyTypedResourceBuilder
+    // class via a tool like ResGen or Visual Studio.
+    // To add or remove a member, edit your .ResX file then rerun ResGen
+    // with the /str option, or rebuild your VS project.
+    [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder",
+        "4.0.0.0")]
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+    internal class Resources {
+        private static global::System.Resources.ResourceManager resourceMan;
+
+        private static global::System.Globalization.CultureInfo resourceCulture;
+
+        [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance",
+            "CA1811:AvoidUncalledPrivateCode")]
+        internal Resources() {
+        }
+
+        /// <summary>
+        ///   Returns the cached ResourceManager instance used by this class.
+        /// </summary>
+        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState
+            .Advanced)]
+        internal static global::System.Resources.ResourceManager ResourceManager {
+            get {
+                if ((resourceMan == null)) {
+                    global::System.Resources.ResourceManager temp =
+                        new global::System.Resources.ResourceManager("UptimeKuma.Properties.Resources",
+                            typeof(Resources).Assembly);
+                    resourceMan = temp;
+                }
+
+                return resourceMan;
+            }
+        }
+
+        /// <summary>
+        ///   Overrides the current thread's CurrentUICulture property for all
+        ///   resource lookups using this strongly typed resource class.
+        /// </summary>
+        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState
+            .Advanced)]
+        internal static global::System.Globalization.CultureInfo Culture {
+            get { return resourceCulture; }
+            set { resourceCulture = value; }
+        }
+    }
+}
\ No newline at end of file
diff --git a/extra/exe-builder/Properties/Resources.resx b/extra/exe-builder/Properties/Resources.resx
new file mode 100644
index 000000000..ffecec851
--- /dev/null
+++ b/extra/exe-builder/Properties/Resources.resx
@@ -0,0 +1,117 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+</root>
\ No newline at end of file
diff --git a/extra/exe-builder/Properties/Settings.Designer.cs b/extra/exe-builder/Properties/Settings.Designer.cs
new file mode 100644
index 000000000..6c63b395b
--- /dev/null
+++ b/extra/exe-builder/Properties/Settings.Designer.cs
@@ -0,0 +1,23 @@
+//------------------------------------------------------------------------------
+// <auto-generated>
+//     This code was generated by a tool.
+//     Runtime Version:4.0.30319.42000
+//
+//     Changes to this file may cause incorrect behavior and will be lost if
+//     the code is regenerated.
+// </auto-generated>
+//------------------------------------------------------------------------------
+
+namespace UptimeKuma.Properties {
+    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+    [global::System.CodeDom.Compiler.GeneratedCodeAttribute(
+        "Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "11.0.0.0")]
+    internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase {
+        private static Settings defaultInstance =
+            ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));
+
+        public static Settings Default {
+            get { return defaultInstance; }
+        }
+    }
+}
\ No newline at end of file
diff --git a/extra/exe-builder/Properties/Settings.settings b/extra/exe-builder/Properties/Settings.settings
new file mode 100644
index 000000000..abf36c5d3
--- /dev/null
+++ b/extra/exe-builder/Properties/Settings.settings
@@ -0,0 +1,7 @@
+<?xml version='1.0' encoding='utf-8'?>
+<SettingsFile xmlns="http://schemas.microsoft.com/VisualStudio/2004/01/settings" CurrentProfile="(Default)">
+  <Profiles>
+    <Profile Name="(Default)" />
+  </Profiles>
+  <Settings />
+</SettingsFile>
diff --git a/extra/exe-builder/UptimeKuma.csproj b/extra/exe-builder/UptimeKuma.csproj
new file mode 100644
index 000000000..bd4e0dea9
--- /dev/null
+++ b/extra/exe-builder/UptimeKuma.csproj
@@ -0,0 +1,213 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+    <Import Project="packages\Costura.Fody.5.7.0\build\Costura.Fody.props" Condition="Exists('packages\Costura.Fody.5.7.0\build\Costura.Fody.props')" />
+    <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
+    <PropertyGroup>
+        <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+        <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+        <ProjectGuid>{2DB53988-1D93-4AC0-90C4-96ADEAAC5C04}</ProjectGuid>
+        <OutputType>WinExe</OutputType>
+        <RootNamespace>UptimeKuma</RootNamespace>
+        <AssemblyName>uptime-kuma</AssemblyName>
+        <TargetFrameworkVersion>v4.7.2</TargetFrameworkVersion>
+        <FileAlignment>512</FileAlignment>
+        <AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
+        <Deterministic>true</Deterministic>
+        <ApplicationIcon>..\..\public\favicon.ico</ApplicationIcon>
+        <LangVersion>9</LangVersion>
+    </PropertyGroup>
+    <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+        <PlatformTarget>AnyCPU</PlatformTarget>
+        <DebugSymbols>true</DebugSymbols>
+        <DebugType>full</DebugType>
+        <Optimize>false</Optimize>
+        <OutputPath>bin\Debug\</OutputPath>
+        <DefineConstants>DEBUG;TRACE</DefineConstants>
+        <ErrorReport>prompt</ErrorReport>
+        <WarningLevel>4</WarningLevel>
+    </PropertyGroup>
+    <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+        <PlatformTarget>AnyCPU</PlatformTarget>
+        <DebugType>pdbonly</DebugType>
+        <Optimize>true</Optimize>
+        <OutputPath>bin\Release\</OutputPath>
+        <DefineConstants>TRACE</DefineConstants>
+        <ErrorReport>prompt</ErrorReport>
+        <WarningLevel>4</WarningLevel>
+    </PropertyGroup>
+    <PropertyGroup>
+        <ApplicationManifest>app.manifest</ApplicationManifest>
+    </PropertyGroup>
+    <PropertyGroup>
+      <PostBuildEvent>COPY "$(SolutionDir)bin\Debug\uptime-kuma.exe" "%UserProfile%\Desktop\uptime-kuma-win64\"</PostBuildEvent>
+    </PropertyGroup>
+    <ItemGroup>
+        <Reference Include="Costura, Version=5.7.0.0, Culture=neutral, processorArchitecture=MSIL">
+          <HintPath>packages\Costura.Fody.5.7.0\lib\netstandard1.0\Costura.dll</HintPath>
+        </Reference>
+        <Reference Include="Microsoft.Win32.Primitives, Version=4.0.2.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
+          <HintPath>packages\Microsoft.Win32.Primitives.4.3.0\lib\net46\Microsoft.Win32.Primitives.dll</HintPath>
+        </Reference>
+        <Reference Include="mscorlib" />
+        <Reference Include="Newtonsoft.Json, Version=13.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
+          <HintPath>packages\Newtonsoft.Json.13.0.2\lib\net45\Newtonsoft.Json.dll</HintPath>
+        </Reference>
+        <Reference Include="System" />
+        <Reference Include="System.AppContext, Version=4.1.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
+          <HintPath>packages\System.AppContext.4.3.0\lib\net463\System.AppContext.dll</HintPath>
+        </Reference>
+        <Reference Include="System.Buffers, Version=4.0.3.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
+          <HintPath>packages\System.Buffers.4.5.1\lib\net461\System.Buffers.dll</HintPath>
+        </Reference>
+        <Reference Include="System.ComponentModel.Composition" />
+        <Reference Include="System.Console, Version=4.0.1.1, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
+          <HintPath>packages\System.Console.4.3.1\lib\net46\System.Console.dll</HintPath>
+        </Reference>
+        <Reference Include="System.Core" />
+        <Reference Include="System.Diagnostics.DiagnosticSource, Version=7.0.0.1, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
+          <HintPath>packages\System.Diagnostics.DiagnosticSource.7.0.1\lib\net462\System.Diagnostics.DiagnosticSource.dll</HintPath>
+        </Reference>
+        <Reference Include="System.Diagnostics.Tracing, Version=4.1.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
+          <HintPath>packages\System.Diagnostics.Tracing.4.3.0\lib\net462\System.Diagnostics.Tracing.dll</HintPath>
+        </Reference>
+        <Reference Include="System.Globalization.Calendars, Version=4.0.2.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
+          <HintPath>packages\System.Globalization.Calendars.4.3.0\lib\net46\System.Globalization.Calendars.dll</HintPath>
+        </Reference>
+        <Reference Include="System.IO, Version=4.1.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
+          <HintPath>packages\System.IO.4.3.0\lib\net462\System.IO.dll</HintPath>
+        </Reference>
+        <Reference Include="System.IO.Compression, Version=4.1.2.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, processorArchitecture=MSIL">
+          <HintPath>packages\System.IO.Compression.4.3.0\lib\net46\System.IO.Compression.dll</HintPath>
+        </Reference>
+        <Reference Include="System.IO.Compression.FileSystem" />
+        <Reference Include="System.IO.Compression.ZipFile, Version=4.0.2.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, processorArchitecture=MSIL">
+          <HintPath>packages\System.IO.Compression.ZipFile.4.3.0\lib\net46\System.IO.Compression.ZipFile.dll</HintPath>
+        </Reference>
+        <Reference Include="System.IO.FileSystem, Version=4.0.2.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
+          <HintPath>packages\System.IO.FileSystem.4.3.0\lib\net46\System.IO.FileSystem.dll</HintPath>
+        </Reference>
+        <Reference Include="System.IO.FileSystem.Primitives, Version=4.0.2.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
+          <HintPath>packages\System.IO.FileSystem.Primitives.4.3.0\lib\net46\System.IO.FileSystem.Primitives.dll</HintPath>
+        </Reference>
+        <Reference Include="System.Linq, Version=4.1.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
+          <HintPath>packages\System.Linq.4.3.0\lib\net463\System.Linq.dll</HintPath>
+        </Reference>
+        <Reference Include="System.Linq.Expressions, Version=4.1.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
+          <HintPath>packages\System.Linq.Expressions.4.3.0\lib\net463\System.Linq.Expressions.dll</HintPath>
+        </Reference>
+        <Reference Include="System.Memory, Version=4.0.1.2, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
+          <HintPath>packages\System.Memory.4.5.5\lib\net461\System.Memory.dll</HintPath>
+        </Reference>
+        <Reference Include="System.Net.Http, Version=4.1.1.3, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
+          <HintPath>packages\System.Net.Http.4.3.4\lib\net46\System.Net.Http.dll</HintPath>
+        </Reference>
+        <Reference Include="System.Net.Sockets, Version=4.1.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
+          <HintPath>packages\System.Net.Sockets.4.3.0\lib\net46\System.Net.Sockets.dll</HintPath>
+        </Reference>
+        <Reference Include="System.Numerics" />
+        <Reference Include="System.Numerics.Vectors, Version=4.1.4.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
+          <HintPath>packages\System.Numerics.Vectors.4.5.0\lib\net46\System.Numerics.Vectors.dll</HintPath>
+        </Reference>
+        <Reference Include="System.Reflection, Version=4.1.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
+          <HintPath>packages\System.Reflection.4.3.0\lib\net462\System.Reflection.dll</HintPath>
+        </Reference>
+        <Reference Include="System.Runtime, Version=4.1.1.1, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
+          <HintPath>packages\System.Runtime.4.3.1\lib\net462\System.Runtime.dll</HintPath>
+        </Reference>
+        <Reference Include="System.Runtime.CompilerServices.Unsafe, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
+          <HintPath>packages\System.Runtime.CompilerServices.Unsafe.6.0.0\lib\net461\System.Runtime.CompilerServices.Unsafe.dll</HintPath>
+        </Reference>
+        <Reference Include="System.Runtime.Extensions, Version=4.1.1.1, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
+          <HintPath>packages\System.Runtime.Extensions.4.3.1\lib\net462\System.Runtime.Extensions.dll</HintPath>
+        </Reference>
+        <Reference Include="System.Runtime.InteropServices, Version=4.1.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
+          <HintPath>packages\System.Runtime.InteropServices.4.3.0\lib\net463\System.Runtime.InteropServices.dll</HintPath>
+        </Reference>
+        <Reference Include="System.Runtime.InteropServices.RuntimeInformation, Version=4.0.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
+          <HintPath>packages\System.Runtime.InteropServices.RuntimeInformation.4.3.0\lib\net45\System.Runtime.InteropServices.RuntimeInformation.dll</HintPath>
+        </Reference>
+        <Reference Include="System.Security.Cryptography.Algorithms, Version=4.2.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
+          <HintPath>packages\System.Security.Cryptography.Algorithms.4.3.1\lib\net463\System.Security.Cryptography.Algorithms.dll</HintPath>
+        </Reference>
+        <Reference Include="System.Security.Cryptography.Encoding, Version=4.0.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
+          <HintPath>packages\System.Security.Cryptography.Encoding.4.3.0\lib\net46\System.Security.Cryptography.Encoding.dll</HintPath>
+        </Reference>
+        <Reference Include="System.Security.Cryptography.Primitives, Version=4.0.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
+          <HintPath>packages\System.Security.Cryptography.Primitives.4.3.0\lib\net46\System.Security.Cryptography.Primitives.dll</HintPath>
+        </Reference>
+        <Reference Include="System.Security.Cryptography.X509Certificates, Version=4.1.1.2, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
+          <HintPath>packages\System.Security.Cryptography.X509Certificates.4.3.2\lib\net461\System.Security.Cryptography.X509Certificates.dll</HintPath>
+        </Reference>
+        <Reference Include="System.Text.RegularExpressions, Version=4.1.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
+          <HintPath>packages\System.Text.RegularExpressions.4.3.1\lib\net463\System.Text.RegularExpressions.dll</HintPath>
+        </Reference>
+        <Reference Include="System.Xml.Linq" />
+        <Reference Include="System.Data.DataSetExtensions" />
+        <Reference Include="Microsoft.CSharp" />
+        <Reference Include="System.Data" />
+        <Reference Include="System.Deployment" />
+        <Reference Include="System.Drawing" />
+        <Reference Include="System.Windows.Forms" />
+        <Reference Include="System.Xml" />
+        <Reference Include="System.Xml.ReaderWriter, Version=4.1.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
+          <HintPath>packages\System.Xml.ReaderWriter.4.3.1\lib\net46\System.Xml.ReaderWriter.dll</HintPath>
+        </Reference>
+    </ItemGroup>
+    <ItemGroup>
+        <Compile Include="DownloadForm.cs">
+          <SubType>Form</SubType>
+        </Compile>
+        <Compile Include="DownloadForm.Designer.cs">
+          <DependentUpon>DownloadForm.cs</DependentUpon>
+        </Compile>
+        <Compile Include="FS.cs" />
+        <Compile Include="Program.cs" />
+        <Compile Include="Properties\AssemblyInfo.cs" />
+        <Compile Include="Version.cs" />
+        <EmbeddedResource Include="DownloadForm.resx">
+          <DependentUpon>DownloadForm.cs</DependentUpon>
+        </EmbeddedResource>
+        <EmbeddedResource Include="Properties\Resources.resx">
+            <Generator>ResXFileCodeGenerator</Generator>
+            <LastGenOutput>Resources.Designer.cs</LastGenOutput>
+            <SubType>Designer</SubType>
+        </EmbeddedResource>
+        <Compile Include="Properties\Resources.Designer.cs">
+            <AutoGen>True</AutoGen>
+            <DependentUpon>Resources.resx</DependentUpon>
+        </Compile>
+        <None Include="..\..\public\favicon.ico">
+          <Link>favicon.ico</Link>
+        </None>
+        <None Include="packages.config" />
+        <None Include="Properties\Settings.settings">
+            <Generator>SettingsSingleFileGenerator</Generator>
+            <LastGenOutput>Settings.Designer.cs</LastGenOutput>
+        </None>
+        <Compile Include="Properties\Settings.Designer.cs">
+            <AutoGen>True</AutoGen>
+            <DependentUpon>Settings.settings</DependentUpon>
+            <DesignTimeSharedInput>True</DesignTimeSharedInput>
+        </Compile>
+    </ItemGroup>
+    <ItemGroup>
+        <None Include="App.config" />
+    </ItemGroup>
+    <ItemGroup>
+      <Content Include=".gitignore" />
+      <Content Include="app.manifest" />
+    </ItemGroup>
+    <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+    <Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
+      <PropertyGroup>
+        <ErrorText>This project references NuGet package(s) that are missing on this computer. Enable NuGet Package Restore to download them.  For more information, see http://go.microsoft.com/fwlink/?LinkID=322105.The missing file is {0}.</ErrorText>
+      </PropertyGroup>
+      <Error Condition="!Exists('packages\Costura.Fody.5.7.0\build\Costura.Fody.props')" Text="$([System.String]::Format('$(ErrorText)', 'packages\Costura.Fody.5.7.0\build\Costura.Fody.props'))" />
+      <Error Condition="!Exists('packages\Costura.Fody.5.7.0\build\Costura.Fody.targets')" Text="$([System.String]::Format('$(ErrorText)', 'packages\Costura.Fody.5.7.0\build\Costura.Fody.targets'))" />
+      <Error Condition="!Exists('packages\Fody.6.6.4\build\Fody.targets')" Text="$([System.String]::Format('$(ErrorText)', 'packages\Fody.6.6.4\build\Fody.targets'))" />
+      <Error Condition="!Exists('packages\NETStandard.Library.2.0.3\build\netstandard2.0\NETStandard.Library.targets')" Text="$([System.String]::Format('$(ErrorText)', 'packages\NETStandard.Library.2.0.3\build\netstandard2.0\NETStandard.Library.targets'))" />
+    </Target>
+    <Import Project="packages\Costura.Fody.5.7.0\build\Costura.Fody.targets" Condition="Exists('packages\Costura.Fody.5.7.0\build\Costura.Fody.targets')" />
+    <Import Project="packages\Fody.6.6.4\build\Fody.targets" Condition="Exists('packages\Fody.6.6.4\build\Fody.targets')" />
+    <Import Project="packages\NETStandard.Library.2.0.3\build\netstandard2.0\NETStandard.Library.targets" Condition="Exists('packages\NETStandard.Library.2.0.3\build\netstandard2.0\NETStandard.Library.targets')" />
+</Project>
\ No newline at end of file
diff --git a/extra/exe-builder/UptimeKuma.sln b/extra/exe-builder/UptimeKuma.sln
new file mode 100644
index 000000000..201d7e234
--- /dev/null
+++ b/extra/exe-builder/UptimeKuma.sln
@@ -0,0 +1,16 @@
+
+Microsoft Visual Studio Solution File, Format Version 12.00
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "UptimeKuma", "UptimeKuma.csproj", "{2DB53988-1D93-4AC0-90C4-96ADEAAC5C04}"
+EndProject
+Global
+	GlobalSection(SolutionConfigurationPlatforms) = preSolution
+		Debug|Any CPU = Debug|Any CPU
+		Release|Any CPU = Release|Any CPU
+	EndGlobalSection
+	GlobalSection(ProjectConfigurationPlatforms) = postSolution
+		{2DB53988-1D93-4AC0-90C4-96ADEAAC5C04}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{2DB53988-1D93-4AC0-90C4-96ADEAAC5C04}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{2DB53988-1D93-4AC0-90C4-96ADEAAC5C04}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{2DB53988-1D93-4AC0-90C4-96ADEAAC5C04}.Release|Any CPU.Build.0 = Release|Any CPU
+	EndGlobalSection
+EndGlobal
diff --git a/extra/exe-builder/UptimeKuma.sln.DotSettings.user b/extra/exe-builder/UptimeKuma.sln.DotSettings.user
new file mode 100644
index 000000000..b4ca9dadf
--- /dev/null
+++ b/extra/exe-builder/UptimeKuma.sln.DotSettings.user
@@ -0,0 +1,3 @@
+<wpf:ResourceDictionary xml:space="preserve" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:s="clr-namespace:System;assembly=mscorlib" xmlns:ss="urn:shemas-jetbrains-com:settings-storage-xaml" xmlns:wpf="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
+	<s:Boolean x:Key="/Default/ResxEditorPersonal/CheckedGroups/=UptimeKuma_002FProperties_002FResources/@EntryIndexedValue">True</s:Boolean>
+	<s:Boolean x:Key="/Default/ResxEditorPersonal/Initialized/@EntryValue">True</s:Boolean></wpf:ResourceDictionary>
\ No newline at end of file
diff --git a/extra/exe-builder/Version.cs b/extra/exe-builder/Version.cs
new file mode 100644
index 000000000..896c7a244
--- /dev/null
+++ b/extra/exe-builder/Version.cs
@@ -0,0 +1,9 @@
+namespace UptimeKuma {
+    public class Version {
+        public string latest { get; set; }
+        public string slow { get; set; }
+        public string beta { get; set; }
+        public string nodejs { get; set; }
+        public string exe { get; set; }
+    }
+}
diff --git a/extra/exe-builder/app.manifest b/extra/exe-builder/app.manifest
new file mode 100644
index 000000000..4a48528fc
--- /dev/null
+++ b/extra/exe-builder/app.manifest
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0" xmlns:asmv3="urn:schemas-microsoft-com:asm.v3">
+    <asmv3:application>
+        <asmv3:windowsSettings>
+            <dpiAware xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">true</dpiAware>
+            <dpiAwareness xmlns="http://schemas.microsoft.com/SMI/2016/WindowsSettings">PerMonitorV2</dpiAwareness>
+        </asmv3:windowsSettings>
+    </asmv3:application>
+    <trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
+        <security>
+            <requestedPrivileges xmlns="urn:schemas-microsoft-com:asm.v3">
+                <!-- UAC Manifest Options
+                     If you want to change the Windows User Account Control level replace the
+                     requestedExecutionLevel node with one of the following.
+
+                <requestedExecutionLevel  level="asInvoker" uiAccess="false" />
+                <requestedExecutionLevel  level="requireAdministrator" uiAccess="false" />
+                <requestedExecutionLevel  level="highestAvailable" uiAccess="false" />
+
+                    Specifying requestedExecutionLevel element will disable file and registry virtualization.
+                    Remove this element if your application requires this virtualization for backwards
+                    compatibility.
+                -->
+                <requestedExecutionLevel level="asInvoker" uiAccess="false" />
+            </requestedPrivileges>
+        </security>
+    </trustInfo>
+</assembly>
diff --git a/extra/exe-builder/packages.config b/extra/exe-builder/packages.config
new file mode 100644
index 000000000..aca26d670
--- /dev/null
+++ b/extra/exe-builder/packages.config
@@ -0,0 +1,56 @@
+<?xml version="1.0" encoding="utf-8"?>
+<packages>
+  <package id="Costura.Fody" version="5.7.0" targetFramework="net472" developmentDependency="true" />
+  <package id="Fody" version="6.6.4" targetFramework="net472" developmentDependency="true" />
+  <package id="Microsoft.NETCore.Platforms" version="7.0.0" targetFramework="net472" />
+  <package id="Microsoft.Win32.Primitives" version="4.3.0" targetFramework="net472" />
+  <package id="NETStandard.Library" version="2.0.3" targetFramework="net472" />
+  <package id="Newtonsoft.Json" version="13.0.2" targetFramework="net472" />
+  <package id="System.AppContext" version="4.3.0" targetFramework="net472" />
+  <package id="System.Console" version="4.3.1" targetFramework="net472" />
+  <package id="System.Diagnostics.DiagnosticSource" version="7.0.1" targetFramework="net472" />
+  <package id="System.Net.Http" version="4.3.4" targetFramework="net472" />
+  <package id="System.Runtime.Extensions" version="4.3.1" targetFramework="net472" />
+  <package id="System.Security.Cryptography.Algorithms" version="4.3.1" targetFramework="net472" />
+  <package id="System.Security.Cryptography.X509Certificates" version="4.3.2" targetFramework="net472" />
+  <package id="System.Text.RegularExpressions" version="4.3.1" targetFramework="net472" />
+  <package id="System.Xml.ReaderWriter" version="4.3.1" targetFramework="net472" />
+  <package id="System.Memory" version="4.5.5" targetFramework="net472" />
+  <package id="System.Net.Primitives" version="4.3.1" targetFramework="net472" />
+  <package id="System.Runtime" version="4.3.1" targetFramework="net472" />
+  <package id="System.Buffers" version="4.5.1" targetFramework="net472" />
+  <package id="System.Collections" version="4.3.0" targetFramework="net472" />
+  <package id="System.Collections.Concurrent" version="4.3.0" targetFramework="net472" />
+  <package id="System.Diagnostics.Debug" version="4.3.0" targetFramework="net472" />
+  <package id="System.Diagnostics.Tools" version="4.3.0" targetFramework="net472" />
+  <package id="System.Diagnostics.Tracing" version="4.3.0" targetFramework="net472" />
+  <package id="System.Globalization" version="4.3.0" targetFramework="net472" />
+  <package id="System.Globalization.Calendars" version="4.3.0" targetFramework="net472" />
+  <package id="System.IO" version="4.3.0" targetFramework="net472" />
+  <package id="System.IO.Compression" version="4.3.0" targetFramework="net472" />
+  <package id="System.IO.Compression.ZipFile" version="4.3.0" targetFramework="net472" />
+  <package id="System.IO.FileSystem" version="4.3.0" targetFramework="net472" />
+  <package id="System.IO.FileSystem.Primitives" version="4.3.0" targetFramework="net472" />
+  <package id="System.Linq" version="4.3.0" targetFramework="net472" />
+  <package id="System.Linq.Expressions" version="4.3.0" targetFramework="net472" />
+  <package id="System.Net.Sockets" version="4.3.0" targetFramework="net472" />
+  <package id="System.Numerics.Vectors" version="4.5.0" targetFramework="net472" />
+  <package id="System.ObjectModel" version="4.3.0" targetFramework="net472" />
+  <package id="System.Reflection" version="4.3.0" targetFramework="net472" />
+  <package id="System.Reflection.Extensions" version="4.3.0" targetFramework="net472" />
+  <package id="System.Reflection.Primitives" version="4.3.0" targetFramework="net472" />
+  <package id="System.Resources.ResourceManager" version="4.3.0" targetFramework="net472" />
+  <package id="System.Runtime.CompilerServices.Unsafe" version="6.0.0" targetFramework="net472" />
+  <package id="System.Runtime.Handles" version="4.3.0" targetFramework="net472" />
+  <package id="System.Runtime.InteropServices" version="4.3.0" targetFramework="net472" />
+  <package id="System.Runtime.InteropServices.RuntimeInformation" version="4.3.0" targetFramework="net472" />
+  <package id="System.Runtime.Numerics" version="4.3.0" targetFramework="net472" />
+  <package id="System.Security.Cryptography.Encoding" version="4.3.0" targetFramework="net472" />
+  <package id="System.Security.Cryptography.Primitives" version="4.3.0" targetFramework="net472" />
+  <package id="System.Text.Encoding" version="4.3.0" targetFramework="net472" />
+  <package id="System.Text.Encoding.Extensions" version="4.3.0" targetFramework="net472" />
+  <package id="System.Threading" version="4.3.0" targetFramework="net472" />
+  <package id="System.Threading.Tasks" version="4.3.0" targetFramework="net472" />
+  <package id="System.Threading.Timer" version="4.3.0" targetFramework="net472" />
+  <package id="System.Xml.XDocument" version="4.3.0" targetFramework="net472" />
+</packages>
\ No newline at end of file
diff --git a/extra/healthcheck.go b/extra/healthcheck.go
index 779b15838..f79b3e65b 100644
--- a/extra/healthcheck.go
+++ b/extra/healthcheck.go
@@ -1,3 +1,7 @@
+/*
+ * If changed, have to run `npm run build-docker-builder-go`.
+ * This script should be run after a period of time (180s), because the server may need some time to prepare.
+ */
 package main
 
 import (
@@ -7,12 +11,17 @@ import (
 	"net/http"
 	"os"
 	"runtime"
+	"strings"
 	"time"
 )
 
 func main() {
 	isFreeBSD := runtime.GOOS == "freebsd"
 
+	// Is K8S + uptime-kuma as the container name
+	// See #2083
+	isK8s := strings.HasPrefix(os.Getenv("UPTIME_KUMA_PORT"), "tcp://")
+
 	// process.env.NODE_TLS_REJECT_UNAUTHORIZED = "0";
 	http.DefaultTransport.(*http.Transport).TLSClientConfig = &tls.Config{
 		InsecureSkipVerify: true,
@@ -40,7 +49,11 @@ func main() {
 		hostname = "127.0.0.1"
 	}
 
-	port := os.Getenv("UPTIME_KUMA_PORT")
+	port := ""
+	// UPTIME_KUMA_PORT is override by K8S unexpectedly,
+	if !isK8s {
+		port = os.Getenv("UPTIME_KUMA_PORT")
+	}
 	if len(port) == 0 {
 		port = os.Getenv("PORT")
 	}
diff --git a/extra/healthcheck.js b/extra/healthcheck.js
index 9b95cf26a..5e06c2120 100644
--- a/extra/healthcheck.js
+++ b/extra/healthcheck.js
@@ -1,4 +1,8 @@
 /*
+ * ⚠️ ⚠️ ⚠️ ⚠️ Due to the weird issue in Portainer that the healthcheck script is still pointing to this script for unknown reason.
+ * IT CANNOT BE DROPPED, even though it looks like it is not used.
+ * See more: https://github.com/louislam/uptime-kuma/issues/2774#issuecomment-1429092359
+ *
  * ⚠️ Deprecated: Changed to healthcheck.go, it will be deleted in the future.
  * This script should be run after a period of time (180s), because the server may need some time to prepare.
  */
diff --git a/extra/mark-as-nightly.js b/extra/mark-as-nightly.js
index ebc67da31..ada2aca81 100644
--- a/extra/mark-as-nightly.js
+++ b/extra/mark-as-nightly.js
@@ -1,11 +1,12 @@
 const pkg = require("../package.json");
 const fs = require("fs");
 const util = require("../src/util");
+const dayjs = require("dayjs");
 
 util.polyfill();
 
 const oldVersion = pkg.version;
-const newVersion = oldVersion + "-nightly-" + util.genSecret(8);
+const newVersion = oldVersion + "-nightly-" + dayjs().format("YYYYMMDDHHmmss");
 
 console.log("Old Version: " + oldVersion);
 console.log("New Version: " + newVersion);
diff --git a/extra/remove-2fa.js b/extra/remove-2fa.js
index 0f3f63462..f88c43fca 100644
--- a/extra/remove-2fa.js
+++ b/extra/remove-2fa.js
@@ -43,6 +43,11 @@ const main = async () => {
     console.log("Finished.");
 };
 
+/**
+ * Ask question of user
+ * @param {string} question Question to ask
+ * @returns {Promise<string>} Users response
+ */
 function question(question) {
     return new Promise((resolve) => {
         rl.question(question, (answer) => {
diff --git a/extra/reset-password.js b/extra/reset-password.js
index 8036a4566..168983312 100644
--- a/extra/reset-password.js
+++ b/extra/reset-password.js
@@ -53,6 +53,11 @@ const main = async () => {
     console.log("Finished.");
 };
 
+/**
+ * Ask question of user
+ * @param {string} question Question to ask
+ * @returns {Promise<string>} Users response
+ */
 function question(question) {
     return new Promise((resolve) => {
         rl.question(question, (answer) => {
diff --git a/extra/simple-dns-server.js b/extra/simple-dns-server.js
index 376dbdd04..a6946dcb3 100644
--- a/extra/simple-dns-server.js
+++ b/extra/simple-dns-server.js
@@ -135,6 +135,11 @@ server.listen({
     udp: 5300
 });
 
+/**
+ * Get human readable request type from request code
+ * @param {number} code Request code to translate
+ * @returns {string} Human readable request type
+ */
 function type(code) {
     for (let name in Packet.TYPE) {
         if (Packet.TYPE[name] === code) {
diff --git a/extra/simple-mqtt-server.js b/extra/simple-mqtt-server.js
index 238d27726..b970a380e 100644
--- a/extra/simple-mqtt-server.js
+++ b/extra/simple-mqtt-server.js
@@ -11,6 +11,7 @@ class SimpleMqttServer {
         this.port = port;
     }
 
+    /** Start the MQTT server */
     start() {
         this.server.listen(this.port, () => {
             console.log("server started and listening on port ", this.port);
diff --git a/extra/update-version.js b/extra/update-version.js
index d5c2ee5ca..8d78f17db 100644
--- a/extra/update-version.js
+++ b/extra/update-version.js
@@ -26,7 +26,8 @@ if (! exists) {
     fs.writeFileSync("package.json", JSON.stringify(pkg, null, 4) + "\n");
 
     // Also update package-lock.json
-    childProcess.spawnSync("npm", [ "install" ]);
+    const npm = /^win/.test(process.platform) ? "npm.cmd" : "npm";
+    childProcess.spawnSync(npm, [ "install" ]);
 
     commit(newVersion);
     tag(newVersion);
@@ -36,10 +37,8 @@ if (! exists) {
 }
 
 /**
- * Updates the version number in package.json and commits it to git.
- * @param {string} version - The new version number
- *
- * Generated by Trelent
+ * Commit updated files
+ * @param {string} version Version to update to
  */
 function commit(version) {
     let msg = "Update to " + version;
@@ -53,16 +52,19 @@ function commit(version) {
     }
 }
 
+/**
+ * Create a tag with the specified version
+ * @param {string} version Tag to create
+ */
 function tag(version) {
     let res = childProcess.spawnSync("git", [ "tag", version ]);
     console.log(res.stdout.toString().trim());
 }
 
 /**
- * Checks if a given version is already tagged in the git repository.
- * @param {string} version - The version to check for.
- *
- * Generated by Trelent
+ * Check if a tag exists for the specified version
+ * @param {string} version Version to check
+ * @returns {boolean} Does the tag already exist
  */
 function tagExists(version) {
     if (! version) {
diff --git a/extra/update-wiki-version.js b/extra/update-wiki-version.js
index 65b7e7b08..f551db41b 100644
--- a/extra/update-wiki-version.js
+++ b/extra/update-wiki-version.js
@@ -10,6 +10,10 @@ if (!newVersion) {
 
 updateWiki(newVersion);
 
+/**
+ * Update the wiki with new version number
+ * @param {string} newVersion Version to update to
+ */
 function updateWiki(newVersion) {
     const wikiDir = "./tmp/wiki";
     const howToUpdateFilename = "./tmp/wiki/🆙-How-to-Update.md";
@@ -39,6 +43,10 @@ function updateWiki(newVersion) {
     safeDelete(wikiDir);
 }
 
+/**
+ * Check if a directory exists and then delete it
+ * @param {string} dir Directory to delete
+ */
 function safeDelete(dir) {
     if (fs.existsSync(dir)) {
         fs.rm(dir, {
diff --git a/package-lock.json b/package-lock.json
index d8b67781c..5e57a9325 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,15 +1,16 @@
 {
     "name": "uptime-kuma",
-    "version": "1.19.0",
+    "version": "1.20.1",
     "lockfileVersion": 2,
     "requires": true,
     "packages": {
         "": {
             "name": "uptime-kuma",
-            "version": "1.19.0",
+            "version": "1.20.1",
             "license": "MIT",
             "dependencies": {
                 "@grpc/grpc-js": "~1.7.3",
+                "@louislam/ping": "~0.4.2-mod.1",
                 "@louislam/sqlite3": "15.1.2",
                 "args-parser": "~1.3.0",
                 "axios": "~0.27.0",
@@ -26,18 +27,21 @@
                 "compare-versions": "~3.6.0",
                 "compression": "~1.7.4",
                 "dayjs": "~1.11.5",
+                "dotenv": "~16.0.3",
                 "express": "~4.17.3",
                 "express-basic-auth": "~1.2.1",
                 "express-static-gzip": "~2.1.7",
                 "form-data": "~4.0.0",
+                "gamedig": "^4.0.5",
                 "http-graceful-shutdown": "~3.1.7",
                 "http-proxy-agent": "~5.0.0",
                 "https-proxy-agent": "~5.0.1",
                 "iconv-lite": "~0.6.3",
                 "jsesc": "~3.0.2",
-                "jsonwebtoken": "~8.5.1",
+                "jsonwebtoken": "~9.0.0",
                 "jwt-decode": "~3.1.2",
                 "limiter": "~2.1.0",
+                "mongodb": "~4.13.0",
                 "mqtt": "~4.3.7",
                 "mssql": "~8.1.4",
                 "mysql2": "~2.3.3",
@@ -51,7 +55,9 @@
                 "prom-client": "~13.2.0",
                 "prometheus-api-metrics": "~3.2.1",
                 "protobufjs": "~7.1.1",
-                "redbean-node": "0.1.4",
+                "qs": "~6.10.4",
+                "redbean-node": "~0.2.0",
+                "redis": "~4.5.1",
                 "socket.io": "~4.5.3",
                 "socket.io-client": "~4.5.3",
                 "socks-proxy-agent": "6.1.1",
@@ -84,10 +90,13 @@
                 "cypress": "^10.1.0",
                 "delay": "^5.0.0",
                 "dns2": "~2.0.1",
+                "dompurify": "~2.4.3",
                 "eslint": "~8.14.0",
                 "eslint-plugin-vue": "~8.7.1",
                 "favico.js": "~0.3.10",
                 "jest": "~27.2.5",
+                "marked": "~4.2.5",
+                "node-ssh": "~13.0.1",
                 "postcss-html": "~1.5.0",
                 "postcss-rtlcss": "~3.7.2",
                 "postcss-scss": "~4.0.4",
@@ -168,6 +177,1070 @@
                 "node": ">=6.0.0"
             }
         },
+        "node_modules/@aws-crypto/ie11-detection": {
+            "version": "3.0.0",
+            "resolved": "https://registry.npmjs.org/@aws-crypto/ie11-detection/-/ie11-detection-3.0.0.tgz",
+            "integrity": "sha512-341lBBkiY1DfDNKai/wXM3aujNBkXR7tq1URPQDL9wi3AUbI80NR74uF1TXHMm7po1AcnFk8iu2S2IeU/+/A+Q==",
+            "optional": true,
+            "dependencies": {
+                "tslib": "^1.11.1"
+            }
+        },
+        "node_modules/@aws-crypto/ie11-detection/node_modules/tslib": {
+            "version": "1.14.1",
+            "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
+            "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==",
+            "optional": true
+        },
+        "node_modules/@aws-crypto/sha256-browser": {
+            "version": "3.0.0",
+            "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-browser/-/sha256-browser-3.0.0.tgz",
+            "integrity": "sha512-8VLmW2B+gjFbU5uMeqtQM6Nj0/F1bro80xQXCW6CQBWgosFWXTx77aeOF5CAIAmbOK64SdMBJdNr6J41yP5mvQ==",
+            "optional": true,
+            "dependencies": {
+                "@aws-crypto/ie11-detection": "^3.0.0",
+                "@aws-crypto/sha256-js": "^3.0.0",
+                "@aws-crypto/supports-web-crypto": "^3.0.0",
+                "@aws-crypto/util": "^3.0.0",
+                "@aws-sdk/types": "^3.222.0",
+                "@aws-sdk/util-locate-window": "^3.0.0",
+                "@aws-sdk/util-utf8-browser": "^3.0.0",
+                "tslib": "^1.11.1"
+            }
+        },
+        "node_modules/@aws-crypto/sha256-browser/node_modules/tslib": {
+            "version": "1.14.1",
+            "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
+            "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==",
+            "optional": true
+        },
+        "node_modules/@aws-crypto/sha256-js": {
+            "version": "3.0.0",
+            "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-js/-/sha256-js-3.0.0.tgz",
+            "integrity": "sha512-PnNN7os0+yd1XvXAy23CFOmTbMaDxgxXtTKHybrJ39Y8kGzBATgBFibWJKH6BhytLI/Zyszs87xCOBNyBig6vQ==",
+            "optional": true,
+            "dependencies": {
+                "@aws-crypto/util": "^3.0.0",
+                "@aws-sdk/types": "^3.222.0",
+                "tslib": "^1.11.1"
+            }
+        },
+        "node_modules/@aws-crypto/sha256-js/node_modules/tslib": {
+            "version": "1.14.1",
+            "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
+            "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==",
+            "optional": true
+        },
+        "node_modules/@aws-crypto/supports-web-crypto": {
+            "version": "3.0.0",
+            "resolved": "https://registry.npmjs.org/@aws-crypto/supports-web-crypto/-/supports-web-crypto-3.0.0.tgz",
+            "integrity": "sha512-06hBdMwUAb2WFTuGG73LSC0wfPu93xWwo5vL2et9eymgmu3Id5vFAHBbajVWiGhPO37qcsdCap/FqXvJGJWPIg==",
+            "optional": true,
+            "dependencies": {
+                "tslib": "^1.11.1"
+            }
+        },
+        "node_modules/@aws-crypto/supports-web-crypto/node_modules/tslib": {
+            "version": "1.14.1",
+            "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
+            "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==",
+            "optional": true
+        },
+        "node_modules/@aws-crypto/util": {
+            "version": "3.0.0",
+            "resolved": "https://registry.npmjs.org/@aws-crypto/util/-/util-3.0.0.tgz",
+            "integrity": "sha512-2OJlpeJpCR48CC8r+uKVChzs9Iungj9wkZrl8Z041DWEWvyIHILYKCPNzJghKsivj+S3mLo6BVc7mBNzdxA46w==",
+            "optional": true,
+            "dependencies": {
+                "@aws-sdk/types": "^3.222.0",
+                "@aws-sdk/util-utf8-browser": "^3.0.0",
+                "tslib": "^1.11.1"
+            }
+        },
+        "node_modules/@aws-crypto/util/node_modules/tslib": {
+            "version": "1.14.1",
+            "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
+            "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==",
+            "optional": true
+        },
+        "node_modules/@aws-sdk/abort-controller": {
+            "version": "3.267.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/abort-controller/-/abort-controller-3.267.0.tgz",
+            "integrity": "sha512-5R7OSnHFV/f+qQpMf1RuSQoVdXroK94Vl6naWjMOAhMyofHykVhEok9hmFPac86AVx8rVX/vuA7u9GKI6/EE7g==",
+            "optional": true,
+            "dependencies": {
+                "@aws-sdk/types": "3.267.0",
+                "tslib": "^2.3.1"
+            },
+            "engines": {
+                "node": ">=14.0.0"
+            }
+        },
+        "node_modules/@aws-sdk/client-cognito-identity": {
+            "version": "3.267.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/client-cognito-identity/-/client-cognito-identity-3.267.0.tgz",
+            "integrity": "sha512-jEE5aw7wp7VhiaU0vCbNQbEIhiaNZnBhRj+vJVCd2HQBI9IVLVXAoyExWxLruAXKEO+A1w1df+fwZAOo0M7aQQ==",
+            "optional": true,
+            "dependencies": {
+                "@aws-crypto/sha256-browser": "3.0.0",
+                "@aws-crypto/sha256-js": "3.0.0",
+                "@aws-sdk/client-sts": "3.267.0",
+                "@aws-sdk/config-resolver": "3.267.0",
+                "@aws-sdk/credential-provider-node": "3.267.0",
+                "@aws-sdk/fetch-http-handler": "3.267.0",
+                "@aws-sdk/hash-node": "3.267.0",
+                "@aws-sdk/invalid-dependency": "3.267.0",
+                "@aws-sdk/middleware-content-length": "3.267.0",
+                "@aws-sdk/middleware-endpoint": "3.267.0",
+                "@aws-sdk/middleware-host-header": "3.267.0",
+                "@aws-sdk/middleware-logger": "3.267.0",
+                "@aws-sdk/middleware-recursion-detection": "3.267.0",
+                "@aws-sdk/middleware-retry": "3.267.0",
+                "@aws-sdk/middleware-serde": "3.267.0",
+                "@aws-sdk/middleware-signing": "3.267.0",
+                "@aws-sdk/middleware-stack": "3.267.0",
+                "@aws-sdk/middleware-user-agent": "3.267.0",
+                "@aws-sdk/node-config-provider": "3.267.0",
+                "@aws-sdk/node-http-handler": "3.267.0",
+                "@aws-sdk/protocol-http": "3.267.0",
+                "@aws-sdk/smithy-client": "3.267.0",
+                "@aws-sdk/types": "3.267.0",
+                "@aws-sdk/url-parser": "3.267.0",
+                "@aws-sdk/util-base64": "3.208.0",
+                "@aws-sdk/util-body-length-browser": "3.188.0",
+                "@aws-sdk/util-body-length-node": "3.208.0",
+                "@aws-sdk/util-defaults-mode-browser": "3.267.0",
+                "@aws-sdk/util-defaults-mode-node": "3.267.0",
+                "@aws-sdk/util-endpoints": "3.267.0",
+                "@aws-sdk/util-retry": "3.267.0",
+                "@aws-sdk/util-user-agent-browser": "3.267.0",
+                "@aws-sdk/util-user-agent-node": "3.267.0",
+                "@aws-sdk/util-utf8": "3.254.0",
+                "tslib": "^2.3.1"
+            },
+            "engines": {
+                "node": ">=14.0.0"
+            }
+        },
+        "node_modules/@aws-sdk/client-sso": {
+            "version": "3.267.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.267.0.tgz",
+            "integrity": "sha512-/475/mT0gYhimpCdK4iZW+eX0DT6mkTgVk5P9ARpQGzEblFM6i2pE7GQnlGeLyHVOtA0cNAyGrWUuj2pyigUaA==",
+            "optional": true,
+            "dependencies": {
+                "@aws-crypto/sha256-browser": "3.0.0",
+                "@aws-crypto/sha256-js": "3.0.0",
+                "@aws-sdk/config-resolver": "3.267.0",
+                "@aws-sdk/fetch-http-handler": "3.267.0",
+                "@aws-sdk/hash-node": "3.267.0",
+                "@aws-sdk/invalid-dependency": "3.267.0",
+                "@aws-sdk/middleware-content-length": "3.267.0",
+                "@aws-sdk/middleware-endpoint": "3.267.0",
+                "@aws-sdk/middleware-host-header": "3.267.0",
+                "@aws-sdk/middleware-logger": "3.267.0",
+                "@aws-sdk/middleware-recursion-detection": "3.267.0",
+                "@aws-sdk/middleware-retry": "3.267.0",
+                "@aws-sdk/middleware-serde": "3.267.0",
+                "@aws-sdk/middleware-stack": "3.267.0",
+                "@aws-sdk/middleware-user-agent": "3.267.0",
+                "@aws-sdk/node-config-provider": "3.267.0",
+                "@aws-sdk/node-http-handler": "3.267.0",
+                "@aws-sdk/protocol-http": "3.267.0",
+                "@aws-sdk/smithy-client": "3.267.0",
+                "@aws-sdk/types": "3.267.0",
+                "@aws-sdk/url-parser": "3.267.0",
+                "@aws-sdk/util-base64": "3.208.0",
+                "@aws-sdk/util-body-length-browser": "3.188.0",
+                "@aws-sdk/util-body-length-node": "3.208.0",
+                "@aws-sdk/util-defaults-mode-browser": "3.267.0",
+                "@aws-sdk/util-defaults-mode-node": "3.267.0",
+                "@aws-sdk/util-endpoints": "3.267.0",
+                "@aws-sdk/util-retry": "3.267.0",
+                "@aws-sdk/util-user-agent-browser": "3.267.0",
+                "@aws-sdk/util-user-agent-node": "3.267.0",
+                "@aws-sdk/util-utf8": "3.254.0",
+                "tslib": "^2.3.1"
+            },
+            "engines": {
+                "node": ">=14.0.0"
+            }
+        },
+        "node_modules/@aws-sdk/client-sso-oidc": {
+            "version": "3.267.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.267.0.tgz",
+            "integrity": "sha512-Jdq0v0mJSJbG/CKLfHC1L0cjCot48Y6lLMQV1lfkYE65xD0ZSs8Gl7P/T391ZH7cLO6ifVoPdsYnwzhi1ZPXSQ==",
+            "optional": true,
+            "dependencies": {
+                "@aws-crypto/sha256-browser": "3.0.0",
+                "@aws-crypto/sha256-js": "3.0.0",
+                "@aws-sdk/config-resolver": "3.267.0",
+                "@aws-sdk/fetch-http-handler": "3.267.0",
+                "@aws-sdk/hash-node": "3.267.0",
+                "@aws-sdk/invalid-dependency": "3.267.0",
+                "@aws-sdk/middleware-content-length": "3.267.0",
+                "@aws-sdk/middleware-endpoint": "3.267.0",
+                "@aws-sdk/middleware-host-header": "3.267.0",
+                "@aws-sdk/middleware-logger": "3.267.0",
+                "@aws-sdk/middleware-recursion-detection": "3.267.0",
+                "@aws-sdk/middleware-retry": "3.267.0",
+                "@aws-sdk/middleware-serde": "3.267.0",
+                "@aws-sdk/middleware-stack": "3.267.0",
+                "@aws-sdk/middleware-user-agent": "3.267.0",
+                "@aws-sdk/node-config-provider": "3.267.0",
+                "@aws-sdk/node-http-handler": "3.267.0",
+                "@aws-sdk/protocol-http": "3.267.0",
+                "@aws-sdk/smithy-client": "3.267.0",
+                "@aws-sdk/types": "3.267.0",
+                "@aws-sdk/url-parser": "3.267.0",
+                "@aws-sdk/util-base64": "3.208.0",
+                "@aws-sdk/util-body-length-browser": "3.188.0",
+                "@aws-sdk/util-body-length-node": "3.208.0",
+                "@aws-sdk/util-defaults-mode-browser": "3.267.0",
+                "@aws-sdk/util-defaults-mode-node": "3.267.0",
+                "@aws-sdk/util-endpoints": "3.267.0",
+                "@aws-sdk/util-retry": "3.267.0",
+                "@aws-sdk/util-user-agent-browser": "3.267.0",
+                "@aws-sdk/util-user-agent-node": "3.267.0",
+                "@aws-sdk/util-utf8": "3.254.0",
+                "tslib": "^2.3.1"
+            },
+            "engines": {
+                "node": ">=14.0.0"
+            }
+        },
+        "node_modules/@aws-sdk/client-sts": {
+            "version": "3.267.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.267.0.tgz",
+            "integrity": "sha512-bJ+SwJZAP3DuDUgToDV89HsB80IhSfB1rhzLG9csqs6h7uMLO8H1/fymElYKT4VMMAA+rpWJ3pznyGiCK7w28A==",
+            "optional": true,
+            "dependencies": {
+                "@aws-crypto/sha256-browser": "3.0.0",
+                "@aws-crypto/sha256-js": "3.0.0",
+                "@aws-sdk/config-resolver": "3.267.0",
+                "@aws-sdk/credential-provider-node": "3.267.0",
+                "@aws-sdk/fetch-http-handler": "3.267.0",
+                "@aws-sdk/hash-node": "3.267.0",
+                "@aws-sdk/invalid-dependency": "3.267.0",
+                "@aws-sdk/middleware-content-length": "3.267.0",
+                "@aws-sdk/middleware-endpoint": "3.267.0",
+                "@aws-sdk/middleware-host-header": "3.267.0",
+                "@aws-sdk/middleware-logger": "3.267.0",
+                "@aws-sdk/middleware-recursion-detection": "3.267.0",
+                "@aws-sdk/middleware-retry": "3.267.0",
+                "@aws-sdk/middleware-sdk-sts": "3.267.0",
+                "@aws-sdk/middleware-serde": "3.267.0",
+                "@aws-sdk/middleware-signing": "3.267.0",
+                "@aws-sdk/middleware-stack": "3.267.0",
+                "@aws-sdk/middleware-user-agent": "3.267.0",
+                "@aws-sdk/node-config-provider": "3.267.0",
+                "@aws-sdk/node-http-handler": "3.267.0",
+                "@aws-sdk/protocol-http": "3.267.0",
+                "@aws-sdk/smithy-client": "3.267.0",
+                "@aws-sdk/types": "3.267.0",
+                "@aws-sdk/url-parser": "3.267.0",
+                "@aws-sdk/util-base64": "3.208.0",
+                "@aws-sdk/util-body-length-browser": "3.188.0",
+                "@aws-sdk/util-body-length-node": "3.208.0",
+                "@aws-sdk/util-defaults-mode-browser": "3.267.0",
+                "@aws-sdk/util-defaults-mode-node": "3.267.0",
+                "@aws-sdk/util-endpoints": "3.267.0",
+                "@aws-sdk/util-retry": "3.267.0",
+                "@aws-sdk/util-user-agent-browser": "3.267.0",
+                "@aws-sdk/util-user-agent-node": "3.267.0",
+                "@aws-sdk/util-utf8": "3.254.0",
+                "fast-xml-parser": "4.0.11",
+                "tslib": "^2.3.1"
+            },
+            "engines": {
+                "node": ">=14.0.0"
+            }
+        },
+        "node_modules/@aws-sdk/config-resolver": {
+            "version": "3.267.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/config-resolver/-/config-resolver-3.267.0.tgz",
+            "integrity": "sha512-UMvJY548xOkamU9ZuZk336VX9r3035CAbttagiPJ/FXy9S8jcQ7N722PAovtxs69nNBQf56cmWsnOHphLCGG9w==",
+            "optional": true,
+            "dependencies": {
+                "@aws-sdk/signature-v4": "3.267.0",
+                "@aws-sdk/types": "3.267.0",
+                "@aws-sdk/util-config-provider": "3.208.0",
+                "@aws-sdk/util-middleware": "3.267.0",
+                "tslib": "^2.3.1"
+            },
+            "engines": {
+                "node": ">=14.0.0"
+            }
+        },
+        "node_modules/@aws-sdk/credential-provider-cognito-identity": {
+            "version": "3.267.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-cognito-identity/-/credential-provider-cognito-identity-3.267.0.tgz",
+            "integrity": "sha512-H97VsbiTcb4tbY/LQMZNglJIHt7CHso7RtGgctmdsEA7Rha79fV/egF0Vqo2OQHDgEEpgQDWCeHbXO1P5ibR/A==",
+            "optional": true,
+            "dependencies": {
+                "@aws-sdk/client-cognito-identity": "3.267.0",
+                "@aws-sdk/property-provider": "3.267.0",
+                "@aws-sdk/types": "3.267.0",
+                "tslib": "^2.3.1"
+            },
+            "engines": {
+                "node": ">=14.0.0"
+            }
+        },
+        "node_modules/@aws-sdk/credential-provider-env": {
+            "version": "3.267.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.267.0.tgz",
+            "integrity": "sha512-oiem2UtaFe4CQHscUCImJjPhYWd4iF8fqXhlq6BqHs1wsO6A0vnIUGh+Srut/2q7Xeegl/SRU34HK0hh8JCbxg==",
+            "optional": true,
+            "dependencies": {
+                "@aws-sdk/property-provider": "3.267.0",
+                "@aws-sdk/types": "3.267.0",
+                "tslib": "^2.3.1"
+            },
+            "engines": {
+                "node": ">=14.0.0"
+            }
+        },
+        "node_modules/@aws-sdk/credential-provider-imds": {
+            "version": "3.267.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-imds/-/credential-provider-imds-3.267.0.tgz",
+            "integrity": "sha512-Afd5+LdJ9QyeI5L4iyVmI4MLV+0JBtRLmRy0LdinwJaP0DyKyv9+uaIaorKfWihQpe8hwjEfQWTlTz2A3JMJtw==",
+            "optional": true,
+            "dependencies": {
+                "@aws-sdk/node-config-provider": "3.267.0",
+                "@aws-sdk/property-provider": "3.267.0",
+                "@aws-sdk/types": "3.267.0",
+                "@aws-sdk/url-parser": "3.267.0",
+                "tslib": "^2.3.1"
+            },
+            "engines": {
+                "node": ">=14.0.0"
+            }
+        },
+        "node_modules/@aws-sdk/credential-provider-ini": {
+            "version": "3.267.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.267.0.tgz",
+            "integrity": "sha512-pHHlqZqZXA4cTssTyRmbYtrjxS2BEy2KFYHEEHNUrd82pUHnj70n+lrpVnT5pRhPPDacpNzxq0KZGeNgmETpbw==",
+            "optional": true,
+            "dependencies": {
+                "@aws-sdk/credential-provider-env": "3.267.0",
+                "@aws-sdk/credential-provider-imds": "3.267.0",
+                "@aws-sdk/credential-provider-process": "3.267.0",
+                "@aws-sdk/credential-provider-sso": "3.267.0",
+                "@aws-sdk/credential-provider-web-identity": "3.267.0",
+                "@aws-sdk/property-provider": "3.267.0",
+                "@aws-sdk/shared-ini-file-loader": "3.267.0",
+                "@aws-sdk/types": "3.267.0",
+                "tslib": "^2.3.1"
+            },
+            "engines": {
+                "node": ">=14.0.0"
+            }
+        },
+        "node_modules/@aws-sdk/credential-provider-node": {
+            "version": "3.267.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.267.0.tgz",
+            "integrity": "sha512-uo8VyZ/L8HBXskYZC65bR1ZUJ5mBn8JarrGHt6vMG2A+uM7AuryTsKn2wdhPfuCUGKuQLXmix5K4VW/wzq11kQ==",
+            "optional": true,
+            "dependencies": {
+                "@aws-sdk/credential-provider-env": "3.267.0",
+                "@aws-sdk/credential-provider-imds": "3.267.0",
+                "@aws-sdk/credential-provider-ini": "3.267.0",
+                "@aws-sdk/credential-provider-process": "3.267.0",
+                "@aws-sdk/credential-provider-sso": "3.267.0",
+                "@aws-sdk/credential-provider-web-identity": "3.267.0",
+                "@aws-sdk/property-provider": "3.267.0",
+                "@aws-sdk/shared-ini-file-loader": "3.267.0",
+                "@aws-sdk/types": "3.267.0",
+                "tslib": "^2.3.1"
+            },
+            "engines": {
+                "node": ">=14.0.0"
+            }
+        },
+        "node_modules/@aws-sdk/credential-provider-process": {
+            "version": "3.267.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.267.0.tgz",
+            "integrity": "sha512-pd1OOB1Mm+QdPv3sPfO+1G8HBaPAAYXxjLcOK5z/myBeZAsLR12Xcaft4RR1XWwXXKEQqq42cbAINWQdyVykqQ==",
+            "optional": true,
+            "dependencies": {
+                "@aws-sdk/property-provider": "3.267.0",
+                "@aws-sdk/shared-ini-file-loader": "3.267.0",
+                "@aws-sdk/types": "3.267.0",
+                "tslib": "^2.3.1"
+            },
+            "engines": {
+                "node": ">=14.0.0"
+            }
+        },
+        "node_modules/@aws-sdk/credential-provider-sso": {
+            "version": "3.267.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.267.0.tgz",
+            "integrity": "sha512-JqwxelzeRhVdloNi+VUUXhJdziTtNrrwMuhds9wj4KPfl1S2EIzkRxHSjwDz1wtSyuIPOOo6pPJiaVbwvLpkVg==",
+            "optional": true,
+            "dependencies": {
+                "@aws-sdk/client-sso": "3.267.0",
+                "@aws-sdk/property-provider": "3.267.0",
+                "@aws-sdk/shared-ini-file-loader": "3.267.0",
+                "@aws-sdk/token-providers": "3.267.0",
+                "@aws-sdk/types": "3.267.0",
+                "tslib": "^2.3.1"
+            },
+            "engines": {
+                "node": ">=14.0.0"
+            }
+        },
+        "node_modules/@aws-sdk/credential-provider-web-identity": {
+            "version": "3.267.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.267.0.tgz",
+            "integrity": "sha512-za5UsQmj3sYRhd4h5eStj3GCHHfAAjfx2x5FmgQ9ldOp+s0wHEqSL1g+OL9v6o8otf9JnWha+wfUYq3yVGfufQ==",
+            "optional": true,
+            "dependencies": {
+                "@aws-sdk/property-provider": "3.267.0",
+                "@aws-sdk/types": "3.267.0",
+                "tslib": "^2.3.1"
+            },
+            "engines": {
+                "node": ">=14.0.0"
+            }
+        },
+        "node_modules/@aws-sdk/credential-providers": {
+            "version": "3.267.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/credential-providers/-/credential-providers-3.267.0.tgz",
+            "integrity": "sha512-Og70E1eHGcxShMbrmm8lOepF82Hg5Fe7WXv0pnUKFFUxr+pf89bCjxGwktZIDM7ZMMXGIyladeIgTjsJkhpjRQ==",
+            "optional": true,
+            "dependencies": {
+                "@aws-sdk/client-cognito-identity": "3.267.0",
+                "@aws-sdk/client-sso": "3.267.0",
+                "@aws-sdk/client-sts": "3.267.0",
+                "@aws-sdk/credential-provider-cognito-identity": "3.267.0",
+                "@aws-sdk/credential-provider-env": "3.267.0",
+                "@aws-sdk/credential-provider-imds": "3.267.0",
+                "@aws-sdk/credential-provider-ini": "3.267.0",
+                "@aws-sdk/credential-provider-node": "3.267.0",
+                "@aws-sdk/credential-provider-process": "3.267.0",
+                "@aws-sdk/credential-provider-sso": "3.267.0",
+                "@aws-sdk/credential-provider-web-identity": "3.267.0",
+                "@aws-sdk/property-provider": "3.267.0",
+                "@aws-sdk/shared-ini-file-loader": "3.267.0",
+                "@aws-sdk/types": "3.267.0",
+                "tslib": "^2.3.1"
+            },
+            "engines": {
+                "node": ">=14.0.0"
+            }
+        },
+        "node_modules/@aws-sdk/fetch-http-handler": {
+            "version": "3.267.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/fetch-http-handler/-/fetch-http-handler-3.267.0.tgz",
+            "integrity": "sha512-u8v8OvWvLVfifmETCAj+DCTot900AsdO1b+N+O8nXiTm2v99rtEoNRJW+no/5vJKNqR+95OAz4NWjFep8nzseg==",
+            "optional": true,
+            "dependencies": {
+                "@aws-sdk/protocol-http": "3.267.0",
+                "@aws-sdk/querystring-builder": "3.267.0",
+                "@aws-sdk/types": "3.267.0",
+                "@aws-sdk/util-base64": "3.208.0",
+                "tslib": "^2.3.1"
+            }
+        },
+        "node_modules/@aws-sdk/hash-node": {
+            "version": "3.267.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/hash-node/-/hash-node-3.267.0.tgz",
+            "integrity": "sha512-N3xeChdJg4V4jh2vrRN521EMJYxjUOo/LpvpisFyQHE/p31AfcOLb05upYFoYLvyeder9RHBIyNsvvnMYYoCsA==",
+            "optional": true,
+            "dependencies": {
+                "@aws-sdk/types": "3.267.0",
+                "@aws-sdk/util-buffer-from": "3.208.0",
+                "@aws-sdk/util-utf8": "3.254.0",
+                "tslib": "^2.3.1"
+            },
+            "engines": {
+                "node": ">=14.0.0"
+            }
+        },
+        "node_modules/@aws-sdk/invalid-dependency": {
+            "version": "3.267.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/invalid-dependency/-/invalid-dependency-3.267.0.tgz",
+            "integrity": "sha512-I95IR/eDLC54+9qrL6uh64nhpLVHwxxbBhhEUZKDACp86eXulO8T/DOwUX31ps4+2lI7tbEhQT7f9WDOO3fN8Q==",
+            "optional": true,
+            "dependencies": {
+                "@aws-sdk/types": "3.267.0",
+                "tslib": "^2.3.1"
+            }
+        },
+        "node_modules/@aws-sdk/is-array-buffer": {
+            "version": "3.201.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/is-array-buffer/-/is-array-buffer-3.201.0.tgz",
+            "integrity": "sha512-UPez5qLh3dNgt0DYnPD/q0mVJY84rA17QE26hVNOW3fAji8W2wrwrxdacWOxyXvlxWsVRcKmr+lay1MDqpAMfg==",
+            "optional": true,
+            "dependencies": {
+                "tslib": "^2.3.1"
+            },
+            "engines": {
+                "node": ">=14.0.0"
+            }
+        },
+        "node_modules/@aws-sdk/middleware-content-length": {
+            "version": "3.267.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-content-length/-/middleware-content-length-3.267.0.tgz",
+            "integrity": "sha512-b6MBIK12iwcATKnWIhsh50xWVMmZOXZFIo9D4io6D+JM6j/U+GZrSWqxhHzb3SjavuwVgA2hwq4mUCh2WJPJKA==",
+            "optional": true,
+            "dependencies": {
+                "@aws-sdk/protocol-http": "3.267.0",
+                "@aws-sdk/types": "3.267.0",
+                "tslib": "^2.3.1"
+            },
+            "engines": {
+                "node": ">=14.0.0"
+            }
+        },
+        "node_modules/@aws-sdk/middleware-endpoint": {
+            "version": "3.267.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-endpoint/-/middleware-endpoint-3.267.0.tgz",
+            "integrity": "sha512-pGICM/qlQVfixtfKZt8zHq54KvLG2MmOAgNWj2MXB7oirPs/3rC9Kz9ITFXJgjlRFyfssgP/feKhs2yZkI8lhw==",
+            "optional": true,
+            "dependencies": {
+                "@aws-sdk/middleware-serde": "3.267.0",
+                "@aws-sdk/protocol-http": "3.267.0",
+                "@aws-sdk/signature-v4": "3.267.0",
+                "@aws-sdk/types": "3.267.0",
+                "@aws-sdk/url-parser": "3.267.0",
+                "@aws-sdk/util-config-provider": "3.208.0",
+                "@aws-sdk/util-middleware": "3.267.0",
+                "tslib": "^2.3.1"
+            },
+            "engines": {
+                "node": ">=14.0.0"
+            }
+        },
+        "node_modules/@aws-sdk/middleware-host-header": {
+            "version": "3.267.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.267.0.tgz",
+            "integrity": "sha512-D8TfjMeuQXTsB7Ni8liMmNqb3wz+T6t/tYUHtsMo0j++94KAPPj1rhkkTAjR4Rc+IYGCS4YyyCuCXjGB6gkjnA==",
+            "optional": true,
+            "dependencies": {
+                "@aws-sdk/protocol-http": "3.267.0",
+                "@aws-sdk/types": "3.267.0",
+                "tslib": "^2.3.1"
+            },
+            "engines": {
+                "node": ">=14.0.0"
+            }
+        },
+        "node_modules/@aws-sdk/middleware-logger": {
+            "version": "3.267.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.267.0.tgz",
+            "integrity": "sha512-wnLeZYWbgGCuNmRl0Pmky0cSXBWmMTaQBgq90WfwyM0V8wzcoeaovTWA5/qe8oJzusOgUMFoVia4Ew20k3lu8w==",
+            "optional": true,
+            "dependencies": {
+                "@aws-sdk/types": "3.267.0",
+                "tslib": "^2.3.1"
+            },
+            "engines": {
+                "node": ">=14.0.0"
+            }
+        },
+        "node_modules/@aws-sdk/middleware-recursion-detection": {
+            "version": "3.267.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.267.0.tgz",
+            "integrity": "sha512-NCBkTLxaW7XtfQoVBqQCaQZqec5XDtEylkw7g0tGjYDcl934fzu3ciH9MsJ34QFe9slYM6g4v+eC9f1w9K/19g==",
+            "optional": true,
+            "dependencies": {
+                "@aws-sdk/protocol-http": "3.267.0",
+                "@aws-sdk/types": "3.267.0",
+                "tslib": "^2.3.1"
+            },
+            "engines": {
+                "node": ">=14.0.0"
+            }
+        },
+        "node_modules/@aws-sdk/middleware-retry": {
+            "version": "3.267.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-retry/-/middleware-retry-3.267.0.tgz",
+            "integrity": "sha512-MiiNtddZXVhtSAnJFyChwNxnhzMYmv6qWl8qgSjuIOw9SczkHPCoANTfUdRlzG6RfPYhgYtzMGqqnrficJ6mVg==",
+            "optional": true,
+            "dependencies": {
+                "@aws-sdk/protocol-http": "3.267.0",
+                "@aws-sdk/service-error-classification": "3.267.0",
+                "@aws-sdk/types": "3.267.0",
+                "@aws-sdk/util-middleware": "3.267.0",
+                "@aws-sdk/util-retry": "3.267.0",
+                "tslib": "^2.3.1",
+                "uuid": "^8.3.2"
+            },
+            "engines": {
+                "node": ">=14.0.0"
+            }
+        },
+        "node_modules/@aws-sdk/middleware-sdk-sts": {
+            "version": "3.267.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-sts/-/middleware-sdk-sts-3.267.0.tgz",
+            "integrity": "sha512-JLDNNvV7Hr0CQrf1vSmflvPbfDFIx5lFf8tY7DZwYWEE920ZzbJTfUsTW9iZHJGeIe8dAQX1tmfYL68+++nvEQ==",
+            "optional": true,
+            "dependencies": {
+                "@aws-sdk/middleware-signing": "3.267.0",
+                "@aws-sdk/property-provider": "3.267.0",
+                "@aws-sdk/protocol-http": "3.267.0",
+                "@aws-sdk/signature-v4": "3.267.0",
+                "@aws-sdk/types": "3.267.0",
+                "tslib": "^2.3.1"
+            },
+            "engines": {
+                "node": ">=14.0.0"
+            }
+        },
+        "node_modules/@aws-sdk/middleware-serde": {
+            "version": "3.267.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-serde/-/middleware-serde-3.267.0.tgz",
+            "integrity": "sha512-9qspxiZs+JShukzKMAameBSubfvtUOGZviu9GT5OfRekY2dBbwWcfchP2WvlwxZ/CcC+GwO1HcPqKDCMGsNoow==",
+            "optional": true,
+            "dependencies": {
+                "@aws-sdk/types": "3.267.0",
+                "tslib": "^2.3.1"
+            },
+            "engines": {
+                "node": ">=14.0.0"
+            }
+        },
+        "node_modules/@aws-sdk/middleware-signing": {
+            "version": "3.267.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-signing/-/middleware-signing-3.267.0.tgz",
+            "integrity": "sha512-thkFEBiFW0M/73dIzl7hQmyAONb8zyD2ZYUFyGm7cIM60sRDUKejPHV6Izonll+HbBZgiBdwUi42uu8O+LfFGQ==",
+            "optional": true,
+            "dependencies": {
+                "@aws-sdk/property-provider": "3.267.0",
+                "@aws-sdk/protocol-http": "3.267.0",
+                "@aws-sdk/signature-v4": "3.267.0",
+                "@aws-sdk/types": "3.267.0",
+                "@aws-sdk/util-middleware": "3.267.0",
+                "tslib": "^2.3.1"
+            },
+            "engines": {
+                "node": ">=14.0.0"
+            }
+        },
+        "node_modules/@aws-sdk/middleware-stack": {
+            "version": "3.267.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-stack/-/middleware-stack-3.267.0.tgz",
+            "integrity": "sha512-52uH3JO3ceI15dgzt8gU7lpJf59qbRUQYJ7pAmTMiHtyEawZ39Puv6sGheY3fAffhqd/aQvup6wn18Q1fRIQUA==",
+            "optional": true,
+            "dependencies": {
+                "tslib": "^2.3.1"
+            },
+            "engines": {
+                "node": ">=14.0.0"
+            }
+        },
+        "node_modules/@aws-sdk/middleware-user-agent": {
+            "version": "3.267.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.267.0.tgz",
+            "integrity": "sha512-eaReMnoB1Cx3OY8WDSiUMNDz/EkdAo4w/m3d5CizckKQNmB29gUrgyFs7g7sHTcShQAduZzlsfRPzc6NmKYaWQ==",
+            "optional": true,
+            "dependencies": {
+                "@aws-sdk/protocol-http": "3.267.0",
+                "@aws-sdk/types": "3.267.0",
+                "tslib": "^2.3.1"
+            },
+            "engines": {
+                "node": ">=14.0.0"
+            }
+        },
+        "node_modules/@aws-sdk/node-config-provider": {
+            "version": "3.267.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/node-config-provider/-/node-config-provider-3.267.0.tgz",
+            "integrity": "sha512-wNX+Cu0x+kllng253j5dvmLm4opDRr7YehJ0rNGAV24X+UPJPluN9HrBFly+z4+bH16TpJEPKx7AayiWZGFE1w==",
+            "optional": true,
+            "dependencies": {
+                "@aws-sdk/property-provider": "3.267.0",
+                "@aws-sdk/shared-ini-file-loader": "3.267.0",
+                "@aws-sdk/types": "3.267.0",
+                "tslib": "^2.3.1"
+            },
+            "engines": {
+                "node": ">=14.0.0"
+            }
+        },
+        "node_modules/@aws-sdk/node-http-handler": {
+            "version": "3.267.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/node-http-handler/-/node-http-handler-3.267.0.tgz",
+            "integrity": "sha512-wtt3O+e8JEKaLFtmQd74HSZj2TyiApPkwMJ3R50hyboVswt8RcdMWdFbzLnPVpT1AqskG3fMECSKbu8AC/xvBQ==",
+            "optional": true,
+            "dependencies": {
+                "@aws-sdk/abort-controller": "3.267.0",
+                "@aws-sdk/protocol-http": "3.267.0",
+                "@aws-sdk/querystring-builder": "3.267.0",
+                "@aws-sdk/types": "3.267.0",
+                "tslib": "^2.3.1"
+            },
+            "engines": {
+                "node": ">=14.0.0"
+            }
+        },
+        "node_modules/@aws-sdk/property-provider": {
+            "version": "3.267.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/property-provider/-/property-provider-3.267.0.tgz",
+            "integrity": "sha512-/BD1Zar9PCQSV8VZTAWOJmtojAeMIl16ljZX3Kix84r45qqNNxuPST2AhNVN+p97Js4x9kBFCHkdFOpW94wr4Q==",
+            "optional": true,
+            "dependencies": {
+                "@aws-sdk/types": "3.267.0",
+                "tslib": "^2.3.1"
+            },
+            "engines": {
+                "node": ">=14.0.0"
+            }
+        },
+        "node_modules/@aws-sdk/protocol-http": {
+            "version": "3.267.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/protocol-http/-/protocol-http-3.267.0.tgz",
+            "integrity": "sha512-8HhOZXMCZ0nsJC/FoifX7YrTYGP91tCpSxIHkr7HxQcTdBMI7QakMtIIWK9Qjsy6tUI98aAdEo5PNCbzdpozmQ==",
+            "optional": true,
+            "dependencies": {
+                "@aws-sdk/types": "3.267.0",
+                "tslib": "^2.3.1"
+            },
+            "engines": {
+                "node": ">=14.0.0"
+            }
+        },
+        "node_modules/@aws-sdk/querystring-builder": {
+            "version": "3.267.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/querystring-builder/-/querystring-builder-3.267.0.tgz",
+            "integrity": "sha512-SKo8V3oPV1wZy4r4lccH7R2LT0PUK/WGaXkKR30wyrtDjJRWVJDYef9ysOpRP+adCTt3G5XO0SzyPQUW5dXYVA==",
+            "optional": true,
+            "dependencies": {
+                "@aws-sdk/types": "3.267.0",
+                "@aws-sdk/util-uri-escape": "3.201.0",
+                "tslib": "^2.3.1"
+            },
+            "engines": {
+                "node": ">=14.0.0"
+            }
+        },
+        "node_modules/@aws-sdk/querystring-parser": {
+            "version": "3.267.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/querystring-parser/-/querystring-parser-3.267.0.tgz",
+            "integrity": "sha512-Krq36GXqEfRfzJ9wOzkkzpbb4SWjgSYydTIgK6KtKapme0HPcB24kmmsjsUVuHzKuQMCHHDRWm+b47iBmHGpSQ==",
+            "optional": true,
+            "dependencies": {
+                "@aws-sdk/types": "3.267.0",
+                "tslib": "^2.3.1"
+            },
+            "engines": {
+                "node": ">=14.0.0"
+            }
+        },
+        "node_modules/@aws-sdk/service-error-classification": {
+            "version": "3.267.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/service-error-classification/-/service-error-classification-3.267.0.tgz",
+            "integrity": "sha512-fOWg7bcItmJqD/YQbGvN9o03ucoBzvWNTQEB81mLKMSKr1Cf/ms0f8oa94LlImgqjjfjvAqHh6rUBTpSmSEyaw==",
+            "optional": true,
+            "engines": {
+                "node": ">=14.0.0"
+            }
+        },
+        "node_modules/@aws-sdk/shared-ini-file-loader": {
+            "version": "3.267.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/shared-ini-file-loader/-/shared-ini-file-loader-3.267.0.tgz",
+            "integrity": "sha512-Jz9R5hXKSk+aRoBKi4Bnf6T/FZUBYrIibbLnhiNxpQ1FY9mTggJR/rxuIdOE23LtfW+CRqqEYOtAtmC1oYE6tw==",
+            "optional": true,
+            "dependencies": {
+                "@aws-sdk/types": "3.267.0",
+                "tslib": "^2.3.1"
+            },
+            "engines": {
+                "node": ">=14.0.0"
+            }
+        },
+        "node_modules/@aws-sdk/signature-v4": {
+            "version": "3.267.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4/-/signature-v4-3.267.0.tgz",
+            "integrity": "sha512-Je1e7rum2zvxa3jWfwq4E+fyBdFJmSJAwGtWYz3+/rWipwXFlSAPeSVqtNjHdfzakgabvzLp7aesG4yQTrO2YQ==",
+            "optional": true,
+            "dependencies": {
+                "@aws-sdk/is-array-buffer": "3.201.0",
+                "@aws-sdk/types": "3.267.0",
+                "@aws-sdk/util-hex-encoding": "3.201.0",
+                "@aws-sdk/util-middleware": "3.267.0",
+                "@aws-sdk/util-uri-escape": "3.201.0",
+                "@aws-sdk/util-utf8": "3.254.0",
+                "tslib": "^2.3.1"
+            },
+            "engines": {
+                "node": ">=14.0.0"
+            }
+        },
+        "node_modules/@aws-sdk/smithy-client": {
+            "version": "3.267.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/smithy-client/-/smithy-client-3.267.0.tgz",
+            "integrity": "sha512-WdgXHqKmFQIkAWETO/I5boX9u6QbMLC4X74OVSBaBLhRjqYmvolMFtNrQzvSKGB3FaxAN9Do41amC0mGoeLC8A==",
+            "optional": true,
+            "dependencies": {
+                "@aws-sdk/middleware-stack": "3.267.0",
+                "@aws-sdk/types": "3.267.0",
+                "tslib": "^2.3.1"
+            },
+            "engines": {
+                "node": ">=14.0.0"
+            }
+        },
+        "node_modules/@aws-sdk/token-providers": {
+            "version": "3.267.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.267.0.tgz",
+            "integrity": "sha512-CGayGrPl4ONG4RuGbNv+QS4oVuItx4hK2FCbFS7d6V7h53rkDrcFd34NsvbicQ2KVFobE7fKs6ZaripJbJbLHA==",
+            "optional": true,
+            "dependencies": {
+                "@aws-sdk/client-sso-oidc": "3.267.0",
+                "@aws-sdk/property-provider": "3.267.0",
+                "@aws-sdk/shared-ini-file-loader": "3.267.0",
+                "@aws-sdk/types": "3.267.0",
+                "tslib": "^2.3.1"
+            },
+            "engines": {
+                "node": ">=14.0.0"
+            }
+        },
+        "node_modules/@aws-sdk/types": {
+            "version": "3.267.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.267.0.tgz",
+            "integrity": "sha512-fICTbSeIfXlTHnciQgDt37R0kXoKxgh0a3prnLWVvTcmf7NFujdZmg5YTAZT3KJJ7SuKsIgnI8azBYioVY8BVQ==",
+            "optional": true,
+            "dependencies": {
+                "tslib": "^2.3.1"
+            },
+            "engines": {
+                "node": ">=14.0.0"
+            }
+        },
+        "node_modules/@aws-sdk/url-parser": {
+            "version": "3.267.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/url-parser/-/url-parser-3.267.0.tgz",
+            "integrity": "sha512-xoQ5Fd11moiE82QTL9GGE6e73SFuD0Wi73tA75TAwKuY12OP5vDJ4oBC86A1G2T+OzeHJQmYyqiA5j48CzqB6A==",
+            "optional": true,
+            "dependencies": {
+                "@aws-sdk/querystring-parser": "3.267.0",
+                "@aws-sdk/types": "3.267.0",
+                "tslib": "^2.3.1"
+            }
+        },
+        "node_modules/@aws-sdk/util-base64": {
+            "version": "3.208.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/util-base64/-/util-base64-3.208.0.tgz",
+            "integrity": "sha512-PQniZph5A6N7uuEOQi+1hnMz/FSOK/8kMFyFO+4DgA1dZ5pcKcn5wiFwHkcTb/BsgVqQa3Jx0VHNnvhlS8JyTg==",
+            "optional": true,
+            "dependencies": {
+                "@aws-sdk/util-buffer-from": "3.208.0",
+                "tslib": "^2.3.1"
+            },
+            "engines": {
+                "node": ">=14.0.0"
+            }
+        },
+        "node_modules/@aws-sdk/util-body-length-browser": {
+            "version": "3.188.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/util-body-length-browser/-/util-body-length-browser-3.188.0.tgz",
+            "integrity": "sha512-8VpnwFWXhnZ/iRSl9mTf+VKOX9wDE8QtN4bj9pBfxwf90H1X7E8T6NkiZD3k+HubYf2J94e7DbeHs7fuCPW5Qg==",
+            "optional": true,
+            "dependencies": {
+                "tslib": "^2.3.1"
+            }
+        },
+        "node_modules/@aws-sdk/util-body-length-node": {
+            "version": "3.208.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/util-body-length-node/-/util-body-length-node-3.208.0.tgz",
+            "integrity": "sha512-3zj50e5g7t/MQf53SsuuSf0hEELzMtD8RX8C76f12OSRo2Bca4FLLYHe0TZbxcfQHom8/hOaeZEyTyMogMglqg==",
+            "optional": true,
+            "dependencies": {
+                "tslib": "^2.3.1"
+            },
+            "engines": {
+                "node": ">=14.0.0"
+            }
+        },
+        "node_modules/@aws-sdk/util-buffer-from": {
+            "version": "3.208.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/util-buffer-from/-/util-buffer-from-3.208.0.tgz",
+            "integrity": "sha512-7L0XUixNEFcLUGPeBF35enCvB9Xl+K6SQsmbrPk1P3mlV9mguWSDQqbOBwY1Ir0OVbD6H/ZOQU7hI/9RtRI0Zw==",
+            "optional": true,
+            "dependencies": {
+                "@aws-sdk/is-array-buffer": "3.201.0",
+                "tslib": "^2.3.1"
+            },
+            "engines": {
+                "node": ">=14.0.0"
+            }
+        },
+        "node_modules/@aws-sdk/util-config-provider": {
+            "version": "3.208.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/util-config-provider/-/util-config-provider-3.208.0.tgz",
+            "integrity": "sha512-DSRqwrERUsT34ug+anlMBIFooBEGwM8GejC7q00Y/9IPrQy50KnG5PW2NiTjuLKNi7pdEOlwTSEocJE15eDZIg==",
+            "optional": true,
+            "dependencies": {
+                "tslib": "^2.3.1"
+            },
+            "engines": {
+                "node": ">=14.0.0"
+            }
+        },
+        "node_modules/@aws-sdk/util-defaults-mode-browser": {
+            "version": "3.267.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/util-defaults-mode-browser/-/util-defaults-mode-browser-3.267.0.tgz",
+            "integrity": "sha512-MgrqpedA58HVR8RpT2A42//5Lb3M0JwEiYlDaA7EvIVsMx1NzO+cng4MDJi03YBAP5hwCVQmO9Sf5Au4dm+m0g==",
+            "optional": true,
+            "dependencies": {
+                "@aws-sdk/property-provider": "3.267.0",
+                "@aws-sdk/types": "3.267.0",
+                "bowser": "^2.11.0",
+                "tslib": "^2.3.1"
+            },
+            "engines": {
+                "node": ">= 10.0.0"
+            }
+        },
+        "node_modules/@aws-sdk/util-defaults-mode-node": {
+            "version": "3.267.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/util-defaults-mode-node/-/util-defaults-mode-node-3.267.0.tgz",
+            "integrity": "sha512-JyFk95T77sGM4q386id/mDt9/7HvoQySAygPyv/lj//WEJJIRKiefB277CKKJPT8nRAsO4mIyAT+YO/xGCxkQA==",
+            "optional": true,
+            "dependencies": {
+                "@aws-sdk/config-resolver": "3.267.0",
+                "@aws-sdk/credential-provider-imds": "3.267.0",
+                "@aws-sdk/node-config-provider": "3.267.0",
+                "@aws-sdk/property-provider": "3.267.0",
+                "@aws-sdk/types": "3.267.0",
+                "tslib": "^2.3.1"
+            },
+            "engines": {
+                "node": ">= 10.0.0"
+            }
+        },
+        "node_modules/@aws-sdk/util-endpoints": {
+            "version": "3.267.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.267.0.tgz",
+            "integrity": "sha512-c6miY83Eo0erqXY+YiS2sOg3izURqvaWHd9przJzBQea9XRCN4ANT2P8AhoC0BPIORutaaOSoCSp/crHG0XLLg==",
+            "optional": true,
+            "dependencies": {
+                "@aws-sdk/types": "3.267.0",
+                "tslib": "^2.3.1"
+            },
+            "engines": {
+                "node": ">=14.0.0"
+            }
+        },
+        "node_modules/@aws-sdk/util-hex-encoding": {
+            "version": "3.201.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/util-hex-encoding/-/util-hex-encoding-3.201.0.tgz",
+            "integrity": "sha512-7t1vR1pVxKx0motd3X9rI3m/xNp78p3sHtP5yo4NP4ARpxyJ0fokBomY8ScaH2D/B+U5o9ARxldJUdMqyBlJcA==",
+            "optional": true,
+            "dependencies": {
+                "tslib": "^2.3.1"
+            },
+            "engines": {
+                "node": ">=14.0.0"
+            }
+        },
+        "node_modules/@aws-sdk/util-locate-window": {
+            "version": "3.208.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/util-locate-window/-/util-locate-window-3.208.0.tgz",
+            "integrity": "sha512-iua1A2+P7JJEDHVgvXrRJSvsnzG7stYSGQnBVphIUlemwl6nN5D+QrgbjECtrbxRz8asYFHSzhdhECqN+tFiBg==",
+            "optional": true,
+            "dependencies": {
+                "tslib": "^2.3.1"
+            },
+            "engines": {
+                "node": ">=14.0.0"
+            }
+        },
+        "node_modules/@aws-sdk/util-middleware": {
+            "version": "3.267.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/util-middleware/-/util-middleware-3.267.0.tgz",
+            "integrity": "sha512-7nvqBZVz3RdwYv6lU958g6sWI2Qt8lzxDVn0uwfnPH+fAiX7Ln1Hen2A0XeW5cL5uYUJy6wNM5cyfTzFZosE0A==",
+            "optional": true,
+            "dependencies": {
+                "tslib": "^2.3.1"
+            },
+            "engines": {
+                "node": ">=14.0.0"
+            }
+        },
+        "node_modules/@aws-sdk/util-retry": {
+            "version": "3.267.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/util-retry/-/util-retry-3.267.0.tgz",
+            "integrity": "sha512-ZXo1ICG2HgxkIZWlnPteh2R90kwmhRwvbP282CwrrYgTKuMZmW2R/+o6vqhWyPkjoNFN/pno0FxuDA3IYau3Sw==",
+            "optional": true,
+            "dependencies": {
+                "@aws-sdk/service-error-classification": "3.267.0",
+                "tslib": "^2.3.1"
+            },
+            "engines": {
+                "node": ">= 14.0.0"
+            }
+        },
+        "node_modules/@aws-sdk/util-uri-escape": {
+            "version": "3.201.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/util-uri-escape/-/util-uri-escape-3.201.0.tgz",
+            "integrity": "sha512-TeTWbGx4LU2c5rx0obHeDFeO9HvwYwQtMh1yniBz00pQb6Qt6YVOETVQikRZ+XRQwEyCg/dA375UplIpiy54mA==",
+            "optional": true,
+            "dependencies": {
+                "tslib": "^2.3.1"
+            },
+            "engines": {
+                "node": ">=14.0.0"
+            }
+        },
+        "node_modules/@aws-sdk/util-user-agent-browser": {
+            "version": "3.267.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.267.0.tgz",
+            "integrity": "sha512-SmI6xInnPPa0gFhCqhtWOUMTxLeRbm7X5HXzeprhK1d8aNNlUVyALAV7K8ovIjnv3a97lIJSekyb78oTuYITCA==",
+            "optional": true,
+            "dependencies": {
+                "@aws-sdk/types": "3.267.0",
+                "bowser": "^2.11.0",
+                "tslib": "^2.3.1"
+            }
+        },
+        "node_modules/@aws-sdk/util-user-agent-node": {
+            "version": "3.267.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.267.0.tgz",
+            "integrity": "sha512-nfmyffA1yIypJ30CIMO6Tc16t8dFJzdztzoowjmnfb8/LzTZECERM3GICq0DvZDPfSo+jbuz634VtS2K7tVZjA==",
+            "optional": true,
+            "dependencies": {
+                "@aws-sdk/node-config-provider": "3.267.0",
+                "@aws-sdk/types": "3.267.0",
+                "tslib": "^2.3.1"
+            },
+            "engines": {
+                "node": ">=14.0.0"
+            },
+            "peerDependencies": {
+                "aws-crt": ">=1.0.0"
+            },
+            "peerDependenciesMeta": {
+                "aws-crt": {
+                    "optional": true
+                }
+            }
+        },
+        "node_modules/@aws-sdk/util-utf8": {
+            "version": "3.254.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/util-utf8/-/util-utf8-3.254.0.tgz",
+            "integrity": "sha512-14Kso/eIt5/qfIBmhEL9L1IfyUqswjSTqO2mY7KOzUZ9SZbwn3rpxmtkhmATkRjD7XIlLKaxBkI7tU9Zjzj8Kw==",
+            "optional": true,
+            "dependencies": {
+                "@aws-sdk/util-buffer-from": "3.208.0",
+                "tslib": "^2.3.1"
+            },
+            "engines": {
+                "node": ">=14.0.0"
+            }
+        },
+        "node_modules/@aws-sdk/util-utf8-browser": {
+            "version": "3.259.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/util-utf8-browser/-/util-utf8-browser-3.259.0.tgz",
+            "integrity": "sha512-UvFa/vR+e19XookZF8RzFZBrw2EUkQWxiBW0yYQAhvk3C+QVGl0H3ouca8LDBlBfQKXwmW3huo/59H8rwb1wJw==",
+            "optional": true,
+            "dependencies": {
+                "tslib": "^2.3.1"
+            }
+        },
         "node_modules/@azure/abort-controller": {
             "version": "1.1.0",
             "resolved": "https://registry.npmjs.org/@azure/abort-controller/-/abort-controller-1.1.0.tgz",
@@ -192,9 +1265,9 @@
             }
         },
         "node_modules/@azure/core-client": {
-            "version": "1.6.1",
-            "resolved": "https://registry.npmjs.org/@azure/core-client/-/core-client-1.6.1.tgz",
-            "integrity": "sha512-mZ1MSKhZBYoV8GAWceA+PEJFWV2VpdNSpxxcj1wjIAOi00ykRuIQChT99xlQGZWLY3/NApWhSImlFwsmCEs4vA==",
+            "version": "1.7.1",
+            "resolved": "https://registry.npmjs.org/@azure/core-client/-/core-client-1.7.1.tgz",
+            "integrity": "sha512-85igXpc5V7ns6rvMEpLmIcBDftjUgTWD+0tmYPyQEfPfkAwpPTs1X5rhCDsfqvUZGA8Ksid1hdZGu62r6XXeHg==",
             "dependencies": {
                 "@azure/abort-controller": "^1.0.0",
                 "@azure/core-auth": "^1.4.0",
@@ -205,7 +1278,7 @@
                 "tslib": "^2.2.0"
             },
             "engines": {
-                "node": ">=12.0.0"
+                "node": ">=14.0.0"
             }
         },
         "node_modules/@azure/core-http-compat": {
@@ -222,22 +1295,22 @@
             }
         },
         "node_modules/@azure/core-lro": {
-            "version": "2.4.0",
-            "resolved": "https://registry.npmjs.org/@azure/core-lro/-/core-lro-2.4.0.tgz",
-            "integrity": "sha512-F65+rYkll1dpw3RGm8/SSiSj+/QkMeYDanzS/QKlM1dmuneVyXbO46C88V1MRHluLGdMP6qfD3vDRYALn0z0tQ==",
+            "version": "2.5.1",
+            "resolved": "https://registry.npmjs.org/@azure/core-lro/-/core-lro-2.5.1.tgz",
+            "integrity": "sha512-JHQy/bA3NOz2WuzOi5zEk6n/TJdAropupxUT521JIJvW7EXV2YN2SFYZrf/2RHeD28QAClGdynYadZsbmP+nyQ==",
             "dependencies": {
                 "@azure/abort-controller": "^1.0.0",
                 "@azure/logger": "^1.0.0",
                 "tslib": "^2.2.0"
             },
             "engines": {
-                "node": ">=12.0.0"
+                "node": ">=14.0.0"
             }
         },
         "node_modules/@azure/core-paging": {
-            "version": "1.4.0",
-            "resolved": "https://registry.npmjs.org/@azure/core-paging/-/core-paging-1.4.0.tgz",
-            "integrity": "sha512-tabFtZTg8D9XqZKEfNUOGh63SuYeOxmvH4GDcOJN+R1bZWZ1FZskctgY9Pmuwzhn+0Xvq9rmimK9hsvtLkeBsw==",
+            "version": "1.5.0",
+            "resolved": "https://registry.npmjs.org/@azure/core-paging/-/core-paging-1.5.0.tgz",
+            "integrity": "sha512-zqWdVIt+2Z+3wqxEOGzR5hXFZ8MGKK52x4vFLw8n58pR6ZfKRx3EXYTxTaYxYHc/PexPUTyimcTWFJbji9Z6Iw==",
             "dependencies": {
                 "tslib": "^2.2.0"
             },
@@ -246,9 +1319,9 @@
             }
         },
         "node_modules/@azure/core-rest-pipeline": {
-            "version": "1.10.0",
-            "resolved": "https://registry.npmjs.org/@azure/core-rest-pipeline/-/core-rest-pipeline-1.10.0.tgz",
-            "integrity": "sha512-m6c4iAalfaf6sytOOQhLKFprEHSkSjQuRgkW7MTMnAN+GENDDL4XZJp7WKFnq9VpKUE+ggq+rp5xX9GI93lumw==",
+            "version": "1.10.1",
+            "resolved": "https://registry.npmjs.org/@azure/core-rest-pipeline/-/core-rest-pipeline-1.10.1.tgz",
+            "integrity": "sha512-Kji9k6TOFRDB5ZMTw8qUf2IJ+CeJtsuMdAHox9eqpTf1cefiNMpzrfnF6sINEBZJsaVaWgQ0o48B6kcUH68niA==",
             "dependencies": {
                 "@azure/abort-controller": "^1.0.0",
                 "@azure/core-auth": "^1.4.0",
@@ -366,20 +1439,20 @@
             }
         },
         "node_modules/@azure/msal-browser": {
-            "version": "2.32.0",
-            "resolved": "https://registry.npmjs.org/@azure/msal-browser/-/msal-browser-2.32.0.tgz",
-            "integrity": "sha512-uDP0vNmIefM6+RjILGKu+zOiN+VGnEvxRfUIV5hOWOWLLkG7kcDPYG/v/EJMoG+R5DYW9jXA5nvZT76t5HdEAQ==",
+            "version": "2.33.0",
+            "resolved": "https://registry.npmjs.org/@azure/msal-browser/-/msal-browser-2.33.0.tgz",
+            "integrity": "sha512-c7CVh1tfUfxiWkEIhoIb11hL4PGo4hz0M+gMy34ATagAKdLK7qyEu/5AXJWAf5lz5eE+vQhm7+LKiuETrcXXGw==",
             "dependencies": {
-                "@azure/msal-common": "^9.0.0"
+                "@azure/msal-common": "^10.0.0"
             },
             "engines": {
                 "node": ">=0.8.0"
             }
         },
         "node_modules/@azure/msal-browser/node_modules/@azure/msal-common": {
-            "version": "9.0.0",
-            "resolved": "https://registry.npmjs.org/@azure/msal-common/-/msal-common-9.0.0.tgz",
-            "integrity": "sha512-uiFiFKVNTsRpmKio5bcObTuHcaHHZB2GEsjJJN8rbJNmzoYuZzNioOoK+J0QK0jEasRBgAoR5A8hSty2iKRzIg==",
+            "version": "10.0.0",
+            "resolved": "https://registry.npmjs.org/@azure/msal-common/-/msal-common-10.0.0.tgz",
+            "integrity": "sha512-/LghpT93jsZLy55QzTsRZWMx6R1Mjc1Aktwps8sKSGE3WbrGwbSsh2uhDlpl6FMcKChYjJ0ochThWwwOodrQNg==",
             "engines": {
                 "node": ">=0.8.0"
             }
@@ -393,12 +1466,12 @@
             }
         },
         "node_modules/@azure/msal-node": {
-            "version": "1.14.4",
-            "resolved": "https://registry.npmjs.org/@azure/msal-node/-/msal-node-1.14.4.tgz",
-            "integrity": "sha512-j9GzZu5mTLWtuJ+cYN6e67UNymIS5OysblrOzH8lakt9XxH0GCPYjuqbOEKTP84r+Rbj3io+TuW1KS+0Xxuj/g==",
+            "version": "1.15.0",
+            "resolved": "https://registry.npmjs.org/@azure/msal-node/-/msal-node-1.15.0.tgz",
+            "integrity": "sha512-fwC5M0c8pxOAzmScPbpx7j28YVTDebUaizlVF7bR0xvlU0r3VWW5OobCcr9ybqKS6wGyO7u4EhXJS9rjRWAuwA==",
             "dependencies": {
-                "@azure/msal-common": "^9.0.0",
-                "jsonwebtoken": "^8.5.1",
+                "@azure/msal-common": "^10.0.0",
+                "jsonwebtoken": "^9.0.0",
                 "uuid": "^8.3.0"
             },
             "engines": {
@@ -406,9 +1479,9 @@
             }
         },
         "node_modules/@azure/msal-node/node_modules/@azure/msal-common": {
-            "version": "9.0.0",
-            "resolved": "https://registry.npmjs.org/@azure/msal-common/-/msal-common-9.0.0.tgz",
-            "integrity": "sha512-uiFiFKVNTsRpmKio5bcObTuHcaHHZB2GEsjJJN8rbJNmzoYuZzNioOoK+J0QK0jEasRBgAoR5A8hSty2iKRzIg==",
+            "version": "10.0.0",
+            "resolved": "https://registry.npmjs.org/@azure/msal-common/-/msal-common-10.0.0.tgz",
+            "integrity": "sha512-/LghpT93jsZLy55QzTsRZWMx6R1Mjc1Aktwps8sKSGE3WbrGwbSsh2uhDlpl6FMcKChYjJ0ochThWwwOodrQNg==",
             "engines": {
                 "node": ">=0.8.0"
             }
@@ -426,34 +1499,34 @@
             }
         },
         "node_modules/@babel/compat-data": {
-            "version": "7.20.1",
-            "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.20.1.tgz",
-            "integrity": "sha512-EWZ4mE2diW3QALKvDMiXnbZpRvlj+nayZ112nK93SnhqOtpdsbVD4W+2tEoT3YNBAG9RBR0ISY758ZkOgsn6pQ==",
+            "version": "7.20.14",
+            "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.20.14.tgz",
+            "integrity": "sha512-0YpKHD6ImkWMEINCyDAD0HLLUH/lPCefG8ld9it8DJB2wnApraKuhgYTvTY1z7UFIfBTGy5LwncZ+5HWWGbhFw==",
             "dev": true,
             "engines": {
                 "node": ">=6.9.0"
             }
         },
         "node_modules/@babel/core": {
-            "version": "7.20.2",
-            "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.20.2.tgz",
-            "integrity": "sha512-w7DbG8DtMrJcFOi4VrLm+8QM4az8Mo+PuLBKLp2zrYRCow8W/f9xiXm5sN53C8HksCyDQwCKha9JiDoIyPjT2g==",
+            "version": "7.20.12",
+            "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.20.12.tgz",
+            "integrity": "sha512-XsMfHovsUYHFMdrIHkZphTN/2Hzzi78R08NuHfDBehym2VsPDL6Zn/JAD/JQdnRvbSsbQc4mVaU1m6JgtTEElg==",
             "dev": true,
             "dependencies": {
                 "@ampproject/remapping": "^2.1.0",
                 "@babel/code-frame": "^7.18.6",
-                "@babel/generator": "^7.20.2",
-                "@babel/helper-compilation-targets": "^7.20.0",
-                "@babel/helper-module-transforms": "^7.20.2",
-                "@babel/helpers": "^7.20.1",
-                "@babel/parser": "^7.20.2",
-                "@babel/template": "^7.18.10",
-                "@babel/traverse": "^7.20.1",
-                "@babel/types": "^7.20.2",
+                "@babel/generator": "^7.20.7",
+                "@babel/helper-compilation-targets": "^7.20.7",
+                "@babel/helper-module-transforms": "^7.20.11",
+                "@babel/helpers": "^7.20.7",
+                "@babel/parser": "^7.20.7",
+                "@babel/template": "^7.20.7",
+                "@babel/traverse": "^7.20.12",
+                "@babel/types": "^7.20.7",
                 "convert-source-map": "^1.7.0",
                 "debug": "^4.1.0",
                 "gensync": "^1.0.0-beta.2",
-                "json5": "^2.2.1",
+                "json5": "^2.2.2",
                 "semver": "^6.3.0"
             },
             "engines": {
@@ -483,12 +1556,12 @@
             }
         },
         "node_modules/@babel/generator": {
-            "version": "7.20.4",
-            "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.20.4.tgz",
-            "integrity": "sha512-luCf7yk/cm7yab6CAW1aiFnmEfBJplb/JojV56MYEK7ziWfGmFlTfmL9Ehwfy4gFhbjBfWO1wj7/TuSbVNEEtA==",
+            "version": "7.20.14",
+            "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.20.14.tgz",
+            "integrity": "sha512-AEmuXHdcD3A52HHXxaTmYlb8q/xMEhoRP67B3T4Oq7lbmSoqroMZzjnGj3+i1io3pdnF8iBYVu4Ilj+c4hBxYg==",
             "dev": true,
             "dependencies": {
-                "@babel/types": "^7.20.2",
+                "@babel/types": "^7.20.7",
                 "@jridgewell/gen-mapping": "^0.3.2",
                 "jsesc": "^2.5.1"
             },
@@ -534,14 +1607,15 @@
             }
         },
         "node_modules/@babel/helper-compilation-targets": {
-            "version": "7.20.0",
-            "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.0.tgz",
-            "integrity": "sha512-0jp//vDGp9e8hZzBc6N/KwA5ZK3Wsm/pfm4CrY7vzegkVxc65SgSn6wYOnwHe9Js9HRQ1YTCKLGPzDtaS3RoLQ==",
+            "version": "7.20.7",
+            "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.7.tgz",
+            "integrity": "sha512-4tGORmfQcrc+bvrjb5y3dG9Mx1IOZjsHqQVUz7XCNHO+iTmqxWnVg3KRygjGmpRLJGdQSKuvFinbIb0CnZwHAQ==",
             "dev": true,
             "dependencies": {
-                "@babel/compat-data": "^7.20.0",
+                "@babel/compat-data": "^7.20.5",
                 "@babel/helper-validator-option": "^7.18.6",
                 "browserslist": "^4.21.3",
+                "lru-cache": "^5.1.1",
                 "semver": "^6.3.0"
             },
             "engines": {
@@ -552,17 +1626,18 @@
             }
         },
         "node_modules/@babel/helper-create-class-features-plugin": {
-            "version": "7.20.2",
-            "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.20.2.tgz",
-            "integrity": "sha512-k22GoYRAHPYr9I+Gvy2ZQlAe5mGy8BqWst2wRt8cwIufWTxrsVshhIBvYNqC80N0GSFWTsqRVexOtfzlgOEDvA==",
+            "version": "7.20.12",
+            "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.20.12.tgz",
+            "integrity": "sha512-9OunRkbT0JQcednL0UFvbfXpAsUXiGjUk0a7sN8fUXX7Mue79cUSMjHGDRRi/Vz9vYlpIhLV5fMD5dKoMhhsNQ==",
             "dev": true,
             "dependencies": {
                 "@babel/helper-annotate-as-pure": "^7.18.6",
                 "@babel/helper-environment-visitor": "^7.18.9",
                 "@babel/helper-function-name": "^7.19.0",
-                "@babel/helper-member-expression-to-functions": "^7.18.9",
+                "@babel/helper-member-expression-to-functions": "^7.20.7",
                 "@babel/helper-optimise-call-expression": "^7.18.6",
-                "@babel/helper-replace-supers": "^7.19.1",
+                "@babel/helper-replace-supers": "^7.20.7",
+                "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0",
                 "@babel/helper-split-export-declaration": "^7.18.6"
             },
             "engines": {
@@ -573,13 +1648,13 @@
             }
         },
         "node_modules/@babel/helper-create-regexp-features-plugin": {
-            "version": "7.19.0",
-            "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.19.0.tgz",
-            "integrity": "sha512-htnV+mHX32DF81amCDrwIDr8nrp1PTm+3wfBN9/v8QJOLEioOCOG7qNyq0nHeFiWbT3Eb7gsPwEmV64UCQ1jzw==",
+            "version": "7.20.5",
+            "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.20.5.tgz",
+            "integrity": "sha512-m68B1lkg3XDGX5yCvGO0kPx3v9WIYLnzjKfPcQiwntEQa5ZeRkPmo2X/ISJc8qxWGfwUr+kvZAeEzAwLec2r2w==",
             "dev": true,
             "dependencies": {
                 "@babel/helper-annotate-as-pure": "^7.18.6",
-                "regexpu-core": "^5.1.0"
+                "regexpu-core": "^5.2.1"
             },
             "engines": {
                 "node": ">=6.9.0"
@@ -652,12 +1727,12 @@
             }
         },
         "node_modules/@babel/helper-member-expression-to-functions": {
-            "version": "7.18.9",
-            "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.18.9.tgz",
-            "integrity": "sha512-RxifAh2ZoVU67PyKIO4AMi1wTenGfMR/O/ae0CCRqwgBAt5v7xjdtRw7UoSbsreKrQn5t7r89eruK/9JjYHuDg==",
+            "version": "7.20.7",
+            "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.20.7.tgz",
+            "integrity": "sha512-9J0CxJLq315fEdi4s7xK5TQaNYjZw+nDVpVqr1axNGKzdrdwYBD5b4uKv3n75aABG0rCCTK8Im8Ww7eYfMrZgw==",
             "dev": true,
             "dependencies": {
-                "@babel/types": "^7.18.9"
+                "@babel/types": "^7.20.7"
             },
             "engines": {
                 "node": ">=6.9.0"
@@ -676,9 +1751,9 @@
             }
         },
         "node_modules/@babel/helper-module-transforms": {
-            "version": "7.20.2",
-            "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.20.2.tgz",
-            "integrity": "sha512-zvBKyJXRbmK07XhMuujYoJ48B5yvvmM6+wcpv6Ivj4Yg6qO7NOZOSnvZN9CRl1zz1Z4cKf8YejmCMh8clOoOeA==",
+            "version": "7.20.11",
+            "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.20.11.tgz",
+            "integrity": "sha512-uRy78kN4psmji1s2QtbtcCSaj/LILFDp0f/ymhpQH5QY3nljUZCaNWz9X1dEj/8MBdBEFECs7yRhKn8i7NjZgg==",
             "dev": true,
             "dependencies": {
                 "@babel/helper-environment-visitor": "^7.18.9",
@@ -686,9 +1761,9 @@
                 "@babel/helper-simple-access": "^7.20.2",
                 "@babel/helper-split-export-declaration": "^7.18.6",
                 "@babel/helper-validator-identifier": "^7.19.1",
-                "@babel/template": "^7.18.10",
-                "@babel/traverse": "^7.20.1",
-                "@babel/types": "^7.20.2"
+                "@babel/template": "^7.20.7",
+                "@babel/traverse": "^7.20.10",
+                "@babel/types": "^7.20.7"
             },
             "engines": {
                 "node": ">=6.9.0"
@@ -734,16 +1809,17 @@
             }
         },
         "node_modules/@babel/helper-replace-supers": {
-            "version": "7.19.1",
-            "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.19.1.tgz",
-            "integrity": "sha512-T7ahH7wV0Hfs46SFh5Jz3s0B6+o8g3c+7TMxu7xKfmHikg7EAZ3I2Qk9LFhjxXq8sL7UkP5JflezNwoZa8WvWw==",
+            "version": "7.20.7",
+            "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.20.7.tgz",
+            "integrity": "sha512-vujDMtB6LVfNW13jhlCrp48QNslK6JXi7lQG736HVbHz/mbf4Dc7tIRh1Xf5C0rF7BP8iiSxGMCmY6Ci1ven3A==",
             "dev": true,
             "dependencies": {
                 "@babel/helper-environment-visitor": "^7.18.9",
-                "@babel/helper-member-expression-to-functions": "^7.18.9",
+                "@babel/helper-member-expression-to-functions": "^7.20.7",
                 "@babel/helper-optimise-call-expression": "^7.18.6",
-                "@babel/traverse": "^7.19.1",
-                "@babel/types": "^7.19.0"
+                "@babel/template": "^7.20.7",
+                "@babel/traverse": "^7.20.7",
+                "@babel/types": "^7.20.7"
             },
             "engines": {
                 "node": ">=6.9.0"
@@ -813,29 +1889,29 @@
             }
         },
         "node_modules/@babel/helper-wrap-function": {
-            "version": "7.19.0",
-            "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.19.0.tgz",
-            "integrity": "sha512-txX8aN8CZyYGTwcLhlk87KRqncAzhh5TpQamZUa0/u3an36NtDpUP6bQgBCBcLeBs09R/OwQu3OjK0k/HwfNDg==",
+            "version": "7.20.5",
+            "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.20.5.tgz",
+            "integrity": "sha512-bYMxIWK5mh+TgXGVqAtnu5Yn1un+v8DDZtqyzKRLUzrh70Eal2O3aZ7aPYiMADO4uKlkzOiRiZ6GX5q3qxvW9Q==",
             "dev": true,
             "dependencies": {
                 "@babel/helper-function-name": "^7.19.0",
                 "@babel/template": "^7.18.10",
-                "@babel/traverse": "^7.19.0",
-                "@babel/types": "^7.19.0"
+                "@babel/traverse": "^7.20.5",
+                "@babel/types": "^7.20.5"
             },
             "engines": {
                 "node": ">=6.9.0"
             }
         },
         "node_modules/@babel/helpers": {
-            "version": "7.20.1",
-            "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.20.1.tgz",
-            "integrity": "sha512-J77mUVaDTUJFZ5BpP6mMn6OIl3rEWymk2ZxDBQJUG3P+PbmyMcF3bYWvz0ma69Af1oobDqT/iAsvzhB58xhQUg==",
+            "version": "7.20.13",
+            "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.20.13.tgz",
+            "integrity": "sha512-nzJ0DWCL3gB5RCXbUO3KIMMsBY2Eqbx8mBpKGE/02PgyRQFcPQLbkQ1vyy596mZLaP+dAfD+R4ckASzNVmW3jg==",
             "dev": true,
             "dependencies": {
-                "@babel/template": "^7.18.10",
-                "@babel/traverse": "^7.20.1",
-                "@babel/types": "^7.20.0"
+                "@babel/template": "^7.20.7",
+                "@babel/traverse": "^7.20.13",
+                "@babel/types": "^7.20.7"
             },
             "engines": {
                 "node": ">=6.9.0"
@@ -856,9 +1932,9 @@
             }
         },
         "node_modules/@babel/parser": {
-            "version": "7.20.3",
-            "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.20.3.tgz",
-            "integrity": "sha512-OP/s5a94frIPXwjzEcv5S/tpQfc6XhxYUnmWpgdqMWGgYCuErA3SzozaRAMQgSZWKeTJxht9aWAkUY+0UzvOFg==",
+            "version": "7.20.15",
+            "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.20.15.tgz",
+            "integrity": "sha512-DI4a1oZuf8wC+oAJA9RW6ga3Zbe8RZFt7kD9i4qAspz3I/yHet1VvC3DiSy/fsUvv5pvJuNPh0LPOdCcqinDPg==",
             "dev": true,
             "bin": {
                 "parser": "bin/babel-parser.js"
@@ -883,14 +1959,14 @@
             }
         },
         "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": {
-            "version": "7.18.9",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.18.9.tgz",
-            "integrity": "sha512-AHrP9jadvH7qlOj6PINbgSuphjQUAK7AOT7DPjBo9EHoLhQTnnK5u45e1Hd4DbSQEO9nqPWtQ89r+XEOWFScKg==",
+            "version": "7.20.7",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.20.7.tgz",
+            "integrity": "sha512-sbr9+wNE5aXMBBFBICk01tt7sBf2Oc9ikRFEcem/ZORup9IMUdNhW7/wVLEbbtlWOsEubJet46mHAL2C8+2jKQ==",
             "dev": true,
             "dependencies": {
-                "@babel/helper-plugin-utils": "^7.18.9",
-                "@babel/helper-skip-transparent-expression-wrappers": "^7.18.9",
-                "@babel/plugin-proposal-optional-chaining": "^7.18.9"
+                "@babel/helper-plugin-utils": "^7.20.2",
+                "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0",
+                "@babel/plugin-proposal-optional-chaining": "^7.20.7"
             },
             "engines": {
                 "node": ">=6.9.0"
@@ -900,13 +1976,13 @@
             }
         },
         "node_modules/@babel/plugin-proposal-async-generator-functions": {
-            "version": "7.20.1",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.20.1.tgz",
-            "integrity": "sha512-Gh5rchzSwE4kC+o/6T8waD0WHEQIsDmjltY8WnWRXHUdH8axZhuH86Ov9M72YhJfDrZseQwuuWaaIT/TmePp3g==",
+            "version": "7.20.7",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.20.7.tgz",
+            "integrity": "sha512-xMbiLsn/8RK7Wq7VeVytytS2L6qE69bXPB10YCmMdDZbKF4okCqY74pI/jJQ/8U0b/F6NrT2+14b8/P9/3AMGA==",
             "dev": true,
             "dependencies": {
                 "@babel/helper-environment-visitor": "^7.18.9",
-                "@babel/helper-plugin-utils": "^7.19.0",
+                "@babel/helper-plugin-utils": "^7.20.2",
                 "@babel/helper-remap-async-to-generator": "^7.18.9",
                 "@babel/plugin-syntax-async-generators": "^7.8.4"
             },
@@ -934,13 +2010,13 @@
             }
         },
         "node_modules/@babel/plugin-proposal-class-static-block": {
-            "version": "7.18.6",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.18.6.tgz",
-            "integrity": "sha512-+I3oIiNxrCpup3Gi8n5IGMwj0gOCAjcJUSQEcotNnCCPMEnixawOQ+KeJPlgfjzx+FKQ1QSyZOWe7wmoJp7vhw==",
+            "version": "7.20.7",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.20.7.tgz",
+            "integrity": "sha512-AveGOoi9DAjUYYuUAG//Ig69GlazLnoyzMw68VCDux+c1tsnnH/OkYcpz/5xzMkEFC6UxjR5Gw1c+iY2wOGVeQ==",
             "dev": true,
             "dependencies": {
-                "@babel/helper-create-class-features-plugin": "^7.18.6",
-                "@babel/helper-plugin-utils": "^7.18.6",
+                "@babel/helper-create-class-features-plugin": "^7.20.7",
+                "@babel/helper-plugin-utils": "^7.20.2",
                 "@babel/plugin-syntax-class-static-block": "^7.14.5"
             },
             "engines": {
@@ -999,12 +2075,12 @@
             }
         },
         "node_modules/@babel/plugin-proposal-logical-assignment-operators": {
-            "version": "7.18.9",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.18.9.tgz",
-            "integrity": "sha512-128YbMpjCrP35IOExw2Fq+x55LMP42DzhOhX2aNNIdI9avSWl2PI0yuBWarr3RYpZBSPtabfadkH2yeRiMD61Q==",
+            "version": "7.20.7",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.20.7.tgz",
+            "integrity": "sha512-y7C7cZgpMIjWlKE5T7eJwp+tnRYM89HmRvWM5EQuB5BoHEONjmQ8lSNmBUwOyy/GFRsohJED51YBF79hE1djug==",
             "dev": true,
             "dependencies": {
-                "@babel/helper-plugin-utils": "^7.18.9",
+                "@babel/helper-plugin-utils": "^7.20.2",
                 "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4"
             },
             "engines": {
@@ -1047,16 +2123,16 @@
             }
         },
         "node_modules/@babel/plugin-proposal-object-rest-spread": {
-            "version": "7.20.2",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.20.2.tgz",
-            "integrity": "sha512-Ks6uej9WFK+fvIMesSqbAto5dD8Dz4VuuFvGJFKgIGSkJuRGcrwGECPA1fDgQK3/DbExBJpEkTeYeB8geIFCSQ==",
+            "version": "7.20.7",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.20.7.tgz",
+            "integrity": "sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg==",
             "dev": true,
             "dependencies": {
-                "@babel/compat-data": "^7.20.1",
-                "@babel/helper-compilation-targets": "^7.20.0",
+                "@babel/compat-data": "^7.20.5",
+                "@babel/helper-compilation-targets": "^7.20.7",
                 "@babel/helper-plugin-utils": "^7.20.2",
                 "@babel/plugin-syntax-object-rest-spread": "^7.8.3",
-                "@babel/plugin-transform-parameters": "^7.20.1"
+                "@babel/plugin-transform-parameters": "^7.20.7"
             },
             "engines": {
                 "node": ">=6.9.0"
@@ -1082,13 +2158,13 @@
             }
         },
         "node_modules/@babel/plugin-proposal-optional-chaining": {
-            "version": "7.18.9",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.18.9.tgz",
-            "integrity": "sha512-v5nwt4IqBXihxGsW2QmCWMDS3B3bzGIk/EQVZz2ei7f3NJl8NzAJVvUmpDW5q1CRNY+Beb/k58UAH1Km1N411w==",
+            "version": "7.20.7",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.20.7.tgz",
+            "integrity": "sha512-T+A7b1kfjtRM51ssoOfS1+wbyCVqorfyZhT99TvxxLMirPShD8CzKMRepMlCBGM5RpHMbn8s+5MMHnPstJH6mQ==",
             "dev": true,
             "dependencies": {
-                "@babel/helper-plugin-utils": "^7.18.9",
-                "@babel/helper-skip-transparent-expression-wrappers": "^7.18.9",
+                "@babel/helper-plugin-utils": "^7.20.2",
+                "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0",
                 "@babel/plugin-syntax-optional-chaining": "^7.8.3"
             },
             "engines": {
@@ -1115,14 +2191,14 @@
             }
         },
         "node_modules/@babel/plugin-proposal-private-property-in-object": {
-            "version": "7.18.6",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.18.6.tgz",
-            "integrity": "sha512-9Rysx7FOctvT5ouj5JODjAFAkgGoudQuLPamZb0v1TGLpapdNaftzifU8NTWQm0IRjqoYypdrSmyWgkocDQ8Dw==",
+            "version": "7.20.5",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.20.5.tgz",
+            "integrity": "sha512-Vq7b9dUA12ByzB4EjQTPo25sFhY+08pQDBSZRtUAkj7lb7jahaHR5igera16QZ+3my1nYR4dKsNdYj5IjPHilQ==",
             "dev": true,
             "dependencies": {
                 "@babel/helper-annotate-as-pure": "^7.18.6",
-                "@babel/helper-create-class-features-plugin": "^7.18.6",
-                "@babel/helper-plugin-utils": "^7.18.6",
+                "@babel/helper-create-class-features-plugin": "^7.20.5",
+                "@babel/helper-plugin-utils": "^7.20.2",
                 "@babel/plugin-syntax-private-property-in-object": "^7.14.5"
             },
             "engines": {
@@ -1380,12 +2456,12 @@
             }
         },
         "node_modules/@babel/plugin-transform-arrow-functions": {
-            "version": "7.18.6",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.18.6.tgz",
-            "integrity": "sha512-9S9X9RUefzrsHZmKMbDXxweEH+YlE8JJEuat9FdvW9Qh1cw7W64jELCtWNkPBPX5En45uy28KGvA/AySqUh8CQ==",
+            "version": "7.20.7",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.20.7.tgz",
+            "integrity": "sha512-3poA5E7dzDomxj9WXWwuD6A5F3kc7VXwIJO+E+J8qtDtS+pXPAhrgEyh+9GBwBgPq1Z+bB+/JD60lp5jsN7JPQ==",
             "dev": true,
             "dependencies": {
-                "@babel/helper-plugin-utils": "^7.18.6"
+                "@babel/helper-plugin-utils": "^7.20.2"
             },
             "engines": {
                 "node": ">=6.9.0"
@@ -1395,14 +2471,14 @@
             }
         },
         "node_modules/@babel/plugin-transform-async-to-generator": {
-            "version": "7.18.6",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.18.6.tgz",
-            "integrity": "sha512-ARE5wZLKnTgPW7/1ftQmSi1CmkqqHo2DNmtztFhvgtOWSDfq0Cq9/9L+KnZNYSNrydBekhW3rwShduf59RoXag==",
+            "version": "7.20.7",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.20.7.tgz",
+            "integrity": "sha512-Uo5gwHPT9vgnSXQxqGtpdufUiWp96gk7yiP4Mp5bm1QMkEmLXBO7PAGYbKoJ6DhAwiNkcHFBol/x5zZZkL/t0Q==",
             "dev": true,
             "dependencies": {
                 "@babel/helper-module-imports": "^7.18.6",
-                "@babel/helper-plugin-utils": "^7.18.6",
-                "@babel/helper-remap-async-to-generator": "^7.18.6"
+                "@babel/helper-plugin-utils": "^7.20.2",
+                "@babel/helper-remap-async-to-generator": "^7.18.9"
             },
             "engines": {
                 "node": ">=6.9.0"
@@ -1427,9 +2503,9 @@
             }
         },
         "node_modules/@babel/plugin-transform-block-scoping": {
-            "version": "7.20.2",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.20.2.tgz",
-            "integrity": "sha512-y5V15+04ry69OV2wULmwhEA6jwSWXO1TwAtIwiPXcvHcoOQUqpyMVd2bDsQJMW8AurjulIyUV8kDqtjSwHy1uQ==",
+            "version": "7.20.15",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.20.15.tgz",
+            "integrity": "sha512-Vv4DMZ6MiNOhu/LdaZsT/bsLRxgL94d269Mv4R/9sp6+Mp++X/JqypZYypJXLlM4mlL352/Egzbzr98iABH1CA==",
             "dev": true,
             "dependencies": {
                 "@babel/helper-plugin-utils": "^7.20.2"
@@ -1442,18 +2518,18 @@
             }
         },
         "node_modules/@babel/plugin-transform-classes": {
-            "version": "7.20.2",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.20.2.tgz",
-            "integrity": "sha512-9rbPp0lCVVoagvtEyQKSo5L8oo0nQS/iif+lwlAz29MccX2642vWDlSZK+2T2buxbopotId2ld7zZAzRfz9j1g==",
+            "version": "7.20.7",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.20.7.tgz",
+            "integrity": "sha512-LWYbsiXTPKl+oBlXUGlwNlJZetXD5Am+CyBdqhPsDVjM9Jc8jwBJFrKhHf900Kfk2eZG1y9MAG3UNajol7A4VQ==",
             "dev": true,
             "dependencies": {
                 "@babel/helper-annotate-as-pure": "^7.18.6",
-                "@babel/helper-compilation-targets": "^7.20.0",
+                "@babel/helper-compilation-targets": "^7.20.7",
                 "@babel/helper-environment-visitor": "^7.18.9",
                 "@babel/helper-function-name": "^7.19.0",
                 "@babel/helper-optimise-call-expression": "^7.18.6",
                 "@babel/helper-plugin-utils": "^7.20.2",
-                "@babel/helper-replace-supers": "^7.19.1",
+                "@babel/helper-replace-supers": "^7.20.7",
                 "@babel/helper-split-export-declaration": "^7.18.6",
                 "globals": "^11.1.0"
             },
@@ -1465,12 +2541,13 @@
             }
         },
         "node_modules/@babel/plugin-transform-computed-properties": {
-            "version": "7.18.9",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.18.9.tgz",
-            "integrity": "sha512-+i0ZU1bCDymKakLxn5srGHrsAPRELC2WIbzwjLhHW9SIE1cPYkLCL0NlnXMZaM1vhfgA2+M7hySk42VBvrkBRw==",
+            "version": "7.20.7",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.20.7.tgz",
+            "integrity": "sha512-Lz7MvBK6DTjElHAmfu6bfANzKcxpyNPeYBGEafyA6E5HtRpjpZwU+u7Qrgz/2OR0z+5TvKYbPdphfSaAcZBrYQ==",
             "dev": true,
             "dependencies": {
-                "@babel/helper-plugin-utils": "^7.18.9"
+                "@babel/helper-plugin-utils": "^7.20.2",
+                "@babel/template": "^7.20.7"
             },
             "engines": {
                 "node": ">=6.9.0"
@@ -1480,9 +2557,9 @@
             }
         },
         "node_modules/@babel/plugin-transform-destructuring": {
-            "version": "7.20.2",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.20.2.tgz",
-            "integrity": "sha512-mENM+ZHrvEgxLTBXUiQ621rRXZes3KWUv6NdQlrnr1TkWVw+hUjQBZuP2X32qKlrlG2BzgR95gkuCRSkJl8vIw==",
+            "version": "7.20.7",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.20.7.tgz",
+            "integrity": "sha512-Xwg403sRrZb81IVB79ZPqNQME23yhugYVqgTxAhT99h485F4f+GMELFhhOsscDUB7HCswepKeCKLn/GZvUKoBA==",
             "dev": true,
             "dependencies": {
                 "@babel/helper-plugin-utils": "^7.20.2"
@@ -1604,13 +2681,13 @@
             }
         },
         "node_modules/@babel/plugin-transform-modules-amd": {
-            "version": "7.19.6",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.19.6.tgz",
-            "integrity": "sha512-uG3od2mXvAtIFQIh0xrpLH6r5fpSQN04gIVovl+ODLdUMANokxQLZnPBHcjmv3GxRjnqwLuHvppjjcelqUFZvg==",
+            "version": "7.20.11",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.20.11.tgz",
+            "integrity": "sha512-NuzCt5IIYOW0O30UvqktzHYR2ud5bOWbY0yaxWZ6G+aFzOMJvrs5YHNikrbdaT15+KNO31nPOy5Fim3ku6Zb5g==",
             "dev": true,
             "dependencies": {
-                "@babel/helper-module-transforms": "^7.19.6",
-                "@babel/helper-plugin-utils": "^7.19.0"
+                "@babel/helper-module-transforms": "^7.20.11",
+                "@babel/helper-plugin-utils": "^7.20.2"
             },
             "engines": {
                 "node": ">=6.9.0"
@@ -1620,14 +2697,14 @@
             }
         },
         "node_modules/@babel/plugin-transform-modules-commonjs": {
-            "version": "7.19.6",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.19.6.tgz",
-            "integrity": "sha512-8PIa1ym4XRTKuSsOUXqDG0YaOlEuTVvHMe5JCfgBMOtHvJKw/4NGovEGN33viISshG/rZNVrACiBmPQLvWN8xQ==",
+            "version": "7.20.11",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.20.11.tgz",
+            "integrity": "sha512-S8e1f7WQ7cimJQ51JkAaDrEtohVEitXjgCGAS2N8S31Y42E+kWwfSz83LYz57QdBm7q9diARVqanIaH2oVgQnw==",
             "dev": true,
             "dependencies": {
-                "@babel/helper-module-transforms": "^7.19.6",
-                "@babel/helper-plugin-utils": "^7.19.0",
-                "@babel/helper-simple-access": "^7.19.4"
+                "@babel/helper-module-transforms": "^7.20.11",
+                "@babel/helper-plugin-utils": "^7.20.2",
+                "@babel/helper-simple-access": "^7.20.2"
             },
             "engines": {
                 "node": ">=6.9.0"
@@ -1637,14 +2714,14 @@
             }
         },
         "node_modules/@babel/plugin-transform-modules-systemjs": {
-            "version": "7.19.6",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.19.6.tgz",
-            "integrity": "sha512-fqGLBepcc3kErfR9R3DnVpURmckXP7gj7bAlrTQyBxrigFqszZCkFkcoxzCp2v32XmwXLvbw+8Yq9/b+QqksjQ==",
+            "version": "7.20.11",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.20.11.tgz",
+            "integrity": "sha512-vVu5g9BPQKSFEmvt2TA4Da5N+QVS66EX21d8uoOihC+OCpUoGvzVsXeqFdtAEfVa5BILAeFt+U7yVmLbQnAJmw==",
             "dev": true,
             "dependencies": {
                 "@babel/helper-hoist-variables": "^7.18.6",
-                "@babel/helper-module-transforms": "^7.19.6",
-                "@babel/helper-plugin-utils": "^7.19.0",
+                "@babel/helper-module-transforms": "^7.20.11",
+                "@babel/helper-plugin-utils": "^7.20.2",
                 "@babel/helper-validator-identifier": "^7.19.1"
             },
             "engines": {
@@ -1671,13 +2748,13 @@
             }
         },
         "node_modules/@babel/plugin-transform-named-capturing-groups-regex": {
-            "version": "7.19.1",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.19.1.tgz",
-            "integrity": "sha512-oWk9l9WItWBQYS4FgXD4Uyy5kq898lvkXpXQxoJEY1RnvPk4R/Dvu2ebXU9q8lP+rlMwUQTFf2Ok6d78ODa0kw==",
+            "version": "7.20.5",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.20.5.tgz",
+            "integrity": "sha512-mOW4tTzi5iTLnw+78iEq3gr8Aoq4WNRGpmSlrogqaiCBoR1HFhpU4JkpQFOHfeYx3ReVIFWOQJS4aZBRvuZ6mA==",
             "dev": true,
             "dependencies": {
-                "@babel/helper-create-regexp-features-plugin": "^7.19.0",
-                "@babel/helper-plugin-utils": "^7.19.0"
+                "@babel/helper-create-regexp-features-plugin": "^7.20.5",
+                "@babel/helper-plugin-utils": "^7.20.2"
             },
             "engines": {
                 "node": ">=6.9.0"
@@ -1718,9 +2795,9 @@
             }
         },
         "node_modules/@babel/plugin-transform-parameters": {
-            "version": "7.20.3",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.20.3.tgz",
-            "integrity": "sha512-oZg/Fpx0YDrj13KsLyO8I/CX3Zdw7z0O9qOd95SqcoIzuqy/WTGWvePeHAnZCN54SfdyjHcb1S30gc8zlzlHcA==",
+            "version": "7.20.7",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.20.7.tgz",
+            "integrity": "sha512-WiWBIkeHKVOSYPO0pWkxGPfKeWrCJyD3NJ53+Lrp/QMSZbsVPovrVl2aWZ19D/LTVnaDv5Ap7GJ/B2CTOZdrfA==",
             "dev": true,
             "dependencies": {
                 "@babel/helper-plugin-utils": "^7.20.2"
@@ -1748,13 +2825,13 @@
             }
         },
         "node_modules/@babel/plugin-transform-regenerator": {
-            "version": "7.18.6",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.18.6.tgz",
-            "integrity": "sha512-poqRI2+qiSdeldcz4wTSTXBRryoq3Gc70ye7m7UD5Ww0nE29IXqMl6r7Nd15WBgRd74vloEMlShtH6CKxVzfmQ==",
+            "version": "7.20.5",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.20.5.tgz",
+            "integrity": "sha512-kW/oO7HPBtntbsahzQ0qSE3tFvkFwnbozz3NWFhLGqH75vLEg+sCGngLlhVkePlCs3Jv0dBBHDzCHxNiFAQKCQ==",
             "dev": true,
             "dependencies": {
-                "@babel/helper-plugin-utils": "^7.18.6",
-                "regenerator-transform": "^0.15.0"
+                "@babel/helper-plugin-utils": "^7.20.2",
+                "regenerator-transform": "^0.15.1"
             },
             "engines": {
                 "node": ">=6.9.0"
@@ -1794,13 +2871,13 @@
             }
         },
         "node_modules/@babel/plugin-transform-spread": {
-            "version": "7.19.0",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.19.0.tgz",
-            "integrity": "sha512-RsuMk7j6n+r752EtzyScnWkQyuJdli6LdO5Klv8Yx0OfPVTcQkIUfS8clx5e9yHXzlnhOZF3CbQ8C2uP5j074w==",
+            "version": "7.20.7",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.20.7.tgz",
+            "integrity": "sha512-ewBbHQ+1U/VnH1fxltbJqDeWBU1oNLG8Dj11uIv3xVf7nrQu0bPGe5Rf716r7K5Qz+SqtAOVswoVunoiBtGhxw==",
             "dev": true,
             "dependencies": {
-                "@babel/helper-plugin-utils": "^7.19.0",
-                "@babel/helper-skip-transparent-expression-wrappers": "^7.18.9"
+                "@babel/helper-plugin-utils": "^7.20.2",
+                "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0"
             },
             "engines": {
                 "node": ">=6.9.0"
@@ -1990,54 +3067,60 @@
                 "@babel/core": "^7.0.0-0"
             }
         },
+        "node_modules/@babel/regjsgen": {
+            "version": "0.8.0",
+            "resolved": "https://registry.npmjs.org/@babel/regjsgen/-/regjsgen-0.8.0.tgz",
+            "integrity": "sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==",
+            "dev": true
+        },
         "node_modules/@babel/runtime": {
-            "version": "7.20.1",
-            "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.20.1.tgz",
-            "integrity": "sha512-mrzLkl6U9YLF8qpqI7TB82PESyEGjm/0Ly91jG575eVxMMlb8fYfOXFZIJ8XfLrJZQbm7dlKry2bJmXBUEkdFg==",
+            "version": "7.20.13",
+            "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.20.13.tgz",
+            "integrity": "sha512-gt3PKXs0DBoL9xCvOIIZ2NEqAGZqHjAnmVbfQtB620V0uReIQutpel14KcneZuer7UioY8ALKZ7iocavvzTNFA==",
             "dependencies": {
-                "regenerator-runtime": "^0.13.10"
+                "regenerator-runtime": "^0.13.11"
             },
             "engines": {
                 "node": ">=6.9.0"
             }
         },
         "node_modules/@babel/standalone": {
-            "version": "7.20.4",
-            "resolved": "https://registry.npmjs.org/@babel/standalone/-/standalone-7.20.4.tgz",
-            "integrity": "sha512-27bv4h47jbaFZ7+e7gT1VEo9PNL1ynxqUX6/BERLz1qxm/5gzpbcHX+47VnSeYHyEyGZkRznpSOd8zPBhiz6tw==",
+            "version": "7.20.15",
+            "resolved": "https://registry.npmjs.org/@babel/standalone/-/standalone-7.20.15.tgz",
+            "integrity": "sha512-B3LmZ1NHlTb2eFEaw8rftZc730Wh9MlmsH8ubb6IjsNoIk9+SQ2aAA0nrm/1806+PftPRAACPClmKTu8PG7Tew==",
             "dev": true,
             "engines": {
                 "node": ">=6.9.0"
             }
         },
         "node_modules/@babel/template": {
-            "version": "7.18.10",
-            "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.18.10.tgz",
-            "integrity": "sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA==",
+            "version": "7.20.7",
+            "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.20.7.tgz",
+            "integrity": "sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw==",
             "dev": true,
             "dependencies": {
                 "@babel/code-frame": "^7.18.6",
-                "@babel/parser": "^7.18.10",
-                "@babel/types": "^7.18.10"
+                "@babel/parser": "^7.20.7",
+                "@babel/types": "^7.20.7"
             },
             "engines": {
                 "node": ">=6.9.0"
             }
         },
         "node_modules/@babel/traverse": {
-            "version": "7.20.1",
-            "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.20.1.tgz",
-            "integrity": "sha512-d3tN8fkVJwFLkHkBN479SOsw4DMZnz8cdbL/gvuDuzy3TS6Nfw80HuQqhw1pITbIruHyh7d1fMA47kWzmcUEGA==",
+            "version": "7.20.13",
+            "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.20.13.tgz",
+            "integrity": "sha512-kMJXfF0T6DIS9E8cgdLCSAL+cuCK+YEZHWiLK0SXpTo8YRj5lpJu3CDNKiIBCne4m9hhTIqUg6SYTAI39tAiVQ==",
             "dev": true,
             "dependencies": {
                 "@babel/code-frame": "^7.18.6",
-                "@babel/generator": "^7.20.1",
+                "@babel/generator": "^7.20.7",
                 "@babel/helper-environment-visitor": "^7.18.9",
                 "@babel/helper-function-name": "^7.19.0",
                 "@babel/helper-hoist-variables": "^7.18.6",
                 "@babel/helper-split-export-declaration": "^7.18.6",
-                "@babel/parser": "^7.20.1",
-                "@babel/types": "^7.20.0",
+                "@babel/parser": "^7.20.13",
+                "@babel/types": "^7.20.7",
                 "debug": "^4.1.0",
                 "globals": "^11.1.0"
             },
@@ -2046,9 +3129,9 @@
             }
         },
         "node_modules/@babel/types": {
-            "version": "7.20.2",
-            "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.20.2.tgz",
-            "integrity": "sha512-FnnvsNWgZCr232sqtXggapvlkk/tuwR/qhGzcmxI0GXLCjmPYQPzio2FbdlWuY6y1sHFfQKk+rRbUZ9VStQMog==",
+            "version": "7.20.7",
+            "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.20.7.tgz",
+            "integrity": "sha512-69OnhBxSSgK0OzTJai4kyPDiKTIe3j+ctaHdIGVbRahTLAT7L3R9oeXHC2aVSuGYt3cVnoAMDmOCgJ2yaiLMvg==",
             "dev": true,
             "dependencies": {
                 "@babel/helper-string-parser": "^7.19.4",
@@ -2084,9 +3167,9 @@
             }
         },
         "node_modules/@cypress/request": {
-            "version": "2.88.10",
-            "resolved": "https://registry.npmjs.org/@cypress/request/-/request-2.88.10.tgz",
-            "integrity": "sha512-Zp7F+R93N0yZyG34GutyTNr+okam7s/Fzc1+i3kcqOP8vk6OuajuE9qZJ6Rs+10/1JFtXFYMdyarnU1rZuJesg==",
+            "version": "2.88.11",
+            "resolved": "https://registry.npmjs.org/@cypress/request/-/request-2.88.11.tgz",
+            "integrity": "sha512-M83/wfQ1EkspjkE2lNWNV5ui2Cv7UCv1swW1DqljahbzLVWltcsexQh8jYtuS/vzFXP+HySntGM83ZXA9fn17w==",
             "dev": true,
             "dependencies": {
                 "aws-sign2": "~0.7.0",
@@ -2102,7 +3185,7 @@
                 "json-stringify-safe": "~5.0.1",
                 "mime-types": "~2.1.19",
                 "performance-now": "^2.1.0",
-                "qs": "~6.5.2",
+                "qs": "~6.10.3",
                 "safe-buffer": "^5.1.2",
                 "tough-cookie": "~2.5.0",
                 "tunnel-agent": "^0.6.0",
@@ -2146,9 +3229,9 @@
             }
         },
         "node_modules/@esbuild/android-arm": {
-            "version": "0.15.15",
-            "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.15.15.tgz",
-            "integrity": "sha512-JJjZjJi2eBL01QJuWjfCdZxcIgot+VoK6Fq7eKF9w4YHm9hwl7nhBR1o2Wnt/WcANk5l9SkpvrldW1PLuXxcbw==",
+            "version": "0.15.18",
+            "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.15.18.tgz",
+            "integrity": "sha512-5GT+kcs2WVGjVs7+boataCkO5Fg0y4kCjzkB5bAip7H4jfnOS3dA6KPiww9W1OEKTKeAcUVhdZGvgI65OXmUnw==",
             "cpu": [
                 "arm"
             ],
@@ -2162,9 +3245,9 @@
             }
         },
         "node_modules/@esbuild/linux-loong64": {
-            "version": "0.15.15",
-            "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.15.15.tgz",
-            "integrity": "sha512-lhz6UNPMDXUhtXSulw8XlFAtSYO26WmHQnCi2Lg2p+/TMiJKNLtZCYUxV4wG6rZMzXmr8InGpNwk+DLT2Hm0PA==",
+            "version": "0.15.18",
+            "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.15.18.tgz",
+            "integrity": "sha512-L4jVKS82XVhw2nvzLg/19ClLWg0y27ulRwuP7lcyL6AbUWB5aPglXY3M21mauDQMDfRLs8cQmeT03r/+X3cZYQ==",
             "cpu": [
                 "loong64"
             ],
@@ -2178,15 +3261,15 @@
             }
         },
         "node_modules/@eslint/eslintrc": {
-            "version": "1.3.3",
-            "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.3.tgz",
-            "integrity": "sha512-uj3pT6Mg+3t39fvLrj8iuCIJ38zKO9FpGtJ4BBJebJhEwjoT+KLVNCcHT5QC9NGRIEi7fZ0ZR8YRb884auB4Lg==",
+            "version": "1.4.1",
+            "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.4.1.tgz",
+            "integrity": "sha512-XXrH9Uarn0stsyldqDYq8r++mROmWRI1xKMXa640Bb//SY1+ECYX6VzT6Lcx5frD0V30XieqJ0oX9I2Xj5aoMA==",
             "dev": true,
             "dependencies": {
                 "ajv": "^6.12.4",
                 "debug": "^4.3.2",
                 "espree": "^9.4.0",
-                "globals": "^13.15.0",
+                "globals": "^13.19.0",
                 "ignore": "^5.2.0",
                 "import-fresh": "^3.2.1",
                 "js-yaml": "^4.1.0",
@@ -2201,9 +3284,9 @@
             }
         },
         "node_modules/@eslint/eslintrc/node_modules/globals": {
-            "version": "13.18.0",
-            "resolved": "https://registry.npmjs.org/globals/-/globals-13.18.0.tgz",
-            "integrity": "sha512-/mR4KI8Ps2spmoc0Ulu9L7agOF0du1CZNQ3dke8yItYlyKNmGrkONemBbd6V8UTc1Wgcqn21t3WYB7dbRmh6/A==",
+            "version": "13.20.0",
+            "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz",
+            "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==",
             "dev": true,
             "dependencies": {
                 "type-fest": "^0.20.2"
@@ -2277,9 +3360,9 @@
             }
         },
         "node_modules/@fortawesome/vue-fontawesome": {
-            "version": "3.0.2",
-            "resolved": "https://registry.npmjs.org/@fortawesome/vue-fontawesome/-/vue-fontawesome-3.0.2.tgz",
-            "integrity": "sha512-xHVtVY8ASUeEvgcA/7vULUesENhD+pi/EirRHdMBqooHlXBqK+yrV6d8tUye1m5UKQKVgYAHMhUBfOnoiwvc8Q==",
+            "version": "3.0.3",
+            "resolved": "https://registry.npmjs.org/@fortawesome/vue-fontawesome/-/vue-fontawesome-3.0.3.tgz",
+            "integrity": "sha512-KCPHi9QemVXGMrfuwf3nNnNo129resAIQWut9QTAMXmXqL2ErABC6ohd2yY5Ipq0CLWNbKHk8TMdTXL/Zf3ZhA==",
             "dev": true,
             "peerDependencies": {
                 "@fortawesome/fontawesome-svg-core": "~1 || ~6",
@@ -2299,9 +3382,9 @@
             }
         },
         "node_modules/@grpc/proto-loader": {
-            "version": "0.7.3",
-            "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.7.3.tgz",
-            "integrity": "sha512-5dAvoZwna2Py3Ef96Ux9jIkp3iZ62TUsV00p3wVBPNX5K178UbNi8Q7gQVqwXT1Yq9RejIGG9G2IPEo93T6RcA==",
+            "version": "0.7.4",
+            "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.7.4.tgz",
+            "integrity": "sha512-MnWjkGwqQ3W8fx94/c1CwqLsNmHHv2t0CFn+9++6+cDphC1lolpg9M2OU0iebIjK//pBNX9e94ho+gjx6vz39w==",
             "dependencies": {
                 "@types/long": "^4.0.1",
                 "lodash.camelcase": "^4.3.0",
@@ -3124,9 +4207,22 @@
             }
         },
         "node_modules/@js-joda/core": {
-            "version": "5.4.2",
-            "resolved": "https://registry.npmjs.org/@js-joda/core/-/core-5.4.2.tgz",
-            "integrity": "sha512-QIDIZ9a0NfDStgD47VaTgwiPjlw1p4QPLwjOB/9+/DqIztoQopPNNAd+HdtQMHgE+ibP3dJacd8/TVL/A1RaaA=="
+            "version": "5.5.2",
+            "resolved": "https://registry.npmjs.org/@js-joda/core/-/core-5.5.2.tgz",
+            "integrity": "sha512-retLUN4TwCJ0QJDi9OCJwYVaXAz93NeOkEtEQL98M2bykBOxmURlP0YlfsuE46kItOOVZIWRYC3KsSLhQ1R2Qw=="
+        },
+        "node_modules/@louislam/ping": {
+            "version": "0.4.2-mod.1",
+            "resolved": "https://registry.npmjs.org/@louislam/ping/-/ping-0.4.2-mod.1.tgz",
+            "integrity": "sha512-KkRDo8qcF9kzzR0Hh8Iqz+XNnzKOdobUquP7UyBYrjxAB1jNT3qO0gvAZeDUknF28LXBPSzkiVlf1NG+tb/iyQ==",
+            "dependencies": {
+                "command-exists": "~1.2.9",
+                "q": "1.x",
+                "underscore": "^1.12.0"
+            },
+            "engines": {
+                "node": ">=4.0.0"
+            }
         },
         "node_modules/@louislam/sqlite3": {
             "version": "15.1.2",
@@ -3169,6 +4265,17 @@
                 "node-pre-gyp": "bin/node-pre-gyp"
             }
         },
+        "node_modules/@mapbox/node-pre-gyp/node_modules/lru-cache": {
+            "version": "6.0.0",
+            "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+            "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+            "dependencies": {
+                "yallist": "^4.0.0"
+            },
+            "engines": {
+                "node": ">=10"
+            }
+        },
         "node_modules/@mapbox/node-pre-gyp/node_modules/semver": {
             "version": "7.3.8",
             "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz",
@@ -3183,6 +4290,11 @@
                 "node": ">=10"
             }
         },
+        "node_modules/@mapbox/node-pre-gyp/node_modules/yallist": {
+            "version": "4.0.0",
+            "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+            "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
+        },
         "node_modules/@nodelib/fs.scandir": {
             "version": "2.1.5",
             "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
@@ -3393,6 +4505,64 @@
             "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz",
             "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw=="
         },
+        "node_modules/@redis/bloom": {
+            "version": "1.1.0",
+            "resolved": "https://registry.npmjs.org/@redis/bloom/-/bloom-1.1.0.tgz",
+            "integrity": "sha512-9QovlxmpRtvxVbN0UBcv8WfdSMudNZZTFqCsnBszcQXqaZb/TVe30ScgGEO7u1EAIacTPAo7/oCYjYAxiHLanQ==",
+            "peerDependencies": {
+                "@redis/client": "^1.0.0"
+            }
+        },
+        "node_modules/@redis/client": {
+            "version": "1.4.2",
+            "resolved": "https://registry.npmjs.org/@redis/client/-/client-1.4.2.tgz",
+            "integrity": "sha512-oUdEjE0I7JS5AyaAjkD3aOXn9NhO7XKyPyXEyrgFDu++VrVBHUPnV6dgEya9TcMuj5nIJRuCzCm8ZP+c9zCHPw==",
+            "dependencies": {
+                "cluster-key-slot": "1.1.1",
+                "generic-pool": "3.9.0",
+                "yallist": "4.0.0"
+            },
+            "engines": {
+                "node": ">=14"
+            }
+        },
+        "node_modules/@redis/client/node_modules/yallist": {
+            "version": "4.0.0",
+            "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+            "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
+        },
+        "node_modules/@redis/graph": {
+            "version": "1.1.0",
+            "resolved": "https://registry.npmjs.org/@redis/graph/-/graph-1.1.0.tgz",
+            "integrity": "sha512-16yZWngxyXPd+MJxeSr0dqh2AIOi8j9yXKcKCwVaKDbH3HTuETpDVPcLujhFYVPtYrngSco31BUcSa9TH31Gqg==",
+            "peerDependencies": {
+                "@redis/client": "^1.0.0"
+            }
+        },
+        "node_modules/@redis/json": {
+            "version": "1.0.4",
+            "resolved": "https://registry.npmjs.org/@redis/json/-/json-1.0.4.tgz",
+            "integrity": "sha512-LUZE2Gdrhg0Rx7AN+cZkb1e6HjoSKaeeW8rYnt89Tly13GBI5eP4CwDVr+MY8BAYfCg4/N15OUrtLoona9uSgw==",
+            "peerDependencies": {
+                "@redis/client": "^1.0.0"
+            }
+        },
+        "node_modules/@redis/search": {
+            "version": "1.1.0",
+            "resolved": "https://registry.npmjs.org/@redis/search/-/search-1.1.0.tgz",
+            "integrity": "sha512-NyFZEVnxIJEybpy+YskjgOJRNsfTYqaPbK/Buv6W2kmFNaRk85JiqjJZA5QkRmWvGbyQYwoO5QfDi2wHskKrQQ==",
+            "peerDependencies": {
+                "@redis/client": "^1.0.0"
+            }
+        },
+        "node_modules/@redis/time-series": {
+            "version": "1.0.4",
+            "resolved": "https://registry.npmjs.org/@redis/time-series/-/time-series-1.0.4.tgz",
+            "integrity": "sha512-ThUIgo2U/g7cCuZavucQTQzA9g9JbDDY2f64u3AbAoz/8vE2lt2U37LamDUVChhaDA3IRT9R6VvJwqnUfTJzng==",
+            "peerDependencies": {
+                "@redis/client": "^1.0.0"
+            }
+        },
         "node_modules/@sideway/address": {
             "version": "4.1.4",
             "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.4.tgz",
@@ -3403,9 +4573,9 @@
             }
         },
         "node_modules/@sideway/formula": {
-            "version": "3.0.0",
-            "resolved": "https://registry.npmjs.org/@sideway/formula/-/formula-3.0.0.tgz",
-            "integrity": "sha512-vHe7wZ4NOXVfkoRb8T5otiENVlT7a3IAiw7H5M2+GO+9CDgcVUUsX1zalAztCmwyOr2RUTGJdgB+ZvSVqmdHmg==",
+            "version": "3.0.1",
+            "resolved": "https://registry.npmjs.org/@sideway/formula/-/formula-3.0.1.tgz",
+            "integrity": "sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg==",
             "dev": true
         },
         "node_modules/@sideway/pinpoint": {
@@ -3414,10 +4584,21 @@
             "integrity": "sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==",
             "dev": true
         },
+        "node_modules/@sindresorhus/is": {
+            "version": "5.3.0",
+            "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-5.3.0.tgz",
+            "integrity": "sha512-CX6t4SYQ37lzxicAqsBtxA3OseeoVrh9cSJ5PFYam0GksYlupRfy1A+Q4aYD3zvcfECLc0zO2u+ZnR2UYKvCrw==",
+            "engines": {
+                "node": ">=14.16"
+            },
+            "funding": {
+                "url": "https://github.com/sindresorhus/is?sponsor=1"
+            }
+        },
         "node_modules/@sinonjs/commons": {
-            "version": "1.8.5",
-            "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.5.tgz",
-            "integrity": "sha512-rTpCA0wG1wUxglBSFdMMY0oTrKYvgf4fNgv/sXbfCVAdf+FnPBdKJR/7XbpTCwbCrvCbdPYnlWaUUYz4V2fPDA==",
+            "version": "1.8.6",
+            "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.6.tgz",
+            "integrity": "sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ==",
             "dev": true,
             "dependencies": {
                 "type-detect": "4.0.8"
@@ -3437,6 +4618,17 @@
             "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.0.tgz",
             "integrity": "sha512-+9jVqKhRSpsc591z5vX+X5Yyw+he/HCB4iQ/RYxw35CEPaY1gnsNE43nf9n9AaYjAQrTiI/mOwKUKdUs9vf7Xg=="
         },
+        "node_modules/@szmarczak/http-timer": {
+            "version": "5.0.1",
+            "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-5.0.1.tgz",
+            "integrity": "sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==",
+            "dependencies": {
+                "defer-to-connect": "^2.0.1"
+            },
+            "engines": {
+                "node": ">=14.16"
+            }
+        },
         "node_modules/@tediousjs/connection-string": {
             "version": "0.3.0",
             "resolved": "https://registry.npmjs.org/@tediousjs/connection-string/-/connection-string-0.3.0.tgz",
@@ -3459,13 +4651,13 @@
             }
         },
         "node_modules/@types/babel__core": {
-            "version": "7.1.20",
-            "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.20.tgz",
-            "integrity": "sha512-PVb6Bg2QuscZ30FvOU7z4guG6c926D9YRvOxEaelzndpMsvP+YM74Q/dAFASpg2l6+XLalxSGxcq/lrgYWZtyQ==",
+            "version": "7.20.0",
+            "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.0.tgz",
+            "integrity": "sha512-+n8dL/9GWblDO0iU6eZAwEIJVr5DWigtle+Q6HLOrh/pdbXOhOtqzq8VPPE2zvNJzSKY4vH/z3iT3tn0A3ypiQ==",
             "dev": true,
             "dependencies": {
-                "@babel/parser": "^7.1.0",
-                "@babel/types": "^7.0.0",
+                "@babel/parser": "^7.20.7",
+                "@babel/types": "^7.20.7",
                 "@types/babel__generator": "*",
                 "@types/babel__template": "*",
                 "@types/babel__traverse": "*"
@@ -3491,9 +4683,9 @@
             }
         },
         "node_modules/@types/babel__traverse": {
-            "version": "7.18.2",
-            "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.18.2.tgz",
-            "integrity": "sha512-FcFaxOr2V5KZCviw1TnutEMVUVsGt4D2hP1TAfXZAMKuHYW3xQhe3jTxNPWutgCJ3/X1c5yX8ZoGVEItxKbwBg==",
+            "version": "7.18.3",
+            "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.18.3.tgz",
+            "integrity": "sha512-1kbcJ40lLB7MHsj39U4Sh1uTd2E7rLEa79kmDpI6cy+XiXsteB3POdQomoq4FxszMrO3ZYchkhYJw7A2862b3w==",
             "dev": true,
             "dependencies": {
                 "@babel/types": "^7.3.0"
@@ -3547,9 +4739,12 @@
             }
         },
         "node_modules/@types/cors": {
-            "version": "2.8.12",
-            "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.12.tgz",
-            "integrity": "sha512-vt+kDhq/M2ayberEtJcIN/hxXy1Pk+59g2FV/ZQceeaTyCtCucjL2Q7FXlFjtWn4n15KCr1NE2lNNFhp0lEThw=="
+            "version": "2.8.13",
+            "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.13.tgz",
+            "integrity": "sha512-RG8AStHlUiV5ysZQKq97copd2UmVYw3/pRMLefISZ3S1hK104Cwm7iLQ3fTKx+lsUH2CE8FlLaYeEA2LSeqYUA==",
+            "dependencies": {
+                "@types/node": "*"
+            }
         },
         "node_modules/@types/es-aggregate-error": {
             "version": "1.0.2",
@@ -3560,20 +4755,20 @@
             }
         },
         "node_modules/@types/express": {
-            "version": "4.17.14",
-            "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.14.tgz",
-            "integrity": "sha512-TEbt+vaPFQ+xpxFLFssxUDXj5cWCxZJjIcB7Yg0k0GMHGtgtQgpvx/MUQUeAkNbA9AAGrwkAsoeItdTgS7FMyg==",
+            "version": "4.17.17",
+            "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.17.tgz",
+            "integrity": "sha512-Q4FmmuLGBG58btUnfS1c1r/NQdlp3DMfGDGig8WhfpA2YRUtEkxAjkZb0yvplJGYdF1fsQ81iMDcH24sSCNC/Q==",
             "dependencies": {
                 "@types/body-parser": "*",
-                "@types/express-serve-static-core": "^4.17.18",
+                "@types/express-serve-static-core": "^4.17.33",
                 "@types/qs": "*",
                 "@types/serve-static": "*"
             }
         },
         "node_modules/@types/express-serve-static-core": {
-            "version": "4.17.31",
-            "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.31.tgz",
-            "integrity": "sha512-DxMhY+NAsTwMMFHBTtJFNp5qiHKJ7TeqOo23zVEM9alT1Ml27Q3xcTH0xwxn7Q0BbMcVEJOs/7aQtUWupUQN3Q==",
+            "version": "4.17.33",
+            "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.33.tgz",
+            "integrity": "sha512-TPBqmR/HRYI3eC2E5hmiivIzv+bidAfXofM+sbonAGvyDhySGw9/PQZFt2BLOrjUUR++4eJVpx6KnLQK1Fk9tA==",
             "dependencies": {
                 "@types/node": "*",
                 "@types/qs": "*",
@@ -3581,9 +4776,9 @@
             }
         },
         "node_modules/@types/graceful-fs": {
-            "version": "4.1.5",
-            "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.5.tgz",
-            "integrity": "sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw==",
+            "version": "4.1.6",
+            "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.6.tgz",
+            "integrity": "sha512-Sig0SNORX9fdW+bQuTEovKj3uHcUL6LQKbCrrqb1X7J6/ReAbhCXRAhc+SMejhLELFj2QcyuxmUooZ4bt5ReSw==",
             "dev": true,
             "dependencies": {
                 "@types/node": "*"
@@ -3594,6 +4789,11 @@
             "resolved": "https://registry.npmjs.org/@types/http-assert/-/http-assert-1.5.3.tgz",
             "integrity": "sha512-FyAOrDuQmBi8/or3ns4rwPno7/9tJTijVW6aQQjK02+kOQ8zmoNg2XJtAuQhvQcy1ASJq38wirX5//9J1EqoUA=="
         },
+        "node_modules/@types/http-cache-semantics": {
+            "version": "4.0.1",
+            "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.1.tgz",
+            "integrity": "sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ=="
+        },
         "node_modules/@types/http-errors": {
             "version": "2.0.1",
             "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.1.tgz",
@@ -3652,9 +4852,9 @@
             }
         },
         "node_modules/@types/lodash": {
-            "version": "4.14.190",
-            "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.190.tgz",
-            "integrity": "sha512-5iJ3FBJBvQHQ8sFhEhJfjUP+G+LalhavTkYyrAYqz5MEJG+erSv0k9KJLb6q7++17Lafk1scaTIFXcMJlwK8Mw=="
+            "version": "4.14.191",
+            "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.191.tgz",
+            "integrity": "sha512-BdZ5BCCvho3EIXw6wUCXHe7rS53AIDPLE+JzwgT+OsJk53oBfbSmZZ7CX4VaRoN78N+TJpFi9QPlfIVNmJYWxQ=="
         },
         "node_modules/@types/long": {
             "version": "4.0.2",
@@ -3673,9 +4873,9 @@
             "dev": true
         },
         "node_modules/@types/node": {
-            "version": "18.11.9",
-            "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.9.tgz",
-            "integrity": "sha512-CRpX21/kGdzjOpFsZSkcrXMGIBWMGNIHXXBVFSH+ggkftxg+XYP20TESbh+zFvFj3EQOl5byk0HTRn1IL6hbqg=="
+            "version": "18.13.0",
+            "resolved": "https://registry.npmjs.org/@types/node/-/node-18.13.0.tgz",
+            "integrity": "sha512-gC3TazRzGoOnoKAhUx+Q0t8S9Tzs74z7m0ipwGpSqQrleP14hKxP4/JUeEQcD3W1/aIpnWl8pHowI7WokuZpXg=="
         },
         "node_modules/@types/normalize-package-data": {
             "version": "2.4.1",
@@ -3690,9 +4890,9 @@
             "dev": true
         },
         "node_modules/@types/prettier": {
-            "version": "2.7.1",
-            "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.1.tgz",
-            "integrity": "sha512-ri0UmynRRvZiiUJdiz38MmIblKK+oH30MztdBVR95dv/Ubw6neWSb8u1XpRb72L4qsZOhz+L+z9JD40SJmfWow==",
+            "version": "2.7.2",
+            "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.2.tgz",
+            "integrity": "sha512-KufADq8uQqo1pYKVIYzfKbJfBAc0sOeXqGbFaSpv8MRmC/zXgowNZmFcbngndGk922QDmOASEXUZCaY48gs4cg==",
             "dev": true
         },
         "node_modules/@types/qs": {
@@ -3732,10 +4932,24 @@
             "integrity": "sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==",
             "dev": true
         },
+        "node_modules/@types/webidl-conversions": {
+            "version": "7.0.0",
+            "resolved": "https://registry.npmjs.org/@types/webidl-conversions/-/webidl-conversions-7.0.0.tgz",
+            "integrity": "sha512-xTE1E+YF4aWPJJeUzaZI5DRntlkY3+BCVJi0axFptnjGmAoWxkyREIh/XMrfxVLejwQxMCfDXdICo0VLxThrog=="
+        },
+        "node_modules/@types/whatwg-url": {
+            "version": "8.2.2",
+            "resolved": "https://registry.npmjs.org/@types/whatwg-url/-/whatwg-url-8.2.2.tgz",
+            "integrity": "sha512-FtQu10RWgn3D9U4aazdwIE2yzphmTJREDqNdODHrbrZmmMqI0vMheC/6NE/J1Yveaj8H+ela+YwWTjq5PGmuhA==",
+            "dependencies": {
+                "@types/node": "*",
+                "@types/webidl-conversions": "*"
+            }
+        },
         "node_modules/@types/yargs": {
-            "version": "16.0.4",
-            "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.4.tgz",
-            "integrity": "sha512-T8Yc9wt/5LbJyCaLiHPReJa0kApcIgJ7Bn735GjItUfh08Z1pJvu8QZqb9s+mMvKV6WUQRV7K2R46YbjMXTTJw==",
+            "version": "16.0.5",
+            "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.5.tgz",
+            "integrity": "sha512-AxO/ADJOBFJScHbWhq2xAhlWP24rY4aCEG/NFaMvbT3X2MgRsLjhjQwsn0Zi5zn0LG9jUhCCZMeX9Dkuw6k+vQ==",
             "dev": true,
             "dependencies": {
                 "@types/yargs-parser": "*"
@@ -3791,39 +5005,39 @@
             }
         },
         "node_modules/@vue/compiler-core": {
-            "version": "3.2.45",
-            "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.2.45.tgz",
-            "integrity": "sha512-rcMj7H+PYe5wBV3iYeUgbCglC+pbpN8hBLTJvRiK2eKQiWqu+fG9F+8sW99JdL4LQi7Re178UOxn09puSXvn4A==",
+            "version": "3.2.47",
+            "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.2.47.tgz",
+            "integrity": "sha512-p4D7FDnQb7+YJmO2iPEv0SQNeNzcbHdGByJDsT4lynf63AFkOTFN07HsiRSvjGo0QrxR/o3d0hUyNCUnBU2Tig==",
             "dev": true,
             "dependencies": {
                 "@babel/parser": "^7.16.4",
-                "@vue/shared": "3.2.45",
+                "@vue/shared": "3.2.47",
                 "estree-walker": "^2.0.2",
                 "source-map": "^0.6.1"
             }
         },
         "node_modules/@vue/compiler-dom": {
-            "version": "3.2.45",
-            "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.2.45.tgz",
-            "integrity": "sha512-tyYeUEuKqqZO137WrZkpwfPCdiiIeXYCcJ8L4gWz9vqaxzIQRccTSwSWZ/Axx5YR2z+LvpUbmPNXxuBU45lyRw==",
+            "version": "3.2.47",
+            "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.2.47.tgz",
+            "integrity": "sha512-dBBnEHEPoftUiS03a4ggEig74J2YBZ2UIeyfpcRM2tavgMWo4bsEfgCGsu+uJIL/vax9S+JztH8NmQerUo7shQ==",
             "dev": true,
             "dependencies": {
-                "@vue/compiler-core": "3.2.45",
-                "@vue/shared": "3.2.45"
+                "@vue/compiler-core": "3.2.47",
+                "@vue/shared": "3.2.47"
             }
         },
         "node_modules/@vue/compiler-sfc": {
-            "version": "3.2.45",
-            "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.2.45.tgz",
-            "integrity": "sha512-1jXDuWah1ggsnSAOGsec8cFjT/K6TMZ0sPL3o3d84Ft2AYZi2jWJgRMjw4iaK0rBfA89L5gw427H4n1RZQBu6Q==",
+            "version": "3.2.47",
+            "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.2.47.tgz",
+            "integrity": "sha512-rog05W+2IFfxjMcFw10tM9+f7i/+FFpZJJ5XHX72NP9eC2uRD+42M3pYcQqDXVYoj74kHMSEdQ/WmCjt8JFksQ==",
             "dev": true,
             "dependencies": {
                 "@babel/parser": "^7.16.4",
-                "@vue/compiler-core": "3.2.45",
-                "@vue/compiler-dom": "3.2.45",
-                "@vue/compiler-ssr": "3.2.45",
-                "@vue/reactivity-transform": "3.2.45",
-                "@vue/shared": "3.2.45",
+                "@vue/compiler-core": "3.2.47",
+                "@vue/compiler-dom": "3.2.47",
+                "@vue/compiler-ssr": "3.2.47",
+                "@vue/reactivity-transform": "3.2.47",
+                "@vue/shared": "3.2.47",
                 "estree-walker": "^2.0.2",
                 "magic-string": "^0.25.7",
                 "postcss": "^8.1.10",
@@ -3840,19 +5054,19 @@
             }
         },
         "node_modules/@vue/compiler-ssr": {
-            "version": "3.2.45",
-            "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.2.45.tgz",
-            "integrity": "sha512-6BRaggEGqhWht3lt24CrIbQSRD5O07MTmd+LjAn5fJj568+R9eUD2F7wMQJjX859seSlrYog7sUtrZSd7feqrQ==",
+            "version": "3.2.47",
+            "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.2.47.tgz",
+            "integrity": "sha512-wVXC+gszhulcMD8wpxMsqSOpvDZ6xKXSVWkf50Guf/S+28hTAXPDYRTbLQ3EDkOP5Xz/+SY37YiwDquKbJOgZw==",
             "dev": true,
             "dependencies": {
-                "@vue/compiler-dom": "3.2.45",
-                "@vue/shared": "3.2.45"
+                "@vue/compiler-dom": "3.2.47",
+                "@vue/shared": "3.2.47"
             }
         },
         "node_modules/@vue/devtools-api": {
-            "version": "6.4.5",
-            "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-6.4.5.tgz",
-            "integrity": "sha512-JD5fcdIuFxU4fQyXUu3w2KpAJHzTVdN+p4iOX2lMWSHMOoQdMAcpFLZzm9Z/2nmsoZ1a96QEhZ26e50xLBsgOQ==",
+            "version": "6.5.0",
+            "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-6.5.0.tgz",
+            "integrity": "sha512-o9KfBeaBmCKl10usN4crU53fYtC1r7jJwdGKjPT24t348rHxgfpZ0xL3Xm/gLUYnc0oTp8LAmrxOeLyu6tbk2Q==",
             "dev": true
         },
         "node_modules/@vue/reactivity": {
@@ -3865,14 +5079,14 @@
             }
         },
         "node_modules/@vue/reactivity-transform": {
-            "version": "3.2.45",
-            "resolved": "https://registry.npmjs.org/@vue/reactivity-transform/-/reactivity-transform-3.2.45.tgz",
-            "integrity": "sha512-BHVmzYAvM7vcU5WmuYqXpwaBHjsS8T63jlKGWVtHxAHIoMIlmaMyurUSEs1Zcg46M4AYT5MtB1U274/2aNzjJQ==",
+            "version": "3.2.47",
+            "resolved": "https://registry.npmjs.org/@vue/reactivity-transform/-/reactivity-transform-3.2.47.tgz",
+            "integrity": "sha512-m8lGXw8rdnPVVIdIFhf0LeQ/ixyHkH5plYuS83yop5n7ggVJU+z5v0zecwEnX7fa7HNLBhh2qngJJkxpwEEmYA==",
             "dev": true,
             "dependencies": {
                 "@babel/parser": "^7.16.4",
-                "@vue/compiler-core": "3.2.45",
-                "@vue/shared": "3.2.45",
+                "@vue/compiler-core": "3.2.47",
+                "@vue/shared": "3.2.47",
                 "estree-walker": "^2.0.2",
                 "magic-string": "^0.25.7"
             }
@@ -3977,9 +5191,9 @@
             "dev": true
         },
         "node_modules/@vue/shared": {
-            "version": "3.2.45",
-            "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.2.45.tgz",
-            "integrity": "sha512-Ewzq5Yhimg7pSztDV+RH1UDKBzmtqieXQlpTVm2AwraoRL/Rks96mvd8Vgi7Lj+h+TH8dv7mXD3FRZR3TUvbSg==",
+            "version": "3.2.47",
+            "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.2.47.tgz",
+            "integrity": "sha512-BHGyyGN3Q97EZx0taMQ+OLNuZcW3d37ZEVmEAyeoA9ERdGvm9Irc/0Fua8SNyOtV1w6BS4q25wbMzJujO9HIfQ==",
             "dev": true
         },
         "node_modules/@vuepic/vue-datepicker": {
@@ -4021,9 +5235,9 @@
             }
         },
         "node_modules/acorn": {
-            "version": "8.8.1",
-            "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.1.tgz",
-            "integrity": "sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA==",
+            "version": "8.8.2",
+            "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz",
+            "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==",
             "dev": true,
             "bin": {
                 "acorn": "bin/acorn"
@@ -4174,6 +5388,14 @@
                 "url": "https://github.com/sponsors/epoberezkin"
             }
         },
+        "node_modules/amdefine": {
+            "version": "1.0.1",
+            "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz",
+            "integrity": "sha512-S2Hw0TtNkMJhIabBwIojKL9YHO5T0n5eNqWJ7Lrlel/zDbftQpxpapi8tZs3X1HWa+u+QeydGmzzNU0m09+Rcg==",
+            "engines": {
+                "node": ">=0.4.2"
+            }
+        },
         "node_modules/anafanafo": {
             "version": "2.0.0",
             "resolved": "https://registry.npmjs.org/anafanafo/-/anafanafo-2.0.0.tgz",
@@ -4226,6 +5448,11 @@
                 "node": ">=4"
             }
         },
+        "node_modules/any-promise": {
+            "version": "1.3.0",
+            "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz",
+            "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A=="
+        },
         "node_modules/anymatch": {
             "version": "3.1.3",
             "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz",
@@ -4357,6 +5584,17 @@
                 "node": ">= 4.0.0"
             }
         },
+        "node_modules/available-typed-arrays": {
+            "version": "1.0.5",
+            "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz",
+            "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==",
+            "engines": {
+                "node": ">= 0.4"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/ljharb"
+            }
+        },
         "node_modules/await-lock": {
             "version": "2.2.2",
             "resolved": "https://registry.npmjs.org/await-lock/-/await-lock-2.2.2.tgz",
@@ -4372,9 +5610,9 @@
             }
         },
         "node_modules/aws4": {
-            "version": "1.11.0",
-            "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz",
-            "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==",
+            "version": "1.12.0",
+            "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.12.0.tgz",
+            "integrity": "sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg==",
             "devOptional": true
         },
         "node_modules/axios": {
@@ -4661,6 +5899,30 @@
             "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
             "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="
         },
+        "node_modules/barse": {
+            "version": "0.4.3",
+            "resolved": "https://registry.npmjs.org/barse/-/barse-0.4.3.tgz",
+            "integrity": "sha512-UEpvriJqAn8zuVinYICuKoPttZy3XxXEoqX/V2uYAL4zzJRuNzCK3+20nAu3YUIa2U7G53kf90wfBIp9/A+Odw==",
+            "dependencies": {
+                "readable-stream": "~1.0.2"
+            }
+        },
+        "node_modules/barse/node_modules/readable-stream": {
+            "version": "1.0.34",
+            "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz",
+            "integrity": "sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==",
+            "dependencies": {
+                "core-util-is": "~1.0.0",
+                "inherits": "~2.0.1",
+                "isarray": "0.0.1",
+                "string_decoder": "~0.10.x"
+            }
+        },
+        "node_modules/barse/node_modules/string_decoder": {
+            "version": "0.10.31",
+            "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
+            "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ=="
+        },
         "node_modules/base64-js": {
             "version": "1.5.1",
             "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz",
@@ -4846,6 +6108,12 @@
                 "@popperjs/core": "^2.10.2"
             }
         },
+        "node_modules/bowser": {
+            "version": "2.11.0",
+            "resolved": "https://registry.npmjs.org/bowser/-/bowser-2.11.0.tgz",
+            "integrity": "sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA==",
+            "optional": true
+        },
         "node_modules/brace-expansion": {
             "version": "1.1.11",
             "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
@@ -4895,9 +6163,9 @@
             "dev": true
         },
         "node_modules/browserslist": {
-            "version": "4.21.4",
-            "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.4.tgz",
-            "integrity": "sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw==",
+            "version": "4.21.5",
+            "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.5.tgz",
+            "integrity": "sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w==",
             "dev": true,
             "funding": [
                 {
@@ -4910,10 +6178,10 @@
                 }
             ],
             "dependencies": {
-                "caniuse-lite": "^1.0.30001400",
-                "electron-to-chromium": "^1.4.251",
-                "node-releases": "^2.0.6",
-                "update-browserslist-db": "^1.0.9"
+                "caniuse-lite": "^1.0.30001449",
+                "electron-to-chromium": "^1.4.284",
+                "node-releases": "^2.0.8",
+                "update-browserslist-db": "^1.0.10"
             },
             "bin": {
                 "browserslist": "cli.js"
@@ -4931,6 +6199,17 @@
                 "node-int64": "^0.4.0"
             }
         },
+        "node_modules/bson": {
+            "version": "4.7.2",
+            "resolved": "https://registry.npmjs.org/bson/-/bson-4.7.2.tgz",
+            "integrity": "sha512-Ry9wCtIZ5kGqkJoi6aD8KjxFZEx78guTQDnpXWiNthsxzrxAK/i8E6pCHAIZTbaEFWcOCvbecMukfK7XUvyLpQ==",
+            "dependencies": {
+                "buffer": "^5.6.0"
+            },
+            "engines": {
+                "node": ">=6.9.0"
+            }
+        },
         "node_modules/buffer": {
             "version": "5.7.1",
             "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz",
@@ -4981,6 +6260,16 @@
                 "node": ">=4"
             }
         },
+        "node_modules/buildcheck": {
+            "version": "0.0.3",
+            "resolved": "https://registry.npmjs.org/buildcheck/-/buildcheck-0.0.3.tgz",
+            "integrity": "sha512-pziaA+p/wdVImfcbsZLNF32EiWyujlQLwolMqUQE8xpKNOH7KmZQaY8sXN7DGOEzPAElo9QTaeNRfGnf3iOJbA==",
+            "dev": true,
+            "optional": true,
+            "engines": {
+                "node": ">=10.0.0"
+            }
+        },
         "node_modules/bulk-write-stream": {
             "version": "2.0.1",
             "resolved": "https://registry.npmjs.org/bulk-write-stream/-/bulk-write-stream-2.0.1.tgz",
@@ -5007,6 +6296,34 @@
                 "node": ">=10.6.0"
             }
         },
+        "node_modules/cacheable-request": {
+            "version": "10.2.7",
+            "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-10.2.7.tgz",
+            "integrity": "sha512-I4SA6mKgDxcxVbSt/UmIkb9Ny8qSkg6ReBHtAAXnZHk7KOSx5g3DTiAOaYzcHCs6oOdHn+bip9T48E6tMvK9hw==",
+            "dependencies": {
+                "@types/http-cache-semantics": "^4.0.1",
+                "get-stream": "^6.0.1",
+                "http-cache-semantics": "^4.1.1",
+                "keyv": "^4.5.2",
+                "mimic-response": "^4.0.0",
+                "normalize-url": "^8.0.0",
+                "responselike": "^3.0.0"
+            },
+            "engines": {
+                "node": ">=14.16"
+            }
+        },
+        "node_modules/cacheable-request/node_modules/get-stream": {
+            "version": "6.0.1",
+            "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz",
+            "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==",
+            "engines": {
+                "node": ">=10"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/sindresorhus"
+            }
+        },
         "node_modules/cachedir": {
             "version": "2.3.0",
             "resolved": "https://registry.npmjs.org/cachedir/-/cachedir-2.3.0.tgz",
@@ -5063,10 +6380,19 @@
                 "url": "https://github.com/sponsors/sindresorhus"
             }
         },
+        "node_modules/camelcase-keys/node_modules/quick-lru": {
+            "version": "4.0.1",
+            "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz",
+            "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==",
+            "dev": true,
+            "engines": {
+                "node": ">=8"
+            }
+        },
         "node_modules/caniuse-lite": {
-            "version": "1.0.30001434",
-            "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001434.tgz",
-            "integrity": "sha512-aOBHrLmTQw//WFa2rcF1If9fa3ypkC1wzqqiKHgfdrXTWcU8C4gKVZT77eQAPWN1APys3+uQ0Df07rKauXGEYA==",
+            "version": "1.0.30001451",
+            "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001451.tgz",
+            "integrity": "sha512-XY7UbUpGRatZzoRft//5xOa69/1iGJRBlrieH6QYrkKLIFn3m7OVEJ81dSrKoy2BnKsdbX5cLrOispZNYo9v2w==",
             "dev": true,
             "funding": [
                 {
@@ -5240,10 +6566,16 @@
             "integrity": "sha512-U9eDw6+wt7V8z5NncY2jJfZa+hUH8XEj8FQHgFJTrUFnJfXYf4Ml4adI2vXZOjqRDpFWtYVWypDfZwnJ+HIR4A=="
         },
         "node_modules/ci-info": {
-            "version": "3.7.0",
-            "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.7.0.tgz",
-            "integrity": "sha512-2CpRNYmImPx+RXKLq6jko/L07phmS9I02TyqkcNU20GCF/GgaWvc58hPtjxDX8lPpkdwc9sNh72V9k00S7ezog==",
+            "version": "3.7.1",
+            "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.7.1.tgz",
+            "integrity": "sha512-4jYS4MOAaCIStSRwiuxc4B8MYhIe676yO1sYGzARnjXkWpmzZMMYxY6zu8WYWDhSuth5zhrQ1rhNSibyyvv4/w==",
             "dev": true,
+            "funding": [
+                {
+                    "type": "github",
+                    "url": "https://github.com/sponsors/sibiraj-s"
+                }
+            ],
             "engines": {
                 "node": ">=8"
             }
@@ -5328,6 +6660,14 @@
                 "node": ">=6"
             }
         },
+        "node_modules/cluster-key-slot": {
+            "version": "1.1.1",
+            "resolved": "https://registry.npmjs.org/cluster-key-slot/-/cluster-key-slot-1.1.1.tgz",
+            "integrity": "sha512-rwHwUfXL40Chm1r08yrhU3qpUvdVlgkKNeyeGPOxnW8/SyVDvgRaed/Uz54AqWNaTCAThlj6QAs3TZcKI0xDEw==",
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
         "node_modules/co": {
             "version": "4.6.0",
             "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz",
@@ -5385,8 +6725,7 @@
         "node_modules/colorette": {
             "version": "2.0.19",
             "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.19.tgz",
-            "integrity": "sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==",
-            "dev": true
+            "integrity": "sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ=="
         },
         "node_modules/combine-errors": {
             "version": "3.0.3",
@@ -5494,6 +6833,29 @@
             "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
             "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
         },
+        "node_modules/compressjs": {
+            "version": "1.0.3",
+            "resolved": "https://registry.npmjs.org/compressjs/-/compressjs-1.0.3.tgz",
+            "integrity": "sha512-jpKJjBTretQACTGLNuvnozP1JdP2ZLrjdGdBgk/tz1VfXlUcBhhSZW6vEsuThmeot/yjvSrPQKEgfF3X2Lpi8Q==",
+            "dependencies": {
+                "amdefine": "~1.0.0",
+                "commander": "~2.8.1"
+            },
+            "bin": {
+                "compressjs": "bin/compressjs"
+            }
+        },
+        "node_modules/compressjs/node_modules/commander": {
+            "version": "2.8.1",
+            "resolved": "https://registry.npmjs.org/commander/-/commander-2.8.1.tgz",
+            "integrity": "sha512-+pJLBFVk+9ZZdlAOB5WuIElVPPth47hILFkmGym57aq8kwxsowvByvB0DHs1vQAhyMZzdcpTtF0VDKGkSDR4ZQ==",
+            "dependencies": {
+                "graceful-readlink": ">= 1.0.0"
+            },
+            "engines": {
+                "node": ">= 0.6.x"
+            }
+        },
         "node_modules/concat-map": {
             "version": "0.0.1",
             "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
@@ -5702,9 +7064,9 @@
             ]
         },
         "node_modules/content-type": {
-            "version": "1.0.4",
-            "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz",
-            "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==",
+            "version": "1.0.5",
+            "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz",
+            "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==",
             "engines": {
                 "node": ">= 0.6"
             }
@@ -5740,9 +7102,9 @@
             }
         },
         "node_modules/core-js-compat": {
-            "version": "3.26.1",
-            "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.26.1.tgz",
-            "integrity": "sha512-622/KzTudvXCDLRw70iHW4KKs1aGpcRcowGWyYJr2DEBfRrd6hNJybxSWJFuZYD4ma86xhrwDDHxmDaIq4EA8A==",
+            "version": "3.27.2",
+            "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.27.2.tgz",
+            "integrity": "sha512-welaYuF7ZtbYKGrIy7y3eb40d37rG1FvzEOfe7hSLd2iD6duMDqUhRfSvCGyC46HhR6Y8JXXdZ2lnRUMkPBpvg==",
             "dev": true,
             "dependencies": {
                 "browserslist": "^4.21.4"
@@ -5755,8 +7117,7 @@
         "node_modules/core-util-is": {
             "version": "1.0.2",
             "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
-            "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==",
-            "devOptional": true
+            "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ=="
         },
         "node_modules/cors": {
             "version": "2.8.5",
@@ -5786,6 +7147,21 @@
                 "node": ">=10"
             }
         },
+        "node_modules/cpu-features": {
+            "version": "0.0.4",
+            "resolved": "https://registry.npmjs.org/cpu-features/-/cpu-features-0.0.4.tgz",
+            "integrity": "sha512-fKiZ/zp1mUwQbnzb9IghXtHtDoTMtNeb8oYGx6kX2SYfhnG0HNdBEBIzB9b5KlXu5DQPhfy3mInbBxFcgwAr3A==",
+            "dev": true,
+            "hasInstallScript": true,
+            "optional": true,
+            "dependencies": {
+                "buildcheck": "0.0.3",
+                "nan": "^2.15.0"
+            },
+            "engines": {
+                "node": ">=10.0.0"
+            }
+        },
         "node_modules/cron-validate": {
             "version": "1.4.5",
             "resolved": "https://registry.npmjs.org/cron-validate/-/cron-validate-1.4.5.tgz",
@@ -5991,9 +7367,9 @@
             }
         },
         "node_modules/cypress/node_modules/@types/node": {
-            "version": "14.18.33",
-            "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.33.tgz",
-            "integrity": "sha512-qelS/Ra6sacc4loe/3MSjXNL1dNQ/GjxNHVzuChwMfmk7HuycRLVQN2qNY3XahK+fZc5E2szqQSKUyAF0E+2bg==",
+            "version": "14.18.36",
+            "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.36.tgz",
+            "integrity": "sha512-FXKWbsJ6a1hIrRxv+FoukuHnGTgEzKYGi7kilfMae96AL9UNkPFNWJEEYWzdRI9ooIkbr4AKldyuSTLql06vLQ==",
             "dev": true
         },
         "node_modules/cypress/node_modules/ansi-styles": {
@@ -6066,6 +7442,18 @@
                 "node": ">=8"
             }
         },
+        "node_modules/cypress/node_modules/lru-cache": {
+            "version": "6.0.0",
+            "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+            "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+            "dev": true,
+            "dependencies": {
+                "yallist": "^4.0.0"
+            },
+            "engines": {
+                "node": ">=10"
+            }
+        },
         "node_modules/cypress/node_modules/semver": {
             "version": "7.3.8",
             "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz",
@@ -6096,6 +7484,12 @@
                 "url": "https://github.com/chalk/supports-color?sponsor=1"
             }
         },
+        "node_modules/cypress/node_modules/yallist": {
+            "version": "4.0.0",
+            "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+            "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
+            "dev": true
+        },
         "node_modules/dashdash": {
             "version": "1.14.1",
             "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz",
@@ -6136,9 +7530,9 @@
             }
         },
         "node_modules/dayjs": {
-            "version": "1.11.6",
-            "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.6.tgz",
-            "integrity": "sha512-zZbY5giJAinCG+7AGaw0wIhNZ6J8AhWuSXKvuc1KAyMiRsvGQWqh4L+MomvhdAYjN+lqvVCMq1I41e3YHvXkyQ=="
+            "version": "1.11.7",
+            "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.7.tgz",
+            "integrity": "sha512-+Yw9U6YO5TQohxLcIkrXBeY73WP3ejHWVvx8XCk3gxvQDCTEmS48ZrSZCKciI7Bhl/uCMyxYtE9UqRILmFphkQ=="
         },
         "node_modules/debug": {
             "version": "4.3.4",
@@ -6196,11 +7590,36 @@
             }
         },
         "node_modules/decimal.js": {
-            "version": "10.4.2",
-            "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.2.tgz",
-            "integrity": "sha512-ic1yEvwT6GuvaYwBLLY6/aFFgjZdySKTE8en/fkU3QICTmRtgtSlFn0u0BXN06InZwtfCelR7j8LRiDI/02iGA==",
+            "version": "10.4.3",
+            "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz",
+            "integrity": "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==",
             "dev": true
         },
+        "node_modules/decompress-response": {
+            "version": "6.0.0",
+            "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz",
+            "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==",
+            "dependencies": {
+                "mimic-response": "^3.1.0"
+            },
+            "engines": {
+                "node": ">=10"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/sindresorhus"
+            }
+        },
+        "node_modules/decompress-response/node_modules/mimic-response": {
+            "version": "3.1.0",
+            "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz",
+            "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==",
+            "engines": {
+                "node": ">=10"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/sindresorhus"
+            }
+        },
         "node_modules/dedent": {
             "version": "0.7.0",
             "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz",
@@ -6214,14 +7633,22 @@
             "dev": true
         },
         "node_modules/deepmerge": {
-            "version": "4.2.2",
-            "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz",
-            "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==",
+            "version": "4.3.0",
+            "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.0.tgz",
+            "integrity": "sha512-z2wJZXrmeHdvYJp/Ux55wIjqo81G5Bp4c+oELTW+7ar6SogWHajt5a9gO3s3IDaGSAXjDk0vlQKN3rms8ab3og==",
             "dev": true,
             "engines": {
                 "node": ">=0.10.0"
             }
         },
+        "node_modules/defer-to-connect": {
+            "version": "2.0.1",
+            "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz",
+            "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==",
+            "engines": {
+                "node": ">=10"
+            }
+        },
         "node_modules/define-lazy-prop": {
             "version": "2.0.0",
             "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz",
@@ -6423,6 +7850,12 @@
                 "url": "https://github.com/fb55/domhandler?sponsor=1"
             }
         },
+        "node_modules/dompurify": {
+            "version": "2.4.3",
+            "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-2.4.3.tgz",
+            "integrity": "sha512-q6QaLcakcRjebxjg8/+NP+h0rPfatOgOzc46Fst9VAA3jF2ApfKBNKMzdP4DYTqtUMXSCd5pRS/8Po/OmoCHZQ==",
+            "dev": true
+        },
         "node_modules/domutils": {
             "version": "3.0.1",
             "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.0.1.tgz",
@@ -6436,6 +7869,14 @@
                 "url": "https://github.com/fb55/domutils?sponsor=1"
             }
         },
+        "node_modules/dotenv": {
+            "version": "16.0.3",
+            "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.0.3.tgz",
+            "integrity": "sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ==",
+            "engines": {
+                "node": ">=12"
+            }
+        },
         "node_modules/duplexify": {
             "version": "4.1.2",
             "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-4.1.2.tgz",
@@ -6471,9 +7912,9 @@
             "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow=="
         },
         "node_modules/electron-to-chromium": {
-            "version": "1.4.284",
-            "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz",
-            "integrity": "sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA==",
+            "version": "1.4.294",
+            "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.294.tgz",
+            "integrity": "sha512-PuHZB3jEN7D8WPPjLmBQAsqQz8tWHlkkB4n0E2OYw8RwVdmBYV0Wn+rUFH8JqYyIRb4HQhhedgxlZL163wqLrQ==",
             "dev": true
         },
         "node_modules/emittery": {
@@ -6568,9 +8009,9 @@
             }
         },
         "node_modules/engine.io-parser": {
-            "version": "5.0.4",
-            "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.0.4.tgz",
-            "integrity": "sha512-+nVFp+5z1E3HcToEnO7ZIj3g+3k9389DvWtvJZz0T6/eOCPIyyxehFcedoYrZQrp0LgQbD9pPXhpMBKMd5QURg==",
+            "version": "5.0.6",
+            "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.0.6.tgz",
+            "integrity": "sha512-tjuoZDMAdEhVnSFleYPCtdL2GXwVTGtNjoeJd9IhIG3C1xs9uwxqRNEu5WpnDZCaozwVlK/nuQhpodhXSIMaxw==",
             "engines": {
                 "node": ">=10.0.0"
             }
@@ -6637,34 +8078,43 @@
             }
         },
         "node_modules/es-abstract": {
-            "version": "1.20.4",
-            "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.4.tgz",
-            "integrity": "sha512-0UtvRN79eMe2L+UNEF1BwRe364sj/DXhQ/k5FmivgoSdpM90b8Jc0mDzKMGo7QS0BVbOP/bTwBKNnDc9rNzaPA==",
+            "version": "1.21.1",
+            "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.21.1.tgz",
+            "integrity": "sha512-QudMsPOz86xYz/1dG1OuGBKOELjCh99IIWHLzy5znUB6j8xG2yMA7bfTV86VSqKF+Y/H08vQPR+9jyXpuC6hfg==",
             "dependencies": {
+                "available-typed-arrays": "^1.0.5",
                 "call-bind": "^1.0.2",
+                "es-set-tostringtag": "^2.0.1",
                 "es-to-primitive": "^1.2.1",
                 "function-bind": "^1.1.1",
                 "function.prototype.name": "^1.1.5",
                 "get-intrinsic": "^1.1.3",
                 "get-symbol-description": "^1.0.0",
+                "globalthis": "^1.0.3",
+                "gopd": "^1.0.1",
                 "has": "^1.0.3",
                 "has-property-descriptors": "^1.0.0",
+                "has-proto": "^1.0.1",
                 "has-symbols": "^1.0.3",
-                "internal-slot": "^1.0.3",
+                "internal-slot": "^1.0.4",
+                "is-array-buffer": "^3.0.1",
                 "is-callable": "^1.2.7",
                 "is-negative-zero": "^2.0.2",
                 "is-regex": "^1.1.4",
                 "is-shared-array-buffer": "^1.0.2",
                 "is-string": "^1.0.7",
+                "is-typed-array": "^1.1.10",
                 "is-weakref": "^1.0.2",
                 "object-inspect": "^1.12.2",
                 "object-keys": "^1.1.1",
                 "object.assign": "^4.1.4",
                 "regexp.prototype.flags": "^1.4.3",
                 "safe-regex-test": "^1.0.0",
-                "string.prototype.trimend": "^1.0.5",
-                "string.prototype.trimstart": "^1.0.5",
-                "unbox-primitive": "^1.0.2"
+                "string.prototype.trimend": "^1.0.6",
+                "string.prototype.trimstart": "^1.0.6",
+                "typed-array-length": "^1.0.4",
+                "unbox-primitive": "^1.0.2",
+                "which-typed-array": "^1.1.9"
             },
             "engines": {
                 "node": ">= 0.4"
@@ -6693,6 +8143,19 @@
                 "url": "https://github.com/sponsors/ljharb"
             }
         },
+        "node_modules/es-set-tostringtag": {
+            "version": "2.0.1",
+            "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz",
+            "integrity": "sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==",
+            "dependencies": {
+                "get-intrinsic": "^1.1.3",
+                "has": "^1.0.3",
+                "has-tostringtag": "^1.0.0"
+            },
+            "engines": {
+                "node": ">= 0.4"
+            }
+        },
         "node_modules/es-to-primitive": {
             "version": "1.2.1",
             "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz",
@@ -6710,9 +8173,9 @@
             }
         },
         "node_modules/esbuild": {
-            "version": "0.15.15",
-            "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.15.15.tgz",
-            "integrity": "sha512-TEw/lwK4Zzld9x3FedV6jy8onOUHqcEX3ADFk4k+gzPUwrxn8nWV62tH0udo8jOtjFodlEfc4ypsqX3e+WWO6w==",
+            "version": "0.15.18",
+            "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.15.18.tgz",
+            "integrity": "sha512-x/R72SmW3sSFRm5zrrIjAhCeQSAWoni3CmHEqfQrZIQTM3lVCdehdwuIqaOtfC2slvpdlLa62GYoN8SxT23m6Q==",
             "dev": true,
             "hasInstallScript": true,
             "bin": {
@@ -6722,34 +8185,34 @@
                 "node": ">=12"
             },
             "optionalDependencies": {
-                "@esbuild/android-arm": "0.15.15",
-                "@esbuild/linux-loong64": "0.15.15",
-                "esbuild-android-64": "0.15.15",
-                "esbuild-android-arm64": "0.15.15",
-                "esbuild-darwin-64": "0.15.15",
-                "esbuild-darwin-arm64": "0.15.15",
-                "esbuild-freebsd-64": "0.15.15",
-                "esbuild-freebsd-arm64": "0.15.15",
-                "esbuild-linux-32": "0.15.15",
-                "esbuild-linux-64": "0.15.15",
-                "esbuild-linux-arm": "0.15.15",
-                "esbuild-linux-arm64": "0.15.15",
-                "esbuild-linux-mips64le": "0.15.15",
-                "esbuild-linux-ppc64le": "0.15.15",
-                "esbuild-linux-riscv64": "0.15.15",
-                "esbuild-linux-s390x": "0.15.15",
-                "esbuild-netbsd-64": "0.15.15",
-                "esbuild-openbsd-64": "0.15.15",
-                "esbuild-sunos-64": "0.15.15",
-                "esbuild-windows-32": "0.15.15",
-                "esbuild-windows-64": "0.15.15",
-                "esbuild-windows-arm64": "0.15.15"
+                "@esbuild/android-arm": "0.15.18",
+                "@esbuild/linux-loong64": "0.15.18",
+                "esbuild-android-64": "0.15.18",
+                "esbuild-android-arm64": "0.15.18",
+                "esbuild-darwin-64": "0.15.18",
+                "esbuild-darwin-arm64": "0.15.18",
+                "esbuild-freebsd-64": "0.15.18",
+                "esbuild-freebsd-arm64": "0.15.18",
+                "esbuild-linux-32": "0.15.18",
+                "esbuild-linux-64": "0.15.18",
+                "esbuild-linux-arm": "0.15.18",
+                "esbuild-linux-arm64": "0.15.18",
+                "esbuild-linux-mips64le": "0.15.18",
+                "esbuild-linux-ppc64le": "0.15.18",
+                "esbuild-linux-riscv64": "0.15.18",
+                "esbuild-linux-s390x": "0.15.18",
+                "esbuild-netbsd-64": "0.15.18",
+                "esbuild-openbsd-64": "0.15.18",
+                "esbuild-sunos-64": "0.15.18",
+                "esbuild-windows-32": "0.15.18",
+                "esbuild-windows-64": "0.15.18",
+                "esbuild-windows-arm64": "0.15.18"
             }
         },
         "node_modules/esbuild-android-64": {
-            "version": "0.15.15",
-            "resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.15.15.tgz",
-            "integrity": "sha512-F+WjjQxO+JQOva3tJWNdVjouFMLK6R6i5gjDvgUthLYJnIZJsp1HlF523k73hELY20WPyEO8xcz7aaYBVkeg5Q==",
+            "version": "0.15.18",
+            "resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.15.18.tgz",
+            "integrity": "sha512-wnpt3OXRhcjfIDSZu9bnzT4/TNTDsOUvip0foZOUBG7QbSt//w3QV4FInVJxNhKc/ErhUxc5z4QjHtMi7/TbgA==",
             "cpu": [
                 "x64"
             ],
@@ -6763,9 +8226,9 @@
             }
         },
         "node_modules/esbuild-android-arm64": {
-            "version": "0.15.15",
-            "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.15.15.tgz",
-            "integrity": "sha512-attlyhD6Y22jNyQ0fIIQ7mnPvDWKw7k6FKnsXlBvQE6s3z6s6cuEHcSgoirquQc7TmZgVCK5fD/2uxmRN+ZpcQ==",
+            "version": "0.15.18",
+            "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.15.18.tgz",
+            "integrity": "sha512-G4xu89B8FCzav9XU8EjsXacCKSG2FT7wW9J6hOc18soEHJdtWu03L3TQDGf0geNxfLTtxENKBzMSq9LlbjS8OQ==",
             "cpu": [
                 "arm64"
             ],
@@ -6779,9 +8242,9 @@
             }
         },
         "node_modules/esbuild-darwin-64": {
-            "version": "0.15.15",
-            "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.15.15.tgz",
-            "integrity": "sha512-ohZtF8W1SHJ4JWldsPVdk8st0r9ExbAOSrBOh5L+Mq47i696GVwv1ab/KlmbUoikSTNoXEhDzVpxUR/WIO19FQ==",
+            "version": "0.15.18",
+            "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.15.18.tgz",
+            "integrity": "sha512-2WAvs95uPnVJPuYKP0Eqx+Dl/jaYseZEUUT1sjg97TJa4oBtbAKnPnl3b5M9l51/nbx7+QAEtuummJZW0sBEmg==",
             "cpu": [
                 "x64"
             ],
@@ -6795,9 +8258,9 @@
             }
         },
         "node_modules/esbuild-darwin-arm64": {
-            "version": "0.15.15",
-            "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.15.15.tgz",
-            "integrity": "sha512-P8jOZ5zshCNIuGn+9KehKs/cq5uIniC+BeCykvdVhx/rBXSxmtj3CUIKZz4sDCuESMbitK54drf/2QX9QHG5Ag==",
+            "version": "0.15.18",
+            "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.15.18.tgz",
+            "integrity": "sha512-tKPSxcTJ5OmNb1btVikATJ8NftlyNlc8BVNtyT/UAr62JFOhwHlnoPrhYWz09akBLHI9nElFVfWSTSRsrZiDUA==",
             "cpu": [
                 "arm64"
             ],
@@ -6811,9 +8274,9 @@
             }
         },
         "node_modules/esbuild-freebsd-64": {
-            "version": "0.15.15",
-            "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.15.15.tgz",
-            "integrity": "sha512-KkTg+AmDXz1IvA9S1gt8dE24C8Thx0X5oM0KGF322DuP+P3evwTL9YyusHAWNsh4qLsR80nvBr/EIYs29VSwuA==",
+            "version": "0.15.18",
+            "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.15.18.tgz",
+            "integrity": "sha512-TT3uBUxkteAjR1QbsmvSsjpKjOX6UkCstr8nMr+q7zi3NuZ1oIpa8U41Y8I8dJH2fJgdC3Dj3CXO5biLQpfdZA==",
             "cpu": [
                 "x64"
             ],
@@ -6827,9 +8290,9 @@
             }
         },
         "node_modules/esbuild-freebsd-arm64": {
-            "version": "0.15.15",
-            "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.15.15.tgz",
-            "integrity": "sha512-FUcML0DRsuyqCMfAC+HoeAqvWxMeq0qXvclZZ/lt2kLU6XBnDA5uKTLUd379WYEyVD4KKFctqWd9tTuk8C/96g==",
+            "version": "0.15.18",
+            "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.15.18.tgz",
+            "integrity": "sha512-R/oVr+X3Tkh+S0+tL41wRMbdWtpWB8hEAMsOXDumSSa6qJR89U0S/PpLXrGF7Wk/JykfpWNokERUpCeHDl47wA==",
             "cpu": [
                 "arm64"
             ],
@@ -6843,9 +8306,9 @@
             }
         },
         "node_modules/esbuild-linux-32": {
-            "version": "0.15.15",
-            "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.15.15.tgz",
-            "integrity": "sha512-q28Qn5pZgHNqug02aTkzw5sW9OklSo96b5nm17Mq0pDXrdTBcQ+M6Q9A1B+dalFeynunwh/pvfrNucjzwDXj+Q==",
+            "version": "0.15.18",
+            "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.15.18.tgz",
+            "integrity": "sha512-lphF3HiCSYtaa9p1DtXndiQEeQDKPl9eN/XNoBf2amEghugNuqXNZA/ZovthNE2aa4EN43WroO0B85xVSjYkbg==",
             "cpu": [
                 "ia32"
             ],
@@ -6859,9 +8322,9 @@
             }
         },
         "node_modules/esbuild-linux-64": {
-            "version": "0.15.15",
-            "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.15.15.tgz",
-            "integrity": "sha512-217KPmWMirkf8liO+fj2qrPwbIbhNTGNVtvqI1TnOWJgcMjUWvd677Gq3fTzXEjilkx2yWypVnTswM2KbXgoAg==",
+            "version": "0.15.18",
+            "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.15.18.tgz",
+            "integrity": "sha512-hNSeP97IviD7oxLKFuii5sDPJ+QHeiFTFLoLm7NZQligur8poNOWGIgpQ7Qf8Balb69hptMZzyOBIPtY09GZYw==",
             "cpu": [
                 "x64"
             ],
@@ -6875,9 +8338,9 @@
             }
         },
         "node_modules/esbuild-linux-arm": {
-            "version": "0.15.15",
-            "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.15.15.tgz",
-            "integrity": "sha512-RYVW9o2yN8yM7SB1yaWr378CwrjvGCyGybX3SdzPHpikUHkME2AP55Ma20uNwkNyY2eSYFX9D55kDrfQmQBR4w==",
+            "version": "0.15.18",
+            "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.15.18.tgz",
+            "integrity": "sha512-UH779gstRblS4aoS2qpMl3wjg7U0j+ygu3GjIeTonCcN79ZvpPee12Qun3vcdxX+37O5LFxz39XeW2I9bybMVA==",
             "cpu": [
                 "arm"
             ],
@@ -6891,9 +8354,9 @@
             }
         },
         "node_modules/esbuild-linux-arm64": {
-            "version": "0.15.15",
-            "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.15.15.tgz",
-            "integrity": "sha512-/ltmNFs0FivZkYsTzAsXIfLQX38lFnwJTWCJts0IbCqWZQe+jjj0vYBNbI0kmXLb3y5NljiM5USVAO1NVkdh2g==",
+            "version": "0.15.18",
+            "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.15.18.tgz",
+            "integrity": "sha512-54qr8kg/6ilcxd+0V3h9rjT4qmjc0CccMVWrjOEM/pEcUzt8X62HfBSeZfT2ECpM7104mk4yfQXkosY8Quptug==",
             "cpu": [
                 "arm64"
             ],
@@ -6907,9 +8370,9 @@
             }
         },
         "node_modules/esbuild-linux-mips64le": {
-            "version": "0.15.15",
-            "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.15.15.tgz",
-            "integrity": "sha512-PksEPb321/28GFFxtvL33yVPfnMZihxkEv5zME2zapXGp7fA1X2jYeiTUK+9tJ/EGgcNWuwvtawPxJG7Mmn86A==",
+            "version": "0.15.18",
+            "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.15.18.tgz",
+            "integrity": "sha512-Mk6Ppwzzz3YbMl/ZZL2P0q1tnYqh/trYZ1VfNP47C31yT0K8t9s7Z077QrDA/guU60tGNp2GOwCQnp+DYv7bxQ==",
             "cpu": [
                 "mips64el"
             ],
@@ -6923,9 +8386,9 @@
             }
         },
         "node_modules/esbuild-linux-ppc64le": {
-            "version": "0.15.15",
-            "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.15.15.tgz",
-            "integrity": "sha512-ek8gJBEIhcpGI327eAZigBOHl58QqrJrYYIZBWQCnH3UnXoeWMrMZLeeZL8BI2XMBhP+sQ6ERctD5X+ajL/AIA==",
+            "version": "0.15.18",
+            "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.15.18.tgz",
+            "integrity": "sha512-b0XkN4pL9WUulPTa/VKHx2wLCgvIAbgwABGnKMY19WhKZPT+8BxhZdqz6EgkqCLld7X5qiCY2F/bfpUUlnFZ9w==",
             "cpu": [
                 "ppc64"
             ],
@@ -6939,9 +8402,9 @@
             }
         },
         "node_modules/esbuild-linux-riscv64": {
-            "version": "0.15.15",
-            "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.15.15.tgz",
-            "integrity": "sha512-H5ilTZb33/GnUBrZMNJtBk7/OXzDHDXjIzoLXHSutwwsLxSNaLxzAaMoDGDd/keZoS+GDBqNVxdCkpuiRW4OSw==",
+            "version": "0.15.18",
+            "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.15.18.tgz",
+            "integrity": "sha512-ba2COaoF5wL6VLZWn04k+ACZjZ6NYniMSQStodFKH/Pu6RxzQqzsmjR1t9QC89VYJxBeyVPTaHuBMCejl3O/xg==",
             "cpu": [
                 "riscv64"
             ],
@@ -6955,9 +8418,9 @@
             }
         },
         "node_modules/esbuild-linux-s390x": {
-            "version": "0.15.15",
-            "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.15.15.tgz",
-            "integrity": "sha512-jKaLUg78mua3rrtrkpv4Or2dNTJU7bgHN4bEjT4OX4GR7nLBSA9dfJezQouTxMmIW7opwEC5/iR9mpC18utnxQ==",
+            "version": "0.15.18",
+            "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.15.18.tgz",
+            "integrity": "sha512-VbpGuXEl5FCs1wDVp93O8UIzl3ZrglgnSQ+Hu79g7hZu6te6/YHgVJxCM2SqfIila0J3k0csfnf8VD2W7u2kzQ==",
             "cpu": [
                 "s390x"
             ],
@@ -6971,9 +8434,9 @@
             }
         },
         "node_modules/esbuild-netbsd-64": {
-            "version": "0.15.15",
-            "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.15.15.tgz",
-            "integrity": "sha512-aOvmF/UkjFuW6F36HbIlImJTTx45KUCHJndtKo+KdP8Dhq3mgLRKW9+6Ircpm8bX/RcS3zZMMmaBLkvGY06Gvw==",
+            "version": "0.15.18",
+            "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.15.18.tgz",
+            "integrity": "sha512-98ukeCdvdX7wr1vUYQzKo4kQ0N2p27H7I11maINv73fVEXt2kyh4K4m9f35U1K43Xc2QGXlzAw0K9yoU7JUjOg==",
             "cpu": [
                 "x64"
             ],
@@ -6987,9 +8450,9 @@
             }
         },
         "node_modules/esbuild-openbsd-64": {
-            "version": "0.15.15",
-            "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.15.15.tgz",
-            "integrity": "sha512-HFFX+WYedx1w2yJ1VyR1Dfo8zyYGQZf1cA69bLdrHzu9svj6KH6ZLK0k3A1/LFPhcEY9idSOhsB2UyU0tHPxgQ==",
+            "version": "0.15.18",
+            "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.15.18.tgz",
+            "integrity": "sha512-yK5NCcH31Uae076AyQAXeJzt/vxIo9+omZRKj1pauhk3ITuADzuOx5N2fdHrAKPxN+zH3w96uFKlY7yIn490xQ==",
             "cpu": [
                 "x64"
             ],
@@ -7003,9 +8466,9 @@
             }
         },
         "node_modules/esbuild-sunos-64": {
-            "version": "0.15.15",
-            "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.15.15.tgz",
-            "integrity": "sha512-jOPBudffG4HN8yJXcK9rib/ZTFoTA5pvIKbRrt3IKAGMq1EpBi4xoVoSRrq/0d4OgZLaQbmkHp8RO9eZIn5atA==",
+            "version": "0.15.18",
+            "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.15.18.tgz",
+            "integrity": "sha512-On22LLFlBeLNj/YF3FT+cXcyKPEI263nflYlAhz5crxtp3yRG1Ugfr7ITyxmCmjm4vbN/dGrb/B7w7U8yJR9yw==",
             "cpu": [
                 "x64"
             ],
@@ -7019,9 +8482,9 @@
             }
         },
         "node_modules/esbuild-windows-32": {
-            "version": "0.15.15",
-            "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.15.15.tgz",
-            "integrity": "sha512-MDkJ3QkjnCetKF0fKxCyYNBnOq6dmidcwstBVeMtXSgGYTy8XSwBeIE4+HuKiSsG6I/mXEb++px3IGSmTN0XiA==",
+            "version": "0.15.18",
+            "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.15.18.tgz",
+            "integrity": "sha512-o+eyLu2MjVny/nt+E0uPnBxYuJHBvho8vWsC2lV61A7wwTWC3jkN2w36jtA+yv1UgYkHRihPuQsL23hsCYGcOQ==",
             "cpu": [
                 "ia32"
             ],
@@ -7035,9 +8498,9 @@
             }
         },
         "node_modules/esbuild-windows-64": {
-            "version": "0.15.15",
-            "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.15.15.tgz",
-            "integrity": "sha512-xaAUIB2qllE888SsMU3j9nrqyLbkqqkpQyWVkfwSil6BBPgcPk3zOFitTTncEKCLTQy3XV9RuH7PDj3aJDljWA==",
+            "version": "0.15.18",
+            "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.15.18.tgz",
+            "integrity": "sha512-qinug1iTTaIIrCorAUjR0fcBk24fjzEedFYhhispP8Oc7SFvs+XeW3YpAKiKp8dRpizl4YYAhxMjlftAMJiaUw==",
             "cpu": [
                 "x64"
             ],
@@ -7051,9 +8514,9 @@
             }
         },
         "node_modules/esbuild-windows-arm64": {
-            "version": "0.15.15",
-            "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.15.15.tgz",
-            "integrity": "sha512-ttuoCYCIJAFx4UUKKWYnFdrVpoXa3+3WWkXVI6s09U+YjhnyM5h96ewTq/WgQj9LFSIlABQvadHSOQyAVjW5xQ==",
+            "version": "0.15.18",
+            "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.15.18.tgz",
+            "integrity": "sha512-q9bsYzegpZcLziq0zgUi5KqGVtfhjxGbnksaBFYmWLxeV/S1fK4OLdq2DFYnXcLMjlZw2L0jLsk1eGoB522WXQ==",
             "cpu": [
                 "arm64"
             ],
@@ -7242,6 +8705,18 @@
                 "eslint": "^6.2.0 || ^7.0.0 || ^8.0.0"
             }
         },
+        "node_modules/eslint-plugin-vue/node_modules/lru-cache": {
+            "version": "6.0.0",
+            "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+            "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+            "dev": true,
+            "dependencies": {
+                "yallist": "^4.0.0"
+            },
+            "engines": {
+                "node": ">=10"
+            }
+        },
         "node_modules/eslint-plugin-vue/node_modules/semver": {
             "version": "7.3.8",
             "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz",
@@ -7257,6 +8732,12 @@
                 "node": ">=10"
             }
         },
+        "node_modules/eslint-plugin-vue/node_modules/yallist": {
+            "version": "4.0.0",
+            "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+            "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
+            "dev": true
+        },
         "node_modules/eslint-scope": {
             "version": "5.1.1",
             "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz",
@@ -7390,9 +8871,9 @@
             }
         },
         "node_modules/eslint/node_modules/globals": {
-            "version": "13.18.0",
-            "resolved": "https://registry.npmjs.org/globals/-/globals-13.18.0.tgz",
-            "integrity": "sha512-/mR4KI8Ps2spmoc0Ulu9L7agOF0du1CZNQ3dke8yItYlyKNmGrkONemBbd6V8UTc1Wgcqn21t3WYB7dbRmh6/A==",
+            "version": "13.20.0",
+            "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz",
+            "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==",
             "dev": true,
             "dependencies": {
                 "type-fest": "^0.20.2"
@@ -7558,6 +9039,12 @@
                 "node": ">= 0.6"
             }
         },
+        "node_modules/event-to-promise": {
+            "version": "0.7.0",
+            "resolved": "https://registry.npmjs.org/event-to-promise/-/event-to-promise-0.7.0.tgz",
+            "integrity": "sha512-VOBBfyaADfe378ZzG0tgkzmsvzUyeU5arehrFzNRt5yaASUDshgctTwSrPI17ocAwR3+YftsxRClHF+GBKFByQ==",
+            "deprecated": "Use promise-toolbox/fromEvent instead"
+        },
         "node_modules/eventemitter2": {
             "version": "6.4.7",
             "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-6.4.7.tgz",
@@ -7823,6 +9310,22 @@
             "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==",
             "dev": true
         },
+        "node_modules/fast-xml-parser": {
+            "version": "4.0.11",
+            "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.0.11.tgz",
+            "integrity": "sha512-4aUg3aNRR/WjQAcpceODG1C3x3lFANXRo8+1biqfieHmg9pyMt7qB4lQV/Ta6sJCTbA5vfD8fnA8S54JATiFUA==",
+            "optional": true,
+            "dependencies": {
+                "strnum": "^1.0.5"
+            },
+            "bin": {
+                "fxparser": "src/cli/cli.js"
+            },
+            "funding": {
+                "type": "paypal",
+                "url": "https://paypal.me/naturalintelligence"
+            }
+        },
         "node_modules/fastest-levenshtein": {
             "version": "1.0.16",
             "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz",
@@ -7855,9 +9358,9 @@
             }
         },
         "node_modules/fastq": {
-            "version": "1.13.0",
-            "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz",
-            "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==",
+            "version": "1.15.0",
+            "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz",
+            "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==",
             "dev": true,
             "dependencies": {
                 "reusify": "^1.0.4"
@@ -8013,6 +9516,14 @@
                 }
             }
         },
+        "node_modules/for-each": {
+            "version": "0.3.3",
+            "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz",
+            "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==",
+            "dependencies": {
+                "is-callable": "^1.1.3"
+            }
+        },
         "node_modules/forever-agent": {
             "version": "0.6.1",
             "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz",
@@ -8035,6 +9546,14 @@
                 "node": ">= 6"
             }
         },
+        "node_modules/form-data-encoder": {
+            "version": "2.1.4",
+            "resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-2.1.4.tgz",
+            "integrity": "sha512-yDYSgNMraqvnxiEXO4hi88+YZxaHC6QKzb5N84iRCTDeRO7ZALpir/lVmf/uXUhnwUr2O4HU8s/n6x+yNjQkHw==",
+            "engines": {
+                "node": ">= 14.17"
+            }
+        },
         "node_modules/forwarded": {
             "version": "0.2.0",
             "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz",
@@ -8061,6 +9580,12 @@
                 "readable-stream": "^2.0.0"
             }
         },
+        "node_modules/from2/node_modules/isarray": {
+            "version": "1.0.0",
+            "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
+            "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==",
+            "dev": true
+        },
         "node_modules/from2/node_modules/readable-stream": {
             "version": "2.3.7",
             "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
@@ -8111,6 +9636,22 @@
                 "node": ">= 8"
             }
         },
+        "node_modules/fs-minipass/node_modules/minipass": {
+            "version": "3.3.6",
+            "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz",
+            "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==",
+            "dependencies": {
+                "yallist": "^4.0.0"
+            },
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/fs-minipass/node_modules/yallist": {
+            "version": "4.0.0",
+            "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+            "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
+        },
         "node_modules/fs.realpath": {
             "version": "1.0.0",
             "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
@@ -8166,6 +9707,33 @@
                 "url": "https://github.com/sponsors/ljharb"
             }
         },
+        "node_modules/gamedig": {
+            "version": "4.0.6",
+            "resolved": "https://registry.npmjs.org/gamedig/-/gamedig-4.0.6.tgz",
+            "integrity": "sha512-h0k9n/e5vNrd9Mh2wyFUp2Vo7ABWbDkdBxKC6FNJLOZiU5d9Z29bntGeYbXtOkcRWoV6Q63wSAJ3jLWxYQkpZw==",
+            "dependencies": {
+                "cheerio": "^1.0.0-rc.10",
+                "compressjs": "^1.0.2",
+                "gbxremote": "^0.2.1",
+                "got": "^12.0.3",
+                "iconv-lite": "^0.6.3",
+                "long": "^5.2.0",
+                "minimist": "^1.2.6",
+                "punycode": "^2.1.1",
+                "varint": "^6.0.0"
+            },
+            "bin": {
+                "gamedig": "bin/gamedig.js"
+            },
+            "engines": {
+                "node": ">=14.0.0"
+            }
+        },
+        "node_modules/gamedig/node_modules/long": {
+            "version": "5.2.1",
+            "resolved": "https://registry.npmjs.org/long/-/long-5.2.1.tgz",
+            "integrity": "sha512-GKSNGeNAtw8IryjjkhZxuKB3JzlcLTwjtiQCHKvqQet81I93kXslhDQruGI/QsddO83mcDToBVy7GqGS/zYf/A=="
+        },
         "node_modules/gauge": {
             "version": "3.0.2",
             "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz",
@@ -8185,6 +9753,21 @@
                 "node": ">=10"
             }
         },
+        "node_modules/gbxremote": {
+            "version": "0.2.1",
+            "resolved": "https://registry.npmjs.org/gbxremote/-/gbxremote-0.2.1.tgz",
+            "integrity": "sha512-SMehu6Y6ndq2Qgp9VxAb8Np3f+UUD+RWoW2SAMaxzGS96rWXyr4T1GGkecO0HHtxeH1m7pEh4FJWB8a/6aM2XQ==",
+            "dependencies": {
+                "any-promise": "^1.1.0",
+                "barse": "~0.4.2",
+                "event-to-promise": "^0.7.0",
+                "string-to-stream": "^1.0.1",
+                "xmlrpc": "^1.3.1"
+            },
+            "engines": {
+                "node": ">=0.10"
+            }
+        },
         "node_modules/generate-function": {
             "version": "2.3.1",
             "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.3.1.tgz",
@@ -8193,6 +9776,14 @@
                 "is-property": "^1.0.2"
             }
         },
+        "node_modules/generic-pool": {
+            "version": "3.9.0",
+            "resolved": "https://registry.npmjs.org/generic-pool/-/generic-pool-3.9.0.tgz",
+            "integrity": "sha512-hymDOu5B53XvN4QT9dBmZxPX4CWhBPPLguTZ9MMFeFa/Kg0xWVfylOVNlJji/E7yTZWFd/q9GO5TxDLq156D7g==",
+            "engines": {
+                "node": ">= 4"
+            }
+        },
         "node_modules/gensync": {
             "version": "1.0.0-beta.2",
             "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz",
@@ -8211,9 +9802,9 @@
             }
         },
         "node_modules/get-intrinsic": {
-            "version": "1.1.3",
-            "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz",
-            "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==",
+            "version": "1.2.0",
+            "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz",
+            "integrity": "sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==",
             "dependencies": {
                 "function-bind": "^1.1.1",
                 "has": "^1.0.3",
@@ -8227,7 +9818,6 @@
             "version": "0.1.0",
             "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz",
             "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==",
-            "dev": true,
             "engines": {
                 "node": ">=8.0.0"
             }
@@ -8275,9 +9865,9 @@
             }
         },
         "node_modules/getopts": {
-            "version": "2.2.5",
-            "resolved": "https://registry.npmjs.org/getopts/-/getopts-2.2.5.tgz",
-            "integrity": "sha512-9jb7AW5p3in+IiJWhQiZmmwkpLaR/ccTWdWQCtZM66HJcHHLegowh4q4tSD7gouUyeNvFWRavfK9GXosQHDpFA=="
+            "version": "2.3.0",
+            "resolved": "https://registry.npmjs.org/getopts/-/getopts-2.3.0.tgz",
+            "integrity": "sha512-5eDf9fuSXwxBL6q5HX+dhDj+dslFGWzU5thZ9kNKUkcPtaPdatmUFKwHFrLb/uf/WpA4BHET+AX3Scl56cAjpA=="
         },
         "node_modules/getos": {
             "version": "3.2.1",
@@ -8436,12 +10026,71 @@
             "integrity": "sha512-xYfnw62CKG8nLkZBfWbhWwDw02CHty86jfPcc2cr3ZfeuK9ysoVPPEUxf21bAD/rWAgk52SuBrLJlefNy8mvFg==",
             "dev": true
         },
+        "node_modules/gopd": {
+            "version": "1.0.1",
+            "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz",
+            "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==",
+            "dependencies": {
+                "get-intrinsic": "^1.1.3"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/ljharb"
+            }
+        },
+        "node_modules/got": {
+            "version": "12.5.3",
+            "resolved": "https://registry.npmjs.org/got/-/got-12.5.3.tgz",
+            "integrity": "sha512-8wKnb9MGU8IPGRIo+/ukTy9XLJBwDiCpIf5TVzQ9Cpol50eMTpBq2GAuDsuDIz7hTYmZgMgC1e9ydr6kSDWs3w==",
+            "dependencies": {
+                "@sindresorhus/is": "^5.2.0",
+                "@szmarczak/http-timer": "^5.0.1",
+                "cacheable-lookup": "^7.0.0",
+                "cacheable-request": "^10.2.1",
+                "decompress-response": "^6.0.0",
+                "form-data-encoder": "^2.1.2",
+                "get-stream": "^6.0.1",
+                "http2-wrapper": "^2.1.10",
+                "lowercase-keys": "^3.0.0",
+                "p-cancelable": "^3.0.0",
+                "responselike": "^3.0.0"
+            },
+            "engines": {
+                "node": ">=14.16"
+            },
+            "funding": {
+                "url": "https://github.com/sindresorhus/got?sponsor=1"
+            }
+        },
+        "node_modules/got/node_modules/cacheable-lookup": {
+            "version": "7.0.0",
+            "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-7.0.0.tgz",
+            "integrity": "sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w==",
+            "engines": {
+                "node": ">=14.16"
+            }
+        },
+        "node_modules/got/node_modules/get-stream": {
+            "version": "6.0.1",
+            "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz",
+            "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==",
+            "engines": {
+                "node": ">=10"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/sindresorhus"
+            }
+        },
         "node_modules/graceful-fs": {
             "version": "4.2.10",
             "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz",
             "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==",
             "devOptional": true
         },
+        "node_modules/graceful-readlink": {
+            "version": "1.0.1",
+            "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz",
+            "integrity": "sha512-8tLu60LgxF6XpdbK8OW3FA+IfTNBn1ZHGHKF4KQbEeSkajYw5PlYJcKluntgegDPTg8UkHjpet1T82vk6TQ68w=="
+        },
         "node_modules/har-schema": {
             "version": "2.0.0",
             "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz",
@@ -8513,6 +10162,17 @@
                 "url": "https://github.com/sponsors/ljharb"
             }
         },
+        "node_modules/has-proto": {
+            "version": "1.0.1",
+            "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz",
+            "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==",
+            "engines": {
+                "node": ">= 0.4"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/ljharb"
+            }
+        },
         "node_modules/has-symbols": {
             "version": "1.0.3",
             "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz",
@@ -8570,6 +10230,24 @@
                 "node": ">=10"
             }
         },
+        "node_modules/hosted-git-info/node_modules/lru-cache": {
+            "version": "6.0.0",
+            "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+            "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+            "dev": true,
+            "dependencies": {
+                "yallist": "^4.0.0"
+            },
+            "engines": {
+                "node": ">=10"
+            }
+        },
+        "node_modules/hosted-git-info/node_modules/yallist": {
+            "version": "4.0.0",
+            "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+            "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
+            "dev": true
+        },
         "node_modules/html-encoding-sniffer": {
             "version": "2.0.1",
             "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz",
@@ -8618,6 +10296,11 @@
                 "entities": "^4.3.0"
             }
         },
+        "node_modules/http-cache-semantics": {
+            "version": "4.1.1",
+            "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz",
+            "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ=="
+        },
         "node_modules/http-errors": {
             "version": "1.8.1",
             "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz",
@@ -8634,9 +10317,9 @@
             }
         },
         "node_modules/http-graceful-shutdown": {
-            "version": "3.1.11",
-            "resolved": "https://registry.npmjs.org/http-graceful-shutdown/-/http-graceful-shutdown-3.1.11.tgz",
-            "integrity": "sha512-tfOwKDZA8kJqDNBK2ur+o55HbhDHoflvDCDgjbmm5eAn0RhqhdlUjVygj8e258B5nn5kNsEFOl7DbXLskKrgGA==",
+            "version": "3.1.12",
+            "resolved": "https://registry.npmjs.org/http-graceful-shutdown/-/http-graceful-shutdown-3.1.12.tgz",
+            "integrity": "sha512-z3mH1HUwRESrauPjvjH5QuH2Ce4uLlWonPFgZnwAyxIFYROxIMcNNWwNltN+s8fHF/aGlsfQDOICHLXsabK43w==",
             "dependencies": {
                 "debug": "^4.3.4"
             },
@@ -8671,6 +10354,18 @@
                 "node": ">=0.10"
             }
         },
+        "node_modules/http2-wrapper": {
+            "version": "2.2.0",
+            "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-2.2.0.tgz",
+            "integrity": "sha512-kZB0wxMo0sh1PehyjJUWRFEd99KC5TLjZ2cULC4f9iqJBAmKQQXEICjxl5iPJRwP40dpeHFqqhm7tYCvODpqpQ==",
+            "dependencies": {
+                "quick-lru": "^5.1.1",
+                "resolve-alpn": "^1.2.0"
+            },
+            "engines": {
+                "node": ">=10.19.0"
+            }
+        },
         "node_modules/https-proxy-agent": {
             "version": "5.0.1",
             "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz",
@@ -8701,9 +10396,9 @@
             }
         },
         "node_modules/hyperid": {
-            "version": "3.0.1",
-            "resolved": "https://registry.npmjs.org/hyperid/-/hyperid-3.0.1.tgz",
-            "integrity": "sha512-I+tl7TS5nsoVhkxqX1rS3Qmqlq44eoPUcgPthW8v3IW8CvWL7lwtd6HQbkDUMrBKJTG0vgEaRsjT35imW/D+9Q==",
+            "version": "3.1.1",
+            "resolved": "https://registry.npmjs.org/hyperid/-/hyperid-3.1.1.tgz",
+            "integrity": "sha512-RveV33kIksycSf7HLkq1sHB5wW0OwuX8ot8MYnY++gaaPXGFfKpBncHrAWxdpuEeRlazUMGWefwP1w6o6GaumA==",
             "dev": true,
             "dependencies": {
                 "uuid": "^8.3.2",
@@ -8741,9 +10436,9 @@
             ]
         },
         "node_modules/ignore": {
-            "version": "5.2.0",
-            "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz",
-            "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==",
+            "version": "5.2.4",
+            "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz",
+            "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==",
             "dev": true,
             "engines": {
                 "node": ">= 4"
@@ -8835,11 +10530,11 @@
             }
         },
         "node_modules/internal-slot": {
-            "version": "1.0.3",
-            "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz",
-            "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==",
+            "version": "1.0.5",
+            "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz",
+            "integrity": "sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==",
             "dependencies": {
-                "get-intrinsic": "^1.1.0",
+                "get-intrinsic": "^1.2.0",
                 "has": "^1.0.3",
                 "side-channel": "^1.0.4"
             },
@@ -8868,6 +10563,19 @@
                 "node": ">= 0.10"
             }
         },
+        "node_modules/is-array-buffer": {
+            "version": "3.0.1",
+            "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.1.tgz",
+            "integrity": "sha512-ASfLknmY8Xa2XtB4wmbz13Wu202baeA18cJBCeCy0wXUHZF0IPyVEXqKEcd+t2fNSLLL1vC6k7lxZEojNbISXQ==",
+            "dependencies": {
+                "call-bind": "^1.0.2",
+                "get-intrinsic": "^1.1.3",
+                "is-typed-array": "^1.1.10"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/ljharb"
+            }
+        },
         "node_modules/is-arrayish": {
             "version": "0.2.1",
             "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
@@ -9221,6 +10929,24 @@
                 "url": "https://github.com/sponsors/ljharb"
             }
         },
+        "node_modules/is-typed-array": {
+            "version": "1.1.10",
+            "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.10.tgz",
+            "integrity": "sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==",
+            "dependencies": {
+                "available-typed-arrays": "^1.0.5",
+                "call-bind": "^1.0.2",
+                "for-each": "^0.3.3",
+                "gopd": "^1.0.1",
+                "has-tostringtag": "^1.0.0"
+            },
+            "engines": {
+                "node": ">= 0.4"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/ljharb"
+            }
+        },
         "node_modules/is-typedarray": {
             "version": "1.0.0",
             "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
@@ -9273,10 +10999,9 @@
             }
         },
         "node_modules/isarray": {
-            "version": "1.0.0",
-            "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
-            "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==",
-            "devOptional": true
+            "version": "0.0.1",
+            "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
+            "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ=="
         },
         "node_modules/isemail": {
             "version": "3.2.0",
@@ -10824,6 +12549,18 @@
                 "node": ">=8"
             }
         },
+        "node_modules/jest-snapshot/node_modules/lru-cache": {
+            "version": "6.0.0",
+            "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+            "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+            "dev": true,
+            "dependencies": {
+                "yallist": "^4.0.0"
+            },
+            "engines": {
+                "node": ">=10"
+            }
+        },
         "node_modules/jest-snapshot/node_modules/semver": {
             "version": "7.3.8",
             "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz",
@@ -10851,6 +12588,12 @@
                 "node": ">=8"
             }
         },
+        "node_modules/jest-snapshot/node_modules/yallist": {
+            "version": "4.0.0",
+            "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+            "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
+            "dev": true
+        },
         "node_modules/jest-util": {
             "version": "27.5.1",
             "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz",
@@ -11180,9 +12923,13 @@
             "integrity": "sha512-/GDnfQYsltsjRswQhN9fhv3EMw2sCpUdrdxyWDOUK7eyD++r3gRhzgiQgc/x4MAv2i1iuQ4lxO5mvqM3vj4bwA=="
         },
         "node_modules/js-sdsl": {
-            "version": "4.1.4",
-            "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.1.4.tgz",
-            "integrity": "sha512-Y2/yD55y5jteOAmY50JbUZYwk3CP3wnLPEZnlR1w9oKhITrBEtAxwuWKebFf8hMrPMgbYwFoWK/lH2sBkErELw=="
+            "version": "4.3.0",
+            "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.3.0.tgz",
+            "integrity": "sha512-mifzlm2+5nZ+lEcLJMoBK0/IH/bDg8XnJfd/Wq6IP+xoCjLZsTOnV2QpxlVbX9bMnkl5PdEjNtBJ9Cj1NjifhQ==",
+            "funding": {
+                "type": "opencollective",
+                "url": "https://opencollective.com/js-sdsl"
+            }
         },
         "node_modules/js-tokens": {
             "version": "4.0.0",
@@ -11337,6 +13084,11 @@
                 "node": ">=6"
             }
         },
+        "node_modules/json-buffer": {
+            "version": "3.0.1",
+            "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz",
+            "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ=="
+        },
         "node_modules/json-parse-even-better-errors": {
             "version": "2.3.1",
             "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz",
@@ -11368,9 +13120,9 @@
             "devOptional": true
         },
         "node_modules/json5": {
-            "version": "2.2.1",
-            "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz",
-            "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==",
+            "version": "2.2.3",
+            "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz",
+            "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==",
             "dev": true,
             "bin": {
                 "json5": "lib/cli.js"
@@ -11392,34 +13144,50 @@
             }
         },
         "node_modules/jsonwebtoken": {
-            "version": "8.5.1",
-            "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-8.5.1.tgz",
-            "integrity": "sha512-XjwVfRS6jTMsqYs0EsuJ4LGxXV14zQybNd4L2r0UvbVnSF9Af8x7p5MzbJ90Ioz/9TI41/hTCvznF/loiSzn8w==",
+            "version": "9.0.0",
+            "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.0.tgz",
+            "integrity": "sha512-tuGfYXxkQGDPnLJ7SibiQgVgeDgfbPq2k2ICcbgqW8WxWLBAxKQM/ZCu/IT8SOSwmaYl4dpTFCW5xZv7YbbWUw==",
             "dependencies": {
                 "jws": "^3.2.2",
-                "lodash.includes": "^4.3.0",
-                "lodash.isboolean": "^3.0.3",
-                "lodash.isinteger": "^4.0.4",
-                "lodash.isnumber": "^3.0.3",
-                "lodash.isplainobject": "^4.0.6",
-                "lodash.isstring": "^4.0.1",
-                "lodash.once": "^4.0.0",
+                "lodash": "^4.17.21",
                 "ms": "^2.1.1",
-                "semver": "^5.6.0"
+                "semver": "^7.3.8"
             },
             "engines": {
-                "node": ">=4",
-                "npm": ">=1.4.28"
+                "node": ">=12",
+                "npm": ">=6"
+            }
+        },
+        "node_modules/jsonwebtoken/node_modules/lru-cache": {
+            "version": "6.0.0",
+            "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+            "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+            "dependencies": {
+                "yallist": "^4.0.0"
+            },
+            "engines": {
+                "node": ">=10"
             }
         },
         "node_modules/jsonwebtoken/node_modules/semver": {
-            "version": "5.7.1",
-            "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
-            "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
+            "version": "7.3.8",
+            "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz",
+            "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==",
+            "dependencies": {
+                "lru-cache": "^6.0.0"
+            },
             "bin": {
-                "semver": "bin/semver"
+                "semver": "bin/semver.js"
+            },
+            "engines": {
+                "node": ">=10"
             }
         },
+        "node_modules/jsonwebtoken/node_modules/yallist": {
+            "version": "4.0.0",
+            "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+            "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
+        },
         "node_modules/jsprim": {
             "version": "2.0.2",
             "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-2.0.2.tgz",
@@ -11464,6 +13232,14 @@
             "resolved": "https://registry.npmjs.org/jwt-decode/-/jwt-decode-3.1.2.tgz",
             "integrity": "sha512-UfpWE/VZn0iP50d8cz9NrZLM9lSWhcJ+0Gt/nm4by88UL+J1SiKN8/5dkjMmbEzwL2CAe+67GsegCbIKtbp75A=="
         },
+        "node_modules/keyv": {
+            "version": "4.5.2",
+            "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.2.tgz",
+            "integrity": "sha512-5MHbFaKn8cNSmVW7BYnijeAVlE4cYA/SVkifVgrh7yotnfhKmjuXpDKjrABLnT0SfHWV21P8ow07OGfRrNDg8g==",
+            "dependencies": {
+                "json-buffer": "3.0.1"
+            }
+        },
         "node_modules/kind-of": {
             "version": "6.0.3",
             "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz",
@@ -11483,31 +13259,35 @@
             }
         },
         "node_modules/knex": {
-            "version": "0.95.15",
-            "resolved": "https://registry.npmjs.org/knex/-/knex-0.95.15.tgz",
-            "integrity": "sha512-Loq6WgHaWlmL2bfZGWPsy4l8xw4pOE+tmLGkPG0auBppxpI0UcK+GYCycJcqz9W54f2LiGewkCVLBm3Wq4ur/w==",
+            "version": "2.4.2",
+            "resolved": "https://registry.npmjs.org/knex/-/knex-2.4.2.tgz",
+            "integrity": "sha512-tMI1M7a+xwHhPxjbl/H9K1kHX+VncEYcvCx5K00M16bWvpYPKAZd6QrCu68PtHAdIZNQPWZn0GVhqVBEthGWCg==",
             "dependencies": {
-                "colorette": "2.0.16",
-                "commander": "^7.1.0",
-                "debug": "4.3.2",
+                "colorette": "2.0.19",
+                "commander": "^9.1.0",
+                "debug": "4.3.4",
                 "escalade": "^3.1.1",
                 "esm": "^3.2.25",
-                "getopts": "2.2.5",
+                "get-package-type": "^0.1.0",
+                "getopts": "2.3.0",
                 "interpret": "^2.2.0",
                 "lodash": "^4.17.21",
                 "pg-connection-string": "2.5.0",
-                "rechoir": "0.7.0",
+                "rechoir": "^0.8.0",
                 "resolve-from": "^5.0.0",
-                "tarn": "^3.0.1",
+                "tarn": "^3.0.2",
                 "tildify": "2.0.0"
             },
             "bin": {
                 "knex": "bin/cli.js"
             },
             "engines": {
-                "node": ">=10"
+                "node": ">=12"
             },
             "peerDependenciesMeta": {
+                "better-sqlite3": {
+                    "optional": true
+                },
                 "mysql": {
                     "optional": true
                 },
@@ -11528,40 +13308,14 @@
                 }
             }
         },
-        "node_modules/knex/node_modules/colorette": {
-            "version": "2.0.16",
-            "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.16.tgz",
-            "integrity": "sha512-hUewv7oMjCp+wkBv5Rm0v87eJhq4woh5rSR+42YSQJKecCqgIqNkZ6lAlQms/BwHPJA5NKMRlpxPRv0n8HQW6g=="
-        },
         "node_modules/knex/node_modules/commander": {
-            "version": "7.2.0",
-            "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz",
-            "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==",
+            "version": "9.5.0",
+            "resolved": "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz",
+            "integrity": "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==",
             "engines": {
-                "node": ">= 10"
+                "node": "^12.20.0 || >=14"
             }
         },
-        "node_modules/knex/node_modules/debug": {
-            "version": "4.3.2",
-            "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz",
-            "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==",
-            "dependencies": {
-                "ms": "2.1.2"
-            },
-            "engines": {
-                "node": ">=6.0"
-            },
-            "peerDependenciesMeta": {
-                "supports-color": {
-                    "optional": true
-                }
-            }
-        },
-        "node_modules/knex/node_modules/ms": {
-            "version": "2.1.2",
-            "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
-            "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
-        },
         "node_modules/knex/node_modules/resolve-from": {
             "version": "5.0.0",
             "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz",
@@ -11726,36 +13480,6 @@
             "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz",
             "integrity": "sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ=="
         },
-        "node_modules/lodash.includes": {
-            "version": "4.3.0",
-            "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz",
-            "integrity": "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w=="
-        },
-        "node_modules/lodash.isboolean": {
-            "version": "3.0.3",
-            "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz",
-            "integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg=="
-        },
-        "node_modules/lodash.isinteger": {
-            "version": "4.0.4",
-            "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz",
-            "integrity": "sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA=="
-        },
-        "node_modules/lodash.isnumber": {
-            "version": "3.0.3",
-            "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz",
-            "integrity": "sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw=="
-        },
-        "node_modules/lodash.isplainobject": {
-            "version": "4.0.6",
-            "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz",
-            "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA=="
-        },
-        "node_modules/lodash.isstring": {
-            "version": "4.0.1",
-            "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz",
-            "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw=="
-        },
         "node_modules/lodash.merge": {
             "version": "4.6.2",
             "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz",
@@ -11765,7 +13489,8 @@
         "node_modules/lodash.once": {
             "version": "4.1.1",
             "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz",
-            "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg=="
+            "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==",
+            "dev": true
         },
         "node_modules/lodash.truncate": {
             "version": "4.4.2",
@@ -11955,15 +13680,24 @@
             "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz",
             "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA=="
         },
-        "node_modules/lru-cache": {
-            "version": "6.0.0",
-            "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
-            "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
-            "dependencies": {
-                "yallist": "^4.0.0"
-            },
+        "node_modules/lowercase-keys": {
+            "version": "3.0.0",
+            "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-3.0.0.tgz",
+            "integrity": "sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==",
             "engines": {
-                "node": ">=10"
+                "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/sindresorhus"
+            }
+        },
+        "node_modules/lru-cache": {
+            "version": "5.1.1",
+            "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
+            "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==",
+            "dev": true,
+            "dependencies": {
+                "yallist": "^3.0.2"
             }
         },
         "node_modules/magic-string": {
@@ -12013,6 +13747,18 @@
                 "url": "https://github.com/sponsors/sindresorhus"
             }
         },
+        "node_modules/marked": {
+            "version": "4.2.12",
+            "resolved": "https://registry.npmjs.org/marked/-/marked-4.2.12.tgz",
+            "integrity": "sha512-yr8hSKa3Fv4D3jdZmtMMPghgVt6TWbk86WQaWhDloQjRSQhMMYCAro7jP7VDJrjjdV8pxVxMssXS8B8Y5DZ5aw==",
+            "dev": true,
+            "bin": {
+                "marked": "bin/marked.js"
+            },
+            "engines": {
+                "node": ">= 12"
+            }
+        },
         "node_modules/mathml-tag-names": {
             "version": "2.1.3",
             "resolved": "https://registry.npmjs.org/mathml-tag-names/-/mathml-tag-names-2.1.3.tgz",
@@ -12031,6 +13777,12 @@
                 "node": ">= 0.6"
             }
         },
+        "node_modules/memory-pager": {
+            "version": "1.5.0",
+            "resolved": "https://registry.npmjs.org/memory-pager/-/memory-pager-1.5.0.tgz",
+            "integrity": "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==",
+            "optional": true
+        },
         "node_modules/meow": {
             "version": "9.0.0",
             "resolved": "https://registry.npmjs.org/meow/-/meow-9.0.0.tgz",
@@ -12155,6 +13907,17 @@
                 "node": ">=6"
             }
         },
+        "node_modules/mimic-response": {
+            "version": "4.0.0",
+            "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-4.0.0.tgz",
+            "integrity": "sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg==",
+            "engines": {
+                "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/sindresorhus"
+            }
+        },
         "node_modules/min-indent": {
             "version": "1.0.1",
             "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz",
@@ -12176,9 +13939,9 @@
             }
         },
         "node_modules/minimist": {
-            "version": "1.2.7",
-            "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz",
-            "integrity": "sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==",
+            "version": "1.2.8",
+            "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz",
+            "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==",
             "funding": {
                 "url": "https://github.com/sponsors/ljharb"
             }
@@ -12198,12 +13961,9 @@
             }
         },
         "node_modules/minipass": {
-            "version": "3.3.4",
-            "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.4.tgz",
-            "integrity": "sha512-I9WPbWHCGu8W+6k1ZiGpPu0GkoKBeorkfKNuAFBNS1HNFJvke82sxvI5bzcCNpWPorkOO5QQ+zomzzwRxejXiw==",
-            "dependencies": {
-                "yallist": "^4.0.0"
-            },
+            "version": "4.0.3",
+            "resolved": "https://registry.npmjs.org/minipass/-/minipass-4.0.3.tgz",
+            "integrity": "sha512-OW2r4sQ0sI+z5ckEt5c1Tri4xTgZwYDxpE54eqWlQloQRoWtXjqt9udJ5Z4dSv7wK+nfFI7FRXyCpBSft+gpFw==",
             "engines": {
                 "node": ">=8"
             }
@@ -12220,6 +13980,22 @@
                 "node": ">= 8"
             }
         },
+        "node_modules/minizlib/node_modules/minipass": {
+            "version": "3.3.6",
+            "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz",
+            "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==",
+            "dependencies": {
+                "yallist": "^4.0.0"
+            },
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/minizlib/node_modules/yallist": {
+            "version": "4.0.0",
+            "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+            "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
+        },
         "node_modules/mkdirp": {
             "version": "1.0.4",
             "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
@@ -12231,6 +14007,63 @@
                 "node": ">=10"
             }
         },
+        "node_modules/mongodb": {
+            "version": "4.13.0",
+            "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-4.13.0.tgz",
+            "integrity": "sha512-+taZ/bV8d1pYuHL4U+gSwkhmDrwkWbH1l4aah4YpmpscMwgFBkufIKxgP/G7m87/NUuQzc2Z75ZTI7ZOyqZLbw==",
+            "dependencies": {
+                "bson": "^4.7.0",
+                "mongodb-connection-string-url": "^2.5.4",
+                "socks": "^2.7.1"
+            },
+            "engines": {
+                "node": ">=12.9.0"
+            },
+            "optionalDependencies": {
+                "@aws-sdk/credential-providers": "^3.186.0",
+                "saslprep": "^1.0.3"
+            }
+        },
+        "node_modules/mongodb-connection-string-url": {
+            "version": "2.6.0",
+            "resolved": "https://registry.npmjs.org/mongodb-connection-string-url/-/mongodb-connection-string-url-2.6.0.tgz",
+            "integrity": "sha512-WvTZlI9ab0QYtTYnuMLgobULWhokRjtC7db9LtcVfJ+Hsnyr5eo6ZtNAt3Ly24XZScGMelOcGtm7lSn0332tPQ==",
+            "dependencies": {
+                "@types/whatwg-url": "^8.2.1",
+                "whatwg-url": "^11.0.0"
+            }
+        },
+        "node_modules/mongodb-connection-string-url/node_modules/tr46": {
+            "version": "3.0.0",
+            "resolved": "https://registry.npmjs.org/tr46/-/tr46-3.0.0.tgz",
+            "integrity": "sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==",
+            "dependencies": {
+                "punycode": "^2.1.1"
+            },
+            "engines": {
+                "node": ">=12"
+            }
+        },
+        "node_modules/mongodb-connection-string-url/node_modules/webidl-conversions": {
+            "version": "7.0.0",
+            "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz",
+            "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==",
+            "engines": {
+                "node": ">=12"
+            }
+        },
+        "node_modules/mongodb-connection-string-url/node_modules/whatwg-url": {
+            "version": "11.0.0",
+            "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-11.0.0.tgz",
+            "integrity": "sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==",
+            "dependencies": {
+                "tr46": "^3.0.0",
+                "webidl-conversions": "^7.0.0"
+            },
+            "engines": {
+                "node": ">=12"
+            }
+        },
         "node_modules/mqemitter": {
             "version": "4.5.0",
             "resolved": "https://registry.npmjs.org/mqemitter/-/mqemitter-4.5.0.tgz",
@@ -12287,6 +14120,17 @@
                 "process-nextick-args": "^2.0.1"
             }
         },
+        "node_modules/mqtt/node_modules/lru-cache": {
+            "version": "6.0.0",
+            "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+            "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+            "dependencies": {
+                "yallist": "^4.0.0"
+            },
+            "engines": {
+                "node": ">=10"
+            }
+        },
         "node_modules/mqtt/node_modules/mqtt-packet": {
             "version": "6.10.0",
             "resolved": "https://registry.npmjs.org/mqtt-packet/-/mqtt-packet-6.10.0.tgz",
@@ -12297,6 +14141,11 @@
                 "process-nextick-args": "^2.0.1"
             }
         },
+        "node_modules/mqtt/node_modules/yallist": {
+            "version": "4.0.0",
+            "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+            "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
+        },
         "node_modules/ms": {
             "version": "2.1.3",
             "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
@@ -12322,9 +14171,9 @@
             }
         },
         "node_modules/mssql/node_modules/commander": {
-            "version": "9.4.1",
-            "resolved": "https://registry.npmjs.org/commander/-/commander-9.4.1.tgz",
-            "integrity": "sha512-5EEkTNyHNGFPD2H+c/dXXfQZYa/scCKasxWcXJaWnNJ99pnQN9Vnmqow+p+PlFPE63Q6mThaZws1T+HxfpgtPw==",
+            "version": "9.5.0",
+            "resolved": "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz",
+            "integrity": "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==",
             "engines": {
                 "node": "^12.20.0 || >=14"
             }
@@ -12347,30 +14196,47 @@
                 "node": ">= 8.0"
             }
         },
-        "node_modules/named-placeholders": {
-            "version": "1.1.2",
-            "resolved": "https://registry.npmjs.org/named-placeholders/-/named-placeholders-1.1.2.tgz",
-            "integrity": "sha512-wiFWqxoLL3PGVReSZpjLVxyJ1bRqe+KKJVbr4hGs1KWfTZTQyezHFBbuKj9hsizHyGV2ne7EMjHdxEGAybD5SA==",
+        "node_modules/mysql2/node_modules/lru-cache": {
+            "version": "6.0.0",
+            "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+            "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
             "dependencies": {
-                "lru-cache": "^4.1.3"
+                "yallist": "^4.0.0"
             },
             "engines": {
-                "node": ">=6.0.0"
+                "node": ">=10"
+            }
+        },
+        "node_modules/mysql2/node_modules/yallist": {
+            "version": "4.0.0",
+            "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+            "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
+        },
+        "node_modules/named-placeholders": {
+            "version": "1.1.3",
+            "resolved": "https://registry.npmjs.org/named-placeholders/-/named-placeholders-1.1.3.tgz",
+            "integrity": "sha512-eLoBxg6wE/rZkJPhU/xRX1WTpkFEwDJEN96oxFrTsqBdbT5ec295Q+CoHrL9IT0DipqKhmGcaZmwOt8OON5x1w==",
+            "dependencies": {
+                "lru-cache": "^7.14.1"
+            },
+            "engines": {
+                "node": ">=12.0.0"
             }
         },
         "node_modules/named-placeholders/node_modules/lru-cache": {
-            "version": "4.1.5",
-            "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz",
-            "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==",
-            "dependencies": {
-                "pseudomap": "^1.0.2",
-                "yallist": "^2.1.2"
+            "version": "7.14.1",
+            "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.14.1.tgz",
+            "integrity": "sha512-ysxwsnTKdAx96aTRdhDOCQfDgbHnt8SK0KY8SEjO0wHinhWOFTESbjVCMPbU1uGXg/ch4lifqx0wfjOawU2+WA==",
+            "engines": {
+                "node": ">=12"
             }
         },
-        "node_modules/named-placeholders/node_modules/yallist": {
-            "version": "2.1.2",
-            "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz",
-            "integrity": "sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A=="
+        "node_modules/nan": {
+            "version": "2.17.0",
+            "resolved": "https://registry.npmjs.org/nan/-/nan-2.17.0.tgz",
+            "integrity": "sha512-2ZTgtl0nJsO0KQCjEpxcIr5D+Yv90plTitZt9JBfQvVJDS5seMl3FOvsh3+9CoYWXf/1l5OaZzzF6nDm4cagaQ==",
+            "dev": true,
+            "optional": true
         },
         "node_modules/nanoclone": {
             "version": "0.2.1",
@@ -12409,9 +14275,9 @@
             }
         },
         "node_modules/node-abort-controller": {
-            "version": "3.0.1",
-            "resolved": "https://registry.npmjs.org/node-abort-controller/-/node-abort-controller-3.0.1.tgz",
-            "integrity": "sha512-/ujIVxthRs+7q6hsdjHMaj8hRG9NuWmwrz+JdRwZ14jdFoKSkm+vDsCbF9PLpnSqjaWQJuTmVtcWHNLr+vrOFw=="
+            "version": "3.1.1",
+            "resolved": "https://registry.npmjs.org/node-abort-controller/-/node-abort-controller-3.1.1.tgz",
+            "integrity": "sha512-AGK2yQKIjRuqnc6VkX2Xj5d+QW8xZ87pa1UK6yA6ouUyuxfHuMP6umE5QK7UmTeOAymo+Zx1Fxiuw9rVx8taHQ=="
         },
         "node_modules/node-addon-api": {
             "version": "4.3.0",
@@ -12427,9 +14293,9 @@
             }
         },
         "node_modules/node-fetch": {
-            "version": "2.6.7",
-            "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz",
-            "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==",
+            "version": "2.6.9",
+            "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.9.tgz",
+            "integrity": "sha512-DJm/CJkZkRjKKj4Zi4BsKVZh3ValV5IR5s7LVZnW+6YMh0W1BfNA8XSs6DLMGYlId5F3KnA70uu2qepcR08Qqg==",
             "dependencies": {
                 "whatwg-url": "^5.0.0"
             },
@@ -12541,6 +14407,24 @@
                 "node": ">=0.10.0"
             }
         },
+        "node_modules/node-gyp/node_modules/isarray": {
+            "version": "1.0.0",
+            "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
+            "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==",
+            "optional": true
+        },
+        "node_modules/node-gyp/node_modules/lru-cache": {
+            "version": "6.0.0",
+            "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+            "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+            "optional": true,
+            "dependencies": {
+                "yallist": "^4.0.0"
+            },
+            "engines": {
+                "node": ">=10"
+            }
+        },
         "node_modules/node-gyp/node_modules/npmlog": {
             "version": "4.1.2",
             "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz",
@@ -12618,6 +14502,12 @@
                 "node": ">=0.10.0"
             }
         },
+        "node_modules/node-gyp/node_modules/yallist": {
+            "version": "4.0.0",
+            "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+            "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
+            "optional": true
+        },
         "node_modules/node-int64": {
             "version": "0.4.0",
             "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz",
@@ -12640,11 +14530,28 @@
             "integrity": "sha512-i3Sf6khnenl0aXumo0whAlfPWTaBqHxEnVBBxpu3dZ7q69NkPPv71rvPjlDZ5wkeKCTNNUTECljerS5kcYQxRw=="
         },
         "node_modules/node-releases": {
-            "version": "2.0.6",
-            "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.6.tgz",
-            "integrity": "sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==",
+            "version": "2.0.10",
+            "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.10.tgz",
+            "integrity": "sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w==",
             "dev": true
         },
+        "node_modules/node-ssh": {
+            "version": "13.0.1",
+            "resolved": "https://registry.npmjs.org/node-ssh/-/node-ssh-13.0.1.tgz",
+            "integrity": "sha512-prGXb9KXXtrienVBPiyOCm7F8KSsQciN8VCgrkZeJAlSEtF8HsXa/0uVE5a6MgwIBPa0etTgwiyj/lfiFdVK1Q==",
+            "dev": true,
+            "dependencies": {
+                "is-stream": "^2.0.0",
+                "make-dir": "^3.1.0",
+                "sb-promise-queue": "^2.1.0",
+                "sb-scandir": "^3.1.0",
+                "shell-escape": "^0.2.0",
+                "ssh2": "^1.5.0"
+            },
+            "engines": {
+                "node": ">= 10"
+            }
+        },
         "node_modules/nodemailer": {
             "version": "6.6.5",
             "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.6.5.tgz",
@@ -12682,6 +14589,18 @@
                 "node": ">=10"
             }
         },
+        "node_modules/normalize-package-data/node_modules/lru-cache": {
+            "version": "6.0.0",
+            "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+            "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+            "dev": true,
+            "dependencies": {
+                "yallist": "^4.0.0"
+            },
+            "engines": {
+                "node": ">=10"
+            }
+        },
         "node_modules/normalize-package-data/node_modules/semver": {
             "version": "7.3.8",
             "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz",
@@ -12697,6 +14616,12 @@
                 "node": ">=10"
             }
         },
+        "node_modules/normalize-package-data/node_modules/yallist": {
+            "version": "4.0.0",
+            "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+            "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
+            "dev": true
+        },
         "node_modules/normalize-path": {
             "version": "3.0.0",
             "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
@@ -12712,6 +14637,17 @@
             "integrity": "sha512-dxvWdI8gw6eAvk9BlPffgEoGfM7AdijoCwOEJge3e3ulT2XLgmU7KvvxprOaCu05Q1uGRHmOhHe1r6emZoKyFw==",
             "dev": true
         },
+        "node_modules/normalize-url": {
+            "version": "8.0.0",
+            "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-8.0.0.tgz",
+            "integrity": "sha512-uVFpKhj5MheNBJRTiMZ9pE/7hD1QTeEvugSJW/OmLzAp78PB5O6adfMNTvmfKhXBkvCzC+rqifWcVYpGFwTjnw==",
+            "engines": {
+                "node": ">=14.16"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/sindresorhus"
+            }
+        },
         "node_modules/notp": {
             "version": "2.0.3",
             "resolved": "https://registry.npmjs.org/notp/-/notp-2.0.3.tgz",
@@ -12755,12 +14691,12 @@
             }
         },
         "node_modules/number-allocator": {
-            "version": "1.0.12",
-            "resolved": "https://registry.npmjs.org/number-allocator/-/number-allocator-1.0.12.tgz",
-            "integrity": "sha512-sGB0qoQGmKimery9JubBQ9pQUr1V/LixJAk3Ygp7obZf6mpSXime8d7XHEobbIimkdZpgjkNlLt6G7LPEWFYWg==",
+            "version": "1.0.14",
+            "resolved": "https://registry.npmjs.org/number-allocator/-/number-allocator-1.0.14.tgz",
+            "integrity": "sha512-OrL44UTVAvkKdOdRQZIJpLkAdjXGTRda052sN4sO77bKEzYYqWKMBjQvrJFzqygI99gL6Z4u2xctPW1tB8ErvA==",
             "dependencies": {
                 "debug": "^4.3.1",
-                "js-sdsl": "4.1.4"
+                "js-sdsl": "4.3.0"
             }
         },
         "node_modules/number-is-nan": {
@@ -12801,9 +14737,9 @@
             }
         },
         "node_modules/object-inspect": {
-            "version": "1.12.2",
-            "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz",
-            "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==",
+            "version": "1.12.3",
+            "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz",
+            "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==",
             "funding": {
                 "url": "https://github.com/sponsors/ljharb"
             }
@@ -12876,9 +14812,9 @@
             }
         },
         "node_modules/open": {
-            "version": "8.4.0",
-            "resolved": "https://registry.npmjs.org/open/-/open-8.4.0.tgz",
-            "integrity": "sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q==",
+            "version": "8.4.1",
+            "resolved": "https://registry.npmjs.org/open/-/open-8.4.1.tgz",
+            "integrity": "sha512-/4b7qZNhv6Uhd7jjnREh1NjnPxlTq+XNWPG88Ydkj5AILcA5m3ajvcg57pB24EQjKv0dK62XnDqk9c/hkIG5Kg==",
             "dependencies": {
                 "define-lazy-prop": "^2.0.0",
                 "is-docker": "^2.1.1",
@@ -12914,6 +14850,14 @@
             "integrity": "sha512-o6E5qJV5zkAbIDNhGSIlyOhScKXgQrSRMilfph0clDfM0nEnBOlKlH4sWDmG95BW/CvwNz0vmm7dJVtU2KlMiA==",
             "dev": true
         },
+        "node_modules/p-cancelable": {
+            "version": "3.0.0",
+            "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-3.0.0.tgz",
+            "integrity": "sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==",
+            "engines": {
+                "node": ">=12.20"
+            }
+        },
         "node_modules/p-finally": {
             "version": "1.0.0",
             "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz",
@@ -13179,9 +15123,9 @@
             }
         },
         "node_modules/pg-protocol": {
-            "version": "1.5.0",
-            "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.5.0.tgz",
-            "integrity": "sha512-muRttij7H8TqRNu/DxrAJQITO4Ac7RmX3Klyr/9mJEOBeIpgnF8f9jAfRz5d3XwQZl5qBjF9gLsUtMPJE0vezQ=="
+            "version": "1.6.0",
+            "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.6.0.tgz",
+            "integrity": "sha512-M+PDm637OY5WM307051+bsDia5Xej6d9IR4GwJse1qA1DIhiKlksvrneZOYQq42OM+spubpcNYEo2FcKQrDk+Q=="
         },
         "node_modules/pg-types": {
             "version": "2.2.0",
@@ -13280,9 +15224,9 @@
             }
         },
         "node_modules/postcss": {
-            "version": "8.4.19",
-            "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.19.tgz",
-            "integrity": "sha512-h+pbPsyhlYj6N2ozBmHhHrs9DzGmbaarbLvWipMRO7RLS+v4onj26MPFXA5OBYFxyqYhUJK456SwDcY9H2/zsA==",
+            "version": "8.4.21",
+            "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.21.tgz",
+            "integrity": "sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg==",
             "dev": true,
             "funding": [
                 {
@@ -13319,9 +15263,9 @@
             }
         },
         "node_modules/postcss-html/node_modules/js-tokens": {
-            "version": "8.0.0",
-            "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-8.0.0.tgz",
-            "integrity": "sha512-PC7MzqInq9OqKyTXfIvQNcjMkODJYC8A17kAaQgeW79yfhqTWSOfjHYQ2mDDcwJ96Iibtwkfh0C7R/OvqPlgVA==",
+            "version": "8.0.1",
+            "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-8.0.1.tgz",
+            "integrity": "sha512-3AGrZT6tuMm1ZWWn9mLXh7XMfi2YtiLNPALCVxBCiUVq0LD1OQMxV/AdS/s7rLJU5o9i/jBZw/N4vXXL5dm29A==",
             "dev": true
         },
         "node_modules/postcss-media-query-parser": {
@@ -13368,9 +15312,9 @@
             }
         },
         "node_modules/postcss-scss": {
-            "version": "4.0.5",
-            "resolved": "https://registry.npmjs.org/postcss-scss/-/postcss-scss-4.0.5.tgz",
-            "integrity": "sha512-F7xpB6TrXyqUh3GKdyB4Gkp3QL3DDW1+uI+gxx/oJnUt/qXI4trj5OGlp9rOKdoABGULuqtqeG+3HEVQk4DjmA==",
+            "version": "4.0.6",
+            "resolved": "https://registry.npmjs.org/postcss-scss/-/postcss-scss-4.0.6.tgz",
+            "integrity": "sha512-rLDPhJY4z/i4nVFZ27j9GqLxj1pwxE80eAzUNRMXtcpipFYIeowerzBgG3yJhMtObGEXidtIgbUpQ3eLDsf5OQ==",
             "dev": true,
             "funding": [
                 {
@@ -13386,7 +15330,7 @@
                 "node": ">=12.0"
             },
             "peerDependencies": {
-                "postcss": "^8.3.3"
+                "postcss": "^8.4.19"
             }
         },
         "node_modules/postcss-selector-parser": {
@@ -13603,11 +15547,6 @@
             "integrity": "sha512-F2JHgJQ1iqwnHDcQjVBsq3n/uoaFL+iPW/eAeL7kVxy/2RrWaN4WroKjjvbsoRtv0ftelNyC01bjRhn/bhcf4A==",
             "dev": true
         },
-        "node_modules/pseudomap": {
-            "version": "1.0.2",
-            "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz",
-            "integrity": "sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ=="
-        },
         "node_modules/psl": {
             "version": "1.9.0",
             "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz",
@@ -13624,13 +15563,22 @@
             }
         },
         "node_modules/punycode": {
-            "version": "2.1.1",
-            "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
-            "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==",
+            "version": "2.3.0",
+            "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz",
+            "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==",
             "engines": {
                 "node": ">=6"
             }
         },
+        "node_modules/q": {
+            "version": "1.5.1",
+            "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz",
+            "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==",
+            "engines": {
+                "node": ">=0.6.0",
+                "teleport": ">=0.2.0"
+            }
+        },
         "node_modules/qlobber": {
             "version": "5.0.3",
             "resolved": "https://registry.npmjs.org/qlobber/-/qlobber-5.0.3.tgz",
@@ -13758,12 +15706,17 @@
             }
         },
         "node_modules/qs": {
-            "version": "6.5.3",
-            "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz",
-            "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==",
-            "devOptional": true,
+            "version": "6.10.4",
+            "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.4.tgz",
+            "integrity": "sha512-OQiU+C+Ds5qiH91qh/mg0w+8nwQuLjM4F4M/PbmhDOoYehPh+Fb0bDjtR1sOvy7YKxvj28Y/M0PhP5uVX0kB+g==",
+            "dependencies": {
+                "side-channel": "^1.0.4"
+            },
             "engines": {
                 "node": ">=0.6"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/ljharb"
             }
         },
         "node_modules/querystringify": {
@@ -13793,12 +15746,14 @@
             ]
         },
         "node_modules/quick-lru": {
-            "version": "4.0.1",
-            "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz",
-            "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==",
-            "dev": true,
+            "version": "5.1.1",
+            "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz",
+            "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==",
             "engines": {
-                "node": ">=8"
+                "node": ">=10"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/sindresorhus"
             }
         },
         "node_modules/radius": {
@@ -13959,33 +15914,33 @@
             }
         },
         "node_modules/rechoir": {
-            "version": "0.7.0",
-            "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.7.0.tgz",
-            "integrity": "sha512-ADsDEH2bvbjltXEP+hTIAmeFekTFK0V2BTxMkok6qILyAJEXV0AFfoWcAq4yfll5VdIMd/RVXq0lR+wQi5ZU3Q==",
+            "version": "0.8.0",
+            "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.8.0.tgz",
+            "integrity": "sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==",
             "dependencies": {
-                "resolve": "^1.9.0"
+                "resolve": "^1.20.0"
             },
             "engines": {
-                "node": ">= 0.10"
+                "node": ">= 10.13.0"
             }
         },
         "node_modules/redbean-node": {
-            "version": "0.1.4",
-            "resolved": "https://registry.npmjs.org/redbean-node/-/redbean-node-0.1.4.tgz",
-            "integrity": "sha512-c1U6wnTeWS0c44tn9hkJWzjGgckLNJ8sN1E2bxnnnQsULOfvEVFLf8dLMjqhyyMrZ1L1mp8UvV4OfhRtH/ZrgQ==",
+            "version": "0.2.0",
+            "resolved": "https://registry.npmjs.org/redbean-node/-/redbean-node-0.2.0.tgz",
+            "integrity": "sha512-bHbNgVpkLOn7i/kvfvGDVGzfDgvf20qVRm4EvQV9tD2V2nhcegYUITzAF3XSL2XVirrb5vmWy85vxM44faBnYw==",
             "dependencies": {
                 "@types/node": "^14.18.12",
                 "await-lock": "^2.1.0",
                 "dayjs": "^1.11.0",
                 "glob": "^7.2.0",
-                "knex": "^0.95.15",
+                "knex": "^2.4.0",
                 "lodash": "^4.17.21"
             }
         },
         "node_modules/redbean-node/node_modules/@types/node": {
-            "version": "14.18.33",
-            "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.33.tgz",
-            "integrity": "sha512-qelS/Ra6sacc4loe/3MSjXNL1dNQ/GjxNHVzuChwMfmk7HuycRLVQN2qNY3XahK+fZc5E2szqQSKUyAF0E+2bg=="
+            "version": "14.18.36",
+            "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.36.tgz",
+            "integrity": "sha512-FXKWbsJ6a1hIrRxv+FoukuHnGTgEzKYGi7kilfMae96AL9UNkPFNWJEEYWzdRI9ooIkbr4AKldyuSTLql06vLQ=="
         },
         "node_modules/redent": {
             "version": "3.0.0",
@@ -14000,6 +15955,19 @@
                 "node": ">=8"
             }
         },
+        "node_modules/redis": {
+            "version": "4.5.1",
+            "resolved": "https://registry.npmjs.org/redis/-/redis-4.5.1.tgz",
+            "integrity": "sha512-oxXSoIqMJCQVBTfxP6BNTCtDMyh9G6Vi5wjdPdV/sRKkufyZslDqCScSGcOr6XGR/reAWZefz7E4leM31RgdBA==",
+            "dependencies": {
+                "@redis/bloom": "1.1.0",
+                "@redis/client": "1.4.2",
+                "@redis/graph": "1.1.0",
+                "@redis/json": "1.0.4",
+                "@redis/search": "1.1.0",
+                "@redis/time-series": "1.0.4"
+            }
+        },
         "node_modules/regenerate": {
             "version": "1.4.2",
             "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz",
@@ -14061,14 +16029,14 @@
             }
         },
         "node_modules/regexpu-core": {
-            "version": "5.2.2",
-            "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.2.2.tgz",
-            "integrity": "sha512-T0+1Zp2wjF/juXMrMxHxidqGYn8U4R+zleSJhX9tQ1PUsS8a9UtYfbsF9LdiVgNX3kiX8RNaKM42nfSgvFJjmw==",
+            "version": "5.3.0",
+            "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.3.0.tgz",
+            "integrity": "sha512-ZdhUQlng0RoscyW7jADnUZ25F5eVtHdMyXSb2PiwafvteRAOJUjFoUPEYZSIfP99fBIs3maLIRfpEddT78wAAQ==",
             "dev": true,
             "dependencies": {
+                "@babel/regjsgen": "^0.8.0",
                 "regenerate": "^1.4.2",
                 "regenerate-unicode-properties": "^10.1.0",
-                "regjsgen": "^0.7.1",
                 "regjsparser": "^0.9.1",
                 "unicode-match-property-ecmascript": "^2.0.0",
                 "unicode-match-property-value-ecmascript": "^2.1.0"
@@ -14077,12 +16045,6 @@
                 "node": ">=4"
             }
         },
-        "node_modules/regjsgen": {
-            "version": "0.7.1",
-            "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.7.1.tgz",
-            "integrity": "sha512-RAt+8H2ZEzHeYWxZ3H2z6tF18zyyOnlcdaafLrm21Bguj7uZy6ULibiAFdXEtKQY4Sy7wDTwDiOazasMLc4KPA==",
-            "dev": true
-        },
         "node_modules/regjsparser": {
             "version": "0.9.1",
             "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz",
@@ -14194,6 +16156,15 @@
                 "node": ">=0.6.0"
             }
         },
+        "node_modules/request/node_modules/qs": {
+            "version": "6.5.3",
+            "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz",
+            "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==",
+            "optional": true,
+            "engines": {
+                "node": ">=0.6"
+            }
+        },
         "node_modules/request/node_modules/uuid": {
             "version": "3.4.0",
             "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz",
@@ -14249,6 +16220,11 @@
                 "url": "https://github.com/sponsors/ljharb"
             }
         },
+        "node_modules/resolve-alpn": {
+            "version": "1.2.1",
+            "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz",
+            "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g=="
+        },
         "node_modules/resolve-cwd": {
             "version": "3.0.0",
             "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz",
@@ -14280,14 +16256,28 @@
             }
         },
         "node_modules/resolve.exports": {
-            "version": "1.1.0",
-            "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-1.1.0.tgz",
-            "integrity": "sha512-J1l+Zxxp4XK3LUDZ9m60LRJF/mAe4z6a4xyabPHk7pvK5t35dACV32iIjJDFeWZFfZlO29w6SZ67knR0tHzJtQ==",
+            "version": "1.1.1",
+            "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-1.1.1.tgz",
+            "integrity": "sha512-/NtpHNDN7jWhAaQ9BvBUYZ6YTXsRBgfqWFWP7BZBaoMJO/I3G5OFzvTuWNlZC3aPjins1F+TNrLKsGbH4rfsRQ==",
             "dev": true,
             "engines": {
                 "node": ">=10"
             }
         },
+        "node_modules/responselike": {
+            "version": "3.0.0",
+            "resolved": "https://registry.npmjs.org/responselike/-/responselike-3.0.0.tgz",
+            "integrity": "sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg==",
+            "dependencies": {
+                "lowercase-keys": "^3.0.0"
+            },
+            "engines": {
+                "node": ">=14.16"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/sindresorhus"
+            }
+        },
         "node_modules/restore-cursor": {
             "version": "3.1.0",
             "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz",
@@ -14352,12 +16342,13 @@
             }
         },
         "node_modules/rollup-plugin-visualizer": {
-            "version": "5.8.3",
-            "resolved": "https://registry.npmjs.org/rollup-plugin-visualizer/-/rollup-plugin-visualizer-5.8.3.tgz",
-            "integrity": "sha512-QGJk4Bqe4AOat5AjipOh8esZH1nck5X2KFpf4VytUdSUuuuSwvIQZjMGgjcxe/zXexltqaXp5Vx1V3LmnQH15Q==",
+            "version": "5.9.0",
+            "resolved": "https://registry.npmjs.org/rollup-plugin-visualizer/-/rollup-plugin-visualizer-5.9.0.tgz",
+            "integrity": "sha512-bbDOv47+Bw4C/cgs0czZqfm8L82xOZssk4ayZjG40y9zbXclNk7YikrZTDao6p7+HDiGxrN0b65SgZiVm9k1Cg==",
             "dev": true,
             "dependencies": {
                 "open": "^8.4.0",
+                "picomatch": "^2.3.1",
                 "source-map": "^0.7.4",
                 "yargs": "^17.5.1"
             },
@@ -14526,9 +16517,9 @@
             }
         },
         "node_modules/rxjs": {
-            "version": "7.5.7",
-            "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.5.7.tgz",
-            "integrity": "sha512-z9MzKh/UcOqB3i20H6rtrlaE/CgjLOvheWK/9ILrbhROGTweAi1BaFsTT9FbwZi5Trr1qNRs+MXkhmR06awzQA==",
+            "version": "7.8.0",
+            "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.0.tgz",
+            "integrity": "sha512-F2+gxDshqmIub1KdvZkaEfGDwLNpPvk9Fs6LD/MyQxNgMds/WH9OdDDXOmxUZpME+iSK3rQCctkL0DYyytUqMg==",
             "dev": true,
             "dependencies": {
                 "tslib": "^2.1.0"
@@ -14562,6 +16553,18 @@
             "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
             "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
         },
+        "node_modules/saslprep": {
+            "version": "1.0.3",
+            "resolved": "https://registry.npmjs.org/saslprep/-/saslprep-1.0.3.tgz",
+            "integrity": "sha512-/MY/PEMbk2SuY5sScONwhUDsV2p77Znkb/q3nSVstq/yQzYJOH/Azh29p9oJLsl3LnQwSvZDKagDGBsBwSooag==",
+            "optional": true,
+            "dependencies": {
+                "sparse-bitfield": "^3.0.3"
+            },
+            "engines": {
+                "node": ">=6"
+            }
+        },
         "node_modules/sass": {
             "version": "1.42.1",
             "resolved": "https://registry.npmjs.org/sass/-/sass-1.42.1.tgz",
@@ -14577,6 +16580,11 @@
                 "node": ">=8.9.0"
             }
         },
+        "node_modules/sax": {
+            "version": "1.2.4",
+            "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz",
+            "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw=="
+        },
         "node_modules/saxes": {
             "version": "5.0.1",
             "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz",
@@ -14589,6 +16597,27 @@
                 "node": ">=10"
             }
         },
+        "node_modules/sb-promise-queue": {
+            "version": "2.1.0",
+            "resolved": "https://registry.npmjs.org/sb-promise-queue/-/sb-promise-queue-2.1.0.tgz",
+            "integrity": "sha512-zwq4YuP1FQFkGx2Q7GIkZYZ6PqWpV+bg0nIO1sJhWOyGyhqbj0MsTvK6lCFo5TQwX5pZr6SCQ75e8PCDCuNvkg==",
+            "dev": true,
+            "engines": {
+                "node": ">= 8"
+            }
+        },
+        "node_modules/sb-scandir": {
+            "version": "3.1.0",
+            "resolved": "https://registry.npmjs.org/sb-scandir/-/sb-scandir-3.1.0.tgz",
+            "integrity": "sha512-70BVm2xz9jn94zSQdpvYrEG101/UV9TVGcfWr9T5iob3QhCK4lYXeculfBqPGFv3XTeKgx4dpWyYIDeZUqo4kg==",
+            "dev": true,
+            "dependencies": {
+                "sb-promise-queue": "^2.1.0"
+            },
+            "engines": {
+                "node": ">= 8"
+            }
+        },
         "node_modules/semver": {
             "version": "6.3.0",
             "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
@@ -14683,10 +16712,16 @@
                 "node": ">=8"
             }
         },
+        "node_modules/shell-escape": {
+            "version": "0.2.0",
+            "resolved": "https://registry.npmjs.org/shell-escape/-/shell-escape-0.2.0.tgz",
+            "integrity": "sha512-uRRBT2MfEOyxuECseCZd28jC1AJ8hmqqneWQ4VWUTgCAFvb3wKU1jLqj6egC4Exrr88ogg3dp+zroH4wJuaXzw==",
+            "dev": true
+        },
         "node_modules/shell-quote": {
-            "version": "1.7.4",
-            "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.7.4.tgz",
-            "integrity": "sha512-8o/QEhSSRb1a5i7TFR0iM4G16Z0vYB2OQVs4G3aAFXjn3T6yEx8AZxy1PgDF7I00LZHYA3WxaSYIf5e5sAX8Rw==",
+            "version": "1.8.0",
+            "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.0.tgz",
+            "integrity": "sha512-QHsz8GgQIGKlRi24yFc6a6lN69Idnx634w49ay6+jA5yFh7a1UY+4Rp6HPx/L/1zcEDPEij8cIsiqR6bQsE5VQ==",
             "dev": true,
             "funding": {
                 "url": "https://github.com/sponsors/ljharb"
@@ -14817,9 +16852,9 @@
             }
         },
         "node_modules/socket.io-parser": {
-            "version": "4.2.1",
-            "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.1.tgz",
-            "integrity": "sha512-V4GrkLy+HeF1F/en3SpUaM+7XxYXpuMUWLGde1kSSh5nQMN4hLrbPIkD+otwh6q9R6NOQBN4AMaOZ2zVjui82g==",
+            "version": "4.2.2",
+            "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.2.tgz",
+            "integrity": "sha512-DJtziuKypFkMMHCm2uIshOYC7QaylbtzQwiMYDuCKy3OPkjLzu4B2vAhTlqipRHHzrI0NJeBAizTK7X+6m1jVw==",
             "dependencies": {
                 "@socket.io/component-emitter": "~3.1.0",
                 "debug": "~4.3.1"
@@ -14892,8 +16927,18 @@
             "version": "1.4.8",
             "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz",
             "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==",
+            "deprecated": "Please use @jridgewell/sourcemap-codec instead",
             "dev": true
         },
+        "node_modules/sparse-bitfield": {
+            "version": "3.0.3",
+            "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz",
+            "integrity": "sha512-kvzhi7vqKTfkh0PZU+2D2PIllw2ymqJKujUcyPMd9Y75Nv4nPbGJZXNhxsgdQab2BmlDct1YnfQCguEvHr7VsQ==",
+            "optional": true,
+            "dependencies": {
+                "memory-pager": "^1.0.2"
+            }
+        },
         "node_modules/spawn-command": {
             "version": "0.0.2-1",
             "resolved": "https://registry.npmjs.org/spawn-command/-/spawn-command-0.0.2-1.tgz",
@@ -14962,6 +17007,24 @@
                 "node": ">= 0.6"
             }
         },
+        "node_modules/ssh2": {
+            "version": "1.11.0",
+            "resolved": "https://registry.npmjs.org/ssh2/-/ssh2-1.11.0.tgz",
+            "integrity": "sha512-nfg0wZWGSsfUe/IBJkXVll3PEZ//YH2guww+mP88gTpuSU4FtZN7zu9JoeTGOyCNx2dTDtT9fOpWwlzyj4uOOw==",
+            "dev": true,
+            "hasInstallScript": true,
+            "dependencies": {
+                "asn1": "^0.2.4",
+                "bcrypt-pbkdf": "^1.0.2"
+            },
+            "engines": {
+                "node": ">=10.16.0"
+            },
+            "optionalDependencies": {
+                "cpu-features": "~0.0.4",
+                "nan": "^2.16.0"
+            }
+        },
         "node_modules/sshpk": {
             "version": "1.17.0",
             "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz",
@@ -15070,6 +17133,42 @@
                 "node": ">=10"
             }
         },
+        "node_modules/string-to-stream": {
+            "version": "1.1.1",
+            "resolved": "https://registry.npmjs.org/string-to-stream/-/string-to-stream-1.1.1.tgz",
+            "integrity": "sha512-QySF2+3Rwq0SdO3s7BAp4x+c3qsClpPQ6abAmb0DGViiSBAkT5kL6JT2iyzEVP+T1SmzHrQD1TwlP9QAHCc+Sw==",
+            "dependencies": {
+                "inherits": "^2.0.1",
+                "readable-stream": "^2.1.0"
+            }
+        },
+        "node_modules/string-to-stream/node_modules/isarray": {
+            "version": "1.0.0",
+            "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
+            "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ=="
+        },
+        "node_modules/string-to-stream/node_modules/readable-stream": {
+            "version": "2.3.7",
+            "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
+            "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
+            "dependencies": {
+                "core-util-is": "~1.0.0",
+                "inherits": "~2.0.3",
+                "isarray": "~1.0.0",
+                "process-nextick-args": "~2.0.0",
+                "safe-buffer": "~5.1.1",
+                "string_decoder": "~1.1.1",
+                "util-deprecate": "~1.0.1"
+            }
+        },
+        "node_modules/string-to-stream/node_modules/string_decoder": {
+            "version": "1.1.1",
+            "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
+            "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+            "dependencies": {
+                "safe-buffer": "~5.1.0"
+            }
+        },
         "node_modules/string-width": {
             "version": "4.2.3",
             "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
@@ -15162,6 +17261,12 @@
                 "url": "https://github.com/sponsors/sindresorhus"
             }
         },
+        "node_modules/strnum": {
+            "version": "1.0.5",
+            "resolved": "https://registry.npmjs.org/strnum/-/strnum-1.0.5.tgz",
+            "integrity": "sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==",
+            "optional": true
+        },
         "node_modules/style-search": {
             "version": "0.1.0",
             "resolved": "https://registry.npmjs.org/style-search/-/style-search-0.1.0.tgz",
@@ -15368,9 +17473,9 @@
             }
         },
         "node_modules/table/node_modules/ajv": {
-            "version": "8.11.2",
-            "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.2.tgz",
-            "integrity": "sha512-E4bfmKAhGiSTvMfL1Myyycaub+cUEU2/IvpylXkUu7CHBkBj1f/ikdzbD7YQ6FKUbixDxeYvB/xY4fvyroDlQg==",
+            "version": "8.12.0",
+            "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz",
+            "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==",
             "dev": true,
             "dependencies": {
                 "fast-deep-equal": "^3.1.1",
@@ -15440,13 +17545,13 @@
             }
         },
         "node_modules/tar": {
-            "version": "6.1.12",
-            "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.12.tgz",
-            "integrity": "sha512-jU4TdemS31uABHd+Lt5WEYJuzn+TJTCBLljvIAHZOz6M9Os5pJ4dD+vRFLxPa/n3T0iEFzpi+0x1UfuDZYbRMw==",
+            "version": "6.1.13",
+            "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.13.tgz",
+            "integrity": "sha512-jdIBIN6LTIe2jqzay/2vtYLlBHa3JF42ot3h1dW8Q0PaAG4v8rm0cvpVePtau5C6OKXGGcgO9q2AMNSWxiLqKw==",
             "dependencies": {
                 "chownr": "^2.0.0",
                 "fs-minipass": "^2.0.0",
-                "minipass": "^3.0.0",
+                "minipass": "^4.0.0",
                 "minizlib": "^2.1.1",
                 "mkdirp": "^1.0.3",
                 "yallist": "^4.0.0"
@@ -15455,6 +17560,11 @@
                 "node": ">=10"
             }
         },
+        "node_modules/tar/node_modules/yallist": {
+            "version": "4.0.0",
+            "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+            "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
+        },
         "node_modules/tarn": {
             "version": "3.0.2",
             "resolved": "https://registry.npmjs.org/tarn/-/tarn-3.0.2.tgz",
@@ -15601,9 +17711,9 @@
             }
         },
         "node_modules/throat": {
-            "version": "6.0.1",
-            "resolved": "https://registry.npmjs.org/throat/-/throat-6.0.1.tgz",
-            "integrity": "sha512-8hmiGIJMDlwjg7dlJ4yKGLK8EsYqKgPWbG3b4wjJddKNwc7N7Dpn08Df4szr/sZdMVeOstrdYSsqzX6BYbcB+w==",
+            "version": "6.0.2",
+            "resolved": "https://registry.npmjs.org/throat/-/throat-6.0.2.tgz",
+            "integrity": "sha512-WKexMoJj3vEuK0yFEapj8y64V0A6xcuPuK9Gt1d0R+dzCSJc0lHqQytAbSB4cDAK0dWh4T0E2ETkoLE2WZ41OQ==",
             "dev": true
         },
         "node_modules/throttleit": {
@@ -15737,9 +17847,9 @@
             }
         },
         "node_modules/tslib": {
-            "version": "2.4.1",
-            "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz",
-            "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA=="
+            "version": "2.5.0",
+            "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz",
+            "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg=="
         },
         "node_modules/tunnel": {
             "version": "0.0.6",
@@ -15813,6 +17923,19 @@
                 "node": ">= 0.6"
             }
         },
+        "node_modules/typed-array-length": {
+            "version": "1.0.4",
+            "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz",
+            "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==",
+            "dependencies": {
+                "call-bind": "^1.0.2",
+                "for-each": "^0.3.3",
+                "is-typed-array": "^1.1.9"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/ljharb"
+            }
+        },
         "node_modules/typedarray": {
             "version": "0.0.6",
             "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz",
@@ -15854,6 +17977,11 @@
                 "url": "https://github.com/sponsors/ljharb"
             }
         },
+        "node_modules/underscore": {
+            "version": "1.13.6",
+            "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.6.tgz",
+            "integrity": "sha512-+A5Sja4HP1M08MaXya7p5LvjuM7K6q/2EaC0+iovj/wOcMsTzMvDFbasi/oSapiwOlt252IqsKqPjCl7huKS0A=="
+        },
         "node_modules/unicode-canonical-property-names-ecmascript": {
             "version": "2.0.0",
             "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz",
@@ -16048,6 +18176,11 @@
                 "spdx-expression-parse": "^3.0.0"
             }
         },
+        "node_modules/varint": {
+            "version": "6.0.0",
+            "resolved": "https://registry.npmjs.org/varint/-/varint-6.0.0.tgz",
+            "integrity": "sha512-cXEIW6cfr15lFv563k4GuVuW/fiwjknytD37jIOLSdSWuOI6WnO/oKwmP2FQTU2l01LP8/M5TSAJpzUaGe3uWg=="
+        },
         "node_modules/vary": {
             "version": "1.1.2",
             "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
@@ -16356,6 +18489,18 @@
                 "node": ">=4.0"
             }
         },
+        "node_modules/vue-eslint-parser/node_modules/lru-cache": {
+            "version": "6.0.0",
+            "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+            "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+            "dev": true,
+            "dependencies": {
+                "yallist": "^4.0.0"
+            },
+            "engines": {
+                "node": ">=10"
+            }
+        },
         "node_modules/vue-eslint-parser/node_modules/semver": {
             "version": "7.3.8",
             "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz",
@@ -16371,6 +18516,12 @@
                 "node": ">=10"
             }
         },
+        "node_modules/vue-eslint-parser/node_modules/yallist": {
+            "version": "4.0.0",
+            "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+            "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
+            "dev": true
+        },
         "node_modules/vue-i18n": {
             "version": "9.2.2",
             "resolved": "https://registry.npmjs.org/vue-i18n/-/vue-i18n-9.2.2.tgz",
@@ -16399,9 +18550,9 @@
             }
         },
         "node_modules/vue-multiselect": {
-            "version": "3.0.0-alpha.2",
-            "resolved": "https://registry.npmjs.org/vue-multiselect/-/vue-multiselect-3.0.0-alpha.2.tgz",
-            "integrity": "sha512-Xp9fGJECns45v+v8jXbCIsAkCybYkEg0lNwr7Z6HDUSMyx2TEIK2giipPE+qXiShEc1Ipn+ZtttH2iq9hwXP4Q==",
+            "version": "3.0.0-beta.1",
+            "resolved": "https://registry.npmjs.org/vue-multiselect/-/vue-multiselect-3.0.0-beta.1.tgz",
+            "integrity": "sha512-V+jpydtjyHcQ+yjHsEWEBrDAopOx/pufNkSAXNVDAGQ+ESDEJ7wYejNd9H1RiCnFOYK4yf1XSGqE+Mp3HJXmdg==",
             "dev": true,
             "engines": {
                 "node": ">= 4.0.0",
@@ -16605,15 +18756,15 @@
             }
         },
         "node_modules/wait-on/node_modules/joi": {
-            "version": "17.7.0",
-            "resolved": "https://registry.npmjs.org/joi/-/joi-17.7.0.tgz",
-            "integrity": "sha512-1/ugc8djfn93rTE3WRKdCzGGt/EtiYKxITMO4Wiv6q5JL1gl9ePt4kBsl1S499nbosspfctIQTpYIhSmHA3WAg==",
+            "version": "17.7.1",
+            "resolved": "https://registry.npmjs.org/joi/-/joi-17.7.1.tgz",
+            "integrity": "sha512-teoLhIvWE298R6AeJywcjR4sX2hHjB3/xJX4qPjg+gTg+c0mzUDsziYlqPmLomq9gVsfaMcgPaGc7VxtD/9StA==",
             "dev": true,
             "dependencies": {
                 "@hapi/hoek": "^9.0.0",
                 "@hapi/topo": "^5.0.0",
                 "@sideway/address": "^4.1.3",
-                "@sideway/formula": "^3.0.0",
+                "@sideway/formula": "^3.0.1",
                 "@sideway/pinpoint": "^2.0.0"
             }
         },
@@ -16712,6 +18863,25 @@
             "integrity": "sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q==",
             "dev": true
         },
+        "node_modules/which-typed-array": {
+            "version": "1.1.9",
+            "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.9.tgz",
+            "integrity": "sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==",
+            "dependencies": {
+                "available-typed-arrays": "^1.0.5",
+                "call-bind": "^1.0.2",
+                "for-each": "^0.3.3",
+                "gopd": "^1.0.1",
+                "has-tostringtag": "^1.0.0",
+                "is-typed-array": "^1.1.10"
+            },
+            "engines": {
+                "node": ">= 0.4"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/ljharb"
+            }
+        },
         "node_modules/wide-align": {
             "version": "1.1.5",
             "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz",
@@ -16818,6 +18988,14 @@
             "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==",
             "dev": true
         },
+        "node_modules/xmlbuilder": {
+            "version": "8.2.2",
+            "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-8.2.2.tgz",
+            "integrity": "sha512-eKRAFz04jghooy8muekqzo8uCSVNeyRedbuJrp0fovbLIi7wlsYtdUn3vBAAPq2Y3/0xMz2WMEUQ8yhVVO9Stw==",
+            "engines": {
+                "node": ">=4.0"
+            }
+        },
         "node_modules/xmlchars": {
             "version": "2.2.0",
             "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz",
@@ -16832,6 +19010,19 @@
                 "node": ">=0.4.0"
             }
         },
+        "node_modules/xmlrpc": {
+            "version": "1.3.2",
+            "resolved": "https://registry.npmjs.org/xmlrpc/-/xmlrpc-1.3.2.tgz",
+            "integrity": "sha512-jQf5gbrP6wvzN71fgkcPPkF4bF/Wyovd7Xdff8d6/ihxYmgETQYSuTc+Hl+tsh/jmgPLro/Aro48LMFlIyEKKQ==",
+            "dependencies": {
+                "sax": "1.2.x",
+                "xmlbuilder": "8.2.x"
+            },
+            "engines": {
+                "node": ">=0.8",
+                "npm": ">=1.0.0"
+            }
+        },
         "node_modules/xtend": {
             "version": "4.0.2",
             "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz",
@@ -16849,9 +19040,10 @@
             }
         },
         "node_modules/yallist": {
-            "version": "4.0.0",
-            "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
-            "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
+            "version": "3.1.1",
+            "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
+            "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==",
+            "dev": true
         },
         "node_modules/yaml": {
             "version": "1.10.2",
@@ -16971,6 +19163,910 @@
                 }
             }
         },
+        "@aws-crypto/ie11-detection": {
+            "version": "3.0.0",
+            "resolved": "https://registry.npmjs.org/@aws-crypto/ie11-detection/-/ie11-detection-3.0.0.tgz",
+            "integrity": "sha512-341lBBkiY1DfDNKai/wXM3aujNBkXR7tq1URPQDL9wi3AUbI80NR74uF1TXHMm7po1AcnFk8iu2S2IeU/+/A+Q==",
+            "optional": true,
+            "requires": {
+                "tslib": "^1.11.1"
+            },
+            "dependencies": {
+                "tslib": {
+                    "version": "1.14.1",
+                    "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
+                    "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==",
+                    "optional": true
+                }
+            }
+        },
+        "@aws-crypto/sha256-browser": {
+            "version": "3.0.0",
+            "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-browser/-/sha256-browser-3.0.0.tgz",
+            "integrity": "sha512-8VLmW2B+gjFbU5uMeqtQM6Nj0/F1bro80xQXCW6CQBWgosFWXTx77aeOF5CAIAmbOK64SdMBJdNr6J41yP5mvQ==",
+            "optional": true,
+            "requires": {
+                "@aws-crypto/ie11-detection": "^3.0.0",
+                "@aws-crypto/sha256-js": "^3.0.0",
+                "@aws-crypto/supports-web-crypto": "^3.0.0",
+                "@aws-crypto/util": "^3.0.0",
+                "@aws-sdk/types": "^3.222.0",
+                "@aws-sdk/util-locate-window": "^3.0.0",
+                "@aws-sdk/util-utf8-browser": "^3.0.0",
+                "tslib": "^1.11.1"
+            },
+            "dependencies": {
+                "tslib": {
+                    "version": "1.14.1",
+                    "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
+                    "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==",
+                    "optional": true
+                }
+            }
+        },
+        "@aws-crypto/sha256-js": {
+            "version": "3.0.0",
+            "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-js/-/sha256-js-3.0.0.tgz",
+            "integrity": "sha512-PnNN7os0+yd1XvXAy23CFOmTbMaDxgxXtTKHybrJ39Y8kGzBATgBFibWJKH6BhytLI/Zyszs87xCOBNyBig6vQ==",
+            "optional": true,
+            "requires": {
+                "@aws-crypto/util": "^3.0.0",
+                "@aws-sdk/types": "^3.222.0",
+                "tslib": "^1.11.1"
+            },
+            "dependencies": {
+                "tslib": {
+                    "version": "1.14.1",
+                    "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
+                    "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==",
+                    "optional": true
+                }
+            }
+        },
+        "@aws-crypto/supports-web-crypto": {
+            "version": "3.0.0",
+            "resolved": "https://registry.npmjs.org/@aws-crypto/supports-web-crypto/-/supports-web-crypto-3.0.0.tgz",
+            "integrity": "sha512-06hBdMwUAb2WFTuGG73LSC0wfPu93xWwo5vL2et9eymgmu3Id5vFAHBbajVWiGhPO37qcsdCap/FqXvJGJWPIg==",
+            "optional": true,
+            "requires": {
+                "tslib": "^1.11.1"
+            },
+            "dependencies": {
+                "tslib": {
+                    "version": "1.14.1",
+                    "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
+                    "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==",
+                    "optional": true
+                }
+            }
+        },
+        "@aws-crypto/util": {
+            "version": "3.0.0",
+            "resolved": "https://registry.npmjs.org/@aws-crypto/util/-/util-3.0.0.tgz",
+            "integrity": "sha512-2OJlpeJpCR48CC8r+uKVChzs9Iungj9wkZrl8Z041DWEWvyIHILYKCPNzJghKsivj+S3mLo6BVc7mBNzdxA46w==",
+            "optional": true,
+            "requires": {
+                "@aws-sdk/types": "^3.222.0",
+                "@aws-sdk/util-utf8-browser": "^3.0.0",
+                "tslib": "^1.11.1"
+            },
+            "dependencies": {
+                "tslib": {
+                    "version": "1.14.1",
+                    "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
+                    "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==",
+                    "optional": true
+                }
+            }
+        },
+        "@aws-sdk/abort-controller": {
+            "version": "3.267.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/abort-controller/-/abort-controller-3.267.0.tgz",
+            "integrity": "sha512-5R7OSnHFV/f+qQpMf1RuSQoVdXroK94Vl6naWjMOAhMyofHykVhEok9hmFPac86AVx8rVX/vuA7u9GKI6/EE7g==",
+            "optional": true,
+            "requires": {
+                "@aws-sdk/types": "3.267.0",
+                "tslib": "^2.3.1"
+            }
+        },
+        "@aws-sdk/client-cognito-identity": {
+            "version": "3.267.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/client-cognito-identity/-/client-cognito-identity-3.267.0.tgz",
+            "integrity": "sha512-jEE5aw7wp7VhiaU0vCbNQbEIhiaNZnBhRj+vJVCd2HQBI9IVLVXAoyExWxLruAXKEO+A1w1df+fwZAOo0M7aQQ==",
+            "optional": true,
+            "requires": {
+                "@aws-crypto/sha256-browser": "3.0.0",
+                "@aws-crypto/sha256-js": "3.0.0",
+                "@aws-sdk/client-sts": "3.267.0",
+                "@aws-sdk/config-resolver": "3.267.0",
+                "@aws-sdk/credential-provider-node": "3.267.0",
+                "@aws-sdk/fetch-http-handler": "3.267.0",
+                "@aws-sdk/hash-node": "3.267.0",
+                "@aws-sdk/invalid-dependency": "3.267.0",
+                "@aws-sdk/middleware-content-length": "3.267.0",
+                "@aws-sdk/middleware-endpoint": "3.267.0",
+                "@aws-sdk/middleware-host-header": "3.267.0",
+                "@aws-sdk/middleware-logger": "3.267.0",
+                "@aws-sdk/middleware-recursion-detection": "3.267.0",
+                "@aws-sdk/middleware-retry": "3.267.0",
+                "@aws-sdk/middleware-serde": "3.267.0",
+                "@aws-sdk/middleware-signing": "3.267.0",
+                "@aws-sdk/middleware-stack": "3.267.0",
+                "@aws-sdk/middleware-user-agent": "3.267.0",
+                "@aws-sdk/node-config-provider": "3.267.0",
+                "@aws-sdk/node-http-handler": "3.267.0",
+                "@aws-sdk/protocol-http": "3.267.0",
+                "@aws-sdk/smithy-client": "3.267.0",
+                "@aws-sdk/types": "3.267.0",
+                "@aws-sdk/url-parser": "3.267.0",
+                "@aws-sdk/util-base64": "3.208.0",
+                "@aws-sdk/util-body-length-browser": "3.188.0",
+                "@aws-sdk/util-body-length-node": "3.208.0",
+                "@aws-sdk/util-defaults-mode-browser": "3.267.0",
+                "@aws-sdk/util-defaults-mode-node": "3.267.0",
+                "@aws-sdk/util-endpoints": "3.267.0",
+                "@aws-sdk/util-retry": "3.267.0",
+                "@aws-sdk/util-user-agent-browser": "3.267.0",
+                "@aws-sdk/util-user-agent-node": "3.267.0",
+                "@aws-sdk/util-utf8": "3.254.0",
+                "tslib": "^2.3.1"
+            }
+        },
+        "@aws-sdk/client-sso": {
+            "version": "3.267.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.267.0.tgz",
+            "integrity": "sha512-/475/mT0gYhimpCdK4iZW+eX0DT6mkTgVk5P9ARpQGzEblFM6i2pE7GQnlGeLyHVOtA0cNAyGrWUuj2pyigUaA==",
+            "optional": true,
+            "requires": {
+                "@aws-crypto/sha256-browser": "3.0.0",
+                "@aws-crypto/sha256-js": "3.0.0",
+                "@aws-sdk/config-resolver": "3.267.0",
+                "@aws-sdk/fetch-http-handler": "3.267.0",
+                "@aws-sdk/hash-node": "3.267.0",
+                "@aws-sdk/invalid-dependency": "3.267.0",
+                "@aws-sdk/middleware-content-length": "3.267.0",
+                "@aws-sdk/middleware-endpoint": "3.267.0",
+                "@aws-sdk/middleware-host-header": "3.267.0",
+                "@aws-sdk/middleware-logger": "3.267.0",
+                "@aws-sdk/middleware-recursion-detection": "3.267.0",
+                "@aws-sdk/middleware-retry": "3.267.0",
+                "@aws-sdk/middleware-serde": "3.267.0",
+                "@aws-sdk/middleware-stack": "3.267.0",
+                "@aws-sdk/middleware-user-agent": "3.267.0",
+                "@aws-sdk/node-config-provider": "3.267.0",
+                "@aws-sdk/node-http-handler": "3.267.0",
+                "@aws-sdk/protocol-http": "3.267.0",
+                "@aws-sdk/smithy-client": "3.267.0",
+                "@aws-sdk/types": "3.267.0",
+                "@aws-sdk/url-parser": "3.267.0",
+                "@aws-sdk/util-base64": "3.208.0",
+                "@aws-sdk/util-body-length-browser": "3.188.0",
+                "@aws-sdk/util-body-length-node": "3.208.0",
+                "@aws-sdk/util-defaults-mode-browser": "3.267.0",
+                "@aws-sdk/util-defaults-mode-node": "3.267.0",
+                "@aws-sdk/util-endpoints": "3.267.0",
+                "@aws-sdk/util-retry": "3.267.0",
+                "@aws-sdk/util-user-agent-browser": "3.267.0",
+                "@aws-sdk/util-user-agent-node": "3.267.0",
+                "@aws-sdk/util-utf8": "3.254.0",
+                "tslib": "^2.3.1"
+            }
+        },
+        "@aws-sdk/client-sso-oidc": {
+            "version": "3.267.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.267.0.tgz",
+            "integrity": "sha512-Jdq0v0mJSJbG/CKLfHC1L0cjCot48Y6lLMQV1lfkYE65xD0ZSs8Gl7P/T391ZH7cLO6ifVoPdsYnwzhi1ZPXSQ==",
+            "optional": true,
+            "requires": {
+                "@aws-crypto/sha256-browser": "3.0.0",
+                "@aws-crypto/sha256-js": "3.0.0",
+                "@aws-sdk/config-resolver": "3.267.0",
+                "@aws-sdk/fetch-http-handler": "3.267.0",
+                "@aws-sdk/hash-node": "3.267.0",
+                "@aws-sdk/invalid-dependency": "3.267.0",
+                "@aws-sdk/middleware-content-length": "3.267.0",
+                "@aws-sdk/middleware-endpoint": "3.267.0",
+                "@aws-sdk/middleware-host-header": "3.267.0",
+                "@aws-sdk/middleware-logger": "3.267.0",
+                "@aws-sdk/middleware-recursion-detection": "3.267.0",
+                "@aws-sdk/middleware-retry": "3.267.0",
+                "@aws-sdk/middleware-serde": "3.267.0",
+                "@aws-sdk/middleware-stack": "3.267.0",
+                "@aws-sdk/middleware-user-agent": "3.267.0",
+                "@aws-sdk/node-config-provider": "3.267.0",
+                "@aws-sdk/node-http-handler": "3.267.0",
+                "@aws-sdk/protocol-http": "3.267.0",
+                "@aws-sdk/smithy-client": "3.267.0",
+                "@aws-sdk/types": "3.267.0",
+                "@aws-sdk/url-parser": "3.267.0",
+                "@aws-sdk/util-base64": "3.208.0",
+                "@aws-sdk/util-body-length-browser": "3.188.0",
+                "@aws-sdk/util-body-length-node": "3.208.0",
+                "@aws-sdk/util-defaults-mode-browser": "3.267.0",
+                "@aws-sdk/util-defaults-mode-node": "3.267.0",
+                "@aws-sdk/util-endpoints": "3.267.0",
+                "@aws-sdk/util-retry": "3.267.0",
+                "@aws-sdk/util-user-agent-browser": "3.267.0",
+                "@aws-sdk/util-user-agent-node": "3.267.0",
+                "@aws-sdk/util-utf8": "3.254.0",
+                "tslib": "^2.3.1"
+            }
+        },
+        "@aws-sdk/client-sts": {
+            "version": "3.267.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.267.0.tgz",
+            "integrity": "sha512-bJ+SwJZAP3DuDUgToDV89HsB80IhSfB1rhzLG9csqs6h7uMLO8H1/fymElYKT4VMMAA+rpWJ3pznyGiCK7w28A==",
+            "optional": true,
+            "requires": {
+                "@aws-crypto/sha256-browser": "3.0.0",
+                "@aws-crypto/sha256-js": "3.0.0",
+                "@aws-sdk/config-resolver": "3.267.0",
+                "@aws-sdk/credential-provider-node": "3.267.0",
+                "@aws-sdk/fetch-http-handler": "3.267.0",
+                "@aws-sdk/hash-node": "3.267.0",
+                "@aws-sdk/invalid-dependency": "3.267.0",
+                "@aws-sdk/middleware-content-length": "3.267.0",
+                "@aws-sdk/middleware-endpoint": "3.267.0",
+                "@aws-sdk/middleware-host-header": "3.267.0",
+                "@aws-sdk/middleware-logger": "3.267.0",
+                "@aws-sdk/middleware-recursion-detection": "3.267.0",
+                "@aws-sdk/middleware-retry": "3.267.0",
+                "@aws-sdk/middleware-sdk-sts": "3.267.0",
+                "@aws-sdk/middleware-serde": "3.267.0",
+                "@aws-sdk/middleware-signing": "3.267.0",
+                "@aws-sdk/middleware-stack": "3.267.0",
+                "@aws-sdk/middleware-user-agent": "3.267.0",
+                "@aws-sdk/node-config-provider": "3.267.0",
+                "@aws-sdk/node-http-handler": "3.267.0",
+                "@aws-sdk/protocol-http": "3.267.0",
+                "@aws-sdk/smithy-client": "3.267.0",
+                "@aws-sdk/types": "3.267.0",
+                "@aws-sdk/url-parser": "3.267.0",
+                "@aws-sdk/util-base64": "3.208.0",
+                "@aws-sdk/util-body-length-browser": "3.188.0",
+                "@aws-sdk/util-body-length-node": "3.208.0",
+                "@aws-sdk/util-defaults-mode-browser": "3.267.0",
+                "@aws-sdk/util-defaults-mode-node": "3.267.0",
+                "@aws-sdk/util-endpoints": "3.267.0",
+                "@aws-sdk/util-retry": "3.267.0",
+                "@aws-sdk/util-user-agent-browser": "3.267.0",
+                "@aws-sdk/util-user-agent-node": "3.267.0",
+                "@aws-sdk/util-utf8": "3.254.0",
+                "fast-xml-parser": "4.0.11",
+                "tslib": "^2.3.1"
+            }
+        },
+        "@aws-sdk/config-resolver": {
+            "version": "3.267.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/config-resolver/-/config-resolver-3.267.0.tgz",
+            "integrity": "sha512-UMvJY548xOkamU9ZuZk336VX9r3035CAbttagiPJ/FXy9S8jcQ7N722PAovtxs69nNBQf56cmWsnOHphLCGG9w==",
+            "optional": true,
+            "requires": {
+                "@aws-sdk/signature-v4": "3.267.0",
+                "@aws-sdk/types": "3.267.0",
+                "@aws-sdk/util-config-provider": "3.208.0",
+                "@aws-sdk/util-middleware": "3.267.0",
+                "tslib": "^2.3.1"
+            }
+        },
+        "@aws-sdk/credential-provider-cognito-identity": {
+            "version": "3.267.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-cognito-identity/-/credential-provider-cognito-identity-3.267.0.tgz",
+            "integrity": "sha512-H97VsbiTcb4tbY/LQMZNglJIHt7CHso7RtGgctmdsEA7Rha79fV/egF0Vqo2OQHDgEEpgQDWCeHbXO1P5ibR/A==",
+            "optional": true,
+            "requires": {
+                "@aws-sdk/client-cognito-identity": "3.267.0",
+                "@aws-sdk/property-provider": "3.267.0",
+                "@aws-sdk/types": "3.267.0",
+                "tslib": "^2.3.1"
+            }
+        },
+        "@aws-sdk/credential-provider-env": {
+            "version": "3.267.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.267.0.tgz",
+            "integrity": "sha512-oiem2UtaFe4CQHscUCImJjPhYWd4iF8fqXhlq6BqHs1wsO6A0vnIUGh+Srut/2q7Xeegl/SRU34HK0hh8JCbxg==",
+            "optional": true,
+            "requires": {
+                "@aws-sdk/property-provider": "3.267.0",
+                "@aws-sdk/types": "3.267.0",
+                "tslib": "^2.3.1"
+            }
+        },
+        "@aws-sdk/credential-provider-imds": {
+            "version": "3.267.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-imds/-/credential-provider-imds-3.267.0.tgz",
+            "integrity": "sha512-Afd5+LdJ9QyeI5L4iyVmI4MLV+0JBtRLmRy0LdinwJaP0DyKyv9+uaIaorKfWihQpe8hwjEfQWTlTz2A3JMJtw==",
+            "optional": true,
+            "requires": {
+                "@aws-sdk/node-config-provider": "3.267.0",
+                "@aws-sdk/property-provider": "3.267.0",
+                "@aws-sdk/types": "3.267.0",
+                "@aws-sdk/url-parser": "3.267.0",
+                "tslib": "^2.3.1"
+            }
+        },
+        "@aws-sdk/credential-provider-ini": {
+            "version": "3.267.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.267.0.tgz",
+            "integrity": "sha512-pHHlqZqZXA4cTssTyRmbYtrjxS2BEy2KFYHEEHNUrd82pUHnj70n+lrpVnT5pRhPPDacpNzxq0KZGeNgmETpbw==",
+            "optional": true,
+            "requires": {
+                "@aws-sdk/credential-provider-env": "3.267.0",
+                "@aws-sdk/credential-provider-imds": "3.267.0",
+                "@aws-sdk/credential-provider-process": "3.267.0",
+                "@aws-sdk/credential-provider-sso": "3.267.0",
+                "@aws-sdk/credential-provider-web-identity": "3.267.0",
+                "@aws-sdk/property-provider": "3.267.0",
+                "@aws-sdk/shared-ini-file-loader": "3.267.0",
+                "@aws-sdk/types": "3.267.0",
+                "tslib": "^2.3.1"
+            }
+        },
+        "@aws-sdk/credential-provider-node": {
+            "version": "3.267.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.267.0.tgz",
+            "integrity": "sha512-uo8VyZ/L8HBXskYZC65bR1ZUJ5mBn8JarrGHt6vMG2A+uM7AuryTsKn2wdhPfuCUGKuQLXmix5K4VW/wzq11kQ==",
+            "optional": true,
+            "requires": {
+                "@aws-sdk/credential-provider-env": "3.267.0",
+                "@aws-sdk/credential-provider-imds": "3.267.0",
+                "@aws-sdk/credential-provider-ini": "3.267.0",
+                "@aws-sdk/credential-provider-process": "3.267.0",
+                "@aws-sdk/credential-provider-sso": "3.267.0",
+                "@aws-sdk/credential-provider-web-identity": "3.267.0",
+                "@aws-sdk/property-provider": "3.267.0",
+                "@aws-sdk/shared-ini-file-loader": "3.267.0",
+                "@aws-sdk/types": "3.267.0",
+                "tslib": "^2.3.1"
+            }
+        },
+        "@aws-sdk/credential-provider-process": {
+            "version": "3.267.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.267.0.tgz",
+            "integrity": "sha512-pd1OOB1Mm+QdPv3sPfO+1G8HBaPAAYXxjLcOK5z/myBeZAsLR12Xcaft4RR1XWwXXKEQqq42cbAINWQdyVykqQ==",
+            "optional": true,
+            "requires": {
+                "@aws-sdk/property-provider": "3.267.0",
+                "@aws-sdk/shared-ini-file-loader": "3.267.0",
+                "@aws-sdk/types": "3.267.0",
+                "tslib": "^2.3.1"
+            }
+        },
+        "@aws-sdk/credential-provider-sso": {
+            "version": "3.267.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.267.0.tgz",
+            "integrity": "sha512-JqwxelzeRhVdloNi+VUUXhJdziTtNrrwMuhds9wj4KPfl1S2EIzkRxHSjwDz1wtSyuIPOOo6pPJiaVbwvLpkVg==",
+            "optional": true,
+            "requires": {
+                "@aws-sdk/client-sso": "3.267.0",
+                "@aws-sdk/property-provider": "3.267.0",
+                "@aws-sdk/shared-ini-file-loader": "3.267.0",
+                "@aws-sdk/token-providers": "3.267.0",
+                "@aws-sdk/types": "3.267.0",
+                "tslib": "^2.3.1"
+            }
+        },
+        "@aws-sdk/credential-provider-web-identity": {
+            "version": "3.267.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.267.0.tgz",
+            "integrity": "sha512-za5UsQmj3sYRhd4h5eStj3GCHHfAAjfx2x5FmgQ9ldOp+s0wHEqSL1g+OL9v6o8otf9JnWha+wfUYq3yVGfufQ==",
+            "optional": true,
+            "requires": {
+                "@aws-sdk/property-provider": "3.267.0",
+                "@aws-sdk/types": "3.267.0",
+                "tslib": "^2.3.1"
+            }
+        },
+        "@aws-sdk/credential-providers": {
+            "version": "3.267.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/credential-providers/-/credential-providers-3.267.0.tgz",
+            "integrity": "sha512-Og70E1eHGcxShMbrmm8lOepF82Hg5Fe7WXv0pnUKFFUxr+pf89bCjxGwktZIDM7ZMMXGIyladeIgTjsJkhpjRQ==",
+            "optional": true,
+            "requires": {
+                "@aws-sdk/client-cognito-identity": "3.267.0",
+                "@aws-sdk/client-sso": "3.267.0",
+                "@aws-sdk/client-sts": "3.267.0",
+                "@aws-sdk/credential-provider-cognito-identity": "3.267.0",
+                "@aws-sdk/credential-provider-env": "3.267.0",
+                "@aws-sdk/credential-provider-imds": "3.267.0",
+                "@aws-sdk/credential-provider-ini": "3.267.0",
+                "@aws-sdk/credential-provider-node": "3.267.0",
+                "@aws-sdk/credential-provider-process": "3.267.0",
+                "@aws-sdk/credential-provider-sso": "3.267.0",
+                "@aws-sdk/credential-provider-web-identity": "3.267.0",
+                "@aws-sdk/property-provider": "3.267.0",
+                "@aws-sdk/shared-ini-file-loader": "3.267.0",
+                "@aws-sdk/types": "3.267.0",
+                "tslib": "^2.3.1"
+            }
+        },
+        "@aws-sdk/fetch-http-handler": {
+            "version": "3.267.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/fetch-http-handler/-/fetch-http-handler-3.267.0.tgz",
+            "integrity": "sha512-u8v8OvWvLVfifmETCAj+DCTot900AsdO1b+N+O8nXiTm2v99rtEoNRJW+no/5vJKNqR+95OAz4NWjFep8nzseg==",
+            "optional": true,
+            "requires": {
+                "@aws-sdk/protocol-http": "3.267.0",
+                "@aws-sdk/querystring-builder": "3.267.0",
+                "@aws-sdk/types": "3.267.0",
+                "@aws-sdk/util-base64": "3.208.0",
+                "tslib": "^2.3.1"
+            }
+        },
+        "@aws-sdk/hash-node": {
+            "version": "3.267.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/hash-node/-/hash-node-3.267.0.tgz",
+            "integrity": "sha512-N3xeChdJg4V4jh2vrRN521EMJYxjUOo/LpvpisFyQHE/p31AfcOLb05upYFoYLvyeder9RHBIyNsvvnMYYoCsA==",
+            "optional": true,
+            "requires": {
+                "@aws-sdk/types": "3.267.0",
+                "@aws-sdk/util-buffer-from": "3.208.0",
+                "@aws-sdk/util-utf8": "3.254.0",
+                "tslib": "^2.3.1"
+            }
+        },
+        "@aws-sdk/invalid-dependency": {
+            "version": "3.267.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/invalid-dependency/-/invalid-dependency-3.267.0.tgz",
+            "integrity": "sha512-I95IR/eDLC54+9qrL6uh64nhpLVHwxxbBhhEUZKDACp86eXulO8T/DOwUX31ps4+2lI7tbEhQT7f9WDOO3fN8Q==",
+            "optional": true,
+            "requires": {
+                "@aws-sdk/types": "3.267.0",
+                "tslib": "^2.3.1"
+            }
+        },
+        "@aws-sdk/is-array-buffer": {
+            "version": "3.201.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/is-array-buffer/-/is-array-buffer-3.201.0.tgz",
+            "integrity": "sha512-UPez5qLh3dNgt0DYnPD/q0mVJY84rA17QE26hVNOW3fAji8W2wrwrxdacWOxyXvlxWsVRcKmr+lay1MDqpAMfg==",
+            "optional": true,
+            "requires": {
+                "tslib": "^2.3.1"
+            }
+        },
+        "@aws-sdk/middleware-content-length": {
+            "version": "3.267.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-content-length/-/middleware-content-length-3.267.0.tgz",
+            "integrity": "sha512-b6MBIK12iwcATKnWIhsh50xWVMmZOXZFIo9D4io6D+JM6j/U+GZrSWqxhHzb3SjavuwVgA2hwq4mUCh2WJPJKA==",
+            "optional": true,
+            "requires": {
+                "@aws-sdk/protocol-http": "3.267.0",
+                "@aws-sdk/types": "3.267.0",
+                "tslib": "^2.3.1"
+            }
+        },
+        "@aws-sdk/middleware-endpoint": {
+            "version": "3.267.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-endpoint/-/middleware-endpoint-3.267.0.tgz",
+            "integrity": "sha512-pGICM/qlQVfixtfKZt8zHq54KvLG2MmOAgNWj2MXB7oirPs/3rC9Kz9ITFXJgjlRFyfssgP/feKhs2yZkI8lhw==",
+            "optional": true,
+            "requires": {
+                "@aws-sdk/middleware-serde": "3.267.0",
+                "@aws-sdk/protocol-http": "3.267.0",
+                "@aws-sdk/signature-v4": "3.267.0",
+                "@aws-sdk/types": "3.267.0",
+                "@aws-sdk/url-parser": "3.267.0",
+                "@aws-sdk/util-config-provider": "3.208.0",
+                "@aws-sdk/util-middleware": "3.267.0",
+                "tslib": "^2.3.1"
+            }
+        },
+        "@aws-sdk/middleware-host-header": {
+            "version": "3.267.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.267.0.tgz",
+            "integrity": "sha512-D8TfjMeuQXTsB7Ni8liMmNqb3wz+T6t/tYUHtsMo0j++94KAPPj1rhkkTAjR4Rc+IYGCS4YyyCuCXjGB6gkjnA==",
+            "optional": true,
+            "requires": {
+                "@aws-sdk/protocol-http": "3.267.0",
+                "@aws-sdk/types": "3.267.0",
+                "tslib": "^2.3.1"
+            }
+        },
+        "@aws-sdk/middleware-logger": {
+            "version": "3.267.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.267.0.tgz",
+            "integrity": "sha512-wnLeZYWbgGCuNmRl0Pmky0cSXBWmMTaQBgq90WfwyM0V8wzcoeaovTWA5/qe8oJzusOgUMFoVia4Ew20k3lu8w==",
+            "optional": true,
+            "requires": {
+                "@aws-sdk/types": "3.267.0",
+                "tslib": "^2.3.1"
+            }
+        },
+        "@aws-sdk/middleware-recursion-detection": {
+            "version": "3.267.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.267.0.tgz",
+            "integrity": "sha512-NCBkTLxaW7XtfQoVBqQCaQZqec5XDtEylkw7g0tGjYDcl934fzu3ciH9MsJ34QFe9slYM6g4v+eC9f1w9K/19g==",
+            "optional": true,
+            "requires": {
+                "@aws-sdk/protocol-http": "3.267.0",
+                "@aws-sdk/types": "3.267.0",
+                "tslib": "^2.3.1"
+            }
+        },
+        "@aws-sdk/middleware-retry": {
+            "version": "3.267.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-retry/-/middleware-retry-3.267.0.tgz",
+            "integrity": "sha512-MiiNtddZXVhtSAnJFyChwNxnhzMYmv6qWl8qgSjuIOw9SczkHPCoANTfUdRlzG6RfPYhgYtzMGqqnrficJ6mVg==",
+            "optional": true,
+            "requires": {
+                "@aws-sdk/protocol-http": "3.267.0",
+                "@aws-sdk/service-error-classification": "3.267.0",
+                "@aws-sdk/types": "3.267.0",
+                "@aws-sdk/util-middleware": "3.267.0",
+                "@aws-sdk/util-retry": "3.267.0",
+                "tslib": "^2.3.1",
+                "uuid": "^8.3.2"
+            }
+        },
+        "@aws-sdk/middleware-sdk-sts": {
+            "version": "3.267.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-sts/-/middleware-sdk-sts-3.267.0.tgz",
+            "integrity": "sha512-JLDNNvV7Hr0CQrf1vSmflvPbfDFIx5lFf8tY7DZwYWEE920ZzbJTfUsTW9iZHJGeIe8dAQX1tmfYL68+++nvEQ==",
+            "optional": true,
+            "requires": {
+                "@aws-sdk/middleware-signing": "3.267.0",
+                "@aws-sdk/property-provider": "3.267.0",
+                "@aws-sdk/protocol-http": "3.267.0",
+                "@aws-sdk/signature-v4": "3.267.0",
+                "@aws-sdk/types": "3.267.0",
+                "tslib": "^2.3.1"
+            }
+        },
+        "@aws-sdk/middleware-serde": {
+            "version": "3.267.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-serde/-/middleware-serde-3.267.0.tgz",
+            "integrity": "sha512-9qspxiZs+JShukzKMAameBSubfvtUOGZviu9GT5OfRekY2dBbwWcfchP2WvlwxZ/CcC+GwO1HcPqKDCMGsNoow==",
+            "optional": true,
+            "requires": {
+                "@aws-sdk/types": "3.267.0",
+                "tslib": "^2.3.1"
+            }
+        },
+        "@aws-sdk/middleware-signing": {
+            "version": "3.267.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-signing/-/middleware-signing-3.267.0.tgz",
+            "integrity": "sha512-thkFEBiFW0M/73dIzl7hQmyAONb8zyD2ZYUFyGm7cIM60sRDUKejPHV6Izonll+HbBZgiBdwUi42uu8O+LfFGQ==",
+            "optional": true,
+            "requires": {
+                "@aws-sdk/property-provider": "3.267.0",
+                "@aws-sdk/protocol-http": "3.267.0",
+                "@aws-sdk/signature-v4": "3.267.0",
+                "@aws-sdk/types": "3.267.0",
+                "@aws-sdk/util-middleware": "3.267.0",
+                "tslib": "^2.3.1"
+            }
+        },
+        "@aws-sdk/middleware-stack": {
+            "version": "3.267.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-stack/-/middleware-stack-3.267.0.tgz",
+            "integrity": "sha512-52uH3JO3ceI15dgzt8gU7lpJf59qbRUQYJ7pAmTMiHtyEawZ39Puv6sGheY3fAffhqd/aQvup6wn18Q1fRIQUA==",
+            "optional": true,
+            "requires": {
+                "tslib": "^2.3.1"
+            }
+        },
+        "@aws-sdk/middleware-user-agent": {
+            "version": "3.267.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.267.0.tgz",
+            "integrity": "sha512-eaReMnoB1Cx3OY8WDSiUMNDz/EkdAo4w/m3d5CizckKQNmB29gUrgyFs7g7sHTcShQAduZzlsfRPzc6NmKYaWQ==",
+            "optional": true,
+            "requires": {
+                "@aws-sdk/protocol-http": "3.267.0",
+                "@aws-sdk/types": "3.267.0",
+                "tslib": "^2.3.1"
+            }
+        },
+        "@aws-sdk/node-config-provider": {
+            "version": "3.267.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/node-config-provider/-/node-config-provider-3.267.0.tgz",
+            "integrity": "sha512-wNX+Cu0x+kllng253j5dvmLm4opDRr7YehJ0rNGAV24X+UPJPluN9HrBFly+z4+bH16TpJEPKx7AayiWZGFE1w==",
+            "optional": true,
+            "requires": {
+                "@aws-sdk/property-provider": "3.267.0",
+                "@aws-sdk/shared-ini-file-loader": "3.267.0",
+                "@aws-sdk/types": "3.267.0",
+                "tslib": "^2.3.1"
+            }
+        },
+        "@aws-sdk/node-http-handler": {
+            "version": "3.267.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/node-http-handler/-/node-http-handler-3.267.0.tgz",
+            "integrity": "sha512-wtt3O+e8JEKaLFtmQd74HSZj2TyiApPkwMJ3R50hyboVswt8RcdMWdFbzLnPVpT1AqskG3fMECSKbu8AC/xvBQ==",
+            "optional": true,
+            "requires": {
+                "@aws-sdk/abort-controller": "3.267.0",
+                "@aws-sdk/protocol-http": "3.267.0",
+                "@aws-sdk/querystring-builder": "3.267.0",
+                "@aws-sdk/types": "3.267.0",
+                "tslib": "^2.3.1"
+            }
+        },
+        "@aws-sdk/property-provider": {
+            "version": "3.267.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/property-provider/-/property-provider-3.267.0.tgz",
+            "integrity": "sha512-/BD1Zar9PCQSV8VZTAWOJmtojAeMIl16ljZX3Kix84r45qqNNxuPST2AhNVN+p97Js4x9kBFCHkdFOpW94wr4Q==",
+            "optional": true,
+            "requires": {
+                "@aws-sdk/types": "3.267.0",
+                "tslib": "^2.3.1"
+            }
+        },
+        "@aws-sdk/protocol-http": {
+            "version": "3.267.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/protocol-http/-/protocol-http-3.267.0.tgz",
+            "integrity": "sha512-8HhOZXMCZ0nsJC/FoifX7YrTYGP91tCpSxIHkr7HxQcTdBMI7QakMtIIWK9Qjsy6tUI98aAdEo5PNCbzdpozmQ==",
+            "optional": true,
+            "requires": {
+                "@aws-sdk/types": "3.267.0",
+                "tslib": "^2.3.1"
+            }
+        },
+        "@aws-sdk/querystring-builder": {
+            "version": "3.267.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/querystring-builder/-/querystring-builder-3.267.0.tgz",
+            "integrity": "sha512-SKo8V3oPV1wZy4r4lccH7R2LT0PUK/WGaXkKR30wyrtDjJRWVJDYef9ysOpRP+adCTt3G5XO0SzyPQUW5dXYVA==",
+            "optional": true,
+            "requires": {
+                "@aws-sdk/types": "3.267.0",
+                "@aws-sdk/util-uri-escape": "3.201.0",
+                "tslib": "^2.3.1"
+            }
+        },
+        "@aws-sdk/querystring-parser": {
+            "version": "3.267.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/querystring-parser/-/querystring-parser-3.267.0.tgz",
+            "integrity": "sha512-Krq36GXqEfRfzJ9wOzkkzpbb4SWjgSYydTIgK6KtKapme0HPcB24kmmsjsUVuHzKuQMCHHDRWm+b47iBmHGpSQ==",
+            "optional": true,
+            "requires": {
+                "@aws-sdk/types": "3.267.0",
+                "tslib": "^2.3.1"
+            }
+        },
+        "@aws-sdk/service-error-classification": {
+            "version": "3.267.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/service-error-classification/-/service-error-classification-3.267.0.tgz",
+            "integrity": "sha512-fOWg7bcItmJqD/YQbGvN9o03ucoBzvWNTQEB81mLKMSKr1Cf/ms0f8oa94LlImgqjjfjvAqHh6rUBTpSmSEyaw==",
+            "optional": true
+        },
+        "@aws-sdk/shared-ini-file-loader": {
+            "version": "3.267.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/shared-ini-file-loader/-/shared-ini-file-loader-3.267.0.tgz",
+            "integrity": "sha512-Jz9R5hXKSk+aRoBKi4Bnf6T/FZUBYrIibbLnhiNxpQ1FY9mTggJR/rxuIdOE23LtfW+CRqqEYOtAtmC1oYE6tw==",
+            "optional": true,
+            "requires": {
+                "@aws-sdk/types": "3.267.0",
+                "tslib": "^2.3.1"
+            }
+        },
+        "@aws-sdk/signature-v4": {
+            "version": "3.267.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4/-/signature-v4-3.267.0.tgz",
+            "integrity": "sha512-Je1e7rum2zvxa3jWfwq4E+fyBdFJmSJAwGtWYz3+/rWipwXFlSAPeSVqtNjHdfzakgabvzLp7aesG4yQTrO2YQ==",
+            "optional": true,
+            "requires": {
+                "@aws-sdk/is-array-buffer": "3.201.0",
+                "@aws-sdk/types": "3.267.0",
+                "@aws-sdk/util-hex-encoding": "3.201.0",
+                "@aws-sdk/util-middleware": "3.267.0",
+                "@aws-sdk/util-uri-escape": "3.201.0",
+                "@aws-sdk/util-utf8": "3.254.0",
+                "tslib": "^2.3.1"
+            }
+        },
+        "@aws-sdk/smithy-client": {
+            "version": "3.267.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/smithy-client/-/smithy-client-3.267.0.tgz",
+            "integrity": "sha512-WdgXHqKmFQIkAWETO/I5boX9u6QbMLC4X74OVSBaBLhRjqYmvolMFtNrQzvSKGB3FaxAN9Do41amC0mGoeLC8A==",
+            "optional": true,
+            "requires": {
+                "@aws-sdk/middleware-stack": "3.267.0",
+                "@aws-sdk/types": "3.267.0",
+                "tslib": "^2.3.1"
+            }
+        },
+        "@aws-sdk/token-providers": {
+            "version": "3.267.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.267.0.tgz",
+            "integrity": "sha512-CGayGrPl4ONG4RuGbNv+QS4oVuItx4hK2FCbFS7d6V7h53rkDrcFd34NsvbicQ2KVFobE7fKs6ZaripJbJbLHA==",
+            "optional": true,
+            "requires": {
+                "@aws-sdk/client-sso-oidc": "3.267.0",
+                "@aws-sdk/property-provider": "3.267.0",
+                "@aws-sdk/shared-ini-file-loader": "3.267.0",
+                "@aws-sdk/types": "3.267.0",
+                "tslib": "^2.3.1"
+            }
+        },
+        "@aws-sdk/types": {
+            "version": "3.267.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.267.0.tgz",
+            "integrity": "sha512-fICTbSeIfXlTHnciQgDt37R0kXoKxgh0a3prnLWVvTcmf7NFujdZmg5YTAZT3KJJ7SuKsIgnI8azBYioVY8BVQ==",
+            "optional": true,
+            "requires": {
+                "tslib": "^2.3.1"
+            }
+        },
+        "@aws-sdk/url-parser": {
+            "version": "3.267.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/url-parser/-/url-parser-3.267.0.tgz",
+            "integrity": "sha512-xoQ5Fd11moiE82QTL9GGE6e73SFuD0Wi73tA75TAwKuY12OP5vDJ4oBC86A1G2T+OzeHJQmYyqiA5j48CzqB6A==",
+            "optional": true,
+            "requires": {
+                "@aws-sdk/querystring-parser": "3.267.0",
+                "@aws-sdk/types": "3.267.0",
+                "tslib": "^2.3.1"
+            }
+        },
+        "@aws-sdk/util-base64": {
+            "version": "3.208.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/util-base64/-/util-base64-3.208.0.tgz",
+            "integrity": "sha512-PQniZph5A6N7uuEOQi+1hnMz/FSOK/8kMFyFO+4DgA1dZ5pcKcn5wiFwHkcTb/BsgVqQa3Jx0VHNnvhlS8JyTg==",
+            "optional": true,
+            "requires": {
+                "@aws-sdk/util-buffer-from": "3.208.0",
+                "tslib": "^2.3.1"
+            }
+        },
+        "@aws-sdk/util-body-length-browser": {
+            "version": "3.188.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/util-body-length-browser/-/util-body-length-browser-3.188.0.tgz",
+            "integrity": "sha512-8VpnwFWXhnZ/iRSl9mTf+VKOX9wDE8QtN4bj9pBfxwf90H1X7E8T6NkiZD3k+HubYf2J94e7DbeHs7fuCPW5Qg==",
+            "optional": true,
+            "requires": {
+                "tslib": "^2.3.1"
+            }
+        },
+        "@aws-sdk/util-body-length-node": {
+            "version": "3.208.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/util-body-length-node/-/util-body-length-node-3.208.0.tgz",
+            "integrity": "sha512-3zj50e5g7t/MQf53SsuuSf0hEELzMtD8RX8C76f12OSRo2Bca4FLLYHe0TZbxcfQHom8/hOaeZEyTyMogMglqg==",
+            "optional": true,
+            "requires": {
+                "tslib": "^2.3.1"
+            }
+        },
+        "@aws-sdk/util-buffer-from": {
+            "version": "3.208.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/util-buffer-from/-/util-buffer-from-3.208.0.tgz",
+            "integrity": "sha512-7L0XUixNEFcLUGPeBF35enCvB9Xl+K6SQsmbrPk1P3mlV9mguWSDQqbOBwY1Ir0OVbD6H/ZOQU7hI/9RtRI0Zw==",
+            "optional": true,
+            "requires": {
+                "@aws-sdk/is-array-buffer": "3.201.0",
+                "tslib": "^2.3.1"
+            }
+        },
+        "@aws-sdk/util-config-provider": {
+            "version": "3.208.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/util-config-provider/-/util-config-provider-3.208.0.tgz",
+            "integrity": "sha512-DSRqwrERUsT34ug+anlMBIFooBEGwM8GejC7q00Y/9IPrQy50KnG5PW2NiTjuLKNi7pdEOlwTSEocJE15eDZIg==",
+            "optional": true,
+            "requires": {
+                "tslib": "^2.3.1"
+            }
+        },
+        "@aws-sdk/util-defaults-mode-browser": {
+            "version": "3.267.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/util-defaults-mode-browser/-/util-defaults-mode-browser-3.267.0.tgz",
+            "integrity": "sha512-MgrqpedA58HVR8RpT2A42//5Lb3M0JwEiYlDaA7EvIVsMx1NzO+cng4MDJi03YBAP5hwCVQmO9Sf5Au4dm+m0g==",
+            "optional": true,
+            "requires": {
+                "@aws-sdk/property-provider": "3.267.0",
+                "@aws-sdk/types": "3.267.0",
+                "bowser": "^2.11.0",
+                "tslib": "^2.3.1"
+            }
+        },
+        "@aws-sdk/util-defaults-mode-node": {
+            "version": "3.267.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/util-defaults-mode-node/-/util-defaults-mode-node-3.267.0.tgz",
+            "integrity": "sha512-JyFk95T77sGM4q386id/mDt9/7HvoQySAygPyv/lj//WEJJIRKiefB277CKKJPT8nRAsO4mIyAT+YO/xGCxkQA==",
+            "optional": true,
+            "requires": {
+                "@aws-sdk/config-resolver": "3.267.0",
+                "@aws-sdk/credential-provider-imds": "3.267.0",
+                "@aws-sdk/node-config-provider": "3.267.0",
+                "@aws-sdk/property-provider": "3.267.0",
+                "@aws-sdk/types": "3.267.0",
+                "tslib": "^2.3.1"
+            }
+        },
+        "@aws-sdk/util-endpoints": {
+            "version": "3.267.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.267.0.tgz",
+            "integrity": "sha512-c6miY83Eo0erqXY+YiS2sOg3izURqvaWHd9przJzBQea9XRCN4ANT2P8AhoC0BPIORutaaOSoCSp/crHG0XLLg==",
+            "optional": true,
+            "requires": {
+                "@aws-sdk/types": "3.267.0",
+                "tslib": "^2.3.1"
+            }
+        },
+        "@aws-sdk/util-hex-encoding": {
+            "version": "3.201.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/util-hex-encoding/-/util-hex-encoding-3.201.0.tgz",
+            "integrity": "sha512-7t1vR1pVxKx0motd3X9rI3m/xNp78p3sHtP5yo4NP4ARpxyJ0fokBomY8ScaH2D/B+U5o9ARxldJUdMqyBlJcA==",
+            "optional": true,
+            "requires": {
+                "tslib": "^2.3.1"
+            }
+        },
+        "@aws-sdk/util-locate-window": {
+            "version": "3.208.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/util-locate-window/-/util-locate-window-3.208.0.tgz",
+            "integrity": "sha512-iua1A2+P7JJEDHVgvXrRJSvsnzG7stYSGQnBVphIUlemwl6nN5D+QrgbjECtrbxRz8asYFHSzhdhECqN+tFiBg==",
+            "optional": true,
+            "requires": {
+                "tslib": "^2.3.1"
+            }
+        },
+        "@aws-sdk/util-middleware": {
+            "version": "3.267.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/util-middleware/-/util-middleware-3.267.0.tgz",
+            "integrity": "sha512-7nvqBZVz3RdwYv6lU958g6sWI2Qt8lzxDVn0uwfnPH+fAiX7Ln1Hen2A0XeW5cL5uYUJy6wNM5cyfTzFZosE0A==",
+            "optional": true,
+            "requires": {
+                "tslib": "^2.3.1"
+            }
+        },
+        "@aws-sdk/util-retry": {
+            "version": "3.267.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/util-retry/-/util-retry-3.267.0.tgz",
+            "integrity": "sha512-ZXo1ICG2HgxkIZWlnPteh2R90kwmhRwvbP282CwrrYgTKuMZmW2R/+o6vqhWyPkjoNFN/pno0FxuDA3IYau3Sw==",
+            "optional": true,
+            "requires": {
+                "@aws-sdk/service-error-classification": "3.267.0",
+                "tslib": "^2.3.1"
+            }
+        },
+        "@aws-sdk/util-uri-escape": {
+            "version": "3.201.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/util-uri-escape/-/util-uri-escape-3.201.0.tgz",
+            "integrity": "sha512-TeTWbGx4LU2c5rx0obHeDFeO9HvwYwQtMh1yniBz00pQb6Qt6YVOETVQikRZ+XRQwEyCg/dA375UplIpiy54mA==",
+            "optional": true,
+            "requires": {
+                "tslib": "^2.3.1"
+            }
+        },
+        "@aws-sdk/util-user-agent-browser": {
+            "version": "3.267.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.267.0.tgz",
+            "integrity": "sha512-SmI6xInnPPa0gFhCqhtWOUMTxLeRbm7X5HXzeprhK1d8aNNlUVyALAV7K8ovIjnv3a97lIJSekyb78oTuYITCA==",
+            "optional": true,
+            "requires": {
+                "@aws-sdk/types": "3.267.0",
+                "bowser": "^2.11.0",
+                "tslib": "^2.3.1"
+            }
+        },
+        "@aws-sdk/util-user-agent-node": {
+            "version": "3.267.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.267.0.tgz",
+            "integrity": "sha512-nfmyffA1yIypJ30CIMO6Tc16t8dFJzdztzoowjmnfb8/LzTZECERM3GICq0DvZDPfSo+jbuz634VtS2K7tVZjA==",
+            "optional": true,
+            "requires": {
+                "@aws-sdk/node-config-provider": "3.267.0",
+                "@aws-sdk/types": "3.267.0",
+                "tslib": "^2.3.1"
+            }
+        },
+        "@aws-sdk/util-utf8": {
+            "version": "3.254.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/util-utf8/-/util-utf8-3.254.0.tgz",
+            "integrity": "sha512-14Kso/eIt5/qfIBmhEL9L1IfyUqswjSTqO2mY7KOzUZ9SZbwn3rpxmtkhmATkRjD7XIlLKaxBkI7tU9Zjzj8Kw==",
+            "optional": true,
+            "requires": {
+                "@aws-sdk/util-buffer-from": "3.208.0",
+                "tslib": "^2.3.1"
+            }
+        },
+        "@aws-sdk/util-utf8-browser": {
+            "version": "3.259.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/util-utf8-browser/-/util-utf8-browser-3.259.0.tgz",
+            "integrity": "sha512-UvFa/vR+e19XookZF8RzFZBrw2EUkQWxiBW0yYQAhvk3C+QVGl0H3ouca8LDBlBfQKXwmW3huo/59H8rwb1wJw==",
+            "optional": true,
+            "requires": {
+                "tslib": "^2.3.1"
+            }
+        },
         "@azure/abort-controller": {
             "version": "1.1.0",
             "resolved": "https://registry.npmjs.org/@azure/abort-controller/-/abort-controller-1.1.0.tgz",
@@ -16989,9 +20085,9 @@
             }
         },
         "@azure/core-client": {
-            "version": "1.6.1",
-            "resolved": "https://registry.npmjs.org/@azure/core-client/-/core-client-1.6.1.tgz",
-            "integrity": "sha512-mZ1MSKhZBYoV8GAWceA+PEJFWV2VpdNSpxxcj1wjIAOi00ykRuIQChT99xlQGZWLY3/NApWhSImlFwsmCEs4vA==",
+            "version": "1.7.1",
+            "resolved": "https://registry.npmjs.org/@azure/core-client/-/core-client-1.7.1.tgz",
+            "integrity": "sha512-85igXpc5V7ns6rvMEpLmIcBDftjUgTWD+0tmYPyQEfPfkAwpPTs1X5rhCDsfqvUZGA8Ksid1hdZGu62r6XXeHg==",
             "requires": {
                 "@azure/abort-controller": "^1.0.0",
                 "@azure/core-auth": "^1.4.0",
@@ -17013,9 +20109,9 @@
             }
         },
         "@azure/core-lro": {
-            "version": "2.4.0",
-            "resolved": "https://registry.npmjs.org/@azure/core-lro/-/core-lro-2.4.0.tgz",
-            "integrity": "sha512-F65+rYkll1dpw3RGm8/SSiSj+/QkMeYDanzS/QKlM1dmuneVyXbO46C88V1MRHluLGdMP6qfD3vDRYALn0z0tQ==",
+            "version": "2.5.1",
+            "resolved": "https://registry.npmjs.org/@azure/core-lro/-/core-lro-2.5.1.tgz",
+            "integrity": "sha512-JHQy/bA3NOz2WuzOi5zEk6n/TJdAropupxUT521JIJvW7EXV2YN2SFYZrf/2RHeD28QAClGdynYadZsbmP+nyQ==",
             "requires": {
                 "@azure/abort-controller": "^1.0.0",
                 "@azure/logger": "^1.0.0",
@@ -17023,17 +20119,17 @@
             }
         },
         "@azure/core-paging": {
-            "version": "1.4.0",
-            "resolved": "https://registry.npmjs.org/@azure/core-paging/-/core-paging-1.4.0.tgz",
-            "integrity": "sha512-tabFtZTg8D9XqZKEfNUOGh63SuYeOxmvH4GDcOJN+R1bZWZ1FZskctgY9Pmuwzhn+0Xvq9rmimK9hsvtLkeBsw==",
+            "version": "1.5.0",
+            "resolved": "https://registry.npmjs.org/@azure/core-paging/-/core-paging-1.5.0.tgz",
+            "integrity": "sha512-zqWdVIt+2Z+3wqxEOGzR5hXFZ8MGKK52x4vFLw8n58pR6ZfKRx3EXYTxTaYxYHc/PexPUTyimcTWFJbji9Z6Iw==",
             "requires": {
                 "tslib": "^2.2.0"
             }
         },
         "@azure/core-rest-pipeline": {
-            "version": "1.10.0",
-            "resolved": "https://registry.npmjs.org/@azure/core-rest-pipeline/-/core-rest-pipeline-1.10.0.tgz",
-            "integrity": "sha512-m6c4iAalfaf6sytOOQhLKFprEHSkSjQuRgkW7MTMnAN+GENDDL4XZJp7WKFnq9VpKUE+ggq+rp5xX9GI93lumw==",
+            "version": "1.10.1",
+            "resolved": "https://registry.npmjs.org/@azure/core-rest-pipeline/-/core-rest-pipeline-1.10.1.tgz",
+            "integrity": "sha512-Kji9k6TOFRDB5ZMTw8qUf2IJ+CeJtsuMdAHox9eqpTf1cefiNMpzrfnF6sINEBZJsaVaWgQ0o48B6kcUH68niA==",
             "requires": {
                 "@azure/abort-controller": "^1.0.0",
                 "@azure/core-auth": "^1.4.0",
@@ -17135,17 +20231,17 @@
             }
         },
         "@azure/msal-browser": {
-            "version": "2.32.0",
-            "resolved": "https://registry.npmjs.org/@azure/msal-browser/-/msal-browser-2.32.0.tgz",
-            "integrity": "sha512-uDP0vNmIefM6+RjILGKu+zOiN+VGnEvxRfUIV5hOWOWLLkG7kcDPYG/v/EJMoG+R5DYW9jXA5nvZT76t5HdEAQ==",
+            "version": "2.33.0",
+            "resolved": "https://registry.npmjs.org/@azure/msal-browser/-/msal-browser-2.33.0.tgz",
+            "integrity": "sha512-c7CVh1tfUfxiWkEIhoIb11hL4PGo4hz0M+gMy34ATagAKdLK7qyEu/5AXJWAf5lz5eE+vQhm7+LKiuETrcXXGw==",
             "requires": {
-                "@azure/msal-common": "^9.0.0"
+                "@azure/msal-common": "^10.0.0"
             },
             "dependencies": {
                 "@azure/msal-common": {
-                    "version": "9.0.0",
-                    "resolved": "https://registry.npmjs.org/@azure/msal-common/-/msal-common-9.0.0.tgz",
-                    "integrity": "sha512-uiFiFKVNTsRpmKio5bcObTuHcaHHZB2GEsjJJN8rbJNmzoYuZzNioOoK+J0QK0jEasRBgAoR5A8hSty2iKRzIg=="
+                    "version": "10.0.0",
+                    "resolved": "https://registry.npmjs.org/@azure/msal-common/-/msal-common-10.0.0.tgz",
+                    "integrity": "sha512-/LghpT93jsZLy55QzTsRZWMx6R1Mjc1Aktwps8sKSGE3WbrGwbSsh2uhDlpl6FMcKChYjJ0ochThWwwOodrQNg=="
                 }
             }
         },
@@ -17155,19 +20251,19 @@
             "integrity": "sha512-XqfbglUTVLdkHQ8F9UQJtKseRr3sSnr9ysboxtoswvaMVaEfvyLtMoHv9XdKUfOc0qKGzNgRFd9yRjIWVepl6Q=="
         },
         "@azure/msal-node": {
-            "version": "1.14.4",
-            "resolved": "https://registry.npmjs.org/@azure/msal-node/-/msal-node-1.14.4.tgz",
-            "integrity": "sha512-j9GzZu5mTLWtuJ+cYN6e67UNymIS5OysblrOzH8lakt9XxH0GCPYjuqbOEKTP84r+Rbj3io+TuW1KS+0Xxuj/g==",
+            "version": "1.15.0",
+            "resolved": "https://registry.npmjs.org/@azure/msal-node/-/msal-node-1.15.0.tgz",
+            "integrity": "sha512-fwC5M0c8pxOAzmScPbpx7j28YVTDebUaizlVF7bR0xvlU0r3VWW5OobCcr9ybqKS6wGyO7u4EhXJS9rjRWAuwA==",
             "requires": {
-                "@azure/msal-common": "^9.0.0",
-                "jsonwebtoken": "^8.5.1",
+                "@azure/msal-common": "^10.0.0",
+                "jsonwebtoken": "^9.0.0",
                 "uuid": "^8.3.0"
             },
             "dependencies": {
                 "@azure/msal-common": {
-                    "version": "9.0.0",
-                    "resolved": "https://registry.npmjs.org/@azure/msal-common/-/msal-common-9.0.0.tgz",
-                    "integrity": "sha512-uiFiFKVNTsRpmKio5bcObTuHcaHHZB2GEsjJJN8rbJNmzoYuZzNioOoK+J0QK0jEasRBgAoR5A8hSty2iKRzIg=="
+                    "version": "10.0.0",
+                    "resolved": "https://registry.npmjs.org/@azure/msal-common/-/msal-common-10.0.0.tgz",
+                    "integrity": "sha512-/LghpT93jsZLy55QzTsRZWMx6R1Mjc1Aktwps8sKSGE3WbrGwbSsh2uhDlpl6FMcKChYjJ0ochThWwwOodrQNg=="
                 }
             }
         },
@@ -17181,31 +20277,31 @@
             }
         },
         "@babel/compat-data": {
-            "version": "7.20.1",
-            "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.20.1.tgz",
-            "integrity": "sha512-EWZ4mE2diW3QALKvDMiXnbZpRvlj+nayZ112nK93SnhqOtpdsbVD4W+2tEoT3YNBAG9RBR0ISY758ZkOgsn6pQ==",
+            "version": "7.20.14",
+            "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.20.14.tgz",
+            "integrity": "sha512-0YpKHD6ImkWMEINCyDAD0HLLUH/lPCefG8ld9it8DJB2wnApraKuhgYTvTY1z7UFIfBTGy5LwncZ+5HWWGbhFw==",
             "dev": true
         },
         "@babel/core": {
-            "version": "7.20.2",
-            "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.20.2.tgz",
-            "integrity": "sha512-w7DbG8DtMrJcFOi4VrLm+8QM4az8Mo+PuLBKLp2zrYRCow8W/f9xiXm5sN53C8HksCyDQwCKha9JiDoIyPjT2g==",
+            "version": "7.20.12",
+            "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.20.12.tgz",
+            "integrity": "sha512-XsMfHovsUYHFMdrIHkZphTN/2Hzzi78R08NuHfDBehym2VsPDL6Zn/JAD/JQdnRvbSsbQc4mVaU1m6JgtTEElg==",
             "dev": true,
             "requires": {
                 "@ampproject/remapping": "^2.1.0",
                 "@babel/code-frame": "^7.18.6",
-                "@babel/generator": "^7.20.2",
-                "@babel/helper-compilation-targets": "^7.20.0",
-                "@babel/helper-module-transforms": "^7.20.2",
-                "@babel/helpers": "^7.20.1",
-                "@babel/parser": "^7.20.2",
-                "@babel/template": "^7.18.10",
-                "@babel/traverse": "^7.20.1",
-                "@babel/types": "^7.20.2",
+                "@babel/generator": "^7.20.7",
+                "@babel/helper-compilation-targets": "^7.20.7",
+                "@babel/helper-module-transforms": "^7.20.11",
+                "@babel/helpers": "^7.20.7",
+                "@babel/parser": "^7.20.7",
+                "@babel/template": "^7.20.7",
+                "@babel/traverse": "^7.20.12",
+                "@babel/types": "^7.20.7",
                 "convert-source-map": "^1.7.0",
                 "debug": "^4.1.0",
                 "gensync": "^1.0.0-beta.2",
-                "json5": "^2.2.1",
+                "json5": "^2.2.2",
                 "semver": "^6.3.0"
             }
         },
@@ -17221,12 +20317,12 @@
             }
         },
         "@babel/generator": {
-            "version": "7.20.4",
-            "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.20.4.tgz",
-            "integrity": "sha512-luCf7yk/cm7yab6CAW1aiFnmEfBJplb/JojV56MYEK7ziWfGmFlTfmL9Ehwfy4gFhbjBfWO1wj7/TuSbVNEEtA==",
+            "version": "7.20.14",
+            "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.20.14.tgz",
+            "integrity": "sha512-AEmuXHdcD3A52HHXxaTmYlb8q/xMEhoRP67B3T4Oq7lbmSoqroMZzjnGj3+i1io3pdnF8iBYVu4Ilj+c4hBxYg==",
             "dev": true,
             "requires": {
-                "@babel/types": "^7.20.2",
+                "@babel/types": "^7.20.7",
                 "@jridgewell/gen-mapping": "^0.3.2",
                 "jsesc": "^2.5.1"
             },
@@ -17259,40 +20355,42 @@
             }
         },
         "@babel/helper-compilation-targets": {
-            "version": "7.20.0",
-            "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.0.tgz",
-            "integrity": "sha512-0jp//vDGp9e8hZzBc6N/KwA5ZK3Wsm/pfm4CrY7vzegkVxc65SgSn6wYOnwHe9Js9HRQ1YTCKLGPzDtaS3RoLQ==",
+            "version": "7.20.7",
+            "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.7.tgz",
+            "integrity": "sha512-4tGORmfQcrc+bvrjb5y3dG9Mx1IOZjsHqQVUz7XCNHO+iTmqxWnVg3KRygjGmpRLJGdQSKuvFinbIb0CnZwHAQ==",
             "dev": true,
             "requires": {
-                "@babel/compat-data": "^7.20.0",
+                "@babel/compat-data": "^7.20.5",
                 "@babel/helper-validator-option": "^7.18.6",
                 "browserslist": "^4.21.3",
+                "lru-cache": "^5.1.1",
                 "semver": "^6.3.0"
             }
         },
         "@babel/helper-create-class-features-plugin": {
-            "version": "7.20.2",
-            "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.20.2.tgz",
-            "integrity": "sha512-k22GoYRAHPYr9I+Gvy2ZQlAe5mGy8BqWst2wRt8cwIufWTxrsVshhIBvYNqC80N0GSFWTsqRVexOtfzlgOEDvA==",
+            "version": "7.20.12",
+            "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.20.12.tgz",
+            "integrity": "sha512-9OunRkbT0JQcednL0UFvbfXpAsUXiGjUk0a7sN8fUXX7Mue79cUSMjHGDRRi/Vz9vYlpIhLV5fMD5dKoMhhsNQ==",
             "dev": true,
             "requires": {
                 "@babel/helper-annotate-as-pure": "^7.18.6",
                 "@babel/helper-environment-visitor": "^7.18.9",
                 "@babel/helper-function-name": "^7.19.0",
-                "@babel/helper-member-expression-to-functions": "^7.18.9",
+                "@babel/helper-member-expression-to-functions": "^7.20.7",
                 "@babel/helper-optimise-call-expression": "^7.18.6",
-                "@babel/helper-replace-supers": "^7.19.1",
+                "@babel/helper-replace-supers": "^7.20.7",
+                "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0",
                 "@babel/helper-split-export-declaration": "^7.18.6"
             }
         },
         "@babel/helper-create-regexp-features-plugin": {
-            "version": "7.19.0",
-            "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.19.0.tgz",
-            "integrity": "sha512-htnV+mHX32DF81amCDrwIDr8nrp1PTm+3wfBN9/v8QJOLEioOCOG7qNyq0nHeFiWbT3Eb7gsPwEmV64UCQ1jzw==",
+            "version": "7.20.5",
+            "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.20.5.tgz",
+            "integrity": "sha512-m68B1lkg3XDGX5yCvGO0kPx3v9WIYLnzjKfPcQiwntEQa5ZeRkPmo2X/ISJc8qxWGfwUr+kvZAeEzAwLec2r2w==",
             "dev": true,
             "requires": {
                 "@babel/helper-annotate-as-pure": "^7.18.6",
-                "regexpu-core": "^5.1.0"
+                "regexpu-core": "^5.2.1"
             }
         },
         "@babel/helper-define-polyfill-provider": {
@@ -17344,12 +20442,12 @@
             }
         },
         "@babel/helper-member-expression-to-functions": {
-            "version": "7.18.9",
-            "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.18.9.tgz",
-            "integrity": "sha512-RxifAh2ZoVU67PyKIO4AMi1wTenGfMR/O/ae0CCRqwgBAt5v7xjdtRw7UoSbsreKrQn5t7r89eruK/9JjYHuDg==",
+            "version": "7.20.7",
+            "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.20.7.tgz",
+            "integrity": "sha512-9J0CxJLq315fEdi4s7xK5TQaNYjZw+nDVpVqr1axNGKzdrdwYBD5b4uKv3n75aABG0rCCTK8Im8Ww7eYfMrZgw==",
             "dev": true,
             "requires": {
-                "@babel/types": "^7.18.9"
+                "@babel/types": "^7.20.7"
             }
         },
         "@babel/helper-module-imports": {
@@ -17362,9 +20460,9 @@
             }
         },
         "@babel/helper-module-transforms": {
-            "version": "7.20.2",
-            "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.20.2.tgz",
-            "integrity": "sha512-zvBKyJXRbmK07XhMuujYoJ48B5yvvmM6+wcpv6Ivj4Yg6qO7NOZOSnvZN9CRl1zz1Z4cKf8YejmCMh8clOoOeA==",
+            "version": "7.20.11",
+            "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.20.11.tgz",
+            "integrity": "sha512-uRy78kN4psmji1s2QtbtcCSaj/LILFDp0f/ymhpQH5QY3nljUZCaNWz9X1dEj/8MBdBEFECs7yRhKn8i7NjZgg==",
             "dev": true,
             "requires": {
                 "@babel/helper-environment-visitor": "^7.18.9",
@@ -17372,9 +20470,9 @@
                 "@babel/helper-simple-access": "^7.20.2",
                 "@babel/helper-split-export-declaration": "^7.18.6",
                 "@babel/helper-validator-identifier": "^7.19.1",
-                "@babel/template": "^7.18.10",
-                "@babel/traverse": "^7.20.1",
-                "@babel/types": "^7.20.2"
+                "@babel/template": "^7.20.7",
+                "@babel/traverse": "^7.20.10",
+                "@babel/types": "^7.20.7"
             }
         },
         "@babel/helper-optimise-call-expression": {
@@ -17405,16 +20503,17 @@
             }
         },
         "@babel/helper-replace-supers": {
-            "version": "7.19.1",
-            "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.19.1.tgz",
-            "integrity": "sha512-T7ahH7wV0Hfs46SFh5Jz3s0B6+o8g3c+7TMxu7xKfmHikg7EAZ3I2Qk9LFhjxXq8sL7UkP5JflezNwoZa8WvWw==",
+            "version": "7.20.7",
+            "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.20.7.tgz",
+            "integrity": "sha512-vujDMtB6LVfNW13jhlCrp48QNslK6JXi7lQG736HVbHz/mbf4Dc7tIRh1Xf5C0rF7BP8iiSxGMCmY6Ci1ven3A==",
             "dev": true,
             "requires": {
                 "@babel/helper-environment-visitor": "^7.18.9",
-                "@babel/helper-member-expression-to-functions": "^7.18.9",
+                "@babel/helper-member-expression-to-functions": "^7.20.7",
                 "@babel/helper-optimise-call-expression": "^7.18.6",
-                "@babel/traverse": "^7.19.1",
-                "@babel/types": "^7.19.0"
+                "@babel/template": "^7.20.7",
+                "@babel/traverse": "^7.20.7",
+                "@babel/types": "^7.20.7"
             }
         },
         "@babel/helper-simple-access": {
@@ -17463,26 +20562,26 @@
             "dev": true
         },
         "@babel/helper-wrap-function": {
-            "version": "7.19.0",
-            "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.19.0.tgz",
-            "integrity": "sha512-txX8aN8CZyYGTwcLhlk87KRqncAzhh5TpQamZUa0/u3an36NtDpUP6bQgBCBcLeBs09R/OwQu3OjK0k/HwfNDg==",
+            "version": "7.20.5",
+            "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.20.5.tgz",
+            "integrity": "sha512-bYMxIWK5mh+TgXGVqAtnu5Yn1un+v8DDZtqyzKRLUzrh70Eal2O3aZ7aPYiMADO4uKlkzOiRiZ6GX5q3qxvW9Q==",
             "dev": true,
             "requires": {
                 "@babel/helper-function-name": "^7.19.0",
                 "@babel/template": "^7.18.10",
-                "@babel/traverse": "^7.19.0",
-                "@babel/types": "^7.19.0"
+                "@babel/traverse": "^7.20.5",
+                "@babel/types": "^7.20.5"
             }
         },
         "@babel/helpers": {
-            "version": "7.20.1",
-            "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.20.1.tgz",
-            "integrity": "sha512-J77mUVaDTUJFZ5BpP6mMn6OIl3rEWymk2ZxDBQJUG3P+PbmyMcF3bYWvz0ma69Af1oobDqT/iAsvzhB58xhQUg==",
+            "version": "7.20.13",
+            "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.20.13.tgz",
+            "integrity": "sha512-nzJ0DWCL3gB5RCXbUO3KIMMsBY2Eqbx8mBpKGE/02PgyRQFcPQLbkQ1vyy596mZLaP+dAfD+R4ckASzNVmW3jg==",
             "dev": true,
             "requires": {
-                "@babel/template": "^7.18.10",
-                "@babel/traverse": "^7.20.1",
-                "@babel/types": "^7.20.0"
+                "@babel/template": "^7.20.7",
+                "@babel/traverse": "^7.20.13",
+                "@babel/types": "^7.20.7"
             }
         },
         "@babel/highlight": {
@@ -17497,9 +20596,9 @@
             }
         },
         "@babel/parser": {
-            "version": "7.20.3",
-            "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.20.3.tgz",
-            "integrity": "sha512-OP/s5a94frIPXwjzEcv5S/tpQfc6XhxYUnmWpgdqMWGgYCuErA3SzozaRAMQgSZWKeTJxht9aWAkUY+0UzvOFg==",
+            "version": "7.20.15",
+            "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.20.15.tgz",
+            "integrity": "sha512-DI4a1oZuf8wC+oAJA9RW6ga3Zbe8RZFt7kD9i4qAspz3I/yHet1VvC3DiSy/fsUvv5pvJuNPh0LPOdCcqinDPg==",
             "dev": true
         },
         "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": {
@@ -17512,24 +20611,24 @@
             }
         },
         "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": {
-            "version": "7.18.9",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.18.9.tgz",
-            "integrity": "sha512-AHrP9jadvH7qlOj6PINbgSuphjQUAK7AOT7DPjBo9EHoLhQTnnK5u45e1Hd4DbSQEO9nqPWtQ89r+XEOWFScKg==",
+            "version": "7.20.7",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.20.7.tgz",
+            "integrity": "sha512-sbr9+wNE5aXMBBFBICk01tt7sBf2Oc9ikRFEcem/ZORup9IMUdNhW7/wVLEbbtlWOsEubJet46mHAL2C8+2jKQ==",
             "dev": true,
             "requires": {
-                "@babel/helper-plugin-utils": "^7.18.9",
-                "@babel/helper-skip-transparent-expression-wrappers": "^7.18.9",
-                "@babel/plugin-proposal-optional-chaining": "^7.18.9"
+                "@babel/helper-plugin-utils": "^7.20.2",
+                "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0",
+                "@babel/plugin-proposal-optional-chaining": "^7.20.7"
             }
         },
         "@babel/plugin-proposal-async-generator-functions": {
-            "version": "7.20.1",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.20.1.tgz",
-            "integrity": "sha512-Gh5rchzSwE4kC+o/6T8waD0WHEQIsDmjltY8WnWRXHUdH8axZhuH86Ov9M72YhJfDrZseQwuuWaaIT/TmePp3g==",
+            "version": "7.20.7",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.20.7.tgz",
+            "integrity": "sha512-xMbiLsn/8RK7Wq7VeVytytS2L6qE69bXPB10YCmMdDZbKF4okCqY74pI/jJQ/8U0b/F6NrT2+14b8/P9/3AMGA==",
             "dev": true,
             "requires": {
                 "@babel/helper-environment-visitor": "^7.18.9",
-                "@babel/helper-plugin-utils": "^7.19.0",
+                "@babel/helper-plugin-utils": "^7.20.2",
                 "@babel/helper-remap-async-to-generator": "^7.18.9",
                 "@babel/plugin-syntax-async-generators": "^7.8.4"
             }
@@ -17545,13 +20644,13 @@
             }
         },
         "@babel/plugin-proposal-class-static-block": {
-            "version": "7.18.6",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.18.6.tgz",
-            "integrity": "sha512-+I3oIiNxrCpup3Gi8n5IGMwj0gOCAjcJUSQEcotNnCCPMEnixawOQ+KeJPlgfjzx+FKQ1QSyZOWe7wmoJp7vhw==",
+            "version": "7.20.7",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.20.7.tgz",
+            "integrity": "sha512-AveGOoi9DAjUYYuUAG//Ig69GlazLnoyzMw68VCDux+c1tsnnH/OkYcpz/5xzMkEFC6UxjR5Gw1c+iY2wOGVeQ==",
             "dev": true,
             "requires": {
-                "@babel/helper-create-class-features-plugin": "^7.18.6",
-                "@babel/helper-plugin-utils": "^7.18.6",
+                "@babel/helper-create-class-features-plugin": "^7.20.7",
+                "@babel/helper-plugin-utils": "^7.20.2",
                 "@babel/plugin-syntax-class-static-block": "^7.14.5"
             }
         },
@@ -17586,12 +20685,12 @@
             }
         },
         "@babel/plugin-proposal-logical-assignment-operators": {
-            "version": "7.18.9",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.18.9.tgz",
-            "integrity": "sha512-128YbMpjCrP35IOExw2Fq+x55LMP42DzhOhX2aNNIdI9avSWl2PI0yuBWarr3RYpZBSPtabfadkH2yeRiMD61Q==",
+            "version": "7.20.7",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.20.7.tgz",
+            "integrity": "sha512-y7C7cZgpMIjWlKE5T7eJwp+tnRYM89HmRvWM5EQuB5BoHEONjmQ8lSNmBUwOyy/GFRsohJED51YBF79hE1djug==",
             "dev": true,
             "requires": {
-                "@babel/helper-plugin-utils": "^7.18.9",
+                "@babel/helper-plugin-utils": "^7.20.2",
                 "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4"
             }
         },
@@ -17616,16 +20715,16 @@
             }
         },
         "@babel/plugin-proposal-object-rest-spread": {
-            "version": "7.20.2",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.20.2.tgz",
-            "integrity": "sha512-Ks6uej9WFK+fvIMesSqbAto5dD8Dz4VuuFvGJFKgIGSkJuRGcrwGECPA1fDgQK3/DbExBJpEkTeYeB8geIFCSQ==",
+            "version": "7.20.7",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.20.7.tgz",
+            "integrity": "sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg==",
             "dev": true,
             "requires": {
-                "@babel/compat-data": "^7.20.1",
-                "@babel/helper-compilation-targets": "^7.20.0",
+                "@babel/compat-data": "^7.20.5",
+                "@babel/helper-compilation-targets": "^7.20.7",
                 "@babel/helper-plugin-utils": "^7.20.2",
                 "@babel/plugin-syntax-object-rest-spread": "^7.8.3",
-                "@babel/plugin-transform-parameters": "^7.20.1"
+                "@babel/plugin-transform-parameters": "^7.20.7"
             }
         },
         "@babel/plugin-proposal-optional-catch-binding": {
@@ -17639,13 +20738,13 @@
             }
         },
         "@babel/plugin-proposal-optional-chaining": {
-            "version": "7.18.9",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.18.9.tgz",
-            "integrity": "sha512-v5nwt4IqBXihxGsW2QmCWMDS3B3bzGIk/EQVZz2ei7f3NJl8NzAJVvUmpDW5q1CRNY+Beb/k58UAH1Km1N411w==",
+            "version": "7.20.7",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.20.7.tgz",
+            "integrity": "sha512-T+A7b1kfjtRM51ssoOfS1+wbyCVqorfyZhT99TvxxLMirPShD8CzKMRepMlCBGM5RpHMbn8s+5MMHnPstJH6mQ==",
             "dev": true,
             "requires": {
-                "@babel/helper-plugin-utils": "^7.18.9",
-                "@babel/helper-skip-transparent-expression-wrappers": "^7.18.9",
+                "@babel/helper-plugin-utils": "^7.20.2",
+                "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0",
                 "@babel/plugin-syntax-optional-chaining": "^7.8.3"
             }
         },
@@ -17660,14 +20759,14 @@
             }
         },
         "@babel/plugin-proposal-private-property-in-object": {
-            "version": "7.18.6",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.18.6.tgz",
-            "integrity": "sha512-9Rysx7FOctvT5ouj5JODjAFAkgGoudQuLPamZb0v1TGLpapdNaftzifU8NTWQm0IRjqoYypdrSmyWgkocDQ8Dw==",
+            "version": "7.20.5",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.20.5.tgz",
+            "integrity": "sha512-Vq7b9dUA12ByzB4EjQTPo25sFhY+08pQDBSZRtUAkj7lb7jahaHR5igera16QZ+3my1nYR4dKsNdYj5IjPHilQ==",
             "dev": true,
             "requires": {
                 "@babel/helper-annotate-as-pure": "^7.18.6",
-                "@babel/helper-create-class-features-plugin": "^7.18.6",
-                "@babel/helper-plugin-utils": "^7.18.6",
+                "@babel/helper-create-class-features-plugin": "^7.20.5",
+                "@babel/helper-plugin-utils": "^7.20.2",
                 "@babel/plugin-syntax-private-property-in-object": "^7.14.5"
             }
         },
@@ -17844,23 +20943,23 @@
             }
         },
         "@babel/plugin-transform-arrow-functions": {
-            "version": "7.18.6",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.18.6.tgz",
-            "integrity": "sha512-9S9X9RUefzrsHZmKMbDXxweEH+YlE8JJEuat9FdvW9Qh1cw7W64jELCtWNkPBPX5En45uy28KGvA/AySqUh8CQ==",
+            "version": "7.20.7",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.20.7.tgz",
+            "integrity": "sha512-3poA5E7dzDomxj9WXWwuD6A5F3kc7VXwIJO+E+J8qtDtS+pXPAhrgEyh+9GBwBgPq1Z+bB+/JD60lp5jsN7JPQ==",
             "dev": true,
             "requires": {
-                "@babel/helper-plugin-utils": "^7.18.6"
+                "@babel/helper-plugin-utils": "^7.20.2"
             }
         },
         "@babel/plugin-transform-async-to-generator": {
-            "version": "7.18.6",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.18.6.tgz",
-            "integrity": "sha512-ARE5wZLKnTgPW7/1ftQmSi1CmkqqHo2DNmtztFhvgtOWSDfq0Cq9/9L+KnZNYSNrydBekhW3rwShduf59RoXag==",
+            "version": "7.20.7",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.20.7.tgz",
+            "integrity": "sha512-Uo5gwHPT9vgnSXQxqGtpdufUiWp96gk7yiP4Mp5bm1QMkEmLXBO7PAGYbKoJ6DhAwiNkcHFBol/x5zZZkL/t0Q==",
             "dev": true,
             "requires": {
                 "@babel/helper-module-imports": "^7.18.6",
-                "@babel/helper-plugin-utils": "^7.18.6",
-                "@babel/helper-remap-async-to-generator": "^7.18.6"
+                "@babel/helper-plugin-utils": "^7.20.2",
+                "@babel/helper-remap-async-to-generator": "^7.18.9"
             }
         },
         "@babel/plugin-transform-block-scoped-functions": {
@@ -17873,44 +20972,45 @@
             }
         },
         "@babel/plugin-transform-block-scoping": {
-            "version": "7.20.2",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.20.2.tgz",
-            "integrity": "sha512-y5V15+04ry69OV2wULmwhEA6jwSWXO1TwAtIwiPXcvHcoOQUqpyMVd2bDsQJMW8AurjulIyUV8kDqtjSwHy1uQ==",
+            "version": "7.20.15",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.20.15.tgz",
+            "integrity": "sha512-Vv4DMZ6MiNOhu/LdaZsT/bsLRxgL94d269Mv4R/9sp6+Mp++X/JqypZYypJXLlM4mlL352/Egzbzr98iABH1CA==",
             "dev": true,
             "requires": {
                 "@babel/helper-plugin-utils": "^7.20.2"
             }
         },
         "@babel/plugin-transform-classes": {
-            "version": "7.20.2",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.20.2.tgz",
-            "integrity": "sha512-9rbPp0lCVVoagvtEyQKSo5L8oo0nQS/iif+lwlAz29MccX2642vWDlSZK+2T2buxbopotId2ld7zZAzRfz9j1g==",
+            "version": "7.20.7",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.20.7.tgz",
+            "integrity": "sha512-LWYbsiXTPKl+oBlXUGlwNlJZetXD5Am+CyBdqhPsDVjM9Jc8jwBJFrKhHf900Kfk2eZG1y9MAG3UNajol7A4VQ==",
             "dev": true,
             "requires": {
                 "@babel/helper-annotate-as-pure": "^7.18.6",
-                "@babel/helper-compilation-targets": "^7.20.0",
+                "@babel/helper-compilation-targets": "^7.20.7",
                 "@babel/helper-environment-visitor": "^7.18.9",
                 "@babel/helper-function-name": "^7.19.0",
                 "@babel/helper-optimise-call-expression": "^7.18.6",
                 "@babel/helper-plugin-utils": "^7.20.2",
-                "@babel/helper-replace-supers": "^7.19.1",
+                "@babel/helper-replace-supers": "^7.20.7",
                 "@babel/helper-split-export-declaration": "^7.18.6",
                 "globals": "^11.1.0"
             }
         },
         "@babel/plugin-transform-computed-properties": {
-            "version": "7.18.9",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.18.9.tgz",
-            "integrity": "sha512-+i0ZU1bCDymKakLxn5srGHrsAPRELC2WIbzwjLhHW9SIE1cPYkLCL0NlnXMZaM1vhfgA2+M7hySk42VBvrkBRw==",
+            "version": "7.20.7",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.20.7.tgz",
+            "integrity": "sha512-Lz7MvBK6DTjElHAmfu6bfANzKcxpyNPeYBGEafyA6E5HtRpjpZwU+u7Qrgz/2OR0z+5TvKYbPdphfSaAcZBrYQ==",
             "dev": true,
             "requires": {
-                "@babel/helper-plugin-utils": "^7.18.9"
+                "@babel/helper-plugin-utils": "^7.20.2",
+                "@babel/template": "^7.20.7"
             }
         },
         "@babel/plugin-transform-destructuring": {
-            "version": "7.20.2",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.20.2.tgz",
-            "integrity": "sha512-mENM+ZHrvEgxLTBXUiQ621rRXZes3KWUv6NdQlrnr1TkWVw+hUjQBZuP2X32qKlrlG2BzgR95gkuCRSkJl8vIw==",
+            "version": "7.20.7",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.20.7.tgz",
+            "integrity": "sha512-Xwg403sRrZb81IVB79ZPqNQME23yhugYVqgTxAhT99h485F4f+GMELFhhOsscDUB7HCswepKeCKLn/GZvUKoBA==",
             "dev": true,
             "requires": {
                 "@babel/helper-plugin-utils": "^7.20.2"
@@ -17984,35 +21084,35 @@
             }
         },
         "@babel/plugin-transform-modules-amd": {
-            "version": "7.19.6",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.19.6.tgz",
-            "integrity": "sha512-uG3od2mXvAtIFQIh0xrpLH6r5fpSQN04gIVovl+ODLdUMANokxQLZnPBHcjmv3GxRjnqwLuHvppjjcelqUFZvg==",
+            "version": "7.20.11",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.20.11.tgz",
+            "integrity": "sha512-NuzCt5IIYOW0O30UvqktzHYR2ud5bOWbY0yaxWZ6G+aFzOMJvrs5YHNikrbdaT15+KNO31nPOy5Fim3ku6Zb5g==",
             "dev": true,
             "requires": {
-                "@babel/helper-module-transforms": "^7.19.6",
-                "@babel/helper-plugin-utils": "^7.19.0"
+                "@babel/helper-module-transforms": "^7.20.11",
+                "@babel/helper-plugin-utils": "^7.20.2"
             }
         },
         "@babel/plugin-transform-modules-commonjs": {
-            "version": "7.19.6",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.19.6.tgz",
-            "integrity": "sha512-8PIa1ym4XRTKuSsOUXqDG0YaOlEuTVvHMe5JCfgBMOtHvJKw/4NGovEGN33viISshG/rZNVrACiBmPQLvWN8xQ==",
+            "version": "7.20.11",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.20.11.tgz",
+            "integrity": "sha512-S8e1f7WQ7cimJQ51JkAaDrEtohVEitXjgCGAS2N8S31Y42E+kWwfSz83LYz57QdBm7q9diARVqanIaH2oVgQnw==",
             "dev": true,
             "requires": {
-                "@babel/helper-module-transforms": "^7.19.6",
-                "@babel/helper-plugin-utils": "^7.19.0",
-                "@babel/helper-simple-access": "^7.19.4"
+                "@babel/helper-module-transforms": "^7.20.11",
+                "@babel/helper-plugin-utils": "^7.20.2",
+                "@babel/helper-simple-access": "^7.20.2"
             }
         },
         "@babel/plugin-transform-modules-systemjs": {
-            "version": "7.19.6",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.19.6.tgz",
-            "integrity": "sha512-fqGLBepcc3kErfR9R3DnVpURmckXP7gj7bAlrTQyBxrigFqszZCkFkcoxzCp2v32XmwXLvbw+8Yq9/b+QqksjQ==",
+            "version": "7.20.11",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.20.11.tgz",
+            "integrity": "sha512-vVu5g9BPQKSFEmvt2TA4Da5N+QVS66EX21d8uoOihC+OCpUoGvzVsXeqFdtAEfVa5BILAeFt+U7yVmLbQnAJmw==",
             "dev": true,
             "requires": {
                 "@babel/helper-hoist-variables": "^7.18.6",
-                "@babel/helper-module-transforms": "^7.19.6",
-                "@babel/helper-plugin-utils": "^7.19.0",
+                "@babel/helper-module-transforms": "^7.20.11",
+                "@babel/helper-plugin-utils": "^7.20.2",
                 "@babel/helper-validator-identifier": "^7.19.1"
             }
         },
@@ -18027,13 +21127,13 @@
             }
         },
         "@babel/plugin-transform-named-capturing-groups-regex": {
-            "version": "7.19.1",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.19.1.tgz",
-            "integrity": "sha512-oWk9l9WItWBQYS4FgXD4Uyy5kq898lvkXpXQxoJEY1RnvPk4R/Dvu2ebXU9q8lP+rlMwUQTFf2Ok6d78ODa0kw==",
+            "version": "7.20.5",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.20.5.tgz",
+            "integrity": "sha512-mOW4tTzi5iTLnw+78iEq3gr8Aoq4WNRGpmSlrogqaiCBoR1HFhpU4JkpQFOHfeYx3ReVIFWOQJS4aZBRvuZ6mA==",
             "dev": true,
             "requires": {
-                "@babel/helper-create-regexp-features-plugin": "^7.19.0",
-                "@babel/helper-plugin-utils": "^7.19.0"
+                "@babel/helper-create-regexp-features-plugin": "^7.20.5",
+                "@babel/helper-plugin-utils": "^7.20.2"
             }
         },
         "@babel/plugin-transform-new-target": {
@@ -18056,9 +21156,9 @@
             }
         },
         "@babel/plugin-transform-parameters": {
-            "version": "7.20.3",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.20.3.tgz",
-            "integrity": "sha512-oZg/Fpx0YDrj13KsLyO8I/CX3Zdw7z0O9qOd95SqcoIzuqy/WTGWvePeHAnZCN54SfdyjHcb1S30gc8zlzlHcA==",
+            "version": "7.20.7",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.20.7.tgz",
+            "integrity": "sha512-WiWBIkeHKVOSYPO0pWkxGPfKeWrCJyD3NJ53+Lrp/QMSZbsVPovrVl2aWZ19D/LTVnaDv5Ap7GJ/B2CTOZdrfA==",
             "dev": true,
             "requires": {
                 "@babel/helper-plugin-utils": "^7.20.2"
@@ -18074,13 +21174,13 @@
             }
         },
         "@babel/plugin-transform-regenerator": {
-            "version": "7.18.6",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.18.6.tgz",
-            "integrity": "sha512-poqRI2+qiSdeldcz4wTSTXBRryoq3Gc70ye7m7UD5Ww0nE29IXqMl6r7Nd15WBgRd74vloEMlShtH6CKxVzfmQ==",
+            "version": "7.20.5",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.20.5.tgz",
+            "integrity": "sha512-kW/oO7HPBtntbsahzQ0qSE3tFvkFwnbozz3NWFhLGqH75vLEg+sCGngLlhVkePlCs3Jv0dBBHDzCHxNiFAQKCQ==",
             "dev": true,
             "requires": {
-                "@babel/helper-plugin-utils": "^7.18.6",
-                "regenerator-transform": "^0.15.0"
+                "@babel/helper-plugin-utils": "^7.20.2",
+                "regenerator-transform": "^0.15.1"
             }
         },
         "@babel/plugin-transform-reserved-words": {
@@ -18102,13 +21202,13 @@
             }
         },
         "@babel/plugin-transform-spread": {
-            "version": "7.19.0",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.19.0.tgz",
-            "integrity": "sha512-RsuMk7j6n+r752EtzyScnWkQyuJdli6LdO5Klv8Yx0OfPVTcQkIUfS8clx5e9yHXzlnhOZF3CbQ8C2uP5j074w==",
+            "version": "7.20.7",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.20.7.tgz",
+            "integrity": "sha512-ewBbHQ+1U/VnH1fxltbJqDeWBU1oNLG8Dj11uIv3xVf7nrQu0bPGe5Rf716r7K5Qz+SqtAOVswoVunoiBtGhxw==",
             "dev": true,
             "requires": {
-                "@babel/helper-plugin-utils": "^7.19.0",
-                "@babel/helper-skip-transparent-expression-wrappers": "^7.18.9"
+                "@babel/helper-plugin-utils": "^7.20.2",
+                "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0"
             }
         },
         "@babel/plugin-transform-sticky-regex": {
@@ -18253,53 +21353,59 @@
                 "esutils": "^2.0.2"
             }
         },
+        "@babel/regjsgen": {
+            "version": "0.8.0",
+            "resolved": "https://registry.npmjs.org/@babel/regjsgen/-/regjsgen-0.8.0.tgz",
+            "integrity": "sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==",
+            "dev": true
+        },
         "@babel/runtime": {
-            "version": "7.20.1",
-            "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.20.1.tgz",
-            "integrity": "sha512-mrzLkl6U9YLF8qpqI7TB82PESyEGjm/0Ly91jG575eVxMMlb8fYfOXFZIJ8XfLrJZQbm7dlKry2bJmXBUEkdFg==",
+            "version": "7.20.13",
+            "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.20.13.tgz",
+            "integrity": "sha512-gt3PKXs0DBoL9xCvOIIZ2NEqAGZqHjAnmVbfQtB620V0uReIQutpel14KcneZuer7UioY8ALKZ7iocavvzTNFA==",
             "requires": {
-                "regenerator-runtime": "^0.13.10"
+                "regenerator-runtime": "^0.13.11"
             }
         },
         "@babel/standalone": {
-            "version": "7.20.4",
-            "resolved": "https://registry.npmjs.org/@babel/standalone/-/standalone-7.20.4.tgz",
-            "integrity": "sha512-27bv4h47jbaFZ7+e7gT1VEo9PNL1ynxqUX6/BERLz1qxm/5gzpbcHX+47VnSeYHyEyGZkRznpSOd8zPBhiz6tw==",
+            "version": "7.20.15",
+            "resolved": "https://registry.npmjs.org/@babel/standalone/-/standalone-7.20.15.tgz",
+            "integrity": "sha512-B3LmZ1NHlTb2eFEaw8rftZc730Wh9MlmsH8ubb6IjsNoIk9+SQ2aAA0nrm/1806+PftPRAACPClmKTu8PG7Tew==",
             "dev": true
         },
         "@babel/template": {
-            "version": "7.18.10",
-            "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.18.10.tgz",
-            "integrity": "sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA==",
+            "version": "7.20.7",
+            "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.20.7.tgz",
+            "integrity": "sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw==",
             "dev": true,
             "requires": {
                 "@babel/code-frame": "^7.18.6",
-                "@babel/parser": "^7.18.10",
-                "@babel/types": "^7.18.10"
+                "@babel/parser": "^7.20.7",
+                "@babel/types": "^7.20.7"
             }
         },
         "@babel/traverse": {
-            "version": "7.20.1",
-            "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.20.1.tgz",
-            "integrity": "sha512-d3tN8fkVJwFLkHkBN479SOsw4DMZnz8cdbL/gvuDuzy3TS6Nfw80HuQqhw1pITbIruHyh7d1fMA47kWzmcUEGA==",
+            "version": "7.20.13",
+            "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.20.13.tgz",
+            "integrity": "sha512-kMJXfF0T6DIS9E8cgdLCSAL+cuCK+YEZHWiLK0SXpTo8YRj5lpJu3CDNKiIBCne4m9hhTIqUg6SYTAI39tAiVQ==",
             "dev": true,
             "requires": {
                 "@babel/code-frame": "^7.18.6",
-                "@babel/generator": "^7.20.1",
+                "@babel/generator": "^7.20.7",
                 "@babel/helper-environment-visitor": "^7.18.9",
                 "@babel/helper-function-name": "^7.19.0",
                 "@babel/helper-hoist-variables": "^7.18.6",
                 "@babel/helper-split-export-declaration": "^7.18.6",
-                "@babel/parser": "^7.20.1",
-                "@babel/types": "^7.20.0",
+                "@babel/parser": "^7.20.13",
+                "@babel/types": "^7.20.7",
                 "debug": "^4.1.0",
                 "globals": "^11.1.0"
             }
         },
         "@babel/types": {
-            "version": "7.20.2",
-            "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.20.2.tgz",
-            "integrity": "sha512-FnnvsNWgZCr232sqtXggapvlkk/tuwR/qhGzcmxI0GXLCjmPYQPzio2FbdlWuY6y1sHFfQKk+rRbUZ9VStQMog==",
+            "version": "7.20.7",
+            "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.20.7.tgz",
+            "integrity": "sha512-69OnhBxSSgK0OzTJai4kyPDiKTIe3j+ctaHdIGVbRahTLAT7L3R9oeXHC2aVSuGYt3cVnoAMDmOCgJ2yaiLMvg==",
             "dev": true,
             "requires": {
                 "@babel/helper-string-parser": "^7.19.4",
@@ -18326,9 +21432,9 @@
             "optional": true
         },
         "@cypress/request": {
-            "version": "2.88.10",
-            "resolved": "https://registry.npmjs.org/@cypress/request/-/request-2.88.10.tgz",
-            "integrity": "sha512-Zp7F+R93N0yZyG34GutyTNr+okam7s/Fzc1+i3kcqOP8vk6OuajuE9qZJ6Rs+10/1JFtXFYMdyarnU1rZuJesg==",
+            "version": "2.88.11",
+            "resolved": "https://registry.npmjs.org/@cypress/request/-/request-2.88.11.tgz",
+            "integrity": "sha512-M83/wfQ1EkspjkE2lNWNV5ui2Cv7UCv1swW1DqljahbzLVWltcsexQh8jYtuS/vzFXP+HySntGM83ZXA9fn17w==",
             "dev": true,
             "requires": {
                 "aws-sign2": "~0.7.0",
@@ -18344,7 +21450,7 @@
                 "json-stringify-safe": "~5.0.1",
                 "mime-types": "~2.1.19",
                 "performance-now": "^2.1.0",
-                "qs": "~6.5.2",
+                "qs": "~6.10.3",
                 "safe-buffer": "^5.1.2",
                 "tough-cookie": "~2.5.0",
                 "tunnel-agent": "^0.6.0",
@@ -18386,29 +21492,29 @@
             }
         },
         "@esbuild/android-arm": {
-            "version": "0.15.15",
-            "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.15.15.tgz",
-            "integrity": "sha512-JJjZjJi2eBL01QJuWjfCdZxcIgot+VoK6Fq7eKF9w4YHm9hwl7nhBR1o2Wnt/WcANk5l9SkpvrldW1PLuXxcbw==",
+            "version": "0.15.18",
+            "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.15.18.tgz",
+            "integrity": "sha512-5GT+kcs2WVGjVs7+boataCkO5Fg0y4kCjzkB5bAip7H4jfnOS3dA6KPiww9W1OEKTKeAcUVhdZGvgI65OXmUnw==",
             "dev": true,
             "optional": true
         },
         "@esbuild/linux-loong64": {
-            "version": "0.15.15",
-            "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.15.15.tgz",
-            "integrity": "sha512-lhz6UNPMDXUhtXSulw8XlFAtSYO26WmHQnCi2Lg2p+/TMiJKNLtZCYUxV4wG6rZMzXmr8InGpNwk+DLT2Hm0PA==",
+            "version": "0.15.18",
+            "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.15.18.tgz",
+            "integrity": "sha512-L4jVKS82XVhw2nvzLg/19ClLWg0y27ulRwuP7lcyL6AbUWB5aPglXY3M21mauDQMDfRLs8cQmeT03r/+X3cZYQ==",
             "dev": true,
             "optional": true
         },
         "@eslint/eslintrc": {
-            "version": "1.3.3",
-            "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.3.tgz",
-            "integrity": "sha512-uj3pT6Mg+3t39fvLrj8iuCIJ38zKO9FpGtJ4BBJebJhEwjoT+KLVNCcHT5QC9NGRIEi7fZ0ZR8YRb884auB4Lg==",
+            "version": "1.4.1",
+            "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.4.1.tgz",
+            "integrity": "sha512-XXrH9Uarn0stsyldqDYq8r++mROmWRI1xKMXa640Bb//SY1+ECYX6VzT6Lcx5frD0V30XieqJ0oX9I2Xj5aoMA==",
             "dev": true,
             "requires": {
                 "ajv": "^6.12.4",
                 "debug": "^4.3.2",
                 "espree": "^9.4.0",
-                "globals": "^13.15.0",
+                "globals": "^13.19.0",
                 "ignore": "^5.2.0",
                 "import-fresh": "^3.2.1",
                 "js-yaml": "^4.1.0",
@@ -18417,9 +21523,9 @@
             },
             "dependencies": {
                 "globals": {
-                    "version": "13.18.0",
-                    "resolved": "https://registry.npmjs.org/globals/-/globals-13.18.0.tgz",
-                    "integrity": "sha512-/mR4KI8Ps2spmoc0Ulu9L7agOF0du1CZNQ3dke8yItYlyKNmGrkONemBbd6V8UTc1Wgcqn21t3WYB7dbRmh6/A==",
+                    "version": "13.20.0",
+                    "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz",
+                    "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==",
                     "dev": true,
                     "requires": {
                         "type-fest": "^0.20.2"
@@ -18467,9 +21573,9 @@
             }
         },
         "@fortawesome/vue-fontawesome": {
-            "version": "3.0.2",
-            "resolved": "https://registry.npmjs.org/@fortawesome/vue-fontawesome/-/vue-fontawesome-3.0.2.tgz",
-            "integrity": "sha512-xHVtVY8ASUeEvgcA/7vULUesENhD+pi/EirRHdMBqooHlXBqK+yrV6d8tUye1m5UKQKVgYAHMhUBfOnoiwvc8Q==",
+            "version": "3.0.3",
+            "resolved": "https://registry.npmjs.org/@fortawesome/vue-fontawesome/-/vue-fontawesome-3.0.3.tgz",
+            "integrity": "sha512-KCPHi9QemVXGMrfuwf3nNnNo129resAIQWut9QTAMXmXqL2ErABC6ohd2yY5Ipq0CLWNbKHk8TMdTXL/Zf3ZhA==",
             "dev": true
         },
         "@grpc/grpc-js": {
@@ -18482,9 +21588,9 @@
             }
         },
         "@grpc/proto-loader": {
-            "version": "0.7.3",
-            "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.7.3.tgz",
-            "integrity": "sha512-5dAvoZwna2Py3Ef96Ux9jIkp3iZ62TUsV00p3wVBPNX5K178UbNi8Q7gQVqwXT1Yq9RejIGG9G2IPEo93T6RcA==",
+            "version": "0.7.4",
+            "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.7.4.tgz",
+            "integrity": "sha512-MnWjkGwqQ3W8fx94/c1CwqLsNmHHv2t0CFn+9++6+cDphC1lolpg9M2OU0iebIjK//pBNX9e94ho+gjx6vz39w==",
             "requires": {
                 "@types/long": "^4.0.1",
                 "lodash.camelcase": "^4.3.0",
@@ -19120,9 +22226,19 @@
             }
         },
         "@js-joda/core": {
-            "version": "5.4.2",
-            "resolved": "https://registry.npmjs.org/@js-joda/core/-/core-5.4.2.tgz",
-            "integrity": "sha512-QIDIZ9a0NfDStgD47VaTgwiPjlw1p4QPLwjOB/9+/DqIztoQopPNNAd+HdtQMHgE+ibP3dJacd8/TVL/A1RaaA=="
+            "version": "5.5.2",
+            "resolved": "https://registry.npmjs.org/@js-joda/core/-/core-5.5.2.tgz",
+            "integrity": "sha512-retLUN4TwCJ0QJDi9OCJwYVaXAz93NeOkEtEQL98M2bykBOxmURlP0YlfsuE46kItOOVZIWRYC3KsSLhQ1R2Qw=="
+        },
+        "@louislam/ping": {
+            "version": "0.4.2-mod.1",
+            "resolved": "https://registry.npmjs.org/@louislam/ping/-/ping-0.4.2-mod.1.tgz",
+            "integrity": "sha512-KkRDo8qcF9kzzR0Hh8Iqz+XNnzKOdobUquP7UyBYrjxAB1jNT3qO0gvAZeDUknF28LXBPSzkiVlf1NG+tb/iyQ==",
+            "requires": {
+                "command-exists": "~1.2.9",
+                "q": "1.x",
+                "underscore": "^1.12.0"
+            }
         },
         "@louislam/sqlite3": {
             "version": "15.1.2",
@@ -19151,6 +22267,14 @@
                 "tar": "^6.1.11"
             },
             "dependencies": {
+                "lru-cache": {
+                    "version": "6.0.0",
+                    "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+                    "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+                    "requires": {
+                        "yallist": "^4.0.0"
+                    }
+                },
                 "semver": {
                     "version": "7.3.8",
                     "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz",
@@ -19158,6 +22282,11 @@
                     "requires": {
                         "lru-cache": "^6.0.0"
                     }
+                },
+                "yallist": {
+                    "version": "4.0.0",
+                    "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+                    "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
                 }
             }
         },
@@ -19352,6 +22481,48 @@
             "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz",
             "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw=="
         },
+        "@redis/bloom": {
+            "version": "1.1.0",
+            "resolved": "https://registry.npmjs.org/@redis/bloom/-/bloom-1.1.0.tgz",
+            "integrity": "sha512-9QovlxmpRtvxVbN0UBcv8WfdSMudNZZTFqCsnBszcQXqaZb/TVe30ScgGEO7u1EAIacTPAo7/oCYjYAxiHLanQ=="
+        },
+        "@redis/client": {
+            "version": "1.4.2",
+            "resolved": "https://registry.npmjs.org/@redis/client/-/client-1.4.2.tgz",
+            "integrity": "sha512-oUdEjE0I7JS5AyaAjkD3aOXn9NhO7XKyPyXEyrgFDu++VrVBHUPnV6dgEya9TcMuj5nIJRuCzCm8ZP+c9zCHPw==",
+            "requires": {
+                "cluster-key-slot": "1.1.1",
+                "generic-pool": "3.9.0",
+                "yallist": "4.0.0"
+            },
+            "dependencies": {
+                "yallist": {
+                    "version": "4.0.0",
+                    "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+                    "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
+                }
+            }
+        },
+        "@redis/graph": {
+            "version": "1.1.0",
+            "resolved": "https://registry.npmjs.org/@redis/graph/-/graph-1.1.0.tgz",
+            "integrity": "sha512-16yZWngxyXPd+MJxeSr0dqh2AIOi8j9yXKcKCwVaKDbH3HTuETpDVPcLujhFYVPtYrngSco31BUcSa9TH31Gqg=="
+        },
+        "@redis/json": {
+            "version": "1.0.4",
+            "resolved": "https://registry.npmjs.org/@redis/json/-/json-1.0.4.tgz",
+            "integrity": "sha512-LUZE2Gdrhg0Rx7AN+cZkb1e6HjoSKaeeW8rYnt89Tly13GBI5eP4CwDVr+MY8BAYfCg4/N15OUrtLoona9uSgw=="
+        },
+        "@redis/search": {
+            "version": "1.1.0",
+            "resolved": "https://registry.npmjs.org/@redis/search/-/search-1.1.0.tgz",
+            "integrity": "sha512-NyFZEVnxIJEybpy+YskjgOJRNsfTYqaPbK/Buv6W2kmFNaRk85JiqjJZA5QkRmWvGbyQYwoO5QfDi2wHskKrQQ=="
+        },
+        "@redis/time-series": {
+            "version": "1.0.4",
+            "resolved": "https://registry.npmjs.org/@redis/time-series/-/time-series-1.0.4.tgz",
+            "integrity": "sha512-ThUIgo2U/g7cCuZavucQTQzA9g9JbDDY2f64u3AbAoz/8vE2lt2U37LamDUVChhaDA3IRT9R6VvJwqnUfTJzng=="
+        },
         "@sideway/address": {
             "version": "4.1.4",
             "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.4.tgz",
@@ -19362,9 +22533,9 @@
             }
         },
         "@sideway/formula": {
-            "version": "3.0.0",
-            "resolved": "https://registry.npmjs.org/@sideway/formula/-/formula-3.0.0.tgz",
-            "integrity": "sha512-vHe7wZ4NOXVfkoRb8T5otiENVlT7a3IAiw7H5M2+GO+9CDgcVUUsX1zalAztCmwyOr2RUTGJdgB+ZvSVqmdHmg==",
+            "version": "3.0.1",
+            "resolved": "https://registry.npmjs.org/@sideway/formula/-/formula-3.0.1.tgz",
+            "integrity": "sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg==",
             "dev": true
         },
         "@sideway/pinpoint": {
@@ -19373,10 +22544,15 @@
             "integrity": "sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==",
             "dev": true
         },
+        "@sindresorhus/is": {
+            "version": "5.3.0",
+            "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-5.3.0.tgz",
+            "integrity": "sha512-CX6t4SYQ37lzxicAqsBtxA3OseeoVrh9cSJ5PFYam0GksYlupRfy1A+Q4aYD3zvcfECLc0zO2u+ZnR2UYKvCrw=="
+        },
         "@sinonjs/commons": {
-            "version": "1.8.5",
-            "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.5.tgz",
-            "integrity": "sha512-rTpCA0wG1wUxglBSFdMMY0oTrKYvgf4fNgv/sXbfCVAdf+FnPBdKJR/7XbpTCwbCrvCbdPYnlWaUUYz4V2fPDA==",
+            "version": "1.8.6",
+            "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.6.tgz",
+            "integrity": "sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ==",
             "dev": true,
             "requires": {
                 "type-detect": "4.0.8"
@@ -19396,6 +22572,14 @@
             "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.0.tgz",
             "integrity": "sha512-+9jVqKhRSpsc591z5vX+X5Yyw+he/HCB4iQ/RYxw35CEPaY1gnsNE43nf9n9AaYjAQrTiI/mOwKUKdUs9vf7Xg=="
         },
+        "@szmarczak/http-timer": {
+            "version": "5.0.1",
+            "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-5.0.1.tgz",
+            "integrity": "sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==",
+            "requires": {
+                "defer-to-connect": "^2.0.1"
+            }
+        },
         "@tediousjs/connection-string": {
             "version": "0.3.0",
             "resolved": "https://registry.npmjs.org/@tediousjs/connection-string/-/connection-string-0.3.0.tgz",
@@ -19415,13 +22599,13 @@
             }
         },
         "@types/babel__core": {
-            "version": "7.1.20",
-            "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.20.tgz",
-            "integrity": "sha512-PVb6Bg2QuscZ30FvOU7z4guG6c926D9YRvOxEaelzndpMsvP+YM74Q/dAFASpg2l6+XLalxSGxcq/lrgYWZtyQ==",
+            "version": "7.20.0",
+            "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.0.tgz",
+            "integrity": "sha512-+n8dL/9GWblDO0iU6eZAwEIJVr5DWigtle+Q6HLOrh/pdbXOhOtqzq8VPPE2zvNJzSKY4vH/z3iT3tn0A3ypiQ==",
             "dev": true,
             "requires": {
-                "@babel/parser": "^7.1.0",
-                "@babel/types": "^7.0.0",
+                "@babel/parser": "^7.20.7",
+                "@babel/types": "^7.20.7",
                 "@types/babel__generator": "*",
                 "@types/babel__template": "*",
                 "@types/babel__traverse": "*"
@@ -19447,9 +22631,9 @@
             }
         },
         "@types/babel__traverse": {
-            "version": "7.18.2",
-            "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.18.2.tgz",
-            "integrity": "sha512-FcFaxOr2V5KZCviw1TnutEMVUVsGt4D2hP1TAfXZAMKuHYW3xQhe3jTxNPWutgCJ3/X1c5yX8ZoGVEItxKbwBg==",
+            "version": "7.18.3",
+            "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.18.3.tgz",
+            "integrity": "sha512-1kbcJ40lLB7MHsj39U4Sh1uTd2E7rLEa79kmDpI6cy+XiXsteB3POdQomoq4FxszMrO3ZYchkhYJw7A2862b3w==",
             "dev": true,
             "requires": {
                 "@babel/types": "^7.3.0"
@@ -19503,9 +22687,12 @@
             }
         },
         "@types/cors": {
-            "version": "2.8.12",
-            "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.12.tgz",
-            "integrity": "sha512-vt+kDhq/M2ayberEtJcIN/hxXy1Pk+59g2FV/ZQceeaTyCtCucjL2Q7FXlFjtWn4n15KCr1NE2lNNFhp0lEThw=="
+            "version": "2.8.13",
+            "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.13.tgz",
+            "integrity": "sha512-RG8AStHlUiV5ysZQKq97copd2UmVYw3/pRMLefISZ3S1hK104Cwm7iLQ3fTKx+lsUH2CE8FlLaYeEA2LSeqYUA==",
+            "requires": {
+                "@types/node": "*"
+            }
         },
         "@types/es-aggregate-error": {
             "version": "1.0.2",
@@ -19516,20 +22703,20 @@
             }
         },
         "@types/express": {
-            "version": "4.17.14",
-            "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.14.tgz",
-            "integrity": "sha512-TEbt+vaPFQ+xpxFLFssxUDXj5cWCxZJjIcB7Yg0k0GMHGtgtQgpvx/MUQUeAkNbA9AAGrwkAsoeItdTgS7FMyg==",
+            "version": "4.17.17",
+            "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.17.tgz",
+            "integrity": "sha512-Q4FmmuLGBG58btUnfS1c1r/NQdlp3DMfGDGig8WhfpA2YRUtEkxAjkZb0yvplJGYdF1fsQ81iMDcH24sSCNC/Q==",
             "requires": {
                 "@types/body-parser": "*",
-                "@types/express-serve-static-core": "^4.17.18",
+                "@types/express-serve-static-core": "^4.17.33",
                 "@types/qs": "*",
                 "@types/serve-static": "*"
             }
         },
         "@types/express-serve-static-core": {
-            "version": "4.17.31",
-            "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.31.tgz",
-            "integrity": "sha512-DxMhY+NAsTwMMFHBTtJFNp5qiHKJ7TeqOo23zVEM9alT1Ml27Q3xcTH0xwxn7Q0BbMcVEJOs/7aQtUWupUQN3Q==",
+            "version": "4.17.33",
+            "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.33.tgz",
+            "integrity": "sha512-TPBqmR/HRYI3eC2E5hmiivIzv+bidAfXofM+sbonAGvyDhySGw9/PQZFt2BLOrjUUR++4eJVpx6KnLQK1Fk9tA==",
             "requires": {
                 "@types/node": "*",
                 "@types/qs": "*",
@@ -19537,9 +22724,9 @@
             }
         },
         "@types/graceful-fs": {
-            "version": "4.1.5",
-            "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.5.tgz",
-            "integrity": "sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw==",
+            "version": "4.1.6",
+            "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.6.tgz",
+            "integrity": "sha512-Sig0SNORX9fdW+bQuTEovKj3uHcUL6LQKbCrrqb1X7J6/ReAbhCXRAhc+SMejhLELFj2QcyuxmUooZ4bt5ReSw==",
             "dev": true,
             "requires": {
                 "@types/node": "*"
@@ -19550,6 +22737,11 @@
             "resolved": "https://registry.npmjs.org/@types/http-assert/-/http-assert-1.5.3.tgz",
             "integrity": "sha512-FyAOrDuQmBi8/or3ns4rwPno7/9tJTijVW6aQQjK02+kOQ8zmoNg2XJtAuQhvQcy1ASJq38wirX5//9J1EqoUA=="
         },
+        "@types/http-cache-semantics": {
+            "version": "4.0.1",
+            "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.1.tgz",
+            "integrity": "sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ=="
+        },
         "@types/http-errors": {
             "version": "2.0.1",
             "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.1.tgz",
@@ -19608,9 +22800,9 @@
             }
         },
         "@types/lodash": {
-            "version": "4.14.190",
-            "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.190.tgz",
-            "integrity": "sha512-5iJ3FBJBvQHQ8sFhEhJfjUP+G+LalhavTkYyrAYqz5MEJG+erSv0k9KJLb6q7++17Lafk1scaTIFXcMJlwK8Mw=="
+            "version": "4.14.191",
+            "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.191.tgz",
+            "integrity": "sha512-BdZ5BCCvho3EIXw6wUCXHe7rS53AIDPLE+JzwgT+OsJk53oBfbSmZZ7CX4VaRoN78N+TJpFi9QPlfIVNmJYWxQ=="
         },
         "@types/long": {
             "version": "4.0.2",
@@ -19629,9 +22821,9 @@
             "dev": true
         },
         "@types/node": {
-            "version": "18.11.9",
-            "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.9.tgz",
-            "integrity": "sha512-CRpX21/kGdzjOpFsZSkcrXMGIBWMGNIHXXBVFSH+ggkftxg+XYP20TESbh+zFvFj3EQOl5byk0HTRn1IL6hbqg=="
+            "version": "18.13.0",
+            "resolved": "https://registry.npmjs.org/@types/node/-/node-18.13.0.tgz",
+            "integrity": "sha512-gC3TazRzGoOnoKAhUx+Q0t8S9Tzs74z7m0ipwGpSqQrleP14hKxP4/JUeEQcD3W1/aIpnWl8pHowI7WokuZpXg=="
         },
         "@types/normalize-package-data": {
             "version": "2.4.1",
@@ -19646,9 +22838,9 @@
             "dev": true
         },
         "@types/prettier": {
-            "version": "2.7.1",
-            "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.1.tgz",
-            "integrity": "sha512-ri0UmynRRvZiiUJdiz38MmIblKK+oH30MztdBVR95dv/Ubw6neWSb8u1XpRb72L4qsZOhz+L+z9JD40SJmfWow==",
+            "version": "2.7.2",
+            "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.2.tgz",
+            "integrity": "sha512-KufADq8uQqo1pYKVIYzfKbJfBAc0sOeXqGbFaSpv8MRmC/zXgowNZmFcbngndGk922QDmOASEXUZCaY48gs4cg==",
             "dev": true
         },
         "@types/qs": {
@@ -19688,10 +22880,24 @@
             "integrity": "sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==",
             "dev": true
         },
+        "@types/webidl-conversions": {
+            "version": "7.0.0",
+            "resolved": "https://registry.npmjs.org/@types/webidl-conversions/-/webidl-conversions-7.0.0.tgz",
+            "integrity": "sha512-xTE1E+YF4aWPJJeUzaZI5DRntlkY3+BCVJi0axFptnjGmAoWxkyREIh/XMrfxVLejwQxMCfDXdICo0VLxThrog=="
+        },
+        "@types/whatwg-url": {
+            "version": "8.2.2",
+            "resolved": "https://registry.npmjs.org/@types/whatwg-url/-/whatwg-url-8.2.2.tgz",
+            "integrity": "sha512-FtQu10RWgn3D9U4aazdwIE2yzphmTJREDqNdODHrbrZmmMqI0vMheC/6NE/J1Yveaj8H+ela+YwWTjq5PGmuhA==",
+            "requires": {
+                "@types/node": "*",
+                "@types/webidl-conversions": "*"
+            }
+        },
         "@types/yargs": {
-            "version": "16.0.4",
-            "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.4.tgz",
-            "integrity": "sha512-T8Yc9wt/5LbJyCaLiHPReJa0kApcIgJ7Bn735GjItUfh08Z1pJvu8QZqb9s+mMvKV6WUQRV7K2R46YbjMXTTJw==",
+            "version": "16.0.5",
+            "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.5.tgz",
+            "integrity": "sha512-AxO/ADJOBFJScHbWhq2xAhlWP24rY4aCEG/NFaMvbT3X2MgRsLjhjQwsn0Zi5zn0LG9jUhCCZMeX9Dkuw6k+vQ==",
             "dev": true,
             "requires": {
                 "@types/yargs-parser": "*"
@@ -19733,39 +22939,39 @@
             "dev": true
         },
         "@vue/compiler-core": {
-            "version": "3.2.45",
-            "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.2.45.tgz",
-            "integrity": "sha512-rcMj7H+PYe5wBV3iYeUgbCglC+pbpN8hBLTJvRiK2eKQiWqu+fG9F+8sW99JdL4LQi7Re178UOxn09puSXvn4A==",
+            "version": "3.2.47",
+            "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.2.47.tgz",
+            "integrity": "sha512-p4D7FDnQb7+YJmO2iPEv0SQNeNzcbHdGByJDsT4lynf63AFkOTFN07HsiRSvjGo0QrxR/o3d0hUyNCUnBU2Tig==",
             "dev": true,
             "requires": {
                 "@babel/parser": "^7.16.4",
-                "@vue/shared": "3.2.45",
+                "@vue/shared": "3.2.47",
                 "estree-walker": "^2.0.2",
                 "source-map": "^0.6.1"
             }
         },
         "@vue/compiler-dom": {
-            "version": "3.2.45",
-            "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.2.45.tgz",
-            "integrity": "sha512-tyYeUEuKqqZO137WrZkpwfPCdiiIeXYCcJ8L4gWz9vqaxzIQRccTSwSWZ/Axx5YR2z+LvpUbmPNXxuBU45lyRw==",
+            "version": "3.2.47",
+            "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.2.47.tgz",
+            "integrity": "sha512-dBBnEHEPoftUiS03a4ggEig74J2YBZ2UIeyfpcRM2tavgMWo4bsEfgCGsu+uJIL/vax9S+JztH8NmQerUo7shQ==",
             "dev": true,
             "requires": {
-                "@vue/compiler-core": "3.2.45",
-                "@vue/shared": "3.2.45"
+                "@vue/compiler-core": "3.2.47",
+                "@vue/shared": "3.2.47"
             }
         },
         "@vue/compiler-sfc": {
-            "version": "3.2.45",
-            "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.2.45.tgz",
-            "integrity": "sha512-1jXDuWah1ggsnSAOGsec8cFjT/K6TMZ0sPL3o3d84Ft2AYZi2jWJgRMjw4iaK0rBfA89L5gw427H4n1RZQBu6Q==",
+            "version": "3.2.47",
+            "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.2.47.tgz",
+            "integrity": "sha512-rog05W+2IFfxjMcFw10tM9+f7i/+FFpZJJ5XHX72NP9eC2uRD+42M3pYcQqDXVYoj74kHMSEdQ/WmCjt8JFksQ==",
             "dev": true,
             "requires": {
                 "@babel/parser": "^7.16.4",
-                "@vue/compiler-core": "3.2.45",
-                "@vue/compiler-dom": "3.2.45",
-                "@vue/compiler-ssr": "3.2.45",
-                "@vue/reactivity-transform": "3.2.45",
-                "@vue/shared": "3.2.45",
+                "@vue/compiler-core": "3.2.47",
+                "@vue/compiler-dom": "3.2.47",
+                "@vue/compiler-ssr": "3.2.47",
+                "@vue/reactivity-transform": "3.2.47",
+                "@vue/shared": "3.2.47",
                 "estree-walker": "^2.0.2",
                 "magic-string": "^0.25.7",
                 "postcss": "^8.1.10",
@@ -19784,19 +22990,19 @@
             }
         },
         "@vue/compiler-ssr": {
-            "version": "3.2.45",
-            "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.2.45.tgz",
-            "integrity": "sha512-6BRaggEGqhWht3lt24CrIbQSRD5O07MTmd+LjAn5fJj568+R9eUD2F7wMQJjX859seSlrYog7sUtrZSd7feqrQ==",
+            "version": "3.2.47",
+            "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.2.47.tgz",
+            "integrity": "sha512-wVXC+gszhulcMD8wpxMsqSOpvDZ6xKXSVWkf50Guf/S+28hTAXPDYRTbLQ3EDkOP5Xz/+SY37YiwDquKbJOgZw==",
             "dev": true,
             "requires": {
-                "@vue/compiler-dom": "3.2.45",
-                "@vue/shared": "3.2.45"
+                "@vue/compiler-dom": "3.2.47",
+                "@vue/shared": "3.2.47"
             }
         },
         "@vue/devtools-api": {
-            "version": "6.4.5",
-            "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-6.4.5.tgz",
-            "integrity": "sha512-JD5fcdIuFxU4fQyXUu3w2KpAJHzTVdN+p4iOX2lMWSHMOoQdMAcpFLZzm9Z/2nmsoZ1a96QEhZ26e50xLBsgOQ==",
+            "version": "6.5.0",
+            "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-6.5.0.tgz",
+            "integrity": "sha512-o9KfBeaBmCKl10usN4crU53fYtC1r7jJwdGKjPT24t348rHxgfpZ0xL3Xm/gLUYnc0oTp8LAmrxOeLyu6tbk2Q==",
             "dev": true
         },
         "@vue/reactivity": {
@@ -19817,14 +23023,14 @@
             }
         },
         "@vue/reactivity-transform": {
-            "version": "3.2.45",
-            "resolved": "https://registry.npmjs.org/@vue/reactivity-transform/-/reactivity-transform-3.2.45.tgz",
-            "integrity": "sha512-BHVmzYAvM7vcU5WmuYqXpwaBHjsS8T63jlKGWVtHxAHIoMIlmaMyurUSEs1Zcg46M4AYT5MtB1U274/2aNzjJQ==",
+            "version": "3.2.47",
+            "resolved": "https://registry.npmjs.org/@vue/reactivity-transform/-/reactivity-transform-3.2.47.tgz",
+            "integrity": "sha512-m8lGXw8rdnPVVIdIFhf0LeQ/ixyHkH5plYuS83yop5n7ggVJU+z5v0zecwEnX7fa7HNLBhh2qngJJkxpwEEmYA==",
             "dev": true,
             "requires": {
                 "@babel/parser": "^7.16.4",
-                "@vue/compiler-core": "3.2.45",
-                "@vue/shared": "3.2.45",
+                "@vue/compiler-core": "3.2.47",
+                "@vue/shared": "3.2.47",
                 "estree-walker": "^2.0.2",
                 "magic-string": "^0.25.7"
             },
@@ -19928,9 +23134,9 @@
             }
         },
         "@vue/shared": {
-            "version": "3.2.45",
-            "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.2.45.tgz",
-            "integrity": "sha512-Ewzq5Yhimg7pSztDV+RH1UDKBzmtqieXQlpTVm2AwraoRL/Rks96mvd8Vgi7Lj+h+TH8dv7mXD3FRZR3TUvbSg==",
+            "version": "3.2.47",
+            "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.2.47.tgz",
+            "integrity": "sha512-BHGyyGN3Q97EZx0taMQ+OLNuZcW3d37ZEVmEAyeoA9ERdGvm9Irc/0Fua8SNyOtV1w6BS4q25wbMzJujO9HIfQ==",
             "dev": true
         },
         "@vuepic/vue-datepicker": {
@@ -19963,9 +23169,9 @@
             }
         },
         "acorn": {
-            "version": "8.8.1",
-            "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.1.tgz",
-            "integrity": "sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA==",
+            "version": "8.8.2",
+            "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz",
+            "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==",
             "dev": true
         },
         "acorn-globals": {
@@ -20083,6 +23289,11 @@
                 "uri-js": "^4.2.2"
             }
         },
+        "amdefine": {
+            "version": "1.0.1",
+            "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz",
+            "integrity": "sha512-S2Hw0TtNkMJhIabBwIojKL9YHO5T0n5eNqWJ7Lrlel/zDbftQpxpapi8tZs3X1HWa+u+QeydGmzzNU0m09+Rcg=="
+        },
         "anafanafo": {
             "version": "2.0.0",
             "resolved": "https://registry.npmjs.org/anafanafo/-/anafanafo-2.0.0.tgz",
@@ -20120,6 +23331,11 @@
                 "color-convert": "^1.9.0"
             }
         },
+        "any-promise": {
+            "version": "1.3.0",
+            "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz",
+            "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A=="
+        },
         "anymatch": {
             "version": "3.1.3",
             "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz",
@@ -20216,6 +23432,11 @@
             "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==",
             "dev": true
         },
+        "available-typed-arrays": {
+            "version": "1.0.5",
+            "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz",
+            "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw=="
+        },
         "await-lock": {
             "version": "2.2.2",
             "resolved": "https://registry.npmjs.org/await-lock/-/await-lock-2.2.2.tgz",
@@ -20228,9 +23449,9 @@
             "devOptional": true
         },
         "aws4": {
-            "version": "1.11.0",
-            "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz",
-            "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==",
+            "version": "1.12.0",
+            "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.12.0.tgz",
+            "integrity": "sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg==",
             "devOptional": true
         },
         "axios": {
@@ -20463,6 +23684,32 @@
             "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
             "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="
         },
+        "barse": {
+            "version": "0.4.3",
+            "resolved": "https://registry.npmjs.org/barse/-/barse-0.4.3.tgz",
+            "integrity": "sha512-UEpvriJqAn8zuVinYICuKoPttZy3XxXEoqX/V2uYAL4zzJRuNzCK3+20nAu3YUIa2U7G53kf90wfBIp9/A+Odw==",
+            "requires": {
+                "readable-stream": "~1.0.2"
+            },
+            "dependencies": {
+                "readable-stream": {
+                    "version": "1.0.34",
+                    "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz",
+                    "integrity": "sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==",
+                    "requires": {
+                        "core-util-is": "~1.0.0",
+                        "inherits": "~2.0.1",
+                        "isarray": "0.0.1",
+                        "string_decoder": "~0.10.x"
+                    }
+                },
+                "string_decoder": {
+                    "version": "0.10.31",
+                    "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
+                    "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ=="
+                }
+            }
+        },
         "base64-js": {
             "version": "1.5.1",
             "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz",
@@ -20605,6 +23852,12 @@
             "integrity": "sha512-fcQztozJ8jToQWXxVuEyXWW+dSo8AiXWKwiSSrKWsRB/Qt+Ewwza+JWoLKiTuQLaEPhdNAJ7+Dosc9DOIqNy7Q==",
             "dev": true
         },
+        "bowser": {
+            "version": "2.11.0",
+            "resolved": "https://registry.npmjs.org/bowser/-/bowser-2.11.0.tgz",
+            "integrity": "sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA==",
+            "optional": true
+        },
         "brace-expansion": {
             "version": "1.1.11",
             "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
@@ -20648,15 +23901,15 @@
             "dev": true
         },
         "browserslist": {
-            "version": "4.21.4",
-            "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.4.tgz",
-            "integrity": "sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw==",
+            "version": "4.21.5",
+            "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.5.tgz",
+            "integrity": "sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w==",
             "dev": true,
             "requires": {
-                "caniuse-lite": "^1.0.30001400",
-                "electron-to-chromium": "^1.4.251",
-                "node-releases": "^2.0.6",
-                "update-browserslist-db": "^1.0.9"
+                "caniuse-lite": "^1.0.30001449",
+                "electron-to-chromium": "^1.4.284",
+                "node-releases": "^2.0.8",
+                "update-browserslist-db": "^1.0.10"
             }
         },
         "bser": {
@@ -20668,6 +23921,14 @@
                 "node-int64": "^0.4.0"
             }
         },
+        "bson": {
+            "version": "4.7.2",
+            "resolved": "https://registry.npmjs.org/bson/-/bson-4.7.2.tgz",
+            "integrity": "sha512-Ry9wCtIZ5kGqkJoi6aD8KjxFZEx78guTQDnpXWiNthsxzrxAK/i8E6pCHAIZTbaEFWcOCvbecMukfK7XUvyLpQ==",
+            "requires": {
+                "buffer": "^5.6.0"
+            }
+        },
         "buffer": {
             "version": "5.7.1",
             "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz",
@@ -20698,6 +23959,13 @@
             "resolved": "https://registry.npmjs.org/buffer-writer/-/buffer-writer-2.0.0.tgz",
             "integrity": "sha512-a7ZpuTZU1TRtnwyCNW3I5dc0wWNC3VR9S++Ewyk2HHZdrO3CQJqSpd+95Us590V6AL7JqUAH2IwZ/398PmNFgw=="
         },
+        "buildcheck": {
+            "version": "0.0.3",
+            "resolved": "https://registry.npmjs.org/buildcheck/-/buildcheck-0.0.3.tgz",
+            "integrity": "sha512-pziaA+p/wdVImfcbsZLNF32EiWyujlQLwolMqUQE8xpKNOH7KmZQaY8sXN7DGOEzPAElo9QTaeNRfGnf3iOJbA==",
+            "dev": true,
+            "optional": true
+        },
         "bulk-write-stream": {
             "version": "2.0.1",
             "resolved": "https://registry.npmjs.org/bulk-write-stream/-/bulk-write-stream-2.0.1.tgz",
@@ -20718,6 +23986,27 @@
             "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-6.0.4.tgz",
             "integrity": "sha512-mbcDEZCkv2CZF4G01kr8eBd/5agkt9oCqz75tJMSIsquvRZ2sL6Hi5zGVKi/0OSC9oO1GHfJ2AV0ZIOY9vye0A=="
         },
+        "cacheable-request": {
+            "version": "10.2.7",
+            "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-10.2.7.tgz",
+            "integrity": "sha512-I4SA6mKgDxcxVbSt/UmIkb9Ny8qSkg6ReBHtAAXnZHk7KOSx5g3DTiAOaYzcHCs6oOdHn+bip9T48E6tMvK9hw==",
+            "requires": {
+                "@types/http-cache-semantics": "^4.0.1",
+                "get-stream": "^6.0.1",
+                "http-cache-semantics": "^4.1.1",
+                "keyv": "^4.5.2",
+                "mimic-response": "^4.0.0",
+                "normalize-url": "^8.0.0",
+                "responselike": "^3.0.0"
+            },
+            "dependencies": {
+                "get-stream": {
+                    "version": "6.0.1",
+                    "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz",
+                    "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg=="
+                }
+            }
+        },
         "cachedir": {
             "version": "2.3.0",
             "resolved": "https://registry.npmjs.org/cachedir/-/cachedir-2.3.0.tgz",
@@ -20754,12 +24043,20 @@
                 "camelcase": "^5.3.1",
                 "map-obj": "^4.0.0",
                 "quick-lru": "^4.0.1"
+            },
+            "dependencies": {
+                "quick-lru": {
+                    "version": "4.0.1",
+                    "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz",
+                    "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==",
+                    "dev": true
+                }
             }
         },
         "caniuse-lite": {
-            "version": "1.0.30001434",
-            "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001434.tgz",
-            "integrity": "sha512-aOBHrLmTQw//WFa2rcF1If9fa3ypkC1wzqqiKHgfdrXTWcU8C4gKVZT77eQAPWN1APys3+uQ0Df07rKauXGEYA==",
+            "version": "1.0.30001451",
+            "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001451.tgz",
+            "integrity": "sha512-XY7UbUpGRatZzoRft//5xOa69/1iGJRBlrieH6QYrkKLIFn3m7OVEJ81dSrKoy2BnKsdbX5cLrOispZNYo9v2w==",
             "dev": true
         },
         "caseless": {
@@ -20886,9 +24183,9 @@
             "integrity": "sha512-U9eDw6+wt7V8z5NncY2jJfZa+hUH8XEj8FQHgFJTrUFnJfXYf4Ml4adI2vXZOjqRDpFWtYVWypDfZwnJ+HIR4A=="
         },
         "ci-info": {
-            "version": "3.7.0",
-            "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.7.0.tgz",
-            "integrity": "sha512-2CpRNYmImPx+RXKLq6jko/L07phmS9I02TyqkcNU20GCF/GgaWvc58hPtjxDX8lPpkdwc9sNh72V9k00S7ezog==",
+            "version": "3.7.1",
+            "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.7.1.tgz",
+            "integrity": "sha512-4jYS4MOAaCIStSRwiuxc4B8MYhIe676yO1sYGzARnjXkWpmzZMMYxY6zu8WYWDhSuth5zhrQ1rhNSibyyvv4/w==",
             "dev": true
         },
         "cjs-module-lexer": {
@@ -20951,6 +24248,11 @@
                 "is-regexp": "^2.0.0"
             }
         },
+        "cluster-key-slot": {
+            "version": "1.1.1",
+            "resolved": "https://registry.npmjs.org/cluster-key-slot/-/cluster-key-slot-1.1.1.tgz",
+            "integrity": "sha512-rwHwUfXL40Chm1r08yrhU3qpUvdVlgkKNeyeGPOxnW8/SyVDvgRaed/Uz54AqWNaTCAThlj6QAs3TZcKI0xDEw=="
+        },
         "co": {
             "version": "4.6.0",
             "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz",
@@ -20998,8 +24300,7 @@
         "colorette": {
             "version": "2.0.19",
             "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.19.tgz",
-            "integrity": "sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==",
-            "dev": true
+            "integrity": "sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ=="
         },
         "combine-errors": {
             "version": "3.0.3",
@@ -21093,6 +24394,25 @@
                 }
             }
         },
+        "compressjs": {
+            "version": "1.0.3",
+            "resolved": "https://registry.npmjs.org/compressjs/-/compressjs-1.0.3.tgz",
+            "integrity": "sha512-jpKJjBTretQACTGLNuvnozP1JdP2ZLrjdGdBgk/tz1VfXlUcBhhSZW6vEsuThmeot/yjvSrPQKEgfF3X2Lpi8Q==",
+            "requires": {
+                "amdefine": "~1.0.0",
+                "commander": "~2.8.1"
+            },
+            "dependencies": {
+                "commander": {
+                    "version": "2.8.1",
+                    "resolved": "https://registry.npmjs.org/commander/-/commander-2.8.1.tgz",
+                    "integrity": "sha512-+pJLBFVk+9ZZdlAOB5WuIElVPPth47hILFkmGym57aq8kwxsowvByvB0DHs1vQAhyMZzdcpTtF0VDKGkSDR4ZQ==",
+                    "requires": {
+                        "graceful-readlink": ">= 1.0.0"
+                    }
+                }
+            }
+        },
         "concat-map": {
             "version": "0.0.1",
             "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
@@ -21241,9 +24561,9 @@
             }
         },
         "content-type": {
-            "version": "1.0.4",
-            "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz",
-            "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA=="
+            "version": "1.0.5",
+            "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz",
+            "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA=="
         },
         "convert-source-map": {
             "version": "1.9.0",
@@ -21268,9 +24588,9 @@
             "dev": true
         },
         "core-js-compat": {
-            "version": "3.26.1",
-            "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.26.1.tgz",
-            "integrity": "sha512-622/KzTudvXCDLRw70iHW4KKs1aGpcRcowGWyYJr2DEBfRrd6hNJybxSWJFuZYD4ma86xhrwDDHxmDaIq4EA8A==",
+            "version": "3.27.2",
+            "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.27.2.tgz",
+            "integrity": "sha512-welaYuF7ZtbYKGrIy7y3eb40d37rG1FvzEOfe7hSLd2iD6duMDqUhRfSvCGyC46HhR6Y8JXXdZ2lnRUMkPBpvg==",
             "dev": true,
             "requires": {
                 "browserslist": "^4.21.4"
@@ -21279,8 +24599,7 @@
         "core-util-is": {
             "version": "1.0.2",
             "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
-            "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==",
-            "devOptional": true
+            "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ=="
         },
         "cors": {
             "version": "2.8.5",
@@ -21304,6 +24623,17 @@
                 "yaml": "^1.10.0"
             }
         },
+        "cpu-features": {
+            "version": "0.0.4",
+            "resolved": "https://registry.npmjs.org/cpu-features/-/cpu-features-0.0.4.tgz",
+            "integrity": "sha512-fKiZ/zp1mUwQbnzb9IghXtHtDoTMtNeb8oYGx6kX2SYfhnG0HNdBEBIzB9b5KlXu5DQPhfy3mInbBxFcgwAr3A==",
+            "dev": true,
+            "optional": true,
+            "requires": {
+                "buildcheck": "0.0.3",
+                "nan": "^2.15.0"
+            }
+        },
         "cron-validate": {
             "version": "1.4.5",
             "resolved": "https://registry.npmjs.org/cron-validate/-/cron-validate-1.4.5.tgz",
@@ -21473,9 +24803,9 @@
             },
             "dependencies": {
                 "@types/node": {
-                    "version": "14.18.33",
-                    "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.33.tgz",
-                    "integrity": "sha512-qelS/Ra6sacc4loe/3MSjXNL1dNQ/GjxNHVzuChwMfmk7HuycRLVQN2qNY3XahK+fZc5E2szqQSKUyAF0E+2bg==",
+                    "version": "14.18.36",
+                    "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.36.tgz",
+                    "integrity": "sha512-FXKWbsJ6a1hIrRxv+FoukuHnGTgEzKYGi7kilfMae96AL9UNkPFNWJEEYWzdRI9ooIkbr4AKldyuSTLql06vLQ==",
                     "dev": true
                 },
                 "ansi-styles": {
@@ -21529,6 +24859,15 @@
                     "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
                     "dev": true
                 },
+                "lru-cache": {
+                    "version": "6.0.0",
+                    "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+                    "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+                    "dev": true,
+                    "requires": {
+                        "yallist": "^4.0.0"
+                    }
+                },
                 "semver": {
                     "version": "7.3.8",
                     "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz",
@@ -21546,6 +24885,12 @@
                     "requires": {
                         "has-flag": "^4.0.0"
                     }
+                },
+                "yallist": {
+                    "version": "4.0.0",
+                    "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+                    "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
+                    "dev": true
                 }
             }
         },
@@ -21576,9 +24921,9 @@
             "dev": true
         },
         "dayjs": {
-            "version": "1.11.6",
-            "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.6.tgz",
-            "integrity": "sha512-zZbY5giJAinCG+7AGaw0wIhNZ6J8AhWuSXKvuc1KAyMiRsvGQWqh4L+MomvhdAYjN+lqvVCMq1I41e3YHvXkyQ=="
+            "version": "1.11.7",
+            "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.7.tgz",
+            "integrity": "sha512-+Yw9U6YO5TQohxLcIkrXBeY73WP3ejHWVvx8XCk3gxvQDCTEmS48ZrSZCKciI7Bhl/uCMyxYtE9UqRILmFphkQ=="
         },
         "debug": {
             "version": "4.3.4",
@@ -21620,11 +24965,26 @@
             }
         },
         "decimal.js": {
-            "version": "10.4.2",
-            "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.2.tgz",
-            "integrity": "sha512-ic1yEvwT6GuvaYwBLLY6/aFFgjZdySKTE8en/fkU3QICTmRtgtSlFn0u0BXN06InZwtfCelR7j8LRiDI/02iGA==",
+            "version": "10.4.3",
+            "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz",
+            "integrity": "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==",
             "dev": true
         },
+        "decompress-response": {
+            "version": "6.0.0",
+            "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz",
+            "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==",
+            "requires": {
+                "mimic-response": "^3.1.0"
+            },
+            "dependencies": {
+                "mimic-response": {
+                    "version": "3.1.0",
+                    "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz",
+                    "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ=="
+                }
+            }
+        },
         "dedent": {
             "version": "0.7.0",
             "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz",
@@ -21638,11 +24998,16 @@
             "dev": true
         },
         "deepmerge": {
-            "version": "4.2.2",
-            "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz",
-            "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==",
+            "version": "4.3.0",
+            "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.0.tgz",
+            "integrity": "sha512-z2wJZXrmeHdvYJp/Ux55wIjqo81G5Bp4c+oELTW+7ar6SogWHajt5a9gO3s3IDaGSAXjDk0vlQKN3rms8ab3og==",
             "dev": true
         },
+        "defer-to-connect": {
+            "version": "2.0.1",
+            "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz",
+            "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg=="
+        },
         "define-lazy-prop": {
             "version": "2.0.0",
             "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz",
@@ -21786,6 +25151,12 @@
                 "domelementtype": "^2.3.0"
             }
         },
+        "dompurify": {
+            "version": "2.4.3",
+            "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-2.4.3.tgz",
+            "integrity": "sha512-q6QaLcakcRjebxjg8/+NP+h0rPfatOgOzc46Fst9VAA3jF2ApfKBNKMzdP4DYTqtUMXSCd5pRS/8Po/OmoCHZQ==",
+            "dev": true
+        },
         "domutils": {
             "version": "3.0.1",
             "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.0.1.tgz",
@@ -21796,6 +25167,11 @@
                 "domhandler": "^5.0.1"
             }
         },
+        "dotenv": {
+            "version": "16.0.3",
+            "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.0.3.tgz",
+            "integrity": "sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ=="
+        },
         "duplexify": {
             "version": "4.1.2",
             "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-4.1.2.tgz",
@@ -21831,9 +25207,9 @@
             "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow=="
         },
         "electron-to-chromium": {
-            "version": "1.4.284",
-            "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz",
-            "integrity": "sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA==",
+            "version": "1.4.294",
+            "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.294.tgz",
+            "integrity": "sha512-PuHZB3jEN7D8WPPjLmBQAsqQz8tWHlkkB4n0E2OYw8RwVdmBYV0Wn+rUFH8JqYyIRb4HQhhedgxlZL163wqLrQ==",
             "dev": true
         },
         "emittery": {
@@ -21910,9 +25286,9 @@
             }
         },
         "engine.io-parser": {
-            "version": "5.0.4",
-            "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.0.4.tgz",
-            "integrity": "sha512-+nVFp+5z1E3HcToEnO7ZIj3g+3k9389DvWtvJZz0T6/eOCPIyyxehFcedoYrZQrp0LgQbD9pPXhpMBKMd5QURg=="
+            "version": "5.0.6",
+            "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.0.6.tgz",
+            "integrity": "sha512-tjuoZDMAdEhVnSFleYPCtdL2GXwVTGtNjoeJd9IhIG3C1xs9uwxqRNEu5WpnDZCaozwVlK/nuQhpodhXSIMaxw=="
         },
         "enquirer": {
             "version": "2.3.6",
@@ -21944,34 +25320,43 @@
             }
         },
         "es-abstract": {
-            "version": "1.20.4",
-            "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.4.tgz",
-            "integrity": "sha512-0UtvRN79eMe2L+UNEF1BwRe364sj/DXhQ/k5FmivgoSdpM90b8Jc0mDzKMGo7QS0BVbOP/bTwBKNnDc9rNzaPA==",
+            "version": "1.21.1",
+            "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.21.1.tgz",
+            "integrity": "sha512-QudMsPOz86xYz/1dG1OuGBKOELjCh99IIWHLzy5znUB6j8xG2yMA7bfTV86VSqKF+Y/H08vQPR+9jyXpuC6hfg==",
             "requires": {
+                "available-typed-arrays": "^1.0.5",
                 "call-bind": "^1.0.2",
+                "es-set-tostringtag": "^2.0.1",
                 "es-to-primitive": "^1.2.1",
                 "function-bind": "^1.1.1",
                 "function.prototype.name": "^1.1.5",
                 "get-intrinsic": "^1.1.3",
                 "get-symbol-description": "^1.0.0",
+                "globalthis": "^1.0.3",
+                "gopd": "^1.0.1",
                 "has": "^1.0.3",
                 "has-property-descriptors": "^1.0.0",
+                "has-proto": "^1.0.1",
                 "has-symbols": "^1.0.3",
-                "internal-slot": "^1.0.3",
+                "internal-slot": "^1.0.4",
+                "is-array-buffer": "^3.0.1",
                 "is-callable": "^1.2.7",
                 "is-negative-zero": "^2.0.2",
                 "is-regex": "^1.1.4",
                 "is-shared-array-buffer": "^1.0.2",
                 "is-string": "^1.0.7",
+                "is-typed-array": "^1.1.10",
                 "is-weakref": "^1.0.2",
                 "object-inspect": "^1.12.2",
                 "object-keys": "^1.1.1",
                 "object.assign": "^4.1.4",
                 "regexp.prototype.flags": "^1.4.3",
                 "safe-regex-test": "^1.0.0",
-                "string.prototype.trimend": "^1.0.5",
-                "string.prototype.trimstart": "^1.0.5",
-                "unbox-primitive": "^1.0.2"
+                "string.prototype.trimend": "^1.0.6",
+                "string.prototype.trimstart": "^1.0.6",
+                "typed-array-length": "^1.0.4",
+                "unbox-primitive": "^1.0.2",
+                "which-typed-array": "^1.1.9"
             }
         },
         "es-aggregate-error": {
@@ -21988,6 +25373,16 @@
                 "has-property-descriptors": "^1.0.0"
             }
         },
+        "es-set-tostringtag": {
+            "version": "2.0.1",
+            "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz",
+            "integrity": "sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==",
+            "requires": {
+                "get-intrinsic": "^1.1.3",
+                "has": "^1.0.3",
+                "has-tostringtag": "^1.0.0"
+            }
+        },
         "es-to-primitive": {
             "version": "1.2.1",
             "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz",
@@ -21999,172 +25394,172 @@
             }
         },
         "esbuild": {
-            "version": "0.15.15",
-            "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.15.15.tgz",
-            "integrity": "sha512-TEw/lwK4Zzld9x3FedV6jy8onOUHqcEX3ADFk4k+gzPUwrxn8nWV62tH0udo8jOtjFodlEfc4ypsqX3e+WWO6w==",
+            "version": "0.15.18",
+            "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.15.18.tgz",
+            "integrity": "sha512-x/R72SmW3sSFRm5zrrIjAhCeQSAWoni3CmHEqfQrZIQTM3lVCdehdwuIqaOtfC2slvpdlLa62GYoN8SxT23m6Q==",
             "dev": true,
             "requires": {
-                "@esbuild/android-arm": "0.15.15",
-                "@esbuild/linux-loong64": "0.15.15",
-                "esbuild-android-64": "0.15.15",
-                "esbuild-android-arm64": "0.15.15",
-                "esbuild-darwin-64": "0.15.15",
-                "esbuild-darwin-arm64": "0.15.15",
-                "esbuild-freebsd-64": "0.15.15",
-                "esbuild-freebsd-arm64": "0.15.15",
-                "esbuild-linux-32": "0.15.15",
-                "esbuild-linux-64": "0.15.15",
-                "esbuild-linux-arm": "0.15.15",
-                "esbuild-linux-arm64": "0.15.15",
-                "esbuild-linux-mips64le": "0.15.15",
-                "esbuild-linux-ppc64le": "0.15.15",
-                "esbuild-linux-riscv64": "0.15.15",
-                "esbuild-linux-s390x": "0.15.15",
-                "esbuild-netbsd-64": "0.15.15",
-                "esbuild-openbsd-64": "0.15.15",
-                "esbuild-sunos-64": "0.15.15",
-                "esbuild-windows-32": "0.15.15",
-                "esbuild-windows-64": "0.15.15",
-                "esbuild-windows-arm64": "0.15.15"
+                "@esbuild/android-arm": "0.15.18",
+                "@esbuild/linux-loong64": "0.15.18",
+                "esbuild-android-64": "0.15.18",
+                "esbuild-android-arm64": "0.15.18",
+                "esbuild-darwin-64": "0.15.18",
+                "esbuild-darwin-arm64": "0.15.18",
+                "esbuild-freebsd-64": "0.15.18",
+                "esbuild-freebsd-arm64": "0.15.18",
+                "esbuild-linux-32": "0.15.18",
+                "esbuild-linux-64": "0.15.18",
+                "esbuild-linux-arm": "0.15.18",
+                "esbuild-linux-arm64": "0.15.18",
+                "esbuild-linux-mips64le": "0.15.18",
+                "esbuild-linux-ppc64le": "0.15.18",
+                "esbuild-linux-riscv64": "0.15.18",
+                "esbuild-linux-s390x": "0.15.18",
+                "esbuild-netbsd-64": "0.15.18",
+                "esbuild-openbsd-64": "0.15.18",
+                "esbuild-sunos-64": "0.15.18",
+                "esbuild-windows-32": "0.15.18",
+                "esbuild-windows-64": "0.15.18",
+                "esbuild-windows-arm64": "0.15.18"
             }
         },
         "esbuild-android-64": {
-            "version": "0.15.15",
-            "resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.15.15.tgz",
-            "integrity": "sha512-F+WjjQxO+JQOva3tJWNdVjouFMLK6R6i5gjDvgUthLYJnIZJsp1HlF523k73hELY20WPyEO8xcz7aaYBVkeg5Q==",
+            "version": "0.15.18",
+            "resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.15.18.tgz",
+            "integrity": "sha512-wnpt3OXRhcjfIDSZu9bnzT4/TNTDsOUvip0foZOUBG7QbSt//w3QV4FInVJxNhKc/ErhUxc5z4QjHtMi7/TbgA==",
             "dev": true,
             "optional": true
         },
         "esbuild-android-arm64": {
-            "version": "0.15.15",
-            "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.15.15.tgz",
-            "integrity": "sha512-attlyhD6Y22jNyQ0fIIQ7mnPvDWKw7k6FKnsXlBvQE6s3z6s6cuEHcSgoirquQc7TmZgVCK5fD/2uxmRN+ZpcQ==",
+            "version": "0.15.18",
+            "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.15.18.tgz",
+            "integrity": "sha512-G4xu89B8FCzav9XU8EjsXacCKSG2FT7wW9J6hOc18soEHJdtWu03L3TQDGf0geNxfLTtxENKBzMSq9LlbjS8OQ==",
             "dev": true,
             "optional": true
         },
         "esbuild-darwin-64": {
-            "version": "0.15.15",
-            "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.15.15.tgz",
-            "integrity": "sha512-ohZtF8W1SHJ4JWldsPVdk8st0r9ExbAOSrBOh5L+Mq47i696GVwv1ab/KlmbUoikSTNoXEhDzVpxUR/WIO19FQ==",
+            "version": "0.15.18",
+            "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.15.18.tgz",
+            "integrity": "sha512-2WAvs95uPnVJPuYKP0Eqx+Dl/jaYseZEUUT1sjg97TJa4oBtbAKnPnl3b5M9l51/nbx7+QAEtuummJZW0sBEmg==",
             "dev": true,
             "optional": true
         },
         "esbuild-darwin-arm64": {
-            "version": "0.15.15",
-            "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.15.15.tgz",
-            "integrity": "sha512-P8jOZ5zshCNIuGn+9KehKs/cq5uIniC+BeCykvdVhx/rBXSxmtj3CUIKZz4sDCuESMbitK54drf/2QX9QHG5Ag==",
+            "version": "0.15.18",
+            "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.15.18.tgz",
+            "integrity": "sha512-tKPSxcTJ5OmNb1btVikATJ8NftlyNlc8BVNtyT/UAr62JFOhwHlnoPrhYWz09akBLHI9nElFVfWSTSRsrZiDUA==",
             "dev": true,
             "optional": true
         },
         "esbuild-freebsd-64": {
-            "version": "0.15.15",
-            "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.15.15.tgz",
-            "integrity": "sha512-KkTg+AmDXz1IvA9S1gt8dE24C8Thx0X5oM0KGF322DuP+P3evwTL9YyusHAWNsh4qLsR80nvBr/EIYs29VSwuA==",
+            "version": "0.15.18",
+            "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.15.18.tgz",
+            "integrity": "sha512-TT3uBUxkteAjR1QbsmvSsjpKjOX6UkCstr8nMr+q7zi3NuZ1oIpa8U41Y8I8dJH2fJgdC3Dj3CXO5biLQpfdZA==",
             "dev": true,
             "optional": true
         },
         "esbuild-freebsd-arm64": {
-            "version": "0.15.15",
-            "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.15.15.tgz",
-            "integrity": "sha512-FUcML0DRsuyqCMfAC+HoeAqvWxMeq0qXvclZZ/lt2kLU6XBnDA5uKTLUd379WYEyVD4KKFctqWd9tTuk8C/96g==",
+            "version": "0.15.18",
+            "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.15.18.tgz",
+            "integrity": "sha512-R/oVr+X3Tkh+S0+tL41wRMbdWtpWB8hEAMsOXDumSSa6qJR89U0S/PpLXrGF7Wk/JykfpWNokERUpCeHDl47wA==",
             "dev": true,
             "optional": true
         },
         "esbuild-linux-32": {
-            "version": "0.15.15",
-            "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.15.15.tgz",
-            "integrity": "sha512-q28Qn5pZgHNqug02aTkzw5sW9OklSo96b5nm17Mq0pDXrdTBcQ+M6Q9A1B+dalFeynunwh/pvfrNucjzwDXj+Q==",
+            "version": "0.15.18",
+            "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.15.18.tgz",
+            "integrity": "sha512-lphF3HiCSYtaa9p1DtXndiQEeQDKPl9eN/XNoBf2amEghugNuqXNZA/ZovthNE2aa4EN43WroO0B85xVSjYkbg==",
             "dev": true,
             "optional": true
         },
         "esbuild-linux-64": {
-            "version": "0.15.15",
-            "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.15.15.tgz",
-            "integrity": "sha512-217KPmWMirkf8liO+fj2qrPwbIbhNTGNVtvqI1TnOWJgcMjUWvd677Gq3fTzXEjilkx2yWypVnTswM2KbXgoAg==",
+            "version": "0.15.18",
+            "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.15.18.tgz",
+            "integrity": "sha512-hNSeP97IviD7oxLKFuii5sDPJ+QHeiFTFLoLm7NZQligur8poNOWGIgpQ7Qf8Balb69hptMZzyOBIPtY09GZYw==",
             "dev": true,
             "optional": true
         },
         "esbuild-linux-arm": {
-            "version": "0.15.15",
-            "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.15.15.tgz",
-            "integrity": "sha512-RYVW9o2yN8yM7SB1yaWr378CwrjvGCyGybX3SdzPHpikUHkME2AP55Ma20uNwkNyY2eSYFX9D55kDrfQmQBR4w==",
+            "version": "0.15.18",
+            "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.15.18.tgz",
+            "integrity": "sha512-UH779gstRblS4aoS2qpMl3wjg7U0j+ygu3GjIeTonCcN79ZvpPee12Qun3vcdxX+37O5LFxz39XeW2I9bybMVA==",
             "dev": true,
             "optional": true
         },
         "esbuild-linux-arm64": {
-            "version": "0.15.15",
-            "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.15.15.tgz",
-            "integrity": "sha512-/ltmNFs0FivZkYsTzAsXIfLQX38lFnwJTWCJts0IbCqWZQe+jjj0vYBNbI0kmXLb3y5NljiM5USVAO1NVkdh2g==",
+            "version": "0.15.18",
+            "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.15.18.tgz",
+            "integrity": "sha512-54qr8kg/6ilcxd+0V3h9rjT4qmjc0CccMVWrjOEM/pEcUzt8X62HfBSeZfT2ECpM7104mk4yfQXkosY8Quptug==",
             "dev": true,
             "optional": true
         },
         "esbuild-linux-mips64le": {
-            "version": "0.15.15",
-            "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.15.15.tgz",
-            "integrity": "sha512-PksEPb321/28GFFxtvL33yVPfnMZihxkEv5zME2zapXGp7fA1X2jYeiTUK+9tJ/EGgcNWuwvtawPxJG7Mmn86A==",
+            "version": "0.15.18",
+            "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.15.18.tgz",
+            "integrity": "sha512-Mk6Ppwzzz3YbMl/ZZL2P0q1tnYqh/trYZ1VfNP47C31yT0K8t9s7Z077QrDA/guU60tGNp2GOwCQnp+DYv7bxQ==",
             "dev": true,
             "optional": true
         },
         "esbuild-linux-ppc64le": {
-            "version": "0.15.15",
-            "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.15.15.tgz",
-            "integrity": "sha512-ek8gJBEIhcpGI327eAZigBOHl58QqrJrYYIZBWQCnH3UnXoeWMrMZLeeZL8BI2XMBhP+sQ6ERctD5X+ajL/AIA==",
+            "version": "0.15.18",
+            "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.15.18.tgz",
+            "integrity": "sha512-b0XkN4pL9WUulPTa/VKHx2wLCgvIAbgwABGnKMY19WhKZPT+8BxhZdqz6EgkqCLld7X5qiCY2F/bfpUUlnFZ9w==",
             "dev": true,
             "optional": true
         },
         "esbuild-linux-riscv64": {
-            "version": "0.15.15",
-            "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.15.15.tgz",
-            "integrity": "sha512-H5ilTZb33/GnUBrZMNJtBk7/OXzDHDXjIzoLXHSutwwsLxSNaLxzAaMoDGDd/keZoS+GDBqNVxdCkpuiRW4OSw==",
+            "version": "0.15.18",
+            "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.15.18.tgz",
+            "integrity": "sha512-ba2COaoF5wL6VLZWn04k+ACZjZ6NYniMSQStodFKH/Pu6RxzQqzsmjR1t9QC89VYJxBeyVPTaHuBMCejl3O/xg==",
             "dev": true,
             "optional": true
         },
         "esbuild-linux-s390x": {
-            "version": "0.15.15",
-            "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.15.15.tgz",
-            "integrity": "sha512-jKaLUg78mua3rrtrkpv4Or2dNTJU7bgHN4bEjT4OX4GR7nLBSA9dfJezQouTxMmIW7opwEC5/iR9mpC18utnxQ==",
+            "version": "0.15.18",
+            "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.15.18.tgz",
+            "integrity": "sha512-VbpGuXEl5FCs1wDVp93O8UIzl3ZrglgnSQ+Hu79g7hZu6te6/YHgVJxCM2SqfIila0J3k0csfnf8VD2W7u2kzQ==",
             "dev": true,
             "optional": true
         },
         "esbuild-netbsd-64": {
-            "version": "0.15.15",
-            "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.15.15.tgz",
-            "integrity": "sha512-aOvmF/UkjFuW6F36HbIlImJTTx45KUCHJndtKo+KdP8Dhq3mgLRKW9+6Ircpm8bX/RcS3zZMMmaBLkvGY06Gvw==",
+            "version": "0.15.18",
+            "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.15.18.tgz",
+            "integrity": "sha512-98ukeCdvdX7wr1vUYQzKo4kQ0N2p27H7I11maINv73fVEXt2kyh4K4m9f35U1K43Xc2QGXlzAw0K9yoU7JUjOg==",
             "dev": true,
             "optional": true
         },
         "esbuild-openbsd-64": {
-            "version": "0.15.15",
-            "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.15.15.tgz",
-            "integrity": "sha512-HFFX+WYedx1w2yJ1VyR1Dfo8zyYGQZf1cA69bLdrHzu9svj6KH6ZLK0k3A1/LFPhcEY9idSOhsB2UyU0tHPxgQ==",
+            "version": "0.15.18",
+            "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.15.18.tgz",
+            "integrity": "sha512-yK5NCcH31Uae076AyQAXeJzt/vxIo9+omZRKj1pauhk3ITuADzuOx5N2fdHrAKPxN+zH3w96uFKlY7yIn490xQ==",
             "dev": true,
             "optional": true
         },
         "esbuild-sunos-64": {
-            "version": "0.15.15",
-            "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.15.15.tgz",
-            "integrity": "sha512-jOPBudffG4HN8yJXcK9rib/ZTFoTA5pvIKbRrt3IKAGMq1EpBi4xoVoSRrq/0d4OgZLaQbmkHp8RO9eZIn5atA==",
+            "version": "0.15.18",
+            "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.15.18.tgz",
+            "integrity": "sha512-On22LLFlBeLNj/YF3FT+cXcyKPEI263nflYlAhz5crxtp3yRG1Ugfr7ITyxmCmjm4vbN/dGrb/B7w7U8yJR9yw==",
             "dev": true,
             "optional": true
         },
         "esbuild-windows-32": {
-            "version": "0.15.15",
-            "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.15.15.tgz",
-            "integrity": "sha512-MDkJ3QkjnCetKF0fKxCyYNBnOq6dmidcwstBVeMtXSgGYTy8XSwBeIE4+HuKiSsG6I/mXEb++px3IGSmTN0XiA==",
+            "version": "0.15.18",
+            "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.15.18.tgz",
+            "integrity": "sha512-o+eyLu2MjVny/nt+E0uPnBxYuJHBvho8vWsC2lV61A7wwTWC3jkN2w36jtA+yv1UgYkHRihPuQsL23hsCYGcOQ==",
             "dev": true,
             "optional": true
         },
         "esbuild-windows-64": {
-            "version": "0.15.15",
-            "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.15.15.tgz",
-            "integrity": "sha512-xaAUIB2qllE888SsMU3j9nrqyLbkqqkpQyWVkfwSil6BBPgcPk3zOFitTTncEKCLTQy3XV9RuH7PDj3aJDljWA==",
+            "version": "0.15.18",
+            "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.15.18.tgz",
+            "integrity": "sha512-qinug1iTTaIIrCorAUjR0fcBk24fjzEedFYhhispP8Oc7SFvs+XeW3YpAKiKp8dRpizl4YYAhxMjlftAMJiaUw==",
             "dev": true,
             "optional": true
         },
         "esbuild-windows-arm64": {
-            "version": "0.15.15",
-            "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.15.15.tgz",
-            "integrity": "sha512-ttuoCYCIJAFx4UUKKWYnFdrVpoXa3+3WWkXVI6s09U+YjhnyM5h96ewTq/WgQj9LFSIlABQvadHSOQyAVjW5xQ==",
+            "version": "0.15.18",
+            "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.15.18.tgz",
+            "integrity": "sha512-q9bsYzegpZcLziq0zgUi5KqGVtfhjxGbnksaBFYmWLxeV/S1fK4OLdq2DFYnXcLMjlZw2L0jLsk1eGoB522WXQ==",
             "dev": true,
             "optional": true
         },
@@ -22350,9 +25745,9 @@
                     "dev": true
                 },
                 "globals": {
-                    "version": "13.18.0",
-                    "resolved": "https://registry.npmjs.org/globals/-/globals-13.18.0.tgz",
-                    "integrity": "sha512-/mR4KI8Ps2spmoc0Ulu9L7agOF0du1CZNQ3dke8yItYlyKNmGrkONemBbd6V8UTc1Wgcqn21t3WYB7dbRmh6/A==",
+                    "version": "13.20.0",
+                    "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz",
+                    "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==",
                     "dev": true,
                     "requires": {
                         "type-fest": "^0.20.2"
@@ -22395,6 +25790,15 @@
                 "vue-eslint-parser": "^8.0.1"
             },
             "dependencies": {
+                "lru-cache": {
+                    "version": "6.0.0",
+                    "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+                    "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+                    "dev": true,
+                    "requires": {
+                        "yallist": "^4.0.0"
+                    }
+                },
                 "semver": {
                     "version": "7.3.8",
                     "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz",
@@ -22403,6 +25807,12 @@
                     "requires": {
                         "lru-cache": "^6.0.0"
                     }
+                },
+                "yallist": {
+                    "version": "4.0.0",
+                    "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+                    "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
+                    "dev": true
                 }
             }
         },
@@ -22518,6 +25928,11 @@
             "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
             "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg=="
         },
+        "event-to-promise": {
+            "version": "0.7.0",
+            "resolved": "https://registry.npmjs.org/event-to-promise/-/event-to-promise-0.7.0.tgz",
+            "integrity": "sha512-VOBBfyaADfe378ZzG0tgkzmsvzUyeU5arehrFzNRt5yaASUDshgctTwSrPI17ocAwR3+YftsxRClHF+GBKFByQ=="
+        },
         "eventemitter2": {
             "version": "6.4.7",
             "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-6.4.7.tgz",
@@ -22726,6 +26141,15 @@
             "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==",
             "dev": true
         },
+        "fast-xml-parser": {
+            "version": "4.0.11",
+            "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.0.11.tgz",
+            "integrity": "sha512-4aUg3aNRR/WjQAcpceODG1C3x3lFANXRo8+1biqfieHmg9pyMt7qB4lQV/Ta6sJCTbA5vfD8fnA8S54JATiFUA==",
+            "optional": true,
+            "requires": {
+                "strnum": "^1.0.5"
+            }
+        },
         "fastest-levenshtein": {
             "version": "1.0.16",
             "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz",
@@ -22752,9 +26176,9 @@
             }
         },
         "fastq": {
-            "version": "1.13.0",
-            "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz",
-            "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==",
+            "version": "1.15.0",
+            "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz",
+            "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==",
             "dev": true,
             "requires": {
                 "reusify": "^1.0.4"
@@ -22877,6 +26301,14 @@
             "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz",
             "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA=="
         },
+        "for-each": {
+            "version": "0.3.3",
+            "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz",
+            "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==",
+            "requires": {
+                "is-callable": "^1.1.3"
+            }
+        },
         "forever-agent": {
             "version": "0.6.1",
             "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz",
@@ -22893,6 +26325,11 @@
                 "mime-types": "^2.1.12"
             }
         },
+        "form-data-encoder": {
+            "version": "2.1.4",
+            "resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-2.1.4.tgz",
+            "integrity": "sha512-yDYSgNMraqvnxiEXO4hi88+YZxaHC6QKzb5N84iRCTDeRO7ZALpir/lVmf/uXUhnwUr2O4HU8s/n6x+yNjQkHw=="
+        },
         "forwarded": {
             "version": "0.2.0",
             "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz",
@@ -22913,6 +26350,12 @@
                 "readable-stream": "^2.0.0"
             },
             "dependencies": {
+                "isarray": {
+                    "version": "1.0.0",
+                    "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
+                    "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==",
+                    "dev": true
+                },
                 "readable-stream": {
                     "version": "2.3.7",
                     "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
@@ -22957,6 +26400,21 @@
             "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==",
             "requires": {
                 "minipass": "^3.0.0"
+            },
+            "dependencies": {
+                "minipass": {
+                    "version": "3.3.6",
+                    "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz",
+                    "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==",
+                    "requires": {
+                        "yallist": "^4.0.0"
+                    }
+                },
+                "yallist": {
+                    "version": "4.0.0",
+                    "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+                    "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
+                }
             }
         },
         "fs.realpath": {
@@ -22998,6 +26456,29 @@
             "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz",
             "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ=="
         },
+        "gamedig": {
+            "version": "4.0.6",
+            "resolved": "https://registry.npmjs.org/gamedig/-/gamedig-4.0.6.tgz",
+            "integrity": "sha512-h0k9n/e5vNrd9Mh2wyFUp2Vo7ABWbDkdBxKC6FNJLOZiU5d9Z29bntGeYbXtOkcRWoV6Q63wSAJ3jLWxYQkpZw==",
+            "requires": {
+                "cheerio": "^1.0.0-rc.10",
+                "compressjs": "^1.0.2",
+                "gbxremote": "^0.2.1",
+                "got": "^12.0.3",
+                "iconv-lite": "^0.6.3",
+                "long": "^5.2.0",
+                "minimist": "^1.2.6",
+                "punycode": "^2.1.1",
+                "varint": "^6.0.0"
+            },
+            "dependencies": {
+                "long": {
+                    "version": "5.2.1",
+                    "resolved": "https://registry.npmjs.org/long/-/long-5.2.1.tgz",
+                    "integrity": "sha512-GKSNGeNAtw8IryjjkhZxuKB3JzlcLTwjtiQCHKvqQet81I93kXslhDQruGI/QsddO83mcDToBVy7GqGS/zYf/A=="
+                }
+            }
+        },
         "gauge": {
             "version": "3.0.2",
             "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz",
@@ -23014,6 +26495,18 @@
                 "wide-align": "^1.1.2"
             }
         },
+        "gbxremote": {
+            "version": "0.2.1",
+            "resolved": "https://registry.npmjs.org/gbxremote/-/gbxremote-0.2.1.tgz",
+            "integrity": "sha512-SMehu6Y6ndq2Qgp9VxAb8Np3f+UUD+RWoW2SAMaxzGS96rWXyr4T1GGkecO0HHtxeH1m7pEh4FJWB8a/6aM2XQ==",
+            "requires": {
+                "any-promise": "^1.1.0",
+                "barse": "~0.4.2",
+                "event-to-promise": "^0.7.0",
+                "string-to-stream": "^1.0.1",
+                "xmlrpc": "^1.3.1"
+            }
+        },
         "generate-function": {
             "version": "2.3.1",
             "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.3.1.tgz",
@@ -23022,6 +26515,11 @@
                 "is-property": "^1.0.2"
             }
         },
+        "generic-pool": {
+            "version": "3.9.0",
+            "resolved": "https://registry.npmjs.org/generic-pool/-/generic-pool-3.9.0.tgz",
+            "integrity": "sha512-hymDOu5B53XvN4QT9dBmZxPX4CWhBPPLguTZ9MMFeFa/Kg0xWVfylOVNlJji/E7yTZWFd/q9GO5TxDLq156D7g=="
+        },
         "gensync": {
             "version": "1.0.0-beta.2",
             "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz",
@@ -23034,9 +26532,9 @@
             "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg=="
         },
         "get-intrinsic": {
-            "version": "1.1.3",
-            "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz",
-            "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==",
+            "version": "1.2.0",
+            "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz",
+            "integrity": "sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==",
             "requires": {
                 "function-bind": "^1.1.1",
                 "has": "^1.0.3",
@@ -23046,8 +26544,7 @@
         "get-package-type": {
             "version": "0.1.0",
             "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz",
-            "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==",
-            "dev": true
+            "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q=="
         },
         "get-stdin": {
             "version": "8.0.0",
@@ -23074,9 +26571,9 @@
             }
         },
         "getopts": {
-            "version": "2.2.5",
-            "resolved": "https://registry.npmjs.org/getopts/-/getopts-2.2.5.tgz",
-            "integrity": "sha512-9jb7AW5p3in+IiJWhQiZmmwkpLaR/ccTWdWQCtZM66HJcHHLegowh4q4tSD7gouUyeNvFWRavfK9GXosQHDpFA=="
+            "version": "2.3.0",
+            "resolved": "https://registry.npmjs.org/getopts/-/getopts-2.3.0.tgz",
+            "integrity": "sha512-5eDf9fuSXwxBL6q5HX+dhDj+dslFGWzU5thZ9kNKUkcPtaPdatmUFKwHFrLb/uf/WpA4BHET+AX3Scl56cAjpA=="
         },
         "getos": {
             "version": "3.2.1",
@@ -23198,12 +26695,55 @@
             "integrity": "sha512-xYfnw62CKG8nLkZBfWbhWwDw02CHty86jfPcc2cr3ZfeuK9ysoVPPEUxf21bAD/rWAgk52SuBrLJlefNy8mvFg==",
             "dev": true
         },
+        "gopd": {
+            "version": "1.0.1",
+            "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz",
+            "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==",
+            "requires": {
+                "get-intrinsic": "^1.1.3"
+            }
+        },
+        "got": {
+            "version": "12.5.3",
+            "resolved": "https://registry.npmjs.org/got/-/got-12.5.3.tgz",
+            "integrity": "sha512-8wKnb9MGU8IPGRIo+/ukTy9XLJBwDiCpIf5TVzQ9Cpol50eMTpBq2GAuDsuDIz7hTYmZgMgC1e9ydr6kSDWs3w==",
+            "requires": {
+                "@sindresorhus/is": "^5.2.0",
+                "@szmarczak/http-timer": "^5.0.1",
+                "cacheable-lookup": "^7.0.0",
+                "cacheable-request": "^10.2.1",
+                "decompress-response": "^6.0.0",
+                "form-data-encoder": "^2.1.2",
+                "get-stream": "^6.0.1",
+                "http2-wrapper": "^2.1.10",
+                "lowercase-keys": "^3.0.0",
+                "p-cancelable": "^3.0.0",
+                "responselike": "^3.0.0"
+            },
+            "dependencies": {
+                "cacheable-lookup": {
+                    "version": "7.0.0",
+                    "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-7.0.0.tgz",
+                    "integrity": "sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w=="
+                },
+                "get-stream": {
+                    "version": "6.0.1",
+                    "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz",
+                    "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg=="
+                }
+            }
+        },
         "graceful-fs": {
             "version": "4.2.10",
             "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz",
             "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==",
             "devOptional": true
         },
+        "graceful-readlink": {
+            "version": "1.0.1",
+            "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz",
+            "integrity": "sha512-8tLu60LgxF6XpdbK8OW3FA+IfTNBn1ZHGHKF4KQbEeSkajYw5PlYJcKluntgegDPTg8UkHjpet1T82vk6TQ68w=="
+        },
         "har-schema": {
             "version": "2.0.0",
             "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz",
@@ -23253,6 +26793,11 @@
                 "get-intrinsic": "^1.1.1"
             }
         },
+        "has-proto": {
+            "version": "1.0.1",
+            "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz",
+            "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg=="
+        },
         "has-symbols": {
             "version": "1.0.3",
             "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz",
@@ -23292,6 +26837,23 @@
             "dev": true,
             "requires": {
                 "lru-cache": "^6.0.0"
+            },
+            "dependencies": {
+                "lru-cache": {
+                    "version": "6.0.0",
+                    "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+                    "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+                    "dev": true,
+                    "requires": {
+                        "yallist": "^4.0.0"
+                    }
+                },
+                "yallist": {
+                    "version": "4.0.0",
+                    "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+                    "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
+                    "dev": true
+                }
             }
         },
         "html-encoding-sniffer": {
@@ -23326,6 +26888,11 @@
                 "entities": "^4.3.0"
             }
         },
+        "http-cache-semantics": {
+            "version": "4.1.1",
+            "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz",
+            "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ=="
+        },
         "http-errors": {
             "version": "1.8.1",
             "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz",
@@ -23339,9 +26906,9 @@
             }
         },
         "http-graceful-shutdown": {
-            "version": "3.1.11",
-            "resolved": "https://registry.npmjs.org/http-graceful-shutdown/-/http-graceful-shutdown-3.1.11.tgz",
-            "integrity": "sha512-tfOwKDZA8kJqDNBK2ur+o55HbhDHoflvDCDgjbmm5eAn0RhqhdlUjVygj8e258B5nn5kNsEFOl7DbXLskKrgGA==",
+            "version": "3.1.12",
+            "resolved": "https://registry.npmjs.org/http-graceful-shutdown/-/http-graceful-shutdown-3.1.12.tgz",
+            "integrity": "sha512-z3mH1HUwRESrauPjvjH5QuH2Ce4uLlWonPFgZnwAyxIFYROxIMcNNWwNltN+s8fHF/aGlsfQDOICHLXsabK43w==",
             "requires": {
                 "debug": "^4.3.4"
             }
@@ -23367,6 +26934,15 @@
                 "sshpk": "^1.14.1"
             }
         },
+        "http2-wrapper": {
+            "version": "2.2.0",
+            "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-2.2.0.tgz",
+            "integrity": "sha512-kZB0wxMo0sh1PehyjJUWRFEd99KC5TLjZ2cULC4f9iqJBAmKQQXEICjxl5iPJRwP40dpeHFqqhm7tYCvODpqpQ==",
+            "requires": {
+                "quick-lru": "^5.1.1",
+                "resolve-alpn": "^1.2.0"
+            }
+        },
         "https-proxy-agent": {
             "version": "5.0.1",
             "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz",
@@ -23391,9 +26967,9 @@
             "dev": true
         },
         "hyperid": {
-            "version": "3.0.1",
-            "resolved": "https://registry.npmjs.org/hyperid/-/hyperid-3.0.1.tgz",
-            "integrity": "sha512-I+tl7TS5nsoVhkxqX1rS3Qmqlq44eoPUcgPthW8v3IW8CvWL7lwtd6HQbkDUMrBKJTG0vgEaRsjT35imW/D+9Q==",
+            "version": "3.1.1",
+            "resolved": "https://registry.npmjs.org/hyperid/-/hyperid-3.1.1.tgz",
+            "integrity": "sha512-RveV33kIksycSf7HLkq1sHB5wW0OwuX8ot8MYnY++gaaPXGFfKpBncHrAWxdpuEeRlazUMGWefwP1w6o6GaumA==",
             "dev": true,
             "requires": {
                 "uuid": "^8.3.2",
@@ -23414,9 +26990,9 @@
             "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA=="
         },
         "ignore": {
-            "version": "5.2.0",
-            "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz",
-            "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==",
+            "version": "5.2.4",
+            "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz",
+            "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==",
             "dev": true
         },
         "import-fresh": {
@@ -23478,11 +27054,11 @@
             "dev": true
         },
         "internal-slot": {
-            "version": "1.0.3",
-            "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz",
-            "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==",
+            "version": "1.0.5",
+            "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz",
+            "integrity": "sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==",
             "requires": {
-                "get-intrinsic": "^1.1.0",
+                "get-intrinsic": "^1.2.0",
                 "has": "^1.0.3",
                 "side-channel": "^1.0.4"
             }
@@ -23502,6 +27078,16 @@
             "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
             "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g=="
         },
+        "is-array-buffer": {
+            "version": "3.0.1",
+            "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.1.tgz",
+            "integrity": "sha512-ASfLknmY8Xa2XtB4wmbz13Wu202baeA18cJBCeCy0wXUHZF0IPyVEXqKEcd+t2fNSLLL1vC6k7lxZEojNbISXQ==",
+            "requires": {
+                "call-bind": "^1.0.2",
+                "get-intrinsic": "^1.1.3",
+                "is-typed-array": "^1.1.10"
+            }
+        },
         "is-arrayish": {
             "version": "0.2.1",
             "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
@@ -23734,6 +27320,18 @@
                 "has-symbols": "^1.0.2"
             }
         },
+        "is-typed-array": {
+            "version": "1.1.10",
+            "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.10.tgz",
+            "integrity": "sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==",
+            "requires": {
+                "available-typed-arrays": "^1.0.5",
+                "call-bind": "^1.0.2",
+                "for-each": "^0.3.3",
+                "gopd": "^1.0.1",
+                "has-tostringtag": "^1.0.0"
+            }
+        },
         "is-typedarray": {
             "version": "1.0.0",
             "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
@@ -23771,10 +27369,9 @@
             }
         },
         "isarray": {
-            "version": "1.0.0",
-            "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
-            "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==",
-            "devOptional": true
+            "version": "0.0.1",
+            "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
+            "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ=="
         },
         "isemail": {
             "version": "3.2.0",
@@ -24930,6 +28527,15 @@
                     "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
                     "dev": true
                 },
+                "lru-cache": {
+                    "version": "6.0.0",
+                    "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+                    "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+                    "dev": true,
+                    "requires": {
+                        "yallist": "^4.0.0"
+                    }
+                },
                 "semver": {
                     "version": "7.3.8",
                     "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz",
@@ -24947,6 +28553,12 @@
                     "requires": {
                         "has-flag": "^4.0.0"
                     }
+                },
+                "yallist": {
+                    "version": "4.0.0",
+                    "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+                    "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
+                    "dev": true
                 }
             }
         },
@@ -25196,9 +28808,9 @@
             "integrity": "sha512-/GDnfQYsltsjRswQhN9fhv3EMw2sCpUdrdxyWDOUK7eyD++r3gRhzgiQgc/x4MAv2i1iuQ4lxO5mvqM3vj4bwA=="
         },
         "js-sdsl": {
-            "version": "4.1.4",
-            "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.1.4.tgz",
-            "integrity": "sha512-Y2/yD55y5jteOAmY50JbUZYwk3CP3wnLPEZnlR1w9oKhITrBEtAxwuWKebFf8hMrPMgbYwFoWK/lH2sBkErELw=="
+            "version": "4.3.0",
+            "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.3.0.tgz",
+            "integrity": "sha512-mifzlm2+5nZ+lEcLJMoBK0/IH/bDg8XnJfd/Wq6IP+xoCjLZsTOnV2QpxlVbX9bMnkl5PdEjNtBJ9Cj1NjifhQ=="
         },
         "js-tokens": {
             "version": "4.0.0",
@@ -25320,6 +28932,11 @@
             "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz",
             "integrity": "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g=="
         },
+        "json-buffer": {
+            "version": "3.0.1",
+            "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz",
+            "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ=="
+        },
         "json-parse-even-better-errors": {
             "version": "2.3.1",
             "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz",
@@ -25351,9 +28968,9 @@
             "devOptional": true
         },
         "json5": {
-            "version": "2.2.1",
-            "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz",
-            "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==",
+            "version": "2.2.3",
+            "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz",
+            "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==",
             "dev": true
         },
         "jsonfile": {
@@ -25367,26 +28984,36 @@
             }
         },
         "jsonwebtoken": {
-            "version": "8.5.1",
-            "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-8.5.1.tgz",
-            "integrity": "sha512-XjwVfRS6jTMsqYs0EsuJ4LGxXV14zQybNd4L2r0UvbVnSF9Af8x7p5MzbJ90Ioz/9TI41/hTCvznF/loiSzn8w==",
+            "version": "9.0.0",
+            "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.0.tgz",
+            "integrity": "sha512-tuGfYXxkQGDPnLJ7SibiQgVgeDgfbPq2k2ICcbgqW8WxWLBAxKQM/ZCu/IT8SOSwmaYl4dpTFCW5xZv7YbbWUw==",
             "requires": {
                 "jws": "^3.2.2",
-                "lodash.includes": "^4.3.0",
-                "lodash.isboolean": "^3.0.3",
-                "lodash.isinteger": "^4.0.4",
-                "lodash.isnumber": "^3.0.3",
-                "lodash.isplainobject": "^4.0.6",
-                "lodash.isstring": "^4.0.1",
-                "lodash.once": "^4.0.0",
+                "lodash": "^4.17.21",
                 "ms": "^2.1.1",
-                "semver": "^5.6.0"
+                "semver": "^7.3.8"
             },
             "dependencies": {
+                "lru-cache": {
+                    "version": "6.0.0",
+                    "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+                    "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+                    "requires": {
+                        "yallist": "^4.0.0"
+                    }
+                },
                 "semver": {
-                    "version": "5.7.1",
-                    "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
-                    "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ=="
+                    "version": "7.3.8",
+                    "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz",
+                    "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==",
+                    "requires": {
+                        "lru-cache": "^6.0.0"
+                    }
+                },
+                "yallist": {
+                    "version": "4.0.0",
+                    "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+                    "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
                 }
             }
         },
@@ -25431,6 +29058,14 @@
             "resolved": "https://registry.npmjs.org/jwt-decode/-/jwt-decode-3.1.2.tgz",
             "integrity": "sha512-UfpWE/VZn0iP50d8cz9NrZLM9lSWhcJ+0Gt/nm4by88UL+J1SiKN8/5dkjMmbEzwL2CAe+67GsegCbIKtbp75A=="
         },
+        "keyv": {
+            "version": "4.5.2",
+            "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.2.tgz",
+            "integrity": "sha512-5MHbFaKn8cNSmVW7BYnijeAVlE4cYA/SVkifVgrh7yotnfhKmjuXpDKjrABLnT0SfHWV21P8ow07OGfRrNDg8g==",
+            "requires": {
+                "json-buffer": "3.0.1"
+            }
+        },
         "kind-of": {
             "version": "6.0.3",
             "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz",
@@ -25444,47 +29079,30 @@
             "dev": true
         },
         "knex": {
-            "version": "0.95.15",
-            "resolved": "https://registry.npmjs.org/knex/-/knex-0.95.15.tgz",
-            "integrity": "sha512-Loq6WgHaWlmL2bfZGWPsy4l8xw4pOE+tmLGkPG0auBppxpI0UcK+GYCycJcqz9W54f2LiGewkCVLBm3Wq4ur/w==",
+            "version": "2.4.2",
+            "resolved": "https://registry.npmjs.org/knex/-/knex-2.4.2.tgz",
+            "integrity": "sha512-tMI1M7a+xwHhPxjbl/H9K1kHX+VncEYcvCx5K00M16bWvpYPKAZd6QrCu68PtHAdIZNQPWZn0GVhqVBEthGWCg==",
             "requires": {
-                "colorette": "2.0.16",
-                "commander": "^7.1.0",
-                "debug": "4.3.2",
+                "colorette": "2.0.19",
+                "commander": "^9.1.0",
+                "debug": "4.3.4",
                 "escalade": "^3.1.1",
                 "esm": "^3.2.25",
-                "getopts": "2.2.5",
+                "get-package-type": "^0.1.0",
+                "getopts": "2.3.0",
                 "interpret": "^2.2.0",
                 "lodash": "^4.17.21",
                 "pg-connection-string": "2.5.0",
-                "rechoir": "0.7.0",
+                "rechoir": "^0.8.0",
                 "resolve-from": "^5.0.0",
-                "tarn": "^3.0.1",
+                "tarn": "^3.0.2",
                 "tildify": "2.0.0"
             },
             "dependencies": {
-                "colorette": {
-                    "version": "2.0.16",
-                    "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.16.tgz",
-                    "integrity": "sha512-hUewv7oMjCp+wkBv5Rm0v87eJhq4woh5rSR+42YSQJKecCqgIqNkZ6lAlQms/BwHPJA5NKMRlpxPRv0n8HQW6g=="
-                },
                 "commander": {
-                    "version": "7.2.0",
-                    "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz",
-                    "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw=="
-                },
-                "debug": {
-                    "version": "4.3.2",
-                    "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz",
-                    "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==",
-                    "requires": {
-                        "ms": "2.1.2"
-                    }
-                },
-                "ms": {
-                    "version": "2.1.2",
-                    "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
-                    "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
+                    "version": "9.5.0",
+                    "resolved": "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz",
+                    "integrity": "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ=="
                 },
                 "resolve-from": {
                     "version": "5.0.0",
@@ -25626,36 +29244,6 @@
             "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz",
             "integrity": "sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ=="
         },
-        "lodash.includes": {
-            "version": "4.3.0",
-            "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz",
-            "integrity": "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w=="
-        },
-        "lodash.isboolean": {
-            "version": "3.0.3",
-            "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz",
-            "integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg=="
-        },
-        "lodash.isinteger": {
-            "version": "4.0.4",
-            "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz",
-            "integrity": "sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA=="
-        },
-        "lodash.isnumber": {
-            "version": "3.0.3",
-            "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz",
-            "integrity": "sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw=="
-        },
-        "lodash.isplainobject": {
-            "version": "4.0.6",
-            "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz",
-            "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA=="
-        },
-        "lodash.isstring": {
-            "version": "4.0.1",
-            "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz",
-            "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw=="
-        },
         "lodash.merge": {
             "version": "4.6.2",
             "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz",
@@ -25665,7 +29253,8 @@
         "lodash.once": {
             "version": "4.1.1",
             "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz",
-            "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg=="
+            "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==",
+            "dev": true
         },
         "lodash.truncate": {
             "version": "4.4.2",
@@ -25808,12 +29397,18 @@
             "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz",
             "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA=="
         },
+        "lowercase-keys": {
+            "version": "3.0.0",
+            "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-3.0.0.tgz",
+            "integrity": "sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ=="
+        },
         "lru-cache": {
-            "version": "6.0.0",
-            "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
-            "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+            "version": "5.1.1",
+            "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
+            "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==",
+            "dev": true,
             "requires": {
-                "yallist": "^4.0.0"
+                "yallist": "^3.0.2"
             }
         },
         "magic-string": {
@@ -25848,6 +29443,12 @@
             "integrity": "sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==",
             "dev": true
         },
+        "marked": {
+            "version": "4.2.12",
+            "resolved": "https://registry.npmjs.org/marked/-/marked-4.2.12.tgz",
+            "integrity": "sha512-yr8hSKa3Fv4D3jdZmtMMPghgVt6TWbk86WQaWhDloQjRSQhMMYCAro7jP7VDJrjjdV8pxVxMssXS8B8Y5DZ5aw==",
+            "dev": true
+        },
         "mathml-tag-names": {
             "version": "2.1.3",
             "resolved": "https://registry.npmjs.org/mathml-tag-names/-/mathml-tag-names-2.1.3.tgz",
@@ -25859,6 +29460,12 @@
             "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
             "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ=="
         },
+        "memory-pager": {
+            "version": "1.5.0",
+            "resolved": "https://registry.npmjs.org/memory-pager/-/memory-pager-1.5.0.tgz",
+            "integrity": "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==",
+            "optional": true
+        },
         "meow": {
             "version": "9.0.0",
             "resolved": "https://registry.npmjs.org/meow/-/meow-9.0.0.tgz",
@@ -25949,6 +29556,11 @@
             "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==",
             "dev": true
         },
+        "mimic-response": {
+            "version": "4.0.0",
+            "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-4.0.0.tgz",
+            "integrity": "sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg=="
+        },
         "min-indent": {
             "version": "1.0.1",
             "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz",
@@ -25964,9 +29576,9 @@
             }
         },
         "minimist": {
-            "version": "1.2.7",
-            "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz",
-            "integrity": "sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g=="
+            "version": "1.2.8",
+            "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz",
+            "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA=="
         },
         "minimist-options": {
             "version": "4.1.0",
@@ -25980,12 +29592,9 @@
             }
         },
         "minipass": {
-            "version": "3.3.4",
-            "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.4.tgz",
-            "integrity": "sha512-I9WPbWHCGu8W+6k1ZiGpPu0GkoKBeorkfKNuAFBNS1HNFJvke82sxvI5bzcCNpWPorkOO5QQ+zomzzwRxejXiw==",
-            "requires": {
-                "yallist": "^4.0.0"
-            }
+            "version": "4.0.3",
+            "resolved": "https://registry.npmjs.org/minipass/-/minipass-4.0.3.tgz",
+            "integrity": "sha512-OW2r4sQ0sI+z5ckEt5c1Tri4xTgZwYDxpE54eqWlQloQRoWtXjqt9udJ5Z4dSv7wK+nfFI7FRXyCpBSft+gpFw=="
         },
         "minizlib": {
             "version": "2.1.2",
@@ -25994,6 +29603,21 @@
             "requires": {
                 "minipass": "^3.0.0",
                 "yallist": "^4.0.0"
+            },
+            "dependencies": {
+                "minipass": {
+                    "version": "3.3.6",
+                    "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz",
+                    "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==",
+                    "requires": {
+                        "yallist": "^4.0.0"
+                    }
+                },
+                "yallist": {
+                    "version": "4.0.0",
+                    "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+                    "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
+                }
             }
         },
         "mkdirp": {
@@ -26001,6 +29625,51 @@
             "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
             "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw=="
         },
+        "mongodb": {
+            "version": "4.13.0",
+            "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-4.13.0.tgz",
+            "integrity": "sha512-+taZ/bV8d1pYuHL4U+gSwkhmDrwkWbH1l4aah4YpmpscMwgFBkufIKxgP/G7m87/NUuQzc2Z75ZTI7ZOyqZLbw==",
+            "requires": {
+                "@aws-sdk/credential-providers": "^3.186.0",
+                "bson": "^4.7.0",
+                "mongodb-connection-string-url": "^2.5.4",
+                "saslprep": "^1.0.3",
+                "socks": "^2.7.1"
+            }
+        },
+        "mongodb-connection-string-url": {
+            "version": "2.6.0",
+            "resolved": "https://registry.npmjs.org/mongodb-connection-string-url/-/mongodb-connection-string-url-2.6.0.tgz",
+            "integrity": "sha512-WvTZlI9ab0QYtTYnuMLgobULWhokRjtC7db9LtcVfJ+Hsnyr5eo6ZtNAt3Ly24XZScGMelOcGtm7lSn0332tPQ==",
+            "requires": {
+                "@types/whatwg-url": "^8.2.1",
+                "whatwg-url": "^11.0.0"
+            },
+            "dependencies": {
+                "tr46": {
+                    "version": "3.0.0",
+                    "resolved": "https://registry.npmjs.org/tr46/-/tr46-3.0.0.tgz",
+                    "integrity": "sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==",
+                    "requires": {
+                        "punycode": "^2.1.1"
+                    }
+                },
+                "webidl-conversions": {
+                    "version": "7.0.0",
+                    "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz",
+                    "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g=="
+                },
+                "whatwg-url": {
+                    "version": "11.0.0",
+                    "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-11.0.0.tgz",
+                    "integrity": "sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==",
+                    "requires": {
+                        "tr46": "^3.0.0",
+                        "webidl-conversions": "^7.0.0"
+                    }
+                }
+            }
+        },
         "mqemitter": {
             "version": "4.5.0",
             "resolved": "https://registry.npmjs.org/mqemitter/-/mqemitter-4.5.0.tgz",
@@ -26035,6 +29704,14 @@
                 "xtend": "^4.0.2"
             },
             "dependencies": {
+                "lru-cache": {
+                    "version": "6.0.0",
+                    "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+                    "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+                    "requires": {
+                        "yallist": "^4.0.0"
+                    }
+                },
                 "mqtt-packet": {
                     "version": "6.10.0",
                     "resolved": "https://registry.npmjs.org/mqtt-packet/-/mqtt-packet-6.10.0.tgz",
@@ -26044,6 +29721,11 @@
                         "debug": "^4.1.1",
                         "process-nextick-args": "^2.0.1"
                     }
+                },
+                "yallist": {
+                    "version": "4.0.0",
+                    "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+                    "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
                 }
             }
         },
@@ -26077,9 +29759,9 @@
             },
             "dependencies": {
                 "commander": {
-                    "version": "9.4.1",
-                    "resolved": "https://registry.npmjs.org/commander/-/commander-9.4.1.tgz",
-                    "integrity": "sha512-5EEkTNyHNGFPD2H+c/dXXfQZYa/scCKasxWcXJaWnNJ99pnQN9Vnmqow+p+PlFPE63Q6mThaZws1T+HxfpgtPw=="
+                    "version": "9.5.0",
+                    "resolved": "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz",
+                    "integrity": "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ=="
                 }
             }
         },
@@ -26096,32 +29778,45 @@
                 "named-placeholders": "^1.1.2",
                 "seq-queue": "^0.0.5",
                 "sqlstring": "^2.3.2"
-            }
-        },
-        "named-placeholders": {
-            "version": "1.1.2",
-            "resolved": "https://registry.npmjs.org/named-placeholders/-/named-placeholders-1.1.2.tgz",
-            "integrity": "sha512-wiFWqxoLL3PGVReSZpjLVxyJ1bRqe+KKJVbr4hGs1KWfTZTQyezHFBbuKj9hsizHyGV2ne7EMjHdxEGAybD5SA==",
-            "requires": {
-                "lru-cache": "^4.1.3"
             },
             "dependencies": {
                 "lru-cache": {
-                    "version": "4.1.5",
-                    "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz",
-                    "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==",
+                    "version": "6.0.0",
+                    "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+                    "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
                     "requires": {
-                        "pseudomap": "^1.0.2",
-                        "yallist": "^2.1.2"
+                        "yallist": "^4.0.0"
                     }
                 },
                 "yallist": {
-                    "version": "2.1.2",
-                    "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz",
-                    "integrity": "sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A=="
+                    "version": "4.0.0",
+                    "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+                    "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
                 }
             }
         },
+        "named-placeholders": {
+            "version": "1.1.3",
+            "resolved": "https://registry.npmjs.org/named-placeholders/-/named-placeholders-1.1.3.tgz",
+            "integrity": "sha512-eLoBxg6wE/rZkJPhU/xRX1WTpkFEwDJEN96oxFrTsqBdbT5ec295Q+CoHrL9IT0DipqKhmGcaZmwOt8OON5x1w==",
+            "requires": {
+                "lru-cache": "^7.14.1"
+            },
+            "dependencies": {
+                "lru-cache": {
+                    "version": "7.14.1",
+                    "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.14.1.tgz",
+                    "integrity": "sha512-ysxwsnTKdAx96aTRdhDOCQfDgbHnt8SK0KY8SEjO0wHinhWOFTESbjVCMPbU1uGXg/ch4lifqx0wfjOawU2+WA=="
+                }
+            }
+        },
+        "nan": {
+            "version": "2.17.0",
+            "resolved": "https://registry.npmjs.org/nan/-/nan-2.17.0.tgz",
+            "integrity": "sha512-2ZTgtl0nJsO0KQCjEpxcIr5D+Yv90plTitZt9JBfQvVJDS5seMl3FOvsh3+9CoYWXf/1l5OaZzzF6nDm4cagaQ==",
+            "dev": true,
+            "optional": true
+        },
         "nanoclone": {
             "version": "0.2.1",
             "resolved": "https://registry.npmjs.org/nanoclone/-/nanoclone-0.2.1.tgz",
@@ -26150,9 +29845,9 @@
             "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg=="
         },
         "node-abort-controller": {
-            "version": "3.0.1",
-            "resolved": "https://registry.npmjs.org/node-abort-controller/-/node-abort-controller-3.0.1.tgz",
-            "integrity": "sha512-/ujIVxthRs+7q6hsdjHMaj8hRG9NuWmwrz+JdRwZ14jdFoKSkm+vDsCbF9PLpnSqjaWQJuTmVtcWHNLr+vrOFw=="
+            "version": "3.1.1",
+            "resolved": "https://registry.npmjs.org/node-abort-controller/-/node-abort-controller-3.1.1.tgz",
+            "integrity": "sha512-AGK2yQKIjRuqnc6VkX2Xj5d+QW8xZ87pa1UK6yA6ouUyuxfHuMP6umE5QK7UmTeOAymo+Zx1Fxiuw9rVx8taHQ=="
         },
         "node-addon-api": {
             "version": "4.3.0",
@@ -26168,9 +29863,9 @@
             }
         },
         "node-fetch": {
-            "version": "2.6.7",
-            "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz",
-            "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==",
+            "version": "2.6.9",
+            "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.9.tgz",
+            "integrity": "sha512-DJm/CJkZkRjKKj4Zi4BsKVZh3ValV5IR5s7LVZnW+6YMh0W1BfNA8XSs6DLMGYlId5F3KnA70uu2qepcR08Qqg==",
             "requires": {
                 "whatwg-url": "^5.0.0"
             },
@@ -26261,6 +29956,21 @@
                         "number-is-nan": "^1.0.0"
                     }
                 },
+                "isarray": {
+                    "version": "1.0.0",
+                    "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
+                    "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==",
+                    "optional": true
+                },
+                "lru-cache": {
+                    "version": "6.0.0",
+                    "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+                    "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+                    "optional": true,
+                    "requires": {
+                        "yallist": "^4.0.0"
+                    }
+                },
                 "npmlog": {
                     "version": "4.1.2",
                     "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz",
@@ -26325,6 +30035,12 @@
                     "requires": {
                         "ansi-regex": "^2.0.0"
                     }
+                },
+                "yallist": {
+                    "version": "4.0.0",
+                    "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+                    "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
+                    "optional": true
                 }
             }
         },
@@ -26350,11 +30066,25 @@
             "integrity": "sha512-i3Sf6khnenl0aXumo0whAlfPWTaBqHxEnVBBxpu3dZ7q69NkPPv71rvPjlDZ5wkeKCTNNUTECljerS5kcYQxRw=="
         },
         "node-releases": {
-            "version": "2.0.6",
-            "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.6.tgz",
-            "integrity": "sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==",
+            "version": "2.0.10",
+            "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.10.tgz",
+            "integrity": "sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w==",
             "dev": true
         },
+        "node-ssh": {
+            "version": "13.0.1",
+            "resolved": "https://registry.npmjs.org/node-ssh/-/node-ssh-13.0.1.tgz",
+            "integrity": "sha512-prGXb9KXXtrienVBPiyOCm7F8KSsQciN8VCgrkZeJAlSEtF8HsXa/0uVE5a6MgwIBPa0etTgwiyj/lfiFdVK1Q==",
+            "dev": true,
+            "requires": {
+                "is-stream": "^2.0.0",
+                "make-dir": "^3.1.0",
+                "sb-promise-queue": "^2.1.0",
+                "sb-scandir": "^3.1.0",
+                "shell-escape": "^0.2.0",
+                "ssh2": "^1.5.0"
+            }
+        },
         "nodemailer": {
             "version": "6.6.5",
             "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.6.5.tgz",
@@ -26380,6 +30110,15 @@
                 "validate-npm-package-license": "^3.0.1"
             },
             "dependencies": {
+                "lru-cache": {
+                    "version": "6.0.0",
+                    "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+                    "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+                    "dev": true,
+                    "requires": {
+                        "yallist": "^4.0.0"
+                    }
+                },
                 "semver": {
                     "version": "7.3.8",
                     "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz",
@@ -26388,6 +30127,12 @@
                     "requires": {
                         "lru-cache": "^6.0.0"
                     }
+                },
+                "yallist": {
+                    "version": "4.0.0",
+                    "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+                    "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
+                    "dev": true
                 }
             }
         },
@@ -26403,6 +30148,11 @@
             "integrity": "sha512-dxvWdI8gw6eAvk9BlPffgEoGfM7AdijoCwOEJge3e3ulT2XLgmU7KvvxprOaCu05Q1uGRHmOhHe1r6emZoKyFw==",
             "dev": true
         },
+        "normalize-url": {
+            "version": "8.0.0",
+            "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-8.0.0.tgz",
+            "integrity": "sha512-uVFpKhj5MheNBJRTiMZ9pE/7hD1QTeEvugSJW/OmLzAp78PB5O6adfMNTvmfKhXBkvCzC+rqifWcVYpGFwTjnw=="
+        },
         "notp": {
             "version": "2.0.3",
             "resolved": "https://registry.npmjs.org/notp/-/notp-2.0.3.tgz",
@@ -26437,12 +30187,12 @@
             }
         },
         "number-allocator": {
-            "version": "1.0.12",
-            "resolved": "https://registry.npmjs.org/number-allocator/-/number-allocator-1.0.12.tgz",
-            "integrity": "sha512-sGB0qoQGmKimery9JubBQ9pQUr1V/LixJAk3Ygp7obZf6mpSXime8d7XHEobbIimkdZpgjkNlLt6G7LPEWFYWg==",
+            "version": "1.0.14",
+            "resolved": "https://registry.npmjs.org/number-allocator/-/number-allocator-1.0.14.tgz",
+            "integrity": "sha512-OrL44UTVAvkKdOdRQZIJpLkAdjXGTRda052sN4sO77bKEzYYqWKMBjQvrJFzqygI99gL6Z4u2xctPW1tB8ErvA==",
             "requires": {
                 "debug": "^4.3.1",
-                "js-sdsl": "4.1.4"
+                "js-sdsl": "4.3.0"
             }
         },
         "number-is-nan": {
@@ -26474,9 +30224,9 @@
             "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg=="
         },
         "object-inspect": {
-            "version": "1.12.2",
-            "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz",
-            "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ=="
+            "version": "1.12.3",
+            "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz",
+            "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g=="
         },
         "object-keys": {
             "version": "1.1.1",
@@ -26525,9 +30275,9 @@
             }
         },
         "open": {
-            "version": "8.4.0",
-            "resolved": "https://registry.npmjs.org/open/-/open-8.4.0.tgz",
-            "integrity": "sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q==",
+            "version": "8.4.1",
+            "resolved": "https://registry.npmjs.org/open/-/open-8.4.1.tgz",
+            "integrity": "sha512-/4b7qZNhv6Uhd7jjnREh1NjnPxlTq+XNWPG88Ydkj5AILcA5m3ajvcg57pB24EQjKv0dK62XnDqk9c/hkIG5Kg==",
             "requires": {
                 "define-lazy-prop": "^2.0.0",
                 "is-docker": "^2.1.1",
@@ -26554,6 +30304,11 @@
             "integrity": "sha512-o6E5qJV5zkAbIDNhGSIlyOhScKXgQrSRMilfph0clDfM0nEnBOlKlH4sWDmG95BW/CvwNz0vmm7dJVtU2KlMiA==",
             "dev": true
         },
+        "p-cancelable": {
+            "version": "3.0.0",
+            "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-3.0.0.tgz",
+            "integrity": "sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw=="
+        },
         "p-finally": {
             "version": "1.0.0",
             "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz",
@@ -26736,9 +30491,9 @@
             "integrity": "sha512-His3Fh17Z4eg7oANLob6ZvH8xIVen3phEZh2QuyrIl4dQSDVEabNducv6ysROKpDNPSD+12tONZVWfSgMvDD9w=="
         },
         "pg-protocol": {
-            "version": "1.5.0",
-            "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.5.0.tgz",
-            "integrity": "sha512-muRttij7H8TqRNu/DxrAJQITO4Ac7RmX3Klyr/9mJEOBeIpgnF8f9jAfRz5d3XwQZl5qBjF9gLsUtMPJE0vezQ=="
+            "version": "1.6.0",
+            "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.6.0.tgz",
+            "integrity": "sha512-M+PDm637OY5WM307051+bsDia5Xej6d9IR4GwJse1qA1DIhiKlksvrneZOYQq42OM+spubpcNYEo2FcKQrDk+Q=="
         },
         "pg-types": {
             "version": "2.2.0",
@@ -26812,9 +30567,9 @@
             "dev": true
         },
         "postcss": {
-            "version": "8.4.19",
-            "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.19.tgz",
-            "integrity": "sha512-h+pbPsyhlYj6N2ozBmHhHrs9DzGmbaarbLvWipMRO7RLS+v4onj26MPFXA5OBYFxyqYhUJK456SwDcY9H2/zsA==",
+            "version": "8.4.21",
+            "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.21.tgz",
+            "integrity": "sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg==",
             "dev": true,
             "requires": {
                 "nanoid": "^3.3.4",
@@ -26835,9 +30590,9 @@
             },
             "dependencies": {
                 "js-tokens": {
-                    "version": "8.0.0",
-                    "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-8.0.0.tgz",
-                    "integrity": "sha512-PC7MzqInq9OqKyTXfIvQNcjMkODJYC8A17kAaQgeW79yfhqTWSOfjHYQ2mDDcwJ96Iibtwkfh0C7R/OvqPlgVA==",
+                    "version": "8.0.1",
+                    "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-8.0.1.tgz",
+                    "integrity": "sha512-3AGrZT6tuMm1ZWWn9mLXh7XMfi2YtiLNPALCVxBCiUVq0LD1OQMxV/AdS/s7rLJU5o9i/jBZw/N4vXXL5dm29A==",
                     "dev": true
                 }
             }
@@ -26870,9 +30625,9 @@
             "dev": true
         },
         "postcss-scss": {
-            "version": "4.0.5",
-            "resolved": "https://registry.npmjs.org/postcss-scss/-/postcss-scss-4.0.5.tgz",
-            "integrity": "sha512-F7xpB6TrXyqUh3GKdyB4Gkp3QL3DDW1+uI+gxx/oJnUt/qXI4trj5OGlp9rOKdoABGULuqtqeG+3HEVQk4DjmA==",
+            "version": "4.0.6",
+            "resolved": "https://registry.npmjs.org/postcss-scss/-/postcss-scss-4.0.6.tgz",
+            "integrity": "sha512-rLDPhJY4z/i4nVFZ27j9GqLxj1pwxE80eAzUNRMXtcpipFYIeowerzBgG3yJhMtObGEXidtIgbUpQ3eLDsf5OQ==",
             "dev": true
         },
         "postcss-selector-parser": {
@@ -27043,11 +30798,6 @@
             "integrity": "sha512-F2JHgJQ1iqwnHDcQjVBsq3n/uoaFL+iPW/eAeL7kVxy/2RrWaN4WroKjjvbsoRtv0ftelNyC01bjRhn/bhcf4A==",
             "dev": true
         },
-        "pseudomap": {
-            "version": "1.0.2",
-            "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz",
-            "integrity": "sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ=="
-        },
         "psl": {
             "version": "1.9.0",
             "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz",
@@ -27064,9 +30814,14 @@
             }
         },
         "punycode": {
-            "version": "2.1.1",
-            "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
-            "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A=="
+            "version": "2.3.0",
+            "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz",
+            "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA=="
+        },
+        "q": {
+            "version": "1.5.1",
+            "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz",
+            "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw=="
         },
         "qlobber": {
             "version": "5.0.3",
@@ -27170,10 +30925,12 @@
             }
         },
         "qs": {
-            "version": "6.5.3",
-            "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz",
-            "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==",
-            "devOptional": true
+            "version": "6.10.4",
+            "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.4.tgz",
+            "integrity": "sha512-OQiU+C+Ds5qiH91qh/mg0w+8nwQuLjM4F4M/PbmhDOoYehPh+Fb0bDjtR1sOvy7YKxvj28Y/M0PhP5uVX0kB+g==",
+            "requires": {
+                "side-channel": "^1.0.4"
+            }
         },
         "querystringify": {
             "version": "2.2.0",
@@ -27188,10 +30945,9 @@
             "dev": true
         },
         "quick-lru": {
-            "version": "4.0.1",
-            "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz",
-            "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==",
-            "dev": true
+            "version": "5.1.1",
+            "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz",
+            "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA=="
         },
         "radius": {
             "version": "1.1.4",
@@ -27318,30 +31074,30 @@
             }
         },
         "rechoir": {
-            "version": "0.7.0",
-            "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.7.0.tgz",
-            "integrity": "sha512-ADsDEH2bvbjltXEP+hTIAmeFekTFK0V2BTxMkok6qILyAJEXV0AFfoWcAq4yfll5VdIMd/RVXq0lR+wQi5ZU3Q==",
+            "version": "0.8.0",
+            "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.8.0.tgz",
+            "integrity": "sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==",
             "requires": {
-                "resolve": "^1.9.0"
+                "resolve": "^1.20.0"
             }
         },
         "redbean-node": {
-            "version": "0.1.4",
-            "resolved": "https://registry.npmjs.org/redbean-node/-/redbean-node-0.1.4.tgz",
-            "integrity": "sha512-c1U6wnTeWS0c44tn9hkJWzjGgckLNJ8sN1E2bxnnnQsULOfvEVFLf8dLMjqhyyMrZ1L1mp8UvV4OfhRtH/ZrgQ==",
+            "version": "0.2.0",
+            "resolved": "https://registry.npmjs.org/redbean-node/-/redbean-node-0.2.0.tgz",
+            "integrity": "sha512-bHbNgVpkLOn7i/kvfvGDVGzfDgvf20qVRm4EvQV9tD2V2nhcegYUITzAF3XSL2XVirrb5vmWy85vxM44faBnYw==",
             "requires": {
                 "@types/node": "^14.18.12",
                 "await-lock": "^2.1.0",
                 "dayjs": "^1.11.0",
                 "glob": "^7.2.0",
-                "knex": "^0.95.15",
+                "knex": "^2.4.0",
                 "lodash": "^4.17.21"
             },
             "dependencies": {
                 "@types/node": {
-                    "version": "14.18.33",
-                    "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.33.tgz",
-                    "integrity": "sha512-qelS/Ra6sacc4loe/3MSjXNL1dNQ/GjxNHVzuChwMfmk7HuycRLVQN2qNY3XahK+fZc5E2szqQSKUyAF0E+2bg=="
+                    "version": "14.18.36",
+                    "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.36.tgz",
+                    "integrity": "sha512-FXKWbsJ6a1hIrRxv+FoukuHnGTgEzKYGi7kilfMae96AL9UNkPFNWJEEYWzdRI9ooIkbr4AKldyuSTLql06vLQ=="
                 }
             }
         },
@@ -27355,6 +31111,19 @@
                 "strip-indent": "^3.0.0"
             }
         },
+        "redis": {
+            "version": "4.5.1",
+            "resolved": "https://registry.npmjs.org/redis/-/redis-4.5.1.tgz",
+            "integrity": "sha512-oxXSoIqMJCQVBTfxP6BNTCtDMyh9G6Vi5wjdPdV/sRKkufyZslDqCScSGcOr6XGR/reAWZefz7E4leM31RgdBA==",
+            "requires": {
+                "@redis/bloom": "1.1.0",
+                "@redis/client": "1.4.2",
+                "@redis/graph": "1.1.0",
+                "@redis/json": "1.0.4",
+                "@redis/search": "1.1.0",
+                "@redis/time-series": "1.0.4"
+            }
+        },
         "regenerate": {
             "version": "1.4.2",
             "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz",
@@ -27401,25 +31170,19 @@
             "dev": true
         },
         "regexpu-core": {
-            "version": "5.2.2",
-            "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.2.2.tgz",
-            "integrity": "sha512-T0+1Zp2wjF/juXMrMxHxidqGYn8U4R+zleSJhX9tQ1PUsS8a9UtYfbsF9LdiVgNX3kiX8RNaKM42nfSgvFJjmw==",
+            "version": "5.3.0",
+            "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.3.0.tgz",
+            "integrity": "sha512-ZdhUQlng0RoscyW7jADnUZ25F5eVtHdMyXSb2PiwafvteRAOJUjFoUPEYZSIfP99fBIs3maLIRfpEddT78wAAQ==",
             "dev": true,
             "requires": {
+                "@babel/regjsgen": "^0.8.0",
                 "regenerate": "^1.4.2",
                 "regenerate-unicode-properties": "^10.1.0",
-                "regjsgen": "^0.7.1",
                 "regjsparser": "^0.9.1",
                 "unicode-match-property-ecmascript": "^2.0.0",
                 "unicode-match-property-value-ecmascript": "^2.1.0"
             }
         },
-        "regjsgen": {
-            "version": "0.7.1",
-            "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.7.1.tgz",
-            "integrity": "sha512-RAt+8H2ZEzHeYWxZ3H2z6tF18zyyOnlcdaafLrm21Bguj7uZy6ULibiAFdXEtKQY4Sy7wDTwDiOazasMLc4KPA==",
-            "dev": true
-        },
         "regjsparser": {
             "version": "0.9.1",
             "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz",
@@ -27504,6 +31267,12 @@
                         "verror": "1.10.0"
                     }
                 },
+                "qs": {
+                    "version": "6.5.3",
+                    "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz",
+                    "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==",
+                    "optional": true
+                },
                 "uuid": {
                     "version": "3.4.0",
                     "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz",
@@ -27554,6 +31323,11 @@
                 "supports-preserve-symlinks-flag": "^1.0.0"
             }
         },
+        "resolve-alpn": {
+            "version": "1.2.1",
+            "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz",
+            "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g=="
+        },
         "resolve-cwd": {
             "version": "3.0.0",
             "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz",
@@ -27578,11 +31352,19 @@
             "dev": true
         },
         "resolve.exports": {
-            "version": "1.1.0",
-            "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-1.1.0.tgz",
-            "integrity": "sha512-J1l+Zxxp4XK3LUDZ9m60LRJF/mAe4z6a4xyabPHk7pvK5t35dACV32iIjJDFeWZFfZlO29w6SZ67knR0tHzJtQ==",
+            "version": "1.1.1",
+            "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-1.1.1.tgz",
+            "integrity": "sha512-/NtpHNDN7jWhAaQ9BvBUYZ6YTXsRBgfqWFWP7BZBaoMJO/I3G5OFzvTuWNlZC3aPjins1F+TNrLKsGbH4rfsRQ==",
             "dev": true
         },
+        "responselike": {
+            "version": "3.0.0",
+            "resolved": "https://registry.npmjs.org/responselike/-/responselike-3.0.0.tgz",
+            "integrity": "sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg==",
+            "requires": {
+                "lowercase-keys": "^3.0.0"
+            }
+        },
         "restore-cursor": {
             "version": "3.1.0",
             "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz",
@@ -27628,12 +31410,13 @@
             }
         },
         "rollup-plugin-visualizer": {
-            "version": "5.8.3",
-            "resolved": "https://registry.npmjs.org/rollup-plugin-visualizer/-/rollup-plugin-visualizer-5.8.3.tgz",
-            "integrity": "sha512-QGJk4Bqe4AOat5AjipOh8esZH1nck5X2KFpf4VytUdSUuuuSwvIQZjMGgjcxe/zXexltqaXp5Vx1V3LmnQH15Q==",
+            "version": "5.9.0",
+            "resolved": "https://registry.npmjs.org/rollup-plugin-visualizer/-/rollup-plugin-visualizer-5.9.0.tgz",
+            "integrity": "sha512-bbDOv47+Bw4C/cgs0czZqfm8L82xOZssk4ayZjG40y9zbXclNk7YikrZTDao6p7+HDiGxrN0b65SgZiVm9k1Cg==",
             "dev": true,
             "requires": {
                 "open": "^8.4.0",
+                "picomatch": "^2.3.1",
                 "source-map": "^0.7.4",
                 "yargs": "^17.5.1"
             },
@@ -27739,9 +31522,9 @@
             }
         },
         "rxjs": {
-            "version": "7.5.7",
-            "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.5.7.tgz",
-            "integrity": "sha512-z9MzKh/UcOqB3i20H6rtrlaE/CgjLOvheWK/9ILrbhROGTweAi1BaFsTT9FbwZi5Trr1qNRs+MXkhmR06awzQA==",
+            "version": "7.8.0",
+            "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.0.tgz",
+            "integrity": "sha512-F2+gxDshqmIub1KdvZkaEfGDwLNpPvk9Fs6LD/MyQxNgMds/WH9OdDDXOmxUZpME+iSK3rQCctkL0DYyytUqMg==",
             "dev": true,
             "requires": {
                 "tslib": "^2.1.0"
@@ -27772,6 +31555,15 @@
             "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
             "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
         },
+        "saslprep": {
+            "version": "1.0.3",
+            "resolved": "https://registry.npmjs.org/saslprep/-/saslprep-1.0.3.tgz",
+            "integrity": "sha512-/MY/PEMbk2SuY5sScONwhUDsV2p77Znkb/q3nSVstq/yQzYJOH/Azh29p9oJLsl3LnQwSvZDKagDGBsBwSooag==",
+            "optional": true,
+            "requires": {
+                "sparse-bitfield": "^3.0.3"
+            }
+        },
         "sass": {
             "version": "1.42.1",
             "resolved": "https://registry.npmjs.org/sass/-/sass-1.42.1.tgz",
@@ -27781,6 +31573,11 @@
                 "chokidar": ">=3.0.0 <4.0.0"
             }
         },
+        "sax": {
+            "version": "1.2.4",
+            "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz",
+            "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw=="
+        },
         "saxes": {
             "version": "5.0.1",
             "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz",
@@ -27790,6 +31587,21 @@
                 "xmlchars": "^2.2.0"
             }
         },
+        "sb-promise-queue": {
+            "version": "2.1.0",
+            "resolved": "https://registry.npmjs.org/sb-promise-queue/-/sb-promise-queue-2.1.0.tgz",
+            "integrity": "sha512-zwq4YuP1FQFkGx2Q7GIkZYZ6PqWpV+bg0nIO1sJhWOyGyhqbj0MsTvK6lCFo5TQwX5pZr6SCQ75e8PCDCuNvkg==",
+            "dev": true
+        },
+        "sb-scandir": {
+            "version": "3.1.0",
+            "resolved": "https://registry.npmjs.org/sb-scandir/-/sb-scandir-3.1.0.tgz",
+            "integrity": "sha512-70BVm2xz9jn94zSQdpvYrEG101/UV9TVGcfWr9T5iob3QhCK4lYXeculfBqPGFv3XTeKgx4dpWyYIDeZUqo4kg==",
+            "dev": true,
+            "requires": {
+                "sb-promise-queue": "^2.1.0"
+            }
+        },
         "semver": {
             "version": "6.3.0",
             "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
@@ -27873,10 +31685,16 @@
             "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
             "dev": true
         },
+        "shell-escape": {
+            "version": "0.2.0",
+            "resolved": "https://registry.npmjs.org/shell-escape/-/shell-escape-0.2.0.tgz",
+            "integrity": "sha512-uRRBT2MfEOyxuECseCZd28jC1AJ8hmqqneWQ4VWUTgCAFvb3wKU1jLqj6egC4Exrr88ogg3dp+zroH4wJuaXzw==",
+            "dev": true
+        },
         "shell-quote": {
-            "version": "1.7.4",
-            "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.7.4.tgz",
-            "integrity": "sha512-8o/QEhSSRb1a5i7TFR0iM4G16Z0vYB2OQVs4G3aAFXjn3T6yEx8AZxy1PgDF7I00LZHYA3WxaSYIf5e5sAX8Rw==",
+            "version": "1.8.0",
+            "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.0.tgz",
+            "integrity": "sha512-QHsz8GgQIGKlRi24yFc6a6lN69Idnx634w49ay6+jA5yFh7a1UY+4Rp6HPx/L/1zcEDPEij8cIsiqR6bQsE5VQ==",
             "dev": true
         },
         "side-channel": {
@@ -27978,9 +31796,9 @@
             }
         },
         "socket.io-parser": {
-            "version": "4.2.1",
-            "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.1.tgz",
-            "integrity": "sha512-V4GrkLy+HeF1F/en3SpUaM+7XxYXpuMUWLGde1kSSh5nQMN4hLrbPIkD+otwh6q9R6NOQBN4AMaOZ2zVjui82g==",
+            "version": "4.2.2",
+            "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.2.tgz",
+            "integrity": "sha512-DJtziuKypFkMMHCm2uIshOYC7QaylbtzQwiMYDuCKy3OPkjLzu4B2vAhTlqipRHHzrI0NJeBAizTK7X+6m1jVw==",
             "requires": {
                 "@socket.io/component-emitter": "~3.1.0",
                 "debug": "~4.3.1"
@@ -28039,6 +31857,15 @@
             "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==",
             "dev": true
         },
+        "sparse-bitfield": {
+            "version": "3.0.3",
+            "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz",
+            "integrity": "sha512-kvzhi7vqKTfkh0PZU+2D2PIllw2ymqJKujUcyPMd9Y75Nv4nPbGJZXNhxsgdQab2BmlDct1YnfQCguEvHr7VsQ==",
+            "optional": true,
+            "requires": {
+                "memory-pager": "^1.0.2"
+            }
+        },
         "spawn-command": {
             "version": "0.0.2-1",
             "resolved": "https://registry.npmjs.org/spawn-command/-/spawn-command-0.0.2-1.tgz",
@@ -28101,6 +31928,18 @@
             "resolved": "https://registry.npmjs.org/sqlstring/-/sqlstring-2.3.3.tgz",
             "integrity": "sha512-qC9iz2FlN7DQl3+wjwn3802RTyjCx7sDvfQEXchwa6CWOx07/WVfh91gBmQ9fahw8snwGEWU3xGzOt4tFyHLxg=="
         },
+        "ssh2": {
+            "version": "1.11.0",
+            "resolved": "https://registry.npmjs.org/ssh2/-/ssh2-1.11.0.tgz",
+            "integrity": "sha512-nfg0wZWGSsfUe/IBJkXVll3PEZ//YH2guww+mP88gTpuSU4FtZN7zu9JoeTGOyCNx2dTDtT9fOpWwlzyj4uOOw==",
+            "dev": true,
+            "requires": {
+                "asn1": "^0.2.4",
+                "bcrypt-pbkdf": "^1.0.2",
+                "cpu-features": "~0.0.4",
+                "nan": "^2.16.0"
+            }
+        },
         "sshpk": {
             "version": "1.17.0",
             "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz",
@@ -28175,6 +32014,44 @@
                 "strip-ansi": "^6.0.0"
             }
         },
+        "string-to-stream": {
+            "version": "1.1.1",
+            "resolved": "https://registry.npmjs.org/string-to-stream/-/string-to-stream-1.1.1.tgz",
+            "integrity": "sha512-QySF2+3Rwq0SdO3s7BAp4x+c3qsClpPQ6abAmb0DGViiSBAkT5kL6JT2iyzEVP+T1SmzHrQD1TwlP9QAHCc+Sw==",
+            "requires": {
+                "inherits": "^2.0.1",
+                "readable-stream": "^2.1.0"
+            },
+            "dependencies": {
+                "isarray": {
+                    "version": "1.0.0",
+                    "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
+                    "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ=="
+                },
+                "readable-stream": {
+                    "version": "2.3.7",
+                    "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
+                    "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
+                    "requires": {
+                        "core-util-is": "~1.0.0",
+                        "inherits": "~2.0.3",
+                        "isarray": "~1.0.0",
+                        "process-nextick-args": "~2.0.0",
+                        "safe-buffer": "~5.1.1",
+                        "string_decoder": "~1.1.1",
+                        "util-deprecate": "~1.0.1"
+                    }
+                },
+                "string_decoder": {
+                    "version": "1.1.1",
+                    "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
+                    "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+                    "requires": {
+                        "safe-buffer": "~5.1.0"
+                    }
+                }
+            }
+        },
         "string-width": {
             "version": "4.2.3",
             "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
@@ -28240,6 +32117,12 @@
             "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
             "dev": true
         },
+        "strnum": {
+            "version": "1.0.5",
+            "resolved": "https://registry.npmjs.org/strnum/-/strnum-1.0.5.tgz",
+            "integrity": "sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==",
+            "optional": true
+        },
         "style-search": {
             "version": "0.1.0",
             "resolved": "https://registry.npmjs.org/style-search/-/style-search-0.1.0.tgz",
@@ -28407,9 +32290,9 @@
             },
             "dependencies": {
                 "ajv": {
-                    "version": "8.11.2",
-                    "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.2.tgz",
-                    "integrity": "sha512-E4bfmKAhGiSTvMfL1Myyycaub+cUEU2/IvpylXkUu7CHBkBj1f/ikdzbD7YQ6FKUbixDxeYvB/xY4fvyroDlQg==",
+                    "version": "8.12.0",
+                    "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz",
+                    "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==",
                     "dev": true,
                     "requires": {
                         "fast-deep-equal": "^3.1.1",
@@ -28462,16 +32345,23 @@
             }
         },
         "tar": {
-            "version": "6.1.12",
-            "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.12.tgz",
-            "integrity": "sha512-jU4TdemS31uABHd+Lt5WEYJuzn+TJTCBLljvIAHZOz6M9Os5pJ4dD+vRFLxPa/n3T0iEFzpi+0x1UfuDZYbRMw==",
+            "version": "6.1.13",
+            "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.13.tgz",
+            "integrity": "sha512-jdIBIN6LTIe2jqzay/2vtYLlBHa3JF42ot3h1dW8Q0PaAG4v8rm0cvpVePtau5C6OKXGGcgO9q2AMNSWxiLqKw==",
             "requires": {
                 "chownr": "^2.0.0",
                 "fs-minipass": "^2.0.0",
-                "minipass": "^3.0.0",
+                "minipass": "^4.0.0",
                 "minizlib": "^2.1.1",
                 "mkdirp": "^1.0.3",
                 "yallist": "^4.0.0"
+            },
+            "dependencies": {
+                "yallist": {
+                    "version": "4.0.0",
+                    "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+                    "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
+                }
             }
         },
         "tarn": {
@@ -28586,9 +32476,9 @@
             "integrity": "sha512-OEI0IWCe+Dw46019YLl6V10Us5bi574EvlJEOcAkB29IzQ/mYD1A6RyNHLjZPiHCmuodxvgF6U+vZO1L15lxVA=="
         },
         "throat": {
-            "version": "6.0.1",
-            "resolved": "https://registry.npmjs.org/throat/-/throat-6.0.1.tgz",
-            "integrity": "sha512-8hmiGIJMDlwjg7dlJ4yKGLK8EsYqKgPWbG3b4wjJddKNwc7N7Dpn08Df4szr/sZdMVeOstrdYSsqzX6BYbcB+w==",
+            "version": "6.0.2",
+            "resolved": "https://registry.npmjs.org/throat/-/throat-6.0.2.tgz",
+            "integrity": "sha512-WKexMoJj3vEuK0yFEapj8y64V0A6xcuPuK9Gt1d0R+dzCSJc0lHqQytAbSB4cDAK0dWh4T0E2ETkoLE2WZ41OQ==",
             "dev": true
         },
         "throttleit": {
@@ -28694,9 +32584,9 @@
             "dev": true
         },
         "tslib": {
-            "version": "2.4.1",
-            "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz",
-            "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA=="
+            "version": "2.5.0",
+            "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz",
+            "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg=="
         },
         "tunnel": {
             "version": "0.0.6",
@@ -28749,6 +32639,16 @@
                 "mime-types": "~2.1.24"
             }
         },
+        "typed-array-length": {
+            "version": "1.0.4",
+            "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz",
+            "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==",
+            "requires": {
+                "call-bind": "^1.0.2",
+                "for-each": "^0.3.3",
+                "is-typed-array": "^1.1.9"
+            }
+        },
         "typedarray": {
             "version": "0.0.6",
             "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz",
@@ -28780,6 +32680,11 @@
                 "which-boxed-primitive": "^1.0.2"
             }
         },
+        "underscore": {
+            "version": "1.13.6",
+            "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.6.tgz",
+            "integrity": "sha512-+A5Sja4HP1M08MaXya7p5LvjuM7K6q/2EaC0+iovj/wOcMsTzMvDFbasi/oSapiwOlt252IqsKqPjCl7huKS0A=="
+        },
         "unicode-canonical-property-names-ecmascript": {
             "version": "2.0.0",
             "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz",
@@ -28927,6 +32832,11 @@
                 "spdx-expression-parse": "^3.0.0"
             }
         },
+        "varint": {
+            "version": "6.0.0",
+            "resolved": "https://registry.npmjs.org/varint/-/varint-6.0.0.tgz",
+            "integrity": "sha512-cXEIW6cfr15lFv563k4GuVuW/fiwjknytD37jIOLSdSWuOI6WnO/oKwmP2FQTU2l01LP8/M5TSAJpzUaGe3uWg=="
+        },
         "vary": {
             "version": "1.1.2",
             "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
@@ -29204,6 +33114,15 @@
                     "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
                     "dev": true
                 },
+                "lru-cache": {
+                    "version": "6.0.0",
+                    "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+                    "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+                    "dev": true,
+                    "requires": {
+                        "yallist": "^4.0.0"
+                    }
+                },
                 "semver": {
                     "version": "7.3.8",
                     "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz",
@@ -29212,6 +33131,12 @@
                     "requires": {
                         "lru-cache": "^6.0.0"
                     }
+                },
+                "yallist": {
+                    "version": "4.0.0",
+                    "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+                    "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
+                    "dev": true
                 }
             }
         },
@@ -29237,9 +33162,9 @@
             }
         },
         "vue-multiselect": {
-            "version": "3.0.0-alpha.2",
-            "resolved": "https://registry.npmjs.org/vue-multiselect/-/vue-multiselect-3.0.0-alpha.2.tgz",
-            "integrity": "sha512-Xp9fGJECns45v+v8jXbCIsAkCybYkEg0lNwr7Z6HDUSMyx2TEIK2giipPE+qXiShEc1Ipn+ZtttH2iq9hwXP4Q==",
+            "version": "3.0.0-beta.1",
+            "resolved": "https://registry.npmjs.org/vue-multiselect/-/vue-multiselect-3.0.0-beta.1.tgz",
+            "integrity": "sha512-V+jpydtjyHcQ+yjHsEWEBrDAopOx/pufNkSAXNVDAGQ+ESDEJ7wYejNd9H1RiCnFOYK4yf1XSGqE+Mp3HJXmdg==",
             "dev": true
         },
         "vue-prism-editor": {
@@ -29323,15 +33248,15 @@
                     }
                 },
                 "joi": {
-                    "version": "17.7.0",
-                    "resolved": "https://registry.npmjs.org/joi/-/joi-17.7.0.tgz",
-                    "integrity": "sha512-1/ugc8djfn93rTE3WRKdCzGGt/EtiYKxITMO4Wiv6q5JL1gl9ePt4kBsl1S499nbosspfctIQTpYIhSmHA3WAg==",
+                    "version": "17.7.1",
+                    "resolved": "https://registry.npmjs.org/joi/-/joi-17.7.1.tgz",
+                    "integrity": "sha512-teoLhIvWE298R6AeJywcjR4sX2hHjB3/xJX4qPjg+gTg+c0mzUDsziYlqPmLomq9gVsfaMcgPaGc7VxtD/9StA==",
                     "dev": true,
                     "requires": {
                         "@hapi/hoek": "^9.0.0",
                         "@hapi/topo": "^5.0.0",
                         "@sideway/address": "^4.1.3",
-                        "@sideway/formula": "^3.0.0",
+                        "@sideway/formula": "^3.0.1",
                         "@sideway/pinpoint": "^2.0.0"
                     }
                 }
@@ -29416,6 +33341,19 @@
             "integrity": "sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q==",
             "dev": true
         },
+        "which-typed-array": {
+            "version": "1.1.9",
+            "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.9.tgz",
+            "integrity": "sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==",
+            "requires": {
+                "available-typed-arrays": "^1.0.5",
+                "call-bind": "^1.0.2",
+                "for-each": "^0.3.3",
+                "gopd": "^1.0.1",
+                "has-tostringtag": "^1.0.0",
+                "is-typed-array": "^1.1.10"
+            }
+        },
         "wide-align": {
             "version": "1.1.5",
             "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz",
@@ -29491,6 +33429,11 @@
             "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==",
             "dev": true
         },
+        "xmlbuilder": {
+            "version": "8.2.2",
+            "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-8.2.2.tgz",
+            "integrity": "sha512-eKRAFz04jghooy8muekqzo8uCSVNeyRedbuJrp0fovbLIi7wlsYtdUn3vBAAPq2Y3/0xMz2WMEUQ8yhVVO9Stw=="
+        },
         "xmlchars": {
             "version": "2.2.0",
             "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz",
@@ -29502,6 +33445,15 @@
             "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-2.0.0.tgz",
             "integrity": "sha512-QKxVRxiRACQcVuQEYFsI1hhkrMlrXHPegbbd1yn9UHOmRxY+si12nQYzri3vbzt8VdTTRviqcKxcyllFas5z2A=="
         },
+        "xmlrpc": {
+            "version": "1.3.2",
+            "resolved": "https://registry.npmjs.org/xmlrpc/-/xmlrpc-1.3.2.tgz",
+            "integrity": "sha512-jQf5gbrP6wvzN71fgkcPPkF4bF/Wyovd7Xdff8d6/ihxYmgETQYSuTc+Hl+tsh/jmgPLro/Aro48LMFlIyEKKQ==",
+            "requires": {
+                "sax": "1.2.x",
+                "xmlbuilder": "8.2.x"
+            }
+        },
         "xtend": {
             "version": "4.0.2",
             "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz",
@@ -29513,9 +33465,10 @@
             "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA=="
         },
         "yallist": {
-            "version": "4.0.0",
-            "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
-            "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
+            "version": "3.1.1",
+            "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
+            "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==",
+            "dev": true
         },
         "yaml": {
             "version": "1.10.2",
diff --git a/package.json b/package.json
index 18ae4770f..a3f6066b9 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
 {
     "name": "uptime-kuma",
-    "version": "1.19.2",
+    "version": "1.20.1",
     "license": "MIT",
     "repository": {
         "type": "git",
@@ -31,6 +31,7 @@
         "build-docker": "npm run build && npm run build-docker-debian && npm run build-docker-alpine",
         "build-docker-alpine-base": "docker buildx build -f docker/alpine-base.dockerfile --platform linux/amd64,linux/arm64,linux/arm/v7 -t louislam/uptime-kuma:base-alpine . --push",
         "build-docker-debian-base": "docker buildx build -f docker/debian-base.dockerfile --platform linux/amd64,linux/arm64,linux/arm/v7 -t louislam/uptime-kuma:base-debian . --push",
+        "build-docker-builder-go": "docker buildx build -f docker/builder-go.dockerfile --platform linux/amd64,linux/arm64,linux/arm/v7 -t louislam/uptime-kuma:builder-go . --push",
         "build-docker-alpine": "node ./extra/env2arg.js docker buildx build -f docker/dockerfile-alpine --platform linux/amd64,linux/arm64,linux/arm/v7 -t louislam/uptime-kuma:alpine -t louislam/uptime-kuma:1-alpine -t louislam/uptime-kuma:$VERSION-alpine --target release . --push",
         "build-docker-debian": "node ./extra/env2arg.js docker buildx build -f docker/dockerfile --platform linux/amd64,linux/arm64,linux/arm/v7 -t louislam/uptime-kuma -t louislam/uptime-kuma:1 -t louislam/uptime-kuma:$VERSION -t louislam/uptime-kuma:debian -t louislam/uptime-kuma:1-debian -t louislam/uptime-kuma:$VERSION-debian --target release . --push",
         "build-docker-nightly": "npm run build && docker buildx build -f docker/dockerfile --platform linux/amd64,linux/arm64,linux/arm/v7 -t louislam/uptime-kuma:nightly --target nightly . --push",
@@ -38,7 +39,7 @@
         "build-docker-nightly-amd64": "docker buildx build -f docker/dockerfile --platform linux/amd64 -t louislam/uptime-kuma:nightly-amd64 --target nightly . --push --progress plain",
         "build-docker-pr-test": "docker buildx build -f docker/dockerfile --platform linux/amd64,linux/arm64 -t louislam/uptime-kuma:pr-test --target pr-test . --push",
         "upload-artifacts": "docker buildx build -f docker/dockerfile --platform linux/amd64 -t louislam/uptime-kuma:upload-artifact --build-arg VERSION --build-arg GITHUB_TOKEN --target upload-artifact . --progress plain",
-        "setup": "git checkout 1.19.2 && npm ci --production && npm run download-dist",
+        "setup": "git checkout 1.20.1 && npm ci --production && npm run download-dist",
         "download-dist": "node extra/download-dist.js",
         "mark-as-nightly": "node extra/mark-as-nightly.js",
         "reset-password": "node extra/reset-password.js",
@@ -60,11 +61,14 @@
         "start-pr-test": "node extra/checkout-pr.js && npm install && npm run dev",
         "cy:test": "node test/prepare-test-server.js && node server/server.js --port=3002 --data-dir=./data/test/ --e2e",
         "cy:run": "npx cypress run --browser chrome --headless --config-file ./config/cypress.config.js",
+        "cy:run:unit": "npx cypress run --browser chrome --headless --config-file ./config/cypress.frontend.config.js",
         "cypress-open": "concurrently -k -r \"node test/prepare-test-server.js && node server/server.js --port=3002 --data-dir=./data/test/\" \"cypress open --config-file ./config/cypress.config.js\"",
-        "build-healthcheck-armv7": "cross-env GOOS=linux GOARCH=arm GOARM=7 go build -x -o ./extra/healthcheck-armv7 ./extra/healthcheck.go"
+        "build-healthcheck-armv7": "cross-env GOOS=linux GOARCH=arm GOARM=7 go build -x -o ./extra/healthcheck-armv7 ./extra/healthcheck.go",
+        "depoly-demo-server": "node extra/deploy-demo-server.js"
     },
     "dependencies": {
         "@grpc/grpc-js": "~1.7.3",
+        "@louislam/ping": "~0.4.2-mod.1",
         "@louislam/sqlite3": "15.1.2",
         "args-parser": "~1.3.0",
         "axios": "~0.27.0",
@@ -81,18 +85,21 @@
         "compare-versions": "~3.6.0",
         "compression": "~1.7.4",
         "dayjs": "~1.11.5",
+        "dotenv": "~16.0.3",
         "express": "~4.17.3",
         "express-basic-auth": "~1.2.1",
         "express-static-gzip": "~2.1.7",
         "form-data": "~4.0.0",
+        "gamedig": "^4.0.5",
         "http-graceful-shutdown": "~3.1.7",
         "http-proxy-agent": "~5.0.0",
         "https-proxy-agent": "~5.0.1",
         "iconv-lite": "~0.6.3",
         "jsesc": "~3.0.2",
-        "jsonwebtoken": "~8.5.1",
+        "jsonwebtoken": "~9.0.0",
         "jwt-decode": "~3.1.2",
         "limiter": "~2.1.0",
+        "mongodb": "~4.13.0",
         "mqtt": "~4.3.7",
         "mssql": "~8.1.4",
         "mysql2": "~2.3.3",
@@ -106,7 +113,9 @@
         "prom-client": "~13.2.0",
         "prometheus-api-metrics": "~3.2.1",
         "protobufjs": "~7.1.1",
-        "redbean-node": "0.1.4",
+        "qs": "~6.10.4",
+        "redbean-node": "~0.2.0",
+        "redis": "~4.5.1",
         "socket.io": "~4.5.3",
         "socket.io-client": "~4.5.3",
         "socks-proxy-agent": "6.1.1",
@@ -139,10 +148,13 @@
         "cypress": "^10.1.0",
         "delay": "^5.0.0",
         "dns2": "~2.0.1",
+        "dompurify": "~2.4.3",
         "eslint": "~8.14.0",
         "eslint-plugin-vue": "~8.7.1",
         "favico.js": "~0.3.10",
         "jest": "~27.2.5",
+        "marked": "~4.2.5",
+        "node-ssh": "~13.0.1",
         "postcss-html": "~1.5.0",
         "postcss-rtlcss": "~3.7.2",
         "postcss-scss": "~4.0.4",
diff --git a/server/auth.js b/server/auth.js
index 3ce1a6041..fd19b0e44 100644
--- a/server/auth.js
+++ b/server/auth.js
@@ -63,6 +63,12 @@ function myAuthorizer(username, password, callback) {
     });
 }
 
+/**
+ * Use basic auth if auth is not disabled
+ * @param {express.Request} req Express request object
+ * @param {express.Response} res Express response object
+ * @param {express.NextFunction} next
+ */
 exports.basicAuth = async function (req, res, next) {
     const middleware = basicAuth({
         authorizer: myAuthorizer,
diff --git a/server/cacheable-dns-http-agent.js b/server/cacheable-dns-http-agent.js
index 301367918..cc067f72b 100644
--- a/server/cacheable-dns-http-agent.js
+++ b/server/cacheable-dns-http-agent.js
@@ -37,6 +37,10 @@ class CacheableDnsHttpAgent {
         this.enable = isEnable;
     }
 
+    /**
+     * Attach cacheable to HTTP agent
+     * @param {http.Agent} agent Agent to install
+     */
     static install(agent) {
         this.cacheable.install(agent);
     }
diff --git a/server/config.js b/server/config.js
index d46f24b75..43a40f672 100644
--- a/server/config.js
+++ b/server/config.js
@@ -4,13 +4,21 @@ const demoMode = args["demo"] || false;
 const badgeConstants = {
     naColor: "#999",
     defaultUpColor: "#66c20a",
+    defaultWarnColor: "#eed202",
     defaultDownColor: "#c2290a",
+    defaultPendingColor: "#f8a306",
+    defaultMaintenanceColor: "#1747f5",
     defaultPingColor: "blue",  // as defined by badge-maker / shields.io
     defaultStyle: "flat",
     defaultPingValueSuffix: "ms",
     defaultPingLabelSuffix: "h",
     defaultUptimeValueSuffix: "%",
     defaultUptimeLabelSuffix: "h",
+    defaultCertExpValueSuffix: " days",
+    defaultCertExpLabelSuffix: "h",
+    // Values Come From Default Notification Times
+    defaultCertExpireWarnDays: "14",
+    defaultCertExpireDownDays: "7"
 };
 
 module.exports = {
diff --git a/server/database.js b/server/database.js
index 2544f1972..575827f34 100644
--- a/server/database.js
+++ b/server/database.js
@@ -4,6 +4,7 @@ const { setSetting, setting } = require("./util-server");
 const { log, sleep } = require("../src/util");
 const dayjs = require("dayjs");
 const knex = require("knex");
+const { PluginsManager } = require("./plugins-manager");
 
 /**
  * Database & App Data Folder
@@ -65,7 +66,11 @@ class Database {
         "patch-grpc-monitor.sql": true,
         "patch-add-radius-monitor.sql": true,
         "patch-monitor-add-resend-interval.sql": true,
+        "patch-ping-packet-size.sql": true,
         "patch-maintenance-table2.sql": true,
+        "patch-add-gamedig-monitor.sql": true,
+        "patch-add-google-analytics-status-page-tag.sql": true,
+        "patch-http-body-encoding.sql": true
     };
 
     /**
@@ -83,6 +88,13 @@ class Database {
     static init(args) {
         // Data Directory (must be end with "/")
         Database.dataDir = process.env.DATA_DIR || args["data-dir"] || "./data/";
+
+        // Plugin feature is working only if the dataDir = "./data";
+        if (Database.dataDir !== "./data/") {
+            log.warn("PLUGIN", "Warning: In order to enable plugin feature, you need to use the default data directory: ./data/");
+            PluginsManager.disable = true;
+        }
+
         Database.path = Database.dataDir + "kuma.db";
         if (! fs.existsSync(Database.dataDir)) {
             fs.mkdirSync(Database.dataDir, { recursive: true });
@@ -485,6 +497,16 @@ class Database {
             const shmPath = Database.path + "-shm";
             const walPath = Database.path + "-wal";
 
+            // Make sure we have a backup to restore before deleting old db
+            if (
+                !fs.existsSync(this.backupPath)
+                && !fs.existsSync(shmPath)
+                && !fs.existsSync(walPath)
+            ) {
+                log.error("db", "Backup file not found! Leaving database in failed state.");
+                process.exit(1);
+            }
+
             // Delete patch failed db
             try {
                 if (fs.existsSync(Database.path)) {
diff --git a/server/git.js b/server/git.js
new file mode 100644
index 000000000..77a12d937
--- /dev/null
+++ b/server/git.js
@@ -0,0 +1,24 @@
+const childProcess = require("child_process");
+
+class Git {
+
+    static clone(repoURL, cwd, targetDir = ".") {
+        let result = childProcess.spawnSync("git", [
+            "clone",
+            repoURL,
+            targetDir,
+        ], {
+            cwd: cwd,
+        });
+
+        if (result.status !== 0) {
+            throw new Error(result.stderr.toString("utf-8"));
+        } else {
+            return result.stdout.toString("utf-8") + result.stderr.toString("utf-8");
+        }
+    }
+}
+
+module.exports = {
+    Git,
+};
diff --git a/server/google-analytics.js b/server/google-analytics.js
new file mode 100644
index 000000000..fc9fbec84
--- /dev/null
+++ b/server/google-analytics.js
@@ -0,0 +1,24 @@
+const jsesc = require("jsesc");
+
+/**
+ * Returns a string that represents the javascript that is required to insert the Google Analytics scripts
+ * into a webpage.
+ * @param tagId Google UA/G/AW/DC Property ID to use with the Google Analytics script.
+ * @returns {string}
+ */
+function getGoogleAnalyticsScript(tagId) {
+    let escapedTagId = jsesc(tagId, { isScriptContext: true });
+
+    if (escapedTagId) {
+        escapedTagId = escapedTagId.trim();
+    }
+
+    return `
+        <script async src="https://www.googletagmanager.com/gtag/js?id=${escapedTagId}"></script>
+        <script>window.dataLayer = window.dataLayer || []; function gtag(){dataLayer.push(arguments);} gtag('js', new Date());gtag('config', '${escapedTagId}'); </script>
+    `;
+}
+
+module.exports = {
+    getGoogleAnalyticsScript,
+};
diff --git a/server/jobs.js b/server/jobs.js
index f9c7f86e9..66a276064 100644
--- a/server/jobs.js
+++ b/server/jobs.js
@@ -32,6 +32,7 @@ const initBackgroundJobs = function (args) {
     return bree;
 };
 
+/** Stop all background jobs if running */
 const stopBackgroundJobs = function () {
     if (bree) {
         bree.stop();
diff --git a/server/jobs/clear-old-data.js b/server/jobs/clear-old-data.js
index 0ec5ffa5f..ed80b0f74 100644
--- a/server/jobs/clear-old-data.js
+++ b/server/jobs/clear-old-data.js
@@ -25,15 +25,20 @@ const DEFAULT_KEEP_PERIOD = 180;
         parsedPeriod = DEFAULT_KEEP_PERIOD;
     }
 
-    log(`Clearing Data older than ${parsedPeriod} days...`);
+    if (parsedPeriod < 1) {
+        log(`Data deletion has been disabled as period is less than 1. Period is ${parsedPeriod} days.`);
+    } else {
 
-    try {
-        await R.exec(
-            "DELETE FROM heartbeat WHERE time < DATETIME('now', '-' || ? || ' days') ",
-            [ parsedPeriod ]
-        );
-    } catch (e) {
-        log(`Failed to clear old data: ${e.message}`);
+        log(`Clearing Data older than ${parsedPeriod} days...`);
+
+        try {
+            await R.exec(
+                "DELETE FROM heartbeat WHERE time < DATETIME('now', '-' || ? || ' days') ",
+                [ parsedPeriod ]
+            );
+        } catch (e) {
+            log(`Failed to clear old data: ${e.message}`);
+        }
     }
 
     exit();
diff --git a/server/model/maintenance.js b/server/model/maintenance.js
index d9be34273..45db63d13 100644
--- a/server/model/maintenance.js
+++ b/server/model/maintenance.js
@@ -112,6 +112,11 @@ class Maintenance extends BeanModel {
         return this.toPublicJSON(timezone);
     }
 
+    /**
+     * Get a list of weekdays that the maintenance is active for
+     * Monday=1, Tuesday=2 etc.
+     * @returns {number[]} Array of active weekdays
+     */
     getDayOfWeekList() {
         log.debug("timeslot", "List: " + this.weekdays);
         return JSON.parse(this.weekdays).sort(function (a, b) {
@@ -119,12 +124,20 @@ class Maintenance extends BeanModel {
         });
     }
 
+    /**
+     * Get a list of days in month that maintenance is active for
+     * @returns {number[]} Array of active days in month
+     */
     getDayOfMonthList() {
         return JSON.parse(this.days_of_month).sort(function (a, b) {
             return a - b;
         });
     }
 
+    /**
+     * Get the start date and time for maintenance
+     * @returns {dayjs.Dayjs} Start date and time
+     */
     getStartDateTime() {
         let startOfTheDay = dayjs.utc(this.start_date).format("HH:mm");
         log.debug("timeslot", "startOfTheDay: " + startOfTheDay);
@@ -137,6 +150,10 @@ class Maintenance extends BeanModel {
         return dayjs.utc(this.start_date).add(startTimeSecond, "second");
     }
 
+    /**
+     * Get the duraction of maintenance in seconds
+     * @returns {number} Duration of maintenance
+     */
     getDuration() {
         let duration = dayjs.utc(this.end_time, "HH:mm").diff(dayjs.utc(this.start_time, "HH:mm"), "second");
         // Add 24hours if it is across day
@@ -146,6 +163,12 @@ class Maintenance extends BeanModel {
         return duration;
     }
 
+    /**
+     * Convert data from socket to bean
+     * @param {Bean} bean Bean to fill in
+     * @param {Object} obj Data to fill bean with
+     * @returns {Bean} Filled bean
+     */
     static jsonToBean(bean, obj) {
         if (obj.id) {
             bean.id = obj.id;
diff --git a/server/model/maintenance_timeslot.js b/server/model/maintenance_timeslot.js
index 2babe6bca..77643c2cf 100644
--- a/server/model/maintenance_timeslot.js
+++ b/server/model/maintenance_timeslot.js
@@ -6,6 +6,11 @@ const { UptimeKumaServer } = require("../uptime-kuma-server");
 
 class MaintenanceTimeslot extends BeanModel {
 
+    /**
+     * Return an object that ready to parse to JSON for public
+     * Only show necessary data to public
+     * @returns {Object}
+     */
     async toPublicJSON() {
         const serverTimezoneOffset = UptimeKumaServer.getInstance().getTimezoneOffset();
 
@@ -21,6 +26,10 @@ class MaintenanceTimeslot extends BeanModel {
         return obj;
     }
 
+    /**
+     * Return an object that ready to parse to JSON
+     * @returns {Object}
+     */
     async toJSON() {
         return await this.toPublicJSON();
     }
diff --git a/server/model/monitor.js b/server/model/monitor.js
index 186962b08..b071a6221 100644
--- a/server/model/monitor.js
+++ b/server/model/monitor.js
@@ -3,7 +3,9 @@ const dayjs = require("dayjs");
 const axios = require("axios");
 const { Prometheus } = require("../prometheus");
 const { log, UP, DOWN, PENDING, MAINTENANCE, flipStatus, TimeLogger, MAX_INTERVAL_SECOND, MIN_INTERVAL_SECOND } = require("../../src/util");
-const { tcping, ping, dnsResolve, checkCertificate, checkStatusCode, getTotalClientInRoom, setting, mssqlQuery, postgresQuery, mysqlQuery, mqttAsync, setSetting, httpNtlm, radius, grpcQuery } = require("../util-server");
+const { tcping, ping, dnsResolve, checkCertificate, checkStatusCode, getTotalClientInRoom, setting, mssqlQuery, postgresQuery, mysqlQuery, mqttAsync, setSetting, httpNtlm, radius, grpcQuery,
+    redisPingAsync, mongodbPing,
+} = require("../util-server");
 const { R } = require("redbean-node");
 const { BeanModel } = require("redbean-node/dist/bean-model");
 const { Notification } = require("../notification");
@@ -16,6 +18,7 @@ const { CacheableDnsHttpAgent } = require("../cacheable-dns-http-agent");
 const { DockerHost } = require("../docker");
 const Maintenance = require("./maintenance");
 const { UptimeCacheList } = require("../uptime-cache-list");
+const Gamedig = require("gamedig");
 
 /**
  * status:
@@ -36,7 +39,6 @@ class Monitor extends BeanModel {
             id: this.id,
             name: this.name,
             sendUrl: this.sendUrl,
-            maintenance: await Monitor.isUnderMaintenance(this.id),
         };
 
         if (this.sendUrl) {
@@ -85,6 +87,7 @@ class Monitor extends BeanModel {
             expiryNotification: this.isEnabledExpiryNotification(),
             ignoreTls: this.getIgnoreTls(),
             upsideDown: this.isUpsideDown(),
+            packetSize: this.packetSize,
             maxredirects: this.maxredirects,
             accepted_statuscodes: this.getAcceptedStatuscodes(),
             dns_resolve_type: this.dns_resolve_type,
@@ -107,6 +110,8 @@ class Monitor extends BeanModel {
             grpcEnableTls: this.getGrpcEnableTls(),
             radiusCalledStationId: this.radiusCalledStationId,
             radiusCallingStationId: this.radiusCallingStationId,
+            game: this.game,
+            httpBodyEncoding: this.httpBodyEncoding
         };
 
         if (includeSensitiveData) {
@@ -139,7 +144,7 @@ class Monitor extends BeanModel {
      * @returns {Promise<LooseObject<any>[]>}
      */
     async getTags() {
-        return await R.getAll("SELECT mt.*, tag.name, tag.color FROM monitor_tag mt JOIN tag ON mt.tag_id = tag.id WHERE mt.monitor_id = ?", [ this.id ]);
+        return await R.getAll("SELECT mt.*, tag.name, tag.color FROM monitor_tag mt JOIN tag ON mt.tag_id = tag.id WHERE mt.monitor_id = ? ORDER BY tag.name", [ this.id ]);
     }
 
     /**
@@ -199,7 +204,7 @@ class Monitor extends BeanModel {
         let previousBeat = null;
         let retries = 0;
 
-        let prometheus = new Prometheus(this);
+        this.prometheus = new Prometheus(this);
 
         const beat = async () => {
 
@@ -268,17 +273,29 @@ class Monitor extends BeanModel {
 
                     log.debug("monitor", `[${this.name}] Prepare Options for axios`);
 
+                    let contentType = null;
+                    let bodyValue = null;
+
+                    if (this.body && !this.httpBodyEncoding || this.httpBodyEncoding === "json") {
+                        bodyValue = JSON.parse(this.body);
+                        contentType = "application/json";
+                    } else if (this.body && (this.httpBodyEncoding === "xml")) {
+                        bodyValue = this.body;
+                        contentType = "text/xml; charset=utf-8";
+                    }
+
                     // Axios Options
                     const options = {
                         url: this.url,
                         method: (this.method || "get").toLowerCase(),
-                        ...(this.body ? { data: JSON.parse(this.body) } : {}),
+                        ...(bodyValue ? { data: bodyValue } : {}),
                         timeout: this.interval * 1000 * 0.8,
                         headers: {
                             "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9",
                             "User-Agent": "Uptime-Kuma/" + version,
-                            ...(this.headers ? JSON.parse(this.headers) : {}),
+                            ...(contentType ? { "Content-Type": contentType } : {}),
                             ...(basicAuthHeader),
+                            ...(this.headers ? JSON.parse(this.headers) : {})
                         },
                         maxRedirects: this.maxredirects,
                         validateStatus: (status) => {
@@ -372,7 +389,7 @@ class Monitor extends BeanModel {
                     bean.status = UP;
 
                 } else if (this.type === "ping") {
-                    bean.ping = await ping(this.hostname);
+                    bean.ping = await ping(this.hostname, this.packetSize);
                     bean.msg = "";
                     bean.status = UP;
                 } else if (this.type === "dns") {
@@ -482,25 +499,44 @@ class Monitor extends BeanModel {
                         bean.msg = res.data.response.servers[0].name;
 
                         try {
-                            bean.ping = await ping(this.hostname);
+                            bean.ping = await ping(this.hostname, this.packetSize);
                         } catch (_) { }
                     } else {
                         throw new Error("Server not found on Steam");
                     }
+                } else if (this.type === "gamedig") {
+                    try {
+                        const state = await Gamedig.query({
+                            type: this.game,
+                            host: this.hostname,
+                            port: this.port,
+                            givenPortOnly: true,
+                        });
+
+                        bean.msg = state.name;
+                        bean.status = UP;
+                        bean.ping = state.ping;
+                    } catch (e) {
+                        throw new Error(e.message);
+                    }
                 } else if (this.type === "docker") {
-                    log.debug(`[${this.name}] Prepare Options for Axios`);
+                    log.debug("monitor", `[${this.name}] Prepare Options for Axios`);
 
                     const dockerHost = await R.load("docker_host", this.docker_host);
 
                     const options = {
                         url: `/containers/${this.docker_container}/json`,
+                        timeout: this.interval * 1000 * 0.8,
                         headers: {
                             "Accept": "*/*",
                             "User-Agent": "Uptime-Kuma/" + version,
                         },
-                        httpsAgent: new https.Agent({
+                        httpsAgent: CacheableDnsHttpAgent.getHttpsAgent({
                             maxCachedSessions: 0,      // Use Custom agent to disable session reuse (https://github.com/nodejs/node/issues/3940)
-                            rejectUnauthorized: ! this.getIgnoreTls(),
+                            rejectUnauthorized: !this.getIgnoreTls(),
+                        }),
+                        httpAgent: CacheableDnsHttpAgent.getHttpAgent({
+                            maxCachedSessions: 0,
                         }),
                     };
 
@@ -510,11 +546,13 @@ class Monitor extends BeanModel {
                         options.baseURL = DockerHost.patchDockerURL(dockerHost._dockerDaemon);
                     }
 
-                    log.debug(`[${this.name}] Axios Request`);
+                    log.debug("monitor", `[${this.name}] Axios Request`);
                     let res = await axios.request(options);
                     if (res.data.State.Running) {
                         bean.status = UP;
-                        bean.msg = "";
+                        bean.msg = res.data.State.Status;
+                    } else {
+                        throw Error("Container State is " + res.data.State.Status);
                     }
                 } else if (this.type === "mqtt") {
                     bean.msg = await mqttAsync(this.hostname, this.mqttTopic, this.mqttSuccessMessage, {
@@ -548,7 +586,7 @@ class Monitor extends BeanModel {
                     log.debug("monitor:", `gRPC response: ${JSON.stringify(response)}`);
                     let responseData = response.data;
                     if (responseData.length > 50) {
-                        responseData = response.substring(0, 47) + "...";
+                        responseData = responseData.toString().substring(0, 47) + "...";
                     }
                     if (response.code !== 1) {
                         bean.status = DOWN;
@@ -579,6 +617,15 @@ class Monitor extends BeanModel {
                     bean.msg = "";
                     bean.status = UP;
                     bean.ping = dayjs().valueOf() - startTime;
+                } else if (this.type === "mongodb") {
+                    let startTime = dayjs().valueOf();
+
+                    await mongodbPing(this.databaseConnectionString);
+
+                    bean.msg = "";
+                    bean.status = UP;
+                    bean.ping = dayjs().valueOf() - startTime;
+
                 } else if (this.type === "radius") {
                     let startTime = dayjs().valueOf();
 
@@ -615,9 +662,23 @@ class Monitor extends BeanModel {
                         }
                     }
                     bean.ping = dayjs().valueOf() - startTime;
+                } else if (this.type === "redis") {
+                    let startTime = dayjs().valueOf();
+
+                    bean.msg = await redisPingAsync(this.databaseConnectionString);
+                    bean.status = UP;
+                    bean.ping = dayjs().valueOf() - startTime;
+
+                } else if (this.type in UptimeKumaServer.monitorTypeList) {
+                    let startTime = dayjs().valueOf();
+                    const monitorType = UptimeKumaServer.monitorTypeList[this.type];
+                    await monitorType.check(this, bean);
+                    if (!bean.ping) {
+                        bean.ping = dayjs().valueOf() - startTime;
+                    }
+
                 } else {
-                    bean.msg = "Unknown Monitor Type";
-                    bean.status = PENDING;
+                    throw new Error("Unknown Monitor Type");
                 }
 
                 if (this.isUpsideDown()) {
@@ -707,7 +768,7 @@ class Monitor extends BeanModel {
             await R.store(bean);
 
             log.debug("monitor", `[${this.name}] prometheus.update`);
-            prometheus.update(bean, tlsInfo);
+            this.prometheus?.update(bean, tlsInfo);
 
             previousBeat = bean;
 
@@ -746,6 +807,13 @@ class Monitor extends BeanModel {
         }
     }
 
+    /**
+     * Make a request using axios
+     * @param {Object} options Options for Axios
+     * @param {boolean} finalCall Should this be the final call i.e
+     * don't retry on faliure
+     * @returns {Object} Axios response
+     */
     async makeAxiosRequest(options, finalCall = false) {
         try {
             let res;
@@ -785,15 +853,15 @@ class Monitor extends BeanModel {
         clearTimeout(this.heartbeatInterval);
         this.isStop = true;
 
-        this.prometheus().remove();
+        this.prometheus?.remove();
     }
 
     /**
-     * Get a new prometheus instance
-     * @returns {Prometheus}
+     * Get prometheus instance
+     * @returns {Prometheus|undefined}
      */
-    prometheus() {
-        return new Prometheus(this);
+    getPrometheus() {
+        return this.prometheus;
     }
 
     /**
@@ -1090,7 +1158,7 @@ class Monitor extends BeanModel {
                     // Prevent if the msg is undefined, notifications such as Discord cannot send out.
                     const heartbeatJSON = bean.toJSON();
                     if (!heartbeatJSON["msg"]) {
-                        heartbeatJSON["msg"] = "";
+                        heartbeatJSON["msg"] = "N/A";
                     }
 
                     await Notification.send(JSON.parse(notification.config), msg, await monitor.toJSON(false), heartbeatJSON);
@@ -1200,7 +1268,7 @@ class Monitor extends BeanModel {
      */
     static async getPreviousHeartbeat(monitorID) {
         return await R.getRow(`
-            SELECT status, time FROM heartbeat
+            SELECT ping, status, time FROM heartbeat
             WHERE id = (select MAX(id) from heartbeat where monitor_id = ?)
         `, [
             monitorID
@@ -1227,6 +1295,7 @@ class Monitor extends BeanModel {
         return maintenance.count !== 0;
     }
 
+    /** Make sure monitor interval is between bounds */
     validate() {
         if (this.interval > MAX_INTERVAL_SECOND) {
             throw new Error(`Interval cannot be more than ${MAX_INTERVAL_SECOND} seconds`);
diff --git a/server/model/status_page.js b/server/model/status_page.js
index 80b576998..84af99e88 100644
--- a/server/model/status_page.js
+++ b/server/model/status_page.js
@@ -4,6 +4,7 @@ const cheerio = require("cheerio");
 const { UptimeKumaServer } = require("../uptime-kuma-server");
 const jsesc = require("jsesc");
 const Maintenance = require("./maintenance");
+const googleAnalytics = require("../google-analytics");
 
 class StatusPage extends BeanModel {
 
@@ -53,9 +54,17 @@ class StatusPage extends BeanModel {
 
         const head = $("head");
 
+        if (statusPage.googleAnalyticsTagId) {
+            let escapedGoogleAnalyticsScript = googleAnalytics.getGoogleAnalyticsScript(statusPage.googleAnalyticsTagId);
+            head.append($(escapedGoogleAnalyticsScript));
+        }
+
         // OG Meta Tags
-        head.append(`<meta property="og:title" content="${statusPage.title}" />`);
-        head.append(`<meta property="og:description" content="${description155}" />`);
+        let ogTitle = $("<meta property=\"og:title\" content=\"\" />").attr("content", statusPage.title);
+        head.append(ogTitle);
+
+        let ogDescription = $("<meta property=\"og:description\" content=\"\" />").attr("content", description155);
+        head.append(ogDescription);
 
         // Preload data
         // Add jsesc, fix https://github.com/louislam/uptime-kuma/issues/2186
@@ -225,6 +234,7 @@ class StatusPage extends BeanModel {
             customCSS: this.custom_css,
             footerText: this.footer_text,
             showPoweredBy: !!this.show_powered_by,
+            googleAnalyticsId: this.google_analytics_tag_id,
         };
     }
 
@@ -245,6 +255,7 @@ class StatusPage extends BeanModel {
             customCSS: this.custom_css,
             footerText: this.footer_text,
             showPoweredBy: !!this.show_powered_by,
+            googleAnalyticsId: this.google_analytics_tag_id,
         };
     }
 
@@ -281,7 +292,7 @@ class StatusPage extends BeanModel {
 
             let activeCondition = Maintenance.getActiveMaintenanceSQLCondition();
             let maintenanceBeanList = R.convertToBeans("maintenance", await R.getAll(`
-                SELECT maintenance.*
+                SELECT DISTINCT maintenance.*
                 FROM maintenance
                 JOIN maintenance_status_page
                     ON maintenance_status_page.maintenance_id = maintenance.id
diff --git a/server/monitor-types/monitor-type.js b/server/monitor-types/monitor-type.js
new file mode 100644
index 000000000..f2c7cbee8
--- /dev/null
+++ b/server/monitor-types/monitor-type.js
@@ -0,0 +1,19 @@
+class MonitorType {
+
+    name = undefined;
+
+    /**
+     *
+     * @param {Monitor} monitor
+     * @param {Heartbeat} heartbeat
+     * @returns {Promise<void>}
+     */
+    async check(monitor, heartbeat) {
+        throw new Error("You need to override check()");
+    }
+
+}
+
+module.exports = {
+    MonitorType,
+};
diff --git a/server/notification-providers/clicksendsms.js b/server/notification-providers/clicksendsms.js
index e66b982c8..1df053098 100644
--- a/server/notification-providers/clicksendsms.js
+++ b/server/notification-providers/clicksendsms.js
@@ -8,7 +8,6 @@ class ClickSendSMS extends NotificationProvider {
     async send(notification, msg, monitorJSON = null, heartbeatJSON = null) {
         let okMsg = "Sent Successfully.";
         try {
-            console.log({ notification });
             let config = {
                 headers: {
                     "Content-Type": "application/json",
diff --git a/server/notification-providers/discord.js b/server/notification-providers/discord.js
index ac5c8ae84..b699228c9 100644
--- a/server/notification-providers/discord.js
+++ b/server/notification-providers/discord.js
@@ -91,7 +91,7 @@ class Discord extends NotificationProvider {
                             },
                             {
                                 name: monitorJSON["type"] === "push" ? "Service Type" : "Service URL",
-                                value: monitorJSON["type"] === "push" ? "Heartbeat" : address.startsWith("http") ? "[Visit Service](" + address + ")" : address,
+                                value: monitorJSON["type"] === "push" ? "Heartbeat" : address,
                             },
                             {
                                 name: "Time (UTC)",
diff --git a/server/notification-providers/kook.js b/server/notification-providers/kook.js
new file mode 100644
index 000000000..b37b75ab1
--- /dev/null
+++ b/server/notification-providers/kook.js
@@ -0,0 +1,31 @@
+const NotificationProvider = require("./notification-provider");
+const axios = require("axios");
+
+class Kook extends NotificationProvider {
+
+    name = "Kook";
+
+    async send(notification, msg, monitorJSON = null, heartbeatJSON = null) {
+        let okMsg = "Sent Successfully.";
+        let url = "https://www.kookapp.cn/api/v3/message/create";
+        let data = {
+            target_id: notification.kookGuildID,
+            content: msg,
+        };
+        let config = {
+            headers: {
+                "Authorization": "Bot " + notification.kookBotToken,
+                "Content-Type": "application/json",
+            },
+        };
+        try {
+            await axios.post(url, data, config);
+            return okMsg;
+
+        } catch (error) {
+            this.throwGeneralAxiosError(error);
+        }
+    }
+}
+
+module.exports = Kook;
diff --git a/server/notification-providers/promosms.js b/server/notification-providers/promosms.js
index 4f7e8f901..572a21325 100644
--- a/server/notification-providers/promosms.js
+++ b/server/notification-providers/promosms.js
@@ -8,6 +8,14 @@ class PromoSMS extends NotificationProvider {
     async send(notification, msg, monitorJSON = null, heartbeatJSON = null) {
         let okMsg = "Sent Successfully.";
 
+        if (notification.promosmsAllowLongSMS === undefined) {
+            notification.promosmsAllowLongSMS = false;
+        }
+
+        //TODO: Add option for enabling special characters. It will decrese message max length from 160 to 70 chars.
+        //Lets remove non ascii char
+        let cleanMsg = msg.replace(/[^\x00-\x7F]/g, "");
+
         try {
             let config = {
                 headers: {
@@ -18,8 +26,9 @@ class PromoSMS extends NotificationProvider {
             };
             let data = {
                 "recipients": [ notification.promosmsPhoneNumber ],
-                //Lets remove non ascii char
-                "text": msg.replace(/[^\x00-\x7F]/g, ""),
+                //Trim message to maximum length of 1 SMS or 4 if we allowed long messages
+                "text": notification.promosmsAllowLongSMS ? cleanMsg.substring(0, 639) : cleanMsg.substring(0, 159),
+                "long-sms": notification.promosmsAllowLongSMS,
                 "type": Number(notification.promosmsSMSType),
                 "sender": notification.promosmsSenderName
             };
diff --git a/server/notification-providers/pushover.js b/server/notification-providers/pushover.js
index ebcb88c4f..e4f0ddb81 100644
--- a/server/notification-providers/pushover.js
+++ b/server/notification-providers/pushover.js
@@ -10,7 +10,7 @@ class Pushover extends NotificationProvider {
         let pushoverlink = "https://api.pushover.net/1/messages.json";
 
         let data = {
-            "message": "<b>Uptime Kuma Alert</b>\n\n<b>Message</b>:" + msg,
+            "message": msg,
             "user": notification.pushoveruserkey,
             "token": notification.pushoverapptoken,
             "sound": notification.pushoversounds,
diff --git a/server/notification-providers/serverchan.js b/server/notification-providers/serverchan.js
index fbf99f80d..d631c8e61 100644
--- a/server/notification-providers/serverchan.js
+++ b/server/notification-providers/serverchan.js
@@ -21,6 +21,12 @@ class ServerChan extends NotificationProvider {
         }
     }
 
+    /**
+     * Get the formatted title for message
+     * @param {?Object} monitorJSON Monitor details (For Up/Down only)
+     * @param {?Object} heartbeatJSON Heartbeat details (For Up/Down only)
+     * @returns {string} Formatted title
+     */
     checkStatus(heartbeatJSON, monitorJSON) {
         let title = "UptimeKuma Message";
         if (heartbeatJSON != null && heartbeatJSON["status"] === UP) {
diff --git a/server/notification-providers/slack.js b/server/notification-providers/slack.js
index da1d6e66b..da89f0f7a 100644
--- a/server/notification-providers/slack.js
+++ b/server/notification-providers/slack.js
@@ -1,7 +1,7 @@
 const NotificationProvider = require("./notification-provider");
 const axios = require("axios");
 const { setSettings, setting } = require("../util-server");
-const { getMonitorRelativeURL } = require("../../src/util");
+const { getMonitorRelativeURL, UP } = require("../../src/util");
 
 class Slack extends NotificationProvider {
 
@@ -42,28 +42,35 @@ class Slack extends NotificationProvider {
             const time = heartbeatJSON["time"];
             const textMsg = "Uptime Kuma Alert";
             let data = {
-                "text": monitorJSON ? textMsg + `: ${monitorJSON.name}` : textMsg,
+                "text": `${textMsg}\n${msg}`,
                 "channel": notification.slackchannel,
                 "username": notification.slackusername,
                 "icon_emoji": notification.slackiconemo,
-                "blocks": [{
-                    "type": "header",
-                    "text": {
-                        "type": "plain_text",
-                        "text": "Uptime Kuma Alert",
-                    },
-                },
-                {
-                    "type": "section",
-                    "fields": [{
-                        "type": "mrkdwn",
-                        "text": "*Message*\n" + msg,
-                    },
+                "attachments": [
                     {
-                        "type": "mrkdwn",
-                        "text": "*Time (UTC)*\n" + time,
-                    }],
-                }],
+                        "color": (heartbeatJSON["status"] === UP) ? "#2eb886" : "#e01e5a",
+                        "blocks": [
+                            {
+                                "type": "header",
+                                "text": {
+                                    "type": "plain_text",
+                                    "text": "Uptime Kuma Alert",
+                                },
+                            },
+                            {
+                                "type": "section",
+                                "fields": [{
+                                    "type": "mrkdwn",
+                                    "text": "*Message*\n" + msg,
+                                },
+                                {
+                                    "type": "mrkdwn",
+                                    "text": "*Time (UTC)*\n" + time,
+                                }],
+                            }
+                        ],
+                    }
+                ]
             };
 
             if (notification.slackbutton) {
@@ -74,17 +81,19 @@ class Slack extends NotificationProvider {
 
             // Button
             if (baseURL) {
-                data.blocks.push({
-                    "type": "actions",
-                    "elements": [{
-                        "type": "button",
-                        "text": {
-                            "type": "plain_text",
-                            "text": "Visit Uptime Kuma",
-                        },
-                        "value": "Uptime-Kuma",
-                        "url": baseURL + getMonitorRelativeURL(monitorJSON.id),
-                    }],
+                data.attachments.forEach(element => {
+                    element.blocks.push({
+                        "type": "actions",
+                        "elements": [{
+                            "type": "button",
+                            "text": {
+                                "type": "plain_text",
+                                "text": "Visit Uptime Kuma",
+                            },
+                            "value": "Uptime-Kuma",
+                            "url": baseURL + getMonitorRelativeURL(monitorJSON.id),
+                        }],
+                    });
                 });
             }
 
diff --git a/server/notification-providers/splunk.js b/server/notification-providers/splunk.js
new file mode 100644
index 000000000..2d82dd397
--- /dev/null
+++ b/server/notification-providers/splunk.js
@@ -0,0 +1,113 @@
+const NotificationProvider = require("./notification-provider");
+const axios = require("axios");
+const { UP, DOWN, getMonitorRelativeURL } = require("../../src/util");
+const { setting } = require("../util-server");
+let successMessage = "Sent Successfully.";
+
+class Splunk extends NotificationProvider {
+    name = "Splunk";
+
+    /**
+     * @inheritdoc
+     */
+    async send(notification, msg, monitorJSON = null, heartbeatJSON = null) {
+        try {
+            if (heartbeatJSON == null) {
+                const title = "Uptime Kuma Alert";
+                const monitor = {
+                    type: "ping",
+                    url: "Uptime Kuma Test Button",
+                };
+                return this.postNotification(notification, title, msg, monitor, "trigger");
+            }
+
+            if (heartbeatJSON.status === UP) {
+                const title = "Uptime Kuma Monitor ✅ Up";
+                return this.postNotification(notification, title, heartbeatJSON.msg, monitorJSON, "recovery");
+            }
+
+            if (heartbeatJSON.status === DOWN) {
+                const title = "Uptime Kuma Monitor 🔴 Down";
+                return this.postNotification(notification, title, heartbeatJSON.msg, monitorJSON, "trigger");
+            }
+        } catch (error) {
+            this.throwGeneralAxiosError(error);
+        }
+    }
+
+    /**
+     * Check if result is successful, result code should be in range 2xx
+     * @param {Object} result Axios response object
+     * @throws {Error} The status code is not in range 2xx
+     */
+    checkResult(result) {
+        if (result.status == null) {
+            throw new Error("Splunk notification failed with invalid response!");
+        }
+        if (result.status < 200 || result.status >= 300) {
+            throw new Error("Splunk notification failed with status code " + result.status);
+        }
+    }
+
+    /**
+     * Send the message
+     * @param {BeanModel} notification Message title
+     * @param {string} title Message title
+     * @param {string} body Message
+     * @param {Object} monitorInfo Monitor details (For Up/Down only)
+     * @param {?string} eventAction Action event for PagerDuty (trigger, acknowledge, resolve)
+     * @returns {string}
+     */
+    async postNotification(notification, title, body, monitorInfo, eventAction = "trigger") {
+
+        let monitorUrl;
+        if (monitorInfo.type === "port") {
+            monitorUrl = monitorInfo.hostname;
+            if (monitorInfo.port) {
+                monitorUrl += ":" + monitorInfo.port;
+            }
+        } else if (monitorInfo.hostname != null) {
+            monitorUrl = monitorInfo.hostname;
+        } else {
+            monitorUrl = monitorInfo.url;
+        }
+
+        if (eventAction === "recovery") {
+            if (notification.splunkAutoResolve === "0") {
+                return "No action required";
+            }
+            eventAction = notification.splunkAutoResolve;
+        } else {
+            eventAction = notification.splunkSeverity;
+        }
+
+        const options = {
+            method: "POST",
+            url: notification.splunkRestURL,
+            headers: { "Content-Type": "application/json" },
+            data: {
+                message_type: eventAction,
+                state_message: `[${title}] [${monitorUrl}] ${body}`,
+                entity_display_name: "Uptime Kuma Alert: " + monitorInfo.name,
+                routing_key: notification.pagerdutyIntegrationKey,
+                entity_id: "Uptime Kuma/" + monitorInfo.id,
+            }
+        };
+
+        const baseURL = await setting("primaryBaseURL");
+        if (baseURL && monitorInfo) {
+            options.client = "Uptime Kuma";
+            options.client_url = baseURL + getMonitorRelativeURL(monitorInfo.id);
+        }
+
+        let result = await axios.request(options);
+        this.checkResult(result);
+        if (result.statusText != null) {
+            return "Splunk notification succeed: " + result.statusText;
+        }
+
+        return successMessage;
+    }
+}
+
+module.exports = Splunk;
diff --git a/server/notification-providers/telegram.js b/server/notification-providers/telegram.js
index 2b0576224..3c490655d 100644
--- a/server/notification-providers/telegram.js
+++ b/server/notification-providers/telegram.js
@@ -9,11 +9,18 @@ class Telegram extends NotificationProvider {
         let okMsg = "Sent Successfully.";
 
         try {
+            let params = {
+                chat_id: notification.telegramChatID,
+                text: msg,
+                disable_notification: notification.telegramSendSilently ?? false,
+                protect_content: notification.telegramProtectContent ?? false,
+            };
+            if (notification.telegramMessageThreadID) {
+                params.message_thread_id = notification.telegramMessageThreadID;
+            }
+
             await axios.get(`https://api.telegram.org/bot${notification.telegramBotToken}/sendMessage`, {
-                params: {
-                    chat_id: notification.telegramChatID,
-                    text: msg,
-                },
+                params: params,
             });
             return okMsg;
 
diff --git a/server/notification-providers/zoho-cliq.js b/server/notification-providers/zoho-cliq.js
new file mode 100644
index 000000000..749647d06
--- /dev/null
+++ b/server/notification-providers/zoho-cliq.js
@@ -0,0 +1,116 @@
+const NotificationProvider = require("./notification-provider");
+const axios = require("axios");
+const { DOWN, UP } = require("../../src/util");
+
+class ZohoCliq extends NotificationProvider {
+
+    name = "ZohoCliq";
+
+    /**
+     * Generate the message to send
+     * @param {const} status The status constant
+     * @param {string} monitorName Name of monitor
+     * @returns {string}
+     */
+    _statusMessageFactory = (status, monitorName) => {
+        if (status === DOWN) {
+            return `🔴 Application [${monitorName}] went down\n`;
+        } else if (status === UP) {
+            return `✅ Application [${monitorName}] is back online\n`;
+        }
+        return "Notification\n";
+    };
+
+    /**
+     * Send the notification
+     * @param {string} webhookUrl URL to send the request to
+     * @param {Array} payload Payload generated by _notificationPayloadFactory
+     */
+    _sendNotification = async (webhookUrl, payload) => {
+        await axios.post(webhookUrl, { text: payload.join("\n") });
+    };
+
+    /**
+     * Generate payload for notification
+     * @param {const} status The status of the monitor
+     * @param {string} monitorMessage Message to send
+     * @param {string} monitorName Name of monitor affected
+     * @param {string} monitorUrl URL of monitor affected
+     * @returns {Array}
+     */
+    _notificationPayloadFactory = ({
+        status,
+        monitorMessage,
+        monitorName,
+        monitorUrl,
+    }) => {
+        const payload = [];
+        payload.push("### Uptime Kuma\n");
+        payload.push(this._statusMessageFactory(status, monitorName));
+        payload.push(`*Description:* ${monitorMessage}`);
+
+        if (monitorName) {
+            payload.push(`*Monitor:* ${monitorName}`);
+        }
+
+        if (monitorUrl && monitorUrl !== "https://") {
+            payload.push(`*URL:* [${monitorUrl}](${monitorUrl})`);
+        }
+
+        return payload;
+    };
+
+    /**
+     * Send a general notification
+     * @param {string} webhookUrl URL to send request to
+     * @param {string} msg Message to send
+     * @returns {Promise<void>}
+     */
+    _handleGeneralNotification = (webhookUrl, msg) => {
+        const payload = this._notificationPayloadFactory({
+            monitorMessage: msg
+        });
+
+        return this._sendNotification(webhookUrl, payload);
+    };
+
+    async send(notification, msg, monitorJSON = null, heartbeatJSON = null) {
+        let okMsg = "Sent Successfully.";
+
+        try {
+            if (heartbeatJSON == null) {
+                await this._handleGeneralNotification(notification.webhookUrl, msg);
+                return okMsg;
+            }
+
+            let url;
+            switch (monitorJSON["type"]) {
+                case "http":
+                case "keywork":
+                    url = monitorJSON["url"];
+                    break;
+                case "docker":
+                    url = monitorJSON["docker_host"];
+                    break;
+                default:
+                    url = monitorJSON["hostname"];
+                    break;
+            }
+
+            const payload = this._notificationPayloadFactory({
+                monitorMessage: heartbeatJSON.msg,
+                monitorName: monitorJSON.name,
+                monitorUrl: url,
+                status: heartbeatJSON.status
+            });
+
+            await this._sendNotification(notification.webhookUrl, payload);
+            return okMsg;
+
+        } catch (error) {
+            this.throwGeneralAxiosError(error);
+        }
+    }
+}
+
+module.exports = ZohoCliq;
diff --git a/server/notification.js b/server/notification.js
index 9069601b4..fd3491238 100644
--- a/server/notification.js
+++ b/server/notification.js
@@ -14,6 +14,7 @@ const GoogleChat = require("./notification-providers/google-chat");
 const Gorush = require("./notification-providers/gorush");
 const Gotify = require("./notification-providers/gotify");
 const HomeAssistant = require("./notification-providers/home-assistant");
+const Kook = require("./notification-providers/kook");
 const Line = require("./notification-providers/line");
 const LineNotify = require("./notification-providers/linenotify");
 const LunaSea = require("./notification-providers/lunasea");
@@ -39,11 +40,13 @@ const Stackfield = require("./notification-providers/stackfield");
 const Teams = require("./notification-providers/teams");
 const TechulusPush = require("./notification-providers/techulus-push");
 const Telegram = require("./notification-providers/telegram");
+const Splunk = require("./notification-providers/splunk");
 const Webhook = require("./notification-providers/webhook");
 const WeCom = require("./notification-providers/wecom");
 const GoAlert = require("./notification-providers/goalert");
 const SMSManager = require("./notification-providers/smsmanager");
 const ServerChan = require("./notification-providers/serverchan");
+const ZohoCliq = require("./notification-providers/zoho-cliq");
 
 class Notification {
 
@@ -70,6 +73,7 @@ class Notification {
             new Gorush(),
             new Gotify(),
             new HomeAssistant(),
+            new Kook(),
             new Line(),
             new LineNotify(),
             new LunaSea(),
@@ -97,9 +101,11 @@ class Notification {
             new Teams(),
             new TechulusPush(),
             new Telegram(),
+            new Splunk(),
             new Webhook(),
             new WeCom(),
             new GoAlert(),
+            new ZohoCliq()
         ];
 
         for (let item of list) {
diff --git a/server/ping-lite.js b/server/ping-lite.js
deleted file mode 100644
index 05dff31db..000000000
--- a/server/ping-lite.js
+++ /dev/null
@@ -1,199 +0,0 @@
-// https://github.com/ben-bradley/ping-lite/blob/master/ping-lite.js
-// Fixed on Windows
-const net = require("net");
-const spawn = require("child_process").spawn;
-const events = require("events");
-const fs = require("fs");
-const util = require("./util-server");
-
-module.exports = Ping;
-
-/**
- * Constructor for ping class
- * @param {string} host Host to ping
- * @param {object} [options] Options for the ping command
- * @param {array|string} [options.args] - Arguments to pass to the ping command
- */
-function Ping(host, options) {
-    if (!host) {
-        throw new Error("You must specify a host to ping!");
-    }
-
-    this._host = host;
-    this._options = options = (options || {});
-
-    events.EventEmitter.call(this);
-
-    const timeout = 10;
-
-    if (util.WIN) {
-        this._bin = "c:/windows/system32/ping.exe";
-        this._args = (options.args) ? options.args : [ "-n", "1", "-w", timeout * 1000, host ];
-        this._regmatch = /[><=]([0-9.]+?)ms/;
-
-    } else if (util.LIN) {
-        this._bin = "/bin/ping";
-
-        const defaultArgs = [ "-n", "-w", timeout, "-c", "1", host ];
-
-        if (net.isIPv6(host) || options.ipv6) {
-            defaultArgs.unshift("-6");
-        }
-
-        this._args = (options.args) ? options.args : defaultArgs;
-        this._regmatch = /=([0-9.]+?) ms/;
-
-    } else if (util.MAC) {
-
-        if (net.isIPv6(host) || options.ipv6) {
-            this._bin = "/sbin/ping6";
-        } else {
-            this._bin = "/sbin/ping";
-        }
-
-        this._args = (options.args) ? options.args : [ "-n", "-t", timeout, "-c", "1", host ];
-        this._regmatch = /=([0-9.]+?) ms/;
-
-    } else if (util.BSD) {
-        this._bin = "/sbin/ping";
-
-        const defaultArgs = [ "-n", "-t", timeout, "-c", "1", host ];
-
-        if (net.isIPv6(host) || options.ipv6) {
-            defaultArgs.unshift("-6");
-        }
-
-        this._args = (options.args) ? options.args : defaultArgs;
-        this._regmatch = /=([0-9.]+?) ms/;
-
-    } else {
-        throw new Error("Could not detect your ping binary.");
-    }
-
-    if (!fs.existsSync(this._bin)) {
-        throw new Error("Could not detect " + this._bin + " on your system");
-    }
-
-    this._i = 0;
-
-    return this;
-}
-
-Ping.prototype.__proto__ = events.EventEmitter.prototype;
-
-/**
- * Callback for send
- * @callback pingCB
- * @param {any} err Any error encountered
- * @param {number} ms Ping time in ms
- */
-
-/**
- * Send a ping
- * @param {pingCB} callback Callback to call with results
- */
-Ping.prototype.send = function (callback) {
-    let self = this;
-    callback = callback || function (err, ms) {
-        if (err) {
-            return self.emit("error", err);
-        }
-        return self.emit("result", ms);
-    };
-
-    let _ended;
-    let _exited;
-    let _errored;
-
-    this._ping = spawn(this._bin, this._args, { windowsHide: true }); // spawn the binary
-
-    this._ping.on("error", function (err) { // handle binary errors
-        _errored = true;
-        callback(err);
-    });
-
-    this._ping.stdout.on("data", function (data) { // log stdout
-        if (util.WIN) {
-            data = convertOutput(data);
-        }
-        this._stdout = (this._stdout || "") + data;
-    });
-
-    this._ping.stdout.on("end", function () {
-        _ended = true;
-        if (_exited && !_errored) {
-            onEnd.call(self._ping);
-        }
-    });
-
-    this._ping.stderr.on("data", function (data) { // log stderr
-        if (util.WIN) {
-            data = convertOutput(data);
-        }
-        this._stderr = (this._stderr || "") + data;
-    });
-
-    this._ping.on("exit", function (code) { // handle complete
-        _exited = true;
-        if (_ended && !_errored) {
-            onEnd.call(self._ping);
-        }
-    });
-
-    /**
-     * @param {Function} callback
-     *
-     * Generated by Trelent
-     */
-    function onEnd() {
-        let stdout = this.stdout._stdout;
-        let stderr = this.stderr._stderr;
-        let ms;
-
-        if (stderr) {
-            return callback(new Error(stderr));
-        }
-
-        if (!stdout) {
-            return callback(new Error("No stdout detected"));
-        }
-
-        ms = stdout.match(self._regmatch); // parse out the ##ms response
-        ms = (ms && ms[1]) ? Number(ms[1]) : ms;
-
-        callback(null, ms, stdout);
-    }
-};
-
-/**
- * Ping every interval
- * @param {pingCB} callback Callback to call with results
- */
-Ping.prototype.start = function (callback) {
-    let self = this;
-    this._i = setInterval(function () {
-        self.send(callback);
-    }, (self._options.interval || 5000));
-    self.send(callback);
-};
-
-/** Stop sending pings */
-Ping.prototype.stop = function () {
-    clearInterval(this._i);
-};
-
-/**
- * Try to convert to UTF-8 for Windows, as the ping's output on Windows is not UTF-8 and could be in other languages
- * Thank @pemassi
- * https://github.com/louislam/uptime-kuma/issues/570#issuecomment-941984094
- * @param {any} data
- * @returns {string}
- */
-function convertOutput(data) {
-    if (util.WIN) {
-        if (data) {
-            return util.convertToUTF8(data);
-        }
-    }
-    return data;
-}
diff --git a/server/plugin.js b/server/plugin.js
new file mode 100644
index 000000000..8b687ad6b
--- /dev/null
+++ b/server/plugin.js
@@ -0,0 +1,13 @@
+class Plugin {
+    async load() {
+
+    }
+
+    async unload() {
+
+    }
+}
+
+module.exports = {
+    Plugin,
+};
diff --git a/server/plugins-manager.js b/server/plugins-manager.js
new file mode 100644
index 000000000..674ab9691
--- /dev/null
+++ b/server/plugins-manager.js
@@ -0,0 +1,256 @@
+const fs = require("fs");
+const { log } = require("../src/util");
+const path = require("path");
+const axios = require("axios");
+const { Git } = require("./git");
+const childProcess = require("child_process");
+
+class PluginsManager {
+
+    static disable = false;
+
+    /**
+     * Plugin List
+     * @type {PluginWrapper[]}
+     */
+    pluginList = [];
+
+    /**
+     * Plugins Dir
+     */
+    pluginsDir;
+
+    server;
+
+    /**
+     *
+     * @param {UptimeKumaServer} server
+     */
+    constructor(server) {
+        this.server = server;
+
+        if (!PluginsManager.disable) {
+            this.pluginsDir = "./data/plugins/";
+
+            if (! fs.existsSync(this.pluginsDir)) {
+                fs.mkdirSync(this.pluginsDir, { recursive: true });
+            }
+
+            log.debug("plugin", "Scanning plugin directory");
+            let list = fs.readdirSync(this.pluginsDir);
+
+            this.pluginList = [];
+            for (let item of list) {
+                this.loadPlugin(item);
+            }
+
+        } else {
+            log.warn("PLUGIN", "Skip scanning plugin directory");
+        }
+
+    }
+
+    /**
+     * Install a Plugin
+     */
+    async loadPlugin(name) {
+        log.info("plugin", "Load " + name);
+        let plugin = new PluginWrapper(this.server, this.pluginsDir + name);
+
+        try {
+            await plugin.load();
+            this.pluginList.push(plugin);
+        } catch (e) {
+            log.error("plugin", "Failed to load plugin: " + this.pluginsDir + name);
+            log.error("plugin", "Reason: " + e.message);
+        }
+    }
+
+    /**
+     * Download a Plugin
+     * @param {string} repoURL Git repo url
+     * @param {string} name Directory name, also known as plugin unique name
+     */
+    downloadPlugin(repoURL, name) {
+        if (fs.existsSync(this.pluginsDir + name)) {
+            log.info("plugin", "Plugin folder already exists? Removing...");
+            fs.rmSync(this.pluginsDir + name, {
+                recursive: true
+            });
+        }
+        log.info("plugin", "Installing plugin: " + name + " " + repoURL);
+        let result = Git.clone(repoURL, this.pluginsDir, name);
+        log.info("plugin", "Install result: " + result);
+    }
+
+    /**
+     * Remove a plugin
+     * @param {string} name
+     */
+    async removePlugin(name) {
+        log.info("plugin", "Removing plugin: " + name);
+        for (let plugin of this.pluginList) {
+            if (plugin.info.name === name) {
+                await plugin.unload();
+
+                // Delete the plugin directory
+                fs.rmSync(this.pluginsDir + name, {
+                    recursive: true
+                });
+
+                this.pluginList.splice(this.pluginList.indexOf(plugin), 1);
+                return;
+            }
+        }
+        log.warn("plugin", "Plugin not found: " + name);
+        throw new Error("Plugin not found: " + name);
+    }
+
+    /**
+     * TODO: Update a plugin
+     * Only available for plugins which were downloaded from the official list
+     * @param pluginID
+     */
+    updatePlugin(pluginID) {
+
+    }
+
+    /**
+     * Get the plugin list from server + local installed plugin list
+     * Item will be merged if the `name` is the same.
+     * @returns {Promise<[]>}
+     */
+    async fetchPluginList() {
+        let remotePluginList;
+        try {
+            const res = await axios.get("https://uptime.kuma.pet/c/plugins.json");
+            remotePluginList = res.data.pluginList;
+        } catch (e) {
+            log.error("plugin", "Failed to fetch plugin list: " + e.message);
+            remotePluginList = [];
+        }
+
+        for (let plugin of this.pluginList) {
+            let find = false;
+            // Try to merge
+            for (let remotePlugin of remotePluginList) {
+                if (remotePlugin.name === plugin.info.name) {
+                    find = true;
+                    remotePlugin.installed = true;
+                    remotePlugin.name = plugin.info.name;
+                    remotePlugin.fullName = plugin.info.fullName;
+                    remotePlugin.description = plugin.info.description;
+                    remotePlugin.version = plugin.info.version;
+                    break;
+                }
+            }
+
+            // Local plugin
+            if (!find) {
+                plugin.info.local = true;
+                remotePluginList.push(plugin.info);
+            }
+        }
+
+        // Sort Installed first, then sort by name
+        return remotePluginList.sort((a, b) => {
+            if (a.installed === b.installed) {
+                if (a.fullName < b.fullName) {
+                    return -1;
+                }
+                if (a.fullName > b.fullName) {
+                    return 1;
+                }
+                return 0;
+            } else if (a.installed) {
+                return -1;
+            } else {
+                return 1;
+            }
+        });
+    }
+}
+
+class PluginWrapper {
+
+    server = undefined;
+    pluginDir = undefined;
+
+    /**
+     * Must be an `new-able` class.
+     * @type {function}
+     */
+    pluginClass = undefined;
+
+    /**
+     *
+     * @type {Plugin}
+     */
+    object = undefined;
+    info = {};
+
+    /**
+     *
+     * @param {UptimeKumaServer} server
+     * @param {string} pluginDir
+     */
+    constructor(server, pluginDir) {
+        this.server = server;
+        this.pluginDir = pluginDir;
+    }
+
+    async load() {
+        let indexFile = this.pluginDir + "/index.js";
+        let packageJSON = this.pluginDir + "/package.json";
+
+        log.info("plugin", "Installing dependencies");
+
+        if (fs.existsSync(indexFile)) {
+            // Install dependencies
+            let result = childProcess.spawnSync("npm", [ "install" ], {
+                cwd: this.pluginDir,
+                env: {
+                    ...process.env,
+                    PLAYWRIGHT_BROWSERS_PATH: "../../browsers",    // Special handling for read-browser-monitor
+                }
+            });
+
+            if (result.stdout) {
+                log.info("plugin", "Install dependencies result: " + result.stdout.toString("utf-8"));
+            } else {
+                log.warn("plugin", "Install dependencies result: no output");
+            }
+
+            this.pluginClass = require(path.join(process.cwd(), indexFile));
+
+            let pluginClassType = typeof this.pluginClass;
+
+            if (pluginClassType === "function") {
+                this.object = new this.pluginClass(this.server);
+                await this.object.load();
+            } else {
+                throw new Error("Invalid plugin, it does not export a class");
+            }
+
+            if (fs.existsSync(packageJSON)) {
+                this.info = require(path.join(process.cwd(), packageJSON));
+            } else {
+                this.info.fullName = this.pluginDir;
+                this.info.name = "[unknown]";
+                this.info.version = "[unknown-version]";
+            }
+
+            this.info.installed = true;
+            log.info("plugin", `${this.info.fullName} v${this.info.version} loaded`);
+        }
+    }
+
+    async unload() {
+        await this.object.unload();
+    }
+}
+
+module.exports = {
+    PluginsManager,
+    PluginWrapper
+};
diff --git a/server/prometheus.js b/server/prometheus.js
index 1473ab7a9..aeba95f80 100644
--- a/server/prometheus.js
+++ b/server/prometheus.js
@@ -99,6 +99,7 @@ class Prometheus {
         }
     }
 
+    /** Remove monitor from prometheus */
     remove() {
         try {
             monitorCertDaysRemaining.remove(this.monitorLabelValues);
diff --git a/server/routers/api-router.js b/server/routers/api-router.js
index bbecbced3..2d5f96617 100644
--- a/server/routers/api-router.js
+++ b/server/routers/api-router.js
@@ -1,10 +1,10 @@
 let express = require("express");
-const { allowDevAllOrigin, allowAllOrigin, percentageToColor, filterAndJoin, send403 } = require("../util-server");
+const { allowDevAllOrigin, allowAllOrigin, percentageToColor, filterAndJoin, sendHttpError } = require("../util-server");
 const { R } = require("redbean-node");
 const apicache = require("../modules/apicache");
 const Monitor = require("../model/monitor");
 const dayjs = require("dayjs");
-const { UP, MAINTENANCE, DOWN, flipStatus, log } = require("../../src/util");
+const { UP, MAINTENANCE, DOWN, PENDING, flipStatus, log } = require("../../src/util");
 const StatusPage = require("../model/status_page");
 const { UptimeKumaServer } = require("../uptime-kuma-server");
 const { makeBadge } = require("badge-maker");
@@ -111,8 +111,12 @@ router.get("/api/badge/:id/status", cache("5 minutes"), async (request, response
         label,
         upLabel = "Up",
         downLabel = "Down",
+        pendingLabel = "Pending",
+        maintenanceLabel = "Maintenance",
         upColor = badgeConstants.defaultUpColor,
         downColor = badgeConstants.defaultDownColor,
+        pendingColor = badgeConstants.defaultPendingColor,
+        maintenanceColor = badgeConstants.defaultMaintenanceColor,
         style = badgeConstants.defaultStyle,
         value, // for demo purpose only
     } = request.query;
@@ -139,11 +143,30 @@ router.get("/api/badge/:id/status", cache("5 minutes"), async (request, response
             badgeValues.color = badgeConstants.naColor;
         } else {
             const heartbeat = await Monitor.getPreviousHeartbeat(requestedMonitorId);
-            const state = overrideValue !== undefined ? overrideValue : heartbeat.status === 1;
+            const state = overrideValue !== undefined ? overrideValue : heartbeat.status;
 
-            badgeValues.label = label ? label : "";
-            badgeValues.color = state ? upColor : downColor;
-            badgeValues.message = label ?? state ? upLabel : downLabel;
+            badgeValues.label = label ?? "Status";
+            switch (state) {
+                case DOWN:
+                    badgeValues.color = downColor;
+                    badgeValues.message = downLabel;
+                    break;
+                case UP:
+                    badgeValues.color = upColor;
+                    badgeValues.message = upLabel;
+                    break;
+                case PENDING:
+                    badgeValues.color = pendingColor;
+                    badgeValues.message = pendingLabel;
+                    break;
+                case MAINTENANCE:
+                    badgeValues.color = maintenanceColor;
+                    badgeValues.message = maintenanceLabel;
+                    break;
+                default:
+                    badgeValues.color = badgeConstants.naColor;
+                    badgeValues.message = "N/A";
+            }
         }
 
         // build the svg based on given values
@@ -152,7 +175,7 @@ router.get("/api/badge/:id/status", cache("5 minutes"), async (request, response
         response.type("image/svg+xml");
         response.send(svg);
     } catch (error) {
-        send403(response, error.message);
+        sendHttpError(response, error.message);
     }
 });
 
@@ -189,7 +212,7 @@ router.get("/api/badge/:id/uptime/:duration?", cache("5 minutes"), async (reques
         const badgeValues = { style };
 
         if (!publicMonitor) {
-            // return a "N/A" badge in naColor (grey), if monitor is not public / not available / non exsitant
+            // return a "N/A" badge in naColor (grey), if monitor is not public / not available / non existent
             badgeValues.message = "N/A";
             badgeValues.color = badgeConstants.naColor;
         } else {
@@ -205,8 +228,11 @@ router.get("/api/badge/:id/uptime/:duration?", cache("5 minutes"), async (reques
             badgeValues.color = color ?? percentageToColor(uptime);
             // use a given, custom labelColor or use the default badge label color (defined by badge-maker)
             badgeValues.labelColor = labelColor ?? "";
-            // build a lable string. If a custom label is given, override the default one (requestedDuration)
-            badgeValues.label = filterAndJoin([ labelPrefix, label ?? requestedDuration, labelSuffix ]);
+            // build a label string. If a custom label is given, override the default one (requestedDuration)
+            badgeValues.label = filterAndJoin([
+                labelPrefix,
+                label ?? `Uptime (${requestedDuration}${labelSuffix})`,
+            ]);
             badgeValues.message = filterAndJoin([ prefix, `${cleanUptime * 100}`, suffix ]);
         }
 
@@ -216,7 +242,7 @@ router.get("/api/badge/:id/uptime/:duration?", cache("5 minutes"), async (reques
         response.type("image/svg+xml");
         response.send(svg);
     } catch (error) {
-        send403(response, error.message);
+        sendHttpError(response, error.message);
     }
 });
 
@@ -267,7 +293,7 @@ router.get("/api/badge/:id/ping/:duration?", cache("5 minutes"), async (request,
             // use a given, custom labelColor or use the default badge label color (defined by badge-maker)
             badgeValues.labelColor = labelColor ?? "";
             // build a lable string. If a custom label is given, override the default one (requestedDuration)
-            badgeValues.label = filterAndJoin([ labelPrefix, label ?? requestedDuration, labelSuffix ]);
+            badgeValues.label = filterAndJoin([ labelPrefix, label ?? `Avg. Ping (${requestedDuration}${labelSuffix})` ]);
             badgeValues.message = filterAndJoin([ prefix, avgPing, suffix ]);
         }
 
@@ -277,7 +303,240 @@ router.get("/api/badge/:id/ping/:duration?", cache("5 minutes"), async (request,
         response.type("image/svg+xml");
         response.send(svg);
     } catch (error) {
-        send403(response, error.message);
+        sendHttpError(response, error.message);
+    }
+});
+
+router.get("/api/badge/:id/avg-response/:duration?", cache("5 minutes"), async (request, response) => {
+    allowAllOrigin(response);
+
+    const {
+        label,
+        labelPrefix,
+        labelSuffix,
+        prefix,
+        suffix = badgeConstants.defaultPingValueSuffix,
+        color = badgeConstants.defaultPingColor,
+        labelColor,
+        style = badgeConstants.defaultStyle,
+        value, // for demo purpose only
+    } = request.query;
+
+    try {
+        const requestedMonitorId = parseInt(request.params.id, 10);
+
+        // Default duration is 24 (h) if not defined in queryParam, limited to 720h (30d)
+        const requestedDuration = Math.min(
+            request.params.duration
+                ? parseInt(request.params.duration, 10)
+                : 24,
+            720
+        );
+        const overrideValue = value && parseFloat(value);
+
+        const publicAvgPing = parseInt(await R.getCell(`
+            SELECT AVG(ping) FROM monitor_group, \`group\`, heartbeat
+            WHERE monitor_group.group_id = \`group\`.id
+            AND heartbeat.time > DATETIME('now', ? || ' hours')
+            AND heartbeat.ping IS NOT NULL
+            AND public = 1
+            AND heartbeat.monitor_id = ?
+            `,
+        [ -requestedDuration, requestedMonitorId ]
+        ));
+
+        const badgeValues = { style };
+
+        if (!publicAvgPing) {
+            // return a "N/A" badge in naColor (grey), if monitor is not public / not available / non existent
+
+            badgeValues.message = "N/A";
+            badgeValues.color = badgeConstants.naColor;
+        } else {
+            const avgPing = parseInt(overrideValue ?? publicAvgPing);
+
+            badgeValues.color = color;
+            // use a given, custom labelColor or use the default badge label color (defined by badge-maker)
+            badgeValues.labelColor = labelColor ?? "";
+            // build a label string. If a custom label is given, override the default one (requestedDuration)
+            badgeValues.label = filterAndJoin([
+                labelPrefix,
+                label ?? `Avg. Response (${requestedDuration}h)`,
+                labelSuffix,
+            ]);
+            badgeValues.message = filterAndJoin([ prefix, avgPing, suffix ]);
+        }
+
+        // build the SVG based on given values
+        const svg = makeBadge(badgeValues);
+
+        response.type("image/svg+xml");
+        response.send(svg);
+    } catch (error) {
+        sendHttpError(response, error.message);
+    }
+});
+
+router.get("/api/badge/:id/cert-exp", cache("5 minutes"), async (request, response) => {
+    allowAllOrigin(response);
+
+    const date = request.query.date;
+
+    const {
+        label,
+        labelPrefix,
+        labelSuffix,
+        prefix,
+        suffix = date ? "" : badgeConstants.defaultCertExpValueSuffix,
+        upColor = badgeConstants.defaultUpColor,
+        warnColor = badgeConstants.defaultWarnColor,
+        downColor = badgeConstants.defaultDownColor,
+        warnDays = badgeConstants.defaultCertExpireWarnDays,
+        downDays = badgeConstants.defaultCertExpireDownDays,
+        labelColor,
+        style = badgeConstants.defaultStyle,
+        value, // for demo purpose only
+    } = request.query;
+
+    try {
+        const requestedMonitorId = parseInt(request.params.id, 10);
+
+        const overrideValue = value && parseFloat(value);
+
+        let publicMonitor = await R.getRow(`
+            SELECT monitor_group.monitor_id FROM monitor_group, \`group\`
+            WHERE monitor_group.group_id = \`group\`.id
+            AND monitor_group.monitor_id = ?
+            AND public = 1
+            `,
+        [ requestedMonitorId ]
+        );
+
+        const badgeValues = { style };
+
+        if (!publicMonitor) {
+            // return a "N/A" badge in naColor (grey), if monitor is not public / not available / non existent
+
+            badgeValues.message = "N/A";
+            badgeValues.color = badgeConstants.naColor;
+        } else {
+            const tlsInfoBean = await R.findOne("monitor_tls_info", "monitor_id = ?", [
+                requestedMonitorId,
+            ]);
+
+            if (!tlsInfoBean) {
+                // return a "No/Bad Cert" badge in naColor (grey), if no cert saved (does not save bad certs?)
+                badgeValues.message = "No/Bad Cert";
+                badgeValues.color = badgeConstants.naColor;
+            } else {
+                const tlsInfo = JSON.parse(tlsInfoBean.info_json);
+
+                if (!tlsInfo.valid) {
+                    // return a "Bad Cert" badge in naColor (grey), when cert is not valid
+                    badgeValues.message = "Bad Cert";
+                    badgeValues.color = badgeConstants.downColor;
+                } else {
+                    const daysRemaining = parseInt(overrideValue ?? tlsInfo.certInfo.daysRemaining);
+
+                    if (daysRemaining > warnDays) {
+                        badgeValues.color = upColor;
+                    } else if (daysRemaining > downDays) {
+                        badgeValues.color = warnColor;
+                    } else {
+                        badgeValues.color = downColor;
+                    }
+                    // use a given, custom labelColor or use the default badge label color (defined by badge-maker)
+                    badgeValues.labelColor = labelColor ?? "";
+                    // build a label string. If a custom label is given, override the default one
+                    badgeValues.label = filterAndJoin([
+                        labelPrefix,
+                        label ?? "Cert Exp.",
+                        labelSuffix,
+                    ]);
+                    badgeValues.message = filterAndJoin([ prefix, date ? tlsInfo.certInfo.validTo : daysRemaining, suffix ]);
+                }
+            }
+        }
+
+        // build the SVG based on given values
+        const svg = makeBadge(badgeValues);
+
+        response.type("image/svg+xml");
+        response.send(svg);
+    } catch (error) {
+        sendHttpError(response, error.message);
+    }
+});
+
+router.get("/api/badge/:id/response", cache("5 minutes"), async (request, response) => {
+    allowAllOrigin(response);
+
+    const {
+        label,
+        labelPrefix,
+        labelSuffix,
+        prefix,
+        suffix = badgeConstants.defaultPingValueSuffix,
+        color = badgeConstants.defaultPingColor,
+        labelColor,
+        style = badgeConstants.defaultStyle,
+        value, // for demo purpose only
+    } = request.query;
+
+    try {
+        const requestedMonitorId = parseInt(request.params.id, 10);
+
+        const overrideValue = value && parseFloat(value);
+
+        let publicMonitor = await R.getRow(`
+            SELECT monitor_group.monitor_id FROM monitor_group, \`group\`
+            WHERE monitor_group.group_id = \`group\`.id
+            AND monitor_group.monitor_id = ?
+            AND public = 1
+            `,
+        [ requestedMonitorId ]
+        );
+
+        const badgeValues = { style };
+
+        if (!publicMonitor) {
+            // return a "N/A" badge in naColor (grey), if monitor is not public / not available / non existent
+
+            badgeValues.message = "N/A";
+            badgeValues.color = badgeConstants.naColor;
+        } else {
+            const heartbeat = await Monitor.getPreviousHeartbeat(
+                requestedMonitorId
+            );
+
+            if (!heartbeat.ping) {
+                // return a "N/A" badge in naColor (grey), if previous heartbeat has no ping
+
+                badgeValues.message = "N/A";
+                badgeValues.color = badgeConstants.naColor;
+            } else {
+                const ping = parseInt(overrideValue ?? heartbeat.ping);
+
+                badgeValues.color = color;
+                // use a given, custom labelColor or use the default badge label color (defined by badge-maker)
+                badgeValues.labelColor = labelColor ?? "";
+                // build a label string. If a custom label is given, override the default one
+                badgeValues.label = filterAndJoin([
+                    labelPrefix,
+                    label ?? "Response",
+                    labelSuffix,
+                ]);
+                badgeValues.message = filterAndJoin([ prefix, ping, suffix ]);
+            }
+        }
+
+        // build the SVG based on given values
+        const svg = makeBadge(badgeValues);
+
+        response.type("image/svg+xml");
+        response.send(svg);
+    } catch (error) {
+        sendHttpError(response, error.message);
     }
 });
 
diff --git a/server/routers/status-page-router.js b/server/routers/status-page-router.js
index de075db8d..28cf5f4c9 100644
--- a/server/routers/status-page-router.js
+++ b/server/routers/status-page-router.js
@@ -2,7 +2,7 @@ let express = require("express");
 const apicache = require("../modules/apicache");
 const { UptimeKumaServer } = require("../uptime-kuma-server");
 const StatusPage = require("../model/status_page");
-const { allowDevAllOrigin, send403 } = require("../util-server");
+const { allowDevAllOrigin, sendHttpError } = require("../util-server");
 const { R } = require("redbean-node");
 const Monitor = require("../model/monitor");
 
@@ -44,10 +44,7 @@ router.get("/api/status-page/:slug", cache("5 minutes"), async (request, respons
         let statusPageData = await StatusPage.getStatusPageData(statusPage);
 
         if (!statusPageData) {
-            response.statusCode = 404;
-            response.json({
-                msg: "Not Found"
-            });
+            sendHttpError(response, "Not Found");
             return;
         }
 
@@ -55,7 +52,7 @@ router.get("/api/status-page/:slug", cache("5 minutes"), async (request, respons
         response.json(statusPageData);
 
     } catch (error) {
-        send403(response, error.message);
+        sendHttpError(response, error.message);
     }
 });
 
@@ -103,7 +100,7 @@ router.get("/api/status-page/heartbeat/:slug", cache("1 minutes"), async (reques
         });
 
     } catch (error) {
-        send403(response, error.message);
+        sendHttpError(response, error.message);
     }
 });
 
@@ -119,10 +116,7 @@ router.get("/api/status-page/:slug/manifest.json", cache("1440 minutes"), async
         ]);
 
         if (!statusPage) {
-            response.statusCode = 404;
-            response.json({
-                msg: "Not Found"
-            });
+            sendHttpError(response, "Not Found");
             return;
         }
 
@@ -141,7 +135,7 @@ router.get("/api/status-page/:slug/manifest.json", cache("1440 minutes"), async
         });
 
     } catch (error) {
-        send403(response, error.message);
+        sendHttpError(response, error.message);
     }
 });
 
diff --git a/server/server.js b/server/server.js
index 594c29b31..57a6a8fa7 100644
--- a/server/server.js
+++ b/server/server.js
@@ -11,6 +11,9 @@ dayjs.extend(require("dayjs/plugin/utc"));
 dayjs.extend(require("./modules/dayjs/plugin/timezone"));
 dayjs.extend(require("dayjs/plugin/customParseFormat"));
 
+// Load environment variables from `.env`
+require("dotenv").config();
+
 // Check Node.js Version
 const nodeVersion = parseInt(process.versions.node.split(".")[0]);
 const requiredVersion = 14;
@@ -138,6 +141,7 @@ const { maintenanceSocketHandler } = require("./socket-handlers/maintenance-sock
 const { generalSocketHandler } = require("./socket-handlers/general-socket-handler");
 const { Settings } = require("./settings");
 const { CacheableDnsHttpAgent } = require("./cacheable-dns-http-agent");
+const { pluginsHandler } = require("./socket-handlers/plugins-handler");
 
 app.use(express.json());
 
@@ -166,7 +170,7 @@ let needSetup = false;
     Database.init(args);
     await initDatabase(testMode);
     await server.initAfterDatabaseReady();
-
+    server.loadPlugins();
     server.entryPage = await Settings.get("entryPage");
     await StatusPage.loadDomainMappingList();
 
@@ -574,7 +578,6 @@ let needSetup = false;
                     });
                 }
             } catch (error) {
-                console.log(error);
                 callback({
                     ok: false,
                     msg: error.message,
@@ -674,9 +677,6 @@ let needSetup = false;
                     throw new Error("Permission denied.");
                 }
 
-                // Reset Prometheus labels
-                server.monitorList[monitor.id]?.prometheus()?.remove();
-
                 bean.name = monitor.name;
                 bean.type = monitor.type;
                 bean.url = monitor.url;
@@ -689,12 +689,14 @@ let needSetup = false;
                 bean.retryInterval = monitor.retryInterval;
                 bean.resendInterval = monitor.resendInterval;
                 bean.hostname = monitor.hostname;
+                bean.game = monitor.game;
                 bean.maxretries = monitor.maxretries;
                 bean.port = parseInt(monitor.port);
                 bean.keyword = monitor.keyword;
                 bean.ignoreTls = monitor.ignoreTls;
                 bean.expiryNotification = monitor.expiryNotification;
                 bean.upsideDown = monitor.upsideDown;
+                bean.packetSize = monitor.packetSize;
                 bean.maxredirects = monitor.maxredirects;
                 bean.accepted_statuscodes_json = JSON.stringify(monitor.accepted_statuscodes);
                 bean.dns_resolve_type = monitor.dns_resolve_type;
@@ -714,6 +716,7 @@ let needSetup = false;
                 bean.authDomain = monitor.authDomain;
                 bean.grpcUrl = monitor.grpcUrl;
                 bean.grpcProtobuf = monitor.grpcProtobuf;
+                bean.grpcServiceName = monitor.grpcServiceName;
                 bean.grpcMethod = monitor.grpcMethod;
                 bean.grpcBody = monitor.grpcBody;
                 bean.grpcMetadata = monitor.grpcMetadata;
@@ -723,6 +726,7 @@ let needSetup = false;
                 bean.radiusCalledStationId = monitor.radiusCalledStationId;
                 bean.radiusCallingStationId = monitor.radiusCallingStationId;
                 bean.radiusSecret = monitor.radiusSecret;
+                bean.httpBodyEncoding = monitor.httpBodyEncoding;
 
                 bean.validate();
 
@@ -940,13 +944,21 @@ let needSetup = false;
             try {
                 checkLogin(socket);
 
-                let bean = await R.findOne("monitor", " id = ? ", [ tag.id ]);
+                let bean = await R.findOne("tag", " id = ? ", [ tag.id ]);
+                if (bean == null) {
+                    callback({
+                        ok: false,
+                        msg: "Tag not found",
+                    });
+                    return;
+                }
                 bean.name = tag.name;
                 bean.color = tag.color;
                 await R.store(bean);
 
                 callback({
                     ok: true,
+                    msg: "Saved",
                     tag: await bean.toJSON(),
                 });
 
@@ -1490,6 +1502,7 @@ let needSetup = false;
         dockerSocketHandler(socket);
         maintenanceSocketHandler(socket);
         generalSocketHandler(socket, server);
+        pluginsHandler(socket, server);
 
         log.debug("server", "added all socket handlers");
 
diff --git a/server/socket-handlers/general-socket-handler.js b/server/socket-handlers/general-socket-handler.js
index 700b4a384..bb4a38086 100644
--- a/server/socket-handlers/general-socket-handler.js
+++ b/server/socket-handlers/general-socket-handler.js
@@ -2,6 +2,29 @@ const { log } = require("../../src/util");
 const { Settings } = require("../settings");
 const { sendInfo } = require("../client");
 const { checkLogin } = require("../util-server");
+const GameResolver = require("gamedig/lib/GameResolver");
+
+let gameResolver = new GameResolver();
+let gameList = null;
+
+/**
+ * Get a game list via GameDig
+ * @returns {Object[]} list of games supported by GameDig
+ */
+function getGameList() {
+    if (gameList == null) {
+        gameList = gameResolver._readGames().games.sort((a, b) => {
+            if ( a.pretty < b.pretty ) {
+                return -1;
+            }
+            if ( a.pretty > b.pretty ) {
+                return 1;
+            }
+            return 0;
+        });
+    }
+    return gameList;
+}
 
 module.exports.generalSocketHandler = (socket, server) => {
 
@@ -17,4 +40,11 @@ module.exports.generalSocketHandler = (socket, server) => {
         }
     });
 
+    socket.on("getGameList", async (callback) => {
+        callback({
+            ok: true,
+            gameList: getGameList(),
+        });
+    });
+
 };
diff --git a/server/socket-handlers/maintenance-socket-handler.js b/server/socket-handlers/maintenance-socket-handler.js
index 5294050ca..929150cdd 100644
--- a/server/socket-handlers/maintenance-socket-handler.js
+++ b/server/socket-handlers/maintenance-socket-handler.js
@@ -244,6 +244,8 @@ module.exports.maintenanceSocketHandler = (socket) => {
                 socket.userID,
             ]);
 
+            apicache.clear();
+
             callback({
                 ok: true,
                 msg: "Deleted Successfully.",
@@ -269,6 +271,8 @@ module.exports.maintenanceSocketHandler = (socket) => {
                 maintenanceID,
             ]);
 
+            apicache.clear();
+
             callback({
                 ok: true,
                 msg: "Paused Successfully.",
@@ -294,6 +298,8 @@ module.exports.maintenanceSocketHandler = (socket) => {
                 maintenanceID,
             ]);
 
+            apicache.clear();
+
             callback({
                 ok: true,
                 msg: "Resume Successfully",
diff --git a/server/socket-handlers/plugins-handler.js b/server/socket-handlers/plugins-handler.js
new file mode 100644
index 000000000..533da309b
--- /dev/null
+++ b/server/socket-handlers/plugins-handler.js
@@ -0,0 +1,69 @@
+const { checkLogin } = require("../util-server");
+const { PluginsManager } = require("../plugins-manager");
+const { log } = require("../../src/util.js");
+
+/**
+ * Handlers for plugins
+ * @param {Socket} socket Socket.io instance
+ * @param {UptimeKumaServer} server
+ */
+module.exports.pluginsHandler = (socket, server) => {
+
+    const pluginManager = server.getPluginManager();
+
+    // Get Plugin List
+    socket.on("getPluginList", async (callback) => {
+        try {
+            checkLogin(socket);
+
+            log.debug("plugin", "PluginManager.disable: " + PluginsManager.disable);
+
+            if (PluginsManager.disable) {
+                throw new Error("Plugin Disabled: In order to enable plugin feature, you need to use the default data directory: ./data/");
+            }
+
+            let pluginList = await pluginManager.fetchPluginList();
+            callback({
+                ok: true,
+                pluginList,
+            });
+        } catch (error) {
+            log.warn("plugin", "Error: " + error.message);
+            callback({
+                ok: false,
+                msg: error.message,
+            });
+        }
+    });
+
+    socket.on("installPlugin", async (repoURL, name, callback) => {
+        try {
+            checkLogin(socket);
+            pluginManager.downloadPlugin(repoURL, name);
+            await pluginManager.loadPlugin(name);
+            callback({
+                ok: true,
+            });
+        } catch (error) {
+            callback({
+                ok: false,
+                msg: error.message,
+            });
+        }
+    });
+
+    socket.on("uninstallPlugin", async (name, callback) => {
+        try {
+            checkLogin(socket);
+            await pluginManager.removePlugin(name);
+            callback({
+                ok: true,
+            });
+        } catch (error) {
+            callback({
+                ok: false,
+                msg: error.message,
+            });
+        }
+    });
+};
diff --git a/server/socket-handlers/status-page-socket-handler.js b/server/socket-handlers/status-page-socket-handler.js
index 16d6ee73b..717aba9c4 100644
--- a/server/socket-handlers/status-page-socket-handler.js
+++ b/server/socket-handlers/status-page-socket-handler.js
@@ -163,6 +163,7 @@ module.exports.statusPageSocketHandler = (socket) => {
             statusPage.custom_css = config.customCSS;
             statusPage.show_powered_by = config.showPoweredBy;
             statusPage.modified_date = R.isoDateTime();
+            statusPage.google_analytics_tag_id = config.googleAnalyticsId;
 
             await R.store(statusPage);
 
diff --git a/server/uptime-cache-list.js b/server/uptime-cache-list.js
index 1347968fa..d88a9cbf8 100644
--- a/server/uptime-cache-list.js
+++ b/server/uptime-cache-list.js
@@ -6,10 +6,10 @@ class UptimeCacheList {
     static list = {};
 
     /**
-     *
-     * @param monitorID
-     * @param duration
-     * @return number
+     * Get the uptime for a specific period
+     * @param {number} monitorID
+     * @param {number} duration
+     * @return {number}
      */
     static getUptime(monitorID, duration) {
         if (UptimeCacheList.list[monitorID] && UptimeCacheList.list[monitorID][duration]) {
@@ -20,6 +20,12 @@ class UptimeCacheList {
         }
     }
 
+    /**
+     * Add uptime for specified monitor
+     * @param {number} monitorID
+     * @param {number} duration
+     * @param {number} uptime Uptime to add
+     */
     static addUptime(monitorID, duration, uptime) {
         log.debug("UptimeCacheList", "addUptime: " + monitorID + " " + duration);
         if (!UptimeCacheList.list[monitorID]) {
@@ -28,6 +34,10 @@ class UptimeCacheList {
         UptimeCacheList.list[monitorID][duration] = uptime;
     }
 
+    /**
+     * Clear cache for specified monitor
+     * @param {number} monitorID
+     */
     static clearCache(monitorID) {
         log.debug("UptimeCacheList", "clearCache: " + monitorID);
         delete UptimeCacheList.list[monitorID];
diff --git a/server/uptime-kuma-server.js b/server/uptime-kuma-server.js
index 062375626..0573f0d8c 100644
--- a/server/uptime-kuma-server.js
+++ b/server/uptime-kuma-server.js
@@ -10,6 +10,7 @@ const util = require("util");
 const { CacheableDnsHttpAgent } = require("./cacheable-dns-http-agent");
 const { Settings } = require("./settings");
 const dayjs = require("dayjs");
+const { PluginsManager } = require("./plugins-manager");
 // DO NOT IMPORT HERE IF THE MODULES USED `UptimeKumaServer.getInstance()`
 
 /**
@@ -48,6 +49,20 @@ class UptimeKumaServer {
 
     generateMaintenanceTimeslotsInterval = undefined;
 
+    /**
+     * Plugins Manager
+     * @type {PluginsManager}
+     */
+    pluginsManager = null;
+
+    /**
+     *
+     * @type {{}}
+     */
+    static monitorTypeList = {
+
+    };
+
     static getInstance(args) {
         if (UptimeKumaServer.instance == null) {
             UptimeKumaServer.instance = new UptimeKumaServer(args);
@@ -86,6 +101,7 @@ class UptimeKumaServer {
         this.io = new Server(this.httpServer);
     }
 
+    /** Initialise app after the database has been set up */
     async initAfterDatabaseReady() {
         await CacheableDnsHttpAgent.update();
 
@@ -98,6 +114,11 @@ class UptimeKumaServer {
         this.generateMaintenanceTimeslotsInterval = setInterval(this.generateMaintenanceTimeslots, 60 * 1000);
     }
 
+    /**
+     * Send list of monitors to client
+     * @param {Socket} socket
+     * @returns {Object} List of monitors
+     */
     async sendMonitorList(socket) {
         let list = await this.getMonitorJSONList(socket.userID);
         this.io.to(socket.userID).emit("monitorList", list);
@@ -134,6 +155,11 @@ class UptimeKumaServer {
         return await this.sendMaintenanceListByUserID(socket.userID);
     }
 
+    /**
+     * Send list of maintenances to user
+     * @param {number} userID
+     * @returns {Object}
+     */
     async sendMaintenanceListByUserID(userID) {
         let list = await this.getMaintenanceJSONList(userID);
         this.io.to(userID).emit("maintenanceList", list);
@@ -185,6 +211,11 @@ class UptimeKumaServer {
         errorLogStream.end();
     }
 
+    /**
+     * Get the IP of the client connected to the socket
+     * @param {Socket} socket
+     * @returns {string}
+     */
     async getClientIP(socket) {
         let clientIP = socket.client.conn.remoteAddress;
 
@@ -203,6 +234,12 @@ class UptimeKumaServer {
         }
     }
 
+    /**
+     * Attempt to get the current server timezone
+     * If this fails, fall back to environment variables and then make a
+     * guess.
+     * @returns {string}
+     */
     async getTimezone() {
         let timezone = await Settings.get("serverTimezone");
         if (timezone) {
@@ -214,16 +251,25 @@ class UptimeKumaServer {
         }
     }
 
+    /**
+     * Get the current offset
+     * @returns {string}
+     */
     getTimezoneOffset() {
         return dayjs().format("Z");
     }
 
+    /**
+     * Set the current server timezone and environment variables
+     * @param {string} timezone
+     */
     async setTimezone(timezone) {
         await Settings.set("serverTimezone", timezone, "general");
         process.env.TZ = timezone;
         dayjs.tz.setDefault(timezone);
     }
 
+    /** Load the timeslots for maintenance */
     async generateMaintenanceTimeslots() {
 
         let list = await R.find("maintenance_timeslot", " generated_next = 0 AND start_date <= DATETIME('now') ");
@@ -237,9 +283,50 @@ class UptimeKumaServer {
 
     }
 
+    /** Stop the server */
     async stop() {
         clearTimeout(this.generateMaintenanceTimeslotsInterval);
     }
+
+    loadPlugins() {
+        this.pluginsManager = new PluginsManager(this);
+    }
+
+    /**
+     *
+     * @returns {PluginsManager}
+     */
+    getPluginManager() {
+        return this.pluginsManager;
+    }
+
+    /**
+     *
+     * @param {MonitorType} monitorType
+     */
+    addMonitorType(monitorType) {
+        if (monitorType instanceof MonitorType && monitorType.name) {
+            if (monitorType.name in UptimeKumaServer.monitorTypeList) {
+                log.error("", "Conflict Monitor Type name");
+            }
+            UptimeKumaServer.monitorTypeList[monitorType.name] = monitorType;
+        } else {
+            log.error("", "Invalid Monitor Type: " + monitorType.name);
+        }
+    }
+
+    /**
+     *
+     * @param {MonitorType} monitorType
+     */
+    removeMonitorType(monitorType) {
+        if (UptimeKumaServer.monitorTypeList[monitorType.name] === monitorType) {
+            delete UptimeKumaServer.monitorTypeList[monitorType.name];
+        } else {
+            log.error("", "Remove MonitorType failed: " + monitorType.name);
+        }
+    }
+
 }
 
 module.exports = {
@@ -248,3 +335,4 @@ module.exports = {
 
 // Must be at the end
 const MaintenanceTimeslot = require("./model/maintenance_timeslot");
+const { MonitorType } = require("./monitor-types/monitor-type");
diff --git a/server/util-server.js b/server/util-server.js
index 0bf69133b..129e15265 100644
--- a/server/util-server.js
+++ b/server/util-server.js
@@ -1,5 +1,5 @@
 const tcpp = require("tcp-ping");
-const Ping = require("./ping-lite");
+const ping = require("@louislam/ping");
 const { R } = require("redbean-node");
 const { log, genSecret } = require("../src/util");
 const passwordHash = require("./password-hash");
@@ -14,11 +14,13 @@ const mssql = require("mssql");
 const { Client } = require("pg");
 const postgresConParse = require("pg-connection-string").parse;
 const mysql = require("mysql2");
+const { MongoClient } = require("mongodb");
 const { NtlmClient } = require("axios-ntlm");
 const { Settings } = require("./settings");
 const grpc = require("@grpc/grpc-js");
 const protojs = require("protobufjs");
 const radiusClient = require("node-radius-client");
+const redis = require("redis");
 const {
     dictionaries: {
         rfc2865: { file, attributes },
@@ -26,12 +28,7 @@ const {
 } = require("node-radius-utils");
 const dayjs = require("dayjs");
 
-// From ping-lite
-exports.WIN = /^win/.test(process.platform);
-exports.LIN = /^linux/.test(process.platform);
-exports.MAC = /^darwin/.test(process.platform);
-exports.FBSD = /^freebsd/.test(process.platform);
-exports.BSD = /bsd$/.test(process.platform);
+const isWindows = process.platform === /^win/.test(process.platform);
 
 /**
  * Init or reset JWT secret
@@ -82,15 +79,16 @@ exports.tcping = function (hostname, port) {
 /**
  * Ping the specified machine
  * @param {string} hostname Hostname / address of machine
+ * @param {number} [size=56] Size of packet to send
  * @returns {Promise<number>} Time for ping in ms rounded to nearest integer
  */
-exports.ping = async (hostname) => {
+exports.ping = async (hostname, size = 56) => {
     try {
-        return await exports.pingAsync(hostname);
+        return await exports.pingAsync(hostname, false, size);
     } catch (e) {
         // If the host cannot be resolved, try again with ipv6
         if (e.message.includes("service not known")) {
-            return await exports.pingAsync(hostname, true);
+            return await exports.pingAsync(hostname, true, size);
         } else {
             throw e;
         }
@@ -101,22 +99,29 @@ exports.ping = async (hostname) => {
  * Ping the specified machine
  * @param {string} hostname Hostname / address of machine to ping
  * @param {boolean} ipv6 Should IPv6 be used?
+ * @param {number} [size = 56] Size of ping packet to send
  * @returns {Promise<number>} Time for ping in ms rounded to nearest integer
  */
-exports.pingAsync = function (hostname, ipv6 = false) {
+exports.pingAsync = function (hostname, ipv6 = false, size = 56) {
     return new Promise((resolve, reject) => {
-        const ping = new Ping(hostname, {
-            ipv6
-        });
-
-        ping.send(function (err, ms, stdout) {
-            if (err) {
-                reject(err);
-            } else if (ms === null) {
-                reject(new Error(stdout));
+        ping.promise.probe(hostname, {
+            v6: ipv6,
+            min_reply: 1,
+            deadline: 10,
+            packetSize: size,
+        }).then((res) => {
+            // If ping failed, it will set field to unknown
+            if (res.alive) {
+                resolve(res.time);
             } else {
-                resolve(Math.round(ms));
+                if (isWindows) {
+                    reject(new Error(exports.convertToUTF8(res.output)));
+                } else {
+                    reject(new Error(res.output));
+                }
             }
+        }).catch((err) => {
+            reject(err);
         });
     });
 };
@@ -135,7 +140,7 @@ exports.mqttAsync = function (hostname, topic, okMessage, options = {}) {
         const { port, username, password, interval = 20 } = options;
 
         // Adds MQTT protocol to the hostname if not already present
-        if (!/^(?:http|mqtt)s?:\/\//.test(hostname)) {
+        if (!/^(?:http|mqtt|ws)s?:\/\//.test(hostname)) {
             hostname = "mqtt://" + hostname;
         }
 
@@ -145,10 +150,11 @@ exports.mqttAsync = function (hostname, topic, okMessage, options = {}) {
             reject(new Error("Timeout"));
         }, interval * 1000 * 0.8);
 
-        log.debug("mqtt", "MQTT connecting");
+        const mqttUrl = `${hostname}:${port}`;
 
-        let client = mqtt.connect(hostname, {
-            port,
+        log.debug("mqtt", `MQTT connecting to ${mqttUrl}`);
+
+        let client = mqtt.connect(mqttUrl, {
             username,
             password
         });
@@ -248,19 +254,19 @@ exports.dnsResolve = function (hostname, resolverServer, resolverPort, rrtype) {
  * @param {string} query The query to validate the database with
  * @returns {Promise<(string[]|Object[]|Object)>}
  */
-exports.mssqlQuery = function (connectionString, query) {
-    return new Promise((resolve, reject) => {
-        mssql.connect(connectionString).then(pool => {
-            return pool.request()
-                .query(query);
-        }).then(result => {
-            resolve(result);
-        }).catch(err => {
-            reject(err);
-        }).finally(() => {
-            mssql.close();
-        });
-    });
+exports.mssqlQuery = async function (connectionString, query) {
+    let pool;
+    try {
+        pool = new mssql.ConnectionPool(connectionString);
+        await pool.connect();
+        await pool.request().query(query);
+        pool.close();
+    } catch (e) {
+        if (pool) {
+            pool.close();
+        }
+        throw e;
+    }
 };
 
 /**
@@ -280,18 +286,32 @@ exports.postgresQuery = function (connectionString, query) {
 
         const client = new Client({ connectionString });
 
-        client.connect();
-
-        return client.query(query)
-            .then(res => {
-                resolve(res);
-            })
-            .catch(err => {
+        client.connect((err) => {
+            if (err) {
                 reject(err);
-            })
-            .finally(() => {
                 client.end();
-            });
+            } else {
+                // Connected here
+                try {
+                    // No query provided by user, use SELECT 1
+                    if (!query || (typeof query === "string" && query.trim() === "")) {
+                        query = "SELECT 1";
+                    }
+
+                    client.query(query, (err, res) => {
+                        if (err) {
+                            reject(err);
+                        } else {
+                            resolve(res);
+                        }
+                        client.end();
+                    });
+                } catch (e) {
+                    reject(e);
+                }
+            }
+        });
+
     });
 };
 
@@ -312,11 +332,28 @@ exports.mysqlQuery = function (connectionString, query) {
                 reject(err);
             })
             .finally(() => {
-                connection.end();
+                connection.destroy();
             });
     });
 };
 
+/**
+ * Connect to and Ping a MongoDB database
+ * @param {string} connectionString The database connection string
+ * @returns {Promise<(string[]|Object[]|Object)>}
+ */
+exports.mongodbPing = async function (connectionString) {
+    let client = await MongoClient.connect(connectionString);
+    let dbPing = await client.db().command({ ping: 1 });
+    await client.close();
+
+    if (dbPing["ok"] === 1) {
+        return "UP";
+    } else {
+        throw Error("failed");
+    }
+};
+
 /**
  * Query radius server
  * @param {string} hostname Hostname of radius server
@@ -354,6 +391,30 @@ exports.radius = function (
     });
 };
 
+/**
+ * Redis server ping
+ * @param {string} dsn The redis connection string
+ */
+exports.redisPingAsync = function (dsn) {
+    return new Promise((resolve, reject) => {
+        const client = redis.createClient({
+            url: dsn,
+        });
+        client.on("error", (err) => {
+            reject(err);
+        });
+        client.connect().then(() => {
+            client.ping().then((res, err) => {
+                if (err) {
+                    reject(err);
+                } else {
+                    resolve(res);
+                }
+            });
+        });
+    });
+};
+
 /**
  * Retrieve value of setting based on key
  * @param {string} key Key of setting to retrieve
@@ -678,15 +739,27 @@ exports.filterAndJoin = (parts, connector = "") => {
 };
 
 /**
- * Send a 403 response
+ * Send an Error response
  * @param {Object} res Express response object
  * @param {string} [msg=""] Message to send
  */
-module.exports.send403 = (res, msg = "") => {
-    res.status(403).json({
-        "status": "fail",
-        "msg": msg,
-    });
+module.exports.sendHttpError = (res, msg = "") => {
+    if (msg.includes("SQLITE_BUSY") || msg.includes("SQLITE_LOCKED")) {
+        res.status(503).json({
+            "status": "fail",
+            "msg": msg,
+        });
+    } else if (msg.toLowerCase().includes("not found")) {
+        res.status(404).json({
+            "status": "fail",
+            "msg": msg,
+        });
+    } else {
+        res.status(403).json({
+            "status": "fail",
+            "msg": msg,
+        });
+    }
 };
 
 function timeObjectConvertTimezone(obj, timezone, timeObjectToUTC = true) {
@@ -778,22 +851,31 @@ module.exports.grpcQuery = async (options) => {
             cb);
     }, false, false);
     return new Promise((resolve, _) => {
-        return grpcService[`${grpcMethod}`](JSON.parse(grpcBody), function (err, response) {
-            const responseData = JSON.stringify(response);
-            if (err) {
-                return resolve({
-                    code: err.code,
-                    errorMessage: err.details,
-                    data: ""
-                });
-            } else {
-                log.debug("monitor:", `gRPC response: ${response}`);
-                return resolve({
-                    code: 1,
-                    errorMessage: "",
-                    data: responseData
-                });
-            }
-        });
+        try {
+            return grpcService[`${grpcMethod}`](JSON.parse(grpcBody), function (err, response) {
+                const responseData = JSON.stringify(response);
+                if (err) {
+                    return resolve({
+                        code: err.code,
+                        errorMessage: err.details,
+                        data: ""
+                    });
+                } else {
+                    log.debug("monitor:", `gRPC response: ${JSON.stringify(response)}`);
+                    return resolve({
+                        code: 1,
+                        errorMessage: "",
+                        data: responseData
+                    });
+                }
+            });
+        } catch (err) {
+            return resolve({
+                code: -1,
+                errorMessage: `Error ${err}. Please review your gRPC configuration option. The service name must not include package name value, and the method name must follow camelCase format`,
+                data: ""
+            });
+        }
+
     });
 };
diff --git a/src/assets/app.scss b/src/assets/app.scss
index 7da76fff0..f550406fd 100644
--- a/src/assets/app.scss
+++ b/src/assets/app.scss
@@ -35,6 +35,11 @@ textarea.form-control {
     color: $maintenance !important;
 }
 
+.incident a,
+.bg-maintenance a {
+    color: inherit;
+}
+
 .list-group {
     border-radius: 0.75rem;
 
@@ -248,6 +253,11 @@ optgroup {
         }
     }
 
+    .incident a,
+    .bg-maintenance a {
+        color: inherit;
+    }
+
     .form-control,
     .form-control:focus,
     .form-select,
diff --git a/src/assets/localization.scss b/src/assets/localization.scss
index f9a28d8a4..97be37785 100644
--- a/src/assets/localization.scss
+++ b/src/assets/localization.scss
@@ -2,4 +2,8 @@ html[lang='fa'] {
     #app {
         font-family: 'IRANSans', 'Iranian Sans','B Nazanin', 'Tahoma', ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, segoe ui, Roboto, helvetica neue, Arial, noto sans, sans-serif, apple color emoji, segoe ui emoji, segoe ui symbol, noto color emoji;
     }
-}
\ No newline at end of file
+}
+
+ul.multiselect__content {
+    padding-left: 0 !important;
+}
diff --git a/src/components/DockerHostDialog.vue b/src/components/DockerHostDialog.vue
index 50ffa49c1..335e8f2b3 100644
--- a/src/components/DockerHostDialog.vue
+++ b/src/components/DockerHostDialog.vue
@@ -73,7 +73,7 @@ export default {
     emits: [ "added" ],
     data() {
         return {
-            model: null,
+            modal: null,
             processing: false,
             id: null,
             connectionTypes: [ "socket", "tcp" ],
@@ -91,11 +91,16 @@ export default {
     },
     methods: {
 
+        /** Confirm deletion of docker host */
         deleteConfirm() {
             this.modal.hide();
             this.$refs.confirmDelete.show();
         },
 
+        /**
+         * Show specified docker host
+         * @param {number} dockerHostID
+         */
         show(dockerHostID) {
             if (dockerHostID) {
                 let found = false;
@@ -126,6 +131,7 @@ export default {
             this.modal.show();
         },
 
+        /** Add docker host */
         submit() {
             this.processing = true;
             this.$root.getSocket().emit("addDockerHost", this.dockerHost, this.id, (res) => {
@@ -144,6 +150,7 @@ export default {
             });
         },
 
+        /** Test the docker host */
         test() {
             this.processing = true;
             this.$root.getSocket().emit("testDockerHost", this.dockerHost, (res) => {
@@ -152,6 +159,7 @@ export default {
             });
         },
 
+        /** Delete this docker host */
         deleteDockerHost() {
             this.processing = true;
             this.$root.getSocket().emit("deleteDockerHost", this.id, (res) => {
diff --git a/src/components/NotificationDialog.vue b/src/components/NotificationDialog.vue
index 0ca95c222..c3851b568 100644
--- a/src/components/NotificationDialog.vue
+++ b/src/components/NotificationDialog.vue
@@ -13,7 +13,10 @@
                         <div class="mb-3">
                             <label for="notification-type" class="form-label">{{ $t("Notification Type") }}</label>
                             <select id="notification-type" v-model="notification.type" class="form-select">
-                                <option v-for="type in notificationTypes" :key="type" :value="type">{{ $t(type) }}</option>
+                                <option v-for="(name, type) in notificationNameList.regularList" :key="type" :value="type">{{ name }}</option>
+                                <optgroup :label="$t('notificationRegional')">
+                                    <option v-for="(name, type) in notificationNameList.regionalList" :key="type" :value="type">{{ name }}</option>
+                                </optgroup>
                             </select>
                         </div>
 
@@ -67,7 +70,7 @@
     </Confirm>
 </template>
 
-<script lang="ts">
+<script>
 import { Modal } from "bootstrap";
 
 import Confirm from "./Confirm.vue";
@@ -103,7 +106,91 @@ export default {
                 return null;
             }
             return NotificationFormList[this.notification.type];
-        }
+        },
+
+        notificationNameList() {
+            let regularList = {
+                "alerta": "Alerta",
+                "AlertNow": "AlertNow",
+                "apprise": this.$t("apprise"),
+                "Bark": "Bark",
+                "clicksendsms": "ClickSend SMS",
+                "discord": "Discord",
+                "GoogleChat": "Google Chat (Google Workspace)",
+                "gorush": "Gorush",
+                "gotify": "Gotify",
+                "HomeAssistant": "Home Assistant",
+                "Kook": "Kook",
+                "line": "LINE Messenger",
+                "LineNotify": "LINE Notify",
+                "lunasea": "LunaSea",
+                "matrix": "Matrix",
+                "mattermost": "Mattermost",
+                "ntfy": "Ntfy",
+                "octopush": "Octopush",
+                "OneBot": "OneBot",
+                "PagerDuty": "PagerDuty",
+                "pushbullet": "Pushbullet",
+                "PushByTechulus": "Push by Techulus",
+                "pushover": "Pushover",
+                "pushy": "Pushy",
+                "rocket.chat": "Rocket.Chat",
+                "signal": "Signal",
+                "slack": "Slack",
+                "squadcast": "SquadCast",
+                "SMSEagle": "SMSEagle",
+                "smtp": this.$t("smtp"),
+                "stackfield": "Stackfield",
+                "teams": "Microsoft Teams",
+                "telegram": "Telegram",
+                "Splunk": "Splunk",
+                "webhook": "Webhook",
+                "GoAlert": "GoAlert",
+                "ZohoCliq": "ZohoCliq"
+            };
+
+            // Put notifications here if it's not supported in most regions or its documentation is not in English
+            let regionalList = {
+                "AliyunSMS": "AliyunSMS (阿里云短信服务)",
+                "DingDing": "DingDing (钉钉自定义机器人)",
+                "Feishu": "Feishu (飞书)",
+                "FreeMobile": "FreeMobile (mobile.free.fr)",
+                "PushDeer": "PushDeer",
+                "promosms": "PromoSMS",
+                "serwersms": "SerwerSMS.pl",
+                "SMSManager": "SmsManager (smsmanager.cz)",
+                "WeCom": "WeCom (企业微信群机器人)",
+                "ServerChan": "ServerChan (Server酱)",
+            };
+
+            // Sort by notification name
+            // No idea how, but it works
+            // https://stackoverflow.com/questions/1069666/sorting-object-property-by-values
+            let sort = (list2) => {
+                return Object.entries(list2)
+                    .sort(([ , a ], [ , b ]) => a.localeCompare(b))
+                    .reduce((r, [ k, v ]) => ({
+                        ...r,
+                        [k]: v
+                    }), {});
+            };
+
+            return {
+                regularList: sort(regularList),
+                regionalList: sort(regionalList),
+            };
+        },
+
+        notificationFullNameList() {
+            let list = {};
+            for (let [ key, value ] of Object.entries(this.notificationNameList.regularList)) {
+                list[key] = value;
+            }
+            for (let [ key, value ] of Object.entries(this.notificationNameList.regionalList)) {
+                list[key] = value;
+            }
+            return list;
+        },
     },
 
     watch: {
@@ -203,11 +290,12 @@ export default {
          * @return {string}
          */
         getUniqueDefaultName(notificationKey) {
+
             let index = 1;
             let name = "";
             do {
                 name = this.$t("defaultNotificationName", {
-                    notification: this.$t(notificationKey).replace(/\(.+\)/, "").trim(),
+                    notification: this.notificationFullNameList[notificationKey].replace(/\(.+\)/, "").trim(),
                     number: index++
                 });
             } while (this.$root.notificationList.find(it => it.name === name));
diff --git a/src/components/PluginItem.vue b/src/components/PluginItem.vue
new file mode 100644
index 000000000..4925bc9c8
--- /dev/null
+++ b/src/components/PluginItem.vue
@@ -0,0 +1,102 @@
+<template>
+    <div v-if="! (!plugin.installed && plugin.local)" class="plugin-item pt-4 pb-2">
+        <div class="info">
+            <h5>{{ plugin.fullName }}</h5>
+            <p class="description">
+                {{ plugin.description }}
+            </p>
+            <span class="version">{{ $t("Version") }}: {{ plugin.version }} <a v-if="plugin.repo" :href="plugin.repo" target="_blank">Repo</a></span>
+        </div>
+        <div class="buttons">
+            <button v-if="status === 'installing'" class="btn btn-primary" disabled>{{ $t("installing") }}</button>
+            <button v-else-if="status === 'uninstalling'" class="btn btn-danger" disabled>{{ $t("uninstalling") }}</button>
+            <button v-else-if="plugin.installed || status === 'installed'" class="btn btn-danger" @click="deleteConfirm">{{ $t("uninstall") }}</button>
+            <button v-else class="btn btn-primary" @click="install">{{ $t("install") }}</button>
+        </div>
+
+        <Confirm ref="confirmDelete" btn-style="btn-danger" :yes-text="$t('Yes')" :no-text="$t('No')" @yes="uninstall">
+            {{ $t("confirmUninstallPlugin") }}
+        </Confirm>
+    </div>
+</template>
+
+<script>
+import Confirm from "./Confirm.vue";
+
+export default {
+    components: {
+        Confirm,
+    },
+    props: {
+        plugin: {
+            type: Object,
+            required: true,
+        },
+    },
+    data() {
+        return {
+            status: "",
+        };
+    },
+    methods: {
+        /**
+         * Show confirmation for deleting a tag
+         */
+        deleteConfirm() {
+            this.$refs.confirmDelete.show();
+        },
+
+        install() {
+            this.status = "installing";
+
+            this.$root.getSocket().emit("installPlugin", this.plugin.repo, this.plugin.name, (res) => {
+                if (res.ok) {
+                    this.status = "";
+                    // eslint-disable-next-line vue/no-mutating-props
+                    this.plugin.installed = true;
+                } else {
+                    this.$root.toastRes(res);
+                }
+            });
+        },
+
+        uninstall() {
+            this.status = "uninstalling";
+
+            this.$root.getSocket().emit("uninstallPlugin", this.plugin.name, (res) => {
+                if (res.ok) {
+                    this.status = "";
+                    // eslint-disable-next-line vue/no-mutating-props
+                    this.plugin.installed = false;
+                } else {
+                    this.$root.toastRes(res);
+                }
+            });
+        }
+    }
+};
+</script>
+
+<style lang="scss" scoped>
+@import "../assets/vars.scss";
+
+.plugin-item {
+    display: flex;
+    justify-content: space-between;
+    align-content: center;
+    align-items: center;
+
+    .info {
+        margin-right: 10px;
+    }
+
+    .description {
+        font-size: 13px;
+        margin-bottom: 0;
+    }
+
+    .version {
+        font-size: 13px;
+    }
+}
+</style>
diff --git a/src/components/Tag.vue b/src/components/Tag.vue
index 705408b2d..b8d4a1e89 100644
--- a/src/components/Tag.vue
+++ b/src/components/Tag.vue
@@ -47,7 +47,7 @@ export default {
     },
     computed: {
         displayText() {
-            if (this.item.value === "") {
+            if (this.item.value === "" || this.item.value === undefined) {
                 return this.item.name;
             } else {
                 return `${this.item.name}: ${this.item.value}`;
diff --git a/src/components/TagEditDialog.vue b/src/components/TagEditDialog.vue
new file mode 100644
index 000000000..795589947
--- /dev/null
+++ b/src/components/TagEditDialog.vue
@@ -0,0 +1,468 @@
+<template>
+    <form @submit.prevent="submit">
+        <div ref="modal" class="modal fade" tabindex="-1" data-bs-backdrop="static">
+            <div class="modal-dialog">
+                <div class="modal-content">
+                    <div class="modal-header">
+                        <h5 id="exampleModalLabel" class="modal-title">
+                            {{ $t("Edit Tag") }}
+                        </h5>
+                        <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close" />
+                    </div>
+                    <div class="modal-body">
+                        <div class="mb-3">
+                            <label for="tag-name" class="form-label">{{ $t("Name") }}</label>
+                            <input
+                                id="tag-name"
+                                v-model="tag.name"
+                                type="text"
+                                class="form-control"
+                                :class="{'is-invalid': nameInvalid}"
+                                required
+                            >
+                            <div class="invalid-feedback">
+                                {{ $t("Tag with this name already exist.") }}
+                            </div>
+                        </div>
+
+                        <div class="mb-3">
+                            <label for="tag-color" class="form-label">{{ $t("color") }}</label>
+                            <div class="d-flex">
+                                <div class="col-8 pe-1">
+                                    <vue-multiselect
+                                        v-model="selectedColor"
+                                        :options="colorOptions"
+                                        :multiple="false"
+                                        :searchable="true"
+                                        :placeholder="$t('color')"
+                                        track-by="color"
+                                        label="name"
+                                        select-label=""
+                                        deselect-label=""
+                                    >
+                                        <template #option="{ option }">
+                                            <div
+                                                class="mx-2 py-1 px-3 rounded d-inline-flex"
+                                                style="height: 24px; color: white;"
+                                                :style="{ backgroundColor: option.color + ' !important' }"
+                                            >
+                                                <span>{{ option.name }}</span>
+                                            </div>
+                                        </template>
+                                        <template #singleLabel="{ option }">
+                                            <div
+                                                class="py-1 px-3 rounded d-inline-flex"
+                                                style="height: 24px; color: white;"
+                                                :style="{ backgroundColor: option.color + ' !important' }"
+                                            >
+                                                <span>{{ option.name }}</span>
+                                            </div>
+                                        </template>
+                                    </vue-multiselect>
+                                </div>
+                                <div class="col-4 ps-1">
+                                    <input id="tag-color-hex" v-model="tag.color" type="text" class="form-control">
+                                </div>
+                            </div>
+                        </div>
+
+                        <div class="mb-3">
+                            <label for="tag-monitors" class="form-label">{{ $tc("Monitor", selectedMonitors.length) }}</label>
+                            <div class="tag-monitors-list">
+                                <router-link v-for="monitor in selectedMonitors" :key="monitor.id" class="d-flex align-items-center justify-content-between text-decoration-none tag-monitors-list-row py-2 px-3" :to="monitorURL(monitor.id)" @click="modal.hide()">
+                                    <span>{{ monitor.name }}</span>
+                                    <button type="button" class="btn-rm-monitor btn btn-outline-danger ms-2 py-1" @click.stop.prevent="removeMonitor(monitor.id)">
+                                        <font-awesome-icon class="" icon="times" />
+                                    </button>
+                                </router-link>
+                            </div>
+                            <div v-if="allMonitorList.length > 0" class="pt-3 px-3">
+                                <label class="form-label">{{ $t("Add a monitor") }}:</label>
+                                <select v-model="selectedAddMonitor" class="form-control">
+                                    <option v-for="monitor in allMonitorList" :key="monitor.id" :value="monitor">{{ monitor.name }}</option>
+                                </select>
+                            </div>
+                        </div>
+                    </div>
+
+                    <div class="modal-footer">
+                        <button v-if="tag" type="button" class="btn btn-danger" :disabled="processing" @click="deleteConfirm">
+                            {{ $t("Delete") }}
+                        </button>
+                        <button type="submit" class="btn btn-primary" :disabled="processing">
+                            <div v-if="processing" class="spinner-border spinner-border-sm me-1"></div>
+                            {{ $t("Save") }}
+                        </button>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </form>
+
+    <Confirm ref="confirmDelete" btn-style="btn-danger" :yes-text="$t('Yes')" :no-text="$t('No')" @yes="deleteTag">
+        {{ $t("confirmDeleteTagMsg") }}
+    </Confirm>
+</template>
+
+<script>
+import { Modal } from "bootstrap";
+import Confirm from "./Confirm.vue";
+import VueMultiselect from "vue-multiselect";
+import { colorOptions } from "../util-frontend";
+import { useToast } from "vue-toastification";
+import { getMonitorRelativeURL } from "../util.ts";
+const toast = useToast();
+
+export default {
+    components: {
+        VueMultiselect,
+        Confirm,
+    },
+    props: {
+        updated: {
+            type: Function,
+            default: () => {},
+        },
+        existingTags: {
+            type: Array,
+            default: () => [],
+        },
+    },
+    data() {
+        return {
+            modal: null,
+            processing: false,
+            selectedColor: {
+                name: null,
+                color: null,
+            },
+            tag: {
+                id: null,
+                name: "",
+                color: "",
+                // Do not set default value here, please scroll to show()
+            },
+            monitors: [],
+            removingMonitor: [],
+            addingMonitor: [],
+            selectedAddMonitor: null,
+            nameInvalid: false,
+        };
+    },
+
+    computed: {
+        colorOptions() {
+            if (!colorOptions(this).find(option => option.color === this.tag.color)) {
+                return colorOptions(this).concat(
+                    {
+                        name: "custom",
+                        color: this.tag.color
+                    });
+            } else {
+                return colorOptions(this);
+            }
+        },
+        selectedMonitors() {
+            return this.monitors
+                .concat(Object.values(this.$root.monitorList).filter(monitor => this.addingMonitor.includes(monitor.id)))
+                .filter(monitor => !this.removingMonitor.includes(monitor.id));
+        },
+        allMonitorList() {
+            return Object.values(this.$root.monitorList).filter(monitor => !this.selectedMonitors.includes(monitor));
+        },
+    },
+
+    watch: {
+        // Set color option to "Custom" when a unknown color is entered
+        "tag.color"(to, from) {
+            if (to !== "" && colorOptions(this).find(x => x.color === to) == null) {
+                this.selectedColor.name = this.$t("Custom");
+                this.selectedColor.color = to;
+            }
+        },
+        "tag.name"(to, from) {
+            if (to != null) {
+                this.validate();
+            }
+        },
+        selectedColor(to, from) {
+            if (to != null) {
+                this.tag.color = to.color;
+            }
+        },
+        /**
+         * Selected a monitor and add to the list.
+         */
+        selectedAddMonitor(monitor) {
+            if (monitor) {
+                if (this.removingMonitor.includes(monitor.id)) {
+                    this.removingMonitor = this.removingMonitor.filter(id => id !== monitor.id);
+                } else {
+                    this.addingMonitor.push(monitor.id);
+                }
+                this.selectedAddMonitor = null;
+            }
+        },
+    },
+
+    mounted() {
+        this.modal = new Modal(this.$refs.modal);
+    },
+
+    methods: {
+        /**
+         * Show confirmation for deleting a tag
+         */
+        deleteConfirm() {
+            this.$refs.confirmDelete.show();
+        },
+
+        /**
+         * Reset the editTag form
+         */
+        reset() {
+            this.selectedColor = null;
+            this.tag = {
+                id: null,
+                name: "",
+                color: "",
+            };
+            this.monitors = [];
+            this.removingMonitor = [];
+            this.addingMonitor = [];
+        },
+
+        /**
+         * Check for existing tags of the same name, set invalid input
+         * @returns {boolean} True if editing tag is valid
+         */
+        validate() {
+            this.nameInvalid = false;
+            const sameName = this.existingTags.find((existingTag) => existingTag.name === this.tag.name);
+            if (sameName != null && sameName.id !== this.tag.id) {
+                this.nameInvalid = true;
+                return false;
+            }
+            return true;
+        },
+
+        /**
+         * Load tag information for display in the edit dialog
+         * @param {Object} tag tag object to edit
+         * @returns {void}
+         */
+        show(tag) {
+            if (tag) {
+                this.selectedColor = this.colorOptions.find(x => x.color === tag.color) ?? {
+                    name: this.$t("Custom"),
+                    color: tag.color
+                };
+                this.tag.id = tag.id;
+                this.tag.name = tag.name;
+                this.tag.color = tag.color;
+                this.monitors = this.monitorsByTag(tag.id);
+                this.removingMonitor = [];
+                this.addingMonitor = [];
+                this.selectedAddMonitor = null;
+            }
+
+            this.modal.show();
+        },
+
+        /**
+         * Submit tag and monitorTag changes to server
+         * @returns {void}
+         */
+        async submit() {
+            this.processing = true;
+            let editResult = true;
+
+            if (!this.validate()) {
+                this.processing = false;
+                return;
+            }
+
+            if (this.tag.id == null) {
+                await this.addTagAsync(this.tag).then((res) => {
+                    if (!res.ok) {
+                        this.$root.toastRes(res.msg);
+                        editResult = false;
+                    } else {
+                        this.tag.id = res.tag.id;
+                        this.updated();
+                    }
+                });
+            }
+
+            if (!editResult) {
+                return;
+            }
+
+            for (let addId of this.addingMonitor) {
+                await this.addMonitorTagAsync(this.tag.id, addId, "").then((res) => {
+                    if (!res.ok) {
+                        toast.error(res.msg);
+                        editResult = false;
+                    }
+                });
+            }
+
+            for (let removeId of this.removingMonitor) {
+                this.monitors.find(monitor => monitor.id === removeId)?.tags.forEach(async (monitorTag) => {
+                    await this.deleteMonitorTagAsync(this.tag.id, removeId, monitorTag.value).then((res) => {
+                        if (!res.ok) {
+                            toast.error(res.msg);
+                            editResult = false;
+                        }
+                    });
+                });
+            }
+
+            this.$root.getSocket().emit("editTag", this.tag, (res) => {
+                this.$root.toastRes(res);
+                this.processing = false;
+
+                if (res.ok && editResult) {
+                    this.updated();
+                    this.modal.hide();
+                }
+            });
+        },
+
+        /**
+         * Delete the editing tag from server
+         * @returns {void}
+         */
+        async deleteTag() {
+            this.processing = true;
+            await this.deleteTagAsync(this.tag.id).then((res) => {
+                this.$root.toastRes(res);
+                this.processing = false;
+
+                if (res.ok) {
+                    this.updated();
+                    this.modal.hide();
+                }
+            });
+        },
+
+        /**
+         * Remove a monitor from the monitors list locally
+         * @param {number} id id of the tag to remove
+         * @returns {void}
+         */
+        removeMonitor(id) {
+            if (this.addingMonitor.includes(id)) {
+                this.addingMonitor = this.addingMonitor.filter(x => x !== id);
+            } else {
+                this.removingMonitor.push(id);
+            }
+        },
+
+        /**
+         * Get monitors which has a specific tag locally
+         * @param {number} tagId id of the tag to filter
+         * @returns {Object[]} list of monitors which has a specific tag
+         */
+        monitorsByTag(tagId) {
+            return Object.values(this.$root.monitorList).filter((monitor) => {
+                return monitor.tags.find(monitorTag => monitorTag.tag_id === tagId);
+            });
+        },
+
+        /**
+         * Get URL of monitor
+         * @param {number} id ID of monitor
+         * @returns {string} Relative URL of monitor
+         */
+        monitorURL(id) {
+            return getMonitorRelativeURL(id);
+        },
+
+        /**
+         * Add a tag asynchronously
+         * @param {Object} newTag Object representing new tag to add
+         * @returns {Promise<void>}
+         */
+        addTagAsync(newTag) {
+            return new Promise((resolve) => {
+                this.$root.getSocket().emit("addTag", newTag, resolve);
+            });
+        },
+
+        /**
+         * Delete a tag asynchronously
+         * @param {number} tagId ID of tag to delete
+         * @returns {Promise<void>}
+         */
+        deleteTagAsync(tagId) {
+            return new Promise((resolve) => {
+                this.$root.getSocket().emit("deleteTag", tagId, resolve);
+            });
+        },
+
+        /**
+         * Add a tag to a monitor asynchronously
+         * @param {number} tagId ID of tag to add
+         * @param {number} monitorId ID of monitor to add tag to
+         * @param {string} value Value of tag
+         * @returns {Promise<void>}
+         */
+        addMonitorTagAsync(tagId, monitorId, value) {
+            return new Promise((resolve) => {
+                this.$root.getSocket().emit("addMonitorTag", tagId, monitorId, value, resolve);
+            });
+        },
+        /**
+         * Delete a tag from a monitor asynchronously
+         * @param {number} tagId ID of tag to remove
+         * @param {number} monitorId ID of monitor to remove tag from
+         * @param {string} value Value of tag
+         * @returns {Promise<void>}
+         */
+        deleteMonitorTagAsync(tagId, monitorId, value) {
+            return new Promise((resolve) => {
+                this.$root.getSocket().emit("deleteMonitorTag", tagId, monitorId, value, resolve);
+            });
+        },
+    },
+};
+</script>
+
+<style lang="scss" scoped>
+@import "../assets/vars.scss";
+
+.dark {
+    .modal-dialog .form-text, .modal-dialog p {
+        color: $dark-font-color;
+    }
+}
+
+.btn-rm-monitor {
+    padding-left: 11px;
+    padding-right: 11px;
+}
+
+.tag-monitors-list {
+    max-height: 40vh;
+    overflow-y: scroll;
+}
+
+.tag-monitors-list .tag-monitors-list-row {
+    cursor: pointer;
+    border-bottom: 1px solid rgba(0, 0, 0, 0.125);
+
+    .dark & {
+        border-bottom: 1px solid $dark-border-color;
+    }
+
+    &:hover {
+        background-color: $highlight-white;
+    }
+
+    .dark &:hover {
+        background-color: $dark-bg2;
+    }
+}
+
+</style>
diff --git a/src/components/TagsManager.vue b/src/components/TagsManager.vue
index 9de3208f1..ac374813d 100644
--- a/src/components/TagsManager.vue
+++ b/src/components/TagsManager.vue
@@ -130,6 +130,7 @@
 import { Modal } from "bootstrap";
 import VueMultiselect from "vue-multiselect";
 import { useToast } from "vue-toastification";
+import { colorOptions } from "../util-frontend";
 import Tag from "../components/Tag.vue";
 const toast = useToast();
 
@@ -194,24 +195,7 @@ export default {
             return this.preSelectedTags.concat(this.newTags).filter(tag => !this.deleteTags.find(monitorTag => monitorTag.id === tag.id));
         },
         colorOptions() {
-            return [
-                { name: this.$t("Gray"),
-                    color: "#4B5563" },
-                { name: this.$t("Red"),
-                    color: "#DC2626" },
-                { name: this.$t("Orange"),
-                    color: "#D97706" },
-                { name: this.$t("Green"),
-                    color: "#059669" },
-                { name: this.$t("Blue"),
-                    color: "#2563EB" },
-                { name: this.$t("Indigo"),
-                    color: "#4F46E5" },
-                { name: this.$t("Purple"),
-                    color: "#7C3AED" },
-                { name: this.$t("Pink"),
-                    color: "#DB2777" },
-            ];
+            return colorOptions(this);
         },
         validateDraftTag() {
             let nameInvalid = false;
@@ -222,7 +206,7 @@ export default {
                 nameInvalid = false;
                 valueInvalid = false;
                 invalid = false;
-            } else if (this.existingTags.filter(tag => tag.name === this.newDraftTag.name).length > 0) {
+            } else if (this.existingTags.filter(tag => tag.name === this.newDraftTag.name).length > 0 && this.newDraftTag.select == null) {
                 // Try to create new tag with existing name
                 nameInvalid = true;
                 invalid = true;
diff --git a/src/components/Uptime.vue b/src/components/Uptime.vue
index 8565975cc..afb82fa5e 100644
--- a/src/components/Uptime.vue
+++ b/src/components/Uptime.vue
@@ -1,8 +1,10 @@
 <template>
-    <span :class="className" :title="24 + $t('-hour')">{{ uptime }}</span>
+    <span :class="className" :title="title">{{ uptime }}</span>
 </template>
 
 <script>
+import { DOWN, MAINTENANCE, PENDING, UP } from "../util.ts";
+
 export default {
     props: {
         /** Monitor this represents */
@@ -24,7 +26,6 @@ export default {
 
     computed: {
         uptime() {
-
             if (this.type === "maintenance") {
                 return this.$t("statusMaintenance");
             }
@@ -32,26 +33,32 @@ export default {
             let key = this.monitor.id + "_" + this.type;
 
             if (this.$root.uptimeList[key] !== undefined) {
-                return Math.round(this.$root.uptimeList[key] * 10000) / 100 + "%";
+                let result = Math.round(this.$root.uptimeList[key] * 10000) / 100;
+                // Only perform sanity check on status page. See louislam/uptime-kuma#2628
+                if (this.$route.path.startsWith("/status") && result > 100) {
+                    return "100%";
+                } else {
+                    return result + "%";
+                }
             }
 
             return this.$t("notAvailableShort");
         },
 
         color() {
-            if (this.type === "maintenance" || this.monitor.maintenance) {
+            if (this.lastHeartBeat.status === MAINTENANCE) {
                 return "maintenance";
             }
 
-            if (this.lastHeartBeat.status === 0) {
+            if (this.lastHeartBeat.status === DOWN) {
                 return "danger";
             }
 
-            if (this.lastHeartBeat.status === 1) {
+            if (this.lastHeartBeat.status === UP) {
                 return "primary";
             }
 
-            if (this.lastHeartBeat.status === 2) {
+            if (this.lastHeartBeat.status === PENDING) {
                 return "warning";
             }
 
@@ -75,6 +82,14 @@ export default {
 
             return "";
         },
+
+        title() {
+            if (this.type === "720") {
+                return `30${this.$t("-day")}`;
+            }
+
+            return `24${this.$t("-hour")}`;
+        }
     },
 };
 </script>
diff --git a/src/components/notifications/Gorush.vue b/src/components/notifications/Gorush.vue
index b53be2d26..315ee677e 100644
--- a/src/components/notifications/Gorush.vue
+++ b/src/components/notifications/Gorush.vue
@@ -16,7 +16,7 @@
     <div class="mb-3">
         <label for="gorush-platform" class="form-label">{{ $t("Platform") }}</label><span style="color: red;"><sup>*</sup></span>
         <select id="gorush-platform" v-model="$parent.notification.gorushPlatform" class="form-select">
-            <option value="ios">{{ $t("iOS") }}</option>
+            <option value="ios">iOS</option>
             <option value="android">{{ $t("Android") }}</option>
             <option value="huawei">{{ $t("Huawei") }}</option>
         </select>
diff --git a/src/components/notifications/Kook.vue b/src/components/notifications/Kook.vue
new file mode 100644
index 000000000..7027b5e13
--- /dev/null
+++ b/src/components/notifications/Kook.vue
@@ -0,0 +1,36 @@
+<template>
+    <div class="mb-3">
+        <label for="kook-bot-token" class="form-label">{{ $t("Bot Token") }}</label>
+        <HiddenInput id="kook-bot-token" v-model="$parent.notification.kookBotToken" :required="true" autocomplete="new-password"></HiddenInput>
+        <i18n-t tag="div" keypath="wayToGetKookBotToken" class="form-text">
+            <a href="https://developer.kookapp.cn/bot" target="_blank">https://developer.kookapp.cn/bot</a>
+        </i18n-t>
+    </div>
+
+    <div class="mb-3">
+        <label for="kook-guild-id" class="form-label">{{ $t("Guild ID") }}</label>
+
+        <div class="input-group mb-3">
+            <input id="kook-guild-id" v-model="$parent.notification.kookGuildID" type="text" class="form-control" required>
+        </div>
+
+        <div class="form-text">
+            <p style="margin-top: 8px;">
+                {{ $t("wayToGetKookGuildID") }}
+            </p>
+        </div>
+    </div>
+
+    <i18n-t tag="p" keypath="More info on:" style="margin-top: 8px;">
+        <a href="https://developer.kookapp.cn" target="_blank">https://developer.kookapp.cn</a>
+    </i18n-t>
+</template>
+
+<script>
+import HiddenInput from "../HiddenInput.vue";
+export default {
+    components: {
+        HiddenInput,
+    }
+};
+</script>
diff --git a/src/components/notifications/PromoSMS.vue b/src/components/notifications/PromoSMS.vue
index 03c02222d..15ed241b7 100644
--- a/src/components/notifications/PromoSMS.vue
+++ b/src/components/notifications/PromoSMS.vue
@@ -26,6 +26,10 @@
         <label for="promosms-sender-name" class="form-label">{{ $t("promosmsSMSSender") }}</label>
         <input id="promosms-sender-name" v-model="$parent.notification.promosmsSenderName" type="text" minlength="3" maxlength="11" class="form-control">
     </div>
+    <div class="form-check form-switch">
+        <input id="promosms-allow-long" v-model="$parent.notification.promosmsAllowLongSMS" type="checkbox" class="form-check-input">
+        <label for="promosms-allow-long" class="form-label">{{ $t("promosmsAllowLongSMS") }}</label>
+    </div>
 </template>
 
 <script>
diff --git a/src/components/notifications/Splunk.vue b/src/components/notifications/Splunk.vue
new file mode 100644
index 000000000..86448517b
--- /dev/null
+++ b/src/components/notifications/Splunk.vue
@@ -0,0 +1,32 @@
+<template>
+    <div class="mb-3">
+        <label for="splunk-rest-url" class="form-label">{{ $t("Splunk Rest URL") }}</label>
+        <HiddenInput id="splunk-rest-url" v-model="$parent.notification.splunkRestURL" :required="true" autocomplete="false"></HiddenInput>
+    </div>
+    <div class="mb-3">
+        <label for="splunk-severity" class="form-label">{{ $t("Severity") }}</label>
+        <select id="splunk-severity" v-model="$parent.notification.splunkSeverity" class="form-select">
+            <option value="INFO">{{ $t("info") }}</option>
+            <option value="WARNING">{{ $t("warning") }}</option>
+            <option value="CRITICAL" selected="selected">{{ $t("critical") }}</option>
+        </select>
+    </div>
+    <div class="mb-3">
+        <label for="splunk-resolve" class="form-label">{{ $t("Auto resolve or acknowledged") }}</label>
+        <select id="splunk-resolve" v-model="$parent.notification.splunkAutoResolve" class="form-select">
+            <option value="0" selected="selected">{{ $t("do nothing") }}</option>
+            <option value="ACKNOWLEDGEMENT">{{ $t("auto acknowledged") }}</option>
+            <option value="RECOVERY">{{ $t("auto resolve") }}</option>
+        </select>
+    </div>
+</template>
+
+<script>
+import HiddenInput from "../HiddenInput.vue";
+
+export default {
+    components: {
+        HiddenInput,
+    },
+};
+</script>
diff --git a/src/components/notifications/Telegram.vue b/src/components/notifications/Telegram.vue
index 9daf31ac6..a7e46fded 100644
--- a/src/components/notifications/Telegram.vue
+++ b/src/components/notifications/Telegram.vue
@@ -28,6 +28,30 @@
                 <a :href="telegramGetUpdatesURL('withToken')" target="_blank" style="word-break: break-word;">{{ telegramGetUpdatesURL("masked") }}</a>
             </p>
         </div>
+
+        <label for="message_thread_id" class="form-label">{{ $t("telegramMessageThreadID") }}</label>
+        <input id="message_thread_id" v-model="$parent.notification.telegramMessageThreadID" type="text" class="form-control">
+        <p class="form-text">{{ $t("telegramMessageThreadIDDescription") }}</p>
+
+        <div class="form-check form-switch">
+            <input v-model="$parent.notification.telegramSendSilently" class="form-check-input" type="checkbox">
+            <label class="form-check-label">{{ $t("telegramSendSilently") }}</label>
+        </div>
+
+        <div class="form-text">
+            {{ $t("telegramSendSilentlyDescription") }}
+        </div>
+    </div>
+
+    <div class="mb-3">
+        <div class="form-check form-switch">
+            <input v-model="$parent.notification.telegramProtectContent" class="form-check-input" type="checkbox">
+            <label class="form-check-label">{{ $t("telegramProtectContent") }}</label>
+        </div>
+
+        <div class="form-text">
+            {{ $t("telegramProtectContentDescription") }}
+        </div>
     </div>
 </template>
 
@@ -42,6 +66,11 @@ export default {
         HiddenInput,
     },
     methods: {
+        /**
+         * Get the URL for telegram updates
+         * @param {string} [mode=masked] Should the token be masked?
+         * @returns {string} formatted URL
+         */
         telegramGetUpdatesURL(mode = "masked") {
             let token = `<${this.$t("YOUR BOT TOKEN HERE")}>`;
 
@@ -55,6 +84,8 @@ export default {
 
             return `https://api.telegram.org/bot${token}/getUpdates`;
         },
+
+        /** Get the telegram chat ID */
         async autoGetTelegramChatID() {
             try {
                 let res = await axios.get(this.telegramGetUpdatesURL("withToken"));
diff --git a/src/components/notifications/ZohoCliq.vue b/src/components/notifications/ZohoCliq.vue
new file mode 100644
index 000000000..9a9cd7360
--- /dev/null
+++ b/src/components/notifications/ZohoCliq.vue
@@ -0,0 +1,18 @@
+<template>
+    <div class="mb-3">
+        <label for="zcliq-webhookurl" class="form-label">{{ $t("Webhook URL") }}</label>
+        <input
+            id="zcliq-webhookurl"
+            v-model="$parent.notification.webhookUrl"
+            type="text"
+            class="form-control"
+            required
+        />
+        <i18n-t tag="div" keypath="wayToGetZohoCliqURL" class="form-text">
+            <a
+                href="https://www.zoho.com/cliq/help/platform/webhook-tokens.html"
+                target="_blank"
+            >{{ $t("here") }}</a>
+        </i18n-t>
+    </div>
+</template>
diff --git a/src/components/notifications/index.js b/src/components/notifications/index.js
index 0c220b717..3c8b26210 100644
--- a/src/components/notifications/index.js
+++ b/src/components/notifications/index.js
@@ -12,6 +12,7 @@ import GoogleChat from "./GoogleChat.vue";
 import Gorush from "./Gorush.vue";
 import Gotify from "./Gotify.vue";
 import HomeAssistant from "./HomeAssistant.vue";
+import Kook from "./Kook.vue";
 import Line from "./Line.vue";
 import LineNotify from "./LineNotify.vue";
 import LunaSea from "./LunaSea.vue";
@@ -42,6 +43,8 @@ import Telegram from "./Telegram.vue";
 import Webhook from "./Webhook.vue";
 import WeCom from "./WeCom.vue";
 import GoAlert from "./GoAlert.vue";
+import ZohoCliq from "./ZohoCliq.vue";
+import Splunk from "./Splunk.vue";
 
 /**
  * Manage all notification form.
@@ -63,6 +66,7 @@ const NotificationFormList = {
     "gorush": Gorush,
     "gotify": Gotify,
     "HomeAssistant": HomeAssistant,
+    "Kook": Kook,
     "line": Line,
     "LineNotify": LineNotify,
     "lunasea": LunaSea,
@@ -89,10 +93,12 @@ const NotificationFormList = {
     "stackfield": Stackfield,
     "teams": Teams,
     "telegram": Telegram,
+    "Splunk": Splunk,
     "webhook": Webhook,
     "WeCom": WeCom,
     "GoAlert": GoAlert,
     "ServerChan": ServerChan,
+    "ZohoCliq": ZohoCliq
 };
 
 export default NotificationFormList;
diff --git a/src/components/settings/MonitorHistory.vue b/src/components/settings/MonitorHistory.vue
index c78c6aaf7..afcb7bc9e 100644
--- a/src/components/settings/MonitorHistory.vue
+++ b/src/components/settings/MonitorHistory.vue
@@ -7,6 +7,7 @@
                         settings.keepDataPeriodDays,
                     ])
                 }}
+                {{ $t("infiniteRetention") }}
             </label>
             <input
                 id="keepDataPeriodDays"
@@ -14,9 +15,12 @@
                 type="number"
                 class="form-control"
                 required
-                min="1"
+                min="0"
                 step="1"
             />
+            <div v-if="settings.keepDataPeriodDays < 0" class="form-text">
+                {{ $t("dataRetentionTimeError") }}
+            </div>
         </div>
         <div class="my-4">
             <button class="btn btn-primary" type="button" @click="saveSettings()">
diff --git a/src/components/settings/Plugins.vue b/src/components/settings/Plugins.vue
new file mode 100644
index 000000000..614034fcb
--- /dev/null
+++ b/src/components/settings/Plugins.vue
@@ -0,0 +1,57 @@
+<template>
+    <div>
+        <div class="mt-3">{{ remotePluginListMsg }}</div>
+        <PluginItem v-for="plugin in remotePluginList" :key="plugin.id" :plugin="plugin" />
+    </div>
+</template>
+
+<script>
+import PluginItem from "../PluginItem.vue";
+
+export default {
+    components: {
+        PluginItem
+    },
+
+    data() {
+        return {
+            remotePluginList: [],
+            remotePluginListMsg: "",
+        };
+    },
+
+    computed: {
+        pluginList() {
+            return this.$parent.$parent.$parent.pluginList;
+        },
+        settings() {
+            return this.$parent.$parent.$parent.settings;
+        },
+        saveSettings() {
+            return this.$parent.$parent.$parent.saveSettings;
+        },
+        settingsLoaded() {
+            return this.$parent.$parent.$parent.settingsLoaded;
+        },
+    },
+
+    async mounted() {
+        this.loadList();
+    },
+
+    methods: {
+        loadList() {
+            this.remotePluginListMsg = this.$t("Loading") + "...";
+
+            this.$root.getSocket().emit("getPluginList", (res) => {
+                if (res.ok) {
+                    this.remotePluginList = res.pluginList;
+                    this.remotePluginListMsg = "";
+                } else {
+                    this.remotePluginListMsg = this.$t("loadingError") + " " + res.msg;
+                }
+            });
+        }
+    },
+};
+</script>
diff --git a/src/components/settings/Security.vue b/src/components/settings/Security.vue
index 330fe9ca5..7d13ea90e 100644
--- a/src/components/settings/Security.vue
+++ b/src/components/settings/Security.vue
@@ -191,6 +191,7 @@ export default {
             location.reload();
         },
 
+        /** Show confirmation dialog for disable auth */
         confirmDisableAuth() {
             this.$refs.confirmDisableAuth.show();
         },
diff --git a/src/components/settings/Tags.vue b/src/components/settings/Tags.vue
new file mode 100644
index 000000000..71ad9b7bd
--- /dev/null
+++ b/src/components/settings/Tags.vue
@@ -0,0 +1,180 @@
+<template>
+    <div class="my-4">
+        <div class="mx-4 pt-1 my-3">
+            <button class="btn btn-primary" @click.stop="addTag"><font-awesome-icon icon="plus" /> {{ $t("Add New Tag") }}</button>
+        </div>
+
+        <div class="tags-list my-3">
+            <div v-for="(tag, index) in tagsList" :key="tag.id" class="d-flex align-items-center mx-4 py-1 tags-list-row" :disabled="processing" @click="editTag(index)">
+                <div class="col-5 ps-1">
+                    <Tag :item="tag" />
+                </div>
+                <div class="col-5 px-1">
+                    <div>{{ monitorsByTag(tag.id).length }} {{ $tc("Monitor", monitorsByTag(tag.id).length) }}</div>
+                </div>
+                <div class="col-2 pe-3 d-flex justify-content-end">
+                    <button type="button" class="btn ms-2 py-1">
+                        <font-awesome-icon class="" icon="edit" />
+                    </button>
+                    <button type="button" class="btn-rm-tag btn btn-outline-danger ms-2 py-1" :disabled="processing" @click.stop="deleteConfirm(index)">
+                        <font-awesome-icon class="" icon="trash" />
+                    </button>
+                </div>
+            </div>
+        </div>
+
+        <TagEditDialog ref="tagEditDialog" :updated="tagsUpdated" :existing-tags="tagsList" />
+        <Confirm ref="confirmDelete" btn-style="btn-danger" :yes-text="$t('Yes')" :no-text="$t('No')" @yes="deleteTag">
+            {{ $t("confirmDeleteTagMsg") }}
+        </Confirm>
+    </div>
+</template>
+
+<script>
+import { useToast } from "vue-toastification";
+import TagEditDialog from "../../components/TagEditDialog.vue";
+import Tag from "../Tag.vue";
+import Confirm from "../Confirm.vue";
+const toast = useToast();
+
+export default {
+    components: {
+        Confirm,
+        TagEditDialog,
+        Tag,
+    },
+
+    data() {
+        return {
+            processing: false,
+            tagsList: null,
+            deletingTag: null,
+        };
+    },
+
+    computed: {
+        settings() {
+            return this.$parent.$parent.$parent.settings;
+        },
+        saveSettings() {
+            return this.$parent.$parent.$parent.saveSettings;
+        },
+        settingsLoaded() {
+            return this.$parent.$parent.$parent.settingsLoaded;
+        },
+    },
+
+    mounted() {
+        this.getExistingTags();
+    },
+
+    methods: {
+        /**
+         * Reflect tag changes in the UI by fetching data. Callback for the edit tag dialog.
+         * @returns {void}
+         */
+        tagsUpdated() {
+            this.getExistingTags();
+            this.$root.getMonitorList();
+        },
+
+        /**
+         * Get list of tags from server
+         * @returns {void}
+         */
+        getExistingTags() {
+            this.processing = true;
+            this.$root.getSocket().emit("getTags", (res) => {
+                this.processing = false;
+                if (res.ok) {
+                    this.tagsList = res.tags;
+                } else {
+                    toast.error(res.msg);
+                }
+            });
+        },
+
+        /**
+         * Show confirmation for deleting a tag
+         * @param {number} index index of the tag to delete in the local tagsList
+         * @returns {void}
+         */
+        deleteConfirm(index) {
+            this.deletingTag = this.tagsList[index];
+            this.$refs.confirmDelete.show();
+        },
+
+        /**
+         * Show dialog for adding a new tag
+         * @returns {void}
+         */
+        addTag() {
+            this.$refs.tagEditDialog.reset();
+            this.$refs.tagEditDialog.show();
+        },
+
+        /**
+         * Show dialog for editing a tag
+         * @param {number} index index of the tag to edit in the local tagsList
+         * @returns {void}
+         */
+        editTag(index) {
+            this.$refs.tagEditDialog.show(this.tagsList[index]);
+        },
+
+        /**
+         * Delete the tag "deletingTag" from server
+         * @returns {void}
+         */
+        deleteTag() {
+            this.processing = true;
+            this.$root.getSocket().emit("deleteTag", this.deletingTag.id, (res) => {
+                this.$root.toastRes(res);
+                this.processing = false;
+
+                if (res.ok) {
+                    this.tagsUpdated();
+                }
+            });
+        },
+
+        /**
+         * Get monitors which has a specific tag locally
+         * @param {number} tagId id of the tag to filter
+         * @returns {Object[]} list of monitors which has a specific tag
+         */
+        monitorsByTag(tagId) {
+            return Object.values(this.$root.monitorList).filter((monitor) => {
+                return monitor.tags.find(monitorTag => monitorTag.tag_id === tagId);
+            });
+        },
+    },
+};
+</script>
+
+<style lang="scss" scoped>
+@import "../../assets/vars.scss";
+
+.btn-rm-tag {
+    padding-left: 11px;
+    padding-right: 11px;
+}
+
+.tags-list .tags-list-row {
+    cursor: pointer;
+    border-top: 1px solid rgba(0, 0, 0, 0.125);
+
+    .dark & {
+        border-top: 1px solid $dark-border-color;
+    }
+
+    &:hover {
+        background-color: $highlight-white;
+    }
+
+    .dark &:hover {
+        background-color: $dark-bg2;
+    }
+}
+
+</style>
diff --git a/src/i18n.js b/src/i18n.js
index aff60c75f..c0c07797d 100644
--- a/src/i18n.js
+++ b/src/i18n.js
@@ -1,7 +1,8 @@
 import { createI18n } from "vue-i18n/dist/vue-i18n.esm-browser.prod.js";
-import en from "./languages/en";
+import en from "./lang/en.json";
 
 const languageList = {
+    "ar-SY": "العربية",
     "cs-CZ": "Čeština",
     "zh-HK": "繁體中文 (香港)",
     "bg-BG": "Български",
@@ -14,6 +15,7 @@ const languageList = {
     "fa": "Farsi",
     "pt-PT": "Português (Portugal)",
     "pt-BR": "Português (Brasileiro)",
+    "fi": "Suomi",
     "fr-FR": "Français (France)",
     "hu": "Magyar",
     "hr-HR": "Hrvatski",
@@ -36,6 +38,8 @@ const languageList = {
     "uk-UA": "Український",
     "th-TH": "ไทย",
     "el-GR": "Ελληνικά",
+    "yue": "繁體中文 (廣東話 / 粵語)",
+    "ro": "Limba română",
 };
 
 let messages = {
@@ -48,7 +52,7 @@ for (let lang in languageList) {
     };
 }
 
-const rtlLangs = [ "fa" ];
+const rtlLangs = [ "fa", "ar-SY" ];
 
 export const currentLocale = () => localStorage.locale
     || languageList[navigator.language] && navigator.language
diff --git a/src/icon.js b/src/icon.js
index b38bef3ce..6cc997bbd 100644
--- a/src/icon.js
+++ b/src/icon.js
@@ -44,6 +44,7 @@ import {
     faWrench,
     faHeartbeat,
     faFilter,
+    faInfoCircle,
 } from "@fortawesome/free-solid-svg-icons";
 
 library.add(
@@ -88,6 +89,7 @@ library.add(
     faWrench,
     faHeartbeat,
     faFilter,
+    faInfoCircle,
 );
 
 export { FontAwesomeIcon };
diff --git a/src/lang/README.md b/src/lang/README.md
new file mode 100644
index 000000000..aafda2de9
--- /dev/null
+++ b/src/lang/README.md
@@ -0,0 +1,18 @@
+# How to translate 
+
+(2023-01-24 Updated)
+
+1. Go to [https://weblate.kuma.pet](https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/)
+2. Register an account on Weblate
+3. Make sure your GitHub email is matched with Weblate's account, so that it could show you as a contributor on GitHub
+4. Choose your language on Weblate and start translating.
+
+# How to add a new language in the dropdown
+
+1. Add your language at https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/
+2. Find the language code (You can find it at the end of the URL)
+3. Go to https://github.com/louislam/uptime-kuma/blob/master/src/i18n.js and click `Edit` icon
+4. Add your language at the end of `languageList`, format: `"zh-TW": "繁體中文 (台灣)",`
+5. Commit and make a pull request for me to approve
+
+If you do not have programming skills, let me know in [the issues section](https://github.com/louislam/uptime-kuma/issues). I will assist you. 😏
diff --git a/src/lang/ar-SY.json b/src/lang/ar-SY.json
new file mode 100644
index 000000000..3a4cf140e
--- /dev/null
+++ b/src/lang/ar-SY.json
@@ -0,0 +1,685 @@
+{
+    "languageName": "العربية",
+    "checkEverySecond": "تحقق من كل {0} ثانية",
+    "retryCheckEverySecond": "أعد محاولة كل {0} ثانية",
+    "resendEveryXTimes": "إعادة تقديم كل {0} مرات",
+    "resendDisabled": "إعادة الالتزام بالتعطيل",
+    "retriesDescription": "الحد الأقصى لإعادة المحاولة قبل تمييز الخدمة على أنها لأسفل وإرسال إشعار",
+    "ignoreTLSError": "تجاهل خطأ TLS/SSL لمواقع HTTPS",
+    "upsideDownModeDescription": "اقلب الحالة رأسًا على عقب. إذا كانت الخدمة قابلة للوصول إلى أسفل.",
+    "maxRedirectDescription": "الحد الأقصى لعدد إعادة التوجيه لمتابعة. ضبط على 0 لتعطيل إعادة التوجيه.",
+    "enableGRPCTls": "السماح لإرسال طلب GRPC مع اتصال TLS",
+    "grpcMethodDescription": "يتم تحويل اسم الطريقة إلى تنسيق Cammelcase مثل Sayhello Check وما إلى ذلك.",
+    "acceptedStatusCodesDescription": "حدد رموز الحالة التي تعتبر استجابة ناجحة.",
+    "Maintenance": "صيانة",
+    "statusMaintenance": "صيانة",
+    "Schedule maintenance": "جدولة الصيانة",
+    "Affected Monitors": "الشاشات المتأثرة",
+    "Pick Affected Monitors...": "اختيار الشاشات المتأثرة ...",
+    "Start of maintenance": "بداية الصيانة",
+    "All Status Pages": "جميع صفحات الحالة",
+    "Select status pages...": "حدد صفحات الحالة ...",
+    "recurringIntervalMessage": "ركض مرة واحدة كل يوم | قم بالتشغيل مرة واحدة كل يوم {0}",
+    "affectedMonitorsDescription": "حدد المراقبين المتأثرة بالصيانة الحالية",
+    "affectedStatusPages": "إظهار رسالة الصيانة هذه على صفحات الحالة المحددة",
+    "atLeastOneMonitor": "حدد شاشة واحدة على الأقل من المتأثرين",
+    "passwordNotMatchMsg": "كلمة المرور المتكررة لا تتطابق.",
+    "notificationDescription": "يجب تعيين الإخطارات إلى شاشة للعمل.",
+    "keywordDescription": "ابحث في الكلمة الرئيسية في استجابة HTML العادية أو JSON. البحث حساس للحالة.",
+    "pauseDashboardHome": "وقفة",
+    "deleteMonitorMsg": "هل أنت متأكد من حذف هذا الشاشة؟",
+    "deleteMaintenanceMsg": "هل أنت متأكد من حذف هذه الصيانة؟",
+    "deleteNotificationMsg": "هل أنت متأكد من حذف هذا الإشعار لجميع الشاشات؟",
+    "dnsPortDescription": "منفذ خادم DNS. الافتراضيات إلى 53. يمكنك تغيير المنفذ في أي وقت.",
+    "resolverserverDescription": "CloudFlare هو الخادم الافتراضي. يمكنك تغيير خادم المحوّل في أي وقت.",
+    "rrtypeDescription": "حدد نوع RR الذي تريد مراقبته",
+    "pauseMonitorMsg": "هل أنت متأكد من أن تتوقف مؤقتًا؟",
+    "enableDefaultNotificationDescription": "سيتم تمكين هذا الإشعار افتراضيًا للشاشات الجديدة. لا يزال بإمكانك تعطيل الإخطار بشكل منفصل لكل شاشة.",
+    "clearEventsMsg": "هل أنت متأكد من حذف جميع الأحداث لهذا الشاشة؟",
+    "clearHeartbeatsMsg": "هل أنت متأكد من حذف جميع دقات القلب لهذا الشاشة؟",
+    "confirmClearStatisticsMsg": "هل أنت متأكد من أنك تريد حذف جميع الإحصائيات؟",
+    "importHandleDescription": "اختر 'تخطي موجود' إذا كنت تريد تخطي كل شاشة أو إشعار بنفس الاسم. 'الكتابة فوق' سوف يحذف كل شاشة وإخطار موجود.",
+    "confirmImportMsg": "هل أنت متأكد من أنك تريد استيراد النسخ الاحتياطي؟ يرجى التحقق من أنك حددت خيار الاستيراد الصحيح.",
+    "twoFAVerifyLabel": "الرجاء إدخال الرمز المميز الخاص بك للتحقق من 2FA",
+    "tokenValidSettingsMsg": "الرمز المميز صالح! يمكنك الآن حفظ إعدادات 2FA.",
+    "confirmEnableTwoFAMsg": "هل أنت متأكد من أنك تريد تمكين 2FA؟",
+    "confirmDisableTwoFAMsg": "هل أنت متأكد من أنك تريد تعطيل 2FA؟",
+    "Settings": "إعدادات",
+    "Dashboard": "لوحة التحكم",
+    "New Update": "تحديث جديد",
+    "Language": "لغة",
+    "Appearance": "مظهر",
+    "Theme": "سمة",
+    "General": "عام",
+    "Primary Base URL": "عنوان URL الأساسي",
+    "Version": "الإصدار",
+    "Check Update On GitHub": "تحقق من التحديث على GitHub",
+    "List": "قائمة",
+    "Add": "يضيف",
+    "Add New Monitor": "أضف شاشة جديدة",
+    "Quick Stats": "إحصائيات سريعة",
+    "Up": "فوق",
+    "Down": "أسفل",
+    "Pending": "قيد الانتظار",
+    "Unknown": "غير معرّف",
+    "Pause": "إيقاف مؤقت",
+    "Name": "الاسم",
+    "Status": "الحالة",
+    "DateTime": "الوقت والتاريخ",
+    "Message": "الرسالة",
+    "No important events": "لا توجد أحداث مهمة",
+    "Resume": "استمرار",
+    "Edit": "تعديل",
+    "Delete": "حذف",
+    "Current": "حالي",
+    "Uptime": "مدة التشغيل",
+    "Cert Exp.": "تصدير الشهادة",
+    "Monitor": "مراقب | مراقبات",
+    "day": "يوم | أيام",
+    "-day": "-يوم",
+    "hour": "ساعة",
+    "-hour": "-ساعة",
+    "Response": "استجاية",
+    "Ping": "بينغ",
+    "Monitor Type": "نوع المراقب",
+    "Keyword": "كلمة مفتاحية",
+    "Friendly Name": "اسم معروف",
+    "URL": "عنوان URL",
+    "Hostname": "اسم المضيف",
+    "Port": "المنفذ",
+    "Heartbeat Interval": "فاصل نبضات القلب",
+    "Retries": "يحاول مجدداً",
+    "Heartbeat Retry Interval": "الفاصل الزمني لإعادة محاكمة نبضات القلب",
+    "Resend Notification if Down X times consecutively": "إعادة تقديم الإخطار إذا انخفض x مرات بالتالي",
+    "Advanced": "متقدم",
+    "Upside Down Mode": "وضع أسفل أسفل",
+    "Max. Redirects": "الأعلى. إعادة التوجيه",
+    "Accepted Status Codes": "رموز الحالة المقبولة",
+    "Push URL": "دفع عنوان URL",
+    "needPushEvery": "يجب عليك استدعاء عنوان URL هذا كل ثانية.",
+    "pushOptionalParams": "المعلمات الاختيارية",
+    "Save": "يحفظ",
+    "Notifications": "إشعارات",
+    "Not available, please setup.": "غير متوفر من فضلك الإعداد.",
+    "Setup Notification": "إشعار الإعداد",
+    "Light": "نور",
+    "Dark": "داكن",
+    "Auto": "آلي",
+    "Theme - Heartbeat Bar": "موضوع - بار نبضات",
+    "Normal": "طبيعي",
+    "Bottom": "الأسفل",
+    "None": "لا أحد",
+    "Timezone": "وحدة زمنية",
+    "Search Engine Visibility": "محرك بحث الرؤية",
+    "Allow indexing": "السماح الفهرسة",
+    "Discourage search engines from indexing site": "تثبيط محركات البحث من موقع الفهرسة",
+    "Change Password": "غير كلمة السر",
+    "Current Password": "كلمة المرور الحالي",
+    "New Password": "كلمة سر جديدة",
+    "Repeat New Password": "كرر كلمة المرور الجديدة",
+    "Update Password": "تطوير كلمة السر",
+    "Disable Auth": "تعطيل المصادقة",
+    "Enable Auth": "تمكين المصادقة",
+    "disableauth.message1": "هل أنت متأكد من أن <strong> تعطيل المصادقة </strong>؟",
+    "disableauth.message2": "تم تصميمه للسيناريوهات <strong> حيث تنوي تنفيذ مصادقة الطرف الثالث </strong> أمام كوما في وقت التشغيل مثل CloudFlare Access Authelia أو آليات المصادقة الأخرى.",
+    "Please use this option carefully!": "الرجاء استخدام هذا الخيار بعناية!",
+    "Logout": "تسجيل خروج",
+    "Leave": "غادر",
+    "I understand, please disable": "أنا أفهم من فضلك تعطيل",
+    "Confirm": "يتأكد",
+    "Yes": "نعم",
+    "No": "رقم",
+    "Username": "اسم المستخدم",
+    "Password": "كلمة المرور",
+    "Remember me": "تذكرنى",
+    "Login": "تسجيل الدخول",
+    "No Monitors, please": "لا شاشات من فضلك",
+    "add one": "أضف واحدا",
+    "Notification Type": "نوع إعلام",
+    "Email": "بريد إلكتروني",
+    "Test": "امتحان",
+    "Certificate Info": "معلومات الشهادة",
+    "Resolver Server": "خادم Resolver",
+    "Resource Record Type": "نوع سجل الموارد",
+    "Last Result": "اخر نتيجة",
+    "Create your admin account": "إنشاء حساب المسؤول الخاص بك",
+    "Repeat Password": "اعد كلمة السر",
+    "Import Backup": "استيراد النسخ الاحتياطي",
+    "Export Backup": "النسخ الاحتياطي تصدير",
+    "Export": "يصدّر",
+    "Import": "يستورد",
+    "respTime": "resp. الوقت (MS)",
+    "notAvailableShort": "ن/أ",
+    "Default enabled": "التمكين الافتراضي",
+    "Apply on all existing monitors": "تنطبق على جميع الشاشات الحالية",
+    "Create": "خلق",
+    "Clear Data": "امسح البيانات",
+    "Events": "الأحداث",
+    "Heartbeats": "نبضات القلب",
+    "Auto Get": "الحصول على السيارات",
+    "backupDescription": "يمكنك النسخ الاحتياطي لجميع الشاشات والإشعارات في ملف JSON.",
+    "backupDescription2": "ملحوظة",
+    "backupDescription3": "يتم تضمين البيانات الحساسة مثل الرموز الإخطار في ملف التصدير ؛ يرجى تخزين التصدير بشكل آمن.",
+    "alertNoFile": "الرجاء تحديد ملف للاستيراد.",
+    "alertWrongFileType": "الرجاء تحديد ملف JSON.",
+    "Clear all statistics": "مسح جميع الإحصاءات",
+    "Skip existing": "تخطي الموجود",
+    "Overwrite": "الكتابة فوق",
+    "Options": "خيارات",
+    "Keep both": "احتفظ بكليهما",
+    "Verify Token": "تحقق من الرمز المميز",
+    "Setup 2FA": "الإعداد 2FA",
+    "Enable 2FA": "تمكين 2FA",
+    "Disable 2FA": "تعطيل 2FA",
+    "2FA Settings": "2FA إعدادات",
+    "Two Factor Authentication": "توثيق ذو عاملين",
+    "Active": "نشيط",
+    "Inactive": "غير نشط",
+    "Token": "رمز",
+    "Show URI": "أظهر URI",
+    "Tags": "العلامات",
+    "Add New below or Select...": "أضف جديدًا أدناه أو حدد ...",
+    "Tag with this name already exist.": "علامة مع هذا الاسم موجود بالفعل.",
+    "Tag with this value already exist.": "علامة مع هذه القيمة موجودة بالفعل.",
+    "color": "اللون",
+    "value (optional)": "القيمة (اختياري)",
+    "Gray": "رمادي",
+    "Red": "أحمر",
+    "Orange": "البرتقالي",
+    "Green": "لون أخضر",
+    "Blue": "أزرق",
+    "Indigo": "النيلي",
+    "Purple": "نفسجي",
+    "Pink": "لون القرنفل",
+    "Custom": "العادة",
+    "Search...": "يبحث...",
+    "Avg. Ping": "متوسط. بينغ",
+    "Avg. Response": "متوسط. إجابة",
+    "Entry Page": "صفحة الدخول",
+    "statusPageNothing": "لا شيء هنا الرجاء إضافة مجموعة أو شاشة.",
+    "No Services": "لا توجد خدمات",
+    "All Systems Operational": "جميع الأنظمة التشغيلية",
+    "Partially Degraded Service": "الخدمة المتدهورة جزئيا",
+    "Degraded Service": "خدمة متدهورة",
+    "Add Group": "أضف مجموعة",
+    "Add a monitor": "إضافة شاشة",
+    "Edit Status Page": "تحرير صفحة الحالة",
+    "Go to Dashboard": "الذهاب إلى لوحة القيادة",
+    "Status Page": "صفحة الحالة",
+    "Status Pages": "صفحات الحالة",
+    "defaultNotificationName": "تنبيه {الإخطار} ({number})",
+    "here": "هنا",
+    "Required": "مطلوب",
+    "telegram": "برقية",
+    "ZohoCliq": "Zohocliq",
+    "Bot Token": "رمز الروبوت",
+    "wayToGetTelegramToken": "يمكنك الحصول على رمز من {0}.",
+    "Chat ID": "معرف الدردشة",
+    "telegramMessageThreadID": "معرف المواضيع",
+    "supportTelegramChatID": "دعم الدردشة المباشرة / معرف الدردشة للقناة",
+    "wayToGetTelegramChatID": "يمكنك الحصول على معرف الدردشة الخاص بك عن طريق إرسال رسالة إلى الروبوت والانتقال إلى عنوان URL هذا لعرض Chat_id",
+    "YOUR BOT TOKEN HERE": "رمز الروبوت الخاص بك هنا",
+    "chatIDNotFound": "لم يتم العثور على معرف الدردشة ؛ الرجاء إرسال رسالة إلى هذا الروبوت أولاً",
+    "webhook": "webhook",
+    "Post URL": "بعد عنوان URL",
+    "Content Type": "نوع المحتوى",
+    "webhookJsonDesc": "{0} مفيد لأي خوادم HTTP الحديثة مثل Express.js",
+    "webhookFormDataDesc": "{multipart} مفيد لـ PHP. سيحتاج JSON إلى تحليل {decodefunction}",
+    "webhookAdditionalHeadersTitle": "رؤوس إضافية",
+    "webhookAdditionalHeadersDesc": "يحدد رؤوس إضافية مرسلة مع webhook.",
+    "smtp": "البريد الإلكتروني (SMTP)",
+    "secureOptionNone": "لا شيء / startTls (25 587)",
+    "secureOptionTLS": "TLS (465)",
+    "Ignore TLS Error": "تجاهل خطأ TLS",
+    "From Email": "من البريد الإلكترونى",
+    "emailCustomSubject": "موضوع مخصص",
+    "To Email": "للبريد الإلكتروني",
+    "smtpCC": "نسخة",
+    "smtpBCC": "BCC",
+    "discord": "خلاف",
+    "Discord Webhook URL": "Discord Webhook URL",
+    "wayToGetDiscordURL": "يمكنك الحصول على هذا عن طريق الانتقال إلى إعدادات الخادم -> التكامل -> إنشاء WebHook",
+    "Bot Display Name": "اسم عرض الروبوت",
+    "Prefix Custom Message": "بادئة رسالة مخصصة",
+    "Hello @everyone is...": "مرحبًا {'@'} الجميع ...",
+    "teams": "فرق Microsoft",
+    "Webhook URL": "Webhook URL",
+    "wayToGetTeamsURL": "يمكنك معرفة كيفية إنشاء عنوان URL webhook {0}.",
+    "wayToGetZohoCliqURL": "يمكنك معرفة كيفية إنشاء عنوان URL webhook {0}.",
+    "signal": "الإشارة",
+    "Number": "رقم",
+    "Recipients": "المستلمين",
+    "needSignalAPI": "تحتاج إلى وجود عميل إشارة مع REST API.",
+    "wayToCheckSignalURL": "يمكنك التحقق من عنوان URL هذا لعرض كيفية إعداد واحد",
+    "signalImportant": "مهم",
+    "gotify": "gotify",
+    "Application Token": "رمز التطبيق",
+    "Server URL": "عنوان URL الخادم",
+    "Priority": "أولوية",
+    "slack": "تثاقل",
+    "Icon Emoji": "أيقونة الرموز التعبيرية",
+    "Channel Name": "اسم القناة",
+    "Uptime Kuma URL": "UPTIME KUMA URL",
+    "aboutWebhooks": "مزيد من المعلومات حول Webhooks ON",
+    "aboutChannelName": "أدخل اسم القناة في حقل اسم القناة {0} إذا كنت تريد تجاوز قناة WebHook. السابق",
+    "aboutKumaURL": "إذا تركت حقل URL في وقت التشغيل KUMA فارغًا ، فسيتم افتراضيًا إلى صفحة GitHub Project.",
+    "emojiCheatSheet": "ورقة الغش في الرموز التعبيرية",
+    "rocket.chat": "صاروخ",
+    "pushover": "مهمة سهلة",
+    "pushy": "انتهازي",
+    "PushByTechulus": "دفع بواسطة Techulus",
+    "octopush": "أوكتوبوش",
+    "promosms": "الترويجيات",
+    "clicksendsms": "نقرات SMS",
+    "lunasea": "لوناسيا",
+    "apprise": "إبلاغ (دعم 50+ خدمات الإخطار)",
+    "GoogleChat": "دردشة Google",
+    "pushbullet": "حماس",
+    "Kook": "كووك",
+    "wayToGetKookBotToken": "قم بإنشاء تطبيق واحصل على رمز الروبوت الخاص بك على {0}",
+    "wayToGetKookGuildID": "قم بتشغيل 'وضع المطور' في إعداد Kook وانقر بزر الماوس الأيمن على النقابة للحصول على معرفه",
+    "Guild ID": "معرف النقابة",
+    "line": "خط",
+    "mattermost": "المادة",
+    "User Key": "مفتاح المستخدم",
+    "Device": "جهاز",
+    "Message Title": "عنوان الرسالة",
+    "Notification Sound": "صوت الإشعار",
+    "More info on": "مزيد من المعلومات حول",
+    "pushoverDesc1": "أولوية الطوارئ (2) لها مهلة افتراضية 30 ثانية بين إعادة المحاولة وستنتهي صلاحيتها بعد ساعة واحدة.",
+    "pushoverDesc2": "إذا كنت ترغب في إرسال إشعارات إلى أجهزة مختلفة ، قم بملء حقل الجهاز.",
+    "SMS Type": "نوع الرسائل القصيرة",
+    "octopushTypePremium": "قسط (سريع - موصى به للتنبيه)",
+    "octopushTypeLowCost": "التكلفة المنخفضة (بطيئة - تم حظرها أحيانًا بواسطة المشغل)",
+    "checkPrice": "تحقق من الأسعار {0}",
+    "apiCredentials": "بيانات اعتماد API",
+    "octopushLegacyHint": "هل تستخدم الإصدار القديم من Octopush (2011-2020) أو الإصدار الجديد؟",
+    "Check octopush prices": "تحقق من أسعار Octopush {0}.",
+    "octopushPhoneNumber": "رقم الهاتف (تنسيق intl على سبيل المثال",
+    "octopushSMSSender": "اسم مرسل الرسائل القصيرة",
+    "LunaSea Device ID": "معرف جهاز Lunasea",
+    "Apprise URL": "إبلاغ عنوان URL",
+    "Example": "مثال",
+    "Read more:": "{0} :قراءة المزيد",
+    "Status:": "{0} :حالة",
+    "Read more": "قراءة المزيد",
+    "appriseInstalled": "تم تثبيت Prosise.",
+    "appriseNotInstalled": "الإبرام غير مثبت. {0}",
+    "Access Token": "رمز وصول",
+    "Channel access token": "قناة الوصول إلى الرمز",
+    "Line Developers Console": "تحكم المطورين",
+    "lineDevConsoleTo": "وحدة المطورين Line Console - {0}",
+    "Basic Settings": "الإعدادات الأساسية",
+    "User ID": "معرف المستخدم",
+    "Messaging API": "واجهة برمجة تطبيقات المراسلة",
+    "wayToGetLineChannelToken": "قم أولاً بالوصول إلى {0} إنشاء مزود وقناة (واجهة برمجة تطبيقات المراسلة) ، ثم يمكنك الحصول على رمز الوصول إلى القناة ومعرف المستخدم من عناصر القائمة المذكورة أعلاه.",
+    "Icon URL": "url url icon",
+    "aboutIconURL": "يمكنك توفير رابط لصورة في \"Icon URL\" لتجاوز صورة الملف الشخصي الافتراضي. لن يتم استخدامه إذا تم تعيين رمز رمز رمز.",
+    "aboutMattermostChannelName": "يمكنك تجاوز القناة الافتراضية التي تنشرها WebHook من خلال إدخال اسم القناة في \"Channel Name\" الحقل. يجب تمكين هذا في إعدادات Webhook Mattern. السابق",
+    "matrix": "مصفوفة",
+    "promosmsTypeEco": "SMS Eco - رخيصة ولكن بطيئة وغالبًا ما تكون محملة. يقتصر فقط على المستفيدين البولنديين.",
+    "promosmsTypeFlash": "SMS Flash - سيتم عرض الرسالة تلقائيًا على جهاز المستلم. يقتصر فقط على المستفيدين البولنديين.",
+    "promosmsTypeFull": "SMS Full - Tier Premium SMS يمكنك استخدام اسم المرسل الخاص بك (تحتاج إلى تسجيل الاسم أولاً). موثوقة للتنبيهات.",
+    "promosmsTypeSpeed": "سرعة الرسائل القصيرة - أولوية قصوى في النظام. سريع وموثوق للغاية ولكنه مكلف (حوالي مرتين من الرسائل القصيرة السعر الكامل).",
+    "promosmsPhoneNumber": "رقم الهاتف (للمستلم البولندي ، يمكنك تخطي رموز المنطقة)",
+    "promosmsSMSSender": "اسم مرسل الرسائل القصيرة",
+    "promosmsAllowLongSMS": "السماح الرسائل القصيرة الطويلة",
+    "Feishu WebHookUrl": "Feishu Webhookurl",
+    "matrixHomeserverURL": "عنوان URL HomeServer (مع HTTP (S)",
+    "Internal Room Id": "معرف الغرفة الداخلية",
+    "matrixDesc1": "يمكنك العثور على معرف الغرفة الداخلي من خلال البحث في القسم المتقدم من إعدادات الغرفة في عميل Matrix الخاص بك. يجب أن تبدو مثل! QMDRCPUIFLWSFJXYE6",
+    "matrixDesc2": "يوصى بشدة بإنشاء مستخدم جديد ولا تستخدم رمز الوصول إلى مستخدم Matrix الخاص بك لأنه سيتيح الوصول الكامل إلى حسابك وجميع الغرف التي انضمت إليها. بدلاً من ذلك ، قم بإنشاء مستخدم جديد ودعوته فقط إلى الغرفة التي تريد تلقيها الإشعار فيها. يمكنك الحصول على رمز الوصول عن طريق تشغيل {0}",
+    "Method": "طريقة",
+    "Body": "الجسم",
+    "Headers": "الرؤوس",
+    "PushUrl": "دفع عنوان URL",
+    "HeadersInvalidFormat": "رؤوس الطلبات غير صالحة JSON",
+    "BodyInvalidFormat": "هيئة الطلب غير صالحة JSON",
+    "Monitor History": "مراقبة التاريخ",
+    "clearDataOlderThan": "الحفاظ على بيانات سجل المراقبة للأيام {0}.",
+    "PasswordsDoNotMatch": "كلمة المرور غير مطابقة.",
+    "records": "السجلات",
+    "One record": "سجل واحد",
+    "steamApiKeyDescription": "لمراقبة خادم لعبة Steam ، تحتاج إلى مفتاح Steam Web-API. يمكنك تسجيل مفتاح API الخاص بك هنا",
+    "Current User": "المستخدم الحالي",
+    "topic": "عنوان",
+    "topicExplanation": "موضوع MQTT لرصد",
+    "successMessage": "نجاح رسالة",
+    "successMessageExplanation": "رسالة MQTT التي ستعتبر نجاحًا",
+    "recent": "الأخيرة",
+    "Done": "فعله",
+    "Info": "معلومات",
+    "Security": "حماية",
+    "Steam API Key": "مفتاح API Steam",
+    "Shrink Database": "تقلص قاعدة البيانات",
+    "Pick a RR-Type...": "اختر نوع RR ...",
+    "Pick Accepted Status Codes...": "اختيار رموز الحالة المقبولة ...",
+    "Default": "تقصير",
+    "HTTP Options": "خيارات HTTP",
+    "Create Incident": "إنشاء حادث",
+    "Title": "لقب",
+    "Content": "المحتوى",
+    "Style": "أسلوب",
+    "info": "معلومات",
+    "warning": "تحذير",
+    "danger": "خطر",
+    "error": "خطأ",
+    "critical": "شديد الأهمية",
+    "primary": "الأولية",
+    "light": "نور",
+    "dark": "ظلام",
+    "Post": "بريد",
+    "Please input title and content": "الرجاء إدخال العنوان والمحتوى",
+    "Created": "مخلوق",
+    "Last Updated": "التحديث الاخير",
+    "Unpin": "إلغاء",
+    "Switch to Light Theme": "التبديل إلى موضوع الضوء",
+    "Switch to Dark Theme": "التبديل إلى موضوع الظلام",
+    "Show Tags": "أضهر العلامات",
+    "Hide Tags": "إخفاء العلامات",
+    "Description": "وصف",
+    "No monitors available.": "لا شاشات المتاحة.",
+    "Add one": "أضف واحدا",
+    "No Monitors": "لا شاشات",
+    "Untitled Group": "مجموعة بلا عنوان",
+    "Services": "خدمات",
+    "Discard": "تجاهل",
+    "Cancel": "يلغي",
+    "Powered by": "مشغل بواسطة",
+    "shrinkDatabaseDescription": "تشغيل فراغ قاعدة البيانات لـ SQLite. إذا تم إنشاء قاعدة البيانات الخاصة بك بعد تمكين 1.10.0 AUTO_VACUUM بالفعل ولا يلزم هذا الإجراء.",
+    "serwersms": "Serwersms.pl",
+    "serwersmsAPIUser": "اسم مستخدم API (بما في ذلك بادئة WebAPI_)",
+    "serwersmsAPIPassword": "كلمة مرور API",
+    "serwersmsPhoneNumber": "رقم الهاتف",
+    "serwersmsSenderName": "اسم مرسل الرسائل القصيرة (مسجل عبر بوابة العملاء)",
+    "smseagle": "smseagle",
+    "smseagleTo": "أرقام الهواتف)",
+    "smseagleGroup": "اسم مجموعة كتب الهاتف (S)",
+    "smseagleContact": "كتاب الاتصال اسم (S)",
+    "smseagleRecipientType": "نوع المستلم",
+    "smseagleRecipient": "المتلقي (المتلقيين) (يجب فصل المتعددة مع فاصلة)",
+    "smseagleToken": "API وصول الرمز المميز",
+    "smseagleUrl": "عنوان URL لجهاز SMSEGLE الخاص بك",
+    "smseagleEncoding": "إرسال Unicode",
+    "smseaglePriority": "أولوية الرسالة (0-9 افتراضي = 0)",
+    "stackfield": "Stackfield",
+    "Customize": "يعدل أو يكيف",
+    "Custom Footer": "تذييل مخصص",
+    "Custom CSS": "لغة تنسيق ويب حسب الطلب",
+    "smtpDkimSettings": "إعدادات DKIM",
+    "smtpDkimDesc": "يرجى الرجوع إلى Nodemailer dkim {0} للاستخدام.",
+    "documentation": "توثيق",
+    "smtpDkimDomain": "اسم النطاق",
+    "smtpDkimKeySelector": "المحدد الرئيسي",
+    "smtpDkimPrivateKey": "مفتاح سري",
+    "smtpDkimHashAlgo": "خوارزمية التجزئة (اختياري)",
+    "smtpDkimheaderFieldNames": "مفاتيح الرأس للتوقيع (اختياري)",
+    "smtpDkimskipFields": "مفاتيح الرأس لا توقيع (اختياري)",
+    "wayToGetPagerDutyKey": "يمكنك الحصول على هذا عن طريق الانتقال إلى الخدمة -> دليل الخدمة -> (حدد خدمة) -> تكامل -> إضافة التكامل. هنا يمكنك البحث عن \"Events API V2\". مزيد من المعلومات {0}",
+    "Integration Key": "مفتاح التكامل",
+    "Integration URL": "URL تكامل",
+    "Auto resolve or acknowledged": "حل السيارات أو الاعتراف به",
+    "do nothing": "لا تفعل شيئا",
+    "auto acknowledged": "اعترف السيارات",
+    "auto resolve": "عزم السيارات",
+    "gorush": "جورش",
+    "alerta": "أليتا",
+    "alertaApiEndpoint": "نقطة نهاية API",
+    "alertaEnvironment": "بيئة",
+    "alertaApiKey": "مفتاح API",
+    "alertaAlertState": "حالة التنبيه",
+    "alertaRecoverState": "استعادة الدولة",
+    "deleteStatusPageMsg": "هل أنت متأكد من حذف صفحة الحالة هذه؟",
+    "Proxies": "وكلاء",
+    "default": "تقصير",
+    "enabled": "تمكين",
+    "setAsDefault": "تعيين كافتراضي",
+    "deleteProxyMsg": "هل أنت متأكد من حذف هذا الوكيل لجميع الشاشات؟",
+    "proxyDescription": "يجب تعيين الوكلاء إلى شاشة للعمل.",
+    "enableProxyDescription": "لن يؤثر هذا الوكيل على طلبات الشاشة حتى يتم تنشيطه. يمكنك التحكم مؤقتًا في تعطيل الوكيل من جميع الشاشات حسب حالة التنشيط.",
+    "setAsDefaultProxyDescription": "سيتم تمكين هذا الوكيل افتراضيًا للشاشات الجديدة. لا يزال بإمكانك تعطيل الوكيل بشكل منفصل لكل شاشة.",
+    "Certificate Chain": "سلسلة الشهادة",
+    "Valid": "صالح",
+    "Invalid": "غير صالح",
+    "AccessKeyId": "معرف AccessKey",
+    "SecretAccessKey": "Accesskey Secret",
+    "PhoneNumbers": "أرقام الهواتف",
+    "TemplateCode": "TemplateCode",
+    "SignName": "اسم تسجيل الدخول",
+    "Sms template must contain parameters: ": "يجب أن يحتوي قالب الرسائل القصيرة على معلمات:",
+    "Bark Endpoint": "نقطة نهاية اللحاء",
+    "Bark Group": "مجموعة اللحاء",
+    "Bark Sound": "صوت اللحاء",
+    "WebHookUrl": "webhookurl",
+    "SecretKey": "Secretkey",
+    "For safety, must use secret key": "للسلامة يجب استخدام المفتاح السري",
+    "Device Token": "رمز الجهاز",
+    "Platform": "منصة",
+    "iOS": "iOS",
+    "Android": "ذكري المظهر",
+    "Huawei": "هواوي",
+    "High": "عالٍ",
+    "Retry": "إعادة المحاولة",
+    "Topic": "عنوان",
+    "WeCom Bot Key": "WECOM BOT KEY",
+    "Setup Proxy": "وكيل الإعداد",
+    "Proxy Protocol": "بروتوكول الوكيل",
+    "Proxy Server": "مخدم بروكسي",
+    "Proxy server has authentication": "خادم الوكيل لديه مصادقة",
+    "User": "المستعمل",
+    "Installed": "المثبتة",
+    "Not installed": "غير مثبت",
+    "Running": "جري",
+    "Not running": "لا يعمل",
+    "Remove Token": "إزالة الرمز المميز",
+    "Start": "بداية",
+    "Stop": "قف",
+    "Uptime Kuma": "وقت التشغيل كوما",
+    "Add New Status Page": "أضف صفحة حالة جديدة",
+    "Slug": "سبيكة",
+    "Accept characters": "قبول الشخصيات",
+    "startOrEndWithOnly": "ابدأ أو ينتهي بـ {0} فقط",
+    "No consecutive dashes": "لا شرطات متتالية",
+    "Next": "التالي",
+    "The slug is already taken. Please choose another slug.": "تم أخذ سبيكة بالفعل. الرجاء اختيار سبيكة أخرى.",
+    "No Proxy": "لا الوكيل",
+    "Authentication": "المصادقة",
+    "HTTP Basic Auth": "HTTP الأساسي Auth",
+    "New Status Page": "صفحة حالة جديدة",
+    "Page Not Found": "الصفحة غير موجودة",
+    "Reverse Proxy": "وكيل عكسي",
+    "Backup": "دعم",
+    "About": "عن",
+    "wayToGetCloudflaredURL": "(قم بتنزيل CloudFlared من {0})",
+    "cloudflareWebsite": "موقع CloudFlare",
+    "Message:": ":رسالة",
+    "Don't know how to get the token? Please read the guide": "لا أعرف كيف تحصل على الرمز المميز؟ يرجى قراءة الدليل",
+    "The current connection may be lost if you are currently connecting via Cloudflare Tunnel. Are you sure want to stop it? Type your current password to confirm it.": "قد يضيع الاتصال الحالي إذا كنت تتصل حاليًا عبر نفق CloudFlare. هل أنت متأكد تريد إيقافها؟ اكتب كلمة المرور الحالية لتأكيدها.",
+    "HTTP Headers": "رؤوس HTTP",
+    "Trust Proxy": "الوكيل الثقة",
+    "Other Software": "برامج أخرى",
+    "For example: nginx, Apache and Traefik.": "على سبيل المثال: nginx و Apache و Traefik.",
+    "Please read": "يرجى القراءة",
+    "Subject": "موضوع",
+    "Valid To": "صالحة ل",
+    "Days Remaining": "الأيام المتبقية",
+    "Issuer": "المصدر",
+    "Fingerprint": "بصمة",
+    "No status pages": "لا صفحات الحالة",
+    "Domain Name Expiry Notification": "اسم النطاق إشعار انتهاء الصلاحية",
+    "Proxy": "الوكيل",
+    "Date Created": "تاريخ الإنشاء",
+    "HomeAssistant": "مساعد المنزل",
+    "onebotHttpAddress": "OneBot HTTP عنوان",
+    "onebotMessageType": "نوع رسالة OneBot",
+    "onebotGroupMessage": "مجموعة",
+    "onebotPrivateMessage": "خاص",
+    "onebotUserOrGroupId": "معرف المجموعة/المستخدم",
+    "onebotSafetyTips": "للسلامة يجب ضبط الرمز المميز للوصول",
+    "PushDeer Key": "مفتاح PushDeer",
+    "Footer Text": "نص تذييل",
+    "Show Powered By": "عرض مدعوم من قبل",
+    "Domain Names": "أسماء المجال",
+    "signedInDisp": "وقعت في {0}",
+    "signedInDispDisabled": "معاق المصادقة.",
+    "RadiusSecret": "سر نصف القطر",
+    "RadiusSecretDescription": "السر المشترك بين العميل والخادم",
+    "RadiusCalledStationId": "يسمى معرف المحطة",
+    "RadiusCalledStationIdDescription": "معرف الجهاز المتصل",
+    "RadiusCallingStationId": "معرف محطة الاتصال",
+    "RadiusCallingStationIdDescription": "معرف جهاز الاتصال",
+    "Certificate Expiry Notification": "إشعار انتهاء الصلاحية",
+    "API Username": "اسم المستخدم API",
+    "API Key": "مفتاح API",
+    "Recipient Number": "رقم المستلم",
+    "From Name/Number": "من الاسم/الرقم",
+    "Leave blank to use a shared sender number.": "اترك فارغًا لاستخدام رقم المرسل المشترك.",
+    "Octopush API Version": "إصدار Octopush API",
+    "Legacy Octopush-DM": "Legacy Octopush-DM",
+    "endpoint": "نقطة النهاية",
+    "octopushAPIKey": "\"API key\" from HTTP API بيانات اعتماد في لوحة التحكم",
+    "octopushLogin": "\"Login\" من بيانات اعتماد API HTTP في لوحة التحكم",
+    "promosmsLogin": "اسم تسجيل الدخول API",
+    "promosmsPassword": "كلمة مرور API",
+    "pushoversounds pushover": "سداد (افتراضي)",
+    "pushoversounds bike": "دراجة هوائية",
+    "pushoversounds bugle": "بوق",
+    "pushoversounds cashregister": "ماكينة تسجيل المدفوعات النقدية",
+    "pushoversounds classical": "كلاسيكي",
+    "pushoversounds cosmic": "كونية",
+    "pushoversounds falling": "هبوط",
+    "pushoversounds gamelan": "Gamelan",
+    "pushoversounds incoming": "واردة",
+    "pushoversounds intermission": "استراحة",
+    "pushoversounds magic": "سحر",
+    "pushoversounds mechanical": "ميكانيكي",
+    "pushoversounds pianobar": "شريط البيانو",
+    "pushoversounds siren": "صفارة إنذار",
+    "pushoversounds spacealarm": "إنذار الفضاء",
+    "pushoversounds tugboat": "قارب السحب",
+    "pushoversounds alien": "إنذار أجنبي (طويل)",
+    "pushoversounds climb": "تسلق (طويل)",
+    "pushoversounds persistent": "مستمر (طويل)",
+    "pushoversounds echo": "صدى مهووس (طويل)",
+    "pushoversounds updown": "صعودا (طويلة)",
+    "pushoversounds vibrate": "يهتز فقط",
+    "pushoversounds none": "لا شيء (صامت)",
+    "pushyAPIKey": "مفتاح API السري",
+    "pushyToken": "رمز الجهاز",
+    "Show update if available": "عرض التحديث إذا كان ذلك متاحًا",
+    "Also check beta release": "تحقق أيضًا من الإصدار التجريبي",
+    "Using a Reverse Proxy?": "باستخدام وكيل عكسي؟",
+    "Check how to config it for WebSocket": "تحقق من كيفية تكوينه لـ WebSocket",
+    "Steam Game Server": "خادم لعبة البخار",
+    "Most likely causes": "الأسباب المرجحة",
+    "The resource is no longer available.": "لم يعد المورد متاحًا.",
+    "There might be a typing error in the address.": "قد يكون هناك خطأ مطبعي في العنوان.",
+    "What you can try": "ماذا تستطيع أن تجرب",
+    "Retype the address.": "اعد كتابة العنوان.",
+    "Go back to the previous page.": "عد للصفحة السابقة.",
+    "Coming Soon": "قريبا",
+    "wayToGetClickSendSMSToken": "يمكنك الحصول على اسم مستخدم API ومفتاح API من {0}.",
+    "Connection String": "سلسلة الاتصال",
+    "Query": "استفسار",
+    "settingsCertificateExpiry": "شهادة TLS انتهاء الصلاحية",
+    "certificationExpiryDescription": "شاشات HTTPS تضيء عندما تنتهي شهادة TLS في",
+    "Setup Docker Host": "إعداد مضيف Docker",
+    "Connection Type": "نوع الاتصال",
+    "Docker Daemon": "Docker Daemon",
+    "deleteDockerHostMsg": "هل أنت متأكد من حذف مضيف Docker لجميع الشاشات؟",
+    "socket": "قابس كهرباء",
+    "tcp": "TCP / HTTP",
+    "Docker Container": "حاوية Docker",
+    "Container Name / ID": "اسم الحاوية / معرف",
+    "Docker Host": "مضيف Docker",
+    "Docker Hosts": "مضيفي Docker",
+    "ntfy Topic": "موضوع ntfy",
+    "Domain": "اِختِصاص",
+    "Workstation": "محطة العمل",
+    "disableCloudflaredNoAuthMsg": "أنت في وضع مصادقة لا توجد كلمة مرور غير مطلوبة.",
+    "trustProxyDescription": "الثقة 'x-forward-*'. إذا كنت ترغب في الحصول على IP العميل الصحيح وكوما في الوقت المناسب مثل Nginx أو Apache ، فيجب عليك تمكين ذلك.",
+    "wayToGetLineNotifyToken": "يمكنك الحصول على رمز الوصول من {0}",
+    "Examples": "أمثلة",
+    "Home Assistant URL": "Home Assistant URL",
+    "Long-Lived Access Token": "الرمز المميز للوصول منذ فترة طويلة",
+    "Long-Lived Access Token can be created by clicking on your profile name (bottom left) and scrolling to the bottom then click Create Token. ": "يمكن إنشاء رمز الوصول منذ فترة طويلة عن طريق النقر على اسم ملف التعريف الخاص بك (أسفل اليسار) والتمرير إلى الأسفل ثم انقر فوق إنشاء الرمز المميز.",
+    "Notification Service": "خدمة الإخطار",
+    "default: notify all devices": "الافتراضي: إخطار جميع الأجهزة",
+    "A list of Notification Services can be found in Home Assistant under \"Developer Tools > Services\" search for \"notification\" to find your device/phone name.": "يمكن العثور على قائمة بخدمات الإخطار في المساعد المنزلي ضمن \"Developer Tools > Services\" ابحث عن \"notification\" للعثور على اسم جهازك/هاتفك.",
+    "Automations can optionally be triggered in Home Assistant": "يمكن أن يتم تشغيل الأتمتة اختياريًا في مساعد المنزل",
+    "Trigger type": "نوع الزناد",
+    "Event type": "نوع الحدث",
+    "Event data": "بيانات الحدث",
+    "Then choose an action, for example switch the scene to where an RGB light is red.": "ثم اختر إجراءً على سبيل المثال قم بتبديل المشهد إلى حيث يكون ضوء RGB أحمر.",
+    "Frontend Version": "إصدار الواجهة الأمامية",
+    "Frontend Version do not match backend version!": "إصدار Frontend لا يتطابق مع الإصدار الخلفي!",
+    "Base URL": "عنوان URL الأساسي",
+    "goAlertInfo": "الهدف هو تطبيق مفتوح المصدر لجدولة الجدولة التلقائية والإشعارات (مثل الرسائل القصيرة أو المكالمات الصوتية). إشراك الشخص المناسب تلقائيًا بالطريقة الصحيحة وفي الوقت المناسب! {0}",
+    "goAlertIntegrationKeyInfo": "احصل على مفتاح تكامل API العام للخدمة في هذا التنسيق \"aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee\" عادةً قيمة المعلمة الرمزية لعنوان url المنسق.",
+    "goAlert": "المرمى",
+    "backupOutdatedWarning": "إهمال",
+    "backupRecommend": "يرجى النسخ الاحتياطي لحجم الصوت أو مجلد البيانات (./data/) مباشرة بدلاً من ذلك.",
+    "Optional": "اختياري",
+    "squadcast": "القاء فريقي",
+    "SendKey": "Sendkey",
+    "SMSManager API Docs": "مستندات SMSManager API",
+    "Gateway Type": "نوع البوابة",
+    "SMSManager": "smsmanager",
+    "You can divide numbers with": "يمكنك تقسيم الأرقام مع",
+    "or": "أو",
+    "recurringInterval": "فترة",
+    "Recurring": "يتكرر",
+    "strategyManual": "نشط/غير نشط يدويًا",
+    "warningTimezone": "إنه يستخدم المنطقة الزمنية للخادم",
+    "weekdayShortMon": "الاثنين",
+    "weekdayShortTue": "الثلاثاء",
+    "weekdayShortWed": "تزوج",
+    "weekdayShortThu": "الخميس",
+    "weekdayShortFri": "الجمعة",
+    "weekdayShortSat": "جلس",
+    "weekdayShortSun": "شمس",
+    "dayOfWeek": "يوم من الأسبوع",
+    "dayOfMonth": "يوم من الشهر",
+    "lastDay": "بالأمس",
+    "lastDay1": "آخر يوم من الشهر",
+    "lastDay2": "الثاني في اليوم الأخير من الشهر",
+    "lastDay3": "الثالث في اليوم الأخير من الشهر",
+    "lastDay4": "الرابع في اليوم الأخير من الشهر",
+    "No Maintenance": "لا صيانة",
+    "pauseMaintenanceMsg": "هل أنت متأكد من أن تتوقف مؤقتًا؟",
+    "maintenanceStatus-under-maintenance": "تحت الصيانة",
+    "maintenanceStatus-inactive": "غير نشط",
+    "maintenanceStatus-scheduled": "المقرر",
+    "maintenanceStatus-ended": "انتهى",
+    "maintenanceStatus-unknown": "مجهول",
+    "Display Timezone": "عرض المنطقة الزمنية",
+    "Server Timezone": "المنطقة الزمنية الخادم",
+    "statusPageMaintenanceEndDate": "نهاية",
+    "IconUrl": "url url icon",
+    "Enable DNS Cache": "تمكين ذاكرة التخزين المؤقت DNS",
+    "Enable": "يُمكَِن",
+    "Disable": "إبطال",
+    "dnsCacheDescription": "قد لا يعمل في بعض بيئات IPv6 تعطيله إذا واجهت أي مشكلات.",
+    "Single Maintenance Window": "نافذة صيانة واحدة",
+    "Maintenance Time Window of a Day": "نافذة وقت الصيانة لليوم",
+    "Effective Date Range": "نطاق التاريخ السريع",
+    "Schedule Maintenance": "جدولة الصيانة",
+    "Date and Time": "التاريخ و الوقت",
+    "DateTime Range": "نطاق DateTime",
+    "Strategy": "إستراتيجية",
+    "Free Mobile User Identifier": "معرف مستخدم الهاتف المحمول المجاني",
+    "Free Mobile API Key": "مفتاح واجهة برمجة تطبيقات مجانية للهاتف المحمول",
+    "Enable TLS": "تمكين TLS",
+    "Proto Service Name": "اسم خدمة البروتو",
+    "Proto Method": "طريقة البروتو",
+    "Proto Content": "محتوى proto",
+    "Economy": "اقتصاد",
+    "Lowcost": "تكلفة منخفضة",
+    "high": "عالي",
+    "General Monitor Type": "نوع الشاشة العامة",
+    "Passive Monitor Type": "نوع الشاشة السلبي",
+    "Specific Monitor Type": "نوع شاشة محدد",
+    "dataRetentionTimeError": "يجب أن تكون فترة الاستبقاء 0 أو أكبر",
+    "infiniteRetention": "ضبط على 0 للاحتفاظ لا نهائي.",
+    "confirmDeleteTagMsg": "هل أنت متأكد من أنك تريد حذف هذه العلامة؟ لن يتم حذف الشاشات المرتبطة بهذه العلامة."
+}
diff --git a/src/lang/bg-BG.json b/src/lang/bg-BG.json
new file mode 100644
index 000000000..ae2cdce61
--- /dev/null
+++ b/src/lang/bg-BG.json
@@ -0,0 +1,700 @@
+{
+    "languageName": "Български",
+    "checkEverySecond": "Ще се извършва на всеки {0} секунди",
+    "retryCheckEverySecond": "Ще се извършва на всеки {0} секунди",
+    "retriesDescription": "Максимален брой опити преди маркиране на услугата като недостъпна и изпращане на известие",
+    "ignoreTLSError": "Игнорирай TLS/SSL грешки за HTTPS уеб сайтове",
+    "upsideDownModeDescription": "Обръща статуса от достъпен на недостъпен. Ако услугата е достъпна, ще се вижда като НЕДОСТЪПНА.",
+    "maxRedirectDescription": "Максимален брой пренасочвания, които да бъдат следвани. Въведете 0 за да изключите пренасочване.",
+    "acceptedStatusCodesDescription": "Изберете статус кодове, които да се считат за успешен отговор.",
+    "passwordNotMatchMsg": "Повторената парола не съвпада.",
+    "notificationDescription": "Моля, задайте известието към монитор(и), за да функционира.",
+    "keywordDescription": "Търси ключова дума в чист HTML или JSON отговор - чувствителна е към регистъра.",
+    "pauseDashboardHome": "Пауза",
+    "deleteMonitorMsg": "Наистина ли желаете да изтриете този монитор?",
+    "deleteNotificationMsg": "Наистина ли желаете да изтриете това известие за всички монитори?",
+    "resolverserverDescription": "Cloudflare е сървърът по подразбиране, но можете да го промените по всяко време.",
+    "rrtypeDescription": "Изберете ресурсния запис, който желаете да наблюдавате",
+    "pauseMonitorMsg": "Наистина ли желаете да поставите в режим пауза?",
+    "enableDefaultNotificationDescription": "За всеки нов монитор това известие ще бъде активирано по подразбиране. Можете да го изключите за всеки отделен монитор.",
+    "clearEventsMsg": "Наистина ли желаете да изтриете всички събития за този монитор?",
+    "clearHeartbeatsMsg": "Наистина ли желаете да изтриете всички записи за честотни проверки на този монитор?",
+    "confirmClearStatisticsMsg": "Наистина ли желаете да изтриете всички статистически данни?",
+    "importHandleDescription": "Изберете 'Пропусни съществуващите', ако желаете да пропуснете всеки монитор или известие със същото име. 'Презапис' ще изтрие всеки съществуващ монитор и известие.",
+    "confirmImportMsg": "Сигурни ли сте, че желаете импортирането на архива? Моля, уверете се, че сте избрали правилната опция за импортиране.",
+    "twoFAVerifyLabel": "Моля, въведете вашия токен код, за да проверите дали 2FA работи:",
+    "tokenValidSettingsMsg": "Токен кодът е валиден! Вече можете да запазите настройките за 2FA.",
+    "confirmEnableTwoFAMsg": "Сигурни ли сте, че желаете да активирате 2FA?",
+    "confirmDisableTwoFAMsg": "Сигурни ли сте, че желаете да изключите 2FA?",
+    "Settings": "Настройки",
+    "Dashboard": "Табло",
+    "New Update": "Налична е актуализация",
+    "Language": "Език",
+    "Appearance": "Изглед",
+    "Theme": "Тема",
+    "General": "Общи",
+    "Version": "Версия",
+    "Check Update On GitHub": "Проверка за актуализация в GitHub",
+    "List": "Списък",
+    "Add": "Добави",
+    "Add New Monitor": "Добави монитор",
+    "Quick Stats": "Кратка статистика",
+    "Up": "Достъпен",
+    "Down": "Недостъпен",
+    "Pending": "Изчаква",
+    "Unknown": "Неизвестен",
+    "Pause": "Пауза",
+    "Name": "Име",
+    "Status": "Статус",
+    "DateTime": "Дата и час",
+    "Message": "Отговор",
+    "No important events": "Все още няма събития",
+    "Resume": "Възобнови",
+    "Edit": "Редактирай",
+    "Delete": "Изтрий",
+    "Current": "Текущ",
+    "Uptime": "Достъпност",
+    "Cert Exp.": "Вал. сертификат",
+    "day": "ден | дни",
+    "-day": "-дни",
+    "hour": "час",
+    "-hour": "-часa",
+    "Response": "Отговор",
+    "Ping": "Пинг",
+    "Monitor Type": "Монитор тип",
+    "Keyword": "Ключова дума",
+    "Friendly Name": "Псевдоним",
+    "URL": "URL Адрес",
+    "Hostname": "Име на хост",
+    "Port": "Порт",
+    "Heartbeat Interval": "Честота на проверка",
+    "Retries": "Повторни опити",
+    "Heartbeat Retry Interval": "Честота на повторните опити",
+    "Advanced": "Разширени",
+    "Upside Down Mode": "Обърнат режим",
+    "Max. Redirects": "Макс. брой пренасочвания",
+    "Accepted Status Codes": "Допустими статус кодове",
+    "Save": "Запази",
+    "Notifications": "Известия",
+    "Not available, please setup.": "Не са налични. Моля, настройте.",
+    "Setup Notification": "Настрой известие",
+    "Light": "Светла",
+    "Dark": "Тъмна",
+    "Auto": "Автоматично",
+    "Theme - Heartbeat Bar": "Тема - поле проверки",
+    "Normal": "Нормално",
+    "Bottom": "Долу",
+    "None": "Без",
+    "Timezone": "Часова зона",
+    "Search Engine Visibility": "Видимост за търсачки",
+    "Allow indexing": "Разреши индексиране",
+    "Discourage search engines from indexing site": "Не позволявай на търсачките да индексират този сайт",
+    "Change Password": "Промяна на парола",
+    "Current Password": "Текуща парола",
+    "New Password": "Нова парола",
+    "Repeat New Password": "Повторете новата парола",
+    "Update Password": "Актуализирай паролата",
+    "Disable Auth": "Изключи удостоверяване",
+    "Enable Auth": "Активирай удостоверяване",
+    "disableauth.message1": "Сигурни ли сте, че желаете да <strong>изключите удостоверяването</strong>?",
+    "disableauth.message2": "Използва се в случаите, когато <strong>има настроен алтернативен метод за удостоверяване</strong> преди Uptime Kuma, например Cloudflare Access, Authelia или друг механизъм за удостоверяване.",
+    "Please use this option carefully!": "Моля, използвайте с повишено внимание!",
+    "Logout": "Изход от профила",
+    "Leave": "Отказ",
+    "I understand, please disable": "Разбирам. Моля, изключи",
+    "Confirm": "Потвърдете",
+    "Yes": "Да",
+    "No": "Не",
+    "Username": "Потребител",
+    "Password": "Парола",
+    "Remember me": "Запомни ме",
+    "Login": "Вход",
+    "No Monitors, please": "Все още няма монитори. Моля,",
+    "add one": "добавете един.",
+    "Notification Type": "Тип известие",
+    "Email": "Имейл",
+    "Test": "Тест",
+    "Certificate Info": "Информация за сертификат",
+    "Resolver Server": "Преобразуващ (DNS) сървър",
+    "Resource Record Type": "Тип запис",
+    "Last Result": "Последен резултат",
+    "Create your admin account": "Създаване на администриращ акаунт",
+    "Repeat Password": "Повторете паролата",
+    "Import Backup": "Импорт на архив",
+    "Export Backup": "Експорт на архив",
+    "Export": "Експорт",
+    "Import": "Импорт",
+    "respTime": "Време за отговор (ms)",
+    "notAvailableShort": "Няма",
+    "Default enabled": "Активирано по подразбиране",
+    "Apply on all existing monitors": "Приложи върху всички съществуващи монитори",
+    "Create": "Създай",
+    "Clear Data": "Изтрий данни",
+    "Events": "Събития",
+    "Heartbeats": "Проверки",
+    "Auto Get": "Авт. попълване",
+    "backupDescription": "Можете да архивирате всички монитори и всички известия в JSON файл.",
+    "backupDescription2": "PS: Имайте предвид, че данните за история и събития няма да бъдат включени.",
+    "backupDescription3": "Чувствителни данни, като токен кодове за известия, се съдържат в експортирания файл. Моля, бъдете внимателни с неговото съхранение.",
+    "alertNoFile": "Моля, изберете файл за импортиране.",
+    "alertWrongFileType": "Моля, изберете JSON файл.",
+    "Clear all statistics": "Изтрий цялата статистика",
+    "Skip existing": "Пропусни съществуващите",
+    "Overwrite": "Презапиши",
+    "Options": "Опции",
+    "Keep both": "Запази двете",
+    "Verify Token": "Провери токен код",
+    "Setup 2FA": "Настройка 2FA",
+    "Enable 2FA": "Активирай 2FA",
+    "Disable 2FA": "Деактивирай 2FA",
+    "2FA Settings": "Настройка за 2FA",
+    "Two Factor Authentication": "Двуфакторно удостоверяване",
+    "Active": "Активно",
+    "Inactive": "Неактивно",
+    "Token": "Токен код",
+    "Show URI": "Покажи URI",
+    "Tags": "Етикети",
+    "Add New below or Select...": "Добавете нов по-долу или изберете…",
+    "Tag with this name already exist.": "Етикет с това име вече съществува.",
+    "Tag with this value already exist.": "Етикет с тази стойност вече съществува.",
+    "color": "цвят",
+    "value (optional)": "стойност (по желание)",
+    "Gray": "Сиво",
+    "Red": "Червено",
+    "Orange": "Оранжево",
+    "Green": "Зелено",
+    "Blue": "Синьо",
+    "Indigo": "Индиго",
+    "Purple": "Лилаво",
+    "Pink": "Розово",
+    "Search...": "Търси…",
+    "Avg. Ping": "Ср. пинг",
+    "Avg. Response": "Ср. отговор",
+    "Entry Page": "Основна страница",
+    "statusPageNothing": "Все още няма нищо тук. Моля, добавете група или монитор.",
+    "No Services": "Няма Услуги",
+    "All Systems Operational": "Всички услуги са достъпни",
+    "Partially Degraded Service": "Част от услугите са недостъпни",
+    "Degraded Service": "Всички услуги са недостъпни",
+    "Add Group": "Добави група",
+    "Add a monitor": "Добави монитор",
+    "Edit Status Page": "Редактиране Статус страница",
+    "Go to Dashboard": "Към Таблото",
+    "telegram": "Telegram",
+    "webhook": "Уеб кука",
+    "smtp": "Имейл (SMTP)",
+    "discord": "Discord",
+    "teams": "Microsoft Teams",
+    "signal": "Signal",
+    "gotify": "Gotify",
+    "slack": "Slack",
+    "rocket.chat": "Rocket.chat",
+    "pushover": "Pushover",
+    "pushy": "Pushy",
+    "octopush": "Octopush",
+    "promosms": "PromoSMS",
+    "lunasea": "LunaSea",
+    "apprise": "Apprise (Поддържа 50+ услуги за известяване)",
+    "pushbullet": "Pushbullet",
+    "line": "Line Messenger",
+    "mattermost": "Mattermost",
+    "Status Page": "Статус страница",
+    "Status Pages": "Статус страници",
+    "Primary Base URL": "Основен базов URL адрес",
+    "Push URL": "Генериран Push URL адрес",
+    "needPushEvery": "Необходимо е да извършвате заявка към този URL адрес на всеки {0} секунди.",
+    "pushOptionalParams": "Допълнителни, но не задължителни параметри: {0}",
+    "defaultNotificationName": "Моето {notification} известие ({number})",
+    "here": "тук",
+    "Required": "Задължително поле",
+    "Bot Token": "Бот токен",
+    "wayToGetTelegramToken": "Можете да получите токен от {0}.",
+    "Chat ID": "Чат ID",
+    "supportTelegramChatID": "Поддържа Direct Chat / Group / Channel's Chat ID",
+    "wayToGetTelegramChatID": "Можете да получите вашето чат ID, като изпратите съобщение на бота, след което е нужно да посетите този URL адрес за да го видите:",
+    "YOUR BOT TOKEN HERE": "ВАШИЯТ БОТ ТОКЕН ТУК",
+    "chatIDNotFound": "Чат ID не е намерено. Моля, първо изпратете съобщение до този бот",
+    "Post URL": "Post URL адрес",
+    "Content Type": "Тип съдържание",
+    "webhookJsonDesc": "{0} е подходящ за всички съвременни http сървъри, като например express.js",
+    "webhookFormDataDesc": "{multipart} е подходящ за PHP, нужно е да анализирате json чрез {decodeFunction}",
+    "secureOptionNone": "Няма (25) / STARTTLS (587)",
+    "secureOptionTLS": "TLS (465)",
+    "Ignore TLS Error": "Игнорирай TLS грешките",
+    "From Email": "От имейл адрес",
+    "emailCustomSubject": "Модифициране на тема",
+    "To Email": "Получател имейл адрес",
+    "smtpCC": "Явно копие до имейл адрес:",
+    "smtpBCC": "Скрито копие до имейл адрес:",
+    "Discord Webhook URL": "Discord URL адрес на уеб кука",
+    "wayToGetDiscordURL": "Можете да създадете, от меню \"Настройки на сървъра\" -> \"Интеграции\" -> \"Уеб куки\" -> \"Нова уеб кука\"",
+    "Bot Display Name": "Име на бота, което да се показва",
+    "Prefix Custom Message": "Модифицирано обръщение",
+    "Hello @everyone is...": "Здравейте, {'@'}everyone е…",
+    "Webhook URL": "Уеб кука URL адрес",
+    "wayToGetTeamsURL": "Можете да научите как се създава URL адрес за уеб кука {0}.",
+    "Number": "Номер",
+    "Recipients": "Получатели",
+    "needSignalAPI": "Необходимо е да разполагате със Signal клиент с REST API.",
+    "wayToCheckSignalURL": "Можете да посетите този URL адрес, ако се нуждаете от помощ при настройването:",
+    "signalImportant": "ВАЖНО: Не можете да смесвате \"Групи\" и \"Номера\" в поле \"Получатели\"!",
+    "Application Token": "Токен код за приложението",
+    "Server URL": "URL адрес на сървъра",
+    "Priority": "Приоритет",
+    "Icon Emoji": "Иконка Емотикон",
+    "Channel Name": "Канал име",
+    "Uptime Kuma URL": "Uptime Kuma URL адрес",
+    "aboutWebhooks": "Повече информация относно уеб куки на: {0}",
+    "aboutChannelName": "Въведете името на канала в поле {0} \"Канал име\", ако желаете да заобиколите канала от уеб куката. Например: #other-channel",
+    "aboutKumaURL": "Ако оставите празно полето \"Uptime Kuma URL адрес\", по подразбиране ще се използва GitHub страницата на проекта.",
+    "emojiCheatSheet": "Подсказки за емотикони: {0}",
+    "User Key": "Потребителски ключ",
+    "Device": "Устройство",
+    "Message Title": "Заглавие на съобщението",
+    "Notification Sound": "Звуков сигнал",
+    "More info on:": "Повече информация на: {0}",
+    "pushoverDesc1": "Приоритет Спешно (2) по подразбиране изчаква 30 секунди между повторните опити и изтича след 1 час.",
+    "pushoverDesc2": "Ако желаете да изпратите известия до различни устройства, попълнете полето Устройство.",
+    "SMS Type": "SMS тип",
+    "octopushTypePremium": "Премиум (Бърз - препоръчителен в случай на тревога)",
+    "octopushTypeLowCost": "Евтин (Бавен - понякога бива блокиран от оператора)",
+    "checkPrice": "Тарифни планове на {0}:",
+    "octopushLegacyHint": "Дали използвате съвместима версия на Octopush (2011-2020) или нова версия?",
+    "Check octopush prices": "Тарифни планове на octopush {0}.",
+    "octopushPhoneNumber": "Телефонен номер (в международен формат, например: +33612345678) ",
+    "octopushSMSSender": "SMS подател Име: 3-11 знака - букви, цифри и интервал (a-zA-Z0-9)",
+    "LunaSea Device ID": "LunaSea ID на устройство",
+    "Apprise URL": "Apprise URL адрес",
+    "Example:": "Пример: {0}",
+    "Read more:": "Научете повече: {0}",
+    "Status:": "Статус: {0}",
+    "Read more": "Научете повече",
+    "appriseInstalled": "Apprise е инсталиран.",
+    "appriseNotInstalled": "Apprise не е инсталиран. {0}",
+    "Access Token": "Токен код за достъп",
+    "Channel access token": "Канал токен код",
+    "Line Developers Console": "Line - Конзола за разработчици",
+    "lineDevConsoleTo": "Line - Конзола за разработчици - {0}",
+    "Basic Settings": "Основни настройки",
+    "User ID": "Потребител ID",
+    "Messaging API": "API за съобщаване",
+    "wayToGetLineChannelToken": "Необходимо е първо да посетите {0}, за да създадете (Messaging API) за доставчик и канал, след което можете да вземете токен кода за канал и потребителско ID от споменатите по-горе елементи на менюто.",
+    "Icon URL": "URL адрес за иконка",
+    "aboutIconURL": "Можете да предоставите линк към картинка в поле \"URL Адрес за иконка\" за да отмените картинката на профила по подразбиране. Няма да се използва, ако вече сте настроили емотикон.",
+    "aboutMattermostChannelName": "Можете да замените канала по подразбиране, към който публикува уеб куката, като въведете името на канала в полето \"Канал име\". Трябва да бъде активирано в настройките за уеб кука на Mattermost. Например: #other-channel",
+    "matrix": "Matrix",
+    "promosmsTypeEco": "SMS ECO - евтин, но бавен. Често е претоварен. Само за получатели от Полша.",
+    "promosmsTypeFlash": "SMS FLASH - Съобщението автоматично се показва на устройството на получателя. Само за получатели от Полша.",
+    "promosmsTypeFull": "SMS FULL - Високо ниво на SMS услуга. Можете да използвате Вашето име като подател (Необходимо е първо да регистрирате името). Надежден метод за съобщения тип тревога.",
+    "promosmsTypeSpeed": "SMS SPEED - Най-висок приоритет в системата. Много бърза и надеждна, но същевременно скъпа услуга. (Около два пъти по-висока цена в сравнение с SMS FULL).",
+    "promosmsPhoneNumber": "Телефонен номер (за получатели от Полша, можете да пропуснете въвеждането на код за населено място)",
+    "promosmsSMSSender": "SMS Подател име: Предварително регистрирано име или някое от имената по подразбиране: InfoSMS, SMS Info, MaxSMS, INFO, SMS",
+    "Feishu WebHookUrl": "Feishu URL адрес за уеб кука",
+    "matrixHomeserverURL": "Сървър URL адрес (започва с http(s):// и порт по желание)",
+    "Internal Room Id": "ID на вътрешна стая",
+    "matrixDesc1": "Можете да намерите \"ID на вътрешна стая\" в разширените настройки на стаята във вашия Matrix клиент. Примерен изглед: !QMdRCpUIfLwsfjxye6:home.server.",
+    "matrixDesc2": "Силно препоръчваме да създадете НОВ потребител и да НЕ използвате токен кодът на вашия личен Matrix потребител, т.к. той позволява пълен достъп до вашия акаунт и всички стаи към които сте се присъединили. Вместо това създайте нов потребител и го поканете само в стаята, където желаете да получавате известията. Токен код за достъп ще получите изпълнявайки {0}",
+    "Method": "Метод",
+    "Body": "Съобщение",
+    "Headers": "Хедъри",
+    "PushUrl": "Push URL адрес",
+    "HeadersInvalidFormat": "Заявените хедъри не са валидни JSON: ",
+    "BodyInvalidFormat": "Заявеното съобщение не е валиден JSON: ",
+    "Monitor History": "История на мониторите",
+    "clearDataOlderThan": "Ще се съхранява за {0} дни.",
+    "records": "записа",
+    "One record": "Един запис",
+    "steamApiKeyDescription": "За да мониторирате Steam Game Server се нуждаете от Steam Web-API ключ. Можете да регистрирате Вашия API ключ тук: ",
+    "clicksendsms": "ClickSend SMS",
+    "apiCredentials": "API удостоверяване",
+    "PasswordsDoNotMatch": "Паролите не съвпадат.",
+    "Current User": "Текущ потребител",
+    "recent": "Скорошни",
+    "shrinkDatabaseDescription": "Инициира \"VACUUM\" за \"SQLite\" база данни. Ако Вашата база данни е създадена след версия 1.10.0, \"AUTO_VACUUM\" функцията е активна и това действие не е нужно.",
+    "Done": "Готово",
+    "Info": "Информация",
+    "Security": "Сигурност",
+    "Steam API Key": "Steam API ключ",
+    "Shrink Database": "Редуцирай базата данни",
+    "Pick a RR-Type...": "Изберете вида на ресурсния запис за мониториране…",
+    "Pick Accepted Status Codes...": "Изберете статус кодове, които да се считат за успешен отговор…",
+    "Default": "По подразбиране",
+    "HTTP Options": "HTTP Опции",
+    "Create Incident": "Създаване на инцидент",
+    "Title": "Заглавие",
+    "Content": "Съдържание",
+    "Style": "Стил",
+    "info": "информация",
+    "warning": "предупреждение",
+    "danger": "опасност",
+    "primary": "основен",
+    "light": "светъл",
+    "dark": "тъмен",
+    "Post": "Публикувай",
+    "Please input title and content": "Моля, въведете заглавие и съдържание",
+    "Created": "Създаден",
+    "Last Updated": "Последно обновен",
+    "Unpin": "Откачи",
+    "Switch to Light Theme": "Превключи към светла тема",
+    "Switch to Dark Theme": "Превключи към тъмна тема",
+    "Show Tags": "Покажи етикети",
+    "Hide Tags": "Скрий етикети",
+    "Description": "Описание",
+    "No monitors available.": "Няма налични монитори.",
+    "Add one": "Добави един",
+    "No Monitors": "Няма монитори",
+    "Untitled Group": "Група без заглавие",
+    "Services": "Услуги",
+    "Discard": "Отмени",
+    "Cancel": "Отмени",
+    "Powered by": "Създадено чрез",
+    "serwersms": "SerwerSMS.pl",
+    "serwersmsAPIUser": "API Потребителско име (вкл. webapi_ prefix)",
+    "serwersmsAPIPassword": "API Парола",
+    "serwersmsPhoneNumber": "Телефон номер",
+    "serwersmsSenderName": "SMS Подател име (регистриран през клиентския портал)",
+    "stackfield": "Stackfield",
+    "smtpDkimSettings": "DKIM Настройки",
+    "smtpDkimDesc": "Моля, вижте {0} на Nodemailer DKIM за инструкции.",
+    "documentation": "документацията",
+    "smtpDkimDomain": "Домейн",
+    "smtpDkimKeySelector": "Селектор на ключ",
+    "smtpDkimPrivateKey": "Частен ключ",
+    "smtpDkimHashAlgo": "Хеш алгоритъм (по желание)",
+    "smtpDkimheaderFieldNames": "Хедър ключове за подписване (по желание)",
+    "smtpDkimskipFields": "Хедър ключове, които да не се подписват (по желание)",
+    "PushByTechulus": "Push от Techulus",
+    "GoogleChat": "Google Chat (Само за работното пространство на Google)",
+    "gorush": "Gorush",
+    "alerta": "Alerta",
+    "alertaApiEndpoint": "Крайна точка на API",
+    "alertaEnvironment": "Среда",
+    "alertaApiKey": "API Ключ",
+    "alertaAlertState": "Състояние на тревога",
+    "alertaRecoverState": "Състояние на възстановяване",
+    "deleteStatusPageMsg": "Сигурни ли сте, че желаете да изтриете тази статус страница?",
+    "Proxies": "Прокси",
+    "default": "По подразбиране",
+    "enabled": "Активирано",
+    "setAsDefault": "Зададен по подразбиране",
+    "deleteProxyMsg": "Сигурни ли сте, че желаете да изтриете това прокси за всички монитори?",
+    "proxyDescription": "За да функционират трябва да бъдат зададени към монитор.",
+    "enableProxyDescription": "Това прокси няма да има ефект върху заявките за мониторинг, докато не бъде активирано. Можете да контролирате временното деактивиране на проксито от всички монитори чрез статуса на активиране.",
+    "setAsDefaultProxyDescription": "Това прокси ще бъде активно по подразбиране за новите монитори. Можете да го изключвате отделно за всеки един монитор.",
+    "Certificate Chain": "Верига на сертификата",
+    "Valid": "Валиден",
+    "Invalid": "Невалиден",
+    "AccessKeyId": "ID на ключ за достъп",
+    "SecretAccessKey": "Тайна на ключа за достъп",
+    "PhoneNumbers": "Телефонни номера",
+    "TemplateCode": "Шаблон Код",
+    "SignName": "Знак име",
+    "Sms template must contain parameters: ": "SMS шаблонът трябва да съдържа следните параметри: ",
+    "Bark Endpoint": "Bark крайна точка",
+    "WebHookUrl": "URL адрес на уеб кука",
+    "SecretKey": "Таен ключ",
+    "For safety, must use secret key": "За сигурност, трябва да се използва таен ключ",
+    "Device Token": "Токен за устройство",
+    "Platform": "Платформа",
+    "iOS": "iOS",
+    "Android": "Android",
+    "Huawei": "Huawei",
+    "High": "Висок",
+    "Retry": "Повтори",
+    "Topic": "Тема",
+    "WeCom Bot Key": "WeCom бот ключ",
+    "Setup Proxy": "Настрой прокси",
+    "Proxy Protocol": "Прокси протокол",
+    "Proxy Server": "Прокси сървър",
+    "Proxy server has authentication": "Прокси сървърът е с удостоверяване",
+    "User": "Потребител",
+    "Installed": "Инсталиран",
+    "Not installed": "Не е инсталиран",
+    "Running": "Работи",
+    "Not running": "Не работи",
+    "Remove Token": "Премахни токен",
+    "Start": "Стартирай",
+    "Stop": "Спри",
+    "Uptime Kuma": "Uptime Kuma",
+    "Add New Status Page": "Добави нова статус страница",
+    "Slug": "Слъг",
+    "Accept characters:": "Приеми символи:",
+    "startOrEndWithOnly": "Започва или завършва само с {0}",
+    "No consecutive dashes": "Без последователни тирета",
+    "Next": "Следващ",
+    "The slug is already taken. Please choose another slug.": "Този слъг вече се използва. Моля изберете друг.",
+    "No Proxy": "Без прокси",
+    "Authentication": "Удостоверяване",
+    "HTTP Basic Auth": "HTTP основно удостоверяване",
+    "New Status Page": "Нова статус страница",
+    "Page Not Found": "Страницата не е открита",
+    "Reverse Proxy": "Ревърс прокси",
+    "Backup": "Архивиране",
+    "About": "Относно",
+    "wayToGetCloudflaredURL": "(Свалете \"cloudflared\" от {0})",
+    "cloudflareWebsite": "Cloudflare уеб сайт",
+    "Message:": "Съобщение:",
+    "Don't know how to get the token? Please read the guide:": "Не знаете как да вземете токен? Моля, прочетете ръководството:",
+    "The current connection may be lost if you are currently connecting via Cloudflare Tunnel. Are you sure want to stop it? Type your current password to confirm it.": "Текущата връзка може да прекъсне ако в момента сте свързани чрез \"Cloudflare Tunnel\". Сигурни ли сте, че желаете да го спрете? Моля, въведете Вашата текуща парола за да потвърдите.",
+    "Other Software": "Друг софтуер",
+    "For example: nginx, Apache and Traefik.": "Например: Nginx, Apache и Traefik.",
+    "Please read": "Моля, прочетете",
+    "Subject:": "Тема:",
+    "Valid To:": "Валиден до:",
+    "Days Remaining:": "Оставащи дни:",
+    "Issuer:": "Издател:",
+    "Fingerprint:": "Пръстов отпечатък:",
+    "No status pages": "Няма статус страници",
+    "topic": "Тема",
+    "topicExplanation": "MQTT тема за мониториране",
+    "successMessage": "Съобщение при успех",
+    "successMessageExplanation": "MQTT съобщение, което ще бъде считано за успех",
+    "Customize": "Персонализирай",
+    "Custom Footer": "Персонализиран долен колонтитул",
+    "Custom CSS": "Потребителски CSS",
+    "Domain Name Expiry Notification": "Известие при изтичащ домейн",
+    "Proxy": "Прокси",
+    "Date Created": "Дата на създаване",
+    "onebotHttpAddress": "OneBot HTTP адрес",
+    "onebotMessageType": "OneBot тип съобщение",
+    "onebotGroupMessage": "Група",
+    "onebotPrivateMessage": "Лично",
+    "onebotUserOrGroupId": "Група/Потребител ID",
+    "onebotSafetyTips": "С цел безопасност трябва да зададете токен код за достъп",
+    "PushDeer Key": "PushDeer ключ",
+    "Footer Text": "Текст долен колонтитул",
+    "Show Powered By": "Покажи \"Създадено чрез\"",
+    "Domain Names": "Домейни",
+    "signedInDisp": "Вписан като {0}",
+    "signedInDispDisabled": "Удостоверяването е изключено.",
+    "Certificate Expiry Notification": "Известие за изтичане валидността на сертификата",
+    "API Username": "API Потребител",
+    "API Key": "API Ключ",
+    "Recipient Number": "Номер на получателя",
+    "From Name/Number": "От Име/Номер",
+    "Leave blank to use a shared sender number.": "Оставете празно, за да използвате споделен номер на подател.",
+    "Octopush API Version": "Octopush API версия",
+    "Legacy Octopush-DM": "Octopush-DM старa версия",
+    "endpoint": "крайна точка",
+    "octopushAPIKey": "\"API ключ\" от HTTP API удостоверяване в контролния панел",
+    "octopushLogin": "\"Вписване\" от HTTP API удостоверяване в контролния панел",
+    "promosmsLogin": "API Потребителско име",
+    "promosmsPassword": "API Парола",
+    "pushoversounds pushover": "Pushover (по подразбиране)",
+    "pushoversounds bike": "Велосипед",
+    "pushoversounds bugle": "Тромпет",
+    "pushoversounds cashregister": "Касов апарат",
+    "pushoversounds classical": "Класическа музика",
+    "pushoversounds cosmic": "Космически",
+    "pushoversounds falling": "Падащ",
+    "pushoversounds gamelan": "Игра в мрежа",
+    "pushoversounds incoming": "Входящ",
+    "pushoversounds intermission": "Прекъсване",
+    "pushoversounds magic": "Магия",
+    "pushoversounds mechanical": "Механичен",
+    "pushoversounds pianobar": "Пиано бар",
+    "pushoversounds siren": "Сирена",
+    "pushoversounds spacealarm": "Космическа аларма",
+    "pushoversounds tugboat": "Буксир",
+    "pushoversounds alien": "Извънземна аларма (дълъг)",
+    "pushoversounds climb": "Изкачване (дълъг)",
+    "pushoversounds persistent": "Постоянен (дълъг)",
+    "pushoversounds echo": "Pushover ехо (дълъг)",
+    "pushoversounds updown": "Горе долу (дълъг)",
+    "pushoversounds vibrate": "Само вибрация",
+    "pushoversounds none": "Без (тих)",
+    "pushyAPIKey": "Таен API ключ",
+    "pushyToken": "Токен на устройство",
+    "Show update if available": "Покажи актуализация, ако е налична",
+    "Also check beta release": "Проверявай и за бета версии",
+    "Using a Reverse Proxy?": "Използвате ревърс прокси?",
+    "Check how to config it for WebSocket": "Проверете как да го конфигурирате за WebSocket",
+    "Steam Game Server": "Steam Game сървър",
+    "Most likely causes:": "Най-вероятни причини:",
+    "The resource is no longer available.": "Ресурсът вече не е наличен.",
+    "There might be a typing error in the address.": "Възможно е да е допусната грешка при изписването на адреса.",
+    "What you can try:": "Какво можете да опитате:",
+    "Retype the address.": "Повторно въвеждане на адреса.",
+    "Go back to the previous page.": "Да се върнете към предишната страница.",
+    "Coming Soon": "Очаквайте скоро",
+    "wayToGetClickSendSMSToken": "Можете да получите API потребителско име и API ключ от {0} .",
+    "dnsPortDescription": "DNS порт на сървъра. По подразбиране е 53. Можете да го промените по всяко време.",
+    "error": "грешка",
+    "critical": "критично",
+    "wayToGetPagerDutyKey": "Можете да го получите като посетите Service -> Service Directory -> (Select a service) -> Integrations -> Add integration. Тук трябва да потърсите \"Events API V2\". Повече информация {0}",
+    "Integration Key": "Ключ за интегриране",
+    "Integration URL": "URL адрес за интеграция",
+    "Auto resolve or acknowledged": "Автоматично разрешаване или потвърждаване",
+    "do nothing": "не прави нищо",
+    "auto acknowledged": "автоматично потвърждаване",
+    "auto resolve": "автоматично разрешаване",
+    "Connection String": "Стринг за връзка",
+    "Query": "Заявка",
+    "settingsCertificateExpiry": "Изтичане валидността на TLS сертификата",
+    "certificationExpiryDescription": "HTTPS мониторите ще задействат известие, ако е наличен изтичащ TLS сертификат, през следващите:",
+    "ntfy Topic": "ntfy Тема",
+    "Domain": "Домейн",
+    "Workstation": "Работна станция",
+    "disableCloudflaredNoAuthMsg": "Тъй като сте в режим \"No Auth mode\", парола не се изисква.",
+    "wayToGetLineNotifyToken": "Можете да получите токен код за достъп от {0}",
+    "resendEveryXTimes": "Изпращай повторно на всеки {0} пъти",
+    "resendDisabled": "Повторното изпращане е изключено",
+    "Resend Notification if Down X times consecutively": "Повторно изпращане на известие, ако е недостъпен X пъти последователно",
+    "Bark Group": "Bark група",
+    "Bark Sound": "Bark звук",
+    "HTTP Headers": "HTTP хедъри",
+    "Trust Proxy": "Доверено Proxy",
+    "HomeAssistant": "Home Assistant",
+    "RadiusSecret": "Radius таен код",
+    "RadiusSecretDescription": "Споделен таен код между клиент и сървър",
+    "RadiusCalledStationId": "Повиквана станция ID",
+    "RadiusCalledStationIdDescription": "Идентификатор на повикваното устройство",
+    "RadiusCallingStationId": "Повикваща станция ID",
+    "RadiusCallingStationIdDescription": "Идентификатор на повикващото устройство",
+    "Setup Docker Host": "Настройка на Docker хост",
+    "Connection Type": "Тип свързване",
+    "Docker Daemon": "Docker демон",
+    "deleteDockerHostMsg": "Сигурни ли сте, че желаете да изтриете този Docker хост за всички монитори?",
+    "socket": "Сокет",
+    "tcp": "TCP / HTTP",
+    "Docker Container": "Docker контейнер",
+    "Container Name / ID": "Име на контейнер / ID",
+    "Docker Host": "Docker хост",
+    "Docker Hosts": "Docker хостове",
+    "trustProxyDescription": "Доверяване на 'X-Forwarded-*' хедърите. В случай, че желаете да получавате реалния IP адрес на клиента и Uptime Kuma е зад системи като Nginx или Apache, трябва да разрешите тази опция.",
+    "Examples": "Примери",
+    "Home Assistant URL": "Home Assistant URL адрес",
+    "Long-Lived Access Token": "Long-Lived токен за достъп",
+    "Long-Lived Access Token can be created by clicking on your profile name (bottom left) and scrolling to the bottom then click Create Token. ": "Long-Lived Access Token можете да създадете, като кликнете върху името на профила си (долу ляво) и превъртите до най-долу, след това кликнете върху Създаване на токен. ",
+    "Notification Service": "Услуга за известяване",
+    "default: notify all devices": "по подразбиране: извести всички устройства",
+    "A list of Notification Services can be found in Home Assistant under \"Developer Tools > Services\" search for \"notification\" to find your device/phone name.": "Списък с услугите за известяване може да бъде намерен в Home Assistant под \"Developer Tools > Services\", там потърсете \"notification\", за да намерите името на вашето устройство/телефон.",
+    "Automations can optionally be triggered in Home Assistant:": "Автоматизациите могат да се задействат при нужда в Home Assistant:",
+    "Trigger type:": "Задействане тип:",
+    "Event type:": "Събитие тип:",
+    "Event data:": "Събитие данни:",
+    "Then choose an action, for example switch the scene to where an RGB light is red.": "След което изберете действие, например да превключите сцената, където RGB светлината е червена.",
+    "Frontend Version": "Фронтенд версия",
+    "Frontend Version do not match backend version!": "Фронтенд версията не съвпада с Бекенд версията!",
+    "Base URL": "Базов URL адрес",
+    "goAlertInfo": "GoAlert е приложение с отворен код за планиране на повиквания, автоматизирани ескалации и известия (като SMS или гласови повиквания). Автоматично ангажирайте точния човек, по точния начин и в точното време! {0}",
+    "goAlertIntegrationKeyInfo": "Вземете общ API интеграционен ключ за услугата във формат \"aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee\" обикновено стойността на параметъра token на копирания URL адрес.",
+    "goAlert": "GoAlert",
+    "backupOutdatedWarning": "Отпаднала: Тъй като са добавени много функции, тази опция за архивиране не е достатъчно поддържана и не може да генерира или възстанови пълен архив.",
+    "backupRecommend": "Вместо това моля, архивирайте директно дяла или папката (./data/).",
+    "Maintenance": "Поддръжка",
+    "statusMaintenance": "Поддръжка",
+    "Schedule maintenance": "Планиране на поддръжка",
+    "Affected Monitors": "Засегнати монитори",
+    "Pick Affected Monitors...": "Изберете засегнатите монитори…",
+    "Start of maintenance": "Стартирай поддръжка",
+    "All Status Pages": "Всички статус страници",
+    "Select status pages...": "Изберете статус страници…",
+    "recurringIntervalMessage": "Изпълнявай ежедневно | Изпълнявай всеки {0} дни",
+    "affectedMonitorsDescription": "Изберете монитори, засегнати от текущата поддръжка",
+    "affectedStatusPages": "Покажи това съобщение за поддръжка на избрани статус страници",
+    "atLeastOneMonitor": "Изберете поне един засегнат монитор",
+    "deleteMaintenanceMsg": "Сигурни ли сте, че желаете да изтриете тази поддръжка?",
+    "Optional": "По желание",
+    "squadcast": "Squadcast",
+    "SendKey": "SendKey",
+    "SMSManager API Docs": "SMSManager API Документация ",
+    "Gateway Type": "Тип на шлюза",
+    "SMSManager": "SMSManager",
+    "You can divide numbers with": "Можете да разделяте числата с",
+    "or": "или",
+    "recurringInterval": "Интервал",
+    "Recurring": "Повтаряне",
+    "strategyManual": "Активен/Неактивен ръчно",
+    "warningTimezone": "Използва се часовата зона на сървъра",
+    "weekdayShortMon": "Пон",
+    "weekdayShortTue": "Вт",
+    "weekdayShortWed": "Ср",
+    "weekdayShortThu": "Чет",
+    "weekdayShortFri": "Пет",
+    "weekdayShortSat": "Съб",
+    "weekdayShortSun": "Нед",
+    "dayOfWeek": "Ден",
+    "dayOfMonth": "Дата",
+    "lastDay": "Последен ден",
+    "lastDay1": "Последен ден от месеца",
+    "lastDay2": "2-ри последен ден на месеца",
+    "lastDay3": "3-ти последен ден на месеца",
+    "lastDay4": "4-ти последен ден на месеца",
+    "No Maintenance": "Няма поддръжка",
+    "pauseMaintenanceMsg": "Сигурни ли сте, че желаете да направите пауза?",
+    "maintenanceStatus-under-maintenance": "В режим поддръжка",
+    "maintenanceStatus-inactive": "Неактивна",
+    "maintenanceStatus-scheduled": "Планирана",
+    "maintenanceStatus-ended": "Приключена",
+    "maintenanceStatus-unknown": "Неизвестна",
+    "Display Timezone": "Покажи часова зона",
+    "Server Timezone": "Часова зона на сървъра",
+    "statusPageMaintenanceEndDate": "Край",
+    "enableGRPCTls": "Разреши изпращане на gRPC заявка с TLS връзка",
+    "grpcMethodDescription": "Името на метода се форматира в \"cammelCase\", например sayHello, check, и т.н.",
+    "smseagle": "SMSEagle",
+    "smseagleTo": "Тел. номер(а)",
+    "smseagleGroup": "Име на група/и от тел. указател",
+    "smseagleContact": "Име(на) от тел. указател",
+    "smseagleRecipientType": "Получател тип",
+    "smseagleRecipient": "Получател(и) (при повече от един разделете със запетая)",
+    "smseagleToken": "API токен за достъп",
+    "smseagleUrl": "Вашият SMSEagle URL на устройството",
+    "smseagleEncoding": "Изпрати като Unicode",
+    "smseaglePriority": "Приоритет на съобщението (0-9, по подразбиране = 0)",
+    "IconUrl": "Икона URL адрес",
+    "webhookAdditionalHeadersTitle": "Допълнителни хедъри",
+    "webhookAdditionalHeadersDesc": "Задава допълнителни хедъри, изпратени с уеб куката.",
+    "Enable DNS Cache": "Активирай DNS кеширане",
+    "Enable": "Активирай",
+    "Disable": "Деактивирай",
+    "dnsCacheDescription": "Възможно е да не работи в IPv6 среда - деактивирайте, ако срещнете проблеми.",
+    "Single Maintenance Window": "Единичен времеви интервал за поддръжка",
+    "Maintenance Time Window of a Day": "Времеви интервал от деня за поддръжка",
+    "Effective Date Range": "Интервал от дни на влизане в сила",
+    "Schedule Maintenance": "Планирай поддръжка",
+    "Date and Time": "Дата и час",
+    "DateTime Range": "Изтрий времеви интервал",
+    "Strategy": "Стратегия",
+    "Free Mobile User Identifier": "Free Mobile потребителски идентификатор",
+    "Free Mobile API Key": "Free Mobile API ключ",
+    "Enable TLS": "Активирай TLS",
+    "Proto Service Name": "Proto име на услугата",
+    "Proto Method": "Proto метод",
+    "Proto Content": "Proto съдържание",
+    "Economy": "Икономичен",
+    "Lowcost": "Евтин",
+    "high": "висок",
+    "General Monitor Type": "Общ тип монитор",
+    "Passive Monitor Type": "Пасивет тип монитор",
+    "Specific Monitor Type": "Специфичен тип монитор",
+    "ZohoCliq": "ZohoCliq",
+    "wayToGetZohoCliqURL": "Можете да научите как се създава URL адрес за уеб кука {0}.",
+    "Kook": "Kook",
+    "wayToGetKookBotToken": "Създайте приложение и вземете вашия бот токен на {0}",
+    "wayToGetKookGuildID": "Превключете в 'Developer Mode' в 'Kook' настройките, след което десен клик върху 'guild' за да вземете неговото 'ID'",
+    "Guild ID": "Guild ID",
+    "Help": "Помощ",
+    "Game": "Игра",
+    "Custom": "Потребителски",
+    "infiniteRetention": "Задайте стойност 0 за безкрайно съхранение.",
+    "Monitor": "Монитор | Монитори",
+    "dataRetentionTimeError": "Периодът на съхранение трябва да е 0 или по-голям",
+    "confirmDeleteTagMsg": "Сигурни ли сте, че желаете да изтриете този таг? Мониторите, свързани с него, няма да бъдат изтрити.",
+    "promosmsAllowLongSMS": "Позволи дълъг SMS",
+    "Packet Size": "Размер на пакет",
+    "Custom Monitor Type": "Потребителски тип монитор",
+    "loadingError": "Данните не могат да бъдат изтеглени. Моля, опитайте отново по-късно.",
+    "plugin": "Плъгин | Плъгини",
+    "install": "Инсталирай",
+    "installing": "Инсталиране",
+    "uninstall": "Деинсталирай",
+    "uninstalling": "Деинсталиране",
+    "confirmUninstallPlugin": "Сигурни ли сте, че желаете да деинсталирате този плъгин?",
+    "markdownSupported": "Поддържа се Markdown синтаксис",
+    "Google Analytics ID": "Google Analytics ID",
+    "Edit Tag": "Редактиране на таг",
+    "Learn More": "Научете повече",
+    "Server Address": "Сървър адрес"
+}
diff --git a/src/lang/cs-CZ.json b/src/lang/cs-CZ.json
new file mode 100644
index 000000000..dc8e26373
--- /dev/null
+++ b/src/lang/cs-CZ.json
@@ -0,0 +1,700 @@
+{
+    "languageName": "Czech",
+    "checkEverySecond": "Kontrolovat každých {0} sekund",
+    "retryCheckEverySecond": "Opakovat každých {0} sekund",
+    "resendEveryXTimes": "Znovu zaslat {0}krát",
+    "resendDisabled": "Opakované zasílání je vypnuté",
+    "retriesDescription": "Maximální počet pokusů před označením služby jako nedostupné a odesláním oznámení",
+    "ignoreTLSError": "Ignorovat TLS/SSL chyby na HTTPS stránkách",
+    "upsideDownModeDescription": "Pomocí této možnosti změníte způsob vyhodnocování stavu. Pokud je služba dosažitelná, je NEDOSTUPNÁ.",
+    "maxRedirectDescription": "Maximální počet přesměrování, která se mají následovat. Nastavením hodnoty 0 zakážete přesměrování.",
+    "enableGRPCTls": "Umožnit odeslání gRPC žádosti během TLS spojení",
+    "grpcMethodDescription": "Název metody se převede do cammelCase formátu jako je sayHello, check, aj.",
+    "acceptedStatusCodesDescription": "Vyberte stavové kódy, které jsou považovány za úspěšnou odpověď.",
+    "Maintenance": "Údržba",
+    "statusMaintenance": "Údržba",
+    "Schedule maintenance": "Naplánovat údržbu",
+    "Affected Monitors": "Dotčené dohledy",
+    "Pick Affected Monitors...": "Vyberte dotčené dohledy…",
+    "Start of maintenance": "Zahájit údržbu",
+    "All Status Pages": "Všechny stavové stránky",
+    "Select status pages...": "Vyberte stavovou stránku…",
+    "recurringIntervalMessage": "Spustit jednou každý den | Spustit jednou každých {0} dní",
+    "affectedMonitorsDescription": "Vyberte dohledy, které budou ovlivněny touto údržbou",
+    "affectedStatusPages": "Zobrazit tuto zprávu o údržbě na vybraných stavových stránkách",
+    "atLeastOneMonitor": "Vyberte alespoň jeden dotčený dohled",
+    "passwordNotMatchMsg": "Hesla se neshodují.",
+    "notificationDescription": "Pro zajištění funkčnosti oznámení je nutné jej přiřadit dohledu.",
+    "keywordDescription": "Vyhledat klíčové slovo v prosté odpovědi HTML nebo JSON. Při hledání se rozlišuje velikost písmen.",
+    "pauseDashboardHome": "Pozastaveno",
+    "deleteMonitorMsg": "Opravdu chcete odstranit tento dohled?",
+    "deleteMaintenanceMsg": "Opravdu chcete odstranit tuto údržbu?",
+    "deleteNotificationMsg": "Opravdu chcete odstranit toto oznámení pro všechny dohledy?",
+    "dnsPortDescription": "Port DNS serveru. Standardně běží na portu 53. V případě potřeby jej můžete kdykoli změnit.",
+    "resolverserverDescription": "Cloudflare je výchozí server. V případě potřeby můžete Resolver server kdykoli změnit.",
+    "rrtypeDescription": "Vyberte typ záznamu o prostředku, který chcete monitorovat",
+    "pauseMonitorMsg": "Opravdu chcete dohled pozastavit?",
+    "enableDefaultNotificationDescription": "Toto oznámení bude standardně aktivní pro nové dohledy. V případě potřeby můžete oznámení stále zakázat na úrovni jednotlivých dohledů.",
+    "clearEventsMsg": "Opravdu chcete odstranit všechny události pro tento dohled?",
+    "clearHeartbeatsMsg": "Opravdu chcete odstranit všechny heartbeaty pro tento dohled?",
+    "confirmClearStatisticsMsg": "Opravdu chcete smazat VŠECHNY statistiky?",
+    "importHandleDescription": "Možnost 'Přeskočit existující' vyberte v případě, že chcete přeskočit všechny dohledy nebo oznámení se stejným názvem. Vybráním možnosti 'Přepsat' dojde k odstranění všech existujících dohledů a oznámení.",
+    "confirmImportMsg": "Opravdu chcete importovat zálohu? Prosím ověřte, zda jste vybrali správnou možnost importu.",
+    "twoFAVerifyLabel": "Prosím, zadejte svůj token pro ověření 2FA:",
+    "tokenValidSettingsMsg": "Token je platný! Nyní můžete uložit nastavení 2FA.",
+    "confirmEnableTwoFAMsg": "Opravdu chcete zapnout 2FA?",
+    "confirmDisableTwoFAMsg": "Opravdu chcete deaktivovat 2FA?",
+    "Settings": "Nastavení",
+    "Dashboard": "Nástěnka",
+    "New Update": "Nová aktualizace",
+    "Language": "Jazyk",
+    "Appearance": "Vzhled",
+    "Theme": "Motiv",
+    "General": "Obecné",
+    "Primary Base URL": "Primární URL adresa",
+    "Version": "Verze",
+    "Check Update On GitHub": "Zkontrolovat aktualizace na GitHubu",
+    "List": "Seznam",
+    "Add": "Přidat",
+    "Add New Monitor": "Přidat nový dohled",
+    "Quick Stats": "Rychlý přehled",
+    "Up": "Běží",
+    "Down": "Nedostupný",
+    "Pending": "Čekám",
+    "Unknown": "Neznámý",
+    "Pause": "Pauza",
+    "Name": "Název",
+    "Status": "Stav",
+    "DateTime": "Časové razítko",
+    "Message": "Zpráva",
+    "No important events": "Žádné důležité události",
+    "Resume": "Pokračovat",
+    "Edit": "Změnit",
+    "Delete": "Vymazat",
+    "Current": "Aktuální",
+    "Uptime": "Doba provozu",
+    "Cert Exp.": "Platnost certifikátu",
+    "Monitor": "Dohled | Dohledy",
+    "day": "den | dny/í",
+    "-day": "-dní",
+    "hour": "hodina",
+    "-hour": "-hodin",
+    "Response": "Odpověď",
+    "Ping": "Ping",
+    "Monitor Type": "Typ dohledu",
+    "Keyword": "Klíčové slovo",
+    "Friendly Name": "Obecný název",
+    "URL": "URL",
+    "Hostname": "Adresa serveru",
+    "Port": "Port",
+    "Heartbeat Interval": "Heartbeat interval",
+    "Retries": "Počet pokusů",
+    "Heartbeat Retry Interval": "Interval opakování heartbeatu",
+    "Resend Notification if Down X times consecutively": "Zaslat oznámení znovu, pokud je služba nedostupná Xkrát za sebou",
+    "Advanced": "Rozšířené",
+    "Upside Down Mode": "Inverzní režim",
+    "Max. Redirects": "Max. přesměrování",
+    "Accepted Status Codes": "Akceptované stavové kódy",
+    "Push URL": "Push URL",
+    "needPushEvery": "Tuto URL adresu byste měli volat každých {0} sekund.",
+    "pushOptionalParams": "Volitelné parametry: {0}",
+    "Save": "Uložit",
+    "Notifications": "Oznámení",
+    "Not available, please setup.": "Není k dispozici, prosím nastavte.",
+    "Setup Notification": "Nastavení oznámení",
+    "Light": "Světlý",
+    "Dark": "Tmavý",
+    "Auto": "Automaticky",
+    "Theme - Heartbeat Bar": "Motiv – Heartbeat panel",
+    "Normal": "Normální",
+    "Bottom": "Dole",
+    "None": "Žádné",
+    "Timezone": "Časové pásmo",
+    "Search Engine Visibility": "Viditelnost pro vyhledávače",
+    "Allow indexing": "Povolit indexování",
+    "Discourage search engines from indexing site": "Zabránit vyhledávačům v indexování stránky",
+    "Change Password": "Změnit heslo",
+    "Current Password": "Aktuální heslo",
+    "New Password": "Nové heslo",
+    "Repeat New Password": "Znovu zadat nové heslo",
+    "Update Password": "Aktualizovat heslo",
+    "Disable Auth": "Deaktivovat ověřování",
+    "Enable Auth": "Povolit ověřování",
+    "disableauth.message1": "Opravdu chcete <strong>deaktivovat autentifikaci</strong>?",
+    "disableauth.message2": "Tato možnost je určena pro případy, kdy <strong>máte autentifikaci zajištěnou třetí stranou</strong> ještě před přístupem do Uptime Kuma, například prostřednictvím Cloudflare Access.",
+    "Please use this option carefully!": "Používejte ji prosím s rozmyslem!",
+    "Logout": "Odhlásit",
+    "Leave": "Odejít",
+    "I understand, please disable": "Rozumím, chci ji deaktivovat",
+    "Confirm": "Potvrzení",
+    "Yes": "Ano",
+    "No": "Ne",
+    "Username": "Uživatelské jméno",
+    "Password": "Heslo",
+    "Remember me": "Zapamatovat si mě",
+    "Login": "Přihlášení",
+    "No Monitors, please": "Žádné dohledy, prosím",
+    "add one": "přidat jeden",
+    "Notification Type": "Typ oznámení",
+    "Email": "E-mail",
+    "Test": "Test",
+    "Certificate Info": "Informace o certifikátu",
+    "Resolver Server": "Server Resolveru",
+    "Resource Record Type": "Typ záznamu o prostředku",
+    "Last Result": "Poslední výsledek",
+    "Create your admin account": "Vytvořit účet administrátora",
+    "Repeat Password": "Znovu zadat heslo",
+    "Import Backup": "Importovat zálohu",
+    "Export Backup": "Exportovat zálohu",
+    "Export": "Exportovat",
+    "Import": "Importovat",
+    "respTime": "Doba odezvy (ms)",
+    "notAvailableShort": "N/A",
+    "Default enabled": "Standardně povoleno",
+    "Apply on all existing monitors": "Použít pro všechny existující dohledy",
+    "Create": "Vytvořit",
+    "Clear Data": "Vymazat data",
+    "Events": "Události",
+    "Heartbeats": "Heartbeaty",
+    "Auto Get": "Získat automaticky",
+    "backupDescription": "Všechny dohledy a oznámení můžete zálohovat do souboru ve formátu JSON.",
+    "backupDescription2": "Poznámka: Nezahrnuje historii a data událostí.",
+    "backupDescription3": "Součástí exportovaného souboru jsou citlivá data jako tokeny oznámení; export si prosím bezpečně uložte.",
+    "alertNoFile": "Vyberte soubor, který chcete importovat.",
+    "alertWrongFileType": "Vyberte soubor ve formátu JSON.",
+    "Clear all statistics": "Vymazat všechny statistiky",
+    "Skip existing": "Přeskočit existující",
+    "Overwrite": "Přepsat",
+    "Options": "Možnosti",
+    "Keep both": "Ponechat obojí",
+    "Verify Token": "Ověřit token",
+    "Setup 2FA": "Nastavení 2FA",
+    "Enable 2FA": "Povolit 2FA",
+    "Disable 2FA": "Deaktivovat 2FA",
+    "2FA Settings": "Nastavení 2FA",
+    "Two Factor Authentication": "Dvoufaktorová autentifikace",
+    "Active": "Zapnuto",
+    "Inactive": "Neaktivní",
+    "Token": "Token",
+    "Show URI": "Zobrazit URI",
+    "Tags": "Štítky",
+    "Add New below or Select...": "Níže přidejte nový nebo vyberte existující…",
+    "Tag with this name already exist.": "Štítek s tímto názvem již existuje.",
+    "Tag with this value already exist.": "Štítek touto hodnotou již existuje.",
+    "color": "barva",
+    "value (optional)": "hodnota (volitelné)",
+    "Gray": "Šedá",
+    "Red": "Červená",
+    "Orange": "Oranžová",
+    "Green": "Zelená",
+    "Blue": "Modrá",
+    "Indigo": "Indigo",
+    "Purple": "Purpurová",
+    "Pink": "Růžová",
+    "Custom": "Vlastní",
+    "Search...": "Hledat…",
+    "Avg. Ping": "Průměr Ping",
+    "Avg. Response": "Průměr Odpověď",
+    "Entry Page": "Vstupní stránka",
+    "statusPageNothing": "Nic tady není, přidejte prosím skupinu nebo dohled.",
+    "No Services": "Žádné služby",
+    "All Systems Operational": "Všechny systémy běží",
+    "Partially Degraded Service": "Částečně zhoršená služba",
+    "Degraded Service": "Zhoršená služba",
+    "Add Group": "Přidat skupinu",
+    "Add a monitor": "Přidání dohledu",
+    "Edit Status Page": "Upravit stavovou stránku",
+    "Go to Dashboard": "Přejít na nástěnku",
+    "Status Page": "Stavová stránka",
+    "Status Pages": "Stavová stránka",
+    "defaultNotificationName": "Moje {notification} upozornění ({číslo})",
+    "here": "sem",
+    "Required": "Vyžadováno",
+    "telegram": "Telegram",
+    "ZohoCliq": "ZohoCliq",
+    "Bot Token": "Token bota",
+    "wayToGetTelegramToken": "Token můžete získat od {0}.",
+    "Chat ID": "ID chatu",
+    "supportTelegramChatID": "Podpora přímého chatu / skupiny / ID chatu kanálu",
+    "wayToGetTelegramChatID": "ID chatu můžete získat tak, že robotovi zašlete zprávu a přejdete na tuto adresu URL, kde zobrazíte chat_id:",
+    "YOUR BOT TOKEN HERE": "SEM ZADEJTE TOKEN VAŠEHO CHATBOTA",
+    "chatIDNotFound": "ID chatu nebylo nalezeno; nejprve tomuto robotovi zašlete zprávu",
+    "webhook": "Webhook",
+    "Post URL": "URL adresa příspěvku",
+    "Content Type": "Typ obsahu",
+    "webhookJsonDesc": "{0} je vhodný pro všechny moderní servery HTTP, jako je Express.js",
+    "webhookFormDataDesc": "{multipart} je vhodné pro PHP. JSON bude nutné analyzovat prostřednictvím {decodeFunction}",
+    "webhookAdditionalHeadersTitle": "Dodatečné hlavičky",
+    "webhookAdditionalHeadersDesc": "Nastavte dodatečné hlavičky, které se odešlou společně s webhookem.",
+    "smtp": "E-mail (SMTP)",
+    "secureOptionNone": "Žádné / STARTTLS (25, 587)",
+    "secureOptionTLS": "TLS (465)",
+    "Ignore TLS Error": "Ignorovat chybu TLS",
+    "From Email": "Odesílatel",
+    "emailCustomSubject": "Vlastní předmět",
+    "To Email": "Příjemce",
+    "smtpCC": "Kopie",
+    "smtpBCC": "Skrytá kopie",
+    "discord": "Discord",
+    "Discord Webhook URL": "URL Webhooku Discord",
+    "wayToGetDiscordURL": "Získáte tak, že přejdete do Nastavení serveru - > Integrace - > Zobrazi webhooky -> Nový webhook",
+    "Bot Display Name": "Zobrazované jméno robota",
+    "Prefix Custom Message": "Předpona vlastní zprávy",
+    "Hello @everyone is...": "Dobrý den, {'@'}všichni jsou…",
+    "teams": "Microsoft Teams",
+    "Webhook URL": "URL adresa webhooku",
+    "wayToGetTeamsURL": "Informace o tom, jak vytvořit URL adresu webhooku naleznete na {0}.",
+    "wayToGetZohoCliqURL": "Informace o tom, jak vytvořit URL adresu webhooku naleznete na {0}.",
+    "signal": "Signal",
+    "Number": "Číslo",
+    "Recipients": "Příjemci",
+    "needSignalAPI": "Musíte mít Signal klienta s REST API.",
+    "wayToCheckSignalURL": "Pro zobrazení instrukcí, jak službu nastavit, přejděte na následující adresu:",
+    "signalImportant": "Důležité: v seznamu příjemců není možné současně použít skupiny a čísla!",
+    "gotify": "Gotify",
+    "Application Token": "Token aplikace",
+    "Server URL": "URL adresa serveru",
+    "Priority": "Priorita",
+    "slack": "Slack",
+    "Icon Emoji": "Ikona smajlíka",
+    "Channel Name": "Název kanálu",
+    "Uptime Kuma URL": "Uptime Kuma URL",
+    "aboutWebhooks": "Více informací o Webhoocích naleznete na adrese: {0}",
+    "aboutChannelName": "Pro vynechání Webhook kanálu zadejte jeho název do pole Název kanálu {0}. Příklad: #jiny-kanal",
+    "aboutKumaURL": "Pokud ponecháte pole URL adresa Uptime Kuma prázdné, použije se domovská stránka GitHub projektu.",
+    "emojiCheatSheet": "Tahák smajlíků: {0}",
+    "rocket.chat": "Rocket.Chat",
+    "pushover": "Pushover",
+    "pushy": "Pushy",
+    "PushByTechulus": "Push od Techulus",
+    "octopush": "Octopush",
+    "promosms": "PromoSMS",
+    "clicksendsms": "ClickSend SMS",
+    "lunasea": "LunaSea",
+    "apprise": "Apprise (podpora více než 50 oznamovacích služeb)",
+    "GoogleChat": "Google Chat (pouze Google Workspace)",
+    "pushbullet": "Pushbullet",
+    "Kook": "Kook",
+    "wayToGetKookBotToken": "Aplikaci vytvoříte a token bota získáte na {0}",
+    "wayToGetKookGuildID": "V nastavení Kook aktivujte 'Vývojářský režim' a kliknutím pravým tlačítkem na guild získejte jeho ID",
+    "Guild ID": "Guild ID",
+    "line": "Line Messenger",
+    "mattermost": "Mattermost",
+    "User Key": "Klíč uživatele",
+    "Device": "Zařízení",
+    "Message Title": "Nadpis zprávy",
+    "Notification Sound": "Zvuk oznámení",
+    "More info on:": "Více informací naleznete na adrese: {0}",
+    "pushoverDesc1": "Výchozí časový limit pro emergency prioritu (2) je 30 sekund mezi opakovanými pokusy a vyprší po 1 hodině.",
+    "pushoverDesc2": "Pokud chcete odesílat oznámení do různých zařízení, vyplňte pole Zařízení.",
+    "SMS Type": "Typ SMS",
+    "octopushTypePremium": "Premium (rychlé – doporučeno pro upozornění)",
+    "octopushTypeLowCost": "Nízké náklady (pomalé – někdy blokované operátorem)",
+    "checkPrice": "Ceny {0} zjistíte na adrese:",
+    "apiCredentials": "API přihlašovací údaje",
+    "octopushLegacyHint": "Používáte starší verzi Octopush (2011-2020) nebo novou verzi?",
+    "Check octopush prices": "Ceny octopush naleznete na adrese {0}.",
+    "octopushPhoneNumber": "Telefonní číslo (v mezinárodním formátu, např: +42012345678) ",
+    "octopushSMSSender": "Odesílatel SMS: 3-11 alfanumerických znaků a mezera (a-zA-Z0-9)",
+    "LunaSea Device ID": "ID zařízení LunaSea",
+    "Apprise URL": "Apprise URL",
+    "Example:": "Příklad: {0}",
+    "Read more:": "Více informací: {0}",
+    "Status:": "Stav: {0}",
+    "Read more": "Více informací",
+    "appriseInstalled": "Apprise je nainstalován.",
+    "appriseNotInstalled": "Apprise není nainstalován. {0}",
+    "Access Token": "Přístupový token",
+    "Channel access token": "Přístupový token ke kanálu",
+    "Line Developers Console": "Konzole Line Developers",
+    "lineDevConsoleTo": "Konzole Line Developers - {0}",
+    "Basic Settings": "Obecné nastavení",
+    "User ID": "ID uživatele",
+    "Messaging API": "Messaging API",
+    "wayToGetLineChannelToken": "Nejprve otevřete {0}, vytvořte poskytovatele a kanál (Messaging API). Poté můžete získat přístupový token ke kanálu a ID uživatele, v sekci uvedené výše.",
+    "Icon URL": "URL adresa ikony",
+    "aboutIconURL": "Pro přepsání výchozího profilového obrázku můžete do pole \"URL adresa ikony\" zadat odkaz na obrázek. Nebude použito, pokud je nastavena ikona smajlíka.",
+    "aboutMattermostChannelName": "Výchozí kanál, do kterého jsou zasílány Webhook příspěvky, můžete přepsat zadáním názvu kanálu do pole \"Název kanálu\". Tato možnost musí být povolena v nastavení Mattermost Webhooku. Příklad: #jiny-kanal",
+    "matrix": "Matrix",
+    "promosmsTypeEco": "SMS ECO – levné, ale pomalé a často přetížené. Omezeno pouze na polské příjemce.",
+    "promosmsTypeFlash": "SMS FLASH –zpráva se automaticky zobrazí na zařízení příjemce. Omezeno pouze na polské příjemce.",
+    "promosmsTypeFull": "SMS FULL – prémiová úroveň SMS. Můžete definovat odesílatele (vyžadována registrace jména). Spolehlivý pro výstrahy.",
+    "promosmsTypeSpeed": "SMS SPEED – nejvyšší priorita v systému. Velmi rychlé a spolehlivé, ale nákladné (přibližně dvojnásobek ceny SMS FULL).",
+    "promosmsPhoneNumber": "Telefonní číslo (polští příjemci mohou vynechat telefonní předvolbu)",
+    "promosmsSMSSender": "Odesílatel SMS: Předem zaregistrovaný název nebo jeden z výchozích: InfoSMS, SMS Info, MaxSMS, INFO, SMS",
+    "promosmsAllowLongSMS": "Povolit dlouhé SMS",
+    "Feishu WebHookUrl": "URL Webhooku Feishu",
+    "matrixHomeserverURL": "URL adresa domácího serveru (s http(s):// a volitelně portem)",
+    "Internal Room Id": "ID interní místnosti",
+    "matrixDesc1": "ID interní místnosti naleznete v Matrix klientovi v rozšířeném nastavení místnosti. Mělo by být ve tvaru !QMdRCpUIfLwsfjxye6:home.server.",
+    "matrixDesc2": "Důrazně doporučujeme vytvořit nového uživatele a nepoužívat váš vlastní přístupový token uživatele Matrix. Pomocí něj je možné získat přístup k vašemu účtu a všem místnostem, ke kterým jste se připojili. Místo toho vytvořte nového uživatele a pozvěte jej pouze do místnosti, do které chcete oznámení dostávat. Přístupový token můžete získat spuštěním {0}",
+    "Method": "Metoda",
+    "Body": "Tělo",
+    "Headers": "Hlavičky",
+    "PushUrl": "Push URL",
+    "HeadersInvalidFormat": "Hlavičky žádosti nejsou platný JSON: ",
+    "BodyInvalidFormat": "Text žádosti není platný JSON: ",
+    "Monitor History": "Historie dohledu",
+    "clearDataOlderThan": "Historie dohledu bude uchovávána po dobu {0} dní.",
+    "PasswordsDoNotMatch": "Hesla se neshodují.",
+    "records": "záznamů",
+    "One record": "Jeden záznam",
+    "steamApiKeyDescription": "Pro monitorování Steam Game Serveru je nutné zadat Steam Web-API klíč. Svůj API klíč získáte na následující stránce: ",
+    "Current User": "Aktuálně přihlášený uživatel",
+    "topic": "Téma",
+    "topicExplanation": "MQTT téma, které chcete sledovat",
+    "successMessage": "Zpráva o úspěchu",
+    "successMessageExplanation": "MQTT zpráva považovaná za úspěšnou",
+    "recent": "Poslední",
+    "Done": "Hotovo",
+    "Info": "Informace",
+    "Security": "Bezpečnost",
+    "Steam API Key": "API klíč služby Steam",
+    "Shrink Database": "Zmenšit databázi",
+    "Pick a RR-Type...": "Vyberte typ RR záznamu…",
+    "Pick Accepted Status Codes...": "Vyberte stavové kódy, které chcete akceptovat…",
+    "Default": "Výchozí",
+    "HTTP Options": "Možnosti protokolu HTTP",
+    "Create Incident": "Vytvořit incident",
+    "Title": "Předmět",
+    "Content": "Obsah",
+    "Style": "Styl",
+    "info": "informace",
+    "warning": "upozornění",
+    "danger": "riziko",
+    "error": "chyba",
+    "critical": "kritické",
+    "primary": "primární",
+    "light": "světlý",
+    "dark": "tmavý",
+    "Post": "Publikovat",
+    "Please input title and content": "Zadejte prosím název a obsah",
+    "Created": "Vytvořen",
+    "Last Updated": "Poslední aktualizace",
+    "Unpin": "Odepnout",
+    "Switch to Light Theme": "Přepnout na světlý motiv",
+    "Switch to Dark Theme": "Přepnout na tmavý motiv",
+    "Show Tags": "Zobrazit štítky",
+    "Hide Tags": "Skrýt štítky",
+    "Description": "Popis",
+    "No monitors available.": "Není dostupný žádný dohled.",
+    "Add one": "Přidat jeden",
+    "No Monitors": "Žádný dohled",
+    "Untitled Group": "Skupina bez názvu",
+    "Services": "Služby",
+    "Discard": "Zahodit",
+    "Cancel": "Zrušit",
+    "Powered by": "Poskytuje",
+    "shrinkDatabaseDescription": "Pomocí této možnosti provedete příkaz VACUUM nad SQLite databází. Pokud byla databáze vytvořena po vydání verze 1.10.0, AUTO_VACUUM je již povolena a tato akce není vyžadována.",
+    "serwersms": "SerwerSMS.pl",
+    "serwersmsAPIUser": "API uživatelské jméno (včetně předpony webapi_)",
+    "serwersmsAPIPassword": "API heslo",
+    "serwersmsPhoneNumber": "Telefonní číslo",
+    "serwersmsSenderName": "Odesílatel SMS (registrováno prostřednictvím zákaznického portálu)",
+    "smseagle": "SMSEagle",
+    "smseagleTo": "Telefonní číslo(a)",
+    "smseagleGroup": "Název skupiny v adresáři",
+    "smseagleContact": "Název kontaktu v adresáři",
+    "smseagleRecipientType": "Typ příjemce",
+    "smseagleRecipient": "Příjemce(i) (více záznamů oddělte čárkou)",
+    "smseagleToken": "API přístupový token",
+    "smseagleUrl": "URL vašeho SMSEagle zařízení",
+    "smseagleEncoding": "Odeslat v Unicode",
+    "smseaglePriority": "Priorita zprávy (0-9, výchozí = 0)",
+    "stackfield": "Stackfield",
+    "Customize": "Přizpůsobit",
+    "Custom Footer": "Vlastní patička",
+    "Custom CSS": "Vlastní CSS",
+    "smtpDkimSettings": "Nastavení DKIM",
+    "smtpDkimDesc": "Informace o použití naleznete v {0} Nodemailer DKIM.",
+    "documentation": "dokumentaci",
+    "smtpDkimDomain": "Název domény",
+    "smtpDkimKeySelector": "Selektor klíče",
+    "smtpDkimPrivateKey": "Privátní klíč",
+    "smtpDkimHashAlgo": "Hashovací algoritmus (volitelné)",
+    "smtpDkimheaderFieldNames": "Podepisovat tyto hlavičky (volitelné)",
+    "smtpDkimskipFields": "Nepodepisovat tyto hlavičky (volitelné)",
+    "wayToGetPagerDutyKey": "Získat jej můžete v sekci Service -> Service Directory -> (vyberte službu) -> Integrations -> Add integration. Následně vyhledejte \"Events API V2\". Více informace naleznete na adrese {0}",
+    "Integration Key": "Integrační klíč",
+    "Integration URL": "Integrační URL",
+    "Auto resolve or acknowledged": "Automatické řešení nebo potvrzení",
+    "do nothing": "nedělat nic",
+    "auto acknowledged": "automaticky uznáno",
+    "auto resolve": "automatické řešení",
+    "gorush": "Gorush",
+    "alerta": "Alerta",
+    "alertaApiEndpoint": "API Endpoint",
+    "alertaEnvironment": "Prostředí",
+    "alertaApiKey": "API klíč",
+    "alertaAlertState": "Stav upozornění",
+    "alertaRecoverState": "Stav obnovení",
+    "deleteStatusPageMsg": "Opravdu chcete odstranit tuto stavovou stránku?",
+    "Proxies": "Proxy",
+    "default": "Výchozí",
+    "enabled": "Zapnuto",
+    "setAsDefault": "Nastavit jako výchozí",
+    "deleteProxyMsg": "Opravdu chcete odstranit tuto proxy ze všech dohledů?",
+    "proxyDescription": "Pro zajištění funkčnosti musí být proxy přiřazena dohledům.",
+    "enableProxyDescription": "Tato proxy neovlivní žádosti dohledu do doby, než ji aktivujete. Změnou tohoto nastavení dočasně zakážete použití proxy ve všech dohledech.",
+    "setAsDefaultProxyDescription": "Tato proxy se použije pro všechny nové dohledy. V případě potřeby můžete její využívání zakázat v konkrétním dohledu.",
+    "Certificate Chain": "Řetězec certifikátu",
+    "Valid": "Platný",
+    "Invalid": "Neplatný",
+    "AccessKeyId": "ID přístupového klíče",
+    "SecretAccessKey": "Tajemství přístupového klíče",
+    "PhoneNumbers": "Telefonní čísla",
+    "TemplateCode": "TemplateCode",
+    "SignName": "SignName",
+    "Sms template must contain parameters: ": "Šablona SMS musí obsahovat parametry: ",
+    "Bark Endpoint": "Bark Endpoint",
+    "Bark Group": "Skupina Bark",
+    "Bark Sound": "Bark zvuk",
+    "WebHookUrl": "WebHookUrl",
+    "SecretKey": "Tajný klíč",
+    "For safety, must use secret key": "Z důvodu bezpečnosti použijte secret key",
+    "Device Token": "Token zařízení",
+    "Platform": "Platforma",
+    "iOS": "iOS",
+    "Android": "Android",
+    "Huawei": "Huawei",
+    "High": "Vysoký",
+    "Retry": "Opakovat",
+    "Topic": "Téma",
+    "WeCom Bot Key": "Klíč WeCom Bota",
+    "Setup Proxy": "Nastavit proxy",
+    "Proxy Protocol": "Protokol proxy",
+    "Proxy Server": "Proxy Server",
+    "Proxy server has authentication": "Proxy server vyžaduje ověření",
+    "User": "Uživatel",
+    "Installed": "Nainstalováno",
+    "Not installed": "Nenainstalováno",
+    "Running": "Běží",
+    "Not running": "Neběží",
+    "Remove Token": "Odstranit token",
+    "Start": "Spustit",
+    "Stop": "Zastavit",
+    "Uptime Kuma": "Uptime Kuma",
+    "Add New Status Page": "Přidat novou stavovou stránku",
+    "Slug": "Slug",
+    "Accept characters:": "Přípustné znaky:",
+    "startOrEndWithOnly": "Počáteční a koncový znak může být pouze {0}",
+    "No consecutive dashes": "Nesmí se opakovat pomlčky",
+    "Next": "Další",
+    "The slug is already taken. Please choose another slug.": "Slug s tímto názvem již existuje. Prosím, zadejte jiný název.",
+    "No Proxy": "Žádná proxy",
+    "Authentication": "Ověření",
+    "HTTP Basic Auth": "HTTP Basic ověření",
+    "New Status Page": "Nová stavová stránka",
+    "Page Not Found": "Stránka nenalezena",
+    "Reverse Proxy": "Reverzní proxy",
+    "Backup": "Záloha",
+    "About": "O programu",
+    "wayToGetCloudflaredURL": "(Stáhnout cloudflared z {0})",
+    "cloudflareWebsite": "Webová stránka Cloudflare",
+    "Message:": "Zpráva:",
+    "Don't know how to get the token? Please read the guide:": "Nevíte jak získat? Prosím, přečtěte si tuto příručku:",
+    "The current connection may be lost if you are currently connecting via Cloudflare Tunnel. Are you sure want to stop it? Type your current password to confirm it.": "Stávající připojení mohlo být ztraceno, pokud jste připojeni prostřednictvím Cloudflare tunelu. Opravdu jej chcete zastavit? Pro potvrzení zadejte své současné heslo.",
+    "HTTP Headers": "HTTP hlavičky",
+    "Trust Proxy": "Důvěryhodná proxy",
+    "Other Software": "Jiný software",
+    "For example: nginx, Apache and Traefik.": "Například nginx, Apache nebo Traefik.",
+    "Please read": "Prosím, přečtěte si informace na adrese",
+    "Subject:": "Předmět:",
+    "Valid To:": "Platnost do:",
+    "Days Remaining:": "Počet zbývajících dní:",
+    "Issuer:": "Vydavatel:",
+    "Fingerprint:": "Otisk:",
+    "No status pages": "Žádná stavová stránka",
+    "Domain Name Expiry Notification": "Oznámení na blížící se konec platnosti doménového jména",
+    "Proxy": "Proxy",
+    "Date Created": "Datum vytvoření",
+    "HomeAssistant": "Home Assistant",
+    "onebotHttpAddress": "OneBot HTTP adresa",
+    "onebotMessageType": "Typ OneBot zprávy",
+    "onebotGroupMessage": "Skupinová",
+    "onebotPrivateMessage": "Soukromá",
+    "onebotUserOrGroupId": "ID skupiny/uživatele",
+    "onebotSafetyTips": "Z důvodu bezpečnosti je nutné zadat přístupový token",
+    "PushDeer Key": "PushDeer klíč",
+    "Footer Text": "Text v patičce",
+    "Show Powered By": "Zobrazit \"Poskytuje\"",
+    "Domain Names": "Názvy domén",
+    "signedInDisp": "Přihlášen jako {0}",
+    "signedInDispDisabled": "Ověření je vypnuté.",
+    "RadiusSecret": "Tajemství Radius",
+    "RadiusSecretDescription": "Sdílený tajný klíč mezi klientem a serverem",
+    "RadiusCalledStationId": "ID volaného zařízení",
+    "RadiusCalledStationIdDescription": "Identifikátor volaného zařízení",
+    "RadiusCallingStationId": "ID volajícího zařízení",
+    "RadiusCallingStationIdDescription": "Identifikátor volajícího zařízení",
+    "Certificate Expiry Notification": "Oznámení na blížící se konec platnosti certifikátu",
+    "API Username": "Uživatelské jména API",
+    "API Key": "API klíč",
+    "Recipient Number": "Číslo příjemce",
+    "From Name/Number": "Jméno/číslo odesílatele",
+    "Leave blank to use a shared sender number.": "Ponechte prázdné, pokud chcete použít číslo sdíleného příjemce.",
+    "Octopush API Version": "Octopush API verze",
+    "Legacy Octopush-DM": "Legacy Octopush-DM",
+    "endpoint": "endpoint",
+    "octopushAPIKey": "\"API key\" ze sekce HTTP API credentials na nástěnce",
+    "octopushLogin": "\"Login\" ze sekce HTTP API credentials na nástěnce",
+    "promosmsLogin": "API Login Name",
+    "promosmsPassword": "API Password",
+    "pushoversounds pushover": "Pushover (výchozí)",
+    "pushoversounds bike": "Kolo",
+    "pushoversounds bugle": "Bugle",
+    "pushoversounds cashregister": "Pokladna",
+    "pushoversounds classical": "Classical",
+    "pushoversounds cosmic": "Kosmický",
+    "pushoversounds falling": "Falling",
+    "pushoversounds gamelan": "Gamelan",
+    "pushoversounds incoming": "Příchozí",
+    "pushoversounds intermission": "Přestávka",
+    "pushoversounds magic": "Kouzlo",
+    "pushoversounds mechanical": "Mechanika",
+    "pushoversounds pianobar": "Barové piano",
+    "pushoversounds siren": "Siréna",
+    "pushoversounds spacealarm": "Space Alarm",
+    "pushoversounds tugboat": "Tug Boat",
+    "pushoversounds alien": "Alien Alarm (dlouhý)",
+    "pushoversounds climb": "Climb (dlouhý)",
+    "pushoversounds persistent": "Persistent (dlouhý)",
+    "pushoversounds echo": "Pushover Echo (dlouhý)",
+    "pushoversounds updown": "Up Down (dlouhý)",
+    "pushoversounds vibrate": "Pouze vibrace",
+    "pushoversounds none": "Žádný (ticho)",
+    "pushyAPIKey": "Tajný API klíč",
+    "pushyToken": "Token zařízení",
+    "Show update if available": "Upozornit na aktualizace, pokud jsou k dispozici",
+    "Also check beta release": "Kontrolovat také dostupnost beta verzí",
+    "Using a Reverse Proxy?": "Používáte reverzní proxy?",
+    "Check how to config it for WebSocket": "Zjistěte, jak ji nakonfigurovat pro WebSockety",
+    "Steam Game Server": "Steam Game Server",
+    "Most likely causes:": "Nejčastější důvody:",
+    "The resource is no longer available.": "Zdroj již není k dispozici.",
+    "There might be a typing error in the address.": "Při zadávání adresy jste udělali chybu.",
+    "What you can try:": "Co můžete vyzkoušet:",
+    "Retype the address.": "Znovu zadat adresu.",
+    "Go back to the previous page.": "Vrátit se na předchozí stránku.",
+    "Coming Soon": "Připravujeme",
+    "wayToGetClickSendSMSToken": "API Username a API Key získáte na adrese {0} .",
+    "Connection String": "Připojovací řetězec",
+    "Query": "Dotaz",
+    "settingsCertificateExpiry": "Platnost TLS certifikátu",
+    "certificationExpiryDescription": "Aktivovat oznámení nad HTTPS dohledy, pokud platnost TLS certifikátu vyprší za:",
+    "Setup Docker Host": "Nastavit Docker hostitele",
+    "Connection Type": "Typ připojení",
+    "Docker Daemon": "Démon Dockeru",
+    "deleteDockerHostMsg": "Opravdu chcete odstranit tohoto docker hostitele ze všech dohledů?",
+    "socket": "Socket",
+    "tcp": "TCP / HTTP",
+    "Docker Container": "Docker kontejner",
+    "Container Name / ID": "ID / název kontejneru",
+    "Docker Host": "Docker hostitel",
+    "Docker Hosts": "Docker hostitelé",
+    "ntfy Topic": "ntfy Téma",
+    "Domain": "Doména",
+    "Workstation": "Pracovní stanice",
+    "disableCloudflaredNoAuthMsg": "Používáte režim bez ověření, heslo není vyžadováno.",
+    "trustProxyDescription": "Důvěřovat 'X-Forwarded-*' hlavičkám. Pokud chcete získat správnou IP adresu klientů a vaše instance Uptime Kuma je za Nginx nebo Apache, měli byste tuto možnost zapnout.",
+    "wayToGetLineNotifyToken": "Přístupový token můžete získat na adrese {0}",
+    "Examples": "Příklady",
+    "Home Assistant URL": "Home Assistant URL",
+    "Long-Lived Access Token": "Dlouhodobý přístupový token",
+    "Long-Lived Access Token can be created by clicking on your profile name (bottom left) and scrolling to the bottom then click Create Token. ": "Pro vytvoření dlouhodobého přístupový tokenu klikněte na název svého profilu (v levém dolním rohu) a následně v dolní části stránky klikněte na tlačítko Create Token. ",
+    "Notification Service": "Oznamovací služba",
+    "default: notify all devices": "výchozí: upozornit všechny zařízení",
+    "A list of Notification Services can be found in Home Assistant under \"Developer Tools > Services\" search for \"notification\" to find your device/phone name.": "Seznam dostupných oznamovacích služeb naleznete v Home Assistant v sekci \"Developer Tools > Services\", kde vyhledejte \"notification\" pro zjištění názvu zařízení.",
+    "Automations can optionally be triggered in Home Assistant:": "Automatizaci můžete volitelně aktivovat prostřednictvím Home Assistant:",
+    "Trigger type:": "Typ podmínky spuštění:",
+    "Event type:": "Typ události:",
+    "Event data:": "Data události:",
+    "Then choose an action, for example switch the scene to where an RGB light is red.": "Následně vyberte akci, například přepnutí scény z RGB světla na červenou.",
+    "Frontend Version": "Verze frontendu",
+    "Frontend Version do not match backend version!": "Verze frontendu neodpovídá verzi backendu!",
+    "Base URL": "Primární URL adresa",
+    "goAlertInfo": "GoAlert je aplikace s otevřeným zdrojovým kódem pro plánování hovorů, automatické eskalace a upozornění (jako jsou SMS nebo hlasové hovory). Automaticky zapojte správnou osobu, správným způsobem a ve správný čas! {0}",
+    "goAlertIntegrationKeyInfo": "Obecný API integrační klíč pro danou službu ve formátu \"aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee\" se obvykle nachází ve zkopírované URL jako hodnota parametru token.",
+    "goAlert": "GoAlert",
+    "backupOutdatedWarning": "Zastaralé: Vzhledem k tomu, že bylo přidáno mnoho funkcí a tato funkce zálohování je poněkud neudržovaná, nemůže vytvářet nebo obnovit kompletní zálohu.",
+    "backupRecommend": "Prosím, zálohujte si ručně celý svazek nebo datovou složku (./data/).",
+    "Optional": "Volitelný",
+    "squadcast": "Squadcast",
+    "SendKey": "SendKey",
+    "SMSManager API Docs": "Dokumentace SMSManager API ",
+    "Gateway Type": "Typ brány",
+    "SMSManager": "SMSManager",
+    "You can divide numbers with": "Čísla můžete oddělit pomocí",
+    "or": "nebo",
+    "recurringInterval": "Interval",
+    "Recurring": "Opakující se",
+    "strategyManual": "Ruční spuštění/vypnutí",
+    "warningTimezone": "Používá se časové pásmo serveru",
+    "weekdayShortMon": "Po",
+    "weekdayShortTue": "Út",
+    "weekdayShortWed": "St",
+    "weekdayShortThu": "Čt",
+    "weekdayShortFri": "Pá",
+    "weekdayShortSat": "So",
+    "weekdayShortSun": "Ne",
+    "dayOfWeek": "Den v týdnu",
+    "dayOfMonth": "Den v měsíci",
+    "lastDay": "Poslední den",
+    "lastDay1": "1. poslední den v měsíci",
+    "lastDay2": "2. poslední den v měsíci",
+    "lastDay3": "3. poslední den v měsíci",
+    "lastDay4": "4. poslední den v měsíci",
+    "No Maintenance": "Žádná údržba",
+    "pauseMaintenanceMsg": "Opravdu chcete údržbu pozastavit?",
+    "maintenanceStatus-under-maintenance": "Údržba",
+    "maintenanceStatus-inactive": "Neaktivní",
+    "maintenanceStatus-scheduled": "Naplánováno",
+    "maintenanceStatus-ended": "Ukončeno",
+    "maintenanceStatus-unknown": "Neznámý",
+    "Display Timezone": "Zobrazit časové pásmo",
+    "Server Timezone": "Časové pásmo serveru",
+    "statusPageMaintenanceEndDate": "Konec",
+    "IconUrl": "Adresa URL ikony",
+    "Enable DNS Cache": "Povolit DNS Cache",
+    "Enable": "Povolit",
+    "Disable": "Zakázat",
+    "dnsCacheDescription": "V některých IPv6 prostředích nemusí fungovat. Pokud narazíte na nějaké problémy, vypněte jej.",
+    "Single Maintenance Window": "Konkrétní časové okno pro údržbu",
+    "Maintenance Time Window of a Day": "Časové okno pro údržbu v daný den",
+    "Effective Date Range": "Časové období",
+    "Schedule Maintenance": "Naplánovat údržbu",
+    "Date and Time": "Datum a čas",
+    "DateTime Range": "Rozsah data a času",
+    "Strategy": "Strategie",
+    "Free Mobile User Identifier": "Identifikátor uživatele Free Mobile",
+    "Free Mobile API Key": "API klíč Free Mobile",
+    "Enable TLS": "Povolit TLS",
+    "Proto Service Name": "Proto Service Name",
+    "Proto Method": "Proto metoda",
+    "Proto Content": "Proto obsah",
+    "Economy": "Úsporná",
+    "Lowcost": "Nízkonákladová",
+    "high": "vysoká",
+    "General Monitor Type": "Obecný typ dohledu",
+    "Passive Monitor Type": "Pasivní typ dohledu",
+    "Specific Monitor Type": "Konkrétní typ dohledu",
+    "dataRetentionTimeError": "Doba pro uchování musí být větší nebo rovna 0",
+    "infiniteRetention": "Pro nekonečný záznam zadejte 0.",
+    "confirmDeleteTagMsg": "Opravdu chcete odstranit tento štítek? Provedením této akce nedojde k odstranění dohledů, které jej mají přiřazeny.",
+    "Help": "Nápověda",
+    "Game": "Hra",
+    "Custom Monitor Type": "Vlastní typ dohledu",
+    "loadingError": "Nelze načíst data, zkuste to prosím později.",
+    "confirmUninstallPlugin": "Opravdu chcete tento zásuvný modul odinstalovat?",
+    "plugin": "Zásuvné moduly | Zásuvné moduly",
+    "install": "Instalace",
+    "installing": "Instaluji",
+    "uninstall": "Odinstalace",
+    "uninstalling": "Odinstalování",
+    "Packet Size": "Velikost paketu",
+    "markdownSupported": "Markdown syntaxe podporována",
+    "Google Analytics ID": "ID Google Analytics",
+    "Edit Tag": "Upravit štítek",
+    "Server Address": "Adresa serveru",
+    "Learn More": "Zjistěte více"
+}
diff --git a/src/lang/da-DK.json b/src/lang/da-DK.json
new file mode 100644
index 000000000..1b0fe210b
--- /dev/null
+++ b/src/lang/da-DK.json
@@ -0,0 +1,448 @@
+{
+    "languageName": "Danish (Danmark)",
+    "Settings": "Indstillinger",
+    "Dashboard": "Betjeningspanel",
+    "New Update": "Opdatering tilgængelig",
+    "Language": "Sprog",
+    "Appearance": "Udseende",
+    "Theme": "Tema",
+    "General": "Generelt",
+    "Version": "Version",
+    "Check Update On GitHub": "Tjek efter opdateringer på Github",
+    "List": "Liste",
+    "Add": "Tilføj",
+    "Add New Monitor": "Tilføj ny Overvåger",
+    "Quick Stats": "Oversigt",
+    "Up": "Aktiv",
+    "Down": "Inaktiv",
+    "Pending": "Afventer",
+    "Unknown": "Ukendt",
+    "Pause": "Stands",
+    "pauseDashboardHome": "Standset",
+    "Name": "Navn",
+    "Status": "Status",
+    "DateTime": "Dato / Tid",
+    "Message": "Beskeder",
+    "No important events": "Inden vigtige begivenheder",
+    "Resume": "Fortsæt",
+    "Edit": "Rediger",
+    "Delete": "Slet",
+    "Current": "Aktuelt",
+    "Uptime": "Oppetid",
+    "Cert Exp.": "Certifikatets udløb.",
+    "day": "Dag | Dage",
+    "-day": "-Dage",
+    "hour": "Timer",
+    "-hour": "-Timer",
+    "checkEverySecond": "Tjek hvert {0} sekund",
+    "Response": "Respons",
+    "Ping": "Ping",
+    "Monitor Type": "Overvåger Type",
+    "Keyword": "Nøgleord",
+    "Friendly Name": "Visningsnavn",
+    "URL": "URL",
+    "Hostname": "Hostname",
+    "Port": "Port",
+    "Heartbeat Interval": "Taktinterval",
+    "Retries": "Gentagelser",
+    "retriesDescription": "Maksimalt antal gentagelser, før tjenesten markeres som inaktiv og sender en meddelelse.",
+    "Advanced": "Avanceret",
+    "ignoreTLSError": "Ignorere TLS/SSL web fejl",
+    "Upside Down Mode": "Omvendt tilstand",
+    "upsideDownModeDescription": "Håndter tilstanden omvendt. Hvis tjenesten er tilgængelig, vises den som inaktiv.",
+    "Max. Redirects": "Maks. Omdirigeringer",
+    "maxRedirectDescription": "Maksimalt antal omdirigeringer, der skal følges. Indstil til 0 for at deaktivere omdirigeringer.",
+    "Accepted Status Codes": "Tilladte HTTP-Statuskoder",
+    "acceptedStatusCodesDescription": "Vælg de statuskoder, der stadig skal vurderes som vellykkede.",
+    "Save": "Gem",
+    "Notifications": "Underretninger",
+    "Not available, please setup.": "Ikke tilgængelige, opsæt venligst.",
+    "Setup Notification": "Opsæt underretninger",
+    "Light": "Lys",
+    "Dark": "Mørk",
+    "Auto": "Auto",
+    "Theme - Heartbeat Bar": "Tema - Tidslinje",
+    "Normal": "Normal",
+    "Bottom": "Bunden",
+    "None": "Ingen",
+    "Timezone": "Tidszone",
+    "Search Engine Visibility": "Søgemaskine synlighed",
+    "Allow indexing": "Tillad indeksering",
+    "Discourage search engines from indexing site": "Frabed søgemaskiner at indeksere webstedet",
+    "Change Password": "Ændre adgangskode",
+    "Current Password": "Nuværende adgangskode",
+    "New Password": "Ny adgangskode",
+    "Repeat New Password": "Gentag den nye adgangskode",
+    "passwordNotMatchMsg": "Adgangskoderne er ikke ens.",
+    "Update Password": "Opdater adgangskode",
+    "Disable Auth": "Deaktiver autentificering",
+    "Enable Auth": "Aktiver autentificering",
+    "Logout": "Log ud",
+    "notificationDescription": "Tildel underretninger til Overvåger(e), så denne funktion træder i kraft.",
+    "Leave": "Verlassen",
+    "I understand, please disable": "Jeg er indforstået, deaktiver venligst",
+    "Confirm": "Bekræft",
+    "Yes": "Ja",
+    "No": "Nej",
+    "Username": "Brugernavn",
+    "Password": "Adgangskode",
+    "Remember me": "Husk mig",
+    "Login": "Log ind",
+    "No Monitors, please": "Ingen Overvågere",
+    "add one": "tilføj en",
+    "Notification Type": "Underretningstype",
+    "Email": "E-Mail",
+    "Test": "Test",
+    "Certificate Info": "Certifikatoplysninger",
+    "keywordDescription": "Søg efter et søgeord i almindelig HTML- eller JSON -output. Bemærk, at der skelnes mellem store og små bogstaver.",
+    "deleteMonitorMsg": "Er du sikker på, at du vil slette overvågeren?",
+    "deleteNotificationMsg": "Er du sikker på, at du vil slette denne underretning for alle overvågere?",
+    "resolverserverDescription": "Cloudflare er standardserveren, den kan til enhver tid ændres.",
+    "Resolver Server": "Navne-server",
+    "rrtypeDescription": "Vælg den type RR, du vil overvåge.",
+    "Last Result": "Seneste resultat",
+    "pauseMonitorMsg": "Er du sikker på, at du vil standse Overvågeren?",
+    "Create your admin account": "Opret din administratorkonto",
+    "Repeat Password": "Gentag adgangskoden",
+    "Resource Record Type": "Resource Record Type",
+    "respTime": "Resp. Tid (ms)",
+    "notAvailableShort": "N/A",
+    "Create": "Opret",
+    "clearEventsMsg": "Er du sikker på vil slette alle events for denne Overvåger?",
+    "clearHeartbeatsMsg": "Er du sikker på vil slette alle hjerteslag for denne Overvåger?",
+    "confirmClearStatisticsMsg": "Vil du helt sikkert slette ALLE statistikker?",
+    "Clear Data": "Ryd Data",
+    "Events": "Events",
+    "Heartbeats": "Hjerteslag",
+    "Auto Get": "Auto-hent",
+    "enableDefaultNotificationDescription": "For hver ny overvåger aktiveres denne underretning som standard. Du kan stadig deaktivere underretningen separat for hver skærm.",
+    "Default enabled": "Standard aktiveret",
+    "Also apply to existing monitors": "Anvend også på eksisterende overvågere",
+    "Export": "Eksport",
+    "Import": "Import",
+    "backupDescription": "Du kan sikkerhedskopiere alle Overvågere og alle underretninger til en JSON-fil.",
+    "backupDescription2": "PS: Historik og hændelsesdata er ikke inkluderet.",
+    "backupDescription3": "Følsom data, f.eks. underretnings-tokener, er inkluderet i eksportfilen. Gem den sikkert.",
+    "alertNoFile": "Vælg en fil der skal importeres.",
+    "alertWrongFileType": "Vælg venligst en JSON-fil.",
+    "twoFAVerifyLabel": "Indtast venligst dit token for at bekræfte, at 2FA fungerer",
+    "tokenValidSettingsMsg": "Token er gyldigt! Du kan nu gemme 2FA -indstillingerne.",
+    "confirmEnableTwoFAMsg": "Er du sikker på at du vil aktivere 2FA?",
+    "confirmDisableTwoFAMsg": "Er du sikker på at du vil deaktivere 2FA?",
+    "Apply on all existing monitors": "Anvend på alle eksisterende overvågere",
+    "Verify Token": "Verificere Token",
+    "Setup 2FA": "Opsæt 2FA",
+    "Enable 2FA": "Aktiver 2FA",
+    "Disable 2FA": "Deaktiver 2FA",
+    "2FA Settings": "2FA Indstillinger",
+    "Two Factor Authentication": "To-Faktor Autentificering",
+    "Active": "Aktive",
+    "Inactive": "Inaktive",
+    "Token": "Token",
+    "Show URI": "Vis URI",
+    "Clear all statistics": "Ryd alle Statistikker",
+    "retryCheckEverySecond": "Prøv igen hvert {0} sekund.",
+    "importHandleDescription": "Vælg 'Spring over eksisterende', hvis du vil springe over hver overvåger eller underretning med samme navn. 'Overskriv' sletter alle eksisterende overvågere og underretninger.",
+    "confirmImportMsg": "Er du sikker på at importere sikkerhedskopien? Sørg for, at du har valgt den rigtige importindstilling.",
+    "Heartbeat Retry Interval": "Hjerteslag Gentagelsesinterval",
+    "Import Backup": "Importer Backup",
+    "Export Backup": "Eksporter Backup",
+    "Skip existing": "Spring over eksisterende",
+    "Overwrite": "Overskriv",
+    "Options": "Valgmuligheder",
+    "Keep both": "Behold begge",
+    "Tags": "Etiketter",
+    "Add New below or Select...": "Tilføj Nyt nedenfor eller Vælg ...",
+    "Tag with this name already exist.": "Et Tag med dette navn findes allerede.",
+    "Tag with this value already exist.": "Et Tag med denne værdi findes allerede.",
+    "color": "farve",
+    "value (optional)": "værdi (valgfri)",
+    "Gray": "Grå",
+    "Red": "Rød",
+    "Orange": "Orange",
+    "Green": "Grøn",
+    "Blue": "Blå",
+    "Indigo": "Indigo",
+    "Purple": "Lilla",
+    "Pink": "Pink",
+    "Search...": "Søg...",
+    "Avg. Ping": "Gns. Ping",
+    "Avg. Response": "Gns. Respons",
+    "Entry Page": "Entry Side",
+    "statusPageNothing": "Intet her, tilføj venligst en Gruppe eller en Overvåger.",
+    "No Services": "Ingen Tjenester",
+    "All Systems Operational": "Alle Systemer i Drift",
+    "Partially Degraded Service": "Delvist Forringet Service",
+    "Degraded Service": "Forringet Service",
+    "Add Group": "Tilføj Gruppe",
+    "Add a monitor": "Tilføj en Overvåger",
+    "Edit Status Page": "Rediger Statusside",
+    "Go to Dashboard": "Gå til Betjeningspanel",
+    "Status Page": "Statusside",
+    "Status Pages": "Statusside",
+    "telegram": "Telegram",
+    "webhook": "Webhook",
+    "smtp": "Email (SMTP)",
+    "discord": "Discord",
+    "teams": "Microsoft Teams",
+    "signal": "Signal",
+    "gotify": "Gotify",
+    "slack": "Slack",
+    "rocket.chat": "Rocket.chat",
+    "pushover": "Pushover",
+    "pushy": "Pushy",
+    "octopush": "Octopush",
+    "promosms": "PromoSMS",
+    "lunasea": "LunaSea",
+    "apprise": "Apprise (Understøtter 50+ Notifikationstjenester)",
+    "pushbullet": "Pushbullet",
+    "line": "Line Messenger",
+    "mattermost": "Mattermost",
+    "Primary Base URL": "Primær Basis-URL",
+    "Push URL": "Push URL",
+    "needPushEvery": "Du bør kalde denne webadresse hvert {0} sekund.",
+    "pushOptionalParams": "Valgfrie parametre: {0}",
+    "defaultNotificationName": "Min {notification} Advarsel ({number})",
+    "here": "her",
+    "Required": "Påkrævet",
+    "Bot Token": "Bot Token",
+    "wayToGetTelegramToken": "Du kan få et token fra {0}.",
+    "Chat ID": "Chat ID",
+    "supportTelegramChatID": "Support Direct Chat / Group / Channel's Chat ID",
+    "wayToGetTelegramChatID": "Du kan få dit chat-ID ved at sende en besked til bot'en og gå til denne URL for at se chat_id'et:",
+    "YOUR BOT TOKEN HERE": "DIT BOT TOKEN HER",
+    "chatIDNotFound": "Chat-ID blev ikke fundet; send venligst en besked til denne bot først ",
+    "Post URL": "Post URL",
+    "Content Type": "Indholdstype",
+    "webhookJsonDesc": "{0} er god til alle moderne HTTP-servere som f.eks Express.js",
+    "webhookFormDataDesc": "{multipart} er god til PHP. JSON'en skal parses med {decodeFunction}",
+    "secureOptionNone": "Ingen / STARTTLS (25, 587)",
+    "secureOptionTLS": "TLS (465)",
+    "Ignore TLS Error": "Ignorer TLS-fejl",
+    "From Email": "Afsender Email",
+    "emailCustomSubject": "Brugerdefineret Emne",
+    "To Email": "Modtager Email",
+    "smtpCC": "CC",
+    "smtpBCC": "BCC",
+    "Discord Webhook URL": "Discord Webhook URL",
+    "wayToGetDiscordURL": "Du kan få dette ved at gå til Serverindstillinger -> Integrationer -> Opret webhook ",
+    "Bot Display Name": "Bot Visningsnavn",
+    "Prefix Custom Message": "Præfiks Brugerdefineret Besked",
+    "Hello @everyone is...": "Hello {'@'}everyone is...",
+    "Webhook URL": "Webhook URL",
+    "wayToGetTeamsURL": "Du kan lære, hvordan du laver en webhook URL {0}.",
+    "Number": "Nummer",
+    "Recipients": "Modtagere",
+    "needSignalAPI": "Du skal have en Signal-klient med REST API.",
+    "wayToCheckSignalURL": "Du kan tjekke denne URL for at se, hvordan du konfigurerer en:",
+    "signalImportant": "VIGTIGT: Du kan ikke blande grupper og numre i modtagere!",
+    "Application Token": "Program Token",
+    "Server URL": "Server URL",
+    "Priority": "Prioritet",
+    "Icon Emoji": "Icon Emoji",
+    "Channel Name": "Kanalnavn",
+    "Uptime Kuma URL": "Uptime Kuma URL",
+    "aboutWebhooks": "Mere info om Webhooks på: {0}",
+    "aboutChannelName": "Indtast kanalnavnet i {0} Kanalnavn feltet, hvis du vil omgå Webhook-kanalen. Eks: #anden-kanal",
+    "aboutKumaURL": "Hvis du efterlader Uptime Kuma URL-feltet tomt, vil det som standard gå til projektets GitHub-siden.",
+    "emojiCheatSheet": "Emoji cheat sheet: {0}",
+    "clicksendsms": "ClickSend SMS",
+    "User Key": "Bruger-Nøgle",
+    "Device": "Enhed",
+    "Message Title": "Besked Titel",
+    "Notification Sound": "Notifikationslyd",
+    "More info on:": "Mere info på: {0}",
+    "pushoverDesc1": "Nødprioritet (2) har som standard 30 sekunders timeout mellem genforsøg og udløber efter 1 time.",
+    "pushoverDesc2": "Hvis du vil sende meddelelser til forskellige enheder, skal du udfylde feltet Enhed.",
+    "SMS Type": "SMS Type",
+    "octopushTypePremium": "Premium (Hurtig - anbefales til advarsel)",
+    "octopushTypeLowCost": "Lavpris (Langsom - nogle gange blokeret af operatøren)",
+    "checkPrice": "Tjek {0} priser:",
+    "apiCredentials": "API legitimationsoplysninger",
+    "octopushLegacyHint": "Bruger du den ældre version af Octopush (2011-2020) eller den nye version?",
+    "Check octopush prices": "Tjek octopush priser {0}.",
+    "octopushPhoneNumber": "Telefonnummer (intl format, f.eks : +4512345678) ",
+    "octopushSMSSender": "SMS Afsender Navn : 3-11 alfanumeriske tegn og mellemrum (a-zA-Z0-9)",
+    "LunaSea Device ID": "LunaSea Enhed-ID",
+    "Apprise URL": "Apprise URL",
+    "Example:": "Eksempel: {0}",
+    "Read more:": "Læs mere: {0}",
+    "Status:": "Status: {0}",
+    "Read more": "Læs mere",
+    "appriseInstalled": "Apprise er installeret.",
+    "appriseNotInstalled": "Apprise er ikke installeret. {0}",
+    "Access Token": "Access Token",
+    "Channel access token": "kanaladgangstoken",
+    "Line Developers Console": "Line Udviklerkonsol",
+    "lineDevConsoleTo": "Line Udviklerkonsol - {0}",
+    "Basic Settings": "Basisindstillinger",
+    "User ID": "Bruger-ID",
+    "Messaging API": "Messaging API",
+    "wayToGetLineChannelToken": "Tilgå først {0}, opret en udbyder og kanal (Messaging API), så kan du få kanaladgangstoken'et og bruger-ID'et fra de ovennævnte menupunkter.",
+    "Icon URL": "Ikon URL",
+    "aboutIconURL": "Du kan angive et link til et billede i \"Ikon URL\" for at tilsidesætte standardprofilbilledet. Vil ikke blive brugt, hvis Ikon Emoji er angivet.",
+    "aboutMattermostChannelName": "Du kan tilsidesætte standardkanalen, som Webhoo'en sender til ved at indtaste kanalnavnet i feltet \"Kanalnavn\". Dette skal aktiveres i Mattermost Webhook-indstillingerne. Eks: #anden-kanal",
+    "matrix": "Matrix",
+    "promosmsTypeEco": "SMS ECO - billig, men langsom og ofte overbelastet. Begrænset kun til polske modtagere.",
+    "promosmsTypeFlash": "SMS FLASH - Beskeden vises automatisk på modtagerenheden. Begrænset kun til polske modtagere.",
+    "promosmsTypeFull": "SMS FULL - Premium-niveau af SMS, Du kan bruge dit \"Sender Name\" (Du skal først registrere navn). Pålidelig til advarsler.",
+    "promosmsTypeSpeed": "SMS SPEED - Højeste prioritet i systemet. Meget hurtig og pålidelig, men dyr (ca. to gange af SMS FULL pris).",
+    "promosmsPhoneNumber": "Telefonnummer (polske numre behøver ikke angive områdenumre)",
+    "promosmsSMSSender": "SMS Sender Name : Forudregistreret navn eller en af standarderne: InfoSMS, SMS Info, MaxSMS, INFO, SMS",
+    "Feishu WebHookUrl": "Feishu WebHookURL",
+    "matrixHomeserverURL": "Hjemmeserver-URL (med http(s):// og eventuel port)",
+    "Internal Room Id": "Intern Rum-ID",
+    "matrixDesc1": "Du kan finde det interne rum-ID ved at se i det avancerede afsnit af rumindstillingerne i din Matrix-klient. Det skulle ligne !QMdRCpUIfLwsfjxye6:home.server.",
+    "matrixDesc2": "Det anbefales stærkt, at du opretter en ny bruger og ikke bruger din egen Matrix-brugers adgangstoken, da det giver fuld adgang til din konto og alle de rum, du har tilsluttet dig. I stedet skal du oprette en ny bruger og kun invitere den til det rum, du vil modtage meddelelsen i. Du kan få adgangstokenet ved at køre {0}",
+    "Method": "Metode",
+    "Body": "Body",
+    "Headers": "Headers",
+    "PushUrl": "Push URL",
+    "HeadersInvalidFormat": "\"request headers\"-erne er ikke gyldige JSON: ",
+    "BodyInvalidFormat": "\"request body\"-en er ikke gyldige JSON: ",
+    "Monitor History": "Overvåger Historik",
+    "clearDataOlderThan": "Gem overvågningshistorikdata i {0} dage.",
+    "PasswordsDoNotMatch": "Adgangskoderne stemmer ikke overens.",
+    "records": "forekomster",
+    "One record": "Én forekomst",
+    "steamApiKeyDescription": "For at overvåge en Steam Game Server skal du bruge en Steam Web-API nøgle. Du kan registrere din API-nøgle her: ",
+    "Current User": "Nuværende Bruger",
+    "recent": "Seneste",
+    "Done": "Færdig",
+    "Info": "Info",
+    "Security": "Sikkerhed",
+    "Steam API Key": "Steam API-nøgle",
+    "Shrink Database": "Krymp Database",
+    "Pick a RR-Type...": "Vælg en RR-Type...",
+    "Pick Accepted Status Codes...": "Vælg Accepterede Statuskoder...",
+    "Default": "Standard",
+    "HTTP Options": "HTTP Valgmuligheder",
+    "Create Incident": "Opret Annoncering",
+    "Title": "Titel",
+    "Content": "Indhold",
+    "Style": "Type",
+    "info": "info",
+    "warning": "advarsel",
+    "danger": "fare",
+    "primary": "primær",
+    "light": "lys",
+    "dark": "mørk",
+    "Post": "Udgiv",
+    "Please input title and content": "Indtast venligst titel og indhold",
+    "Created": "Oprettet",
+    "Last Updated": "Sidst Opdateret",
+    "Unpin": "Frigør",
+    "Switch to Light Theme": "Skift til Lys Tema",
+    "Switch to Dark Theme": "Skift til Mørkt Tema",
+    "Show Tags": "Vis Etiketter",
+    "Hide Tags": "Skjul Etiketter",
+    "Description": "Beskrivelse",
+    "No monitors available.": "No monitors available.",
+    "Add one": "Tilføj en",
+    "No Monitors": "Ingen Overvågere",
+    "Untitled Group": "Unavngivet Gruppe",
+    "Services": "Tjenester",
+    "Discard": "Kassér",
+    "Cancel": "Annullér",
+    "Powered by": "Drevet af",
+    "shrinkDatabaseDescription": "Udfør database VACUUM for SQLite. Hvis din database er oprettet efter 1.10.0, er AUTO_VACUUM allerede aktiveret, og denne handling er ikke nødvendig.",
+    "serwersms": "SerwerSMS.pl",
+    "serwersmsAPIUser": "API Brugernavn (inkl. webapi_ prefix)",
+    "serwersmsAPIPassword": "API Adgangskode",
+    "serwersmsPhoneNumber": "Telefonnummer",
+    "serwersmsSenderName": "SMS Afsender Navn (registreret via kundeportal)",
+    "statusMaintenance": "Vedligeholdelse",
+    "Maintenance": "Vedligeholdelse",
+    "No Maintenance": "Ingen vedligeholdelse",
+    "Examples": "Eksempler",
+    "High": "Høj",
+    "Recipient Number": "Modtager Nummer",
+    "From Name/Number": "Fra Navn/Nummer",
+    "Help": "Hjælp",
+    "Please use this option carefully!": "Brug venligst denne funktion med forsigtighed!",
+    "disableauth.message1": "Er du sikker på, at du vil <strong>deaktivere authentication</strong>?",
+    "successMessage": "Succesmeddelelse",
+    "error": "fejl",
+    "critical": "kritisk",
+    "Customize": "Tilpas",
+    "Custom Footer": "Brugerdefineret Footer",
+    "Custom CSS": "Brugerdefineret CSS",
+    "deleteStatusPageMsg": "Er du sikker på, at du vil slette denne statusside?",
+    "Proxies": "Proxies",
+    "default": "Standard",
+    "enabled": "Aktiveret",
+    "setAsDefault": "Indstil som standard",
+    "Certificate Chain": "Certificate Chain",
+    "Days Remaining:": "Dage tilbage:",
+    "No status pages": "Ingen statussider",
+    "Proxy": "Proxy",
+    "default: notify all devices": "standard: underretter alle enheder",
+    "Automations can optionally be triggered in Home Assistant:": "Automatiseringer kan valgfrit udløses i Home Assistant:",
+    "Trigger type:": "Trigger type:",
+    "Event type:": "Event type:",
+    "Event data:": "Event data:",
+    "Frontend Version": "Frontend Version",
+    "or": "eller",
+    "Notification Service": "Notifikationstjeneste",
+    "Domain": "Domæne",
+    "Google Analytics ID": "Google Analytics ID",
+    "Edit Tag": "Ændre Tag",
+    "Learn More": "Lær mere",
+    "Schedule maintenance": "Planlæg vedligeholdelse",
+    "Invalid": "Ugyldig",
+    "User": "Bruger",
+    "Installed": "Installeret",
+    "Not installed": "Ikke installeret",
+    "Running": "Køre",
+    "Not running": "Køre ikke",
+    "Remove Token": "Fjern Token",
+    "Start": "Start",
+    "Stop": "Stop",
+    "Add New Status Page": "Tilføj ny statusside",
+    "Next": "Næste",
+    "No Proxy": "Ingen proxy",
+    "New Status Page": "Ny statusside",
+    "Page Not Found": "Side blev ikke fundet",
+    "Reverse Proxy": "Reverse Proxy",
+    "Backup": "Backup",
+    "About": "Om",
+    "cloudflareWebsite": "Cloudflare hjemmeside",
+    "Message:": "Besked:",
+    "HTTP Headers": "HTTP Headers",
+    "Trust Proxy": "Trust Proxy",
+    "For example: nginx, Apache and Traefik.": "For eksempel: nginx, Apache og Traefik.",
+    "Please read": "Læs venligst",
+    "Show Powered By": "Vis Powered By",
+    "Domain Names": "Domænenavne",
+    "signedInDisp": "Logget ind som {0}",
+    "Certificate Expiry Notification": "Meddelelse om udløbsdato for certifikatet",
+    "API Username": "API Brugernavn",
+    "API Key": "API Key",
+    "Steam Game Server": "Steam Game Server",
+    "What you can try:": "Hvad du kan prøve:",
+    "Go back to the previous page.": "Gå tilbage til forrige side.",
+    "Coming Soon": "Kommer snart",
+    "settingsCertificateExpiry": "Udløb af TLS-certifikat",
+    "Setup Docker Host": "Opsæt Docker Host",
+    "Connection Type": "Forbindelsestype",
+    "Docker Daemon": "Docker Daemon",
+    "socket": "Socket",
+    "tcp": "TCP / HTTP",
+    "Docker Container": "Docker Container",
+    "Container Name / ID": "Container Navn / ID",
+    "Packet Size": "Pakke størrelse",
+    "Home Assistant URL": "Home Assistant URL",
+    "Frontend Version do not match backend version!": "Frontend versionen stemmer ikke overens med backend versionen!",
+    "Optional": "Valgfri",
+    "HomeAssistant": "Home Assistant",
+    "disableauth.message2": "Den er beregnet til scenarier <strong>hvor du har tænkt dig at implementere tredjepartsgodkendelse</strong> foran Uptime Kuma, f.eks. Cloudflare Access, Authelia eller andre godkendelsesmekanismer.",
+    "deleteProxyMsg": "Er du sikker på, at du vil slette denne proxy for alle monitors?",
+    "Valid": "Gyldig",
+    "Don't know how to get the token? Please read the guide:": "Ved du ikke, hvordan du får fat i din Token? Læs venligst guiden:",
+    "Subject:": "Emne:",
+    "Footer Text": "Footer tekst",
+    "Using a Reverse Proxy?": "Bruger du en Reverse Proxy?",
+    "deleteDockerHostMsg": "Er du sikker på, at du vil slette denne docker host for alle monitors?",
+    "Docker Host": "Docker Host",
+    "Docker Hosts": "Docker Hosts"
+}
diff --git a/src/lang/de-CH.json b/src/lang/de-CH.json
new file mode 100644
index 000000000..d8a46562e
--- /dev/null
+++ b/src/lang/de-CH.json
@@ -0,0 +1,633 @@
+{
+    "languageName": "Deutsch (Schweiz)",
+    "Settings": "Einstellungen",
+    "Dashboard": "Dashboard",
+    "New Update": "Update verfügbar",
+    "Language": "Sprache",
+    "Appearance": "Erscheinungsbild",
+    "Theme": "Erscheinungsbild",
+    "General": "Allgemein",
+    "Version": "Version",
+    "Check Update On GitHub": "Auf GitHub nach Updates suchen",
+    "List": "Liste",
+    "Add": "Hinzufügen",
+    "Add New Monitor": "Neuen Monitor hinzufügen",
+    "Quick Stats": "Übersicht",
+    "Up": "Aktiv",
+    "Down": "Inaktiv",
+    "Pending": "Ausstehend",
+    "Unknown": "Unbekannt",
+    "Pause": "Pausieren",
+    "pauseDashboardHome": "Pausiert",
+    "Name": "Name",
+    "Status": "Status",
+    "DateTime": "Datum / Uhrzeit",
+    "Message": "Nachricht",
+    "No important events": "Keine wichtigen Ereignisse",
+    "Resume": "Fortsetzen",
+    "Edit": "Bearbeiten",
+    "Delete": "Löschen",
+    "Current": "Aktuell",
+    "Uptime": "Verfügbarkeit",
+    "Cert Exp.": "Zertifikatsablauf",
+    "day": "Tag | Tage",
+    "-day": "-Tage",
+    "hour": "Stunde",
+    "-hour": "-Stunden",
+    "checkEverySecond": "Überprüfe alle {0} Sekunden",
+    "Response": "Antwortzeit",
+    "Ping": "Ping",
+    "Monitor Type": "Monitor-Typ",
+    "Keyword": "Suchwort",
+    "Friendly Name": "Anzeigename",
+    "URL": "URL",
+    "Hostname": "Hostname",
+    "Port": "Port",
+    "Heartbeat Interval": "Prüfintervall",
+    "Retries": "Wiederholungen",
+    "retriesDescription": "Maximale Anzahl von Wiederholungen, bevor der Dienst als inaktiv markiert und eine Benachrichtigung gesendet wird.",
+    "Advanced": "Erweitert",
+    "ignoreTLSError": "Ignoriere TLS-/SSL-Fehler von Webseiten",
+    "Upside Down Mode": "Umgekehrter Modus",
+    "upsideDownModeDescription": "Im umgekehrten Modus wird der Dienst als inaktiv angezeigt, wenn er erreichbar ist.",
+    "Max. Redirects": "Max. Weiterleitungen",
+    "maxRedirectDescription": "Maximale Anzahl von Weiterleitungen, denen gefolgt werden soll. Auf 0 setzen, um Weiterleitungen zu deaktivieren.",
+    "Accepted Status Codes": "Erlaubte HTTP-Statuscodes",
+    "acceptedStatusCodesDescription": "Statuscodes auswählen, die als erfolgreiche Verbindung gelten sollen.",
+    "Save": "Speichern",
+    "Notifications": "Benachrichtigungen",
+    "Not available, please setup.": "Nicht verfügbar, bitte einrichten.",
+    "Setup Notification": "Benachrichtigung einrichten",
+    "Light": "Hell",
+    "Dark": "Dunkel",
+    "Auto": "Auto",
+    "Theme - Heartbeat Bar": "Erscheinungsbild - Zeitleiste",
+    "Normal": "Normal",
+    "Bottom": "Unten",
+    "None": "Keine",
+    "Timezone": "Zeitzone",
+    "Search Engine Visibility": "Sichtbarkeit für Suchmaschinen",
+    "Allow indexing": "Indizierung zulassen",
+    "Discourage search engines from indexing site": "Suchmaschinen darum bitten, die Seite nicht zu indizieren",
+    "Change Password": "Passwort ändern",
+    "Current Password": "Aktuelles Passwort",
+    "New Password": "Neues Passwort",
+    "Repeat New Password": "Neues Passwort wiederholen",
+    "passwordNotMatchMsg": "Passwörter stimmen nicht überein.",
+    "Update Password": "Passwort aktualisieren",
+    "Disable Auth": "Authentifizierung deaktivieren",
+    "Enable Auth": "Authentifizierung aktivieren",
+    "disableauth.message1": "Bist du sicher das du die <strong>Authentifizierung deaktivieren</strong> möchtest?",
+    "disableauth.message2": "Dies ist für Szenarien gedacht, <strong>in denen man eine externe Authentifizierung</strong> vor Uptime Kuma geschaltet hat, wie z.B. Cloudflare Access, Authelia oder andere Authentifizierungsmechanismen.",
+    "Please use this option carefully!": "Bitte mit Vorsicht nutzen!",
+    "Logout": "Ausloggen",
+    "notificationDescription": "Benachrichtigungen müssen einem Monitor zugewiesen werden, damit diese funktionieren.",
+    "Leave": "Verlassen",
+    "I understand, please disable": "Ich verstehe, bitte deaktivieren",
+    "Confirm": "Bestätigen",
+    "Yes": "Ja",
+    "No": "Nein",
+    "Username": "Benutzername",
+    "Password": "Passwort",
+    "Remember me": "Angemeldet bleiben",
+    "Login": "Einloggen",
+    "No Monitors, please": "Keine Monitore, bitte",
+    "add one": "hinzufügen",
+    "Notification Type": "Benachrichtigungsdienst",
+    "Email": "E-Mail",
+    "Test": "Test",
+    "Certificate Info": "Zertifikatsinformation",
+    "keywordDescription": "Ein Suchwort in der HTML- oder JSON-Ausgabe finden. Bitte beachte: es wird zwischen Gross-/Kleinschreibung unterschieden.",
+    "deleteMonitorMsg": "Bist du sicher, dass du den Monitor löschen möchtest?",
+    "deleteNotificationMsg": "Möchtest du diese Benachrichtigung wirklich für alle Monitore löschen?",
+    "resolverserverDescription": "Cloudflare ist als der Standardserver festgelegt. Dieser kann jederzeit geändert werden.",
+    "Resolver Server": "Auflösungsserver",
+    "rrtypeDescription": "Wähle den RR-Typ aus, welchen du überwachen möchtest.",
+    "Last Result": "Letztes Ergebnis",
+    "pauseMonitorMsg": "Bist du sicher, dass du den Monitor pausieren möchtest?",
+    "clearEventsMsg": "Bist du sicher, dass du alle Ereignisse für diesen Monitor löschen möchtest?",
+    "clearHeartbeatsMsg": "Bist du sicher, dass du alle Statistiken für diesen Monitor löschen möchtest?",
+    "Clear Data": "Lösche Daten",
+    "Events": "Ereignisse",
+    "Heartbeats": "Statistiken",
+    "confirmClearStatisticsMsg": "Bist du dir sicher, dass du ALLE Statistiken löschen möchtest?",
+    "Create your admin account": "Erstelle dein Admin-Konto",
+    "Repeat Password": "Passwort erneut eingeben",
+    "Resource Record Type": "Ressourcen Record Typ",
+    "Export": "Export",
+    "Import": "Import",
+    "respTime": "Antw.-Zeit (ms)",
+    "notAvailableShort": "N/A",
+    "Default enabled": "Standardmässig aktiviert",
+    "Apply on all existing monitors": "Auf alle existierenden Monitore anwenden",
+    "enableDefaultNotificationDescription": "Für jeden neuen Monitor wird diese Benachrichtigung standardmässig aktiviert. Die Benachrichtigung kann weiterhin für jeden Monitor separat deaktiviert werden.",
+    "Create": "Erstellen",
+    "Auto Get": "Auto Get",
+    "backupDescription": "Es können alle Monitore und Benachrichtigungen in einer JSON-Datei gesichert werden.",
+    "backupDescription2": "PS: Verlaufs- und Ereignisdaten sind nicht enthalten.",
+    "backupDescription3": "Sensible Daten wie Benachrichtigungs-Token sind in der Exportdatei enthalten, bitte bewahre sie sorgfältig auf.",
+    "alertNoFile": "Bitte wähle eine Datei zum Importieren aus.",
+    "alertWrongFileType": "Bitte wähle eine JSON-Datei aus.",
+    "Clear all statistics": "Lösche alle Statistiken",
+    "importHandleDescription": "Wähle 'Vorhandene überspringen' aus, wenn jeder Monitor oder jede Benachrichtigung mit demselben Namen übersprungen werden soll. 'Überschreiben' löscht jeden vorhandenen Monitor sowie Benachrichtigungen.",
+    "Skip existing": "Vorhandene überspringen",
+    "Overwrite": "Überschreiben",
+    "Options": "Optionen",
+    "confirmImportMsg": "Möchtest du das Backup wirklich importieren? Bitte stelle sicher, dass die richtige Import-Option ausgewählt ist.",
+    "Keep both": "Beide behalten",
+    "twoFAVerifyLabel": "Bitte trage deinen Token ein, um zu verifizieren, dass 2FA funktioniert",
+    "Verify Token": "Token verifizieren",
+    "Setup 2FA": "2FA einrichten",
+    "Enable 2FA": "2FA aktivieren",
+    "Disable 2FA": "2FA deaktivieren",
+    "2FA Settings": "2FA-Einstellungen",
+    "confirmEnableTwoFAMsg": "Bist du sicher, dass du 2FA aktivieren möchtest?",
+    "confirmDisableTwoFAMsg": "Bist du sicher, dass du 2FA deaktivieren möchtest?",
+    "tokenValidSettingsMsg": "Token gültig! Du kannst jetzt die 2FA-Einstellungen speichern.",
+    "Two Factor Authentication": "Zwei-Faktor-Authentifizierung",
+    "Active": "Aktiv",
+    "Inactive": "Inaktiv",
+    "Token": "Token",
+    "Show URI": "URI anzeigen",
+    "Tags": "Tags",
+    "Add New below or Select...": "Einen bestehenden Tag auswählen oder neuen hinzufügen…",
+    "Tag with this name already exist.": "Ein Tag mit diesem Namen existiert bereits.",
+    "Tag with this value already exist.": "Ein Tag mit diesem Wert existiert bereits.",
+    "color": "Farbe",
+    "value (optional)": "Wert (optional)",
+    "Gray": "Grau",
+    "Red": "Rot",
+    "Orange": "Orange",
+    "Green": "Grün",
+    "Blue": "Blau",
+    "Indigo": "Indigo",
+    "Purple": "Lila",
+    "Pink": "Pink",
+    "Search...": "Suchen…",
+    "Heartbeat Retry Interval": "Überprüfungsintervall",
+    "Resend Notification if Down X times consecutively": "Benachrichtigung erneut senden, wenn Inaktiv X mal hintereinander",
+    "retryCheckEverySecond": "Alle {0} Sekunden neu versuchen",
+    "resendEveryXTimes": "Erneut versenden alle {0} mal",
+    "resendDisabled": "Erneut versenden deaktiviert",
+    "Import Backup": "Backup importieren",
+    "Export Backup": "Backup exportieren",
+    "Avg. Ping": "Ping ø",
+    "Avg. Response": "Antwortzeit ø",
+    "Entry Page": "Einstiegsseite",
+    "statusPageNothing": "Noch ist hier nichts. Bitte füge eine Gruppe oder einen Monitor hinzu.",
+    "No Services": "Keine Dienste",
+    "All Systems Operational": "Alle Systeme betriebsbereit",
+    "Partially Degraded Service": "Teilweise beeinträchtigter Dienst",
+    "Degraded Service": "Eingeschränkter Dienst",
+    "Add Group": "Gruppe hinzufügen",
+    "Add a monitor": "Monitor hinzufügen",
+    "Edit Status Page": "Bearbeite Status-Seite",
+    "Go to Dashboard": "Gehe zum Dashboard",
+    "Status Page": "Status-Seite",
+    "Status Pages": "Status-Seiten",
+    "telegram": "Telegram",
+    "webhook": "Webhook",
+    "smtp": "E-Mail (SMTP)",
+    "discord": "Discord",
+    "teams": "Microsoft Teams",
+    "signal": "Signal",
+    "gotify": "Gotify",
+    "slack": "Slack",
+    "rocket.chat": "Rocket.chat",
+    "pushover": "Pushover",
+    "pushy": "Pushy",
+    "octopush": "Octopush",
+    "promosms": "PromoSMS",
+    "lunasea": "LunaSea",
+    "apprise": "Apprise (Unterstützung für 50+ Benachrichtigungsdienste)",
+    "GoogleChat": "Google Chat (nur Google Workspace)",
+    "pushbullet": "Pushbullet",
+    "line": "Line Messenger",
+    "mattermost": "Mattermost",
+    "Primary Base URL": "Primär URL",
+    "Push URL": "Push URL",
+    "needPushEvery": "Du solltest diese URL alle {0} Sekunden aufrufen",
+    "pushOptionalParams": "Optionale Parameter: {0}",
+    "defaultNotificationName": "Mein {notification} Alarm ({number})",
+    "here": "hier",
+    "Required": "Erforderlich",
+    "Bot Token": "Bot Token",
+    "wayToGetTelegramToken": "Hier kannst du einen Token erhalten {0}.",
+    "Chat ID": "Chat ID",
+    "supportTelegramChatID": "Unterstützt Direkt Chat / Gruppe / Kanal Chat-ID's",
+    "wayToGetTelegramChatID": "Du kannst die Chat-ID erhalten, indem du eine Nachricht an den Bot sendest und zu dieser URL gehst, um die chat_id: zu sehen.",
+    "YOUR BOT TOKEN HERE": "HIER DEIN BOT TOKEN",
+    "chatIDNotFound": "Chat-ID wurde nicht gefunden: bitte sende zuerst eine Nachricht an diesen Bot",
+    "Post URL": "Post URL",
+    "Content Type": "Content Type",
+    "webhookJsonDesc": "{0} ist gut für alle modernen HTTP-Server, wie z.B. Express.js, geeignet",
+    "webhookFormDataDesc": "{multipart} ist gut für PHP. Das JSON muss mit {decodeFunction} verarbeitet werden",
+    "secureOptionNone": "Keine / STARTTLS (25, 587)",
+    "secureOptionTLS": "TLS (465)",
+    "Ignore TLS Error": "TLS-Fehler ignorieren",
+    "From Email": "Absender E-Mail",
+    "emailCustomSubject": "Benutzerdefinierter Betreff",
+    "To Email": "Empfänger E-Mail",
+    "smtpCC": "CC",
+    "smtpBCC": "BCC",
+    "Discord Webhook URL": "Discord Webhook URL",
+    "wayToGetDiscordURL": "Du kannst diese erhalten, indem du zu den Servereinstellungen gehst -> Integrationen -> Neuer Webhook",
+    "Bot Display Name": "Bot-Anzeigename",
+    "Prefix Custom Message": "Benutzerdefinierter Nachrichten Präfix",
+    "Hello @everyone is...": "Hallo {'@'}everyone ist…",
+    "Webhook URL": "Webhook URL",
+    "wayToGetTeamsURL": "Wie eine Webhook-URL erstellt werden kann, erfährst du {0}.",
+    "Number": "Nummer",
+    "Recipients": "Empfänger",
+    "needSignalAPI": "Es wird ein Signal Client mit REST-API benötigt.",
+    "wayToCheckSignalURL": "Du kannst diese URL aufrufen, um zu sehen, wie du eine einrichtest:",
+    "signalImportant": "WICHTIG: Gruppen und Nummern können in Empfängern nicht gemischt werden!",
+    "Application Token": "Anwendungstoken",
+    "Server URL": "Server URL",
+    "Priority": "Priorität",
+    "Icon Emoji": "Icon Emoji",
+    "Channel Name": "Kanalname",
+    "Uptime Kuma URL": "Uptime Kuma URL",
+    "aboutWebhooks": "Weitere Informationen zu Webhooks auf: {0}",
+    "aboutChannelName": "Gebe den Kanalnamen ein in {0} Feld Kanalname, falls du den Webhook-Kanal umgehen möchtest. Ex: #other-channel",
+    "aboutKumaURL": "Wenn das Feld für die Uptime Kuma URL leer gelassen wird, wird standardmässig die GitHub Projekt Seite verwendet.",
+    "emojiCheatSheet": "Emoji Cheat Sheet: {0}",
+    "User Key": "Benutzerschlüssel",
+    "Device": "Gerät",
+    "Message Title": "Nachrichtentitel",
+    "Notification Sound": "Benachrichtigungston",
+    "More info on:": "Mehr Infos auf: {0}",
+    "pushoverDesc1": "Notfallpriorität (2) hat standardmässig 30 Sekunden Auszeit zwischen den Versuchen und läuft nach 1 Stunde ab.",
+    "pushoverDesc2": "Fülle das Geräte Feld aus, wenn du Benachrichtigungen an verschiedene Geräte senden möchtest.",
+    "SMS Type": "SMS Typ",
+    "octopushTypePremium": "Premium (Schnell - zur Benachrichtigung empfohlen)",
+    "octopushTypeLowCost": "Kostengünstig (Langsam - manchmal vom Betreiber gesperrt)",
+    "checkPrice": "Prüfe {0} Preise:",
+    "octopushLegacyHint": "Verwendest du die Legacy-Version von Octopush (2011-2020) oder die neue Version?",
+    "Check octopush prices": "Vergleiche die Oktopush Preise {0}.",
+    "octopushPhoneNumber": "Telefonnummer (Internationales Format, z.B : +49612345678) ",
+    "octopushSMSSender": "Name des SMS-Absenders : 3-11 alphanumerische Zeichen und Leerzeichen (a-zA-Z0-9)",
+    "LunaSea Device ID": "LunaSea Geräte ID",
+    "Apprise URL": "Apprise URL",
+    "Example:": "Beispiel: {0}",
+    "Read more:": "Weiterlesen: {0}",
+    "Status:": "Status: {0}",
+    "Read more": "Weiterlesen",
+    "appriseInstalled": "Apprise ist installiert.",
+    "appriseNotInstalled": "Apprise ist nicht installiert. {0}",
+    "Access Token": "Access Token",
+    "Channel access token": "Channel access token",
+    "Line Developers Console": "Line Developers Console",
+    "lineDevConsoleTo": "Line Developers Console - {0}",
+    "Basic Settings": "Basic Settings",
+    "User ID": "User ID",
+    "Messaging API": "Messaging API",
+    "wayToGetLineChannelToken": "Rufe zuerst {0} auf, erstelle dann einen Provider und Channel (Messaging API). Als nächstes kannst du den Channel access token und die User ID aus den oben genannten Menüpunkten abrufen.",
+    "Icon URL": "Icon URL",
+    "aboutIconURL": "Du kannst einen Link zu einem Bild in 'Icon URL' übergeben um das Standardprofilbild zu überschreiben. Wird nicht verwendet, wenn ein Icon Emoji gesetzt ist.",
+    "aboutMattermostChannelName": "Du kannst den Standardkanal, auf dem der Webhook gesendet wird überschreiben, indem der Kanalnamen in das Feld 'Channel Name' eingeben wird. Dies muss in den Mattermost Webhook-Einstellungen aktiviert werden. Ex: #other-channel",
+    "matrix": "Matrix",
+    "promosmsTypeEco": "SMS ECO - billig, aber langsam und oft überladen. Auf polnische Empfänger beschränkt.",
+    "promosmsTypeFlash": "SMS FLASH - Die Nachricht wird automatisch auf dem Empfängergerät angezeigt. Auf polnische Empfänger beschränkt.",
+    "promosmsTypeFull": "SMS FULL - Premium Stufe von SMS, es kann der Absendernamen verwendet werden (Der Name musst zuerst registriert werden). Zuverlässig für Warnungen.",
+    "promosmsTypeSpeed": "SMS SPEED - Höchste Priorität im System. Sehr schnell und zuverlässig, aber teuer (Ungefähr das doppelte von SMS FULL).",
+    "promosmsPhoneNumber": "Telefonnummer (für polnische Empfänger können die Vorwahlen übersprungen werden)",
+    "promosmsSMSSender": "Name des SMS-Absenders : vorregistrierter Name oder einer der Standardwerte: InfoSMS, SMS Info, MaxSMS, INFO, SMS",
+    "Feishu WebHookUrl": "Feishu Webhook URL",
+    "matrixHomeserverURL": "Heimserver URL (mit http(s):// und optionalen Ports)",
+    "Internal Room Id": "Interne Raum-ID",
+    "matrixDesc1": "Die interne Raum-ID findest du im erweiterten Bereich der Raumeinstellungen im Matrix-Client. Es sollte aussehen wie z.B. !QMdRCpUIfLwsfjxye6:home.server.",
+    "matrixDesc2": "Es wird dringend empfohlen einen neuen Benutzer anzulegen und nicht den Zugriffstoken deines eigenen Matrix-Benutzers zu verwenden. Anderenfalls ermöglicht es vollen Zugriff auf dein Konto und alle Räume, denen du beigetreten bist. Erstelle stattdessen einen neuen Benutzer und lade ihn nur in den Raum ein, in dem du die Benachrichtigung erhalten möchtest. Du kannst den Zugriffstoken erhalten, indem du Folgendes ausführst {0}",
+    "Method": "Method",
+    "Body": "Body",
+    "Headers": "Headers",
+    "PushUrl": "Push URL",
+    "HeadersInvalidFormat": "Der Header ist kein gültiges JSON: ",
+    "BodyInvalidFormat": "Der Body ist kein gültiges JSON: ",
+    "Monitor History": "Monitor Verlauf",
+    "clearDataOlderThan": "Bewahre die Aufzeichnungsdaten für {0} Tage auf.",
+    "PasswordsDoNotMatch": "Passwörter stimmen nicht überein.",
+    "records": "Einträge",
+    "One record": "Ein Eintrag",
+    "steamApiKeyDescription": "Um einen Steam Game Server zu überwachen, wird ein Steam Web-API-Schlüssel benötigt. Dieser kann hier registriert werden: ",
+    "Current User": "Aktueller Benutzer",
+    "recent": "Letzte",
+    "Done": "Fertig",
+    "Info": "Info",
+    "Security": "Sicherheit",
+    "Steam API Key": "Steam API Key",
+    "Shrink Database": "Datenbank verkleinern",
+    "Pick a RR-Type...": "Wähle ein RR-Typ aus…",
+    "Pick Accepted Status Codes...": "Wähle akzeptierte Statuscodes aus…",
+    "Default": "Standard",
+    "HTTP Options": "HTTP Optionen",
+    "Create Incident": "Vorfall erstellen",
+    "Title": "Titel",
+    "Content": "Inhalt",
+    "Style": "Stil",
+    "info": "info",
+    "warning": "warnung",
+    "danger": "gefahr",
+    "primary": "primär",
+    "light": "hell",
+    "dark": "dunkel",
+    "Post": "Eintrag",
+    "Please input title and content": "Bitte Titel und Inhalt eingeben",
+    "Created": "Erstellt",
+    "Last Updated": "Zuletzt aktualisiert",
+    "Unpin": "Loslösen",
+    "Switch to Light Theme": "Zu hellem Thema wechseln",
+    "Switch to Dark Theme": "Zum dunklen Thema wechseln",
+    "Show Tags": "Tags anzeigen",
+    "Hide Tags": "Tags ausblenden",
+    "Description": "Beschreibung",
+    "No monitors available.": "Keine Monitore verfügbar.",
+    "Add one": "Hinzufügen",
+    "No Monitors": "Keine Monitore",
+    "Untitled Group": "Gruppe ohne Titel",
+    "Services": "Dienste",
+    "Discard": "Verwerfen",
+    "Cancel": "Abbrechen",
+    "Powered by": "Powered by",
+    "shrinkDatabaseDescription": "Löse VACUUM für die SQLite Datenbank aus. Wenn die Datenbank nach 1.10.0 erstellt wurde, ist AUTO_VACUUM bereits aktiviert und diese Aktion ist nicht erforderlich.",
+    "serwersms": "SerwerSMS.pl",
+    "serwersmsAPIUser": "API Benutzername (inkl. webapi_ prefix)",
+    "serwersmsAPIPassword": "API Passwort",
+    "serwersmsPhoneNumber": "Telefonnummer",
+    "serwersmsSenderName": "Name des SMS-Absenders (über Kundenportal registriert)",
+    "stackfield": "Stackfield",
+    "clicksendsms": "ClickSend SMS",
+    "apiCredentials": "API Zugangsdaten",
+    "smtpDkimSettings": "DKIM Einstellungen",
+    "smtpDkimDesc": "Details zur Konfiguration sind in der Nodemailer DKIM {0} zu finden.",
+    "documentation": "Dokumentation",
+    "smtpDkimDomain": "Domain Name",
+    "smtpDkimKeySelector": "Schlüssel Auswahl",
+    "smtpDkimPrivateKey": "Privater Schlüssel",
+    "smtpDkimHashAlgo": "Hash-Algorithmus (Optional)",
+    "smtpDkimheaderFieldNames": "Zu validierende Header-Schlüssel (optional)",
+    "smtpDkimskipFields": "Zu ignorierende Header Schlüssel (optional)",
+    "PushByTechulus": "Push by Techulus",
+    "gorush": "Gorush",
+    "alerta": "Alerta",
+    "alertaApiEndpoint": "API Endpunkt",
+    "alertaEnvironment": "Umgebung",
+    "alertaApiKey": "API Schlüssel",
+    "alertaAlertState": "Alarmstatus",
+    "alertaRecoverState": "Wiederherstellungsstatus",
+    "deleteStatusPageMsg": "Bist du sicher, dass du diese Status-Seite löschen willst?",
+    "Proxies": "Proxies",
+    "default": "Standard",
+    "enabled": "Aktiviert",
+    "setAsDefault": "Als Standard setzen",
+    "deleteProxyMsg": "Bist du sicher, dass du diesen Proxy für alle Monitore löschen willst?",
+    "proxyDescription": "Proxies müssen einem Monitor zugewiesen werden, um zu funktionieren.",
+    "enableProxyDescription": "Dieser Proxy wird keinen Effekt auf Monitor-Anfragen haben, bis er aktiviert ist. Du kannst ihn temporär von allen Monitoren nach Aktivierungsstatus deaktivieren.",
+    "setAsDefaultProxyDescription": "Dieser Proxy wird standardmässig für alle neuen Monitore aktiviert sein. Du kannst den Proxy immer noch für jeden Monitor einzeln deaktivieren.",
+    "Certificate Chain": "Zertifikatskette",
+    "Valid": "Gültig",
+    "Invalid": "Ungültig",
+    "AccessKeyId": "AccessKey ID",
+    "SecretAccessKey": "AccessKey Secret",
+    "PhoneNumbers": "Telefonnummern",
+    "TemplateCode": "Vorlagencode",
+    "SignName": "Signaturname",
+    "Sms template must contain parameters: ": "SMS Vorlage muss folgende Parameter enthalten: ",
+    "Bark Endpoint": "Bark Endpunkt",
+    "WebHookUrl": "Webhook URL",
+    "SecretKey": "Geheimer Schlüssel",
+    "For safety, must use secret key": "Zur Sicherheit muss ein geheimer Schlüssel verwendet werden",
+    "Device Token": "Gerätetoken",
+    "Platform": "Platform",
+    "iOS": "iOS",
+    "Android": "Android",
+    "Huawei": "Huawei",
+    "High": "Hoch",
+    "Retry": "Wiederholungen",
+    "Topic": "Thema",
+    "WeCom Bot Key": "WeCom Bot Schlüssel",
+    "Setup Proxy": "Proxy einrichten",
+    "Proxy Protocol": "Proxy Protokoll",
+    "Proxy Server": "Proxy-Server",
+    "Proxy server has authentication": "Proxy-Server hat Authentifizierung",
+    "User": "Benutzer",
+    "Installed": "Installiert",
+    "Not installed": "Nicht installiert",
+    "Running": "Läuft",
+    "Not running": "Gestoppt",
+    "Remove Token": "Token entfernen",
+    "Start": "Start",
+    "Stop": "Stop",
+    "Uptime Kuma": "Uptime Kuma",
+    "Add New Status Page": "Neue Status-Seite hinzufügen",
+    "Slug": "Slug",
+    "Accept characters:": "Akzeptierte Zeichen:",
+    "startOrEndWithOnly": "Nur mit {0} anfangen und enden",
+    "No consecutive dashes": "Keine aufeinanderfolgenden Bindestriche",
+    "Next": "Weiter",
+    "The slug is already taken. Please choose another slug.": "Der Slug ist bereits in Verwendung. Bitte wähle einen anderen.",
+    "No Proxy": "Kein Proxy",
+    "Authentication": "Authentifizierung",
+    "HTTP Basic Auth": "HTTP Basisauthentifizierung",
+    "New Status Page": "Neue Status-Seite",
+    "Page Not Found": "Seite nicht gefunden",
+    "Reverse Proxy": "Reverse Proxy",
+    "Backup": "Sicherung",
+    "About": "Über",
+    "wayToGetCloudflaredURL": "(Lade Cloudflare von {0} herunter)",
+    "cloudflareWebsite": "Cloudflare Website",
+    "Message:": "Nachricht:",
+    "Don't know how to get the token? Please read the guide:": "Du weisst nicht, wie man den Token bekommt? Lies die Anleitung dazu:",
+    "The current connection may be lost if you are currently connecting via Cloudflare Tunnel. Are you sure want to stop it? Type your current password to confirm it.": "Die aktuelle Verbindung kann unterbrochen werden, wenn du aktuell über Cloudflare Tunnel verbunden bist. Bist du sicher, dass du es stoppen willst? Gib zur Bestätigung dein aktuelles Passwort ein.",
+    "Other Software": "Andere Software",
+    "For example: nginx, Apache and Traefik.": "Zum Beispiel: nginx, Apache und Traefik.",
+    "Please read": "Bitte lesen",
+    "Subject:": "Betreff:",
+    "Valid To:": "Gültig bis:",
+    "Days Remaining:": "Tage verbleibend:",
+    "Issuer:": "Aussteller:",
+    "Fingerprint:": "Fingerabdruck:",
+    "No status pages": "Keine Status-Seiten",
+    "Domain Name Expiry Notification": "Benachrichtigung bei Ablauf des Domainnamens",
+    "Customize": "Anpassen",
+    "Custom Footer": "Eigener Footer",
+    "Custom CSS": "Eigenes CSS",
+    "Footer Text": "Fusszeile",
+    "Show Powered By": "Zeige 'Powered By'",
+    "Date Created": "Erstellt am",
+    "Domain Names": "Domainnamen",
+    "signedInDisp": "Angemeldet als {0}",
+    "signedInDispDisabled": "Authentifizierung deaktiviert.",
+    "dnsPortDescription": "DNS server port. Standard ist 53. Der Port kann jederzeit geändert werden.",
+    "topic": "Thema",
+    "topicExplanation": "MQTT Thema für den monitor",
+    "successMessage": "Erfolgsnachricht",
+    "successMessageExplanation": "MQTT Nachricht, die als Erfolg angesehen wird",
+    "error": "Fehler",
+    "critical": "kritisch",
+    "wayToGetPagerDutyKey": "Dieser kann unter Service -> Service Directory -> (Select a service) -> Integrations -> Add integration gefunden werden. Hier muss nach \"Events API V2\" gesucht werden. Mehr informationen {0}",
+    "Integration Key": "Schlüssel der Integration",
+    "Integration URL": "URL der Integration",
+    "Auto resolve or acknowledged": "Automatisch lösen oder bestätigen",
+    "do nothing": "nichts tun",
+    "auto acknowledged": "automatisch bestätigen",
+    "auto resolve": "automatisch lösen",
+    "Bark Group": "Bark Gruppe",
+    "Bark Sound": "Bark Klang",
+    "HTTP Headers": "HTTP Kopfzeilen",
+    "Trust Proxy": "Vertrauenswürdiger Proxy",
+    "Proxy": "Proxy",
+    "HomeAssistant": "Home Assistant",
+    "onebotHttpAddress": "OneBot HTTP Adresse",
+    "onebotMessageType": "OneBot Nachrichtentyp",
+    "onebotGroupMessage": "Gruppe",
+    "onebotPrivateMessage": "Privat",
+    "onebotUserOrGroupId": "Gruppe/Nutzer ID",
+    "onebotSafetyTips": "Zur Sicherheit ein access token setzen",
+    "PushDeer Key": "PushDeer Schlüssel",
+    "RadiusSecret": "Radius Geheimnis",
+    "RadiusSecretDescription": "Geteiltes Geheimnis zwischen Client und Server",
+    "RadiusCalledStationId": "ID der angesprochenen Station",
+    "RadiusCalledStationIdDescription": "Identifikation des angesprochenen Geräts",
+    "RadiusCallingStationId": "ID der ansprechenden Station",
+    "RadiusCallingStationIdDescription": "Identifikation des ansprechenden Geräts",
+    "Certificate Expiry Notification": "Benachrichtigung ablaufendes Zertifikat",
+    "API Username": "API Nutzername",
+    "API Key": "API Schlüssel",
+    "Recipient Number": "Empfängernummer",
+    "From Name/Number": "Von Name/Nummer",
+    "Leave blank to use a shared sender number.": "Leer lassen um eine geteilte Absendernummer zu nutzen.",
+    "Octopush API Version": "Octopush API Version",
+    "Legacy Octopush-DM": "Legacy Octopush-DM",
+    "endpoint": "Endpunkt",
+    "octopushAPIKey": "\"API Schlüssel\" der HTTP API Zugangsdaten im control panel",
+    "octopushLogin": "\"Login\" der HTTP API Zugangsdaten im control panel",
+    "promosmsLogin": "API Login Name",
+    "promosmsPassword": "API Password",
+    "pushoversounds pushover": "Pushover (Standard)",
+    "pushoversounds bike": "Fahrrad",
+    "pushoversounds bugle": "Signalhorn",
+    "pushoversounds cashregister": "Kasse",
+    "pushoversounds classical": "Klassisch",
+    "pushoversounds cosmic": "Kosmisch",
+    "pushoversounds falling": "Abfallend",
+    "pushoversounds gamelan": "Gamelan",
+    "pushoversounds incoming": "Eingang",
+    "pushoversounds intermission": "Pause",
+    "pushoversounds magic": "Magisch",
+    "pushoversounds mechanical": "Mechanisch",
+    "pushoversounds pianobar": "Piano Bar",
+    "pushoversounds siren": "Sirene",
+    "pushoversounds spacealarm": "Space Alarm",
+    "pushoversounds tugboat": "Schlepper Horn",
+    "pushoversounds alien": "Ausserirdisch (lang)",
+    "pushoversounds climb": "Ansteigende (lang)",
+    "pushoversounds persistent": "Hartnäckig (lang)",
+    "pushoversounds echo": "Pushover Echo (lang)",
+    "pushoversounds updown": "Auf und Ab (lang)",
+    "pushoversounds vibrate": "Nur vibrieren",
+    "pushoversounds none": "Nichts (Stille)",
+    "pushyAPIKey": "Geheimer API Schlüssel",
+    "pushyToken": "Gerätetoken",
+    "Show update if available": "Verfügbare Updates anzeigen",
+    "Also check beta release": "Auch nach beta Versionen schauen",
+    "Using a Reverse Proxy?": "Wird ein Reverse Proxy genutzt?",
+    "Check how to config it for WebSocket": "Prüfen, wie er für die Nutzung mit WebSocket konfiguriert wird",
+    "Steam Game Server": "Steam Game Server",
+    "Most likely causes:": "Wahrscheinliche Ursachen:",
+    "The resource is no longer available.": "Die Quelle ist nicht mehr verfügbar.",
+    "There might be a typing error in the address.": "Es gibt einen Tippfehler in der Adresse.",
+    "What you can try:": "Was du versuchen kannst:",
+    "Retype the address.": "Schreibe die Adresse erneut.",
+    "Go back to the previous page.": "Gehe zur vorigen Seite.",
+    "Coming Soon": "Kommt bald",
+    "wayToGetClickSendSMSToken": "Du kannst einen API Nutzernamen und Schlüssel unter {0} erhalten.",
+    "Connection String": "Verbindungstext",
+    "Query": "Abfrage",
+    "settingsCertificateExpiry": "TLS Zertifikatsablauf",
+    "certificationExpiryDescription": "HTTPS Monitore senden eine Benachrichtigung, wenn das Zertifikat abläuft in:",
+    "Setup Docker Host": "Docker Host einrichten",
+    "Connection Type": "Verbindungstyp",
+    "Docker Daemon": "Docker Daemon",
+    "deleteDockerHostMsg": "Bist du sicher diesen docker host für alle Monitore zu löschen?",
+    "socket": "Socket",
+    "tcp": "TCP / HTTP",
+    "Docker Container": "Docker Container",
+    "Container Name / ID": "Container Name / ID",
+    "Docker Host": "Docker Host",
+    "Docker Hosts": "Docker Hosts",
+    "ntfy Topic": "ntfy Thema",
+    "Domain": "Domain",
+    "Workstation": "Workstation",
+    "disableCloudflaredNoAuthMsg": "Du bist im nicht-authentifizieren Modus, ein Passwort wird nicht benötigt.",
+    "trustProxyDescription": "Vertraue 'X-Forwarded-*' headern. Wenn man die richtige client IP haben möchte und Uptime Kuma hinter einem Proxy wie Nginx or Apache läuft, wollte dies aktiviert werden.",
+    "wayToGetLineNotifyToken": "Du kannst hier ein Token erhalten: {0}",
+    "Examples": "Beispiele",
+    "Home Assistant URL": "Home Assistant URL",
+    "Long-Lived Access Token": "Lange gültiges Access Token",
+    "Long-Lived Access Token can be created by clicking on your profile name (bottom left) and scrolling to the bottom then click Create Token. ": "Lange gültige Access Token können durch klicken auf den Profilnamen (unten links) und dann einen Klick auf Create Token am Ende erstellt werden. ",
+    "Notification Service": "Benachrichtigungsdienst",
+    "default: notify all devices": "standard: Alle Geräte benachrichtigen",
+    "A list of Notification Services can be found in Home Assistant under \"Developer Tools > Services\" search for \"notification\" to find your device/phone name.": "Eine Liste der Benachrichtigungsdienste kann im Home Assistant unter \"Developer Tools > Services\" gefunden werden, wnen man nach \"notification\" sucht um den Geräte-/Telefonnamen zu finden.",
+    "Automations can optionally be triggered in Home Assistant:": "Automatisierungen können optional im Home Assistant ausgelöst werden:",
+    "Trigger type:": "Auslöser:",
+    "Event type:": "Ereignistyp:",
+    "Event data:": "Ereignis daten:",
+    "Then choose an action, for example switch the scene to where an RGB light is red.": "Dann eine Aktion wählen, zum Beispiel eine Scene wählen in der ein RGB Licht rot ist.",
+    "Frontend Version": "Frontend Version",
+    "Frontend Version do not match backend version!": "Die Frontend Version stimmt nicht mit der backend version überein!",
+    "Maintenance": "Wartung",
+    "statusMaintenance": "Wartung",
+    "Schedule maintenance": "Geplante Wartung",
+    "Affected Monitors": "Betroffene Monitore",
+    "Pick Affected Monitors...": "Wähle betroffene Monitore…",
+    "Start of maintenance": "Beginn der Wartung",
+    "All Status Pages": "Alle Status Seiten",
+    "Select status pages...": "Wähle Status Seiten…",
+    "recurringIntervalMessage": "einmal pro Tag ausgeführt | Wird alle {0} Tage ausgführt",
+    "affectedMonitorsDescription": "Wähle alle Monitore die von der Wartung betroffen sind",
+    "affectedStatusPages": "Zeige diese Nachricht auf ausgewählten Status Seiten",
+    "atLeastOneMonitor": "Wähle mindestens einen Monitor",
+    "deleteMaintenanceMsg": "Möchtest du diese Wartung löschen?",
+    "Base URL": "Basis URL",
+    "goAlertInfo": "GoAlert ist eine Open-Source Applikation für Rufbereitschaftsplanung, automatische Eskalation und Benachrichtigung (z.B. SMS oder Telefonanrufe). Beauftragen Sie automatisch die richtige Person, auf die richtige Art und Weise und zum richtigen Zeitpunkt. {0}",
+    "goAlertIntegrationKeyInfo": "Bekommt einen generischen API Schlüssel in folgenden Format \"aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee\". Normalerweise entspricht dies dem Wert des Token aus der URL.",
+    "goAlert": "GoAlert",
+    "backupOutdatedWarning": "Veraltet: Eine menge Neuerungen sind eingeflossen und diese Funktion wurde etwas vernachlässigt worden. Es kann kein vollständiges Backup erstellt oder eingespielt werden.",
+    "backupRecommend": "Bitte Backup das Volume oder den Ordner (./ data /) selbst.",
+    "Optional": "Optional",
+    "squadcast": "Squadcast",
+    "SendKey": "SendKey",
+    "SMSManager API Docs": "SMSManager API Dokumente",
+    "Gateway Type": "Gateway Type",
+    "SMSManager": "SMSManager",
+    "You can divide numbers with": "Du kannst Zahlen teilen mit",
+    "or": "oder",
+    "recurringInterval": "Intervall",
+    "Recurring": "Wiederkehrend",
+    "strategyManual": "Active/Inactive Manually",
+    "warningTimezone": "Es wird die Zeitzone des Servers genutzt",
+    "weekdayShortMon": "Mo",
+    "weekdayShortTue": "Di",
+    "weekdayShortWed": "Mi",
+    "weekdayShortThu": "Do",
+    "weekdayShortFri": "Fr",
+    "weekdayShortSat": "Sa",
+    "weekdayShortSun": "So",
+    "dayOfWeek": "Tag der Woche",
+    "dayOfMonth": "Tag im Monat",
+    "lastDay": "Letzter Tag",
+    "lastDay1": "Letzter Tag im Monat",
+    "lastDay2": "Vorletzer Tag im Monat",
+    "lastDay3": "3. letzter Tag im Monat",
+    "lastDay4": "4. letzter Tag im Monat",
+    "No Maintenance": "Keine Wartung",
+    "pauseMaintenanceMsg": "Möchtest du wirklich pausieren?",
+    "maintenanceStatus-under-maintenance": "Unter Wartung",
+    "maintenanceStatus-inactive": "Inaktiv",
+    "maintenanceStatus-scheduled": "Geplant",
+    "maintenanceStatus-ended": "Ende",
+    "maintenanceStatus-unknown": "Unbekannt",
+    "Display Timezone": "Zeitzone anzeigen",
+    "Server Timezone": "Server Zeitzone"
+}
diff --git a/src/lang/de-DE.json b/src/lang/de-DE.json
new file mode 100644
index 000000000..2e7bbb5f3
--- /dev/null
+++ b/src/lang/de-DE.json
@@ -0,0 +1,700 @@
+{
+    "languageName": "Deutsch (Deutschland)",
+    "Settings": "Einstellungen",
+    "Dashboard": "Dashboard",
+    "New Update": "Update verfügbar",
+    "Language": "Sprache",
+    "Appearance": "Erscheinungsbild",
+    "Theme": "Erscheinungsbild",
+    "General": "Allgemein",
+    "Version": "Version",
+    "Check Update On GitHub": "Auf GitHub nach Updates suchen",
+    "List": "Liste",
+    "Add": "Hinzufügen",
+    "Add New Monitor": "Neuen Monitor hinzufügen",
+    "Quick Stats": "Übersicht",
+    "Up": "Aktiv",
+    "Down": "Inaktiv",
+    "Pending": "Ausstehend",
+    "Unknown": "Unbekannt",
+    "Pause": "Pausieren",
+    "pauseDashboardHome": "Pausiert",
+    "Name": "Name",
+    "Status": "Status",
+    "DateTime": "Datum / Uhrzeit",
+    "Message": "Nachricht",
+    "No important events": "Keine wichtigen Ereignisse",
+    "Resume": "Fortsetzen",
+    "Edit": "Bearbeiten",
+    "Delete": "Löschen",
+    "Current": "Aktuell",
+    "Uptime": "Verfügbarkeit",
+    "Cert Exp.": "Zertifikatsablauf",
+    "day": "Tag | Tage",
+    "-day": "-Tage",
+    "hour": "Stunde",
+    "-hour": "-Stunden",
+    "checkEverySecond": "Überprüfe alle {0} Sekunden",
+    "Response": "Antwortzeit",
+    "Ping": "Ping",
+    "Monitor Type": "Monitor-Typ",
+    "Keyword": "Suchwort",
+    "Friendly Name": "Anzeigename",
+    "URL": "URL",
+    "Hostname": "Hostname",
+    "Port": "Port",
+    "Heartbeat Interval": "Prüfintervall",
+    "Retries": "Wiederholungen",
+    "retriesDescription": "Maximale Anzahl von Wiederholungen, bevor der Dienst als inaktiv markiert und eine Benachrichtigung gesendet wird.",
+    "Advanced": "Erweitert",
+    "ignoreTLSError": "Ignoriere TLS-/SSL-Fehler von Webseiten",
+    "Upside Down Mode": "Umgekehrter Modus",
+    "upsideDownModeDescription": "Im umgekehrten Modus wird der Dienst als inaktiv angezeigt, wenn er erreichbar ist.",
+    "Max. Redirects": "Max. Weiterleitungen",
+    "maxRedirectDescription": "Maximale Anzahl von Weiterleitungen, denen gefolgt werden soll. Auf 0 setzen, um Weiterleitungen zu deaktivieren.",
+    "Accepted Status Codes": "Erlaubte HTTP-Statuscodes",
+    "acceptedStatusCodesDescription": "Statuscodes auswählen, die als erfolgreiche Verbindung gelten sollen.",
+    "Save": "Speichern",
+    "Notifications": "Benachrichtigungen",
+    "Not available, please setup.": "Nicht verfügbar, bitte einrichten.",
+    "Setup Notification": "Benachrichtigung einrichten",
+    "Light": "Hell",
+    "Dark": "Dunkel",
+    "Auto": "Auto",
+    "Theme - Heartbeat Bar": "Erscheinungsbild - Zeitleiste",
+    "Normal": "Normal",
+    "Bottom": "Unten",
+    "None": "Keine",
+    "Timezone": "Zeitzone",
+    "Search Engine Visibility": "Sichtbarkeit für Suchmaschinen",
+    "Allow indexing": "Indizierung zulassen",
+    "Discourage search engines from indexing site": "Suchmaschinen darum bitten, die Seite nicht zu indizieren",
+    "Change Password": "Passwort ändern",
+    "Current Password": "Aktuelles Passwort",
+    "New Password": "Neues Passwort",
+    "Repeat New Password": "Neues Passwort wiederholen",
+    "passwordNotMatchMsg": "Passwörter stimmen nicht überein.",
+    "Update Password": "Passwort aktualisieren",
+    "Disable Auth": "Authentifizierung deaktivieren",
+    "Enable Auth": "Authentifizierung aktivieren",
+    "disableauth.message1": "Bist du sicher das du die <strong>Authentifizierung deaktivieren</strong> möchtest?",
+    "disableauth.message2": "Dies ist für Szenarien gedacht, <strong>in denen man eine externe Authentifizierung</strong> vor Uptime Kuma geschaltet hat, wie z.B. Cloudflare Access, Authelia oder andere Authentifizierungsmechanismen.",
+    "Please use this option carefully!": "Bitte mit Vorsicht nutzen!",
+    "Logout": "Ausloggen",
+    "notificationDescription": "Benachrichtigungen müssen einem Monitor zugewiesen werden, damit diese funktionieren.",
+    "Leave": "Verlassen",
+    "I understand, please disable": "Ich verstehe, bitte deaktivieren",
+    "Confirm": "Bestätigen",
+    "Yes": "Ja",
+    "No": "Nein",
+    "Username": "Benutzername",
+    "Password": "Passwort",
+    "Remember me": "Angemeldet bleiben",
+    "Login": "Einloggen",
+    "No Monitors, please": "Keine Monitore, bitte",
+    "add one": "hinzufügen",
+    "Notification Type": "Benachrichtigungsdienst",
+    "Email": "E-Mail",
+    "Test": "Test",
+    "Certificate Info": "Zertifikatsinformation",
+    "keywordDescription": "Ein Suchwort in der HTML- oder JSON-Ausgabe finden. Bitte beachte: es wird zwischen Groß-/Kleinschreibung unterschieden.",
+    "deleteMonitorMsg": "Bist du sicher, dass du den Monitor löschen möchtest?",
+    "deleteNotificationMsg": "Möchtest du diese Benachrichtigung wirklich für alle Monitore löschen?",
+    "resolverserverDescription": "Cloudflare ist als der Standardserver festgelegt. Dieser kann jederzeit geändert werden.",
+    "Resolver Server": "Auflösungsserver",
+    "rrtypeDescription": "Wähle den RR-Typ aus, welchen du überwachen möchtest.",
+    "Last Result": "Letztes Ergebnis",
+    "pauseMonitorMsg": "Bist du sicher, dass du den Monitor pausieren möchtest?",
+    "clearEventsMsg": "Bist du sicher, dass du alle Ereignisse für diesen Monitor löschen möchtest?",
+    "clearHeartbeatsMsg": "Bist du sicher, dass du alle Statistiken für diesen Monitor löschen möchtest?",
+    "Clear Data": "Lösche Daten",
+    "Events": "Ereignisse",
+    "Heartbeats": "Statistiken",
+    "confirmClearStatisticsMsg": "Bist du dir sicher, dass du ALLE Statistiken löschen möchtest?",
+    "Create your admin account": "Erstelle dein Admin-Konto",
+    "Repeat Password": "Passwort erneut eingeben",
+    "Resource Record Type": "Ressourcen Record Typ",
+    "Export": "Export",
+    "Import": "Import",
+    "respTime": "Antw.-Zeit (ms)",
+    "notAvailableShort": "N/A",
+    "Default enabled": "Standardmäßig aktiviert",
+    "Apply on all existing monitors": "Auf alle existierenden Monitore anwenden",
+    "enableDefaultNotificationDescription": "Für jeden neuen Monitor wird diese Benachrichtigung standardmäßig aktiviert. Die Benachrichtigung kann weiterhin für jeden Monitor separat deaktiviert werden.",
+    "Create": "Erstellen",
+    "Auto Get": "Auto Get",
+    "backupDescription": "Es können alle Monitore und Benachrichtigungen in einer JSON-Datei gesichert werden.",
+    "backupDescription2": "PS: Verlaufs- und Ereignisdaten sind nicht enthalten.",
+    "backupDescription3": "Sensible Daten wie Benachrichtigungstoken sind in der Exportdatei enthalten, bitte bewahre sie sorgfältig auf.",
+    "alertNoFile": "Bitte wähle eine Datei zum Importieren aus.",
+    "alertWrongFileType": "Bitte wähle eine JSON-Datei aus.",
+    "Clear all statistics": "Lösche alle Statistiken",
+    "importHandleDescription": "Wähle 'Vorhandene überspringen' aus, wenn jeder Monitor oder jede Benachrichtigung mit demselben Namen übersprungen werden soll. 'Überschreiben' löscht jeden vorhandenen Monitor sowie Benachrichtigungen.",
+    "Skip existing": "Vorhandene überspringen",
+    "Overwrite": "Überschreiben",
+    "Options": "Optionen",
+    "confirmImportMsg": "Möchtest du das Backup wirklich importieren? Bitte stelle sicher, dass die richtige Import-Option ausgewählt ist.",
+    "Keep both": "Beide behalten",
+    "twoFAVerifyLabel": "Bitte trage deinen Token ein, um zu verifizieren, dass 2FA funktioniert:",
+    "Verify Token": "Token verifizieren",
+    "Setup 2FA": "2FA einrichten",
+    "Enable 2FA": "2FA aktivieren",
+    "Disable 2FA": "2FA deaktivieren",
+    "2FA Settings": "2FA-Einstellungen",
+    "confirmEnableTwoFAMsg": "Bist du sicher, dass du 2FA aktivieren möchtest?",
+    "confirmDisableTwoFAMsg": "Bist du sicher, dass du 2FA deaktivieren möchtest?",
+    "tokenValidSettingsMsg": "Token gültig! Du kannst jetzt die 2FA-Einstellungen speichern.",
+    "Two Factor Authentication": "Zwei-Faktor-Authentifizierung",
+    "Active": "Aktiv",
+    "Inactive": "Inaktiv",
+    "Token": "Token",
+    "Show URI": "URI anzeigen",
+    "Tags": "Tags",
+    "Add New below or Select...": "Einen bestehenden Tag auswählen oder neuen hinzufügen…",
+    "Tag with this name already exist.": "Ein Tag mit diesem Namen existiert bereits.",
+    "Tag with this value already exist.": "Ein Tag mit diesem Wert existiert bereits.",
+    "color": "Farbe",
+    "value (optional)": "Wert (optional)",
+    "Gray": "Grau",
+    "Red": "Rot",
+    "Orange": "Orange",
+    "Green": "Grün",
+    "Blue": "Blau",
+    "Indigo": "Indigo",
+    "Purple": "Lila",
+    "Pink": "Pink",
+    "Search...": "Suchen…",
+    "Heartbeat Retry Interval": "Überprüfungsintervall",
+    "Resend Notification if Down X times consecutively": "Benachrichtigung erneut senden, wenn inaktiv X Mal hintereinander",
+    "retryCheckEverySecond": "Alle {0} Sekunden neu versuchen",
+    "resendEveryXTimes": "Erneut versenden alle {0} mal",
+    "resendDisabled": "Erneut versenden deaktiviert",
+    "Import Backup": "Backup importieren",
+    "Export Backup": "Backup exportieren",
+    "Avg. Ping": "Durchschn. Ping",
+    "Avg. Response": "Durchschn. Antwort",
+    "Entry Page": "Einstiegsseite",
+    "statusPageNothing": "Noch ist hier nichts. Bitte füge eine Gruppe oder einen Monitor hinzu.",
+    "No Services": "Keine Dienste",
+    "All Systems Operational": "Alle Systeme betriebsbereit",
+    "Partially Degraded Service": "Teilweise beeinträchtigter Dienst",
+    "Degraded Service": "Eingeschränkter Dienst",
+    "Add Group": "Gruppe hinzufügen",
+    "Add a monitor": "Monitor hinzufügen",
+    "Edit Status Page": "Statusseite bearbeiten",
+    "Go to Dashboard": "Gehe zum Dashboard",
+    "Status Page": "Status-Seite",
+    "Status Pages": "Status-Seiten",
+    "telegram": "Telegram",
+    "webhook": "Webhook",
+    "smtp": "E-Mail (SMTP)",
+    "discord": "Discord",
+    "teams": "Microsoft Teams",
+    "signal": "Signal",
+    "gotify": "Gotify",
+    "slack": "Slack",
+    "rocket.chat": "Rocket.chat",
+    "pushover": "Pushover",
+    "pushy": "Pushy",
+    "octopush": "Octopush",
+    "promosms": "PromoSMS",
+    "lunasea": "LunaSea",
+    "apprise": "Apprise (Unterstützung für 50+ Benachrichtigungsdienste)",
+    "GoogleChat": "Google Chat (nur Google Workspace)",
+    "pushbullet": "Pushbullet",
+    "line": "Line Messenger",
+    "mattermost": "Mattermost",
+    "Primary Base URL": "Primäre Basis-URL",
+    "Push URL": "Push URL",
+    "needPushEvery": "Du solltest diese URL alle {0} Sekunden aufrufen.",
+    "pushOptionalParams": "Optionale Parameter: {0}",
+    "defaultNotificationName": "Mein {notification} Alarm ({number})",
+    "here": "hier",
+    "Required": "Erforderlich",
+    "Bot Token": "Bot Token",
+    "wayToGetTelegramToken": "Hier kannst du einen Token erhalten {0}.",
+    "Chat ID": "Chat ID",
+    "supportTelegramChatID": "Unterstützt Direkt Chat / Gruppe / Kanal Chat-ID's",
+    "wayToGetTelegramChatID": "Du kannst deine Chat-ID erhalten, indem du eine Nachricht an den Bot sendest und zu dieser URL gehst, um die chat_id: zu sehen.",
+    "YOUR BOT TOKEN HERE": "HIER DEIN BOT TOKEN",
+    "chatIDNotFound": "Chat-ID wurde nicht gefunden: bitte sende zuerst eine Nachricht an diesen Bot",
+    "Post URL": "Post URL",
+    "Content Type": "Content Type",
+    "webhookJsonDesc": "{0} ist gut für alle modernen HTTP-Server, wie z.B. Express.js, geeignet",
+    "webhookFormDataDesc": "{multipart} ist gut für PHP. Das JSON muss mit {decodeFunction} verarbeitet werden",
+    "secureOptionNone": "Keine / STARTTLS (25, 587)",
+    "secureOptionTLS": "TLS (465)",
+    "Ignore TLS Error": "TLS-Fehler ignorieren",
+    "From Email": "Absender E-Mail",
+    "emailCustomSubject": "Benutzerdefinierter Betreff",
+    "To Email": "Empfänger E-Mail",
+    "smtpCC": "CC",
+    "smtpBCC": "BCC",
+    "Discord Webhook URL": "Discord Webhook URL",
+    "wayToGetDiscordURL": "Du kannst diese erhalten, indem du zu den Servereinstellungen gehst -> Integrationen -> WebHooks anzeigen -> Neuer WebHook",
+    "Bot Display Name": "Bot-Anzeigename",
+    "Prefix Custom Message": "Benutzerdefinierter Nachrichten Präfix",
+    "Hello @everyone is...": "Hallo {'@'}everyone ist…",
+    "Webhook URL": "Webhook URL",
+    "wayToGetTeamsURL": "Wie eine Webhook-URL erstellt werden kann, erfährst du {0}.",
+    "Number": "Nummer",
+    "Recipients": "Empfänger",
+    "needSignalAPI": "Es wird ein Signal Client mit REST-API benötigt.",
+    "wayToCheckSignalURL": "Du kannst diese URL aufrufen, um zu sehen, wie du eine einrichtest:",
+    "signalImportant": "WICHTIG: Gruppen und Nummern können in Empfängern nicht gemischt werden!",
+    "Application Token": "Anwendungs Token",
+    "Server URL": "Server URL",
+    "Priority": "Priorität",
+    "Icon Emoji": "Icon Emoji",
+    "Channel Name": "Kanalname",
+    "Uptime Kuma URL": "Uptime Kuma URL",
+    "aboutWebhooks": "Weitere Informationen zu Webhooks auf: {0}",
+    "aboutChannelName": "Gebe den Kanalnamen ein in {0} Feld Kanalname, falls du den Webhook-Kanal umgehen möchtest. Ex: #other-channel",
+    "aboutKumaURL": "Wenn das Feld für die Uptime Kuma URL leer gelassen wird, wird standardmäßig die GitHub Projekt Seite verwendet.",
+    "emojiCheatSheet": "Emoji Cheat Sheet: {0}",
+    "User Key": "Benutzerschlüssel",
+    "Device": "Gerät",
+    "Message Title": "Nachrichtentitel",
+    "Notification Sound": "Benachrichtigungston",
+    "More info on:": "Mehr Infos auf: {0}",
+    "pushoverDesc1": "Notfallpriorität (2) hat standardmäßig 30 Sekunden Auszeit zwischen den Versuchen und läuft nach 1 Stunde ab.",
+    "pushoverDesc2": "Fülle das Geräte Feld aus, wenn du Benachrichtigungen an verschiedene Geräte senden möchtest.",
+    "SMS Type": "SMS Typ",
+    "octopushTypePremium": "Premium (Schnell - zur Benachrichtigung empfohlen)",
+    "octopushTypeLowCost": "Kostengünstig (Langsam - manchmal vom Betreiber gesperrt)",
+    "checkPrice": "Prüfe {0} Preise:",
+    "octopushLegacyHint": "Verwendest du die Legacy-Version von Octopush (2011-2020) oder die neue Version?",
+    "Check octopush prices": "Vergleiche die Oktopush Preise {0}.",
+    "octopushPhoneNumber": "Telefonnummer (Internationales Format, z.B : +49612345678) ",
+    "octopushSMSSender": "Name des SMS-Absenders : 3-11 alphanumerische Zeichen und Leerzeichen (a-zA-Z0-9)",
+    "LunaSea Device ID": "LunaSea Geräte ID",
+    "Apprise URL": "Apprise URL",
+    "Example:": "Beispiel: {0}",
+    "Read more:": "Weiterlesen: {0}",
+    "Status:": "Status: {0}",
+    "Read more": "Weiterlesen",
+    "appriseInstalled": "Apprise ist installiert.",
+    "appriseNotInstalled": "Apprise ist nicht installiert. {0}",
+    "Access Token": "Zugriffstoken",
+    "Channel access token": "Channel access token",
+    "Line Developers Console": "Zeile Entwickler Konsole",
+    "lineDevConsoleTo": "Line Developers Console - {0}",
+    "Basic Settings": "Grundeinstellungen",
+    "User ID": "User ID",
+    "Messaging API": "Messaging API",
+    "wayToGetLineChannelToken": "Rufe zuerst {0} auf, erstelle dann einen Provider und Channel (Messaging API). Als nächstes kannst du den Channel access token und die User ID aus den oben genannten Menüpunkten abrufen.",
+    "Icon URL": "Icon URL",
+    "aboutIconURL": "Du kannst einen Link zu einem Bild in 'Icon URL' übergeben um das Standardprofilbild zu überschreiben. Wird nicht verwendet, wenn ein Icon Emoji gesetzt ist.",
+    "aboutMattermostChannelName": "Du kannst den Standardkanal, auf dem der Webhook gesendet wird überschreiben, indem der Kanalnamen in das Feld 'Channel Name' eingeben wird. Dies muss in den Mattermost Webhook-Einstellungen aktiviert werden. Ex: #other-channel",
+    "matrix": "Matrix",
+    "promosmsTypeEco": "SMS ECO - billig, aber langsam und oft überladen. Auf polnische Empfänger beschränkt.",
+    "promosmsTypeFlash": "SMS FLASH - Die Nachricht wird automatisch auf dem Empfängergerät angezeigt. Auf polnische Empfänger beschränkt.",
+    "promosmsTypeFull": "SMS FULL - Premium Stufe von SMS, es kann der Absendernamen verwendet werden (Der Name musst zuerst registriert werden). Zuverlässig für Warnungen.",
+    "promosmsTypeSpeed": "SMS SPEED - Höchste Priorität im System. Sehr schnell und zuverlässig, aber teuer (Ungefähr das doppelte von SMS FULL).",
+    "promosmsPhoneNumber": "Telefonnummer (für polnische Empfänger können die Vorwahlen übersprungen werden)",
+    "promosmsSMSSender": "Name des SMS-Absenders : vorregistrierter Name oder einer der Standardwerte: InfoSMS, SMS Info, MaxSMS, INFO, SMS",
+    "Feishu WebHookUrl": "Feishu Webhook URL",
+    "matrixHomeserverURL": "Heimserver URL (mit http(s):// und optionalen Ports)",
+    "Internal Room Id": "Interne Raum-ID",
+    "matrixDesc1": "Die interne Raum-ID findest du im erweiterten Bereich der Raumeinstellungen im Matrix-Client. Es sollte aussehen wie z.B. !QMdRCpUIfLwsfjxye6:home.server.",
+    "matrixDesc2": "Es wird dringend empfohlen einen neuen Benutzer anzulegen und nicht den Zugriffstoken deines eigenen Matrix-Benutzers zu verwenden. Anderenfalls ermöglicht es vollen Zugriff auf dein Konto und alle Räume, denen du beigetreten bist. Erstelle stattdessen einen neuen Benutzer und lade ihn nur in den Raum ein, in dem du die Benachrichtigung erhalten möchtest. Du kannst den Zugriffstoken erhalten, indem du Folgendes ausführst {0}",
+    "Method": "Methode",
+    "Body": "Body",
+    "Headers": "Header",
+    "PushUrl": "Push URL",
+    "HeadersInvalidFormat": "Der Header ist kein gültiges JSON: ",
+    "BodyInvalidFormat": "Der Body ist kein gültiges JSON: ",
+    "Monitor History": "Monitor Verlauf",
+    "clearDataOlderThan": "Bewahre die Monitor-Verlaufsdaten für {0} Tage auf.",
+    "PasswordsDoNotMatch": "Passwörter stimmen nicht überein.",
+    "records": "Einträge",
+    "One record": "Ein Eintrag",
+    "steamApiKeyDescription": "Um einen Steam Game Server zu überwachen, wird ein Steam Web-API-Schlüssel benötigt. Dieser kann hier registriert werden: ",
+    "Current User": "Aktueller Benutzer",
+    "recent": "Letzte",
+    "Done": "Fertig",
+    "Info": "Info",
+    "Security": "Sicherheit",
+    "Steam API Key": "Steam API-Schlüssel",
+    "Shrink Database": "Datenbank verkleinern",
+    "Pick a RR-Type...": "Wähle ein RR-Typ aus…",
+    "Pick Accepted Status Codes...": "Wähle akzeptierte Statuscodes aus…",
+    "Default": "Standard",
+    "HTTP Options": "HTTP Optionen",
+    "Create Incident": "Vorfall erstellen",
+    "Title": "Titel",
+    "Content": "Inhalt",
+    "Style": "Stil",
+    "info": "info",
+    "warning": "warnung",
+    "danger": "gefahr",
+    "primary": "primär",
+    "light": "hell",
+    "dark": "dunkel",
+    "Post": "Eintrag",
+    "Please input title and content": "Bitte Titel und Inhalt eingeben",
+    "Created": "Erstellt",
+    "Last Updated": "Zuletzt aktualisiert",
+    "Unpin": "Loslösen",
+    "Switch to Light Theme": "Zu hellem Thema wechseln",
+    "Switch to Dark Theme": "Zum dunklen Thema wechseln",
+    "Show Tags": "Tags anzeigen",
+    "Hide Tags": "Tags ausblenden",
+    "Description": "Beschreibung",
+    "No monitors available.": "Keine Monitore verfügbar.",
+    "Add one": "Hinzufügen",
+    "No Monitors": "Keine Monitore",
+    "Untitled Group": "Gruppe ohne Titel",
+    "Services": "Dienste",
+    "Discard": "Verwerfen",
+    "Cancel": "Abbrechen",
+    "Powered by": "Powered by",
+    "shrinkDatabaseDescription": "Löse VACUUM für die SQLite Datenbank aus. Wenn die Datenbank nach 1.10.0 erstellt wurde, ist AUTO_VACUUM bereits aktiviert und diese Aktion ist nicht erforderlich.",
+    "serwersms": "SerwerSMS.pl",
+    "serwersmsAPIUser": "API Benutzername (inkl. webapi_ prefix)",
+    "serwersmsAPIPassword": "API Passwort",
+    "serwersmsPhoneNumber": "Telefonnummer",
+    "serwersmsSenderName": "Name des SMS-Absenders (über Kundenportal registriert)",
+    "stackfield": "Stackfield",
+    "clicksendsms": "ClickSend SMS",
+    "apiCredentials": "API Zugangsdaten",
+    "smtpDkimSettings": "DKIM Einstellungen",
+    "smtpDkimDesc": "Details zur Konfiguration sind in der Nodemailer DKIM {0} zu finden.",
+    "documentation": "Dokumentation",
+    "smtpDkimDomain": "Domain Name",
+    "smtpDkimKeySelector": "Schlüssel Auswahl",
+    "smtpDkimPrivateKey": "Privater Schlüssel",
+    "smtpDkimHashAlgo": "Hash-Algorithmus (Optional)",
+    "smtpDkimheaderFieldNames": "Zu validierende Header-Schlüssel (optional)",
+    "smtpDkimskipFields": "Zu ignorierende Header Schlüssel (optional)",
+    "PushByTechulus": "Push by Techulus",
+    "gorush": "Gorush",
+    "alerta": "Alerta",
+    "alertaApiEndpoint": "API Endpunkt",
+    "alertaEnvironment": "Umgebung",
+    "alertaApiKey": "API Schlüssel",
+    "alertaAlertState": "Alarmstatus",
+    "alertaRecoverState": "Wiederherstellungsstatus",
+    "deleteStatusPageMsg": "Bist du sicher, dass du diese Status-Seite löschen willst?",
+    "Proxies": "Proxies",
+    "default": "Standard",
+    "enabled": "Aktiviert",
+    "setAsDefault": "Als Standard setzen",
+    "deleteProxyMsg": "Bist du sicher, dass du diesen Proxy für alle Monitore löschen willst?",
+    "proxyDescription": "Proxies müssen einem Monitor zugewiesen werden, um zu funktionieren.",
+    "enableProxyDescription": "Dieser Proxy wird keinen Effekt auf Monitor-Anfragen haben, bis er aktiviert ist. Du kannst ihn temporär von allen Monitoren nach Aktivierungsstatus deaktivieren.",
+    "setAsDefaultProxyDescription": "Dieser Proxy wird standardmäßig für alle neuen Monitore aktiviert sein. Du kannst den Proxy immer noch für jeden Monitor einzeln deaktivieren.",
+    "Certificate Chain": "Zertifikatskette",
+    "Valid": "Gültig",
+    "Invalid": "Ungültig",
+    "AccessKeyId": "AccessKey ID",
+    "SecretAccessKey": "AccessKey Secret",
+    "PhoneNumbers": "Telefonnummern",
+    "TemplateCode": "Vorlagencode",
+    "SignName": "Signaturname",
+    "Sms template must contain parameters: ": "SMS Vorlage muss folgende Parameter enthalten: ",
+    "Bark Endpoint": "Bark Endpunkt",
+    "WebHookUrl": "Webhook URL",
+    "SecretKey": "Geheimer Schlüssel",
+    "For safety, must use secret key": "Zur Sicherheit muss ein geheimer Schlüssel verwendet werden",
+    "Device Token": "Gerätetoken",
+    "Platform": "Platform",
+    "iOS": "iOS",
+    "Android": "Android",
+    "Huawei": "Huawei",
+    "High": "Hoch",
+    "Retry": "Wiederholungen",
+    "Topic": "Thema",
+    "WeCom Bot Key": "WeCom Bot Schlüssel",
+    "Setup Proxy": "Proxy einrichten",
+    "Proxy Protocol": "Proxy Protokoll",
+    "Proxy Server": "Proxy-Server",
+    "Proxy server has authentication": "Proxy-Server hat Authentifizierung",
+    "User": "Benutzer",
+    "Installed": "Installiert",
+    "Not installed": "Nicht installiert",
+    "Running": "Läuft",
+    "Not running": "Gestoppt",
+    "Remove Token": "Token entfernen",
+    "Start": "Start",
+    "Stop": "Stop",
+    "Uptime Kuma": "Uptime Kuma",
+    "Add New Status Page": "Neue Status-Seite hinzufügen",
+    "Slug": "Slug",
+    "Accept characters:": "Akzeptierte Zeichen:",
+    "startOrEndWithOnly": "Nur mit {0} anfangen und enden",
+    "No consecutive dashes": "Keine aufeinanderfolgenden Bindestriche",
+    "Next": "Weiter",
+    "The slug is already taken. Please choose another slug.": "Der Slug ist bereits in Verwendung. Bitte wähle einen anderen.",
+    "No Proxy": "Kein Proxy",
+    "Authentication": "Authentifizierung",
+    "HTTP Basic Auth": "HTTP Basisauthentifizierung",
+    "New Status Page": "Neue Status-Seite",
+    "Page Not Found": "Seite nicht gefunden",
+    "Reverse Proxy": "Reverse Proxy",
+    "Backup": "Sicherung",
+    "About": "Über",
+    "wayToGetCloudflaredURL": "(Lade cloudflared von {0} herunter)",
+    "cloudflareWebsite": "Cloudflare Website",
+    "Message:": "Nachricht:",
+    "Don't know how to get the token? Please read the guide:": "Du weißt nicht, wie man den Token bekommt? Lies die Anleitung dazu:",
+    "The current connection may be lost if you are currently connecting via Cloudflare Tunnel. Are you sure want to stop it? Type your current password to confirm it.": "Die aktuelle Verbindung kann unterbrochen werden, wenn du aktuell über Cloudflare Tunnel verbunden bist. Bist du sicher, dass du es stoppen willst? Gib zur Bestätigung dein aktuelles Passwort ein.",
+    "Other Software": "Andere Software",
+    "For example: nginx, Apache and Traefik.": "Zum Beispiel: nginx, Apache und Traefik.",
+    "Please read": "Bitte lesen",
+    "Subject:": "Betreff:",
+    "Valid To:": "Gültig bis:",
+    "Days Remaining:": "Tage verbleibend:",
+    "Issuer:": "Aussteller:",
+    "Fingerprint:": "Fingerabdruck:",
+    "No status pages": "Keine Status-Seiten",
+    "Domain Name Expiry Notification": "Benachrichtigung bei Ablauf des Domainnamens",
+    "Customize": "Anpassen",
+    "Custom Footer": "Eigener Footer",
+    "Custom CSS": "Eigenes CSS",
+    "Footer Text": "Fußzeile",
+    "Show Powered By": "Zeige 'Powered By'",
+    "Date Created": "Erstellt am",
+    "Domain Names": "Domainnamen",
+    "signedInDisp": "Angemeldet als {0}",
+    "signedInDispDisabled": "Authentifizierung deaktiviert.",
+    "dnsPortDescription": "DNS server port. Standard ist 53. Der Port kann jederzeit geändert werden.",
+    "topic": "Thema",
+    "topicExplanation": "MQTT Thema für den monitor",
+    "successMessage": "Erfolgsnachricht",
+    "successMessageExplanation": "MQTT Nachricht, die als Erfolg angesehen wird",
+    "error": "Fehler",
+    "critical": "kritisch",
+    "wayToGetPagerDutyKey": "Dieser kann unter Service -> Service Directory -> (Select a service) -> Integrations -> Add integration gefunden werden. Hier muss nach \"Events API V2\" gesucht werden. Mehr informationen {0}",
+    "Integration Key": "Schlüssel der Integration",
+    "Integration URL": "URL der Integration",
+    "Auto resolve or acknowledged": "Automatisch lösen oder bestätigen",
+    "do nothing": "nichts tun",
+    "auto acknowledged": "automatisch bestätigen",
+    "auto resolve": "automatisch lösen",
+    "Bark Group": "Bark Gruppe",
+    "Bark Sound": "Bark Klang",
+    "HTTP Headers": "HTTP Kopfzeilen",
+    "Trust Proxy": "Vertrauenswürdiger Proxy",
+    "Proxy": "Proxy",
+    "HomeAssistant": "Home Assistant",
+    "onebotHttpAddress": "OneBot HTTP Adresse",
+    "onebotMessageType": "OneBot Nachrichtentyp",
+    "onebotGroupMessage": "Gruppe",
+    "onebotPrivateMessage": "Privat",
+    "onebotUserOrGroupId": "Gruppe/Nutzer ID",
+    "onebotSafetyTips": "Zur Sicherheit ein access token setzen",
+    "PushDeer Key": "PushDeer Schlüssel",
+    "RadiusSecret": "Radius Geheimnis",
+    "RadiusSecretDescription": "Geteiltes Geheimnis zwischen Client und Server",
+    "RadiusCalledStationId": "ID der angesprochenen Station",
+    "RadiusCalledStationIdDescription": "Identifikation des angesprochenen Geräts",
+    "RadiusCallingStationId": "ID der ansprechenden Station",
+    "RadiusCallingStationIdDescription": "Identifikation des ansprechenden Geräts",
+    "Certificate Expiry Notification": "Benachrichtigung ablaufendes Zertifikat",
+    "API Username": "API Nutzername",
+    "API Key": "API Schlüssel",
+    "Recipient Number": "Empfängernummer",
+    "From Name/Number": "Von Name/Nummer",
+    "Leave blank to use a shared sender number.": "Leer lassen um eine geteilte Absendernummer zu nutzen.",
+    "Octopush API Version": "Octopush API Version",
+    "Legacy Octopush-DM": "Legacy Octopush-DM",
+    "endpoint": "Endpunkt",
+    "octopushAPIKey": "\"API Schlüssel\" der HTTP API Zugangsdaten im control panel",
+    "octopushLogin": "\"Login\" der HTTP API Zugangsdaten im control panel",
+    "promosmsLogin": "API Login Name",
+    "promosmsPassword": "API Password",
+    "pushoversounds pushover": "Pushover (Standard)",
+    "pushoversounds bike": "Fahrrad",
+    "pushoversounds bugle": "Signalhorn",
+    "pushoversounds cashregister": "Kasse",
+    "pushoversounds classical": "Klassisch",
+    "pushoversounds cosmic": "Kosmisch",
+    "pushoversounds falling": "Abfallend",
+    "pushoversounds gamelan": "Gamelan",
+    "pushoversounds incoming": "Eingang",
+    "pushoversounds intermission": "Pause",
+    "pushoversounds magic": "Magisch",
+    "pushoversounds mechanical": "Mechanisch",
+    "pushoversounds pianobar": "Piano Bar",
+    "pushoversounds siren": "Sirene",
+    "pushoversounds spacealarm": "Space Alarm",
+    "pushoversounds tugboat": "Schlepper Horn",
+    "pushoversounds alien": "Außerirdisch (lang)",
+    "pushoversounds climb": "Ansteigende (lang)",
+    "pushoversounds persistent": "Hartnäckig (lang)",
+    "pushoversounds echo": "Pushover Echo (lang)",
+    "pushoversounds updown": "Auf und Ab (lang)",
+    "pushoversounds vibrate": "Nur vibrieren",
+    "pushoversounds none": "Nichts (Stille)",
+    "pushyAPIKey": "Geheimer API Schlüssel",
+    "pushyToken": "Gerätetoken",
+    "Show update if available": "Verfügbare Updates anzeigen",
+    "Also check beta release": "Auch nach Beta Versionen schauen",
+    "Using a Reverse Proxy?": "Wird ein Reverse Proxy genutzt?",
+    "Check how to config it for WebSocket": "Prüfen, wie er für die Nutzung mit WebSocket konfiguriert wird",
+    "Steam Game Server": "Steam Game Server",
+    "Most likely causes:": "Wahrscheinliche Ursachen:",
+    "The resource is no longer available.": "Die Quelle ist nicht mehr verfügbar.",
+    "There might be a typing error in the address.": "Es gibt einen Tippfehler in der Adresse.",
+    "What you can try:": "Was du versuchen kannst:",
+    "Retype the address.": "Schreibe die Adresse erneut.",
+    "Go back to the previous page.": "Gehe zur vorigen Seite.",
+    "Coming Soon": "Kommt bald",
+    "wayToGetClickSendSMSToken": "Du kannst einen API Nutzernamen und Schlüssel unter {0} erhalten.",
+    "Connection String": "Verbindungstext",
+    "Query": "Abfrage",
+    "settingsCertificateExpiry": "TLS Zertifikatsablauf",
+    "certificationExpiryDescription": "HTTPS Monitore senden eine Benachrichtigung, wenn das Zertifikat abläuft in:",
+    "Setup Docker Host": "Docker Host einrichten",
+    "Connection Type": "Verbindungstyp",
+    "Docker Daemon": "Docker Daemon",
+    "deleteDockerHostMsg": "Bist du sicher diesen docker host für alle Monitore zu löschen?",
+    "socket": "Socket",
+    "tcp": "TCP / HTTP",
+    "Docker Container": "Docker Container",
+    "Container Name / ID": "Container-Bezeichnung / ID",
+    "Docker Host": "Docker-Host",
+    "Docker Hosts": "Docker-Hosts",
+    "ntfy Topic": "ntfy Thema",
+    "Domain": "Domain",
+    "Workstation": "Workstation",
+    "disableCloudflaredNoAuthMsg": "Du bist im nicht-authentifizieren Modus, ein Passwort wird nicht benötigt.",
+    "trustProxyDescription": "Vertraue 'X-Forwarded-*' headern. Wenn man die richtige Client IP haben möchte und Uptime Kuma hinter einem Proxy wie Nginx oder Apache läuft, sollte dies aktiviert werden.",
+    "wayToGetLineNotifyToken": "Du kannst hier ein Token erhalten: {0}",
+    "Examples": "Beispiele",
+    "Home Assistant URL": "Home Assistant URL",
+    "Long-Lived Access Token": "Lange gültiges Access Token",
+    "Long-Lived Access Token can be created by clicking on your profile name (bottom left) and scrolling to the bottom then click Create Token. ": "Lange gültige Access Token können durch klicken auf den Profilnamen (unten links) und dann einen Klick auf Create Token am Ende erstellt werden. ",
+    "Notification Service": "Benachrichtigungsdienst",
+    "default: notify all devices": "standard: Alle Geräte benachrichtigen",
+    "A list of Notification Services can be found in Home Assistant under \"Developer Tools > Services\" search for \"notification\" to find your device/phone name.": "Eine Liste der Benachrichtigungsdienste kann im Home Assistant unter \"Developer Tools > Services\" gefunden werden, wnen man nach \"notification\" sucht um den Geräte-/Telefonnamen zu finden.",
+    "Automations can optionally be triggered in Home Assistant:": "Automatisierungen können optional im Home Assistant ausgelöst werden:",
+    "Trigger type:": "Auslöser:",
+    "Event type:": "Ereignistyp:",
+    "Event data:": "Ereignis daten:",
+    "Then choose an action, for example switch the scene to where an RGB light is red.": "Dann eine Aktion wählen, zum Beispiel eine Scene wählen in der ein RGB Licht rot ist.",
+    "Frontend Version": "Frontend-Version",
+    "Frontend Version do not match backend version!": "Die Frontend Version stimmt nicht mit der backend version überein!",
+    "Maintenance": "Wartung",
+    "statusMaintenance": "Wartung",
+    "Schedule maintenance": "Geplante Wartung",
+    "Affected Monitors": "Betroffene Monitore",
+    "Pick Affected Monitors...": "Wähle betroffene Monitore…",
+    "Start of maintenance": "Beginn der Wartung",
+    "All Status Pages": "Alle Status Seiten",
+    "Select status pages...": "Statusseiten auswählen…",
+    "recurringIntervalMessage": "Einmal pro Tag ausgeführt | Wird alle {0} Tage ausgführt",
+    "affectedMonitorsDescription": "Wähle Monitore aus, die von der aktuellen Wartung betroffen sind",
+    "affectedStatusPages": "Diese Wartungsmeldung auf ausgewählten Statusseiten anzeigen",
+    "atLeastOneMonitor": "Wähle mindestens einen Monitor",
+    "deleteMaintenanceMsg": "Möchtest du diese Wartung löschen?",
+    "Base URL": "Basis URL",
+    "goAlertInfo": "GoAlert ist eine Open-Source Applikation für Rufbereitschaftsplanung, automatische Eskalation und Benachrichtigung (z.B. SMS oder Telefonanrufe). Beauftragen Sie automatisch die richtige Person, auf die richtige Art und Weise und zum richtigen Zeitpunkt. {0}",
+    "goAlertIntegrationKeyInfo": "Bekommt einen generischen API Schlüssel in folgenden Format \"aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee\". Normalerweise entspricht dies dem Wert des Token aus der URL.",
+    "goAlert": "GoAlert",
+    "backupOutdatedWarning": "Veraltet: Da viele Funktionen hinzugefügt wurden und diese Sicherungsfunktion nicht mehr gepflegt wird, kann keine vollständige Sicherung erstellen oder wiederherstellen werden.",
+    "backupRecommend": "Bitte sichere stattdessen das Volume oder den Datenordner (./data/) direkt.",
+    "Optional": "Optional",
+    "squadcast": "Squadcast",
+    "SendKey": "SendKey",
+    "SMSManager API Docs": "SMSManager API Dokumente",
+    "Gateway Type": "Gateway Type",
+    "SMSManager": "SMSManager",
+    "You can divide numbers with": "Du kannst Zahlen teilen mit",
+    "or": "oder",
+    "recurringInterval": "Intervall",
+    "Recurring": "Wiederkehrend",
+    "Single Maintenance Window": "Einzigartiges Wartungsfenster",
+    "Maintenance Time Window of a Day": "Zeitfenster für die Wartung",
+    "Effective Date Range": "Bereich der Wirksamkeitsdaten",
+    "strategyManual": "Aktiv/Inaktiv Manuell",
+    "warningTimezone": "Es wird die Zeitzone des Servers verwendet",
+    "weekdayShortMon": "Mo",
+    "weekdayShortTue": "Di",
+    "weekdayShortWed": "Mi",
+    "weekdayShortThu": "Do",
+    "weekdayShortFri": "Fr",
+    "weekdayShortSat": "Sa",
+    "weekdayShortSun": "So",
+    "dayOfWeek": "Tag der Woche",
+    "dayOfMonth": "Tag im Monat",
+    "lastDay": "Letzter Tag",
+    "lastDay1": "Letzter Tag im Monat",
+    "lastDay2": "Vorletzer Tag im Monat",
+    "lastDay3": "3. letzter Tag im Monat",
+    "lastDay4": "4. letzter Tag im Monat",
+    "No Maintenance": "Keine Wartung",
+    "Schedule Maintenance": "Wartung planen",
+    "pauseMaintenanceMsg": "Möchtest du wirklich pausieren?",
+    "maintenanceStatus-under-maintenance": "Unter Wartung",
+    "maintenanceStatus-inactive": "Inaktiv",
+    "maintenanceStatus-scheduled": "Geplant",
+    "maintenanceStatus-ended": "Ende",
+    "maintenanceStatus-unknown": "Unbekannt",
+    "Display Timezone": "Zeitzone anzeigen",
+    "Server Timezone": "Server Zeitzone",
+    "Date and Time": "Datum und Zeit",
+    "DateTime Range": "Datums- und Zeitbereich",
+    "Strategy": "Strategie",
+    "statusPageMaintenanceEndDate": "Ende",
+    "Help": "Hilfe",
+    "Game": "Spiel",
+    "Custom": "Benutzerdefiniert",
+    "Enable DNS Cache": "DNS-Cache aktivieren",
+    "Enable": "Aktivieren",
+    "Disable": "Deaktivieren",
+    "Custom Monitor Type": "Benutzerdefinierter Monitortyp",
+    "webhookAdditionalHeadersDesc": "Legt zusätzliche Header fest, die mit der Webhook gesendet wurden.",
+    "dnsCacheDescription": "In einigen IPv6-Umgebungen funktioniert es möglicherweise nicht. Deaktivieren Sie es, wenn Sie auf Probleme stoßen.",
+    "loadingError": "Die Daten konnten nicht abgerufen werden, bitte später noch einmal versuchen.",
+    "confirmUninstallPlugin": "Möchten Sie dieses Plugin wirklich deinstallieren?",
+    "grpcMethodDescription": "Der Name der Methode wird in das \"cammelCase \"-Format konvertiert (z.B. sayHello, check, etc.)",
+    "Passive Monitor Type": "Passiver Monitortyp",
+    "Specific Monitor Type": "Spezifischer Monitortyp",
+    "webhookAdditionalHeadersTitle": "Zusätzliche Header",
+    "Packet Size": "Paketgröße",
+    "IconUrl": "Symbol-URL",
+    "wayToGetZohoCliqURL": "Erfahren Sie, wie Sie eine Webhook-URL {0} erstellen.",
+    "dataRetentionTimeError": "Aufbewahrungszeit muss 0 oder größer sein",
+    "infiniteRetention": "Für unendliche Aufbewahrung auf 0 setzen.",
+    "confirmDeleteTagMsg": "Möchten Sie dieses Tag wirklich löschen? Mit diesem Tag verknüpfte Monitore werden nicht gelöscht.",
+    "enableGRPCTls": "Erlaube das Senden von gRPC-Anfragen mit TLS-Verbindung",
+    "ZohoCliq": "ZohoCliq",
+    "Monitor": "Überwachung | Monitore",
+    "plugin": "Plugin | Plugins",
+    "install": "Installieren",
+    "installing": "Installiere",
+    "uninstall": "Deinstallieren",
+    "uninstalling": "Deinstallation",
+    "markdownSupported": "Markdown-Syntax unterstützt",
+    "wayToGetKookBotToken": "Anwendung erstellen und den Bot-Token {0} abrufen",
+    "wayToGetKookGuildID": "Schalten Sie den \"Entwicklermodus\" in den Kook-Einstellungen ein und klicken Sie mit der rechten Maustaste auf die Gilde, um ihre ID zu erhalten.",
+    "Guild ID": "Gilden-ID",
+    "Free Mobile User Identifier": "Kostenlose mobile Benutzerkennung",
+    "Free Mobile API Key": "Kostenloser Mobile API-Schlüssel",
+    "Enable TLS": "Aktiviere TLS",
+    "Proto Service Name": "Proto Service Name",
+    "Proto Method": "Proto Methode",
+    "Proto Content": "Proto Inhalt",
+    "Economy": "Economy-Modus",
+    "Lowcost": "Lowcost-Modus",
+    "high": "High-Modus",
+    "promosmsAllowLongSMS": "Erlaube lange SMS",
+    "General Monitor Type": "Allgemeiner Monitortyp",
+    "smseagle": "SMSEagle",
+    "smseagleTo": "Telefonnummer(n)",
+    "smseagleGroup": "Telefonbuch Gruppenname(n)",
+    "smseagleContact": "Telefonbuch Kontaktname(n)",
+    "smseagleRecipientType": "Empfängertyp",
+    "smseagleRecipient": "Empfänger (mehrere müssen mit Komma getrennt werden)",
+    "smseagleToken": "API-Zugriffstoken",
+    "smseagleUrl": "Deine SMSEagle-Geräte-URL",
+    "Kook": "Kook",
+    "smseagleEncoding": "Als Unicode senden",
+    "smseaglePriority": "Nachrichtenpriorität (0-9, Standard = 0)",
+    "Google Analytics ID": "Google Analytics ID",
+    "Edit Tag": "bearbeite Tag",
+    "Server Address": "Server Adresse",
+    "Learn More": "Erfahre mehr"
+}
diff --git a/src/lang/el-GR.json b/src/lang/el-GR.json
new file mode 100644
index 000000000..19a9bd4c1
--- /dev/null
+++ b/src/lang/el-GR.json
@@ -0,0 +1,699 @@
+{
+    "languageName": "Ελληνικά",
+    "checkEverySecond": "Έλεγχος κάθε {0} δευτερόλεπτα",
+    "retryCheckEverySecond": "Επανάληψη κάθε {0} δευτερόλεπτα",
+    "resendEveryXTimes": "Επανάληψη αποστολής ειδοποίησης κάθε {0} φορές",
+    "resendDisabled": "Η επανάληψη αποστολής ειδοποίησης είναι απενεργοποιημένη",
+    "retriesDescription": "Μέγιστες επαναλήψεις προτού η υπηρεσία επισημανθεί ως κατω και σταλεί μια ειδοποίηση",
+    "ignoreTLSError": "Παράβλεψη σφάλματος TLS/SSL για ιστότοπους HTTPS",
+    "upsideDownModeDescription": "Αναποδογυρίστε την κατάσταση. Εάν η υπηρεσία είναι προσβάσιμη, είναι ΚΑΤΩ.",
+    "maxRedirectDescription": "Μέγιστος αριθμός redirect που θα ακολουθήσουν. Ρυθμίστε το 0 για να απενεργοποιήσετε τα redirect.",
+    "acceptedStatusCodesDescription": "Επιλέξτε κωδικούς κατάστασης που θεωρούνται επιτυχή.",
+    "passwordNotMatchMsg": "Ο κωδικός δεν ταιριάζει.",
+    "notificationDescription": "Οι ειδοποιήσεις πρέπει να εκχωρηθούν σε μια παρακολούθηση για να λειτουργήσουν.",
+    "keywordDescription": "Αναζήτηση λέξης-κλειδιού σε απλή απόκριση HTML ή JSON. Η αναζήτηση είναι διάκριση πεζών-κεφαλαίων.",
+    "pauseDashboardHome": "Παύση",
+    "deleteMonitorMsg": "Είστε βέβαιοι ότι θέλετε να διαγράψετε αυτήν την παρακολούθηση;",
+    "deleteNotificationMsg": "Είστε βέβαιοι ότι θέλετε να διαγράψετε αυτήν την ειδοποίηση για όλες τις παρακολούθησης?",
+    "dnsPortDescription": "Θύρα διακομιστή DNS. Προεπιλογή σε 53. Μπορείτε να αλλάξετε τη θύρα ανά πάσα στιγμή.",
+    "resolverserverDescription": "Το Cloudflare είναι ο προεπιλεγμένος διακομιστής. Μπορείτε να αλλάξετε τον διακομιστή επίλυσης ανά πάσα στιγμήhe default server. You can change the resolver server anytime.",
+    "rrtypeDescription": "Επιλέξτε τον τύπο RR που θέλετε να παρακολουθήσετε",
+    "pauseMonitorMsg": "Είστε βέβαιοι ότι θέλετε να κάνετε παύση;",
+    "enableDefaultNotificationDescription": "Αυτή η ειδοποίηση θα είναι ενεργοποιημένη από προεπιλογή για νέες παρακολούθησης. Μπορείτε ακόμα να απενεργοποιήσετε την ειδοποίηση ξεχωριστά για κάθε παρακολούθηση.",
+    "clearEventsMsg": "Είστε βέβαιοι ότι θέλετε να διαγράψετε όλα τα συμβάντα για αυτήν την παρακολούθηση;",
+    "clearHeartbeatsMsg": "Είστε βέβαιοι ότι θέλετε να διαγράψετε όλους τους καρδιακούς παλμούς για αυτήν την παρακολούθηση;",
+    "confirmClearStatisticsMsg": "Είστε βέβαιοι ότι θέλετε να διαγράψετε ΟΛΑ τα στατιστικά στοιχεία;?",
+    "importHandleDescription": "Επιλέξτε «Παράλειψη υπάρχοντος» εάν θέλετε να παραλείψετε κάθε παρακολούθηση ή ειδοποίηση με το ίδιο όνομα. Το 'Overwrite' θα διαγράψει κάθε υπάρχουσα παρακολούθηση και ειδοποίηση.",
+    "confirmImportMsg": "Είστε βέβαιοι ότι θέλετε να εισαγάγετε το αντίγραφο ασφαλείας; Επαληθεύστε ότι έχετε επιλέξει τη σωστή επιλογή.",
+    "twoFAVerifyLabel": "Εισαγάγετε το 2FA κωδικό για να επαληθεύσετε:",
+    "tokenValidSettingsMsg": "Ο κωδικός 2FA είναι έγκυρος! Τώρα μπορείτε να αποθηκεύσετε τις ρυθμίσεις 2FA.",
+    "confirmEnableTwoFAMsg": "Είστε βέβαιοι ότι θέλετε να ενεργοποιήσετε το 2FA;",
+    "confirmDisableTwoFAMsg": "Είστε βέβαιοι ότι θέλετε να απενεργοποιήσετε το 2FA;",
+    "Settings": "Ρυθμίσεις",
+    "Dashboard": "Πίνακας",
+    "New Update": "Νέα αναβάθμιση",
+    "Language": "Γλώσσα",
+    "Appearance": "Εμφάνιση",
+    "Theme": "Θέμα",
+    "General": "Γενικά",
+    "Primary Base URL": "Κύρια βασική διεύθυνση URL",
+    "Version": "Εκδοχή",
+    "Check Update On GitHub": "Ελέγξτε για Ενημέρωση στο GitHub",
+    "List": "Λίστα",
+    "Add": "Προσθήκη",
+    "Add New Monitor": "Προσθήκη νέας παρακολούθησης",
+    "Quick Stats": "Γρήγορα στατιστικά",
+    "Up": "Πάνω",
+    "Down": "Κάτω",
+    "Pending": "Εκκρεμεί",
+    "Unknown": "Άγνωστο",
+    "Pause": "Παύση",
+    "Name": "Ονομα",
+    "Status": "Κατάσταση",
+    "DateTime": "ΗμερομηνίαΏρα",
+    "Message": "Μήνυμα",
+    "No important events": "Δεν υπάρχουν σημαντικά γεγονότα",
+    "Resume": "Συνέχιση",
+    "Edit": "Επεξεργασία",
+    "Delete": "Διαγράφη",
+    "Current": "Τρέχον",
+    "Uptime": "Χρόνος λειτουργίας",
+    "Cert Exp.": "Λήξη Πιστοπ.",
+    "day": "ημέρα | ημέρες",
+    "-day": "-ημέρα",
+    "hour": "ώρα",
+    "-hour": "-ώρα",
+    "Response": "Απάντηση",
+    "Ping": "Ping",
+    "Monitor Type": "Τύπος παρακολούθησης",
+    "Keyword": "Λέξη-κλειδί",
+    "Friendly Name": "Φιλικό όνομα",
+    "URL": "URL",
+    "Hostname": "Hostname",
+    "Port": "Port",
+    "Heartbeat Interval": "Διάστημα καρδιακών παλμών",
+    "Retries": "Επαναλήψεις",
+    "Heartbeat Retry Interval": "Διάστημα επανάληψης παλμών καρδιάς",
+    "Resend Notification if Down X times consecutively": "Αποστολή νέας ειδοποίησης εάν κατω X φορές κατά συνέχεια",
+    "Advanced": "Προχωρημένα",
+    "Upside Down Mode": "Ανάποδη λειτουργία",
+    "Max. Redirects": "Μέγιστη. Ανακατευθύνσεις",
+    "Accepted Status Codes": "Αποδεκτοί Κωδικοί Κατάστασης",
+    "Push URL": "Push URL",
+    "needPushEvery": "Θα πρέπει να καλείτε αυτήν τη διεύθυνση URL κάθε {0} δευτερόλεπτα.",
+    "pushOptionalParams": "Προαιρετικές παράμετροι: {0}",
+    "Save": "Αποθηκεύση",
+    "Notifications": "Ειδοποιήσεις",
+    "Not available, please setup.": "Μη διαθέσιμο, παρακαλώ ρυθμίστε.",
+    "Setup Notification": "Δημιουργία ειδοποίησης",
+    "Light": "Φωτεινό",
+    "Dark": "Σκοτεινό",
+    "Auto": "Αυτόματο",
+    "Theme - Heartbeat Bar": "Θέμα - Μπάρα καρδιακών παλμών",
+    "Normal": "Κανονικό",
+    "Bottom": "Κάτω μέρος",
+    "None": "Τίποτα",
+    "Timezone": "Ζώνη ώρας",
+    "Search Engine Visibility": "Ορατότητα μηχανών αναζήτησης",
+    "Allow indexing": "Να επιτρέπεται η ευρετηρίαση",
+    "Discourage search engines from indexing site": "Αποθαρρύνετε τις μηχανές αναζήτησης από την ευρετηρίαση ιστότοπου",
+    "Change Password": "Αλλαγή κωδικού πρόσβασης",
+    "Current Password": "Τρέχων κωδικός πρόσβασης",
+    "New Password": "Νέος κωδικός πρόσβασης",
+    "Repeat New Password": "Επαναλάβετε τον νέο κωδικό πρόσβασης",
+    "Update Password": "Ενημέρωση κωδικού πρόσβασης",
+    "Disable Auth": "Απενεργοποίηση ελέγχου ταυτότητας",
+    "Enable Auth": "Ενεργοποίηση ελέγχου ταυτότητας",
+    "disableauth.message1": "Είστε βέβαιοι ότι θέλετε να <strong>απενεργοποιήσετε τον έλεγχο ταυτότητας</strong>;",
+    "disableauth.message2": "Έχει σχεδιαστεί για σενάρια <strong>όπου σκοπεύετε να εφαρμόσετε έλεγχο ταυτότητας τρίτου μέρους</strong> μπροστά από το Uptime Kuma, όπως το Cloudflare Access, Authelia ή άλλους μηχανισμούς ελέγχου ταυτότητας.",
+    "Please use this option carefully!": "Χρησιμοποιήστε αυτή την επιλογή προσεκτικά!",
+    "Logout": "Αποσύνδεση",
+    "Leave": "Φύγετε",
+    "I understand, please disable": "Καταλαβαίνω, απενεργοποιήστε",
+    "Confirm": "Επιβεβαίωση",
+    "Yes": "Ναί",
+    "No": "Οχι",
+    "Username": "Όνομα χρήστη",
+    "Password": "Κωδικός πρόσβασης",
+    "Remember me": "Θυμήσου με",
+    "Login": "Σύνδεση",
+    "No Monitors, please": "Δεν υπάρχουν παρακολούθησης παρακαλώ",
+    "add one": "προσθέστε ένα",
+    "Notification Type": "Είδος ειδοποίησης",
+    "Email": "Email",
+    "Test": "Δοκιμή",
+    "Certificate Info": "Πληροφορίες πιστοποιητικού",
+    "Resolver Server": "Διακομιστής επίλυσης",
+    "Resource Record Type": "Τύπος εγγραφής πόρων",
+    "Last Result": "Τελευταίο Αποτέλεσμα",
+    "Create your admin account": "Δημιουργήστε τον λογαριασμό διαχειριστή σας",
+    "Repeat Password": "Επαναλάβετε τον κωδικό πρόσβασης",
+    "Import Backup": "Εισαγωγή αντιγράφων ασφαλείας",
+    "Export Backup": "Εξαγωγή αντιγράφων ασφαλείας",
+    "Export": "Εξαγωγή",
+    "Import": "Εισαγωγή",
+    "respTime": "Χρόν. Aπό (ms)",
+    "notAvailableShort": "N/A",
+    "Default enabled": "Προεπιλογή ενεργοποιημένη",
+    "Apply on all existing monitors": "Εφαρμόστε σε όλες τις υπάρχουσες παρακολούθησης",
+    "Create": "Δημιουργία",
+    "Clear Data": "Καθαρισμός δεδομένων",
+    "Events": "Γεγονότα",
+    "Heartbeats": "Παλμοι καρδιας",
+    "Auto Get": "Αυτόματη λήψη",
+    "backupDescription": "Μπορείτε να δημιουργήσετε αντίγραφα ασφαλείας γία ολλες της παρακολούθησης και ειδοποιήσης σε ένα αρχείο JSON.",
+    "backupDescription2": "Σημείωση: δεν περιλαμβάνονται δεδομένα ιστορικού και συμβάντων.",
+    "backupDescription3": "Στο αρχείο εξαγωγής περιλαμβάνονται ευαίσθητα δεδομένα, όπως token ειδοποιήσεων. Aποθηκεύστε την εξαγωγή με ασφάλεια.",
+    "alertNoFile": "Επιλέξτε ένα αρχείο για εισαγωγή.",
+    "alertWrongFileType": "Επιλέξτε ένα αρχείο JSON.",
+    "Clear all statistics": "Εκκαθάριση όλων των στατιστικών",
+    "Skip existing": "Παράβλεψη υπάρχοντος",
+    "Overwrite": "Αντικατάσταση",
+    "Options": "Επιλογές",
+    "Keep both": "Κράτα και τα δύο",
+    "Verify Token": "Επαλήθευση Token",
+    "Setup 2FA": "Ρύθμιση 2FA",
+    "Enable 2FA": "Ενεργοποίηση 2FA",
+    "Disable 2FA": "Απενεργοποίηση 2FA",
+    "2FA Settings": "Ρυθμίσεις 2FA",
+    "Two Factor Authentication": "Έλεγχος ταυτότητας δύο παραγόντων",
+    "Active": "Ενεργός",
+    "Inactive": "Ανενεργό",
+    "Token": "Token",
+    "Show URI": "Εμφάνιση URI",
+    "Tags": "Ετικέτες",
+    "Add New below or Select...": "Προσθήκη νέου παρακάτω ή Επιλέξτε…",
+    "Tag with this name already exist.": "Υπάρχει ήδη η ετικέτα με αυτό το όνομα.",
+    "Tag with this value already exist.": "Υπάρχει ήδη ετικέτα με αυτό το value.",
+    "color": "χρώμα",
+    "value (optional)": "τιμή (προαιρετικό)",
+    "Gray": "Γκρί",
+    "Red": "Κόκκινο",
+    "Orange": "Πορτοκάλι",
+    "Green": "Πράσινο",
+    "Blue": "Μπλε",
+    "Indigo": "Indigo",
+    "Purple": "Μωβ",
+    "Pink": "Ροζ",
+    "Search...": "Αναζήτηση…",
+    "Avg. Ping": "Μέσo.Ping",
+    "Avg. Response": "Μέσo. Aπάντηση",
+    "Entry Page": "Σελίδα εισαγωγής",
+    "statusPageNothing": "Δεν υπάρχει τίποτα εδώ, προσθέστε μια ομάδα ή μια παρακολούθηση.",
+    "No Services": "Δεν υπάρχουν υπηρεσίες",
+    "All Systems Operational": "Όλα τα συστήματα λειτουργούν",
+    "Partially Degraded Service": "Μερικώς υποβαθμισμένη υπηρεσία",
+    "Degraded Service": "Υποβαθμισμένη υπηρεσία",
+    "Add Group": "Προσθήκη γρουπ",
+    "Add a monitor": "Προσθήκη παρακολούθησης",
+    "Edit Status Page": "Επεξεργασία σελίδας κατάστασης",
+    "Go to Dashboard": "Μεταβείτε στον Πίνακα ελέγχου",
+    "Status Page": "Σελίδα κατάστασης",
+    "Status Pages": "Σελίδες κατάστασης",
+    "defaultNotificationName": "Η ειδοποίηση μου {notification} ({number})",
+    "here": "εδώ",
+    "Required": "Απαιτείται",
+    "telegram": "Telegram",
+    "ZohoCliq": "ZohoCliq",
+    "Bot Token": "Διακριτικό Bot",
+    "wayToGetTelegramToken": "Μπορείτε να πάρετε ένα διακριτικό από {0}.",
+    "Chat ID": "Chat ID",
+    "supportTelegramChatID": "Support Direct Chat / Group / Channel's Chat ID",
+    "wayToGetTelegramChatID": "Μπορείτε να λάβετε το αναγνωριστικό συνομιλίας σας στέλνοντας ένα μήνυμα στο bot και μεταβαίνοντας σε αυτήν τη διεύθυνση URL για να προβάλετε το chat_id:",
+    "YOUR BOT TOKEN HERE": "ΤΟ BOT ΣΑΣ ΔΙΑΚΡΙΤΙΚΌ ΕΔΩ",
+    "chatIDNotFound": "Το Chat ID δεν βρέθηκε. Στείλτε πρώτα ένα μήνυμα σε αυτό το bot",
+    "webhook": "Webhook",
+    "Post URL": "Post URL",
+    "Content Type": "Τύπος περιεχομένου",
+    "webhookJsonDesc": "{0} είναι καλό για οποιονδήποτε σύγχρονο διακομιστή HTTP όπως το Express.js",
+    "webhookFormDataDesc": "{multipart} είναι καλό για την PHP. Το JSON θα πρέπει να αναλυθεί με {decodeFunction}",
+    "smtp": "Email (SMTP)",
+    "secureOptionNone": "None / STARTTLS (25, 587)",
+    "secureOptionTLS": "TLS (465)",
+    "Ignore TLS Error": "Παράβλεψη σφάλματος TLS",
+    "From Email": "Από Email",
+    "emailCustomSubject": "Προσαρμοσμένο θέμα",
+    "To Email": "Προς Email",
+    "smtpCC": "CC",
+    "smtpBCC": "BCC",
+    "discord": "Discord",
+    "Discord Webhook URL": "Discord Webhook URL",
+    "wayToGetDiscordURL": "Μπορείτε να το αποκτήσετε μεταβαίνοντας στις Ρυθμίσεις διακομιστή -> Ενσωματώσεις -> Προβολή των Webhooks -> Νέο Webhook",
+    "Bot Display Name": "Εμφανιζόμενο όνομα bot",
+    "Prefix Custom Message": "Προσαρμοσμένο μήνυμα",
+    "Hello @everyone is...": "Γεια {'@'}everyone είναι…",
+    "teams": "Microsoft Teams",
+    "Webhook URL": "Webhook URL",
+    "wayToGetTeamsURL": "Μπορείτε να μάθετε πώς να δημιουργείτε μια διεύθυνση URL webhook {0}.",
+    "wayToGetZohoCliqURL": "Μπορείτε να μάθετε πώς να δημιουργείτε μια διεύθυνση URL webhook {0}.",
+    "signal": "Signal",
+    "Number": "Αριθμός",
+    "Recipients": "Αποδέκτες",
+    "needSignalAPI": "Πρέπει να έχετε ένα signal client με REST API..",
+    "wayToCheckSignalURL": "Μπορείτε να ελέγξετε αυτό το URL για να δείτε πώς να ρυθμίσετε ένα:",
+    "signalImportant": "ΣΗΜΑΝΤΙΚΟ: Δεν μπορείτε να συνδυάσετε ομάδες και αριθμούς στους παραλήπτες!",
+    "gotify": "Gotify",
+    "Application Token": "Token εφαρμογής",
+    "Server URL": "URL διακομιστή",
+    "Priority": "Προτεραιότητα",
+    "slack": "Slack",
+    "Icon Emoji": "Εικονίδιο Emoji",
+    "Channel Name": "Όνομα καναλιού",
+    "Uptime Kuma URL": "Uptime Kuma URL",
+    "aboutWebhooks": "Περισσότερες πληροφορίες σχετικά με τα Webhooks στο: {0}",
+    "aboutChannelName": "Εισαγάγετε το όνομα του καναλιού στο {0} Όνομα καναλιού εάν θέλετε να παρακάμψετε το κανάλι Webhook. Π.χ.: #other-channel",
+    "aboutKumaURL": "Εάν αφήσετε κενό το πεδίο URL Uptime Kuma, θα είναι προεπιλεγμένο στη σελίδα Project GitHub..",
+    "emojiCheatSheet": "Φύλλο εξαπάτησης emoji: {0}",
+    "rocket.chat": "Rocket.Chat",
+    "pushover": "Pushover",
+    "pushy": "Pushy",
+    "PushByTechulus": "Push by Techulus",
+    "octopush": "Octopush",
+    "promosms": "PromoSMS",
+    "clicksendsms": "ClickSend SMS",
+    "lunasea": "LunaSea",
+    "apprise": "Apprise (Support 50+ Notification services)",
+    "GoogleChat": "Google Chat (Google Workspace only)",
+    "pushbullet": "Pushbullet",
+    "line": "Line Messenger",
+    "mattermost": "Mattermost",
+    "User Key": "Κλειδί χρήστη",
+    "Device": "Συσκευή",
+    "Message Title": "Τίτλος μηνύματος",
+    "Notification Sound": "Ήχος ειδοποίησης",
+    "More info on:": "Περισσότερες πληροφορίες στο: {0}",
+    "pushoverDesc1": "Η προτεραιότητα έκτακτης ανάγκης (2) έχει προεπιλεγμένο χρονικό όριο 30 δευτερολέπτων μεταξύ των επαναλήψεων και θα λήξει μετά από 1 ώρα.",
+    "pushoverDesc2": "Εάν θέλετε να στέλνετε ειδοποιήσεις σε διαφορετικές συσκευές, συμπληρώστε το πεδίο Συσκευή.",
+    "SMS Type": "Τύπος SMS",
+    "octopushTypePremium": "Premium (Γρήγορη - συνιστάται για ειδοποίηση)",
+    "octopushTypeLowCost": "Χαμηλό κόστος (Αργό - μερικές φορές μπλοκάρεται από τον χειριστή)",
+    "checkPrice": "Ελέγξτε τις τιμές {0}:",
+    "apiCredentials": "API credentials",
+    "octopushLegacyHint": "Χρησιμοποιείτε την παλαιού τύπου έκδοση του Octopush (2011-2020) ή τη νέα έκδοση;",
+    "Check octopush prices": "Ελέγξτε τις τιμές OctoPush {0}.",
+    "octopushPhoneNumber": "Αριθμός τηλεφώνου (διεθνής μορφή, π.χ.: +30694345678) ",
+    "octopushSMSSender": "Όνομα αποστολέα SMS: 3-11 αλφαριθμητικοί χαρακτήρες και διάστημα (a-zA-Z0-9)",
+    "LunaSea Device ID": "LunaSea Device ID",
+    "Apprise URL": "Apprise URL",
+    "Example:": "Παράδειγμα: {0}",
+    "Read more:": "Διαβάστε περισσότερα: {0}",
+    "Status:": "Κατάσταση: {0}",
+    "Read more": "Διαβάστε περισσότερα",
+    "appriseInstalled": "Το Apprise έχει εγκατασταθεί.",
+    "appriseNotInstalled": "Το Apprise δεν έχει εγκατασταθεί. {0}",
+    "Access Token": "Access Token",
+    "Channel access token": "Channel Access Token",
+    "Line Developers Console": "Line Developers Console",
+    "lineDevConsoleTo": "Line Developers Console - {0}",
+    "Basic Settings": "Βασικές ρυθμίσεις",
+    "User ID": "User ID",
+    "Messaging API": "Messaging API",
+    "wayToGetLineChannelToken": "Πρώτα αποκτήστε πρόσβαση στο {0}, δημιουργήστε έναν πάροχο και ένα κανάλι (Messanging API) και, στη συνέχεια, μπορείτε να λάβετε το channel access token και το user ID από τα παραπάνω στοιχεία μενού.",
+    "Icon URL": "Διεύθυνση URL εικονιδίου",
+    "aboutIconURL": "Μπορείτε να παρέχετε έναν σύνδεσμο προς μια εικόνα στο \"Icon URL\" για να παρακάμψετε την προεπιλεγμένη εικόνα προφίλ. Δεν θα χρησιμοποιηθεί εάν έχει οριστεί το εικονίδιο Emoji.",
+    "aboutMattermostChannelName": "Μπορείτε να παρακάμψετε το προεπιλεγμένο κανάλι στο οποίο δημοσιεύει το Webhook εισάγοντας το όνομα του καναλιού στο πεδίο \"Όνομα καναλιού\". Αυτό πρέπει να ενεργοποιηθεί στις ρυθμίσεις του Mattermost Webhook. Π.χ.: #other-channel",
+    "matrix": "Matrix",
+    "promosmsTypeEco": "SMS ECO - φθηνό αλλά αργό και συχνά υπερφορτωμένο. Περιορίζεται μόνο σε Πολωνούς παραλήπτες.",
+    "promosmsTypeFlash": "SMS FLASH - Το μήνυμα θα εμφανίζεται αυτόματα στη συσκευή του παραλήπτη. Περιορίζεται μόνο σε Πολωνούς παραλήπτες.",
+    "promosmsTypeFull": "SMS FULL - Premium επίπεδο SMS, Μπορείτε να χρησιμοποιήσετε το Όνομα Αποστολέα σας (Πρέπει πρώτα να καταχωρήσετε το όνομα). Αξιόπιστο για ειδοποιήσεις.",
+    "promosmsTypeSpeed": "SMS SPEED - Υψηλότερη προτεραιότητα στο σύστημα. Πολύ γρήγορο και αξιόπιστο αλλά ακριβό (περίπου διπλάσια τιμή SMS FULL).",
+    "promosmsPhoneNumber": "Αριθμός τηλεφώνου (για πολωνούς παραλήπτες Μπορείτε να παραλείψετε τους κωδικούς περιοχής)",
+    "promosmsSMSSender": "Όνομα αποστολέα SMS: Προεγγεγραμμένο όνομα ή ένα από τα προεπιλεγμένα: InfoSMS, SMS Info, MaxSMS, INFO, SMS",
+    "Feishu WebHookUrl": "Feishu WebHookURL",
+    "matrixHomeserverURL": "Homeserver URL (με http(s):// και προαιρετικά θύρα)",
+    "Internal Room Id": "Internal Room ID",
+    "matrixDesc1": "Μπορείτε να βρείτε το internal room ID ανατρέχοντας στην ενότητα για προχωρημένους των ρυθμίσεων δωματίου στο πρόγραμμα-πελάτη Matrix. Θα πρέπει να μοιάζει με !QMdRCpUIfLwsfjxye6:home.server.",
+    "matrixDesc2": "Συνιστάται ανεπιφύλακτα να δημιουργήσετε έναν νέο χρήστη και να μην χρησιμοποιήσετε το διακριτικό πρόσβασης του χρήστη Matrix, καθώς θα επιτρέψει την πλήρη πρόσβαση στον λογαριασμό σας και σε όλα τα δωμάτια στα οποία συμμετέχετε. Αντίθετα, δημιουργήστε έναν νέο χρήστη και προσκαλέστε τον μόνο στο δωμάτιο στο οποίο θέλετε να λαμβάνετε την ειδοποίηση. Μπορείτε να λάβετε το access token εκτελώντας {0}",
+    "Method": "Μέθοδος",
+    "Body": "Σώμα",
+    "Headers": "Κεφαλίδες",
+    "PushUrl": "Push URL",
+    "HeadersInvalidFormat": "Οι κεφαλίδες του αιτήματος δεν αποτελούν έγκυρο JSON: ",
+    "BodyInvalidFormat": "Το περιεχόμενο/σώμα του αιτήματος δεν αποτελεί έγκυρο JSON: ",
+    "Monitor History": "Ιστορικο Παρακολούθησης",
+    "clearDataOlderThan": "Διατηρήστε τα δεδομένα ιστορικού παρακολούθησης για {0} ημέρες.",
+    "PasswordsDoNotMatch": "Οι κωδικοί πρόσβασης δεν ταιριάζουν.",
+    "records": "εγγραφές",
+    "One record": "Μία εγγραφή",
+    "steamApiKeyDescription": "Για την παρακολούθηση ενός διακομιστή παιχνιδιών Steam χρειάζεστε ένα κλειδί Steam Web-API. Μπορείτε να καταχωρήσετε το κλειδί API σας εδώ: ",
+    "Current User": "Τρέχων χρήστης",
+    "topic": "Θέμα",
+    "topicExplanation": "Θέμα MQTT προς παρακολούθηση",
+    "successMessage": "Μήνυμα επιτυχίας",
+    "successMessageExplanation": "Μήνυμα MQTT που θα θεωρηθεί επιτυχές",
+    "recent": "Πρόσφατος",
+    "Done": "Ολοκληρώθηκε",
+    "Info": "Πληροφορίες",
+    "Security": "Ασφάλεια",
+    "Steam API Key": "Steam API Key",
+    "Shrink Database": "Συρρίκνωση βάσης δεδομένων",
+    "Pick a RR-Type...": "Επιλέξτε έναν τύπο RR…",
+    "Pick Accepted Status Codes...": "Επιλέξτε Αποδεκτούς κωδικούς κατάστασης…",
+    "Default": "Προκαθορισμένο",
+    "HTTP Options": "Επιλογές HTTP",
+    "Create Incident": "Δημιουργία περιστατικού",
+    "Title": "Τίτλος",
+    "Content": "Περιεχόμενο",
+    "Style": "Στυλ",
+    "info": "πληροφορίες",
+    "warning": "προειδοποίηση",
+    "danger": "κίνδυνος",
+    "error": "σφάλμα",
+    "critical": "κριτικό",
+    "primary": "κύριο",
+    "light": "φωτεινό",
+    "dark": "σκοτεινό",
+    "Post": "Δημοσίευση",
+    "Please input title and content": "Παρακαλούμε εισαγάγετε τίτλο και περιεχόμενο",
+    "Created": "Δημιουργήθηκε",
+    "Last Updated": "Τελευταία ενημέρωση",
+    "Unpin": "Ξεκαρφιτσώστε",
+    "Switch to Light Theme": "Μετάβαση σε Ανιχτό θέμα",
+    "Switch to Dark Theme": "Μετάβαση σε Σκούρο θέμα",
+    "Show Tags": "Εμφάνιση ετικετών",
+    "Hide Tags": "Απόκρυψη ετικετών",
+    "Description": "Περιγραφή",
+    "No monitors available.": "Δεν υπάρχουν διαθέσιμες παρακολουθήσεις.",
+    "Add one": "Προσθέστε ένα",
+    "No Monitors": "Χωρίς παρακολουθήσεις",
+    "Untitled Group": "Ομάδα χωρίς τίτλο",
+    "Services": "Υπηρεσίες",
+    "Discard": "Απορρίψει",
+    "Cancel": "Ακυρο",
+    "Powered by": "Με την υποστήριξη του",
+    "shrinkDatabaseDescription": "Ενεργοποίηση βάσης δεδομένων VACUUM για SQLite. Εάν η βάση δεδομένων σας έχει δημιουργηθεί μετά την έκδοση 1.10.0, το AUTO_VACUUM είναι ήδη ενεργοποιημένο και αυτή η ενέργεια δεν χρειάζεται.",
+    "serwersms": "SerwerSMS.pl",
+    "serwersmsAPIUser": "API Username (incl. webapi_ prefix)",
+    "serwersmsAPIPassword": "API κωδικός πρόσβασης",
+    "serwersmsPhoneNumber": "Αριθμός τηλεφώνου",
+    "serwersmsSenderName": "Όνομα αποστολέα SMS (καταχωρήθηκε μέσω της πύλης πελατών)",
+    "stackfield": "Stackfield",
+    "Customize": "Προσαρμογή",
+    "Custom Footer": "Προσαρμογή Footer",
+    "Custom CSS": "Προσαρμογή CSS",
+    "smtpDkimSettings": "Ρυθμίσεις DKIM",
+    "smtpDkimDesc": "Ανατρέξτε στο Nodemailer DKIM {0} για χρήση.",
+    "documentation": "documentation",
+    "smtpDkimDomain": "Domain Name",
+    "smtpDkimKeySelector": "Key Selector",
+    "smtpDkimPrivateKey": "Private Key",
+    "smtpDkimHashAlgo": "Hash Algorithm (Optional)",
+    "smtpDkimheaderFieldNames": "Header Keys to sign (Optional)",
+    "smtpDkimskipFields": "Header Keys not to sign (Optional)",
+    "wayToGetPagerDutyKey": "Μπορείτε να το λάβετε μεταβαίνοντας στο Service -> Service Directory -> (Επιλέξτε μια υπηρεσία) -> Integrations -> Add integration. Εδώ μπορείτε να κάνετε αναζήτηση για \"Events API V2\". Περισσότερες πληροφορίες {0}",
+    "Integration Key": "Integration Key",
+    "Integration URL": "Integration URL",
+    "Auto resolve or acknowledged": "Αυτόματη επίλυση ή αναγνώριση",
+    "do nothing": "μην κάνεις τίποτα",
+    "auto acknowledged": "αυτόματη αναγνώριση",
+    "auto resolve": "αυτόματη επίλυση",
+    "gorush": "Gorush",
+    "alerta": "Alerta",
+    "alertaApiEndpoint": "API Endpoint",
+    "alertaEnvironment": "Environment",
+    "alertaApiKey": "API Key",
+    "alertaAlertState": "Alert State",
+    "alertaRecoverState": "Recover State",
+    "deleteStatusPageMsg": "Είστε βέβαιοι ότι θέλετε να διαγράψετε αυτήν τη σελίδα κατάστασης?",
+    "Proxies": "Proxies",
+    "default": "Προκαθορισμένο",
+    "enabled": "Ενεργοποιημένο",
+    "setAsDefault": "Ορίσετε ως προεπιλογή",
+    "deleteProxyMsg": "Είστε βέβαιοι ότι θέλετε να διαγράψετε αυτό το proxy για όλες τις παρακολουθήσεις;",
+    "proxyDescription": "Πρέπει να εκχωρηθούν proxies σε μια οθπαρακολουθή για να λειτουργήσουν..",
+    "enableProxyDescription": "Το proxy δεν θα επηρεάσει τα αιτήματα της παρακολουθήσεις μέχρι να ενεργοποιηθεί. Μπορείτε να ελέγξετε την προσωρινή απενεργοποίηση του proxy από όλες τις παρακολουθήσεις βάσει κατάστασης ενεργοποίησης.",
+    "setAsDefaultProxyDescription": "Αυτός το proxy θα είναι ενεργοποιημένο από προεπιλογή για νέες παρακολουθήσεις. Μπορείτε ακόμα να απενεργοποιήσετε το proxy ξεχωριστά για κάθε οθόνη.",
+    "Certificate Chain": "Αλυσίδα Πιστοποιητικών",
+    "Valid": "Εγκυρο",
+    "Invalid": "Μη έγκυρο",
+    "AccessKeyId": "AccessKey ID",
+    "SecretAccessKey": "AccessKey Secret",
+    "PhoneNumbers": "PhoneNumbers",
+    "TemplateCode": "TemplateCode",
+    "SignName": "SignName",
+    "Sms template must contain parameters: ": "Το πρότυπο SMS πρέπει να περιέχει παραμέτρους: ",
+    "Bark Endpoint": "Bark Endpoint",
+    "Bark Group": "Bark Ομάδα",
+    "Bark Sound": "Bark Ήχος",
+    "WebHookUrl": "WebHookUrl",
+    "SecretKey": "SecretKey",
+    "For safety, must use secret key": "Για ασφάλεια, πρέπει να χρησιμοποιήσετε secret key",
+    "Device Token": "Device Token",
+    "Platform": "Platform",
+    "iOS": "iOS",
+    "Android": "Android",
+    "Huawei": "Huawei",
+    "High": "High",
+    "Retry": "Ξαναδοκιμάσετε",
+    "Topic": "Θέμα",
+    "WeCom Bot Key": "WeCom Bot Key",
+    "Setup Proxy": "Ρύθμιση Proxy",
+    "Proxy Protocol": "Πρωτόκολλο Proxy",
+    "Proxy Server": "Proxy Server",
+    "Proxy server has authentication": "Το Proxy διαθέτει έλεγχο ταυτότητας",
+    "User": "Χρήστης",
+    "Installed": "Εγκατεστημένο",
+    "Not installed": "Μη εγκατεστημενο",
+    "Running": "Τρέχη",
+    "Not running": "Δεν τρεχη",
+    "Remove Token": "Κατάργηση Token",
+    "Start": "Αρχή",
+    "Stop": "Στάση",
+    "Uptime Kuma": "Uptime Kuma",
+    "Add New Status Page": "Προσθήκη νέας σελίδας κατάστασης",
+    "Slug": "Slug",
+    "Accept characters:": "Αποδοχή χαρακτήρων:",
+    "startOrEndWithOnly": "Ξεκινήστε ή τελειώστε μόνο με {0}",
+    "No consecutive dashes": "Χωρίς διαδοχικές παύλες",
+    "Next": "Επόμενο",
+    "The slug is already taken. Please choose another slug.": "Ο slug έχει ήδη πιαστεί. Επιλέξτε άλλο slug.",
+    "No Proxy": "Οχι Proxy",
+    "Authentication": "Authentication",
+    "HTTP Basic Auth": "HTTP Basic Auth",
+    "New Status Page": "Νέας Σελίδα κατάστασης",
+    "Page Not Found": "Η σελίδα δεν βρέθηκε",
+    "Reverse Proxy": "Αντίστροφο Proxy",
+    "Backup": "Αντιγράφων ασφαλείας",
+    "About": "Σχετικά με το Uptime Kuma",
+    "wayToGetCloudflaredURL": "(Λήψη cloudflared από {0})",
+    "cloudflareWebsite": "Ιστοσελίδα Cloudflare",
+    "Message:": "Μήνυμα:",
+    "Don't know how to get the token? Please read the guide:": "Δεν ξέρετε πώς να αποκτήσετε το token; Διαβάστε τον οδηγό:",
+    "The current connection may be lost if you are currently connecting via Cloudflare Tunnel. Are you sure want to stop it? Type your current password to confirm it.": "Η τρέχουσα σύνδεση μπορεί να χαθεί εάν αυτή τη στιγμή συνδέεστε μέσω του Cloudflare Tunnel. Θέλετε σίγουρα να το σταματήσετε; Πληκτρολογήστε τον τρέχοντα κωδικό πρόσβασής σας για να τον επιβεβαιώσετε.",
+    "HTTP Headers": "Κεφαλίδες HTTP",
+    "Trust Proxy": "Εμπιστοσύνη του Proxy",
+    "Other Software": "Other Software",
+    "For example: nginx, Apache and Traefik.": "Για παράδειγμα: nginx, Apache και Traefik.",
+    "Please read": "Παρακαλώ διαβάστε",
+    "Subject:": "Θέμα:",
+    "Valid To:": "Εγκυρο για:",
+    "Days Remaining:": "Ημέρες που απομένουν:",
+    "Issuer:": "Εκδότης:",
+    "Fingerprint:": "Δακτυλικό αποτύπωμα:",
+    "No status pages": "Δεν υπάρχουν σελίδες κατάστασης",
+    "Domain Name Expiry Notification": "Ειδοποίηση λήξης ονόματος τομέα",
+    "Proxy": "Proxy",
+    "Date Created": "Ημερομηνία Δημιουργίας",
+    "HomeAssistant": "Home Assistant",
+    "onebotHttpAddress": "OneBot HTTP Address",
+    "onebotMessageType": "OneBot Message Type",
+    "onebotGroupMessage": "Group",
+    "onebotPrivateMessage": "Private",
+    "onebotUserOrGroupId": "Group/User ID",
+    "onebotSafetyTips": "Για ασφάλεια, πρέπει να ορίσετε το acess token",
+    "PushDeer Key": "PushDeer Key",
+    "Footer Text": "Κείμενο υποσέλιδου",
+    "Show Powered By": "Εμφάνιση Powered By",
+    "Domain Names": "Ονόματα Τομέα",
+    "signedInDisp": "Συνδεθήκατε ως {0}",
+    "signedInDispDisabled": "Εξουσιοδότηση είναι απενεργοποιημένη.",
+    "RadiusSecret": "Radius Secret",
+    "RadiusSecretDescription": "Shared Secret μεταξύ client και το server",
+    "RadiusCalledStationId": "Called Station Id",
+    "RadiusCalledStationIdDescription": "Identifier της καλούμενης συσκευής",
+    "RadiusCallingStationId": "Calling Station Id",
+    "RadiusCallingStationIdDescription": "Identifier oτης συσκευής κλήσης",
+    "Certificate Expiry Notification": "Ειδοποίηση Λήξης Πιστοποιητικού",
+    "API Username": "API Username",
+    "API Key": "API Key",
+    "Recipient Number": "Αριθμός Παραλήπτη",
+    "From Name/Number": "Από Όνομα/Αριθμός",
+    "Leave blank to use a shared sender number.": "Αφήστε το κενό για να χρησιμοποιήσετε έναν κοινόχρηστο αριθμό αποστολέα.",
+    "Octopush API Version": "Octopush API Version",
+    "Legacy Octopush-DM": "Legacy Octopush-DM",
+    "endpoint": "endpoint",
+    "octopushAPIKey": "\"API key\" από το HTTP API credentials στον πίνακα ελέγχου",
+    "octopushLogin": "\"Login\" από το HTTP API credentials στον πίνακα ελέγχου",
+    "promosmsLogin": "API Login Name",
+    "promosmsPassword": "API Password",
+    "pushoversounds pushover": "Pushover (default)",
+    "pushoversounds bike": "Bike",
+    "pushoversounds bugle": "Bugle",
+    "pushoversounds cashregister": "Cash Register",
+    "pushoversounds classical": "Classical",
+    "pushoversounds cosmic": "Cosmic",
+    "pushoversounds falling": "Falling",
+    "pushoversounds gamelan": "Gamelan",
+    "pushoversounds incoming": "Incoming",
+    "pushoversounds intermission": "Intermission",
+    "pushoversounds magic": "Magic",
+    "pushoversounds mechanical": "Mechanical",
+    "pushoversounds pianobar": "Piano Bar",
+    "pushoversounds siren": "Siren",
+    "pushoversounds spacealarm": "Space Alarm",
+    "pushoversounds tugboat": "Tug Boat",
+    "pushoversounds alien": "Alien Alarm (long)",
+    "pushoversounds climb": "Climb (long)",
+    "pushoversounds persistent": "Persistent (long)",
+    "pushoversounds echo": "Pushover Echo (long)",
+    "pushoversounds updown": "Up Down (long)",
+    "pushoversounds vibrate": "Vibrate Only",
+    "pushoversounds none": "None (silent)",
+    "pushyAPIKey": "Μυστικό API Key",
+    "pushyToken": "Τoken Συσκευής",
+    "Show update if available": "Εμφάνιση ενημέρωσης εάν είναι διαθέσιμη",
+    "Also check beta release": "Ελέγξτε επίσης την έκδοση beta",
+    "Using a Reverse Proxy?": "Χρησιμοποιείτε reverse proxy;",
+    "Check how to config it for WebSocket": "Ελέγξτε πώς να το ρυθμίσετε για το WebSocket",
+    "Steam Game Server": "Διακομιστής παιχνιδιών Steam",
+    "Most likely causes:": "Πιο πιθανές αιτίες:",
+    "The resource is no longer available.": "Ο πόρος δεν είναι πλέον διαθέσιμος.",
+    "There might be a typing error in the address.": "Μπορεί να υπάρχει σφάλμα πληκτρολόγησης στη διεύθυνση.",
+    "What you can try:": "Τι μπορείτε να δοκιμάσετε:",
+    "Retype the address.": "Πληκτρολογήστε ξανά τη διεύθυνση.",
+    "Go back to the previous page.": "Επιστρέψτε στην προηγούμενη σελίδα.",
+    "Coming Soon": "Ερχεται σύντομα",
+    "wayToGetClickSendSMSToken": "Μπορείτε να πάρετε το API Username και API Key απο {0} .",
+    "Connection String": "Connection String",
+    "Query": "Query",
+    "settingsCertificateExpiry": "Λήξη πιστοποιητικού TLS",
+    "certificationExpiryDescription": "Οι παρακολουθήσεις HTTPS ενεργοποιούν ειδοποίηση όταν λήξει το πιστοποιητικό TLS σε:",
+    "Setup Docker Host": "Ρύθμιση Docker Host",
+    "Connection Type": "Τύπος σύνδεσης",
+    "Docker Daemon": "Docker Daemon",
+    "deleteDockerHostMsg": "Είστε βέβαιοι ότι θέλετε να διαγράψετε αυτόν τον κεντρικό υπολογιστή βάσης για όλες τις παρακολουθήσεις;",
+    "socket": "Socket",
+    "tcp": "TCP / HTTP",
+    "Docker Container": "Docker Container",
+    "Container Name / ID": "Container Name / ID",
+    "Docker Host": "Docker Host",
+    "Docker Hosts": "Docker Hosts",
+    "ntfy Topic": "ntfy Topic",
+    "Domain": "Domain",
+    "Workstation": "Workstation",
+    "disableCloudflaredNoAuthMsg": "Βρίσκεστε σε λειτουργία No Auth, δεν απαιτείται κωδικός πρόσβασης.",
+    "trustProxyDescription": "Εμπιστευτείτε τις κεφαλίδες 'X-Forwarded-*'. Εάν θέλετε να λάβετε τη σωστή IP πελάτη και το Uptime Kuma σας βρίσκεται πίσω κάποιος proxy όπως το Nginx ή το Apache, θα πρέπει να το ενεργοποιήσετε.",
+    "wayToGetLineNotifyToken": "Μπορείτε να λάβετε ένα access token από το {0}",
+    "Examples": "Παραδείγματα",
+    "Home Assistant URL": "Home Assistant URL",
+    "Long-Lived Access Token": "Μακράς-Διάρκειας Κλειδί Τόκεν",
+    "Long-Lived Access Token can be created by clicking on your profile name (bottom left) and scrolling to the bottom then click Create Token. ": "Long-Lived Access Token μπορεί να δημιουργηθεί κάνοντας κλικ στο όνομα του προφίλ σας (κάτω αριστερά) και κάνοντας κύλιση προς τα κάτω και, στη συνέχεια, κάντε κλικ στο Create Token. ",
+    "Notification Service": "Υπηρεσία ειδοποιήσεων",
+    "default: notify all devices": "προεπιλογή: ειδοποίηση όλων των συσκευών",
+    "A list of Notification Services can be found in Home Assistant under \"Developer Tools > Services\" search for \"notification\" to find your device/phone name.": "Μπορείτε να βρείτε μια λίστα με τις Υπηρεσίες ειδοποιήσεων στον Home assistant στην περιοχή \"Developer Tools > Services\" αναζήτηση για \"notification\" για να βρείτε το όνομα της συσκευής/τηλεφώνου σας.",
+    "Automations can optionally be triggered in Home Assistant:": "Οι αυτοματισμοί μπορούν προαιρετικά να ενεργοποιηθούν στο Home Assistant:",
+    "Trigger type:": "Τύπος ενεργοποίησης:",
+    "Event type:": "Τύπος συμβάντος:",
+    "Event data:": "Δεδομένα συμβάντος:",
+    "Then choose an action, for example switch the scene to where an RGB light is red.": "Στη συνέχεια, επιλέξτε μια ενέργεια, για παράδειγμα αλλάξτε τη σκηνή στο σημείο όπου ένα φως RGB είναι κόκκινο.",
+    "Frontend Version": "Έκδοση Frontend",
+    "Frontend Version do not match backend version!": "Η Frontend έκδοση δεν ταιριάζει με την έκδοση backend!",
+    "Base URL": "Βασική διεύθυνση URL",
+    "goAlertInfo": "Το GoAlert είναι μια εφαρμογή ανοιχτού κώδικα για προγραμματισμό κλήσεων, αυτοματοποιημένες κλιμακώσεις και ειδοποιήσεις (όπως SMS ή φωνητικές κλήσεις). Αλληλεπιδράστε αυτόματα με το σωστό άτομο, με τον σωστό τρόπο και τη σωστή στιγμή! {0}",
+    "goAlertIntegrationKeyInfo": "Λάβετε το generic API integration key για την υπηρεσία σε αυτήν τη μορφή \"aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee\" συνήθως την τιμή της παραμέτρου διακριτικού της αντιγραμμένης διεύθυνσης URL.",
+    "goAlert": "GoAlert",
+    "backupOutdatedWarning": "Καταργήθηκε: Επειδή προστέθηκαν πολλές δυνατότητες και αυτή η δυνατότητα δημιουργίας αντιγράφων ασφαλείας δεν διατηρείται, δεν μπορεί να δημιουργήσει ή να επαναφέρει ένα πλήρες αντίγραφο ασφαλείας.",
+    "backupRecommend": "Παρακαλούμε δημιουργήστε αντίγραφα ασφαλείας του volume ή του φακέλου δεδομένων (./data/) απευθείας.",
+    "Maintenance": "Συντήρηση",
+    "General Monitor Type": "Επόπτης Γενικού Τύπου",
+    "maintenanceStatus-under-maintenance": "Υπό Συντήρηση",
+    "dnsCacheDescription": "Μπορεί να μη λειτουργεί σε κάποια IPv6 περιβάλλοντα, απενεργοποιήστε αν συναντήσετε προβλήματα.",
+    "uninstalling": "Γίνεται απεγκατάσταση",
+    "confirmUninstallPlugin": "Θέλετε σίγουρα να απεγκαταστήσετε αυτό το πρόσθετο;",
+    "smseagle": "SMSEagle",
+    "smseagleRecipientType": "Τύπος παραλήπτη",
+    "smseagleUrl": "Το URL της SMSEagle συσκευής σας",
+    "Start of maintenance": "Έναρξη συντήρησης",
+    "All Status Pages": "Όλες οι Σελίδες Κατάστασης",
+    "Select status pages...": "Επιλέξτε σελίδες κατάστασης…",
+    "Optional": "Προαιρετικό",
+    "weekdayShortMon": "Δευ",
+    "weekdayShortTue": "Τρι",
+    "weekdayShortWed": "Τετ",
+    "weekdayShortThu": "Πεμ",
+    "weekdayShortFri": "Παρ",
+    "weekdayShortSat": "Σαβ",
+    "Help": "Βοήθεια",
+    "Game": "Παιχνίδι",
+    "Specific Monitor Type": "Επόπτης Συγκεκριμένου Τύπου",
+    "Passive Monitor Type": "Επόπτης Παθητικού Τύπου",
+    "Monitor": "Επόπτης | Επόπτες",
+    "Schedule maintenance": "Προγραμματισμός συντήρησης",
+    "Affected Monitors": "Επηρεαζόμενοι Επόπτες",
+    "Pick Affected Monitors...": "Διαλέξτε Επηρεαζόμενους Επόπτες…",
+    "webhookAdditionalHeadersTitle": "Επιπρόσθετες Κεφαλίδες",
+    "webhookAdditionalHeadersDesc": "Ορίζει επιπρόσθετες κεφαλίδες που θα σταλθούν με το webhook.",
+    "weekdayShortSun": "Κυρ",
+    "dayOfWeek": "Ημέρα της Εβδομάδας",
+    "dayOfMonth": "Ημέρα του Μήνα",
+    "lastDay1": "Τελευταία Μέρα του Μήνα",
+    "lastDay2": "2η Τελευταία Μέρα του Μήνα",
+    "lastDay3": "3η Τελευταία Μέρα του Μήνα",
+    "lastDay4": "4η Τελευταία Μέρα του Μήνα",
+    "lastDay": "Τελευταία Μέρα",
+    "No Maintenance": "Όχι Συντήρηση",
+    "pauseMaintenanceMsg": "Είστε σίγουροι για την παύση;",
+    "maintenanceStatus-inactive": "Ανενεργό",
+    "maintenanceStatus-scheduled": "Προγραμματισμένο",
+    "maintenanceStatus-ended": "Ολοκληρωμένο",
+    "maintenanceStatus-unknown": "Άγνωστο",
+    "Display Timezone": "Προβολή Ζώνης Ώρας",
+    "Server Timezone": "Ζώνη Ώρας του Server",
+    "statusPageMaintenanceEndDate": "Λήξη",
+    "Custom": "Προσαρμοσμένο",
+    "Economy": "Οικονομία",
+    "loadingError": "Αδύνατη συλλογή δεδομένων, προσπαθήστε ξανά αργότερα.",
+    "SendKey": "SendKey",
+    "SMSManager API Docs": "API βιβλιογραφία του SMSManager ",
+    "Kook": "Kook",
+    "statusMaintenance": "Συντήρηση",
+    "markdownSupported": "Υποστήριξη markdown συντακτικού",
+    "Packet Size": "Μέγεθος Πακέτου",
+    "or": "ή",
+    "recurringInterval": "Χρονικό Διάστημα",
+    "Recurring": "Επαναλαμβανόμενο",
+    "strategyManual": "Ενεργό/Ανενεργό Χειροκίνητα",
+    "warningTimezone": "Χρησιμοποιεί την ζώνη ώρας του server",
+    "squadcast": "Squadcast",
+    "IconUrl": "URL εικονιδίου",
+    "Enable DNS Cache": "Ενεργοποίηση DNS Cache",
+    "Enable": "Ενεργοποίηση",
+    "Disable": "Απενεργοποίηση",
+    "Single Maintenance Window": "Μονό Παράθυρο Συντήρησης",
+    "Maintenance Time Window of a Day": "Ημερίσιο πρόγραμμα Συντήρησης",
+    "Effective Date Range": "Ημερομηνιακό Διάστημα Εφαρμογής",
+    "Schedule Maintenance": "Προγραμματισμός Συντήρησης",
+    "Date and Time": "Ημερομηνία και Ώρα",
+    "DateTime Range": "Ημερομηνιακό Πλαίσιο",
+    "plugin": "Πρόσθετο | Πρόσθετα",
+    "install": "Εγκατάσταση",
+    "installing": "Γίνεται εγκατάσταση",
+    "uninstall": "Απεγκατάσταση",
+    "dataRetentionTimeError": "Η περίοδος διατήρησης πρέπει να είναι 0 ή μεγαλύτερο",
+    "infiniteRetention": "Ορίστε 0 για μόνιμη διατήρηση.",
+    "confirmDeleteTagMsg": "Θέλετε σίγουρα να διαγράψετε αυτήν την ετικέτα; Οι επόπτες που σχετίζονται με αυτήν την ετικέτα δεν θα διαγραφούν.",
+    "enableGRPCTls": "Επιτρέψτε την αποστολή gRPC αιτημάτων μέσω TLS συνδέσεων",
+    "grpcMethodDescription": "Το όνομα της μεθόδου μετατρέπεται σε cammelCase μορφή όπως π.χ. sayHello, check, κλπ.",
+    "deleteMaintenanceMsg": "Θέλετε σίγουρα να διαγράψετε αυτή την συντήρηση;",
+    "recurringIntervalMessage": "Εκτέλεση μια φορά την ημέρα | Εκτέλεση μία φορά ανά {0} ημέρες",
+    "affectedMonitorsDescription": "Επιλέξτε τους επόπτες που επηρεάζονται από την τωρινή συντήρηση",
+    "affectedStatusPages": "Προβολή αυτού του μηνύματος συντήρησης σε επιλεγμένες σελίδες κατάστασης",
+    "atLeastOneMonitor": "Επιλέξτε τουλάχιστον έναν επηρεασμένο επόπτη",
+    "wayToGetKookBotToken": "Δημιουργήστε εφαρμογή και πάρτε το bot token στο {0}",
+    "wayToGetKookGuildID": "Ενεργοποιήστε την 'Λειτουργία Προγραμματιστή' στις ρυθμίσεις Kook, και κάντε δεξί κλικ στο guild για να πάρετε το ID του",
+    "Guild ID": "Guild ID",
+    "Strategy": "Στρατηγική",
+    "Enable TLS": "Ενεργοποίηση TLS",
+    "Proto Service Name": "Όνομα Υπηρεσίας Proto",
+    "Proto Method": "Μέθοδος Proto",
+    "Proto Content": "Περιεχόμενο Proto",
+    "Lowcost": "Χαμηλό κόστος",
+    "high": "υψηλό",
+    "Gateway Type": "Τύπος Πύλης",
+    "SMSManager": "SMSManager",
+    "You can divide numbers with": "Μπορείτε να διαιρέσετε αριθμούς με",
+    "promosmsAllowLongSMS": "Επέτρεψε SMS μεγάλου μεγέθους",
+    "smseagleTo": "Αριθμός(οί) τηλεφώνου",
+    "smseagleGroup": "Όνομα/Ονόματα γκρουπ καταλόγων",
+    "smseagleContact": "Όνομα/Ονόματα επαφών καταλόγου",
+    "smseagleRecipient": "Παραλήπτης(ες) (πολλαπλοί πρέπει να διαχωρίζονται με κόμμα)",
+    "smseagleToken": "API Κλειδί τόκεν",
+    "smseagleEncoding": "Αποστολή ως Unicode",
+    "Custom Monitor Type": "Προσαρμοσμένος Τύπος Επόπτη",
+    "Edit Tag": "Επεξεργασία Ετικέτας",
+    "Server Address": "Διεύθυνση Διακομιστή",
+    "Learn More": "Μάθετε περισσότερα",
+    "Free Mobile User Identifier": "Free Mobile User Identifier",
+    "Free Mobile API Key": "Free Mobile API Key",
+    "smseaglePriority": "Προτεραιότητα μηνύματος (0-9, προεπιλογή = 0)"
+}
diff --git a/src/lang/en.json b/src/lang/en.json
new file mode 100644
index 000000000..83bc22316
--- /dev/null
+++ b/src/lang/en.json
@@ -0,0 +1,676 @@
+{
+    "languageName": "English",
+    "Settings": "Settings",
+    "Dashboard": "Dashboard",
+    "Help": "Help",
+    "New Update": "New Update",
+    "Language": "Language",
+    "Appearance": "Appearance",
+    "Theme": "Theme",
+    "General": "General",
+    "Game": "Game",
+    "Primary Base URL": "Primary Base URL",
+    "Version": "Version",
+    "Check Update On GitHub": "Check Update On GitHub",
+    "List": "List",
+    "Add": "Add",
+    "Add New Monitor": "Add New Monitor",
+    "Quick Stats": "Quick Stats",
+    "Up": "Up",
+    "Down": "Down",
+    "Pending": "Pending",
+    "statusMaintenance": "Maintenance",
+    "Maintenance": "Maintenance",
+    "Unknown": "Unknown",
+    "General Monitor Type": "General Monitor Type",
+    "Passive Monitor Type": "Passive Monitor Type",
+    "Specific Monitor Type": "Specific Monitor Type",
+    "markdownSupported": "Markdown syntax supported",
+    "pauseDashboardHome": "Pause",
+    "Pause": "Pause",
+    "Name": "Name",
+    "Status": "Status",
+    "DateTime": "DateTime",
+    "Message": "Message",
+    "No important events": "No important events",
+    "Resume": "Resume",
+    "Edit": "Edit",
+    "Delete": "Delete",
+    "Current": "Current",
+    "Uptime": "Uptime",
+    "Cert Exp.": "Cert Exp.",
+    "Monitor": "Monitor | Monitors",
+    "day": "day | days",
+    "-day": "-day",
+    "hour": "hour",
+    "-hour": "-hour",
+    "Response": "Response",
+    "Ping": "Ping",
+    "Monitor Type": "Monitor Type",
+    "Keyword": "Keyword",
+    "Friendly Name": "Friendly Name",
+    "URL": "URL",
+    "Hostname": "Hostname",
+    "Port": "Port",
+    "Heartbeat Interval": "Heartbeat Interval",
+    "Retries": "Retries",
+    "Heartbeat Retry Interval": "Heartbeat Retry Interval",
+    "Resend Notification if Down X times consecutively": "Resend Notification if Down X times consecutively",
+    "Advanced": "Advanced",
+    "checkEverySecond": "Check every {0} seconds",
+    "retryCheckEverySecond": "Retry every {0} seconds",
+    "resendEveryXTimes": "Resend every {0} times",
+    "resendDisabled": "Resend disabled",
+    "retriesDescription": "Maximum retries before the service is marked as down and a notification is sent",
+    "ignoreTLSError": "Ignore TLS/SSL error for HTTPS websites",
+    "upsideDownModeDescription": "Flip the status upside down. If the service is reachable, it is DOWN.",
+    "maxRedirectDescription": "Maximum number of redirects to follow. Set to 0 to disable redirects.",
+    "Upside Down Mode": "Upside Down Mode",
+    "Max. Redirects": "Max. Redirects",
+    "Accepted Status Codes": "Accepted Status Codes",
+    "Push URL": "Push URL",
+    "needPushEvery": "You should call this URL every {0} seconds.",
+    "pushOptionalParams": "Optional parameters: {0}",
+    "Save": "Save",
+    "Notifications": "Notifications",
+    "Not available, please setup.": "Not available, please setup.",
+    "Setup Notification": "Setup Notification",
+    "Light": "Light",
+    "Dark": "Dark",
+    "Auto": "Auto",
+    "Theme - Heartbeat Bar": "Theme - Heartbeat Bar",
+    "Normal": "Normal",
+    "Bottom": "Bottom",
+    "None": "None",
+    "Timezone": "Timezone",
+    "Search Engine Visibility": "Search Engine Visibility",
+    "Allow indexing": "Allow indexing",
+    "Discourage search engines from indexing site": "Discourage search engines from indexing site",
+    "Change Password": "Change Password",
+    "Current Password": "Current Password",
+    "New Password": "New Password",
+    "Repeat New Password": "Repeat New Password",
+    "Update Password": "Update Password",
+    "Disable Auth": "Disable Auth",
+    "Enable Auth": "Enable Auth",
+    "disableauth.message1": "Are you sure want to <strong>disable authentication</strong>?",
+    "disableauth.message2": "It is designed for scenarios <strong>where you intend to implement third-party authentication</strong> in front of Uptime Kuma such as Cloudflare Access, Authelia or other authentication mechanisms.",
+    "Please use this option carefully!": "Please use this option carefully!",
+    "Logout": "Logout",
+    "Leave": "Leave",
+    "I understand, please disable": "I understand, please disable",
+    "Confirm": "Confirm",
+    "Yes": "Yes",
+    "No": "No",
+    "Username": "Username",
+    "Password": "Password",
+    "Remember me": "Remember me",
+    "Login": "Login",
+    "No Monitors, please": "No Monitors, please",
+    "add one": "add one",
+    "Notification Type": "Notification Type",
+    "Email": "Email",
+    "Test": "Test",
+    "Certificate Info": "Certificate Info",
+    "Resolver Server": "Resolver Server",
+    "Resource Record Type": "Resource Record Type",
+    "Last Result": "Last Result",
+    "Create your admin account": "Create your admin account",
+    "Repeat Password": "Repeat Password",
+    "Import Backup": "Import Backup",
+    "Export Backup": "Export Backup",
+    "Export": "Export",
+    "Import": "Import",
+    "respTime": "Resp. Time (ms)",
+    "notAvailableShort": "N/A",
+    "Default enabled": "Default enabled",
+    "Apply on all existing monitors": "Apply on all existing monitors",
+    "Create": "Create",
+    "Clear Data": "Clear Data",
+    "Events": "Events",
+    "Heartbeats": "Heartbeats",
+    "Auto Get": "Auto Get",
+    "Schedule maintenance": "Schedule maintenance",
+    "Affected Monitors": "Affected Monitors",
+    "Pick Affected Monitors...": "Pick Affected Monitors…",
+    "Start of maintenance": "Start of maintenance",
+    "All Status Pages": "All Status Pages",
+    "Select status pages...": "Select status pages…",
+    "alertNoFile": "Please select a file to import.",
+    "alertWrongFileType": "Please select a JSON file.",
+    "Clear all statistics": "Clear all Statistics",
+    "Skip existing": "Skip existing",
+    "Overwrite": "Overwrite",
+    "Options": "Options",
+    "Keep both": "Keep both",
+    "Verify Token": "Verify Token",
+    "Setup 2FA": "Setup 2FA",
+    "Enable 2FA": "Enable 2FA",
+    "Disable 2FA": "Disable 2FA",
+    "2FA Settings": "2FA Settings",
+    "Two Factor Authentication": "Two Factor Authentication",
+    "Active": "Active",
+    "Inactive": "Inactive",
+    "Token": "Token",
+    "Show URI": "Show URI",
+    "Tags": "Tags",
+    "Add New below or Select...": "Add New below or Select…",
+    "Tag with this name already exist.": "Tag with this name already exists.",
+    "Tag with this value already exist.": "Tag with this value already exists.",
+    "color": "Color",
+    "value (optional)": "value (optional)",
+    "Gray": "Gray",
+    "Red": "Red",
+    "Orange": "Orange",
+    "Green": "Green",
+    "Blue": "Blue",
+    "Indigo": "Indigo",
+    "Purple": "Purple",
+    "Pink": "Pink",
+    "Custom": "Custom",
+    "Search...": "Search…",
+    "Avg. Ping": "Avg. Ping",
+    "Avg. Response": "Avg. Response",
+    "Entry Page": "Entry Page",
+    "statusPageNothing": "Nothing here, please add a group or a monitor.",
+    "No Services": "No Services",
+    "All Systems Operational": "All Systems Operational",
+    "Partially Degraded Service": "Partially Degraded Service",
+    "Degraded Service": "Degraded Service",
+    "Add Group": "Add Group",
+    "Add a monitor": "Add a monitor",
+    "Edit Status Page": "Edit Status Page",
+    "Go to Dashboard": "Go to Dashboard",
+    "Status Page": "Status Page",
+    "Status Pages": "Status Pages",
+    "defaultNotificationName": "My {notification} Alert ({number})",
+    "here": "here",
+    "Required": "Required",
+    "Post URL": "Post URL",
+    "Content Type": "Content Type",
+    "webhookJsonDesc": "{0} is good for any modern HTTP servers such as Express.js",
+    "webhookFormDataDesc": "{multipart} is good for PHP. The JSON will need to be parsed with {decodeFunction}",
+    "webhookAdditionalHeadersTitle": "Additional Headers",
+    "webhookAdditionalHeadersDesc": "Sets additional headers sent with the webhook.",
+    "Webhook URL": "Webhook URL",
+    "Application Token": "Application Token",
+    "Server URL": "Server URL",
+    "Priority": "Priority",
+    "emojiCheatSheet": "Emoji cheat sheet: {0}",
+    "Read more": "Read more",
+    "appriseInstalled": "Apprise is installed.",
+    "appriseNotInstalled": "Apprise is not installed. {0}",
+    "Method": "Method",
+    "Body": "Body",
+    "Headers": "Headers",
+    "PushUrl": "Push URL",
+    "HeadersInvalidFormat": "The request headers are not valid JSON: ",
+    "BodyInvalidFormat": "The request body is not valid JSON: ",
+    "Monitor History": "Monitor History",
+    "clearDataOlderThan": "Keep monitor history data for {0} days.",
+    "PasswordsDoNotMatch": "Passwords do not match.",
+    "records": "records",
+    "One record": "One record",
+    "steamApiKeyDescription": "For monitoring a Steam Game Server you need a Steam Web-API key. You can register your API key here: ",
+    "Current User": "Current User",
+    "topic": "Topic",
+    "topicExplanation": "MQTT topic to monitor",
+    "successMessage": "Success Message",
+    "successMessageExplanation": "MQTT message that will be considered as success",
+    "recent": "Recent",
+    "Done": "Done",
+    "Info": "Info",
+    "Security": "Security",
+    "Steam API Key": "Steam API Key",
+    "Shrink Database": "Shrink Database",
+    "Pick a RR-Type...": "Pick a RR-Type…",
+    "Pick Accepted Status Codes...": "Pick Accepted Status Codes…",
+    "Default": "Default",
+    "HTTP Options": "HTTP Options",
+    "Create Incident": "Create Incident",
+    "Title": "Title",
+    "Content": "Content",
+    "Style": "Style",
+    "info": "info",
+    "warning": "warning",
+    "danger": "danger",
+    "error": "error",
+    "critical": "critical",
+    "primary": "primary",
+    "light": "light",
+    "dark": "dark",
+    "Post": "Post",
+    "Please input title and content": "Please input title and content",
+    "Created": "Created",
+    "Last Updated": "Last Updated",
+    "Unpin": "Unpin",
+    "Switch to Light Theme": "Switch to Light Theme",
+    "Switch to Dark Theme": "Switch to Dark Theme",
+    "Show Tags": "Show Tags",
+    "Hide Tags": "Hide Tags",
+    "Description": "Description",
+    "No monitors available.": "No monitors available.",
+    "Add one": "Add one",
+    "No Monitors": "No Monitors",
+    "Untitled Group": "Untitled Group",
+    "Services": "Services",
+    "Discard": "Discard",
+    "Cancel": "Cancel",
+    "Powered by": "Powered by",
+    "shrinkDatabaseDescription": "Trigger database VACUUM for SQLite. If your database is created after 1.10.0, AUTO_VACUUM is already enabled and this action is not needed.",
+    "Customize": "Customize",
+    "Custom Footer": "Custom Footer",
+    "Custom CSS": "Custom CSS",
+    "deleteStatusPageMsg": "Are you sure want to delete this status page?",
+    "Proxies": "Proxies",
+    "default": "Default",
+    "enabled": "Enabled",
+    "setAsDefault": "Set As Default",
+    "deleteProxyMsg": "Are you sure want to delete this proxy for all monitors?",
+    "proxyDescription": "Proxies must be assigned to a monitor to function.",
+    "enableProxyDescription": "This proxy will not effect on monitor requests until it is activated. You can control temporarily disable the proxy from all monitors by activation status.",
+    "setAsDefaultProxyDescription": "This proxy will be enabled by default for new monitors. You can still disable the proxy separately for each monitor.",
+    "Certificate Chain": "Certificate Chain",
+    "Valid": "Valid",
+    "Invalid": "Invalid",
+    "User": "User",
+    "Installed": "Installed",
+    "Not installed": "Not installed",
+    "Running": "Running",
+    "Not running": "Not running",
+    "Remove Token": "Remove Token",
+    "Start": "Start",
+    "Stop": "Stop",
+    "Add New Status Page": "Add New Status Page",
+    "Slug": "Slug",
+    "Accept characters:": "Accept characters:",
+    "startOrEndWithOnly": "Start or end with {0} only",
+    "No consecutive dashes": "No consecutive dashes",
+    "Next": "Next",
+    "The slug is already taken. Please choose another slug.": "The slug is already taken. Please choose another slug.",
+    "No Proxy": "No Proxy",
+    "Authentication": "Authentication",
+    "HTTP Basic Auth": "HTTP Basic Auth",
+    "New Status Page": "New Status Page",
+    "Page Not Found": "Page Not Found",
+    "Reverse Proxy": "Reverse Proxy",
+    "Backup": "Backup",
+    "About": "About",
+    "wayToGetCloudflaredURL": "(Download cloudflared from {0})",
+    "cloudflareWebsite": "Cloudflare Website",
+    "Message:": "Message:",
+    "Don't know how to get the token? Please read the guide:": "Don't know how to get the token? Please read the guide:",
+    "The current connection may be lost if you are currently connecting via Cloudflare Tunnel. Are you sure want to stop it? Type your current password to confirm it.": "The current connection may be lost if you are currently connecting via Cloudflare Tunnel. Are you sure want to stop it? Type your current password to confirm it.",
+    "HTTP Headers": "HTTP Headers",
+    "Trust Proxy": "Trust Proxy",
+    "Other Software": "Other Software",
+    "For example: nginx, Apache and Traefik.": "For example: nginx, Apache and Traefik.",
+    "Please read": "Please read",
+    "Subject:": "Subject:",
+    "Valid To:": "Valid To:",
+    "Days Remaining:": "Days Remaining:",
+    "Issuer:": "Issuer:",
+    "Fingerprint:": "Fingerprint:",
+    "No status pages": "No status pages",
+    "Domain Name Expiry Notification": "Domain Name Expiry Notification",
+    "Proxy": "Proxy",
+    "Date Created": "Date Created",
+    "Footer Text": "Footer Text",
+    "Show Powered By": "Show Powered By",
+    "Domain Names": "Domain Names",
+    "signedInDisp": "Signed in as {0}",
+    "signedInDispDisabled": "Auth Disabled.",
+    "RadiusSecret": "Radius Secret",
+    "RadiusSecretDescription": "Shared Secret between client and server",
+    "RadiusCalledStationId": "Called Station Id",
+    "RadiusCalledStationIdDescription": "Identifier of the called device",
+    "RadiusCallingStationId": "Calling Station Id",
+    "RadiusCallingStationIdDescription": "Identifier of the calling device",
+    "Certificate Expiry Notification": "Certificate Expiry Notification",
+    "API Username": "API Username",
+    "API Key": "API Key",
+    "Show update if available": "Show update if available",
+    "Also check beta release": "Also check beta release",
+    "Using a Reverse Proxy?": "Using a Reverse Proxy?",
+    "Check how to config it for WebSocket": "Check how to config it for WebSocket",
+    "Steam Game Server": "Steam Game Server",
+    "Most likely causes:": "Most likely causes:",
+    "The resource is no longer available.": "The resource is no longer available.",
+    "There might be a typing error in the address.": "There might be a typing error in the address.",
+    "What you can try:": "What you can try:",
+    "Retype the address.": "Retype the address.",
+    "Go back to the previous page.": "Go back to the previous page.",
+    "Coming Soon": "Coming Soon",
+    "Connection String": "Connection String",
+    "Query": "Query",
+    "settingsCertificateExpiry": "TLS Certificate Expiry",
+    "certificationExpiryDescription": "HTTPS Monitors trigger notification when TLS certificate expires in:",
+    "Setup Docker Host": "Setup Docker Host",
+    "Connection Type": "Connection Type",
+    "Docker Daemon": "Docker Daemon",
+    "deleteDockerHostMsg": "Are you sure want to delete this docker host for all monitors?",
+    "socket": "Socket",
+    "tcp": "TCP / HTTP",
+    "Docker Container": "Docker Container",
+    "Container Name / ID": "Container Name / ID",
+    "Docker Host": "Docker Host",
+    "Docker Hosts": "Docker Hosts",
+    "Domain": "Domain",
+    "Workstation": "Workstation",
+    "Packet Size": "Packet Size",
+    "Bot Token": "Bot Token",
+    "wayToGetTelegramToken": "You can get a token from {0}.",
+    "Chat ID": "Chat ID",
+    "telegramMessageThreadID": "(Optional) Message Thread ID",
+    "telegramMessageThreadIDDescription": "Optional Unique identifier for the target message thread (topic) of the forum; for forum supergroups only",
+    "telegramSendSilently": "Send Silently",
+    "telegramSendSilentlyDescription": "Sends the message silently. Users will receive a notification with no sound.",
+    "telegramProtectContent": "Protect Forwarding/Saving",
+    "telegramProtectContentDescription": "If enabled, the bot messages in Telegram will be protected from forwarding and saving.",
+    "supportTelegramChatID": "Support Direct Chat / Group / Channel's Chat ID",
+    "wayToGetTelegramChatID": "You can get your chat ID by sending a message to the bot and going to this URL to view the chat_id:",
+    "YOUR BOT TOKEN HERE": "YOUR BOT TOKEN HERE",
+    "chatIDNotFound": "Chat ID is not found; please send a message to this bot first",
+    "disableCloudflaredNoAuthMsg": "You are in No Auth mode, a password is not required.",
+    "trustProxyDescription": "Trust 'X-Forwarded-*' headers. If you want to get the correct client IP and your Uptime Kuma is behind a proxy such as Nginx or Apache, you should enable this.",
+    "wayToGetLineNotifyToken": "You can get an access token from {0}",
+    "Examples": "Examples",
+    "Home Assistant URL": "Home Assistant URL",
+    "Long-Lived Access Token": "Long-Lived Access Token",
+    "Long-Lived Access Token can be created by clicking on your profile name (bottom left) and scrolling to the bottom then click Create Token. ": "Long-Lived Access Token can be created by clicking on your profile name (bottom left) and scrolling to the bottom then click Create Token. ",
+    "Notification Service": "Notification Service",
+    "default: notify all devices": "default: notify all devices",
+    "A list of Notification Services can be found in Home Assistant under \"Developer Tools > Services\" search for \"notification\" to find your device/phone name.": "A list of Notification Services can be found in Home Assistant under \"Developer Tools > Services\" search for \"notification\" to find your device/phone name.",
+    "Automations can optionally be triggered in Home Assistant:": "Automations can optionally be triggered in Home Assistant:",
+    "Trigger type:": "Trigger type:",
+    "Event type:": "Event type:",
+    "Event data:": "Event data:",
+    "Then choose an action, for example switch the scene to where an RGB light is red.": "Then choose an action, for example switch the scene to where an RGB light is red.",
+    "Frontend Version": "Frontend Version",
+    "Frontend Version do not match backend version!": "Frontend Version do not match backend version!",
+    "backupOutdatedWarning": "Deprecated: Since a lot of features were added and this backup feature is a bit unmaintained, it cannot generate or restore a complete backup.",
+    "backupRecommend": "Please backup the volume or the data folder (./data/) directly instead.",
+    "Optional": "Optional",
+    "or": "or",
+    "recurringInterval": "Interval",
+    "Recurring": "Recurring",
+    "strategyManual": "Active/Inactive Manually",
+    "warningTimezone": "It is using the server's timezone",
+    "weekdayShortMon": "Mon",
+    "weekdayShortTue": "Tue",
+    "weekdayShortWed": "Wed",
+    "weekdayShortThu": "Thu",
+    "weekdayShortFri": "Fri",
+    "weekdayShortSat": "Sat",
+    "weekdayShortSun": "Sun",
+    "dayOfWeek": "Day of Week",
+    "dayOfMonth": "Day of Month",
+    "lastDay": "Last Day",
+    "lastDay1": "Last Day of Month",
+    "lastDay2": "2nd Last Day of Month",
+    "lastDay3": "3rd Last Day of Month",
+    "lastDay4": "4th Last Day of Month",
+    "No Maintenance": "No Maintenance",
+    "pauseMaintenanceMsg": "Are you sure want to pause?",
+    "maintenanceStatus-under-maintenance": "Under Maintenance",
+    "maintenanceStatus-inactive": "Inactive",
+    "maintenanceStatus-scheduled": "Scheduled",
+    "maintenanceStatus-ended": "Ended",
+    "maintenanceStatus-unknown": "Unknown",
+    "Display Timezone": "Display Timezone",
+    "Server Timezone": "Server Timezone",
+    "statusPageMaintenanceEndDate": "End",
+    "IconUrl": "Icon URL",
+    "Enable DNS Cache": "Enable DNS Cache",
+    "Enable": "Enable",
+    "Disable": "Disable",
+    "dnsCacheDescription": "It may be not working in some IPv6 environments, disable it if you encounter any issues.",
+    "Single Maintenance Window": "Single Maintenance Window",
+    "Maintenance Time Window of a Day": "Maintenance Time Window of a Day",
+    "Effective Date Range": "Effective Date Range",
+    "Schedule Maintenance": "Schedule Maintenance",
+    "Date and Time": "Date and Time",
+    "DateTime Range": "DateTime Range",
+    "loadingError": "Cannot fetch the data, please try again later.",
+    "plugin": "Plugin | Plugins",
+    "install": "Install",
+    "installing": "Installing",
+    "uninstall": "Uninstall",
+    "uninstalling": "Uninstalling",
+    "confirmUninstallPlugin": "Are you sure want to uninstall this plugin?",
+    "notificationRegional": "Regional",
+    "smtp": "Email (SMTP)",
+    "secureOptionNone": "None / STARTTLS (25, 587)",
+    "secureOptionTLS": "TLS (465)",
+    "Ignore TLS Error": "Ignore TLS Error",
+    "From Email": "From Email",
+    "emailCustomSubject": "Custom Subject",
+    "To Email": "To Email",
+    "smtpCC": "CC",
+    "smtpBCC": "BCC",
+    "Discord Webhook URL": "Discord Webhook URL",
+    "wayToGetDiscordURL": "You can get this by going to Server Settings -> Integrations -> View Webhooks -> New Webhook",
+    "Bot Display Name": "Bot Display Name",
+    "Prefix Custom Message": "Prefix Custom Message",
+    "Hello @everyone is...": "Hello {'@'}everyone is…",
+    "wayToGetTeamsURL": "You can learn how to create a webhook URL {0}.",
+    "wayToGetZohoCliqURL": "You can learn how to create a webhook URL {0}.",
+    "needSignalAPI": "You need to have a signal client with REST API.",
+    "wayToCheckSignalURL": "You can check this URL to view how to set one up:",
+    "Number": "Number",
+    "Recipients": "Recipients",
+    "Access Token": "Access Token",
+    "Channel access token": "Channel access token",
+    "Line Developers Console": "Line Developers Console",
+    "lineDevConsoleTo": "Line Developers Console - {0}",
+    "Basic Settings": "Basic Settings",
+    "User ID": "User ID",
+    "Messaging API": "Messaging API",
+    "wayToGetLineChannelToken": "First access the {0}, create a provider and channel (Messaging API), then you can get the channel access token and user ID from the above mentioned menu items.",
+    "Icon URL": "Icon URL",
+    "aboutIconURL": "You can provide a link to a picture in \"Icon URL\" to override the default profile picture. Will not be used if Icon Emoji is set.",
+    "aboutMattermostChannelName": "You can override the default channel that the Webhook posts to by entering the channel name into \"Channel Name\" field. This needs to be enabled in the Mattermost Webhook settings. Ex: #other-channel",
+    "dataRetentionTimeError": "Retention period must be 0 or greater",
+    "infiniteRetention": "Set to 0 for infinite retention.",
+    "confirmDeleteTagMsg": "Are you sure you want to delete this tag? Monitors associated with this tag will not be deleted.",
+    "enableGRPCTls": "Allow to send gRPC request with TLS connection",
+    "grpcMethodDescription": "Method name is convert to cammelCase format such as sayHello, check, etc.",
+    "acceptedStatusCodesDescription": "Select status codes which are considered as a successful response.",
+    "deleteMonitorMsg": "Are you sure want to delete this monitor?",
+    "deleteMaintenanceMsg": "Are you sure want to delete this maintenance?",
+    "deleteNotificationMsg": "Are you sure want to delete this notification for all monitors?",
+    "dnsPortDescription": "DNS server port. Defaults to 53. You can change the port at any time.",
+    "resolverserverDescription": "Cloudflare is the default server. You can change the resolver server anytime.",
+    "rrtypeDescription": "Select the RR type you want to monitor",
+    "pauseMonitorMsg": "Are you sure want to pause?",
+    "enableDefaultNotificationDescription": "This notification will be enabled by default for new monitors. You can still disable the notification separately for each monitor.",
+    "clearEventsMsg": "Are you sure want to delete all events for this monitor?",
+    "clearHeartbeatsMsg": "Are you sure want to delete all heartbeats for this monitor?",
+    "confirmClearStatisticsMsg": "Are you sure you want to delete ALL statistics?",
+    "importHandleDescription": "Choose 'Skip existing' if you want to skip every monitor or notification with the same name. 'Overwrite' will delete every existing monitor and notification.",
+    "confirmImportMsg": "Are you sure you want to import the backup? Please verify you've selected the correct import option.",
+    "twoFAVerifyLabel": "Please enter your token to verify 2FA:",
+    "tokenValidSettingsMsg": "Token is valid! You can now save the 2FA settings.",
+    "confirmEnableTwoFAMsg": "Are you sure you want to enable 2FA?",
+    "confirmDisableTwoFAMsg": "Are you sure you want to disable 2FA?",
+    "recurringIntervalMessage": "Run once every day | Run once every {0} days",
+    "affectedMonitorsDescription": "Select monitors that are affected by current maintenance",
+    "affectedStatusPages": "Show this maintenance message on selected status pages",
+    "atLeastOneMonitor": "Select at least one affected monitor",
+    "passwordNotMatchMsg": "The repeat password does not match.",
+    "notificationDescription": "Notifications must be assigned to a monitor to function.",
+    "keywordDescription": "Search keyword in plain HTML or JSON response. The search is case-sensitive.",
+    "backupDescription": "You can backup all monitors and notifications into a JSON file.",
+    "backupDescription2": "Note: history and event data is not included.",
+    "backupDescription3": "Sensitive data such as notification tokens are included in the export file; please store export securely.",
+    "endpoint": "endpoint",
+    "octopushAPIKey": "\"API key\" from HTTP API credentials in control panel",
+    "octopushLogin": "\"Login\" from HTTP API credentials in control panel",
+    "promosmsLogin": "API Login Name",
+    "promosmsPassword": "API Password",
+    "pushoversounds pushover": "Pushover (default)",
+    "pushoversounds bike": "Bike",
+    "pushoversounds bugle": "Bugle",
+    "pushoversounds cashregister": "Cash Register",
+    "pushoversounds classical": "Classical",
+    "pushoversounds cosmic": "Cosmic",
+    "pushoversounds falling": "Falling",
+    "pushoversounds gamelan": "Gamelan",
+    "pushoversounds incoming": "Incoming",
+    "pushoversounds intermission": "Intermission",
+    "pushoversounds magic": "Magic",
+    "pushoversounds mechanical": "Mechanical",
+    "pushoversounds pianobar": "Piano Bar",
+    "pushoversounds siren": "Siren",
+    "pushoversounds spacealarm": "Space Alarm",
+    "pushoversounds tugboat": "Tug Boat",
+    "pushoversounds alien": "Alien Alarm (long)",
+    "pushoversounds climb": "Climb (long)",
+    "pushoversounds persistent": "Persistent (long)",
+    "pushoversounds echo": "Pushover Echo (long)",
+    "pushoversounds updown": "Up Down (long)",
+    "pushoversounds vibrate": "Vibrate Only",
+    "pushoversounds none": "None (silent)",
+    "pushyAPIKey": "Secret API Key",
+    "pushyToken": "Device token",
+    "apprise": "Apprise (Support 50+ Notification services)",
+    "GoogleChat": "Google Chat (Google Workspace only)",
+    "wayToGetKookBotToken": "Create application and get your bot token at {0}",
+    "wayToGetKookGuildID": "Switch on 'Developer Mode' in Kook setting, and right click the guild to get its ID",
+    "Guild ID": "Guild ID",
+    "User Key": "User Key",
+    "Device": "Device",
+    "Message Title": "Message Title",
+    "Notification Sound": "Notification Sound",
+    "More info on:": "More info on: {0}",
+    "pushoverDesc1": "Emergency priority (2) has default 30 second timeout between retries and will expire after 1 hour.",
+    "pushoverDesc2": "If you want to send notifications to different devices, fill out Device field.",
+    "SMS Type": "SMS Type",
+    "octopushTypePremium": "Premium (Fast - recommended for alerting)",
+    "octopushTypeLowCost": "Low Cost (Slow - sometimes blocked by operator)",
+    "checkPrice": "Check {0} prices:",
+    "apiCredentials": "API credentials",
+    "octopushLegacyHint": "Do you use the legacy version of Octopush (2011-2020) or the new version?",
+    "Check octopush prices": "Check octopush prices {0}.",
+    "octopushPhoneNumber": "Phone number (intl format, eg : +33612345678) ",
+    "octopushSMSSender": "SMS Sender Name : 3-11 alphanumeric characters and space (a-zA-Z0-9)",
+    "LunaSea Device ID": "LunaSea Device ID",
+    "Apprise URL": "Apprise URL",
+    "Example:": "Example: {0}",
+    "Read more:": "Read more: {0}",
+    "Status:": "Status: {0}",
+    "Strategy": "Strategy",
+    "Free Mobile User Identifier": "Free Mobile User Identifier",
+    "Free Mobile API Key": "Free Mobile API Key",
+    "Enable TLS": "Enable TLS",
+    "Proto Service Name": "Proto Service Name",
+    "Proto Method": "Proto Method",
+    "Proto Content": "Proto Content",
+    "Economy": "Economy",
+    "Lowcost": "Lowcost",
+    "high": "high",
+    "SendKey": "SendKey",
+    "SMSManager API Docs": "SMSManager API Docs ",
+    "Gateway Type": "Gateway Type",
+    "You can divide numbers with": "You can divide numbers with",
+    "Base URL": "Base URL",
+    "goAlertInfo": "GoAlert is a An open source application for on-call scheduling, automated escalations and notifications (like SMS or voice calls). Automatically engage the right person, the right way, and at the right time! {0}",
+    "goAlertIntegrationKeyInfo": "Get generic API integration key for the service in this format \"aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee\" usually the value of token parameter of copied URL.",
+    "AccessKeyId": "AccessKey ID",
+    "SecretAccessKey": "AccessKey Secret",
+    "PhoneNumbers": "PhoneNumbers",
+    "TemplateCode": "TemplateCode",
+    "SignName": "SignName",
+    "Sms template must contain parameters: ": "Sms template must contain parameters: ",
+    "Bark Endpoint": "Bark Endpoint",
+    "Bark Group": "Bark Group",
+    "Bark Sound": "Bark Sound",
+    "WebHookUrl": "WebHookUrl",
+    "SecretKey": "SecretKey",
+    "For safety, must use secret key": "For safety, must use secret key",
+    "Device Token": "Device Token",
+    "Platform": "Platform",
+    "Android": "Android",
+    "Huawei": "Huawei",
+    "High": "High",
+    "Retry": "Retry",
+    "Topic": "Topic",
+    "WeCom Bot Key": "WeCom Bot Key",
+    "Setup Proxy": "Setup Proxy",
+    "Proxy Protocol": "Proxy Protocol",
+    "Proxy Server": "Proxy Server",
+    "Proxy server has authentication": "Proxy server has authentication",
+    "promosmsTypeEco": "SMS ECO - cheap but slow and often overloaded. Limited only to Polish recipients.",
+    "promosmsTypeFlash": "SMS FLASH - Message will automatically show on recipient device. Limited only to Polish recipients.",
+    "promosmsTypeFull": "SMS FULL - Premium tier of SMS, You can use your Sender Name (You need to register name first). Reliable for alerts.",
+    "promosmsTypeSpeed": "SMS SPEED - Highest priority in system. Very quick and reliable but costly (about twice of SMS FULL price).",
+    "promosmsPhoneNumber": "Phone number (for Polish recipient You can skip area codes)",
+    "promosmsSMSSender": "SMS Sender Name : Pre-registred name or one of defaults: InfoSMS, SMS Info, MaxSMS, INFO, SMS",
+    "promosmsAllowLongSMS": "Allow long SMS",
+    "Feishu WebHookUrl": "Feishu WebHookURL",
+    "matrixHomeserverURL": "Homeserver URL (with http(s):// and optionally port)",
+    "Internal Room Id": "Internal Room ID",
+    "matrixDesc1": "You can find the internal room ID by looking in the advanced section of the room settings in your Matrix client. It should look like !QMdRCpUIfLwsfjxye6:home.server.",
+    "matrixDesc2": "It is highly recommended you create a new user and do not use your own Matrix user's access token as it will allow full access to your account and all the rooms you joined. Instead, create a new user and only invite it to the room that you want to receive the notification in. You can get the access token by running {0}",
+    "Channel Name": "Channel Name",
+    "Uptime Kuma URL": "Uptime Kuma URL",
+    "Icon Emoji": "Icon Emoji",
+    "signalImportant": "IMPORTANT: You cannot mix groups and numbers in recipients!",
+    "aboutWebhooks": "More info about Webhooks on: {0}",
+    "aboutChannelName": "Enter the channel name on {0} Channel Name field if you want to bypass the Webhook channel. Ex: #other-channel",
+    "aboutKumaURL": "If you leave the Uptime Kuma URL field blank, it will default to the Project GitHub page.",
+    "smtpDkimSettings": "DKIM Settings",
+    "smtpDkimDesc": "Please refer to the Nodemailer DKIM {0} for usage.",
+    "documentation": "documentation",
+    "smtpDkimDomain": "Domain Name",
+    "smtpDkimKeySelector": "Key Selector",
+    "smtpDkimPrivateKey": "Private Key",
+    "smtpDkimHashAlgo": "Hash Algorithm (Optional)",
+    "smtpDkimheaderFieldNames": "Header Keys to sign (Optional)",
+    "smtpDkimskipFields": "Header Keys not to sign (Optional)",
+    "wayToGetPagerDutyKey": "You can get this by going to Service -> Service Directory -> (Select a service) -> Integrations -> Add integration. Here you can search for \"Events API V2\". More info {0}",
+    "Integration Key": "Integration Key",
+    "Integration URL": "Integration URL",
+    "Auto resolve or acknowledged": "Auto resolve or acknowledged",
+    "do nothing": "do nothing",
+    "auto acknowledged": "auto acknowledged",
+    "auto resolve": "auto resolve",
+    "alertaApiEndpoint": "API Endpoint",
+    "alertaEnvironment": "Environment",
+    "alertaApiKey": "API Key",
+    "alertaAlertState": "Alert State",
+    "alertaRecoverState": "Recover State",
+    "serwersmsAPIUser": "API Username (incl. webapi_ prefix)",
+    "serwersmsAPIPassword": "API Password",
+    "serwersmsPhoneNumber": "Phone number",
+    "serwersmsSenderName": "SMS Sender Name (registered via customer portal)",
+    "smseagleTo": "Phone number(s)",
+    "smseagleGroup": "Phonebook group name(s)",
+    "smseagleContact": "Phonebook contact name(s)",
+    "smseagleRecipientType": "Recipient type",
+    "smseagleRecipient": "Recipient(s) (multiple must be separated with comma)",
+    "smseagleToken": "API Access token",
+    "smseagleUrl": "Your SMSEagle device URL",
+    "smseagleEncoding": "Send as Unicode",
+    "smseaglePriority": "Message priority (0-9, default = 0)",
+    "Recipient Number": "Recipient Number",
+    "From Name/Number": "From Name/Number",
+    "Leave blank to use a shared sender number.": "Leave blank to use a shared sender number.",
+    "Octopush API Version": "Octopush API Version",
+    "Legacy Octopush-DM": "Legacy Octopush-DM",
+    "ntfy Topic": "ntfy Topic",
+    "onebotHttpAddress": "OneBot HTTP Address",
+    "onebotMessageType": "OneBot Message Type",
+    "onebotGroupMessage": "Group",
+    "onebotPrivateMessage": "Private",
+    "onebotUserOrGroupId": "Group/User ID",
+    "onebotSafetyTips": "For safety, must set access token",
+    "PushDeer Key": "PushDeer Key",
+    "wayToGetClickSendSMSToken": "You can get API Username and API Key from {0} .",
+    "Custom Monitor Type": "Custom Monitor Type",
+    "Google Analytics ID": "Google Analytics ID",
+    "Edit Tag": "Edit Tag",
+    "Server Address": "Server Address",
+    "Learn More": "Learn More",
+    "Body Encoding": "Body Encoding"
+}
diff --git a/src/lang/es-ES.json b/src/lang/es-ES.json
new file mode 100644
index 000000000..d8e46f8db
--- /dev/null
+++ b/src/lang/es-ES.json
@@ -0,0 +1,692 @@
+{
+    "languageName": "Español",
+    "checkEverySecond": "Comprobar cada {0} segundos",
+    "retriesDescription": "Número máximo de intentos antes de que el servicio se marque como CAÍDO y una notificación sea enviada",
+    "ignoreTLSError": "Ignorar error TLS/SSL para sitios web HTTPS",
+    "upsideDownModeDescription": "Invertir el estado. Si el servicio es alcanzable, está CAÍDO.",
+    "maxRedirectDescription": "Número máximo de direcciones a seguir. Establecer a 0 para deshabilitar.",
+    "acceptedStatusCodesDescription": "Seleccionar los códigos de estado que se consideran como respuesta exitosa.",
+    "passwordNotMatchMsg": "La contraseña repetida no coincide.",
+    "notificationDescription": "Por favor asigna una notificación a el/los monitor(es) para hacerlos funcional(es).",
+    "keywordDescription": "Buscar palabra clave en HTML plano o respuesta JSON. La búsqueda es sensible a mayúsculas.",
+    "pauseDashboardHome": "Pausado",
+    "deleteMonitorMsg": "¿Seguro que quieres eliminar este monitor?",
+    "deleteNotificationMsg": "¿Seguro que quieres eliminar esta notificación para todos los monitores?",
+    "resolverserverDescription": "Cloudflare es el servidor por defecto, puedes cambiar el servidor de resolución en cualquier momento.",
+    "rrtypeDescription": "Selecciona el tipo de registro que quieres monitorizar",
+    "pauseMonitorMsg": "¿Seguro que quieres pausar?",
+    "Settings": "Ajustes",
+    "Dashboard": "Panel",
+    "New Update": "Nueva actualización",
+    "Language": "Idioma",
+    "Appearance": "Apariencia",
+    "Theme": "Tema",
+    "General": "General",
+    "Version": "Versión",
+    "Check Update On GitHub": "Comprobar actualizaciones en GitHub",
+    "List": "Lista",
+    "Add": "Añadir",
+    "Add New Monitor": "Añadir nuevo monitor",
+    "Quick Stats": "Estadísticas rápidas",
+    "Up": "Funcional",
+    "Down": "Caído",
+    "Pending": "Pendiente",
+    "Unknown": "Desconocido",
+    "Pause": "Pausar",
+    "Name": "Nombre",
+    "Status": "Estado",
+    "DateTime": "Fecha y hora",
+    "Message": "Mensaje",
+    "No important events": "No hay eventos importantes",
+    "Resume": "Reanudar",
+    "Edit": "Editar",
+    "Delete": "Eliminar",
+    "Current": "Actual",
+    "Uptime": "Tiempo activo",
+    "Cert Exp.": "Caducidad cert.",
+    "day": "día | días",
+    "-day": "-día",
+    "hour": "hora",
+    "-hour": "-hora",
+    "Response": "Respuesta",
+    "Ping": "Ping",
+    "Monitor Type": "Tipo de monitor",
+    "Keyword": "Palabra clave",
+    "Friendly Name": "Nombre sencillo",
+    "URL": "URL",
+    "Hostname": "Nombre del host",
+    "Port": "Puerto",
+    "Heartbeat Interval": "Intervalo de latido",
+    "Retries": "Reintentos",
+    "Advanced": "Avanzado",
+    "Upside Down Mode": "Modo invertido",
+    "Max. Redirects": "Redirecciones máximas",
+    "Accepted Status Codes": "Códigos de estado aceptados",
+    "Save": "Guardar",
+    "Notifications": "Notificaciones",
+    "Not available, please setup.": "No disponible, por favor configúralo.",
+    "Setup Notification": "Configurar notificación",
+    "Light": "Claro",
+    "Dark": "Oscuro",
+    "Auto": "Auto",
+    "Theme - Heartbeat Bar": "Tema - Barra de intervalo de latido",
+    "Normal": "Normal",
+    "Bottom": "Abajo",
+    "None": "Ninguno",
+    "Timezone": "Zona horaria",
+    "Search Engine Visibility": "Visibilidad motor de búsqueda",
+    "Allow indexing": "Permitir indexación",
+    "Discourage search engines from indexing site": "Disuadir a los motores de búsqueda de indexar el sitio",
+    "Change Password": "Cambiar contraseña",
+    "Current Password": "Contraseña actual",
+    "New Password": "Nueva contraseña",
+    "Repeat New Password": "Repetir nueva contraseña",
+    "Update Password": "Actualizar contraseña",
+    "Disable Auth": "Deshabilitar autenticación",
+    "Enable Auth": "Habilitar autenticación",
+    "disableauth.message1": "Seguro que deseas <strong>deshabilitar la autenticación</strong>?",
+    "disableauth.message2": "Es para <strong>quien implementa autenticación de terceros</strong> ante Uptime Kuma como por ejemplo Cloudflare Access.",
+    "Please use this option carefully!": "¡Utilice esta opción con cuidado!",
+    "Logout": "Cerrar sesión",
+    "Leave": "Salir",
+    "I understand, please disable": "Entiendo, por favor deshabilitar",
+    "Confirm": "Confirmar",
+    "Yes": "Sí",
+    "No": "No",
+    "Username": "Usuario",
+    "Password": "Contraseña",
+    "Remember me": "Recordarme",
+    "Login": "Acceso",
+    "No Monitors, please": "Sin monitores, por favor",
+    "add one": "añade uno",
+    "Notification Type": "Tipo de notificación",
+    "Email": "Email",
+    "Test": "Test",
+    "Certificate Info": "Información del certificado",
+    "Resolver Server": "Servidor de resolución",
+    "Resource Record Type": "Tipo de registro",
+    "Last Result": "Último resultado",
+    "Create your admin account": "Crea tu cuenta de administrador",
+    "Repeat Password": "Repetir contraseña",
+    "respTime": "Tiempo de resp. (ms)",
+    "notAvailableShort": "N/A",
+    "Create": "Crear",
+    "clearEventsMsg": "¿Estás seguro de que deseas eliminar todos los eventos de este monitor?",
+    "clearHeartbeatsMsg": "¿Estás seguro de que deseas eliminar todos los latidos de este monitor?",
+    "confirmClearStatisticsMsg": "¿Estás seguro de que deseas eliminar TODAS las estadísticas?",
+    "Clear Data": "Borrar datos",
+    "Events": "Eventos",
+    "Heartbeats": "Latidos",
+    "Auto Get": "Obtener automáticamente",
+    "enableDefaultNotificationDescription": "Para cada nuevo monitor, esta notificación estará habilitada de forma predeterminada. Aún puedes deshabilitar la notificación por separado para cada monitor.",
+    "Default enabled": "Habilitado por defecto",
+    "Also apply to existing monitors": "También se aplica a monitores existentes",
+    "Export": "Exportar",
+    "Import": "Importar",
+    "backupDescription": "Puedes hacer una copia de seguridad de todos los monitores y todas las notificaciones en un archivo JSON.",
+    "backupDescription2": "PD: el historial y los datos de eventos no están incluidos.",
+    "backupDescription3": "Los datos confidenciales, como los tokens de notificación, se incluyen en el archivo de exportación. Guárdalo con cuidado.",
+    "alertNoFile": "Selecciona un archivo para importar.",
+    "alertWrongFileType": "Selecciona un archivo JSON.",
+    "twoFAVerifyLabel": "Ingresa tu token para verificar que 2FA está funcionando:",
+    "tokenValidSettingsMsg": "¡El token es válido! Ahora puedes guardar la configuración de 2FA.",
+    "confirmEnableTwoFAMsg": "¿Estás seguro de que quieres habilitar 2FA?",
+    "confirmDisableTwoFAMsg": "¿Estás seguro de que quieres desactivar 2FA?",
+    "Apply on all existing monitors": "Aplicar en todos los monitores existentes",
+    "Verify Token": "Verificar token",
+    "Setup 2FA": "Configurar 2FA",
+    "Enable 2FA": "Habilitar 2FA",
+    "Disable 2FA": "Desactivar 2FA",
+    "2FA Settings": "Ajustes 2FA",
+    "Two Factor Authentication": "Autenticación de dos factores",
+    "Active": "Activo",
+    "Inactive": "Inactivo",
+    "Token": "Token",
+    "Show URI": "Mostrar URI",
+    "Clear all statistics": "Borrar todas las estadísticas",
+    "retryCheckEverySecond": "Reintentar cada {0} segundos",
+    "importHandleDescription": "Elige 'Omitir existente' si deseas omitir todos los monitores o notificaciones con el mismo nombre. 'Sobrescribir' eliminará todos los monitores y notificaciones existentes.",
+    "confirmImportMsg": "¿Estás seguro de importar la copia de seguridad? Asegúrate de haber seleccionado la opción de importación correcta.",
+    "Heartbeat Retry Interval": "Intervalo de reintento de latido",
+    "Import Backup": "Importar copia de seguridad",
+    "Export Backup": "Exportar copia de seguridad",
+    "Skip existing": "Omitir existente",
+    "Overwrite": "Sobrescribir",
+    "Options": "Opciones",
+    "Keep both": "Manténer ambos",
+    "Tags": "Etiquetas",
+    "Add New below or Select...": "Agregar nuevo a continuación o seleccionar…",
+    "Tag with this name already exist.": "Una etiqueta con este nombre ya existe.",
+    "Tag with this value already exist.": "Una etiqueta con este valor ya existe.",
+    "color": "color",
+    "value (optional)": "valor (opcional)",
+    "Gray": "Gris",
+    "Red": "Rojo",
+    "Orange": "Naranja",
+    "Green": "Verde",
+    "Blue": "Azul",
+    "Indigo": "Índigo",
+    "Purple": "Morado",
+    "Pink": "Rosa",
+    "Search...": "Buscar…",
+    "Avg. Ping": "Ping promedio",
+    "Avg. Response": "Respuesta promedio",
+    "Entry Page": "Página de entrada",
+    "statusPageNothing": "No hay nada aquí, agrega un grupo o un monitor.",
+    "No Services": "Sin servicio",
+    "All Systems Operational": "Todos los sistemas están operativos",
+    "Partially Degraded Service": "Servicio parcialmente degradado",
+    "Degraded Service": "Servicio degradado",
+    "Add Group": "Agregar grupo",
+    "Add a monitor": "Agregar un monitor",
+    "Edit Status Page": "Editar página de estado",
+    "Go to Dashboard": "Ir al panel de control",
+    "Status Page": "Página de estado",
+    "Status Pages": "Páginas de estado",
+    "telegram": "Telegram",
+    "webhook": "Webhook",
+    "smtp": "Email (SMTP)",
+    "discord": "Discord",
+    "teams": "Microsoft Teams",
+    "signal": "Señal",
+    "gotify": "Gotify",
+    "slack": "Slack",
+    "rocket.chat": "Rocket.chat",
+    "pushover": "Pushover",
+    "pushy": "Pushy",
+    "octopush": "Octopush",
+    "promosms": "PromoSMS",
+    "lunasea": "LunaSea",
+    "apprise": "Apprise (Admite más de 50 servicios de notificación)",
+    "pushbullet": "Pushbullet",
+    "line": "Line Messenger",
+    "mattermost": "Mattermost",
+    "Monitor History": "Historial de monitor",
+    "clearDataOlderThan": "Mantener los datos del historial del monitor durante {0} días.",
+    "records": "registros",
+    "One record": "Un registro",
+    "steamApiKeyDescription": "Para monitorear un servidor de juegos de Steam, necesitas una clave Steam Web-API. Puedes registrar tu clave API aquí: ",
+    "Custom Monitor Type": "Monitor Tipo Personalizado",
+    "Primary Base URL": "URL Base Primaria",
+    "Passive Monitor Type": "Monitor Tipo Pasivo",
+    "pushOptionalParams": "Parámetros opcionales: {0}",
+    "Schedule maintenance": "Programar mantenimiento",
+    "Pick Affected Monitors...": "Seleccionar Monitores Afectados…",
+    "Start of maintenance": "Inicio del mantenimiento",
+    "All Status Pages": "Todas las Páginas de Estado",
+    "Select status pages...": "Seleccionar páginas de estado…",
+    "Style": "Estilo",
+    "info": "información",
+    "warning": "advertencia",
+    "danger": "peligro",
+    "critical": "crítico",
+    "primary": "primario",
+    "Content": "Contenido",
+    "recent": "Reciente",
+    "Done": "Terminado",
+    "Create Incident": "Crear Incidente",
+    "Title": "Título",
+    "Info": "Información",
+    "Security": "Seguridad",
+    "Current User": "Usuario Actual",
+    "topic": "Asunto",
+    "Shrink Database": "Reducir Base de Datos",
+    "dark": "oscuro",
+    "light": "claro",
+    "Last Updated": "Última Actualización",
+    "Show Tags": "Mostrar Etiquetas",
+    "Switch to Light Theme": "Cambiar a Tema Claro",
+    "Add one": "Añadir uno",
+    "Description": "Descripción",
+    "Cancel": "Cancelar",
+    "No Monitors": "Sin Monitores",
+    "Untitled Group": "Grupo sin título",
+    "Services": "Servicios",
+    "Discard": "Descartar",
+    "Add New Status Page": "Añadir Nueva Página de Estado",
+    "Start": "Iniciar",
+    "Stop": "Parar",
+    "Remove Token": "Eliminar Token",
+    "Powered by": "Potenciado por",
+    "Customize": "Personalizar",
+    "Custom Footer": "Pie Personalizado",
+    "Custom CSS": "CSS Personalizado",
+    "Backup": "Respaldo",
+    "Go back to the previous page.": "Volver a la página anterior.",
+    "Query": "Consulta",
+    "Examples": "Ejemplos",
+    "weekdayShortMon": "Lun",
+    "weekdayShortWed": "Mie",
+    "weekdayShortSat": "Sab",
+    "Ignore TLS Error": "Ignorar Error TLS",
+    "secureOptionNone": "Ninguno / STARTTLS (25, 587)",
+    "Schedule Maintenance": "Programar Mantenimiento",
+    "Date and Time": "Fecha y Hora",
+    "Enable": "Habilitar",
+    "Disable": "Deshabilitar",
+    "maintenanceStatus-inactive": "Inactivo",
+    "maintenanceStatus-scheduled": "Programado",
+    "maintenanceStatus-unknown": "Desconocido",
+    "Display Timezone": "Mostrar Zona Horaria",
+    "Server Timezone": "Servidor de Zona Horaria",
+    "statusPageMaintenanceEndDate": "Finaliza",
+    "Enable DNS Cache": "Habilitar Cache DNS",
+    "No Maintenance": "Sin Mantenimiento",
+    "weekdayShortSun": "Dom",
+    "dayOfWeek": "Día de la Semana",
+    "dayOfMonth": "Día del Mes",
+    "lastDay": "Último día",
+    "lastDay1": "Último Día del Mes",
+    "pauseMaintenanceMsg": "¿Seguro que quiere pausar?",
+    "maintenanceStatus-under-maintenance": "En Mantenimiento",
+    "DateTime Range": "Rango de Fecha y Hora",
+    "infiniteRetention": "Poner a 0 para retención infinita.",
+    "confirmDeleteTagMsg": "¿Estas seguro que quieres eliminar esta etiqueta? Los monitores asociados a esta etiqueta no serán eliminados.",
+    "Example:": "Ejemplo: {0}",
+    "Strategy": "Estrategia",
+    "Read more:": "Leer más: {0}",
+    "onebotGroupMessage": "Grupo",
+    "Affected Monitors": "Monitores Afectados",
+    "Custom": "Personalizado",
+    "Headers": "Encabezados",
+    "PhoneNumbers": "Números de Teléfono",
+    "No monitors available.": "Sin monitores disponibles.",
+    "error": "error",
+    "deleteProxyMsg": "¿Seguro que quieres eliminar este proxy para todos los monitores?",
+    "Hide Tags": "Ocultar Etiquetas",
+    "Created": "Creado",
+    "Switch to Dark Theme": "Cambiar a Tema Oscuro",
+    "More info on:": "Más información en: {0}",
+    "weekdayShortTue": "Mar",
+    "PasswordsDoNotMatch": "Las contraseñas no coinciden.",
+    "statusMaintenance": "Mantenimiento",
+    "Maintenance": "Mantenimiento",
+    "General Monitor Type": "Monitor Tipo General",
+    "Specific Monitor Type": "Monitor Tipo Específico",
+    "Monitor": "Monitores",
+    "Resend Notification if Down X times consecutively": "Reenviar Notificación si Caído X veces consecutivamente",
+    "resendEveryXTimes": "Reenviar cada {0} veces",
+    "resendDisabled": "Reenvío deshabilitado",
+    "needPushEvery": "Debe llamar a esta URL cada {0} segundos.",
+    "here": "aquí",
+    "Content Type": "Tipo de Contenido",
+    "Required": "Requerido",
+    "defaultNotificationName": "Mi {notification} Alerta ({number})",
+    "Server URL": "URL del servidor",
+    "Priority": "Prioridad",
+    "Read more": "Leer más",
+    "Body": "Cuerpo",
+    "webhookAdditionalHeadersTitle": "Encabezados Adicionales",
+    "Method": "Método",
+    "Default": "Predeterminado",
+    "uninstalling": "Desinstalando",
+    "install": "Instalar",
+    "installing": "Instalando",
+    "uninstall": "Desinstalar",
+    "confirmUninstallPlugin": "¿Estas seguro que quieres desinstalar este complemento?",
+    "Recipients": "Destinatarios",
+    "User ID": "ID de Usuario",
+    "deleteMaintenanceMsg": "¿Seguro que quieres eliminar este mantenimiento?",
+    "promosmsLogin": "Nombre de inicio de sesión de la API",
+    "SMS Type": "Tipo de SMS",
+    "Device": "Dispositivo",
+    "Message Title": "Título del Mensaje",
+    "Notification Sound": "Sonido de Notificación",
+    "documentation": "documentación",
+    "onebotUserOrGroupId": "Grupo/ID de Usuario",
+    "Game": "Juego",
+    "or": "ó",
+    "Status:": "Estado: {0}",
+    "Help": "Ayuda",
+    "HTTP Options": "Opciones HTTP",
+    "weekdayShortThu": "Jue",
+    "weekdayShortFri": "Vie",
+    "maintenanceStatus-ended": "Finalizado",
+    "BodyInvalidFormat": "El cuerpo de la solicitud no es JSON válido: ",
+    "topicExplanation": "Tema MQTT para monitorear",
+    "successMessageExplanation": "Mensaje MQTT que será considerado como éxito",
+    "Steam API Key": "API Key de Steam",
+    "Please input title and content": "Por favor introduzca título y contenido",
+    "Footer Text": "Texto del Pié",
+    "Show Powered By": "Mostrar Potenciado Por",
+    "Domain Names": "Nombres de Dominio",
+    "signedInDisp": "Iniciada sesión como {0}",
+    "RadiusSecretDescription": "Secreto Compartido entre cliente y servidor",
+    "RadiusCalledStationId": "Id de la Estación Llamada",
+    "RadiusCalledStationIdDescription": "Identificador del dispositivo llamado",
+    "RadiusCallingStationId": "Id de Estación Llamante",
+    "Certificate Expiry Notification": "Notificación de Caducidad del Certificado",
+    "API Username": "Nombre Usuario API",
+    "API Key": "Clave API",
+    "Show update if available": "Mostrar actualización si está disponible",
+    "Also check beta release": "Comprobar también lanzamientos beta",
+    "Steam Game Server": "Servidor de Juegos de Steam",
+    "Most likely causes:": "Las causas más probables:",
+    "There might be a typing error in the address.": "Debe haber un error de escritura en la dirección.",
+    "What you can try:": "Lo que puedes intentar:",
+    "Retype the address.": "Reescriba la dirección.",
+    "Coming Soon": "Próximamente",
+    "Connection String": "Cadena de Conexión",
+    "settingsCertificateExpiry": "Caducidad del certificado TLS",
+    "certificationExpiryDescription": "Los monitores HTTPS activan una notificación cuando el certificado TLS caduca en:",
+    "Setup Docker Host": "Configurar Host de Docker",
+    "Connection Type": "Tipo de Conexión",
+    "Docker Daemon": "Demonio Docker",
+    "deleteDockerHostMsg": "¿Estas seguro que quieres eliminar este host de docker para todos los monitores?",
+    "Date Created": "Fecha de Creación",
+    "signedInDispDisabled": "Autenticación Deshabilitada.",
+    "RadiusCallingStationIdDescription": "Identificador del dispositivo llamante",
+    "Using a Reverse Proxy?": "¿Usando un Proxy Inverso?",
+    "Check how to config it for WebSocket": "Compruebe cómo configurarlo para WebSocket",
+    "The resource is no longer available.": "El recurso ya no está disponible.",
+    "Push URL": "URL Push",
+    "Webhook URL": "URL Webhook",
+    "Application Token": "Token de Aplicación",
+    "appriseNotInstalled": "Apprise no está instalado. {0}",
+    "PushUrl": "URL Push",
+    "HeadersInvalidFormat": "Los encabezados de solicitud no son JSON válido: ",
+    "Post URL": "URL Post",
+    "emojiCheatSheet": "Hoja de trucos Emoji: {0}",
+    "webhookJsonDesc": "{0} es bueno para cualquier servidor HTTP moderno como Express.js",
+    "webhookFormDataDesc": "{multipart} es bueno para PHP. El JSON deberá analizarse con {decodeFunction}",
+    "webhookAdditionalHeadersDesc": "Establece encabezados adicionales enviados con el webhook.",
+    "appriseInstalled": "Apprise está instalado.",
+    "successMessage": "Mensaje de éxito",
+    "Pick Accepted Status Codes...": "Seleccione Códigos de Estado Aceptados…",
+    "Post": "Post",
+    "shrinkDatabaseDescription": "Activar ASPIRADORA para SQLite. Si tu base de datos fue creada después 1.10.0, AUTO_ASPIRADORA ya está habilitada y esta acción no es necesaria.",
+    "deleteStatusPageMsg": "¿Estas seguro que quieres eliminar esta página de estado?",
+    "default": "Predeterminado",
+    "enabled": "Habilitado",
+    "setAsDefault": "Establecer Por Defecto",
+    "proxyDescription": "Proxies deben ser asignados a un monitor para que funcionen.",
+    "warningTimezone": "Está usando la zona horaria del servidor",
+    "trustProxyDescription": "Confiar en los encabezados 'X-Forwarded-*'. Si desea obtener la IP de cliente correcta y su Uptime Kuma está detrás de un proxy como Nginx o Apache, debe habilitar esto.",
+    "enableProxyDescription": "Este proxy no afectará las solicitudes de monitoreo hasta que se active. Puede controlar deshabilitar temporalmente el proxy de todos los monitores por estado de activación.",
+    "setAsDefaultProxyDescription": "Este proxy estará habilitado de forma predeterminada para los nuevos monitores. Todavía puede deshabilitar el proxy por separado para cada monitor.",
+    "Certificate Chain": "Cadena de certificado",
+    "Valid": "Válido",
+    "Invalid": "Inválido",
+    "User": "Usuario",
+    "Installed": "Instalado",
+    "Not installed": "No instalado",
+    "Running": "Funcionando",
+    "Not running": "No funcionando",
+    "Slug": "Slug",
+    "Accept characters:": "Aceptar caracteres:",
+    "Proxies": "Proxys",
+    "startOrEndWithOnly": "Empezar o terminar sólo con {0}",
+    "No consecutive dashes": "Sin guiones consecutivos",
+    "Next": "Siguiente",
+    "The slug is already taken. Please choose another slug.": "Este slug ya está en uso. Por favor, elige otro slug.",
+    "No Proxy": "Sin Proxy",
+    "Authentication": "Autenticación",
+    "HTTP Basic Auth": "Autenticación básica HTTP",
+    "New Status Page": "Nueva Página de Estado",
+    "Page Not Found": "Página No Encontrada",
+    "Reverse Proxy": "Proxy Inverso",
+    "About": "Acerca de",
+    "wayToGetCloudflaredURL": "(Descargar cloudflared de {0})",
+    "cloudflareWebsite": "Web de Cloudflare",
+    "Message:": "Mensaje:",
+    "Don't know how to get the token? Please read the guide:": "No sabes como obtener el token? Por favor, lee la guía:",
+    "The current connection may be lost if you are currently connecting via Cloudflare Tunnel. Are you sure want to stop it? Type your current password to confirm it.": "La conexión actual puede perderse si actualmente se está conectando a través del Tunel Cloudflare. ¿Seguro que quieres detenerlo? Escriba su contraseña actual para confirmarlo.",
+    "HTTP Headers": "Encabezados HTTP",
+    "Trust Proxy": "Proxy de Confianza",
+    "Other Software": "Otro Software",
+    "For example: nginx, Apache and Traefik.": "Por ejemplo: nginx, Apache y Traefik.",
+    "Please read": "Por favor lee",
+    "Subject:": "Asunto:",
+    "Valid To:": "Válido Para:",
+    "Days Remaining:": "Días Restantes:",
+    "Issuer:": "Emisor:",
+    "Fingerprint:": "Huella:",
+    "No status pages": "Sin páginas de estado",
+    "Domain Name Expiry Notification": "Notificación de Caducidad de Nombre de Dominio",
+    "Proxy": "Proxy",
+    "RadiusSecret": "Secreto de Radius",
+    "socket": "Socket",
+    "tcp": "TCP / HTTP",
+    "Docker Container": "Contenedor de Docker",
+    "Container Name / ID": "Nombre / ID de Contenedor",
+    "Docker Host": "Host Docker",
+    "Docker Hosts": "Hosts Docker",
+    "Domain": "Dominio",
+    "Workstation": "Puesto de Trabajo",
+    "Packet Size": "Tamaño del Paquete",
+    "ZohoCliq": "ZohoCliq",
+    "Bot Token": "Token de Bot",
+    "wayToGetTelegramToken": "Puedes conseguir un token desde {0}.",
+    "Chat ID": "ID de Chat",
+    "supportTelegramChatID": "Chat Directo de Soporte / Grupo / ID de Chat del Canal",
+    "wayToGetTelegramChatID": "Puedes obtener tu ID de chat enviando un mensaje al bot y visitando esta URL para ver el chat_id:",
+    "YOUR BOT TOKEN HERE": "TU TOKEN DE BOT AQUÍ",
+    "chatIDNotFound": "ID de Chat no encontrada; por favor, primero envía un mensaje a este bot",
+    "disableCloudflaredNoAuthMsg": "Estas en modo No Autenticado, no es necesaria una contraseña.",
+    "wayToGetLineNotifyToken": "Puede obtener un token de acceso desde {0}",
+    "Home Assistant URL": "URL de Asistente de Hogar",
+    "Long-Lived Access Token": "Token de acceso de larga duración",
+    "Notification Service": "Servicio de Notificaciones",
+    "default: notify all devices": "predeterminado: notificar todos los dispositivos",
+    "A list of Notification Services can be found in Home Assistant under \"Developer Tools > Services\" search for \"notification\" to find your device/phone name.": "Puede encontrar una lista de Servicios de notificación en Asistente de Hogar en \"Herramientas para desarrolladores > Servicios\", busque \"notificación\" para encontrar el nombre de su dispositivo/teléfono.",
+    "Automations can optionally be triggered in Home Assistant:": "Las automatizaciones se pueden activar opcionalmente en Asistente de Hogar:",
+    "Trigger type:": "Tipo de disparador:",
+    "Event type:": "Tipo de Evento:",
+    "Event data:": "Datos del Evento:",
+    "Then choose an action, for example switch the scene to where an RGB light is red.": "Luego elija una acción, por ejemplo, cambie la escena a donde una luz RGB es roja.",
+    "Frontend Version": "Versión de Interfaz",
+    "Frontend Version do not match backend version!": "La Versión de Interfaz no coincide con la versión backend!",
+    "backupRecommend": "Por favor, haz copia de seguridad del volumen o el archivo de datos (./data/) directamente en su lugar.",
+    "recurringInterval": "Intervalo",
+    "Recurring": "Periódico",
+    "strategyManual": "Activo/Inactivo Manualmente",
+    "lastDay2": "Penúltimo Día del Mes",
+    "lastDay3": "Antepenúltimo día del mes",
+    "lastDay4": "Trasantepenúltimo Día del Mes",
+    "IconUrl": "URL de Icono",
+    "dnsCacheDescription": "Es posible que no funcione en algunos entornos IPv6; desactívelo si encuentra algún problema.",
+    "Single Maintenance Window": "Ventana de Mantenimiento Único",
+    "secureOptionTLS": "TLS (465)",
+    "aboutMattermostChannelName": "Puedes sobreescribir el canal por defecto en el cual el Webhook publica introduciendo el nombre del canal en el campo \"Nombre del Canal\". Esto tiene que estar habilitado en la configuración de Mattermost Webhook. Ejemplo: #otro-canal",
+    "dataRetentionTimeError": "El periodo de retención debe ser 0 o mayor",
+    "Enable TLS": "Habilita TLS",
+    "Lowcost": "Bajo coste",
+    "You can divide numbers with": "Puedes dividir números con",
+    "Base URL": "URL Base",
+    "Proto Service Name": "Nombre de Servicio Proto",
+    "Proto Method": "Método Proto",
+    "Proto Content": "Contenido Proto",
+    "Economy": "Económico",
+    "iOS": "iOS",
+    "Android": "Android",
+    "Platform": "Plataforma",
+    "onebotPrivateMessage": "Privado",
+    "onebotMessageType": "Tipo de Mensaje OneBot",
+    "smseagleRecipientType": "Tipo de destinatario",
+    "smseagleRecipient": "Destinatario(s) (multiples deben separarse por comas)",
+    "smseagleEncoding": "Enviar como Unicode",
+    "smseaglePriority": "Prioridad del mensaje (0-9, predeterminado = 0)",
+    "stackfield": "Stackfield",
+    "Leave blank to use a shared sender number.": "Dejar en blanco para usar un número de remitente compartido.",
+    "Octopush API Version": "Versión API Octopush",
+    "From Name/Number": "De Nombre/Número",
+    "Recipient Number": "Número de Destinatario",
+    "Long-Lived Access Token can be created by clicking on your profile name (bottom left) and scrolling to the bottom then click Create Token. ": "El token de acceso de larga duración se puede crear haciendo clic en el nombre de su perfil (abajo a la izquierda) y desplazándose hasta la parte inferior y luego haciendo clic en Crear token. ",
+    "backupOutdatedWarning": "Obsoleto: dado que se agregaron muchas funciones y esta función de copia de seguridad no se mantiene desde hace un tiempo, no puede generar ni restaurar una copia de seguridad completa.",
+    "Optional": "Opcional",
+    "loadingError": "No se pueden obtener los datos, inténtelo de nuevo más tarde.",
+    "pushoverDesc2": "Si quieres enviar notificaciones a diferentes dispositivos, rellena el campo Dispositivo.",
+    "octopushLegacyHint": "Utilizas la versión anterior de Octopush (2011-2020) o la nueva versión?",
+    "Sms template must contain parameters: ": "La plantilla SMS debería contener parámetros: ",
+    "For safety, must use secret key": "Por seguridad, deberías usar key secreta",
+    "signalImportant": "IMPORTANTE: No puedes mezclar grupos y números en destinatarios!",
+    "aboutWebhooks": "Más información sobre Webhooks en: {0}",
+    "smtpDkimHashAlgo": "Algoritmo Hash (Opcional)",
+    "promosmsPhoneNumber": "Número de teléfono (para destinatarios Polacos puedes omitir los códigos de área)",
+    "promosmsTypeFlash": "SMS FLASH - Mensaje se mostrará automáticamente en el dispositivo del destinatario. Limitado sólo a destinatarios Polacos.",
+    "promosmsSMSSender": "Nombre de Remitente SMS: Nombre pre-registrado o uno de los predeterminados: InfoSMS, SMS Info, MaxSMS, INFO, SMS",
+    "matrixDesc1": "Puedes encontrar la ID de sala interna mirando en la sección avanzado de los ajustes de sala en tu cliente Matrix. Debería ser algo como !QMdRCpUIfLwsfjxye6:home.server.",
+    "matrixDesc2": "Es altamente recomendable crear un nuevo usuario y no usar el token de acceso propio de tu usuario porque otorgaría acceso completo a tu cuenta y todas las salas que hayas entrado. En su lugar, crea un usuario nuevo e invítalo a la sala donde quieres recibir las notificaciones. Puedes obtener el token de acceso ejecutando {0}",
+    "plugin": "Complemento | Complementos",
+    "From Email": "Desde el Email",
+    "emailCustomSubject": "Asunto Personalizado",
+    "To Email": "Al Email",
+    "smtpCC": "CC",
+    "smtpBCC": "CCO",
+    "Discord Webhook URL": "URL Webhook de Discord",
+    "wayToGetDiscordURL": "Puede obtener esto yendo a Configuración del servidor -> Integraciones -> Ver Webhooks -> Crear Webhook",
+    "Bot Display Name": "Nombre para mostrar del Bot",
+    "Hello @everyone is...": "Hola {'@'}todos están…",
+    "wayToGetTeamsURL": "Puedes aprender cómo crear una URL webhook {0}.",
+    "wayToGetZohoCliqURL": "Puedes aprender cómo crear una URL webhook {0}.",
+    "needSignalAPI": "Necesitas tener un cliente de señal con API REST.",
+    "wayToCheckSignalURL": "Puedes revisar esta URL para ver cómo configurar uno:",
+    "Number": "Número",
+    "Access Token": "Token de Acceso",
+    "Channel access token": "Token de acceso al canal",
+    "Line Developers Console": "Consola de Desarrolladores de Line",
+    "lineDevConsoleTo": "Consola de Desarrolladores de Line - {0}",
+    "Basic Settings": "Configuración Básica",
+    "Messaging API": "API de Mensajería",
+    "wayToGetLineChannelToken": "Primero accede al {0}, crea un proveedor y un canal (API de Mensajería), entonces puedes obtener el token de acceso al cana y el ID de usuario de los elementos de menú anteriormente mencionados.",
+    "Icon URL": "URL de Icono",
+    "aboutIconURL": "Puede proporcionar un enlace a una imagen en \"URL de icono\" para anular la imagen de perfil predeterminada. No se utilizará si se establece Icono Emoji.",
+    "enableGRPCTls": "Permite enviar solicitudes gRPC con conexión TLS",
+    "grpcMethodDescription": "Nombre del método es convertido a formato cammelCase tal como digoHola, verificandoTodo, etc.",
+    "dnsPortDescription": "Puerto servidor DNS. Por defecto al 53. Puedes cambiar el puerto en cualquier momento.",
+    "recurringIntervalMessage": "Ejecutar una vez al día | Ejecutar una vez cada {0} días",
+    "affectedMonitorsDescription": "Selecciona los monitores que se ven afectados por el mantenimiento actual",
+    "affectedStatusPages": "Muestra este mensaje de mantenimiento en las páginas de estado seleccionadas",
+    "atLeastOneMonitor": "Selecciona al menos un monitor afectado",
+    "endpoint": "punto final",
+    "promosmsPassword": "Contraseña API",
+    "pushoversounds pushover": "Pushover (predeterminado)",
+    "pushoversounds bike": "Bicicleta",
+    "pushoversounds bugle": "Bugle",
+    "pushoversounds cashregister": "Caja Registradora",
+    "pushoversounds classical": "Clásica",
+    "pushoversounds cosmic": "Cósmico",
+    "pushoversounds falling": "Descendente",
+    "pushoversounds gamelan": "Gamelán",
+    "pushoversounds incoming": "Entrante",
+    "pushoversounds intermission": "Intermedio",
+    "pushoversounds magic": "Mágico",
+    "pushoversounds mechanical": "Mecánica",
+    "pushoversounds pianobar": "Bar Piano",
+    "pushoversounds siren": "Sirena",
+    "pushoversounds spacealarm": "Alarma Espacial",
+    "pushoversounds tugboat": "Remolcador",
+    "pushoversounds alien": "Alarma Alienígena (largo)",
+    "pushoversounds climb": "Escalada (largo)",
+    "pushoversounds persistent": "Persistente (largo)",
+    "pushoversounds echo": "Pushover Eco (largo)",
+    "pushoversounds updown": "Arriba Abajo (largo)",
+    "pushoversounds vibrate": "Sólo Vibración",
+    "pushoversounds none": "Ninguno (silencio)",
+    "pushyAPIKey": "Key de Api Secreta",
+    "pushyToken": "Token de Dispositivo",
+    "PushByTechulus": "Push con Techulus",
+    "clicksendsms": "SMS con ClickSend",
+    "GoogleChat": "Chat de Google (sólo Google Workspace)",
+    "Kook": "Kook",
+    "wayToGetKookBotToken": "Crea aplicación y obtén tu token de bot en {0}",
+    "wayToGetKookGuildID": "Activa 'Modo Desarrollador' en los ajustes de Kook, y haz click derecho en la unión para obtener su ID",
+    "Guild ID": "ID de Gremio",
+    "User Key": "Key de Usuario",
+    "octopushTypePremium": "Premium (Rápido - recomendado para alertas)",
+    "octopushTypeLowCost": "Bajo Coste (Lento - algunas veces bloqueado por operador)",
+    "checkPrice": "Consultar {0} precios:",
+    "apiCredentials": "Credenciales de API",
+    "Check octopush prices": "Consulta los precios de octopush {0}.",
+    "octopushPhoneNumber": "Número de teléfono (en formato internacional, ejemplo: +33612345678) ",
+    "octopushSMSSender": "Nombre de Remitente del SMS: 3-11 caracteres alfanuméricos y espacio (a-zA-Z0-9)",
+    "LunaSea Device ID": "ID Dispositivo LunaSea",
+    "goAlert": "GoAlert",
+    "pushoverDesc1": "La prioridad Emergencia (2) tiene predeterminado un tiempo muerto entre reintentos de 30 segundos y expirará después de 1 hora.",
+    "AccessKeyId": "ID de Key de Acceso",
+    "SecretAccessKey": "Secrreto de Key de Acceso",
+    "TemplateCode": "Código de Plantilla",
+    "Bark Group": "Grupo de Bark",
+    "Bark Sound": "Sonido de Bark",
+    "SecretKey": "Key Secreta",
+    "Huawei": "Huawei",
+    "Retry": "Reintentar",
+    "Proxy Server": "Servidor Proxy",
+    "Proxy Protocol": "Protocolo Proxy",
+    "Setup Proxy": "Configurar Proxy",
+    "Proxy server has authentication": "El servidor Proxy tiene autenticación",
+    "promosmsAllowLongSMS": "Permitir SMS largo",
+    "Uptime Kuma URL": "URL de Uptime Kuma",
+    "Icon Emoji": "Icono Emoji",
+    "aboutKumaURL": "Si dejas vacío el campo URL Uptime Kuma, predeterminará la página GitHub del Proyecto.",
+    "smtpDkimSettings": "Ajustes DKIM",
+    "smtpDkimDomain": "Nombre de Dominio",
+    "smtpDkimKeySelector": "Selector de Key",
+    "smtpDkimPrivateKey": "Key Privada",
+    "Integration Key": "Key de Integración",
+    "Integration URL": "URL de Integración",
+    "Device Token": "Token de Dispositivo",
+    "WeCom Bot Key": "Key de Bot WeCom",
+    "promosmsTypeEco": "SMS ECO - barato pero lento y a veces sobrecargado. Limitado sólo a destinatarios Polacos.",
+    "promosmsTypeSpeed": "SMS SPEED - La mayor prioridad en el sistema. Muy rápido y confiable pero costoso (alrededor del doble del precio de SMS FULL).",
+    "matrixHomeserverURL": "URL Servidor Casero (con http(s):// y opcionalmente el puerto)",
+    "Internal Room Id": "ID de Sala Interna",
+    "Channel Name": "Nombre del canal",
+    "aboutChannelName": "Introduce el nombre del canal en {0} campo Nombre del Canal si quieres evitar el canal Webhook. Ejemplo: #otro-canal",
+    "smtpDkimDesc": "Por favor, remitir a DKIM Nodemailer {0} para descubrir como se usa.",
+    "smtpDkimheaderFieldNames": "Keys de encabezado para firmar (Opcional)",
+    "smtpDkimskipFields": "Keys de encabezado para no firmar (Opcional)",
+    "Auto resolve or acknowledged": "Resolución automática o reconocida",
+    "promosmsTypeFull": "SMS FULL - Nivel Premium de SMS, puedes usar tu Nombre de Remitente (Tienes que registrarlo primero). Confiable para alertas.",
+    "do nothing": "no hacer nada",
+    "alerta": "Alerta",
+    "serwersmsAPIPassword": "Contraseña de API",
+    "serwersmsPhoneNumber": "Número de teléfono",
+    "smseagle": "SMSEagle",
+    "smseagleTo": "Número(s) de teléfono",
+    "serwersmsSenderName": "Nombre de remitente de SMS (registrado a través del portal de cliente)",
+    "auto resolve": "resolución automática",
+    "auto acknowledged": "Auto reconocida",
+    "alertaEnvironment": "Entorno",
+    "PushDeer Key": "Key de PushDeer",
+    "onebotSafetyTips": "Por seguridad, deberías colocara el token de acceso",
+    "wayToGetClickSendSMSToken": "Puedes obtener Nombre de Usuario API y la Key API en {0}.",
+    "Apprise URL": "URL Apprise",
+    "gorush": "Gorush",
+    "squadcast": "Squadcast",
+    "Maintenance Time Window of a Day": "Ventana de tiempo de mantenimiento de un día",
+    "Effective Date Range": "Rango de Fecha Efectivo",
+    "Free Mobile User Identifier": "Identificador de Usuario de Free Mobile",
+    "Gateway Type": "Tipo de Puerta de Enlace",
+    "SMSManager": "SMSManager",
+    "goAlertInfo": "GoAlert es una aplicación de código abierto para la programación de guardias, escaladas automatizadas y notificaciones (como SMS o llamadas de voz). ¡Involucre automáticamente a la persona adecuada, de la manera correcta y en el momento adecuado! {0}",
+    "Free Mobile API Key": "Clave API de Free Mobile",
+    "high": "alto",
+    "SMSManager API Docs": "Documentación API de SMSManager ",
+    "smseagleContact": "Nombre(s) de contacto de Guía Telefónica",
+    "smseagleToken": "Token de Acceso a la API",
+    "smseagleUrl": "URL del dispositivo SMSEagle",
+    "Legacy Octopush-DM": "Octopush-DM heredado",
+    "HomeAssistant": "Home Assistant",
+    "goAlertIntegrationKeyInfo": "Obtenga la clave de integración API genérica para el servicio en este formato \"aaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee\", generalmente el valor del parámetro token de la URL copiada.",
+    "Topic": "Tema",
+    "matrix": "Matrix",
+    "Feishu WebHookUrl": "WebHookURL de Feishu",
+    "wayToGetPagerDutyKey": "Puede obtener esto yendo a Servicio -> Directorio de servicios -> (Seleccione un servicio) -> Integraciones -> Agregar integración. Aquí puede buscar \"API de eventos V2\". Más información {0}",
+    "alertaApiKey": "Clave API",
+    "alertaAlertState": "Estado de Alerta",
+    "alertaRecoverState": "Estado de Recuperación",
+    "serwersms": "SerwerSMS.pl",
+    "serwersmsAPIUser": "Nombre de usuario de API (inc. webapi_ prefix)",
+    "smseagleGroup": "Nombre(s) de grupo de Guía Telefónica",
+    "Unpin": "Quitar de destacados",
+    "Prefix Custom Message": "Prefijo personalizado",
+    "markdownSupported": "Soporta sintaxis Markdown",
+    "Server Address": "Dirección del Servidor",
+    "Learn More": "Aprende Más",
+    "Pick a RR-Type...": "Seleccione un Tipo RR",
+    "onebotHttpAddress": "Dirección HTTP OneBot",
+    "SendKey": "SendKey",
+    "octopushAPIKey": "\"Clave API\" de las credenciales HTTP API en el panel de control",
+    "octopushLogin": "\"Inicio de Sesión\" a partir de las credenciales API HTTP en el panel de control"
+}
diff --git a/src/lang/et-EE.json b/src/lang/et-EE.json
new file mode 100644
index 000000000..f7a23a6ca
--- /dev/null
+++ b/src/lang/et-EE.json
@@ -0,0 +1,209 @@
+{
+    "languageName": "eesti",
+    "retryCheckEverySecond": "Kontrolli {0} sekundilise vahega.",
+    "retriesDescription": "Mitu korda tuleb kontrollida, mille järel märkida 'maas' ja saata välja teavitus.",
+    "ignoreTLSError": "Eira TLS/SSL viga HTTPS veebisaitidel.",
+    "upsideDownModeDescription": "Käitle teenuse saadavust rikkena, teenuse kättesaamatust töötavaks.",
+    "maxRedirectDescription": "Suurim arv ümbersuunamisi, millele järgida. 0 ei luba ühtegi ",
+    "acceptedStatusCodesDescription": "Vali välja HTTP koodid, mida arvestada kõlblikuks.",
+    "passwordNotMatchMsg": "Salasõnad ei kattu.",
+    "notificationDescription": "Teavitusteenuse kasutamiseks seo see seirega.",
+    "keywordDescription": "Jälgi võtmesõna HTML või JSON vastustes. (tõstutundlik)",
+    "pauseDashboardHome": "Seisatud",
+    "deleteMonitorMsg": "Kas soovid eemaldada seire?",
+    "deleteNotificationMsg": "Kas soovid eemaldada selle teavitusteenuse kõikidelt seiretelt?",
+    "resolverserverDescription": "Cloudflare on vaikimisi pöördserver.",
+    "rrtypeDescription": "Vali kirje tüüp, mida soovid jälgida.",
+    "pauseMonitorMsg": "Kas soovid peatada seire?",
+    "Settings": "Seaded",
+    "Status Page": "Ülevaade",
+    "Status Pages": "Ülevaated",
+    "Dashboard": "Töölaud",
+    "New Update": "Uuem tarkvara versioon on saadaval.",
+    "Language": "Keel",
+    "Appearance": "Välimus",
+    "Theme": "Teema",
+    "General": "Üldine",
+    "Version": "Versioon",
+    "Check Update On GitHub": "Otsi uuendusi GitHub'ist",
+    "List": "Nimekiri",
+    "Add": "Lisa",
+    "Add New Monitor": "Lisa seire",
+    "Add a monitor": "Lisa seire",
+    "Quick Stats": "Ülevaade",
+    "Up": "Töökorras",
+    "Down": "Rikkis",
+    "Pending": "Määramisel",
+    "Unknown": "Kahtlast",
+    "Pause": "Seiska",
+    "Name": "Nimi",
+    "Status": "Olek",
+    "DateTime": "Kuupäev",
+    "Message": "Tulemus",
+    "No important events": "Märkimisväärsed juhtumid puuduvad.",
+    "Resume": "Taasta",
+    "Edit": "Muuda",
+    "Delete": "Eemalda",
+    "Current": "Hetkeseisund",
+    "Uptime": "Eluiga",
+    "Cert Exp.": "Sert. aegumine",
+    "day": "päev | päeva",
+    "-day": "-päev",
+    "hour": "tund",
+    "-hour": "-tund",
+    "Response": "Reaktsiooniaeg",
+    "Ping": "Ping",
+    "Monitor Type": "Seire tüüp",
+    "Keyword": "Võtmesõna",
+    "Friendly Name": "Sõbralik nimi",
+    "URL": "URL",
+    "Hostname": "Hostname",
+    "Port": "Port",
+    "Heartbeat Interval": "Tukse sagedus",
+    "Retries": "Korduskatsed",
+    "Advanced": "Rohkem",
+    "Upside Down Mode": "Tagurpidi seire",
+    "Max. Redirects": "Max. ümbersuunamine",
+    "Accepted Status Codes": "Kõlblikud HTTP koodid",
+    "Save": "Salvesta",
+    "Notifications": "Teavitused",
+    "Not available, please setup.": "Ühtegi teavitusteenust pole saadaval.",
+    "Setup Notification": "Lisa teavitusteenus",
+    "Light": "hele",
+    "Dark": "tume",
+    "Auto": "automaatne",
+    "Theme - Heartbeat Bar": "Teemasäte — tuksete riba",
+    "Normal": "tavaline",
+    "Bottom": "all",
+    "None": "puudub",
+    "Timezone": "Ajatsoon",
+    "Search Engine Visibility": "Otsimootorite ligipääs",
+    "Allow indexing": "Luba indekseerimine",
+    "Discourage search engines from indexing site": "Keela selle saidi indekseerimine otsimootorite poolt",
+    "Change Password": "Muuda parooli",
+    "Current Password": "praegune parool",
+    "New Password": "uus parool",
+    "Repeat New Password": "korda salasõna",
+    "Update Password": "Uuenda salasõna",
+    "Disable Auth": "Lülita autentimine välja",
+    "Enable Auth": "Lülita autentimine sisse",
+    "disableauth.message1": "Kas soovid <strong>lülitada autentimise välja</strong>?",
+    "disableauth.message2": "Kastuamiseks <strong>välise autentimispakkujaga</strong>, näiteks Cloudflare Access.",
+    "Please use this option carefully!": "Palun kasuta vastutustundlikult.",
+    "Logout": "Logi välja",
+    "Leave": "Lahku",
+    "I understand, please disable": "Olen tutvunud riskidega, lülita välja",
+    "Confirm": "Kinnita",
+    "Yes": "Jah",
+    "No": "Ei",
+    "Username": "kasutajanimi",
+    "Password": "parool",
+    "Remember me": "Mäleta mind",
+    "Login": "Logi sisse",
+    "No Monitors, please": "Seired puuduvad.",
+    "add one": "Lisa esimene",
+    "Notification Type": "Teavituse tüüp",
+    "Email": "e-posti aadress",
+    "Test": "Saada prooviteavitus",
+    "Certificate Info": "Sertifikaadi teave",
+    "Resolver Server": "Server, mis vastab DNS päringutele.",
+    "Resource Record Type": "DNS kirje tüüp",
+    "Last Result": "Viimane",
+    "Create your admin account": "Admininstraatori konto loomine",
+    "Repeat Password": "korda salasõna",
+    "respTime": "Reageerimisaeg (ms)",
+    "notAvailableShort": "N/A",
+    "enableDefaultNotificationDescription": "Kõik järgnevalt lisatud seired kasutavad seda teavitusteenuset. Seiretelt võib teavitusteenuse ühekaupa eemaldada.",
+    "clearEventsMsg": "Kas soovid seire kõik sündmused kustutada?",
+    "clearHeartbeatsMsg": "Kas soovid seire kõik tuksed kustutada?",
+    "confirmClearStatisticsMsg": "Kas soovid TERVE ajaloo kustutada?",
+    "Export": "Eksport",
+    "Import": "Import",
+    "Default enabled": "Kasuta vaikimisi",
+    "Apply on all existing monitors": "Kõik praegused seired hakkavad kasutama seda teavitusteenust",
+    "Create": "Loo konto",
+    "Clear Data": "Eemalda andmed",
+    "Events": "Sündmused",
+    "Heartbeats": "Tuksed",
+    "Auto Get": "Hangi automaatselt",
+    "backupDescription": "Varunda kõik seired ja teavitused JSON faili.",
+    "backupDescription2": "PS: Varukoopia EI sisalda seirete ajalugu ja sündmustikku.",
+    "backupDescription3": "Varukoopiad sisaldavad teavitusteenusete pääsuvõtmeid.",
+    "alertNoFile": "Palun lisa fail, mida importida.",
+    "alertWrongFileType": "Palun lisa JSON-formaadis fail.",
+    "twoFAVerifyLabel": "2FA kinnitamiseks sisesta pääsukood",
+    "tokenValidSettingsMsg": "Kood õige. Akna võib sulgeda.",
+    "confirmEnableTwoFAMsg": "Kas soovid 2FA sisse lülitada?",
+    "confirmDisableTwoFAMsg": "Kas soovid 2FA välja lülitada?",
+    "Verify Token": "Kontrolli",
+    "Setup 2FA": "Kaksikautentimise seadistamine",
+    "Enable 2FA": "Seadista 2FA",
+    "Disable 2FA": "Lülita 2FA välja",
+    "2FA Settings": "2FA seaded",
+    "Two Factor Authentication": "Kaksikautentimine",
+    "Active": "kasutusel",
+    "Inactive": "seadistamata",
+    "Token": "kaksikautentimise kood",
+    "Show URI": "Näita URId",
+    "Clear all statistics": "Tühjenda ajalugu",
+    "importHandleDescription": "'kombineeri' täiendab varukoopiast ja kirjutab üle samanimelised seireid ja teavitusteenused; 'lisa praegustele' jätab olemasolevad puutumata; 'asenda' kustutab ja asendab kõik seired ja teavitusteenused.",
+    "confirmImportMsg": "Käkerdistest hoidumiseks lae enne taastamist alla uus varukoopia. Kas soovid taastada üles laetud?",
+    "Heartbeat Retry Interval": "Korduskatsete intervall",
+    "Import Backup": "Varukoopia importimine",
+    "Export Backup": "Varukoopia eksportimine",
+    "Skip existing": "lisa praegustele",
+    "Overwrite": "asenda",
+    "Options": "Mestimisviis",
+    "Keep both": "kombineeri",
+    "Tags": "Sildid",
+    "Add New below or Select...": "Leia või lisa all uus…",
+    "Tag with this name already exist.": "Selle nimega silt on juba olemas.",
+    "Tag with this value already exist.": "Selle väärtusega silt on juba olemas.",
+    "color": "värvus",
+    "value (optional)": "väärtus (fakultatiivne)",
+    "Gray": "hall",
+    "Red": "punane",
+    "Orange": "oranž",
+    "Green": "roheline",
+    "Blue": "sinine",
+    "Indigo": "indigo",
+    "Purple": "lilla",
+    "Pink": "roosa",
+    "Search...": "Otsi…",
+    "Avg. Ping": "Keskmine ping",
+    "Avg. Response": "Keskmine reaktsiooniaeg",
+    "Entry Page": "Avaleht",
+    "statusPageNothing": "Kippu ega kõppu; siia saab lisada seireid või -gruppe.",
+    "No Services": "Teenused puuduvad.",
+    "All Systems Operational": "Kõik töökorras",
+    "Partially Degraded Service": "Teenuse töö osaliselt häiritud",
+    "Degraded Service": "Teenuse töö häiritud",
+    "Add Group": "Lisa grupp",
+    "Edit Status Page": "Muuda lehte",
+    "Go to Dashboard": "Töölauale",
+    "checkEverySecond": "Kontrolli peale tõrget {0} sekundilise vahega.",
+    "telegram": "Telegram",
+    "webhook": "Webhook",
+    "smtp": "elektronpost (SMTP)",
+    "discord": "Discord",
+    "teams": "Microsoft Teams",
+    "signal": "Signal",
+    "gotify": "Gotify",
+    "slack": "Slack",
+    "rocket.chat": "Rocket.chat",
+    "pushover": "Pushover",
+    "pushy": "Pushy",
+    "octopush": "Octopush",
+    "promosms": "PromoSMS",
+    "lunasea": "LunaSea",
+    "apprise": "Apprise (vahendab üle 65 teavitusteenust)",
+    "pushbullet": "Pushbullet",
+    "line": "LINE",
+    "mattermost": "Mattermost",
+    "alerta": "Alerta",
+    "alertaApiEndpoint": "API otsik",
+    "alertaEnvironment": "Keskkond",
+    "alertaApiKey": "API võti",
+    "alertaAlertState": "Häireseisund",
+    "alertaRecoverState": "Taasta algolek"
+}
diff --git a/src/lang/eu.json b/src/lang/eu.json
new file mode 100644
index 000000000..9d667a58f
--- /dev/null
+++ b/src/lang/eu.json
@@ -0,0 +1,541 @@
+{
+    "languageName": "Euskara",
+    "checkEverySecond": "Egiaztatu {0} segunduro",
+    "retryCheckEverySecond": "Errepikatu {0} segunduro",
+    "retriesDescription": "Zerbitzua erorita markatu eta jakinarazpena bidali aurretik egindako saiakera kopuru maximoa",
+    "ignoreTLSError": "Ezikusiarena egin TLS/SSL erroreei HTTPS webguneetan",
+    "upsideDownModeDescription": "Alderantzizkatu erortze egoera. Zerbitzua martxan badago, ERORITA markatuko du.",
+    "maxRedirectDescription": "Jarraitu beharreko berbideratze kopuru maximoa. Jarri 0 berbideratzeak desgaitzeko.",
+    "acceptedStatusCodesDescription": "Hautatu erantzun ona kontsideratzen diren egoera kodeak.",
+    "passwordNotMatchMsg": "Errepikatutako pasahitza ez dator bat.",
+    "notificationDescription": "Jakinarazpenak monitorizazio funtzio bati asignatu behar zaizkio.",
+    "keywordDescription": "Bilatu gako-hitza HTML edo JSON erantzunean. Bilaketan maiuskulak kontuan hartzen dira.",
+    "pauseDashboardHome": "Gelditu",
+    "deleteMonitorMsg": "Ziur zaude monitorizazio hau ezabatu nahi duzula?",
+    "deleteNotificationMsg": "Ziur zaude jakinarazpen hau monitorizazio guztientzat ezabatu nahi duzula?",
+    "dnsPortDescription": "DNS zerbitzari portua. Defektuz 53. Nahi duzunean aldatu dezakezu portua.",
+    "resolverserverDescription": "Cloudflare zerbitzari lehenetsia da. Edozein unetan alda dezakezu ebazteko zerbitzaria.",
+    "rrtypeDescription": "Hautatu kontrolatu nahi duzun RR mota",
+    "enableDefaultNotificationDescription": "Jakinarazpen hau monitore berrientzat gaituko da defektuz. Baina monitorizazio bakoitzarentzat jakinarazpena desgaitu dezakezu.",
+    "pauseMonitorMsg": "Ziur zaude gelditu egin nahi duzula?",
+    "clearEventsMsg": "Ziur zaude monitorizazio honen gertaera guztiak ezabatu nahi dituzula?",
+    "clearHeartbeatsMsg": "Ziur zaude monitorizazio honen pultsu guztiak ezabatu nahi dituzula?",
+    "confirmClearStatisticsMsg": "Ziur zaude estatistika GUZTIAK ezabatu nahi dituzula?",
+    "importHandleDescription": "Aukeratu 'existitzen bada', izen bereko monitore edo jakinarazpen bakoitza saltatu nahi baduzu. Lehendik dauden kontrol eta jakinarazpen guztiak ezabatuko ditu 'Gainidatzi' aukerak.",
+    "confirmImportMsg": "Ziur zaude segurtasun-kopia inportatu nahi duzula? Egiaztatu inportatzeko aukera zuzena hautatu duzula.",
+    "twoFAVerifyLabel": "Sartu zure tokena 2FA egiaztatzeko:",
+    "tokenValidSettingsMsg": "Tokenak balio du! Orain 2FA konfigurazioa gorde dezakezu.",
+    "confirmEnableTwoFAMsg": "Ziur zaude 2FA gaitu nahi duzula?",
+    "confirmDisableTwoFAMsg": "Ziur zaude 2FA desgaitu nahi duzula?",
+    "Settings": "Ezarpenak",
+    "Dashboard": "Arbela",
+    "New Update": "Eguneraketa berria",
+    "Language": "Hizkuntza",
+    "Appearance": "Itxura",
+    "Theme": "Gaia",
+    "General": "Orokorra",
+    "Primary Base URL": "Oinarrizkoa URL",
+    "Version": "Bertsioa",
+    "Check Update On GitHub": "Egiaztatu eguneraketa GitHuben",
+    "List": "Zerrenda",
+    "Add": "Gehitu",
+    "Add New Monitor": "Gehitu monitorizazio berria",
+    "Quick Stats": "Estatistika azkarrak",
+    "Up": "Erabilgarri",
+    "Down": "Erorita",
+    "Pending": "Zain",
+    "Unknown": "Ezezaguna",
+    "Pause": "Gelditu",
+    "Name": "Izena",
+    "Status": "Egoera",
+    "DateTime": "Data eta ordua",
+    "Message": "Mezua",
+    "No important events": "Gertaera garrantzitsurik ez",
+    "Resume": "Jarraitu",
+    "Edit": "Editatu",
+    "Delete": "Ezabatu",
+    "Current": "Unekoa",
+    "Uptime": "Martxan",
+    "Cert Exp.": "Ziurtagiri iraun.",
+    "day": "egun | egun",
+    "-day": "-egun",
+    "hour": "ordua",
+    "-hour": "-ordu",
+    "Response": "Erantzuna",
+    "Ping": "Ping",
+    "Monitor Type": "Monitorizazio mota",
+    "Keyword": "Gakohitza",
+    "Friendly Name": "Izen xumea",
+    "URL": "URLa",
+    "Hostname": "Ostalari izena",
+    "Port": "Portua",
+    "Heartbeat Interval": "Pultsu interbaloak",
+    "Retries": "Errepikapenak",
+    "Heartbeat Retry Interval": "Pultsu errepikatze interbaloak",
+    "Advanced": "Aurreratua",
+    "Upside Down Mode": "Alderantzizkako modua",
+    "Max. Redirects": "Berbideratze max.",
+    "Accepted Status Codes": "Onartutako egoera kodeak",
+    "Push URL": "Push URLa",
+    "needPushEvery": "URL hau {0} segunduro deitu beharko zenuke.",
+    "pushOptionalParams": "Hautazko parametroak: {0}",
+    "Save": "Gorde",
+    "Notifications": "Jakinarazpenak",
+    "Not available, please setup.": "Ez dago eskuragarri, ezarri mesedez.",
+    "Setup Notification": "Ezarri jakinarazpenak",
+    "Light": "Argia",
+    "Dark": "Iluna",
+    "Auto": "Auto",
+    "Theme - Heartbeat Bar": "Gaia - Pultsu barra",
+    "Normal": "Normala",
+    "Bottom": "Behean",
+    "None": "Bat ere ez",
+    "Timezone": "Timezone",
+    "Search Engine Visibility": "Bilatzaile ikurgarritasuna",
+    "Allow indexing": "Onartu indexatzea",
+    "Discourage search engines from indexing site": "Discourage search engines from indexing site",
+    "Change Password": "Aldatu pasahitza",
+    "Current Password": "Uneko pasahitza",
+    "New Password": "Pasahitz berria",
+    "Repeat New Password": "Errepikatu pasahitz berria",
+    "Update Password": "Eguneratu pasahitza",
+    "Disable Auth": "Desgaitu Auth",
+    "Enable Auth": "Gaitu Auth",
+    "disableauth.message1": "Ziur zaude <strong>autentifikazioa desgaitu</strong> nahi duzula?",
+    "disableauth.message2": "Egoera jakin batzuetarako diseinatuta dago, Uptime Kumaren <strong>aurrean hirugarrengo autentifikazio batzuek jartzeko</strong> (Cloudflare Access, Authelia edo beste autentifikazio-mekanismo batzuk).",
+    "Please use this option carefully!": "Mesedez, kontuz erabili aukera hau!",
+    "Logout": "Saioa amaitu",
+    "Leave": "Utzi",
+    "I understand, please disable": "Ulertzen dut, mesedez desgaitu",
+    "Confirm": "Baieztatu",
+    "Yes": "Bai",
+    "No": "Ez",
+    "Username": "Erabiltzailea",
+    "Password": "Pasahitza",
+    "Remember me": "Gogora nazazu",
+    "Login": "Saioa hasi",
+    "No Monitors, please": "Monitorizaziorik ez, mesedez",
+    "add one": "gehitu bat",
+    "Notification Type": "Jakinarazpen mota",
+    "Email": "Emaila",
+    "Test": "Testa",
+    "Certificate Info": "Ziurtagiri informazioa",
+    "Resolver Server": "Ebazpen-zerbitzaria",
+    "Resource Record Type": "Baliabideen erregistro mota",
+    "Last Result": "Azken emaitza",
+    "Create your admin account": "Sortu zure admin kontua",
+    "Repeat Password": "Errepikatu pasahitza",
+    "Import Backup": "segurtasun-kopia inportatu",
+    "Export Backup": "segurtasun-kopia esportatu",
+    "Export": "Esportatu",
+    "Import": "Inportatu",
+    "respTime": "Erantz. denbora (ms)",
+    "notAvailableShort": "N/A",
+    "Default enabled": "Lehenetsia gaituta",
+    "Apply on all existing monitors": "Aplikatu existitzen diren monitorizazio guztietan",
+    "Create": "Sortu",
+    "Clear Data": "Garbitu datuak",
+    "Events": "Gertaerak",
+    "Heartbeats": "Pultsuak",
+    "Auto Get": "Auto Get",
+    "backupDescription": "Monitore eta jakinarazpen guztien segurtasun-kopiak egin ditzakezu JSON fitxategi batean.",
+    "backupDescription2": "Oharra: ez dira historia eta gertaeren datuak sartzen.",
+    "backupDescription3": "Datu sentikorrak, hala nola jakinarazpen tokenak, esportazio-fitxategian sartzen dira; mesedez, gorde esportazioa modu seguruan.",
+    "alertNoFile": "Mesedez hautatu inportatzeko fitxategia.",
+    "alertWrongFileType": "Mesedez hautatu JSON fitxategia.",
+    "Clear all statistics": "Garbitu estatistika guztiak",
+    "Skip existing": "Saltatu existitzen bada",
+    "Overwrite": "Gainidatzi",
+    "Options": "Aukerak",
+    "Keep both": "Biak mantendu",
+    "Verify Token": "Egiaztatu Tokena",
+    "Setup 2FA": "Ezarri 2FA",
+    "Enable 2FA": "Gaitu 2FA",
+    "Disable 2FA": "Desgaitu 2FA",
+    "2FA Settings": "2FA ezarpenak",
+    "Two Factor Authentication": "Bi aldetako autentifikazioa (2FA)",
+    "Active": "Aktibo",
+    "Inactive": "Inaktibo",
+    "Token": "Tokena",
+    "Show URI": "Erakutsi URIa",
+    "Tags": "Etiketak",
+    "Add New below or Select...": "Gehitu beste bat behean edo hautatu...",
+    "Tag with this name already exist.": "Izen hau duen etiketa dagoeneko badago.",
+    "Tag with this value already exist.": "Balio hau duen etiketa dagoeneko badago.",
+    "color": "kolorea",
+    "value (optional)": "balioa (hautazkoa)",
+    "Gray": "Grisa",
+    "Red": "Gorria",
+    "Orange": "Naranja",
+    "Green": "Berdea",
+    "Blue": "Urdina",
+    "Indigo": "Indigo",
+    "Purple": "Morea",
+    "Pink": "Arrosa",
+    "Search...": "Bilatu...",
+    "Avg. Ping": "Batazbesteko Pinga",
+    "Avg. Response": "Batazbesteko erantzuna",
+    "Entry Page": "Sarrera orria",
+    "statusPageNothing": "Ezer ere ez hemen, mesedez gehitu taldea edo monitorizazioa.",
+    "No Services": "Zerbitzurik ez",
+    "All Systems Operational": "Sistema guztiak martxan",
+    "Partially Degraded Service": "Zerbitzu partzialki degradatua",
+    "Degraded Service": "Zerbitzu degradatua",
+    "Add Group": "Gehitu taldea",
+    "Add a monitor": "Gehitu monitorizazioa",
+    "Edit Status Page": "Editatu egoera orria",
+    "Go to Dashboard": "Joan arbelera",
+    "Status Page": "Egoera orria",
+    "Status Pages": "Egoera orriak",
+    "defaultNotificationName": "Nire {notification} Alerta ({number})",
+    "here": "Hemen",
+    "Required": "Beharrezkoa",
+    "telegram": "Telegram",
+    "ZohoCliq": "ZohoCliq",
+    "Bot Token": "Bot Tokena",
+    "wayToGetTelegramToken": "You can get a token from {0}.",
+    "Chat ID": "Txat IDa",
+    "supportTelegramChatID": "Support Direct Chat / Group / Channel's Chat ID",
+    "wayToGetTelegramChatID": "You can get your chat ID by sending a message to the bot and going to this URL to view the chat_id:",
+    "YOUR BOT TOKEN HERE": "YOUR BOT TOKEN HERE",
+    "chatIDNotFound": "Chat ID is not found; please send a message to this bot first",
+    "webhook": "Webhook",
+    "Post URL": "Bidalketa URLa",
+    "Content Type": "Eduki mota",
+    "webhookJsonDesc": "{0} is good for any modern HTTP servers such as Express.js",
+    "webhookFormDataDesc": "{multipart} is good for PHP. The JSON will need to be parsed with {decodeFunction}",
+    "smtp": "Emaila (SMTP)",
+    "secureOptionNone": "Bat ere ez / STARTTLS (25, 587)",
+    "secureOptionTLS": "TLS (465)",
+    "Ignore TLS Error": "Ignore TLS Error",
+    "From Email": "Email honetatik",
+    "emailCustomSubject": "Pertsonalizatutako gaia",
+    "To Email": "Email honetara",
+    "smtpCC": "CC",
+    "smtpBCC": "BCC",
+    "discord": "Discord",
+    "Discord Webhook URL": "Discord Webhook URL",
+    "wayToGetDiscordURL": "You can get this by going to Server Settings -> Integrations -> Create Webhook",
+    "Bot Display Name": "Bot Display Name",
+    "Prefix Custom Message": "Prefix Custom Message",
+    "Hello @everyone is...": "Hello {'@'}everyone is...",
+    "teams": "Microsoft Teams",
+    "Webhook URL": "Webhook URL",
+    "wayToGetTeamsURL": "You can learn how to create a webhook URL {0}.",
+    "wayToGetZohoCliqURL": "You can learn how to create a webhook URL {0}.",
+    "signal": "Signal",
+    "Number": "Zenbakia",
+    "Recipients": "Recipients",
+    "needSignalAPI": "You need to have a signal client with REST API.",
+    "wayToCheckSignalURL": "You can check this URL to view how to set one up:",
+    "signalImportant": "IMPORTANT: You cannot mix groups and numbers in recipients!",
+    "gotify": "Gotify",
+    "Application Token": "Aplikazio tokena",
+    "Server URL": "Zerbitzari URLa",
+    "Priority": "Lehentasuna",
+    "slack": "Slack",
+    "Icon Emoji": "Emoji ikonoa",
+    "Channel Name": "Kanalaren izena",
+    "Uptime Kuma URL": "Uptime Kuma URL",
+    "aboutWebhooks": "More info about Webhooks on: {0}",
+    "aboutChannelName": "Enter the channel name on {0} Channel Name field if you want to bypass the Webhook channel. Ex: #other-channel",
+    "aboutKumaURL": "If you leave the Uptime Kuma URL field blank, it will default to the Project GitHub page.",
+    "emojiCheatSheet": "Emoji cheat sheet: {0}",
+    "rocket.chat": "Rocket.Chat",
+    "pushover": "Pushover",
+    "pushy": "Pushy",
+    "PushByTechulus": "Push by Techulus",
+    "octopush": "Octopush",
+    "promosms": "PromoSMS",
+    "clicksendsms": "ClickSend SMS",
+    "lunasea": "LunaSea",
+    "apprise": "Apprise (Support 50+ Notification services)",
+    "GoogleChat": "Google Chat (Google Workspace only)",
+    "pushbullet": "Pushbullet",
+    "line": "Line Messenger",
+    "mattermost": "Mattermost",
+    "User Key": "Erabiltzaile gakoa",
+    "Device": "Gailua",
+    "Message Title": "Mezuaren izenburua",
+    "Notification Sound": "Jakinarazpen soinua",
+    "More info on:": "More info on: {0}",
+    "pushoverDesc1": "Emergency priority (2) has default 30 second timeout between retries and will expire after 1 hour.",
+    "pushoverDesc2": "If you want to send notifications to different devices, fill out Device field.",
+    "SMS Type": "SMS mota",
+    "octopushTypePremium": "Premium (Fast - recommended for alerting)",
+    "octopushTypeLowCost": "Low Cost (Slow - sometimes blocked by operator)",
+    "checkPrice": "Check {0} prices:",
+    "apiCredentials": "API credentials",
+    "octopushLegacyHint": "Do you use the legacy version of Octopush (2011-2020) or the new version?",
+    "Check octopush prices": "Check octopush prices {0}.",
+    "octopushPhoneNumber": "Phone number (intl format, eg : +33612345678) ",
+    "octopushSMSSender": "SMS Sender Name : 3-11 alphanumeric characters and space (a-zA-Z0-9)",
+    "LunaSea Device ID": "LunaSea Device ID",
+    "Apprise URL": "Apprise URL",
+    "Example:": "Adibidez: {0}",
+    "Read more:": "Irakurri gehiago: {0}",
+    "Status:": "Egoera: {0}",
+    "Read more": "Irakurri gehiago",
+    "appriseInstalled": "Apprise instalatuta.",
+    "appriseNotInstalled": "Apprise ez dago instalatuta. {0}",
+    "Access Token": "Access Token",
+    "Channel access token": "Channel access token",
+    "Line Developers Console": "Line Developers Console",
+    "lineDevConsoleTo": "Line Developers Console - {0}",
+    "Basic Settings": "Oinarrizko ezarpenak",
+    "User ID": "Erabiltzaile ID",
+    "Messaging API": "Messaging API",
+    "wayToGetLineChannelToken": "First access the {0}, create a provider and channel (Messaging API), then you can get the channel access token and user ID from the above mentioned menu items.",
+    "Icon URL": "Ikono URL",
+    "aboutIconURL": "You can provide a link to a picture in \"Icon URL\" to override the default profile picture. Will not be used if Icon Emoji is set.",
+    "aboutMattermostChannelName": "You can override the default channel that the Webhook posts to by entering the channel name into \"Channel Name\" field. This needs to be enabled in the Mattermost Webhook settings. Ex: #other-channel",
+    "matrix": "Matrix",
+    "promosmsTypeEco": "SMS ECO - cheap but slow and often overloaded. Limited only to Polish recipients.",
+    "promosmsTypeFlash": "SMS FLASH - Message will automatically show on recipient device. Limited only to Polish recipients.",
+    "promosmsTypeFull": "SMS FULL - Premium tier of SMS, You can use your Sender Name (You need to register name first). Reliable for alerts.",
+    "promosmsTypeSpeed": "SMS SPEED - Highest priority in system. Very quick and reliable but costly (about twice of SMS FULL price).",
+    "promosmsPhoneNumber": "Phone number (for Polish recipient You can skip area codes)",
+    "promosmsSMSSender": "SMS Sender Name : Pre-registred name or one of defaults: InfoSMS, SMS Info, MaxSMS, INFO, SMS",
+    "Feishu WebHookUrl": "Feishu WebHookURL",
+    "matrixHomeserverURL": "Hasiera zerbitzari URL (with http(s):// and optionally port)",
+    "Internal Room Id": "Internal Room ID",
+    "matrixDesc1": "You can find the internal room ID by looking in the advanced section of the room settings in your Matrix client. It should look like !QMdRCpUIfLwsfjxye6:home.server.",
+    "matrixDesc2": "It is highly recommended you create a new user and do not use your own Matrix user's access token as it will allow full access to your account and all the rooms you joined. Instead, create a new user and only invite it to the room that you want to receive the notification in. You can get the access token by running {0}",
+    "Method": "Metodoa",
+    "Body": "Gorputza",
+    "Headers": "Goiburuak",
+    "PushUrl": "Push URL",
+    "HeadersInvalidFormat": "The request headers are not valid JSON: ",
+    "BodyInvalidFormat": "The request body is not valid JSON: ",
+    "Monitor History": "Monitorizazio Historia",
+    "clearDataOlderThan": "Keep monitor history data for {0} days.",
+    "PasswordsDoNotMatch": "Pasahitzak ez datoz bat.",
+    "records": "records",
+    "One record": "One record",
+    "steamApiKeyDescription": "For monitoring a Steam Game Server you need a Steam Web-API key. You can register your API key here: ",
+    "Current User": "Uneko erabiltzailea",
+    "topic": "Topic",
+    "topicExplanation": "MQTT topic to monitor",
+    "successMessage": "Arrakasta mezua",
+    "successMessageExplanation": "MQTT message that will be considered as success",
+    "recent": "Duela gutxikoa",
+    "Done": "Egina",
+    "Info": "Info",
+    "Security": "Segurtasuna",
+    "Steam API Key": "Steam API Giltza",
+    "Shrink Database": "Shrink Datubasea",
+    "Pick a RR-Type...": "Pick a RR-Type...",
+    "Pick Accepted Status Codes...": "Hautatu onartutako egoera kodeak...",
+    "Default": "Lehenetsia",
+    "HTTP Options": "HTTP Aukerak",
+    "Create Incident": "Sortu inzidentzia",
+    "Title": "Titulua",
+    "Content": "Edukia",
+    "Style": "Estiloa",
+    "info": "info",
+    "warning": "kontuz",
+    "danger": "arriskua",
+    "error": "errorea",
+    "critical": "kritikoa",
+    "primary": "oinarrizkoa",
+    "light": "argia",
+    "dark": "iluna",
+    "Post": "Post",
+    "Please input title and content": "Mesedez sartu titulua eta edukia",
+    "Created": "Sortuta",
+    "Last Updated": "Azken eguneratzea",
+    "Unpin": "Unpin",
+    "Switch to Light Theme": "Aldatu gai argira",
+    "Switch to Dark Theme": "Aldatu gai ilunera",
+    "Show Tags": "Erakutsi etiketak",
+    "Hide Tags": "Ezkutatu etiketak",
+    "Description": "Deskribapena",
+    "No monitors available.": "Monitorizaziorik eskuragarri ez.",
+    "Add one": "Gehitu bat",
+    "No Monitors": "Monitorizaziorik ez",
+    "Untitled Group": "Titulurik gabeko taldea",
+    "Services": "Zerbitzuak",
+    "Discard": "Baztertu",
+    "Cancel": "Ezeztatu",
+    "Powered by": "Honekin egina:",
+    "shrinkDatabaseDescription": "Trigger database VACUUM for SQLite. If your database is created after 1.10.0, AUTO_VACUUM is already enabled and this action is not needed.",
+    "serwersms": "SerwerSMS.pl",
+    "serwersmsAPIUser": "API erabiltzailea (webapi_ aurre-hizkia barne)",
+    "serwersmsAPIPassword": "API pasahitza",
+    "serwersmsPhoneNumber": "Telefono zenbakia",
+    "serwersmsSenderName": "SMS bidaltzaile izena (registered via customer portal)",
+    "stackfield": "Stackfield",
+    "Customize": "Pertsonalizatu",
+    "Custom Footer": "Oin pertsonalizatua",
+    "Custom CSS": "CSS pertsonalizatua",
+    "smtpDkimSettings": "DKIM ezarpenak",
+    "smtpDkimDesc": "Please refer to the Nodemailer DKIM {0} for usage.",
+    "documentation": "dokumentazioa",
+    "smtpDkimDomain": "Domeinu izena",
+    "smtpDkimKeySelector": "Gako hautatzailea",
+    "smtpDkimPrivateKey": "Gako pribatua",
+    "smtpDkimHashAlgo": "Hash algoritmoa (hautazkoa)",
+    "smtpDkimheaderFieldNames": "Header Keys to sign (Optional)",
+    "smtpDkimskipFields": "Header Keys not to sign (Optional)",
+    "wayToGetPagerDutyKey": "You can get this by going to Service -> Service Directory -> (Select a service) -> Integrations -> Add integration. Here you can search for \"Events API V2\". More info {0}",
+    "Integration Key": "Integration Key",
+    "Integration URL": "Integrazio URLa",
+    "Auto resolve or acknowledged": "Auto resolve or acknowledged",
+    "do nothing": "ez egin ezer",
+    "auto acknowledged": "auto acknowledged",
+    "auto resolve": "auto resolve",
+    "gorush": "Gorush",
+    "alerta": "Alerta",
+    "alertaApiEndpoint": "API Endpoint",
+    "alertaEnvironment": "Ingurunea",
+    "alertaApiKey": "API Key",
+    "alertaAlertState": "Alerta egoera",
+    "alertaRecoverState": "Berreskuratze egoera",
+    "deleteStatusPageMsg": "Ziur zaude egoera orri hau ezabatu nahi duzula?",
+    "Proxies": "Proxiak",
+    "default": "Lehenetsia",
+    "enabled": "Gaituta",
+    "setAsDefault": "Ezarri lehenetsitzat",
+    "deleteProxyMsg": "Are you sure want to delete this proxy for all monitors?",
+    "proxyDescription": "Proxies must be assigned to a monitor to function.",
+    "enableProxyDescription": "This proxy will not effect on monitor requests until it is activated. You can control temporarily disable the proxy from all monitors by activation status.",
+    "setAsDefaultProxyDescription": "This proxy will be enabled by default for new monitors. You can still disable the proxy separately for each monitor.",
+    "Certificate Chain": "Certificate Chain",
+    "Valid": "Baliozkoa",
+    "Invalid": "Baliogabea",
+    "AccessKeyId": "AccessKey ID",
+    "SecretAccessKey": "AccessKey Secret",
+    "PhoneNumbers": "TelefonoZenbakiak",
+    "TemplateCode": "TemplateCode",
+    "SignName": "SignName",
+    "Sms template must contain parameters: ": "Sms txantiloiak parametroak eduki behar ditu: ",
+    "Bark Endpoint": "Bark Endpoint",
+    "WebHookUrl": "WebHookUrl",
+    "SecretKey": "SecretKey",
+    "For safety, must use secret key": "For safety, must use secret key",
+    "Device Token": "Gailu tokena",
+    "Platform": "Plataforma",
+    "iOS": "iOS",
+    "Android": "Android",
+    "Huawei": "Huawei",
+    "High": "Altua",
+    "Retry": "Errepikatu",
+    "Topic": "Gaia",
+    "WeCom Bot Key": "WeCom Bot Key",
+    "Setup Proxy": "Ezarri Proxya",
+    "Proxy Protocol": "Proxy protokoloa",
+    "Proxy Server": "Proxy zerbitzaria",
+    "Proxy server has authentication": "Proxy zerbitzariak autentifikazioa dauka",
+    "User": "Erabiltzailea",
+    "Installed": "Instalatuta",
+    "Not installed": "Instalatu gabe",
+    "Running": "Martxan",
+    "Not running": "Ez martxan",
+    "Remove Token": "Ezabatu Tokena",
+    "Start": "Hasi",
+    "Stop": "Gelditu",
+    "Uptime Kuma": "Uptime Kuma",
+    "Add New Status Page": "Gehitu egoera orri berria",
+    "Slug": "Sluga",
+    "Accept characters:": "Onartu karaktereak:",
+    "startOrEndWithOnly": "Start or end with {0} only",
+    "No consecutive dashes": "No consecutive dashes",
+    "Next": "Hurrengoa",
+    "The slug is already taken. Please choose another slug.": "Sluga dagoeneko hartuta dago. Mesedez beste bat hautatu.",
+    "No Proxy": "Proxyrik ez",
+    "Authentication": "Authentication",
+    "HTTP Basic Auth": "HTTP oinarrizko Auth",
+    "New Status Page": "Egoera orri berria",
+    "Page Not Found": "Orria ez da aurkitu",
+    "Reverse Proxy": "Alderantzizkako Proxya",
+    "Backup": "Backup",
+    "About": "Honi buruz",
+    "wayToGetCloudflaredURL": "(Download cloudflared from {0})",
+    "cloudflareWebsite": "Cloudflare webgunea",
+    "Message:": "Mezua:",
+    "Don't know how to get the token? Please read the guide:": "Don't know how to get the token? Please read the guide:",
+    "The current connection may be lost if you are currently connecting via Cloudflare Tunnel. Are you sure want to stop it? Type your current password to confirm it.": "The current connection may be lost if you are currently connecting via Cloudflare Tunnel. Are you sure want to stop it? Type your current password to confirm it.",
+    "Other Software": "Beste softwarea",
+    "For example: nginx, Apache and Traefik.": "Adibidez: nginx, Apache and Traefik.",
+    "Please read": "Mesedez irakurri",
+    "Subject:": "Gaia:",
+    "Valid To:": "Balio-epea:",
+    "Days Remaining:": "Egun faltan:",
+    "Issuer:": "Issuer:",
+    "Fingerprint:": "Hatzmarka:",
+    "No status pages": "Egoera orririk ez",
+    "Domain Name Expiry Notification": "Domeinu izen iraungitze jakinarazpena",
+    "Proxy": "Proxya",
+    "Date Created": "Data sortuta",
+    "onebotHttpAddress": "OneBot HTTP helbidea",
+    "onebotMessageType": "OneBot mezu mota",
+    "onebotGroupMessage": "Taldea",
+    "onebotPrivateMessage": "Pribatua",
+    "onebotUserOrGroupId": "Talde/Erabiltzaile IDa",
+    "onebotSafetyTips": "For safety, must set access token",
+    "PushDeer Key": "PushDeer Key",
+    "Footer Text": "Oineko testua",
+    "Show Powered By": "Erakutsi Honekin egina:",
+    "Domain Names": "Domeinu izenak",
+    "signedInDisp": "Signed in as {0}",
+    "signedInDispDisabled": "Auth desgaituta.",
+    "Certificate Expiry Notification": "Zertifikatu iraungitze jakinarazpena",
+    "API Username": "API Erabiltzailea",
+    "API Key": "API Gakoa",
+    "Recipient Number": "Recipient Number",
+    "From Name/Number": "From Name/Number",
+    "Leave blank to use a shared sender number.": "Leave blank to use a shared sender number.",
+    "Octopush API Version": "Octopush API Version",
+    "Legacy Octopush-DM": "Legacy Octopush-DM",
+    "endpoint": "endpoint",
+    "octopushAPIKey": "\"API key\" from HTTP API credentials in control panel",
+    "octopushLogin": "\"Login\" from HTTP API credentials in control panel",
+    "promosmsLogin": "API Saio haste izena",
+    "promosmsPassword": "API Pasahitza",
+    "pushoversounds pushover": "Pushover (defektuz)",
+    "pushoversounds bike": "Bizikleta",
+    "pushoversounds bugle": "Bugle",
+    "pushoversounds cashregister": "Cash Register",
+    "pushoversounds classical": "Klasikoa",
+    "pushoversounds cosmic": "Kosmikoa",
+    "pushoversounds falling": "Erortzen",
+    "pushoversounds gamelan": "Gamelan",
+    "pushoversounds incoming": "Incoming",
+    "pushoversounds intermission": "Intermission",
+    "pushoversounds magic": "Magia",
+    "pushoversounds mechanical": "Mekanikoa",
+    "pushoversounds pianobar": "Piano Bar",
+    "pushoversounds siren": "Sirena",
+    "pushoversounds spacealarm": "Espazio Alarma",
+    "pushoversounds tugboat": "Tug Boat",
+    "pushoversounds alien": "Alien Alarm (long)",
+    "pushoversounds climb": "Climb (long)",
+    "pushoversounds persistent": "Persistent (long)",
+    "pushoversounds echo": "Pushover Echo (long)",
+    "pushoversounds updown": "Up Down (long)",
+    "pushoversounds vibrate": "Bibrazioa soilik",
+    "pushoversounds none": "Bat ere ez (isilik)",
+    "pushyAPIKey": "Secret API giltza",
+    "pushyToken": "Gailu tokena",
+    "Show update if available": "Erakutsi eguneratzea eskuragarri badago",
+    "Also check beta release": "Beta bertsioak ere egiaztatu",
+    "Using a Reverse Proxy?": "Proxy alderantzizkako zerbitzaria erabiltzen?",
+    "Check how to config it for WebSocket": "Check how to config it for WebSocket",
+    "Steam Game Server": "Steam joko zerbitzaria",
+    "Most likely causes:": "Arrazoi probableenak:",
+    "The resource is no longer available.": "Baliabidea ez dago erabilgarri.",
+    "There might be a typing error in the address.": "Idazketa-akats bat egon daiteke helbidean.",
+    "What you can try:": "Probatu dezakezuna:",
+    "Retype the address.": "Berridatzi helbidea.",
+    "Go back to the previous page.": "Itzuli aurreko orrialdera",
+    "Coming Soon": "Laster",
+    "wayToGetClickSendSMSToken": "API erabiltzailea and API giltza hemendik lortu ditzakezu: {0} .",
+    "Connection String": "Konexio katea",
+    "Query": "Kontsulta",
+    "settingsCertificateExpiry": "TLS irungitze zertifikatua",
+    "certificationExpiryDescription": "HTTPS Monitorizazio jakinarazpena martxan jarri TLS zertifikatua iraungitzeko hau falta denean:",
+    "ntfy Topic": "ntfy Topic",
+    "Domain": "Domeinua",
+    "Workstation": "Lan gunea",
+    "disableCloudflaredNoAuthMsg": "Ez Auth moduan zaude, pasahitza ez da beharrezkoa."
+}
diff --git a/src/lang/fa.json b/src/lang/fa.json
new file mode 100644
index 000000000..b05d99e7b
--- /dev/null
+++ b/src/lang/fa.json
@@ -0,0 +1,201 @@
+{
+    "languageName": "Farsi",
+    "checkEverySecond": "بررسی هر {0} ثانیه.",
+    "retryCheckEverySecond": "تکرار مجدد هر {0} ثانیه.",
+    "retriesDescription": "حداکثر تعداد تکرار پیش از علامت گذاری وب‌سایت بعنوان خارج از دسترس و ارسال اطلاع‌رسانی.",
+    "ignoreTLSError": "بی‌خیال ارور TLS/SSL برای سایت‌های HTTPS",
+    "upsideDownModeDescription": "نتیجه وضعیت را برعکس کن، مثلا اگر سرویس در دسترس بود فرض کن که سرویس پایین است!",
+    "maxRedirectDescription": "حداکثر تعداد ریدایرکتی که سرویس پشتیبانی کند. برای اینکه ری‌دایرکت‌ها پشتیبانی نشوند، عدد 0 را وارد کنید.",
+    "acceptedStatusCodesDescription": "لطفا HTTP Status Code هایی که میخواهید به عنوان پاسخ موفقیت آمیز در نظر گرفته شود را انتخاب کنید.",
+    "passwordNotMatchMsg": "تکرار رمز عبور مطابقت ندارد!",
+    "notificationDescription": "برای اینکه سرویس اطلاع‌رسانی کار کند، آنرا به یکی از مانیتور‌ها متصل کنید.",
+    "keywordDescription": "در نتیجه درخواست (اهمیتی ندارد پاسخ JSON است یا HTML) بدنبال این کلمه بگرد (حساس به کوچک/بزرگ بودن حروف).",
+    "pauseDashboardHome": "متوقف شده",
+    "deleteMonitorMsg": "آیا از حذف این مانیتور مطمئن هستید؟",
+    "deleteNotificationMsg": "آیا مطمئن هستید که میخواهید این سرویس اطلاع‌رسانی را برای تمامی مانیتورها حذف کنید؟",
+    "resolverserverDescription": "سرویس CloudFlare به عنوان سرور پیش‌فرض استفاده می‌شود، شما میتوانید آنرا به هر سرور دیگری بعدا تغییر دهید.",
+    "rrtypeDescription": "لطفا نوع Resource Record را انتخاب کنید.",
+    "pauseMonitorMsg": "آیا مطمئن هستید که میخواهید این مانیتور را متوقف کنید ؟",
+    "enableDefaultNotificationDescription": "برای هر مانیتور جدید، این سرویس اطلاع‌رسانی به صورت پیش‌فرض فعال خواهد شد. البته که شما میتوانید به صورت دستی آنرا برای هر مانیتور به صورت جداگانه غیر فعال کنید.",
+    "clearEventsMsg": "آیا از اینکه تمامی تاریخچه رویداد‌های این مانیتور حذف شود مطمئن هستید؟",
+    "clearHeartbeatsMsg": "آیا از اینکه تاریخچه تمامی Heartbeat های این مانیتور حذف شود مطمئن هستید؟ ",
+    "confirmClearStatisticsMsg": "آیا از حذف تمامی آمار و ارقام مطمئن هستید؟",
+    "importHandleDescription": " اگر که میخواهید بیخیال مانیتورها و یا سرویس‌های اطلاع‌رسانی که با نام مشابه از قبل موجود هستند شوید، گزینه 'بی‌خیال موارد ..' را انتخاب کنید. توجه کنید که گزینه 'بازنویسی' تمامی موارد موجود با نام مشابه را از بین خواهد برد.",
+    "confirmImportMsg": "آیا از بازگردانی بک آپ مطمئن هستید؟ لطفا از اینکه نوع بازگردانی درستی را انتخاب کرده‌اید اطمینان حاصل کنید!",
+    "twoFAVerifyLabel": "لطفا جهت اطمینان از عملکرد احراز هویت دو مرحله‌ای توکن خود را وارد کنید!",
+    "tokenValidSettingsMsg": "توکن شما معتبر است، هم اکنون میتوانید احراز هویت دو مرحله‌ای را فعال کنید!",
+    "confirmEnableTwoFAMsg": " آیا از فعال سازی احراز هویت دو مرحله‌ای مطمئن هستید؟",
+    "confirmDisableTwoFAMsg": "آیا از غیرفعال سازی احراز هویت دومرحله‌ای مطمئن هستید؟",
+    "Settings": "تنظیمات",
+    "Dashboard": "پیشخوان",
+    "New Update": "بروزرسانی جدید!",
+    "Language": "زبان",
+    "Appearance": "ظاهر",
+    "Theme": "پوسته",
+    "General": "عمومی",
+    "Version": "نسخه",
+    "Check Update On GitHub": "بررسی بروزرسانی بر روی گیت‌هاب",
+    "List": "لیست",
+    "Add": "اضافه",
+    "Add New Monitor": "اضافه کردن مانیتور جدید",
+    "Quick Stats": "خلاصه وضعیت",
+    "Up": "فعال",
+    "Down": "غیرفعال",
+    "Pending": "در انتظار تایید",
+    "Unknown": "نامشخص",
+    "Pause": "توقف",
+    "Name": "نام",
+    "Status": "وضعیت",
+    "DateTime": "تاریخ و زمان",
+    "Message": "پیام",
+    "No important events": "رخداد جدیدی موجود نیست.",
+    "Resume": "ادامه",
+    "Edit": "ویرایش",
+    "Delete": "حذف",
+    "Current": "فعلی",
+    "Uptime": "آپتایم",
+    "Cert Exp.": "تاریخ انقضای SSL",
+    "day": "روز",
+    "-day": "-روز",
+    "hour": "ساعت",
+    "-hour": "-ساعت",
+    "Response": "پاسخ",
+    "Ping": "Ping",
+    "Monitor Type": "نوع مانیتور",
+    "Keyword": "کلمه کلیدی",
+    "Friendly Name": "عنوان",
+    "URL": "آدرس (URL)",
+    "Hostname": "نام میزبان (Hostname)",
+    "Port": "پورت",
+    "Heartbeat Interval": "فاصله هر Heartbeat",
+    "Retries": "تلاش مجدد",
+    "Heartbeat Retry Interval": "فاصله تلاش مجدد برایHeartbeat",
+    "Advanced": "پیشرفته",
+    "Upside Down Mode": "حالت بر عکس",
+    "Max. Redirects": "حداکثر تعداد ری‌دایرکت",
+    "Accepted Status Codes": "وضعیت‌های (Status Code) های قابل قبول",
+    "Save": "ذخیره",
+    "Notifications": "اطلاع‌رسانی‌ها",
+    "Not available, please setup.": "هیچ موردی موجود نیست، اولین مورد را راه اندازی کنید!",
+    "Setup Notification": "راه اندازی اطلاع‌رسانی‌",
+    "Light": "روشن",
+    "Dark": "تاریک",
+    "Auto": "اتوماتیک",
+    "Theme - Heartbeat Bar": "ظاهر نوار Heartbeat",
+    "Normal": "معمولی",
+    "Bottom": "پایین",
+    "None": "هیچ کدام",
+    "Timezone": "موقعیت زمانی",
+    "Search Engine Visibility": "قابلیت دسترسی برای موتورهای جستجو",
+    "Allow indexing": "اجازه ایندکس شدن را بده.",
+    "Discourage search engines from indexing site": "به موتورهای جستجو اجازه ایندکس کردن این سامانه را نده.",
+    "Change Password": "تغییر رمزعبور",
+    "Current Password": "رمزعبور فعلی",
+    "New Password": "رمزعبور جدید",
+    "Repeat New Password": "تکرار رمزعبور جدید",
+    "Update Password": "بروز رسانی رمز عبور",
+    "Disable Auth": "غیر فعال سازی تایید هویت",
+    "Enable Auth": "فعال سازی تایید هویت",
+    "disableauth.message1": "آیا مطمئن هستید که میخواهید <strong>احراز هویت را غیر فعال کنید</strong>?",
+    "disableauth.message2": "این ویژگی برای کسانی است که <strong> لایه امنیتی شخص ثالث دیگر بر روی این آدرس فعال کرده‌اند</strong>، مانند Cloudflare Access.",
+    "Please use this option carefully!": "لطفا از این امکان با دقت استفاده کنید.",
+    "Logout": "خروج",
+    "Leave": "منصرف شدم",
+    "I understand, please disable": "متوجه هستم، لطفا غیرفعال کنید!",
+    "Confirm": "تایید",
+    "Yes": "بلی",
+    "No": "خیر",
+    "Username": "نام کاربری",
+    "Password": "کلمه عبور",
+    "Remember me": "مراب هب خاطر بسپار",
+    "Login": "ورود",
+    "No Monitors, please": "هیچ مانیتوری موجود نیست، لطفا",
+    "add one": "یک مورد اضافه کنید",
+    "Notification Type": "نوع اطلاع‌رسانی",
+    "Email": "ایمیل",
+    "Test": "تست",
+    "Certificate Info": "اطلاعات سرتیفیکت",
+    "Resolver Server": "سرور Resolver",
+    "Resource Record Type": "نوع رکورد (Resource Record Type)",
+    "Last Result": "آخرین نتیجه",
+    "Create your admin account": "ایجاد حساب کاربری مدیر",
+    "Repeat Password": "تکرار رمز عبور",
+    "Import Backup": "بازگردانی فایل پشتیبان",
+    "Export Backup": "ذخیره فایل پشتیبان",
+    "Export": "استخراج اطلاعات",
+    "Import": "ورود اطلاعات",
+    "respTime": "زمان پاسخگویی (میلی‌ثانیه)",
+    "notAvailableShort": "ناموجود",
+    "Default enabled": "به صورت پیش‌فرض فعال باشد.",
+    "Apply on all existing monitors": "بر روی تمامی مانیتور‌های فعلی اعمال شود.",
+    "Create": "ایجاد",
+    "Clear Data": "پاکسازی داده‌ها",
+    "Events": "رخداد‌ها",
+    "Heartbeats": "Heartbeats",
+    "Auto Get": "Auto Get",
+    "backupDescription": "شما میتوانید تمامی مانیتورها و تنظیمات اطلاع‌رسانی‌ها را در قالب یه فایل JSON دریافت کنید.",
+    "backupDescription2": "البته تاریخچه رخدادها دراین فایل قرار نخواهند داشت.",
+    "backupDescription3": "توجه داشته باشید که تمامی اطلاعات حساس شما مانند توکن‌ها نیز در این فایل وجود خواهد داشت ، پس از این فایل به خوبی مراقبت کنید.",
+    "alertNoFile": "لطفا یک فایل برای «ورود اطلاعات» انتخاب کنید..",
+    "alertWrongFileType": "یک فایل JSON انتخاب کنید.",
+    "Clear all statistics": "پاکسازی تمامی آمار و ارقام",
+    "Skip existing": "بی‌خیال مواردی که از قبل موجود است",
+    "Overwrite": "بازنویسی",
+    "Options": "تنظیمات",
+    "Keep both": "هر دو را نگه‌ دار",
+    "Verify Token": "تایید توکن",
+    "Setup 2FA": "تنظیمات احراز دو مرحله‌ای",
+    "Enable 2FA": "فعال سازی احراز 2 مرحله‌ای",
+    "Disable 2FA": "غیر فعال کردن احراز 2 مرحله‌ای",
+    "2FA Settings": "تنظیمات احراز 2 مرحله‌ای",
+    "Two Factor Authentication": "احراز هویت دومرحله‌ای",
+    "Active": "فعال",
+    "Inactive": "غیرفعال",
+    "Token": "توکن",
+    "Show URI": "نمایش آدرس (URI) ",
+    "Tags": "برچسب‌ها",
+    "Add New below or Select...": "یک مورد جدید اضافه کنید و یا از لیست انتخاب کنید…",
+    "Tag with this name already exist.": "یک برچسب با این «نام» از قبل وجود دارد",
+    "Tag with this value already exist.": "یک برچسب با این «مقدار» از قبل وجود دارد.",
+    "color": "رنگ",
+    "value (optional)": "مقدار (اختیاری)",
+    "Gray": "خاکستری",
+    "Red": "قرمز",
+    "Orange": "نارنجی",
+    "Green": "سبز",
+    "Blue": "آبی",
+    "Indigo": "نیلی",
+    "Purple": "بنفش",
+    "Pink": "صورتی",
+    "Search...": "جستجو...",
+    "Avg. Ping": "متوسط پینگ",
+    "Avg. Response": "متوسط زمان پاسخ",
+    "Entry Page": "صفحه ورودی",
+    "statusPageNothing": "چیزی اینجا نیست، لطفا یک گروه و یا یک مانیتور اضافه کنید!",
+    "No Services": "هیچ سرویسی موجود نیست",
+    "All Systems Operational": "تمامی سیستم‌ها عملیاتی هستند!",
+    "Partially Degraded Service": "افت نسبی کیفیت سرویس",
+    "Degraded Service": "افت کامل کیفیت سرویس",
+    "Add Group": "اضافه کردن گروه",
+    "Add a monitor": "اضافه کردن مانیتور",
+    "Edit Status Page": "ویرایش صفحه وضعیت",
+    "Status Page": "صفحه وضعیت",
+    "Status Pages": "صفحه وضعیت",
+    "Go to Dashboard": "رفتن به پیشخوان",
+    "Uptime Kuma": "آپتایم کوما",
+    "records": "مورد",
+    "One record": "یک مورد",
+    "Info": "اطلاعات",
+    "Powered by": "نیرو گرفته از",
+    "apprise": "Apprise (Support 50+ Notification services)",
+    "Monitor": "مانیتور | مانتیور ها",
+    "Help": "کمک",
+    "Game": "بازی",
+    "Primary Base URL": "آدرس URL اصلی",
+    "Passive Monitor Type": "حالت مانیتور غیرفعال",
+    "Specific Monitor Type": "حالت مانیتور شخصی",
+    "statusMaintenance": "در دست تعمیر",
+    "Maintenance": "در حال تعمیر",
+    "General Monitor Type": "حالت مانیتور عمومی",
+    "markdownSupported": "شیوه نگارشی Markdown پشتیبانی می شود"
+}
diff --git a/src/lang/fi.json b/src/lang/fi.json
new file mode 100644
index 000000000..5a7ce4099
--- /dev/null
+++ b/src/lang/fi.json
@@ -0,0 +1,699 @@
+{
+    "Dashboard": "Kojetaulu",
+    "Help": "Apua",
+    "New Update": "Uusi Päivitys",
+    "Language": "Kieli",
+    "Appearance": "Ulkonäkö",
+    "Theme": "Teema",
+    "General": "Yleinen",
+    "Game": "Peli",
+    "Version": "Versio",
+    "List": "Lista",
+    "Add": "Lisää",
+    "Add New Monitor": "Lisää uusi seurain",
+    "Quick Stats": "Nopeat tilastot",
+    "Up": "Ylös",
+    "Down": "Alas",
+    "Pending": "Odottaa",
+    "statusMaintenance": "Huolto",
+    "Maintenance": "Huolto",
+    "Unknown": "Tuntematon",
+    "General Monitor Type": "Yleinen seuranta tyyppi",
+    "Passive Monitor Type": "Passiivinen seuranta tyyppi",
+    "markdownSupported": "Markdown-syntaksi tuettu",
+    "pauseDashboardHome": "Tauko",
+    "Pause": "Tauko",
+    "Name": "Nimi",
+    "Status": "Tila",
+    "DateTime": "Päivämäärä",
+    "Message": "Viesti",
+    "No important events": "Ei tärkeitä tapahtumia",
+    "Resume": "Jatka",
+    "Edit": "Muokkaa",
+    "Delete": "Poista",
+    "Current": "Nykyinen",
+    "Uptime": "Päälläoloaika",
+    "Monitor": "Seurain | Seuraimet",
+    "day": "Päivä | Päivää",
+    "-day": "-päivä",
+    "hour": "Tunti",
+    "-hour": "-tunti",
+    "Response": "Vastaus",
+    "Ping": "Signaali",
+    "Monitor Type": "Seurain tyyppi",
+    "Keyword": "Avainsana",
+    "URL": "URL",
+    "Hostname": "Isäntänimi",
+    "Heartbeat Interval": "Sydämensyke intervalli",
+    "Retries": "Uusintayrityksiä",
+    "Resend Notification if Down X times consequently": "Uudelleen lähetä ilmoitus jos ei vastausta X määrä peräkkäin",
+    "Advanced": "Edistynyt",
+    "checkEverySecond": "Tarkista jokainen {0} sekuntti",
+    "retryCheckEverySecond": "Yritä uudelleen jokainen {0} sekuntti",
+    "resendEveryXTimes": "Uudelleen lähetä jokainen {0} kerta",
+    "ignoreTLSError": "Älä huomioi TLS/SSL virhettä HTTPS nettisivuilla",
+    "upsideDownModeDescription": "Pyöräytä tila ylösalaisin. Jos palvelu on saavutettavissa, merkitse se SAMMUNEEKSI.",
+    "maxRedirectDescription": "Maksimi määrä uudelleen ohjauksia joita seurata. Aseta 0 estääksesi uudelleenohjaukset.",
+    "Upside Down Mode": "Ylösalaisin-moodi",
+    "Max. Redirects": "Maksimi määrä uudelleenohjauksia",
+    "Accepted Status Codes": "Sallitut tila koodit",
+    "Push URL": "Työnnä URL",
+    "Save": "Tallenna",
+    "Notifications": "Ilmoitukset",
+    "Setup Notification": "Määritä ilmoitukset",
+    "Light": "Vaalea",
+    "Dark": "Tumma",
+    "Auto": "Automaattinen",
+    "Theme - Heartbeat Bar": "Teema - Sydänlyönti palkki",
+    "Normal": "Normaali",
+    "Bottom": "Pohja",
+    "None": "Ei mitään",
+    "Timezone": "Aikavyöhyke",
+    "Search Engine Visibility": "Hakukone näkyvyys",
+    "Allow indexing": "Salli indeksointi",
+    "Change Password": "Vaihda salasana",
+    "Current Password": "Nykyinen salasana",
+    "New Password": "Uusi salasana",
+    "Repeat New Password": "Toista uusi salasana",
+    "Update Password": "Päivätä salasana",
+    "Disable Auth": "Poista todennus käytöstä",
+    "Enable Auth": "Ota todennus käyttöön",
+    "Logout": "Kirjaudu ulos",
+    "Leave": "Poistu",
+    "I understand, please disable": "Ymmärrän, poista käytöstä",
+    "Confirm": "Hyväksy",
+    "Yes": "Kyllä",
+    "No": "Ei",
+    "Username": "Käyttäjänimi",
+    "Password": "Salasana",
+    "Login": "Kirjaudu",
+    "add one": "Lisää yksi",
+    "Notification Type": "Ilmoitus tyyppi",
+    "Email": "Sähköposti",
+    "Test": "Testi",
+    "Certificate Info": "Sertifikaatti tiedot",
+    "Settings": "Asetukset",
+    "Check Update On GitHub": "Tarkista päivitys GitHub:ssa",
+    "Specific Monitor Type": "Tietty seuranta tyyppi",
+    "Cert Exp.": "Sertifikaatti vanh.",
+    "Friendly Name": "Ystävällinen nimi",
+    "Port": "Portti",
+    "Heartbeat Retry Interval": "Sydämensyke uudelleen yritys intervalli",
+    "resendDisabled": "Uudelleen lähetys poissa käytöstä",
+    "retriesDescription": "Maksimi määrä uudelleen yrityksiä ennen kuin palvelu merkitään sammuneeksi ja ilmoitus lähetetään",
+    "Discourage search engines from indexing site": "Estä hakukoneita indeksoimasta sivua",
+    "disableauth.message1": "Oletko varma että haluat <strong>poistaa todennuksen käytöstä</strong>?",
+    "Please use this option carefully!": "Käytä tätä vaihtoehtoa varoen!",
+    "Remember me": "Muista minut",
+    "languageName": "Suomi",
+    "Primary Base URL": "Ensisijainen perus-URL-osoite",
+    "pushOptionalParams": "Valinnaiset parametrit: {0}",
+    "Not available, please setup.": "Ei saatavilla, määritä ensin.",
+    "needPushEvery": "Sinun pitäisi kutsua tätä URL joka {0} sekuntti.",
+    "disableauth.message2": "Se on suunniteltu tilanteisiin <strong>jossa aiot käyttää kolmannen osapuolen todennnusta</strong> Uptime Kuma:n edessä, kuten Cloudflare Access, Authelia tai jotain muuta todennus mekanismia.",
+    "No Monitors, please": "Ei seuraimia, kiitos",
+    "Resolver Server": "Ratkaisija palvelin",
+    "Resource Record Type": "Resusrssi tallenne tyyppi",
+    "Last Result": "Viimeinen tulos",
+    "Create your admin account": "Luo sinun järjestelmänvalvoja käyttäjä",
+    "Repeat Password": "Toista salasana",
+    "Import Backup": "Tuo varmuuskopio",
+    "Export Backup": "Vie varmuuskopio",
+    "Export": "Vie",
+    "Import": "Tuo",
+    "respTime": "Vast. aika (ms)",
+    "notAvailableShort": "Ei käytössä",
+    "Default enabled": "Oletus käytössä",
+    "Apply on all existing monitors": "Aseta jokaiselle olemassa olevaan seuraimeen",
+    "Create": "Luo",
+    "Clear Data": "Tyhjennä data",
+    "Events": "Tapahtumat",
+    "Heartbeats": "Sydämensyke",
+    "Auto Get": "Automaattinen haku",
+    "Schedule maintenance": "Ajoita huolto",
+    "Affected Monitors": "Vaikutetut seuraimet",
+    "Pick Affected Monitors...": "Poimi vaikutetut seuraimet…",
+    "Start of maintenance": "Huollon aloitus",
+    "All Status Pages": "Kaikki tilanne sivut",
+    "Select status pages...": "Valitse tilanne sivu…",
+    "alertNoFile": "Valitse tuotava tiedosto.",
+    "alertWrongFileType": "Valitse JSON tiedosto.",
+    "Clear all statistics": "Tyhjennä kaikki tilastot",
+    "Skip existing": "Ohita olemassa oleva",
+    "Overwrite": "Päälle kirjoita",
+    "Options": "Vaihtoehdot",
+    "Keep both": "Pidä molemmat",
+    "Verify Token": "Vahvista tunnus",
+    "Setup 2FA": "Määritä 2FA",
+    "Enable 2FA": "Ota 2FA käyttöön",
+    "Disable 2FA": "Poista 2FA käytöstä",
+    "2FA Settings": "2FA asetukset",
+    "Two Factor Authentication": "kaksivaiheinen tunnistautuminen",
+    "Active": "Aktiivinen",
+    "Token": "Tokeni",
+    "Show URI": "Näytä URI",
+    "Tags": "Tunnisteet",
+    "Tag with this name already exist.": "Tunniste tällä nimellä on jo olemassa.",
+    "Tag with this value already exist.": "Tunniste tällä arvolla on jo olemassa.",
+    "color": "Väri",
+    "value (optional)": "Arvo (valinnainen)",
+    "Gray": "Harmaa",
+    "Red": "Punainen",
+    "Orange": "Oranssi",
+    "Green": "Vihreä",
+    "Indigo": "Indigo",
+    "Purple": "Purppura",
+    "Pink": "Vaaleanpunainen",
+    "Custom": "Mukautettu",
+    "Search...": "Etsi…",
+    "Avg. Ping": "kesk.arv. viive",
+    "Entry Page": "Sisääntulosivu",
+    "statusPageNothing": "Täällä ei ole mitään. Lisää ryhmä tai seurain.",
+    "No Services": "Ei palveluita",
+    "Partially Degraded Service": "Osittain heikentynyt palvelu",
+    "Degraded Service": "Heikentynyt palvelu",
+    "Add Group": "Lisää ryhmä",
+    "Add a monitor": "Lisää seurain",
+    "Edit Status Page": "Muokkaa tilanne sivua",
+    "Go to Dashboard": "Mene kojelaudalle",
+    "Status Page": "Tilanne sivu",
+    "Status Pages": "Tilanne sivut",
+    "here": "täällä",
+    "Required": "Vaadittu",
+    "webhook": "Webhookki",
+    "Post URL": "Lähetys URL",
+    "Content Type": "Sisältö tyyppi",
+    "webhookJsonDesc": "{0} on hyvä jokaisille modernilleille HTTP palvelimille kuten Express.js",
+    "webhookAdditionalHeadersTitle": "Lisä otsakkeet",
+    "webhookAdditionalHeadersDesc": "Asettaa lisäpäätteet, jotka on lähetetty webhookilla.",
+    "Webhook URL": "Webhookin URL",
+    "Application Token": "Sovellus tokeni",
+    "Server URL": "Palvelin URL",
+    "Priority": "Prioriteetti",
+    "emojiCheatSheet": "Emoji lunttilappu: {0}",
+    "Read more": "Lue lisää",
+    "appriseInstalled": "Apprise on asennettu.",
+    "appriseNotInstalled": "Apprisea ei ole asennettu. {0}",
+    "Method": "Menetelmä",
+    "Body": "Runko",
+    "Headers": "Otsikot",
+    "PushUrl": "Työntö URL",
+    "BodyInvalidFormat": "Pyynnön runko ei ole kelvollinen JSON: ",
+    "Monitor History": "Seuraa historiaa",
+    "PasswordsDoNotMatch": "Salasanat eivät täsmää.",
+    "records": "tallenteet",
+    "One record": "Yksi tallenne",
+    "Current User": "Nykyinen käyttäjä",
+    "topic": "Aihe",
+    "topicExplanation": "MQTT seurattava aihe",
+    "successMessage": "Onnistumis viesti",
+    "successMessageExplanation": "MQTT-viesti, jota pidetään onnistuneena",
+    "recent": "Viimeaikainen",
+    "Done": "Tehty",
+    "Info": "Tiedot",
+    "Security": "Turvallisuus",
+    "Steam API Key": "Steam API-avain",
+    "Shrink Database": "Pienennä tietokanta",
+    "Pick a RR-Type...": "Valitse RR-tyyppi…",
+    "Pick Accepted Status Codes...": "Valitse hyväksytyt tilakoodit…",
+    "Default": "Oletus",
+    "HTTP Options": "HTTP-asetukset",
+    "Create Incident": "Luo tapaus",
+    "Title": "Otsikko",
+    "Content": "Sisältö",
+    "Style": "Tyyli",
+    "info": "Tiedot",
+    "warning": "Varoitus",
+    "danger": "vaara",
+    "error": "virhe",
+    "critical": "kriittinen",
+    "primary": "ensisijainen",
+    "dark": "Tumma",
+    "Post": "Lähetä",
+    "Please input title and content": "Syötä otsikko ja sisältö",
+    "Created": "Luo",
+    "Last Updated": "Viimeksi päivitetty",
+    "Unpin": "Irroita",
+    "Switch to Dark Theme": "Vaihda tummaan teemaan",
+    "Show Tags": "Näytä tunnisteet",
+    "Hide Tags": "Piilota tunnisteet",
+    "Description": "Kuvaus",
+    "No monitors available.": "Ei seuraimia saatavilla.",
+    "Add one": "Lisää yksi",
+    "No Monitors": "Ei seuraimia",
+    "Untitled Group": "Nimetön ryhmä",
+    "Services": "Palvelut",
+    "Discard": "Hävitä",
+    "Cancel": "Peruuttaa",
+    "Customize": "Mukauta",
+    "Custom Footer": "Mukautettu alatunniste",
+    "Custom CSS": "Mukautettu CSS",
+    "deleteStatusPageMsg": "Haluatko varmasti poistaa tämän tilasivun?",
+    "Proxies": "Välityspalvelimet",
+    "default": "Oletus",
+    "enabled": "Käytössä",
+    "setAsDefault": "Oletusasetuksena",
+    "deleteProxyMsg": "Haluatko varmasti poistaa tämän välityspalvelimen kaikista seuraimista?",
+    "proxyDescription": "Välityspalvelimet on määritettävä seuraimelle toimiakseen.",
+    "enableProxyDescription": "Tämä välityspalvelin ei vaikuta valvontapyyntöihin ennen kuin se on aktivoitu. Voit hallita välityspalvelimen väliaikaista poistamista käytöstä kaikista seuraimista aktivointitilan perusteella.",
+    "setAsDefaultProxyDescription": "Tämä välityspalvelin on oletuksena käytössä uusissa seuraimissa. Voit silti poistaa välityspalvelimen käytöstä erikseen jokaisesta seuraimesta.",
+    "Certificate Chain": "Sertifikaattiketju",
+    "Valid": "Voimassa oleva",
+    "Invalid": "Pätemätön",
+    "User": "Käyttäjä",
+    "Installed": "Asennettu",
+    "Not installed": "Ei asennettu",
+    "Running": "Käynnissä",
+    "Not running": "Ei käynnissä",
+    "Remove Token": "Poista token",
+    "Start": "Käynnistä",
+    "Stop": "Pysäytä",
+    "Add New Status Page": "Lisää uusi tilasivu",
+    "Slug": "Slug",
+    "startOrEndWithOnly": "Aloita tai lopeta vain {0}",
+    "No consecutive dashes": "Ei peräkkäisiä viivoja",
+    "Next": "Seuraava",
+    "No Proxy": "Ei välityspalvelinta",
+    "Authentication": "Todennus",
+    "HTTP Basic Auth": "HTTP-perustodennus",
+    "Page Not Found": "Sivua ei löydetty",
+    "Reverse Proxy": "Käänteinen välityspalvelin",
+    "Backup": "Varmuuskopio",
+    "About": "Tietoja",
+    "cloudflareWebsite": "Cloudflare verkkosivusto",
+    "Message:": "Viesti:",
+    "Don't know how to get the token? Please read the guide:": "Etkö tiedä kuinka saada tunnus? Ole hyvä ja lue opas:",
+    "HTTP Headers": "HTTP-otsikot",
+    "Trust Proxy": "Luota välityspalvelimeen",
+    "Other Software": "Muut ohjelmistot",
+    "For example: nginx, Apache and Traefik.": "Esimerkiksi: nginx, Apache ja Traefik.",
+    "Please read": "Ole hyvä ja lue",
+    "Subject:": "Aihe:",
+    "Valid To:": "Voimassa:",
+    "Days Remaining:": "Päiviä jäljellä:",
+    "Issuer:": "Myöntäjä:",
+    "Fingerprint:": "Sormenjälki:",
+    "No status pages": "Ei tilasivuja",
+    "Domain Name Expiry Notification": "Verkkotunnuksen vanhenemisilmoitus",
+    "Proxy": "Välityspalvelin",
+    "Date Created": "Luomis päivämäärä",
+    "Footer Text": "Alatunnisteen teksti",
+    "Show Powered By": "Näytä \"voimanlähteenä\"",
+    "Domain Names": "Verkkotunnus nimet",
+    "signedInDisp": "Kirjautunut sisään käyttäjänä {0}",
+    "signedInDispDisabled": "Todennus poistettu käytöstä.",
+    "RadiusSecretDescription": "Asiakkaan ja palvelimen välinen yhteinen salaisuus",
+    "RadiusCalledStationIdDescription": "Kutsutun laitteen tunniste",
+    "RadiusCallingStationId": "Kutsuaseman tunnus",
+    "Certificate Expiry Notification": "Varmenteen vanhenemisilmoitus",
+    "API Username": "API-käyttäjänimi",
+    "API Key": "API-avain",
+    "Show update if available": "Näytä päivitys, jos saatavilla",
+    "Also check beta release": "Tarkista myös betaversio",
+    "Using a Reverse Proxy?": "Käytätkö käänteistä välityspalvelinta?",
+    "The slug is already taken. Please choose another slug.": "Slug on jo otettu. Ole hyvä ja valitse toinen slug.",
+    "RadiusSecret": "Radius Secret",
+    "RadiusCalledStationId": "Kutsuttu aseman tunnus",
+    "Steam Game Server": "Steam pelipalvelin",
+    "Most likely causes:": "todennäköisimmät syyt:",
+    "The resource is no longer available.": "Resurssi ei ole enää saatavilla.",
+    "There might be a typing error in the address.": "Osoitteessa saattaa olla kirjoitusvirhe.",
+    "What you can try:": "Mitä voit kokeilla:",
+    "Retype the address.": "Kirjoita osoite uudelleen.",
+    "Go back to the previous page.": "Palaa edelliselle sivulle.",
+    "Coming Soon": "Tulossa pian",
+    "Connection String": "Yhteysmerkkijono",
+    "Query": "Tiedustelu",
+    "settingsCertificateExpiry": "TLS-sertifikaatin vanheneminen",
+    "certificationExpiryDescription": "HTTPS-seuraimet käynnistävät ilmoituksen, kun TLS-varmenne vanhenee:",
+    "Setup Docker Host": "Asenna Docker-isäntä",
+    "Connection Type": "Yhteystyyppi",
+    "tcp": "TCP / HTTP",
+    "Docker Container": "Docker-kontti",
+    "Container Name / ID": "Säilön nimi/tunnus",
+    "Docker Host": "Docker-isäntä",
+    "Docker Hosts": "Docker-isännät",
+    "Domain": "Verkkotunnus",
+    "Workstation": "Työasema",
+    "socket": "kanta",
+    "Packet Size": "Paketin koko",
+    "telegram": "Telegram",
+    "ZohoCliq": "ZohoCliq",
+    "Bot Token": "Botti tokeni",
+    "wayToGetTelegramToken": "Voit saada tunnuksen osoitteesta {0}.",
+    "Chat ID": "Chat-tunnus",
+    "wayToGetTelegramChatID": "Saat chat-tunnuksesi lähettämällä viestin botille ja siirtymällä tähän URL-osoitteeseen nähdäksesi chat_id:",
+    "YOUR BOT TOKEN HERE": "BOT TOKENISI TÄHÄN",
+    "chatIDNotFound": "Chat ID:tä ei löydy; lähetä ensin viesti tälle botille",
+    "disableCloudflaredNoAuthMsg": "Olet No Auth -tilassa, salasanaa ei tarvita.",
+    "trustProxyDescription": "Luota \"X-Forwarded-*\"-otsikoihin. Jos haluat saada oikean asiakas-IP:n ja Uptime Kumasi on välityspalvelimen, kuten Nginx tai Apache, takana, sinun tulee ottaa tämä käyttöön.",
+    "wayToGetLineNotifyToken": "Voit saada käyttötunnuksen osoitteesta {0}",
+    "Examples": "Esimerkkejä",
+    "Home Assistant URL": "Home Assistantin URL-osoite",
+    "Long-Lived Access Token": "Pitkäikäinen pääsytunnus",
+    "Long-Lived Access Token can be created by clicking on your profile name (bottom left) and scrolling to the bottom then click Create Token. ": "Pitkäikäinen pääsytunnus voidaan luoda napsauttamalla profiilisi nimeä (vasemmalla alareunassa) ja vierittämällä alas ja napsauttamalla sitten Luo tunnus. ",
+    "Notification Service": "Ilmoituspalvelu",
+    "default: notify all devices": "oletus: Ilmoita kaikille laitteille",
+    "A list of Notification Services can be found in Home Assistant under \"Developer Tools > Services\" search for \"notification\" to find your device/phone name.": "Luettelo ilmoituspalveluista löytyy Home Assistantin kohdasta \"Kehittäjätyökalut > Palvelut\". Hae hakusanalla \"ilmoitus\" löytääksesi laitteesi/puhelimesi nimen.",
+    "Automations can optionally be triggered in Home Assistant:": "Automaatiot voidaan vaihtoehtoisesti laukaista Home Assistantissa:",
+    "Trigger type:": "Triggerin tyyppi:",
+    "Event type:": "Tapahtumatyyppi:",
+    "Frontend Version": "Käyttöliittymän versio",
+    "Frontend Version do not match backend version!": "Käyttöliittymän versio ei vastaa taustaversiota!",
+    "backupRecommend": "Varmuuskopioi asema tai tietokansio (./data/) suoraan sen sijaan.",
+    "Optional": "Vapaaehtoinen",
+    "squadcast": "Squadcast",
+    "or": "tai",
+    "recurringInterval": "Aikaväli",
+    "Recurring": "Toistuva",
+    "strategyManual": "Aktiivinen/ei-aktiivinen manuaalisesti",
+    "warningTimezone": "Se käyttää palvelimen aikavyöhykettä",
+    "weekdayShortMon": "Ma",
+    "weekdayShortTue": "Ti",
+    "weekdayShortWed": "Ke",
+    "weekdayShortThu": "To",
+    "weekdayShortFri": "Pe",
+    "weekdayShortSat": "La",
+    "weekdayShortSun": "Su",
+    "dayOfWeek": "Viikonpäivä",
+    "dayOfMonth": "Kuukauden päivä",
+    "lastDay": "Viimeinen päivä",
+    "lastDay1": "Kuukauden viimeinen päivä",
+    "lastDay2": "Kuukauden toiseksi viimeinen päivä",
+    "lastDay3": "Kuukauden 3. viimeinen päivä",
+    "No Maintenance": "Ei huoltoa",
+    "pauseMaintenanceMsg": "Haluatko varmasti keskeyttää?",
+    "maintenanceStatus-under-maintenance": "Huollossa",
+    "maintenanceStatus-inactive": "Epäaktiivinen",
+    "maintenanceStatus-scheduled": "Aikataulutettu",
+    "maintenanceStatus-ended": "Päättyi",
+    "maintenanceStatus-unknown": "Tuntematon",
+    "Display Timezone": "Näytä aikavyöhyke",
+    "Server Timezone": "Palvelimen aikavyöhyke",
+    "statusPageMaintenanceEndDate": "Loppu",
+    "Enable": "Ota käyttöön",
+    "Disable": "Poista käytöstä",
+    "Single Maintenance Window": "Yksi huoltoikkuna",
+    "Maintenance Time Window of a Day": "Päivän huoltoaikaikkuna",
+    "Effective Date Range": "Voimassa oleva ajanjakso",
+    "Schedule Maintenance": "Ajoita huolto",
+    "Date and Time": "Päivämäärä ja aika",
+    "DateTime Range": "Päivämäärä-aika-alue",
+    "loadingError": "Tietoja ei voi noutaa, yritä myöhemmin uudelleen.",
+    "plugin": "Lisäosa | Lisäosat",
+    "install": "Asenna",
+    "installing": "Asennetaan",
+    "uninstall": "Poista asennus",
+    "uninstalling": "Poistetaan asennusta",
+    "smtp": "Sähköposti (SMTP)",
+    "secureOptionNone": "Ei mitään / STARTTLS (25 587)",
+    "secureOptionTLS": "TLS (465)",
+    "Ignore TLS Error": "Ohita TLS-virhe",
+    "From Email": "Sähköpostista",
+    "emailCustomSubject": "Mukautettu aihe",
+    "To Email": "Sähköpostiin",
+    "smtpCC": "CC",
+    "smtpBCC": "BCC",
+    "Discord Webhook URL": "Discord Webhookin URL-osoite",
+    "Bot Display Name": "Botin näyttönimi",
+    "Prefix Custom Message": "Mukautetun viestin etuliite",
+    "Hello @everyone is...": "Hei {'@'}kaikki ovat…",
+    "wayToGetTeamsURL": "Voit oppia luomaan webhookin URL-osoitteen {0}.",
+    "wayToGetZohoCliqURL": "Voit oppia luomaan webhookin URL-osoitteen {0}.",
+    "wayToCheckSignalURL": "Voit tarkistaa tämän URL-osoitteen nähdäksesi, kuinka se määritetään:",
+    "Number": "Numero",
+    "Recipients": "Vastaanottajat",
+    "Access Token": "Käyttöoikeustunnus",
+    "Channel access token": "Kanavan käyttöoikeustunnus",
+    "Basic Settings": "Perus asetukset",
+    "User ID": "käyttäjätunnus",
+    "Messaging API": "Viestintä API",
+    "Line Developers Console": "Line Developers Console",
+    "lineDevConsoleTo": "Line Developers Console - {0}",
+    "dataRetentionTimeError": "Säilytysajan on oltava 0 tai suurempi",
+    "infiniteRetention": "Aseta arvoon 0, jos haluat loputtoman säilytyksen.",
+    "confirmDeleteTagMsg": "Haluatko varmasti poistaa tämän tunnisteen? Tähän tunnisteeseen liittyviä näyttöjä ei poisteta.",
+    "enableGRPCTls": "Salli lähettää gRPC-pyyntö TLS-yhteydellä",
+    "grpcMethodDescription": "Menetelmän nimi muunnetaan cammelCase-muotoon, kuten sayHello, check jne.",
+    "acceptedStatusCodesDescription": "Valitse tilakoodit, jotka katsotaan onnistuneeksi vastaukseksi.",
+    "deleteMonitorMsg": "Haluatko varmasti poistaa tämän seuraimen?",
+    "deleteMaintenanceMsg": "Haluatko varmasti poistaa tämän huollon?",
+    "deleteNotificationMsg": "Haluatko varmasti poistaa tämän ilmoituksen kaikista seuraimista?",
+    "dnsPortDescription": "DNS-palvelimen portti. Oletusarvo on 53. Voit vaihtaa porttia milloin tahansa.",
+    "rrtypeDescription": "Valitse valvottava RR-tyyppi",
+    "pauseMonitorMsg": "Haluatko varmasti keskeyttää?",
+    "clearHeartbeatsMsg": "Haluatko varmasti poistaa kaikki tämän seuraimen sydämenlyönnit?",
+    "confirmImportMsg": "Haluatko varmasti tuoda varmuuskopion? Varmista, että olet valinnut oikean tuontivaihtoehdon.",
+    "twoFAVerifyLabel": "Anna tunnuksesi vahvistaaksesi 2FA:",
+    "tokenValidSettingsMsg": "Token on voimassa! Voit nyt tallentaa 2FA-asetukset.",
+    "confirmEnableTwoFAMsg": "Haluatko varmasti ottaa 2FA:n käyttöön?",
+    "confirmDisableTwoFAMsg": "Haluatko varmasti poistaa 2FA:n käytöstä?",
+    "recurringIntervalMessage": "Juokse kerran päivässä | Suorita kerran {0} päivässä",
+    "affectedMonitorsDescription": "Valitse seuraimet, joihin nykyinen huolto vaikuttaa",
+    "affectedStatusPages": "Näytä tämä huoltoviesti valituilla tilasivuilla",
+    "atLeastOneMonitor": "Valitse vähintään yksi seurain, johon vaikuttaa",
+    "notificationDescription": "Ilmoitukset on määritettävä seuraimelle toimiakseen.",
+    "keywordDescription": "Hae avainsanaa tavallisessa HTML- tai JSON-vastauksessa. Haussa kirjainkoolla on merkitystä.",
+    "backupDescription": "Voit varmuuskopioida kaikki näytöt ja ilmoitukset JSON-tiedostoon.",
+    "backupDescription2": "Huomaa: historia- ja tapahtumatiedot eivät sisälly.",
+    "octopushLogin": "\"Kirjaudu\" ohjauspaneelin HTTP API -tunnistetiedoista",
+    "promosmsLogin": "API-kirjautumisnimi",
+    "promosmsPassword": "API-salasana",
+    "pushoversounds pushover": "Työnnä yli (oletus)",
+    "pushoversounds bike": "Pyörä",
+    "pushoversounds bugle": "Merkkitorvi",
+    "pushoversounds cashregister": "Kassakone",
+    "pushoversounds classical": "Klassinen",
+    "pushoversounds cosmic": "Kosminen",
+    "pushoversounds falling": "Putoaminen",
+    "pushoversounds gamelan": "Gamelan",
+    "pushoversounds incoming": "Saapuva",
+    "pushoversounds intermission": "Väliaika",
+    "pushoversounds magic": "Taika",
+    "pushoversounds mechanical": "Mekaaninen",
+    "pushoversounds pianobar": "Piano Baari",
+    "pushoversounds spacealarm": "Avaruushälytys",
+    "pushoversounds tugboat": "Hinaaja",
+    "pushoversounds alien": "Avaruusolio hälytys (pitkä)",
+    "pushoversounds climb": "Kiipeily (pitkä)",
+    "pushoversounds persistent": "Pysyvä (pitkä)",
+    "pushoversounds updown": "Ylös Alas (pitkä)",
+    "pushoversounds vibrate": "Vain värinä",
+    "pushoversounds none": "Ei mitään (hiljainen)",
+    "pushyAPIKey": "Salainen API-avain",
+    "pushyToken": "Laitteen tunnus",
+    "discord": "Discord",
+    "teams": "Microsoft Teams",
+    "signal": "Signal",
+    "gotify": "Gotify",
+    "slack": "Slack",
+    "rocket.chat": "Rocket.Chat",
+    "pushy": "Päällekäyvä",
+    "PushByTechulus": "Techuluksen työntö",
+    "octopush": "Mustekala",
+    "promosms": "PromoSMS",
+    "clicksendsms": "ClickSend SMS",
+    "lunasea": "LunaSea",
+    "GoogleChat": "Google Chat (vain Google Workspace)",
+    "Kook": "Kook",
+    "wayToGetKookGuildID": "Ota 'Kehittäjätila' käyttöön Kook-asetuksissa ja napsauta kiltaa hiiren kakkospainikkeella saadaksesi sen tunnuksen",
+    "Guild ID": "Killan tunnus",
+    "line": "Line Messenger",
+    "mattermost": "Mattermost",
+    "User Key": "Käyttäjäavain",
+    "Device": "Laite",
+    "Message Title": "Viestin otsikko",
+    "More info on:": "Lisätietoja: {0}",
+    "pushoverDesc2": "Jos haluat lähettää ilmoituksia eri laitteille, täytä Laite-kenttä.",
+    "SMS Type": "SMS-tyyppi",
+    "octopushTypePremium": "Premium (nopea - suositellaan hälytykseen)",
+    "octopushTypeLowCost": "Alhaiset kustannukset (hidas - joskus operaattori estää)",
+    "checkPrice": "Tarkista kohteen {0} hinnat:",
+    "apiCredentials": "API-tunnistetiedot",
+    "Check octopush prices": "Tarkista octopush hinnat {0}.",
+    "octopushPhoneNumber": "Puhelinnumero (Intl-muoto, esim.: +33612345678) ",
+    "octopushSMSSender": "Tekstiviestin lähettäjän nimi: 3-11 aakkosnumeerista merkkiä ja välilyönti (a-zA-Z0-9)",
+    "LunaSea Device ID": "LunaSea laitetunnus",
+    "Apprise URL": "Apprise URL-osoite",
+    "Example:": "Esimerkki: {0}",
+    "Read more:": "Lue lisää: {0}",
+    "Status:": "Tila: {0}",
+    "Strategy": "strategia",
+    "Free Mobile User Identifier": "Ilmainen mobiilikäyttäjätunnus",
+    "Enable TLS": "Ota TLS käyttöön",
+    "Proto Service Name": "Proto-palvelun nimi",
+    "Proto Method": "Proto-menetelmä",
+    "Proto Content": "Proto-sisältö",
+    "Economy": "Talous",
+    "Lowcost": "Halpa",
+    "high": "korkea",
+    "SendKey": "LähetäAvain",
+    "SMSManager API Docs": "SMSManager API Dokumentointi ",
+    "Gateway Type": "Yhdyskäytävän tyyppi",
+    "SMSManager": "SMSManager",
+    "Base URL": "Perus-URL-osoite",
+    "goAlertIntegrationKeyInfo": "Hanki yleinen API-integrointiavain palvelulle tässä muodossa \"aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee\" yleensä kopioidun URL-osoitteen tunnusparametrin arvona.",
+    "goAlert": "GoAlert",
+    "AccessKeyId": "Pääsyn avaimen tunnus",
+    "SecretAccessKey": "Pääsyn avaimen salaisuus",
+    "PhoneNumbers": "PuhelinNumerot",
+    "TemplateCode": "Mallikoodi",
+    "SignName": "AllekirjoitusNimi",
+    "Sms template must contain parameters: ": "Tekstiviestimallin tulee sisältää parametrit: ",
+    "Bark Group": "Bark ryhmä",
+    "Bark Sound": "Bark ääni",
+    "WebHookUrl": "WebHookUrl-osoite",
+    "SecretKey": "Salainen avain",
+    "For safety, must use secret key": "Turvallisuuden vuoksi on käytettävä salaista avainta",
+    "Device Token": "Laitteen tunnus",
+    "Platform": "Alusta",
+    "iOS": "iOS",
+    "Bark Endpoint": "Bark päätepiste",
+    "Huawei": "Huawei",
+    "High": "Korkea",
+    "Topic": "Aihe",
+    "WeCom Bot Key": "WeCom-bottiavain",
+    "Setup Proxy": "Asenna välityspalvelin",
+    "Proxy Protocol": "Välityspalvelinprotokolla",
+    "Proxy Server": "Välityspalvelin",
+    "matrix": "Matriisi",
+    "promosmsTypeFlash": "SMS FLASH - Viesti näkyy automaattisesti vastaanottajan laitteessa. Rajoitettu vain puolalaisille vastaanottajille.",
+    "promosmsTypeSpeed": "SMS SPEED - Järjestelmän korkein prioriteetti. Erittäin nopea ja luotettava, mutta kallis (noin kaksi kertaa SMS TÄYSI hinta).",
+    "promosmsPhoneNumber": "Puhelinnumero (puolalaiselle vastaanottajalle voit ohittaa suuntanumerot)",
+    "promosmsSMSSender": "Tekstiviestin lähettäjän nimi: Esirekisteröity nimi tai jokin oletusasetuksista: InfoSMS, SMS Info, MaxSMS, INFO, SMS",
+    "promosmsAllowLongSMS": "Salli pitkät tekstiviestit",
+    "Feishu WebHookUrl": "Feishu WebHookURL-osoite",
+    "Internal Room Id": "Huoneen sisäinen tunnus",
+    "Android": "Android",
+    "Channel Name": "Kanavan nimi",
+    "Uptime Kuma URL": "Uptime Kuma URL-osoite",
+    "Icon Emoji": "Ikoni Emoji",
+    "signalImportant": "TÄRKEÄÄ: Et voi sekoittaa ryhmiä ja numeroita vastaanottajissa!",
+    "aboutWebhooks": "Lisätietoja Webhooksista osoitteessa: {0}",
+    "aboutChannelName": "Kirjoita kanavan nimi {0} Kanavan nimi -kenttään, jos haluat ohittaa Webhook-kanavan. Esimerkki: #muu-kanava",
+    "aboutKumaURL": "Jos jätät Uptime Kuma URL -kentän tyhjäksi, se on oletuksena Project GitHub -sivu.",
+    "smtpDkimSettings": "DKIM-asetukset",
+    "smtpDkimDesc": "Katso Nodemailer DKIM {0} -sovelluksen käytöstä.",
+    "documentation": "dokumentointi",
+    "smtpDkimDomain": "Verkkotunnus nimi",
+    "smtpDkimKeySelector": "Näppäinvalitsin",
+    "smtpDkimPrivateKey": "Yksityinen avain",
+    "smtpDkimHashAlgo": "Hash-algoritmi (valinnainen)",
+    "smtpDkimheaderFieldNames": "Allekirjoitettavat otsikkoavaimet (valinnainen)",
+    "smtpDkimskipFields": "Otsikkonäppäimet, joita ei allekirjoiteta (valinnainen)",
+    "Integration Key": "Integrointiavain",
+    "Integration URL": "Integroinnin URL-osoite",
+    "Auto resolve or acknowledged": "Automaattinen ratkaisu tai kuittaus",
+    "do nothing": "Älä tee mitään",
+    "auto acknowledged": "automaattisesti kuitattu",
+    "auto resolve": "automaattinen ratkaisu",
+    "gorush": "Gorush",
+    "alerta": "Alerta",
+    "alertaApiEndpoint": "API-päätepiste",
+    "alertaEnvironment": "Ympäristö",
+    "alertaApiKey": "API-avain",
+    "alertaRecoverState": "Palautustila",
+    "serwersms": "SerwerSMS.pl",
+    "serwersmsAPIUser": "API-käyttäjänimi (sis. webapi_-etuliite)",
+    "serwersmsAPIPassword": "API-salasana",
+    "serwersmsPhoneNumber": "Puhelinnumero",
+    "smseagle": "SMSEagle",
+    "smseagleTo": "Puhelinnumero(t)",
+    "smseagleGroup": "Puhelinmuistioryhmän nimi/nimet",
+    "smseagleContact": "Puhelinmuistion yhteyshenkilön nimet",
+    "smseagleRecipientType": "Vastaanottajan tyyppi",
+    "smseagleRecipient": "Vastaanottaja(t) (jos useita, ne on erotettava pilkulla)",
+    "smseagleToken": "API-käyttöoikeustunnus",
+    "smseagleUrl": "SMSEagle-laitteesi URL-osoite",
+    "smseagleEncoding": "Lähetä Unicodena",
+    "smseaglePriority": "Viestin prioriteetti (0-9, oletus = 0)",
+    "stackfield": "Stackfield",
+    "Recipient Number": "Vastaanottajan numero",
+    "From Name/Number": "Nimestä/numerosta",
+    "Leave blank to use a shared sender number.": "Jätä tyhjäksi, jos haluat käyttää jaettua lähettäjän numeroa.",
+    "Octopush API Version": "Octopush API -versio",
+    "Legacy Octopush-DM": "Legacy Octopush-DM",
+    "ntfy Topic": "ntfy aihe",
+    "HomeAssistant": "Home Assistant",
+    "onebotHttpAddress": "OneBot HTTP-osoite",
+    "onebotGroupMessage": "Ryhmä",
+    "onebotPrivateMessage": "Yksityinen",
+    "onebotUserOrGroupId": "Ryhmä/käyttäjätunnus",
+    "onebotSafetyTips": "Käyttöoikeustunnus on asetettava turvallisuuden vuoksi",
+    "PushDeer Key": "PushDeer avain",
+    "wayToGetClickSendSMSToken": "Voit saada API-käyttäjänimen ja API-avaimen osoitteesta {0}.",
+    "Custom Monitor Type": "Mukautettu seurain tyyppi",
+    "Google Analytics ID": "Google Analytics -tunnus",
+    "Edit Tag": "Muokkaa tunnistetta",
+    "Server Address": "Palvelimen osoite",
+    "Learn More": "Lisätietoja",
+    "Inactive": "Epäaktiivinen",
+    "Add New below or Select...": "Lisää uusi alapuolella tai valitse…",
+    "Blue": "Sininen",
+    "Avg. Response": "Kesk.arv. vastaus",
+    "All Systems Operational": "Kaikki järjestelmät toiminnassa",
+    "defaultNotificationName": "Minun {ilmoitus} Hälytys ({numero})",
+    "webhookFormDataDesc": "{multipart} on hyvä PHP:lle. JSON pitää parsia {decodeFunction} avulla",
+    "HeadersInvalidFormat": "Pyynnön otsikot eivät ole kelvollisia JSON-tiedostoja: ",
+    "clearDataOlderThan": "Säilytä seuraimen historiatiedot {0} päivää.",
+    "steamApiKeyDescription": "Steam peli palveliment valvontaa varten tarvitset Steam Web-API -avaimen. Voit rekisteröidä API-avaimesi täällä: ",
+    "light": "Vaalea",
+    "Switch to Light Theme": "Vaihda vaaleaan teemaan",
+    "Powered by": "Voimanlähteenä",
+    "shrinkDatabaseDescription": "Käynnistä tietokanta VACUUM SQLitelle. Jos tietokanta on luotu 1.10.0:n jälkeen, AUTO_VACUUM on jo käytössä eikä tätä toimintoa tarvita.",
+    "Accept characters:": "Hyväksy merkit:",
+    "New Status Page": "Uusi tilasivu",
+    "wayToGetCloudflaredURL": "(Lataa cloudflared osoitteesta {0})",
+    "The current connection may be lost if you are currently connecting via Cloudflare Tunnel. Are you sure want to stop it? Type your current password to confirm it.": "Nykyinen yhteys saattaa katketa, jos muodostat parhaillaan yhteyttä Cloudflare-tunnelin kautta. Haluatko varmasti lopettaa sen? Vahvista se kirjoittamalla nykyinen salasanasi.",
+    "RadiusCallingStationIdDescription": "Kutsu laitteen tunniste",
+    "Check how to config it for WebSocket": "Tarkista, kuinka se määritetään WebSocketille",
+    "Docker Daemon": "Docker taustatoiminta",
+    "deleteDockerHostMsg": "Haluatko varmasti poistaa tämän docker-isännän kaikista seuraimista?",
+    "supportTelegramChatID": "Tukee suoraa chattia / ryhmää / kanavan chat-tunnusta",
+    "Event data:": "Tapahtumatyyppi:",
+    "Then choose an action, for example switch the scene to where an RGB light is red.": "Valitse sitten toiminto, esimerkiksi vaihda kohtaus sellaiseen, jossa RGB-valo on punainen.",
+    "backupOutdatedWarning": "Vanhentunut: Koska monia ominaisuuksia lisättiin ja tätä varmuuskopiointitoimintoa ei ole ylläpidetty, se ei voi luoda tai palauttaa täydellistä varmuuskopiota.",
+    "lastDay4": "Kuukauden 4. viimeinen päivä",
+    "IconUrl": "Kuvakkeen URL-osoite",
+    "Enable DNS Cache": "Ota DNS-välimuisti käyttöön",
+    "dnsCacheDescription": "Se ei ehkä toimi joissakin IPv6-ympäristöissä, poista se käytöstä, jos kohtaat ongelmia.",
+    "confirmUninstallPlugin": "Haluatko varmasti poistaa tämän laajennuksen?",
+    "wayToGetDiscordURL": "Saat tämän siirtymällä kohtaan Palvelinasetukset -> Integraatiot -> Näytä Webhookit -> Uusi Webhook",
+    "needSignalAPI": "Sinulla on oltava signaaliasiakas, jossa on REST API.",
+    "wayToGetLineChannelToken": "Avaa ensin {0}, luo palveluntarjoaja ja kanava (Viestintä API), sitten saat kanavan käyttö tokenin ja käyttäjätunnuksen yllä mainituista valikon kohdista.",
+    "Icon URL": "Kuvakkeen URL-osoite",
+    "aboutIconURL": "Voit ohittaa oletusprofiilikuvan antamalla linkin kuvaan kohdassa \"kuvakeen URL\". Ei käytetä, jos kuvake emoji on asetettu.",
+    "aboutMattermostChannelName": "Voit ohittaa oletuskanavan, jolle Webhook lähettää viestejä, kirjoittamalla kanavan nimen Kanavan nimi -kenttään. Tämä on otettava käyttöön Mattermost Webhook -asetuksissa. Esimerkki: #muu-kanava",
+    "resolverserverDescription": "Cloudflare on oletuspalvelin. Voit vaihtaa ratkaisijapalvelinta milloin tahansa.",
+    "enableDefaultNotificationDescription": "Tämä ilmoitus on oletuksena käytössä uusissa seuraimissa. Voit silti poistaa ilmoituksen käytöstä erikseen jokaiselta seuraimelta.",
+    "clearEventsMsg": "Haluatko varmasti poistaa kaikki tämän seuraimen tapahtumat?",
+    "confirmClearStatisticsMsg": "Haluatko varmasti poistaa KAIKKI tilastot?",
+    "importHandleDescription": "Valitse \"Ohita olemassa oleva\", jos haluat ohittaa jokaisen samannimisen seuraimen tai ilmoituksen. \"Korvaa\" poistaa kaikki olemassa olevat seuraimet ja ilmoitukset.",
+    "passwordNotMatchMsg": "Toistettu salasana ei täsmää.",
+    "backupDescription3": "Arkaluonteiset tiedot, kuten ilmoitustunnukset, sisältyvät vientitiedostoon. säilytä vienti turvallisesti.",
+    "endpoint": "päätepiste",
+    "octopushAPIKey": "\"API-avain\" ohjauspaneelin HTTP API -tunnistetiedoista",
+    "pushoversounds siren": "Sireeni",
+    "pushoversounds echo": "Ylityöntö kaiku (pitkä)",
+    "pushover": "Ylityöntö",
+    "apprise": "Apprise (tukee yli 50 ilmoituspalvelua)",
+    "pushbullet": "Pushbullet",
+    "wayToGetKookBotToken": "Luo sovellus ja hanki bot-tunnus osoitteessa {0}",
+    "Notification Sound": "Ilmoitusääni",
+    "pushoverDesc1": "Hätäprioriteetilla (2) on oletusarvoisesti 30 sekunnin aikakatkaisu uudelleenyritysten välillä, ja se vanhenee 1 tunnin kuluttua.",
+    "octopushLegacyHint": "Käytätkö Octopushin (2011-2020) vanhaa versiota vai uutta versiota?",
+    "Free Mobile API Key": "Ilmainen mobiilisovellusliittymäavain",
+    "You can divide numbers with": "Voit jakaa numerot",
+    "goAlertInfo": "GoAlert on avoimen lähdekoodin sovellus päivystykseen, automatisoituihin eskalaatioihin ja ilmoituksiin (kuten tekstiviestit tai äänipuhelut). Ota automaattisesti mukaan oikea henkilö, oikealla tavalla ja oikeaan aikaan! {0}",
+    "Retry": "Yritä uudelleen",
+    "Proxy server has authentication": "Välityspalvelimella on todennus",
+    "promosmsTypeEco": "SMS ECO - halpa mutta hidas ja usein ylikuormitettu. Rajoitettu vain puolalaisille vastaanottajille.",
+    "promosmsTypeFull": "SMS FULL - Premium-tason tekstiviestit, voit käyttää lähettäjän nimeäsi (sinun on rekisteröitävä nimi ensin). Luotettava hälytyksiä varten.",
+    "matrixHomeserverURL": "Kotipalvelimen URL-osoite (http(s):// ja valinnaisesti portti)",
+    "matrixDesc1": "Löydät sisäisen huonetunnuksen katsomalla Matrix-asiakasohjelman huoneasetusten lisäosaa. Sen pitäisi näyttää tältä: !QMdRCpUIfLwsfjxye6:home.server.",
+    "matrixDesc2": "On erittäin suositeltavaa, että luot uuden käyttäjän etkä käytä omaa Matrix-käyttäjätunnustasi, koska se antaa täyden pääsyn tilillesi ja kaikkiin huoneisiin, joihin liityit. Luo sen sijaan uusi käyttäjä ja kutsu se vain siihen huoneeseen, josta haluat saada ilmoituksen. Saat käyttöoikeustunnuksen suorittamalla {0}",
+    "wayToGetPagerDutyKey": "Saat tämän siirtymällä kohtaan Palvelu -> Palveluhakemisto -> (Valitse palvelu) -> Integraatiot -> Lisää integraatio. Täältä voit etsiä \"Events API V2\". Lisätietoja {0}",
+    "alertaAlertState": "Varoitustila",
+    "serwersmsSenderName": "Tekstiviestin lähettäjän nimi (rekisteröity asiakasportaalin kautta)",
+    "onebotMessageType": "OneBot-viestityyppi"
+}
diff --git a/src/lang/fr-FR.json b/src/lang/fr-FR.json
new file mode 100644
index 000000000..26d713452
--- /dev/null
+++ b/src/lang/fr-FR.json
@@ -0,0 +1,700 @@
+{
+    "languageName": "Français",
+    "checkEverySecond": "Vérifier toutes les {0} secondes",
+    "retryCheckEverySecond": "Réessayer toutes les {0} secondes",
+    "resendEveryXTimes": "Renvoyez toutes les {0} fois",
+    "resendDisabled": "Renvoi désactivé",
+    "retriesDescription": "Nombre d'essais avant que le service ne soit déclaré hors ligne et qu'une notification soit envoyée",
+    "ignoreTLSError": "Ignorer les erreurs liées au certificat SSL/TLS",
+    "upsideDownModeDescription": "Si le service est en ligne, il sera alors noté hors ligne et vice-versa.",
+    "maxRedirectDescription": "Nombre maximal de redirections avant que le service ne soit marqué comme hors ligne.",
+    "enableGRPCTls": "Autoriser l'envoi d'une requête gRPC avec une connexion TLS",
+    "grpcMethodDescription": "Le nom de la méthode est converti au format CamelCase tel que sayHello, check, etc.",
+    "acceptedStatusCodesDescription": "Codes HTTP qui considèrent le service comme étant disponible.",
+    "Maintenance": "Maintenance",
+    "statusMaintenance": "Maintenance",
+    "Schedule maintenance": "Planifier la maintenance",
+    "Affected Monitors": "Sondes concernées",
+    "Pick Affected Monitors...": "Sélectionner les sondes concernées…",
+    "Start of maintenance": "Début de la maintenance",
+    "All Status Pages": "Toutes les pages d'état",
+    "Select status pages...": "Sélectionner les pages d'état…",
+    "recurringIntervalMessage": "Exécuter une fois par jour | Exécuter une fois tous les {0} jours",
+    "affectedMonitorsDescription": "Sélectionnez les sondes concernées par la maintenance en cours",
+    "affectedStatusPages": "Afficher ce message de maintenance sur les pages d'état sélectionnées",
+    "atLeastOneMonitor": "Sélectionnez au moins une sonde concernée",
+    "passwordNotMatchMsg": "Les mots de passe ne correspondent pas.",
+    "notificationDescription": "Une fois ajoutée, vous devez l'activer manuellement dans les paramètres de vos hôtes.",
+    "keywordDescription": "Le mot clé sera recherché dans la réponse HTML/JSON reçue du site internet.",
+    "pauseDashboardHome": "En pause",
+    "deleteMonitorMsg": "Êtes-vous sûr de vouloir supprimer cette sonde ?",
+    "deleteMaintenanceMsg": "Voulez-vous vraiment supprimer cette maintenance ?",
+    "deleteNotificationMsg": "Êtes-vous sûr de vouloir supprimer ce type de notification pour toutes les sondes ?",
+    "dnsPortDescription": "Port du serveur DNS. La valeur par défaut est 53. Vous pouvez modifier le port à tout moment.",
+    "resolverserverDescription": "Le DNS de Cloudflare est utilisé par défaut, mais vous pouvez le changer si vous le souhaitez.",
+    "rrtypeDescription": "Veuillez sélectionner un type d'enregistrement DNS",
+    "pauseMonitorMsg": "Êtes-vous sûr de vouloir mettre en pause cette sonde ?",
+    "enableDefaultNotificationDescription": "Pour chaque nouvelle sonde, cette notification sera activée par défaut. Vous pouvez toujours désactiver la notification séparément pour chaque sonde.",
+    "clearEventsMsg": "Êtes-vous sûr de vouloir supprimer tous les événements pour cette sonde ?",
+    "clearHeartbeatsMsg": "Êtes-vous sûr de vouloir supprimer toutes les vérifications pour cette sonde ?",
+    "confirmClearStatisticsMsg": "Êtes-vous sûr de vouloir supprimer toutes les statistiques ?",
+    "importHandleDescription": "Choisissez « Ignorer l'existant » si vous voulez ignorer chaque sonde ou notification portant le même nom. L'option « Écraser » supprime toutes les sondes et notifications existantes.",
+    "confirmImportMsg": "Êtes-vous sûr de vouloir importer la sauvegarde ? Veuillez vous assurer que vous avez sélectionné la bonne option d'importation.",
+    "twoFAVerifyLabel": "Veuillez saisir votre jeton pour vérifier que le système 2FA fonctionne :",
+    "tokenValidSettingsMsg": "Le jeton est valide. Vous pouvez maintenant sauvegarder les paramètres de double authentification (2FA).",
+    "confirmEnableTwoFAMsg": "Êtes-vous sûr de vouloir activer la double authentification (2FA) ?",
+    "confirmDisableTwoFAMsg": "Êtes-vous sûr de vouloir désactiver la double authentification (2FA) ?",
+    "Settings": "Paramètres",
+    "Dashboard": "Tableau de bord",
+    "New Update": "Mise à jour disponible",
+    "Language": "Langue",
+    "Appearance": "Apparence",
+    "Theme": "Thème",
+    "General": "Général",
+    "Primary Base URL": "URL principale",
+    "Version": "Version",
+    "Check Update On GitHub": "Consulter les mises à jour sur GitHub",
+    "List": "Lister",
+    "Add": "Ajouter",
+    "Add New Monitor": "Ajouter une nouvelle sonde",
+    "Quick Stats": "Résumé",
+    "Up": "En ligne",
+    "Down": "Hors ligne",
+    "Pending": "En attente",
+    "Unknown": "Inconnu",
+    "Pause": "En pause",
+    "Name": "Nom",
+    "Status": "État",
+    "DateTime": "Heure",
+    "Message": "Messages",
+    "No important events": "Aucun évènement important",
+    "Resume": "Reprendre",
+    "Edit": "Modifier",
+    "Delete": "Supprimer",
+    "Current": "Actuellement",
+    "Uptime": "Disponibilité",
+    "Cert Exp.": "Expiration SSL.",
+    "day": "jour | jours",
+    "-day": "-jour",
+    "hour": "heure",
+    "-hour": "-heure",
+    "Response": "Temps de réponse",
+    "Ping": "Ping",
+    "Monitor Type": "Type de sonde",
+    "Keyword": "Mot-clé",
+    "Friendly Name": "Nom d'affichage",
+    "URL": "URL",
+    "Hostname": "Nom d'hôte / adresse IP",
+    "Port": "Port",
+    "Heartbeat Interval": "Intervalle de vérification",
+    "Retries": "Essais",
+    "Heartbeat Retry Interval": "Réessayer l'intervalle de vérification",
+    "Resend Notification if Down X times consecutively": "Renvoyer la notification si en panne X fois consécutivement",
+    "Advanced": "Avancé",
+    "Upside Down Mode": "Mode inversé",
+    "Max. Redirects": "Nombre maximum de redirections",
+    "Accepted Status Codes": "Codes HTTP acceptés",
+    "Push URL": "Push URL",
+    "needPushEvery": "Vous devez appeler cette URL toutes les {0} secondes.",
+    "pushOptionalParams": "Paramètres facultatifs : {0}",
+    "Save": "Sauvegarder",
+    "Notifications": "Notifications",
+    "Not available, please setup.": "Non disponible, merci de le configurer.",
+    "Setup Notification": "Créer une notification",
+    "Light": "Clair",
+    "Dark": "Sombre",
+    "Auto": "Automatique",
+    "Theme - Heartbeat Bar": "Thème - barres d'état",
+    "Normal": "Normal",
+    "Bottom": "En dessous",
+    "None": "Aucun",
+    "Timezone": "Fuseau horaire",
+    "Search Engine Visibility": "Visibilité par les moteurs de recherche",
+    "Allow indexing": "Autoriser l'indexation",
+    "Discourage search engines from indexing site": "Refuser l'indexation",
+    "Change Password": "Changer le mot de passe",
+    "Current Password": "Mot de passe actuel",
+    "New Password": "Nouveau mot de passe",
+    "Repeat New Password": "Répéter votre nouveau mot de passe",
+    "Update Password": "Mettre à jour le mot de passe",
+    "Disable Auth": "Désactiver l'authentification",
+    "Enable Auth": "Activer l'authentification",
+    "disableauth.message1": "Voulez-vous vraiment <strong>désactiver l'authentification</strong> ?",
+    "disableauth.message2": "Cette fonctionnalité est conçue pour les scénarios <strong>où vous avez l'intention d'implémenter une authentification tierce</strong> devant Uptime Kuma, comme Cloudflare Access, Authelia ou d'autres mécanismes d'authentification.",
+    "Please use this option carefully!": "Veuillez utiliser cette option avec précaution !",
+    "Logout": "Déconnexion",
+    "Leave": "Quitter",
+    "I understand, please disable": "Je comprends, désactivez-la",
+    "Confirm": "Confirmer",
+    "Yes": "Oui",
+    "No": "Non",
+    "Username": "Nom d'utilisateur",
+    "Password": "Mot de passe",
+    "Remember me": "Se souvenir de moi",
+    "Login": "Connexion",
+    "No Monitors, please": "Pas de sondes, veuillez",
+    "add one": "en ajouter une",
+    "Notification Type": "Type de notification",
+    "Email": "Courriel",
+    "Test": "Tester",
+    "Certificate Info": "Informations sur le certificat SSL",
+    "Resolver Server": "Serveur DNS utilisé",
+    "Resource Record Type": "Type d'enregistrement DNS recherché",
+    "Last Result": "Dernier résultat",
+    "Create your admin account": "Créer votre compte administrateur",
+    "Repeat Password": "Répéter le mot de passe",
+    "Import Backup": "Importation de la sauvegarde",
+    "Export Backup": "Exportation de la sauvegarde",
+    "Export": "Exporter",
+    "Import": "Importer",
+    "respTime": "Temps de réponse (ms)",
+    "notAvailableShort": "N/A",
+    "Default enabled": "Activé par défaut",
+    "Apply on all existing monitors": "Appliquer sur toutes les sondes existantes",
+    "Create": "Créer",
+    "Clear Data": "Effacer les données",
+    "Events": "Événements",
+    "Heartbeats": "Vérifications",
+    "Auto Get": "Récupérer automatiquement",
+    "backupDescription": "Vous pouvez sauvegarder toutes les sondes et toutes les notifications dans un fichier JSON.",
+    "backupDescription2": "PS : Les données relatives à l'historique et aux événements ne sont pas incluses.",
+    "backupDescription3": "Les données sensibles telles que les jetons de notification sont incluses dans le fichier d'exportation, veuillez les conserver soigneusement.",
+    "alertNoFile": "Veuillez sélectionner un fichier à importer.",
+    "alertWrongFileType": "Veuillez sélectionner un fichier JSON à importer.",
+    "Clear all statistics": "Effacer toutes les statistiques",
+    "Skip existing": "Sauter l'existant",
+    "Overwrite": "Écraser",
+    "Options": "Options",
+    "Keep both": "Garder les deux",
+    "Verify Token": "Vérifier le jeton",
+    "Setup 2FA": "Configurer la double authentification (2FA)",
+    "Enable 2FA": "Activer la double authentification (2FA)",
+    "Disable 2FA": "Désactiver la double authentification (2FA)",
+    "2FA Settings": "Paramètres de la double authentification (2FA)",
+    "Two Factor Authentication": "Double authentification",
+    "Active": "Actif",
+    "Inactive": "Inactif",
+    "Token": "Jeton",
+    "Show URI": "Afficher l'URI",
+    "Tags": "Étiquettes",
+    "Add New below or Select...": "Ajoutez-en un en dessous ou sélectionnez-le ici…",
+    "Tag with this name already exist.": "Une étiquette portant ce nom existe déjà.",
+    "Tag with this value already exist.": "Une étiquette avec cette valeur existe déjà.",
+    "color": "Couleur",
+    "value (optional)": "Valeur (facultatif)",
+    "Gray": "Gris",
+    "Red": "Rouge",
+    "Orange": "Orange",
+    "Green": "Vert",
+    "Blue": "Bleu",
+    "Indigo": "Indigo",
+    "Purple": "Violet",
+    "Pink": "Rose",
+    "Search...": "Rechercher…",
+    "Avg. Ping": "Ping moyen",
+    "Avg. Response": "Réponse moyenne",
+    "Entry Page": "Page d'accueil",
+    "statusPageNothing": "Rien ici, veuillez ajouter un groupe ou une sonde.",
+    "No Services": "Aucun service",
+    "All Systems Operational": "Tous les systèmes sont opérationnels",
+    "Partially Degraded Service": "Service partiellement dégradé",
+    "Degraded Service": "Service dégradé",
+    "Add Group": "Ajouter un groupe",
+    "Add a monitor": "Ajouter une sonde",
+    "Edit Status Page": "Modifier la page de statut",
+    "Go to Dashboard": "Accéder au tableau de bord",
+    "Status Page": "Page de statut",
+    "Status Pages": "Pages de statut",
+    "defaultNotificationName": "Ma notification {notification} numéro ({number})",
+    "here": "ici",
+    "Required": "Requis",
+    "telegram": "Telegram",
+    "ZohoCliq": "ZohoCliq",
+    "Bot Token": "Jeton du robot",
+    "wayToGetTelegramToken": "Vous pouvez obtenir un token depuis {0}.",
+    "Chat ID": "Chat ID",
+    "supportTelegramChatID": "Prend en charge les messages privés / messages de groupe / l'ID d'un salon",
+    "wayToGetTelegramChatID": "Vous pouvez obtenir le Chat ID en envoyant un message avec le robot puis en récupérant l'URL pour voir l'ID du salon :",
+    "YOUR BOT TOKEN HERE": "VOTRE JETON ROBOT ICI",
+    "chatIDNotFound": "ID du salon introuvable, envoyez un message via le robot avant",
+    "webhook": "Webhook",
+    "Post URL": "Post URL",
+    "Content Type": "Type de contenu",
+    "webhookJsonDesc": "{0} est bien pour tous les serveurs HTTP modernes comme Express.js",
+    "webhookFormDataDesc": "{multipart} est bien pour du PHP. Le JSON aura besoin d'être parsé avec {decodeFunction}",
+    "webhookAdditionalHeadersTitle": "En-têtes supplémentaires",
+    "webhookAdditionalHeadersDesc": "Définit des en-têtes supplémentaires envoyés avec le webhook.",
+    "smtp": "Courriel (SMTP)",
+    "secureOptionNone": "Aucun / STARTTLS (25, 587)",
+    "secureOptionTLS": "TLS (465)",
+    "Ignore TLS Error": "Ignorer les erreurs TLS",
+    "From Email": "Depuis l'adresse",
+    "emailCustomSubject": "Objet personnalisé",
+    "To Email": "Vers l'adresse",
+    "smtpCC": "CC",
+    "smtpBCC": "CCI",
+    "discord": "Discord",
+    "Discord Webhook URL": "URL vers le webhook Discord",
+    "wayToGetDiscordURL": "Vous pouvez l'obtenir en allant dans « Paramètres du serveur » -> « Intégrations » -> « Consulter les webhooks» -> « Nouveau Webhook »",
+    "Bot Display Name": "Nom du robot (affiché)",
+    "Prefix Custom Message": "Préfixe du message personnalisé",
+    "Hello @everyone is...": "Bonjour {'@'}everyone il…",
+    "teams": "Microsoft Teams",
+    "Webhook URL": "URL vers le webhook",
+    "wayToGetTeamsURL": "Vous pouvez apprendre comment créer une URL Webhook {0}.",
+    "wayToGetZohoCliqURL": "Vous pouvez apprendre comment créer une URL Webhook {0}.",
+    "signal": "Signal",
+    "Number": "Numéro",
+    "Recipients": "Destinataires",
+    "needSignalAPI": "Vous avez besoin d'un client Signal avec l'API REST.",
+    "wayToCheckSignalURL": "Vous pouvez regarder l'URL suivante pour savoir comment la mettre en place :",
+    "signalImportant": "IMPORTANT : Vous ne pouvez pas mixer les groupes et les numéros en destinataires !",
+    "gotify": "Gotify",
+    "Application Token": "Jeton d'application",
+    "Server URL": "URL du serveur",
+    "Priority": "Priorité",
+    "slack": "Slack",
+    "Icon Emoji": "Icon Emoji",
+    "Channel Name": "Nom du salon",
+    "Uptime Kuma URL": "URL vers Uptime Kuma",
+    "aboutWebhooks": "Plus d'informations sur les webhooks ici : {0}",
+    "aboutChannelName": "Mettez le nom du salon dans {0} dans « Nom du salon » si vous voulez contourner le salon webhook. Ex. : #autre-salon",
+    "aboutKumaURL": "Si vous laissez l'URL d'Uptime Kuma vierge, elle redirigera vers la page du projet GitHub.",
+    "emojiCheatSheet": "Aide sur les émojis : {0}",
+    "rocket.chat": "Rocket.chat",
+    "pushover": "Pushover",
+    "pushy": "Pushy",
+    "PushByTechulus": "Push par Techulus",
+    "octopush": "Octopush",
+    "promosms": "PromoSMS",
+    "clicksendsms": "ClickSend SMS",
+    "lunasea": "LunaSea",
+    "apprise": "Apprise (prend en charge plus de 50 services de notification)",
+    "GoogleChat": "Google Chat (Google Workspace uniquement)",
+    "pushbullet": "Pushbullet",
+    "Kook": "Kook",
+    "wayToGetKookBotToken": "Créez une application et récupérer le jeton de robot à l'addresse {0}",
+    "wayToGetKookGuildID": "Passez en « mode développeur » dans les paramètres de Kook, et cliquez droit sur le Guild pour obtenir son identifiant",
+    "Guild ID": "Identifiant de Guild",
+    "line": "Line Messenger",
+    "mattermost": "Mattermost",
+    "User Key": "Clé d'utilisateur",
+    "Device": "Appareil",
+    "Message Title": "Titre du message",
+    "Notification Sound": "Son de notification",
+    "More info on:": "Plus d'informations sur : {0}",
+    "pushoverDesc1": "Priorité d'urgence (2) a un délai par défaut de 30 secondes entre les tentatives et expire après une heure.",
+    "pushoverDesc2": "Si vous voulez envoyer des notifications sur différents appareils, remplissez le champ « Appareil ».",
+    "SMS Type": "Type de SMS",
+    "octopushTypePremium": "Premium (rapide - recommandé pour les alertes)",
+    "octopushTypeLowCost": "Économique (lent, bloqué de temps en temps par l'opérateur)",
+    "checkPrice": "Vérification {0} tarifs :",
+    "apiCredentials": "Identifiants de l'API",
+    "octopushLegacyHint": "Voulez-vous utiliser l'ancienne version d'Octopush (2011-2020) ou la nouvelle version ?",
+    "Check octopush prices": "Vérifier les prix d'Octopush {0}.",
+    "octopushPhoneNumber": "Numéro de téléphone (format international, ex. : +33612345678) ",
+    "octopushSMSSender": "Nom de l'expéditeur : 3-11 caractères alphanumériques avec espace (a-zA-Z0-9)",
+    "LunaSea Device ID": "Identifiant d'appareil LunaSea",
+    "Apprise URL": "URL d'Apprise",
+    "Example:": "Exemple : {0}",
+    "Read more:": "En savoir plus : {0}",
+    "Status:": "État : {0}",
+    "Read more": "En savoir plus",
+    "appriseInstalled": "Apprise est installé.",
+    "appriseNotInstalled": "Apprise n'est pas installé. {0}",
+    "Access Token": "Jeton d'accès",
+    "Channel access token": "Jeton d'accès au canal",
+    "Line Developers Console": "Console développeurs Line",
+    "lineDevConsoleTo": "Console développeurs Line - {0}",
+    "Basic Settings": "Paramètres de base",
+    "User ID": "Identifiant utilisateur",
+    "Messaging API": "Messaging API",
+    "wayToGetLineChannelToken": "Premièrement accédez à {0}, créez un <i>provider</i> et définissez un type de salon à «Messaging API». Vous obtiendrez alors le jeton d'accès du salon et l'identifiant utilisateur demandés.",
+    "Icon URL": "URL vers l'icône",
+    "aboutIconURL": "Vous pouvez mettre un lien vers une image dans « URL vers l'icône » pour remplacer l'image de profil par défaut. Elle ne sera utilisé que si « Icône émoji » n'est pas défini.",
+    "aboutMattermostChannelName": "Vous pouvez remplacer le salon par défaut que le webhook utilise en mettant le nom du salon dans le champ « Nom du salon ». Vous aurez besoin de l'activer depuis les paramètres de Mattermost. Ex. : #autre-salon",
+    "matrix": "Matrix",
+    "promosmsTypeEco": "SMS ECO - Bon marché mais lent et souvent surchargé. Limité uniquement aux destinataires polonais.",
+    "promosmsTypeFlash": "SMS FLASH - Le message sera automatiquement affiché sur l'appareil du destinataire. Limité uniquement aux destinataires Polonais.",
+    "promosmsTypeFull": "SMS FULL - Version premium des SMS. Vous pouvez mettre le nom de l'expéditeur (vous devez l'enregistrer au préalable). Fiable pour les alertes.",
+    "promosmsTypeSpeed": "SMS SPEED - Priorité élevée pour le système. Très rapide et fiable mais coûteux (environ le double du prix d'un SMS FULL).",
+    "promosmsPhoneNumber": "Numéro de téléphone (pour les destinataires polonais, vous pouvez ignorer l'indicatif international)",
+    "promosmsSMSSender": "Nom de l'expéditeur du SMS : Nom pré-enregistré ou l'un de base : InfoSMS, SMS Info, MaxSMS, INFO, SMS",
+    "Feishu WebHookUrl": "Feishu WebHookURL",
+    "matrixHomeserverURL": "L'URL du serveur (avec http(s):// et le port de manière facultative)",
+    "Internal Room Id": "ID de la salle interne",
+    "matrixDesc1": "Vous pouvez trouver l'ID de salle interne en regardant dans la section avancée des paramètres dans le client Matrix. C'est censé ressembler à !QMdRCpUIfLwsfjxye6:home.server.",
+    "matrixDesc2": "Il est fortement recommandé de créer un nouvel utilisateur et de ne pas utiliser le jeton d'accès de votre propre utilisateur Matrix, car il vous donnera un accès complet à votre compte et à toutes les salles que vous avez rejointes. Pour cela, créez un nouvel utilisateur et invitez-le uniquement dans la salle dans laquelle vous souhaitez recevoir la notification. Vous pouvez obtenir le jeton d'accès en exécutant {0}",
+    "Method": "Méthode",
+    "Body": "Corps",
+    "Headers": "En-têtes",
+    "PushUrl": "URL Push",
+    "HeadersInvalidFormat": "Les en-têtes de la requête ne sont pas dans un format JSON valide : ",
+    "BodyInvalidFormat": "Le corps de la requête n'est pas dans un format JSON valide : ",
+    "Monitor History": "Historique de la sonde",
+    "clearDataOlderThan": "Conserver l'historique des données de la sonde durant {0} jours.",
+    "PasswordsDoNotMatch": "Les mots de passe ne correspondent pas.",
+    "records": "enregistrements",
+    "One record": "Un enregistrement",
+    "steamApiKeyDescription": "Pour surveiller un serveur Steam, vous avez besoin d'une clé Steam Web-API. Vous pouvez enregistrer votre clé ici : ",
+    "Current User": "Utilisateur actuel",
+    "topic": "Topic",
+    "topicExplanation": "Topic MQTT à surveiller",
+    "successMessage": "Message de réussite",
+    "successMessageExplanation": "Message MQTT qui sera considéré comme un succès",
+    "recent": "Récent",
+    "Done": "Fait",
+    "Info": "Info",
+    "Security": "Sécurité",
+    "Steam API Key": "Clé d'API Steam",
+    "Shrink Database": "Réduire la base de données",
+    "Pick a RR-Type...": "Choisissez un type d'enregistrement…",
+    "Pick Accepted Status Codes...": "Choisissez les codes de statut acceptés…",
+    "Default": "Défaut",
+    "HTTP Options": "Options HTTP",
+    "Create Incident": "Créer un incident",
+    "Title": "Titre",
+    "Content": "Contenu",
+    "Style": "Style",
+    "info": "Info",
+    "warning": "Attention",
+    "danger": "Danger",
+    "error": "Erreur",
+    "critical": "Critique",
+    "primary": "Primaire",
+    "light": "Blanc",
+    "dark": "Noir",
+    "Post": "Post",
+    "Please input title and content": "Veuillez saisir le titre et le contenu",
+    "Created": "Créé",
+    "Last Updated": "Dernière mise à jour",
+    "Unpin": "Retirer",
+    "Switch to Light Theme": "Passer au thème clair",
+    "Switch to Dark Theme": "Passer au thème sombre",
+    "Show Tags": "Afficher les étiquettes",
+    "Hide Tags": "Masquer les étiquettes",
+    "Description": "Description",
+    "No monitors available.": "Aucune sonde disponible.",
+    "Add one": "En rajouter une",
+    "No Monitors": "Aucune sonde",
+    "Untitled Group": "Groupe sans titre",
+    "Services": "Services",
+    "Discard": "Abandonner",
+    "Cancel": "Annuler",
+    "Powered by": "Propulsé par",
+    "shrinkDatabaseDescription": "Déclenche la commande VACUUM pour SQLite. Si votre base de données a été créée après la version 1.10.0, AUTO_VACUUM est déjà activé et cette action n'est pas nécessaire.",
+    "serwersms": "SerwerSMS.pl",
+    "serwersmsAPIUser": "Nom d'utilisateur de l'API (incl. webapi_ prefix)",
+    "serwersmsAPIPassword": "Mot de passe API",
+    "serwersmsPhoneNumber": "Numéro de téléphone",
+    "serwersmsSenderName": "Nom de l'expéditeur du SMS (enregistré via le portail client)",
+    "smseagle": "SMSEagle",
+    "smseagleTo": "Numéro(s) de téléphone",
+    "smseagleGroup": "Nom(s) de groupe(s) de répertoire",
+    "smseagleContact": "Nom(s) de contact du répertoire",
+    "smseagleRecipientType": "Type de destinataire",
+    "smseagleRecipient": "Destinataire(s) (les multiples doivent être séparés par une virgule)",
+    "smseagleToken": "Jeton d'accès à l'API",
+    "smseagleUrl": "L'URL de votre appareil SMSEagle",
+    "smseagleEncoding": "Envoyer en Unicode",
+    "smseaglePriority": "Priorité des messages (0-9, par défaut = 0)",
+    "stackfield": "Stackfield",
+    "Customize": "Personnaliser",
+    "Custom Footer": "Pied de page personnalisé",
+    "Custom CSS": "CSS personnalisé",
+    "smtpDkimSettings": "Paramètres DKIM",
+    "smtpDkimDesc": "Veuillez vous référer au Nodemailer DKIM {0} pour l'utilisation.",
+    "documentation": "documentation",
+    "smtpDkimDomain": "Nom de domaine",
+    "smtpDkimKeySelector": "Sélecteur de clé",
+    "smtpDkimPrivateKey": "Clé privée",
+    "smtpDkimHashAlgo": "Algorithme de hachage (facultatif)",
+    "smtpDkimheaderFieldNames": "Clés d'en-tête à signer (facultatif)",
+    "smtpDkimskipFields": "Clés d'en-tête à ne pas signer (facultatif)",
+    "wayToGetPagerDutyKey": "Vous pouvez l'obtenir en allant dans Service -> Annuaire des services -> (sélectionner un service) -> Intégrations -> Ajouter une intégration. Ici, vous pouvez rechercher \"Events API V2\". Plus d'infos {0}",
+    "Integration Key": "Clé d'intégration",
+    "Integration URL": "URL d'intégration",
+    "Auto resolve or acknowledged": "Résolution automatique ou accusé de réception",
+    "do nothing": "ne fais rien",
+    "auto acknowledged": "accusé de réception automatique",
+    "auto resolve": "résolution automatique",
+    "gorush": "Gorush",
+    "alerta": "Alerta",
+    "alertaApiEndpoint": "API Endpoint",
+    "alertaEnvironment": "Environnement",
+    "alertaApiKey": "Clé de l'API",
+    "alertaAlertState": "État de l'alerte",
+    "alertaRecoverState": "État de récupération",
+    "deleteStatusPageMsg": "Voulez-vous vraiment supprimer cette page d'état ?",
+    "Proxies": "Proxies",
+    "default": "Défaut",
+    "enabled": "Activé",
+    "setAsDefault": "Définir par défaut",
+    "deleteProxyMsg": "Voulez-vous vraiment supprimer ce proxy pour toutes les sondes ?",
+    "proxyDescription": "Les proxies doivent être affectés à une sonde pour fonctionner.",
+    "enableProxyDescription": "Ce proxy n'aura pas d'effet sur les demandes de sonde tant qu'il n'est pas activé. Vous pouvez contrôler la désactivation temporaire du proxy de toutes les sondes en fonction de l'état d'activation.",
+    "setAsDefaultProxyDescription": "Ce proxy sera activé par défaut pour les nouvelles sondes. Vous pouvez toujours désactiver le proxy séparément pour chaque sonde.",
+    "Certificate Chain": "Chaîne de certificats",
+    "Valid": "Valide",
+    "Invalid": "Non valide",
+    "AccessKeyId": "ID de clé d'accès",
+    "SecretAccessKey": "Clé secrète d'accès",
+    "PhoneNumbers": "Numéros de téléphone",
+    "TemplateCode": "Modèle de code",
+    "SignName": "Signature",
+    "Sms template must contain parameters: ": "Le modèle de SMS doit contenir des paramètres : ",
+    "Bark Endpoint": "Endpoint Bark",
+    "Bark Group": "Groupe Bark",
+    "Bark Sound": "Son Bark",
+    "WebHookUrl": "WebHookUrl",
+    "SecretKey": "Clé secrète",
+    "For safety, must use secret key": "Par sécurité, utilisation obligatoire de la clé secrète",
+    "Device Token": "Jeton d'appareil",
+    "Platform": "Plateforme",
+    "iOS": "iOS",
+    "Android": "Android",
+    "Huawei": "Huawei",
+    "High": "Haute",
+    "Retry": "Recommencez",
+    "Topic": "Topic",
+    "WeCom Bot Key": "Clé de robot WeCom",
+    "Setup Proxy": "Configurer le proxy",
+    "Proxy Protocol": "Protocole proxy",
+    "Proxy Server": "Serveur proxy",
+    "Proxy server has authentication": "Une authentification est nécessaire pour le serveur proxy",
+    "User": "Utilisateur",
+    "Installed": "Installé",
+    "Not installed": "Non installé",
+    "Running": "Fonctionne",
+    "Not running": "Ne fonctionne pas",
+    "Remove Token": "Supprimer le jeton",
+    "Start": "Démarrer",
+    "Stop": "Arrêter",
+    "Uptime Kuma": "Uptime Kuma",
+    "Add New Status Page": "Ajouter une page de statut",
+    "Slug": "Chemin",
+    "Accept characters:": "Caractères acceptés : ",
+    "startOrEndWithOnly": "Commence uniquement par {0}",
+    "No consecutive dashes": "Pas de double tirets",
+    "Next": "Continuer",
+    "The slug is already taken. Please choose another slug.": "Un chemin existe déjà. Veuillez en choisir un autre.",
+    "No Proxy": "Pas de proxy",
+    "Authentication": "Authentification",
+    "HTTP Basic Auth": "Authentification de base HTTP",
+    "New Status Page": "Nouvelle page de statut",
+    "Page Not Found": "Page non trouvée",
+    "Reverse Proxy": "Proxy inverse",
+    "Backup": "Sauvegarde",
+    "About": "À propos",
+    "wayToGetCloudflaredURL": "(télécharger cloudflared depuis {0})",
+    "cloudflareWebsite": "Site web de Cloudflare",
+    "Message:": "Message : ",
+    "Don't know how to get the token? Please read the guide:": "Vous ne savez pas comment obtenir le jeton ? Lisez le guide :",
+    "The current connection may be lost if you are currently connecting via Cloudflare Tunnel. Are you sure want to stop it? Type your current password to confirm it.": "La connexion actuelle peut être perdue si vous vous connectez actuellement via un tunnel Cloudflare. Êtes-vous sûr de vouloir l'arrêter ? Tapez votre mot de passe actuel pour le confirmer.",
+    "HTTP Headers": "En-têtes HTTP",
+    "Trust Proxy": "Proxy de confiance",
+    "Other Software": "Autres logiciels",
+    "For example: nginx, Apache and Traefik.": "Par exemple : nginx, Apache et Traefik.",
+    "Please read": "Veuillez lire",
+    "Subject:": "Objet : ",
+    "Valid To:": "Valable jusqu'au : ",
+    "Days Remaining:": "Jours restants : ",
+    "Issuer:": "Émetteur : ",
+    "Fingerprint:": "Empreinte : ",
+    "No status pages": "Aucune page de statut",
+    "Domain Name Expiry Notification": "Notification d'expiration du nom de domaine",
+    "Proxy": "Proxy",
+    "Date Created": "Date de création",
+    "HomeAssistant": "Home Assistant",
+    "onebotHttpAddress": "Adresse HTTP OneBot",
+    "onebotMessageType": "Type de message OneBot",
+    "onebotGroupMessage": "Groupe",
+    "onebotPrivateMessage": "Privé",
+    "onebotUserOrGroupId": "ID de groupe/utilisateur",
+    "onebotSafetyTips": "Pour des raisons de sécurité, vous devez définir un jeton d'accès",
+    "PushDeer Key": "Clé PushDeer",
+    "Footer Text": "Texte de pied de page",
+    "Show Powered By": "Afficher « Propulsé par »",
+    "Domain Names": "Noms de domaine",
+    "signedInDisp": "Connecté en tant que {0}",
+    "signedInDispDisabled": "Authentification désactivée.",
+    "RadiusSecret": "Radius Secret",
+    "RadiusSecretDescription": "Secret partagé entre le client et le serveur",
+    "RadiusCalledStationId": "Identifiant de la station appelée",
+    "RadiusCalledStationIdDescription": "Identifiant de l'appareil appelé",
+    "RadiusCallingStationId": "Identifiant de la station appelante",
+    "RadiusCallingStationIdDescription": "Identifiant de l'appareil appelant",
+    "Certificate Expiry Notification": "Notification d'expiration du certificat",
+    "API Username": "Nom d'utilisateur de l'API",
+    "API Key": "Clé API",
+    "Recipient Number": "Numéro du destinataire",
+    "From Name/Number": "De nom/numéro",
+    "Leave blank to use a shared sender number.": "Laisser vide pour utiliser un numéro d'expéditeur partagé.",
+    "Octopush API Version": "Version de l'API Octopush",
+    "Legacy Octopush-DM": "Ancien Octopush-DM",
+    "endpoint": "endpoint",
+    "octopushAPIKey": "\"Clé API\" à partir des informations d'identification de l'API HTTP dans le panneau de configuration",
+    "octopushLogin": "\"Identifiant\" à partir des informations d'identification de l'API HTTP dans le panneau de configuration",
+    "promosmsLogin": "Nom de connexion API",
+    "promosmsPassword": "Mot de passe API",
+    "pushoversounds pushover": "Pushover (par défaut)",
+    "pushoversounds bike": "Vélo",
+    "pushoversounds bugle": "Clairon",
+    "pushoversounds cashregister": "Caisse enregistreuse",
+    "pushoversounds classical": "Classique",
+    "pushoversounds cosmic": "Cosmique",
+    "pushoversounds falling": "Chute",
+    "pushoversounds gamelan": "Gamelan",
+    "pushoversounds incoming": "Arrivée",
+    "pushoversounds intermission": "Intermission",
+    "pushoversounds magic": "Magique",
+    "pushoversounds mechanical": "Mécanique",
+    "pushoversounds pianobar": "Piano-bar",
+    "pushoversounds siren": "Sirène",
+    "pushoversounds spacealarm": "Alarme spatiale",
+    "pushoversounds tugboat": "Remorqueur",
+    "pushoversounds alien": "Alarme alienne (version longue)",
+    "pushoversounds climb": "Escalade (version longue)",
+    "pushoversounds persistent": "Persistent (version longue)",
+    "pushoversounds echo": "Pushover Echo (version longue)",
+    "pushoversounds updown": "Up Down (version longue)",
+    "pushoversounds vibrate": "Vibration seulement",
+    "pushoversounds none": "Aucun (silencieux)",
+    "pushyAPIKey": "Clé API secrète",
+    "pushyToken": "Jeton d'appareil",
+    "Show update if available": "Afficher la mise à jour si disponible",
+    "Also check beta release": "Vérifiez également la version bêta",
+    "Using a Reverse Proxy?": "Utiliser un proxy inverse ?",
+    "Check how to config it for WebSocket": "Vérifier comment le configurer pour WebSocket",
+    "Steam Game Server": "Serveur de jeu Steam",
+    "Most likely causes:": "Causes les plus probables : ",
+    "The resource is no longer available.": "La ressource n'est plus disponible.",
+    "There might be a typing error in the address.": "Il se peut qu'il y ait une erreur de frappe dans l'adresse.",
+    "What you can try:": "Ce que vous pouvez essayer :",
+    "Retype the address.": "Retaper l'adresse.",
+    "Go back to the previous page.": "Retourner à la page précédente.",
+    "Coming Soon": "Prochainement",
+    "wayToGetClickSendSMSToken": "Vous pouvez obtenir le nom d'utilisateur API et la clé API à partir de {0} .",
+    "Connection String": "Chaîne de connexion",
+    "Query": "Requête",
+    "settingsCertificateExpiry": "Expiration du certificat TLS",
+    "certificationExpiryDescription": "Les sondes HTTPS émettent une notification lorsque le certificat TLS expire dans :",
+    "Setup Docker Host": "Configurer l'hôte Docker",
+    "Connection Type": "Type de connexion",
+    "Docker Daemon": "Deamon Docker",
+    "deleteDockerHostMsg": "Voulez-vous vraiment supprimer cet hôte Docker pour toutes les sondes ?",
+    "socket": "Socket",
+    "tcp": "TCP / HTTP",
+    "Docker Container": "Conteneur Docker",
+    "Container Name / ID": "Nom / ID du conteneur",
+    "Docker Host": "Hôte Docker",
+    "Docker Hosts": "Hôtes Docker",
+    "ntfy Topic": "Topic ntfy",
+    "Domain": "Domaine",
+    "Workstation": "Poste de travail",
+    "disableCloudflaredNoAuthMsg": "Vous êtes en mode No Auth, un mot de passe n'est pas nécessaire.",
+    "trustProxyDescription": "Faire confiance aux en-têtes 'X-Forwarded-*'. Si vous souhaitez obtenir la bonne adresse IP client et que votre Uptime Kuma se situe derrière un proxy (comme nginx ou Apache) vous devez l'activer.",
+    "wayToGetLineNotifyToken": "Vous pouvez obtenir un jeton d'accès auprès de {0}",
+    "Examples": "Exemples",
+    "Home Assistant URL": "URL vers Home Assistant",
+    "Long-Lived Access Token": "Jeton d'accès de longue durée",
+    "Long-Lived Access Token can be created by clicking on your profile name (bottom left) and scrolling to the bottom then click Create Token. ": "Un jeton d'accès de longue durée peut être créé en cliquant sur le nom de votre profil (en bas à gauche) et en faisant défiler vers le bas, puis cliquez sur Créer un jeton. ",
+    "Notification Service": "Service de notifications",
+    "default: notify all devices": "par défaut : notifier tous les appareils",
+    "A list of Notification Services can be found in Home Assistant under \"Developer Tools > Services\" search for \"notification\" to find your device/phone name.": "Une liste des services de notification peut être trouvée dans Home Assistant sous \"Outils de développement > Services\" recherchez \"notification\" pour trouver le nom de votre appareil/téléphone.",
+    "Automations can optionally be triggered in Home Assistant:": "Les automatisations peuvent éventuellement être déclenchées dans Home Assistant : ",
+    "Trigger type:": "Type de déclencheur : ",
+    "Event type:": "Type d'événement : ",
+    "Event data:": "Données d'événement : ",
+    "Then choose an action, for example switch the scene to where an RGB light is red.": "Ensuite, choisissez une action, par exemple basculer la scène là où une lumière RVB est rouge.",
+    "Frontend Version": "Version frontend",
+    "Frontend Version do not match backend version!": "La version frontend ne correspond pas à la version backend !",
+    "Base URL": "URL de base",
+    "goAlertInfo": "GoAlert est une application open source pour la planification des appels, les escalades automatisées et les notifications (comme les SMS ou les appels vocaux). Impliquez automatiquement la bonne personne, de la bonne manière et au bon moment ! {0}",
+    "goAlertIntegrationKeyInfo": "Obtenez la clé d'intégration d'API générique pour le service dans ce format \"aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee\" généralement la valeur du paramètre de jeton de l'URL copiée.",
+    "goAlert": "GoAlert",
+    "backupOutdatedWarning": "Obsolète : étant donné que de nombreuses fonctionnalités ont été ajoutées et que cette fonctionnalité de sauvegarde est non maintenue, elle ne peut pas générer ou restaurer une sauvegarde complète.",
+    "backupRecommend": "Veuillez sauvegarder le volume ou le dossier de données (./data/) directement à la place.",
+    "Optional": "Optionnel",
+    "squadcast": "Squadcast",
+    "SendKey": "SendKey",
+    "SMSManager API Docs": "Documentations de l'API SMSManager ",
+    "Gateway Type": "Type de passerelle",
+    "SMSManager": "SMSManager",
+    "You can divide numbers with": "Vous pouvez diviser des nombres avec",
+    "or": "ou",
+    "recurringInterval": "Intervalle",
+    "Recurring": "Récurrent",
+    "strategyManual": "Activer/désactiver manuellement",
+    "warningTimezone": "Utilisation du fuseau horaire du serveur",
+    "weekdayShortMon": "Lun",
+    "weekdayShortTue": "Mar",
+    "weekdayShortWed": "Mer",
+    "weekdayShortThu": "Jeu",
+    "weekdayShortFri": "Ven",
+    "weekdayShortSat": "Sam",
+    "weekdayShortSun": "Dim",
+    "dayOfWeek": "Jour de la semaine",
+    "dayOfMonth": "Jour du mois",
+    "lastDay": "Dernier jour",
+    "lastDay1": "Dernier jour du mois",
+    "lastDay2": "Avant-dernier jour du mois",
+    "lastDay3": "3ème dernier jour du mois",
+    "lastDay4": "4ème dernier jour du mois",
+    "No Maintenance": "Aucune maintenance",
+    "pauseMaintenanceMsg": "Voulez-vous vraiment mettre en pause ?",
+    "maintenanceStatus-under-maintenance": "En maintenance",
+    "maintenanceStatus-inactive": "Inactif",
+    "maintenanceStatus-scheduled": "Programmé",
+    "maintenanceStatus-ended": "Terminé",
+    "maintenanceStatus-unknown": "Inconnue",
+    "Display Timezone": "Afficher le fuseau horaire",
+    "Server Timezone": "Fuseau horaire du serveur",
+    "statusPageMaintenanceEndDate": "Fin",
+    "IconUrl": "URL vers l'icône",
+    "Enable DNS Cache": "Activer le cache DNS",
+    "Enable": "Activer",
+    "Disable": "Désactiver",
+    "dnsCacheDescription": "Il peut ne pas fonctionner dans certains environnements IPv6, désactivez-le si vous rencontrez des problèmes.",
+    "Single Maintenance Window": "Créneau de maintenance unique",
+    "Maintenance Time Window of a Day": "Créneau de la maintenance",
+    "Effective Date Range": "Plage de dates d'effet",
+    "Schedule Maintenance": "Créer une maintenance",
+    "Date and Time": "Date et heure",
+    "DateTime Range": "Plage de dates et d'heures",
+    "Strategy": "Stratégie",
+    "Free Mobile User Identifier": "Identifiant d'utilisateur Free Mobile",
+    "Free Mobile API Key": "Clé d'API Free Mobile",
+    "Enable TLS": "Activer le TLS",
+    "Proto Service Name": "Nom du service proto",
+    "Proto Method": "Méthode Proto",
+    "Proto Content": "Contenu proto",
+    "Economy": "Économique",
+    "Lowcost": "Faible coût",
+    "high": "Haute",
+    "General Monitor Type": "Type de sonde générale",
+    "Passive Monitor Type": "Type de sonde passive",
+    "Specific Monitor Type": "Type de sonde spécifique",
+    "dataRetentionTimeError": "La durée de conservation doit être supérieure ou égale à 0",
+    "infiniteRetention": "Définissez la valeur à 0 pour une durée de conservation infinie.",
+    "Monitor": "Sonde | Sondes",
+    "Custom": "Personnalisé",
+    "confirmDeleteTagMsg": "Voulez-vous vraiment supprimer cette étiquettes ? Les moniteurs associés ne seront pas supprimés.",
+    "promosmsAllowLongSMS": "Autoriser les longs SMS",
+    "Help": "Aide",
+    "Game": "Jeux",
+    "Packet Size": "Taille du paquet",
+    "loadingError": "Impossible de récupérer les données, veuillez réessayer plus tard.",
+    "plugin": "Plugin | Plugins",
+    "install": "Installer",
+    "installing": "Installation",
+    "uninstall": "Désinstaller",
+    "uninstalling": "Désinstallation",
+    "confirmUninstallPlugin": "Voulez-vous vraiment désinstaller ce plugin ?",
+    "Custom Monitor Type": "Type de sonde personnalisé",
+    "markdownSupported": "Syntaxe Markdown supportée",
+    "Google Analytics ID": "Identifiant Google Analytics",
+    "Server Address": "Adresse du serveur",
+    "Learn More": "En savoir plus",
+    "Edit Tag": "Modifier l'étiquette"
+}
diff --git a/src/lang/he-IL.json b/src/lang/he-IL.json
new file mode 100644
index 000000000..1e4c01d33
--- /dev/null
+++ b/src/lang/he-IL.json
@@ -0,0 +1,696 @@
+{
+    "languageName": "עברית",
+    "checkEverySecond": "בדוק כל {0} שניות",
+    "retryCheckEverySecond": "נסה שוב כל {0} שניות",
+    "resendEveryXTimes": "התראה שוב כל {0} פעמים",
+    "resendDisabled": "השליחה מחדש מושבתת",
+    "retriesDescription": "מקסימום ניסיונות חוזרים לפני שהשירות יסומן כלא פעיל ונשלחת התראה",
+    "ignoreTLSError": "התעלם משגיאת TLS/SSL עבור אתרי HTTPS",
+    "upsideDownModeDescription": "הפוך את הסטטוס על הפוך. אם ניתן להגיע לשירות, הוא לא פעיל.",
+    "maxRedirectDescription": "המספר המרבי של הפניות מחדש לעקוב. הגדר ל-0 כדי להשבית הפניות מחדש.",
+    "enableGRPCTls": "אפשר לשלוח בקשת gRPC עם חיבור TLS",
+    "grpcMethodDescription": "שם השיטה מומר לפורמט cammelCase כגון sayHello, check וכו.",
+    "acceptedStatusCodesDescription": "בחר קודי סטטוס שנחשבים לתגובה מוצלחת.",
+    "Maintenance": "תחזוקה",
+    "statusMaintenance": "תחזוקה",
+    "Schedule maintenance": "תחזוקה מתוכננת",
+    "Affected Monitors": "מוניטורים מושפעים",
+    "Pick Affected Monitors...": "בחר המוניטריים המושפעים…",
+    "Start of maintenance": "תחילת תחזוקה",
+    "All Status Pages": "כל דפי הסטטוס",
+    "Select status pages...": "בחר דפי סטטוס…",
+    "recurringIntervalMessage": "רוץ פעם ביום | הפעל אחת ל-{0} ימים",
+    "affectedMonitorsDescription": "בחר מוניטורים שמושפעים מהתחזוקה הנוכחית",
+    "affectedStatusPages": "הצג הודעת תחזוקה זו בדפי סטטוס שנבחרו",
+    "atLeastOneMonitor": "בחר לפחות מוניטור אחד מושפע",
+    "passwordNotMatchMsg": "הסיסמאות לא תואמות",
+    "notificationDescription": "יש להקצות התראות למוניטור כדי שהן יעבדו.",
+    "keywordDescription": "חפש מילת מפתח בתגובת HTML או JSON רגילה. החיפוש תלוי רישיות.",
+    "pauseDashboardHome": "עצור",
+    "deleteMonitorMsg": "האם אתה בטוח שברצונך למחוק את המוניטור הזה?",
+    "deleteMaintenanceMsg": "האם אתה בטוח שברצונך למחוק את התחזוקה הזו?",
+    "deleteNotificationMsg": "האם אתה בטוח שברצונך למחוק את ההודעה הזו עבור כל מוניטרים?",
+    "dnsPortDescription": "יציאת שרת DNS. ברירת המחדל היא 53. אתה יכול לשנות את היציאה בכל עת.",
+    "resolverserverDescription": "Cloudflare הוא שרת ברירת המחדל. אתה יכול לשנות את שרת הפותר בכל עת.",
+    "rrtypeDescription": "בחר את סוג ה-RR שברצונך לפקח עליו",
+    "pauseMonitorMsg": "האם אתה בטוח רוצה להשהות?",
+    "enableDefaultNotificationDescription": "הודעה זו תופעל כברירת מחדל עבור מוניטרים חדשים. אתה עדיין יכול להשבית את ההודעה בנפרד עבור כל מוניטור.",
+    "clearEventsMsg": "האם אתה בטוח שברצונך למחוק את כל האירועים עבור המוניטור הזה?",
+    "clearHeartbeatsMsg": "האם אתה בטוח שברצונך למחוק את כל פעימות הלב עבור המוניטור הזה?",
+    "confirmClearStatisticsMsg": "האם אתה בטוח שברצונך למחוק את כל הנתונים הסטטיסטיים?",
+    "importHandleDescription": "בחר 'דלג על קיים' אם ברצונך לדלג על כל מוניטור או התראה באותו שם. 'החלף' ימחק כל מוניטור והתראה קיימים.",
+    "confirmImportMsg": "האם אתה בטוח שברצונך לייבא את הגיבוי? אנא ודא שבחרת באפשרות הייבוא הנכונה.",
+    "twoFAVerifyLabel": "אנא הזן את האסימון שלך כדי לאמת מערכת אדוש:",
+    "tokenValidSettingsMsg": "האסימון תקף! כעת אתה יכול לשמור את הגדרות האדוש.",
+    "confirmEnableTwoFAMsg": "האם אתה בטוח שברצונך להפעיל את מערכת אדוש?",
+    "confirmDisableTwoFAMsg": "Are you sure you want to disable 2FA?",
+    "Settings": "הגדרות",
+    "Dashboard": "פאנל ניהול",
+    "New Update": "עדכון חדש",
+    "Language": "שפה",
+    "Appearance": "נראות",
+    "Theme": "ערכת נושא",
+    "General": "כללי",
+    "Primary Base URL": "כתובת האתר הראשית של הבסיס",
+    "Version": "גרסה",
+    "Check Update On GitHub": "לבדוק עדכונים בגיטהאב",
+    "List": "רשימה",
+    "Add": "הוסף",
+    "Add New Monitor": "הוספת מוניטור חדש",
+    "Quick Stats": "נתונים בקצרה",
+    "Up": "פעיל",
+    "Down": "לא פעיל",
+    "Pending": "ממתין",
+    "Unknown": "לא יודע",
+    "Pause": "עצור",
+    "Name": "שם",
+    "Status": "סטטוס",
+    "DateTime": "תאריך שעה",
+    "Message": "הודעה",
+    "No important events": "אין אירועים חשובים",
+    "Resume": "המשך",
+    "Edit": "עריכה",
+    "Delete": "מחיקה",
+    "Current": "עכשיו",
+    "Uptime": "זמן פעילות",
+    "Cert Exp.": "Cert Exp.",
+    "day": "יום | ימים",
+    "-day": "-יום",
+    "hour": "שעה",
+    "-hour": "-שעה",
+    "Response": "תגובה",
+    "Ping": "פינג",
+    "Monitor Type": "סוג מוניטור",
+    "Keyword": "מילת מפתח",
+    "Friendly Name": "שם ידידותי",
+    "URL": "כתובת אתר",
+    "Hostname": "שם המארח",
+    "Port": "פורט",
+    "Heartbeat Interval": "מרווח פעימות",
+    "Retries": "נסיונות חוזרים",
+    "Heartbeat Retry Interval": "מרווח נסיונות חוזר של פעימות",
+    "Resend Notification if Down X times consecutively": "שלח שוב הודעה אם ירד X פעמים כתוצאה מכך",
+    "Advanced": "מתקדם",
+    "Upside Down Mode": "מצב הפוך",
+    "Max. Redirects": "מקסימום הפניות מחדש",
+    "Accepted Status Codes": "קודי סטטוס מקובלים",
+    "Push URL": "דחף כתובת URL",
+    "needPushEvery": "עליך להתקשר לכתובת האתר הזו כל {0} שניות.",
+    "pushOptionalParams": "פרמטרים אופציונליים: {0}",
+    "Save": "שמירה",
+    "Notifications": "התראות",
+    "Not available, please setup.": "לא זמין, אנא הגדר.",
+    "Setup Notification": "הודעת הגדרה",
+    "Light": "בהיר",
+    "Dark": "חושך",
+    "Auto": "אוטומטי",
+    "Theme - Heartbeat Bar": "ערכת נושא - Heartbeat Bar",
+    "Normal": "נורמלי",
+    "Bottom": "למטה",
+    "None": "כלום",
+    "Timezone": "אזור זמן",
+    "Search Engine Visibility": "נראות במנועי חיפוש",
+    "Allow indexing": "אפשר הוספה לאינדקס",
+    "Discourage search engines from indexing site": "לא לעודד מנועי חיפוש לאינדקס אתרים",
+    "Change Password": "שנה סיסמא",
+    "Current Password": "סיסמה נוכחית",
+    "New Password": "סיסמה חדשה",
+    "Repeat New Password": "חזור על סיסמה חדשה",
+    "Update Password": "עדכן סיסמה",
+    "Disable Auth": "השבתת אבטחה",
+    "Enable Auth": "הפעלת אבטחה",
+    "disableauth.message1": "האם אתה בטוח שברצונך <strong>להשבית את האבטחה</strong>?",
+    "disableauth.message2": "הוא מיועד לתרחישים <strong>שבהם אתה מתכוון ליישם אימות של צד שלישי</strong> מול Uptime Kuma כגון Cloudflare Access, Authelia או מנגנוני אימות אחרים.",
+    "Please use this option carefully!": "אנא השתמש באפשרות זו בזהירות!",
+    "Logout": "התנתקות",
+    "Leave": "יציאה",
+    "I understand, please disable": "אני מבין, אני רוצה להשבית",
+    "Confirm": "אישור",
+    "Yes": "כן",
+    "No": "לא",
+    "Username": "שם משתמש",
+    "Password": "סיסמה",
+    "Remember me": "זכור אותי",
+    "Login": "התחברות",
+    "No Monitors, please": "בלי מוניטורים, בבקשה",
+    "add one": "להוסיף אחד",
+    "Notification Type": "סוג התראה",
+    "Email": "אימייל",
+    "Test": "Test",
+    "Certificate Info": "פרטי תעודת אבטחה",
+    "Resolver Server": "שרת פותר",
+    "Resource Record Type": "סוג רשומת משאבים",
+    "Last Result": "תוצאה אחרונה",
+    "Create your admin account": "צור את חשבון הניהול שלך",
+    "Repeat Password": "חזור על הסיסמה",
+    "Import Backup": "ייבוא גיבוי",
+    "Export Backup": "ייצוא גיבוי",
+    "Export": "ייצוא",
+    "Import": "ייבוא",
+    "respTime": "רפ. זמן (ms)",
+    "notAvailableShort": "N/A",
+    "Default enabled": "ברירת המחדל מופעלת",
+    "Apply on all existing monitors": "החל על כל המסכים הקיימים",
+    "Create": "ליצור",
+    "Clear Data": "נקה נתונים",
+    "Events": "אירועים",
+    "Heartbeats": "פעימות לב",
+    "Auto Get": "קבל אוטומטי",
+    "backupDescription": "אתה יכול לגבות את כל המסכים וההתראות לקובץ JSON.",
+    "backupDescription2": "הערה: היסטוריה ונתוני אירועים אינם כלולים.",
+    "backupDescription3": "נתונים רגישים כגון אסימוני הודעה כלולים בקובץ הייצוא; נא לאחסן יצוא בצורה מאובטחת.",
+    "alertNoFile": "אנא בחר קובץ לייבוא.",
+    "alertWrongFileType": "אנא בחר קובץ JSON.",
+    "Clear all statistics": "נקה את כל הנתונים הסטטיסטיים",
+    "Skip existing": "דילוג על הקיים",
+    "Overwrite": "החלף",
+    "Options": "אפשרויות",
+    "Keep both": "שמור את שניהם",
+    "Verify Token": "אמת את האסימון",
+    "Setup 2FA": "הגדרת מערכת אדוש",
+    "Enable 2FA": "הפעלת אדוש",
+    "Disable 2FA": "כיבוי אדוש",
+    "2FA Settings": "הגדרות אדוש",
+    "Two Factor Authentication": "אימות דו-שלבי (מערכת אדוש)",
+    "Active": "מופעל",
+    "Inactive": "קבוי",
+    "Token": "אסימון",
+    "Show URI": "הצג URI",
+    "Tags": "תגים",
+    "Add New below or Select...": "הוסף חדש למטה או בחר…",
+    "Tag with this name already exist.": "תג בשם זה כבר קיים.",
+    "Tag with this value already exist.": "תג עם ערך זה כבר קיים.",
+    "color": "צבע",
+    "value (optional)": "ערך (אופציונלי)",
+    "Gray": "אפור",
+    "Red": "אדום",
+    "Orange": "כתום",
+    "Green": "ירוק",
+    "Blue": "כחול",
+    "Indigo": "כחול כהה",
+    "Purple": "סגול",
+    "Pink": "כתום",
+    "Search...": "לחפש…",
+    "Avg. Ping": "פינג ממוצע",
+    "Avg. Response": "ממוצע תגובה",
+    "Entry Page": "דף כניסה",
+    "statusPageNothing": "אין כאן שום דבר, בבקשה הוסף קבוצה או מוניטור.",
+    "No Services": "אין שירותים",
+    "All Systems Operational": "כל המערכות עובדות",
+    "Partially Degraded Service": "שירות פגום חלקית",
+    "Degraded Service": "שירות פגום",
+    "Add Group": "הוסף קבוצה",
+    "Add a monitor": "הוסף מוניטור",
+    "Edit Status Page": "ערוך דף סטטוס",
+    "Go to Dashboard": "מעבר לפאנל",
+    "Status Page": "דף סטטוס",
+    "Status Pages": "דפי סטטוס",
+    "defaultNotificationName": "התראת {notification} שלי ({number})",
+    "here": "פה",
+    "Required": "נדרש",
+    "telegram": "טלגרם",
+    "Bot Token": "אסימון בוט",
+    "wayToGetTelegramToken": "אתה יכול לקבל אסימון מ-{0}.",
+    "Chat ID": "מזהה צ'אט",
+    "supportTelegramChatID": "תמיכה בצ'אט ישיר / קבוצה / מזהה הצ'אט של הערוץ",
+    "wayToGetTelegramChatID": "אתה יכול לקבל את מזהה הצ'אט שלך על ידי שליחת הודעה לבוט ומעבר לכתובת האתר הזו כדי להציג את ה-chat_id:",
+    "YOUR BOT TOKEN HERE": "אסימון הבוט שלך כאן",
+    "chatIDNotFound": "מזהה צ'אט לא נמצא; אנא שלח הודעה לבוט זה תחילה",
+    "webhook": "Webhook",
+    "Post URL": "כתובת אתר של פוסט",
+    "Content Type": "סוג התוכן",
+    "webhookJsonDesc": "{0} מתאים לכל שרתי HTTP מודרניים כגון Express.js",
+    "webhookFormDataDesc": "{multipart} טוב ל-PHP. יהיה צורך לנתח את ה-JSON באמצעות {decodeFunction}",
+    "webhookAdditionalHeadersTitle": "כותרות נוספות",
+    "webhookAdditionalHeadersDesc": "מגדיר כותרות נוספות שנשלחות עם ה-webhook.",
+    "smtp": "אימייל (SMTP)",
+    "secureOptionNone": "None / STARTTLS (25, 587)",
+    "secureOptionTLS": "TLS (465)",
+    "Ignore TLS Error": "התעלם משגיאת TLS",
+    "From Email": "אמייל שולח",
+    "emailCustomSubject": "נושא מותאם אישית",
+    "To Email": "למייל",
+    "smtpCC": "עותק",
+    "smtpBCC": "עותק מוסתר",
+    "discord": "דיסקורד",
+    "Discord Webhook URL": "כתובת אתר של Discord Webhook",
+    "wayToGetDiscordURL": "אתה יכול לקבל זאת על ידי מעבר להגדרות שרת -> אינטגרציות -> צור Webhook",
+    "Bot Display Name": "שם תצוגה של בוט",
+    "Prefix Custom Message": "קידומת הודעה מותאמת אישית",
+    "Hello @everyone is...": "שלום {'@'}כולם…",
+    "teams": "Microsoft Teams",
+    "Webhook URL": "כתובת האתר של Webhook",
+    "wayToGetTeamsURL": "אתה יכול ללמוד כיצד ליצור כתובת אתר ל-webhook {0}.",
+    "signal": "אוֹת",
+    "Number": "מספר",
+    "Recipients": "נמענים",
+    "needSignalAPI": "אתה צריך שיהיה לך לקוח איתות עם REST API.",
+    "wayToCheckSignalURL": "אתה יכול לבדוק את כתובת האתר הזו כדי לראות כיצד להגדיר אחת:",
+    "signalImportant": "חשוב: לא ניתן לערבב קבוצות ומספרים בנמענים!",
+    "gotify": "Gotify",
+    "Application Token": "אסימון אפליקציה",
+    "Server URL": "כתובת האתר של השרת",
+    "Priority": "עדיפות",
+    "slack": "Slack",
+    "Icon Emoji": "אייקון אימוג'י",
+    "Channel Name": "שם הערוץ",
+    "Uptime Kuma URL": "Uptime Kuma URL",
+    "aboutWebhooks": "מידע נוסף על Webhooks ב: {0}",
+    "aboutChannelName": "הזן את שם הערוץ בשדה {0} שם ערוץ אם ברצונך לעקוף את ערוץ Webhook. לדוגמה: #ערוץ אחר",
+    "aboutKumaURL": "אם תשאיר את השדה Uptime Kuma URL ריק, הוא יעבור כברירת מחדל לעמוד Project GitHub.",
+    "emojiCheatSheet": "גיליון הונאה של אמוג'י: {0}",
+    "rocket.chat": "Rocket.Chat",
+    "pushover": "Pushover",
+    "pushy": "Pushy",
+    "PushByTechulus": "Push by Techulus",
+    "octopush": "Octopush",
+    "promosms": "PromoSMS",
+    "clicksendsms": "ClickSend SMS",
+    "lunasea": "LunaSea",
+    "apprise": "Apprise (תומך ב-50+ שירותי התראות)",
+    "GoogleChat": "Google Chat (Google Workspace בלבד)",
+    "pushbullet": "Pushbullet",
+    "line": "Line Messenger",
+    "mattermost": "Mattermost",
+    "User Key": "מפתח משתמש",
+    "Device": "התקן",
+    "Message Title": "כותרת ההודעה",
+    "Notification Sound": "צליל התראה",
+    "More info on:": "מידע נוסף על: {0}",
+    "pushoverDesc1": "לעדיפות חירום (2) יש פסק זמן של 30 שניות ברירת מחדל בין ניסיונות חוזרים, והיא תפוג לאחר שעה.",
+    "pushoverDesc2": "אם ברצונך לשלוח התראות למכשירים שונים, מלא את שדה התקן.",
+    "SMS Type": "סוג SMS",
+    "octopushTypePremium": "פרימיום (מהיר - מומלץ להתראה)",
+    "octopushTypeLowCost": "עלות נמוכה (איטית - לפעמים חסומה על ידי המפעיל)",
+    "checkPrice": "בדוק מחירים של {0}:",
+    "apiCredentials": "אישורי API",
+    "octopushLegacyHint": "האם אתה משתמש בגרסה הישנה של Octopush (2011-2020) או בגרסה החדשה?",
+    "Check octopush prices": "בדוק מחירי תמנון {0}.",
+    "octopushPhoneNumber": "מספר טלפון (פורמט אינטלי, למשל: +33612345678)",
+    "octopushSMSSender": "שם שולח SMS: 3-11 תווים אלפאנומריים ורווח (a-zA-Z0-9)",
+    "LunaSea Device ID": "מזהה מכשיר LunaSea",
+    "Apprise URL": "Apprise URL",
+    "Example:": "דוגמה: {0}",
+    "Read more:": "קרא עוד: {0}",
+    "Status:": "סטטוס: {0}",
+    "Read more": "קרא עוד",
+    "appriseInstalled": "Apprise מותקן.",
+    "appriseNotInstalled": "Apprise אינו מותקן. {0}",
+    "Access Token": "אסימון גישה",
+    "Channel access token": "אסימון גישה לערוץ",
+    "Line Developers Console": "קונסולת מפתחים",
+    "lineDevConsoleTo": "קו מפתחי קונסולת - {0}",
+    "Basic Settings": "הגדרות בסיסיות",
+    "User ID": "תעודת זהות של משתמש",
+    "Messaging API": "Messaging API",
+    "wayToGetLineChannelToken": "תחילה גש ל-{0}, צור ספק וערוץ (Messaging API), לאחר מכן תוכל לקבל את אסימון הגישה לערוץ ומזהה המשתמש מפריטי התפריט שהוזכרו לעיל.",
+    "Icon URL": "כתובת אתר של סמל",
+    "aboutIconURL": "אתה יכול לספק קישור לתמונה ב\"כתובת URL של סמל\" כדי לעקוף את תמונת הפרופיל המוגדרת כברירת מחדל. לא ישמש אם Icon Emoji מוגדר.",
+    "aboutMattermostChannelName": "אתה יכול לעקוף את ערוץ ברירת המחדל שאליו ה-Webhook מפרסם על ידי הזנת שם הערוץ בשדה \"שם ערוץ\". זה צריך להיות מופעל בהגדרות Mattermos Webhook. לדוגמה: #ערוץ אחר",
+    "matrix": "Matrix",
+    "promosmsTypeEco": "SMS ECO - זול אך איטי ולעיתים עמוס מדי. מוגבל רק לנמענים פולנים.",
+    "promosmsTypeFlash": "SMS FLASH - ההודעה תוצג אוטומטית במכשיר הנמען. מוגבל לנמענים פולנים בלבד.",
+    "promosmsTypeFull": "SMS FULL - שכבת פרימיום של SMS, אתה יכול להשתמש בשם השולח שלך (עליך לרשום את השם תחילה). אמין להתראות.",
+    "promosmsTypeSpeed": "SMS SPEED - העדיפות הגבוהה ביותר במערכת. מאוד מהיר ואמין אבל יקר (בערך פי שניים ממחיר מלא של SMS).",
+    "promosmsPhoneNumber": "מספר טלפון (לנמען פולני ניתן לדלג על אזורי חיוג)",
+    "promosmsSMSSender": "שם שולח SMS: שם רשום מראש או אחת מברירות המחדל: InfoSMS, SMS Info, MaxSMS, INFO, SMS",
+    "Feishu WebHookUrl": "Feishu WebHookURL",
+    "matrixHomeserverURL": "כתובת האתר של שרת הבית (עם http(s):// ויציאה אופציונלית)",
+    "Internal Room Id": "מזהה חדר פנימי",
+    "matrixDesc1": "אתה יכול למצוא את מזהה החדר הפנימי על ידי עיון בחלק המתקדם של לקוח Matrix שלך בהגדרות החדר. זה צריך להיראות כמו !QMdRCpUIfLwsfjxye6:home.server.",
+    "matrixDesc2": "מומלץ מאוד ליצור משתמש חדש ולא להשתמש באסימון הגישה של משתמש מטריקס משלך שכן הוא יאפשר גישה מלאה לחשבון שלך ולכל החדרים שהצטרפת אליהם. במקום זאת, צור משתמש חדש והזמן אותו רק לחדר שבו תרצה לקבל את ההתראה. תוכל לקבל את אסימון הגישה על ידי הפעלת {0}",
+    "Method": "Method",
+    "Body": "Body",
+    "Headers": "Headers",
+    "PushUrl": "Push URL",
+    "HeadersInvalidFormat": "כותרות הבקשה אינן JSON חוקיות:",
+    "BodyInvalidFormat": "גוף הבקשה אינו JSON חוקי:",
+    "Monitor History": "מעקב אחר היסטוריה",
+    "clearDataOlderThan": "שמור את נתוני היסטוריית הצג למשך {0} ימים.",
+    "PasswordsDoNotMatch": "סיסמאות לא תואמות.",
+    "records": "רשומות",
+    "One record": "שיא אחד",
+    "steamApiKeyDescription": "לניטור שרת משחקי Steam אתה צריך מפתח Steam Web-API. אתה יכול לרשום את מפתח ה-API שלך כאן:",
+    "Current User": "משתמש נוכחי",
+    "topic": "נושא",
+    "topicExplanation": "נושא MQTT למעקב",
+    "successMessage": "הודעת הצלחה",
+    "successMessageExplanation": "הודעת MQTT שתיחשב כהצלחה",
+    "recent": "לאחרונה",
+    "Done": "בוצע",
+    "Info": "מידע",
+    "Security": "אבטחה",
+    "Steam API Key": "מפתח API Steam",
+    "Shrink Database": "מסד נתונים מכווץ",
+    "Pick a RR-Type...": "בחר סוג RR…",
+    "Pick Accepted Status Codes...": "בחר קודי סטטוס מקובלים…",
+    "Default": "בְּרִירַת מֶחדָל",
+    "HTTP Options": "אפשרויות HTTP",
+    "Create Incident": "ליצור אירוע",
+    "Title": "כותרת",
+    "Content": "תוֹכֶן",
+    "Style": "Style",
+    "info": "מידע",
+    "warning": "אַזהָרָה",
+    "danger": "סַכָּנָה",
+    "error": "שְׁגִיאָה",
+    "critical": "קריטי",
+    "primary": "יְסוֹדִי",
+    "light": "אוֹר",
+    "dark": "אפל",
+    "Post": "הודעה",
+    "Please input title and content": "אנא הזן כותרת ותוכן",
+    "Created": "נוצר",
+    "Last Updated": "עודכן לאחרונה",
+    "Unpin": "ענן חוף",
+    "Switch to Light Theme": "לעבור לנושא האור",
+    "Switch to Dark Theme": "לעבור לנושא אפל",
+    "Show Tags": "Show Tags",
+    "Hide Tags": "הסתר תגיות",
+    "Description": "תיאור",
+    "No monitors available.": "אין צגים זמינים.",
+    "Add one": "הוסף אחד",
+    "No Monitors": "אין צגים",
+    "Untitled Group": "קבוצה ללא כותרת",
+    "Services": "שירותים",
+    "Discard": "להשליך",
+    "Cancel": "לְבַטֵל",
+    "Powered by": "פועל על",
+    "shrinkDatabaseDescription": "ואקום מסד נתונים להפעיל עבור SQLITE.אם בסיס הנתונים שלך נוצר לאחר 1.10.0, Auto_VACUUM כבר מופעל ואין צורך בפעולה זו.",
+    "serwersms": "SerwerSMS.pl",
+    "serwersmsAPIUser": "API Username (incl. webapi_ prefix)",
+    "serwersmsAPIPassword": "סיסמת API",
+    "serwersmsPhoneNumber": "מספר טלפון",
+    "serwersmsSenderName": "שם שולח SMS (רשום באמצעות פורטל לקוחות)",
+    "smseagle": "SMSEagle",
+    "smseagleTo": "מספרי טלפון)",
+    "smseagleGroup": "שם קבוצת ספר טלפונים",
+    "smseagleContact": "שם איש קשר בספר הטלפונים",
+    "smseagleRecipientType": "Rסוג הנמען",
+    "smseagleRecipient": "נמענים (ים) (יש להפריד בין מרובים לפסיק)",
+    "smseagleToken": "API Access Token",
+    "smseagleUrl": "כתובת האתר של מכשיר ה- SMSeagege שלך",
+    "smseagleEncoding": "שלח כ- Unicode",
+    "smseaglePriority": "עדיפות הודעה (0-9, ברירת מחדל = 0)",
+    "stackfield": "סטאקפילד",
+    "Customize": "התאמה אישית",
+    "Custom Footer": "כותרת תחתונה מותאמת אישית",
+    "Custom CSS": "CSS מותאם אישית",
+    "smtpDkimSettings": "הגדרות DKIM",
+    "smtpDkimDesc": "אנא עיין ב- NodeMailer DKIM {0} לשימוש.",
+    "documentation": "ווקיפדיית מדריכים",
+    "smtpDkimDomain": "שם דומיין",
+    "smtpDkimKeySelector": "בורר מפתח",
+    "smtpDkimPrivateKey": "טוראי של פרטיy",
+    "smtpDkimHashAlgo": "אלגוריתם hash (אופציונלי)",
+    "smtpDkimheaderFieldNames": "מפתחות כותרת לחתום (אופציונלי)",
+    "smtpDkimskipFields": "מפתחות כותרת לא לחתום (אופציונלי)",
+    "wayToGetPagerDutyKey": "אתה יכול להשיג זאת על ידי מעבר לשירות -> ספריית שירות -> (בחר שירות) -> אינטגרציות -> הוסף אינטגרציה.כאן תוכלו לחפש \"אירועים API v2 \".מידע נוסף {0}",
+    "Integration Key": "מפתח אינטגרציה",
+    "Integration URL": "URL אינטגרציה",
+    "Auto resolve or acknowledged": "פיתרון אוטומטי או הודה",
+    "do nothing": "לעשות כלום",
+    "auto acknowledged": "Auto הודה",
+    "auto resolve": "פתרון אוטומטי",
+    "gorush": "Gorush",
+    "alerta": "Alerta",
+    "alertaApiEndpoint": "נקודת קצה של API",
+    "alertaEnvironment": "סביבה",
+    "alertaApiKey": "מפתח API",
+    "alertaAlertState": "מצב התראה",
+    "alertaRecoverState": "לשחזר מדינה",
+    "deleteStatusPageMsg": "האם אתה בטוח רוצה למחוק את דף הסטטוס הזה?",
+    "Proxies": "Proxies",
+    "default": "בְּרִירַת מֶחדָל",
+    "enabled": "מופעל",
+    "setAsDefault": "נקבע כברירת מחדל",
+    "deleteProxyMsg": "האם אתה בטוח רוצה למחוק את הפרוקסי הזה לכל המסכים?",
+    "proxyDescription": "Proxies must be assigned to a monitor to function.",
+    "enableProxyDescription": "פרוקסי זה לא ישפיע על בקשות צג עד שהוא יופעל.אתה יכול לשלוט באופן זמני להשבית את ה- Proxy מכל המסכים לפי מצב ההפעלה.",
+    "setAsDefaultProxyDescription": "פרוקסי זה יופעל כברירת מחדל עבור צגים חדשים.אתה עדיין יכול להשבית את ה- Proxy בנפרד עבור כל צג.",
+    "Certificate Chain": "שרשרת אישורים",
+    "Valid": "תָקֵף",
+    "Invalid": "לא חוקי",
+    "AccessKeyId": "מזהה AccessKey",
+    "SecretAccessKey": "גישהלמפתחסוד",
+    "PhoneNumbers": "מספר טלפוןs",
+    "TemplateCode": "TemplateCode",
+    "SignName": "שם שם",
+    "Sms template must contain parameters: ": "תבנית SMS חייבת להכיל פרמטרים: ",
+    "Bark Endpoint": "Bark Endpoint",
+    "Bark Group": "Bark Group",
+    "Bark Sound": "Bark Sound",
+    "WebHookUrl": "WebHookUrl",
+    "SecretKey": "מפתח סודי",
+    "For safety, must use secret key": "לבטיחות, חייב להשתמש במפתח סודיy",
+    "Device Token": "אסימון מכשיר",
+    "Platform": "פּלַטפוֹרמָה",
+    "iOS": "iOS",
+    "Android": "דְמוּי אָדָם",
+    "Huawei": "huawei",
+    "High": "High",
+    "Retry": "נסה שוב",
+    "Topic": "נוֹשֵׂא",
+    "WeCom Bot Key": "WeCom Bot Key",
+    "Setup Proxy": "הגדרת פרוקסי",
+    "Proxy Protocol": "פרוטוקול פרוקסי",
+    "Proxy Server": "שרת פרוקסי",
+    "Proxy server has authentication": "לשרת ה- Proxy יש אימות",
+    "User": "מִשׁתַמֵשׁ",
+    "Installed": "מוּתקָן",
+    "Not installed": "לא מותקן",
+    "Running": "רץ",
+    "Not running": "לא רץ",
+    "Remove Token": "הסר אסימון",
+    "Start": "הַתחָלָה",
+    "Stop": "תפסיק",
+    "Uptime Kuma": "Uptime Kuma",
+    "Add New Status Page": "הוסף דף סטטוס חדש",
+    "Slug": "Slug",
+    "Accept characters:": "קבל תווים:",
+    "startOrEndWithOnly": "התחל או סוף עם {0} בלבד",
+    "No consecutive dashes": "אין מקפים רצופים",
+    "Next": "הַבָּא",
+    "The slug is already taken. Please choose another slug.": "השבלול כבר נלקח.אנא בחר שבלול נוסף.",
+    "No Proxy": "אין פרוקסי",
+    "Authentication": "אבטחה",
+    "HTTP Basic Auth": "HTTP בסיסי Auth",
+    "New Status Page": "דף סטטוס חדש",
+    "Page Not Found": "הדף לא נמצא",
+    "Reverse Proxy": "פרוקסי הפוך",
+    "Backup": "גיבוי",
+    "About": "אודות",
+    "wayToGetCloudflaredURL": "(הורד את CloudFlared מ- {0})",
+    "cloudflareWebsite": "אתר CloudFlare",
+    "Message:": "הוֹדָעָה:",
+    "Don't know how to get the token? Please read the guide:": "לא יודע איך להשיג את האסימון?אנא קרא את המדריך:",
+    "The current connection may be lost if you are currently connecting via Cloudflare Tunnel. Are you sure want to stop it? Type your current password to confirm it.": "החיבור הנוכחי עשוי ללכת לאיבוד אם אתה מתחבר כרגע באמצעות מנהרת CloudFlare.האם אתה בטוח רוצה לעצור את זה?הקלד את הסיסמה הנוכחית שלך כדי לאשר אותה.",
+    "HTTP Headers": "כותרות HTTP",
+    "Trust Proxy": "אמון בפרוקסי",
+    "Other Software": "תוכנה אחרת",
+    "For example: nginx, Apache and Traefik.": "למשל: Nginx, Apache ו- Traefik.",
+    "Please read": "בבקשה תקרא",
+    "Subject:": "נושא:",
+    "Valid To:": "תקף ל:",
+    "Days Remaining:": "ימים שנותרו:",
+    "Issuer:": "המנפיק:",
+    "Fingerprint:": "טביעת אצבע:",
+    "No status pages": "אין דפי סטטוס",
+    "Domain Name Expiry Notification": "הודעה על תום שם תחום",
+    "Proxy": "פרוקסי",
+    "Date Created": "תאריך יצירה",
+    "HomeAssistant": "Home Assistant",
+    "onebotHttpAddress": "כתובת HTTP של OneBot ",
+    "onebotMessageType": "סוג ההודעה OneBot",
+    "onebotGroupMessage": "קְבוּצָה",
+    "onebotPrivateMessage": "פְּרָטִי",
+    "onebotUserOrGroupId": "מזהה קבוצה/משתמש ",
+    "onebotSafetyTips": "לבטיחות, חייב לקבוע אסימון גישה ",
+    "PushDeer Key": "PushDeer Key",
+    "Footer Text": "טקסט כותרת תחתונה ",
+    "Show Powered By": "הצג מופעל על ידי ",
+    "Domain Names": "שמות דומיין ",
+    "signedInDisp": "חתום כ- {0} ",
+    "signedInDispDisabled": "Auth מושבת.",
+    "RadiusSecret": "רדיוס סוד",
+    "RadiusSecretDescription": "סוד משותף בין לקוח לשרת",
+    "RadiusCalledStationId": "נקרא מזהה תחנה",
+    "RadiusCalledStationIdDescription": "מזהה של המכשיר הנקרא ",
+    "RadiusCallingStationId": "מזהה תחנת שיחה ",
+    "RadiusCallingStationIdDescription": "מזהה של מכשיר השיחה ",
+    "Certificate Expiry Notification": "הודעת תפוגה של אישור",
+    "API Username": "שם משתמש API",
+    "API Key": "מפתח API",
+    "Recipient Number": "מספר הנמען",
+    "From Name/Number": "משם/מספר",
+    "Leave blank to use a shared sender number.": "השאר ריק כדי להשתמש במספר שולח משותף.",
+    "Octopush API Version": "גרסת API של תמנון",
+    "Legacy Octopush-DM": "Legacy Octopush-DM",
+    "endpoint": "נקודת קצה",
+    "octopushAPIKey": "\"מפתח API \" מתוך תעודות API של HTTP בלוח הבקרה",
+    "octopushLogin": "\"כניסה \" מתעודות API של HTTP בלוח הבקרה",
+    "promosmsLogin": "שם כניסה של API",
+    "promosmsPassword": "סיסמת API",
+    "pushoversounds pushover": "Pushover (ברירת מחדל)",
+    "pushoversounds bike": "אופניים",
+    "pushoversounds bugle": "חֲצוֹצְרָה",
+    "pushoversounds cashregister": "קופה רושמת",
+    "pushoversounds classical": "קלַאסִי",
+    "pushoversounds cosmic": "קוֹסמִי",
+    "pushoversounds falling": "נופל",
+    "pushoversounds gamelan": "gamelan",
+    "pushoversounds incoming": "נִכנָס",
+    "pushoversounds intermission": "Intermission",
+    "pushoversounds magic": "קֶסֶם",
+    "pushoversounds mechanical": "מֵכָנִי",
+    "pushoversounds pianobar": "בר פסנתר",
+    "pushoversounds siren": "סִירֶנָה",
+    "pushoversounds spacealarm": "אזעקת חלל",
+    "pushoversounds tugboat": "סירת משיכה",
+    "pushoversounds alien": "אזעקת חייזרים (ארוכה)",
+    "pushoversounds climb": "לטפס (ארוך)",
+    "pushoversounds persistent": "מתמיד (ארוך)",
+    "pushoversounds echo": "הד Pushover (ארוך)",
+    "pushoversounds updown": "למעלה (ארוך)",
+    "pushoversounds vibrate": "לרטוט בלבד",
+    "pushoversounds none": "אף אחד (שקט)",
+    "pushyAPIKey": "מפתח API סודי",
+    "pushyToken": "אסימון מכשיר",
+    "Show update if available": "הצג עדכון אם זמין",
+    "Also check beta release": "בדוק גם את שחרור הבטא",
+    "Using a Reverse Proxy?": "באמצעות פרוקסי הפוך?",
+    "Check how to config it for WebSocket": "בדוק כיצד להגדיר אותו ל- WebSocket",
+    "Steam Game Server": "שרת משחק קיטור",
+    "Most likely causes:": "ככל הנראה גורם:",
+    "The resource is no longer available.": "המשאב כבר לא זמין.",
+    "There might be a typing error in the address.": "יתכן שיש שגיאת הקלדה בכתובת.",
+    "What you can try:": "מה שאתה יכול לנסות:",
+    "Retype the address.": "הקלד מחדש את הכתובת.",
+    "Go back to the previous page.": "חזור לדף הקודם.",
+    "Coming Soon": "בקרוב",
+    "wayToGetClickSendSMSToken": "אתה יכול לקבל שם משתמש API ומפתח API מ- {0}.",
+    "Connection String": "מחרוזת חיבור",
+    "Query": "שאילתא",
+    "settingsCertificateExpiry": "תפוגת תעודת TLS",
+    "certificationExpiryDescription": "HTTPS עוקב אחר התראה על התראה כאשר תעודת TLS פגה ב:",
+    "Setup Docker Host": "הגדרת מארח Docker",
+    "Connection Type": "סוג חיבור",
+    "Docker Daemon": "Docker Daemon",
+    "deleteDockerHostMsg": "האם אתה בטוח רוצה למחוק את המארח של Docker לכל המוניטורים?",
+    "socket": "Socket",
+    "tcp": "TCP / HTTP",
+    "Docker Container": "מיכל Docker",
+    "Container Name / ID": "שם מכולה / מזהה",
+    "Docker Host": "מארח דוקר",
+    "Docker Hosts": "מארחי Docker",
+    "ntfy Topic": "ntfy Topic",
+    "Domain": "תְחוּם",
+    "Workstation": "עמדת עבודה",
+    "disableCloudflaredNoAuthMsg": "אתה לא נמצא במצב AUTH, אין צורך בסיסמה.",
+    "trustProxyDescription": "סמוך על הכותרות 'X-Forwarded-*'. אם אתה רוצה לקבל את כתובת ה-IP של הלקוח וה- Uptime Kuma שלך עומד מאחורי פרוקסי כגון Nginx או Apache, עליך להפעיל זאת.",
+    "wayToGetLineNotifyToken": "אתה יכול לקבל אסימון גישה מ- {0}",
+    "Examples": "דוגמאות",
+    "Home Assistant URL": "כתובת URL עוזרת ביתית",
+    "Long-Lived Access Token": "אסימון גישה ארוכת שנים",
+    "Long-Lived Access Token can be created by clicking on your profile name (bottom left) and scrolling to the bottom then click Create Token. ": "ניתן ליצור אסימון גישה לאורך זמן על ידי לחיצה על שם הפרופיל שלך (שמאל למטה) וגלילה לתחתית ואז לחץ על צור אסימון. ",
+    "Notification Service": "Notification Service",
+    "default: notify all devices": "default: notify all devices",
+    "A list of Notification Services can be found in Home Assistant under \"Developer Tools > Services\" search for \"notification\" to find your device/phone name.": "רשימה של שירותי הודעה ניתן למצוא בעוזר הבית תחת \"כלי מפתחים> שירותים \" חפש \"הודעה \" כדי למצוא את שם המכשיר/טלפון שלך.",
+    "Automations can optionally be triggered in Home Assistant:": "אוטומציות יכולות להיות מופעלות באופן אופציונלי לעוזר הבית:",
+    "Trigger type:": "סוג ההדק:",
+    "Event type:": "סוג אירוע:",
+    "Event data:": "נתוני אירועים:",
+    "Then choose an action, for example switch the scene to where an RGB light is red.": "ואז בחר פעולה, למשל העבר את הסצינה למקום בו אור RGB הוא אדום.",
+    "Frontend Version": "גרסת Frontend",
+    "Frontend Version do not match backend version!": "גרסת Frontend לא תואמת את גרסת Backend!",
+    "Base URL": "Base URL",
+    "goAlertInfo": "SAETRERT הוא יישום קוד פתוח לתזמון שיחה, הסלמות והודעות אוטומטיות (כמו SMS או שיחות קוליות).לעסוק אוטומטית את האדם הנכון, בדרך הנכונה ובזמן הנכון!{0}",
+    "goAlertIntegrationKeyInfo": "קבל מפתח אינטגרציה של API גנרי לשירות בפורמט זה \"AAAAAAAA-BBB-CCCC-DDDD-EEEEEEEEEEE \" בדרך כלל הערך של פרמטר האסימון של URL שהועתק.",
+    "goAlert": "GoAlert",
+    "backupOutdatedWarning": "הוצא משימוש: מכיוון שנוספו הרבה תכונות ותכונת הגיבוי הזו קצת לא מתוחזקת, היא לא יכולה ליצור או לשחזר גיבוי מלא.",
+    "backupRecommend": "אנא גבה את עוצמת הקול או את תיקיית הנתונים (./data/) ישירות במקום.",
+    "Optional": "אופציונאלי",
+    "squadcast": "Squadcast",
+    "SendKey": "SendKey",
+    "SMSManager API Docs": "מסמכי API של SmsManager ",
+    "Gateway Type": "סוג שער",
+    "SMSManager": "SMSManager",
+    "You can divide numbers with": "אתה יכול לחלק מספרים עם",
+    "or": "אוֹ",
+    "recurringInterval": "הפסקה",
+    "Recurring": "מחזורי",
+    "strategyManual": "פעיל/לא פעיל באופן ידני",
+    "warningTimezone": "זה משתמש באזור הזמן של השרת",
+    "weekdayShortMon": "שני",
+    "weekdayShortTue": "שלישי",
+    "weekdayShortWed": "רביעי",
+    "weekdayShortThu": "חמישי",
+    "weekdayShortFri": "שישי",
+    "weekdayShortSat": "שבת",
+    "weekdayShortSun": "ראשון",
+    "dayOfWeek": "יום בשבוע",
+    "dayOfMonth": "יום בחודש",
+    "lastDay": "Last Day",
+    "lastDay1": "היום האחרון של החודש",
+    "lastDay2": "יום שני האחרון של החודש",
+    "lastDay3": "יום 3 האחרון של החודש",
+    "lastDay4": "היום הרביעי האחרון בחודש",
+    "No Maintenance": "אין תחזוקה",
+    "pauseMaintenanceMsg": "האם אתה בטוח רוצה להשהות?",
+    "maintenanceStatus-under-maintenance": "מתבצעות עבודות תחזוקה",
+    "maintenanceStatus-inactive": "לא פעיל",
+    "maintenanceStatus-scheduled": "מתוזמן",
+    "maintenanceStatus-ended": "הסתיים",
+    "maintenanceStatus-unknown": "לא ידוע",
+    "Display Timezone": "הצג אזור זמן",
+    "Server Timezone": "אזור זמן של שרת",
+    "statusPageMaintenanceEndDate": "סוך",
+    "IconUrl": "קישור לתמונת אייקון",
+    "Enable DNS Cache": "הפעל מטמון DNS",
+    "Enable": "הפעל",
+    "Disable": "השבת",
+    "dnsCacheDescription": "ייתכן שהוא לא עובד בסביבות IPv6 מסוימות, השבת אותו אם אתה נתקל בבעיות כלשהן.",
+    "Single Maintenance Window": "חלון תחזוקה בודד",
+    "Maintenance Time Window of a Day": "חלון זמן תחזוקה ביום",
+    "Effective Date Range": "טווח תאריכים אפקטיבי",
+    "Schedule Maintenance": "לוח זמנים לתחזוקה",
+    "Date and Time": "תאריך ושעה",
+    "DateTime Range": "טווח תאריכים וזמן",
+    "Strategy": "אסטרטגיה",
+    "Free Mobile User Identifier": "מזהה משתמש נייד בחינם",
+    "Free Mobile API Key": "מפתח API חינם לנייד",
+    "Enable TLS": "אפשר TLS",
+    "Proto Service Name": "שם שירות פרוטו",
+    "Proto Method": "שיטת פרוטו",
+    "Proto Content": "תוכן פרוטו",
+    "Economy": "חיסכון",
+    "Lowcost": "זול",
+    "high": "גבוהה",
+    "General Monitor Type": "מוניטור כללי",
+    "Passive Monitor Type": "מוניטור פסיבי",
+    "Specific Monitor Type": "סוג מוניטור ספציפי",
+    "Custom Monitor Type": "סוג צג מותאם אישית",
+    "Monitor": "מוניטור | מוניטרים",
+    "promosmsAllowLongSMS": "אפשר SMS ארוך",
+    "loadingError": "לא ניתן לאחזר את הנתונים, אנא נסה שוב מאוחר יותר.",
+    "plugin": "תוסף | תוספים",
+    "install": "להתקין",
+    "installing": "מתקין",
+    "uninstall": "הסר את ההתקנה",
+    "uninstalling": "מסיר התקנה",
+    "confirmUninstallPlugin": "האם אתה בטוח שברצונך להסיר את התוסף הזה?",
+    "Help": "עזרה",
+    "Game": "משחק",
+    "Packet Size": "גודל חבילה",
+    "markdownSupported": "תחביר סימון נתמך (Markdown )",
+    "Custom": "מותאם אישית",
+    "ZohoCliq": "זוהו קליק",
+    "wayToGetZohoCliqURL": "אתה יכול ללמוד כיצד ליצור כתובת אתר ל-webhook {0}.",
+    "dataRetentionTimeError": "תקופת השמירה חייבת להיות 0 או יותר",
+    "infiniteRetention": "הגדר ל-0 לשמירה אינסופית.",
+    "confirmDeleteTagMsg": "האם אתה בטוח שברצונך למחוק תג זה? צגים המשויכים לתג זה לא יימחקו.",
+    "Kook": "קוק",
+    "wayToGetKookBotToken": "צור יישום וקבל את אסימון הבוט שלך ב-{0}",
+    "wayToGetKookGuildID": "הפעל את 'מצב מפתח' בהגדרת קוק, ולחץ לחיצה ימנית על הגילדה כדי לקבל את המזהה שלה",
+    "Guild ID": "מזהה גילד"
+}
diff --git a/src/lang/hr-HR.json b/src/lang/hr-HR.json
new file mode 100644
index 000000000..b909ed558
--- /dev/null
+++ b/src/lang/hr-HR.json
@@ -0,0 +1,581 @@
+{
+    "languageName": "Hrvatski",
+    "checkEverySecond": "Provjera svake {0} sekunde",
+    "retryCheckEverySecond": "Ponovni pokušaj svake {0} sekunde",
+    "retriesDescription": "Broj ponovnih pokušaja prije nego će se servis označiti kao nedostupan te poslati obavijest",
+    "ignoreTLSError": "Ignoriraj TLS/SSL pogreške za HTTPS web stranice",
+    "upsideDownModeDescription": "Preokreni logiku statusa. Ako se primi pozitivan odgovor, smatra se da je usluga nedostupna.",
+    "maxRedirectDescription": "Maksimalan broj preusmjeravanja. Postaviti na 0 kako bi se preusmjeravanja onemogućila.",
+    "acceptedStatusCodesDescription": "Odaberite statusne kodove koji se smatraju uspješnim odgovorom.",
+    "passwordNotMatchMsg": "Lozinke se ne poklapaju.",
+    "notificationDescription": "Obavijesti će funkcionirati samo ako su dodijeljene monitoru.",
+    "keywordDescription": "Ključna riječ za pretragu, u obliku običnog HTML-a ili u JSON formatu. Pretraga je osjetljiva na velika i mala slova.",
+    "deleteMonitorMsg": "Jeste li sigurni da želite izbrisati monitor?",
+    "deleteNotificationMsg": "Jeste li sigurni da želite izbrisati ovu obavijest za sve monitore?",
+    "resolverserverDescription": "Cloudflare je zadani DNS poslužitelj. Možete to promijeniti u bilo kojem trenutku.",
+    "rrtypeDescription": "Odaberite vrstu DNS zapisa o resursu kojeg želite pratiti",
+    "pauseMonitorMsg": "Jeste li sigurni da želite pauzirati?",
+    "enableDefaultNotificationDescription": "Ova će obavijesti biti omogućena za sve nove monitore. Možete ju ručno onemogućiti za pojedini monitor.",
+    "clearEventsMsg": "Jeste li sigurni da želite izbrisati sve zapise o događajima za ovaj monitor?",
+    "clearHeartbeatsMsg": "Jeste li sigurni da želite izbrisati sve zapise o provjerama za ovaj monitor?",
+    "confirmClearStatisticsMsg": "Jeste li sigurni da želite izbrisati SVE statistike?",
+    "importHandleDescription": "Odaberite opciju \"Preskoči postojeće\" ako želite preskočiti uvoz postojećih monitora i obavijesti ako dođe do poklapanja u imenu. Opcija \"Prepiši\" će izbrisati postojeće monitore i obavijesti.",
+    "confirmImportMsg": "Jeste li sigurni da želite pokrenuti uvoz? Provjerite jeste li odabrali ispravnu opciju uvoza.",
+    "twoFAVerifyLabel": "Unesite svoj 2FA token:",
+    "tokenValidSettingsMsg": "Token je važeći! Sada možete spremiti postavke dvofaktorske autentikacije.",
+    "confirmEnableTwoFAMsg": "Želite li omogućiti dvofaktorsku autentikaciju?",
+    "confirmDisableTwoFAMsg": "Jeste li sigurni da želite onemogućiti dvofaktorsku autentikaciju?",
+    "Settings": "Postavke",
+    "Dashboard": "Kontrolna ploča",
+    "New Update": "Novo ažuriranje",
+    "Language": "Jezik",
+    "Appearance": "Izgled",
+    "Theme": "Tema",
+    "General": "Općenito",
+    "Primary Base URL": "Osnovni URL",
+    "Version": "Inačica",
+    "Check Update On GitHub": "Provjeri dostupnost nove inačice na GitHubu",
+    "List": "Popis",
+    "Add": "Dodaj",
+    "Add New Monitor": "Dodaj novi Monitor",
+    "Quick Stats": "Statistika",
+    "Up": "Dostupno",
+    "Down": "Nedostupno",
+    "Pending": "U tijeku",
+    "Unknown": "Nepoznato",
+    "pauseDashboardHome": "Pauzirano",
+    "Name": "Naziv",
+    "Status": "Status",
+    "DateTime": "Vremenska oznaka",
+    "Message": "Izvještaj",
+    "No important events": "Nema važnih događaja",
+    "Pause": "Pauziraj",
+    "Resume": "Nastavi",
+    "Edit": "Uredi",
+    "Delete": "Obriši",
+    "Current": "Trenutno",
+    "Uptime": "Dostupnost",
+    "Cert Exp.": "Istek cert.",
+    "day": "dan | dana",
+    "-day": "-dnevno",
+    "hour": "sat",
+    "-hour": "-satno",
+    "Response": "Odgovor",
+    "Ping": "Odziv",
+    "Monitor Type": "Vrsta Monitora",
+    "Keyword": "Ključna riječ",
+    "Friendly Name": "Prilagođen naziv",
+    "URL": "URL",
+    "Hostname": "Domaćin",
+    "Port": "Port",
+    "Heartbeat Interval": "Interval provjere",
+    "Retries": "Broj ponovnih pokušaja",
+    "Heartbeat Retry Interval": "Interval ponovnih pokušaja",
+    "Advanced": "Napredne postavke",
+    "Upside Down Mode": "Obrnuti način",
+    "Max. Redirects": "Maksimalan broj preusmjeravanja",
+    "Accepted Status Codes": "Prihvaćeni statusni kodovi",
+    "Push URL": "Push URL",
+    "needPushEvery": "Potrebno je slati zahtjeve na URL svakih {0} sekundi.",
+    "pushOptionalParams": "Neobavezni parametri: {0}",
+    "Save": "Spremi",
+    "Notifications": "Obavijesti",
+    "Not available, please setup.": "Nije dostupno, potrebno je dodati novu stavku.",
+    "Setup Notification": "Dodaj obavijest",
+    "Light": "Svijetli način",
+    "Dark": "Tamni način",
+    "Auto": "Automatski",
+    "Theme - Heartbeat Bar": "Tema za traku dostupnosti",
+    "Normal": "Normalno",
+    "Bottom": "Ispod",
+    "None": "Isključeno",
+    "Timezone": "Vremenska zona",
+    "Search Engine Visibility": "Vidljivost tražilicama",
+    "Allow indexing": "Dopusti indeksiranje",
+    "Discourage search engines from indexing site": "Sprječavanje indeksiranja",
+    "Change Password": "Promjena lozinke",
+    "Current Password": "Trenutna lozinka",
+    "New Password": "Nova lozinka",
+    "Repeat New Password": "Potvrdite novu lozinku",
+    "Update Password": "Spremi novu lozinku",
+    "Disable Auth": "Onemogući autentikaciju",
+    "Enable Auth": "Omogući autentikaciju",
+    "disableauth.message1": "Jeste li sigurni da želite <strong>isključiti autentikaciju</strong>?",
+    "disableauth.message2": "To je za <strong>korisnike koji imaju vanjsku autentikaciju stranice</strong> ispred Uptime Kume, poput usluge Cloudflare Access.",
+    "Please use this option carefully!": "Pažljivo koristite ovu opciju.",
+    "Logout": "Odjava",
+    "Leave": "Poništi",
+    "I understand, please disable": "Razumijem, svejedno onemogući",
+    "Confirm": "Potvrda",
+    "Yes": "Da",
+    "No": "Ne",
+    "Username": "Korisničko ime",
+    "Password": "Lozinka",
+    "Remember me": "Zapamti me",
+    "Login": "Prijava",
+    "No Monitors, please": "Nema monitora, ",
+    "add one": "dodaj jedan",
+    "Notification Type": "Tip obavijesti",
+    "Email": "E-pošta",
+    "Test": "Testiraj",
+    "Certificate Info": "Informacije o certifikatu",
+    "Resolver Server": "DNS poslužitelj",
+    "Resource Record Type": "Vrsta DNS zapisa",
+    "Last Result": "Posljednji rezultat",
+    "Create your admin account": "Stvori administratorski račun",
+    "Repeat Password": "Potvrda lozinke",
+    "Import Backup": "Uvoz sigurnosne kopije",
+    "Export Backup": "Izvoz sigurnosne kopije",
+    "Export": "Izvoz",
+    "Import": "Uvoz",
+    "respTime": "Vrijeme odgovora (ms)",
+    "notAvailableShort": "ne postoji",
+    "Default enabled": "Omogući za nove monitore",
+    "Apply on all existing monitors": "Primijeni na postojeće monitore",
+    "Create": "Kreiraj",
+    "Clear Data": "Obriši podatke",
+    "Events": "Događaji",
+    "Heartbeats": "Provjere",
+    "Auto Get": "Automatski dohvat",
+    "backupDescription": "Moguće je napraviti sigurnosnu kopiju svih monitora i obavijesti koja će biti spremljena kao JSON datoteka.",
+    "backupDescription2": "Napomena: povijest i podaci o događajima nisu uključeni u sigurnosnu kopiju.",
+    "backupDescription3": "Osjetljivi podaci poput tokena za obavijesti uključeni su u sigurnosnu kopiju. Zato je potrebno čuvati izvoz na sigurnom mjestu.",
+    "alertNoFile": "Datoteka za uvoz nije odabrana.",
+    "alertWrongFileType": "Datoteka za uvoz nije u JSON formatu.",
+    "Clear all statistics": "Obriši sve statistike",
+    "Skip existing": "Preskoči postojeće",
+    "Overwrite": "Prepiši",
+    "Options": "Opcije",
+    "Keep both": "Zadrži sve",
+    "Verify Token": "Provjeri Token",
+    "Setup 2FA": "Postavi dvofaktorsku autentikaciju",
+    "Enable 2FA": "Omogući dvofaktorsku autentikaciju",
+    "Disable 2FA": "Onemogući dvofaktorsku autentikaciju",
+    "2FA Settings": "Postavke 2FA",
+    "Two Factor Authentication": "Dvofaktorska autentikacija",
+    "Active": "Aktivna",
+    "Inactive": "Neaktivno",
+    "Token": "Token",
+    "Show URI": "Pokaži URI",
+    "Tags": "Oznake",
+    "Add New below or Select...": "Dodajte novu oznaku ispod ili odaberite...",
+    "Tag with this name already exist.": "Oznaka s tim nazivom već postoji",
+    "Tag with this value already exist.": "Oznaka s tom vrijednošću već postoji.",
+    "color": "Boja",
+    "value (optional)": "Vrijednost (neobavezno)",
+    "Gray": "Siva",
+    "Red": "Crvena",
+    "Orange": "Narančasta",
+    "Green": "Zelena",
+    "Blue": "Plava",
+    "Indigo": "Indigo",
+    "Purple": "Ljubičasta",
+    "Pink": "Ružičasta",
+    "Search...": "Pretraga...",
+    "Avg. Ping": "Prosječni odziv",
+    "Avg. Response": "Prosječni odgovor",
+    "Entry Page": "Početna stranica",
+    "statusPageNothing": "Ovdje nema ničega, dodajte grupu ili monitor.",
+    "No Services": "Nema usluga",
+    "All Systems Operational": "Svi sustavi su operativni",
+    "Partially Degraded Service": "Usluga djelomično nedostupna",
+    "Degraded Service": "Usluga nedostupna",
+    "Add Group": "Dodaj grupu",
+    "Add a monitor": "Dodaj monitor",
+    "Edit Status Page": "Uredi Statusnu stranicu",
+    "Go to Dashboard": "Na Kontrolnu ploču",
+    "Status Page": "Statusna stranica",
+    "Status Pages": "Statusne stranice",
+    "defaultNotificationName": "Moja {number}. {notification} obavijest",
+    "here": "ovdje",
+    "Required": "Potrebno",
+    "telegram": "Telegram",
+    "Bot Token": "Token bota",
+    "wayToGetTelegramToken": "Token možete nabaviti preko {0}.",
+    "Chat ID": "ID razgovora",
+    "supportTelegramChatID": "Podržani su ID-jevi izravnih razgovora, grupa i kanala",
+    "wayToGetTelegramChatID": "ID razgovora možete saznati tako da botu pošaljete poruku te odete na ovaj URL:",
+    "YOUR BOT TOKEN HERE": "OVDJE IDE TOKEN BOTA",
+    "chatIDNotFound": "ID razgovora nije pronađen; prvo morate poslati poruku botu",
+    "webhook": "Webhook",
+    "Post URL": "URL Post zahtjeva",
+    "Content Type": "Tip sadržaja (Content Type)",
+    "webhookJsonDesc": "{0} je dobra opcija za moderne HTTP poslužitelje poput Express.js-a",
+    "webhookFormDataDesc": "{multipart} je moguća alternativa za PHP, samo je potrebno parsirati JSON koristeći {decodeFunction}",
+    "smtp": "E-mail (SMTP)",
+    "secureOptionNone": "Bez sigurnosti / STARTTLS (25, 587)",
+    "secureOptionTLS": "TLS (465)",
+    "Ignore TLS Error": "Ignoriraj greške TLS-a",
+    "From Email": "Adresa za \"From\" polje",
+    "emailCustomSubject": "Prilagođeno \"Subject\" polje",
+    "To Email": "Odredišne adrese e-pošte",
+    "smtpCC": "Cc",
+    "smtpBCC": "Bcc",
+    "discord": "Discord",
+    "Discord Webhook URL": "URL Discord webhooka",
+    "wayToGetDiscordURL": "Ovo možete dobiti tako da odete na Postavke servera -> Integracije -> Napravi webhook",
+    "Bot Display Name": "Nadimak Bota unutar servera",
+    "Prefix Custom Message": "Prefiks prilagođene poruke",
+    "Hello @everyone is...": "Pozdrav {'@'}everyone...",
+    "teams": "Microsoft Teams",
+    "Webhook URL": "URL webhooka",
+    "wayToGetTeamsURL": "Više informacija o Teams webhookovima možete pročitati {0}.",
+    "signal": "Signal",
+    "Number": "Broj",
+    "Recipients": "Primatelji",
+    "needSignalAPI": "Potreban je klijent s REST sučeljem.",
+    "wayToCheckSignalURL": "Više informacija o postavljanju Signal klijenta:",
+    "signalImportant": "VAŽNO: Grupe i brojevi se ne mogu istovremeno koristiti kao primatelji!",
+    "gotify": "Gotify",
+    "Application Token": "Token Aplikacije",
+    "Server URL": "URL poslužitelja",
+    "Priority": "Prioritet",
+    "slack": "Slack",
+    "Icon Emoji": "Emotikon",
+    "Channel Name": "Naziv kanala",
+    "Uptime Kuma URL": "Uptime Kuma URL",
+    "aboutWebhooks": "Dodatne informacije o webhookovima su dostupne na: {0}",
+    "aboutChannelName": "Unesite ime {0} kanala u polju Naziv kanala ako želite zaobići webhook kanal. Primjerice: #neki-kanal",
+    "aboutKumaURL": "Ako je polje \"Uptime Kuma URL\" prazno, koristi se zadana vrijednost koja vodi na GitHub stranicu projekta.",
+    "emojiCheatSheet": "Popis emotikona: {0}",
+    "rocket.chat": "Rocket.Chat",
+    "pushover": "Pushover",
+    "pushy": "Pushy",
+    "octopush": "Octopush",
+    "promosms": "PromoSMS",
+    "clicksendsms": "ClickSend SMS",
+    "lunasea": "LunaSea",
+    "apprise": "Apprise (Podržava preko 50 usluga za obavijesti)",
+    "pushbullet": "Pushbullet",
+    "line": "LINE",
+    "mattermost": "Mattermost",
+    "User Key": "Korisnički ključ",
+    "Device": "Uređaji",
+    "Message Title": "Naslov poruke",
+    "Notification Sound": "Zvuk obavijesti",
+    "More info on:": "Više informacija na: {0}",
+    "pushoverDesc1": "Hitni prioritet (2) ima zadani istek vremena od 30 sekundi između ponovnih pokušaja te će isteći nakon 1 sata.",
+    "pushoverDesc2": "Ako želite slati obavijesti na više uređaja, ispunite polje \"Uređaji\".",
+    "SMS Type": "Tip SMS-a",
+    "octopushTypePremium": "Premium (Brzo - preporučeno za obavijesti)",
+    "octopushTypeLowCost": "Low Cost (Sporo - mobilni operateri ponekad blokiraju ove poruke)",
+    "checkPrice": "Provjerite {0} cijene:",
+    "apiCredentials": "Vjerodajnice za API",
+    "octopushLegacyHint": "Koristite li staru inačicu usluge Octopush (2011-2020) ili noviju inačicu?",
+    "Check octopush prices": "Provjerite cijene usluge Octopush {0}.",
+    "octopushPhoneNumber": "Telefonski broj (međunarodni format, primjerice: +38512345678) ",
+    "octopushSMSSender": "Naziv SMS pošiljatelja : 3-11 alfanumeričkih znakova i razmak (a-zA-Z0-9)",
+    "LunaSea Device ID": "LunaSea ID Uređaja",
+    "Apprise URL": "URL usluge Apprise",
+    "Example:": "Primjerice: {0}",
+    "Read more:": "Pročitajte više: {0}",
+    "Status:": "Status: {0}",
+    "Read more": "Pročitaj više",
+    "appriseInstalled": "Apprise je instaliran.",
+    "appriseNotInstalled": "Apprise nije instaliran. {0}",
+    "Access Token": "Pristupni token",
+    "Channel access token": "Token za pristup kanalu",
+    "Line Developers Console": "LINE razvojnoj konzoli",
+    "lineDevConsoleTo": "LINE razvojna konzola - {0}",
+    "Basic Settings": "Osnovne Postavke",
+    "User ID": "Korisnički ID",
+    "Messaging API": "API za razmjenu poruka",
+    "wayToGetLineChannelToken": "Prvo, pristupite {0}, kreirajte pružatelja usluga te kanal (API za razmjenu poruka), zatim možete dobiti token za pristup kanalu te korisnički ID za polja iznad.",
+    "Icon URL": "URL slike",
+    "aboutIconURL": "Možete postaviti poveznicu na sliku u polju \"URL slike\" kako biste spriječili korištenje zadane slike. Ovo se polje neće koristiti ako je postavljeno polje \"Emotikon\".",
+    "aboutMattermostChannelName": "Možete promijeniti kanal u kojeg webhook šalje tako da ispunite polje \"Naziv kanala\". Ta opcija mora biti omogućena unutar Mattermost postavki za webhook. Primjerice: #neki-kanal",
+    "matrix": "Matrix",
+    "promosmsTypeEco": "SMS ECO - jeftina, ali spora opcija koja je često preopterećena. Ograničeno samo na primatelje unutar Poljske.",
+    "promosmsTypeFlash": "SMS FLASH - Poruka se automatski pojavljuje na uređaju primatelja. Ograničeno samo na primatelje unutar Poljske.",
+    "promosmsTypeFull": "SMS FULL - Premium razina usluge, dozvoljava postavljanje naziva SMS pošiljatelja (Naziv mora biti registriran). Usluga pouzdana za obavijesti.",
+    "promosmsTypeSpeed": "SMS SPEED - Usluga najvećeg prioriteta. Brza i pouzdana, ali skupa (otprilike dvostruko skuplja od cijene usluge SMS FULL).",
+    "promosmsPhoneNumber": "Telefonski broj (za primatelje unutar Poljske nije potrebno navoditi pozivni broj države)",
+    "promosmsSMSSender": "Naziv SMS pošiljatelja: Registriran naziv ili jedan od zadanih: InfoSMS, SMS Info, MaxSMS, INFO, SMS",
+    "Feishu WebHookUrl": "Feishu URL webhooka",
+    "matrixHomeserverURL": "URL Matrix homeservera (uključujući http(s):// te port, ako je potrebno)",
+    "Internal Room Id": "Interni ID sobe",
+    "matrixDesc1": "Interni ID sobe se može pronaći u naprednim postavkama sobe unutar Matrix klijenta. ID sobe nalikuje idućem zapisu: !QMdRCpUIfLwsfjxye6:home.server.",
+    "matrixDesc2": "Preporučuje se stvaranje novog korisnika te suzdržavanje od korištenja pristupnog tokena vlastitog Matrix korisnika. Novog korisnika potrebno je dodati u sobe u kojima želite primati obavijesti. Pristupni token možete dobiti pokretanjem naredbe {0}",
+    "Method": "Metoda",
+    "Body": "Tijelo",
+    "Headers": "Zaglavlja",
+    "PushUrl": "Push URL",
+    "HeadersInvalidFormat": "Zaglavlja nisu nije valjani JSON: ",
+    "BodyInvalidFormat": "Tijelo zahtjeva nije valjani JSON: ",
+    "Monitor History": "Povijest monitora",
+    "clearDataOlderThan": "Podaci o povijesti monitora čuvaju se {0} dana.",
+    "PasswordsDoNotMatch": "Lozinke se ne poklapaju.",
+    "records": "zapisa",
+    "One record": "Jedan zapis",
+    "Showing {from} to {to} of {count} records": "Prikaz zapisa {from}-{to} od sveukupno {count}",
+    "steamApiKeyDescription": "Za praćenje Steam poslužitelja za igru, potrebno je imati Steam Web-API ključ. Možete registrirati vlastiti ključ ovdje: ",
+    "Current User": "Trenutni korisnik",
+    "recent": "Nedavno",
+    "Done": "Gotovo",
+    "Info": "Informacije",
+    "Security": "Sigurnost",
+    "Shrink Database": "Smanji bazu podataka",
+    "Pick a RR-Type...": "Odaberite vrstu DNS zapisa od navedenih...",
+    "Pick Accepted Status Codes...": "Odaberite HTTP statusne kodove koji će biti prihvaćeni...",
+    "Steam API Key": "Steam API ključ",
+    "Default": "Zadano",
+    "HTTP Options": "HTTP Postavke",
+    "Create Incident": "Novi izvještaj o incidentu",
+    "Title": "Naslov",
+    "Content": "Sadržaj",
+    "Style": "Stil",
+    "info": "informacija",
+    "warning": "upozorenje",
+    "danger": "opasnost",
+    "primary": "primarno",
+    "light": "svijetlo",
+    "dark": "tamno",
+    "Post": "Objavi",
+    "Created": "Stvoreno",
+    "Last Updated": "Uređeno",
+    "Please input title and content": "Naslov i sadržaj ne mogu biti prazni",
+    "Unpin": "Ukloni",
+    "Switch to Light Theme": "Prebaci na svijetli način",
+    "Switch to Dark Theme": "Prebaci na tamni način",
+    "Show Tags": "Pokaži oznake",
+    "Hide Tags": "Sakrij oznake",
+    "Description": "Opis",
+    "No monitors available.": "Nema dostupnih monitora.",
+    "Add one": "Stvori jednog",
+    "No Monitors": "Bez monitora",
+    "Untitled Group": "Bezimena grupa",
+    "Services": "Usluge",
+    "Discard": "Odbaci",
+    "Cancel": "Otkaži",
+    "Powered by": "Pokreće",
+    "Saved": "Spremljeno",
+    "PushByTechulus": "Push by Techulus",
+    "GoogleChat": "Google Chat (preko platforme Google Workspace)",
+    "shrinkDatabaseDescription": "Pokreni VACUUM operaciju za SQLite. Ako je baza podataka kreirana nakon inačice 1.10.0, AUTO_VACUUM opcija već je uključena te ova akcija nije nužna.",
+    "serwersms": "SerwerSMS.pl",
+    "serwersmsAPIUser": "API korisničko ime (uključujući webapi_ prefiks)",
+    "serwersmsAPIPassword": "API lozinka",
+    "serwersmsPhoneNumber": "Broj telefona",
+    "serwersmsSenderName": "Ime SMS pošiljatelja (registrirano preko korisničkog portala)",
+    "stackfield": "Stackfield",
+    "smtpDkimSettings": "DKIM postavke",
+    "smtpDkimDesc": "Za više informacija, postoji Nodemailer DKIM {0}.",
+    "documentation": "dokumentacija",
+    "smtpDkimDomain": "Domena",
+    "smtpDkimKeySelector": "Odabir ključa",
+    "smtpDkimPrivateKey": "Privatni ključ",
+    "smtpDkimHashAlgo": "Hash algoritam (neobavezno)",
+    "smtpDkimheaderFieldNames": "Ključevi zaglavlja za potpis (neobavezno)",
+    "smtpDkimskipFields": "Ključevi zaglavlja koji se neće potpisati (neobavezno)",
+    "gorush": "Gorush",
+    "alerta": "Alerta",
+    "alertaApiEndpoint": "Krajnja točka API-ja (Endpoint)",
+    "alertaEnvironment": "Okruženje (Environment)",
+    "alertaApiKey": "API ključ",
+    "alertaAlertState": "Stanje upozorenja",
+    "alertaRecoverState": "Stanje oporavka",
+    "deleteStatusPageMsg": "Sigurno želite obrisati ovu statusnu stranicu?",
+    "resendEveryXTimes": "Ponovno pošalji svakih {0} puta",
+    "resendDisabled": "Ponovno slanje je onemogućeno",
+    "dnsPortDescription": "Port DNS poslužitelja. Zadana vrijednost je 53. Moguće je promijeniti ga u svakom trenutku.",
+    "Resend Notification if Down X times consecutively": "Ponovno pošalji obavijest ako je usluga nedostupna više puta zaredom",
+    "topic": "Tema",
+    "topicExplanation": "MQTT tema koja će se monitorirati",
+    "successMessage": "Poruka o uspjehu",
+    "successMessageExplanation": "MQTT poruka koja se smatra uspješnom",
+    "error": "greška",
+    "critical": "kritično",
+    "Customize": "Customize",
+    "Custom Footer": "Prilagođeno podnožje",
+    "Custom CSS": "Prilagođeni CSS",
+    "wayToGetPagerDutyKey": "Ključ možete dobiti odlaskom na \"Service -> Service Directory -> (Odabrani servis) -> Integrations -> Add integration\". Ovdje pretražite za \"Events API V2\". Više informacija {0}",
+    "Integration Key": "Ključ integracije",
+    "Integration URL": "URL integracije",
+    "Auto resolve or acknowledged": "Automatsko razrješavanje i priznavanje",
+    "do nothing": "Ne radi ništa",
+    "auto acknowledged": "Automatsko priznavanje",
+    "auto resolve": "Automatsko razrješavanje",
+    "Proxies": "Proxy poslužitelji",
+    "default": "Zadano",
+    "enabled": "Omogućeno",
+    "setAsDefault": "Postavi kao zadano",
+    "deleteProxyMsg": "Sigurno želite obrisati ovaj proxy za sve monitore?",
+    "proxyDescription": "Proxy poslužitelji moraju biti dodijeljni monitoru kako bi funkcionirali.",
+    "enableProxyDescription": "Onemogućeni proxy poslužitelj neće imati učinak na zahtjeve monitora. Možete privremeno onemogućiti proxy poslužitelja za sve monitore.",
+    "setAsDefaultProxyDescription": "Ovaj proxy poslužitelj bit će odmah omogućen za nove monitore. I dalje ga možete onemogućiti za svaki monitor zasebno.",
+    "Certificate Chain": "Lanac certifikata",
+    "Valid": "Važeći",
+    "Invalid": "Nevažeći",
+    "AccessKeyId": "AccessKey ID",
+    "SecretAccessKey": "AccessKey tajni ključ",
+    "PhoneNumbers": "Telefonski brojevi",
+    "TemplateCode": "Predložak koda",
+    "SignName": "Potpis",
+    "Sms template must contain parameters: ": "SMS predložak mora sadržavati parametre: ",
+    "Bark Endpoint": "Bark krajnja točka (endpoint)",
+    "Bark Group": "Bark grupa",
+    "Bark Sound": "Bark zvuk",
+    "WebHookUrl": "WebHookUrl",
+    "SecretKey": "Tajni ključ",
+    "For safety, must use secret key": "Korištenje tajnog ključa je obavezno",
+    "Device Token": "Token uređaja",
+    "Platform": "Platforma",
+    "iOS": "iOS",
+    "Android": "Android",
+    "Huawei": "Huawei",
+    "High": "Visoko",
+    "Retry": "Ponovnih pokušaja",
+    "Topic": "Tema",
+    "WeCom Bot Key": "WeCom ključ Bota",
+    "Setup Proxy": "Dodaj proxy poslužitelj",
+    "Proxy Protocol": "Protokol",
+    "Proxy Server": "Proxy poslužitelj",
+    "Proxy server has authentication": "Proxy poslužitelj ima autentikaciju",
+    "User": "Korisnik",
+    "Installed": "Instalirano",
+    "Not installed": "Nije instalirano",
+    "Running": "Pokrenuto",
+    "Not running": "Nije pokrenuto",
+    "Remove Token": "Ukloni Token",
+    "Start": "Pokreni",
+    "Stop": "Zaustavi",
+    "Uptime Kuma": "Uptime Kuma",
+    "Add New Status Page": "Dodaj novu statusnu stranicu",
+    "Slug": "Slug",
+    "Accept characters:": "Dozvoljeni znakovi:",
+    "startOrEndWithOnly": "Započinje ili završava znakovima {0}",
+    "No consecutive dashes": "Bez uzastopnih povlaka",
+    "Next": "Sljedeće",
+    "The slug is already taken. Please choose another slug.": "Slug je zauzet. Odaberite novi slug.",
+    "No Proxy": "Bez proxy poslužitelja",
+    "Authentication": "Autentikacija",
+    "HTTP Basic Auth": "HTTP Basic Auth",
+    "New Status Page": "Dodaj statusnu stranicu",
+    "Page Not Found": "Stranica nije pronađena",
+    "Reverse Proxy": "Reverzni proxy",
+    "Backup": "Sigurnosno kopiranje",
+    "About": "O Uptime Kumi",
+    "wayToGetCloudflaredURL": "(Preuzmite cloudflared s {0})",
+    "cloudflareWebsite": "Cloudflare web stranice",
+    "Message:": "Poruka:",
+    "Don't know how to get the token? Please read the guide:": "Ne znate kako doći do tokena? Pročitajte vodič:",
+    "The current connection may be lost if you are currently connecting via Cloudflare Tunnel. Are you sure want to stop it? Type your current password to confirm it.": "Trenutna veza možda bude prekinuta jer se koristi Cloudflare tuneliranje. Sigurno želite zaustaviti? Unesite lozinku za potvrdu.",
+    "HTTP Headers": "HTTP zaglavlja",
+    "Trust Proxy": "Vjeruj proxy poslužitelju",
+    "Other Software": "Ostali programi",
+    "For example: nginx, Apache and Traefik.": "Primjerice: nginx, Apache ili Traefik.",
+    "Please read": "Molimo pročitajte",
+    "Subject:": "Predmet:",
+    "Valid To:": "Valjano do:",
+    "Days Remaining:": "Preostalo dana:",
+    "Issuer:": "Izdavatelj:",
+    "Fingerprint:": "Fingerprint:",
+    "No status pages": "Nema statusnih stranica",
+    "Domain Name Expiry Notification": "Obavijest za istek domena",
+    "Proxy": "Proxy",
+    "Date Created": "Datum stvaranja",
+    "HomeAssistant": "Home Assistant",
+    "onebotHttpAddress": "OneBot HTTP adresa",
+    "onebotMessageType": "OneBot tip poruke",
+    "onebotGroupMessage": "Grupna",
+    "onebotPrivateMessage": "Privatna",
+    "onebotUserOrGroupId": "ID korisnika/grupe",
+    "onebotSafetyTips": "Pristupni token mora biti postavljen",
+    "PushDeer Key": "PushDeer ključ",
+    "Footer Text": "Tekst podnožja",
+    "Show Powered By": "Pokaži natpis 'Pokreće...'",
+    "Domain Names": "Domene",
+    "signedInDisp": "Prijavljeni ste kao {0}",
+    "signedInDispDisabled": "Autentikacija onemogućena.",
+    "RadiusSecret": "Radius Tajna",
+    "RadiusSecretDescription": "Dijeljena Tajna između klijenta i poslužitelja",
+    "RadiusCalledStationId": "Called Station ID",
+    "RadiusCalledStationIdDescription": "Identifikator pozivne stanice",
+    "RadiusCallingStationId": "Calling Station ID",
+    "RadiusCallingStationIdDescription": "Identifikator pozivajuće stanice",
+    "Certificate Expiry Notification": "Obavijest za istek certifikata",
+    "API Username": "API korisničko ime",
+    "API Key": "API ključ",
+    "Recipient Number": "Broj primatelja",
+    "From Name/Number": "Naziv/broj pošiljatelja",
+    "Leave blank to use a shared sender number.": "Ostaviti prazno za korištenje dijeljenog broja pošiljatelja.",
+    "Octopush API Version": "Octopush verzija API-ja",
+    "Legacy Octopush-DM": "Legacy Octopush-DM",
+    "endpoint": "krajnja točka (endpoint)",
+    "octopushAPIKey": "\"API ključ\" iz HTTP API postavki",
+    "octopushLogin": "\"Korisničko ime\" iz HTTP API postavki",
+    "promosmsLogin": "API korisničko ime",
+    "promosmsPassword": "API lozinka",
+    "pushoversounds pushover": "Pushover (default)",
+    "pushoversounds bike": "Bike",
+    "pushoversounds bugle": "Bugle",
+    "pushoversounds cashregister": "Cash Register",
+    "pushoversounds classical": "Classical",
+    "pushoversounds cosmic": "Cosmic",
+    "pushoversounds falling": "Falling",
+    "pushoversounds gamelan": "Gamelan",
+    "pushoversounds incoming": "Incoming",
+    "pushoversounds intermission": "Intermission",
+    "pushoversounds magic": "Magic",
+    "pushoversounds mechanical": "Mechanical",
+    "pushoversounds pianobar": "Piano Bar",
+    "pushoversounds siren": "Siren",
+    "pushoversounds spacealarm": "Space Alarm",
+    "pushoversounds tugboat": "Tug Boat",
+    "pushoversounds alien": "Alien Alarm (long)",
+    "pushoversounds climb": "Climb (long)",
+    "pushoversounds persistent": "Persistent (long)",
+    "pushoversounds echo": "Pushover Echo (long)",
+    "pushoversounds updown": "Up Down (long)",
+    "pushoversounds vibrate": "Vibrate Only",
+    "pushoversounds none": "None (silent)",
+    "pushyAPIKey": "Tajni API ključ",
+    "pushyToken": "Token uređaja",
+    "Show update if available": "Pokaži moguću nadogradnju",
+    "Also check beta release": "Provjeravaj i za beta izdanja",
+    "Using a Reverse Proxy?": "Koristi li se reverzni proxy?",
+    "Check how to config it for WebSocket": "Provjerite kako se konfigurira za WebSocket protokol",
+    "Steam Game Server": "Steam poslužitelj igre",
+    "Most likely causes:": "Najvjerojatniji uzroci:",
+    "The resource is no longer available.": "Resurs više nije dostupan.",
+    "There might be a typing error in the address.": "Možda je nastala greška pri upisu adrese.",
+    "What you can try:": "Što možete pokušati:",
+    "Retype the address.": "Ponovno napišite adresu.",
+    "Go back to the previous page.": "Vratite se na prethodnu stranicu.",
+    "Coming Soon": "Dolazi uskoro",
+    "wayToGetClickSendSMSToken": "Možete dobiti API korisničko ime i API ključ sa {0}.",
+    "Connection String": "Tekst veze",
+    "Query": "Upit",
+    "settingsCertificateExpiry": "TLS istek certifikata",
+    "certificationExpiryDescription": "HTTPS monitori će obavijesiti kada je istek TLS certifikata za:",
+    "Setup Docker Host": "Dodaj Docker domaćina",
+    "Connection Type": "Tip veze",
+    "Docker Daemon": "Docker daemon",
+    "deleteDockerHostMsg": "Sigurno želite izbrisati ovog Docker domaćina za sve monitore?",
+    "socket": "Docker socket",
+    "tcp": "TCP / HTTP",
+    "Docker Container": "Docker kontejner",
+    "Container Name / ID": "Naziv / ID kontejnera",
+    "Docker Host": "Docker domaćin",
+    "Docker Hosts": "Docker domaćini",
+    "ntfy Topic": "ntfy tema",
+    "Domain": "Domena",
+    "Workstation": "Radna stanica",
+    "disableCloudflaredNoAuthMsg": "Lozinka nije nužna dok je isključena autentikacija.",
+    "trustProxyDescription": "Vjeruj 'X-Forwarded-*' zaglavljima. Ako želite dobiti ispravnu IP adresu klijenta i Uptime Kuma je iza reverznog proxy poslužitelja, trebate omogućiti ovo.",
+    "wayToGetLineNotifyToken": "Možete dobiti pristupni token sa {0}",
+    "Examples": "Primjeri",
+    "Home Assistant URL": "URL Home Assistanta",
+    "Long-Lived Access Token": "Dugotrajni pristupni token",
+    "Long-Lived Access Token can be created by clicking on your profile name (bottom left) and scrolling to the bottom then click Create Token. ": "Dugotrajni pristupni token može se kreirati klikom na korisničko ime (dolje lijevo) u Home Assistantu, pomicanjem do dna, te klikom na 'Create Token'. ",
+    "Notification Service": "Notification Service",
+    "default: notify all devices": "zadano ponašanje: obavijesti sve uređaje",
+    "A list of Notification Services can be found in Home Assistant under \"Developer Tools > Services\" search for \"notification\" to find your device/phone name.": "Popis servisa za obavijesti u Home Assistantu nalaze se pod \"Developer Tools > Services\" te pretražiti \"notification\".",
+    "Automations can optionally be triggered in Home Assistant:": "Automacije se mogu okinuti u Home Assistantu:",
+    "Trigger type:": "Tip triggera:",
+    "Event type:": "Tip eventa:",
+    "Event data:": "Podaci eventa:",
+    "Then choose an action, for example switch the scene to where an RGB light is red.": "Potrebno je i odabrati akciju za izvođenje na Home Assistantu.",
+    "Frontend Version": "Inačica sučelja",
+    "Frontend Version do not match backend version!": "Inačica sučelja ne odgovara poslužitelju!"
+}
diff --git a/src/lang/hu.json b/src/lang/hu.json
new file mode 100644
index 000000000..bc2ded73e
--- /dev/null
+++ b/src/lang/hu.json
@@ -0,0 +1,418 @@
+{
+    "languageName": "Magyar",
+    "checkEverySecond": "Ellenőrzés {0} másodpercenként",
+    "retryCheckEverySecond": "Újrapróbál {0} másodpercenként.",
+    "retriesDescription": "Maximális próbálkozás mielőtt a szolgáltatás 'Leállt' jelölést kap és értesítés kerül kiküldésre",
+    "ignoreTLSError": "TLS/SSL hibák figyelmen kívül hagyása HTTPS weboldalaknál",
+    "upsideDownModeDescription": "Az állapot megfordítása. Ha a szolgáltatás elérhető, akkor lesz leállt állapotú.",
+    "maxRedirectDescription": "Az átirányítások maximális száma. állítsa 0-ra az átirányítás tiltásához.",
+    "acceptedStatusCodesDescription": "Válassza ki az állapot kódokat amelyek sikeres válasznak fognak számítani.",
+    "passwordNotMatchMsg": "A megismételt jelszó nem egyezik.",
+    "notificationDescription": "Kérem, rendeljen egy értesítést a figyeléshez, hogy működjön.",
+    "keywordDescription": "Kulcsszó keresése a HTML-ben vagy a JSON válaszban. (kis-nagybetű érzékeny)",
+    "pauseDashboardHome": "Szünetel",
+    "deleteMonitorMsg": "Biztos, hogy törölni akarja ezt a figyelőt?",
+    "deleteNotificationMsg": "Biztos, hogy törölni akarja ezt az értesítést az összes figyelőnél?",
+    "resolverserverDescription": "A Cloudflare az alapértelmezett szerver, bármikor meg tudja változtatni a resolver server-t.",
+    "rrtypeDescription": "Válassza ki az RR-típust a figyelőhöz",
+    "pauseMonitorMsg": "Biztos, hogy szüneteltetni akarja?",
+    "enableDefaultNotificationDescription": "Minden új figyelőhöz ez az értesítés engedélyezett lesz alapértelmezetten. Kikapcsolhatja az értesítést külön minden figyelőnél.",
+    "clearEventsMsg": "Biztos, hogy törölni akar miden eseményt ennél a figyelnél?",
+    "clearHeartbeatsMsg": "Biztos, hogy törölni akar minden életjelet ennél a figyelőnél?",
+    "confirmClearStatisticsMsg": "Biztos, hogy törölni akar MINDEN statisztikát?",
+    "importHandleDescription": "Válassza a 'Meglévő kihagyását', ha ki szeretné hagyni az azonos nevő figyelőket vagy értesítésket. A 'Felülírás' törölni fog minden meglévő figyelőt és értesítést.",
+    "confirmImportMsg": "Biztos, hogy importálja a mentést? Győződjön meg róla, hogy jól választotta ki az importálás opciót.",
+    "twoFAVerifyLabel": "Kérem, adja meg a token-t, hogy a 2FA működését ellenőrizzük",
+    "tokenValidSettingsMsg": "A token érvényes! El tudja menteni a 2FA beállításait.",
+    "confirmEnableTwoFAMsg": "Biztosan engedélyezi a 2FA-t?",
+    "confirmDisableTwoFAMsg": "Biztosan letiltja a 2FA-t?",
+    "Settings": "Beállítások",
+    "Dashboard": "Irányítópult",
+    "New Update": "Új frissítés",
+    "Language": "Nyelv",
+    "Appearance": "Megjelenés",
+    "Theme": "Téma",
+    "General": "Általános",
+    "Version": "Verzió",
+    "Check Update On GitHub": "Frissítések keresése a GitHub-on",
+    "List": "Lista",
+    "Add": "Hozzáadás",
+    "Add New Monitor": "Új figyelő hozzáadása",
+    "Quick Stats": "Gyors statisztikák",
+    "Up": "Működik",
+    "Down": "Leállt",
+    "Pending": "Függőben",
+    "Unknown": "Ismeretlen",
+    "Pause": "Szünet",
+    "Name": "Név",
+    "Status": "Állapot",
+    "DateTime": "Időpont",
+    "Message": "Üzenet",
+    "No important events": "Nincs fontos esemény",
+    "Resume": "Folytatás",
+    "Edit": "Szerkesztés",
+    "Delete": "Törlés",
+    "Current": "Aktuális",
+    "Uptime": "Uptime",
+    "Cert Exp.": "SSL lejárat",
+    "day": "nap",
+    "-day": "-nap",
+    "hour": "óra",
+    "-hour": "- óra",
+    "Response": "Válasz",
+    "Ping": "Ping",
+    "Monitor Type": "Figyelő típusa",
+    "Keyword": "Kulcsszó",
+    "Friendly Name": "Rövid név",
+    "URL": "URL",
+    "Hostname": "Hosztnév",
+    "Port": "Port",
+    "Heartbeat Interval": "Életjel időköz",
+    "Retries": "Újrapróbálkozás",
+    "Heartbeat Retry Interval": "Életjel újrapróbálkozások időköze",
+    "Advanced": "Haladó",
+    "Upside Down Mode": "Fordított mód",
+    "Max. Redirects": "Max. átirányítás",
+    "Accepted Status Codes": "Elfogadott állapot kódok",
+    "Save": "Mentés",
+    "Notifications": "Értesítések",
+    "Not available, please setup.": "Nem elérhető, állítsa be.",
+    "Setup Notification": "Értesítés beállítása",
+    "Light": "Világos",
+    "Dark": "Sötét",
+    "Auto": "Auto",
+    "Theme - Heartbeat Bar": "Téma - Életjel sáv",
+    "Normal": "Normál",
+    "Bottom": "Nyomógomb",
+    "None": "Nincs",
+    "Timezone": "Időzóna",
+    "Search Engine Visibility": "Látható a keresőmotoroknak",
+    "Allow indexing": "Indexelés engedélyezése",
+    "Discourage search engines from indexing site": "Keresőmotorok elriasztása az oldal indexelésétől",
+    "Change Password": "Jelszó változtatása",
+    "Current Password": "Jelenlegi jelszó",
+    "New Password": "Új jelszó",
+    "Repeat New Password": "Ismételje meg az új jelszót",
+    "Update Password": "Jelszó módosítása",
+    "Disable Auth": "Hitelesítés tiltása",
+    "Enable Auth": "Hitelesítés engedélyezése",
+    "disableauth.message1": "Biztos benne, hogy <strong>kikapcsolja a hitelesítést</strong>?",
+    "disableauth.message2": "Akkor érdemes, ha <strong>van 3rd-party hitelesítés</strong> az Uptime Kuma-t megelőzően mint a Cloudflare Access.",
+    "Please use this option carefully!": "Használja megfontoltan!",
+    "Logout": "Kijelentkezés",
+    "Leave": "Elhagy",
+    "I understand, please disable": "Megértettem, kérem tiltsa le",
+    "Confirm": "Megerősítés",
+    "Yes": "Igen",
+    "No": "Nem",
+    "Username": "Felhasználónév",
+    "Password": "Jelszó",
+    "Remember me": "Emlékezzen rám",
+    "Login": "Bejelentkezés",
+    "No Monitors, please": "Nincs figyelő, kérem",
+    "add one": "adjon hozzá egyet",
+    "Notification Type": "Értesítés típusa",
+    "Email": "Email",
+    "Test": "Teszt",
+    "Certificate Info": "Tanúsítvány információk",
+    "Resolver Server": "DNS szerver",
+    "Resource Record Type": "Resource Record típusa",
+    "Last Result": "Utolsó eredmény",
+    "Create your admin account": "Hozza létre az adminisztrátor felhasználót",
+    "Repeat Password": "Jelszó ismétlése",
+    "Import Backup": "Mentés importálása",
+    "Export Backup": "Mentés exportálása",
+    "Export": "Exportálás",
+    "Import": "Importálás",
+    "respTime": "Válaszidő (ms)",
+    "notAvailableShort": "N/A",
+    "Default enabled": "Alapértelmezetten engedélyezett",
+    "Apply on all existing monitors": "Alkalmazza az összes figyelőre",
+    "Create": "Létrehozás",
+    "Clear Data": "Adatok törlése",
+    "Events": "Események",
+    "Heartbeats": "Életjelek",
+    "Auto Get": "Auto lekérd.",
+    "backupDescription": "Mentheti az összes figyelőt és értesítést egy JSON fájlba.",
+    "backupDescription2": "Megj: Történeti és esemény adatokat nem tartalmaz.",
+    "backupDescription3": "Érzékeny adatok, pl. szolgáltatás kulcsok is vannak az export fájlban. Figyeljen erre!",
+    "alertNoFile": "Válaszzon ki egy fájlt az importáláshoz.",
+    "alertWrongFileType": "Válasszon egy JSON fájlt.",
+    "Clear all statistics": "Összes statisztika törlése",
+    "Skip existing": "Meglévő kihagyása",
+    "Overwrite": "Felülírás",
+    "Options": "Opciók",
+    "Keep both": "Mindegyiket tartsa meg",
+    "Verify Token": "Token ellenőrzése",
+    "Setup 2FA": "2FA beállítása",
+    "Enable 2FA": "2FA engedélyezése",
+    "Disable 2FA": "2FA tiltása",
+    "2FA Settings": "2FA beállítások",
+    "Two Factor Authentication": "Kétfaktoros hitelesítés",
+    "Active": "Aktív",
+    "Inactive": "Inaktív",
+    "Token": "Token",
+    "Show URI": "URI megmutatása",
+    "Tags": "Címkék",
+    "Add New below or Select...": "Adjon hozzá lentre vagy válasszon...",
+    "Tag with this name already exist.": "Ilyen nevű címke már létezik.",
+    "Tag with this value already exist.": "Ilyen értékű címke már létezik.",
+    "color": "szín",
+    "value (optional)": "érték (opcionális)",
+    "Gray": "Szürke",
+    "Red": "Piros",
+    "Orange": "Narancs",
+    "Green": "Zöld",
+    "Blue": "Kék",
+    "Indigo": "Indigó",
+    "Purple": "Lila",
+    "Pink": "Rózsaszín",
+    "Search...": "Keres...",
+    "Avg. Ping": "Átl. ping",
+    "Avg. Response": "Átl. válasz",
+    "Entry Page": "Nyitólap",
+    "statusPageNothing": "Semmi nincs itt. Adjon hozzá egy vagy több figyelőt.",
+    "No Services": "Nincs szolgáltatás",
+    "All Systems Operational": "Minden rendszer működik",
+    "Partially Degraded Service": "Részlegesen leállt szolgáltatás",
+    "Degraded Service": "Leállt szolgáltatás",
+    "Add Group": "Csoport hozzáadása",
+    "Add a monitor": "Figyelő hozzáadása",
+    "Edit Status Page": "Státusz oldal szerkesztése",
+    "Go to Dashboard": "Irányítópulthoz",
+    "telegram": "Telegram",
+    "webhook": "Webhook",
+    "smtp": "Email (SMTP)",
+    "discord": "Discord",
+    "teams": "Microsoft Teams",
+    "signal": "Signal",
+    "gotify": "Gotify",
+    "slack": "Slack",
+    "rocket.chat": "Rocket.chat",
+    "pushover": "Pushover",
+    "pushy": "Pushy",
+    "octopush": "Octopush",
+    "promosms": "PromoSMS",
+    "lunasea": "LunaSea",
+    "apprise": "Apprise (50+ értesítési szolgáltatás)",
+    "pushbullet": "Pushbullet",
+    "line": "Line Messenger",
+    "mattermost": "A legfontosabb",
+    "Status Page": "Státusz oldal",
+    "Status Pages": "Státusz oldalak",
+    "Primary Base URL": "Elsődleges URL",
+    "Push URL": "Meghívandó URL",
+    "needPushEvery": "Ezt az URL-t kell meghívni minden {0} másodpercben.",
+    "pushOptionalParams": "Opcionális paraméterek: {0}",
+    "defaultNotificationName": "{notification} értesítésem ({number})",
+    "here": "itt",
+    "Required": "Kötelező",
+    "Bot Token": "BOT token",
+    "wayToGetTelegramToken": "Innen kaphat token-t: {0}.",
+    "Chat ID": "Csevegés ID",
+    "supportTelegramChatID": "Támogatja a közvetlen csevegést, csoportnak küldést és csatona ID-t is",
+    "wayToGetTelegramChatID": "A csevegés ID-t kinyerheti azzal, hogy küld egy üzenetet a bot-nak és erre az URL-re ellátogat, ahol láthatja a chat_id:-t",
+    "YOUR BOT TOKEN HERE": "AZ ÖN BOT TOKENJE ITT",
+    "chatIDNotFound": "Csevegés ID nem található, küldjön egy első üzenetet a bot-nak",
+    "Post URL": "Cél URL (Post)",
+    "Content Type": "Tartalom típus (Content Type)",
+    "webhookJsonDesc": "{0} ideális a moderh HTTP szerverekhez, mint az Express.js",
+    "webhookFormDataDesc": "{multipart} ideális a PHP-hez. A JSON értelmezhető ezzel: {decodeFunction}",
+    "secureOptionNone": "Nincs / STARTTLS (25, 587)",
+    "secureOptionTLS": "TLS (465)",
+    "Ignore TLS Error": "TLS hiba figyelmen kívül hagyása",
+    "From Email": "Feladó email",
+    "emailCustomSubject": "Egyedi tárgy",
+    "To Email": "Cél email",
+    "smtpCC": "Másolat",
+    "smtpBCC": "Titkos másolat",
+    "Discord Webhook URL": "Discord cím (webhook URL)",
+    "wayToGetDiscordURL": "Kaphat egy ilyet, ha ellátogat a Server Settings -> Integrations -> Create Webhook oldalra",
+    "Bot Display Name": "Bot megjelenő neve",
+    "Prefix Custom Message": "Egyedi előtét üzenet",
+    "Hello @everyone is...": "Hello {'@'}mindenki...",
+    "Webhook URL": "Cím (webhook URL)",
+    "wayToGetTeamsURL": "Itt megnézheti, hogy kell ilyen URL-t készíteni: {0}.",
+    "Number": "Szám",
+    "Recipients": "Címzettek",
+    "needSignalAPI": "Egy Signal kliensre van szüksége, amihez REST API tartozik.",
+    "wayToCheckSignalURL": "Itt megnézheti, hogy hozhat létre egyet:",
+    "signalImportant": "FONTOS! Nem keverheti a csoportokat és számokat a címzetteknél.",
+    "Application Token": "Alkalmazás token",
+    "Server URL": "Szerver URL",
+    "Priority": "Prioritás",
+    "Icon Emoji": "Emoji ikonok",
+    "Channel Name": "Csatorna neve",
+    "Uptime Kuma URL": "Uptime Kuma cím",
+    "aboutWebhooks": "Webhook-okról több info: {0}",
+    "aboutChannelName": "Adja meg a {0} csatorna nevét ha szeretné elkerülni a webhook-ot. Pl: #masik-csatorna",
+    "aboutKumaURL": "Ha üresen hagyja a Uptime Kuma cím mezőt, akkor a projekt GitHub oldala lesz az alapértelmezett.",
+    "emojiCheatSheet": "Emoji csalás: {0}",
+    "clicksendsms": "ClickSend SMS",
+    "User Key": "Felhasználói kulcs",
+    "Device": "Eszköz",
+    "Message Title": "Üzenet címe",
+    "Notification Sound": "Értesítési hang",
+    "More info on:": "További információ: {0}",
+    "pushoverDesc1": "A vészhelyzeti prioritásnak (2) 30 másodperc az újrapróbálkozási alapértéke és egy óra után lejár.",
+    "pushoverDesc2": "Ha különböző eszközökre szeretne értesítést küldeni, töltse ki az Eszköz mezőt.",
+    "SMS Type": "SMS típusa",
+    "octopushTypePremium": "Premium (Fast - recommended for alerting)",
+    "octopushTypeLowCost": "Low Cost (Slow - sometimes blocked by operator)",
+    "checkPrice": "Nézze meg az {0} féle árat:",
+    "apiCredentials": "API kulcsok",
+    "octopushLegacyHint": "Az Octopush régi (2011-2020) verzióját használja vagy az újat?",
+    "Check octopush prices": "Nézze meg az Octopush {0} féle árát.",
+    "octopushPhoneNumber": "Telefonszám (nemz. formátum, pl : +36705554433) ",
+    "octopushSMSSender": "SMS küldő neve : 3-11 betű/szám (a-zA-Z0-9) vagy szóköz",
+    "LunaSea Device ID": "LunaSea eszköz ID",
+    "Apprise URL": "Apprise cím (URL)",
+    "Example:": "Például: {0}",
+    "Read more:": "Itt olvashat róla: {0}",
+    "Status:": "Állapot: {0}",
+    "Read more": "Tovább olvasom",
+    "appriseInstalled": "Apprise telepítve.",
+    "appriseNotInstalled": "Apprise nincs telepítve. {0}",
+    "Access Token": "Elérési token",
+    "Channel access token": "Csatorna elérési token",
+    "Line Developers Console": "Line Developers konzol",
+    "lineDevConsoleTo": "Line Developers konzol - {0}",
+    "Basic Settings": "Alap beállítások",
+    "User ID": "Felhasználó ID",
+    "Messaging API": "Üzenet API",
+    "wayToGetLineChannelToken": "{0} első eléréséhez készítsen egy Provider-t és csatornát (Messaging API), utána kaphatja meg a csatorna elérési token-t és felhasználó ID-t az alábbi menüpontban.",
+    "Icon URL": "Ikon cím (URL)",
+    "aboutIconURL": "Megadhat egy webcímet az Ikon cím mezőben, ezzel felülírva az alapértelmezet képet. Nem kerül felhasználásra, ha az Emoji-k be vannak állítva.",
+    "aboutMattermostChannelName": "Felülírhatja az alapértelmezett csatornát, ahova a webhook az adatokat küldi. Ehhez töltse ki a \"Csatorna neve\" mezőt (pl: #egyeb-csatorna). A Mattermost webhook beállításaiban további engedélyek szükségesek",
+    "matrix": "Matrix",
+    "promosmsTypeEco": "SMS ECO - olcsó, de lassú, gyakran túlterhelt. Csak lengyel címzettekhez.",
+    "promosmsTypeFlash": "SMS FLASH - Az üzenet automatikusan megjelenik a fogadó eszközön. Csak lengyel címzettekhez.",
+    "promosmsTypeFull": "SMS FULL - Prémium szintje az SMS-nek. Megadható a feladó neve, de előtte jóváhagyás szükséges. Ideális értesítésekhez.",
+    "promosmsTypeSpeed": "SMS SPEED - A legmagasabb prioritás a rendszerben. Nagyon gyors és pontos, de költséges (kb. duplája a hagyományos SMS-nek).",
+    "promosmsPhoneNumber": "Telefonszám (lengyel címzett esetén az országkód elhagyható)",
+    "promosmsSMSSender": "SMS feladónév: Előre beállított név vagy az alábbiak egyike: InfoSMS, SMS Info, MaxSMS, INFO, SMS",
+    "Feishu WebHookUrl": "Feishu webhook cím (URL)",
+    "matrixHomeserverURL": "Homeserver cím (URL http(s):// előtaggal és opcionálisan port-tal)",
+    "Internal Room Id": "Belső Szoba ID",
+    "matrixDesc1": "A belső szoba ID-t a szpbák speciális beállítások között találja meg a Matrix kliens programban. Így kell kinéznie: !QMdRCpUIfLwsfjxye6:home.server.",
+    "matrixDesc2": "Erősen ajánlott készíteni egy új felhasználót és nem a teljes joggal rendelkező felhasználót használni. Az új felhasználó létrehozása után csak azokba a szobákba kell megjhívni a felhasználót, ahol értesítéseket szeretne kapni. Ezzel a művelettel lehet elérési token-t kérni: {0}",
+    "Method": "Metódus",
+    "Body": "Törzs",
+    "Headers": "Fejlécek",
+    "PushUrl": "Push cím (URL)",
+    "HeadersInvalidFormat": "A kérés fejléc nem egy valós JSON: ",
+    "BodyInvalidFormat": "A kérés törzse nem egy valós JSON: ",
+    "Monitor History": "Vizsgálatok előzményei",
+    "clearDataOlderThan": "Előzmények megtartása {0} napig.",
+    "PasswordsDoNotMatch": "Jelszó nem egyezik.",
+    "records": "sorok",
+    "One record": "Egy sor",
+    "steamApiKeyDescription": "Steam Game Server ellenőrzéséhez szükséges egy Steam Web-API kulcs. Itt létrehozhat egy API kulcsot: ",
+    "Current User": "Felhasználó",
+    "recent": "Legújabb",
+    "Done": "Kész",
+    "Info": "Infó",
+    "Security": "Biztonság",
+    "Steam API Key": "Steam API kulcs",
+    "Shrink Database": "Adatbázis tömörítése",
+    "Pick a RR-Type...": "Válasszon egy RR-típust…",
+    "Pick Accepted Status Codes...": "Válasszon olyan kódot, ami elfogadottnak számít…",
+    "Default": "Alapért.",
+    "HTTP Options": "HTTP beállítások",
+    "Create Incident": "Incidens létrehozása",
+    "Title": "Cím",
+    "Content": "Tartalom",
+    "Style": "Stílus",
+    "info": "info",
+    "warning": "warning",
+    "danger": "danger",
+    "primary": "primary",
+    "light": "light",
+    "dark": "dark",
+    "Post": "Bejegyzés",
+    "Please input title and content": "Adjon meg címet és tartalmat",
+    "Created": "Létrehozva",
+    "Last Updated": "Utolsó mód.",
+    "Unpin": "Leválaszt",
+    "Switch to Light Theme": "Világos témára váltás",
+    "Switch to Dark Theme": "Sötét témára váltás",
+    "Show Tags": "Címkék mutatása",
+    "Hide Tags": "Címkék elrejtése",
+    "Description": "Leírás",
+    "No monitors available.": "Nincs még figyelő beállítva.",
+    "Add one": "Adjon hozzá egyet",
+    "No Monitors": "Nincs figyelő",
+    "Untitled Group": "Névtelen csoport",
+    "Services": "Szolgáltatások",
+    "Discard": "Elvet",
+    "Cancel": "Mégsem",
+    "Powered by": "A megoldást szállítja az",
+    "shrinkDatabaseDescription": "VACUUM futtatása az SQLite-on. Ha az adatbázisod 1.10.0-nál újabb, akkor az AUTO_VACUUM engedélyezve van, nincs szükség a műveletre.",
+    "serwersms": "SerwerSMS.pl",
+    "serwersmsAPIUser": "API felhasználónév (webapi_ előtaggal együtt)",
+    "serwersmsAPIPassword": "API jelszó",
+    "serwersmsPhoneNumber": "Telefonszám",
+    "serwersmsSenderName": "SMS feladó neve (regisztrált név az oldalon)",
+    "GoogleChat": "Google Chat (csak Google Workspace)",
+    "stackfield": "Stackfield",
+    "smtpDkimSettings": "DKIM beállítások",
+    "smtpDkimDesc": "Nézze meg a Nodemailer DKIM {0} használati szabályokat.",
+    "documentation": "dokumentáció",
+    "smtpDkimDomain": "Domain név",
+    "smtpDkimKeySelector": "Kulcs választó",
+    "smtpDkimPrivateKey": "Privát kulcs",
+    "smtpDkimHashAlgo": "Hash algoritmus (nem kötelező)",
+    "smtpDkimheaderFieldNames": "Fejléc kulcsok a bejelentkezéshez (nem kötelező)",
+    "smtpDkimskipFields": "Fejléc kulcsok egyéb esetben (nem kötelező)",
+    "PushByTechulus": "Techulus push",
+    "gorush": "Gorush",
+    "alerta": "Alerta",
+    "alertaApiEndpoint": "API végpont",
+    "alertaEnvironment": "Környezet",
+    "alertaApiKey": "API kulcs",
+    "alertaAlertState": "Figyelmeztetési állapot",
+    "alertaRecoverState": "Visszaállási állapot",
+    "deleteStatusPageMsg": "Biztos, hogy törölni akarja a státusz oldalt?",
+    "Start of maintenance": "Karbantartás kezdete",
+    "successMessageExplanation": "MQTT üzenet, amely sikeresnek minősül",
+    "weekdayShortFri": "Pé",
+    "lastDay2": "A hónap 2. utolsó napja",
+    "maintenanceStatus-under-maintenance": "Karbantartás alatt",
+    "dnsCacheDescription": "Előfordulhat, hogy bizonyos IPv6-környezetekben nem működik, tiltsa le, ha problémákat tapasztal.",
+    "Add New Status Page": "Új állapotoldal hozzáadása",
+    "The resource is no longer available.": "Az erőforrás már nem elérhető.",
+    "Show update if available": "Frissítés megjelenítése, ha elérhető",
+    "weekdayShortMon": "Hé",
+    "weekdayShortTue": "Ke",
+    "weekdayShortWed": "Sze",
+    "weekdayShortThu": "Csüt",
+    "weekdayShortSat": "Szo",
+    "weekdayShortSun": "Vas",
+    "dayOfWeek": "A hét napja",
+    "dayOfMonth": "A hónap napja",
+    "lastDay": "Utolsó nap",
+    "lastDay3": "A hónap 3. utolsó napja",
+    "lastDay4": "A hónap 4. utolsó napja",
+    "No Maintenance": "Nincs karbantartás",
+    "pauseMaintenanceMsg": "Biztosan szüneteltetni akarja?",
+    "maintenanceStatus-inactive": "Inaktív",
+    "maintenanceStatus-scheduled": "Ütemezett",
+    "maintenanceStatus-ended": "Végzett",
+    "maintenanceStatus-unknown": "Ismeretlen",
+    "Display Timezone": "Időzóna megjelenítése",
+    "Server Timezone": "Szerver időzóna",
+    "statusPageMaintenanceEndDate": "Vége",
+    "Enable DNS Cache": "DNS-gyorsítótár engedélyezése",
+    "Enable": "Engedélyezze",
+    "Disable": "Letiltás",
+    "Affected Monitors": "Érintett monitorok",
+    "Packet Size": "Csomag mérete",
+    "IconUrl": "Ikon URL",
+    "successMessage": "Sikeres üzenet",
+    "lastDay1": "A hónap utolsó napja",
+    "Guild ID": "Guild ID",
+    "Help": "Súgó",
+    "statusMaintenance": "Karbantartás",
+    "Maintenance": "Karbantartás",
+    "Game": "Játék"
+}
diff --git a/src/lang/id-ID.json b/src/lang/id-ID.json
new file mode 100644
index 000000000..fe6760acb
--- /dev/null
+++ b/src/lang/id-ID.json
@@ -0,0 +1,594 @@
+{
+    "languageName": "Bahasa Indonesia (Indonesian)",
+    "checkEverySecond": "Cek Setiap {0} detik",
+    "retryCheckEverySecond": "Coba lagi setiap {0} detik",
+    "resendEveryXTimes": "Kirim ulang setiap {0} kali",
+    "resendDisabled": "Kirim ulang dinonaktifkan",
+    "retriesDescription": "Percobaan ulang maksimum sebelum layanan dinyatakan tidak aktif dan notifikasi dikirim",
+    "ignoreTLSError": "Abaikan kesalahan TLS/SSL untuk situs web HTTPS",
+    "upsideDownModeDescription": "Balikkan statusnya. Jika layanan dapat dijangkau, TIDAK AKTIF.",
+    "maxRedirectDescription": "Jumlah maksimum pengalihan untuk diikuti. Setel ke 0 untuk menonaktifkan pengalihan.",
+    "acceptedStatusCodesDescription": "Pilih kode status yang dianggap sebagai tanggapan yang berhasil.",
+    "passwordNotMatchMsg": "Kata sandi kedua tidak cocok.",
+    "notificationDescription": "Harap atur notifikasi ke monitor agar berfungsi.",
+    "keywordDescription": "Cari kata kunci dalam code html atau JSON huruf besar-kecil berpengaruh",
+    "pauseDashboardHome": "Jeda",
+    "deleteMonitorMsg": "Apakah Anda mau menghapus monitor ini?",
+    "deleteNotificationMsg": "Apakah Anda mau menghapus notifikasi untuk semua monitor?",
+    "dnsPortDescription": "Port server DNS. Bawaan menggunakan 53. Anda dapat mengubah port kapan saja.",
+    "resolverserverDescription": "Cloudflare adalah server bawaan, Anda dapat mengubah server resolver kapan saja.",
+    "rrtypeDescription": "Pilih RR-Type yang mau Anda monitor",
+    "pauseMonitorMsg": "Apakah Anda yakin mau menjeda?",
+    "enableDefaultNotificationDescription": "Untuk setiap monitor baru, notifikasi ini akan diaktifkan secara bawaan. Anda masih dapat menonaktifkan notifikasi secara terpisah untuk setiap monitor.",
+    "clearEventsMsg": "Apakah Anda yakin mau menghapus semua event di monitor ini?",
+    "clearHeartbeatsMsg": "Apakah Anda yakin mau menghapus semua heartbeats di monitor ini?",
+    "confirmClearStatisticsMsg": "Apakah Anda yakin mau menghapus semua statistik?",
+    "importHandleDescription": "Pilih 'Lewati yang ada' jika Anda ingin melewati setiap monitor atau notifikasi dengan nama yang sama. 'Timpa' akan menghapus setiap monitor dan notifikasi yang ada.",
+    "confirmImportMsg": "Apakah Anda yakin untuk mengimpor cadangan? Pastikan Anda telah memilih opsi impor yang tepat.",
+    "twoFAVerifyLabel": "Silakan ketik token Anda untuk memverifikasi bahwa 2FA berfungsi",
+    "tokenValidSettingsMsg": "Token benar! Anda sekarang dapat menyimpan pengaturan 2FA.",
+    "confirmEnableTwoFAMsg": "Apakah Anda yakin ingin mengaktifkan 2FA?",
+    "confirmDisableTwoFAMsg": "Apakah Anda yakin ingin menonaktifkan 2FA?",
+    "Settings": "Pengaturan",
+    "Dashboard": "Dasbor",
+    "New Update": "Pembaruan Baru",
+    "Language": "Bahasa",
+    "Appearance": "Tampilan",
+    "Theme": "Tema",
+    "General": "Umum",
+    "Primary Base URL": "URL Dasar Utama",
+    "Version": "Versi",
+    "Check Update On GitHub": "Cek Pembaruan di GitHub",
+    "List": "Daftar",
+    "Add": "Tambah",
+    "Add New Monitor": "Tambah Monitor Baru",
+    "Quick Stats": "Statistik",
+    "Up": "Aktif",
+    "Down": "Tidak Aktif",
+    "Pending": "Tertunda",
+    "Unknown": "Tidak diketahui",
+    "Pause": "Jeda",
+    "Name": "Nama",
+    "Status": "Status",
+    "DateTime": "Tanggal Waktu",
+    "Message": "Pesan",
+    "No important events": "Tidak ada peristiwa penting",
+    "Resume": "Lanjut",
+    "Edit": "Ubah",
+    "Delete": "Hapus",
+    "Current": "Saat ini",
+    "Uptime": "Waktu aktif",
+    "Cert Exp.": "Batas kedaluwarsa SSL",
+    "day": "hari | hari-hari",
+    "-day": "-hari",
+    "hour": "Jam",
+    "-hour": "-Jam",
+    "Response": "Tanggapan",
+    "Ping": "Ping",
+    "Monitor Type": "Tipe Monitor",
+    "Keyword": "Kata Kunci",
+    "Friendly Name": "Nama yang Ramah",
+    "URL": "URL",
+    "Hostname": "Hostname",
+    "Port": "Port",
+    "Heartbeat Interval": "Jarak Waktu Heartbeat",
+    "Retries": "Coba lagi",
+    "Heartbeat Retry Interval": "Jeda Pengulangan Heartbeat",
+    "Resend Notification if Down X times consecutively": "Kirim Ulang Notifikasi jika Tidak Aktif X kali",
+    "Advanced": "Tingkat Lanjut",
+    "Upside Down Mode": "Mode Terbalik",
+    "Max. Redirects": "Maksimal Pengalihan",
+    "Accepted Status Codes": "Kode Status yang Diterima",
+    "Push URL": "Push URL",
+    "needPushEvery": "Anda harus memanggil URL berikut setiap {0} detik..",
+    "pushOptionalParams": "Parameter tambahan: {0}",
+    "Save": "Simpan",
+    "Notifications": "Notifikasi",
+    "Not available, please setup.": "Tidak tersedia, silakan atur.",
+    "Setup Notification": "Setel Notifikasi",
+    "Light": "Terang",
+    "Dark": "Gelap",
+    "Auto": "Otomatis",
+    "Theme - Heartbeat Bar": "Tema - Heartbeat Bar",
+    "Normal": "Normal",
+    "Bottom": "Bawah",
+    "None": "Tidak ada",
+    "Timezone": "Zona Waktu",
+    "Search Engine Visibility": "Visibilitas Mesin Pencari",
+    "Allow indexing": "Mengizinkan untuk diindex",
+    "Discourage search engines from indexing site": "Mencegah mesin pencari untuk mengindex situs",
+    "Change Password": "Ganti Sandi",
+    "Current Password": "Sandi Lama",
+    "New Password": "Sandi Baru",
+    "Repeat New Password": "Ulangi Sandi Baru",
+    "Update Password": "Perbarui Kata Sandi",
+    "Disable Auth": "Nonaktifkan Autentikasi",
+    "Enable Auth": "Aktifkan Autentikasi",
+    "disableauth.message1": "Apakah Anda yakin ingin <strong>menonaktifkan autentikasi</strong>?",
+    "disableauth.message2": "Ini untuk <strong>mereka yang memiliki autentikasi pihak ketiga</strong> diletakkan di depan Uptime Kuma, misalnya akses Cloudflare.",
+    "Please use this option carefully!": "Gunakan dengan hati-hati.",
+    "Logout": "Keluar",
+    "Leave": "Pergi",
+    "I understand, please disable": "Saya mengerti, silakan dinonaktifkan",
+    "Confirm": "Konfirmasi",
+    "Yes": "Ya",
+    "No": "Tidak",
+    "Username": "Nama Pengguna",
+    "Password": "Sandi",
+    "Remember me": "Ingat saya",
+    "Login": "Masuk",
+    "No Monitors, please": "Tidak ada monitor, silakan",
+    "add one": "tambahkan satu",
+    "Notification Type": "Tipe Notifikasi",
+    "Email": "Surel",
+    "Test": "Tes",
+    "Certificate Info": "Info Sertifikasi",
+    "Resolver Server": "Resolver Server",
+    "Resource Record Type": "Resource Record Type",
+    "Last Result": "Hasil Terakhir",
+    "Create your admin account": "Buat akun admin Anda",
+    "Repeat Password": "Ulangi Sandi",
+    "Import Backup": "Impor Cadangan",
+    "Export Backup": "Ekspor Cadangan",
+    "Export": "Ekspor",
+    "Import": "Impor",
+    "respTime": "Tanggapan. Waktu (milidetik)",
+    "notAvailableShort": "N/A",
+    "Default enabled": "Bawaan diaktifkan",
+    "Apply on all existing monitors": "Terapkan pada semua monitor yang ada",
+    "Create": "Buat",
+    "Clear Data": "Bersihkan Data",
+    "Events": "Peristiwa",
+    "Heartbeats": "Heartbeats",
+    "Auto Get": "Ambil Otomatis",
+    "backupDescription": "Anda dapat mencadangkan semua monitor dan semua notifikasi ke dalam berkas JSON.",
+    "backupDescription2": "Catatan: Data sejarah dan peristiwa tidak disertakan.",
+    "backupDescription3": "Data sensitif seperti notifikasi token disertakan dalam berkas ekspor, harap simpan dengan hati-hati.",
+    "alertNoFile": "Silakan pilih berkas untuk diimpor.",
+    "alertWrongFileType": "Silakan pilih berkas JSON.",
+    "Clear all statistics": "Hapus semua statistik",
+    "Skip existing": "Lewati yang ada",
+    "Overwrite": "Timpa",
+    "Options": "Opsi",
+    "Keep both": "Simpan keduanya",
+    "Verify Token": "Verifikasi Token",
+    "Setup 2FA": "Pengaturan 2FA",
+    "Enable 2FA": "Aktifkan 2FA",
+    "Disable 2FA": "Nonaktifkan 2FA",
+    "2FA Settings": "Pengaturan 2FA",
+    "Two Factor Authentication": "Autentikasi Dua Faktor",
+    "Active": "Aktif",
+    "Inactive": "Tidak Aktif",
+    "Token": "Token",
+    "Show URI": "Lihat URI",
+    "Tags": "Tanda",
+    "Add New below or Select...": "Tambahkan Baru di bawah atau Pilih...",
+    "Tag with this name already exist.": "Tanda dengan nama ini sudah ada.",
+    "Tag with this value already exist.": "Tanda dengan nilai ini sudah ada.",
+    "color": "warna",
+    "value (optional)": "nilai (harus diisi)",
+    "Gray": "Abu-abu",
+    "Red": "Merah",
+    "Orange": "Jingga",
+    "Green": "Hijau",
+    "Blue": "Biru",
+    "Indigo": "Biru Tua",
+    "Purple": "Ungu",
+    "Pink": "Merah Muda",
+    "Search...": "Cari...",
+    "Avg. Ping": "Rata-rata Ping",
+    "Avg. Response": "Rata-rata Tanggapan",
+    "Entry Page": "Halaman Masuk",
+    "statusPageNothing": "Tidak ada di sini, silakan tambahkan grup atau monitor.",
+    "No Services": "Tidak ada Layanan",
+    "All Systems Operational": "Semua Sistem Berfungsi",
+    "Partially Degraded Service": "Layanan Terdegradasi Sebagian",
+    "Degraded Service": "Layanan Terdegradasi",
+    "Add Group": "Tambah Grup",
+    "Add a monitor": "Tambah monitor",
+    "Edit Status Page": "Edit Halaman Status",
+    "Go to Dashboard": "Pergi ke Dasbor",
+    "Status Page": "Halaman Status",
+    "Status Pages": "Halaman Status",
+    "defaultNotificationName": "{notification} saya Peringatan ({number})",
+    "here": "di sini",
+    "Required": "Wajib",
+    "telegram": "Telegram",
+    "Bot Token": "Bot Token",
+    "wayToGetTelegramToken": "Anda dapat mendapatkan token dari {0}.",
+    "Chat ID": "Chat ID",
+    "supportTelegramChatID": "Mendukung Obrolan Langsung / Grup / Channel Chat ID",
+    "wayToGetTelegramChatID": "Anda bisa mendapatkan chat id Anda dengan mengirim pesan ke bot dan pergi ke url ini untuk melihat chat_id:",
+    "YOUR BOT TOKEN HERE": "BOT TOKEN ANDA DI SINI",
+    "chatIDNotFound": "Chat ID tidak ditemukan, tolong kirim pesan ke bot ini dulu",
+    "webhook": "Webhook",
+    "Post URL": "Post URL",
+    "Content Type": "Tipe konten",
+    "webhookJsonDesc": "{0} bagus untuk peladen http modern seperti express.js",
+    "webhookFormDataDesc": "{multipart} bagus untuk PHP, Anda hanya perlu mengurai json dengan {decodeFunction}",
+    "smtp": "Surel (SMTP)",
+    "secureOptionNone": "None / STARTTLS (25, 587)",
+    "secureOptionTLS": "TLS (465)",
+    "Ignore TLS Error": "Abaikan Kesalahan TLS",
+    "From Email": "Dari Email",
+    "emailCustomSubject": "Subjek",
+    "To Email": "Ke Email",
+    "smtpCC": "CC",
+    "smtpBCC": "BCC",
+    "discord": "Discord",
+    "Discord Webhook URL": "Discord Webhook URL",
+    "wayToGetDiscordURL": "Anda bisa mendapatkan ini dengan pergi ke Server Pengaturan -> Integrasi -> Buat Webhook",
+    "Bot Display Name": "Nama Bot",
+    "Prefix Custom Message": "Awalan Pesan",
+    "Hello @everyone is...": "Halo {'@'}everyone is...",
+    "teams": "Microsoft Teams",
+    "Webhook URL": "Webhook URL",
+    "wayToGetTeamsURL": "Anda dapat mempelajari cara membuat url webhook {0}.",
+    "signal": "Sinyal",
+    "Number": "Nomer",
+    "Recipients": "Penerima",
+    "needSignalAPI": "Anda harus memiliki klien sinyal dengan REST API.",
+    "wayToCheckSignalURL": "Anda dapat memeriksa url ini untuk melihat cara menyiapkannya:",
+    "signalImportant": "PENTING: Anda tidak dapat mencampur grup dan nomor di penerima!",
+    "gotify": "Gotify",
+    "Application Token": "Token Aplikasi",
+    "Server URL": "URL Server",
+    "Priority": "Prioritas",
+    "slack": "Slack",
+    "Icon Emoji": "Ikon Emoji",
+    "Channel Name": "Nama Saluran",
+    "Uptime Kuma URL": "Uptime Kuma URL",
+    "aboutWebhooks": "Info lain tentang webhook: {0}",
+    "aboutChannelName": "Masukan nama saluran di {0} Kolom Nama Saluran jika Anda ingin melewati saluran webhook. Contoh: #saluran-lain",
+    "aboutKumaURL": "Jika Anda membiarkan bidang URL Uptime Kuma kosong, itu akan menjadi bawaan ke halaman Proyek Github.",
+    "emojiCheatSheet": "Lembar contekan emoji: {0}",
+    "rocket.chat": "Rocket.chat",
+    "pushover": "Pushover",
+    "pushy": "Pushy",
+    "PushByTechulus": "Push by Techulus",
+    "octopush": "Octopush",
+    "promosms": "PromoSMS",
+    "clicksendsms": "ClickSend SMS",
+    "lunasea": "LunaSea",
+    "apprise": "Apprise (Mendukung 50+ layanan notifikasi)",
+    "GoogleChat": "Google Chat (hanya Google Workspace)",
+    "pushbullet": "Pushbullet",
+    "line": "Line Messenger",
+    "mattermost": "Mattermost",
+    "User Key": "Kunci pengguna",
+    "Device": "Perangkat",
+    "Message Title": "Judul Pesan",
+    "Notification Sound": "Suara Nofifikasi",
+    "More info on:": "Info lebih lanjut tentang: {0}",
+    "pushoverDesc1": "Prioritas darurat (2) memiliki batas waktu bawaan 30 detik antara percobaan ulang dan akan kadaluwarsa setelah 1 jam.",
+    "pushoverDesc2": "Jika Anda ingin mengirim pemberitahuan ke perangkat yang berbeda, isi kolom Perangkat.",
+    "SMS Type": "Tipe SMS",
+    "octopushTypePremium": "Premium (Cepat - direkomendasikan untuk mengingatkan)",
+    "octopushTypeLowCost": "Low Cost (Lambat, terkadang diblokir oleh operator)",
+    "checkPrice": "Check {0} prices:",
+    "apiCredentials": "Kredensial API",
+    "octopushLegacyHint": "Apakah Anda menggunakan Octopush versi lama (2011-2020) atau versi baru?",
+    "Check octopush prices": "Cek harga octopush {0}.",
+    "octopushPhoneNumber": "Nomer Telpon/HP (format internasional, contoh : +33612345678) ",
+    "octopushSMSSender": "Nama Pengirim SMS : 3-11 karakter alfanumerik dan spasi (a-zA-Z0-9)",
+    "LunaSea Device ID": "LunaSea Device ID",
+    "Apprise URL": "Apprise URL",
+    "Example:": "Contoh: {0}",
+    "Read more:": "Baca lebih lanjut: {0}",
+    "Status:": "Status: {0}",
+    "Read more": "Baca lebih lanjut",
+    "appriseInstalled": "Apprise diinstall.",
+    "appriseNotInstalled": "Apprise tidak diinstall. {0}",
+    "Access Token": "Token Akses",
+    "Channel access token": "Token akses saluran",
+    "Line Developers Console": "Konsol Pengembang Line",
+    "lineDevConsoleTo": "Konsol Pengembang Line - {0}",
+    "Basic Settings": "Pengaturan Dasar",
+    "User ID": "ID User",
+    "Messaging API": "Messaging API",
+    "wayToGetLineChannelToken": "Pertama akses {0}, buat penyedia dan saluran (Messaging API), lalu Anda bisa mendapatkan token akses saluran dan id pengguna dari item menu yang disebutkan di atas.",
+    "Icon URL": "Icon URL",
+    "aboutIconURL": "Anda dapat memberikan tautan ke gambar di \"Icon URL\" untuk mengganti gambar profil bawaan. Tidak akan digunakan jika Ikon Emoji diset.",
+    "aboutMattermostChannelName": "Anda dapat mengganti saluran bawaan tujuan posting webhook dengan memasukkan nama saluran ke dalam Kolom \"Channel Name\". Ini perlu diaktifkan di pengaturan webhook Mattermost. contoh: #other-channel",
+    "matrix": "Matrix",
+    "promosmsTypeEco": "SMS ECO - murah tapi lambat dan sering kelebihan beban. Terbatas hanya untuk penerima Polandia.",
+    "promosmsTypeFlash": "SMS FLASH - Pesan akan otomatis muncul di perangkat penerima. Terbatas hanya untuk penerima Polandia.",
+    "promosmsTypeFull": "SMS FULL - SMS tingkat premium, Anda dapat menggunakan Nama Pengirim Anda (Anda harus mendaftarkan nama terlebih dahulu). Dapat diandalkan untuk peringatan.",
+    "promosmsTypeSpeed": "SMS SPEED - Prioritas tertinggi dalam sistem. Sangat cepat dan dapat diandalkan tetapi mahal (sekitar dua kali lipat dari harga SMS FULL).",
+    "promosmsPhoneNumber": "Nomor telepon (untuk penerima Polandia Anda dapat melewati kode area)",
+    "promosmsSMSSender": "Nama Pengirim SMS : Nama pra-registrasi atau salah satu bawaan: InfoSMS, Info SMS, MaxSMS, INFO, SMS",
+    "Feishu WebHookUrl": "Feishu WebHookUrl",
+    "matrixHomeserverURL": "Homeserver URL (dengan http(s):// dan port tambahan)",
+    "Internal Room Id": "Internal Room ID",
+    "matrixDesc1": "Kamu dapat menemukan Internal Room ID dengan melihat di bagian konfigurasi ruang di Matrix. Seharusnya berbentuk seperti !QMdRCpUIfLwsfjxye6:home.server.",
+    "matrixDesc2": "Sangat direkomendasikan kepada Anda untuk membuat akun baru dan jangan menggunakan token atas akun terkini yang memiliki token akses secara penuh terhadap akun dan seluruh ruang yang terdaftar. Alih - alih, buat akun baru dan undang akun tsb ke ruang tempat anda ingin menerima notifikasi. Untuk mendapatkan token akses anda dapat menjalankan {0}",
+    "Method": "Method",
+    "Body": "Body",
+    "Headers": "Headers",
+    "PushUrl": "Push URL",
+    "HeadersInvalidFormat": "Request Headers memiliki format JSON yang tidak sesuai: ",
+    "BodyInvalidFormat": "Request Body memiliki format JSON yang tidak sesuai: ",
+    "Monitor History": "Riyawat Monitor",
+    "clearDataOlderThan": "Simpan data riwayat monitoring selama {0} hari.",
+    "PasswordsDoNotMatch": "Password tidak sama.",
+    "records": "catatan",
+    "One record": "Satu catatan",
+    "steamApiKeyDescription": "Untuk monitoring Steam Game Server Anda membutuhkan kunci Steam Web-API. Anda dapat mendaftarkan Kunci API Anda melalui: ",
+    "Current User": "Pengguna Saat Ini",
+    "topic": "Topic",
+    "topicExplanation": "MQTT topic untuk dimonitor",
+    "successMessage": "Pesan Berhasil",
+    "successMessageExplanation": "Pesan MQTT yang akan dianggap berhasil",
+    "recent": "Baru saja",
+    "Done": "Selesai",
+    "Info": "Info",
+    "Security": "Keamanan",
+    "Steam API Key": "Steam API Key",
+    "Shrink Database": "Shrink Database",
+    "Pick a RR-Type...": "Pilih RR-Type...",
+    "Pick Accepted Status Codes...": "Pilih Kode Status yang Diterima...",
+    "Default": "Default",
+    "HTTP Options": "Opsi HTTP",
+    "Create Incident": "Buat Incident",
+    "Title": "Judul",
+    "Content": "Konten",
+    "Style": "Gaya",
+    "info": "info",
+    "warning": "peringatan",
+    "danger": "bahaya",
+    "error": "kesalahan",
+    "critical": "kritis",
+    "primary": "utama",
+    "light": "terang",
+    "dark": "gelap",
+    "Post": "Post",
+    "Please input title and content": "Masukkan judul dan konten",
+    "Created": "Dibuat",
+    "Last Updated": "Terakhir Diperbarui",
+    "Unpin": "Lepaskan Semat",
+    "Switch to Light Theme": "Ubah ke Tema Terang",
+    "Switch to Dark Theme": "Ubah ke Tema Gelap",
+    "Show Tags": "Tampilkan Tags",
+    "Hide Tags": "Sembunyikan Tags",
+    "Description": "Deskripsi",
+    "No monitors available.": "Tidak ada monitor yang tersedia.",
+    "Add one": "Tambahkan",
+    "No Monitors": "Tidak ada monitor",
+    "Untitled Group": "Group Tanpa Judul",
+    "Services": "Layanan",
+    "Discard": "Buang",
+    "Cancel": "Batal",
+    "Powered by": "Dipersembahkan oleh",
+    "shrinkDatabaseDescription": "Trigger database VACUUM untuk SQLite. Jika database Anda dibuat setelah 1.10.0, AUTO_VACUUM sudah otomatis diaktifkan dan aksi berikut tidak dibutuhkan.",
+    "serwersms": "SerwerSMS.pl",
+    "serwersmsAPIUser": "Nama Pengguna API ( termamsuk awalan webapi_ )",
+    "serwersmsAPIPassword": "Kata Sandi API",
+    "serwersmsPhoneNumber": "Nomor Telepon",
+    "serwersmsSenderName": "Nama Pengirim SMS (didaftarkan melalui portal pelanggan)",
+    "stackfield": "Stackfield",
+    "Customize": "Kustomisasi",
+    "Custom Footer": "Tambahan Footer",
+    "Custom CSS": "Tambahan CSS",
+    "smtpDkimSettings": "Pengaturan DKIM",
+    "smtpDkimDesc": "Silakan merujuk ke Nodemailer DKIM {0} untuk penggunaan.",
+    "documentation": "dokumentasi",
+    "smtpDkimDomain": "Nama Domain",
+    "smtpDkimKeySelector": "Key Selector",
+    "smtpDkimPrivateKey": "Private Key",
+    "smtpDkimHashAlgo": "Algoritma Hash (Opsional)",
+    "smtpDkimheaderFieldNames": "Header Keys untuk ditambahkan (Optional)",
+    "smtpDkimskipFields": "Header Keys not untuk ditambahkan (Optional)",
+    "wayToGetPagerDutyKey": "Anda dapat menambahkan melalui Service -> Service Directory -> (Select a service) -> Integrations -> Add integration. Lalu Anda dapat menjadi dengan kata kunci \"Events API V2\". Informasi tambahan {0}",
+    "Integration Key": "Kunci Integrasi",
+    "Integration URL": "URL Integrasi",
+    "Auto resolve or acknowledged": "Penyelesaian otomatis atau diakui",
+    "do nothing": "tidak melakukan apapun",
+    "auto acknowledged": "otomatis diakui",
+    "auto resolve": "otomatis terselesaikan",
+    "gorush": "Gorush",
+    "alerta": "Alerta",
+    "alertaApiEndpoint": "API Endpoint",
+    "alertaEnvironment": "Lingkungan",
+    "alertaApiKey": "Kunci API",
+    "alertaAlertState": "Status Siaga",
+    "alertaRecoverState": "Status Pemulihan",
+    "deleteStatusPageMsg": "Apakah Anda yakin untuk menghapus halaman status berikut?",
+    "Proxies": "Proxy",
+    "default": "Bawaan",
+    "enabled": "Diaktifkan",
+    "setAsDefault": "Tetapkan sebagai bawaan",
+    "deleteProxyMsg": "Apakah Anda yakin ingin menghapus proxy berikut untuk seluruh monitor?",
+    "proxyDescription": "Proxy harus ditambahkan ke monitor agar berfungsi.",
+    "enableProxyDescription": "Proxy berikut tidak akan berdampak ke monitor hingga diaktifkan. Anda dapat mengontrol menonaktifkan sementara proxy dari semua monitor dengan status aktivasi.",
+    "setAsDefaultProxyDescription": "Proxy berikut akan diaktifkan sebagai bawaan untuk monitor baru. Anda masih dapat menonaktifkan proxy secara terpisah untuk setiap monitor.",
+    "Certificate Chain": "Certificate Chain",
+    "Valid": "Valid",
+    "Invalid": "Tidak Valid",
+    "AccessKeyId": "AccessKey ID",
+    "SecretAccessKey": "AccessKey Secret",
+    "PhoneNumbers": "Nomor Telepon",
+    "TemplateCode": "Kode Template",
+    "SignName": "Nama Tanda",
+    "Sms template must contain parameters: ": "Template SMS harus berisi parameter: ",
+    "Bark Endpoint": "Bark Endpoint",
+    "Bark Group": "Bark Group",
+    "Bark Sound": "Bark Sound",
+    "WebHookUrl": "WebHookUrl",
+    "SecretKey": "SecretKey",
+    "For safety, must use secret key": "Untuk keamaan Anda harus menggunakan kunci rahasia",
+    "Device Token": "Token Perangkat",
+    "Platform": "Platform",
+    "iOS": "iOS",
+    "Android": "Android",
+    "Huawei": "Huawei",
+    "High": "Tinggi",
+    "Retry": "Ulang",
+    "Topic": "Topik",
+    "WeCom Bot Key": "Kunci WeCom Bot",
+    "Setup Proxy": "Siapkan Proxy",
+    "Proxy Protocol": "Protokol Proxy",
+    "Proxy Server": "Server Proxy",
+    "Proxy server has authentication": "Server Proxy memiliki autentikasi",
+    "User": "Pengguna",
+    "Installed": "Terpasang",
+    "Not installed": "Tidak terpasang",
+    "Running": "Berjalan",
+    "Not running": "Tidak berjalan",
+    "Remove Token": "Hapus Token",
+    "Start": "Mulai",
+    "Stop": "Berhenti",
+    "Uptime Kuma": "Uptime Kuma",
+    "Add New Status Page": "Tambahkan Halaman Status Baru",
+    "Slug": "Slug",
+    "Accept characters:": "Terima karakter:",
+    "startOrEndWithOnly": "Mulai atau akhiri hanya dengan {0}",
+    "No consecutive dashes": "Tanda hubung tidak berurutan",
+    "Next": "Selanjutnya",
+    "The slug is already taken. Please choose another slug.": "Slug telah digunakan. Silakan pilih slug lain.",
+    "No Proxy": "Tidak ada Proxy",
+    "Authentication": "Autentikasi",
+    "HTTP Basic Auth": "HTTP Basic Auth",
+    "New Status Page": "Halaman Status Baru",
+    "Page Not Found": "Halaman Tidak Ditemukan",
+    "Reverse Proxy": "Proxy Terbalik",
+    "Backup": "Cadangan",
+    "About": "Tentang",
+    "wayToGetCloudflaredURL": "(Unduh cloudflared dari {0})",
+    "cloudflareWebsite": "Situs Cloudflare",
+    "Message:": "Pesan:",
+    "Don't know how to get the token? Please read the guide:": "Tidak tahu cara mendapatkan token? Silakan baca panduannya:",
+    "The current connection may be lost if you are currently connecting via Cloudflare Tunnel. Are you sure want to stop it? Type your current password to confirm it.": "Koneksi saat ini mungkin hilang jika Anda saat ini terhubung melalui Cloudflare Tunel. Apakah Anda yakin ingin menghentikannya? Ketik kata sandi Anda saat ini untuk mengonfirmasinya.",
+    "HTTP Headers": "HTTP Headers",
+    "Trust Proxy": "Proxy Terpercaya",
+    "Other Software": "Perangkat Lunak lainnya",
+    "For example: nginx, Apache and Traefik.": "Sebagai contoh: nginx, Apache and Traefik.",
+    "Please read": "Harap dibaca",
+    "Subject:": "Subjek:",
+    "Valid To:": "Berlaku Untuk:",
+    "Days Remaining:": "Hari Tersisa:",
+    "Issuer:": "Penerbit:",
+    "Fingerprint:": "Sidik jari:",
+    "No status pages": "Tidak ada halaman status",
+    "Domain Name Expiry Notification": "Pemberitahuan Kedaluwarsa Nama Domain",
+    "Proxy": "Proxy",
+    "Date Created": "Tanggal Dibuat",
+    "HomeAssistant": "Home Assistant",
+    "onebotHttpAddress": "Alamat HTTP OneBot",
+    "onebotMessageType": "Jenis Pesan OneBot",
+    "onebotGroupMessage": "Grup",
+    "onebotPrivateMessage": "Pribadi",
+    "onebotUserOrGroupId": "Grup/Pengguna ID",
+    "onebotSafetyTips": "Untuk keamanan, harus mengatur token akses",
+    "PushDeer Key": "Kunci PushDeer",
+    "Footer Text": "Tulisan Footer",
+    "Show Powered By": "Tampilkan Dipersembahkan oleh",
+    "Domain Names": "Nama Domain",
+    "signedInDisp": "Masuk sebagai {0}",
+    "signedInDispDisabled": "Autentikasi dinonaktifkan.",
+    "RadiusSecret": "Radius Secret",
+    "RadiusSecretDescription": "Shared Secret antara klien dan server",
+    "RadiusCalledStationId": "Called Station Id",
+    "RadiusCalledStationIdDescription": "Pengenal perangkat yang dipanggil",
+    "RadiusCallingStationId": "Calling Station Id",
+    "RadiusCallingStationIdDescription": "Pengenal perangkat panggilan",
+    "Certificate Expiry Notification": "Pemberitahuan Kedaluwarsa Sertifikat",
+    "API Username": "Nama Pengguna API",
+    "API Key": "Kunci API",
+    "Recipient Number": "Nomor Penerima",
+    "From Name/Number": "Dari Nama/Nomor",
+    "Leave blank to use a shared sender number.": "Biarkan kosong untuk menggunakan nomor pengirim bersama.",
+    "Octopush API Version": "Versi API Octopush",
+    "Legacy Octopush-DM": "Legacy Octopush-DM",
+    "endpoint": "endpoint",
+    "octopushAPIKey": "\"API key\" dari kredensial HTTP API di panel kontrol",
+    "octopushLogin": "\"Login\" dari kredensial HTTP API di panel kontrol",
+    "promosmsLogin": "Nama Masuk API",
+    "promosmsPassword": "Kata Sandi API",
+    "pushoversounds pushover": "Pushover (default)",
+    "pushoversounds bike": "Bike",
+    "pushoversounds bugle": "Bugle",
+    "pushoversounds cashregister": "Cash Register",
+    "pushoversounds classical": "Classical",
+    "pushoversounds cosmic": "Cosmic",
+    "pushoversounds falling": "Falling",
+    "pushoversounds gamelan": "Gamelan",
+    "pushoversounds incoming": "Incoming",
+    "pushoversounds intermission": "Intermission",
+    "pushoversounds magic": "Magic",
+    "pushoversounds mechanical": "Mechanical",
+    "pushoversounds pianobar": "Piano Bar",
+    "pushoversounds siren": "Siren",
+    "pushoversounds spacealarm": "Space Alarm",
+    "pushoversounds tugboat": "Tug Boat",
+    "pushoversounds alien": "Alien Alarm (long)",
+    "pushoversounds climb": "Climb (long)",
+    "pushoversounds persistent": "Persistent (long)",
+    "pushoversounds echo": "Pushover Echo (long)",
+    "pushoversounds updown": "Up Down (long)",
+    "pushoversounds vibrate": "Vibrate Only",
+    "pushoversounds none": "None (silent)",
+    "pushyAPIKey": "Secret API Key",
+    "pushyToken": "Device token",
+    "Show update if available": "Tampilkan pembaruan jika tersedia",
+    "Also check beta release": "Periksa juga rilis beta",
+    "Using a Reverse Proxy?": "Menggunakan Proxy Terbalik?",
+    "Check how to config it for WebSocket": "Periksa cara mengonfigurasinya untuk A WebSocket",
+    "Steam Game Server": "Steam Game Server",
+    "Most likely causes:": "Kemungkinan besar penyebabnya:",
+    "The resource is no longer available.": "Sumber daya tidak lagi tersedia.",
+    "There might be a typing error in the address.": "Mungkin ada kesalahan pengetikan di alamat.",
+    "What you can try:": "Apa yang dapat kamu coba:",
+    "Retype the address.": "Ketik ulang alamat.",
+    "Go back to the previous page.": "Kembali ke halaman sebelumnya.",
+    "Coming Soon": "Segera",
+    "wayToGetClickSendSMSToken": "Anda bisa mendapatkan Nama Pengguna API dan Kunci API dari {0} .",
+    "Connection String": "String Koneksi",
+    "Query": "Query",
+    "settingsCertificateExpiry": "Sertifikat TLS Kadaluarsa",
+    "certificationExpiryDescription": "Monitor HTTPS memicu pemberitahuan saat sertifikat TLS kedaluwarsa dalam:",
+    "Setup Docker Host": "Siapkan Host Docker",
+    "Connection Type": "Jenis Koneksi",
+    "Docker Daemon": "Docker Daemon",
+    "deleteDockerHostMsg": "Apakah Anda yakin ingin menghapus host docker berikut untuk semua monitor?",
+    "socket": "Socket",
+    "tcp": "TCP / HTTP",
+    "Docker Container": "Docker Container",
+    "Container Name / ID": "Container Name / ID",
+    "Docker Host": "Docker Host",
+    "Docker Hosts": "Docker Hosts",
+    "ntfy Topic": "ntfy Topic",
+    "Domain": "Domain",
+    "Workstation": "Workstation",
+    "disableCloudflaredNoAuthMsg": "Anda berada dalam mode Tanpa Otentikasi, kata sandi tidak diperlukan.",
+    "trustProxyDescription": "Trust 'X-Forwarded-*' headers. Jika Anda ingin mendapatkan IP klien yang benar dan Uptime Kuma Anda dibalik layanan seperti Nginxor Apache, Anda harus mengaktifkan ini.",
+    "wayToGetLineNotifyToken": "Anda bisa mendapatkan token akses dari {0}",
+    "Examples": "Contoh",
+    "Home Assistant URL": "Home Assistant URL",
+    "Long-Lived Access Token": "Token Akses Berumur Panjang",
+    "Long-Lived Access Token can be created by clicking on your profile name (bottom left) and scrolling to the bottom then click Create Token. ": "Token Akses Berumur Panjang dapat dibuat dengan mengklik nama profil Anda (kiri bawah) dan menggulir ke bawah lalu klik Buat Token. ",
+    "Notification Service": "Layanan Pemberitahuan",
+    "default: notify all devices": "bawaan: notifikasi seluruh perangkat",
+    "A list of Notification Services can be found in Home Assistant under \"Developer Tools > Services\" search for \"notification\" to find your device/phone name.": "Daftar Layanan Pemberitahuan dapat ditemukan di Home Assistant pada \"Developer Tools > Services\" cari \"notification\" lalu cari nama perangkat Anda.",
+    "Automations can optionally be triggered in Home Assistant:": "Otomatisasi dapat dipicu secara opsional di Home Assistant:",
+    "Trigger type:": "Tipe Trigger/Pemicu:",
+    "Event type:": "Tipe event:",
+    "Event data:": "Data event:",
+    "Then choose an action, for example switch the scene to where an RGB light is red.": "Kemudian pilih tindakan, misalnya alihkan ke tempat dimana lampu RGB berwarna merah.",
+    "Frontend Version": "Versi Frontend",
+    "Frontend Version do not match backend version!": "Versi Frontend tidak sama dengan versi backend!",
+    "Base URL": "URL Dasar",
+    "goAlertInfo": "GoAlert adalah aplikasi open source untuk penjadwalan panggilan, eskalasi otomatis dan pemberitahuan (seperti SMS atau panggilan suara). Secara otomatis melibatkan orang yang tepat, dengan cara yang benar, dan pada waktu yang tepat! {0}",
+    "goAlertIntegrationKeyInfo": "Dapatkan kunci integrasi API generik untuk layanan dalam format ini \"aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee\" biasanya nilai parameter token dari URL yang disalin.",
+    "goAlert": "GoAlert",
+    "backupOutdatedWarning": "Tidak digunakan lagi: Karena banyak fitur ditambahkan dan fitur cadangan ini agak tidak terawat, itu tidak dapat menghasilkan atau memulihkan cadangan lengkap.",
+    "backupRecommend": "Harap cadangkan volume atau folder data (./data/) secara langsung.",
+    "Help": "Bantuan",
+    "Game": "Gim/Permainan",
+    "markdownSupported": "Dukungan sintaks markdown",
+    "statusMaintenance": "Pemeliharaan",
+    "Maintenance": "Pemeliharaan",
+    "General Monitor Type": "Tipe Monitor Umum",
+    "Passive Monitor Type": "Tipe Monitor Pasif",
+    "Specific Monitor Type": "Tipe Monitor Spesifik",
+    "Monitor": "Monitor"
+}
diff --git a/src/lang/it-IT.json b/src/lang/it-IT.json
new file mode 100644
index 000000000..cc6a397b7
--- /dev/null
+++ b/src/lang/it-IT.json
@@ -0,0 +1,420 @@
+{
+    "languageName": "Italiano (Italian)",
+    "checkEverySecond": "controlla ogni {0} secondi",
+    "retryCheckEverySecond": "Riprova ogni {0} secondi",
+    "retriesDescription": "Tentativi prima che il servizio venga marcato come \"DOWN\" e che una notifica venga inviata",
+    "ignoreTLSError": "Ignora gli errori TLS/SSL per i siti HTTPS",
+    "upsideDownModeDescription": "Se il servizio risulta raggiungibile viene marcato come \"DOWN\".",
+    "maxRedirectDescription": "Numero massimo di redirezionamenti consentito. Per disabilitare, impostare \"0\".",
+    "acceptedStatusCodesDescription": "Elenco di codici di stato HTTP che sono considerati validi.",
+    "passwordNotMatchMsg": "La password non corrisponde.",
+    "notificationDescription": "Assegnare la notifica a uno o più oggetti monitorati per metterla in funzione.",
+    "keywordDescription": "Cerca la parola chiave nella risposta in HTML o JSON. Distingue tra maiuscole e minuscole.",
+    "pauseDashboardHome": "In Pausa",
+    "deleteMonitorMsg": "Sei sicuro di voler eliminare questo oggetto monitorato?",
+    "deleteNotificationMsg": "Sei sicuro di voler eliminare questa notifica per tutti gli oggetti monitorati?",
+    "resolverserverDescription": "Cloudflare è il server predefinito ma è possibile cambiare il server DNS.",
+    "rrtypeDescription": "Scegliere il tipo di RR che si vuole monitorare",
+    "pauseMonitorMsg": "Sei sicuro di voler mettere in pausa?",
+    "enableDefaultNotificationDescription": "Per ogni nuovo monitor questa notifica sarà abilitata di default. È comunque possibile disabilitare la notifica singolarmente.",
+    "clearEventsMsg": "Sei sicuro di voler eliminare tutti gli eventi per questo servizio?",
+    "clearHeartbeatsMsg": "Sei sicuro di voler eliminare tutti gli intervalli di controllo per questo servizio?",
+    "confirmClearStatisticsMsg": "Sei sicuro di voler eliminare TUTTE le statistiche?",
+    "importHandleDescription": "Selezionare \"Ignora esistenti\" se si vuole ignorare l'importazione dei monitor o delle notifiche con lo stesso nome. \"Sovrascrivi\" rimpiazzerà tutti i monitor e le notifiche presenti con quelli nel backup.",
+    "confirmImportMsg": "Sei sicuro di voler importare il backup? Controlla di aver selezionato l'opzione corretta di importazione.",
+    "twoFAVerifyLabel": "Digita il token per verificare che l'autenticazione a due fattori funzioni correttamente:",
+    "tokenValidSettingsMsg": "Il token è valido! È ora possibile salvare le impostazioni.",
+    "confirmEnableTwoFAMsg": "Sei sicuro di voler abilitare l'autenticazione a due fattori?",
+    "confirmDisableTwoFAMsg": "Sei sicuro di voler disabilitare l'autenticazione a due fattori?",
+    "Settings": "Impostazioni",
+    "Dashboard": "Dashboard",
+    "New Update": "Nuovo aggiornamento disponibile",
+    "Language": "Lingua",
+    "Appearance": "Aspetto",
+    "Theme": "Tema",
+    "General": "Generale",
+    "Primary Base URL": "URL base primario",
+    "Version": "Versione",
+    "Check Update On GitHub": "Controlla aggiornamenti su GitHub",
+    "List": "Lista",
+    "Add": "Aggiungi",
+    "Add New Monitor": "Aggiungi nuovo monitor",
+    "Quick Stats": "Statistiche rapide",
+    "Up": "Up",
+    "Down": "Down",
+    "Pending": "In attesa",
+    "Unknown": "Sconosciuti",
+    "Pause": "Metti in pausa",
+    "Name": "Nome",
+    "Status": "Stato",
+    "DateTime": "Data e Ora",
+    "Message": "Messaggio",
+    "No important events": "Nessun evento importante",
+    "Resume": "Riprendi",
+    "Edit": "Modifica",
+    "Delete": "Elimina",
+    "Current": "Corrente",
+    "Uptime": "Tempo di attività",
+    "Cert Exp.": "Scadenza Certificato",
+    "day": "giorno | giorni",
+    "-day": "-giorni",
+    "hour": "ora",
+    "-hour": "-ore",
+    "Response": "Risposta",
+    "Ping": "Ping",
+    "Monitor Type": "Modalità di monitoraggio",
+    "Keyword": "Parola chiave",
+    "Friendly Name": "Nome",
+    "URL": "URL",
+    "Hostname": "Nome Host",
+    "Port": "Porta",
+    "Heartbeat Interval": "Intervallo di controllo",
+    "Retries": "Tentativi",
+    "Heartbeat Retry Interval": "Intervallo tra i tentativi di controllo",
+    "Advanced": "Avanzate",
+    "Upside Down Mode": "Modalità invertita",
+    "Max. Redirects": "Reindirizzamenti massimi",
+    "Accepted Status Codes": "Codici di stato accettati",
+    "Push URL": "Push URL",
+    "needPushEvery": "Notificare questo URL ogni {0} secondi.",
+    "pushOptionalParams": "Parametri aggiuntivi: {0}",
+    "Save": "Salva",
+    "Notifications": "Notifiche",
+    "Not available, please setup.": "Non disponibili, da configurare.",
+    "Setup Notification": "Configura le notifiche",
+    "Light": "Chiaro",
+    "Dark": "Scuro",
+    "Auto": "Automatico",
+    "Theme - Heartbeat Bar": "Tema (barra di stato)",
+    "Normal": "Normale",
+    "Bottom": "Sotto",
+    "None": "Nessuna",
+    "Timezone": "Fuso Orario",
+    "Search Engine Visibility": "Visibilità ai motori di ricerca",
+    "Allow indexing": "Consenti l'indicizzazione",
+    "Discourage search engines from indexing site": "Evita l'indicizzazione ai motori di ricerca",
+    "Change Password": "Cambia password",
+    "Current Password": "Password corrente",
+    "New Password": "Nuova password",
+    "Repeat New Password": "Ripeti nuova password",
+    "Update Password": "Modifica password",
+    "Disable Auth": "Disabilita autenticazione",
+    "Enable Auth": "Abilita autenticazione",
+    "disableauth.message1": "<strong>Disabilitare l'autenticazione</strong>?",
+    "disableauth.message2": "<strong>Questa opzione è per chi un sistema di autenticazione gestito da terze parti</strong> messo davanti ad Uptime Kuma, ad esempio Cloudflare Access.",
+    "Please use this option carefully!": "Utilizzare con attenzione!",
+    "Logout": "Esci",
+    "Leave": "Annulla",
+    "I understand, please disable": "Lo capisco, disabilitare l'autenticazione",
+    "Confirm": "Conferma",
+    "Yes": "Sì",
+    "No": "No",
+    "Username": "Nome utente",
+    "Password": "Password",
+    "Remember me": "Ricorda credenziali",
+    "Login": "Accesso",
+    "No Monitors, please": "Nessun monitor presente,",
+    "add one": "aggiungine uno",
+    "Notification Type": "Servizio di notifica",
+    "Email": "E-mail",
+    "Test": "Fai una prova",
+    "Certificate Info": "Informazioni sul certificato",
+    "Resolver Server": "Server DNS",
+    "Resource Record Type": "Tipo di Resource Record",
+    "Last Result": "Ultimo risultato",
+    "Create your admin account": "Crea l'account amministratore",
+    "Repeat Password": "Ripeti password",
+    "Import Backup": "Importa backup",
+    "Export Backup": "Esporta backup",
+    "Export": "Esporta",
+    "Import": "Importa",
+    "respTime": "Tempo di risposta (ms)",
+    "notAvailableShort": "N/D",
+    "Default enabled": "Abilitato di default",
+    "Apply on all existing monitors": "Applica su tutti i monitoraggi",
+    "Create": "Crea",
+    "Clear Data": "Cancella dati",
+    "Events": "Eventi",
+    "Heartbeats": "Controlli",
+    "Auto Get": "Rileva",
+    "backupDescription": "È possibile fare il backup di tutti i monitoraggi e di tutte le notifiche in un file JSON.",
+    "backupDescription2": "NOTA: lo storico e i dati relativi agli eventi non saranno inclusi nel backup.",
+    "backupDescription3": "Dati sensibili come i token di autenticazione saranno inclusi nel backup, custodisci il file in un luogo sicuro.",
+    "alertNoFile": "Selezionare il file da importare.",
+    "alertWrongFileType": "Selezionare un file JSON.",
+    "Clear all statistics": "Cancella tutte le statistiche",
+    "Skip existing": "Ignora esistenti",
+    "Overwrite": "Sovrascrivi",
+    "Options": "Opzioni",
+    "Keep both": "Mantieni entrambi",
+    "Verify Token": "Verifica token",
+    "Setup 2FA": "Configura 2FA",
+    "Enable 2FA": "Abilita 2FA",
+    "Disable 2FA": "Disabilita 2FA",
+    "2FA Settings": "Gestisci l'autenticazione a due fattori",
+    "Two Factor Authentication": "Autenticazione a due fattori (2FA)",
+    "Active": "Attivata",
+    "Inactive": "Disattivata",
+    "Token": "Token",
+    "Show URI": "Mostra URI",
+    "Tags": "Etichette",
+    "Add New below or Select...": "Aggiungi oppure scegli…",
+    "Tag with this name already exist.": "Un'etichetta con questo nome già esiste.",
+    "Tag with this value already exist.": "Un'etichetta con questo valore già esiste.",
+    "color": "colore",
+    "value (optional)": "descrizione (opzionale)",
+    "Gray": "Grigio",
+    "Red": "Rosso",
+    "Orange": "Arancione",
+    "Green": "Verde",
+    "Blue": "Blu",
+    "Indigo": "Indaco",
+    "Purple": "Viola",
+    "Pink": "Rosa",
+    "Search...": "Cerca…",
+    "Avg. Ping": "Tempo medio di risposta al ping",
+    "Avg. Response": "Tempo medio di risposta",
+    "Entry Page": "Pagina Principale",
+    "statusPageNothing": "Non c'è nulla qui, aggiungi un gruppo oppure un monitor.",
+    "No Services": "Nessun servizio",
+    "All Systems Operational": "Tutti i sistemi sono funzionali",
+    "Partially Degraded Service": "Servizio parzialmente degradato",
+    "Degraded Service": "Servizio degradato",
+    "Add Group": "Aggiungi gruppo",
+    "Add a monitor": "Aggiungi monitor",
+    "Edit Status Page": "Modifica pagina di stato",
+    "Go to Dashboard": "Vai alla dashboard",
+    "Status Page": "Pagina di stato",
+    "Status Pages": "Pagina di stato",
+    "defaultNotificationName": "Notifica {notification} ({number})",
+    "here": "qui",
+    "Required": "Obbligatorio",
+    "telegram": "Telegram",
+    "Bot Token": "Token del bot",
+    "wayToGetTelegramToken": "Puoi ottenere il token da {0}.",
+    "Chat ID": "ID Chat",
+    "supportTelegramChatID": "Supporta ID di chat private, gruppi e canali",
+    "wayToGetTelegramChatID": "È possibile ricereve l'ID chat mandando un messaggio al bot e poi andando in questo URL per visualizzare il chat_id:",
+    "YOUR BOT TOKEN HERE": "QUI IL TOKEN DEL BOT",
+    "chatIDNotFound": "Non trovo l'ID chat. Prima bisogna mandare un messaggio al bot",
+    "webhook": "Webhook",
+    "Post URL": "Post URL",
+    "Content Type": "Content Type",
+    "webhookJsonDesc": "{0} va bene per qualsiasi server HTTP moderno ad esempio express.js",
+    "webhookFormDataDesc": "{multipart} va bene per PHP, c'è solo bisogno di analizzare il json con {decodeFunction}",
+    "smtp": "E-mail (SMTP)",
+    "secureOptionNone": "Nessuno / STARTTLS (25, 587)",
+    "secureOptionTLS": "TLS (465)",
+    "Ignore TLS Error": "Ignora gli errori TLS",
+    "From Email": "Mittente",
+    "emailCustomSubject": "Oggetto personalizzato",
+    "To Email": "Destinatario",
+    "smtpCC": "CC",
+    "smtpBCC": "CCn",
+    "discord": "Discord",
+    "Discord Webhook URL": "URL Webhook di Discord",
+    "wayToGetDiscordURL": "È possibile recuperarlo da Impostazioni server -> Integrazioni -> Creare Webhook",
+    "Bot Display Name": "Nome del Bot",
+    "Prefix Custom Message": "Prefisso per il messaggio personalizzato",
+    "Hello @everyone is...": "Ciao a {'@'}everyone …",
+    "teams": "Microsoft Teams",
+    "Webhook URL": "URL Webhook",
+    "wayToGetTeamsURL": "È possibile imparare a creare un URL Webhook {0}.",
+    "signal": "Signal",
+    "Number": "Numero",
+    "Recipients": "Destinatari",
+    "needSignalAPI": "È necessario avere un client Signal con le API REST.",
+    "wayToCheckSignalURL": "Controllare questo url per capire come impostarne uno:",
+    "signalImportant": "IMPORTANTE: Non è possibile mischiare gruppi e numeri all'interno dei destinatari!",
+    "gotify": "Gotify",
+    "Application Token": "Token Applicazione",
+    "Server URL": "URL Server",
+    "Priority": "Priorità",
+    "slack": "Slack",
+    "Icon Emoji": "Icona Emoji",
+    "Channel Name": "Nome Canale",
+    "Uptime Kuma URL": "Indirizzo Uptime Kuma",
+    "aboutWebhooks": "Maggiori informazioni riguardo ai webhooks su: {0}",
+    "aboutChannelName": "Inserire il nome del canale nel campo \"Nome Canale\" {0} se si vuole bypassare il canale webhook. Ad esempio: #altro-canale",
+    "aboutKumaURL": "Se si lascia bianco il campo Indirizzo Uptime Kuma, la pagina GitHub sarà il valore predefinito.",
+    "emojiCheatSheet": "Lista Emoji: {0}",
+    "rocket.chat": "Rocket.chat",
+    "pushover": "Pushover",
+    "pushy": "Pushy",
+    "octopush": "Octopush",
+    "promosms": "PromoSMS",
+    "clicksendsms": "ClickSend SMS",
+    "lunasea": "LunaSea",
+    "apprise": "Apprise (Supporta più di 50 servizi di notifica)",
+    "pushbullet": "Pushbullet",
+    "line": "Line Messenger",
+    "mattermost": "Mattermost",
+    "User Key": "Chiave Utente",
+    "Device": "Dispositivo",
+    "Message Title": "Titolo Messaggio",
+    "Notification Sound": "Suono di Notifica",
+    "More info on:": "Maggiori informazioni su: {0}",
+    "pushoverDesc1": "Priorità di Emergenza (2) ha 30 secondi di timeout tra un tentativo e l'altro e scadrà dopo un'ora.",
+    "pushoverDesc2": "Se si vuole inviare la notifica a dispositivi differenti, riempire il campo Dispositivi.",
+    "SMS Type": "Tipo di SMS",
+    "octopushTypePremium": "Premium (Veloce - raccomandato per allertare)",
+    "octopushTypeLowCost": "A Basso Costo (Lento - talvolta bloccato dall'operatore)",
+    "checkPrice": "Controlla {0} prezzi:",
+    "apiCredentials": "Credenziali API",
+    "octopushLegacyHint": "Si vuole utilizzare la vecchia versione (2011-2020) oppure la nuova versione di Octopush?",
+    "Check octopush prices": "Controlla i prezzi di Octopush {0}.",
+    "octopushPhoneNumber": "Numero di telefono (formato internazionale (p.e.): +33612345678) ",
+    "octopushSMSSender": "Nome del mittente: 3-11 caratteri alfanumerici e spazi (a-zA-Z0-9)",
+    "LunaSea Device ID": "ID dispositivo LunaSea",
+    "Apprise URL": "URL Apprise",
+    "Example:": "Esempio: {0}",
+    "Read more:": "Maggiori informazioni: {0}",
+    "Status:": "Stato: {0}",
+    "Read more": "Maggiori informazioni",
+    "appriseInstalled": "Apprise è installato.",
+    "appriseNotInstalled": "Apprise non è installato. {0}",
+    "Access Token": "Token di accesso",
+    "Channel access token": "Token di accesso al canale",
+    "Line Developers Console": "Console sviluppatori Line",
+    "lineDevConsoleTo": "Console sviluppatori Line - {0}",
+    "Basic Settings": "Impostazioni Base",
+    "User ID": "ID Utente",
+    "Messaging API": "API di Messaggistica",
+    "wayToGetLineChannelToken": "Prima accedi a {0}, crea un provider e un canale (API di Messaggistica), dopodiché puoi avere il token di accesso e l'id utente dal menù sopra.",
+    "Icon URL": "URL Icona",
+    "aboutIconURL": "È possibile impostare un collegameno a una immagine in \"URL Icona\" per modificare l'immagine di profilo. Non verrà utilizzata se è impostata l'Icona Emoji.",
+    "aboutMattermostChannelName": "È possibile modificare il canale predefinito che dove il webhook manda messaggi immettendo il nome del canale nel campo \"Nome Canale\". Questo va abilitato nelle impostazioni webhook di Mattermost webhook. P.E.: #altro-canale",
+    "matrix": "Matrix",
+    "promosmsTypeEco": "SMS ECO - economico, ma lento e spesso sovraccarico. Limitato solamente a destinatari Polacchi.",
+    "promosmsTypeFlash": "SMS FLASH - Il messaggio sarà automaticamente mostrato sul dispositivo dei destinatari. Limitato solo a destinatari Polacchi.",
+    "promosmsTypeFull": "SMS FULL - Premium, È possibile utilizzare il proprio nome come mittente (è necessario prima registrare il nome). Affidabile per gli allarmi.",
+    "promosmsTypeSpeed": "SMS SPEED - Maggior priorità. Rapido, affidabile, ma costoso (costa il doppio di SMS FULL).",
+    "promosmsPhoneNumber": "Numero di Telefono (per destinatari Polacchi si può omettere il codice area)",
+    "promosmsSMSSender": "Mittente SMS : Nome preregistrato oppure uno dei seguenti: InfoSMS, SMS Info, MaxSMS, INFO, SMS",
+    "Feishu WebHookUrl": "URL WebHook di Feishu",
+    "matrixHomeserverURL": "URL Server (con http(s):// e opzionalmente la porta)",
+    "Internal Room Id": "ID Stanza Interna",
+    "matrixDesc1": "È possibile recuperare l'ID della stanza all'interno delle impostazioni avanzate della stanza nel client Matrix. Dovrebbe essere simile a !QMdRCpUIfLwsfjxye6:server.di.casa.",
+    "matrixDesc2": "È altamente raccomandata la creazione di un nuovo utente e di non utilizare il proprio token di accesso Matrix poiché darà pieno controllo al proprio account e a tutte le stanze in cui si ha accesso. Piuttosto, si crei un nuovo utente per invitarlo nella stanza dove si vuole ricevere le notifiche. Si può accedere al token eseguendo {0}",
+    "Method": "Metodo",
+    "Body": "Body",
+    "Headers": "Intestazioni",
+    "PushUrl": "URL di Push",
+    "HeadersInvalidFormat": "L'intestazione di richiesta non è un JSON valido: ",
+    "BodyInvalidFormat": "Il corpo di richiesta non è un JSON valido: ",
+    "Monitor History": "Storico monitor",
+    "clearDataOlderThan": "Mantieni lo storico per {0} giorni.",
+    "PasswordsDoNotMatch": "Le password non corrispondono.",
+    "records": "records",
+    "One record": "One record",
+    "steamApiKeyDescription": "Per monitorare un server di gioco Steam è necessaria una Web-API Key di Steam. È possibile registrarne una qui: ",
+    "Current User": "Utente corrente",
+    "recent": "Recenti",
+    "Done": "Fatto",
+    "Info": "Info",
+    "Security": "Sicurezza",
+    "Steam API Key": "API Key di Steam",
+    "Shrink Database": "Comprimi database",
+    "Pick a RR-Type...": "Scegli un tipo di RR…",
+    "Pick Accepted Status Codes...": "Scegli i codici di Stato Accettati…",
+    "Default": "Predefinito",
+    "HTTP Options": "Opzioni HTTP",
+    "Create Incident": "Segnala incidente",
+    "Title": "Titolo",
+    "Content": "Contenuto",
+    "Style": "Stile",
+    "info": "informativo",
+    "warning": "attenzione",
+    "danger": "critico",
+    "primary": "predefinito",
+    "light": "chiaro",
+    "dark": "scuro",
+    "Post": "Posta",
+    "Please input title and content": "Inserire il titolo e il contenuto",
+    "Created": "Creato",
+    "Last Updated": "Ultima modifica",
+    "Unpin": "Rimuovi",
+    "Switch to Light Theme": "Utilizza il tema chiaro",
+    "Switch to Dark Theme": "Utilizza il tema scuro",
+    "Show Tags": "Mostra etichette",
+    "Hide Tags": "Nascondi etichette",
+    "Description": "Descrizione",
+    "No monitors available.": "Nessun monitor disponibile.",
+    "Add one": "Aggiungine uno",
+    "No Monitors": "Nessun monitor presente",
+    "Untitled Group": "Gruppo senza titolo",
+    "Services": "Servizi",
+    "Discard": "Scarta modifiche",
+    "Cancel": "Annulla",
+    "Powered by": "Powered by",
+    "shrinkDatabaseDescription": "Lancia il comando \"VACUUM\" sul database SQLite. Se il database è stato creato dopo la versione 1.10.0, la funzione \"AUTO_VACUUM\" è già abilitata di default e quindi questa azione non è necessaria.",
+    "serwersms": "SerwerSMS.pl",
+    "serwersmsAPIUser": "Nome utente API (incl. prefisso webapi_)",
+    "serwersmsAPIPassword": "Password API",
+    "serwersmsPhoneNumber": "Numero di Telefono",
+    "serwersmsSenderName": "Nome del mittente SMS (registrato via portale cliente)",
+    "stackfield": "Stackfield",
+    "smtpDkimSettings": "Impostazioni DKIM",
+    "smtpDkimDesc": "Fare riferimento a Nodemailer DKIM {0} per l'utilizzo.",
+    "documentation": "documentazione",
+    "smtpDkimDomain": "Dominio",
+    "smtpDkimKeySelector": "Selettore Chiave",
+    "smtpDkimPrivateKey": "Chiave Privata",
+    "smtpDkimHashAlgo": "Algoritmo di hashing (opzionale)",
+    "smtpDkimheaderFieldNames": "Campi Intestazione da firmare (opzionale)",
+    "smtpDkimskipFields": "Campi Intestazione da non firmare (opzionale)",
+    "GoogleChat": "Google Chat (solo per Google Workspace)",
+    "Help": "Aiuto",
+    "Maintenance": "Manutenzione",
+    "statusMaintenance": "In manutenzione",
+    "General Monitor Type": "Monitor Generico",
+    "Game": "Gioco",
+    "Passive Monitor Type": "Monitor Passivo",
+    "Specific Monitor Type": "Monitor Specifico",
+    "Monitor": "Monitor | Monitor",
+    "Topic": "Argomento",
+    "markdownSupported": "Sintassi markdown supportata",
+    "Proxy Server": "Server Proxy",
+    "Select status pages...": "Seleziona pagine di stato…",
+    "Schedule maintenance": "Pianifica manutenzione",
+    "Start of maintenance": "Inizio della manutenzione",
+    "All Status Pages": "Tutte le pagine di stato",
+    "webhookAdditionalHeadersTitle": "Headers aggiuntivi",
+    "resendEveryXTimes": "Reinvia ogni {0} volte",
+    "resendDisabled": "Reinvio disabilitato",
+    "Resend Notification if Down X times consequently": "Reinvia la notifica se Down X volte di seguito",
+    "Add New Status Page": "Aggiungi nuova pagina di stato",
+    "webhookAdditionalHeadersDesc": "Imposta gli header aggiuntivi inviati nel webhook.",
+    "topicExplanation": "MQTT topic da controllare",
+    "successMessage": "Messaggio con successo",
+    "successMessageExplanation": "Messaggio MQTT considerato come successo",
+    "error": "errore",
+    "critical": "critico",
+    "Customize": "Personalizza",
+    "Custom Footer": "Piè di pagina personalizzato",
+    "Custom CSS": "CSS personalizzato",
+    "deleteStatusPageMsg": "Confermi la cancellazione di questa pagina di stato?",
+    "default": "Predefinito",
+    "enabled": "Abilitato",
+    "setAsDefault": "Imposta come predefinito",
+    "deleteProxyMsg": "Confermi la cancellazione di questo proxy per tutti i monitoraggi?",
+    "proxyDescription": "I proxy devono essere assegnati ad un monitoraggio per essere operativi.",
+    "setAsDefaultProxyDescription": "Questo proxy sarà abilitato come predefinito per tutti i nuovi monitoraggi. E' possibile disabilitare il proxy in modo indipendente per ogni singolo monitoraggio.",
+    "Certificate Chain": "Catena di certificati",
+    "Invalid": "Non valido",
+    "User": "Utente",
+    "Installed": "Installato",
+    "Not installed": "Non installato",
+    "Running": "In esecuzione",
+    "Not running": "Fermo",
+    "Remove Token": "Rimuovere token",
+    "Start": "Avvio",
+    "Next": "Prossimo",
+    "No Proxy": "Nessun proxy",
+    "Authentication": "Autenticazione",
+    "New Status Page": "Nuova pagina di stato",
+    "Page Not Found": "Pagina non trovata",
+    "Affected Monitors": "Monitoraggi interessati",
+    "Pick Affected Monitors...": "Seleziona i monitoraggi interessati…",
+    "Valid": "Valido"
+}
diff --git a/src/lang/ja.json b/src/lang/ja.json
new file mode 100644
index 000000000..06f0d3c31
--- /dev/null
+++ b/src/lang/ja.json
@@ -0,0 +1,201 @@
+{
+    "languageName": "日本語",
+    "checkEverySecond": "{0}秒ごとにチェックします。",
+    "retriesDescription": "サービスがダウンとしてマークされ、通知が送信されるまでの最大リトライ数",
+    "ignoreTLSError": "HTTPS ウェブサイトの TLS/SSL エラーを無視する",
+    "upsideDownModeDescription": "ステータスの扱いを逆にします。サービスに到達可能な場合は、DOWNとなる。",
+    "maxRedirectDescription": "フォローするリダイレクトの最大数。リダイレクトを無効にするには0を設定する。",
+    "acceptedStatusCodesDescription": "成功した応答とみなされるステータスコードを選択する。",
+    "passwordNotMatchMsg": "繰り返しのパスワードが一致しません。",
+    "notificationDescription": "監視を機能させるには、監視に通知を割り当ててください。",
+    "keywordDescription": "プレーンHTMLまたはJSON応答でキーワードを検索し、大文字と小文字を区別します",
+    "pauseDashboardHome": "一時停止",
+    "deleteMonitorMsg": "この監視を削除してよろしいですか?",
+    "deleteNotificationMsg": "全ての監視のこの通知を削除してよろしいですか?",
+    "resolverserverDescription": "Cloudflareがデフォルトのサーバーですが、いつでもリゾルバサーバーを変更できます。",
+    "rrtypeDescription": "監視するRRタイプを選択します",
+    "pauseMonitorMsg": "一時停止しますか?",
+    "Settings": "設定",
+    "Dashboard": "ダッシュボード",
+    "New Update": "新しいアップデート",
+    "Language": "言語",
+    "Appearance": "外観",
+    "Theme": "テーマ",
+    "General": "全般的",
+    "Version": "バージョン",
+    "Check Update On GitHub": "GitHubでアップデートを確認する",
+    "List": "一覧",
+    "Add": "追加",
+    "Add New Monitor": "監視の追加",
+    "Quick Stats": "統計",
+    "Up": "Up",
+    "Down": "Down",
+    "Pending": "中止",
+    "Unknown": "不明",
+    "Pause": "一時停止",
+    "Name": "名前",
+    "Status": "ステータス",
+    "DateTime": "日時",
+    "Message": "メッセージ",
+    "No important events": "重要なイベントなし",
+    "Resume": "再開",
+    "Edit": "編集",
+    "Delete": "削除",
+    "Current": "現在",
+    "Uptime": "起動時間",
+    "Cert Exp.": "証明書有効期限",
+    "day": "日 | 日間",
+    "-day": "-日",
+    "hour": "時間",
+    "-hour": "-時間",
+    "Response": "レスポンス",
+    "Ping": "Ping",
+    "Monitor Type": "監視タイプ",
+    "Keyword": "キーワード",
+    "Friendly Name": "分かりやすい名前",
+    "URL": "URL",
+    "Hostname": "ホスト名",
+    "Port": "ポート",
+    "Heartbeat Interval": "監視間隔",
+    "Retries": "Retries",
+    "Advanced": "Advanced",
+    "Upside Down Mode": "Upside Down Mode",
+    "Max. Redirects": "最大リダイレクト数",
+    "Accepted Status Codes": "承認されたステータスコード",
+    "Save": "保存",
+    "Notifications": "通知",
+    "Not available, please setup.": "利用できません。設定してください。",
+    "Setup Notification": "通知設定",
+    "Light": "Light",
+    "Dark": "Dark",
+    "Auto": "Auto",
+    "Theme - Heartbeat Bar": "Theme - Heartbeat Bar",
+    "Normal": "通常",
+    "Bottom": "下部",
+    "None": "なし",
+    "Timezone": "タイムゾーン",
+    "Search Engine Visibility": "検索エンジンでの表示",
+    "Allow indexing": "インデックス作成を許可する",
+    "Discourage search engines from indexing site": "検索エンジンにインデックスさせないようにする",
+    "Change Password": "パスワード変更",
+    "Current Password": "現在のパスワード",
+    "New Password": "新しいパスワード",
+    "Repeat New Password": "確認のため新しいパスワードをもう一度",
+    "Update Password": "パスワードの更新",
+    "Disable Auth": "認証の無効化",
+    "Enable Auth": "認証の有効化",
+    "Logout": "ログアウト",
+    "Leave": "作業を中止する",
+    "I understand, please disable": "理解した上で無効化する",
+    "Confirm": "確認",
+    "Yes": "はい",
+    "No": "いいえ",
+    "Username": "ユーザー名",
+    "Password": "パスワード",
+    "Remember me": "パスワードを忘れた場合",
+    "Login": "ログイン",
+    "No Monitors, please": "監視がありません",
+    "add one": "add one",
+    "Notification Type": "通知タイプ",
+    "Email": "Eメール",
+    "Test": "テスト",
+    "Certificate Info": "証明書情報",
+    "Resolver Server": "問い合わせ先DNSサーバ",
+    "Resource Record Type": "DNSレコード設定",
+    "Last Result": "最終結果",
+    "Create your admin account": "Adminアカウントの作成",
+    "Repeat Password": "パスワード確認",
+    "respTime": "応答時間 (ms)",
+    "notAvailableShort": "N/A",
+    "Create": "作成",
+    "clearEventsMsg": "この監視のすべての記録を削除してもよろしいですか?",
+    "clearHeartbeatsMsg": "この監視のすべての異常記録を削除してもよろしいですか?",
+    "confirmClearStatisticsMsg": "すべての統計を削除してもよろしいですか?",
+    "Clear Data": "データを削除",
+    "Events": "統計",
+    "Heartbeats": "異常記録",
+    "Auto Get": "自動取得",
+    "enableDefaultNotificationDescription": "監視を作成するごとに、この通知方法はデフォルトで有効になります。監視ごとに通知を無効にすることもできます。",
+    "Default enabled": "デフォルトで有効にする",
+    "Also apply to existing monitors": "既存のモニターにも適用する",
+    "Export": "エクスポート",
+    "Import": "インポート",
+    "backupDescription": "すべての監視と通知方法をJSONファイルにできます。",
+    "backupDescription2": "※ 履歴と統計のデータはバックアップされません。",
+    "backupDescription3": "通知に使用するトークンなどの機密データも含まれています。注意して扱ってください。",
+    "alertNoFile": "インポートするファイルを選択してください。",
+    "alertWrongFileType": "JSONファイルを選択してください。",
+    "twoFAVerifyLabel": "トークンを入力して、2段階認証を有効にします。",
+    "tokenValidSettingsMsg": "トークンの確認が完了しました! 「保存」をしてください。",
+    "confirmEnableTwoFAMsg": "2段階認証を「有効」にします。よろしいですか?",
+    "confirmDisableTwoFAMsg": "2段階認証を「無効」にします。よろしいですか?",
+    "Apply on all existing monitors": "既存のすべてのモニターに適用する",
+    "Verify Token": "認証する",
+    "Setup 2FA": "2段階認証の設定",
+    "Enable 2FA": "2段階認証を有効にする",
+    "Disable 2FA": "2段階認証を無効にする",
+    "2FA Settings": "2段階認証の設定",
+    "Two Factor Authentication": "2段階認証",
+    "Clear all statistics": "すべての記録を削除",
+    "retryCheckEverySecond": "Retry every {0} seconds.",
+    "importHandleDescription": "同じ名前のすべての監視または通知方法を上書きしない場合は、「既存のをスキップ」を選択します。 「上書きする」は、既存のすべてのモニターと通知を削除します。",
+    "confirmImportMsg": "バックアップをインポートしてもよろしいですか?希望するオプションを選択してください。",
+    "Heartbeat Retry Interval": "異常検知後の再試行間隔",
+    "Import Backup": "バックアップのインポート",
+    "Export Backup": "バックアップのエクスポート",
+    "Skip existing": "既存のをスキップする",
+    "Overwrite": "上書きする",
+    "Options": "オプション",
+    "Keep both": "どちらも保持する",
+    "Tags": "タグ",
+    "Add New below or Select...": "新規追加または選択...",
+    "Tag with this name already exist.": "この名前のタグはすでに存在しています。",
+    "Tag with this value already exist.": "この値のタグはすでに存在しています。",
+    "color": "色",
+    "value (optional)": "値 (optional)",
+    "Search...": "検索...",
+    "Avg. Ping": "平均Ping時間",
+    "Avg. Response": "平均応答時間",
+    "Entry Page": "エントリーページ",
+    "statusPageNothing": "ここには何もありません。グループまたは監視を追加してください。",
+    "No Services": "No Services",
+    "All Systems Operational": "すべてのサービスが稼働中",
+    "Partially Degraded Service": "部分的にサービスが停止中",
+    "Degraded Service": "サービスが停止中",
+    "Add Group": "グループの追加",
+    "Add a monitor": "監視の追加",
+    "Edit Status Page": "ステータスページ編集",
+    "Go to Dashboard": "ダッシュボード",
+    "Status Page": "ステータスページ",
+    "Status Pages": "ステータスページ",
+    "Shrink Database": "データベースの縮小",
+    "Start": "始める",
+    "Retry": "リトライ",
+    "Please read": "読んでください",
+    "Orange": "橙",
+    "Gateway Type": "ゲートウェイの種類",
+    "Game": "ゲーム",
+    "Help": "ヘルプ",
+    "Maintenance": "メンテナンス",
+    "resendDisabled": "再送信不可",
+    "Schedule maintenance": "メンテナンスのスケジュール",
+    "Affected Monitors": "影響を受けるモニター",
+    "Pick Affected Monitors...": "影響を受けるモニターを選択…",
+    "Start of maintenance": "メンテナンス開始",
+    "General Monitor Type": "汎用モニタータイプ",
+    "resendEveryXTimes": "{0}回ごとに再送信",
+    "markdownSupported": "マークダウン構文がサポートされています",
+    "All Status Pages": "すべてのステータス ページ",
+    "Monitor": "モニター |モニター",
+    "Resend Notification if Down X times consequently": "ダウンX回連続で通知再送",
+    "Push URL": "プッシュ URL",
+    "needPushEvery": "{0} 秒ごとにこの URL を呼び出す必要があります。",
+    "pushOptionalParams": "オプションのパラメーター: {0}",
+    "disableauth.message1": "<strong>認証を無効</strong>にしてもよろしいですか?",
+    "disableauth.message2": "これは、Cloudflare Access、Authelia、またはその他の認証メカニズムなど、Uptime Kuma の前に<strong>サードパーティ認証を実装するシナリオ向けに設計されています</strong>。",
+    "Please use this option carefully!": "このオプションは慎重に使用してください。",
+    "Primary Base URL": "プライマリ ベース URL",
+    "statusMaintenance": "メンテナンス",
+    "Passive Monitor Type": "パッシブモニタータイプ",
+    "Specific Monitor Type": "特定のモニターの種類"
+}
diff --git a/src/lang/ko-KR.json b/src/lang/ko-KR.json
new file mode 100644
index 000000000..079c9f584
--- /dev/null
+++ b/src/lang/ko-KR.json
@@ -0,0 +1,695 @@
+{
+    "languageName": "한국어",
+    "checkEverySecond": "{0}초마다 확인해요",
+    "retryCheckEverySecond": "{0}초마다 다시 확인해요",
+    "retriesDescription": "서비스가 중단된 후 알림을 보내기 전 최대 재시도 횟수",
+    "ignoreTLSError": "HTTPS 웹사이트에서 TLS/SSL 오류 무시하기",
+    "upsideDownModeDescription": "서버 상태를 반대로 표시해요. 서버가 작동하면 오프라인으로 표시할 거예요.",
+    "maxRedirectDescription": "최대 리다이렉트 횟수예요. 0을 입력하면 리다이렉트를 꺼요.",
+    "acceptedStatusCodesDescription": "응답 성공으로 간주할 상태 코드를 정해요.",
+    "passwordNotMatchMsg": "비밀번호 재입력이 일치하지 않아요.",
+    "notificationDescription": "모니터링에 알림을 설정할 수 있어요.",
+    "keywordDescription": "HTML 이나 JSON에서 대소문자를 구분해 키워드를 검색해요.",
+    "pauseDashboardHome": "일시 정지",
+    "deleteMonitorMsg": "정말 이 모니터링을 삭제할까요?",
+    "deleteNotificationMsg": "정말 이 알림을 모든 모니터링에서 삭제할까요?",
+    "resolverserverDescription": "Cloudflare가 기본 서버예요, 원한다면 언제나 다른 Resolver 서버로 변경할 수 있어요.",
+    "rrtypeDescription": "모니터링할 RR-Type을 선택해요",
+    "pauseMonitorMsg": "정말 이 모니터링을 일시 정지할까요?",
+    "enableDefaultNotificationDescription": "새로 추가하는 모든 모니터링에 이 알림을 기본적으로 활성화해요. 각 모니터에 대해 별도로 알림을 비활성화할 수 있어요.",
+    "clearEventsMsg": "정말 이 모니터링에 대한 모든 이벤트를 삭제할까요?",
+    "clearHeartbeatsMsg": "정말 이 모니터링에 대한 모든 하트비트를 삭제할까요?",
+    "confirmClearStatisticsMsg": "정말 모든 통계를 삭제할까요?",
+    "importHandleDescription": "이름이 같은 모든 모니터링이나 알림을 건너뛰려면 '기존값 건너뛰기'를 선택해주세요. '덮어쓰기'는 기존의 모든 모니터링과 알림을 삭제해요.",
+    "confirmImportMsg": "정말 백업을 가져올까요? 가져오기 옵션을 제대로 설정했는지 다시 확인해주세요.",
+    "twoFAVerifyLabel": "토큰을 입력해 2단계 인증이 작동하는지 확인해주세요",
+    "tokenValidSettingsMsg": "토큰이 유효해요! 이제 2단계 인증 설정을 저장할 수 있어요.",
+    "confirmEnableTwoFAMsg": "정말 2단계 인증을 활성화할까요?",
+    "confirmDisableTwoFAMsg": "정말 2단계 인증을 비활성화할까요?",
+    "Settings": "설정",
+    "Dashboard": "대시보드",
+    "New Update": "새로운 업데이트",
+    "Language": "언어",
+    "Appearance": "디스플레이",
+    "Theme": "테마",
+    "General": "일반",
+    "Version": "버전",
+    "Check Update On GitHub": "깃허브에서 업데이트 확인",
+    "List": "목록",
+    "Add": "추가",
+    "Add New Monitor": "새로운 모니터링 추가하기",
+    "Quick Stats": "간단한 정보",
+    "Up": "온라인",
+    "Down": "오프라인",
+    "Pending": "대기 중",
+    "Unknown": "알 수 없음",
+    "Pause": "일시 정지",
+    "Name": "이름",
+    "Status": "상태",
+    "DateTime": "날짜",
+    "Message": "메시지",
+    "No important events": "중요 이벤트 없음",
+    "Resume": "재개",
+    "Edit": "수정",
+    "Delete": "삭제",
+    "Current": "현재",
+    "Uptime": "업타임",
+    "Cert Exp.": "인증서 만료",
+    "day": "일",
+    "-day": "-일",
+    "hour": "시간",
+    "-hour": "-시간",
+    "Response": "응답",
+    "Ping": "핑",
+    "Monitor Type": "모니터링 종류",
+    "Keyword": "키워드",
+    "Friendly Name": "이름",
+    "URL": "URL",
+    "Hostname": "호스트네임",
+    "Port": "포트",
+    "Heartbeat Interval": "하트비트 주기",
+    "Retries": "재시도",
+    "Heartbeat Retry Interval": "하트비트 재시도 주기",
+    "Advanced": "고급",
+    "Upside Down Mode": "상태 반전 모드",
+    "Max. Redirects": "최대 리다이렉트",
+    "Accepted Status Codes": "응답 성공 상태 코드",
+    "Save": "저장",
+    "Notifications": "알림",
+    "Not available, please setup.": "존재하지 않아요, 새로운 거 하나 만드는 건 어때요?",
+    "Setup Notification": "알림 설정",
+    "Light": "화이트",
+    "Dark": "다크",
+    "Auto": "자동",
+    "Theme - Heartbeat Bar": "테마 - 하트비트 바",
+    "Normal": "기본값",
+    "Bottom": "가운데",
+    "None": "없애기",
+    "Timezone": "시간대",
+    "Search Engine Visibility": "검색 엔진 활성화",
+    "Allow indexing": "인덱싱 허용",
+    "Discourage search engines from indexing site": "검색 엔진 인덱싱 거부",
+    "Change Password": "비밀번호 변경",
+    "Current Password": "기존 비밀번호",
+    "New Password": "새 비밀번호",
+    "Repeat New Password": "새로운 비밀번호 재입력",
+    "Update Password": "비밀번호 변경",
+    "Disable Auth": "인증 비활성화",
+    "Enable Auth": "인증 활성화",
+    "disableauth.message1": "정말로 <strong>인증 기능을 끌까요</strong>?",
+    "disableauth.message2": "이 기능은 <strong>Cloudflare Access와 같은 서드파티 인증</strong>을 Uptime Kuma 앞에 둔 사용자를 위한 기능이에요.",
+    "Please use this option carefully!": "신중하게 사용하세요!",
+    "Logout": "로그아웃",
+    "Leave": "나가기",
+    "I understand, please disable": "기능에 대해 이해했으니 꺼주세요.",
+    "Confirm": "확인",
+    "Yes": "확인",
+    "No": "취소",
+    "Username": "이름",
+    "Password": "비밀번호",
+    "Remember me": "비밀번호 기억하기",
+    "Login": "로그인",
+    "No Monitors, please": "모니터링이 현재 없어요,",
+    "add one": "한번 추가해보실래요?",
+    "Notification Type": "알림 종류",
+    "Email": "이메일",
+    "Test": "테스트",
+    "Certificate Info": "인증서 정보",
+    "Resolver Server": "Resolver 서버",
+    "Resource Record Type": "리소스 레코드 유형",
+    "Last Result": "최근 결과",
+    "Create your admin account": "관리자 계정 만들기",
+    "Repeat Password": "비밀번호 재입력",
+    "Import Backup": "백업 가져오기",
+    "Export Backup": "백업 내보내기",
+    "Export": "내보내기",
+    "Import": "가져오기",
+    "respTime": "응답 시간 (ms)",
+    "notAvailableShort": "N/A",
+    "Default enabled": "기본 알림으로 설정",
+    "Apply on all existing monitors": "기존 모니터링에 모두 적용하기",
+    "Create": "생성하기",
+    "Clear Data": "데이터 삭제",
+    "Events": "이벤트",
+    "Heartbeats": "하트비트",
+    "Auto Get": "자동 Get",
+    "backupDescription": "모든 모니터링과 알림을 JSON 파일 형식에 저장할 수 있어요.",
+    "backupDescription2": "히스토리와 이벤트 데이터는 포함되어 있지 않아요.",
+    "backupDescription3": "알림 토큰과 같은 보안 데이터가 내보내기 파일에 포함되어 있으므로 관리에 주의해주세요.",
+    "alertNoFile": "가져오기를 하기 위해 파일을 선택해주세요.",
+    "alertWrongFileType": "JSON 파일을 선택해주세요.",
+    "Clear all statistics": "모든 통계치 삭제",
+    "Skip existing": "기존값 건너뛰기",
+    "Overwrite": "덮어쓰기",
+    "Options": "옵션",
+    "Keep both": "두개 모두 보존",
+    "Verify Token": "토큰 검증",
+    "Setup 2FA": "2단계 인증 설정하기",
+    "Enable 2FA": "2단계 인증 활성화",
+    "Disable 2FA": "2단계 인증 비활성화",
+    "2FA Settings": "2단계 인증 설정",
+    "Two Factor Authentication": "2단계 인증",
+    "Active": "활성화",
+    "Inactive": "비활성화",
+    "Token": "토큰",
+    "Show URI": "URI 보기",
+    "Tags": "태그",
+    "Add New below or Select...": "아래 새롭게 추가 또는 선택…",
+    "Tag with this name already exist.": "같은 태그 이름이 이미 존재해요.",
+    "Tag with this value already exist.": "같은 값을 가진 태그가 이미 존재해요.",
+    "color": "색상",
+    "value (optional)": "값 (선택)",
+    "Gray": "회색",
+    "Red": "빨간색",
+    "Orange": "주황색",
+    "Green": "초록색",
+    "Blue": "파란색",
+    "Indigo": "남색",
+    "Purple": "보라색",
+    "Pink": "핑크색",
+    "Search...": "검색…",
+    "Avg. Ping": "평균 핑",
+    "Avg. Response": "평균 응답",
+    "Entry Page": "첫 페이지",
+    "statusPageNothing": "아무것도 없어요. 새로운 그룹 또는 모니터링을 추가해주세요.",
+    "No Services": "서비스 없음",
+    "All Systems Operational": "모든 시스템 정상",
+    "Partially Degraded Service": "일부 시스템 비정상",
+    "Degraded Service": "모든 시스템 비정상",
+    "Add Group": "그룹 추가",
+    "Add a monitor": "모니터링 추가",
+    "Edit Status Page": "상태 페이지 수정",
+    "Go to Dashboard": "대시보드로 가기",
+    "Status Page": "상태 페이지",
+    "Status Pages": "상태 페이지",
+    "defaultNotificationName": "내 {notification} 알림 ({number})",
+    "here": "여기",
+    "Required": "필수",
+    "telegram": "Telegram",
+    "Bot Token": "봇 토큰",
+    "wayToGetTelegramToken": "토큰은 여기서 얻을 수 있어요: {0}.",
+    "Chat ID": "채팅 ID",
+    "supportTelegramChatID": "개인 채팅 / 그룹 / 채널의 ID를 지원해요",
+    "wayToGetTelegramChatID": "봇에 메시지를 보내 채팅 ID를 얻고 밑에 URL로 이동해 chat_id를 볼 수 있어요",
+    "YOUR BOT TOKEN HERE": "봇 토큰",
+    "chatIDNotFound": "채팅 ID를 찾을 수 없어요. 먼저 봇에게 메시지를 보내주세요",
+    "webhook": "Webhook",
+    "Post URL": "Post URL",
+    "Content Type": "Content Type",
+    "webhookJsonDesc": "{0}은 Express.js와 같은 최신 HTTP 서버에 적합해요",
+    "webhookFormDataDesc": "{multipart}은 PHP에 적합해요. {decodeFunction}를 기준으로 JSON을 디코딩하면 되어요",
+    "smtp": "Email (SMTP)",
+    "secureOptionNone": "없음 / STARTTLS (25, 587)",
+    "secureOptionTLS": "TLS (465)",
+    "Ignore TLS Error": "TLS 에러 무시하기",
+    "From Email": "보내는 이메일",
+    "To Email": "받는 이메일",
+    "smtpCC": "참조",
+    "smtpBCC": "숨은 참조",
+    "discord": "Discord",
+    "Discord Webhook URL": "Discord 웹훅 URL",
+    "wayToGetDiscordURL": "서버 설정 -> 연동 -> 웹후크 보기 -> 새 웹후크에서 얻을 수 있어요",
+    "Bot Display Name": "표시 이름",
+    "Prefix Custom Message": "접두사 메시지",
+    "Hello @everyone is...": "{'@'}everyone 서버 상태 알림이에요…",
+    "teams": "Microsoft Teams",
+    "Webhook URL": "웹훅 URL",
+    "wayToGetTeamsURL": "{0}에서 Webhook을 어떻게 만드는지 알아보세요.",
+    "signal": "Signal",
+    "Number": "숫자",
+    "Recipients": "받는 사람",
+    "needSignalAPI": "REST API를 사용하는 Signal 클라이언트가 있어야 해요.",
+    "wayToCheckSignalURL": "밑에 URL을 확인해 URL 설정 방법을 볼 수 있어요:",
+    "signalImportant": "경고: 받는 사람의 그룹과 숫자는 섞을 수 없어요!",
+    "gotify": "Gotify",
+    "Application Token": "애플리케이션 토큰",
+    "Server URL": "서버 URL",
+    "Priority": "우선 순위",
+    "slack": "Slack",
+    "Icon Emoji": "아이콘 이모지",
+    "Channel Name": "채널 이름",
+    "Uptime Kuma URL": "Uptime Kuma URL",
+    "aboutWebhooks": "Webhook에 대한 설명: {0}",
+    "aboutChannelName": "Webhook 채널을 무시하려면 {0} 채널 이름칸에 채널 이름을 입력해주세요. 예: #기타-채널",
+    "aboutKumaURL": "Uptime Kuma URL칸을 공백으로 두면 기본적으로 Github Project 페이지로 설정해요.",
+    "emojiCheatSheet": "이모지 목록 시트: {0}",
+    "rocket.chat": "Rocket.chat",
+    "pushover": "Pushover",
+    "pushy": "Pushy",
+    "octopush": "Octopush",
+    "promosms": "PromoSMS",
+    "lunasea": "LunaSea",
+    "apprise": "Apprise (50개 이상 알림 서비스)",
+    "pushbullet": "Pushbullet",
+    "line": "Line Messenger",
+    "mattermost": "Mattermost",
+    "User Key": "유저 키",
+    "Device": "디바이스",
+    "Message Title": "메시지 제목",
+    "Notification Sound": "알림음",
+    "More info on:": "자세한 정보: {0}",
+    "pushoverDesc1": "긴급 우선 순위 (2)는 재시도 사이에 기본적으로 30초의 타임아웃이 있고, 1시간 후에 만료되어요.",
+    "pushoverDesc2": "다른 장치에 알림을 보내려면 장치칸을 입력해주세요.",
+    "SMS Type": "SMS 종류",
+    "octopushTypePremium": "프리미엄 (빠름) - 알림 기능에 적합해요)",
+    "octopushTypeLowCost": "저렴한 요금 (느림) - 가끔 차단될 수 있어요)",
+    "Check octopush prices": "{0}에서 Octopush 가격을 확인할 수 있어요.",
+    "octopushPhoneNumber": "휴대전화 번호 (intl format, 예시: +821023456789) ",
+    "octopushSMSSender": "보내는 사람 이름 : 3-11개의 영숫자 및 여백공간 (a-z, A-Z, 0-9)",
+    "LunaSea Device ID": "LunaSea 장치 ID",
+    "Apprise URL": "Apprise URL",
+    "Example:": "예: {0}",
+    "Read more:": "더 보기: {0}",
+    "Status:": "상태: {0}",
+    "Read more": "더 보기",
+    "appriseInstalled": "Apprise가 설치되어있어요.",
+    "appriseNotInstalled": "Apprise가 설치되어있지 않아요. {0}",
+    "Access Token": "액세스 토큰",
+    "Channel access token": "채널 액세스 토큰",
+    "Line Developers Console": "Line 개발자 콘솔",
+    "lineDevConsoleTo": "Line 개발자 콘솔 - {0}",
+    "Basic Settings": "기본 설정 메뉴",
+    "User ID": "사용자 ID",
+    "Messaging API": "Messaging API 메뉴",
+    "wayToGetLineChannelToken": "먼저 {0}에 액세스하고, 공급자 및 채널 (Messaging API)을 만든 다음, 각 메뉴 밑에 언급된 메뉴에서 채널 액세스 토큰과 사용자 ID를 얻을 수 있어요.",
+    "Icon URL": "아이콘 URL",
+    "aboutIconURL": "\"아이콘 URL\"에 사진 링크를 입력해 프로필 사진을 설정할 수 있어요. 아이콘 이모지가 설정되어 있으면 적용되지 않을 거예요.",
+    "aboutMattermostChannelName": "채널 이름을 입력하면 Webhook이 게시할 기본 채널을 재설정할 수 있어요. 이 설정은 Mattermost 웹훅 설정에서 활성화해야 해요. 예: #기타-채널",
+    "matrix": "Matrix",
+    "promosmsTypeEco": "SMS ECO - 저렴하지만 느리고 가끔 과부하에 걸려요. 폴란드 수신자만 사용할 수 있어요.",
+    "promosmsTypeFlash": "SMS FLASH - 메시지가 받는 사람 장치에 자동으로 표시되어요. 폴란드 수신자만 사용할 수 있어요.",
+    "promosmsTypeFull": "SMS FULL - SMS 프리미엄 티어, 보내는 사람 이름을 먼저 등록해야 해요. 알림 기능에 적합해요.",
+    "promosmsTypeSpeed": "SMS SPEED - 시스템에서 가장 높은 우선순위예요. 매우 빠르고 신뢰할 수 있지만 비용이 많이 들어요 (SMS 전체 가격의 약 두 배).",
+    "promosmsPhoneNumber": "전화 번호 (폴란드 수신자라면 지역번호를 적지 않아도 되어요.)",
+    "promosmsSMSSender": "SMS 보내는 사람 이름 : 미리 등록된 이름 혹은 기본값 중 하나예요: InfoSMS, SMS Info, MaxSMS, INFO, SMS",
+    "Primary Base URL": "기본 URL",
+    "Push URL": "Push URL",
+    "needPushEvery": "이 URL을 {0} 초 마다 호출할 수 있어요.",
+    "pushOptionalParams": "선택적 파라미터: {0}",
+    "emailCustomSubject": "커스텀 주제",
+    "clicksendsms": "ClickSend SMS",
+    "checkPrice": "{0} 가격 확인:",
+    "apiCredentials": "API 인증정보",
+    "octopushLegacyHint": "Octopush 레거시 버전 (2011-2020) 을 사용하시나요? 아니면 새 버전을 사용하시나요?",
+    "Feishu WebHookUrl": "Feishu WebHookURL",
+    "matrixHomeserverURL": "Homeserver URL (http(s):// 와 함께 적어주세요. 그리고 포트 번호는 선택적 입니다.)",
+    "Internal Room Id": "내부 방 ID",
+    "matrixDesc1": "Matrix 클라이언트 방 설정의 고급 섹션에서 내부 방 ID를 찾을 수 있어요. 내부 방 ID는 이렇게 생겼답니다: !QMdRCpUIfLwsfjxye6:home.server.",
+    "matrixDesc2": "사용자의 모든 방에 대한 엑세스가 허용될 수 있어서 새로운 사용자를 만들고 원하는 방에만 초대한 후 엑세스 토큰을 사용하는 것이 좋아요. {0} 이 명령어를 통해 엑세스 토큰을 얻을 수 있어요",
+    "Method": "메서드",
+    "Body": "Body",
+    "Headers": "헤더",
+    "PushUrl": "Push URL",
+    "HeadersInvalidFormat": "요청 Headers의 JSON 형식이 올바르지 않아요: ",
+    "BodyInvalidFormat": "요청 Body의 JSON 형식이 올바르지 않아요: ",
+    "Monitor History": "모니터링 기록",
+    "clearDataOlderThan": "모니터링 기록을 {0}일 동안 저장해요.",
+    "PasswordsDoNotMatch": "비밀번호가 일치하지 않아요.",
+    "records": "records",
+    "One record": "One record",
+    "steamApiKeyDescription": "스팀 게임 서버를 모니터링하려면 Steam Web API 키가 필요해요. API 키는 하단 웹사이트에서 등록할 수 있어요: ",
+    "Current User": "현재 사용자",
+    "recent": "최근",
+    "Done": "완료",
+    "Info": "정보",
+    "Security": "보안",
+    "Steam API Key": "스팀 API 키",
+    "Shrink Database": "데이터베이스 축소",
+    "Pick a RR-Type...": "RR-Type을 골라주세요…",
+    "Pick Accepted Status Codes...": "상태 코드를 골라주세요…",
+    "Default": "기본",
+    "HTTP Options": "HTTP 옵션",
+    "Create Incident": "인시던트 만들기",
+    "Title": "제목",
+    "Content": "내용",
+    "Style": "스타일",
+    "info": "정보",
+    "warning": "주의",
+    "danger": "경고",
+    "primary": "기본",
+    "light": "화이트",
+    "dark": "다크",
+    "Post": "게시",
+    "Please input title and content": "제목과 내용을 작성해주세요",
+    "Created": "생성 날짜",
+    "Last Updated": "마지막 업데이트",
+    "Unpin": "제거",
+    "Switch to Light Theme": "화이트 테마로 전환",
+    "Switch to Dark Theme": "다크 테마로 전환",
+    "Show Tags": "태그 보이기",
+    "Hide Tags": "태그 숨기기",
+    "Description": "설명",
+    "No monitors available.": "모니터링이 없어요.",
+    "Add one": "추가하기",
+    "No Monitors": "모니터링 없음",
+    "Untitled Group": "이름없는 그룹",
+    "Services": "서비스",
+    "Discard": "취소",
+    "Cancel": "취소",
+    "Powered by": "Powered by",
+    "shrinkDatabaseDescription": "SQLite 데이터베이스 VACUUM을 트리거해요. 만약 데이터베이스가 1.10.0 버전 이후에 생성되었다면 AUTO_VACUUM이 설정되어 있어 이 작업은 필요 없을 거에요.",
+    "serwersms": "SerwerSMS.pl",
+    "serwersmsAPIUser": "API Usename (webapi_ 접두사 포함)",
+    "serwersmsAPIPassword": "API 비밀번호",
+    "serwersmsPhoneNumber": "휴대전화 번호",
+    "serwersmsSenderName": "보내는 사람 이름 (customer portal를 통해 가입된 정보)",
+    "stackfield": "Stackfield",
+    "dnsPortDescription": "DNS 서버 포트, 기본값은 53 이에요. 포트는 언제나 변경할 수 있어요.",
+    "PushByTechulus": "Push by Techulus",
+    "GoogleChat": "Google Chat (Google Workspace only)",
+    "topic": "Topic",
+    "topicExplanation": "모니터링할 MQTT Topic",
+    "successMessage": "성공 메시지",
+    "successMessageExplanation": "성공으로 간주되는 MQTT 메시지",
+    "error": "오류",
+    "critical": "크리티컬",
+    "Customize": "커스터마이즈",
+    "Custom Footer": "커스텀 Footer",
+    "Custom CSS": "커스텀 CSS",
+    "smtpDkimSettings": "DKIM 설정",
+    "smtpDkimDesc": "사용 방법은 DKIM {0}를 참조하세요.",
+    "documentation": "문서",
+    "smtpDkimDomain": "도메인 이름",
+    "smtpDkimKeySelector": "Key Selector",
+    "smtpDkimPrivateKey": "Private Key",
+    "smtpDkimHashAlgo": "해시 알고리즘 (선택)",
+    "smtpDkimheaderFieldNames": "서명할 헤더 키 (선택)",
+    "smtpDkimskipFields": "서명하지 않을 헤더 키 (선택)",
+    "wayToGetPagerDutyKey": "Service -> Service Directory -> (서비스 선택) -> Integrations -> Add integration. 에서 찾을 수 있어요. 자세히 알아보려면 {0}에서 \"Events API V2\"를 검색해봐요",
+    "Integration Key": "Integration 키",
+    "Integration URL": "Integration URL",
+    "Auto resolve or acknowledged": "자동 해결 혹은 승인",
+    "do nothing": "아무것도 하지 않기",
+    "auto acknowledged": "자동 승인 (acknowledged)",
+    "auto resolve": "자동 해결 (resolve)",
+    "gorush": "Gorush",
+    "alerta": "Alerta",
+    "alertaApiEndpoint": "API Endpoint",
+    "alertaEnvironment": "환경변수",
+    "alertaApiKey": "API 키",
+    "alertaAlertState": "경고 상태",
+    "alertaRecoverState": "해결된 상태",
+    "deleteStatusPageMsg": "정말 이 상태 페이지를 삭제할까요?",
+    "Proxies": "프록시",
+    "default": "Default",
+    "enabled": "활성화",
+    "setAsDefault": "기본 프록시로 설정",
+    "deleteProxyMsg": "정말 이 프록시를 모든 모니터링에서 삭제할까요?",
+    "proxyDescription": "프록시가 작동하려면 모니터에 할당되어야 해요.",
+    "enableProxyDescription": "이 프록시는 활성화될 때까지 영향을 미치지 않아요. 활성화 상태에 따라 모든 모니터에서 프록시를 일시정지할 수 있어요.",
+    "setAsDefaultProxyDescription": "새로 추가하는 모든 모니터링에 이 프록시를 기본적으로 활성화해요. 각 모니터에 대해 별도로 프록시를 비활성화할 수 있어요.",
+    "Certificate Chain": "인증서 체인",
+    "Valid": "유효",
+    "Invalid": "유효하지 않음",
+    "AccessKeyId": "AccessKey ID",
+    "SecretAccessKey": "AccessKey Secret",
+    "PhoneNumbers": "휴대전화 번호",
+    "TemplateCode": "템플릿 코드",
+    "SignName": "SignName",
+    "Sms template must contain parameters: ": "SMS 템플릿은 다음과 같은 파라미터가 포함되어야 해요: ",
+    "Bark Endpoint": "Bark Endpoint",
+    "WebHookUrl": "웹훅 URL",
+    "SecretKey": "Secret Key",
+    "For safety, must use secret key": "안전을 위해 꼭 Secret Key를 사용하세요.",
+    "Device Token": "기기 Token",
+    "Platform": "플랫폼",
+    "iOS": "iOS",
+    "Android": "Android",
+    "Huawei": "Huawei",
+    "High": "High",
+    "Retry": "재시도",
+    "Topic": "Topic",
+    "WeCom Bot Key": "WeCom Bot Key",
+    "Setup Proxy": "프록시 설정",
+    "Proxy Protocol": "프록시 프로토콜",
+    "Proxy Server": "프록시 서버",
+    "Proxy server has authentication": "프록시 서버에 인증 절차가 있음",
+    "User": "사용자",
+    "Installed": "설치됨",
+    "Not installed": "설치되어 있지 않음",
+    "Running": "작동 중",
+    "Not running": "작동하고 있지 않음",
+    "Remove Token": "토큰 삭제",
+    "Start": "시작",
+    "Stop": "정지",
+    "Uptime Kuma": "Uptime Kuma",
+    "Add New Status Page": "새로운 상태 페이지 만들기",
+    "Slug": "주소",
+    "Accept characters:": "허용되는 문자열:",
+    "startOrEndWithOnly": "{0} 로 시작하거나 끝나야 해요",
+    "No consecutive dashes": "연속되는 대시는 허용되지 않아요",
+    "Next": "다음",
+    "The slug is already taken. Please choose another slug.": "이미 존재하는 주소에요. 다른 주소를 사용해 주세요.",
+    "No Proxy": "프록시 없음",
+    "Authentication": "인증",
+    "HTTP Basic Auth": "HTTP 인증",
+    "New Status Page": "새로운 상태 페이지",
+    "Page Not Found": "페이지를 찾을 수 없어요",
+    "Reverse Proxy": "리버스 프록시",
+    "Backup": "백업",
+    "About": "정보",
+    "wayToGetCloudflaredURL": "({0}에서 Cloudflare 다운로드 하기)",
+    "cloudflareWebsite": "Cloudflare 웹사이트",
+    "Message:": "메시지:",
+    "Don't know how to get the token? Please read the guide:": "토큰을 얻는 방법은 이 가이드를 확인해주세요:",
+    "The current connection may be lost if you are currently connecting via Cloudflare Tunnel. Are you sure want to stop it? Type your current password to confirm it.": "Cloudflare Tunnel를 연결하면 현재 연결이 끊길 수 있어요. 정말 중지할까요? 비밀번호를 입력해 확인하세요.",
+    "Other Software": "다른 소프트웨어",
+    "For example: nginx, Apache and Traefik.": "nginx, Apache, Traefik 등을 사용할 수 있어요.",
+    "Please read": "이 문서를 참조하세요:",
+    "Subject:": "발급 대상:",
+    "Valid To:": "유효 기간:",
+    "Days Remaining:": "남은 일수:",
+    "Issuer:": "발급 기관:",
+    "Fingerprint:": "Fingerprint:",
+    "No status pages": "상태 페이지 없음",
+    "Domain Name Expiry Notification": "도메인 이름 만료 알림",
+    "Proxy": "프록시",
+    "Date Created": "생성된 날짜",
+    "onebotHttpAddress": "OneBot HTTP 주소",
+    "onebotMessageType": "OneBot 메시지 종류",
+    "onebotGroupMessage": "그룹 메시지",
+    "onebotPrivateMessage": "개인 메시지",
+    "onebotUserOrGroupId": "그룹/사용자 ID",
+    "onebotSafetyTips": "안전을 위해 Access 토큰을 설정하세요",
+    "PushDeer Key": "PushDeer 키",
+    "Footer Text": "Footer 문구",
+    "Show Powered By": "Powered By 문구 표시하기",
+    "Domain Names": "도메인 이름",
+    "signedInDisp": "{0} 로그인됨",
+    "signedInDispDisabled": "인증 비활성화됨.",
+    "Certificate Expiry Notification": "인증서 만료 알림",
+    "API Username": "API 사용자 이름",
+    "API Key": "API 키",
+    "Recipient Number": "받는 사람 번호",
+    "From Name/Number": "발신자 이름/번호",
+    "Leave blank to use a shared sender number.": "공유 발신자 번호를 사용하려면 공백으로 두세요.",
+    "Octopush API Version": "Octopush API 버전",
+    "Legacy Octopush-DM": "레거시 Octopush-DM",
+    "endpoint": "endpoint",
+    "octopushAPIKey": "제어판 HTTP API credentials 에서 \"API key\"",
+    "octopushLogin": "제어판 HTTP API credentials 에서 \"Login\"",
+    "promosmsLogin": "API 로그인 이름",
+    "promosmsPassword": "API 비밀번호",
+    "pushoversounds pushover": "Pushover (기본)",
+    "pushoversounds bike": "Bike",
+    "pushoversounds bugle": "Bugle",
+    "pushoversounds cashregister": "Cash Register",
+    "pushoversounds classical": "Classical",
+    "pushoversounds cosmic": "Cosmic",
+    "pushoversounds falling": "Falling",
+    "pushoversounds gamelan": "Gamelan",
+    "pushoversounds incoming": "Incoming",
+    "pushoversounds intermission": "Intermission",
+    "pushoversounds magic": "Magic",
+    "pushoversounds mechanical": "Mechanical",
+    "pushoversounds pianobar": "Piano Bar",
+    "pushoversounds siren": "Siren",
+    "pushoversounds spacealarm": "Space Alarm",
+    "pushoversounds tugboat": "Tug Boat",
+    "pushoversounds alien": "Alien Alarm (long)",
+    "pushoversounds climb": "Climb (long)",
+    "pushoversounds persistent": "Persistent (long)",
+    "pushoversounds echo": "Pushover Echo (long)",
+    "pushoversounds updown": "Up Down (long)",
+    "pushoversounds vibrate": "진동만",
+    "pushoversounds none": "없음 (무음)",
+    "pushyAPIKey": "비밀 API 키",
+    "pushyToken": "기기 토큰",
+    "Show update if available": "사용 가능한 경우에 업데이트 표시",
+    "Also check beta release": "베타 릴리즈 확인",
+    "Using a Reverse Proxy?": "리버스 프록시를 사용하시나요?",
+    "Check how to config it for WebSocket": "웹소켓 대한 설정 방법",
+    "Steam Game Server": "스팀 게임 서버",
+    "Most likely causes:": "원인:",
+    "The resource is no longer available.": "더 이상 사용할 수 없어요...",
+    "There might be a typing error in the address.": "주소에 오탈자가 있을 수 있어요.",
+    "What you can try:": "해결 방법:",
+    "Retype the address.": "주소 다시 입력하기.",
+    "Go back to the previous page.": "이전 페이지로 돌아가기.",
+    "Coming Soon": "Coming Soon",
+    "wayToGetClickSendSMSToken": "{0}에서 API 사용자 이름과 키를 얻을 수 있어요.",
+    "Custom Monitor Type": "커스텀 모니터링",
+    "deleteDockerHostMsg": "정말 이 도커 호스트를 모든 모니터링에서 삭제할까요?",
+    "trustProxyDescription": "'X-Forwarded-*' 헤더를 신뢰해요. 올바른 클라이언트 IP를 얻어야하고Uptime Kuma가 Nginx나 Apache 같은 프록시 뒤에 있다면 이 기능을 활성화해야 해요.",
+    "Long-Lived Access Token can be created by clicking on your profile name (bottom left) and scrolling to the bottom then click Create Token. ": "프로필 이름(왼쪽 아래)을 클릭하고 아래로 스크롤한 다음 토큰 만들기를 클릭하여 장기 액세스 토큰을 만들 수 있어요. ",
+    "Then choose an action, for example switch the scene to where an RGB light is red.": "그런 다음 동작을 선택해요, 예를 들어 장면을 RGB 조명이 빨간색인 곳으로 전환해요.",
+    "backupOutdatedWarning": "Deprecated: 많은 기능이 추가되었고 이 백업 기능은 유지 관리되지 않아 전체 백업을 생성하거나 복원할 수 없어요.",
+    "lastDay3": "매월 세 번째 마지막 날",
+    "maintenanceStatus-under-maintenance": "점검 중",
+    "dnsCacheDescription": "일부 IPv6 환경에서는 작동하지 않을 수 있어요. 문제가 발생하면 비활성화하세요.",
+    "dataRetentionTimeError": "저장 기간은 0 이상이어야 해요",
+    "wayToGetKookGuildID": "Kook 설정에서 'Developer Mode'를 활성화하고 길드를 우클릭해 ID를 얻어요",
+    "You can divide numbers with": "다음과 같이 숫자를 구분할 수 있어요:",
+    "goAlertInfo": "GoAlert는 온콜 스케줄링, 자동 에스컬레이션 및 알림(SMS 또는 음성 통화와 같은)을 위한 오픈 소스 응용 프로그램이에요. 올바른 사람, 올바른 방법, 적절한 시간에 자동으로 참여하세요! {0}",
+    "smseagle": "SMSEagle",
+    "smseagleTo": "휴대전화 번호",
+    "smseagleRecipient": "받는 사람 (쉼표로 구분)",
+    "Maintenance": "점검",
+    "statusMaintenance": "점검 중",
+    "resendEveryXTimes": "{0}번마다 다시 보내요",
+    "resendDisabled": "다시 보내지 않아요",
+    "loadingError": "데이터를 가져올 수 없어요, 나중에 다시 시도하세요.",
+    "plugin": "플러그인",
+    "install": "설치",
+    "installing": "설치 중",
+    "uninstall": "삭제",
+    "uninstalling": "삭제 중",
+    "confirmUninstallPlugin": "정말 이 플러그인을 삭제할까요?",
+    "Guild ID": "길드 ID",
+    "Strategy": "계획",
+    "Free Mobile User Identifier": "무료 모바일 사용자 식별",
+    "Free Mobile API Key": "무료 모바일 API 키",
+    "Enable TLS": "TLS 활성화",
+    "Proto Service Name": "Proto 서비스 이름",
+    "Proto Method": "Proto 메서드",
+    "Proto Content": "Proto Content",
+    "Economy": "경제적",
+    "high": "높음",
+    "Lowcost": "저비용",
+    "SendKey": "SendKey",
+    "SMSManager API Docs": "SMSManager API 문서 ",
+    "Gateway Type": "게이트웨이 종류",
+    "SMSManager": "SMSManager",
+    "Base URL": "베이스 URL",
+    "goAlertIntegrationKeyInfo": "일반적으로 복사된 URL의 토큰 매개 변수 값을 \"aaaaaa-bbb-ccccc-ddd-eeeeeeeee\" 형식으로 서비스에 대한 일반 API 통합 키를 가져와요.",
+    "goAlert": "GoAlert",
+    "Bark Group": "Bark 그룹",
+    "Bark Sound": "Bark 소리",
+    "promosmsAllowLongSMS": "긴 SMS 허용",
+    "smseagleGroup": "전화번호부 그룹 이름",
+    "smseagleContact": "전화번호부 연락처 이름",
+    "smseagleRecipientType": "받는 사람 종류",
+    "smseagleToken": "API 엑세스 토큰",
+    "smseagleUrl": "SMSEagle 기기 URL",
+    "smseagleEncoding": "유니코드로 보내기",
+    "smseaglePriority": "메시지 우선 순위 (0-9, 기본값= 0)",
+    "ntfy Topic": "ntfy 주제",
+    "HomeAssistant": "홈 어시스턴트",
+    "RadiusSecretDescription": "클라이언트와 서버 간의 비밀 키",
+    "RadiusSecret": "Radius 비밀 키",
+    "RadiusCalledStationId": "접속 스테이션의 Id",
+    "RadiusCalledStationIdDescription": "접속 스테이션의 식별자",
+    "RadiusCallingStationId": "접속 요청 스테이션의 Id",
+    "RadiusCallingStationIdDescription": "접속 요청 스테이션의 식별자",
+    "Query": "쿼리",
+    "settingsCertificateExpiry": "TLS 인증서 만료",
+    "certificationExpiryDescription": "HTTPS 모니터링 TLS 인증서가 만료되면 알림을 활성화해요:",
+    "Setup Docker Host": "도커 호스트 설정",
+    "Docker Daemon": "도커 데몬",
+    "socket": "소켓",
+    "tcp": "TCP / HTTP",
+    "Docker Container": "도커 컨테이너",
+    "Container Name / ID": "컨테이너 이름 / ID",
+    "Docker Host": "도커 호스트",
+    "Docker Hosts": "도커 호스트",
+    "Domain": "도메인",
+    "Connection String": "연결 문자열",
+    "Workstation": "워크스테이션",
+    "Packet Size": "패킷 크기",
+    "ZohoCliq": "ZohoCliq",
+    "disableCloudflaredNoAuthMsg": "인증 없음 모드이므로 암호가 필요하지 않아요.",
+    "wayToGetLineNotifyToken": "토큰은 여기서 얻을 수 있어요: {0}",
+    "Examples": "예시",
+    "Home Assistant URL": "홈 어시스턴트 URL",
+    "Long-Lived Access Token": "장기 엑세스 토큰",
+    "Notification Service": "알림 서비스",
+    "default: notify all devices": "기본값: 모든 장치에 알림",
+    "A list of Notification Services can be found in Home Assistant under \"Developer Tools > Services\" search for \"notification\" to find your device/phone name.": "알림 서비스 목록은 홈 어시스턴트의 \"개발자 도구 > 서비스\"에서 \"알림\" 검색해 장치/전화 이름을 찾을 수 있어요.",
+    "Automations can optionally be triggered in Home Assistant:": "자동화는 Home Assistant에서 선택적으로 트리거될 수 있어요:",
+    "Connection Type": "연결 종류",
+    "Trigger type:": "트리거 종류:",
+    "Event type:": "이벤트 종류:",
+    "Event data:": "이벤트 데이터:",
+    "Frontend Version": "프론트엔드 버전",
+    "Frontend Version do not match backend version!": "프론트엔드 버전이 백엔드 버전과 일치하지 않아요!",
+    "confirmDeleteTagMsg": "정말 이 태그를 삭제할까요? 이 태그와 연결된 모니터링은 삭제되지 않아요.",
+    "infiniteRetention": "무한히 저장하려면 0으로 설정하세요.",
+    "backupRecommend": "대신 볼륨 또는 데이터 폴더 (./data/) 를 직접 백업하세요.",
+    "Optional": "선택",
+    "squadcast": "Squadcast",
+    "or": "혹은",
+    "recurringInterval": "반복 - 주기적",
+    "Recurring": "반복",
+    "strategyManual": "직접 활성/비활성화 하기",
+    "warningTimezone": "서버 표준 시간대를 사용해요",
+    "weekdayShortMon": "월",
+    "weekdayShortTue": "화",
+    "weekdayShortWed": "수",
+    "weekdayShortThu": "목",
+    "weekdayShortFri": "금",
+    "weekdayShortSat": "토",
+    "weekdayShortSun": "일",
+    "dayOfWeek": "요일",
+    "dayOfMonth": "날짜",
+    "lastDay": "마지막 날",
+    "lastDay1": "매월 마지막 날",
+    "lastDay2": "매월 마지막 날",
+    "lastDay4": "매월 네 번째 마지막 날",
+    "No Maintenance": "점검 일정이 없어요",
+    "pauseMaintenanceMsg": "정말 일시 정지 할까요?",
+    "maintenanceStatus-inactive": "비활성화",
+    "maintenanceStatus-scheduled": "예약됨",
+    "maintenanceStatus-ended": "완료됨",
+    "maintenanceStatus-unknown": "알 수 없음",
+    "Server Timezone": "서버 시간대",
+    "Display Timezone": "표시 시간대",
+    "statusPageMaintenanceEndDate": "종료",
+    "IconUrl": "아이콘 URL",
+    "Enable DNS Cache": "DNS 캐시 활성화",
+    "Enable": "활성화",
+    "Disable": "비활성화",
+    "Single Maintenance Window": "단일 점검",
+    "Maintenance Time Window of a Day": "점검 시간",
+    "Effective Date Range": "유효 날짜 범위",
+    "Schedule Maintenance": "점검 예약하기",
+    "Date and Time": "날짜 및 시간",
+    "DateTime Range": "날짜 시간 범위",
+    "wayToGetZohoCliqURL": "{0}에서 Webhook을 어떻게 만드는지 배울 수 있어요.",
+    "enableGRPCTls": "TLS 연결 gRPC 요청 전송 허용",
+    "grpcMethodDescription": "메서드 이름은 sayHello, check와 같은 카멜 케이스로 변환되어요.",
+    "deleteMaintenanceMsg": "정말 이 점검을 삭제할까요?",
+    "recurringIntervalMessage": "매일 한 번 실행 | {0}일마다 한 번 실행",
+    "affectedMonitorsDescription": "현재 점검에 영향을 받는 모니터링 선택하기",
+    "affectedStatusPages": "점검 메시지를 표시할 상태 페이지 선택하기",
+    "Kook": "Kook",
+    "atLeastOneMonitor": "최소 1개의 모니터링을 선택하세요",
+    "wayToGetKookBotToken": "{0} 에서 애플리케이션을 만들고 봇 토큰을 얻어요",
+    "Help": "도움말",
+    "Game": "게임",
+    "General Monitor Type": "일반 모니터링",
+    "Passive Monitor Type": "수동 모니터링",
+    "Specific Monitor Type": "특정 모니터링",
+    "Monitor": "모니터",
+    "Resend Notification if Down X times consecutively": "X번 중단될 경우 알림 다시 보내기",
+    "Schedule maintenance": "점검 예약하기",
+    "Affected Monitors": "영향을 받는 모니터링",
+    "Pick Affected Monitors...": "영향을 받는 모니터링 선택하기…",
+    "Start of maintenance": "점검 시작",
+    "All Status Pages": "모든 상태 페이지",
+    "Select status pages...": "상태 페이지 선택하기…",
+    "Custom": "커스텀",
+    "webhookAdditionalHeadersTitle": "추가 헤더",
+    "webhookAdditionalHeadersDesc": "웹훅과 함께 전송될 추가 헤더를 설정해요.",
+    "HTTP Headers": "HTTP 헤더",
+    "Trust Proxy": "프록시 신뢰"
+}
diff --git a/src/lang/lzh.json b/src/lang/lzh.json
new file mode 100644
index 000000000..0967ef424
--- /dev/null
+++ b/src/lang/lzh.json
@@ -0,0 +1 @@
+{}
diff --git a/src/lang/mn.json b/src/lang/mn.json
new file mode 100644
index 000000000..0967ef424
--- /dev/null
+++ b/src/lang/mn.json
@@ -0,0 +1 @@
+{}
diff --git a/src/lang/nb-NO.json b/src/lang/nb-NO.json
new file mode 100644
index 000000000..1ddc4d171
--- /dev/null
+++ b/src/lang/nb-NO.json
@@ -0,0 +1,285 @@
+{
+    "languageName": "Norsk",
+    "checkEverySecond": "Sjekk hvert {0} sekund.",
+    "retryCheckEverySecond": "Prøv igjen hvert {0} sekund.",
+    "retriesDescription": "Maksimalt antall forsøk før tjenesten er merket som nede og et varsel sendes",
+    "ignoreTLSError": "Ignorer TLS/SSL-feil for HTTPS-nettsteder",
+    "upsideDownModeDescription": "Snu statusen opp ned. Hvis tjenesten er tilgjengelig, er den NEDE.",
+    "maxRedirectDescription": "Maksimalt antall viderekoblinger å følge. Sett til 0 for å deaktivere viderekoblinger.",
+    "acceptedStatusCodesDescription": "Velg statuskoder som anses som en vellykket respons.",
+    "passwordNotMatchMsg": "Passordene stemmer ikke overens.",
+    "notificationDescription": "Varsler må tilordnes en overvåkning for å fungere.",
+    "keywordDescription": "Søk etter nøkkelord i ren HTML eller JSON. Søket skiller mellom store og små bokstaver.",
+    "pauseDashboardHome": "Pause",
+    "deleteMonitorMsg": "Er du sikker på at du vil slette denne overvåkningen?",
+    "deleteNotificationMsg": "Er du sikker på at du vil slette dette varselet for alle overvåkningene?",
+    "resolverserverDescription": "Cloudflare er standardserveren. Du kan endre DNS-serveren når som helst.",
+    "rrtypeDescription": "Velg RR-typen du vil overvåke",
+    "pauseMonitorMsg": "Er du sikker på at du vil sette på pause?",
+    "enableDefaultNotificationDescription": "For hver ny overvåkning vil denne varslingen være aktivert som standard. Du kan fortsatt deaktivere varselet separat for hver overvåkning.",
+    "clearEventsMsg": "Er du sikker på at du vil slette alle hendelser for denne overvåkningen?",
+    "clearHeartbeatsMsg": "Er du sikker på at du vil slette alle hjerteslag for denne overvåkningen?",
+    "confirmClearStatisticsMsg": "Er du sikker på at du vil slette ALL statistikk?",
+    "importHandleDescription": "Velg 'Hopp over eksisterende' hvis du vil hoppe over hver overvåkning eller varsel med samme navn. 'Overskriv' sletter alle eksisterende overvåkninger og varsler.",
+    "confirmImportMsg": "Er du sikker på at du vil importere denne sikkerhetskopien? Sørg for at du har valgt riktig importalternativ.",
+    "twoFAVerifyLabel": "Skriv inn tokenet ditt for å bekrefte at 2FA fungerer",
+    "tokenValidSettingsMsg": "Token er gyldig! Du kan nå lagre 2FA-innstillingene.",
+    "confirmEnableTwoFAMsg": "Er du sikker på at du vil aktivere 2FA?",
+    "confirmDisableTwoFAMsg": "Er du sikker på at du vil deaktivere 2FA?",
+    "Settings": "Innstillinger",
+    "Dashboard": "Dashboard",
+    "New Update": "Ny Oppdatering",
+    "Language": "Språk",
+    "Appearance": "Utseende",
+    "Theme": "Tema",
+    "General": "Generelt",
+    "Version": "Versjon",
+    "Check Update On GitHub": "Sjekk oppdatering på GitHub",
+    "List": "Liste",
+    "Add": "Legg til",
+    "Add New Monitor": "Legg til ny overvåkning",
+    "Quick Stats": "Statistikk",
+    "Up": "Oppe",
+    "Down": "Nede",
+    "Pending": "Avventer",
+    "Unknown": "Ukjent",
+    "Pause": "Pause",
+    "Name": "Navn",
+    "Status": "Status",
+    "DateTime": "Dato tid",
+    "Message": "Melding",
+    "No important events": "Ingen viktige hendelser",
+    "Resume": "Fortsett",
+    "Edit": "Rediger",
+    "Delete": "Slett",
+    "Current": "Nåværende",
+    "Uptime": "Oppetid",
+    "Cert Exp.": "Sertifikat utløper",
+    "day": "dag | dager",
+    "-day": "-dag",
+    "hour": "time",
+    "-hour": "-time",
+    "Response": "Respons",
+    "Ping": "Ping",
+    "Monitor Type": "Overvåkningstype",
+    "Keyword": "Stikkord",
+    "Friendly Name": "Vennlig navn",
+    "URL": "URL",
+    "Hostname": "Vertsnavn",
+    "Port": "Port",
+    "Heartbeat Interval": "Hjerteslagsintervall",
+    "Retries": "Forsøk",
+    "Heartbeat Retry Interval": "Hjerteslagsforsøkintervall",
+    "Advanced": "Avansert",
+    "Upside Down Mode": "Opp-ned-modus",
+    "Max. Redirects": "Maks. viderekoblinger",
+    "Accepted Status Codes": "Godkjente statuskoder",
+    "Save": "Lagre",
+    "Notifications": "Varsler",
+    "Not available, please setup.": "Ikke tilgjengelig, venligst sett opp.",
+    "Setup Notification": "Sett opp varsel",
+    "Light": "Lys",
+    "Dark": "Mørk",
+    "Auto": "Auto",
+    "Theme - Heartbeat Bar": "Theme - Heartbeat Bar",
+    "Normal": "Normal",
+    "Bottom": "Bunn",
+    "None": "Ingen",
+    "Timezone": "Tidssone",
+    "Search Engine Visibility": "Søkemotor-synlighet",
+    "Allow indexing": "Tillat indeksering",
+    "Discourage search engines from indexing site": "Fraråd søkemotorer fra å indeksere nettstedet",
+    "Change Password": "Endre passord",
+    "Current Password": "Nåværende passord",
+    "New Password": "Nytt passord",
+    "Repeat New Password": "Gjenta nytt passord",
+    "Update Password": "Oppdater passord",
+    "Disable Auth": "Deaktiver autentisering",
+    "Enable Auth": "Aktiver autentisering",
+    "disableauth.message1": "Er du sikker på at du vil <strong>deaktiver autentisering</strong>?",
+    "disableauth.message2": "Dette er for <strong>de som har tredjepartsautorisering</strong> foran Uptime Kuma, for eksempel Cloudflare Access.",
+    "Please use this option carefully!": "Vennligst vær forsiktig.",
+    "Logout": "Logg ut",
+    "Leave": "Forlat",
+    "I understand, please disable": "Jeg forstår, vennligst deaktiver",
+    "Confirm": "Bekreft",
+    "Yes": "Ja",
+    "No": "Nei",
+    "Username": "Brukernavn",
+    "Password": "Passord",
+    "Remember me": "Husk meg",
+    "Login": "Logg inn",
+    "No Monitors, please": "Ingen overvåkning, vær så snill",
+    "add one": "legg til en",
+    "Notification Type": "Meldingstype",
+    "Email": "E-post",
+    "Test": "Test",
+    "Certificate Info": "Sertifikatinformasjon",
+    "Resolver Server": "DNS-server",
+    "Resource Record Type": "DNS-posttype",
+    "Last Result": "Siste resultat",
+    "Create your admin account": "Opprett en administratorkonto",
+    "Repeat Password": "Gjenta passord",
+    "Import Backup": "Importer sikkerhetskopi",
+    "Export Backup": "Eksporter sikkerhetskopi",
+    "Export": "Eksporter",
+    "Import": "Importer",
+    "respTime": "Svartid (ms)",
+    "notAvailableShort": "N/A",
+    "Default enabled": "Standard aktivert",
+    "Apply on all existing monitors": "Anvend for alle eksisterende overvåkninger",
+    "Create": "Opprett",
+    "Clear Data": "Slett data",
+    "Events": "Hendelser",
+    "Heartbeats": "Hjerteslag",
+    "Auto Get": "Auto Hent",
+    "backupDescription": "Du kan sikkerhetskopiere alle overvåkninger og alle varsler til en JSON-fil.",
+    "backupDescription2": "PS: Historikk og hendelsesdata er ikke inkludert.",
+    "backupDescription3": "Følsomme data som varslingstokener er inkludert i eksportfilen. Vennligst oppbevar dem sikkert.",
+    "alertNoFile": "Velg en fil som skal importeres.",
+    "alertWrongFileType": "Velg en JSON-fil.",
+    "Clear all statistics": "Fjern all statistikk",
+    "Skip existing": "Hopp over eksisterende",
+    "Overwrite": "Overskriv",
+    "Options": "Alternativer",
+    "Keep both": "Behold begge",
+    "Verify Token": "Bekreft token",
+    "Setup 2FA": "Konfigurer 2FA",
+    "Enable 2FA": "Aktiver 2FA",
+    "Disable 2FA": "Deaktiver 2FA",
+    "2FA Settings": "2FA Innstillinger",
+    "Two Factor Authentication": "To-faktor autentisering",
+    "Active": "Aktiv",
+    "Inactive": "Inaktiv",
+    "Token": "Token",
+    "Show URI": "Vis URI",
+    "Tags": "Etiketter",
+    "Add New below or Select...": "Legg til nytt nedenfor eller Velg ...",
+    "Tag with this name already exist.": "Etikett med dette navnet eksisterer allerede.",
+    "Tag with this value already exist.": "Etikett med denne verdien eksisterer allerede.",
+    "color": "farge",
+    "value (optional)": "verdi (valgfritt)",
+    "Gray": "Grå",
+    "Red": "Rød",
+    "Orange": "Oransje",
+    "Green": "Grønn",
+    "Blue": "Blå",
+    "Indigo": "Indigo",
+    "Purple": "Lilla",
+    "Pink": "Rosa",
+    "Search...": "Søk...",
+    "Avg. Ping": "Gj.sn. Ping",
+    "Avg. Response": "Gj.sn. Respons",
+    "Entry Page": "Oppføringsside",
+    "statusPageNothing": "Ingenting her, vennligst legg til en gruppe eller en overvåkning.",
+    "No Services": "Ingen tjenester",
+    "All Systems Operational": "Alle systemer i drift",
+    "Partially Degraded Service": "Delvis degradert tjeneste",
+    "Degraded Service": "Degradert tjeneste",
+    "Add Group": "Legg til gruppe",
+    "Add a monitor": "Legg til en overvåkning",
+    "Edit Status Page": "Rediger statusside",
+    "Go to Dashboard": "Gå til Dashboard",
+    "Status Page": "Statusside",
+    "Status Pages": "Statusside",
+    "defaultNotificationName": "Min {notification} varsling ({number})",
+    "here": "her",
+    "Required": "Obligatorisk",
+    "telegram": "Telegram",
+    "Bot Token": "Bot Token",
+    "wayToGetTelegramToken": "Du kan få et token fra {0}.",
+    "Chat ID": "Chat ID",
+    "supportTelegramChatID": "Support Direct Chat / Group / Channel's Chat ID",
+    "wayToGetTelegramChatID": "Du kan få chat-ID-en din ved å sende en melding til boten og gå til denne nettadressen for å se chat_id:",
+    "YOUR BOT TOKEN HERE": "DITT BOT TOKEN HER",
+    "chatIDNotFound": "Chat-ID ble ikke funnet. Send en melding til denne boten først",
+    "webhook": "Webhook",
+    "Post URL": "Post URL",
+    "Content Type": "Innholdstype",
+    "webhookJsonDesc": "{0} er bra for alle moderne HTTP-servere som express.js",
+    "webhookFormDataDesc": "{multipart} er bra for PHP. JSON trenger å bli analysert med {decodeFunction}",
+    "smtp": "E-post (SMTP)",
+    "secureOptionNone": "None / STARTTLS (25, 587)",
+    "secureOptionTLS": "TLS (465)",
+    "Ignore TLS Error": "Ignorer TLS feilmelding",
+    "From Email": "Fra E-post",
+    "To Email": "Til E-post",
+    "smtpCC": "CC",
+    "smtpBCC": "BCC",
+    "discord": "Discord",
+    "Discord Webhook URL": "Discord Webhook URL",
+    "wayToGetDiscordURL": "Du kan få denne ved å gå til Serverinnstillinger -> Integrasjoner -> Opprett en Webhook",
+    "Bot Display Name": "Bot Visningsnavn",
+    "Prefix Custom Message": "Prefiks tilpasset melding",
+    "Hello @everyone is...": "Hei {'@'}everyone det er...",
+    "teams": "Microsoft Teams",
+    "Webhook URL": "Webhook URL",
+    "wayToGetTeamsURL": "Du kan lære hvordan du oppretter en webhook-URL {0}.",
+    "signal": "Signal",
+    "Number": "Nummer",
+    "Recipients": "Mottakere",
+    "needSignalAPI": "Du må ha en Signal-klient med REST API.",
+    "wayToCheckSignalURL": "Du kan sjekke denne nettadressen for å se hvordan du konfigurerer en:",
+    "signalImportant": "VIKTIG: Du kan ikke blande grupper og nummere i mottakere!",
+    "gotify": "Gotify",
+    "Application Token": "Application Token",
+    "Server URL": "Server URL",
+    "Priority": "Prioritet",
+    "slack": "Slack",
+    "Icon Emoji": "Icon Emoji",
+    "Channel Name": "Kanal navn",
+    "Uptime Kuma URL": "Uptime Kuma URL",
+    "aboutWebhooks": "Mer informasjon om webhooks på: {0}",
+    "aboutChannelName": "Skriv inn kanalnavnet på {0} Kanalnavn-feltet hvis du vil omgå webhook-kanalen. Eks: #other-channel",
+    "aboutKumaURL": "Hvis du lar Uptime Kuma URL feltet være blank, den blir som standard til Github-siden for dette prosjektet.",
+    "emojiCheatSheet": "Emoji cheat sheet: {0}",
+    "rocket.chat": "Rocket.chat",
+    "pushover": "Pushover",
+    "pushy": "Pushy",
+    "octopush": "Octopush",
+    "promosms": "PromoSMS",
+    "lunasea": "LunaSea",
+    "apprise": "Apprise (Support 50+ Notification services)",
+    "pushbullet": "Pushbullet",
+    "line": "Line Messenger",
+    "mattermost": "Mattermost",
+    "User Key": "Bruker-nøkkel",
+    "Device": "Enhet",
+    "Message Title": "Meldingstittel",
+    "Notification Sound": "Notifikasjonslyd",
+    "More info on:": "Mer info på: {0}",
+    "pushoverDesc1": "Nødsprioritet (2) har en standard 30 sekunders tidsavbrudd mellom forsøk og vil utløpe etter 1 time.",
+    "pushoverDesc2": "Hvis du vil sende varsler til forskjellige enheteter, fyll ut Enhet-feltet.",
+    "SMS Type": "SMS Type",
+    "octopushTypePremium": "Premium (Raskt - anbefalt for varsling)",
+    "octopushTypeLowCost": "Lav kostnad (Sakte, noen ganger blokkert av leverandør)",
+    "Check octopush prices": "Sjekk octopush priser {0}.",
+    "octopushPhoneNumber": "Telefonnummer (intl format, eg : +4791234567) ",
+    "octopushSMSSender": "SMS Avsendernavn : 3-11 alphanumeriske tegn og mellomrom (a-zA-Z0-9)",
+    "LunaSea Device ID": "LunaSea Enhet ID",
+    "Apprise URL": "Apprise URL",
+    "Example:": "Eksempel: {0}",
+    "Read more:": "Les mer: {0}",
+    "Status:": "Status: {0}",
+    "Read more": "Les mer",
+    "appriseInstalled": "Apprise er installert.",
+    "appriseNotInstalled": "Apprise ikke installert. {0}",
+    "Access Token": "Tilgangs-Token",
+    "Channel access token": "Kanal tilgangs-token",
+    "Line Developers Console": "Line Utviklserskonsoll",
+    "lineDevConsoleTo": "Line Utviklserskonsoll - {0}",
+    "Basic Settings": "Grunnleggende instillinger",
+    "User ID": "Bruker-ID",
+    "Messaging API": "Meldings-API",
+    "wayToGetLineChannelToken": "Først, få tilgang til {0}, lag en leverandør og kanal (Meldings-API), deretter kan du hente kanaltilgangs-token og bruker id fra menu-valgene nevnt over.",
+    "Icon URL": "Ikon URL",
+    "aboutIconURL": "Du kan gi en link til et bilde i \"Ikon URL\" for å overskrive det standard profilbildet. Vil ikke bli brukt hvis Ikon Emoji ikke er satt.",
+    "aboutMattermostChannelName": "Du kan overskrive standardkanalen som webhook-en poster i ved å skrive enn kanalnavnet i \"Kanalnavn\" feltet. Dette må være skrudd på i Mattermost webhook-instillingene. Eks: #other-channel",
+    "matrix": "Matrix",
+    "promosmsTypeEco": "SMS ECO - billig, men treg og ofte overbelastet. Begrenset til bare polske mottakere.",
+    "promosmsTypeFlash": "SMS FLASH - Melding vil automatisk vises på mottakker-enhet. Begrenset til bare polske mottakere.",
+    "promosmsTypeFull": "SMS FULL - Premuimnivå SMS. Du kan bruke dit avsendernavn (Du må registerere et navn først). Pålitelig for alle varslinger.",
+    "promosmsTypeSpeed": "SMS SPEED - Høyest prioritet i systemet.Veldig rask på pålitelig, men dyrt (omtrent det dobbeltet av SMS FULL pris).",
+    "promosmsPhoneNumber": "Telefonnummber (for polske mottakere. Du trenger ikke områdekode.)",
+    "promosmsSMSSender": "SMS Avsendernavn : Forhåndsregistert navn eller en av standardnavnene: InfoSMS, SMS Info, MaxSMS, INFO, SMS"
+}
diff --git a/src/lang/nl-NL.json b/src/lang/nl-NL.json
new file mode 100644
index 000000000..32c795456
--- /dev/null
+++ b/src/lang/nl-NL.json
@@ -0,0 +1,531 @@
+{
+    "languageName": "Nederlands",
+    "checkEverySecond": "Controleer elke {0} seconden.",
+    "retriesDescription": "Maximum aantal nieuwe pogingen voordat de service wordt gemarkeerd als niet beschikbaar en er een melding wordt verzonden",
+    "ignoreTLSError": "Negeer TLS/SSL-fout voor HTTPS-websites",
+    "upsideDownModeDescription": "Draai de status om. Als de service bereikbaar is, is deze OFFLINE.",
+    "maxRedirectDescription": "Maximaal aantal te volgen omleidingen. Stel in op 0 om omleidingen uit te schakelen.",
+    "acceptedStatusCodesDescription": "Selecteer statuscodes die als een succesvol antwoord worden beschouwd.",
+    "passwordNotMatchMsg": "Het herhaalwachtwoord komt niet overeen.",
+    "notificationDescription": "Wijs a.u.b. een melding toe aan de monitor(s) om het te laten werken.",
+    "keywordDescription": "Zoek trefwoord in gewone html of JSON-response en het is hoofdlettergevoelig",
+    "pauseDashboardHome": "Gepauzeerd",
+    "deleteMonitorMsg": "Weet u zeker dat u deze monitor wilt verwijderen?",
+    "deleteNotificationMsg": "Weet u zeker dat u deze melding voor alle monitoren wilt verwijderen?",
+    "resolverserverDescription": "Cloudflare is de standaardserver, u kunt de resolver server op elk moment wijzigen.",
+    "rrtypeDescription": "Selecteer het RR-type dat u wilt monitoren",
+    "pauseMonitorMsg": "Weet je zeker dat je wilt pauzeren?",
+    "enableDefaultNotificationDescription": "Voor elke nieuwe monitor wordt deze melding standaard ingeschakeld. U kunt de melding nog steeds afzonderlijk uitschakelen voor elke monitor.",
+    "clearEventsMsg": "Weet je zeker dat je alle evenementen voor deze monitor wilt verwijderen?",
+    "clearHeartbeatsMsg": "Weet je zeker dat je alle heartbeats voor deze monitor wilt verwijderen?",
+    "confirmClearStatisticsMsg": "Weet u zeker dat u alle statistieken wilt verwijderen?",
+    "twoFAVerifyLabel": "Voer uw 2FA controle token in voor verificatie",
+    "tokenValidSettingsMsg": "Token is geldig! U kunt nu de 2FA-instellingen opslaan.",
+    "confirmEnableTwoFAMsg": "Weet je zeker dat je 2FA wilt inschakelen?",
+    "confirmDisableTwoFAMsg": "Weet je zeker dat je 2FA wilt uitschakelen?",
+    "Settings": "Instellingen",
+    "Dashboard": "Dashboard",
+    "New Update": "Nieuwe update",
+    "Language": "Taal",
+    "Appearance": "Weergave",
+    "Theme": "Thema",
+    "General": "Algemeen",
+    "Version": "Versie",
+    "Check Update On GitHub": "Controleer voor updates op GitHub",
+    "List": "Lijst",
+    "Add": "Toevoegen",
+    "Add New Monitor": "Nieuwe monitor toevoegen",
+    "Quick Stats": "Snelle statistieken",
+    "Up": "Online",
+    "Down": "Offline",
+    "Pending": "In afwachting",
+    "Unknown": "Onbekend",
+    "Pause": "Pauze",
+    "Name": "Naam",
+    "Status": "Status",
+    "DateTime": "Datum Tijd",
+    "Message": "Bericht",
+    "No important events": "Geen belangrijke gebeurtenissen",
+    "Resume": "Hervat",
+    "Edit": "Wijzigen",
+    "Delete": "Verwijderen",
+    "Current": "Huidig",
+    "Uptime": "Uptime",
+    "Cert Exp.": "Cert. verl.",
+    "day": "dag | dagen",
+    "-day": "-dag",
+    "hour": "uur",
+    "-hour": "-uur",
+    "Response": "Antwoord",
+    "Ping": "Ping",
+    "Monitor Type": "Monitortype:",
+    "Keyword": "Trefwoord",
+    "Friendly Name": "Vriendelijke naam",
+    "URL": "URL",
+    "Hostname": "Hostnaam",
+    "Port": "Poort",
+    "Heartbeat Interval": "Hartslaginterval",
+    "Retries": "Pogingen",
+    "Advanced": "Geavanceerd",
+    "Upside Down Mode": "Ondersteboven modus",
+    "Max. Redirects": "Max. Omleidingen",
+    "Accepted Status Codes": "Geaccepteerde statuscodes",
+    "Save": "Opslaan",
+    "Notifications": "Meldingen",
+    "Not available, please setup.": "Niet beschikbaar, stel a.u.b. in.",
+    "Setup Notification": "Melding instellen",
+    "Light": "Licht",
+    "Dark": "Donker",
+    "Auto": "Auto",
+    "Theme - Heartbeat Bar": "Thema - Hartslagbalk",
+    "Normal": "Normaal",
+    "Bottom": "Onderkant",
+    "None": "Geen",
+    "Timezone": "Tijdzone",
+    "Search Engine Visibility": "Zichtbaarheid voor zoekmachines",
+    "Allow indexing": "Indexering toestaan",
+    "Discourage search engines from indexing site": "Ontmoedig zoekmachines om de site te indexeren",
+    "Change Password": "Verander wachtwoord",
+    "Current Password": "Huidig wachtwoord",
+    "New Password": "Nieuw wachtwoord",
+    "Repeat New Password": "Herhaal nieuw wachtwoord",
+    "Update Password": "Vernieuw wachtwoord",
+    "Disable Auth": "Authenticatie uitschakelen",
+    "Enable Auth": "Authenticatie inschakelen",
+    "disableauth.message1": "Weet je zeker dat je <strong>authenticatie wilt uitschakelen</strong>?",
+    "disableauth.message2": "Er zijn omstandigheden waarbij je <strong>authenticatie door derden wilt implementeren</strong> voor Uptime Kuma, zoals Cloudflare Access, Authelia of andere authenticatiemechanismen.",
+    "Please use this option carefully!": "Gebruik deze optie zorgvuldig!",
+    "Logout": "Uitloggen",
+    "Leave": "Vertrekken",
+    "I understand, please disable": "Ik begrijp het, schakel a.u.b. uit",
+    "Confirm": "Bevestigen",
+    "Yes": "Ja",
+    "No": "Nee",
+    "Username": "Gebruikersnaam",
+    "Password": "Wachtwoord",
+    "Remember me": "Wachtwoord onthouden",
+    "Login": "Inloggen",
+    "No Monitors, please": "Geen monitoren, ",
+    "add one": "voeg een toe",
+    "Notification Type": "Melding type",
+    "Email": "E-mail",
+    "Test": "Testen",
+    "Certificate Info": "Certificaat informatie",
+    "Resolver Server": "Resolver Server",
+    "Resource Record Type": "Type bronrecord",
+    "Last Result": "Laatste resultaat",
+    "Create your admin account": "Maak uw beheerdersaccount aan",
+    "Repeat Password": "Herhaal wachtwoord",
+    "Export": "Exporteren",
+    "Import": "Importeren",
+    "respTime": "reactietijd (ms)",
+    "notAvailableShort": "N.v.t.",
+    "Default enabled": "Default enabled",
+    "Apply on all existing monitors": "Pas toe op alle bestaande monitors",
+    "Create": "Aanmaken",
+    "Clear Data": "Data wissen",
+    "Events": "Gebeurtenissen",
+    "Heartbeats": "Heartbeats",
+    "Auto Get": "Auto Get",
+    "backupDescription": "U kunt een back-up maken van alle monitoren en alle meldingen in een JSON-bestand.",
+    "backupDescription2": "PS: Geschiedenis- en gebeurtenisgegevens zijn niet inbegrepen.",
+    "backupDescription3": "Gevoelige gegevens zoals melding tokens zijn opgenomen in het exportbestand, houd het veilig opgeslagen.",
+    "alertNoFile": "Selecteer een bestand om te importeren.",
+    "alertWrongFileType": "Selecteer een JSON-bestand.",
+    "Verify Token": "Controleer token",
+    "Setup 2FA": "2FA instellingen",
+    "Enable 2FA": "Schakel 2FA in",
+    "Disable 2FA": "Schakel 2FA uit",
+    "2FA Settings": "2FA-instellingen",
+    "Two Factor Authentication": "Two Factor Authenticatie",
+    "Active": "Actief",
+    "Inactive": "Inactief",
+    "Also apply to existing monitors": "Voeg ook toe aan bestaande monitors",
+    "Token": "Token",
+    "Show URI": "Toon URI",
+    "Clear all statistics": "Wis alle statistieken",
+    "retryCheckEverySecond": "Probeer elke {0} seconden.",
+    "importHandleDescription": "Kies 'Sla bestaande over' als je elke monitor of melding met dezelfde naam wilt overslaan. Kies 'Overschrijf' als je elke monitor of notificatie wilt verwijderen.",
+    "confirmImportMsg": "Weet je zeker dat je dit bestand wilt importeren?",
+    "Heartbeat Retry Interval": "Heartbeat Retry Interval",
+    "Import Backup": "Importeer Backup",
+    "Export Backup": "Exporteer Backup",
+    "Skip existing": "Sla bestaande over",
+    "Overwrite": "Overschrijf",
+    "Options": "Opties",
+    "Keep both": "Bewaar beide",
+    "Tags": "Labels",
+    "Add New below or Select...": "Voeg nieuwe toe of selecteer...",
+    "Tag with this name already exist.": "Label met deze naam bestaat al",
+    "Tag with this value already exist.": "Label met deze waarde bestaat al",
+    "color": "Kleur",
+    "value (optional)": "waarde (optioneel)",
+    "Gray": "Grijs",
+    "Red": "Rood",
+    "Orange": "Oranje",
+    "Green": "Groen",
+    "Blue": "Blauw",
+    "Indigo": "Indigo",
+    "Purple": "Paars",
+    "Pink": "Roze",
+    "Search...": "Zoeken...",
+    "Avg. Ping": "Gemiddelde Ping",
+    "Avg. Response": "Gemiddelde Response",
+    "Entry Page": "Entry Page",
+    "statusPageNothing": "Niets hier, voeg een groep of monitor toe.",
+    "No Services": "Geen diensten",
+    "All Systems Operational": "Alle systemen operationeel",
+    "Partially Degraded Service": "Gedeeltelijk verminderde prestaties",
+    "Degraded Service": "Verminderde prestaties",
+    "Add Group": "Voeg groep toe",
+    "Add a monitor": "Voeg monitor toe",
+    "Edit Status Page": "Wijzig status pagina",
+    "Go to Dashboard": "Ga naar Dashboard",
+    "Status Page": "Status Pagina",
+    "Status Pages": "Status Pagina",
+    "telegram": "Telegram",
+    "webhook": "Webhook",
+    "smtp": "Email (SMTP)",
+    "discord": "Discord",
+    "teams": "Microsoft Teams",
+    "signal": "Signal",
+    "gotify": "Gotify",
+    "slack": "Slack",
+    "rocket.chat": "Rocket.chat",
+    "pushover": "Pushover",
+    "pushy": "Pushy",
+    "octopush": "Octopush",
+    "promosms": "PromoSMS",
+    "lunasea": "LunaSea",
+    "apprise": "Apprise (Support 50+ Notification services)",
+    "pushbullet": "Pushbullet",
+    "line": "Line Messenger",
+    "mattermost": "Mattermost",
+    "Method": "Methode",
+    "Body": "Body",
+    "Headers": "Headers",
+    "PushUrl": "Push URL",
+    "HeadersInvalidFormat": "The request headers is geen geldige JSON: ",
+    "BodyInvalidFormat": "De request body is geen geldige JSON: ",
+    "Primary Base URL": "Hoofd Basis URL",
+    "Push URL": "Push URL",
+    "needPushEvery": "Je moet deze URL elke {0} seconden aanroepen.",
+    "pushOptionalParams": "Optionele parameters: {0}",
+    "defaultNotificationName": "Mijn {notification} Alert ({number})",
+    "here": "hier",
+    "Required": "Verplicht",
+    "Bot Token": "Bot Token",
+    "wayToGetTelegramToken": "Je kunt een token krijgen van {0}.",
+    "Chat ID": "Chat ID",
+    "supportTelegramChatID": "Ondersteuning Directe Chat / Groep / Kanaal Chat ID",
+    "wayToGetTelegramChatID": "Je kunt je CHAT ID krijgen door een bericht te sturen naar de bot en naar deze URL te gaan om het chat_id te bekijken:",
+    "YOUR BOT TOKEN HERE": "DE BOT TOKEN HIER",
+    "chatIDNotFound": "Chat ID is niet gevonden; stuur eerst een bericht naar de bot",
+    "Post URL": "Post URL",
+    "Content Type": "Content Type",
+    "webhookJsonDesc": "{0} is goed voor een moderne HTTP server zoals Express.js",
+    "webhookFormDataDesc": "{multipart} is goed voor PHP. De JSON moet worden ontleed met {decodeFunction}",
+    "secureOptionNone": "Geen / STARTTLS (25, 587)",
+    "secureOptionTLS": "TLS (465)",
+    "Ignore TLS Error": "Negeer TLS Error",
+    "From Email": "Van Email",
+    "emailCustomSubject": "Aangepast Onderwerp",
+    "To Email": "Naar Email",
+    "smtpCC": "CC",
+    "smtpBCC": "BCC",
+    "Discord Webhook URL": "Discord Webhook URL",
+    "wayToGetDiscordURL": "Je kunt dit krijgen door te gaan naar Server Instellingen -> Integraties -> Creëer Webhook",
+    "Bot Display Name": "Bot Weergave Naam",
+    "Prefix Custom Message": "Prefix Aangepast Bericht",
+    "Hello @everyone is...": "Hallo {'@'}iedereen is...",
+    "Webhook URL": "Webhook URL",
+    "wayToGetTeamsURL": "Je kunt hier leren hoe je een webhook URL kunt maken {0}.",
+    "Number": "Nummer",
+    "Recipients": "Ontvangers",
+    "needSignalAPI": "Je moet een signal client met REST API hebben.",
+    "wayToCheckSignalURL": "Je kunt op deze URL zien hoe je een kunt instellen:",
+    "signalImportant": "BELANGRIJK: Je kunt groepen en nummers niet mengen in ontvangers!",
+    "Application Token": "Applicatie Token",
+    "Server URL": "Server URL",
+    "Priority": "Prioriteit",
+    "Icon Emoji": "Icoon Emoji",
+    "Channel Name": "Kanaal Naam",
+    "Uptime Kuma URL": "Uptime Kuma URL",
+    "aboutWebhooks": "Meer info over Webhooks op: {0}",
+    "aboutChannelName": "Voer de kanaal naam in op {0} Kannaal Naam veld als je het Webhook kanaal wilt omzeilen. Bv: #other-channel",
+    "aboutKumaURL": "Als je de Uptime Kuma URL veld leeg laat, wordt standaard het GitHub project pagina weergegeven.",
+    "emojiCheatSheet": "Emoji cheat sheet: {0}",
+    "PushByTechulus": "Push door Techulus",
+    "clicksendsms": "ClickSend SMS",
+    "GoogleChat": "Google Chat (Google Workspace alleen)",
+    "User Key": "Gebruikers sleutel",
+    "Device": "Apparaat",
+    "Message Title": "Bericht Titel",
+    "Notification Sound": "Notificatie Geluid",
+    "More info on:": "Meer info op: {0}",
+    "pushoverDesc1": "Nood prioriteit (2) heeft standaard een 30 seconden timeout tussen pogingen en verloopt na 1 uur.",
+    "pushoverDesc2": "Vul het appraat veld in als je notificaties naar andere apparaten wilt versturen.",
+    "SMS Type": "SMS Type",
+    "octopushTypePremium": "Premium (Snel - aangeraden voor te alarmeren)",
+    "octopushTypeLowCost": "Low Cost (Langzaam - wordt soms geblokkeerd door operator)",
+    "checkPrice": "Controleer {0} prijzen:",
+    "apiCredentials": "API referenties",
+    "octopushLegacyHint": "Wil je de legacy versie van Octopush (2011-2020) gebruiken of de nieuwe versie?",
+    "Check octopush prices": "Controleer Octopush prijzen {0}.",
+    "octopushPhoneNumber": "Telefoon nummer (Int. formaat, eg : +33612345678) ",
+    "octopushSMSSender": "SMS zender naam : 3-11 alfanumerieke karakters en spatie (a-zA-Z0-9)",
+    "LunaSea Device ID": "LunaSea Apparaat ID",
+    "Apprise URL": "Apprise URL",
+    "Example:": "Voorbeeld: {0}",
+    "Read more:": "Lees meer: {0}",
+    "Status:": "Status: {0}",
+    "Read more": "Lees meer",
+    "appriseInstalled": "Apprise is geïnstalleerd.",
+    "appriseNotInstalled": "Apprise is niet geïnstalleerd. {0}",
+    "Access Token": "Access Token",
+    "Channel access token": "Kanaal access token",
+    "Line Developers Console": "Line Developers Console",
+    "lineDevConsoleTo": "Line Developers Console - {0}",
+    "Basic Settings": "Basis Instellingen",
+    "User ID": "Gebruiker ID",
+    "Messaging API": "Berichten API",
+    "wayToGetLineChannelToken": "Begin met {0} te openen, creëer een provider en kanaal (Messaging API), dan kun je de kanaal access token en gebruikers ID van de hierboven genoemde menu items krijgen.",
+    "Icon URL": "Icoon URL",
+    "aboutIconURL": "Je kunt een link om de standaard profiel afbeelding te overschrijving in \"Icoon URL\" meegeven. Dit wordt niet gebruikt als Icon Emoji is ingesteld.",
+    "aboutMattermostChannelName": "Je kunt het standaard kanaal dat de Webhook plaatst overschijven door de kanaal naam in te vullen in het \"Channel Name\" veld. Dit moet worden ingeschakeld in de Mattermost Webhook instellingen. Bv. #ander-kanaal",
+    "matrix": "Matrix",
+    "promosmsTypeEco": "SMS ECO - Goedkoop maar langzaam en vaak overbelast. Gelimiteerd tot Poolse ontvangers.",
+    "promosmsTypeFlash": "SMS FLASH - Berichten worden automatisch weergegeven op het apparaat van de ontvanger. Gelimiteerd tot Poolse ontvangers.",
+    "promosmsTypeFull": "SMS FULL - Premium tier van SMS, je kunt de ontvanger naam gebruiken (Je moet eerst de naam registreren). Betrouwbaar voor alarmeringen.",
+    "promosmsTypeSpeed": "SMS SPEED - Hoogste prioriteit in systeem. Is veel sneller en betrouwbaarder maar kost meer (ongeveer twee keer zoveel als volle SMS prijs).",
+    "promosmsPhoneNumber": "Telefoon nummer (voor Poolse ontvangers. Je kunt gebieds codes overslaan)",
+    "promosmsSMSSender": "SMS Ontvanger naam : Voor geregistreerde naam of een van de standaarden: InfoSMS, SMS Info, MaxSMS, INFO, SMS",
+    "Feishu WebHookUrl": "Feishu WebHookURL",
+    "matrixHomeserverURL": "Homeserver URL (met http(s):// en optioneel poort)",
+    "Internal Room Id": "Interne Room ID",
+    "matrixDesc1": "Je kunt de interne room ID vinden door in de geavanceerde sectie van de room instellingen in je Matrix client te kijken. Het zou moeten uitzien als !QMdRCpUIfLwsfjxye6:home.server.",
+    "matrixDesc2": "Het wordt ten zeerste aanbevolen om een nieuwe gebruiker aan te maken en niet de access token van je account te gebruiken, aangezien dit volledige toegang geeft tot je account en alle kamers waar je lid van bent. Maak in plaats daarvan een nieuwe gebruiker aan en nodig deze alleen uit voor de ruimte waarin je de melding wilt ontvangen. Je kunt de access token krijgen door het volgende uit te voeren {0}",
+    "Monitor History": "Monitor Geschiedenis",
+    "clearDataOlderThan": "Bewaar monitor geschiedenis voor {0} dagen.",
+    "PasswordsDoNotMatch": "Wachtwoorden komen niet overeen",
+    "records": "records",
+    "One record": "Een record",
+    "steamApiKeyDescription": "Om een Steam Game Server te monitoren heb je een Steam Web-API key nodig. Je kunt hier je API key registreren: ",
+    "Current User": "Huidge Gebruiker",
+    "topic": "Onderwerp",
+    "topicExplanation": "MQTT onderwerp om te monitoren",
+    "successMessage": "Succesbericht",
+    "successMessageExplanation": "MQTT bericht dat als succes wordt beschouwd.",
+    "recent": "Recent",
+    "Done": "Klaar",
+    "Info": "Info",
+    "Security": "Beveiliging",
+    "Steam API Key": "Steam API Sleutel",
+    "Shrink Database": "Verklein Database",
+    "Pick a RR-Type...": "Kies een RR-Type...",
+    "Pick Accepted Status Codes...": "Kies geaccepteerde Status Codes...",
+    "Default": "Standaard",
+    "HTTP Options": "HTTP Opties",
+    "Create Incident": "Creëer Incident",
+    "Title": "Titel",
+    "Content": "Content",
+    "Style": "Stijl",
+    "info": "info",
+    "warning": "waarschuwing",
+    "danger": "gevaar",
+    "primary": "primair",
+    "light": "licht",
+    "dark": "donker",
+    "Post": "Post",
+    "Please input title and content": "Voer alstublieft titel en content in",
+    "Created": "Gemaakt",
+    "Last Updated": "Laatst Bijgewerkt",
+    "Unpin": "Losmaken",
+    "Switch to Light Theme": "Wissel naar Licht Thema",
+    "Switch to Dark Theme": "Wissel naar Donker Thema",
+    "Show Tags": "Toon Labels",
+    "Hide Tags": "Verberg Labels",
+    "Description": "Beschrijving",
+    "No monitors available.": "Geen monitors beschikbaar.",
+    "Add one": "Voeg een toe",
+    "No Monitors": "Geen Monitors",
+    "Untitled Group": "Naamloze Groep",
+    "Services": "Diensten",
+    "Discard": "Weggooien",
+    "Cancel": "Annuleren",
+    "Powered by": "Mogelijk gemaakt door",
+    "shrinkDatabaseDescription": "Activeer database VACUUM voor SQLite. Als de database na 1.10.0 aangemaakt is, dan staat AUTO_VACUUM al aan en is deze actie niet nodig.",
+    "serwersms": "SerwerSMS.pl",
+    "serwersmsAPIUser": "API Gebruikersnaam (incl. webapi_ prefix)",
+    "serwersmsAPIPassword": "API Wachtwoord",
+    "serwersmsPhoneNumber": "Telefoon nummer",
+    "serwersmsSenderName": "SMS Zender Naam (geregistreerd via klant portaal)",
+    "stackfield": "Stackfield",
+    "Customize": "Aanpassen",
+    "Custom Footer": "Aangepaste Footer",
+    "Custom CSS": "Aangepaste CSS",
+    "smtpDkimSettings": "DKIM Instellingen",
+    "smtpDkimDesc": "Refereer alsjeblieft naar Nodemailer DKIM {0} voor gebruik.",
+    "documentation": "documentatie",
+    "smtpDkimDomain": "Domein Naam",
+    "smtpDkimKeySelector": "Sleutel Kiezer",
+    "smtpDkimPrivateKey": "Prive Sleutel",
+    "smtpDkimHashAlgo": "Hash Algoritme (Optioneel)",
+    "smtpDkimheaderFieldNames": "Header sleutels om te ondertekenen (Optioneel)",
+    "smtpDkimskipFields": "Header sleutels niet om te ondertekenen (Optioneel)",
+    "gorush": "Gorush",
+    "alerta": "Alerta",
+    "alertaApiEndpoint": "API Eindpunt",
+    "alertaEnvironment": "Omgeving",
+    "alertaApiKey": "API Sleutel",
+    "alertaAlertState": "Alert Staat",
+    "alertaRecoverState": "Herstel Staat",
+    "deleteStatusPageMsg": "Weet je zeker je deze status pagina wilt verwijderen?",
+    "Proxies": "Proxies",
+    "default": "Standaard",
+    "enabled": "Ingeschakeld",
+    "setAsDefault": "Stel in als standaard",
+    "deleteProxyMsg": "Weet je zeker dat je deze proxy wilt verwijderen voor alle monitors?",
+    "proxyDescription": "Proxies moeten worden toegewezen aan een monitor om te functioneren.",
+    "enableProxyDescription": "Deze proxy heeft geen effect op monitor verzoeken totdat het is geactiveerd. Je kunt tijdelijk de proxy uitschakelen voor alle monitors voor activatie status.",
+    "setAsDefaultProxyDescription": "Deze proxy wordt standaard aangezet voor alle nieuwe monitors. Je kunt nog steeds de proxy apart uitschakelen voor elke monitor.",
+    "Certificate Chain": "Certificaatketen",
+    "Valid": "Geldig",
+    "Invalid": "Ongeldig",
+    "AccessKeyId": "AccessKey ID",
+    "SecretAccessKey": "AccessKey Secret",
+    "PhoneNumbers": "TelefoonNummers",
+    "TemplateCode": "TemplateCode",
+    "SignName": "SignName",
+    "Sms template must contain parameters: ": "Sms sjabloon moet de volgende parameters bevatten: ",
+    "Bark Endpoint": "Bark Endpoint",
+    "WebHookUrl": "WebHookUrl",
+    "SecretKey": "SecretKey",
+    "For safety, must use secret key": "Voor de veiligheid moet je de secret key gebruiken",
+    "Device Token": "Apparaat Token",
+    "Platform": "Platform",
+    "iOS": "iOS",
+    "Android": "Android",
+    "Huawei": "Huawei",
+    "High": "Hoog",
+    "Retry": "Opnieuw",
+    "Topic": "Onderwerp",
+    "WeCom Bot Key": "WeCom Bot Key",
+    "Setup Proxy": "Proxy instellen",
+    "Proxy Protocol": "Proxy Protocol",
+    "Proxy Server": "Proxy Server",
+    "Proxy server has authentication": "Proxy server heeft authenticatie",
+    "User": "Gebruiker",
+    "Installed": "Geïnstalleerd",
+    "Not installed": "Niet geïnstalleerd",
+    "Running": "Actief",
+    "Not running": "Niet actief",
+    "Remove Token": "Verwijder Token",
+    "Start": "Start",
+    "Stop": "Stop",
+    "Uptime Kuma": "Uptime Kuma",
+    "Add New Status Page": "Voeg nieuwe status pagina toe",
+    "Slug": "Slug",
+    "Accept characters:": "Geaccepteerde tekens:",
+    "startOrEndWithOnly": "Start of eindig alleen met {0}",
+    "No consecutive dashes": "Geen opeenvolgende streepjes",
+    "Next": "Volgende",
+    "The slug is already taken. Please choose another slug.": "De slug is al in gebruik. Kies een andere slug.",
+    "No Proxy": "Geen Proxy",
+    "HTTP Basic Auth": "HTTP Basic Auth",
+    "New Status Page": "Nieuwe Status Pagina",
+    "Page Not Found": "Pagina Niet gevonden",
+    "Reverse Proxy": "Reverse Proxy",
+    "Backup": "Backup",
+    "About": "Over",
+    "wayToGetCloudflaredURL": "(Download cloudflared van {0})",
+    "cloudflareWebsite": "Cloudflare Website",
+    "Message:": "Bericht:",
+    "Don't know how to get the token? Please read the guide:": "Lees de uitleg als je niet weet hoe je een token krijgt:",
+    "The current connection may be lost if you are currently connecting via Cloudflare Tunnel. Are you sure want to stop it? Type your current password to confirm it.": "De huidge verbinding kan worden verbroken als je momenteel bent verbonden met Cloudflare Tunnel. Weet je zeker dat je het wilt stoppen? Typ je huidige wachtwoord om het te bevestigen.",
+    "Other Software": "Andere Software",
+    "For example: nginx, Apache and Traefik.": "Bijvoorbeeld: nginx, Apache and Traefik.",
+    "Please read": "Lees alstublieft",
+    "Subject:": "Onderwerp:",
+    "Valid To:": "Geldig Tot:",
+    "Days Remaining:": "Dagen Resterend:",
+    "Issuer:": "Uitgever:",
+    "Fingerprint:": "Vingerafruk:",
+    "No status pages": "Geen status pagina's",
+    "Proxy": "Proxy",
+    "Date Created": "Datum Aangemaakt",
+    "onebotHttpAddress": "OneBot HTTP Adres",
+    "onebotMessageType": "OneBot Bericht Type",
+    "onebotGroupMessage": "Groep",
+    "onebotPrivateMessage": "Privé",
+    "onebotUserOrGroupId": "Groep/Gebruiker ID",
+    "onebotSafetyTips": "Voor de veiligheid moet een toegangssleutel worden ingesteld",
+    "PushDeer Key": "PushDeer Key",
+    "Footer Text": "Footer Tekst",
+    "Show Powered By": "Laat \"Mogeljik gemaakt door\" zien",
+    "Domain Names": "Domein Namen",
+    "pushoversounds pushover": "Pushover (default)",
+    "pushoversounds bike": "Bike",
+    "pushoversounds bugle": "Bugle",
+    "pushoversounds cashregister": "Cash Register",
+    "pushoversounds classical": "Classical",
+    "pushoversounds cosmic": "Cosmic",
+    "pushoversounds falling": "Falling",
+    "pushoversounds gamelan": "Gamelan",
+    "pushoversounds incoming": "Incoming",
+    "pushoversounds intermission": "Intermission",
+    "pushoversounds magic": "Magic",
+    "pushoversounds mechanical": "Mechanical",
+    "pushoversounds pianobar": "Piano Bar",
+    "pushoversounds siren": "Siren",
+    "pushoversounds spacealarm": "Space Alarm",
+    "pushoversounds tugboat": "Tug Boat",
+    "pushoversounds alien": "Alien Alarm (long)",
+    "pushoversounds climb": "Climb (long)",
+    "pushoversounds persistent": "Persistent (long)",
+    "pushoversounds echo": "Pushover Echo (long)",
+    "pushoversounds updown": "Up Down (long)",
+    "pushoversounds vibrate": "Vibrate Only",
+    "pushoversounds none": "None (silent)",
+    "dnsPortDescription": "DNS-serverpoort. Standaard ingesteld op 53. Je kunt de poort op elk moment wijzigen.",
+    "error": "fout",
+    "critical": "kritisch",
+    "wayToGetPagerDutyKey": "Je kunt dit krijgen door naar Service -> Service Directory -> (Selecteer een service) -> Integraties -> Integratie toevoegen te gaan. Hier kunt u zoeken naar \"Events API V2\". Meer informatie {0}",
+    "Integration Key": "Integration Key",
+    "Integration URL": "Integration URL",
+    "Auto resolve or acknowledged": "Automatisch oplossen of bevestigen",
+    "do nothing": "niets doen",
+    "auto acknowledged": "automatisch bevestigen",
+    "auto resolve": "automatisch oplossen",
+    "Authentication": "authenticatie",
+    "signedInDisp": "Aangemeld als {0}",
+    "signedInDispDisabled": "Authenticatie uitgeschakeld.",
+    "Certificate Expiry Notification": "Melding over verlopen certificaat",
+    "Recipient Number": "Nummer ontvanger",
+    "From Name/Number": "Van naam/nummer",
+    "Leave blank to use a shared sender number.": "Laat leeg om een gedeeld afzendernummer te gebruiken.",
+    "endpoint": "endpoint",
+    "pushyAPIKey": "Secret API Key",
+    "pushyToken": "Device token",
+    "Show update if available": "Update weergeven indien beschikbaar",
+    "Also check beta release": "Controleer ook de bètaversies",
+    "Using a Reverse Proxy?": "Een reverse proxy gebruiken?",
+    "Check how to config it for WebSocket": "Controleer hoe je het configureert voor een WebSocket",
+    "Steam Game Server": "Steam gameserver",
+    "Most likely causes:": "Meest waarschijnlijke oorzaken:",
+    "The resource is no longer available.": "De paginabron is niet langer beschikbaar.",
+    "There might be a typing error in the address.": "Er zit een typefout in het de URL.",
+    "What you can try:": "Wat je kan proberen:",
+    "Retype the address.": "De URL controleren en/of opnnieuw typen.",
+    "Go back to the previous page.": "Terug naar de vorige pagina.",
+    "Coming Soon": "Binnenkort beschikbaar",
+    "wayToGetClickSendSMSToken": "Je kan een API Username en API Key krijgen vanuit {0} .",
+    "Connection String": "Connection String",
+    "Query": "Query",
+    "settingsCertificateExpiry": "TLS Certificate Expiry",
+    "certificationExpiryDescription": "HTTPS Monitors trigger notification when TLS certificate expires in:",
+    "ntfy Topic": "ntfy Topic",
+    "Domain": "Domein",
+    "Workstation": "Werkstation",
+    "disableCloudflaredNoAuthMsg": "De \"Geen authenticatie\" modus staat aan, wachtwoord is niet vereist."
+}
diff --git a/src/lang/pl.json b/src/lang/pl.json
new file mode 100644
index 000000000..472b595c7
--- /dev/null
+++ b/src/lang/pl.json
@@ -0,0 +1,700 @@
+{
+    "languageName": "Polski",
+    "checkEverySecond": "Sprawdzaj co {0} sekund",
+    "retryCheckEverySecond": "Ponawiaj co {0} sekund",
+    "retriesDescription": "Maksymalna liczba powtórzeń, zanim usługa zostanie oznaczona jako niedostępna i zostanie wysłane powiadomienie",
+    "ignoreTLSError": "Ignoruj błąd TLS/SSL dla stron HTTPS",
+    "upsideDownModeDescription": "Odwróć status do góry nogami. Jeśli usługa jest osiągalna, to jest oznaczona jako niedostępna.",
+    "maxRedirectDescription": "Maksymalna liczba przekierowań do wykonania. Ustaw na 0, aby wyłączyć przekierowania.",
+    "acceptedStatusCodesDescription": "Wybierz kody stanu, które są uważane za prawidłową odpowiedź.",
+    "passwordNotMatchMsg": "Powtórzone hasło nie pasuje.",
+    "notificationDescription": "Proszę przypisać powiadomienie do monitora(ów), aby działało.",
+    "keywordDescription": "Wyszukiwanie słów kluczowych w zwykłym html lub odpowiedzi JSON. Wielkość liter ma znaczenie.",
+    "pauseDashboardHome": "Wstrzymane",
+    "deleteMonitorMsg": "Czy na pewno chcesz usunąć ten monitor?",
+    "deleteNotificationMsg": "Czy na pewno chcesz usunąć to powiadomienie dla wszystkich monitorów?",
+    "resolverserverDescription": "Cloudflare jest domyślnym serwerem, możesz zmienić serwer resolver w każdej chwili.",
+    "rrtypeDescription": "Wybierz rodzaj rekordu, który chcesz monitorować",
+    "pauseMonitorMsg": "Czy na pewno chcesz wstrzymać monitorowanie?",
+    "enableDefaultNotificationDescription": "Dla każdego nowego monitora to powiadomienie będzie domyślnie włączone. Nadal możesz wyłączyć powiadomienia osobno dla każdego monitora.",
+    "clearEventsMsg": "Jesteś pewien, że chcesz wyczyścić historię zdarzeń dla tego monitora?",
+    "clearHeartbeatsMsg": "Jesteś pewien, że chcesz wyczyścić historię bicia serca dla tego monitora?",
+    "confirmClearStatisticsMsg": "Jesteś pewien, że chcesz usunąć WSZYSTKIE statystyki?",
+    "importHandleDescription": "Wybierz 'Pomiń istniejące', jeśli chcesz pominąć każdy monitor lub powiadomienie o tej samej nazwie. 'Nadpisz' spowoduje usunięcie każdego istniejącego monitora i powiadomienia.",
+    "confirmImportMsg": "Czy na pewno chcesz zaimportować kopię zapasową? Upewnij się, że wybrałeś właściwą opcję importu.",
+    "twoFAVerifyLabel": "Proszę, podaj swój token 2FA, aby sprawdzić, czy 2FA działa:",
+    "tokenValidSettingsMsg": "Token jest prawidłowy! Teraz możesz zapisać ustawienia 2FA.",
+    "confirmEnableTwoFAMsg": "Jesteś pewien, że chcesz włączyć 2FA?",
+    "confirmDisableTwoFAMsg": "Jesteś pewien, że chcesz wyłączyć 2FA?",
+    "Settings": "Ustawienia",
+    "Dashboard": "Panel",
+    "New Update": "Nowa aktualizacja",
+    "Language": "Język",
+    "Appearance": "Wygląd",
+    "Theme": "Motyw",
+    "General": "Ogólne",
+    "Version": "Wersja",
+    "Check Update On GitHub": "Sprawdź aktualizację na GitHub",
+    "List": "Lista",
+    "Add": "Dodaj",
+    "Add New Monitor": "Dodaj monitor",
+    "Quick Stats": "Szybki podgląd statystyk",
+    "Up": "Online",
+    "Down": "Offline",
+    "Pending": "Oczekuje",
+    "Unknown": "Nieznane",
+    "Pause": "Wstrzymaj",
+    "Name": "Nazwa",
+    "Status": "Status",
+    "DateTime": "Data i godzina",
+    "Message": "Wiadomość",
+    "No important events": "Brak ważnych wydarzeń",
+    "Resume": "Wznów",
+    "Edit": "Edytuj",
+    "Delete": "Usuń",
+    "Current": "Aktualny",
+    "Uptime": "Czas pracy",
+    "Cert Exp.": "Certyfikat wygasa",
+    "day": "dzień | dni",
+    "-day": "dni",
+    "hour": "godzina",
+    "-hour": "godzin",
+    "Response": "Odpowiedź",
+    "Ping": "Ping",
+    "Monitor Type": "Rodzaj monitora",
+    "Keyword": "Słowo kluczowe",
+    "Friendly Name": "Przyjazna nazwa",
+    "URL": "URL",
+    "Hostname": "Nazwa hosta",
+    "Port": "Port",
+    "Heartbeat Interval": "Częstotliwość bicia serca",
+    "Retries": "Prób",
+    "Heartbeat Retry Interval": "Częstotliwość ponawiania bicia serca",
+    "Advanced": "Zaawansowane",
+    "Upside Down Mode": "Tryb odwrócony",
+    "Max. Redirects": "Maks. przekierowań",
+    "Accepted Status Codes": "Akceptowane kody statusu",
+    "Save": "Zapisz",
+    "Notifications": "Powiadomienia",
+    "Not available, please setup.": "Niedostępne, proszę skonfigurować.",
+    "Setup Notification": "Skonfiguruj powiadomienie",
+    "Light": "Jasny",
+    "Dark": "Ciemny",
+    "Auto": "Automatyczny",
+    "Theme - Heartbeat Bar": "Motyw - pasek bicia serca",
+    "Normal": "Domyślne",
+    "Bottom": "Na dole",
+    "None": "Brak",
+    "Timezone": "Strefa czasowa",
+    "Search Engine Visibility": "Widoczność w wyszukiwarce",
+    "Allow indexing": "Zezwól na indeksowanie",
+    "Discourage search engines from indexing site": "Zniechęcaj wyszukiwarki do indeksowania strony",
+    "Change Password": "Zmień hasło",
+    "Current Password": "Aktualne hasło",
+    "New Password": "Nowe hasło",
+    "Repeat New Password": "Powtórz nowe hasło",
+    "Update Password": "Zaktualizuj hasło",
+    "Disable Auth": "Wyłącz autoryzację",
+    "Enable Auth": "Włącz autoryzację",
+    "disableauth.message1": "Czy na pewno chcesz <strong>wyłączyć autoryzację</strong>?",
+    "disableauth.message2": "Jest przeznaczony dla <strong>kogoś, kto ma autoryzację zewnętrzną</strong> przed Uptime Kuma, taką jak Cloudflare Access.",
+    "Please use this option carefully!": "Proszę używać tej opcji ostrożnie!",
+    "Logout": "Wyloguj",
+    "Leave": "Zostaw",
+    "I understand, please disable": "Rozumiem, proszę wyłączyć",
+    "Confirm": "Potwierdź",
+    "Yes": "Tak",
+    "No": "Nie",
+    "Username": "Nazwa użytkownika",
+    "Password": "Hasło",
+    "Remember me": "Zapamiętaj mnie",
+    "Login": "Zaloguj",
+    "No Monitors, please": "Brak monitorów, proszę",
+    "add one": "dodać jeden",
+    "Notification Type": "Rodzaj powiadomienia",
+    "Email": "E-mail",
+    "Test": "Test",
+    "Certificate Info": "Informacje o certyfikacie",
+    "Resolver Server": "Serwer rozwiązywania nazw",
+    "Resource Record Type": "Typ rekordu zasobów",
+    "Last Result": "Ostatni wynik",
+    "Create your admin account": "Utwórz swoje konto administratora",
+    "Repeat Password": "Powtórz hasło",
+    "Import Backup": "Importuj kopię zapasową",
+    "Export Backup": "Eksportuj kopię zapasową",
+    "Export": "Eksportuj",
+    "Import": "Importuj",
+    "respTime": "Czas odp. (ms)",
+    "notAvailableShort": "N/D",
+    "Default enabled": "Włącz domyślnie",
+    "Apply on all existing monitors": "Zastosuj do istniejących monitorów",
+    "Create": "Stwórz",
+    "Clear Data": "Usuń dane",
+    "Events": "Zdarzenia",
+    "Heartbeats": "Bicia serca",
+    "Auto Get": "Wykryj",
+    "backupDescription": "Możesz wykonać kopię zapasową wszystkich monitorów i wszystkich powiadomień do pliku JSON.",
+    "backupDescription2": "PS: Historia i dane zdarzeń nie są uwzględniane.",
+    "backupDescription3": "Poufne dane, takie jak tokeny powiadomień, są zawarte w pliku eksportu, prosimy o ostrożne przechowywanie.",
+    "alertNoFile": "Wybierz plik do importu.",
+    "alertWrongFileType": "Proszę wybrać plik JSON.",
+    "Clear all statistics": "Wyczyść wszystkie statystyki",
+    "Skip existing": "Pomiń istniejące",
+    "Overwrite": "Nadpisz",
+    "Options": "Opcje",
+    "Keep both": "Zachowaj oba",
+    "Verify Token": "Zweryfikuj token",
+    "Setup 2FA": "Konfiguracja 2FA",
+    "Enable 2FA": "Włącz 2FA",
+    "Disable 2FA": "Wyłącz 2FA",
+    "2FA Settings": "Ustawienia 2FA",
+    "Two Factor Authentication": "Uwierzytelnienie dwuskładnikowe",
+    "Active": "Włączone",
+    "Inactive": "Wyłączone",
+    "Token": "Token",
+    "Show URI": "Pokaż URI",
+    "Tags": "Tagi",
+    "Add New below or Select...": "Dodaj nowy poniżej lub wybierz…",
+    "Tag with this name already exist.": "Tag o tej nazwie już istnieje.",
+    "Tag with this value already exist.": "Tag o tej wartości już istnieje.",
+    "color": "kolor",
+    "value (optional)": "wartość (opcjonalnie)",
+    "Gray": "Szary",
+    "Red": "Czerwony",
+    "Orange": "Pomarańczowy",
+    "Green": "Zielony",
+    "Blue": "Niebieski",
+    "Indigo": "Indygo",
+    "Purple": "Fioletowy",
+    "Pink": "Różowy",
+    "Search...": "Szukaj…",
+    "Avg. Ping": "Średni ping",
+    "Avg. Response": "Średnia odpowiedź",
+    "Entry Page": "Strona startowa",
+    "statusPageNothing": "Nic tu nie ma, dodaj grupę lub monitor.",
+    "No Services": "Brak usług",
+    "All Systems Operational": "Wszystkie systemy działają poprawnie",
+    "Partially Degraded Service": "Część usług nie działa",
+    "Degraded Service": "Usługa nie działa",
+    "Add Group": "Dodaj grupę",
+    "Add a monitor": "Dodaj monitor",
+    "Edit Status Page": "Edytuj stronę statusu",
+    "Go to Dashboard": "Idź do panelu",
+    "Status Page": "Strona statusu",
+    "Status Pages": "Strony statusów",
+    "defaultNotificationName": "Moje powiadomienie {notification} ({number})",
+    "here": "tutaj",
+    "Required": "Wymagane",
+    "telegram": "Telegram",
+    "Bot Token": "Token bota",
+    "wayToGetTelegramToken": "Token można uzyskać z {0}.",
+    "Chat ID": "Identyfikator czatu",
+    "supportTelegramChatID": "Czat wsparcia technicznego / Bezpośrednia rozmowa / Czat grupowy",
+    "wayToGetTelegramChatID": "Możesz uzyskać swój identyfikator czatu, wysyłając wiadomość do bota i przechodząc pod ten adres URL, aby wyświetlić identyfikator czatu:",
+    "YOUR BOT TOKEN HERE": "TWÓJ TOKEN BOTA",
+    "chatIDNotFound": "Identyfikator czatu nie znaleziony, najpierw napisz do bota",
+    "webhook": "Webhook",
+    "Post URL": "Adres URL",
+    "Content Type": "Rodzaj danych",
+    "webhookJsonDesc": "{0} jest dobry w przypadku serwerów HTTP, takich jak express.js",
+    "webhookFormDataDesc": "{multipart} jest dobry dla PHP, musisz jedynie przetworzyć dane przez {decodeFunction}",
+    "smtp": "Email (SMTP)",
+    "secureOptionNone": "Brak / STARTTLS (25, 587)",
+    "secureOptionTLS": "TLS (465)",
+    "Ignore TLS Error": "Zignoruj błędy TLS",
+    "From Email": "Nadawca (OD)",
+    "To Email": "Odbiorca (DO)",
+    "smtpCC": "DW",
+    "smtpBCC": "UDW",
+    "discord": "Discord",
+    "Discord Webhook URL": "URL webhook Discorda",
+    "wayToGetDiscordURL": "Możesz go uzyskać, przechodząc do Ustawienia serwera -> Integracje -> Webhooki -> Tworzenie webhooka",
+    "Bot Display Name": "Wyświetlana nazwa bota",
+    "Prefix Custom Message": "Własny początek wiadomości",
+    "Hello @everyone is...": "Hej {'@'}everyone…",
+    "teams": "Microsoft Teams",
+    "Webhook URL": "URL webhooka",
+    "wayToGetTeamsURL": "Możesz dowiedzieć się, jak utworzyć adres url webhooka {0}.",
+    "signal": "Signal",
+    "Number": "Numer",
+    "Recipients": "Odbiorcy",
+    "needSignalAPI": "Musisz mieć klienta Signal z REST API.",
+    "wayToCheckSignalURL": "W celu dowiedzenia się, jak go skonfigurować, odwiedź poniższy link:",
+    "signalImportant": "UWAGA: Nie można mieszać nazw grup i numerów odbiorców!",
+    "gotify": "Gotify",
+    "Application Token": "Token aplikacji",
+    "Server URL": "Server URL",
+    "Priority": "Priorytet",
+    "slack": "Slack",
+    "Icon Emoji": "Ikona emoji",
+    "Channel Name": "Nazwa kanału",
+    "Uptime Kuma URL": "Adres Uptime Kuma",
+    "aboutWebhooks": "Więcej informacji na temat webhooków: {0}",
+    "aboutChannelName": "Podaj nazwę kanału {0} w polu Nazwa kanału, jeśli chcesz pominąć kanał webhooka. Np.: #inny-kanal",
+    "aboutKumaURL": "Jeśli pozostawisz pole Adres Uptime Kuma puste, domyślnie będzie to strona projektu na GitHub.",
+    "emojiCheatSheet": "Ściąga emoji: {0}",
+    "rocket.chat": "Rocket.chat",
+    "pushover": "Pushover",
+    "pushy": "Pushy",
+    "PushByTechulus": "Push od Techulus",
+    "octopush": "Octopush",
+    "promosms": "PromoSMS",
+    "lunasea": "LunaSea",
+    "apprise": "Apprise (obsługuje 50+ usług powiadomień)",
+    "GoogleChat": "Google Chat (wyłącznie Google Workspace)",
+    "pushbullet": "Pushbullet",
+    "line": "Line Messenger",
+    "mattermost": "Mattermost",
+    "User Key": "Klucz użytkownika",
+    "Device": "Urządzenie",
+    "Message Title": "Tytuł wiadomości",
+    "Notification Sound": "Dźwięk powiadomienia",
+    "More info on:": "Więcej informacji na: {0}",
+    "pushoverDesc1": "Priorytet awaryjny (2) ma domyślny 30-sekundowy limit czasu między kolejnymi próbami i wygaśnie po 1 godzinie.",
+    "pushoverDesc2": "Jeśli chcesz wysyłać powiadomienia na różne urządzenia, wypełnij pole Urządzenie.",
+    "SMS Type": "Rodzaj SMS",
+    "octopushTypePremium": "Premium (szybki - rekomendowany dla powiadomień)",
+    "octopushTypeLowCost": "Low Cost (wolny, czasami blokowany przez operatorów)",
+    "Check octopush prices": "Sprawdź ceny Octopush {0}.",
+    "octopushPhoneNumber": "Numer telefonu (format międzynarodowy np.: +33612345678) ",
+    "octopushSMSSender": "Nadawca SMS: 3-11 znaków alfanumerycznych i spacji (a-zA-Z0-9)",
+    "LunaSea Device ID": "Identyfikator urządzenia LunaSea",
+    "Apprise URL": "URL Apprise",
+    "Example:": "Przykład: {0}",
+    "Read more:": "Czytaj dalej: {0}",
+    "Status:": "Status: {0}",
+    "Read more": "Czytaj dalej",
+    "appriseInstalled": "Apprise jest zainstalowane.",
+    "appriseNotInstalled": "Apprise nie zostało zainstalowane. {0}",
+    "Access Token": "Token dostępu",
+    "Channel access token": "Token dostępu kanału",
+    "Line Developers Console": "Konsola deweloperska Line",
+    "lineDevConsoleTo": "Konsola deweloperska Line - {0}",
+    "Basic Settings": "Ustawienia ogólne",
+    "User ID": "Identyfikator użytkownika",
+    "Messaging API": "API wiadomości",
+    "wayToGetLineChannelToken": "Najpierw uzyskaj dostęp do {0}, utwórz dostawcę i kanał (Messaging API), a następnie możesz uzyskać token dostępu do kanału i identyfikator użytkownika z wyżej wymienionych pozycji menu.",
+    "Icon URL": "Adres Ikony",
+    "aboutIconURL": "Możesz podać link do zdjęcia w \"Adres URL ikony\", aby zastąpić domyślne zdjęcie profilowe. Nie będzie używany, jeśli ustawiona jest ikona emoji.",
+    "aboutMattermostChannelName": "Możesz zastąpić domyślny kanał, na którym publikowane są posty webhooka, wpisując nazwę kanału w polu \"Nazwa kanału\". Należy to włączyć w ustawieniach webhooka Mattermost. Np.: #inny-kanał",
+    "matrix": "Matrix",
+    "promosmsTypeEco": "SMS ECO - tanie, lecz wolne. Dostępne tylko w Polsce.",
+    "promosmsTypeFlash": "SMS FLASH - wiadomość automatycznie wyświetli się na urządzeniu. Dostępne tylko w Polsce.",
+    "promosmsTypeFull": "SMS FULL - szybkie i dostępne międzynarodowo. Wersja premium usługi, która pozwala min. ustawić własną nazwę nadawcy.",
+    "promosmsTypeSpeed": "SMS SPEED - wysyłka priorytetowa, ma wszystkie zalety SMS FULL.",
+    "promosmsPhoneNumber": "Numer odbiorcy",
+    "promosmsSMSSender": "Nadawca SMS (wcześniej zatwierdzone nazwy z panelu PromoSMS)",
+    "promosmsAllowLongSMS": "Zezwól na długie SMSy",
+    "Primary Base URL": "Główny URL",
+    "Push URL": "Push URL",
+    "needPushEvery": "Powinieneś wywoływać ten URL co {0} sekund.",
+    "pushOptionalParams": "Parametry opcjonalne: {0}",
+    "emailCustomSubject": "Niestandardowy temat",
+    "checkPrice": "Sprawdź ceny {0}:",
+    "octopushLegacyHint": "Czy używasz starszej wersji Octopush (2011-2020) czy nowej wersji?",
+    "Feishu WebHookUrl": "Feishu WebHookURL",
+    "matrixHomeserverURL": "Adres URL serwera domowego (z http(s):// i opcjonalnie port)",
+    "Internal Room Id": "Wewnętrzne ID pokoju",
+    "matrixDesc1": "Możesz znaleźć wewnętrzne ID pokoju, patrząc w zaawansowanej sekcji ustawień pokoju w twoim kliencie Matrix. Powinien on wyglądać jak !QMdRCpUIfLwsfjxye6:home.server.",
+    "matrixDesc2": "Jest wysoce zalecane, abyś stworzył nowego użytkownika i nie używał tokena dostępu swojego użytkownika Matrix, ponieważ pozwoli on na pełny dostęp do twojego konta i wszystkich pokoi, do których dołączyłeś. Zamiast tego, utwórz nowego użytkownika i zaproś go tylko do pokoju, w którym chcesz otrzymywać powiadomienia. Możesz uzyskać token dostępu przez uruchomienie {0}",
+    "Method": "Metoda",
+    "Body": "Treść",
+    "Headers": "Nagłówki",
+    "PushUrl": "Push URL",
+    "HeadersInvalidFormat": "Nagłówki żądania nie są w poprawnym formacie JSON: ",
+    "BodyInvalidFormat": "Treść żądania nie jest w poprawnym formacie JSON: ",
+    "Monitor History": "Historia monitorów",
+    "clearDataOlderThan": "Przechowuj dane dotyczące historii monitorowania {0} dni.",
+    "PasswordsDoNotMatch": "Hasła nie pasują.",
+    "records": "rekordy",
+    "One record": "Jeden rekord",
+    "steamApiKeyDescription": "Do monitorowania serwera gier Steam potrzebny jest klucz Steam Web-API. Możesz zarejestrować swój klucz API tutaj: ",
+    "Current User": "Aktualny użytkownik",
+    "topic": "Temat",
+    "topicExplanation": "Temat MQTT do monitorowania",
+    "successMessage": "Komunikat o powodzeniu",
+    "successMessageExplanation": "Komunikat MQTT, który zostanie uznany za powodzenie",
+    "recent": "Ostatnie",
+    "Done": "Zrobione",
+    "Info": "Info",
+    "Security": "Bezpieczeństwo",
+    "Steam API Key": "Klucz Steam API",
+    "Shrink Database": "Zmniejsz bazę danych",
+    "Pick a RR-Type...": "Wybierz typ RR…",
+    "Pick Accepted Status Codes...": "Wybierz akceptowalne kody statusu…",
+    "Default": "Domyślnie",
+    "HTTP Options": "Opcje HTTP",
+    "Create Incident": "Stwórz incydent",
+    "Title": "Tytuł",
+    "Content": "Treść",
+    "Style": "Styl",
+    "info": "info",
+    "warning": "ostrzeżenie",
+    "danger": "niebezpieczeństwo",
+    "primary": "podstawowy",
+    "light": "jasny",
+    "dark": "ciemny",
+    "Post": "Wyślij",
+    "Please input title and content": "Podaj tytuł i treść",
+    "Created": "Stworzony",
+    "Last Updated": "Ostatnio zaktualizowany",
+    "Unpin": "Odepnij",
+    "Switch to Light Theme": "Przełącz na jasny motyw",
+    "Switch to Dark Theme": "Przełącz na ciemny motyw",
+    "Show Tags": "Pokaż tagi",
+    "Hide Tags": "Ukryj tagi",
+    "Description": "Opis",
+    "No monitors available.": "Brak dostępnych monitorów.",
+    "Add one": "Dodaj jeden",
+    "No Monitors": "Brak monitorów",
+    "Untitled Group": "Nienazwana grupa",
+    "Services": "Usługi",
+    "Discard": "Odrzuć",
+    "Cancel": "Anuluj",
+    "Powered by": "Napędzane przez",
+    "shrinkDatabaseDescription": "Uruchom VACUUM na bazie SQLite. Jeżeli twoja baza została stworzona po wersji 1.10.0, to ma już włączoną opcję AUTO_VACUUM i stosowanie ręcznego oczyszczania nie jest potrzebne.",
+    "clicksendsms": "ClickSend SMS",
+    "apiCredentials": "Poświadczenia API",
+    "serwersms": "SerwerSMS.pl",
+    "serwersmsAPIUser": "Nazwa użytkownika API (z prefiksem webapi_)",
+    "serwersmsAPIPassword": "Hasło API",
+    "serwersmsPhoneNumber": "Numer telefonu",
+    "serwersmsSenderName": "Nazwa nadawcy (zatwierdzona w panelu klienta)",
+    "smseagle": "SMSEagle",
+    "smseagleTo": "Numer/y telefonu",
+    "smseagleGroup": "Grupa/y z Książki adresowej",
+    "smseagleContact": "Kontakt/y z Książki adresowej",
+    "smseagleRecipientType": "Typ odbiorcy",
+    "smseagleRecipient": "Odbiorca/y (wiele musi być oddzielone przecinkami)",
+    "smseagleToken": "Klucz dostępu API",
+    "smseagleUrl": "URL Twojego urządzenia SMSEagle",
+    "smseagleEncoding": "Wyślij jako Unicode",
+    "smseaglePriority": "Priorytet wiadomości (0-9, domyślnie = 0)",
+    "stackfield": "Stackfield",
+    "Customize": "Dostosuj",
+    "Custom Footer": "Niestandardowa stopka",
+    "Custom CSS": "Niestandardowy CSS",
+    "smtpDkimSettings": "Ustawienia DKIM",
+    "smtpDkimDesc": "Zapoznaj się z Nodemailer DKIM {0}, aby dowiedzieć się więcej.",
+    "documentation": "dokumentacja",
+    "smtpDkimDomain": "Nazwa domeny",
+    "smtpDkimKeySelector": "Selektor klucza",
+    "smtpDkimPrivateKey": "Klucz prywatny",
+    "smtpDkimHashAlgo": "Algorytm haszujący (opcjonalne)",
+    "smtpDkimheaderFieldNames": "Klucze nagłówka do podpisu (opcjonalne)",
+    "smtpDkimskipFields": "Klucze nagłówka do pominięcia (opcjonalne)",
+    "gorush": "Gorush",
+    "alerta": "Alerta",
+    "alertaApiEndpoint": "Punkt końcowy API",
+    "alertaEnvironment": "Środowisko",
+    "alertaApiKey": "Klucz API",
+    "alertaAlertState": "Stan alarmowy",
+    "alertaRecoverState": "Stan odzyskania",
+    "deleteStatusPageMsg": "Jesteś pewien, że chcesz usunąć tę stronę statusów?",
+    "Proxies": "Proxy",
+    "default": "Domyślny",
+    "enabled": "Włączony",
+    "setAsDefault": "Ustaw jako domyślny",
+    "deleteProxyMsg": "Jesteś pewien, że chcesz usunąć proxy ze wszystkich monitorów?",
+    "proxyDescription": "Proxy muszą być przypisane do monitora, aby działały.",
+    "enableProxyDescription": "Ten serwer proxy nie będzie miał wpływu na żądania monitorów, dopóki nie zostanie aktywowany. Możesz kontrolować tymczasowe wyłączenie serwera proxy ze wszystkich monitorów za pomocą statusu aktywacji.",
+    "setAsDefaultProxyDescription": "Ten serwer proxy będzie domyślnie włączony dla nowych monitorów. Można go jednak wyłączyć osobno dla każdego monitora.",
+    "Certificate Chain": "Łańcuch certyfikatów",
+    "Valid": "Ważny",
+    "Invalid": "Nieważny",
+    "AccessKeyId": "ID klucza dostępu",
+    "SecretAccessKey": "AccessKey Sekret",
+    "PhoneNumbers": "Numery telefonów",
+    "TemplateCode": "Kod szablonu",
+    "SignName": "Podpis",
+    "Sms template must contain parameters: ": "Szablon sms musi posiadać parametry: ",
+    "Bark Endpoint": "Punkt końcowy Bark",
+    "WebHookUrl": "WebHookUrl",
+    "SecretKey": "Tajny klucz",
+    "For safety, must use secret key": "Ze względów bezpieczeństwa musisz użyć tajnego klucza",
+    "Device Token": "Token urządzenia",
+    "Platform": "Platforma",
+    "iOS": "iOS",
+    "Android": "Android",
+    "Huawei": "Huawei",
+    "High": "Wysoki",
+    "Retry": "Ponów",
+    "Topic": "Temat",
+    "WeCom Bot Key": "Klucz bota WeCom",
+    "Setup Proxy": "Skonfiguruj proxy",
+    "Proxy Protocol": "Protokół proxy",
+    "Proxy Server": "Serwer proxy",
+    "Proxy server has authentication": "Serwer proxy ma autoryzację",
+    "User": "Użytkownik",
+    "Installed": "Zainstalowany",
+    "Not installed": "Nie zainstalowany",
+    "Running": "Działa",
+    "Not running": "Nie działa",
+    "Remove Token": "Usuń token",
+    "Start": "Start",
+    "Stop": "Stop",
+    "Uptime Kuma": "Uptime Kuma",
+    "Add New Status Page": "Dodaj nową stronę statusów",
+    "Slug": "Symbol",
+    "Accept characters:": "Dozwolone znaki:",
+    "startOrEndWithOnly": "Zaczynające się i kończące wyłącznie {0} znakami",
+    "No consecutive dashes": "Bez powtarzających się myślników",
+    "Next": "Dalej",
+    "The slug is already taken. Please choose another slug.": "Ten symbol jest już zajęty. Proszę, wybierz inny.",
+    "No Proxy": "Bez proxy",
+    "Authentication": "Uwierzytelnianie",
+    "HTTP Basic Auth": "Podstawowa autoryzacja HTTP",
+    "New Status Page": "Nowa strona statusu",
+    "Page Not Found": "Strona nie została znaleziona",
+    "Reverse Proxy": "Zwrotny serwer proxy",
+    "Backup": "Backup",
+    "About": "O skrypcie",
+    "wayToGetCloudflaredURL": "(Pobierz cloudflared z {0})",
+    "cloudflareWebsite": "Strona Cloudflare",
+    "Message:": "Wiadomość:",
+    "Don't know how to get the token? Please read the guide:": "Nie wiesz jak uzyksać token? Przeczytaj proszę poradnik:",
+    "The current connection may be lost if you are currently connecting via Cloudflare Tunnel. Are you sure want to stop it? Type your current password to confirm it.": "Bieżące połączenie może zostać utracone, jeśli aktualnie łączysz się przez tunel Cloudflare. Czy na pewno chcesz to przerwać? Wpisz swoje aktualne hasło, aby je potwierdzić.",
+    "Other Software": "Inne oprogramowanie",
+    "For example: nginx, Apache and Traefik.": "Na przykład: nginx, Apache i Traefik.",
+    "Please read": "Przeczytaj proszę",
+    "Subject:": "Temat:",
+    "Valid To:": "Ważny do:",
+    "Days Remaining:": "Pozostało dni:",
+    "Issuer:": "Wydawca:",
+    "Fingerprint:": "Odcisk palca:",
+    "No status pages": "Brak stron statusów",
+    "Domain Name Expiry Notification": "Powiadomienie o wygasaniu domeny",
+    "Proxy": "Proxy",
+    "Date Created": "Data stworzenia",
+    "onebotHttpAddress": "Adres HTTP OneBot",
+    "onebotMessageType": "Rodzaj wiadomości OneBot",
+    "onebotGroupMessage": "Grupowa",
+    "onebotPrivateMessage": "Prywatna",
+    "onebotUserOrGroupId": "ID Grupy/Użytkownika",
+    "onebotSafetyTips": "Ze względów bezpieczeństwa musisz ustawić token dostępu",
+    "PushDeer Key": "Klucz PushDeer",
+    "Footer Text": "Treść stopki",
+    "Show Powered By": "Pokaż co napędza stronę",
+    "Domain Names": "Domeny",
+    "signedInDisp": "Zalogowany jako {0}",
+    "signedInDispDisabled": "Autoryzacja wyłączona.",
+    "resendEveryXTimes": "Wysyłaj ponownie co {0} razy",
+    "resendDisabled": "Ponowne wysyłanie jest wyłączone",
+    "Maintenance": "Konserwacja",
+    "statusMaintenance": "Konserwacja",
+    "Schedule maintenance": "Planowanie konserwacji",
+    "Affected Monitors": "Monitory dotknięte problemem",
+    "Pick Affected Monitors...": "Wybierz monitory, których to dotyczy…",
+    "Start of maintenance": "Rozpoczęcie konserwacji",
+    "All Status Pages": "Wszystkie strony statusu",
+    "Select status pages...": "Wybierz strony statusu…",
+    "recurringIntervalMessage": "Uruchom raz dziennie | Uruchom raz na {0} dni",
+    "affectedMonitorsDescription": "Wybierz monitory, których dotyczy bieżąca konserwacja",
+    "affectedStatusPages": "Pokaż ten komunikat o konserwacji na wybranych stronach statusu",
+    "atLeastOneMonitor": "Wybierz co najmniej jeden monitor, którego dotyczy problem",
+    "deleteMaintenanceMsg": "Czy na pewno chcesz usunąć tę konserwację?",
+    "dnsPortDescription": "Port serwera DNS. Domyślnie 53. Możesz zmienić port w dowolnym momencie.",
+    "Resend Notification if Down X times consecutively": "Wyślij ponownie powiadomienie, jeśli nie działa X razy z rzędu",
+    "error": "błąd",
+    "critical": "krytyczny",
+    "wayToGetPagerDutyKey": "Możesz to uzyskać, przechodząc do Service -> Service Directory -> (wybierz usługę) -> Integrations -> Add integration. Tutaj możesz wyszukać \"Events API V2\". Więcej informacji {0}",
+    "Integration Key": "Klucz integracji",
+    "Integration URL": "Adres URL integracji",
+    "Auto resolve or acknowledged": "Automatycznie rozwiązany lub potwierdzony",
+    "do nothing": "nie rób nic",
+    "auto acknowledged": "auto potwierdzony",
+    "auto resolve": "automatycznie rozwiązany",
+    "Bark Group": "Grupa Bark",
+    "Bark Sound": "Dźwięk Bark",
+    "HTTP Headers": "Nagłówki HTTP",
+    "Trust Proxy": "Ufaj proxy",
+    "HomeAssistant": "Asystent domowy",
+    "RadiusSecret": "Sekretny klucz Radius",
+    "RadiusSecretDescription": "Współdzielony sekretny klucz pomiędzy klientem a serwerem",
+    "RadiusCalledStationId": "Id stacji wywoływanej",
+    "RadiusCalledStationIdDescription": "Identyfikator wywoływanego urządzenia",
+    "RadiusCallingStationId": "Id stacji wywoławczej",
+    "RadiusCallingStationIdDescription": "Identyfikator urządzenia wywołującego",
+    "Certificate Expiry Notification": "Powiadomienie o wygaśnięciu certyfikatu",
+    "API Username": "Nazwa użytkownika API",
+    "API Key": "Klucz API",
+    "Recipient Number": "Numer odbiorcy",
+    "From Name/Number": "Od nazwa/numer",
+    "Leave blank to use a shared sender number.": "Pozostaw puste, aby użyć wspólnego numeru nadawcy.",
+    "Octopush API Version": "Wersja API Octopush",
+    "Legacy Octopush-DM": "Starsze Octopush-DM",
+    "endpoint": "punkt końcowy",
+    "octopushAPIKey": "\"API key\" z poświadczeń HTTP API w panelu sterowania",
+    "octopushLogin": "\"Login\" z poświadczeń HTTP API w panelu sterowania",
+    "promosmsLogin": "Nazwa logowania API",
+    "promosmsPassword": "Hasło API",
+    "pushoversounds pushover": "Pushover (domyślny)",
+    "pushoversounds bike": "Rower",
+    "pushoversounds bugle": "chrząszcz",
+    "pushoversounds cashregister": "Kasa fiskalna",
+    "pushoversounds classical": "Classical",
+    "pushoversounds cosmic": "Kosmiczny",
+    "pushoversounds falling": "Spadek",
+    "pushoversounds gamelan": "Gamelan",
+    "pushoversounds incoming": "Incoming",
+    "pushoversounds intermission": "Intermission",
+    "pushoversounds magic": "Magia",
+    "pushoversounds mechanical": "Mechaniczny",
+    "pushoversounds pianobar": "Piano Bar",
+    "pushoversounds siren": "Syrena",
+    "pushoversounds spacealarm": "Alarm kosmiczny",
+    "pushoversounds tugboat": "Holownik",
+    "pushoversounds alien": "Alien Alarm (długie)",
+    "pushoversounds climb": "Climb (długie)",
+    "pushoversounds persistent": "Persistent (długie)",
+    "pushoversounds echo": "Pushover Echo (długie)",
+    "pushoversounds updown": "Up Down (długie)",
+    "pushoversounds vibrate": "Tylko wibracje",
+    "pushoversounds none": "Brak (cisza)",
+    "pushyAPIKey": "Tajny klucz API",
+    "pushyToken": "Token urządzenia",
+    "Show update if available": "Pokaż aktualizację, jeśli jest dostępna",
+    "Also check beta release": "Sprawdź również wydanie beta",
+    "Using a Reverse Proxy?": "Używasz odwróconego proxy?",
+    "Check how to config it for WebSocket": "Sprawdź jak go skonfigurować dla WebSocket",
+    "Steam Game Server": "Serwer gry Steam",
+    "Most likely causes:": "Najbardziej prawdopodobne przyczyny:",
+    "The resource is no longer available.": "Zasób nie jest już dostępny.",
+    "There might be a typing error in the address.": "W adresie może być błąd w pisowni.",
+    "What you can try:": "Co możesz spróbować:",
+    "Retype the address.": "Ponownie wpisz adres.",
+    "Go back to the previous page.": "Wróć do poprzedniej strony.",
+    "Coming Soon": "Wkrótce",
+    "wayToGetClickSendSMSToken": "Możesz uzyskać nazwę użytkownika API i klucz API z {0}.",
+    "Connection String": "Ciąg połączenia",
+    "Query": "Zapytanie",
+    "settingsCertificateExpiry": "Wygaśnięcie certyfikatu TLS",
+    "certificationExpiryDescription": "Monitory HTTPS uruchamiają powiadomienia o wygaśnięciu certyfikatu TLS w:",
+    "Setup Docker Host": "Konfiguracja hosta Docker",
+    "Connection Type": "Typ połączenia",
+    "Docker Daemon": "Demon Dockera",
+    "deleteDockerHostMsg": "Czy na pewno chcesz usunąć ten host Dockera dla wszystkich monitorów?",
+    "socket": "Gniazdo",
+    "tcp": "TCP / HTTP",
+    "Docker Container": "Kontener Dockera",
+    "Container Name / ID": "Nazwa kontenera / ID",
+    "Docker Host": "Host Dockera",
+    "Docker Hosts": "Hosty Dockera",
+    "ntfy Topic": "Temat ntfy",
+    "Domain": "Domena",
+    "Workstation": "Stacja robocza",
+    "disableCloudflaredNoAuthMsg": "Jesteś w trybie No Auth, hasło nie jest wymagane.",
+    "trustProxyDescription": "Zaufaj nagłówkom 'X-Forwarded-*'. Jeśli chcesz uzyskać poprawne IP klienta, a twój Uptime Kuma jest za proxy, takim jak Nginx lub Apache, powinieneś to włączyć.",
+    "wayToGetLineNotifyToken": "Możesz uzyskać token dostępu z {0}",
+    "Examples": "Przykłady",
+    "Home Assistant URL": "URL Home Assistant",
+    "Long-Lived Access Token": "Długotrwały token dostępu",
+    "Long-Lived Access Token can be created by clicking on your profile name (bottom left) and scrolling to the bottom then click Create Token. ": "Długotrwały token dostępu można utworzyć klikając na nazwę swojego profilu (na dole po lewej stronie) i przewijając do dołu, a następnie klikając Create Token. ",
+    "Notification Service": "Usługa powiadamiania",
+    "default: notify all devices": "domyślnie: powiadamiaj wszystkie urządzenia",
+    "A list of Notification Services can be found in Home Assistant under \"Developer Tools > Services\" search for \"notification\" to find your device/phone name.": "Listę usług powiadamiania można znaleźć w Home Assistant pod \"Developer Tools > Services\" wyszukaj \"notification\", aby znaleźć nazwę swojego urządzenia/telefonu.",
+    "Automations can optionally be triggered in Home Assistant:": "Automaty mogą być opcjonalnie uruchamiane w Home Assistant:",
+    "Trigger type:": "Typ wyzwalacza:",
+    "Event type:": "Typ zdarzenia:",
+    "Event data:": "Dane o zdarzeniu:",
+    "Then choose an action, for example switch the scene to where an RGB light is red.": "Następnie wybierz akcję, na przykład przełącz scenę na taką, w której światło RGB jest czerwone.",
+    "Frontend Version": "Wersja frontu",
+    "Frontend Version do not match backend version!": "Wersja frontu nie pasuje do wersji backendu!",
+    "Base URL": "Bazowy adres URL",
+    "goAlertInfo": "GoAlert to aplikacja open source do planowania, automatycznych eskalacji i powiadomień (jak SMS lub połączenia głosowe). Automatycznie angażuj właściwą osobę, we właściwy sposób i we właściwym czasie! {0}",
+    "goAlertIntegrationKeyInfo": "Pobierz generyczny klucz integracyjny API dla usługi, którego wartość skopiowanego tokena URL jest zwykle w formacie \"aaaaaaaa-bbb-cccc-dddd-eeeeee\".",
+    "goAlert": "GoAlert",
+    "backupOutdatedWarning": "Przestarzałe: ponieważ dodano wiele funkcji i funkcja tworzenia kopii zapasowych nie jest wystarczająco utrzymywana, nie może generować ani przywracać pełnej kopii zapasowej.",
+    "backupRecommend": "Zamiast tego należy wykonać bezpośrednią kopię zapasową woluminu lub folderu danych (./data/).",
+    "Optional": "Opcjonalne",
+    "squadcast": "Squadcast",
+    "SendKey": "SendKey",
+    "SMSManager API Docs": "Dokumentacja API SMSManager ",
+    "Gateway Type": "Typ bramy",
+    "SMSManager": "SMSManager",
+    "You can divide numbers with": "Możesz dzielić liczby przez",
+    "or": "lub",
+    "recurringInterval": "odstęp czasu",
+    "Recurring": "powtarzający się",
+    "strategyManual": "Aktywowany/dezaktywowany ręcznie",
+    "warningTimezone": "Używa strefy czasowej serwera",
+    "weekdayShortMon": "pon",
+    "weekdayShortTue": "wt",
+    "weekdayShortWed": "śr",
+    "weekdayShortThu": "czw",
+    "weekdayShortFri": "pt",
+    "weekdayShortSat": "sob",
+    "weekdayShortSun": "niedz",
+    "dayOfWeek": "Dzień tygodnia",
+    "dayOfMonth": "Dzień miesiąca",
+    "lastDay": "Ostatni dzień",
+    "lastDay1": "Ostatni dzień miesiąca",
+    "lastDay2": "2. ostatni dzień miesiąca",
+    "lastDay3": "3. ostatni dzień miesiąca",
+    "lastDay4": "4. ostatni dzień miesiąca",
+    "No Maintenance": "Brak konserwacji",
+    "pauseMaintenanceMsg": "Jesteś pewien, że chcesz zatrzymać?",
+    "maintenanceStatus-under-maintenance": "Podczas konserwacji",
+    "maintenanceStatus-inactive": "Nieaktywny",
+    "maintenanceStatus-scheduled": "Zaplanowany",
+    "maintenanceStatus-ended": "Zakończony",
+    "maintenanceStatus-unknown": "Nieznany",
+    "Display Timezone": "Wyświetlana strefa czasowa",
+    "Server Timezone": "Strefa czasowa serwera",
+    "statusPageMaintenanceEndDate": "Koniec",
+    "Help": "Pomoc",
+    "Passive Monitor Type": "Pasywny typ monitora",
+    "Enable": "Włącz",
+    "confirmDeleteTagMsg": "Czy na pewno chcesz usunąć ten tag? Monitory powiązane z tym tagiem nie zostaną usunięte.",
+    "Kook": "Kook",
+    "Enable TLS": "Włącz TLS",
+    "webhookAdditionalHeadersDesc": "Ustawia dodatkowe nagłówki wysyłane z webhookiem.",
+    "dnsCacheDescription": "Może nie działać w niektórych środowiskach z IPv6. Wyłącz, jeśli napotkasz jakiekolwiek problemy.",
+    "wayToGetKookBotToken": "Utwórz aplikację i uzyskaj swój token bota na {0}",
+    "wayToGetKookGuildID": "Włącz 'Developer Mode' w ustawieniach Kook'a i kliknij prawym przyciskiem myszy na gildię, aby uzyskać jej ID",
+    "Game": "Gra",
+    "Specific Monitor Type": "Konkretny typ monitora",
+    "Monitor": "Monitor | Monitory",
+    "webhookAdditionalHeadersTitle": "Dodatkowe nagłówki",
+    "Custom": "Własny",
+    "ZohoCliq": "ZohoCliq",
+    "Disable": "Wyłącz",
+    "Date and Time": "Data i czas",
+    "IconUrl": "URL ikony",
+    "Enable DNS Cache": "Włącz pamięć podręczną DNS",
+    "Single Maintenance Window": "Pojedyncze okno konserwacji",
+    "Effective Date Range": "Zakres dat obowiązywania",
+    "Schedule Maintenance": "Planowanie konserwacji",
+    "DateTime Range": "Zakres czasowy",
+    "Maintenance Time Window of a Day": "Okno czasowe konserwacji na dzień",
+    "wayToGetZohoCliqURL": "Możesz dowiedzieć się, jak utworzyć adres URL webhook {0}.",
+    "dataRetentionTimeError": "Okres przechowywania musi wynosić 0 lub więcej",
+    "infiniteRetention": "Ustaw na 0, aby uzyskać nieskończony okres przechowywania.",
+    "enableGRPCTls": "Zezwalaj na wysyłanie żądania gRPC z połączeniem TLS",
+    "grpcMethodDescription": "Nazwa metody jest konwertowana na format cammelCase, taki jak sayHello, check, itp.",
+    "Guild ID": "ID gildii",
+    "Proto Content": "Zawartość Proto",
+    "Proto Method": "Metoda Proto",
+    "Proto Service Name": "Nazwa usługi Proto",
+    "Economy": "Ekonomia",
+    "Strategy": "Strategia",
+    "Free Mobile User Identifier": "Darmowy mobilny identyfikator użytkownika",
+    "Free Mobile API Key": "Darmowy mobilny klucz API",
+    "Lowcost": "Tani",
+    "high": "wysoki",
+    "General Monitor Type": "Ogólny typ monitora",
+    "Packet Size": "Rozmiar pakietu",
+    "uninstalling": "Odinstalowywanie",
+    "loadingError": "Nie można pobrać danych, proszę spróbować ponownie później.",
+    "plugin": "Plugin | Pluginy",
+    "install": "Instaluj",
+    "installing": "Instalowanie",
+    "uninstall": "Odinstaluj",
+    "confirmUninstallPlugin": "Czy na pewno chcesz odinstalować tę wtyczkę?",
+    "Custom Monitor Type": "Własny typ monitora",
+    "markdownSupported": "Obsługiwana składnia Markdown",
+    "Google Analytics ID": "Identyfikator Google Analytics",
+    "Edit Tag": "Edytuj Tag",
+    "Server Address": "Adres Serwera",
+    "Learn More": "Dowiedz się więcej"
+}
diff --git a/src/lang/pt-BR.json b/src/lang/pt-BR.json
new file mode 100644
index 000000000..09ac2414f
--- /dev/null
+++ b/src/lang/pt-BR.json
@@ -0,0 +1,284 @@
+{
+    "languageName": "Português (Brasileiro)",
+    "checkEverySecond": "Verificar a cada {0} segundos",
+    "retryCheckEverySecond": "Tentar novamente a cada {0} segundos",
+    "retriesDescription": "Máximo de tentativas antes que o serviço seja marcado como inativo e uma notificação seja enviada",
+    "ignoreTLSError": "Ignorar erros TLS/SSL para sites HTTPS",
+    "upsideDownModeDescription": "Inverta o status de cabeça para baixo. Se o serviço estiver acessível, ele está OFFLINE.",
+    "maxRedirectDescription": "Número máximo de redirecionamentos a seguir. Defina como 0 para desativar redirecionamentos.",
+    "acceptedStatusCodesDescription": "Selecione os códigos de status que são considerados uma resposta bem-sucedida.",
+    "passwordNotMatchMsg": "A senha repetida não corresponde.",
+    "notificationDescription": "Atribua uma notificação ao (s) monitor (es) para que funcione.",
+    "keywordDescription": "Pesquise a palavra-chave em html simples ou resposta JSON e diferencia maiúsculas de minúsculas.",
+    "pauseDashboardHome": "Pausar",
+    "deleteMonitorMsg": "Tem certeza de que deseja excluir este monitor?",
+    "deleteNotificationMsg": "Tem certeza de que deseja excluir esta notificação para todos os monitores?",
+    "resolverserverDescription": "Cloudflare é o servidor padrão, você pode alterar o servidor resolvedor a qualquer momento.",
+    "rrtypeDescription": "Selecione o RR-Type que você deseja monitorar",
+    "pauseMonitorMsg": "Tem certeza que deseja fazer uma pausa?",
+    "enableDefaultNotificationDescription": "Para cada novo monitor, esta notificação será habilitada por padrão. Você ainda pode desativar a notificação separadamente para cada monitor.",
+    "clearEventsMsg": "Tem certeza de que deseja excluir todos os eventos deste monitor?",
+    "clearHeartbeatsMsg": "Tem certeza de que deseja excluir todos os heartbeats deste monitor?",
+    "confirmClearStatisticsMsg": "Tem certeza que deseja excluir TODAS as estatísticas?",
+    "importHandleDescription": "Escolha 'Ignorar existente' se quiser ignorar todos os monitores ou notificações com o mesmo nome. 'Substituir' excluirá todos os monitores e notificações existentes.",
+    "confirmImportMsg": "Tem certeza que deseja importar o backup? Certifique-se de que selecionou a opção de importação correta.",
+    "twoFAVerifyLabel": "Digite seu token para verificar se 2FA está funcionando:",
+    "tokenValidSettingsMsg": "O token é válido! Agora você pode salvar as configurações 2FA.",
+    "confirmEnableTwoFAMsg": "Tem certeza de que deseja habilitar 2FA?",
+    "confirmDisableTwoFAMsg": "Tem certeza de que deseja desativar 2FA?",
+    "Settings": "Configurações",
+    "Dashboard": "Dashboard",
+    "New Update": "Nova Atualização",
+    "Language": "Linguagem",
+    "Appearance": "Aparência",
+    "Theme": "Tema",
+    "General": "Geral",
+    "Version": "Versão",
+    "Check Update On GitHub": "Verificar atualização no Github",
+    "List": "Lista",
+    "Add": "Adicionar",
+    "Add New Monitor": "Adicionar novo monitor",
+    "Quick Stats": "Estatísticas rápidas",
+    "Up": "On",
+    "Down": "Off",
+    "Pending": "Pendente",
+    "Unknown": "Desconhecido",
+    "Pause": "Pausar",
+    "Name": "Nome",
+    "Status": "Status",
+    "DateTime": "Data hora",
+    "Message": "Mensagem",
+    "No important events": "Nenhum evento importante",
+    "Resume": "Resumo",
+    "Edit": "Editar",
+    "Delete": "Deletar",
+    "Current": "Atual",
+    "Uptime": "Tempo de atividade",
+    "Cert Exp.": "Cert Exp.",
+    "day": "dia | dias",
+    "-day": "-dia",
+    "hour": "hora",
+    "-hour": "-hora",
+    "Response": "Resposta",
+    "Ping": "Ping",
+    "Monitor Type": "Tipo de Monitor",
+    "Keyword": "Palavra-Chave",
+    "Friendly Name": "Nome Amigável",
+    "URL": "URL",
+    "Hostname": "Hostname",
+    "Port": "Porta",
+    "Heartbeat Interval": "Intervalo de Heartbeat",
+    "Retries": "Novas tentativas",
+    "Heartbeat Retry Interval": "Intervalo de repetição de Heartbeat",
+    "Advanced": "Avançado",
+    "Upside Down Mode": "Modo de cabeça para baixo",
+    "Max. Redirects": "Redirecionamentos Máx",
+    "Accepted Status Codes": "Status Code Aceitáveis",
+    "Save": "Salvar",
+    "Notifications": "Notificações",
+    "Not available, please setup.": "Não disponível, por favor configure.",
+    "Setup Notification": "Configurar Notificação",
+    "Light": "Claro",
+    "Dark": "Escuro",
+    "Auto": "Auto",
+    "Theme - Heartbeat Bar": "Tema - Barra de Heartbeat",
+    "Normal": "Normal",
+    "Bottom": "Inferior",
+    "None": "Nenhum",
+    "Timezone": "Fuso horário",
+    "Search Engine Visibility": "Visibilidade do mecanismo de pesquisa",
+    "Allow indexing": "Permitir Indexação",
+    "Discourage search engines from indexing site": "Desencoraje os motores de busca de indexar o site",
+    "Change Password": "Mudar senha",
+    "Current Password": "Senha atual",
+    "New Password": "Nova Senha",
+    "Repeat New Password": "Repetir Nova Senha",
+    "Update Password": "Atualizar Senha",
+    "Disable Auth": "Desativar Autenticação",
+    "Enable Auth": "Ativar Autenticação",
+    "disableauth.message1": "Você tem certeza que deseja <strong>desativar a autenticação</strong>?",
+    "disableauth.message2": "Isso é para <strong>alguém que tem autenticação de terceiros</strong> na frente do 'UpTime Kuma' como o Cloudflare Access.",
+    "Please use this option carefully!": "Por favor, utilize isso com cautela!",
+    "Logout": "Deslogar",
+    "Leave": "Sair",
+    "I understand, please disable": "Eu entendo, por favor desative",
+    "Confirm": "Confirmar",
+    "Yes": "Sim",
+    "No": "Não",
+    "Username": "Usuário",
+    "Password": "Senha",
+    "Remember me": "Lembre-me",
+    "Login": "Autenticar",
+    "No Monitors, please": "Nenhum monitor, por favor",
+    "add one": "adicionar um",
+    "Notification Type": "Tipo de Notificação",
+    "Email": "Email",
+    "Test": "Testar",
+    "Certificate Info": "Info. do Certificado",
+    "Resolver Server": "Resolver Servidor",
+    "Resource Record Type": "Tipo de registro de aplicação",
+    "Last Result": "Último resultado",
+    "Create your admin account": "Crie sua conta de admin",
+    "Repeat Password": "Repita a senha",
+    "Import Backup": "Importar Backup",
+    "Export Backup": "Exportar Backup",
+    "Export": "Exportar",
+    "Import": "Importar",
+    "respTime": "Tempo de Resp. (ms)",
+    "notAvailableShort": "N/A",
+    "Default enabled": "Padrão habilitado",
+    "Apply on all existing monitors": "Aplicar em todos os monitores existentes",
+    "Create": "Criar",
+    "Clear Data": "Limpar Dados",
+    "Events": "Eventos",
+    "Heartbeats": "Heartbeats",
+    "Auto Get": "Obter Automático",
+    "backupDescription": "Você pode fazer backup de todos os monitores e todas as notificações em um arquivo JSON.",
+    "backupDescription2": "OBS: Os dados do histórico e do evento não estão incluídos.",
+    "backupDescription3": "Dados confidenciais, como tokens de notificação, estão incluídos no arquivo de exportação, mantenha-o com cuidado.",
+    "alertNoFile": "Selecione um arquivo para importar.",
+    "alertWrongFileType": "Selecione um arquivo JSON.",
+    "Clear all statistics": "Limpar todas as estatísticas",
+    "Skip existing": "Pular existente",
+    "Overwrite": "Sobrescrever",
+    "Options": "Opções",
+    "Keep both": "Manter os dois",
+    "Verify Token": "Verificar Token",
+    "Setup 2FA": "Configurar 2FA",
+    "Enable 2FA": "Ativar 2FA",
+    "Disable 2FA": "Desativar 2FA",
+    "2FA Settings": "Configurações do 2FA",
+    "Two Factor Authentication": "Autenticação e Dois Fatores",
+    "Active": "Ativo",
+    "Inactive": "Inativo",
+    "Token": "Token",
+    "Show URI": "Mostrar URI",
+    "Tags": "Tag",
+    "Add New below or Select...": "Adicionar Novo abaixo ou Selecionar…",
+    "Tag with this name already exist.": "Já existe uma etiqueta com este nome.",
+    "Tag with this value already exist.": "Já existe uma etiqueta com este valor.",
+    "color": "cor",
+    "value (optional)": "valor (opcional)",
+    "Gray": "Cinza",
+    "Red": "Vermelho",
+    "Orange": "Laranja",
+    "Green": "Verde",
+    "Blue": "Azul",
+    "Indigo": "Índigo",
+    "Purple": "Roxo",
+    "Pink": "Rosa",
+    "Search...": "Buscar…",
+    "Avg. Ping": "Ping Médio",
+    "Avg. Response": "Resposta Média",
+    "Status Page": "Página de Status",
+    "Status Pages": "Página de Status",
+    "Entry Page": "Página de entrada",
+    "statusPageNothing": "Nada aqui, por favor, adicione um grupo ou monitor.",
+    "No Services": "Nenhum Serviço",
+    "All Systems Operational": "Todos os Serviços Operacionais",
+    "Partially Degraded Service": "Serviço parcialmente degradado",
+    "Degraded Service": "Serviço Degradado",
+    "Add Group": "Adicionar Grupo",
+    "Add a monitor": "Adicionar um monitor",
+    "Edit Status Page": "Editar Página de Status",
+    "Go to Dashboard": "Ir para a dashboard",
+    "apprise": "Apprise (Suporta mais de 50 serviços de notificação)",
+    "Help": "Ajuda",
+    "Select status pages...": "Selecionar status pages…",
+    "Game": "Jogo",
+    "Passive Monitor Type": "Tipo de monitoramento passivo",
+    "Specific Monitor Type": "Especificar tipo de monitoramento",
+    "Monitor": "Monitoramento | Monitoramentos",
+    "needPushEvery": "Você deve chamar esta URL a cada {0} segundos.",
+    "Push URL": "Push URL",
+    "Custom": "Personalizado",
+    "here": "aqui",
+    "Required": "Requerido",
+    "webhookJsonDesc": "{0} é bom para qualquer servidor HTTP moderno, como Express.js",
+    "webhookAdditionalHeadersTitle": "Cabeçalhos Adicionais",
+    "webhookAdditionalHeadersDesc": "Define cabeçalhos adicionais enviados com o webhook.",
+    "Webhook URL": "Webhook URL",
+    "Priority": "Prioridade",
+    "Read more": "Ver mais",
+    "appriseInstalled": "Apprise está instalado.",
+    "appriseNotInstalled": "Apprise não está instalado. {0}",
+    "Headers": "Cabeçalhos",
+    "BodyInvalidFormat": "O corpo da solicitação não é um JSON válido: ",
+    "Monitor History": "Histórico de monitoramento",
+    "clearDataOlderThan": "Mantenha os dados do histórico do monitoramento por {0} dias.",
+    "PasswordsDoNotMatch": "As senhas não coincidem.",
+    "records": "registros",
+    "One record": "Um registro",
+    "Current User": "Usuário atual",
+    "successMessage": "Mensagem de sucesso",
+    "Post URL": "Posto URL",
+    "Application Token": "Token de aplicativo",
+    "Server URL": "URL do servidor",
+    "Body": "Corpo",
+    "PushUrl": "Push URL",
+    "recent": "Recente",
+    "Done": "Feito",
+    "Info": "Informação",
+    "Security": "Segurança",
+    "Steam API Key": "API Key da Steam",
+    "Default": "Padrão",
+    "HTTP Options": "Opções HTTP",
+    "Create Incident": "Criar incidente",
+    "Title": "Título",
+    "Style": "Estilo",
+    "info": "informação",
+    "danger": "perigo",
+    "Please input title and content": "Por favor, inclua título e o conteúdo",
+    "Created": "Criado",
+    "Last Updated": "Última atualização",
+    "Switch to Light Theme": "Mudar para tema claro",
+    "Show Tags": "Mostrar tags",
+    "Hide Tags": "Esconder tags",
+    "Description": "Descrição",
+    "No monitors available.": "Nenhum monitoramento disponível.",
+    "Add one": "Adicionar um",
+    "No Monitors": "Sem monitoramentos",
+    "Services": "Serviços",
+    "Discard": "Descartar",
+    "Cancel": "Cancelar",
+    "Customize": "Customizar",
+    "Custom CSS": "CSS personalizado",
+    "deleteStatusPageMsg": "Tem certeza que deseja apagar essa status page?",
+    "Proxies": "Proxies",
+    "default": "Padrão",
+    "enabled": "Ativado",
+    "setAsDefault": "Definir como padrão",
+    "Primary Base URL": "URL base principal",
+    "Resend Notification if Down X times consecutively": "Reenviar Notificação se OFFLINE X vezes consecutivamente",
+    "pushOptionalParams": "Parâmetros opcionais: {0}",
+    "webhookFormDataDesc": "{multipart} é bom para PHP. O JSON precisará ser analisado com {decodeFunction}",
+    "HeadersInvalidFormat": "Os cabeçalhos da solicitação não são um JSON válidos: ",
+    "steamApiKeyDescription": "Para monitorar um Steam Game Server, você precisa de uma chave Steam Web-API. Você pode registrar sua chave de API aqui: ",
+    "warning": "atenção",
+    "Switch to Dark Theme": "Mudar para tema escuro",
+    "Custom Footer": "Rodapé personalizado",
+    "error": "erro",
+    "critical": "crítico",
+    "dark": "escuro",
+    "statusMaintenance": "Manutenção",
+    "Maintenance": "Manutenção",
+    "resendEveryXTimes": "Reenviar a cada {0} vezes",
+    "resendDisabled": "Reenvio desativado",
+    "Schedule maintenance": "Manutenção agendada",
+    "Affected Monitors": "Monitoramentos afetados",
+    "Start of maintenance": "Iniciar manutenção",
+    "All Status Pages": "Todas as Status Pages",
+    "Method": "Método",
+    "General Monitor Type": "Tipo de monitoramento geral",
+    "markdownSupported": "Sintaxe Markdown suportada",
+    "emojiCheatSheet": "Folha de dicas de emojis: {0}",
+    "topic": "Tema",
+    "topicExplanation": "Tópico MQTT para monitorar",
+    "successMessageExplanation": "Mensagem MQTT que será considerada como sucesso",
+    "Content Type": "Tipo de Conteúdo",
+    "Shrink Database": "Encolher Banco de Dados",
+    "Content": "Conteúdo",
+    "Pick a RR-Type...": "Escolha um tipo RR…",
+    "Pick Accepted Status Codes...": "Escolha Códigos de Status Aceitos…",
+    "Pick Affected Monitors...": "Escolher Monitores Afetados…"
+}
diff --git a/src/lang/pt-PT.json b/src/lang/pt-PT.json
new file mode 100644
index 000000000..3fd370b9c
--- /dev/null
+++ b/src/lang/pt-PT.json
@@ -0,0 +1,443 @@
+{
+    "languageName": "Português (Portugal)",
+    "checkEverySecond": "Verificar a cada {0} segundos",
+    "retryCheckEverySecond": "Tentar novamente a cada {0} segundos",
+    "retriesDescription": "Máximo de tentativas antes que o serviço seja marcado como inativo e uma notificação seja enviada",
+    "ignoreTLSError": "Ignorar erros TLS/SSL para sites HTTPS",
+    "upsideDownModeDescription": "Inverte o status de cabeça para baixo. Se o serviço estiver acessível, ele está OFFLINE.",
+    "maxRedirectDescription": "Número máximo de redirecionamentos a seguir. Define como 0 para desativar redirecionamentos.",
+    "acceptedStatusCodesDescription": "Seleciona os códigos de status que são considerados uma resposta bem-sucedida.",
+    "passwordNotMatchMsg": "A senha repetida não corresponde.",
+    "notificationDescription": "Atribuir uma notificação ao (s) monitor (es) para que funcione.",
+    "keywordDescription": "Pesquisa a palavra-chave em HTML simples ou resposta JSON e diferencia maiúsculas de minúsculas",
+    "pauseDashboardHome": "Pausa",
+    "deleteMonitorMsg": "Tens a certeza de que queres excluir este monitor?",
+    "deleteNotificationMsg": "Tens a certeza de que queres excluir esta notificação para todos os monitores?",
+    "resolverserverDescription": "A Cloudflare é o servidor padrão, podes alterar o servidor 'resolvedor' a qualquer momento.",
+    "rrtypeDescription": "Seleciona o RR-Type que queres monitorizar",
+    "pauseMonitorMsg": "Tens a certeza que queres fazer uma pausa?",
+    "enableDefaultNotificationDescription": "Para cada monitor novo esta notificação vai estar activa por padrão. Podes também desativar a notificação separadamente para cada monitor.",
+    "clearEventsMsg": "Tens a certeza que queres excluir todos os eventos deste monitor?",
+    "clearHeartbeatsMsg": "Tens a certeza de que queres excluir todos os heartbeats deste monitor?",
+    "confirmClearStatisticsMsg": "Tens a certeza que queres excluir TODAS as estatísticas?",
+    "importHandleDescription": "Escolhe 'Ignorar existente' se quiseres ignorar todos os monitores ou notificações com o mesmo nome. 'Substituir' excluirá todos os monitores e notificações existentes.",
+    "confirmImportMsg": "Tens a certeza que queres importar o backup? Certifica-te que selecionaste a opção de importação correta.",
+    "twoFAVerifyLabel": "Insire o teu token para verificares se o 2FA está a funcionar",
+    "tokenValidSettingsMsg": "O token é válido! Agora podes salvar as configurações do 2FA.",
+    "confirmEnableTwoFAMsg": "Tens a certeza de que queres habilitar 2FA?",
+    "confirmDisableTwoFAMsg": "Tens a certeza de que queres desativar 2FA?",
+    "Settings": "Configurações",
+    "Dashboard": "Dashboard",
+    "New Update": "Nova Atualização",
+    "Language": "Linguagem",
+    "Appearance": "Aparência",
+    "Theme": "Tema",
+    "General": "Geral",
+    "Version": "Versão",
+    "Check Update On GitHub": "Verificar atualização no Github",
+    "List": "Lista",
+    "Add": "Adicionar",
+    "Add New Monitor": "Adicionar novo monitor",
+    "Quick Stats": "Estatísticas rápidas",
+    "Up": "On",
+    "Down": "Off",
+    "Pending": "Pendente",
+    "Unknown": "Desconhecido",
+    "Pause": "Pausa",
+    "Name": "Nome",
+    "Status": "Status",
+    "DateTime": "Data hora",
+    "Message": "Mensagem",
+    "No important events": "Nenhum evento importante",
+    "Resume": "Resumo",
+    "Edit": "Editar",
+    "Delete": "Apagar",
+    "Current": "Atual",
+    "Uptime": "Tempo de atividade",
+    "Cert Exp.": "Cert Exp.",
+    "day": "dia | dias",
+    "-day": "-dia",
+    "hour": "hora",
+    "-hour": "-hora",
+    "Response": "Resposta",
+    "Ping": "Ping",
+    "Monitor Type": "Tipo de Monitor",
+    "Keyword": "Palavra-Chave",
+    "Friendly Name": "Nome Amigável",
+    "URL": "URL",
+    "Hostname": "Hostname",
+    "Port": "Porta",
+    "Heartbeat Interval": "Intervalo de Heartbeats",
+    "Retries": "Novas tentativas",
+    "Heartbeat Retry Interval": "Intervalo de repetição de Heartbeats",
+    "Advanced": "Avançado",
+    "Upside Down Mode": "Modo de cabeça para baixo",
+    "Max. Redirects": "Max. Redirecionamentos",
+    "Accepted Status Codes": "Status Code Aceitáveis",
+    "Save": "Guardar",
+    "Notifications": "Notificações",
+    "Not available, please setup.": "Não disponível, por favor configura.",
+    "Setup Notification": "Configurar Notificação",
+    "Light": "Claro",
+    "Dark": "Escuro",
+    "Auto": "Auto",
+    "Theme - Heartbeat Bar": "Tema - Barra de Heartbeat",
+    "Normal": "Normal",
+    "Bottom": "Inferior",
+    "None": "Nenhum",
+    "Timezone": "Fuso horário",
+    "Search Engine Visibility": "Visibilidade do mecanismo de pesquisa",
+    "Allow indexing": "Permitir Indexação",
+    "Discourage search engines from indexing site": "Desencorajar que motores de busca indexem o site",
+    "Change Password": "Mudar senha",
+    "Current Password": "Senha atual",
+    "New Password": "Nova Senha",
+    "Repeat New Password": "Repetir Nova Senha",
+    "Update Password": "Atualizar Senha",
+    "Disable Auth": "Desativar Autenticação",
+    "Enable Auth": "Ativar Autenticação",
+    "disableauth.message1": "Tens a certeza que queres <strong>desativar a autenticação</strong>?",
+    "disableauth.message2": "Isso é para <strong>alguém que tem autenticação de terceiros</strong> em frente ao 'UpTime Kuma' como o Cloudflare Access.",
+    "Please use this option carefully!": "Por favor, utiliza esta opção com cuidado.",
+    "Logout": "Logout",
+    "Leave": "Sair",
+    "I understand, please disable": "Eu entendo, por favor desativa.",
+    "Confirm": "Confirmar",
+    "Yes": "Sim",
+    "No": "Não",
+    "Username": "Utilizador",
+    "Password": "Senha",
+    "Remember me": "Lembra-me",
+    "Login": "Autenticar",
+    "No Monitors, please": "Nenhum monitor, por favor",
+    "add one": "adicionar um",
+    "Notification Type": "Tipo de Notificação",
+    "Email": "Email",
+    "Test": "Testar",
+    "Certificate Info": "Info. do Certificado ",
+    "Resolver Server": "Resolver Servidor",
+    "Resource Record Type": "Tipo de registro de aplicação",
+    "Last Result": "Último resultado",
+    "Create your admin account": "Cria a tua conta de admin",
+    "Repeat Password": "Repete a senha",
+    "Import Backup": "Importar Backup",
+    "Export Backup": "Exportar Backup",
+    "Export": "Exportar",
+    "Import": "Importar",
+    "respTime": "Tempo de Resp. (ms)",
+    "notAvailableShort": "N/A",
+    "Default enabled": "Padrão habilitado",
+    "Apply on all existing monitors": "Aplicar em todos os monitores existentes",
+    "Create": "Criar",
+    "Clear Data": "Limpar Dados",
+    "Events": "Eventos",
+    "Heartbeats": "Pings",
+    "Auto Get": "Obter Automático",
+    "backupDescription": "Podes fazer backup de todos os monitores e todas as notificações num arquivo JSON.",
+    "backupDescription2": "OBS: Os dados do histórico e do evento não estão incluídos.",
+    "backupDescription3": "Dados confidenciais, como tokens de notificação, estão incluídos no arquivo de exportação, mantem-no com cuidado.",
+    "alertNoFile": "Seleciona um arquivo para importar.",
+    "alertWrongFileType": "Seleciona um arquivo JSON.",
+    "Clear all statistics": "Limpar todas as estatísticas",
+    "Skip existing": "Saltar existente",
+    "Overwrite": "Sobrescrever",
+    "Options": "Opções",
+    "Keep both": "Manter os dois",
+    "Verify Token": "Verificar Token",
+    "Setup 2FA": "Configurar 2FA",
+    "Enable 2FA": "Ativar 2FA",
+    "Disable 2FA": "Desativar 2FA",
+    "2FA Settings": "Configurações do 2FA",
+    "Two Factor Authentication": "Autenticação de Dois Fatores",
+    "Active": "Ativo",
+    "Inactive": "Inativo",
+    "Token": "Token",
+    "Show URI": "Mostrar URI",
+    "Tags": "Tag",
+    "Add New below or Select...": "Adicionar Novo abaixo ou Selecionar…",
+    "Tag with this name already exist.": "Já existe uma etiqueta com este nome.",
+    "Tag with this value already exist.": "Já existe uma etiqueta com este valor.",
+    "color": "cor",
+    "value (optional)": "valor (opcional)",
+    "Gray": "Cinza",
+    "Red": "Vermelho",
+    "Orange": "Laranja",
+    "Green": "Verde",
+    "Blue": "Azul",
+    "Indigo": "Índigo",
+    "Purple": "Roxo",
+    "Pink": "Rosa",
+    "Search...": "Pesquisa…",
+    "Avg. Ping": "Ping Médio",
+    "Avg. Response": "Resposta Média",
+    "Status Page": "Página de Status",
+    "Status Pages": "Página de Status",
+    "Entry Page": "Página de entrada",
+    "statusPageNothing": "Nada aqui, por favor, adiciona um grupo ou monitor.",
+    "No Services": "Nenhum Serviço",
+    "All Systems Operational": "Todos os Serviços Operacionais",
+    "Partially Degraded Service": "Serviço parcialmente degradados",
+    "Degraded Service": "Serviço Degradado",
+    "Add Group": "Adicionar Grupo",
+    "Add a monitor": "Adicionar um monitor",
+    "Edit Status Page": "Editar Página de Status",
+    "Go to Dashboard": "Ir para o dashboard",
+    "backupOutdatedWarning": "Depreciado: Uma vez que muitas funcionalidades foram adicionadas e esta funcionalidade de backup é um pouco desmanchada, não pode gerar ou restaurar um backup completo.",
+    "Schedule maintenance": "Agendar manutenção",
+    "Affected Monitors": "Monitores Afetados",
+    "Pick Affected Monitors...": "Escolher Monitores Afetados…",
+    "All Status Pages": "Todas as Páginas de Status",
+    "Select status pages...": "Selecionar Páginas de Status…",
+    "defaultNotificationName": "Meu alerta de {notification} ({number})",
+    "here": "aqui",
+    "Required": "Obrigatório",
+    "Post URL": "Post URL",
+    "Content Type": "Tipo de Conteúdo",
+    "webhookFormDataDesc": "{multipart} é bom para PHP. O JSON precisará ser analisado com {decodeFunction}",
+    "webhookAdditionalHeadersTitle": "Headers Adicionais",
+    "Webhook URL": "URL do Webhook",
+    "Application Token": "Token do Aplicativo",
+    "Server URL": "URL do Servidor",
+    "Priority": "Prioridade",
+    "emojiCheatSheet": "Folha de dicas de emojis: {0}",
+    "Read more": "Ler Mais",
+    "Method": "Método",
+    "Body": "Body",
+    "Headers": "Headers",
+    "PushUrl": "Enviar URL",
+    "HeadersInvalidFormat": "Os headers da solicitação não são JSON válidos: ",
+    "BodyInvalidFormat": "O body da solicitação não é um JSON válido: ",
+    "Monitor History": "Histórico do Monitor",
+    "clearDataOlderThan": "Mantenha os dados do histórico do monitor por {0} dias.",
+    "PasswordsDoNotMatch": "As passwords não coincidem.",
+    "records": "registros",
+    "One record": "Um registro",
+    "steamApiKeyDescription": "Para monitorar um Steam Game Server, você precisa de uma chave Steam Web-API. Pode registrar a chave da API aqui: ",
+    "Current User": "Usuário Atual",
+    "topicExplanation": "Tópico MQTT para monitorar",
+    "successMessage": "Mensagem de Sucesso",
+    "recent": "Recente",
+    "Done": "Feito",
+    "Info": "Informações",
+    "Security": "Segurança",
+    "Steam API Key": "Steam API Key",
+    "Shrink Database": "Encolher Base de Dados",
+    "Pick a RR-Type...": "Escolha um tipo RR…",
+    "Pick Accepted Status Codes...": "Escolha Códigos de Status Aceitos…",
+    "HTTP Options": "Opções HTTP",
+    "Create Incident": "Criar Incidente",
+    "Content": "Conteúdo",
+    "Style": "Estilo",
+    "info": "informações",
+    "warning": "aviso",
+    "danger": "perigo",
+    "critical": "crítico",
+    "primary": "primário",
+    "light": "luz",
+    "dark": "escuro",
+    "Post": "Post",
+    "Created": "Criado",
+    "Last Updated": "Ultima Atualização",
+    "Unpin": "Desmarcar",
+    "Switch to Light Theme": "Alterar para Tema Claro",
+    "Switch to Dark Theme": "Alterar para Tema Escuro",
+    "Show Tags": "Mostrar Tags",
+    "appriseInstalled": "Apprise está instalado.",
+    "appriseNotInstalled": "Apprise não está instalado. {0}",
+    "No monitors available.": "Nenhum monitor disponível.",
+    "Add one": "Adicione um",
+    "No Monitors": "Sem Monitores",
+    "Untitled Group": "Grupo sem Título",
+    "Services": "Serviços",
+    "Discard": "Descartar",
+    "Cancel": "Cancelar",
+    "Powered by": "Powered by",
+    "Customize": "Customizar",
+    "Custom CSS": "CSS Customizado",
+    "Custom Footer": "Footer Customizado",
+    "deleteStatusPageMsg": "Tem certeza de que deseja excluir esta página de status?",
+    "Proxies": "Proxies",
+    "default": "Padrão",
+    "enabled": "Ativar",
+    "setAsDefault": "Definir como Padrão",
+    "deleteProxyMsg": "Tem a certeza que quer excluir este proxy para todos os monitores?",
+    "setAsDefaultProxyDescription": "Este proxy será ativado por padrão para novos monitores. Você ainda pode desabilitar o proxy separadamente para cada monitor.",
+    "Valid": "Válido",
+    "Invalid": "Inválido",
+    "Remove Token": "Remover Token",
+    "Running": "Em Execução",
+    "Not running": "Não está em execução",
+    "Start": "Iniciar",
+    "Stop": "Parar",
+    "Add New Status Page": "Adicionar Nova Página de Status",
+    "Next": "Próximo",
+    "No consecutive dashes": "Sem traços consecutivos",
+    "Slug": "URL",
+    "Accept characters:": "Caracteres aceites:",
+    "startOrEndWithOnly": "Iniciar ou terminar apenas com {0}",
+    "The slug is already taken. Please choose another slug.": "URL já existe. Por favor escolha outro URL.",
+    "No Proxy": "Sem Proxy",
+    "Authentication": "Autenticação",
+    "HTTP Basic Auth": "Autenticação Básica HTTP",
+    "New Status Page": "Nova Página de Status",
+    "Page Not Found": "Página Não Encontrada",
+    "Reverse Proxy": "Proxy Reverso",
+    "Backup": "Backup",
+    "About": "Sobre",
+    "wayToGetCloudflaredURL": "(Download cloudflared de {0})",
+    "cloudflareWebsite": "Site da Cloudflare",
+    "Message:": "Mensagem:",
+    "HTTP Headers": "Headers HTTP",
+    "Trust Proxy": "Proxy de Confiança",
+    "Other Software": "Outro Software",
+    "For example: nginx, Apache and Traefik.": "Por exemplo: nginx, Apache e Traefik.",
+    "Please read": "Por favor leia",
+    "Subject:": "Assunto:",
+    "Valid To:": "Valido para:",
+    "Days Remaining:": "Dias Restantes:",
+    "Issuer:": "Emissor:",
+    "Fingerprint:": "Impressão Digital:",
+    "No status pages": "Nenhuma página de status",
+    "Domain Name Expiry Notification": "Notificação de Expiração de Nome de Domínio",
+    "Proxy": "Proxy",
+    "Date Created": "Data da Criação",
+    "Footer Text": "Texto do Footer",
+    "Show Powered By": "Mostrar Powered By",
+    "Domain Names": "Nomes de Domínio",
+    "signedInDisp": "Conectado como {0}",
+    "signedInDispDisabled": "Autenticação Desativada.",
+    "RadiusSecret": "Radius Secret",
+    "RadiusSecretDescription": "Secret compartilhado entre cliente e servidor",
+    "RadiusCallingStationIdDescription": "Identificador do dispositivo de chamada",
+    "Certificate Expiry Notification": "Notificação de Expiração do Certificado",
+    "API Username": "Nome de utilizador da API",
+    "API Key": "Chave API",
+    "Using a Reverse Proxy?": "Utilizando um Proxy Reverso?",
+    "Check how to config it for WebSocket": "Verifique como configurá-lo para WebSocket",
+    "Steam Game Server": "Steam Game Server",
+    "Most likely causes:": "Causas mais prováveis:",
+    "The resource is no longer available.": "O recurso já não está disponível.",
+    "There might be a typing error in the address.": "Pode haver um erro de digitação no endereço.",
+    "What you can try:": "O que pode tentar:",
+    "Retype the address.": "Volte a escrever o endereço.",
+    "Go back to the previous page.": "Voltar à página anterior.",
+    "Coming Soon": "Em Breve",
+    "Connection String": "Linha de Conexão",
+    "Query": "Query",
+    "settingsCertificateExpiry": "Validade do Certificado TLS",
+    "certificationExpiryDescription": "Os monitores HTTPS ativam a notificação quando o certificado TLS expira:",
+    "Setup Docker Host": "Configuração do Docker Host",
+    "Connection Type": "Tipo de conexão",
+    "Docker Daemon": "Docker Daemon",
+    "deleteDockerHostMsg": "Tem a certeza de querer apagar este docker host para todos os monitores?",
+    "socket": "Socket",
+    "tcp": "TCP / HTTP",
+    "Docker Host": "Docker Host",
+    "Docker Hosts": "Docker Hosts",
+    "Domain": "Domínio",
+    "Workstation": "Estação de trabalho",
+    "Packet Size": "Tamanho do pacote",
+    "ZohoCliq": "ZohoCliq",
+    "Bot Token": "Token do Bot",
+    "wayToGetTelegramToken": "Pode obter o token a partir de {0}.",
+    "Chat ID": "ID do Chat",
+    "wayToGetTelegramChatID": "Pode obter o seu ID de chat enviando uma mensagem para o bot e indo a este URL para ver o chat_id:",
+    "YOUR BOT TOKEN HERE": "O TOKEN DO BOT AQUI",
+    "disableCloudflaredNoAuthMsg": "Está no modo Sem Autenticação, não é necessária uma palavra-passe.",
+    "Examples": "Exemplos",
+    "Long-Lived Access Token": "Token de Acesso de Longa Duração",
+    "wayToGetLineNotifyToken": "Pode obter o código de acesso a partir de {0}",
+    "Notification Service": "Serviço de Notificação",
+    "A list of Notification Services can be found in Home Assistant under \"Developer Tools > Services\" search for \"notification\" to find your device/phone name.": "Uma lista de Serviços de Notificação pode ser encontrada em Home Assistant em \"Developer Tools > Services\" pesquisa por \"notificação\" para encontrar o seu dispositivo/nome do telefone.",
+    "Home Assistant URL": "URL do Home Assistant",
+    "Event type:": "Tipo de evento:",
+    "Event data:": "Dados do evento:",
+    "Then choose an action, for example switch the scene to where an RGB light is red.": "Depois de escolher uma ação, por exemplo mudar a cena para onde uma luz RGB é vermelha.",
+    "Frontend Version": "Versão Frontend",
+    "Frontend Version do not match backend version!": "Versão Frontend não corresponde à versão backend!",
+    "backupRecommend": "Por favor, faça o backup do volume ou da pasta de dados (./data/) diretamente.",
+    "Optional": "Opcional",
+    "squadcast": "Squadcast",
+    "recurringInterval": "Intervalo",
+    "Recurring": "Recurrente",
+    "strategyManual": "Ativar/Desativar Manualmente",
+    "warningTimezone": "Está a utilizar o fuso horário do servidor",
+    "weekdayShortMon": "Segunda",
+    "weekdayShortTue": "Terça",
+    "weekdayShortWed": "Quarta",
+    "weekdayShortThu": "Quinta",
+    "weekdayShortFri": "Sexta",
+    "weekdayShortSat": "Sábado",
+    "weekdayShortSun": "Domingo",
+    "dayOfWeek": "Dia da Semana",
+    "dayOfMonth": "Dia do Mês",
+    "lastDay": "Último Dia",
+    "lastDay2": "2º Último Dia do Mês",
+    "lastDay3": "3º Último Dia do Mês",
+    "lastDay4": "4º Último Dia do Mês",
+    "No Maintenance": "Nenhuma Manutenção",
+    "maintenanceStatus-under-maintenance": "Em Manutenção",
+    "maintenanceStatus-inactive": "Inativo",
+    "maintenanceStatus-scheduled": "Agendado",
+    "maintenanceStatus-ended": "Terminado",
+    "Display Timezone": "Mostrar Fuso horário",
+    "Server Timezone": "Fuso horário do Servidor",
+    "statusPageMaintenanceEndDate": "Acabou",
+    "Maintenance": "Manutenção",
+    "Specific Monitor Type": "Tipo de Monitor Específico",
+    "Resend Notification if Down X times consequently": "Reenviar notificação se Off X vezes consequentemente",
+    "resendEveryXTimes": "Reenviar a cada {0} vezes",
+    "resendDisabled": "Reenviar desativado",
+    "Push URL": "Enviar URL",
+    "webhook": "Webhook",
+    "topic": "Tema",
+    "RadiusCalledStationIdDescription": "Identificador do dispositivo chamado",
+    "Automations can optionally be triggered in Home Assistant:": "As automatizações podem opcionalmente ser ativadas em Home Assistant:",
+    "or": "ou",
+    "markdownSupported": "Sintaxe de redução suportada",
+    "Start of maintenance": "Início da manutenção",
+    "webhookJsonDesc": "{0} é bom para qualquer servidor HTTP moderno, como Express.js",
+    "webhookAdditionalHeadersDesc": "Define headers adicionais enviados com o webhook.",
+    "successMessageExplanation": "Mensagem MQTT que será considerada como sucesso",
+    "error": "erro",
+    "Please input title and content": "Por favor insira o título e o conteúdo",
+    "Hide Tags": "Ocultar Tags",
+    "Description": "Descrição",
+    "shrinkDatabaseDescription": "Acionar banco de dados VACUUM para SQLite. Se seu banco de dados for criado após 1.10.0, AUTO_VACUUM já está ativado e esta ação não é necessária.",
+    "proxyDescription": "Os proxies devem ser atribuídos a um monitor para funcionar.",
+    "enableProxyDescription": "Este proxy não afetará as solicitações do monitor até que seja ativado. Você pode controlar temporariamente a desativação do proxy de todos os monitores pelo status de ativação.",
+    "Don't know how to get the token? Please read the guide:": "Não sabe como obter o token? Por favor, leia o guia:",
+    "The current connection may be lost if you are currently connecting via Cloudflare Tunnel. Are you sure want to stop it? Type your current password to confirm it.": "A conexão atual pode ser perdida se estiver conectando via Cloudflare Tunnel. Tem certeza de que deseja pará-lo? Digite sua senha atual para confirmar.",
+    "Docker Container": "Contentor Docker",
+    "Container Name / ID": "Nome / ID do Contentor",
+    "supportTelegramChatID": "Chat de Apoio Direto / Grupo / ID do Chat do Canal",
+    "chatIDNotFound": "O ID do Chat não é encontrado; por favor envie uma mensagem a este bot primeiro",
+    "trustProxyDescription": "Confiar nos headers 'X-Forwarded-*'. Se quiser obter o IP correto do cliente e o seu Uptime Kuma está por detrás de um proxy como o Nginx ou Apache, deve activá-lo.",
+    "Long-Lived Access Token can be created by clicking on your profile name (bottom left) and scrolling to the bottom then click Create Token. ": "O Token de Acesso de Longa Duração pode ser criado clicando no nome do seu perfil (em baixo à esquerda) e descendo para o fundo da pagina e depois clicando em Criar Token. ",
+    "lastDay1": "Último Dia do Mês",
+    "pauseMaintenanceMsg": "Quer mesmo colocar em pausa?",
+    "maintenanceStatus-unknown": "Desconhecido",
+    "needPushEvery": "Deve chamar este URL a cada {0} segundos.",
+    "pushOptionalParams": "Parâmetros opcionais: {0}",
+    "Title": "Título",
+    "User": "Utilizador",
+    "Installed": "Instalado",
+    "Not installed": "Não instalado",
+    "RadiusCalledStationId": "Id da estação chamada",
+    "RadiusCallingStationId": "Id da estação de chamada",
+    "default: notify all devices": "padrão: notificar todos os dispositivos",
+    "Trigger type:": "Tipo de gatilho:",
+    "telegram": "Telegram",
+    "Help": "Ajuda",
+    "Game": "Jogo",
+    "Monitor": "Monitor | Monitores",
+    "Default": "Padrão",
+    "Certificate Chain": "Certificate Chain",
+    "Show update if available": "Mostrar atualização se disponível",
+    "Also check beta release": "Verifique também a versão beta",
+    "Primary Base URL": "URL Base Principal",
+    "statusMaintenance": "Manutenção",
+    "Passive Monitor Type": "Tipo de Monitor Passivo",
+    "Custom": "Personalizar",
+    "General Monitor Type": "Tipo de Monitor Geral"
+}
diff --git a/src/lang/ro.json b/src/lang/ro.json
new file mode 100644
index 000000000..066d1ed5c
--- /dev/null
+++ b/src/lang/ro.json
@@ -0,0 +1,563 @@
+{
+    "languageName": "Română",
+    "Dashboard": "Panou de Control",
+    "Help": "Ajutor",
+    "Appearance": "Aspect",
+    "Theme": "Temă",
+    "General": "General",
+    "Version": "Versiune",
+    "Check Update On GitHub": "Verifică Actualitatea pe GitHub",
+    "Quick Stats": "Statistici Rapide",
+    "Up": "Sus",
+    "Down": "Jos",
+    "statusMaintenance": "Mentenanță",
+    "Maintenance": "Mentenanță",
+    "General Monitor Type": "Monitor de Tip General",
+    "Passive Monitor Type": "Monitor de Tip Pasiv",
+    "markdownSupported": "Limbaj Markdown Acceptat",
+    "Pause": "Pauză",
+    "Name": "Nume",
+    "Status": "Status",
+    "DateTime": "DatăOră",
+    "Message": "Mesaj",
+    "No important events": "Niciun eveniment important",
+    "Resume": "Reia",
+    "Delete": "Șterge",
+    "Uptime": "Timpul de funcționare",
+    "Cert Exp.": "Expirarea Certificatului",
+    "Monitor": "Monitor | Monitoare",
+    "day": "zi | zile",
+    "-day": "-zi",
+    "hour": "oră",
+    "Edit": "Modifică",
+    "Ping": "Ping",
+    "Monitor Type": "Tipul Monitorului",
+    "Keyword": "Cuvânt Cheie",
+    "Friendly Name": "Nume Ușor de Recunoscut",
+    "URL": "URL",
+    "Hostname": "Hostname",
+    "Port": "Port",
+    "Retries": "Reîncercări",
+    "Heartbeat Retry Interval": "Intervalul Reîncercării Heartbeat-ului",
+    "Advanced": "Avansat",
+    "checkEverySecond": "Verifică la fiecare {0} secunde",
+    "retryCheckEverySecond": "Reîncearcă la fiecare {0} secunde",
+    "resendEveryXTimes": "Retrimite de {0} ori",
+    "resendDisabled": "Retrimiterea dezactivată",
+    "ignoreTLSError": "Ignoră erorile TLS/SSL pentru site-urile HTTPS",
+    "upsideDownModeDescription": "Întoarce statusul cu susul în jos. Dacă serviciul este contactabil, este OFFLINE.",
+    "Upside Down Mode": "Modul cu Susul in Jos",
+    "Max. Redirects": "Nr. Max. de Redirecționări",
+    "Accepted Status Codes": "Coduri de Status Acceptate",
+    "Push URL": "Împinge URL",
+    "needPushEvery": "Acest URL trebuie să fie contactat la fiecare {0} secunde.",
+    "pushOptionalParams": "Parametrii opționali: {0}",
+    "Save": "Salvează",
+    "Notifications": "Notificări",
+    "Not available, please setup.": "Indisponibil, trebuie configurat.",
+    "Setup Notification": "Configurare Notificări",
+    "Light": "Luminos",
+    "Dark": "Întunecat",
+    "Auto": "Automat",
+    "Normal": "Normal",
+    "Bottom": "Fund",
+    "None": "Nimic",
+    "Timezone": "Fus Orar",
+    "Search Engine Visibility": "Vizibilitate în Motoarele de Căutare",
+    "Allow indexing": "Permite Indexarea",
+    "Change Password": "Schimbă Parola",
+    "Current Password": "Parola Curentă",
+    "New Password": "Parolă Nouă",
+    "Repeat New Password": "Repetă Parola Nouă",
+    "Update Password": "Actualizează Parola",
+    "Disable Auth": "Dezactivează Autentificarea",
+    "Enable Auth": "Activează Autentificarea",
+    "disableauth.message1": "Ești sigur că vrei să <strong>dezactivezi autentificarea</strong>?",
+    "Please use this option carefully!": "Utilizează Această Opțiune cu Grijă!",
+    "Logout": "Delogare",
+    "Leave": "Părăsește",
+    "I understand, please disable": "Am luat la cunoștință, dezactivează",
+    "Confirm": "Confirmă",
+    "Yes": "Da",
+    "No": "Nu",
+    "Username": "Nume de Utilizator",
+    "Password": "Parolă",
+    "Remember me": "Ține-mă Minte",
+    "No Monitors, please": "Niciun monitor, te rog",
+    "add one": "adaugă unul",
+    "Resource Record Type": "Tipul de Înregistrare a Resurselor",
+    "Create your admin account": "Crează un Cont de Administrator",
+    "Repeat Password": "Repetă Parola",
+    "Import Backup": "Importează Backup-ul",
+    "Export Backup": "Exporta Backup-ul",
+    "Export": "Exportează",
+    "Import": "Importă",
+    "respTime": "Timp de Răspuns (ms)",
+    "Apply on all existing monitors": "Aplică pentru toate monitoarele existente",
+    "Clear Data": "Șterge Datele",
+    "Events": "Evenimente",
+    "Heartbeats": "Heartbeat-uri",
+    "Auto Get": "Obține Automat",
+    "Affected Monitors": "Monitoare Afectate",
+    "Pick Affected Monitors...": "Alege Monitoarele Afectate…",
+    "Start of maintenance": "Începerea Mentenanței",
+    "All Status Pages": "Toate Paginile de Status",
+    "Skip existing": "Sari Existente",
+    "Overwrite": "Suprascrie",
+    "Options": "Opțiuni",
+    "Keep both": "Păstrează Ambele",
+    "Verify Token": "Verifică Token-ul",
+    "Enable 2FA": "Activează Autentificarea în Doi Pași",
+    "Disable 2FA": "Dezactivează Autentificarea în Doi Pași",
+    "2FA Settings": "Setări Autentificare în Doi Pași",
+    "Active": "Activ",
+    "Token": "Token",
+    "Show URI": "Arată URI",
+    "Tags": "Etichete",
+    "Tag with this name already exist.": "Deja Există o Etichetă cu Acest Nume.",
+    "Tag with this value already exist.": "Deja Există o Etichetă cu Această Valoare.",
+    "color": "Culoare",
+    "value (optional)": "valoare (opțional)",
+    "Gray": "Gri",
+    "Red": "Roșu",
+    "Orange": "Portocaliu",
+    "Green": "Verde",
+    "Blue": "Albastru",
+    "Indigo": "Indigo",
+    "Purple": "Violet",
+    "Custom": "Personalizat",
+    "Entry Page": "Pagina de Implicită",
+    "No Services": "Niciun Serviciu",
+    "All Systems Operational": "Toate Sistemele Operaționale",
+    "Partially Degraded Service": "Servicii Parțial Degradate",
+    "Degraded Service": "Servicii Degradate",
+    "Add Group": "Adaugă Grup",
+    "Add a monitor": "Adaugă Monitor",
+    "Edit Status Page": "Modifică Pagina de Status",
+    "Status Page": "Pagina de Status",
+    "Status Pages": "Pagini de Status",
+    "defaultNotificationName": "A mea {notification} Alertă ({number})",
+    "here": "aici",
+    "Required": "Necesar",
+    "webhook": "Webhook",
+    "Post URL": "Postează URL",
+    "Content Type": "Tipul Conținutului",
+    "webhookFormDataDesc": "{multipart} este bun pentru PHP. JSON-ul va fi analizat cu {decodeFunction}",
+    "webhookAdditionalHeadersTitle": "Antete adiționale",
+    "Webhook URL": "URL-ul Webhook-ului",
+    "Application Token": "Token-ul Aplicației",
+    "Server URL": "URL-ul Server-ului",
+    "Priority": "Prioritate",
+    "emojiCheatSheet": "Emoji-uri: {0}",
+    "Read more": "Vezi Mai Mult",
+    "appriseInstalled": "Apprise instalat.",
+    "appriseNotInstalled": "Apprise Neinstalat. {0}",
+    "Method": "Metodă",
+    "Body": "Corp",
+    "Headers": "Antete",
+    "PushUrl": "Împinge URL",
+    "BodyInvalidFormat": "Formatul corpului de request nu este valid: ",
+    "Monitor History": "Istoricul Monitorului",
+    "PasswordsDoNotMatch": "Parolele nu sunt la fel.",
+    "One record": "O înregistrare",
+    "Current User": "Utilizatorul Curent",
+    "topic": "Subiect",
+    "topicExplanation": "Subiectul MQTT către monitor",
+    "successMessage": "Mesaj de Succes",
+    "successMessageExplanation": "Mesajul MQTT care va fi considerat un succes",
+    "Done": "Terminat",
+    "Info": "Informații",
+    "Security": "Securitate",
+    "Shrink Database": "Miceste Baza de Date",
+    "Default": "Implicit",
+    "HTTP Options": "Opțiuni HTTP",
+    "Title": "Titlu",
+    "Content": "Conținut",
+    "Style": "Stil",
+    "info": "informații",
+    "warning": "avertizare",
+    "danger": "pericol",
+    "error": "eroare",
+    "critical": "critic",
+    "dark": "întunecat",
+    "Post": "Postează",
+    "Last Updated": "Actualizat",
+    "Unpin": "Desprinde",
+    "Switch to Light Theme": "Schimbă la Tema Luminoasă",
+    "Show Tags": "Arată Etichetele",
+    "Hide Tags": "Ascunde Etichetele",
+    "Description": "Descriere",
+    "No monitors available.": "Niciun monitor disponibil.",
+    "Discard": "Elimină",
+    "Cancel": "Anulează",
+    "Powered by": "Cu ajutorul",
+    "Customize": "Personalizează",
+    "Custom Footer": "Subsol Personalizat",
+    "Custom CSS": "CSS Personalizat",
+    "deleteStatusPageMsg": "Ești sigur că vrei să ștergi această pagină de status?",
+    "Proxies": "Proxy-uri",
+    "default": "Implicit",
+    "enabled": "Activat",
+    "setAsDefault": "Setează ca Implicit",
+    "deleteProxyMsg": "Ești sigur că vrei să ștergi acest proxy pentru toate monitoarele?",
+    "Certificate Chain": "Lanț-ul Certificatului",
+    "Valid": "Valid",
+    "Invalid": "Invalid",
+    "User": "Utilizator",
+    "Installed": "Instalat",
+    "Running": "Operează",
+    "Not running": "Nu operează",
+    "Remove Token": "Elimină token-ul",
+    "Start": "Start",
+    "Stop": "Stop",
+    "Add New Status Page": "Adaugă o Pagină de Status Nouă",
+    "Slug": "Slug",
+    "startOrEndWithOnly": "Începe sau termină doar cu {0}",
+    "No consecutive dashes": "Fără cratime consecutive",
+    "Next": "Înainte",
+    "No Proxy": "Niciun Proxy",
+    "Authentication": "Autentificate",
+    "HTTP Basic Auth": "HTTP Basic Auth",
+    "New Status Page": "Pagină de Status Nouă",
+    "Page Not Found": "Pagină Negăsită",
+    "Backup": "Backup",
+    "About": "Despre",
+    "wayToGetCloudflaredURL": "(Cloudflared a fost descărcat de la {0})",
+    "cloudflareWebsite": "Website-ul Cloudflare",
+    "Message:": "Mesaj:",
+    "HTTP Headers": "Antete HTTP",
+    "Trust Proxy": "Ai încredere în Proxy",
+    "Other Software": "Alt Software",
+    "For example: nginx, Apache and Traefik.": "De exemplu: nginx, Apache și Traefik.",
+    "Please read": "Te rog citește",
+    "Subject:": "Subiect:",
+    "Valid To:": "Valid Pâna la:",
+    "Days Remaining:": "Zile rămase:",
+    "Issuer:": "Emitent:",
+    "Fingerprint:": "Amprentă:",
+    "No status pages": "Nicio pagină de status",
+    "Domain Name Expiry Notification": "Notificare cu Privire la Expirarea Numelui de Domeniu",
+    "Proxy": "Proxy",
+    "Date Created": "Data Creării",
+    "Footer Text": "Text-ul pentru subsol",
+    "Show Powered By": "Arată ”Cu ajutorul”",
+    "Reverse Proxy": "Proxy invers",
+    "Domain Names": "Nume de domeniu",
+    "signedInDisp": "Autentificat ca {0}",
+    "signedInDispDisabled": "Autentificare Dezactivată.",
+    "RadiusSecret": "Secret Radius",
+    "RadiusSecretDescription": "Secret împărtășit cu client-ul și server-ul",
+    "RadiusCalledStationId": "ID-ul Stației Contactate",
+    "RadiusCalledStationIdDescription": "Identificatorul serviciului apelat",
+    "RadiusCallingStationId": "ID-ul Stației Contactante",
+    "RadiusCallingStationIdDescription": "Identificatorul dispozitivului contactant",
+    "API Username": "Nume de utilizator al API-ului",
+    "API Key": "Cheie API",
+    "Also check beta release": "Verifică și actualizările beta",
+    "Using a Reverse Proxy?": "Folosești un Proxy Invers?",
+    "Check how to config it for WebSocket": "Află cum să îl configurezi pentru WebSocket",
+    "Steam Game Server": "Server de Joc Steam",
+    "Most likely causes:": "Cea mai probabilă cauză:",
+    "There might be a typing error in the address.": "Ar putea exista o eroare de scriere în adresă.",
+    "What you can try:": "Ce poți încerca:",
+    "Retype the address.": "Rescrie adresa.",
+    "Go back to the previous page.": "Mergi la pagina precedentă.",
+    "Coming Soon": "În curând.",
+    "Connection String": "Connection String",
+    "Query": "Query",
+    "settingsCertificateExpiry": "Expirarea certificatului TLS",
+    "Setup Docker Host": "Configurează Docker Host",
+    "Connection Type": "Tipul Conexiunii",
+    "Docker Daemon": "Docker Daemon",
+    "deleteDockerHostMsg": "Ești sigur că vrei să ștergi acest docker host pentru toate montoarele?",
+    "socket": "Socket",
+    "tcp": "TCP / HTTP",
+    "Docker Container": "Container Docker",
+    "Container Name / ID": "Numele Container-ului / ID",
+    "Docker Host": "Docker Host",
+    "Domain": "Domeniu",
+    "Workstation": "Stație de lucru",
+    "Packet Size": "Mărime Pachet",
+    "telegram": "Telegram",
+    "ZohoCliq": "ZohoCliq",
+    "Bot Token": "Token Robot",
+    "wayToGetTelegramToken": "Poți obține un token de la {0}.",
+    "Chat ID": "ID-ul Chat-ului",
+    "YOUR BOT TOKEN HERE": "TOKEN-UL TĂU DE ROBOT",
+    "chatIDNotFound": "ID-ul Chat-ului nu a fost găsit; te rog întâi trimite un mesaj către robot",
+    "disableCloudflaredNoAuthMsg": "Ești în modul fără autentificare, nu ai nevoie de o parola.",
+    "wayToGetLineNotifyToken": "Poți obține un token de acces de la {0}",
+    "Examples": "Exemple",
+    "Home Assistant URL": "URL-ul de la Home Assistant",
+    "Long-Lived Access Token": "Token de acces cu durata de viață mare",
+    "default: notify all devices": "implicit: notifică toate dispozitivele",
+    "Automations can optionally be triggered in Home Assistant:": "Automatizările pot fi declanșate opțional în Home Assistant:",
+    "Trigger type:": "Tipul Declanșatorului:",
+    "Event type:": "Tipul Evenimentului:",
+    "Event data:": "Datele Evenimentului:",
+    "Then choose an action, for example switch the scene to where an RGB light is red.": "Apoi alege o acțiune, de exemplu, schimbă un LED RGB în roșu.",
+    "Frontend Version": "Versiunea Frontend-ului",
+    "Frontend Version do not match backend version!": "Versiunea Frontend-ului nu este aceeași cu cea a backend-ului!",
+    "backupRecommend": "Te rog fă o copie a directorului (./data/) în loc.",
+    "Optional": "Opțional",
+    "squadcast": "Squadcast",
+    "or": "sau",
+    "recurringInterval": "Interval",
+    "Recurring": "Recurentă",
+    "strategyManual": "Activ/Inactiv Manual",
+    "warningTimezone": "Folosește fusul orar al server-ului",
+    "weekdayShortMon": "Luni",
+    "weekdayShortTue": "Marți",
+    "weekdayShortWed": "Miercuri",
+    "weekdayShortThu": "Joi",
+    "weekdayShortFri": "Vineri",
+    "weekdayShortSat": "Sâmbătă",
+    "weekdayShortSun": "Duminică",
+    "dayOfWeek": "Ziua săptămânii",
+    "dayOfMonth": "Ziua lunii",
+    "lastDay": "Ultima zi",
+    "lastDay1": "Ultima zi a Lunii",
+    "lastDay2": "Penultima zi a Lunii",
+    "lastDay3": "Antepenultima zi a Lunii",
+    "No Maintenance": "Fără mentenanță",
+    "pauseMaintenanceMsg": "Ești sigur că vrei sa pui pe pauză?",
+    "maintenanceStatus-under-maintenance": "În mentenanță",
+    "maintenanceStatus-inactive": "Inactiv",
+    "maintenanceStatus-scheduled": "Planificat",
+    "maintenanceStatus-ended": "Terminat",
+    "maintenanceStatus-unknown": "Necunoscut",
+    "Server Timezone": "Fusul Orar al Server-ului",
+    "statusPageMaintenanceEndDate": "Sfârșit",
+    "IconUrl": "URL-ul pictogramei",
+    "Enable DNS Cache": "Activează DNS Cache",
+    "Enable": "Activează",
+    "Disable": "Dezactivează",
+    "Effective Date Range": "Interval în care se aplică",
+    "Schedule Maintenance": "Planifică Mentenanță",
+    "Date and Time": "Dată și Oră",
+    "DateTime Range": "Interval DatăOră",
+    "loadingError": "Nu se pot obține datele, te rog încearcă mai târziu.",
+    "plugin": "Plugin | Plugin-uri",
+    "install": "Instalează",
+    "installing": "Instalare",
+    "uninstall": "Dezinstalează",
+    "confirmUninstallPlugin": "Ești sigur că vrei să dezinstalezi acest plugin?",
+    "smtp": "Email (SMTP)",
+    "secureOptionNone": "Niciunul / STARTTLS (25, 587)",
+    "secureOptionTLS": "TLS (456)",
+    "From Email": "De la Email",
+    "emailCustomSubject": "Subiect Personalizat",
+    "To Email": "La Email",
+    "smtpCC": "CC",
+    "smtpBCC": "BCC",
+    "Discord Webhook URL": "URL-ul Webhook-ului Discord",
+    "Bot Display Name": "Numele Robotului",
+    "Prefix Custom Message": "Prefix Personalizat",
+    "Hello @everyone is...": "Salut {'@'}everyone sunt…",
+    "wayToGetTeamsURL": "Poți învăța cum să creezi un URL webhook {0}.",
+    "wayToGetZohoCliqURL": "Poți învăța cum să creezi un URL webhook {0}.",
+    "needSignalAPI": "Trebuie să ai un client signal cu API-ul REST.",
+    "Number": "Număr",
+    "Recipients": "Destinatari",
+    "Access Token": "Token de acces",
+    "Channel access token": "Token de acces al canalului",
+    "Line Developers Console": "Consola Dezvoltatorilor Line",
+    "lineDevConsoleTo": "Consola Dezvoltatorilor Line - {0}",
+    "Basic Settings": "Setări de Bază",
+    "User ID": "ID-ul Utilizatorului",
+    "Messaging API": "API-ul pentru Mesagerie",
+    "Icon URL": "URL-ul Pictogramei",
+    "dataRetentionTimeError": "Perioada de renenție trebuie să fie 0 sau mai mare",
+    "infiniteRetention": "Setează la „0” pentru retenție pe perioadă nedeterminată.",
+    "confirmDeleteTagMsg": "Ești sigur că vrei să ștergi această etichetă? Monitoarele asociate cu această etichetă nu vor fi șterse.",
+    "enableGRPCTls": "Permite trimiterea cererilor gRPC cu conexiune TLS",
+    "grpcMethodDescription": "Numele metodei este convert to cammelCase format cum ar fi sayHello, check, etc.",
+    "deleteMonitorMsg": "Ești sigur că vrei să ștergi acest monitor?",
+    "deleteMaintenanceMsg": "Ești sigur că vrei să ștergi această mentenanță?",
+    "dnsPortDescription": "Port-ul server-ului DNS. Este implicit 53. Poți schimba acest port oricând.",
+    "resolverserverDescription": "Cloudflare este server-ul implicit. Poți schimba asta oricând.",
+    "rrtypeDescription": "Selectează tipul RR pe care vrei să îl monitorizezi",
+    "pauseMonitorMsg": "Ești sigur că vrei să pui pe pauză?",
+    "clearEventsMsg": "Ești sigur că vrei să ștergi toate evenimentele asociate cu acest monitor?",
+    "clearHeartbeatsMsg": "Ești sigur că vrei să ștergi toate heartbeat-urile asociate cu acest monitor?",
+    "confirmClearStatisticsMsg": "Ești sigur că vrei să ștergi TOATE statisticile?",
+    "confirmImportMsg": "Ești sigur că vrei să importezi backup-ul? Te rog verifică dacă ai selectat varianta corectă de importare.",
+    "twoFAVerifyLabel": "Te rog introdu token-ul pentru a verifica Autentificarea în Doi Pași:",
+    "tokenValidSettingsMsg": "Token-ul este valid! Acum poți salva setările legate de Autentificarea în Doi Pași.",
+    "confirmEnableTwoFAMsg": "Ești sigur că vrei să activezi Autentificarea în Doi Pași?",
+    "recurringIntervalMessage": "Rulează o dată pe zi | Rulează o dată la {0} zile",
+    "affectedMonitorsDescription": "Selectează monitoarele afectate de această mentenanță",
+    "atLeastOneMonitor": "Selectează cel puțin un monitor afectat",
+    "passwordNotMatchMsg": "Parolele nu se potrivesc.",
+    "notificationDescription": "Notificările trebuie atribuite unui monitor pentru a funcționa.",
+    "backupDescription": "Acum poți face backup la toate monitoarele și notificările într-un fișier JSON.",
+    "backupDescription2": "Notă: istoricul și datele evenimentelor nu sunt incluse.",
+    "endpoint": "Punct final",
+    "octopushAPIKey": "„Cheia API” din credențialele HTTP API în panoul de control",
+    "octopushLogin": "„Logare” din credențialele HTTP API în panoul de control",
+    "promosmsLogin": "Numele de Login API",
+    "promosmsPassword": "Parola API",
+    "pushoversounds pushover": "Pushover (implicit)",
+    "pushoversounds bike": "Bicicletă",
+    "pushoversounds bugle": "Goarnă",
+    "pushoversounds cashregister": "Casă de marcat",
+    "pushoversounds classical": "Clasic",
+    "pushoversounds cosmic": "Cosmic",
+    "pushoversounds falling": "Cădere",
+    "pushoversounds gamelan": "Gamelan",
+    "pushoversounds incoming": "Sosire",
+    "pushoversounds intermission": "Pauză",
+    "pushoversounds magic": "Magie",
+    "pushoversounds mechanical": "Mecanic",
+    "pushoversounds tugboat": "Remorcher",
+    "pushoversounds alien": "Alarmă Extraterestră (lung)",
+    "pushoversounds climb": "Urcare (lung)",
+    "pushoversounds echo": "Ecou Pushover (lung)",
+    "pushoversounds updown": "Sus Jos (lung)",
+    "pushoversounds vibrate": "Doar Vibrații",
+    "pushoversounds none": "Niciunul (silențios)",
+    "pushyAPIKey": "Cheie API secretă",
+    "pushyToken": "Token dispozitiv",
+    "discord": "Discord",
+    "teams": "Microsoft Teams",
+    "signal": "Signal",
+    "slack": "Slack",
+    "rocket.chat": "Rocket.Chat",
+    "pushover": "Pushover",
+    "pushy": "Pushy",
+    "PushByTechulus": "Pushy by Techulus",
+    "octopush": "Octopush",
+    "promosms": "PromoSMS",
+    "lunasea": "LunaSea",
+    "apprise": "Apprise (Suportă 50+ Servicii de Notificare)",
+    "GoogleChat": "Google Chat (Doar Google Workspace)",
+    "pushbullet": "Pushbullet",
+    "Kook": "Kook",
+    "Guild ID": "ID-ul Breslei (Guild-ului)",
+    "line": "Line Messenger",
+    "mattermost": "Mattermost",
+    "User Key": "Cheie Utilizator",
+    "Device": "Dispozitiv",
+    "Message Title": "Titlu Mesaj",
+    "Notification Sound": "Sunet Notificare",
+    "More info on:": "Mai multe informații la: {0}",
+    "pushoverDesc2": "Dacă vrei să trimiți notificări la dispozitive diferite, completează câmpul „Dispozitiv”",
+    "Settings": "Setări",
+    "New Update": "Update Nou",
+    "Language": "Limbă",
+    "Game": "Joc",
+    "Primary Base URL": "URL-ul de Bază",
+    "List": "Listă",
+    "Add": "Adaugă",
+    "Add New Monitor": "Adaugă Monitor Nou",
+    "Pending": "În așteptare",
+    "Unknown": "Necunoscut",
+    "Specific Monitor Type": "Monitor de Tip Specific",
+    "pauseDashboardHome": "Pauză",
+    "Current": "Curent",
+    "-hour": "-oră",
+    "Response": "Răspuns",
+    "Heartbeat Interval": "Interval Heartbeat",
+    "Resend Notification if Down X times consequently": "Retrimite Notificarea dacă se Întâmpină Eroarea de X ori consecutiv",
+    "retriesDescription": "Numărul Maxim de Reîncercări înainte ca serviciul să fie marcat offline și să se trimită o notificare",
+    "maxRedirectDescription": "Numărul maxim de redirecționări permise. Setează la „0” pentru a dezactiva redirecționările.",
+    "Theme - Heartbeat Bar": "Temă - Bara de Heartbeat",
+    "Discourage search engines from indexing site": "Descurajează Motoarele de Căutare din a Indexa Acest Site",
+    "disableauth.message2": "Este proiectat pentru scenarii <strong>în care intenționezi să implementezi soluții terțe de autentificare</strong> în fața Uptime Kuma, cum ar fi Cloudflare Access, Authelia, sau alt mecanism de autentificare.",
+    "Login": "Logare",
+    "Notification Type": "Tipul Notificării",
+    "Email": "Email",
+    "Test": "Test",
+    "Certificate Info": "Informațiile Certificatului",
+    "Resolver Server": "Server-ul de Rezolvare",
+    "Last Result": "Ultimul Rezultat",
+    "notAvailableShort": "N/A",
+    "Default enabled": "Implicit activat",
+    "Create": "Creează",
+    "Schedule maintenance": "Programează Mentenanță",
+    "Select status pages...": "Selectează pagina de status…",
+    "alertNoFile": "Te rog selectează un fișier de importat.",
+    "alertWrongFileType": "Te rog selectează un fișier de tip JSON.",
+    "Clear all statistics": "Șterge toate Statisticile",
+    "Setup 2FA": "Configurează Autentificarea în Doi Pași",
+    "Two Factor Authentication": "Autentificare în Doi Pași",
+    "Inactive": "Inactiv",
+    "Add New below or Select...": "Adaugă Nou Mai Jos sau Selectează…",
+    "Pink": "Roz",
+    "Search...": "Caută…",
+    "Avg. Ping": "Ping Mediu",
+    "Avg. Response": "Timp de Răspuns Mediu",
+    "statusPageNothing": "Nimic aici, te rog adaugă un grup sau un monitor.",
+    "Go to Dashboard": "Mergi la Panoul de Control",
+    "webhookJsonDesc": "{0} este bun pentru orice server HTTP modern cum ar fi Express.js",
+    "webhookAdditionalHeadersDesc": "Setează antete adiționale trimise împreună cu webhook-ul.",
+    "HeadersInvalidFormat": "Formatul header-urilor de request nu este valid: ",
+    "clearDataOlderThan": "Păstrează istoricul monitorului pentru {0} zile.",
+    "records": "înregistrări",
+    "steamApiKeyDescription": "Pentru a monitoriza un server de joc Steam, ai nevoie de un o cheie pentru „Web-API„-ul Steam. Poți înregistra o astfel de cheie aici: ",
+    "recent": "Recent",
+    "Steam API Key": "Cheia API Steam",
+    "Pick a RR-Type...": "Alege un Tip-RR…",
+    "Pick Accepted Status Codes...": "Alege Codurile de Status Acceptate…",
+    "Create Incident": "Creează un Incident",
+    "primary": "implicit",
+    "light": "luminos",
+    "Please input title and content": "Te rog adaugă un titlu și conținut",
+    "Created": "Creat",
+    "Switch to Dark Theme": "Schimbă la Tema Întunecată",
+    "Add one": "Adaugă unul",
+    "No Monitors": "Niciun monitor",
+    "Untitled Group": "Grup fără nume",
+    "Services": "Servicii",
+    "shrinkDatabaseDescription": "Declanșează database VACUUM pentru SQLite. Dacă baza ta de date a fost creată după 1.10.0, AUTO_VACUUM este deja activat și această acțiune nu este necesară.",
+    "proxyDescription": "Proxy-urile trebuie să fie atribuite unui monitor pentru a funcționa.",
+    "enableProxyDescription": "Acest proxy nu va afecta cererile monitoarelor până este activat. Poți dezactiva temporar proxy-ul pentru toate monitoarele.",
+    "setAsDefaultProxyDescription": "Acest proxy va fi activat implicit pentru toate monitoarele noi. Poți totuși să îl dezactivezi separat pentru fiecare monitor.",
+    "Not installed": "Neinstalat",
+    "Accept characters:": "Acceptă caractere:",
+    "The slug is already taken. Please choose another slug.": "Acest slug este deja luat. Te rog alege alt slug.",
+    "Don't know how to get the token? Please read the guide:": "Nu știi cum să obții token-ul? Te rog citește acest ghid:",
+    "The current connection may be lost if you are currently connecting via Cloudflare Tunnel. Are you sure want to stop it? Type your current password to confirm it.": "Conexiunea curentă s-ar putea pierde dacă ești în proces de conectare printr-un tunel Cloudflare. Ești sigur că vrei să îl oprești? Tastează-ți parola curentă pentru a confirma.",
+    "Certificate Expiry Notification": "Notificare cu privire la expirarea certificatului",
+    "Show update if available": "Arată actualizarea dacă e disponibilă",
+    "The resource is no longer available.": "Această resursă nu mai este disponibilă.",
+    "certificationExpiryDescription": "Monitoarele HTTPS declanșează notificarea când certificatul TLS expiră în:",
+    "Docker Hosts": "Docker Hosts",
+    "supportTelegramChatID": "Suport Mesaje Directe / Grup / ID-ul Canalului de Text",
+    "wayToGetTelegramChatID": "Poți obține ID-ul chat-ului prin trimiterea unui mesaj către robot și mergând la acest URL pentru a vedea chat_id:",
+    "trustProxyDescription": "Ai incredere in antetele 'X-Forwarded-*'. Dacă vrei să obții IP-ul corect al client-ului și Uptime Kuma este în spatele unui proxy, cum ar fi Nginx sau Apache, trebuie să activezi asta.",
+    "Long-Lived Access Token can be created by clicking on your profile name (bottom left) and scrolling to the bottom then click Create Token. ": "Token-ul de acces cu durată de viață mare poate fi creat dacă dai click pe numele tău de profil (stânga jos) și prin derularea până la capătul paginii și click pe „Creează Token”. ",
+    "Notification Service": "Serviciu de Notificări",
+    "A list of Notification Services can be found in Home Assistant under \"Developer Tools > Services\" search for \"notification\" to find your device/phone name.": "O listă cu serviciile de notificare poate fi găsită în Home Assistant sub „Opțiuni Dezvoltator > Servicii” caută „notificare” pentru a găsi numele dispozitivului/telefonului.",
+    "backupOutdatedWarning": "Depășit: Pentru că au fost adăugate multe funcționalități, iar această funcție de backup este neîntreținută, nu poate genera sau restaura un backup complet.",
+    "lastDay4": "Răsantepenultima zi a Lunii",
+    "Display Timezone": "Afișează Fusul Orar",
+    "dnsCacheDescription": "Nu funcționează in anumite medii IPv6, dezactivează dacă întâmpini probleme.",
+    "Single Maintenance Window": "Fereastră unică de timp pentru mentennanță",
+    "Maintenance Time Window of a Day": "Fereastra de timp alocată pentru mentenanță dintr-o zi",
+    "uninstalling": "Dezinstalare",
+    "Ignore TLS Error": "Ignoră erorile TLS",
+    "wayToGetDiscordURL": "Poți obține asta mergând în Setări Server -> Integrări -> Vezi Webhook-urile -> Webhook nou",
+    "wayToCheckSignalURL": "Poți verifica acest URL pentru a vizualiza cum să configurezi unul:",
+    "wayToGetLineChannelToken": "Pentru început, accesează {0}, creează un furnizor și canal (API-ul Mesageriei), apoi poți obține token-ul de acces al canalului si ID-ul utilizatorului din itemii de meniu mentionati mai sus.",
+    "aboutIconURL": "Poți furniza un link către o pictogramă la secțiunea „URL-ul Pictogramei” pentru a suprascrie imaginea de profil implicită. Nu va fi folosită dacă există un emoticon configurat deja.",
+    "Channel Name": "Nume Canal",
+    "aboutMattermostChannelName": "Poți suprascrie canalul implicit pe care Webhook-ul îl folosește prin introducerea numelui canalului în câmpul „Nume Canal”. Acesta trebuie să fie activat în setările Webhook-ului Mattermost. Ex: #alt-canal",
+    "acceptedStatusCodesDescription": "Selectează codurile de status care sunt considerate un răspuns de succes.",
+    "deleteNotificationMsg": "Ești sigur că vrei să ștergi această notificare pentru toate monitoarele?",
+    "enableDefaultNotificationDescription": "Această notificare va fi activată implicit pentru toate monitoarele noi. Poți totuși să o dezactivezi individual pentru fiecare monitor.",
+    "importHandleDescription": "Alege „Sari Existente” dacă vrei să sari peste fiecare monitor sau notificare cu același nume. „Suprascrie” va șterge toate monitoarele și notificările existente.",
+    "confirmDisableTwoFAMsg": "Ești sigur că vrei să dezactivezi Autentificarea în Doi Pași?",
+    "affectedStatusPages": "Afișează acest mesaj de mentenanță pe paginile de status selectate",
+    "keywordDescription": "Caută cuvântul cheie în HTML simplu sau JSON. Această căutare ține cont de majuscule.",
+    "backupDescription3": "Datele importante, cum ar fi token-urile notificărilor sunt incluse în fișierul exportat; te rog stochează-l în siguranță.",
+    "pushoversounds pianobar": "Pian",
+    "pushoversounds siren": "Sirenă",
+    "pushoversounds spacealarm": "Alarmă Spațială",
+    "pushoversounds persistent": "Persistent (lung)",
+    "gotify": "Gotify",
+    "clicksendsms": "ClickSend SMS",
+    "wayToGetKookBotToken": "Creează o aplicație și obține token-ul robot la {0}",
+    "wayToGetKookGuildID": "Activează „Modul Dezvoltator” în setările Kook și dă click pe breaslă (guild) pentru a-i obține ID-ul",
+    "pushoverDesc1": "Prioritate de urgență (2) are o pauză implicită de 30 de secunde între reîncercări și expiră după o oră."
+}
diff --git a/src/lang/ru-RU.json b/src/lang/ru-RU.json
new file mode 100644
index 000000000..7ea1f6431
--- /dev/null
+++ b/src/lang/ru-RU.json
@@ -0,0 +1,669 @@
+{
+    "languageName": "Русский",
+    "checkEverySecond": "Проверка каждые {0} секунд",
+    "retriesDescription": "Максимальное количество попыток перед пометкой сервиса как недоступного и отправкой уведомления",
+    "ignoreTLSError": "Игнорировать ошибку TLS/SSL для HTTPS сайтов",
+    "upsideDownModeDescription": "Реверс статуса сервиса. Если сервис доступен, то он помечается как НЕДОСТУПНЫЙ.",
+    "maxRedirectDescription": "Максимальное количество перенаправлений. Поставьте 0, чтобы отключить перенаправления.",
+    "acceptedStatusCodesDescription": "Выберите коды статусов для определения доступности сервиса.",
+    "passwordNotMatchMsg": "Повтор пароля не совпадает.",
+    "notificationDescription": "Привяжите уведомления к мониторам.",
+    "keywordDescription": "Поиск слова в чистом HTML или в JSON-ответе (чувствительно к регистру)",
+    "pauseDashboardHome": "Пауза",
+    "deleteMonitorMsg": "Вы действительно хотите удалить данный монитор?",
+    "deleteNotificationMsg": "Вы действительно хотите удалить это уведомление для всех мониторов?",
+    "resolverserverDescription": "Cloudflare является сервером по умолчанию. Вы всегда можете сменить данный сервер.",
+    "rrtypeDescription": "Выберите тип ресурсной записи, который вы хотите отслеживать",
+    "pauseMonitorMsg": "Вы действительно хотите поставить на паузу?",
+    "Settings": "Настройки",
+    "Dashboard": "Панель управления",
+    "New Update": "Обновление",
+    "Language": "Язык",
+    "Appearance": "Внешний вид",
+    "Theme": "Тема",
+    "General": "Общее",
+    "Version": "Версия",
+    "Check Update On GitHub": "Проверить обновления на GitHub",
+    "List": "Список",
+    "Add": "Добавить",
+    "Add New Monitor": "Новый монитор",
+    "Quick Stats": "Статистика",
+    "Up": "Доступен",
+    "Down": "Недоступен",
+    "Pending": "Ожидание",
+    "Unknown": "Неизвестно",
+    "Pause": "Пауза",
+    "Name": "Имя",
+    "Status": "Статус",
+    "DateTime": "Дата и время",
+    "Message": "Сообщение",
+    "No important events": "Важных событий нет",
+    "Resume": "Возобновить",
+    "Edit": "Изменить",
+    "Delete": "Удалить",
+    "Current": "Текущий",
+    "Uptime": "Аптайм",
+    "Cert Exp.": "Сертификат истекает.",
+    "day": "день | дней",
+    "-day": " дней",
+    "hour": "час",
+    "-hour": " часа",
+    "Response": "Ответ",
+    "Ping": "Пинг",
+    "Monitor Type": "Тип монитора",
+    "Keyword": "Слово",
+    "Friendly Name": "Имя",
+    "URL": "URL",
+    "Hostname": "Имя хоста",
+    "Port": "Порт",
+    "Heartbeat Interval": "Частота опроса",
+    "Retries": "Попыток",
+    "Advanced": "Дополнительно",
+    "Upside Down Mode": "Реверс статуса",
+    "Max. Redirects": "Макс. количество перенаправлений",
+    "Accepted Status Codes": "Допустимые коды статуса",
+    "Save": "Сохранить",
+    "Notifications": "Уведомления",
+    "Not available, please setup.": "Доступных уведомлений нет, необходимо создать.",
+    "Setup Notification": "Создать уведомление",
+    "Light": "Светлая",
+    "Dark": "Тёмная",
+    "Auto": "Авто",
+    "Theme - Heartbeat Bar": "Тема - Полоса частоты опроса",
+    "Normal": "Обычный",
+    "Bottom": "Снизу",
+    "None": "Отсутствует",
+    "Timezone": "Часовой пояс",
+    "Search Engine Visibility": "Индексация поисковыми системами",
+    "Allow indexing": "Разрешить индексирование",
+    "Discourage search engines from indexing site": "Запретить индексирование",
+    "Change Password": "Сменить пароль",
+    "Current Password": "Текущий пароль",
+    "New Password": "Новый пароль",
+    "Repeat New Password": "Повтор нового пароля",
+    "Update Password": "Обновить пароль",
+    "Disable Auth": "Отключить авторизацию",
+    "Enable Auth": "Включить авторизацию",
+    "disableauth.message1": "Вы уверены, что хотите <strong>отключить авторизацию</strong>?",
+    "disableauth.message2": "Это подходит для <strong>тех, у кого стоит другая авторизация</strong> перед открытием Uptime Kuma, например Cloudflare Access.",
+    "Please use this option carefully!": "Пожалуйста, используйте с осторожностью!",
+    "Logout": "Выйти",
+    "Leave": "Отмена",
+    "I understand, please disable": "Я понимаю, всё равно отключить",
+    "Confirm": "Подтвердить",
+    "Yes": "Да",
+    "No": "Нет",
+    "Username": "Логин",
+    "Password": "Пароль",
+    "Remember me": "Запомнить меня",
+    "Login": "Вход в систему",
+    "No Monitors, please": "Мониторов нет, пожалуйста",
+    "No Monitors": "Мониторы отсутствуют",
+    "add one": "создайте новый",
+    "Notification Type": "Тип уведомления",
+    "Email": "Почта",
+    "Test": "Проверка",
+    "Certificate Info": "Информация о сертификате",
+    "Resolver Server": "DNS сервер",
+    "Resource Record Type": "Тип ресурсной записи",
+    "Last Result": "Последний результат",
+    "Create your admin account": "Создайте аккаунт администратора",
+    "Repeat Password": "Повторите пароль",
+    "respTime": "Время ответа (мс)",
+    "notAvailableShort": "N/A",
+    "Create": "Создать",
+    "clearEventsMsg": "Вы действительно хотите удалить всю статистику событий данного монитора?",
+    "clearHeartbeatsMsg": "Вы действительно хотите удалить всю статистику опросов данного монитора?",
+    "confirmClearStatisticsMsg": "Вы действительно хотите удалить ВСЮ статистику?",
+    "Clear Data": "Удалить статистику",
+    "Events": "События",
+    "Heartbeats": "Опросы",
+    "Auto Get": "Авто-получение",
+    "enableDefaultNotificationDescription": "Для каждого нового монитора это уведомление будет включено по умолчанию. Вы всё ещё можете отключить уведомления в каждом мониторе отдельно.",
+    "Default enabled": "Использовать по умолчанию",
+    "Also apply to existing monitors": "Применить к существующим мониторам",
+    "Export": "Экспорт",
+    "Import": "Импорт",
+    "backupDescription": "Вы можете сохранить резервную копию всех мониторов и уведомлений в виде JSON-файла",
+    "backupDescription2": "P.S. История и события сохранены не будут",
+    "backupDescription3": "Важные данные, такие как токены уведомлений, добавляются при экспорте, поэтому храните файлы в безопасном месте",
+    "alertNoFile": "Выберите файл для импорта.",
+    "alertWrongFileType": "Выберите JSON-файл.",
+    "twoFAVerifyLabel": "Пожалуйста, введите свой токен, чтобы проверить работу 2FA",
+    "tokenValidSettingsMsg": "Токен действителен! Теперь вы можете сохранить настройки 2FA.",
+    "confirmEnableTwoFAMsg": "Вы действительно хотите включить 2FA?",
+    "confirmDisableTwoFAMsg": "Вы действительно хотите выключить 2FA?",
+    "Apply on all existing monitors": "Применить ко всем существующим мониторам",
+    "Verify Token": "Проверить токен",
+    "Setup 2FA": "Настройка 2FA",
+    "Enable 2FA": "Включить 2FA",
+    "Disable 2FA": "Выключить 2FA",
+    "2FA Settings": "Настройки 2FA",
+    "Two Factor Authentication": "Двухфакторная аутентификация",
+    "Active": "Активно",
+    "Inactive": "Неактивно",
+    "Token": "Токен",
+    "Show URI": "Показать URI",
+    "Clear all statistics": "Очистить статистику",
+    "retryCheckEverySecond": "Повтор каждые {0} секунд",
+    "importHandleDescription": "Выберите \"Пропустить существующие\", если вы хотите пропустить каждый монитор или уведомление с таким же именем. \"Перезаписать\" удалит каждый существующий монитор или уведомление и добавит заново. Вариант \"Не проверять\" принудительно восстанавливает все мониторы и уведомления, даже если они уже существуют.",
+    "confirmImportMsg": "Вы действительно хотите восстановить резервную копию? Убедитесь, что вы выбрали подходящий вариант импорта.",
+    "Heartbeat Retry Interval": "Интервал повтора опроса",
+    "Import Backup": "Импорт",
+    "Export Backup": "Скачать",
+    "Skip existing": "Пропустить существующие",
+    "Overwrite": "Перезаписать",
+    "Options": "Опции",
+    "Keep both": "Не проверять",
+    "Tags": "Теги",
+    "Add New below or Select...": "Добавить новый или выбрать…",
+    "Tag with this name already exist.": "Такой тег уже существует.",
+    "Tag with this value already exist.": "Тег с таким значением уже существует.",
+    "color": "цвет",
+    "value (optional)": "значение (опционально)",
+    "Gray": "Серый",
+    "Red": "Красный",
+    "Orange": "Оранжевый",
+    "Green": "Зелёный",
+    "Blue": "Синий",
+    "Indigo": "Индиго",
+    "Purple": "Пурпурный",
+    "Pink": "Розовый",
+    "Search...": "Поиск…",
+    "Avg. Ping": "Среднее значение пинга",
+    "Avg. Response": "Среднее время ответа",
+    "Entry Page": "Главная страница",
+    "statusPageNothing": "Здесь пусто. Добавьте группу или монитор.",
+    "No Services": "Нет сервисов",
+    "All Systems Operational": "Все системы работают в штатном режиме",
+    "Partially Degraded Service": "Сервисы работают частично",
+    "Degraded Service": "Все сервисы не работают",
+    "Add Group": "Добавить группу",
+    "Add a monitor": "Добавить монитор",
+    "Edit Status Page": "Редактировать",
+    "Go to Dashboard": "Панель управления",
+    "Status Page": "Страница статуса",
+    "Status Pages": "Страницы статуса",
+    "Discard": "Отмена",
+    "Create Incident": "Создать инцидент",
+    "Switch to Dark Theme": "Тёмная тема",
+    "Switch to Light Theme": "Светлая тема",
+    "telegram": "Telegram",
+    "webhook": "Вебхук",
+    "smtp": "Email (SMTP)",
+    "discord": "Discord",
+    "teams": "Microsoft Teams",
+    "signal": "Signal",
+    "gotify": "Gotify",
+    "slack": "Slack",
+    "rocket.chat": "Rocket.chat",
+    "pushover": "Pushover",
+    "pushy": "Pushy",
+    "octopush": "Octopush",
+    "promosms": "PromoSMS",
+    "lunasea": "LunaSea",
+    "apprise": "Apprise (Поддержка 50+ сервисов уведомлений)",
+    "pushbullet": "Pushbullet",
+    "line": "Line Messenger",
+    "mattermost": "Mattermost",
+    "Primary Base URL": "Основной URL",
+    "Push URL": "URL пуша",
+    "needPushEvery": "К этому URL необходимо обращаться каждые {0} секунд.",
+    "pushOptionalParams": "Опциональные параметры: {0}",
+    "defaultNotificationName": "Моё уведомление {notification} ({number})",
+    "here": "здесь",
+    "Required": "Требуется",
+    "Bot Token": "Токен бота",
+    "wayToGetTelegramToken": "Вы можете взять токен здесь - {0}.",
+    "Chat ID": "ID чата",
+    "supportTelegramChatID": "Поддерживаются ID чатов, групп и каналов",
+    "wayToGetTelegramChatID": "Вы можете взять ID вашего чата, отправив сообщение боту и перейдя по этому URL для просмотра chat_id:",
+    "YOUR BOT TOKEN HERE": "ВАШ ТОКЕН БОТА ЗДЕСЬ",
+    "chatIDNotFound": "ID чата не найден; пожалуйста отправьте сначала сообщение боту",
+    "Post URL": "Post URL",
+    "Content Type": "Тип контента",
+    "webhookJsonDesc": "{0} подходит для любых современных HTTP-серверов, например Express.js",
+    "webhookFormDataDesc": "{multipart} подходит для PHP. JSON-вывод необходимо будет обработать с помощью {decodeFunction}",
+    "secureOptionNone": "Нет / STARTTLS (25, 587)",
+    "secureOptionTLS": "TLS (465)",
+    "Ignore TLS Error": "Игнорировать ошибки TLS",
+    "From Email": "От кого",
+    "emailCustomSubject": "Своя тема",
+    "To Email": "Кому",
+    "smtpCC": "Копия",
+    "smtpBCC": "Скрытая копия",
+    "Discord Webhook URL": "Discord вебхук URL",
+    "wayToGetDiscordURL": "Вы можете создать его в \"Настройки -> Интеграции -> Создать Вебхук\"",
+    "Bot Display Name": "Отображаемое имя бота",
+    "Prefix Custom Message": "Свой префикс сообщения",
+    "Hello @everyone is...": "Привет {'@'} всем это…",
+    "Webhook URL": "URL вебхука",
+    "wayToGetTeamsURL": "Как создать URL Вебхука вы можете узнать здесь - {0}.",
+    "Number": "Номер",
+    "Recipients": "Получатели",
+    "needSignalAPI": "Вам необходим клиент Signal с поддержкой REST API.",
+    "wayToCheckSignalURL": "Пройдите по этому URL, чтобы узнать как настроить такой клиент:",
+    "signalImportant": "ВАЖНО: Нельзя смешивать в Получателях группы и номера!",
+    "Application Token": "Токен приложения",
+    "Server URL": "URL сервера",
+    "Priority": "Приоритет",
+    "Icon Emoji": "Иконка Emoji",
+    "Channel Name": "Имя канала",
+    "Uptime Kuma URL": "Uptime Kuma URL",
+    "aboutWebhooks": "Больше информации о вебхуках: {0}",
+    "aboutChannelName": "Введите имя канала в поле {0} Имя канала, если вы хотите обойти канал вебхука. Например: #other-channel",
+    "aboutKumaURL": "Если поле Uptime Kuma URL в настройках останется пустым, по умолчанию будет использоваться ссылка на проект на GitHub.",
+    "emojiCheatSheet": "Шпаргалка по Emoji: {0}",
+    "User Key": "Ключ пользователя",
+    "Device": "Устройство",
+    "Message Title": "Заголовок сообщения",
+    "Notification Sound": "Звук уведомления",
+    "More info on:": "Больше информации: {0}",
+    "pushoverDesc1": "Экстренный приоритет (2) имеет таймаут повтора по умолчанию 30 секунд и истекает через 1 час.",
+    "pushoverDesc2": "Если вы хотите отправлять уведомления различным устройствам, необходимо заполнить поле Устройство.",
+    "SMS Type": "Тип SMS",
+    "octopushTypePremium": "Премиум (Быстрый - рекомендуется для алертов)",
+    "octopushTypeLowCost": "Дешёвый (Медленный - иногда блокируется операторами)",
+    "checkPrice": "Тарифы {0}:",
+    "octopushLegacyHint": "Вы используете старую версию Octopush (2011-2020) или новую?",
+    "Check octopush prices": "Тарифы Octopush {0}.",
+    "octopushPhoneNumber": "Номер телефона (межд. формат, например: +79831234567) ",
+    "octopushSMSSender": "Имя отправителя SMS: 3-11 символов алвафита, цифр и пробелов (a-zA-Z0-9)",
+    "LunaSea Device ID": "ID устройства LunaSea",
+    "Apprise URL": "Ссылка Уведомления",
+    "Example:": "Пример: {0}",
+    "Read more:": "Подробнее: {0}",
+    "Status:": "Статус: {0}",
+    "Read more": "Подробнее",
+    "appriseInstalled": "Apprise установлен.",
+    "appriseNotInstalled": "Apprise не установлен. {0}",
+    "Access Token": "Токен доступа",
+    "Channel access token": "Токен доступа канала",
+    "Line Developers Console": "Консоль разработчиков Line",
+    "lineDevConsoleTo": "Консоль разработчиков Line - {0}",
+    "Basic Settings": "Базовые настройки",
+    "User ID": "ID пользователя",
+    "Messaging API": "API сообщений",
+    "wayToGetLineChannelToken": "Сначала зайдите в {0}, создайте провайдера и канал (API сообщений), затем вы сможете получить токен доступа канала и ID пользователя из вышеупомянутых пунктов меню.",
+    "Icon URL": "URL иконки",
+    "aboutIconURL": "Вы можете вставить ссылку на иконку в поле \"URL иконки\" чтобы изменить картинку профиля по умолчанию. Не используется, если задана иконка Emoji.",
+    "aboutMattermostChannelName": "Вы можете переопределить канал по умолчанию, в который вебхук пишет, введя имя канала в поле \"Имя канала\". Это необходимо включить в настройках вебхука Mattermost. Например: #other-channel",
+    "matrix": "Matrix",
+    "promosmsTypeEco": "SMS ECO - дёшево и медленно, часто перегружен. Только для получателей из Польши.",
+    "promosmsTypeFlash": "SMS FLASH - сообщения автоматически появятся на устройстве получателя. Только для получателей из Польши.",
+    "promosmsTypeFull": "SMS FULL - премиум-уровень SMS, можно использовать своё имя отправителя (предварительно зарегистрировав его). Надёжно для алертов.",
+    "promosmsTypeSpeed": "SMS SPEED - наивысший приоритет в системе. Очень быстро и надёжно, но очень дорого (в два раза дороже, чем SMS FULL).",
+    "promosmsPhoneNumber": "Номер телефона (для получателей из Польши можно пропустить код региона)",
+    "promosmsSMSSender": "Имя отправителя SMS: Зарегистрированное или одно из имён по умолчанию: InfoSMS, SMS Info, MaxSMS, INFO, SMS",
+    "Feishu WebHookUrl": "Feishu WebHookURL",
+    "matrixHomeserverURL": "URL сервера (вместе с http(s):// и опционально порт)",
+    "Internal Room Id": "Внутренний ID комнаты",
+    "matrixDesc1": "Внутренний ID комнаты можно найти в Подробностях в параметрах канала вашего Matrix клиента. Он должен выглядеть примерно как !QMdRCpUIfLwsfjxye6:home.server.",
+    "matrixDesc2": "Рекомендуется создать нового пользователя и не использовать токен доступа личного пользователя Matrix, т.к. это влечёт за собой полный доступ к аккаунту и к комнатам, в которых вы состоите. Вместо этого создайте нового пользователя и пригласите его только в ту комнату, в которой вы хотите получать уведомления. Токен доступа можно получить, выполнив команду {0}",
+    "Method": "Метод",
+    "Body": "Тело",
+    "Headers": "Заголовки",
+    "PushUrl": "URL пуша",
+    "HeadersInvalidFormat": "Заголовки запроса некорректны JSON: ",
+    "BodyInvalidFormat": "Тело запроса некорректно JSON: ",
+    "Monitor History": "Статистика",
+    "clearDataOlderThan": "Сохранять статистику за {0} дней.",
+    "PasswordsDoNotMatch": "Пароли не совпадают.",
+    "records": "записей",
+    "One record": "Одна запись",
+    "steamApiKeyDescription": "Для мониторинга игрового сервера Steam вам необходим Web-API ключ Steam. Зарегистрировать его можно здесь: ",
+    "Certificate Chain": "Цепочка сертификатов",
+    "Valid": "Действительный",
+    "Hide Tags": "Скрыть тэги",
+    "Title": "Название инцидента",
+    "Content": "Содержание инцидента",
+    "Post": "Опубликовать",
+    "Cancel": "Отмена",
+    "Created": "Создано",
+    "Unpin": "Открепить",
+    "Show Tags": "Показать тэги",
+    "recent": "Сейчас",
+    "3h": "3 часа",
+    "6h": "6 часов",
+    "24h": "24 часа",
+    "1w": "1 неделя",
+    "No monitors available.": "Нет доступных мониторов.",
+    "Add one": "Добавить новый",
+    "Backup": "Резервная копия",
+    "Security": "Безопасность",
+    "Shrink Database": "Сжать Базу Данных",
+    "Current User": "Текущий пользователь",
+    "About": "О программе",
+    "Description": "Описание",
+    "Powered by": "Работает на основе скрипта от",
+    "shrinkDatabaseDescription": "Включает VACUUM для базы данных SQLite. Если ваша база данных была создана на версии 1.10.0 и более, AUTO_VACUUM уже включен и это действие не требуется.",
+    "deleteStatusPageMsg": "Вы действительно хотите удалить эту страницу статуса сервисов?",
+    "Style": "Стиль",
+    "info": "ИНФО",
+    "warning": "ВНИМАНИЕ",
+    "danger": "ОШИБКА",
+    "primary": "ОСНОВНОЙ",
+    "light": "СВЕТЛЫЙ",
+    "dark": "ТЕМНЫЙ",
+    "New Status Page": "Новая страница статуса",
+    "Show update if available": "Показывать доступные обновления",
+    "Also check beta release": "Проверять обновления для бета версий",
+    "Add New Status Page": "Добавить страницу статуса",
+    "Next": "Далее",
+    "Accept characters: a-z 0-9 -": "Разрешены символы: a-z 0-9 -",
+    "Start or end with a-z 0-9 only": "Начало и окончание имени только на символы: a-z 0-9",
+    "No consecutive dashes --": "Запрещено использовать тире --",
+    "HTTP Options": "HTTP Опции",
+    "Authentication": "Аутентификация",
+    "HTTP Basic Auth": "HTTP Авторизация",
+    "PushByTechulus": "Push by Techulus",
+    "clicksendsms": "ClickSend SMS",
+    "GoogleChat": "Google Chat (только Google Workspace)",
+    "apiCredentials": "API реквизиты",
+    "Done": "Готово",
+    "Info": "Инфо",
+    "Steam API Key": "Steam API-Ключ",
+    "Pick a RR-Type...": "Выберите RR-Тип…",
+    "Pick Accepted Status Codes...": "Выберите принятые коды состояния…",
+    "Default": "По умолчанию",
+    "Please input title and content": "Пожалуйста, введите название и содержание",
+    "Last Updated": "Последнее Обновление",
+    "Untitled Group": "Группа без названия",
+    "Services": "Сервисы",
+    "serwersms": "SerwerSMS.pl",
+    "serwersmsAPIUser": "API Пользователь (включая префикс webapi_)",
+    "serwersmsAPIPassword": "API Пароль",
+    "serwersmsPhoneNumber": "Номер телефона",
+    "serwersmsSenderName": "SMS Имя Отправителя (регистрированный через пользовательский портал)",
+    "stackfield": "Stackfield",
+    "smtpDkimSettings": "DKIM Настройки",
+    "smtpDkimDesc": "Пожалуйста ознакомьтесь с {0} Nodemailer DKIM для использования.",
+    "documentation": "документацией",
+    "smtpDkimDomain": "Имя Домена",
+    "smtpDkimKeySelector": "Ключ",
+    "smtpDkimPrivateKey": "Приватный ключ",
+    "smtpDkimHashAlgo": "Алгоритм хэша (опционально)",
+    "smtpDkimheaderFieldNames": "Заголовок ключей для подписи (опционально)",
+    "smtpDkimskipFields": "Заголовок ключей не для подписи (опционально)",
+    "gorush": "Gorush",
+    "alerta": "Alerta",
+    "alertaApiEndpoint": "Конечная точка API",
+    "alertaEnvironment": "Среда",
+    "alertaApiKey": "Ключ API",
+    "alertaAlertState": "Состояние алерта",
+    "alertaRecoverState": "Состояние восстановления",
+    "Proxies": "Прокси",
+    "Setup Proxy": "Настройка Прокси",
+    "Proxy Protocol": "Протокол Прокси",
+    "Proxy Server": "Прокси",
+    "Proxy server has authentication": "Прокси имеет аутентификацию",
+    "Reverse Proxy": "Обратный прокси",
+    "No Proxy": "Без прокси",
+    "default": "По умолчанию",
+    "enabled": "Включено",
+    "setAsDefault": "Установлено по умолчанию",
+    "deleteProxyMsg": "Вы действительно хотите удалить этот прокси для всех мониторов?",
+    "proxyDescription": "Прокси должны быть привязаны к монитору, чтобы работать.",
+    "enableProxyDescription": "Этот прокси не будет влиять на запросы монитора, пока не будет активирован. Вы можете контролировать временное отключение прокси для всех мониторов через статус активации.",
+    "setAsDefaultProxyDescription": "Этот прокси будет по умолчанию включен для новых мониторов. Вы всё ещё можете отдельно отключать прокси в каждом мониторе.",
+    "Invalid": "Недействительный",
+    "AccessKeyId": "AccessKey ID",
+    "SecretAccessKey": "AccessKey Secret",
+    "PhoneNumbers": "PhoneNumbers",
+    "TemplateCode": "TemplateCode",
+    "SignName": "SignName",
+    "Sms template must contain parameters: ": "Шаблон СМС должен содержать параметры: ",
+    "Bark Endpoint": "Bark Endpoint",
+    "Bark Group": "Bark Group",
+    "Bark Sound": "Bark Sound",
+    "WebHookUrl": "WebHookUrl",
+    "SecretKey": "Секретный Ключ",
+    "For safety, must use secret key": "В целях безопасности необходимо использовать секретный ключ",
+    "Device Token": "Токен устройства",
+    "Platform": "Платформа",
+    "iOS": "iOS",
+    "Android": "Android",
+    "Huawei": "Huawei",
+    "High": "High",
+    "Retry": "Повторить",
+    "Topic": "Тема",
+    "WeCom Bot Key": "WeCom Bot Key",
+    "User": "Пользователь",
+    "Installed": "Установлено",
+    "Not installed": "Не установлено",
+    "Running": "Запускается",
+    "Not running": "Не запускается",
+    "Remove Token": "Удалить токен",
+    "Start": "Запустить",
+    "Stop": "Остановить",
+    "Uptime Kuma": "Uptime Kuma",
+    "Slug": "Slug",
+    "Accept characters:": "Принимаемые символы:",
+    "startOrEndWithOnly": "Начинается или кончается только {0}",
+    "No consecutive dashes": "Без последовательных тире",
+    "The slug is already taken. Please choose another slug.": "The slug is already taken. Please choose another slug.",
+    "Page Not Found": "Страница не найдена",
+    "wayToGetCloudflaredURL": "(Скачать cloudflared с {0})",
+    "cloudflareWebsite": "Cloudflare Website",
+    "Message:": "Сообщение:",
+    "Don't know how to get the token? Please read the guide:": "Don't know how to get the token? Please read the guide:",
+    "The current connection may be lost if you are currently connecting via Cloudflare Tunnel. Are you sure want to stop it? Type your current password to confirm it.": "The current connection may be lost if you are currently connecting via Cloudflare Tunnel. Are you sure want to stop it? Type your current password to confirm it.",
+    "HTTP Headers": "HTTP заголовки",
+    "Trust Proxy": "Доверять прокси",
+    "Other Software": "Другое программное обеспечение",
+    "For example: nginx, Apache and Traefik.": "К примеру: nginx, Apache и Traefik.",
+    "Please read": "Пожалуйста, прочитайте",
+    "Subject:": "Тема:",
+    "Valid To:": "Действителен до:",
+    "Days Remaining:": "Дней осталось:",
+    "Issuer:": "Издатель:",
+    "Fingerprint:": "Отпечаток:",
+    "No status pages": "Нет статусных страниц",
+    "Domain Name Expiry Notification": "Уведомление об истечении срока действия доменного имени",
+    "Proxy": "Прокси",
+    "Date Created": "Дата создания",
+    "HomeAssistant": "Home Assistant",
+    "onebotHttpAddress": "OneBot HTTP Address",
+    "onebotMessageType": "OneBot Message Type",
+    "onebotGroupMessage": "Группа",
+    "onebotPrivateMessage": "Private",
+    "onebotUserOrGroupId": "Группа/ID пользователя",
+    "onebotSafetyTips": "В целях безопасности необходимо установить токен доступа",
+    "PushDeer Key": "PushDeer Key",
+    "Footer Text": "Текст нижнего колонтитула",
+    "Show Powered By": "Показывать на чем создано",
+    "Domain Names": "Доменные имена",
+    "signedInDisp": "Вы вошли как {0}",
+    "signedInDispDisabled": "Аутентификация отключена.",
+    "RadiusSecret": "Секрет Radius",
+    "RadiusSecretDescription": "Общий секрет между клиентом и сервером",
+    "RadiusCalledStationId": "Идентификатор вызываемой станции",
+    "RadiusCalledStationIdDescription": "Идентификатор вызываемого устройства",
+    "RadiusCallingStationId": "Идентификатор вызывающей станции",
+    "RadiusCallingStationIdDescription": "Идентификатор вызывающего устройства",
+    "Certificate Expiry Notification": "Уведомление об истечении срока действия сертификата",
+    "API Username": "Имя пользователя API",
+    "API Key": "API ключ",
+    "Recipient Number": "Номер получателя",
+    "From Name/Number": "Имя/номер отправителя",
+    "Leave blank to use a shared sender number.": "Оставьте пустым, чтобы использовать общий номер отправителя.",
+    "Octopush API Version": "Версия API Octopush",
+    "Legacy Octopush-DM": "Legacy Octopush-DM",
+    "endpoint": "endpoint",
+    "octopushAPIKey": "\"API key\" из учетных данных HTTP API в панели управления",
+    "octopushLogin": "\"Login\" из учетных данных HTTP API в панели управления",
+    "promosmsLogin": "Логин API",
+    "promosmsPassword": "Пароль API",
+    "pushoversounds pushover": "Pushover (default)",
+    "pushoversounds bike": "Bike",
+    "pushoversounds bugle": "Bugle",
+    "pushoversounds cashregister": "Cash Register",
+    "pushoversounds classical": "Classical",
+    "pushoversounds cosmic": "Cosmic",
+    "pushoversounds falling": "Falling",
+    "pushoversounds gamelan": "Gamelan",
+    "pushoversounds incoming": "Incoming",
+    "pushoversounds intermission": "Intermission",
+    "pushoversounds magic": "Magic",
+    "pushoversounds mechanical": "Mechanical",
+    "pushoversounds pianobar": "Piano Bar",
+    "pushoversounds siren": "Siren",
+    "pushoversounds spacealarm": "Space Alarm",
+    "pushoversounds tugboat": "Tug Boat",
+    "pushoversounds alien": "Alien Alarm (long)",
+    "pushoversounds climb": "Climb (long)",
+    "pushoversounds persistent": "Persistent (long)",
+    "pushoversounds echo": "Pushover Echo (long)",
+    "pushoversounds updown": "Up Down (long)",
+    "pushoversounds vibrate": "Vibrate Only",
+    "pushoversounds none": "None (silent)",
+    "pushyAPIKey": "Secret API Key",
+    "pushyToken": "Токен устройства",
+    "Using a Reverse Proxy?": "Используете обратный прокси?",
+    "Check how to config it for WebSocket": "Проверьте, как настроить его для WebSocket",
+    "Steam Game Server": "Steam Game Server",
+    "Most likely causes:": "Наиболее вероятные причины:",
+    "The resource is no longer available.": "Ресурс больше не доступен.",
+    "There might be a typing error in the address.": "В адресе может быть опечатка.",
+    "What you can try:": "Что вы можете попробовать:",
+    "Retype the address.": "Повторите адрес.",
+    "Go back to the previous page.": "Вернуться на предыдущую страницу.",
+    "Coming Soon": "Скоро",
+    "wayToGetClickSendSMSToken": "Вы можете получить имя пользователя API и ключ API из {0} .",
+    "Connection String": "Строка подключения",
+    "Query": "Запрос",
+    "settingsCertificateExpiry": "Истекание TLS сертификата",
+    "certificationExpiryDescription": "HTTPS Мониторы инициируют уведомление, когда срок действия сертификата TLS истечет:",
+    "Setup Docker Host": "Настроить Docker Host",
+    "Connection Type": "Тип соединения",
+    "Docker Daemon": "Docker Daemon",
+    "deleteDockerHostMsg": "Are you sure want to delete this docker host for all monitors?",
+    "socket": "Socket",
+    "tcp": "TCP / HTTP",
+    "Docker Container": "Docker контейнер",
+    "Container Name / ID": "Название контейнера / ID",
+    "Docker Host": "Docker Host",
+    "Docker Hosts": "Docker Hosts",
+    "ntfy Topic": "ntfy Topic",
+    "Domain": "Домен",
+    "Workstation": "Workstation",
+    "disableCloudflaredNoAuthMsg": "Вы находитесь в режиме без авторизации, пароль не требуется.",
+    "trustProxyDescription": "Доверять заголовкам 'X-Forwarded-*'. Если вы хотите получить правильный IP-адрес клиента, а ваш Uptime Kuma находится под Nginx или Apache, вам следует включить этот параметр.",
+    "wayToGetLineNotifyToken": "Вы можете получить токен доступа в {0}",
+    "Examples": "Примеры",
+    "Home Assistant URL": "Home Assistant URL",
+    "Long-Lived Access Token": "Токен доступа с длительным сроком службы",
+    "Long-Lived Access Token can be created by clicking on your profile name (bottom left) and scrolling to the bottom then click Create Token. ": "Long-Lived Access Token can be created by clicking on your profile name (bottom left) and scrolling to the bottom then click Create Token. ",
+    "Notification Service": "Служба уведомлений",
+    "default: notify all devices": "по стандарту: уведомлять все устройства",
+    "A list of Notification Services can be found in Home Assistant under \"Developer Tools > Services\" search for \"notification\" to find your device/phone name.": "Список служб уведомлений можно найти в Home Assistant в разделе \"Инструменты разработчика > Службы\", выполнив поиск по слову \"уведомление\", чтобы найти название вашего устройства/телефона.",
+    "Automations can optionally be triggered in Home Assistant:": "При желании автоматизацию можно активировать в Home Assistant.:",
+    "Trigger type:": "Тип триггера:",
+    "Event type:": "Тип события:",
+    "Event data:": "Данные события:",
+    "Then choose an action, for example switch the scene to where an RGB light is red.": "Затем выберите действие, например, переключите сцену на красный индикатор RGB..",
+    "Frontend Version": "Версия интерфейса",
+    "Frontend Version do not match backend version!": "Версия интерфейса не соответствует версии серверной части!",
+    "Base URL": "Базовый URL",
+    "goAlertInfo": "GoAlert is a An open source application for on-call scheduling, automated escalations and notifications (like SMS or voice calls). Automatically engage the right person, the right way, and at the right time! {0}",
+    "goAlertIntegrationKeyInfo": "Получить общий ключ интеграции API для сервиса в этом формате \"aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee\" обычно значение параметра токена скопированного URL.",
+    "goAlert": "GoAlert",
+    "backupOutdatedWarning": "Устарело: поскольку добавлено множество функций, а эта функция резервного копирования немного не поддерживается, она не может создать или восстановить полную резервную копию.",
+    "backupRecommend": "Сделайте резервную копию тома или папки с данными (./data/) напрямую.",
+    "Optional": "Необязательно",
+    "squadcast": "Squadcast",
+    "SendKey": "SendKey",
+    "SMSManager API Docs": "Документация к API SMSManager ",
+    "Gateway Type": "Тип шлюза",
+    "SMSManager": "SMSManager",
+    "You can divide numbers with": "Вы можете делить числа с",
+    "or": "или",
+    "Maintenance": "Обслуживание",
+    "Schedule maintenance": "Запланировать обслуживание",
+    "affectedMonitorsDescription": "Выберите мониторы, которые будут затронуты во время обслуживания",
+    "affectedStatusPages": "Показывать уведомление об обслуживании на выбранных страницах статуса",
+    "atLeastOneMonitor": "Выберите больше одного затрагиваемого монитора",
+    "dnsPortDescription": "По умолчанию порт DNS сервера - 53. Мы можете изменить его в любое время.",
+    "Monitor": "Монитор | Мониторы",
+    "webhookAdditionalHeadersTitle": "Дополнительные Заголовки",
+    "recurringIntervalMessage": "Запускать 1 раз каждый день | Запускать 1 раз каждые {0} дней",
+    "error": "ошибка",
+    "statusMaintenance": "Обслуживание",
+    "Affected Monitors": "Затронутые мониторы",
+    "Start of maintenance": "Начало обслуживания",
+    "All Status Pages": "Все страницы статусов",
+    "Select status pages...": "Выберите страницу статуса…",
+    "resendEveryXTimes": "Повтор каждые {0} раз",
+    "resendDisabled": "Повторная отправка отключена",
+    "deleteMaintenanceMsg": "Вы действительно хотите удалить это обслуживание?",
+    "critical": "критично",
+    "Custom Monitor Type": "Собственный тип монитора",
+    "markdownSupported": "Поддерживает синтаксис Markdown",
+    "Passive Monitor Type": "Пассивный тип монитора",
+    "Specific Monitor Type": "Специфичный тип монитора",
+    "Help": "Помощь",
+    "Game": "Игра",
+    "Resend Notification if Down X times consequently": "Повторно отправить уведомление, если не работает X раз подряд",
+    "General Monitor Type": "Основной тип монитора",
+    "weekdayShortWed": "Ср",
+    "weekdayShortThu": "Чт",
+    "weekdayShortFri": "Пт",
+    "weekdayShortSat": "Сб",
+    "weekdayShortSun": "Вс",
+    "dayOfMonth": "День месяца",
+    "Pick Affected Monitors...": "Выберите затронутые мониторы…",
+    "Custom": "Пользовательский",
+    "successMessage": "Сообщение об успехе",
+    "successMessageExplanation": "Сообщение MQTT, которое может рассматриваться как успешное",
+    "Custom CSS": "Пользовательские CSS",
+    "weekdayShortTue": "Вт",
+    "dayOfWeek": "День недели",
+    "confirmDeleteTagMsg": "Вы уверены, что хотите удалить этот тег? Мониторы с этим тегом удалены не будут.",
+    "loadingError": "Невозможно получить данные, пожалуйста попробуйте позже.",
+    "Packet Size": "Размер пакета",
+    "warningTimezone": "Используется часовой пояс сервера",
+    "weekdayShortMon": "Пн",
+    "ZohoCliq": "ZohoCliq",
+    "strategyManual": "Активен/Неактивен Вручную",
+    "lastDay": "Последний день",
+    "lastDay1": "Последний день месяца",
+    "lastDay2": "Второй последний день месяца",
+    "lastDay3": "Третий последний день месяца",
+    "lastDay4": "Четвертый последний день месяца",
+    "No Maintenance": "Ничего не обслуживается",
+    "pauseMaintenanceMsg": "Вы уверены что хотите поставить на паузу?",
+    "maintenanceStatus-under-maintenance": "На техобслуживании",
+    "maintenanceStatus-inactive": "Неактивен",
+    "maintenanceStatus-scheduled": "Запланирован(о)",
+    "maintenanceStatus-ended": "Закончился(ось)",
+    "maintenanceStatus-unknown": "Неизвестен",
+    "Display Timezone": "Показать часовой пояс",
+    "Server Timezone": "Часовой пояс сервера",
+    "statusPageMaintenanceEndDate": "Конец",
+    "IconUrl": "URL Иконки",
+    "Enable DNS Cache": "Включить DNS кэш",
+    "Enable": "Включить",
+    "Disable": "Отключить",
+    "Single Maintenance Window": "Единое Окно Обслуживания",
+    "Schedule Maintenance": "Запланировать обслуживание",
+    "Date and Time": "Дата и Время",
+    "DateTime Range": "Промежуток Даты и Времени",
+    "uninstalling": "Удаляется",
+    "dataRetentionTimeError": "Период хранения должен быть равен 0 или больше",
+    "infiniteRetention": "Установите 0 для бессрочного хранения.",
+    "enableGRPCTls": "Разрешить отправлять gRPC запрос через TLS соединение",
+    "Free Mobile API Key": "API ключ Free Mobile",
+    "Edit Tag": "Редактировать тэг",
+    "webhookAdditionalHeadersDesc": "Устанавливает дополнительные заголовки, отправляемые с помощью веб-хука.",
+    "topic": "Тема",
+    "Customize": "Персонализировать",
+    "Custom Footer": "Пользовательский footer",
+    "dnsCacheDescription": "Это может не работать на некоторых IPv6 окружениях, отключите это, если у вас возникают проблемы.",
+    "confirmUninstallPlugin": "Вы уверены, что хотите удалить этот плагин?",
+    "plugin": "Плагин | Плагины",
+    "install": "Установить",
+    "installing": "Устанавливается",
+    "uninstall": "Удалить",
+    "Recurring": "Повторяющийся",
+    "recurringInterval": "Интервал"
+}
diff --git a/src/lang/sl-SI.json b/src/lang/sl-SI.json
new file mode 100644
index 000000000..f4ca81bd6
--- /dev/null
+++ b/src/lang/sl-SI.json
@@ -0,0 +1,356 @@
+{
+    "languageName": "Slovenščina",
+    "checkEverySecond": "Preveri na vsakih {0} sekund",
+    "retryCheckEverySecond": "Ponovno poskusi na vsakih {0} sekund",
+    "retriesDescription": "Maksimalno število poskusov predenj se storitev označi kot 'ne deluje' in se pošlje obvestilo",
+    "ignoreTLSError": "Ignoriraj TLS/SSL napake za HTTPS spletne strani",
+    "upsideDownModeDescription": "Negiraj status. Če je storitev deluje bo označena kot 'ne deluje'.",
+    "maxRedirectDescription": "Maksimalno število sledečih preusmeritev. 0 onemogoči preusmeritve.",
+    "acceptedStatusCodesDescription": "Izberi kode statusa veljavna kot uspešen odgovor.",
+    "passwordNotMatchMsg": "Ponovljeno geslo se ne ujema.",
+    "notificationDescription": "Obvestila morajo biti dodeljena monitorju, da delujejo.",
+    "keywordDescription": "Iskana ključna beseda v surovem HTML ali JSON odgovoru. Iskanje je občutljivo na začetnico.",
+    "pauseDashboardHome": "Pavza",
+    "deleteMonitorMsg": "Ste prepričani, da želite izbrisati ta monitor?",
+    "deleteNotificationMsg": "Ste prepričani, da želite izbrisati to obvestilo za vse monitorje?",
+    "resolverserverDescription": "Cloudflare je privzeti strežnik. DNS strežnik lahko spremenite kadarkoli.",
+    "rrtypeDescription": "Izberite RR tip, ki ga želite spremljati",
+    "pauseMonitorMsg": "Ste prepričani, da želite pavzirati?",
+    "enableDefaultNotificationDescription": "To obvestilo bo kot privzeto omogočeno za vse nove monitorje. Še vedno ga lahko izključite posebej za vsak monitor.",
+    "clearEventsMsg": "Ste prepričani da želite izbrisati vse dogodke tega monitorja?",
+    "clearHeartbeatsMsg": "Ste prepričani da želite izbrisati vse srčne utripe tega monitorja?",
+    "confirmClearStatisticsMsg": "Ste prepričani da želite izbrisati VSO statistiko?",
+    "importHandleDescription": "Izberite 'Preskoči obstoječe', če želite preskočiti vsak monitor ali obvestilo z istim imenom. 'Prepiši' bo prepisal vse obstoječe monitorje in obvestila.",
+    "confirmImportMsg": "Ste prepričani da želite uvoziti varnostno kopijo? Preverite da ste izbrali pravo opcijo za uvoz.",
+    "twoFAVerifyLabel": "Prosimo vnesite žeton za potrditev 2FA:",
+    "tokenValidSettingsMsg": "Žeton je veljaven! Sedaj lahko shranite 2FA nastavitev.",
+    "confirmEnableTwoFAMsg": "Ste prepričani, da želite omogočiti 2FA?",
+    "confirmDisableTwoFAMsg": "Ste prepričani, da želite onemogočiti 2FA?",
+    "Settings": "Nastavitve",
+    "Dashboard": "Nadzorna plošča",
+    "New Update": "Nova posodobitev",
+    "Language": "Jezik",
+    "Appearance": "Izgled",
+    "Theme": "Teme",
+    "General": "Splošno",
+    "Primary Base URL": "Primaren URL",
+    "Version": "Različica",
+    "Check Update On GitHub": "Preveri posodobitev na GitHub-u",
+    "List": "Seznam",
+    "Add": "Dodaj",
+    "Add New Monitor": "Dodaj nov monitor",
+    "Quick Stats": "Hitro stanje",
+    "Up": "Deluje",
+    "Down": "Ne deluje",
+    "Pending": "Na čakanju",
+    "Unknown": "Neznano",
+    "Pause": "Pavza",
+    "Name": "Ime",
+    "Status": "Status",
+    "DateTime": "DateTime",
+    "Message": "Sporočilo",
+    "No important events": "Ni pomembnih dogodkov",
+    "Resume": "Nadaljuj",
+    "Edit": "Uredi",
+    "Delete": "Izbriši",
+    "Current": "Trenutno",
+    "Uptime": "Uptime",
+    "Cert Exp.": "Potek certifikata",
+    "day": "dan | dni",
+    "-day": "-dni",
+    "hour": "ura",
+    "-hour": "-ur",
+    "Response": "Odgovor",
+    "Ping": "Ping",
+    "Monitor Type": "Tip monitorja",
+    "Keyword": "Ključna beseda",
+    "Friendly Name": "Ime za prikaz",
+    "URL": "URL",
+    "Hostname": "Hostname",
+    "Port": "Vrata",
+    "Heartbeat Interval": "Interval srčnega utripa",
+    "Retries": "Ponovni poskusi",
+    "Heartbeat Retry Interval": "Ponovni poskus srčnega utripa",
+    "Advanced": "Napredno",
+    "Upside Down Mode": "Negiran način",
+    "Max. Redirects": "Max. preusmeritev",
+    "Accepted Status Codes": "Sprejete kode statusa",
+    "Push URL": "Push URL",
+    "needPushEvery": "Pokliči ta URL vsakih {0} sekund.",
+    "pushOptionalParams": "Dodatni parametri: {0}",
+    "Save": "Shrani",
+    "Notifications": "Obvestila",
+    "Not available, please setup.": "Ni na voljo, prosimo nastavite.",
+    "Setup Notification": "Nastavi obvestila",
+    "Light": "Svetlo",
+    "Dark": "Temno",
+    "Auto": "Auto",
+    "Theme - Heartbeat Bar": "Tema - vrstica srčnega utripa",
+    "Normal": "Normalna",
+    "Bottom": "Spodaj",
+    "None": "Brez",
+    "Timezone": "Časovni pas",
+    "Search Engine Visibility": "Vidljivost v spletnih iskalnikih",
+    "Allow indexing": "Dovoli indeksiranje",
+    "Discourage search engines from indexing site": "Odvračaj spletne iskalnike od indeksiranja te strani",
+    "Change Password": "Zamenjaj geslo",
+    "Current Password": "Trenutno geslo",
+    "New Password": "Novo geslo",
+    "Repeat New Password": "Ponovi novo geslo",
+    "Update Password": "Posodobi geslo",
+    "Disable Auth": "Onemogoči auth",
+    "Enable Auth": "Omogoči auth",
+    "disableauth.message1": "Ali ste prepričani, da želite onemogočiti <strong>avtentikacijo</strong>?",
+    "disableauth.message2": "Namenjen je <strong>nekomu, ki ima pred programom Uptime Kuma vklopljeno zunanje preverjanje pristnosti</strong>, na primer Cloudflare Access.",
+    "Please use this option carefully!": "Uporabljajte previdno.",
+    "Logout": "Odjava",
+    "Leave": "Zapusti",
+    "I understand, please disable": "Razumem, prosim onemogočite",
+    "Confirm": "Potrdi",
+    "Yes": "Da",
+    "No": "Ne",
+    "Username": "Uporabniško ime",
+    "Password": "Geslo",
+    "Remember me": "Zapomni si me",
+    "Login": "Vpis",
+    "No Monitors, please": "Prosim, brez monitorjev",
+    "add one": "Dodaj enega",
+    "Notification Type": "Tip obvestila",
+    "Email": "Email",
+    "Test": "Test",
+    "Certificate Info": "Informacije certifikata",
+    "Resolver Server": "Strežnik za razreševanje",
+    "Resource Record Type": "Vrsta zapisa o viru",
+    "Last Result": "Zadnji rezultat",
+    "Create your admin account": "Ustvari administratorski račun",
+    "Repeat Password": "Ponovi geslo",
+    "Import Backup": "Uvozi varnostno kopijo",
+    "Export Backup": "Izvozi varnostno kopijo",
+    "Export": "Izvozi",
+    "Import": "Uvozi",
+    "respTime": "Odzivni čas (ms)",
+    "notAvailableShort": "N/A",
+    "Default enabled": "Privzeto omogočeno",
+    "Apply on all existing monitors": "Uporabi na vseh obstoječih monitorjih",
+    "Create": "Ustvari",
+    "Clear Data": "Izbriši podatke",
+    "Events": "Dogodki",
+    "Heartbeats": "Srčni utripi",
+    "Auto Get": "Auto Get",
+    "backupDescription": "Izvozite lahko vse monitorje in obvestila v JSON datoteko.",
+    "backupDescription2": "Pomni: Zgodovina in podatki dogodkov niso vključeni.",
+    "backupDescription3": "Občutljivi podatki, kot žetoni za obvestila so vlkjučeni v datoteko za izvoz; prosimo hranite na varnem.",
+    "alertNoFile": "Izberite datoteko za Uvoz.",
+    "alertWrongFileType": "Prosimo izberite JSON datoteko.",
+    "Clear all statistics": "Pobrišite vso statistiko",
+    "Skip existing": "Preskoči obstoječe",
+    "Overwrite": "Prepiši",
+    "Options": "Možnosti",
+    "Keep both": "Ohrani oboje",
+    "Verify Token": "Potrdi žeton",
+    "Setup 2FA": "Nastavi 2FA",
+    "Enable 2FA": "Omogoči 2FA",
+    "Disable 2FA": "Onemogoči 2FA",
+    "2FA Settings": "2FA nastavitve",
+    "Two Factor Authentication": "Preverjanje pristnosti z dvema dejavnikoma",
+    "Active": "Aktivno",
+    "Inactive": "Neaktivno",
+    "Token": "Žeton",
+    "Show URI": "Prikaži URI",
+    "Tags": "Značke",
+    "Add New below or Select...": "Dodaj novo spodaj ali izberi iz seznama...",
+    "Tag with this name already exist.": "Značka s tem imenom že obstaja.",
+    "Tag with this value already exist.": "Značka s to vrednostjo že obstaja.",
+    "color": "barva",
+    "value (optional)": "vrednost (po želji)",
+    "Gray": "Siva",
+    "Red": "Rdeča",
+    "Orange": "Oranžna",
+    "Green": "Zelena",
+    "Blue": "Modra",
+    "Indigo": "Indigo",
+    "Purple": "Vijolična",
+    "Pink": "Roza",
+    "Search...": "Išči...",
+    "Avg. Ping": "Avg. Ping",
+    "Avg. Response": "Avg. odziv",
+    "Entry Page": "Vstopna stran",
+    "statusPageNothing": "Nikjer nič... Dodajte skupino ali monitor.",
+    "No Services": "Ni storitev",
+    "All Systems Operational": "Vsi sistemi delujejo",
+    "Partially Degraded Service": "Delno poslabšana storitev",
+    "Degraded Service": "Poslabšana storitev",
+    "Add Group": "Dodaj skupino",
+    "Add a monitor": "Dodaj monitor",
+    "Edit Status Page": "Uredi statusno stran",
+    "Go to Dashboard": "Pojdi na nadzorno ploščo",
+    "Status Page": "Statusna stran",
+    "Status Pages": "Statusne strani",
+    "defaultNotificationName": "Moje {notification} Obvestilo ({number})",
+    "here": "tukaj",
+    "Required": "Obvezno",
+    "telegram": "Telegram",
+    "Bot Token": "Robotkov žetonček",
+    "wayToGetTelegramToken": "Lahko dobiš žeton od {0}.",
+    "Chat ID": "ID pogovora",
+    "supportTelegramChatID": "Direkten pogovor pomoči / Skupina / ID kanala",
+    "wayToGetTelegramChatID": "Id lahko dobiš, če pošlješ sporočilo robotku in odpreš ta URL, da bi videl chat_id:",
+    "YOUR BOT TOKEN HERE": "ROBOTKOV ŽETON TUKAJ",
+    "chatIDNotFound": "Ne najdem Chat Id-ja; prvo pošlji sporočilo robotku",
+    "webhook": "Webhook",
+    "Post URL": "Post URL",
+    "Content Type": "Vrsta vsebine",
+    "webhookJsonDesc": "{0} je v redu za vsak moderen HTTP strežnik, kot recimo Express.js",
+    "webhookFormDataDesc": "{multipart} je v redu za PHP. JSON bo moral biti razčlenjen s {decodeFunction}",
+    "smtp": "Email (SMTP)",
+    "secureOptionNone": "Brez / STARTTLS (25, 587)",
+    "secureOptionTLS": "TLS (465)",
+    "Ignore TLS Error": "Ignoriraj TLS napako",
+    "From Email": "Od Email",
+    "emailCustomSubject": "Poljubna zadeva",
+    "To Email": "Za Email",
+    "smtpCC": "CC",
+    "smtpBCC": "BCC",
+    "discord": "Discord",
+    "Discord Webhook URL": "Discord Webhook URL",
+    "wayToGetDiscordURL": "To lahko dibiš v Server Settings -> Integrations -> Create Webhook",
+    "Bot Display Name": "Prikazno ime robotka",
+    "Prefix Custom Message": "Predpona poljubnega sporočila",
+    "Hello @everyone is...": "Pozdravljen {'@'}everyone je...",
+    "teams": "Microsoft Teams",
+    "Webhook URL": "Webhook URL",
+    "wayToGetTeamsURL": "Izvedi kako narediš webhook URL {0}.",
+    "signal": "Signal",
+    "Number": "Številka",
+    "Recipients": "Prejemniki",
+    "needSignalAPI": "Imeti moraš signal klienta z REST API.",
+    "wayToCheckSignalURL": "Kako se to naredi, lahko preveriš na tem URL-ju:",
+    "signalImportant": "POMEMBNO: Ne moreš mešati skupin in številk v prejemnikih!",
+    "gotify": "Gotify",
+    "Application Token": "Žeton za aplikacijo",
+    "Server URL": "URL Strežnika",
+    "Priority": "Prioriteta",
+    "slack": "Slack",
+    "Icon Emoji": "Emoji ikona",
+    "Channel Name": "Ime kanala",
+    "Uptime Kuma URL": "Uptime Kuma URL",
+    "aboutWebhooks": "Več o webhook-ih: {0}",
+    "aboutChannelName": "Vnesi ime kanala na {0} Channel Name polje, če želiš preskočiti webhook kanal. npr.: #drug-kanal",
+    "aboutKumaURL": "Če pustite polje Uptime Kuma URL prazno, bo nastavljeno privzeto na GitHub stran projekta.",
+    "emojiCheatSheet": "Emoji plonk listek: {0}",
+    "rocket.chat": "Rocket.Chat",
+    "pushover": "Pushover",
+    "pushy": "Pushy",
+    "octopush": "Octopush",
+    "promosms": "PromoSMS",
+    "clicksendsms": "ClickSend SMS",
+    "lunasea": "LunaSea",
+    "apprise": "Apprise (podpira 50+ storitev za obveščevanje)",
+    "pushbullet": "Pushbullet",
+    "line": "Line Messenger",
+    "mattermost": "Mattermost",
+    "User Key": "User Key",
+    "Device": "Naprava",
+    "Message Title": "Naslov sporočila",
+    "Notification Sound": "Zvok obvestila",
+    "More info on:": "Več informacij na: {0}",
+    "pushoverDesc1": "Prioriteta nujnosti (2) ima privzeto nastavitev 30 sekund časa med ponovni poskusi in poteče po 1 uri.",
+    "pushoverDesc2": "Če želite pošiljati obvestila na različne naprave izpolnite polje 'Naprava'.",
+    "SMS Type": "Vrsta SMS-a",
+    "octopushTypePremium": "Premium (hitro - priporočljivo za opozarjanje)",
+    "octopushTypeLowCost": "Cenovno ugodno (počasno - včasih jih blokira operater)",
+    "checkPrice": "preveri {0} cene:",
+    "apiCredentials": "API poverilnice",
+    "octopushLegacyHint": "Uporabljate legacy verzijo Octopush-a (2011-2020) ali novo verzijo?",
+    "Check octopush prices": "Preveri octopush cene {0}.",
+    "octopushPhoneNumber": "Telefonska številka (npr.: +386031234567) ",
+    "octopushSMSSender": "Ime SMS pošiljatelja: 3-11 alfanumeričnih znakov in presledki (a-zA-Z0-9)",
+    "LunaSea Device ID": "LunaSea Device ID",
+    "Apprise URL": "Apprise URL",
+    "Example:": "Primer: {0}",
+    "Read more:": "Preberi več: {0}",
+    "Status:": "Status: {0}",
+    "Read more": "Preberi več",
+    "appriseInstalled": "Apprise je nameščen.",
+    "appriseNotInstalled": "Apprise ni nameščen. {0}",
+    "Access Token": "Žeton za dostop",
+    "Channel access token": "Žeton za dostop do kanala",
+    "Line Developers Console": "Line Developers Console",
+    "lineDevConsoleTo": "Line Developers Console - {0}",
+    "Basic Settings": "Osnovne nastavitve",
+    "User ID": "User ID",
+    "Messaging API": "Messaging API",
+    "wayToGetLineChannelToken": "Prvo odpri {0}, ustvarite ponudnika in kanal (Messaging API), potem lahko žeton za dostop do kanala in ID uporabnika dobite iz zgoraj navedenih elementov menija.",
+    "Icon URL": "URL ikone",
+    "aboutIconURL": "V razdelku \"URL ikone\" lahko zagotovite povezavo do slike, ki bo nadomestila privzeto sliko profila. Ne bo uporabljena, če je nastavljena ikona Emoji.",
+    "aboutMattermostChannelName": "V razdelku \"URL ikone\" lahko zagotovite povezavo do slike, ki bo nadomestila privzeto sliko profila. Ne bo uporabljena, če je nastavljena ikona Emoji",
+    "matrix": "Matrix",
+    "promosmsTypeEco": "SMS ECO - poceni, vendar počasen in pogosto preobremenjen. Omejeno samo na poljske prejemnike.",
+    "promosmsTypeFlash": "SMS FLASH - sporočilo se samodejno prikaže v napravi prejemnika. Omejeno samo na poljske prejemnike.",
+    "promosmsTypeFull": "SMS FULL - Premium raven SMS, Uporabite lahko svoje ime pošiljatelja (najprej morate registrirati ime). Zanesljivo za opozorila.",
+    "promosmsTypeSpeed": "SMS SPEED - Najvišja prednost v sistemu. Zelo hitro in zanesljivo, vendar drago (približno dvakratnik cene SMS FULL)..",
+    "promosmsPhoneNumber": "Telefonska številka (za poljskega prejemnika Lahko preskočite področne oznake",
+    "promosmsSMSSender": "Ime pošiljatelja SMS : vnaprej registrirano ime ali eno od privzetih: SMS, SMS Info, MaxSMS, INFO, SMS",
+    "Feishu WebHookUrl": "Feishu WebHookURL",
+    "matrixHomeserverURL": "Homeserver URL (z http(s):// in vrata po želji)",
+    "Internal Room Id": "Interni ID sobe",
+    "matrixDesc1": "Notranji ID sobe lahko poiščete v naprednem razdelku nastavitev sobe v odjemalcu Matrix. Izgledati mora kot !QMdRCpUIfLwsfjxye6:home.server",
+    "matrixDesc2": "Zelo priporočljivo je, da ustvarite novega uporabnika in ne uporabljate svojega žetona za dostop uporabnika Matrix, saj bo omogočil popoln dostop do vašega računa in vseh sob, ki ste se jim pridružili. Namesto tega ustvarite novega uporabnika in ga povabite le v sobo, v kateri želite prejemati obvestila. Token dostopa lahko dobite tako, da zaženete {0}",
+    "Method": "Metoda",
+    "Body": "Telo",
+    "Headers": "Glave",
+    "PushUrl": "Push URL",
+    "HeadersInvalidFormat": "Glave zahtevka niso veljavni JSON: ",
+    "BodyInvalidFormat": "Telo zahteve ni veljaven JSON: ",
+    "Monitor History": "Zgodovina",
+    "clearDataOlderThan": "Ohrani zgodovino {0} dni.",
+    "PasswordsDoNotMatch": "Gesli se ne ujemata.",
+    "records": "vnosi",
+    "One record": "En vnos",
+    "steamApiKeyDescription": "Za spremljanje igralnega strežnika Steam potrebujete ključ spletnega vmesnika Steam. Ključ API lahko registrirate tukaj: ",
+    "Current User": "Trenuten uporabnik",
+    "recent": "Nedavno",
+    "Done": "Zaključi",
+    "Info": "Info",
+    "Security": "Varnost",
+    "Steam API Key": "Steam API Key",
+    "Shrink Database": "Stisni bazo",
+    "Pick a RR-Type...": "Izberi RR tip...",
+    "Pick Accepted Status Codes...": "Izbiranje sprejetih kod stanja...",
+    "Default": "Privzeto",
+    "HTTP Options": "HTTP možnosti",
+    "Create Incident": "Ustvari incident",
+    "Title": "Naslov",
+    "Content": "Vsebina",
+    "Style": "Stil",
+    "info": "info",
+    "warning": "opozorilo",
+    "danger": "nevarnost",
+    "primary": "primarno",
+    "light": "svetlo",
+    "dark": "temno",
+    "Post": "Objavi",
+    "Please input title and content": "Vnesi naslov in vsebino",
+    "Created": "Ustvarjeno",
+    "Last Updated": "Nazadnje posodobljeno",
+    "Unpin": "Odpni",
+    "Switch to Light Theme": "Preklopi na svetlo temo",
+    "Switch to Dark Theme": "Preklopi na temno temo",
+    "Show Tags": "Prikaži značke",
+    "Hide Tags": "Skrij značke",
+    "Description": "Opis",
+    "No monitors available.": "Nobenega monitorja ni na voljo.",
+    "Add one": "Dodaj enega",
+    "No Monitors": "Ni monitorjev",
+    "Untitled Group": "Skupina brez imena",
+    "Services": "Storitve",
+    "Discard": "zavrzi",
+    "Cancel": "Prekliči",
+    "Powered by": "Powered by",
+    "shrinkDatabaseDescription": "Sprožitev podatkovne zbirke VACUUM za SQLite. Če je vaša zbirka podatkov ustvarjena po različici 1.10.0, je funkcija AUTO_VACUUM že omogočena in ta ukrep ni potreben.",
+    "serwersms": "SerwerSMS.pl",
+    "serwersmsAPIUser": "API uporabniško ime (vključno z webapi_ prefix)",
+    "serwersmsAPIPassword": "API geslo",
+    "serwersmsPhoneNumber": "Telefonska številka",
+    "serwersmsSenderName": "Ime SMS pošiljatelja (registrirani prek portala za stranke)"
+}
diff --git a/src/lang/sq.json b/src/lang/sq.json
new file mode 100644
index 000000000..a513329aa
--- /dev/null
+++ b/src/lang/sq.json
@@ -0,0 +1,25 @@
+{
+    "Settings": "Opsione",
+    "Dashboard": "FaqeKryesore",
+    "Help": "Ndihma",
+    "Language": "Gjuha",
+    "Appearance": "Paraqitja",
+    "Theme": "Theme",
+    "General": "Te pergjithshme",
+    "Game": "Loje",
+    "Primary Base URL": "ULR Baze Primare",
+    "List": "List",
+    "Add": "Shto",
+    "Add New Monitor": "Shto Monitor te Ri",
+    "Quick Stats": "Statistika Flash",
+    "Up": "Lart",
+    "Down": "Poshte",
+    "Pending": "Ne Pritje",
+    "statusMaintenance": "Mirembatje",
+    "Maintenance": "Mirembajtje",
+    "Unknown": "Panjohur",
+    "languageName": "Shqip",
+    "New Update": "Update i ri",
+    "Version": "Version",
+    "Check Update On GitHub": "Kontrollo Update ne GitHub"
+}
diff --git a/src/lang/sr-latn.json b/src/lang/sr-latn.json
new file mode 100644
index 000000000..f5134477c
--- /dev/null
+++ b/src/lang/sr-latn.json
@@ -0,0 +1,113 @@
+{
+    "languageName": "Srpski",
+    "checkEverySecond": "Proveri svakih {0} sekundi.",
+    "retriesDescription": "Maksimum pokušaja pre nego što se servis obeleži kao neaktivan i pošalje se obaveštenje.",
+    "ignoreTLSError": "Ignoriši TLS/SSL greške za HTTPS veb stranice.",
+    "upsideDownModeDescription": "Obrnite status. Ako je servis dostupan, onda je obeležen kao neaktivan.",
+    "maxRedirectDescription": "Maksimani broj preusmerenja da se prate. Postavite na 0 da bi se isključila preusmerenja.",
+    "acceptedStatusCodesDescription": "Odaberite statusne kodove koji se smatraju uspešnim odgovorom.",
+    "passwordNotMatchMsg": "Ponovljena lozinka se ne poklapa.",
+    "notificationDescription": "Molim Vas postavite obaveštenje za masmatrače da bise aktivirali.",
+    "keywordDescription": "Pretraži ključnu reč u čistom html ili JSON odgovoru sa osetljivim velikim i malim slovima",
+    "pauseDashboardHome": "Pauziraj",
+    "deleteMonitorMsg": "Da li ste sigurni da želite da obrišete ovog posmatrača?",
+    "deleteNotificationMsg": "Da li ste sigurni d aželite da uklonite ovo obaveštenje za sve posmatrače?",
+    "resolverserverDescription": "Cloudflare je podrazumevani server. Možete promeniti server za raszrešavanje u bilo kom trenutku.",
+    "rrtypeDescription": "Odaberite RR-Type koji želite da posmatrate",
+    "pauseMonitorMsg": "Da li ste sigurni da želite da pauzirate?",
+    "Settings": "Podešavanja",
+    "Dashboard": "Komandna tabla",
+    "New Update": "Nova verzija",
+    "Language": "Jezik",
+    "Appearance": "Izgled",
+    "Theme": "Tema",
+    "General": "Opšte",
+    "Version": "Verzija",
+    "Check Update On GitHub": "Proverite novu verziju na GitHub-u",
+    "List": "Lista",
+    "Add": "Dodaj",
+    "Add New Monitor": "Dodaj novog posmatrača",
+    "Quick Stats": "Brze statistike",
+    "Up": "Aktivno",
+    "Down": "Neaktivno",
+    "Pending": "Nerešeno",
+    "Unknown": "Nepoznato",
+    "Pause": "Pauziraj",
+    "Name": "Ime",
+    "Status": "Status",
+    "DateTime": "Datum i vreme",
+    "Message": "Poruka",
+    "No important events": "Nema bitnih događaja",
+    "Resume": "Nastavi",
+    "Edit": "Izmeni",
+    "Delete": "Ukloni",
+    "Current": "Trenutno",
+    "Uptime": "Vreme rada",
+    "Cert Exp.": "Istek sert.",
+    "day": "dan | dana",
+    "-day": "-dana",
+    "hour": "sat",
+    "-hour": "-sata",
+    "Response": "Odgovor",
+    "Ping": "Ping",
+    "Monitor Type": "Tip posmatrača",
+    "Keyword": "Ključna reč",
+    "Friendly Name": "Prijateljsko ime",
+    "URL": "URL",
+    "Hostname": "Hostname",
+    "Port": "Port",
+    "Heartbeat Interval": "Interval otkucaja srca",
+    "Retries": "Pokušaji",
+    "Advanced": "Napredno",
+    "Upside Down Mode": "Naopak mod",
+    "Max. Redirects": "Maks. preusmerenja",
+    "Accepted Status Codes": "Prihvaćeni statusni kodovi",
+    "Save": "Sačuvaj",
+    "Notifications": "Obaveštenja",
+    "Not available, please setup.": "Nije dostupno, molim Vas podesite.",
+    "Setup Notification": "Postavi obaveštenje",
+    "Light": "Svetlo",
+    "Dark": "Tamno",
+    "Auto": "Automatsko",
+    "Theme - Heartbeat Bar": "Tema - Traka otkucaja srca",
+    "Normal": "Normalno",
+    "Bottom": "Dole",
+    "None": "Isključeno",
+    "Timezone": "Vremenska zona",
+    "Search Engine Visibility": "Vidljivost pretraživačima",
+    "Allow indexing": "Dozvoli indeksiranje",
+    "Discourage search engines from indexing site": "Odvraćajte pretraživače od indeksiranja sajta",
+    "Change Password": "Promeni lozinku",
+    "Current Password": "Trenutna lozinka",
+    "New Password": "Nova lozinka",
+    "Repeat New Password": "Ponovi novu lozinku",
+    "Update Password": "Izmeni lozinku",
+    "Disable Auth": "Isključi autentifikaciju",
+    "Enable Auth": "Uključi autentifikaciju",
+    "disableauth.message1": "Da li ste sigurni da želite da <strong>isključite autentifikaciju</strong>?",
+    "disableauth.message2": "To je za <strong>one koji imaju dodatu autentifikaciju</strong> ispred Uptime Kuma kao na primer Cloudflare Access.",
+    "Please use this option carefully!": "Molim Vas koristite ovo sa pažnjom.",
+    "Logout": "Odloguj se",
+    "Leave": "Izađi",
+    "I understand, please disable": "Razumem, molim te isključi",
+    "Confirm": "Potvrdi",
+    "Yes": "Da",
+    "No": "Ne",
+    "Username": "Korisničko ime",
+    "Password": "Lozinka",
+    "Remember me": "Zapamti me",
+    "Login": "Uloguj se",
+    "No Monitors, please": "Bez posmatrača molim",
+    "add one": "dodaj jednog",
+    "Notification Type": "Tip obaveštenja",
+    "Email": "E-pošta",
+    "Test": "Test",
+    "Certificate Info": "Informacije sertifikata",
+    "Resolver Server": "Razrešivački server",
+    "Resource Record Type": "Tip zapisa resursa",
+    "Last Result": "Poslednji rezultat",
+    "Create your admin account": "Naprivi administratorski nalog",
+    "Repeat Password": "Ponovite lozinku",
+    "respTime": "Vreme odg. (ms)",
+    "notAvailableShort": "N/A"
+}
diff --git a/src/lang/sr.json b/src/lang/sr.json
new file mode 100644
index 000000000..34bec92af
--- /dev/null
+++ b/src/lang/sr.json
@@ -0,0 +1,112 @@
+{
+    "languageName": "Српски",
+    "checkEverySecond": "Провери сваких {0} секунди.",
+    "retriesDescription": "Максимум покушаја пре него што се сервис обележи као неактиван и пошаље се обавештење.",
+    "ignoreTLSError": "Игнориши TLS/SSL грешке за HTTPS веб странице.",
+    "upsideDownModeDescription": "Обрните статус. Ако је сервис доступан, онда је обележен као неактиван.",
+    "maxRedirectDescription": "Максимани број преусмерења да се прате. Поставите на 0 да би се искључила преусмерења.",
+    "acceptedStatusCodesDescription": "Одаберите статусне кодове који се сматрају успешним одговором.",
+    "passwordNotMatchMsg": "Поновљена лозинка се не поклапа.",
+    "notificationDescription": "Молим Вас поставите обавештење за масматраче да бисе активирали.",
+    "keywordDescription": "Претражи кључну реч у чистом html или JSON одговору са осетљивим великим и малим словима",
+    "pauseDashboardHome": "Паузирај",
+    "deleteMonitorMsg": "Да ли сте сигурни да желите да обришете овог посматрача?",
+    "deleteNotificationMsg": "Да ли сте сигурни д ажелите да уклоните ово обавештење за све посматраче?",
+    "resolverserverDescription": "Cloudflare је подразумевани сервер. Можете променити сервер за расзрешавање у било ком тренутку.",
+    "rrtypeDescription": "Одаберите RR-Type који желите да посматрате",
+    "pauseMonitorMsg": "Да ли сте сигурни да желите да паузирате?",
+    "Settings": "Подешавања",
+    "Dashboard": "Командна табла",
+    "New Update": "Нова верзија",
+    "Language": "Језик",
+    "Appearance": "Изглед",
+    "Theme": "Тема",
+    "General": "Опште",
+    "Version": "Верзија",
+    "Check Update On GitHub": "Проверите нову верзију на GitHub-у",
+    "List": "Листа",
+    "Add": "Додај",
+    "Add New Monitor": "Додај новог посматрача",
+    "Quick Stats": "Брзе статистике",
+    "Up": "Активно",
+    "Down": "Неактивно",
+    "Pending": "Нерешено",
+    "Unknown": "Непознато",
+    "Pause": "Паузирај",
+    "Name": "Име",
+    "Status": "Статус",
+    "DateTime": "Датум и време",
+    "Message": "Порука",
+    "No important events": "Нема битних догађаја",
+    "Resume": "Настави",
+    "Edit": "Измени",
+    "Delete": "Уклони",
+    "Current": "Тренутно",
+    "Uptime": "Време рада",
+    "Cert Exp.": "Истек серт.",
+    "day": "дан | дана",
+    "-day": "-дана",
+    "hour": "сат",
+    "-hour": "-сата",
+    "Response": "Одговор",
+    "Ping": "Пинг",
+    "Monitor Type": "Тип посматрача",
+    "Keyword": "Кључна реч",
+    "Friendly Name": "Пријатељско име",
+    "URL": "URL",
+    "Hostname": "Hostname",
+    "Port": "Порт",
+    "Heartbeat Interval": "Интервал откуцаја срца",
+    "Retries": "Покушаји",
+    "Advanced": "Напредно",
+    "Upside Down Mode": "Наопак мод",
+    "Max. Redirects": "Макс. преусмерења",
+    "Accepted Status Codes": "Прихваћени статусни кодови",
+    "Save": "Сачувај",
+    "Notifications": "Обавештења",
+    "Not available, please setup.": "Није доступно, молим Вас подесите.",
+    "Setup Notification": "Постави обавештење",
+    "Light": "Светло",
+    "Dark": "Тамно",
+    "Auto": "Аутоматско",
+    "Theme - Heartbeat Bar": "Тема - Трака откуцаја срца",
+    "Normal": "Нормално",
+    "Bottom": "Доле",
+    "None": "Искључено",
+    "Timezone": "Временска зона",
+    "Search Engine Visibility": "Видљивост претраживачима",
+    "Allow indexing": "Дозволи индексирање",
+    "Discourage search engines from indexing site": "Одвраћајте претраживаче од индексирања сајта",
+    "Change Password": "Промени лозинку",
+    "Current Password": "Тренутна лозинка",
+    "New Password": "Нова лозинка",
+    "Repeat New Password": "Понови нову лозинку",
+    "Update Password": "Измени лозинку",
+    "Disable Auth": "Искључи аутентификацију",
+    "Enable Auth": "Укључи аутентификацију",
+    "disableauth.message1": "Да ли сте сигурни да желите да <strong>искључите аутентификацију</strong>?",
+    "disableauth.message2": "То је за <strong>оне који имају додату аутентификацију</strong> испред Uptime Kuma као на пример Cloudflare Access.",
+    "Please use this option carefully!": "Молим Вас користите ово са пажњом.",
+    "Logout": "Одлогуј се",
+    "Leave": "Изађи",
+    "I understand, please disable": "Разумем, молим те искључи",
+    "Confirm": "Потврди",
+    "Yes": "Да",
+    "No": "Не",
+    "Username": "Корисничко име",
+    "Password": "Лозинка",
+    "Remember me": "Запамти ме",
+    "Login": "Улогуј се",
+    "No Monitors, please": "Без посматрача молим",
+    "add one": "додај једног",
+    "Notification Type": "Тип обавештења",
+    "Email": "Е-пошта",
+    "Test": "Тест",
+    "Certificate Info": "Информације сертификата",
+    "Resolver Server": "Разрешивачки сервер",
+    "Resource Record Type": "Тип записа ресурса",
+    "Last Result": "Последњи резултат",
+    "Create your admin account": "Наприви администраторски налог",
+    "Repeat Password": "Поновите лозинку",
+    "respTime": "Време одг. (мс)"
+}
diff --git a/src/lang/sv-SE.json b/src/lang/sv-SE.json
new file mode 100644
index 000000000..7110067b3
--- /dev/null
+++ b/src/lang/sv-SE.json
@@ -0,0 +1,109 @@
+{
+    "languageName": "Svenska",
+    "checkEverySecond": "Uppdatera var {0} sekund.",
+    "retriesDescription": "Max antal försök innan tjänsten markeras som nere och en notis skickas",
+    "ignoreTLSError": "Ignorera TLS/SSL-fel för webbsidor med HTTPS",
+    "upsideDownModeDescription": "Vänd upp och ner på statusen. Om tjänsten är nåbar visas den som NERE.",
+    "maxRedirectDescription": "Max antal omdirigeringar att följa. Välj 0 för att avaktivera omdirigeringar.",
+    "acceptedStatusCodesDescription": "Välj statuskoder som räknas som lyckade.",
+    "passwordNotMatchMsg": "Det bekräftade lösenordet stämmer ej överens.",
+    "notificationDescription": "Vänligen lägg till en notistjänst till dina övervakare.",
+    "keywordDescription": "Sök efter nyckelord i ren HTML eller JSON-svar. Sökningen är skiftkänslig.",
+    "pauseDashboardHome": "Pausa",
+    "deleteMonitorMsg": "Är du säker på att du vill ta bort den här övervakningen?",
+    "deleteNotificationMsg": "Är du säker på att du vill ta bort den här notisen för alla övervakare?",
+    "resolverserverDescription": "Cloudflare är den förvalda servern. Du kan byta resolver när som helst.",
+    "rrtypeDescription": "Välj den RR-typ du vill övervaka",
+    "pauseMonitorMsg": "Är du säker på att du vill pausa?",
+    "Settings": "Inställningar",
+    "Dashboard": "Infopanel",
+    "New Update": "Ny uppdatering",
+    "Language": "Språk",
+    "Appearance": "Utseende",
+    "Theme": "Tema",
+    "General": "Allmänt",
+    "Version": "Version",
+    "Check Update On GitHub": "Sök efter uppdatering på GitHub",
+    "List": "Lista",
+    "Add": "Lägg till",
+    "Add New Monitor": "Lägg Till Ny Övervakare",
+    "Quick Stats": "Snabbstatistik",
+    "Up": "Uppe",
+    "Down": "Nere",
+    "Pending": "Pågående",
+    "Unknown": "Okänt",
+    "Pause": "Pausa",
+    "Name": "Namn",
+    "Status": "Status",
+    "DateTime": "Datum & Tid",
+    "Message": "Meddelande",
+    "No important events": "Inga viktiga händelser",
+    "Resume": "Återuppta",
+    "Edit": "Redigera",
+    "Delete": "Ta bort",
+    "Current": "Nuvarande",
+    "Uptime": "Drifttid",
+    "Cert Exp.": "Certifikat utgår",
+    "day": "dag | dagar",
+    "-day": " dagar",
+    "hour": "timme",
+    "-hour": " timmar",
+    "Response": "Svar",
+    "Ping": "Ping",
+    "Monitor Type": "Övervakningstyp",
+    "Keyword": "Nyckelord",
+    "Friendly Name": "Namn",
+    "URL": "URL",
+    "Hostname": "Värdnamn",
+    "Port": "Port",
+    "Heartbeat Interval": "Hjärtslagsintervall",
+    "Retries": "Försök",
+    "Advanced": "Avancerat",
+    "Upside Down Mode": "Upp och ner-läge",
+    "Max. Redirects": "Max antal omdirigeringar",
+    "Accepted Status Codes": "Tillåtna statuskoder",
+    "Save": "Spara",
+    "Notifications": "Notiser",
+    "Not available, please setup.": "Ej tillgänglig, vänligen konfigurera.",
+    "Setup Notification": "Ny Notistjänst",
+    "Light": "Ljust",
+    "Dark": "Mörkt",
+    "Auto": "Automatiskt",
+    "Theme - Heartbeat Bar": "Tema - Heartbeat Bar",
+    "Normal": "Normal",
+    "Bottom": "Botten",
+    "None": "Tomt",
+    "Timezone": "Tidszon",
+    "Search Engine Visibility": "Synlighet på Sökmotorer",
+    "Allow indexing": "Tillåt indexering",
+    "Discourage search engines from indexing site": "Hindra sökmotorer från att indexera sidan",
+    "Change Password": "Byt Lösenord",
+    "Current Password": "Nuvarande Lösenord",
+    "New Password": "Nytt Lösenord",
+    "Repeat New Password": "Upprepa Nytt Lösenord",
+    "Update Password": "Uppdatera Lösenord",
+    "Disable Auth": "Avaktivera Autentisering",
+    "Enable Auth": "Aktivera Autentisering",
+    "Logout": "Logga ut",
+    "Leave": "Lämna",
+    "I understand, please disable": "Jag förstår, vänligen avaktivera",
+    "Confirm": "Bekräfta",
+    "Yes": "Ja",
+    "No": "Nej",
+    "Username": "Användarnamn",
+    "Password": "Lösenord",
+    "Remember me": "Kom ihåg mig",
+    "Login": "Logga in",
+    "No Monitors, please": "Inga Övervakare, tack",
+    "add one": "lägg till en",
+    "Notification Type": "Notistyp",
+    "Email": "Email",
+    "Test": "Test",
+    "Certificate Info": "Certifikatsinfo",
+    "Resolver Server": "Resolverserver",
+    "Resource Record Type": "RR-typ",
+    "Last Result": "Senaste resultat",
+    "Create your admin account": "Skapa ditt administratörskonto",
+    "Repeat Password": "Upprepa Lösenord",
+    "respTime": "Svarstid (ms)"
+}
diff --git a/src/lang/th-TH.json b/src/lang/th-TH.json
new file mode 100644
index 000000000..9f5c78a1d
--- /dev/null
+++ b/src/lang/th-TH.json
@@ -0,0 +1,605 @@
+{
+    "languageName": "ไทย",
+    "checkEverySecond": "ตรวจสอบทุก {0} วินาที",
+    "retryCheckEverySecond": "ลองใหม่ทุก {0} วินาที",
+    "retriesDescription": "จำนวนครั้งสูงสุดที่จะลองก่อนบริการถูกระบุว่าไม่สามารถใช้งานได้และส่งการแจ้งเตือน",
+    "ignoreTLSError": "ไม่สนใจข้อผิดพลาด TLS/SSL สำหรับเว็บไซต์ HTTPS",
+    "upsideDownModeDescription": "กลับด้านสถานะ เช่น ถ้าบริการสามารถใช้งานได้จะถูกเปลี่ยนเป็นใช้งานไม่ได้",
+    "maxRedirectDescription": "จำนวนครั้งสูงสุดที่จะเปลี่ยนเส้นทาง, ตั้งเป็น 0 เพื่อปิดการเปลี่ยนเส้นทาง",
+    "acceptedStatusCodesDescription": "เลือกรหัสสถานะที่ถือว่าการตอบกลับสำเร็จ",
+    "passwordNotMatchMsg": "รหัสผ่านไม่ตรงกัน",
+    "notificationDescription": "การแจ้งเตือนต้องกำหนดให้มอนิเตอร์เพื่อให้สามารถใช้งานได้",
+    "keywordDescription": "ค้นหาคำสำคัญใน HTML หรือ JSON ของการตอบกลับ, คำสำคัญต้องคำนึงถึงตัวพิมพ์เล็กและตัวพิมพ์ใหญ่",
+    "pauseDashboardHome": "หยุดชั่วคราว",
+    "deleteMonitorMsg": "คุณแน่ใจหรือไม่ที่จะลบมอนิเตอร์?",
+    "deleteNotificationMsg": "คุณแน่ใจหรือไม่ที่จะลบการแจ้งเตือนสำหรับมอนิเตอร์ทั้งหมด?",
+    "resolverserverDescription": "Cloudflare เป็นเซิร์ฟเวอร์ค้นหาเริ่มต้น, คุณสามารถเปลี่ยนเซิร์ฟเวอร์ได้ตลอดเวลา",
+    "rrtypeDescription": "เลือกประเภท DNS Record ที่คุณต้องการจะมอนิเตอร์",
+    "pauseMonitorMsg": "คุณแน่ใจหรือไม่ที่จะหยุดมอนิเตอร์ชั่วคราว?",
+    "enableDefaultNotificationDescription": "การแจ้งเตือนนี้จะถูกเปิดโดยค่าเริ่มต้นสำหรับมอนิเตอร์ใหม่, คุณสามารถปิดการแจ้งเตือนสำหรับแต่ละมอนิเตอร์ได้",
+    "clearEventsMsg": "คุณแน่ใจหรือไม่ที่จะลบเหตุการณ์ทั้งหมดสำหรับมอนิเตอร์นี้?",
+    "clearHeartbeatsMsg": "คุณแน่ใจหรือไม่ที่จะลบประวัติการตรวจสอบทั้งหมดสำหรับมอนิเตอร์นี้?",
+    "confirmClearStatisticsMsg": "คุณแน่ใจหรือไม่ที่จะลบสถิติทั้งหมด?",
+    "importHandleDescription": "เลือก \"ข้ามรายการที่มีอยู่แล้ว\" ถ้าคุณต้องการข้ามทุกมอนิเตอร์หรือการแจ้งเตือนที่มีชื่อซ้ำกัน, \"เขียนทับ\" จะลบทุกมอนิเตอร์หรือการแจ้งเตือนที่มีชื่อซ้ำกัน",
+    "confirmImportMsg": "คุณแน่ใจหรือไม่ที่จะนำเข้าข้อมูลสำรอง, กรุณาตรวจสอบว่าคุณเลือกข้อมูลที่ถูกต้อง",
+    "twoFAVerifyLabel": "โปรดกรอกกุญแจ 2FA ของคุณเพื่อยืนยัน:",
+    "tokenValidSettingsMsg": "กุญแจถูกต้อง, ตอนนี้คุณสามารถบันทึกการตั้งค่า 2FA ของคุณได้แล้ว",
+    "confirmEnableTwoFAMsg": "คุณแน่ใจหรือไม่ที่จะเปิดใช้งาน 2FA?",
+    "confirmDisableTwoFAMsg": "คุณแน่ใจหรือไม่ที่จะปิดใช้งาน 2FA?",
+    "Settings": "การตั้งค่า",
+    "Dashboard": "แผงควบคุม",
+    "New Update": "อัพเดทใหม่",
+    "Language": "ภาษา",
+    "Appearance": "รูปร่าง",
+    "Theme": "หน้าตา",
+    "General": "ทั่วไป",
+    "Primary Base URL": "URL หลัก",
+    "Version": "เวอร์ชั่น",
+    "Check Update On GitHub": "ตรวจสอบการอัปเดตบน GitHub",
+    "List": "รายการ",
+    "Add": "เพิ่ม",
+    "Add New Monitor": "เพิ่มมอนิเตอร์ใหม่",
+    "Quick Stats": "สถิติด่วน",
+    "Up": "ใช้งานได้",
+    "Down": "ไม่สามารถใช้งานได้",
+    "Pending": "รอดำเนินการ",
+    "Unknown": "ไม่ทราบ",
+    "Pause": "หยุดชั่วคราว",
+    "Name": "ชื่อ",
+    "Status": "สถานะ",
+    "DateTime": "วันที่และเวลา",
+    "Message": "ข้อความ",
+    "No important events": "ไม่มีเหตการณ์ที่สำคัญ",
+    "Resume": "ดำเนินการต่อ",
+    "Edit": "แก้ไข",
+    "Delete": "ลบ",
+    "Current": "ปัจจุบัน",
+    "Uptime": "เวลาที่ใช้งานได้",
+    "Cert Exp.": "วันหมดอายุใบรับรอง",
+    "days": "วัน",
+    "day": "วัน",
+    "-day": "-วัน",
+    "hour": "ชั่วโมง",
+    "-hour": "-ชั่วโมง",
+    "Response": "การตอบสนอง",
+    "Ping": "การตอบสนอง",
+    "Monitor Type": "ประเภทมอนิเตอร์",
+    "Keyword": "คำสำคัญ",
+    "Friendly Name": "ชื่อที่เป็นมิตร",
+    "URL": "URL",
+    "Hostname": "ชื่อโฮสต์",
+    "Port": "พอร์ต",
+    "Heartbeat Interval": "ระยะเวลาระหว่างการทดสอบ",
+    "Retries": "จำนวนครั้งที่จะลองใหม่",
+    "Heartbeat Retry Interval": "ระยะห่างระหว่างการทดสอบใหม่หลังจากไม่สำเร็จ",
+    "Advanced": "ขั้นสูง",
+    "Upside Down Mode": "โหมดกลับด้าน",
+    "Max. Redirects": "จำนวนการเปลี่ยนเส้นทางสูงสุด",
+    "Accepted Status Codes": "รหัสสถานะที่ยอมรับ",
+    "Push URL": "URL เป้าหมาย",
+    "needPushEvery": "คุณควรเรียก URL นี้ทุก {0} วินาที",
+    "pushOptionalParams": "ตัวแปรเสริม: {0}",
+    "Save": "บันทึก",
+    "Notifications": "การแจ้งเตือน",
+    "Not available, please setup.": "ไม่พร้อมใช้งาน, กรุณาตั้งค่า",
+    "Setup Notification": "ตั้งค่าการแจ้งเตือน",
+    "Light": "สว่าง",
+    "Dark": "มืด",
+    "Auto": "อัตโนมัติ",
+    "Theme - Heartbeat Bar": "หน้าตา - แถบการตอบสนอง",
+    "Normal": "ปกติ",
+    "Bottom": "ด้านล่าง",
+    "None": "ไม่มี",
+    "Timezone": "เขตเวลา",
+    "Search Engine Visibility": "การมองเห็นของเครื่องมือค้นหา",
+    "Allow indexing": "อนุญาตให้สร้างดัชนี",
+    "Discourage search engines from indexing site": "ปฏิเสธเครื่องมือค้นหาไม่ให้สร้างดัชนีของเว็บไซต์",
+    "Change Password": "เปลี่ยนรหัสผ่าน",
+    "Current Password": "รหัสผ่านปัจจุบัน",
+    "New Password": "รหัสผ่านใหม่",
+    "Repeat New Password": "ยืนยันรหัสผ่านใหม่",
+    "Update Password": "อัพเดทรหัสผ่าน",
+    "Disable Auth": "ปิดใช้งานการตรวจสอบสิทธิ์",
+    "Enable Auth": "เปิดใช้งานการตรวจสอบสิทธิ์",
+    "disableauth.message1": "คุณต้องการที่จะ <strong>ปิดใช้งานระบบรับรองความถูกต้องใช่หรือไม่</strong>?",
+    "disableauth.message2": "ระบบนี้ถูกออกแบบมาเพื่อการใช้งานกับระบบรับรองความถูกต้องของบุคคลที่สามเช่น Cloudflare Access, Authelia หรือวิธีการอื่นๆ",
+    "Please use this option carefully!": "โปรดใช้ความระมัดระวังในการเลือกใช้งานระบบนี้ !",
+    "Logout": "ออกจากระบบ",
+    "Leave": "ออก",
+    "I understand, please disable": "ฉันเข้าใจแล้ว, กรุณาปิดการใช้งาน",
+    "Confirm": "ยืนยัน",
+    "Yes": "ใช่",
+    "No": "ไม่",
+    "Username": "ชื่อผู้ใช้",
+    "Password": "รหัสผ่าน",
+    "Remember me": "จดจำฉันไว้",
+    "Login": "เข้าสู่ระบบ",
+    "No Monitors, please": "ไม่มีมอนิเตอร์, กรุณา",
+    "add one": "สร้าง",
+    "Notification Type": "ประเภทการแจ้งเตือน",
+    "Email": "อีเมล",
+    "Test": "ทดสอบ",
+    "Certificate Info": "ข้อมูลใบรับรอง",
+    "Resolver Server": "เซิร์ฟเวอร์ที่ค้นหา",
+    "Resource Record Type": "ประเภท DNS Record",
+    "Last Result": "ผลล่าสุด",
+    "Create your admin account": "สร้างบัญชีผู้ดูแลระบบ",
+    "Repeat Password": "ยืนยันรหัสผ่าน",
+    "Import Backup": "นำเข้าข้อมูลสำรอง",
+    "Export Backup": "ส่งออกข้อมูลสำรอง",
+    "Export": "ส่งออก",
+    "Import": "นำเข้า",
+    "respTime": "ระยะเวลาการตอบสนอง (ms)",
+    "notAvailableShort": "ไม่สามารถใช้งานได้",
+    "Default enabled": "เปิดใช้งานโดยค่าเริ่มต้น",
+    "Apply on all existing monitors": "ใช้กับมอนิเตอร์ทั้งหมด",
+    "Create": "สร้าง",
+    "Clear Data": "ล้างข้อมูล",
+    "Events": "เหตุการณ์",
+    "Heartbeats": "ประวัติการตรวจสอบ",
+    "Auto Get": "ดึงอัตโนมัติ",
+    "backupDescription": "คุณสามารถสำรองข้อมูลการแจ้งเตือนและมอนิเตอร์ทั้งหมดไว้ได้ในไฟล์ JSON",
+    "backupDescription2": "หมายเหตุ : ประวัติและข้อมูลเหตการณ์จะไม่ถูกสำรอง",
+    "backupDescription3": "ข้อมูลที่ละเอียดอ่อนเช่นกุญแจการแจ้งเตือนจะรวมอยู่ในไฟล์ข้อมูลสำรอง, โปรดเก็บข้อมูลสำรองอย่างปลอดภัย",
+    "alertNoFile": "กรุณาเลือกไฟล์ที่จะใช้งาน",
+    "alertWrongFileType": "กรุณาเลือกไฟล์ที่เป็น JSON",
+    "Clear all statistics": "ล้างข้อมูลสถิติทั้งหมด",
+    "Skip existing": "ข้ามรายการที่มีอยู่แล้ว",
+    "Overwrite": "เขียนทับ",
+    "Options": "ตัวเลือก",
+    "Keep both": "เก็บทั้งสอง",
+    "Verify Token": "ยืนยันกุญแจ",
+    "Setup 2FA": "ติดตั้ง 2FA",
+    "Enable 2FA": "เปิดใช้งาน 2FA",
+    "Disable 2FA": "ปิดใช้งาน 2FA",
+    "2FA Settings": "ตั้งค่า 2FA",
+    "Two Factor Authentication": "การยืนยันตัวตนแบบสองขั้นตอน",
+    "Active": "ใช้งาน",
+    "Inactive": "ไม่ใช้งาน",
+    "Token": "กุญแจ",
+    "Show URI": "แสดง URI",
+    "Tags": "แท็ก",
+    "Add New below or Select...": "เพิ่มใหม่ด้านล่างหรือเลือก…",
+    "Tag with this name already exist.": "แท็กที่มีชื่อนี้มีอยู่แล้ว",
+    "Tag with this value already exist.": "แท็กที่มีข้อมูลนี้มีอยู่แล้ว",
+    "color": "สี",
+    "value (optional)": "ข้อมูล (ไม่จำเป็น)",
+    "Gray": "เทา",
+    "Red": "แดง",
+    "Orange": "ส้ม",
+    "Green": "เขียว",
+    "Blue": "น้ำเงิน",
+    "Indigo": "ม่วง",
+    "Purple": "ม่วง",
+    "Pink": "ชมพู",
+    "Search...": "ค้นหา…",
+    "Avg. Ping": "ค่า Ping เฉลี่ย",
+    "Avg. Response": "ค่า Response เฉลี่ย",
+    "Entry Page": "หน้าต้อนรับ",
+    "statusPageNothing": "ไม่มีอะไรตรงนี้ !, กรุณาเพิ่มกลุ่มหรือมอนิเตอร์",
+    "No Services": "ไม่มีบริการ",
+    "All Systems Operational": "บริการทั้งหมดทำงานได้ปกติ",
+    "Partially Degraded Service": "บริการมีปัญหาบางส่วน",
+    "Degraded Service": "บริการมีปัญหา",
+    "Add Group": "เพิ่มกลุ่ม",
+    "Add a monitor": "เพิ่มมอนิเตอร์",
+    "Edit Status Page": "แก้ไขหน้าสถานะ",
+    "Go to Dashboard": "ไปที่หน้าควบคุม",
+    "Status Page": "หน้าสถานะ",
+    "Status Pages": "หน้าสถานะ",
+    "defaultNotificationName": "การแจ้งเตือน {notification} ของฉัน ({number})",
+    "here": "ที่นี่",
+    "Required": "จำเป็น",
+    "telegram": "Telegram",
+    "Bot Token": "กุญแจของบอท",
+    "wayToGetTelegramToken": "คุณสามารถรับกุญแจได้จาก {0}.",
+    "Chat ID": "ไอดีแชท",
+    "supportTelegramChatID": "รองรับ แชทส่วนตัว, แชทกลุ่ม, ไอดีแชท",
+    "wayToGetTelegramChatID": "คุณสามารถรับ ID แชทของคุณได้โดยส่งข้อความไปยังบอทและไปที่ URL นี้เพื่อดู chat_id :",
+    "YOUR BOT TOKEN HERE": "กุญแจของบอทของคุณที่นี่",
+    "chatIDNotFound": "ไม่พบไอดีแชท, กรุณาส่งข้อความไปที่บอท",
+    "webhook": "Webhook",
+    "Post URL": "URL โพสต์",
+    "Content Type": "ประเภทเนื้อหา",
+    "webhookJsonDesc": "{0} ดีสำหรับเซิร์ฟเวอร์ HTTP สมัยใหม่เช่น Express.js",
+    "webhookFormDataDesc": "{multipart} ดีสำหรับ PHP, ข้อมูล JSON จะต้องถูกประมวลผลด้วย {decodeFunction}",
+    "smtp": "Email (SMTP)",
+    "secureOptionNone": "None / STARTTLS (25, 587)",
+    "secureOptionTLS": "TLS (465)",
+    "Ignore TLS Error": "เพิกเฉยข้อผิดพลาด TLS",
+    "From Email": "จากอีเมล",
+    "emailCustomSubject": "หัวข้อที่กำหนดเอง",
+    "To Email": "ถึงอีเมล",
+    "smtpCC": "CC",
+    "smtpBCC": "BCC",
+    "discord": "Discord",
+    "Discord Webhook URL": "Discord Webhook URL",
+    "wayToGetDiscordURL": "คุณสามารถรับได้โดยการไปที่ Server Settings -> Integrations -> Create Webhook",
+    "Bot Display Name": "ชื่อบอท",
+    "Prefix Custom Message": "คำนำหน้าข้อความที่กำหนดเอง",
+    "Hello @everyone is...": "สวัสดี {'@'}everyone นี่…",
+    "teams": "Microsoft Teams",
+    "Webhook URL": "Webhook URL",
+    "wayToGetTeamsURL": "คุณสามารถเรียนรู้วิธีการสร้าง Webhook URL {0}",
+    "signal": "Signal",
+    "Number": "หมายเลข",
+    "Recipients": "ผู้รับ",
+    "needSignalAPI": "คุณต้องมี Signal Client ที่มี Rest API",
+    "wayToCheckSignalURL": "คุณสามารถตรวจสอบ URL นี้เพื่อดูวิธีตั้งค่า :",
+    "signalImportant": "สำคัญ: คุณไม่สามารถผสมกลุ่มและตัวเลขในผู้รับได้!",
+    "gotify": "Gotify",
+    "Application Token": "กุญแจของแอพพลิเคชั่น",
+    "Server URL": "Server URL",
+    "Priority": "ลำดับความสำคัญ",
+    "slack": "Slack",
+    "Icon Emoji": "Icon Emoji",
+    "Channel Name": "ชื่อห้อง",
+    "Uptime Kuma URL": "Uptime Kuma URL",
+    "aboutWebhooks": "ข้อมูลเพิ่มเติมสำหรับ Webhooks : {0}",
+    "aboutChannelName": "ใส่ชื่อห้องใน {0} ในช่องชื่อห้องถ้าต้องการที่จะข้าม Webhook, เช่น: #ช่องอื่นๆ",
+    "aboutKumaURL": "ถ้าคุณไม่ใส่ข้อมูลในช่อง Uptime Kuma URL ค่าเริ่มต้นจะเป็นจะเป็น Uptime Kuma Github",
+    "emojiCheatSheet": "ตาราง Emoji : {0}",
+    "rocket.chat": "Rocket.Chat",
+    "pushover": "Pushover",
+    "pushy": "Pushy",
+    "PushByTechulus": "Push by Techulus",
+    "octopush": "Octopush",
+    "promosms": "PromoSMS",
+    "clicksendsms": "ClickSend SMS",
+    "lunasea": "LunaSea",
+    "apprise": "Apprise (รองรับการแจ้งเตือนมากกว่า 50 บริการ)",
+    "GoogleChat": "Google Chat (สำหรับ Google Workspace เท่านั้น)",
+    "pushbullet": "Pushbullet",
+    "line": "Line Messenger",
+    "mattermost": "Mattermost",
+    "User Key": "กุญแจผู้ใช้งาน",
+    "Device": "อุปกรณ์",
+    "Message Title": "หัวข้อข้อความ",
+    "Notification Sound": "เสียงแจ้งเตือน",
+    "More info on:": "ข้อมูลเพิ่มเติม : {0}",
+    "pushoverDesc1": "ลำดับความสำคัญฉุกเฉิน (2) มีการหมดเวลาเริ่มต้น 30 วินาทีระหว่างการลองใหม่และจะหมดอายุหลังจาก 1 ชั่วโมง",
+    "pushoverDesc2": "ถ้าคุณต้องการจะส่งการแจ้งเตือนไปยังอุปกรณ์อื่นๆ สามารถกำหนดได้ที่ช่องอุปกรณ์",
+    "SMS Type": "ประเภท SMS",
+    "octopushTypePremium": "พรีเมี่ยม (เร็ว - แนะนำสำหรับการแจ้งเตือน)",
+    "octopushTypeLowCost": "ต้นทุนต่ำ (ช้า - บางครั้งจะถูกบล็อกโดยผู้ให้บริการ)",
+    "checkPrice": "ตรวจสอบราคาของ {0} :",
+    "apiCredentials": "ข้อมูลการตรวจสอบสิทธิ์ API",
+    "octopushLegacyHint": "คุณใช้เวอร์ชันดั้งเดิมของ Octopush (2011 - 2020) หรือเวอร์ชันใหม่หรือไม่?",
+    "Check octopush prices": "ตรวจสอบราคาของ Octopush {0}",
+    "octopushPhoneNumber": "หมายเลขโทรศัพท์ (รูปแบบสากล เช่น +33612345678) ",
+    "octopushSMSSender": "ชื่อผู้ส่ง SMS : ความยาว 3 - 11 ตัวอักษร, ตัวเลข และช่องว่าง (a-zA-Z0-9 )",
+    "LunaSea Device ID": "ไอดีอุปกรณ์ LunaSea",
+    "Apprise URL": "Apprise URL",
+    "Example:": "ตัวอย่าง : {0}",
+    "Read more:": "อ่านเพิ่มเติม : {0}",
+    "Status:": "สถานะ : {0}",
+    "Read more": "อ่านเพิ่มเติม",
+    "appriseInstalled": "Apprise ถูกติดตั้งแล้ว",
+    "appriseNotInstalled": "Apprise ยังไม่ถูกติดตั้ง {0}",
+    "Access Token": "กุญแจการเข้าถึง",
+    "Channel access token": "กุญแจการเข้าถึงของช่อง",
+    "Line Developers Console": "Line Developers Console",
+    "lineDevConsoleTo": "Line Developers Console - {0}",
+    "Basic Settings": "การตั้งค่าพื้นฐาน",
+    "User ID": "ไอดีผู้ใช้",
+    "Messaging API": "Messaging API",
+    "wayToGetLineChannelToken": "ขั้นแรกให้เข้า {0} สร้างผู้ให้บริการและช่องทาง (Messaging API) จากนั้นคุณจะได้รับกุญแจการเข้าถึงช่องและไอดีผู้ใช้จากรายการเมนูที่กล่าวถึงข้างต้น",
+    "Icon URL": "Icon URL",
+    "aboutIconURL": "คุณสามารถระบุลิงก์รูปภาพใน \"URL ไอคอน\" เพื่อแทนที่รูปภาพโปรไฟล์เริ่มต้น จะไม่ถูกใช้หากมีการตั้งค่า Icon Emoji",
+    "aboutMattermostChannelName": "คุณลบช่องเริ่มต้นที่ Webhook โพสต์ได้ด้วยการป้อนชื่อช่องลงในช่อง \"ชื่อช่อง\" ต้องเปิดใช้งานในการตั้งค่า Mattermost Webhook เช่น #ช่องอื่นๆ",
+    "matrix": "Matrix",
+    "promosmsTypeEco": "SMS ECO - ราคาถูก แต่ช้าและมักจะโอเวอร์โหลด จำกัดเฉพาะผู้รับในโปแลนด์",
+    "promosmsTypeFlash": "SMS FLASH - ข้อความจะแสดงบนอุปกรณ์ของผู้รับโดยอัตโนมัติ จำกัดเฉพาะผู้รับในโปแลนด์",
+    "promosmsTypeFull": "SMS FULL - SMS ระดับพรีเมียม คุณสามารถใช้ชื่อผู้ส่งของคุณได้ (คุณต้องลงทะเบียนชื่อก่อน) เชื่อถือได้สำหรับการแจ้งเตือน",
+    "promosmsTypeSpeed": "SMS SPEED - ลำดับความสำคัญสูงสุดในระบบ รวดเร็วและเชื่อถือได้ แต่มีค่าใช้จ่ายสูง (ประมาณสองเท่าของราคาเต็ม SMS)",
+    "promosmsPhoneNumber": "หมายเลขโทรศัพท์ (สำหรับผู้รับโปแลนด์ คุณสามารถข้ามรหัสพื้นที่ได้)",
+    "promosmsSMSSender": "ชื่อผู้ส่ง SMS : ชื่อที่ลงทะเบียนล่วงหน้าหรือหนึ่งในค่าเริ่มต้น: InfoSMS, ข้อมูล SMS, MaxSMS, INFO, SMS",
+    "Feishu WebHookUrl": "Feishu WebHookURL",
+    "matrixHomeserverURL": "URL ของโฮมเซิร์ฟเวอร์ (พร้อม http(s):// และพอร์ตเสริม)",
+    "Internal Room Id": "รหัสห้องภายใน",
+    "matrixDesc1": "คุณค้นหารหัสห้องภายในได้โดยดูในส่วนขั้นสูงของการตั้งค่าห้องในไคลเอ็นต์ Matrix มันควรจะมีลักษณะเช่น !PMdRCpsIfLwsfjIye6:kiznick.server.",
+    "matrixDesc2": "ขอแนะนำเป็นอย่างยิ่งให้คุณสร้างผู้ใช้ใหม่และอย่าใช้โทเค็นการเข้าถึงของผู้ใช้ Matrix ของคุณเอง เนื่องจากจะทำให้สามารถเข้าถึงบัญชีของคุณและห้องทั้งหมดที่คุณเข้าร่วม ให้สร้างผู้ใช้ใหม่และเชิญเฉพาะห้องที่คุณต้องการรับการแจ้งเตือนแทน คุณสามารถรับโทเค็นเพื่อการเข้าถึงได้โดยเรียกใช้ {0}",
+    "Method": "วิธี",
+    "Body": "เนื้อหา",
+    "Headers": "ส่วนหัว",
+    "PushUrl": "Push URL",
+    "HeadersInvalidFormat": "เนื้อหาคำขอส่วนหัวไม่ใช่ JSON ที่ถูกต้อง: ",
+    "BodyInvalidFormat": "เนื้อหาคำขอไม่ใช่ JSON ที่ถูกต้อง : ",
+    "Monitor History": "ประวัติมอนิเตอร์",
+    "clearDataOlderThan": "เก็บข้อมูลมอนิเตอร์ {0} วัน",
+    "PasswordsDoNotMatch": "รหัสผ่านไม่ตรงกัน",
+    "records": "บันทึก",
+    "One record": "หนึ่งบันทึก",
+    "steamApiKeyDescription": "สำหรับการมอนิเตอร์ Steam Game Server คุณต้องมี Steam Web-API key, คุณสามารถสมัครได้จากที่นี่ : ",
+    "Current User": "ผู้ใช้ปัจจุบัน",
+    "topic": "หัวข้อ",
+    "topicExplanation": "หัวข้อ MQTT ที่จะมอนิเตอร์",
+    "successMessage": "ข้อความที่จะถือว่าประสบความสำเร็จ",
+    "successMessageExplanation": "ข้อความ MQTT ที่จะถือว่าประสบความสำเร็จ",
+    "recent": "ล่าสุด",
+    "Done": "สำเร็จ",
+    "Info": "ข้อมูล",
+    "Security": "ความปลอดภัย",
+    "Steam API Key": "Steam API Key",
+    "Shrink Database": "ย่อฐานข้อมูล",
+    "Pick a RR-Type...": "เลือกชนิด DNS Record",
+    "Pick Accepted Status Codes...": "เลือกเลขสถานะที่ยอมรับ…",
+    "Default": "ค่าเริ่มต้น",
+    "HTTP Options": "ตัวเลือก HTTP",
+    "Create Incident": "สร้างเหตุการณ์",
+    "Title": "หัวข้อ",
+    "Content": "เนื้อหา",
+    "Style": "สไตล์",
+    "info": "ข้อมูล",
+    "warning": "แจ้งเตือน",
+    "danger": "อันตราย",
+    "primary": "หลัก",
+    "light": "สว่าง",
+    "dark": "มืด",
+    "Post": "โพสต์",
+    "Please input title and content": "กรุณาใส่ชื่อและเนื้อหา",
+    "Created": "สร้าง",
+    "Last Updated": "อัพเดทล่าสุด",
+    "Unpin": "เลิกตรึง",
+    "Switch to Light Theme": "เปลี่ยนเป็นแบบสว่าง",
+    "Switch to Dark Theme": "เปลี่ยนเป็นแบบมืด",
+    "Show Tags": "แสดงแท็ก",
+    "Hide Tags": "ซ่อนแท็ก",
+    "Description": "รายละเอียด",
+    "No monitors available.": "ไม่มีมอนิเตอร์ที่สามารถใช้งานได้",
+    "Add one": "เพิ่ม",
+    "No Monitors": "ไม่มีมอนิเตอร์",
+    "Untitled Group": "กลุ่มที่ไม่มีชื่อ",
+    "Services": "บริการ",
+    "Discard": "ทิ้ง",
+    "Cancel": "ยกเลิก",
+    "Powered by": "ขับเคลื่อนโดย",
+    "shrinkDatabaseDescription": "ทริกเกอร์ฐานข้อมูล VACUUM สำหรับ SQLite หากฐานข้อมูลของคุณถูกสร้างขึ้นหลังจากเวอร์ชั่น 1.10.0 แสดงว่า AUTO_VACUUM เปิดใช้งานอยู่แล้วและไม่จำเป็นต้องดำเนินการนี้",
+    "serwersms": "SerwerSMS.pl",
+    "serwersmsAPIUser": "API Username (incl. webapi_ prefix)",
+    "serwersmsAPIPassword": "API Password",
+    "serwersmsPhoneNumber": "หมายเลขโทรศัพท์",
+    "serwersmsSenderName": "ชื่อผู้ส่ง SMS (ลงทะเบียนผ่านหน้าควบคุม)",
+    "stackfield": "Stackfield",
+    "Customize": "ปรับแต่ง",
+    "Custom Footer": "ส่วนท้ายที่กำหนดเอง",
+    "Custom CSS": "CSS ที่กำหนดเอง",
+    "smtpDkimSettings": "การตั้งค่า DKIM",
+    "smtpDkimDesc": "โปรดดู Nodemailer DKIM {0} สำหรับการใช้งาน",
+    "documentation": "คู่มือการใช้งาน",
+    "smtpDkimDomain": "ชื่อโดเมน",
+    "smtpDkimKeySelector": "Key Selector",
+    "smtpDkimPrivateKey": "Private Key",
+    "smtpDkimHashAlgo": "อัลกอริทึมแฮช (ไม่บังคับ)",
+    "smtpDkimheaderFieldNames": "คีย์ส่วนหัวสำหรับลงชื่อ (ไม่บังคับ)",
+    "smtpDkimskipFields": "Header Keys ไม่ต้องเซ็น (ไม่บังคับ)",
+    "gorush": "Gorush",
+    "alerta": "Alerta",
+    "alertaApiEndpoint": "API Endpoint",
+    "alertaEnvironment": "Environment",
+    "alertaApiKey": "กุญแจ API",
+    "alertaAlertState": "แจ้งเตือนสถานะ",
+    "alertaRecoverState": "กู้คืนสถานะ",
+    "deleteStatusPageMsg": "คุณแน่ใจหรือไม่ว่าต้องการลบหน้าสถานะนี้",
+    "Proxies": "พร็อกซี",
+    "default": "ค่าเริ่มต้น",
+    "enabled": "เปิดใช้งานแล้ว",
+    "setAsDefault": "ตั้งเป็นค่าเริ่มต้น",
+    "deleteProxyMsg": "คุณแน่ใจหรือไม่ว่าต้องการลบพร็อกซีสำหรับมอนิเตอร์ทั้งหมด?",
+    "proxyDescription": "ต้องตั้งค่ามอนิเตอร์ให้ใช้พร็อกซีเพื่อให้ใช้งานได้",
+    "enableProxyDescription": "พร็อกซีนี้จะไม่ส่งผลต่อมอนิเตอร์จนกว่าจะเปิดใช้งาน คุณสามารถควบคุมการปิดใช้งานพร็อกซีชั่วคราวจากมอนิเตอร์ทั้งหมดได้ที่ส่วนสถานะการเปิดใช้งาน",
+    "setAsDefaultProxyDescription": "พร็อกซีนี้จะถูกเปิดโดนค่าเริ่มต้นสำหรับมอนิเตอร์ใหม่, คุณสามารถปิดการแจ้งเตือนสำหรับแต่ละมอนิเตอร์ได้",
+    "Certificate Chain": "ห่วงโซ่ใบรับรอง",
+    "Valid": "ถูกต้อง",
+    "Invalid": "ไม่ถูกต้อง",
+    "AccessKeyId": "กุญแจสิทธิ ID",
+    "SecretAccessKey": "กุญแจสิทธิ Secret",
+    "PhoneNumbers": "PhoneNumbers",
+    "TemplateCode": "รหัสเทมเพลต",
+    "SignName": "ป้ายชื่อ",
+    "Sms template must contain parameters: ": "เทมเพลต SMS ต้องมีพารามิเตอร์ : ",
+    "Bark Endpoint": "Bark Endpoint",
+    "WebHookUrl": "WebHookUrl",
+    "SecretKey": "SecretKey",
+    "For safety, must use secret key": "เพื่อความปลอดภัย จำเป็นต้องตั้งค่ากุญแจการเข้าถึง",
+    "Device Token": "Device Token",
+    "Platform": "แพลตฟอร์ม",
+    "iOS": "iOS",
+    "Android": "Android",
+    "Huawei": "Huawei",
+    "High": "สูง",
+    "Retry": "ลองใหม่",
+    "Topic": "หัวข้อ",
+    "WeCom Bot Key": "WeCom Bot Key",
+    "Setup Proxy": "ติดตั้งพร็อกซี่",
+    "Proxy Protocol": "โปรโตคอลพร็อกซี่",
+    "Proxy Server": "เซิร์ฟเวอร์พร็อกซี",
+    "Proxy server has authentication": "พร็อกซีเซิร์ฟเวอร์มีการตรวจสอบสิทธิ์",
+    "User": "ผู้ใช้",
+    "Installed": "ติดตั้งแล้ว",
+    "Not installed": "ไม่ได้ติดตั้ง",
+    "Running": "กำลังทำงาน",
+    "Not running": "ไม่ได้ทำงาน",
+    "Remove Token": "ลบกุญแจ",
+    "Start": "เริ่ม",
+    "Stop": "หยุด",
+    "Uptime Kuma": "Uptime Kuma",
+    "Add New Status Page": "เพิ่มหน้าสถานะใหม่",
+    "Slug": "ชื่อ",
+    "Accept characters:": "ตัวอักษรที่ใช้งานได้ :",
+    "startOrEndWithOnly": "เริ่มหรือจบด้วย {0} เท่านั้น",
+    "No consecutive dashes": "ไม่มีขีดกลางติดต่อกัน",
+    "Next": "ต่อไป",
+    "The slug is already taken. Please choose another slug.": "ชื่อนี้ถูกใช้งานแล้ว กรุณาใช้ชื่ออื่น",
+    "No Proxy": "ไม่มีพร็อกซี่",
+    "HTTP Basic Auth": "HTTP Basic Auth",
+    "New Status Page": "หน้าสถานะใหม่",
+    "Page Not Found": "ไม่พบหน้านี้",
+    "Reverse Proxy": "พร็อกซีย้อนกลับ",
+    "Backup": "สำรองข้อมูล",
+    "About": "เกี่ยวกับ",
+    "wayToGetCloudflaredURL": "(ดาวโหลด cloudflared จาก {0})",
+    "cloudflareWebsite": "เว็บไซต์ Cloudflare",
+    "Message:": "ข้อความ :",
+    "Don't know how to get the token? Please read the guide:": "ไม่รู้วิธีการรับกุญแจ? กรุณาอ่านคู่มือ:",
+    "The current connection may be lost if you are currently connecting via Cloudflare Tunnel. Are you sure want to stop it? Type your current password to confirm it.": "การเชื่อมต่อปัจุบันอาจขาดหายหากคุณกำลังเชื่อมต่อ Cloudflare Tunnel คุณแน่ใจหรือไม่ที่จะหยุด, พิมรหัสผ่านของคุณเพื่อยืนยัน",
+    "Other Software": "ซอฟต์แวร์อื่นๆ",
+    "For example: nginx, Apache and Traefik.": "เช่น: nginx, Apache และ Traefik",
+    "Please read": "กรุณาอ่าน",
+    "Subject:": "เรื่อง :",
+    "Valid To:": "ใช้ได้ถึง :",
+    "Days Remaining:": "จำนวนวันที่เหลือ :",
+    "Issuer:": "ผู้ออก :",
+    "Fingerprint:": "ลายนิ้วมือ :",
+    "No status pages": "ไม่มีหน้าสถานะ",
+    "Domain Name Expiry Notification": "แจ้งเตือนการหมดอายุของโดเมน",
+    "Proxy": "Proxy",
+    "Date Created": "วันที่สร้าง",
+    "onebotHttpAddress": "ที่อยู่ HTTP OneBot",
+    "onebotMessageType": "ชนิดข้อความ OneBot",
+    "onebotGroupMessage": "กลุ่ม",
+    "onebotPrivateMessage": "ส่วนตัว",
+    "onebotUserOrGroupId": "กลุ่ม / ไอดีผู้ใช้",
+    "onebotSafetyTips": "เพื่อความปลอดภัย จำเป็นต้องตั้งค่ากุญแจการเข้าถึง",
+    "PushDeer Key": "กุญแจ PushDeer",
+    "Footer Text": "ข้อความส่วนท้าย",
+    "Show Powered By": "แสดงข้อความ \"ขับเคลื่อนโดย\"",
+    "Domain Names": "Domain Names",
+    "signedInDisp": "เข้าใช้งานในฐานะ {0}",
+    "signedInDispDisabled": "ปิดการยืนยันตัวตน",
+    "Certificate Expiry Notification": "แจ้งเตือนใบรับรองหมดอายุ",
+    "API Username": "API Username",
+    "API Key": "API Key",
+    "Recipient Number": "หมายเลขผู้รับ",
+    "From Name/Number": "จาก ชื่อ / หมายเลข",
+    "Leave blank to use a shared sender number.": "ไม่ต้องกรอกเพื่อใช้ชื่อผู้ส่งร่วมกัน",
+    "Octopush API Version": "Octopush API Version",
+    "Legacy Octopush-DM": "Legacy Octopush-DM",
+    "endpoint": "endpoint",
+    "octopushAPIKey": "\"API key\" จากข้อมูลยืนยันตัวตน HTTP API ในแผงควบคุม",
+    "octopushLogin": "\"Login\" จากข้อมูลยืนยันตัวตน HTTP API ในแผงควบคุม",
+    "promosmsLogin": "API Login Name",
+    "promosmsPassword": "API Password",
+    "pushoversounds pushover": "Pushover (default)",
+    "pushoversounds bike": "Bike",
+    "pushoversounds bugle": "Bugle",
+    "pushoversounds cashregister": "Cash Register",
+    "pushoversounds classical": "Classical",
+    "pushoversounds cosmic": "Cosmic",
+    "pushoversounds falling": "Falling",
+    "pushoversounds gamelan": "Gamelan",
+    "pushoversounds incoming": "Incoming",
+    "pushoversounds intermission": "Intermission",
+    "pushoversounds magic": "Magic",
+    "pushoversounds mechanical": "Mechanical",
+    "pushoversounds pianobar": "Piano Bar",
+    "pushoversounds siren": "Siren",
+    "pushoversounds spacealarm": "Space Alarm",
+    "pushoversounds tugboat": "Tug Boat",
+    "pushoversounds alien": "Alien Alarm (long)",
+    "pushoversounds climb": "Climb (long)",
+    "pushoversounds persistent": "Persistent (long)",
+    "pushoversounds echo": "Pushover Echo (long)",
+    "pushoversounds updown": "Up Down (long)",
+    "pushoversounds vibrate": "Vibrate Only",
+    "pushoversounds none": "None (silent)",
+    "pushyAPIKey": "Secret API Key",
+    "pushyToken": "Device token",
+    "Show update if available": "แสดงการอัปเดตถ้ามี",
+    "Also check beta release": "ตรวจสอบรุ่นเบต้า",
+    "Using a Reverse Proxy?": "ใช้ Reverse Proxy อยู่ใช่มั้ย?",
+    "Check how to config it for WebSocket": "ตรวจสอบวิธีการตั้งค่าสำหรับ WebSocket",
+    "Steam Game Server": "Steam Game Server",
+    "Most likely causes:": "สาเหตุที่เป็นไปได้มากที่สุด :",
+    "The resource is no longer available.": "ทรัพยากรไม่สามารถใช้งานได้อีกต่อไป",
+    "There might be a typing error in the address.": "อาจมีข้อผิดพลาดในการพิมพ์ที่อยู่",
+    "What you can try:": "สิ่งที่คุณสามารถลองทำ :",
+    "Retype the address.": "พิมพ์ที่อยู่อีกครั้ง",
+    "Go back to the previous page.": "กลับไปหน้าที่แล้ว",
+    "Coming Soon": "เร็วๆ นี้",
+    "wayToGetClickSendSMSToken": "คุณสามารถรับ API Username และ API Key ได้จาก {0}",
+    "wayToGetLineNotifyToken": "คุณสามารถรับ access token ได้จาก {0}",
+    "resendEveryXTimes": "ส่งซ้ำทุก {0} ครั้ง",
+    "resendDisabled": "การส่งซ้ำถูกปิดใช้งาน",
+    "dnsPortDescription": "พอร์ตของเซิร์ฟเวอร์ DNS, ค่าเริ่มต้นคือ 53, คุณสามารถเปลี่ยนพอร์ตตอนไหนก็ได้",
+    "Resend Notification if Down X times consecutively": "ส่งการแจ้งเตือนซ้ำถ้าออฟไลน์ครบ X ครั้ง",
+    "error": "เกิดข้อผิดพลาด",
+    "critical": "วิกฤต",
+    "wayToGetPagerDutyKey": "คุณสามารถรับคีย์ได้โดยการไปที่ Service -> Service Directory -> (Select a service) -> Integrations -> Add integration, และค้นหา \"Events API V2\", สำหรับข้อมูลเพิ่มเติม {0}",
+    "Integration Key": "Integration Key",
+    "Integration URL": "Integration URL",
+    "Auto resolve or acknowledged": "แก้ไขอัตโนมัติหรือยอมรับ",
+    "do nothing": "ไม่ทำอะไร",
+    "auto acknowledged": "ยอมรับอัตโนมัติ",
+    "auto resolve": "แก้ไขอัตโนมัติ",
+    "Bark Group": "กลุ่มที่จะประกาศ",
+    "Bark Sound": "เสียงประกาศ",
+    "Authentication": "การตรวจสอบสิทธิ์",
+    "HTTP Headers": "HTTP Headers",
+    "Trust Proxy": "Trust Proxy",
+    "HomeAssistant": "Home Assistant",
+    "RadiusSecret": "Radius Secret",
+    "RadiusSecretDescription": "แบ่งปันคีย์ลับระหว่างผู้ใช้งานและเซิร์ฟเวอร์",
+    "RadiusCalledStationId": "Called Station Id",
+    "RadiusCalledStationIdDescription": "Identifier of the called device",
+    "RadiusCallingStationId": "Calling Station Id",
+    "RadiusCallingStationIdDescription": "Identifier of the calling device",
+    "Connection String": "Connection String",
+    "Query": "Query",
+    "settingsCertificateExpiry": "วันหมดอายุของใบรับรอง TLS",
+    "certificationExpiryDescription": "การตรวจสอบ HTTPS จะแจ้งเตือนถ้าใบอนุญาติ TLS จะหมดอายุใน:",
+    "Setup Docker Host": "ติดตั้ง Docker Host",
+    "Connection Type": "ประเภทการเชื่อมต่อ",
+    "Docker Daemon": "Docker Daemon",
+    "deleteDockerHostMsg": "คุณแน่ใจหรือไม่ที่จะลบ Docker host นี้สำหรับการมอนิเตอร์ทั้งหมด?",
+    "socket": "Socket",
+    "tcp": "TCP / HTTP",
+    "Docker Container": "Docker Container",
+    "Container Name / ID": "Container Name / ID",
+    "Docker Host": "Docker Host",
+    "Docker Hosts": "Docker Hosts",
+    "ntfy Topic": "ntfy Topic",
+    "Domain": "โดเมน",
+    "Workstation": "Workstation",
+    "disableCloudflaredNoAuthMsg": "คุณอยู่ในโหมดไม่มีการตรวจสอบสิทธิ์, ไม่จำเป็นต้องมีรหัสผ่าน",
+    "trustProxyDescription": "เชื่อ Header 'X-Forwarded-*', คุณควรเปิดใช้งาน ถ้าคุณต้องการ IP ของผู้ใช้ที่ถูกต้องและ Uptime Kuma อยู่ข้างหลัง Nginx หรือ Apache",
+    "Examples": "ตัวอย่าง",
+    "Home Assistant URL": "Home Assistant URL",
+    "Long-Lived Access Token": "Access Token แบบมีอายุนาน",
+    "Long-Lived Access Token can be created by clicking on your profile name (bottom left) and scrolling to the bottom then click Create Token. ": "Access Token แบบมีอายุนานสามารถสร้างได้โดยคลิกชื่อบนโปรไฟล์ (ล่างซ้าย) และเลื่อนไปข้างล่างจากนั้นคลิก \"Create Token\" ",
+    "Notification Service": "บริการแจ้งเตือน",
+    "default: notify all devices": "ค่าเริ่มต้น: แจ้งเตือนทุกอุปกรณ์",
+    "A list of Notification Services can be found in Home Assistant under \"Developer Tools > Services\" search for \"notification\" to find your device/phone name.": "รายการแจ้งเตือนสามารถหาได้ใน Home Assistant ในเมนู \"Developer Tools > Services\" แล้วค้นหา \"notification\" เพื่อหาชื่ออุปกรณ์หรือชื่อโทรศัพท์",
+    "Automations can optionally be triggered in Home Assistant:": "สามารถเลือกสั่งงานระบบอัตโนมัติได้ใน Home Assistant:",
+    "Trigger type:": "ชนิดสิ่งกระตุ้น:",
+    "Event type:": "ชนิดเหตการณ์:",
+    "Event data:": "ข้อมูลกิจกรรม:",
+    "Then choose an action, for example switch the scene to where an RGB light is red.": "จากนั้นเลือกการกระทำ, ตัวอย่าง เช่น เปลี่ยนเป็นไฟสีแดง",
+    "Frontend Version": "เวอร์ชั่น Frontend",
+    "Frontend Version do not match backend version!": "เวอร์ชั่น Frontend ไม่ตรงกับ Backend !",
+    "webhookAdditionalHeadersTitle": "Header เพิ่มเติม",
+    "webhookAdditionalHeadersDesc": "กำหนด Header ที่จะส่งไปหร้อมกับ Webhook",
+    "Start of maintenance": "เริ่มการซ่อมบำรุง",
+    "All Status Pages": "หน้าสถานะทั้งหมด",
+    "Custom": "กำหนดเอง",
+    "Game": "เกม",
+    "statusMaintenance": "การซ่อมบำรุง",
+    "Maintenance": "การซ่อมบำรุง",
+    "Monitor": "มอนิเตอร์ | มอนิเตอร์",
+    "Select status pages...": "เลือกหน้าสถานะ",
+    "Schedule maintenance": "กำหนดเวลาบำรุงรักษา",
+    "Affected Monitors": "มอนิเตอร์ที่ได้รับผลกระทบ",
+    "markdownSupported": "รองรับ Markdown",
+    "Help": "ช่วยเหลือ",
+    "Pick Affected Monitors...": "เลือกมอนิเตอร์ที่ได้รับผลกระทบ",
+    "Packet Size": "ขนาดของ Packet",
+    "ZohoCliq": "ZohoCliq",
+    "backupOutdatedWarning": "ไม่ได้รับการพัฒนาแล้ว : ไม่สามารถสร้างหรือกูข้อมูลสำรองได้สมบูรณ์ เนื่องจากมีฟีเจอร์ใหม่เพิ่มขึ้นมากและการแบ็คอัพไม่ได้ถูกพัฒนา",
+    "backupRecommend": "กรุณาแบ็คอัพข้อมูลทั้งหมดหรือโฟลเดอร์ Data (./data/) โดยตรงแทน",
+    "Optional": "ไม่จำเป็น",
+    "squadcast": "Squadcast",
+    "or": "หรือ",
+    "recurringInterval": "ช่วงเวลา",
+    "Recurring": "ทำซ้ำ",
+    "General Monitor Type": "ชนิดมอนิเตอร์ทั่วไป"
+}
diff --git a/src/lang/tr-TR.json b/src/lang/tr-TR.json
new file mode 100644
index 000000000..80d273e1e
--- /dev/null
+++ b/src/lang/tr-TR.json
@@ -0,0 +1,700 @@
+{
+    "languageName": "Türkçe",
+    "checkEverySecond": "{0} saniyede bir kontrol et",
+    "retryCheckEverySecond": "{0} saniyede bir dene",
+    "resendEveryXTimes": "Her {0} bir yeniden gönder",
+    "resendDisabled": "Yeniden gönderme devre dışı",
+    "retriesDescription": "Servisin kapalı olarak işaretlenmeden ve bir bildirim gönderilmeden önce maksimum yeniden deneme sayısı",
+    "ignoreTLSError": "HTTPS web siteleri için TLS/SSL hatasını yoksay",
+    "upsideDownModeDescription": "Servisin durumunu tersine çevirir. Servis çalışıyorsa kapalı olarak işaretler.",
+    "maxRedirectDescription": "İzlenecek maksimum yönlendirme sayısı. Yönlendirmeleri devre dışı bırakmak için 0'a ayarlayın.",
+    "acceptedStatusCodesDescription": "Başarılı bir yanıt olarak kabul edilen durum kodlarını seçin.",
+    "passwordNotMatchMsg": "Şifre eşleşmiyor.",
+    "notificationDescription": "Servislerin bildirim gönderebilmesi için bir bildirim yöntemi belirleyin.",
+    "keywordDescription": "Anahtar kelimeyi düz html veya JSON yanıtında arayın ve büyük/küçük harfe duyarlıdır.",
+    "pauseDashboardHome": "Durdur",
+    "deleteMonitorMsg": "Servisi silmek istediğinden emin misin?",
+    "deleteNotificationMsg": "Bu bildirimi tüm servisler için silmek istediğinden emin misin?",
+    "dnsPortDescription": "DNS sunucusu bağlantı noktası. Varsayılan değer 53'tür. Bağlantı noktasını istediğiniz zaman değiştirebilirsiniz.",
+    "resolverserverDescription": "Cloudflare varsayılan sunucudur, çözümleyici sunucusunu istediğiniz zaman değiştirebilirsiniz.",
+    "rrtypeDescription": "İzlemek istediğiniz servisin RR-Tipini seçin",
+    "pauseMonitorMsg": "Durdurmak istediğinden emin misin?",
+    "enableDefaultNotificationDescription": "Bu bildirim her yeni serviste aktif olacaktır. Bildirimi servisler için ayrı ayrı deaktive edebilirsiniz.",
+    "clearEventsMsg": "Bu servisin bütün kayıtlarını silmek istediğinden emin misin?",
+    "clearHeartbeatsMsg": "Bu servis için tüm sağlık durumunu silmek istediğinden emin misin?",
+    "confirmClearStatisticsMsg": "Tüm istatistikleri silmek istediğinden emin misin?",
+    "importHandleDescription": "Aynı isimdeki bütün servisleri ve bildirimleri atlamak için 'Var olanı atla' seçiniz. 'Üzerine yaz' var olan bütün servisleri ve bildirimleri silecektir.",
+    "confirmImportMsg": "Yedeği içeri aktarmak istediğinize emin misiniz? Lütfen doğru içeri aktarma seçeneğini seçtiğinizden emin olunuz.",
+    "twoFAVerifyLabel": "2FA doğrulamasını sağlamak için lütfen token bilgisini giriniz:",
+    "tokenValidSettingsMsg": "Token geçerli! Şimdi 2FA ayarlarını kaydedebilirsiniz.",
+    "confirmEnableTwoFAMsg": "2FA'ı etkinleştirmek istediğinizden emin misiniz?",
+    "confirmDisableTwoFAMsg": "2FA'ı devre dışı bırakmak istediğinize emin misiniz?",
+    "Settings": "Ayarlar",
+    "Dashboard": "Panel",
+    "New Update": "Yeni Güncelleme",
+    "Language": "Dil",
+    "Appearance": "Görünüm",
+    "Theme": "Tema",
+    "General": "Genel",
+    "Primary Base URL": "Birincil Temel URL",
+    "Version": "Versiyon",
+    "Check Update On GitHub": "GitHub'da Güncellemeyi Kontrol Edin",
+    "List": "Liste",
+    "Add": "Ekle",
+    "Add New Monitor": "Yeni Servis Ekle",
+    "Quick Stats": "Servis istatistikleri",
+    "Up": "Normal",
+    "Down": "Hatalı",
+    "Pending": "Bekliyor",
+    "Unknown": "Bilinmeyen",
+    "Pause": "Durdur",
+    "Name": "Servis ismi",
+    "Status": "Durum",
+    "DateTime": "Zaman",
+    "Message": "Mesaj",
+    "No important events": "Önemli olay yok",
+    "Resume": "Devam et",
+    "Edit": "Düzenle",
+    "Delete": "Sil",
+    "Current": "Şu anda",
+    "Uptime": "Çalışma zamanı",
+    "Cert Exp.": "Sertifika Süresi",
+    "day": "gün | günler",
+    "-day": "-gün",
+    "hour": "saat",
+    "-hour": "-saat",
+    "Response": "Cevap Süresi",
+    "Ping": "Ping",
+    "Monitor Type": "Servis Tipi",
+    "Keyword": "Anahtar Kelime",
+    "Friendly Name": "Panelde görünecek isim",
+    "URL": "URL",
+    "Hostname": "Hostname",
+    "Port": "Port",
+    "Heartbeat Interval": "Servis Test Aralığı",
+    "Retries": "Yeniden deneme",
+    "Heartbeat Retry Interval": "Sağlık Durumları Tekrar Deneme Sıklığı",
+    "Resend Notification if Down X times consecutively": "Art arda X kez düşerse bildirimi yeniden gönder",
+    "Advanced": "Gelişmiş",
+    "Upside Down Mode": "Ters/Düz Modu",
+    "Max. Redirects": "Maksimum Yönlendirme",
+    "Accepted Status Codes": "Kabul Edilen Durum Kodları",
+    "Push URL": "Push URL",
+    "needPushEvery": "Bu URL'yi her {0} saniyede bir aramalısınız.",
+    "pushOptionalParams": "İsteğe bağlı parametreler: {0}",
+    "Save": "Kaydet",
+    "Notifications": "Bildirimler",
+    "Not available, please setup.": "Atanmış bildirim yöntemi yok. Ayarlardan belirleyebilirsiniz.",
+    "Setup Notification": "Bildirim yöntemi kur",
+    "Light": "Açık",
+    "Dark": "Koyu",
+    "Auto": "Oto",
+    "Theme - Heartbeat Bar": "Servis Bar Konumu",
+    "Normal": "Normal",
+    "Bottom": "Aşağıda",
+    "None": "Gösterme",
+    "Timezone": "Zaman Dilimi",
+    "Search Engine Visibility": "Arama Motoru Görünürlüğü",
+    "Allow indexing": "İndekslemeye izin ver",
+    "Discourage search engines from indexing site": "İndekslemeyi reddet",
+    "Change Password": "Şifre Değiştir",
+    "Current Password": "Şuan ki Şifre",
+    "New Password": "Yeni Şifre",
+    "Repeat New Password": "Yeni Şifreyi Tekrar Girin",
+    "Update Password": "Şifreyi Değiştir",
+    "Disable Auth": "Şifreli girişi iptal et",
+    "Enable Auth": "Şifreli girişi aktif et",
+    "disableauth.message1": "<strong>Şifreli girişi devre dışı bırakmak istediğinizden</strong>emin misiniz?",
+    "disableauth.message2": "Bu, Uptime Kuma'nın önünde Cloudflare Access gibi <strong>üçüncü taraf yetkilendirmesi olan</strong> kişiler içindir.",
+    "Please use this option carefully!": "Lütfen dikkatli kullanın!",
+    "Logout": "Çıkış yap",
+    "Leave": "Ayrıl",
+    "I understand, please disable": "Evet farkındayım, iptal et",
+    "Confirm": "Onayla",
+    "Yes": "Evet",
+    "No": "Hayır",
+    "Username": "Kullanıcı Adı",
+    "Password": "Şifre",
+    "Remember me": "Beni Hatırla",
+    "Login": "Giriş yap",
+    "No Monitors, please": "Servis yok, lütfen",
+    "add one": "bir servis ekleyin",
+    "Notification Type": "Bildirim Yöntemi",
+    "Email": "E-mail",
+    "Test": "Test",
+    "Certificate Info": "Sertifika Bilgisi",
+    "Resolver Server": "Çözümleyici Sunucu",
+    "Resource Record Type": "Kaynak Kayıt Türü",
+    "Last Result": "En son sonuçlar",
+    "Create your admin account": "Yönetici hesabınızı oluşturun",
+    "Repeat Password": "Şifrenizi tekrar girin",
+    "Import Backup": "Yedeği içe aktar",
+    "Export Backup": "Yedeği dışa aktar",
+    "Export": "Dışa aktar",
+    "Import": "İçe aktar",
+    "respTime": "Cevap Süresi (ms)",
+    "notAvailableShort": "N/A",
+    "Default enabled": "Varsayılan etkinleştirilmiş",
+    "Apply on all existing monitors": "Var olan bütün servislere uygula",
+    "Create": "Oluştur",
+    "Clear Data": "Verileri Temizle",
+    "Events": "Olaylar",
+    "Heartbeats": "Sağlık Durumları",
+    "Auto Get": "Otomatik Al",
+    "backupDescription": "Bütün servisleri ve bildirimleri JSON dosyasına yedekleyebilirsiniz.",
+    "backupDescription2": "Not: Geçmiş ve etkinlik verileri içinde değildir.",
+    "backupDescription3": "Dışa aktarma dosyasında bildirim tokeni gibi hassas veriler bulunur, dikkatli bir şekilde saklayınız.",
+    "alertNoFile": "İçeri aktarmak için bir dosya seçiniz.",
+    "alertWrongFileType": "Lütfen bir JSON dosyası seçiniz.",
+    "Clear all statistics": "Bütün istatistikleri temizle",
+    "Skip existing": "Var olanı atla",
+    "Overwrite": "Üzerine yaz",
+    "Options": "Seçenekler",
+    "Keep both": "İkisini sakla",
+    "Verify Token": "Tokeni doğrula",
+    "Setup 2FA": "2FA Kur",
+    "Enable 2FA": "2FA Etkinleştir",
+    "Disable 2FA": "2FA Devre dışı bırak",
+    "2FA Settings": "2FA Ayarları",
+    "Two Factor Authentication": "İki Faktörlü Kimlik Doğrulama (2FA)",
+    "Active": "Aktif",
+    "Inactive": "İnaktif",
+    "Token": "Token",
+    "Show URI": "URI'yi göster",
+    "Tags": "Etiketler",
+    "Add New below or Select...": "Aşağıya Yeni Ekle veya Seç…",
+    "Tag with this name already exist.": "Bu ada sahip etiket zaten var.",
+    "Tag with this value already exist.": "Bu değere sahip etiket zaten var.",
+    "color": "renk",
+    "value (optional)": "değer (isteğe bağlı)",
+    "Gray": "Gri",
+    "Red": "Kırmızı",
+    "Orange": "Turuncu",
+    "Green": "Yeşil",
+    "Blue": "Mavi",
+    "Indigo": "Çivit mavisi",
+    "Purple": "Mor",
+    "Pink": "Pembe",
+    "Search...": "Ara…",
+    "Avg. Ping": "Ortalama Ping",
+    "Avg. Response": "Ortalama Cevap Süresi",
+    "Entry Page": "Giriş Sayfası",
+    "statusPageNothing": "Burada hiçbir şey yok, lütfen bir grup veya servis ekleyin.",
+    "No Services": "Hizmet Yok",
+    "All Systems Operational": "Tüm Sistemler Operasyonel",
+    "Partially Degraded Service": "Kısmen Bozulmuş Hizmet",
+    "Degraded Service": "Bozulmuş Hizmet",
+    "Add Group": "Grup Ekle",
+    "Add a monitor": "Servis Ekle",
+    "Edit Status Page": "Durum Sayfasını Düzenle",
+    "Go to Dashboard": "Panele Git",
+    "Status Page": "Durum Sayfası",
+    "Status Pages": "Durum Sayfaları",
+    "defaultNotificationName": "Benim {notification} Alarmım ({number})",
+    "here": "burada",
+    "Required": "Gerekli",
+    "telegram": "Telegram",
+    "Bot Token": "Bot Token",
+    "wayToGetTelegramToken": "{0} adresinden bir token alabilirsiniz.",
+    "Chat ID": "Chat ID",
+    "supportTelegramChatID": "Doğrudan Sohbet / Grup / Kanalın Sohbet Kimliğini Destekleyin",
+    "wayToGetTelegramChatID": "Bot'a bir mesaj göndererek ve chat_id'yi görüntülemek için bu URL'ye giderek sohbet kimliğinizi alabilirsiniz:",
+    "YOUR BOT TOKEN HERE": "BOT TOKENİNİZ BURADA",
+    "chatIDNotFound": "Chat ID bulunamadı; lütfen önce bu bota bir mesaj gönderin",
+    "webhook": "Webhook",
+    "Post URL": "Post URL",
+    "Content Type": "Content Type",
+    "webhookJsonDesc": "{0}, Express.js gibi tüm modern HTTP sunucuları için iyidir",
+    "webhookFormDataDesc": "{multipart} PHP için iyidir. JSON'un {decodeFunction} ile ayrıştırılması gerekecek",
+    "smtp": "E-mail (SMTP)",
+    "secureOptionNone": "Hiçbiri / STARTTLS (25, 587)",
+    "secureOptionTLS": "TLS (465)",
+    "Ignore TLS Error": "TLS Hatasını Yoksay",
+    "From Email": "E-postadan",
+    "emailCustomSubject": "Özel Konu",
+    "To Email": "E-postaya",
+    "smtpCC": "CC",
+    "smtpBCC": "BCC",
+    "discord": "Discord",
+    "Discord Webhook URL": "Discord Webhook URL",
+    "wayToGetDiscordURL": "Bunu Sunucu Ayarları -> Entegrasyonlar -> Webhookları Görüntüle -> Yeni Webhook Oluştur adımını izleyerek alabilirsiniz.",
+    "Bot Display Name": "Botun Görünecek Adı",
+    "Prefix Custom Message": "Önek Özel Mesaj",
+    "Hello @everyone is...": "Merhaba {'@'}everyone…",
+    "teams": "Microsoft Teams",
+    "Webhook URL": "Webhook URL",
+    "wayToGetTeamsURL": "Bir webhook URL'sinin nasıl oluşturulacağını öğrenebilirsiniz {0}.",
+    "signal": "Sinyal",
+    "Number": "Numara",
+    "Recipients": "Alıcılar",
+    "needSignalAPI": "REST API ile bir signal istemciniz olması gerekiyor.",
+    "wayToCheckSignalURL": "Nasıl kurulacağını görmek için bu URL'yi kontrol edebilirsiniz:",
+    "signalImportant": "ÖNEMLİ: Alıcılarda grupları ve sayıları karıştıramazsınız!",
+    "gotify": "Gotify",
+    "Application Token": "Uygulama Tokeni",
+    "Server URL": "Sunucu URL",
+    "Priority": "Öncelik",
+    "Icon Emoji": "İkon Emoji",
+    "Channel Name": "Kanal Adı",
+    "Uptime Kuma URL": "Uptime Kuma URL",
+    "aboutWebhooks": "Webhook hakkında daha fazla bilgi: {0}",
+    "aboutChannelName": "Webhook kanalını atlamak istiyorsanız, {0} Kanal Adı alanına kanal adını girin. Ör: #diğer-kanal",
+    "aboutKumaURL": "Uptime Kuma URL alanını boş bırakırsanız, varsayılan olarak Project GitHub sayfası olur.",
+    "emojiCheatSheet": "Emoji referans sayfası: {0}",
+    "PushByTechulus": "Push by Techulus",
+    "apprise": "Apprise (50'den fazla Bildirim hizmetini destekler)",
+    "GoogleChat": "Google Chat (sadece Google Workspace)",
+    "pushbullet": "Pushbullet",
+    "User Key": "Kullancı Anahtarı",
+    "Device": "Cihaz",
+    "Message Title": "Mesaj Başlığı",
+    "Notification Sound": "Bilgilendirme sesi",
+    "More info on:": "Daha fazla bilgi: {0}",
+    "pushoverDesc1": "Acil durum önceliği (2), yeniden denemeler arasında varsayılan olarak 30 saniyelik bir zaman aşımına sahiptir ve 1 saat sonra sona erecektir.",
+    "pushoverDesc2": "Farklı cihazlara bildirim göndermek istiyorsanız Cihaz alanını doldurunuz.",
+    "SMS Type": "SMS Tipi",
+    "octopushTypePremium": "Premium (Hızlı - uyarı için önerilir)",
+    "octopushTypeLowCost": "Düşük Maliyet (Yavaş - bazen operatör tarafından engellenir)",
+    "checkPrice": "{0} fiyatlarını kontrol edin:",
+    "apiCredentials": "API kimlik bilgileri",
+    "octopushLegacyHint": "Octopush'un (2011-2020) eski sürümünü mü yoksa yeni sürümünü mü kullanıyorsunuz?",
+    "Check octopush prices": "Octopush fiyatlarını kontrol edin {0}.",
+    "octopushPhoneNumber": "Telefon numarası (uluslararası biçim, örneğin: +33612345678) ",
+    "octopushSMSSender": "SMS Gönderici Adı : 3-11 alfanümerik karakter ve boşluk (a-zA-Z0-9)",
+    "LunaSea Device ID": "LunaSea Cihaz ID",
+    "Apprise URL": "Apprise URL",
+    "Example:": "Örnek: {0}",
+    "Read more:": "Daha fazla oku: {0}",
+    "Status:": "Durum: {0}",
+    "Read more": "Daha fazla oku",
+    "appriseInstalled": "Apprise yüklendi.",
+    "appriseNotInstalled": "Appris yüklü değil. {0}",
+    "Access Token": "Erişim Tokeni",
+    "Channel access token": "Kanal erişim tokeni",
+    "Line Developers Console": "Line Geliştirici Konsolu",
+    "lineDevConsoleTo": "Line Geliştirici Konsolu - {0}",
+    "Basic Settings": "Temel Ayarlar",
+    "User ID": "Kullanıcı ID",
+    "Messaging API": "Messaging API",
+    "wayToGetLineChannelToken": "Önce {0}'e erişin, bir sağlayıcı ve kanal (Messaging API) oluşturun, ardından yukarıda belirtilen menü öğelerinden kanal erişim tokenini ve kullanıcı id alabilirsiniz.",
+    "Icon URL": "Simge URL",
+    "aboutIconURL": "Varsayılan profil resmini geçersiz kılmak için \"Simge URL\" bölümünde bir resme bağlantı sağlayabilirsiniz. Simge Emojisi ayarlanmışsa kullanılmayacaktır.",
+    "aboutMattermostChannelName": "Kanal adını \"Kanal Adı\" alanına girerek Webhook'un gönderi yaptığı varsayılan kanalı geçersiz kılabilirsiniz. Bunun Mattermost Webhook ayarlarında etkinleştirilmesi gerekir. Ör: #diğer-kanal",
+    "matrix": "Matrix",
+    "promosmsTypeEco": "SMS ECO - ucuz ama yavaş ve genellikle aşırı yüklü. Yalnızca Polonyalı alıcılarla sınırlıdır.",
+    "promosmsTypeFlash": "SMS FLASH - Mesaj, alıcı cihazda otomatik olarak gösterilecektir. Yalnızca Polonyalı alıcılarla sınırlıdır.",
+    "promosmsTypeFull": "SMS FULL - Premium SMS katmanı, Gönderici Adınızı kullanabilirsiniz (Önce adınızı kaydetmeniz gerekir). Uyarılar için güvenilir.",
+    "promosmsTypeSpeed": "SMS HIZI - Sistemde en yüksek öncelik. Çok hızlı ve güvenilir ancak maliyetli (SMS FULL fiyatının yaklaşık iki katı).",
+    "promosmsPhoneNumber": "Telefon numarası (Polonyalı alıcı için Alan kodlarını atlayabilirsiniz)",
+    "promosmsSMSSender": "SMS Gönderici Adı : Ön kayıtlı ad veya varsayılanlardan biri: InfoSMS, SMS Info, MaxSMS, INFO, SMS",
+    "Feishu WebHookUrl": "Feishu WebHookURL",
+    "matrixHomeserverURL": "Homeserver URL (http(s):// ve isteğe bağlı olarak bağlantı noktası ile)",
+    "Internal Room Id": "Internal Room ID",
+    "matrixDesc1": "Internal Room ID'sini, Matrix istemcinizdeki oda ayarlarının gelişmiş bölümüne bakarak bulabilirsiniz. !QMdRCpUIfLwsfjxye6:home.server gibi görünmelidir.",
+    "matrixDesc2": "Hesabınıza ve katıldığınız tüm odalara tam erişime izin vereceğinden, yeni bir kullanıcı oluşturmanız ve kendi Matrix kullanıcınızın erişim belirtecini kullanmamanız şiddetle tavsiye edilir. Bunun yerine, yeni bir kullanıcı oluşturun ve onu yalnızca bildirimi almak istediğiniz odaya davet edin. {0} komutunu çalıştırarak erişim tokenini alabilirsiniz.",
+    "Method": "Yöntem",
+    "Body": "Gövde",
+    "Headers": "Başlıklar",
+    "PushUrl": "Push URL",
+    "HeadersInvalidFormat": "İstek başlıkları geçerli JSON değil. ",
+    "BodyInvalidFormat": "İstek gövdesi geçerli JSON değil: ",
+    "Monitor History": "Servis Geçmişi",
+    "clearDataOlderThan": "{0} gün boyunca izleme geçmişi verilerini saklayın.",
+    "PasswordsDoNotMatch": "Parolalar uyuşmuyor.",
+    "records": "kayıtlar",
+    "One record": "Bir Kayıt",
+    "steamApiKeyDescription": "Bir Steam Oyun Sunucusunu izlemek için bir Steam Web-API anahtarına ihtiyacınız vardır. API anahtarınızı buradan kaydedebilirsiniz: ",
+    "Current User": "Şu anki kullanıcı",
+    "topic": "Başlık",
+    "topicExplanation": "İzlenecek MQTT servisi",
+    "successMessage": "Başarılı Mesaj",
+    "successMessageExplanation": "Başarılı olarak kabul edilecek MQTT mesajı",
+    "recent": "Son",
+    "Done": "Tamamlandı",
+    "Info": "Bilgi",
+    "Security": "Güvenlik",
+    "Steam API Key": "Steam API Anahtarı",
+    "Shrink Database": "Veritabanını Küçült",
+    "Pick a RR-Type...": "Bir RR-Tipi seçin…",
+    "Pick Accepted Status Codes...": "Kabul Edilen Durum Kodlarını Seçin…",
+    "Default": "Varsayılan",
+    "HTTP Options": "HTTP Ayarları",
+    "Create Incident": "Olay Oluştur",
+    "Title": "Başlık",
+    "Content": "İçerik",
+    "Style": "Stil",
+    "info": "info",
+    "warning": "uyarı",
+    "danger": "tehlike",
+    "error": "hata",
+    "critical": "kritik",
+    "primary": "öncelik",
+    "light": "hafif",
+    "dark": "koyu",
+    "Post": "Post",
+    "Please input title and content": "Lütfen başlık ve içerik girin",
+    "Created": "Oluşturuldu",
+    "Last Updated": "Son Güncelleme",
+    "Unpin": "Unpin",
+    "Switch to Light Theme": "Açık Temaya Geç",
+    "Switch to Dark Theme": "Karanlık Temaya Geç",
+    "Show Tags": "Etiketleri Göster",
+    "Hide Tags": "Etiketleri Gizle",
+    "Description": "Açıklama",
+    "No monitors available.": "Kullanılabilir servis yok.",
+    "Add one": "Bir tane ekle",
+    "No Monitors": "Servis Yok",
+    "Untitled Group": "Adsız Grup",
+    "Services": "Hizmetler",
+    "Discard": "İptal Et",
+    "Cancel": "İptal Et",
+    "Powered by": "Tarafından desteklenmektedir",
+    "shrinkDatabaseDescription": "SQLite için veritabanı VACUUM'unu tetikleyin. Veritabanınız 1.10.0'dan sonra oluşturulduysa, AUTO_VACUUM zaten etkinleştirilmiştir ve bu eyleme gerek yoktur.",
+    "serwersms": "SerwerSMS.pl",
+    "serwersmsAPIUser": "API Kullanıcı Adı (webapi_ öneki dahil)",
+    "serwersmsAPIPassword": "API Şifre",
+    "serwersmsPhoneNumber": "Telefon numarası",
+    "serwersmsSenderName": "SMS Gönderici Adı (müşteri portalı üzerinden kayıtlı)",
+    "stackfield": "Stackfield",
+    "Customize": "Özelleştirme",
+    "Custom Footer": "Özel Altbilgi",
+    "Custom CSS": "Özel CSS",
+    "smtpDkimSettings": "DKIM Ayarları",
+    "smtpDkimDesc": "Kullanım için lütfen Nodemailer DKIM'e {0} bakın.",
+    "documentation": "belgeler",
+    "smtpDkimDomain": "Alan adı",
+    "smtpDkimKeySelector": "Anahtar Seçici",
+    "smtpDkimPrivateKey": "Özel anahtar",
+    "smtpDkimHashAlgo": "Hash Algoritması (Opsiyonel)",
+    "smtpDkimheaderFieldNames": "İmzalanacak Başlık Anahtarları (Opsiyonel)",
+    "smtpDkimskipFields": "İmzalamayacak Başlık Anahtarları (Opsiyonel)",
+    "wayToGetPagerDutyKey": "Bunu Hizmet -> Hizmet Dizini -> (Bir hizmet seçin) -> Entegrasyonlar -> Entegrasyon ekle'ye giderek alabilirsiniz. Burada \"Events API V2\" için arama yapabilirsiniz. Daha fazla bilgi {0}",
+    "Integration Key": "Entegrasyon Anahtarı",
+    "Integration URL": "Entegrasyon URL'si",
+    "Auto resolve or acknowledged": "Otomatik çözümleme veya onaylandı",
+    "do nothing": "hiçbir şey yapma",
+    "auto acknowledged": "otomatik onaylandı",
+    "auto resolve": "otomatik çözümleme",
+    "gorush": "Gorush",
+    "alerta": "Alerta",
+    "alertaApiEndpoint": "API Endpoint",
+    "alertaEnvironment": "Environment",
+    "alertaApiKey": "API Key",
+    "alertaAlertState": "Uyarı Durumu",
+    "alertaRecoverState": "Kurtarma Durumu",
+    "deleteStatusPageMsg": "Bu durum sayfasını silmek istediğinizden emin misiniz?",
+    "Proxies": "Proxy'ler",
+    "default": "Varsayılan",
+    "enabled": "Etkinleştirilmiş",
+    "setAsDefault": "Varsayılan Olarak Ayarla",
+    "deleteProxyMsg": "Bu proxy'yi tüm servisler için silmek istediğinizden emin misiniz?",
+    "proxyDescription": "Proxy'lerin çalışması için bir servise atanması gerekir.",
+    "enableProxyDescription": "Bu proxy, etkinleştirilene kadar izleme isteklerini etkilemeyecektir. Aktivasyon durumuna göre proxy'yi tüm servislerden geçici olarak devre dışı bırakabilirsiniz.",
+    "setAsDefaultProxyDescription": "Bu proxy, yeni servisler için varsayılan olarak etkinleştirilecektir. Yine de proxy'yi her bir servis için devre dışı bırakabilirsiniz.",
+    "Certificate Chain": "Sertifika Zinciri",
+    "Valid": "Geçerli",
+    "Invalid": "Geçersiz",
+    "AccessKeyId": "AccessKey ID",
+    "SecretAccessKey": "AccessKey Secret",
+    "PhoneNumbers": "Telefon numaraları",
+    "TemplateCode": "TemplateCode",
+    "SignName": "SignName",
+    "Sms template must contain parameters: ": "Sms şablonu parametreleri içermelidir: ",
+    "Bark Endpoint": "Bark Endpoint",
+    "Bark Group": "Bark Group",
+    "Bark Sound": "Bark Sound",
+    "WebHookUrl": "WebHookUrl",
+    "SecretKey": "SecretKey",
+    "For safety, must use secret key": "Güvenlik için gizli anahtar kullanılmalıdır",
+    "Device Token": "Cihaz Tokeni",
+    "Platform": "Platform",
+    "iOS": "iOS",
+    "Android": "Android",
+    "Huawei": "Huawei",
+    "High": "High",
+    "Retry": "Tekrar",
+    "Topic": "Başlık",
+    "WeCom Bot Key": "WeCom Bot Key",
+    "Setup Proxy": "Proxy kur",
+    "Proxy Protocol": "Proxy Protokolü",
+    "Proxy Server": "Proxy Sunucusu",
+    "Proxy server has authentication": "Proxy sunucusunun kimlik doğrulaması var",
+    "User": "Kullanıcı",
+    "Installed": "Yüklenmiş",
+    "Not installed": "Yüklü değil",
+    "Running": "Çalışıyor",
+    "Not running": "Çalışmıyor",
+    "Remove Token": "Tokeni Kaldır",
+    "Start": "Başlat",
+    "Stop": "Durdur",
+    "Uptime Kuma": "Uptime Kuma",
+    "Add New Status Page": "Yeni Durum Sayfası Ekle",
+    "Slug": "Slug",
+    "Accept characters:": "Kabul edilen karakterler:",
+    "startOrEndWithOnly": "Yalnızca {0} ile başlayın veya bitirin",
+    "No consecutive dashes": "Ardışık tire yok",
+    "Next": "Sonraki",
+    "The slug is already taken. Please choose another slug.": "Slug zaten alındı. Lütfen başka bir slug seçin.",
+    "No Proxy": "Proxy Yok",
+    "Authentication": "Kimlik doğrulama",
+    "HTTP Basic Auth": "HTTP Temel Yetkilendirme",
+    "New Status Page": "Yeni Durum Sayfası",
+    "Page Not Found": "Sayfa bulunamadı",
+    "Reverse Proxy": "Ters Proxy",
+    "Backup": "Yedek",
+    "About": "Hakkında",
+    "wayToGetCloudflaredURL": "(Cloudflared'i {0} adresinden indirin)",
+    "cloudflareWebsite": "Cloudflare Website",
+    "Message:": "Mesaj:",
+    "Don't know how to get the token? Please read the guide:": "Tokeni nasıl alacağınızı bilmiyor musunuz? Lütfen kılavuzu okuyun:",
+    "The current connection may be lost if you are currently connecting via Cloudflare Tunnel. Are you sure want to stop it? Type your current password to confirm it.": "Halihazırda Cloudflare Tüneli üzerinden bağlanıyorsanız mevcut bağlantı kesilebilir. Durdurmak istediğinden emin misin? Onaylamak için mevcut şifrenizi yazın.",
+    "HTTP Headers": "HTTP Başlıkları",
+    "Trust Proxy": "Trust Proxy",
+    "Other Software": "Diğer Yazılımlar",
+    "For example: nginx, Apache and Traefik.": "Örneğin: nginx, Apache ve Traefik.",
+    "Please read": "Lütfen oku",
+    "Subject:": "Başlık:",
+    "Valid To:": "Geçerlilik:",
+    "Days Remaining:": "Kalan günler:",
+    "Issuer:": "Veren:",
+    "Fingerprint:": "Parmak izi:",
+    "No status pages": "Durum sayfası yok",
+    "Domain Name Expiry Notification": "Alan Adı Sona Erme Bildirimi",
+    "Proxy": "Proxy",
+    "Date Created": "Tarih Oluşturuldu",
+    "HomeAssistant": "Home Assistant",
+    "onebotHttpAddress": "OneBot HTTP Adresi",
+    "onebotMessageType": "OneBot Mesaj Türü",
+    "onebotGroupMessage": "Grup",
+    "onebotPrivateMessage": "Özel",
+    "onebotUserOrGroupId": "Grup/Kullanıcı Kimliği",
+    "onebotSafetyTips": "Güvenlik için erişim tokeni ayarlamalısınız",
+    "PushDeer Key": "PushDeer Anahtarı",
+    "Footer Text": "Altbilgi metni",
+    "Show Powered By": "\"Powered by\" kısmını göster",
+    "Domain Names": "Alan isimleri",
+    "signedInDisp": "{0} olarak oturum açıldı",
+    "signedInDispDisabled": "Yetkilendirme Devre Dışı.",
+    "RadiusSecret": "Radius Secret",
+    "RadiusSecretDescription": "İstemci ve sunucu arasında paylaşılan gizli anahtar",
+    "RadiusCalledStationId": "Aranan İstasyon Kimliği",
+    "RadiusCalledStationIdDescription": "Aranan cihazın tanımlayıcısı",
+    "RadiusCallingStationId": "Arayan İstasyon Kimliği",
+    "RadiusCallingStationIdDescription": "Arayan cihazın tanımlayıcısı",
+    "Certificate Expiry Notification": "Sertifika Sona Erme Bildirimi",
+    "API Username": "API Kullanıc Adı",
+    "API Key": "API Anahtarı",
+    "Recipient Number": "Alıcı Numarası",
+    "From Name/Number": "İsimden/Numaradan",
+    "Leave blank to use a shared sender number.": "Paylaşılan bir gönderen numarası kullanmak için boş bırakın.",
+    "Octopush API Version": "Octopush API Sürümü",
+    "Legacy Octopush-DM": "Eski Octopush-DM",
+    "endpoint": "uç nokta",
+    "octopushAPIKey": "Kontrol panelindeki HTTP API kimlik bilgilerinden \"API Key\"",
+    "octopushLogin": "Kontrol panelindeki HTTP API kimlik bilgilerinden \"Login\"",
+    "promosmsLogin": "API Oturum Açma Adı",
+    "promosmsPassword": "API Şifresi",
+    "pushoversounds pushover": "Pushover (varsayılan)",
+    "pushoversounds bike": "Bisiklet",
+    "pushoversounds bugle": "Boru",
+    "pushoversounds cashregister": "Yazar kasa",
+    "pushoversounds classical": "Klasik",
+    "pushoversounds cosmic": "Kozmik",
+    "pushoversounds falling": "Düşme",
+    "pushoversounds gamelan": "Oyun Alanı",
+    "pushoversounds incoming": "Gelen",
+    "pushoversounds intermission": "Ara",
+    "pushoversounds magic": "Büyü",
+    "pushoversounds mechanical": "Mekanik",
+    "pushoversounds pianobar": "Piano",
+    "pushoversounds siren": "Siren",
+    "pushoversounds spacealarm": "Uzay Alarmı",
+    "pushoversounds tugboat": "Römorkör",
+    "pushoversounds alien": "Uzaylı Alarmı (uzun)",
+    "pushoversounds climb": "Tırmanış (uzun)",
+    "pushoversounds persistent": "Sürekli (uzun)",
+    "pushoversounds echo": "Pushover Yankı (uzun)",
+    "pushoversounds updown": "Yukarı Aşağı (uzun)",
+    "pushoversounds vibrate": "Sadece titreşim",
+    "pushoversounds none": "Yok (sessiz)",
+    "pushyAPIKey": "Gizli API Anahtarı",
+    "pushyToken": "Cihaz tokeni",
+    "Show update if available": "Varsa güncellemeyi göster",
+    "Also check beta release": "Ayrıca beta sürümünü kontrol edin",
+    "Using a Reverse Proxy?": "Ters Proxy mi Kullanıyorsunuz?",
+    "Check how to config it for WebSocket": "WebSocket için nasıl yapılandırılacağını kontrol edin",
+    "Steam Game Server": "Steam Oyun Sunucusu",
+    "Most likely causes:": "En olası nedenler:",
+    "The resource is no longer available.": "Kaynak artık mevcut değil.",
+    "There might be a typing error in the address.": "Adreste bir yazım hatası olabilir.",
+    "What you can try:": "Ne deneyebilirsin:",
+    "Retype the address.": "Adresi tekrar yazın.",
+    "Go back to the previous page.": "Bir önceki sayfaya geri git.",
+    "Coming Soon": "Yakında gelecek",
+    "wayToGetClickSendSMSToken": "API Kullanıcı Adı ve API Anahtarını {0} adresinden alabilirsiniz.",
+    "Connection String": "Bağlantı dizisi",
+    "Query": "Sorgu",
+    "settingsCertificateExpiry": "TLS Sertifikasının Geçerlilik Süresi",
+    "certificationExpiryDescription": "HTTPS Monitörleri, TLS sertifikasının süresi dolduğunda bildirimi tetikler:",
+    "Setup Docker Host": "Docker Ana Bilgisayarını Kur",
+    "Connection Type": "Bağlantı türü",
+    "Docker Daemon": "Docker Daemon",
+    "deleteDockerHostMsg": "Bu docker ana bilgisayarını tüm monitörler için silmek istediğinizden emin misiniz?",
+    "socket": "Soket",
+    "tcp": "TCP / HTTP",
+    "Docker Container": "Docker Konteyner",
+    "Container Name / ID": "Konteyner Adı / Kimliği",
+    "Docker Host": "Docker Ana Bilgisayarı",
+    "Docker Hosts": "Docker Ana Bilgisayarları",
+    "ntfy Topic": "ntfy Konu",
+    "Domain": "Domain",
+    "Workstation": "İş İstasyonu",
+    "disableCloudflaredNoAuthMsg": "Yetki yok modundasınız, şifre gerekli değil.",
+    "trustProxyDescription": "'X-Forwarded-*' başlıklarına güvenin. Doğru istemci IP'sini almak istiyorsanız ve Uptime Kuma'nız Nginx veya Apache gibi bir proxy'nin arkasındaysa, bunu etkinleştirmelisiniz.",
+    "wayToGetLineNotifyToken": "{0} adresinden bir erişim jetonu alabilirsiniz.",
+    "Examples": "Örnekler",
+    "Home Assistant URL": "Home Assistant URL",
+    "Long-Lived Access Token": "Long-Lived Erişim Anahtarı",
+    "Long-Lived Access Token can be created by clicking on your profile name (bottom left) and scrolling to the bottom then click Create Token. ": "Long-Lived Erişim Anahtarı, profil adınıza (sol altta) tıklayarak ve aşağıya kaydırarak ve ardından Anahtar Oluştur'a tıklayarak oluşturulabilir. ",
+    "Notification Service": "Bildirim Hizmeti",
+    "default: notify all devices": "varsayılan: tüm cihazları bilgilendir",
+    "A list of Notification Services can be found in Home Assistant under \"Developer Tools > Services\" search for \"notification\" to find your device/phone name.": "Cihazınızın/telefonunuzun adını bulmak için Home Assistant'ta \"Geliştirici Araçları > Hizmetler\" \"bildirim\" araması altında bir Bildirim Hizmetleri listesi bulunabilir.",
+    "Automations can optionally be triggered in Home Assistant:": "Otomasyonlar isteğe bağlı olarak Home Assistant'ta tetiklenebilir:",
+    "Trigger type:": "Trigger tipi:",
+    "Event type:": "Etkinlik tipi:",
+    "Event data:": "Etkinlik verileri:",
+    "Then choose an action, for example switch the scene to where an RGB light is red.": "Ardından bir eylem seçin, örneğin RGB ışığının kırmızı olduğu sahneyi değiştirin.",
+    "Frontend Version": "Frontend Sürümü",
+    "Frontend Version do not match backend version!": "Frontend Sürümü, backend sürümüyle eşleşmiyor!",
+    "Base URL": "Temel URL",
+    "goAlertInfo": "GoAlert, çağrı üzerine zamanlama, otomatik eskalasyonlar ve bildirimler (SMS veya sesli çağrılar gibi) için açık kaynaklı bir uygulamadır. Doğru kişiyi, doğru şekilde ve doğru zamanda otomatik olarak devreye sokun! {0}",
+    "goAlertIntegrationKeyInfo": "Servis için genel API entegrasyon anahtarını, genellikle kopyalanan URL'nin belirteç parametresinin değeri olan \"aaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee\" biçiminde alın.",
+    "goAlert": "GoAlert",
+    "backupOutdatedWarning": "Kullanımdan kaldırıldı: Birçok özellik eklendiğinden ve bu yedekleme özelliği biraz bakımsız olduğundan tam bir yedekleme oluşturamaz veya geri yükleyemez.",
+    "backupRecommend": "Lütfen bunun yerine birimi veya veri klasörünü (./data/) doğrudan yedekleyin.",
+    "enableGRPCTls": "TLS bağlantısıyla gRPC isteği göndermeye izin ver",
+    "grpcMethodDescription": "Yöntem adı, sayHello, check, vb. gibi cammelCase biçimine dönüştürülür.",
+    "Maintenance": "Bakım",
+    "statusMaintenance": "Bakım",
+    "Schedule maintenance": "Bakım Planla",
+    "Affected Monitors": "Etkilenen Monitörler",
+    "Pick Affected Monitors...": "Etkilenen Monitörleri Seçin…",
+    "Start of maintenance": "Bakım başlangıcı",
+    "All Status Pages": "Tüm Durum Sayfaları",
+    "Select status pages...": "Durum sayfalarını seçin…",
+    "recurringIntervalMessage": "Her gün bir kez çalıştırın | {0} günde bir çalıştırın",
+    "affectedMonitorsDescription": "Geçerli bakımdan etkilenen monitörleri seçin",
+    "affectedStatusPages": "Bu bakım mesajını seçili durum sayfalarında göster",
+    "atLeastOneMonitor": "Etkilenen en az bir monitör seçin",
+    "deleteMaintenanceMsg": "Bu bakımı silmek istediğinizden emin misiniz?",
+    "ZohoCliq": "ZohoCliq",
+    "webhookAdditionalHeadersTitle": "Ek Başlıklar",
+    "webhookAdditionalHeadersDesc": "Webhook ile gönderilen ek başlıkları ayarlar.",
+    "wayToGetZohoCliqURL": "Bir webhook URL'sinin nasıl oluşturulacağını öğrenebilirsiniz {0}.",
+    "Kook": "Kook",
+    "wayToGetKookBotToken": "Uygulama oluşturun ve {0} adresinde bot tokenı alın",
+    "wayToGetKookGuildID": "Kook ayarında \"Geliştirici Modu\"nu açın ve kimliğini almak için guild'e sağ tıklayın",
+    "Guild ID": "Guild ID",
+    "smseagle": "SMSEagle",
+    "smseagleTo": "Telefon numara(ları)",
+    "smseagleGroup": "Telefon defteri grubu ad(lar)ı",
+    "smseagleContact": "Telefon rehberi kişi ad(lar)ı",
+    "smseagleRecipientType": "Alıcı Türü",
+    "smseagleRecipient": "Alıcı(lar) (birden çok olanlar virgülle ayrılmalıdır)",
+    "smseagleToken": "API Erişim Tokenı",
+    "smseagleUrl": "SMSEagle cihaz URL\"niz",
+    "smseagleEncoding": "Unicode olarak gönder",
+    "smseaglePriority": "Mesaj önceliği (0-9, varsayılan = 0)",
+    "Optional": "İsteğe bağlı",
+    "squadcast": "Squadcast",
+    "SendKey": "SendKey",
+    "SMSManager API Docs": "SMSManager API Dökümanları ",
+    "Gateway Type": "Ağ Geçidi Türü",
+    "SMSManager": "SMSManager",
+    "You can divide numbers with": "Sayıları aşağıdakilerle bölebilirsiniz",
+    "or": "veya",
+    "recurringInterval": "Sıklık",
+    "Recurring": "Yineleme",
+    "strategyManual": "Manuel olarak Aktif/Pasif",
+    "warningTimezone": "Sunucunun kullandığı saat dilimi",
+    "weekdayShortMon": "Pzt",
+    "weekdayShortTue": "Sal",
+    "weekdayShortWed": "Çar",
+    "weekdayShortThu": "Per",
+    "weekdayShortFri": "Cum",
+    "weekdayShortSat": "Cmt",
+    "weekdayShortSun": "Paz",
+    "dayOfWeek": "Haftanın Günleri",
+    "dayOfMonth": "Ayın Günleri",
+    "lastDay": "Son Gün",
+    "lastDay1": "Ayın Son Günü",
+    "lastDay2": "Ayın 2. Son Günü",
+    "lastDay3": "Ayın 3. Son Günü",
+    "lastDay4": "Ayın 4. Son Günü",
+    "No Maintenance": "Bakım Yok",
+    "pauseMaintenanceMsg": "Duraklatmak istediğinizden emin misiniz?",
+    "maintenanceStatus-under-maintenance": "Bakımda",
+    "maintenanceStatus-inactive": "Etkin Değil",
+    "maintenanceStatus-scheduled": "Planlanmış",
+    "maintenanceStatus-ended": "Bitti",
+    "maintenanceStatus-unknown": "Bilinmiyor",
+    "Display Timezone": "Saat dilimini göster",
+    "Server Timezone": "Sunucu Saat Dilimi",
+    "statusPageMaintenanceEndDate": "Bitiş Zamanı",
+    "IconUrl": "Icon URL",
+    "Enable DNS Cache": "DNS Önbelleğini Etkinleştir",
+    "Enable": "Etkin",
+    "Disable": "Devre Dışı",
+    "dnsCacheDescription": "Bazı IPv6 ortamlarında çalışmıyor olabilir, herhangi bir sorunla karşılaşırsanız devre dışı bırakın.",
+    "Single Maintenance Window": "Tek Seferlik Bakım",
+    "Maintenance Time Window of a Day": "Bür Günlük Bakım",
+    "Effective Date Range": "Bakim Tarih Aralığı",
+    "Schedule Maintenance": "Bakım Planla",
+    "Date and Time": "Tarih ve Saat",
+    "DateTime Range": "Tarih ve Saat Aralığı",
+    "Strategy": "Strateji",
+    "Free Mobile User Identifier": "Ücretsiz Mobil Kullanıcı ID",
+    "Free Mobile API Key": "Ücretsiz Mobil API Anahtarı",
+    "Enable TLS": "TLS'yi Etkinleştir",
+    "Proto Service Name": "Proto Service İsmi",
+    "Proto Method": "Proto Method",
+    "Proto Content": "Proto İçeriği",
+    "Economy": "Ekonomik",
+    "Lowcost": "Düşük maliyetli",
+    "high": "Yüksek",
+    "General Monitor Type": "Genel Monitör Tipi",
+    "Passive Monitor Type": "Pasif Monitör Tipi",
+    "Specific Monitor Type": "Özel Monitör Tipi",
+    "Help": "Yardım",
+    "Monitor": "Monitör | Monitörler",
+    "Custom": "Özel",
+    "dataRetentionTimeError": "Saklama süresi 0 veya daha büyük olmalıdır",
+    "confirmDeleteTagMsg": "Bu etiketi silmek istediğinizden emin misiniz? Bu etiketle ilişkili monitörler silinmez.",
+    "promosmsAllowLongSMS": "Uzun SMS'e izin ver",
+    "infiniteRetention": "Sonsuza dek saklamak için 0 giriniz.",
+    "rocket.chat": "Rocket.Chat",
+    "slack": "Slack",
+    "pushover": "Pushover",
+    "Game": "Oyun",
+    "Packet Size": "Paket Boyutu",
+    "Custom Monitor Type": "Özel Monitör Tipi",
+    "clicksendsms": "ClickSend SMS",
+    "loadingError": "Veriler getirilemiyor, lütfen daha sonra tekrar deneyin.",
+    "plugin": "Eklenti | Eklentiler",
+    "install": "Yükle",
+    "installing": "Yükleniyor",
+    "uninstall": "Kaldır",
+    "uninstalling": "Yükleme kaldırılıyor",
+    "confirmUninstallPlugin": "Bu eklentiyi kaldırmak istediğinizden emin misiniz?",
+    "pushy": "Pushy",
+    "octopush": "Octopush",
+    "promosms": "PromoSMS",
+    "lunasea": "LunaSea",
+    "line": "Line Messenger",
+    "mattermost": "Mattermost",
+    "markdownSupported": "Markdown yazım formatı desteklenir",
+    "Google Analytics ID": "Google Analytics ID",
+    "Edit Tag": "Etiketi Düzenle",
+    "Learn More": "Daha fazla bilgi edin",
+    "Server Address": "Sunucu Adresi"
+}
diff --git a/src/lang/uk-UA.json b/src/lang/uk-UA.json
new file mode 100644
index 000000000..9a63cfe07
--- /dev/null
+++ b/src/lang/uk-UA.json
@@ -0,0 +1,567 @@
+{
+    "languageName": "Українська",
+    "checkEverySecond": "Перевірка кожні {0} секунд",
+    "retriesDescription": "Максимальна кількість спроб перед позначенням сервісу як недоступного та надсиланням повідомлення",
+    "ignoreTLSError": "Ігнорувати помилку TLS/SSL для сайтів HTTPS",
+    "upsideDownModeDescription": "Реверс статусу сервісу. Якщо сервіс доступний, він позначається як НЕДОСТУПНИЙ.",
+    "maxRedirectDescription": "Максимальна кількість перенаправлень. Поставте 0, щоб вимкнути перенаправлення.",
+    "acceptedStatusCodesDescription": "Виберіть коди статусів для визначення доступності сервісу.",
+    "passwordNotMatchMsg": "Повторення паролю не збігається.",
+    "notificationDescription": "Прив'яжіть сповіщення до моніторів.",
+    "keywordDescription": "Пошук слова в чистому HTML або JSON-відповіді (чутливо до регістру)",
+    "pauseDashboardHome": "Пауза",
+    "deleteMonitorMsg": "Ви дійсно хочете видалити цей монітор?",
+    "deleteNotificationMsg": "Ви дійсно хочете видалити це сповіщення для всіх моніторів?",
+    "resolverserverDescription": "Cloudflare є сервером за замовчуванням. Ви завжди можете змінити цей сервер.",
+    "rrtypeDescription": "Виберіть тип ресурсного запису, який ви хочете відстежувати",
+    "pauseMonitorMsg": "Ви дійсно хочете поставити на паузу?",
+    "Settings": "Налаштування",
+    "Dashboard": "Панель управління",
+    "New Update": "Оновлення",
+    "Language": "Мова",
+    "Appearance": "Зовнішній вигляд",
+    "Theme": "Тема",
+    "General": "Загальне",
+    "Version": "Версія",
+    "Check Update On GitHub": "Перевірити оновлення на GitHub",
+    "List": "Список",
+    "Add": "Додати",
+    "Add New Monitor": "Новий монітор",
+    "Quick Stats": "Статистика",
+    "Up": "Доступний",
+    "Down": "Недоступний",
+    "Pending": "Очікування",
+    "Unknown": "Невідомо",
+    "Pause": "Пауза",
+    "Name": "Ім'я",
+    "Status": "Статус",
+    "DateTime": "Дата і час",
+    "Message": "Повідомлення",
+    "No important events": "Важливих подій немає",
+    "Resume": "Відновити",
+    "Edit": "Змінити",
+    "Delete": "Видалити",
+    "Current": "Поточний",
+    "Uptime": "Аптайм",
+    "Cert Exp.": "Сертифікат спливає",
+    "day": "день | днів",
+    "-day": "днів",
+    "hour": "година",
+    "-hour": "години",
+    "Response": "Відповідь",
+    "Ping": "Пінг",
+    "Monitor Type": "Тип монітора",
+    "Keyword": "Ключове слово",
+    "Friendly Name": "Ім'я",
+    "URL": "URL",
+    "Hostname": "Адреса хоста",
+    "Port": "Порт",
+    "Heartbeat Interval": "Частота опитування",
+    "Retries": "Спроб",
+    "Advanced": "Додатково",
+    "Upside Down Mode": "Реверс статусу",
+    "Max. Redirects": "Макс. кількість перенаправлень",
+    "Accepted Status Codes": "Припустимі коди статусу",
+    "Save": "Зберегти",
+    "Notifications": "Сповіщення",
+    "Not available, please setup.": "Доступних сповіщень немає, необхідно створити.",
+    "Setup Notification": "Створити сповіщення",
+    "Light": "Світла",
+    "Dark": "Темна",
+    "Auto": "Авто",
+    "Theme - Heartbeat Bar": "Тема - Смуга частоти опитування",
+    "Normal": "Звичайний",
+    "Bottom": "Знизу",
+    "None": "Відсутня",
+    "Timezone": "Часовий пояс",
+    "Search Engine Visibility": "Видимість для пошукових систем",
+    "Allow indexing": "Дозволити індексування",
+    "Discourage search engines from indexing site": "Заборонити індексування",
+    "Change Password": "Змінити пароль",
+    "Current Password": "Поточний пароль",
+    "New Password": "Новий пароль",
+    "Repeat New Password": "Повтор нового пароля",
+    "Update Password": "Оновити пароль",
+    "Disable Auth": "Вимкнути авторизацію",
+    "Enable Auth": "Увімкнути авторизацію",
+    "disableauth.message1": "Ви впевнені, що бажаєте <strong>вимкнути авторизацію</strong>?",
+    "disableauth.message2": "Це підходить для <strong>тих, у кого встановлена інша авторизація</strong> пееред відкриттям Uptime Kuma, наприклад Cloudflare Access.",
+    "Please use this option carefully!": "Будь ласка, використовуйте з обережністю!",
+    "Logout": "Вийти",
+    "Leave": "Відміна",
+    "I understand, please disable": "Я розумію, все одно відключити",
+    "Confirm": "Підтвердити",
+    "Yes": "Так",
+    "No": "Ні",
+    "Username": "Логін",
+    "Password": "Пароль",
+    "Remember me": "Запам'ятати мене",
+    "Login": "Вхід до системи",
+    "No Monitors, please": "Моніторів немає, будь ласка",
+    "No Monitors": "Монітори відсутні",
+    "add one": "створіть новий",
+    "Notification Type": "Тип сповіщення",
+    "Email": "Пошта",
+    "Test": "Перевірка",
+    "Certificate Info": "Інформація про сертифікат",
+    "Resolver Server": "DNS сервер",
+    "Resource Record Type": "Тип ресурсного запису",
+    "Last Result": "Останній результат",
+    "Create your admin account": "Створіть обліковий запис адміністратора",
+    "Repeat Password": "Повторіть пароль",
+    "respTime": "Час відповіді (мс)",
+    "notAvailableShort": "Н/д",
+    "Create": "Створити",
+    "clearEventsMsg": "Ви дійсно хочете видалити всю статистику подій цього монітора?",
+    "clearHeartbeatsMsg": "Ви дійсно хочете видалити всю статистику опитувань цього монітора?",
+    "confirmClearStatisticsMsg": "Ви дійсно хочете видалити ВСЮ статистику?",
+    "Clear Data": "Видалити статистику",
+    "Events": "Події",
+    "Heartbeats": "Опитування",
+    "Auto Get": "Авто-отримання",
+    "enableDefaultNotificationDescription": "Для кожного нового монітора це сповіщення буде включено за замовчуванням. Ви все ще можете відключити сповіщення в кожному моніторі окремо.",
+    "Default enabled": "Використовувати за промовчанням",
+    "Also apply to existing monitors": "Застосувати до існуючих моніторів",
+    "Export": "Експорт",
+    "Import": "Імпорт",
+    "backupDescription": "Ви можете зберегти резервну копію всіх моніторів та повідомлень у вигляді JSON-файлу",
+    "backupDescription2": "P.S.: Історія та події збережені не будуть",
+    "backupDescription3": "Важливі дані, такі як токени повідомлень, додаються під час експорту, тому зберігайте файли в безпечному місці",
+    "alertNoFile": "Виберіть файл для імпорту.",
+    "alertWrongFileType": "Виберіть JSON-файл.",
+    "twoFAVerifyLabel": "Будь ласка, введіть свій токен, щоб перевірити роботу 2FA",
+    "tokenValidSettingsMsg": "Токен дійсний! Тепер ви можете зберегти налаштування 2FA.",
+    "confirmEnableTwoFAMsg": "Ви дійсно хочете увімкнути 2FA?",
+    "confirmDisableTwoFAMsg": "Ви дійсно хочете вимкнути 2FA?",
+    "Apply on all existing monitors": "Застосувати до всіх існуючих моніторів",
+    "Verify Token": "Перевірити токен",
+    "Setup 2FA": "Налаштування 2FA",
+    "Enable 2FA": "Увімкнути 2FA",
+    "Disable 2FA": "Вимкнути 2FA",
+    "2FA Settings": "Налаштування 2FA",
+    "Two Factor Authentication": "Двофакторна аутентифікація",
+    "Active": "Активно",
+    "Inactive": "Неактивно",
+    "Token": "Токен",
+    "Show URI": "Показати URI",
+    "Clear all statistics": "Очистити статистику",
+    "retryCheckEverySecond": "Повтор кожні {0} секунд",
+    "importHandleDescription": "Виберіть \"Пропустити існуючі\", якщо ви хочете пропустити кожен монітор або повідомлення з таким же ім'ям. \"Перезаписати\" видалить кожен існуючий монітор або повідомлення та додасть заново. Варіант \"Не перевіряти\" примусово відновлює всі монітори і повідомлення, навіть якщо вони вже існують.",
+    "confirmImportMsg": "Ви дійсно хочете відновити резервну копію? Переконайтеся, що ви вибрали відповідний варіант імпорту.",
+    "Heartbeat Retry Interval": "Інтервал повтору опитування",
+    "Import Backup": "Імпорт",
+    "Export Backup": "Експорт",
+    "Skip existing": "Пропустити існуючі",
+    "Overwrite": "Перезаписати",
+    "Options": "Опції",
+    "Keep both": "Не перевіряти",
+    "Tags": "Теги",
+    "Add New below or Select...": "Додати новий або вибрати…",
+    "Tag with this name already exist.": "Такий тег вже існує.",
+    "Tag with this value already exist.": "Тег із таким значенням вже існує.",
+    "color": "колір",
+    "value (optional)": "значення (опціонально)",
+    "Gray": "Сірий",
+    "Red": "Червоний",
+    "Orange": "Помаранчевий",
+    "Green": "Зелений",
+    "Blue": "Синій",
+    "Indigo": "Індиго",
+    "Purple": "Пурпурний",
+    "Pink": "Рожевий",
+    "Search...": "Пошук…",
+    "Avg. Ping": "Середній пінг",
+    "Avg. Response": "Середній час відповіді",
+    "Entry Page": "Головна сторінка",
+    "statusPageNothing": "Тут порожньо. Додайте групу або монітор.",
+    "No Services": "Немає сервісів",
+    "All Systems Operational": "Всі системи працюють у штатному режимі",
+    "Partially Degraded Service": "Сервіси працюють частково",
+    "Degraded Service": "Всі сервіси не працюють",
+    "Add Group": "Додати групу",
+    "Add a monitor": "Додати монітор",
+    "Edit Status Page": "Редагувати",
+    "Go to Dashboard": "Панель управління",
+    "Status Page": "Сторінка статусу",
+    "Status Pages": "Сторінки статусу",
+    "Discard": "Скасування",
+    "Create Incident": "Створити інцидент",
+    "Switch to Dark Theme": "Темна тема",
+    "Switch to Light Theme": "Світла тема",
+    "telegram": "Telegram",
+    "webhook": "Вебхук",
+    "smtp": "Email (SMTP)",
+    "discord": "Discord",
+    "teams": "Microsoft Teams",
+    "signal": "Signal",
+    "gotify": "Gotify",
+    "slack": "Slack",
+    "rocket.chat": "Rocket.chat",
+    "pushover": "Pushover",
+    "pushy": "Pushy",
+    "octopush": "Octopush",
+    "promosms": "PromoSMS",
+    "lunasea": "LunaSea",
+    "apprise": "Apprise (Підтримка 50+ сервісів повідомлень)",
+    "pushbullet": "Pushbullet",
+    "line": "Line Messenger",
+    "mattermost": "Mattermost",
+    "Primary Base URL": "Основна URL",
+    "Push URL": "URL пуша",
+    "needPushEvery": "Цю URL необхідно викликати кожні {0} секунд",
+    "pushOptionalParams": "Додаткові параметри: {0}",
+    "defaultNotificationName": "Моє сповіщення {notification} ({number})",
+    "here": "тут",
+    "Required": "Потрібно",
+    "Bot Token": "Токен бота",
+    "wayToGetTelegramToken": "Ви можете взяти токен тут - {0}.",
+    "Chat ID": "ID чату",
+    "supportTelegramChatID": "Підтримуються ID чатів, груп та каналів",
+    "wayToGetTelegramChatID": "Ви можете взяти ID вашого чату, відправивши повідомлення боту і перейшовши по цьому URL для перегляду chat_id:",
+    "YOUR BOT TOKEN HERE": "ВАШ ТОКЕН БОТА ТУТ",
+    "chatIDNotFound": "ID чату не знайдено; будь ласка, відправте спочатку повідомлення боту",
+    "Post URL": "Post URL",
+    "Content Type": "Тип контенту",
+    "webhookJsonDesc": "{0} підходить для будь-яких сучасних HTTP-серверів, наприклад Express.js",
+    "webhookFormDataDesc": "{multipart} підходить для PHP. JSON-вивід необхідно буде обробити за допомогою {decodeFunction}",
+    "secureOptionNone": "Ні / STARTTLS (25, 587)",
+    "secureOptionTLS": "TLS (465)",
+    "Ignore TLS Error": "Ігнорувати помилки TLS",
+    "From Email": "Від кого",
+    "emailCustomSubject": "Своя тема",
+    "To Email": "Кому",
+    "smtpCC": "Копія",
+    "smtpBCC": "Прихована копія",
+    "Discord Webhook URL": "Discord Вебхук URL",
+    "wayToGetDiscordURL": "Ви можете створити його в Параметрах сервера -> Інтеграції -> Створити вебхук",
+    "Bot Display Name": "Ім'я бота, що відображається",
+    "Prefix Custom Message": "Свій префікс повідомлення",
+    "Hello @everyone is...": "Привіт {'@'}everyone це...",
+    "Webhook URL": "URL вебхука",
+    "wayToGetTeamsURL": "Як створити URL вебхука ви можете дізнатися тут - {0}.",
+    "Номер": "Номер",
+    "Recipients": "Одержувачі",
+    "needSignalAPI": "Вам необхідний клієнт Signal із підтримкою REST API.",
+    "wayToCheckSignalURL": "Пройдіть по цьому URL, щоб дізнатися як налаштувати такий клієнт:",
+    "signalImportant": "ВАЖЛИВО: Не можна змішувати в Одержувачах групи та номери!",
+    "Application Token": "Токен програми",
+    "Server URL": "URL сервера",
+    "Priority": "Пріоритет",
+    "Icon Emoji": "Іконка Emoji",
+    "Channel Name": "Ім'я каналу",
+    "Uptime Kuma URL": "Uptime Kuma URL",
+    "aboutWebhooks": "Більше інформації про вебхуки: {0}",
+    "aboutChannelName": "Введіть ім'я каналу в поле {0} Ім'я каналу, якщо ви хочете обійти канал вебхука. Наприклад: #other-channel",
+    "aboutKumaURL": "Якщо поле Uptime Kuma URL в налаштуваннях залишиться порожнім, за замовчуванням буде використовуватися посилання на проект на GitHub.",
+    "emojiCheatSheet": "Шпаргалка по Emoji: {0}",
+    "User Key": "Ключ користувача",
+    "Device": "Пристрій",
+    "Message Title": "Заголовок повідомлення",
+    "Notification Sound": "Звук сповіщення",
+    "More info on:": "Більше інформації: {0}",
+    "pushoverDesc1": "Екстренний пріоритет (2) має таймуут повтору за замовчуванням 30 секунд і закінчується через 1 годину.",
+    "pushoverDesc2": "Якщо ви бажаєте надсилати повідомлення різним пристроям, необхідно заповнити поле Пристрій.",
+    "SMS Type": "Тип SMS",
+    "octopushTypePremium": "Преміум (Швидкий - рекомендується для алертів)",
+    "octopushTypeLowCost": "Дешевий (Повільний - іноді блокується операторами)",
+    "checkPrice": "Тарифи {0}:",
+    "octopushLegacyHint": "Ви використовуєте стару версію Octopush (2011-2020) або нову?",
+    "Check octopush prices": "Тарифи Octopush {0}.",
+    "octopushPhoneNumber": "Номер телефону (між. формат, наприклад: +380123456789)",
+    "octopushSMSSender": "Ім'я відправника SMS: 3-11 символів алвафіту, цифр та пробілів (a-zA-Z0-9)",
+    "LunaSea Device ID": "ID пристрою LunaSea",
+    "Apprise URL": "Apprise URL",
+    "Example:": "Приклад: {0}",
+    "Read more:": "Докладніше: {0}",
+    "Status:": "Статус: {0}",
+    "Read more": "Докладніше",
+    "appriseInstalled": "Apprise встановлено.",
+    "appriseNotInstalled": "Apprise не встановлено. {0}",
+    "Access Token": "Токен доступу",
+    "Channel access token": "Токен доступу каналу",
+    "Line Developers Console": "Консоль розробників Line",
+    "lineDevConsoleTo": "Консоль розробників Line - {0}",
+    "Basic Settings": "Базові налаштування",
+    "User ID": "ID користувача",
+    "Messaging API": "API повідомлень",
+    "wayToGetLineChannelToken": "Спочатку зайдіть в {0}, створіть провайдера та канал (API повідомлень), потім ви зможете отримати токен доступу каналу та ID користувача з вищезгаданих пунктів меню.",
+    "Icon URL": "URL іконки",
+    "aboutIconURL": "Ви можете надати посилання на іконку в полі \"URL іконки\", щоб перевизначити картинку профілю за замовчуванням. Не використовується, якщо задана іконка Emoji.",
+    "aboutMattermostChannelName": "Ви можете перевизначити канал за замовчуванням, в який пише вебхук, ввівши ім'я каналу в полі \"Ім'я каналу\". Це необхідно включити в налаштуваннях вебхука Mattermost. Наприклад: #other-channel",
+    "matrix": "Matrix",
+    "promosmsTypeEco": "SMS ECO - дешево та повільно, часто перевантажений. Тільки для одержувачів з Польщі.",
+    "promosmsTypeFlash": "SMS FLASH - повідомлення автоматично з'являться на пристрої одержувача. Тільки для одержувачів з Польщі.",
+    "promosmsTypeFull": "SMS FULL - преміум-рівень SMS, можна використовувати своє ім'я відправника (попередньо зареєструвавши його). Надійно для алертів.",
+    "promosmsTypeSpeed": "SMS SPEED - найвищий пріоритет у системі. Дуже швидко і надійно, але дуже дорого (вдвічі дорожче, ніж SMS FULL).",
+    "promosmsPhoneNumber": "Номер телефону (для одержувачів з Польщі можна пропустити код регіону)",
+    "promosmsSMSSender": "Ім'я відправника SMS: Зареєстроване або одне з імен за замовчуванням: InfoSMS, SMS Info, MaxSMS, INFO, SMS",
+    "Feishu WebHookURL": "Feishu WebHookURL",
+    "matrixHomeserverURL": "URL сервера (разом з http(s):// і опціонально порт)",
+    "Internal Room Id": "Внутрішній ID кімнати",
+    "matrixDesc1": "Внутрішній ID кімнати можна знайти в Подробицях у параметрах каналу вашого Matrix клієнта. Він повинен виглядати приблизно як !QMdRCpUIfLwsfjxye6:home.server.",
+    "matrixDesc2": "Рекомендується створити нового користувача і не використовувати токен доступу особистого користувача Matrix, тому що це спричиняє повний доступ до облікового запису та до кімнат, в яких ви є. Замість цього створіть нового користувача і запросіть його тільки в ту кімнату, в якій ви хочете отримувати повідомлення.Токен доступу можна отримати, виконавши команду {0}",
+    "Method": "Метод",
+    "Body": "Тіло",
+    "Headers": "Заголовки",
+    "PushUrl": "URL пуша",
+    "HeadersInvalidFormat": "Заголовки запиту некоректні JSON: ",
+    "BodyInvalidFormat": "Тіло запиту некоректне JSON: ",
+    "Monitor History": "Статистика",
+    "clearDataOlderThan": "Зберігати статистику за {0} днів.",
+    "PasswordsDoNotMatch": "Паролі не співпадають.",
+    "records": "записів",
+    "One record": "Один запис",
+    "steamApiKeyDescription": "Для моніторингу ігрового сервера Steam вам потрібен Web-API ключ Steam. Зареєструвати його можна тут: ",
+    "Certificate Chain": "Ланцюжок сертифікатів",
+    "Valid": "Дійсний",
+    "Hide Tags": "Приховати теги",
+    "Title": "Назва інциденту:",
+    "Content": "Зміст інциденту:",
+    "Post": "Опублікувати",
+    "Cancel": "Скасувати",
+    "Created": "Створено",
+    "Unpin": "Відкріпити",
+    "Show Tags": "Показати теги",
+    "recent": "Зараз",
+    "3h": "3 години",
+    "6h": "6 годин",
+    "24h": "24 години",
+    "1w": "1 тиждень",
+    "No monitors available.": "Немає доступних моніторів",
+    "Add one": "Додати новий",
+    "Backup": "Резервна копія",
+    "Security": "Безпека",
+    "Shrink Database": "Стиснути базу даних",
+    "Current User": "Поточний користувач",
+    "About": "Про програму",
+    "Description": "Опис",
+    "Powered by": "Працює на основі скрипту від",
+    "shrinkDatabaseDescription": "Включає VACUUM для бази даних SQLite. Якщо база даних була створена на версії 1.10.0 і більше, AUTO_VACUUM вже включений і ця дія не потрібна.",
+    "Style": "Стиль",
+    "info": "ІНФО",
+    "warning": "УВАГА",
+    "danger": "ПОМИЛКА",
+    "primary": "ОСНОВНИЙ",
+    "light": "СВІТЛИЙ",
+    "dark": "ТЕМНИЙ",
+    "New Status Page": "Нова сторінка статусу",
+    "Show update if available": "Показувати доступні оновлення",
+    "Also check beta release": "Перевіряти оновлення для бета версій",
+    "Add New Status Page": "Додати сторінку статусу",
+    "Next": "Далі",
+    "Acz characters: a-z 0-9 -": "Дозволені символи: a-z 0-9 -",
+    "Start or end with a-z 0-9 only": "Початок та закінчення імені лише на символи: a-z 0-9",
+    "No consecutive dashes --": "Заборонено використовувати тире --",
+    "HTTP Options": "HTTP Опції",
+    "Authentication": "Аутентифікація",
+    "HTTP Basic Auth": "Базова HTTP",
+    "PushByTechulus": "Push by Techulus",
+    "clicksendsms": "ClickSend SMS",
+    "GoogleChat": "Google Chat (тільки Google Workspace)",
+    "apiCredentials": "API реквізити",
+    "Done": "Готово",
+    "Info": "Інфо",
+    "Steam API Key": "Steam API-Ключ",
+    "Pick a RR-Type...": "Виберіть RR-тип…",
+    "Pick Accepted Status Codes...": "Виберіть прийняті коди стану…",
+    "Default": "За замовчуванням",
+    "Please input title and content": "Будь ласка, введіть назву та зміст",
+    "Last Updated": "Останнє Оновлення",
+    "Untitled Group": "Група без назви",
+    "Services": "Сервіси",
+    "serwersms": "SerwerSMS.pl",
+    "serwersmsAPIUser": "API Користувач (включаючи префікс webapi_)",
+    "serwersmsAPIPassword": "API Пароль",
+    "serwersmsPhoneNumber": "Номер телефону",
+    "serwersmsSenderName": "SMS ім'я відправника (реєстрований через портал користувача)",
+    "stackfield": "Stackfield",
+    "smtpDkimSettings": "DKIM Налаштування",
+    "smtpDkimDesc": "Повернутися до Nodemailer DKIM {0} для використання.",
+    "documentation": "документація",
+    "smtpDkimDomain": "Ім'я домена",
+    "smtpDkimKeySelector": "Ключ",
+    "smtpDkimPrivateKey": "Приватний ключ",
+    "smtpDkimHashAlgo": "Алгоритм хеша (опціонально)",
+    "smtpDkimheaderFieldNames": "Заголовок ключів для підпису (опціонально)",
+    "smtpDkimskipFields": "Заколовок ключів не для підпису (опціонально)",
+    "gorush": "Gorush",
+    "alerta": "Alerta",
+    "alertaApiEndpoint": "Кінцева точка API",
+    "alertaEnvironment": "Середовище",
+    "alertaApiKey": "Ключ API",
+    "alertaAlertState": "Стан алерту",
+    "alertaRecoverState": "Стан відновлення",
+    "deleteStatusPageMsg": "Дійсно хочете видалити цю сторінку статусів?",
+    "Proxies": "Проксі",
+    "default": "За замовчуванням",
+    "enabled": "Активно",
+    "setAsDefault": "Встановити за замовчуванням",
+    "deleteProxyMsg": "Ви впевнені, що хочете видалити цей проксі для всіх моніторів?",
+    "proxyDescription": "Щоб функціонувати, монітору потрібно призначити проксі.",
+    "enableProxyDescription": "Цей проксі не впливатиме на запити моніторингу, доки його не буде активовано. Ви можете контролювати тимчасове відключення проксі з усіх моніторів за статусом активації.",
+    "setAsDefaultProxyDescription": "Цей проксі буде ввімкнено за умовчанням для нових моніторів. Ви все одно можете вимкнути проксі окремо для кожного монітора.",
+    "Invalid": "Недійсний",
+    "AccessKeyId": "AccessKey ID",
+    "SecretAccessKey": "AccessKey Secret",
+    "PhoneNumbers": "PhoneNumbers",
+    "TemplateCode": "TemplateCode",
+    "SignName": "SignName",
+    "Sms template must contain parameters: ": "Шаблон смс повинен містити параметри: ",
+    "Bark Endpoint": "Bark Endpoint",
+    "WebHookUrl": "WebHookUrl",
+    "SecretKey": "SecretKey",
+    "For safety, must use secret key": "Для безпеки необхідно використовувати секретний ключ",
+    "Device Token": "Токен пристрою",
+    "Platform": "Платформа",
+    "iOS": "iOS",
+    "Android": "Android",
+    "Huawei": "Huawei",
+    "High": "Високий",
+    "Retry": "Повтор",
+    "Topic": "Тема",
+    "WeCom Bot Key": "WeCom Bot ключ",
+    "Setup Proxy": "Налаштувати проксі",
+    "Proxy Protocol": "Протокол проксі",
+    "Proxy Server": "Проксі-сервер",
+    "Proxy server has authentication": "Проксі-сервер має аутентифікацію",
+    "User": "Користувач",
+    "Installed": "Встановлено",
+    "Not installed": "Не встановлено",
+    "Running": "Запущено",
+    "Not running": "Не запущено",
+    "Remove Token": "Видалити токен",
+    "Start": "Запустити",
+    "Stop": "Зупинити",
+    "Uptime Kuma": "Uptime Kuma",
+    "Slug": "Slug",
+    "Accept characters:": "Прийняти символи:",
+    "startOrEndWithOnly": "Починається або закінчується лише {0}",
+    "No consecutive dashes": "Немає послідовних тире",
+    "The slug is already taken. Please choose another slug.": "The slug is already taken. Please choose another slug.",
+    "No Proxy": "Без проксі",
+    "Page Not Found": "Сторінку не знайдено",
+    "Reverse Proxy": "Реверсивний проксі",
+    "wayToGetCloudflaredURL": "(Завантажити Cloudflare з {0})",
+    "cloudflareWebsite": "Веб-сайт Cloudflare",
+    "Message:": "Повідомлення:",
+    "Don't know how to get the token? Please read the guide:": "Не знаєте, як отримати токен? Прочитайте посібник:",
+    "The current connection may be lost if you are currently connecting via Cloudflare Tunnel. Are you sure want to stop it? Type your current password to confirm it.": "Поточне з’єднання може бути втрачено, якщо ви зараз під’єднуєтеся через Cloudflare Tunnel. Ви дійсно хочете зробити це? Для підтвердження введіть поточний пароль.",
+    "Other Software": "Інше програмне забезпечення",
+    "For example: nginx, Apache and Traefik.": "Наприклад: nginx, Apache and Traefik.",
+    "Please read": "Будь ласка, прочитайте",
+    "Subject:": "Тема:",
+    "Valid To:": "Дійсний до:",
+    "Days Remaining:": "Залишилось днів:",
+    "Issuer:": "Емітент:",
+    "Fingerprint:": "Відбиток:",
+    "No status pages": "Немає сторінок статусу",
+    "Domain Name Expiry Notification": "Сповіщення про закінчення терміну дії доменного імені",
+    "Proxy": "Проксі",
+    "Date Created": "Дата створення",
+    "onebotHttpAddress": "OneBot адреса HTTP",
+    "onebotMessageType": "OneBot тип повідомлення",
+    "onebotGroupMessage": "Група",
+    "onebotPrivateMessage": "Приватне",
+    "onebotUserOrGroupId": "Група/Користувач ID",
+    "onebotSafetyTips": "Для безпеки необхідно встановити маркер доступу",
+    "PushDeer Key": "PushDeer ключ",
+    "Footer Text": "Текст нижнього колонтитула",
+    "Show Powered By": "Показувати платформу",
+    "Domain Names": "Доменні імена",
+    "signedInDisp": "Ви ввійшли як {0}",
+    "signedInDispDisabled": "Авторизація вимкнена.",
+    "Certificate Expiry Notification": "Сповіщення про закінчення терміну дії сертифіката",
+    "API Username": "Користувач API",
+    "API Key": "Ключ API",
+    "Recipient Number": "Номер одержувача",
+    "From Name/Number": "Від Ім'я/Номер",
+    "Leave blank to use a shared sender number.": "Залиште поле порожнім, щоб використовувати спільний номер відправника.",
+    "Octopush API Version": "Octopush API версія",
+    "Legacy Octopush-DM": "Legacy Octopush-DM",
+    "endpoint": "кінцева точка",
+    "octopushAPIKey": "\"Ключ API\" з облікових даних HTTP API в панелі керування",
+    "octopushLogin": "\"Ім'я користувача\" з облікових даних HTTP API на панелі керування",
+    "promosmsLogin": "API Логін",
+    "promosmsPassword": "API Пароль",
+    "pushoversounds pushover": "Pushover (по замовчуванню)",
+    "pushoversounds bike": "Bike",
+    "pushoversounds bugle": "Bugle",
+    "pushoversounds cashregister": "Cash Register",
+    "pushoversounds classical": "Classical",
+    "pushoversounds cosmic": "Cosmic",
+    "pushoversounds falling": "Falling",
+    "pushoversounds gamelan": "Gamelan",
+    "pushoversounds incoming": "Incoming",
+    "pushoversounds intermission": "Intermission",
+    "pushoversounds magic": "Magic",
+    "pushoversounds mechanical": "Mechanical",
+    "pushoversounds pianobar": "Piano Bar",
+    "pushoversounds siren": "Siren",
+    "pushoversounds spacealarm": "Space Alarm",
+    "pushoversounds tugboat": "Tug Boat",
+    "pushoversounds alien": "Alien Alarm (long)",
+    "pushoversounds climb": "Climb (long)",
+    "pushoversounds persistent": "Persistent (long)",
+    "pushoversounds echo": "Pushover Echo (long)",
+    "pushoversounds updown": "Up Down (long)",
+    "pushoversounds vibrate": "Vibrate Only",
+    "pushoversounds none": "None (silent)",
+    "pushyAPIKey": "Секретний ключ API",
+    "pushyToken": "Токен пристрою",
+    "Using a Reverse Proxy?": "Використовувати зворотній проксі?",
+    "Check how to config it for WebSocket": "Перевірте, як налаштувати його для WebSocket",
+    "Steam Game Server": "Ігровий сервер Steam",
+    "Most likely causes:": "Найімовірніші причини:",
+    "The resource is no longer available.": "Ресурс більше не доступний.",
+    "There might be a typing error in the address.": "Можливо, в адресі є помилка.",
+    "What you can try:": "Що ви можете спробувати:",
+    "Retype the address.": "Повторно введіть адресу.",
+    "Go back to the previous page.": "Повернутися на попередню сторінку.",
+    "Coming Soon": "Незабаром",
+    "wayToGetClickSendSMSToken": "Ви можете отримати ім’я користувача API та ключ API з {0} .",
+    "Connection String": "Рядок підключення",
+    "Query": "Запит",
+    "settingsCertificateExpiry": "Закінчення терміну дії сертифіката TLS",
+    "certificationExpiryDescription": "Запуск сповіщення для HTTPS моніторів коли до закінчення терміну дії TLS сертифіката:",
+    "ntfy Topic": "ntfy Тема",
+    "Domain": "Домен",
+    "Workstation": "Робоча станція",
+    "disableCloudflaredNoAuthMsg": "Ви перебуваєте в режимі без авторизації, пароль не потрібен.",
+    "Schedule maintenance": "Графік обслуговування",
+    "Affected Monitors": "Задіяні монітори",
+    "HomeAssistant": "Home Assistant",
+    "smseaglePriority": "Пріоритет повідомлення (0-9, за замовчуванням = 0)",
+    "smseagleRecipient": "Отримувач(і) (декілька отримувачів повинні бути відокремлені комами)",
+    "markdownSupported": "Підтримується синтаксис розмітки",
+    "Resend Notification if Down X times consequently": "Повторно надсилати сповіщення, якщо падіння відбулося X разів підряд",
+    "resendEveryXTimes": "Повторно відправляти кожні {0} разів",
+    "resendDisabled": "Повторне надсилання вимкнено",
+    "Start of maintenance": "Початок обслуговування",
+    "Select status pages...": "Вибери сторінку стану…",
+    "All Status Pages": "Всі сторінки станів",
+    "Passive Monitor Type": "Пасивний моніторинг",
+    "Specific Monitor Type": "Специфічний моніторинг",
+    "Monitor": "Монітор | Монітори",
+    "smseagle": "SMSEagle",
+    "smseagleEncoding": "Надсилати в Unicode",
+    "smseagleUrl": "URL-адреса пристрою SMSEagle",
+    "smseagleToken": "Токен доступу API",
+    "smseagleRecipientType": "Тип одержувача",
+    "smseagleContact": "Телефонний контакт(и)",
+    "smseagleGroup": "Телефонна група(и)",
+    "smseagleTo": "Телефонний номер(и)",
+    "Help": "Допомога",
+    "Game": "Гра",
+    "Pick Affected Monitors...": "Виберіть задіяні монітори…",
+    "statusMaintenance": "Обслуговування",
+    "Maintenance": "Обслуговування",
+    "General Monitor Type": "Основний моніторинг",
+    "error": "Помилка",
+    "webhookAdditionalHeadersTitle": "Додаткові заголовки",
+    "webhookAdditionalHeadersDesc": "Задати додаткові заголовки, що за допомогою вебхука.",
+    "critical": "Критичний",
+    "Custom": "Нестандартний",
+    "successMessage": "Повідомлення про успіх",
+    "Customize": "Налаштувати",
+    "topic": "Тема"
+}
diff --git a/src/lang/vi-VN.json b/src/lang/vi-VN.json
new file mode 100644
index 000000000..165bf1bb8
--- /dev/null
+++ b/src/lang/vi-VN.json
@@ -0,0 +1,463 @@
+{
+    "languageName": "Tiếng Việt",
+    "checkEverySecond": "Kiểm tra mỗi {0} giây.",
+    "retryCheckEverySecond": "Thử lại mỗi {0} giây.",
+    "retriesDescription": "Số lần thử lại tối đa trước khi dịch vụ được đánh dấu là down và gửi thông báo.",
+    "ignoreTLSError": "Bỏ qua lỗi TLS/SSL với các web HTTPS.",
+    "upsideDownModeDescription": "Trạng thái đảo ngược, nếu dịch vụ có thể truy cập được nghĩa là DOWN.",
+    "maxRedirectDescription": "Số lần chuyển hướng (redirect) tối đa. Đặt thành 0 để tắt chuyển hướng",
+    "acceptedStatusCodesDescription": "Chọn mã trạng thái được coi là phản hồi thành công.",
+    "passwordNotMatchMsg": "Mật khẩu nhập lại không khớp.",
+    "notificationDescription": "Vui lòng chỉ định một kênh thông báo.",
+    "keywordDescription": "Từ khoá tìm kiếm phản hồi ở dạng html hoặc JSON, có phân biệt chữ HOA - thường",
+    "pauseDashboardHome": "Tạm dừng",
+    "deleteMonitorMsg": "Bạn chắc chắn muốn xóa kênh theo dõi này chứ?",
+    "deleteNotificationMsg": "Bạn có chắc chắn muốn xóa kênh thông báo này cho tất cả kênh theo dõi?",
+    "resolverserverDescription": "Cloudflare là máy chủ mặc định, bạn có thể thay đổi bất cứ lúc nào.",
+    "rrtypeDescription": "Hãy chọn RR-Type mà bạn muốn giám sát",
+    "pauseMonitorMsg": "Bạn chắc chắn muốn tạm dừng chứ?",
+    "enableDefaultNotificationDescription": "Bật làm mặc định cho mọi kênh theo dõi mới về sau. Bạn vẫn có thể tắt thông báo riêng cho từng kênh theo dõi.",
+    "clearEventsMsg": "Bạn chắc chắn muốn xoá TẤT CẢ sự kiện cho kênh theo dõi này chứ?",
+    "clearHeartbeatsMsg": "Bạn chắc chắn muốn xoá TẤT CẢ heartbeats cho kênh theo dõi này chứ?",
+    "confirmClearStatisticsMsg": "Bạn chắc chắn muốn xoá TẤT CẢ số liệu thống kê?",
+    "importHandleDescription": "Chọn 'Giữ lại' nếu bạn muốn bỏ qua mọi kênh theo dõi và kênh thông báo trùng tên. 'Ghi đè' sẽ ghi đè lên tất cả các kênh theo dõi và kênh thông báo.",
+    "confirmImportMsg": "Bạn có chắc chắn muốn khôi phục bản bản sao lưu này không?.",
+    "twoFAVerifyLabel": "Vui lòng nhập mã token của bạn để xác minh rằng xác thực 2 lớp (2FA) đang hoạt động",
+    "tokenValidSettingsMsg": "Mã token hợp lệ! Bạn có thể lưu cài đặt xác thực 2 lớp (2FA) bây giờ.",
+    "confirmEnableTwoFAMsg": "Bạn chắc chắn muốn bật xác thực 2 lớp (2FA) chứ?",
+    "confirmDisableTwoFAMsg": "Bạn chắc chắn muốn tắt xác thực 2 lớp (2FA) chứ?",
+    "Settings": "Cài đặt",
+    "Dashboard": "Dashboard",
+    "New Update": "Bản cập nhật mới",
+    "Language": "Ngôn ngữ",
+    "Appearance": "Giao diện",
+    "Theme": "Theme",
+    "General": "Chung",
+    "Primary Base URL": "URL chính",
+    "Version": "Phiên bản",
+    "Check Update On GitHub": "Kiểm tra bản cập nhật mới trên GitHub",
+    "List": "List",
+    "Add": "Thêm",
+    "Add New Monitor": "Thêm mới kênh theo dõi",
+    "Quick Stats": "Thống kê nhanh",
+    "Up": "Up",
+    "Down": "Down",
+    "Pending": "Chờ xử lý",
+    "Unknown": "Không xác định",
+    "Pause": "Tạm dừng",
+    "Name": "Tên",
+    "Status": "Trạng thái",
+    "DateTime": "Ngày tháng",
+    "Message": "Trạng thái request",
+    "No important events": "Không có sự kiện quan trọng nào",
+    "Resume": "Khôi phục",
+    "Edit": "Sửa",
+    "Delete": "Xoá",
+    "Current": "Hiện tại",
+    "Uptime": "Uptime",
+    "Cert Exp.": "Cert hết hạn",
+    "day": "ngày",
+    "-day": "-ngày",
+    "hour": "giờ",
+    "-hour": "-giờ",
+    "Response": "Phản hồi",
+    "Ping": "Ping",
+    "Monitor Type": "Kiểu kênh theo dõi",
+    "Keyword": "Từ khoá",
+    "Friendly Name": "Tên rút gọn",
+    "URL": "URL",
+    "Hostname": "Hostname",
+    "Port": "Port",
+    "Heartbeat Interval": "Tần suất kiểm tra",
+    "Retries": "Thử lại",
+    "Heartbeat Retry Interval": "Tần suất kiểm tra lại",
+    "Advanced": "Nâng cao",
+    "Upside Down Mode": "Chế độ đảo ngược",
+    "Max. Redirects": "Số chuyển hướng tối đa",
+    "Accepted Status Codes": "Codes trạng thái chấp nhận",
+    "Push URL": "Push URL",
+    "needPushEvery": "Bạn nên gọi URL mỗi {0} giây.",
+    "pushOptionalParams": "Tuỳ chỉnh parameters: {0}",
+    "Save": "Lưu",
+    "Notifications": "Thông báo",
+    "Not available, please setup.": "Chưa sẵn sàng, hãy cài đặt.",
+    "Setup Notification": "Cài đặt thông báo",
+    "Light": "Sáng",
+    "Dark": "Tối",
+    "Auto": "Tự động",
+    "Theme - Heartbeat Bar": "Theme - Heartbeat Bar",
+    "Normal": "Bình thường",
+    "Bottom": "Dưới",
+    "None": "Không có",
+    "Timezone": "Múi giờ",
+    "Search Engine Visibility": "Hiển thị với các công cụ tìm kiếm",
+    "Allow indexing": "Cho phép indexing",
+    "Discourage search engines from indexing site": "Ngăn chặn các công cụ tìm kiếm indexing trang",
+    "Change Password": "Thay đổi mật khẩu",
+    "Current Password": "Mật khẩu hiện tại",
+    "New Password": "Mật khẩu mới",
+    "Repeat New Password": "Lặp lại mật khẩu mới",
+    "Update Password": "Cập nhật mật khẩu",
+    "Disable Auth": "Tắt xác minh",
+    "Enable Auth": "Bật xác minh",
+    "disableauth.message1": "Bạn có muốn <strong>TẮT XÁC THỰC</strong> không?",
+    "disableauth.message2": "Điều này rất nguy hiểm<strong>BẤT KỲ AI</strong> cũng có thể truy cập và cướp quyền điều khiển.",
+    "Please use this option carefully!": "Vui lòng <strong>cẩn thận</strong>.",
+    "Logout": "Đăng xuất",
+    "Leave": "Rời",
+    "I understand, please disable": "Tôi hiểu, làm ơn hãy tắt!",
+    "Confirm": "Xác nhận",
+    "Yes": "Có",
+    "No": "Không",
+    "Username": "Tài khoản",
+    "Password": "Mật khẩu",
+    "Remember me": "Lưu phiên đăng nhập",
+    "Login": "Đăng nhập",
+    "No Monitors, please": "Không có kênh theo dõi nào",
+    "add one": "Thêm mới",
+    "Notification Type": "Kiểu thông báo",
+    "Email": "Email",
+    "Test": "Thử",
+    "Certificate Info": "Thông tin Certificate",
+    "Resolver Server": "Máy chủ Resolver",
+    "Resource Record Type": "Loại bản ghi",
+    "Last Result": "Kết quả cuối cùng",
+    "Create your admin account": "Tạo tài khoản quản trị",
+    "Repeat Password": "Lặp lại mật khẩu",
+    "Import Backup": "Khôi phục bản sao lưu",
+    "Export Backup": "Xuất bản sao lưu",
+    "Export": "Xuất",
+    "Import": "Nhập",
+    "respTime": "Thời gian phản hồi (ms)",
+    "notAvailableShort": "N/A",
+    "Default enabled": "Mặc định bật",
+    "Apply on all existing monitors": "Áp dụng cho tất cả kênh theo dõi đang có",
+    "Create": "Tạo",
+    "Clear Data": "Xoá dữ liệu",
+    "Events": "Sự kiện",
+    "Heartbeats": "Heartbeats",
+    "Auto Get": "Tự động lấy",
+    "backupDescription": "Sao lưu tất cả các kênh theo dõi và tất cả các thông báo vào một file định dạng JSON.",
+    "backupDescription2": "Lưu ý: Không bao gồm dữ liệu lịch sử các sự kiện.",
+    "backupDescription3": "Hãy lưu giữ file này cẩn thận, trong file đó chứa cả các token thông báo.",
+    "alertNoFile": "Hãy chọn file để khôi phục.",
+    "alertWrongFileType": "Hãy chọn file định dạng JSON.",
+    "Clear all statistics": "Xoá tất cả thống kê",
+    "Skip existing": "Giữ lại",
+    "Overwrite": "Ghi đè",
+    "Options": "Tuỳ chọn",
+    "Keep both": "Giữ lại cả hai",
+    "Verify Token": "Xác minh Token",
+    "Setup 2FA": "Cài đặt xác thực 2 lớp (2FA)",
+    "Enable 2FA": "Bật xác thực 2 lớp (2FA)",
+    "Disable 2FA": "Tắt xác thực 2 lớp (2FA)",
+    "2FA Settings": "Cài đặt xác thực 2 lớp (2FA)",
+    "Two Factor Authentication": "Xác thực hai yếu tố",
+    "Active": "Hoạt động",
+    "Inactive": "Ngừng hoạt động",
+    "Token": "Token",
+    "Show URI": "Hiển thị URI",
+    "Tags": "Tags",
+    "Add New below or Select...": "Thêm mới ở dưới hoặc Chọn...",
+    "Tag with this name already exist.": "Tag với tên đã tồn tại.",
+    "Tag with this value already exist.": "Tag với value đã tồn tại.",
+    "color": "Màu sắc",
+    "value (optional)": "Value (tuỳ chọn)",
+    "Gray": "Xám",
+    "Red": "Đỏ",
+    "Orange": "Cam",
+    "Green": "Xanh lá",
+    "Blue": "Xanh da trời",
+    "Indigo": "Chàm",
+    "Purple": "Tím",
+    "Pink": "Hồng",
+    "Search...": "Tìm kiếm...",
+    "Avg. Ping": "Ping trung bình",
+    "Avg. Response": "Phản hồi trung bình",
+    "Entry Page": "Entry Page",
+    "statusPageNothing": "Chưa có thông tin gì, hãy thêm nhóm kênh theo dõi hoặc kênh theo dõi.",
+    "No Services": "Không có dịch vụ",
+    "All Systems Operational": "Tất cả các hệ thống hoạt động bình thường",
+    "Partially Degraded Service": "Có hệ thống bị ngưng",
+    "Degraded Service": "Toàn bộ hệ thống bị ngưng",
+    "Add Group": "Thêm nhóm",
+    "Add a monitor": "Thêm kênh theo dõi",
+    "Edit Status Page": "Sửa trang trạng thái",
+    "Go to Dashboard": "Đi tới Dashboard",
+    "Status Page": "Trang trạng thái",
+    "Status Pages": "Trang trạng thái",
+    "defaultNotificationName": "My {notification} Alerts ({number})",
+    "here": "tại đây",
+    "Required": "Bắt buộc",
+    "telegram": "Telegram",
+    "Bot Token": "Bot Token",
+    "wayToGetTelegramToken": "Bạn có thể lấy mã token từ",
+    "Chat ID": "Chat ID",
+    "supportTelegramChatID": "Hỗ trợ chat trực tiếp / Nhóm / Kênh Chat ID",
+    "wayToGetTelegramChatID": "Bạn có thể lấy chat id của mình bằng cách gửi tin nhắn tới bot và truy cập url này để xem chat_id:",
+    "YOUR BOT TOKEN HERE": "MÃ BOT TOKEN CỦA BẠN",
+    "chatIDNotFound": "Không tìm thấy Chat ID, vui lòng gửi tin nhắn cho bot này trước",
+    "webhook": "Webhook",
+    "Post URL": "URL webhook",
+    "Content Type": "Loại nội dung",
+    "webhookJsonDesc": "{0} tương thích với máy chủ HTTP ví dụ như Express.js",
+    "webhookFormDataDesc": "{multipart} tương thích với máy chủ PHP, bạn chỉ cần phân tích cú pháp json bằng {decodeFunction}",
+    "smtp": "Email (SMTP)",
+    "secureOptionNone": "None/STARTTLS(25, 587)",
+    "secureOptionTLS": "TLS (465)",
+    "Ignore TLS Error": "Bỏ qua lỗi TLS",
+    "From Email": "Email gửi",
+    "emailCustomSubject": "Tuỳ chỉnh tiêu đề",
+    "To Email": "Email nhận",
+    "smtpCC": "CC",
+    "smtpBCC": "BCC",
+    "discord": "Discord",
+    "Discord Webhook URL": "Discord Webhook URL",
+    "wayToGetDiscordURL": "Để lấy Discord, hãy vào: Server Settings -> Integrations -> Create Webhook",
+    "Bot Display Name": "Tên hiển thị của BOT",
+    "Prefix Custom Message": "Tiền tố tin nhắn tuỳ chọn",
+    "Hello @everyone is...": "Xin chào {'@'} mọi người đang...",
+    "teams": "Microsoft Teams",
+    "Webhook URL": "Webhook URL",
+    "wayToGetTeamsURL": "Bạn có thể học cách tạo webhook url {0}.",
+    "signal": "Tín hiệu",
+    "Number": "Số",
+    "Recipients": "Người nhận",
+    "needSignalAPI": "Bạn cần một tín hiệu kết nối với REST API.",
+    "wayToCheckSignalURL": "Bạn có thể kiểm tra URL này để xem cách thiết lập:",
+    "signalImportant": "QUAN TRỌNG: Bạn không thể kết hợp các nhóm và số trong người nhận!",
+    "gotify": "Gotify",
+    "Application Token": "Mã Token ứng dụng",
+    "Server URL": "URL máy chủ",
+    "Priority": "Mức ưu tiên",
+    "slack": "Slack",
+    "Icon Emoji": "Icon Emoji",
+    "Channel Name": "Tên Channel",
+    "Uptime Kuma URL": "Uptime Kuma URL",
+    "aboutWebhooks": "Thông tin thêm về webhook trên: {0}",
+    "aboutChannelName": "Nhập tên kênh trên {0} trường Channel Name nếu bạn muốn bỏ qua kênh webhook. vd: #other-channel",
+    "aboutKumaURL": "Nếu bạn để trống trường Uptime Kuma URL, mặc định sẽ là trang Project Github.",
+    "emojiCheatSheet": "Bảng tra cứu Emoji: {0}",
+    "rocket.chat": "Rocket.chat",
+    "pushover": "Pushover",
+    "pushy": "Pushy",
+    "PushByTechulus": "Push by Techulus",
+    "octopush": "Octopush",
+    "promosms": "PromoSMS",
+    "clicksendsms": "ClickSend SMS",
+    "lunasea": "LunaSea",
+    "apprise": "Apprise (Hỗ trợ trên 50 dịch vụ thông báo)",
+    "GoogleChat": "Google Chat (Google Workspace only)",
+    "pushbullet": "Pushbullet",
+    "line": "Line Messenger",
+    "mattermost": "Mattermost",
+    "User Key": "User Key",
+    "Device": "Thiết bị",
+    "Message Title": "Tiêu đề tin nhắn",
+    "Notification Sound": "Âm thanh thông báo",
+    "More info on:": "Thông tin chi tiết tại: {0}",
+    "pushoverDesc1": "Mức ưu tiên khẩn cấp (2) có thời gian chờ mặc định là 30 giây giữa các lần thử lại và sẽ hết hạn sau 1 giờ.",
+    "pushoverDesc2": "Nếu bạn muốn gửi thông báo đến các thiết bị khác nhau, hãy điền vào trường Thiết bị.",
+    "SMS Type": "SMS Type",
+    "octopushTypePremium": "Premium (Nhanh - Khuyến nghị nên dùng cho cảnh báo)",
+    "octopushTypeLowCost": "Giá rẻ (Chậm, thỉnh thoảng bị chặn)",
+    "checkPrice": "Kiểm tra giá {0}:",
+    "apiCredentials": "API credentials",
+    "octopushLegacyHint": "Bạn muốn sử dụng phiên bản cũ của Octopush (2011-2020) hay phiên bản mới?",
+    "Check octopush prices": "Kiểm tra giá octopush {0}.",
+    "octopushPhoneNumber": "Số điện thoại (Định dạng intl, vd : +84692341165) ",
+    "octopushSMSSender": "SMS người gửi : 3-11 ký tự chữ, số và dấu cách (a-zA-Z0-9)",
+    "LunaSea Device ID": "LunaSea ID thiết bị",
+    "Apprise URL": "Apprise URL",
+    "Example:": "Ví dụ: {0}",
+    "Read more:": "Đọc thêm: {0}",
+    "Status:": "Trạng thái: {0}",
+    "Read more": "Đọc thêm",
+    "appriseInstalled": "Đã cài đặt Apprise.",
+    "appriseNotInstalled": "Chưa cài đặt Apprise. {0}",
+    "Access Token": "Token truy cập",
+    "Channel access token": "Token kênh truy cập",
+    "Line Developers Console": "Line Developers Console",
+    "lineDevConsoleTo": "Line Developers Console - {0}",
+    "Basic Settings": "Cài đặt cơ bản",
+    "User ID": "User ID",
+    "Messaging API": "Messaging API",
+    "wayToGetLineChannelToken": "Trước tiên, hãy truy cập {0},tạo nhà cung cấp và kênh (Messaging API), sau đó bạn có thể nhận mã token truy cập kênh và id người dùng từ các mục menu được đề cập ở trên.",
+    "Icon URL": "Icon URL",
+    "aboutIconURL": "Bạn có thể cung cấp liên kết đến ảnh trong \"Icon URL\" để ghi đè ảnh hồ sơ mặc định. Sẽ không được sử dụng nếu Biểu tượng cảm xúc được thiết lập.",
+    "aboutMattermostChannelName": "Bạn có thể ghi đè kênh mặc định mà webhook đăng lên bằng cách nhập tên kênh vào trường \"Channel Name\". Điều này cần được bật trong cài đặt Mattermost webhook. Ví dụ: #other-channel",
+    "matrix": "Matrix",
+    "promosmsTypeEco": "SMS ECO - rẻ nhưng chậm và thường xuyên quá tải. Chỉ dành cho người Ba Lan.",
+    "promosmsTypeFlash": "SMS FLASH - Tin nhắn sẽ tự động hiển thị trên thiết bị của người nhận. Chỉ dành cho người Ba Lan.",
+    "promosmsTypeFull": "SMS FULL - SMS cao cấp, Bạn có thể sử dụng Tên Người gửi (Bạn cần đăng ký tên trước). Đáng tin cậy cho các cảnh báo.",
+    "promosmsTypeSpeed": "SMS SPEED - Ưu tiên cao nhất trong hệ thống. Rất nhanh chóng và đáng tin cậy nhưng tốn kém, (giá gấp đôi SMS FULL).",
+    "promosmsPhoneNumber": "Số điện thoại (Bỏ qua mã vùng với người Ba Lan)",
+    "promosmsSMSSender": "SMS Tên người gửi: Tên đã đăng ký trước hoặc tên mặc định: InfoSMS, SMS Info, MaxSMS, INFO, SMS",
+    "Feishu WebHookUrl": "Feishu WebHookUrl",
+    "matrixHomeserverURL": "Homeserver URL (với http(s):// và port tuỳ chỉnh)",
+    "Internal Room Id": "Room ID Nội bộ",
+    "matrixDesc1": "Bạn có thể tìm thấy room ID nội bộ bằng cách tìm trong mục advanced của phần room settings trong Matrix client của bạn. Nó có dạng giống như !QMdRCpUIfLwsfjxye6:home.server.",
+    "matrixDesc2": "Bạn nên tạo người dùng mới và đừng sử dụng mã token truy cập của Matrix user vì nó sẽ cho phép truy cập toàn quyền vào tài khoản của bạn và tất cả các phòng bạn đã tham gia. Thay vào đó, hãy tạo một người dùng mới và chỉ mời người đó vào phòng mà bạn muốn nhận thông báo. Bạn có thể lấy được mã token truy cập bằng cách chạy {0}",
+    "Method": "Method",
+    "Body": "Body",
+    "Headers": "Headers",
+    "PushUrl": "Push URL",
+    "HeadersInvalidFormat": "Header request không hợp lệ JSON: ",
+    "BodyInvalidFormat": "Tequest body không hợp lệ JSON: ",
+    "Monitor History": "Lịch sử kênh theo dõi",
+    "clearDataOlderThan": "Giữ dữ liệu lịch sử kênh theo dõi {0} ngày.",
+    "PasswordsDoNotMatch": "Passwords không khớp.",
+    "records": "records",
+    "One record": "One record",
+    "steamApiKeyDescription": "Để theo dõi các Steam Game Server bạn cần một Steam Web-API key. Bạn có thể đăng ký API key tại đây: ",
+    "Current User": "User hiện tại",
+    "topic": "Topic",
+    "topicExplanation": "MQTT topic to monitor",
+    "successMessage": "Success Message",
+    "successMessageExplanation": "MQTT message that will be considered as success",
+    "recent": "Gần đây",
+    "Done": "Hoàn thành",
+    "Info": "Thông tin",
+    "Security": "Bảo mật",
+    "Steam API Key": "Steam API Key",
+    "Shrink Database": "Shrink Database",
+    "Pick a RR-Type...": "Pick a RR-Type...",
+    "Pick Accepted Status Codes...": "Chọn các Codes trạng thái chấp nhận được...",
+    "Default": "Mặc định",
+    "HTTP Options": "Tuỳ chọn HTTP",
+    "Create Incident": "Tạo Incident",
+    "Title": "Tiêu đề",
+    "Content": "Nội dung",
+    "Style": "Style",
+    "info": "thông tin",
+    "warning": "cảnh báo",
+    "danger": "nguy hiểm",
+    "primary": "cơ sở",
+    "light": "sáng",
+    "dark": "tối",
+    "Post": "Post",
+    "Please input title and content": "Hãy nhập tiêu đề và nội dung",
+    "Created": "Đã tạo",
+    "Last Updated": "Cập nhật mới nhất",
+    "Unpin": "Bỏ ghim",
+    "Switch to Light Theme": "Chuyển sang giao diện Sáng",
+    "Switch to Dark Theme": "Chuyển sang giao diện Tối",
+    "Show Tags": "Hiện Tags",
+    "Hide Tags": "Ẩn Tags",
+    "Description": "Mô tả",
+    "No monitors available.": "Không có kênh theo dõi nào.",
+    "Add one": "Thêm mới",
+    "No Monitors": "Không có kênh theo dõi",
+    "Untitled Group": "Nhóm không có tiêu đề",
+    "Services": "Dịch vụ",
+    "Discard": "Bỏ",
+    "Cancel": "Hủy",
+    "Powered by": "Được cung cấp bởi",
+    "shrinkDatabaseDescription": "Khởi chạy database VACCUM cho SQLite. Nếu database được tạo sau version 1.10.0, AUTO_VACCUM đã được bật sẵn, hành động này không cần thiết.",
+    "serwersms": "SerwerSMS.pl",
+    "serwersmsAPIUser": "API Username (incl. webapi_ prefix)",
+    "serwersmsAPIPassword": "API Password",
+    "serwersmsPhoneNumber": "Số điện thoại",
+    "serwersmsSenderName": "Tên người gửi SMS (Đã đăng ký qua portal)",
+    "stackfield": "Stackfield",
+    "Customize": "Customize",
+    "Custom Footer": "Custom Footer",
+    "Custom CSS": "Custom CSS",
+    "smtpDkimSettings": "Cài đặt xác thực Email(DKIM)",
+    "smtpDkimDesc": "Xem hướng dẫn tại {0}.",
+    "documentation": "Nodemailer DKIM",
+    "smtpDkimDomain": "Mail domain",
+    "smtpDkimKeySelector": "DKIM Key Selector",
+    "smtpDkimPrivateKey": "Private Key",
+    "smtpDkimHashAlgo": "Hash Algorithm (Tuỳ chọn)",
+    "smtpDkimheaderFieldNames": "Header Keys to sign (Tuỳ chọn)",
+    "smtpDkimskipFields": "Header Keys not to sign (Tuỳ chọn)",
+    "gorush": "Gorush",
+    "alerta": "Alerta",
+    "alertaApiEndpoint": "API Endpoint",
+    "alertaEnvironment": "Environment",
+    "alertaApiKey": "API Key",
+    "alertaAlertState": "Alert State",
+    "alertaRecoverState": "Recover State",
+    "deleteStatusPageMsg": "Bạn có chắc chắn muốn xoá trang status này?",
+    "Proxies": "Proxies",
+    "default": "Mặc định",
+    "enabled": "Enabled",
+    "setAsDefault": "Set As Default",
+    "deleteProxyMsg": "Bạn muốn xoá proxy này cho tất cả monitors?",
+    "proxyDescription": "Proxies must be assigned to a monitor to function.",
+    "enableProxyDescription": "Proxy này chưa ảnh hưởng tới monitor requests cho tới khi được activated. Bạn có thể tạm thời tắt proxy cho tất cả monitors bằng trạng thái activation.",
+    "setAsDefaultProxyDescription": "Proxy này sẽ bật mặc định cho tất cả monitors mới. Bạn có thể tắt riêng lẻ proxy trên mỗi monitor.",
+    "Certificate Chain": "Certificate Chain",
+    "Valid": "Hợp lệ",
+    "Invalid": "Không hợp lệ",
+    "AccessKeyId": "AccessKey ID",
+    "SecretAccessKey": "AccessKey Secret",
+    "PhoneNumbers": "PhoneNumbers",
+    "TemplateCode": "TemplateCode",
+    "SignName": "SignName",
+    "Sms template must contain parameters: ": "Sms template must contain parameters: ",
+    "Bark Endpoint": "Bark Endpoint",
+    "WebHookUrl": "WebHookUrl",
+    "SecretKey": "SecretKey",
+    "For safety, must use secret key": "Để an toàn, hãy dùng secret key",
+    "Device Token": "Device Token",
+    "Platform": "Platform",
+    "iOS": "iOS",
+    "Android": "Android",
+    "Huawei": "Huawei",
+    "High": "High",
+    "Retry": "Retry",
+    "Topic": "Topic",
+    "WeCom Bot Key": "WeCom Bot Key",
+    "Setup Proxy": "Setup Proxy",
+    "Proxy Protocol": "Proxy Protocol",
+    "Proxy Server": "Proxy Server",
+    "Proxy server has authentication": "Proxy server has authentication",
+    "User": "User",
+    "Installed": "Installed",
+    "Not installed": "Not installed",
+    "Running": "Running",
+    "Not running": "Not running",
+    "Remove Token": "Remove Token",
+    "Start": "Start",
+    "Stop": "Stop",
+    "Uptime Kuma": "Uptime Kuma",
+    "Add New Status Page": "Thêm mới Status Page",
+    "Slug": "Slug",
+    "Accept characters:": "Accept characters:",
+    "startOrEndWithOnly": "Start or end with {0} only",
+    "No consecutive dashes": "No consecutive dashes",
+    "Next": "Next",
+    "The slug is already taken. Please choose another slug.": "The slug is already taken. Please choose another slug.",
+    "No Proxy": "No Proxy",
+    "HTTP Basic Auth": "HTTP Basic Auth",
+    "New Status Page": "New Status Page",
+    "Page Not Found": "Page Not Found",
+    "Reverse Proxy": "Reverse Proxy",
+    "Backup": "Backup",
+    "About": "About",
+    "wayToGetCloudflaredURL": "(Download cloudflared from {0})",
+    "cloudflareWebsite": "Cloudflare Website",
+    "Message:": "Message:",
+    "Don't know how to get the token? Please read the guide:": "Chưa biết cách lấy token? Xem hướng dẫn tại:",
+    "The current connection may be lost if you are currently connecting via Cloudflare Tunnel. Are you sure want to stop it? Type your current password to confirm it.": "Nếu bạn đang dùng Cloudflare Tunnel, kết nối hiện tại có thể đang bị mất. Bạn có muốn dừng lại? Nhập lại password để xác nhận.",
+    "Other Software": "Phần mềm khác",
+    "For example: nginx, Apache and Traefik.": "Ví dụ: Nginx, Apache hay Traefik.",
+    "Please read": "Hãy xem qua",
+    "Subject:": "Subject:",
+    "Valid To:": "Valid To:",
+    "Days Remaining:": "Số ngày còn lại:",
+    "Issuer:": "Issuer:",
+    "Fingerprint:": "Fingerprint:",
+    "No status pages": "No status pages",
+    "Domain Name Expiry Notification": "Cảnh báo hạn hạn Domain Name",
+    "Proxy": "Proxy",
+    "Date Created": "Ngày khởi tạo",
+    "onebotHttpAddress": "OneBot HTTP Address",
+    "onebotMessageType": "OneBot Message Type",
+    "onebotGroupMessage": "Group",
+    "onebotPrivateMessage": "Private",
+    "onebotUserOrGroupId": "Group/User ID",
+    "onebotSafetyTips": "Để đảm bảo an toàn, hãy thiết lập access token"
+}
diff --git a/src/lang/yue.json b/src/lang/yue.json
new file mode 100644
index 000000000..98936dbc1
--- /dev/null
+++ b/src/lang/yue.json
@@ -0,0 +1,101 @@
+{
+    "languageName": "繁體中文 (廣東話 / 粵語)",
+    "Settings": "設定",
+    "General": "一般",
+    "Dashboard": "表板",
+    "Help": "幫助",
+    "New Update": "有新版本",
+    "Language": "語言",
+    "Appearance": "外觀",
+    "Theme": "主題",
+    "Game": "遊戲",
+    "Version": "版本",
+    "Check Update On GitHub": "去 GitHub 睇下有冇更新",
+    "List": "列表",
+    "Add": "新增",
+    "Primary Base URL": "主要 Base URL",
+    "Heartbeat Retry Interval": "確定為離線的重試間隔",
+    "retryCheckEverySecond": "每 {0} 秒重試一次",
+    "add one": "加一個",
+    "upsideDownModeDescription": "反轉狀態,如果網址係可以正常瀏覽,會被判定為 '離線/DOWN'",
+    "Not available, please setup.": "未可以用,需要設定。",
+    "Discourage search engines from indexing site": "唔建議搜尋器索引",
+    "Remember me": "記住我",
+    "Test": "測試",
+    "DateTime": "日期時間",
+    "Resume": "恢復",
+    "statusMaintenance": "維護緊",
+    "Maintenance": "維護",
+    "Unknown": "唔知",
+    "pauseDashboardHome": "暫停",
+    "Pause": "暫停",
+    "Status": "狀態",
+    "Message": "內容",
+    "No important events": "冇重要事件",
+    "Edit": "編輯",
+    "Delete": "刪除",
+    "Current": "目前",
+    "Uptime": "上線率",
+    "day": "日 | 日",
+    "-day": "日",
+    "hour": "個鐘",
+    "-hour": "個鐘",
+    "Response": "反應時間",
+    "Ping": "反應時間",
+    "URL": "網址",
+    "Retries": "重試數次確定為離線",
+    "Advanced": "進階",
+    "ignoreTLSError": "唔理 TLS/SSL 錯誤",
+    "Upside Down Mode": "反轉模式",
+    "Accepted Status Codes": "接受為上線嘅 HTTP 狀態碼",
+    "Save": "儲存",
+    "Notifications": "通知",
+    "Setup Notification": "設定通知",
+    "Light": "明亮",
+    "Dark": "暗黑",
+    "Auto": "自動",
+    "Normal": "一般",
+    "Bottom": "下方",
+    "None": "冇",
+    "Timezone": "時區",
+    "Search Engine Visibility": "係咪允許搜尋器索引",
+    "Allow indexing": "允許索引",
+    "Change Password": "改密碼",
+    "Current Password": "而家嘅密碼",
+    "New Password": "新密碼",
+    "Repeat New Password": "確認新密碼",
+    "Update Password": "更新密碼",
+    "Disable Auth": "取消登入認証",
+    "Enable Auth": "開啟登入認証",
+    "disableauth.message1": "你係咪確認想<strong>取消登入認証</strong>?",
+    "Please use this option carefully!": "請小心使用。",
+    "Logout": "登出",
+    "Leave": "離開",
+    "I understand, please disable": "我知,唔該取消登入認証",
+    "Confirm": "確認",
+    "Yes": "係",
+    "No": "唔係",
+    "Username": "帳號",
+    "Password": "密碼",
+    "Login": "登入",
+    "Notification Type": "通知類型",
+    "Email": "電郵",
+    "Repeat Password": "重複密碼",
+    "Up": "上線",
+    "Down": "離線",
+    "Pending": "待定",
+    "Name": "名稱",
+    "General Monitor Type": "一般監測器類型",
+    "Passive Monitor Type": "被動監測器類型",
+    "Specific Monitor Type": "特定監測器類型",
+    "Monitor": "監測器 | 監測器",
+    "Keyword": "關鍵字",
+    "Friendly Name": "名稱",
+    "Hostname": "Hostname",
+    "Port": "Port",
+    "No Monitors, please": "冇監測器,請",
+    "Monitor Type": "監測器類型",
+    "Heartbeat Interval": "檢查間距",
+    "Add New Monitor": "新增監測器",
+    "Quick Stats": "綜合數據"
+}
diff --git a/src/lang/zh-CN.json b/src/lang/zh-CN.json
new file mode 100644
index 000000000..a05395939
--- /dev/null
+++ b/src/lang/zh-CN.json
@@ -0,0 +1,702 @@
+{
+    "languageName": "简体中文",
+    "checkEverySecond": "检测频率 {0} 秒",
+    "retryCheckEverySecond": "重试间隔 {0} 秒",
+    "resendEveryXTimes": "每 {0} 次失败则重复发送一次",
+    "resendDisabled": "禁用重复发送",
+    "retriesDescription": "服务被标记为故障并发送通知之前的最大重试次数",
+    "ignoreTLSError": "忽略 HTTPS 站点的 TLS/SSL 错误",
+    "upsideDownModeDescription": "反转状态监控,如果服务可访问,则认为是故障。",
+    "maxRedirectDescription": "允许的最大重定向次数。设置为 0 禁用重定向。",
+    "enableGRPCTls": "允许通过 TLS 连接发送 gRPC 请求",
+    "grpcMethodDescription": "方法名会转换为小驼峰格式,例如 sayHello、check 等等。",
+    "acceptedStatusCodesDescription": "选择被视为成功响应的状态码。",
+    "Maintenance": "维护",
+    "statusMaintenance": "维护",
+    "Schedule maintenance": "计划维护",
+    "Affected Monitors": "受影响的监控项",
+    "Pick Affected Monitors...": "选择受影响的监控项…",
+    "Start of maintenance": "维护开始",
+    "All Status Pages": "所有状态页面",
+    "Select status pages...": "选择状态页面…",
+    "recurringIntervalMessage": "每天一次 | 每 {0} 天一次",
+    "affectedMonitorsDescription": "选择受当前维护影响的监控项",
+    "affectedStatusPages": "在所选状态页面上显示此维护消息",
+    "atLeastOneMonitor": "至少选择一个受影响的监控项",
+    "passwordNotMatchMsg": "两次输入的密码不一致。",
+    "notificationDescription": "通知必须被分配给监控项才能正常工作。",
+    "keywordDescription": "在纯 HTML 或 JSON 响应中搜索关键字,区分大小写。",
+    "pauseDashboardHome": "暂停",
+    "deleteMonitorMsg": "确定要删除此监控项吗?",
+    "deleteMaintenanceMsg": "确定要删除此维护吗?",
+    "deleteNotificationMsg": "确定要为所有监控项删除此通知吗?",
+    "dnsPortDescription": "DNS 服务器端口,默认为 53,您可以在任何时候更改此端口。",
+    "resolverserverDescription": "默认服务器是 Cloudflare。您随时可以修改解析服务器。",
+    "rrtypeDescription": "选择要监控的资源记录类型",
+    "pauseMonitorMsg": "确定要暂停吗?",
+    "enableDefaultNotificationDescription": "新的监控项将默认启用此通知,您仍然为每个监控项单独禁用。",
+    "clearEventsMsg": "确定要删除此监控项的所有事件吗?",
+    "clearHeartbeatsMsg": "确定要删除此监控项的所有心跳状态吗?",
+    "confirmClearStatisticsMsg": "确定要删除所有统计信息吗?",
+    "importHandleDescription": "如果想跳过同名的监控项或消息通知,请选择“跳过已存在”。“覆盖”将删除所有现有的监控项和通知。",
+    "confirmImportMsg": "确定要导入备份吗?请确保已经选择了正确的导入选项。",
+    "twoFAVerifyLabel": "请输入令牌码以确认二次验证:",
+    "tokenValidSettingsMsg": "令牌码有效!您现在可以保存二次验证设置了。",
+    "confirmEnableTwoFAMsg": "确定要启用二次验证吗?",
+    "confirmDisableTwoFAMsg": "确定要禁用二次验证吗?",
+    "Settings": "设置",
+    "Dashboard": "仪表盘",
+    "New Update": "有新版本",
+    "Language": "语言",
+    "Appearance": "外观",
+    "Theme": "主题",
+    "General": "常规",
+    "Primary Base URL": "站点主 URL",
+    "Version": "版本",
+    "Check Update On GitHub": "检查 GitHub 上的更新",
+    "List": "列表",
+    "Add": "添加",
+    "Add New Monitor": "添加监控项",
+    "Quick Stats": "状态速览",
+    "Up": "正常",
+    "Down": "故障",
+    "Pending": "检测中",
+    "Unknown": "未知",
+    "Pause": "暂停",
+    "Name": "名称",
+    "Status": "状态",
+    "DateTime": "日期时间",
+    "Message": "消息",
+    "No important events": "暂无重要事件",
+    "Resume": "恢复",
+    "Edit": "编辑",
+    "Delete": "删除",
+    "Current": "当前",
+    "Uptime": "在线时间",
+    "Cert Exp.": "证书有效期",
+    "day": "天",
+    "-day": "天",
+    "hour": "小时",
+    "-hour": "小时",
+    "Response": "响应",
+    "Ping": "Ping",
+    "Monitor Type": "监控类型",
+    "Keyword": "关键字",
+    "Friendly Name": "显示名称",
+    "URL": "URL",
+    "Hostname": "主机名",
+    "Port": "端口",
+    "Heartbeat Interval": "心跳间隔",
+    "Retries": "重试次数",
+    "Heartbeat Retry Interval": "心跳重试间隔",
+    "Resend Notification if Down X times consecutively": "连续失败时重复发送通知的间隔次数",
+    "Advanced": "高级",
+    "Upside Down Mode": "反转模式",
+    "Max. Redirects": "最大重定向次数",
+    "Accepted Status Codes": "有效状态码",
+    "Push URL": "推送 URL",
+    "needPushEvery": "您需要每 {0} 秒调用一次该 URL。",
+    "pushOptionalParams": "可选参数:{0}",
+    "Save": "保存",
+    "Notifications": "通知",
+    "Not available, please setup.": "暂不可用,请先设置。",
+    "Setup Notification": "设置通知",
+    "Light": "明亮",
+    "Dark": "黑暗",
+    "Auto": "自动",
+    "Theme - Heartbeat Bar": "主题 - 心跳栏",
+    "Normal": "正常",
+    "Bottom": "靠下",
+    "None": "不显示",
+    "Timezone": "时区",
+    "Search Engine Visibility": "搜索引擎可见性",
+    "Allow indexing": "允许索引",
+    "Discourage search engines from indexing site": "阻止搜索引擎索引网站",
+    "Change Password": "修改密码",
+    "Current Password": "当前密码",
+    "New Password": "新密码",
+    "Repeat New Password": "重复新密码",
+    "Update Password": "更新密码",
+    "Disable Auth": "禁用身份验证",
+    "Enable Auth": "启用身份验证",
+    "disableauth.message1": "是否确定 <strong>取消登录验证</strong>?",
+    "disableauth.message2": "这是为 <strong>有第三方认证</strong> 的用户提供的功能,如 Cloudflare Access。",
+    "Please use this option carefully!": "请谨慎使用!",
+    "Logout": "退出",
+    "Leave": "离开",
+    "I understand, please disable": "我已了解,继续禁用",
+    "Confirm": "确认",
+    "Yes": "是",
+    "No": "否",
+    "Username": "用户名",
+    "Password": "密码",
+    "Remember me": "记住我",
+    "Login": "登录",
+    "No Monitors, please": "还没有监控项,",
+    "add one": "点击添加",
+    "Notification Type": "通知类型",
+    "Email": "邮件",
+    "Test": "测试",
+    "Certificate Info": "证书信息",
+    "Resolver Server": "解析服务器",
+    "Resource Record Type": "资源记录类型",
+    "Last Result": "上次结果",
+    "Create your admin account": "创建管理员账户",
+    "Repeat Password": "重复密码",
+    "Import Backup": "导入备份",
+    "Export Backup": "导出备份",
+    "Export": "导出",
+    "Import": "导入",
+    "respTime": "响应时间(毫秒)",
+    "notAvailableShort": "N/A",
+    "Default enabled": "默认开启",
+    "Apply on all existing monitors": "应用到所有现有监控项",
+    "Create": "创建",
+    "Clear Data": "清除数据",
+    "Events": "事件",
+    "Heartbeats": "心跳",
+    "Auto Get": "自动获取",
+    "backupDescription": "您可以将所有监控项和通知备份到 JSON 文件。",
+    "backupDescription2": "注意: 不包括历史状态和事件数据。",
+    "backupDescription3": "导出的文件可能包含敏感信息,例如通知的令牌,请小心存放。",
+    "alertNoFile": "请选择要导入的文件。",
+    "alertWrongFileType": "请选择一个 JSON 文件。",
+    "Clear all statistics": "清除所有统计数据",
+    "Skip existing": "跳过已存在",
+    "Overwrite": "覆盖",
+    "Options": "选项",
+    "Keep both": "全部保留",
+    "Verify Token": "验证令牌",
+    "Setup 2FA": "设置二次验证",
+    "Enable 2FA": "启用二次验证",
+    "Disable 2FA": "禁用二次验证",
+    "2FA Settings": "二次验证设置",
+    "Two Factor Authentication": "二次验证",
+    "Active": "激活",
+    "Inactive": "停用",
+    "Token": "令牌",
+    "Show URI": "显示 URI",
+    "Tags": "标签",
+    "Add New below or Select...": "在下面添加或选择…",
+    "Tag with this name already exist.": "相同名称的标签已存在。",
+    "Tag with this value already exist.": "相同内容的标签已存在。",
+    "color": "颜色",
+    "value (optional)": "值(可选)",
+    "Gray": "灰色",
+    "Red": "红色",
+    "Orange": "橙色",
+    "Green": "绿色",
+    "Blue": "蓝色",
+    "Indigo": "靛蓝",
+    "Purple": "紫色",
+    "Pink": "粉色",
+    "Search...": "搜索…",
+    "Avg. Ping": "平均 Ping",
+    "Avg. Response": "平均响应",
+    "Entry Page": "入口页面",
+    "statusPageNothing": "这里什么也没有,请添加一个分组或一个监控项。",
+    "No Services": "无服务",
+    "All Systems Operational": "所有服务运行正常",
+    "Partially Degraded Service": "部分服务出现故障",
+    "Degraded Service": "全部服务出现故障",
+    "Add Group": "添加分组",
+    "Add a monitor": "添加监控项",
+    "Edit Status Page": "编辑状态页面",
+    "Go to Dashboard": "前往仪表盘",
+    "Status Page": "状态页面",
+    "Status Pages": "状态页面",
+    "defaultNotificationName": "{notification} 通知({number})",
+    "here": "这里",
+    "Required": "必填",
+    "telegram": "Telegram",
+    "ZohoCliq": "ZohoCliq",
+    "Bot Token": "机器人令牌",
+    "wayToGetTelegramToken": "您可以从 {0} 获取 Token。",
+    "Chat ID": "Chat ID",
+    "supportTelegramChatID": "支持对话/群组/频道的 Chat ID",
+    "wayToGetTelegramChatID": "您可以发送一条消息给您的机器人,然后访问此链接来查看 chat_id:",
+    "YOUR BOT TOKEN HERE": "这里替换成您的 BOT TOKEN",
+    "chatIDNotFound": "未找到 Chat ID,请先给您的机器人发送一条消息",
+    "webhook": "Webhook",
+    "Post URL": "Post URL",
+    "Content Type": "Content Type",
+    "webhookJsonDesc": "{0} 适合现代的 HTTP 服务器,例如 Express.js",
+    "webhookFormDataDesc": "{multipart} 适合 PHP,其中 JSON 需要使用 {decodeFunction} 解码",
+    "webhookAdditionalHeadersTitle": "额外 Header",
+    "webhookAdditionalHeadersDesc": "设置通过此 Webhook 发送的额外 Header。",
+    "smtp": "电子邮件(SMTP)",
+    "secureOptionNone": "无 / STARTTLS(常用端口 25、587)",
+    "secureOptionTLS": "TLS(常用端口 465)",
+    "Ignore TLS Error": "忽略 TLS 错误",
+    "From Email": "发信人",
+    "emailCustomSubject": "邮件主题",
+    "To Email": "收信人",
+    "smtpCC": "抄送",
+    "smtpBCC": "密送",
+    "discord": "Discord",
+    "Discord Webhook URL": "Discord Webhook 网址",
+    "wayToGetDiscordURL": "要获取,可以前往服务器设置 -> 整合 -> 创建 Webhook",
+    "Bot Display Name": "机器人显示名称",
+    "Prefix Custom Message": "自定义消息前缀",
+    "Hello @everyone is...": "{'@'}everyone,…",
+    "teams": "Microsoft Teams",
+    "Webhook URL": "Webhook 网址",
+    "wayToGetTeamsURL": "您可以在{0}了解如何获取 Webhook URL。",
+    "wayToGetZohoCliqURL": "您可以在{0}了解如何创建 Webhook URL。",
+    "signal": "Signal",
+    "Number": "号码",
+    "Recipients": "收件人",
+    "needSignalAPI": "您需要有一个支持 REST API 的 Signal 客户端。",
+    "wayToCheckSignalURL": "您可以通过下面的 URL 了解如何设置:",
+    "signalImportant": "重要:您不能混合设定收件人的分组和号码!",
+    "gotify": "Gotify",
+    "Application Token": "应用程序令牌",
+    "Server URL": "服务器 URL",
+    "Priority": "优先级",
+    "slack": "Slack",
+    "Icon Emoji": "Emoji 图标",
+    "Channel Name": "频道名称",
+    "Uptime Kuma URL": "Uptime Kuma URL",
+    "aboutWebhooks": "关于 Webhook 的更多信息:{0}",
+    "aboutChannelName": "如果您想绕过 Webhook 频道,请在 {0} 字段输入所需的频道名称。例如:#other-channel",
+    "aboutKumaURL": "如果保留 Uptime Kuma URL 为空,将会默认指向项目的 GitHub 页面。",
+    "emojiCheatSheet": "Emoji 速查:{0}",
+    "rocket.chat": "Rocket.Chat",
+    "pushover": "Pushover",
+    "pushy": "Pushy",
+    "PushByTechulus": "使用 Techulus 推送",
+    "octopush": "Octopush",
+    "promosms": "PromoSMS",
+    "clicksendsms": "ClickSend SMS",
+    "lunasea": "LunaSea",
+    "apprise": "Apprise (支持 50+ 种通知服务)",
+    "GoogleChat": "Google Chat(仅 Google Workspace)",
+    "pushbullet": "Pushbullet",
+    "Kook": "Kook",
+    "wayToGetKookBotToken": "在 {0} 创建应用并获取机器人 Token",
+    "wayToGetKookGuildID": "在 Kook 设置中打开“开发者模式”,然后右键点击频道可获取其 ID",
+    "Guild ID": "频道 ID",
+    "line": "Line Messenger",
+    "mattermost": "Mattermost",
+    "User Key": "用户密钥",
+    "Device": "设备",
+    "Message Title": "消息标题",
+    "Notification Sound": "通知铃声",
+    "More info on:": "更多信息:{0}",
+    "pushoverDesc1": "紧急优先级(2)会在一小时内每隔 30 秒重试一次。",
+    "pushoverDesc2": "如果您想发送通知给不同的设备,请填写“设备”字段。",
+    "SMS Type": "短信类型",
+    "octopushTypePremium": "Premium(快 - 推荐用于警报)",
+    "octopushTypeLowCost": "Low Cost(慢 - 有时会被运营商屏蔽)",
+    "checkPrice": "查看 {0} 的价格:",
+    "apiCredentials": "API Credentials",
+    "octopushLegacyHint": "您是否在使用旧版本的 Octopush(2011-2020)?",
+    "Check octopush prices": "查看 Octopush 的价格 {0}。",
+    "octopushPhoneNumber": "电话号码(国际格式,例如:+33612345678) ",
+    "octopushSMSSender": "短信发送名称:3-11 位大小写字母、数字和空格(a-zA-Z0-9)",
+    "LunaSea Device ID": "LunaSea 设备 ID",
+    "Apprise URL": "Apprise 网址",
+    "Example:": "例如:{0}",
+    "Read more:": "了解更多:{0}",
+    "Status:": "状态:{0}",
+    "Read more": "了解更多",
+    "appriseInstalled": "Apprise 已安装。",
+    "appriseNotInstalled": "Apprise 未安装。{0}",
+    "Access Token": "访问令牌",
+    "Channel access token": "频道 Access Token",
+    "Line Developers Console": "Line 开发者控制台",
+    "lineDevConsoleTo": "Line 开发者控制台 - {0}",
+    "Basic Settings": "基本设置",
+    "User ID": "用户 ID",
+    "Messaging API": "Messaging API",
+    "wayToGetLineChannelToken": "首先访问 {0},创建一个提供者和频道(Messaging API),然后您就可以从上面提到的菜单获取频道的 Access Token 和用户 ID。",
+    "Icon URL": "图标 URL",
+    "aboutIconURL": "您可以在“图标 URL”中提供一个图片链接来覆盖默认的资料图片。如果设置了 Emoji 图标则此字段会被忽略。",
+    "aboutMattermostChannelName": "您可以覆盖 Webhook 发送消息的默认频道,只需在“频道名称”字段中输入您想要的频道名。这需要在 Mattermost 的 Webhook 设置中启用。例如:#other-channel",
+    "matrix": "Matrix",
+    "promosmsTypeEco": "SMS ECO - 便宜但是慢,并且容易超负荷。仅限波兰地区的收信人。",
+    "promosmsTypeFlash": "SMS FLASH - 消息会自动显示在收信人设备上。仅限波兰地区的收信人。",
+    "promosmsTypeFull": "SMS FULL - 高级短信,您可以使用您自己的发信人名称(需要先注册)。对于警报来说更可靠。",
+    "promosmsTypeSpeed": "SMS SPEED - 最高优先级。非常快速可靠,但更贵(大约两倍 SMS FULL 的价格)。",
+    "promosmsPhoneNumber": "电话号码(波兰地区收信人可以不填区号)",
+    "promosmsSMSSender": "短信发信人名称:已注册的名称或以下默认值之一:InfoSMS、SMS Info、MaxSMS、INFO、SMS",
+    "Feishu": "飞书",
+    "Feishu WebHookUrl": "飞书 WebHook URL",
+    "matrixHomeserverURL": "服务器 URL(包含 http(s):// 和可选的端口号)",
+    "Internal Room Id": "内部房间 ID",
+    "matrixDesc1": "您可以在 Matrix 客户端房间设置的高级选项内找到内部房间 ID。格式类似于 !QMdRCpUIfLwsfjxye6:home.server。",
+    "matrixDesc2": "请不要使用您自己的 Access Token,这将开放您所有的账户权限和您已加入房间的权限。我们强烈建议您创建一个新用户并邀请它至您接收通知的房间中。您可以运行以下命令来获取 Access Token:{0}",
+    "Method": "方法",
+    "Body": "请求体",
+    "Headers": "请求头",
+    "PushUrl": "推送 URL",
+    "HeadersInvalidFormat": "请求头不是有效的 JSON: ",
+    "BodyInvalidFormat": "请求体不是有效的 JSON: ",
+    "Monitor History": "监控历史",
+    "clearDataOlderThan": "保留监控历史数据 {0} 天。",
+    "PasswordsDoNotMatch": "密码不匹配。",
+    "records": "记录",
+    "One record": "一条记录",
+    "steamApiKeyDescription": "要监控 Steam 游戏服务器,您需要 Steam Web-API 密钥。您可以在这里注册您的 API 密钥: ",
+    "Current User": "当前用户",
+    "topic": "Topic",
+    "topicExplanation": "要监控的 MQTT Topic",
+    "successMessage": "成功消息",
+    "successMessageExplanation": "视为成功的 MQTT 消息",
+    "recent": "最近",
+    "Done": "完成",
+    "Info": "信息",
+    "Security": "安全性",
+    "Steam API Key": "Steam API 密钥",
+    "Shrink Database": "压缩数据库",
+    "Pick a RR-Type...": "选择资源记录类型…",
+    "Pick Accepted Status Codes...": "选择有效的状态码…",
+    "Default": "默认",
+    "HTTP Options": "HTTP 选项",
+    "Create Incident": "创建事件",
+    "Title": "标题",
+    "Content": "内容",
+    "Style": "类型",
+    "info": "信息",
+    "warning": "警告",
+    "danger": "危险",
+    "error": "错误",
+    "critical": "关键",
+    "primary": "主要",
+    "light": "明亮",
+    "dark": "黑暗",
+    "Post": "发布",
+    "Please input title and content": "请输入标题和内容",
+    "Created": "创建时间",
+    "Last Updated": "更新时间",
+    "Unpin": "取消钉选",
+    "Switch to Light Theme": "切换到浅色主题",
+    "Switch to Dark Theme": "切换到深色主题",
+    "Show Tags": "显示标签",
+    "Hide Tags": "隐藏标签",
+    "Description": "描述",
+    "No monitors available.": "没有可用的监控项。",
+    "Add one": "添加一个",
+    "No Monitors": "没有监控项",
+    "Untitled Group": "无标题分组",
+    "Services": "服务",
+    "Discard": "放弃",
+    "Cancel": "取消",
+    "Powered by": "技术支持:",
+    "shrinkDatabaseDescription": "触发 SQLite 数据库的 VACUUM 命令,如果您的数据库是在 1.10.0 版本之后创建的,则已启用 AUTO_VACUUM,不再需要此操作。",
+    "serwersms": "SerwerSMS.pl",
+    "serwersmsAPIUser": "API 用户名(包括 webapi_ 前缀)",
+    "serwersmsAPIPassword": "API 密码",
+    "serwersmsPhoneNumber": "电话号码",
+    "serwersmsSenderName": "SMS 发信人名称(需要在客户中心注册)",
+    "smseagle": "SMSEagle",
+    "smseagleTo": "电话号码",
+    "smseagleGroup": "通讯录群组名",
+    "smseagleContact": "通讯录联系人",
+    "smseagleRecipientType": "收信人类型",
+    "smseagleRecipient": "收信人(多个需用半角逗号分隔)",
+    "smseagleToken": "API访问令牌",
+    "smseagleUrl": "您的 SMSEagle 设备 URL",
+    "smseagleEncoding": "以 Unicode 发送",
+    "smseaglePriority": "消息优先级(0-9,默认为 0)",
+    "stackfield": "Stackfield",
+    "Customize": "自定义",
+    "Custom Footer": "自定义底部",
+    "Custom CSS": "自定义 CSS",
+    "smtpDkimSettings": "DKIM 设置",
+    "smtpDkimDesc": "请访问 Nodemailer DKIM {0} 了解配置方法。",
+    "documentation": "文档",
+    "smtpDkimDomain": "域名",
+    "smtpDkimKeySelector": "前缀选择器",
+    "smtpDkimPrivateKey": "密钥",
+    "smtpDkimHashAlgo": "哈希算法(可选)",
+    "smtpDkimheaderFieldNames": "包含在哈希计算对象内的 Header 列表(可选)",
+    "smtpDkimskipFields": "不包含在哈希计算对象内的 Header 列表(可选)",
+    "wayToGetPagerDutyKey": "您可以在 Service -> Service Directory -> (选择一个 Service) -> Integrations -> Add integration 页面中搜索“Events API V2”以获取此 Integration Key,更多信息请看{0}",
+    "Integration Key": "集成密钥",
+    "Integration URL": "集成网址",
+    "Auto resolve or acknowledged": "自动标记为已解决或已读",
+    "do nothing": "不做任何操作",
+    "auto acknowledged": "自动标记为已读",
+    "auto resolve": "自动标记为已解决",
+    "gorush": "Gorush",
+    "alerta": "Alerta",
+    "alertaApiEndpoint": "API 接入点",
+    "alertaEnvironment": "环境参数",
+    "alertaApiKey": "API Key",
+    "alertaAlertState": "报警时的严重性",
+    "alertaRecoverState": "恢复后的严重性",
+    "deleteStatusPageMsg": "您确认要删除此状态页吗?",
+    "Proxies": "代理",
+    "default": "默认",
+    "enabled": "启用",
+    "setAsDefault": "设为默认",
+    "deleteProxyMsg": "您确认要在所有监控项中删除此代理吗?",
+    "proxyDescription": "代理必须配置到至少一个监控项后才会工作。",
+    "enableProxyDescription": "此代理必须启用才能对监控项的网络请求起作用。您可以通过修改激活状态,临时在所有监控项中禁用此代理。",
+    "setAsDefaultProxyDescription": "此代理会对新创建的监控项默认激活,您仍可以在监控项配置中单独禁用此代理。",
+    "Certificate Chain": "证书链",
+    "Valid": "有效",
+    "Invalid": "无效",
+    "AccessKeyId": "AccessKey ID",
+    "SecretAccessKey": "AccessKey 密码",
+    "PhoneNumbers": "PhoneNumbers",
+    "TemplateCode": "TemplateCode",
+    "SignName": "SignName",
+    "Sms template must contain parameters: ": "短信模板必须包含以下变量: ",
+    "Bark Endpoint": "Bark 接入点",
+    "Bark Group": "Bark 群组",
+    "Bark Sound": "Bark 铃声",
+    "WebHookUrl": "钉钉自定义机器人 Webhook 地址",
+    "SecretKey": "钉钉自定义机器人加签密钥",
+    "For safety, must use secret key": "出于安全考虑,必须使用加签密钥",
+    "Device Token": "Apple Device Token",
+    "Platform": "平台",
+    "iOS": "iOS",
+    "Android": "Android",
+    "Huawei": "华为",
+    "High": "高",
+    "Retry": "重试次数",
+    "Topic": "Gorush Topic",
+    "WeCom": "企业微信群机器人",
+    "WeCom Bot Key": "企业微信群机器人 Key",
+    "Setup Proxy": "设置代理",
+    "Proxy Protocol": "代理协议",
+    "Proxy Server": "代理服务器",
+    "Server Address": "服务器地址",
+    "Proxy server has authentication": "代理服务器启用了身份验证功能",
+    "User": "用户名",
+    "Installed": "已安装",
+    "Not installed": "未安装",
+    "Running": "运行中",
+    "Not running": "未运行",
+    "Remove Token": "移除 Token",
+    "Start": "启动",
+    "Stop": "停止",
+    "Uptime Kuma": "Uptime Kuma",
+    "Add New Status Page": "添加新的状态页",
+    "Slug": "路径",
+    "Accept characters:": "可接受的字符:",
+    "startOrEndWithOnly": "开头和结尾必须为 {0}",
+    "No consecutive dashes": "不能有连续的破折号",
+    "Next": "下一步",
+    "The slug is already taken. Please choose another slug.": "该路径已被使用。请选择其他路径。",
+    "No Proxy": "无代理",
+    "Authentication": "验证",
+    "HTTP Basic Auth": "HTTP 基础身份验证",
+    "New Status Page": "新的状态页",
+    "Page Not Found": "未找到该页面",
+    "Reverse Proxy": "反向代理",
+    "Backup": "备份",
+    "About": "关于",
+    "wayToGetCloudflaredURL": "(可从 {0} 下载 cloudflared)",
+    "cloudflareWebsite": "Cloudflare 网站",
+    "Message:": "信息:",
+    "Don't know how to get the token? Please read the guide:": "不知道如何获取 Token?请阅读指南:",
+    "The current connection may be lost if you are currently connecting via Cloudflare Tunnel. Are you sure want to stop it? Type your current password to confirm it.": "如果您正在通过 Cloudflare Tunnel 访问网站,则停止可能会导致当前连接断开。您确定要停止吗?请输入密码以确认。",
+    "HTTP Headers": "HTTP 头",
+    "Trust Proxy": "可信的代理类字段",
+    "Other Software": "其他软件",
+    "For example: nginx, Apache and Traefik.": "例如:nginx、Apache 和 Traefik。",
+    "Please read": "请阅读",
+    "Subject:": "颁发给:",
+    "Valid To:": "有效期至:",
+    "Days Remaining:": "剩余有效天数:",
+    "Issuer:": "颁发者:",
+    "Fingerprint:": "指纹:",
+    "No status pages": "无状态页",
+    "Domain Name Expiry Notification": "域名到期时通知",
+    "Proxy": "代理",
+    "Date Created": "创建于",
+    "HomeAssistant": "Home Assistant",
+    "onebotHttpAddress": "OneBot HTTP 地址",
+    "onebotMessageType": "OneBot 消息类型",
+    "onebotGroupMessage": "群聊",
+    "onebotPrivateMessage": "私聊",
+    "onebotUserOrGroupId": "群组/用户 ID",
+    "onebotSafetyTips": "出于安全原因,请务必设置 AccessToken",
+    "PushDeer Key": "PushDeer Key",
+    "Footer Text": "底部自定义文本",
+    "Show Powered By": "显示 Powered By",
+    "Domain Names": "域名",
+    "signedInDisp": "当前用户: {0}",
+    "signedInDispDisabled": "已禁用身份验证。",
+    "RadiusSecret": "Radius 共享机密",
+    "RadiusSecretDescription": "客户端和服务器之间共享的密钥",
+    "RadiusCalledStationId": "NAS 网络访问服务器号码(Called Station Id)",
+    "RadiusCalledStationIdDescription": "所访问的服务器的标识",
+    "RadiusCallingStationId": "呼叫方号码(Calling Station Id)",
+    "RadiusCallingStationIdDescription": "发出请求的设备的标识",
+    "Certificate Expiry Notification": "证书到期时通知",
+    "API Username": "API Username",
+    "API Key": "API Key",
+    "Recipient Number": "收件人手机号码",
+    "From Name/Number": "发件人名称/手机号码",
+    "Leave blank to use a shared sender number.": "留空以使用平台共享的发件人手机号码。",
+    "Octopush API Version": "Octopush API 版本",
+    "Legacy Octopush-DM": "旧版本 Octopush-DM",
+    "endpoint": "接入点",
+    "octopushAPIKey": "控制台 HTTP API credentials 里的 \"API key\"",
+    "octopushLogin": "控制台 HTTP API credentials 里的 \"Login\"",
+    "promosmsLogin": "API 登录名",
+    "promosmsPassword": "API 密码",
+    "pushoversounds pushover": "Pushover(默认)",
+    "pushoversounds bike": "Bike",
+    "pushoversounds bugle": "Bugle",
+    "pushoversounds cashregister": "Cash Register",
+    "pushoversounds classical": "Classical",
+    "pushoversounds cosmic": "Cosmic",
+    "pushoversounds falling": "Falling",
+    "pushoversounds gamelan": "Gamelan",
+    "pushoversounds incoming": "Incoming",
+    "pushoversounds intermission": "Intermission",
+    "pushoversounds magic": "Magic",
+    "pushoversounds mechanical": "Mechanical",
+    "pushoversounds pianobar": "Piano Bar",
+    "pushoversounds siren": "Siren",
+    "pushoversounds spacealarm": "Space Alarm",
+    "pushoversounds tugboat": "Tug Boat",
+    "pushoversounds alien": "Alien Alarm(长铃声)",
+    "pushoversounds climb": "Climb(长铃声)",
+    "pushoversounds persistent": "Persistent(长铃声)",
+    "pushoversounds echo": "Pushover Echo(长铃声)",
+    "pushoversounds updown": "Up Down(长铃声)",
+    "pushoversounds vibrate": "仅震动",
+    "pushoversounds none": "无(静音)",
+    "pushyAPIKey": "API 密钥",
+    "pushyToken": "设备 Token",
+    "Show update if available": "有更新时通知",
+    "Also check beta release": "一并检查 Beta 版更新",
+    "Using a Reverse Proxy?": "正在使用反向代理?",
+    "Check how to config it for WebSocket": "查看如何将反向代理与 WebSocket 一起使用",
+    "Steam Game Server": "Steam 游戏服务器",
+    "Most likely causes:": "最可能的原因:",
+    "The resource is no longer available.": "您所请求的资源已不再可用。",
+    "There might be a typing error in the address.": "您输入的地址可能有误。",
+    "What you can try:": "您可以尝试以下操作:",
+    "Retype the address.": "重新输入地址。",
+    "Go back to the previous page.": "返回到上一页面。",
+    "Coming Soon": "即将推出",
+    "wayToGetClickSendSMSToken": "您可以在{0}获取 API Username 和 API Key。",
+    "Connection String": "连接字符串",
+    "Query": "查询语句",
+    "settingsCertificateExpiry": "TLS 证书过期通知",
+    "certificationExpiryDescription": "HTTPS 监控项发现被监控目标的 TLS 证书剩余有效期少于以下天数时将发出通知:",
+    "Setup Docker Host": "配置 Docker 宿主信息",
+    "Connection Type": "连接方式",
+    "Docker Daemon": "Docker 守护进程",
+    "deleteDockerHostMsg": "您确定要为所有监控项删除此 Docker 宿主设置吗?",
+    "socket": "Socket",
+    "tcp": "TCP / HTTP",
+    "Docker Container": "Docker 容器",
+    "Container Name / ID": "容器名称 / ID",
+    "Docker Host": "Docker 宿主",
+    "Docker Hosts": "Docker 宿主",
+    "ntfy Topic": "ntfy Topic",
+    "Domain": "域名",
+    "Workstation": "工作站",
+    "disableCloudflaredNoAuthMsg": "您现在正处于 No Auth 模式,无需输入密码。",
+    "trustProxyDescription": "信任 'X-Forwarded-*' 头。如果您的 Uptime Kuma 是通过 Nginx 或 Apache 等反代服务对外提供访问的话,则您应当启用本功能以获取正确的客户端 IP。",
+    "wayToGetLineNotifyToken": "您可以在 {0} 获取 Access token",
+    "Examples": "例如",
+    "Home Assistant URL": "Home Assistant 地址",
+    "Long-Lived Access Token": "长期访问令牌",
+    "Long-Lived Access Token can be created by clicking on your profile name (bottom left) and scrolling to the bottom then click Create Token. ": "长期访问令牌可通过点击左下角您的用户名,滚动到页面底部并点击 Create Token 按钮获取。 ",
+    "Notification Service": "Notification Service",
+    "default: notify all devices": "默认:通知所有设备",
+    "A list of Notification Services can be found in Home Assistant under \"Developer Tools > Services\" search for \"notification\" to find your device/phone name.": "通知服务的列表可在 Home Assistant 中的 Developer Tools > Services 通过搜索您的设备或手机的名称来获得。",
+    "Automations can optionally be triggered in Home Assistant:": "可以在 Home Assistant 使用下列模板设置自动化操作的触发条件:",
+    "Trigger type:": "触发类型:",
+    "Event type:": "事件类型:",
+    "Event data:": "事件数据:",
+    "Then choose an action, for example switch the scene to where an RGB light is red.": "然后您可以选择关联操作,例如切换到 RGB 灯发出红光的场景。",
+    "Frontend Version": "前端版本",
+    "Frontend Version do not match backend version!": "前端版本与后端版本不匹配!",
+    "Base URL": "API 基础地址",
+    "goAlertInfo": "GoAlert 是一个用于呼叫调度、自动汇报和通知(如 SMS 或语音呼叫)的开源应用程序。在正确的时间以正确的方式自动让正确的人参与!{0}",
+    "goAlertIntegrationKeyInfo": "使用形如 aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee 的通用 API 集成密钥,通常是复制来的链接中的 token 参数值。",
+    "goAlert": "GoAlert",
+    "backupOutdatedWarning": "已弃用:由于大量新功能的加入,以及备份功能没有时时维护,现在备份功能已经无法生成完整的备份和恢复完整的设置。",
+    "backupRecommend": "请改为直接备份 docker 卷或者数据文件夹(./data/)。",
+    "Optional": "可选的",
+    "squadcast": "Squadcast",
+    "SendKey": "SendKey",
+    "SMSManager API Docs": "SMSManager API 文档 ",
+    "Gateway Type": "网关类型",
+    "SMSManager": "SMSManager",
+    "You can divide numbers with": "可用的数字分隔符包括",
+    "or": "或",
+    "recurringInterval": "时间间隔",
+    "Recurring": "重复",
+    "strategyManual": "手动启用/禁用",
+    "warningTimezone": "使用服务器时区",
+    "weekdayShortMon": "周一",
+    "weekdayShortTue": "周二",
+    "weekdayShortWed": "周三",
+    "weekdayShortThu": "周四",
+    "weekdayShortFri": "周五",
+    "weekdayShortSat": "周六",
+    "weekdayShortSun": "周日",
+    "dayOfWeek": "每周计划",
+    "dayOfMonth": "每月计划",
+    "lastDay": "结束日",
+    "lastDay1": "每月最后一天",
+    "lastDay2": "每月倒数第二天",
+    "lastDay3": "每月倒数第三天",
+    "lastDay4": "每月倒数第四天",
+    "No Maintenance": "无维护计划",
+    "pauseMaintenanceMsg": "确定要暂停吗?",
+    "maintenanceStatus-under-maintenance": "正在维护",
+    "maintenanceStatus-inactive": "未启用",
+    "maintenanceStatus-scheduled": "已计划",
+    "maintenanceStatus-ended": "已结束",
+    "maintenanceStatus-unknown": "未知",
+    "Display Timezone": "显示时区",
+    "Server Timezone": "服务器时区",
+    "statusPageMaintenanceEndDate": "结束时间",
+    "IconUrl": "图标 URL",
+    "Enable DNS Cache": "启用 DNS 缓存",
+    "Enable": "启用",
+    "Disable": "禁用",
+    "dnsCacheDescription": "可能无法在某些 IPv6 环境工作,如果遇到问题请禁用。",
+    "Single Maintenance Window": "单一时间窗口",
+    "Maintenance Time Window of a Day": "每日维护时间窗口",
+    "Effective Date Range": "生效日期范围",
+    "Schedule Maintenance": "计划维护",
+    "Date and Time": "日期时间",
+    "DateTime Range": "日期时间范围",
+    "Strategy": "策略",
+    "Free Mobile User Identifier": "Free Mobile User Identifier",
+    "Free Mobile API Key": "Free Mobile API Key",
+    "Enable TLS": "启用 TLS",
+    "Proto Service Name": "Proto 服务名称",
+    "Proto Method": "Proto 方法",
+    "Proto Content": "Proto 内容",
+    "Economy": "经济",
+    "Lowcost": "低价",
+    "high": "高价",
+    "General Monitor Type": "常规监控类型",
+    "Passive Monitor Type": "被动监控类型",
+    "Specific Monitor Type": "特殊监控类型",
+    "dataRetentionTimeError": "保留期必须为0或更大",
+    "Monitor": "监控项",
+    "Custom": "自定义",
+    "promosmsAllowLongSMS": "允许长的短信",
+    "confirmDeleteTagMsg": "你确定你要删除这个标签?与此标签关联的监视器不会被删除。",
+    "infiniteRetention": "设为0表示无限保留期。",
+    "Help": "帮助",
+    "Game": "游戏",
+    "Packet Size": "数据包大小",
+    "loadingError": "无法获取数据,请稍后重试。",
+    "plugin": "插件 | 插件",
+    "install": "安装",
+    "installing": "正在安装",
+    "uninstall": "卸载",
+    "uninstalling": "正在卸载",
+    "confirmUninstallPlugin": "您确定要卸载此插件吗?",
+    "Custom Monitor Type": "自定义监控类型",
+    "markdownSupported": "支持 Markdown 语法",
+    "Google Analytics ID": "Google Analytics(分析)ID",
+    "Learn More": "了解更多",
+    "Edit Tag": "编辑标签"
+}
diff --git a/src/lang/zh-HK.json b/src/lang/zh-HK.json
new file mode 100644
index 000000000..8111b73dd
--- /dev/null
+++ b/src/lang/zh-HK.json
@@ -0,0 +1,660 @@
+{
+    "languageName": "繁體中文 (香港)",
+    "Settings": "設定",
+    "Dashboard": "主控台",
+    "New Update": "有更新",
+    "Language": "語言",
+    "Appearance": "外觀",
+    "Theme": "主題",
+    "General": "一般",
+    "Version": "版本",
+    "Check Update On GitHub": "到 Github 查看更新",
+    "List": "列表",
+    "Add": "新增",
+    "Add New Monitor": "新增監測器",
+    "Quick Stats": "綜合數據",
+    "Up": "上線",
+    "Down": "離線",
+    "Pending": "待定",
+    "Unknown": "不明",
+    "Pause": "暫停",
+    "pauseDashboardHome": "暫停",
+    "Name": "名稱",
+    "Status": "狀態",
+    "DateTime": "日期時間",
+    "Message": "內容",
+    "No important events": "沒有重要事件",
+    "Resume": "恢復",
+    "Edit": "編輯",
+    "Delete": "刪除",
+    "Current": "目前",
+    "Uptime": "上線率",
+    "Cert Exp.": "証書期限",
+    "day": "日",
+    "-day": "日",
+    "hour": "小時",
+    "-hour": "小時",
+    "checkEverySecond": "每 {0} 秒檢查一次",
+    "Response": "反應時間",
+    "Ping": "反應時間",
+    "Monitor Type": "監測器類型",
+    "Keyword": "關鍵字",
+    "Friendly Name": "名稱",
+    "URL": "網址 URL",
+    "Hostname": "Hostname",
+    "Port": "Port",
+    "Heartbeat Interval": "檢查間距",
+    "Retries": "重試數次確定為離線",
+    "retriesDescription": "重試多少次後才判定為離線及傳送通知。如數值為 0 會即判定為離線及傳送通知。",
+    "Advanced": "進階",
+    "ignoreTLSError": "忽略 TLS/SSL 錯誤",
+    "Upside Down Mode": "反轉模式",
+    "upsideDownModeDescription": "反轉狀態,如網址是可正常瀏覽,會被判定為 '離線/DOWN'",
+    "Max. Redirects": "跟隨重新導向 (Redirect) 的次數",
+    "maxRedirectDescription": "設為 0 即不跟蹤",
+    "Accepted Status Codes": "接受為上線的 HTTP 狀態碼",
+    "acceptedStatusCodesDescription": "可多選",
+    "Save": "儲存",
+    "Notifications": "通知",
+    "Not available, please setup.": "無法使用,需要設定",
+    "Setup Notification": "設定通知",
+    "Light": "明亮",
+    "Dark": "暗黑",
+    "Auto": "自動",
+    "Theme - Heartbeat Bar": "監測器列表 狀態條外觀",
+    "Normal": "一般",
+    "Bottom": "下方",
+    "None": "沒有",
+    "Timezone": "時區",
+    "Search Engine Visibility": "是否允許搜尋器索引",
+    "Allow indexing": "允許索引",
+    "Discourage search engines from indexing site": "不建議搜尋器索引",
+    "Change Password": "變更密碼",
+    "Current Password": "目前密碼",
+    "New Password": "新密碼",
+    "Repeat New Password": "確認新密碼",
+    "passwordNotMatchMsg": "密碼不一致",
+    "Update Password": "更新密碼",
+    "Disable Auth": "取消登入認証",
+    "Enable Auth": "開啟登入認証",
+    "disableauth.message1": "你是否確認<strong>取消登入認証</strong>?",
+    "disableauth.message2": "這個功能是設計給已有<strong>第三方認証</strong>的用家,例如 Cloudflare Access。",
+    "Please use this option carefully!": "請小心使用。",
+    "Logout": "登出",
+    "notificationDescription": "新增後,你需要在監測器裡啟用。",
+    "Leave": "離開",
+    "I understand, please disable": "我明白,請取消登入認証",
+    "Confirm": "確認",
+    "Yes": "是",
+    "No": "否",
+    "Username": "帳號",
+    "Password": "密碼",
+    "Remember me": "記住我",
+    "Login": "登入",
+    "No Monitors, please": "沒有監測器,請",
+    "add one": "新增",
+    "Notification Type": "通知類型",
+    "Email": "電郵",
+    "Test": "測試",
+    "keywordDescription": "搜索 HTML 或 JSON 裡是否有出現關鍵字(注意英文大細階)",
+    "Certificate Info": "憑證詳細資料",
+    "deleteMonitorMsg": "是否確定刪除這個監測器?",
+    "deleteNotificationMsg": "是否確定刪除這個通知設定?如監測器啟用了這個通知,將會收不到通知。",
+    "Resolver Server": "DNS 伺服器",
+    "Resource Record Type": "DNS 記錄類型",
+    "resolverserverDescription": "預設為 Cloudflare DNS 伺服器,你可以轉用其他 DNS 伺服器。",
+    "rrtypeDescription": "請選擇 DNS 記錄類型",
+    "pauseMonitorMsg": "是否確定要暫停?",
+    "Last Result": "最後結果",
+    "Create your admin account": "建立管理員帳號",
+    "Repeat Password": "重複密碼",
+    "respTime": "反應時間 (ms)",
+    "notAvailableShort": "N/A",
+    "Create": "建立",
+    "clearEventsMsg": "是否確定刪除這個監測器的所有事件?",
+    "clearHeartbeatsMsg": "是否確定刪除這個監測器的所有脈搏資料?",
+    "confirmClearStatisticsMsg": "是否確定刪除所有監測器的脈搏資料?(您的監測器會繼續正常運作)",
+    "Clear Data": "清除資料",
+    "Events": "事件",
+    "Heartbeats": "脈搏",
+    "Auto Get": "自動獲取",
+    "enableDefaultNotificationDescription": "新增監測器時這個通知會預設啟用,當然每個監測器亦可分別控制開關。",
+    "Default enabled": "預設通知",
+    "Also apply to existing monitors": "同時取用至目前所有監測器",
+    "Export": "匯出",
+    "Import": "匯入",
+    "backupDescription": "您可以備份所有監測器及所有通知。",
+    "backupDescription2": "註:此備份不包括歷史記錄。",
+    "backupDescription3": "此備份可能包含了一些敏感資料如通知裡的 Token,請小心保存備份。",
+    "alertNoFile": "請選擇一個檔案",
+    "alertWrongFileType": "請選擇 JSON 檔案",
+    "twoFAVerifyLabel": "請輸入 Token 以確認 2FA:",
+    "tokenValidSettingsMsg": "Token 有效!您現在可以儲存 2FA 設定。",
+    "confirmEnableTwoFAMsg": "您確定要啟用 2FA 嗎?",
+    "confirmDisableTwoFAMsg": "您確定要停用 2FA 嗎?",
+    "Apply on all existing monitors": "套用至目前所有監測器",
+    "Verify Token": "驗証 Token",
+    "Setup 2FA": "設定 2FA",
+    "Enable 2FA": "開啟 2FA",
+    "Disable 2FA": "關閉 2FA",
+    "2FA Settings": "2FA 設定",
+    "Two Factor Authentication": "雙重認證",
+    "Active": "生效",
+    "Inactive": "未生效",
+    "Token": "Token",
+    "Show URI": "顯示 URI",
+    "Clear all statistics": "清除所有歷史記錄",
+    "retryCheckEverySecond": "Retry every {0} seconds.",
+    "importHandleDescription": "\"略過已存在的\" 會跳過所有相同名稱的監測器或通知。 '覆蓋' 將刪除所有現有的監測器及通知。",
+    "confirmImportMsg": "您確定要匯入備份嗎?請確認你已選擇正確的匯入設定。",
+    "Heartbeat Retry Interval": "Heartbeat Retry Interval",
+    "Import Backup": "匯入備份",
+    "Export Backup": "匯出備份",
+    "Skip existing": "略過已存在的",
+    "Overwrite": "覆蓋",
+    "Options": "選項",
+    "Keep both": "兩者並存",
+    "Tags": "標籤",
+    "Add New below or Select...": "在下方新增或選取…",
+    "Tag with this name already exist.": "Tag with this name already exist.",
+    "Tag with this value already exist.": "Tag with this value already exist.",
+    "color": "顏色",
+    "value (optional)": "值 (非必需)",
+    "Gray": "灰",
+    "Red": "紅",
+    "Orange": "橙",
+    "Green": "綠",
+    "Blue": "藍",
+    "Indigo": "靛",
+    "Purple": "紫",
+    "Pink": "粉紅",
+    "Search...": "搜尋…",
+    "Avg. Ping": "平均反應時間",
+    "Avg. Response": "平均反應時間",
+    "Entry Page": "Entry Page",
+    "statusPageNothing": "Nothing here, please add a group or a monitor.",
+    "No Services": "沒有服務",
+    "All Systems Operational": "一切正常",
+    "Partially Degraded Service": "部份服務受阻",
+    "Degraded Service": "服務受阻",
+    "Add Group": "新增群組",
+    "Add a monitor": "新增監測器",
+    "Edit Status Page": "編輯 Status Page",
+    "Go to Dashboard": "前往主控台",
+    "Status Page": "Status Page",
+    "Status Pages": "Status Pages",
+    "telegram": "Telegram",
+    "webhook": "Webhook",
+    "smtp": "電郵 (SMTP)",
+    "discord": "Discord",
+    "teams": "Microsoft Teams",
+    "signal": "Signal",
+    "gotify": "Gotify",
+    "slack": "Slack",
+    "rocket.chat": "Rocket.chat",
+    "pushover": "Pushover",
+    "pushy": "Pushy",
+    "octopush": "Octopush",
+    "promosms": "PromoSMS",
+    "lunasea": "LunaSea",
+    "apprise": "Apprise (支援 50 多種通知)",
+    "pushbullet": "Pushbullet",
+    "line": "Line Messenger",
+    "mattermost": "Mattermost",
+    "deleteStatusPageMsg": "是否確定刪除這個 Status Page?",
+    "Push URL": "推送網址",
+    "needPushEvery": "您應每 {0} 秒呼叫此網址。",
+    "pushOptionalParams": "選填參數:{0}",
+    "defaultNotificationName": "我的 {notification} 通知 ({number})",
+    "here": "此處",
+    "Required": "必填",
+    "Bot Token": "機器人權杖",
+    "wayToGetTelegramToken": "您可以從 {0} 取得 Token。",
+    "Chat ID": "聊天 ID",
+    "supportTelegramChatID": "支援 對話/群組/頻道的聊天 ID",
+    "wayToGetTelegramChatID": "傳送訊息給機器人,並前往以下網址以取得您的 chat ID:",
+    "YOUR BOT TOKEN HERE": "在此填入您的機器人權杖",
+    "chatIDNotFound": "找不到 Chat ID;請先傳送訊息給機器人",
+    "Post URL": "Post 網址",
+    "Content Type": "Content Type",
+    "webhookJsonDesc": "{0} 適合任何現代的 HTTP 伺服器,如 Express.js",
+    "webhookFormDataDesc": "{multipart} 適合 PHP。 JSON 必須先經由 {decodeFunction} 剖析。",
+    "secureOptionNone": "無 / STARTTLS (25, 587)",
+    "secureOptionTLS": "TLS (465)",
+    "Ignore TLS Error": "忽略 TLS 錯誤",
+    "From Email": "寄件人",
+    "emailCustomSubject": "自訂主旨",
+    "To Email": "收件人",
+    "smtpCC": "CC",
+    "smtpBCC": "BCC",
+    "Discord Webhook URL": "Discord Webhook 網址",
+    "wayToGetDiscordURL": "您可以前往伺服器設定 -> 整合 -> Webhook -> 新 Webhook 以取得",
+    "Bot Display Name": "機器人顯示名稱",
+    "Prefix Custom Message": "前綴自訂訊息",
+    "Webhook URL": "Webhook 網址",
+    "wayToGetTeamsURL": "您可以前往此頁面以了解如何建立 Webhook 網址 {0}。",
+    "Number": "號碼",
+    "Recipients": "收件人",
+    "needSignalAPI": "您需要有 REST API 的 Signal 客戶端。",
+    "wayToCheckSignalURL": "您可以前往下列網址以了解如何設定:",
+    "signalImportant": "注意: 不得混合收件人的群組和號碼!",
+    "Application Token": "應用程式權杖",
+    "Server URL": "伺服器網址",
+    "Priority": "優先度",
+    "Icon Emoji": "Emoji 圖示",
+    "Channel Name": "頻道名稱",
+    "Uptime Kuma URL": "Uptime Kuma 網址",
+    "aboutWebhooks": "更多關於 Webhook 的資訊: {0}",
+    "aboutChannelName": "如果您不想使用 Webhook 頻道,請在 {0} 頻道名稱欄位填入您想使用的頻道。例如: #其他頻道",
+    "aboutKumaURL": "如果您未填入 Uptime Kuma 網址。將預設使用專案 Github 頁面。",
+    "emojiCheatSheet": "Emoji 一覽表: {0}",
+    "PushByTechulus": "Push by Techulus",
+    "clicksendsms": "ClickSend SMS",
+    "GoogleChat": "Google Chat (僅限 Google Workspace)",
+    "User Key": "使用者金鑰",
+    "Device": "裝置",
+    "Message Title": "訊息標題",
+    "Notification Sound": "通知音效",
+    "More info on:": "更多資訊: {0}",
+    "pushoverDesc1": "緊急優先度 (2) 的重試間隔為 30 秒並且會在 1 小時後過期。",
+    "pushoverDesc2": "如果您想要傳送通知到不同裝置,請填寫裝置欄位。",
+    "SMS Type": "簡訊類型",
+    "octopushTypePremium": "Premium (快速 - 建議用於警報)",
+    "octopushTypeLowCost": "Low Cost (緩慢 - 有時會被營運商阻擋)",
+    "checkPrice": "查看 {0} 價格:",
+    "apiCredentials": "API 認證",
+    "octopushLegacyHint": "您使用的是舊版的 Octopush (2011-2020) 還是新版?",
+    "Check octopush prices": "查看 octopush 價格 {0}。",
+    "octopushPhoneNumber": "電話號碼 (intl 格式,例如:+33612345678) ",
+    "octopushSMSSender": "簡訊寄件人名稱:3-11位英數字元及空白 (a-zA-Z0-9)",
+    "LunaSea Device ID": "LunaSea 裝置 ID",
+    "Apprise URL": "Apprise 網址",
+    "Example:": "範例:{0}",
+    "Read more:": "深入瞭解:{0}",
+    "Status:": "狀態:{0}",
+    "Read more": "深入瞭解",
+    "appriseInstalled": "已安裝 Apprise。",
+    "appriseNotInstalled": "尚未安裝 Apprise。{0}",
+    "Access Token": "存取權杖",
+    "Channel access token": "頻道存取權杖",
+    "Line Developers Console": "Line 開發者控制台",
+    "lineDevConsoleTo": "Line 開發者控制台 - {0}",
+    "Basic Settings": "基本設定",
+    "User ID": "使用者 ID",
+    "Messaging API": "Messaging API",
+    "wayToGetLineChannelToken": "首先,前往 {0},建立 provider 和 channel (Messaging API)。接著您就可以從上面提到的選單項目中取得頻道存取權杖及使用者 ID。",
+    "Icon URL": "圖示網址",
+    "aboutIconURL": "您可以在 \"圖示網址\" 中提供圖片網址以覆蓋預設個人檔案圖片。若已設定 Emoji 圖示,將忽略此設定。",
+    "aboutMattermostChannelName": "您可以在 \"頻道名稱\" 欄位中填寫頻道名稱以覆蓋 Webhook 的預設頻道。必須在 Mattermost 的 Webhook 設定中啟用。例如:#其他頻道",
+    "matrix": "Matrix",
+    "promosmsTypeEco": "SMS ECO - 便宜,但是很慢且經常過載。僅限位於波蘭的收件人。",
+    "promosmsTypeFlash": "SMS FLASH - 訊息會自動在收件人的裝置上顯示。僅限位於波蘭的收件人。",
+    "promosmsTypeFull": "SMS FULL - 高級版,您可以使用您的寄件人名稱 (必須先註冊名稱。對於警報來說十分可靠。",
+    "promosmsTypeSpeed": "SMS SPEED - 系統中的最高優先度。快速、可靠,但昂貴 (約 SMS FULL 的兩倍價格)。",
+    "promosmsPhoneNumber": "電話號碼 (若收件人位於波蘭則無需輸入區域代碼)",
+    "promosmsSMSSender": "簡訊寄件人名稱:預先註冊的名稱或以下的預設名稱:InfoSMS、SMS Info、MaxSMS、INFO、SMS",
+    "Feishu WebHookUrl": "飛書 WebHook 網址",
+    "matrixHomeserverURL": "Homeserver 網址 (開頭為 http(s)://,結尾可能帶連接埠)",
+    "Internal Room Id": "Internal Room ID",
+    "matrixDesc1": "您可以在 Matrix 客戶端的房間設定中的進階選項找到 internal room ID。應該看起來像 !QMdRCpUIfLwsfjxye6:home.server。",
+    "matrixDesc2": "使用您自己的 Matrix 使用者存取權杖將賦予存取您的帳號和您加入的房間的完整權限。建議建立新使用者,並邀請至您想要接收通知的房間中。您可以執行 {0} 以取得存取權杖",
+    "Method": "方法",
+    "Body": "主體",
+    "Headers": "標頭",
+    "PushUrl": "Push URL",
+    "HeadersInvalidFormat": "要求標頭不是有效的 JSON:",
+    "BodyInvalidFormat": "請求主體不是有效的 JSON:",
+    "Monitor History": "監測器歷史紀錄",
+    "clearDataOlderThan": "保留 {0} 天內的監測器歷史紀錄。",
+    "PasswordsDoNotMatch": "密碼不相符。",
+    "records": "記錄",
+    "One record": "一項記錄",
+    "Showing {from} to {to} of {count} records": "正在顯示 {count} 項記錄中的 {from} 至 {to} 項",
+    "steamApiKeyDescription": "若要監測 Steam 遊戲伺服器,您將需要 Steam Web-API 金鑰。您可以在此註冊您的 API 金鑰:",
+    "Current User": "目前使用者",
+    "recent": "最近",
+    "Done": "完成",
+    "Info": "資訊",
+    "Security": "安全性",
+    "Steam API Key": "Steam API Key",
+    "Shrink Database": "壓縮資料庫",
+    "Pick a RR-Type...": "選擇資源記錄類型…",
+    "Pick Accepted Status Codes...": "選擇可接受的狀態碼…",
+    "Default": "預設",
+    "HTTP Options": "HTTP 選項",
+    "Create Incident": "建立事件",
+    "Title": "標題",
+    "Content": "內容",
+    "Style": "樣式",
+    "info": "資訊",
+    "warning": "警告",
+    "danger": "危險",
+    "primary": "主要",
+    "light": "淺色",
+    "dark": "暗色",
+    "Post": "發佈",
+    "Please input title and content": "請輸入標題及內容",
+    "Created": "建立",
+    "Last Updated": "最後更新",
+    "Unpin": "取消釘選",
+    "Switch to Light Theme": "切換至淺色佈景主題",
+    "Switch to Dark Theme": "切換至深色佈景主題",
+    "Show Tags": "顯示標籤",
+    "Hide Tags": "隱藏標籤",
+    "Description": "描述",
+    "No monitors available.": "沒有可用的監測器。",
+    "Add one": "新增一個",
+    "No Monitors": "無監測器",
+    "Untitled Group": "未命名群組",
+    "Services": "服務",
+    "Discard": "捨棄",
+    "Cancel": "取消",
+    "shrinkDatabaseDescription": "觸發 SQLite 的資料庫清理 (VACUUM)。如果您的資料庫是在 1.10.0 版本後建立,AUTO_VACUUM 已自動啟用,則無需此操作。",
+    "serwersms": "SerwerSMS.pl",
+    "serwersmsAPIUser": "API 使用者名稱 (包括 webapi_ 前綴)",
+    "serwersmsAPIPassword": "API 密碼",
+    "serwersmsPhoneNumber": "電話號碼",
+    "serwersmsSenderName": "SMS 寄件人名稱 (由客戶入口網站註冊)",
+    "stackfield": "Stackfield",
+    "smtpDkimSettings": "DKIM 設定",
+    "smtpDkimDesc": "請參考 Nodemailer DKIM {0} 使用方式。",
+    "documentation": "文件",
+    "smtpDkimDomain": "網域名稱",
+    "smtpDkimKeySelector": "Key Selector",
+    "smtpDkimPrivateKey": "私密金鑰",
+    "smtpDkimHashAlgo": "雜湊演算法 (選填)",
+    "smtpDkimheaderFieldNames": "要簽署的郵件標頭 (選填)",
+    "smtpDkimskipFields": "不簽署的郵件標頭 (選填)",
+    "gorush": "Gorush",
+    "alerta": "Alerta",
+    "alertaApiEndpoint": "API Endpoint",
+    "alertaEnvironment": "環境",
+    "alertaApiKey": "API 金鑰",
+    "alertaAlertState": "警示狀態",
+    "alertaRecoverState": "恢復狀態",
+    "Proxies": "代理伺服器",
+    "default": "預設",
+    "enabled": "啟用",
+    "setAsDefault": "設為預設",
+    "deleteProxyMsg": "您確定要為所有監測器刪除此代理伺服器嗎?",
+    "proxyDescription": "必須將代理伺服器指派給監測器才能運作。",
+    "enableProxyDescription": "此代理伺服器在啟用前不會在監測器上生效,您可以藉由控制啟用狀態來暫時對所有的監測器停用代理伺服器。",
+    "setAsDefaultProxyDescription": "預設情況下,新監測器將啟用此代理伺服器。您仍可分別停用各監測器的代理伺服器。",
+    "Maintenance": "維護",
+    "statusMaintenance": "維護中",
+    "Enable DNS Cache": "啟用 DNS 快取",
+    "Enable": "啟用",
+    "Disable": "停用",
+    "Schedule maintenance": "計劃維護",
+    "Help": "幫助",
+    "Valid To:": "有效期至:",
+    "Date Created": "新增日期",
+    "resendEveryXTimes": "每 {0} 次便重新傳送",
+    "resendDisabled": "重新傳送已停用",
+    "enableGRPCTls": "允許以 TLS 連線傳送 gRPC 要求",
+    "recurringIntervalMessage": "每天一次 | 每 {0} 天一次",
+    "affectedMonitorsDescription": "選擇受目前維護影響的監測器",
+    "affectedStatusPages": "在已選取的狀態頁中顯示此維護訊息",
+    "Primary Base URL": "主要 Base URL",
+    "Passive Monitor Type": "被動監測器類型",
+    "Resend Notification if Down X times consecutively": "每 X 次心跳皆離線,重新傳送通知",
+    "Game": "遊戲",
+    "Specific Monitor Type": "特定監測器類型",
+    "Monitor": "監測器 | 監測器",
+    "General Monitor Type": "一般監測器類型",
+    "Affected Monitors": "受影響的監測器",
+    "Powered by": "技術支持:",
+    "Add New Status Page": "新增 Status Page",
+    "Page Not Found": "找不到頁面",
+    "Start of maintenance": "維護開始時間",
+    "All Status Pages": "所有 Status Page",
+    "webhookAdditionalHeadersTitle": "額外 Header",
+    "successMessage": "成功訊息",
+    "error": "錯誤",
+    "critical": "嚴重",
+    "Customize": "自定義",
+    "Custom Footer": "自訂 Footer",
+    "Custom CSS": "自訂 CSS",
+    "Valid": "有效",
+    "Invalid": "無效",
+    "Installed": "已安裝",
+    "Not installed": "未安裝",
+    "Running": "執行中",
+    "Stop": "停止",
+    "Next": "下一步",
+    "No Proxy": "無 Proxy",
+    "Backup": "備份",
+    "Pick Affected Monitors...": "挑選受影響的監測器…",
+    "Custom": "自訂",
+    "Not running": "未執行",
+    "Remove Token": "移除 Token",
+    "Start": "開始",
+    "User": "使用者",
+    "trustProxyDescription": "信任 'X-Forwarded-*' 的 Header。如果您想取得正確的 Client IP,且您的 Uptime Kuma 架設於 Nginx 或 Apache 之後,您應啟用此選項。",
+    "Reverse Proxy": "Reverse Proxy",
+    "Long-Lived Access Token can be created by clicking on your profile name (bottom left) and scrolling to the bottom then click Create Token. ": "若要取得長期有效 Access Token,請按您的個人檔案名稱 (左下角),捲動至最下方,然後按建立 Token。 ",
+    "A list of Notification Services can be found in Home Assistant under \"Developer Tools > Services\" search for \"notification\" to find your device/phone name.": "您可以在 Home Assistant 中查看通知服務的列表,在\"開發者工具 > 服務\"下搜尋\"通知\"來找到您的裝置/手機的名稱。",
+    "loadingError": "未能取得數據,請重新再試。",
+    "uninstall": "解除安裝",
+    "wayToGetZohoCliqURL": "您可以前往此頁面以了解如何建立 Webhook 網址 {0}。",
+    "Select status pages...": "選擇 Status Page…",
+    "webhookAdditionalHeadersDesc": "設定傳送 Webhook 時使用的額外 Header。",
+    "topic": "Topic",
+    "topicExplanation": "監測 MQTT 中的一個 Topic",
+    "successMessageExplanation": "MQTT 中收到視為成功的訊息",
+    "Certificate Chain": "証書信任鏈",
+    "Slug": "Slug",
+    "Accept characters:": "可用字元:",
+    "startOrEndWithOnly": "只能使用 {0} 開頭或結尾",
+    "No consecutive dashes": "不得連續使用破折號",
+    "The slug is already taken. Please choose another slug.": "此 slug 已被使用。請選擇其他 slug。",
+    "Authentication": "驗證",
+    "HTTP Basic Auth": "HTTP Basic Auth",
+    "New Status Page": "新 Status Page",
+    "Docker Daemon": "Docker Daemon",
+    "About": "關於",
+    "wayToGetCloudflaredURL": "(到 {0} 下載 cloudflared)",
+    "cloudflareWebsite": "Cloudflare 網頁",
+    "Message:": "訊息:",
+    "Don't know how to get the token? Please read the guide:": "不知道如何取得權杖?請閱讀指南:",
+    "The current connection may be lost if you are currently connecting via Cloudflare Tunnel. Are you sure want to stop it? Type your current password to confirm it.": "如果您正透過 Cloudflare Tunnel 連線,可能會導致連線中斷。您確定要停止嗎?請輸入密碼以確認。",
+    "HTTP Headers": "HTTP Headers",
+    "Trust Proxy": "信任 Proxy",
+    "Other Software": "其他軟件",
+    "For example: nginx, Apache and Traefik.": "例如 nginx、Apache 和 Traefik。",
+    "Please read": "請閱覽",
+    "Subject:": "標題:",
+    "Days Remaining:": "餘下日數:",
+    "Issuer:": "簽發者:",
+    "Fingerprint:": "指紋:",
+    "No status pages": "無 Status Page",
+    "Domain Name Expiry Notification": "Domain 到期通知",
+    "Footer Text": "Footer 文字",
+    "Show Powered By": "顯示 \"Powered By\"",
+    "Domain Names": "Domain",
+    "signedInDisp": "登入為 {0}",
+    "signedInDispDisabled": "驗證已停用。",
+    "RadiusSecret": "Radius Secret",
+    "RadiusSecretDescription": "Client 與 Server 之間的共享 Secret",
+    "RadiusCalledStationId": "Called Station Id",
+    "RadiusCallingStationId": "Calling Station Id",
+    "Certificate Expiry Notification": "証書過期通知",
+    "API Username": "API 使用者名稱",
+    "API Key": "API Key",
+    "Show update if available": "有更新時顯示",
+    "Also check beta release": "檢查 Beta 版本",
+    "Using a Reverse Proxy?": "正在使用 Reverse Proxy?",
+    "Check how to config it for WebSocket": "查看如何加入 WebSocket 設定",
+    "Steam Game Server": "Steam 遊戲 Server",
+    "Most likely causes:": "最可能原因:",
+    "The resource is no longer available.": "資源已不能存取。",
+    "There might be a typing error in the address.": "網址可能輸入錯誤。",
+    "What you can try:": "您可以嘗試:",
+    "Retype the address.": "重新輸入網址。",
+    "Go back to the previous page.": "返回上一頁。",
+    "Coming Soon": "即將推出",
+    "Connection String": "Connection String",
+    "Query": "Query",
+    "settingsCertificateExpiry": "TLS 証書到期",
+    "certificationExpiryDescription": "証書將於 X 天後到期時觸發 HTTPS 監測器通知:",
+    "Setup Docker Host": "設定 Docker 主機",
+    "Connection Type": "連線方式",
+    "deleteDockerHostMsg": "您確定要為所有監測器刪除此 Docker 主機嗎?",
+    "socket": "Socket",
+    "tcp": "TCP / HTTP",
+    "Docker Container": "Docker Container",
+    "Container Name / ID": "Container 名稱 / ID",
+    "Docker Host": "Docker 主機",
+    "Docker Hosts": "Docker 主機",
+    "Domain": "Domain",
+    "Workstation": "Workstation",
+    "ZohoCliq": "ZohoCliq",
+    "disableCloudflaredNoAuthMsg": "您處於無驗證模式。無須輸入密碼。",
+    "wayToGetLineNotifyToken": "您可以從 {0} 取得 Access Token。",
+    "Examples": "例子",
+    "Home Assistant URL": "Home Assistant 網址",
+    "Long-Lived Access Token": "長期有效 Access Token",
+    "Notification Service": "通知服務",
+    "default: notify all devices": "預設:通知所有服務",
+    "Automations can optionally be triggered in Home Assistant:": "可以選擇在 Home Assistant 中觸發自動程序:",
+    "Trigger type:": "觸發類型:",
+    "backupRecommend": "請直接備份 Docker Volume 或 ./data/ 資料夾。",
+    "squadcast": "Squadcast",
+    "or": "或",
+    "recurringInterval": "間隔",
+    "Recurring": "重複性",
+    "strategyManual": "手動啟用/停用",
+    "warningTimezone": "正在使用 Server 的時區",
+    "weekdayShortMon": "一",
+    "weekdayShortTue": "二",
+    "weekdayShortWed": "三",
+    "weekdayShortThu": "四",
+    "weekdayShortFri": "五",
+    "weekdayShortSat": "六",
+    "weekdayShortSun": "日",
+    "dayOfWeek": "每周特定一天",
+    "dayOfMonth": "每月特定一天",
+    "lastDay": "最後一天",
+    "lastDay1": "每月最後一天",
+    "maintenanceStatus-ended": "已結束",
+    "maintenanceStatus-unknown": "未知",
+    "Display Timezone": "顯示時區",
+    "Schedule Maintenance": "排程維護",
+    "Date and Time": "日期與時間",
+    "DateTime Range": "日期與時間範圍",
+    "plugin": "插件 | 插件",
+    "install": "安裝",
+    "installing": "正在安装",
+    "uninstalling": "正在解除安裝",
+    "confirmUninstallPlugin": "你確定要解除安裝?",
+    "dataRetentionTimeError": "保留限期必需為 0 或正數",
+    "infiniteRetention": "設定為 0 以作無限期保留。",
+    "Effective Date Range": "有效日期範圍",
+    "Hello @everyone is...": "Hello {'@'}everyone is…",
+    "Packet Size": "Packet 大小",
+    "Event type:": "事件類型:",
+    "Event data:": "事件資料:",
+    "Then choose an action, for example switch the scene to where an RGB light is red.": "然後選擇操作,例如切換至 RGB 燈為紅色的場景。",
+    "Frontend Version": "前端版本",
+    "Frontend Version do not match backend version!": "前端版本與後端版本不符!",
+    "lastDay2": "每月倒數第二天",
+    "lastDay3": "每月倒數第三天",
+    "lastDay4": "每月倒數第四天",
+    "No Maintenance": "無維護",
+    "pauseMaintenanceMsg": "您確定要暫停嗎?",
+    "maintenanceStatus-under-maintenance": "維護中",
+    "maintenanceStatus-inactive": "已停用",
+    "maintenanceStatus-scheduled": "已排程",
+    "Server Timezone": "伺服器時區",
+    "statusPageMaintenanceEndDate": "結束",
+    "IconUrl": "Icon 網址",
+    "dnsCacheDescription": "在某些情況 IPv6 可能會出現異常,如果您遇到任何問題,請停用。",
+    "Single Maintenance Window": "單一維護時段",
+    "Maintenance Time Window of a Day": "每日維護時段",
+    "Proxy": "Proxy",
+    "backupOutdatedWarning": "過時:由於備份功能未顧及新功能的增加,因此備份功能無法產生或復原完整的備份。",
+    "Optional": "可選填",
+    "markdownSupported": "支援 Markdown",
+    "Custom Monitor Type": "自訂監測器",
+    "Google Analytics ID": "Google Analytics ID",
+    "Learn More": "了解更多",
+    "Server Address": "Server 地址",
+    "Edit Tag": "編輯標籤",
+    "confirmDeleteTagMsg": "你確定你要刪除此標籤?相關的監測器不會被刪除。",
+    "pushoversounds pushover": "Pushover (預設)",
+    "pushoversounds tugboat": "Tug Boat",
+    "pushyToken": "裝置 Token",
+    "Proto Content": "Proto 內容",
+    "onebotHttpAddress": "OneBot HTTP 地址",
+    "HomeAssistant": "Home Assistant",
+    "Leave blank to use a shared sender number.": "留空以使用平台共享的發送人號碼。",
+    "auto acknowledged": "自動標記已讀",
+    "wayToGetPagerDutyKey": "您可以前往 Service -> Service Directory -> (Select a service) -> Integrations -> Add integration 以取得。您可以搜尋 \"Events API V2\"。詳細資訊 {0}",
+    "Kook": "Kook",
+    "wayToGetKookBotToken": "到 {0} 創建應用並取得 Bot Token",
+    "grpcMethodDescription": "Method 名稱將被轉換成 cammelCase 命名,如 sayHello、check 等。",
+    "deleteMaintenanceMsg": "您確定要刪除此維護嗎?",
+    "dnsPortDescription": "DNS 伺服器 port。預設為 53。您可以隨時變更 port。",
+    "atLeastOneMonitor": "選擇至少一個受影響的監測器",
+    "endpoint": "endpoint",
+    "octopushAPIKey": "在控制台的 HTTP API 憑證取得的 \"API Key\"",
+    "octopushLogin": "在控制台的 HTTP API 憑證取得的 \"Login\"",
+    "promosmsLogin": "API 登入名稱",
+    "promosmsPassword": "API 密碼",
+    "pushoversounds bike": "Bike",
+    "pushoversounds bugle": "Bugle",
+    "pushoversounds cashregister": "Cash Register",
+    "pushoversounds classical": "Classical",
+    "pushoversounds cosmic": "Cosmic",
+    "pushoversounds falling": "Falling",
+    "pushoversounds gamelan": "Gamelan",
+    "pushoversounds incoming": "Incoming",
+    "pushoversounds intermission": "Intermission",
+    "pushoversounds magic": "Magic",
+    "pushoversounds mechanical": "Mechanical",
+    "pushoversounds pianobar": "Piano Bar",
+    "pushoversounds siren": "Siren",
+    "pushoversounds spacealarm": "Space Alarm",
+    "pushoversounds alien": "Alien Alarm (long)",
+    "pushoversounds climb": "Climb (long)",
+    "pushoversounds persistent": "Persistent (long)",
+    "pushoversounds echo": "Pushover Echo (long)",
+    "pushoversounds updown": "Up Down (long)",
+    "pushoversounds vibrate": "Vibrate Only",
+    "pushoversounds none": "None (silent)",
+    "pushyAPIKey": "Secret API Key",
+    "Guild ID": "Guild ID",
+    "Strategy": "策略",
+    "Free Mobile User Identifier": "Free Mobile User Identifier",
+    "Free Mobile API Key": "Free Mobile API Key",
+    "Enable TLS": "使用 TLS",
+    "Proto Service Name": "Proto 服務名稱",
+    "Proto Method": "Proto 方式",
+    "onebotGroupMessage": "群組",
+    "onebotMessageType": "OneBot 訊息類型",
+    "ntfy Topic": "ntfy Topic",
+    "Legacy Octopush-DM": "舊版 Octopush-DM",
+    "Octopush API Version": "Octopush API 版本",
+    "From Name/Number": "發送人名稱/號碼",
+    "Recipient Number": "收件人號碼",
+    "smseaglePriority": "訊息優先度 (0-9,預設 = 0)",
+    "smseagleEncoding": "以 Unicode 傳送",
+    "smseagleUrl": "您的 SMSEagle 裝置 URL",
+    "smseagleToken": "API 存取 Token",
+    "smseagleRecipient": "收件者 (以逗號分隔)",
+    "smseagleRecipientType": "收件者類型",
+    "smseagleContact": "聯絡人名稱",
+    "smseagleGroup": "群組名稱",
+    "smseagleTo": "電話號碼",
+    "smseagle": "SMSEagle",
+    "auto resolve": "自動解決",
+    "do nothing": "不進行任何操作",
+    "Auto resolve or acknowledged": "自動解決或標記已讀",
+    "Integration URL": "Integration URL",
+    "Integration Key": "Integration Key",
+    "wayToGetClickSendSMSToken": "您可以到 {0} 取得 API 使用者名稱和 API Key。",
+    "PushDeer Key": "PushDeer Key",
+    "onebotSafetyTips": "為了安全起見,必須設置存取 Token",
+    "onebotUserOrGroupId": "群組/使用者 ID",
+    "onebotPrivateMessage": "私人"
+}
diff --git a/src/lang/zh-TW.json b/src/lang/zh-TW.json
new file mode 100644
index 000000000..3e2082159
--- /dev/null
+++ b/src/lang/zh-TW.json
@@ -0,0 +1,678 @@
+{
+    "languageName": "繁體中文 (台灣)",
+    "checkEverySecond": "每 {0} 秒檢查一次",
+    "retryCheckEverySecond": "每 {0} 秒重試一次",
+    "resendEveryXTimes": "每 {0} 次便重新傳送",
+    "resendDisabled": "重新傳送已停用",
+    "retriesDescription": "在服務被標記為離線並傳送通知前的最大重試次數",
+    "ignoreTLSError": "忽略 HTTPS 網站的 TLS/SSL 錯誤",
+    "upsideDownModeDescription": "反轉顯示狀態。若服務可以連線,將顯示離線。",
+    "maxRedirectDescription": "最大重新導向跟隨次數。設為 0 將停用重新導向。",
+    "enableGRPCTls": "允許以 TLS 連線傳送 gRPC 要求",
+    "grpcMethodDescription": "方法名稱將轉換至駝峰式命名,如 sayHello、check 等。",
+    "acceptedStatusCodesDescription": "選擇視為成功回應的狀態碼。",
+    "Maintenance": "維護",
+    "statusMaintenance": "維護",
+    "Schedule maintenance": "排程維護",
+    "Affected Monitors": "受影響的監測器",
+    "Pick Affected Monitors...": "挑選受影響的監測器…",
+    "Start of maintenance": "維護起始",
+    "All Status Pages": "所有狀態頁",
+    "Select status pages...": "選擇狀態頁…",
+    "recurringIntervalMessage": "每日執行 | 每 {0} 天執行",
+    "affectedMonitorsDescription": "選擇受目前維護影響的監測器",
+    "affectedStatusPages": "在已選取的狀態頁中顯示此維護訊息",
+    "atLeastOneMonitor": "至少選擇一個受影響的監測器",
+    "passwordNotMatchMsg": "密碼不相符。",
+    "notificationDescription": "必須將通知指派給監測器才能運作。",
+    "keywordDescription": "HTML 或 JSON 回應的搜尋關鍵字。區分大小寫。",
+    "pauseDashboardHome": "暫停",
+    "deleteMonitorMsg": "您確定要刪除此監測器嗎?",
+    "deleteMaintenanceMsg": "您確定要刪除此維護嗎?",
+    "deleteNotificationMsg": "您確定要為所有監測器刪除此通知嗎?",
+    "dnsPortDescription": "DNS 伺服器連接埠。預設為 53。您可以隨時變更連接埠。",
+    "resolverserverDescription": "Cloudflare 為預設伺服器。您可以隨時更換解析伺服器。",
+    "rrtypeDescription": "選擇您想要監測的資源記錄類型",
+    "pauseMonitorMsg": "您確定要暫停嗎?",
+    "enableDefaultNotificationDescription": "預設情況下,新監測器將啟用此通知。您仍可分別停用各監測器的通知。",
+    "clearEventsMsg": "您確定要刪除此監測器的所有事件嗎?",
+    "clearHeartbeatsMsg": "您確定要刪除此監測器的所有心跳嗎?",
+    "confirmClearStatisticsMsg": "您確定要刪除所有統計資料嗎?",
+    "importHandleDescription": "若您想跳過所有相同名稱的監測器或通知,請選擇 '略過現有'。選擇 '覆寫' 將刪除所有現有的監測器及通知。",
+    "confirmImportMsg": "您確定要匯入備份嗎?請確認是否選擇正確的匯入設定。",
+    "twoFAVerifyLabel": "請輸入權杖以驗證雙步驟驗證:",
+    "tokenValidSettingsMsg": "權杖有效!您可以儲存雙步驟驗證設定了。",
+    "confirmEnableTwoFAMsg": "您確定要啟用雙步驟驗證嗎?",
+    "confirmDisableTwoFAMsg": "您確定要停用雙步驟驗證嗎?",
+    "Settings": "設定",
+    "Dashboard": "儀表板",
+    "New Update": "新版本",
+    "Language": "語言",
+    "Appearance": "外觀",
+    "Theme": "主題",
+    "General": "一般",
+    "Primary Base URL": "主要基底網址",
+    "Version": "版本",
+    "Check Update On GitHub": "在 GitHub 檢查更新",
+    "List": "清單",
+    "Add": "新增",
+    "Add New Monitor": "新增監測器",
+    "Quick Stats": "狀態概覽",
+    "Up": "正常",
+    "Down": "離線",
+    "Pending": "等待中",
+    "Unknown": "未知",
+    "Pause": "暫停",
+    "Name": "名稱",
+    "Status": "狀態",
+    "DateTime": "日期時間",
+    "Message": "訊息",
+    "No important events": "無重要事件",
+    "Resume": "繼續",
+    "Edit": "編輯",
+    "Delete": "刪除",
+    "Current": "目前",
+    "Uptime": "運作率",
+    "Cert Exp.": "憑證期限",
+    "day": "天",
+    "-day": "天",
+    "hour": "小時",
+    "-hour": "小時",
+    "Response": "回應",
+    "Ping": "Ping",
+    "Monitor Type": "監測器類型",
+    "Keyword": "關鍵字",
+    "Friendly Name": "易記名稱",
+    "URL": "網址",
+    "Hostname": "主機名稱",
+    "Port": "連接埠",
+    "Heartbeat Interval": "心跳間隔",
+    "Retries": "重試次數",
+    "Heartbeat Retry Interval": "心跳重試間隔",
+    "Resend Notification if Down X times consecutively": "若 X 次心跳皆離線,重新傳送通知",
+    "Advanced": "進階",
+    "Upside Down Mode": "顛倒模式",
+    "Max. Redirects": "最大重新導向次數",
+    "Accepted Status Codes": "可接受的狀態碼",
+    "Push URL": "推送網址",
+    "needPushEvery": "您應每 {0} 秒呼叫此網址。",
+    "pushOptionalParams": "選填參數:{0}",
+    "Save": "儲存",
+    "Notifications": "通知",
+    "Not available, please setup.": "無法使用,請先設定。",
+    "Setup Notification": "設定通知",
+    "Light": "亮色",
+    "Dark": "深色",
+    "Auto": "自動",
+    "Theme - Heartbeat Bar": "主題 - 心跳條",
+    "Normal": "正常",
+    "Bottom": "下方",
+    "None": "無",
+    "Timezone": "時區",
+    "Search Engine Visibility": "搜尋引擎可見度",
+    "Allow indexing": "允許索引",
+    "Discourage search engines from indexing site": "不建議搜尋引擎索引網頁",
+    "Change Password": "修改密碼",
+    "Current Password": "目前密碼",
+    "New Password": "新密碼",
+    "Repeat New Password": "確認新密碼",
+    "Update Password": "更新密碼",
+    "Disable Auth": "停用驗證",
+    "Enable Auth": "啟用驗證",
+    "disableauth.message1": ">你是否要<strong>取消登入驗證</strong>?",
+    "disableauth.message2": "此功能是設計給已有<strong>第三方認證</strong>的使用者,例如 Cloudflare Access。",
+    "Please use this option carefully!": "請謹慎使用。",
+    "Logout": "登出",
+    "Leave": "離開",
+    "I understand, please disable": "我了解了,請停用",
+    "Confirm": "確認",
+    "Yes": "是",
+    "No": "否",
+    "Username": "使用者名稱",
+    "Password": "密碼",
+    "Remember me": "記住我",
+    "Login": "登入",
+    "No Monitors, please": "沒有監測器,請",
+    "add one": "新增",
+    "Notification Type": "通知類型",
+    "Email": "電子郵件",
+    "Test": "測試",
+    "Certificate Info": "憑證資訊",
+    "Resolver Server": "解析伺服器",
+    "Resource Record Type": "資源記錄類型",
+    "Last Result": "最後結果",
+    "Create your admin account": "建立您的管理員帳號",
+    "Repeat Password": "確認密碼",
+    "Import Backup": "匯入備份",
+    "Export Backup": "匯出備份",
+    "Export": "匯出",
+    "Import": "匯入",
+    "respTime": "回應時間 (毫秒)",
+    "notAvailableShort": "N/A",
+    "Default enabled": "啟用預設",
+    "Apply on all existing monitors": "套用到目前所有的監測器",
+    "Create": "建立",
+    "Clear Data": "清除資料",
+    "Events": "活動",
+    "Heartbeats": "心跳",
+    "Auto Get": "自動取得",
+    "backupDescription": "您可以將所有監測器及通知備份成一個 JSON 檔案。",
+    "backupDescription2": "提醒:不包含歷史紀錄及活動紀錄。",
+    "backupDescription3": "如通知權杖等機密資料也會一同匯出。請妥善保存。",
+    "alertNoFile": "請選擇要匯入的檔案。",
+    "alertWrongFileType": "請選擇 JSON 檔案。",
+    "Clear all statistics": "清除所有統計資料",
+    "Skip existing": "略過現有",
+    "Overwrite": "覆寫",
+    "Options": "選項",
+    "Keep both": "保留兩者",
+    "Verify Token": "認證權杖",
+    "Setup 2FA": "設置雙步驟驗證",
+    "Enable 2FA": "啟用雙步驟驗證",
+    "Disable 2FA": "停用雙步驟驗證",
+    "2FA Settings": "雙步驟驗證設定",
+    "Two Factor Authentication": "雙步驟驗證",
+    "Active": "啟用",
+    "Inactive": "停用",
+    "Token": "權杖",
+    "Show URI": "顯示 URI",
+    "Tags": "標籤",
+    "Add New below or Select...": "在下方新增或選取…",
+    "Tag with this name already exist.": "已存在相同名稱的標籤。",
+    "Tag with this value already exist.": "已存在相同數值的標籤。",
+    "color": "顏色",
+    "value (optional)": "數值 (選填)",
+    "Gray": "灰色",
+    "Red": "紅色",
+    "Orange": "橘色",
+    "Green": "綠色",
+    "Blue": "藍色",
+    "Indigo": "靛色",
+    "Purple": "紫色",
+    "Pink": "粉色",
+    "Search...": "搜尋…",
+    "Avg. Ping": "平均 Ping",
+    "Avg. Response": "平均回應",
+    "Entry Page": "入口頁面",
+    "statusPageNothing": "空空如也,請新增群組或監測器。",
+    "No Services": "無服務",
+    "All Systems Operational": "所有系統正常運作",
+    "Partially Degraded Service": "部分服務效能降低",
+    "Degraded Service": "服務效能降低",
+    "Add Group": "新增群組",
+    "Add a monitor": "加入監測器",
+    "Edit Status Page": "編輯狀態頁",
+    "Go to Dashboard": "前往儀表板",
+    "Status Page": "狀態頁",
+    "Status Pages": "狀態頁",
+    "defaultNotificationName": "我的 {notification} 通知 ({number})",
+    "here": "此處",
+    "Required": "必填",
+    "telegram": "Telegram",
+    "Bot Token": "機器人權杖",
+    "wayToGetTelegramToken": "您可以從 {0} 取得權杖。",
+    "Chat ID": "聊天 ID",
+    "supportTelegramChatID": "支援 對話/群組/頻道的聊天 ID",
+    "wayToGetTelegramChatID": "傳送訊息給機器人,並前往以下網址以取得您的 chat ID:",
+    "YOUR BOT TOKEN HERE": "在此填入您的機器人權杖",
+    "chatIDNotFound": "找不到 Chat ID;請先傳送訊息給機器人",
+    "webhook": "Webhook",
+    "Post URL": "Post 網址",
+    "Content Type": "內容類型",
+    "webhookJsonDesc": "{0} 適合任何現代的 HTTP 伺服器,如 Express.js",
+    "webhookFormDataDesc": "{multipart} 適合 PHP。 JSON 必須先經由 {decodeFunction} 剖析。",
+    "webhookAdditionalHeadersTitle": "額外標頭",
+    "webhookAdditionalHeadersDesc": "設定與 webhook 一同傳送的額外標頭。",
+    "smtp": "Email (SMTP)",
+    "secureOptionNone": "無 / STARTTLS (25, 587)",
+    "secureOptionTLS": "TLS (465)",
+    "Ignore TLS Error": "忽略 TLS 錯誤",
+    "From Email": "寄件人",
+    "emailCustomSubject": "自訂主旨",
+    "To Email": "收件者",
+    "smtpCC": "CC",
+    "smtpBCC": "BCC",
+    "discord": "Discord",
+    "Discord Webhook URL": "Discord Webhook 網址",
+    "wayToGetDiscordURL": "您可以前往伺服器設定 -> 整合 -> Webhook -> 新 Webhook 以取得",
+    "Bot Display Name": "機器人顯示名稱",
+    "Prefix Custom Message": "前綴自訂訊息",
+    "Hello @everyone is...": "Hello {'@'}everyone is…",
+    "teams": "Microsoft Teams",
+    "Webhook URL": "Webhook 網址",
+    "wayToGetTeamsURL": "您可以前往此頁面以了解如何建立 Webhook 網址 {0}。",
+    "signal": "Signal",
+    "Number": "號碼",
+    "Recipients": "收件者",
+    "needSignalAPI": "您需要有 REST API 的 Signal 客戶端。",
+    "wayToCheckSignalURL": "您可以前往下列網址以了解如何設定:",
+    "signalImportant": "注意: 不得混合收件者的群組和號碼!",
+    "gotify": "Gotify",
+    "Application Token": "應用程式權杖",
+    "Server URL": "伺服器網址",
+    "Priority": "優先度",
+    "slack": "Slack",
+    "Icon Emoji": "Emoji 圖示",
+    "Channel Name": "頻道名稱",
+    "Uptime Kuma URL": "Uptime Kuma 網址",
+    "aboutWebhooks": "更多關於 Webhook 的資訊: {0}",
+    "aboutChannelName": "如果您不想使用 Webhook 頻道,請在 {0} 頻道名稱欄位填入您想使用的頻道。例如: #其他頻道",
+    "aboutKumaURL": "如果您未填入 Uptime Kuma 網址。將預設使用專案 Github 頁面。",
+    "emojiCheatSheet": "Emoji 一覽表: {0}",
+    "rocket.chat": "Rocket.Chat",
+    "pushover": "Pushover",
+    "pushy": "Pushy",
+    "PushByTechulus": "Push by Techulus",
+    "octopush": "Octopush",
+    "promosms": "PromoSMS",
+    "clicksendsms": "ClickSend SMS",
+    "lunasea": "LunaSea",
+    "apprise": "Apprise (支援 50 種以上的通知服務)",
+    "GoogleChat": "Google Chat (僅限 Google Workspace)",
+    "pushbullet": "Pushbullet",
+    "line": "Line Messenger",
+    "mattermost": "Mattermost",
+    "User Key": "使用者金鑰",
+    "Device": "裝置",
+    "Message Title": "訊息標題",
+    "Notification Sound": "通知音效",
+    "More info on:": "更多資訊: {0}",
+    "pushoverDesc1": "緊急優先度 (2) 的重試間隔為 30 秒並且會在 1 小時後過期。",
+    "pushoverDesc2": "如果您想要傳送通知到不同裝置,請填寫裝置欄位。",
+    "SMS Type": "簡訊類型",
+    "octopushTypePremium": "Premium (快速 - 建議用於警報)",
+    "octopushTypeLowCost": "Low Cost (緩慢 - 有時會被營運商阻擋)",
+    "checkPrice": "查看 {0} 價格:",
+    "apiCredentials": "API 認證",
+    "octopushLegacyHint": "您使用的是舊版的 Octopush (2011-2020) 還是新版?",
+    "Check octopush prices": "查看 octopush 價格 {0}。",
+    "octopushPhoneNumber": "電話號碼 (intl 格式,例如:+33612345678) ",
+    "octopushSMSSender": "簡訊寄件人名稱:3-11位英數字元及空白 (a-zA-Z0-9)",
+    "LunaSea Device ID": "LunaSea 裝置 ID",
+    "Apprise URL": "Apprise 網址",
+    "Example:": "範例:{0}",
+    "Read more:": "深入瞭解:{0}",
+    "Status:": "狀態:{0}",
+    "Read more": "深入瞭解",
+    "appriseInstalled": "已安裝 Apprise。",
+    "appriseNotInstalled": "尚未安裝 Apprise。{0}",
+    "Access Token": "存取權杖",
+    "Channel access token": "頻道存取權杖",
+    "Line Developers Console": "Line 開發者控制台",
+    "lineDevConsoleTo": "Line 開發者控制台 - {0}",
+    "Basic Settings": "基本設定",
+    "User ID": "使用者 ID",
+    "Messaging API": "Messaging API",
+    "wayToGetLineChannelToken": "首先,前往 {0},建立 provider 和 channel (Messaging API)。接著您就可以從上面提到的選單項目中取得頻道存取權杖及使用者 ID。",
+    "Icon URL": "圖示網址",
+    "aboutIconURL": "您可以在 \"圖示網址\" 中提供圖片網址以覆蓋預設個人檔案圖片。若已設定 Emoji 圖示,將忽略此設定。",
+    "aboutMattermostChannelName": "您可以在 \"頻道名稱\" 欄位中填寫頻道名稱以覆蓋 Webhook 的預設頻道。必須在 Mattermost 的 Webhook 設定中啟用。例如:#其他頻道",
+    "matrix": "Matrix",
+    "promosmsTypeEco": "SMS ECO - 便宜,但是很慢且經常過載。僅限位於波蘭的收件者。",
+    "promosmsTypeFlash": "SMS FLASH - 訊息會自動在收件者的裝置上顯示。僅限位於波蘭的收件者。",
+    "promosmsTypeFull": "SMS FULL - 高級版,您可以使用您的寄件人名稱 (必須先註冊名稱。對於警報來說十分可靠。",
+    "promosmsTypeSpeed": "SMS SPEED - 系統中的最高優先度。快速、可靠,但昂貴 (約 SMS FULL 的兩倍價格)。",
+    "promosmsPhoneNumber": "電話號碼 (若收件者位於波蘭則無需輸入區域代碼)",
+    "promosmsSMSSender": "簡訊寄件人名稱:預先註冊的名稱或以下的預設名稱:InfoSMS、SMS Info、MaxSMS、INFO、SMS",
+    "Feishu WebHookUrl": "飛書 WebHook 網址",
+    "matrixHomeserverURL": "Homeserver 網址 (開頭為 http(s)://,結尾可能帶連接埠)",
+    "Internal Room Id": "Internal Room ID",
+    "matrixDesc1": "您可以在 Matrix 客戶端的房間設定中的進階選項找到 internal room ID。應該看起來像 !QMdRCpUIfLwsfjxye6:home.server。",
+    "matrixDesc2": "使用您自己的 Matrix 使用者存取權杖將賦予存取您的帳號和您加入的房間的完整權限。建議建立新使用者,並邀請至您想要接收通知的房間中。您可以執行 {0} 以取得存取權杖",
+    "Method": "方法",
+    "Body": "主體",
+    "Headers": "標頭",
+    "PushUrl": "Push 網址",
+    "HeadersInvalidFormat": "要求標頭不是有效的 JSON:",
+    "BodyInvalidFormat": "要求主體不是有效的 JSON:",
+    "Monitor History": "監測器歷史紀錄",
+    "clearDataOlderThan": "保留 {0} 天內的監測器歷史紀錄。",
+    "PasswordsDoNotMatch": "密碼不相符。",
+    "records": "記錄",
+    "One record": "一項記錄",
+    "steamApiKeyDescription": "若要監測 Steam 遊戲伺服器,您將需要 Steam Web-API 金鑰。您可以在此註冊您的 API 金鑰:",
+    "Current User": "目前使用者",
+    "topic": "Topic",
+    "topicExplanation": "要監測的 MQTT Topic",
+    "successMessage": "成功訊息",
+    "successMessageExplanation": "視為成功的 MQTT 訊息",
+    "recent": "最近",
+    "Done": "完成",
+    "Info": "資訊",
+    "Security": "安全性",
+    "Steam API Key": "Steam API 金鑰",
+    "Shrink Database": "壓縮資料庫",
+    "Pick a RR-Type...": "選擇資源記錄類型…",
+    "Pick Accepted Status Codes...": "選擇可接受的狀態碼…",
+    "Default": "預設",
+    "HTTP Options": "HTTP 選項",
+    "Create Incident": "建立事件",
+    "Title": "標題",
+    "Content": "內容",
+    "Style": "樣式",
+    "info": "資訊",
+    "warning": "警告",
+    "danger": "危險",
+    "error": "錯誤",
+    "critical": "嚴重",
+    "primary": "主要",
+    "light": "淺色",
+    "dark": "暗色",
+    "Post": "發佈",
+    "Please input title and content": "請輸入標題及內容",
+    "Created": "建立",
+    "Last Updated": "最後更新",
+    "Unpin": "取消釘選",
+    "Switch to Light Theme": "切換至淺色佈景主題",
+    "Switch to Dark Theme": "切換至深色佈景主題",
+    "Show Tags": "顯示標籤",
+    "Hide Tags": "隱藏標籤",
+    "Description": "說明",
+    "No monitors available.": "沒有可用的監測器。",
+    "Add one": "新增一個",
+    "No Monitors": "無監測器",
+    "Untitled Group": "未命名群組",
+    "Services": "服務",
+    "Discard": "捨棄",
+    "Cancel": "取消",
+    "Powered by": "技術支援",
+    "shrinkDatabaseDescription": "觸發 SQLite 的資料庫清理 (VACUUM)。如果您的資料庫是在 1.10.0 版本後建立,AUTO_VACUUM 已自動啟用,則無需此操作。",
+    "serwersms": "SerwerSMS.pl",
+    "serwersmsAPIUser": "API 使用者名稱 (包括 webapi_ 前綴)",
+    "serwersmsAPIPassword": "API 密碼",
+    "serwersmsPhoneNumber": "電話號碼",
+    "serwersmsSenderName": "SMS 寄件人名稱 (由客戶入口網站註冊)",
+    "smseagle": "SMSEagle",
+    "smseagleTo": "電話號碼",
+    "smseagleGroup": "電話簿群組名稱",
+    "smseagleContact": "電話簿聯絡人名稱",
+    "smseagleRecipientType": "收件者類型",
+    "smseagleRecipient": "收件者 (用逗號分隔)",
+    "smseagleToken": "API 存取權杖",
+    "smseagleUrl": "您的 SMSEagle 裝置網址",
+    "smseagleEncoding": "以 Unicode 傳送",
+    "smseaglePriority": "訊息優先度 (0-9,預設 = 0)",
+    "stackfield": "Stackfield",
+    "Customize": "自訂",
+    "Custom Footer": "自訂頁尾",
+    "Custom CSS": "自訂 CSS",
+    "smtpDkimSettings": "DKIM 設定",
+    "smtpDkimDesc": "請參考 Nodemailer DKIM {0} 使用方式。",
+    "documentation": "文件",
+    "smtpDkimDomain": "網域名稱",
+    "smtpDkimKeySelector": "DKIM 選取器",
+    "smtpDkimPrivateKey": "私密金鑰",
+    "smtpDkimHashAlgo": "雜湊演算法 (選填)",
+    "smtpDkimheaderFieldNames": "要簽署的郵件標頭 (選填)",
+    "smtpDkimskipFields": "不簽署的郵件標頭 (選填)",
+    "wayToGetPagerDutyKey": "您可以前往服務 -> 服務目錄 -> (選取服務) -> 整合 -> 新增整合以取得。您可以搜尋 \"Events API V2\"。詳細資訊 {0}",
+    "Integration Key": "整合金鑰",
+    "Integration URL": "整合網址",
+    "Auto resolve or acknowledged": "自動解決或認可",
+    "do nothing": "不進行任何操作",
+    "auto acknowledged": "自動認可",
+    "auto resolve": "自動解決",
+    "gorush": "Gorush",
+    "alerta": "Alerta",
+    "alertaApiEndpoint": "API 端點",
+    "alertaEnvironment": "環境",
+    "alertaApiKey": "API 金鑰",
+    "alertaAlertState": "警示狀態",
+    "alertaRecoverState": "恢復狀態",
+    "deleteStatusPageMsg": "您確定要刪除此狀態頁嗎?",
+    "Proxies": "代理伺服器",
+    "default": "預設",
+    "enabled": "啟用",
+    "setAsDefault": "設為預設",
+    "deleteProxyMsg": "您確定要為所有監測器刪除此代理伺服器嗎?",
+    "proxyDescription": "必須將代理伺服器指派給監測器才能運作。",
+    "enableProxyDescription": "此代理伺服器在啟用前不會在監測器上生效,您可以藉由控制啟用狀態來暫時對所有的監測器停用代理伺服器。",
+    "setAsDefaultProxyDescription": "預設情況下,新監測器將啟用此代理伺服器。您仍可分別停用各監測器的代理伺服器。",
+    "Certificate Chain": "憑證鏈結",
+    "Valid": "有效",
+    "Invalid": "無效",
+    "AccessKeyId": "AccessKey ID",
+    "SecretAccessKey": "AccessKey 密碼",
+    "PhoneNumbers": "PhoneNumbers",
+    "TemplateCode": "TemplateCode",
+    "SignName": "SignName",
+    "Sms template must contain parameters: ": "Sms 範本必須包含參數:",
+    "Bark Endpoint": "Bark 端點",
+    "Bark Group": "Bark 群組",
+    "Bark Sound": "Bark 鈴聲",
+    "WebHookUrl": "WebHookUrl",
+    "SecretKey": "SecretKey",
+    "For safety, must use secret key": "為了安全起見,必須使用秘密金鑰",
+    "Device Token": "裝置權杖",
+    "Platform": "平台",
+    "iOS": "iOS",
+    "Android": "Android",
+    "Huawei": "華為",
+    "High": "高",
+    "Retry": "重試",
+    "Topic": "Topic",
+    "WeCom Bot Key": "WeCom 機器人金鑰",
+    "Setup Proxy": "設置 Proxy",
+    "Proxy Protocol": "Proxy 通訊協定",
+    "Proxy Server": "Proxy 伺服器",
+    "Proxy server has authentication": "Proxy 伺服器啟用了驗證功能",
+    "User": "使用者",
+    "Installed": "已安裝",
+    "Not installed": "未安裝",
+    "Running": "執行中",
+    "Not running": "未執行",
+    "Remove Token": "移除權杖",
+    "Start": "開始",
+    "Stop": "停止",
+    "Uptime Kuma": "Uptime Kuma",
+    "Add New Status Page": "新增狀態頁",
+    "Slug": "Slug",
+    "Accept characters:": "可用字元:",
+    "startOrEndWithOnly": "僅能使用 {0} 開頭或結尾",
+    "No consecutive dashes": "不得連續使用破折號",
+    "Next": "下一步",
+    "The slug is already taken. Please choose another slug.": "此 slug 已被使用。請選擇其他 slug。",
+    "No Proxy": "無 Proxy",
+    "Authentication": "驗證",
+    "HTTP Basic Auth": "HTTP 基本驗證",
+    "New Status Page": "新狀態頁",
+    "Page Not Found": "找不到頁面",
+    "Reverse Proxy": "反向代理",
+    "Backup": "備份",
+    "About": "關於",
+    "wayToGetCloudflaredURL": "(從 {0} 下載 cloudflared)",
+    "cloudflareWebsite": "Cloudflare 網站",
+    "Message:": "訊息:",
+    "Don't know how to get the token? Please read the guide:": "不知道如何取得權杖嗎?請閱讀指南:",
+    "The current connection may be lost if you are currently connecting via Cloudflare Tunnel. Are you sure want to stop it? Type your current password to confirm it.": "如果您目前正透過 Cloudflare Tunnel 連線,可能會導致連線中斷。您確定要停止嗎?請輸入密碼以確認。",
+    "HTTP Headers": "HTTP 標頭",
+    "Trust Proxy": "信任的 Proxy",
+    "Other Software": "其他軟體",
+    "For example: nginx, Apache and Traefik.": "例如 nginx、Apache 和 Traefik。",
+    "Please read": "請閱覽",
+    "Subject:": "簽發給:",
+    "Valid To:": "有效期限:",
+    "Days Remaining:": "剩餘天數:",
+    "Issuer:": "簽發者:",
+    "Fingerprint:": "指紋:",
+    "No status pages": "無狀態頁",
+    "Domain Name Expiry Notification": "網域名稱到期通知",
+    "Proxy": "Proxy",
+    "Date Created": "建立日期",
+    "HomeAssistant": "Home Assistant",
+    "onebotHttpAddress": "OneBot HTTP 位址",
+    "onebotMessageType": "OneBot 訊息類型",
+    "onebotGroupMessage": "群組",
+    "onebotPrivateMessage": "私人",
+    "onebotUserOrGroupId": "群組/使用者 ID",
+    "onebotSafetyTips": "為了安全起見,必須設置存取權杖",
+    "PushDeer Key": "PushDeer 金鑰",
+    "Footer Text": "頁尾文字",
+    "Show Powered By": "顯示技術支援文字",
+    "Domain Names": "網域名稱",
+    "signedInDisp": "以 {0} 身分登入",
+    "signedInDispDisabled": "驗證已停用。",
+    "RadiusSecret": "Radius Secret",
+    "RadiusSecretDescription": "客戶端與伺服器端的共享機密",
+    "RadiusCalledStationId": "被叫站 Id",
+    "RadiusCalledStationIdDescription": "被呼叫裝置的識別碼",
+    "RadiusCallingStationId": "呼叫站 Id",
+    "RadiusCallingStationIdDescription": "呼叫裝置的識別碼",
+    "Certificate Expiry Notification": "憑證到期通知",
+    "API Username": "API 使用者名稱",
+    "API Key": "API 金鑰",
+    "Recipient Number": "收件者號碼",
+    "From Name/Number": "來自名字/號碼",
+    "Leave blank to use a shared sender number.": "留空以使用共享寄件人號碼。",
+    "Octopush API Version": "Octopush API 版本",
+    "Legacy Octopush-DM": "舊版 Octopush-DM",
+    "endpoint": "端",
+    "octopushAPIKey": "在控制台的 HTTP API 憑證取得的 \"API 金鑰\"",
+    "octopushLogin": "在控制台的 HTTP API 憑證取得的 \"Login\"",
+    "promosmsLogin": "API 登入名稱",
+    "promosmsPassword": "API 密碼",
+    "pushoversounds pushover": "Pushover (預設)",
+    "pushoversounds bike": "車鈴",
+    "pushoversounds bugle": "號角",
+    "pushoversounds cashregister": "收銀機",
+    "pushoversounds classical": "古典",
+    "pushoversounds cosmic": "宇宙",
+    "pushoversounds falling": "下落",
+    "pushoversounds gamelan": "甘美朗",
+    "pushoversounds incoming": "來電",
+    "pushoversounds intermission": "中場休息",
+    "pushoversounds magic": "魔法",
+    "pushoversounds mechanical": "機械",
+    "pushoversounds pianobar": "鋼琴酒吧",
+    "pushoversounds siren": "警鈴",
+    "pushoversounds spacealarm": "太空鬧鐘",
+    "pushoversounds tugboat": "汽笛",
+    "pushoversounds alien": "外星鬧鐘 (長)",
+    "pushoversounds climb": "爬升 (長)",
+    "pushoversounds persistent": "持續 (長)",
+    "pushoversounds echo": "Pushover 回音 (長)",
+    "pushoversounds updown": "上下 (長)",
+    "pushoversounds vibrate": "僅震動",
+    "pushoversounds none": "無 (靜音)",
+    "pushyAPIKey": "API 密鑰",
+    "pushyToken": "裝置權杖",
+    "Show update if available": "顯示可用更新",
+    "Also check beta release": "檢查 Beta 版",
+    "Using a Reverse Proxy?": "正在使用反向代理?",
+    "Check how to config it for WebSocket": "查看如何為 WebSocket 設定",
+    "Steam Game Server": "Steam 遊戲伺服器",
+    "Most likely causes:": "可能原因:",
+    "The resource is no longer available.": "資源已不可用。",
+    "There might be a typing error in the address.": "網址可能有誤。",
+    "What you can try:": "您可以嘗試:",
+    "Retype the address.": "重新輸入網址。",
+    "Go back to the previous page.": "返回上一頁。",
+    "Coming Soon": "即將推出",
+    "wayToGetClickSendSMSToken": "您可以從 {0} 取得 API 使用者名稱和金鑰。",
+    "Connection String": "連線字串",
+    "Query": "查詢",
+    "settingsCertificateExpiry": "TLS 憑證到期",
+    "certificationExpiryDescription": "TLS 將於 X 天後到期時觸發 HTTPS 監測器通知:",
+    "Setup Docker Host": "設定 Docker 主機",
+    "Connection Type": "連線類型",
+    "Docker Daemon": "Docker 精靈",
+    "deleteDockerHostMsg": "您確定要為所有監測器刪除此 Docker 主機嗎?",
+    "socket": "通訊端",
+    "tcp": "TCP / HTTP",
+    "Docker Container": "Docker 容器",
+    "Container Name / ID": "容器名稱 / ID",
+    "Docker Host": "Docker 主機",
+    "Docker Hosts": "Docker 主機",
+    "ntfy Topic": "ntfy 主題",
+    "Domain": "網域",
+    "Workstation": "工作站",
+    "disableCloudflaredNoAuthMsg": "您處於無驗證模式。無須輸入密碼。",
+    "trustProxyDescription": "信任 'X-Forwarded-*' 標頭。如果您想要取得正確的客戶端 IP,且您的 Uptime Kuma 架設於 Nginx 或 Apache 後方,您應啟用此選項。",
+    "wayToGetLineNotifyToken": "您可以從 {0} 取得存取權杖",
+    "Examples": "範例",
+    "Home Assistant URL": "Home Assistant 網址",
+    "Long-Lived Access Token": "長期有效存取權杖",
+    "Long-Lived Access Token can be created by clicking on your profile name (bottom left) and scrolling to the bottom then click Create Token. ": "若要建立長期有效存取權杖,請點擊您的個人檔案名稱 (左下角),捲動至最下方,然後點擊建立權杖。",
+    "Notification Service": "通知服務",
+    "default: notify all devices": "預設:通知所有服務",
+    "A list of Notification Services can be found in Home Assistant under \"Developer Tools > Services\" search for \"notification\" to find your device/phone name.": "您可以在 Home Assistant 中查看通知服務的列表,在\"開發者工具 > 服務\"下搜尋\"通知\"來找到您的裝置/手機的名稱。",
+    "Automations can optionally be triggered in Home Assistant:": "可以選擇在 Home Assistant 中觸發自動化程序:",
+    "Trigger type:": "觸發器類型:",
+    "Event type:": "事件類型:",
+    "Event data:": "事件資料:",
+    "Then choose an action, for example switch the scene to where an RGB light is red.": "然後選擇動作,例如切換至 RGB 燈為紅色的場景。",
+    "Frontend Version": "前端版本",
+    "Frontend Version do not match backend version!": "前端版本與後端版本不符!",
+    "Base URL": "基底網址",
+    "goAlertInfo": "GoAlert 是用於待命排程、升級自動化,以及通知 (如簡訊或語音通話) 的開源應用程式。自動在正確的時間、用洽當的方法、聯絡合適的人! {0}",
+    "goAlertIntegrationKeyInfo": "取得服務的通用 API 整合金鑰,格式為 \"aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee\"。通常是已複製的網址的權杖參數值。",
+    "goAlert": "GoAlert",
+    "backupOutdatedWarning": "過時:由於新功能的增加,且未妥善維護,故此備份功能無法產生或復原完整備份。",
+    "backupRecommend": "請直接備份磁碟區或 ./data/ 資料夾。",
+    "Optional": "選填",
+    "squadcast": "Squadcast",
+    "SendKey": "SendKey",
+    "SMSManager API Docs": "SMSManager API 文件 ",
+    "Gateway Type": "閘道類型",
+    "SMSManager": "SMSManager",
+    "You can divide numbers with": "若要除數,您可以使用",
+    "or": "或是",
+    "recurringInterval": "間隔",
+    "Recurring": "週期性",
+    "strategyManual": "手動切換使用中/非使用中",
+    "warningTimezone": "正在使用伺服器的時區",
+    "weekdayShortMon": "一",
+    "weekdayShortTue": "二",
+    "weekdayShortWed": "三",
+    "weekdayShortThu": "四",
+    "weekdayShortFri": "五",
+    "weekdayShortSat": "六",
+    "weekdayShortSun": "日",
+    "dayOfWeek": "每周特定一天",
+    "dayOfMonth": "每月特定一天",
+    "lastDay": "最後一天",
+    "lastDay1": "每月的最後一天",
+    "lastDay2": "每月的倒數第二天",
+    "lastDay3": "每月的倒數第三天",
+    "lastDay4": "每月的倒數第四天",
+    "No Maintenance": "無維護",
+    "pauseMaintenanceMsg": "您確定要暫停嗎?",
+    "maintenanceStatus-under-maintenance": "維護中",
+    "maintenanceStatus-inactive": "非使用中",
+    "maintenanceStatus-scheduled": "已排程",
+    "maintenanceStatus-ended": "已結束",
+    "maintenanceStatus-unknown": "未知",
+    "Display Timezone": "顯示時區",
+    "Server Timezone": "伺服器時區",
+    "statusPageMaintenanceEndDate": "結束",
+    "IconUrl": "圖示網址",
+    "Enable DNS Cache": "啟用 DNS 快取",
+    "Enable": "啟用",
+    "Disable": "停用",
+    "dnsCacheDescription": "在某些 IPv6 環境可能會無法運作,如果您遇到任何問題,請停用。",
+    "Single Maintenance Window": "單一維護時段",
+    "Maintenance Time Window of a Day": "每日的維護時段",
+    "Effective Date Range": "有效的日期範圍",
+    "Schedule Maintenance": "排程維護",
+    "Date and Time": "時間和日期",
+    "DateTime Range": "DateTime 範圍",
+    "Strategy": "策略",
+    "Free Mobile User Identifier": "Free Mobile User Identifier",
+    "Free Mobile API Key": "Free Mobile API 金鑰",
+    "Enable TLS": "啟用 TLS",
+    "Proto Service Name": "Proto 服務名稱",
+    "Proto Method": "Proto 方式",
+    "Proto Content": "Proto 內容",
+    "Economy": "節約",
+    "Lowcost": "低費率",
+    "high": "高",
+    "General Monitor Type": "一般監測器類型",
+    "Passive Monitor Type": "被動監測器類型",
+    "Specific Monitor Type": "指定監測器類型",
+    "plugin": "插件 | 插件",
+    "install": "安裝",
+    "Game": "遊戲",
+    "Help": "幫助",
+    "Monitor": "監測器 | 監測器",
+    "Custom": "自訂"
+}
diff --git a/src/languages/README.md b/src/languages/README.md
deleted file mode 100644
index c217ea0f4..000000000
--- a/src/languages/README.md
+++ /dev/null
@@ -1,14 +0,0 @@
-# How to translate
-
-1. Fork this repo.
-2. Run `npm install`
-3. Run `npm run update-language-files --language=<code>` where `<code>`
-   is a valid ISO language code:
-   http://www.lingoes.net/en/translator/langcode.htm. You can also use
-   this command to check if there are new strings to
-   translate for your language.
-4. Your language file should be filled in. You can translate now.
-5. Add it into `languageList` constant.
-6. Make a [pull request](https://github.com/louislam/uptime-kuma/pulls) when you have done.
-
-If you do not have programming skills, let me know in [the issues section](https://github.com/louislam/uptime-kuma/issues). I will assist you. 😏
diff --git a/src/languages/bg-BG.js b/src/languages/bg-BG.js
deleted file mode 100644
index dfd11c67e..000000000
--- a/src/languages/bg-BG.js
+++ /dev/null
@@ -1,672 +0,0 @@
-export default {
-    languageName: "Български",
-    checkEverySecond: "Ще се извършва на всеки {0} секунди",
-    retryCheckEverySecond: "Ще се извършва на всеки {0} секунди",
-    retriesDescription: "Максимален брой опити преди маркиране на услугата като недостъпна и изпращане на известие",
-    ignoreTLSError: "Игнорирай TLS/SSL грешки за HTTPS уеб сайтове",
-    upsideDownModeDescription: "Обръща статуса от достъпен на недостъпен. Ако услугата е достъпна, ще се вижда като НЕДОСТЪПНА.",
-    maxRedirectDescription: "Максимален брой пренасочвания, които да бъдат следвани. Въведете 0 за да изключите пренасочване.",
-    acceptedStatusCodesDescription: "Изберете статус кодове, които да се считат за успешен отговор.",
-    passwordNotMatchMsg: "Повторената парола не съвпада.",
-    notificationDescription: "Моля, задайте известието към монитор(и), за да функционира.",
-    keywordDescription: "Търси ключова дума в чист html или JSON отговор - чувствителна е към регистъра",
-    pauseDashboardHome: "Пауза",
-    deleteMonitorMsg: "Наистина ли желаете да изтриете този монитор?",
-    deleteNotificationMsg: "Наистина ли желаете да изтриете това известие за всички монитори?",
-    resolverserverDescription: "Cloudflare е сървърът по подразбиране, но можете да го промените по всяко време.",
-    rrtypeDescription: "Изберете ресурсния запис, който желаете да наблюдавате",
-    pauseMonitorMsg: "Наистина ли желаете да поставите в режим пауза?",
-    enableDefaultNotificationDescription: "За всеки нов монитор това известие ще бъде активирано по подразбиране. Можете да го изключите за всеки отделен монитор.",
-    clearEventsMsg: "Наистина ли желаете да изтриете всички събития за този монитор?",
-    clearHeartbeatsMsg: "Наистина ли желаете да изтриете всички записи за честотни проверки на този монитор?",
-    confirmClearStatisticsMsg: "Наистина ли желаете да изтриете всички статистически данни?",
-    importHandleDescription: "Изберете 'Пропусни съществуващите', ако желаете да пропуснете всеки монитор или известие със същото име. 'Презапис' ще изтрие всеки съществуващ монитор и известие.",
-    confirmImportMsg: "Сигурни ли сте, че желаете импортирането на архива? Моля, уверете се, че сте избрали правилната опция за импортиране.",
-    twoFAVerifyLabel: "Моля, въведете вашия токен код, за да проверите дали 2FA работи",
-    tokenValidSettingsMsg: "Токен кодът е валиден! Вече можете да запазите настройките за 2FA.",
-    confirmEnableTwoFAMsg: "Сигурни ли сте, че желаете да активирате 2FA?",
-    confirmDisableTwoFAMsg: "Сигурни ли сте, че желаете да изключите 2FA?",
-    Settings: "Настройки",
-    Dashboard: "Табло",
-    "New Update": "Налична е актуализация",
-    Language: "Език",
-    Appearance: "Изглед",
-    Theme: "Тема",
-    General: "Общи",
-    Version: "Версия",
-    "Check Update On GitHub": "Проверка за актуализация в GitHub",
-    List: "Списък",
-    Add: "Добави",
-    "Add New Monitor": "Добави монитор",
-    "Quick Stats": "Кратка статистика",
-    Up: "Достъпен",
-    Down: "Недостъпен",
-    Pending: "Изчаква",
-    Unknown: "Неизвестен",
-    Pause: "Пауза",
-    Name: "Име",
-    Status: "Статус",
-    DateTime: "Дата и час",
-    Message: "Отговор",
-    "No important events": "Все още няма събития",
-    Resume: "Възобнови",
-    Edit: "Редактирай",
-    Delete: "Изтрий",
-    Current: "Текущ",
-    Uptime: "Достъпност",
-    "Cert Exp.": "Вал. сертификат",
-    day: "ден | дни",
-    "-day": "-дни",
-    hour: "час",
-    "-hour": "-часa",
-    Response: "Отговор",
-    Ping: "Пинг",
-    "Monitor Type": "Монитор тип",
-    Keyword: "Ключова дума",
-    "Friendly Name": "Псевдоним",
-    URL: "URL Адрес",
-    Hostname: "Име на хост",
-    Port: "Порт",
-    "Heartbeat Interval": "Честота на проверка",
-    Retries: "Повторни опити",
-    "Heartbeat Retry Interval": "Честота на повторните опити",
-    Advanced: "Разширени",
-    "Upside Down Mode": "Обърнат режим",
-    "Max. Redirects": "Макс. брой пренасочвания",
-    "Accepted Status Codes": "Допустими статус кодове",
-    Save: "Запази",
-    Notifications: "Известия",
-    "Not available, please setup.": "Не са налични. Моля, настройте.",
-    "Setup Notification": "Настрой известие",
-    Light: "Светла",
-    Dark: "Тъмна",
-    Auto: "Автоматично",
-    "Theme - Heartbeat Bar": "Тема - поле проверки",
-    Normal: "Нормално",
-    Bottom: "Долу",
-    None: "Без",
-    Timezone: "Часова зона",
-    "Search Engine Visibility": "Видимост за търсачки",
-    "Allow indexing": "Разреши индексиране",
-    "Discourage search engines from indexing site": "Не позволявай на търсачките да индексират този сайт",
-    "Change Password": "Промяна на парола",
-    "Current Password": "Текуща парола",
-    "New Password": "Нова парола",
-    "Repeat New Password": "Повторете новата парола",
-    "Update Password": "Актуализирай паролата",
-    "Disable Auth": "Изключи удостоверяване",
-    "Enable Auth": "Активирай удостоверяване",
-    "disableauth.message1": "Сигурни ли сте, че желаете да <strong>изключите удостоверяването</strong>?",
-    "disableauth.message2": "Използва се в случаите, когато <strong>има настроен алтернативен метод за удостоверяване</strong> преди Uptime Kuma, например Cloudflare Access, Authelia или друг механизъм за удостоверяване.",
-    "Please use this option carefully!": "Моля, използвайте с повишено внимание.",
-    Logout: "Изход от профила",
-    Leave: "Отказ",
-    "I understand, please disable": "Разбирам. Моля, изключи",
-    Confirm: "Потвърдете",
-    Yes: "Да",
-    No: "Не",
-    Username: "Потребител",
-    Password: "Парола",
-    "Remember me": "Запомни ме",
-    Login: "Вход",
-    "No Monitors, please": "Все още няма монитори. Моля, добавете поне ",
-    "add one": "един.",
-    "Notification Type": "Тип известие",
-    Email: "Имейл",
-    Test: "Тест",
-    "Certificate Info": "Информация за сертификат",
-    "Resolver Server": "Преобразуващ (DNS) сървър",
-    "Resource Record Type": "Тип запис",
-    "Last Result": "Последен резултат",
-    "Create your admin account": "Създаване на администриращ акаунт",
-    "Repeat Password": "Повторете паролата",
-    "Import Backup": "Импорт на архив",
-    "Export Backup": "Експорт на архив",
-    Export: "Експорт",
-    Import: "Импорт",
-    respTime: "Време за отговор (ms)",
-    notAvailableShort: "Няма",
-    "Default enabled": "Активирано по подразбиране",
-    "Apply on all existing monitors": "Приложи върху всички съществуващи монитори",
-    Create: "Създай",
-    "Clear Data": "Изтрий данни",
-    Events: "Събития",
-    Heartbeats: "Проверки",
-    "Auto Get": "Авт. попълване",
-    backupDescription: "Можете да архивирате всички монитори и всички известия в JSON файл.",
-    backupDescription2: "PS: Имайте предвид, че данните за история и събития няма да бъдат включени.",
-    backupDescription3: "Чувствителни данни, като токен кодове за известия, се съдържат в експортирания файл. Моля, бъдете внимателни с неговото съхранение.",
-    alertNoFile: "Моля, изберете файл за импортиране.",
-    alertWrongFileType: "Моля, изберете JSON файл.",
-    "Clear all statistics": "Изтрий цялата статистика",
-    "Skip existing": "Пропусни съществуващите",
-    Overwrite: "Презапиши",
-    Options: "Опции",
-    "Keep both": "Запази двете",
-    "Verify Token": "Провери токен код",
-    "Setup 2FA": "Настройка 2FA",
-    "Enable 2FA": "Активирай 2FA",
-    "Disable 2FA": "Деактивирай 2FA",
-    "2FA Settings": "Настройка за 2FA",
-    "Two Factor Authentication": "Двуфакторно удостоверяване",
-    Active: "Активно",
-    Inactive: "Неактивно",
-    Token: "Токен код",
-    "Show URI": "Покажи URI",
-    Tags: "Етикети",
-    "Add New below or Select...": "Добавете нов по-долу или изберете...",
-    "Tag with this name already exist.": "Етикет с това име вече съществува.",
-    "Tag with this value already exist.": "Етикет с тази стойност вече съществува.",
-    color: "цвят",
-    "value (optional)": "стойност (по желание)",
-    Gray: "Сиво",
-    Red: "Червено",
-    Orange: "Оранжево",
-    Green: "Зелено",
-    Blue: "Синьо",
-    Indigo: "Индиго",
-    Purple: "Лилаво",
-    Pink: "Розово",
-    "Search...": "Търси...",
-    "Avg. Ping": "Ср. пинг",
-    "Avg. Response": "Ср. отговор",
-    "Entry Page": "Основна страница",
-    statusPageNothing: "Все още няма нищо тук. Моля, добавете група или монитор.",
-    "No Services": "Няма Услуги",
-    "All Systems Operational": "Всички услуги са достъпни",
-    "Partially Degraded Service": "Част от услугите са недостъпни",
-    "Degraded Service": "Всички услуги са недостъпни",
-    "Add Group": "Добави група",
-    "Add a monitor": "Добави монитор",
-    "Edit Status Page": "Редактиране Статус страница",
-    "Go to Dashboard": "Към Таблото",
-    telegram: "Telegram",
-    webhook: "Уеб кука",
-    smtp: "Имейл (SMTP)",
-    discord: "Discord",
-    teams: "Microsoft Teams",
-    signal: "Signal",
-    gotify: "Gotify",
-    slack: "Slack",
-    "rocket.chat": "Rocket.chat",
-    pushover: "Pushover",
-    pushy: "Pushy",
-    octopush: "Octopush",
-    promosms: "PromoSMS",
-    lunasea: "LunaSea",
-    apprise: "Apprise (Поддържа 50+ услуги за известяване)",
-    pushbullet: "Pushbullet",
-    line: "Line Messenger",
-    mattermost: "Mattermost",
-    "Status Page": "Статус страница",
-    "Status Pages": "Статус страници",
-    "Primary Base URL": "Основен базов URL адрес",
-    "Push URL": "Генериран Push URL адрес",
-    needPushEvery: "Необходимо е да извършвате заявка към този URL адрес на всеки {0} секунди",
-    pushOptionalParams: "Допълнителни, но не задължителни параметри: {0}",
-    defaultNotificationName: "Моето {notification} известие ({number})",
-    here: "тук",
-    Required: "Задължително поле",
-    "Bot Token": "Бот токен",
-    wayToGetTelegramToken: "Можете да получите токен от {0}.",
-    "Chat ID": "Чат ID",
-    supportTelegramChatID: "Поддържа Direct Chat / Group / Channel's Chat ID",
-    wayToGetTelegramChatID: "Можете да получите вашето чат ID, като изпратите съобщение на бота, след което е нужно да посетите този URL адрес за да го видите:",
-    "YOUR BOT TOKEN HERE": "ВАШИЯТ БОТ ТОКЕН ТУК",
-    chatIDNotFound: "Чат ID не е намерено. Моля, първо изпратете съобщение до този бот",
-    "Post URL": "Post URL адрес",
-    "Content Type": "Тип съдържание",
-    webhookJsonDesc: "{0} е подходящ за всички съвременни http сървъри, като например express.js",
-    webhookFormDataDesc: "{multipart} е подходящ за PHP, нужно е да анализирате json чрез {decodeFunction}",
-    secureOptionNone: "Няма (25) / STARTTLS (587)",
-    secureOptionTLS: "TLS (465)",
-    "Ignore TLS Error": "Игнорирай TLS грешките",
-    "From Email": "От имейл адрес",
-    emailCustomSubject: "Модифициране на тема",
-    "To Email": "Получател имейл адрес",
-    smtpCC: "Явно копие до имейл адрес:",
-    smtpBCC: "Скрито копие до имейл адрес:",
-    "Discord Webhook URL": "Discord URL адрес на уеб кука",
-    wayToGetDiscordURL: "Може да създадете, от меню \"Настройки на сървъра\" -> \"Интеграции\" -> \"Уеб куки\" -> \"Нова уеб кука\"",
-    "Bot Display Name": "Име на бота, което да се показва",
-    "Prefix Custom Message": "Модифицирано обръщение",
-    "Hello @everyone is...": "Здравейте, {'@'}everyone е...",
-    "Webhook URL": "Уеб кука URL адрес",
-    wayToGetTeamsURL: "Можете да научите как се създава URL адрес за уеб кука {0}.",
-    Number: "Номер",
-    Recipients: "Получатели",
-    needSignalAPI: "Необходимо е да разполагате със Signal клиент с REST API.",
-    wayToCheckSignalURL: "Може да посетите този URL адрес, ако се нуждаете от помощ при настройването:",
-    signalImportant: "ВАЖНО: Не може да смесвате \"Групи\" и \"Номера\" в поле \"Получатели\"!",
-    "Application Token": "Токен код за приложението",
-    "Server URL": "URL адрес на сървъра",
-    Priority: "Приоритет",
-    "Icon Emoji": "Иконка Емотикон",
-    "Channel Name": "Канал име",
-    "Uptime Kuma URL": "Uptime Kuma URL адрес",
-    aboutWebhooks: "Повече информация относно уеб куки на: {0}",
-    aboutChannelName: "Въведете името на канала в поле {0} \"Канал име\", ако желаете да заобиколите канала от уеб куката. Например: #other-channel",
-    aboutKumaURL: "Ако оставите празно полето \"Uptime Kuma URL адрес\", по подразбиране ще се използва GitHub страницата на проекта.",
-    emojiCheatSheet: "Подсказки за емотикони: {0}",
-    "User Key": "Потребителски ключ",
-    Device: "Устройство",
-    "Message Title": "Заглавие на съобщението",
-    "Notification Sound": "Звуков сигнал",
-    "More info on:": "Повече информация на: {0}",
-    pushoverDesc1: "Приоритет Спешно (2) по подразбиране изчаква 30 секунди между повторните опити и изтича след 1 час.",
-    pushoverDesc2: "Ако желаете да изпратите известия до различни устройства, попълнете полето Устройство.",
-    "SMS Type": "SMS тип",
-    octopushTypePremium: "Премиум (Бърз - препоръчителен в случай на тревога)",
-    octopushTypeLowCost: "Евтин (Бавен - понякога бива блокиран от оператора)",
-    checkPrice: "Тарифни планове на {0}:",
-    octopushLegacyHint: "Дали използвате съвместима версия на Octopush (2011-2020) или нова версия?",
-    "Check octopush prices": "Тарифни планове на octopush {0}.",
-    octopushPhoneNumber: "Телефонен номер (в международен формат, например: +33612345678) ",
-    octopushSMSSender: "SMS подател Име: 3-11 знака - букви, цифри и интервал (a-zA-Z0-9)",
-    "LunaSea Device ID": "LunaSea ID на устройство",
-    "Apprise URL": "Apprise URL адрес",
-    "Example:": "Пример: {0}",
-    "Read more:": "Научете повече: {0}",
-    "Status:": "Статус: {0}",
-    "Read more": "Научете повече",
-    appriseInstalled: "Apprise е инсталиран.",
-    appriseNotInstalled: "Apprise не е инсталиран. {0}",
-    "Access Token": "Токен код за достъп",
-    "Channel access token": "Канал токен код",
-    "Line Developers Console": "Line - Конзола за разработчици",
-    lineDevConsoleTo: "Line - Конзола за разработчици - {0}",
-    "Basic Settings": "Основни настройки",
-    "User ID": "Потребител ID",
-    "Messaging API": "API за съобщаване",
-    wayToGetLineChannelToken: "Необходимо е първо да посетите {0}, за да създадете (Messaging API) за доставчик и канал, след което може да вземете токен кода за канал и потребителско ID от споменатите по-горе елементи на менюто.",
-    "Icon URL": "URL адрес за иконка",
-    aboutIconURL: "Може да предоставите линк към картинка в поле \"URL Адрес за иконка\" за да отмените картинката на профила по подразбиране. Няма да се използва, ако вече сте настроили емотикон.",
-    aboutMattermostChannelName: "Може да замените канала по подразбиране, към който публикува уеб куката, като въведете името на канала в полето \"Канал име\". Трябва да бъде активирано в настройките за уеб кука на Mattermost. Например: #other-channel",
-    matrix: "Matrix",
-    promosmsTypeEco: "SMS ECO - евтин, но бавен. Често е претоварен. Само за получатели от Полша.",
-    promosmsTypeFlash: "SMS FLASH - Съобщението автоматично се показва на устройството на получателя. Само за получатели от Полша.",
-    promosmsTypeFull: "SMS FULL - Високо ниво на SMS услуга. Може да използвате Вашето име като подател (Необходимо е първо да регистрирате името). Надежден метод за съобщения тип тревога.",
-    promosmsTypeSpeed: "SMS SPEED - Най-висок приоритет в системата. Много бърза и надеждна, но същевременно скъпа услуга. (Около два пъти по-висока цена в сравнение с SMS FULL).",
-    promosmsPhoneNumber: "Телефонен номер (за получатели от Полша, може да пропуснете въвеждането на код за населено място)",
-    promosmsSMSSender: "SMS Подател име: Предварително регистрирано име или някое от имената по подразбиране: InfoSMS, SMS Info, MaxSMS, INFO, SMS",
-    "Feishu WebHookUrl": "Feishu URL адрес за уеб кука",
-    matrixHomeserverURL: "Сървър URL адрес (започва с http(s):// и порт по желание)",
-    "Internal Room Id": "ID на вътрешна стая",
-    matrixDesc1: "Може да намерите \"ID на вътрешна стая\" в разширените настройки на стаята във вашия Matrix клиент. Примерен изглед: !QMdRCpUIfLwsfjxye6:home.server.",
-    matrixDesc2: "Силно препоръчваме да създадете НОВ потребител и да НЕ използвате токен кодът на вашия личен Matrix потребител, т.к. той позволява пълен достъп до вашия акаунт и всички стаи към които сте се присъединили. Вместо това създайте нов потребител и го поканете само в стаята, където желаете да получавате известията. Токен код за достъп ще получите изпълнявайки {0}",
-    Method: "Метод",
-    Body: "Съобщение",
-    Headers: "Хедъри",
-    PushUrl: "Push URL адрес",
-    HeadersInvalidFormat: "Заявените хедъри не са валидни JSON: ",
-    BodyInvalidFormat: "Заявеното съобщение не е валиден JSON: ",
-    "Monitor History": "История на мониторите",
-    clearDataOlderThan: "Ще се съхранява за {0} дни.",
-    records: "записа",
-    "One record": "Един запис",
-    steamApiKeyDescription: "За да мониторирате Steam Gameserver се нуждаете от Steam Web-API ключ. Може да регистрирате Вашия API ключ тук: ",
-    clicksendsms: "ClickSend SMS",
-    apiCredentials: "API удостоверяване",
-    PasswordsDoNotMatch: "Паролите не съвпадат.",
-    "Current User": "Текущ потребител",
-    recent: "Скорошни",
-    shrinkDatabaseDescription: "Инициира \"VACUUM\" за \"SQLite\" база данни. Ако Вашата база данни е създадена след версия 1.10.0, \"AUTO_VACUUM\" функцията е активна и това действие не е нужно.",
-    Done: "Готово",
-    Info: "Информация",
-    Security: "Сигурност",
-    "Steam API Key": "Steam API ключ",
-    "Shrink Database": "Редуцирай базата данни",
-    "Pick a RR-Type...": "Изберете вида на ресурсния запис за мониториране...",
-    "Pick Accepted Status Codes...": "Изберете статус кодове, които да се считат за успешен отговор...",
-    Default: "По подразбиране",
-    "HTTP Options": "HTTP Опции",
-    "Create Incident": "Създаване на инцидент",
-    Title: "Заглавие",
-    Content: "Съдържание",
-    Style: "Стил",
-    info: "информация",
-    warning: "предупреждение",
-    danger: "опасност",
-    primary: "основен",
-    light: "светъл",
-    dark: "тъмен",
-    Post: "Публикувай",
-    "Please input title and content": "Моля, въведете заглавие и съдържание",
-    Created: "Създаден",
-    "Last Updated": "Последно обновен",
-    Unpin: "Откачи",
-    "Switch to Light Theme": "Превключи към светла тема",
-    "Switch to Dark Theme": "Превключи към тъмна тема",
-    "Show Tags": "Покажи етикети",
-    "Hide Tags": "Скрий етикети",
-    Description: "Описание",
-    "No monitors available.": "Няма налични монитори.",
-    "Add one": "Добави един",
-    "No Monitors": "Няма монитори",
-    "Untitled Group": "Група без заглавие",
-    Services: "Услуги",
-    Discard: "Отмени",
-    Cancel: "Отмени",
-    "Powered by": "Създадено чрез",
-    serwersms: "SerwerSMS.pl",
-    serwersmsAPIUser: "API Потребителско име (вкл. webapi_ prefix)",
-    serwersmsAPIPassword: "API Парола",
-    serwersmsPhoneNumber: "Телефон номер",
-    serwersmsSenderName: "SMS Подател име (регистриран през клиентския портал)",
-    stackfield: "Stackfield",
-    smtpDkimSettings: "DKIM Настройки",
-    smtpDkimDesc: "Моля, вижте {0} на Nodemailer DKIM за инструкции.",
-    documentation: "документацията",
-    smtpDkimDomain: "Домейн",
-    smtpDkimKeySelector: "Селектор на ключ",
-    smtpDkimPrivateKey: "Частен ключ",
-    smtpDkimHashAlgo: "Хеш алгоритъм (по желание)",
-    smtpDkimheaderFieldNames: "Хедър ключове за подписване (по желание)",
-    smtpDkimskipFields: "Хедър ключове, които да не се подписват (по желание)",
-    PushByTechulus: "Push от Techulus",
-    GoogleChat: "Google Chat (Само за работното пространство на Google)",
-    gorush: "Gorush",
-    alerta: "Alerta",
-    alertaApiEndpoint: "Крайна точка на API",
-    alertaEnvironment: "Среда",
-    alertaApiKey: "API Ключ",
-    alertaAlertState: "Състояние на тревога",
-    alertaRecoverState: "Състояние на възстановяване",
-    deleteStatusPageMsg: "Сигурни ли сте, че желаете да изтриете тази статус страница?",
-    Proxies: "Прокси",
-    default: "По подразбиране",
-    enabled: "Активирано",
-    setAsDefault: "Зададен по подразбиране",
-    deleteProxyMsg: "Сигурни ли сте, че желаете да изтриете това прокси за всички монитори?",
-    proxyDescription: "За да функционират трябва да бъдат зададени към монитор.",
-    enableProxyDescription: "Това прокси няма да има ефект върху заявките за мониторинг, докато не бъде активирано. Може да контролирате временното деактивиране на проксито от всички монитори чрез статуса на активиране.",
-    setAsDefaultProxyDescription: "Това прокси ще бъде активно по подразбиране за новите монитори. Може да го изключите по отделно за всеки един монитор.",
-    "Certificate Chain": "Верига на сертификата",
-    Valid: "Валиден",
-    Invalid: "Невалиден",
-    AccessKeyId: "ID на ключ за достъп",
-    SecretAccessKey: "Тайна на ключа за достъп",
-    PhoneNumbers: "Телефонни номера",
-    TemplateCode: "Шаблон Код",
-    SignName: "Знак име",
-    "Sms template must contain parameters: ": "SMS шаблонът трябва да съдържа следните параметри: ",
-    "Bark Endpoint": "Bark крайна точка",
-    WebHookUrl: "URL адрес на уеб кука",
-    SecretKey: "Таен ключ",
-    "For safety, must use secret key": "За сигурност, трябва да се използва таен ключ",
-    "Device Token": "Токен за устройство",
-    Platform: "Платформа",
-    iOS: "iOS",
-    Android: "Android",
-    Huawei: "Huawei",
-    High: "Висок",
-    Retry: "Повтори",
-    Topic: "Тема",
-    "WeCom Bot Key": "WeCom бот ключ",
-    "Setup Proxy": "Настрой прокси",
-    "Proxy Protocol": "Прокси протокол",
-    "Proxy Server": "Прокси сървър",
-    "Proxy server has authentication": "Прокси сървърът е с удостоверяване",
-    User: "Потребител",
-    Installed: "Инсталиран",
-    "Not installed": "Не е инсталиран",
-    Running: "Работи",
-    "Not running": "Не работи",
-    "Remove Token": "Премахни токен",
-    Start: "Стартирай",
-    Stop: "Спри",
-    "Uptime Kuma": "Uptime Kuma",
-    "Add New Status Page": "Добави нова статус страница",
-    Slug: "Слъг",
-    "Accept characters:": "Приеми символи:",
-    startOrEndWithOnly: "Започва или завършва само с {0}",
-    "No consecutive dashes": "Без последователни тирета",
-    Next: "Следващ",
-    "The slug is already taken. Please choose another slug.": "Този слъг вече се използва. Моля изберете друг.",
-    "No Proxy": "Без прокси",
-    Authentication: "Удостоверяване",
-    "HTTP Basic Auth": "HTTP основно удостоверяване",
-    "New Status Page": "Нова статус страница",
-    "Page Not Found": "Страницата не е открита",
-    "Reverse Proxy": "Ревърс прокси",
-    Backup: "Архивиране",
-    About: "Относно",
-    wayToGetCloudflaredURL: "(Свалете \"cloudflared\" от {0})",
-    cloudflareWebsite: "Cloudflare уеб сайт",
-    "Message:": "Съобщение:",
-    "Don't know how to get the token? Please read the guide:": "Не знаете как да вземете токен? Моля, прочетете ръководството:",
-    "The current connection may be lost if you are currently connecting via Cloudflare Tunnel. Are you sure want to stop it? Type your current password to confirm it.": "Текущата връзка може да прекъсне ако в момента сте свързани чрез \"Cloudflare Tunnel\". Сигурни ли сте, че желаете да го спрете? Въведете Вашата текуща парола за да потвърдите.",
-    "Other Software": "Друг софтуер",
-    "For example: nginx, Apache and Traefik.": "Например: Nginx, Apache и Traefik.",
-    "Please read": "Моля, прочетете",
-    "Subject:": "Тема:",
-    "Valid To:": "Валиден до:",
-    "Days Remaining:": "Оставащи дни:",
-    "Issuer:": "Издател:",
-    "Fingerprint:": "Пръстов отпечатък:",
-    "No status pages": "Няма статус страници",
-    topic: "Тема",
-    topicExplanation: "MQTT тема за мониториране",
-    successMessage: "Съобщение при успех",
-    successMessageExplanation: "MQTT съобщение, което ще бъде считано за успех",
-    Customize: "Персонализирай",
-    "Custom Footer": "Персонализиран долен колонтитул",
-    "Custom CSS": "Потребителски CSS",
-    "Domain Name Expiry Notification": "Известие при изтичащ домейн",
-    Proxy: "Прокси",
-    "Date Created": "Дата на създаване",
-    onebotHttpAddress: "OneBot HTTP адрес",
-    onebotMessageType: "OneBot тип съобщение",
-    onebotGroupMessage: "Група",
-    onebotPrivateMessage: "Лично",
-    onebotUserOrGroupId: "Група/Потребител ID",
-    onebotSafetyTips: "С цел безопасност трябва да зададете токен код за достъп",
-    "PushDeer Key": "PushDeer ключ",
-    "Footer Text": "Текст долен колонтитул",
-    "Show Powered By": "Покажи \"Създадено чрез\"",
-    "Domain Names": "Домейни",
-    signedInDisp: "Вписан като {0}",
-    signedInDispDisabled: "Удостоверяването е изключено.",
-    "Certificate Expiry Notification": "Известие за изтичане валидността на сертификата",
-    "API Username": "API Потребител",
-    "API Key": "API Ключ",
-    "Recipient Number": "Номер на получателя",
-    "From Name/Number": "От Име/Номер",
-    "Leave blank to use a shared sender number.": "Оставете празно, за да използвате споделен номер на подател.",
-    "Octopush API Version": "Octopush API версия",
-    "Legacy Octopush-DM": "Octopush-DM старa версия",
-    endpoint: "крайна точка",
-    octopushAPIKey: "\"API ключ\" от HTTP API удостоверяване в контролния панел",
-    octopushLogin: "\"Вписване\" от HTTP API удостоверяване в контролния панел",
-    promosmsLogin: "API Потребителско име",
-    promosmsPassword: "API Парола",
-    "pushoversounds pushover": "Pushover (по подразбиране)",
-    "pushoversounds bike": "Велосипед",
-    "pushoversounds bugle": "Тромпет",
-    "pushoversounds cashregister": "Касов апарат",
-    "pushoversounds classical": "Класическа музика",
-    "pushoversounds cosmic": "Космически",
-    "pushoversounds falling": "Падащ",
-    "pushoversounds gamelan": "Игра в мрежа",
-    "pushoversounds incoming": "Входящ",
-    "pushoversounds intermission": "Прекъсване",
-    "pushoversounds magic": "Магия",
-    "pushoversounds mechanical": "Механичен",
-    "pushoversounds pianobar": "Пиано бар",
-    "pushoversounds siren": "Сирена",
-    "pushoversounds spacealarm": "Космическа аларма",
-    "pushoversounds tugboat": "Буксир",
-    "pushoversounds alien": "Извънземна аларма (дълъг)",
-    "pushoversounds climb": "Изкачване (дълъг)",
-    "pushoversounds persistent": "Постоянен (дълъг)",
-    "pushoversounds echo": "Pushover ехо (дълъг)",
-    "pushoversounds updown": "Горе долу (дълъг)",
-    "pushoversounds vibrate": "Само вибрация",
-    "pushoversounds none": "Без (тих)",
-    pushyAPIKey: "Таен API ключ",
-    pushyToken: "Токен на устройство",
-    "Show update if available": "Покажи актуализация, ако е налична",
-    "Also check beta release": "Проверявай и за бета версии",
-    "Using a Reverse Proxy?": "Използвате ревърс прокси?",
-    "Check how to config it for WebSocket": "Проверете как да го конфигурирате за WebSocket",
-    "Steam Game Server": "Steam Game сървър",
-    "Most likely causes:": "Най-вероятни причини:",
-    "The resource is no longer available.": "Ресурсът вече не е наличен.",
-    "There might be a typing error in the address.": "Възможно е да е допусната грешка при изписването на адреса.",
-    "What you can try:": "Може да опитате:",
-    "Retype the address.": "Повторно въвеждане на адреса.",
-    "Go back to the previous page.": "Да се върнете към предишната страница.",
-    "Coming Soon": "Очаквайте скоро",
-    wayToGetClickSendSMSToken: "Може да получите API потребителско име и API ключ от {0} .",
-    dnsPortDescription: "DNS порт на сървъра. По подразбиране е 53, но може да бъде променен по всяко време.",
-    error: "грешка",
-    critical: "критично",
-    wayToGetPagerDutyKey: "Може да го получите като посетите Service -> Service Directory -> (Select a service) -> Integrations -> Add integration. Тук трябва да потърсите \"Events API V2\". Повече информация {0}",
-    "Integration Key": "Ключ за интегриране",
-    "Integration URL": "URL адрес за интеграция",
-    "Auto resolve or acknowledged": "Автоматично разрешаване или потвърждаване",
-    "do nothing": "не прави нищо",
-    "auto acknowledged": "автоматично потвърждаване",
-    "auto resolve": "автоматично разрешаване",
-    "Connection String": "Стринг за връзка",
-    Query: "Заявка",
-    settingsCertificateExpiry: "Изтичане валидността на TLS сертификата",
-    certificationExpiryDescription: "HTTPS мониторите ще задействат известие, ако е наличен изтичащ TLS сертификат, през следващите:",
-    "ntfy Topic": "ntfy Тема",
-    Domain: "Домейн",
-    Workstation: "Работна станция",
-    disableCloudflaredNoAuthMsg: "Тъй като сте в режим \"No Auth mode\", парола не се изисква.",
-    wayToGetLineNotifyToken: "Може да получите токен код за достъп от {0}",
-    resendEveryXTimes: "Изпращай повторно на всеки {0} пъти",
-    resendDisabled: "Повторното изпращане е изключено",
-    "Resend Notification if Down X times consequently": "Повторно изпращане на известие, ако е недостъпен X пъти последователно",
-    "Bark Group": "Bark група",
-    "Bark Sound": "Bark звук",
-    "HTTP Headers": "HTTP хедъри",
-    "Trust Proxy": "Trust Proxy",
-    HomeAssistant: "Home Assistant",
-    RadiusSecret: "Radius таен код",
-    RadiusSecretDescription: "Споделен таен код между клиент и сървър",
-    RadiusCalledStationId: "Повиквана станция ID",
-    RadiusCalledStationIdDescription: "Идентификатор на повикваното устройство",
-    RadiusCallingStationId: "Повикваща станция ID",
-    RadiusCallingStationIdDescription: "Идентификатор на повикващото устройство",
-    "Setup Docker Host": "Настройка на Docker хост",
-    "Connection Type": "Тип свързване",
-    "Docker Daemon": "Docker демон",
-    deleteDockerHostMsg: "Сигурни ли сте, че желаете да изтриете този Docker хост за всички монитори?",
-    socket: "Сокет",
-    tcp: "TCP / HTTP",
-    "Docker Container": "Docker контейнер",
-    "Container Name / ID": "Име на контейнер / ID",
-    "Docker Host": "Docker хост",
-    "Docker Hosts": "Docker хостове",
-    trustProxyDescription: "Trust 'X-Forwarded-*' headers.  Ако искате да получавате правилния IP адрес на клиента, а Uptime Kuma е зад системи като Nginx или Apache, трябва да разрешите тази опция.",
-    Examples: "Примери",
-    "Home Assistant URL": "Home Assistant URL адрес",
-    "Long-Lived Access Token": "Long-Lived Access Token",
-    "Long-Lived Access Token can be created by clicking on your profile name (bottom left) and scrolling to the bottom then click Create Token. ": "Long-Lived Access Token можете да създадете, като кликнете върху името на профила си (долу ляво) и превъртите до най-долу, след това кликнете върху Създаване на токен. ",
-    "Notification Service": "Услуга за известяване",
-    "default: notify all devices": "по подразбиране: извести всички устройства",
-    "A list of Notification Services can be found in Home Assistant under \"Developer Tools > Services\" search for \"notification\" to find your device/phone name.": "Списък с услугите за известяване може да бъде намерен в Home Assistant под \"Developer Tools > Services\", там потърсете \"notification\", за да намерите името на вашето устройство/телефон.",
-    "Automations can optionally be triggered in Home Assistant:": "Автоматизациите могат да се задействат при нужда в Home Assistant:",
-    "Trigger type:": "Задействане тип:",
-    "Event type:": "Събитие тип:",
-    "Event data:": "Събитие данни:",
-    "Then choose an action, for example switch the scene to where an RGB light is red.": "След което изберете действие, например да превключите сцената, където RGB светлината е червена.",
-    "Frontend Version": "Фронтенд версия",
-    "Frontend Version do not match backend version!": "Фронтенд версията не съвпада с Бекенд версията!",
-    "Base URL": "Базов  URL адрес",
-    goAlertInfo: "GoAlert е приложение с отворен код за планиране на повиквания, автоматизирани ескалации и известия (като SMS или гласови повиквания). Автоматично ангажирайте точния човек, по точния начин и в точното време! {0}",
-    goAlertIntegrationKeyInfo: "Вземете общ API интеграционен ключ за услугата във формат \"aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee\" обикновено стойността на параметъра token на копирания URL адрес.",
-    goAlert: "GoAlert",
-    backupOutdatedWarning: "Отпаднало: Тъй като са добавени много функции, тази опция за архивиране не е достатъчно поддържана и не може да генерира или възстанови пълен архив.",
-    backupRecommend: "Моля, архивирайте дяла или папката (./data/) директно вместо това.",
-    Maintenance: "Поддръжка",
-    statusMaintenance: "Поддръжка",
-    "Schedule maintenance": "Планиране на поддръжка",
-    "Affected Monitors": "Засегнати монитори",
-    "Pick Affected Monitors...": "Изберете засегнати монитори...",
-    "Start of maintenance": "Стартирай поддръжка",
-    "All Status Pages": "Всички статус страници",
-    "Select status pages...": "Изберете статус страници...",
-    recurringIntervalMessage: "Изпълнявай ежедневно | Изпълнявай всеки {0} дни",
-    affectedMonitorsDescription: "Изберете монитори, засегнати от текущата поддръжка",
-    affectedStatusPages: "Покажи това съобщение за поддръжка на избрани статус страници",
-    atLeastOneMonitor: "Изберете поне един засегнат монитор",
-    deleteMaintenanceMsg: "Сигурни ли сте, че желаете да изтриете тази поддръжка?",
-    Optional: "По желание",
-    squadcast: "Squadcast",
-    SendKey: "SendKey",
-    "SMSManager API Docs": "SMSManager API Документация ",
-    "Gateway Type": "Тип на шлюза",
-    SMSManager: "SMSManager",
-    "You can divide numbers with": "Може да разделяте числата с",
-    or: "или",
-    recurringInterval: "Интервал",
-    Recurring: "Повтаряне",
-    strategyManual: "Активен/Неактивен ръчно",
-    warningTimezone: "Използва се часовата зона на сървъра",
-    weekdayShortMon: "Пон",
-    weekdayShortTue: "Вт",
-    weekdayShortWed: "Ср",
-    weekdayShortThu: "Чет",
-    weekdayShortFri: "Пет",
-    weekdayShortSat: "Съб",
-    weekdayShortSun: "Нед",
-    dayOfWeek: "Ден",
-    dayOfMonth: "Дата",
-    lastDay: "Последен ден",
-    lastDay1: "Последен ден от месеца",
-    lastDay2: "2-ри последен ден на месеца",
-    lastDay3: "3-ти последен ден на месеца",
-    lastDay4: "4-ти последен ден на месеца",
-    "No Maintenance": "Няма поддръжка",
-    pauseMaintenanceMsg: "Сигурни ли сте, че желаете да направите пауза?",
-    "maintenanceStatus-under-maintenance": "В режим поддръжка",
-    "maintenanceStatus-inactive": "Неактивна",
-    "maintenanceStatus-scheduled": "Планирана",
-    "maintenanceStatus-ended": "Приключена",
-    "maintenanceStatus-unknown": "Неизвестна",
-    "Display Timezone": "Покажи часова зона",
-    "Server Timezone": "Часова зона на сървъра",
-    statusPageMaintenanceEndDate: "Край",
-    enableGRPCTls: "Разреши изпращане на gRPC заявка с TLS връзка",
-    grpcMethodDescription: "Името на метода се форматира в \"cammelCase\", например sayHello, check, и т.н.",
-    smseagle: "SMSEagle",
-    smseagleTo: "Тел. номер(а)",
-    smseagleGroup: "Име на група/и от тел. указател",
-    smseagleContact: "Име(на) от тел. указател",
-    smseagleRecipientType: "Получател тип",
-    smseagleRecipient: "Получател(и) (при повече от един разделете със запетая)",
-    smseagleToken: "API токен за достъп",
-    smseagleUrl: "Вашият SMSEagle URL на устройството",
-    smseagleEncoding: "Изпрати като Unicode",
-    smseaglePriority: "Приоритет на съобщението (0-9, по подразбиране = 0)",
-    IconUrl: "Икона URL адрес",
-    webhookAdditionalHeadersTitle: "Допълнителни хедъри",
-    webhookAdditionalHeadersDesc: "Задава допълнителни хедъри, изпратени с уеб куката.",
-    "Enable DNS Cache": "Активирай DNS кеширане",
-    Enable: "Активирай",
-    Disable: "Деактивирай",
-    dnsCacheDescription: "Възможно е да не работи в IPv6 среда - деактивирайте, ако срещнете проблеми.",
-    "Single Maintenance Window": "Единичен времеви интервал за поддръжка",
-    "Maintenance Time Window of a Day": "Времеви интервал от деня за поддръжка",
-    "Effective Date Range": "Интервал от дни на влизане в сила",
-    "Schedule Maintenance": "Планирай поддръжка",
-    "Date and Time": "Дата и час",
-    "DateTime Range": "Изтрий времеви интервал",
-    Strategy: "Стратегия",
-    "Free Mobile User Identifier": "Free Mobile потребителски идентификатор",
-    "Free Mobile API Key": "Free Mobile API ключ",
-    "Enable TLS": "Активирай TLS",
-    "Proto Service Name": "Proto име на услугата",
-    "Proto Method": "Proto метод",
-    "Proto Content": "Proto съдържание",
-    Economy: "Икономичен",
-    Lowcost: "Евтин",
-    high: "висок",
-    "General Monitor Type": "Общ тип монитор",
-    "Passive Monitor Type": "Пасивет тип монитор",
-    "Specific Monitor Type": "Специфичен тип монитор",
-};
diff --git a/src/languages/cs-CZ.js b/src/languages/cs-CZ.js
deleted file mode 100644
index 99ae9ef0a..000000000
--- a/src/languages/cs-CZ.js
+++ /dev/null
@@ -1,626 +0,0 @@
-export default {
-    languageName: "Czech",
-    checkEverySecond: "Kontrolovat každých {0} sekund",
-    retryCheckEverySecond: "Opakovat každých {0} sekund",
-    resendEveryXTimes: "Znovu zaslat {0}krát",
-    resendDisabled: "Opakované zasílání je vypnuté",
-    retriesDescription: "Maximální počet pokusů před označením služby jako nedostupné a odesláním oznámení",
-    ignoreTLSError: "Ignorovat TLS/SSL chyby na HTTPS stránkách",
-    upsideDownModeDescription: "Pomocí této možnosti změníte způsob vyhodnocování stavu. Pokud je služba dosažitelná, je NEDOSTUPNÁ.",
-    maxRedirectDescription: "Maximální počet přesměrování, která se mají následovat. Nastavením hodnoty 0 zakážete přesměrování.",
-    acceptedStatusCodesDescription: "Vyberte stavové kódy, které jsou považovány za úspěšnou odpověď.",
-    passwordNotMatchMsg: "Hesla se neshodují",
-    notificationDescription: "Pro zajištění funkčnosti oznámení je nutné jej přiřadit dohledu.",
-    keywordDescription: "Vyhledat klíčové slovo v prosté odpovědi HTML nebo JSON. Při hledání se rozlišuje velikost písmen.",
-    pauseDashboardHome: "Pozastavit",
-    deleteMonitorMsg: "Opravdu chcete odstranit tento dohled?",
-    deleteNotificationMsg: "Opravdu chcete odstranit toto oznámení pro všechny dohledy?",
-    dnsPortDescription: "Port DNS serveru. Standardně běží na portu 53. V případě potřeby jej můžete kdykoli změnit.",
-    resolverserverDescription: "Cloudflare je výchozí server. V případě potřeby můžete Resolver server kdykoli změnit.",
-    rrtypeDescription: "Vyberte typ záznamu o prostředku, který chcete monitorovat",
-    pauseMonitorMsg: "Opravdu chcete dohled pozastavit?",
-    enableDefaultNotificationDescription: "Toto oznámení bude standardně aktivní pro nové dohledy. V případě potřeby můžete oznámení stále zakázat na úrovni jednotlivých dohledů.",
-    clearEventsMsg: "Opravdu chcete odstranit všechny události pro tento dohled?",
-    clearHeartbeatsMsg: "Opravdu chcete odstranit všechny heartbeaty pro tento dohled?",
-    confirmClearStatisticsMsg: "Opravdu chcete smazat VŠECHNY statistiky?",
-    importHandleDescription: "Možnost 'Přeskočit existující' vyberte v případě, že chcete přeskočit všechny dohledy nebo oznámení se stejným názvem. Vybráním možnosti 'Přepsat' dojde k odstranění všech existujících dohledů a oznámení.",
-    confirmImportMsg: "Opravdu chcete importovat zálohu? Prosím ověřte, zda jste vybrali správnou možnost importu.",
-    twoFAVerifyLabel: "Prosím, zadejte svůj token pro ověření 2FA:",
-    tokenValidSettingsMsg: "Token je platný! Nyní můžete uložit nastavení 2FA.",
-    confirmEnableTwoFAMsg: "Opravdu chcete zapnout 2FA?",
-    confirmDisableTwoFAMsg: "Opravdu chcete deaktivovat 2FA?",
-    Settings: "Nastavení",
-    Dashboard: "Nástěnka",
-    "New Update": "Nová aktualizace",
-    Language: "Jazyk",
-    Appearance: "Vzhled",
-    Theme: "Motiv",
-    General: "Obecné",
-    "Primary Base URL": "Primární URL adresa",
-    Version: "Verze",
-    "Check Update On GitHub": "Zkontrolovat aktualizace na GitHubu",
-    List: "Seznam",
-    Add: "Přidat",
-    "Add New Monitor": "Přidat nový dohled",
-    "Quick Stats": "Rychlé statistiky",
-    Up: "Běží",
-    Down: "Nedostupný",
-    Pending: "Čekám",
-    Unknown: "Neznámý",
-    Pause: "Pozastaveno",
-    Name: "Název",
-    Status: "Stav",
-    DateTime: "Časové razítko",
-    Message: "Zpráva",
-    "No important events": "Žádné důležité události",
-    Resume: "Pokračovat",
-    Edit: "Změnit",
-    Delete: "Vymazat",
-    Current: "Aktuální",
-    Uptime: "Doba provozu",
-    "Cert Exp.": "Platnost certifikátu",
-    day: "den | dny/í",
-    "-day": "-dní",
-    hour: "hodina",
-    "-hour": "-hodin",
-    Response: "Odpověď",
-    Ping: "Ping",
-    "Monitor Type": "Typ dohledu",
-    Keyword: "Klíčové slovo",
-    "Friendly Name": "Obecný název",
-    URL: "URL",
-    Hostname: "Adresa serveru",
-    Port: "Port",
-    "Heartbeat Interval": "Heartbeat interval",
-    Retries: "Počet pokusů",
-    "Heartbeat Retry Interval": "Interval opakování heartbeatu",
-    "Resend Notification if Down X times consequently": "Znovu zaslat oznámení, pokud je služba nedostupná Xkrát za sebou",
-    Advanced: "Rozšířené",
-    "Upside Down Mode": "Inverzní režim",
-    "Max. Redirects": "Max. přesměrování",
-    "Accepted Status Codes": "Akceptované stavové kódy",
-    "Push URL": "Push URL",
-    needPushEvery: "Tuto URL adresu byste měli volat každých {0} sekund.",
-    pushOptionalParams: "Volitelné parametry: {0}",
-    Save: "Uložit",
-    Notifications: "Oznámení",
-    "Not available, please setup.": "Není k dispozici, prosím nastavte.",
-    "Setup Notification": "Nastavení oznámení",
-    Light: "Světlý",
-    Dark: "Tmavý",
-    Auto: "Automaticky",
-    "Theme - Heartbeat Bar": "Motiv – Heartbeat panel",
-    Normal: "Normální",
-    Bottom: "Dole",
-    None: "Žádné",
-    Timezone: "Časové pásmo",
-    "Search Engine Visibility": "Viditelnost pro vyhledávače",
-    "Allow indexing": "Povolit indexování",
-    "Discourage search engines from indexing site": "Zabránit vyhledávačům v indexování stránky",
-    "Change Password": "Změnit heslo",
-    "Current Password": "Aktuální heslo",
-    "New Password": "Nové heslo",
-    "Repeat New Password": "Znovu zadat nové heslo",
-    "Update Password": "Aktualizovat heslo",
-    "Disable Auth": "Deaktivovat ověřování",
-    "Enable Auth": "Povolit ověřování",
-    "disableauth.message1": "Opravdu chcete <strong>deaktivovat autentifikaci</strong>?",
-    "disableauth.message2": "Tato možnost je určena pro případy, kdy <strong>máte autentifikaci zajištěnou třetí stranou</strong> ještě před přístupem do Uptime Kuma, například prostřednictvím Cloudflare Access.",
-    "Please use this option carefully!": "Používejte ji prosím s rozmyslem.",
-    Logout: "Odhlásit",
-    Leave: "Odejít",
-    "I understand, please disable": "Rozumím, chci ji deaktivovat",
-    Confirm: "Potvrzení",
-    Yes: "Ano",
-    No: "Ne",
-    Username: "Uživatelské jméno",
-    Password: "Heslo",
-    "Remember me": "Zapamatovat si mě",
-    Login: "Přihlášení",
-    "No Monitors, please": "Žádné dohledy, prosím",
-    "add one": "přidat jeden",
-    "Notification Type": "Typ oznámení",
-    Email: "E-mail",
-    Test: "Test",
-    "Certificate Info": "Informace o certifikátu",
-    "Resolver Server": "Resolver Server",
-    "Resource Record Type": "Typ záznamu o prostředku",
-    "Last Result": "Poslední výsledek",
-    "Create your admin account": "Vytvořit účet administrátora",
-    "Repeat Password": "Znovu zadat heslo",
-    "Import Backup": "Importovat zálohu",
-    "Export Backup": "Exportovat zálohu",
-    Export: "Exportovat",
-    Import: "Importovat",
-    respTime: "Doba odezvy (ms)",
-    notAvailableShort: "N/A",
-    "Default enabled": "Standardně povoleno",
-    "Apply on all existing monitors": "Použít pro všechny existující dohledy",
-    Create: "Vytvořit",
-    "Clear Data": "Vymazat data",
-    Events: "Události",
-    Heartbeats: "Heartbeaty",
-    "Auto Get": "Získat automaticky",
-    backupDescription: "Všechny dohledy a oznámení můžete zálohovat do souboru ve formátu JSON.",
-    backupDescription2: "Poznámka: Nezahrnuje historii a data událostí.",
-    backupDescription3: "Součástí exportovaného souboru jsou citlivá data jako tokeny oznámení; export si prosím bezpečně uložte.",
-    alertNoFile: "Vyberte soubor, který chcete importovat.",
-    alertWrongFileType: "Vyberte soubor ve formátu JSON.",
-    "Clear all statistics": "Vymazat všechny statistiky",
-    "Skip existing": "Přeskočit existující",
-    Overwrite: "Přepsat",
-    Options: "Možnosti",
-    "Keep both": "Ponechat obojí",
-    "Verify Token": "Ověřit token",
-    "Setup 2FA": "Nastavení 2FA",
-    "Enable 2FA": "Povolit 2FA",
-    "Disable 2FA": "Deaktivovat 2FA",
-    "2FA Settings": "Nastavení 2FA",
-    "Two Factor Authentication": "Dvoufaktorová autentifikace",
-    Active: "Zapnuto",
-    Inactive: "Neaktivní",
-    Token: "Token",
-    "Show URI": "Zobrazit URI",
-    Tags: "Štítky",
-    "Add New below or Select...": "Níže přidejte nový nebo vyberte existující…",
-    "Tag with this name already exist.": "Štítek s tímto názvem již existuje.",
-    "Tag with this value already exist.": "Štítek touto hodnotou již existuje.",
-    color: "barva",
-    "value (optional)": "hodnota (volitelné)",
-    Gray: "Šedá",
-    Red: "Červená",
-    Orange: "Oranžová",
-    Green: "Zelená",
-    Blue: "Modrá",
-    Indigo: "Indigo",
-    Purple: "Purpurová",
-    Pink: "Růžová",
-    "Search...": "Hledat…",
-    "Avg. Ping": "Průměr Ping",
-    "Avg. Response": "Průměr Odpověď",
-    "Entry Page": "Vstupní stránka",
-    statusPageNothing: "Nic tady není, přidejte prosím skupinu nebo dohled.",
-    "No Services": "Žádné služby",
-    "All Systems Operational": "Všechny systémy běží",
-    "Partially Degraded Service": "Částečně zhoršená služba",
-    "Degraded Service": "Zhoršená služba",
-    "Add Group": "Přidat skupinu",
-    "Add a monitor": "Přidání dohledu",
-    "Edit Status Page": "Upravit stavovou stránku",
-    "Go to Dashboard": "Přejít na nástěnku",
-    "Status Page": "Stavová stránka",
-    "Status Pages": "Stavová stránka",
-    defaultNotificationName: "Moje {notification} upozornění ({číslo})",
-    here: "sem",
-    Required: "Vyžadováno",
-    telegram: "Telegram",
-    "Bot Token": "Token robota",
-    wayToGetTelegramToken: "Token můžete získat od {0}.",
-    "Chat ID": "ID chatu",
-    supportTelegramChatID: "Podpora přímého chatu / skupiny / ID chatu kanálu",
-    wayToGetTelegramChatID: "ID chatu můžete získat tak, že robotovi zašlete zprávu a přejdete na tuto adresu URL, kde zobrazíte chat_id:",
-    "YOUR BOT TOKEN HERE": "SEM ZADEJTE TOKEN VAŠEHO CHATBOTA",
-    chatIDNotFound: "ID chatu nebylo nalezeno; nejprve tomuto robotovi zašlete zprávu",
-    webhook: "Webhook",
-    "Post URL": "URL adresa příspěvku",
-    "Content Type": "Typ obsahu",
-    webhookJsonDesc: "{0} je vhodný pro všechny moderní servery HTTP, jako je Express.js",
-    webhookFormDataDesc: "{multipart} je vhodné pro PHP. JSON bude nutné analyzovat prostřednictvím {decodeFunction}",
-    smtp: "E-mail (SMTP)",
-    secureOptionNone: "Žádné / STARTTLS (25, 587)",
-    secureOptionTLS: "TLS (465)",
-    "Ignore TLS Error": "Ignorovat chybu TLS",
-    "From Email": "Odesílatel",
-    emailCustomSubject: "Vlastní předmět",
-    "To Email": "Příjemce",
-    smtpCC: "Kopie",
-    smtpBCC: "Skrytá kopie",
-    discord: "Discord",
-    "Discord Webhook URL": "Discord Webhook URL",
-    wayToGetDiscordURL: "Získáte tak, že přejdete do Nastavení serveru - > Integrace - > Vytvořit Webhook",
-    "Bot Display Name": "Zobrazované jméno robota",
-    "Prefix Custom Message": "Předpona vlastní zprávy",
-    "Hello @everyone is...": "Dobrý den, {'@'}všichni jsou…",
-    teams: "Microsoft Teams",
-    "Webhook URL": "URL adresa webhooku",
-    wayToGetTeamsURL: "Informace o tom, jak vytvořit URL adresu webhooku naleznete {0}.",
-    signal: "Signal",
-    Number: "Číslo",
-    Recipients: "Příjemci",
-    needSignalAPI: "Musíte mít Signal klienta s REST API.",
-    wayToCheckSignalURL: "Pro zobrazení instrukcí, jak službu nastavit, přejděte na následující adresu:",
-    signalImportant: "Důležité V seznamu příjemců není možné současně použít skupiny a čísla!",
-    gotify: "Gotify",
-    "Application Token": "Token aplikace",
-    "Server URL": "URL adresa serveru",
-    Priority: "Priorita",
-    slack: "Slack",
-    "Icon Emoji": "Ikona smajlíka",
-    "Channel Name": "Název kanálu",
-    "Uptime Kuma URL": "Uptime Kuma URL",
-    aboutWebhooks: "Více informací o Webhoocích naleznete na adrese: {0}",
-    aboutChannelName: "Pro vynechání Webhook kanálu zadejte jeho název do pole Název kanálu {0}. Příklad: #jiny-kanal",
-    aboutKumaURL: "Pokud ponecháte pole URL adresa Uptime Kuma prázdné, použije se domovská stránka GitHub projektu.",
-    emojiCheatSheet: "Tahák smajlíků: {0}",
-    "rocket.chat": "Rocket.Chat",
-    pushover: "Pushover",
-    pushy: "Pushy",
-    PushByTechulus: "Push by Techulus",
-    octopush: "Octopush",
-    promosms: "PromoSMS",
-    clicksendsms: "ClickSend SMS",
-    lunasea: "LunaSea",
-    apprise: "Apprise (podpora více než 50 oznamovacích služeb)",
-    GoogleChat: "Google Chat (pouze Google Workspace)",
-    pushbullet: "Pushbullet",
-    line: "Line Messenger",
-    mattermost: "Mattermost",
-    "User Key": "Klíč uživatele",
-    Device: "Zařízení",
-    "Message Title": "Nadpis zprávy",
-    "Notification Sound": "Zvuk oznámení",
-    "More info on:": "Více informací naleznete na adrese: {0}",
-    pushoverDesc1: "Výchozí časový limit pro emergency prioritu (2) je 30 sekund mezi opakovanými pokusy a vyprší po 1 hodině.",
-    pushoverDesc2: "Pokud chcete odesílat oznámení do různých zařízení, vyplňte pole Zařízení.",
-    "SMS Type": "Typ SMS",
-    octopushTypePremium: "Premium (rychlé – doporučeno pro upozornění)",
-    octopushTypeLowCost: "Nízké náklady (pomalé – někdy blokované operátorem)",
-    checkPrice: "Ceny {0} zjistíte na adrese:",
-    apiCredentials: "API přihlašovací údaje",
-    octopushLegacyHint: "Používáte starší verzi Octopush (2011-2020) nebo novou verzi?",
-    "Check octopush prices": "Ceny octopush naleznete na adrese {0}.",
-    octopushPhoneNumber: "Telefonní číslo (v mezinárodním formátu, např: +42012345678) ",
-    octopushSMSSender: "Odesílatel SMS: 3-11 alfanumerických znaků a mezera (a-zA-Z0-9)",
-    "LunaSea Device ID": "ID zařízení LunaSea",
-    "Apprise URL": "Apprise URL",
-    "Example:": "Příklad: {0}",
-    "Read more:": "Více informací: {0}",
-    "Status:": "Stav: {0}",
-    "Read more": "Více informací",
-    appriseInstalled: "Apprise je nainstalován.",
-    appriseNotInstalled: "Apprise není nainstalován. {0}",
-    "Access Token": "Přístupový token",
-    "Channel access token": "Přístupový token ke kanálu",
-    "Line Developers Console": "Konzole Line Developers",
-    lineDevConsoleTo: "Konzole Line Developers - {0}",
-    "Basic Settings": "Obecné nastavení",
-    "User ID": "ID uživatele",
-    "Messaging API": "Messaging API",
-    wayToGetLineChannelToken: "Nejprve otevřete {0}, vytvořte poskytovatele a kanál (Messaging API). Poté můžete získat přístupový token ke kanálu a ID uživatele, v sekci uvedené výše.",
-    "Icon URL": "URL adresa ikony",
-    aboutIconURL: "Pro přepsání výchozího profilového obrázku můžete do pole \"URL adresa ikony\" zadat odkaz na obrázek. Nebude použito, pokud je nastavena ikona smajlíka.",
-    aboutMattermostChannelName: "Výchozí kanál, do kterého jsou zasílány Webhook příspěvky, můžete přepsat zadáním názvu kanálu do pole \"Název kanálu\". Tato možnost musí být povolena v nastavení Mattermost Webhooku. Příklad: #jiny-kanal",
-    matrix: "Matrix",
-    promosmsTypeEco: "SMS ECO – levné, ale pomalé a často přetížené. Omezeno pouze na polské příjemce.",
-    promosmsTypeFlash: "SMS FLASH –zpráva se automaticky zobrazí na zařízení příjemce. Omezeno pouze na polské příjemce.",
-    promosmsTypeFull: "SMS FULL – prémiová úroveň SMS. Můžete definovat odesílatele (vyžadována registrace jména). Spolehlivý pro výstrahy.",
-    promosmsTypeSpeed: "SMS SPEED – nejvyšší priorita v systému. Velmi rychlé a spolehlivé, ale nákladné (přibližně dvojnásobek ceny SMS FULL).",
-    promosmsPhoneNumber: "Telefonní číslo (polští příjemci mohou vynechat telefonní předvolbu)",
-    promosmsSMSSender: "Odesílatel SMS: Předem zaregistrovaný název nebo jeden z výchozích: InfoSMS, SMS Info, MaxSMS, INFO, SMS",
-    "Feishu WebHookUrl": "Feishu WebHookURL",
-    matrixHomeserverURL: "URL adresa domácího serveru (s http(s):// a volitelně portem)",
-    "Internal Room Id": "ID interní místnosti",
-    matrixDesc1: "ID interní místnosti naleznete v Matrix klientovi v rozšířeném nastavení místnosti. Mělo by být ve tvaru !QMdRCpUIfLwsfjxye6:home.server.",
-    matrixDesc2: "Důrazně doporučujeme vytvořit nového uživatele a nepoužívat váš vlastní přístupový token uživatele Matrix. Pomocí něj je možné získat přístup k vašemu účtu a všem místnostem, ke kterým jste se připojili. Místo toho vytvořte nového uživatele a pozvěte jej pouze do místnosti, do které chcete oznámení dostávat. Přístupový token můžete získat spuštěním {0}",
-    Method: "Metoda",
-    Body: "Tělo",
-    Headers: "Hlavičky",
-    PushUrl: "Push URL",
-    HeadersInvalidFormat: "Hlaviča žádosti není platný JSON: ",
-    BodyInvalidFormat: "Text žádosti není platný JSON: ",
-    "Monitor History": "Historie dohledu",
-    clearDataOlderThan: "Historie dohledu bude uchovávána po dobu {0} dní.",
-    PasswordsDoNotMatch: "Hesla se neshodují.",
-    records: "záznamů",
-    "One record": "Jeden záznam",
-    steamApiKeyDescription: "Pro monitorování Steam Game Serveru je nutné zadat Steam Web-API klíč. Svůj API klíč získáte na následující stránce: ",
-    "Current User": "Aktuálně přihlášený uživatel",
-    topic: "Topic",
-    topicExplanation: "MQTT topic, který chcete sledovat",
-    successMessage: "Zpráva o úspěchu",
-    successMessageExplanation: "MQTT zpráva považovaná za úspěšnou",
-    recent: "Poslední",
-    Done: "Hotovo",
-    Info: "Informace",
-    Security: "Bezpečnost",
-    "Steam API Key": "API klíč služby Steam",
-    "Shrink Database": "Zmenšit databázi",
-    "Pick a RR-Type...": "Vyberte typ záznamu o prostředku…",
-    "Pick Accepted Status Codes...": "Vyberte stavové kódy, které chcete akceptovat…",
-    Default: "Výchozí",
-    "HTTP Options": "Možnosti protokolu HTTP",
-    "Create Incident": "Vytvořit incident",
-    Title: "Předmět",
-    Content: "Obsah",
-    Style: "Styl",
-    info: "informace",
-    warning: "upozornění",
-    danger: "riziko",
-    error: "chyba",
-    critical: "kritické",
-    primary: "primární",
-    light: "světlý",
-    dark: "tmavý",
-    Post: "Publikovat",
-    "Please input title and content": "Zadejte prosím název a obsah",
-    Created: "Vytvořen",
-    "Last Updated": "Poslední aktualizace",
-    Unpin: "Odepnout",
-    "Switch to Light Theme": "Přepnout na světlý motiv",
-    "Switch to Dark Theme": "Přepnout na tmavý motiv",
-    "Show Tags": "Zobrazit štítky",
-    "Hide Tags": "Skrýt štítky",
-    Description: "Popis",
-    "No monitors available.": "Není dostupný žádný dohled.",
-    "Add one": "Přidat jeden",
-    "No Monitors": "Žádný dohled",
-    "Untitled Group": "Skupina bez názvu",
-    Services: "Služby",
-    Discard: "Zahodit",
-    Cancel: "Zrušit",
-    "Powered by": "Poskytuje",
-    shrinkDatabaseDescription: "Pomocí této možnosti provedete příkaz VACUUM nad SQLite databází. Pokud byla databáze vytvořena po vydání verze 1.10.0, AUTO_VACUUM je již povolena a tato akce není vyžadována.",
-    serwersms: "SerwerSMS.pl",
-    serwersmsAPIUser: "API uživatelské jméno (včetně předpony webapi_)",
-    serwersmsAPIPassword: "API heslo",
-    serwersmsPhoneNumber: "Telefonní číslo",
-    serwersmsSenderName: "Odesílatel SMS (registrováno prostřednictvím zákaznického portálu)",
-    "stackfield": "Stackfield",
-    Customize: "Přizpůsobit",
-    "Custom Footer": "Vlastní patička",
-    "Custom CSS": "Vlastní CSS",
-    smtpDkimSettings: "Nastavení DKIM",
-    smtpDkimDesc: "Informace o použití naleznete v {0} Nodemailer DKIM.",
-    documentation: "dokumentaci",
-    smtpDkimDomain: "Název domény",
-    smtpDkimKeySelector: "Selektor klíče",
-    smtpDkimPrivateKey: "Privátní klíč",
-    smtpDkimHashAlgo: "Hashovací algoritmus (volitelné)",
-    smtpDkimheaderFieldNames: "Podepisovat tyto hlavičky (volitelné)",
-    smtpDkimskipFields: "Nepodepisovat tyto hlavičky (volitelné)",
-    wayToGetPagerDutyKey: "Získat jej můžete v sekci Service -> Service Directory -> (vyberte službu) -> Integrations -> Add integration. Následně vyhledejte \"Events API V2\". Více informace naleznete na adrese {0}",
-    "Integration Key": "Integration Key",
-    "Integration URL": "Integration URL",
-    "Auto resolve or acknowledged": "Auto resolve or acknowledged",
-    "do nothing": "do nothing",
-    "auto acknowledged": "auto acknowledged",
-    "auto resolve": "auto resolve",
-    gorush: "Gorush",
-    alerta: "Alerta",
-    alertaApiEndpoint: "API Endpoint",
-    alertaEnvironment: "Prostředí",
-    alertaApiKey: "API Key",
-    alertaAlertState: "Stav upozornění",
-    alertaRecoverState: "Stav obnovení",
-    deleteStatusPageMsg: "Opravdu chcete odstranit tuto stavovou stránku?",
-    Proxies: "Proxy",
-    default: "Výchozí",
-    enabled: "Zapnuto",
-    setAsDefault: "Nastavit jako výchozí",
-    deleteProxyMsg: "Opravdu chcete odstranit tuto proxy ze všech dohledů?",
-    proxyDescription: "Pro zajištění funkčnosti musí být proxy přiřazena dohledům.",
-    enableProxyDescription: "Tato proxy neovlivní žádosti dohledu do doby, než ji aktivujete. Změnou tohoto nastavení dočasně zakážete použití proxy ve všech dohledech.",
-    setAsDefaultProxyDescription: "Tato proxy se použije pro všechny nové dohledy. V případě potřeby můžete její využívání zakázat v konkrétním dohledu.",
-    "Certificate Chain": "Řetězec certifikátu",
-    Valid: "Platný",
-    Invalid: "Neplatný",
-    AccessKeyId: "AccessKey ID",
-    SecretAccessKey: "AccessKey Secret",
-    PhoneNumbers: "PhoneNumbers",
-    TemplateCode: "TemplateCode",
-    SignName: "SignName",
-    "Sms template must contain parameters: ": "Sms template must contain parameters: ",
-    "Bark Endpoint": "Bark Endpoint",
-    "Bark Group": "Bark Group",
-    "Bark Sound": "Bark Sound",
-    WebHookUrl: "WebHookUrl",
-    SecretKey: "SecretKey",
-    "For safety, must use secret key": "Z důvodu bezpečnosti použijte secret key",
-    "Device Token": "Token zařízení",
-    Platform: "Platforma",
-    iOS: "iOS",
-    Android: "Android",
-    Huawei: "Huawei",
-    High: "Vysoký",
-    Retry: "Opakovat",
-    Topic: "Topic",
-    "WeCom Bot Key": "WeCom Bot Key",
-    "Setup Proxy": "Nastavit proxy",
-    "Proxy Protocol": "Protokol proxy",
-    "Proxy Server": "Proxy Server",
-    "Proxy server has authentication": "Proxy server vyžaduje ověření",
-    User: "Uživatel",
-    Installed: "Nainstalováno",
-    "Not installed": "Nenainstalováno",
-    Running: "Běží",
-    "Not running": "Neběží",
-    "Remove Token": "Odstranit token",
-    Start: "Spustit",
-    Stop: "Zastavit",
-    "Uptime Kuma": "Uptime Kuma",
-    "Add New Status Page": "Přidat novou stavovou stránku",
-    Slug: "Slug",
-    "Accept characters:": "Přípustné znaky:",
-    startOrEndWithOnly: "Počáteční a koncový znak může být pouze {0}",
-    "No consecutive dashes": "Nesmí se opakovat pomlčky",
-    Next: "Další",
-    "The slug is already taken. Please choose another slug.": "Slug s tímto názvem již existuje. Prosím, zadejte jiný název.",
-    "No Proxy": "Žádná proxy",
-    Authentication: "Ověření",
-    "HTTP Basic Auth": "HTTP Basic ověření",
-    "New Status Page": "Nová stavová stránka",
-    "Page Not Found": "Stránka nenalezena",
-    "Reverse Proxy": "Reverzní proxy",
-    Backup: "Záloha",
-    About: "O programu",
-    wayToGetCloudflaredURL: "(Stáhnout cloudflared z {0})",
-    cloudflareWebsite: "Webová stránka Cloudflare",
-    "Message:": "Zpráva:",
-    "Don't know how to get the token? Please read the guide:": "Nevíte jak získat? Prosím, přečtěte si tuto příručku:",
-    "The current connection may be lost if you are currently connecting via Cloudflare Tunnel. Are you sure want to stop it? Type your current password to confirm it.": "Stávající připojení mohlo být ztraceno, pokud jste připojeni prostřednictvím Cloudflare tunelu. Opravdu jej chcete zastavit? Pro potvrzení zadejte své současné heslo.",
-    "HTTP Headers": "HTTP hlavičky",
-    "Trust Proxy": "Důvěryhodná proxy",
-    "Other Software": "Jiný software",
-    "For example: nginx, Apache and Traefik.": "Například nginx, Apache nebo Traefik.",
-    "Please read": "Prosím, přečtěte si informace na adrese",
-    "Subject:": "Předmět:",
-    "Valid To:": "Platnost do:",
-    "Days Remaining:": "Počet zbývajících dní:",
-    "Issuer:": "Vydavatel:",
-    "Fingerprint:": "Otisk:",
-    "No status pages": "Žádná stavová stránka",
-    "Domain Name Expiry Notification": "Oznámení na blížící se konec platnosti doménového jména",
-    Proxy: "Proxy",
-    "Date Created": "Datum vytvoření",
-    HomeAssistant: "Home Assistant",
-    onebotHttpAddress: "OneBot HTTP adresa",
-    onebotMessageType: "Typ OneBot zprávy",
-    onebotGroupMessage: "Skupinová",
-    onebotPrivateMessage: "Soukromá",
-    onebotUserOrGroupId: "ID skupiny/uživatele",
-    onebotSafetyTips: "Z důvodu bezpečnosti je nutné zadat přístupový token",
-    "PushDeer Key": "PushDeer klíč",
-    "Footer Text": "Text v patičce",
-    "Show Powered By": "Zobrazit \"Poskytuje\"",
-    "Domain Names": "Názvy domén",
-    signedInDisp: "Přihlášen jako {0}",
-    signedInDispDisabled: "Ověření je vypnuté.",
-    RadiusSecret: "Radius Secret",
-    RadiusSecretDescription: "Sdílený tajný klíč mezi klientem a serverem",
-    RadiusCalledStationId: "ID volaného zařízení",
-    RadiusCalledStationIdDescription: "Identifikátor volaného zařízení",
-    RadiusCallingStationId: "ID volajícího zařízení",
-    RadiusCallingStationIdDescription: "Identifikátor volajícího zařízení",
-    "Certificate Expiry Notification": "Oznámení na blížící se konec platnosti certifikátu",
-    "API Username": "API Username",
-    "API Key": "API Key",
-    "Recipient Number": "Číslo příjemce",
-    "From Name/Number": "Jméno/číslo odesílatele",
-    "Leave blank to use a shared sender number.": "Ponechte prázdné, pokud chcete použít číslo sdíleného příjemce.",
-    "Octopush API Version": "Octopush API verze",
-    "Legacy Octopush-DM": "Legacy Octopush-DM",
-    endpoint: "endpoint",
-    octopushAPIKey: "\"API key\" ze sekce HTTP API credentials na nástěnce",
-    octopushLogin: "\"Login\" ze sekce HTTP API credentials na nástěnce",
-    promosmsLogin: "API Login Name",
-    promosmsPassword: "API Password",
-    "pushoversounds pushover": "Pushover (výchozí)",
-    "pushoversounds bike": "Bike",
-    "pushoversounds bugle": "Bugle",
-    "pushoversounds cashregister": "Cash Register",
-    "pushoversounds classical": "Classical",
-    "pushoversounds cosmic": "Cosmic",
-    "pushoversounds falling": "Falling",
-    "pushoversounds gamelan": "Gamelan",
-    "pushoversounds incoming": "Incoming",
-    "pushoversounds intermission": "Intermission",
-    "pushoversounds magic": "Magic",
-    "pushoversounds mechanical": "Mechanical",
-    "pushoversounds pianobar": "Piano Bar",
-    "pushoversounds siren": "Siren",
-    "pushoversounds spacealarm": "Space Alarm",
-    "pushoversounds tugboat": "Tug Boat",
-    "pushoversounds alien": "Alien Alarm (dlouhý)",
-    "pushoversounds climb": "Climb (dlouhý)",
-    "pushoversounds persistent": "Persistent (dlouhý)",
-    "pushoversounds echo": "Pushover Echo (dlouhý)",
-    "pushoversounds updown": "Up Down (dlouhý)",
-    "pushoversounds vibrate": "Pouze vibrace",
-    "pushoversounds none": "Žádný (ticho)",
-    pushyAPIKey: "Secret API Key",
-    pushyToken: "Token zařízení",
-    "Show update if available": "Upozornit na aktualizace, pokud jsou k dispozici",
-    "Also check beta release": "Kontrolovat také dostupnost beta verzí",
-    "Using a Reverse Proxy?": "Používáte reverzní proxy?",
-    "Check how to config it for WebSocket": "Zjistěte, jak ji nakonfigurovat pro WebSockety",
-    "Steam Game Server": "Steam Game Server",
-    "Most likely causes:": "Nejčastější důvody:",
-    "The resource is no longer available.": "Zdroj již není k dispozici.",
-    "There might be a typing error in the address.": "Při zadávání adresy jste udělali chybu.",
-    "What you can try:": "Co můžete vyzkoušet:",
-    "Retype the address.": "Znovu zadat adresu.",
-    "Go back to the previous page.": "Vrátit se na předchozí stránku.",
-    "Coming Soon": "Připravujeme",
-    wayToGetClickSendSMSToken: "API Username a API Key získáte na adrese {0} .",
-    "Connection String": "Connection String",
-    Query: "Dotaz",
-    settingsCertificateExpiry: "Platnost TLS certifikátu",
-    certificationExpiryDescription: "Aktivovat oznámení nad HTTPS dohledy, pokud platnost TLS certifikátu vyprší za:",
-    "Setup Docker Host": "Nastavit Docker hostitele",
-    "Connection Type": "Typ připojení",
-    "Docker Daemon": "Docker Daemon",
-    deleteDockerHostMsg: "Opravdu chcete odstranit tohoto docker hostitele ze všech dohledů?",
-    socket: "Socket",
-    tcp: "TCP / HTTP",
-    "Docker Container": "Docker kontejner",
-    "Container Name / ID": "ID / název kontejneru",
-    "Docker Host": "Docker hostitel",
-    "Docker Hosts": "Docker hostitelé",
-    "ntfy Topic": "ntfy Topic",
-    "Domain": "Doména",
-    "Workstation": "Pracovní stanice",
-    disableCloudflaredNoAuthMsg: "Používáte režim bez ověření, heslo není vyžadováno.",
-    trustProxyDescription: "Důvěřovat 'X-Forwarded-*' hlavičkám. Pokud chcete získat správnou IP adresu klientů a vaše instance Uptime Kuma je schována za Nginx nebo Apache, měli byste tuto možnost zapnout.",
-    wayToGetLineNotifyToken: "Přístupový token můžete získat na adrese {0}",
-    Examples: "Příklady",
-    "Home Assistant URL": "Home Assistant URL",
-    "Long-Lived Access Token": "Dlouhodobý přístupový token",
-    "Long-Lived Access Token can be created by clicking on your profile name (bottom left) and scrolling to the bottom then click Create Token. ": "Pro vytvoření dlouhodobého přístupový tokenu klikněte na název svého profilu (v levém dolním rohu) a následně v dolní části stránky klikněte na tlačítko Create Token. ",
-    "Notification Service": "Oznamovací služba",
-    "default: notify all devices": "výchozí: upozornit všechny zařízení",
-    "A list of Notification Services can be found in Home Assistant under \"Developer Tools > Services\" search for \"notification\" to find your device/phone name.": "Seznam dostupných oznamovacích služeb naleznete v Home Assistant v sekci \"Developer Tools > Services\", kde vyhledejte \"notification\" pro zjištění názvu zařízení.",
-    "Automations can optionally be triggered in Home Assistant:": "Automatizaci můžete volitelně aktivovat prostřednictvím Home Assistant:",
-    "Trigger type:": "Typ podmínky spuštění:",
-    "Event type:": "Typ události:",
-    "Event data:": "Data události:",
-    "Then choose an action, for example switch the scene to where an RGB light is red.": "Následně vyberte akci, například přepnutí scény z RGB světla na červenou.",
-    "Frontend Version": "Verze frontendu",
-    "Frontend Version do not match backend version!": "Verze frontendu neodpovídá verzi backendu!",
-    "Base URL": "Primární URL adresa",
-    goAlertInfo: "GoAlert je aplikace s otevřeným zdrojovým kódem pro plánování hovorů, automatické eskalace a upozornění (jako jsou SMS nebo hlasové hovory). Automaticky zapojte správnou osobu, správným způsobem a ve správný čas! {0}",
-    goAlertIntegrationKeyInfo: "Obecný API integrační klíč pro danou službu ve formátu \"aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee\" se obvykle nachází ve zkopírované URL jako hodnota parametru token.",
-    goAlert: "GoAlert",
-    backupOutdatedWarning: "Zastaralé: V poslední době byla funkčnost aplikace značně rozšířena, nicméně součást pro zálohování nepokrývá všechny možnosti. Z tohoto důvodu není možné vygenerovat úplnou zálohu a zajistit obnovení všech dat.",
-    backupRecommend: "Prosím, zálohujte si ručně celý svazek nebo datovou složku (./data/).",
-    "Optional": "Volitelný",
-    squadcast: "Squadcast",
-    SendKey: "SendKey",
-    "SMSManager API Docs": "SMSManager API Docs ",
-    "Gateway Type": "Gateway Typ",
-    SMSManager: "SMSManager",
-    "You can divide numbers with": "Čísla můžete dělit pomocí",
-    "or": "nebo",
-    recurringInterval: "Interval",
-    "Recurring": "Recurring",
-    strategyManual: "Aktivní/Neaktivní Ručně",
-    warningTimezone: "Používá se časové pásmo serveru",
-    weekdayShortMon: "Po",
-    weekdayShortTue: "Út",
-    weekdayShortWed: "St",
-    weekdayShortThu: "Čt",
-    weekdayShortFri: "Pá",
-    weekdayShortSat: "So",
-    weekdayShortSun: "Ne",
-    dayOfWeek: "Den v týdnu",
-    dayOfMonth: "Den v měsíci",
-    lastDay: "Poslední den",
-    lastDay1: "1. poslední den v měsíci",
-    lastDay2: "2. poslední den v měsíci",
-    lastDay3: "3. poslední den v měsíci",
-    lastDay4: "4. poslední den v měsíci",
-    "No Maintenance": "Žádna údržba",
-    pauseMaintenanceMsg: "Jsi si jistý, že chceš pozastavit údržbu?",
-    "maintenanceStatus-under-maintenance": "Údržba",
-    "maintenanceStatus-inactive": "Neaktivní",
-    "maintenanceStatus-scheduled": "Naplánováno",
-    "maintenanceStatus-ended": "Ukončeno",
-    "maintenanceStatus-unknown": "Neznámý",
-    "Display Timezone": "Zobrazit časové pásmo",
-    "Server Timezone": "Časové pásmo serveru",
-    statusPageMaintenanceEndDate: "Konec",
-    IconUrl: "Adresa URL ikony",
-    "Enable DNS Cache": "Povolit DNS Cache",
-    "Enable": "Povolit",
-    "Disable": "Zakázat",
-    dnsCacheDescription: "V některých prostředích IPv6 nemusí fungovat. Pokud narazíte na nějaké problémy, vypněte jej.",
-};
diff --git a/src/languages/da-DK.js b/src/languages/da-DK.js
deleted file mode 100644
index 83cd97bae..000000000
--- a/src/languages/da-DK.js
+++ /dev/null
@@ -1,355 +0,0 @@
-export default {
-    languageName: "Danish (Danmark)",
-    Settings: "Indstillinger",
-    Dashboard: "Betjeningspanel",
-    "New Update": "Opdatering tilgængelig",
-    Language: "Sprog",
-    Appearance: "Udseende",
-    Theme: "Tema",
-    General: "Generelt",
-    Version: "Version",
-    "Check Update On GitHub": "Tjek efter opdateringer på Github",
-    List: "Liste",
-    Add: "Tilføj",
-    "Add New Monitor": "Tilføj ny Overvåger",
-    "Quick Stats": "Oversigt",
-    Up: "Aktiv",
-    Down: "Inaktiv",
-    Pending: "Afventer",
-    Unknown: "Ukendt",
-    Pause: "Stands",
-    pauseDashboardHome: "Standset",
-    Name: "Navn",
-    Status: "Status",
-    DateTime: "Dato / Tid",
-    Message: "Beskeder",
-    "No important events": "Inden vigtige begivenheder",
-    Resume: "Fortsæt",
-    Edit: "Rediger",
-    Delete: "Slet",
-    Current: "Aktuelt",
-    Uptime: "Oppetid",
-    "Cert Exp.": "Certifikatets udløb",
-    day: "Dag | Dage",
-    "-day": "-Dage",
-    hour: "Timer",
-    "-hour": "-Timer",
-    checkEverySecond: "Tjek hvert {0} sekund",
-    Response: "Respons",
-    Ping: "Ping",
-    "Monitor Type": "Overvåger Type",
-    Keyword: "Nøgleord",
-    "Friendly Name": "Visningsnavn",
-    URL: "URL",
-    Hostname: "Hostname",
-    Port: "Port",
-    "Heartbeat Interval": "Taktinterval",
-    Retries: "Gentagelser",
-    retriesDescription: "Maksimalt antal gentagelser, før tjenesten markeres som inaktiv og sender en meddelelse.",
-    Advanced: "Avanceret",
-    ignoreTLSError: "Ignorere TLS/SSL web fejl",
-    "Upside Down Mode": "Omvendt tilstand",
-    upsideDownModeDescription: "Håndter tilstanden omvendt. Hvis tjenesten er tilgængelig, vises den som inaktiv.",
-    "Max. Redirects": "Maks. Omdirigeringer",
-    maxRedirectDescription: "Maksimalt antal omdirigeringer, der skal følges. Indstil til 0 for at deaktivere omdirigeringer.",
-    "Accepted Status Codes": "Tilladte HTTP-Statuskoder",
-    acceptedStatusCodesDescription: "Vælg de statuskoder, der stadig skal vurderes som vellykkede.",
-    Save: "Gem",
-    Notifications: "Underretninger",
-    "Not available, please setup.": "Ikke tilgængelige, opsæt venligst.",
-    "Setup Notification": "Opsæt underretninger",
-    Light: "Lys",
-    Dark: "Mørk",
-    Auto: "Auto",
-    "Theme - Heartbeat Bar": "Tema - Tidslinje",
-    Normal: "Normal",
-    Bottom: "Bunden",
-    None: "Ingen",
-    Timezone: "Tidszone",
-    "Search Engine Visibility": "Søgemaskine synlighed",
-    "Allow indexing": "Tillad indeksering",
-    "Discourage search engines from indexing site": "Frabed søgemaskiner at indeksere webstedet",
-    "Change Password": "Ændre adgangskode",
-    "Current Password": "Nuværende adgangskode",
-    "New Password": "Ny adgangskode",
-    "Repeat New Password": "Gentag den nye adgangskode",
-    passwordNotMatchMsg: "Adgangskoderne er ikke ens.",
-    "Update Password": "Opdater adgangskode",
-    "Disable Auth": "Deaktiver autentificering",
-    "Enable Auth": "Aktiver autentificering",
-    Logout: "Log ud",
-    notificationDescription: "Tildel underretninger til Overvåger(e), så denne funktion træder i kraft.",
-    Leave: "Verlassen",
-    "I understand, please disable": "Jeg er indforstået, deaktiver venligst",
-    Confirm: "Bekræft",
-    Yes: "Ja",
-    No: "Nej",
-    Username: "Brugernavn",
-    Password: "Adgangskode",
-    "Remember me": "Husk mig",
-    Login: "Log ind",
-    "No Monitors, please": "Ingen Overvågere",
-    "add one": "tilføj en",
-    "Notification Type": "Underretningstype",
-    Email: "E-Mail",
-    Test: "Test",
-    "Certificate Info": "Certifikatoplysninger",
-    keywordDescription: "Søg efter et søgeord i almindelig HTML- eller JSON -output. Bemærk, at der skelnes mellem store og små bogstaver.",
-    deleteMonitorMsg: "Er du sikker på, at du vil slette overvågeren?",
-    deleteNotificationMsg: "Er du sikker på, at du vil slette denne underretning for alle overvågere? ",
-    resolverserverDescription: "Cloudflare er standardserveren, den kan til enhver tid ændres.",
-    "Resolver Server": "Navne-server",
-    rrtypeDescription: "Vælg den type RR, du vil overvåge.",
-    "Last Result": "Seneste resultat",
-    pauseMonitorMsg: "Er du sikker på, at du vil standse Overvågeren?",
-    "Create your admin account": "Opret din administratorkonto",
-    "Repeat Password": "Gentag adgangskoden",
-    "Resource Record Type": "Resource Record Type",
-    respTime: "Resp. Tid (ms)",
-    notAvailableShort: "N/A",
-    Create: "Opret",
-    clearEventsMsg: "Er du sikker på vil slette alle events for denne Overvåger?",
-    clearHeartbeatsMsg: "Er du sikker på vil slette alle hjerteslag for denne Overvåger?",
-    confirmClearStatisticsMsg: "Vil du helt sikkert slette ALLE statistikker?",
-    "Clear Data": "Ryd Data",
-    Events: "Events",
-    Heartbeats: "Hjerteslag",
-    "Auto Get": "Auto-hent",
-    enableDefaultNotificationDescription: "For hver ny overvåger aktiveres denne underretning som standard. Du kan stadig deaktivere underretningen separat for hver skærm.",
-    "Default enabled": "Standard aktiveret",
-    "Also apply to existing monitors": "Anvend også på eksisterende overvågere",
-    Export: "Eksport",
-    Import: "Import",
-    backupDescription: "Du kan sikkerhedskopiere alle Overvågere og alle underretninger til en JSON-fil.",
-    backupDescription2: "PS: Historik og hændelsesdata er ikke inkluderet.",
-    backupDescription3: "Følsom data, f.eks. underretnings-tokener, er inkluderet i eksportfilen. Gem den sikkert.",
-    alertNoFile: "Vælg en fil der skal importeres.",
-    alertWrongFileType: "Vælg venligst en JSON-fil.",
-    twoFAVerifyLabel: "Indtast venligst dit token for at bekræfte, at 2FA fungerer",
-    tokenValidSettingsMsg: "Token er gyldigt! Du kan nu gemme 2FA -indstillingerne.",
-    confirmEnableTwoFAMsg: "Er du sikker på at du vil aktivere 2FA?",
-    confirmDisableTwoFAMsg: "Er du sikker på at du vil deaktivere 2FA?",
-    "Apply on all existing monitors": "Anvend på alle eksisterende overvågere",
-    "Verify Token": "Verificere Token",
-    "Setup 2FA": "Opsæt 2FA",
-    "Enable 2FA": "Aktiver 2FA",
-    "Disable 2FA": "Deaktiver 2FA",
-    "2FA Settings": "2FA Indstillinger",
-    "Two Factor Authentication": "To-Faktor Autentificering",
-    Active: "Aktive",
-    Inactive: "Inaktive",
-    Token: "Token",
-    "Show URI": "Vis URI",
-    "Clear all statistics": "Ryd alle Statistikker",
-    retryCheckEverySecond: "Prøv igen hvert {0} sekund.",
-    importHandleDescription: "Vælg 'Spring over eksisterende', hvis du vil springe over hver overvåger eller underretning med samme navn. 'Overskriv' sletter alle eksisterende overvågere og underretninger.",
-    confirmImportMsg: "Er du sikker på at importere sikkerhedskopien? Sørg for, at du har valgt den rigtige importindstilling.",
-    "Heartbeat Retry Interval": "Hjerteslag Gentagelsesinterval",
-    "Import Backup": "Importer Backup",
-    "Export Backup": "Eksporter Backup",
-    "Skip existing": "Spring over eksisterende",
-    Overwrite: "Overskriv",
-    Options: "Valgmuligheder",
-    "Keep both": "Behold begge",
-    Tags: "Etiketter",
-    "Add New below or Select...": "Tilføj Nyt nedenfor eller Vælg ...",
-    "Tag with this name already exist.": "Et Tag med dette navn findes allerede.",
-    "Tag with this value already exist.": "Et Tag med denne værdi findes allerede.",
-    color: "farve",
-    "value (optional)": "værdi (valgfri)",
-    Gray: "Grå",
-    Red: "Rød",
-    Orange: "Orange",
-    Green: "Grøn",
-    Blue: "Blå",
-    Indigo: "Indigo",
-    Purple: "Lilla",
-    Pink: "Pink",
-    "Search...": "Søg...",
-    "Avg. Ping": "Gns. Ping",
-    "Avg. Response": "Gns. Respons",
-    "Entry Page": "Entry Side",
-    statusPageNothing: "Intet her, tilføj venligst en Gruppe eller en Overvåger.",
-    "No Services": "Ingen Tjenester",
-    "All Systems Operational": "Alle Systemer i Drift",
-    "Partially Degraded Service": "Delvist Forringet Service",
-    "Degraded Service": "Forringet Service",
-    "Add Group": "Tilføj Gruppe",
-    "Add a monitor": "Tilføj en Overvåger",
-    "Edit Status Page": "Rediger Statusside",
-    "Go to Dashboard": "Gå til Betjeningspanel",
-    "Status Page": "Statusside",
-    "Status Pages": "Statusside",
-    telegram: "Telegram",
-    webhook: "Webhook",
-    smtp: "Email (SMTP)",
-    discord: "Discord",
-    teams: "Microsoft Teams",
-    signal: "Signal",
-    gotify: "Gotify",
-    slack: "Slack",
-    "rocket.chat": "Rocket.chat",
-    pushover: "Pushover",
-    pushy: "Pushy",
-    octopush: "Octopush",
-    promosms: "PromoSMS",
-    lunasea: "LunaSea",
-    apprise: "Apprise (Understøtter 50+ Notifikationstjenester)",
-    pushbullet: "Pushbullet",
-    line: "Line Messenger",
-    mattermost: "Mattermost",
-    "Primary Base URL": "Primær Basis-URL",
-    "Push URL": "Push URL",
-    needPushEvery: "Du bør kalde denne webadresse hvert {0} sekund.",
-    pushOptionalParams: "Valgfrie parametre: {0}",
-    defaultNotificationName: "Min {notification} Advarsel ({number})",
-    here: "her",
-    Required: "Påkrævet",
-    "Bot Token": "Bot Token",
-    wayToGetTelegramToken: "Du kan få et token fra {0}.",
-    "Chat ID": "Chat ID",
-    supportTelegramChatID: "Support Direct Chat / Group / Channel's Chat ID",
-    wayToGetTelegramChatID: "Du kan få dit chat-ID ved at sende en besked til bot'en og gå til denne URL for at se chat_id'et:",
-    "YOUR BOT TOKEN HERE": "DIT BOT TOKEN HER",
-    chatIDNotFound: "Chat-ID blev ikke fundet; send venligst en besked til denne bot først ",
-    "Post URL": "Post URL",
-    "Content Type": "Indholdstype",
-    webhookJsonDesc: "{0} er god til alle moderne HTTP-servere som f.eks Express.js",
-    webhookFormDataDesc: "{multipart} er god til PHP. JSON'en skal parses med {decodeFunction}",
-    secureOptionNone: "Ingen / STARTTLS (25, 587)",
-    secureOptionTLS: "TLS (465)",
-    "Ignore TLS Error": "Ignorer TLS-fejl",
-    "From Email": "Afsender Email",
-    emailCustomSubject: "Brugerdefineret Emne",
-    "To Email": "Modtager Email",
-    smtpCC: "CC",
-    smtpBCC: "BCC",
-    "Discord Webhook URL": "Discord Webhook URL",
-    wayToGetDiscordURL: "Du kan få dette ved at gå til Serverindstillinger -> Integrationer -> Opret webhook ",
-    "Bot Display Name": "Bot Visningsnavn",
-    "Prefix Custom Message": "Præfiks Brugerdefineret Besked",
-    "Hello @everyone is...": "Hello {'@'}everyone is...",
-    "Webhook URL": "Webhook URL",
-    wayToGetTeamsURL: "Du kan lære, hvordan du laver en webhook URL {0}.",
-    Number: "Nummer",
-    Recipients: "Modtagere",
-    needSignalAPI: "Du skal have en Signal-klient med REST API.",
-    wayToCheckSignalURL: "Du kan tjekke denne URL for at se, hvordan du konfigurerer en:",
-    signalImportant: "VIGTIGT: Du kan ikke blande grupper og numre i modtagere!",
-    "Application Token": "Program Token",
-    "Server URL": "Server URL",
-    Priority: "Prioritet",
-    "Icon Emoji": "Icon Emoji",
-    "Channel Name": "Kanalnavn",
-    "Uptime Kuma URL": "Uptime Kuma URL",
-    aboutWebhooks: "Mere info om Webhooks på: {0}",
-    aboutChannelName: "Indtast kanalnavnet i {0} Kanalnavn feltet, hvis du vil omgå Webhook-kanalen. Eks: #anden-kanal",
-    aboutKumaURL: "Hvis du efterlader Uptime Kuma URL-feltet tomt, vil det som standard gå til projektets GitHub-siden.",
-    emojiCheatSheet: "Emoji cheat sheet: {0}",
-    clicksendsms: "ClickSend SMS",
-    "User Key": "Bruger-Nøgle",
-    Device: "Enhed",
-    "Message Title": "Besked Titel",
-    "Notification Sound": "Notifikationslyd",
-    "More info on:": "Mere info på: {0}",
-    pushoverDesc1: "Nødprioritet (2) har som standard 30 sekunders timeout mellem genforsøg og udløber efter 1 time.",
-    pushoverDesc2: "Hvis du vil sende meddelelser til forskellige enheder, skal du udfylde feltet Enhed.",
-    "SMS Type": "SMS Type",
-    octopushTypePremium: "Premium (Hurtig - anbefales til advarsel)",
-    octopushTypeLowCost: "Lavpris (Langsom - nogle gange blokeret af operatøren)",
-    checkPrice: "Tjek {0} priser:",
-    apiCredentials: "API legitimationsoplysninger",
-    octopushLegacyHint: "Bruger du den ældre version af Octopush (2011-2020) eller den nye version?",
-    "Check octopush prices": "Tjek octopush priser {0}.",
-    octopushPhoneNumber: "Telefonnummer (intl format, f.eks : +4512345678) ",
-    octopushSMSSender: "SMS Afsender Navn : 3-11 alfanumeriske tegn og mellemrum (a-zA-Z0-9)",
-    "LunaSea Device ID": "LunaSea Enhed-ID",
-    "Apprise URL": "Apprise URL",
-    "Example:": "Eksempel: {0}",
-    "Read more:": "Læs mere: {0}",
-    "Status:": "Status: {0}",
-    "Read more": "Læs mere",
-    appriseInstalled: "Apprise er installeret.",
-    appriseNotInstalled: "Apprise er ikke installeret. {0}",
-    "Access Token": "Access Token",
-    "Channel access token": "kanaladgangstoken",
-    "Line Developers Console": "Line Udviklerkonsol",
-    lineDevConsoleTo: "Line Udviklerkonsol - {0}",
-    "Basic Settings": "Basisindstillinger",
-    "User ID": "Bruger-ID",
-    "Messaging API": "Messaging API",
-    wayToGetLineChannelToken: "Tilgå først {0}, opret en udbyder og kanal (Messaging API), så kan du få kanaladgangstoken'et og bruger-ID'et fra de ovennævnte menupunkter.",
-    "Icon URL": "Ikon URL",
-    aboutIconURL: "Du kan angive et link til et billede i \"Ikon URL\" for at tilsidesætte standardprofilbilledet. Vil ikke blive brugt, hvis Ikon Emoji er angivet.",
-    aboutMattermostChannelName: "Du kan tilsidesætte standardkanalen, som Webhoo'en sender til ved at indtaste kanalnavnet i feltet \"Kanalnavn\". Dette skal aktiveres i Mattermost Webhook-indstillingerne. Eks: #anden-kanal",
-    matrix: "Matrix",
-    promosmsTypeEco: "SMS ECO - billig, men langsom og ofte overbelastet. Begrænset kun til polske modtagere.",
-    promosmsTypeFlash: "SMS FLASH - Beskeden vises automatisk på modtagerenheden. Begrænset kun til polske modtagere.",
-    promosmsTypeFull: "SMS FULL - Premium-niveau af SMS, Du kan bruge dit \"Sender Name\" (Du skal først registrere navn). Pålidelig til advarsler.",
-    promosmsTypeSpeed: "SMS SPEED - Højeste prioritet i systemet. Meget hurtig og pålidelig, men dyr (ca. to gange af SMS FULL pris).",
-    promosmsPhoneNumber: "Telefonnummer (polske numre behøver ikke angive områdenumre)",
-    promosmsSMSSender: "SMS Sender Name : Forudregistreret navn eller en af standarderne: InfoSMS, SMS Info, MaxSMS, INFO, SMS",
-    "Feishu WebHookUrl": "Feishu WebHookURL",
-    matrixHomeserverURL: "Hjemmeserver-URL (med http(s):// og eventuel port)",
-    "Internal Room Id": "Intern Rum-ID",
-    matrixDesc1: "Du kan finde det interne rum-ID ved at se i det avancerede afsnit af rumindstillingerne i din Matrix-klient. Det skulle ligne !QMdRCpUIfLwsfjxye6:home.server.",
-    matrixDesc2: "Det anbefales stærkt, at du opretter en ny bruger og ikke bruger din egen Matrix-brugers adgangstoken, da det giver fuld adgang til din konto og alle de rum, du har tilsluttet dig. I stedet skal du oprette en ny bruger og kun invitere den til det rum, du vil modtage meddelelsen i. Du kan få adgangstokenet ved at køre {0}",
-    Method: "Metode",
-    Body: "Body",
-    Headers: "Headers",
-    PushUrl: "Push URL",
-    HeadersInvalidFormat: "\"request headers\"-erne er ikke gyldige JSON: ",
-    BodyInvalidFormat: "\"request body\"-en er ikke gyldige JSON: ",
-    "Monitor History": "Overvåger Historik",
-    clearDataOlderThan: "Gem overvågningshistorikdata i {0} dage.",
-    PasswordsDoNotMatch: "Adgangskoderne stemmer ikke overens.",
-    records: "forekomster",
-    "One record": "Én forekomst",
-    steamApiKeyDescription: "For at overvåge en Steam Game Server skal du bruge en Steam Web-API nøgle. Du kan registrere din API-nøgle her: ",
-    "Current User": "Nuværende Bruger",
-    recent: "Seneste",
-    Done: "Færdig",
-    Info: "Info",
-    Security: "Sikkerhed",
-    "Steam API Key": "Steam API-nøgle",
-    "Shrink Database": "Krymp Database",
-    "Pick a RR-Type...": "Vælg en RR-Type...",
-    "Pick Accepted Status Codes...": "Vælg Accepterede Statuskoder...",
-    Default: "Standard",
-    "HTTP Options": "HTTP Valgmuligheder",
-    "Create Incident": "Opret Annoncering",
-    Title: "Titel",
-    Content: "Indhold",
-    Style: "Type",
-    info: "info",
-    warning: "advarsel",
-    danger: "fare",
-    primary: "primær",
-    light: "lys",
-    dark: "mørk",
-    Post: "Udgiv",
-    "Please input title and content": "Indtast venligst titel og indhold",
-    Created: "Oprettet",
-    "Last Updated": "Sidst Opdateret",
-    Unpin: "Frigør",
-    "Switch to Light Theme": "Skift til Lys Tema",
-    "Switch to Dark Theme": "Skift til Mørkt Tema",
-    "Show Tags": "Vis Etiketter",
-    "Hide Tags": "Skjul Etiketter",
-    Description: "Beskrivelse",
-    "No monitors available.": "No monitors available.",
-    "Add one": "Tilføj en",
-    "No Monitors": "Ingen Overvågere",
-    "Untitled Group": "Unavngivet Gruppe",
-    Services: "Tjenester",
-    Discard: "Kassér",
-    Cancel: "Annullér",
-    "Powered by": "Drevet af",
-    shrinkDatabaseDescription: "Udfør database VACUUM for SQLite. Hvis din database er oprettet efter 1.10.0, er AUTO_VACUUM allerede aktiveret, og denne handling er ikke nødvendig.",
-    serwersms: "SerwerSMS.pl",
-    serwersmsAPIUser: "API Brugernavn (inkl. webapi_ prefix)",
-    serwersmsAPIPassword: "API Adgangskode",
-    serwersmsPhoneNumber: "Telefonnummer",
-    serwersmsSenderName: "SMS Afsender Navn (registreret via kundeportal)",
-    stackfield: "Stackfield",
-};
diff --git a/src/languages/de-CH.js b/src/languages/de-CH.js
deleted file mode 100644
index 922657d03..000000000
--- a/src/languages/de-CH.js
+++ /dev/null
@@ -1,634 +0,0 @@
-export default {
-    languageName: "Deutsch (Schweiz)",
-    Settings: "Einstellungen",
-    Dashboard: "Dashboard",
-    "New Update": "Update verfügbar",
-    Language: "Sprache",
-    Appearance: "Erscheinungsbild",
-    Theme: "Erscheinungsbild",
-    General: "Allgemein",
-    Version: "Version",
-    "Check Update On GitHub": "Auf GitHub nach Updates suchen",
-    List: "Liste",
-    Add: "Hinzufügen",
-    "Add New Monitor": "Neuen Monitor hinzufügen",
-    "Quick Stats": "Übersicht",
-    Up: "Aktiv",
-    Down: "Inaktiv",
-    Pending: "Ausstehend",
-    Unknown: "Unbekannt",
-    Pause: "Pausieren",
-    pauseDashboardHome: "Pausiert",
-    Name: "Name",
-    Status: "Status",
-    DateTime: "Datum / Uhrzeit",
-    Message: "Nachricht",
-    "No important events": "Keine wichtigen Ereignisse",
-    Resume: "Fortsetzen",
-    Edit: "Bearbeiten",
-    Delete: "Löschen",
-    Current: "Aktuell",
-    Uptime: "Verfügbarkeit",
-    "Cert Exp.": "Zertifikatsablauf",
-    day: "Tag | Tage",
-    "-day": "-Tage",
-    hour: "Stunde",
-    "-hour": "-Stunden",
-    checkEverySecond: "Überprüfe alle {0} Sekunden",
-    Response: "Antwortzeit",
-    Ping: "Ping",
-    "Monitor Type": "Monitor-Typ",
-    Keyword: "Suchwort",
-    "Friendly Name": "Anzeigename",
-    URL: "URL",
-    Hostname: "Hostname",
-    Port: "Port",
-    "Heartbeat Interval": "Prüfintervall",
-    Retries: "Wiederholungen",
-    retriesDescription: "Maximale Anzahl von Wiederholungen, bevor der Dienst als inaktiv markiert und eine Benachrichtigung gesendet wird.",
-    Advanced: "Erweitert",
-    ignoreTLSError: "Ignoriere TLS-/SSL-Fehler von Webseiten",
-    "Upside Down Mode": "Umgekehrter Modus",
-    upsideDownModeDescription: "Im umgekehrten Modus wird der Dienst als inaktiv angezeigt, wenn er erreichbar ist.",
-    "Max. Redirects": "Max. Weiterleitungen",
-    maxRedirectDescription: "Maximale Anzahl von Weiterleitungen, denen gefolgt werden soll. Auf 0 setzen, um Weiterleitungen zu deaktivieren.",
-    "Accepted Status Codes": "Erlaubte HTTP-Statuscodes",
-    acceptedStatusCodesDescription: "Statuscodes auswählen, die als erfolgreiche Verbindung gelten sollen.",
-    Save: "Speichern",
-    Notifications: "Benachrichtigungen",
-    "Not available, please setup.": "Nicht verfügbar, bitte einrichten.",
-    "Setup Notification": "Benachrichtigung einrichten",
-    Light: "Hell",
-    Dark: "Dunkel",
-    Auto: "Auto",
-    "Theme - Heartbeat Bar": "Erscheinungsbild - Zeitleiste",
-    Normal: "Normal",
-    Bottom: "Unten",
-    None: "Keine",
-    Timezone: "Zeitzone",
-    "Search Engine Visibility": "Sichtbarkeit für Suchmaschinen",
-    "Allow indexing": "Indizierung zulassen",
-    "Discourage search engines from indexing site": "Suchmaschinen darum bitten, die Seite nicht zu indizieren",
-    "Change Password": "Passwort ändern",
-    "Current Password": "Aktuelles Passwort",
-    "New Password": "Neues Passwort",
-    "Repeat New Password": "Neues Passwort wiederholen",
-    passwordNotMatchMsg: "Passwörter stimmen nicht überein.",
-    "Update Password": "Passwort aktualisieren",
-    "Disable Auth": "Authentifizierung deaktivieren",
-    "Enable Auth": "Authentifizierung aktivieren",
-    "disableauth.message1": "Bist du sicher das du die <strong>Authentifizierung deaktivieren</strong> möchtest?",
-    "disableauth.message2": "Dies ist für Szenarien gedacht, <strong>in denen man eine externe Authentifizierung</strong> vor Uptime Kuma geschaltet hat, wie z.B. Cloudflare Access, Authelia oder andere Authentifizierungsmechanismen.",
-    "Please use this option carefully!": "Bitte mit Vorsicht nutzen.",
-    Logout: "Ausloggen",
-    notificationDescription: "Benachrichtigungen müssen einem Monitor zugewiesen werden, damit diese funktionieren.",
-    Leave: "Verlassen",
-    "I understand, please disable": "Ich verstehe, bitte deaktivieren",
-    Confirm: "Bestätigen",
-    Yes: "Ja",
-    No: "Nein",
-    Username: "Benutzername",
-    Password: "Passwort",
-    "Remember me": "Angemeldet bleiben",
-    Login: "Einloggen",
-    "No Monitors, please": "Keine Monitore, bitte",
-    "add one": "hinzufügen",
-    "Notification Type": "Benachrichtigungsdienst",
-    Email: "E-Mail",
-    Test: "Test",
-    "Certificate Info": "Zertifikatsinformation",
-    keywordDescription: "Ein Suchwort in der HTML- oder JSON-Ausgabe finden. Bitte beachte: es wird zwischen Gross-/Kleinschreibung unterschieden.",
-    deleteMonitorMsg: "Bist du sicher, dass du den Monitor löschen möchtest?",
-    deleteNotificationMsg: "Möchtest du diese Benachrichtigung wirklich für alle Monitore löschen?",
-    resolverserverDescription: "Cloudflare ist als der Standardserver festgelegt. Dieser kann jederzeit geändert werden.",
-    "Resolver Server": "Auflösungsserver",
-    rrtypeDescription: "Wähle den RR-Typ aus, welchen du überwachen möchtest.",
-    "Last Result": "Letztes Ergebnis",
-    pauseMonitorMsg: "Bist du sicher, dass du den Monitor pausieren möchtest?",
-    clearEventsMsg: "Bist du sicher, dass du alle Ereignisse für diesen Monitor löschen möchtest?",
-    clearHeartbeatsMsg: "Bist du sicher, dass du alle Statistiken für diesen Monitor löschen möchtest?",
-    "Clear Data": "Lösche Daten",
-    Events: "Ereignisse",
-    Heartbeats: "Statistiken",
-    confirmClearStatisticsMsg: "Bist du dir sicher, dass du ALLE Statistiken löschen möchtest?",
-    "Create your admin account": "Erstelle dein Admin-Konto",
-    "Repeat Password": "Passwort erneut eingeben",
-    "Resource Record Type": "Ressourcen Record Typ",
-    Export: "Export",
-    Import: "Import",
-    respTime: "Antw.-Zeit (ms)",
-    notAvailableShort: "N/A",
-    "Default enabled": "Standardmässig aktiviert",
-    "Apply on all existing monitors": "Auf alle existierenden Monitore anwenden",
-    enableDefaultNotificationDescription: "Für jeden neuen Monitor wird diese Benachrichtigung standardmässig aktiviert. Die Benachrichtigung kann weiterhin für jeden Monitor separat deaktiviert werden.",
-    Create: "Erstellen",
-    "Auto Get": "Auto Get",
-    backupDescription: "Es können alle Monitore und Benachrichtigungen in einer JSON-Datei gesichert werden.",
-    backupDescription2: "PS: Verlaufs- und Ereignisdaten sind nicht enthalten.",
-    backupDescription3: "Sensible Daten wie Benachrichtigungs-Token sind in der Exportdatei enthalten, bitte bewahre sie sorgfältig auf.",
-    alertNoFile: "Bitte wähle eine Datei zum Importieren aus.",
-    alertWrongFileType: "Bitte wähle eine JSON-Datei aus.",
-    "Clear all statistics": "Lösche alle Statistiken",
-    importHandleDescription: "Wähle 'Vorhandene überspringen' aus, wenn jeder Monitor oder jede Benachrichtigung mit demselben Namen übersprungen werden soll. 'Überschreiben' löscht jeden vorhandenen Monitor sowie Benachrichtigungen.",
-    "Skip existing": "Vorhandene überspringen",
-    Overwrite: "Überschreiben",
-    Options: "Optionen",
-    confirmImportMsg: "Möchtest du das Backup wirklich importieren? Bitte stelle sicher, dass die richtige Import-Option ausgewählt ist.",
-    "Keep both": "Beide behalten",
-    twoFAVerifyLabel: "Bitte trage deinen Token ein, um zu verifizieren, dass 2FA funktioniert",
-    "Verify Token": "Token verifizieren",
-    "Setup 2FA": "2FA einrichten",
-    "Enable 2FA": "2FA aktivieren",
-    "Disable 2FA": "2FA deaktivieren",
-    "2FA Settings": "2FA-Einstellungen",
-    confirmEnableTwoFAMsg: "Bist du sicher, dass du 2FA aktivieren möchtest?",
-    confirmDisableTwoFAMsg: "Bist du sicher, dass du 2FA deaktivieren möchtest?",
-    tokenValidSettingsMsg: "Token gültig! Du kannst jetzt die 2FA-Einstellungen speichern.",
-    "Two Factor Authentication": "Zwei-Faktor-Authentifizierung",
-    Active: "Aktiv",
-    Inactive: "Inaktiv",
-    Token: "Token",
-    "Show URI": "URI anzeigen",
-    Tags: "Tags",
-    "Add New below or Select...": "Einen bestehenden Tag auswählen oder neuen hinzufügen...",
-    "Tag with this name already exist.": "Ein Tag mit diesem Namen existiert bereits.",
-    "Tag with this value already exist.": "Ein Tag mit diesem Wert existiert bereits.",
-    color: "Farbe",
-    "value (optional)": "Wert (optional)",
-    Gray: "Grau",
-    Red: "Rot",
-    Orange: "Orange",
-    Green: "Grün",
-    Blue: "Blau",
-    Indigo: "Indigo",
-    Purple: "Lila",
-    Pink: "Pink",
-    "Search...": "Suchen...",
-    "Heartbeat Retry Interval": "Überprüfungsintervall",
-    "Resend Notification if Down X times consequently": "Benachrichtigung erneut senden, wenn Inaktiv X mal hintereinander",
-    retryCheckEverySecond: "Alle {0} Sekunden neu versuchen",
-    resendEveryXTimes: "Erneut versenden alle {0} mal",
-    resendDisabled: "Erneut versenden deaktiviert",
-    "Import Backup": "Backup importieren",
-    "Export Backup": "Backup exportieren",
-    "Avg. Ping": "Ping ø",
-    "Avg. Response": "Antwortzeit ø",
-    "Entry Page": "Einstiegsseite",
-    statusPageNothing: "Noch ist hier nichts. Bitte füge eine Gruppe oder einen Monitor hinzu.",
-    "No Services": "Keine Dienste",
-    "All Systems Operational": "Alle Systeme betriebsbereit",
-    "Partially Degraded Service": "Teilweise beeinträchtigter Dienst",
-    "Degraded Service": "Eingeschränkter Dienst",
-    "Add Group": "Gruppe hinzufügen",
-    "Add a monitor": "Monitor hinzufügen",
-    "Edit Status Page": "Bearbeite Status-Seite",
-    "Go to Dashboard": "Gehe zum Dashboard",
-    "Status Page": "Status-Seite",
-    "Status Pages": "Status-Seiten",
-    telegram: "Telegram",
-    webhook: "Webhook",
-    smtp: "E-Mail (SMTP)",
-    discord: "Discord",
-    teams: "Microsoft Teams",
-    signal: "Signal",
-    gotify: "Gotify",
-    slack: "Slack",
-    "rocket.chat": "Rocket.chat",
-    pushover: "Pushover",
-    pushy: "Pushy",
-    octopush: "Octopush",
-    promosms: "PromoSMS",
-    lunasea: "LunaSea",
-    apprise: "Apprise (Unterstützung für 50+ Benachrichtigungsdienste)",
-    GoogleChat: "Google Chat (nur Google Workspace)",
-    pushbullet: "Pushbullet",
-    line: "Line Messenger",
-    mattermost: "Mattermost",
-    "Primary Base URL": "Primär URL",
-    "Push URL": "Push URL",
-    needPushEvery: "Du solltest diese URL alle {0} Sekunden aufrufen",
-    pushOptionalParams: "Optionale Parameter: {0}",
-    defaultNotificationName: "Mein {notification} Alarm ({number})",
-    here: "hier",
-    Required: "Erforderlich",
-    "Bot Token": "Bot Token",
-    wayToGetTelegramToken: "Hier kannst du einen Token erhalten {0}.",
-    "Chat ID": "Chat ID",
-    supportTelegramChatID: "Unterstützt Direkt Chat / Gruppe / Kanal Chat-ID's",
-    wayToGetTelegramChatID: "Du kannst die Chat-ID erhalten, indem du eine Nachricht an den Bot sendest und zu dieser URL gehst, um die chat_id: zu sehen.",
-    "YOUR BOT TOKEN HERE": "HIER DEIN BOT TOKEN",
-    chatIDNotFound: "Chat-ID wurde nicht gefunden: bitte sende zuerst eine Nachricht an diesen Bot",
-    "Post URL": "Post URL",
-    "Content Type": "Content Type",
-    webhookJsonDesc: "{0} ist gut für alle modernen HTTP-Server, wie z.B. Express.js, geeignet",
-    webhookFormDataDesc: "{multipart} ist gut für PHP. Das JSON muss mit {decodeFunction} verarbeitet werden",
-    secureOptionNone: "Keine / STARTTLS (25, 587)",
-    secureOptionTLS: "TLS (465)",
-    "Ignore TLS Error": "TLS-Fehler ignorieren",
-    "From Email": "Absender E-Mail",
-    emailCustomSubject: "Benutzerdefinierter Betreff",
-    "To Email": "Empfänger E-Mail",
-    smtpCC: "CC",
-    smtpBCC: "BCC",
-    "Discord Webhook URL": "Discord Webhook URL",
-    wayToGetDiscordURL: "Du kannst diese erhalten, indem du zu den Servereinstellungen gehst -> Integrationen -> Neuer Webhook",
-    "Bot Display Name": "Bot-Anzeigename",
-    "Prefix Custom Message": "Benutzerdefinierter Nachrichten Präfix",
-    "Hello @everyone is...": "Hallo {'@'}everyone ist...",
-    "Webhook URL": "Webhook URL",
-    wayToGetTeamsURL: "Wie eine Webhook-URL erstellt werden kann, erfährst du {0}.",
-    Number: "Nummer",
-    Recipients: "Empfänger",
-    needSignalAPI: "Es wird ein Signal Client mit REST-API benötigt.",
-    wayToCheckSignalURL: "Du kannst diese URL aufrufen, um zu sehen, wie du eine einrichtest:",
-    signalImportant: "WICHTIG: Gruppen und Nummern können in Empfängern nicht gemischt werden!",
-    "Application Token": "Anwendungstoken",
-    "Server URL": "Server URL",
-    Priority: "Priorität",
-    "Icon Emoji": "Icon Emoji",
-    "Channel Name": "Kanalname",
-    "Uptime Kuma URL": "Uptime Kuma URL",
-    aboutWebhooks: "Weitere Informationen zu Webhooks auf: {0}",
-    aboutChannelName: "Gebe den Kanalnamen ein in {0} Feld Kanalname, falls du den Webhook-Kanal umgehen möchtest. Ex: #other-channel",
-    aboutKumaURL: "Wenn das Feld für die Uptime Kuma URL leer gelassen wird, wird standardmässig die GitHub Projekt Seite verwendet.",
-    emojiCheatSheet: "Emoji Cheat Sheet: {0}",
-    "User Key": "Benutzerschlüssel",
-    Device: "Gerät",
-    "Message Title": "Nachrichtentitel",
-    "Notification Sound": "Benachrichtigungston",
-    "More info on:": "Mehr Infos auf: {0}",
-    pushoverDesc1: "Notfallpriorität (2) hat standardmässig 30 Sekunden Auszeit zwischen den Versuchen und läuft nach 1 Stunde ab.",
-    pushoverDesc2: "Fülle das Geräte Feld aus, wenn du Benachrichtigungen an verschiedene Geräte senden möchtest.",
-    "SMS Type": "SMS Typ",
-    octopushTypePremium: "Premium (Schnell - zur Benachrichtigung empfohlen)",
-    octopushTypeLowCost: "Kostengünstig (Langsam - manchmal vom Betreiber gesperrt)",
-    checkPrice: "Prüfe {0} Preise:",
-    octopushLegacyHint: "Verwendest du die Legacy-Version von Octopush (2011-2020) oder die neue Version?",
-    "Check octopush prices": "Vergleiche die Oktopush Preise {0}.",
-    octopushPhoneNumber: "Telefonnummer (Internationales Format, z.B : +49612345678) ",
-    octopushSMSSender: "Name des SMS-Absenders : 3-11 alphanumerische Zeichen und Leerzeichen (a-zA-Z0-9)",
-    "LunaSea Device ID": "LunaSea Geräte ID",
-    "Apprise URL": "Apprise URL",
-    "Example:": "Beispiel: {0}",
-    "Read more:": "Weiterlesen: {0}",
-    "Status:": "Status: {0}",
-    "Read more": "Weiterlesen",
-    appriseInstalled: "Apprise ist installiert.",
-    appriseNotInstalled: "Apprise ist nicht installiert. {0}",
-    "Access Token": "Access Token",
-    "Channel access token": "Channel access token",
-    "Line Developers Console": "Line Developers Console",
-    lineDevConsoleTo: "Line Developers Console - {0}",
-    "Basic Settings": "Basic Settings",
-    "User ID": "User ID",
-    "Messaging API": "Messaging API",
-    wayToGetLineChannelToken: "Rufe zuerst {0} auf, erstelle dann einen Provider und Channel (Messaging API). Als nächstes kannst du den Channel access token und die User ID aus den oben genannten Menüpunkten abrufen.",
-    "Icon URL": "Icon URL",
-    aboutIconURL: "Du kannst einen Link zu einem Bild in 'Icon URL' übergeben um das Standardprofilbild zu überschreiben. Wird nicht verwendet, wenn ein Icon Emoji gesetzt ist.",
-    aboutMattermostChannelName: "Du kannst den Standardkanal, auf dem der Webhook gesendet wird überschreiben, indem der Kanalnamen in das Feld 'Channel Name' eingeben wird. Dies muss in den Mattermost Webhook-Einstellungen aktiviert werden. Ex: #other-channel",
-    matrix: "Matrix",
-    promosmsTypeEco: "SMS ECO - billig, aber langsam und oft überladen. Auf polnische Empfänger beschränkt.",
-    promosmsTypeFlash: "SMS FLASH - Die Nachricht wird automatisch auf dem Empfängergerät angezeigt. Auf polnische Empfänger beschränkt.",
-    promosmsTypeFull: "SMS FULL - Premium Stufe von SMS, es kann der Absendernamen verwendet werden (Der Name musst zuerst registriert werden). Zuverlässig für Warnungen.",
-    promosmsTypeSpeed: "SMS SPEED - Höchste Priorität im System. Sehr schnell und zuverlässig, aber teuer (Ungefähr das doppelte von SMS FULL).",
-    promosmsPhoneNumber: "Telefonnummer (für polnische Empfänger können die Vorwahlen übersprungen werden)",
-    promosmsSMSSender: "Name des SMS-Absenders : vorregistrierter Name oder einer der Standardwerte: InfoSMS, SMS Info, MaxSMS, INFO, SMS",
-    "Feishu WebHookUrl": "Feishu Webhook URL",
-    matrixHomeserverURL: "Heimserver URL (mit http(s):// und optionalen Ports)",
-    "Internal Room Id": "Interne Raum-ID",
-    matrixDesc1: "Die interne Raum-ID findest du im erweiterten Bereich der Raumeinstellungen im Matrix-Client. Es sollte aussehen wie z.B. !QMdRCpUIfLwsfjxye6:home.server.",
-    matrixDesc2: "Es wird dringend empfohlen einen neuen Benutzer anzulegen und nicht den Zugriffstoken deines eigenen Matrix-Benutzers zu verwenden. Anderenfalls ermöglicht es vollen Zugriff auf dein Konto und alle Räume, denen du beigetreten bist. Erstelle stattdessen einen neuen Benutzer und lade ihn nur in den Raum ein, in dem du die Benachrichtigung erhalten möchtest. Du kannst den Zugriffstoken erhalten, indem du Folgendes ausführst {0}",
-    Method: "Method",
-    Body: "Body",
-    Headers: "Headers",
-    PushUrl: "Push URL",
-    HeadersInvalidFormat: "Der Header ist kein gültiges JSON: ",
-    BodyInvalidFormat: "Der Body ist kein gültiges JSON: ",
-    "Monitor History": "Monitor Verlauf",
-    clearDataOlderThan: "Bewahre die Aufzeichnungsdaten für {0} Tage auf.",
-    PasswordsDoNotMatch: "Passwörter stimmen nicht überein.",
-    records: "Einträge",
-    "One record": "Ein Eintrag",
-    steamApiKeyDescription: "Um einen Steam Game Server zu überwachen, wird ein Steam Web-API-Schlüssel benötigt. Dieser kann hier registriert werden: ",
-    "Current User": "Aktueller Benutzer",
-    recent: "Letzte",
-    Done: "Fertig",
-    Info: "Info",
-    Security: "Sicherheit",
-    "Steam API Key": "Steam API Key",
-    "Shrink Database": "Datenbank verkleinern",
-    "Pick a RR-Type...": "Wähle ein RR-Typ aus...",
-    "Pick Accepted Status Codes...": "Wähle akzeptierte Statuscodes aus...",
-    Default: "Standard",
-    "HTTP Options": "HTTP Optionen",
-    "Create Incident": "Vorfall erstellen",
-    Title: "Titel",
-    Content: "Inhalt",
-    Style: "Stil",
-    info: "info",
-    warning: "warnung",
-    danger: "gefahr",
-    primary: "primär",
-    light: "hell",
-    dark: "dunkel",
-    Post: "Eintrag",
-    "Please input title and content": "Bitte Titel und Inhalt eingeben",
-    Created: "Erstellt",
-    "Last Updated": "Zuletzt aktualisiert",
-    Unpin: "Loslösen",
-    "Switch to Light Theme": "Zu hellem Thema wechseln",
-    "Switch to Dark Theme": "Zum dunklen Thema wechseln",
-    "Show Tags": "Tags anzeigen",
-    "Hide Tags": "Tags ausblenden",
-    Description: "Beschreibung",
-    "No monitors available.": "Keine Monitore verfügbar.",
-    "Add one": "Hinzufügen",
-    "No Monitors": "Keine Monitore",
-    "Untitled Group": "Gruppe ohne Titel",
-    Services: "Dienste",
-    Discard: "Verwerfen",
-    Cancel: "Abbrechen",
-    "Powered by": "Powered by",
-    shrinkDatabaseDescription: "Löse VACUUM für die SQLite Datenbank aus. Wenn die Datenbank nach 1.10.0 erstellt wurde, ist AUTO_VACUUM bereits aktiviert und diese Aktion ist nicht erforderlich.",
-    serwersms: "SerwerSMS.pl",
-    serwersmsAPIUser: "API Benutzername (inkl. webapi_ prefix)",
-    serwersmsAPIPassword: "API Passwort",
-    serwersmsPhoneNumber: "Telefonnummer",
-    serwersmsSenderName: "Name des SMS-Absenders (über Kundenportal registriert)",
-    stackfield: "Stackfield",
-    clicksendsms: "ClickSend SMS",
-    apiCredentials: "API Zugangsdaten",
-    smtpDkimSettings: "DKIM Einstellungen",
-    smtpDkimDesc: "Details zur Konfiguration sind in der Nodemailer DKIM {0} zu finden.",
-    documentation: "Dokumentation",
-    smtpDkimDomain: "Domain Name",
-    smtpDkimKeySelector: "Schlüssel Auswahl",
-    smtpDkimPrivateKey: "Privater Schlüssel",
-    smtpDkimHashAlgo: "Hash-Algorithmus (Optional)",
-    smtpDkimheaderFieldNames: "Zu validierende Header-Schlüssel (optional)",
-    smtpDkimskipFields: "Zu ignorierende Header Schlüssel (optional)",
-    PushByTechulus: "Push by Techulus",
-    gorush: "Gorush",
-    alerta: "Alerta",
-    alertaApiEndpoint: "API Endpunkt",
-    alertaEnvironment: "Umgebung",
-    alertaApiKey: "API Schlüssel",
-    alertaAlertState: "Alarmstatus",
-    alertaRecoverState: "Wiederherstellungsstatus",
-    deleteStatusPageMsg: "Bist du sicher, dass du diese Status-Seite löschen willst?",
-    Proxies: "Proxies",
-    default: "Standard",
-    enabled: "Aktiviert",
-    setAsDefault: "Als Standard setzen",
-    deleteProxyMsg: "Bist du sicher, dass du diesen Proxy für alle Monitore löschen willst?",
-    proxyDescription: "Proxies müssen einem Monitor zugewiesen werden, um zu funktionieren.",
-    enableProxyDescription: "Dieser Proxy wird keinen Effekt auf Monitor-Anfragen haben, bis er aktiviert ist. Du kannst ihn temporär von allen Monitoren nach Aktivierungsstatus deaktivieren.",
-    setAsDefaultProxyDescription: "Dieser Proxy wird standardmässig für alle neuen Monitore aktiviert sein. Du kannst den Proxy immer noch für jeden Monitor einzeln deaktivieren.",
-    "Certificate Chain": "Zertifikatskette",
-    Valid: "Gültig",
-    Invalid: "Ungültig",
-    AccessKeyId: "AccessKey ID",
-    SecretAccessKey: "AccessKey Secret",
-    PhoneNumbers: "Telefonnummern",
-    TemplateCode: "Vorlagencode",
-    SignName: "Signaturname",
-    "Sms template must contain parameters: ": "SMS Vorlage muss folgende Parameter enthalten: ",
-    "Bark Endpoint": "Bark Endpunkt",
-    WebHookUrl: "Webhook URL",
-    SecretKey: "Geheimer Schlüssel",
-    "For safety, must use secret key": "Zur Sicherheit muss ein geheimer Schlüssel verwendet werden",
-    "Device Token": "Gerätetoken",
-    Platform: "Platform",
-    iOS: "iOS",
-    Android: "Android",
-    Huawei: "Huawei",
-    High: "Hoch",
-    Retry: "Wiederholungen",
-    Topic: "Thema",
-    "WeCom Bot Key": "WeCom Bot Schlüssel",
-    "Setup Proxy": "Proxy einrichten",
-    "Proxy Protocol": "Proxy Protokoll",
-    "Proxy Server": "Proxy-Server",
-    "Proxy server has authentication": "Proxy-Server hat Authentifizierung",
-    User: "Benutzer",
-    Installed: "Installiert",
-    "Not installed": "Nicht installiert",
-    Running: "Läuft",
-    "Not running": "Gestoppt",
-    "Remove Token": "Token entfernen",
-    Start: "Start",
-    Stop: "Stop",
-    "Uptime Kuma": "Uptime Kuma",
-    "Add New Status Page": "Neue Status-Seite hinzufügen",
-    Slug: "Slug",
-    "Accept characters:": "Akzeptierte Zeichen:",
-    startOrEndWithOnly: "Nur mit {0} anfangen und enden",
-    "No consecutive dashes": "Keine aufeinanderfolgenden Bindestriche",
-    Next: "Weiter",
-    "The slug is already taken. Please choose another slug.": "Der Slug ist bereits in Verwendung. Bitte wähle einen anderen.",
-    "No Proxy": "Kein Proxy",
-    Authentication: "Authentifizierung",
-    "HTTP Basic Auth": "HTTP Basisauthentifizierung",
-    "New Status Page": "Neue Status-Seite",
-    "Page Not Found": "Seite nicht gefunden",
-    "Reverse Proxy": "Reverse Proxy",
-    Backup: "Sicherung",
-    About: "Über",
-    wayToGetCloudflaredURL: "(Lade Cloudflare von {0} herunter)",
-    cloudflareWebsite: "Cloudflare Website",
-    "Message:": "Nachricht:",
-    "Don't know how to get the token? Please read the guide:": "Du weisst nicht, wie man den Token bekommt? Lies die Anleitung dazu:",
-    "The current connection may be lost if you are currently connecting via Cloudflare Tunnel. Are you sure want to stop it? Type your current password to confirm it.": "Die aktuelle Verbindung kann unterbrochen werden, wenn du aktuell über Cloudflare Tunnel verbunden bist. Bist du sicher, dass du es stoppen willst? Gib zur Bestätigung dein aktuelles Passwort ein.",
-    "Other Software": "Andere Software",
-    "For example: nginx, Apache and Traefik.": "Zum Beispiel: nginx, Apache und Traefik.",
-    "Please read": "Bitte lesen",
-    "Subject:": "Betreff:",
-    "Valid To:": "Gültig bis:",
-    "Days Remaining:": "Tage verbleibend:",
-    "Issuer:": "Aussteller:",
-    "Fingerprint:": "Fingerabdruck:",
-    "No status pages": "Keine Status-Seiten",
-    "Domain Name Expiry Notification": "Benachrichtigung bei Ablauf des Domainnamens",
-    Customize: "Anpassen",
-    "Custom Footer": "Eigener Footer",
-    "Custom CSS": "Eigenes CSS",
-    "Footer Text": "Fusszeile",
-    "Show Powered By": "Zeige 'Powered By'",
-    "Date Created": "Erstellt am",
-    "Domain Names": "Domainnamen",
-    signedInDisp: "Angemeldet als {0}",
-    signedInDispDisabled: "Authentifizierung deaktiviert.",
-    dnsPortDescription: "DNS server port. Standard ist 53. Der Port kann jederzeit geändert werden.",
-    topic: "Thema",
-    topicExplanation: "MQTT Thema für den monitor",
-    successMessage: "Erfolgsnachricht",
-    successMessageExplanation: "MQTT Nachricht, die als Erfolg angesehen wird",
-    error: "Fehler",
-    critical: "kritisch",
-    wayToGetPagerDutyKey: "Dieser kann unter Service -> Service Directory -> (Select a service) -> Integrations -> Add integration gefunden werden. Hier muss nach \"Events API V2\" gesucht werden. Mehr informationen {0}",
-    "Integration Key": "Schlüssel der Integration",
-    "Integration URL": "URL der Integration",
-    "Auto resolve or acknowledged": "Automatisch lösen oder bestätigen",
-    "do nothing": "nichts tun",
-    "auto acknowledged": "automatisch bestätigen",
-    "auto resolve": "automatisch lösen",
-    "Bark Group": "Bark Gruppe",
-    "Bark Sound": "Bark Klang",
-    "HTTP Headers": "HTTP Kopfzeilen",
-    "Trust Proxy": "Vertrauenswürdiger Proxy",
-    Proxy: "Proxy",
-    HomeAssistant: "Home Assistant",
-    onebotHttpAddress: "OneBot HTTP Adresse",
-    onebotMessageType: "OneBot Nachrichtentyp",
-    onebotGroupMessage: "Gruppe",
-    onebotPrivateMessage: "Privat",
-    onebotUserOrGroupId: "Gruppe/Nutzer ID",
-    onebotSafetyTips: "Zur Sicherheit ein access token setzen",
-    "PushDeer Key": "PushDeer Schlüssel",
-    RadiusSecret: "Radius Geheimnis",
-    RadiusSecretDescription: "Geteiltes Geheimnis zwischen Client und Server",
-    RadiusCalledStationId: "ID der angesprochenen Station",
-    RadiusCalledStationIdDescription: "Identifikation des angesprochenen Geräts",
-    RadiusCallingStationId: "ID der ansprechenden Station",
-    RadiusCallingStationIdDescription: "Identifikation des ansprechenden Geräts",
-    "Certificate Expiry Notification": "Benachrichtigung ablaufendes Zertifikat",
-    "API Username": "API Nutzername",
-    "API Key": "API Schlüssel",
-    "Recipient Number": "Empfängernummer",
-    "From Name/Number": "Von Name/Nummer",
-    "Leave blank to use a shared sender number.": "Leer lassen um eine geteilte Absendernummer zu nutzen.",
-    "Octopush API Version": "Octopush API Version",
-    "Legacy Octopush-DM": "Legacy Octopush-DM",
-    endpoint: "Endpunkt",
-    octopushAPIKey: "\"API Schlüssel\" der HTTP API Zugangsdaten im control panel",
-    octopushLogin: "\"Login\" der HTTP API Zugangsdaten im control panel",
-    promosmsLogin: "API Login Name",
-    promosmsPassword: "API Password",
-    "pushoversounds pushover": "Pushover (Standard)",
-    "pushoversounds bike": "Fahrrad",
-    "pushoversounds bugle": "Signalhorn",
-    "pushoversounds cashregister": "Kasse",
-    "pushoversounds classical": "Klassisch",
-    "pushoversounds cosmic": "Kosmisch",
-    "pushoversounds falling": "Abfallend",
-    "pushoversounds gamelan": "Gamelan",
-    "pushoversounds incoming": "Eingang",
-    "pushoversounds intermission": "Pause",
-    "pushoversounds magic": "Magisch",
-    "pushoversounds mechanical": "Mechanisch",
-    "pushoversounds pianobar": "Piano Bar",
-    "pushoversounds siren": "Sirene",
-    "pushoversounds spacealarm": "Space Alarm",
-    "pushoversounds tugboat": "Schlepper Horn",
-    "pushoversounds alien": "Ausserirdisch (lang)",
-    "pushoversounds climb": "Ansteigende (lang)",
-    "pushoversounds persistent": "Hartnäckig (lang)",
-    "pushoversounds echo": "Pushover Echo (lang)",
-    "pushoversounds updown": "Auf und Ab (lang)",
-    "pushoversounds vibrate": "Nur vibrieren",
-    "pushoversounds none": "Nichts (Stille)",
-    pushyAPIKey: "Geheimer API Schlüssel",
-    pushyToken: "Gerätetoken",
-    "Show update if available": "Verfügbare Updates anzeigen",
-    "Also check beta release": "Auch nach beta Versionen schauen",
-    "Using a Reverse Proxy?": "Wird ein Reverse Proxy genutzt?",
-    "Check how to config it for WebSocket": "Prüfen, wie er für die Nutzung mit WebSocket konfiguriert wird",
-    "Steam Game Server": "Steam Game Server",
-    "Most likely causes:": "Wahrscheinliche Ursachen:",
-    "The resource is no longer available.": "Die Quelle ist nicht mehr verfügbar.",
-    "There might be a typing error in the address.": "Es gibt einen Tippfehler in der Adresse.",
-    "What you can try:": "Was du versuchen kannst:",
-    "Retype the address.": "Schreibe die Adresse erneut.",
-    "Go back to the previous page.": "Gehe zur vorigen Seite.",
-    "Coming Soon": "Kommt bald",
-    wayToGetClickSendSMSToken: "Du kannst einen API Nutzernamen und Schlüssel unter {0} erhalten.",
-    "Connection String": "Verbindungstext",
-    Query: "Abfrage",
-    settingsCertificateExpiry: "TLS Zertifikatsablauf",
-    certificationExpiryDescription: "HTTPS Monitore senden eine Benachrichtigung, wenn das Zertifikat abläuft in:",
-    "Setup Docker Host": "Docker Host einrichten",
-    "Connection Type": "Verbindungstyp",
-    "Docker Daemon": "Docker Daemon",
-    deleteDockerHostMsg: "Bist du sicher diesen docker host für alle Monitore zu löschen?",
-    socket: "Socket",
-    tcp: "TCP / HTTP",
-    "Docker Container": "Docker Container",
-    "Container Name / ID": "Container Name / ID",
-    "Docker Host": "Docker Host",
-    "Docker Hosts": "Docker Hosts",
-    "ntfy Topic": "ntfy Thema",
-    Domain: "Domain",
-    Workstation: "Workstation",
-    disableCloudflaredNoAuthMsg: "Du bist im nicht-authentifizieren Modus, ein Passwort wird nicht benötigt.",
-    trustProxyDescription: "Vertraue 'X-Forwarded-*' headern. Wenn man die richtige client IP haben möchte und Uptime Kuma hinter einem Proxy wie Nginx or Apache läuft, wollte dies aktiviert werden.",
-    wayToGetLineNotifyToken: "Du kannst hier ein Token erhalten: {0}",
-    Examples: "Beispiele",
-    "Home Assistant URL": "Home Assistant URL",
-    "Long-Lived Access Token": "Lange gültiges Access Token",
-    "Long-Lived Access Token can be created by clicking on your profile name (bottom left) and scrolling to the bottom then click Create Token. ": "Lange gültige Access Token  können durch klicken auf den Profilnamen (unten links) und dann einen Klick auf Create Token am Ende erstellt werden. ",
-    "Notification Service": "Benachrichtigungsdienst",
-    "default: notify all devices": "standard: Alle Geräte benachrichtigen",
-    "A list of Notification Services can be found in Home Assistant under \"Developer Tools > Services\" search for \"notification\" to find your device/phone name.": "Eine Liste der Benachrichtigungsdienste kann im Home Assistant unter \"Developer Tools > Services\" gefunden werden, wnen man nach \"notification\" sucht um den Geräte-/Telefonnamen zu finden.",
-    "Automations can optionally be triggered in Home Assistant:": "Automatisierungen können optional im Home Assistant ausgelöst werden:",
-    "Trigger type:": "Auslöser:",
-    "Event type:": "Ereignistyp:",
-    "Event data:": "Ereignis daten:",
-    "Then choose an action, for example switch the scene to where an RGB light is red.": "Dann eine Aktion wählen, zum Beispiel eine Scene wählen in der ein RGB Licht rot ist.",
-    "Frontend Version": "Frontend Version",
-    "Frontend Version do not match backend version!": "Die Frontend Version stimmt nicht mit der backend version überein!",
-    Maintenance: "Wartung",
-    statusMaintenance: "Wartung",
-    "Schedule maintenance": "Geplante Wartung",
-    "Affected Monitors": "Betroffene Monitore",
-    "Pick Affected Monitors...": "Wähle betroffene Monitore...",
-    "Start of maintenance": "Beginn der Wartung",
-    "All Status Pages": "Alle Status Seiten",
-    "Select status pages...": "Wähle Status Seiten...",
-    recurringIntervalMessage: "einmal pro Tag ausgeführt | Wird alle {0} Tage ausgführt",
-    affectedMonitorsDescription: "Wähle alle Monitore die von der Wartung betroffen sind",
-    affectedStatusPages: "Zeige diese Nachricht auf ausgewählten Status Seiten",
-    atLeastOneMonitor: "Wähle mindestens einen Monitor",
-    deleteMaintenanceMsg: "Möchtest du diese Wartung löschen?",
-    "Base URL": "Basis URL",
-    goAlertInfo: "GoAlert ist eine Open-Source Applikation für Rufbereitschaftsplanung, automatische Eskalation und Benachrichtigung (z.B. SMS oder Telefonanrufe). Beauftragen Sie automatisch die richtige Person, auf die richtige Art und Weise und zum richtigen Zeitpunkt. {0}",
-    goAlertIntegrationKeyInfo: "Bekommt einen generischen API Schlüssel in folgenden Format \"aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee\". Normalerweise entspricht dies dem Wert des Token aus der URL.",
-    goAlert: "GoAlert",
-    backupOutdatedWarning: "Veraltet:  Eine menge Neuerungen sind eingeflossen und diese Funktion wurde etwas vernachlässigt worden. Es kann kein vollständiges Backup erstellt oder eingespielt werden.",
-    backupRecommend: "Bitte Backup das Volume oder den Ordner (./ data /) selbst.",
-    Optional: "Optional",
-    squadcast: "Squadcast",
-    SendKey: "SendKey",
-    "SMSManager API Docs": "SMSManager API Dokumente",
-    "Gateway Type": "Gateway Type",
-    SMSManager: "SMSManager",
-    "You can divide numbers with": "Du kannst Zahlen teilen mit",
-    or: "oder",
-    recurringInterval: "Intervall",
-    Recurring: "Wiederkehrend",
-    strategyManual: "Active/Inactive Manually",
-    warningTimezone: "Es wird die Zeitzone des Servers genutzt",
-    weekdayShortMon: "Mo",
-    weekdayShortTue: "Di",
-    weekdayShortWed: "Mi",
-    weekdayShortThu: "Do",
-    weekdayShortFri: "Fr",
-    weekdayShortSat: "Sa",
-    weekdayShortSun: "So",
-    dayOfWeek: "Tag der Woche",
-    dayOfMonth: "Tag im Monat",
-    lastDay: "Letzter Tag",
-    lastDay1: "Letzter Tag im Monat",
-    lastDay2: "Vorletzer Tag im Monat",
-    lastDay3: "3. letzter Tag im Monat",
-    lastDay4: "4. letzter Tag im Monat",
-    "No Maintenance": "Keine Wartung",
-    pauseMaintenanceMsg: "Möchtest du wirklich pausieren?",
-    "maintenanceStatus-under-maintenance": "Unter Wartung",
-    "maintenanceStatus-inactive": "Inaktiv",
-    "maintenanceStatus-scheduled": "Geplant",
-    "maintenanceStatus-ended": "Ende",
-    "maintenanceStatus-unknown": "Unbekannt",
-    "Display Timezone": "Zeitzone anzeigen",
-    "Server Timezone": "Server Zeitzone",
-    statusPageMaintenanceEndDate: "Ende",
-};
diff --git a/src/languages/de-DE.js b/src/languages/de-DE.js
deleted file mode 100644
index 6d4bf05f9..000000000
--- a/src/languages/de-DE.js
+++ /dev/null
@@ -1,641 +0,0 @@
-export default {
-    languageName: "Deutsch (Deutschland)",
-    Settings: "Einstellungen",
-    Dashboard: "Dashboard",
-    "New Update": "Update verfügbar",
-    Language: "Sprache",
-    Appearance: "Erscheinungsbild",
-    Theme: "Erscheinungsbild",
-    General: "Allgemein",
-    Version: "Version",
-    "Check Update On GitHub": "Auf GitHub nach Updates suchen",
-    List: "Liste",
-    Add: "Hinzufügen",
-    "Add New Monitor": "Neuen Monitor hinzufügen",
-    "Quick Stats": "Übersicht",
-    Up: "Aktiv",
-    Down: "Inaktiv",
-    Pending: "Ausstehend",
-    Unknown: "Unbekannt",
-    Pause: "Pausieren",
-    pauseDashboardHome: "Pausiert",
-    Name: "Name",
-    Status: "Status",
-    DateTime: "Datum / Uhrzeit",
-    Message: "Nachricht",
-    "No important events": "Keine wichtigen Ereignisse",
-    Resume: "Fortsetzen",
-    Edit: "Bearbeiten",
-    Delete: "Löschen",
-    Current: "Aktuell",
-    Uptime: "Verfügbarkeit",
-    "Cert Exp.": "Zertifikatsablauf",
-    day: "Tag | Tage",
-    "-day": "-Tage",
-    hour: "Stunde",
-    "-hour": "-Stunden",
-    checkEverySecond: "Überprüfe alle {0} Sekunden",
-    Response: "Antwortzeit",
-    Ping: "Ping",
-    "Monitor Type": "Monitor-Typ",
-    Keyword: "Suchwort",
-    "Friendly Name": "Anzeigename",
-    URL: "URL",
-    Hostname: "Hostname",
-    Port: "Port",
-    "Heartbeat Interval": "Prüfintervall",
-    Retries: "Wiederholungen",
-    retriesDescription: "Maximale Anzahl von Wiederholungen, bevor der Dienst als inaktiv markiert und eine Benachrichtigung gesendet wird.",
-    Advanced: "Erweitert",
-    ignoreTLSError: "Ignoriere TLS-/SSL-Fehler von Webseiten",
-    "Upside Down Mode": "Umgekehrter Modus",
-    upsideDownModeDescription: "Im umgekehrten Modus wird der Dienst als inaktiv angezeigt, wenn er erreichbar ist.",
-    "Max. Redirects": "Max. Weiterleitungen",
-    maxRedirectDescription: "Maximale Anzahl von Weiterleitungen, denen gefolgt werden soll. Auf 0 setzen, um Weiterleitungen zu deaktivieren.",
-    "Accepted Status Codes": "Erlaubte HTTP-Statuscodes",
-    acceptedStatusCodesDescription: "Statuscodes auswählen, die als erfolgreiche Verbindung gelten sollen.",
-    Save: "Speichern",
-    Notifications: "Benachrichtigungen",
-    "Not available, please setup.": "Nicht verfügbar, bitte einrichten.",
-    "Setup Notification": "Benachrichtigung einrichten",
-    Light: "Hell",
-    Dark: "Dunkel",
-    Auto: "Auto",
-    "Theme - Heartbeat Bar": "Erscheinungsbild - Zeitleiste",
-    Normal: "Normal",
-    Bottom: "Unten",
-    None: "Keine",
-    Timezone: "Zeitzone",
-    "Search Engine Visibility": "Sichtbarkeit für Suchmaschinen",
-    "Allow indexing": "Indizierung zulassen",
-    "Discourage search engines from indexing site": "Suchmaschinen darum bitten, die Seite nicht zu indizieren",
-    "Change Password": "Passwort ändern",
-    "Current Password": "Aktuelles Passwort",
-    "New Password": "Neues Passwort",
-    "Repeat New Password": "Neues Passwort wiederholen",
-    passwordNotMatchMsg: "Passwörter stimmen nicht überein.",
-    "Update Password": "Passwort aktualisieren",
-    "Disable Auth": "Authentifizierung deaktivieren",
-    "Enable Auth": "Authentifizierung aktivieren",
-    "disableauth.message1": "Bist du sicher das du die <strong>Authentifizierung deaktivieren</strong> möchtest?",
-    "disableauth.message2": "Dies ist für Szenarien gedacht, <strong>in denen man eine externe Authentifizierung</strong> vor Uptime Kuma geschaltet hat, wie z.B. Cloudflare Access, Authelia oder andere Authentifizierungsmechanismen.",
-    "Please use this option carefully!": "Bitte mit Vorsicht nutzen.",
-    Logout: "Ausloggen",
-    notificationDescription: "Benachrichtigungen müssen einem Monitor zugewiesen werden, damit diese funktionieren.",
-    Leave: "Verlassen",
-    "I understand, please disable": "Ich verstehe, bitte deaktivieren",
-    Confirm: "Bestätigen",
-    Yes: "Ja",
-    No: "Nein",
-    Username: "Benutzername",
-    Password: "Passwort",
-    "Remember me": "Angemeldet bleiben",
-    Login: "Einloggen",
-    "No Monitors, please": "Keine Monitore, bitte",
-    "add one": "hinzufügen",
-    "Notification Type": "Benachrichtigungsdienst",
-    Email: "E-Mail",
-    Test: "Test",
-    "Certificate Info": "Zertifikatsinformation",
-    keywordDescription: "Ein Suchwort in der HTML- oder JSON-Ausgabe finden. Bitte beachte: es wird zwischen Groß-/Kleinschreibung unterschieden.",
-    deleteMonitorMsg: "Bist du sicher, dass du den Monitor löschen möchtest?",
-    deleteNotificationMsg: "Möchtest du diese Benachrichtigung wirklich für alle Monitore löschen?",
-    resolverserverDescription: "Cloudflare ist als der Standardserver festgelegt. Dieser kann jederzeit geändert werden.",
-    "Resolver Server": "Auflösungsserver",
-    rrtypeDescription: "Wähle den RR-Typ aus, welchen du überwachen möchtest.",
-    "Last Result": "Letztes Ergebnis",
-    pauseMonitorMsg: "Bist du sicher, dass du den Monitor pausieren möchtest?",
-    clearEventsMsg: "Bist du sicher, dass du alle Ereignisse für diesen Monitor löschen möchtest?",
-    clearHeartbeatsMsg: "Bist du sicher, dass du alle Statistiken für diesen Monitor löschen möchtest?",
-    "Clear Data": "Lösche Daten",
-    Events: "Ereignisse",
-    Heartbeats: "Statistiken",
-    confirmClearStatisticsMsg: "Bist du dir sicher, dass du ALLE Statistiken löschen möchtest?",
-    "Create your admin account": "Erstelle dein Admin-Konto",
-    "Repeat Password": "Passwort erneut eingeben",
-    "Resource Record Type": "Ressourcen Record Typ",
-    Export: "Export",
-    Import: "Import",
-    respTime: "Antw.-Zeit (ms)",
-    notAvailableShort: "N/A",
-    "Default enabled": "Standardmäßig aktiviert",
-    "Apply on all existing monitors": "Auf alle existierenden Monitore anwenden",
-    enableDefaultNotificationDescription: "Für jeden neuen Monitor wird diese Benachrichtigung standardmäßig aktiviert. Die Benachrichtigung kann weiterhin für jeden Monitor separat deaktiviert werden.",
-    Create: "Erstellen",
-    "Auto Get": "Auto Get",
-    backupDescription: "Es können alle Monitore und Benachrichtigungen in einer JSON-Datei gesichert werden.",
-    backupDescription2: "PS: Verlaufs- und Ereignisdaten sind nicht enthalten.",
-    backupDescription3: "Sensible Daten wie Benachrichtigungstoken sind in der Exportdatei enthalten, bitte bewahre sie sorgfältig auf.",
-    alertNoFile: "Bitte wähle eine Datei zum Importieren aus.",
-    alertWrongFileType: "Bitte wähle eine JSON-Datei aus.",
-    "Clear all statistics": "Lösche alle Statistiken",
-    importHandleDescription: "Wähle 'Vorhandene überspringen' aus, wenn jeder Monitor oder jede Benachrichtigung mit demselben Namen übersprungen werden soll. 'Überschreiben' löscht jeden vorhandenen Monitor sowie Benachrichtigungen.",
-    "Skip existing": "Vorhandene überspringen",
-    Overwrite: "Überschreiben",
-    Options: "Optionen",
-    confirmImportMsg: "Möchtest du das Backup wirklich importieren? Bitte stelle sicher, dass die richtige Import-Option ausgewählt ist.",
-    "Keep both": "Beide behalten",
-    twoFAVerifyLabel: "Bitte trage deinen Token ein, um zu verifizieren, dass 2FA funktioniert",
-    "Verify Token": "Token verifizieren",
-    "Setup 2FA": "2FA einrichten",
-    "Enable 2FA": "2FA aktivieren",
-    "Disable 2FA": "2FA deaktivieren",
-    "2FA Settings": "2FA-Einstellungen",
-    confirmEnableTwoFAMsg: "Bist du sicher, dass du 2FA aktivieren möchtest?",
-    confirmDisableTwoFAMsg: "Bist du sicher, dass du 2FA deaktivieren möchtest?",
-    tokenValidSettingsMsg: "Token gültig! Du kannst jetzt die 2FA-Einstellungen speichern.",
-    "Two Factor Authentication": "Zwei-Faktor-Authentifizierung",
-    Active: "Aktiv",
-    Inactive: "Inaktiv",
-    Token: "Token",
-    "Show URI": "URI anzeigen",
-    Tags: "Tags",
-    "Add New below or Select...": "Einen bestehenden Tag auswählen oder neuen hinzufügen...",
-    "Tag with this name already exist.": "Ein Tag mit diesem Namen existiert bereits.",
-    "Tag with this value already exist.": "Ein Tag mit diesem Wert existiert bereits.",
-    color: "Farbe",
-    "value (optional)": "Wert (optional)",
-    Gray: "Grau",
-    Red: "Rot",
-    Orange: "Orange",
-    Green: "Grün",
-    Blue: "Blau",
-    Indigo: "Indigo",
-    Purple: "Lila",
-    Pink: "Pink",
-    "Search...": "Suchen...",
-    "Heartbeat Retry Interval": "Überprüfungsintervall",
-    "Resend Notification if Down X times consequently": "Benachrichtigung erneut senden, wenn Inaktiv X mal hintereinander",
-    retryCheckEverySecond: "Alle {0} Sekunden neu versuchen",
-    resendEveryXTimes: "Erneut versenden alle {0} mal",
-    resendDisabled: "Erneut versenden deaktiviert",
-    "Import Backup": "Backup importieren",
-    "Export Backup": "Backup exportieren",
-    "Avg. Ping": "Durchschn. Ping",
-    "Avg. Response": "Durchschn. Antwort",
-    "Entry Page": "Einstiegsseite",
-    statusPageNothing: "Noch ist hier nichts. Bitte füge eine Gruppe oder einen Monitor hinzu.",
-    "No Services": "Keine Dienste",
-    "All Systems Operational": "Alle Systeme betriebsbereit",
-    "Partially Degraded Service": "Teilweise beeinträchtigter Dienst",
-    "Degraded Service": "Eingeschränkter Dienst",
-    "Add Group": "Gruppe hinzufügen",
-    "Add a monitor": "Monitor hinzufügen",
-    "Edit Status Page": "Statusseite bearbeiten",
-    "Go to Dashboard": "Gehe zum Dashboard",
-    "Status Page": "Status-Seite",
-    "Status Pages": "Status-Seiten",
-    telegram: "Telegram",
-    webhook: "Webhook",
-    smtp: "E-Mail (SMTP)",
-    discord: "Discord",
-    teams: "Microsoft Teams",
-    signal: "Signal",
-    gotify: "Gotify",
-    slack: "Slack",
-    "rocket.chat": "Rocket.chat",
-    pushover: "Pushover",
-    pushy: "Pushy",
-    octopush: "Octopush",
-    promosms: "PromoSMS",
-    lunasea: "LunaSea",
-    apprise: "Apprise (Unterstützung für 50+ Benachrichtigungsdienste)",
-    GoogleChat: "Google Chat (nur Google Workspace)",
-    pushbullet: "Pushbullet",
-    line: "Line Messenger",
-    mattermost: "Mattermost",
-    "Primary Base URL": "Primäre Basis-URL",
-    "Push URL": "Push URL",
-    needPushEvery: "Du solltest diese URL alle {0} Sekunden aufrufen",
-    pushOptionalParams: "Optionale Parameter: {0}",
-    defaultNotificationName: "Mein {notification} Alarm ({number})",
-    here: "hier",
-    Required: "Erforderlich",
-    "Bot Token": "Bot Token",
-    wayToGetTelegramToken: "Hier kannst du einen Token erhalten {0}.",
-    "Chat ID": "Chat ID",
-    supportTelegramChatID: "Unterstützt Direkt Chat / Gruppe / Kanal Chat-ID's",
-    wayToGetTelegramChatID: "Du kannst die Chat-ID erhalten, indem du eine Nachricht an den Bot sendest und zu dieser URL gehst, um die chat_id: zu sehen.",
-    "YOUR BOT TOKEN HERE": "HIER DEIN BOT TOKEN",
-    chatIDNotFound: "Chat-ID wurde nicht gefunden: bitte sende zuerst eine Nachricht an diesen Bot",
-    "Post URL": "Post URL",
-    "Content Type": "Content Type",
-    webhookJsonDesc: "{0} ist gut für alle modernen HTTP-Server, wie z.B. Express.js, geeignet",
-    webhookFormDataDesc: "{multipart} ist gut für PHP. Das JSON muss mit {decodeFunction} verarbeitet werden",
-    secureOptionNone: "Keine / STARTTLS (25, 587)",
-    secureOptionTLS: "TLS (465)",
-    "Ignore TLS Error": "TLS-Fehler ignorieren",
-    "From Email": "Absender E-Mail",
-    emailCustomSubject: "Benutzerdefinierter Betreff",
-    "To Email": "Empfänger E-Mail",
-    smtpCC: "CC",
-    smtpBCC: "BCC",
-    "Discord Webhook URL": "Discord Webhook URL",
-    wayToGetDiscordURL: "Du kannst diese erhalten, indem du zu den Servereinstellungen gehst -> Integrationen -> Neuer Webhook",
-    "Bot Display Name": "Bot-Anzeigename",
-    "Prefix Custom Message": "Benutzerdefinierter Nachrichten Präfix",
-    "Hello @everyone is...": "Hallo {'@'}everyone ist...",
-    "Webhook URL": "Webhook URL",
-    wayToGetTeamsURL: "Wie eine Webhook-URL erstellt werden kann, erfährst du {0}.",
-    Number: "Nummer",
-    Recipients: "Empfänger",
-    needSignalAPI: "Es wird ein Signal Client mit REST-API benötigt.",
-    wayToCheckSignalURL: "Du kannst diese URL aufrufen, um zu sehen, wie du eine einrichtest:",
-    signalImportant: "WICHTIG: Gruppen und Nummern können in Empfängern nicht gemischt werden!",
-    "Application Token": "Anwendungs Token",
-    "Server URL": "Server URL",
-    Priority: "Priorität",
-    "Icon Emoji": "Icon Emoji",
-    "Channel Name": "Kanalname",
-    "Uptime Kuma URL": "Uptime Kuma URL",
-    aboutWebhooks: "Weitere Informationen zu Webhooks auf: {0}",
-    aboutChannelName: "Gebe den Kanalnamen ein in {0} Feld Kanalname, falls du den Webhook-Kanal umgehen möchtest. Ex: #other-channel",
-    aboutKumaURL: "Wenn das Feld für die Uptime Kuma URL leer gelassen wird, wird standardmäßig die GitHub Projekt Seite verwendet.",
-    emojiCheatSheet: "Emoji Cheat Sheet: {0}",
-    "User Key": "Benutzerschlüssel",
-    Device: "Gerät",
-    "Message Title": "Nachrichtentitel",
-    "Notification Sound": "Benachrichtigungston",
-    "More info on:": "Mehr Infos auf: {0}",
-    pushoverDesc1: "Notfallpriorität (2) hat standardmäßig 30 Sekunden Auszeit zwischen den Versuchen und läuft nach 1 Stunde ab.",
-    pushoverDesc2: "Fülle das Geräte Feld aus, wenn du Benachrichtigungen an verschiedene Geräte senden möchtest.",
-    "SMS Type": "SMS Typ",
-    octopushTypePremium: "Premium (Schnell - zur Benachrichtigung empfohlen)",
-    octopushTypeLowCost: "Kostengünstig (Langsam - manchmal vom Betreiber gesperrt)",
-    checkPrice: "Prüfe {0} Preise:",
-    octopushLegacyHint: "Verwendest du die Legacy-Version von Octopush (2011-2020) oder die neue Version?",
-    "Check octopush prices": "Vergleiche die Oktopush Preise {0}.",
-    octopushPhoneNumber: "Telefonnummer (Internationales Format, z.B : +49612345678) ",
-    octopushSMSSender: "Name des SMS-Absenders : 3-11 alphanumerische Zeichen und Leerzeichen (a-zA-Z0-9)",
-    "LunaSea Device ID": "LunaSea Geräte ID",
-    "Apprise URL": "Apprise URL",
-    "Example:": "Beispiel: {0}",
-    "Read more:": "Weiterlesen: {0}",
-    "Status:": "Status: {0}",
-    "Read more": "Weiterlesen",
-    appriseInstalled: "Apprise ist installiert.",
-    appriseNotInstalled: "Apprise ist nicht installiert. {0}",
-    "Access Token": "Access Token",
-    "Channel access token": "Channel access token",
-    "Line Developers Console": "Line Developers Console",
-    lineDevConsoleTo: "Line Developers Console - {0}",
-    "Basic Settings": "Basic Settings",
-    "User ID": "User ID",
-    "Messaging API": "Messaging API",
-    wayToGetLineChannelToken: "Rufe zuerst {0} auf, erstelle dann einen Provider und Channel (Messaging API). Als nächstes kannst du den Channel access token und die User ID aus den oben genannten Menüpunkten abrufen.",
-    "Icon URL": "Icon URL",
-    aboutIconURL: "Du kannst einen Link zu einem Bild in 'Icon URL' übergeben um das Standardprofilbild zu überschreiben. Wird nicht verwendet, wenn ein Icon Emoji gesetzt ist.",
-    aboutMattermostChannelName: "Du kannst den Standardkanal, auf dem der Webhook gesendet wird überschreiben, indem der Kanalnamen in das Feld 'Channel Name' eingeben wird. Dies muss in den Mattermost Webhook-Einstellungen aktiviert werden. Ex: #other-channel",
-    matrix: "Matrix",
-    promosmsTypeEco: "SMS ECO - billig, aber langsam und oft überladen. Auf polnische Empfänger beschränkt.",
-    promosmsTypeFlash: "SMS FLASH - Die Nachricht wird automatisch auf dem Empfängergerät angezeigt. Auf polnische Empfänger beschränkt.",
-    promosmsTypeFull: "SMS FULL - Premium Stufe von SMS, es kann der Absendernamen verwendet werden (Der Name musst zuerst registriert werden). Zuverlässig für Warnungen.",
-    promosmsTypeSpeed: "SMS SPEED - Höchste Priorität im System. Sehr schnell und zuverlässig, aber teuer (Ungefähr das doppelte von SMS FULL).",
-    promosmsPhoneNumber: "Telefonnummer (für polnische Empfänger können die Vorwahlen übersprungen werden)",
-    promosmsSMSSender: "Name des SMS-Absenders : vorregistrierter Name oder einer der Standardwerte: InfoSMS, SMS Info, MaxSMS, INFO, SMS",
-    "Feishu WebHookUrl": "Feishu Webhook URL",
-    matrixHomeserverURL: "Heimserver URL (mit http(s):// und optionalen Ports)",
-    "Internal Room Id": "Interne Raum-ID",
-    matrixDesc1: "Die interne Raum-ID findest du im erweiterten Bereich der Raumeinstellungen im Matrix-Client. Es sollte aussehen wie z.B. !QMdRCpUIfLwsfjxye6:home.server.",
-    matrixDesc2: "Es wird dringend empfohlen einen neuen Benutzer anzulegen und nicht den Zugriffstoken deines eigenen Matrix-Benutzers zu verwenden. Anderenfalls ermöglicht es vollen Zugriff auf dein Konto und alle Räume, denen du beigetreten bist. Erstelle stattdessen einen neuen Benutzer und lade ihn nur in den Raum ein, in dem du die Benachrichtigung erhalten möchtest. Du kannst den Zugriffstoken erhalten, indem du Folgendes ausführst {0}",
-    Method: "Method",
-    Body: "Body",
-    Headers: "Headers",
-    PushUrl: "Push URL",
-    HeadersInvalidFormat: "Der Header ist kein gültiges JSON: ",
-    BodyInvalidFormat: "Der Body ist kein gültiges JSON: ",
-    "Monitor History": "Monitor Verlauf",
-    clearDataOlderThan: "Bewahre die Monitor-Verlaufsdaten für {0} Tage auf.",
-    PasswordsDoNotMatch: "Passwörter stimmen nicht überein.",
-    records: "Einträge",
-    "One record": "Ein Eintrag",
-    steamApiKeyDescription: "Um einen Steam Game Server zu überwachen, wird ein Steam Web-API-Schlüssel benötigt. Dieser kann hier registriert werden: ",
-    "Current User": "Aktueller Benutzer",
-    recent: "Letzte",
-    Done: "Fertig",
-    Info: "Info",
-    Security: "Sicherheit",
-    "Steam API Key": "Steam API Key",
-    "Shrink Database": "Datenbank verkleinern",
-    "Pick a RR-Type...": "Wähle ein RR-Typ aus...",
-    "Pick Accepted Status Codes...": "Wähle akzeptierte Statuscodes aus...",
-    Default: "Standard",
-    "HTTP Options": "HTTP Optionen",
-    "Create Incident": "Vorfall erstellen",
-    Title: "Titel",
-    Content: "Inhalt",
-    Style: "Stil",
-    info: "info",
-    warning: "warnung",
-    danger: "gefahr",
-    primary: "primär",
-    light: "hell",
-    dark: "dunkel",
-    Post: "Eintrag",
-    "Please input title and content": "Bitte Titel und Inhalt eingeben",
-    Created: "Erstellt",
-    "Last Updated": "Zuletzt aktualisiert",
-    Unpin: "Loslösen",
-    "Switch to Light Theme": "Zu hellem Thema wechseln",
-    "Switch to Dark Theme": "Zum dunklen Thema wechseln",
-    "Show Tags": "Tags anzeigen",
-    "Hide Tags": "Tags ausblenden",
-    Description: "Beschreibung",
-    "No monitors available.": "Keine Monitore verfügbar.",
-    "Add one": "Hinzufügen",
-    "No Monitors": "Keine Monitore",
-    "Untitled Group": "Gruppe ohne Titel",
-    Services: "Dienste",
-    Discard: "Verwerfen",
-    Cancel: "Abbrechen",
-    "Powered by": "Powered by",
-    shrinkDatabaseDescription: "Löse VACUUM für die SQLite Datenbank aus. Wenn die Datenbank nach 1.10.0 erstellt wurde, ist AUTO_VACUUM bereits aktiviert und diese Aktion ist nicht erforderlich.",
-    serwersms: "SerwerSMS.pl",
-    serwersmsAPIUser: "API Benutzername (inkl. webapi_ prefix)",
-    serwersmsAPIPassword: "API Passwort",
-    serwersmsPhoneNumber: "Telefonnummer",
-    serwersmsSenderName: "Name des SMS-Absenders (über Kundenportal registriert)",
-    stackfield: "Stackfield",
-    clicksendsms: "ClickSend SMS",
-    apiCredentials: "API Zugangsdaten",
-    smtpDkimSettings: "DKIM Einstellungen",
-    smtpDkimDesc: "Details zur Konfiguration sind in der Nodemailer DKIM {0} zu finden.",
-    documentation: "Dokumentation",
-    smtpDkimDomain: "Domain Name",
-    smtpDkimKeySelector: "Schlüssel Auswahl",
-    smtpDkimPrivateKey: "Privater Schlüssel",
-    smtpDkimHashAlgo: "Hash-Algorithmus (Optional)",
-    smtpDkimheaderFieldNames: "Zu validierende Header-Schlüssel (optional)",
-    smtpDkimskipFields: "Zu ignorierende Header Schlüssel (optional)",
-    PushByTechulus: "Push by Techulus",
-    gorush: "Gorush",
-    alerta: "Alerta",
-    alertaApiEndpoint: "API Endpunkt",
-    alertaEnvironment: "Umgebung",
-    alertaApiKey: "API Schlüssel",
-    alertaAlertState: "Alarmstatus",
-    alertaRecoverState: "Wiederherstellungsstatus",
-    deleteStatusPageMsg: "Bist du sicher, dass du diese Status-Seite löschen willst?",
-    Proxies: "Proxies",
-    default: "Standard",
-    enabled: "Aktiviert",
-    setAsDefault: "Als Standard setzen",
-    deleteProxyMsg: "Bist du sicher, dass du diesen Proxy für alle Monitore löschen willst?",
-    proxyDescription: "Proxies müssen einem Monitor zugewiesen werden, um zu funktionieren.",
-    enableProxyDescription: "Dieser Proxy wird keinen Effekt auf Monitor-Anfragen haben, bis er aktiviert ist. Du kannst ihn temporär von allen Monitoren nach Aktivierungsstatus deaktivieren.",
-    setAsDefaultProxyDescription: "Dieser Proxy wird standardmäßig für alle neuen Monitore aktiviert sein. Du kannst den Proxy immer noch für jeden Monitor einzeln deaktivieren.",
-    "Certificate Chain": "Zertifikatskette",
-    Valid: "Gültig",
-    Invalid: "Ungültig",
-    AccessKeyId: "AccessKey ID",
-    SecretAccessKey: "AccessKey Secret",
-    PhoneNumbers: "Telefonnummern",
-    TemplateCode: "Vorlagencode",
-    SignName: "Signaturname",
-    "Sms template must contain parameters: ": "SMS Vorlage muss folgende Parameter enthalten: ",
-    "Bark Endpoint": "Bark Endpunkt",
-    WebHookUrl: "Webhook URL",
-    SecretKey: "Geheimer Schlüssel",
-    "For safety, must use secret key": "Zur Sicherheit muss ein geheimer Schlüssel verwendet werden",
-    "Device Token": "Gerätetoken",
-    Platform: "Platform",
-    iOS: "iOS",
-    Android: "Android",
-    Huawei: "Huawei",
-    High: "Hoch",
-    Retry: "Wiederholungen",
-    Topic: "Thema",
-    "WeCom Bot Key": "WeCom Bot Schlüssel",
-    "Setup Proxy": "Proxy einrichten",
-    "Proxy Protocol": "Proxy Protokoll",
-    "Proxy Server": "Proxy-Server",
-    "Proxy server has authentication": "Proxy-Server hat Authentifizierung",
-    User: "Benutzer",
-    Installed: "Installiert",
-    "Not installed": "Nicht installiert",
-    Running: "Läuft",
-    "Not running": "Gestoppt",
-    "Remove Token": "Token entfernen",
-    Start: "Start",
-    Stop: "Stop",
-    "Uptime Kuma": "Uptime Kuma",
-    "Add New Status Page": "Neue Status-Seite hinzufügen",
-    Slug: "Slug",
-    "Accept characters:": "Akzeptierte Zeichen:",
-    startOrEndWithOnly: "Nur mit {0} anfangen und enden",
-    "No consecutive dashes": "Keine aufeinanderfolgenden Bindestriche",
-    Next: "Weiter",
-    "The slug is already taken. Please choose another slug.": "Der Slug ist bereits in Verwendung. Bitte wähle einen anderen.",
-    "No Proxy": "Kein Proxy",
-    Authentication: "Authentifizierung",
-    "HTTP Basic Auth": "HTTP Basisauthentifizierung",
-    "New Status Page": "Neue Status-Seite",
-    "Page Not Found": "Seite nicht gefunden",
-    "Reverse Proxy": "Reverse Proxy",
-    Backup: "Sicherung",
-    About: "Über",
-    wayToGetCloudflaredURL: "(Lade cloudflared von {0} herunter)",
-    cloudflareWebsite: "Cloudflare Website",
-    "Message:": "Nachricht:",
-    "Don't know how to get the token? Please read the guide:": "Du weißt nicht, wie man den Token bekommt? Lies die Anleitung dazu:",
-    "The current connection may be lost if you are currently connecting via Cloudflare Tunnel. Are you sure want to stop it? Type your current password to confirm it.": "Die aktuelle Verbindung kann unterbrochen werden, wenn du aktuell über Cloudflare Tunnel verbunden bist. Bist du sicher, dass du es stoppen willst? Gib zur Bestätigung dein aktuelles Passwort ein.",
-    "Other Software": "Andere Software",
-    "For example: nginx, Apache and Traefik.": "Zum Beispiel: nginx, Apache und Traefik.",
-    "Please read": "Bitte lesen",
-    "Subject:": "Betreff:",
-    "Valid To:": "Gültig bis:",
-    "Days Remaining:": "Tage verbleibend:",
-    "Issuer:": "Aussteller:",
-    "Fingerprint:": "Fingerabdruck:",
-    "No status pages": "Keine Status-Seiten",
-    "Domain Name Expiry Notification": "Benachrichtigung bei Ablauf des Domainnamens",
-    Customize: "Anpassen",
-    "Custom Footer": "Eigener Footer",
-    "Custom CSS": "Eigenes CSS",
-    "Footer Text": "Fußzeile",
-    "Show Powered By": "Zeige 'Powered By'",
-    "Date Created": "Erstellt am",
-    "Domain Names": "Domainnamen",
-    signedInDisp: "Angemeldet als {0}",
-    signedInDispDisabled: "Authentifizierung deaktiviert.",
-    dnsPortDescription: "DNS server port. Standard ist 53. Der Port kann jederzeit geändert werden.",
-    topic: "Thema",
-    topicExplanation: "MQTT Thema für den monitor",
-    successMessage: "Erfolgsnachricht",
-    successMessageExplanation: "MQTT Nachricht, die als Erfolg angesehen wird",
-    error: "Fehler",
-    critical: "kritisch",
-    wayToGetPagerDutyKey: "Dieser kann unter Service -> Service Directory -> (Select a service) -> Integrations -> Add integration gefunden werden. Hier muss nach \"Events API V2\" gesucht werden. Mehr informationen {0}",
-    "Integration Key": "Schlüssel der Integration",
-    "Integration URL": "URL der Integration",
-    "Auto resolve or acknowledged": "Automatisch lösen oder bestätigen",
-    "do nothing": "nichts tun",
-    "auto acknowledged": "automatisch bestätigen",
-    "auto resolve": "automatisch lösen",
-    "Bark Group": "Bark Gruppe",
-    "Bark Sound": "Bark Klang",
-    "HTTP Headers": "HTTP Kopfzeilen",
-    "Trust Proxy": "Vertrauenswürdiger Proxy",
-    Proxy: "Proxy",
-    HomeAssistant: "Home Assistant",
-    onebotHttpAddress: "OneBot HTTP Adresse",
-    onebotMessageType: "OneBot Nachrichtentyp",
-    onebotGroupMessage: "Gruppe",
-    onebotPrivateMessage: "Privat",
-    onebotUserOrGroupId: "Gruppe/Nutzer ID",
-    onebotSafetyTips: "Zur Sicherheit ein access token setzen",
-    "PushDeer Key": "PushDeer Schlüssel",
-    RadiusSecret: "Radius Geheimnis",
-    RadiusSecretDescription: "Geteiltes Geheimnis zwischen Client und Server",
-    RadiusCalledStationId: "ID der angesprochenen Station",
-    RadiusCalledStationIdDescription: "Identifikation des angesprochenen Geräts",
-    RadiusCallingStationId: "ID der ansprechenden Station",
-    RadiusCallingStationIdDescription: "Identifikation des ansprechenden Geräts",
-    "Certificate Expiry Notification": "Benachrichtigung ablaufendes Zertifikat",
-    "API Username": "API Nutzername",
-    "API Key": "API Schlüssel",
-    "Recipient Number": "Empfängernummer",
-    "From Name/Number": "Von Name/Nummer",
-    "Leave blank to use a shared sender number.": "Leer lassen um eine geteilte Absendernummer zu nutzen.",
-    "Octopush API Version": "Octopush API Version",
-    "Legacy Octopush-DM": "Legacy Octopush-DM",
-    endpoint: "Endpunkt",
-    octopushAPIKey: "\"API Schlüssel\" der HTTP API Zugangsdaten im control panel",
-    octopushLogin: "\"Login\" der HTTP API Zugangsdaten im control panel",
-    promosmsLogin: "API Login Name",
-    promosmsPassword: "API Password",
-    "pushoversounds pushover": "Pushover (Standard)",
-    "pushoversounds bike": "Fahrrad",
-    "pushoversounds bugle": "Signalhorn",
-    "pushoversounds cashregister": "Kasse",
-    "pushoversounds classical": "Klassisch",
-    "pushoversounds cosmic": "Kosmisch",
-    "pushoversounds falling": "Abfallend",
-    "pushoversounds gamelan": "Gamelan",
-    "pushoversounds incoming": "Eingang",
-    "pushoversounds intermission": "Pause",
-    "pushoversounds magic": "Magisch",
-    "pushoversounds mechanical": "Mechanisch",
-    "pushoversounds pianobar": "Piano Bar",
-    "pushoversounds siren": "Sirene",
-    "pushoversounds spacealarm": "Space Alarm",
-    "pushoversounds tugboat": "Schlepper Horn",
-    "pushoversounds alien": "Außerirdisch (lang)",
-    "pushoversounds climb": "Ansteigende (lang)",
-    "pushoversounds persistent": "Hartnäckig (lang)",
-    "pushoversounds echo": "Pushover Echo (lang)",
-    "pushoversounds updown": "Auf und Ab (lang)",
-    "pushoversounds vibrate": "Nur vibrieren",
-    "pushoversounds none": "Nichts (Stille)",
-    pushyAPIKey: "Geheimer API Schlüssel",
-    pushyToken: "Gerätetoken",
-    "Show update if available": "Verfügbare Updates anzeigen",
-    "Also check beta release": "Auch nach Beta Versionen schauen",
-    "Using a Reverse Proxy?": "Wird ein Reverse Proxy genutzt?",
-    "Check how to config it for WebSocket": "Prüfen, wie er für die Nutzung mit WebSocket konfiguriert wird",
-    "Steam Game Server": "Steam Game Server",
-    "Most likely causes:": "Wahrscheinliche Ursachen:",
-    "The resource is no longer available.": "Die Quelle ist nicht mehr verfügbar.",
-    "There might be a typing error in the address.": "Es gibt einen Tippfehler in der Adresse.",
-    "What you can try:": "Was du versuchen kannst:",
-    "Retype the address.": "Schreibe die Adresse erneut.",
-    "Go back to the previous page.": "Gehe zur vorigen Seite.",
-    "Coming Soon": "Kommt bald",
-    wayToGetClickSendSMSToken: "Du kannst einen API Nutzernamen und Schlüssel unter {0} erhalten.",
-    "Connection String": "Verbindungstext",
-    Query: "Abfrage",
-    settingsCertificateExpiry: "TLS Zertifikatsablauf",
-    certificationExpiryDescription: "HTTPS Monitore senden eine Benachrichtigung, wenn das Zertifikat abläuft in:",
-    "Setup Docker Host": "Docker Host einrichten",
-    "Connection Type": "Verbindungstyp",
-    "Docker Daemon": "Docker Daemon",
-    deleteDockerHostMsg: "Bist du sicher diesen docker host für alle Monitore zu löschen?",
-    socket: "Socket",
-    tcp: "TCP / HTTP",
-    "Docker Container": "Docker Container",
-    "Container Name / ID": "Container Name / ID",
-    "Docker Host": "Docker Host",
-    "Docker Hosts": "Docker Hosts",
-    "ntfy Topic": "ntfy Thema",
-    Domain: "Domain",
-    Workstation: "Workstation",
-    disableCloudflaredNoAuthMsg: "Du bist im nicht-authentifizieren Modus, ein Passwort wird nicht benötigt.",
-    trustProxyDescription: "Vertraue 'X-Forwarded-*' headern. Wenn man die richtige client IP haben möchte und Uptime Kuma hinter einem Proxy wie Nginx or Apache läuft, wollte dies aktiviert werden.",
-    wayToGetLineNotifyToken: "Du kannst hier ein Token erhalten: {0}",
-    Examples: "Beispiele",
-    "Home Assistant URL": "Home Assistant URL",
-    "Long-Lived Access Token": "Lange gültiges Access Token",
-    "Long-Lived Access Token can be created by clicking on your profile name (bottom left) and scrolling to the bottom then click Create Token. ": "Lange gültige Access Token  können durch klicken auf den Profilnamen (unten links) und dann einen Klick auf Create Token am Ende erstellt werden. ",
-    "Notification Service": "Benachrichtigungsdienst",
-    "default: notify all devices": "standard: Alle Geräte benachrichtigen",
-    "A list of Notification Services can be found in Home Assistant under \"Developer Tools > Services\" search for \"notification\" to find your device/phone name.": "Eine Liste der Benachrichtigungsdienste kann im Home Assistant unter \"Developer Tools > Services\" gefunden werden, wnen man nach \"notification\" sucht um den Geräte-/Telefonnamen zu finden.",
-    "Automations can optionally be triggered in Home Assistant:": "Automatisierungen können optional im Home Assistant ausgelöst werden:",
-    "Trigger type:": "Auslöser:",
-    "Event type:": "Ereignistyp:",
-    "Event data:": "Ereignis daten:",
-    "Then choose an action, for example switch the scene to where an RGB light is red.": "Dann eine Aktion wählen, zum Beispiel eine Scene wählen in der ein RGB Licht rot ist.",
-    "Frontend Version": "Frontend Version",
-    "Frontend Version do not match backend version!": "Die Frontend Version stimmt nicht mit der backend version überein!",
-    Maintenance: "Wartung",
-    statusMaintenance: "Wartung",
-    "Schedule maintenance": "Geplante Wartung",
-    "Affected Monitors": "Betroffene Monitore",
-    "Pick Affected Monitors...": "Wähle betroffene Monitore...",
-    "Start of maintenance": "Beginn der Wartung",
-    "All Status Pages": "Alle Status Seiten",
-    "Select status pages...": "Statusseiten auswählen...",
-    recurringIntervalMessage: "Einmal pro Tag ausgeführt | Wird alle {0} Tage ausgführt",
-    affectedMonitorsDescription: "Wähle Monitore aus, die von der aktuellen Wartung betroffen sind",
-    affectedStatusPages: "Diese Wartungsmeldung auf ausgewählten Statusseiten anzeigen",
-    atLeastOneMonitor: "Wähle mindestens einen Monitor",
-    deleteMaintenanceMsg: "Möchtest du diese Wartung löschen?",
-    "Base URL": "Basis URL",
-    goAlertInfo: "GoAlert ist eine Open-Source Applikation für Rufbereitschaftsplanung, automatische Eskalation und Benachrichtigung (z.B. SMS oder Telefonanrufe). Beauftragen Sie automatisch die richtige Person, auf die richtige Art und Weise und zum richtigen Zeitpunkt. {0}",
-    goAlertIntegrationKeyInfo: "Bekommt einen generischen API Schlüssel in folgenden Format \"aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee\". Normalerweise entspricht dies dem Wert des Token aus der URL.",
-    goAlert: "GoAlert",
-    backupOutdatedWarning: "Veraltet: Da viele Funktionen hinzugefügt wurden und diese Sicherungsfunktion nicht mehr gepflegt wird, kann sie keine vollständige Sicherung erstellen oder wiederherstellen.",
-    backupRecommend: "Bitte sichere stattdessen das Volume oder den Datenordner (./data/) direkt.",
-    Optional: "Optional",
-    squadcast: "Squadcast",
-    SendKey: "SendKey",
-    "SMSManager API Docs": "SMSManager API Dokumente",
-    "Gateway Type": "Gateway Type",
-    SMSManager: "SMSManager",
-    "You can divide numbers with": "Du kannst Zahlen teilen mit",
-    or: "oder",
-    recurringInterval: "Intervall",
-    Recurring: "Wiederkehrend",
-    "Single Maintenance Window": "Einzigartiges Wartungsfenster",
-    "Maintenance Time Window of a Day": "Zeitfenster für die Wartung",
-    "Effective Date Range": "Bereich der Wirksamkeitsdaten",
-    strategyManual: "Aktiv/Inaktiv Manuell",
-    warningTimezone: "Es wird die Zeitzone des Servers verwendet",
-    weekdayShortMon: "Mo",
-    weekdayShortTue: "Di",
-    weekdayShortWed: "Mi",
-    weekdayShortThu: "Do",
-    weekdayShortFri: "Fr",
-    weekdayShortSat: "Sa",
-    weekdayShortSun: "So",
-    dayOfWeek: "Tag der Woche",
-    dayOfMonth: "Tag im Monat",
-    lastDay: "Letzter Tag",
-    lastDay1: "Letzter Tag im Monat",
-    lastDay2: "Vorletzer Tag im Monat",
-    lastDay3: "3. letzter Tag im Monat",
-    lastDay4: "4. letzter Tag im Monat",
-    "No Maintenance": "Keine Wartung",
-    "Schedule Maintenance": "Wartung planen",
-    pauseMaintenanceMsg: "Möchtest du wirklich pausieren?",
-    "maintenanceStatus-under-maintenance": "Unter Wartung",
-    "maintenanceStatus-inactive": "Inaktiv",
-    "maintenanceStatus-scheduled": "Geplant",
-    "maintenanceStatus-ended": "Ende",
-    "maintenanceStatus-unknown": "Unbekannt",
-    "Display Timezone": "Zeitzone anzeigen",
-    "Server Timezone": "Server Zeitzone",
-    "Date and Time": "Datum und Zeit",
-    "DateTime Range": "Datums- und Zeitbereich",
-    Strategy: "Strategie",
-    statusPageMaintenanceEndDate: "Ende",
-};
diff --git a/src/languages/el-GR.js b/src/languages/el-GR.js
deleted file mode 100644
index c520a6079..000000000
--- a/src/languages/el-GR.js
+++ /dev/null
@@ -1,585 +0,0 @@
-export default {
-    languageName: "Ελληνικά",
-    checkEverySecond: "Έλεγχος κάθε {0} δευτερόλεπτα",
-    retryCheckEverySecond: "Επανάληψη κάθε {0} δευτερόλεπτα",
-    resendEveryXTimes: "Επανάληψη αποστολής ειδοποίησης κάθε {0} φορές",
-    resendDisabled: "Η επανάληψη αποστολής ειδοποίησης είναι απενεργοποιημένη",
-    retriesDescription: "Μέγιστες επαναλήψεις προτού η υπηρεσία επισημανθεί ως κατω και σταλεί μια ειδοποίηση",
-    ignoreTLSError: "Παράβλεψη σφάλματος TLS/SSL για ιστότοπους HTTPS",
-    upsideDownModeDescription: "Αναποδογυρίστε την κατάσταση. Εάν η υπηρεσία είναι προσβάσιμη, είναι ΚΑΤΩ.",
-    maxRedirectDescription: "Μέγιστος αριθμός redirect που θα ακολουθήσουν. Ρυθμίστε το 0 για να απενεργοποιήσετε τα redirect.",
-    acceptedStatusCodesDescription: "Επιλέξτε κωδικούς κατάστασης που θεωρούνται επιτυχή.",
-    passwordNotMatchMsg: "Ο κωδικός δεν ταιριάζει.",
-    notificationDescription: "Οι ειδοποιήσεις πρέπει να εκχωρηθούν σε μια παρακολούθηση για να λειτουργήσουν.",
-    keywordDescription: "Αναζήτηση λέξης-κλειδιού σε απλή απόκριση HTML ή JSON. Η αναζήτηση είναι διάκριση πεζών-κεφαλαίων.",
-    pauseDashboardHome: "Παύση",
-    deleteMonitorMsg: "Είστε βέβαιοι ότι θέλετε να διαγράψετε αυτήν την παρακολούθηση;",
-    deleteNotificationMsg: "Είστε βέβαιοι ότι θέλετε να διαγράψετε αυτήν την ειδοποίηση για όλες τις παρακολούθησης?",
-    dnsPortDescription: "Θύρα διακομιστή DNS. Προεπιλογή σε 53. Μπορείτε να αλλάξετε τη θύρα ανά πάσα στιγμή.",
-    resolverserverDescription: "Το Cloudflare είναι ο προεπιλεγμένος διακομιστής. Μπορείτε να αλλάξετε τον διακομιστή επίλυσης ανά πάσα στιγμήhe default server. You can change the resolver server anytime.",
-    rrtypeDescription: "Επιλέξτε τον τύπο RR που θέλετε να παρακολουθήσετε",
-    pauseMonitorMsg: "Είστε βέβαιοι ότι θέλετε να κάνετε παύση;",
-    enableDefaultNotificationDescription: "Αυτή η ειδοποίηση θα είναι ενεργοποιημένη από προεπιλογή για νέες παρακολούθησης. Μπορείτε ακόμα να απενεργοποιήσετε την ειδοποίηση ξεχωριστά για κάθε παρακολούθηση.",
-    clearEventsMsg: "Είστε βέβαιοι ότι θέλετε να διαγράψετε όλα τα συμβάντα για αυτήν την παρακολούθηση;",
-    clearHeartbeatsMsg: "Είστε βέβαιοι ότι θέλετε να διαγράψετε όλους τους καρδιακούς παλμούς για αυτήν την παρακολούθηση;",
-    confirmClearStatisticsMsg: "Είστε βέβαιοι ότι θέλετε να διαγράψετε ΟΛΑ τα στατιστικά στοιχεία;?",
-    importHandleDescription: "Επιλέξτε «Παράλειψη υπάρχοντος» εάν θέλετε να παραλείψετε κάθε παρακολούθηση ή ειδοποίηση με το ίδιο όνομα. Το 'Overwrite' θα διαγράψει κάθε υπάρχουσα παρακολούθηση και ειδοποίηση.",
-    confirmImportMsg: "Είστε βέβαιοι ότι θέλετε να εισαγάγετε το αντίγραφο ασφαλείας; Επαληθεύστε ότι έχετε επιλέξει τη σωστή επιλογή.",
-    twoFAVerifyLabel: "Εισαγάγετε το 2FA κωδικό για να επαληθεύσετε: ",
-    tokenValidSettingsMsg: "Ο κωδικός 2FA είναι έγκυρο! Τώρα μπορείτε να αποθηκεύσετε τις ρυθμίσεις 2FA",
-    confirmEnableTwoFAMsg: "Είστε βέβαιοι ότι θέλετε να ενεργοποιήσετε το 2FA;",
-    confirmDisableTwoFAMsg: "Είστε βέβαιοι ότι θέλετε να απενεργοποιήσετε το 2FA;",
-    Settings: "Ρυθμίσεις",
-    Dashboard: "Πίνακας",
-    "New Update": "Νέα αναβάθμιση",
-    Language: "Γλώσσα",
-    Appearance: "Εμφάνιση",
-    Theme: "Θέμα",
-    General: "Γενικά",
-    "Primary Base URL": "Κύρια βασική διεύθυνση URL",
-    Version: "Εκδοχή",
-    "Check Update On GitHub": "Ελέγξτε για Ενημέρωση στο GitHub",
-    List: "Λίστα",
-    Add: "Προσθήκη",
-    "Add New Monitor": "Προσθήκη νέας παρακολούθησης",
-    "Quick Stats": "Γρήγορα στατιστικά",
-    Up: "Πάνω",
-    Down: "Κάτω",
-    Pending: "Εκκρεμεί",
-    Unknown: "Άγνωστο",
-    Pause: "Παύση",
-    Name: "Ονομα",
-    Status: "Κατάσταση",
-    DateTime: "ΗμερομηνίαΏρα",
-    Message: "Μήνυμα",
-    "No important events": "Δεν υπάρχουν σημαντικά γεγονότα",
-    Resume: "Συνέχιση",
-    Edit: "Επεξεργασία",
-    Delete: "Διαγράφη",
-    Current: "Current",
-    Uptime: "Χρόνος λειτουργίας",
-    "Cert Exp.": "Cert Exp.",
-    day: "ημέρα | ημέρες",
-    "-day": "-ημέρα",
-    hour: "ώρα",
-    "-hour": "-ώρα",
-    Response: "Απάντηση",
-    Ping: "Ping",
-    "Monitor Type": "Τύπος παρακολούθησης",
-    Keyword: "Λέξη-κλειδί",
-    "Friendly Name": "Φιλικό όνομα",
-    URL: "URL",
-    Hostname: "Hostname",
-    Port: "Port",
-    "Heartbeat Interval": "Διάστημα καρδιακών παλμών",
-    Retries: "Επαναλήψεις",
-    "Heartbeat Retry Interval": "Διάστημα επανάληψης παλμών καρδιάς",
-    "Resend Notification if Down X times consequently": "Αποστολή νέας ειδοποίησης εάν κατω X φορές κατά συνέχεια",
-    Advanced: "Προχωρημένα",
-    "Upside Down Mode": "Ανάποδη λειτουργία",
-    "Max. Redirects": "Μέγιστη. Ανακατευθύνσεις",
-    "Accepted Status Codes": "Αποδεκτοί Κωδικοί Κατάστασης",
-    "Push URL": "Push URL",
-    needPushEvery: "Θα πρέπει να καλείτε αυτήν τη διεύθυνση URL κάθε {0} δευτερόλεπτα.",
-    pushOptionalParams: "Προαιρετικές παράμετροι: {0}",
-    Save: "Αποθηκεύση",
-    Notifications: "Ειδοποιήσεις",
-    "Not available, please setup.": "Μη διαθέσιμο, παρακαλώ ρυθμίστε.",
-    "Setup Notification": "Δημιουργία ειδοποίησης",
-    Light: "Φωτεινό",
-    Dark: "Σκοτεινό",
-    Auto: "Αυτόματο",
-    "Theme - Heartbeat Bar": "Θέμα - Μπάρα καρδιακών παλμών",
-    Normal: "Κανονικό",
-    Bottom: "Κάτω μέρος",
-    None: "Τίποτα",
-    Timezone: "Ζώνη ώρας",
-    "Search Engine Visibility": "Ορατότητα μηχανών αναζήτησης",
-    "Allow indexing": "Να επιτρέπεται η ευρετηρίαση",
-    "Discourage search engines from indexing site": "Αποθαρρύνετε τις μηχανές αναζήτησης από την ευρετηρίαση ιστότοπου",
-    "Change Password": "Αλλαγή κωδικού πρόσβασης",
-    "Current Password": "Τρέχων κωδικός πρόσβασης",
-    "New Password": "Νέος κωδικός πρόσβασης",
-    "Repeat New Password": "Επαναλάβετε τον νέο κωδικό πρόσβασης",
-    "Update Password": "Ενημέρωση κωδικού πρόσβασης",
-    "Disable Auth": "Απενεργοποίηση ελέγχου ταυτότητας",
-    "Enable Auth": "Ενεργοποίηση ελέγχου ταυτότητας",
-    "disableauth.message1": "Είστε βέβαιοι ότι θέλετε να <strong>απενεργοποιήσετε τον έλεγχο ταυτότητας</strong>;",
-    "disableauth.message2": "Έχει σχεδιαστεί για σενάρια <strong>όπου σκοπεύετε να εφαρμόσετε έλεγχο ταυτότητας τρίτου μέρους</strong> μπροστά από το Uptime Kuma, όπως το Cloudflare Access, Authelia ή άλλους μηχανισμούς ελέγχου ταυτότητας.",
-    "Please use this option carefully!": "Χρησιμοποιήστε αυτή την επιλογή προσεκτικά!",
-    Logout: "Αποσύνδεση",
-    Leave: "Φύγετε",
-    "I understand, please disable": "Καταλαβαίνω, απενεργοποιήστε",
-    Confirm: "Επιβεβαίωση",
-    Yes: "Ναί",
-    No: "Οχι",
-    Username: "Όνομα χρήστη",
-    Password: "Κωδικός πρόσβασης",
-    "Remember me": "Θυμήσου με",
-    Login: "Σύνδεση",
-    "No Monitors, please": "Δεν υπάρχουν παρακολούθησης παρακαλώ",
-    "add one": "προσθέστε ένα",
-    "Notification Type": "Είδος ειδοποίησης",
-    Email: "Email",
-    Test: "Δοκιμή",
-    "Certificate Info": "Πληροφορίες πιστοποιητικού",
-    "Resolver Server": "Διακομιστής επίλυσης",
-    "Resource Record Type": "Τύπος εγγραφής πόρων",
-    "Last Result": "Τελευταίο Αποτέλεσμα",
-    "Create your admin account": "Δημιουργήστε τον λογαριασμό διαχειριστή σας",
-    "Repeat Password": "Επαναλάβετε τον κωδικό πρόσβασης",
-    "Import Backup": "Εισαγωγή αντιγράφων ασφαλείας",
-    "Export Backup": "Εξαγωγή αντιγράφων ασφαλείας",
-    Export: "Εξαγωγή",
-    Import: "Εισαγωγή",
-    respTime: "Χρόν. Aπό (ms)",
-    notAvailableShort: "N/A",
-    "Default enabled": "Προεπιλογή ενεργοποιημένη",
-    "Apply on all existing monitors": "Εφαρμόστε σε όλες τις υπάρχουσες παρακολούθησης",
-    Create: "Δημιουργία",
-    "Clear Data": "Καθαρισμός δεδομένων",
-    Events: "Γεγονότα",
-    Heartbeats: "Παλμοι καρδιας",
-    "Auto Get": "Αυτόματη λήψη",
-    backupDescription: "Μπορείτε να δημιουργήσετε αντίγραφα ασφαλείας γία ολλες της παρακολούθησης και ειδοποιήσης σε ένα αρχείο JSON.",
-    backupDescription2: "Σημείωση: δεν περιλαμβάνονται δεδομένα ιστορικού και συμβάντων.",
-    backupDescription3: "Στο αρχείο εξαγωγής περιλαμβάνονται ευαίσθητα δεδομένα, όπως token ειδοποιήσεων. Aποθηκεύστε την εξαγωγή με ασφάλεια.",
-    alertNoFile: "Επιλέξτε ένα αρχείο για εισαγωγή.",
-    alertWrongFileType: "Επιλέξτε ένα αρχείο JSON.",
-    "Clear all statistics": "Εκκαθάριση όλων των στατιστικών",
-    "Skip existing": "Παράβλεψη υπάρχοντος",
-    Overwrite: "Αντικατάσταση",
-    Options: "Επιλογές",
-    "Keep both": "Κράτα και τα δύο",
-    "Verify Token": "Επαλήθευση Token",
-    "Setup 2FA": "Ρύθμιση 2FA",
-    "Enable 2FA": "Ενεργοποίηση 2FA",
-    "Disable 2FA": "Απενεργοποίηση 2FA",
-    "2FA Settings": "Ρυθμίσεις 2FA",
-    "Two Factor Authentication": "Έλεγχος ταυτότητας δύο παραγόντων",
-    Active: "Ενεργός",
-    Inactive: "Ανενεργό",
-    Token: "Token",
-    "Show URI": "Εμφάνιση URI",
-    Tags: "Ετικέτες",
-    "Add New below or Select...": "Προσθήκη νέου παρακάτω ή Επιλέξτε...",
-    "Tag with this name already exist.": "Υπάρχει ήδη η ετικέτα με αυτό το όνομα.",
-    "Tag with this value already exist.": "Υπάρχει ήδη ετικέτα με αυτό το value.",
-    color: "χρώμα",
-    "value (optional)": "value (optional)",
-    Gray: "Γκρί",
-    Red: "Κόκκινο",
-    Orange: "Πορτοκάλι",
-    Green: "Πράσινο",
-    Blue: "Μπλε",
-    Indigo: "Indigo",
-    Purple: "Μωβ",
-    Pink: "Ροζ",
-    "Search...": "Αναζήτηση...",
-    "Avg. Ping": "Μέσo.Ping",
-    "Avg. Response": "Μέσo. Aπάντηση",
-    "Entry Page": "Σελίδα εισαγωγής",
-    statusPageNothing: "Δεν υπάρχει τίποτα εδώ, προσθέστε μια ομάδα ή μια παρακολούθηση.",
-    "No Services": "Δεν υπάρχουν υπηρεσίες",
-    "All Systems Operational": "Όλα τα συστήματα λειτουργούν",
-    "Partially Degraded Service": "Μερικώς υποβαθμισμένη υπηρεσία",
-    "Degraded Service": "Υποβαθμισμένη υπηρεσία",
-    "Add Group": "Προσθήκη γρουπ",
-    "Add a monitor": "Προσθήκη παρακολούθησης",
-    "Edit Status Page": "Επεξεργασία σελίδας κατάστασης",
-    "Go to Dashboard": "Μεταβείτε στον Πίνακα ελέγχου",
-    "Status Page": "Σελίδα κατάστασης",
-    "Status Pages": "Σελίδες κατάστασης",
-    defaultNotificationName: "Η ειδοποίηση μου {notification} ({number})",
-    here: "εδώ",
-    Required: "Απαιτείται",
-    telegram: "Telegram",
-    "Bot Token": "Διακριτικό Bot",
-    wayToGetTelegramToken: "Μπορείτε να πάρετε ένα διακριτικό από {0}.",
-    "Chat ID": "Chat ID",
-    supportTelegramChatID: "Support Direct Chat / Group / Channel's Chat ID",
-    wayToGetTelegramChatID: "Μπορείτε να λάβετε το αναγνωριστικό συνομιλίας σας στέλνοντας ένα μήνυμα στο bot και μεταβαίνοντας σε αυτήν τη διεύθυνση URL για να προβάλετε το chat_id:",
-    "YOUR BOT TOKEN HERE": "ΤΟ BOT ΣΑΣ ΔΙΑΚΡΙΤΙΚΌ ΕΔΩ",
-    chatIDNotFound: "Το Chat ID δεν βρέθηκε. Στείλτε πρώτα ένα μήνυμα σε αυτό το bot",
-    webhook: "Webhook",
-    "Post URL": "Post URL",
-    "Content Type": "Τύπος περιεχομένου",
-    webhookJsonDesc: "{0} είναι καλό για οποιονδήποτε σύγχρονο διακομιστή HTTP όπως το Express.js",
-    webhookFormDataDesc: "{multipart} είναι καλό για την PHP. Το JSON θα πρέπει να αναλυθεί με {decodeFunction}",
-    smtp: "Email (SMTP)",
-    secureOptionNone: "None / STARTTLS (25, 587)",
-    secureOptionTLS: "TLS (465)",
-    "Ignore TLS Error": "Παράβλεψη σφάλματος TLS",
-    "From Email": "Από Email",
-    emailCustomSubject: "Προσαρμοσμένο θέμα",
-    "To Email": "Προς Email",
-    smtpCC: "CC",
-    smtpBCC: "BCC",
-    discord: "Discord",
-    "Discord Webhook URL": "Discord Webhook URL",
-    wayToGetDiscordURL: "Μπορείτε να το αποκτήσετε μεταβαίνοντας στις Ρυθμίσεις διακομιστή -> Ενσωματώσεις -> Δημιουργία Webhook",
-    "Bot Display Name": "Εμφανιζόμενο όνομα bot",
-    "Prefix Custom Message": "Προσαρμοσμένο μήνυμα",
-    "Hello @everyone is...": "Γεια {'@'}everyone ειναι...",
-    teams: "Microsoft Teams",
-    "Webhook URL": "Webhook URL",
-    wayToGetTeamsURL: "Μπορείτε να μάθετε πώς να δημιουργείτε μια διεύθυνση URL webhook {0}.",
-    signal: "Signal",
-    Number: "Αριθμός",
-    Recipients: "Αποδέκτες",
-    needSignalAPI: "Πρέπει να έχετε ένα signal client με REST API..",
-    wayToCheckSignalURL: "Μπορείτε να ελέγξετε αυτό το URL για να δείτε πώς να ρυθμίσετε ένα:",
-    signalImportant: "ΣΗΜΑΝΤΙΚΟ: Δεν μπορείτε να συνδυάσετε ομάδες και αριθμούς στους παραλήπτες!",
-    gotify: "Gotify",
-    "Application Token": "Token εφαρμογής",
-    "Server URL": "URL διακομιστή",
-    Priority: "Προτεραιότητα",
-    slack: "Slack",
-    "Icon Emoji": "Εικονίδιο Emoji",
-    "Channel Name": "Όνομα καναλιού",
-    "Uptime Kuma URL": "Uptime Kuma URL",
-    aboutWebhooks: "Περισσότερες πληροφορίες σχετικά με τα Webhooks στο: {0}",
-    aboutChannelName: "Εισαγάγετε το όνομα του καναλιού στο {0} Όνομα καναλιού εάν θέλετε να παρακάμψετε το κανάλι Webhook. Π.χ.: #other-channel",
-    aboutKumaURL: "Εάν αφήσετε κενό το πεδίο URL Uptime Kuma, θα είναι προεπιλεγμένο στη σελίδα Project GitHub..",
-    emojiCheatSheet: "Φύλλο εξαπάτησης emoji: {0}",
-    "rocket.chat": "Rocket.Chat",
-    pushover: "Pushover",
-    pushy: "Pushy",
-    PushByTechulus: "Push by Techulus",
-    octopush: "Octopush",
-    promosms: "PromoSMS",
-    clicksendsms: "ClickSend SMS",
-    lunasea: "LunaSea",
-    apprise: "Apprise (Support 50+ Notification services)",
-    GoogleChat: "Google Chat (Google Workspace only)",
-    pushbullet: "Pushbullet",
-    line: "Line Messenger",
-    mattermost: "Mattermost",
-    "User Key": "Κλειδί χρήστη",
-    Device: "Συσκευή",
-    "Message Title": "Τίτλος μηνύματος",
-    "Notification Sound": "Ήχος ειδοποίησης",
-    "More info on:": "Περισσότερες πληροφορίες στο: {0}",
-    pushoverDesc1: "Η προτεραιότητα έκτακτης ανάγκης (2) έχει προεπιλεγμένο χρονικό όριο 30 δευτερολέπτων μεταξύ των επαναλήψεων και θα λήξει μετά από 1 ώρα.",
-    pushoverDesc2: "Εάν θέλετε να στέλνετε ειδοποιήσεις σε διαφορετικές συσκευές, συμπληρώστε το πεδίο Συσκευή.",
-    "SMS Type": "Τύπος SMS",
-    octopushTypePremium: "Premium (Γρήγορη - συνιστάται για ειδοποίηση)",
-    octopushTypeLowCost: "Χαμηλό κόστος (Αργό - μερικές φορές μπλοκάρεται από τον χειριστή)",
-    checkPrice: "Ελέγξτε τις τιμές {0}:",
-    apiCredentials: "API credentials",
-    octopushLegacyHint: "Χρησιμοποιείτε την παλαιού τύπου έκδοση του Octopush (2011-2020) ή τη νέα έκδοση;",
-    "Check octopush prices": "Ελέγξτε τις τιμές OctoPush {0}.",
-    octopushPhoneNumber: "Αριθμός τηλεφώνου (διεθνής μορφή, π.χ.: +30694345678)",
-    octopushSMSSender: "Όνομα αποστολέα SMS: 3-11 αλφαριθμητικοί χαρακτήρες και διάστημα (a-zA-Z0-9)",
-    "LunaSea Device ID": "LunaSea Device ID",
-    "Apprise URL": "Apprise URL",
-    "Example:": "Παράδειγμα: {0}",
-    "Read more:": "Διαβάστε περισσότερα: {0}",
-    "Status:": "Κατάσταση: {0}",
-    "Read more": "Διαβάστε περισσότερα",
-    appriseInstalled: "Το Apprise έχει εγκατασταθεί.",
-    appriseNotInstalled: "Το Apprise δεν έχει εγκατασταθεί. {0}",
-    "Access Token": "Access Token",
-    "Channel access token": "Channel Access Token",
-    "Line Developers Console": "Line Developers Console",
-    lineDevConsoleTo: "Line Developers Console - {0}",
-    "Basic Settings": "Βασικές ρυθμίσεις",
-    "User ID": "User ID",
-    "Messaging API": "Messaging API",
-    wayToGetLineChannelToken: "Πρώτα αποκτήστε πρόσβαση στο {0}, δημιουργήστε έναν πάροχο και ένα κανάλι (Messanging API) και, στη συνέχεια, μπορείτε να λάβετε το channel access token και το user ID από τα παραπάνω στοιχεία μενού.",
-    "Icon URL": "Διεύθυνση URL εικονιδίου",
-    aboutIconURL: "Μπορείτε να παρέχετε έναν σύνδεσμο προς μια εικόνα στο \"Icon URL\" για να παρακάμψετε την προεπιλεγμένη εικόνα προφίλ. Δεν θα χρησιμοποιηθεί εάν έχει οριστεί το εικονίδιο Emoji.",
-    aboutMattermostChannelName: "Μπορείτε να παρακάμψετε το προεπιλεγμένο κανάλι στο οποίο δημοσιεύει το Webhook εισάγοντας το όνομα του καναλιού στο πεδίο \"Όνομα καναλιού\". Αυτό πρέπει να ενεργοποιηθεί στις ρυθμίσεις του Mattermost Webhook. Π.χ.: #other-channel",
-    matrix: "Matrix",
-    promosmsTypeEco: "SMS ECO - φθηνό αλλά αργό και συχνά υπερφορτωμένο. Περιορίζεται μόνο σε Πολωνούς παραλήπτες.",
-    promosmsTypeFlash: "SMS FLASH - Το μήνυμα θα εμφανίζεται αυτόματα στη συσκευή του παραλήπτη. Περιορίζεται μόνο σε Πολωνούς παραλήπτες.",
-    promosmsTypeFull: "SMS FULL - Premium επίπεδο SMS, Μπορείτε να χρησιμοποιήσετε το Όνομα Αποστολέα σας (Πρέπει πρώτα να καταχωρήσετε το όνομα). Αξιόπιστο για ειδοποιήσεις.",
-    promosmsTypeSpeed: "SMS SPEED - Υψηλότερη προτεραιότητα στο σύστημα. Πολύ γρήγορο και αξιόπιστο αλλά ακριβό (περίπου διπλάσια τιμή SMS FULL).",
-    promosmsPhoneNumber: "Αριθμός τηλεφώνου (για πολωνούς παραλήπτες Μπορείτε να παραλείψετε τους κωδικούς περιοχής)",
-    promosmsSMSSender: "Όνομα αποστολέα SMS: Προεγγεγραμμένο όνομα ή ένα από τα προεπιλεγμένα: InfoSMS, SMS Info, MaxSMS, INFO, SMS",
-    "Feishu WebHookUrl": "Feishu WebHookURL",
-    matrixHomeserverURL: "Homeserver URL (με http(s):// και προαιρετικά θύρα)",
-    "Internal Room Id": "Internal Room ID",
-    matrixDesc1: "Μπορείτε να βρείτε το internal room ID ανατρέχοντας στην ενότητα για προχωρημένους των ρυθμίσεων δωματίου στο πρόγραμμα-πελάτη Matrix. Θα πρέπει να μοιάζει με !QMdRCpUIfLwsfjxye6:home.server.",
-    matrixDesc2: "Συνιστάται ανεπιφύλακτα να δημιουργήσετε έναν νέο χρήστη και να μην χρησιμοποιήσετε το διακριτικό πρόσβασης του χρήστη Matrix, καθώς θα επιτρέψει την πλήρη πρόσβαση στον λογαριασμό σας και σε όλα τα δωμάτια στα οποία συμμετέχετε. Αντίθετα, δημιουργήστε έναν νέο χρήστη και προσκαλέστε τον μόνο στο δωμάτιο στο οποίο θέλετε να λαμβάνετε την ειδοποίηση. Μπορείτε να λάβετε το access token εκτελώντας {0}",
-    Method: "Μέθοδος",
-    Body: "Σώμα",
-    Headers: "Headers",
-    PushUrl: "Push URL",
-    HeadersInvalidFormat: "The request headers are not valid JSON: ",
-    BodyInvalidFormat: "The request body is not valid JSON: ",
-    "Monitor History": "Ιστορικο Παρακολούθησης",
-    clearDataOlderThan: "Διατηρήστε τα δεδομένα ιστορικού παρακολούθησης για {0} ημέρες.",
-    PasswordsDoNotMatch: "Οι κωδικοί πρόσβασης δεν ταιριάζουν.",
-    records: "εγγραφές",
-    "One record": "Μία εγγραφή",
-    steamApiKeyDescription: "Για την παρακολούθηση ενός διακομιστή παιχνιδιών Steam χρειάζεστε ένα κλειδί Steam Web-API. Μπορείτε να καταχωρήσετε το κλειδί API σας εδώ: ",
-    "Current User": "Τρέχων χρήστης",
-    topic: "Θέμα",
-    topicExplanation: "Θέμα MQTT προς παρακολούθηση",
-    successMessage: "Μήνυμα επιτυχίας",
-    successMessageExplanation: "Μήνυμα MQTT που θα θεωρηθεί επιτυχές",
-    recent: "Πρόσφατος",
-    Done: "Ολοκληρώθηκε",
-    Info: "Πληροφορίες",
-    Security: "Ασφάλεια",
-    "Steam API Key": "Steam API Key",
-    "Shrink Database": "Συρρίκνωση βάσης δεδομένων",
-    "Pick a RR-Type...": "Επιλέξτε έναν τύπο RR...",
-    "Pick Accepted Status Codes...": "Επιλέξτε Αποδεκτούς κωδικούς κατάστασης...",
-    Default: "Προκαθορισμένο",
-    "HTTP Options": "Επιλογές HTTP",
-    "Create Incident": "Δημιουργία περιστατικού",
-    Title: "Τίτλος",
-    Content: "Περιεχόμενο",
-    Style: "Στυλ",
-    info: "πληροφορίες",
-    warning: "προειδοποίηση",
-    danger: "κίνδυνος",
-    error: "σφάλμα",
-    critical: "κριτικό",
-    primary: "primary",
-    light: "light",
-    dark: "dark",
-    Post: "Δημοσίευση",
-    "Please input title and content": "Παρακαλούμε εισαγάγετε τίτλο και περιεχόμενο",
-    Created: "Δημιουργήθηκε",
-    "Last Updated": "Τελευταία ενημέρωση",
-    Unpin: "Ξεκαρφιτσώστε",
-    "Switch to Light Theme": "Μετάβαση σε Ανιχτό θέμα",
-    "Switch to Dark Theme": "Μετάβαση σε Σκούρο θέμα",
-    "Show Tags": "Εμφάνιση ετικετών",
-    "Hide Tags": "Απόκρυψη ετικετών",
-    Description: "Περιγραφή",
-    "No monitors available.": "Δεν υπάρχουν διαθέσιμες παρακολουθήσεις.",
-    "Add one": "Προσθέστε ένα",
-    "No Monitors": "Χωρίς παρακολουθήσεις",
-    "Untitled Group": "Ομάδα χωρίς τίτλο",
-    Services: "Υπηρεσίες",
-    Discard: "Απορρίψει",
-    Cancel: "Ακυρο",
-    "Powered by": "Με την υποστήριξη του",
-    shrinkDatabaseDescription: "Ενεργοποίηση βάσης δεδομένων VACUUM για SQLite. Εάν η βάση δεδομένων σας έχει δημιουργηθεί μετά την έκδοση 1.10.0, το AUTO_VACUUM είναι ήδη ενεργοποιημένο και αυτή η ενέργεια δεν χρειάζεται.",
-    serwersms: "SerwerSMS.pl",
-    serwersmsAPIUser: "API Username (incl. webapi_ prefix)",
-    serwersmsAPIPassword: "API κωδικός πρόσβασης",
-    serwersmsPhoneNumber: "Αριθμός τηλεφώνου",
-    serwersmsSenderName: "Όνομα αποστολέα SMS (καταχωρήθηκε μέσω της πύλης πελατών)",
-    stackfield: "Stackfield",
-    Customize: "Προσαρμογή",
-    "Custom Footer": "Προσαρμογή Footer",
-    "Custom CSS": "Προσαρμογή CSS",
-    smtpDkimSettings: "Ρυθμίσεις DKIM",
-    smtpDkimDesc: "Ανατρέξτε στο Nodemailer DKIM {0} για χρήση.",
-    documentation: "documentation",
-    smtpDkimDomain: "Domain Name",
-    smtpDkimKeySelector: "Key Selector",
-    smtpDkimPrivateKey: "Private Key",
-    smtpDkimHashAlgo: "Hash Algorithm (Optional)",
-    smtpDkimheaderFieldNames: "Header Keys to sign (Optional)",
-    smtpDkimskipFields: "Header Keys not to sign (Optional)",
-    wayToGetPagerDutyKey: "Μπορείτε να το λάβετε μεταβαίνοντας στο Service -> Service Directory -> (Επιλέξτε μια υπηρεσία) -> Integrations -> Add integration. Εδώ μπορείτε να κάνετε αναζήτηση για \"Events API V2\". Περισσότερες πληροφορίες {0}",
-    "Integration Key": "Integration Key",
-    "Integration URL": "Integration URL",
-    "Auto resolve or acknowledged": "Αυτόματη επίλυση ή αναγνώριση",
-    "do nothing": "μην κάνεις τίποτα",
-    "auto acknowledged": "αυτόματη αναγνώριση",
-    "auto resolve": "αυτόματη επίλυση",
-    gorush: "Gorush",
-    alerta: "Alerta",
-    alertaApiEndpoint: "API Endpoint",
-    alertaEnvironment: "Environment",
-    alertaApiKey: "API Key",
-    alertaAlertState: "Alert State",
-    alertaRecoverState: "Recover State",
-    deleteStatusPageMsg: "Είστε βέβαιοι ότι θέλετε να διαγράψετε αυτήν τη σελίδα κατάστασης?",
-    Proxies: "Proxies",
-    default: "Προκαθορισμένο",
-    enabled: "Ενεργοποιημένο",
-    setAsDefault: "Ορίσετε ως προεπιλογή",
-    deleteProxyMsg: "Είστε βέβαιοι ότι θέλετε να διαγράψετε αυτό το proxy για όλες τις παρακολουθήσεις;",
-    proxyDescription: "Πρέπει να εκχωρηθούν proxies σε μια οθπαρακολουθή για να λειτουργήσουν..",
-    enableProxyDescription: "Το proxy δεν θα επηρεάσει τα αιτήματα της παρακολουθήσεις μέχρι να ενεργοποιηθεί. Μπορείτε να ελέγξετε την προσωρινή απενεργοποίηση του proxy από όλες τις παρακολουθήσεις βάσει κατάστασης ενεργοποίησης.",
-    setAsDefaultProxyDescription: "Αυτός το proxy θα είναι ενεργοποιημένο από προεπιλογή για νέες παρακολουθήσεις. Μπορείτε ακόμα να απενεργοποιήσετε το proxy ξεχωριστά για κάθε οθόνη.",
-    "Certificate Chain": "Certificate Chain",
-    Valid: "Εγκυρο",
-    Invalid: "Μη έγκυρο",
-    AccessKeyId: "AccessKey ID",
-    SecretAccessKey: "AccessKey Secret",
-    PhoneNumbers: "PhoneNumbers",
-    TemplateCode: "TemplateCode",
-    SignName: "SignName",
-    "Sms template must contain parameters: ": "Το πρότυπο SMS πρέπει να περιέχει παραμέτρους: ",
-    "Bark Endpoint": "Bark Endpoint",
-    "Bark Group": "Bark Ομάδα",
-    "Bark Sound": "Bark Ήχος",
-    WebHookUrl: "WebHookUrl",
-    SecretKey: "SecretKey",
-    "For safety, must use secret key": "Για ασφάλεια, πρέπει να χρησιμοποιήσετε secret key",
-    "Device Token": "Device Token",
-    Platform: "Platform",
-    iOS: "iOS",
-    Android: "Android",
-    Huawei: "Huawei",
-    High: "High",
-    Retry: "Ξαναδοκιμάσετε",
-    Topic: "Θέμα",
-    "WeCom Bot Key": "WeCom Bot Key",
-    "Setup Proxy": "Ρύθμιση Proxy",
-    "Proxy Protocol": "Πρωτόκολλο Proxy",
-    "Proxy Server": "Proxy Server",
-    "Proxy server has authentication": "Το Proxy διαθέτει έλεγχο ταυτότητας",
-    User: "Χρήστης",
-    Installed: "Εγκατεστημένο",
-    "Not installed": "Μη εγκατεστημενο",
-    Running: "Τρέχη",
-    "Not running": "Δεν τρεχη",
-    "Remove Token": "Κατάργηση Token",
-    Start: "Αρχή",
-    Stop: "Στάση",
-    "Uptime Kuma": "Uptime Kuma",
-    "Add New Status Page": "Προσθήκη νέας σελίδας κατάστασης",
-    Slug: "Slug",
-    "Accept characters:": "Αποδοχή χαρακτήρων:",
-    startOrEndWithOnly: "Ξεκινήστε ή τελειώστε μόνο με {0}",
-    "No consecutive dashes": "Χωρίς διαδοχικές παύλες",
-    Next: "Επόμενο",
-    "The slug is already taken. Please choose another slug.": "Ο slug έχει ήδη πιαστεί. Επιλέξτε άλλο slug.",
-    "No Proxy": "Οχι Proxy",
-    Authentication: "Authentication",
-    "HTTP Basic Auth": "HTTP Basic Auth",
-    "New Status Page": "Νέας Σελίδα κατάστασης",
-    "Page Not Found": "Η σελίδα δεν βρέθηκε",
-    "Reverse Proxy": "Αντίστροφο Proxy",
-    Backup: "Αντιγράφων ασφαλείας",
-    About: "Σχετικά με το Uptime Kuma",
-    wayToGetCloudflaredURL: "(Λήψη cloudflared από {0})",
-    cloudflareWebsite: "Ιστοσελίδα Cloudflare",
-    "Message:": "Μήνυμα:",
-    "Don't know how to get the token? Please read the guide:": "Δεν ξέρετε πώς να αποκτήσετε το token; Διαβάστε τον οδηγό:",
-    "The current connection may be lost if you are currently connecting via Cloudflare Tunnel. Are you sure want to stop it? Type your current password to confirm it.": "Η τρέχουσα σύνδεση μπορεί να χαθεί εάν αυτή τη στιγμή συνδέεστε μέσω του Cloudflare Tunnel. Θέλετε σίγουρα να το σταματήσετε; Πληκτρολογήστε τον τρέχοντα κωδικό πρόσβασής σας για να τον επιβεβαιώσετε.",
-    "HTTP Headers": "HTTP Headers",
-    "Trust Proxy": "Εμπιστοσύνη του Proxy",
-    "Other Software": "Other Software",
-    "For example: nginx, Apache and Traefik.": "Για παράδειγμα: nginx, Apache και Traefik.",
-    "Please read": "Παρακαλώ διαβάστε",
-    "Subject:": "Θέμα:",
-    "Valid To:": "Εγκυρο για:",
-    "Days Remaining:": "Ημέρες που απομένουν:",
-    "Issuer:": "Εκδότης:",
-    "Fingerprint:": "Δακτυλικό αποτύπωμα:",
-    "No status pages": "Δεν υπάρχουν σελίδες κατάστασης",
-    "Domain Name Expiry Notification": "Ειδοποίηση λήξης ονόματος τομέα",
-    Proxy: "Proxy",
-    "Date Created": "Ημερομηνία Δημιουργίας",
-    HomeAssistant: "Home Assistant",
-    onebotHttpAddress: "OneBot HTTP Address",
-    onebotMessageType: "OneBot Message Type",
-    onebotGroupMessage: "Group",
-    onebotPrivateMessage: "Private",
-    onebotUserOrGroupId: "Group/User ID",
-    onebotSafetyTips: "Για ασφάλεια, πρέπει να ορίσετε το acess token",
-    "PushDeer Key": "PushDeer Key",
-    "Footer Text": "Κείμενο υποσέλιδου",
-    "Show Powered By": "Εμφάνιση Powered By",
-    "Domain Names": "Ονόματα Τομέα",
-    signedInDisp: "Συνδεθήκατε ως {0}",
-    signedInDispDisabled: "Εξουσιοδότηση είναι απενεργοποιημένη.",
-    RadiusSecret: "Radius Secret",
-    RadiusSecretDescription: "Shared Secret μεταξύ client και το server",
-    RadiusCalledStationId: "Called Station Id",
-    RadiusCalledStationIdDescription: "Identifier της καλούμενης συσκευής",
-    RadiusCallingStationId: "Calling Station Id",
-    RadiusCallingStationIdDescription: "Identifier oτης συσκευής κλήσης",
-    "Certificate Expiry Notification": "Ειδοποίηση Λήξης Πιστοποιητικού",
-    "API Username": "API Username",
-    "API Key": "API Key",
-    "Recipient Number": "Αριθμός Παραλήπτη",
-    "From Name/Number": "Από Όνομα/Αριθμός",
-    "Leave blank to use a shared sender number.": "Αφήστε το κενό για να χρησιμοποιήσετε έναν κοινόχρηστο αριθμό αποστολέα.",
-    "Octopush API Version": "Octopush API Version",
-    "Legacy Octopush-DM": "Legacy Octopush-DM",
-    endpoint: "endpoint",
-    octopushAPIKey: "\"API key\" από το HTTP API credentials στον πίνακα ελέγχου",
-    octopushLogin: "\"Login\" από το HTTP API credentials στον πίνακα ελέγχου",
-    promosmsLogin: "API Login Name",
-    promosmsPassword: "API Password",
-    "pushoversounds pushover": "Pushover (default)",
-    "pushoversounds bike": "Bike",
-    "pushoversounds bugle": "Bugle",
-    "pushoversounds cashregister": "Cash Register",
-    "pushoversounds classical": "Classical",
-    "pushoversounds cosmic": "Cosmic",
-    "pushoversounds falling": "Falling",
-    "pushoversounds gamelan": "Gamelan",
-    "pushoversounds incoming": "Incoming",
-    "pushoversounds intermission": "Intermission",
-    "pushoversounds magic": "Magic",
-    "pushoversounds mechanical": "Mechanical",
-    "pushoversounds pianobar": "Piano Bar",
-    "pushoversounds siren": "Siren",
-    "pushoversounds spacealarm": "Space Alarm",
-    "pushoversounds tugboat": "Tug Boat",
-    "pushoversounds alien": "Alien Alarm (long)",
-    "pushoversounds climb": "Climb (long)",
-    "pushoversounds persistent": "Persistent (long)",
-    "pushoversounds echo": "Pushover Echo (long)",
-    "pushoversounds updown": "Up Down (long)",
-    "pushoversounds vibrate": "Vibrate Only",
-    "pushoversounds none": "None (silent)",
-    pushyAPIKey: "Μυστικό API Key",
-    pushyToken: "Τoken Συσκευής",
-    "Show update if available": "Εμφάνιση ενημέρωσης εάν είναι διαθέσιμη",
-    "Also check beta release": "Ελέγξτε επίσης την έκδοση beta",
-    "Using a Reverse Proxy?": "Χρησιμοποιείτε reverse proxy;",
-    "Check how to config it for WebSocket": "Ελέγξτε πώς να το ρυθμίσετε για το WebSocket",
-    "Steam Game Server": "Διακομιστής παιχνιδιών Steam",
-    "Most likely causes:": "Πιο πιθανές αιτίες:",
-    "The resource is no longer available.": "Ο πόρος δεν είναι πλέον διαθέσιμος.",
-    "There might be a typing error in the address.": "Μπορεί να υπάρχει σφάλμα πληκτρολόγησης στη διεύθυνση.",
-    "What you can try:": "Τι μπορείτε να δοκιμάσετε:",
-    "Retype the address.": "Πληκτρολογήστε ξανά τη διεύθυνση.",
-    "Go back to the previous page.": "Επιστρέψτε στην προηγούμενη σελίδα.",
-    "Coming Soon": "Ερχεται σύντομα",
-    wayToGetClickSendSMSToken: "Μπορείτε να πάρετε το API Username και API Key απο {0} .",
-    "Connection String": "Connection String",
-    Query: "Query",
-    settingsCertificateExpiry: "Λήξη πιστοποιητικού TLS",
-    certificationExpiryDescription: "Οι παρακολουθήσεις HTTPS ενεργοποιούν ειδοποίηση όταν λήξει το πιστοποιητικό TLS σε:",
-    "Setup Docker Host": "Ρύθμιση Docker Host",
-    "Connection Type": "Τύπος σύνδεσης",
-    "Docker Daemon": "Docker Daemon",
-    deleteDockerHostMsg: "Είστε βέβαιοι ότι θέλετε να διαγράψετε αυτόν τον κεντρικό υπολογιστή βάσης για όλες τις παρακολουθήσεις;",
-    socket: "Socket",
-    tcp: "TCP / HTTP",
-    "Docker Container": "Docker Container",
-    "Container Name / ID": "Container Name / ID",
-    "Docker Host": "Docker Host",
-    "Docker Hosts": "Docker Hosts",
-    "ntfy Topic": "ntfy Topic",
-    Domain: "Domain",
-    Workstation: "Workstation",
-    disableCloudflaredNoAuthMsg: "Βρίσκεστε σε λειτουργία No Auth, δεν απαιτείται κωδικός πρόσβασης.",
-    trustProxyDescription: "Εμπιστευτείτε τις κεφαλίδες 'X-Forwarded-*'. Εάν θέλετε να λάβετε τη σωστή IP πελάτη και το Uptime Kuma σας βρίσκεται πίσω το Nginx ή το Apache, θα πρέπει να το ενεργοποιήσετε.",
-    wayToGetLineNotifyToken: "Μπορείτε να λάβετε ένα access token από το {0}",
-    Examples: "Παραδείγματα",
-    "Home Assistant URL": "Home Assistant URL",
-    "Long-Lived Access Token": "Long-Lived Access Token",
-    "Long-Lived Access Token can be created by clicking on your profile name (bottom left) and scrolling to the bottom then click Create Token. ": "Long-Lived Access Token μπορεί να δημιουργηθεί κάνοντας κλικ στο όνομα του προφίλ σας (κάτω αριστερά) και κάνοντας κύλιση προς τα κάτω και, στη συνέχεια, κάντε κλικ στο Create Token. ",
-    "Notification Service": "Υπηρεσία ειδοποιήσεων",
-    "default: notify all devices": "προεπιλογή: ειδοποίηση όλων των συσκευών",
-    "A list of Notification Services can be found in Home Assistant under \"Developer Tools > Services\" search for \"notification\" to find your device/phone name.": "Μπορείτε να βρείτε μια λίστα με τις Υπηρεσίες ειδοποιήσεων στον Home assistant στην περιοχή \"Developer Tools > Services\" αναζήτηση για \"notification\" για να βρείτε το όνομα της συσκευής/τηλεφώνου σας.",
-    "Automations can optionally be triggered in Home Assistant:": "Οι αυτοματισμοί μπορούν προαιρετικά να ενεργοποιηθούν στο Home Assistant:",
-    "Trigger type:": "Τύπος ενεργοποίησης:",
-    "Event type:": "Τύπος συμβάντος:",
-    "Event data:": "Δεδομένα συμβάντος:",
-    "Then choose an action, for example switch the scene to where an RGB light is red.": "Στη συνέχεια, επιλέξτε μια ενέργεια, για παράδειγμα αλλάξτε τη σκηνή στο σημείο όπου ένα φως RGB είναι κόκκινο.",
-    "Frontend Version": "Έκδοση Frontend",
-    "Frontend Version do not match backend version!": "Η Frontend έκδοση δεν ταιριάζει με την έκδοση backend!",
-    "Base URL": "Βασική διεύθυνση URL",
-    goAlertInfo: "Το GoAlert είναι μια εφαρμογή ανοιχτού κώδικα για προγραμματισμό κλήσεων, αυτοματοποιημένες κλιμακώσεις και ειδοποιήσεις (όπως SMS ή φωνητικές κλήσεις). Αλληλεπιδράστε αυτόματα με το σωστό άτομο, με τον σωστό τρόπο και τη σωστή στιγμή! {0}",
-    goAlertIntegrationKeyInfo: "Λάβετε το generic API integration key για την υπηρεσία σε αυτήν τη μορφή \"aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee\" συνήθως την τιμή της παραμέτρου διακριτικού της αντιγραμμένης διεύθυνσης URL.",
-    goAlert: "GoAlert",
-    backupOutdatedWarning: "Καταργήθηκε: Επειδή προστέθηκαν πολλές δυνατότητες και αυτή η δυνατότητα δημιουργίας αντιγράφων ασφαλείας δεν διατηρείται πολη, δεν μπορεί να δημιουργήσει ή να επαναφέρει ένα πλήρες αντίγραφο ασφαλείας.",
-    backupRecommend: "Παρακαλούμε δημιουργήστε αντίγραφα ασφαλείας του volume ή του φακέλου δεδομένων (./data/) απευθείας.",
-};
diff --git a/src/languages/en.js b/src/languages/en.js
deleted file mode 100644
index 59ea0570d..000000000
--- a/src/languages/en.js
+++ /dev/null
@@ -1,674 +0,0 @@
-export default {
-    languageName: "English",
-    checkEverySecond: "Check every {0} seconds",
-    retryCheckEverySecond: "Retry every {0} seconds",
-    resendEveryXTimes: "Resend every {0} times",
-    resendDisabled: "Resend disabled",
-    retriesDescription: "Maximum retries before the service is marked as down and a notification is sent",
-    ignoreTLSError: "Ignore TLS/SSL error for HTTPS websites",
-    upsideDownModeDescription: "Flip the status upside down. If the service is reachable, it is DOWN.",
-    maxRedirectDescription: "Maximum number of redirects to follow. Set to 0 to disable redirects.",
-    enableGRPCTls: "Allow to send gRPC request with TLS connection",
-    grpcMethodDescription: "Method name is convert to cammelCase format such as sayHello, check, etc.",
-    acceptedStatusCodesDescription: "Select status codes which are considered as a successful response.",
-    Maintenance: "Maintenance",
-    statusMaintenance: "Maintenance",
-    "Schedule maintenance": "Schedule maintenance",
-    "Affected Monitors": "Affected Monitors",
-    "Pick Affected Monitors...": "Pick Affected Monitors...",
-    "Start of maintenance": "Start of maintenance",
-    "All Status Pages": "All Status Pages",
-    "Select status pages...": "Select status pages...",
-    recurringIntervalMessage: "Run once every day | Run once every {0} days",
-    affectedMonitorsDescription: "Select monitors that are affected by current maintenance",
-    affectedStatusPages: "Show this maintenance message on selected status pages",
-    atLeastOneMonitor: "Select at least one affected monitor",
-    passwordNotMatchMsg: "The repeat password does not match.",
-    notificationDescription: "Notifications must be assigned to a monitor to function.",
-    keywordDescription: "Search keyword in plain HTML or JSON response. The search is case-sensitive.",
-    pauseDashboardHome: "Pause",
-    deleteMonitorMsg: "Are you sure want to delete this monitor?",
-    deleteMaintenanceMsg: "Are you sure want to delete this maintenance?",
-    deleteNotificationMsg: "Are you sure want to delete this notification for all monitors?",
-    dnsPortDescription: "DNS server port. Defaults to 53. You can change the port at any time.",
-    resolverserverDescription: "Cloudflare is the default server. You can change the resolver server anytime.",
-    rrtypeDescription: "Select the RR type you want to monitor",
-    pauseMonitorMsg: "Are you sure want to pause?",
-    enableDefaultNotificationDescription: "This notification will be enabled by default for new monitors. You can still disable the notification separately for each monitor.",
-    clearEventsMsg: "Are you sure want to delete all events for this monitor?",
-    clearHeartbeatsMsg: "Are you sure want to delete all heartbeats for this monitor?",
-    confirmClearStatisticsMsg: "Are you sure you want to delete ALL statistics?",
-    importHandleDescription: "Choose 'Skip existing' if you want to skip every monitor or notification with the same name. 'Overwrite' will delete every existing monitor and notification.",
-    confirmImportMsg: "Are you sure you want to import the backup? Please verify you've selected the correct import option.",
-    twoFAVerifyLabel: "Please enter your token to verify 2FA:",
-    tokenValidSettingsMsg: "Token is valid! You can now save the 2FA settings.",
-    confirmEnableTwoFAMsg: "Are you sure you want to enable 2FA?",
-    confirmDisableTwoFAMsg: "Are you sure you want to disable 2FA?",
-    Settings: "Settings",
-    Dashboard: "Dashboard",
-    "New Update": "New Update",
-    Language: "Language",
-    Appearance: "Appearance",
-    Theme: "Theme",
-    General: "General",
-    "Primary Base URL": "Primary Base URL",
-    Version: "Version",
-    "Check Update On GitHub": "Check Update On GitHub",
-    List: "List",
-    Add: "Add",
-    "Add New Monitor": "Add New Monitor",
-    "Clone Monitor": "Clone Monitor",
-    "Quick Stats": "Quick Stats",
-    Up: "Up",
-    Down: "Down",
-    Pending: "Pending",
-    Unknown: "Unknown",
-    Pause: "Pause",
-    Name: "Name",
-    Status: "Status",
-    DateTime: "DateTime",
-    Message: "Message",
-    "No important events": "No important events",
-    Resume: "Resume",
-    Edit: "Edit",
-    Clone: "Clone",
-    Delete: "Delete",
-    Current: "Current",
-    Uptime: "Uptime",
-    "Cert Exp.": "Cert Exp.",
-    day: "day | days",
-    "-day": "-day",
-    hour: "hour",
-    "-hour": "-hour",
-    Response: "Response",
-    Ping: "Ping",
-    "Monitor Type": "Monitor Type",
-    Keyword: "Keyword",
-    "Friendly Name": "Friendly Name",
-    URL: "URL",
-    Hostname: "Hostname",
-    Port: "Port",
-    "Heartbeat Interval": "Heartbeat Interval",
-    Retries: "Retries",
-    "Heartbeat Retry Interval": "Heartbeat Retry Interval",
-    "Resend Notification if Down X times consequently": "Resend Notification if Down X times consequently",
-    Advanced: "Advanced",
-    "Upside Down Mode": "Upside Down Mode",
-    "Max. Redirects": "Max. Redirects",
-    "Accepted Status Codes": "Accepted Status Codes",
-    "Push URL": "Push URL",
-    needPushEvery: "You should call this URL every {0} seconds.",
-    pushOptionalParams: "Optional parameters: {0}",
-    Save: "Save",
-    Notifications: "Notifications",
-    "Not available, please setup.": "Not available, please setup.",
-    "Setup Notification": "Setup Notification",
-    Light: "Light",
-    Dark: "Dark",
-    Auto: "Auto",
-    "Theme - Heartbeat Bar": "Theme - Heartbeat Bar",
-    Normal: "Normal",
-    Bottom: "Bottom",
-    None: "None",
-    Timezone: "Timezone",
-    "Search Engine Visibility": "Search Engine Visibility",
-    "Allow indexing": "Allow indexing",
-    "Discourage search engines from indexing site": "Discourage search engines from indexing site",
-    "Change Password": "Change Password",
-    "Current Password": "Current Password",
-    "New Password": "New Password",
-    "Repeat New Password": "Repeat New Password",
-    "Update Password": "Update Password",
-    "Disable Auth": "Disable Auth",
-    "Enable Auth": "Enable Auth",
-    "disableauth.message1": "Are you sure want to <strong>disable authentication</strong>?",
-    "disableauth.message2": "It is designed for scenarios <strong>where you intend to implement third-party authentication</strong> in front of Uptime Kuma such as Cloudflare Access, Authelia or other authentication mechanisms.",
-    "Please use this option carefully!": "Please use this option carefully!",
-    Logout: "Logout",
-    Leave: "Leave",
-    "I understand, please disable": "I understand, please disable",
-    Confirm: "Confirm",
-    Yes: "Yes",
-    No: "No",
-    Username: "Username",
-    Password: "Password",
-    "Remember me": "Remember me",
-    Login: "Login",
-    "No Monitors, please": "No Monitors, please",
-    "add one": "add one",
-    "Notification Type": "Notification Type",
-    Email: "Email",
-    Test: "Test",
-    "Certificate Info": "Certificate Info",
-    "Resolver Server": "Resolver Server",
-    "Resource Record Type": "Resource Record Type",
-    "Last Result": "Last Result",
-    "Create your admin account": "Create your admin account",
-    "Repeat Password": "Repeat Password",
-    "Import Backup": "Import Backup",
-    "Export Backup": "Export Backup",
-    Export: "Export",
-    Import: "Import",
-    respTime: "Resp. Time (ms)",
-    notAvailableShort: "N/A",
-    "Default enabled": "Default enabled",
-    "Apply on all existing monitors": "Apply on all existing monitors",
-    Create: "Create",
-    "Clear Data": "Clear Data",
-    Events: "Events",
-    Heartbeats: "Heartbeats",
-    "Auto Get": "Auto Get",
-    backupDescription: "You can backup all monitors and notifications into a JSON file.",
-    backupDescription2: "Note: history and event data is not included.",
-    backupDescription3: "Sensitive data such as notification tokens are included in the export file; please store export securely.",
-    alertNoFile: "Please select a file to import.",
-    alertWrongFileType: "Please select a JSON file.",
-    "Clear all statistics": "Clear all Statistics",
-    "Skip existing": "Skip existing",
-    Overwrite: "Overwrite",
-    Options: "Options",
-    "Keep both": "Keep both",
-    "Verify Token": "Verify Token",
-    "Setup 2FA": "Setup 2FA",
-    "Enable 2FA": "Enable 2FA",
-    "Disable 2FA": "Disable 2FA",
-    "2FA Settings": "2FA Settings",
-    "Two Factor Authentication": "Two Factor Authentication",
-    Active: "Active",
-    Inactive: "Inactive",
-    Token: "Token",
-    "Show URI": "Show URI",
-    Tags: "Tags",
-    "Add New below or Select...": "Add New below or Select...",
-    "Tag with this name already exist.": "Tag with this name already exists.",
-    "Tag with this value already exist.": "Tag with this value already exists.",
-    color: "color",
-    "value (optional)": "value (optional)",
-    Gray: "Gray",
-    Red: "Red",
-    Orange: "Orange",
-    Green: "Green",
-    Blue: "Blue",
-    Indigo: "Indigo",
-    Purple: "Purple",
-    Pink: "Pink",
-    "Search...": "Search...",
-    "Avg. Ping": "Avg. Ping",
-    "Avg. Response": "Avg. Response",
-    "Entry Page": "Entry Page",
-    statusPageNothing: "Nothing here, please add a group or a monitor.",
-    "No Services": "No Services",
-    "All Systems Operational": "All Systems Operational",
-    "Partially Degraded Service": "Partially Degraded Service",
-    "Degraded Service": "Degraded Service",
-    "Add Group": "Add Group",
-    "Add a monitor": "Add a monitor",
-    "Edit Status Page": "Edit Status Page",
-    "Go to Dashboard": "Go to Dashboard",
-    "Status Page": "Status Page",
-    "Status Pages": "Status Pages",
-    defaultNotificationName: "My {notification} Alert ({number})",
-    here: "here",
-    Required: "Required",
-    telegram: "Telegram",
-    "Bot Token": "Bot Token",
-    wayToGetTelegramToken: "You can get a token from {0}.",
-    "Chat ID": "Chat ID",
-    supportTelegramChatID: "Support Direct Chat / Group / Channel's Chat ID",
-    wayToGetTelegramChatID: "You can get your chat ID by sending a message to the bot and going to this URL to view the chat_id:",
-    "YOUR BOT TOKEN HERE": "YOUR BOT TOKEN HERE",
-    chatIDNotFound: "Chat ID is not found; please send a message to this bot first",
-    webhook: "Webhook",
-    "Post URL": "Post URL",
-    "Content Type": "Content Type",
-    webhookJsonDesc: "{0} is good for any modern HTTP servers such as Express.js",
-    webhookFormDataDesc: "{multipart} is good for PHP. The JSON will need to be parsed with {decodeFunction}",
-    webhookAdditionalHeadersTitle: "Additional Headers",
-    webhookAdditionalHeadersDesc: "Sets additional headers sent with the webhook.",
-    smtp: "Email (SMTP)",
-    secureOptionNone: "None / STARTTLS (25, 587)",
-    secureOptionTLS: "TLS (465)",
-    "Ignore TLS Error": "Ignore TLS Error",
-    "From Email": "From Email",
-    emailCustomSubject: "Custom Subject",
-    "To Email": "To Email",
-    smtpCC: "CC",
-    smtpBCC: "BCC",
-    discord: "Discord",
-    "Discord Webhook URL": "Discord Webhook URL",
-    wayToGetDiscordURL: "You can get this by going to Server Settings -> Integrations -> Create Webhook",
-    "Bot Display Name": "Bot Display Name",
-    "Prefix Custom Message": "Prefix Custom Message",
-    "Hello @everyone is...": "Hello {'@'}everyone is...",
-    teams: "Microsoft Teams",
-    "Webhook URL": "Webhook URL",
-    wayToGetTeamsURL: "You can learn how to create a webhook URL {0}.",
-    signal: "Signal",
-    Number: "Number",
-    Recipients: "Recipients",
-    needSignalAPI: "You need to have a signal client with REST API.",
-    wayToCheckSignalURL: "You can check this URL to view how to set one up:",
-    signalImportant: "IMPORTANT: You cannot mix groups and numbers in recipients!",
-    gotify: "Gotify",
-    "Application Token": "Application Token",
-    "Server URL": "Server URL",
-    Priority: "Priority",
-    slack: "Slack",
-    "Icon Emoji": "Icon Emoji",
-    "Channel Name": "Channel Name",
-    "Uptime Kuma URL": "Uptime Kuma URL",
-    aboutWebhooks: "More info about Webhooks on: {0}",
-    aboutChannelName: "Enter the channel name on {0} Channel Name field if you want to bypass the Webhook channel. Ex: #other-channel",
-    aboutKumaURL: "If you leave the Uptime Kuma URL field blank, it will default to the Project GitHub page.",
-    emojiCheatSheet: "Emoji cheat sheet: {0}",
-    "rocket.chat": "Rocket.Chat",
-    pushover: "Pushover",
-    pushy: "Pushy",
-    PushByTechulus: "Push by Techulus",
-    octopush: "Octopush",
-    promosms: "PromoSMS",
-    clicksendsms: "ClickSend SMS",
-    lunasea: "LunaSea",
-    apprise: "Apprise (Support 50+ Notification services)",
-    GoogleChat: "Google Chat (Google Workspace only)",
-    pushbullet: "Pushbullet",
-    line: "Line Messenger",
-    mattermost: "Mattermost",
-    "User Key": "User Key",
-    Device: "Device",
-    "Message Title": "Message Title",
-    "Notification Sound": "Notification Sound",
-    "More info on:": "More info on: {0}",
-    pushoverDesc1: "Emergency priority (2) has default 30 second timeout between retries and will expire after 1 hour.",
-    pushoverDesc2: "If you want to send notifications to different devices, fill out Device field.",
-    "SMS Type": "SMS Type",
-    octopushTypePremium: "Premium (Fast - recommended for alerting)",
-    octopushTypeLowCost: "Low Cost (Slow - sometimes blocked by operator)",
-    checkPrice: "Check {0} prices:",
-    apiCredentials: "API credentials",
-    octopushLegacyHint: "Do you use the legacy version of Octopush (2011-2020) or the new version?",
-    "Check octopush prices": "Check octopush prices {0}.",
-    octopushPhoneNumber: "Phone number (intl format, eg : +33612345678) ",
-    octopushSMSSender: "SMS Sender Name : 3-11 alphanumeric characters and space (a-zA-Z0-9)",
-    "LunaSea Device ID": "LunaSea Device ID",
-    "Apprise URL": "Apprise URL",
-    "Example:": "Example: {0}",
-    "Read more:": "Read more: {0}",
-    "Status:": "Status: {0}",
-    "Read more": "Read more",
-    appriseInstalled: "Apprise is installed.",
-    appriseNotInstalled: "Apprise is not installed. {0}",
-    "Access Token": "Access Token",
-    "Channel access token": "Channel access token",
-    "Line Developers Console": "Line Developers Console",
-    lineDevConsoleTo: "Line Developers Console - {0}",
-    "Basic Settings": "Basic Settings",
-    "User ID": "User ID",
-    "Messaging API": "Messaging API",
-    wayToGetLineChannelToken: "First access the {0}, create a provider and channel (Messaging API), then you can get the channel access token and user ID from the above mentioned menu items.",
-    "Icon URL": "Icon URL",
-    aboutIconURL: "You can provide a link to a picture in \"Icon URL\" to override the default profile picture. Will not be used if Icon Emoji is set.",
-    aboutMattermostChannelName: "You can override the default channel that the Webhook posts to by entering the channel name into \"Channel Name\" field. This needs to be enabled in the Mattermost Webhook settings. Ex: #other-channel",
-    matrix: "Matrix",
-    promosmsTypeEco: "SMS ECO - cheap but slow and often overloaded. Limited only to Polish recipients.",
-    promosmsTypeFlash: "SMS FLASH - Message will automatically show on recipient device. Limited only to Polish recipients.",
-    promosmsTypeFull: "SMS FULL - Premium tier of SMS, You can use your Sender Name (You need to register name first). Reliable for alerts.",
-    promosmsTypeSpeed: "SMS SPEED - Highest priority in system. Very quick and reliable but costly (about twice of SMS FULL price).",
-    promosmsPhoneNumber: "Phone number (for Polish recipient You can skip area codes)",
-    promosmsSMSSender: "SMS Sender Name : Pre-registred name or one of defaults: InfoSMS, SMS Info, MaxSMS, INFO, SMS",
-    "Feishu WebHookUrl": "Feishu WebHookURL",
-    matrixHomeserverURL: "Homeserver URL (with http(s):// and optionally port)",
-    "Internal Room Id": "Internal Room ID",
-    matrixDesc1: "You can find the internal room ID by looking in the advanced section of the room settings in your Matrix client. It should look like !QMdRCpUIfLwsfjxye6:home.server.",
-    matrixDesc2: "It is highly recommended you create a new user and do not use your own Matrix user's access token as it will allow full access to your account and all the rooms you joined. Instead, create a new user and only invite it to the room that you want to receive the notification in. You can get the access token by running {0}",
-    Method: "Method",
-    Body: "Body",
-    Headers: "Headers",
-    PushUrl: "Push URL",
-    HeadersInvalidFormat: "The request headers are not valid JSON: ",
-    BodyInvalidFormat: "The request body is not valid JSON: ",
-    "Monitor History": "Monitor History",
-    clearDataOlderThan: "Keep monitor history data for {0} days.",
-    PasswordsDoNotMatch: "Passwords do not match.",
-    records: "records",
-    "One record": "One record",
-    steamApiKeyDescription: "For monitoring a Steam Game Server you need a Steam Web-API key. You can register your API key here: ",
-    "Current User": "Current User",
-    topic: "Topic",
-    topicExplanation: "MQTT topic to monitor",
-    successMessage: "Success Message",
-    successMessageExplanation: "MQTT message that will be considered as success",
-    recent: "Recent",
-    Done: "Done",
-    Info: "Info",
-    Security: "Security",
-    "Steam API Key": "Steam API Key",
-    "Shrink Database": "Shrink Database",
-    "Pick a RR-Type...": "Pick a RR-Type...",
-    "Pick Accepted Status Codes...": "Pick Accepted Status Codes...",
-    Default: "Default",
-    "HTTP Options": "HTTP Options",
-    "Create Incident": "Create Incident",
-    Title: "Title",
-    Content: "Content",
-    Style: "Style",
-    info: "info",
-    warning: "warning",
-    danger: "danger",
-    error: "error",
-    critical: "critical",
-    primary: "primary",
-    light: "light",
-    dark: "dark",
-    Post: "Post",
-    "Please input title and content": "Please input title and content",
-    Created: "Created",
-    "Last Updated": "Last Updated",
-    Unpin: "Unpin",
-    "Switch to Light Theme": "Switch to Light Theme",
-    "Switch to Dark Theme": "Switch to Dark Theme",
-    "Show Tags": "Show Tags",
-    "Hide Tags": "Hide Tags",
-    Description: "Description",
-    "No monitors available.": "No monitors available.",
-    "Add one": "Add one",
-    "No Monitors": "No Monitors",
-    "Untitled Group": "Untitled Group",
-    Services: "Services",
-    Discard: "Discard",
-    Cancel: "Cancel",
-    "Powered by": "Powered by",
-    shrinkDatabaseDescription: "Trigger database VACUUM for SQLite. If your database is created after 1.10.0, AUTO_VACUUM is already enabled and this action is not needed.",
-    serwersms: "SerwerSMS.pl",
-    serwersmsAPIUser: "API Username (incl. webapi_ prefix)",
-    serwersmsAPIPassword: "API Password",
-    serwersmsPhoneNumber: "Phone number",
-    serwersmsSenderName: "SMS Sender Name (registered via customer portal)",
-    smseagle: "SMSEagle",
-    smseagleTo: "Phone number(s)",
-    smseagleGroup: "Phonebook group name(s)",
-    smseagleContact: "Phonebook contact name(s)",
-    smseagleRecipientType: "Recipient type",
-    smseagleRecipient: "Recipient(s) (multiple must be separated with comma)",
-    smseagleToken: "API Access token",
-    smseagleUrl: "Your SMSEagle device URL",
-    smseagleEncoding: "Send as Unicode",
-    smseaglePriority: "Message priority (0-9, default = 0)",
-    stackfield: "Stackfield",
-    Customize: "Customize",
-    "Custom Footer": "Custom Footer",
-    "Custom CSS": "Custom CSS",
-    smtpDkimSettings: "DKIM Settings",
-    smtpDkimDesc: "Please refer to the Nodemailer DKIM {0} for usage.",
-    documentation: "documentation",
-    smtpDkimDomain: "Domain Name",
-    smtpDkimKeySelector: "Key Selector",
-    smtpDkimPrivateKey: "Private Key",
-    smtpDkimHashAlgo: "Hash Algorithm (Optional)",
-    smtpDkimheaderFieldNames: "Header Keys to sign (Optional)",
-    smtpDkimskipFields: "Header Keys not to sign (Optional)",
-    wayToGetPagerDutyKey: "You can get this by going to Service -> Service Directory -> (Select a service) -> Integrations -> Add integration. Here you can search for \"Events API V2\". More info {0}",
-    "Integration Key": "Integration Key",
-    "Integration URL": "Integration URL",
-    "Auto resolve or acknowledged": "Auto resolve or acknowledged",
-    "do nothing": "do nothing",
-    "auto acknowledged": "auto acknowledged",
-    "auto resolve": "auto resolve",
-    gorush: "Gorush",
-    alerta: "Alerta",
-    alertaApiEndpoint: "API Endpoint",
-    alertaEnvironment: "Environment",
-    alertaApiKey: "API Key",
-    alertaAlertState: "Alert State",
-    alertaRecoverState: "Recover State",
-    deleteStatusPageMsg: "Are you sure want to delete this status page?",
-    Proxies: "Proxies",
-    default: "Default",
-    enabled: "Enabled",
-    setAsDefault: "Set As Default",
-    deleteProxyMsg: "Are you sure want to delete this proxy for all monitors?",
-    proxyDescription: "Proxies must be assigned to a monitor to function.",
-    enableProxyDescription: "This proxy will not effect on monitor requests until it is activated. You can control temporarily disable the proxy from all monitors by activation status.",
-    setAsDefaultProxyDescription: "This proxy will be enabled by default for new monitors. You can still disable the proxy separately for each monitor.",
-    "Certificate Chain": "Certificate Chain",
-    Valid: "Valid",
-    Invalid: "Invalid",
-    AccessKeyId: "AccessKey ID",
-    SecretAccessKey: "AccessKey Secret",
-    PhoneNumbers: "PhoneNumbers",
-    TemplateCode: "TemplateCode",
-    SignName: "SignName",
-    "Sms template must contain parameters: ": "Sms template must contain parameters: ",
-    "Bark Endpoint": "Bark Endpoint",
-    "Bark Group": "Bark Group",
-    "Bark Sound": "Bark Sound",
-    WebHookUrl: "WebHookUrl",
-    SecretKey: "SecretKey",
-    "For safety, must use secret key": "For safety, must use secret key",
-    "Device Token": "Device Token",
-    Platform: "Platform",
-    iOS: "iOS",
-    Android: "Android",
-    Huawei: "Huawei",
-    High: "High",
-    Retry: "Retry",
-    Topic: "Topic",
-    "WeCom Bot Key": "WeCom Bot Key",
-    "Setup Proxy": "Setup Proxy",
-    "Proxy Protocol": "Proxy Protocol",
-    "Proxy Server": "Proxy Server",
-    "Proxy server has authentication": "Proxy server has authentication",
-    User: "User",
-    Installed: "Installed",
-    "Not installed": "Not installed",
-    Running: "Running",
-    "Not running": "Not running",
-    "Remove Token": "Remove Token",
-    Start: "Start",
-    Stop: "Stop",
-    "Uptime Kuma": "Uptime Kuma",
-    "Add New Status Page": "Add New Status Page",
-    Slug: "Slug",
-    "Accept characters:": "Accept characters:",
-    startOrEndWithOnly: "Start or end with {0} only",
-    "No consecutive dashes": "No consecutive dashes",
-    Next: "Next",
-    "The slug is already taken. Please choose another slug.": "The slug is already taken. Please choose another slug.",
-    "No Proxy": "No Proxy",
-    Authentication: "Authentication",
-    "HTTP Basic Auth": "HTTP Basic Auth",
-    "New Status Page": "New Status Page",
-    "Page Not Found": "Page Not Found",
-    "Reverse Proxy": "Reverse Proxy",
-    Backup: "Backup",
-    About: "About",
-    wayToGetCloudflaredURL: "(Download cloudflared from {0})",
-    cloudflareWebsite: "Cloudflare Website",
-    "Message:": "Message:",
-    "Don't know how to get the token? Please read the guide:": "Don't know how to get the token? Please read the guide:",
-    "The current connection may be lost if you are currently connecting via Cloudflare Tunnel. Are you sure want to stop it? Type your current password to confirm it.": "The current connection may be lost if you are currently connecting via Cloudflare Tunnel. Are you sure want to stop it? Type your current password to confirm it.",
-    "HTTP Headers": "HTTP Headers",
-    "Trust Proxy": "Trust Proxy",
-    "Other Software": "Other Software",
-    "For example: nginx, Apache and Traefik.": "For example: nginx, Apache and Traefik.",
-    "Please read": "Please read",
-    "Subject:": "Subject:",
-    "Valid To:": "Valid To:",
-    "Days Remaining:": "Days Remaining:",
-    "Issuer:": "Issuer:",
-    "Fingerprint:": "Fingerprint:",
-    "No status pages": "No status pages",
-    "Domain Name Expiry Notification": "Domain Name Expiry Notification",
-    Proxy: "Proxy",
-    "Date Created": "Date Created",
-    HomeAssistant: "Home Assistant",
-    onebotHttpAddress: "OneBot HTTP Address",
-    onebotMessageType: "OneBot Message Type",
-    onebotGroupMessage: "Group",
-    onebotPrivateMessage: "Private",
-    onebotUserOrGroupId: "Group/User ID",
-    onebotSafetyTips: "For safety, must set access token",
-    "PushDeer Key": "PushDeer Key",
-    "Footer Text": "Footer Text",
-    "Show Powered By": "Show Powered By",
-    "Domain Names": "Domain Names",
-    signedInDisp: "Signed in as {0}",
-    signedInDispDisabled: "Auth Disabled.",
-    RadiusSecret: "Radius Secret",
-    RadiusSecretDescription: "Shared Secret between client and server",
-    RadiusCalledStationId: "Called Station Id",
-    RadiusCalledStationIdDescription: "Identifier of the called device",
-    RadiusCallingStationId: "Calling Station Id",
-    RadiusCallingStationIdDescription: "Identifier of the calling device",
-    "Certificate Expiry Notification": "Certificate Expiry Notification",
-    "API Username": "API Username",
-    "API Key": "API Key",
-    "Recipient Number": "Recipient Number",
-    "From Name/Number": "From Name/Number",
-    "Leave blank to use a shared sender number.": "Leave blank to use a shared sender number.",
-    "Octopush API Version": "Octopush API Version",
-    "Legacy Octopush-DM": "Legacy Octopush-DM",
-    endpoint: "endpoint",
-    octopushAPIKey: "\"API key\" from HTTP API credentials in control panel",
-    octopushLogin: "\"Login\" from HTTP API credentials in control panel",
-    promosmsLogin: "API Login Name",
-    promosmsPassword: "API Password",
-    "pushoversounds pushover": "Pushover (default)",
-    "pushoversounds bike": "Bike",
-    "pushoversounds bugle": "Bugle",
-    "pushoversounds cashregister": "Cash Register",
-    "pushoversounds classical": "Classical",
-    "pushoversounds cosmic": "Cosmic",
-    "pushoversounds falling": "Falling",
-    "pushoversounds gamelan": "Gamelan",
-    "pushoversounds incoming": "Incoming",
-    "pushoversounds intermission": "Intermission",
-    "pushoversounds magic": "Magic",
-    "pushoversounds mechanical": "Mechanical",
-    "pushoversounds pianobar": "Piano Bar",
-    "pushoversounds siren": "Siren",
-    "pushoversounds spacealarm": "Space Alarm",
-    "pushoversounds tugboat": "Tug Boat",
-    "pushoversounds alien": "Alien Alarm (long)",
-    "pushoversounds climb": "Climb (long)",
-    "pushoversounds persistent": "Persistent (long)",
-    "pushoversounds echo": "Pushover Echo (long)",
-    "pushoversounds updown": "Up Down (long)",
-    "pushoversounds vibrate": "Vibrate Only",
-    "pushoversounds none": "None (silent)",
-    pushyAPIKey: "Secret API Key",
-    pushyToken: "Device token",
-    "Show update if available": "Show update if available",
-    "Also check beta release": "Also check beta release",
-    "Using a Reverse Proxy?": "Using a Reverse Proxy?",
-    "Check how to config it for WebSocket": "Check how to config it for WebSocket",
-    "Steam Game Server": "Steam Game Server",
-    "Most likely causes:": "Most likely causes:",
-    "The resource is no longer available.": "The resource is no longer available.",
-    "There might be a typing error in the address.": "There might be a typing error in the address.",
-    "What you can try:": "What you can try:",
-    "Retype the address.": "Retype the address.",
-    "Go back to the previous page.": "Go back to the previous page.",
-    "Coming Soon": "Coming Soon",
-    wayToGetClickSendSMSToken: "You can get API Username and API Key from {0} .",
-    "Connection String": "Connection String",
-    Query: "Query",
-    settingsCertificateExpiry: "TLS Certificate Expiry",
-    certificationExpiryDescription: "HTTPS Monitors trigger notification when TLS certificate expires in:",
-    "Setup Docker Host": "Setup Docker Host",
-    "Connection Type": "Connection Type",
-    "Docker Daemon": "Docker Daemon",
-    deleteDockerHostMsg: "Are you sure want to delete this docker host for all monitors?",
-    socket: "Socket",
-    tcp: "TCP / HTTP",
-    "Docker Container": "Docker Container",
-    "Container Name / ID": "Container Name / ID",
-    "Docker Host": "Docker Host",
-    "Docker Hosts": "Docker Hosts",
-    "ntfy Topic": "ntfy Topic",
-    Domain: "Domain",
-    Workstation: "Workstation",
-    disableCloudflaredNoAuthMsg: "You are in No Auth mode, a password is not required.",
-    trustProxyDescription: "Trust 'X-Forwarded-*' headers. If you want to get the correct client IP and your Uptime Kuma is behind such as Nginx or Apache, you should enable this.",
-    wayToGetLineNotifyToken: "You can get an access token from {0}",
-    Examples: "Examples",
-    "Home Assistant URL": "Home Assistant URL",
-    "Long-Lived Access Token": "Long-Lived Access Token",
-    "Long-Lived Access Token can be created by clicking on your profile name (bottom left) and scrolling to the bottom then click Create Token. ": "Long-Lived Access Token can be created by clicking on your profile name (bottom left) and scrolling to the bottom then click Create Token. ",
-    "Notification Service": "Notification Service",
-    "default: notify all devices": "default: notify all devices",
-    "A list of Notification Services can be found in Home Assistant under \"Developer Tools > Services\" search for \"notification\" to find your device/phone name.": "A list of Notification Services can be found in Home Assistant under \"Developer Tools > Services\" search for \"notification\" to find your device/phone name.",
-    "Automations can optionally be triggered in Home Assistant:": "Automations can optionally be triggered in Home Assistant:",
-    "Trigger type:": "Trigger type:",
-    "Event type:": "Event type:",
-    "Event data:": "Event data:",
-    "Then choose an action, for example switch the scene to where an RGB light is red.": "Then choose an action, for example switch the scene to where an RGB light is red.",
-    "Frontend Version": "Frontend Version",
-    "Frontend Version do not match backend version!": "Frontend Version do not match backend version!",
-    "Base URL": "Base URL",
-    goAlertInfo: "GoAlert is a An open source application for on-call scheduling, automated escalations and notifications (like SMS or voice calls). Automatically engage the right person, the right way, and at the right time! {0}",
-    goAlertIntegrationKeyInfo: "Get generic API integration key for the service in this format \"aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee\" usually the value of token parameter of copied URL.",
-    goAlert: "GoAlert",
-    backupOutdatedWarning: "Deprecated: Since a lot of features added and this backup feature is a bit unmaintained, it cannot generate or restore a complete backup.",
-    backupRecommend: "Please backup the volume or the data folder (./data/) directly instead.",
-    Optional: "Optional",
-    squadcast: "Squadcast",
-    SendKey: "SendKey",
-    "SMSManager API Docs": "SMSManager API Docs ",
-    "Gateway Type": "Gateway Type",
-    SMSManager: "SMSManager",
-    "You can divide numbers with": "You can divide numbers with",
-    or: "or",
-    recurringInterval: "Interval",
-    Recurring: "Recurring",
-    strategyManual: "Active/Inactive Manually",
-    warningTimezone: "It is using the server's timezone",
-    weekdayShortMon: "Mon",
-    weekdayShortTue: "Tue",
-    weekdayShortWed: "Wed",
-    weekdayShortThu: "Thu",
-    weekdayShortFri: "Fri",
-    weekdayShortSat: "Sat",
-    weekdayShortSun: "Sun",
-    dayOfWeek: "Day of Week",
-    dayOfMonth: "Day of Month",
-    lastDay: "Last Day",
-    lastDay1: "Last Day of Month",
-    lastDay2: "2nd Last Day of Month",
-    lastDay3: "3rd Last Day of Month",
-    lastDay4: "4th Last Day of Month",
-    "No Maintenance": "No Maintenance",
-    pauseMaintenanceMsg: "Are you sure want to pause?",
-    "maintenanceStatus-under-maintenance": "Under Maintenance",
-    "maintenanceStatus-inactive": "Inactive",
-    "maintenanceStatus-scheduled": "Scheduled",
-    "maintenanceStatus-ended": "Ended",
-    "maintenanceStatus-unknown": "Unknown",
-    "Display Timezone": "Display Timezone",
-    "Server Timezone": "Server Timezone",
-    statusPageMaintenanceEndDate: "End",
-    IconUrl: "Icon URL",
-    "Enable DNS Cache": "Enable DNS Cache",
-    Enable: "Enable",
-    Disable: "Disable",
-    dnsCacheDescription: "It may be not working in some IPv6 environments, disable it if you encounter any issues.",
-    "Single Maintenance Window": "Single Maintenance Window",
-    "Maintenance Time Window of a Day": "Maintenance Time Window of a Day",
-    "Effective Date Range": "Effective Date Range",
-    "Schedule Maintenance": "Schedule Maintenance",
-    "Date and Time": "Date and Time",
-    "DateTime Range": "DateTime Range",
-    Strategy: "Strategy",
-    "Free Mobile User Identifier": "Free Mobile User Identifier",
-    "Free Mobile API Key": "Free Mobile API Key",
-    "Enable TLS": "Enable TLS",
-    "Proto Service Name": "Proto Service Name",
-    "Proto Method": "Proto Method",
-    "Proto Content": "Proto Content",
-    Economy: "Economy",
-    Lowcost: "Lowcost",
-    high: "high",
-    "General Monitor Type": "General Monitor Type",
-    "Passive Monitor Type": "Passive Monitor Type",
-    "Specific Monitor Type": "Specific Monitor Type",
-};
diff --git a/src/languages/es-ES.js b/src/languages/es-ES.js
deleted file mode 100644
index 51327740d..000000000
--- a/src/languages/es-ES.js
+++ /dev/null
@@ -1,209 +0,0 @@
-export default {
-    languageName: "Español",
-    checkEverySecond: "Comprobar cada {0} segundos.",
-    retriesDescription: "Número máximo de intentos antes de que el servicio se marque como CAÍDO y una notificación sea enviada.",
-    ignoreTLSError: "Ignorar error TLS/SSL para sitios web HTTPS",
-    upsideDownModeDescription: "Invertir el estado. Si el servicio es alcanzable, está CAÍDO.",
-    maxRedirectDescription: "Número máximo de direcciones a seguir. Establecer a 0 para deshabilitar.",
-    acceptedStatusCodesDescription: "Seleccionar los códigos de estado que se consideran como respuesta exitosa.",
-    passwordNotMatchMsg: "La contraseña repetida no coincide.",
-    notificationDescription: "Por favor asigna una notificación a el/los monitor(es) para hacerlos funcional(es).",
-    keywordDescription: "Palabra clave en HTML plano o respuesta JSON, es sensible a mayúsculas",
-    pauseDashboardHome: "Pausado",
-    deleteMonitorMsg: "¿Seguro que quieres eliminar este monitor?",
-    deleteNotificationMsg: "¿Seguro que quieres eliminar esta notificación para todos los monitores?",
-    resolverserverDescription: "Cloudflare es el servidor por defecto, puedes cambiar el servidor de resolución en cualquier momento.",
-    rrtypeDescription: "Selecciona el tipo de registro que quieres monitorizar",
-    pauseMonitorMsg: "¿Seguro que quieres pausar?",
-    Settings: "Ajustes",
-    Dashboard: "Panel",
-    "New Update": "Nueva actualización",
-    Language: "Idioma",
-    Appearance: "Apariencia",
-    Theme: "Tema",
-    General: "General",
-    Version: "Versión",
-    "Check Update On GitHub": "Comprobar actualizaciones en GitHub",
-    List: "Lista",
-    Add: "Añadir",
-    "Add New Monitor": "Añadir nuevo monitor",
-    "Quick Stats": "Estadísticas rápidas",
-    Up: "Funcional",
-    Down: "Caído",
-    Pending: "Pendiente",
-    Unknown: "Desconocido",
-    Pause: "Pausar",
-    Name: "Nombre",
-    Status: "Estado",
-    DateTime: "Fecha y hora",
-    Message: "Mensaje",
-    "No important events": "No hay eventos importantes",
-    Resume: "Reanudar",
-    Edit: "Editar",
-    Delete: "Eliminar",
-    Current: "Actual",
-    Uptime: "Tiempo activo",
-    "Cert Exp.": "Caducidad cert.",
-    day: "día | días",
-    "-day": "-día",
-    hour: "hora",
-    "-hour": "-hora",
-    Response: "Respuesta",
-    Ping: "Ping",
-    "Monitor Type": "Tipo de monitor",
-    Keyword: "Palabra clave",
-    "Friendly Name": "Nombre sencillo",
-    URL: "URL",
-    Hostname: "Nombre del host",
-    Port: "Puerto",
-    "Heartbeat Interval": "Intervalo de latido",
-    Retries: "Reintentos",
-    Advanced: "Avanzado",
-    "Upside Down Mode": "Modo invertido",
-    "Max. Redirects": "Redirecciones máximas",
-    "Accepted Status Codes": "Códigos de estado aceptados",
-    Save: "Guardar",
-    Notifications: "Notificaciones",
-    "Not available, please setup.": "No disponible, por favor configúralo.",
-    "Setup Notification": "Configurar notificación",
-    Light: "Claro",
-    Dark: "Oscuro",
-    Auto: "Auto",
-    "Theme - Heartbeat Bar": "Tema - Barra de intervalo de latido",
-    Normal: "Normal",
-    Bottom: "Abajo",
-    None: "Ninguno",
-    Timezone: "Zona horaria",
-    "Search Engine Visibility": "Visibilidad motor de búsqueda",
-    "Allow indexing": "Permitir indexación",
-    "Discourage search engines from indexing site": "Disuadir a los motores de búsqueda de indexar el sitio",
-    "Change Password": "Cambiar contraseña",
-    "Current Password": "Contraseña actual",
-    "New Password": "Nueva contraseña",
-    "Repeat New Password": "Repetir nueva contraseña",
-    "Update Password": "Actualizar contraseña",
-    "Disable Auth": "Deshabilitar autenticación",
-    "Enable Auth": "Habilitar autenticación",
-    "disableauth.message1": "Seguro que deseas <strong>deshabilitar la autenticación</strong>?",
-    "disableauth.message2": "Es para <strong>quien implementa autenticación de terceros</strong> ante Uptime Kuma como por ejemplo Cloudflare Access.",
-    "Please use this option carefully!": "Por favor usar con cuidado.",
-    Logout: "Cerrar sesión",
-    Leave: "Salir",
-    "I understand, please disable": "Entiendo, por favor deshabilitar",
-    Confirm: "Confirmar",
-    Yes: "Sí",
-    No: "No",
-    Username: "Usuario",
-    Password: "Contraseña",
-    "Remember me": "Recordarme",
-    Login: "Acceso",
-    "No Monitors, please": "Sin monitores, por favor",
-    "add one": "añade uno",
-    "Notification Type": "Tipo de notificación",
-    Email: "Email",
-    Test: "Test",
-    "Certificate Info": "Información del certificado",
-    "Resolver Server": "Servidor de resolución",
-    "Resource Record Type": "Tipo de registro",
-    "Last Result": "Último resultado",
-    "Create your admin account": "Crea tu cuenta de administrador",
-    "Repeat Password": "Repetir contraseña",
-    respTime: "Tiempo de resp. (ms)",
-    notAvailableShort: "N/A",
-    Create: "Crear",
-    clearEventsMsg: "¿Estás seguro de que deseas eliminar todos los eventos de este monitor?",
-    clearHeartbeatsMsg: "¿Estás seguro de que deseas eliminar todos los latidos de este monitor?",
-    confirmClearStatisticsMsg: "¿Estás seguro de que deseas eliminar TODAS las estadísticas?",
-    "Clear Data": "Borrar datos",
-    Events: "Eventos",
-    Heartbeats: "Latidos",
-    "Auto Get": "Obtener automáticamente",
-    enableDefaultNotificationDescription: "Para cada nuevo monitor, esta notificación estará habilitada de forma predeterminada. Aún puedes deshabilitar la notificación por separado para cada monitor.",
-    "Default enabled": "Habilitado por defecto",
-    "Also apply to existing monitors": "También se aplica a monitores existentes",
-    Export: "Exportar",
-    Import: "Importar",
-    backupDescription: "Puedes hacer una copia de seguridad de todos los monitores y todas las notificaciones en un archivo JSON.",
-    backupDescription2: "PD: el historial y los datos de eventos no están incluidos.",
-    backupDescription3: "Los datos confidenciales, como los tokens de notificación, se incluyen en el archivo de exportación. Guárdalo con cuidado.",
-    alertNoFile: "Selecciona un archivo para importar.",
-    alertWrongFileType: "Selecciona un archivo JSON.",
-    twoFAVerifyLabel: "Ingresa tu token para verificar que 2FA está funcionando",
-    tokenValidSettingsMsg: "¡El token es válido! Ahora puedes guardar la configuración de 2FA.",
-    confirmEnableTwoFAMsg: "¿Estás seguro de que quieres habilitar 2FA?",
-    confirmDisableTwoFAMsg: "¿Estás seguro de que quieres desactivar 2FA?",
-    "Apply on all existing monitors": "Aplicar en todos los monitores existentes",
-    "Verify Token": "Verificar token",
-    "Setup 2FA": "Configurar 2FA",
-    "Enable 2FA": "Habilitar 2FA",
-    "Disable 2FA": "Desactivar 2FA",
-    "2FA Settings": "Ajustes 2FA",
-    "Two Factor Authentication": "Autenticación de dos factores",
-    Active: "Activo",
-    Inactive: "Inactivo",
-    Token: "Token",
-    "Show URI": "Mostrar URI",
-    "Clear all statistics": "Borrar todas las estadísticas",
-    retryCheckEverySecond: "Reintentar cada {0} segundo.",
-    importHandleDescription: "Elige 'Omitir existente' si deseas omitir todos los monitores o notificaciones con el mismo nombre. 'Sobrescribir' eliminará todos los monitores y notificaciones existentes.",
-    confirmImportMsg: "¿Estás seguro de importar la copia de seguridad? Asegúrate de haber seleccionado la opción de importación correcta.",
-    "Heartbeat Retry Interval": "Intervalo de reintento de latido",
-    "Import Backup": "Importar copia de seguridad",
-    "Export Backup": "Exportar copia de seguridad",
-    "Skip existing": "Omitir existente",
-    Overwrite: "Sobrescribir",
-    Options: "Opciones",
-    "Keep both": "Manténer ambos",
-    Tags: "Etiquetas",
-    "Add New below or Select...": "Agregar nuevo a continuación o seleccionar...",
-    "Tag with this name already exist.": "Una etiqueta con este nombre ya existe.",
-    "Tag with this value already exist.": "Una etiqueta con este valor ya existe.",
-    color: "color",
-    "value (optional)": "valor (opcional)",
-    Gray: "Gris",
-    Red: "Rojo",
-    Orange: "Naranja",
-    Green: "Verde",
-    Blue: "Azul",
-    Indigo: "Índigo",
-    Purple: "Morado",
-    Pink: "Rosa",
-    "Search...": "Buscar...",
-    "Avg. Ping": "Ping promedio",
-    "Avg. Response": "Respuesta promedio",
-    "Entry Page": "Página de entrada",
-    statusPageNothing: "No hay nada aquí, agrega un grupo o un monitor.",
-    "No Services": "Sin servicio",
-    "All Systems Operational": "Todos los sistemas están operativos",
-    "Partially Degraded Service": "Servicio parcialmente degradado",
-    "Degraded Service": "Servicio degradado",
-    "Add Group": "Agregar grupo",
-    "Add a monitor": "Agregar un monitor",
-    "Edit Status Page": "Editar página de estado",
-    "Go to Dashboard": "Ir al panel de control",
-    "Status Page": "Página de estado",
-    "Status Pages": "Páginas de estado",
-    telegram: "Telegram",
-    webhook: "Webhook",
-    smtp: "Email (SMTP)",
-    discord: "Discord",
-    teams: "Microsoft Teams",
-    signal: "Signal",
-    gotify: "Gotify",
-    slack: "Slack",
-    "rocket.chat": "Rocket.chat",
-    pushover: "Pushover",
-    pushy: "Pushy",
-    octopush: "Octopush",
-    promosms: "PromoSMS",
-    lunasea: "LunaSea",
-    apprise: "Apprise (Admite más de 50 servicios de notificación)",
-    pushbullet: "Pushbullet",
-    line: "Line Messenger",
-    mattermost: "Mattermost",
-    "Monitor History": "Historial de monitor",
-    clearDataOlderThan: "Mantener los datos del historial del monitor durante {0} días.",
-    records: "registros",
-    "One record": "Un registro",
-    steamApiKeyDescription: "Para monitorear un servidor de juegos de Steam, necesitas una clave Steam Web-API. Puedes registrar tu clave API aquí: ",
-};
diff --git a/src/languages/et-EE.js b/src/languages/et-EE.js
deleted file mode 100644
index f581a6994..000000000
--- a/src/languages/et-EE.js
+++ /dev/null
@@ -1,209 +0,0 @@
-export default {
-    languageName: "eesti",
-    retryCheckEverySecond: "Kontrolli {0} sekundilise vahega.",
-    retriesDescription: "Mitu korda tuleb kontrollida, mille järel märkida 'maas' ja saata välja teavitus.",
-    ignoreTLSError: "Eira TLS/SSL viga HTTPS veebisaitidel.",
-    upsideDownModeDescription: "Käitle teenuse saadavust rikkena, teenuse kättesaamatust töötavaks.",
-    maxRedirectDescription: "Suurim arv ümbersuunamisi, millele järgida. 0 ei luba ühtegi ",
-    acceptedStatusCodesDescription: "Vali välja HTTP koodid, mida arvestada kõlblikuks.",
-    passwordNotMatchMsg: "Salasõnad ei kattu.",
-    notificationDescription: "Teavitusteenuse kasutamiseks seo see seirega.",
-    keywordDescription: "Jälgi võtmesõna HTML või JSON vastustes. (tõstutundlik)",
-    pauseDashboardHome: "Seisatud",
-    deleteMonitorMsg: "Kas soovid eemaldada seire?",
-    deleteNotificationMsg: "Kas soovid eemaldada selle teavitusteenuse kõikidelt seiretelt?",
-    resolverserverDescription: "Cloudflare on vaikimisi pöördserver.",
-    rrtypeDescription: "Vali kirje tüüp, mida soovid jälgida.",
-    pauseMonitorMsg: "Kas soovid peatada seire?",
-    Settings: "Seaded",
-    "Status Page": "Ülevaade",
-    "Status Pages": "Ülevaated",
-    Dashboard: "Töölaud",
-    "New Update": "Uuem tarkvara versioon on saadaval.",
-    Language: "Keel",
-    Appearance: "Välimus",
-    Theme: "Teema",
-    General: "Üldine",
-    Version: "Versioon",
-    "Check Update On GitHub": "Otsi uuendusi GitHub'ist",
-    List: "Nimekiri",
-    Add: "Lisa",
-    "Add New Monitor": "Lisa seire",
-    "Add a monitor": "Lisa seire",
-    "Quick Stats": "Ülevaade",
-    Up: "Töökorras",
-    Down: "Rikkis",
-    Pending: "Määramisel",
-    Unknown: "Kahtlast",
-    Pause: "Seiska",
-    Name: "Nimi",
-    Status: "Olek",
-    DateTime: "Kuupäev",
-    Message: "Tulemus",
-    "No important events": "Märkimisväärsed juhtumid puuduvad.",
-    Resume: "Taasta",
-    Edit: "Muuda",
-    Delete: "Eemalda",
-    Current: "Hetkeseisund",
-    Uptime: "Eluiga",
-    "Cert Exp.": "Sert. aegumine",
-    day: "päev | päeva",
-    "-day": "-päev",
-    hour: "tund",
-    "-hour": "-tund",
-    Response: "Reaktsiooniaeg",
-    Ping: "Ping",
-    "Monitor Type": "Seire tüüp",
-    Keyword: "Võtmesõna",
-    "Friendly Name": "Sõbralik nimi",
-    URL: "URL",
-    Hostname: "Hostname",
-    Port: "Port",
-    "Heartbeat Interval": "Tukse sagedus",
-    Retries: "Korduskatsed",
-    Advanced: "Rohkem",
-    "Upside Down Mode": "Tagurpidi seire",
-    "Max. Redirects": "Max. ümbersuunamine",
-    "Accepted Status Codes": "Kõlblikud HTTP koodid",
-    Save: "Salvesta",
-    Notifications: "Teavitused",
-    "Not available, please setup.": "Ühtegi teavitusteenust pole saadaval.",
-    "Setup Notification": "Lisa teavitusteenus",
-    Light: "hele",
-    Dark: "tume",
-    Auto: "automaatne",
-    "Theme - Heartbeat Bar": "Teemasäte — tuksete riba",
-    Normal: "tavaline",
-    Bottom: "all",
-    None: "puudub",
-    Timezone: "Ajatsoon",
-    "Search Engine Visibility": "Otsimootorite ligipääs",
-    "Allow indexing": "Luba indekseerimine",
-    "Discourage search engines from indexing site": "Keela selle saidi indekseerimine otsimootorite poolt",
-    "Change Password": "Muuda parooli",
-    "Current Password": "praegune parool",
-    "New Password": "uus parool",
-    "Repeat New Password": "korda salasõna",
-    "Update Password": "Uuenda salasõna",
-    "Disable Auth": "Lülita autentimine välja",
-    "Enable Auth": "Lülita autentimine sisse",
-    "disableauth.message1": "Kas soovid <strong>lülitada autentimise välja</strong>?",
-    "disableauth.message2": "Kastuamiseks <strong>välise autentimispakkujaga</strong>, näiteks Cloudflare Access.",
-    "Please use this option carefully!": "Palun kasuta vastutustundlikult.",
-    Logout: "Logi välja",
-    Leave: "Lahku",
-    "I understand, please disable": "Olen tutvunud riskidega, lülita välja",
-    Confirm: "Kinnita",
-    Yes: "Jah",
-    No: "Ei",
-    Username: "kasutajanimi",
-    Password: "parool",
-    "Remember me": "Mäleta mind",
-    Login: "Logi sisse",
-    "No Monitors, please": "Seired puuduvad.",
-    "add one": "Lisa esimene",
-    "Notification Type": "Teavituse tüüp",
-    Email: "e-posti aadress",
-    Test: "Saada prooviteavitus",
-    "Certificate Info": "Sertifikaadi teave",
-    "Resolver Server": "Server, mis vastab DNS päringutele.",
-    "Resource Record Type": "DNS kirje tüüp",
-    "Last Result": "Viimane",
-    "Create your admin account": "Admininstraatori konto loomine",
-    "Repeat Password": "korda salasõna",
-    respTime: "Reageerimisaeg (ms)",
-    notAvailableShort: "N/A",
-    enableDefaultNotificationDescription: "Kõik järgnevalt lisatud seired kasutavad seda teavitusteenuset. Seiretelt võib teavitusteenuse ühekaupa eemaldada.",
-    clearEventsMsg: "Kas soovid seire kõik sündmused kustutada?",
-    clearHeartbeatsMsg: "Kas soovid seire kõik tuksed kustutada?",
-    confirmClearStatisticsMsg: "Kas soovid TERVE ajaloo kustutada?",
-    Export: "Eksport",
-    Import: "Import",
-    "Default enabled": "Kasuta vaikimisi",
-    "Apply on all existing monitors": "Kõik praegused seired hakkavad kasutama seda teavitusteenust",
-    Create: "Loo konto",
-    "Clear Data": "Eemalda andmed",
-    Events: "Sündmused",
-    Heartbeats: "Tuksed",
-    "Auto Get": "Hangi automaatselt",
-    backupDescription: "Varunda kõik seired ja teavitused JSON faili.",
-    backupDescription2: "PS: Varukoopia EI sisalda seirete ajalugu ja sündmustikku.",
-    backupDescription3: "Varukoopiad sisaldavad teavitusteenusete pääsuvõtmeid.",
-    alertNoFile: "Palun lisa fail, mida importida.",
-    alertWrongFileType: "Palun lisa JSON-formaadis fail.",
-    twoFAVerifyLabel: "2FA kinnitamiseks sisesta pääsukood",
-    tokenValidSettingsMsg: "Kood õige. Akna võib sulgeda.",
-    confirmEnableTwoFAMsg: "Kas soovid 2FA sisse lülitada?",
-    confirmDisableTwoFAMsg: "Kas soovid 2FA välja lülitada?",
-    "Verify Token": "Kontrolli",
-    "Setup 2FA": "Kaksikautentimise seadistamine",
-    "Enable 2FA": "Seadista 2FA",
-    "Disable 2FA": "Lülita 2FA välja",
-    "2FA Settings": "2FA seaded",
-    "Two Factor Authentication": "Kaksikautentimine",
-    Active: "kasutusel",
-    Inactive: "seadistamata",
-    Token: "kaksikautentimise kood",
-    "Show URI": "Näita URId",
-    "Clear all statistics": "Tühjenda ajalugu",
-    importHandleDescription: "'kombineeri' täiendab varukoopiast ja kirjutab üle samanimelised seireid ja teavitusteenused; 'lisa praegustele' jätab olemasolevad puutumata; 'asenda' kustutab ja asendab kõik seired ja teavitusteenused.",
-    confirmImportMsg: "Käkerdistest hoidumiseks lae enne taastamist alla uus varukoopia. Kas soovid taastada üles laetud?",
-    "Heartbeat Retry Interval": "Korduskatsete intervall",
-    "Import Backup": "Varukoopia importimine",
-    "Export Backup": "Varukoopia eksportimine",
-    "Skip existing": "lisa praegustele",
-    Overwrite: "asenda",
-    Options: "Mestimisviis",
-    "Keep both": "kombineeri",
-    Tags: "Sildid",
-    "Add New below or Select...": "Leia või lisa all uus…",
-    "Tag with this name already exist.": "Selle nimega silt on juba olemas.",
-    "Tag with this value already exist.": "Selle väärtusega silt on juba olemas.",
-    color: "värvus",
-    "value (optional)": "väärtus (fakultatiivne)",
-    Gray: "hall",
-    Red: "punane",
-    Orange: "oranž",
-    Green: "roheline",
-    Blue: "sinine",
-    Indigo: "indigo",
-    Purple: "lilla",
-    Pink: "roosa",
-    "Search...": "Otsi…",
-    "Avg. Ping": "Keskmine ping",
-    "Avg. Response": "Keskmine reaktsiooniaeg",
-    "Entry Page": "Avaleht",
-    statusPageNothing: "Kippu ega kõppu; siia saab lisada seireid või -gruppe.",
-    "No Services": "Teenused puuduvad.",
-    "All Systems Operational": "Kõik töökorras",
-    "Partially Degraded Service": "Teenuse töö osaliselt häiritud",
-    "Degraded Service": "Teenuse töö häiritud",
-    "Add Group": "Lisa grupp",
-    "Edit Status Page": "Muuda lehte",
-    "Go to Dashboard": "Töölauale",
-    checkEverySecond: "Kontrolli peale tõrget {0} sekundilise vahega.",
-    telegram: "Telegram",
-    webhook: "Webhook",
-    smtp: "elektronpost (SMTP)",
-    discord: "Discord",
-    teams: "Microsoft Teams",
-    signal: "Signal",
-    gotify: "Gotify",
-    slack: "Slack",
-    "rocket.chat": "Rocket.chat",
-    pushover: "Pushover",
-    pushy: "Pushy",
-    octopush: "Octopush",
-    promosms: "PromoSMS",
-    lunasea: "LunaSea",
-    apprise: "Apprise (vahendab üle 65 teavitusteenust)",
-    pushbullet: "Pushbullet",
-    line: "LINE",
-    mattermost: "Mattermost",
-    alerta: "Alerta",
-    alertaApiEndpoint: "API otsik",
-    alertaEnvironment: "Keskkond",
-    alertaApiKey: "API võti",
-    alertaAlertState: "Häireseisund",
-    alertaRecoverState: "Taasta algolek",
-};
diff --git a/src/languages/eu.js b/src/languages/eu.js
deleted file mode 100644
index c99f1eb70..000000000
--- a/src/languages/eu.js
+++ /dev/null
@@ -1,539 +0,0 @@
-export default {
-    languageName: "Euskara",
-    checkEverySecond: "Egiaztatu {0} segunduro",
-    retryCheckEverySecond: "Errepikatu {0} segunduro",
-    retriesDescription: "Zerbitzua erorita markatu eta jakinarazpena bidali aurretik egindako saiakera kopuru maximoa",
-    ignoreTLSError: "Ezikusiarena egin TLS/SSL erroreei HTTPS webguneetan",
-    upsideDownModeDescription: "Alderantzizkatu erortze egoera. Zerbitzua martxan badago, ERORITA markatuko du.",
-    maxRedirectDescription: "Jarraitu beharreko berbideratze kopuru maximoa. Jarri 0 berbideratzeak desgaitzeko.",
-    acceptedStatusCodesDescription: "Hautatu erantzun ona kontsideratzen diren egoera kodeak.",
-    passwordNotMatchMsg: "Errepikatutako pasahitza ez dator bat.",
-    notificationDescription: "Jakinarazpenak monitorizazio funtzio bati asignatu behar zaizkio.",
-    keywordDescription: "Bilatu gako-hitza HTML edo JSON erantzunean. Bilaketan maiuskulak kontuan hartzen dira.",
-    pauseDashboardHome: "Gelditu",
-    deleteMonitorMsg: "Ziur zaude monitorizazio hau ezabatu nahi duzula?",
-    deleteNotificationMsg: "Ziur zaude jakinarazpen hau monitorizazio guztientzat ezabatu nahi duzula?",
-    dnsPortDescription: "DNS zerbitzari portua. Defektuz 53. Nahi duzunean aldatu dezakezu portua.",
-    resolverserverDescription: "Cloudflare zerbitzari lehenetsia da. Edozein unetan alda dezakezu ebazteko zerbitzaria.",
-    rrtypeDescription: "Hautatu kontrolatu nahi duzun RR mota",
-    enableDefaultNotificationDescription: "Jakinarazpen hau monitore berrientzat gaituko da defektuz. Baina monitorizazio bakoitzarentzat jakinarazpena desgaitu dezakezu.",
-    pauseMonitorMsg: "Ziur zaude gelditu egin nahi duzula?",
-    clearEventsMsg: "Ziur zaude monitorizazio honen gertaera guztiak ezabatu nahi dituzula?",
-    clearHeartbeatsMsg: "Ziur zaude monitorizazio honen pultsu guztiak ezabatu nahi dituzula?",
-    confirmClearStatisticsMsg: "Ziur zaude estatistika GUZTIAK ezabatu nahi dituzula?",
-    importHandleDescription: "Aukeratu 'existitzen bada', izen bereko monitore edo jakinarazpen bakoitza saltatu nahi baduzu. Lehendik dauden kontrol eta jakinarazpen guztiak ezabatuko ditu 'Gainidatzi' aukerak.",
-    confirmImportMsg: "Ziur zaude segurtasun-kopia inportatu nahi duzula? Egiaztatu inportatzeko aukera zuzena hautatu duzula.",
-    twoFAVerifyLabel: "Sartu zure tokena 2FA egiaztatzeko:",
-    tokenValidSettingsMsg: "Tokenak balio du! Orain 2FA konfigurazioa gorde dezakezu.",
-    confirmEnableTwoFAMsg: "Ziur zaude 2FA gaitu nahi duzula?",
-    confirmDisableTwoFAMsg: "Ziur zaude 2FA desgaitu nahi duzula?",
-    Settings: "Ezarpenak",
-    Dashboard: "Arbela",
-    "New Update": "Eguneraketa berria",
-    Language: "Hizkuntza",
-    Appearance: "Itxura",
-    Theme: "Gaia",
-    General: "Orokorra",
-    "Primary Base URL": "Oinarrizkoa URL",
-    Version: "Bertsioa",
-    "Check Update On GitHub": "Egiaztatu eguneraketa GitHuben",
-    List: "Zerrenda",
-    Add: "Gehitu",
-    "Add New Monitor": "Gehitu monitorizazio berria",
-    "Quick Stats": "Estatistika azkarrak",
-    Up: "Erabilgarri",
-    Down: "Erorita",
-    Pending: "Zain",
-    Unknown: "Ezezaguna",
-    Pause: "Gelditu",
-    Name: "Izena",
-    Status: "Egoera",
-    DateTime: "Data eta ordua",
-    Message: "Mezua",
-    "No important events": "Gertaera garrantzitsurik ez",
-    Resume: "Jarraitu",
-    Edit: "Editatu",
-    Delete: "Ezabatu",
-    Current: "Unekoa",
-    Uptime: "Martxan",
-    "Cert Exp.": "Ziurtagiri iraun.",
-    day: "egun | egun",
-    "-day": "-egun",
-    hour: "ordua",
-    "-hour": "-ordu",
-    Response: "Erantzuna",
-    Ping: "Ping",
-    "Monitor Type": "Monitorizazio mota",
-    Keyword: "Gakohitza",
-    "Friendly Name": "Izen xumea",
-    URL: "URLa",
-    Hostname: "Ostalari izena",
-    Port: "Portua",
-    "Heartbeat Interval": "Pultsu interbaloak",
-    Retries: "Errepikapenak",
-    "Heartbeat Retry Interval": "Pultsu errepikatze interbaloak",
-    Advanced: "Aurreratua",
-    "Upside Down Mode": "Alderantzizkako modua",
-    "Max. Redirects": "Berbideratze max.",
-    "Accepted Status Codes": "Onartutako egoera kodeak",
-    "Push URL": "Push URLa",
-    needPushEvery: "URL hau {0} segunduro deitu beharko zenuke.",
-    pushOptionalParams: "Hautazko parametroak: {0}",
-    Save: "Gorde",
-    Notifications: "Jakinarazpenak",
-    "Not available, please setup.": "Ez dago eskuragarri, ezarri mesedez.",
-    "Setup Notification": "Ezarri jakinarazpenak",
-    Light: "Argia",
-    Dark: "Iluna",
-    Auto: "Auto",
-    "Theme - Heartbeat Bar": "Gaia - Pultsu barra",
-    Normal: "Normala",
-    Bottom: "Behean",
-    None: "Bat ere ez",
-    Timezone: "Timezone",
-    "Search Engine Visibility": "Bilatzaile ikurgarritasuna",
-    "Allow indexing": "Onartu indexatzea",
-    "Discourage search engines from indexing site": "Discourage search engines from indexing site",
-    "Change Password": "Aldatu pasahitza",
-    "Current Password": "Uneko pasahitza",
-    "New Password": "Pasahitz berria",
-    "Repeat New Password": "Errepikatu pasahitz berria",
-    "Update Password": "Eguneratu pasahitza",
-    "Disable Auth": "Desgaitu Auth",
-    "Enable Auth": "Gaitu Auth",
-    "disableauth.message1": "Ziur zaude <strong>autentifikazioa desgaitu</strong> nahi duzula?",
-    "disableauth.message2": "Egoera jakin batzuetarako diseinatuta dago, Uptime Kumaren <strong>aurrean hirugarrengo autentifikazio batzuek jartzeko</strong> (Cloudflare Access, Authelia edo beste autentifikazio-mekanismo batzuk).",
-    "Please use this option carefully!": "Mesedez, kontuz erabili aukera hau!",
-    Logout: "Saioa amaitu",
-    Leave: "Utzi",
-    "I understand, please disable": "Ulertzen dut, mesedez desgaitu",
-    Confirm: "Baieztatu",
-    Yes: "Bai",
-    No: "Ez",
-    Username: "Erabiltzailea",
-    Password: "Pasahitza",
-    "Remember me": "Gogora nazazu",
-    Login: "Saioa hasi",
-    "No Monitors, please": "Monitorizaziorik ez, mesedez",
-    "add one": "gehitu bat",
-    "Notification Type": "Jakinarazpen mota",
-    Email: "Emaila",
-    Test: "Testa",
-    "Certificate Info": "Ziurtagiri informazioa",
-    "Resolver Server": "Ebazpen-zerbitzaria",
-    "Resource Record Type": "Baliabideen erregistro mota",
-    "Last Result": "Azken emaitza",
-    "Create your admin account": "Sortu zure admin kontua",
-    "Repeat Password": "Errepikatu pasahitza",
-    "Import Backup": "segurtasun-kopia inportatu",
-    "Export Backup": "segurtasun-kopia esportatu",
-    Export: "Esportatu",
-    Import: "Inportatu",
-    respTime: "Erantz. denbora (ms)",
-    notAvailableShort: "N/A",
-    "Default enabled": "Lehenetsia gaituta",
-    "Apply on all existing monitors": "Aplikatu existitzen diren monitorizazio guztietan",
-    Create: "Sortu",
-    "Clear Data": "Garbitu datuak",
-    Events: "Gertaerak",
-    Heartbeats: "Pultsuak",
-    "Auto Get": "Auto Get",
-    backupDescription: "Monitore eta jakinarazpen guztien segurtasun-kopiak egin ditzakezu JSON fitxategi batean.",
-    backupDescription2: "Oharra: ez dira historia eta gertaeren datuak sartzen.",
-    backupDescription3: "Datu sentikorrak, hala nola jakinarazpen tokenak, esportazio-fitxategian sartzen dira; mesedez, gorde esportazioa modu seguruan.",
-    alertNoFile: "Mesedez hautatu inportatzeko fitxategia.",
-    alertWrongFileType: "Mesedez hautatu JSON fitxategia.",
-    "Clear all statistics": "Garbitu estatistika guztiak",
-    "Skip existing": "Saltatu existitzen bada",
-    Overwrite: "Gainidatzi",
-    Options: "Aukerak",
-    "Keep both": "Biak mantendu",
-    "Verify Token": "Egiaztatu Tokena",
-    "Setup 2FA": "Ezarri 2FA",
-    "Enable 2FA": "Gaitu 2FA",
-    "Disable 2FA": "Desgaitu 2FA",
-    "2FA Settings": "2FA ezarpenak",
-    "Two Factor Authentication": "Bi aldetako autentifikazioa (2FA)",
-    Active: "Aktibo",
-    Inactive: "Inaktibo",
-    Token: "Tokena",
-    "Show URI": "Erakutsi URIa",
-    Tags: "Etiketak",
-    "Add New below or Select...": "Gehitu beste bat behean edo hautatu...",
-    "Tag with this name already exist.": "Izen hau duen etiketa dagoeneko badago.",
-    "Tag with this value already exist.": "Balio hau duen etiketa dagoeneko badago.",
-    color: "kolorea",
-    "value (optional)": "balioa (hautazkoa)",
-    Gray: "Grisa",
-    Red: "Gorria",
-    Orange: "Naranja",
-    Green: "Berdea",
-    Blue: "Urdina",
-    Indigo: "Indigo",
-    Purple: "Morea",
-    Pink: "Arrosa",
-    "Search...": "Bilatu...",
-    "Avg. Ping": "Batazbesteko Pinga",
-    "Avg. Response": "Batazbesteko erantzuna",
-    "Entry Page": "Sarrera orria",
-    statusPageNothing: "Ezer ere ez hemen, mesedez gehitu taldea edo monitorizazioa.",
-    "No Services": "Zerbitzurik ez",
-    "All Systems Operational": "Sistema guztiak martxan",
-    "Partially Degraded Service": "Zerbitzu partzialki degradatua",
-    "Degraded Service": "Zerbitzu degradatua",
-    "Add Group": "Gehitu taldea",
-    "Add a monitor": "Gehitu monitorizazioa",
-    "Edit Status Page": "Editatu egoera orria",
-    "Go to Dashboard": "Joan arbelera",
-    "Status Page": "Egoera orria",
-    "Status Pages": "Egoera orriak",
-    defaultNotificationName: "Nire {notification} Alerta ({number})",
-    here: "Hemen",
-    Required: "Beharrezkoa",
-    telegram: "Telegram",
-    "Bot Token": "Bot Tokena",
-    wayToGetTelegramToken: "You can get a token from {0}.",
-    "Chat ID": "Txat IDa",
-    supportTelegramChatID: "Support Direct Chat / Group / Channel's Chat ID",
-    wayToGetTelegramChatID: "You can get your chat ID by sending a message to the bot and going to this URL to view the chat_id:",
-    "YOUR BOT TOKEN HERE": "YOUR BOT TOKEN HERE",
-    chatIDNotFound: "Chat ID is not found; please send a message to this bot first",
-    webhook: "Webhook",
-    "Post URL": "Bidalketa URLa",
-    "Content Type": "Eduki mota",
-    webhookJsonDesc: "{0} is good for any modern HTTP servers such as Express.js",
-    webhookFormDataDesc: "{multipart} is good for PHP. The JSON will need to be parsed with {decodeFunction}",
-    smtp: "Emaila (SMTP)",
-    secureOptionNone: "Bat ere ez / STARTTLS (25, 587)",
-    secureOptionTLS: "TLS (465)",
-    "Ignore TLS Error": "Ignore TLS Error",
-    "From Email": "Email honetatik",
-    emailCustomSubject: "Pertsonalizatutako gaia",
-    "To Email": "Email honetara",
-    smtpCC: "CC",
-    smtpBCC: "BCC",
-    discord: "Discord",
-    "Discord Webhook URL": "Discord Webhook URL",
-    wayToGetDiscordURL: "You can get this by going to Server Settings -> Integrations -> Create Webhook",
-    "Bot Display Name": "Bot Display Name",
-    "Prefix Custom Message": "Prefix Custom Message",
-    "Hello @everyone is...": "Hello {'@'}everyone is...",
-    teams: "Microsoft Teams",
-    "Webhook URL": "Webhook URL",
-    wayToGetTeamsURL: "You can learn how to create a webhook URL {0}.",
-    signal: "Signal",
-    Number: "Zenbakia",
-    Recipients: "Recipients",
-    needSignalAPI: "You need to have a signal client with REST API.",
-    wayToCheckSignalURL: "You can check this URL to view how to set one up:",
-    signalImportant: "IMPORTANT: You cannot mix groups and numbers in recipients!",
-    gotify: "Gotify",
-    "Application Token": "Aplikazio tokena",
-    "Server URL": "Zerbitzari URLa",
-    Priority: "Lehentasuna",
-    slack: "Slack",
-    "Icon Emoji": "Emoji ikonoa",
-    "Channel Name": "Kanalaren izena",
-    "Uptime Kuma URL": "Uptime Kuma URL",
-    aboutWebhooks: "More info about Webhooks on: {0}",
-    aboutChannelName: "Enter the channel name on {0} Channel Name field if you want to bypass the Webhook channel. Ex: #other-channel",
-    aboutKumaURL: "If you leave the Uptime Kuma URL field blank, it will default to the Project GitHub page.",
-    emojiCheatSheet: "Emoji cheat sheet: {0}",
-    "rocket.chat": "Rocket.Chat",
-    pushover: "Pushover",
-    pushy: "Pushy",
-    PushByTechulus: "Push by Techulus",
-    octopush: "Octopush",
-    promosms: "PromoSMS",
-    clicksendsms: "ClickSend SMS",
-    lunasea: "LunaSea",
-    apprise: "Apprise (Support 50+ Notification services)",
-    GoogleChat: "Google Chat (Google Workspace only)",
-    pushbullet: "Pushbullet",
-    line: "Line Messenger",
-    mattermost: "Mattermost",
-    "User Key": "Erabiltzaile gakoa",
-    Device: "Gailua",
-    "Message Title": "Mezuaren izenburua",
-    "Notification Sound": "Jakinarazpen soinua",
-    "More info on:": "More info on: {0}",
-    pushoverDesc1: "Emergency priority (2) has default 30 second timeout between retries and will expire after 1 hour.",
-    pushoverDesc2: "If you want to send notifications to different devices, fill out Device field.",
-    "SMS Type": "SMS mota",
-    octopushTypePremium: "Premium (Fast - recommended for alerting)",
-    octopushTypeLowCost: "Low Cost (Slow - sometimes blocked by operator)",
-    checkPrice: "Check {0} prices:",
-    apiCredentials: "API credentials",
-    octopushLegacyHint: "Do you use the legacy version of Octopush (2011-2020) or the new version?",
-    "Check octopush prices": "Check octopush prices {0}.",
-    octopushPhoneNumber: "Phone number (intl format, eg : +33612345678) ",
-    octopushSMSSender: "SMS Sender Name : 3-11 alphanumeric characters and space (a-zA-Z0-9)",
-    "LunaSea Device ID": "LunaSea Device ID",
-    "Apprise URL": "Apprise URL",
-    "Example:": "Adibidez: {0}",
-    "Read more:": "Irakurri gehiago: {0}",
-    "Status:": "Egoera: {0}",
-    "Read more": "Irakurri gehiago",
-    appriseInstalled: "Apprise instalatuta.",
-    appriseNotInstalled: "Apprise ez dago instalatuta. {0}",
-    "Access Token": "Access Token",
-    "Channel access token": "Channel access token",
-    "Line Developers Console": "Line Developers Console",
-    lineDevConsoleTo: "Line Developers Console - {0}",
-    "Basic Settings": "Oinarrizko ezarpenak",
-    "User ID": "Erabiltzaile ID",
-    "Messaging API": "Messaging API",
-    wayToGetLineChannelToken: "First access the {0}, create a provider and channel (Messaging API), then you can get the channel access token and user ID from the above mentioned menu items.",
-    "Icon URL": "Ikono URL",
-    aboutIconURL: "You can provide a link to a picture in \"Icon URL\" to override the default profile picture. Will not be used if Icon Emoji is set.",
-    aboutMattermostChannelName: "You can override the default channel that the Webhook posts to by entering the channel name into \"Channel Name\" field. This needs to be enabled in the Mattermost Webhook settings. Ex: #other-channel",
-    matrix: "Matrix",
-    promosmsTypeEco: "SMS ECO - cheap but slow and often overloaded. Limited only to Polish recipients.",
-    promosmsTypeFlash: "SMS FLASH - Message will automatically show on recipient device. Limited only to Polish recipients.",
-    promosmsTypeFull: "SMS FULL - Premium tier of SMS, You can use your Sender Name (You need to register name first). Reliable for alerts.",
-    promosmsTypeSpeed: "SMS SPEED - Highest priority in system. Very quick and reliable but costly (about twice of SMS FULL price).",
-    promosmsPhoneNumber: "Phone number (for Polish recipient You can skip area codes)",
-    promosmsSMSSender: "SMS Sender Name : Pre-registred name or one of defaults: InfoSMS, SMS Info, MaxSMS, INFO, SMS",
-    "Feishu WebHookUrl": "Feishu WebHookURL",
-    matrixHomeserverURL: "Hasiera zerbitzari URL (with http(s):// and optionally port)",
-    "Internal Room Id": "Internal Room ID",
-    matrixDesc1: "You can find the internal room ID by looking in the advanced section of the room settings in your Matrix client. It should look like !QMdRCpUIfLwsfjxye6:home.server.",
-    matrixDesc2: "It is highly recommended you create a new user and do not use your own Matrix user's access token as it will allow full access to your account and all the rooms you joined. Instead, create a new user and only invite it to the room that you want to receive the notification in. You can get the access token by running {0}",
-    Method: "Metodoa",
-    Body: "Gorputza",
-    Headers: "Goiburuak",
-    PushUrl: "Push URL",
-    HeadersInvalidFormat: "The request headers are not valid JSON: ",
-    BodyInvalidFormat: "The request body is not valid JSON: ",
-    "Monitor History": "Monitorizazio Historia",
-    clearDataOlderThan: "Keep monitor history data for {0} days.",
-    PasswordsDoNotMatch: "Pasahitzak ez datoz bat.",
-    records: "records",
-    "One record": "One record",
-    steamApiKeyDescription: "For monitoring a Steam Game Server you need a Steam Web-API key. You can register your API key here: ",
-    "Current User": "Uneko erabiltzailea",
-    topic: "Topic",
-    topicExplanation: "MQTT topic to monitor",
-    successMessage: "Arrakasta mezua",
-    successMessageExplanation: "MQTT message that will be considered as success",
-    recent: "Duela gutxikoa",
-    Done: "Egina",
-    Info: "Info",
-    Security: "Segurtasuna",
-    "Steam API Key": "Steam API Giltza",
-    "Shrink Database": "Shrink Datubasea",
-    "Pick a RR-Type...": "Pick a RR-Type...",
-    "Pick Accepted Status Codes...": "Hautatu onartutako egoera kodeak...",
-    Default: "Lehenetsia",
-    "HTTP Options": "HTTP Aukerak",
-    "Create Incident": "Sortu inzidentzia",
-    Title: "Titulua",
-    Content: "Edukia",
-    Style: "Estiloa",
-    info: "info",
-    warning: "kontuz",
-    danger: "arriskua",
-    error: "errorea",
-    critical: "kritikoa",
-    primary: "oinarrizkoa",
-    light: "argia",
-    dark: "iluna",
-    Post: "Post",
-    "Please input title and content": "Mesedez sartu titulua eta edukia",
-    Created: "Sortuta",
-    "Last Updated": "Azken eguneratzea",
-    Unpin: "Unpin",
-    "Switch to Light Theme": "Aldatu gai argira",
-    "Switch to Dark Theme": "Aldatu gai ilunera",
-    "Show Tags": "Erakutsi etiketak",
-    "Hide Tags": "Ezkutatu etiketak",
-    Description: "Deskribapena",
-    "No monitors available.": "Monitorizaziorik eskuragarri ez.",
-    "Add one": "Gehitu bat",
-    "No Monitors": "Monitorizaziorik ez",
-    "Untitled Group": "Titulurik gabeko taldea",
-    Services: "Zerbitzuak",
-    Discard: "Baztertu",
-    Cancel: "Ezeztatu",
-    "Powered by": "Honekin egina:",
-    shrinkDatabaseDescription: "Trigger database VACUUM for SQLite. If your database is created after 1.10.0, AUTO_VACUUM is already enabled and this action is not needed.",
-    serwersms: "SerwerSMS.pl",
-    serwersmsAPIUser: "API erabiltzailea (webapi_ aurre-hizkia barne)",
-    serwersmsAPIPassword: "API pasahitza",
-    serwersmsPhoneNumber: "Telefono zenbakia",
-    serwersmsSenderName: "SMS bidaltzaile izena (registered via customer portal)",
-    stackfield: "Stackfield",
-    Customize: "Pertsonalizatu",
-    "Custom Footer": "Oin pertsonalizatua",
-    "Custom CSS": "CSS pertsonalizatua",
-    smtpDkimSettings: "DKIM ezarpenak",
-    smtpDkimDesc: "Please refer to the Nodemailer DKIM {0} for usage.",
-    documentation: "dokumentazioa",
-    smtpDkimDomain: "Domeinu izena",
-    smtpDkimKeySelector: "Gako hautatzailea",
-    smtpDkimPrivateKey: "Gako pribatua",
-    smtpDkimHashAlgo: "Hash algoritmoa (hautazkoa)",
-    smtpDkimheaderFieldNames: "Header Keys to sign (Optional)",
-    smtpDkimskipFields: "Header Keys not to sign (Optional)",
-    wayToGetPagerDutyKey: "You can get this by going to Service -> Service Directory -> (Select a service) -> Integrations -> Add integration. Here you can search for \"Events API V2\". More info {0}",
-    "Integration Key": "Integration Key",
-    "Integration URL": "Integrazio URLa",
-    "Auto resolve or acknowledged": "Auto resolve or acknowledged",
-    "do nothing": "ez egin ezer",
-    "auto acknowledged": "auto acknowledged",
-    "auto resolve": "auto resolve",
-    gorush: "Gorush",
-    alerta: "Alerta",
-    alertaApiEndpoint: "API Endpoint",
-    alertaEnvironment: "Ingurunea",
-    alertaApiKey: "API Key",
-    alertaAlertState: "Alerta egoera",
-    alertaRecoverState: "Berreskuratze egoera",
-    deleteStatusPageMsg: "Ziur zaude egoera orri hau ezabatu nahi duzula?",
-    Proxies: "Proxiak",
-    default: "Lehenetsia",
-    enabled: "Gaituta",
-    setAsDefault: "Ezarri lehenetsitzat",
-    deleteProxyMsg: "Are you sure want to delete this proxy for all monitors?",
-    proxyDescription: "Proxies must be assigned to a monitor to function.",
-    enableProxyDescription: "This proxy will not effect on monitor requests until it is activated. You can control temporarily disable the proxy from all monitors by activation status.",
-    setAsDefaultProxyDescription: "This proxy will be enabled by default for new monitors. You can still disable the proxy separately for each monitor.",
-    "Certificate Chain": "Certificate Chain",
-    Valid: "Baliozkoa",
-    Invalid: "Baliogabea",
-    AccessKeyId: "AccessKey ID",
-    SecretAccessKey: "AccessKey Secret",
-    PhoneNumbers: "TelefonoZenbakiak",
-    TemplateCode: "TemplateCode",
-    SignName: "SignName",
-    "Sms template must contain parameters: ": "Sms txantiloiak parametroak eduki behar ditu: ",
-    "Bark Endpoint": "Bark Endpoint",
-    WebHookUrl: "WebHookUrl",
-    SecretKey: "SecretKey",
-    "For safety, must use secret key": "For safety, must use secret key",
-    "Device Token": "Gailu tokena",
-    Platform: "Plataforma",
-    iOS: "iOS",
-    Android: "Android",
-    Huawei: "Huawei",
-    High: "Altua",
-    Retry: "Errepikatu",
-    Topic: "Gaia",
-    "WeCom Bot Key": "WeCom Bot Key",
-    "Setup Proxy": "Ezarri Proxya",
-    "Proxy Protocol": "Proxy protokoloa",
-    "Proxy Server": "Proxy zerbitzaria",
-    "Proxy server has authentication": "Proxy zerbitzariak autentifikazioa dauka",
-    User: "Erabiltzailea",
-    Installed: "Instalatuta",
-    "Not installed": "Instalatu gabe",
-    Running: "Martxan",
-    "Not running": "Ez martxan",
-    "Remove Token": "Ezabatu Tokena",
-    Start: "Hasi",
-    Stop: "Gelditu",
-    "Uptime Kuma": "Uptime Kuma",
-    "Add New Status Page": "Gehitu egoera orri berria",
-    Slug: "Sluga",
-    "Accept characters:": "Onartu karaktereak:",
-    startOrEndWithOnly: "Start or end with {0} only",
-    "No consecutive dashes": "No consecutive dashes",
-    Next: "Hurrengoa",
-    "The slug is already taken. Please choose another slug.": "Sluga dagoeneko hartuta dago. Mesedez beste bat hautatu.",
-    "No Proxy": "Proxyrik ez",
-    Authentication: "Authentication",
-    "HTTP Basic Auth": "HTTP oinarrizko Auth",
-    "New Status Page": "Egoera orri berria",
-    "Page Not Found": "Orria ez da aurkitu",
-    "Reverse Proxy": "Alderantzizkako Proxya",
-    Backup: "Backup",
-    About: "Honi buruz",
-    wayToGetCloudflaredURL: "(Download cloudflared from {0})",
-    cloudflareWebsite: "Cloudflare webgunea",
-    "Message:": "Mezua:",
-    "Don't know how to get the token? Please read the guide:": "Don't know how to get the token? Please read the guide:",
-    "The current connection may be lost if you are currently connecting via Cloudflare Tunnel. Are you sure want to stop it? Type your current password to confirm it.": "The current connection may be lost if you are currently connecting via Cloudflare Tunnel. Are you sure want to stop it? Type your current password to confirm it.",
-    "Other Software": "Beste softwarea",
-    "For example: nginx, Apache and Traefik.": "Adibidez: nginx, Apache and Traefik.",
-    "Please read": "Mesedez irakurri",
-    "Subject:": "Gaia:",
-    "Valid To:": "Balio-epea:",
-    "Days Remaining:": "Egun faltan:",
-    "Issuer:": "Issuer:",
-    "Fingerprint:": "Hatzmarka:",
-    "No status pages": "Egoera orririk ez",
-    "Domain Name Expiry Notification": "Domeinu izen iraungitze jakinarazpena",
-    Proxy: "Proxya",
-    "Date Created": "Data sortuta",
-    onebotHttpAddress: "OneBot HTTP helbidea",
-    onebotMessageType: "OneBot mezu mota",
-    onebotGroupMessage: "Taldea",
-    onebotPrivateMessage: "Pribatua",
-    onebotUserOrGroupId: "Talde/Erabiltzaile IDa",
-    onebotSafetyTips: "For safety, must set access token",
-    "PushDeer Key": "PushDeer Key",
-    "Footer Text": "Oineko testua",
-    "Show Powered By": "Erakutsi Honekin egina:",
-    "Domain Names": "Domeinu izenak",
-    signedInDisp: "Signed in as {0}",
-    signedInDispDisabled: "Auth desgaituta.",
-    "Certificate Expiry Notification": "Zertifikatu iraungitze jakinarazpena",
-    "API Username": "API Erabiltzailea",
-    "API Key": "API Gakoa",
-    "Recipient Number": "Recipient Number",
-    "From Name/Number": "From Name/Number",
-    "Leave blank to use a shared sender number.": "Leave blank to use a shared sender number.",
-    "Octopush API Version": "Octopush API Version",
-    "Legacy Octopush-DM": "Legacy Octopush-DM",
-    endpoint: "endpoint",
-    octopushAPIKey: "\"API key\" from HTTP API credentials in control panel",
-    octopushLogin: "\"Login\" from HTTP API credentials in control panel",
-    promosmsLogin: "API Saio haste izena",
-    promosmsPassword: "API Pasahitza",
-    "pushoversounds pushover": "Pushover (defektuz)",
-    "pushoversounds bike": "Bizikleta",
-    "pushoversounds bugle": "Bugle",
-    "pushoversounds cashregister": "Cash Register",
-    "pushoversounds classical": "Klasikoa",
-    "pushoversounds cosmic": "Kosmikoa",
-    "pushoversounds falling": "Erortzen",
-    "pushoversounds gamelan": "Gamelan",
-    "pushoversounds incoming": "Incoming",
-    "pushoversounds intermission": "Intermission",
-    "pushoversounds magic": "Magia",
-    "pushoversounds mechanical": "Mekanikoa",
-    "pushoversounds pianobar": "Piano Bar",
-    "pushoversounds siren": "Sirena",
-    "pushoversounds spacealarm": "Espazio Alarma",
-    "pushoversounds tugboat": "Tug Boat",
-    "pushoversounds alien": "Alien Alarm (long)",
-    "pushoversounds climb": "Climb (long)",
-    "pushoversounds persistent": "Persistent (long)",
-    "pushoversounds echo": "Pushover Echo (long)",
-    "pushoversounds updown": "Up Down (long)",
-    "pushoversounds vibrate": "Bibrazioa soilik",
-    "pushoversounds none": "Bat ere ez (isilik)",
-    pushyAPIKey: "Secret API giltza",
-    pushyToken: "Gailu tokena",
-    "Show update if available": "Erakutsi eguneratzea eskuragarri badago",
-    "Also check beta release": "Beta bertsioak ere egiaztatu",
-    "Using a Reverse Proxy?": "Proxy alderantzizkako zerbitzaria erabiltzen?",
-    "Check how to config it for WebSocket": "Check how to config it for WebSocket",
-    "Steam Game Server": "Steam joko zerbitzaria",
-    "Most likely causes:": "Arrazoi probableenak:",
-    "The resource is no longer available.": "Baliabidea ez dago erabilgarri.",
-    "There might be a typing error in the address.": "Idazketa-akats bat egon daiteke helbidean.",
-    "What you can try:": "Probatu dezakezuna:",
-    "Retype the address.": "Berridatzi helbidea.",
-    "Go back to the previous page.": "Itzuli aurreko orrialdera",
-    "Coming Soon": "Laster",
-    wayToGetClickSendSMSToken: "API erabiltzailea and API giltza hemendik lortu ditzakezu: {0} .",
-    "Connection String": "Konexio katea",
-    Query: "Kontsulta",
-    settingsCertificateExpiry: "TLS irungitze zertifikatua",
-    certificationExpiryDescription: "HTTPS Monitorizazio jakinarazpena martxan jarri TLS zertifikatua iraungitzeko hau falta denean:",
-    "ntfy Topic": "ntfy Topic",
-    Domain: "Domeinua",
-    Workstation: "Lan gunea",
-    disableCloudflaredNoAuthMsg: "Ez Auth moduan zaude, pasahitza ez da beharrezkoa.",
-};
diff --git a/src/languages/fa.js b/src/languages/fa.js
deleted file mode 100644
index 528451920..000000000
--- a/src/languages/fa.js
+++ /dev/null
@@ -1,208 +0,0 @@
-export default {
-    languageName: "Farsi",
-    checkEverySecond: "بررسی هر {0} ثانیه.",
-    retryCheckEverySecond: "تکرار مجدد هر {0} ثانیه.",
-    retriesDescription: "حداکثر تعداد تکرار پیش از علامت گذاری وب‌سایت بعنوان خارج از دسترس و ارسال اطلاع‌رسانی.",
-    ignoreTLSError: "بی‌خیال ارور TLS/SSL برای سایت‌های HTTPS",
-    upsideDownModeDescription: "نتیجه وضعیت را برعکس کن، مثلا اگر سرویس در دسترس بود فرض کن که سرویس پایین است!",
-    maxRedirectDescription: "حداکثر تعداد ریدایرکتی که سرویس پشتیبانی کند. برای اینکه ری‌دایرکت‌ها پشتیبانی نشوند، عدد 0 را وارد کنید.",
-    acceptedStatusCodesDescription: "لطفا HTTP Status Code هایی که میخواهید به عنوان پاسخ موفقیت آمیز در نظر گرفته شود را انتخاب کنید.",
-    passwordNotMatchMsg: "تکرار رمز عبور مطابقت ندارد!",
-    notificationDescription: "برای اینکه سرویس اطلاع‌رسانی کار کند، آنرا به یکی از مانیتور‌ها متصل کنید.",
-    keywordDescription: "در نتیجه درخواست (اهمیتی ندارد پاسخ JSON است یا HTML) بدنبال این کلمه بگرد (حساس به کوچک/بزرگ بودن حروف).",
-    pauseDashboardHome: "متوقف شده",
-    deleteMonitorMsg: "آیا از حذف این مانیتور مطمئن هستید؟",
-    deleteNotificationMsg: "آیا مطمئن هستید که میخواهید این سرویس اطلاع‌رسانی را برای تمامی مانیتورها حذف کنید؟",
-    resolverserverDescription: "سرویس CloudFlare به عنوان سرور پیش‌فرض استفاده می‌شود، شما میتوانید آنرا به هر سرور دیگری بعدا تغییر دهید.",
-    rrtypeDescription: "لطفا نوع Resource Record را انتخاب کنید.",
-    pauseMonitorMsg: "آیا مطمئن هستید که میخواهید این مانیتور را متوقف کنید ؟",
-    enableDefaultNotificationDescription: "برای هر مانیتور جدید، این سرویس اطلاع‌رسانی به صورت پیش‌فرض فعال خواهد شد. البته که شما میتوانید به صورت دستی آنرا برای هر مانیتور به صورت جداگانه غیر فعال کنید.",
-    clearEventsMsg: "آیا از اینکه تمامی تاریخچه رویداد‌های این مانیتور حذف شود مطمئن هستید؟",
-    clearHeartbeatsMsg: "آیا از اینکه تاریخچه تمامی Heartbeat های این مانیتور حذف شود مطمئن هستید؟ ",
-    confirmClearStatisticsMsg: "آیا از حذف تمامی آمار و ارقام مطمئن هستید؟",
-    importHandleDescription: " اگر که میخواهید بیخیال مانیتورها و یا سرویس‌های اطلاع‌رسانی که با نام مشابه از قبل موجود هستند شوید، گزینه 'بی‌خیال موارد ..' را انتخاب کنید. توجه کنید که گزینه 'بازنویسی' تمامی موارد موجود با نام مشابه را از بین خواهد برد.",
-    confirmImportMsg: "آیا از بازگردانی بک آپ مطمئن هستید؟ لطفا از اینکه نوع بازگردانی درستی را انتخاب کرده‌اید اطمینان حاصل کنید!",
-    twoFAVerifyLabel: "لطفا جهت اطمینان از عملکرد احراز هویت دو مرحله‌ای توکن خود را وارد کنید!",
-    tokenValidSettingsMsg: "توکن شما معتبر است، هم اکنون میتوانید احراز هویت دو مرحله‌ای را فعال کنید!",
-    confirmEnableTwoFAMsg: " آیا از فعال سازی احراز هویت دو مرحله‌ای مطمئن هستید؟",
-    confirmDisableTwoFAMsg: "آیا از غیرفعال سازی احراز هویت دومرحله‌ای مطمئن هستید؟",
-    Settings: "تنظیمات",
-    Dashboard: "پیشخوان",
-    "New Update": "بروزرسانی جدید!",
-    Language: "زبان",
-    Appearance: "ظاهر",
-    Theme: "پوسته",
-    General: "عمومی",
-    Version: "نسخه",
-    "Check Update On GitHub": "بررسی بروزرسانی بر روی گیت‌هاب",
-    List: "لیست",
-    Add: "اضافه",
-    "Add New Monitor": "اضافه کردن مانیتور جدید",
-    "Quick Stats": "خلاصه وضعیت",
-    Up: "فعال",
-    Down: "غیرفعال",
-    Pending: "در انتظار تایید",
-    Unknown: "نامشخص",
-    Pause: "توقف",
-    Name: "نام",
-    Status: "وضعیت",
-    DateTime: "تاریخ و زمان",
-    Message: "پیام",
-    "No important events": "رخداد جدیدی موجود نیست.",
-    Resume: "ادامه",
-    Edit: "ویرایش",
-    Delete: "حذف",
-    Current: "فعلی",
-    Uptime: "آپتایم",
-    "Cert Exp.": "تاریخ انقضای SSL",
-    day: "روز",
-    "-day": "-روز",
-    hour: "ساعت",
-    "-hour": "-ساعت",
-    Response: "پاسخ",
-    Ping: "Ping",
-    "Monitor Type": "نوع مانیتور",
-    Keyword: "کلمه کلیدی",
-    "Friendly Name": "عنوان",
-    URL: "آدرس (URL)",
-    Hostname: "نام میزبان (Hostname)",
-    Port: "پورت",
-    "Heartbeat Interval": "فاصله هر Heartbeat",
-    Retries: "تلاش مجدد",
-    "Heartbeat Retry Interval": "فاصله تلاش مجدد برایHeartbeat",
-    Advanced: "پیشرفته",
-    "Upside Down Mode": "حالت بر عکس",
-    "Max. Redirects": "حداکثر تعداد ری‌دایرکت",
-    "Accepted Status Codes": "وضعیت‌های (Status Code) های قابل قبول",
-    Save: "ذخیره",
-    Notifications: "اطلاع‌رسانی‌ها",
-    "Not available, please setup.": "هیچ موردی موجود نیست، اولین مورد را راه اندازی کنید!",
-    "Setup Notification": "راه اندازی اطلاع‌رسانی‌",
-    Light: "روشن",
-    Dark: "تاریک",
-    Auto: "اتوماتیک",
-    "Theme - Heartbeat Bar": "ظاهر نوار Heartbeat",
-    Normal: "معمولی",
-    Bottom: "پایین",
-    None: "هیچ کدام",
-    Timezone: "موقعیت زمانی",
-    "Search Engine Visibility": "قابلیت دسترسی برای موتورهای جستجو",
-    "Allow indexing": "اجازه ایندکس شدن را بده.",
-    "Discourage search engines from indexing site": "به موتورهای جستجو اجازه ایندکس کردن این سامانه را نده.",
-    "Change Password": "تغییر رمزعبور",
-    "Current Password": "رمزعبور فعلی",
-    "New Password": "رمزعبور جدید",
-    "Repeat New Password": "تکرار رمزعبور جدید",
-    "Update Password": "بروز رسانی رمز عبور",
-    "Disable Auth": "غیر فعال سازی تایید هویت",
-    "Enable Auth": "فعال سازی تایید هویت",
-    "disableauth.message1": "آیا مطمئن هستید که میخواهید <strong>احراز هویت را غیر فعال کنید</strong>?",
-    "disableauth.message2": "این ویژگی برای کسانی است که <strong> لایه امنیتی شخص ثالث دیگر بر روی این آدرس فعال کرده‌اند</strong>، مانند Cloudflare Access.",
-    "Please use this option carefully!": "لطفا از این امکان با دقت استفاده کنید.",
-    Logout: "خروج",
-    Leave: "منصرف شدم",
-    "I understand, please disable": "متوجه هستم، لطفا غیرفعال کنید!",
-    Confirm: "تایید",
-    Yes: "بلی",
-    No: "خیر",
-    Username: "نام کاربری",
-    Password: "کلمه عبور",
-    "Remember me": "مراب هب خاطر بسپار",
-    Login: "ورود",
-    "No Monitors, please": "هیچ مانیتوری موجود نیست، لطفا",
-    "add one": "یک مورد اضافه کنید",
-    "Notification Type": "نوع اطلاع‌رسانی",
-    Email: "ایمیل",
-    Test: "تست",
-    "Certificate Info": "اطلاعات سرتیفیکت",
-    "Resolver Server": "سرور Resolver",
-    "Resource Record Type": "نوع رکورد (Resource Record Type)",
-    "Last Result": "آخرین نتیجه",
-    "Create your admin account": "ایجاد حساب کاربری مدیر",
-    "Repeat Password": "تکرار رمز عبور",
-    "Import Backup": "بازگردانی فایل پشتیبان",
-    "Export Backup": "ذخیره فایل پشتیبان",
-    Export: "استخراج اطلاعات",
-    Import: "ورود اطلاعات",
-    respTime: "زمان پاسخگویی (میلی‌ثانیه)",
-    notAvailableShort: "ناموجود",
-    "Default enabled": "به صورت پیش‌فرض فعال باشد.",
-    "Apply on all existing monitors": "بر روی تمامی مانیتور‌های فعلی اعمال شود.",
-    Create: "ایجاد",
-    "Clear Data": "پاکسازی داده‌ها",
-    Events: "رخداد‌ها",
-    Heartbeats: "Heartbeats",
-    "Auto Get": "Auto Get",
-    backupDescription: "شما میتوانید تمامی مانیتورها و تنظیمات اطلاع‌رسانی‌ها را در قالب یه فایل JSON دریافت کنید.",
-    backupDescription2: "البته تاریخچه رخدادها دراین فایل قرار نخواهند داشت.",
-    backupDescription3: "توجه داشته باشید که تمامی اطلاعات حساس شما مانند توکن‌ها نیز در این فایل وجود خواهد داشت ، پس از این فایل به خوبی مراقبت کنید.",
-    alertNoFile: "لطفا یک فایل برای «ورود اطلاعات» انتخاب کنید..",
-    alertWrongFileType: "یک فایل JSON انتخاب کنید.",
-    "Clear all statistics": "پاکسازی تمامی آمار و ارقام",
-    "Skip existing": "بی‌خیال مواردی که از قبل موجود است",
-    Overwrite: "بازنویسی",
-    Options: "تنظیمات",
-    "Keep both": "هر دو را نگه‌ دار",
-    "Verify Token": "تایید توکن",
-    "Setup 2FA": "تنظیمات احراز دو مرحله‌ای",
-    "Enable 2FA": "فعال سازی احراز 2 مرحله‌ای",
-    "Disable 2FA": "غیر فعال کردن احراز 2 مرحله‌ای",
-    "2FA Settings": "تنظیمات احراز 2 مرحله‌ای",
-    "Two Factor Authentication": "احراز هویت دومرحله‌ای",
-    Active: "فعال",
-    Inactive: "غیرفعال",
-    Token: "توکن",
-    "Show URI": "نمایش آدرس (URI) ",
-    Tags: "برچسب‌ها",
-    "Add New below or Select...": "یک مورد جدید اضافه کنید و یا از لیست انتخاب کنید...",
-    "Tag with this name already exist.": "یک برچسب با این «نام» از قبل وجود دارد",
-    "Tag with this value already exist.": "یک برچسب با این «مقدار» از قبل وجود دارد.",
-    color: "رنگ",
-    "value (optional)": "مقدار (اختیاری)",
-    Gray: "خاکستری",
-    Red: "قرمز",
-    Orange: "نارنجی",
-    Green: "سبز",
-    Blue: "آبی",
-    Indigo: "نیلی",
-    Purple: "بنفش",
-    Pink: "صورتی",
-    "Search...": "جستجو...",
-    "Avg. Ping": "متوسط پینگ",
-    "Avg. Response": "متوسط زمان پاسخ",
-    "Entry Page": "صفحه ورودی",
-    statusPageNothing: "چیزی اینجا نیست، لطفا یک گروه و یا یک مانیتور اضافه کنید!",
-    "No Services": "هیچ سرویسی موجود نیست",
-    "All Systems Operational": "تمامی سیستم‌ها عملیاتی هستند!",
-    "Partially Degraded Service": "افت نسبی کیفیت سرویس",
-    "Degraded Service": "افت کامل کیفیت سرویس",
-    "Add Group": "اضافه کردن گروه",
-    "Add a monitor": "اضافه کردن مانیتور",
-    "Edit Status Page": "ویرایش صفحه وضعیت",
-    "Status Page": "صفحه وضعیت",
-    "Status Pages": "صفحه وضعیت",
-    "Go to Dashboard": "رفتن به پیشخوان",
-    "Uptime Kuma": "آپتایم کوما",
-    records: "مورد",
-    "One record": "یک مورد",
-    Info: "اطلاعات",
-    "Powered by": "نیرو گرفته از",
-    telegram: "Telegram",
-    webhook: "Webhook",
-    smtp: "Email (SMTP)",
-    discord: "Discord",
-    teams: "Microsoft Teams",
-    signal: "Signal",
-    gotify: "Gotify",
-    slack: "Slack",
-    "rocket.chat": "Rocket.chat",
-    pushover: "Pushover",
-    pushy: "Pushy",
-    octopush: "Octopush",
-    promosms: "PromoSMS",
-    lunasea: "LunaSea",
-    apprise: "Apprise (Support 50+ Notification services)",
-    pushbullet: "Pushbullet",
-    line: "Line Messenger",
-    mattermost: "Mattermost",
-};
diff --git a/src/languages/fr-FR.js b/src/languages/fr-FR.js
deleted file mode 100644
index 5ad04bfee..000000000
--- a/src/languages/fr-FR.js
+++ /dev/null
@@ -1,672 +0,0 @@
-export default {
-    languageName: "Français",
-    checkEverySecond: "Vérifier toutes les {0} secondes",
-    retryCheckEverySecond: "Réessayer toutes les {0} secondes",
-    resendEveryXTimes: "Renvoyez toutes les {0} fois",
-    resendDisabled: "Renvoi désactivé",
-    retriesDescription: "Nombre d'essais avant que le service ne soit déclaré hors ligne et qu'une notification soit envoyée.",
-    ignoreTLSError: "Ignorer les erreurs liées au certificat SSL/TLS",
-    upsideDownModeDescription: "Si le service est en ligne, il sera alors noté hors ligne et vice-versa.",
-    maxRedirectDescription: "Nombre maximal de redirections avant que le service ne soit marqué comme hors ligne.",
-    enableGRPCTls: "Autoriser l'envoi d'une requête gRPC avec une connexion TLS",
-    grpcMethodDescription: "Le nom de la méthode est converti au format CamelCase tel que sayHello, check, etc.",
-    acceptedStatusCodesDescription: "Codes HTTP qui considèrent le service comme étant disponible.",
-    Maintenance: "Maintenance",
-    statusMaintenance: "Maintenance",
-    "Schedule maintenance": "Planifier la maintenance",
-    "Affected Monitors": "Sondes concernées",
-    "Pick Affected Monitors...": "Sélectionner les sondes concernées...",
-    "Start of maintenance": "Début de la maintenance",
-    "All Status Pages": "Toutes les pages d'état",
-    "Select status pages...": "Sélectionner les pages d'état...",
-    recurringIntervalMessage: "Exécuter une fois par jour | Exécuter une fois tous les {0} jours",
-    affectedMonitorsDescription: "Sélectionnez les sondes concernées par la maintenance en cours",
-    affectedStatusPages: "Afficher ce message de maintenance sur les pages d'état sélectionnées",
-    atLeastOneMonitor: "Sélectionnez au moins une sonde concernée",
-    passwordNotMatchMsg: "Les mots de passe ne correspondent pas",
-    notificationDescription: "Une fois ajoutée, vous devez l'activer manuellement dans les paramètres de vos hôtes.",
-    keywordDescription: "Le mot clé sera recherché dans la réponse HTML/JSON reçue du site internet.",
-    pauseDashboardHome: "En pause",
-    deleteMonitorMsg: "Êtes-vous sûr de vouloir supprimer cette sonde ?",
-    deleteMaintenanceMsg: "Voulez-vous vraiment supprimer cette maintenance ?",
-    deleteNotificationMsg: "Êtes-vous sûr de vouloir supprimer ce type de notifications ? Une fois désactivée, les services qui l'utilisent ne pourront plus envoyer de notifications.",
-    dnsPortDescription: "Port du serveur DNS. La valeur par défaut est 53. Vous pouvez modifier le port à tout moment.",
-    resolverserverDescription: "Le DNS de Cloudflare est utilisé par défaut, mais vous pouvez le changer si vous le souhaitez.",
-    rrtypeDescription: "Veuillez sélectionner un type d'enregistrement DNS",
-    pauseMonitorMsg: "Êtes-vous sûr de vouloir mettre en pause cette sonde ?",
-    enableDefaultNotificationDescription: "Pour chaque nouvelle sonde, cette notification sera activée par défaut. Vous pouvez toujours désactiver la notification séparément pour chaque sonde.",
-    clearEventsMsg: "Êtes-vous sûr de vouloir supprimer tous les événements pour cette sonde ?",
-    clearHeartbeatsMsg: "Êtes-vous sûr de vouloir supprimer toutes les vérifications pour cette sonde ?",
-    confirmClearStatisticsMsg: "Êtes-vous sûr de vouloir supprimer toutes les statistiques ?",
-    importHandleDescription: "Choisissez « Ignorer l'existant » si vous voulez ignorer chaque sonde ou notification portant le même nom. L'option « Écraser » supprime toutes les sondes et notifications existantes.",
-    confirmImportMsg: "Êtes-vous sûr de vouloir importer la sauvegarde ? Veuillez vous assurer que vous avez sélectionné la bonne option d'importation.",
-    twoFAVerifyLabel: "Veuillez saisir votre jeton pour vérifier que le système 2FA fonctionne.",
-    tokenValidSettingsMsg: "Le jeton est valide. Vous pouvez maintenant sauvegarder les paramètres de double authentification (2FA).",
-    confirmEnableTwoFAMsg: "Êtes-vous sûr de vouloir activer la double authentification (2FA) ?",
-    confirmDisableTwoFAMsg: "Êtes-vous sûr de vouloir désactiver la double authentification (2FA) ?",
-    Settings: "Paramètres",
-    Dashboard: "Tableau de bord",
-    "New Update": "Mise à jour disponible",
-    Language: "Langue",
-    Appearance: "Apparence",
-    Theme: "Thème",
-    General: "Général",
-    "Primary Base URL": "URL principale",
-    Version: "Version",
-    "Check Update On GitHub": "Consulter les mises à jour sur GitHub",
-    List: "Lister",
-    Add: "Ajouter",
-    "Add New Monitor": "Ajouter une nouvelle sonde",
-    "Quick Stats": "Résumé",
-    Up: "En ligne",
-    Down: "Hors ligne",
-    Pending: "En attente",
-    Unknown: "Inconnu",
-    Pause: "En pause",
-    Name: "Nom",
-    Status: "État",
-    DateTime: "Heure",
-    Message: "Messages",
-    "No important events": "Aucun évènement important",
-    Resume: "Reprendre",
-    Edit: "Modifier",
-    Delete: "Supprimer",
-    Current: "Actuellement",
-    Uptime: "Disponibilité",
-    "Cert Exp.": "Expiration SSL",
-    day: "jour | jours",
-    "-day": " jours",
-    hour: "heure",
-    "-hour": " heure",
-    Response: "Temps de réponse",
-    Ping: "Ping",
-    "Monitor Type": "Type de sonde",
-    Keyword: "Mot-clé",
-    "Friendly Name": "Nom d'affichage",
-    URL: "URL",
-    Hostname: "Nom d'hôte / adresse IP",
-    Port: "Port",
-    "Heartbeat Interval": "Intervalle de vérification",
-    Retries: "Essais",
-    "Heartbeat Retry Interval": "Réessayer l'intervalle de vérification",
-    "Resend Notification if Down X times consequently": "Renvoyer une notification si hors ligne X fois",
-    Advanced: "Avancé",
-    "Upside Down Mode": "Mode inversé",
-    "Max. Redirects": "Nombre maximum de redirections",
-    "Accepted Status Codes": "Codes HTTP acceptés",
-    "Push URL": "Push URL",
-    needPushEvery: "Vous devez appeler cette URL toutes les {0} secondes.",
-    pushOptionalParams: "Paramètres facultatifs : {0}",
-    Save: "Sauvegarder",
-    Notifications: "Notifications",
-    "Not available, please setup.": "Pas de système de notification disponible, merci de le configurer.",
-    "Setup Notification": "Créer une notification",
-    Light: "Clair",
-    Dark: "Sombre",
-    Auto: "Automatique",
-    "Theme - Heartbeat Bar": "Thème - barres d'état",
-    Normal: "Normal",
-    Bottom: "En dessous",
-    None: "Aucun",
-    Timezone: "Fuseau horaire",
-    "Search Engine Visibility": "Visibilité par les moteurs de recherche",
-    "Allow indexing": "Autoriser l'indexation",
-    "Discourage search engines from indexing site": "Refuser l'indexation",
-    "Change Password": "Changer le mot de passe",
-    "Current Password": "Mot de passe actuel",
-    "New Password": "Nouveau mot de passe",
-    "Repeat New Password": "Répéter votre nouveau mot de passe",
-    "Update Password": "Mettre à jour le mot de passe",
-    "Disable Auth": "Désactiver l'authentification",
-    "Enable Auth": "Activer l'authentification",
-    "disableauth.message1": "Voulez-vous vraiment <strong>désactiver l'authentification</strong> ?",
-    "disableauth.message2": "Cette fonctionnalité est conçue pour les scénarios <strong>où vous avez l'intention d'implémenter une authentification tierce</strong> devant Uptime Kuma, comme Cloudflare Access, Authelia ou d'autres mécanismes d'authentification.",
-    "Please use this option carefully!": "Veuillez utiliser cette option avec précaution !",
-    Logout: "Déconnexion",
-    Leave: "Quitter",
-    "I understand, please disable": "Je comprends, désactivez-la",
-    Confirm: "Confirmer",
-    Yes: "Oui",
-    No: "Non",
-    Username: "Nom d'utilisateur",
-    Password: "Mot de passe",
-    "Remember me": "Se souvenir de moi",
-    Login: "Connexion",
-    "No Monitors, please": "Pas de sondes, veuillez",
-    "add one": "en ajouter une",
-    "Notification Type": "Type de notification",
-    Email: "Courriel",
-    Test: "Tester",
-    "Certificate Info": "Informations sur le certificat SSL",
-    "Resolver Server": "Serveur DNS utilisé",
-    "Resource Record Type": "Type d'enregistrement DNS recherché",
-    "Last Result": "Dernier résultat",
-    "Create your admin account": "Créer votre compte administrateur",
-    "Repeat Password": "Répéter le mot de passe",
-    "Import Backup": "Importation de la sauvegarde",
-    "Export Backup": "Exportation de la sauvegarde",
-    Export: "Exporter",
-    Import: "Importer",
-    respTime: "Temps de réponse (ms)",
-    notAvailableShort: "N/A",
-    "Default enabled": "Activé par défaut",
-    "Apply on all existing monitors": "Appliquer sur toutes les sondes existantes",
-    Create: "Créer",
-    "Clear Data": "Effacer les données",
-    Events: "Événements",
-    Heartbeats: "Vérifications",
-    "Auto Get": "Récupérer automatiquement",
-    backupDescription: "Vous pouvez sauvegarder toutes les sondes et toutes les notifications dans un fichier JSON.",
-    backupDescription2: "PS : Les données relatives à l'historique et aux événements ne sont pas incluses.",
-    backupDescription3: "Les données sensibles telles que les jetons de notification sont incluses dans le fichier d'exportation, veuillez les conserver soigneusement.",
-    alertNoFile: "Veuillez sélectionner un fichier à importer.",
-    alertWrongFileType: "Veuillez sélectionner un fichier JSON à importer.",
-    "Clear all statistics": "Effacer toutes les statistiques",
-    "Skip existing": "Sauter l'existant",
-    Overwrite: "Écraser",
-    Options: "Options",
-    "Keep both": "Garder les deux",
-    "Verify Token": "Vérifier le jeton",
-    "Setup 2FA": "Configurer la double authentification (2FA)",
-    "Enable 2FA": "Activer la double authentification (2FA)",
-    "Disable 2FA": "Désactiver la double authentification (2FA)",
-    "2FA Settings": "Paramètres de la la double authentification (2FA)",
-    "Two Factor Authentication": "Double authentification",
-    Active: "Actif",
-    Inactive: "Inactif",
-    Token: "Jeton",
-    "Show URI": "Afficher l'URI",
-    Tags: "Étiquettes",
-    "Add New below or Select...": "Ajoutez-en un en dessous ou sélectionnez-le ici...",
-    "Tag with this name already exist.": "Une étiquette portant ce nom existe déjà.",
-    "Tag with this value already exist.": "Une étiquette avec cette valeur existe déjà.",
-    color: "Couleur",
-    "value (optional)": "Valeur (facultatif)",
-    Gray: "Gris",
-    Red: "Rouge",
-    Orange: "Orange",
-    Green: "Vert",
-    Blue: "Bleu",
-    Indigo: "Indigo",
-    Purple: "Violet",
-    Pink: "Rose",
-    "Search...": "Rechercher...",
-    "Avg. Ping": "Ping moyen",
-    "Avg. Response": "Réponse moyenne",
-    "Entry Page": "Page d'accueil",
-    statusPageNothing: "Rien ici, veuillez ajouter un groupe ou une sonde.",
-    "No Services": "Aucun service",
-    "All Systems Operational": "Tous les systèmes sont opérationnels",
-    "Partially Degraded Service": "Service partiellement dégradé",
-    "Degraded Service": "Service dégradé",
-    "Add Group": "Ajouter un groupe",
-    "Add a monitor": "Ajouter une sonde",
-    "Edit Status Page": "Modifier la page de statut",
-    "Go to Dashboard": "Accéder au tableau de bord",
-    "Status Page": "Page de statut",
-    "Status Pages": "Pages de statut",
-    defaultNotificationName: "Ma notification {notification} numéro ({number})",
-    here: "ici",
-    Required: "Requis",
-    telegram: "Telegram",
-    "Bot Token": "Jeton du robot",
-    wayToGetTelegramToken: "Vous pouvez obtenir un token depuis {0}.",
-    "Chat ID": "Chat ID",
-    supportTelegramChatID: "Prend en charge les messages privés / messages de groupe / l'ID d'un salon",
-    wayToGetTelegramChatID: "Vous pouvez obtenir le Chat ID en envoyant un message avec le robot puis en récupérant l'URL pour voir l'ID du salon :",
-    "YOUR BOT TOKEN HERE": "VOTRE JETON ROBOT ICI",
-    chatIDNotFound: "ID du salon introuvable, envoyez un message via le robot avant",
-    webhook: "Webhook",
-    "Post URL": "Post URL",
-    "Content Type": "Type de contenu",
-    webhookJsonDesc: "{0} est bien pour tous les serveurs HTTP modernes comme Express.js",
-    webhookFormDataDesc: "{multipart} est bien pour du PHP. Le JSON aura besoin d'être parsé avec {decodeFunction}",
-    webhookAdditionalHeadersTitle: "En-têtes supplémentaires",
-    webhookAdditionalHeadersDesc: "Définit des en-têtes supplémentaires envoyés avec le webhook.",
-    smtp: "Courriel (SMTP)",
-    secureOptionNone: "Aucun / STARTTLS (25, 587)",
-    secureOptionTLS: "TLS (465)",
-    "Ignore TLS Error": "Ignorer les erreurs TLS",
-    "From Email": "Depuis l'adresse",
-    emailCustomSubject: "Objet personnalisé",
-    "To Email": "Vers l'adresse",
-    smtpCC: "CC",
-    smtpBCC: "CCI",
-    discord: "Discord",
-    "Discord Webhook URL": "URL vers le webhook Discord",
-    wayToGetDiscordURL: "Vous pouvez l'obtenir en allant dans « Paramètres du serveur » -> « Intégrations » -> « Créer un Webhook »",
-    "Bot Display Name": "Nom du robot (affiché)",
-    "Prefix Custom Message": "Préfixe du message personnalisé",
-    "Hello @everyone is...": "Bonjour {'@'}everyone il...",
-    teams: "Microsoft Teams",
-    "Webhook URL": "URL vers le webhook",
-    wayToGetTeamsURL: "Vous pouvez apprendre comment créer un Webhook {0}.",
-    signal: "Signal",
-    Number: "Numéro",
-    Recipients: "Destinataires",
-    needSignalAPI: "Vous avez besoin d'un client Signal avec l'API REST.",
-    wayToCheckSignalURL: "Vous pouvez regarder l'URL suivante pour savoir comment la mettre en place :",
-    signalImportant: "IMPORTANT : Vous ne pouvez pas mixer les groupes et les numéros en destinataires !",
-    gotify: "Gotify",
-    "Application Token": "Jeton d'application",
-    "Server URL": "URL du serveur",
-    Priority: "Priorité",
-    slack: "Slack",
-    "Icon Emoji": "Icon Emoji",
-    "Channel Name": "Nom du salon",
-    "Uptime Kuma URL": "URL vers Uptime Kuma",
-    aboutWebhooks: "Plus d'informations sur les webhooks ici : {0}",
-    aboutChannelName: "Mettez le nom du salon dans {0} dans « Nom du salon » si vous voulez contourner le salon webhook. Ex. : #autre-salon",
-    aboutKumaURL: "Si vous laissez l'URL d'Uptime Kuma vierge, elle redirigera vers la page du projet GitHub.",
-    emojiCheatSheet: "Aide sur les émojis : {0}",
-    "rocket.chat": "Rocket.chat",
-    pushover: "Pushover",
-    pushy: "Pushy",
-    PushByTechulus: "Push by Techulus",
-    octopush: "Octopush",
-    promosms: "PromoSMS",
-    clicksendsms: "ClickSend SMS",
-    lunasea: "LunaSea",
-    apprise: "Apprise (prend en charge plus de 50 services de notification)",
-    GoogleChat: "Google Chat (Google Workspace uniquement)",
-    pushbullet: "Pushbullet",
-    line: "Line Messenger",
-    mattermost: "Mattermost",
-    "User Key": "Clé d'utilisateur",
-    Device: "Appareil",
-    "Message Title": "Titre du message",
-    "Notification Sound": "Son de notification",
-    "More info on:": "Plus d'informations sur : {0}",
-    pushoverDesc1: "Priorité d'urgence (2) a un délai par défaut de 30 secondes entre les tentatives et expire après une heure.",
-    pushoverDesc2: "Si vous voulez envoyer des notifications sur différents appareils, remplissez le champ « Appareil ».",
-    "SMS Type": "Type de SMS",
-    octopushTypePremium: "Premium (rapide - recommandé pour les alertes)",
-    octopushTypeLowCost: "Économique (lent, bloqué de temps en temps par l'opérateur)",
-    checkPrice: "Vérification {0} tarifs :",
-    apiCredentials: "Identifiants de l'API",
-    octopushLegacyHint: "Voulez-vous utiliser l'ancienne version d'Octopush (2011-2020) ou la nouvelle version ?",
-    "Check octopush prices": "Vérifier les prix d'Octopush {0}.",
-    octopushPhoneNumber: "Numéro de téléphone (format international, ex. : +33612345678)",
-    octopushSMSSender: "Nom de l'expéditeur : 3-11 caractères alphanumériques avec espace (a-zA-Z0-9)",
-    "LunaSea Device ID": "Identifiant d'appareil LunaSea",
-    "Apprise URL": "URL d'Apprise",
-    "Example:": "Exemple : {0}",
-    "Read more:": "En savoir plus : {0}",
-    "Status:": "État : {0}",
-    "Read more": "En savoir plus",
-    appriseInstalled: "Apprise est installé.",
-    appriseNotInstalled: "Apprise n'est pas installé. {0}",
-    "Access Token": "Jeton d'accès",
-    "Channel access token": "Jeton d'accès au canal",
-    "Line Developers Console": "Console développeurs Line",
-    lineDevConsoleTo: "Console développeurs Line - {0}",
-    "Basic Settings": "Paramètres de base",
-    "User ID": "Identifiant utilisateur",
-    "Messaging API": "Messaging API", // Ne pas traduire, il s'agit du type de salon affiché sur la console développeurs Line
-    wayToGetLineChannelToken: "Premièrement accédez à {0}, créez un <i>provider</i> et définissez un type de salon à « Messaging API ». Vous pourrez alors avoir  puis vous pourrez avoir le jeton d'accès du salon et l'identifiant utilisateur demandés.",
-    "Icon URL": "URL vers l'icône",
-    aboutIconURL: "Vous pouvez mettre un lien vers une image dans « URL vers l'icône » pour remplacer l'image de profil par défaut. Elle ne sera utilisé que si « Icône émoji » n'est pas défini.",
-    aboutMattermostChannelName: "Vous pouvez remplacer le salon par défaut que le webhook utilise en mettant le nom du salon dans le champ « Nom du salon ». Vous aurez besoin de l'activer depuis les paramètres de Mattermost. Ex. : #autre-salon",
-    matrix: "Matrix",
-    promosmsTypeEco: "SMS ECO - Bon marché mais lent et souvent surchargé. Limité uniquement aux destinataires polonais.",
-    promosmsTypeFlash: "SMS FLASH - Le message sera automatiquement affiché sur l'appareil du destinataire. Limité uniquement aux destinataires Polonais.",
-    promosmsTypeFull: "SMS FULL - Version premium des SMS. Vous pouvez mettre le nom de l'expéditeur (vous devez l'enregistrer au préalable). Fiable pour les alertes.",
-    promosmsTypeSpeed: "SMS SPEED - Priorité élevée pour le système. Très rapide et fiable mais coûteux (environ le double du prix d'un SMS FULL).",
-    promosmsPhoneNumber: "Numéro de téléphone (pour les destinataires polonais, vous pouvez ignorer l'indicatif international)",
-    promosmsSMSSender: "Nom de l'expéditeur du SMS : Nom pré-enregistré ou l'un de base : InfoSMS, SMS Info, MaxSMS, INFO, SMS",
-    "Feishu WebHookUrl": "Feishu WebHookURL",
-    matrixHomeserverURL: "L'URL du serveur (avec http(s):// et le port de manière facultative)",
-    "Internal Room Id": "ID de la salle interne",
-    matrixDesc1: "Vous pouvez trouver l'ID de salle interne en regardant dans la section avancée des paramètres dans le client Matrix. C'est censé ressembler à !QMdRCpUIfLwsfjxye6:home.server.",
-    matrixDesc2: "Il est fortement recommandé de créer un nouvel utilisateur et de ne pas utiliser le jeton d'accès de votre propre utilisateur Matrix, car il vous donnera un accès complet à votre compte et à toutes les salles que vous avez rejointes. Pour cela, créez un nouvel utilisateur et invitez-le uniquement dans la salle dans laquelle vous souhaitez recevoir la notification. Vous pouvez obtenir le jeton d'accès en exécutant {0}",
-    Method: "Méthode",
-    Body: "Corps",
-    Headers: "En-têtes",
-    PushUrl: "URL Push",
-    HeadersInvalidFormat: "Les en-têtes de la requête ne sont pas dans un format JSON valide : ",
-    BodyInvalidFormat: "Le corps de la requête n'est pas dans un format JSON valide : ",
-    "Monitor History": "Historique de la sonde",
-    clearDataOlderThan: "Conserver l'historique des données de la sonde durant {0} jours.",
-    PasswordsDoNotMatch: "Les mots de passe ne correspondent pas.",
-    records: "enregistrements",
-    "One record": "Un enregistrement",
-    steamApiKeyDescription: "Pour surveiller un serveur Steam, vous avez besoin d'une clé Steam Web-API. Vous pouvez enregistrer votre clé ici : ",
-    "Current User": "Utilisateur actuel",
-    topic: "Topic",
-    topicExplanation: "Topic MQTT à surveiller",
-    successMessage: "Message de réussite",
-    successMessageExplanation: "Message MQTT qui sera considéré comme un succès",
-    recent: "Récent",
-    Done: "Fait",
-    Info: "Info",
-    Security: "Sécurité",
-    "Steam API Key": "Clé d'API Steam",
-    "Shrink Database": "Réduire la base de données",
-    "Pick a RR-Type...": "Choisissez un type d'enregistrement...",
-    "Pick Accepted Status Codes...": "Choisissez les codes de statut acceptés...",
-    Default: "Défaut",
-    "HTTP Options": "Options HTTP",
-    "Create Incident": "Créer un incident",
-    Title: "Titre",
-    Content: "Contenu",
-    Style: "Style",
-    info: "Info",
-    warning: "Attention",
-    danger: "Danger",
-    error: "Erreur",
-    critical: "Critique",
-    primary: "Primaire",
-    light: "Blanc",
-    dark: "Noir",
-    Post: "Post",
-    "Please input title and content": "Veuillez saisir le titre et le contenu",
-    Created: "Créé",
-    "Last Updated": "Dernière mise à jour",
-    Unpin: "Retirer",
-    "Switch to Light Theme": "Passer au thème clair",
-    "Switch to Dark Theme": "Passer au thème sombre",
-    "Show Tags": "Afficher les étiquettes",
-    "Hide Tags": "Masquer les étiquettes",
-    Description: "Description",
-    "No monitors available.": "Aucune sonde disponible.",
-    "Add one": "En rajouter une",
-    "No Monitors": "Aucune sonde",
-    "Untitled Group": "Groupe sans titre",
-    Services: "Services",
-    Discard: "Abandonner",
-    Cancel: "Annuler",
-    "Powered by": "Propulsé par",
-    shrinkDatabaseDescription: "Déclenche la commande VACUUM pour SQLite. Si votre base de données a été créée après la version 1.10.0, AUTO_VACUUM est déjà activé et cette action n'est pas nécessaire.",
-    serwersms: "SerwerSMS.pl",
-    serwersmsAPIUser: "Nom d'utilisateur de l'API (incl. webapi_ prefix)",
-    serwersmsAPIPassword: "Mot de passe API",
-    serwersmsPhoneNumber: "Numéro de téléphone",
-    serwersmsSenderName: "Nom de l'expéditeur du SMS (enregistré via le portail client)",
-    smseagle: "SMSEagle",
-    smseagleTo: "Numéro(s) de téléphone",
-    smseagleGroup: "Nom(s) de groupe(s) de répertoire",
-    smseagleContact: "Nom(s) de contact du répertoire",
-    smseagleRecipientType: "Type de destinataire",
-    smseagleRecipient: "Destinataire(s) (les multiples doivent être séparés par une virgule)",
-    smseagleToken: "Jeton d'accès à l'API",
-    smseagleUrl: "L'URL de votre appareil SMSEagle",
-    smseagleEncoding: "Envoyer en Unicode",
-    smseaglePriority: "Priorité des messages (0-9, par défaut = 0)",
-    stackfield: "Stackfield",
-    Customize: "Personnaliser",
-    "Custom Footer": "Pied de page personnalisé",
-    "Custom CSS": "CSS personnalisé",
-    smtpDkimSettings: "Paramètres DKIM",
-    smtpDkimDesc: "Veuillez vous référer au Nodemailer DKIM {0} pour l'utilisation.",
-    documentation: "documentation",
-    smtpDkimDomain: "Nom de domaine",
-    smtpDkimKeySelector: "Sélecteur de clé",
-    smtpDkimPrivateKey: "Clé privée",
-    smtpDkimHashAlgo: "Algorithme de hachage (facultatif)",
-    smtpDkimheaderFieldNames: "Clés d'en-tête à signer (facultatif)",
-    smtpDkimskipFields: "Clés d'en-tête à ne pas signer (facultatif)",
-    wayToGetPagerDutyKey: "Vous pouvez l'obtenir en allant dans Service -> Annuaire des services -> (sélectionner un service) -> Intégrations -> Ajouter une intégration. Ici, vous pouvez rechercher \"Events API V2\". Plus d'infos {0}",
-    "Integration Key": "Clé d'intégration",
-    "Integration URL": "URL d'intégration",
-    "Auto resolve or acknowledged": "Résolution automatique ou accusé de réception",
-    "do nothing": "ne fais rien",
-    "auto acknowledged": "accusé de réception automatique",
-    "auto resolve": "résolution automatique",
-    gorush: "Gorush",
-    alerta: "Alerta",
-    alertaApiEndpoint: "API Endpoint",
-    alertaEnvironment: "Environnement",
-    alertaApiKey: "Clé de l'API",
-    alertaAlertState: "État de l'alerte",
-    alertaRecoverState: "État de récupération",
-    deleteStatusPageMsg: "Voulez-vous vraiment supprimer cette page d'état ?",
-    Proxies: "Proxies",
-    default: "Défaut",
-    enabled: "Activé",
-    setAsDefault: "Définir par défaut",
-    deleteProxyMsg: "Voulez-vous vraiment supprimer ce proxy pour toutes les sondes ?",
-    proxyDescription: "Les proxies doivent être affectés à une sonde pour fonctionner.",
-    enableProxyDescription: "Ce proxy n'aura pas d'effet sur les demandes de sonde tant qu'il n'est pas activé. Vous pouvez contrôler la désactivation temporaire du proxy de toutes les sondes en fonction de l'état d'activation.",
-    setAsDefaultProxyDescription: "Ce proxy sera activé par défaut pour les nouvelles sondes. Vous pouvez toujours désactiver le proxy séparément pour chaque sonde.",
-    "Certificate Chain": "Chaîne de certificats",
-    Valid: "Valide",
-    Invalid: "Non valide",
-    AccessKeyId: "ID de clé d'accès",
-    SecretAccessKey: "Clé secrète d'accès",
-    PhoneNumbers: "Numéros de téléphone",
-    TemplateCode: "Modèle de code",
-    SignName: "Signature",
-    "Sms template must contain parameters: ": "Le modèle de SMS doit contenir des paramètres : ",
-    "Bark Endpoint": "Endpoint Bark",
-    "Bark Group": "Groupe Bark",
-    "Bark Sound": "Son Bark",
-    WebHookUrl: "WebHookUrl",
-    SecretKey: "Clé secrète",
-    "For safety, must use secret key": "Par sécurité, utilisation obligatoire de la clé secrète",
-    "Device Token": "Jeton d'appareil",
-    Platform: "Plateforme",
-    iOS: "iOS",
-    Android: "Android",
-    Huawei: "Huawei",
-    High: "Haute",
-    Retry: "Recommencez",
-    Topic: "Topic",
-    "WeCom Bot Key": "Clé de robot WeCom",
-    "Setup Proxy": "Configurer le proxy",
-    "Proxy Protocol": "Protocole proxy",
-    "Proxy Server": "Serveur proxy",
-    "Proxy server has authentication": "Une authentification est nécessaire pour le serveur proxy",
-    User: "Utilisateur",
-    Installed: "Installé",
-    "Not installed": "Non installé",
-    Running: "Fonctionne",
-    "Not running": "Ne fonctionne pas",
-    "Remove Token": "Supprimer le jeton",
-    Start: "Démarrer",
-    Stop: "Arrêter",
-    "Uptime Kuma": "Uptime Kuma",
-    "Add New Status Page": "Ajouter une page de statut",
-    Slug: "Chemin",
-    "Accept characters:": "Caractères acceptés : ",
-    startOrEndWithOnly: "Commence uniquement par {0}",
-    "No consecutive dashes": "Pas de double tirets",
-    Next: "Continuer",
-    "The slug is already taken. Please choose another slug.": "Un chemin existe déjà. Veuillez en choisir un autre.",
-    "No Proxy": "Pas de proxy",
-    Authentication: "Authentification",
-    "HTTP Basic Auth": "Authentification de base HTTP",
-    "New Status Page": "Nouvelle page de statut",
-    "Page Not Found": "Page non trouvée",
-    "Reverse Proxy": "Proxy inverse",
-    Backup: "Sauvegarde",
-    About: "À propos",
-    wayToGetCloudflaredURL: "(télécharger cloudflared depuis {0})",
-    cloudflareWebsite: "Site web de Cloudflare",
-    "Message:": "Message : ",
-    "Don't know how to get the token? Please read the guide:": "Vous ne savez pas comment obtenir le jeton ? Lisez le guide :",
-    "The current connection may be lost if you are currently connecting via Cloudflare Tunnel. Are you sure want to stop it? Type your current password to confirm it.": "La connexion actuelle peut être perdue si vous vous connectez actuellement via un tunnel Cloudflare. Êtes-vous sûr de vouloir l'arrêter ? Tapez votre mot de passe actuel pour le confirmer.",
-    "HTTP Headers": "En-têtes HTTP",
-    "Trust Proxy": "Proxy de confiance",
-    "Other Software": "Autres logiciels",
-    "For example: nginx, Apache and Traefik.": "Par exemple : nginx, Apache et Traefik.",
-    "Please read": "Veuillez lire",
-    "Subject:": "Objet : ",
-    "Valid To:": "Valable jusqu'au : ",
-    "Days Remaining:": "Jours restants : ",
-    "Issuer:": "Émetteur : ",
-    "Fingerprint:": "Empreinte : ",
-    "No status pages": "Aucune page de statut.",
-    "Domain Name Expiry Notification": "Notification d'expiration du nom de domaine",
-    Proxy: "Proxy",
-    "Date Created": "Date de création",
-    HomeAssistant: "Home Assistant",
-    onebotHttpAddress: "Adresse HTTP OneBot",
-    onebotMessageType: "Type de message OneBot",
-    onebotGroupMessage: "Groupe",
-    onebotPrivateMessage: "Privé",
-    onebotUserOrGroupId: "ID de groupe/utilisateur",
-    onebotSafetyTips: "Pour des raisons de sécurité, vous devez définir un jeton d'accès",
-    "PushDeer Key": "Clé PushDeer",
-    "Footer Text": "Texte de pied de page",
-    "Show Powered By": "Afficher « Propulsé par »",
-    "Domain Names": "Noms de domaine",
-    signedInDisp: "Connecté en tant que {0}",
-    signedInDispDisabled: "Authentification désactivée.",
-    RadiusSecret: "Radius Secret",
-    RadiusSecretDescription: "Secret partagé entre le client et le serveur",
-    RadiusCalledStationId: "Identifiant de la station appelée",
-    RadiusCalledStationIdDescription: "Identifiant de l'appareil appelé",
-    RadiusCallingStationId: "Identifiant de la station appelante",
-    RadiusCallingStationIdDescription: "Identifiant de l'appareil appelant",
-    "Certificate Expiry Notification": "Notification d'expiration du certificat",
-    "API Username": "Nom d'utilisateur de l'API",
-    "API Key": "Clé API",
-    "Recipient Number": "Numéro du destinataire",
-    "From Name/Number": "De nom/numéro",
-    "Leave blank to use a shared sender number.": "Laisser vide pour utiliser un numéro d'expéditeur partagé.",
-    "Octopush API Version": "Version de l'API Octopush",
-    "Legacy Octopush-DM": "Ancien Octopush-DM",
-    endpoint: "endpoint",
-    octopushAPIKey: "\"Clé API\" à partir des informations d'identification de l'API HTTP dans le panneau de configuration",
-    octopushLogin: "\"Identifiant\" à partir des informations d'identification de l'API HTTP dans le panneau de configuration",
-    promosmsLogin: "Nom de connexion API",
-    promosmsPassword: "Mot de passe API",
-    "pushoversounds pushover": "Pushover (par défaut)",
-    "pushoversounds bike": "Vélo",
-    "pushoversounds bugle": "Clairon",
-    "pushoversounds cashregister": "Caisse enregistreuse",
-    "pushoversounds classical": "Classique",
-    "pushoversounds cosmic": "Cosmique",
-    "pushoversounds falling": "Chute",
-    "pushoversounds gamelan": "Gamelan",
-    "pushoversounds incoming": "Arrivée",
-    "pushoversounds intermission": "Intermission",
-    "pushoversounds magic": "Magique",
-    "pushoversounds mechanical": "Mécanique",
-    "pushoversounds pianobar": "Piano-bar",
-    "pushoversounds siren": "Sirène",
-    "pushoversounds spacealarm": "Alarme spatiale",
-    "pushoversounds tugboat": "Remorqueur",
-    "pushoversounds alien": "Alarme alienne (version longue)",
-    "pushoversounds climb": "Escalade (version longue)",
-    "pushoversounds persistent": "Persistent (version longue)",
-    "pushoversounds echo": "Pushover Echo (version longue)",
-    "pushoversounds updown": "Up Down (version longue)",
-    "pushoversounds vibrate": "Vibration seulement",
-    "pushoversounds none": "Aucun (silencieux)",
-    pushyAPIKey: "Clé API secrète",
-    pushyToken: "Jeton d'appareil",
-    "Show update if available": "Afficher la mise à jour si disponible",
-    "Also check beta release": "Vérifiez également la version bêta",
-    "Using a Reverse Proxy?": "Utiliser un proxy inverse ?",
-    "Check how to config it for WebSocket": "Vérifier comment le configurer pour WebSocket",
-    "Steam Game Server": "Serveur de jeu Steam",
-    "Most likely causes:": "Causes les plus probables : ",
-    "The resource is no longer available.": "La ressource n'est plus disponible.",
-    "There might be a typing error in the address.": "Il se peut qu'il y ait une erreur de frappe dans l'adresse.",
-    "What you can try:": "Ce que vous pouvez essayer :",
-    "Retype the address.": "Retaper l'adresse.",
-    "Go back to the previous page.": "Retourner à la page précédente.",
-    "Coming Soon": "Prochainement",
-    wayToGetClickSendSMSToken: "Vous pouvez obtenir le nom d'utilisateur API et la clé API à partir de {0} .",
-    "Connection String": "Chaîne de connexion",
-    Query: "Requête",
-    settingsCertificateExpiry: "Expiration du certificat TLS",
-    certificationExpiryDescription: "Les sondes HTTPS émettent une notification lorsque le certificat TLS expire dans :",
-    "Setup Docker Host": "Configurer l'hôte Docker",
-    "Connection Type": "Type de connexion",
-    "Docker Daemon": "Deamon Docker",
-    deleteDockerHostMsg: "Voulez-vous vraiment supprimer cet hôte Docker pour toutes les sondes ?",
-    socket: "Socket",
-    tcp: "TCP / HTTP",
-    "Docker Container": "Conteneur Docker",
-    "Container Name / ID": "Nom / ID du conteneur",
-    "Docker Host": "Hôte Docker",
-    "Docker Hosts": "Hôtes Docker",
-    "ntfy Topic": "Topic ntfy",
-    Domain: "Domaine",
-    Workstation: "Poste de travail",
-    disableCloudflaredNoAuthMsg: "Vous êtes en mode No Auth, un mot de passe n'est pas nécessaire.",
-    trustProxyDescription: "Faire confiance aux en-têtes 'X-Forwarded-*'. Si vous souhaitez obtenir la bonne adresse IP client et que votre Uptime Kuma se situe derrière (nginx ou Apache) vous devez l'activer.",
-    wayToGetLineNotifyToken: "Vous pouvez obtenir un jeton d'accès auprès de {0}",
-    Examples: "Exemples",
-    "Home Assistant URL": "URL vers Home Assistant",
-    "Long-Lived Access Token": "Jeton d'accès de longue durée",
-    "Long-Lived Access Token can be created by clicking on your profile name (bottom left) and scrolling to the bottom then click Create Token. ": "Un jeton d'accès de longue durée peut être créé en cliquant sur le nom de votre profil (en bas à gauche) et en faisant défiler vers le bas, puis cliquez sur Créer un jeton. ",
-    "Notification Service": "Service de notifications",
-    "default: notify all devices": "par défaut: notifier tous les appareils",
-    "A list of Notification Services can be found in Home Assistant under \"Developer Tools > Services\" search for \"notification\" to find your device/phone name.": "Une liste des services de notification peut être trouvée dans Home Assistant sous \"Outils de développement > Services\" recherchez \"notification\" pour trouver le nom de votre appareil/téléphone.",
-    "Automations can optionally be triggered in Home Assistant:": "Les automatisations peuvent éventuellement être déclenchées dans Home Assistant : ",
-    "Trigger type:": "Type de déclencheur : ",
-    "Event type:": "Type d'événement : ",
-    "Event data:": "Données d'événement : ",
-    "Then choose an action, for example switch the scene to where an RGB light is red.": "Ensuite, choisissez une action, par exemple basculer la scène là où une lumière RVB est rouge.",
-    "Frontend Version": "Version frontend",
-    "Frontend Version do not match backend version!": "La version frontend ne correspond pas à la version backend !",
-    "Base URL": "URL de base",
-    goAlertInfo: "GoAlert est une application open source pour la planification des appels, les escalades automatisées et les notifications (comme les SMS ou les appels vocaux). Impliquez automatiquement la bonne personne, de la bonne manière et au bon moment ! {0}",
-    goAlertIntegrationKeyInfo: "Obtenez la clé d'intégration d'API générique pour le service dans ce format \"aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee\" généralement la valeur du paramètre de jeton de l'URL copiée.",
-    goAlert: "GoAlert",
-    backupOutdatedWarning: "Obsolète : étant donné que de nombreuses fonctionnalités ont été ajoutées et que cette fonctionnalité de sauvegarde est non maintenue, elle ne peut pas générer ou restaurer une sauvegarde complète.",
-    backupRecommend: "Veuillez sauvegarder le volume ou le dossier de données (./data/) directement à la place.",
-    Optional: "Optionnel",
-    squadcast: "Squadcast",
-    SendKey: "SendKey",
-    "SMSManager API Docs": "Documentations de l'API SMSManager ",
-    "Gateway Type": "Type de passerelle",
-    SMSManager: "SMSManager",
-    "You can divide numbers with": "Vous pouvez diviser des nombres avec",
-    or: "ou",
-    recurringInterval: "Intervalle",
-    Recurring: "Récurrent",
-    strategyManual: "Activer/désactiver manuellement",
-    warningTimezone: "Utilisation du fuseau horaire du serveur",
-    weekdayShortMon: "Lun",
-    weekdayShortTue: "Mar",
-    weekdayShortWed: "Mer",
-    weekdayShortThu: "Jeu",
-    weekdayShortFri: "Ven",
-    weekdayShortSat: "Sam",
-    weekdayShortSun: "Dim",
-    dayOfWeek: "Jour de la semaine",
-    dayOfMonth: "Jour du mois",
-    lastDay: "Dernier jour",
-    lastDay1: "Dernier jour du mois",
-    lastDay2: "Avant-dernier jour du mois",
-    lastDay3: "3ème dernier jour du mois",
-    lastDay4: "4ème dernier jour du mois",
-    "No Maintenance": "Aucune maintenance",
-    pauseMaintenanceMsg: "Voulez-vous vraiment mettre en pause ?",
-    "maintenanceStatus-under-maintenance": "En maintenance",
-    "maintenanceStatus-inactive": "Inactif",
-    "maintenanceStatus-scheduled": "Programmé",
-    "maintenanceStatus-ended": "Terminé",
-    "maintenanceStatus-unknown": "Inconnue",
-    "Display Timezone": "Afficher le fuseau horaire",
-    "Server Timezone": "Fuseau horaire du serveur",
-    statusPageMaintenanceEndDate: "Fin",
-    IconUrl: "URL vers l'icône",
-    "Enable DNS Cache": "Activer le cache DNS",
-    Enable: "Activer",
-    Disable: "Désactiver",
-    dnsCacheDescription: "Il peut ne pas fonctionner dans certains environnements IPv6, désactivez-le si vous rencontrez des problèmes.",
-    "Single Maintenance Window": "Créneau de maintenance unique",
-    "Maintenance Time Window of a Day": "Créneau de la maintenance",
-    "Effective Date Range": "Plage de dates d'effet",
-    "Schedule Maintenance": "Créer une maintenance",
-    "Date and Time": "Date et heure",
-    "DateTime Range": "Plage de dates et d'heures",
-    Strategy: "Stratégie",
-    "Free Mobile User Identifier": "Identifiant d'utilisateur Free Mobile",
-    "Free Mobile API Key": "Clé d'API Free Mobile",
-    "Enable TLS": "Activer le TLS",
-    "Proto Service Name": "Nom du service proto",
-    "Proto Method": "Méthode Proto",
-    "Proto Content": "Contenu proto",
-    "Economy": "Économique",
-    "Lowcost": "Faible coût",
-    "high": "Haute",
-    "General Monitor Type": "Type de sonde générale",
-    "Passive Monitor Type": "Type de sonde passive",
-    "Specific Monitor Type": "Type de sonde spécifique",
-};
diff --git a/src/languages/he-IL.js b/src/languages/he-IL.js
deleted file mode 100644
index d98b063df..000000000
--- a/src/languages/he-IL.js
+++ /dev/null
@@ -1,672 +0,0 @@
-export default {
-    languageName: "עברית",
-    checkEverySecond: "בדוק כל {0} שניות",
-    retryCheckEverySecond: "נסה שוב כל {0} שניות",
-    resendEveryXTimes: "התראה שוב כל {0} פעמים",
-    resendDisabled: "השליחה מחדש מושבתת",
-    retriesDescription: "מקסימום ניסיונות חוזרים לפני שהשירות יסומן כלא פעיל ונשלחת התראה",
-    ignoreTLSError: "התעלם משגיאת TLS/SSL עבור אתרי HTTPS",
-    upsideDownModeDescription: "הפוך את הסטטוס על הפוך. אם ניתן להגיע לשירות, הוא לא פעיל.",
-    maxRedirectDescription: "המספר המרבי של הפניות מחדש לעקוב. הגדר ל-0 כדי להשבית הפניות מחדש.",
-    enableGRPCTls: "אפשר לשלוח בקשת gRPC עם חיבור TLS",
-    grpcMethodDescription: "שם השיטה מומר לפורמט cammelCase כגון sayHello, check וכו.",
-    acceptedStatusCodesDescription: "בחר קודי סטטוס שנחשבים לתגובה מוצלחת.",
-    Maintenance: "תחזוקה",
-    statusMaintenance: "תחזוקה",
-    "Schedule maintenance": "תחזוקה מתוכננת",
-    "Affected Monitors": "מוניטורים מושפעים",
-    "Pick Affected Monitors...": "בחר המוניטרים מושפעים...",
-    "Start of maintenance": "תחילת תחזוקה",
-    "All Status Pages": "כל דפי הסטטוס",
-    "Select status pages...": "בחר דפי סטטוס...",
-    recurringIntervalMessage: "רוץ פעם ביום | הפעל אחת ל-{0} ימים",
-    affectedMonitorsDescription: "בחר מוניטורים שמושפעים מהתחזוקה הנוכחית",
-    affectedStatusPages: "הצג הודעת תחזוקה זו בדפי סטטוס שנבחרו",
-    atLeastOneMonitor: "בחר לפחות מוניטור אחד מושפע",
-    passwordNotMatchMsg: "הסיסמאות לא תואמות",
-    notificationDescription: "יש להקצות התראות למוניטור כדי שהן יעבדו.",
-    keywordDescription: "חפש מילת מפתח בתגובת HTML או JSON רגילה. החיפוש תלוי רישיות.",
-    pauseDashboardHome: "עצור",
-    deleteMonitorMsg: "האם אתה בטוח שברצונך למחוק את המוניטור הזה?",
-    deleteMaintenanceMsg: "האם אתה בטוח שברצונך למחוק את התחזוקה הזו?",
-    deleteNotificationMsg: "האם אתה בטוח שברצונך למחוק את ההודעה הזו עבור כל מוניטרים?",
-    dnsPortDescription: "יציאת שרת DNS. ברירת המחדל היא 53. אתה יכול לשנות את היציאה בכל עת.",
-    resolverserverDescription: "Cloudflare הוא שרת ברירת המחדל. אתה יכול לשנות את שרת הפותר בכל עת.",
-    rrtypeDescription: "בחר את סוג ה-RR שברצונך לפקח עליו",
-    pauseMonitorMsg: "האם אתה בטוח רוצה להשהות?",
-    enableDefaultNotificationDescription: "הודעה זו תופעל כברירת מחדל עבור מוניטרים חדשים. אתה עדיין יכול להשבית את ההודעה בנפרד עבור כל מוניטור.",
-    clearEventsMsg: "האם אתה בטוח שברצונך למחוק את כל האירועים עבור המוניטור הזה?",
-    clearHeartbeatsMsg: "האם אתה בטוח שברצונך למחוק את כל פעימות הלב עבור המוניטור הזה?",
-    confirmClearStatisticsMsg: "האם אתה בטוח שברצונך למחוק את כל הנתונים הסטטיסטיים?",
-    importHandleDescription: "בחר 'דלג על קיים' אם ברצונך לדלג על כל מוניטור או התראה באותו שם. 'החלף' ימחק כל מוניטור והתראה קיימים.",
-    confirmImportMsg: "האם אתה בטוח שברצונך לייבא את הגיבוי? אנא ודא שבחרת באפשרות הייבוא הנכונה.",
-    twoFAVerifyLabel: "אנא הזן את האסימון שלך כדי לאמת מערכת אדוש:",
-    tokenValidSettingsMsg: "האסימון תקף! כעת אתה יכול לשמור את הגדרות האדוש.",
-    confirmEnableTwoFAMsg: "האם אתה בטוח שברצונך להפעיל את מערכת אדוש?",
-    confirmDisableTwoFAMsg: "Are you sure you want to disable 2FA?",
-    Settings: "הגדרות",
-    Dashboard: "פאנל ניהול",
-    "New Update": "עדכון חדש",
-    Language: "שפה",
-    Appearance: "נראות",
-    Theme: "ערכת נושא",
-    General: "כללי",
-    "Primary Base URL": "כתובת האתר הראשית של הבסיס",
-    Version: "גרסה",
-    "Check Update On GitHub": "לבדוק עדכונים בגיטהאב",
-    List: "רשימה",
-    Add: "הוסף",
-    "Add New Monitor": "הוספת מוניטור חדש",
-    "Quick Stats": "נתונים בקצרה",
-    Up: "פעיל",
-    Down: "לא פעיל",
-    Pending: "ממתין",
-    Unknown: "לא יודע",
-    Pause: "עצור",
-    Name: "שם",
-    Status: "סטטוס",
-    DateTime: "תאריך שעה",
-    Message: "הודעה",
-    "No important events": "אין אירועים חשובים",
-    Resume: "המשך",
-    Edit: "עריכה",
-    Delete: "מחיקה",
-    Current: "עכשיו",
-    Uptime: "זמן פעילות",
-    "Cert Exp.": "Cert Exp.",
-    day: "יום | ימים",
-    "-day": "-יום",
-    hour: "שעה",
-    "-hour": "-שעה",
-    Response: "תגובה",
-    Ping: "פינג",
-    "Monitor Type": "סוג מוניטור",
-    Keyword: "מילת מפתח",
-    "Friendly Name": "שם ידידותי",
-    URL: "כתובת אתר",
-    Hostname: "שם המארח",
-    Port: "פורט",
-    "Heartbeat Interval": "מרווח פעימות",
-    Retries: "נסיונות חוזרים",
-    "Heartbeat Retry Interval": "מרווח נסיונות חוזר של פעימות",
-    "Resend Notification if Down X times consequently": "שלח שוב הודעה אם ירד X פעמים כתוצאה מכך",
-    Advanced: "מתקדם",
-    "Upside Down Mode": "מצב הפוך",
-    "Max. Redirects": "מקסימום הפניות מחדש",
-    "Accepted Status Codes": "קודי סטטוס מקובלים",
-    "Push URL": "דחף כתובת URL",
-    needPushEvery: "עליך להתקשר לכתובת האתר הזו כל {0} שניות.",
-    pushOptionalParams: "פרמטרים אופציונליים: {0}",
-    Save: "שמירה",
-    Notifications: "התראות",
-    "Not available, please setup.": "לא זמין, אנא הגדר.",
-    "Setup Notification": "הודעת הגדרה",
-    Light: "בהיר",
-    Dark: "חושך",
-    Auto: "אוטומטי",
-    "Theme - Heartbeat Bar": "ערכת נושא - Heartbeat Bar",
-    Normal: "נורמלי",
-    Bottom: "למטה",
-    None: "כלום",
-    Timezone: "אזור זמן",
-    "Search Engine Visibility": "נראות במנועי חיפוש",
-    "Allow indexing": "אפשר הוספה לאינדקס",
-    "Discourage search engines from indexing site": "לא לעודד מנועי חיפוש לאינדקס אתרים",
-    "Change Password": "שנה סיסמא",
-    "Current Password": "סיסמה נוכחית",
-    "New Password": "סיסמה חדשה",
-    "Repeat New Password": "חזור על סיסמה חדשה",
-    "Update Password": "עדכן סיסמה",
-    "Disable Auth": "השבתת אבטחה",
-    "Enable Auth": "הפעלת אבטחה",
-    "disableauth.message1": "האם אתה בטוח שברצונך <strong>להשבית את האבטחה</strong>?",
-    "disableauth.message2": "הוא מיועד לתרחישים <strong>שבהם אתה מתכוון ליישם אימות של צד שלישי</strong> מול Uptime Kuma כגון Cloudflare Access, Authelia או מנגנוני אימות אחרים.",
-    "Please use this option carefully!": "אנא השתמש באפשרות זו בזהירות!",
-    Logout: "התנתקות",
-    Leave: "יציאה",
-    "I understand, please disable": "אני מבין, אני רוצה להשבית",
-    Confirm: "אישור",
-    Yes: "כן",
-    No: "לא",
-    Username: "שם משתמש",
-    Password: "סיסמה",
-    "Remember me": "זכור אותי",
-    Login: "התחברות",
-    "No Monitors, please": "בלי מוניטורים, בבקשה",
-    "add one": "להוסיף אחד",
-    "Notification Type": "סוג התראה",
-    Email: "אימייל",
-    Test: "Test",
-    "Certificate Info": "פרטי תעודת אבטחה",
-    "Resolver Server": "שרת פותר",
-    "Resource Record Type": "סוג רשומת משאבים",
-    "Last Result": "תוצאה אחרונה",
-    "Create your admin account": "צור את חשבון הניהול שלך",
-    "Repeat Password": "חזור על הסיסמה",
-    "Import Backup": "ייבוא גיבוי",
-    "Export Backup": "ייצוא גיבוי",
-    Export: "ייצוא",
-    Import: "ייבוא",
-    respTime: "רפ. זמן (ms)",
-    notAvailableShort: "N/A",
-    "Default enabled": "ברירת המחדל מופעלת",
-    "Apply on all existing monitors": "החל על כל המסכים הקיימים",
-    Create: "ליצור",
-    "Clear Data": "נקה נתונים",
-    Events: "אירועים",
-    Heartbeats: "פעימות לב",
-    "Auto Get": "קבל אוטומטי",
-    backupDescription: "אתה יכול לגבות את כל המסכים וההתראות לקובץ JSON.",
-    backupDescription2: "הערה: היסטוריה ונתוני אירועים אינם כלולים.",
-    backupDescription3: "נתונים רגישים כגון אסימוני הודעה כלולים בקובץ הייצוא; נא לאחסן יצוא בצורה מאובטחת.",
-    alertNoFile: "אנא בחר קובץ לייבוא.",
-    alertWrongFileType: "אנא בחר קובץ JSON.",
-    "Clear all statistics": "נקה את כל הנתונים הסטטיסטיים",
-    "Skip existing": "דילוג על הקיים",
-    Overwrite: "החלף",
-    Options: "אפשרויות",
-    "Keep both": "שמור את שניהם",
-    "Verify Token": "אמת את האסימון",
-    "Setup 2FA": "הגדרת מערכת אדוש",
-    "Enable 2FA": "הפעלת אדוש",
-    "Disable 2FA": "כיבוי אדוש",
-    "2FA Settings": "הגדרות אדוש",
-    "Two Factor Authentication": "אימות דו-שלבי (מערכת אדוש)",
-    Active: "מופעל",
-    Inactive: "קבוי",
-    Token: "אסימון",
-    "Show URI": "הצג URI",
-    Tags: "תגים",
-    "Add New below or Select...": "הוסף חדש למטה או בחר...",
-    "Tag with this name already exist.": "תג בשם זה כבר קיים.",
-    "Tag with this value already exist.": "תג עם ערך זה כבר קיים.",
-    color: "צבע",
-    "value (optional)": "ערך (אופציונלי)",
-    Gray: "אפור",
-    Red: "אדום",
-    Orange: "כתום",
-    Green: "ירוק",
-    Blue: "כחול",
-    Indigo: "כחול כהה",
-    Purple: "סגול",
-    Pink: "כתום",
-    "Search...": "לחפש...",
-    "Avg. Ping": "פינג ממוצע",
-    "Avg. Response": "ממוצע תגובה",
-    "Entry Page": "דף כניסה",
-    statusPageNothing: "אין כאן שום דבר, בבקשה הוסף קבוצה או מוניטור.",
-    "No Services": "אין שירותים",
-    "All Systems Operational": "כל המערכות עובדות",
-    "Partially Degraded Service": "שירות פגום חלקית",
-    "Degraded Service": "שירות פגום",
-    "Add Group": "הוסף קבוצה",
-    "Add a monitor": "הוסף מוניטור",
-    "Edit Status Page": "ערוך דף סטטוס",
-    "Go to Dashboard": "מעבר לפאנל",
-    "Status Page": "דף סטטוס",
-    "Status Pages": "דפי סטטוס",
-    defaultNotificationName: "התראת {notification} שלי ({number})",
-    here: "פה",
-    Required: "נדרש",
-    telegram: "טלגרם",
-    "Bot Token": "אסימון בוט",
-    wayToGetTelegramToken: "אתה יכול לקבל אסימון מ-{0}.",
-    "Chat ID": "מזהה צ'אט",
-    supportTelegramChatID: "תמיכה בצ'אט ישיר / קבוצה / מזהה הצ'אט של הערוץ",
-    wayToGetTelegramChatID: "אתה יכול לקבל את מזהה הצ'אט שלך על ידי שליחת הודעה לבוט ומעבר לכתובת האתר הזו כדי להציג את ה-chat_id:",
-    "YOUR BOT TOKEN HERE": "אסימון הבוט שלך כאן",
-    chatIDNotFound: "מזהה צ'אט לא נמצא; אנא שלח הודעה לבוט זה תחילה",
-    webhook: "Webhook",
-    "Post URL": "כתובת אתר של פוסט",
-    "Content Type": "סוג התוכן",
-    webhookJsonDesc: "{0} מתאים לכל שרתי HTTP מודרניים כגון Express.js",
-    webhookFormDataDesc: "{multipart} טוב ל-PHP. יהיה צורך לנתח את ה-JSON באמצעות {decodeFunction}",
-    webhookAdditionalHeadersTitle: "כותרות נוספות",
-    webhookAdditionalHeadersDesc: "מגדיר כותרות נוספות שנשלחות עם ה-webhook.",
-    smtp: "אימייל (SMTP)",
-    secureOptionNone: "None / STARTTLS (25, 587)",
-    secureOptionTLS: "TLS (465)",
-    "Ignore TLS Error": "התעלם משגיאת TLS",
-    "From Email": "אמייל שולח",
-    emailCustomSubject: "נושא מותאם אישית",
-    "To Email": "למייל",
-    smtpCC: "עותק",
-    smtpBCC: "עותק מוסתר",
-    discord: "דיסקורד",
-    "Discord Webhook URL": "כתובת אתר של Discord Webhook",
-    wayToGetDiscordURL: "אתה יכול לקבל זאת על ידי מעבר להגדרות שרת -> אינטגרציות -> צור Webhook",
-    "Bot Display Name": "שם תצוגה של בוט",
-    "Prefix Custom Message": "קידומת הודעה מותאמת אישית",
-    "Hello @everyone is...": "שלום {'@'}כולם...",
-    teams: "Microsoft Teams",
-    "Webhook URL": "כתובת האתר של Webhook",
-    wayToGetTeamsURL: "אתה יכול ללמוד כיצד ליצור כתובת אתר ל-webhook {0}.",
-    signal: "אוֹת",
-    Number: "מספר",
-    Recipients: "נמענים",
-    needSignalAPI: "אתה צריך שיהיה לך לקוח איתות עם REST API.",
-    wayToCheckSignalURL: "אתה יכול לבדוק את כתובת האתר הזו כדי לראות כיצד להגדיר אחת:",
-    signalImportant: "חשוב: לא ניתן לערבב קבוצות ומספרים בנמענים!",
-    gotify: "Gotify",
-    "Application Token": "אסימון אפליקציה",
-    "Server URL": "כתובת האתר של השרת",
-    Priority: "עדיפות",
-    slack: "Slack",
-    "Icon Emoji": "אייקון אימוג'י",
-    "Channel Name": "שם הערוץ",
-    "Uptime Kuma URL": "Uptime Kuma URL",
-    aboutWebhooks: "מידע נוסף על Webhooks ב: {0}",
-    aboutChannelName: "הזן את שם הערוץ בשדה {0} שם ערוץ אם ברצונך לעקוף את ערוץ Webhook. לדוגמה: #ערוץ אחר",
-    aboutKumaURL: "אם תשאיר את השדה Uptime Kuma URL ריק, הוא יעבור כברירת מחדל לעמוד Project GitHub.",
-    emojiCheatSheet: "גיליון הונאה של אמוג'י: {0}",
-    "rocket.chat": "Rocket.Chat",
-    pushover: "Pushover",
-    pushy: "Pushy",
-    PushByTechulus: "Push by Techulus",
-    octopush: "Octopush",
-    promosms: "PromoSMS",
-    clicksendsms: "ClickSend SMS",
-    lunasea: "LunaSea",
-    apprise: "Apprise (תומך ב-50+ שירותי התראות)",
-    GoogleChat: "Google Chat (Google Workspace בלבד)",
-    pushbullet: "Pushbullet",
-    line: "Line Messenger",
-    mattermost: "Mattermost",
-    "User Key": "מפתח משתמש",
-    Device: "התקן",
-    "Message Title": "כותרת ההודעה",
-    "Notification Sound": "צליל התראה",
-    "More info on:": "מידע נוסף על: {0}",
-    pushoverDesc1: "לעדיפות חירום (2) יש פסק זמן של 30 שניות ברירת מחדל בין ניסיונות חוזרים, והיא תפוג לאחר שעה.",
-    pushoverDesc2: "אם ברצונך לשלוח התראות למכשירים שונים, מלא את שדה התקן.",
-    "SMS Type": "סוג SMS",
-    octopushTypePremium: "פרימיום (מהיר - מומלץ להתראה)",
-    octopushTypeLowCost: "עלות נמוכה (איטית - לפעמים חסומה על ידי המפעיל)",
-    checkPrice: "בדוק מחירים של {0}:",
-    apiCredentials: "אישורי API",
-    octopushLegacyHint: "האם אתה משתמש בגרסה הישנה של Octopush (2011-2020) או בגרסה החדשה?",
-    "Check octopush prices": "בדוק מחירי תמנון {0}.",
-    octopushPhoneNumber: "מספר טלפון (פורמט אינטלי, למשל: +33612345678)",
-    octopushSMSSender: "שם שולח SMS: 3-11 תווים אלפאנומריים ורווח (a-zA-Z0-9)",
-    "LunaSea Device ID": "מזהה מכשיר LunaSea",
-    "Apprise URL": "Apprise URL",
-    "Example:": "דוגמה: {0}",
-    "Read more:": "קרא עוד: {0}",
-    "Status:": "סטטוס: {0}",
-    "Read more": "קרא עוד",
-    appriseInstalled: "Apprise מותקן.",
-    appriseNotInstalled: "Apprise אינו מותקן. {0}",
-    "Access Token": "אסימון גישה",
-    "Channel access token": "אסימון גישה לערוץ",
-    "Line Developers Console": "קונסולת מפתחים",
-    lineDevConsoleTo: "קו מפתחי קונסולת - {0}",
-    "Basic Settings": "הגדרות בסיסיות",
-    "User ID": "תעודת זהות של משתמש",
-    "Messaging API": "Messaging API",
-    wayToGetLineChannelToken: "תחילה גש ל-{0}, צור ספק וערוץ (Messaging API), לאחר מכן תוכל לקבל את אסימון הגישה לערוץ ומזהה המשתמש מפריטי התפריט שהוזכרו לעיל.",
-    "Icon URL": "כתובת אתר של סמל",
-    aboutIconURL: "אתה יכול לספק קישור לתמונה ב\"כתובת URL של סמל\" כדי לעקוף את תמונת הפרופיל המוגדרת כברירת מחדל. לא ישמש אם Icon Emoji מוגדר.",
-    aboutMattermostChannelName: "אתה יכול לעקוף את ערוץ ברירת המחדל שאליו ה-Webhook מפרסם על ידי הזנת שם הערוץ בשדה \"שם ערוץ\". זה צריך להיות מופעל בהגדרות Mattermos Webhook. לדוגמה: #ערוץ אחר",
-    matrix: "Matrix",
-    promosmsTypeEco: "SMS ECO - זול אך איטי ולעיתים עמוס מדי. מוגבל רק לנמענים פולנים.",
-    promosmsTypeFlash: "SMS FLASH - ההודעה תוצג אוטומטית במכשיר הנמען. מוגבל לנמענים פולנים בלבד.",
-    promosmsTypeFull: "SMS FULL - שכבת פרימיום של SMS, אתה יכול להשתמש בשם השולח שלך (עליך לרשום את השם תחילה). אמין להתראות.",
-    promosmsTypeSpeed: "SMS SPEED - העדיפות הגבוהה ביותר במערכת. מאוד מהיר ואמין אבל יקר (בערך פי שניים ממחיר מלא של SMS).",
-    promosmsPhoneNumber: "מספר טלפון (לנמען פולני ניתן לדלג על אזורי חיוג)",
-    promosmsSMSSender: "שם שולח SMS: שם רשום מראש או אחת מברירות המחדל: InfoSMS, SMS Info, MaxSMS, INFO, SMS",
-    "Feishu WebHookUrl": "Feishu WebHookURL",
-    matrixHomeserverURL: "כתובת האתר של שרת הבית (עם http(s):// ויציאה אופציונלית)",
-    "Internal Room Id": "מזהה חדר פנימי",
-    matrixDesc1: "אתה יכול למצוא את מזהה החדר הפנימי על ידי עיון בחלק המתקדם של לקוח Matrix שלך בהגדרות החדר. זה צריך להיראות כמו !QMdRCpUIfLwsfjxye6:home.server.",
-    matrixDesc2: "מומלץ מאוד ליצור משתמש חדש ולא להשתמש באסימון הגישה של משתמש מטריקס משלך שכן הוא יאפשר גישה מלאה לחשבון שלך ולכל החדרים שהצטרפת אליהם. במקום זאת, צור משתמש חדש והזמן אותו רק לחדר שבו תרצה לקבל את ההתראה. תוכל לקבל את אסימון הגישה על ידי הפעלת {0}",
-    Method: "Method",
-    Body: "Body",
-    Headers: "Headers",
-    PushUrl: "Push URL",
-    HeadersInvalidFormat: "כותרות הבקשה אינן JSON חוקיות:",
-    BodyInvalidFormat: "גוף הבקשה אינו JSON חוקי:",
-    "Monitor History": "מעקב אחר היסטוריה",
-    clearDataOlderThan: "שמור את נתוני היסטוריית הצג למשך {0} ימים.",
-    PasswordsDoNotMatch: "סיסמאות לא תואמות.",
-    records: "רשומות",
-    "One record": "שיא אחד",
-    steamApiKeyDescription: "לניטור שרת משחקי Steam אתה צריך מפתח Steam Web-API. אתה יכול לרשום את מפתח ה-API שלך כאן:",
-    "Current User": "משתמש נוכחי",
-    topic: "נושא",
-    topicExplanation: "נושא MQTT למעקב",
-    successMessage: "הודעת הצלחה",
-    successMessageExplanation: "הודעת MQTT שתיחשב כהצלחה",
-    recent: "לאחרונה",
-    Done: "בוצע",
-    Info: "מידע",
-    Security: "אבטחה",
-    "Steam API Key": "מפתח API Steam",
-    "Shrink Database": "מסד נתונים מכווץ",
-    "Pick a RR-Type...": "בחר סוג RR ...",
-    "Pick Accepted Status Codes...": "בחר קודי סטטוס מקובלים ...",
-    Default: "בְּרִירַת מֶחדָל",
-    "HTTP Options": "אפשרויות HTTP",
-    "Create Incident": "ליצור אירוע",
-    Title: "כותרת",
-    Content: "תוֹכֶן",
-    Style: "Style",
-    info: "מידע",
-    warning: "אַזהָרָה",
-    danger: "סַכָּנָה",
-    error: "שְׁגִיאָה",
-    critical: "קריטי",
-    primary: "יְסוֹדִי",
-    light: "אוֹר",
-    dark: "אפל",
-    Post: "הודעה",
-    "Please input title and content": "אנא הזן כותרת ותוכן",
-    Created: "נוצר",
-    "Last Updated": "עודכן לאחרונה",
-    Unpin: "ענן חוף",
-    "Switch to Light Theme": "לעבור לנושא האור",
-    "Switch to Dark Theme": "לעבור לנושא אפל",
-    "Show Tags": "Show Tags",
-    "Hide Tags": "הסתר תגיות",
-    Description: "תיאור",
-    "No monitors available.": "אין צגים זמינים.",
-    "Add one": "הוסף אחד",
-    "No Monitors": "אין צגים",
-    "Untitled Group": "קבוצה ללא כותרת",
-    Services: "שירותים",
-    Discard: "להשליך",
-    Cancel: "לְבַטֵל",
-    "Powered by": "פועל על",
-    shrinkDatabaseDescription: "ואקום מסד נתונים להפעיל עבור SQLITE.אם בסיס הנתונים שלך נוצר לאחר 1.10.0, Auto_VACUUM כבר מופעל ואין צורך בפעולה זו.",
-    serwersms: "SerwerSMS.pl",
-    serwersmsAPIUser: "API Username (incl. webapi_ prefix)",
-    serwersmsAPIPassword: "סיסמת API",
-    serwersmsPhoneNumber: "מספר טלפון",
-    serwersmsSenderName: "שם שולח SMS (רשום באמצעות פורטל לקוחות)",
-    smseagle: "SMSEagle",
-    smseagleTo: "מספרי טלפון)",
-    smseagleGroup: "שם קבוצת ספר טלפונים",
-    smseagleContact: "שם איש קשר בספר הטלפונים",
-    smseagleRecipientType: "Rסוג הנמען",
-    smseagleRecipient: "נמענים (ים) (יש להפריד בין מרובים לפסיק)",
-    smseagleToken: "API Access Token",
-    smseagleUrl: "כתובת האתר של מכשיר ה- SMSeagege שלך",
-    smseagleEncoding: "שלח כ- Unicode",
-    smseaglePriority: "עדיפות הודעה (0-9, ברירת מחדל = 0)",
-    stackfield: "סטאקפילד",
-    Customize: "התאמה אישית",
-    "Custom Footer": "כותרת תחתונה מותאמת אישית",
-    "Custom CSS": "CSS מותאם אישית",
-    smtpDkimSettings: "הגדרות DKIM",
-    smtpDkimDesc: "אנא עיין ב- NodeMailer DKIM {0} לשימוש.",
-    documentation: "ווקיפדיית מדריכים",
-    smtpDkimDomain: "שם דומיין",
-    smtpDkimKeySelector: "בורר מפתח",
-    smtpDkimPrivateKey: "טוראי של פרטיy",
-    smtpDkimHashAlgo: "אלגוריתם hash (אופציונלי)",
-    smtpDkimheaderFieldNames: "מפתחות כותרת לחתום (אופציונלי)",
-    smtpDkimskipFields: "מפתחות כותרת לא לחתום (אופציונלי)",
-    wayToGetPagerDutyKey: "אתה יכול להשיג זאת על ידי מעבר לשירות -> ספריית שירות -> (בחר שירות) -> אינטגרציות -> הוסף אינטגרציה.כאן תוכלו לחפש \"אירועים API v2 \".מידע נוסף {0}",
-    "Integration Key": "מפתח אינטגרציה",
-    "Integration URL": "URL אינטגרציה",
-    "Auto resolve or acknowledged": "פיתרון אוטומטי או הודה",
-    "do nothing": "לעשות כלום",
-    "auto acknowledged": "Auto הודה",
-    "auto resolve": "פתרון אוטומטי",
-    gorush: "Gorush",
-    alerta: "Alerta",
-    alertaApiEndpoint: "נקודת קצה של API",
-    alertaEnvironment: "סביבה",
-    alertaApiKey: "מפתח API",
-    alertaAlertState: "מצב התראה",
-    alertaRecoverState: "לשחזר מדינה",
-    deleteStatusPageMsg: "האם אתה בטוח רוצה למחוק את דף הסטטוס הזה?",
-    Proxies: "Proxies",
-    default: "בְּרִירַת מֶחדָל",
-    enabled: "מופעל",
-    setAsDefault: "נקבע כברירת מחדל",
-    deleteProxyMsg: "האם אתה בטוח רוצה למחוק את הפרוקסי הזה לכל המסכים?",
-    proxyDescription: "Proxies must be assigned to a monitor to function.",
-    enableProxyDescription: "פרוקסי זה לא ישפיע על בקשות צג עד שהוא יופעל.אתה יכול לשלוט באופן זמני להשבית את ה- Proxy מכל המסכים לפי מצב ההפעלה.",
-    setAsDefaultProxyDescription: "פרוקסי זה יופעל כברירת מחדל עבור צגים חדשים.אתה עדיין יכול להשבית את ה- Proxy בנפרד עבור כל צג.",
-    "Certificate Chain": "שרשרת אישורים",
-    Valid: "תָקֵף",
-    Invalid: "לא חוקי",
-    AccessKeyId: "מזהה AccessKey",
-    SecretAccessKey: "גישהלמפתחסוד",
-    PhoneNumbers: "מספר טלפוןs",
-    TemplateCode: "TemplateCode",
-    SignName: "שם שם",
-    "Sms template must contain parameters: ": "תבנית SMS חייבת להכיל פרמטרים: ",
-    "Bark Endpoint": "Bark Endpoint",
-    "Bark Group": "Bark Group",
-    "Bark Sound": "Bark Sound",
-    WebHookUrl: "WebHookUrl",
-    SecretKey: "מפתח סודי",
-    "For safety, must use secret key": "לבטיחות, חייב להשתמש במפתח סודיy",
-    "Device Token": "אסימון מכשיר",
-    Platform: "פּלַטפוֹרמָה",
-    iOS: "iOS",
-    Android: "דְמוּי אָדָם",
-    Huawei: "huawei",
-    High: "High",
-    Retry: "נסה שוב",
-    Topic: "נוֹשֵׂא",
-    "WeCom Bot Key": "WeCom Bot Key",
-    "Setup Proxy": "הגדרת פרוקסי",
-    "Proxy Protocol": "פרוטוקול פרוקסי",
-    "Proxy Server": "שרת פרוקסי",
-    "Proxy server has authentication": "לשרת ה- Proxy יש אימות",
-    User: "מִשׁתַמֵשׁ",
-    Installed: "מוּתקָן",
-    "Not installed": "לא מותקן",
-    Running: "רץ",
-    "Not running": "לא רץ",
-    "Remove Token": "הסר אסימון",
-    Start: "הַתחָלָה",
-    Stop: "תפסיק",
-    "Uptime Kuma": "Uptime Kuma",
-    "Add New Status Page": "הוסף דף סטטוס חדש",
-    Slug: "Slug",
-    "Accept characters:": "קבל תווים:",
-    startOrEndWithOnly: "התחל או סוף עם {0} בלבד",
-    "No consecutive dashes": "אין מקפים רצופים",
-    Next: "הַבָּא",
-    "The slug is already taken. Please choose another slug.": "השבלול כבר נלקח.אנא בחר שבלול נוסף.",
-    "No Proxy": "אין פרוקסי",
-    Authentication: "אבטחה",
-    "HTTP Basic Auth": "HTTP בסיסי Auth",
-    "New Status Page": "דף סטטוס חדש",
-    "Page Not Found": "הדף לא נמצא",
-    "Reverse Proxy": "פרוקסי הפוך",
-    Backup: "גיבוי",
-    About: "אודות",
-    wayToGetCloudflaredURL: "(הורד את CloudFlared מ- {0})",
-    cloudflareWebsite: "אתר CloudFlare",
-    "Message:": "הוֹדָעָה:",
-    "Don't know how to get the token? Please read the guide:": "לא יודע איך להשיג את האסימון?אנא קרא את המדריך:",
-    "The current connection may be lost if you are currently connecting via Cloudflare Tunnel. Are you sure want to stop it? Type your current password to confirm it.": "החיבור הנוכחי עשוי ללכת לאיבוד אם אתה מתחבר כרגע באמצעות מנהרת CloudFlare.האם אתה בטוח רוצה לעצור את זה?הקלד את הסיסמה הנוכחית שלך כדי לאשר אותה.",
-    "HTTP Headers": "כותרות HTTP",
-    "Trust Proxy": "אמון בפרוקסי",
-    "Other Software": "תוכנה אחרת",
-    "For example: nginx, Apache and Traefik.": "למשל: Nginx, Apache ו- Traefik.",
-    "Please read": "בבקשה תקרא",
-    "Subject:": "נושא:",
-    "Valid To:": "תקף ל:",
-    "Days Remaining:": "ימים שנותרו:",
-    "Issuer:": "המנפיק:",
-    "Fingerprint:": "טביעת אצבע:",
-    "No status pages": "אין דפי סטטוס",
-    "Domain Name Expiry Notification": "הודעה על תום שם תחום",
-    Proxy: "פרוקסי",
-    "Date Created": "תאריך יצירה",
-    HomeAssistant: "Home Assistant",
-    onebotHttpAddress: "כתובת HTTP של OneBot ",
-    onebotMessageType: "סוג ההודעה OneBot",
-    onebotGroupMessage: "קְבוּצָה",
-    onebotPrivateMessage: "פְּרָטִי",
-    onebotUserOrGroupId: "מזהה קבוצה/משתמש ",
-    onebotSafetyTips: "לבטיחות, חייב לקבוע אסימון גישה ",
-    "PushDeer Key": "PushDeer Key",
-    "Footer Text": "טקסט כותרת תחתונה ",
-    "Show Powered By": "הצג מופעל על ידי ",
-    "Domain Names": "שמות דומיין ",
-    signedInDisp: "חתום כ- {0} ",
-    signedInDispDisabled: "Auth מושבת.",
-    RadiusSecret: "רדיוס סוד",
-    RadiusSecretDescription: "סוד משותף בין לקוח לשרת",
-    RadiusCalledStationId: "נקרא מזהה תחנה",
-    RadiusCalledStationIdDescription: "מזהה של המכשיר הנקרא ",
-    RadiusCallingStationId: "מזהה תחנת שיחה ",
-    RadiusCallingStationIdDescription: "מזהה של מכשיר השיחה ",
-    "Certificate Expiry Notification": "הודעת תפוגה של אישור",
-    "API Username": "שם משתמש API",
-    "API Key": "מפתח API",
-    "Recipient Number": "מספר הנמען",
-    "From Name/Number": "משם/מספר",
-    "Leave blank to use a shared sender number.": "השאר ריק כדי להשתמש במספר שולח משותף.",
-    "Octopush API Version": "גרסת API של תמנון",
-    "Legacy Octopush-DM": "Legacy Octopush-DM",
-    endpoint: "נקודת קצה",
-    octopushAPIKey: "\"מפתח API \" מתוך תעודות API של HTTP בלוח הבקרה",
-    octopushLogin: "\"כניסה \" מתעודות API של HTTP בלוח הבקרה",
-    promosmsLogin: "שם כניסה של API",
-    promosmsPassword: "סיסמת API",
-    "pushoversounds pushover": "Pushover (ברירת מחדל)",
-    "pushoversounds bike": "אופניים",
-    "pushoversounds bugle": "חֲצוֹצְרָה",
-    "pushoversounds cashregister": "קופה רושמת",
-    "pushoversounds classical": "קלַאסִי",
-    "pushoversounds cosmic": "קוֹסמִי",
-    "pushoversounds falling": "נופל",
-    "pushoversounds gamelan": "gamelan",
-    "pushoversounds incoming": "נִכנָס",
-    "pushoversounds intermission": "Intermission",
-    "pushoversounds magic": "קֶסֶם",
-    "pushoversounds mechanical": "מֵכָנִי",
-    "pushoversounds pianobar": "בר פסנתר",
-    "pushoversounds siren": "סִירֶנָה",
-    "pushoversounds spacealarm": "אזעקת חלל",
-    "pushoversounds tugboat": "סירת משיכה",
-    "pushoversounds alien": "אזעקת חייזרים (ארוכה)",
-    "pushoversounds climb": "לטפס (ארוך)",
-    "pushoversounds persistent": "מתמיד (ארוך)",
-    "pushoversounds echo": "הד Pushover (ארוך)",
-    "pushoversounds updown": "למעלה (ארוך)",
-    "pushoversounds vibrate": "לרטוט בלבד",
-    "pushoversounds none": "אף אחד (שקט)",
-    pushyAPIKey: "מפתח API סודי",
-    pushyToken: "אסימון מכשיר",
-    "Show update if available": "הצג עדכון אם זמין",
-    "Also check beta release": "בדוק גם את שחרור הבטא",
-    "Using a Reverse Proxy?": "באמצעות פרוקסי הפוך?",
-    "Check how to config it for WebSocket": "בדוק כיצד להגדיר אותו ל- WebSocket",
-    "Steam Game Server": "שרת משחק קיטור",
-    "Most likely causes:": "ככל הנראה גורם:",
-    "The resource is no longer available.": "המשאב כבר לא זמין.",
-    "There might be a typing error in the address.": "יתכן שיש שגיאת הקלדה בכתובת.",
-    "What you can try:": "מה שאתה יכול לנסות:",
-    "Retype the address.": "הקלד מחדש את הכתובת.",
-    "Go back to the previous page.": "חזור לדף הקודם.",
-    "Coming Soon": "בקרוב",
-    wayToGetClickSendSMSToken: "אתה יכול לקבל שם משתמש API ומפתח API מ- {0}.",
-    "Connection String": "מחרוזת חיבור",
-    Query: "שאילתא",
-    settingsCertificateExpiry: "תפוגת תעודת TLS",
-    certificationExpiryDescription: "HTTPS עוקב אחר התראה על התראה כאשר תעודת TLS פגה ב:",
-    "Setup Docker Host": "הגדרת מארח Docker",
-    "Connection Type": "סוג חיבור",
-    "Docker Daemon": "Docker Daemon",
-    deleteDockerHostMsg: "האם אתה בטוח רוצה למחוק את המארח של Docker לכל המוניטורים?",
-    socket: "Socket",
-    tcp: "TCP / HTTP",
-    "Docker Container": "מיכל Docker",
-    "Container Name / ID": "שם מכולה / מזהה",
-    "Docker Host": "מארח דוקר",
-    "Docker Hosts": "מארחי Docker",
-    "ntfy Topic": "ntfy Topic",
-    Domain: "תְחוּם",
-    Workstation: "עמדת עבודה",
-    disableCloudflaredNoAuthMsg: "אתה לא נמצא במצב AUTH, אין צורך בסיסמה.",
-    trustProxyDescription: "סמוך על כותרות 'x-forwarded-*'.אם אתה רוצה להשיג את ה- IP של הלקוח הנכון וה- Uptime Kuma שלך מאחור כמו Nginx או Apache, עליך לאפשר זאת.",
-    wayToGetLineNotifyToken: "אתה יכול לקבל אסימון גישה מ- {0}",
-    Examples: "דוגמאות",
-    "Home Assistant URL": "כתובת URL עוזרת ביתית",
-    "Long-Lived Access Token": "אסימון גישה ארוכת שנים",
-    "Long-Lived Access Token can be created by clicking on your profile name (bottom left) and scrolling to the bottom then click Create Token. ": "ניתן ליצור אסימון גישה לאורך זמן על ידי לחיצה על שם הפרופיל שלך (שמאל למטה) וגלילה לתחתית ואז לחץ על צור אסימון. ",
-    "Notification Service": "Notification Service",
-    "default: notify all devices": "default: notify all devices",
-    "A list of Notification Services can be found in Home Assistant under \"Developer Tools > Services\" search for \"notification\" to find your device/phone name.": "רשימה של שירותי הודעה ניתן למצוא בעוזר הבית תחת \"כלי מפתחים> שירותים \" חפש \"הודעה \" כדי למצוא את שם המכשיר/טלפון שלך.",
-    "Automations can optionally be triggered in Home Assistant:": "אוטומציות יכולות להיות מופעלות באופן אופציונלי לעוזר הבית:",
-    "Trigger type:": "סוג ההדק:",
-    "Event type:": "סוג אירוע:",
-    "Event data:": "נתוני אירועים:",
-    "Then choose an action, for example switch the scene to where an RGB light is red.": "ואז בחר פעולה, למשל העבר את הסצינה למקום בו אור RGB הוא אדום.",
-    "Frontend Version": "גרסת Frontend",
-    "Frontend Version do not match backend version!": "גרסת Frontend לא תואמת את גרסת Backend!",
-    "Base URL": "Base URL",
-    goAlertInfo: "SAETRERT הוא יישום קוד פתוח לתזמון שיחה, הסלמות והודעות אוטומטיות (כמו SMS או שיחות קוליות).לעסוק אוטומטית את האדם הנכון, בדרך הנכונה ובזמן הנכון!{0}",
-    goAlertIntegrationKeyInfo: "קבל מפתח אינטגרציה של API גנרי לשירות בפורמט זה \"AAAAAAAA-BBB-CCCC-DDDD-EEEEEEEEEEE \" בדרך כלל הערך של פרמטר האסימון של URL שהועתק.",
-    goAlert: "GoAlert",
-    backupOutdatedWarning: "מיושם: מכיוון שהרבה תכונות שנוספו ותכונת הגיבוי הזו מעט לא מצומצמת, היא לא יכולה לייצר או לשחזר גיבוי שלם.",
-    backupRecommend: "אנא גבה את עוצמת הקול או את תיקיית הנתונים (./data/) ישירות במקום.",
-    Optional: "אופציונאלי",
-    squadcast: "Squadcast",
-    SendKey: "SendKey",
-    "SMSManager API Docs": "מסמכי API של SmsManager ",
-    "Gateway Type": "סוג שער",
-    SMSManager: "SMSManager",
-    "You can divide numbers with": "אתה יכול לחלק מספרים עם",
-    or: "אוֹ",
-    recurringInterval: "הפסקה",
-    Recurring: "מחזורי",
-    strategyManual: "פעיל/לא פעיל באופן ידני",
-    warningTimezone: "זה משתמש באזור הזמן של השרת",
-    weekdayShortMon: "שני",
-    weekdayShortTue: "שלישי",
-    weekdayShortWed: "רביעי",
-    weekdayShortThu: "חמישי",
-    weekdayShortFri: "שישי",
-    weekdayShortSat: "שבת",
-    weekdayShortSun: "ראשון",
-    dayOfWeek: "יום בשבוע",
-    dayOfMonth: "יום בחודש",
-    lastDay: "Last Day",
-    lastDay1: "היום האחרון של החודש",
-    lastDay2: "יום שני האחרון של החודש",
-    lastDay3: "יום 3 האחרון של החודש",
-    lastDay4: "היום הרביעי האחרון בחודש",
-    "No Maintenance": "אין תחזוקה",
-    pauseMaintenanceMsg: "האם אתה בטוח רוצה להשהות?",
-    "maintenanceStatus-under-maintenance": "מתבצעות עבודות תחזוקה",
-    "maintenanceStatus-inactive": "לא פעיל",
-    "maintenanceStatus-scheduled": "מתוזמן",
-    "maintenanceStatus-ended": "הסתיים",
-    "maintenanceStatus-unknown": "לא ידוע",
-    "Display Timezone": "הצג אזור זמן",
-    "Server Timezone": "אזור זמן של שרת",
-    statusPageMaintenanceEndDate: "סוך",
-    IconUrl: "קישור לתמונת אייקון",
-    "Enable DNS Cache": "הפעל מטמון DNS",
-    Enable: "הפעל",
-    Disable: "השבת",
-    dnsCacheDescription: "ייתכן שהוא לא עובד בסביבות IPv6 מסוימות, השבת אותו אם אתה נתקל בבעיות כלשהן.",
-    "Single Maintenance Window": "חלון תחזוקה בודד",
-    "Maintenance Time Window of a Day": "חלון זמן תחזוקה ביום",
-    "Effective Date Range": "טווח תאריכים אפקטיבי",
-    "Schedule Maintenance": "לוח זמנים לתחזוקה",
-    "Date and Time": "תאריך ושעה",
-    "DateTime Range": "טווח תאריכים וזמן",
-    Strategy: "אסטרטגיה",
-    "Free Mobile User Identifier": "מזהה משתמש נייד בחינם",
-    "Free Mobile API Key": "מפתח API חינם לנייד",
-    "Enable TLS": "אפשר TLS",
-    "Proto Service Name": "שם שירות פרוטו",
-    "Proto Method": "שיטת פרוטו",
-    "Proto Content": "תוכן פרוטו",
-    Economy: "חיסכון",
-    Lowcost: "זול",
-    high: "גבוהה",
-    "General Monitor Type": "מוניטור כללי",
-    "Passive Monitor Type": "מוניטור פסיבי",
-    "Specific Monitor Type": "סוג מוניטור ספציפי",
-};
diff --git a/src/languages/hr-HR.js b/src/languages/hr-HR.js
deleted file mode 100644
index 0c73e1d93..000000000
--- a/src/languages/hr-HR.js
+++ /dev/null
@@ -1,581 +0,0 @@
-export default {
-    languageName: "Hrvatski",
-    checkEverySecond: "Provjera svake {0} sekunde",
-    retryCheckEverySecond: "Ponovni pokušaj svake {0} sekunde",
-    retriesDescription: "Broj ponovnih pokušaja prije nego će se servis označiti kao nedostupan te poslati obavijest",
-    ignoreTLSError: "Ignoriraj TLS/SSL pogreške za HTTPS web stranice",
-    upsideDownModeDescription: "Preokreni logiku statusa. Ako se primi pozitivan odgovor, smatra se da je usluga nedostupna.",
-    maxRedirectDescription: "Maksimalan broj preusmjeravanja. Postaviti na 0 kako bi se preusmjeravanja onemogućila.",
-    acceptedStatusCodesDescription: "Odaberite statusne kodove koji se smatraju uspješnim odgovorom.",
-    passwordNotMatchMsg: "Lozinke se ne poklapaju.",
-    notificationDescription: "Obavijesti će funkcionirati samo ako su dodijeljene monitoru.",
-    keywordDescription: "Ključna riječ za pretragu, u obliku običnog HTML-a ili u JSON formatu. Pretraga je osjetljiva na velika i mala slova.",
-    deleteMonitorMsg: "Jeste li sigurni da želite izbrisati monitor?",
-    deleteNotificationMsg: "Jeste li sigurni da želite izbrisati ovu obavijest za sve monitore?",
-    resolverserverDescription: "Cloudflare je zadani DNS poslužitelj. Možete to promijeniti u bilo kojem trenutku.",
-    rrtypeDescription: "Odaberite vrstu DNS zapisa o resursu kojeg želite pratiti",
-    pauseMonitorMsg: "Jeste li sigurni da želite pauzirati?",
-    enableDefaultNotificationDescription: "Ova će obavijesti biti omogućena za sve nove monitore. Možete ju ručno onemogućiti za pojedini monitor.",
-    clearEventsMsg: "Jeste li sigurni da želite izbrisati sve zapise o događajima za ovaj monitor?",
-    clearHeartbeatsMsg: "Jeste li sigurni da želite izbrisati sve zapise o provjerama za ovaj monitor?",
-    confirmClearStatisticsMsg: "Jeste li sigurni da želite izbrisati SVE statistike?",
-    importHandleDescription: "Odaberite opciju \"Preskoči postojeće\" ako želite preskočiti uvoz postojećih monitora i obavijesti ako dođe do poklapanja u imenu. Opcija \"Prepiši\" će izbrisati postojeće monitore i obavijesti.",
-    confirmImportMsg: "Jeste li sigurni da želite pokrenuti uvoz? Provjerite jeste li odabrali ispravnu opciju uvoza.",
-    twoFAVerifyLabel: "Unesite svoj 2FA token:",
-    tokenValidSettingsMsg: "Token je važeći! Sada možete spremiti postavke dvofaktorske autentikacije.",
-    confirmEnableTwoFAMsg: "Želite li omogućiti dvofaktorsku autentikaciju?",
-    confirmDisableTwoFAMsg: "Jeste li sigurni da želite onemogućiti dvofaktorsku autentikaciju?",
-    Settings: "Postavke",
-    Dashboard: "Kontrolna ploča",
-    "New Update": "Novo ažuriranje",
-    Language: "Jezik",
-    Appearance: "Izgled",
-    Theme: "Tema",
-    General: "Općenito",
-    "Primary Base URL": "Osnovni URL",
-    Version: "Inačica",
-    "Check Update On GitHub": "Provjeri dostupnost nove inačice na GitHubu",
-    List: "Popis",
-    Add: "Dodaj",
-    "Add New Monitor": "Dodaj novi Monitor",
-    "Quick Stats": "Statistika",
-    Up: "Dostupno",
-    Down: "Nedostupno",
-    Pending: "U tijeku",
-    Unknown: "Nepoznato",
-    pauseDashboardHome: "Pauzirano",
-    Name: "Naziv",
-    Status: "Status",
-    DateTime: "Vremenska oznaka",
-    Message: "Izvještaj",
-    "No important events": "Nema važnih događaja",
-    Pause: "Pauziraj",
-    Resume: "Nastavi",
-    Edit: "Uredi",
-    Delete: "Obriši",
-    Current: "Trenutno",
-    Uptime: "Dostupnost",
-    "Cert Exp.": "Istek cert.",
-    day: "dan | dana",
-    "-day": "-dnevno",
-    hour: "sat",
-    "-hour": "-satno",
-    Response: "Odgovor",
-    Ping: "Odziv",
-    "Monitor Type": "Vrsta Monitora",
-    Keyword: "Ključna riječ",
-    "Friendly Name": "Prilagođen naziv",
-    URL: "URL",
-    Hostname: "Domaćin",
-    Port: "Port",
-    "Heartbeat Interval": "Interval provjere",
-    Retries: "Broj ponovnih pokušaja",
-    "Heartbeat Retry Interval": "Interval ponovnih pokušaja",
-    Advanced: "Napredne postavke",
-    "Upside Down Mode": "Obrnuti način",
-    "Max. Redirects": "Maksimalan broj preusmjeravanja",
-    "Accepted Status Codes": "Prihvaćeni statusni kodovi",
-    "Push URL": "Push URL",
-    needPushEvery: "Potrebno je slati zahtjeve na URL svakih {0} sekundi.",
-    pushOptionalParams: "Neobavezni parametri: {0}",
-    Save: "Spremi",
-    Notifications: "Obavijesti",
-    "Not available, please setup.": "Nije dostupno, potrebno je dodati novu stavku.",
-    "Setup Notification": "Dodaj obavijest",
-    Light: "Svijetli način",
-    Dark: "Tamni način",
-    Auto: "Automatski",
-    "Theme - Heartbeat Bar": "Tema za traku dostupnosti",
-    Normal: "Normalno",
-    Bottom: "Ispod",
-    None: "Isključeno",
-    Timezone: "Vremenska zona",
-    "Search Engine Visibility": "Vidljivost tražilicama",
-    "Allow indexing": "Dopusti indeksiranje",
-    "Discourage search engines from indexing site": "Sprječavanje indeksiranja",
-    "Change Password": "Promjena lozinke",
-    "Current Password": "Trenutna lozinka",
-    "New Password": "Nova lozinka",
-    "Repeat New Password": "Potvrdite novu lozinku",
-    "Update Password": "Spremi novu lozinku",
-    "Disable Auth": "Onemogući autentikaciju",
-    "Enable Auth": "Omogući autentikaciju",
-    "disableauth.message1": "Jeste li sigurni da želite <strong>isključiti autentikaciju</strong>?",
-    "disableauth.message2": "To je za <strong>korisnike koji imaju vanjsku autentikaciju stranice</strong> ispred Uptime Kume, poput usluge Cloudflare Access.",
-    "Please use this option carefully!": "Pažljivo koristite ovu opciju.",
-    Logout: "Odjava",
-    Leave: "Poništi",
-    "I understand, please disable": "Razumijem, svejedno onemogući",
-    Confirm: "Potvrda",
-    Yes: "Da",
-    No: "Ne",
-    Username: "Korisničko ime",
-    Password: "Lozinka",
-    "Remember me": "Zapamti me",
-    Login: "Prijava",
-    "No Monitors, please": "Nema monitora, ",
-    "add one": "dodaj jedan",
-    "Notification Type": "Tip obavijesti",
-    Email: "E-pošta",
-    Test: "Testiraj",
-    "Certificate Info": "Informacije o certifikatu",
-    "Resolver Server": "DNS poslužitelj",
-    "Resource Record Type": "Vrsta DNS zapisa",
-    "Last Result": "Posljednji rezultat",
-    "Create your admin account": "Stvori administratorski račun",
-    "Repeat Password": "Potvrda lozinke",
-    "Import Backup": "Uvoz sigurnosne kopije",
-    "Export Backup": "Izvoz sigurnosne kopije",
-    Export: "Izvoz",
-    Import: "Uvoz",
-    respTime: "Vrijeme odgovora (ms)",
-    notAvailableShort: "ne postoji",
-    "Default enabled": "Omogući za nove monitore",
-    "Apply on all existing monitors": "Primijeni na postojeće monitore",
-    Create: "Kreiraj",
-    "Clear Data": "Obriši podatke",
-    Events: "Događaji",
-    Heartbeats: "Provjere",
-    "Auto Get": "Automatski dohvat",
-    backupDescription: "Moguće je napraviti sigurnosnu kopiju svih monitora i obavijesti koja će biti spremljena kao JSON datoteka.",
-    backupDescription2: "Napomena: povijest i podaci o događajima nisu uključeni u sigurnosnu kopiju.",
-    backupDescription3: "Osjetljivi podaci poput tokena za obavijesti uključeni su u sigurnosnu kopiju. Zato je potrebno čuvati izvoz na sigurnom mjestu.",
-    alertNoFile: "Datoteka za uvoz nije odabrana.",
-    alertWrongFileType: "Datoteka za uvoz nije u JSON formatu.",
-    "Clear all statistics": "Obriši sve statistike",
-    "Skip existing": "Preskoči postojeće",
-    Overwrite: "Prepiši",
-    Options: "Opcije",
-    "Keep both": "Zadrži sve",
-    "Verify Token": "Provjeri Token",
-    "Setup 2FA": "Postavi dvofaktorsku autentikaciju",
-    "Enable 2FA": "Omogući dvofaktorsku autentikaciju",
-    "Disable 2FA": "Onemogući dvofaktorsku autentikaciju",
-    "2FA Settings": "Postavke 2FA",
-    "Two Factor Authentication": "Dvofaktorska autentikacija",
-    Active: "Aktivna",
-    Inactive: "Neaktivno",
-    Token: "Token",
-    "Show URI": "Pokaži URI",
-    Tags: "Oznake",
-    "Add New below or Select...": "Dodajte novu oznaku ispod ili odaberite...",
-    "Tag with this name already exist.": "Oznaka s tim nazivom već postoji",
-    "Tag with this value already exist.": "Oznaka s tom vrijednošću već postoji.",
-    color: "Boja",
-    "value (optional)": "Vrijednost (neobavezno)",
-    Gray: "Siva",
-    Red: "Crvena",
-    Orange: "Narančasta",
-    Green: "Zelena",
-    Blue: "Plava",
-    Indigo: "Indigo",
-    Purple: "Ljubičasta",
-    Pink: "Ružičasta",
-    "Search...": "Pretraga...",
-    "Avg. Ping": "Prosječni odziv",
-    "Avg. Response": "Prosječni odgovor",
-    "Entry Page": "Početna stranica",
-    statusPageNothing: "Ovdje nema ničega, dodajte grupu ili monitor.",
-    "No Services": "Nema usluga",
-    "All Systems Operational": "Svi sustavi su operativni",
-    "Partially Degraded Service": "Usluga djelomično nedostupna",
-    "Degraded Service": "Usluga nedostupna",
-    "Add Group": "Dodaj grupu",
-    "Add a monitor": "Dodaj monitor",
-    "Edit Status Page": "Uredi Statusnu stranicu",
-    "Go to Dashboard": "Na Kontrolnu ploču",
-    "Status Page": "Statusna stranica",
-    "Status Pages": "Statusne stranice",
-    defaultNotificationName: "Moja {number}. {notification} obavijest",
-    here: "ovdje",
-    Required: "Potrebno",
-    telegram: "Telegram",
-    "Bot Token": "Token bota",
-    wayToGetTelegramToken: "Token možete nabaviti preko {0}.",
-    "Chat ID": "ID razgovora",
-    supportTelegramChatID: "Podržani su ID-jevi izravnih razgovora, grupa i kanala",
-    wayToGetTelegramChatID: "ID razgovora možete saznati tako da botu pošaljete poruku te odete na ovaj URL:",
-    "YOUR BOT TOKEN HERE": "OVDJE IDE TOKEN BOTA",
-    chatIDNotFound: "ID razgovora nije pronađen; prvo morate poslati poruku botu",
-    webhook: "Webhook",
-    "Post URL": "URL Post zahtjeva",
-    "Content Type": "Tip sadržaja (Content Type)",
-    webhookJsonDesc: "{0} je dobra opcija za moderne HTTP poslužitelje poput Express.js-a",
-    webhookFormDataDesc: "{multipart} je moguća alternativa za PHP, samo je potrebno parsirati JSON koristeći {decodeFunction}",
-    smtp: "E-mail (SMTP)",
-    secureOptionNone: "Bez sigurnosti / STARTTLS (25, 587)",
-    secureOptionTLS: "TLS (465)",
-    "Ignore TLS Error": "Ignoriraj greške TLS-a",
-    "From Email": "Adresa za \"From\" polje",
-    emailCustomSubject: "Prilagođeno \"Subject\" polje",
-    "To Email": "Odredišne adrese e-pošte",
-    smtpCC: "Cc",
-    smtpBCC: "Bcc",
-    discord: "Discord",
-    "Discord Webhook URL": "URL Discord webhooka",
-    wayToGetDiscordURL: "Ovo možete dobiti tako da odete na Postavke servera -> Integracije -> Napravi webhook",
-    "Bot Display Name": "Nadimak Bota unutar servera",
-    "Prefix Custom Message": "Prefiks prilagođene poruke",
-    "Hello @everyone is...": "Pozdrav {'@'}everyone...",
-    teams: "Microsoft Teams",
-    "Webhook URL": "URL webhooka",
-    wayToGetTeamsURL: "Više informacija o Teams webhookovima možete pročitati {0}.",
-    signal: "Signal",
-    Number: "Broj",
-    Recipients: "Primatelji",
-    needSignalAPI: "Potreban je klijent s REST sučeljem.",
-    wayToCheckSignalURL: "Više informacija o postavljanju Signal klijenta:",
-    signalImportant: "VAŽNO: Grupe i brojevi se ne mogu istovremeno koristiti kao primatelji!",
-    gotify: "Gotify",
-    "Application Token": "Token Aplikacije",
-    "Server URL": "URL poslužitelja",
-    Priority: "Prioritet",
-    slack: "Slack",
-    "Icon Emoji": "Emotikon",
-    "Channel Name": "Naziv kanala",
-    "Uptime Kuma URL": "Uptime Kuma URL",
-    aboutWebhooks: "Dodatne informacije o webhookovima su dostupne na: {0}",
-    aboutChannelName: "Unesite ime {0} kanala u polju Naziv kanala ako želite zaobići webhook kanal. Primjerice: #neki-kanal",
-    aboutKumaURL: "Ako je polje \"Uptime Kuma URL\" prazno, koristi se zadana vrijednost koja vodi na GitHub stranicu projekta.",
-    emojiCheatSheet: "Popis emotikona: {0}",
-    "rocket.chat": "Rocket.Chat",
-    pushover: "Pushover",
-    pushy: "Pushy",
-    octopush: "Octopush",
-    promosms: "PromoSMS",
-    clicksendsms: "ClickSend SMS",
-    lunasea: "LunaSea",
-    apprise: "Apprise (Podržava preko 50 usluga za obavijesti)",
-    pushbullet: "Pushbullet",
-    line: "LINE",
-    mattermost: "Mattermost",
-    "User Key": "Korisnički ključ",
-    Device: "Uređaji",
-    "Message Title": "Naslov poruke",
-    "Notification Sound": "Zvuk obavijesti",
-    "More info on:": "Više informacija na: {0}",
-    pushoverDesc1: "Hitni prioritet (2) ima zadani istek vremena od 30 sekundi između ponovnih pokušaja te će isteći nakon 1 sata.",
-    pushoverDesc2: "Ako želite slati obavijesti na više uređaja, ispunite polje \"Uređaji\".",
-    "SMS Type": "Tip SMS-a",
-    octopushTypePremium: "Premium (Brzo - preporučeno za obavijesti)",
-    octopushTypeLowCost: "Low Cost (Sporo - mobilni operateri ponekad blokiraju ove poruke)",
-    checkPrice: "Provjerite {0} cijene:",
-    apiCredentials: "Vjerodajnice za API",
-    octopushLegacyHint: "Koristite li staru inačicu usluge Octopush (2011-2020) ili noviju inačicu?",
-    "Check octopush prices": "Provjerite cijene usluge Octopush {0}.",
-    octopushPhoneNumber: "Telefonski broj (međunarodni format, primjerice: +38512345678) ",
-    octopushSMSSender: "Naziv SMS pošiljatelja : 3-11 alfanumeričkih znakova i razmak (a-zA-Z0-9)",
-    "LunaSea Device ID": "LunaSea ID Uređaja",
-    "Apprise URL": "URL usluge Apprise",
-    "Example:": "Primjerice: {0}",
-    "Read more:": "Pročitajte više: {0}",
-    "Status:": "Status: {0}",
-    "Read more": "Pročitaj više",
-    appriseInstalled: "Apprise je instaliran.",
-    appriseNotInstalled: "Apprise nije instaliran. {0}",
-    "Access Token": "Pristupni token",
-    "Channel access token": "Token za pristup kanalu",
-    "Line Developers Console": "LINE razvojnoj konzoli",
-    lineDevConsoleTo: "LINE razvojna konzola - {0}",
-    "Basic Settings": "Osnovne Postavke",
-    "User ID": "Korisnički ID",
-    "Messaging API": "API za razmjenu poruka",
-    wayToGetLineChannelToken: "Prvo, pristupite {0}, kreirajte pružatelja usluga te kanal (API za razmjenu poruka), zatim možete dobiti token za pristup kanalu te korisnički ID za polja iznad.",
-    "Icon URL": "URL slike",
-    aboutIconURL: "Možete postaviti poveznicu na sliku u polju \"URL slike\" kako biste spriječili korištenje zadane slike. Ovo se polje neće koristiti ako je postavljeno polje \"Emotikon\".",
-    aboutMattermostChannelName: "Možete promijeniti kanal u kojeg webhook šalje tako da ispunite polje \"Naziv kanala\". Ta opcija mora biti omogućena unutar Mattermost postavki za webhook. Primjerice: #neki-kanal",
-    matrix: "Matrix",
-    promosmsTypeEco: "SMS ECO - jeftina, ali spora opcija koja je često preopterećena. Ograničeno samo na primatelje unutar Poljske.",
-    promosmsTypeFlash: "SMS FLASH - Poruka se automatski pojavljuje na uređaju primatelja. Ograničeno samo na primatelje unutar Poljske.",
-    promosmsTypeFull: "SMS FULL - Premium razina usluge, dozvoljava postavljanje naziva SMS pošiljatelja (Naziv mora biti registriran). Usluga pouzdana za obavijesti.",
-    promosmsTypeSpeed: "SMS SPEED - Usluga najvećeg prioriteta. Brza i pouzdana, ali skupa (otprilike dvostruko skuplja od cijene usluge SMS FULL).",
-    promosmsPhoneNumber: "Telefonski broj (za primatelje unutar Poljske nije potrebno navoditi pozivni broj države)",
-    promosmsSMSSender: "Naziv SMS pošiljatelja: Registriran naziv ili jedan od zadanih: InfoSMS, SMS Info, MaxSMS, INFO, SMS",
-    "Feishu WebHookUrl": "Feishu URL webhooka",
-    matrixHomeserverURL: "URL Matrix homeservera (uključujući http(s):// te port, ako je potrebno)",
-    "Internal Room Id": "Interni ID sobe",
-    matrixDesc1: "Interni ID sobe se može pronaći u naprednim postavkama sobe unutar Matrix klijenta. ID sobe nalikuje idućem zapisu: !QMdRCpUIfLwsfjxye6:home.server.",
-    matrixDesc2: "Preporučuje se stvaranje novog korisnika te suzdržavanje od korištenja pristupnog tokena vlastitog Matrix korisnika. Novog korisnika potrebno je dodati u sobe u kojima želite primati obavijesti. Pristupni token možete dobiti pokretanjem naredbe {0}",
-    Method: "Metoda",
-    Body: "Tijelo",
-    Headers: "Zaglavlja",
-    PushUrl: "Push URL",
-    HeadersInvalidFormat: "Zaglavlja nisu nije valjani JSON: ",
-    BodyInvalidFormat: "Tijelo zahtjeva nije valjani JSON: ",
-    "Monitor History": "Povijest monitora",
-    clearDataOlderThan: "Podaci o povijesti monitora čuvaju se {0} dana.",
-    PasswordsDoNotMatch: "Lozinke se ne poklapaju.",
-    records: "zapisa",
-    "One record": "Jedan zapis",
-    "Showing {from} to {to} of {count} records": "Prikaz zapisa {from}-{to} od sveukupno {count}",
-    steamApiKeyDescription: "Za praćenje Steam poslužitelja za igru, potrebno je imati Steam Web-API ključ. Možete registrirati vlastiti ključ ovdje: ",
-    "Current User": "Trenutni korisnik",
-    recent: "Nedavno",
-    Done: "Gotovo",
-    Info: "Informacije",
-    Security: "Sigurnost",
-    "Shrink Database": "Smanji bazu podataka",
-    "Pick a RR-Type...": "Odaberite vrstu DNS zapisa od navedenih...",
-    "Pick Accepted Status Codes...": "Odaberite HTTP statusne kodove koji će biti prihvaćeni...",
-    "Steam API Key": "Steam API ključ",
-    Default: "Zadano",
-    "HTTP Options": "HTTP Postavke",
-    "Create Incident": "Novi izvještaj o incidentu",
-    Title: "Naslov",
-    Content: "Sadržaj",
-    Style: "Stil",
-    info: "informacija",
-    warning: "upozorenje",
-    danger: "opasnost",
-    primary: "primarno",
-    light: "svijetlo",
-    dark: "tamno",
-    Post: "Objavi",
-    Created: "Stvoreno",
-    "Last Updated": "Uređeno",
-    "Please input title and content": "Naslov i sadržaj ne mogu biti prazni",
-    Unpin: "Ukloni",
-    "Switch to Light Theme": "Prebaci na svijetli način",
-    "Switch to Dark Theme": "Prebaci na tamni način",
-    "Show Tags": "Pokaži oznake",
-    "Hide Tags": "Sakrij oznake",
-    Description: "Opis",
-    "No monitors available.": "Nema dostupnih monitora.",
-    "Add one": "Stvori jednog",
-    "No Monitors": "Bez monitora",
-    "Untitled Group": "Bezimena grupa",
-    Services: "Usluge",
-    Discard: "Odbaci",
-    Cancel: "Otkaži",
-    "Powered by": "Pokreće",
-    Saved: "Spremljeno",
-    PushByTechulus: "Push by Techulus",
-    GoogleChat: "Google Chat (preko platforme Google Workspace)",
-    shrinkDatabaseDescription: "Pokreni VACUUM operaciju za SQLite. Ako je baza podataka kreirana nakon inačice 1.10.0, AUTO_VACUUM opcija već je uključena te ova akcija nije nužna.",
-    serwersms: "SerwerSMS.pl",
-    serwersmsAPIUser: "API korisničko ime (uključujući webapi_ prefiks)",
-    serwersmsAPIPassword: "API lozinka",
-    serwersmsPhoneNumber: "Broj telefona",
-    serwersmsSenderName: "Ime SMS pošiljatelja (registrirano preko korisničkog portala)",
-    stackfield: "Stackfield",
-    smtpDkimSettings: "DKIM postavke",
-    smtpDkimDesc: "Za više informacija, postoji Nodemailer DKIM {0}.",
-    documentation: "dokumentacija",
-    smtpDkimDomain: "Domena",
-    smtpDkimKeySelector: "Odabir ključa",
-    smtpDkimPrivateKey: "Privatni ključ",
-    smtpDkimHashAlgo: "Hash algoritam (neobavezno)",
-    smtpDkimheaderFieldNames: "Ključevi zaglavlja za potpis (neobavezno)",
-    smtpDkimskipFields: "Ključevi zaglavlja koji se neće potpisati (neobavezno)",
-    gorush: "Gorush",
-    alerta: "Alerta",
-    alertaApiEndpoint: "Krajnja točka API-ja (Endpoint)",
-    alertaEnvironment: "Okruženje (Environment)",
-    alertaApiKey: "API ključ",
-    alertaAlertState: "Stanje upozorenja",
-    alertaRecoverState: "Stanje oporavka",
-    deleteStatusPageMsg: "Sigurno želite obrisati ovu statusnu stranicu?",
-    resendEveryXTimes: "Ponovno pošalji svakih {0} puta",
-    resendDisabled: "Ponovno slanje je onemogućeno",
-    dnsPortDescription: "Port DNS poslužitelja. Zadana vrijednost je 53. Moguće je promijeniti ga u svakom trenutku.",
-    "Resend Notification if Down X times consequently": "Ponovno pošalji obavijest ako je usluga nedostupna više puta zaredom",
-    topic: "Tema",
-    topicExplanation: "MQTT tema koja će se monitorirati",
-    successMessage: "Poruka o uspjehu",
-    successMessageExplanation: "MQTT poruka koja se smatra uspješnom",
-    error: "greška",
-    critical: "kritično",
-    Customize: "Customize",
-    "Custom Footer": "Prilagođeno podnožje",
-    "Custom CSS": "Prilagođeni CSS",
-    wayToGetPagerDutyKey: "Ključ možete dobiti odlaskom na \"Service -> Service Directory -> (Odabrani servis) -> Integrations -> Add integration\". Ovdje pretražite za \"Events API V2\". Više informacija {0}",
-    "Integration Key": "Ključ integracije",
-    "Integration URL": "URL integracije",
-    "Auto resolve or acknowledged": "Automatsko razrješavanje i priznavanje",
-    "do nothing": "Ne radi ništa",
-    "auto acknowledged": "Automatsko priznavanje",
-    "auto resolve": "Automatsko razrješavanje",
-    Proxies: "Proxy poslužitelji",
-    default: "Zadano",
-    enabled: "Omogućeno",
-    setAsDefault: "Postavi kao zadano",
-    deleteProxyMsg: "Sigurno želite obrisati ovaj proxy za sve monitore?",
-    proxyDescription: "Proxy poslužitelji moraju biti dodijeljni monitoru kako bi funkcionirali.",
-    enableProxyDescription: "Onemogućeni proxy poslužitelj neće imati učinak na zahtjeve monitora. Možete privremeno onemogućiti proxy poslužitelja za sve monitore.",
-    setAsDefaultProxyDescription: "Ovaj proxy poslužitelj bit će odmah omogućen za nove monitore. I dalje ga možete onemogućiti za svaki monitor zasebno.",
-    "Certificate Chain": "Lanac certifikata",
-    Valid: "Važeći",
-    Invalid: "Nevažeći",
-    AccessKeyId: "AccessKey ID",
-    SecretAccessKey: "AccessKey tajni ključ",
-    PhoneNumbers: "Telefonski brojevi",
-    TemplateCode: "Predložak koda",
-    SignName: "Potpis",
-    "Sms template must contain parameters: ": "SMS predložak mora sadržavati parametre: ",
-    "Bark Endpoint": "Bark krajnja točka (endpoint)",
-    "Bark Group": "Bark grupa",
-    "Bark Sound": "Bark zvuk",
-    WebHookUrl: "WebHookUrl",
-    SecretKey: "Tajni ključ",
-    "For safety, must use secret key": "Korištenje tajnog ključa je obavezno",
-    "Device Token": "Token uređaja",
-    Platform: "Platforma",
-    iOS: "iOS",
-    Android: "Android",
-    Huawei: "Huawei",
-    High: "Visoko",
-    Retry: "Ponovnih pokušaja",
-    Topic: "Tema",
-    "WeCom Bot Key": "WeCom ključ Bota",
-    "Setup Proxy": "Dodaj proxy poslužitelj",
-    "Proxy Protocol": "Protokol",
-    "Proxy Server": "Proxy poslužitelj",
-    "Proxy server has authentication": "Proxy poslužitelj ima autentikaciju",
-    User: "Korisnik",
-    Installed: "Instalirano",
-    "Not installed": "Nije instalirano",
-    Running: "Pokrenuto",
-    "Not running": "Nije pokrenuto",
-    "Remove Token": "Ukloni Token",
-    Start: "Pokreni",
-    Stop: "Zaustavi",
-    "Uptime Kuma": "Uptime Kuma",
-    "Add New Status Page": "Dodaj novu statusnu stranicu",
-    Slug: "Slug",
-    "Accept characters:": "Dozvoljeni znakovi:",
-    startOrEndWithOnly: "Započinje ili završava znakovima {0}",
-    "No consecutive dashes": "Bez uzastopnih povlaka",
-    Next: "Sljedeće",
-    "The slug is already taken. Please choose another slug.": "Slug je zauzet. Odaberite novi slug.",
-    "No Proxy": "Bez proxy poslužitelja",
-    Authentication: "Autentikacija",
-    "HTTP Basic Auth": "HTTP Basic Auth",
-    "New Status Page": "Dodaj statusnu stranicu",
-    "Page Not Found": "Stranica nije pronađena",
-    "Reverse Proxy": "Reverzni proxy",
-    Backup: "Sigurnosno kopiranje",
-    About: "O Uptime Kumi",
-    wayToGetCloudflaredURL: "(Preuzmite cloudflared s {0})",
-    cloudflareWebsite: "Cloudflare web stranice",
-    "Message:": "Poruka:",
-    "Don't know how to get the token? Please read the guide:": "Ne znate kako doći do tokena? Pročitajte vodič:",
-    "The current connection may be lost if you are currently connecting via Cloudflare Tunnel. Are you sure want to stop it? Type your current password to confirm it.": "Trenutna veza možda bude prekinuta jer se koristi Cloudflare tuneliranje. Sigurno želite zaustaviti? Unesite lozinku za potvrdu.",
-    "HTTP Headers": "HTTP zaglavlja",
-    "Trust Proxy": "Vjeruj proxy poslužitelju",
-    "Other Software": "Ostali programi",
-    "For example: nginx, Apache and Traefik.": "Primjerice: nginx, Apache ili Traefik.",
-    "Please read": "Molimo pročitajte",
-    "Subject:": "Predmet:",
-    "Valid To:": "Valjano do:",
-    "Days Remaining:": "Preostalo dana:",
-    "Issuer:": "Izdavatelj:",
-    "Fingerprint:": "Fingerprint:",
-    "No status pages": "Nema statusnih stranica",
-    "Domain Name Expiry Notification": "Obavijest za istek domena",
-    Proxy: "Proxy",
-    "Date Created": "Datum stvaranja",
-    HomeAssistant: "Home Assistant",
-    onebotHttpAddress: "OneBot HTTP adresa",
-    onebotMessageType: "OneBot tip poruke",
-    onebotGroupMessage: "Grupna",
-    onebotPrivateMessage: "Privatna",
-    onebotUserOrGroupId: "ID korisnika/grupe",
-    onebotSafetyTips: "Pristupni token mora biti postavljen",
-    "PushDeer Key": "PushDeer ključ",
-    "Footer Text": "Tekst podnožja",
-    "Show Powered By": "Pokaži natpis 'Pokreće...'",
-    "Domain Names": "Domene",
-    signedInDisp: "Prijavljeni ste kao {0}",
-    signedInDispDisabled: "Autentikacija onemogućena.",
-    RadiusSecret: "Radius Tajna",
-    RadiusSecretDescription: "Dijeljena Tajna između klijenta i poslužitelja",
-    RadiusCalledStationId: "Called Station ID",
-    RadiusCalledStationIdDescription: "Identifikator pozivne stanice",
-    RadiusCallingStationId: "Calling Station ID",
-    RadiusCallingStationIdDescription: "Identifikator pozivajuće stanice",
-    "Certificate Expiry Notification": "Obavijest za istek certifikata",
-    "API Username": "API korisničko ime",
-    "API Key": "API ključ",
-    "Recipient Number": "Broj primatelja",
-    "From Name/Number": "Naziv/broj pošiljatelja",
-    "Leave blank to use a shared sender number.": "Ostaviti prazno za korištenje dijeljenog broja pošiljatelja.",
-    "Octopush API Version": "Octopush verzija API-ja",
-    "Legacy Octopush-DM": "Legacy Octopush-DM",
-    endpoint: "krajnja točka (endpoint)",
-    octopushAPIKey: "\"API ključ\" iz HTTP API postavki",
-    octopushLogin: "\"Korisničko ime\" iz HTTP API postavki",
-    promosmsLogin: "API korisničko ime",
-    promosmsPassword: "API lozinka",
-    "pushoversounds pushover": "Pushover (default)",
-    "pushoversounds bike": "Bike",
-    "pushoversounds bugle": "Bugle",
-    "pushoversounds cashregister": "Cash Register",
-    "pushoversounds classical": "Classical",
-    "pushoversounds cosmic": "Cosmic",
-    "pushoversounds falling": "Falling",
-    "pushoversounds gamelan": "Gamelan",
-    "pushoversounds incoming": "Incoming",
-    "pushoversounds intermission": "Intermission",
-    "pushoversounds magic": "Magic",
-    "pushoversounds mechanical": "Mechanical",
-    "pushoversounds pianobar": "Piano Bar",
-    "pushoversounds siren": "Siren",
-    "pushoversounds spacealarm": "Space Alarm",
-    "pushoversounds tugboat": "Tug Boat",
-    "pushoversounds alien": "Alien Alarm (long)",
-    "pushoversounds climb": "Climb (long)",
-    "pushoversounds persistent": "Persistent (long)",
-    "pushoversounds echo": "Pushover Echo (long)",
-    "pushoversounds updown": "Up Down (long)",
-    "pushoversounds vibrate": "Vibrate Only",
-    "pushoversounds none": "None (silent)",
-    pushyAPIKey: "Tajni API ključ",
-    pushyToken: "Token uređaja",
-    "Show update if available": "Pokaži moguću nadogradnju",
-    "Also check beta release": "Provjeravaj i za beta izdanja",
-    "Using a Reverse Proxy?": "Koristi li se reverzni proxy?",
-    "Check how to config it for WebSocket": "Provjerite kako se konfigurira za WebSocket protokol",
-    "Steam Game Server": "Steam poslužitelj igre",
-    "Most likely causes:": "Najvjerojatniji uzroci:",
-    "The resource is no longer available.": "Resurs više nije dostupan.",
-    "There might be a typing error in the address.": "Možda je nastala greška pri upisu adrese.",
-    "What you can try:": "Što možete pokušati:",
-    "Retype the address.": "Ponovno napišite adresu.",
-    "Go back to the previous page.": "Vratite se na prethodnu stranicu.",
-    "Coming Soon": "Dolazi uskoro",
-    wayToGetClickSendSMSToken: "Možete dobiti API korisničko ime i API ključ sa {0}.",
-    "Connection String": "Tekst veze",
-    Query: "Upit",
-    settingsCertificateExpiry: "TLS istek certifikata",
-    certificationExpiryDescription: "HTTPS monitori će obavijesiti kada je istek TLS certifikata za:",
-    "Setup Docker Host": "Dodaj Docker domaćina",
-    "Connection Type": "Tip veze",
-    "Docker Daemon": "Docker daemon",
-    deleteDockerHostMsg: "Sigurno želite izbrisati ovog Docker domaćina za sve monitore?",
-    socket: "Docker socket",
-    tcp: "TCP / HTTP",
-    "Docker Container": "Docker kontejner",
-    "Container Name / ID": "Naziv / ID kontejnera",
-    "Docker Host": "Docker domaćin",
-    "Docker Hosts": "Docker domaćini",
-    "ntfy Topic": "ntfy tema",
-    Domain: "Domena",
-    Workstation: "Radna stanica",
-    disableCloudflaredNoAuthMsg: "Lozinka nije nužna dok je isključena autentikacija.",
-    trustProxyDescription: "Vjeruj 'X-Forwarded-*' zaglavljima. Ako želite dobiti ispravnu IP adresu klijenta i Uptime Kuma je iza reverznog proxy poslužitelja, trebate omogućiti ovo.",
-    wayToGetLineNotifyToken: "Možete dobiti pristupni token sa {0}",
-    Examples: "Primjeri",
-    "Home Assistant URL": "URL Home Assistanta",
-    "Long-Lived Access Token": "Dugotrajni pristupni token",
-    "Long-Lived Access Token can be created by clicking on your profile name (bottom left) and scrolling to the bottom then click Create Token. ": "Dugotrajni pristupni token može se kreirati klikom na korisničko ime (dolje lijevo) u Home Assistantu, pomicanjem do dna, te klikom na 'Create Token'. ",
-    "Notification Service": "Notification Service",
-    "default: notify all devices": "zadano ponašanje: obavijesti sve uređaje",
-    "A list of Notification Services can be found in Home Assistant under \"Developer Tools > Services\" search for \"notification\" to find your device/phone name.": "Popis servisa za obavijesti u Home Assistantu nalaze se pod \"Developer Tools > Services\" te pretražiti \"notification\".",
-    "Automations can optionally be triggered in Home Assistant:": "Automacije se mogu okinuti u Home Assistantu:",
-    "Trigger type:": "Tip triggera:",
-    "Event type:": "Tip eventa:",
-    "Event data:": "Podaci eventa:",
-    "Then choose an action, for example switch the scene to where an RGB light is red.": "Potrebno je i odabrati akciju za izvođenje na Home Assistantu.",
-    "Frontend Version": "Inačica sučelja",
-    "Frontend Version do not match backend version!": "Inačica sučelja ne odgovara poslužitelju!",
-};
diff --git a/src/languages/hu.js b/src/languages/hu.js
deleted file mode 100644
index e6118c9e5..000000000
--- a/src/languages/hu.js
+++ /dev/null
@@ -1,376 +0,0 @@
-export default {
-    languageName: "Magyar",
-    checkEverySecond: "Ellenőrzés {0} másodpercenként",
-    retryCheckEverySecond: "Újrapróbál {0} másodpercenként.",
-    retriesDescription: "Maximális próbálkozás mielőtt a szolgáltatás 'Leállt' jelölést kap és értesítés kerül kiküldésre",
-    ignoreTLSError: "TLS/SSL hibák figyelmen kívül hagyása HTTPS weboldalaknál",
-    upsideDownModeDescription: "Az állapot megfordítása. Ha a szolgáltatás elérhető, akkor lesz leállt állapotú.",
-    maxRedirectDescription: "Az átirányítások maximális száma. állítsa 0-ra az átirányítás tiltásához.",
-    acceptedStatusCodesDescription: "Válassza ki az állapot kódokat amelyek sikeres válasznak fognak számítani.",
-    passwordNotMatchMsg: "A megismételt jelszó nem egyezik.",
-    notificationDescription: "Kérem, rendeljen egy értesítést a figyeléshez, hogy működjön.",
-    keywordDescription: "Kulcsszó keresése a HTML-ben vagy a JSON válaszban. (kis-nagybetű érzékeny)",
-    pauseDashboardHome: "Szünetel",
-    deleteMonitorMsg: "Biztos, hogy törölni akarja ezt a figyelőt?",
-    deleteNotificationMsg: "Biztos, hogy törölni akarja ezt az értesítést az összes figyelőnél?",
-    resolverserverDescription: "A Cloudflare az alapértelmezett szerver, bármikor meg tudja változtatni a resolver server-t.",
-    rrtypeDescription: "Válassza ki az RR-típust a figyelőhöz",
-    pauseMonitorMsg: "Biztos, hogy szüneteltetni akarja?",
-    enableDefaultNotificationDescription: "Minden új figyelőhöz ez az értesítés engedélyezett lesz alapértelmezetten. Kikapcsolhatja az értesítést külön minden figyelőnél.",
-    clearEventsMsg: "Biztos, hogy törölni akar miden eseményt ennél a figyelnél?",
-    clearHeartbeatsMsg: "Biztos, hogy törölni akar minden életjelet ennél a figyelőnél?",
-    confirmClearStatisticsMsg: "Biztos, hogy törölni akar MINDEN statisztikát?",
-    importHandleDescription: "Válassza a 'Meglévő kihagyását', ha ki szeretné hagyni az azonos nevő figyelőket vagy értesítésket. A 'Felülírás' törölni fog minden meglévő figyelőt és értesítést.",
-    confirmImportMsg: "Biztos, hogy importálja a mentést? Győződjön meg róla, hogy jól választotta ki az importálás opciót.",
-    twoFAVerifyLabel: "Kérem, adja meg a token-t, hogy a 2FA működését ellenőrizzük",
-    tokenValidSettingsMsg: "A token érvényes! El tudja menteni a 2FA beállításait.",
-    confirmEnableTwoFAMsg: "Biztosan engedélyezi a 2FA-t?",
-    confirmDisableTwoFAMsg: "Biztosan letiltja a 2FA-t?",
-    Settings: "Beállítások",
-    Dashboard: "Irányítópult",
-    "New Update": "Új frissítés",
-    Language: "Nyelv",
-    Appearance: "Megjelenés",
-    Theme: "Téma",
-    General: "Általános",
-    Version: "Verzió",
-    "Check Update On GitHub": "Frissítések keresése a GitHub-on",
-    List: "Lista",
-    Add: "Hozzáadás",
-    "Add New Monitor": "Új figyelő hozzáadása",
-    "Quick Stats": "Gyors statisztikák",
-    Up: "Működik",
-    Down: "Leállt",
-    Pending: "Függőben",
-    Unknown: "Ismeretlen",
-    Pause: "Szünet",
-    Name: "Név",
-    Status: "Állapot",
-    DateTime: "Időpont",
-    Message: "Üzenet",
-    "No important events": "Nincs fontos esemény",
-    Resume: "Folytatás",
-    Edit: "Szerkesztés",
-    Delete: "Törlés",
-    Current: "Aktuális",
-    Uptime: "Uptime",
-    "Cert Exp.": "SSL lejárat",
-    day: "nap",
-    "-day": " nap",
-    hour: "óra",
-    "-hour": " óra",
-    Response: "Válasz",
-    Ping: "Ping",
-    "Monitor Type": "Figyelő típusa",
-    Keyword: "Kulcsszó",
-    "Friendly Name": "Rövid név",
-    URL: "URL",
-    Hostname: "Hosztnév",
-    Port: "Port",
-    "Heartbeat Interval": "Életjel időköz",
-    Retries: "Újrapróbálkozás",
-    "Heartbeat Retry Interval": "Életjel újrapróbálkozások időköze",
-    Advanced: "Haladó",
-    "Upside Down Mode": "Fordított mód",
-    "Max. Redirects": "Max. átirányítás",
-    "Accepted Status Codes": "Elfogadott állapot kódok",
-    Save: "Mentés",
-    Notifications: "Értesítések",
-    "Not available, please setup.": "Nem elérhető, állítsa be.",
-    "Setup Notification": "Értesítés beállítása",
-    Light: "Világos",
-    Dark: "Sötét",
-    Auto: "Auto",
-    "Theme - Heartbeat Bar": "Téma - Életjel sáv",
-    Normal: "Normál",
-    Bottom: "Nyomógomb",
-    None: "Nincs",
-    Timezone: "Időzóna",
-    "Search Engine Visibility": "Látható a keresőmotoroknak",
-    "Allow indexing": "Indexelés engedélyezése",
-    "Discourage search engines from indexing site": "Keresőmotorok elriasztása az oldal indexelésétől",
-    "Change Password": "Jelszó változtatása",
-    "Current Password": "Jelenlegi jelszó",
-    "New Password": "Új jelszó",
-    "Repeat New Password": "Ismételje meg az új jelszót",
-    "Update Password": "Jelszó módosítása",
-    "Disable Auth": "Hitelesítés tiltása",
-    "Enable Auth": "Hitelesítés engedélyezése",
-    "disableauth.message1": "Biztos benne, hogy <strong>kikapcsolja a hitelesítést</strong>?",
-    "disableauth.message2": "Akkor érdemes, ha <strong>van 3rd-party hitelesítés</strong> az Uptime Kuma-t megelőzően mint a Cloudflare Access.",
-    "Please use this option carefully!": "Használja megfontoltan!",
-    Logout: "Kijelentkezés",
-    Leave: "Elhagy",
-    "I understand, please disable": "Megértettem, kérem tiltsa le",
-    Confirm: "Megerősítés",
-    Yes: "Igen",
-    No: "Nem",
-    Username: "Felhasználónév",
-    Password: "Jelszó",
-    "Remember me": "Emlékezzen rám",
-    Login: "Bejelentkezés",
-    "No Monitors, please": "Nincs figyelő, kérem",
-    "add one": "adjon hozzá egyet",
-    "Notification Type": "Értesítés típusa",
-    Email: "Email",
-    Test: "Teszt",
-    "Certificate Info": "Tanúsítvány információk",
-    "Resolver Server": "DNS szerver",
-    "Resource Record Type": "Resource Record típusa",
-    "Last Result": "Utolsó eredmény",
-    "Create your admin account": "Hozza létre az adminisztrátor felhasználót",
-    "Repeat Password": "Jelszó ismétlése",
-    "Import Backup": "Mentés importálása",
-    "Export Backup": "Mentés exportálása",
-    Export: "Exportálás",
-    Import: "Importálás",
-    respTime: "Válaszidő (ms)",
-    notAvailableShort: "N/A",
-    "Default enabled": "Alapértelmezetten engedélyezett",
-    "Apply on all existing monitors": "Alkalmazza az összes figyelőre",
-    Create: "Létrehozás",
-    "Clear Data": "Adatok törlése",
-    Events: "Események",
-    Heartbeats: "Életjelek",
-    "Auto Get": "Auto lekérd.",
-    backupDescription: "Mentheti az összes figyelőt és értesítést egy JSON fájlba.",
-    backupDescription2: "Megj: Történeti és esemény adatokat nem tartalmaz.",
-    backupDescription3: "Érzékeny adatok, pl. szolgáltatás kulcsok is vannak az export fájlban. Figyeljen erre!",
-    alertNoFile: "Válaszzon ki egy fájlt az importáláshoz.",
-    alertWrongFileType: "Válasszon egy JSON fájlt.",
-    "Clear all statistics": "Összes statisztika törlése",
-    "Skip existing": "Meglévő kihagyása",
-    Overwrite: "Felülírás",
-    Options: "Opciók",
-    "Keep both": "Mindegyiket tartsa meg",
-    "Verify Token": "Token ellenőrzése",
-    "Setup 2FA": "2FA beállítása",
-    "Enable 2FA": "2FA engedélyezése",
-    "Disable 2FA": "2FA tiltása",
-    "2FA Settings": "2FA beállítások",
-    "Two Factor Authentication": "Kétfaktoros hitelesítés",
-    Active: "Aktív",
-    Inactive: "Inaktív",
-    Token: "Token",
-    "Show URI": "URI megmutatása",
-    Tags: "Címkék",
-    "Add New below or Select...": "Adjon hozzá lentre vagy válasszon...",
-    "Tag with this name already exist.": "Ilyen nevű címke már létezik.",
-    "Tag with this value already exist.": "Ilyen értékű címke már létezik.",
-    color: "szín",
-    "value (optional)": "érték (opcionális)",
-    Gray: "Szürke",
-    Red: "Piros",
-    Orange: "Narancs",
-    Green: "Zöld",
-    Blue: "Kék",
-    Indigo: "Indigó",
-    Purple: "Lila",
-    Pink: "Rózsaszín",
-    "Search...": "Keres...",
-    "Avg. Ping": "Átl. ping",
-    "Avg. Response": "Átl. válasz",
-    "Entry Page": "Nyitólap",
-    statusPageNothing: "Semmi nincs itt. Adjon hozzá egy vagy több figyelőt.",
-    "No Services": "Nincs szolgáltatás",
-    "All Systems Operational": "Minden rendszer működik",
-    "Partially Degraded Service": "Részlegesen leállt szolgáltatás",
-    "Degraded Service": "Leállt szolgáltatás",
-    "Add Group": "Csoport hozzáadása",
-    "Add a monitor": "Figyelő hozzáadása",
-    "Edit Status Page": "Státusz oldal szerkesztése",
-    "Go to Dashboard": "Irányítópulthoz",
-    telegram: "Telegram",
-    webhook: "Webhook",
-    smtp: "Email (SMTP)",
-    discord: "Discord",
-    teams: "Microsoft Teams",
-    signal: "Signal",
-    gotify: "Gotify",
-    slack: "Slack",
-    "rocket.chat": "Rocket.chat",
-    pushover: "Pushover",
-    pushy: "Pushy",
-    octopush: "Octopush",
-    promosms: "PromoSMS",
-    lunasea: "LunaSea",
-    apprise: "Apprise (50+ értesítési szolgáltatás)",
-    pushbullet: "Pushbullet",
-    line: "Line Messenger",
-    mattermost: "Mattermost",
-    "Status Page": "Státusz oldal",
-    "Status Pages": "Státusz oldalak",
-    "Primary Base URL": "Elsődleges URL",
-    "Push URL": "Meghívandó URL",
-    needPushEvery: "Ezt az URL-t kell meghívni minden {0} másodpercben.",
-    pushOptionalParams: "Opcionális paraméterek: {0}",
-    defaultNotificationName: "{notification} értesítésem ({number})",
-    here: "itt",
-    Required: "Kötelező",
-    "Bot Token": "BOT token",
-    wayToGetTelegramToken: "Innen kaphat token-t: {0}.",
-    "Chat ID": "Csevegés ID",
-    supportTelegramChatID: "Támogatja a közvetlen csevegést, csoportnak küldést és csatona ID-t is",
-    wayToGetTelegramChatID: "A csevegés ID-t kinyerheti azzal, hogy küld egy üzenetet a bot-nak és erre az URL-re ellátogat, ahol láthatja a chat_id:-t",
-    "YOUR BOT TOKEN HERE": "AZ ÖN BOT TOKENJE ITT",
-    chatIDNotFound: "Csevegés ID nem található, küldjön egy első üzenetet a bot-nak",
-    "Post URL": "Cél URL (Post)",
-    "Content Type": "Tartalom típus (Content Type)",
-    webhookJsonDesc: "{0} ideális a moderh HTTP szerverekhez, mint az Express.js",
-    webhookFormDataDesc: "{multipart} ideális a PHP-hez. A JSON értelmezhető ezzel: {decodeFunction}",
-    secureOptionNone: "Nincs / STARTTLS (25, 587)",
-    secureOptionTLS: "TLS (465)",
-    "Ignore TLS Error": "TLS hiba figyelmen kívül hagyása",
-    "From Email": "Feladó email",
-    emailCustomSubject: "Egyedi tárgy",
-    "To Email": "Cél email",
-    smtpCC: "Másolat",
-    smtpBCC: "Titkos másolat",
-    "Discord Webhook URL": "Discord cím (webhook URL)",
-    wayToGetDiscordURL: "Kaphat egy ilyet, ha ellátogat a Server Settings -> Integrations -> Create Webhook oldalra",
-    "Bot Display Name": "Bot megjelenő neve",
-    "Prefix Custom Message": "Egyedi előtét üzenet",
-    "Hello @everyone is...": "Hello {'@'}mindenki...",
-    "Webhook URL": "Cím (webhook URL)",
-    wayToGetTeamsURL: "Itt megnézheti, hogy kell ilyen URL-t készíteni: {0}.",
-    Number: "Szám",
-    Recipients: "Címzettek",
-    needSignalAPI: "Egy Signal kliensre van szüksége, amihez REST API tartozik.",
-    wayToCheckSignalURL: "Itt megnézheti, hogy hozhat létre egyet:",
-    signalImportant: "FONTOS! Nem keverheti a csoportokat és számokat a címzetteknél.",
-    "Application Token": "Alkalmazás token",
-    "Server URL": "Szerver URL",
-    Priority: "Prioritás",
-    "Icon Emoji": "Emoji ikonok",
-    "Channel Name": "Csatorna neve",
-    "Uptime Kuma URL": "Uptime Kuma cím",
-    aboutWebhooks: "Webhook-okról több info: {0}",
-    aboutChannelName: "Adja meg a {0} csatorna nevét ha szeretné elkerülni a webhook-ot. Pl: #masik-csatorna",
-    aboutKumaURL: "Ha üresen hagyja a Uptime Kuma cím mezőt, akkor a projekt GitHub oldala lesz az alapértelmezett.",
-    emojiCheatSheet: "Emoji csalás: {0}",
-    clicksendsms: "ClickSend SMS",
-    "User Key": "Felhasználói kulcs",
-    Device: "Eszköz",
-    "Message Title": "Üzenet címe",
-    "Notification Sound": "Értesítési hang",
-    "More info on:": "További információ: {0}",
-    pushoverDesc1: "A vészhelyzeti prioritásnak (2) 30 másodperc az újrapróbálkozási alapértéke és egy óra után lejár.",
-    pushoverDesc2: "Ha különböző eszközökre szeretne értesítést küldeni, töltse ki az Eszköz mezőt.",
-    "SMS Type": "SMS típusa",
-    octopushTypePremium: "Premium (Fast - recommended for alerting)",
-    octopushTypeLowCost: "Low Cost (Slow - sometimes blocked by operator)",
-    checkPrice: "Nézze meg az {0} féle árat:",
-    apiCredentials: "API kulcsok",
-    octopushLegacyHint: "Az Octopush régi (2011-2020) verzióját használja vagy az újat?",
-    "Check octopush prices": "Nézze meg az Octopush {0} féle árát.",
-    octopushPhoneNumber: "Telefonszám (nemz. formátum, pl : +36705554433) ",
-    octopushSMSSender: "SMS küldő neve : 3-11 betű/szám (a-zA-Z0-9) vagy szóköz",
-    "LunaSea Device ID": "LunaSea eszköz ID",
-    "Apprise URL": "Apprise cím (URL)",
-    "Example:": "Például: {0}",
-    "Read more:": "Itt olvashat róla: {0}",
-    "Status:": "Állapot: {0}",
-    "Read more": "Tovább olvasom",
-    appriseInstalled: "Apprise telepítve.",
-    appriseNotInstalled: "Apprise nincs telepítve. {0}",
-    "Access Token": "Elérési token",
-    "Channel access token": "Csatorna elérési token",
-    "Line Developers Console": "Line Developers konzol",
-    lineDevConsoleTo: "Line Developers konzol - {0}",
-    "Basic Settings": "Alap beállítások",
-    "User ID": "Felhasználó ID",
-    "Messaging API": "Üzenet API",
-    wayToGetLineChannelToken: "{0} első eléréséhez készítsen egy Provider-t és csatornát (Messaging API), utána kaphatja meg a csatorna elérési token-t és felhasználó ID-t az alábbi menüpontban.",
-    "Icon URL": "Ikon cím (URL)",
-    aboutIconURL: "Megadhat egy webcímet az Ikon cím mezőben, ezzel felülírva az alapértelmezet képet. Nem kerül felhasználásra, ha az Emoji-k be vannak állítva.",
-    aboutMattermostChannelName: "Felülírhatja az alapértelmezett csatornát, ahova a webhook az adatokat küldi. Ehhez töltse ki a \"Csatorna neve\" mezőt (pl: #egyeb-csatorna). A Mattermost webhook beállításaiban további engedélyek szükségesek",
-    matrix: "Matrix",
-    promosmsTypeEco: "SMS ECO - olcsó, de lassú, gyakran túlterhelt. Csak lengyel címzettekhez.",
-    promosmsTypeFlash: "SMS FLASH - Az üzenet automatikusan megjelenik a fogadó eszközön. Csak lengyel címzettekhez.",
-    promosmsTypeFull: "SMS FULL - Prémium szintje az SMS-nek. Megadható a feladó neve, de előtte jóváhagyás szükséges. Ideális értesítésekhez.",
-    promosmsTypeSpeed: "SMS SPEED - A legmagasabb prioritás a rendszerben. Nagyon gyors és pontos, de költséges (kb. duplája a hagyományos SMS-nek).",
-    promosmsPhoneNumber: "Telefonszám (lengyel címzett esetén az országkód elhagyható)",
-    promosmsSMSSender: "SMS feladónév: Előre beállított név vagy az alábbiak egyike: InfoSMS, SMS Info, MaxSMS, INFO, SMS",
-    "Feishu WebHookUrl": "Feishu webhook cím (URL)",
-    matrixHomeserverURL: "Homeserver cím (URL http(s):// előtaggal és opcionálisan port-tal)",
-    "Internal Room Id": "Belső Szoba ID",
-    matrixDesc1: "A belső szoba ID-t a szpbák speciális beállítások között találja meg a Matrix kliens programban. Így kell kinéznie: !QMdRCpUIfLwsfjxye6:home.server.",
-    matrixDesc2: "Erősen ajánlott készíteni egy új felhasználót és nem a teljes joggal rendelkező felhasználót használni. Az új felhasználó létrehozása után csak azokba a szobákba kell megjhívni a felhasználót, ahol értesítéseket szeretne kapni. Ezzel a művelettel lehet elérési token-t kérni: {0}",
-    Method: "Metódus",
-    Body: "Törzs",
-    Headers: "Fejlécek",
-    PushUrl: "Push cím (URL)",
-    HeadersInvalidFormat: "A kérés fejléc nem egy valós JSON: ",
-    BodyInvalidFormat: "A kérés törzse nem egy valós JSON: ",
-    "Monitor History": "Vizsgálatok előzményei",
-    clearDataOlderThan: "Előzmények megtartása {0} napig.",
-    PasswordsDoNotMatch: "Jelszó nem egyezik.",
-    records: "sorok",
-    "One record": "Egy sor",
-    steamApiKeyDescription: "Steam Game Server ellenőrzéséhez szükséges egy Steam Web-API kulcs. Itt létrehozhat egy API kulcsot: ",
-    "Current User": "Felhasználó",
-    recent: "Legújabb",
-    Done: "Kész",
-    Info: "Infó",
-    Security: "Biztonság",
-    "Steam API Key": "Steam API kulcs",
-    "Shrink Database": "Adatbázis tömörítése",
-    "Pick a RR-Type...": "Válasszon egy RR-típust...",
-    "Pick Accepted Status Codes...": "Válasszon olyan kódot, ami elfogadottnak számít...",
-    Default: "Alapért.",
-    "HTTP Options": "HTTP beállítások",
-    "Create Incident": "Incidens létrehozása",
-    Title: "Cím",
-    Content: "Tartalom",
-    Style: "Stílus",
-    info: "info",
-    warning: "warning",
-    danger: "danger",
-    primary: "primary",
-    light: "light",
-    dark: "dark",
-    Post: "Bejegyzés",
-    "Please input title and content": "Adjon meg címet és tartalmat",
-    Created: "Létrehozva",
-    "Last Updated": "Utolsó mód.",
-    Unpin: "Leválaszt",
-    "Switch to Light Theme": "Világos témára váltás",
-    "Switch to Dark Theme": "Sötét témára váltás",
-    "Show Tags": "Címkék mutatása",
-    "Hide Tags": "Címkék elrejtése",
-    Description: "Leírás",
-    "No monitors available.": "Nincs még figyelő beállítva.",
-    "Add one": "Adjon hozzá egyet",
-    "No Monitors": "Nincs figyelő",
-    "Untitled Group": "Névtelen csoport",
-    Services: "Szolgáltatások",
-    Discard: "Elvet",
-    Cancel: "Mégsem",
-    "Powered by": "A megoldást szállítja az",
-    shrinkDatabaseDescription: "VACUUM futtatása az SQLite-on. Ha az adatbázisod 1.10.0-nál újabb, akkor az AUTO_VACUUM engedélyezve van, nincs szükség a műveletre.",
-    serwersms: "SerwerSMS.pl",
-    serwersmsAPIUser: "API felhasználónév (webapi_ előtaggal együtt)",
-    serwersmsAPIPassword: "API jelszó",
-    serwersmsPhoneNumber: "Telefonszám",
-    serwersmsSenderName: "SMS feladó neve (regisztrált név az oldalon)",
-    GoogleChat: "Google Chat (csak Google Workspace)",
-    stackfield: "Stackfield",
-    smtpDkimSettings: "DKIM beállítások",
-    smtpDkimDesc: "Nézze meg a Nodemailer DKIM {0} használati szabályokat.",
-    documentation: "dokumentáció",
-    smtpDkimDomain: "Domain név",
-    smtpDkimKeySelector: "Kulcs választó",
-    smtpDkimPrivateKey: "Privát kulcs",
-    smtpDkimHashAlgo: "Hash algoritmus (nem kötelező)",
-    smtpDkimheaderFieldNames: "Fejléc kulcsok a bejelentkezéshez (nem kötelező)",
-    smtpDkimskipFields: "Fejléc kulcsok egyéb esetben (nem kötelező)",
-    PushByTechulus: "Techulus push",
-    gorush: "Gorush",
-    alerta: "Alerta",
-    alertaApiEndpoint: "API végpont",
-    alertaEnvironment: "Környezet",
-    alertaApiKey: "API kulcs",
-    alertaAlertState: "Figyelmeztetési állapot",
-    alertaRecoverState: "Visszaállási állapot",
-    deleteStatusPageMsg: "Biztos, hogy törölni akarja a státusz oldalt?",
-};
diff --git a/src/languages/id-ID.js b/src/languages/id-ID.js
deleted file mode 100644
index 3a716392a..000000000
--- a/src/languages/id-ID.js
+++ /dev/null
@@ -1,585 +0,0 @@
-export default {
-    languageName: "Bahasa Indonesia (Indonesian)",
-    checkEverySecond: "Cek Setiap {0} detik.",
-    retryCheckEverySecond: "Coba lagi setiap {0} detik.",
-    resendEveryXTimes: "Kirim ulang setiap {0} kali",
-    resendDisabled: "Kirim ulang dinonaktifkan",
-    retriesDescription: "Percobaan ulang maksimum sebelum layanan dinyatakan tidak aktif dan notifikasi dikirim",
-    ignoreTLSError: "Abaikan kesalahan TLS/SSL untuk situs web HTTPS",
-    upsideDownModeDescription: "Balikkan statusnya. Jika layanan dapat dijangkau, TIDAK AKTIF.",
-    maxRedirectDescription: "Jumlah maksimum pengalihan untuk diikuti. Setel ke 0 untuk menonaktifkan pengalihan.",
-    acceptedStatusCodesDescription: "Pilih kode status yang dianggap sebagai tanggapan yang berhasil.",
-    passwordNotMatchMsg: "Kata sandi kedua tidak cocok.",
-    notificationDescription: "Harap atur notifikasi ke monitor agar berfungsi.",
-    keywordDescription: "Cari kata kunci dalam code html atau JSON huruf besar-kecil berpengaruh",
-    pauseDashboardHome: "Jeda",
-    deleteMonitorMsg: "Apakah Anda mau menghapus monitor ini?",
-    deleteNotificationMsg: "Apakah Anda mau menghapus notifikasi untuk semua monitor?",
-    dnsPortDescription: "Port server DNS. Bawaan menggunakan 53. Anda dapat mengubah port kapan saja.",
-    resolverserverDescription: "Cloudflare adalah server bawaan, Anda dapat mengubah server resolver kapan saja.",
-    rrtypeDescription: "Pilih RR-Type yang mau Anda monitor",
-    pauseMonitorMsg: "Apakah Anda yakin mau menjeda?",
-    enableDefaultNotificationDescription: "Untuk setiap monitor baru, notifikasi ini akan diaktifkan secara bawaan. Anda masih dapat menonaktifkan notifikasi secara terpisah untuk setiap monitor.",
-    clearEventsMsg: "Apakah Anda yakin mau menghapus semua event di monitor ini?",
-    clearHeartbeatsMsg: "Apakah Anda yakin mau menghapus semua heartbeats di monitor ini?",
-    confirmClearStatisticsMsg: "Apakah Anda yakin mau menghapus semua statistik?",
-    importHandleDescription: "Pilih 'Lewati yang ada' jika Anda ingin melewati setiap monitor atau notifikasi dengan nama yang sama. 'Timpa' akan menghapus setiap monitor dan notifikasi yang ada.",
-    confirmImportMsg: "Apakah Anda yakin untuk mengimpor cadangan? Pastikan Anda telah memilih opsi impor yang tepat.",
-    twoFAVerifyLabel: "Silakan ketik token Anda untuk memverifikasi bahwa 2FA berfungsi",
-    tokenValidSettingsMsg: "Token benar! Anda sekarang dapat menyimpan pengaturan 2FA.",
-    confirmEnableTwoFAMsg: "Apakah Anda yakin ingin mengaktifkan 2FA?",
-    confirmDisableTwoFAMsg: "Apakah Anda yakin ingin menonaktifkan 2FA?",
-    Settings: "Pengaturan",
-    Dashboard: "Dasbor",
-    "New Update": "Pembaruan Baru",
-    Language: "Bahasa",
-    Appearance: "Tampilan",
-    Theme: "Tema",
-    General: "Umum",
-    "Primary Base URL": "URL Dasar Utama",
-    Version: "Versi",
-    "Check Update On GitHub": "Cek Pembaruan di GitHub",
-    List: "Daftar",
-    Add: "Tambah",
-    "Add New Monitor": "Tambah Monitor Baru",
-    "Quick Stats": "Statistik",
-    Up: "Aktif",
-    Down: "Tidak Aktif",
-    Pending: "Tertunda",
-    Unknown: "Tidak diketahui",
-    Pause: "Jeda",
-    Name: "Nama",
-    Status: "Status",
-    DateTime: "Tanggal Waktu",
-    Message: "Pesan",
-    "No important events": "Tidak ada peristiwa penting",
-    Resume: "Lanjut",
-    Edit: "Ubah",
-    Delete: "Hapus",
-    Current: "Saat ini",
-    Uptime: "Waktu aktif",
-    "Cert Exp.": "Batas kedaluwarsa SSL",
-    day: "hari | hari-hari",
-    "-day": "-hari",
-    hour: "Jam",
-    "-hour": "-Jam",
-    Response: "Tanggapan",
-    Ping: "Ping",
-    "Monitor Type": "Tipe Monitor",
-    Keyword: "Kata Kunci",
-    "Friendly Name": "Nama yang Ramah",
-    URL: "URL",
-    Hostname: "Hostname",
-    Port: "Port",
-    "Heartbeat Interval": "Jarak Waktu Heartbeat ",
-    Retries: "Coba lagi",
-    "Heartbeat Retry Interval": "Jarak Waktu Heartbeat Mencoba kembali ",
-    "Resend Notification if Down X times consequently": "Kirim Ulang Notifikasi jika Tidak Aktif X kali",
-    Advanced: "Tingkat Lanjut",
-    "Upside Down Mode": "Mode Terbalik",
-    "Max. Redirects": "Maksimal Pengalihan",
-    "Accepted Status Codes": "Kode Status yang Diterima",
-    "Push URL": "Push URL",
-    needPushEvery: "Anda harus memanggil URL berikut setiap {0} detik..",
-    pushOptionalParams: "Parameter tambahan: {0}",
-    Save: "Simpan",
-    Notifications: "Notifikasi",
-    "Not available, please setup.": "Tidak tersedia, silakan atur.",
-    "Setup Notification": "Setel Notifikasi",
-    Light: "Terang",
-    Dark: "Gelap",
-    Auto: "Otomatis",
-    "Theme - Heartbeat Bar": "Tema - Heartbeat Bar",
-    Normal: "Normal",
-    Bottom: "Bawah",
-    None: "Tidak ada",
-    Timezone: "Zona Waktu",
-    "Search Engine Visibility": "Visibilitas Mesin Pencari",
-    "Allow indexing": "Mengizinkan untuk diindex",
-    "Discourage search engines from indexing site": "Mencegah mesin pencari untuk mengindex situs",
-    "Change Password": "Ganti Sandi",
-    "Current Password": "Sandi Lama",
-    "New Password": "Sandi Baru",
-    "Repeat New Password": "Ulangi Sandi Baru",
-    "Update Password": "Perbarui Kata Sandi",
-    "Disable Auth": "Nonaktifkan Autentikasi",
-    "Enable Auth": "Aktifkan Autentikasi",
-    "disableauth.message1": "Apakah Anda yakin ingin <strong>menonaktifkan autentikasi</strong>?",
-    "disableauth.message2": "Ini untuk <strong>mereka yang memiliki autentikasi pihak ketiga</strong> diletakkan di depan Uptime Kuma, misalnya akses Cloudflare.",
-    "Please use this option carefully!": "Gunakan dengan hati-hati.",
-    Logout: "Keluar",
-    Leave: "Pergi",
-    "I understand, please disable": "Saya mengerti, silakan dinonaktifkan",
-    Confirm: "Konfirmasi",
-    Yes: "Ya",
-    No: "Tidak",
-    Username: "Nama Pengguna",
-    Password: "Sandi",
-    "Remember me": "Ingat saya",
-    Login: "Masuk",
-    "No Monitors, please": "Tidak ada monitor, silakan",
-    "add one": "tambahkan satu",
-    "Notification Type": "Tipe Notifikasi",
-    Email: "Surel",
-    Test: "Tes",
-    "Certificate Info": "Info Sertifikasi",
-    "Resolver Server": "Resolver Server",
-    "Resource Record Type": "Resource Record Type",
-    "Last Result": "Hasil Terakhir",
-    "Create your admin account": "Buat akun admin Anda",
-    "Repeat Password": "Ulangi Sandi",
-    "Import Backup": "Impor Cadangan",
-    "Export Backup": "Ekspor Cadangan",
-    Export: "Ekspor",
-    Import: "Impor",
-    respTime: "Tanggapan. Waktu (milidetik)",
-    notAvailableShort: "N/A",
-    "Default enabled": "Bawaan diaktifkan",
-    "Apply on all existing monitors": "Terapkan pada semua monitor yang ada",
-    Create: "Buat",
-    "Clear Data": "Bersihkan Data",
-    Events: "Peristiwa",
-    Heartbeats: "Heartbeats",
-    "Auto Get": "Ambil Otomatis",
-    backupDescription: "Anda dapat mencadangkan semua monitor dan semua notifikasi ke dalam berkas JSON.",
-    backupDescription2: "Catatan: Data sejarah dan peristiwa tidak disertakan.",
-    backupDescription3: "Data sensitif seperti notifikasi token disertakan dalam berkas ekspor, harap simpan dengan hati-hati.",
-    alertNoFile: "Silakan pilih berkas untuk diimpor.",
-    alertWrongFileType: "Silakan pilih berkas JSON.",
-    "Clear all statistics": "Hapus semua statistik",
-    "Skip existing": "Lewati yang ada",
-    Overwrite: "Timpa",
-    Options: "Opsi",
-    "Keep both": "Simpan keduanya",
-    "Verify Token": "Verifikasi Token",
-    "Setup 2FA": "Pengaturan 2FA",
-    "Enable 2FA": "Aktifkan 2FA",
-    "Disable 2FA": "Nonaktifkan 2FA",
-    "2FA Settings": "Pengaturan 2FA",
-    "Two Factor Authentication": "Autentikasi Dua Faktor",
-    Active: "Aktif",
-    Inactive: "Tidak Aktif",
-    Token: "Token",
-    "Show URI": "Lihat URI",
-    Tags: "Tanda",
-    "Add New below or Select...": "Tambahkan Baru di bawah atau Pilih...",
-    "Tag with this name already exist.": "Tanda dengan nama ini sudah ada.",
-    "Tag with this value already exist.": "Tanda dengan nilai ini sudah ada.",
-    color: "warna",
-    "value (optional)": "nilai (harus diisi)",
-    Gray: "Abu-abu",
-    Red: "Merah",
-    Orange: "Jingga",
-    Green: "Hijau",
-    Blue: "Biru",
-    Indigo: "Biru Tua",
-    Purple: "Ungu",
-    Pink: "Merah Muda",
-    "Search...": "Cari...",
-    "Avg. Ping": "Rata-rata Ping",
-    "Avg. Response": "Rata-rata Tanggapan",
-    "Entry Page": "Halaman Masuk",
-    statusPageNothing: "Tidak ada di sini, silakan tambahkan grup atau monitor.",
-    "No Services": "Tidak ada Layanan",
-    "All Systems Operational": "Semua Sistem Berfungsi",
-    "Partially Degraded Service": "Layanan Terdegradasi Sebagian",
-    "Degraded Service": "Layanan Terdegradasi",
-    "Add Group": "Tambah Grup",
-    "Add a monitor": "Tambah monitor",
-    "Edit Status Page": "Edit Halaman Status",
-    "Go to Dashboard": "Pergi ke Dasbor",
-    "Status Page": "Halaman Status",
-    "Status Pages": "Halaman Status",
-    defaultNotificationName: "{notification} saya Peringatan ({number})",
-    here: "di sini",
-    Required: "Wajib",
-    telegram: "Telegram",
-    "Bot Token": "Bot Token",
-    wayToGetTelegramToken: "Anda dapat mendapatkan token dari {0}.",
-    "Chat ID": "Chat ID",
-    supportTelegramChatID: "Mendukung Obrolan Langsung / Grup / Channel Chat ID",
-    wayToGetTelegramChatID: "Anda bisa mendapatkan chat id Anda dengan mengirim pesan ke bot dan pergi ke url ini untuk melihat chat_id:",
-    "YOUR BOT TOKEN HERE": "BOT TOKEN ANDA DI SINI",
-    chatIDNotFound: "Chat ID tidak ditemukan, tolong kirim pesan ke bot ini dulu",
-    webhook: "Webhook",
-    "Post URL": "Post URL",
-    "Content Type": "Tipe konten",
-    webhookJsonDesc: "{0} bagus untuk peladen http modern seperti express.js",
-    webhookFormDataDesc: "{multipart} bagus untuk PHP, Anda hanya perlu mengurai json dengan {decodeFunction}",
-    smtp: "Surel (SMTP)",
-    secureOptionNone: "None / STARTTLS (25, 587)",
-    secureOptionTLS: "TLS (465)",
-    "Ignore TLS Error": "Abaikan Kesalahan TLS",
-    "From Email": "Dari Email",
-    emailCustomSubject: "Subjek",
-    "To Email": "Ke Email",
-    smtpCC: "CC",
-    smtpBCC: "BCC",
-    discord: "Discord",
-    "Discord Webhook URL": "Discord Webhook URL",
-    wayToGetDiscordURL: "Anda bisa mendapatkan ini dengan pergi ke Server Pengaturan -> Integrasi -> Buat Webhook",
-    "Bot Display Name": "Nama Bot",
-    "Prefix Custom Message": "Awalan Pesan",
-    "Hello @everyone is...": "Halo {'@'}everyone is...",
-    teams: "Microsoft Teams",
-    "Webhook URL": "Webhook URL",
-    wayToGetTeamsURL: "Anda dapat mempelajari cara membuat url webhook {0}.",
-    signal: "Sinyal",
-    Number: "Nomer",
-    Recipients: "Penerima",
-    needSignalAPI: "Anda harus memiliki klien sinyal dengan REST API.",
-    wayToCheckSignalURL: "Anda dapat memeriksa url ini untuk melihat cara menyiapkannya:",
-    signalImportant: "PENTING: Anda tidak dapat mencampur grup dan nomor di penerima!",
-    gotify: "Gotify",
-    "Application Token": "Token Aplikasi",
-    "Server URL": "URL Server",
-    Priority: "Prioritas",
-    slack: "Slack",
-    "Icon Emoji": "Ikon Emoji",
-    "Channel Name": "Nama Saluran",
-    "Uptime Kuma URL": "Uptime Kuma URL",
-    aboutWebhooks: "Info lain tentang webhook: {0}",
-    aboutChannelName: "Masukan nama saluran di {0} Kolom Nama Saluran jika Anda ingin melewati saluran webhook. Contoh: #saluran-lain",
-    aboutKumaURL: "Jika Anda membiarkan bidang URL Uptime Kuma kosong, itu akan menjadi bawaan ke halaman Proyek Github.",
-    emojiCheatSheet: "Lembar contekan emoji: {0}",
-    "rocket.chat": "Rocket.chat",
-    pushover: "Pushover",
-    pushy: "Pushy",
-    PushByTechulus: "Push by Techulus",
-    octopush: "Octopush",
-    promosms: "PromoSMS",
-    clicksendsms: "ClickSend SMS",
-    lunasea: "LunaSea",
-    apprise: "Apprise (Mendukung 50+ layanan notifikasi)",
-    GoogleChat: "Google Chat (hanya Google Workspace)",
-    pushbullet: "Pushbullet",
-    line: "Line Messenger",
-    mattermost: "Mattermost",
-    "User Key": "Kunci pengguna",
-    Device: "Perangkat",
-    "Message Title": "Judul Pesan",
-    "Notification Sound": "Suara Nofifikasi",
-    "More info on:": "Info lebih lanjut tentang: {0}",
-    pushoverDesc1: "Prioritas darurat (2) memiliki batas waktu bawaan 30 detik antara percobaan ulang dan akan kadaluwarsa setelah 1 jam.",
-    pushoverDesc2: "Jika Anda ingin mengirim pemberitahuan ke perangkat yang berbeda, isi kolom Perangkat.",
-    "SMS Type": "Tipe SMS",
-    octopushTypePremium: "Premium (Cepat - direkomendasikan untuk mengingatkan)",
-    octopushTypeLowCost: "Low Cost (Lambat, terkadang diblokir oleh operator)",
-    checkPrice: "Check {0} prices:",
-    apiCredentials: "Kredensial API",
-    octopushLegacyHint: "Apakah Anda menggunakan Octopush versi lama (2011-2020) atau versi baru?",
-    "Check octopush prices": "Cek harga octopush {0}.",
-    octopushPhoneNumber: "Nomer Telpon/HP (format internasional, contoh : +33612345678) ",
-    octopushSMSSender: "Nama Pengirim SMS : 3-11 karakter alfanumerik dan spasi (a-zA-Z0-9)",
-    "LunaSea Device ID": "LunaSea Device ID",
-    "Apprise URL": "Apprise URL",
-    "Example:": "Contoh: {0}",
-    "Read more:": "Baca lebih lanjut: {0}",
-    "Status:": "Status: {0}",
-    "Read more": "Baca lebih lanjut",
-    appriseInstalled: "Apprise diinstall.",
-    appriseNotInstalled: "Apprise tidak diinstall. {0}",
-    "Access Token": "Token Akses",
-    "Channel access token": "Token akses saluran",
-    "Line Developers Console": "Konsol Pengembang Line",
-    lineDevConsoleTo: "Konsol Pengembang Line - {0}",
-    "Basic Settings": "Pengaturan Dasar",
-    "User ID": "ID User",
-    "Messaging API": "Messaging API",
-    wayToGetLineChannelToken: "Pertama akses {0}, buat penyedia dan saluran (Messaging API), lalu Anda bisa mendapatkan token akses saluran dan id pengguna dari item menu yang disebutkan di atas.",
-    "Icon URL": "Icon URL",
-    aboutIconURL: "Anda dapat memberikan tautan ke gambar di \"Icon URL\" untuk mengganti gambar profil bawaan. Tidak akan digunakan jika Ikon Emoji diset.",
-    aboutMattermostChannelName: "Anda dapat mengganti saluran bawaan tujuan posting webhook dengan memasukkan nama saluran ke dalam Kolom \"Channel Name\". Ini perlu diaktifkan di pengaturan webhook Mattermost. contoh: #other-channel",
-    matrix: "Matrix",
-    promosmsTypeEco: "SMS ECO - murah tapi lambat dan sering kelebihan beban. Terbatas hanya untuk penerima Polandia.",
-    promosmsTypeFlash: "SMS FLASH - Pesan akan otomatis muncul di perangkat penerima. Terbatas hanya untuk penerima Polandia.",
-    promosmsTypeFull: "SMS FULL - SMS tingkat premium, Anda dapat menggunakan Nama Pengirim Anda (Anda harus mendaftarkan nama terlebih dahulu). Dapat diandalkan untuk peringatan.",
-    promosmsTypeSpeed: "SMS SPEED - Prioritas tertinggi dalam sistem. Sangat cepat dan dapat diandalkan tetapi mahal (sekitar dua kali lipat dari harga SMS FULL).",
-    promosmsPhoneNumber: "Nomor telepon (untuk penerima Polandia Anda dapat melewati kode area)",
-    promosmsSMSSender: "Nama Pengirim SMS : Nama pra-registrasi atau salah satu bawaan: InfoSMS, Info SMS, MaxSMS, INFO, SMS",
-    "Feishu WebHookUrl": "Feishu WebHookUrl",
-    matrixHomeserverURL: "Homeserver URL (dengan http(s):// dan port tambahan)",
-    "Internal Room Id": "Internal Room ID",
-    matrixDesc1: "Kamu dapat menemukan Internal Room ID dengan melihat di bagian konfigurasi ruang di Matrix. Seharusnya berbentuk seperti !QMdRCpUIfLwsfjxye6:home.server.",
-    matrixDesc2: "Sangat direkomendasikan kepada Anda untuk membuat akun baru dan jangan menggunakan token atas akun terkini yang memiliki token akses secara penuh terhadap akun dan seluruh ruang yang terdaftar. Alih - alih, buat akun baru dan undang akun tsb ke ruang tempat anda ingin menerima notifikasi. Untuk mendapatkan token akses anda dapat menjalankan {0}",
-    Method: "Method",
-    Body: "Body",
-    Headers: "Headers",
-    PushUrl: "Push URL",
-    HeadersInvalidFormat: "Request Headers memiliki format JSON yang tidak sesuai: ",
-    BodyInvalidFormat: "Request Body memiliki format JSON yang tidak sesuai: ",
-    "Monitor History": "Riyawat Monitor",
-    clearDataOlderThan: "Simpan data riwayat monitoring selama {0} hari.",
-    PasswordsDoNotMatch: "Password tidak sama.",
-    records: "catatan",
-    "One record": "Satu catatan",
-    steamApiKeyDescription: "Untuk monitoring Steam Game Server Anda membutuhkan kunci Steam Web-API. Anda dapat mendaftarkan Kunci API Anda melalui: ",
-    "Current User": "Pengguna Saat Ini",
-    topic: "Topic",
-    topicExplanation: "MQTT topic untuk dimonitor",
-    successMessage: "Pesan Berhasil",
-    successMessageExplanation: "Pesan MQTT yang akan dianggap berhasil",
-    recent: "Baru saja",
-    Done: "Selesai",
-    Info: "Info",
-    Security: "Keamanan",
-    "Steam API Key": "Steam API Key",
-    "Shrink Database": "Shrink Database",
-    "Pick a RR-Type...": "Pilih RR-Type...",
-    "Pick Accepted Status Codes...": "Pilih Kode Status yang Diterima...",
-    Default: "Default",
-    "HTTP Options": "Opsi HTTP",
-    "Create Incident": "Buat Incident",
-    Title: "Judul",
-    Content: "Konten",
-    Style: "Gaya",
-    info: "info",
-    warning: "peringatan",
-    danger: "bahaya",
-    error: "kesalahan",
-    critical: "kritis",
-    primary: "utama",
-    light: "terang",
-    dark: "gelap",
-    Post: "Post",
-    "Please input title and content": "Masukkan judul dan konten",
-    Created: "Dibuat",
-    "Last Updated": "Terakhir Diperbarui",
-    Unpin: "Lepaskan Semat",
-    "Switch to Light Theme": "Ubah ke Tema Terang",
-    "Switch to Dark Theme": "Ubah ke Tema Gelap",
-    "Show Tags": "Tampilkan Tags",
-    "Hide Tags": "Sembunyikan Tags",
-    Description: "Deskripsi",
-    "No monitors available.": "Tidak ada monitor yang tersedia.",
-    "Add one": "Tambahkan",
-    "No Monitors": "Tidak ada monitor",
-    "Untitled Group": "Group Tanpa Judul",
-    Services: "Layanan",
-    Discard: "Buang",
-    Cancel: "Batal",
-    "Powered by": "Dipersembahkan oleh",
-    shrinkDatabaseDescription: "Trigger database VACUUM untuk SQLite. Jika database Anda dibuat setelah 1.10.0, AUTO_VACUUM sudah otomatis diaktifkan dan aksi berikut tidak dibutuhkan.",
-    serwersms: "SerwerSMS.pl",
-    serwersmsAPIUser: "Nama Pengguna API ( termamsuk awalan webapi_ )",
-    serwersmsAPIPassword: "Kata Sandi API",
-    serwersmsPhoneNumber: "Nomor Telepon",
-    serwersmsSenderName: "Nama Pengirim SMS (didaftarkan melalui portal pelanggan)",
-    stackfield: "Stackfield",
-    Customize: "Kustomisasi",
-    "Custom Footer": "Tambahan Footer",
-    "Custom CSS": "Tambahan CSS",
-    smtpDkimSettings: "Pengaturan DKIM",
-    smtpDkimDesc: "Silakan merujuk ke Nodemailer DKIM {0} untuk penggunaan.",
-    documentation: "dokumentasi",
-    smtpDkimDomain: "Nama Domain",
-    smtpDkimKeySelector: "Key Selector",
-    smtpDkimPrivateKey: "Private Key",
-    smtpDkimHashAlgo: "Algoritma Hash (Opsional)",
-    smtpDkimheaderFieldNames: "Header Keys untuk ditambahkan (Optional)",
-    smtpDkimskipFields: "Header Keys not untuk ditambahkan (Optional)",
-    wayToGetPagerDutyKey: "Anda dapat menambahkan melalui Service -> Service Directory -> (Select a service) -> Integrations -> Add integration. Lalu Anda dapat menjadi dengan kata kunci \"Events API V2\". Informasi tambahan {0}",
-    "Integration Key": "Kunci Integrasi",
-    "Integration URL": "URL Integrasi",
-    "Auto resolve or acknowledged": "Penyelesaian otomatis atau diakui",
-    "do nothing": "tidak melakukan apapun",
-    "auto acknowledged": "otomatis diakui",
-    "auto resolve": "otomatis terselesaikan",
-    gorush: "Gorush",
-    alerta: "Alerta",
-    alertaApiEndpoint: "API Endpoint",
-    alertaEnvironment: "Lingkungan",
-    alertaApiKey: "Kunci API",
-    alertaAlertState: "Status Siaga",
-    alertaRecoverState: "Status Pemulihan",
-    deleteStatusPageMsg: "Apakah Anda yakin untuk menghapus halaman status berikut?",
-    Proxies: "Proxy",
-    default: "Bawaan",
-    enabled: "Diaktifkan",
-    setAsDefault: "Tetapkan sebagai bawaan",
-    deleteProxyMsg: "Apakah Anda yakin ingin menghapus proxy berikut untuk seluruh monitor?",
-    proxyDescription: "Proxy harus ditambahkan ke monitor agar berfungsi.",
-    enableProxyDescription: "Proxy berikut tidak akan berdampak ke monitor hingga diaktifkan. Anda dapat mengontrol menonaktifkan sementara proxy dari semua monitor dengan status aktivasi.",
-    setAsDefaultProxyDescription: "Proxy berikut akan diaktifkan sebagai bawaan untuk monitor baru. Anda masih dapat menonaktifkan proxy secara terpisah untuk setiap monitor.",
-    "Certificate Chain": "Certificate Chain",
-    Valid: "Valid",
-    Invalid: "Tidak Valid",
-    AccessKeyId: "AccessKey ID",
-    SecretAccessKey: "AccessKey Secret",
-    PhoneNumbers: "Nomor Telepon",
-    TemplateCode: "Kode Template",
-    SignName: "Nama Tanda",
-    "Sms template must contain parameters: ": "Template SMS harus berisi parameter: ",
-    "Bark Endpoint": "Bark Endpoint",
-    "Bark Group": "Bark Group",
-    "Bark Sound": "Bark Sound",
-    WebHookUrl: "WebHookUrl",
-    SecretKey: "SecretKey",
-    "For safety, must use secret key": "Untuk keamaan Anda harus menggunakan kunci rahasia",
-    "Device Token": "Token Perangkat",
-    Platform: "Platform",
-    iOS: "iOS",
-    Android: "Android",
-    Huawei: "Huawei",
-    High: "Tinggi",
-    Retry: "Ulang",
-    Topic: "Topik",
-    "WeCom Bot Key": "Kunci WeCom Bot",
-    "Setup Proxy": "Siapkan Proxy",
-    "Proxy Protocol": "Protokol Proxy",
-    "Proxy Server": "Server Proxy",
-    "Proxy server has authentication": "Server Proxy memiliki autentikasi",
-    User: "Pengguna",
-    Installed: "Terpasang",
-    "Not installed": "Tidak terpasang",
-    Running: "Berjalan",
-    "Not running": "Tidak berjalan",
-    "Remove Token": "Hapus Token",
-    Start: "Mulai",
-    Stop: "Berhenti",
-    "Uptime Kuma": "Uptime Kuma",
-    "Add New Status Page": "Tambahkan Halaman Status Baru",
-    Slug: "Slug",
-    "Accept characters:": "Terima karakter:",
-    startOrEndWithOnly: "Mulai atau akhiri hanya dengan {0}",
-    "No consecutive dashes": "Tanda hubung tidak berurutan",
-    Next: "Selanjutnya",
-    "The slug is already taken. Please choose another slug.": "Slug telah digunakan. Silakan pilih slug lain.",
-    "No Proxy": "Tidak ada Proxy",
-    Authentication: "Autentikasi",
-    "HTTP Basic Auth": "HTTP Basic Auth",
-    "New Status Page": "Halaman Status Baru",
-    "Page Not Found": "Halaman Tidak Ditemukan",
-    "Reverse Proxy": "Proxy Terbalik",
-    Backup: "Cadangan",
-    About: "Tentang",
-    wayToGetCloudflaredURL: "(Unduh cloudflared dari {0})",
-    cloudflareWebsite: "Situs Cloudflare",
-    "Message:": "Pesan:",
-    "Don't know how to get the token? Please read the guide:": "Tidak tahu cara mendapatkan token? Silakan baca panduannya:",
-    "The current connection may be lost if you are currently connecting via Cloudflare Tunnel. Are you sure want to stop it? Type your current password to confirm it.": "Koneksi saat ini mungkin hilang jika Anda saat ini terhubung melalui Cloudflare Tunel. Apakah Anda yakin ingin menghentikannya? Ketik kata sandi Anda saat ini untuk mengonfirmasinya.",
-    "HTTP Headers": "HTTP Headers",
-    "Trust Proxy": "Proxy Terpercaya",
-    "Other Software": "Perangkat Lunak lainnya",
-    "For example: nginx, Apache and Traefik.": "Sebagai contoh: nginx, Apache and Traefik.",
-    "Please read": "Harap dibaca",
-    "Subject:": "Subjek:",
-    "Valid To:": "Berlaku Untuk:",
-    "Days Remaining:": "Hari Tersisa:",
-    "Issuer:": "Penerbit:",
-    "Fingerprint:": "Sidik jari:",
-    "No status pages": "Tidak ada halaman status",
-    "Domain Name Expiry Notification": "Pemberitahuan Kedaluwarsa Nama Domain",
-    Proxy: "Proxy",
-    "Date Created": "Tanggal Dibuat",
-    HomeAssistant: "Home Assistant",
-    onebotHttpAddress: "Alamat HTTP OneBot",
-    onebotMessageType: "Jenis Pesan OneBot",
-    onebotGroupMessage: "Grup",
-    onebotPrivateMessage: "Pribadi",
-    onebotUserOrGroupId: "Grup/Pengguna ID",
-    onebotSafetyTips: "Untuk keamanan, harus mengatur token akses",
-    "PushDeer Key": "Kunci PushDeer",
-    "Footer Text": "Tulisan Footer",
-    "Show Powered By": "Tampilkan Dipersembahkan oleh",
-    "Domain Names": "Nama Domain",
-    signedInDisp: "Masuk sebagai {0}",
-    signedInDispDisabled: "Autentikasi dinonaktifkan.",
-    RadiusSecret: "Radius Secret",
-    RadiusSecretDescription: "Shared Secret antara klien dan server",
-    RadiusCalledStationId: "Called Station Id",
-    RadiusCalledStationIdDescription: "Pengenal perangkat yang dipanggil",
-    RadiusCallingStationId: "Calling Station Id",
-    RadiusCallingStationIdDescription: "Pengenal perangkat panggilan",
-    "Certificate Expiry Notification": "Pemberitahuan Kedaluwarsa Sertifikat",
-    "API Username": "Nama Pengguna API",
-    "API Key": "Kunci API",
-    "Recipient Number": "Nomor Penerima",
-    "From Name/Number": "Dari Nama/Nomor",
-    "Leave blank to use a shared sender number.": "Biarkan kosong untuk menggunakan nomor pengirim bersama.",
-    "Octopush API Version": "Versi API Octopush",
-    "Legacy Octopush-DM": "Legacy Octopush-DM",
-    endpoint: "endpoint",
-    octopushAPIKey: "\"API key\" dari kredensial HTTP API di panel kontrol",
-    octopushLogin: "\"Login\" dari kredensial HTTP API di panel kontrol",
-    promosmsLogin: "Nama Masuk API",
-    promosmsPassword: "Kata Sandi API",
-    "pushoversounds pushover": "Pushover (default)",
-    "pushoversounds bike": "Bike",
-    "pushoversounds bugle": "Bugle",
-    "pushoversounds cashregister": "Cash Register",
-    "pushoversounds classical": "Classical",
-    "pushoversounds cosmic": "Cosmic",
-    "pushoversounds falling": "Falling",
-    "pushoversounds gamelan": "Gamelan",
-    "pushoversounds incoming": "Incoming",
-    "pushoversounds intermission": "Intermission",
-    "pushoversounds magic": "Magic",
-    "pushoversounds mechanical": "Mechanical",
-    "pushoversounds pianobar": "Piano Bar",
-    "pushoversounds siren": "Siren",
-    "pushoversounds spacealarm": "Space Alarm",
-    "pushoversounds tugboat": "Tug Boat",
-    "pushoversounds alien": "Alien Alarm (long)",
-    "pushoversounds climb": "Climb (long)",
-    "pushoversounds persistent": "Persistent (long)",
-    "pushoversounds echo": "Pushover Echo (long)",
-    "pushoversounds updown": "Up Down (long)",
-    "pushoversounds vibrate": "Vibrate Only",
-    "pushoversounds none": "None (silent)",
-    pushyAPIKey: "Secret API Key",
-    pushyToken: "Device token",
-    "Show update if available": "Tampilkan pembaruan jika tersedia",
-    "Also check beta release": "Periksa juga rilis beta",
-    "Using a Reverse Proxy?": "Menggunakan Proxy Terbalik?",
-    "Check how to config it for WebSocket": "Periksa cara mengonfigurasinya untuk A WebSocket",
-    "Steam Game Server": "Steam Game Server",
-    "Most likely causes:": "Kemungkinan besar penyebabnya:",
-    "The resource is no longer available.": "Sumber daya tidak lagi tersedia.",
-    "There might be a typing error in the address.": "Mungkin ada kesalahan pengetikan di alamat.",
-    "What you can try:": "Apa yang dapat kamu coba:",
-    "Retype the address.": "Ketik ulang alamat.",
-    "Go back to the previous page.": "Kembali ke halaman sebelumnya.",
-    "Coming Soon": "Segera",
-    wayToGetClickSendSMSToken: "Anda bisa mendapatkan Nama Pengguna API dan Kunci API dari {0} .",
-    "Connection String": "String Koneksi",
-    Query: "Query",
-    settingsCertificateExpiry: "Sertifikat TLS Kadaluarsa",
-    certificationExpiryDescription: "Monitor HTTPS memicu pemberitahuan saat sertifikat TLS kedaluwarsa dalam:",
-    "Setup Docker Host": "Siapkan Host Docker",
-    "Connection Type": "Jenis Koneksi",
-    "Docker Daemon": "Docker Daemon",
-    deleteDockerHostMsg: "Apakah Anda yakin ingin menghapus host docker berikut untuk semua monitor?",
-    socket: "Socket",
-    tcp: "TCP / HTTP",
-    "Docker Container": "Docker Container",
-    "Container Name / ID": "Container Name / ID",
-    "Docker Host": "Docker Host",
-    "Docker Hosts": "Docker Hosts",
-    "ntfy Topic": "ntfy Topic",
-    Domain: "Domain",
-    Workstation: "Workstation",
-    disableCloudflaredNoAuthMsg: "Anda berada dalam mode Tanpa Otentikasi, kata sandi tidak diperlukan.",
-    trustProxyDescription: "Trust 'X-Forwarded-*' headers. Jika Anda ingin mendapatkan IP klien yang benar dan Uptime Kuma Anda dibalik layanan seperti Nginxor Apache, Anda harus mengaktifkan ini.",
-    wayToGetLineNotifyToken: "Anda bisa mendapatkan token akses dari {0}",
-    Examples: "Contoh",
-    "Home Assistant URL": "Home Assistant URL",
-    "Long-Lived Access Token": "Token Akses Berumur Panjang",
-    "Long-Lived Access Token can be created by clicking on your profile name (bottom left) and scrolling to the bottom then click Create Token. ": "Token Akses Berumur Panjang dapat dibuat dengan mengklik nama profil Anda (kiri bawah) dan menggulir ke bawah lalu klik Buat Token. ",
-    "Notification Service": "Layanan Pemberitahuan",
-    "default: notify all devices": "bawaan: notifikasi seluruh perangkat",
-    "A list of Notification Services can be found in Home Assistant under \"Developer Tools > Services\" search for \"notification\" to find your device/phone name.": "Daftar Layanan Pemberitahuan dapat ditemukan di Home Assistant pada \"Developer Tools > Services\" cari \"notification\" lalu cari nama perangkat Anda.",
-    "Automations can optionally be triggered in Home Assistant:": "Otomatisasi dapat dipicu secara opsional di Home Assistant:",
-    "Trigger type:": "Tipe Trigger/Pemicu:",
-    "Event type:": "Tipe event:",
-    "Event data:": "Data event:",
-    "Then choose an action, for example switch the scene to where an RGB light is red.": "Kemudian pilih tindakan, misalnya alihkan ke tempat dimana lampu RGB berwarna merah.",
-    "Frontend Version": "Versi Frontend",
-    "Frontend Version do not match backend version!": "Versi Frontend tidak sama dengan versi backend!",
-    "Base URL": "URL Dasar",
-    goAlertInfo: "GoAlert adalah aplikasi open source untuk penjadwalan panggilan, eskalasi otomatis dan pemberitahuan (seperti SMS atau panggilan suara). Secara otomatis melibatkan orang yang tepat, dengan cara yang benar, dan pada waktu yang tepat! {0}",
-    goAlertIntegrationKeyInfo: "Dapatkan kunci integrasi API generik untuk layanan dalam format ini \"aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee\" biasanya nilai parameter token dari URL yang disalin.",
-    goAlert: "GoAlert",
-    backupOutdatedWarning: "Tidak digunakan lagi: Karena banyak fitur ditambahkan dan fitur cadangan ini agak tidak terawat, itu tidak dapat menghasilkan atau memulihkan cadangan lengkap.",
-    backupRecommend: "Harap cadangkan volume atau folder data (./data/) secara langsung.",
-};
diff --git a/src/languages/it-IT.js b/src/languages/it-IT.js
deleted file mode 100644
index cd065597b..000000000
--- a/src/languages/it-IT.js
+++ /dev/null
@@ -1,367 +0,0 @@
-export default {
-    languageName: "Italiano (Italian)",
-    checkEverySecond: "controlla ogni {0} secondi",
-    retryCheckEverySecond: "Riprova ogni {0} secondi.",
-    retriesDescription: "Tentativi prima che il servizio venga marcato come \"DOWN\" e che una notifica venga inviata.",
-    ignoreTLSError: "Ignora gli errori TLS/SSL per i siti HTTPS.",
-    upsideDownModeDescription: "Se il servizio risulta raggiungibile viene marcato come \"DOWN\".",
-    maxRedirectDescription: "Numero massimo di redirezionamenti consentito. Per disabilitare, impostare \"0\".",
-    acceptedStatusCodesDescription: "Elenco di codici di stato HTTP che sono considerati validi.",
-    passwordNotMatchMsg: "La password non corrisponde.",
-    notificationDescription: "Assegnare la notifica a uno o più oggetti monitorati per metterla in funzione.",
-    keywordDescription: "Cerca la parola chiave nella risposta in html o JSON e fai distinzione tra maiuscole e minuscole",
-    pauseDashboardHome: "In Pausa",
-    deleteMonitorMsg: "Sei sicuro di voler eliminare questo oggetto monitorato?",
-    deleteNotificationMsg: "Sei sicuro di voler eliminare questa notifica per tutti gli oggetti monitorati?",
-    resolverserverDescription: "Cloudflare è il server predefinito ma è possibile cambiare il server DNS.",
-    rrtypeDescription: "Scegliere il tipo di RR che si vuole monitorare",
-    pauseMonitorMsg: "Sei sicuro di voler mettere in pausa?",
-    enableDefaultNotificationDescription: "Per ogni nuovo monitor questa notifica sarà abilitata di default. È comunque possibile disabilitare la notifica singolarmente.",
-    clearEventsMsg: "Sei sicuro di voler eliminare tutti gli eventi per questo servizio?",
-    clearHeartbeatsMsg: "Sei sicuro di voler eliminare tutti gli intervalli di controllo per questo servizio?",
-    confirmClearStatisticsMsg: "Sei sicuro di voler eliminare TUTTE le statistiche?",
-    importHandleDescription: "Selezionare \"Ignora esistenti\" se si vuole ignorare l'importazione dei monitor o delle notifiche con lo stesso nome. \"Sovrascrivi\" rimpiazzerà tutti i monitor e le notifiche presenti con quelli nel backup.",
-    confirmImportMsg: "Sei sicuro di voler importare il backup? Controlla di aver selezionato l'opzione corretta di importazione.",
-    twoFAVerifyLabel: "Digita il token per verificare che l'autenticazione a due fattori funzioni correttamente:",
-    tokenValidSettingsMsg: "Il token è valido! È ora possibile salvare le impostazioni.",
-    confirmEnableTwoFAMsg: "Sei sicuro di voler abilitare l'autenticazione a due fattori?",
-    confirmDisableTwoFAMsg: "Sei sicuro di voler disabilitare l'autenticazione a due fattori?",
-    Settings: "Impostazioni",
-    Dashboard: "Dashboard",
-    "New Update": "Nuovo aggiornamento disponibile!",
-    Language: "Lingua",
-    Appearance: "Aspetto",
-    Theme: "Tema",
-    General: "Generale",
-    "Primary Base URL": "URL base primario",
-    Version: "Versione",
-    "Check Update On GitHub": "Controlla aggiornamenti su GitHub",
-    List: "Lista",
-    Add: "Aggiungi",
-    "Add New Monitor": "Aggiungi nuovo monitor",
-    "Quick Stats": "Statistiche rapide",
-    Up: "Up",
-    Down: "Down",
-    Pending: "In attesa",
-    Unknown: "Sconosciuti",
-    Pause: "Metti in pausa",
-    Name: "Nome",
-    Status: "Stato",
-    DateTime: "Data e Ora",
-    Message: "Messaggio",
-    "No important events": "Nessun evento importante",
-    Resume: "Riprendi",
-    Edit: "Modifica",
-    Delete: "Elimina",
-    Current: "Corrente",
-    Uptime: "Tempo di attività",
-    "Cert Exp.": "Scadenza certificato",
-    day: "giorno | giorni",
-    "-day": "-giorni",
-    hour: "ora",
-    "-hour": "-ore",
-    Response: "Risposta",
-    Ping: "Ping",
-    "Monitor Type": "Modalità di monitoraggio",
-    Keyword: "Parola chiave",
-    "Friendly Name": "Nome",
-    URL: "URL",
-    Hostname: "Nome Host",
-    Port: "Porta",
-    "Heartbeat Interval": "Intervallo di controllo",
-    Retries: "Tentativi",
-    "Heartbeat Retry Interval": "Intervallo tra i tentativo di controllo",
-    Advanced: "Avanzate",
-    "Upside Down Mode": "Modalità invertita",
-    "Max. Redirects": "Reindirizzamenti massimi",
-    "Accepted Status Codes": "Codici di stato accettati",
-    "Push URL": "Push URL",
-    needPushEvery: "Notificare questo URL ogni {0} secondi.",
-    pushOptionalParams: "Parametri aggiuntivi: {0}",
-    Save: "Salva",
-    Notifications: "Notifiche",
-    "Not available, please setup.": "Non disponibili, da configurare.",
-    "Setup Notification": "Configura le notifiche",
-    Light: "Chiaro",
-    Dark: "Scuro",
-    Auto: "Automatico",
-    "Theme - Heartbeat Bar": "Tema (barra di stato)",
-    Normal: "Normale",
-    Bottom: "Sotto",
-    None: "Nessuna",
-    Timezone: "Fuso Orario",
-    "Search Engine Visibility": "Visibilità ai motori di ricerca",
-    "Allow indexing": "Consenti l'indicizzazione",
-    "Discourage search engines from indexing site": "Evita l'indicizzazione ai motori di ricerca",
-    "Change Password": "Cambia password",
-    "Current Password": "Password corrente",
-    "New Password": "Nuova password",
-    "Repeat New Password": "Ripeti nuova password",
-    "Update Password": "Modifica password",
-    "Disable Auth": "Disabilita autenticazione",
-    "Enable Auth": "Abilita autenticazione",
-    "disableauth.message1": "<strong>Disabilitare l'autenticazione?</strong>",
-    "disableauth.message2": "<strong>Questa opzione è per chi un sistema di autenticazione gestito da terze parti</strong> messo davanti ad Uptime Kuma, ad esempio Cloudflare Access.",
-    "Please use this option carefully!": "Utilizzare con attenzione!",
-    Logout: "Esci",
-    Leave: "Annulla",
-    "I understand, please disable": "Lo capisco, disabilitare l'autenticazione.",
-    Confirm: "Conferma",
-    Yes: "Sì",
-    No: "No",
-    Username: "Nome utente",
-    Password: "Password",
-    "Remember me": "Ricorda credenziali",
-    Login: "Accesso",
-    "No Monitors, please": "Nessun monitor presente,",
-    "add one": "aggiungine uno!",
-    "Notification Type": "Servizio di notifica",
-    Email: "E-mail",
-    Test: "Fai una prova",
-    "Certificate Info": "Informazioni sul certificato",
-    "Resolver Server": "Server DNS",
-    "Resource Record Type": "Tipo di Resource Record",
-    "Last Result": "Ultimo risultato",
-    "Create your admin account": "Crea l'account amministratore",
-    "Repeat Password": "Ripeti password",
-    "Import Backup": "Importa backup",
-    "Export Backup": "Esporta backup",
-    Export: "Esporta",
-    Import: "Importa",
-    respTime: "Tempo di risposta (ms)",
-    notAvailableShort: "N/D",
-    "Default enabled": "Abilitato di default",
-    "Apply on all existing monitors": "Applica su tutti i monitoraggi",
-    Create: "Crea",
-    "Clear Data": "Cancella dati",
-    Events: "Eventi",
-    Heartbeats: "Controlli",
-    "Auto Get": "Rileva",
-    backupDescription: "È possibile fare il backup di tutti i monitoraggi e di tutte le notifiche in un file JSON.",
-    backupDescription2: "NOTA: lo storico e i dati relativi agli eventi non saranno inclusi nel backup",
-    backupDescription3: "Dati sensibili come i token di autenticazione saranno inclusi nel backup, custodisci il file in un luogo sicuro!",
-    alertNoFile: "Selezionare il file da importare.",
-    alertWrongFileType: "Selezionare un file JSON.",
-    "Clear all statistics": "Cancella tutte le statistiche",
-    "Skip existing": "Ignora esistenti",
-    Overwrite: "Sovrascrivi",
-    Options: "Opzioni",
-    "Keep both": "Mantieni entrambi",
-    "Verify Token": "Verifica token",
-    "Setup 2FA": "Configura 2FA",
-    "Enable 2FA": "Abilita 2FA",
-    "Disable 2FA": "Disabilita 2FA",
-    "2FA Settings": "Gestisci l'autenticazione a due fattori",
-    "Two Factor Authentication": "Autenticazione a due fattori (2FA)",
-    Active: "Attivata",
-    Inactive: "Disattivata",
-    Token: "Token",
-    "Show URI": "Mostra URI",
-    Tags: "Etichette",
-    "Add New below or Select...": "Aggiungi oppure scegli...",
-    "Tag with this name already exist.": "Un'etichetta con questo nome già esiste.",
-    "Tag with this value already exist.": "Un'etichetta con questo valore già esiste.",
-    color: "colore",
-    "value (optional)": "descrizione (opzionale)",
-    Gray: "Grigio",
-    Red: "Rosso",
-    Orange: "Arancione",
-    Green: "Verde",
-    Blue: "Blu",
-    Indigo: "Indaco",
-    Purple: "Viola",
-    Pink: "Rosa",
-    "Search...": "Cerca...",
-    "Avg. Ping": "Tempo medio di risposta al ping",
-    "Avg. Response": "Tempo medio di risposta",
-    "Entry Page": "Pagina Principale",
-    statusPageNothing: "Non c'è nulla qui, aggiungi un gruppo oppure un monitor.",
-    "No Services": "Nessun servizio",
-    "All Systems Operational": "Tutti i sistemi sono funzionali",
-    "Partially Degraded Service": "Servizio parzialmente degradato",
-    "Degraded Service": "Servizio degradato",
-    "Add Group": "Aggiungi gruppo",
-    "Add a monitor": "Aggiungi monitor",
-    "Edit Status Page": "Modifica pagina di stato",
-    "Go to Dashboard": "Vai alla dashboard",
-    "Status Page": "Pagina di stato",
-    "Status Pages": "Pagina di stato",
-    defaultNotificationName: "Notifica {notification} ({number})",
-    here: "qui",
-    Required: "Obbligatorio",
-    telegram: "Telegram",
-    "Bot Token": "Token del bot",
-    wayToGetTelegramToken: "Puoi ottenere il token da {0}.",
-    "Chat ID": "ID Chat",
-    supportTelegramChatID: "Supporta chat private, gruppi e canali.",
-    wayToGetTelegramChatID: "È possibile ricereve l'ID chat mandando un messaggio al bot e poi andando in questo URL per visualizzare il chat_id:",
-    "YOUR BOT TOKEN HERE": "QUI IL TOKEN DEL BOT",
-    chatIDNotFound: "Non trovo l'ID chat. Prima bisogna mandare un messaggio al bot",
-    webhook: "Webhook",
-    "Post URL": "Post URL",
-    "Content Type": "Content Type",
-    webhookJsonDesc: "{0} va bene per qualsiasi server HTTP moderno ad esempio express.js",
-    webhookFormDataDesc: "{multipart} va bene per PHP, c'è solo bisogno di analizzare il json con {decodeFunction}",
-    smtp: "E-mail (SMTP)",
-    secureOptionNone: "Nessuno / STARTTLS (25, 587)",
-    secureOptionTLS: "TLS (465)",
-    "Ignore TLS Error": "Ignora gli errori TLS",
-    "From Email": "Mittente",
-    emailCustomSubject: "Oggetto personalizzato",
-    "To Email": "Destinatario",
-    smtpCC: "CC",
-    smtpBCC: "CCn",
-    discord: "Discord",
-    "Discord Webhook URL": "URL Webhook di Discord",
-    wayToGetDiscordURL: "È possibile recuperarlo da Impostazioni server -> Integrazioni -> Creare Webhook",
-    "Bot Display Name": "Nome del Bot",
-    "Prefix Custom Message": "Prefisso per il messaggio personalizzato",
-    "Hello @everyone is...": "Ciao a {'@'}everyone ...",
-    teams: "Microsoft Teams",
-    "Webhook URL": "URL Webhook",
-    wayToGetTeamsURL: "È possibile imparare a creare un URL Webhook {0}.",
-    signal: "Signal",
-    Number: "Numero",
-    Recipients: "Destinatari",
-    needSignalAPI: "È necessario avere un client Signal con le API REST.",
-    wayToCheckSignalURL: "Controllare questo url per capire come impostarne uno:",
-    signalImportant: "IMPORTANTE: Non è possibile mischiare gruppi e numeri all'interno dei destinatari!",
-    gotify: "Gotify",
-    "Application Token": "Token Applicazione",
-    "Server URL": "URL Server",
-    Priority: "Priorità",
-    slack: "Slack",
-    "Icon Emoji": "Icona Emoji",
-    "Channel Name": "Nome Canale",
-    "Uptime Kuma URL": "Indirizzo Uptime Kuma",
-    aboutWebhooks: "Maggiori informazioni riguardo ai webhooks su: {0}",
-    aboutChannelName: "Inserire il nome del canale nel campo \"Nome Canale\" {0} se si vuole bypassare il canale webhook. Ad esempio: #altro-canale",
-    aboutKumaURL: "Se si lascia bianco il campo Indirizzo Uptime Kuma, la pagina GitHub sarà il valore predefinito.",
-    emojiCheatSheet: "Lista Emoji: {0}",
-    "rocket.chat": "Rocket.chat",
-    pushover: "Pushover",
-    pushy: "Pushy",
-    octopush: "Octopush",
-    promosms: "PromoSMS",
-    clicksendsms: "ClickSend SMS",
-    lunasea: "LunaSea",
-    apprise: "Apprise (Supporta più di 50 servizi di notifica)",
-    pushbullet: "Pushbullet",
-    line: "Line Messenger",
-    mattermost: "Mattermost",
-    "User Key": "Chiave Utente",
-    Device: "Dispositivo",
-    "Message Title": "Titolo Messaggio",
-    "Notification Sound": "Suono di Notifica",
-    "More info on:": "Maggiori informazioni su: {0}",
-    pushoverDesc1: "Priorità di Emergenza (2) ha 30 secondi di timeout tra un tentativo e l'altro e scadrà dopo un'ora.",
-    pushoverDesc2: "Se si vuole inviare la notifica a dispositivi differenti, riempire il campo Dispositivi.",
-    "SMS Type": "Tipo di SMS",
-    octopushTypePremium: "Premium (Veloce - raccomandato per allertare)",
-    octopushTypeLowCost: "A Basso Costo (Lento - talvolta bloccato dall'operatore)",
-    checkPrice: "Controlla {0} prezzi:",
-    apiCredentials: "Credenziali API",
-    octopushLegacyHint: "Si vuole utilizzare la vecchia versione (2011-2020) oppure la nuova versione di Octopush?",
-    "Check octopush prices": "Controlla i prezzi di Octopush {0}.",
-    octopushPhoneNumber: "Numero di telefono (formato internazionale (p.e.): +33612345678) ",
-    octopushSMSSender: "Nome del mittente: 3-11 caratteri alfanumerici e spazi (a-zA-Z0-9)",
-    "LunaSea Device ID": "ID dispositivo LunaSea",
-    "Apprise URL": "URL Apprise",
-    "Example:": "Esempio: {0}",
-    "Read more:": "Maggiori informazioni: {0}",
-    "Status:": "Stato: {0}",
-    "Read more": "Maggiori informazioni",
-    appriseInstalled: "Apprise è installato.",
-    appriseNotInstalled: "Apprise non è installato. {0}",
-    "Access Token": "Token di accesso",
-    "Channel access token": "Token di accesso al canale",
-    "Line Developers Console": "Console sviluppatori Line",
-    lineDevConsoleTo: "Console sviluppatori Line - {0}",
-    "Basic Settings": "Impostazioni Base",
-    "User ID": "ID Utente",
-    "Messaging API": "API di Messaggistica",
-    wayToGetLineChannelToken: "Prima accedi a {0}, crea un provider e un canale (API di Messaggistica), dopodiché puoi avere il token di accesso e l'id utente dal menù sopra.",
-    "Icon URL": "URL Icona",
-    aboutIconURL: "È possibile impostare un collegameno a una immagine in \"URL Icona\" per modificare l'immagine di profilo. Non verrà utilizzata se è impostata l'Icona Emoji.",
-    aboutMattermostChannelName: "È possibile modificare il canale predefinito che dove il webhook manda messaggi immettendo il nome del canale nel campo \"Nome Canale\". Questo va abilitato nelle impostazioni webhook di Mattermost webhook. P.E.: #altro-canale",
-    matrix: "Matrix",
-    promosmsTypeEco: "SMS ECO - economico, ma lento e spesso sovraccarico. Limitato solamente a destinatari Polacchi.",
-    promosmsTypeFlash: "SMS FLASH - Il messaggio sarà automaticamente mostrato sul dispositivo dei destinatari. Limitato solo a destinatari Polacchi.",
-    promosmsTypeFull: "SMS FULL - Premium, È possibile utilizzare il proprio come come mittente (è necessario prima registrare il nome). Affidabile per gli allarmi.",
-    promosmsTypeSpeed: "SMS SPEED - Maggior priorità. Rapido, affidabile, ma costoso (costa il doppio di SMS FULL).",
-    promosmsPhoneNumber: "Numero di Telefono (per destinatari Polacchi si può omettere il codice area)",
-    promosmsSMSSender: "Mittente SMS : Nome preregistrato oppure uno dei seguenti: InfoSMS, SMS Info, MaxSMS, INFO, SMS",
-    "Feishu WebHookUrl": "URL WebHook di Feishu",
-    matrixHomeserverURL: "URL Server (con http(s):// e opzionalmente la porta)",
-    "Internal Room Id": "ID Stanza Interna",
-    matrixDesc1: "È possibile recuperare l'ID della stanza all'interno delle impostazioni avanzate della stanza nel client Matrix. Dovrebbe essere simile a !QMdRCpUIfLwsfjxye6:server.di.casa.",
-    matrixDesc2: "È altamente raccomandata la creazione di un nuovo utente e di non utilizare il proprio token di accesso Matrix poiché darà pieno controllo al proprio account e a tutte le stanze in cui si ha accesso. Piuttosto, si crei un nuovo utente per invitarlo nella stanza dove si vuole ricevere le notifiche. Si può accedere al token eseguendo {0}",
-    Method: "Metodo",
-    Body: "Body",
-    Headers: "Intestazioni",
-    PushUrl: "URL di Push",
-    HeadersInvalidFormat: "L'intestazione di richiesta non è un JSON valido: ",
-    BodyInvalidFormat: "Il corpo di richiesta non è un JSON valido: ",
-    "Monitor History": "Storico monitor",
-    clearDataOlderThan: "Mantieni lo storico per {0} giorni.",
-    PasswordsDoNotMatch: "Le password non corrispondono!",
-    records: "records",
-    "One record": "One record",
-    steamApiKeyDescription: "Per monitorare un server di gioco Steam è necessaria una Web-API Key di Steam. È possibile registrarne una qui: ",
-    "Current User": "Utente corrente",
-    recent: "Recenti",
-    Done: "Fatto",
-    Info: "Info",
-    Security: "Sicurezza",
-    "Steam API Key": "API Key di Steam",
-    "Shrink Database": "Comprimi database",
-    "Pick a RR-Type...": "Scegli un tipo di RR...",
-    "Pick Accepted Status Codes...": "Scegli i codici di Stato Accettati...",
-    Default: "Predefinito",
-    "HTTP Options": "Opzioni HTTP",
-    "Create Incident": "Segnala incidente",
-    Title: "Titolo",
-    Content: "Contenuto",
-    Style: "Stile",
-    info: "informativo",
-    warning: "attenzione",
-    danger: "critico",
-    primary: "predefinito",
-    light: "chiaro",
-    dark: "scuro",
-    Post: "Posta",
-    "Please input title and content": "Inserire il titolo e il contenuto",
-    Created: "Creato",
-    "Last Updated": "Ultima modifica",
-    Unpin: "Rimuovi",
-    "Switch to Light Theme": "Utilizza il tema chiaro",
-    "Switch to Dark Theme": "Utilizza il tema scuro",
-    "Show Tags": "Mostra etichette",
-    "Hide Tags": "Nascondi etichette",
-    Description: "Descrizione",
-    "No monitors available.": "Nessun monitor disponibile.",
-    "Add one": "Aggiungine uno!",
-    "No Monitors": "Nessun monitor presente.",
-    "Untitled Group": "Gruppo senza titolo",
-    Services: "Servizi",
-    Discard: "Scarta modifiche",
-    Cancel: "Annulla",
-    "Powered by": "Powered by",
-    shrinkDatabaseDescription: "Lancia il comando \"VACUUM\" sul database SQLite. Se il database è stato creato dopo la versione 1.10.0, la funzione \"AUTO_VACUUM\" è già abilitata di default e quindi questa azione non è necessaria.",
-    serwersms: "SerwerSMS.pl",
-    serwersmsAPIUser: "Nome utente API (incl. prefisso webapi_)",
-    serwersmsAPIPassword: "Password API",
-    serwersmsPhoneNumber: "Numero di Telefono",
-    serwersmsSenderName: "Nome del mittente SMS (registrato via portale cliente)",
-    stackfield: "Stackfield",
-    smtpDkimSettings: "Impostazioni DKIM",
-    smtpDkimDesc: "Fare riferimento a Nodemailer DKIM {0} per l'utilizzo.",
-    documentation: "documentazione",
-    smtpDkimDomain: "Dominio",
-    smtpDkimKeySelector: "Selettore Chiave",
-    smtpDkimPrivateKey: "Chiave Privata",
-    smtpDkimHashAlgo: "Algoritmo di hashing (opzionale)",
-    smtpDkimheaderFieldNames: "Campi Intestazione da firmare (opzionale)",
-    smtpDkimskipFields: "Campi Intestazione da non firmare (opzionale)",
-    GoogleChat: "Google Chat (solo per Google Workspace)",
-};
diff --git a/src/languages/ja.js b/src/languages/ja.js
deleted file mode 100644
index 187ade0cd..000000000
--- a/src/languages/ja.js
+++ /dev/null
@@ -1,201 +0,0 @@
-export default {
-    languageName: "日本語",
-    checkEverySecond: "{0}秒ごとにチェックします。",
-    retriesDescription: "サービスがダウンとしてマークされ、通知が送信されるまでの最大リトライ数",
-    ignoreTLSError: "HTTPS ウェブサイトの TLS/SSL エラーを無視する",
-    upsideDownModeDescription: "ステータスの扱いを逆にします。サービスに到達可能な場合は、DOWNとなる。",
-    maxRedirectDescription: "フォローするリダイレクトの最大数。リダイレクトを無効にするには0を設定する。",
-    acceptedStatusCodesDescription: "成功した応答とみなされるステータスコードを選択する。",
-    passwordNotMatchMsg: "繰り返しのパスワードが一致しません。",
-    notificationDescription: "監視を機能させるには、監視に通知を割り当ててください。",
-    keywordDescription: "プレーンHTMLまたはJSON応答でキーワードを検索し、大文字と小文字を区別します",
-    pauseDashboardHome: "一時停止",
-    deleteMonitorMsg: "この監視を削除してよろしいですか?",
-    deleteNotificationMsg: "全ての監視のこの通知を削除してよろしいですか?",
-    resolverserverDescription: "Cloudflareがデフォルトのサーバーですが、いつでもリゾルバサーバーを変更できます。",
-    rrtypeDescription: "監視するRRタイプを選択します",
-    pauseMonitorMsg: "一時停止しますか?",
-    Settings: "設定",
-    Dashboard: "ダッシュボード",
-    "New Update": "新しいアップデート",
-    Language: "言語",
-    Appearance: "外観",
-    Theme: "テーマ",
-    General: "General",
-    Version: "バージョン",
-    "Check Update On GitHub": "GitHubでアップデートを確認する",
-    List: "一覧",
-    Add: "追加",
-    "Add New Monitor": "監視の追加",
-    "Quick Stats": "統計",
-    Up: "Up",
-    Down: "Down",
-    Pending: "中止",
-    Unknown: "不明",
-    Pause: "一時停止",
-    Name: "名前",
-    Status: "ステータス",
-    DateTime: "日時",
-    Message: "メッセージ",
-    "No important events": "重要なイベントなし",
-    Resume: "再開",
-    Edit: "編集",
-    Delete: "削除",
-    Current: "現在",
-    Uptime: "起動時間",
-    "Cert Exp.": "証明書有効期限",
-    day: "日 | 日間",
-    "-day": "-日",
-    hour: "時間",
-    "-hour": "-時間",
-    Response: "レスポンス",
-    Ping: "Ping",
-    "Monitor Type": "監視タイプ",
-    Keyword: "キーワード",
-    "Friendly Name": "分かりやすい名前",
-    URL: "URL",
-    Hostname: "ホスト名",
-    Port: "ポート",
-    "Heartbeat Interval": "監視間隔",
-    Retries: "Retries",
-    Advanced: "Advanced",
-    "Upside Down Mode": "Upside Down Mode",
-    "Max. Redirects": "最大リダイレクト数",
-    "Accepted Status Codes": "承認されたステータスコード",
-    Save: "保存",
-    Notifications: "通知",
-    "Not available, please setup.": "利用できません。設定してください。",
-    "Setup Notification": "通知設定",
-    Light: "Light",
-    Dark: "Dark",
-    Auto: "Auto",
-    "Theme - Heartbeat Bar": "Theme - Heartbeat Bar",
-    Normal: "通常",
-    Bottom: "下部",
-    None: "なし",
-    Timezone: "タイムゾーン",
-    "Search Engine Visibility": "検索エンジンでの表示",
-    "Allow indexing": "インデックス作成を許可する",
-    "Discourage search engines from indexing site": "検索エンジンにインデックスさせないようにする",
-    "Change Password": "パスワード変更",
-    "Current Password": "現在のパスワード",
-    "New Password": "新しいパスワード",
-    "Repeat New Password": "確認のため新しいパスワードをもう一度",
-    "Update Password": "パスワードの更新",
-    "Disable Auth": "認証の無効化",
-    "Enable Auth": "認証の有効化",
-    Logout: "ログアウト",
-    Leave: "作業を中止する",
-    "I understand, please disable": "理解した上で無効化する",
-    Confirm: "確認",
-    Yes: "はい",
-    No: "いいえ",
-    Username: "ユーザー名",
-    Password: "パスワード",
-    "Remember me": "パスワードを忘れた場合",
-    Login: "ログイン",
-    "No Monitors, please": "監視がありません",
-    "add one": "add one",
-    "Notification Type": "通知タイプ",
-    Email: "Eメール",
-    Test: "テスト",
-    "Certificate Info": "証明書情報",
-    "Resolver Server": "問い合わせ先DNSサーバ",
-    "Resource Record Type": "DNSレコード設定",
-    "Last Result": "最終結果",
-    "Create your admin account": "Adminアカウントの作成",
-    "Repeat Password": "パスワード確認",
-    respTime: "応答時間 (ms)",
-    notAvailableShort: "N/A",
-    Create: "作成",
-    clearEventsMsg: "この監視のすべての記録を削除してもよろしいですか?",
-    clearHeartbeatsMsg: "この監視のすべての異常記録を削除してもよろしいですか?",
-    confirmClearStatisticsMsg: "すべての統計を削除してもよろしいですか?",
-    "Clear Data": "データを削除",
-    Events: "統計",
-    Heartbeats: "異常記録",
-    "Auto Get": "自動取得",
-    enableDefaultNotificationDescription: "監視を作成するごとに、この通知方法はデフォルトで有効になります。監視ごとに通知を無効にすることもできます。",
-    "Default enabled": "デフォルトで有効にする",
-    "Also apply to existing monitors": "既存のモニターにも適用する",
-    Export: "エクスポート",
-    Import: "インポート",
-    backupDescription: "すべての監視と通知方法をJSONファイルにできます。",
-    backupDescription2: "※ 履歴と統計のデータはバックアップされません。",
-    backupDescription3: "通知に使用するトークンなどの機密データも含まれています。注意して扱ってください。",
-    alertNoFile: "インポートするファイルを選択してください。",
-    alertWrongFileType: "JSONファイルを選択してください。",
-    twoFAVerifyLabel: "トークンを入力して、2段階認証を有効にします。",
-    tokenValidSettingsMsg: "トークンの確認が完了しました! 「保存」をしてください。",
-    confirmEnableTwoFAMsg: "2段階認証を「有効」にします。よろしいですか?",
-    confirmDisableTwoFAMsg: "2段階認証を「無効」にします。よろしいですか?",
-    "Apply on all existing monitors": "既存のすべてのモニターに適用する",
-    "Verify Token": "認証する",
-    "Setup 2FA": "2段階認証の設定",
-    "Enable 2FA": "2段階認証を有効にする",
-    "Disable 2FA": "2段階認証を無効にする",
-    "2FA Settings": "2段階認証の設定",
-    "Two Factor Authentication": "2段階認証",
-    Active: "Active",
-    Inactive: "Inactive",
-    Token: "Token",
-    "Show URI": "Show URI",
-    "Clear all statistics": "すべての記録を削除",
-    retryCheckEverySecond: "Retry every {0} seconds.",
-    importHandleDescription: "同じ名前のすべての監視または通知方法を上書きしない場合は、「既存のをスキップ」を選択します。 「上書きする」は、既存のすべてのモニターと通知を削除します。",
-    confirmImportMsg: "バックアップをインポートしてもよろしいですか?希望するオプションを選択してください。",
-    "Heartbeat Retry Interval": "異常検知後の再試行間隔",
-    "Import Backup": "バックアップのインポート",
-    "Export Backup": "バックアップのエクスポート",
-    "Skip existing": "既存のをスキップする",
-    Overwrite: "上書きする",
-    Options: "オプション",
-    "Keep both": "どちらも保持する",
-    Tags: "タグ",
-    "Add New below or Select...": "新規追加または選択...",
-    "Tag with this name already exist.": "この名前のタグはすでに存在しています。",
-    "Tag with this value already exist.": "この値のタグはすでに存在しています。",
-    color: "色",
-    "value (optional)": "値 (optional)",
-    Gray: "Gray",
-    Red: "Red",
-    Orange: "Orange",
-    Green: "Green",
-    Blue: "Blue",
-    Indigo: "Indigo",
-    Purple: "Purple",
-    Pink: "Pink",
-    "Search...": "検索...",
-    "Avg. Ping": "平均Ping時間",
-    "Avg. Response": "平均応答時間",
-    "Entry Page": "エントリーページ",
-    statusPageNothing: "ここには何もありません。グループまたは監視を追加してください。",
-    "No Services": "No Services",
-    "All Systems Operational": "すべてのサービスが稼働中",
-    "Partially Degraded Service": "部分的にサービスが停止中",
-    "Degraded Service": "サービスが停止中",
-    "Add Group": "グループの追加",
-    "Add a monitor": "監視の追加",
-    "Edit Status Page": "ステータスページ編集",
-    "Go to Dashboard": "ダッシュボード",
-    "Status Page": "ステータスページ",
-    "Status Pages": "ステータスページ",
-    telegram: "Telegram",
-    webhook: "Webhook",
-    smtp: "Email (SMTP)",
-    discord: "Discord",
-    teams: "Microsoft Teams",
-    signal: "Signal",
-    gotify: "Gotify",
-    slack: "Slack",
-    "rocket.chat": "Rocket.chat",
-    pushover: "Pushover",
-    pushy: "Pushy",
-    octopush: "Octopush",
-    promosms: "PromoSMS",
-    lunasea: "LunaSea",
-    apprise: "Apprise (Support 50+ Notification services)",
-    pushbullet: "Pushbullet",
-    line: "Line Messenger",
-    mattermost: "Mattermost",
-};
diff --git a/src/languages/ko-KR.js b/src/languages/ko-KR.js
deleted file mode 100644
index f614f5187..000000000
--- a/src/languages/ko-KR.js
+++ /dev/null
@@ -1,531 +0,0 @@
-export default {
-    languageName: "한국어",
-    checkEverySecond: "{0}초마다 확인해요.",
-    retryCheckEverySecond: "{0}초마다 다시 확인해요.",
-    retriesDescription: "서비스가 중단된 후 알림을 보내기 전 최대 재시도 횟수",
-    ignoreTLSError: "HTTPS 웹사이트에서 TLS/SSL 오류 무시하기",
-    upsideDownModeDescription: "서버 상태를 반대로 표시해요. 서버가 작동하면 오프라인으로 표시할 거예요.",
-    maxRedirectDescription: "최대 리다이렉트 횟수예요. 0을 입력하면 리다이렉트를 꺼요.",
-    acceptedStatusCodesDescription: "응답 성공으로 간주할 상태 코드를 정해요.",
-    passwordNotMatchMsg: "비밀번호 재입력이 일치하지 않아요.",
-    notificationDescription: "모니터링에 알림을 설정할 수 있어요.",
-    keywordDescription: "HTML 이나 JSON에서 대소문자를 구분해 키워드를 검색해요.",
-    pauseDashboardHome: "일시 정지",
-    deleteMonitorMsg: "정말 이 모니터링을 삭제할까요?",
-    deleteNotificationMsg: "정말 이 알림을 모든 모니터링에서 삭제할까요?",
-    resolverserverDescription: "Cloudflare가 기본 서버예요, 원한다면 언제나 다른 Resolver 서버로 변경할 수 있어요.",
-    rrtypeDescription: "모니터링할 RR-Type을 선택해요.",
-    pauseMonitorMsg: "정말 이 모니터링을 일시 정지할까요?",
-    enableDefaultNotificationDescription: "새로 추가하는 모든 모니터링에 이 알림을 기본적으로 활성화해요. 각 모니터에 대해 별도로 알림을 비활성화할 수 있어요.",
-    clearEventsMsg: "정말 이 모니터링에 대한 모든 이벤트를 삭제할까요?",
-    clearHeartbeatsMsg: "정말 이 모니터링에 대한 모든 하트비트를 삭제할까요?",
-    confirmClearStatisticsMsg: "정말 모든 통계를 삭제할까요?",
-    importHandleDescription: "이름이 같은 모든 모니터링이나 알림을 건너뛰려면 '기존값 건너뛰기'를 선택해주세요. '덮어쓰기'는 기존의 모든 모니터링과 알림을 삭제해요.",
-    confirmImportMsg: "정말 백업을 가져올까요? 가져오기 옵션을 제대로 설정했는지 다시 확인해주세요.",
-    twoFAVerifyLabel: "토큰을 입력해 2단계 인증이 작동하는지 확인해주세요.",
-    tokenValidSettingsMsg: "토큰이 유효해요! 이제 2단계 인증 설정을 저장할 수 있어요.",
-    confirmEnableTwoFAMsg: "정말 2단계 인증을 활성화할까요?",
-    confirmDisableTwoFAMsg: "정말 2단계 인증을 비활성화할까요?",
-    Settings: "설정",
-    Dashboard: "대시보드",
-    "New Update": "새로운 업데이트",
-    Language: "언어",
-    Appearance: "디스플레이",
-    Theme: "테마",
-    General: "일반",
-    Version: "버전",
-    "Check Update On GitHub": "깃허브에서 업데이트 확인",
-    List: "목록",
-    Add: "추가",
-    "Add New Monitor": "새로운 모니터링 추가하기",
-    "Quick Stats": "간단한 정보",
-    Up: "온라인",
-    Down: "오프라인",
-    Pending: "대기 중",
-    Unknown: "알 수 없음",
-    Pause: "일시 정지",
-    Name: "이름",
-    Status: "상태",
-    DateTime: "날짜",
-    Message: "메시지",
-    "No important events": "중요 이벤트 없음",
-    Resume: "재개",
-    Edit: "수정",
-    Delete: "삭제",
-    Current: "현재",
-    Uptime: "업타임",
-    "Cert Exp.": "인증서 만료",
-    day: "일",
-    "-day": "-일",
-    hour: "시간",
-    "-hour": "-시간",
-    Response: "응답",
-    Ping: "핑",
-    "Monitor Type": "모니터링 종류",
-    Keyword: "키워드",
-    "Friendly Name": "이름",
-    URL: "URL",
-    Hostname: "호스트네임",
-    Port: "포트",
-    "Heartbeat Interval": "하트비트 주기",
-    Retries: "재시도",
-    "Heartbeat Retry Interval": "하트비트 재시도 주기",
-    Advanced: "고급",
-    "Upside Down Mode": "상태 반전 모드",
-    "Max. Redirects": "최대 리다이렉트",
-    "Accepted Status Codes": "응답 성공 상태 코드",
-    Save: "저장",
-    Notifications: "알림",
-    "Not available, please setup.": "존재하지 않아요, 새로운 거 하나 만드는 건 어때요?",
-    "Setup Notification": "알림 설정",
-    Light: "화이트",
-    Dark: "다크",
-    Auto: "자동",
-    "Theme - Heartbeat Bar": "테마 - 하트비트 바",
-    Normal: "기본값",
-    Bottom: "가운데",
-    None: "없애기",
-    Timezone: "시간대",
-    "Search Engine Visibility": "검색 엔진 활성화",
-    "Allow indexing": "인덱싱 허용",
-    "Discourage search engines from indexing site": "검색 엔진 인덱싱 거부",
-    "Change Password": "비밀번호 변경",
-    "Current Password": "기존 비밀번호",
-    "New Password": "새 비밀번호",
-    "Repeat New Password": "새로운 비밀번호 재입력",
-    "Update Password": "비밀번호 변경",
-    "Disable Auth": "인증 비활성화",
-    "Enable Auth": "인증 활성화",
-    "disableauth.message1": "정말로 <strong>인증 기능을 끌까요</strong>?",
-    "disableauth.message2": "이 기능은 <strong>Cloudflare Access와 같은 서드파티 인증</strong>을 Uptime Kuma 앞에 둔 사용자를 위한 기능이에요.",
-    "Please use this option carefully!": "신중하게 사용하세요.",
-    Logout: "로그아웃",
-    Leave: "나가기",
-    "I understand, please disable": "기능에 대해 이해했으니 꺼주세요.",
-    Confirm: "확인",
-    Yes: "확인",
-    No: "취소",
-    Username: "이름",
-    Password: "비밀번호",
-    "Remember me": "비밀번호 기억하기",
-    Login: "로그인",
-    "No Monitors, please": "모니터링이 현재 없어요,",
-    "add one": "한번 추가해보실래요?",
-    "Notification Type": "알림 종류",
-    Email: "이메일",
-    Test: "테스트",
-    "Certificate Info": "인증서 정보",
-    "Resolver Server": "Resolver 서버",
-    "Resource Record Type": "리소스 레코드 유형",
-    "Last Result": "최근 결과",
-    "Create your admin account": "관리자 계정 만들기",
-    "Repeat Password": "비밀번호 재입력",
-    "Import Backup": "백업 가져오기",
-    "Export Backup": "백업 내보내기",
-    Export: "내보내기",
-    Import: "가져오기",
-    respTime: "응답 시간 (ms)",
-    notAvailableShort: "N/A",
-    "Default enabled": "기본 알림으로 설정",
-    "Apply on all existing monitors": "기존 모니터링에 모두 적용하기",
-    Create: "생성하기",
-    "Clear Data": "데이터 삭제",
-    Events: "이벤트",
-    Heartbeats: "하트비트",
-    "Auto Get": "자동 Get",
-    backupDescription: "모든 모니터링과 알림을 JSON 파일 형식에 저장할 수 있어요.",
-    backupDescription2: "히스토리와 이벤트 데이터는 포함되어 있지 않아요.",
-    backupDescription3: "알림 토큰과 같은 보안 데이터가 내보내기 파일에 포함되어 있으므로 관리에 주의해주세요.",
-    alertNoFile: "가져오기를 하기 위해 파일을 선택해주세요.",
-    alertWrongFileType: "JSON 파일을 선택해주세요.",
-    "Clear all statistics": "모든 통계치 삭제",
-    "Skip existing": "기존값 건너뛰기",
-    Overwrite: "덮어쓰기",
-    Options: "옵션",
-    "Keep both": "두개 모두 보존",
-    "Verify Token": "토큰 검증",
-    "Setup 2FA": "2단계 인증 설정하기",
-    "Enable 2FA": "2단계 인증 활성화",
-    "Disable 2FA": "2단계 인증 비활성화",
-    "2FA Settings": "2단계 인증 설정",
-    "Two Factor Authentication": "2단계 인증",
-    Active: "활성화",
-    Inactive: "비활성화",
-    Token: "토큰",
-    "Show URI": "URI 보기",
-    Tags: "태그",
-    "Add New below or Select...": "아래 새롭게 추가 또는 선택...",
-    "Tag with this name already exist.": "같은 태그 이름이 이미 존재해요.",
-    "Tag with this value already exist.": "같은 값을 가진 태그가 이미 존재해요.",
-    color: "색상",
-    "value (optional)": "값 (선택)",
-    Gray: "회색",
-    Red: "빨간색",
-    Orange: "주황색",
-    Green: "초록색",
-    Blue: "파란색",
-    Indigo: "남색",
-    Purple: "보라색",
-    Pink: "핑크색",
-    "Search...": "검색...",
-    "Avg. Ping": "평균 핑",
-    "Avg. Response": "평균 응답",
-    "Entry Page": "첫 페이지",
-    statusPageNothing: "아무것도 없어요. 새로운 그룹 또는 모니터링을 추가해주세요.",
-    "No Services": "서비스 없음",
-    "All Systems Operational": "모든 시스템 정상",
-    "Partially Degraded Service": "일부 시스템 비정상",
-    "Degraded Service": "모든 시스템 비정상",
-    "Add Group": "그룹 추가",
-    "Add a monitor": "모니터링 추가",
-    "Edit Status Page": "상태 페이지 수정",
-    "Go to Dashboard": "대시보드로 가기",
-    "Status Page": "상태 페이지",
-    "Status Pages": "상태 페이지",
-    defaultNotificationName: "내 {notification} 알림 ({number})",
-    here: "여기",
-    Required: "필수",
-    telegram: "Telegram",
-    "Bot Token": "봇 토큰",
-    wayToGetTelegramToken: "토큰은 여기서 얻을 수 있어요: {0}.",
-    "Chat ID": "채팅 ID",
-    supportTelegramChatID: "개인 채팅 / 그룹 / 채널의 ID를 지원해요.",
-    wayToGetTelegramChatID: "봇에 메시지를 보내 채팅 ID를 얻고 밑에 URL로 이동해 chat_id를 볼 수 있어요.",
-    "YOUR BOT TOKEN HERE": "봇 토큰",
-    chatIDNotFound: "채팅 ID를 찾을 수 없어요. 먼저 봇에게 메시지를 보내주세요.",
-    webhook: "Webhook",
-    "Post URL": "Post URL",
-    "Content Type": "Content Type",
-    webhookJsonDesc: "{0}은 express.js와 같은 최신 HTTP 서버에 적합해요.",
-    webhookFormDataDesc: "{multipart}은 PHP에 적합해요. {decodeFunction}를 기준으로 json을 디코딩하면 되어요.",
-    smtp: "Email (SMTP)",
-    secureOptionNone: "없음 / STARTTLS (25, 587)",
-    secureOptionTLS: "TLS (465)",
-    "Ignore TLS Error": "TLS 에러 무시하기",
-    "From Email": "보내는 이메일",
-    "To Email": "받는 이메일",
-    smtpCC: "참조",
-    smtpBCC: "숨은 참조",
-    discord: "Discord",
-    "Discord Webhook URL": "Discord Webhook URL",
-    wayToGetDiscordURL: "서버 설정 -> 연동 -> 웹후크 보기 -> 새 웹후크에서 얻을 수 있어요!",
-    "Bot Display Name": "표시 이름",
-    "Prefix Custom Message": "접두사 메시지",
-    "Hello @everyone is...": "{'@'}everyone 서버 상태 알림이에요...",
-    teams: "Microsoft Teams",
-    "Webhook URL": "Webhook URL",
-    wayToGetTeamsURL: "{0}에서 Webhook을 어떻게 만드는지 알아보세요!",
-    signal: "Signal",
-    Number: "숫자",
-    Recipients: "받는 사람",
-    needSignalAPI: "REST API를 사용하는 Signal 클라이언트가 있어야 해요.",
-    wayToCheckSignalURL: "밑에 URL을 확인해 URL 설정 방법을 볼 수 있어요.",
-    signalImportant: "경고: 받는 사람의 그룹과 숫자는 섞을 수 없어요!",
-    gotify: "Gotify",
-    "Application Token": "애플리케이션 토큰",
-    "Server URL": "서버 URL",
-    Priority: "Priority",
-    slack: "Slack",
-    "Icon Emoji": "아이콘 이모지",
-    "Channel Name": "채널 이름",
-    "Uptime Kuma URL": "Uptime Kuma URL",
-    aboutWebhooks: "Webhook에 대한 설명: {0}",
-    aboutChannelName: "Webhook 채널을 무시하려면 {0} 채널 이름칸에 채널 이름을 입력해주세요. 예: #기타-채널",
-    aboutKumaURL: "Uptime Kuma URL칸을 공백으로 두면 기본적으로 Github Project 페이지로 설정해요.",
-    emojiCheatSheet: "이모지 목록 시트: {0}",
-    "rocket.chat": "Rocket.chat",
-    pushover: "Pushover",
-    pushy: "Pushy",
-    octopush: "Octopush",
-    promosms: "PromoSMS",
-    lunasea: "LunaSea",
-    apprise: "Apprise (50개 이상 알림 서비스)",
-    pushbullet: "Pushbullet",
-    line: "Line Messenger",
-    mattermost: "Mattermost",
-    "User Key": "유저 키",
-    Device: "디바이스",
-    "Message Title": "메시지 제목",
-    "Notification Sound": "알림음",
-    "More info on:": "자세한 정보: {0}",
-    pushoverDesc1: "긴급 우선 순위 (2)는 재시도 사이에 기본적으로 30초의 타임아웃이 있고, 1시간 후에 만료되어요.",
-    pushoverDesc2: "다른 장치에 알림을 보내려면 장치칸을 입력해주세요.",
-    "SMS Type": "SMS 종류",
-    octopushTypePremium: "프리미엄 (빠름) - 알림 기능에 적합해요)",
-    octopushTypeLowCost: "저렴한 요금 (느림) - 가끔 차단될 수 있어요)",
-    "Check octopush prices": "{0}에서 Octopush 가격을 확인할 수 있어요.",
-    octopushPhoneNumber: "휴대전화 번호 (intl format, 예시: +821023456789) ",
-    octopushSMSSender: "보내는 사람 이름 : 3-11개의 영숫자 및 여백공간 (a-z, A-Z, 0-9)",
-    "LunaSea Device ID": "LunaSea 장치 ID",
-    "Apprise URL": "Apprise URL",
-    "Example:": "예: {0}",
-    "Read more:": "더 보기: {0}",
-    "Status:": "상태: {0}",
-    "Read more": "더 보기",
-    appriseInstalled: "Apprise가 설치되어있어요.",
-    appriseNotInstalled: "Apprise가 설치되어있지 않아요. {0}",
-    "Access Token": "액세스 토큰",
-    "Channel access token": "채널 액세스 토큰",
-    "Line Developers Console": "Line 개발자 콘솔",
-    lineDevConsoleTo: "Line 개발자 콘솔 - {0}",
-    "Basic Settings": "기본 설정 메뉴",
-    "User ID": "사용자 ID",
-    "Messaging API": "Messaging API 메뉴",
-    wayToGetLineChannelToken: "먼저 {0}에 액세스하고, 공급자 및 채널 (Messaging API)을 만든 다음, 각 메뉴 밑에 언급된 메뉴에서 채널 액세스 토큰과 사용자 ID를 얻을 수 있어요.",
-    "Icon URL": "아이콘 URL",
-    aboutIconURL: "\"아이콘 URL\"에 사진 링크를 입력해 프로필 사진을 설정할 수 있어요. 아이콘 이모지가 설정되어 있으면 적용되지 않을 거예요.",
-    aboutMattermostChannelName: "채널 이름을 입력하면 Webhook이 게시할 기본 채널을 재설정할 수 있어요. 이 설정은 Mattermost 웹훅 설정에서 활성화해야 해요. 예: #기타-채널",
-    matrix: "Matrix",
-    promosmsTypeEco: "SMS ECO - 저렴하지만 느리고 가끔 과부하에 걸려요. 폴란드 수신자만 사용할 수 있어요. ",
-    promosmsTypeFlash: "SMS FLASH - 메시지가 받는 사람 장치에 자동으로 표시되어요. 폴란드 수신자만 사용할 수 있어요.",
-    promosmsTypeFull: "SMS FULL - SMS 프리미엄 티어, 보내는 사람 이름을 먼저 등록해야 해요. 알림 기능에 적합해요.",
-    promosmsTypeSpeed: "SMS SPEED - 시스템에서 가장 높은 우선순위예요. 매우 빠르고 신뢰할 수 있지만 비용이 많이 들어요 (SMS 전체 가격의 약 두 배).",
-    promosmsPhoneNumber: "전화 번호 (폴란드 수신자라면 지역번호를 적지 않아도 되어요.)",
-    promosmsSMSSender: "SMS 보내는 사람 이름 : 미리 등록된 이름 혹은 기본값 중 하나예요: InfoSMS, SMS Info, MaxSMS, INFO, SMS",
-    "Primary Base URL": "기본 URL",
-    "Push URL": "Push URL",
-    needPushEvery: "이 URL을 {0} 초 마다 호출할 수 있어요.",
-    pushOptionalParams: "선택적 파라미터: {0}",
-    emailCustomSubject: "커스텀 주제",
-    clicksendsms: "ClickSend SMS",
-    checkPrice: "{0} 가격 확인:",
-    apiCredentials: "API 인증정보",
-    octopushLegacyHint: "Octopush 레거시 버전 (2011-2020) 을 사용하시나요? 아니면 새 버전을 사용하시나요?",
-    "Feishu WebHookUrl": "Feishu WebHookURL",
-    matrixHomeserverURL: "Homeserver URL (http(s):// 와 함께 적어주세요. 그리고 포트 번호는 선택적 입니다.)",
-    "Internal Room Id": "내부 방 ID",
-    matrixDesc1: "Matrix 클라이언트 방 설정의 고급 섹션에서 내부 방 ID를 찾을 수 있어요. 내부 방 ID는 이렇게 생겼답니다: !QMdRCpUIfLwsfjxye6:home.server.",
-    matrixDesc2: "사용자의 모든 방에 대한 엑세스가 허용될 수 있어서 새로운 사용자를 만들고 원하는 방에만 초대한 후 엑세스 토큰을 사용하는 것이 좋아요. {0} 이 명령어를 통해 엑세스 토큰을 얻을 수 있어요.",
-    Method: "Method",
-    Body: "Body",
-    Headers: "Headers",
-    PushUrl: "Push URL",
-    HeadersInvalidFormat: "요청 Headers의 JSON 형식이 올바르지 않아요: ",
-    BodyInvalidFormat: "요청 Body의 JSON 형식이 올바르지 않아요: ",
-    "Monitor History": "모니터링 기록",
-    clearDataOlderThan: "모니터링 기록을 {0}일 동안 저장해요.",
-    PasswordsDoNotMatch: "비밀번호가 일치하지 않아요.",
-    records: "records",
-    "One record": "One record",
-    steamApiKeyDescription: "스팀 게임 서버를 모니터링하려면 Steam Web API 키가 필요해요. API 키는 하단 웹사이트에서 등록할 수 있어요: ",
-    "Current User": "현재 사용자",
-    recent: "최근",
-    Done: "완료",
-    Info: "정보",
-    Security: "보안",
-    "Steam API Key": "스팀 API 키",
-    "Shrink Database": "데이터베이스 축소",
-    "Pick a RR-Type...": "RR-Type을 골라주세요...",
-    "Pick Accepted Status Codes...": "상태 코드를 골라주세요...",
-    Default: "기본",
-    "HTTP Options": "HTTP 옵션",
-    "Create Incident": "인시던트 만들기",
-    Title: "제목",
-    Content: "내용",
-    Style: "스타일",
-    info: "정보",
-    warning: "주의",
-    danger: "경고",
-    primary: "기본",
-    light: "화이트",
-    dark: "다크",
-    Post: "게시",
-    "Please input title and content": "제목과 내용을 작성해주세요.",
-    Created: "생성 날짜",
-    "Last Updated": "마지막 업데이트",
-    Unpin: "제거",
-    "Switch to Light Theme": "화이트 테마로 전환",
-    "Switch to Dark Theme": "다크 테마로 전환",
-    "Show Tags": "태그 보이기",
-    "Hide Tags": "태그 숨기기",
-    Description: "설명",
-    "No monitors available.": "모니터링이 없어요.",
-    "Add one": "추가하기",
-    "No Monitors": "모니터링 없음",
-    "Untitled Group": "이름없는 그룹",
-    Services: "서비스",
-    Discard: "취소",
-    Cancel: "취소",
-    "Powered by": "Powered by",
-    shrinkDatabaseDescription: "SQLite 데이터베이스 VACUUM을 트리거해요. 만약 데이터베이스가 1.10.0 버전 이후에 생성되었다면 AUTO_VACUUM이 설정되어 있어 이 작업은 필요 없을 거에요.",
-    serwersms: "SerwerSMS.pl",
-    serwersmsAPIUser: "API Usename (webapi_ 접두사 포함)",
-    serwersmsAPIPassword: "API 비밀번호",
-    serwersmsPhoneNumber: "휴대전화 번호",
-    serwersmsSenderName: "보내는 사람 이름 (customer portal를 통해 가입된 정보)",
-    stackfield: "Stackfield",
-    dnsPortDescription: "DNS 서버 포트, 기본값은 53 이에요. 포트는 언제나 변경할 수 있어요.",
-    PushByTechulus: "Push by Techulus",
-    GoogleChat: "Google Chat (Google Workspace only)",
-    topic: "Topic",
-    topicExplanation: "모니터링할 MQTT Topic",
-    successMessage: "성공 메시지",
-    successMessageExplanation: "성공으로 간주되는 MQTT 메시지",
-    error: "오류",
-    critical: "크리티컬",
-    Customize: "커스터마이즈",
-    "Custom Footer": "커스텀 Footer",
-    "Custom CSS": "커스텀 CSS",
-    smtpDkimSettings: "DKIM 설정",
-    smtpDkimDesc: "사용 방법은 DKIM {0}를 참조하세요.",
-    documentation: "문서",
-    smtpDkimDomain: "도메인 이름",
-    smtpDkimKeySelector: "Key Selector",
-    smtpDkimPrivateKey: "Private Key",
-    smtpDkimHashAlgo: "해시 알고리즘 (선택)",
-    smtpDkimheaderFieldNames: "서명할 헤더 키 (선택)",
-    smtpDkimskipFields: "서명하지 않을 헤더 키 (선택)",
-    wayToGetPagerDutyKey: "Service -> Service Directory -> (서비스 선택) -> Integrations -> Add integration. 에서 찾을 수 있어요. 자세히 알아보려면 {0}에서 \"Events API V2\"를 검색해봐요.",
-    "Integration Key": "Integration 키",
-    "Integration URL": "Integration URL",
-    "Auto resolve or acknowledged": "자동 해결 혹은 승인",
-    "do nothing": "아무것도 하지 않기",
-    "auto acknowledged": "자동 승인 (acknowledged)",
-    "auto resolve": "자동 해결 (resolve)",
-    gorush: "Gorush",
-    alerta: "Alerta",
-    alertaApiEndpoint: "API Endpoint",
-    alertaEnvironment: "환경변수",
-    alertaApiKey: "API 키",
-    alertaAlertState: "경고 상태",
-    alertaRecoverState: "해결된 상태",
-    deleteStatusPageMsg: "정말 이 상태 페이지를 삭제할까요?",
-    Proxies: "프록시",
-    default: "Default",
-    enabled: "활성화",
-    setAsDefault: "기본 프록시로 설정",
-    deleteProxyMsg: "정말 이 프록시를 모든 모니터링에서 삭제할까요?",
-    proxyDescription: "프록시가 작동하려면 모니터에 할당되어야 해요.",
-    enableProxyDescription: "이 프록시는 활성화될 때까지 영향을 미치지 않아요. 활성화 상태에 따라 모든 모니터에서 프록시를 일시정지할 수 있어요.",
-    setAsDefaultProxyDescription: "새로 추가하는 모든 모니터링에 이 프록시를 기본적으로 활성화해요. 각 모니터에 대해 별도로 프록시를 비활성화할 수 있어요.",
-    "Certificate Chain": "인증서 체인",
-    Valid: "유효",
-    Invalid: "유효하지 않음",
-    AccessKeyId: "AccessKey ID",
-    SecretAccessKey: "AccessKey Secret",
-    PhoneNumbers: "휴대전화 번호",
-    TemplateCode: "템플릿 코드",
-    SignName: "SignName",
-    "Sms template must contain parameters: ": "SMS 템플릿은 다음과 같은 파라미터가 포함되어야 해요:",
-    "Bark Endpoint": "Bark Endpoint",
-    WebHookUrl: "웹훅 URL",
-    SecretKey: "Secret Key",
-    "For safety, must use secret key": "안전을 위해 꼭 Secret Key를 사용하세요.",
-    "Device Token": "기기 Token",
-    Platform: "플랫폼",
-    iOS: "iOS",
-    Android: "Android",
-    Huawei: "Huawei",
-    High: "High",
-    Retry: "재시도",
-    Topic: "Topic",
-    "WeCom Bot Key": "WeCom Bot Key",
-    "Setup Proxy": "프록시 설정",
-    "Proxy Protocol": "프록시 프로토콜",
-    "Proxy Server": "프록시 서버",
-    "Proxy server has authentication": "프록시 서버에 인증 절차가 있음",
-    User: "사용자",
-    Installed: "설치됨",
-    "Not installed": "설치되어 있지 않음",
-    Running: "작동 중",
-    "Not running": "작동하고 있지 않음",
-    "Remove Token": "토큰 삭제",
-    Start: "시작",
-    Stop: "정지",
-    "Uptime Kuma": "Uptime Kuma",
-    "Add New Status Page": "새로운 상태 페이지 만들기",
-    Slug: "주소",
-    "Accept characters:": "허용되는 문자열:",
-    startOrEndWithOnly: "{0}로 시작하거나 끝나야 해요.",
-    "No consecutive dashes": "연속되는 대시는 허용되지 않아요",
-    Next: "다음",
-    "The slug is already taken. Please choose another slug.": "이미 존재하는 주소에요. 다른 주소를 사용해 주세요.",
-    "No Proxy": "프록시 없음",
-    Authentication: "인증",
-    "HTTP Basic Auth": "HTTP 인증",
-    "New Status Page": "새로운 상태 페이지",
-    "Page Not Found": "페이지를 찾을 수 없어요",
-    "Reverse Proxy": "리버스 프록시",
-    Backup: "백업",
-    About: "정보",
-    wayToGetCloudflaredURL: "({0}에서 Cloudflare 다운로드 하기)",
-    cloudflareWebsite: "Cloudflare 웹사이트",
-    "Message:": "메시지:",
-    "Don't know how to get the token? Please read the guide:": "토큰을 얻는 방법은 이 가이드를 확인해주세요:",
-    "The current connection may be lost if you are currently connecting via Cloudflare Tunnel. Are you sure want to stop it? Type your current password to confirm it.": "Cloudflare Tunnel를 연결하면 현재 연결이 끊길 수 있어요. 정말 중지할까요? 비밀번호를 입력해 확인하세요.",
-    "Other Software": "다른 소프트웨어",
-    "For example: nginx, Apache and Traefik.": "nginx, Apache, Traefik 등을 사용할 수 있어요.",
-    "Please read": "이 문서를 참조하세요:",
-    "Subject:": "Subject:",
-    "Valid To:": "Valid To:",
-    "Days Remaining:": "남은 일수:",
-    "Issuer:": "Issuer:",
-    "Fingerprint:": "Fingerprint:",
-    "No status pages": "상태 페이지 없음",
-    "Domain Name Expiry Notification": "도메인 이름 만료 알림",
-    Proxy: "프록시",
-    "Date Created": "생성된 날짜",
-    onebotHttpAddress: "OneBot HTTP 주소",
-    onebotMessageType: "OneBot 메시지 종류",
-    onebotGroupMessage: "그룹 메시지",
-    onebotPrivateMessage: "개인 메시지",
-    onebotUserOrGroupId: "그룹/사용자 ID",
-    onebotSafetyTips: "안전을 위해 Access 토큰을 설정하세요.",
-    "PushDeer Key": "PushDeer 키",
-    "Footer Text": "Footer 문구",
-    "Show Powered By": "Powered By 문구 표시하기",
-    "Domain Names": "도메인 이름",
-    signedInDisp: "{0} 로그인됨",
-    signedInDispDisabled: "인증 비활성화됨.",
-    "Certificate Expiry Notification": "인증서 만료 알림",
-    "API Username": "API 사용자 이름",
-    "API Key": "API 키",
-    "Recipient Number": "받는 사람 번호",
-    "From Name/Number": "발신자 이름/번호",
-    "Leave blank to use a shared sender number.": "공유 발신자 번호를 사용하려면 공백으로 두세요.",
-    "Octopush API Version": "Octopush API 버전",
-    "Legacy Octopush-DM": "레거시 Octopush-DM",
-    endpoint: "endpoint",
-    octopushAPIKey: "제어판 HTTP API credentials 에서 \"API key\"",
-    octopushLogin: "제어판 HTTP API credentials 에서 \"Login\"",
-    promosmsLogin: "API 로그인 이름",
-    promosmsPassword: "API 비밀번호",
-    "pushoversounds pushover": "Pushover (기본)",
-    "pushoversounds bike": "Bike",
-    "pushoversounds bugle": "Bugle",
-    "pushoversounds cashregister": "Cash Register",
-    "pushoversounds classical": "Classical",
-    "pushoversounds cosmic": "Cosmic",
-    "pushoversounds falling": "Falling",
-    "pushoversounds gamelan": "Gamelan",
-    "pushoversounds incoming": "Incoming",
-    "pushoversounds intermission": "Intermission",
-    "pushoversounds magic": "Magic",
-    "pushoversounds mechanical": "Mechanical",
-    "pushoversounds pianobar": "Piano Bar",
-    "pushoversounds siren": "Siren",
-    "pushoversounds spacealarm": "Space Alarm",
-    "pushoversounds tugboat": "Tug Boat",
-    "pushoversounds alien": "Alien Alarm (long)",
-    "pushoversounds climb": "Climb (long)",
-    "pushoversounds persistent": "Persistent (long)",
-    "pushoversounds echo": "Pushover Echo (long)",
-    "pushoversounds updown": "Up Down (long)",
-    "pushoversounds vibrate": "진동만",
-    "pushoversounds none": "없음 (무음)",
-    pushyAPIKey: "비밀 API 키",
-    pushyToken: "기기 토큰",
-    "Show update if available": "사용 가능한 경우에 업데이트 표시",
-    "Also check beta release": "베타 릴리즈 확인",
-    "Using a Reverse Proxy?": "리버스 프록시를 사용하시나요?",
-    "Check how to config it for WebSocket": "웹소켓 대한 설정 방법",
-    "Steam Game Server": "스팀 게임 서버",
-    "Most likely causes:": "원인:",
-    "The resource is no longer available.": "더 이상 사용할 수 없어요...",
-    "There might be a typing error in the address.": "주소에 오탈자가 있을 수 있어요.",
-    "What you can try:": "해결 방법:",
-    "Retype the address.": "주소 다시 입력하기",
-    "Go back to the previous page.": "이전 페이지로 돌아가기",
-    "Coming Soon": "Coming Soon...",
-    wayToGetClickSendSMSToken: "{0}에서 API 사용자 이름과 키를 얻을 수 있어요.",
-};
diff --git a/src/languages/nb-NO.js b/src/languages/nb-NO.js
deleted file mode 100644
index 96f71d979..000000000
--- a/src/languages/nb-NO.js
+++ /dev/null
@@ -1,285 +0,0 @@
-export default {
-    languageName: "Norsk",
-    checkEverySecond: "Sjekk hvert {0} sekund.",
-    retryCheckEverySecond: "Prøv igjen hvert {0} sekund.",
-    retriesDescription: "Maksimalt antall forsøk før tjenesten er merket som nede og et varsel sendes",
-    ignoreTLSError: "Ignorer TLS/SSL-feil for HTTPS-nettsteder",
-    upsideDownModeDescription: "Snu statusen opp ned. Hvis tjenesten er tilgjengelig, er den NEDE.",
-    maxRedirectDescription: "Maksimalt antall viderekoblinger å følge. Sett til 0 for å deaktivere viderekoblinger.",
-    acceptedStatusCodesDescription: "Velg statuskoder som anses som en vellykket respons.",
-    passwordNotMatchMsg: "Passordene stemmer ikke overens.",
-    notificationDescription: "Varsler må tilordnes en overvåkning for å fungere.",
-    keywordDescription: "Søk etter nøkkelord i ren HTML eller JSON. Søket skiller mellom store og små bokstaver.",
-    pauseDashboardHome: "Pause",
-    deleteMonitorMsg: "Er du sikker på at du vil slette denne overvåkningen?",
-    deleteNotificationMsg: "Er du sikker på at du vil slette dette varselet for alle overvåkningene?",
-    resolverserverDescription: "Cloudflare er standardserveren. Du kan endre DNS-serveren når som helst.",
-    rrtypeDescription: "Velg RR-typen du vil overvåke",
-    pauseMonitorMsg: "Er du sikker på at du vil sette på pause?",
-    enableDefaultNotificationDescription: "For hver ny overvåkning vil denne varslingen være aktivert som standard. Du kan fortsatt deaktivere varselet separat for hver overvåkning.",
-    clearEventsMsg: "Er du sikker på at du vil slette alle hendelser for denne overvåkningen?",
-    clearHeartbeatsMsg: "Er du sikker på at du vil slette alle hjerteslag for denne overvåkningen?",
-    confirmClearStatisticsMsg: "Er du sikker på at du vil slette ALL statistikk?",
-    importHandleDescription: "Velg 'Hopp over eksisterende' hvis du vil hoppe over hver overvåkning eller varsel med samme navn. 'Overskriv' sletter alle eksisterende overvåkninger og varsler.",
-    confirmImportMsg: "Er du sikker på at du vil importere denne sikkerhetskopien? Sørg for at du har valgt riktig importalternativ.",
-    twoFAVerifyLabel: "Skriv inn tokenet ditt for å bekrefte at 2FA fungerer",
-    tokenValidSettingsMsg: "Token er gyldig! Du kan nå lagre 2FA-innstillingene.",
-    confirmEnableTwoFAMsg: "Er du sikker på at du vil aktivere 2FA?",
-    confirmDisableTwoFAMsg: "Er du sikker på at du vil deaktivere 2FA?",
-    Settings: "Innstillinger",
-    Dashboard: "Dashboard",
-    "New Update": "Ny Oppdatering",
-    Language: "Språk",
-    Appearance: "Utseende",
-    Theme: "Tema",
-    General: "Generelt",
-    Version: "Versjon",
-    "Check Update On GitHub": "Sjekk oppdatering på GitHub",
-    List: "Liste",
-    Add: "Legg til",
-    "Add New Monitor": "Legg til ny overvåkning",
-    "Quick Stats": "Statistikk",
-    Up: "Oppe",
-    Down: "Nede",
-    Pending: "Avventer",
-    Unknown: "Ukjent",
-    Pause: "Pause",
-    Name: "Navn",
-    Status: "Status",
-    DateTime: "Dato tid",
-    Message: "Melding",
-    "No important events": "Ingen viktige hendelser",
-    Resume: "Fortsett",
-    Edit: "Rediger",
-    Delete: "Slett",
-    Current: "Nåværende",
-    Uptime: "Oppetid",
-    "Cert Exp.": "Sertifikat utløper",
-    day: "dag | dager",
-    "-day": "-dag",
-    hour: "time",
-    "-hour": "-time",
-    Response: "Respons",
-    Ping: "Ping",
-    "Monitor Type": "Overvåkningstype",
-    Keyword: "Stikkord",
-    "Friendly Name": "Vennlig navn",
-    URL: "URL",
-    Hostname: "Vertsnavn",
-    Port: "Port",
-    "Heartbeat Interval": "Hjerteslagsintervall",
-    Retries: "Forsøk",
-    "Heartbeat Retry Interval": "Hjerteslagsforsøkintervall",
-    Advanced: "Avansert",
-    "Upside Down Mode": "Opp-ned-modus",
-    "Max. Redirects": "Maks. viderekoblinger",
-    "Accepted Status Codes": "Godkjente statuskoder",
-    Save: "Lagre",
-    Notifications: "Varsler",
-    "Not available, please setup.": "Ikke tilgjengelig, venligst sett opp.",
-    "Setup Notification": "Sett opp varsel",
-    Light: "Lys",
-    Dark: "Mørk",
-    Auto: "Auto",
-    "Theme - Heartbeat Bar": "Theme - Heartbeat Bar",
-    Normal: "Normal",
-    Bottom: "Bunn",
-    None: "Ingen",
-    Timezone: "Tidssone",
-    "Search Engine Visibility": "Søkemotor-synlighet",
-    "Allow indexing": "Tillat indeksering",
-    "Discourage search engines from indexing site": "Fraråd søkemotorer fra å indeksere nettstedet",
-    "Change Password": "Endre passord",
-    "Current Password": "Nåværende passord",
-    "New Password": "Nytt passord",
-    "Repeat New Password": "Gjenta nytt passord",
-    "Update Password": "Oppdater passord",
-    "Disable Auth": "Deaktiver autentisering",
-    "Enable Auth": "Aktiver autentisering",
-    "disableauth.message1": "Er du sikker på at du vil <strong>deaktiver autentisering</strong>?",
-    "disableauth.message2": "Dette er for <strong>de som har tredjepartsautorisering</strong> foran Uptime Kuma, for eksempel Cloudflare Access.",
-    "Please use this option carefully!": "Vennligst vær forsiktig.",
-    Logout: "Logg ut",
-    Leave: "Forlat",
-    "I understand, please disable": "Jeg forstår, vennligst deaktiver",
-    Confirm: "Bekreft",
-    Yes: "Ja",
-    No: "Nei",
-    Username: "Brukernavn",
-    Password: "Passord",
-    "Remember me": "Husk meg",
-    Login: "Logg inn",
-    "No Monitors, please": "Ingen overvåkning, vær så snill",
-    "add one": "legg til en",
-    "Notification Type": "Meldingstype",
-    Email: "E-post",
-    Test: "Test",
-    "Certificate Info": "Sertifikatinformasjon",
-    "Resolver Server": "DNS-server",
-    "Resource Record Type": "DNS-posttype",
-    "Last Result": "Siste resultat",
-    "Create your admin account": "Opprett en administratorkonto",
-    "Repeat Password": "Gjenta passord",
-    "Import Backup": "Importer sikkerhetskopi",
-    "Export Backup": "Eksporter sikkerhetskopi",
-    Export: "Eksporter",
-    Import: "Importer",
-    respTime: "Svartid (ms)",
-    notAvailableShort: "N/A",
-    "Default enabled": "Standard aktivert",
-    "Apply on all existing monitors": "Anvend for alle eksisterende overvåkninger",
-    Create: "Opprett",
-    "Clear Data": "Slett data",
-    Events: "Hendelser",
-    Heartbeats: "Hjerteslag",
-    "Auto Get": "Auto Hent",
-    backupDescription: "Du kan sikkerhetskopiere alle overvåkninger og alle varsler til en JSON-fil.",
-    backupDescription2: "PS: Historikk og hendelsesdata er ikke inkludert.",
-    backupDescription3: "Følsomme data som varslingstokener er inkludert i eksportfilen. Vennligst oppbevar dem sikkert.",
-    alertNoFile: "Velg en fil som skal importeres.",
-    alertWrongFileType: "Velg en JSON-fil.",
-    "Clear all statistics": "Fjern all statistikk",
-    "Skip existing": "Hopp over eksisterende",
-    Overwrite: "Overskriv",
-    Options: "Alternativer",
-    "Keep both": "Behold begge",
-    "Verify Token": "Bekreft token",
-    "Setup 2FA": "Konfigurer 2FA",
-    "Enable 2FA": "Aktiver 2FA",
-    "Disable 2FA": "Deaktiver 2FA",
-    "2FA Settings": "2FA Innstillinger",
-    "Two Factor Authentication": "To-faktor autentisering",
-    Active: "Aktiv",
-    Inactive: "Inaktiv",
-    Token: "Token",
-    "Show URI": "Vis URI",
-    Tags: "Etiketter",
-    "Add New below or Select...": "Legg til nytt nedenfor eller Velg ...",
-    "Tag with this name already exist.": "Etikett med dette navnet eksisterer allerede.",
-    "Tag with this value already exist.": "Etikett med denne verdien eksisterer allerede.",
-    color: "farge",
-    "value (optional)": "verdi (valgfritt)",
-    Gray: "Grå",
-    Red: "Rød",
-    Orange: "Oransje",
-    Green: "Grønn",
-    Blue: "Blå",
-    Indigo: "Indigo",
-    Purple: "Lilla",
-    Pink: "Rosa",
-    "Search...": "Søk...",
-    "Avg. Ping": "Gj.sn. Ping",
-    "Avg. Response": "Gj.sn. Respons",
-    "Entry Page": "Oppføringsside",
-    statusPageNothing: "Ingenting her, vennligst legg til en gruppe eller en overvåkning.",
-    "No Services": "Ingen tjenester",
-    "All Systems Operational": "Alle systemer i drift",
-    "Partially Degraded Service": "Delvis degradert tjeneste",
-    "Degraded Service": "Degradert tjeneste",
-    "Add Group": "Legg til gruppe",
-    "Add a monitor": "Legg til en overvåkning",
-    "Edit Status Page": "Rediger statusside",
-    "Go to Dashboard": "Gå til Dashboard",
-    "Status Page": "Statusside",
-    "Status Pages": "Statusside",
-    defaultNotificationName: "Min {notification} varsling ({number})",
-    here: "her",
-    Required: "Obligatorisk",
-    telegram: "Telegram",
-    "Bot Token": "Bot Token",
-    wayToGetTelegramToken: "Du kan få et token fra {0}.",
-    "Chat ID": "Chat ID",
-    supportTelegramChatID: "Support Direct Chat / Group / Channel's Chat ID",
-    wayToGetTelegramChatID: "Du kan få chat-ID-en din ved å sende en melding til boten og gå til denne nettadressen for å se chat_id:",
-    "YOUR BOT TOKEN HERE": "DITT BOT TOKEN HER",
-    chatIDNotFound: "Chat-ID ble ikke funnet. Send en melding til denne boten først",
-    webhook: "Webhook",
-    "Post URL": "Post URL",
-    "Content Type": "Innholdstype",
-    webhookJsonDesc: "{0} er bra for alle moderne HTTP-servere som express.js",
-    webhookFormDataDesc: "{multipart} er bra for PHP. JSON trenger å bli analysert med {decodeFunction}",
-    smtp: "E-post (SMTP)",
-    secureOptionNone: "None / STARTTLS (25, 587)",
-    secureOptionTLS: "TLS (465)",
-    "Ignore TLS Error": "Ignorer TLS feilmelding",
-    "From Email": "Fra E-post",
-    "To Email": "Til E-post",
-    smtpCC: "CC",
-    smtpBCC: "BCC",
-    discord: "Discord",
-    "Discord Webhook URL": "Discord Webhook URL",
-    wayToGetDiscordURL: "Du kan få denne ved å gå til Serverinnstillinger -> Integrasjoner -> Opprett en Webhook",
-    "Bot Display Name": "Bot Visningsnavn",
-    "Prefix Custom Message": "Prefiks tilpasset melding",
-    "Hello @everyone is...": "Hei {'@'}everyone det er...",
-    teams: "Microsoft Teams",
-    "Webhook URL": "Webhook URL",
-    wayToGetTeamsURL: "Du kan lære hvordan du oppretter en webhook-URL {0}.",
-    signal: "Signal",
-    Number: "Nummer",
-    Recipients: "Mottakere",
-    needSignalAPI: "Du må ha en Signal-klient med REST API.",
-    wayToCheckSignalURL: "Du kan sjekke denne nettadressen for å se hvordan du konfigurerer en:",
-    signalImportant: "VIKTIG: Du kan ikke blande grupper og nummere i mottakere!",
-    gotify: "Gotify",
-    "Application Token": "Application Token",
-    "Server URL": "Server URL",
-    Priority: "Prioritet",
-    slack: "Slack",
-    "Icon Emoji": "Icon Emoji",
-    "Channel Name": "Kanal navn",
-    "Uptime Kuma URL": "Uptime Kuma URL",
-    aboutWebhooks: "Mer informasjon om webhooks på: {0}",
-    aboutChannelName: "Skriv inn kanalnavnet på {0} Kanalnavn-feltet hvis du vil omgå webhook-kanalen. Eks: #other-channel",
-    aboutKumaURL: "Hvis du lar Uptime Kuma URL feltet være blank, den blir som standard til Github-siden for dette prosjektet.",
-    emojiCheatSheet: "Emoji cheat sheet: {0}",
-    "rocket.chat": "Rocket.chat",
-    pushover: "Pushover",
-    pushy: "Pushy",
-    octopush: "Octopush",
-    promosms: "PromoSMS",
-    lunasea: "LunaSea",
-    apprise: "Apprise (Support 50+ Notification services)",
-    pushbullet: "Pushbullet",
-    line: "Line Messenger",
-    mattermost: "Mattermost",
-    "User Key": "Bruker-nøkkel",
-    Device: "Enhet",
-    "Message Title": "Meldingstittel",
-    "Notification Sound": "Notifikasjonslyd",
-    "More info on:": "Mer info på: {0}",
-    pushoverDesc1: "Nødsprioritet (2) har en standard 30 sekunders tidsavbrudd mellom forsøk og vil utløpe etter 1 time.",
-    pushoverDesc2: "Hvis du vil sende varsler til forskjellige enheteter, fyll ut Enhet-feltet.",
-    "SMS Type": "SMS Type",
-    octopushTypePremium: "Premium (Raskt - anbefalt for varsling)",
-    octopushTypeLowCost: "Lav kostnad (Sakte, noen ganger blokkert av leverandør)",
-    "Check octopush prices": "Sjekk octopush priser {0}.",
-    octopushPhoneNumber: "Telefonnummer (intl format, eg : +4791234567) ",
-    octopushSMSSender: "SMS Avsendernavn : 3-11 alphanumeriske tegn og mellomrom (a-zA-Z0-9)",
-    "LunaSea Device ID": "LunaSea Enhet ID",
-    "Apprise URL": "Apprise URL",
-    "Example:": "Eksempel: {0}",
-    "Read more:": "Les mer: {0}",
-    "Status:": "Status: {0}",
-    "Read more": "Les mer",
-    appriseInstalled: "Apprise er installert.",
-    appriseNotInstalled: "Apprise ikke installert. {0}",
-    "Access Token": "Tilgangs-Token",
-    "Channel access token": "Kanal tilgangs-token",
-    "Line Developers Console": "Line Utviklserskonsoll",
-    lineDevConsoleTo: "Line Utviklserskonsoll - {0}",
-    "Basic Settings": "Grunnleggende instillinger",
-    "User ID": "Bruker-ID",
-    "Messaging API": "Meldings-API",
-    wayToGetLineChannelToken: "Først, få tilgang til {0}, lag en leverandør og kanal (Meldings-API),  deretter kan du hente kanaltilgangs-token og bruker id fra menu-valgene nevnt over.",
-    "Icon URL": "Ikon URL",
-    aboutIconURL: "Du kan gi en link til et bilde i \"Ikon URL\" for å overskrive det standard profilbildet. Vil ikke bli brukt hvis Ikon Emoji ikke er satt.",
-    aboutMattermostChannelName: "Du kan overskrive standardkanalen som webhook-en poster i ved å skrive enn kanalnavnet i \"Kanalnavn\" feltet. Dette må være skrudd på i Mattermost webhook-instillingene. Eks: #other-channel",
-    matrix: "Matrix",
-    promosmsTypeEco: "SMS ECO - billig, men treg og ofte overbelastet. Begrenset til bare polske mottakere.",
-    promosmsTypeFlash: "SMS FLASH - Melding vil automatisk vises på mottakker-enhet. Begrenset til bare polske mottakere.",
-    promosmsTypeFull: "SMS FULL - Premuimnivå SMS. Du kan bruke dit avsendernavn (Du må registerere et navn først). Pålitelig for alle varslinger.",
-    promosmsTypeSpeed: "SMS SPEED - Høyest prioritet i systemet.Veldig rask på pålitelig, men dyrt (omtrent det dobbeltet av SMS FULL pris).",
-    promosmsPhoneNumber: "Telefonnummber (for polske mottakere. Du trenger ikke områdekode.)",
-    promosmsSMSSender: "SMS Avsendernavn : Forhåndsregistert navn eller en av standardnavnene: InfoSMS, SMS Info, MaxSMS, INFO, SMS",
-};
diff --git a/src/languages/nl-NL.js b/src/languages/nl-NL.js
deleted file mode 100644
index 290b32f6d..000000000
--- a/src/languages/nl-NL.js
+++ /dev/null
@@ -1,531 +0,0 @@
-export default {
-    languageName: "Nederlands",
-    checkEverySecond: "Controleer elke {0} seconden.",
-    retriesDescription: "Maximum aantal nieuwe pogingen voordat de service wordt gemarkeerd als niet beschikbaar en er een melding wordt verzonden",
-    ignoreTLSError: "Negeer TLS/SSL-fout voor HTTPS-websites",
-    upsideDownModeDescription: "Draai de status om. Als de service bereikbaar is, is deze OFFLINE.",
-    maxRedirectDescription: "Maximaal aantal te volgen omleidingen. Stel in op 0 om omleidingen uit te schakelen.",
-    acceptedStatusCodesDescription: "Selecteer statuscodes die als een succesvol antwoord worden beschouwd.",
-    passwordNotMatchMsg: "Het herhaalwachtwoord komt niet overeen.",
-    notificationDescription: "Wijs a.u.b. een melding toe aan de monitor(s) om het te laten werken.",
-    keywordDescription: "Zoek trefwoord in gewone html of JSON-response en het is hoofdlettergevoelig",
-    pauseDashboardHome: "Gepauzeerd",
-    deleteMonitorMsg: "Weet u zeker dat u deze monitor wilt verwijderen?",
-    deleteNotificationMsg: "Weet u zeker dat u deze melding voor alle monitoren wilt verwijderen?",
-    resolverserverDescription: "Cloudflare is de standaardserver, u kunt de resolver server op elk moment wijzigen.",
-    rrtypeDescription: "Selecteer het RR-type dat u wilt monitoren",
-    pauseMonitorMsg: "Weet je zeker dat je wilt pauzeren?",
-    enableDefaultNotificationDescription: "Voor elke nieuwe monitor wordt deze melding standaard ingeschakeld. U kunt de melding nog steeds afzonderlijk uitschakelen voor elke monitor.",
-    clearEventsMsg: "Weet je zeker dat je alle evenementen voor deze monitor wilt verwijderen?",
-    clearHeartbeatsMsg: "Weet je zeker dat je alle heartbeats voor deze monitor wilt verwijderen?",
-    confirmClearStatisticsMsg: "Weet u zeker dat u alle statistieken wilt verwijderen?",
-    twoFAVerifyLabel: "Voer uw 2FA controle token in voor verificatie",
-    tokenValidSettingsMsg: "Token is geldig! U kunt nu de 2FA-instellingen opslaan.",
-    confirmEnableTwoFAMsg: "Weet je zeker dat je 2FA wilt inschakelen?",
-    confirmDisableTwoFAMsg: "Weet je zeker dat je 2FA wilt uitschakelen?",
-    Settings: "Instellingen",
-    Dashboard: "Dashboard",
-    "New Update": "Nieuwe update",
-    Language: "Taal",
-    Appearance: "Weergave",
-    Theme: "Thema",
-    General: "Algemeen",
-    Version: "Versie",
-    "Check Update On GitHub": "Controleer voor updates op GitHub",
-    List: "Lijst",
-    Add: "Toevoegen",
-    "Add New Monitor": "Nieuwe monitor toevoegen",
-    "Quick Stats": "Snelle statistieken",
-    Up: "Online",
-    Down: "Offline",
-    Pending: "In afwachting",
-    Unknown: "Onbekend",
-    Pause: "Pauze",
-    Name: "Naam",
-    Status: "Status",
-    DateTime: "Datum Tijd",
-    Message: "Bericht",
-    "No important events": "Geen belangrijke gebeurtenissen",
-    Resume: "Hervat",
-    Edit: "Wijzigen",
-    Delete: "Verwijderen",
-    Current: "Huidig",
-    Uptime: "Uptime",
-    "Cert Exp.": "Cert. verl.",
-    day: "dag | dagen",
-    "-day": "-dag",
-    hour: "uur",
-    "-hour": "-uur",
-    Response: "Antwoord",
-    Ping: "Ping",
-    "Monitor Type": "Monitortype:",
-    Keyword: "Trefwoord",
-    "Friendly Name": "Vriendelijke naam",
-    URL: "URL",
-    Hostname: "Hostnaam",
-    Port: "Poort",
-    "Heartbeat Interval": "Hartslaginterval",
-    Retries: "Pogingen",
-    Advanced: "Geavanceerd",
-    "Upside Down Mode": "Ondersteboven modus",
-    "Max. Redirects": "Max. Omleidingen",
-    "Accepted Status Codes": "Geaccepteerde statuscodes",
-    Save: "Opslaan",
-    Notifications: "Meldingen",
-    "Not available, please setup.": "Niet beschikbaar, stel a.u.b. in.",
-    "Setup Notification": "Melding instellen",
-    Light: "Licht",
-    Dark: "Donker",
-    Auto: "Auto",
-    "Theme - Heartbeat Bar": "Thema - Hartslagbalk",
-    Normal: "Normaal",
-    Bottom: "Onderkant",
-    None: "Geen",
-    Timezone: "Tijdzone",
-    "Search Engine Visibility": "Zichtbaarheid voor zoekmachines",
-    "Allow indexing": "Indexering toestaan",
-    "Discourage search engines from indexing site": "Ontmoedig zoekmachines om de site te indexeren",
-    "Change Password": "Verander wachtwoord",
-    "Current Password": "Huidig wachtwoord",
-    "New Password": "Nieuw wachtwoord",
-    "Repeat New Password": "Herhaal nieuw wachtwoord",
-    "Update Password": "Vernieuw wachtwoord",
-    "Disable Auth": "Authenticatie uitschakelen",
-    "Enable Auth": "Authenticatie inschakelen",
-    "disableauth.message1": "Weet je zeker dat je <strong>authenticatie wilt uitschakelen</strong>?",
-    "disableauth.message2": "Er zijn omstandigheden waarbij je <strong>authenticatie door derden wilt implementeren</strong> voor Uptime Kuma, zoals Cloudflare Access, Authelia of andere authenticatiemechanismen.",
-    "Please use this option carefully!": "Gebruik deze optie zorgvuldig!",
-    Logout: "Uitloggen",
-    Leave: "Vertrekken",
-    "I understand, please disable": "Ik begrijp het, schakel a.u.b. uit",
-    Confirm: "Bevestigen",
-    Yes: "Ja",
-    No: "Nee",
-    Username: "Gebruikersnaam",
-    Password: "Wachtwoord",
-    "Remember me": "Wachtwoord onthouden",
-    Login: "Inloggen",
-    "No Monitors, please": "Geen monitoren, ",
-    "add one": "voeg een toe",
-    "Notification Type": "Melding type",
-    Email: "E-mail",
-    Test: "Testen",
-    "Certificate Info": "Certificaat informatie",
-    "Resolver Server": "Resolver Server",
-    "Resource Record Type": "Type bronrecord",
-    "Last Result": "Laatste resultaat",
-    "Create your admin account": "Maak uw beheerdersaccount aan",
-    "Repeat Password": "Herhaal wachtwoord",
-    Export: "Exporteren",
-    Import: "Importeren",
-    respTime: "reactietijd (ms)",
-    notAvailableShort: "N.v.t.",
-    "Default enabled": "Default enabled",
-    "Apply on all existing monitors": "Pas toe op alle bestaande monitors",
-    Create: "Aanmaken",
-    "Clear Data": "Data wissen",
-    Events: "Gebeurtenissen",
-    Heartbeats: "Heartbeats",
-    "Auto Get": "Auto Get",
-    backupDescription: "U kunt een back-up maken van alle monitoren en alle meldingen in een JSON-bestand.",
-    backupDescription2: "PS: Geschiedenis- en gebeurtenisgegevens zijn niet inbegrepen.",
-    backupDescription3: "Gevoelige gegevens zoals melding tokens zijn opgenomen in het exportbestand, houd het veilig opgeslagen.",
-    alertNoFile: "Selecteer een bestand om te importeren.",
-    alertWrongFileType: "Selecteer een JSON-bestand.",
-    "Verify Token": "Controleer token",
-    "Setup 2FA": "2FA instellingen",
-    "Enable 2FA": "Schakel 2FA in",
-    "Disable 2FA": "Schakel 2FA uit",
-    "2FA Settings": "2FA-instellingen",
-    "Two Factor Authentication": "Two Factor Authenticatie",
-    Active: "Actief",
-    Inactive: "Inactief",
-    "Also apply to existing monitors": "Voeg ook toe aan bestaande monitors",
-    Token: "Token",
-    "Show URI": "Toon URI",
-    "Clear all statistics": "Wis alle statistieken",
-    retryCheckEverySecond: "Probeer elke {0} seconden.",
-    importHandleDescription: "Kies 'Sla bestaande over' als je elke monitor of melding met dezelfde naam wilt overslaan. Kies 'Overschrijf' als je elke monitor of notificatie wilt verwijderen.",
-    confirmImportMsg: "Weet je zeker dat je dit bestand wilt importeren?",
-    "Heartbeat Retry Interval": "Heartbeat Retry Interval",
-    "Import Backup": "Importeer Backup",
-    "Export Backup": "Exporteer Backup",
-    "Skip existing": "Sla bestaande over",
-    Overwrite: "Overschrijf",
-    Options: "Opties",
-    "Keep both": "Bewaar beide",
-    Tags: "Labels",
-    "Add New below or Select...": "Voeg nieuwe toe of selecteer...",
-    "Tag with this name already exist.": "Label met deze naam bestaat al",
-    "Tag with this value already exist.": "Label met deze waarde bestaat al",
-    color: "Kleur",
-    "value (optional)": "waarde (optioneel)",
-    Gray: "Grijs",
-    Red: "Rood",
-    Orange: "Oranje",
-    Green: "Groen",
-    Blue: "Blauw",
-    Indigo: "Indigo",
-    Purple: "Paars",
-    Pink: "Roze",
-    "Search...": "Zoeken...",
-    "Avg. Ping": "Gemiddelde Ping",
-    "Avg. Response": "Gemiddelde Response",
-    "Entry Page": "Entry Page",
-    statusPageNothing: "Niets hier, voeg een groep of monitor toe.",
-    "No Services": "Geen diensten",
-    "All Systems Operational": "Alle systemen operationeel",
-    "Partially Degraded Service": "Gedeeltelijk verminderde prestaties",
-    "Degraded Service": "Verminderde prestaties",
-    "Add Group": "Voeg groep toe",
-    "Add a monitor": "Voeg monitor toe",
-    "Edit Status Page": "Wijzig status pagina",
-    "Go to Dashboard": "Ga naar Dashboard",
-    "Status Page": "Status Pagina",
-    "Status Pages": "Status Pagina",
-    telegram: "Telegram",
-    webhook: "Webhook",
-    smtp: "Email (SMTP)",
-    discord: "Discord",
-    teams: "Microsoft Teams",
-    signal: "Signal",
-    gotify: "Gotify",
-    slack: "Slack",
-    "rocket.chat": "Rocket.chat",
-    pushover: "Pushover",
-    pushy: "Pushy",
-    octopush: "Octopush",
-    promosms: "PromoSMS",
-    lunasea: "LunaSea",
-    apprise: "Apprise (Support 50+ Notification services)",
-    pushbullet: "Pushbullet",
-    line: "Line Messenger",
-    mattermost: "Mattermost",
-    Method: "Methode",
-    Body: "Body",
-    Headers: "Headers",
-    PushUrl: "Push URL",
-    HeadersInvalidFormat: "The request headers is geen geldige JSON: ",
-    BodyInvalidFormat: "De request body is geen geldige JSON: ",
-    "Primary Base URL": "Hoofd Basis URL",
-    "Push URL": "Push URL",
-    needPushEvery: "Je moet deze URL elke {0} seconden aanroepen.",
-    pushOptionalParams: "Optionele parameters: {0}",
-    defaultNotificationName: "Mijn {notification} Alert ({number})",
-    here: "hier",
-    Required: "Verplicht",
-    "Bot Token": "Bot Token",
-    wayToGetTelegramToken: "Je kunt een token krijgen van {0}.",
-    "Chat ID": "Chat ID",
-    supportTelegramChatID: "Ondersteuning Directe Chat / Groep / Kanaal Chat ID",
-    wayToGetTelegramChatID: "Je kunt je CHAT ID krijgen door een bericht te sturen naar de bot en naar deze URL te gaan om het chat_id te bekijken:",
-    "YOUR BOT TOKEN HERE": "DE BOT TOKEN HIER",
-    chatIDNotFound: "Chat ID is niet gevonden; stuur eerst een bericht naar de bot",
-    "Post URL": "Post URL",
-    "Content Type": "Content Type",
-    webhookJsonDesc: "{0} is goed voor een moderne HTTP server zoals Express.js",
-    webhookFormDataDesc: "{multipart} is goed voor PHP. De JSON moet worden ontleed met {decodeFunction}",
-    secureOptionNone: "Geen / STARTTLS (25, 587)",
-    secureOptionTLS: "TLS (465)",
-    "Ignore TLS Error": "Negeer TLS Error",
-    "From Email": "Van Email",
-    emailCustomSubject: "Aangepast Onderwerp",
-    "To Email": "Naar Email",
-    smtpCC: "CC",
-    smtpBCC: "BCC",
-    "Discord Webhook URL": "Discord Webhook URL",
-    wayToGetDiscordURL: "Je kunt dit krijgen door te gaan naar Server Instellingen -> Integraties -> Creëer Webhook",
-    "Bot Display Name": "Bot Weergave Naam",
-    "Prefix Custom Message": "Prefix Aangepast Bericht",
-    "Hello @everyone is...": "Hallo {'@'}iedereen is...",
-    "Webhook URL": "Webhook URL",
-    wayToGetTeamsURL: "Je kunt hier leren hoe je een webhook URL kunt maken {0}.",
-    Number: "Nummer",
-    Recipients: "Ontvangers",
-    needSignalAPI: "Je moet een signal client met REST API hebben.",
-    wayToCheckSignalURL: "Je kunt op deze URL zien hoe je een kunt instellen:",
-    signalImportant: "BELANGRIJK: Je kunt groepen en nummers niet mengen in ontvangers!",
-    "Application Token": "Applicatie Token",
-    "Server URL": "Server URL",
-    Priority: "Prioriteit",
-    "Icon Emoji": "Icoon Emoji",
-    "Channel Name": "Kanaal Naam",
-    "Uptime Kuma URL": "Uptime Kuma URL",
-    aboutWebhooks: "Meer info over Webhooks op: {0}",
-    aboutChannelName: "Voer de kanaal naam in op {0} Kannaal Naam veld als je het Webhook kanaal wilt omzeilen. Bv: #other-channel",
-    aboutKumaURL: "Als je de Uptime Kuma URL veld leeg laat, wordt standaard het GitHub project pagina weergegeven.",
-    emojiCheatSheet: "Emoji cheat sheet: {0}",
-    PushByTechulus: "Push door Techulus",
-    clicksendsms: "ClickSend SMS",
-    GoogleChat: "Google Chat (Google Workspace alleen)",
-    "User Key": "Gebruikers sleutel",
-    Device: "Apparaat",
-    "Message Title": "Bericht Titel",
-    "Notification Sound": "Notificatie Geluid",
-    "More info on:": "Meer info op: {0}",
-    pushoverDesc1: "Nood prioriteit (2) heeft standaard een 30 seconden timeout tussen pogingen en verloopt na 1 uur.",
-    pushoverDesc2: "Vul het appraat veld in als je notificaties naar andere apparaten wilt versturen.",
-    "SMS Type": "SMS Type",
-    octopushTypePremium: "Premium (Snel - aangeraden voor te alarmeren)",
-    octopushTypeLowCost: "Low Cost (Langzaam - wordt soms geblokkeerd door operator)",
-    checkPrice: "Controleer {0} prijzen:",
-    apiCredentials: "API referenties",
-    octopushLegacyHint: "Wil je de legacy versie van Octopush (2011-2020) gebruiken of de nieuwe versie?",
-    "Check octopush prices": "Controleer Octopush prijzen {0}.",
-    octopushPhoneNumber: "Telefoon nummer (Int. formaat, eg : +33612345678) ",
-    octopushSMSSender: "SMS zender naam : 3-11 alfanumerieke karakters en spatie (a-zA-Z0-9)",
-    "LunaSea Device ID": "LunaSea Apparaat ID",
-    "Apprise URL": "Apprise URL",
-    "Example:": "Voorbeeld: {0}",
-    "Read more:": "Lees meer: {0}",
-    "Status:": "Status: {0}",
-    "Read more": "Lees meer",
-    appriseInstalled: "Apprise is geïnstalleerd.",
-    appriseNotInstalled: "Apprise is niet geïnstalleerd. {0}",
-    "Access Token": "Access Token",
-    "Channel access token": "Kanaal access token",
-    "Line Developers Console": "Line Developers Console",
-    lineDevConsoleTo: "Line Developers Console - {0}",
-    "Basic Settings": "Basis Instellingen",
-    "User ID": "Gebruiker ID",
-    "Messaging API": "Berichten API",
-    wayToGetLineChannelToken: "Begin met {0} te openen, creëer een provider en kanaal (Messaging API), dan kun je de kanaal access token en gebruikers ID van de hierboven genoemde menu items krijgen.",
-    "Icon URL": "Icoon URL",
-    aboutIconURL: "Je kunt een link om de standaard profiel afbeelding te overschrijving in \"Icoon URL\" meegeven. Dit wordt niet gebruikt als Icon Emoji is ingesteld.",
-    aboutMattermostChannelName: "Je kunt het standaard kanaal dat de Webhook plaatst overschijven door de kanaal naam in te vullen in het \"Channel Name\" veld. Dit moet worden ingeschakeld in de Mattermost Webhook instellingen. Bv. #ander-kanaal",
-    matrix: "Matrix",
-    promosmsTypeEco: "SMS ECO - Goedkoop maar langzaam en vaak overbelast. Gelimiteerd tot Poolse ontvangers.",
-    promosmsTypeFlash: "SMS FLASH - Berichten worden automatisch weergegeven op het apparaat van de ontvanger. Gelimiteerd tot Poolse ontvangers.",
-    promosmsTypeFull: "SMS FULL - Premium tier van SMS, je kunt de ontvanger naam gebruiken (Je moet eerst de naam registreren). Betrouwbaar voor alarmeringen.",
-    promosmsTypeSpeed: "SMS SPEED - Hoogste prioriteit in systeem. Is veel sneller en betrouwbaarder maar kost meer (ongeveer twee keer zoveel als volle SMS prijs).",
-    promosmsPhoneNumber: "Telefoon nummer (voor Poolse ontvangers. Je kunt gebieds codes overslaan)",
-    promosmsSMSSender: "SMS Ontvanger naam : Voor geregistreerde naam of een van de standaarden: InfoSMS, SMS Info, MaxSMS, INFO, SMS",
-    "Feishu WebHookUrl": "Feishu WebHookURL",
-    matrixHomeserverURL: "Homeserver URL (met http(s):// en optioneel poort)",
-    "Internal Room Id": "Interne Room ID",
-    matrixDesc1: "Je kunt de interne room ID vinden door in de geavanceerde sectie van de room instellingen in je Matrix client te kijken. Het zou moeten uitzien als !QMdRCpUIfLwsfjxye6:home.server.",
-    matrixDesc2: "Het wordt ten zeerste aanbevolen om een nieuwe gebruiker aan te maken en niet de access token van je account te gebruiken, aangezien dit volledige toegang geeft tot je account en alle kamers waar je lid van bent. Maak in plaats daarvan een nieuwe gebruiker aan en nodig deze alleen uit voor de ruimte waarin je de melding wilt ontvangen. Je kunt de access token krijgen door het volgende uit te voeren {0}",
-    "Monitor History": "Monitor Geschiedenis",
-    clearDataOlderThan: "Bewaar monitor geschiedenis voor {0} dagen.",
-    PasswordsDoNotMatch: "Wachtwoorden komen niet overeen",
-    records: "records",
-    "One record": "Een record",
-    steamApiKeyDescription: "Om een Steam Game Server te monitoren heb je een Steam Web-API key nodig. Je kunt hier je API key registreren: ",
-    "Current User": "Huidge Gebruiker",
-    topic: "Onderwerp",
-    topicExplanation: "MQTT onderwerp om te monitoren",
-    successMessage: "Succesbericht",
-    successMessageExplanation: "MQTT bericht dat als succes wordt beschouwd.",
-    recent: "Recent",
-    Done: "Klaar",
-    Info: "Info",
-    Security: "Beveiliging",
-    "Steam API Key": "Steam API Sleutel",
-    "Shrink Database": "Verklein Database",
-    "Pick a RR-Type...": "Kies een RR-Type...",
-    "Pick Accepted Status Codes...": "Kies geaccepteerde Status Codes...",
-    Default: "Standaard",
-    "HTTP Options": "HTTP Opties",
-    "Create Incident": "Creëer Incident",
-    Title: "Titel",
-    Content: "Content",
-    Style: "Stijl",
-    info: "info",
-    warning: "waarschuwing",
-    danger: "gevaar",
-    primary: "primair",
-    light: "licht",
-    dark: "donker",
-    Post: "Post",
-    "Please input title and content": "Voer alstublieft titel en content in",
-    Created: "Gemaakt",
-    "Last Updated": "Laatst Bijgewerkt",
-    Unpin: "Losmaken",
-    "Switch to Light Theme": "Wissel naar Licht Thema",
-    "Switch to Dark Theme": "Wissel naar Donker Thema",
-    "Show Tags": "Toon Labels",
-    "Hide Tags": "Verberg Labels",
-    Description: "Beschrijving",
-    "No monitors available.": "Geen monitors beschikbaar.",
-    "Add one": "Voeg een toe",
-    "No Monitors": "Geen Monitors",
-    "Untitled Group": "Naamloze Groep",
-    Services: "Diensten",
-    Discard: "Weggooien",
-    Cancel: "Annuleren",
-    "Powered by": "Mogelijk gemaakt door",
-    shrinkDatabaseDescription: "Activeer database VACUUM voor SQLite. Als de database na 1.10.0 aangemaakt is, dan staat AUTO_VACUUM al aan en is deze actie niet nodig.",
-    serwersms: "SerwerSMS.pl",
-    serwersmsAPIUser: "API Gebruikersnaam (incl. webapi_ prefix)",
-    serwersmsAPIPassword: "API Wachtwoord",
-    serwersmsPhoneNumber: "Telefoon nummer",
-    serwersmsSenderName: "SMS Zender Naam (geregistreerd via klant portaal)",
-    stackfield: "Stackfield",
-    Customize: "Aanpassen",
-    "Custom Footer": "Aangepaste Footer",
-    "Custom CSS": "Aangepaste CSS",
-    smtpDkimSettings: "DKIM Instellingen",
-    smtpDkimDesc: "Refereer alsjeblieft naar Nodemailer DKIM {0} voor gebruik.",
-    documentation: "documentatie",
-    smtpDkimDomain: "Domein Naam",
-    smtpDkimKeySelector: "Sleutel Kiezer",
-    smtpDkimPrivateKey: "Prive Sleutel",
-    smtpDkimHashAlgo: "Hash Algoritme (Optioneel)",
-    smtpDkimheaderFieldNames: "Header sleutels om te ondertekenen (Optioneel)",
-    smtpDkimskipFields: "Header sleutels niet om te ondertekenen (Optioneel)",
-    gorush: "Gorush",
-    alerta: "Alerta",
-    alertaApiEndpoint: "API Eindpunt",
-    alertaEnvironment: "Omgeving",
-    alertaApiKey: "API Sleutel",
-    alertaAlertState: "Alert Staat",
-    alertaRecoverState: "Herstel Staat",
-    deleteStatusPageMsg: "Weet je zeker je deze status pagina wilt verwijderen?",
-    Proxies: "Proxies",
-    default: "Standaard",
-    enabled: "Ingeschakeld",
-    setAsDefault: "Stel in als standaard",
-    deleteProxyMsg: "Weet je zeker dat je deze proxy wilt verwijderen voor alle monitors?",
-    proxyDescription: "Proxies moeten worden toegewezen aan een monitor om te functioneren.",
-    enableProxyDescription: "Deze proxy heeft geen effect op monitor verzoeken totdat het is geactiveerd. Je kunt tijdelijk de proxy uitschakelen voor alle monitors voor activatie status.",
-    setAsDefaultProxyDescription: "Deze proxy wordt standaard aangezet voor alle nieuwe monitors. Je kunt nog steeds de proxy apart uitschakelen voor elke monitor.",
-    "Certificate Chain": "Certificaatketen",
-    Valid: "Geldig",
-    Invalid: "Ongeldig",
-    AccessKeyId: "AccessKey ID",
-    SecretAccessKey: "AccessKey Secret",
-    PhoneNumbers: "TelefoonNummers",
-    TemplateCode: "TemplateCode",
-    SignName: "SignName",
-    "Sms template must contain parameters: ": "Sms sjabloon moet de volgende parameters bevatten: ",
-    "Bark Endpoint": "Bark Endpoint",
-    WebHookUrl: "WebHookUrl",
-    SecretKey: "SecretKey",
-    "For safety, must use secret key": "Voor de veiligheid moet je de secret key gebruiken",
-    "Device Token": "Apparaat Token",
-    Platform: "Platform",
-    iOS: "iOS",
-    Android: "Android",
-    Huawei: "Huawei",
-    High: "Hoog",
-    Retry: "Opnieuw",
-    Topic: "Onderwerp",
-    "WeCom Bot Key": "WeCom Bot Key",
-    "Setup Proxy": "Proxy instellen",
-    "Proxy Protocol": "Proxy Protocol",
-    "Proxy Server": "Proxy Server",
-    "Proxy server has authentication": "Proxy server heeft authenticatie",
-    User: "Gebruiker",
-    Installed: "Geïnstalleerd",
-    "Not installed": "Niet geïnstalleerd",
-    Running: "Actief",
-    "Not running": "Niet actief",
-    "Remove Token": "Verwijder Token",
-    Start: "Start",
-    Stop: "Stop",
-    "Uptime Kuma": "Uptime Kuma",
-    "Add New Status Page": "Voeg nieuwe status pagina toe",
-    Slug: "Slug",
-    "Accept characters:": "Geaccepteerde tekens:",
-    startOrEndWithOnly: "Start of eindig alleen met {0}",
-    "No consecutive dashes": "Geen opeenvolgende streepjes",
-    Next: "Volgende",
-    "The slug is already taken. Please choose another slug.": "De slug is al in gebruik. Kies een andere slug.",
-    "No Proxy": "Geen Proxy",
-    "HTTP Basic Auth": "HTTP Basic Auth",
-    "New Status Page": "Nieuwe Status Pagina",
-    "Page Not Found": "Pagina Niet gevonden",
-    "Reverse Proxy": "Reverse Proxy",
-    Backup: "Backup",
-    About: "Over",
-    wayToGetCloudflaredURL: "(Download cloudflared van {0})",
-    cloudflareWebsite: "Cloudflare Website",
-    "Message:": "Bericht:",
-    "Don't know how to get the token? Please read the guide:": "Lees de uitleg als je niet weet hoe je een token krijgt:",
-    "The current connection may be lost if you are currently connecting via Cloudflare Tunnel. Are you sure want to stop it? Type your current password to confirm it.": "De huidge verbinding kan worden verbroken als je momenteel bent verbonden met Cloudflare Tunnel. Weet je zeker dat je het wilt stoppen? Typ je huidige wachtwoord om het te bevestigen.",
-    "Other Software": "Andere Software",
-    "For example: nginx, Apache and Traefik.": "Bijvoorbeeld: nginx, Apache and Traefik.",
-    "Please read": "Lees alstublieft",
-    "Subject:": "Onderwerp:",
-    "Valid To:": "Geldig Tot:",
-    "Days Remaining:": "Dagen Resterend:",
-    "Issuer:": "Uitgever:",
-    "Fingerprint:": "Vingerafruk:",
-    "No status pages": "Geen status pagina's",
-    Proxy: "Proxy",
-    "Date Created": "Datum Aangemaakt",
-    onebotHttpAddress: "OneBot HTTP Adres",
-    onebotMessageType: "OneBot Bericht Type",
-    onebotGroupMessage: "Groep",
-    onebotPrivateMessage: "Privé",
-    onebotUserOrGroupId: "Groep/Gebruiker ID",
-    onebotSafetyTips: "Voor de veiligheid moet een toegangssleutel worden ingesteld",
-    "PushDeer Key": "PushDeer Key",
-    "Footer Text": "Footer Tekst",
-    "Show Powered By": "Laat \"Mogeljik gemaakt door\" zien",
-    "Domain Names": "Domein Namen",
-    "pushoversounds pushover": "Pushover (default)",
-    "pushoversounds bike": "Bike",
-    "pushoversounds bugle": "Bugle",
-    "pushoversounds cashregister": "Cash Register",
-    "pushoversounds classical": "Classical",
-    "pushoversounds cosmic": "Cosmic",
-    "pushoversounds falling": "Falling",
-    "pushoversounds gamelan": "Gamelan",
-    "pushoversounds incoming": "Incoming",
-    "pushoversounds intermission": "Intermission",
-    "pushoversounds magic": "Magic",
-    "pushoversounds mechanical": "Mechanical",
-    "pushoversounds pianobar": "Piano Bar",
-    "pushoversounds siren": "Siren",
-    "pushoversounds spacealarm": "Space Alarm",
-    "pushoversounds tugboat": "Tug Boat",
-    "pushoversounds alien": "Alien Alarm (long)",
-    "pushoversounds climb": "Climb (long)",
-    "pushoversounds persistent": "Persistent (long)",
-    "pushoversounds echo": "Pushover Echo (long)",
-    "pushoversounds updown": "Up Down (long)",
-    "pushoversounds vibrate": "Vibrate Only",
-    "pushoversounds none": "None (silent)",
-    dnsPortDescription: "DNS-serverpoort. Standaard ingesteld op 53. Je kunt de poort op elk moment wijzigen.",
-    error: "fout",
-    critical: "kritisch",
-    wayToGetPagerDutyKey: "Je kunt dit krijgen door naar Service -> Service Directory -> (Selecteer een service) -> Integraties -> Integratie toevoegen te gaan. Hier kunt u zoeken naar \"Events API V2\". Meer informatie {0}",
-    "Integration Key": "Integration Key",
-    "Integration URL": "Integration URL",
-    "Auto resolve or acknowledged": "Automatisch oplossen of bevestigen",
-    "do nothing": "niets doen",
-    "auto acknowledged": "automatisch bevestigen",
-    "auto resolve": "automatisch oplossen",
-    Authentication: "authenticatie",
-    signedInDisp: "Aangemeld als {0}",
-    signedInDispDisabled: "Authenticatie uitgeschakeld.",
-    "Certificate Expiry Notification": "Melding over verlopen certificaat",
-    "Recipient Number": "Nummer ontvanger",
-    "From Name/Number": "Van naam/nummer",
-    "Leave blank to use a shared sender number.": "Laat leeg om een gedeeld afzendernummer te gebruiken.",
-    endpoint: "endpoint",
-    pushyAPIKey: "Secret API Key",
-    pushyToken: "Device token",
-    "Show update if available": "Update weergeven indien beschikbaar",
-    "Also check beta release": "Controleer ook de bètaversies",
-    "Using a Reverse Proxy?": "Een reverse proxy gebruiken?",
-    "Check how to config it for WebSocket": "Controleer hoe je het configureert voor een WebSocket",
-    "Steam Game Server": "Steam gameserver",
-    "Most likely causes:": "Meest waarschijnlijke oorzaken:",
-    "The resource is no longer available.": "De paginabron is niet langer beschikbaar.",
-    "There might be a typing error in the address.": "Er zit een typefout in het de URL.",
-    "What you can try:": "Wat je kan proberen:",
-    "Retype the address.": "De URL controleren en/of opnnieuw typen.",
-    "Go back to the previous page.": "Terug naar de vorige pagina.",
-    "Coming Soon": "Binnenkort beschikbaar",
-    wayToGetClickSendSMSToken: "Je kan een  API Username en API Key krijgen vanuit {0} .",
-    "Connection String": "Connection String",
-    Query: "Query",
-    settingsCertificateExpiry: "TLS Certificate Expiry",
-    certificationExpiryDescription: "HTTPS Monitors trigger notification when TLS certificate expires in:",
-    "ntfy Topic": "ntfy Topic",
-    Domain: "Domein",
-    Workstation: "Werkstation",
-    disableCloudflaredNoAuthMsg: "De \"Geen authenticatie\" modus staat aan, wachtwoord is niet vereist.",
-};
diff --git a/src/languages/pl.js b/src/languages/pl.js
deleted file mode 100644
index 04a74997a..000000000
--- a/src/languages/pl.js
+++ /dev/null
@@ -1,644 +0,0 @@
-export default {
-    languageName: "Polski",
-    checkEverySecond: "Sprawdzaj co {0} sekund",
-    retryCheckEverySecond: "Ponawiaj co {0} sekund",
-    retriesDescription: "Maksymalna liczba powtórzeń, zanim usługa zostanie oznaczona jako niedostępna i zostanie wysłane powiadomienie",
-    ignoreTLSError: "Ignoruj błąd TLS/SSL dla stron HTTPS",
-    upsideDownModeDescription: "Odwróć status do góry nogami. Jeśli usługa jest osiągalna, to jest oznaczona jako niedostępna.",
-    maxRedirectDescription: "Maksymalna liczba przekierowań do wykonania. Ustaw na 0, aby wyłączyć przekierowania.",
-    acceptedStatusCodesDescription: "Wybierz kody stanu, które są uważane za prawidłową odpowiedź.",
-    passwordNotMatchMsg: "Powtórzone hasło nie pasuje.",
-    notificationDescription: "Proszę przypisać powiadomienie do monitora(ów), aby działało.",
-    keywordDescription: "Wyszukiwanie słów kluczowych w zwykłym html lub odpowiedzi JSON. Wielkość liter ma znaczenie.",
-    pauseDashboardHome: "Wstrzymane",
-    deleteMonitorMsg: "Czy na pewno chcesz usunąć ten monitor?",
-    deleteNotificationMsg: "Czy na pewno chcesz usunąć to powiadomienie dla wszystkich monitorów?",
-    resolverserverDescription: "Cloudflare jest domyślnym serwerem, możesz zmienić serwer resolver w każdej chwili.",
-    rrtypeDescription: "Wybierz rodzaj rekordu, który chcesz monitorować.",
-    pauseMonitorMsg: "Czy na pewno chcesz wstrzymać monitorowanie?",
-    enableDefaultNotificationDescription: "Dla każdego nowego monitora to powiadomienie będzie domyślnie włączone. Nadal możesz wyłączyć powiadomienia osobno dla każdego monitora.",
-    clearEventsMsg: "Jesteś pewien, że chcesz wyczyścić historię zdarzeń dla tego monitora?",
-    clearHeartbeatsMsg: "Jesteś pewien, że chcesz wyczyścić historię bicia serca dla tego monitora?",
-    confirmClearStatisticsMsg: "Jesteś pewien, że chcesz usunąć WSZYSTKIE statystyki?",
-    importHandleDescription: "Wybierz 'Pomiń istniejące', jeśli chcesz pominąć każdy monitor lub powiadomienie o tej samej nazwie. 'Nadpisz' spowoduje usunięcie każdego istniejącego monitora i powiadomienia.",
-    confirmImportMsg: "Czy na pewno chcesz zaimportować kopię zapasową? Upewnij się, że wybrałeś właściwą opcję importu.",
-    twoFAVerifyLabel: "Proszę, podaj swój token 2FA, aby sprawdzić, czy 2FA działa.",
-    tokenValidSettingsMsg: "Token jest prawidłowy! Teraz możesz zapisać ustawienia 2FA.",
-    confirmEnableTwoFAMsg: "Jesteś pewien, że chcesz włączyć 2FA?",
-    confirmDisableTwoFAMsg: "Jesteś pewien, że chcesz wyłączyć 2FA?",
-    Settings: "Ustawienia",
-    Dashboard: "Panel",
-    "New Update": "Nowa aktualizacja",
-    Language: "Język",
-    Appearance: "Wygląd",
-    Theme: "Motyw",
-    General: "Ogólne",
-    Version: "Wersja",
-    "Check Update On GitHub": "Sprawdź aktualizację na GitHub",
-    List: "Lista",
-    Add: "Dodaj",
-    "Add New Monitor": "Dodaj monitor",
-    "Quick Stats": "Szybki podgląd statystyk",
-    Up: "Online",
-    Down: "Offline",
-    Pending: "Oczekuje",
-    Unknown: "Nieznane",
-    Pause: "Wstrzymaj",
-    Name: "Nazwa",
-    Status: "Status",
-    DateTime: "Data i godzina",
-    Message: "Wiadomość",
-    "No important events": "Brak ważnych wydarzeń",
-    Resume: "Wznów",
-    Edit: "Edytuj",
-    Delete: "Usuń",
-    Current: "Aktualny",
-    Uptime: "Czas pracy",
-    "Cert Exp.": "Certyfikat wygasa",
-    day: "dzień | dni",
-    "-day": " dni",
-    hour: "godzina",
-    "-hour": " godzin",
-    Response: "Odpowiedź",
-    Ping: "Ping",
-    "Monitor Type": "Rodzaj monitora",
-    Keyword: "Słowo kluczowe",
-    "Friendly Name": "Przyjazna nazwa",
-    URL: "URL",
-    Hostname: "Nazwa hosta",
-    Port: "Port",
-    "Heartbeat Interval": "Częstotliwość bicia serca",
-    Retries: "Prób",
-    "Heartbeat Retry Interval": "Częstotliwość ponawiania bicia serca",
-    Advanced: "Zaawansowane",
-    "Upside Down Mode": "Tryb odwrócony",
-    "Max. Redirects": "Maks. przekierowań",
-    "Accepted Status Codes": "Akceptowane kody statusu",
-    Save: "Zapisz",
-    Notifications: "Powiadomienia",
-    "Not available, please setup.": "Niedostępne, proszę skonfigurować.",
-    "Setup Notification": "Skonfiguruj powiadomienie",
-    Light: "Jasny",
-    Dark: "Ciemny",
-    Auto: "Automatyczny",
-    "Theme - Heartbeat Bar": "Motyw - pasek bicia serca",
-    Normal: "Domyślne",
-    Bottom: "Na dole",
-    None: "Brak",
-    Timezone: "Strefa czasowa",
-    "Search Engine Visibility": "Widoczność w wyszukiwarce",
-    "Allow indexing": "Zezwól na indeksowanie",
-    "Discourage search engines from indexing site": "Zniechęcaj wyszukiwarki do indeksowania strony",
-    "Change Password": "Zmień hasło",
-    "Current Password": "Aktualne hasło",
-    "New Password": "Nowe hasło",
-    "Repeat New Password": "Powtórz nowe hasło",
-    "Update Password": "Zaktualizuj hasło",
-    "Disable Auth": "Wyłącz autoryzację",
-    "Enable Auth": "Włącz autoryzację",
-    "disableauth.message1": "Czy na pewno chcesz <strong>wyłączyć autoryzację</strong>?",
-    "disableauth.message2": "Jest przeznaczony dla <strong>kogoś, kto ma autoryzację zewnętrzną</strong> przed Uptime Kuma, taką jak Cloudflare Access.",
-    "Please use this option carefully!": "Proszę używać ostrożnie.",
-    Logout: "Wyloguj",
-    Leave: "Zostaw",
-    "I understand, please disable": "Rozumiem, proszę wyłączyć",
-    Confirm: "Potwierdź",
-    Yes: "Tak",
-    No: "Nie",
-    Username: "Nazwa użytkownika",
-    Password: "Hasło",
-    "Remember me": "Zapamiętaj mnie",
-    Login: "Zaloguj",
-    "No Monitors, please": "Brak monitorów, proszę",
-    "add one": "dodać jeden",
-    "Notification Type": "Rodzaj powiadomienia",
-    Email: "E-mail",
-    Test: "Test",
-    "Certificate Info": "Informacje o certyfikacie",
-    "Resolver Server": "Serwer rozwiązywania nazw",
-    "Resource Record Type": "Typ rekordu zasobów",
-    "Last Result": "Ostatni wynik",
-    "Create your admin account": "Utwórz swoje konto administratora",
-    "Repeat Password": "Powtórz hasło",
-    "Import Backup": "Importuj kopię zapasową",
-    "Export Backup": "Eksportuj kopię zapasową",
-    Export: "Eksportuj",
-    Import: "Importuj",
-    respTime: "Czas odp. (ms)",
-    notAvailableShort: "N/D",
-    "Default enabled": "Włącz domyślnie",
-    "Apply on all existing monitors": "Zastosuj do istniejących monitorów",
-    Create: "Stwórz",
-    "Clear Data": "Usuń dane",
-    Events: "Wydarzenia",
-    Heartbeats: "Bicia serca",
-    "Auto Get": "Wykryj",
-    backupDescription: "Możesz wykonać kopię zapasową wszystkich monitorów i wszystkich powiadomień do pliku JSON.",
-    backupDescription2: "PS: Historia i dane zdarzeń nie są uwzględniane.",
-    backupDescription3: "Poufne dane, takie jak tokeny powiadomień, są zawarte w pliku eksportu, prosimy o ostrożne przechowywanie.",
-    alertNoFile: "Wybierz plik do importu.",
-    alertWrongFileType: "Proszę wybrać plik JSON.",
-    "Clear all statistics": "Wyczyść wszystkie statystyki",
-    "Skip existing": "Pomiń istniejące",
-    Overwrite: "Nadpisz",
-    Options: "Opcje",
-    "Keep both": "Zachowaj oba",
-    "Verify Token": "Zweryfikuj token",
-    "Setup 2FA": "Konfiguracja 2FA",
-    "Enable 2FA": "Włącz 2FA",
-    "Disable 2FA": "Wyłącz 2FA",
-    "2FA Settings": "Ustawienia 2FA",
-    "Two Factor Authentication": "Uwierzytelnienie dwuskładnikowe",
-    Active: "Włączone",
-    Inactive: "Wyłączone",
-    Token: "Token",
-    "Show URI": "Pokaż URI",
-    Tags: "Tagi",
-    "Add New below or Select...": "Dodaj nowy poniżej lub wybierz...",
-    "Tag with this name already exist.": "Tag o tej nazwie już istnieje.",
-    "Tag with this value already exist.": "Tag o tej wartości już istnieje.",
-    color: "kolor",
-    "value (optional)": "wartość (opcjonalnie)",
-    Gray: "Szary",
-    Red: "Czerwony",
-    Orange: "Pomarańczowy",
-    Green: "Zielony",
-    Blue: "Niebieski",
-    Indigo: "Indygo",
-    Purple: "Fioletowy",
-    Pink: "Różowy",
-    "Search...": "Szukaj...",
-    "Avg. Ping": "Średni ping",
-    "Avg. Response": "Średnia odpowiedź",
-    "Entry Page": "Strona startowa",
-    statusPageNothing: "Nic tu nie ma, dodaj grupę lub monitor.",
-    "No Services": "Brak usług",
-    "All Systems Operational": "Wszystkie systemy działają poprawnie",
-    "Partially Degraded Service": "Część usług nie działa",
-    "Degraded Service": "Usługa nie działa",
-    "Add Group": "Dodaj grupę",
-    "Add a monitor": "Dodaj monitor",
-    "Edit Status Page": "Edytuj stronę statusu",
-    "Go to Dashboard": "Idź do panelu",
-    "Status Page": "Strona statusu",
-    "Status Pages": "Strony statusów",
-    defaultNotificationName: "Moje powiadomienie {notification} ({number})",
-    here: "tutaj",
-    Required: "Wymagane",
-    telegram: "Telegram",
-    "Bot Token": "Token bota",
-    wayToGetTelegramToken: "Token można uzyskać z {0}.",
-    "Chat ID": "Identyfikator czatu",
-    supportTelegramChatID: "Czat wsparcia technicznego / Bezpośrednia rozmowa / Czat grupowy",
-    wayToGetTelegramChatID: "Możesz uzyskać swój identyfikator czatu, wysyłając wiadomość do bota i przechodząc pod ten adres URL, aby wyświetlić identyfikator czatu:",
-    "YOUR BOT TOKEN HERE": "TWÓJ TOKEN BOTA",
-    chatIDNotFound: "Identyfikator czatu nie znaleziony, najpierw napisz do bota",
-    webhook: "Webhook",
-    "Post URL": "Adres URL",
-    "Content Type": "Rodzaj danych",
-    webhookJsonDesc: "{0} jest dobry w przypadku serwerów HTTP, takich jak express.js",
-    webhookFormDataDesc: "{multipart} jest dobry dla PHP, musisz jedynie przetworzyć dane przez {decodeFunction}",
-    smtp: "Email (SMTP)",
-    secureOptionNone: "Brak / STARTTLS (25, 587)",
-    secureOptionTLS: "TLS (465)",
-    "Ignore TLS Error": "Zignoruj błędy TLS",
-    "From Email": "Nadawca (OD)",
-    "To Email": "Odbiorca (DO)",
-    smtpCC: "DW",
-    smtpBCC: "UDW",
-    discord: "Discord",
-    "Discord Webhook URL": "URL webhook Discorda",
-    wayToGetDiscordURL: "Możesz go uzyskać, przechodząc do Ustawienia serwera -> Integracje -> Tworzenie webhooka",
-    "Bot Display Name": "Wyświetlana nazwa bota",
-    "Prefix Custom Message": "Własny początek wiadomości",
-    "Hello @everyone is...": "Hej {'@'}everyone ...",
-    teams: "Microsoft Teams",
-    "Webhook URL": "URL webhooka",
-    wayToGetTeamsURL: "Możesz dowiedzieć się, jak utworzyć adres url webhooka {0}.",
-    signal: "Signal",
-    Number: "Numer",
-    Recipients: "Odbiorcy",
-    needSignalAPI: "Musisz mieć klienta Signal z REST API.",
-    wayToCheckSignalURL: "W celu dowiedzenia się, jak go skonfigurować, odwiedź poniższy link:",
-    signalImportant: "UWAGA: Nie można mieszać nazw grup i numerów odbiorców!",
-    gotify: "Gotify",
-    "Application Token": "Token aplikacji",
-    "Server URL": "Server URL",
-    Priority: "Priorytet",
-    slack: "Slack",
-    "Icon Emoji": "Ikona emoji",
-    "Channel Name": "Nazwa kanału",
-    "Uptime Kuma URL": "Adres Uptime Kuma",
-    aboutWebhooks: "Więcej informacji na temat webhooków: {0}",
-    aboutChannelName: "Podaj nazwę kanału {0} w polu Nazwa kanału, jeśli chcesz pominąć kanał webhooka. Np.: #inny-kanal",
-    aboutKumaURL: "Jeśli pozostawisz pole Adres Uptime Kuma puste, domyślnie będzie to strona projektu na GitHub.",
-    emojiCheatSheet: "Ściąga emoji: {0}",
-    "rocket.chat": "Rocket.chat",
-    pushover: "Pushover",
-    pushy: "Pushy",
-    PushByTechulus: "Push od Techulus",
-    octopush: "Octopush",
-    promosms: "PromoSMS",
-    lunasea: "LunaSea",
-    apprise: "Apprise (obsługuje 50+ usług powiadomień)",
-    GoogleChat: "Google Chat (wyłącznie Google Workspace)",
-    pushbullet: "Pushbullet",
-    line: "Line Messenger",
-    mattermost: "Mattermost",
-    "User Key": "Klucz użytkownika",
-    Device: "Urządzenie",
-    "Message Title": "Tytuł wiadomości",
-    "Notification Sound": "Dźwięk powiadomienia",
-    "More info on:": "Więcej informacji na: {0}",
-    pushoverDesc1: "Priorytet awaryjny (2) ma domyślny 30-sekundowy limit czasu między kolejnymi próbami i wygaśnie po 1 godzinie.",
-    pushoverDesc2: "Jeśli chcesz wysyłać powiadomienia na różne urządzenia, wypełnij pole Urządzenie.",
-    "SMS Type": "Rodzaj SMS",
-    octopushTypePremium: "Premium (szybki - rekomendowany dla powiadomień)",
-    octopushTypeLowCost: "Low Cost (wolny, czasami blokowany przez operatorów)",
-    "Check octopush prices": "Sprawdź ceny Octopush {0}.",
-    octopushPhoneNumber: "Numer telefonu (format międzynarodowy np.: +33612345678)",
-    octopushSMSSender: "Nadawca SMS: 3-11 znaków alfanumerycznych i spacji (a-zA-Z0-9)",
-    "LunaSea Device ID": "Identyfikator urządzenia LunaSea",
-    "Apprise URL": "URL Apprise",
-    "Example:": "Przykład: {0}",
-    "Read more:": "Czytaj dalej: {0}",
-    "Status:": "Status: {0}",
-    "Read more": "Czytaj dalej",
-    appriseInstalled: "Apprise jest zainstalowane.",
-    appriseNotInstalled: "Apprise nie zostało zainstalowane. {0}",
-    "Access Token": "Token dostępu",
-    "Channel access token": "Token dostępu kanału",
-    "Line Developers Console": "Konsola deweloperska Line",
-    lineDevConsoleTo: "Konsola deweloperska Line - {0}",
-    "Basic Settings": "Ustawienia ogólne",
-    "User ID": "Identyfikator użytkownika",
-    "Messaging API": "API wiadomości",
-    wayToGetLineChannelToken: "Najpierw uzyskaj dostęp do {0}, utwórz dostawcę i kanał (Messaging API), a następnie możesz uzyskać token dostępu do kanału i identyfikator użytkownika z wyżej wymienionych pozycji menu.",
-    "Icon URL": "Adres Ikony",
-    aboutIconURL: "Możesz podać link do zdjęcia w \"Adres URL ikony\", aby zastąpić domyślne zdjęcie profilowe. Nie będzie używany, jeśli ustawiona jest ikona emoji.",
-    aboutMattermostChannelName: "Możesz zastąpić domyślny kanał, na którym publikowane są posty webhooka, wpisując nazwę kanału w polu \"Nazwa kanału\". Należy to włączyć w ustawieniach webhooka Mattermost. Np.: #inny-kanał",
-    matrix: "Matrix",
-    promosmsTypeEco: "SMS ECO - tanie, lecz wolne. Dostępne tylko w Polsce",
-    promosmsTypeFlash: "SMS FLASH - wiadomość automatycznie wyświetli się na urządzeniu. Dostępne tylko w Polsce.",
-    promosmsTypeFull: "SMS FULL - szybkie i dostępne międzynarodowo. Wersja premium usługi, która pozwala min. ustawić własną nazwę nadawcy.",
-    promosmsTypeSpeed: "SMS SPEED - wysyłka priorytetowa, ma wszystkie zalety SMS FULL",
-    promosmsPhoneNumber: "Numer odbiorcy",
-    promosmsSMSSender: "Nadawca SMS (wcześniej zatwierdzone nazwy z panelu PromoSMS)",
-    "Primary Base URL": "Główny URL",
-    "Push URL": "Push URL",
-    needPushEvery: "Powinieneś wywoływać ten URL co {0} sekund",
-    pushOptionalParams: "Parametry opcjonalne: {0}",
-    emailCustomSubject: "Niestandardowy temat",
-    checkPrice: "Sprawdź ceny {0}:",
-    octopushLegacyHint: "Czy używasz starszej wersji Octopush (2011-2020) czy nowej wersji?",
-    "Feishu WebHookUrl": "Feishu WebHookURL",
-    matrixHomeserverURL: "Adres URL serwera domowego (z http(s):// i opcjonalnie port)",
-    "Internal Room Id": "Wewnętrzne ID pokoju",
-    matrixDesc1: "Możesz znaleźć wewnętrzne ID pokoju, patrząc w zaawansowanej sekcji ustawień pokoju w twoim kliencie Matrix. Powinien on wyglądać jak !QMdRCpUIfLwsfjxye6:home.server.",
-    matrixDesc2: "Jest wysoce zalecane, abyś stworzył nowego użytkownika i nie używał tokena dostępu swojego użytkownika Matrix, ponieważ pozwoli on na pełny dostęp do twojego konta i wszystkich pokoi, do których dołączyłeś. Zamiast tego, utwórz nowego użytkownika i zaproś go tylko do pokoju, w którym chcesz otrzymywać powiadomienia. Możesz uzyskać token dostępu przez uruchomienie {0}",
-    Method: "Metoda",
-    Body: "Treść",
-    Headers: "Nagłówki",
-    PushUrl: "Push URL",
-    HeadersInvalidFormat: "Nagłówki żądania nie są w poprawnym formacie JSON: ",
-    BodyInvalidFormat: "Treść żądania nie jest w poprawnym formacie JSON: ",
-    "Monitor History": "Historia monitorów",
-    clearDataOlderThan: "Przechowuj dane dotyczące historii monitorowania {0} dni.",
-    PasswordsDoNotMatch: "Hasła nie pasują.",
-    records: "rekordy",
-    "One record": "Jeden rekord",
-    steamApiKeyDescription: "Do monitorowania serwera gier Steam potrzebny jest klucz Steam Web-API. Możesz zarejestrować swój klucz API tutaj: ",
-    "Current User": "Aktualny użytkownik",
-    topic: "Temat",
-    topicExplanation: "Temat MQTT do monitorowania",
-    successMessage: "Komunikat o powodzeniu",
-    successMessageExplanation: "Komunikat MQTT, który zostanie uznany za powodzenie",
-    recent: "Ostatnie",
-    Done: "Zrobione",
-    Info: "Info",
-    Security: "Bezpieczeństwo",
-    "Steam API Key": "Klucz Steam API",
-    "Shrink Database": "Zmniejsz bazę danych",
-    "Pick a RR-Type...": "Wybierz typ RR...",
-    "Pick Accepted Status Codes...": "Wybierz akceptowalne kody statusu...",
-    Default: "Domyślnie",
-    "HTTP Options": "Opcje HTTP",
-    "Create Incident": "Stwórz incydent",
-    Title: "Tytuł",
-    Content: "Treść",
-    Style: "Styl",
-    info: "info",
-    warning: "ostrzeżenie",
-    danger: "niebezpieczeństwo",
-    primary: "podstawowy",
-    light: "jasny",
-    dark: "ciemny",
-    Post: "Wyślij",
-    "Please input title and content": "Podaj tytuł i treść",
-    Created: "Stworzony",
-    "Last Updated": "Ostatnio zaktualizowany",
-    Unpin: "Odepnij",
-    "Switch to Light Theme": "Przełącz na jasny motyw",
-    "Switch to Dark Theme": "Przełącz na ciemny motyw",
-    "Show Tags": "Pokaż tagi",
-    "Hide Tags": "Ukryj tagi",
-    Description: "Opis",
-    "No monitors available.": "Brak dostępnych monitorów.",
-    "Add one": "Dodaj jeden",
-    "No Monitors": "Brak monitorów",
-    "Untitled Group": "Nienazwana grupa",
-    Services: "Usługi",
-    Discard: "Odrzuć",
-    Cancel: "Anuluj",
-    "Powered by": "Napędzane przez",
-    shrinkDatabaseDescription: "Uruchom VACUUM na bazie SQLite. Jeżeli twoja baza została stworzona po wersji 1.10.0, to ma już włączoną opcję AUTO_VACUUM i stosowanie ręcznego oczyszczania nie jest potrzebne.",
-    clicksendsms: "ClickSend SMS",
-    apiCredentials: "Poświadczenia API",
-    serwersms: "SerwerSMS.pl",
-    serwersmsAPIUser: "Nazwa użytkownika API (z prefiksem webapi_)",
-    serwersmsAPIPassword: "Hasło API",
-    serwersmsPhoneNumber: "Numer telefonu",
-    serwersmsSenderName: "Nazwa nadawcy (zatwierdzona w panelu klienta)",
-    smseagle: "SMSEagle",
-    smseagleTo: "Numer/y telefonu",
-    smseagleGroup: "Grupa/y z Książki adresowej",
-    smseagleContact: "Kontakt/y z Książki adresowej",
-    smseagleRecipientType: "Typ odbiorcy",
-    smseagleRecipient: "Odbiorca/y (wiele musi być oddzielone przecinkami)",
-    smseagleToken: "Klucz dostępu API",
-    smseagleUrl: "URL Twojego urządzenia SMSEagle",
-    smseagleEncoding: "Wyślij jako Unicode",
-    smseaglePriority: "Priorytet wiadomości (0-9, domyślnie = 0)",
-    stackfield: "Stackfield",
-    Customize: "Dostosuj",
-    "Custom Footer": "Niestandardowa stopka",
-    "Custom CSS": "Niestandardowy CSS",
-    smtpDkimSettings: "Ustawienia DKIM",
-    smtpDkimDesc: "Zapoznaj się z Nodemailer DKIM {0}, aby dowiedzieć się więcej",
-    documentation: "dokumentacja",
-    smtpDkimDomain: "Nazwa domeny",
-    smtpDkimKeySelector: "Selektor klucza",
-    smtpDkimPrivateKey: "Klucz prywatny",
-    smtpDkimHashAlgo: "Algorytm haszujący (opcjonalne)",
-    smtpDkimheaderFieldNames: "Klucze nagłówka do podpisu (opcjonalne)",
-    smtpDkimskipFields: "Klucze nagłówka do pominięcia (opcjonalne)",
-    gorush: "Gorush",
-    alerta: "Alerta",
-    alertaApiEndpoint: "Punkt końcowy API",
-    alertaEnvironment: "Środowisko",
-    alertaApiKey: "Klucz API",
-    alertaAlertState: "Alert State",
-    alertaRecoverState: "Recover State",
-    deleteStatusPageMsg: "Jesteś pewien, że chcesz usunąć tę stronę statusów?",
-    Proxies: "Proxy",
-    default: "Domyślny",
-    enabled: "Włączony",
-    setAsDefault: "Ustaw jako domyślny",
-    deleteProxyMsg: "Jesteś pewien, że chcesz usunąć proxy ze wszystkich monitorów?",
-    proxyDescription: "Proxy muszą być przypisane do monitora, aby działały.",
-    enableProxyDescription: "Ten serwer proxy nie będzie miał wpływu na żądania monitorów, dopóki nie zostanie aktywowany. Możesz kontrolować tymczasowe wyłączenie serwera proxy ze wszystkich monitorów za pomocą statusu aktywacji.",
-    setAsDefaultProxyDescription: "Ten serwer proxy będzie domyślnie włączony dla nowych monitorów. Można go jednak wyłączyć osobno dla każdego monitora.",
-    "Certificate Chain": "Łańcuch certyfikatów",
-    Valid: "Ważny",
-    Invalid: "Nieważny",
-    AccessKeyId: "AccessKey ID",
-    SecretAccessKey: "AccessKey Sekret",
-    PhoneNumbers: "Numery telefonów",
-    TemplateCode: "Kod szablonu",
-    SignName: "Podpis",
-    "Sms template must contain parameters: ": "Szablon sms musi posiadać parametry: ",
-    "Bark Endpoint": "Punkt końcowy Bark",
-    WebHookUrl: "WebHookUrl",
-    SecretKey: "Tajny klucz",
-    "For safety, must use secret key": "Ze względów bezpieczeństwa musisz użyć tajnego klucza",
-    "Device Token": "Device Token",
-    Platform: "Platforma",
-    iOS: "iOS",
-    Android: "Android",
-    Huawei: "Huawei",
-    High: "Wysoki",
-    Retry: "Ponów",
-    Topic: "Temat",
-    "WeCom Bot Key": "Klucz bota WeCom",
-    "Setup Proxy": "Skonfiguruj proxy",
-    "Proxy Protocol": "Protokół proxy",
-    "Proxy Server": "Serwer proxy",
-    "Proxy server has authentication": "Serwer proxy ma autoryzację",
-    User: "Użytkownik",
-    Installed: "Zainstalowany",
-    "Not installed": "Nie zainstalowany",
-    Running: "Działa",
-    "Not running": "Nie działa",
-    "Remove Token": "Usuń token",
-    Start: "Start",
-    Stop: "Stop",
-    "Uptime Kuma": "Uptime Kuma",
-    "Add New Status Page": "Dodaj nową stronę statusów",
-    Slug: "Symbol",
-    "Accept characters:": "Dozwolone znaki:",
-    startOrEndWithOnly: "Zaczynające się i kończące wyłącznie {0} znakami",
-    "No consecutive dashes": "Bez powtarzających się myślników",
-    Next: "Dalej",
-    "The slug is already taken. Please choose another slug.": "Ten symbol jest już zajęty. Proszę, wybierz inny.",
-    "No Proxy": "Bez proxy",
-    Authentication: "Uwierzytelnianie",
-    "HTTP Basic Auth": "Podstawowa autoryzacja HTTP",
-    "New Status Page": "Nowa strona statusu",
-    "Page Not Found": "Strona nie została znaleziona",
-    "Reverse Proxy": "Zwrotny serwer proxy",
-    Backup: "Backup",
-    About: "O skrypcie",
-    wayToGetCloudflaredURL: "(Pobierz cloudflared z {0})",
-    cloudflareWebsite: "Strona Cloudflare",
-    "Message:": "Wiadomość:",
-    "Don't know how to get the token? Please read the guide:": "Nie wiesz jak uzyksać token? Przeczytaj proszę poradnik:",
-    "The current connection may be lost if you are currently connecting via Cloudflare Tunnel. Are you sure want to stop it? Type your current password to confirm it.": "Bieżące połączenie może zostać utracone, jeśli aktualnie łączysz się przez tunel Cloudflare. Czy na pewno chcesz to przerwać? Wpisz swoje aktualne hasło, aby je potwierdzić.",
-    "Other Software": "Inne oprogramowanie",
-    "For example: nginx, Apache and Traefik.": "Na przykład: nginx, Apache i Traefik.",
-    "Please read": "Przeczytaj proszę",
-    "Subject:": "Temat:",
-    "Valid To:": "Ważny do:",
-    "Days Remaining:": "Pozostało dni:",
-    "Issuer:": "Wydawca:",
-    "Fingerprint:": "Odcisk palca:",
-    "No status pages": "Brak stron statusów",
-    "Domain Name Expiry Notification": "Powiadomienie o wygasaniu domeny",
-    Proxy: "Proxy",
-    "Date Created": "Data stworzenia",
-    onebotHttpAddress: "Adres HTTP OneBot",
-    onebotMessageType: "Rodzaj wiadomości OneBot",
-    onebotGroupMessage: "Grupowa",
-    onebotPrivateMessage: "Prywatna",
-    onebotUserOrGroupId: "ID Grupy/Użytkownika",
-    onebotSafetyTips: "Ze względów bezpieczeństwa musisz ustawić token dostępu",
-    "PushDeer Key": "Klucz PushDeer",
-    "Footer Text": "Treść stopki",
-    "Show Powered By": "Pokaż co napędza stronę",
-    "Domain Names": "Domeny",
-    signedInDisp: "Zalogowany jako {0}",
-    signedInDispDisabled: "Autoryzacja wyłączona.",
-    resendEveryXTimes: "Wysyłaj ponownie co {0} razy",
-    resendDisabled: "Ponowne wysyłanie jest wyłączone",
-    Maintenance: "Konserwacja",
-    statusMaintenance: "Konserwacja",
-    "Schedule maintenance": "Planowanie konserwacji",
-    "Affected Monitors": "Monitory dotknięte problemem",
-    "Pick Affected Monitors...": "Wybierz monitory, których to dotyczy...",
-    "Start of maintenance": "Rozpoczęcie konserwacji",
-    "All Status Pages": "Wszystkie strony statusu",
-    "Select status pages...": "Wybierz strony statusu...",
-    recurringIntervalMessage: "Uruchom raz dziennie | Uruchom raz na {0} dni",
-    affectedMonitorsDescription: "Wybierz monitory, których dotyczy bieżąca konserwacja",
-    affectedStatusPages: "Pokaż ten komunikat o konserwacji na wybranych stronach statusu",
-    atLeastOneMonitor: "Wybierz co najmniej jeden monitor, którego dotyczy problem",
-    deleteMaintenanceMsg: "Czy na pewno chcesz usunąć tę konserwację?",
-    dnsPortDescription: "Port serwera DNS. Domyślnie 53. Możesz zmienić port w dowolnym momencie.",
-    "Resend Notification if Down X times consequently": "Wyślij ponownie powiadomienie, jeśli nie działa X razy pod rząd",
-    error: "błąd",
-    critical: "krytyczny",
-    wayToGetPagerDutyKey: "Możesz to uzyskać, przechodząc do Service -> Service Directory -> (wybierz usługę) -> Integrations -> Add integration. Tutaj możesz wyszukać \"Events API V2\". Więcej informacji {0}",
-    "Integration Key": "Klucz integracji",
-    "Integration URL": "Adres URL integracji",
-    "Auto resolve or acknowledged": "Automatycznie rozwiązany lub potwierdzony",
-    "do nothing": "nie rób nic",
-    "auto acknowledged": "auto potwierdzony",
-    "auto resolve": "automatycznie rozwiązany",
-    "Bark Group": "Grupa Bark",
-    "Bark Sound": "Dźwięk Bark",
-    "HTTP Headers": "Nagłówki HTTP",
-    "Trust Proxy": "Ufaj proxy",
-    HomeAssistant: "Home Assistant",
-    RadiusSecret: "Sekretny klucz Radius",
-    RadiusSecretDescription: "Współdzielony sekretny klucz pomiędzy klientem a serwerem",
-    RadiusCalledStationId: "Id stacji wywoływanej",
-    RadiusCalledStationIdDescription: "Identyfikator wywoływanego urządzenia",
-    RadiusCallingStationId: "Id stacji wywoławczej",
-    RadiusCallingStationIdDescription: "Identyfikator urządzenia wywołującego",
-    "Certificate Expiry Notification": "Powiadomienie o wygaśnięciu certyfikatu",
-    "API Username": "Nazwa użytkownika API",
-    "API Key": "Klucz API",
-    "Recipient Number": "Numer odbiorcy",
-    "From Name/Number": "Od nazwa/numer",
-    "Leave blank to use a shared sender number.": "Pozostaw puste, aby użyć wspólnego numeru nadawcy.",
-    "Octopush API Version": "Wersja API Octopush",
-    "Legacy Octopush-DM": "Starsze Octopush-DM",
-    endpoint: "punkt końcowy",
-    octopushAPIKey: "\"API key\" z poświadczeń HTTP API w panelu sterowania",
-    octopushLogin: "\"Login\" z poświadczeń HTTP API w panelu sterowania",
-    promosmsLogin: "Nazwa logowania API",
-    promosmsPassword: "Hasło API",
-    "pushoversounds pushover": "Pushover (domyślny)",
-    "pushoversounds bike": "Bike",
-    "pushoversounds bugle": "Bugle",
-    "pushoversounds cashregister": "Cash Register",
-    "pushoversounds classical": "Classical",
-    "pushoversounds cosmic": "Cosmic",
-    "pushoversounds falling": "Falling",
-    "pushoversounds gamelan": "Gamelan",
-    "pushoversounds incoming": "Incoming",
-    "pushoversounds intermission": "Intermission",
-    "pushoversounds magic": "Magic",
-    "pushoversounds mechanical": "Mechanical",
-    "pushoversounds pianobar": "Piano Bar",
-    "pushoversounds siren": "Siren",
-    "pushoversounds spacealarm": "Space Alarm",
-    "pushoversounds tugboat": "Tug Boat",
-    "pushoversounds alien": "Alien Alarm (długie)",
-    "pushoversounds climb": "Climb (długie)",
-    "pushoversounds persistent": "Persistent (długie)",
-    "pushoversounds echo": "Pushover Echo (długie)",
-    "pushoversounds updown": "Up Down (długie)",
-    "pushoversounds vibrate": "Tylko wibracje",
-    "pushoversounds none": "Brak (cisza)",
-    pushyAPIKey: "Tajny klucz API",
-    pushyToken: "Token urządzenia",
-    "Show update if available": "Pokaż aktualizację, jeśli jest dostępna",
-    "Also check beta release": "Sprawdź również wydanie beta",
-    "Using a Reverse Proxy?": "Używasz odwróconego proxy?",
-    "Check how to config it for WebSocket": "Sprawdź jak go skonfigurować dla WebSocket",
-    "Steam Game Server": "Serwer gry Steam",
-    "Most likely causes:": "Najbardziej prawdopodobne przyczyny:",
-    "The resource is no longer available.": "Zasób nie jest już dostępny.",
-    "There might be a typing error in the address.": "W adresie może być błąd w pisowni.",
-    "What you can try:": "Co możesz spróbować:",
-    "Retype the address.": "Ponownie wpisz adres.",
-    "Go back to the previous page.": "Wróć do poprzedniej strony.",
-    "Coming Soon": "Wkrótce",
-    wayToGetClickSendSMSToken: "Możesz uzyskać nazwę użytkownika API i klucz API z {0}.",
-    "Connection String": "Ciąg połączenia",
-    Query: "Zapytanie",
-    settingsCertificateExpiry: "Wygaśnięcie certyfikatu TLS",
-    certificationExpiryDescription: "Monitory HTTPS uruchamiają powiadomienia o wygaśnięciu certyfikatu TLS w:",
-    "Setup Docker Host": "Konfiguracja hosta Docker",
-    "Connection Type": "Typ połączenia",
-    "Docker Daemon": "Demon Dockera",
-    deleteDockerHostMsg: "Czy na pewno chcesz usunąć ten host Dockera dla wszystkich monitorów?",
-    socket: "Gniazdo",
-    tcp: "TCP / HTTP",
-    "Docker Container": "Kontener Dockera",
-    "Container Name / ID": "Nazwa kontenera / ID",
-    "Docker Host": "Host Dockera",
-    "Docker Hosts": "Hosty Dockera",
-    "ntfy Topic": "Temat ntfy",
-    Domain: "Domena",
-    Workstation: "Stacja robocza",
-    disableCloudflaredNoAuthMsg: "Jesteś w trybie No Auth, hasło nie jest wymagane.",
-    trustProxyDescription: "Zaufaj nagłówkom 'X-Forwarded-*'. Jeśli chcesz uzyskać poprawne IP klienta, a twój Uptime Kuma jest za Nginx lub Apache, powinieneś to włączyć.",
-    wayToGetLineNotifyToken: "Możesz uzyskać token dostępu z {0}",
-    Examples: "Przykłady",
-    "Home Assistant URL": "URL Home Assistant",
-    "Long-Lived Access Token": "Długotrwały token dostępu",
-    "Long-Lived Access Token can be created by clicking on your profile name (bottom left) and scrolling to the bottom then click Create Token. ": "Długotrwały token dostępu można utworzyć klikając na nazwę swojego profilu (na dole po lewej stronie) i przewijając do dołu, a następnie klikając Create Token. ",
-    "Notification Service": "Usługa powiadamiania",
-    "default: notify all devices": "domyślnie: powiadamiaj wszystkie urządzenia",
-    "A list of Notification Services can be found in Home Assistant under \"Developer Tools > Services\" search for \"notification\" to find your device/phone name.": "Listę usług powiadamiania można znaleźć w Home Assistant pod \"Developer Tools > Services\" wyszukaj \"notification\", aby znaleźć nazwę swojego urządzenia/telefonu.",
-    "Automations can optionally be triggered in Home Assistant:": "Automaty mogą być opcjonalnie uruchamiane w Home Assistant:",
-    "Trigger type:": "Typ wyzwalacza:",
-    "Event type:": "Typ zdarzenia:",
-    "Event data:": "Dane o zdarzeniu:",
-    "Then choose an action, for example switch the scene to where an RGB light is red.": "Następnie wybierz akcję, na przykład przełącz scenę na taką, w której światło RGB jest czerwone.",
-    "Frontend Version": "Wersja frontu",
-    "Frontend Version do not match backend version!": "Wersja frontu nie pasuje do wersji backendu!",
-    "Base URL": "Bazowy adres URL",
-    goAlertInfo: "GoAlert to aplikacja open source do planowania, automatycznych eskalacji i powiadomień (jak SMS lub połączenia głosowe). Automatycznie angażuj właściwą osobę, we właściwy sposób i we właściwym czasie! {0}",
-    goAlertIntegrationKeyInfo: "Pobierz generyczny klucz integracyjny API dla usługi, którego wartość skopiowanego tokena URL jest zwykle w formacie \"aaaaaaaa-bbb-cccc-dddd-eeeeee\".",
-    goAlert: "GoAlert",
-    backupOutdatedWarning: "Przestarzałe: ponieważ dodano wiele funkcji i funkcja tworzenia kopii zapasowych nie jest wystarczająco utrzymywana, nie może generować ani przywracać pełnej kopii zapasowej.",
-    backupRecommend: "Zamiast tego należy wykonać bezpośrednią kopię zapasową woluminu lub folderu danych (./data/).",
-    Optional: "Opcjonalne",
-    squadcast: "Squadcast",
-    SendKey: "SendKey",
-    "SMSManager API Docs": "Dokumentacja API SMSManager ",
-    "Gateway Type": "Typ bramy",
-    SMSManager: "SMSManager",
-    "You can divide numbers with": "Możesz dzielić liczby przez",
-    or: "lub",
-    recurringInterval: "odstęp czasu",
-    Recurring: "powtarzający się",
-    strategyManual: "Aktywowany/dezaktywowany ręcznie",
-    warningTimezone: "Używa strefy czasowej serwera",
-    weekdayShortMon: "pon",
-    weekdayShortTue: "wt",
-    weekdayShortWed: "śr",
-    weekdayShortThu: "czw",
-    weekdayShortFri: "pt",
-    weekdayShortSat: "sob",
-    weekdayShortSun: "niedz",
-    dayOfWeek: "Dzień tygodnia",
-    dayOfMonth: "Dzień miesiąca",
-    lastDay: "Ostatni dzień",
-    lastDay1: "Ostatni dzień miesiąca",
-    lastDay2: "2. ostatni dzień miesiąca",
-    lastDay3: "3. ostatni dzień miesiąca",
-    lastDay4: "4. ostatni dzień miesiąca",
-    "No Maintenance": "Brak konserwacji",
-    pauseMaintenanceMsg: "Jesteś pewien, że chcesz zatrzymać?",
-    "maintenanceStatus-under-maintenance": "Podczas konserwacji",
-    "maintenanceStatus-inactive": "Nieaktywny",
-    "maintenanceStatus-scheduled": "Zaplanowany",
-    "maintenanceStatus-ended": "Zakończony",
-    "maintenanceStatus-unknown": "Nieznany",
-    "Display Timezone": "Wyświetlana strefa czasowa",
-    "Server Timezone": "Strefa czasowa serwera",
-    statusPageMaintenanceEndDate: "Koniec",
-};
diff --git a/src/languages/pt-BR.js b/src/languages/pt-BR.js
deleted file mode 100644
index 7bc8d0fd7..000000000
--- a/src/languages/pt-BR.js
+++ /dev/null
@@ -1,203 +0,0 @@
-export default {
-    languageName: "Português (Brasileiro)",
-    checkEverySecond: "Verificar cada {0} segundos.",
-    retryCheckEverySecond: "Tentar novamente a cada {0} segundos.",
-    retriesDescription: "Máximo de tentativas antes que o serviço seja marcado como inativo e uma notificação seja enviada",
-    ignoreTLSError: "Ignorar erros TLS/SSL para sites HTTPS",
-    upsideDownModeDescription: "Inverta o status de cabeça para baixo. Se o serviço estiver acessível, ele está OFFLINE.",
-    maxRedirectDescription: "Número máximo de redirecionamentos a seguir. Defina como 0 para desativar redirecionamentos.",
-    acceptedStatusCodesDescription: "Selecione os códigos de status que são considerados uma resposta bem-sucedida.",
-    passwordNotMatchMsg: "A senha repetida não corresponde.",
-    notificationDescription: "Atribua uma notificação ao (s) monitor (es) para que funcione.",
-    keywordDescription: "Pesquise a palavra-chave em html simples ou resposta JSON e diferencia maiúsculas de minúsculas",
-    pauseDashboardHome: "Pausar",
-    deleteMonitorMsg: "Tem certeza de que deseja excluir este monitor?",
-    deleteNotificationMsg: "Tem certeza de que deseja excluir esta notificação para todos os monitores?",
-    resolverserverDescription: "Cloudflare é o servidor padrão, você pode alterar o servidor resolvedor a qualquer momento.",
-    rrtypeDescription: "Selecione o RR-Type que você deseja monitorar",
-    pauseMonitorMsg: "Tem certeza que deseja fazer uma pausa?",
-    enableDefaultNotificationDescription: "Para cada novo monitor, esta notificação será habilitada por padrão. Você ainda pode desativar a notificação separadamente para cada monitor.",
-    clearEventsMsg: "Tem certeza de que deseja excluir todos os eventos deste monitor?",
-    clearHeartbeatsMsg: "Tem certeza de que deseja excluir todos os heartbeats deste monitor?",
-    confirmClearStatisticsMsg: "Tem certeza que deseja excluir TODAS as estatísticas?",
-    importHandleDescription: "Escolha 'Ignorar existente' se quiser ignorar todos os monitores ou notificações com o mesmo nome. 'Substituir' excluirá todos os monitores e notificações existentes.",
-    confirmImportMsg: "Tem certeza que deseja importar o backup? Certifique-se de que selecionou a opção de importação correta.",
-    twoFAVerifyLabel: "Digite seu token para verificar se 2FA está funcionando",
-    tokenValidSettingsMsg: "O token é válido! Agora você pode salvar as configurações 2FA.",
-    confirmEnableTwoFAMsg: "Tem certeza de que deseja habilitar 2FA?",
-    confirmDisableTwoFAMsg: "Tem certeza de que deseja desativar 2FA?",
-    Settings: "Configurações",
-    Dashboard: "Dashboard",
-    "New Update": "Nova Atualização",
-    Language: "Linguagem",
-    Appearance: "Aparência",
-    Theme: "Tema",
-    General: "Geral",
-    Version: "Versão",
-    "Check Update On GitHub": "Verificar atualização no Github",
-    List: "Lista",
-    Add: "Adicionar",
-    "Add New Monitor": "Adicionar novo monitor",
-    "Quick Stats": "Estatísticas rápidas",
-    Up: "On",
-    Down: "Off",
-    Pending: "Pendente",
-    Unknown: "Desconhecido",
-    Pause: "Pausar",
-    Name: "Nome",
-    Status: "Status",
-    DateTime: "Data hora",
-    Message: "Mensagem",
-    "No important events": "Nenhum evento importante",
-    Resume: "Resumo",
-    Edit: "Editar",
-    Delete: "Deletar",
-    Current: "Atual",
-    Uptime: "Tempo de atividade",
-    "Cert Exp.": "Cert Exp.",
-    day: "dia | dias",
-    "-day": "-dia",
-    hour: "hora",
-    "-hour": "-hora",
-    Response: "Resposta",
-    Ping: "Ping",
-    "Monitor Type": "Tipo de Monitor",
-    Keyword: "Palavra-Chave",
-    "Friendly Name": "Nome Amigável",
-    URL: "URL",
-    Hostname: "Hostname",
-    Port: "Porta",
-    "Heartbeat Interval": "Intervalo de Heartbeat",
-    Retries: "Novas tentativas",
-    "Heartbeat Retry Interval": "Intervalo de repetição de Heartbeat",
-    Advanced: "Avançado",
-    "Upside Down Mode": "Modo de cabeça para baixo",
-    "Max. Redirects": "Redirecionamento Máx.",
-    "Accepted Status Codes": "Status Code Aceitáveis",
-    Save: "Salvar",
-    Notifications: "Notificações",
-    "Not available, please setup.": "Não disponível, por favor configure.",
-    "Setup Notification": "Configurar Notificação",
-    Light: "Claro",
-    Dark: "Escuro",
-    Auto: "Auto",
-    "Theme - Heartbeat Bar": "Tema - Barra de Heartbeat",
-    Normal: "Normal",
-    Bottom: "Inferior",
-    None: "Nenhum",
-    Timezone: "Fuso horário",
-    "Search Engine Visibility": "Visibilidade do mecanismo de pesquisa",
-    "Allow indexing": "Permitir Indexação",
-    "Discourage search engines from indexing site": "Desencoraje os motores de busca de indexar o site",
-    "Change Password": "Mudar senha",
-    "Current Password": "Senha atual",
-    "New Password": "Nova Senha",
-    "Repeat New Password": "Repetir Nova Senha",
-    "Update Password": "Atualizar Senha",
-    "Disable Auth": "Desativar Autenticação",
-    "Enable Auth": "Ativar Autenticação",
-    "disableauth.message1": "Você tem certeza que deseja <strong>desativar a autenticação</strong>?",
-    "disableauth.message2": "Isso é para <strong>alguém que tem autenticação de terceiros</strong> na frente do 'UpTime Kuma' como o Cloudflare Access.",
-    "Please use this option carefully!": "Por favor, utilize isso com cautela.",
-    Logout: "Deslogar",
-    Leave: "Sair",
-    "I understand, please disable": "Eu entendo, por favor desative.",
-    Confirm: "Confirmar",
-    Yes: "Sim",
-    No: "Não",
-    Username: "Usuário",
-    Password: "Senha",
-    "Remember me": "Lembre-me",
-    Login: "Autenticar",
-    "No Monitors, please": "Nenhum monitor, por favor",
-    "add one": "adicionar um",
-    "Notification Type": "Tipo de Notificação",
-    Email: "Email",
-    Test: "Testar",
-    "Certificate Info": "Info. do Certificado ",
-    "Resolver Server": "Resolver Servidor",
-    "Resource Record Type": "Tipo de registro de aplicação",
-    "Last Result": "Último resultado",
-    "Create your admin account": "Crie sua conta de admin",
-    "Repeat Password": "Repita a senha",
-    "Import Backup": "Importar Backup",
-    "Export Backup": "Exportar Backup",
-    Export: "Exportar",
-    Import: "Importar",
-    respTime: "Tempo de Resp. (ms)",
-    notAvailableShort: "N/A",
-    "Default enabled": "Padrão habilitado",
-    "Apply on all existing monitors": "Aplicar em todos os monitores existentes",
-    Create: "Criar",
-    "Clear Data": "Limpar Dados",
-    Events: "Eventos",
-    Heartbeats: "Heartbeats",
-    "Auto Get": "Obter Automático",
-    backupDescription: "Você pode fazer backup de todos os monitores e todas as notificações em um arquivo JSON.",
-    backupDescription2: "OBS: Os dados do histórico e do evento não estão incluídos.",
-    backupDescription3: "Dados confidenciais, como tokens de notificação, estão incluídos no arquivo de exportação, mantenha-o com cuidado.",
-    alertNoFile: "Selecione um arquivo para importar.",
-    alertWrongFileType: "Selecione um arquivo JSON.",
-    "Clear all statistics": "Limpar todas as estatísticas",
-    "Skip existing": "Pular existente",
-    Overwrite: "Sobrescrever",
-    Options: "Opções",
-    "Keep both": "Manter os dois",
-    "Verify Token": "Verificar Token",
-    "Setup 2FA": "Configurar 2FA",
-    "Enable 2FA": "Ativar 2FA",
-    "Disable 2FA": "Desativar 2FA",
-    "2FA Settings": "Configurações do 2FA ",
-    "Two Factor Authentication": "Autenticação e Dois Fatores",
-    Active: "Ativo",
-    Inactive: "Inativo",
-    Token: "Token",
-    "Show URI": "Mostrar URI",
-    Tags: "Tag",
-    "Add New below or Select...": "Adicionar Novo abaixo ou Selecionar ...",
-    "Tag with this name already exist.": "Já existe uma etiqueta com este nome.",
-    "Tag with this value already exist.": "Já existe uma etiqueta com este valor.",
-    color: "cor",
-    "value (optional)": "valor (opcional)",
-    Gray: "Cinza",
-    Red: "Vermelho",
-    Orange: "Laranja",
-    Green: "Verde",
-    Blue: "Azul",
-    Indigo: "Índigo",
-    Purple: "Roxo",
-    Pink: "Rosa",
-    "Search...": "Buscar...",
-    "Avg. Ping": "Ping Médio.",
-    "Avg. Response": "Resposta Média. ",
-    "Status Page": "Página de Status",
-    "Status Pages": "Página de Status",
-    "Entry Page": "Página de entrada",
-    statusPageNothing: "Nada aqui, por favor, adicione um grupo ou monitor.",
-    "No Services": "Nenhum Serviço",
-    "All Systems Operational": "Todos os Serviços Operacionais",
-    "Partially Degraded Service": "Serviço parcialmente degradado",
-    "Degraded Service": "Serviço Degradado",
-    "Add Group": "Adicionar Grupo",
-    "Add a monitor": "Adicionar um monitor",
-    "Edit Status Page": "Editar Página de Status",
-    "Go to Dashboard": "Ir para a dashboard",
-    telegram: "Telegram",
-    webhook: "Webhook",
-    smtp: "Email (SMTP)",
-    discord: "Discord",
-    teams: "Microsoft Teams",
-    signal: "Signal",
-    gotify: "Gotify",
-    slack: "Slack",
-    "rocket.chat": "Rocket.chat",
-    pushover: "Pushover",
-    pushy: "Pushy",
-    octopush: "Octopush",
-    promosms: "PromoSMS",
-    lunasea: "LunaSea",
-    apprise: "Apprise (Support 50+ Notification services)",
-    pushbullet: "Pushbullet",
-    line: "Line Messenger",
-    mattermost: "Mattermost",
-};
diff --git a/src/languages/pt-PT.js b/src/languages/pt-PT.js
deleted file mode 100644
index 21e68d268..000000000
--- a/src/languages/pt-PT.js
+++ /dev/null
@@ -1,203 +0,0 @@
-export default {
-    languageName: "Português (Portugal)",
-    checkEverySecond: "Verificar a cada {0} segundos.",
-    retryCheckEverySecond: "Tentar novamente a cada {0} segundos.",
-    retriesDescription: "Máximo de tentativas antes que o serviço seja marcado como inativo e uma notificação seja enviada",
-    ignoreTLSError: "Ignorar erros TLS/SSL para sites HTTPS",
-    upsideDownModeDescription: "Inverte o status de cabeça para baixo. Se o serviço estiver acessível, ele está OFFLINE.",
-    maxRedirectDescription: "Número máximo de redirecionamentos a seguir. Define como 0 para desativar redirecionamentos.",
-    acceptedStatusCodesDescription: "Seleciona os códigos de status que são considerados uma resposta bem-sucedida.",
-    passwordNotMatchMsg: "A senha repetida não corresponde.",
-    notificationDescription: "Atribuir uma notificação ao (s) monitor (es) para que funcione.",
-    keywordDescription: "Pesquisa a palavra-chave em HTML simples ou resposta JSON e diferencia maiúsculas de minúsculas",
-    pauseDashboardHome: "Pausa",
-    deleteMonitorMsg: "Tens a certeza de que queres excluir este monitor?",
-    deleteNotificationMsg: "Tens a certeza de que queres excluir esta notificação para todos os monitores?",
-    resolverserverDescription: "A Cloudflare é o servidor padrão, podes alterar o servidor 'resolvedor' a qualquer momento.",
-    rrtypeDescription: "Seleciona o RR-Type que queres monitorizar",
-    pauseMonitorMsg: "Tens a certeza que queres fazer uma pausa?",
-    enableDefaultNotificationDescription: "Para cada monitor novo esta notificação vai estar activa por padrão. Podes também desativar a notificação separadamente para cada monitor.",
-    clearEventsMsg: "Tens a certeza que queres excluir todos os eventos deste monitor?",
-    clearHeartbeatsMsg: "Tens a certeza de que queres excluir todos os heartbeats deste monitor?",
-    confirmClearStatisticsMsg: "Tens a certeza que queres excluir TODAS as estatísticas?",
-    importHandleDescription: "Escolhe 'Ignorar existente' se quiseres ignorar todos os monitores ou notificações com o mesmo nome. 'Substituir' excluirá todos os monitores e notificações existentes.",
-    confirmImportMsg: "Tens a certeza que queres importar o backup? Certifica-te que selecionaste a opção de importação correta.",
-    twoFAVerifyLabel: "Insire o teu token para verificares se o 2FA está a funcionar",
-    tokenValidSettingsMsg: "O token é válido! Agora podes salvar as configurações do 2FA.",
-    confirmEnableTwoFAMsg: "Tens a certeza de que queres habilitar 2FA?",
-    confirmDisableTwoFAMsg: "Tens a certeza de que queres desativar 2FA?",
-    Settings: "Configurações",
-    Dashboard: "Dashboard",
-    "New Update": "Nova Atualização",
-    Language: "Linguagem",
-    Appearance: "Aparência",
-    Theme: "Tema",
-    General: "Geral",
-    Version: "Versão",
-    "Check Update On GitHub": "Verificar atualização no Github",
-    List: "Lista",
-    Add: "Adicionar",
-    "Add New Monitor": "Adicionar novo monitor",
-    "Quick Stats": "Estatísticas rápidas",
-    Up: "On",
-    Down: "Off",
-    Pending: "Pendente",
-    Unknown: "Desconhecido",
-    Pause: "Pausa",
-    Name: "Nome",
-    Status: "Status",
-    DateTime: "Data hora",
-    Message: "Mensagem",
-    "No important events": "Nenhum evento importante",
-    Resume: "Resumo",
-    Edit: "Editar",
-    Delete: "Apagar",
-    Current: "Atual",
-    Uptime: "Tempo de atividade",
-    "Cert Exp.": "Cert Exp.",
-    day: "dia | dias",
-    "-day": "-dia",
-    hour: "hora",
-    "-hour": "-hora",
-    Response: "Resposta",
-    Ping: "Ping",
-    "Monitor Type": "Tipo de Monitor",
-    Keyword: "Palavra-Chave",
-    "Friendly Name": "Nome Amigável",
-    URL: "URL",
-    Hostname: "Hostname",
-    Port: "Porta",
-    "Heartbeat Interval": "Intervalo de Heartbeats",
-    Retries: "Novas tentativas",
-    "Heartbeat Retry Interval": "Intervalo de repetição de Heartbeats",
-    Advanced: "Avançado",
-    "Upside Down Mode": "Modo de cabeça para baixo",
-    "Max. Redirects": "Redirecionamento Máx.",
-    "Accepted Status Codes": "Status Code Aceitáveis",
-    Save: "Guardar",
-    Notifications: "Notificações",
-    "Not available, please setup.": "Não disponível, por favor configura.",
-    "Setup Notification": "Configurar Notificação",
-    Light: "Claro",
-    Dark: "Escuro",
-    Auto: "Auto",
-    "Theme - Heartbeat Bar": "Tema - Barra de Heartbeat",
-    Normal: "Normal",
-    Bottom: "Inferior",
-    None: "Nenhum",
-    Timezone: "Fuso horário",
-    "Search Engine Visibility": "Visibilidade do mecanismo de pesquisa",
-    "Allow indexing": "Permitir Indexação",
-    "Discourage search engines from indexing site": "Desencorajar que motores de busca indexem o site",
-    "Change Password": "Mudar senha",
-    "Current Password": "Senha atual",
-    "New Password": "Nova Senha",
-    "Repeat New Password": "Repetir Nova Senha",
-    "Update Password": "Atualizar Senha",
-    "Disable Auth": "Desativar Autenticação",
-    "Enable Auth": "Ativar Autenticação",
-    "disableauth.message1": "Tens a certeza que queres <strong>desativar a autenticação</strong>?",
-    "disableauth.message2": "Isso é para <strong>alguém que tem autenticação de terceiros</strong> em frente ao 'UpTime Kuma' como o Cloudflare Access.",
-    "Please use this option carefully!": "Por favor, utiliza esta opção com cuidado.",
-    Logout: "Logout",
-    Leave: "Sair",
-    "I understand, please disable": "Eu entendo, por favor desativa.",
-    Confirm: "Confirmar",
-    Yes: "Sim",
-    No: "Não",
-    Username: "Utilizador",
-    Password: "Senha",
-    "Remember me": "Lembra-me",
-    Login: "Autenticar",
-    "No Monitors, please": "Nenhum monitor, por favor",
-    "add one": "adicionar um",
-    "Notification Type": "Tipo de Notificação",
-    Email: "Email",
-    Test: "Testar",
-    "Certificate Info": "Info. do Certificado ",
-    "Resolver Server": "Resolver Servidor",
-    "Resource Record Type": "Tipo de registro de aplicação",
-    "Last Result": "Último resultado",
-    "Create your admin account": "Cria a tua conta de admin",
-    "Repeat Password": "Repete a senha",
-    "Import Backup": "Importar Backup",
-    "Export Backup": "Exportar Backup",
-    Export: "Exportar",
-    Import: "Importar",
-    respTime: "Tempo de Resp. (ms)",
-    notAvailableShort: "N/A",
-    "Default enabled": "Padrão habilitado",
-    "Apply on all existing monitors": "Aplicar em todos os monitores existentes",
-    Create: "Criar",
-    "Clear Data": "Limpar Dados",
-    Events: "Eventos",
-    Heartbeats: "Heartbeats",
-    "Auto Get": "Obter Automático",
-    backupDescription: "Podes fazer backup de todos os monitores e todas as notificações num arquivo JSON.",
-    backupDescription2: "OBS: Os dados do histórico e do evento não estão incluídos.",
-    backupDescription3: "Dados confidenciais, como tokens de notificação, estão incluídos no arquivo de exportação, mantem-no com cuidado.",
-    alertNoFile: "Seleciona um arquivo para importar.",
-    alertWrongFileType: "Seleciona um arquivo JSON.",
-    "Clear all statistics": "Limpar todas as estatísticas",
-    "Skip existing": "Saltar existente",
-    Overwrite: "Sobrescrever",
-    Options: "Opções",
-    "Keep both": "Manter os dois",
-    "Verify Token": "Verificar Token",
-    "Setup 2FA": "Configurar 2FA",
-    "Enable 2FA": "Ativar 2FA",
-    "Disable 2FA": "Desativar 2FA",
-    "2FA Settings": "Configurações do 2FA ",
-    "Two Factor Authentication": "Autenticação de Dois Fatores",
-    Active: "Ativo",
-    Inactive: "Inativo",
-    Token: "Token",
-    "Show URI": "Mostrar URI",
-    Tags: "Tag",
-    "Add New below or Select...": "Adicionar Novo abaixo ou Selecionar ...",
-    "Tag with this name already exist.": "Já existe uma etiqueta com este nome.",
-    "Tag with this value already exist.": "Já existe uma etiqueta com este valor.",
-    color: "cor",
-    "value (optional)": "valor (opcional)",
-    Gray: "Cinza",
-    Red: "Vermelho",
-    Orange: "Laranja",
-    Green: "Verde",
-    Blue: "Azul",
-    Indigo: "Índigo",
-    Purple: "Roxo",
-    Pink: "Rosa",
-    "Search...": "Pesquisa...",
-    "Avg. Ping": "Ping Médio.",
-    "Avg. Response": "Resposta Média. ",
-    "Status Page": "Página de Status",
-    "Status Pages": "Página de Status",
-    "Entry Page": "Página de entrada",
-    statusPageNothing: "Nada aqui, por favor, adiciona um grupo ou monitor.",
-    "No Services": "Nenhum Serviço",
-    "All Systems Operational": "Todos os Serviços Operacionais",
-    "Partially Degraded Service": "Serviço parcialmente degradados",
-    "Degraded Service": "Serviço Degradado",
-    "Add Group": "Adicionar Grupo",
-    "Add a monitor": "Adicionar um monitor",
-    "Edit Status Page": "Editar Página de Status",
-    "Go to Dashboard": "Ir para o dashboard",
-    telegram: "Telegram",
-    webhook: "Webhook",
-    smtp: "Email (SMTP)",
-    discord: "Discord",
-    teams: "Microsoft Teams",
-    signal: "Signal",
-    gotify: "Gotify",
-    slack: "Slack",
-    "rocket.chat": "Rocket.chat",
-    pushover: "Pushover",
-    pushy: "Pushy",
-    octopush: "Octopush",
-    promosms: "PromoSMS",
-    lunasea: "LunaSea",
-    apprise: "Apprise (Support 50+ Notification services)",
-    pushbullet: "Pushbullet",
-    line: "Line Messenger",
-    mattermost: "Mattermost",
-};
diff --git a/src/languages/ru-RU.js b/src/languages/ru-RU.js
deleted file mode 100644
index 2e6fdf7be..000000000
--- a/src/languages/ru-RU.js
+++ /dev/null
@@ -1,581 +0,0 @@
-export default {
-    languageName: "Русский",
-    checkEverySecond: "Проверка каждые {0} секунд",
-    retriesDescription: "Максимальное количество попыток перед пометкой сервиса как недоступного и отправкой уведомления",
-    ignoreTLSError: "Игнорировать ошибку TLS/SSL для HTTPS сайтов",
-    upsideDownModeDescription: "Реверс статуса сервиса. Если сервис доступен, то он помечается как НЕДОСТУПНЫЙ.",
-    maxRedirectDescription: "Максимальное количество перенаправлений. Поставьте 0, чтобы отключить перенаправления.",
-    acceptedStatusCodesDescription: "Выберите коды статусов для определения доступности сервиса.",
-    passwordNotMatchMsg: "Повтор пароля не совпадает.",
-    notificationDescription: "Привяжите уведомления к мониторам.",
-    keywordDescription: "Поиск слова в чистом HTML или в JSON-ответе (чувствительно к регистру)",
-    pauseDashboardHome: "Пауза",
-    deleteMonitorMsg: "Вы действительно хотите удалить данный монитор?",
-    deleteNotificationMsg: "Вы действительно хотите удалить это уведомление для всех мониторов?",
-    resolverserverDescription: "Cloudflare является сервером по умолчанию. Вы всегда можете сменить данный сервер.",
-    rrtypeDescription: "Выберите тип ресурсной записи, который вы хотите отслеживать",
-    pauseMonitorMsg: "Вы действительно хотите поставить на паузу?",
-    Settings: "Настройки",
-    Dashboard: "Панель управления",
-    "New Update": "Обновление",
-    Language: "Язык",
-    Appearance: "Внешний вид",
-    Theme: "Тема",
-    General: "Общее",
-    Version: "Версия",
-    "Check Update On GitHub": "Проверить обновления на GitHub",
-    List: "Список",
-    Add: "Добавить",
-    "Add New Monitor": "Новый монитор",
-    "Quick Stats": "Статистика",
-    Up: "Доступен",
-    Down: "Недоступен",
-    Pending: "Ожидание",
-    Unknown: "Неизвестно",
-    Pause: "Пауза",
-    Name: "Имя",
-    Status: "Статус",
-    DateTime: "Дата и время",
-    Message: "Сообщение",
-    "No important events": "Важных событий нет",
-    Resume: "Возобновить",
-    Edit: "Изменить",
-    Delete: "Удалить",
-    Current: "Текущий",
-    Uptime: "Аптайм",
-    "Cert Exp.": "Сертификат истекает",
-    day: "день | дней",
-    "-day": " дней",
-    hour: "час",
-    "-hour": " часа",
-    Response: "Ответ",
-    Ping: "Пинг",
-    "Monitor Type": "Тип монитора",
-    Keyword: "Слово",
-    "Friendly Name": "Имя",
-    URL: "URL",
-    Hostname: "Имя хоста",
-    Port: "Порт",
-    "Heartbeat Interval": "Частота опроса",
-    Retries: "Попыток",
-    Advanced: "Дополнительно",
-    "Upside Down Mode": "Реверс статуса",
-    "Max. Redirects": "Макс. количество перенаправлений",
-    "Accepted Status Codes": "Допустимые коды статуса",
-    Save: "Сохранить",
-    Notifications: "Уведомления",
-    "Not available, please setup.": "Доступных уведомлений нет, необходимо создать.",
-    "Setup Notification": "Создать уведомление",
-    Light: "Светлая",
-    Dark: "Тёмная",
-    Auto: "Авто",
-    "Theme - Heartbeat Bar": "Тема - Полоса частоты опроса",
-    Normal: "Обычный",
-    Bottom: "Снизу",
-    None: "Отсутствует",
-    Timezone: "Часовой пояс",
-    "Search Engine Visibility": "Индексация поисковыми системами:",
-    "Allow indexing": "Разрешить индексирование",
-    "Discourage search engines from indexing site": "Запретить индексирование",
-    "Change Password": "Сменить пароль",
-    "Current Password": "Текущий пароль",
-    "New Password": "Новый пароль",
-    "Repeat New Password": "Повтор нового пароля",
-    "Update Password": "Обновить пароль",
-    "Disable Auth": "Отключить авторизацию",
-    "Enable Auth": "Включить авторизацию",
-    "disableauth.message1": "Вы уверены, что хотите <strong>отключить авторизацию</strong>?",
-    "disableauth.message2": "Это подходит для <strong>тех, у кого стоит другая авторизация</strong> перед открытием Uptime Kuma, например Cloudflare Access.",
-    "Please use this option carefully!": "Пожалуйста, используйте с осторожностью.",
-    Logout: "Выйти",
-    Leave: "Отмена",
-    "I understand, please disable": "Я понимаю, всё равно отключить",
-    Confirm: "Подтвердить",
-    Yes: "Да",
-    No: "Нет",
-    Username: "Логин",
-    Password: "Пароль",
-    "Remember me": "Запомнить меня",
-    Login: "Вход в систему",
-    "No Monitors, please": "Мониторов нет, пожалуйста",
-    "No Monitors": "Мониторы отсутствуют",
-    "add one": "создайте новый",
-    "Notification Type": "Тип уведомления",
-    Email: "Почта",
-    Test: "Проверка",
-    "Certificate Info": "Информация о сертификате",
-    "Resolver Server": "DNS сервер",
-    "Resource Record Type": "Тип ресурсной записи",
-    "Last Result": "Последний результат",
-    "Create your admin account": "Создайте аккаунт администратора",
-    "Repeat Password": "Повторите пароль",
-    respTime: "Время ответа (мс)",
-    notAvailableShort: "N/A",
-    Create: "Создать",
-    clearEventsMsg: "Вы действительно хотите удалить всю статистику событий данного монитора?",
-    clearHeartbeatsMsg: "Вы действительно хотите удалить всю статистику опросов данного монитора?",
-    confirmClearStatisticsMsg: "Вы действительно хотите удалить ВСЮ статистику?",
-    "Clear Data": "Удалить статистику",
-    Events: "События",
-    Heartbeats: "Опросы",
-    "Auto Get": "Авто-получение",
-    enableDefaultNotificationDescription: "Для каждого нового монитора это уведомление будет включено по умолчанию. Вы всё ещё можете отключить уведомления в каждом мониторе отдельно.",
-    "Default enabled": "Использовать по умолчанию",
-    "Also apply to existing monitors": "Применить к существующим мониторам",
-    Export: "Экспорт",
-    Import: "Импорт",
-    backupDescription: "Вы можете сохранить резервную копию всех мониторов и уведомлений в виде JSON-файла",
-    backupDescription2: "P.S. История и события сохранены не будут",
-    backupDescription3: "Важные данные, такие как токены уведомлений, добавляются при экспорте, поэтому храните файлы в безопасном месте",
-    alertNoFile: "Выберите файл для импорта.",
-    alertWrongFileType: "Выберите JSON-файл.",
-    twoFAVerifyLabel: "Пожалуйста, введите свой токен, чтобы проверить работу 2FA",
-    tokenValidSettingsMsg: "Токен действителен! Теперь вы можете сохранить настройки 2FA.",
-    confirmEnableTwoFAMsg: "Вы действительно хотите включить 2FA?",
-    confirmDisableTwoFAMsg: "Вы действительно хотите выключить 2FA?",
-    "Apply on all existing monitors": "Применить ко всем существующим мониторам",
-    "Verify Token": "Проверить токен",
-    "Setup 2FA": "Настройка 2FA",
-    "Enable 2FA": "Включить 2FA",
-    "Disable 2FA": "Выключить 2FA",
-    "2FA Settings": "Настройки 2FA",
-    "Two Factor Authentication": "Двухфакторная аутентификация",
-    Active: "Активно",
-    Inactive: "Неактивно",
-    Token: "Токен",
-    "Show URI": "Показать URI",
-    "Clear all statistics": "Очистить статистику",
-    retryCheckEverySecond: "Повтор каждые {0} секунд",
-    importHandleDescription: "Выберите \"Пропустить существующие\", если вы хотите пропустить каждый монитор или уведомление с таким же именем. \"Перезаписать\" удалит каждый существующий монитор или уведомление и добавит заново. Вариант \"Не проверять\" принудительно восстанавливает все мониторы и уведомления, даже если они уже существуют.",
-    confirmImportMsg: "Вы действительно хотите восстановить резервную копию? Убедитесь, что вы выбрали подходящий вариант импорта.",
-    "Heartbeat Retry Interval": "Интервал повтора опроса",
-    "Import Backup": "Импорт",
-    "Export Backup": "Скачать",
-    "Skip existing": "Пропустить существующие",
-    Overwrite: "Перезаписать",
-    Options: "Опции",
-    "Keep both": "Не проверять",
-    Tags: "Теги",
-    "Add New below or Select...": "Добавить новый или выбрать...",
-    "Tag with this name already exist.": "Такой тег уже существует.",
-    "Tag with this value already exist.": "Тег с таким значением уже существует.",
-    color: "цвет",
-    "value (optional)": "значение (опционально)",
-    Gray: "Серый",
-    Red: "Красный",
-    Orange: "Оранжевый",
-    Green: "Зелёный",
-    Blue: "Синий",
-    Indigo: "Индиго",
-    Purple: "Пурпурный",
-    Pink: "Розовый",
-    "Search...": "Поиск...",
-    "Avg. Ping": "Среднее значение пинга",
-    "Avg. Response": "Среднее время ответа",
-    "Entry Page": "Главная страница",
-    statusPageNothing: "Здесь пусто. Добавьте группу или монитор.",
-    "No Services": "Нет сервисов",
-    "All Systems Operational": "Все системы работают в штатном режиме",
-    "Partially Degraded Service": "Сервисы работают частично",
-    "Degraded Service": "Все сервисы не работают",
-    "Add Group": "Добавить группу",
-    "Add a monitor": "Добавить монитор",
-    "Edit Status Page": "Редактировать",
-    "Go to Dashboard": "Панель управления",
-    "Status Page": "Страница статуса",
-    "Status Pages": "Страницы статуса",
-    Discard: "Отмена",
-    "Create Incident": "Создать инцидент",
-    "Switch to Dark Theme": "Тёмная тема",
-    "Switch to Light Theme": "Светлая тема",
-    telegram: "Telegram",
-    webhook: "Вебхук",
-    smtp: "Email (SMTP)",
-    discord: "Discord",
-    teams: "Microsoft Teams",
-    signal: "Signal",
-    gotify: "Gotify",
-    slack: "Slack",
-    "rocket.chat": "Rocket.chat",
-    pushover: "Pushover",
-    pushy: "Pushy",
-    octopush: "Octopush",
-    promosms: "PromoSMS",
-    lunasea: "LunaSea",
-    apprise: "Apprise (Поддержка 50+ сервисов уведомлений)",
-    pushbullet: "Pushbullet",
-    line: "Line Messenger",
-    mattermost: "Mattermost",
-    "Primary Base URL": "Основной URL",
-    "Push URL": "URL пуша",
-    needPushEvery: "К этому URL необходимо обращаться каждые {0} секунд",
-    pushOptionalParams: "Опциональные параметры: {0}",
-    defaultNotificationName: "Моё уведомление {notification} ({number})",
-    here: "здесь",
-    Required: "Требуется",
-    "Bot Token": "Токен бота",
-    wayToGetTelegramToken: "Вы можете взять токен здесь - {0}.",
-    "Chat ID": "ID чата",
-    supportTelegramChatID: "Поддерживаются ID чатов, групп и каналов",
-    wayToGetTelegramChatID: "Вы можете взять ID вашего чата, отправив сообщение боту и перейдя по этому URL для просмотра chat_id:",
-    "YOUR BOT TOKEN HERE": "ВАШ ТОКЕН БОТА ЗДЕСЬ",
-    chatIDNotFound: "ID чата не найден; пожалуйста отправьте сначала сообщение боту",
-    "Post URL": "Post URL",
-    "Content Type": "Тип контента",
-    webhookJsonDesc: "{0} подходит для любых современных HTTP-серверов, например Express.js",
-    webhookFormDataDesc: "{multipart} подходит для PHP. JSON-вывод необходимо будет обработать с помощью {decodeFunction}",
-    secureOptionNone: "Нет / STARTTLS (25, 587)",
-    secureOptionTLS: "TLS (465)",
-    "Ignore TLS Error": "Игнорировать ошибки TLS",
-    "From Email": "От кого",
-    emailCustomSubject: "Своя тема",
-    "To Email": "Кому",
-    smtpCC: "Копия",
-    smtpBCC: "Скрытая копия",
-    "Discord Webhook URL": "Discord вебхук URL",
-    wayToGetDiscordURL: "Вы можете создать его в Параметрах сервера -> Интеграции -> Создать вебхук",
-    "Bot Display Name": "Отображаемое имя бота",
-    "Prefix Custom Message": "Свой префикс сообщения",
-    "Hello @everyone is...": "Привет {'@'}everyone это...",
-    "Webhook URL": "URL вебхука",
-    wayToGetTeamsURL: "Как создать URL вебхука вы можете узнать здесь - {0}.",
-    Number: "Номер",
-    Recipients: "Получатели",
-    needSignalAPI: "Вам необходим клиент Signal с поддержкой REST API.",
-    wayToCheckSignalURL: "Пройдите по этому URL, чтобы узнать как настроить такой клиент:",
-    signalImportant: "ВАЖНО: Нельзя смешивать в Получателях группы и номера!",
-    "Application Token": "Токен приложения",
-    "Server URL": "URL сервера",
-    Priority: "Приоритет",
-    "Icon Emoji": "Иконка Emoji",
-    "Channel Name": "Имя канала",
-    "Uptime Kuma URL": "Uptime Kuma URL",
-    aboutWebhooks: "Больше информации о вебхуках: {0}",
-    aboutChannelName: "Введите имя канала в поле {0} Имя канала, если вы хотите обойти канал вебхука. Например: #other-channel",
-    aboutKumaURL: "Если поле Uptime Kuma URL в настройках останется пустым, по умолчанию будет использоваться ссылка на проект на GitHub.",
-    emojiCheatSheet: "Шпаргалка по Emoji: {0}",
-    "User Key": "Ключ пользователя",
-    Device: "Устройство",
-    "Message Title": "Заголовок сообщения",
-    "Notification Sound": "Звук уведомления",
-    "More info on:": "Больше информации: {0}",
-    pushoverDesc1: "Экстренный приоритет (2) имеет таймаут повтора по умолчанию 30 секунд и истекает через 1 час.",
-    pushoverDesc2: "Если вы хотите отправлять уведомления различным устройствам, необходимо заполнить поле Устройство.",
-    "SMS Type": "Тип SMS",
-    octopushTypePremium: "Премиум (Быстрый - рекомендуется для алертов)",
-    octopushTypeLowCost: "Дешёвый (Медленный - иногда блокируется операторами)",
-    checkPrice: "Тарифы {0}:",
-    octopushLegacyHint: "Вы используете старую версию Octopush (2011-2020) или новую?",
-    "Check octopush prices": "Тарифы Octopush {0}.",
-    octopushPhoneNumber: "Номер телефона (межд. формат, например: +79831234567) ",
-    octopushSMSSender: "Имя отправителя SMS: 3-11 символов алвафита, цифр и пробелов (a-zA-Z0-9)",
-    "LunaSea Device ID": "ID устройства LunaSea",
-    "Apprise URL": "Apprise URL",
-    "Example:": "Пример: {0}",
-    "Read more:": "Подробнее: {0}",
-    "Status:": "Статус: {0}",
-    "Read more": "Подробнее",
-    appriseInstalled: "Apprise установлен.",
-    appriseNotInstalled: "Apprise не установлен. {0}",
-    "Access Token": "Токен доступа",
-    "Channel access token": "Токен доступа канала",
-    "Line Developers Console": "Консоль разработчиков Line",
-    lineDevConsoleTo: "Консоль разработчиков Line - {0}",
-    "Basic Settings": "Базовые настройки",
-    "User ID": "ID пользователя",
-    "Messaging API": "API сообщений",
-    wayToGetLineChannelToken: "Сначала зайдите в {0}, создайте провайдера и канал (API сообщений), затем вы сможете получить токен доступа канала и ID пользователя из вышеупомянутых пунктов меню.",
-    "Icon URL": "URL иконки",
-    aboutIconURL: "Вы можете предоставить ссылку на иконку в поле \"URL иконки\" чтобы переопределить картинку профиля по умолчанию. Не используется, если задана иконка Emoji.",
-    aboutMattermostChannelName: "Вы можете переопределить канал по умолчанию, в который вебхук пишет, введя имя канала в поле \"Имя канала\". Это необходимо включить в настройках вебхука Mattermost. Например: #other-channel",
-    matrix: "Matrix",
-    promosmsTypeEco: "SMS ECO - дёшево и медленно, часто перегружен. Только для получателей из Польши.",
-    promosmsTypeFlash: "SMS FLASH - сообщения автоматически появятся на устройстве получателя. Только для получателей из Польши.",
-    promosmsTypeFull: "SMS FULL - премиум-уровень SMS, можно использовать своё имя отправителя (предварительно зарегистрировав его). Надёжно для алертов.",
-    promosmsTypeSpeed: "SMS SPEED - наивысший приоритет в системе. Очень быстро и надёжно, но очень дорого (в два раза дороже, чем SMS FULL).",
-    promosmsPhoneNumber: "Номер телефона (для получателей из Польши можно пропустить код региона)",
-    promosmsSMSSender: "Имя отправителя SMS: Зарегистрированное или одно из имён по умолчанию: InfoSMS, SMS Info, MaxSMS, INFO, SMS",
-    "Feishu WebHookUrl": "Feishu WebHookURL",
-    matrixHomeserverURL: "URL сервера (вместе с http(s):// и опционально порт)",
-    "Internal Room Id": "Внутренний ID комнаты",
-    matrixDesc1: "Внутренний ID комнаты можно найти в Подробностях в параметрах канала вашего Matrix клиента. Он должен выглядеть примерно как !QMdRCpUIfLwsfjxye6:home.server.",
-    matrixDesc2: "Рекомендуется создать нового пользователя и не использовать токен доступа личного пользователя Matrix, т.к. это влечёт за собой полный доступ к аккаунту и к комнатам, в которых вы состоите. Вместо этого создайте нового пользователя и пригласите его только в ту комнату, в которой вы хотите получать уведомления. Токен доступа можно получить, выполнив команду {0}",
-    Method: "Метод",
-    Body: "Тело",
-    Headers: "Заголовки",
-    PushUrl: "URL пуша",
-    HeadersInvalidFormat: "Заголовки запроса некорректны JSON: ",
-    BodyInvalidFormat: "Тело запроса некорректно JSON: ",
-    "Monitor History": "Статистика",
-    clearDataOlderThan: "Сохранять статистику за {0} дней.",
-    PasswordsDoNotMatch: "Пароли не совпадают.",
-    records: "записей",
-    "One record": "Одна запись",
-    steamApiKeyDescription: "Для мониторинга игрового сервера Steam вам необходим Web-API ключ Steam. Зарегистрировать его можно здесь: ",
-    "Certificate Chain": "Цепочка сертификатов",
-    Valid: "Действительный",
-    "Hide Tags": "Скрыть тэги",
-    Title: "Название инцидента:",
-    Content: "Содержание инцидента:",
-    Post: "Опубликовать",
-    Cancel: "Отмена",
-    Created: "Создано",
-    Unpin: "Открепить",
-    "Show Tags": "Показать тэги",
-    recent: "Сейчас",
-    "3h": "3 часа",
-    "6h": "6 часов",
-    "24h": "24 часа",
-    "1w": "1 неделя",
-    "No monitors available.": "Нет доступных мониторов",
-    "Add one": "Добавить новый",
-    Backup: "Резервная копия",
-    Security: "Безопасность",
-    "Shrink Database": "Сжать Базу Данных",
-    "Current User": "Текущий пользователь",
-    About: "О программе",
-    Description: "Описание",
-    "Powered by": "Работает на основе скрипта от",
-    shrinkDatabaseDescription: "Включает VACUUM для базы данных SQLite. Если ваша база данных была создана на версии 1.10.0 и более, AUTO_VACUUM уже включен и это действие не требуется.",
-    deleteStatusPageMsg: "Вы действительно хотите удалить эту страницу статуса сервисов?",
-    Style: "Стиль",
-    info: "ИНФО",
-    warning: "ВНИМАНИЕ",
-    danger: "ОШИБКА",
-    primary: "ОСНОВНОЙ",
-    light: "СВЕТЛЫЙ",
-    dark: "ТЕМНЫЙ",
-    "New Status Page": "Новая страница статуса",
-    "Show update if available": "Показывать доступные обновления",
-    "Also check beta release": "Проверять обновления для бета версий",
-    "Add New Status Page": "Добавить страницу статуса",
-    Next: "Далее",
-    "Accept characters: a-z 0-9 -": "Разрешены символы: a-z 0-9 -",
-    "Start or end with a-z 0-9 only": "Начало и окончание имени только на символы: a-z 0-9",
-    "No consecutive dashes --": "Запрещено использовать тире --",
-    "HTTP Options": "HTTP Опции",
-    Authentication: "Аутентификация",
-    "HTTP Basic Auth": "HTTP Авторизация",
-    PushByTechulus: "Push by Techulus",
-    clicksendsms: "ClickSend SMS",
-    GoogleChat: "Google Chat (только Google Workspace)",
-    apiCredentials: "API реквизиты",
-    Done: "Готово",
-    Info: "Инфо",
-    "Steam API Key": "Steam API-Ключ",
-    "Pick a RR-Type...": "Выберите RR-Тип...",
-    "Pick Accepted Status Codes...": "Выберите принятые коды состояния...",
-    Default: "По умолчанию",
-    "Please input title and content": "Пожалуйста, введите название и содержание",
-    "Last Updated": "Последнее Обновление",
-    "Untitled Group": "Группа без названия",
-    Services: "Сервисы",
-    serwersms: "SerwerSMS.pl",
-    serwersmsAPIUser: "API Пользователь (включая префикс webapi_)",
-    serwersmsAPIPassword: "API Пароль",
-    serwersmsPhoneNumber: "Номер телефона",
-    serwersmsSenderName: "SMS Имя Отправителя (регистрированный через пользовательский портал)",
-    stackfield: "Stackfield",
-    smtpDkimSettings: "DKIM Настройки",
-    smtpDkimDesc: "Пожалуйста ознакомьтесь с {0} Nodemailer DKIM для использования.",
-    documentation: "документацией",
-    smtpDkimDomain: "Имя Домена",
-    smtpDkimKeySelector: "Ключ",
-    smtpDkimPrivateKey: "Приватный ключ",
-    smtpDkimHashAlgo: "Алгоритм хэша (опционально)",
-    smtpDkimheaderFieldNames: "Заголовок ключей для подписи (опционально)",
-    smtpDkimskipFields: "Заголовок ключей не для подписи (опционально)",
-    gorush: "Gorush",
-    alerta: "Alerta",
-    alertaApiEndpoint: "Конечная точка API",
-    alertaEnvironment: "Среда",
-    alertaApiKey: "Ключ API",
-    alertaAlertState: "Состояние алерта",
-    alertaRecoverState: "Состояние восстановления",
-    Proxies: "Прокси",
-    "Setup Proxy": "Настройка Прокси",
-    "Proxy Protocol": "Протокол Прокси",
-    "Proxy Server": "Прокси",
-    "Proxy server has authentication": "Прокси имеет аутентификацию",
-    "Reverse Proxy": "Обратный прокси",
-    "No Proxy": "Без прокси",
-    default: "По умолчанию",
-    enabled: "Включено",
-    setAsDefault: "Установлено по умолчанию",
-    deleteProxyMsg: "Вы действительно хотите удалить этот прокси для всех мониторов?",
-    proxyDescription: "Прокси должны быть привязаны к монитору, чтобы работать.",
-    enableProxyDescription: "Этот прокси не будет влиять на запросы монитора, пока не будет активирован. Вы можете контролировать временное отключение прокси для всех мониторов через статус активации.",
-    setAsDefaultProxyDescription: "Этот прокси будет по умолчанию включен для новых мониторов. Вы всё ещё можете отдельно отключать прокси в каждом мониторе.",
-    Invalid: "Недействительный",
-    AccessKeyId: "AccessKey ID",
-    SecretAccessKey: "AccessKey Secret",
-    PhoneNumbers: "PhoneNumbers",
-    TemplateCode: "TemplateCode",
-    SignName: "SignName",
-    "Sms template must contain parameters: ": "Шаблон СМС должен содержать параметры: ",
-    "Bark Endpoint": "Bark Endpoint",
-    "Bark Group": "Bark Group",
-    "Bark Sound": "Bark Sound",
-    WebHookUrl: "WebHookUrl",
-    SecretKey: "SecretKey",
-    "For safety, must use secret key": "В целях безопасности необходимо использовать секретный ключ",
-    "Device Token": "Токен устройства",
-    Platform: "Платформа",
-    iOS: "iOS",
-    Android: "Android",
-    Huawei: "Huawei",
-    High: "High",
-    Retry: "Повторить",
-    Topic: "Тема",
-    "WeCom Bot Key": "WeCom Bot Key",
-    User: "Пользователь",
-    Installed: "Установлено",
-    "Not installed": "Не установлено",
-    Running: "Запускается",
-    "Not running": "Не запускается",
-    "Remove Token": "Удалить токен",
-    Start: "Запустить",
-    Stop: "Остановить",
-    "Uptime Kuma": "Uptime Kuma",
-    Slug: "Slug",
-    "Accept characters:": "Принимаемые символы:",
-    startOrEndWithOnly: "Начинается или кончается только {0}",
-    "No consecutive dashes": "Без последовательных тире",
-    "The slug is already taken. Please choose another slug.": "The slug is already taken. Please choose another slug.",
-    "Page Not Found": "Страница не найдена",
-    wayToGetCloudflaredURL: "(Скачать cloudflared с {0})",
-    cloudflareWebsite: "Cloudflare Website",
-    "Message:": "Сообщение:",
-    "Don't know how to get the token? Please read the guide:": "Don't know how to get the token? Please read the guide:",
-    "The current connection may be lost if you are currently connecting via Cloudflare Tunnel. Are you sure want to stop it? Type your current password to confirm it.": "The current connection may be lost if you are currently connecting via Cloudflare Tunnel. Are you sure want to stop it? Type your current password to confirm it.",
-    "HTTP Headers": "HTTP заголовки",
-    "Trust Proxy": "Доверять прокси",
-    "Other Software": "Другое программное обеспечение",
-    "For example: nginx, Apache and Traefik.": "К примеру: nginx, Apache и Traefik.",
-    "Please read": "Пожалуйста, прочитайте",
-    "Subject:": "Тема:",
-    "Valid To:": "Действителен до:",
-    "Days Remaining:": "Дней осталось:",
-    "Issuer:": "Издатель:",
-    "Fingerprint:": "Отпечаток:",
-    "No status pages": "Нет статусных страниц",
-    "Domain Name Expiry Notification": "Уведомление об истечении срока действия доменного имени",
-    Proxy: "Прокси",
-    "Date Created": "Дата создания",
-    HomeAssistant: "Home Assistant",
-    onebotHttpAddress: "OneBot HTTP Address",
-    onebotMessageType: "OneBot Message Type",
-    onebotGroupMessage: "Группа",
-    onebotPrivateMessage: "Private",
-    onebotUserOrGroupId: "Группа/ID пользователя",
-    onebotSafetyTips: "В целях безопасности необходимо установить токен доступа",
-    "PushDeer Key": "PushDeer Key",
-    "Footer Text": "Текст нижнего колонтитула",
-    "Show Powered By": "Показывать на чем создано",
-    "Domain Names": "Доменные имена",
-    signedInDisp: "Вы вошли как {0}",
-    signedInDispDisabled: "Аутентификация отключена.",
-    RadiusSecret: "Секрет Radius",
-    RadiusSecretDescription: "Общий секрет между клиентом и сервером",
-    RadiusCalledStationId: "Идентификатор вызываемой станции",
-    RadiusCalledStationIdDescription: "Идентификатор вызываемого устройства",
-    RadiusCallingStationId: "Идентификатор вызывающей станции",
-    RadiusCallingStationIdDescription: "Идентификатор вызывающего устройства",
-    "Certificate Expiry Notification": "Уведомление об истечении срока действия сертификата",
-    "API Username": "Имя пользователя API",
-    "API Key": "API ключ",
-    "Recipient Number": "Номер получателя",
-    "From Name/Number": "Имя/номер отправителя",
-    "Leave blank to use a shared sender number.": "Оставьте пустым, чтобы использовать общий номер отправителя.",
-    "Octopush API Version": "Версия API Octopush",
-    "Legacy Octopush-DM": "Legacy Octopush-DM",
-    endpoint: "endpoint",
-    octopushAPIKey: "\"API key\" из учетных данных HTTP API в панели управления",
-    octopushLogin: "\"Login\" из учетных данных HTTP API в панели управления",
-    promosmsLogin: "Логин API",
-    promosmsPassword: "Пароль API",
-    "pushoversounds pushover": "Pushover (default)",
-    "pushoversounds bike": "Bike",
-    "pushoversounds bugle": "Bugle",
-    "pushoversounds cashregister": "Cash Register",
-    "pushoversounds classical": "Classical",
-    "pushoversounds cosmic": "Cosmic",
-    "pushoversounds falling": "Falling",
-    "pushoversounds gamelan": "Gamelan",
-    "pushoversounds incoming": "Incoming",
-    "pushoversounds intermission": "Intermission",
-    "pushoversounds magic": "Magic",
-    "pushoversounds mechanical": "Mechanical",
-    "pushoversounds pianobar": "Piano Bar",
-    "pushoversounds siren": "Siren",
-    "pushoversounds spacealarm": "Space Alarm",
-    "pushoversounds tugboat": "Tug Boat",
-    "pushoversounds alien": "Alien Alarm (long)",
-    "pushoversounds climb": "Climb (long)",
-    "pushoversounds persistent": "Persistent (long)",
-    "pushoversounds echo": "Pushover Echo (long)",
-    "pushoversounds updown": "Up Down (long)",
-    "pushoversounds vibrate": "Vibrate Only",
-    "pushoversounds none": "None (silent)",
-    pushyAPIKey: "Secret API Key",
-    pushyToken: "Токен устройства",
-    "Using a Reverse Proxy?": "Используете обратный прокси?",
-    "Check how to config it for WebSocket": "Проверьте, как настроить его для WebSocket",
-    "Steam Game Server": "Steam Game Server",
-    "Most likely causes:": "Наиболее вероятные причины:",
-    "The resource is no longer available.": "Ресурс больше не доступен.",
-    "There might be a typing error in the address.": "В адресе может быть опечатка.",
-    "What you can try:": "Что вы можете попробовать:",
-    "Retype the address.": "Повторите адрес.",
-    "Go back to the previous page.": "Вернуться на предыдущую страницу.",
-    "Coming Soon": "Скоро",
-    wayToGetClickSendSMSToken: "Вы можете получить имя пользователя API и ключ API из {0} .",
-    "Connection String": "Строка подключения",
-    Query: "Запрос",
-    settingsCertificateExpiry: "Истекание TLS сертификата",
-    certificationExpiryDescription: "HTTPS Мониторы инициируют уведомление, когда срок действия сертификата TLS истечет:",
-    "Setup Docker Host": "Настроить Docker Host",
-    "Connection Type": "Тип соединения",
-    "Docker Daemon": "Docker Daemon",
-    deleteDockerHostMsg: "Are you sure want to delete this docker host for all monitors?",
-    socket: "Socket",
-    tcp: "TCP / HTTP",
-    "Docker Container": "Docker контейнер",
-    "Container Name / ID": "Название контейнера / ID",
-    "Docker Host": "Docker Host",
-    "Docker Hosts": "Docker Hosts",
-    "ntfy Topic": "ntfy Topic",
-    Domain: "Домен",
-    Workstation: "Workstation",
-    disableCloudflaredNoAuthMsg: "Вы находитесь в режиме без авторизации, пароль не требуется.",
-    trustProxyDescription: "Доверять заголовкам 'X-Forwarded-*'. Если вы хотите получить правильный IP-адрес клиента, а ваш Uptime Kuma находится под Nginx или Apache, вам следует включить этот параметр.",
-    wayToGetLineNotifyToken: "Вы можете получить токен доступа в {0}",
-    Examples: "Примеры",
-    "Home Assistant URL": "Home Assistant URL",
-    "Long-Lived Access Token": "Токен доступа с длительным сроком службы",
-    "Long-Lived Access Token can be created by clicking on your profile name (bottom left) and scrolling to the bottom then click Create Token. ": "Long-Lived Access Token can be created by clicking on your profile name (bottom left) and scrolling to the bottom then click Create Token. ",
-    "Notification Service": "Служба уведомлений",
-    "default: notify all devices": "по стандарту: уведомлять все устройства",
-    "A list of Notification Services can be found in Home Assistant under \"Developer Tools > Services\" search for \"notification\" to find your device/phone name.": "A list of Notification Services can be found in Home Assistant under \"Developer Tools > Services\" search for \"notification\" to find your device/phone name.",
-    "Automations can optionally be triggered in Home Assistant:": "При желании автоматизацию можно активировать в Home Assistant.:",
-    "Trigger type:": "Тип триггера:",
-    "Event type:": "Тип события:",
-    "Event data:": "Данные события:",
-    "Then choose an action, for example switch the scene to where an RGB light is red.": "Затем выберите действие, например, переключите сцену на красный индикатор RGB..",
-    "Frontend Version": "Версия интерфейса",
-    "Frontend Version do not match backend version!": "Версия интерфейса не соответствует версии серверной части!",
-    "Base URL": "Базовый URL",
-    goAlertInfo: "GoAlert is a An open source application for on-call scheduling, automated escalations and notifications (like SMS or voice calls). Automatically engage the right person, the right way, and at the right time! {0}",
-    goAlertIntegrationKeyInfo: "Получить общий ключ интеграции API для сервиса в этом формате \"aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee\" обычно значение параметра токена скопированного URL.",
-    goAlert: "GoAlert",
-    backupOutdatedWarning: "Устарело: поскольку добавлено множество функций, а эта функция резервного копирования немного не поддерживается, она не может создать или восстановить полную резервную копию.",
-    backupRecommend: "Сделайте резервную копию тома или папки с данными (./data/) напрямую.",
-    "Optional": "Необязательно",
-    squadcast: "Squadcast",
-    SendKey: "SendKey",
-    "SMSManager API Docs": "Документация к API SMSManager ",
-    "Gateway Type": "Тип шлюза",
-    SMSManager: "SMSManager",
-    "You can divide numbers with": "Вы можете делить числа с",
-    "or": "или",
-};
diff --git a/src/languages/sl-SI.js b/src/languages/sl-SI.js
deleted file mode 100644
index 48bbeb206..000000000
--- a/src/languages/sl-SI.js
+++ /dev/null
@@ -1,357 +0,0 @@
-export default {
-    languageName: "Slovenščina",
-    checkEverySecond: "Preveri na vsakih {0} sekund",
-    retryCheckEverySecond: "Ponovno poskusi na vsakih {0} sekund",
-    retriesDescription: "Maksimalno število poskusov predenj se storitev označi kot 'ne deluje' in se pošlje obvestilo",
-    ignoreTLSError: "Ignoriraj TLS/SSL napake za HTTPS spletne strani",
-    upsideDownModeDescription: "Negiraj status. Če je storitev deluje bo označena kot 'ne deluje'.",
-    maxRedirectDescription: "Maksimalno število sledečih preusmeritev. 0 onemogoči preusmeritve.",
-    acceptedStatusCodesDescription: "Izberi kode statusa veljavna kot uspešen odgovor.",
-    passwordNotMatchMsg: "Ponovljeno geslo se ne ujema.",
-    notificationDescription: "Obvestila morajo biti dodeljena monitorju, da delujejo.",
-    keywordDescription: "Iskana ključna beseda v surovem HTML ali JSON odgovoru. Iskanje je občutljivo na začetnico.",
-    pauseDashboardHome: "Pavza",
-    deleteMonitorMsg: "Ste prepričani, da želite izbrisati ta monitor?",
-    deleteNotificationMsg: "Ste prepričani, da želite izbrisati to obvestilo za vse monitorje?",
-    resolverserverDescription: "Cloudflare je privzeti strežnik. DNS strežnik lahko spremenite kadarkoli.",
-    rrtypeDescription: "Izberite RR tip, ki ga želite spremljati",
-    pauseMonitorMsg: "Ste prepričani, da želite pavzirati?",
-    enableDefaultNotificationDescription: "To obvestilo bo kot privzeto omogočeno za vse nove monitorje. Še vedno ga lahko izključite posebej za vsak monitor.",
-    clearEventsMsg: "Ste prepričani da želite izbrisati vse dogodke tega monitorja?",
-    clearHeartbeatsMsg: "Ste prepričani da želite izbrisati vse srčne utripe tega monitorja?",
-    confirmClearStatisticsMsg: "Ste prepričani da želite izbrisati VSO statistiko?",
-    importHandleDescription: "Izberite 'Preskoči obstoječe', če želite preskočiti vsak monitor ali obvestilo z istim imenom. 'Prepiši' bo prepisal vse obstoječe monitorje in obvestila.",
-    confirmImportMsg: "Ste prepričani da želite uvoziti varnostno kopijo? Preverite da ste izbrali pravo opcijo za uvoz.",
-    twoFAVerifyLabel: "Prosimo vnesite žeton za potrditev 2FA:",
-    tokenValidSettingsMsg: "Žeton je veljaven! Sedaj lahko shranite 2FA nastavitev.",
-    confirmEnableTwoFAMsg: "Ste prepričani, da želite omogočiti 2FA?",
-    confirmDisableTwoFAMsg: "Ste prepričani, da želite onemogočiti 2FA?",
-    Settings: "Nastavitve",
-    Dashboard: "Nadzorna plošča",
-    "New Update": "Nova posodobitev",
-    Language: "Jezik",
-    Appearance: "Izgled",
-    Theme: "Teme",
-    General: "Splošno",
-    "Primary Base URL": "Primaren URL",
-    Version: "Različica",
-    "Check Update On GitHub": "Preveri posodobitev na GitHub-u",
-    List: "Seznam",
-    Add: "Dodaj",
-    "Add New Monitor": "Dodaj nov monitor",
-    "Quick Stats": "Hitro stanje",
-    Up: "Deluje",
-    Down: "Ne deluje",
-    Pending: "Na čakanju",
-    Unknown: "Neznano",
-    Pause: "Pavza",
-    Name: "Ime",
-    Status: "Status",
-    DateTime: "DateTime",
-    Message: "Sporočilo",
-    "No important events": "Ni pomembnih dogodkov",
-    Resume: "Nadaljuj",
-    Edit: "Uredi",
-    Delete: "Izbriši",
-    Current: "Trenutno",
-    Uptime: "Uptime",
-    "Cert Exp.": "Potek certifikata",
-    day: "dan | dni",
-    "-day": "-dni",
-    hour: "ura",
-    "-hour": "-ur",
-    Response: "Odgovor",
-    Ping: "Ping",
-    "Monitor Type": "Tip monitorja",
-    Keyword: "Ključna beseda",
-    "Friendly Name": "Ime za prikaz",
-    URL: "URL",
-    Hostname: "Hostname",
-    Port: "Vrata",
-    "Heartbeat Interval": "Interval srčnega utripa",
-    Retries: "Ponovni poskusi",
-    "Heartbeat Retry Interval": "Ponovni poskus srčnega utripa",
-    Advanced: "Napredno",
-    "Upside Down Mode": "Negiran način",
-    "Max. Redirects": "Max. preusmeritev",
-    "Accepted Status Codes": "Sprejete kode statusa",
-    "Push URL": "Push URL",
-    needPushEvery: "Pokliči ta URL vsakih {0} sekund.",
-    pushOptionalParams: "Dodatni parametri: {0}",
-    Save: "Shrani",
-    Notifications: "Obvestila",
-    "Not available, please setup.": "Ni na voljo, prosimo nastavite.",
-    "Setup Notification": "Nastavi obvestila",
-    Light: "Svetlo",
-    Dark: "Temno",
-    Auto: "Auto",
-    "Theme - Heartbeat Bar": "Tema - vrstica srčnega utripa",
-    Normal: "Normalna",
-    Bottom: "Spodaj",
-    None: "Brez",
-    Timezone: "Časovni pas",
-    "Search Engine Visibility": "Vidljivost v spletnih iskalnikih",
-    "Allow indexing": "Dovoli indeksiranje",
-    "Discourage search engines from indexing site": "Odvračaj spletne iskalnike od indeksiranja te strani",
-    "Change Password": "Zamenjaj geslo",
-    "Current Password": "Trenutno geslo",
-    "New Password": "Novo geslo",
-    "Repeat New Password": "Ponovi novo geslo",
-    "Update Password": "Posodobi geslo",
-    "Disable Auth": "Onemogoči auth",
-    "Enable Auth": "Omogoči auth",
-    "disableauth.message1": "Ali ste prepričani, da želite onemogočiti <strong>avtentikacijo</strong>?",
-    "disableauth.message2": "Namenjen je <strong>nekomu, ki ima pred programom Uptime Kuma vklopljeno zunanje preverjanje pristnosti</strong>, na primer Cloudflare Access.",
-    "Please use this option carefully!": "Uporabljajte previdno.",
-    Logout: "Odjava",
-    Leave: "Zapusti",
-    "I understand, please disable": "Razumem, prosim onemogočite",
-    Confirm: "Potrdi",
-    Yes: "Da",
-    No: "Ne",
-    Username: "Uporabniško ime",
-    Password: "Geslo",
-    "Remember me": "Zapomni si me",
-    Login: "Vpis",
-    "No Monitors, please": "Prosim, brez monitorjev",
-    "add one": "Dodaj enega",
-    "Notification Type": "Tip obvestila",
-    Email: "Email",
-    Test: "Test",
-    "Certificate Info": "Informacije certifikata",
-    "Resolver Server": "Strežnik za razreševanje",
-    "Resource Record Type": "Vrsta zapisa o viru",
-    "Last Result": "Zadnji rezultat",
-    "Create your admin account": "Ustvari administratorski račun",
-    "Repeat Password": "Ponovi geslo",
-    "Import Backup": "Uvozi varnostno kopijo",
-    "Export Backup": "Izvozi varnostno kopijo",
-    Export: "Izvozi",
-    Import: "Uvozi",
-    respTime: "Odzivni čas (ms)",
-    notAvailableShort: "N/A",
-    "Default enabled": "Privzeto omogočeno",
-    "Apply on all existing monitors": "Uporabi na vseh obstoječih monitorjih",
-    Create: "Ustvari",
-    "Clear Data": "Izbriši podatke",
-    Events: "Dogodki",
-    Heartbeats: "Srčni utripi",
-    "Auto Get": "Auto Get",
-    backupDescription: "Izvozite lahko vse monitorje in obvestila v JSON datoteko.",
-    backupDescription2: "Pomni: Zgodovina in podatki dogodkov niso vključeni.",
-    backupDescription3: "Občutljivi podatki, kot žetoni za obvestila so vlkjučeni v datoteko za izvoz; prosimo hranite na varnem.",
-    alertNoFile: "Izberite datoteko za Uvoz.",
-    alertWrongFileType: "Prosimo izberite JSON datoteko.",
-    "Clear all statistics": "Pobrišite vso statistiko",
-    "Skip existing": "Preskoči obstoječe",
-    Overwrite: "Prepiši",
-    Options: "Možnosti",
-    "Keep both": "Ohrani oboje",
-    "Verify Token": "Potrdi žeton",
-    "Setup 2FA": "Nastavi 2FA",
-    "Enable 2FA": "Omogoči 2FA",
-    "Disable 2FA": "Onemogoči 2FA",
-    "2FA Settings": "2FA nastavitve",
-    "Two Factor Authentication": "Preverjanje pristnosti z dvema dejavnikoma",
-    Active: "Aktivno",
-    Inactive: "Neaktivno",
-    Token: "Žeton",
-    "Show URI": "Prikaži URI",
-    Tags: "Značke",
-    "Add New below or Select...": "Dodaj novo spodaj ali izberi iz seznama...",
-    "Tag with this name already exist.": "Značka s tem imenom že obstaja.",
-    "Tag with this value already exist.": "Značka s to vrednostjo že obstaja.",
-    color: "barva",
-    "value (optional)": "vrednost (po želji)",
-    Gray: "Siva",
-    Red: "Rdeča",
-    Orange: "Oranžna",
-    Green: "Zelena",
-    Blue: "Modra",
-    Indigo: "Indigo",
-    Purple: "Vijolična",
-    Pink: "Roza",
-    "Search...": "Išči...",
-    "Avg. Ping": "Avg. Ping",
-    "Avg. Response": "Avg. odziv",
-    "Entry Page": "Vstopna stran",
-    statusPageNothing: "Nikjer nič... Dodajte skupino ali monitor.",
-    "No Services": "Ni storitev",
-    "All Systems Operational": "Vsi sistemi delujejo",
-    "Partially Degraded Service": "Delno poslabšana storitev",
-    "Degraded Service": "Poslabšana storitev",
-    "Add Group": "Dodaj skupino",
-    "Add a monitor": "Dodaj monitor",
-    "Edit Status Page": "Uredi statusno stran",
-    "Go to Dashboard": "Pojdi na nadzorno ploščo",
-    "Status Page": "Statusna stran",
-    "Status Pages": "Statusne strani",
-    defaultNotificationName: "Moje {notification} Obvestilo ({number})",
-    here: "tukaj",
-    Required: "Obvezno",
-    telegram: "Telegram",
-    "Bot Token": "Robotkov žetonček",
-    wayToGetTelegramToken: "Lahko dobiš žeton od {0}.",
-    "Chat ID": "ID pogovora",
-    supportTelegramChatID: "Direkten pogovor pomoči / Skupina / ID kanala",
-    wayToGetTelegramChatID: "Id lahko dobiš, če pošlješ sporočilo robotku in odpreš ta URL, da bi videl chat_id:",
-    "YOUR BOT TOKEN HERE": "ROBOTKOV ŽETON TUKAJ",
-    chatIDNotFound: "Ne najdem Chat Id-ja; prvo pošlji sporočilo robotku",
-    webhook: "Webhook",
-    "Post URL": "Post URL",
-    "Content Type": "Vrsta vsebine",
-    webhookJsonDesc: "{0} je v redu za vsak moderen HTTP strežnik, kot recimo Express.js",
-    webhookFormDataDesc: "{multipart} je v redu za PHP. JSON bo moral biti razčlenjen s {decodeFunction}",
-    smtp: "Email (SMTP)",
-    secureOptionNone: "Brez / STARTTLS (25, 587)",
-    secureOptionTLS: "TLS (465)",
-    "Ignore TLS Error": "Ignoriraj TLS napako",
-    "From Email": "Od Email",
-    emailCustomSubject: "Poljubna zadeva",
-    "To Email": "Za Email",
-    smtpCC: "CC",
-    smtpBCC: "BCC",
-    discord: "Discord",
-    "Discord Webhook URL": "Discord Webhook URL",
-    wayToGetDiscordURL: "To lahko dibiš v Server Settings -> Integrations -> Create Webhook",
-    "Bot Display Name": "Prikazno ime robotka",
-    "Prefix Custom Message": "Predpona poljubnega sporočila",
-    "Hello @everyone is...": "Pozdravljen {'@'}everyone je...",
-    teams: "Microsoft Teams",
-    "Webhook URL": "Webhook URL",
-    wayToGetTeamsURL: "Izvedi kako narediš webhook URL {0}.",
-    signal: "Signal",
-    Number: "Številka",
-    Recipients: "Prejemniki",
-    needSignalAPI: "Imeti moraš signal klienta z REST API.",
-    wayToCheckSignalURL: "Kako se to naredi, lahko preveriš na tem URL-ju:",
-    signalImportant: "POMEMBNO: Ne moreš mešati skupin in številk v prejemnikih!",
-    gotify: "Gotify",
-    "Application Token": "Žeton za aplikacijo",
-    "Server URL": "URL Strežnika",
-    Priority: "Prioriteta",
-    slack: "Slack",
-    "Icon Emoji": "Emoji ikona",
-    "Channel Name": "Ime kanala",
-    "Uptime Kuma URL": "Uptime Kuma URL",
-    aboutWebhooks: "Več o webhook-ih: {0}",
-    aboutChannelName: "Vnesi ime kanala na {0} Channel Name polje, če želiš preskočiti webhook kanal. npr.: #drug-kanal",
-    aboutKumaURL: "Če pustite polje Uptime Kuma URL prazno, bo nastavljeno privzeto na GitHub stran projekta.",
-    emojiCheatSheet: "Emoji plonk listek: {0}",
-    "rocket.chat": "Rocket.Chat",
-    pushover: "Pushover",
-    pushy: "Pushy",
-    octopush: "Octopush",
-    promosms: "PromoSMS",
-    clicksendsms: "ClickSend SMS",
-    lunasea: "LunaSea",
-    apprise: "Apprise (podpira 50+ storitev za obveščevanje)",
-    pushbullet: "Pushbullet",
-    line: "Line Messenger",
-    mattermost: "Mattermost",
-    "User Key": "User Key",
-    Device: "Naprava",
-    "Message Title": "Naslov sporočila",
-    "Notification Sound": "Zvok obvestila",
-    "More info on:": "Več informacij na: {0}",
-    pushoverDesc1: "Prioriteta nujnosti (2) ima privzeto nastavitev 30 sekund časa med ponovni poskusi in poteče po 1 uri.",
-    pushoverDesc2: "Če želite pošiljati obvestila na različne naprave izpolnite polje 'Naprava'.",
-    "SMS Type": "Vrsta SMS-a",
-    octopushTypePremium: "Premium (hitro - priporočljivo za opozarjanje)",
-    octopushTypeLowCost: "Cenovno ugodno (počasno - včasih jih blokira operater)",
-    checkPrice: "preveri {0} cene:",
-    apiCredentials: "API poverilnice",
-    octopushLegacyHint: "Uporabljate legacy verzijo Octopush-a (2011-2020) ali novo verzijo?",
-    "Check octopush prices": "Preveri octopush cene {0}.",
-    octopushPhoneNumber: "Telefonska številka (npr.: +386031234567) ",
-    octopushSMSSender: "Ime SMS pošiljatelja: 3-11 alfanumeričnih znakov in presledki (a-zA-Z0-9)",
-    "LunaSea Device ID": "LunaSea Device ID",
-    "Apprise URL": "Apprise URL",
-    "Example:": "Primer: {0}",
-    "Read more:": "Preberi več: {0}",
-    "Status:": "Status: {0}",
-    "Read more": "Preberi več",
-    appriseInstalled: "Apprise je nameščen.",
-    appriseNotInstalled: "Apprise ni nameščen. {0}",
-    "Access Token": "Žeton za dostop",
-    "Channel access token": "Žeton za dostop do kanala",
-    "Line Developers Console": "Line Developers Console",
-    lineDevConsoleTo: "Line Developers Console - {0}",
-    "Basic Settings": "Osnovne nastavitve",
-    "User ID": "User ID",
-    "Messaging API": "Messaging API",
-    wayToGetLineChannelToken: "Prvo odpri {0}, ustvarite ponudnika in kanal (Messaging API), potem lahko žeton za dostop do kanala in ID uporabnika dobite iz zgoraj navedenih elementov menija.",
-    "Icon URL": "URL ikone",
-    aboutIconURL: "V razdelku \"URL ikone\" lahko zagotovite povezavo do slike, ki bo nadomestila privzeto sliko profila. Ne bo uporabljena, če je nastavljena ikona Emoji.",
-    aboutMattermostChannelName: "V razdelku \"URL ikone\" lahko zagotovite povezavo do slike, ki bo nadomestila privzeto sliko profila. Ne bo uporabljena, če je nastavljena ikona Emoji",
-    matrix: "Matrix",
-    promosmsTypeEco: "SMS ECO - poceni, vendar počasen in pogosto preobremenjen. Omejeno samo na poljske prejemnike.",
-    promosmsTypeFlash: "SMS FLASH - sporočilo se samodejno prikaže v napravi prejemnika. Omejeno samo na poljske prejemnike.",
-    promosmsTypeFull: "SMS FULL - Premium raven SMS, Uporabite lahko svoje ime pošiljatelja (najprej morate registrirati ime). Zanesljivo za opozorila.",
-    promosmsTypeSpeed: "SMS SPEED - Najvišja prednost v sistemu. Zelo hitro in zanesljivo, vendar drago (približno dvakratnik cene SMS FULL)..",
-    promosmsPhoneNumber: "Telefonska številka (za poljskega prejemnika Lahko preskočite področne oznake",
-    promosmsSMSSender: "Ime pošiljatelja SMS : vnaprej registrirano ime ali eno od privzetih: SMS, SMS Info, MaxSMS, INFO, SMS",
-    "Feishu WebHookUrl": "Feishu WebHookURL",
-    matrixHomeserverURL: "Homeserver URL (z http(s):// in vrata po želji)",
-    "Internal Room Id": "Interni ID sobe",
-    matrixDesc1: "Notranji ID sobe lahko poiščete v naprednem razdelku nastavitev sobe v odjemalcu Matrix. Izgledati mora kot !QMdRCpUIfLwsfjxye6:home.server",
-    matrixDesc2: "Zelo priporočljivo je, da ustvarite novega uporabnika in ne uporabljate svojega žetona za dostop uporabnika Matrix, saj bo omogočil popoln dostop do vašega računa in vseh sob, ki ste se jim pridružili. Namesto tega ustvarite novega uporabnika in ga povabite le v sobo, v kateri želite prejemati obvestila. Token dostopa lahko dobite tako, da zaženete {0}",
-    Method: "Metoda",
-    Body: "Telo",
-    Headers: "Glave",
-    PushUrl: "Push URL",
-    HeadersInvalidFormat: "Glave zahtevka niso veljavni JSON: ",
-    BodyInvalidFormat: "Telo zahteve ni veljaven JSON: ",
-    "Monitor History": "Zgodovina",
-    clearDataOlderThan: "Ohrani zgodovino {0} dni.",
-    PasswordsDoNotMatch: "Gesli se ne ujemata.",
-    records: "vnosi",
-    "One record": "En vnos",
-    steamApiKeyDescription: "Za spremljanje igralnega strežnika Steam potrebujete ključ spletnega vmesnika Steam. Ključ API lahko registrirate tukaj: ",
-    "Current User": "Trenuten uporabnik",
-    recent: "Nedavno",
-    Done: "Zaključi",
-    Info: "Info",
-    Security: "Varnost",
-    "Steam API Key": "Steam API Key",
-    "Shrink Database": "Stisni bazo",
-    "Pick a RR-Type...": "Izberi RR tip...",
-    "Pick Accepted Status Codes...": "Izbiranje sprejetih kod stanja...",
-    Default: "Privzeto",
-    "HTTP Options": "HTTP možnosti",
-    "Create Incident": "Ustvari incident",
-    Title: "Naslov",
-    Content: "Vsebina",
-    Style: "Stil",
-    info: "info",
-    warning: "opozorilo",
-    danger: "nevarnost",
-    primary: "primarno",
-    light: "svetlo",
-    dark: "temno",
-    Post: "Objavi",
-    "Please input title and content": "Vnesi naslov in vsebino",
-    Created: "Ustvarjeno",
-    "Last Updated": "Nazadnje posodobljeno",
-    Unpin: "Odpni",
-    "Switch to Light Theme": "Preklopi na svetlo temo",
-    "Switch to Dark Theme": "Preklopi na temno temo",
-    "Show Tags": "Prikaži značke",
-    "Hide Tags": "Skrij značke",
-    Description: "Opis",
-    "No monitors available.": "Nobenega monitorja ni na voljo.",
-    "Add one": "Dodaj enega",
-    "No Monitors": "Ni monitorjev",
-    "Untitled Group": "Skupina brez imena",
-    Services: "Storitve",
-    Discard: "zavrzi",
-    Cancel: "Prekliči",
-    "Powered by": "Powered by",
-    shrinkDatabaseDescription: "Sprožitev podatkovne zbirke VACUUM za SQLite. Če je vaša zbirka podatkov ustvarjena po različici 1.10.0, je funkcija AUTO_VACUUM že omogočena in ta ukrep ni potreben.",
-    serwersms: "SerwerSMS.pl",
-    serwersmsAPIUser: "API uporabniško ime (vključno z webapi_ prefix)",
-    serwersmsAPIPassword: "API geslo",
-    serwersmsPhoneNumber: "Telefonska številka",
-    serwersmsSenderName: "Ime SMS pošiljatelja (registrirani prek portala za stranke)",
-    "stackfield": "Stackfield",
-};
diff --git a/src/languages/sr-latn.js b/src/languages/sr-latn.js
deleted file mode 100644
index 32e074eea..000000000
--- a/src/languages/sr-latn.js
+++ /dev/null
@@ -1,204 +0,0 @@
-export default {
-    languageName: "Srpski",
-    checkEverySecond: "Proveri svakih {0} sekundi.",
-    retriesDescription: "Maksimum pokušaja pre nego što se servis obeleži kao neaktivan i pošalje se obaveštenje.",
-    ignoreTLSError: "Ignoriši TLS/SSL greške za HTTPS veb stranice.",
-    upsideDownModeDescription: "Obrnite status. Ako je servis dostupan, onda je obeležen kao neaktivan.",
-    maxRedirectDescription: "Maksimani broj preusmerenja da se prate. Postavite na 0 da bi se isključila preusmerenja.",
-    acceptedStatusCodesDescription: "Odaberite statusne kodove koji se smatraju uspešnim odgovorom.",
-    passwordNotMatchMsg: "Ponovljena lozinka se ne poklapa.",
-    notificationDescription: "Molim Vas postavite obaveštenje za masmatrače da bise aktivirali.",
-    keywordDescription: "Pretraži ključnu reč u čistom html ili JSON odgovoru sa osetljivim velikim i malim slovima",
-    pauseDashboardHome: "Pauziraj",
-    deleteMonitorMsg: "Da li ste sigurni da želite da obrišete ovog posmatrača?",
-    deleteNotificationMsg: "Da li ste sigurni d aželite da uklonite ovo obaveštenje za sve posmatrače?",
-    resolverserverDescription: "Cloudflare je podrazumevani server. Možete promeniti server za raszrešavanje u bilo kom trenutku.",
-    rrtypeDescription: "Odaberite RR-Type koji želite da posmatrate",
-    pauseMonitorMsg: "Da li ste sigurni da želite da pauzirate?",
-    Settings: "Podešavanja",
-    Dashboard: "Komandna tabla",
-    "New Update": "Nova verzija",
-    Language: "Jezik",
-    Appearance: "Izgled",
-    Theme: "Tema",
-    General: "Opšte",
-    Version: "Verzija",
-    "Check Update On GitHub": "Proverite novu verziju na GitHub-u",
-    List: "Lista",
-    Add: "Dodaj",
-    "Add New Monitor": "Dodaj novog posmatrača",
-    "Quick Stats": "Brze statistike",
-    Up: "Aktivno",
-    Down: "Neaktivno",
-    Pending: "Nerešeno",
-    Unknown: "Nepoznato",
-    Pause: "Pauziraj",
-    Name: "Ime",
-    Status: "Status",
-    DateTime: "Datum i vreme",
-    Message: "Poruka",
-    "No important events": "Nema bitnih događaja",
-    Resume: "Nastavi",
-    Edit: "Izmeni",
-    Delete: "Ukloni",
-    Current: "Trenutno",
-    Uptime: "Vreme rada",
-    "Cert Exp.": "Istek sert.",
-    day: "dan | dana",
-    "-day": "-dana",
-    hour: "sat",
-    "-hour": "-sata",
-    Response: "Odgovor",
-    Ping: "Ping",
-    "Monitor Type": "Tip posmatrača",
-    Keyword: "Ključna reč",
-    "Friendly Name": "Prijateljsko ime",
-    URL: "URL",
-    Hostname: "Hostname",
-    Port: "Port",
-    "Heartbeat Interval": "Interval otkucaja srca",
-    Retries: "Pokušaji",
-    Advanced: "Napredno",
-    "Upside Down Mode": "Naopak mod",
-    "Max. Redirects": "Maks. preusmerenja",
-    "Accepted Status Codes": "Prihvaćeni statusni kodovi",
-    Save: "Sačuvaj",
-    Notifications: "Obaveštenja",
-    "Not available, please setup.": "Nije dostupno, molim Vas podesite.",
-    "Setup Notification": "Postavi obaveštenje",
-    Light: "Svetlo",
-    Dark: "Tamno",
-    Auto: "Automatsko",
-    "Theme - Heartbeat Bar": "Tema - Traka otkucaja srca",
-    Normal: "Normalno",
-    Bottom: "Dole",
-    None: "Isključeno",
-    Timezone: "Vremenska zona",
-    "Search Engine Visibility": "Vidljivost pretraživačima",
-    "Allow indexing": "Dozvoli indeksiranje",
-    "Discourage search engines from indexing site": "Odvraćajte pretraživače od indeksiranja sajta",
-    "Change Password": "Promeni lozinku",
-    "Current Password": "Trenutna lozinka",
-    "New Password": "Nova lozinka",
-    "Repeat New Password": "Ponovi novu lozinku",
-    "Update Password": "Izmeni lozinku",
-    "Disable Auth": "Isključi autentifikaciju",
-    "Enable Auth": "Uključi autentifikaciju",
-    "disableauth.message1": "Da li ste sigurni da želite da <strong>isključite autentifikaciju</strong>?",
-    "disableauth.message2": "To je za <strong>one koji imaju dodatu autentifikaciju</strong> ispred Uptime Kuma kao na primer Cloudflare Access.",
-    "Please use this option carefully!": "Molim Vas koristite ovo sa pažnjom.",
-    Logout: "Odloguj se",
-    Leave: "Izađi",
-    "I understand, please disable": "Razumem, molim te isključi",
-    Confirm: "Potvrdi",
-    Yes: "Da",
-    No: "Ne",
-    Username: "Korisničko ime",
-    Password: "Lozinka",
-    "Remember me": "Zapamti me",
-    Login: "Uloguj se",
-    "No Monitors, please": "Bez posmatrača molim",
-    "add one": "dodaj jednog",
-    "Notification Type": "Tip obaveštenja",
-    Email: "E-pošta",
-    Test: "Test",
-    "Certificate Info": "Informacije sertifikata",
-    "Resolver Server": "Razrešivački server",
-    "Resource Record Type": "Tip zapisa resursa",
-    "Last Result": "Poslednji rezultat",
-    "Create your admin account": "Naprivi administratorski nalog",
-    "Repeat Password": "Ponovite lozinku",
-    respTime: "Vreme odg. (ms)",
-    notAvailableShort: "N/A",
-    Create: "Create",
-    clearEventsMsg: "Are you sure want to delete all events for this monitor?",
-    clearHeartbeatsMsg: "Are you sure want to delete all heartbeats for this monitor?",
-    confirmClearStatisticsMsg: "Are you sure want to delete ALL statistics?",
-    "Clear Data": "Clear Data",
-    Events: "Events",
-    Heartbeats: "Heartbeats",
-    "Auto Get": "Auto Get",
-    enableDefaultNotificationDescription: "For every new monitor this notification will be enabled by default. You can still disable the notification separately for each monitor.",
-    "Default enabled": "Default enabled",
-    "Also apply to existing monitors": "Also apply to existing monitors",
-    Export: "Export",
-    Import: "Import",
-    backupDescription: "You can backup all monitors and all notifications into a JSON file.",
-    backupDescription2: "PS: History and event data is not included.",
-    backupDescription3: "Sensitive data such as notification tokens is included in the export file, please keep it carefully.",
-    alertNoFile: "Please select a file to import.",
-    alertWrongFileType: "Please select a JSON file.",
-    twoFAVerifyLabel: "Please type in your token to verify that 2FA is working",
-    tokenValidSettingsMsg: "Token is valid! You can now save the 2FA settings.",
-    confirmEnableTwoFAMsg: "Are you sure you want to enable 2FA?",
-    confirmDisableTwoFAMsg: "Are you sure you want to disable 2FA?",
-    "Apply on all existing monitors": "Apply on all existing monitors",
-    "Verify Token": "Verify Token",
-    "Setup 2FA": "Setup 2FA",
-    "Enable 2FA": "Enable 2FA",
-    "Disable 2FA": "Disable 2FA",
-    "2FA Settings": "2FA Settings",
-    "Two Factor Authentication": "Two Factor Authentication",
-    Active: "Active",
-    Inactive: "Inactive",
-    Token: "Token",
-    "Show URI": "Show URI",
-    "Clear all statistics": "Clear all Statistics",
-    retryCheckEverySecond: "Retry every {0} seconds.",
-    importHandleDescription: "Choose 'Skip existing' if you want to skip every monitor or notification with the same name. 'Overwrite' will delete every existing monitor and notification.",
-    confirmImportMsg: "Are you sure to import the backup? Please make sure you've selected the right import option.",
-    "Heartbeat Retry Interval": "Heartbeat Retry Interval",
-    "Import Backup": "Import Backup",
-    "Export Backup": "Export Backup",
-    "Skip existing": "Skip existing",
-    Overwrite: "Overwrite",
-    Options: "Options",
-    "Keep both": "Keep both",
-    Tags: "Tags",
-    "Add New below or Select...": "Add New below or Select...",
-    "Tag with this name already exist.": "Tag with this name already exist.",
-    "Tag with this value already exist.": "Tag with this value already exist.",
-    color: "color",
-    "value (optional)": "value (optional)",
-    Gray: "Gray",
-    Red: "Red",
-    Orange: "Orange",
-    Green: "Green",
-    Blue: "Blue",
-    Indigo: "Indigo",
-    Purple: "Purple",
-    Pink: "Pink",
-    "Search...": "Search...",
-    "Avg. Ping": "Avg. Ping",
-    "Avg. Response": "Avg. Response",
-    "Entry Page": "Entry Page",
-    statusPageNothing: "Nothing here, please add a group or a monitor.",
-    "No Services": "No Services",
-    "All Systems Operational": "All Systems Operational",
-    "Partially Degraded Service": "Partially Degraded Service",
-    "Degraded Service": "Degraded Service",
-    "Add Group": "Add Group",
-    "Add a monitor": "Add a monitor",
-    "Edit Status Page": "Edit Status Page",
-    "Go to Dashboard": "Go to Dashboard",
-    "Status Page": "Status Page",
-    "Status Pages": "Status Pages",
-    telegram: "Telegram",
-    webhook: "Webhook",
-    smtp: "Email (SMTP)",
-    discord: "Discord",
-    teams: "Microsoft Teams",
-    signal: "Signal",
-    gotify: "Gotify",
-    slack: "Slack",
-    "rocket.chat": "Rocket.chat",
-    pushover: "Pushover",
-    pushy: "Pushy",
-    octopush: "Octopush",
-    promosms: "PromoSMS",
-    lunasea: "LunaSea",
-    apprise: "Apprise (Support 50+ Notification services)",
-    pushbullet: "Pushbullet",
-    line: "Line Messenger",
-    mattermost: "Mattermost",
-};
diff --git a/src/languages/sr.js b/src/languages/sr.js
deleted file mode 100644
index bd8e4dd31..000000000
--- a/src/languages/sr.js
+++ /dev/null
@@ -1,204 +0,0 @@
-export default {
-    languageName: "Српски",
-    checkEverySecond: "Провери сваких {0} секунди.",
-    retriesDescription: "Максимум покушаја пре него што се сервис обележи као неактиван и пошаље се обавештење.",
-    ignoreTLSError: "Игнориши TLS/SSL грешке за HTTPS веб странице.",
-    upsideDownModeDescription: "Обрните статус. Ако је сервис доступан, онда је обележен као неактиван.",
-    maxRedirectDescription: "Максимани број преусмерења да се прате. Поставите на 0 да би се искључила преусмерења.",
-    acceptedStatusCodesDescription: "Одаберите статусне кодове који се сматрају успешним одговором.",
-    passwordNotMatchMsg: "Поновљена лозинка се не поклапа.",
-    notificationDescription: "Молим Вас поставите обавештење за масматраче да бисе активирали.",
-    keywordDescription: "Претражи кључну реч у чистом html или JSON одговору са осетљивим великим и малим словима",
-    pauseDashboardHome: "Паузирај",
-    deleteMonitorMsg: "Да ли сте сигурни да желите да обришете овог посматрача?",
-    deleteNotificationMsg: "Да ли сте сигурни д ажелите да уклоните ово обавештење за све посматраче?",
-    resolverserverDescription: "Cloudflare је подразумевани сервер. Можете променити сервер за расзрешавање у било ком тренутку.",
-    rrtypeDescription: "Одаберите RR-Type који желите да посматрате",
-    pauseMonitorMsg: "Да ли сте сигурни да желите да паузирате?",
-    Settings: "Подешавања",
-    Dashboard: "Командна табла",
-    "New Update": "Нова верзија",
-    Language: "Језик",
-    Appearance: "Изглед",
-    Theme: "Тема",
-    General: "Опште",
-    Version: "Верзија",
-    "Check Update On GitHub": "Проверите нову верзију на GitHub-у",
-    List: "Листа",
-    Add: "Додај",
-    "Add New Monitor": "Додај новог посматрача",
-    "Quick Stats": "Брзе статистике",
-    Up: "Активно",
-    Down: "Неактивно",
-    Pending: "Нерешено",
-    Unknown: "Непознато",
-    Pause: "Паузирај",
-    Name: "Име",
-    Status: "Статус",
-    DateTime: "Датум и време",
-    Message: "Порука",
-    "No important events": "Нема битних догађаја",
-    Resume: "Настави",
-    Edit: "Измени",
-    Delete: "Уклони",
-    Current: "Тренутно",
-    Uptime: "Време рада",
-    "Cert Exp.": "Истек серт.",
-    day: "дан | дана",
-    "-day": "-дана",
-    hour: "сат",
-    "-hour": "-сата",
-    Response: "Одговор",
-    Ping: "Пинг",
-    "Monitor Type": "Тип посматрача",
-    Keyword: "Кључна реч",
-    "Friendly Name": "Пријатељско име",
-    URL: "URL",
-    Hostname: "Hostname",
-    Port: "Порт",
-    "Heartbeat Interval": "Интервал откуцаја срца",
-    Retries: "Покушаји",
-    Advanced: "Напредно",
-    "Upside Down Mode": "Наопак мод",
-    "Max. Redirects": "Макс. преусмерења",
-    "Accepted Status Codes": "Прихваћени статусни кодови",
-    Save: "Сачувај",
-    Notifications: "Обавештења",
-    "Not available, please setup.": "Није доступно, молим Вас подесите.",
-    "Setup Notification": "Постави обавештење",
-    Light: "Светло",
-    Dark: "Тамно",
-    Auto: "Аутоматско",
-    "Theme - Heartbeat Bar": "Тема - Трака откуцаја срца",
-    Normal: "Нормално",
-    Bottom: "Доле",
-    None: "Искључено",
-    Timezone: "Временска зона",
-    "Search Engine Visibility": "Видљивост претраживачима",
-    "Allow indexing": "Дозволи индексирање",
-    "Discourage search engines from indexing site": "Одвраћајте претраживаче од индексирања сајта",
-    "Change Password": "Промени лозинку",
-    "Current Password": "Тренутна лозинка",
-    "New Password": "Нова лозинка",
-    "Repeat New Password": "Понови нову лозинку",
-    "Update Password": "Измени лозинку",
-    "Disable Auth": "Искључи аутентификацију",
-    "Enable Auth": "Укључи аутентификацију",
-    "disableauth.message1": "Да ли сте сигурни да желите да <strong>искључите аутентификацију</strong>?",
-    "disableauth.message2": "То је за <strong>оне који имају додату аутентификацију</strong> испред Uptime Kuma као на пример Cloudflare Access.",
-    "Please use this option carefully!": "Молим Вас користите ово са пажњом.",
-    Logout: "Одлогуј се",
-    Leave: "Изађи",
-    "I understand, please disable": "Разумем, молим те искључи",
-    Confirm: "Потврди",
-    Yes: "Да",
-    No: "Не",
-    Username: "Корисничко име",
-    Password: "Лозинка",
-    "Remember me": "Запамти ме",
-    Login: "Улогуј се",
-    "No Monitors, please": "Без посматрача молим",
-    "add one": "додај једног",
-    "Notification Type": "Тип обавештења",
-    Email: "Е-пошта",
-    Test: "Тест",
-    "Certificate Info": "Информације сертификата",
-    "Resolver Server": "Разрешивачки сервер",
-    "Resource Record Type": "Тип записа ресурса",
-    "Last Result": "Последњи резултат",
-    "Create your admin account": "Наприви администраторски налог",
-    "Repeat Password": "Поновите лозинку",
-    respTime: "Време одг. (мс)",
-    notAvailableShort: "N/A",
-    Create: "Create",
-    clearEventsMsg: "Are you sure want to delete all events for this monitor?",
-    clearHeartbeatsMsg: "Are you sure want to delete all heartbeats for this monitor?",
-    confirmClearStatisticsMsg: "Are you sure want to delete ALL statistics?",
-    "Clear Data": "Clear Data",
-    Events: "Events",
-    Heartbeats: "Heartbeats",
-    "Auto Get": "Auto Get",
-    enableDefaultNotificationDescription: "For every new monitor this notification will be enabled by default. You can still disable the notification separately for each monitor.",
-    "Default enabled": "Default enabled",
-    "Also apply to existing monitors": "Also apply to existing monitors",
-    Export: "Export",
-    Import: "Import",
-    backupDescription: "You can backup all monitors and all notifications into a JSON file.",
-    backupDescription2: "PS: History and event data is not included.",
-    backupDescription3: "Sensitive data such as notification tokens is included in the export file, please keep it carefully.",
-    alertNoFile: "Please select a file to import.",
-    alertWrongFileType: "Please select a JSON file.",
-    twoFAVerifyLabel: "Please type in your token to verify that 2FA is working",
-    tokenValidSettingsMsg: "Token is valid! You can now save the 2FA settings.",
-    confirmEnableTwoFAMsg: "Are you sure you want to enable 2FA?",
-    confirmDisableTwoFAMsg: "Are you sure you want to disable 2FA?",
-    "Apply on all existing monitors": "Apply on all existing monitors",
-    "Verify Token": "Verify Token",
-    "Setup 2FA": "Setup 2FA",
-    "Enable 2FA": "Enable 2FA",
-    "Disable 2FA": "Disable 2FA",
-    "2FA Settings": "2FA Settings",
-    "Two Factor Authentication": "Two Factor Authentication",
-    Active: "Active",
-    Inactive: "Inactive",
-    Token: "Token",
-    "Show URI": "Show URI",
-    "Clear all statistics": "Clear all Statistics",
-    retryCheckEverySecond: "Retry every {0} seconds.",
-    importHandleDescription: "Choose 'Skip existing' if you want to skip every monitor or notification with the same name. 'Overwrite' will delete every existing monitor and notification.",
-    confirmImportMsg: "Are you sure to import the backup? Please make sure you've selected the right import option.",
-    "Heartbeat Retry Interval": "Heartbeat Retry Interval",
-    "Import Backup": "Import Backup",
-    "Export Backup": "Export Backup",
-    "Skip existing": "Skip existing",
-    Overwrite: "Overwrite",
-    Options: "Options",
-    "Keep both": "Keep both",
-    Tags: "Tags",
-    "Add New below or Select...": "Add New below or Select...",
-    "Tag with this name already exist.": "Tag with this name already exist.",
-    "Tag with this value already exist.": "Tag with this value already exist.",
-    color: "color",
-    "value (optional)": "value (optional)",
-    Gray: "Gray",
-    Red: "Red",
-    Orange: "Orange",
-    Green: "Green",
-    Blue: "Blue",
-    Indigo: "Indigo",
-    Purple: "Purple",
-    Pink: "Pink",
-    "Search...": "Search...",
-    "Avg. Ping": "Avg. Ping",
-    "Avg. Response": "Avg. Response",
-    "Entry Page": "Entry Page",
-    statusPageNothing: "Nothing here, please add a group or a monitor.",
-    "No Services": "No Services",
-    "All Systems Operational": "All Systems Operational",
-    "Partially Degraded Service": "Partially Degraded Service",
-    "Degraded Service": "Degraded Service",
-    "Add Group": "Add Group",
-    "Add a monitor": "Add a monitor",
-    "Edit Status Page": "Edit Status Page",
-    "Go to Dashboard": "Go to Dashboard",
-    "Status Page": "Status Page",
-    "Status Pages": "Status Pages",
-    telegram: "Telegram",
-    webhook: "Webhook",
-    smtp: "Email (SMTP)",
-    discord: "Discord",
-    teams: "Microsoft Teams",
-    signal: "Signal",
-    gotify: "Gotify",
-    slack: "Slack",
-    "rocket.chat": "Rocket.chat",
-    pushover: "Pushover",
-    pushy: "Pushy",
-    octopush: "Octopush",
-    promosms: "PromoSMS",
-    lunasea: "LunaSea",
-    apprise: "Apprise (Support 50+ Notification services)",
-    pushbullet: "Pushbullet",
-    line: "Line Messenger",
-    mattermost: "Mattermost",
-};
diff --git a/src/languages/sv-SE.js b/src/languages/sv-SE.js
deleted file mode 100644
index 1fc35be10..000000000
--- a/src/languages/sv-SE.js
+++ /dev/null
@@ -1,110 +0,0 @@
-export default {
-    languageName: "Svenska",
-    checkEverySecond: "Uppdatera var {0} sekund.",
-    retriesDescription: "Max antal försök innan tjänsten markeras som nere och en notis skickas",
-    ignoreTLSError: "Ignorera TLS/SSL-fel för webbsidor med HTTPS",
-    upsideDownModeDescription: "Vänd upp och ner på statusen. Om tjänsten är nåbar visas den som NERE.",
-    maxRedirectDescription: "Max antal omdirigeringar att följa. Välj 0 för att avaktivera omdirigeringar.",
-    acceptedStatusCodesDescription: "Välj statuskoder som räknas som lyckade.",
-    passwordNotMatchMsg: "Det bekräftade lösenordet stämmer ej överens.",
-    notificationDescription: "Vänligen lägg till en notistjänst till dina övervakare.",
-    keywordDescription: "Sök efter nyckelord i ren HTML eller JSON-svar. Sökningen är skiftkänslig.",
-    pauseDashboardHome: "Pausa",
-    deleteMonitorMsg: "Är du säker på att du vill ta bort den här övervakningen?",
-    deleteNotificationMsg: "Är du säker på att du vill ta bort den här notisen för alla övervakare?",
-    resolverserverDescription: "Cloudflare är den förvalda servern. Du kan byta resolver när som helst.",
-    rrtypeDescription: "Välj den RR-typ du vill övervaka",
-    pauseMonitorMsg: "Är du säker på att du vill pausa?",
-    Settings: "Inställningar",
-    Dashboard: "Infopanel",
-    "New Update": "Ny uppdatering",
-    Language: "Språk",
-    Appearance: "Utseende",
-    Theme: "Tema",
-    General: "Allmänt",
-    Version: "Version",
-    "Check Update On GitHub": "Sök efter uppdatering på GitHub",
-    List: "Lista",
-    Add: "Lägg till",
-    "Add New Monitor": "Lägg Till Ny Övervakare",
-    "Quick Stats": "Snabbstatistik",
-    Up: "Uppe",
-    Down: "Nere",
-    Pending: "Pågående",
-    Unknown: "Okänt",
-    Pause: "Pausa",
-    Name: "Namn",
-    Status: "Status",
-    DateTime: "Datum & Tid",
-    Message: "Meddelande",
-    "No important events": "Inga viktiga händelser",
-    Resume: "Återuppta",
-    Edit: "Redigera",
-    Delete: "Ta bort",
-    Current: "Nuvarande",
-    Uptime: "Drifttid",
-    "Cert Exp.": "Certifikat utgår",
-    day: "dag | dagar",
-    "-day": " dagar",
-    hour: "timme",
-    "-hour": " timmar",
-    Response: "Svar",
-    Ping: "Ping",
-    "Monitor Type": "Övervakningstyp",
-    Keyword: "Nyckelord",
-    "Friendly Name": "Namn",
-    URL: "URL",
-    Hostname: "Värdnamn",
-    Port: "Port",
-    "Heartbeat Interval": "Hjärtslagsintervall",
-    Retries: "Försök",
-    Advanced: "Avancerat",
-    "Upside Down Mode": "Upp och ner-läge",
-    "Max. Redirects": "Max antal omdirigeringar",
-    "Accepted Status Codes": "Tillåtna statuskoder",
-    Save: "Spara",
-    Notifications: "Notiser",
-    "Not available, please setup.": "Ej tillgänglig, vänligen konfigurera.",
-    "Setup Notification": "Ny Notistjänst",
-    Light: "Ljust",
-    Dark: "Mörkt",
-    Auto: "Automatiskt",
-    "Theme - Heartbeat Bar": "Tema - Heartbeat Bar",
-    Normal: "Normal",
-    Bottom: "Botten",
-    None: "Tomt",
-    Timezone: "Tidszon",
-    "Search Engine Visibility": "Synlighet på Sökmotorer",
-    "Allow indexing": "Tillåt indexering",
-    "Discourage search engines from indexing site": "Hindra sökmotorer från att indexera sidan",
-    "Change Password": "Byt Lösenord",
-    "Current Password": "Nuvarande Lösenord",
-    "New Password": "Nytt Lösenord",
-    "Repeat New Password": "Upprepa Nytt Lösenord",
-    "Update Password": "Uppdatera Lösenord",
-    "Disable Auth": "Avaktivera Autentisering",
-    "Enable Auth": "Aktivera Autentisering",
-    Logout: "Logga ut",
-    Leave: "Lämna",
-    "I understand, please disable": "Jag förstår, vänligen avaktivera",
-    Confirm: "Bekräfta",
-    Yes: "Ja",
-    No: "Nej",
-    Username: "Användarnamn",
-    Password: "Lösenord",
-    "Remember me": "Kom ihåg mig",
-    Login: "Logga in",
-    "No Monitors, please": "Inga Övervakare, tack",
-    "add one": "lägg till en",
-    "Notification Type": "Notistyp",
-    Email: "Email",
-    Test: "Test",
-    "Certificate Info": "Certifikatsinfo",
-    "Resolver Server": "Resolverserver",
-    "Resource Record Type": "RR-typ",
-    "Last Result": "Senaste resultat",
-    "Create your admin account": "Skapa ditt administratörskonto",
-    "Repeat Password": "Upprepa Lösenord",
-    respTime: "Svarstid (ms)",
-    notAvailableShort: "Ej Tillg.",
-};
diff --git a/src/languages/th-TH.js b/src/languages/th-TH.js
deleted file mode 100644
index 3d847038d..000000000
--- a/src/languages/th-TH.js
+++ /dev/null
@@ -1,580 +0,0 @@
-export default {
-    languageName: "ไทย",
-    checkEverySecond: "ตรวจสอบทุก {0} วินาที",
-    retryCheckEverySecond: "ลองใหม่ทุก {0} วินาที",
-    retriesDescription: "จำนวนครั้งสูงสุดที่จะลองก่อนบริการถูกระบุว่าไม่สามารถใช้งานได้และส่งการแจ้งเตือน",
-    ignoreTLSError: "ไม่สนใจข้อผิดพลาด TLS/SSL สำหรับเว็บไซต์ HTTPS",
-    upsideDownModeDescription: "กลับด้านสถานะ เช่น ถ้าบริการสามารถใช้งานได้จะถูกเปลี่ยนเป็นใช้งานไม่ได้",
-    maxRedirectDescription: "จำนวนครั้งสูงสุดที่จะเปลี่ยนเส้นทาง, ตั้งเป็น 0 เพื่อปิดการเปลี่ยนเส้นทาง",
-    acceptedStatusCodesDescription: "เลือกรหัสสถานะที่ถือว่าการตอบกลับสำเร็จ",
-    passwordNotMatchMsg: "รหัสผ่านไม่ตรงกัน",
-    notificationDescription: "การแจ้งเตือนต้องกำหนดให้มอนิเตอร์เพื่อให้สามารถใช้งานได้",
-    keywordDescription: "ค้นหาคำสำคัญใน HTML หรือ JSON ของการตอบกลับ, คำสำคัญต้องคำนึงถึงตัวพิมพ์เล็กและตัวพิมพ์ใหญ่",
-    pauseDashboardHome: "หยุดชั่วคราว",
-    deleteMonitorMsg: "คุณแน่ใจหรือไม่ที่จะลบมอนิเตอร์?",
-    deleteNotificationMsg: "คุณแน่ใจหรือไม่ที่จะลบการแจ้งเตือนสำหรับมอนิเตอร์ทั้งหมด?",
-    resolverserverDescription: "Cloudflare เป็นเซิร์ฟเวอร์ค้นหาเริ่มต้น, คุณสามารถเปลี่ยนเซิร์ฟเวอร์ได้ตลอดเวลา",
-    rrtypeDescription: "เลือกประเภท DNS Record ที่คุณต้องการจะมอนิเตอร์",
-    pauseMonitorMsg: "คุณแน่ใจหรือไม่ที่จะหยุดมอนิเตอร์ชั่วคราว?",
-    enableDefaultNotificationDescription: "การแจ้งเตือนนี้จะถูกเปิดโดยค่าเริ่มต้นสำหรับมอนิเตอร์ใหม่, คุณสามารถปิดการแจ้งเตือนสำหรับแต่ละมอนิเตอร์ได้",
-    clearEventsMsg: "คุณแน่ใจหรือไม่ที่จะลบเหตุการณ์ทั้งหมดสำหรับมอนิเตอร์นี้?",
-    clearHeartbeatsMsg: "คุณแน่ใจหรือไม่ที่จะลบประวัติการตรวจสอบทั้งหมดสำหรับมอนิเตอร์นี้?",
-    confirmClearStatisticsMsg: "คุณแน่ใจหรือไม่ที่จะลบสถิติทั้งหมด?",
-    importHandleDescription: "เลือก \"ข้ามรายการที่มีอยู่แล้ว\" ถ้าคุณต้องการข้ามทุกมอนิเตอร์หรือการแจ้งเตือนที่มีชื่อซ้ำกัน, \"เขียนทับ\" จะลบทุกมอนิเตอร์หรือการแจ้งเตือนที่มีชื่อซ้ำกัน",
-    confirmImportMsg: "คุณแน่ใจหรือไม่ที่จะนำเข้าข้อมูลสำรอง, กรุณาตรวจสอบว่าคุณเลือกข้อมูลที่ถูกต้อง",
-    twoFAVerifyLabel: "โปรดกรอกกุญแจ 2FA ของคุณเพื่อยืนยัน:",
-    tokenValidSettingsMsg: "กุญแจถูกต้อง, ตอนนี้คุณสามารถบันทึกการตั้งค่า 2FA ของคุณได้แล้ว",
-    confirmEnableTwoFAMsg: "คุณแน่ใจหรือไม่ที่จะเปิดใช้งาน 2FA?",
-    confirmDisableTwoFAMsg: "คุณแน่ใจหรือไม่ที่จะปิดใช้งาน 2FA?",
-    Settings: "การตั้งค่า",
-    Dashboard: "แผงควบคุม",
-    "New Update": "อัพเดทใหม่",
-    Language: "ภาษา",
-    Appearance: "รูปร่าง",
-    Theme: "หน้าตา",
-    General: "ทั่วไป",
-    "Primary Base URL": "URL หลัก",
-    Version: "เวอร์ชั่น",
-    "Check Update On GitHub": "ตรวจสอบการอัปเดตบน GitHub",
-    List: "รายการ",
-    Add: "เพิ่ม",
-    "Add New Monitor": "เพิ่มมอนิเตอร์ใหม่",
-    "Quick Stats": "สถิติด่วน",
-    Up: "ใช้งานได้",
-    Down: "ไม่สามารถใช้งานได้",
-    Pending: "รอดำเนินการ",
-    Unknown: "ไม่ทราบ",
-    Pause: "หยุดชั่วคราว",
-    Name: "ชื่อ",
-    Status: "สถานะ",
-    DateTime: "วันที่และเวลา",
-    Message: "ข้อความ",
-    "No important events": "ไม่มีเหตการณ์ที่สำคัญ",
-    Resume: "ดำเนินการต่อ",
-    Edit: "แก้ไข",
-    Delete: "ลบ",
-    Current: "ปัจจุบัน",
-    Uptime: "เวลาที่ใช้งานได้",
-    "Cert Exp.": "วันหมดอายุใบรับรอง",
-    days: "วัน",
-    day: "วัน",
-    "-day": "-วัน",
-    hour: "ชั่วโมง",
-    "-hour": "-ชั่วโมง",
-    Response: "การตอบสนอง",
-    Ping: "การตอบสนอง",
-    "Monitor Type": "ประเภทมอนิเตอร์",
-    Keyword: "คำสำคัญ",
-    "Friendly Name": "ชื่อที่เป็นมิตร",
-    URL: "URL",
-    Hostname: "ชื่อโฮสต์",
-    Port: "พอร์ต",
-    "Heartbeat Interval": "ระยะเวลาระหว่างการทดสอบ",
-    Retries: "จำนวนครั้งที่จะลองใหม่",
-    "Heartbeat Retry Interval": "ระยะห่างระหว่างการทดสอบใหม่หลังจากไม่สำเร็จ",
-    Advanced: "ขั้นสูง",
-    "Upside Down Mode": "โหมดกลับด้าน",
-    "Max. Redirects": "จำนวนการเปลี่ยนเส้นทางสูงสุด",
-    "Accepted Status Codes": "รหัสสถานะที่ยอมรับ",
-    "Push URL": "URL เป้าหมาย",
-    needPushEvery: "คุณควรเรียก URL นี้ทุก {0} วินาที",
-    pushOptionalParams: "ตัวแปรเสริม: {0}",
-    Save: "บันทึก",
-    Notifications: "การแจ้งเตือน",
-    "Not available, please setup.": "ไม่พร้อมใช้งาน, กรุณาตั้งค่า",
-    "Setup Notification": "ตั้งค่าการแจ้งเตือน",
-    Light: "สว่าง",
-    Dark: "มืด",
-    Auto: "อัตโนมัติ",
-    "Theme - Heartbeat Bar": "หน้าตา - แถบการตอบสนอง",
-    Normal: "ปกติ",
-    Bottom: "ด้านล่าง",
-    None: "ไม่มี",
-    Timezone: "เขตเวลา",
-    "Search Engine Visibility": "การมองเห็นของเครื่องมือค้นหา",
-    "Allow indexing": "อนุญาตให้สร้างดัชนี",
-    "Discourage search engines from indexing site": "ปฏิเสธเครื่องมือค้นหาไม่ให้สร้างดัชนีของเว็บไซต์",
-    "Change Password": "เปลี่ยนรหัสผ่าน",
-    "Current Password": "รหัสผ่านปัจจุบัน",
-    "New Password": "รหัสผ่านใหม่",
-    "Repeat New Password": "ยืนยันรหัสผ่านใหม่",
-    "Update Password": "อัพเดทรหัสผ่าน",
-    "Disable Auth": "ปิดใช้งานการตรวจสอบสิทธิ์",
-    "Enable Auth": "เปิดใช้งานการตรวจสอบสิทธิ์",
-    "disableauth.message1": "คุณต้องการที่จะ <strong>ปิดใช้งานระบบรับรองความถูกต้องใช่หรือไม่</strong>?",
-    "disableauth.message2": "ระบบนี้ถูกออกแบบมาเพื่อการใช้งานกับระบบรับรองความถูกต้องของบุคคลที่สามเช่น Cloudflare Access, Authelia หรือวิธีการอื่น ๆ",
-    "Please use this option carefully!": "โปรดใช้ความระมัดระวังในการเลือกใช้งานระบบนี้ !",
-    Logout: "ออกจากระบบ",
-    Leave: "ออก",
-    "I understand, please disable": "ฉันเข้าใจแล้ว, กรุณาปิดการใช้งาน",
-    Confirm: "ยืนยัน",
-    Yes: "ใช่",
-    No: "ไม่",
-    Username: "ชื่อผู้ใช้",
-    Password: "รหัสผ่าน",
-    "Remember me": "จดจำฉันไว้",
-    Login: "เข้าสู่ระบบ",
-    "No Monitors, please": "ไม่มีมอนิเตอร์, กรุณา",
-    "add one": "สร้าง",
-    "Notification Type": "ประเภทการแจ้งเตือน",
-    Email: "อีเมล",
-    Test: "ทดสอบ",
-    "Certificate Info": "ข้อมูลใบรับรอง",
-    "Resolver Server": "เซิร์ฟเวอร์ที่ค้นหา",
-    "Resource Record Type": "ประเภท DNS Record",
-    "Last Result": "ผลล่าสุด",
-    "Create your admin account": "สร้างบัญชีผู้ดูแลระบบ",
-    "Repeat Password": "ยืนยันรหัสผ่าน",
-    "Import Backup": "นำเข้าข้อมูลสำรอง",
-    "Export Backup": "ส่งออกข้อมูลสำรอง",
-    Export: "ส่งออก",
-    Import: "นำเข้า",
-    respTime: "ระยะเวลาการตอบสนอง (ms)",
-    notAvailableShort: "ไม่สามารถใช้งานได้",
-    "Default enabled": "เปิดใช้งานโดยค่าเริ่มต้น",
-    "Apply on all existing monitors": "ใช้กับมอนิเตอร์ทั้งหมด",
-    Create: "สร้าง",
-    "Clear Data": "ล้างข้อมูล",
-    Events: "เหตุการณ์",
-    Heartbeats: "ประวัติการตรวจสอบ",
-    "Auto Get": "ดึงอัตโนมัติ",
-    backupDescription: "คุณสามารถสำรองข้อมูลการแจ้งเตือนและมอนิเตอร์ทั้งหมดไว้ได้ในไฟล์ JSON",
-    backupDescription2: "หมายเหตุ : ประวัติและข้อมูลเหตการณ์จะไม่ถูกสำรอง",
-    backupDescription3: "ข้อมูลที่ละเอียดอ่อนเช่นกุญแจการแจ้งเตือนจะรวมอยู่ในไฟล์ข้อมูลสำรอง, โปรดเก็บข้อมูลสำรองอย่างปลอดภัย",
-    alertNoFile: "กรุณาเลือกไฟล์ที่จะใช้งาน",
-    alertWrongFileType: "กรุณาเลือกไฟล์ที่เป็น JSON",
-    "Clear all statistics": "ล้างข้อมูลสถิติทั้งหมด",
-    "Skip existing": "ข้ามรายการที่มีอยู่แล้ว",
-    Overwrite: "เขียนทับ",
-    Options: "ตัวเลือก",
-    "Keep both": "เก็บทั้งสอง",
-    "Verify Token": "ยืนยันกุญแจ",
-    "Setup 2FA": "ติดตั้ง 2FA",
-    "Enable 2FA": "เปิดใช้งาน 2FA",
-    "Disable 2FA": "ปิดใช้งาน 2FA",
-    "2FA Settings": "ตั้งค่า 2FA",
-    "Two Factor Authentication": "การยืนยันตัวตนแบบสองขั้นตอน",
-    Active: "ใช้งาน",
-    Inactive: "ไม่ใช้งาน",
-    Token: "กุญแจ",
-    "Show URI": "แสดง URI",
-    Tags: "แท็ก",
-    "Add New below or Select...": "เพิ่มใหม่ด้านล่างหรือเลือก...",
-    "Tag with this name already exist.": "แท็กที่มีชื่อนี้มีอยู่แล้ว",
-    "Tag with this value already exist.": "แท็กที่มีข้อมูลนี้มีอยู่แล้ว",
-    color: "สี",
-    "value (optional)": "ข้อมูล (ไม่จำเป็น)",
-    Gray: "เทา",
-    Red: "แดง",
-    Orange: "ส้ม",
-    Green: "เขียว",
-    Blue: "น้ำเงิน",
-    Indigo: "ม่วง",
-    Purple: "ม่วง",
-    Pink: "ชมพู",
-    "Search...": "ค้นหา...",
-    "Avg. Ping": "ค่า Ping เฉลี่ย",
-    "Avg. Response": "ค่า Response เฉลี่ย",
-    "Entry Page": "หน้าต้อนรับ",
-    statusPageNothing: "ไม่มีอะไรตรงนี้ !, กรุณาเพิ่มกลุ่มหรือมอนิเตอร์",
-    "No Services": "ไม่มีบริการ",
-    "All Systems Operational": "บริการทั้งหมดทำงานได้ปกติ",
-    "Partially Degraded Service": "บริการมีปัญหาบางส่วน",
-    "Degraded Service": "บริการมีปัญหา",
-    "Add Group": "เพิ่มกลุ่ม",
-    "Add a monitor": "เพิ่มมอนิเตอร์",
-    "Edit Status Page": "แก้ไขหน้าสถานะ",
-    "Go to Dashboard": "ไปที่หน้าควบคุม",
-    "Status Page": "หน้าสถานะ",
-    "Status Pages": "หน้าสถานะ",
-    defaultNotificationName: "การแจ้งเตือน {notification} ของฉัน ({number})",
-    here: "ที่นี่",
-    Required: "จำเป็น",
-    telegram: "Telegram",
-    "Bot Token": "กุญแจของบอท",
-    wayToGetTelegramToken: "คุณสามารถรับกุญแจได้จาก {0}.",
-    "Chat ID": "ไอดีแชท",
-    supportTelegramChatID: "รองรับ แชทส่วนตัว, แชทกลุ่ม, ไอดีแชท",
-    wayToGetTelegramChatID: "คุณสามารถรับ ID แชทของคุณได้โดยส่งข้อความไปยังบอทและไปที่ URL นี้เพื่อดู chat_id :",
-    "YOUR BOT TOKEN HERE": "กุญแจของบอทของคุณที่นี่",
-    chatIDNotFound: "ไม่พบไอดีแชท, กรุณาส่งข้อความไปที่บอท",
-    webhook: "Webhook",
-    "Post URL": "URL โพสต์",
-    "Content Type": "ประเภทเนื้อหา",
-    webhookJsonDesc: "{0} ดีสำหรับเซิร์ฟเวอร์ HTTP สมัยใหม่เช่น Express.js",
-    webhookFormDataDesc: "{multipart} ดีสำหรับ PHP, ข้อมูล JSON จะต้องถูกประมวลผลด้วย {decodeFunction}",
-    smtp: "Email (SMTP)",
-    secureOptionNone: "None / STARTTLS (25, 587)",
-    secureOptionTLS: "TLS (465)",
-    "Ignore TLS Error": "เพิกเฉยข้อผิดพลาด TLS",
-    "From Email": "จากอีเมล",
-    emailCustomSubject: "หัวข้อที่กำหนดเอง",
-    "To Email": "ถึงอีเมล",
-    smtpCC: "CC",
-    smtpBCC: "BCC",
-    discord: "Discord",
-    "Discord Webhook URL": "Discord Webhook URL",
-    wayToGetDiscordURL: "คุณสามารถรับได้โดยการไปที่ Server Settings -> Integrations -> Create Webhook",
-    "Bot Display Name": "ชื่อบอท",
-    "Prefix Custom Message": "คำนำหน้าข้อความที่กำหนดเอง",
-    "Hello @everyone is...": "สวัสดี {'@'}everyone นี่...",
-    teams: "Microsoft Teams",
-    "Webhook URL": "Webhook URL",
-    wayToGetTeamsURL: "คุณสามารถเรียนรู้วิธีการสร้าง Webhook URL {0}",
-    signal: "Signal",
-    Number: "หมายเลข",
-    Recipients: "ผู้รับ",
-    needSignalAPI: "คุณต้องมี Signal Client ที่มี Rest API",
-    wayToCheckSignalURL: "คุณสามารถตรวจสอบ URL นี้เพื่อดูวิธีตั้งค่า :",
-    signalImportant: "สำคัญ: คุณไม่สามารถผสมกลุ่มและตัวเลขในผู้รับได้!",
-    gotify: "Gotify",
-    "Application Token": "กุญแจของแอพพลิเคชั่น",
-    "Server URL": "Server URL",
-    Priority: "ลำดับความสำคัญ",
-    slack: "Slack",
-    "Icon Emoji": "Icon Emoji",
-    "Channel Name": "ชื่อห้อง",
-    "Uptime Kuma URL": "Uptime Kuma URL",
-    aboutWebhooks: "ข้อมูลเพิ่มเติมสำหรับ Webhooks : {0}",
-    aboutChannelName: "ใส่ชื่อห้องใน {0} ในช่องชื่อห้องถ้าต้องการที่จะข้าม Webhook, เช่น: #ช่องอื่นๆ",
-    aboutKumaURL: "ถ้าคุณไม่ใส่ข้อมูลในช่อง Uptime Kuma URL ค่าเริ่มต้นจะเป็นจะเป็น Uptime Kuma Github",
-    emojiCheatSheet: "ตาราง Emoji : {0}",
-    "rocket.chat": "Rocket.Chat",
-    pushover: "Pushover",
-    pushy: "Pushy",
-    PushByTechulus: "Push by Techulus",
-    octopush: "Octopush",
-    promosms: "PromoSMS",
-    clicksendsms: "ClickSend SMS",
-    lunasea: "LunaSea",
-    apprise: "Apprise (รองรับการแจ้งเตือนมากกว่า 50 บริการ)",
-    GoogleChat: "Google Chat (สำหรับ Google Workspace เท่านั้น)",
-    pushbullet: "Pushbullet",
-    line: "Line Messenger",
-    mattermost: "Mattermost",
-    "User Key": "กุญแจผู้ใช้งาน",
-    Device: "อุปกรณ์",
-    "Message Title": "หัวข้อข้อความ",
-    "Notification Sound": "เสียงแจ้งเตือน",
-    "More info on:": "ข้อมูลเพิ่มเติม : {0}",
-    pushoverDesc1: "ลำดับความสำคัญฉุกเฉิน (2) มีการหมดเวลาเริ่มต้น 30 วินาทีระหว่างการลองใหม่และจะหมดอายุหลังจาก 1 ชั่วโมง",
-    pushoverDesc2: "ถ้าคุณต้องการจะส่งการแจ้งเตือนไปยังอุปกรณ์อื่นๆ สามารถกำหนดได้ที่ช่องอุปกรณ์",
-    "SMS Type": "ประเภท SMS",
-    octopushTypePremium: "พรีเมี่ยม (เร็ว - แนะนำสำหรับการแจ้งเตือน)",
-    octopushTypeLowCost: "ต้นทุนต่ำ (ช้า - บางครั้งจะถูกบล็อกโดยผู้ให้บริการ)",
-    checkPrice: "ตรวจสอบราคาของ {0} :",
-    apiCredentials: "ข้อมูลการตรวจสอบสิทธิ์ API",
-    octopushLegacyHint: "คุณใช้เวอร์ชันดั้งเดิมของ Octopush (2011 - 2020) หรือเวอร์ชันใหม่หรือไม่?",
-    "Check octopush prices": "ตรวจสอบราคาของ Octopush {0}",
-    octopushPhoneNumber: "หมายเลขโทรศัพท์ (รูปแบบสากล เช่น +33612345678) ",
-    octopushSMSSender: "ชื่อผู้ส่ง SMS : ความยาว 3 - 11 ตัวอักษร, ตัวเลข และช่องว่าง (a-zA-Z0-9 )",
-    "LunaSea Device ID": "ไอดีอุปกรณ์ LunaSea",
-    "Apprise URL": "Apprise URL",
-    "Example:": "ตัวอย่าง : {0}",
-    "Read more:": "อ่านเพิ่มเติม : {0}",
-    "Status:": "สถานะ : {0}",
-    "Read more": "อ่านเพิ่มเติม",
-    appriseInstalled: "Apprise ถูกติดตั้งแล้ว",
-    appriseNotInstalled: "Apprise ยังไม่ถูกติดตั้ง {0}",
-    "Access Token": "กุญแจการเข้าถึง",
-    "Channel access token": "กุญแจการเข้าถึงของช่อง",
-    "Line Developers Console": "Line Developers Console",
-    lineDevConsoleTo: "Line Developers Console - {0}",
-    "Basic Settings": "การตั้งค่าพื้นฐาน",
-    "User ID": "ไอดีผู้ใช้",
-    "Messaging API": "Messaging API",
-    wayToGetLineChannelToken: "ขั้นแรกให้เข้า {0} สร้างผู้ให้บริการและช่องทาง (Messaging API) จากนั้นคุณจะได้รับกุญแจการเข้าถึงช่องและไอดีผู้ใช้จากรายการเมนูที่กล่าวถึงข้างต้น",
-    "Icon URL": "Icon URL",
-    aboutIconURL: "คุณสามารถระบุลิงก์รูปภาพใน \"URL ไอคอน\" เพื่อแทนที่รูปภาพโปรไฟล์เริ่มต้น จะไม่ถูกใช้หากมีการตั้งค่า Icon Emoji",
-    aboutMattermostChannelName: "คุณลบช่องเริ่มต้นที่ Webhook โพสต์ได้ด้วยการป้อนชื่อช่องลงในช่อง \"ชื่อช่อง\" ต้องเปิดใช้งานในการตั้งค่า Mattermost Webhook เช่น #ช่องอื่นๆ",
-    matrix: "Matrix",
-    promosmsTypeEco: "SMS ECO - ราคาถูก แต่ช้าและมักจะโอเวอร์โหลด จำกัดเฉพาะผู้รับในโปแลนด์",
-    promosmsTypeFlash: "SMS FLASH - ข้อความจะแสดงบนอุปกรณ์ของผู้รับโดยอัตโนมัติ จำกัดเฉพาะผู้รับในโปแลนด์",
-    promosmsTypeFull: "SMS FULL - SMS ระดับพรีเมียม คุณสามารถใช้ชื่อผู้ส่งของคุณได้ (คุณต้องลงทะเบียนชื่อก่อน) เชื่อถือได้สำหรับการแจ้งเตือน",
-    promosmsTypeSpeed: "SMS SPEED - ลำดับความสำคัญสูงสุดในระบบ รวดเร็วและเชื่อถือได้ แต่มีค่าใช้จ่ายสูง (ประมาณสองเท่าของราคาเต็ม SMS)",
-    promosmsPhoneNumber: "หมายเลขโทรศัพท์ (สำหรับผู้รับโปแลนด์ คุณสามารถข้ามรหัสพื้นที่ได้)",
-    promosmsSMSSender: "ชื่อผู้ส่ง SMS : ชื่อที่ลงทะเบียนล่วงหน้าหรือหนึ่งในค่าเริ่มต้น: InfoSMS, ข้อมูล SMS, MaxSMS, INFO, SMS",
-    "Feishu WebHookUrl": "Feishu WebHookURL",
-    matrixHomeserverURL: "URL ของโฮมเซิร์ฟเวอร์ (พร้อม http(s):// และพอร์ตเสริม)",
-    "Internal Room Id": "รหัสห้องภายใน",
-    matrixDesc1: "คุณค้นหารหัสห้องภายในได้โดยดูในส่วนขั้นสูงของการตั้งค่าห้องในไคลเอ็นต์ Matrix มันควรจะมีลักษณะเช่น !PMdRCpsIfLwsfjIye6:kiznick.server.",
-    matrixDesc2: "ขอแนะนำเป็นอย่างยิ่งให้คุณสร้างผู้ใช้ใหม่และอย่าใช้โทเค็นการเข้าถึงของผู้ใช้ Matrix ของคุณเอง เนื่องจากจะทำให้สามารถเข้าถึงบัญชีของคุณและห้องทั้งหมดที่คุณเข้าร่วม ให้สร้างผู้ใช้ใหม่และเชิญเฉพาะห้องที่คุณต้องการรับการแจ้งเตือนแทน คุณสามารถรับโทเค็นเพื่อการเข้าถึงได้โดยเรียกใช้ {0}",
-    Method: "วิธี",
-    Body: "เนื้อหา",
-    Headers: "ส่วนหัว",
-    PushUrl: "Push URL",
-    HeadersInvalidFormat: "เนื้อหาคำขอส่วนหัวไม่ใช่ JSON ที่ถูกต้อง :",
-    BodyInvalidFormat: "เนื้อหาคำขอไม่ใช่ JSON ที่ถูกต้อง : ",
-    "Monitor History": "ประวัติมอนิเตอร์",
-    clearDataOlderThan: "เก็บข้อมูลมอนิเตอร์ {0} วัน",
-    PasswordsDoNotMatch: "รหัสผ่านไม่ตรงกัน",
-    records: "บันทึก",
-    "One record": "หนึ่งบันทึก",
-    steamApiKeyDescription: "สำหรับการมอนิเตอร์ Steam Game Server คุณต้องมี Steam Web-API key, คุณสามารถสมัครได้จากที่นี่ : ",
-    "Current User": "ผู้ใช้ปัจจุบัน",
-    topic: "หัวข้อ",
-    topicExplanation: "หัวข้อ MQTT ที่จะมอนิเตอร์",
-    successMessage: "ข้อความที่จะถือว่าประสบความสำเร็จ",
-    successMessageExplanation: "ข้อความ MQTT ที่จะถือว่าประสบความสำเร็จ",
-    recent: "ล่าสุด",
-    Done: "สำเร็จ",
-    Info: "ข้อมูล",
-    Security: "ความปลอดภัย",
-    "Steam API Key": "Steam API Key",
-    "Shrink Database": "ย่อฐานข้อมูล",
-    "Pick a RR-Type...": "เลือกชนิด DNS Record",
-    "Pick Accepted Status Codes...": "เลือกสถานะที่ยอมรับ...",
-    Default: "ค่าเริ่มต้น",
-    "HTTP Options": "ตัวเลือก HTTP",
-    "Create Incident": "สร้างเหตุการณ์",
-    Title: "หัวข้อ",
-    Content: "เนื้อหา",
-    Style: "สไตล์",
-    info: "ข้อมูล",
-    warning: "แจ้งเตือน",
-    danger: "อันตราย",
-    primary: "หลัก",
-    light: "สว่าง",
-    dark: "มืด",
-    Post: "โพสต์",
-    "Please input title and content": "กรุณาใส่ชื่อและเนื้อหา",
-    Created: "สร้าง",
-    "Last Updated": "อัพเดทล่าสุด",
-    Unpin: "เลิกตรึง",
-    "Switch to Light Theme": "เปลี่ยนเป็นแบบสว่าง",
-    "Switch to Dark Theme": "เปลี่ยนเป็นแบบมืด",
-    "Show Tags": "แสดงแท็ก",
-    "Hide Tags": "ซ่อนแท็ก",
-    Description: "รายละเอียด",
-    "No monitors available.": "ไม่มีมอนิเตอร์ที่สามารถใช้งานได้",
-    "Add one": "เพิ่ม",
-    "No Monitors": "ไม่มีมอนิเตอร์",
-    "Untitled Group": "กลุ่มที่ไม่มีชื่อ",
-    Services: "บริการ",
-    Discard: "ทิ้ง",
-    Cancel: "ยกเลิก",
-    "Powered by": "ขับเคลื่อนโดย",
-    shrinkDatabaseDescription: "ทริกเกอร์ฐานข้อมูล VACUUM สำหรับ SQLite หากฐานข้อมูลของคุณถูกสร้างขึ้นหลังจากเวอร์ชั่น 1.10.0 แสดงว่า AUTO_VACUUM เปิดใช้งานอยู่แล้วและไม่จำเป็นต้องดำเนินการนี้",
-    serwersms: "SerwerSMS.pl",
-    serwersmsAPIUser: "API Username (incl. webapi_ prefix)",
-    serwersmsAPIPassword: "API Password",
-    serwersmsPhoneNumber: "หมายเลขโทรศัพท์",
-    serwersmsSenderName: "ชื่อผู้ส่ง SMS (ลงทะเบียนผ่านหน้าควบคุม)",
-    stackfield: "Stackfield",
-    Customize: "ปรับแต่ง",
-    "Custom Footer": "ส่วนท้ายที่กำหนดเอง",
-    "Custom CSS": "CSS ที่กำหนดเอง",
-    smtpDkimSettings: "การตั้งค่า DKIM",
-    smtpDkimDesc: "โปรดดู Nodemailer DKIM {0} สำหรับการใช้งาน",
-    documentation: "คู่มือการใช้งาน",
-    smtpDkimDomain: "ชื่อโดเมน",
-    smtpDkimKeySelector: "Key Selector",
-    smtpDkimPrivateKey: "Private Key",
-    smtpDkimHashAlgo: "อัลกอริทึมแฮช (ไม่บังคับ)",
-    smtpDkimheaderFieldNames: "คีย์ส่วนหัวสำหรับลงชื่อ (ไม่บังคับ)",
-    smtpDkimskipFields: "Header Keys ไม่ต้องเซ็น (ไม่บังคับ)",
-    gorush: "Gorush",
-    alerta: "Alerta",
-    alertaApiEndpoint: "API Endpoint",
-    alertaEnvironment: "Environment",
-    alertaApiKey: "กุญแจ API",
-    alertaAlertState: "แจ้งเตือนสถานะ",
-    alertaRecoverState: "กู้คืนสถานะ",
-    deleteStatusPageMsg: "คุณแน่ใจหรือไม่ว่าต้องการลบหน้าสถานะนี้",
-    Proxies: "พร็อกซี",
-    default: "ค่าเริ่มต้น",
-    enabled: "เปิดใช้งานแล้ว",
-    setAsDefault: "ตั้งเป็นค่าเริ่มต้น",
-    deleteProxyMsg: "คุณแน่ใจหรือไม่ว่าต้องการลบพร็อกซีสำหรับมอนิเตอร์ทั้งหมด?",
-    proxyDescription: "ต้องตั้งค่ามอนิเตอร์ให้ใช้พร็อกซีเพื่อให้ใช้งานได้",
-    enableProxyDescription: "พร็อกซีนี้จะไม่ส่งผลต่อมอนิเตอร์จนกว่าจะเปิดใช้งาน คุณสามารถควบคุมการปิดใช้งานพร็อกซีชั่วคราวจากมอนิเตอร์ทั้งหมดได้ที่ส่วนสถานะการเปิดใช้งาน",
-    setAsDefaultProxyDescription: "พร็อกซีนี้จะถูกเปิดโดนค่าเริ่มต้นสำหรับมอนิเตอร์ใหม่, คุณสามารถปิดการแจ้งเตือนสำหรับแต่ละมอนิเตอร์ได้",
-    "Certificate Chain": "ห่วงโซ่ใบรับรอง",
-    Valid: "ถูกต้อง",
-    Invalid: "ไม่ถูกต้อง",
-    AccessKeyId: "กุญแจสิทธิ ID",
-    SecretAccessKey: "กุญแจสิทธิ Secret",
-    PhoneNumbers: "PhoneNumbers",
-    TemplateCode: "รหัสเทมเพลต",
-    SignName: "ป้ายชื่อ",
-    "Sms template must contain parameters: ": "เทมเพลต SMS ต้องมีพารามิเตอร์ : ",
-    "Bark Endpoint": "Bark Endpoint",
-    WebHookUrl: "WebHookUrl",
-    SecretKey: "SecretKey",
-    "For safety, must use secret key": "เพื่อความปลอดภัย จำเป็นต้องตั้งค่ากุญแจการเข้าถึง",
-    "Device Token": "Device Token",
-    Platform: "แพลตฟอร์ม",
-    iOS: "iOS",
-    Android: "Android",
-    Huawei: "Huawei",
-    High: "สูง",
-    Retry: "ลองใหม่",
-    Topic: "หัวข้อ",
-    "WeCom Bot Key": "WeCom Bot Key",
-    "Setup Proxy": "ติดตั้งพร็อกซี่",
-    "Proxy Protocol": "โปรโตคอลพร็อกซี่",
-    "Proxy Server": "เซิร์ฟเวอร์พร็อกซี",
-    "Proxy server has authentication": "พร็อกซีเซิร์ฟเวอร์มีการตรวจสอบสิทธิ์",
-    User: "ผู้ใช้",
-    Installed: "ติดตั้งแล้ว",
-    "Not installed": "ไม่ได้ติดตั้ง",
-    Running: "กำลังทำงาน",
-    "Not running": "ไม่ได้ทำงาน",
-    "Remove Token": "ลบกุญแจ",
-    Start: "เริ่ม",
-    Stop: "หยุด",
-    "Uptime Kuma": "Uptime Kuma",
-    "Add New Status Page": "เพิ่มหน้าสถานะใหม่",
-    Slug: "ชื่อ",
-    "Accept characters:": "ตัวอักษรที่ใช้งานได้ :",
-    startOrEndWithOnly: "เริ่มหรือจบด้วย {0} เท่านั้น",
-    "No consecutive dashes": "ไม่มีขีดกลางติดต่อกัน",
-    Next: "ต่อไป",
-    "The slug is already taken. Please choose another slug.": "ชื่อนี้ถูกใช้งานแล้ว กรุณาใช้ชื่ออื่น",
-    "No Proxy": "ไม่มีพร็อกซี่",
-    "HTTP Basic Auth": "HTTP Basic Auth",
-    "New Status Page": "หน้าสถานะใหม่",
-    "Page Not Found": "ไม่พบหน้านี้",
-    "Reverse Proxy": "พร็อกซีย้อนกลับ",
-    Backup: "สำรองข้อมูล",
-    About: "เกี่ยวกับ",
-    wayToGetCloudflaredURL: "(ดาวโหลด cloudflared จาก {0})",
-    cloudflareWebsite: "เว็บไซต์ Cloudflare",
-    "Message:": "ข้อความ :",
-    "Don't know how to get the token? Please read the guide:": "ไม่รู้วิธีการรับกุญแจ?, กรุณาอ่านคู่มือ",
-    "The current connection may be lost if you are currently connecting via Cloudflare Tunnel. Are you sure want to stop it? Type your current password to confirm it.": "การเชื่อมต่อปัจุบันอาจขาดหายหากคุณกำลังเชื่อมต่อ Cloudflare Tunnel คุณแน่ใจหรือไม่ที่จะหยุด, พิมรหัสผ่านของคุณเพื่อยืนยัน",
-    "Other Software": "ซอฟต์แวร์อื่นๆ ",
-    "For example: nginx, Apache and Traefik.": "เช่น: nginx, Apache และ Traefik",
-    "Please read": "กรุณาอ่าน",
-    "Subject:": "เรื่อง :",
-    "Valid To:": "ใช้ได้ถึง :",
-    "Days Remaining:": "จำนวนวันที่เหลือ :",
-    "Issuer:": "ผู้ออก :",
-    "Fingerprint:": "ลายนิ้วมือ :",
-    "No status pages": "ไม่มีหน้าสถานะ",
-    "Domain Name Expiry Notification": "แจ้งเตือนการหมดอายุของโดเมน",
-    Proxy: "Proxy",
-    "Date Created": "วันที่สร้าง",
-    onebotHttpAddress: "ที่อยู่ HTTP OneBot ",
-    onebotMessageType: "ชนิดข้อความ OneBot",
-    onebotGroupMessage: "กลุ่ม",
-    onebotPrivateMessage: "ส่วนตัว",
-    onebotUserOrGroupId: "กลุ่ม / ไอดีผู้ใช้",
-    onebotSafetyTips: "เพื่อความปลอดภัย จำเป็นต้องตั้งค่ากุญแจการเข้าถึง",
-    "PushDeer Key": "กุญแจ PushDeer",
-    "Footer Text": "ข้อความส่วนท้าย",
-    "Show Powered By": "แสดงข้อความ \"ขับเคลื่อนโดย\"",
-    "Domain Names": "Domain Names",
-    signedInDisp: "เข้าใช้งานในฐานะ {0}",
-    signedInDispDisabled: "ปิดการยืนยันตัวตน",
-    "Certificate Expiry Notification": "แจ้งเตือนใบรับรองหมดอายุ",
-    "API Username": "API Username",
-    "API Key": "API Key",
-    "Recipient Number": "หมายเลขผู้รับ",
-    "From Name/Number": "จาก ชื่อ / หมายเลข",
-    "Leave blank to use a shared sender number.": "ไม่ต้องกรอกเพื่อใช้ชื่อผู้ส่งร่วมกัน",
-    "Octopush API Version": "Octopush API Version",
-    "Legacy Octopush-DM": "Legacy Octopush-DM",
-    endpoint: "endpoint",
-    octopushAPIKey: "\"API key\" จากข้อมูลยืนยันตัวตน HTTP API ในแผงควบคุม",
-    octopushLogin: "\"Login\" จากข้อมูลยืนยันตัวตน HTTP API ในแผงควบคุม",
-    promosmsLogin: "API Login Name",
-    promosmsPassword: "API Password",
-    "pushoversounds pushover": "Pushover (default)",
-    "pushoversounds bike": "Bike",
-    "pushoversounds bugle": "Bugle",
-    "pushoversounds cashregister": "Cash Register",
-    "pushoversounds classical": "Classical",
-    "pushoversounds cosmic": "Cosmic",
-    "pushoversounds falling": "Falling",
-    "pushoversounds gamelan": "Gamelan",
-    "pushoversounds incoming": "Incoming",
-    "pushoversounds intermission": "Intermission",
-    "pushoversounds magic": "Magic",
-    "pushoversounds mechanical": "Mechanical",
-    "pushoversounds pianobar": "Piano Bar",
-    "pushoversounds siren": "Siren",
-    "pushoversounds spacealarm": "Space Alarm",
-    "pushoversounds tugboat": "Tug Boat",
-    "pushoversounds alien": "Alien Alarm (long)",
-    "pushoversounds climb": "Climb (long)",
-    "pushoversounds persistent": "Persistent (long)",
-    "pushoversounds echo": "Pushover Echo (long)",
-    "pushoversounds updown": "Up Down (long)",
-    "pushoversounds vibrate": "Vibrate Only",
-    "pushoversounds none": "None (silent)",
-    pushyAPIKey: "Secret API Key",
-    pushyToken: "Device token",
-    "Show update if available": "แสดงการอัปเดตถ้ามี",
-    "Also check beta release": "ตรวจสอบรุ่นเบต้า",
-    "Using a Reverse Proxy?": "ใช้ Reverse Proxy อยู่ใช่มั้ย?",
-    "Check how to config it for WebSocket": "ตรวจสอบวิธีการตั้งค่าสำหรับ WebSocket",
-    "Steam Game Server": "Steam Game Server",
-    "Most likely causes:": "สาเหตุที่เป็นไปได้มากที่สุด :",
-    "The resource is no longer available.": "ทรัพยากรไม่สามารถใช้งานได้อีกต่อไป",
-    "There might be a typing error in the address.": "อาจมีข้อผิดพลาดในการพิมพ์ที่อยู่",
-    "What you can try:": "สิ่งที่คุณสามารถลองทำ :",
-    "Retype the address.": "พิมพ์ที่อยู่อีกครั้ง",
-    "Go back to the previous page.": "กลับไปหน้าที่แล้ว",
-    "Coming Soon": "เร็วๆ นี้",
-    wayToGetClickSendSMSToken: "คุณสามารถรับ API Username และ API Key ได้จาก {0}",
-    wayToGetLineNotifyToken: "คุณสามารถรับ access token ได้จาก {0}",
-    resendEveryXTimes: "ส่งซ้ำทุก {0} ครั้ง",
-    resendDisabled: "การส่งซ้ำถูกปิดใช้งาน",
-    dnsPortDescription: "พอร์ตของเซิร์ฟเวอร์ DNS, ค่าเริ่มต้นคือ 53, คุณสามารถเปลี่ยนพอร์ตตอนไหนก็ได้",
-    "Resend Notification if Down X times consequently": "ส่งการแจ้งเตือนซ้ำถ้าออฟไลน์ครบ X ครั้ง",
-    error: "เกิดข้อผิดพลาด",
-    critical: "วิกฤต",
-    wayToGetPagerDutyKey: "คุณสามารถรับคีย์ได้โดยการไปที่ Service -> Service Directory -> (Select a service) -> Integrations -> Add integration, และค้นหา \"Events API V2\", สำหรับข้อมูลเพิ่มเติม {0}",
-    "Integration Key": "Integration Key",
-    "Integration URL": "Integration URL",
-    "Auto resolve or acknowledged": "แก้ไขอัตโนมัติหรือยอมรับ",
-    "do nothing": "ไม่ทำอะไร",
-    "auto acknowledged": "ยอมรับอัตโนมัติ",
-    "auto resolve": "แก้ไขอัตโนมัติ",
-    "Bark Group": "กลุ่มที่จะประกาศ",
-    "Bark Sound": "เสียงประกาศ",
-    Authentication: "การตรวจสอบสิทธิ์",
-    "HTTP Headers": "HTTP Headers",
-    "Trust Proxy": "Trust Proxy",
-    HomeAssistant: "Home Assistant",
-    RadiusSecret: "Radius Secret",
-    RadiusSecretDescription: "แบ่งปันคีย์ลับระหว่างผู้ใช้งานและเซิร์ฟเวอร์",
-    RadiusCalledStationId: "Called Station Id",
-    RadiusCalledStationIdDescription: "Identifier of the called device",
-    RadiusCallingStationId: "Calling Station Id",
-    RadiusCallingStationIdDescription: "Identifier of the calling device",
-    "Connection String": "Connection String",
-    Query: "Query",
-    settingsCertificateExpiry: "วันหมดอายุของใบรับรอง TLS",
-    certificationExpiryDescription: "การตรวจสอบ HTTPS จะแจ้งเตือนถ้าใบอนุญาติ TLS จะหมดอายุใน:",
-    "Setup Docker Host": "ติดตั้ง Docker Host",
-    "Connection Type": "ประเภทการเชื่อมต่อ",
-    "Docker Daemon": "Docker Daemon",
-    deleteDockerHostMsg: "คุณแน่ใจหรือไม่ที่จะลบ Docker host นี้สำหรับการมอนิเตอร์ทั้งหมด?",
-    socket: "Socket",
-    tcp: "TCP / HTTP",
-    "Docker Container": "Docker Container",
-    "Container Name / ID": "Container Name / ID",
-    "Docker Host": "Docker Host",
-    "Docker Hosts": "Docker Hosts",
-    "ntfy Topic": "ntfy Topic",
-    Domain: "โดเมน",
-    Workstation: "Workstation",
-    disableCloudflaredNoAuthMsg: "คุณอยู่ในโหมดไม่มีการตรวจสอบสิทธิ์, ไม่จำเป็นต้องมีรหัสผ่าน",
-    trustProxyDescription: "เชื่อ Header 'X-Forwarded-*' ถ้าคุณต้องการไอพีที่ถูกต้องและ Uptime Kuma อยู่ข้างหลัง Nginx หรือ Apache, คุณควรเปิดใช้งาน",
-    Examples: "ตัวอย่าง",
-    "Home Assistant URL": "Home Assistant URL",
-    "Long-Lived Access Token": "Access Token แบบมีอายุนาน",
-    "Long-Lived Access Token can be created by clicking on your profile name (bottom left) and scrolling to the bottom then click Create Token. ": "Access Token แบบมีอายุนานสามารถสร้างได้โดยคลิกชื่อบนโปรไฟล์ (ล่างซ้าย) และเลื่อนไปข้างล่างจากนั้นคลิก \"Create Token\"",
-    "Notification Service": "บริการแจ้งเตือน",
-    "default: notify all devices": "ค่าเริ่มต้น: แจ้งเตือนทุกอุปกรณ์",
-    "A list of Notification Services can be found in Home Assistant under \"Developer Tools > Services\" search for \"notification\" to find your device/phone name.": "รายการแจ้งเตือนสามารถหาได้ใน Home Assistant ในเมนู \"Developer Tools > Services\" แล้วค้นหา \"notification\" เพื่อหาชื่ออุปกรณ์หรือชื่อโทรศัพท์",
-    "Automations can optionally be triggered in Home Assistant:": "สามารถเลือกสั่งงานระบบอัตโนมัติได้ใน Home Assistant:",
-    "Trigger type:": "ชนิดสิ่งกระตุ้น:",
-    "Event type:": "ชนิดเหตการณ์:",
-    "Event data:": "ข้อมูลกิจกรรม:",
-    "Then choose an action, for example switch the scene to where an RGB light is red.": "จากนั้นเลือกการกระทำ, ตัวอย่าง เช่น เปลี่ยนเป็นไฟสีแดง",
-    "Frontend Version": "เวอร์ชั่น Frontend",
-    "Frontend Version do not match backend version!": "เวอร์ชั่น Frontend ไม่ตรงกับ Backend !",
-};
diff --git a/src/languages/tr-TR.js b/src/languages/tr-TR.js
deleted file mode 100644
index 1bf949932..000000000
--- a/src/languages/tr-TR.js
+++ /dev/null
@@ -1,585 +0,0 @@
-export default {
-    languageName: "Türkçe",
-    checkEverySecond: "{0} Saniyede bir kontrol et.",
-    retryCheckEverySecond: "{0} Saniyede bir dene.",
-    resendEveryXTimes: "Her {0} bir yeniden gönder",
-    resendDisabled: "Yeniden gönderme devre dışı",
-    retriesDescription: "Servisin kapalı olarak işaretlenmeden ve bir bildirim gönderilmeden önce maksimum yeniden deneme sayısı",
-    ignoreTLSError: "HTTPS web siteleri için TLS/SSL hatasını yoksay",
-    upsideDownModeDescription: "Servisin durumunu tersine çevirir. Servis çalışıyorsa kapalı olarak işaretler.",
-    maxRedirectDescription: "İzlenecek maksimum yönlendirme sayısı. Yönlendirmeleri devre dışı bırakmak için 0'a ayarlayın.",
-    acceptedStatusCodesDescription: "Servisin çalıştığını hangi durum kodları belirlesin?",
-    passwordNotMatchMsg: "Şifre eşleşmiyor.",
-    notificationDescription: "Servislerin bildirim gönderebilmesi için bir bildirim yöntemi belirleyin.",
-    keywordDescription: "Anahtar kelimeyi düz html veya JSON yanıtında arayın ve büyük/küçük harfe duyarlıdır",
-    pauseDashboardHome: "Durdur",
-    deleteMonitorMsg: "Servisi silmek istediğinden emin misin?",
-    deleteNotificationMsg: "Bu bildirimi tüm servisler için silmek istediğinden emin misin?",
-    dnsPortDescription: "DNS sunucusu bağlantı noktası. Varsayılan değer 53'tür. Bağlantı noktasını istediğiniz zaman değiştirebilirsiniz.",
-    resolverserverDescription: "Cloudflare varsayılan sunucudur, çözümleyici sunucusunu istediğiniz zaman değiştirebilirsiniz.",
-    rrtypeDescription: "İzlemek istediğiniz servisin RR-Tipini seçin",
-    pauseMonitorMsg: "Durdurmak istediğinden emin misin?",
-    enableDefaultNotificationDescription: "Bu bildirim her yeni serviste aktif olacaktır. Bildirimi servisler için ayrı ayrı deaktive edebilirsiniz. ",
-    clearEventsMsg: "Bu servisin bütün kayıtlarını silmek istediğinden emin misin?",
-    clearHeartbeatsMsg: "Bu servis için tüm sağlık durumunu silmek istediğinden emin misin?",
-    confirmClearStatisticsMsg: "Tüm istatistikleri silmek istediğinden emin misin?",
-    importHandleDescription: "Aynı isimdeki bütün servisleri ve bildirimleri atlamak için 'Var olanı atla' seçiniz. 'Üzerine yaz' var olan bütün servisleri ve bildirimleri silecektir. ",
-    confirmImportMsg: "Yedeği içeri aktarmak istediğinize emin misiniz? Lütfen doğru içeri aktarma seçeneğini seçtiğinizden emin olunuz. ",
-    twoFAVerifyLabel: "Lütfen tokeni yazarak 2FA doğrulamanın çalıştığından emin olunuz.",
-    tokenValidSettingsMsg: "Token geçerli! Şimdi 2FA ayarlarını kaydedebilirsiniz. ",
-    confirmEnableTwoFAMsg: "2FA'ı etkinleştirmek istediğinizden emin misiniz?",
-    confirmDisableTwoFAMsg: "2FA'ı devre dışı bırakmak istediğinize emin misiniz?",
-    Settings: "Ayarlar",
-    Dashboard: "Panel",
-    "New Update": "Yeni Güncelleme",
-    Language: "Dil",
-    Appearance: "Görünüm",
-    Theme: "Tema",
-    General: "Genel",
-    "Primary Base URL": "Birincil Temel URL",
-    Version: "Versiyon",
-    "Check Update On GitHub": "GitHub'da Güncellemeyi Kontrol Edin",
-    List: "Liste",
-    Add: "Ekle",
-    "Add New Monitor": "Yeni Servis Ekle",
-    "Quick Stats": "Servis istatistikleri",
-    Up: "Normal",
-    Down: "Hatalı",
-    Pending: "Bekliyor",
-    Unknown: "Bilinmeyen",
-    Pause: "Durdur",
-    Name: "Servis ismi",
-    Status: "Durum",
-    DateTime: "Zaman",
-    Message: "Mesaj",
-    "No important events": "Önemli olay yok",
-    Resume: "Devam et",
-    Edit: "Düzenle",
-    Delete: "Sil",
-    Current: "Şu anda",
-    Uptime: "Çalışma zamanı",
-    "Cert Exp.": "Sertifika Süresi",
-    day: "gün | günler",
-    "-day": "-gün",
-    hour: "saat",
-    "-hour": "-saat",
-    Response: "Cevap Süresi",
-    Ping: "Ping",
-    "Monitor Type": "Servis Tipi",
-    Keyword: "Anahtar Kelime",
-    "Friendly Name": "Panelde görünecek isim",
-    URL: "URL",
-    Hostname: "IP Adresi",
-    Port: "Port",
-    "Heartbeat Interval": "Servis Test Aralığı",
-    Retries: "Yeniden deneme",
-    "Heartbeat Retry Interval": "Sağlık Durumları Tekrar Deneme Sıklığı",
-    "Resend Notification if Down X times consequently": "Sonuç olarak X kez düşerse bildirimi yeniden gönder",
-    Advanced: "Gelişmiş",
-    "Upside Down Mode": "Ters/Düz Modu",
-    "Max. Redirects": "Maksimum Yönlendirme",
-    "Accepted Status Codes": "Kabul Edilen Durum Kodları",
-    "Push URL": "Push URL",
-    needPushEvery: "Bu URL'yi her {0} saniyede bir aramalısınız.",
-    pushOptionalParams: "İsteğe bağlı parametreler: {0}",
-    Save: "Kaydet",
-    Notifications: "Bildirimler",
-    "Not available, please setup.": "Atanmış bildirim yöntemi yok. Ayarlardan belirleyebilirsiniz.",
-    "Setup Notification": "Bildirim yöntemi kur",
-    Light: "Açık",
-    Dark: "Koyu",
-    Auto: "Oto",
-    "Theme - Heartbeat Bar": "Servis Bar Konumu",
-    Normal: "Normal",
-    Bottom: "Aşağıda",
-    None: "Gösterme",
-    Timezone: "Zaman Dilimi",
-    "Search Engine Visibility": "Arama Motoru Görünürlüğü",
-    "Allow indexing": "İndekslemeye izin ver",
-    "Discourage search engines from indexing site": "İndekslemeyi reddet",
-    "Change Password": "Şifre Değiştir",
-    "Current Password": "Şuan ki Şifre",
-    "New Password": "Yeni Şifre",
-    "Repeat New Password": "Yeni Şifreyi Tekrar Girin",
-    "Update Password": "Şifreyi Değiştir",
-    "Disable Auth": "Şifreli girişi iptal et.",
-    "Enable Auth": "Şifreli girişi aktif et.",
-    "disableauth.message1": "<strong>Şifreli girişi devre dışı bırakmak istediğinizden</strong>emin misiniz?",
-    "disableauth.message2": "Bu, Uptime Kuma'nın önünde Cloudflare Access gibi <strong>üçüncü taraf yetkilendirmesi olan</strong> kişiler içindir.",
-    "Please use this option carefully!": "Lütfen dikkatli kullanın.",
-    Logout: "Çıkış yap",
-    Leave: "Ayrıl",
-    "I understand, please disable": "Evet farkındayım, iptal et",
-    Confirm: "Onayla",
-    Yes: "Evet",
-    No: "Hayır",
-    Username: "Kullanıcı Adı",
-    Password: "Şifre",
-    "Remember me": "Beni Hatırla",
-    Login: "Giriş yap",
-    "No Monitors, please": "Servis yok, lütfen",
-    "add one": "bir servis ekleyin",
-    "Notification Type": "Bildirim Yöntemi",
-    Email: "E-mail",
-    Test: "Test",
-    "Certificate Info": "Sertifika Bilgisi",
-    "Resolver Server": "Çözümleyici Sunucu",
-    "Resource Record Type": "Kaynak Kayıt Türü",
-    "Last Result": "En son sonuçlar",
-    "Create your admin account": "Yönetici hesabınızı oluşturun",
-    "Repeat Password": "Şifrenizi tekrar girin",
-    "Import Backup": "Yedeği içe aktar",
-    "Export Backup": "Yedeği dışa aktar",
-    Export: "Dışa aktar",
-    Import: "İçe aktar",
-    respTime: "Cevap Süresi (ms)",
-    notAvailableShort: "N/A",
-    "Default enabled": "Varsayılan etkinleştirilmiş",
-    "Apply on all existing monitors": "Var olan bütün servislere uygula",
-    Create: "Oluştur",
-    "Clear Data": "Verileri Temizle",
-    Events: "Olaylar",
-    Heartbeats: "Sağlık Durumları",
-    "Auto Get": "Otomatik Al",
-    backupDescription: "Bütün servisleri ve bildirimleri JSON dosyasına yedekleyebilirsiniz.",
-    backupDescription2: "Not: Geçmiş ve etkinlik verileri içinde değildir.",
-    backupDescription3: "Dışa aktarma dosyasında bildirim tokeni gibi hassas veriler bulunur, dikkatli bir şekilde saklayınız.",
-    alertNoFile: "İçeri aktarmak için bir dosya seçiniz.",
-    alertWrongFileType: "Lütfen bir JSON dosyası seçiniz.",
-    "Clear all statistics": "Bütün istatistikleri temizle",
-    "Skip existing": "Var olanı atla",
-    Overwrite: "Üzerine yaz",
-    Options: "Seçenekler",
-    "Keep both": "İkisini sakla",
-    "Verify Token": "Tokeni doğrula",
-    "Setup 2FA": "2FA Kur",
-    "Enable 2FA": "2FA Etkinleştir",
-    "Disable 2FA": "2FA Devre dışı bırak",
-    "2FA Settings": "2FA Ayarları",
-    "Two Factor Authentication": "İki Faktörlü Kimlik Doğrulama (2FA)",
-    Active: "Aktif",
-    Inactive: "İnaktif",
-    Token: "Token",
-    "Show URI": "URI'yi göster",
-    Tags: "Etiketler",
-    "Add New below or Select...": "Aşağıya Yeni Ekle veya Seç...",
-    "Tag with this name already exist.": "Bu ada sahip etiket zaten var.",
-    "Tag with this value already exist.": "Bu değere sahip etiket zaten var.",
-    color: "renk",
-    "value (optional)": "değer (isteğe bağlı)",
-    Gray: "Gri",
-    Red: "Kırmızı",
-    Orange: "Turuncu",
-    Green: "Yeşil",
-    Blue: "Mavi",
-    Indigo: "Çivit mavisi",
-    Purple: "Mor",
-    Pink: "Pembe",
-    "Search...": "Ara...",
-    "Avg. Ping": "Ortalama Ping",
-    "Avg. Response": "Ortalama Cevap Süresi",
-    "Entry Page": "Giriş Sayfası",
-    statusPageNothing: "Burada hiçbir şey yok, lütfen bir grup veya servis ekleyin.",
-    "No Services": "Hizmet Yok",
-    "All Systems Operational": "Tüm Sistemler Operasyonel",
-    "Partially Degraded Service": "Kısmen Bozulmuş Hizmet",
-    "Degraded Service": "Bozulmuş Hizmet",
-    "Add Group": "Grup Ekle",
-    "Add a monitor": "Servis Ekle",
-    "Edit Status Page": "Durum Sayfasını Düzenle",
-    "Go to Dashboard": "Panele Git",
-    "Status Page": "Durum Sayfası",
-    "Status Pages": "Durum Sayfaları",
-    defaultNotificationName: "My {notification} Alert ({number})",
-    here: "burada",
-    Required: "Gerekli",
-    telegram: "Telegram",
-    "Bot Token": "Bot Token",
-    wayToGetTelegramToken: "{0} adresinden bir token alabilirsiniz.",
-    "Chat ID": "Chat ID",
-    supportTelegramChatID: "Doğrudan Sohbet / Grup / Kanalın Sohbet Kimliğini Destekleyin",
-    wayToGetTelegramChatID: "Bot'a bir mesaj göndererek ve chat_id'yi görüntülemek için bu URL'ye giderek sohbet kimliğinizi alabilirsiniz:",
-    "YOUR BOT TOKEN HERE": "BOT TOKENİNİZ BURADA",
-    chatIDNotFound: "Chat ID bulunamadı; lütfen önce bu bota bir mesaj gönderin",
-    webhook: "Webhook",
-    "Post URL": "Post URL",
-    "Content Type": "Content Type",
-    webhookJsonDesc: "{0}, Express.js gibi tüm modern HTTP sunucuları için iyidir",
-    webhookFormDataDesc: "{multipart} PHP için iyidir. JSON'un {decodeFunction} ile ayrıştırılması gerekecek",
-    smtp: "E-mail (SMTP)",
-    secureOptionNone: "Hiçbiri / STARTTLS (25, 587)",
-    secureOptionTLS: "TLS (465)",
-    "Ignore TLS Error": "TLS Hatasını Yoksay",
-    "From Email": "E-postadan",
-    emailCustomSubject: "Özel Konu",
-    "To Email": "E-postaya",
-    smtpCC: "CC",
-    smtpBCC: "BCC",
-    discord: "Discord",
-    "Discord Webhook URL": "Discord Webhook URL",
-    wayToGetDiscordURL: "Bunu Sunucu Ayarları -> Entegrasyonlar -> Webhook Oluştur'a giderek alabilirsiniz.",
-    "Bot Display Name": "Botun Görünecek Adı",
-    "Prefix Custom Message": "Önek Özel Mesaj",
-    "Hello @everyone is...": "Merhaba {'@'}everyone ...",
-    teams: "Microsoft Teams",
-    "Webhook URL": "Webhook URL",
-    wayToGetTeamsURL: "Bir webhook URL'sinin nasıl oluşturulacağını öğrenebilirsiniz {0}.",
-    signal: "Sinyal",
-    Number: "Numara",
-    Recipients: "Alıcılar",
-    needSignalAPI: "REST API ile bir signal istemciniz olması gerekiyor.",
-    wayToCheckSignalURL: "Nasıl kurulacağını görmek için bu URL'yi kontrol edebilirsiniz:",
-    signalImportant: "ÖNEMLİ: Alıcılarda grupları ve sayıları karıştıramazsınız!",
-    gotify: "Gotify",
-    "Application Token": "Uygulama Tokeni",
-    "Server URL": "Sunucu URL",
-    Priority: "Öncelik",
-    slack: "Slack",
-    "Icon Emoji": "İkon Emoji",
-    "Channel Name": "Kanal Adı",
-    "Uptime Kuma URL": "Uptime Kuma URL",
-    aboutWebhooks: "Webhook hakkında daha fazla bilgi: {0}",
-    aboutChannelName: "Webhook kanalını atlamak istiyorsanız, {0} Kanal Adı alanına kanal adını girin. Ör: #diğer-kanal",
-    aboutKumaURL: "Uptime Kuma URL alanını boş bırakırsanız, varsayılan olarak Project GitHub sayfası olur.",
-    emojiCheatSheet: "Emoji cheat sheet: {0}",
-    "rocket.chat": "Rocket.Chat",
-    pushover: "Pushover",
-    pushy: "Pushy",
-    PushByTechulus: "Push by Techulus",
-    octopush: "Octopush",
-    promosms: "PromoSMS",
-    clicksendsms: "ClickSend SMS",
-    lunasea: "LunaSea",
-    apprise: "Apprise (50'den fazla Bildirim hizmetini destekler)",
-    GoogleChat: "Google Chat (sadece Google Workspace)",
-    pushbullet: "Pushbullet",
-    line: "Line Messenger",
-    mattermost: "Mattermost",
-    "User Key": "Kullancı Anahtarı",
-    Device: "Cihaz",
-    "Message Title": "Mesaj Başlığı",
-    "Notification Sound": "Bilgilendirme sesi",
-    "More info on:": "Daha fazla bilgi: {0}",
-    pushoverDesc1: "Acil durum önceliği (2), yeniden denemeler arasında varsayılan olarak 30 saniyelik bir zaman aşımına sahiptir ve 1 saat sonra sona erecektir.",
-    pushoverDesc2: "Farklı cihazlara bildirim göndermek istiyorsanız Cihaz alanını doldurunuz.",
-    "SMS Type": "SMS Tipi",
-    octopushTypePremium: "Premium (Hızlı - uyarı için önerilir)",
-    octopushTypeLowCost: "Düşük Maliyet (Yavaş - bazen operatör tarafından engellenir)",
-    checkPrice: "{0} fiyatlarını kontrol edin:",
-    apiCredentials: "API kimlik bilgileri",
-    octopushLegacyHint: "Octopush'un (2011-2020) eski sürümünü mü yoksa yeni sürümünü mü kullanıyorsunuz?",
-    "Check octopush prices": "Octopush fiyatlarını kontrol edin {0}.",
-    octopushPhoneNumber: "Telefon numarası (uluslararası biçim, örneğin: +33612345678) ",
-    octopushSMSSender: "SMS Gönderici Adı : 3-11 alfanümerik karakter ve boşluk (a-zA-Z0-9)",
-    "LunaSea Device ID": "LunaSea Cihaz ID",
-    "Apprise URL": "Apprise URL",
-    "Example:": "Örnek: {0}",
-    "Read more:": "Daha fazla oku: {0}",
-    "Status:": "Durum: {0}",
-    "Read more": "Daha fazla oku",
-    appriseInstalled: "Apprise yüklendi.",
-    appriseNotInstalled: "Appris yüklü değil. {0}",
-    "Access Token": "Erişim Tokeni",
-    "Channel access token": "Kanal erişim tokeni",
-    "Line Developers Console": "Line Geliştirici Konsolu",
-    lineDevConsoleTo: "Line Geliştirici Konsolu - {0}",
-    "Basic Settings": "Temel Ayarlar",
-    "User ID": "Kullanıcı ID",
-    "Messaging API": "Messaging API",
-    wayToGetLineChannelToken: "Önce {0}'e erişin, bir sağlayıcı ve kanal (Messaging API) oluşturun, ardından yukarıda belirtilen menü öğelerinden kanal erişim tokenini ve kullanıcı id alabilirsiniz.",
-    "Icon URL": "Simge URL",
-    aboutIconURL: "Varsayılan profil resmini geçersiz kılmak için \"Simge URL\" bölümünde bir resme bağlantı sağlayabilirsiniz. Simge Emojisi ayarlanmışsa kullanılmayacaktır.",
-    aboutMattermostChannelName: "Kanal adını \"Kanal Adı\" alanına girerek Webhook'un gönderi yaptığı varsayılan kanalı geçersiz kılabilirsiniz. Bunun Mattermost Webhook ayarlarında etkinleştirilmesi gerekir. Ör: #diğer-kanal",
-    matrix: "Matrix",
-    promosmsTypeEco: "SMS ECO - ucuz ama yavaş ve genellikle aşırı yüklü. Yalnızca Polonyalı alıcılarla sınırlıdır.",
-    promosmsTypeFlash: "SMS FLASH - Mesaj, alıcı cihazda otomatik olarak gösterilecektir. Yalnızca Polonyalı alıcılarla sınırlıdır.",
-    promosmsTypeFull: "SMS FULL - Premium SMS katmanı, Gönderici Adınızı kullanabilirsiniz (Önce adınızı kaydetmeniz gerekir). Uyarılar için güvenilir.",
-    promosmsTypeSpeed: "SMS HIZI - Sistemde en yüksek öncelik. Çok hızlı ve güvenilir ancak maliyetli (SMS FULL fiyatının yaklaşık iki katı).",
-    promosmsPhoneNumber: "Telefon numarası (Polonyalı alıcı için Alan kodlarını atlayabilirsiniz)",
-    promosmsSMSSender: "SMS Gönderici Adı : Ön kayıtlı ad veya varsayılanlardan biri: InfoSMS, SMS Info, MaxSMS, INFO, SMS",
-    "Feishu WebHookUrl": "Feishu WebHookURL",
-    matrixHomeserverURL: "Homeserver URL (http(s):// ve isteğe bağlı olarak bağlantı noktası ile)",
-    "Internal Room Id": "Internal Room ID",
-    matrixDesc1: "Internal Room ID'sini, Matrix istemcinizdeki oda ayarlarının gelişmiş bölümüne bakarak bulabilirsiniz. !QMdRCpUIfLwsfjxye6:home.server gibi görünmelidir.",
-    matrixDesc2: "Hesabınıza ve katıldığınız tüm odalara tam erişime izin vereceğinden, yeni bir kullanıcı oluşturmanız ve kendi Matrix kullanıcınızın erişim belirtecini kullanmamanız şiddetle tavsiye edilir. Bunun yerine, yeni bir kullanıcı oluşturun ve onu yalnızca bildirimi almak istediğiniz odaya davet edin. {0} komutunu çalıştırarak erişim tokenini alabilirsiniz.",
-    Method: "Yöntem",
-    Body: "Gövde",
-    Headers: "Başlıklar",
-    PushUrl: "Push URL",
-    HeadersInvalidFormat: "İstek başlıkları geçerli JSON değil:",
-    BodyInvalidFormat: "İstek gövdesi geçerli JSON değil:",
-    "Monitor History": "Servis Geçmişi",
-    clearDataOlderThan: "{0} gün boyunca izleme geçmişi verilerini saklayın.",
-    PasswordsDoNotMatch: "Parolalar uyuşmuyor.",
-    records: "kayıtlar",
-    "One record": "Bir Kayıt",
-    steamApiKeyDescription: "Bir Steam Oyun Sunucusunu izlemek için bir Steam Web-API anahtarına ihtiyacınız vardır. API anahtarınızı buradan kaydedebilirsiniz: ",
-    "Current User": "Şu anki kullanıcı",
-    topic: "Başlık",
-    topicExplanation: "İzlenecek MQTT servisi",
-    successMessage: "Başarılı Mesaj",
-    successMessageExplanation: "Başarılı olarak kabul edilecek MQTT mesajı",
-    recent: "Son",
-    Done: "Tamamlandı",
-    Info: "Bilgi",
-    Security: "Güvenlik",
-    "Steam API Key": "Steam API Anahtarı",
-    "Shrink Database": "Veritabanını Küçült",
-    "Pick a RR-Type...": "Bir RR-Tipi seçin...",
-    "Pick Accepted Status Codes...": "Kabul Edilen Durum Kodlarını Seçin...",
-    Default: "Varsayılan",
-    "HTTP Options": "HTTP Ayarları",
-    "Create Incident": "Olay Oluştur",
-    Title: "Başlık",
-    Content: "İçerik",
-    Style: "Stil",
-    info: "info",
-    warning: "warning",
-    danger: "danger",
-    error: "hata",
-    critical: "kritik",
-    primary: "primary",
-    light: "light",
-    dark: "dark",
-    Post: "Post",
-    "Please input title and content": "Lütfen başlık ve içerik girin",
-    Created: "Oluşturuldu",
-    "Last Updated": "Son Güncelleme",
-    Unpin: "Unpin",
-    "Switch to Light Theme": "Açık Temaya Geç",
-    "Switch to Dark Theme": "Karanlık Temaya Geç",
-    "Show Tags": "Etiketleri Göster",
-    "Hide Tags": "Etiketleri Gizle",
-    Description: "Açıklama",
-    "No monitors available.": "Kullanılabilir servis yok.",
-    "Add one": "Bir tane ekle",
-    "No Monitors": "Servis Yok",
-    "Untitled Group": "Adsız Grup",
-    Services: "Hizmetler",
-    Discard: "İptal Et",
-    Cancel: "İptal Et",
-    "Powered by": "Powered by",
-    shrinkDatabaseDescription: "SQLite için veritabanı VACUUM'unu tetikleyin. Veritabanınız 1.10.0'dan sonra oluşturulduysa, AUTO_VACUUM zaten etkinleştirilmiştir ve bu eyleme gerek yoktur.",
-    serwersms: "SerwerSMS.pl",
-    serwersmsAPIUser: "API Kullanıcı Adı (webapi_ öneki dahil)",
-    serwersmsAPIPassword: "API Şifre",
-    serwersmsPhoneNumber: "Telefon numarası",
-    serwersmsSenderName: "SMS Gönderici Adı (müşteri portalı üzerinden kayıtlı)",
-    stackfield: "Stackfield",
-    Customize: "Özelleştirme",
-    "Custom Footer": "Özel Altbilgi",
-    "Custom CSS": "Özel CSS",
-    smtpDkimSettings: "DKIM Ayarları",
-    smtpDkimDesc: "Kullanım için lütfen Nodemailer DKIM'e {0} bakın.",
-    documentation: "belgeler",
-    smtpDkimDomain: "Alan adı",
-    smtpDkimKeySelector: "Anahtar Seçici",
-    smtpDkimPrivateKey: "Özel anahtar",
-    smtpDkimHashAlgo: "Hash Algoritması (Opsiyonel)",
-    smtpDkimheaderFieldNames: "İmzalanacak Başlık Anahtarları (Opsiyonel)",
-    smtpDkimskipFields: "İmzalamayacak Başlık Anahtarları (Opsiyonel)",
-    wayToGetPagerDutyKey: "Bunu Hizmet -> Hizmet Dizini -> (Bir hizmet seçin) -> Entegrasyonlar -> Entegrasyon ekle'ye giderek alabilirsiniz. Burada \"Events API V2\" için arama yapabilirsiniz. Daha fazla bilgi {0}",
-    "Integration Key": "Entegrasyon Anahtarı",
-    "Integration URL": "Entegrasyon URL'si",
-    "Auto resolve or acknowledged": "Otomatik çözümleme veya onaylandı",
-    "do nothing": "hiçbir şey yapma",
-    "auto acknowledged": "otomatik onaylandı",
-    "auto resolve": "otomatik çözümleme",
-    gorush: "Gorush",
-    alerta: "Alerta",
-    alertaApiEndpoint: "API Endpoint",
-    alertaEnvironment: "Environment",
-    alertaApiKey: "API Key",
-    alertaAlertState: "Uyarı Durumu",
-    alertaRecoverState: "Kurtarma Durumu",
-    deleteStatusPageMsg: "Bu durum sayfasını silmek istediğinizden emin misiniz?",
-    Proxies: "Proxy'ler",
-    default: "Varsayılan",
-    enabled: "Etkinleştirilmiş",
-    setAsDefault: "Varsayılan Olarak Ayarla",
-    deleteProxyMsg: "Bu proxy'yi tüm servisler için silmek istediğinizden emin misiniz?",
-    proxyDescription: "Proxy'lerin çalışması için bir servise atanması gerekir.",
-    enableProxyDescription: "Bu proxy, etkinleştirilene kadar izleme isteklerini etkilemeyecektir. Aktivasyon durumuna göre proxy'yi tüm servislerden geçici olarak devre dışı bırakabilirsiniz.",
-    setAsDefaultProxyDescription: "Bu proxy, yeni servisler için varsayılan olarak etkinleştirilecektir. Yine de proxy'yi her servis için ayrı ayrı devre dışı bırakabilirsiniz.",
-    "Certificate Chain": "Sertifika Zinciri",
-    Valid: "Geçerli",
-    Invalid: "Geçersiz",
-    AccessKeyId: "AccessKey ID",
-    SecretAccessKey: "AccessKey Secret",
-    PhoneNumbers: "PhoneNumbers",
-    TemplateCode: "TemplateCode",
-    SignName: "SignName",
-    "Sms template must contain parameters: ": "Sms şablonu parametreleri içermelidir:",
-    "Bark Endpoint": "Bark Endpoint",
-    "Bark Group": "Bark Group",
-    "Bark Sound": "Bark Sound",
-    WebHookUrl: "WebHookUrl",
-    SecretKey: "SecretKey",
-    "For safety, must use secret key": "Güvenlik için gizli anahtar kullanılmalıdır",
-    "Device Token": "Cihaz Tokeni",
-    Platform: "Platform",
-    iOS: "iOS",
-    Android: "Android",
-    Huawei: "Huawei",
-    High: "High",
-    Retry: "Retry",
-    Topic: "Topic",
-    "WeCom Bot Key": "WeCom Bot Key",
-    "Setup Proxy": "Proxy kur",
-    "Proxy Protocol": "Proxy Protokolü",
-    "Proxy Server": "Proxy Sunucusu",
-    "Proxy server has authentication": "Proxy sunucusunun kimlik doğrulaması var",
-    User: "Kullanıcı",
-    Installed: "Yüklenmiş",
-    "Not installed": "Yüklü değil",
-    Running: "Çalışıyor",
-    "Not running": "Çalışmıyor",
-    "Remove Token": "Tokeni Kaldır",
-    Start: "Başlat",
-    Stop: "Durdur",
-    "Uptime Kuma": "Uptime Kuma",
-    "Add New Status Page": "Yeni Durum Sayfası Ekle",
-    Slug: "Slug",
-    "Accept characters:": "Kabul edilen karakterler:",
-    startOrEndWithOnly: "Yalnızca {0} ile başlayın veya bitirin",
-    "No consecutive dashes": "Ardışık tire yok",
-    Next: "Sonraki",
-    "The slug is already taken. Please choose another slug.": "Slug zaten alındı. Lütfen başka bir slug seçin.",
-    "No Proxy": "Proxy Yok",
-    Authentication: "Kimlik doğrulama",
-    "HTTP Basic Auth": "HTTP Temel Yetkilendirme",
-    "New Status Page": "Yeni Durum Sayfası",
-    "Page Not Found": "Sayfa bulunamadı",
-    "Reverse Proxy": "Ters Proxy",
-    Backup: "Yedek",
-    About: "Hakkında",
-    wayToGetCloudflaredURL: "(Cloudflared'i {0} adresinden indirin)",
-    cloudflareWebsite: "Cloudflare Website",
-    "Message:": "Mesaj:",
-    "Don't know how to get the token? Please read the guide:": "Tokeni nasıl alacağınızı bilmiyor musunuz? Lütfen kılavuzu okuyun:",
-    "The current connection may be lost if you are currently connecting via Cloudflare Tunnel. Are you sure want to stop it? Type your current password to confirm it.": "Halihazırda Cloudflare Tüneli üzerinden bağlanıyorsanız mevcut bağlantı kesilebilir. Durdurmak istediğinden emin misin? Onaylamak için mevcut şifrenizi yazın.",
-    "HTTP Headers": "HTTP Headers",
-    "Trust Proxy": "Trust Proxy",
-    "Other Software": "Diğer Yazılımlar",
-    "For example: nginx, Apache and Traefik.": "Örneğin: nginx, Apache ve Traefik.",
-    "Please read": "Lütfen oku",
-    "Subject:": "Başlık:",
-    "Valid To:": "Geçerlilik:",
-    "Days Remaining:": "Kalan günler:",
-    "Issuer:": "Veren:",
-    "Fingerprint:": "Parmak izi:",
-    "No status pages": "Durum sayfası yok",
-    "Domain Name Expiry Notification": "Alan Adı Sona Erme Bildirimi",
-    Proxy: "Proxy",
-    "Date Created": "Tarih Oluşturuldu",
-    HomeAssistant: "Home Assistant",
-    onebotHttpAddress: "OneBot HTTP Adresi",
-    onebotMessageType: "OneBot Mesaj Türü",
-    onebotGroupMessage: "Grup",
-    onebotPrivateMessage: "Özel",
-    onebotUserOrGroupId: "Grup/Kullanıcı Kimliği",
-    onebotSafetyTips: "Güvenlik için erişim tokeni ayarlamalısınız",
-    "PushDeer Key": "PushDeer Anahtarı",
-    "Footer Text": "Altbilgi metni",
-    "Show Powered By": "\"Powered by\" kısmını göster",
-    "Domain Names": "Alan isimleri",
-    signedInDisp: "{0} olarak oturum açıldı",
-    signedInDispDisabled: "Yetkilendirme Devre Dışı.",
-    RadiusSecret: "Radius Secret",
-    RadiusSecretDescription: "İstemci ve sunucu arasında paylaşılan gizli anahtar",
-    RadiusCalledStationId: "Aranan İstasyon Kimliği",
-    RadiusCalledStationIdDescription: "Aranan cihazın tanımlayıcısı",
-    RadiusCallingStationId: "Arayan İstasyon Kimliği",
-    RadiusCallingStationIdDescription: "Arayan cihazın tanımlayıcısı",
-    "Certificate Expiry Notification": "Sertifika Sona Erme Bildirimi",
-    "API Username": "API Kullanıc Adı",
-    "API Key": "API Anahtarı",
-    "Recipient Number": "Alıcı Numarası",
-    "From Name/Number": "İsimden/Numaradan",
-    "Leave blank to use a shared sender number.": "Paylaşılan bir gönderen numarası kullanmak için boş bırakın.",
-    "Octopush API Version": "Octopush API Sürümü",
-    "Legacy Octopush-DM": "Eski Octopush-DM",
-    endpoint: "uç nokta",
-    octopushAPIKey: "Kontrol panelindeki HTTP API kimlik bilgilerinden \"API Key\"",
-    octopushLogin: "Kontrol panelindeki HTTP API kimlik bilgilerinden \"Login\"",
-    promosmsLogin: "API Oturum Açma Adı",
-    promosmsPassword: "API Şifresi",
-    "pushoversounds pushover": "Pushover (varsayılan)",
-    "pushoversounds bike": "Bisiklet",
-    "pushoversounds bugle": "Boru",
-    "pushoversounds cashregister": "Yazar kasa",
-    "pushoversounds classical": "Klasik",
-    "pushoversounds cosmic": "Kozmik",
-    "pushoversounds falling": "Düşme",
-    "pushoversounds gamelan": "Oyun Alanı",
-    "pushoversounds incoming": "Gelen",
-    "pushoversounds intermission": "Ara",
-    "pushoversounds magic": "Büyü",
-    "pushoversounds mechanical": "Mekanik",
-    "pushoversounds pianobar": "Piano",
-    "pushoversounds siren": "Siren",
-    "pushoversounds spacealarm": "Uzay Alarmı",
-    "pushoversounds tugboat": "Römorkör",
-    "pushoversounds alien": "Uzaylı Alarmı (uzun)",
-    "pushoversounds climb": "Tırmanış (uzun)",
-    "pushoversounds persistent": "Sürekli (uzun)",
-    "pushoversounds echo": "Pushover Yankı (uzun)",
-    "pushoversounds updown": "Yukarı Aşağı (uzun)",
-    "pushoversounds vibrate": "Sadece titreşim",
-    "pushoversounds none": "Yok (sessiz)",
-    pushyAPIKey: "Gizli API Anahtarı",
-    pushyToken: "Cihaz tokeni",
-    "Show update if available": "Varsa güncellemeyi göster",
-    "Also check beta release": "Ayrıca beta sürümünü kontrol edin",
-    "Using a Reverse Proxy?": "Ters Proxy mi Kullanıyorsunuz?",
-    "Check how to config it for WebSocket": "WebSocket için nasıl yapılandırılacağını kontrol edin",
-    "Steam Game Server": "Steam Oyun Sunucusu",
-    "Most likely causes:": "En olası nedenler:",
-    "The resource is no longer available.": "Kaynak artık mevcut değil.",
-    "There might be a typing error in the address.": "Adreste bir yazım hatası olabilir.",
-    "What you can try:": "Ne deneyebilirsin:",
-    "Retype the address.": "Adresi tekrar yazın.",
-    "Go back to the previous page.": "Bir önceki sayfaya geri git.",
-    "Coming Soon": "Yakında gelecek",
-    wayToGetClickSendSMSToken: "API Kullanıcı Adı ve API Anahtarını {0} adresinden alabilirsiniz.",
-    "Connection String": "Bağlantı dizisi",
-    Query: "Sorgu",
-    settingsCertificateExpiry: "TLS Sertifikasının Geçerlilik Süresi",
-    certificationExpiryDescription: "HTTPS Monitörleri, TLS sertifikasının süresi dolduğunda bildirimi tetikler:",
-    "Setup Docker Host": "Docker Ana Bilgisayarını Kur",
-    "Connection Type": "Bağlantı türü",
-    "Docker Daemon": "Docker Daemon",
-    deleteDockerHostMsg: "Bu docker ana bilgisayarını tüm monitörler için silmek istediğinizden emin misiniz?",
-    socket: "Soket",
-    tcp: "TCP / HTTP",
-    "Docker Container": "Docker Konteyner",
-    "Container Name / ID": "Konteyner Adı / Kimliği",
-    "Docker Host": "Docker Ana Bilgisayarı",
-    "Docker Hosts": "Docker Ana Bilgisayarları",
-    "ntfy Topic": "ntfy Konu",
-    Domain: "Domain",
-    Workstation: "İş İstasyonu",
-    disableCloudflaredNoAuthMsg: "Yetki yok modundasınız, şifre gerekli değil.",
-    trustProxyDescription: "'X-Forwarded-*' başlıklarına güvenin. Doğru istemci IP'sini almak istiyorsanız ve Uptime Kuma'nız Nginx veya Apache'nin arkasındaysa, bunu etkinleştirmelisiniz.",
-    wayToGetLineNotifyToken: "{0} adresinden bir erişim jetonu alabilirsiniz.",
-    Examples: "Örnekler",
-    "Home Assistant URL": "Home Assistant URL",
-    "Long-Lived Access Token": "Long-Lived Erişim Anahtarı",
-    "Long-Lived Access Token can be created by clicking on your profile name (bottom left) and scrolling to the bottom then click Create Token. ": "Long-Lived Erişim Anahtarı, profil adınıza (sol altta) tıklayarak ve aşağıya kaydırarak ve ardından Anahtar Oluştur'a tıklayarak oluşturulabilir. ",
-    "Notification Service": "Bildirim Hizmeti",
-    "default: notify all devices": "varsayılan: tüm cihazları bilgilendir",
-    "A list of Notification Services can be found in Home Assistant under \"Developer Tools > Services\" search for \"notification\" to find your device/phone name.": "Cihazınızın/telefonunuzun adını bulmak için Home Assistant'ta \"Geliştirici Araçları > Hizmetler\" \"bildirim\" araması altında bir Bildirim Hizmetleri listesi bulunabilir.",
-    "Automations can optionally be triggered in Home Assistant:": "Otomasyonlar isteğe bağlı olarak Home Assistant'ta tetiklenebilir:",
-    "Trigger type:": "Trigger tipi:",
-    "Event type:": "Etkinlik tipi:",
-    "Event data:": "Etkinlik verileri:",
-    "Then choose an action, for example switch the scene to where an RGB light is red.": "Ardından bir eylem seçin, örneğin RGB ışığının kırmızı olduğu sahneyi değiştirin.",
-    "Frontend Version": "Frontend Sürümü",
-    "Frontend Version do not match backend version!": "Frontend Sürümü, backend sürümüyle eşleşmiyor!",
-    "Base URL": "Temel URL",
-    goAlertInfo: "GoAlert, çağrı üzerine zamanlama, otomatik eskalasyonlar ve bildirimler (SMS veya sesli çağrılar gibi) için açık kaynaklı bir uygulamadır. Doğru kişiyi, doğru şekilde ve doğru zamanda otomatik olarak devreye sokun! {0}",
-    goAlertIntegrationKeyInfo: "Servis için genel API entegrasyon anahtarını, genellikle kopyalanan URL'nin belirteç parametresinin değeri olan \"aaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee\" biçiminde alın.",
-    goAlert: "GoAlert",
-    backupOutdatedWarning: "Kullanımdan Kaldırıldı: Birçok özellik eklendiğinden ve bu yedekleme özelliği biraz bakımsız olduğundan, tam bir yedekleme oluşturamaz veya geri yükleyemez.",
-    backupRecommend: "Lütfen bunun yerine birimi veya veri klasörünü (./data/) doğrudan yedekleyin.",
-};
diff --git a/src/languages/uk-UA.js b/src/languages/uk-UA.js
deleted file mode 100644
index cc01793cd..000000000
--- a/src/languages/uk-UA.js
+++ /dev/null
@@ -1,530 +0,0 @@
-export default {
-    languageName: "Українська",
-    checkEverySecond: "Перевірка кожні {0} секунд",
-    retriesDescription: "Максимальна кількість спроб перед позначенням сервісу як недоступного та надсиланням повідомлення",
-    ignoreTLSError: "Ігнорувати помилку TLS/SSL для сайтів HTTPS",
-    upsideDownModeDescription: "Реверс статусу сервісу. Якщо сервіс доступний, він позначається як НЕДОСТУПНИЙ.",
-    maxRedirectDescription: "Максимальна кількість перенаправлень. Поставте 0, щоб вимкнути перенаправлення.",
-    acceptedStatusCodesDescription: "Виберіть коди статусів для визначення доступності сервісу.",
-    passwordNotMatchMsg: "Повторення паролю не збігається.",
-    notificationDescription: "Прив'яжіть сповіщення до моніторів.",
-    keywordDescription: "Пошук слова в чистому HTML або JSON-відповіді (чутливо до регістру)",
-    pauseDashboardHome: "Пауза",
-    deleteMonitorMsg: "Ви дійсно хочете видалити цей монітор?",
-    deleteNotificationMsg: "Ви дійсно хочете видалити це сповіщення для всіх моніторів?",
-    resolverserverDescription: "Cloudflare є сервером за замовчуванням. Ви завжди можете змінити цей сервер.",
-    rrtypeDescription: "Виберіть тип ресурсного запису, який ви хочете відстежувати",
-    pauseMonitorMsg: "Ви дійсно хочете поставити на паузу?",
-    Settings: "Налаштування",
-    Dashboard: "Панель управління",
-    "New Update": "Оновлення",
-    Language: "Мова",
-    Appearance: "Зовнішній вигляд",
-    Theme: "Тема",
-    General: "Загальне",
-    Version: "Версія",
-    "Check Update On GitHub": "Перевірити оновлення на GitHub",
-    List: "Список",
-    Add: "Додати",
-    "Add New Monitor": "Новий монітор",
-    "Quick Stats": "Статистика",
-    Up: "Доступний",
-    Down: "Недоступний",
-    Pending: "Очікування",
-    Unknown: "Невідомо",
-    Pause: "Пауза",
-    Name: "Ім'я",
-    Status: "Статус",
-    DateTime: "Дата і час",
-    Message: "Повідомлення",
-    "No important events": "Важливих подій немає",
-    Resume: "Відновити",
-    Edit: "Змінити",
-    Delete: "Видалити",
-    Current: "Поточний",
-    Uptime: "Аптайм",
-    "Cert Exp.": "Сертифікат спливає",
-    day: "день | днів",
-    "-day": " днів",
-    hour: "година",
-    "-hour": " години",
-    Response: "Відповідь",
-    Ping: "Пінг",
-    "Monitor Type": "Тип монітора",
-    Keyword: "Ключове слово",
-    "Friendly Name": "Ім'я",
-    URL: "URL",
-    Hostname: "Адреса хоста",
-    Port: "Порт",
-    "Heartbeat Interval": "Частота опитування",
-    Retries: "Спроб",
-    Advanced: "Додатково",
-    "Upside Down Mode": "Реверс статусу",
-    "Max. Redirects": "Макс. кількість перенаправлень",
-    "Accepted Status Codes": "Припустимі коди статусу",
-    Save: "Зберегти",
-    Notifications: "Сповіщення",
-    "Not available, please setup.": "Доступних сповіщень немає, необхідно створити.",
-    "Setup Notification": "Створити сповіщення",
-    Light: "Світла",
-    Dark: "Темна",
-    Auto: "Авто",
-    "Theme - Heartbeat Bar": "Тема - Смуга частоти опитування",
-    Normal: "Звичайний",
-    Bottom: "Знизу",
-    None: "Відсутня",
-    Timezone: "Часовий пояс",
-    "Search Engine Visibility": "Індексація пошуковими системами:",
-    "Allow indexing": "Дозволити індексування",
-    "Discourage search engines from indexing site": "Заборонити індексування",
-    "Change Password": "Змінити пароль",
-    "Current Password": "Поточний пароль",
-    "New Password": "Новий пароль",
-    "Repeat New Password": "Повтор нового пароля",
-    "Update Password": "Оновити пароль",
-    "Disable Auth": "Вимкнути авторизацію",
-    "Enable Auth": "Увімкнути авторизацію",
-    "disableauth.message1": "Ви впевнені, що бажаєте <strong>вимкнути авторизацію</strong>?",
-    "disableauth.message2": "Це підходить для <strong>тих, у кого встановлена інша авторизація</strong> пееред відкриттям Uptime Kuma, наприклад Cloudflare Access.",
-    "Please use this option carefully!": "Будь ласка, використовуйте з обережністю.",
-    Logout: "Вийти",
-    Leave: "Відміна",
-    "I understand, please disable": "Я розумію, все одно відключити",
-    Confirm: "Підтвердити",
-    Yes: "Так",
-    No: "Ні",
-    Username: "Логін",
-    Password: "Пароль",
-    "Remember me": "Запам'ятати мене",
-    Login: "Вхід до системи",
-    "No Monitors, please": "Моніторів немає, будь ласка",
-    "No Monitors": "Монітори відсутні",
-    "add one": "створіть новий",
-    "Notification Type": "Тип сповіщення",
-    Email: "Пошта",
-    Test: "Перевірка",
-    "Certificate Info": "Інформація про сертифікат",
-    "Resolver Server": "DNS сервер",
-    "Resource Record Type": "Тип ресурсного запису",
-    "Last Result": "Останній результат",
-    "Create your admin account": "Створіть обліковий запис адміністратора",
-    "Repeat Password": "Повторіть пароль",
-    respTime: "Час відповіді (мс)",
-    notAvailableShort: "Н/д",
-    Create: "Створити",
-    clearEventsMsg: "Ви дійсно хочете видалити всю статистику подій цього монітора?",
-    clearHeartbeatsMsg: "Ви дійсно хочете видалити всю статистику опитувань цього монітора?",
-    confirmClearStatisticsMsg: "Ви дійсно хочете видалити ВСЮ статистику?",
-    "Clear Data": "Видалити статистику",
-    Events: "Події",
-    Heartbeats: "Опитування",
-    "Auto Get": "Авто-отримання",
-    enableDefaultNotificationDescription: "Для кожного нового монітора це сповіщення буде включено за замовчуванням. Ви все ще можете відключити сповіщення в кожному моніторі окремо.",
-    "Default enabled": "Використовувати за промовчанням",
-    "Also apply to existing monitors": "Застосувати до існуючих моніторів",
-    Export: "Експорт",
-    Import: "Імпорт",
-    backupDescription: "Ви можете зберегти резервну копію всіх моніторів та повідомлень у вигляді JSON-файлу",
-    backupDescription2: "P.S.: Історія та події збережені не будуть",
-    backupDescription3: "Важливі дані, такі як токени повідомлень, додаються під час експорту, тому зберігайте файли в безпечному місці",
-    alertNoFile: "Виберіть файл для імпорту.",
-    alertWrongFileType: "Виберіть JSON-файл.",
-    twoFAVerifyLabel: "Будь ласка, введіть свій токен, щоб перевірити роботу 2FA",
-    tokenValidSettingsMsg: "Токен дійсний! Тепер ви можете зберегти налаштування 2FA.",
-    confirmEnableTwoFAMsg: "Ви дійсно хочете увімкнути 2FA?",
-    confirmDisableTwoFAMsg: "Ви дійсно хочете вимкнути 2FA?",
-    "Apply on all existing monitors": "Застосувати до всіх існуючих моніторів",
-    "Verify Token": "Перевірити токен",
-    "Setup 2FA": "Налаштування 2FA",
-    "Enable 2FA": "Увімкнути 2FA",
-    "Disable 2FA": "Вимкнути 2FA",
-    "2FA Settings": "Налаштування 2FA",
-    "Two Factor Authentication": "Двофакторна аутентифікація",
-    Active: "Активно",
-    Inactive: "Неактивно",
-    Token: "Токен",
-    "Show URI": "Показати URI",
-    "Clear all statistics": "Очистити статистику",
-    retryCheckEverySecond: "Повтор кожні {0} секунд",
-    importHandleDescription: "Виберіть \"Пропустити існуючі\", якщо ви хочете пропустити кожен монітор або повідомлення з таким же ім'ям. \"Перезаписати\" видалить кожен існуючий монітор або повідомлення та додасть заново. Варіант \"Не перевіряти\" примусово відновлює всі монітори і повідомлення, навіть якщо вони вже існують.",
-    confirmImportMsg: "Ви дійсно хочете відновити резервну копію? Переконайтеся, що ви вибрали відповідний варіант імпорту.",
-    "Heartbeat Retry Interval": "Інтервал повтору опитування",
-    "Import Backup": "Імпорт",
-    "Export Backup": "Експорт",
-    "Skip existing": "Пропустити існуючі",
-    Overwrite: "Перезаписати",
-    Options: "Опції",
-    "Keep both": "Не перевіряти",
-    Tags: "Теги",
-    "Add New below or Select...": "Додати новий або вибрати...",
-    "Tag with this name already exist.": "Такий тег вже існує.",
-    "Tag with this value already exist.": "Тег із таким значенням вже існує.",
-    color: "колір",
-    "value (optional)": "значення (опціонально)",
-    Gray: "Сірий",
-    Red: "Червоний",
-    Orange: "Помаранчевий",
-    Green: "Зелений",
-    Blue: "Синій",
-    Indigo: "Індиго",
-    Purple: "Пурпурний",
-    Pink: "Рожевий",
-    "Search...": "Пошук...",
-    "Avg. Ping": "Середній пінг",
-    "Avg. Response": "Середній час відповіді",
-    "Entry Page": "Головна сторінка",
-    statusPageNothing: "Тут порожньо. Додайте групу або монітор.",
-    "No Services": "Немає сервісів",
-    "All Systems Operational": "Всі системи працюють у штатному режимі",
-    "Partially Degraded Service": "Сервіси працюють частково",
-    "Degraded Service": "Всі сервіси не працюють",
-    "Add Group": "Додати групу",
-    "Add a monitor": "Додати монітор",
-    "Edit Status Page": "Редагувати",
-    "Go to Dashboard": "Панель управління",
-    "Status Page": "Сторінка статусу",
-    "Status Pages": "Сторінки статусу",
-    Discard: "Скасування",
-    "Create Incident": "Створити інцидент",
-    "Switch to Dark Theme": "Темна тема",
-    "Switch to Light Theme": "Світла тема",
-    telegram: "Telegram",
-    webhook: "Вебхук",
-    smtp: "Email (SMTP)",
-    discord: "Discord",
-    teams: "Microsoft Teams",
-    signal: "Signal",
-    gotify: "Gotify",
-    slack: "Slack",
-    "rocket.chat": "Rocket.chat",
-    pushover: "Pushover",
-    pushy: "Pushy",
-    octopush: "Octopush",
-    promosms: "PromoSMS",
-    lunasea: "LunaSea",
-    apprise: "Apprise (Підтримка 50+ сервісів повідомлень)",
-    pushbullet: "Pushbullet",
-    line: "Line Messenger",
-    mattermost: "Mattermost",
-    "Primary Base URL": "Основна URL",
-    "Push URL": "URL пуша",
-    needPushEvery: "До цієї URL необхідно звертатися кожні {0} секунд",
-    pushOptionalParams: "Опціональні параметри: {0}",
-    defaultNotificationName: "Моє сповіщення {notification} ({number})",
-    here: "тут",
-    Required: "Потрібно",
-    "Bot Token": "Токен бота",
-    wayToGetTelegramToken: "Ви можете взяти токен тут - {0}.",
-    "Chat ID": "ID чату",
-    supportTelegramChatID: "Підтримуються ID чатів, груп та каналів",
-    wayToGetTelegramChatID: "Ви можете взяти ID вашого чату, відправивши повідомлення боту і перейшовши по цьому URL для перегляду chat_id:",
-    "YOUR BOT TOKEN HERE": "ВАШ ТОКЕН БОТА ТУТ",
-    chatIDNotFound: "ID чату не знайдено; будь ласка, відправте спочатку повідомлення боту",
-    "Post URL": "Post URL",
-    "Content Type": "Тип контенту",
-    webhookJsonDesc: "{0} підходить для будь-яких сучасних HTTP-серверів, наприклад Express.js",
-    webhookFormDataDesc: "{multipart} підходить для PHP. JSON-вивід необхідно буде обробити за допомогою {decodeFunction}",
-    secureOptionNone: "Ні / STARTTLS (25, 587)",
-    secureOptionTLS: "TLS (465)",
-    "Ignore TLS Error": "Ігнорувати помилки TLS",
-    "From Email": "Від кого",
-    emailCustomSubject: "Своя тема",
-    "To Email": "Кому",
-    smtpCC: "Копія",
-    smtpBCC: "Прихована копія",
-    "Discord Webhook URL": "Discord Вебхук URL",
-    wayToGetDiscordURL: "Ви можете створити його в Параметрах сервера -> Інтеграції -> Створити вебхук",
-    "Bot Display Name": "Ім'я бота, що відображається",
-    "Prefix Custom Message": "Свій префікс повідомлення",
-    "Hello @everyone is...": "Привіт {'@'}everyone це...",
-    "Webhook URL": "URL вебхука",
-    wayToGetTeamsURL: "Як створити URL вебхука ви можете дізнатися тут - {0}.",
-    Номер: "Номер",
-    Recipients: "Одержувачі",
-    needSignalAPI: "Вам необхідний клієнт Signal із підтримкою REST API.",
-    wayToCheckSignalURL: "Пройдіть по цьому URL, щоб дізнатися як налаштувати такий клієнт:",
-    signalImportant: "ВАЖЛИВО: Не можна змішувати в Одержувачах групи та номери!",
-    "Application Token": "Токен програми",
-    "Server URL": "URL сервера",
-    Priority: "Пріоритет",
-    "Icon Emoji": "Іконка Emoji",
-    "Channel Name": "Ім'я каналу",
-    "Uptime Kuma URL": "Uptime Kuma URL",
-    aboutWebhooks: "Більше інформації про вебхуки: {0}",
-    aboutChannelName: "Введіть ім'я каналу в поле {0} Ім'я каналу, якщо ви хочете обійти канал вебхука. Наприклад: #other-channel",
-    aboutKumaURL: "Якщо поле Uptime Kuma URL в налаштуваннях залишиться порожнім, за замовчуванням буде використовуватися посилання на проект на GitHub.",
-    emojiCheatSheet: "Шпаргалка по Emoji: {0}",
-    "User Key": "Ключ користувача",
-    Device: "Пристрій",
-    "Message Title": "Заголовок повідомлення",
-    "Notification Sound": "Звук сповіщення",
-    "More info on:": "Більше інформації: {0}",
-    pushoverDesc1: "Екстренний пріоритет (2) має таймуут повтору за замовчуванням 30 секунд і закінчується через 1 годину.",
-    pushoverDesc2: "Якщо ви бажаєте надсилати повідомлення різним пристроям, необхідно заповнити поле Пристрій.",
-    "SMS Type": "Тип SMS",
-    octopushTypePremium: "Преміум (Швидкий - рекомендується для алертів)",
-    octopushTypeLowCost: "Дешевий (Повільний - іноді блокується операторами)",
-    checkPrice: "Тарифи {0}:",
-    octopushLegacyHint: "Ви використовуєте стару версію Octopush (2011-2020) або нову?",
-    "Check octopush prices": "Тарифи Octopush {0}.",
-    octopushPhoneNumber: "Номер телефону (між. формат, наприклад: +380123456789)",
-    octopushSMSSender: "Ім'я відправника SMS: 3-11 символів алвафіту, цифр та пробілів (a-zA-Z0-9)",
-    "LunaSea Device ID": "ID пристрою LunaSea",
-    "Apprise URL": "Apprise URL",
-    "Example:": "Приклад: {0}",
-    "Read more:": "Докладніше: {0}",
-    "Status:": "Статус: {0}",
-    "Read more": "Докладніше",
-    appriseInstalled: "Apprise встановлено.",
-    appriseNotInstalled: "Apprise не встановлено. {0}",
-    "Access Token": "Токен доступу",
-    "Channel access token": "Токен доступу каналу",
-    "Line Developers Console": "Консоль розробників Line",
-    lineDevConsoleTo: "Консоль розробників Line - {0}",
-    "Basic Settings": "Базові налаштування",
-    "User ID": "ID користувача",
-    "Messaging API": "API повідомлень",
-    wayToGetLineChannelToken: "Спочатку зайдіть в {0}, створіть провайдера та канал (API повідомлень), потім ви зможете отримати токен доступу каналу та ID користувача з вищезгаданих пунктів меню.",
-    "Icon URL": "URL іконки",
-    aboutIconURL: "Ви можете надати посилання на іконку в полі \"URL іконки\", щоб перевизначити картинку профілю за замовчуванням. Не використовується, якщо задана іконка Emoji.",
-    aboutMattermostChannelName: "Ви можете перевизначити канал за замовчуванням, в який пише вебхук, ввівши ім'я каналу в полі \"Ім'я каналу\". Це необхідно включити в налаштуваннях вебхука Mattermost. Наприклад: #other-channel",
-    matrix: "Matrix",
-    promosmsTypeEco: "SMS ECO - дешево та повільно, часто перевантажений. Тільки для одержувачів з Польщі.",
-    promosmsTypeFlash: "SMS FLASH - повідомлення автоматично з'являться на пристрої одержувача. Тільки для одержувачів з Польщі.",
-    promosmsTypeFull: "SMS FULL - преміум-рівень SMS, можна використовувати своє ім'я відправника (попередньо зареєструвавши його). Надійно для алертів.",
-    promosmsTypeSpeed: "SMS SPEED - найвищий пріоритет у системі. Дуже швидко і надійно, але дуже дорого (вдвічі дорожче, ніж SMS FULL).",
-    promosmsPhoneNumber: "Номер телефону (для одержувачів з Польщі можна пропустити код регіону)",
-    promosmsSMSSender: "Ім'я відправника SMS: Зареєстроване або одне з імен за замовчуванням: InfoSMS, SMS Info, MaxSMS, INFO, SMS",
-    "Feishu WebHookURL": "Feishu WebHookURL",
-    matrixHomeserverURL: "URL сервера (разом з http(s):// і опціонально порт)",
-    "Internal Room Id": "Внутрішній ID кімнати",
-    matrixDesc1: "Внутрішній ID кімнати можна знайти в Подробицях у параметрах каналу вашого Matrix клієнта. Він повинен виглядати приблизно як !QMdRCpUIfLwsfjxye6:home.server.",
-    matrixDesc2: "Рекомендується створити нового користувача і не використовувати токен доступу особистого користувача Matrix, тому що це спричиняє повний доступ до облікового запису та до кімнат, в яких ви є. Замість цього створіть нового користувача і запросіть його тільки в ту кімнату, в якій ви хочете отримувати повідомлення.Токен доступу можна отримати, виконавши команду {0}",
-    Method: "Метод",
-    Body: "Тіло",
-    Headers: "Заголовки",
-    PushUrl: "URL пуша",
-    HeadersInvalidFormat: "Заголовки запиту некоректні JSON: ",
-    BodyInvalidFormat: "Тіло запиту некоректне JSON: ",
-    "Monitor History": "Статистика",
-    clearDataOlderThan: "Зберігати статистику за {0} днів.",
-    PasswordsDoNotMatch: "Паролі не співпадають.",
-    records: "записів",
-    "One record": "Один запис",
-    steamApiKeyDescription: "Для моніторингу ігрового сервера Steam вам потрібен Web-API ключ Steam. Зареєструвати його можна тут: ",
-    "Certificate Chain": "Ланцюжок сертифікатів",
-    Valid: "Дійсний",
-    "Hide Tags": "Приховати теги",
-    Title: "Назва інциденту:",
-    Content: "Зміст інциденту:",
-    Post: "Опублікувати",
-    Cancel: "Скасувати",
-    Created: "Створено",
-    Unpin: "Відкріпити",
-    "Show Tags": "Показати теги",
-    recent: "Зараз",
-    "3h": "3 години",
-    "6h": "6 годин",
-    "24h": "24 години",
-    "1w": "1 тиждень",
-    "No monitors available.": "Немає доступних моніторів",
-    "Add one": "Додати новий",
-    Backup: "Резервна копія",
-    Security: "Безпека",
-    "Shrink Database": "Стиснути базу даних",
-    "Current User": "Поточний користувач",
-    About: "Про програму",
-    Description: "Опис",
-    "Powered by": "Працює на основі скрипту від",
-    shrinkDatabaseDescription: "Включає VACUUM для бази даних SQLite. Якщо база даних була створена на версії 1.10.0 і більше, AUTO_VACUUM вже включений і ця дія не потрібна.",
-    Style: "Стиль",
-    info: "ІНФО",
-    warning: "УВАГА",
-    danger: "ПОМИЛКА",
-    primary: "ОСНОВНИЙ",
-    light: "СВІТЛИЙ",
-    dark: "ТЕМНИЙ",
-    "New Status Page": "Нова сторінка статусу",
-    "Show update if available": "Показувати доступні оновлення",
-    "Also check beta release": "Перевіряти оновлення для бета версій",
-    "Add New Status Page": "Додати сторінку статусу",
-    Next: "Далі",
-    "Acz characters: a-z 0-9 -": "Дозволені символи: a-z 0-9 -",
-    "Start or end with a-z 0-9 only": "Початок та закінчення імені лише на символи: a-z 0-9",
-    "No consecutive dashes --": "Заборонено використовувати тире --",
-    "HTTP Options": "HTTP Опції",
-    Authentication: "Аутентифікація",
-    "HTTP Basic Auth": "Базова HTTP",
-    PushByTechulus: "Push by Techulus",
-    clicksendsms: "ClickSend SMS",
-    GoogleChat: "Google Chat (тільки Google Workspace)",
-    apiCredentials: "API реквізити",
-    Done: "Готово",
-    Info: "Інфо",
-    "Steam API Key": "Steam API-Ключ",
-    "Pick a RR-Type...": "Виберіть RR-тип...",
-    "Pick Accepted Status Codes...": "Виберіть прийняті коди стану...",
-    Default: "За замовчуванням",
-    "Please input title and content": "Будь ласка, введіть назву та зміст",
-    "Last Updated": "Останнє Оновлення",
-    "Untitled Group": "Група без назви",
-    Services: "Сервіси",
-    serwersms: "SerwerSMS.pl",
-    serwersmsAPIUser: "API Користувач (включаючи префікс webapi_)",
-    serwersmsAPIPassword: "API Пароль",
-    serwersmsPhoneNumber: "Номер телефону",
-    serwersmsSenderName: "SMS ім'я відправника (реєстрований через портал користувача)",
-    stackfield: "Stackfield",
-    smtpDkimSettings: "DKIM Налаштування",
-    smtpDkimDesc: "Повернутися до Nodemailer DKIM {0} для використання.",
-    documentation: "документація",
-    smtpDkimDomain: "Ім'я домена",
-    smtpDkimKeySelector: "Ключ",
-    smtpDkimPrivateKey: "Приватний ключ",
-    smtpDkimHashAlgo: "Алгоритм хеша (опціонально)",
-    smtpDkimheaderFieldNames: "Заголовок ключів для підпису (опціонально)",
-    smtpDkimskipFields: "Заколовок ключів не для підпису (опціонально)",
-    gorush: "Gorush",
-    alerta: "Alerta",
-    alertaApiEndpoint: "Кінцева точка API",
-    alertaEnvironment: "Середовище",
-    alertaApiKey: "Ключ API",
-    alertaAlertState: "Стан алерту",
-    alertaRecoverState: "Стан відновлення",
-    deleteStatusPageMsg: "Дійсно хочете видалити цю сторінку статусів?",
-    Proxies: "Проксі",
-    default: "За замовчуванням",
-    enabled: "Активно",
-    setAsDefault: "Встановити за замовчуванням",
-    deleteProxyMsg: "Ви впевнені, що хочете видалити цей проксі для всіх моніторів?",
-    proxyDescription: "Щоб функціонувати, монітору потрібно призначити проксі.",
-    enableProxyDescription: "Цей проксі не впливатиме на запити моніторингу, доки його не буде активовано. Ви можете контролювати тимчасове відключення проксі з усіх моніторів за статусом активації.",
-    setAsDefaultProxyDescription: "Цей проксі буде ввімкнено за умовчанням для нових моніторів. Ви все одно можете вимкнути проксі окремо для кожного монітора.",
-    Invalid: "Недійсний",
-    AccessKeyId: "AccessKey ID",
-    SecretAccessKey: "AccessKey Secret",
-    PhoneNumbers: "PhoneNumbers",
-    TemplateCode: "TemplateCode",
-    SignName: "SignName",
-    "Sms template must contain parameters: ": "Шаблон смс повинен містити параметри: ",
-    "Bark Endpoint": "Bark Endpoint",
-    WebHookUrl: "WebHookUrl",
-    SecretKey: "SecretKey",
-    "For safety, must use secret key": "Для безпеки необхідно використовувати секретний ключ",
-    "Device Token": "Токен пристрою",
-    Platform: "Платформа",
-    iOS: "iOS",
-    Android: "Android",
-    Huawei: "Huawei",
-    High: "Високий",
-    Retry: "Повтор",
-    Topic: "Тема",
-    "WeCom Bot Key": "WeCom Bot ключ",
-    "Setup Proxy": "Налаштувати проксі",
-    "Proxy Protocol": "Протокол проксі",
-    "Proxy Server": "Проксі-сервер",
-    "Proxy server has authentication": "Проксі-сервер має аутентифікацію",
-    User: "Користувач",
-    Installed: "Встановлено",
-    "Not installed": "Не встановлено",
-    Running: "Запущено",
-    "Not running": "Не запущено",
-    "Remove Token": "Видалити токен",
-    Start: "Запустити",
-    Stop: "Зупинити",
-    "Uptime Kuma": "Uptime Kuma",
-    Slug: "Slug",
-    "Accept characters:": "Прийняти символи:",
-    startOrEndWithOnly: "Починається або закінчується лише {0}",
-    "No consecutive dashes": "Немає послідовних тире",
-    "The slug is already taken. Please choose another slug.": "The slug is already taken. Please choose another slug.",
-    "No Proxy": "Без проксі",
-    "Page Not Found": "Сторінку не знайдено",
-    "Reverse Proxy": "Реверсивний проксі",
-    wayToGetCloudflaredURL: "(Завантажити Cloudflare з {0})",
-    cloudflareWebsite: "Веб-сайт Cloudflare",
-    "Message:": "Повідомлення:",
-    "Don't know how to get the token? Please read the guide:": "Не знаєте, як отримати токен? Прочитайте посібник:",
-    "The current connection may be lost if you are currently connecting via Cloudflare Tunnel. Are you sure want to stop it? Type your current password to confirm it.": "Поточне з’єднання може бути втрачено, якщо ви зараз під’єднуєтеся через Cloudflare Tunnel. Ви дійсно хочете зробити це? Для підтвердження введіть поточний пароль.",
-    "Other Software": "Інше програмне забезпечення",
-    "For example: nginx, Apache and Traefik.": "Наприклад: nginx, Apache and Traefik.",
-    "Please read": "Будь ласка, прочитайте",
-    "Subject:": "Тема:",
-    "Valid To:": "Дійсний до:",
-    "Days Remaining:": "Залишилось днів:",
-    "Issuer:": "Емітент:",
-    "Fingerprint:": "Відбиток:",
-    "No status pages": "Немає сторінок статусу",
-    "Domain Name Expiry Notification": "Сповіщення про закінчення терміну дії доменного імені",
-    Proxy: "Проксі",
-    "Date Created": "Дата створення",
-    onebotHttpAddress: "OneBot адреса HTTP",
-    onebotMessageType: "OneBot тип повідомлення",
-    onebotGroupMessage: "Група",
-    onebotPrivateMessage: "Приватне",
-    onebotUserOrGroupId: "Група/Користувач ID",
-    onebotSafetyTips: "Для безпеки необхідно встановити маркер доступу",
-    "PushDeer Key": "PushDeer ключ",
-    "Footer Text": "Текст нижнього колонтитула",
-    "Show Powered By": "Показувати платформу",
-    "Domain Names": "Доменні імена",
-    signedInDisp: "Ви ввійшли як {0}",
-    signedInDispDisabled: "Авторизація вимкнена.",
-    "Certificate Expiry Notification": "Сповіщення про закінчення терміну дії сертифіката",
-    "API Username": "Користувач API",
-    "API Key": "Ключ API",
-    "Recipient Number": "Номер одержувача",
-    "From Name/Number": "Від Ім'я/Номер",
-    "Leave blank to use a shared sender number.": "Залиште поле порожнім, щоб використовувати спільний номер відправника.",
-    "Octopush API Version": "Octopush API версія",
-    "Legacy Octopush-DM": "Legacy Octopush-DM",
-    "endpoint": "кінцева точка",
-    octopushAPIKey: "\"Ключ API\" з облікових даних HTTP API в панелі керування",
-    octopushLogin: "\"Ім'я користувача\" з облікових даних HTTP API на панелі керування",
-    promosmsLogin: "API Логін",
-    promosmsPassword: "API Пароль",
-    "pushoversounds pushover": "Pushover (по замовчуванню)",
-    "pushoversounds bike": "Bike",
-    "pushoversounds bugle": "Bugle",
-    "pushoversounds cashregister": "Cash Register",
-    "pushoversounds classical": "Classical",
-    "pushoversounds cosmic": "Cosmic",
-    "pushoversounds falling": "Falling",
-    "pushoversounds gamelan": "Gamelan",
-    "pushoversounds incoming": "Incoming",
-    "pushoversounds intermission": "Intermission",
-    "pushoversounds magic": "Magic",
-    "pushoversounds mechanical": "Mechanical",
-    "pushoversounds pianobar": "Piano Bar",
-    "pushoversounds siren": "Siren",
-    "pushoversounds spacealarm": "Space Alarm",
-    "pushoversounds tugboat": "Tug Boat",
-    "pushoversounds alien": "Alien Alarm (long)",
-    "pushoversounds climb": "Climb (long)",
-    "pushoversounds persistent": "Persistent (long)",
-    "pushoversounds echo": "Pushover Echo (long)",
-    "pushoversounds updown": "Up Down (long)",
-    "pushoversounds vibrate": "Vibrate Only",
-    "pushoversounds none": "None (silent)",
-    pushyAPIKey: "Секретний ключ API",
-    pushyToken: "Токен пристрою",
-    "Using a Reverse Proxy?": "Використовувати зворотній проксі?",
-    "Check how to config it for WebSocket": "Перевірте, як налаштувати його для WebSocket",
-    "Steam Game Server": "Ігровий сервер Steam",
-    "Most likely causes:": "Найімовірніші причини:",
-    "The resource is no longer available.": "Ресурс більше не доступний.",
-    "There might be a typing error in the address.": "Можливо, в адресі є помилка.",
-    "What you can try:": "Що ви можете спробувати:",
-    "Retype the address.": "Повторно введіть адресу.",
-    "Go back to the previous page.": "Повернутися на попередню сторінку.",
-    "Coming Soon": "Незабаром",
-    wayToGetClickSendSMSToken: "Ви можете отримати ім’я користувача API та ключ API з {0} .",
-    "Connection String": "Рядок підключення",
-    "Query": "Запит",
-    settingsCertificateExpiry: "Закінчення терміну дії сертифіката TLS",
-    certificationExpiryDescription: "Запуск сповіщення для HTTPS моніторів коли до закінчення терміну дії TLS сертифіката:",
-    "ntfy Topic": "ntfy Тема",
-    "Domain": "Домен",
-    "Workstation": "Робоча станція",
-    disableCloudflaredNoAuthMsg: "Ви перебуваєте в режимі без авторизації, пароль не потрібен.",
-};
diff --git a/src/languages/vi-VN.js b/src/languages/vi-VN.js
deleted file mode 100644
index 505776f07..000000000
--- a/src/languages/vi-VN.js
+++ /dev/null
@@ -1,469 +0,0 @@
-export default {
-    languageName: "Tiếng Việt",
-    checkEverySecond: "Kiểm tra mỗi {0} giây.",
-    retryCheckEverySecond: "Thử lại mỗi {0} giây.",
-    retriesDescription: "Số lần thử lại tối đa trước khi dịch vụ được đánh dấu là down và gửi thông báo.",
-    ignoreTLSError: "Bỏ qua lỗi TLS/SSL với các web HTTPS.",
-    upsideDownModeDescription: "Trạng thái đảo ngược, nếu dịch vụ có thể truy cập được nghĩa là DOWN.",
-    maxRedirectDescription: "Số lần chuyển hướng (redirect) tối đa. Đặt thành 0 để tắt chuyển hướng",
-    acceptedStatusCodesDescription: "Chọn mã trạng thái được coi là phản hồi thành công.",
-    passwordNotMatchMsg: "Mật khẩu nhập lại không khớp.",
-    notificationDescription: "Vui lòng chỉ định một kênh thông báo.",
-    keywordDescription: "Từ khoá tìm kiếm phản hồi ở dạng html hoặc JSON, có phân biệt chữ HOA - thường",
-    pauseDashboardHome: "Tạm dừng",
-    deleteMonitorMsg: "Bạn chắc chắn muốn xóa kênh theo dõi này chứ?",
-    deleteNotificationMsg: "Bạn có chắc chắn muốn xóa kênh thông báo này cho tất cả kênh theo dõi?",
-    resolverserverDescription: "Cloudflare là máy chủ mặc định, bạn có thể thay đổi bất cứ lúc nào.",
-    rrtypeDescription: "Hãy chọn RR-Type mà bạn muốn giám sát",
-    pauseMonitorMsg: "Bạn chắc chắn muốn tạm dừng chứ?",
-    enableDefaultNotificationDescription: "Bật làm mặc định cho mọi kênh theo dõi mới về sau. Bạn vẫn có thể tắt thông báo riêng cho từng kênh theo dõi.",
-    clearEventsMsg: "Bạn chắc chắn muốn xoá TẤT CẢ sự kiện cho kênh theo dõi này chứ?",
-    clearHeartbeatsMsg: "Bạn chắc chắn muốn xoá TẤT CẢ heartbeats cho kênh theo dõi này chứ?",
-    confirmClearStatisticsMsg: "Bạn chắc chắn muốn xoá TẤT CẢ số liệu thống kê?",
-    importHandleDescription: "Chọn 'Giữ lại' nếu bạn muốn bỏ qua mọi kênh theo dõi và kênh thông báo trùng tên. 'Ghi đè' sẽ ghi đè lên tất cả các kênh theo dõi và kênh thông báo.",
-    confirmImportMsg: "Bạn có chắc chắn muốn khôi phục bản bản sao lưu này không?.",
-    twoFAVerifyLabel: "Vui lòng nhập mã token của bạn để xác minh rằng xác thực 2 lớp (2FA) đang hoạt động",
-    tokenValidSettingsMsg: "Mã token hợp lệ! Bạn có thể lưu cài đặt xác thực 2 lớp (2FA) bây giờ.",
-    confirmEnableTwoFAMsg: "Bạn chắc chắn muốn bật xác thực 2 lớp (2FA) chứ?",
-    confirmDisableTwoFAMsg: "Bạn chắc chắn muốn tắt xác thực 2 lớp (2FA) chứ?",
-    Settings: "Cài đặt",
-    Dashboard: "Dashboard",
-    "New Update": "Bản cập nhật mới",
-    Language: "Ngôn ngữ",
-    Appearance: "Giao diện",
-    Theme: "Theme",
-    General: "Chung",
-    "Primary Base URL": "URL chính",
-    Version: "Phiên bản",
-    "Check Update On GitHub": "Kiểm tra bản cập nhật mới trên GitHub",
-    List: "List",
-    Add: "Thêm",
-    "Add New Monitor": "Thêm mới kênh theo dõi",
-    "Quick Stats": "Thống kê nhanh",
-    Up: "Up",
-    Down: "Down",
-    Pending: "Chờ xử lý",
-    Unknown: "Không xác định",
-    Pause: "Tạm dừng",
-    Name: "Tên",
-    Status: "Trạng thái",
-    DateTime: "Ngày tháng",
-    Message: "Trạng thái request",
-    "No important events": "Không có sự kiện quan trọng nào",
-    Resume: "Khôi phục",
-    Edit: "Sửa",
-    Delete: "Xoá",
-    Current: "Hiện tại",
-    Uptime: "Uptime",
-    "Cert Exp.": "Cert hết hạn",
-    day: "ngày",
-    "-day": "-ngày",
-    hour: "giờ",
-    "-hour": "-giờ",
-    Response: "Phản hồi",
-    Ping: "Ping",
-    "Monitor Type": "Kiểu kênh theo dõi",
-    Keyword: "Từ khoá",
-    "Friendly Name": "Tên rút gọn",
-    URL: "URL",
-    Hostname: "Hostname",
-    Port: "Port",
-    "Heartbeat Interval": "Tần suất kiểm tra",
-    Retries: "Thử lại",
-    "Heartbeat Retry Interval": "Tần suất kiểm tra lại",
-    Advanced: "Nâng cao",
-    "Upside Down Mode": "Chế độ đảo ngược",
-    "Max. Redirects": "Số chuyển hướng tối đa",
-    "Accepted Status Codes": "Codes trạng thái chấp nhận",
-    "Push URL": "Push URL",
-    needPushEvery: "Bạn nên gọi URL mỗi {0} giây.",
-    pushOptionalParams: "Tuỳ chỉnh parameters: {0}",
-    Save: "Lưu",
-    Notifications: "Thông báo",
-    "Not available, please setup.": "Chưa sẵn sàng, hãy cài đặt.",
-    "Setup Notification": "Cài đặt thông báo",
-    Light: "Sáng",
-    Dark: "Tối",
-    Auto: "Tự động",
-    "Theme - Heartbeat Bar": "Theme - Heartbeat Bar",
-    Normal: "Bình thường",
-    Bottom: "Dưới",
-    None: "Không có",
-    Timezone: "Múi giờ",
-    "Search Engine Visibility": "Hiển thị với các công cụ tìm kiếm",
-    "Allow indexing": "Cho phép indexing",
-    "Discourage search engines from indexing site": "Ngăn chặn các công cụ tìm kiếm indexing trang",
-    "Change Password": "Thay đổi mật khẩu",
-    "Current Password": "Mật khẩu hiện tại",
-    "New Password": "Mật khẩu mới",
-    "Repeat New Password": "Lặp lại mật khẩu mới",
-    "Update Password": "Cập nhật mật khẩu",
-    "Disable Auth": "Tắt xác minh",
-    "Enable Auth": "Bật xác minh",
-    "disableauth.message1": "Bạn có muốn <strong>TẮT XÁC THỰC</strong> không?",
-    "disableauth.message2": "Điều này rất nguy hiểm<strong>BẤT KỲ AI</strong> cũng có thể truy cập và cướp quyền điều khiển.",
-    "Please use this option carefully!": "Vui lòng <strong>cẩn thận</strong>.",
-    Logout: "Đăng xuất",
-    Leave: "Rời",
-    "I understand, please disable": "Tôi hiểu, làm ơn hãy tắt!",
-    Confirm: "Xác nhận",
-    Yes: "Có",
-    No: "Không",
-    Username: "Tài khoản",
-    Password: "Mật khẩu",
-    "Remember me": "Lưu phiên đăng nhập",
-    Login: "Đăng nhập",
-    "No Monitors, please": "Không có kênh theo dõi nào",
-    "add one": "Thêm mới",
-    "Notification Type": "Kiểu thông báo",
-    Email: "Email",
-    Test: "Thử",
-    "Certificate Info": "Thông tin Certificate",
-    "Resolver Server": "Máy chủ Resolver",
-    "Resource Record Type": "Loại bản ghi",
-    "Last Result": "Kết quả cuối cùng",
-    "Create your admin account": "Tạo tài khoản quản trị",
-    "Repeat Password": "Lặp lại mật khẩu",
-    "Import Backup": "Khôi phục bản sao lưu",
-    "Export Backup": "Xuất bản sao lưu",
-    Export: "Xuất",
-    Import: "Nhập",
-    respTime: "Thời gian phản hồi (ms)",
-    notAvailableShort: "N/A",
-    "Default enabled": "Mặc định bật",
-    "Apply on all existing monitors": "Áp dụng cho tất cả kênh theo dõi đang có",
-    Create: "Tạo",
-    "Clear Data": "Xoá dữ liệu",
-    Events: "Sự kiện",
-    Heartbeats: "Heartbeats",
-    "Auto Get": "Tự động lấy",
-    backupDescription: "Sao lưu tất cả các kênh theo dõi và tất cả các thông báo vào một file định dạng JSON.",
-    backupDescription2: "Lưu ý: Không bao gồm dữ liệu lịch sử các sự kiện.",
-    backupDescription3: "Hãy lưu giữ file này cẩn thận, trong file đó chứa cả các token thông báo.",
-    alertNoFile: "Hãy chọn file để khôi phục.",
-    alertWrongFileType: "Hãy chọn file định dạng JSON.",
-    "Clear all statistics": "Xoá tất cả thống kê",
-    "Skip existing": "Giữ lại",
-    Overwrite: "Ghi đè",
-    Options: "Tuỳ chọn",
-    "Keep both": "Giữ lại cả hai",
-    "Verify Token": "Xác minh Token",
-    "Setup 2FA": "Cài đặt xác thực 2 lớp (2FA)",
-    "Enable 2FA": "Bật xác thực 2 lớp (2FA)",
-    "Disable 2FA": "Tắt xác thực 2 lớp (2FA)",
-    "2FA Settings": "Cài đặt xác thực 2 lớp (2FA)",
-    "Two Factor Authentication": "Xác thực hai yếu tố",
-    Active: "Hoạt động",
-    Inactive: "Ngừng hoạt động",
-    Token: "Token",
-    "Show URI": "Hiển thị URI",
-    Tags: "Tags",
-    "Add New below or Select...": "Thêm mới ở dưới hoặc Chọn...",
-    "Tag with this name already exist.": "Tag với tên đã tồn tại.",
-    "Tag with this value already exist.": "Tag với value đã tồn tại.",
-    color: "Màu sắc",
-    "value (optional)": "Value (tuỳ chọn)",
-    Gray: "Xám",
-    Red: "Đỏ",
-    Orange: "Cam",
-    Green: "Xanh lá",
-    Blue: "Xanh da trời",
-    Indigo: "Chàm",
-    Purple: "Tím",
-    Pink: "Hồng",
-    "Search...": "Tìm kiếm...",
-    "Avg. Ping": "Ping trung bình",
-    "Avg. Response": "Phản hồi trung bình",
-    "Entry Page": "Entry Page",
-    statusPageNothing: "Chưa có thông tin gì, hãy thêm nhóm kênh theo dõi hoặc kênh theo dõi.",
-    "No Services": "Không có dịch vụ",
-    "All Systems Operational": "Tất cả các hệ thống hoạt động bình thường",
-    "Partially Degraded Service": "Có hệ thống bị ngưng",
-    "Degraded Service": "Toàn bộ hệ thống bị ngưng",
-    "Add Group": "Thêm nhóm",
-    "Add a monitor": "Thêm kênh theo dõi",
-    "Edit Status Page": "Sửa trang trạng thái",
-    "Go to Dashboard": "Đi tới Dashboard",
-    "Status Page": "Trang trạng thái",
-    "Status Pages": "Trang trạng thái",
-    defaultNotificationName: "My {notification} Alerts ({number})",
-    here: "tại đây",
-    Required: "Bắt buộc",
-    telegram: "Telegram",
-    "Bot Token": "Bot Token",
-    wayToGetTelegramToken: "Bạn có thể lấy mã token từ",
-    "Chat ID": "Chat ID",
-    supportTelegramChatID: "Hỗ trợ chat trực tiếp / Nhóm / Kênh Chat ID",
-    wayToGetTelegramChatID: "Bạn có thể lấy chat id của mình bằng cách gửi tin nhắn tới bot và truy cập url này để xem chat_id:",
-    "YOUR BOT TOKEN HERE": "MÃ BOT TOKEN CỦA BẠN",
-    chatIDNotFound: "Không tìm thấy Chat ID, vui lòng gửi tin nhắn cho bot này trước",
-    webhook: "Webhook",
-    "Post URL": "URL webhook",
-    "Content Type": "Loại nội dung",
-    webhookJsonDesc: "{0} tương thích với máy chủ HTTP ví dụ như Express.js",
-    webhookFormDataDesc: "{multipart} tương thích với máy chủ PHP, bạn chỉ cần phân tích cú pháp json bằng {decodeFunction}",
-    smtp: "Email (SMTP)",
-    secureOptionNone: "None/STARTTLS(25, 587)",
-    secureOptionTLS: "TLS (465)",
-    "Ignore TLS Error": "Bỏ qua lỗi TLS",
-    "From Email": "Email gửi",
-    emailCustomSubject: "Tuỳ chỉnh tiêu đề",
-    "To Email": "Email nhận",
-    smtpCC: "CC",
-    smtpBCC: "BCC",
-    discord: "Discord",
-    "Discord Webhook URL": "Discord Webhook URL",
-    wayToGetDiscordURL: "Để lấy Discord, hãy vào: Server Settings -> Integrations -> Create Webhook",
-    "Bot Display Name": "Tên hiển thị của BOT",
-    "Prefix Custom Message": "Tiền tố tin nhắn tuỳ chọn",
-    "Hello @everyone is...": "Xin chào {'@'} mọi người đang...",
-    teams: "Microsoft Teams",
-    "Webhook URL": "Webhook URL",
-    wayToGetTeamsURL: "Bạn có thể học cách tạo webhook url {0}.",
-    signal: "Tín hiệu",
-    Number: "Số",
-    Recipients: "Người nhận",
-    needSignalAPI: "Bạn cần một tín hiệu kết nối với REST API.",
-    wayToCheckSignalURL: "Bạn có thể kiểm tra URL này để xem cách thiết lập:",
-    signalImportant: "QUAN TRỌNG: Bạn không thể kết hợp các nhóm và số trong người nhận!",
-    gotify: "Gotify",
-    "Application Token": "Mã Token ứng dụng",
-    "Server URL": "URL máy chủ",
-    Priority: "Mức ưu tiên",
-    slack: "Slack",
-    "Icon Emoji": "Icon Emoji",
-    "Channel Name": "Tên Channel",
-    "Uptime Kuma URL": "Uptime Kuma URL",
-    aboutWebhooks: "Thông tin thêm về webhook trên: {0}",
-    aboutChannelName: "Nhập tên kênh trên {0} trường Channel Name nếu bạn muốn bỏ qua kênh webhook. vd: #other-channel",
-    aboutKumaURL: "Nếu bạn để trống trường Uptime Kuma URL, mặc định sẽ là trang Project Github.",
-    emojiCheatSheet: "Bảng tra cứu Emoji: {0}",
-    "rocket.chat": "Rocket.chat",
-    pushover: "Pushover",
-    pushy: "Pushy",
-    PushByTechulus: "Push by Techulus",
-    octopush: "Octopush",
-    promosms: "PromoSMS",
-    clicksendsms: "ClickSend SMS",
-    lunasea: "LunaSea",
-    apprise: "Apprise (Hỗ trợ trên 50 dịch vụ thông báo)",
-    GoogleChat: "Google Chat (Google Workspace only)",
-    pushbullet: "Pushbullet",
-    line: "Line Messenger",
-    mattermost: "Mattermost",
-    "User Key": "User Key",
-    Device: "Thiết bị",
-    "Message Title": "Tiêu đề tin nhắn",
-    "Notification Sound": "Âm thanh thông báo",
-    "More info on:": "Thông tin chi tiết tại: {0}",
-    pushoverDesc1: "Mức ưu tiên khẩn cấp (2) có thời gian chờ mặc định là 30 giây giữa các lần thử lại và sẽ hết hạn sau 1 giờ.",
-    pushoverDesc2: "Nếu bạn muốn gửi thông báo đến các thiết bị khác nhau, hãy điền vào trường Thiết bị.",
-    "SMS Type": "SMS Type",
-    octopushTypePremium: "Premium (Nhanh - Khuyến nghị nên dùng cho cảnh báo)",
-    octopushTypeLowCost: "Giá rẻ (Chậm, thỉnh thoảng bị chặn)",
-    checkPrice: "Kiểm tra giá {0}:",
-    apiCredentials: "API credentials",
-    octopushLegacyHint: "Bạn muốn sử dụng phiên bản cũ của Octopush (2011-2020) hay phiên bản mới?",
-    "Check octopush prices": "Kiểm tra giá octopush {0}.",
-    octopushPhoneNumber: "Số điện thoại (Định dạng intl, vd : +84692341165​) ",
-    octopushSMSSender: "SMS người gửi : 3-11 ký tự chữ, số và dấu cách (a-zA-Z0-9)",
-    "LunaSea Device ID": "LunaSea ID thiết bị",
-    "Apprise URL": "Apprise URL",
-    "Example:": "Ví dụ: {0}",
-    "Read more:": "Đọc thêm: {0}",
-    "Status:": "Trạng thái: {0}",
-    "Read more": "Đọc thêm",
-    appriseInstalled: "Đã cài đặt Apprise.",
-    appriseNotInstalled: "Chưa cài đặt Apprise. {0}",
-    "Access Token": "Token truy cập",
-    "Channel access token": "Token kênh truy cập",
-    "Line Developers Console": "Line Developers Console",
-    lineDevConsoleTo: "Line Developers Console - {0}",
-    "Basic Settings": "Cài đặt cơ bản",
-    "User ID": "User ID",
-    "Messaging API": "Messaging API",
-    wayToGetLineChannelToken: "Trước tiên, hãy truy cập {0},tạo nhà cung cấp và kênh (Messaging API), sau đó bạn có thể nhận mã token truy cập kênh và id người dùng từ các mục menu được đề cập ở trên.",
-    "Icon URL": "Icon URL",
-    aboutIconURL: "Bạn có thể cung cấp liên kết đến ảnh trong \"Icon URL\" để ghi đè ảnh hồ sơ mặc định. Sẽ không được sử dụng nếu Biểu tượng cảm xúc được thiết lập.",
-    aboutMattermostChannelName: "Bạn có thể ghi đè kênh mặc định mà webhook đăng lên bằng cách nhập tên kênh vào trường \"Channel Name\". Điều này cần được bật trong cài đặt Mattermost webhook. Ví dụ: #other-channel",
-    matrix: "Matrix",
-    promosmsTypeEco: "SMS ECO - rẻ nhưng chậm và thường xuyên quá tải. Chỉ dành cho người Ba Lan.",
-    promosmsTypeFlash: "SMS FLASH - Tin nhắn sẽ tự động hiển thị trên thiết bị của người nhận. Chỉ dành cho người Ba Lan.",
-    promosmsTypeFull: "SMS FULL - SMS cao cấp, Bạn có thể sử dụng Tên Người gửi (Bạn cần đăng ký tên trước). Đáng tin cậy cho các cảnh báo.",
-    promosmsTypeSpeed: "SMS SPEED - Ưu tiên cao nhất trong hệ thống. Rất nhanh chóng và đáng tin cậy nhưng tốn kém, (giá gấp đôi SMS FULL).",
-    promosmsPhoneNumber: "Số điện thoại (Bỏ qua mã vùng với người Ba Lan)",
-    promosmsSMSSender: "SMS Tên người gửi: Tên đã đăng ký trước hoặc tên mặc định: InfoSMS, SMS Info, MaxSMS, INFO, SMS",
-    "Feishu WebHookUrl": "Feishu WebHookUrl",
-    matrixHomeserverURL: "Homeserver URL (với http(s):// và port tuỳ chỉnh)",
-    "Internal Room Id": "Room ID Nội bộ",
-    matrixDesc1: "Bạn có thể tìm thấy room ID nội bộ bằng cách tìm trong mục advanced của phần room settings trong Matrix client của bạn. Nó có dạng giống như !QMdRCpUIfLwsfjxye6:home.server.",
-    matrixDesc2: "Bạn nên tạo người dùng mới và đừng sử dụng mã token truy cập của Matrix user vì nó sẽ cho phép truy cập toàn quyền vào tài khoản của bạn và tất cả các phòng bạn đã tham gia. Thay vào đó, hãy tạo một người dùng mới và chỉ mời người đó vào phòng mà bạn muốn nhận thông báo. Bạn có thể lấy được mã token truy cập bằng cách chạy {0}",
-    Method: "Method",
-    Body: "Body",
-    Headers: "Headers",
-    PushUrl: "Push URL",
-    HeadersInvalidFormat: "Header request không hợp lệ JSON: ",
-    BodyInvalidFormat: "Tequest body không hợp lệ JSON: ",
-    "Monitor History": "Lịch sử kênh theo dõi",
-    clearDataOlderThan: "Giữ dữ liệu lịch sử kênh theo dõi {0} ngày.",
-    PasswordsDoNotMatch: "Passwords không khớp.",
-    records: "records",
-    "One record": "One record",
-    steamApiKeyDescription: "Để theo dõi các Steam Game Server bạn cần một Steam Web-API key. Bạn có thể đăng ký API key tại đây: ",
-    "Current User": "User hiện tại",
-    topic: "Topic",
-    topicExplanation: "MQTT topic to monitor",
-    successMessage: "Success Message",
-    successMessageExplanation: "MQTT message that will be considered as success",
-    recent: "Gần đây",
-    Done: "Hoàn thành",
-    Info: "Thông tin",
-    Security: "Bảo mật",
-    "Steam API Key": "Steam API Key",
-    "Shrink Database": "Shrink Database",
-    "Pick a RR-Type...": "Pick a RR-Type...",
-    "Pick Accepted Status Codes...": "Chọn các Codes trạng thái chấp nhận được...",
-    Default: "Mặc định",
-    "HTTP Options": "Tuỳ chọn HTTP",
-    "Create Incident": "Tạo Incident",
-    Title: "Tiêu đề",
-    Content: "Nội dung",
-    Style: "Style",
-    info: "thông tin",
-    warning: "cảnh báo",
-    danger: "nguy hiểm",
-    primary: "cơ sở",
-    light: "sáng",
-    dark: "tối",
-    Post: "Post",
-    "Please input title and content": "Hãy nhập tiêu đề và nội dung",
-    Created: "Đã tạo",
-    "Last Updated": "Cập nhật mới nhất",
-    Unpin: "Bỏ ghim",
-    "Switch to Light Theme": "Chuyển sang giao diện Sáng",
-    "Switch to Dark Theme": "Chuyển sang giao diện Tối",
-    "Show Tags": "Hiện Tags",
-    "Hide Tags": "Ẩn Tags",
-    Description: "Mô tả",
-    "No monitors available.": "Không có kênh theo dõi nào.",
-    "Add one": "Thêm mới",
-    "No Monitors": "Không có kênh theo dõi",
-    "Untitled Group": "Nhóm không có tiêu đề",
-    Services: "Dịch vụ",
-    Discard: "Bỏ",
-    Cancel: "Hủy",
-    "Powered by": "Được cung cấp bởi",
-    shrinkDatabaseDescription: "Khởi chạy database VACCUM cho SQLite. Nếu database được tạo sau version 1.10.0, AUTO_VACCUM đã được bật sẵn, hành động này không cần thiết.",
-    serwersms: "SerwerSMS.pl",
-    serwersmsAPIUser: "API Username (incl. webapi_ prefix)",
-    serwersmsAPIPassword: "API Password",
-    serwersmsPhoneNumber: "Số điện thoại",
-    serwersmsSenderName: "Tên người gửi SMS (Đã đăng ký qua portal)",
-    "stackfield": "Stackfield",
-    Customize: "Customize",
-    "Custom Footer": "Custom Footer",
-    "Custom CSS": "Custom CSS",
-    smtpDkimSettings: "Cài đặt xác thực Email(DKIM)",
-    smtpDkimDesc: "Xem hướng dẫn tại {0}.",
-    documentation: "Nodemailer DKIM",
-    smtpDkimDomain: "Mail domain",
-    smtpDkimKeySelector: "DKIM Key Selector",
-    smtpDkimPrivateKey: "Private Key",
-    smtpDkimHashAlgo: "Hash Algorithm (Tuỳ chọn)",
-    smtpDkimheaderFieldNames: "Header Keys to sign (Tuỳ chọn)",
-    smtpDkimskipFields: "Header Keys not to sign (Tuỳ chọn)",
-    gorush: "Gorush",
-    alerta: "Alerta",
-    alertaApiEndpoint: "API Endpoint",
-    alertaEnvironment: "Environment",
-    alertaApiKey: "API Key",
-    alertaAlertState: "Alert State",
-    alertaRecoverState: "Recover State",
-    deleteStatusPageMsg: "Bạn có chắc chắn muốn xoá trang status này?",
-    Proxies: "Proxies",
-    default: "Mặc định",
-    enabled: "Enabled",
-    setAsDefault: "Set As Default",
-    deleteProxyMsg: "Bạn muốn xoá proxy này cho tất cả monitors?",
-    proxyDescription: "Proxies must be assigned to a monitor to function.",
-    enableProxyDescription: "Proxy này chưa ảnh hưởng tới monitor requests cho tới khi được activated. Bạn có thể tạm thời tắt proxy cho tất cả monitors bằng trạng thái activation.",
-    setAsDefaultProxyDescription: "Proxy này sẽ bật mặc định cho tất cả monitors mới. Bạn có thể tắt riêng lẻ proxy trên mỗi monitor.",
-    "Certificate Chain": "Certificate Chain",
-    Valid: "Hợp lệ",
-    Invalid: "Không hợp lệ",
-    AccessKeyId: "AccessKey ID",
-    SecretAccessKey: "AccessKey Secret",
-    PhoneNumbers: "PhoneNumbers",
-    TemplateCode: "TemplateCode",
-    SignName: "SignName",
-    "Sms template must contain parameters: ": "Sms template must contain parameters: ",
-    "Bark Endpoint": "Bark Endpoint",
-    WebHookUrl: "WebHookUrl",
-    SecretKey: "SecretKey",
-    "For safety, must use secret key": "Để an toàn, hãy dùng secret key",
-    "Device Token": "Device Token",
-    Platform: "Platform",
-    iOS: "iOS",
-    Android: "Android",
-    Huawei: "Huawei",
-    High: "High",
-    Retry: "Retry",
-    Topic: "Topic",
-    "WeCom Bot Key": "WeCom Bot Key",
-    "Setup Proxy": "Setup Proxy",
-    "Proxy Protocol": "Proxy Protocol",
-    "Proxy Server": "Proxy Server",
-    "Proxy server has authentication": "Proxy server has authentication",
-    User: "User",
-    Installed: "Installed",
-    "Not installed": "Not installed",
-    Running: "Running",
-    "Not running": "Not running",
-    "Remove Token": "Remove Token",
-    Start: "Start",
-    Stop: "Stop",
-    "Uptime Kuma": "Uptime Kuma",
-    "Add New Status Page": "Thêm mới Status Page",
-    Slug: "Slug",
-    "Accept characters:": "Accept characters:",
-    startOrEndWithOnly: "Start or end with {0} only",
-    "No consecutive dashes": "No consecutive dashes",
-    Next: "Next",
-    "The slug is already taken. Please choose another slug.": "The slug is already taken. Please choose another slug.",
-    "No Proxy": "No Proxy",
-    "HTTP Basic Auth": "HTTP Basic Auth",
-    "New Status Page": "New Status Page",
-    "Page Not Found": "Page Not Found",
-    "Reverse Proxy": "Reverse Proxy",
-    Backup: "Backup",
-    About: "About",
-    wayToGetCloudflaredURL: "(Download cloudflared from {0})",
-    cloudflareWebsite: "Cloudflare Website",
-    "Message:": "Message:",
-    "Don't know how to get the token? Please read the guide:": "Chưa biết cách lấy token? Xem hướng dẫn tại:",
-    "The current connection may be lost if you are currently connecting via Cloudflare Tunnel. Are you sure want to stop it? Type your current password to confirm it.": "Nếu bạn đang dùng Cloudflare Tunnel, kết nối hiện tại có thể đang bị mất. Bạn có muốn dừng lại? Nhập lại password để xác nhận.",
-    "Other Software": "Phần mềm khác",
-    "For example: nginx, Apache and Traefik.": "Ví dụ: Nginx, Apache hay Traefik.",
-    "Please read": "Hãy xem qua",
-    "Subject:": "Subject:",
-    "Valid To:": "Valid To:",
-    "Days Remaining:": "Số ngày còn lại:",
-    "Issuer:": "Issuer:",
-    "Fingerprint:": "Fingerprint:",
-    "No status pages": "No status pages",
-    "Domain Name Expiry Notification": "Cảnh báo hạn hạn Domain Name",
-    Proxy: "Proxy",
-    "Date Created": "Ngày khởi tạo",
-    onebotHttpAddress: "OneBot HTTP Address",
-    onebotMessageType: "OneBot Message Type",
-    onebotGroupMessage: "Group",
-    onebotPrivateMessage: "Private",
-    onebotUserOrGroupId: "Group/User ID",
-    onebotSafetyTips: "Để đảm bảo an toàn, hãy thiết lập access token",
-    "PushDeer Key": "PushDeer Key",
-    "Footer Text": "Footer Text",
-    "Show Powered By": "Show Powered By",
-    "Domain Names": "Domain Names",
-    signedInDisp: "Signed in as {0}",
-    signedInDispDisabled: "Auth Disabled.",
-};
diff --git a/src/languages/zh-CN.js b/src/languages/zh-CN.js
deleted file mode 100644
index ff11c7e9b..000000000
--- a/src/languages/zh-CN.js
+++ /dev/null
@@ -1,598 +0,0 @@
-export default {
-    languageName: "简体中文",
-    checkEverySecond: "检测频率 {0} 秒",
-    retryCheckEverySecond: "重试间隔 {0} 秒",
-    retriesDescription: "服务被标记为故障并发送通知之前的最大重试次数",
-    ignoreTLSError: "忽略 HTTPS 站点的 TLS/SSL 错误",
-    upsideDownModeDescription: "反转状态监控,如果服务可访问,则认为是故障。",
-    maxRedirectDescription: "允许的最大重定向次数。设置为 0 禁用重定向。",
-    acceptedStatusCodesDescription: "选择被视为成功响应的状态码。",
-    passwordNotMatchMsg: "两次输入的密码不一致。",
-    notificationDescription: "通知必须被分配给监控项才能正常工作。",
-    keywordDescription: "在纯 HTML 或 JSON 响应中搜索关键字,区分大小写。",
-    pauseDashboardHome: "暂停",
-    deleteMonitorMsg: "确定要删除此监控项吗?",
-    deleteNotificationMsg: "确定要为所有监控项删除此通知吗?",
-    resolverserverDescription: "默认服务器是 Cloudflare。您随时可以修改解析服务器。",
-    rrtypeDescription: "选择要监控的资源记录类型",
-    pauseMonitorMsg: "确定要暂停吗?",
-    enableDefaultNotificationDescription: "新的监控项将默认启用此通知,您仍然为每个监控项单独禁用。",
-    clearEventsMsg: "确定要删除此监控项的所有事件吗?",
-    clearHeartbeatsMsg: "确定要删除此监控项的所有心跳状态吗?",
-    confirmClearStatisticsMsg: "确定要删除所有统计信息吗?",
-    importHandleDescription: "如果想跳过同名的监控项或消息通知,请选择“跳过已存在”。“覆盖”将删除所有现有的监控项和通知。",
-    confirmImportMsg: "确定要导入备份吗?请确保已经选择了正确的导入选项。",
-    twoFAVerifyLabel: "请输入令牌码以确认二次验证:",
-    tokenValidSettingsMsg: "令牌码有效!您现在可以保存二次验证设置了。",
-    confirmEnableTwoFAMsg: "确定要启用二次验证吗?",
-    confirmDisableTwoFAMsg: "确定要禁用二次验证吗?",
-    Settings: "设置",
-    Dashboard: "仪表盘",
-    "New Update": "有新版本",
-    Language: "语言",
-    Appearance: "外观",
-    Theme: "主题",
-    General: "常规",
-    "Primary Base URL": "站点主 URL",
-    About: "关于",
-    Version: "版本",
-    "Check Update On GitHub": "检查 GitHub 上的更新",
-    List: "列表",
-    Add: "添加",
-    "Add New Monitor": "添加监控项",
-    "Quick Stats": "状态速览",
-    Up: "正常",
-    Down: "故障",
-    Pending: "正在检测",
-    Unknown: "未知",
-    Pause: "暂停",
-    Name: "名称",
-    Status: "状态",
-    DateTime: "日期时间",
-    Message: "消息",
-    "No important events": "暂无重要事件",
-    Resume: "恢复",
-    Edit: "编辑",
-    Delete: "删除",
-    Current: "当前",
-    Uptime: "在线时间",
-    "Cert Exp.": "证书有效期",
-    day: "天",
-    "-day": " 天",
-    hour: "小时",
-    "-hour": " 小时",
-    Response: "响应",
-    Ping: "Ping",
-    "Monitor Type": "监控类型",
-    Keyword: "关键字",
-    "Friendly Name": "显示名称",
-    URL: "URL",
-    Hostname: "主机名",
-    Port: "端口号",
-    "Heartbeat Interval": "心跳间隔",
-    Retries: "重试次数",
-    "Heartbeat Retry Interval": "心跳重试间隔",
-    Advanced: "高级",
-    "Upside Down Mode": "反转监控",
-    "Max. Redirects": "最大重定向次数",
-    "Accepted Status Codes": "有效状态码",
-    "Push URL": "推送 URL",
-    needPushEvery: "您需要每 {0} 秒调用一次该 URL",
-    pushOptionalParams: "可选参数:{0}",
-    Save: "保存",
-    Notifications: "通知",
-    "Not available, please setup.": "暂不可用,请先设置",
-    "Setup Notification": "设置通知",
-    Light: "明亮",
-    Dark: "黑暗",
-    Auto: "自动",
-    "Theme - Heartbeat Bar": "主题 - 心跳栏",
-    Normal: "正常",
-    Bottom: "靠下",
-    None: "不显示",
-    Timezone: "时区",
-    "Search Engine Visibility": "搜索引擎可见性",
-    "Allow indexing": "允许索引",
-    "Discourage search engines from indexing site": "阻止搜索引擎索引网站",
-    "Change Password": "修改密码",
-    "Current Password": "当前密码",
-    "New Password": "新密码",
-    "Repeat New Password": "重复新密码",
-    "Update Password": "更新密码",
-    "Disable Auth": "禁用身份验证",
-    "Enable Auth": "启用身份验证",
-    "disableauth.message1": "是否确定 <strong>取消登录验证</strong>?",
-    "disableauth.message2": "这是为 <strong>有第三方认证</strong> 的用户提供的功能,如 Cloudflare Access",
-    "Please use this option carefully!": "请谨慎使用!",
-    Logout: "退出",
-    Leave: "离开",
-    "I understand, please disable": "我已了解,继续禁用",
-    Confirm: "确认",
-    Yes: "是",
-    No: "否",
-    Username: "用户名",
-    Password: "密码",
-    "Remember me": "记住我",
-    Login: "登录",
-    "No Monitors, please": "还没有监控项,",
-    "add one": "点击添加",
-    "Notification Type": "通知类型",
-    Email: "邮件",
-    Test: "测试",
-    "Certificate Info": "证书信息",
-    "Resolver Server": "解析服务器",
-    "Resource Record Type": "资源记录类型",
-    "Last Result": "上次结果",
-    "Create your admin account": "创建管理员账户",
-    "Repeat Password": "重复密码",
-    Backup: "备份",
-    "Import Backup": "导入备份",
-    "Export Backup": "导出备份",
-    Export: "导出",
-    Import: "导入",
-    respTime: "响应时间(毫秒)",
-    notAvailableShort: "N/A",
-    "Default enabled": "默认开启",
-    "Apply on all existing monitors": "应用到所有现有监控项",
-    Create: "创建",
-    "Clear Data": "清除数据",
-    Events: "事件",
-    Heartbeats: "心跳",
-    "Auto Get": "自动获取",
-    backupDescription: "您可以将所有监控项和通知备份到 JSON 文件。",
-    backupDescription2: "注意: 不包括历史状态和事件数据。",
-    backupDescription3: "导出的文件可能包含敏感信息,例如通知的令牌信息,请小心存放!",
-    alertNoFile: "请选择要导入的文件",
-    alertWrongFileType: "请选择一个 JSON 文件",
-    "Clear all statistics": "清除所有统计数据",
-    "Skip existing": "跳过已存在",
-    Overwrite: "覆盖",
-    Options: "选项",
-    "Keep both": "全部保留",
-    "Verify Token": "验证令牌",
-    "Setup 2FA": "设置二次验证",
-    "Enable 2FA": "启用二次验证",
-    "Disable 2FA": "禁用二次验证",
-    "2FA Settings": "二次验证设置",
-    "Two Factor Authentication": "二次验证",
-    Active: "激活",
-    Inactive: "停用",
-    Token: "令牌",
-    "Show URI": "显示 URI",
-    Tags: "标签",
-    "Add New below or Select...": "在下面添加或选择...",
-    "Tag with this name already exist.": "相同名称的标签已存在。",
-    "Tag with this value already exist.": "相同内容的标签已存在。",
-    color: "颜色",
-    "value (optional)": "值(可选)",
-    Gray: "灰色",
-    Red: "红色",
-    Orange: "橙色",
-    Green: "绿色",
-    Blue: "蓝色",
-    Indigo: "靛蓝",
-    Purple: "紫色",
-    Pink: "粉色",
-    "Search...": "搜索...",
-    "Avg. Ping": "平均 Ping",
-    "Avg. Response": "平均响应",
-    "Entry Page": "入口页面",
-    statusPageNothing: "这里什么也没有,请添加一个分组或一个监控项。",
-    "No Services": "无服务",
-    "All Systems Operational": "所有服务运行正常",
-    "Partially Degraded Service": "部分服务出现故障",
-    "Degraded Service": "全部服务出现故障",
-    "Add Group": "添加分组",
-    "Add a monitor": "添加监控项",
-    "Edit Status Page": "编辑状态页面",
-    "Go to Dashboard": "前往仪表盘",
-    "Status Page": "状态页面",
-    "Status Pages": "状态页面",
-    defaultNotificationName: "{notification} 通知({number})",
-    here: "这里",
-    Required: "必填",
-    telegram: "Telegram",
-    "Bot Token": "Bot Token",
-    wayToGetTelegramToken: "您可以从 {0} 获取 Token。",
-    "Chat ID": "Chat ID",
-    supportTelegramChatID: "支持对话/群组/频道的 Chat ID",
-    wayToGetTelegramChatID: "您可以发送一条消息给您的机器人,然后访问此链接来查看 chat_id:",
-    "YOUR BOT TOKEN HERE": "这里替换成您的 BOT TOKEN",
-    chatIDNotFound: "未找到 Chat ID,请先给您的机器人发送一条消息。",
-    webhook: "Webhook",
-    "Post URL": "Post URL",
-    "Content Type": "Content Type",
-    webhookJsonDesc: "{0} 适合现代的 HTTP 服务器,例如 Express.js",
-    webhookFormDataDesc: "{multipart} 适合 PHP,其中 JSON 需要使用 {decodeFunction} 解码",
-    smtp: "电子邮件(SMTP)",
-    secureOptionNone: "无 / STARTTLS(常用端口 25、587)",
-    secureOptionTLS: "TLS(常用端口 465)",
-    "Ignore TLS Error": "忽略 TLS 错误",
-    "From Email": "发信人",
-    emailCustomSubject: "邮件主题",
-    "To Email": "收信人",
-    smtpCC: "抄送",
-    smtpBCC: "密送",
-    discord: "Discord",
-    "Discord Webhook URL": "Discord Webhook URL",
-    wayToGetDiscordURL: "要获取,可以前往服务器设置 -> 整合 -> 创建 Webhook",
-    "Bot Display Name": "机器人显示名称",
-    "Prefix Custom Message": "自定义消息前缀",
-    "Hello @everyone is...": "{'@'}everyone,……",
-    teams: "Microsoft Teams",
-    "Webhook URL": "Webhook URL",
-    wayToGetTeamsURL: "您可以在 {0} 了解如何获取 Webhook URL。",
-    signal: "Signal",
-    Number: "号码",
-    Recipients: "收件人",
-    needSignalAPI: "您需要有一个支持 REST API 的 Signal 客户端。",
-    wayToCheckSignalURL: "您可以通过下面的 URL 了解如何设置:",
-    signalImportant: "重要:您不能混合设定收件人的分组和号码!",
-    gotify: "Gotify",
-    "Application Token": "Application Token",
-    "Server URL": "服务器 URL",
-    Priority: "优先级",
-    slack: "Slack",
-    "Icon Emoji": "Emoji 图标",
-    "Channel Name": "频道名称",
-    "Uptime Kuma URL": "Uptime Kuma URL",
-    aboutWebhooks: "关于 Webhook 的更多信息:{0}",
-    aboutChannelName: "如果您想绕过 Webhook 频道,请在 {0} 字段输入所需的频道名称。例如:#other-channel",
-    aboutKumaURL: "如果保留 Uptime Kuma URL 为空,将会默认指向项目的 GitHub 页面。",
-    emojiCheatSheet: "Emoji 速查:{0}",
-    "rocket.chat": "Rocket.Chat",
-    pushover: "Pushover",
-    pushy: "Pushy",
-    octopush: "Octopush",
-    promosms: "PromoSMS",
-    clicksendsms: "ClickSend SMS",
-    lunasea: "LunaSea",
-    apprise: "Apprise (支持 50+ 种通知服务)",
-    GoogleChat: "Google Chat(仅 Google Workspace)",
-    pushbullet: "Pushbullet",
-    line: "Line Messenger",
-    mattermost: "Mattermost",
-    "User Key": "User Key",
-    Device: "设备",
-    "Message Title": "消息标题",
-    "Notification Sound": "通知铃声",
-    "More info on:": "更多信息:{0}",
-    pushoverDesc1: "紧急优先级(2)会在一小时内每隔 30 秒重试一次。",
-    pushoverDesc2: "如果您想发送通知给不同的设备,请填写“设备”字段。",
-    "SMS Type": "短信类型",
-    octopushTypePremium: "Premium(快 - 推荐用于警报)",
-    octopushTypeLowCost: "Low Cost(慢 - 有时会被运营商屏蔽)",
-    checkPrice: "查看 {0} 的价格:",
-    apiCredentials: "API Credentials",
-    octopushLegacyHint: "您是否在使用旧版本的 Octopush(2011-2020)?",
-    "Check octopush prices": "查看 Octopush 的价格 {0}。",
-    octopushPhoneNumber: "电话号码(国际格式,例如:+33612345678)",
-    octopushSMSSender: "短信发送名称:3-11 位大小写字母、数字和空格(a-zA-Z0-9)",
-    "LunaSea Device ID": "LunaSea 设备 ID",
-    "Apprise URL": "Apprise URL",
-    "Example:": "例如:{0}",
-    "Read more:": "了解更多:{0}",
-    "Status:": "状态:{0}",
-    "Read more": "了解更多",
-    appriseInstalled: "Apprise 已安装",
-    appriseNotInstalled: "Apprise 未安装。{0}",
-    "Access Token": "Access Token",
-    "Channel access token": "频道 Access Token",
-    "Line Developers Console": "Line 开发者控制台",
-    lineDevConsoleTo: "Line 开发者控制台 - {0}",
-    "Basic Settings": "基本设置",
-    "User ID": "用户 ID",
-    "Messaging API": "Messaging API",
-    wayToGetLineChannelToken: "首先访问 {0},创建一个提供者和频道(Messaging API),然后您就可以从上面提到的菜单获取频道的 Access Token 和用户 ID。",
-    "Icon URL": "图标 URL",
-    aboutIconURL: "您可以在“图标 URL”中提供一个图片链接来覆盖默认的资料图片。如果设置了 Emoji 图标则此字段会被忽略。",
-    aboutMattermostChannelName: "您可以覆盖 Webhook 发送消息的默认频道,只需在“频道名称”字段中输入您想要的频道名。这需要在 Mattermost 的 Webhook 设置中启用。例如:#other-channel",
-    matrix: "Matrix",
-    promosmsTypeEco: "SMS ECO - 便宜但是慢,并且容易超负荷。仅限波兰地区的收信人。",
-    promosmsTypeFlash: "SMS FLASH - 消息会自动显示在收信人设备上。仅限波兰地区的收信人。",
-    promosmsTypeFull: "SMS FULL - 高级短信,您可以使用您自己的发信人名称(需要先注册)。对于警报来说更可靠。",
-    promosmsTypeSpeed: "SMS SPEED - 最高优先级。非常快速可靠,但更贵(大约两倍 SMS FULL 的价格)。",
-    promosmsPhoneNumber: "电话号码(波兰地区收信人可以不填区号)",
-    promosmsSMSSender: "短信发信人名称:已注册的名称或以下默认值之一:InfoSMS、SMS Info、MaxSMS、INFO、SMS",
-    "Feishu WebHookUrl": "飞书 WebHook URL",
-    matrixHomeserverURL: "服务器 URL(包含 http(s):// 和可选的端口号)",
-    "Internal Room Id": "内部房间 ID",
-    matrixDesc1: "您可以在 Matrix 客户端房间设置的高级选项内找到内部房间 ID。格式类似于 !QMdRCpUIfLwsfjxye6:home.server。",
-    matrixDesc2: "请不要使用您自己的 Access Token,这将开放您所有的账户权限和您已加入房间的权限。我们强烈建议您创建一个新用户并邀请它至您接收通知的房间中。您可以运行以下命令来获取 Access Token:{0}",
-    Method: "方法",
-    Body: "请求体",
-    Headers: "请求头",
-    PushUrl: "推送 URL",
-    HeadersInvalidFormat: "请求头不是有效的 JSON: ",
-    BodyInvalidFormat: "请求体不是有效的 JSON: ",
-    "Monitor History": "监控历史",
-    clearDataOlderThan: "保留监控历史数据 {0} 天。",
-    PasswordsDoNotMatch: "密码不匹配",
-    records: "记录",
-    "One record": "一条记录",
-    steamApiKeyDescription: "要监控 Steam 游戏服务器,您需要 Steam Web-API 密钥。您可以在这里注册您的 API 密钥: ",
-    "Current User": "当前用户",
-    recent: "最近",
-    Done: "完成",
-    Info: "信息",
-    Security: "安全性",
-    "Steam API Key": "Steam API 密钥",
-    "Shrink Database": "压缩数据库",
-    "Pick a RR-Type...": "选择资源记录类型...",
-    "Pick Accepted Status Codes...": "选择有效的状态码...",
-    Default: "默认",
-    "HTTP Options": "HTTP 选项",
-    "Create Incident": "创建事件",
-    Title: "标题",
-    Content: "内容",
-    Style: "类型",
-    info: "信息",
-    warning: "警告",
-    danger: "危险",
-    primary: "主要",
-    light: "明亮",
-    dark: "黑暗",
-    Post: "发布",
-    "Please input title and content": "请输入标题和内容",
-    Created: "创建时间",
-    "Last Updated": "更新时间",
-    Unpin: "取消钉选",
-    "Switch to Light Theme": "切换到浅色主题",
-    "Switch to Dark Theme": "切换到深色主题",
-    "Show Tags": "显示标签",
-    "Hide Tags": "隐藏标签",
-    Description: "描述",
-    "No monitors available.": "没有可用的监控项。",
-    "Add one": "添加一个",
-    "No Monitors": "没有监控项",
-    "Untitled Group": "无标题分组",
-    Services: "服务",
-    Discard: "放弃",
-    Cancel: "取消",
-    "Powered by": "Powered by",
-    shrinkDatabaseDescription: "触发 SQLite 数据库的 VACUUM 命令,如果您的数据库是在 1.10.0 版本之后创建的,则已启用 AUTO_VACUUM,不再需要此操作。",
-    serwersms: "SerwerSMS.pl",
-    serwersmsAPIUser: "API 用户名(包括 webapi_ 前缀)",
-    serwersmsAPIPassword: "API 密码",
-    serwersmsPhoneNumber: "电话号码",
-    serwersmsSenderName: "SMS 发信人名称(需要在客户中心注册)",
-    stackfield: "Stackfield",
-    smtpDkimSettings: "DKIM 设置",
-    smtpDkimDesc: "请访问 Nodemailer DKIM {0} 了解配置方法。",
-    documentation: "文档",
-    smtpDkimDomain: "域名",
-    smtpDkimKeySelector: "前缀选择器",
-    smtpDkimPrivateKey: "密钥",
-    smtpDkimHashAlgo: "哈希算法(可选)",
-    smtpDkimheaderFieldNames: "包含在哈希计算对象内的 Header 列表(可选)",
-    smtpDkimskipFields: "不包含在哈希计算对象内的 Header 列表(可选)",
-    Feishu: "飞书",
-    AliyunSMS: "阿里云短信服务",
-    "Sms template must contain parameters: ": "短信模板必须包含以下变量:",
-    DingDing: "钉钉自定义机器人",
-    WebHookUrl: "钉钉自定义机器人 Webhook 地址",
-    SecretKey: "钉钉自定义机器人加签密钥",
-    "For safety, must use secret key": "出于安全考虑,必须使用加签密钥",
-    WeCom: "企业微信群机器人",
-    "WeCom Bot Key": "企业微信群机器人 Key",
-    PushByTechulus: "Push by Techulus",
-    gorush: "Gorush",
-    alerta: "Alerta",
-    alertaApiEndpoint: "API 接入点",
-    alertaEnvironment: "环境参数",
-    alertaApiKey: "API Key",
-    alertaAlertState: "报警时的严重性",
-    alertaRecoverState: "恢复后的严重性",
-    deleteStatusPageMsg: "您确认要删除此状态页吗?",
-    Proxies: "代理",
-    default: "默认",
-    enabled: "启用",
-    setAsDefault: "设为默认",
-    deleteProxyMsg: "您确认要在所有监控项中删除此代理吗?",
-    proxyDescription: "代理必须配置到至少一个监控项后才会工作。",
-    enableProxyDescription: "此代理必须启用才能对监控项的网络请求起作用。您可以通过修改激活状态,临时在所有监控项中禁用此代理。",
-    setAsDefaultProxyDescription: "此代理会对新创建的监控项默认激活,您仍可以在监控项配置中单独禁用此代理。",
-    "Proxy Protocol": "代理协议",
-    "Proxy Server": "代理服务器",
-    "Server Address": "服务器地址",
-    "Certificate Chain": "证书链",
-    Valid: "有效",
-    Invalid: "无效",
-    AccessKeyId: "AccessKey ID",
-    SecretAccessKey: "AccessKey Secret",
-    PhoneNumbers: "PhoneNumbers",
-    TemplateCode: "TemplateCode",
-    SignName: "SignName",
-    "Bark Endpoint": "Bark 接入点",
-    "Bark Group": "Bark 群组",
-    "Bark Sound": "Bark 铃声",
-    "Device Token": "Apple Device Token",
-    Platform: "平台",
-    iOS: "iOS",
-    Android: "Android",
-    Huawei: "华为",
-    High: "高",
-    Retry: "重试次数",
-    Topic: "Gorush Topic",
-    "Setup Proxy": "设置代理",
-    "Proxy server has authentication": "代理服务器启用了身份验证功能",
-    User: "用户名",
-    Installed: "已安装",
-    "Not installed": "未安装",
-    Running: "运行中",
-    "Not running": "未运行",
-    "Message:": "信息:",
-    wayToGetCloudflaredURL: "(可从 {0} 下载 cloudflared)",
-    cloudflareWebsite: "Cloudflare 网站",
-    "Don't know how to get the token? Please read the guide:": "不知道如何获取 Token?请阅读指南:",
-    "The current connection may be lost if you are currently connecting via Cloudflare Tunnel. Are you sure want to stop it? Type your current password to confirm it.": "如果您正在通过 Cloudflare Tunnel 访问网站,则停止可能会导致当前连接断开。您确定要停止吗?请输入密码以确认。",
-    "Other Software": "其他软件",
-    "For example: nginx, Apache and Traefik.": "例如:nginx、Apache 和 Traefik。",
-    "Please read": "请阅读",
-    "Remove Token": "移除 Token",
-    Start: "启动",
-    Stop: "停止",
-    "Uptime Kuma": "Uptime Kuma",
-    "Add New Status Page": "添加新的状态页",
-    Slug: "路径",
-    "Accept characters:": "可接受的字符:",
-    startOrEndWithOnly: "开头和结尾必须为 {0}",
-    "No consecutive dashes": "不能有连续的破折号",
-    Next: "下一步",
-    "The slug is already taken. Please choose another slug.": "该路径已被使用。请选择其他路径。",
-    "No Proxy": "无代理",
-    Authentication: "验证",
-    "HTTP Basic Auth": "HTTP 基础身份验证",
-    "New Status Page": "新的状态页",
-    "Page Not Found": "未找到该页面",
-    "Reverse Proxy": "反向代理",
-    "Subject:": "颁发给:",
-    "Valid To:": "有效期至:",
-    "Days Remaining:": "剩余有效天数:",
-    "Issuer:": "颁发者:",
-    "Fingerprint:": "指纹:",
-    "No status pages": "无状态页",
-    "Domain Name Expiry Notification": "域名到期时通知",
-    Proxy: "代理",
-    "Date Created": "创建于",
-    onebotHttpAddress: "OneBot HTTP 地址",
-    onebotMessageType: "OneBot 消息类型",
-    onebotGroupMessage: "群聊",
-    onebotPrivateMessage: "私聊",
-    onebotUserOrGroupId: "群组/用户ID",
-    onebotSafetyTips: "出于安全原因,请务必设置 AccessToken",
-    topic: "Topic",
-    topicExplanation: "MQTT 传递给监控的 Topic",
-    successMessage: "成功时消息",
-    successMessageExplanation: "MQTT 成功时所传递的消息",
-    Customize: "自定义",
-    "Custom Footer": "自定义底部",
-    "Custom CSS": "自定义 CSS",
-    "PushDeer Key": "PushDeer Key",
-    "Footer Text": "底部自定义文本",
-    "Show Powered By": "显示 Powered By",
-    "Domain Names": "域名",
-    "Certificate Expiry Notification": "证书到期时通知",
-    "API Username": "API 凭证 Username",
-    "API Key": "API 凭证 Key",
-    "Recipient Number": "收件人手机号码",
-    "From Name/Number": "发件人名称/手机号码",
-    "Leave blank to use a shared sender number.": "留空以使用平台共享的发件人手机号码",
-    "Octopush API Version": "Octopush API 版本",
-    "Legacy Octopush-DM": "旧版本 Octopush-DM",
-    endpoint: "接入点",
-    octopushAPIKey: "控制台 HTTP API credentials 里的 \"API key\"",
-    octopushLogin: "控制台 HTTP API credentials 里的 \"Login\"",
-    promosmsLogin: "API 登录名",
-    promosmsPassword: "API 密码",
-    "pushoversounds pushover": "Pushover(默认)",
-    "pushoversounds bike": "Bike",
-    "pushoversounds bugle": "Bugle",
-    "pushoversounds cashregister": "Cash Register",
-    "pushoversounds classical": "Classical",
-    "pushoversounds cosmic": "Cosmic",
-    "pushoversounds falling": "Falling",
-    "pushoversounds gamelan": "Gamelan",
-    "pushoversounds incoming": "Incoming",
-    "pushoversounds intermission": "Intermission",
-    "pushoversounds magic": "Magic",
-    "pushoversounds mechanical": "Mechanical",
-    "pushoversounds pianobar": "Piano Bar",
-    "pushoversounds siren": "Siren",
-    "pushoversounds spacealarm": "Space Alarm",
-    "pushoversounds tugboat": "Tug Boat",
-    "pushoversounds alien": "Alien Alarm(长铃声)",
-    "pushoversounds climb": "Climb(长铃声)",
-    "pushoversounds persistent": "Persistent(长铃声)",
-    "pushoversounds echo": "Pushover Echo(长铃声)",
-    "pushoversounds updown": "Up Down(长铃声)",
-    "pushoversounds vibrate": "仅震动",
-    "pushoversounds none": "无(禁音)",
-    pushyAPIKey: "API 密钥",
-    pushyToken: "设备 Token",
-    "Show update if available": "有更新时通知",
-    "Also check beta release": "一并检查 Beta 版更新",
-    "Using a Reverse Proxy?": "正在使用反向代理?",
-    "Check how to config it for WebSocket": "查看如何将反向代理与 WebSocket 一起使用",
-    "Steam Game Server": "Steam 游戏服务器",
-    "Most likely causes:": "最可能的原因:",
-    "The resource is no longer available.": "您所请求的资源已不再可用;",
-    "There might be a typing error in the address.": "您输入的地址可能有误。",
-    "What you can try:": "您可以尝试以下操作:",
-    "Retype the address.": "重新输入地址;",
-    "Go back to the previous page.": "返回到上一页面。",
-    "Coming Soon": "即将推出",
-    wayToGetClickSendSMSToken: "您可以从 {0} 获取 API 凭证 Username 和 凭证 Key。",
-    signedInDisp: "当前用户: {0}",
-    signedInDispDisabled: "已禁用身份验证",
-    dnsPortDescription: "DNS 服务器端口,默认为 53,你可以在任何时候更改此端口.",
-    error: "错误",
-    critical: "关键",
-    wayToGetPagerDutyKey: "你可以在 Service -> Service Directory -> (选择一个 Service) -> Integrations -> Add integration 页面中搜索 \"Events API V2\" 以获取此 Integration Key,更多信息请参见 {0}",
-    "Integration Key": "Integration Key",
-    "Integration URL": "Integration URL",
-    "Auto resolve or acknowledged": "自动标记为已解决或已读",
-    "do nothing": "不做任何操作",
-    "auto acknowledged": "自动标记为已读",
-    "auto resolve": "自动标记为已解决",
-    "Connection String": "连接字符串",
-    Query: "查询语句",
-    settingsCertificateExpiry: "TLS 证书过期通知",
-    certificationExpiryDescription: "HTTPS 监控项发现被监控目标的 TLS 证书剩余有效期少于以下天数时将发出通知:",
-    "ntfy Topic": "ntfy 主题",
-    Domain: "域名",
-    Workstation: "工作站",
-    resendEveryXTimes: "每 {0} 次失败则重复发送一次",
-    resendDisabled: "为 0 时禁用重复发送",
-    "Resend Notification if Down X times consequently": "连续失败时重复发送通知的间隔次数",
-    "HTTP Headers": "HTTP 头",
-    "Trust Proxy": "可信的代理类字段",
-    HomeAssistant: "Home Assistant",
-    RadiusSecret: "Radius 共享机密",
-    RadiusSecretDescription: "客户端和服务器之间共享的密钥",
-    RadiusCalledStationId: "NAS 网络访问服务器号码(Called Station Id)",
-    RadiusCalledStationIdDescription: "所访问的服务器的标识",
-    RadiusCallingStationId: "呼叫方号码(Calling Station Id)",
-    RadiusCallingStationIdDescription: "发出请求的设备的标识",
-    "Setup Docker Host": "配置 Docker 宿主信息",
-    "Connection Type": "连接方式",
-    "Docker Daemon": "Docker 守护进程",
-    deleteDockerHostMsg: "您确定您要删除此 Docker 宿主设置吗?这会影响所有 Docker 监控项",
-    socket: "Socket",
-    tcp: "TCP / HTTP",
-    "Docker Container": "Docker 容器",
-    "Container Name / ID": "容器名称 / ID",
-    "Docker Host": "Docker 宿主",
-    "Docker Hosts": "Docker 宿主",
-    disableCloudflaredNoAuthMsg: "您现在正处于 No Auth 模式,无需输入密码",
-    trustProxyDescription: "信任 'X-Forwarded-*' 头。如果您的 Uptime Kuma 是通过 Nginx 或 Apache 等反代服务对外提供访问的话,则您应当启用本功能以获取正确的客户端 IP。",
-    wayToGetLineNotifyToken: "您可以在 {0} 获取 Access token",
-    Examples: "例如",
-    "Home Assistant URL": "Home Assistant 地址",
-    "Long-Lived Access Token": "长期访问令牌",
-    "Long-Lived Access Token can be created by clicking on your profile name (bottom left) and scrolling to the bottom then click Create Token. ": "长期访问令牌可通过点击左下角您的用户名,滚动到页面底部并点击 Create Token 按钮获取。",
-    "Notification Service": "Notification Service",
-    "default: notify all devices": "默认:通知所有设备",
-    "A list of Notification Services can be found in Home Assistant under \"Developer Tools > Services\" search for \"notification\" to find your device/phone name.": "通知服务的列表可在 Home Assistant 中的 Developer Tools > Services 通过搜索您的设备或手机的名称来获得。",
-    "Automations can optionally be triggered in Home Assistant:": "可以在 Home Assistant 使用下列模板设置自动化操作的触发条件:",
-    "Trigger type:": "触发类型:",
-    "Event type:": "事件类型:",
-    "Event data:": "事件数据:",
-    "Then choose an action, for example switch the scene to where an RGB light is red.": "然后您可以选择关联操作,例如切换到 RGB 灯发出红光的场景",
-    "Frontend Version": "前端版本",
-    "Frontend Version do not match backend version!": "前端版本与后端版本不符!",
-    "Base URL": "API 基础地址",
-    goAlertInfo: "GoAlert 是一个用于呼叫调度、自动汇报和通知(如 SMS 或语音呼叫)的开源应用程序。在正确的时间以正确的方式自动让正确的人参与!{0}",
-    goAlertIntegrationKeyInfo: "使用形如 aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee 的通用 API 集成密钥,通常是复制来的链接中的 token 参数值。",
-    goAlert: "GoAlert",
-    backupOutdatedWarning: "已弃用:由于大量新功能的加入,以及备份功能没有时时维护,现在备份功能已经无法生成完整的备份和恢复完整的设置。",
-    backupRecommend: "请改为直接备份 docker 卷或者数据文件夹(./data/)。",
-    Optional: "可选的",
-    squadcast: "Squadcast",
-    SendKey: "SendKey",
-    "SMSManager API Docs": "SMSManager API 文档在",
-    "Gateway Type": "网关类型",
-    SMSManager: "SMSManager",
-    "You can divide numbers with": "可用的分隔符:",
-    "or": "或",
-};
diff --git a/src/languages/zh-HK.js b/src/languages/zh-HK.js
deleted file mode 100644
index 6a57b4590..000000000
--- a/src/languages/zh-HK.js
+++ /dev/null
@@ -1,388 +0,0 @@
-export default {
-    languageName: "繁體中文 (香港)",
-    Settings: "設定",
-    Dashboard: "主控台",
-    "New Update": "有更新",
-    Language: "語言",
-    Appearance: "外觀",
-    Theme: "主題",
-    General: "一般",
-    Version: "版本",
-    "Check Update On GitHub": "到 Github 查看更新",
-    List: "列表",
-    Add: "新增",
-    "Add New Monitor": "新增監測器",
-    "Quick Stats": "綜合數據",
-    Up: "上線",
-    Down: "離線",
-    Pending: "待定",
-    Unknown: "不明",
-    Pause: "暫停",
-    pauseDashboardHome: "暫停",
-    Name: "名稱",
-    Status: "狀態",
-    DateTime: "日期時間",
-    Message: "內容",
-    "No important events": "沒有重要事件",
-    Resume: "恢復",
-    Edit: "編輯",
-    Delete: "刪除",
-    Current: "目前",
-    Uptime: "上線率",
-    "Cert Exp.": "証書期限",
-    day: "日",
-    "-day": "日",
-    hour: "小時",
-    "-hour": "小時",
-    checkEverySecond: "每 {0} 秒檢查一次",
-    Response: "反應時間",
-    Ping: "反應時間",
-    "Monitor Type": "監測器類型",
-    Keyword: "關鍵字",
-    "Friendly Name": "名稱",
-    URL: "網址 URL",
-    Hostname: "Hostname",
-    Port: "Port",
-    "Heartbeat Interval": "檢查間距",
-    Retries: "重試數次確定為離線",
-    retriesDescription: "重試多少次後才判定為離線及傳送通知。如數值為 0 會即判定為離線及傳送通知。",
-    Advanced: "進階",
-    ignoreTLSError: "忽略 TLS/SSL 錯誤",
-    "Upside Down Mode": "反轉模式",
-    upsideDownModeDescription: "反轉狀態,如網址是可正常瀏覽,會被判定為 '離線/DOWN'",
-    "Max. Redirects": "跟隨重新導向 (Redirect) 的次數",
-    maxRedirectDescription: "設為 0 即不跟蹤",
-    "Accepted Status Codes": "接受為上線的 HTTP 狀態碼",
-    acceptedStatusCodesDescription: "可多選",
-    Save: "儲存",
-    Notifications: "通知",
-    "Not available, please setup.": "無法使用,需要設定",
-    "Setup Notification": "設定通知",
-    Light: "明亮",
-    Dark: "暗黑",
-    Auto: "自動",
-    "Theme - Heartbeat Bar": "監測器列表 狀態條外觀",
-    Normal: "一般",
-    Bottom: "下方",
-    None: "沒有",
-    Timezone: "時區",
-    "Search Engine Visibility": "是否允許搜尋器索引",
-    "Allow indexing": "允許索引",
-    "Discourage search engines from indexing site": "不建議搜尋器索引",
-    "Change Password": "變更密碼",
-    "Current Password": "目前密碼",
-    "New Password": "新密碼",
-    "Repeat New Password": "確認新密碼",
-    passwordNotMatchMsg: "密碼不一致",
-    "Update Password": "更新密碼",
-    "Disable Auth": "取消登入認証",
-    "Enable Auth": "開啟登入認証",
-    "disableauth.message1": "你是否確認<strong>取消登入認証</strong>?",
-    "disableauth.message2": "這個功能是設計給已有<strong>第三方認証</strong>的用家,例如 Cloudflare Access。",
-    "Please use this option carefully!": "請小心使用。",
-    Logout: "登出",
-    notificationDescription: "新增後,你需要在監測器裡啟用。",
-    Leave: "離開",
-    "I understand, please disable": "我明白,請取消登入認証",
-    Confirm: "確認",
-    Yes: "是",
-    No: "否",
-    Username: "帳號",
-    Password: "密碼",
-    "Remember me": "記住我",
-    Login: "登入",
-    "No Monitors, please": "沒有監測器,請",
-    "add one": "新增",
-    "Notification Type": "通知類型",
-    Email: "電郵",
-    Test: "測試",
-    keywordDescription: "搜索 HTML 或 JSON 裡是否有出現關鍵字(注意英文大細階)",
-    "Certificate Info": "憑證詳細資料",
-    deleteMonitorMsg: "是否確定刪除這個監測器?",
-    deleteNotificationMsg: "是否確定刪除這個通知設定?如監測器啟用了這個通知,將會收不到通知。",
-    "Resolver Server": "DNS 伺服器",
-    "Resource Record Type": "DNS 記錄類型",
-    resolverserverDescription: "預設值為 Cloudflare DNS 伺服器,你可以轉用其他 DNS 伺服器。",
-    rrtypeDescription: "請選擇 DNS 記錄類型",
-    pauseMonitorMsg: "是否確定暫停?",
-    "Last Result": "最後結果",
-    "Create your admin account": "建立管理員帳號",
-    "Repeat Password": "重複密碼",
-    respTime: "反應時間 (ms)",
-    notAvailableShort: "N/A",
-    Create: "建立",
-    clearEventsMsg: "是否確定刪除這個監測器的所有事件?",
-    clearHeartbeatsMsg: "是否確定刪除這個監測器的所有脈搏資料?",
-    confirmClearStatisticsMsg: "是否確定刪除所有監測器的脈搏資料?(您的監測器會繼續正常運作)",
-    "Clear Data": "清除資料",
-    Events: "事件",
-    Heartbeats: "脈搏",
-    "Auto Get": "自動獲取",
-    enableDefaultNotificationDescription: "新增監測器時這個通知會預設啟用,當然每個監測器亦可分別控制開關。",
-    "Default enabled": "預設通知",
-    "Also apply to existing monitors": "同時取用至目前所有監測器",
-    Export: "匯出",
-    Import: "匯入",
-    backupDescription: "您可以備份所有監測器及所有通知。",
-    backupDescription2: "註:此備份不包括歷史記錄。",
-    backupDescription3: "此備份可能包含了一些敏感資料如通知裡的 Token,請小心保存備份。",
-    alertNoFile: "請選擇一個檔案",
-    alertWrongFileType: "請選擇 JSON 檔案",
-    twoFAVerifyLabel: "Please type in your token to verify that 2FA is working",
-    tokenValidSettingsMsg: "Token is valid! You can now save the 2FA settings.",
-    confirmEnableTwoFAMsg: "Are you sure you want to enable 2FA?",
-    confirmDisableTwoFAMsg: "Are you sure you want to disable 2FA?",
-    "Apply on all existing monitors": "套用至目前所有監測器",
-    "Verify Token": "驗証 Token",
-    "Setup 2FA": "設定 2FA",
-    "Enable 2FA": "開啟 2FA",
-    "Disable 2FA": "關閉 2FA",
-    "2FA Settings": "2FA 設定",
-    "Two Factor Authentication": "雙重認證",
-    Active: "生效",
-    Inactive: "未生效",
-    Token: "Token",
-    "Show URI": "顯示 URI",
-    "Clear all statistics": "清除所有歷史記錄",
-    retryCheckEverySecond: "Retry every {0} seconds.",
-    importHandleDescription: "Choose 'Skip existing' if you want to skip every monitor or notification with the same name. 'Overwrite' will delete every existing monitor and notification.",
-    confirmImportMsg: "Are you sure to import the backup? Please make sure you've selected the right import option.",
-    "Heartbeat Retry Interval": "Heartbeat Retry Interval",
-    "Import Backup": "匯入備份",
-    "Export Backup": "匯出備份",
-    "Skip existing": "略過已存在的",
-    Overwrite: "覆蓋",
-    Options: "選項",
-    "Keep both": "兩者並存",
-    Tags: "標籤",
-    "Add New below or Select...": "Add New below or Select...",
-    "Tag with this name already exist.": "Tag with this name already exist.",
-    "Tag with this value already exist.": "Tag with this value already exist.",
-    color: "顏色",
-    "value (optional)": "值 (非必需)",
-    Gray: "灰",
-    Red: "紅",
-    Orange: "橙",
-    Green: "綠",
-    Blue: "藍",
-    Indigo: "靛",
-    Purple: "紫",
-    Pink: "粉紅",
-    "Search...": "搜尋...",
-    "Avg. Ping": "平均反應時間",
-    "Avg. Response": "平均反應時間",
-    "Entry Page": "Entry Page",
-    statusPageNothing: "Nothing here, please add a group or a monitor.",
-    "No Services": "沒有服務",
-    "All Systems Operational": "一切正常",
-    "Partially Degraded Service": "部份服務受阻",
-    "Degraded Service": "服務受阻",
-    "Add Group": "新增群組",
-    "Add a monitor": " 新增監測器",
-    "Edit Status Page": "編輯 Status Page",
-    "Go to Dashboard": "前往主控台",
-    "Status Page": "Status Page",
-    "Status Pages": "Status Pages",
-    telegram: "Telegram",
-    webhook: "Webhook",
-    smtp: "電郵 (SMTP)",
-    discord: "Discord",
-    teams: "Microsoft Teams",
-    signal: "Signal",
-    gotify: "Gotify",
-    slack: "Slack",
-    "rocket.chat": "Rocket.chat",
-    pushover: "Pushover",
-    pushy: "Pushy",
-    octopush: "Octopush",
-    promosms: "PromoSMS",
-    lunasea: "LunaSea",
-    apprise: "Apprise (支援 50 多種通知)",
-    pushbullet: "Pushbullet",
-    line: "Line Messenger",
-    mattermost: "Mattermost",
-    deleteStatusPageMsg: "是否確定刪除這個 Status Page?",
-    "Push URL": "推送網址",
-    needPushEvery: "您應每 {0} 秒呼叫此網址。",
-    pushOptionalParams: "選填參數:{0}",
-    defaultNotificationName: "我的 {notification} 通知 ({number})",
-    here: "此處",
-    Required: "必填",
-    "Bot Token": "機器人權杖",
-    wayToGetTelegramToken: "您可以從 {0} 取得 Token。",
-    "Chat ID": "聊天 ID",
-    supportTelegramChatID: "支援 對話/群組/頻道的聊天 ID",
-    wayToGetTelegramChatID: "傳送訊息給機器人,並前往以下網址以取得您的 chat ID:",
-    "YOUR BOT TOKEN HERE": "在此填入您的機器人權杖",
-    chatIDNotFound: "找不到 Chat ID;請先傳送訊息給機器人",
-    "Post URL": "Post 網址",
-    "Content Type": "Content Type",
-    webhookJsonDesc: "{0} 適合任何現代的 HTTP 伺服器,如 Express.js",
-    webhookFormDataDesc: "{multipart} 適合 PHP。 JSON 必須先經由 {decodeFunction} 剖析。",
-    secureOptionNone: "無 / STARTTLS (25, 587)",
-    secureOptionTLS: "TLS (465)",
-    "Ignore TLS Error": "忽略 TLS 錯誤",
-    "From Email": "寄件人",
-    emailCustomSubject: "自訂主旨",
-    "To Email": "收件人",
-    smtpCC: "CC",
-    smtpBCC: "BCC",
-    "Discord Webhook URL": "Discord Webhook 網址",
-    wayToGetDiscordURL: "您可以前往伺服器設定 -> 整合 -> Webhook -> 新 Webhook 以取得",
-    "Bot Display Name": "機器人顯示名稱",
-    "Prefix Custom Message": "前綴自訂訊息",
-    "Webhook URL": "Webhook 網址",
-    wayToGetTeamsURL: "您可以前往此頁面以了解如何建立 Webhook 網址 {0}。",
-    Number: "號碼",
-    Recipients: "收件人",
-    needSignalAPI: "您需要有 REST API 的 Signal 客戶端。",
-    wayToCheckSignalURL: "您可以前往下列網址以了解如何設定:",
-    signalImportant: "注意: 不得混合收件人的群組和號碼!",
-    "Application Token": "應用程式權杖",
-    "Server URL": "伺服器網址",
-    Priority: "優先度",
-    "Icon Emoji": "Emoji 圖示",
-    "Channel Name": "頻道名稱",
-    "Uptime Kuma URL": "Uptime Kuma 網址",
-    aboutWebhooks: "更多關於 Webhook 的資訊: {0}",
-    aboutChannelName: "如果您不想使用 Webhook 頻道,請在 {0} 頻道名稱欄位填入您想使用的頻道。例如: #其他頻道",
-    aboutKumaURL: "如果您未填入 Uptime Kuma 網址。將預設使用專案 Github 頁面。",
-    emojiCheatSheet: "Emoji 一覽表: {0}",
-    PushByTechulus: "Push by Techulus",
-    clicksendsms: "ClickSend SMS",
-    GoogleChat: "Google Chat (僅限 Google Workspace)",
-    "User Key": "使用者金鑰",
-    Device: "裝置",
-    "Message Title": "訊息標題",
-    "Notification Sound": "通知音效",
-    "More info on:": "更多資訊: {0}",
-    pushoverDesc1: "緊急優先度 (2) 的重試間隔為 30 秒並且會在 1 小時後過期。",
-    pushoverDesc2: "如果您想要傳送通知到不同裝置,請填寫裝置欄位。",
-    "SMS Type": "簡訊類型",
-    octopushTypePremium: "Premium (快速 - 建議用於警報)",
-    octopushTypeLowCost: "Low Cost (緩慢 - 有時會被營運商阻擋)",
-    checkPrice: "查看 {0} 價格:",
-    apiCredentials: "API 認證",
-    octopushLegacyHint: "您使用的是舊版的 Octopush (2011-2020) 還是新版?",
-    "Check octopush prices": "查看 octopush 價格 {0}。",
-    octopushPhoneNumber: "電話號碼 (intl 格式,例如:+33612345678) ",
-    octopushSMSSender: "簡訊寄件人名稱:3-11位英數字元及空白 (a-zA-Z0-9)",
-    "LunaSea Device ID": "LunaSea 裝置 ID",
-    "Apprise URL": "Apprise 網址",
-    "Example:": "範例:{0}",
-    "Read more:": "深入瞭解:{0}",
-    "Status:": "狀態:{0}",
-    "Read more": "深入瞭解",
-    appriseInstalled: "已安裝 Apprise。",
-    appriseNotInstalled: "尚未安裝 Apprise。{0}",
-    "Access Token": "存取權杖",
-    "Channel access token": "頻道存取權杖",
-    "Line Developers Console": "Line 開發者控制台",
-    lineDevConsoleTo: "Line 開發者控制台 - {0}",
-    "Basic Settings": "基本設定",
-    "User ID": "使用者 ID",
-    "Messaging API": "Messaging API",
-    wayToGetLineChannelToken: "首先,前往 {0},建立 provider 和 channel (Messaging API)。接著您就可以從上面提到的選單項目中取得頻道存取權杖及使用者 ID。",
-    "Icon URL": "圖示網址",
-    aboutIconURL: "您可以在 \"圖示網址\" 中提供圖片網址以覆蓋預設個人檔案圖片。若已設定 Emoji 圖示,將忽略此設定。",
-    aboutMattermostChannelName: "您可以在 \"頻道名稱\" 欄位中填寫頻道名稱以覆蓋 Webhook 的預設頻道。必須在 Mattermost 的 Webhook 設定中啟用。例如:#其他頻道",
-    matrix: "Matrix",
-    promosmsTypeEco: "SMS ECO - 便宜,但是很慢且經常過載。僅限位於波蘭的收件人。",
-    promosmsTypeFlash: "SMS FLASH - 訊息會自動在收件人的裝置上顯示。僅限位於波蘭的收件人。",
-    promosmsTypeFull: "SMS FULL - 高級版,您可以使用您的寄件人名稱 (必須先註冊名稱。對於警報來說十分可靠。",
-    promosmsTypeSpeed: "SMS SPEED - 系統中的最高優先度。快速、可靠,但昂貴 (約 SMS FULL 的兩倍價格)。",
-    promosmsPhoneNumber: "電話號碼 (若收件人位於波蘭則無需輸入區域代碼)",
-    promosmsSMSSender: "簡訊寄件人名稱:預先註冊的名稱或以下的預設名稱:InfoSMS、SMS Info、MaxSMS、INFO、SMS",
-    "Feishu WebHookUrl": "飛書 WebHook 網址",
-    matrixHomeserverURL: "Homeserver 網址 (開頭為 http(s)://,結尾可能帶連接埠)",
-    "Internal Room Id": "Internal Room ID",
-    matrixDesc1: "您可以在 Matrix 客戶端的房間設定中的進階選項找到 internal room ID。應該看起來像 !QMdRCpUIfLwsfjxye6:home.server。",
-    matrixDesc2: "使用您自己的 Matrix 使用者存取權杖將賦予存取您的帳號和您加入的房間的完整權限。建議建立新使用者,並邀請至您想要接收通知的房間中。您可以執行 {0} 以取得存取權杖",
-    Method: "方法",
-    Body: "主體",
-    Headers: "標頭",
-    PushUrl: "Push URL",
-    HeadersInvalidFormat: "要求標頭不是有效的 JSON:",
-    BodyInvalidFormat: "請求主體不是有效的 JSON:",
-    "Monitor History": "監測器歷史紀錄",
-    clearDataOlderThan: "保留 {0} 天內的監測器歷史紀錄。",
-    PasswordsDoNotMatch: "密碼不相符。",
-    records: "記錄",
-    "One record": "一項記錄",
-    "Showing {from} to {to} of {count} records": "正在顯示 {count} 項記錄中的 {from} 至 {to} 項",
-    steamApiKeyDescription: "若要監測 Steam 遊戲伺服器,您將需要 Steam Web-API 金鑰。您可以在此註冊您的 API 金鑰:",
-    "Current User": "目前使用者",
-    recent: "最近",
-    Done: "完成",
-    Info: "資訊",
-    Security: "安全性",
-    "Steam API Key": "Steam API 金鑰",
-    "Shrink Database": "壓縮資料庫",
-    "Pick a RR-Type...": "選擇資源記錄類型...",
-    "Pick Accepted Status Codes...": "選擇可接受的狀態碼...",
-    Default: "預設",
-    "HTTP Options": "HTTP 選項",
-    "Create Incident": "建立事件",
-    Title: "標題",
-    Content: "內容",
-    Style: "樣式",
-    info: "資訊",
-    warning: "警告",
-    danger: "危險",
-    primary: "主要",
-    light: "淺色",
-    dark: "暗色",
-    Post: "發佈",
-    "Please input title and content": "請輸入標題及內容",
-    Created: "建立",
-    "Last Updated": "最後更新",
-    Unpin: "取消釘選",
-    "Switch to Light Theme": "切換至淺色佈景主題",
-    "Switch to Dark Theme": "切換至深色佈景主題",
-    "Show Tags": "顯示標籤",
-    "Hide Tags": "隱藏標籤",
-    Description: "描述",
-    "No monitors available.": "沒有可用的監測器。",
-    "Add one": "新增一個",
-    "No Monitors": "無監測器",
-    "Untitled Group": "未命名群組",
-    Services: "服務",
-    Discard: "捨棄",
-    Cancel: "取消",
-    shrinkDatabaseDescription: "觸發 SQLite 的資料庫清理 (VACUUM)。如果您的資料庫是在 1.10.0 版本後建立,AUTO_VACUUM 已自動啟用,則無需此操作。",
-    serwersms: "SerwerSMS.pl",
-    serwersmsAPIUser: "API 使用者名稱 (包括 webapi_ 前綴)",
-    serwersmsAPIPassword: "API 密碼",
-    serwersmsPhoneNumber: "電話號碼",
-    serwersmsSenderName: "SMS 寄件人名稱 (由客戶入口網站註冊)",
-    stackfield: "Stackfield",
-    smtpDkimSettings: "DKIM 設定",
-    smtpDkimDesc: "請參考 Nodemailer DKIM {0} 使用方式。",
-    documentation: "文件",
-    smtpDkimDomain: "網域名稱",
-    smtpDkimKeySelector: "DKIM 選取器",
-    smtpDkimPrivateKey: "私密金鑰",
-    smtpDkimHashAlgo: "雜湊演算法 (選填)",
-    smtpDkimheaderFieldNames: "要簽署的郵件標頭 (選填)",
-    smtpDkimskipFields: "不簽署的郵件標頭 (選填)",
-    gorush: "Gorush",
-    alerta: "Alerta",
-    alertaApiEndpoint: "API Endpoint",
-    alertaEnvironment: "環境",
-    alertaApiKey: "API 金鑰",
-    alertaAlertState: "警示狀態",
-    alertaRecoverState: "恢復狀態",
-    Proxies: "代理伺服器",
-    default: "預設",
-    enabled: "啟用",
-    setAsDefault: "設為預設",
-    deleteProxyMsg: "您確定要為所有監測器刪除此代理伺服器嗎?",
-    proxyDescription: "必須將代理伺服器指派給監測器才能運作。",
-    enableProxyDescription: "此代理伺服器在啟用前不會在監測器上生效,您可以藉由控制啟用狀態來暫時對所有的監測器停用代理伺服器。",
-    setAsDefaultProxyDescription: "預設情況下,新監測器將啟用此代理伺服器。您仍可分別停用各監測器的代理伺服器。",
-    Maintenance: "維護",
-    statusMaintenance: "維護中",
-    "Enable DNS Cache": "啟用 DNS 快取",
-    "Enable": "啟用",
-    "Disable": "停用",
-};
diff --git a/src/languages/zh-TW.js b/src/languages/zh-TW.js
deleted file mode 100644
index 5f7bfb6e8..000000000
--- a/src/languages/zh-TW.js
+++ /dev/null
@@ -1,634 +0,0 @@
-export default {
-    languageName: "繁體中文 (台灣)",
-    checkEverySecond: "每 {0} 秒檢查一次",
-    retryCheckEverySecond: "每 {0} 秒重試一次",
-    resendEveryXTimes: "每 {0} 次便重新傳送",
-    resendDisabled: "重新傳送已停用",
-    retriesDescription: "在服務被標記為離線並傳送通知前的最大重試次數",
-    ignoreTLSError: "忽略 HTTPS 網站的 TLS/SSL 錯誤",
-    upsideDownModeDescription: "反轉顯示狀態。若服務可以連線,將顯示離線。",
-    maxRedirectDescription: "最大重新導向跟隨次數。設為 0 將停用重新導向。",
-    acceptedStatusCodesDescription: "選擇視為成功回應的狀態碼。",
-    Maintenance: "維護",
-    statusMaintenance: "維護",
-    "Schedule maintenance": "排程維護",
-    "Affected Monitors": "受影響的監測器",
-    "Pick Affected Monitors...": "挑選受影響的監測器...",
-    "Start of maintenance": "維護起始",
-    "All Status Pages": "所有狀態頁",
-    "Select status pages...": "選擇狀態頁...",
-    recurringIntervalMessage: "每日執行 | 每 {0} 天執行",
-    affectedMonitorsDescription: "選擇受目前維護影響的監測器",
-    affectedStatusPages: "在已選取的狀態頁中顯示此維護訊息",
-    atLeastOneMonitor: "至少選擇一個受影響的監測器",
-    passwordNotMatchMsg: "密碼不相符。",
-    notificationDescription: "必須將通知指派給監測器才能運作。",
-    keywordDescription: "HTML 或 JSON 回應的搜尋關鍵字。區分大小寫。",
-    pauseDashboardHome: "暫停",
-    deleteMonitorMsg: "您確定要刪除此監測器嗎?",
-    deleteMaintenanceMsg: "您確定要刪除此維護嗎?",
-    deleteNotificationMsg: "您確定要為所有監測器刪除此通知嗎?",
-    dnsPortDescription: "DNS 伺服器連接埠。預設為 53。您可以隨時變更連接埠。",
-    resolverserverDescription: "Cloudflare 為預設伺服器。您可以隨時更換解析伺服器。",
-    rrtypeDescription: "選擇您想要監測的資源記錄類型",
-    pauseMonitorMsg: "您確定要暫停嗎?",
-    enableDefaultNotificationDescription: "預設情況下,新監測器將啟用此通知。您仍可分別停用各監測器的通知。",
-    clearEventsMsg: "您確定要刪除此監測器的所有事件嗎?",
-    clearHeartbeatsMsg: "您確定要刪除此監測器的所有心跳嗎?",
-    confirmClearStatisticsMsg: "您確定要刪除所有統計資料嗎?",
-    importHandleDescription: "若您想跳過所有相同名稱的監測器或通知,請選擇 '略過現有'。選擇 '覆寫' 將刪除所有現有的監測器及通知。",
-    confirmImportMsg: "您確定要匯入備份嗎?請確認是否選擇正確的匯入設定。",
-    twoFAVerifyLabel: "請輸入權杖以驗證雙步驟驗證:",
-    tokenValidSettingsMsg: "權杖有效!您可以儲存雙步驟驗證設定了。",
-    confirmEnableTwoFAMsg: "您確定要啟用雙步驟驗證嗎?",
-    confirmDisableTwoFAMsg: "您確定要停用雙步驟驗證嗎?",
-    Settings: "設定",
-    Dashboard: "儀表板",
-    "New Update": "新版本",
-    Language: "語言",
-    Appearance: "外觀",
-    Theme: "主題",
-    General: "一般",
-    "Primary Base URL": "主要基底網址",
-    Version: "版本",
-    "Check Update On GitHub": "在 GitHub 檢查更新",
-    List: "清單",
-    Add: "新增",
-    "Add New Monitor": "新增監測器",
-    "Quick Stats": "狀態概覽",
-    Up: "正常",
-    Down: "離線",
-    Pending: "等待中",
-    Unknown: "未知",
-    Pause: "暫停",
-    Name: "名稱",
-    Status: "狀態",
-    DateTime: "日期時間",
-    Message: "訊息",
-    "No important events": "無重要事件",
-    Resume: "繼續",
-    Edit: "編輯",
-    Delete: "刪除",
-    Current: "目前",
-    Uptime: "運作率",
-    "Cert Exp.": "憑證期限",
-    day: "天",
-    "-day": "天",
-    hour: "小時",
-    "-hour": "小時",
-    Response: "回應",
-    Ping: "Ping",
-    "Monitor Type": "監測器類型",
-    Keyword: "關鍵字",
-    "Friendly Name": "易記名稱",
-    URL: "網址",
-    Hostname: "主機名稱",
-    Port: "連接埠",
-    "Heartbeat Interval": "心跳間隔",
-    Retries: "重試次數",
-    "Heartbeat Retry Interval": "心跳重試間隔",
-    "Resend Notification if Down X times consequently": "若 X 次心跳皆離線,重新傳送通知",
-    Advanced: "進階",
-    "Upside Down Mode": "顛倒模式",
-    "Max. Redirects": "最大重新導向次數",
-    "Accepted Status Codes": "可接受的狀態碼",
-    "Push URL": "推送網址",
-    needPushEvery: "您應每 {0} 秒呼叫此網址。",
-    pushOptionalParams: "選填參數:{0}",
-    Save: "儲存",
-    Notifications: "通知",
-    "Not available, please setup.": "無法使用,請先設定。",
-    "Setup Notification": "設定通知",
-    Light: "亮色",
-    Dark: "深色",
-    Auto: "自動",
-    "Theme - Heartbeat Bar": "主題 - 心跳條",
-    Normal: "正常",
-    Bottom: "下方",
-    None: "無",
-    Timezone: "時區",
-    "Search Engine Visibility": "搜尋引擎可見度",
-    "Allow indexing": "允許索引",
-    "Discourage search engines from indexing site": "不建議搜尋引擎索引網頁",
-    "Change Password": "修改密碼",
-    "Current Password": "目前密碼",
-    "New Password": "新密碼",
-    "Repeat New Password": "確認新密碼",
-    "Update Password": "更新密碼",
-    "Disable Auth": "停用驗證",
-    "Enable Auth": "啟用驗證",
-    "disableauth.message1": ">你是否要<strong>取消登入驗證</strong>?",
-    "disableauth.message2": "此功能是設計給已有<strong>第三方認證</strong>的使用者,例如 Cloudflare Access。",
-    "Please use this option carefully!": "請謹慎使用。",
-    Logout: "登出",
-    Leave: "離開",
-    "I understand, please disable": "我了解了,請停用",
-    Confirm: "確認",
-    Yes: "是",
-    No: "否",
-    Username: "使用者名稱",
-    Password: "密碼",
-    "Remember me": "記住我",
-    Login: "登入",
-    "No Monitors, please": "沒有監測器,請",
-    "add one": "新增",
-    "Notification Type": "通知類型",
-    Email: "電子郵件",
-    Test: "測試",
-    "Certificate Info": "憑證資訊",
-    "Resolver Server": "解析伺服器",
-    "Resource Record Type": "資源記錄類型",
-    "Last Result": "最後結果",
-    "Create your admin account": "建立您的管理員帳號",
-    "Repeat Password": "確認密碼",
-    "Import Backup": "匯入備份",
-    "Export Backup": "匯出備份",
-    Export: "匯出",
-    Import: "匯入",
-    respTime: "回應時間 (毫秒)",
-    notAvailableShort: "N/A",
-    "Default enabled": "啟用預設",
-    "Apply on all existing monitors": "套用到目前所有的監測器",
-    Create: "建立",
-    "Clear Data": "清除資料",
-    Events: "活動",
-    Heartbeats: "心跳",
-    "Auto Get": "自動取得",
-    backupDescription: "您可以將所有監測器及通知備份成一個 JSON 檔案。",
-    backupDescription2: "提醒:不包含歷史紀錄及活動紀錄。",
-    backupDescription3: "如通知權杖等機密資料也會一同匯出。請妥善保存。",
-    alertNoFile: "請選擇要匯入的檔案。",
-    alertWrongFileType: "請選擇 JSON 檔案。",
-    "Clear all statistics": "清除所有統計資料",
-    "Skip existing": "略過現有",
-    Overwrite: "覆寫",
-    Options: "選項",
-    "Keep both": "保留兩者",
-    "Verify Token": "認證權杖",
-    "Setup 2FA": "設置雙步驟驗證",
-    "Enable 2FA": "啟用雙步驟驗證",
-    "Disable 2FA": "停用雙步驟驗證",
-    "2FA Settings": "雙步驟驗證設定",
-    "Two Factor Authentication": "雙步驟驗證",
-    Active: "啟用",
-    Inactive: "停用",
-    Token: "權杖",
-    "Show URI": "顯示 URI",
-    Tags: "標籤",
-    "Add New below or Select...": "在下方新增或選取...",
-    "Tag with this name already exist.": "已存在相同名稱的標籤。",
-    "Tag with this value already exist.": "已存在相同數值的標籤。",
-    color: "顏色",
-    "value (optional)": "數值 (選填)",
-    Gray: "灰色",
-    Red: "紅色",
-    Orange: "橘色",
-    Green: "綠色",
-    Blue: "藍色",
-    Indigo: "靛色",
-    Purple: "紫色",
-    Pink: "粉色",
-    "Search...": "搜尋...",
-    "Avg. Ping": "平均 Ping",
-    "Avg. Response": "平均回應",
-    "Entry Page": "入口頁面",
-    statusPageNothing: "空空如也,請新增群組或監測器。",
-    "No Services": "無服務",
-    "All Systems Operational": "所有系統正常運作",
-    "Partially Degraded Service": "部分服務效能降低",
-    "Degraded Service": "服務效能降低",
-    "Add Group": "新增群組",
-    "Add a monitor": "加入監測器",
-    "Edit Status Page": "編輯狀態頁",
-    "Go to Dashboard": "前往儀表板",
-    "Status Page": "狀態頁",
-    "Status Pages": "狀態頁",
-    defaultNotificationName: "我的 {notification} 通知 ({number})",
-    here: "此處",
-    Required: "必填",
-    telegram: "Telegram",
-    "Bot Token": "機器人權杖",
-    wayToGetTelegramToken: "您可以從 {0} 取得權杖。",
-    "Chat ID": "聊天 ID",
-    supportTelegramChatID: "支援 對話/群組/頻道的聊天 ID",
-    wayToGetTelegramChatID: "傳送訊息給機器人,並前往以下網址以取得您的 chat ID:",
-    "YOUR BOT TOKEN HERE": "在此填入您的機器人權杖",
-    chatIDNotFound: "找不到 Chat ID;請先傳送訊息給機器人",
-    webhook: "Webhook",
-    "Post URL": "Post 網址",
-    "Content Type": "內容類型",
-    webhookJsonDesc: "{0} 適合任何現代的 HTTP 伺服器,如 Express.js",
-    webhookFormDataDesc: "{multipart} 適合 PHP。 JSON 必須先經由 {decodeFunction} 剖析。",
-    smtp: "Email (SMTP)",
-    secureOptionNone: "無 / STARTTLS (25, 587)",
-    secureOptionTLS: "TLS (465)",
-    "Ignore TLS Error": "忽略 TLS 錯誤",
-    "From Email": "寄件人",
-    emailCustomSubject: "自訂主旨",
-    "To Email": "收件人",
-    smtpCC: "CC",
-    smtpBCC: "BCC",
-    discord: "Discord",
-    "Discord Webhook URL": "Discord Webhook 網址",
-    wayToGetDiscordURL: "您可以前往伺服器設定 -> 整合 -> Webhook -> 新 Webhook 以取得",
-    "Bot Display Name": "機器人顯示名稱",
-    "Prefix Custom Message": "前綴自訂訊息",
-    "Hello @everyone is...": "Hello {'@'}everyone is...",
-    teams: "Microsoft Teams",
-    "Webhook URL": "Webhook 網址",
-    wayToGetTeamsURL: "您可以前往此頁面以了解如何建立 Webhook 網址 {0}。",
-    signal: "Signal",
-    Number: "號碼",
-    Recipients: "收件人",
-    needSignalAPI: "您需要有 REST API 的 Signal 客戶端。",
-    wayToCheckSignalURL: "您可以前往下列網址以了解如何設定:",
-    signalImportant: "注意: 不得混合收件人的群組和號碼!",
-    gotify: "Gotify",
-    "Application Token": "應用程式權杖",
-    "Server URL": "伺服器網址",
-    Priority: "優先度",
-    slack: "Slack",
-    "Icon Emoji": "Emoji 圖示",
-    "Channel Name": "頻道名稱",
-    "Uptime Kuma URL": "Uptime Kuma 網址",
-    aboutWebhooks: "更多關於 Webhook 的資訊: {0}",
-    aboutChannelName: "如果您不想使用 Webhook 頻道,請在 {0} 頻道名稱欄位填入您想使用的頻道。例如: #其他頻道",
-    aboutKumaURL: "如果您未填入 Uptime Kuma 網址。將預設使用專案 Github 頁面。",
-    emojiCheatSheet: "Emoji 一覽表: {0}",
-    "rocket.chat": "Rocket.Chat",
-    pushover: "Pushover",
-    pushy: "Pushy",
-    PushByTechulus: "Push by Techulus",
-    octopush: "Octopush",
-    promosms: "PromoSMS",
-    clicksendsms: "ClickSend SMS",
-    lunasea: "LunaSea",
-    apprise: "Apprise (支援 50 種以上的通知服務)",
-    GoogleChat: "Google Chat (僅限 Google Workspace)",
-    pushbullet: "Pushbullet",
-    line: "Line Messenger",
-    mattermost: "Mattermost",
-    "User Key": "使用者金鑰",
-    Device: "裝置",
-    "Message Title": "訊息標題",
-    "Notification Sound": "通知音效",
-    "More info on:": "更多資訊: {0}",
-    pushoverDesc1: "緊急優先度 (2) 的重試間隔為 30 秒並且會在 1 小時後過期。",
-    pushoverDesc2: "如果您想要傳送通知到不同裝置,請填寫裝置欄位。",
-    "SMS Type": "簡訊類型",
-    octopushTypePremium: "Premium (快速 - 建議用於警報)",
-    octopushTypeLowCost: "Low Cost (緩慢 - 有時會被營運商阻擋)",
-    checkPrice: "查看 {0} 價格:",
-    apiCredentials: "API 認證",
-    octopushLegacyHint: "您使用的是舊版的 Octopush (2011-2020) 還是新版?",
-    "Check octopush prices": "查看 octopush 價格 {0}。",
-    octopushPhoneNumber: "電話號碼 (intl 格式,例如:+33612345678) ",
-    octopushSMSSender: "簡訊寄件人名稱:3-11位英數字元及空白 (a-zA-Z0-9)",
-    "LunaSea Device ID": "LunaSea 裝置 ID",
-    "Apprise URL": "Apprise 網址",
-    "Example:": "範例:{0}",
-    "Read more:": "深入瞭解:{0}",
-    "Status:": "狀態:{0}",
-    "Read more": "深入瞭解",
-    appriseInstalled: "已安裝 Apprise。",
-    appriseNotInstalled: "尚未安裝 Apprise。{0}",
-    "Access Token": "存取權杖",
-    "Channel access token": "頻道存取權杖",
-    "Line Developers Console": "Line 開發者控制台",
-    lineDevConsoleTo: "Line 開發者控制台 - {0}",
-    "Basic Settings": "基本設定",
-    "User ID": "使用者 ID",
-    "Messaging API": "Messaging API",
-    wayToGetLineChannelToken: "首先,前往 {0},建立 provider 和 channel (Messaging API)。接著您就可以從上面提到的選單項目中取得頻道存取權杖及使用者 ID。",
-    "Icon URL": "圖示網址",
-    aboutIconURL: "您可以在 \"圖示網址\" 中提供圖片網址以覆蓋預設個人檔案圖片。若已設定 Emoji 圖示,將忽略此設定。",
-    aboutMattermostChannelName: "您可以在 \"頻道名稱\" 欄位中填寫頻道名稱以覆蓋 Webhook 的預設頻道。必須在 Mattermost 的 Webhook 設定中啟用。例如:#其他頻道",
-    matrix: "Matrix",
-    promosmsTypeEco: "SMS ECO - 便宜,但是很慢且經常過載。僅限位於波蘭的收件人。",
-    promosmsTypeFlash: "SMS FLASH - 訊息會自動在收件人的裝置上顯示。僅限位於波蘭的收件人。",
-    promosmsTypeFull: "SMS FULL - 高級版,您可以使用您的寄件人名稱 (必須先註冊名稱。對於警報來說十分可靠。",
-    promosmsTypeSpeed: "SMS SPEED - 系統中的最高優先度。快速、可靠,但昂貴 (約 SMS FULL 的兩倍價格)。",
-    promosmsPhoneNumber: "電話號碼 (若收件人位於波蘭則無需輸入區域代碼)",
-    promosmsSMSSender: "簡訊寄件人名稱:預先註冊的名稱或以下的預設名稱:InfoSMS、SMS Info、MaxSMS、INFO、SMS",
-    "Feishu WebHookUrl": "飛書 WebHook 網址",
-    matrixHomeserverURL: "Homeserver 網址 (開頭為 http(s)://,結尾可能帶連接埠)",
-    "Internal Room Id": "Internal Room ID",
-    matrixDesc1: "您可以在 Matrix 客戶端的房間設定中的進階選項找到 internal room ID。應該看起來像 !QMdRCpUIfLwsfjxye6:home.server。",
-    matrixDesc2: "使用您自己的 Matrix 使用者存取權杖將賦予存取您的帳號和您加入的房間的完整權限。建議建立新使用者,並邀請至您想要接收通知的房間中。您可以執行 {0} 以取得存取權杖",
-    Method: "方法",
-    Body: "主體",
-    Headers: "標頭",
-    PushUrl: "Push 網址",
-    HeadersInvalidFormat: "要求標頭不是有效的 JSON:",
-    BodyInvalidFormat: "請求主體不是有效的 JSON:",
-    "Monitor History": "監測器歷史紀錄",
-    clearDataOlderThan: "保留 {0} 天內的監測器歷史紀錄。",
-    PasswordsDoNotMatch: "密碼不相符。",
-    records: "記錄",
-    "One record": "一項記錄",
-    steamApiKeyDescription: "若要監測 Steam 遊戲伺服器,您將需要 Steam Web-API 金鑰。您可以在此註冊您的 API 金鑰:",
-    "Current User": "目前使用者",
-    topic: "Topic",
-    topicExplanation: "要監測的 MQTT Topic",
-    successMessage: "成功訊息",
-    successMessageExplanation: "視為成功的 MQTT 訊息",
-    recent: "最近",
-    Done: "完成",
-    Info: "資訊",
-    Security: "安全性",
-    "Steam API Key": "Steam API 金鑰",
-    "Shrink Database": "壓縮資料庫",
-    "Pick a RR-Type...": "選擇資源記錄類型...",
-    "Pick Accepted Status Codes...": "選擇可接受的狀態碼...",
-    Default: "預設",
-    "HTTP Options": "HTTP 選項",
-    "Create Incident": "建立事件",
-    Title: "標題",
-    Content: "內容",
-    Style: "樣式",
-    info: "資訊",
-    warning: "警告",
-    danger: "危險",
-    error: "錯誤",
-    critical: "嚴重",
-    primary: "主要",
-    light: "淺色",
-    dark: "暗色",
-    Post: "發佈",
-    "Please input title and content": "請輸入標題及內容",
-    Created: "建立",
-    "Last Updated": "最後更新",
-    Unpin: "取消釘選",
-    "Switch to Light Theme": "切換至淺色佈景主題",
-    "Switch to Dark Theme": "切換至深色佈景主題",
-    "Show Tags": "顯示標籤",
-    "Hide Tags": "隱藏標籤",
-    Description: "說明",
-    "No monitors available.": "沒有可用的監測器。",
-    "Add one": "新增一個",
-    "No Monitors": "無監測器",
-    "Untitled Group": "未命名群組",
-    Services: "服務",
-    Discard: "捨棄",
-    Cancel: "取消",
-    "Powered by": "技術支援",
-    shrinkDatabaseDescription: "觸發 SQLite 的資料庫清理 (VACUUM)。如果您的資料庫是在 1.10.0 版本後建立,AUTO_VACUUM 已自動啟用,則無需此操作。",
-    serwersms: "SerwerSMS.pl",
-    serwersmsAPIUser: "API 使用者名稱 (包括 webapi_ 前綴)",
-    serwersmsAPIPassword: "API 密碼",
-    serwersmsPhoneNumber: "電話號碼",
-    serwersmsSenderName: "SMS 寄件人名稱 (由客戶入口網站註冊)",
-    stackfield: "Stackfield",
-    Customize: "自訂",
-    "Custom Footer": "自訂頁尾",
-    "Custom CSS": "自訂 CSS",
-    smtpDkimSettings: "DKIM 設定",
-    smtpDkimDesc: "請參考 Nodemailer DKIM {0} 使用方式。",
-    documentation: "文件",
-    smtpDkimDomain: "網域名稱",
-    smtpDkimKeySelector: "DKIM 選取器",
-    smtpDkimPrivateKey: "私密金鑰",
-    smtpDkimHashAlgo: "雜湊演算法 (選填)",
-    smtpDkimheaderFieldNames: "要簽署的郵件標頭 (選填)",
-    smtpDkimskipFields: "不簽署的郵件標頭 (選填)",
-    wayToGetPagerDutyKey: "您可以前往服務 -> 服務目錄 -> (選取服務) -> 整合 -> 新增整合以取得。您可以搜尋 \"Events API V2\"。詳細資訊 {0}",
-    "Integration Key": "整合金鑰",
-    "Integration URL": "整合網址",
-    "Auto resolve or acknowledged": "自動解決或認可",
-    "do nothing": "不進行任何操作",
-    "auto acknowledged": "自動認可",
-    "auto resolve": "自動解決",
-    gorush: "Gorush",
-    alerta: "Alerta",
-    alertaApiEndpoint: "API 端點",
-    alertaEnvironment: "環境",
-    alertaApiKey: "API 金鑰",
-    alertaAlertState: "警示狀態",
-    alertaRecoverState: "恢復狀態",
-    deleteStatusPageMsg: "您確定要刪除此狀態頁嗎?",
-    Proxies: "代理伺服器",
-    default: "預設",
-    enabled: "啟用",
-    setAsDefault: "設為預設",
-    deleteProxyMsg: "您確定要為所有監測器刪除此代理伺服器嗎?",
-    proxyDescription: "必須將代理伺服器指派給監測器才能運作。",
-    enableProxyDescription: "此代理伺服器在啟用前不會在監測器上生效,您可以藉由控制啟用狀態來暫時對所有的監測器停用代理伺服器。",
-    setAsDefaultProxyDescription: "預設情況下,新監測器將啟用此代理伺服器。您仍可分別停用各監測器的代理伺服器。",
-    "Certificate Chain": "憑證鏈結",
-    Valid: "有效",
-    Invalid: "無效",
-    AccessKeyId: "AccessKey ID",
-    SecretAccessKey: "AccessKey 密碼",
-    PhoneNumbers: "PhoneNumbers",
-    TemplateCode: "TemplateCode",
-    SignName: "SignName",
-    "Sms template must contain parameters: ": "Sms 範本必須包含參數:",
-    "Bark Endpoint": "Bark 端點",
-    "Bark Group": "Bark 群組",
-    "Bark Sound": "Bark 鈴聲",
-    WebHookUrl: "WebHookUrl",
-    SecretKey: "SecretKey",
-    "For safety, must use secret key": "為了安全起見,必須使用秘密金鑰",
-    "Device Token": "裝置權杖",
-    Platform: "平台",
-    iOS: "iOS",
-    Android: "Android",
-    Huawei: "華為",
-    High: "高",
-    Retry: "重試",
-    Topic: "Topic",
-    "WeCom Bot Key": "WeCom 機器人金鑰",
-    "Setup Proxy": "設置 Proxy",
-    "Proxy Protocol": "Proxy 通訊協定",
-    "Proxy Server": "Proxy 伺服器",
-    "Proxy server has authentication": "Proxy 伺服器啟用了驗證功能",
-    User: "使用者",
-    Installed: "已安裝",
-    "Not installed": "未安裝",
-    Running: "執行中",
-    "Not running": "未執行",
-    "Remove Token": "移除權杖",
-    Start: "開始",
-    Stop: "停止",
-    "Uptime Kuma": "Uptime Kuma",
-    "Add New Status Page": "新增狀態頁",
-    Slug: "Slug",
-    "Accept characters:": "可用字元:",
-    startOrEndWithOnly: "僅能使用 {0} 開頭或結尾",
-    "No consecutive dashes": "不得連續使用破折號",
-    Next: "下一步",
-    "The slug is already taken. Please choose another slug.": "此 slug 已被使用。請選擇其他 slug。",
-    "No Proxy": "無 Proxy",
-    Authentication: "驗證",
-    "HTTP Basic Auth": "HTTP 基本驗證",
-    "New Status Page": "新狀態頁",
-    "Page Not Found": "找不到頁面",
-    "Reverse Proxy": "反向代理",
-    Backup: "備份",
-    About: "關於",
-    wayToGetCloudflaredURL: "(從 {0} 下載 cloudflared)",
-    cloudflareWebsite: "Cloudflare 網站",
-    "Message:": "訊息:",
-    "Don't know how to get the token? Please read the guide:": "不知道如何取得權杖嗎?請閱讀指南:",
-    "The current connection may be lost if you are currently connecting via Cloudflare Tunnel. Are you sure want to stop it? Type your current password to confirm it.": "如果您目前正透過 Cloudflare Tunnel 連線,可能會導致連線中斷。您確定要停止嗎?請輸入密碼以確認。",
-    "HTTP Headers": "HTTP 標頭",
-    "Trust Proxy": "信任的 Proxy",
-    "Other Software": "其他軟體",
-    "For example: nginx, Apache and Traefik.": "例如 nginx、Apache 和 Traefik。",
-    "Please read": "請閱覽",
-    "Subject:": "簽發給:",
-    "Valid To:": "有效期限:",
-    "Days Remaining:": "剩餘天數:",
-    "Issuer:": "簽發者:",
-    "Fingerprint:": "指紋:",
-    "No status pages": "無狀態頁",
-    "Domain Name Expiry Notification": "網域名稱到期通知",
-    Proxy: "Proxy",
-    "Date Created": "建立日期",
-    HomeAssistant: "Home Assistant",
-    onebotHttpAddress: "OneBot HTTP 位址",
-    onebotMessageType: "OneBot 訊息類型",
-    onebotGroupMessage: "群組",
-    onebotPrivateMessage: "私人",
-    onebotUserOrGroupId: "群組/使用者 ID",
-    onebotSafetyTips: "為了安全起見,必須設置存取權杖",
-    "PushDeer Key": "PushDeer 金鑰",
-    "Footer Text": "頁尾文字",
-    "Show Powered By": "顯示技術支援文字",
-    "Domain Names": "網域名稱",
-    signedInDisp: "以 {0} 身分登入",
-    signedInDispDisabled: "驗證已停用。",
-    RadiusSecret: "Radius Secret",
-    RadiusSecretDescription: "客戶端與伺服器端的共享機密",
-    RadiusCalledStationId: "被叫站 Id",
-    RadiusCalledStationIdDescription: "被呼叫裝置的識別碼",
-    RadiusCallingStationId: "呼叫站 Id",
-    RadiusCallingStationIdDescription: "呼叫裝置的識別碼",
-    "Certificate Expiry Notification": "憑證到期通知",
-    "API Username": "API 使用者名稱",
-    "API Key": "API 金鑰",
-    "Recipient Number": "收件者號碼",
-    "From Name/Number": "來自名字/號碼",
-    "Leave blank to use a shared sender number.": "留空以使用共享寄件人號碼。",
-    "Octopush API Version": "Octopush API 版本",
-    "Legacy Octopush-DM": "舊版 Octopush-DM",
-    "endpoint": "端",
-    octopushAPIKey: "在控制台的 HTTP API 憑證取得的 \"API 金鑰\"",
-    octopushLogin: "在控制台的 HTTP API 憑證取得的 \"Login\"",
-    promosmsLogin: "API 登入名稱",
-    promosmsPassword: "API 密碼",
-    "pushoversounds pushover": "Pushover (預設)",
-    "pushoversounds bike": "車鈴",
-    "pushoversounds bugle": "號角",
-    "pushoversounds cashregister": "收銀機",
-    "pushoversounds classical": "古典",
-    "pushoversounds cosmic": "宇宙",
-    "pushoversounds falling": "下落",
-    "pushoversounds gamelan": "甘美朗",
-    "pushoversounds incoming": "來電",
-    "pushoversounds intermission": "中場休息",
-    "pushoversounds magic": "魔法",
-    "pushoversounds mechanical": "機械",
-    "pushoversounds pianobar": "鋼琴酒吧",
-    "pushoversounds siren": "警鈴",
-    "pushoversounds spacealarm": "太空鬧鐘",
-    "pushoversounds tugboat": "汽笛",
-    "pushoversounds alien": "外星鬧鐘 (長)",
-    "pushoversounds climb": "爬升 (長)",
-    "pushoversounds persistent": "持續 (長)",
-    "pushoversounds echo": "Pushover 回音 (長)",
-    "pushoversounds updown": "上下 (長)",
-    "pushoversounds vibrate": "僅震動",
-    "pushoversounds none": "無 (靜音)",
-    pushyAPIKey: "API 密鑰",
-    pushyToken: "裝置權杖",
-    "Show update if available": "顯示可用更新",
-    "Also check beta release": "檢查 Beta 版",
-    "Using a Reverse Proxy?": "正在使用反向代理?",
-    "Check how to config it for WebSocket": "查看如何為 WebSocket 設定",
-    "Steam Game Server": "Steam 遊戲伺服器",
-    "Most likely causes:": "可能原因:",
-    "The resource is no longer available.": "資源已不可用。",
-    "There might be a typing error in the address.": "網址可能有誤。",
-    "What you can try:": "您可以嘗試:",
-    "Retype the address.": "重新輸入網址。",
-    "Go back to the previous page.": "返回上一頁。",
-    "Coming Soon": "即將推出",
-    wayToGetClickSendSMSToken: "您可以從 {0} 取得 API 使用者名稱和金鑰。",
-    "Connection String": "連線字串",
-    Query: "查詢",
-    settingsCertificateExpiry: "TLS 憑證到期",
-    certificationExpiryDescription: "TLS 將於 X 天後到期時觸發 HTTPS 監測器通知:",
-    "Setup Docker Host": "設定 Docker 主機",
-    "Connection Type": "連線類型",
-    "Docker Daemon": "Docker 精靈",
-    deleteDockerHostMsg: "您確定要為所有監測器刪除此 Docker 主機嗎?",
-    socket: "通訊端",
-    tcp: "TCP / HTTP",
-    "Docker Container": "Docker 容器",
-    "Container Name / ID": "容器名稱 / ID",
-    "Docker Host": "Docker 主機",
-    "Docker Hosts": "Docker 主機",
-    "ntfy Topic": "ntfy 主題",
-    Domain: "網域",
-    Workstation: "工作站",
-    disableCloudflaredNoAuthMsg: "您處於無驗證模式。無須輸入密碼。",
-    trustProxyDescription: "信任 'X-Forwarded-*' 標頭。如果您想要取得正確的客戶端 IP,且您的 Uptime Kuma 架設於 Nginx 或 Apache 後方,您應啟用此選項。",
-    wayToGetLineNotifyToken: "您可以從 {0} 取得存取權杖",
-    Examples: "範例",
-    "Home Assistant URL": "Home Assistant 網址",
-    "Long-Lived Access Token": "長期有效存取權杖",
-    "Long-Lived Access Token can be created by clicking on your profile name (bottom left) and scrolling to the bottom then click Create Token. ": "若要建立長期有效存取權杖,請點擊您的個人檔案名稱 (左下角),捲動至最下方,然後點擊建立權杖。",
-    "Notification Service": "通知服務",
-    "default: notify all devices": "預設:通知所有服務",
-    "A list of Notification Services can be found in Home Assistant under \"Developer Tools > Services\" search for \"notification\" to find your device/phone name.": "您可以在 Home Assistant 中查看通知服務的列表,在\"開發者工具 > 服務\"下搜尋\"通知\"來找到您的裝置/手機的名稱。",
-    "Automations can optionally be triggered in Home Assistant:": "可以選擇在 Home Assistant 中觸發自動化程序:",
-    "Trigger type:": "觸發器類型:",
-    "Event type:": "事件類型:",
-    "Event data:": "事件資料:",
-    "Then choose an action, for example switch the scene to where an RGB light is red.": "然後選擇動作,例如切換至 RGB 燈為紅色的場景。",
-    "Frontend Version": "前端版本",
-    "Frontend Version do not match backend version!": "前端版本與後端版本不符!",
-    "Base URL": "基底網址",
-    goAlertInfo: "GoAlert 是用於待命排程、升級自動化,以及通知 (如簡訊或語音通話) 的開源應用程式。自動在正確的時間、用洽當的方法、聯絡合適的人! {0}",
-    goAlertIntegrationKeyInfo: "取得服務的通用 API 整合金鑰,格式為 \"aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee\"。通常是已複製的網址的權杖參數值。",
-    goAlert: "GoAlert",
-    backupOutdatedWarning: "過時:由於新功能的增加,且未妥善維護,故此備份功能無法產生或復原完整備份。",
-    backupRecommend: "請直接備份磁碟區或 ./data/ 資料夾。",
-    "Optional": "選填",
-    squadcast: "Squadcast",
-    SendKey: "SendKey",
-    "SMSManager API Docs": "SMSManager API 文件 ",
-    "Gateway Type": "閘道類型",
-    SMSManager: "SMSManager",
-    "You can divide numbers with": "若要除數,您可以使用",
-    "or": "或是",
-    recurringInterval: "間隔",
-    "Recurring": "週期性",
-    strategyManual: "手動切換使用中/非使用中",
-    warningTimezone: "正在使用伺服器的時區",
-    weekdayShortMon: "一",
-    weekdayShortTue: "二",
-    weekdayShortWed: "三",
-    weekdayShortThu: "四",
-    weekdayShortFri: "五",
-    weekdayShortSat: "六",
-    weekdayShortSun: "日",
-    dayOfWeek: "每周特定一天",
-    dayOfMonth: "每月特定一天",
-    lastDay: "最後一天",
-    lastDay1: "每月的最後一天",
-    lastDay2: "每月的倒數第二天",
-    lastDay3: "每月的倒數第三天",
-    lastDay4: "每月的倒數第四天",
-    "No Maintenance": "無維護",
-    pauseMaintenanceMsg: "您確定要暫停嗎?",
-    "maintenanceStatus-under-maintenance": "維護中",
-    "maintenanceStatus-inactive": "非使用中",
-    "maintenanceStatus-scheduled": "已排程",
-    "maintenanceStatus-ended": "已結束",
-    "maintenanceStatus-unknown": "未知",
-    "Display Timezone": "顯示時區",
-    "Server Timezone": "伺服器時區",
-    statusPageMaintenanceEndDate: "結束",
-};
diff --git a/src/layouts/Layout.vue b/src/layouts/Layout.vue
index d8e96aa82..9069aef70 100644
--- a/src/layouts/Layout.vue
+++ b/src/layouts/Layout.vue
@@ -63,6 +63,12 @@
                                 </router-link>
                             </li>
 
+                            <li>
+                                <a href="https://github.com/louislam/uptime-kuma/wiki" class="dropdown-item" target="_blank">
+                                    <font-awesome-icon icon="info-circle" /> {{ $t("Help") }}
+                                </a>
+                            </li>
+
                             <li v-if="$root.loggedIn && $root.socket.token !== 'autoLogin'">
                                 <button class="dropdown-item" @click="$root.logout">
                                     <font-awesome-icon icon="sign-out-alt" />
diff --git a/src/mixins/datetime.js b/src/mixins/datetime.js
index 4fa2fa831..5a282ad03 100644
--- a/src/mixins/datetime.js
+++ b/src/mixins/datetime.js
@@ -12,6 +12,11 @@ export default {
     },
 
     methods: {
+        /**
+         * Convert value to UTC
+         * @param {string | number | Date | dayjs.Dayjs} value
+         * @returns {dayjs.Dayjs}
+         */
         toUTC(value) {
             return dayjs.tz(value, this.timezone).utc().format();
         },
@@ -34,6 +39,11 @@ export default {
             return this.datetimeFormat(value, "YYYY-MM-DD HH:mm:ss");
         },
 
+        /**
+         * Get time for maintenance
+         * @param {string | number | Date | dayjs.Dayjs} value
+         * @returns {string}
+         */
         datetimeMaintenance(value) {
             const inputDate = new Date(value);
             const now = new Date(Date.now());
diff --git a/src/mixins/lang.js b/src/mixins/lang.js
index aca951498..7e36d158b 100644
--- a/src/mixins/lang.js
+++ b/src/mixins/lang.js
@@ -1,6 +1,6 @@
 import { currentLocale } from "../i18n";
 import { setPageLocale } from "../util-frontend";
-const langModules = import.meta.glob("../languages/*.js");
+const langModules = import.meta.glob("../lang/*.json");
 
 export default {
     data() {
@@ -24,7 +24,7 @@ export default {
     methods: {
         /** Change the application language */
         async changeLang(lang) {
-            let message = (await langModules["../languages/" + lang + ".js"]()).default;
+            let message = (await langModules["../lang/" + lang + ".json"]()).default;
             this.$i18n.setLocaleMessage(lang, message);
             this.$i18n.locale = lang;
             localStorage.locale = lang;
diff --git a/src/mixins/socket.js b/src/mixins/socket.js
index 378af06a5..6bd0aafc5 100644
--- a/src/mixins/socket.js
+++ b/src/mixins/socket.js
@@ -3,6 +3,7 @@ import { useToast } from "vue-toastification";
 import jwtDecode from "jwt-decode";
 import Favico from "favico.js";
 import dayjs from "dayjs";
+import { DOWN, MAINTENANCE, PENDING, UP } from "../util.ts";
 const toast = useToast();
 
 let socket;
@@ -454,6 +455,10 @@ export default {
             socket.emit("getMonitorList", callback);
         },
 
+        /**
+         * Get list of maintenances
+         * @param {socketCB} callback
+         */
         getMaintenanceList(callback) {
             if (! callback) {
                 callback = () => { };
@@ -470,22 +475,49 @@ export default {
             socket.emit("add", monitor, callback);
         },
 
+        /**
+         * Adds a maintenace
+         * @param {Object} maintenance
+         * @param {socketCB} callback
+         */
         addMaintenance(maintenance, callback) {
             socket.emit("addMaintenance", maintenance, callback);
         },
 
+        /**
+         * Add monitors to maintenance
+         * @param {number} maintenanceID
+         * @param {number[]} monitors
+         * @param {socketCB} callback
+         */
         addMonitorMaintenance(maintenanceID, monitors, callback) {
             socket.emit("addMonitorMaintenance", maintenanceID, monitors, callback);
         },
 
+        /**
+         * Add status page to maintenance
+         * @param {number} maintenanceID
+         * @param {number} statusPages
+         * @param {socketCB} callback
+         */
         addMaintenanceStatusPage(maintenanceID, statusPages, callback) {
             socket.emit("addMaintenanceStatusPage", maintenanceID, statusPages, callback);
         },
 
+        /**
+         * Get monitors affected by maintenance
+         * @param {number} maintenanceID
+         * @param {socketCB} callback
+         */
         getMonitorMaintenance(maintenanceID, callback) {
             socket.emit("getMonitorMaintenance", maintenanceID, callback);
         },
 
+        /**
+         * Get status pages where maintenance is shown
+         * @param {number} maintenanceID
+         * @param {socketCB} callback
+         */
         getMaintenanceStatusPage(maintenanceID, callback) {
             socket.emit("getMaintenanceStatusPage", maintenanceID, callback);
         },
@@ -499,6 +531,11 @@ export default {
             socket.emit("deleteMonitor", monitorID, callback);
         },
 
+        /**
+         * Delete specified maintenance
+         * @param {number} maintenanceID
+         * @param {socketCB} callback
+         */
         deleteMaintenance(maintenanceID, callback) {
             socket.emit("deleteMaintenance", maintenanceID, callback);
         },
@@ -590,28 +627,28 @@ export default {
             for (let monitorID in this.lastHeartbeatList) {
                 let lastHeartBeat = this.lastHeartbeatList[monitorID];
 
-                if (this.monitorList[monitorID] && this.monitorList[monitorID].maintenance) {
-                    result[monitorID] = {
-                        text: this.$t("statusMaintenance"),
-                        color: "maintenance",
-                    };
-                } else if (! lastHeartBeat) {
+                if (! lastHeartBeat) {
                     result[monitorID] = unknown;
-                } else if (lastHeartBeat.status === 1) {
+                } else if (lastHeartBeat.status === UP) {
                     result[monitorID] = {
                         text: this.$t("Up"),
                         color: "primary",
                     };
-                } else if (lastHeartBeat.status === 0) {
+                } else if (lastHeartBeat.status === DOWN) {
                     result[monitorID] = {
                         text: this.$t("Down"),
                         color: "danger",
                     };
-                } else if (lastHeartBeat.status === 2) {
+                } else if (lastHeartBeat.status === PENDING) {
                     result[monitorID] = {
                         text: this.$t("Pending"),
                         color: "warning",
                     };
+                } else if (lastHeartBeat.status === MAINTENANCE) {
+                    result[monitorID] = {
+                        text: this.$t("statusMaintenance"),
+                        color: "maintenance",
+                    };
                 } else {
                     result[monitorID] = unknown;
                 }
@@ -633,17 +670,17 @@ export default {
                 let beat = this.$root.lastHeartbeatList[monitorID];
                 let monitor = this.$root.monitorList[monitorID];
 
-                if (monitor && monitor.maintenance) {
-                    result.maintenance++;
-                } else if (monitor && ! monitor.active) {
+                if (monitor && ! monitor.active) {
                     result.pause++;
                 } else if (beat) {
-                    if (beat.status === 1) {
+                    if (beat.status === UP) {
                         result.up++;
-                    } else if (beat.status === 0) {
+                    } else if (beat.status === DOWN) {
                         result.down++;
-                    } else if (beat.status === 2) {
+                    } else if (beat.status === PENDING) {
                         result.up++;
+                    } else if (beat.status === MAINTENANCE) {
+                        result.maintenance++;
                     } else {
                         result.unknown++;
                     }
diff --git a/src/pages/Details.vue b/src/pages/Details.vue
index fce3fde59..9cf02d65e 100644
--- a/src/pages/Details.vue
+++ b/src/pages/Details.vue
@@ -476,6 +476,12 @@ table {
 
 .dropdown-clear-data {
     float: right;
+
+    ul {
+        width: 100%;
+        min-width: unset;
+        padding-left: 0;
+    }
 }
 
 .dark {
diff --git a/src/pages/EditMaintenance.vue b/src/pages/EditMaintenance.vue
index d668d1ad1..00e649381 100644
--- a/src/pages/EditMaintenance.vue
+++ b/src/pages/EditMaintenance.vue
@@ -21,6 +21,9 @@
                                 <textarea
                                     id="description" v-model="maintenance.description" class="form-control"
                                 ></textarea>
+                                <div class="form-text">
+                                    {{ $t("markdownSupported") }}
+                                </div>
                             </div>
 
                             <!-- Affected Monitors -->
@@ -356,6 +359,7 @@ export default {
         });
     },
     methods: {
+        /** Initialise page */
         init() {
             this.affectedMonitors = [];
             this.selectedStatusPages = [];
@@ -414,6 +418,7 @@ export default {
             }
         },
 
+        /** Create new maintenance */
         async submit() {
             this.processing = true;
 
@@ -458,6 +463,11 @@ export default {
             }
         },
 
+        /**
+         * Add monitor to maintenance
+         * @param {number} maintenanceID
+         * @param {socketCB} callback
+         */
         async addMonitorMaintenance(maintenanceID, callback) {
             await this.$root.addMonitorMaintenance(maintenanceID, this.affectedMonitors, async (res) => {
                 if (!res.ok) {
@@ -470,6 +480,11 @@ export default {
             });
         },
 
+        /**
+         * Add status page to maintenance
+         * @param {number} maintenanceID
+         * @param {socketCB} callback
+         */
         async addMaintenanceStatusPage(maintenanceID, callback) {
             await this.$root.addMaintenanceStatusPage(maintenanceID, (this.showOnAllPages) ? this.selectedStatusPagesOptions : this.selectedStatusPages, async (res) => {
                 if (!res.ok) {
diff --git a/src/pages/EditMonitor.vue b/src/pages/EditMonitor.vue
index f0c99b5b5..ebe1b51fe 100644
--- a/src/pages/EditMonitor.vue
+++ b/src/pages/EditMonitor.vue
@@ -45,6 +45,9 @@
                                         <option value="steam">
                                             {{ $t("Steam Game Server") }}
                                         </option>
+                                        <option value="gamedig">
+                                            GameDig
+                                        </option>
                                         <option value="mqtt">
                                             MQTT
                                         </option>
@@ -57,10 +60,26 @@
                                         <option value="mysql">
                                             MySQL/MariaDB
                                         </option>
+                                        <option value="mongodb">
+                                            MongoDB
+                                        </option>
                                         <option value="radius">
                                             Radius
                                         </option>
+                                        <option value="redis">
+                                            Redis
+                                        </option>
                                     </optgroup>
+
+                                    <!--
+                                    Hidden for now: Reason refer to Setting.vue
+                                    <optgroup :label="$t('Custom Monitor Type')">
+                                        <option value="browser">
+                                            (Beta) HTTP(s) - Browser Engine (Chrome/Firefox)
+                                        </option>
+                                    </optgroup>
+                                </select>
+                                -->
                                 </select>
                             </div>
 
@@ -71,7 +90,7 @@
                             </div>
 
                             <!-- URL -->
-                            <div v-if="monitor.type === 'http' || monitor.type === 'keyword' " class="my-3">
+                            <div v-if="monitor.type === 'http' || monitor.type === 'keyword' || monitor.type === 'browser' " class="my-3">
                                 <label for="url" class="form-label">{{ $t("URL") }}</label>
                                 <input id="url" v-model="monitor.url" type="url" class="form-control" pattern="https?://.+" required>
                             </div>
@@ -93,7 +112,7 @@
                             </div>
 
                             <!-- Keyword -->
-                            <div v-if="monitor.type === 'keyword' || monitor.type === 'grpc-keyword' " class="my-3">
+                            <div v-if="monitor.type === 'keyword' || monitor.type === 'grpc-keyword'" class="my-3">
                                 <label for="keyword" class="form-label">{{ $t("Keyword") }}</label>
                                 <input id="keyword" v-model="monitor.keyword" type="text" class="form-control" required>
                                 <div class="form-text">
@@ -101,16 +120,27 @@
                                 </div>
                             </div>
 
+                            <!-- Game -->
+                            <!-- GameDig only -->
+                            <div v-if="monitor.type === 'gamedig'" class="my-3">
+                                <label for="game" class="form-label"> {{ $t("Game") }} </label>
+                                <select id="game" v-model="monitor.game" class="form-select" required>
+                                    <option v-for="game in gameList" :key="game.keys[0]" :value="game.keys[0]">
+                                        {{ game.pretty }}
+                                    </option>
+                                </select>
+                            </div>
+
                             <!-- Hostname -->
                             <!-- TCP Port / Ping / DNS / Steam / MQTT / Radius only -->
-                            <div v-if="monitor.type === 'port' || monitor.type === 'ping' || monitor.type === 'dns' || monitor.type === 'steam' || monitor.type === 'mqtt' || monitor.type === 'radius'" class="my-3">
+                            <div v-if="monitor.type === 'port' || monitor.type === 'ping' || monitor.type === 'dns' || monitor.type === 'steam' || monitor.type === 'gamedig' ||monitor.type === 'mqtt' || monitor.type === 'radius'" class="my-3">
                                 <label for="hostname" class="form-label">{{ $t("Hostname") }}</label>
-                                <input id="hostname" v-model="monitor.hostname" type="text" class="form-control" :pattern="`${ipRegexPattern}|${hostnameRegexPattern}`" required>
+                                <input id="hostname" v-model="monitor.hostname" type="text" class="form-control" :pattern="`${monitor.type === 'mqtt' ? mqttIpOrHostnameRegexPattern : ipOrHostnameRegexPattern}`" required>
                             </div>
 
                             <!-- Port -->
                             <!-- For TCP Port / Steam / MQTT / Radius Type -->
-                            <div v-if="monitor.type === 'port' || monitor.type === 'steam' || monitor.type === 'mqtt' || monitor.type === 'radius'" class="my-3">
+                            <div v-if="monitor.type === 'port' || monitor.type === 'steam' || monitor.type === 'gamedig' || monitor.type === 'mqtt' || monitor.type === 'radius'" class="my-3">
                                 <label for="port" class="form-label">{{ $t("Port") }}</label>
                                 <input id="port" v-model="monitor.port" type="number" class="form-control" required min="0" max="65535" step="1">
                             </div>
@@ -267,6 +297,24 @@
                                     <textarea id="sqlQuery" v-model="monitor.databaseQuery" class="form-control" placeholder="Example: select getdate()"></textarea>
                                 </div>
                             </template>
+                            <!-- Redis -->
+                            <template v-if="monitor.type === 'redis'">
+                                <div class="my-3">
+                                    <label for="redisConnectionString" class="form-label">{{ $t("Connection String") }}</label>
+                                    <input id="redisConnectionString" v-model="monitor.databaseConnectionString" type="text" class="form-control" placeholder="redis://user:password@host:port">
+                                </div>
+                            </template>
+
+                            <!-- MongoDB -->
+                            <template v-if="monitor.type === 'mongodb'">
+                                <div class="my-3">
+                                    <label for="sqlConnectionString" class="form-label">{{ $t("Connection String") }}</label>
+
+                                    <template v-if="monitor.type === 'mongodb'">
+                                        <input id="sqlConnectionString" v-model="monitor.databaseConnectionString" type="text" class="form-control" placeholder="mongodb://username:password@host:port/database">
+                                    </template>
+                                </div>
+                            </template>
 
                             <!-- Interval -->
                             <div class="my-3">
@@ -292,7 +340,7 @@
 
                             <div class="my-3">
                                 <label for="resend-interval" class="form-label">
-                                    {{ $t("Resend Notification if Down X times consequently") }}
+                                    {{ $t("Resend Notification if Down X times consecutively") }}
                                     <span v-if="monitor.resendInterval > 0">({{ $t("resendEveryXTimes", [ monitor.resendInterval ]) }})</span>
                                     <span v-else>({{ $t("resendDisabled") }})</span>
                                 </label>
@@ -327,6 +375,12 @@
                                 </div>
                             </div>
 
+                            <!-- Ping packet size -->
+                            <div v-if="monitor.type === 'ping'" class="my-3">
+                                <label for="packet-size" class="form-label">{{ $t("Packet Size") }}</label>
+                                <input id="packet-size" v-model="monitor.packetSize" type="number" class="form-control" required min="1" max="65500" step="1">
+                            </div>
+
                             <!-- HTTP / Keyword only -->
                             <template v-if="monitor.type === 'http' || monitor.type === 'keyword' || monitor.type === 'grpc-keyword' ">
                                 <div class="my-3">
@@ -363,10 +417,6 @@
                             <div class="my-3">
                                 <tags-manager ref="tagsManager" :pre-selected-tags="monitor.tags"></tags-manager>
                             </div>
-
-                            <div class="mt-5 mb-1">
-                                <button id="monitor-submit-btn" class="btn btn-primary" type="submit" :disabled="processing">{{ $t("Save") }}</button>
-                            </div>
                         </div>
 
                         <div class="col-md-6">
@@ -453,6 +503,15 @@
                                     </select>
                                 </div>
 
+                                <!-- Encoding -->
+                                <div class="my-3">
+                                    <label for="httpBodyEncoding" class="form-label">{{ $t("Body Encoding") }}</label>
+                                    <select id="httpBodyEncoding" v-model="monitor.httpBodyEncoding" class="form-select">
+                                        <option value="json">JSON</option>
+                                        <option value="xml">XML</option>
+                                    </select>
+                                </div>
+
                                 <!-- Body -->
                                 <div class="my-3">
                                     <label for="body" class="form-label">{{ $t("Body") }}</label>
@@ -556,6 +615,10 @@
                                 </template>
                             </template>
                         </div>
+
+                        <div class="col-md-12 mt-5 mb-1">
+                            <button id="monitor-submit-btn" class="btn btn-primary" type="submit" :disabled="processing">{{ $t("Save") }}</button>
+                        </div>
                     </div>
                 </div>
             </form>
@@ -576,6 +639,7 @@ import DockerHostDialog from "../components/DockerHostDialog.vue";
 import ProxyDialog from "../components/ProxyDialog.vue";
 import TagsManager from "../components/TagsManager.vue";
 import { genSecret, isDev, MAX_INTERVAL_SECOND, MIN_INTERVAL_SECOND } from "../util.ts";
+import { hostNameRegexPattern } from "../util-frontend";
 
 const toast = useToast();
 
@@ -600,11 +664,9 @@ export default {
             },
             acceptedStatusCodeOptions: [],
             dnsresolvetypeOptions: [],
-
-            // Source: https://digitalfortress.tech/tips/top-15-commonly-used-regex/
-            ipRegexPattern: "((^\\s*((([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]))\\s*$)|(^\\s*((([0-9A-Fa-f]{1,4}:){7}([0-9A-Fa-f]{1,4}|:))|(([0-9A-Fa-f]{1,4}:){6}(:[0-9A-Fa-f]{1,4}|((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){5}(((:[0-9A-Fa-f]{1,4}){1,2})|:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){4}(((:[0-9A-Fa-f]{1,4}){1,3})|((:[0-9A-Fa-f]{1,4})?:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){3}(((:[0-9A-Fa-f]{1,4}){1,4})|((:[0-9A-Fa-f]{1,4}){0,2}:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){2}(((:[0-9A-Fa-f]{1,4}){1,5})|((:[0-9A-Fa-f]{1,4}){0,3}:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){1}(((:[0-9A-Fa-f]{1,4}){1,6})|((:[0-9A-Fa-f]{1,4}){0,4}:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(:(((:[0-9A-Fa-f]{1,4}){1,7})|((:[0-9A-Fa-f]{1,4}){0,5}:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:)))(%.+)?\\s*$))",
-            // Source: https://stackoverflow.com/questions/106179/regular-expression-to-match-dns-hostname-or-ip-address
-            hostnameRegexPattern: "^(([a-zA-Z0-9_]|[a-zA-Z0-9_][a-zA-Z0-9\\-_]*[a-zA-Z0-9_])\\.)*([A-Za-z0-9_]|[A-Za-z0-9_][A-Za-z0-9\\-_]*[A-Za-z0-9_])$"
+            ipOrHostnameRegexPattern: hostNameRegexPattern(),
+            mqttIpOrHostnameRegexPattern: hostNameRegexPattern(true),
+            gameList: null,
         };
     },
 
@@ -680,6 +742,15 @@ message HealthCheckResponse {
             ` ]);
         },
         bodyPlaceholder() {
+            if (this.monitor && this.monitor.httpBodyEncoding && this.monitor.httpBodyEncoding === "xml") {
+                return this.$t("Example:", [ `
+<?xml version="1.0" encoding="utf-8"?>
+<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
+  <soap:Body>
+    <Uptime>Kuma</Uptime>
+  </soap:Body>
+</soap:Envelope>` ]);
+            }
             return this.$t("Example:", [ `
 {
     "key": "value"
@@ -691,7 +762,18 @@ message HealthCheckResponse {
 {
     "HeaderName": "HeaderValue"
 }` ]);
-        }
+        },
+
+        currentGameObject() {
+            if (this.gameList) {
+                for (let game of this.gameList) {
+                    if (game.keys[0] === this.monitor.game) {
+                        return game;
+                    }
+                }
+            }
+            return null;
+        },
 
     },
     watch: {
@@ -735,6 +817,24 @@ message HealthCheckResponse {
                     this.monitor.port = undefined;
                 }
             }
+
+            // Get the game list from server
+            if (this.monitor.type === "gamedig") {
+                this.$root.getSocket().emit("getGameList", (res) => {
+                    if (res.ok) {
+                        this.gameList = res.gameList;
+                    } else {
+                        toast.error(res.msg);
+                    }
+                });
+            }
+        },
+
+        currentGameObject(newGameObject, previousGameObject) {
+            if (!this.monitor.port || (previousGameObject && previousGameObject.options.port === this.monitor.port)) {
+                this.monitor.port = newGameObject.options.port;
+            }
+            this.monitor.game = newGameObject.keys[0];
         }
 
     },
@@ -786,6 +886,7 @@ message HealthCheckResponse {
                     notificationIDList: {},
                     ignoreTls: false,
                     upsideDown: false,
+                    packetSize: 56,
                     expiryNotification: false,
                     maxredirects: 10,
                     accepted_statuscodes: [ "200-299" ],
@@ -799,6 +900,7 @@ message HealthCheckResponse {
                     mqttTopic: "",
                     mqttSuccessMessage: "",
                     authMethod: null,
+                    httpBodyEncoding: "json"
                 };
 
                 if (this.$root.proxyList && !this.monitor.proxyId) {
@@ -847,7 +949,7 @@ message HealthCheckResponse {
          * @returns {boolean} Is the form input valid?
          */
         isInputValid() {
-            if (this.monitor.body) {
+            if (this.monitor.body && (!this.monitor.httpBodyEncoding || this.monitor.httpBodyEncoding === "json")) {
                 try {
                     JSON.parse(this.monitor.body);
                 } catch (err) {
@@ -871,6 +973,7 @@ message HealthCheckResponse {
          * @returns {void}
          */
         async submit() {
+
             this.processing = true;
 
             if (!this.isInputValid()) {
@@ -878,15 +981,27 @@ message HealthCheckResponse {
                 return;
             }
 
-            // Beautify the JSON format
-            if (this.monitor.body) {
+            // Beautify the JSON format (only if httpBodyEncoding is not set or === json)
+            if (this.monitor.body && (!this.monitor.httpBodyEncoding || this.monitor.httpBodyEncoding === "json")) {
                 this.monitor.body = JSON.stringify(JSON.parse(this.monitor.body), null, 4);
             }
 
+            if (this.monitor.type && this.monitor.type !== "http" && this.monitor.type !== "keyword") {
+                this.monitor.httpBodyEncoding = null;
+            }
+
             if (this.monitor.headers) {
                 this.monitor.headers = JSON.stringify(JSON.parse(this.monitor.headers), null, 4);
             }
 
+            if (this.monitor.hostname) {
+                this.monitor.hostname = this.monitor.hostname.trim();
+            }
+
+            if (this.monitor.url) {
+                this.monitor.url = this.monitor.url.trim();
+            }
+
             if (this.isAdd || this.isClone) {
                 this.$root.add(this.monitor, async (res) => {
 
@@ -936,7 +1051,7 @@ message HealthCheckResponse {
         // Enable it if the Docker Host is added in EditMonitor.vue
         addedDockerHost(id) {
             this.monitor.docker_host = id;
-        }
+        },
     },
 };
 </script>
diff --git a/src/pages/MaintenanceDetails.vue b/src/pages/MaintenanceDetails.vue
index 04c216915..0cf9283d3 100644
--- a/src/pages/MaintenanceDetails.vue
+++ b/src/pages/MaintenanceDetails.vue
@@ -65,6 +65,7 @@ export default {
         this.init();
     },
     methods: {
+        /** Initialise page */
         init() {
             this.$root.getSocket().emit("getMonitorMaintenance", this.$route.params.id, (res) => {
                 if (res.ok) {
@@ -83,10 +84,12 @@ export default {
             });
         },
 
+        /** Confirm deletion */
         deleteDialog() {
             this.$refs.confirmDelete.show();
         },
 
+        /** Delete maintenance after showing confirmation */
         deleteMaintenance() {
             this.$root.deleteMaintenance(this.maintenance.id, (res) => {
                 if (res.ok) {
diff --git a/src/pages/ManageMaintenance.vue b/src/pages/ManageMaintenance.vue
index dd36c9505..478927e87 100644
--- a/src/pages/ManageMaintenance.vue
+++ b/src/pages/ManageMaintenance.vue
@@ -62,7 +62,7 @@
             </div>
 
             <div class="text-center mt-3" style="font-size: 13px;">
-                <a href="https://github.com/louislam/uptime-kuma/wiki/Maintenance" target="_blank">Learn More</a>
+                <a href="https://github.com/louislam/uptime-kuma/wiki/Maintenance" target="_blank">{{ $t("Learn More") }}</a>
             </div>
 
             <Confirm ref="confirmPause" :yes-text="$t('Yes')" :no-text="$t('No')" @yes="pauseMaintenance">
@@ -133,15 +133,25 @@ export default {
             }
         },
 
+        /**
+         * Get maintenance URL
+         * @param {number} id
+         * @returns {string} Relative URL
+         */
         maintenanceURL(id) {
             return getMaintenanceRelativeURL(id);
         },
 
+        /**
+         * Show delete confirmation
+         * @param {number} maintenanceID
+         */
         deleteDialog(maintenanceID) {
             this.selectedMaintenanceID = maintenanceID;
             this.$refs.confirmDelete.show();
         },
 
+        /** Delete maintenance after showing confirmation dialog */
         deleteMaintenance() {
             this.$root.deleteMaintenance(this.selectedMaintenanceID, (res) => {
                 if (res.ok) {
diff --git a/src/pages/Settings.vue b/src/pages/Settings.vue
index 874049682..b034a5411 100644
--- a/src/pages/Settings.vue
+++ b/src/pages/Settings.vue
@@ -95,6 +95,9 @@ export default {
                 "reverse-proxy": {
                     title: this.$t("Reverse Proxy"),
                 },
+                tags: {
+                    title: this.$t("Tags"),
+                },
                 "monitor-history": {
                     title: this.$t("Monitor History"),
                 },
@@ -110,6 +113,12 @@ export default {
                 backup: {
                     title: this.$t("Backup"),
                 },
+                /*
+                Hidden for now: Unfortunately, after some test, I found that Playwright requires a lot of libraries to be installed on the Linux host in order to start Chrome or Firefox.
+                It will be hard to install, so I hide this feature for now. But it still accessible via URL: /settings/plugins.
+                plugins: {
+                    title: this.$tc("plugin", 2),
+                },*/
                 about: {
                     title: this.$t("About"),
                 },
@@ -189,14 +198,36 @@ export default {
          * @param {string} [currentPassword] Only need for disableAuth to true
          */
         saveSettings(callback, currentPassword) {
-            this.$root.getSocket().emit("setSettings", this.settings, currentPassword, (res) => {
-                this.$root.toastRes(res);
-                this.loadSettings();
+            let valid = this.validateSettings();
+            if (valid.success) {
+                this.$root.getSocket().emit("setSettings", this.settings, currentPassword, (res) => {
+                    this.$root.toastRes(res);
+                    this.loadSettings();
 
-                if (callback) {
-                    callback();
-                }
-            });
+                    if (callback) {
+                        callback();
+                    }
+                });
+            } else {
+                this.$root.toastError(valid.msg);
+            }
+        },
+
+        /**
+         * Ensure settings are valid
+         * @returns {Object} Contains success state and error msg
+         */
+        validateSettings() {
+            if (this.settings.keepDataPeriodDays < 0) {
+                return {
+                    success: false,
+                    msg: this.$t("dataRetentionTimeError"),
+                };
+            }
+            return {
+                success: true,
+                msg: "",
+            };
         },
     }
 };
diff --git a/src/pages/Setup.vue b/src/pages/Setup.vue
index cba7f8fce..cd2d149cd 100644
--- a/src/pages/Setup.vue
+++ b/src/pages/Setup.vue
@@ -14,7 +14,7 @@
                 </p>
 
                 <div class="form-floating">
-                    <select id="language" v-model="$i18n.locale" class="form-select">
+                    <select id="language" v-model="$root.language" class="form-select">
                         <option v-for="(lang, i) in $i18n.availableLocales" :key="`Lang${i}`" :value="lang">
                             {{ $i18n.messages[lang].languageName }}
                         </option>
@@ -59,9 +59,7 @@ export default {
         };
     },
     watch: {
-        "$i18n.locale"() {
-            localStorage.locale = this.$i18n.locale;
-        },
+
     },
     mounted() {
         this.$root.getSocket().emit("needSetup", (needSetup) => {
diff --git a/src/pages/StatusPage.vue b/src/pages/StatusPage.vue
index 6cecf6682..edf32561b 100644
--- a/src/pages/StatusPage.vue
+++ b/src/pages/StatusPage.vue
@@ -20,12 +20,18 @@
                 <div class="my-3">
                     <label for="description" class="form-label">{{ $t("Description") }}</label>
                     <textarea id="description" v-model="config.description" class="form-control"></textarea>
+                    <div class="form-text">
+                        {{ $t("markdownSupported") }}
+                    </div>
                 </div>
 
                 <!-- Footer Text -->
                 <div class="my-3">
                     <label for="footer-text" class="form-label">{{ $t("Footer Text") }}</label>
                     <textarea id="footer-text" v-model="config.footerText" class="form-control"></textarea>
+                    <div class="form-text">
+                        {{ $t("markdownSupported") }}
+                    </div>
                 </div>
 
                 <div class="my-3 form-check form-switch">
@@ -64,6 +70,12 @@
                     </ul>
                 </div>
 
+                <!-- Google Analytics -->
+                <div class="my-3">
+                    <label for="googleAnalyticsTag" class="form-label">{{ $t("Google Analytics ID") }}</label>
+                    <input id="googleAnalyticsTag" v-model="config.googleAnalyticsId" type="text" class="form-control">
+                </div>
+
                 <!-- Custom CSS -->
                 <div class="my-3">
                     <div class="mb-1">{{ $t("Custom CSS") }}</div>
@@ -148,7 +160,12 @@
                 <Editable v-model="incident.title" tag="h4" :contenteditable="editIncidentMode" :noNL="true" class="alert-heading" />
 
                 <strong v-if="editIncidentMode">{{ $t("Content") }}:</strong>
-                <Editable v-model="incident.content" tag="div" :contenteditable="editIncidentMode" class="content" />
+                <Editable v-if="editIncidentMode" v-model="incident.content" tag="div" :contenteditable="editIncidentMode" class="content" />
+                <div v-if="editIncidentMode" class="form-text">
+                    {{ $t("markdownSupported") }}
+                </div>
+                <!-- eslint-disable-next-line vue/no-v-html-->
+                <div v-if="! editIncidentMode" class="content" v-html="incidentHTML"></div>
 
                 <!-- Incident Date -->
                 <div class="date mt-3">
@@ -236,14 +253,17 @@
                     class="shadow-box alert mb-4 p-3 bg-maintenance mt-4 position-relative" role="alert"
                 >
                     <h4 class="alert-heading">{{ maintenance.title }}</h4>
-                    <div class="content">{{ maintenance.description }}</div>
+                    <!-- eslint-disable-next-line vue/no-v-html-->
+                    <div class="content" v-html="maintenanceHTML(maintenance.description)"></div>
                     <MaintenanceTime :maintenance="maintenance" />
                 </div>
             </template>
 
             <!-- Description -->
             <strong v-if="editMode">{{ $t("Description") }}:</strong>
-            <Editable v-model="config.description" :contenteditable="editMode" tag="div" class="mb-4 description" />
+            <Editable v-if="enableEditMode" v-model="config.description" :contenteditable="editMode" tag="div" class="mb-4 description" />
+            <!-- eslint-disable-next-line vue/no-v-html-->
+            <div v-if="! enableEditMode" class="alert-heading p-2" v-html="descriptionHTML"></div>
 
             <div v-if="editMode" class="mb-4">
                 <div>
@@ -279,7 +299,9 @@
                 <div class="custom-footer-text text-start">
                     <strong v-if="enableEditMode">{{ $t("Custom Footer") }}:</strong>
                 </div>
-                <Editable v-model="config.footerText" tag="div" :contenteditable="enableEditMode" :noNL="false" class="alert-heading p-2" />
+                <Editable v-if="enableEditMode" v-model="config.footerText" tag="div" :contenteditable="enableEditMode" :noNL="false" class="alert-heading p-2" />
+                <!-- eslint-disable-next-line vue/no-v-html-->
+                <div v-if="! enableEditMode" class="alert-heading p-2" v-html="footerHTML"></div>
 
                 <p v-if="config.showPoweredBy">
                     {{ $t("Powered by") }} <a target="_blank" rel="noopener noreferrer" href="https://github.com/louislam/uptime-kuma">{{ $t("Uptime Kuma" ) }}</a>
@@ -310,6 +332,8 @@ import ImageCropUpload from "vue-image-crop-upload";
 import { PrismEditor } from "vue-prism-editor";
 import "vue-prism-editor/dist/prismeditor.min.css"; // import the styles somewhere
 import { useToast } from "vue-toastification";
+import { marked } from "marked";
+import DOMPurify from "dompurify";
 import Confirm from "../components/Confirm.vue";
 import PublicGroupList from "../components/PublicGroupList.vue";
 import MaintenanceTime from "../components/MaintenanceTime.vue";
@@ -477,6 +501,29 @@ export default {
             return this.overallStatus === STATUS_PAGE_MAINTENANCE;
         },
 
+        incidentHTML() {
+            if (this.incident.content != null) {
+                return DOMPurify.sanitize(marked(this.incident.content));
+            } else {
+                return "";
+            }
+        },
+
+        descriptionHTML() {
+            if (this.config.description != null) {
+                return DOMPurify.sanitize(marked(this.config.description));
+            } else {
+                return "";
+            }
+        },
+
+        footerHTML() {
+            if (this.config.footerText != null) {
+                return DOMPurify.sanitize(marked(this.config.footerText));
+            } else {
+                return "";
+            }
+        },
     },
     watch: {
 
@@ -836,6 +883,15 @@ export default {
             this.config.domainNameList.splice(index, 1);
         },
 
+        /**
+         * Generate sanitized HTML from maintenance description
+         * @param {string} description
+         * @returns {string} Sanitized HTML
+         */
+        maintenanceHTML(description) {
+            return DOMPurify.sanitize(marked(description));
+        },
+
     }
 };
 </script>
diff --git a/src/router.js b/src/router.js
index a5938c22d..f1cf8a085 100644
--- a/src/router.js
+++ b/src/router.js
@@ -18,12 +18,14 @@ import NotFound from "./pages/NotFound.vue";
 import DockerHosts from "./components/settings/Docker.vue";
 import MaintenanceDetails from "./pages/MaintenanceDetails.vue";
 import ManageMaintenance from "./pages/ManageMaintenance.vue";
+import Plugins from "./components/settings/Plugins.vue";
 
 // Settings - Sub Pages
 import Appearance from "./components/settings/Appearance.vue";
 import General from "./components/settings/General.vue";
 const Notifications = () => import("./components/settings/Notifications.vue");
 import ReverseProxy from "./components/settings/ReverseProxy.vue";
+import Tags from "./components/settings/Tags.vue";
 import MonitorHistory from "./components/settings/MonitorHistory.vue";
 const Security = () => import("./components/settings/Security.vue");
 import Proxies from "./components/settings/Proxies.vue";
@@ -99,6 +101,10 @@ const routes = [
                                 path: "reverse-proxy",
                                 component: ReverseProxy,
                             },
+                            {
+                                path: "tags",
+                                component: Tags,
+                            },
                             {
                                 path: "monitor-history",
                                 component: MonitorHistory,
@@ -119,6 +125,10 @@ const routes = [
                                 path: "backup",
                                 component: Backup,
                             },
+                            {
+                                path: "plugins",
+                                component: Plugins,
+                            },
                             {
                                 path: "about",
                                 component: About,
diff --git a/src/util-frontend.js b/src/util-frontend.js
index 3323f3279..882ee2914 100644
--- a/src/util-frontend.js
+++ b/src/util-frontend.js
@@ -78,3 +78,45 @@ export function getResBaseURL() {
         return "";
     }
 }
+
+/**
+ *
+ * @param {} mqtt wheather or not the regex should take into account the fact that it is an mqtt uri
+ * @returns RegExp The requested regex
+ */
+export function hostNameRegexPattern(mqtt = false) {
+    // mqtt, mqtts, ws and wss schemes accepted by mqtt.js (https://github.com/mqttjs/MQTT.js/#connect)
+    const mqttSchemeRegexPattern = "((mqtt|ws)s?:\\/\\/)?";
+    // Source: https://digitalfortress.tech/tips/top-15-commonly-used-regex/
+    const ipRegexPattern = `((^${mqtt ? mqttSchemeRegexPattern : ""}((([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]))$)|(^((([0-9A-Fa-f]{1,4}:){7}([0-9A-Fa-f]{1,4}|:))|(([0-9A-Fa-f]{1,4}:){6}(:[0-9A-Fa-f]{1,4}|((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){5}(((:[0-9A-Fa-f]{1,4}){1,2})|:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){4}(((:[0-9A-Fa-f]{1,4}){1,3})|((:[0-9A-Fa-f]{1,4})?:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){3}(((:[0-9A-Fa-f]{1,4}){1,4})|((:[0-9A-Fa-f]{1,4}){0,2}:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){2}(((:[0-9A-Fa-f]{1,4}){1,5})|((:[0-9A-Fa-f]{1,4}){0,3}:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){1}(((:[0-9A-Fa-f]{1,4}){1,6})|((:[0-9A-Fa-f]{1,4}){0,4}:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(:(((:[0-9A-Fa-f]{1,4}){1,7})|((:[0-9A-Fa-f]{1,4}){0,5}:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:)))(%.+)?$))`;
+    // Source: https://stackoverflow.com/questions/106179/regular-expression-to-match-dns-hostname-or-ip-address
+    const hostNameRegexPattern = `^${mqtt ? mqttSchemeRegexPattern : ""}([a-zA-Z0-9])?(([a-zA-Z0-9_]|[a-zA-Z0-9_][a-zA-Z0-9\\-_]*[a-zA-Z0-9_])\\.)*([A-Za-z0-9_]|[A-Za-z0-9_][A-Za-z0-9\\-_]*[A-Za-z0-9_])$`;
+
+    return `${ipRegexPattern}|${hostNameRegexPattern}`;
+}
+
+/**
+ * Get the tag color options
+ * Shared between components
+ * @returns {Object[]}
+ */
+export function colorOptions(self) {
+    return [
+        { name: self.$t("Gray"),
+            color: "#4B5563" },
+        { name: self.$t("Red"),
+            color: "#DC2626" },
+        { name: self.$t("Orange"),
+            color: "#D97706" },
+        { name: self.$t("Green"),
+            color: "#059669" },
+        { name: self.$t("Blue"),
+            color: "#2563EB" },
+        { name: self.$t("Indigo"),
+            color: "#4F46E5" },
+        { name: self.$t("Purple"),
+            color: "#7C3AED" },
+        { name: self.$t("Pink"),
+            color: "#DB2777" },
+    ];
+}
diff --git a/src/util.js b/src/util.js
index 09e6d0ee7..6b8f8f374 100644
--- a/src/util.js
+++ b/src/util.js
@@ -315,6 +315,11 @@ function getMonitorRelativeURL(id) {
     return "/dashboard/" + id;
 }
 exports.getMonitorRelativeURL = getMonitorRelativeURL;
+/**
+ * Get relative path for maintenance
+ * @param id ID of maintenance
+ * @returns Formatted relative path
+ */
 function getMaintenanceRelativeURL(id) {
     return "/maintenance/" + id;
 }
@@ -361,6 +366,11 @@ function parseTimeFromTimeObject(obj) {
     return result;
 }
 exports.parseTimeFromTimeObject = parseTimeFromTimeObject;
+/**
+ * Convert ISO date to UTC
+ * @param input Date
+ * @returns ISO Date time
+ */
 function isoToUTCDateTime(input) {
     return dayjs(input).utc().format(exports.SQL_DATETIME_FORMAT);
 }
@@ -379,6 +389,12 @@ function utcToLocal(input, format = exports.SQL_DATETIME_FORMAT) {
     return dayjs.utc(input).local().format(format);
 }
 exports.utcToLocal = utcToLocal;
+/**
+ * Convert local datetime to UTC
+ * @param input Local date
+ * @param format Format to return
+ * @returns Date in requested format
+ */
 function localToUTC(input, format = exports.SQL_DATETIME_FORMAT) {
     return dayjs(input).utc().format(format);
 }
diff --git a/src/util.ts b/src/util.ts
index 99038c8d3..e8a2706e3 100644
--- a/src/util.ts
+++ b/src/util.ts
@@ -352,6 +352,11 @@ export function getMonitorRelativeURL(id: string) {
     return "/dashboard/" + id;
 }
 
+/**
+ * Get relative path for maintenance
+ * @param id ID of maintenance
+ * @returns Formatted relative path
+ */
 export function getMaintenanceRelativeURL(id: string) {
     return "/maintenance/" + id;
 }
@@ -405,7 +410,11 @@ export function parseTimeFromTimeObject(obj : any) {
     return result;
 }
 
-
+/**
+ * Convert ISO date to UTC
+ * @param input Date
+ * @returns ISO Date time
+ */
 export function isoToUTCDateTime(input : string) {
     return dayjs(input).utc().format(SQL_DATETIME_FORMAT);
 }
@@ -424,6 +433,12 @@ export function utcToLocal(input : string, format = SQL_DATETIME_FORMAT) {
     return dayjs.utc(input).local().format(format);
 }
 
+/**
+ * Convert local datetime to UTC
+ * @param input Local date
+ * @param format Format to return
+ * @returns Date in requested format
+ */
 export function localToUTC(input : string, format = SQL_DATETIME_FORMAT) {
     return dayjs(input).utc().format(format);
 }
diff --git a/test/cypress/unit/i18n.spec.js b/test/cypress/unit/i18n.spec.js
new file mode 100644
index 000000000..da63d95a5
--- /dev/null
+++ b/test/cypress/unit/i18n.spec.js
@@ -0,0 +1,44 @@
+import { currentLocale } from "../../../src/i18n";
+
+describe("Test i18n.js", () => {
+
+    it("currentLocale()", () => {
+        const setLanguage = (language) => {
+            Object.defineProperty(window.navigator, 'language', { 
+                value: language, 
+                writable: true 
+            });
+        }
+        setLanguage('en-EN');
+
+        expect(currentLocale()).equal("en");
+
+        setLanguage('zh-HK');
+        expect(currentLocale()).equal("zh-HK");
+
+        // Note that in Safari on iOS prior to 10.2, the country code returned is lowercase: "en-us", "fr-fr" etc.
+        // https://developer.mozilla.org/en-US/docs/Web/API/Navigator/language
+        setLanguage('zh-hk');
+        expect(currentLocale()).equal("en");
+
+        setLanguage('en-US');
+        expect(currentLocale()).equal("en");
+
+        setLanguage('ja-ZZ');
+        expect(currentLocale()).equal("ja");
+
+        setLanguage('zz-ZZ');
+        expect(currentLocale()).equal("en");
+
+        setLanguage('zz-ZZ');
+        expect(currentLocale()).equal("en");
+
+        setLanguage('en');
+        localStorage.locale = "en";
+        expect(currentLocale()).equal("en");
+
+        localStorage.locale = "zh-HK";
+        expect(currentLocale()).equal("zh-HK");
+    });
+
+});
\ No newline at end of file
diff --git a/test/cypress/unit/util-frontend.spec.js b/test/cypress/unit/util-frontend.spec.js
new file mode 100644
index 000000000..9bfd4becc
--- /dev/null
+++ b/test/cypress/unit/util-frontend.spec.js
@@ -0,0 +1,41 @@
+import { hostNameRegexPattern } from "../../../src/util-frontend";
+
+describe("Test util-frontend.js", () => {
+
+    describe("hostNameRegexPattern()", () => {
+        it('should return a valid regex for non mqtt hostnames', () => {
+            const regex = new RegExp(hostNameRegexPattern(false));
+
+            expect(regex.test("www.test.com")).to.be.true;
+            expect(regex.test("127.0.0.1")).to.be.true;
+            expect(regex.test("192.168.1.156")).to.be.true;
+            expect(regex.test(" 192.168.1.145")).to.be.false;
+            expect(regex.test("192.168.1.145 ")).to.be.false;
+            expect(regex.test(" fe80::3282:3ff:ae28:592")).to.be.false;
+            expect(regex.test("fe80::3282:3ff:ae28:592 ")).to.be.false;
+
+            ["mqtt", "mqtts", "ws", "wss"].forEach(schema => {
+                expect(regex.test(`${schema}://www.test.com`)).to.be.false;
+                expect(regex.test(`${schema}://127.0.0.1`)).to.be.false;
+            });
+        });
+        it('should return a valid regex for mqtt hostnames', () => {
+            const hostnameString = hostNameRegexPattern(false);
+            console.log('*********', hostnameString, '***********');
+            const regex = new RegExp(hostNameRegexPattern(true));
+
+            expect(regex.test("www.test.com")).to.be.true;
+            expect(regex.test("127.0.0.1")).to.be.true;
+            expect(regex.test("192.168.1.156")).to.be.true;
+            expect(regex.test(" 192.168.1.145")).to.be.false;
+            expect(regex.test("192.168.1.145 ")).to.be.false;
+            expect(regex.test(" fe80::3282:3ff:ae28:592")).to.be.false;
+            expect(regex.test("fe80::3282:3ff:ae28:592 ")).to.be.false;
+
+            ["mqtt", "mqtts", "ws", "wss"].forEach(schema => {
+                expect(regex.test(`${schema}://www.test.com`)).to.be.true;
+                expect(regex.test(`${schema}://127.0.0.1`)).to.be.true;
+            });
+        });
+    });
+});
diff --git a/tsconfig.json b/tsconfig.json
index c54546424..441d846ed 100644
--- a/tsconfig.json
+++ b/tsconfig.json
@@ -6,7 +6,7 @@
         "module": "commonjs",
         "lib": [
             "es2020",
-            "DOM",
+            "DOM"
         ],
         "removeComments": false,
         "preserveConstEnums": true,