From a147bf1631a204a419398b305a3d03221ae6efb4 Mon Sep 17 00:00:00 2001 From: devinsbdev Date: Sat, 27 May 2023 20:06:48 -0400 Subject: [PATCH] Squashed commit of the following: commit 771ca093311da70e807462c8077fca963a14cedc Author: Louis Lam Date: Thu May 25 13:41:35 2023 +0800 npm update (mainly for socket.io) commit 3cb287a40e85927e05d265006b4ebb5c35f056b2 Merge: 0d1b5321 83a59bd9 Author: Louis Lam Date: Wed May 24 20:46:48 2023 +0800 Merge pull request #3009 from chakflying/ui/url-more-monitor-types UI: Support more monitor types in URL field commit 83a59bd984d5eabadaa90b884b7b48a0a00a5352 Author: Nelson Chan Date: Wed Apr 19 03:20:35 2023 +0800 Fix: Add password filtering commit 446b5fa9e45237924199363059e6ce20792835d5 Author: Nelson Chan Date: Sat Apr 1 23:54:27 2023 +0800 UI: Support more monitor types in URL field commit 0d1b5321ad96687dfaa337e995b2b7ffcc98924e Author: Zaid-maker Date: Wed May 17 18:22:44 2023 +0500 :rocket: Update legacy deps commit 1e1cc86a1095e78010dc6810997de08ec42700ff Author: Louis Lam Date: Sat May 20 01:46:07 2023 +0800 Update Apprise to 1.4.0 commit 9dc02bb8e26c0086d73d6032672747e337d00a79 Author: Louis Lam Date: Tue May 16 21:57:01 2023 +0800 Update .gitignore commit bb15fa01791489e21b3540b29338f8b15ec00bdc Merge: 8d24891b 80c8fd73 Author: Louis Lam Date: Tue May 16 19:51:20 2023 +0800 Merge pull request #3154 from chakflying/fix/clear-data-remove-worker-thread Fix: Remove use of worker threads in clear-old-data commit 8d24891b8ed9708cdf0a4a442bc14a12060830b4 Merge: ba7de3fd 0e516a42 Author: Louis Lam Date: Sat May 13 18:36:04 2023 +0800 Merge pull request #3054 from TechWilk/keyword-not-found-whitespace Trim before truncating "keword not found" message commit ba7de3fd379087b32c30cd0ddbfa677a5d728d92 Merge: f2c294e9 ce70b3fc Author: Louis Lam Date: Sat May 13 18:15:05 2023 +0800 Merge pull request #3152 from AnnAngela/patch-1 feat: show time as server timezone in dingding notification commit 80c8fd737226fcee13bfd165f8fae067d0b20811 Author: Nelson Chan Date: Sat May 13 01:51:23 2023 +0800 Chore: Remove util-worker commit a27386bb92ea7fd3022838d0080431e2477dc29f Author: Nelson Chan Date: Sat May 13 00:55:48 2023 +0800 Fix: Use croner for clear-old-data commit ce70b3fc62636b3da489a6e33a284119dc0600f2 Author: AnnAngela Date: Fri May 12 22:14:59 2023 +0800 feat: add a space to separate the words commit 06fba5b55a8566e7d4d252edc914aa7e03b04b9c Author: AnnAngela Date: Fri May 12 22:04:44 2023 +0800 feat: show time as server timezone in dingding notification commit f2c294e9e5d7e2bd8bcd4f7dd50459e89be26999 Merge: a1adc30a 332e5493 Author: Louis Lam Date: Fri May 12 13:56:03 2023 +0800 Merge pull request #3150 from theitguycj/master Update README.md commit 332e54937ee8308bd9e2c715b78274b417de1a4b Author: The IT Guy CJ <130261264+theitguycj@users.noreply.github.com> Date: Thu May 11 23:19:09 2023 -0500 Update README.md commit a1adc30a898337e95e7f3c9ae1be2de1f3e8c8ef Author: Louis Lam Date: Thu May 11 14:54:00 2023 +0800 Fix: Add back PagerTree commit 6ce882ad4af28cd78ec8eb1b2a3445d5d3fbc642 Author: Louis Lam Date: Wed May 10 22:51:44 2023 +0800 Update README.md commit e392d12585879325907f86f25fccc848ef3986bf Author: Louis Lam Date: Tue May 9 23:37:51 2023 +0800 Mention in the README that Node.js 20 is not supported due to a weird issue commit 253214ad2b5e9900520cf325661a3fa6ea0a1f07 Merge: 33de7bdb 99750508 Author: Louis Lam Date: Tue May 9 20:43:30 2023 +0800 Merge pull request #3024 from chakflying/feat/edit-tag-multiselect UI: Use vue-multiselect in Edit Tag & Styling Fixes commit 33de7bdb1cb72704b9dbca953eefce56f3884340 Author: Louis Lam Date: Tue May 9 00:45:31 2023 +0800 Merge conflict commit 7f5d0e549038b9b74ef507bbc4897f556f074524 Merge: 8a3bce44 1a344c13 Author: Louis Lam Date: Tue May 9 00:42:11 2023 +0800 Merge remote-tracking branch 'origin/1.21.X' commit 1a344c137106f393609d319cf720399ee176732c Author: Louis Lam Date: Tue May 9 00:28:29 2023 +0800 Update to 1.21.3 commit 28b0f8fc0043a8cb4047a4729c5cef33c43a8d85 Author: Louis Lam Date: Mon May 8 22:52:57 2023 +0800 Update dependencies commit 0eaaa8b6fab88d75c8a7211001b6194b191706cf Author: Louis Lam Date: Mon May 8 22:52:41 2023 +0800 Minor commit 5cd506e340f4f9a596a6098b30cad9f9c7e05fda Author: Louis Lam Date: Mon May 8 22:39:32 2023 +0800 Minor commit f0beccf6bff5467bcc60c75760fd66f85baedca4 Author: Louis Lam Date: Mon May 8 22:14:58 2023 +0800 Fix `Same As Server Timezone` do not save correctly commit 72c16c3aa24c2ff82f9c8a683db3473e83ce1a3e Author: Louis Lam Date: Mon May 8 04:26:11 2023 +0800 Fix eslint warnings commit aa8454b73f0627f156f77ad5c8470c0dd4e267c3 Author: Louis Lam Date: Mon May 8 04:14:24 2023 +0800 Slightly improve error check on maintenance edit page commit d23cb0b382fdd828d08b6aaacab0ee499f758fb7 Author: Louis Lam Date: Mon May 8 04:08:30 2023 +0800 Fix maintenance do not start after 1.21.2 commit 9975050872d8370014d9e938fecd9e85be1734e0 Author: Nelson Chan Date: Wed Apr 5 03:07:37 2023 +0800 Chore: Fix line break commit f8c29095765246efce96da5ee6f96fe551ca9023 Author: Nelson Chan Date: Wed Apr 5 02:09:36 2023 +0800 UI: Improve styling commit fcfe13e52deab73acbde2eeb40b0866da48f490e Author: Nelson Chan Date: Wed Apr 5 02:09:22 2023 +0800 Feat: Use vue-multiselect in Edit Tag commit 8a3bce44ef8fdd8d2ee4b72ec5de064062c8a7b1 Author: Louis Lam Date: Tue May 2 16:22:00 2023 +0800 Update dependenices commit dfe6f52f6acaa23389cb3ddfda80b76b601f7357 Author: Louis Lam Date: Tue May 2 16:17:37 2023 +0800 Add test for Node.js 20, drop 19 commit 333a631389c3161b43b23782f85cd1bf7a45d778 Merge: 74dd07c3 eaa94857 Author: Louis Lam Date: Sat Apr 29 12:44:31 2023 +0800 Merge pull request #3106 from shihaamabr/master Fix typo in dashboard TCP Port items commit eaa948579bec692107152c26916f84a87f88666d Author: Shihaam Abdul Rahman Date: Thu Apr 27 12:34:01 2023 +0500 Fix typo in dashboard TCP Port times commit 74dd07c3ca57b4aaf6e342cf51f0d212126041c6 Merge: f75cf3a1 ba82abe5 Author: Louis Lam Date: Tue Apr 25 21:10:25 2023 +0800 Merge pull request #3101 from stumpylog/feature/cloudflare-pkgs Install cloudflared via Cloudflare Package Repository commit f75cf3a186c1389e33b7fbf0c5b0fd917ee535eb Merge: eb9c7480 a3e31b22 Author: Louis Lam Date: Tue Apr 25 18:24:44 2023 +0800 Merge pull request #2905 from Sharknoon/ntfy-bearer-authorization Added option for notification provider ntfy to use access tokens commit a3e31b22bc958c3619b172abf578d6c3ad566970 Author: Louis Lam Date: Tue Apr 25 18:22:17 2023 +0800 Minor commit 078d1f96a50cd7ee0e0f50f5486f4b943a71b6f4 Author: Louis Lam Date: Tue Apr 25 18:17:32 2023 +0800 Better handling for old added ntfy notifications commit 8207f1639624d9f92e895406c1c4eadd162a403e Merge: 11f4cb87 eb9c7480 Author: Louis Lam Date: Tue Apr 25 18:07:52 2023 +0800 Merge remote-tracking branch 'origin/master' into ntfy-bearer-authorization commit ba82abe5f373a1b12ad6a020f4625ba2a3b79215 Author: Trenton Holmes <797416+stumpylog@users.noreply.github.com> Date: Sun Apr 23 20:09:31 2023 -0700 Updates the install of cloudflared to utilize the Cloudflare Package Repository commit 0e516a42e5aaa9ae2db6fc1827dcde0b94f1301e Author: Christopher Wilkinson Date: Sat Apr 8 17:23:29 2023 +0100 Trim before truncating "keword not found" message commit 11f4cb87257a05098b40af93cc20d38d990ba7a8 Merge: 1f7f1f70 1bf97e70 Author: Josua Frank Date: Mon Apr 10 16:06:53 2023 +0200 Merge branch 'louislam:master' into ntfy-bearer-authorization commit 1f7f1f70bf60913fe606a1350d1181048a9bdad7 Merge: 23af66f6 be7d3f61 Author: Josua Frank Date: Thu Apr 6 10:55:28 2023 +0200 Merge branch 'louislam:master' into ntfy-bearer-authorization commit 23af66f618d3b6d11f10005bc19f605367e43be4 Merge: 6b078b83 03aa685d Author: Josua Frank Date: Mon Apr 3 21:17:53 2023 +0200 Merge branch 'louislam:master' into ntfy-bearer-authorization commit 6b078b83bd810d937c78975809a3a35a2bb39925 Merge: ba52e1c8 8f449ab7 Author: Josua Frank Date: Mon Apr 3 08:33:05 2023 +0200 Merge branch 'master' into ntfy-bearer-authorization commit ba52e1c885624f38d56d53a2beacb87b22fe444f Merge: fc4312ca dcc065c8 Author: Josua Frank Date: Fri Mar 31 11:31:13 2023 +0200 Merge branch 'louislam:master' into ntfy-bearer-authorization commit fc4312ca1a9e8e301383b2ed5fe02e37b5bf4fe0 Merge: df476096 fbdeb30c Author: Josua Frank Date: Sun Mar 26 19:09:48 2023 +0200 Merge branch 'master' into ntfy-bearer-authorization commit df476096714953c7c083a025d69e69a6e2a5fd7c Author: Josua Frank Date: Tue Mar 21 13:55:51 2023 +0100 Added default dropdown value commit e63f7562f8a972bd738aeeb3c3034247a66ec65d Author: Josua Frank Date: Tue Mar 21 13:48:00 2023 +0100 linter fixes commit 8921ed0cfff00e1690b1714017d7cad8fa356835 Author: Josua Frank Date: Tue Mar 21 13:44:06 2023 +0100 fix indentation of language json files commit 35a56dd9e05679d79abafa031cd0678cfc627678 Author: Josua Frank Date: Tue Mar 21 13:40:24 2023 +0100 Added dropdown for authentication methods commit 442f54de844f46c44a83febec2c81fac54c6f34a Merge: e8814e84 72317633 Author: Josua Frank Date: Tue Mar 21 13:01:49 2023 +0100 Merge branch 'louislam:master' into ntfy-bearer-authorization commit e8814e84791eab036d2fb744d5d8a5d0547e0b3e Author: Josua Frank Date: Wed Mar 8 13:28:02 2023 +0000 added option for ntfy access tokens --- .gitignore | 3 +- README.md | 366 ++-- docker/alpine-base.dockerfile | 16 +- docker/debian-base.dockerfile | 56 +- extra/download-cloudflared.js | 48 - server/database.js | 342 +-- server/jobs.js | 93 +- server/jobs/clear-old-data.js | 100 +- server/model/maintenance.js | 829 +++---- server/model/monitor.js | 2 +- server/notification-providers/dingding.js | 192 +- server/notification-providers/ntfy.js | 150 +- server/notification-providers/opsgenie.js | 194 +- server/notification-providers/telegram.js | 71 +- server/server.js | 2 +- src/assets/multiselect.scss | 154 +- src/components/NotificationDialog.vue | 637 +++--- src/components/Tag.vue | 172 +- src/components/TagEditDialog.vue | 951 +++++---- src/components/notifications/Ntfy.vue | 130 +- src/lang/de-CH.json | 1502 ++++++------- src/lang/de-DE.json | 1508 ++++++------- src/lang/en.json | 1444 ++++++------- src/pages/Details.vue | 1104 +++++----- src/pages/EditMaintenance.vue | 1170 +++++----- src/pages/StatusPage.vue | 2370 ++++++++++----------- 26 files changed, 6834 insertions(+), 6772 deletions(-) delete mode 100644 extra/download-cloudflared.js diff --git a/.gitignore b/.gitignore index 491dbc5b7b..04ea97fbf7 100644 --- a/.gitignore +++ b/.gitignore @@ -48,4 +48,5 @@ dist-ssr #!/data/.gitkeep #.vscode -### End of .gitignore content \ No newline at end of file +.vs +.vscode diff --git a/README.md b/README.md index 962f120cd8..6cfd4f66c7 100644 --- a/README.md +++ b/README.md @@ -1,181 +1,185 @@ -# Uptime Kuma - - -[![GitHub Sponsors](https://img.shields.io/github/sponsors/louislam?label=GitHub%20Sponsors)](https://github.com/sponsors/louislam) -Translation status - - -
- -
- -Uptime Kuma is an easy-to-use self-hosted monitoring tool. - - - -## 🥔 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)) - -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/lang) -* Multiple status pages -* Map status pages to specific domains -* Ping chart -* Certificate info -* Proxy support -* 2FA support - -## 🔧 How to Install - -### 🐳 Docker - -```bash -docker run -d --restart=always -p 3001:3001 -v uptime-kuma:/app/data --name uptime-kuma louislam/uptime-kuma:1 -``` - -⚠️ Please use a **local volume** only. Other types such as NFS are not supported. - -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 running Uptime Kuma in the background - -```bash -# Update your npm to the latest version -npm install npm -g - -git clone https://github.com/louislam/uptime-kuma.git -cd uptime-kuma -npm run setup - -# Option 1. Try it -node server/server.js - -# (Recommended) Option 2. Run in background using PM2 -# Install PM2 if you don't have it: -npm install pm2 -g && pm2 install pm2-logrotate - -# Start Server -pm2 start server/server.js --name uptime-kuma - - -``` -Uptime Kuma is now running on http://localhost:3001 - -More useful PM2 Commands - -```bash -# If you want to see the current console output -pm2 monit - -# If you want to add it to startup -pm2 save && pm2 startup -``` - -### Advanced Installation - -If you need more options or need to browse via a reverse proxy, please read: - -https://github.com/louislam/uptime-kuma/wiki/%F0%9F%94%A7-How-to-Install - -## 🆙 How to Update - -Please read: - -https://github.com/louislam/uptime-kuma/wiki/%F0%9F%86%99-How-to-Update - -## 🆕 What's Next? - -I will mark requests/issues to the next milestone. - -https://github.com/louislam/uptime-kuma/milestones - -Project Plan: - -https://github.com/users/louislam/projects/4/views/1 - -## ❤️ Sponsors - -Thank you so much! (GitHub Sponsors will be updated manually. OpenCollective sponsors will be updated automatically, the list will be cached by GitHub though. It may need some time to be updated) - - - -## 🖼 More Screenshots - -Light Mode: - - - -Status Page: - - - -Settings Page: - - - -Telegram Notification Sample: - - - -## Motivation - -* I was looking for a self-hosted monitoring tool like "Uptime Robot", but it is hard to find a suitable one. One of the close ones is statping. Unfortunately, it is not stable and no longer maintained. -* Want to build a fancy UI. -* Learn Vue 3 and vite.js. -* Show the power of Bootstrap 5. -* Try to use WebSocket with SPA instead of REST API. -* Deploy my first Docker image to Docker Hub. - -If you love this project, please consider giving me a ⭐. - -## 🗣️ Discussion - -### Issues Page - -You can discuss or ask for help in [issues](https://github.com/louislam/uptime-kuma/issues). - -### Subreddit - -My Reddit account: [u/louislamlam](https://reddit.com/u/louislamlam). -You can mention me if you ask a question on Reddit. -[r/Uptime kuma](https://www.reddit.com/r/UptimeKuma/) - -## Contribute - -### Test Pull Requests - -There are a lot of pull requests right now, but I don't have time to test them all. - -If you want to help, you can check this: -https://github.com/louislam/uptime-kuma/wiki/Test-Pull-Requests - -### Test Beta Version - -Check out the latest beta release here: https://github.com/louislam/uptime-kuma/releases - -### Bug Reports / Feature Requests -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 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. - -### Create Pull Requests -If you want to modify Uptime Kuma, please read this guide and follow the rules here: https://github.com/louislam/uptime-kuma/blob/master/CONTRIBUTING.md +# Uptime Kuma + + +[![GitHub Sponsors](https://img.shields.io/github/sponsors/louislam?label=GitHub%20Sponsors)](https://github.com/sponsors/louislam) +Translation status + + +
+ +
+ +Uptime Kuma is an easy-to-use self-hosted monitoring tool. + + + +## 🥔 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)) + +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/lang) +* Multiple status pages +* Map status pages to specific domains +* Ping chart +* Certificate info +* Proxy support +* 2FA support + +## 🔧 How to Install + +### 🐳 Docker + +```bash +docker run -d --restart=always -p 3001:3001 -v uptime-kuma:/app/data --name uptime-kuma louislam/uptime-kuma:1 +``` + +⚠️ Please use a **local volume** only. Other types such as NFS are not supported. + +Uptime Kuma is now running on http://localhost:3001 + +### 💪🏻 Non-Docker + +Required Tools: +- [Node.js](https://nodejs.org/en/download/) 14 / 16 / 18 (20 is not supported) +- [npm](https://docs.npmjs.com/cli/) >= 7 +- [Git](https://git-scm.com/downloads) +- [pm2](https://pm2.keymetrics.io/) - For running Uptime Kuma in the background + +```bash +# Update your npm to the latest version +npm install npm -g + +git clone https://github.com/louislam/uptime-kuma.git +cd uptime-kuma +npm run setup + +# Option 1. Try it +node server/server.js + +# (Recommended) Option 2. Run in background using PM2 +# Install PM2 if you don't have it: +npm install pm2 -g && pm2 install pm2-logrotate + +# Start Server +pm2 start server/server.js --name uptime-kuma + + +``` +Uptime Kuma is now running on http://localhost:3001 + +More useful PM2 Commands + +```bash +# If you want to see the current console output +pm2 monit + +# If you want to add it to startup +pm2 save && pm2 startup +``` + +### Windows Portable (x64) + +https://github.com/louislam/uptime-kuma/releases/download/1.21.0/uptime-kuma-win64-portable-1.0.0.zip + +### Advanced Installation + +If you need more options or need to browse via a reverse proxy, please read: + +https://github.com/louislam/uptime-kuma/wiki/%F0%9F%94%A7-How-to-Install + +## 🆙 How to Update + +Please read: + +https://github.com/louislam/uptime-kuma/wiki/%F0%9F%86%99-How-to-Update + +## 🆕 What's Next? + +I will mark requests/issues to the next milestone. + +https://github.com/louislam/uptime-kuma/milestones + +Project Plan: + +https://github.com/users/louislam/projects/4/views/1 + +## ❤️ Sponsors + +Thank you so much! (GitHub Sponsors will be updated manually. OpenCollective sponsors will be updated automatically, the list will be cached by GitHub though. It may need some time to be updated) + + + +## 🖼 More Screenshots + +Light Mode: + + + +Status Page: + + + +Settings Page: + + + +Telegram Notification Sample: + + + +## Motivation + +* I was looking for a self-hosted monitoring tool like "Uptime Robot", but it is hard to find a suitable one. One of the close ones is statping. Unfortunately, it is not stable and no longer maintained. +* Want to build a fancy UI. +* Learn Vue 3 and vite.js. +* Show the power of Bootstrap 5. +* Try to use WebSocket with SPA instead of REST API. +* Deploy my first Docker image to Docker Hub. + +If you love this project, please consider giving me a ⭐. + +## 🗣️ Discussion + +### Issues Page + +You can discuss or ask for help in [issues](https://github.com/louislam/uptime-kuma/issues). + +### Subreddit + +My Reddit account: [u/louislamlam](https://reddit.com/u/louislamlam). +You can mention me if you ask a question on Reddit. +[r/Uptime kuma](https://www.reddit.com/r/UptimeKuma/) + +## Contribute + +### Test Pull Requests + +There are a lot of pull requests right now, but I don't have time to test them all. + +If you want to help, you can check this: +https://github.com/louislam/uptime-kuma/wiki/Test-Pull-Requests + +### Test Beta Version + +Check out the latest beta release here: https://github.com/louislam/uptime-kuma/releases + +### Bug Reports / Feature Requests +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 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. + +### Create Pull Requests +If you want to modify Uptime Kuma, please read this guide and follow the rules here: https://github.com/louislam/uptime-kuma/blob/master/CONTRIBUTING.md diff --git a/docker/alpine-base.dockerfile b/docker/alpine-base.dockerfile index 6c5b15a39c..ee2090257f 100644 --- a/docker/alpine-base.dockerfile +++ b/docker/alpine-base.dockerfile @@ -1,8 +1,8 @@ -# DON'T UPDATE TO alpine3.13, 1.14, see #41. -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 git && \ - pip3 --no-cache-dir install apprise==1.3.0 && \ - rm -rf /root/.cache +# DON'T UPDATE TO alpine3.13, 1.14, see #41. +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 git && \ + pip3 --no-cache-dir install apprise==1.4.0 && \ + rm -rf /root/.cache diff --git a/docker/debian-base.dockerfile b/docker/debian-base.dockerfile index be0d33a254..fd57cf91a5 100644 --- a/docker/debian-base.dockerfile +++ b/docker/debian-base.dockerfile @@ -1,28 +1,28 @@ -# DON'T UPDATE TO node:14-bullseye-slim, see #372. -# If the image changed, the second stage image should be changed too -FROM node:16-buster-slim -ARG TARGETPLATFORM - -WORKDIR /app - -# Install Curl -# Install Apprise, add sqlite3 cli for debugging in the future, iputils-ping for ping, util-linux for setpriv -# 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 git && \ - pip3 --no-cache-dir install apprise==1.3.0 && \ - rm -rf /var/lib/apt/lists/* && \ - apt --yes autoremove - -# Install cloudflared -# dpkg --add-architecture arm: cloudflared do not provide armhf, this is workaround. Read more: https://github.com/cloudflare/cloudflared/issues/583 -COPY extra/download-cloudflared.js ./extra/download-cloudflared.js -RUN node ./extra/download-cloudflared.js $TARGETPLATFORM && \ - dpkg --add-architecture arm && \ - apt update && \ - apt --yes --no-install-recommends install ./cloudflared.deb && \ - rm -rf /var/lib/apt/lists/* && \ - rm -f cloudflared.deb && \ - apt --yes autoremove - +# DON'T UPDATE TO node:14-bullseye-slim, see #372. +# If the image changed, the second stage image should be changed too +FROM node:16-buster-slim +ARG TARGETPLATFORM + +WORKDIR /app + +# Install Curl +# Install Apprise, add sqlite3 cli for debugging in the future, iputils-ping for ping, util-linux for setpriv +# 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-get update && \ + apt-get --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 git curl ca-certificates && \ + pip3 --no-cache-dir install apprise==1.4.0 && \ + rm -rf /var/lib/apt/lists/* && \ + apt --yes autoremove + +# Install cloudflared +RUN set -eux && \ + mkdir -p --mode=0755 /usr/share/keyrings && \ + curl --fail --show-error --silent --location --insecure https://pkg.cloudflare.com/cloudflare-main.gpg --output /usr/share/keyrings/cloudflare-main.gpg && \ + echo 'deb [signed-by=/usr/share/keyrings/cloudflare-main.gpg] https://pkg.cloudflare.com/cloudflared buster main' | tee /etc/apt/sources.list.d/cloudflared.list && \ + apt-get update && \ + apt-get install --yes --no-install-recommends cloudflared && \ + cloudflared version && \ + rm -rf /var/lib/apt/lists/* && \ + apt --yes autoremove + diff --git a/extra/download-cloudflared.js b/extra/download-cloudflared.js deleted file mode 100644 index dae0259d4e..0000000000 --- a/extra/download-cloudflared.js +++ /dev/null @@ -1,48 +0,0 @@ -// - -const http = require("https"); // or 'https' for https:// URLs -const fs = require("fs"); - -const platform = process.argv[2]; - -if (!platform) { - console.error("No platform??"); - process.exit(1); -} - -let arch = null; - -if (platform === "linux/amd64") { - arch = "amd64"; -} else if (platform === "linux/arm64") { - arch = "arm64"; -} else if (platform === "linux/arm/v7") { - arch = "arm"; -} else { - console.error("Invalid platform?? " + platform); -} - -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) { - console.log("Redirect to " + res.headers.location); - get(res.headers.location); - } else if (res.statusCode >= 200 && res.statusCode < 300) { - res.pipe(file); - - res.on("end", function () { - console.log("Downloaded"); - }); - } else { - console.error(res.statusCode); - process.exit(1); - } - }); -} diff --git a/server/database.js b/server/database.js index 4de3d43a03..a70fbe59f3 100644 --- a/server/database.js +++ b/server/database.js @@ -1,171 +1,171 @@ -const { R } = require("redbean-node"); -const { log, sleep } = require("../src/util"); -const knex = require("knex"); -const fs = require("fs"); - -/** - * Database & App Data Folder - */ -class Database { - /** - * Data Dir (Default: ./data) - */ - static dataDir = process.env.DATA_DIR || "./data/"; - - /** - * User Upload Dir (Default: ./data/upload) - */ - static uploadDir = Database.dataDir + "upload/"; - - static noReject = true; - - static dbHost = process.env.DATABASE_HOST; - static dbPort = process.env.DATABASE_PORT; - static dbName = process.env.DATABASE_NAME; - static dbPass = process.env.DATABASE_PASS; - static dbUser = process.env.DATABASE_USER; - - /** - * Connect to the database - * @param {boolean} [testMode=false] Should the connection be - * started in test mode? - * @param {boolean} [autoloadModels=true] Should models be - * automatically loaded? - * @param {boolean} [noLog=false] Should logs not be output? - * @returns {Promise} - */ - static async connect(testMode = false, autoloadModels = true, noLog = false) { - - const acquireConnectionTimeout = 10 * 1000; - const idleTimeout = 300 * 1000; - - const knexInstance = knex({ - client: 'pg', - connection: { - host: Database.dbHost, - port: Database.dbPort, - user: Database.dbUser, - password: Database.dbPass, - database: Database.dbName, - // acquireConnectionTimeout: acquireConnectionTimeout - }, - pool: { - min: 1, - max: 20, - idleTimeoutMillis: idleTimeout, - propagateCreateError: false, - acquireTimeoutMillis: acquireConnectionTimeout, - }, - }); - - R.setup(knexInstance); - - if (process.env.SQL_LOG === "1") { - R.debug(true); - } - - if (process.env.DEV_DEBUG === "1") { - R.devDebug = true; - } - - // Auto map the model to a bean object - R.freeze(true); - - if (autoloadModels) { - R.autoloadModels("./server/model"); - } - - try { - let ok = await R.count("monitor", undefined, [], false); - if ((Number(ok) >= 0)) { - log.info("db", "Found an existing database to use, dbinit not needed."); - } else { - throw new Error("wtfff"); // this would be an odd case can't think of what would cause it - } - } catch (error) { - if (RegExp(/Knex: Timeout.*/).test(error.message)) { - log.error("db", "Timeout.. Does the database in /data/.env exist? Are you certain credentials in /data/.env are correct?"); - throw new Error("No database to work with..."); - } else if (RegExp(/.*does not exist$/).test(error.message)) { - /* run database setup; it very likely doesn't exist */ - log.info("db", "Looks like database tables don't exist, we'll build them out now ..."); - const sql_script = fs.readFileSync('./db/pginit.sql', { 'encoding': 'utf-8' }); - const dbsetup_result = await R.exec(sql_script, []); - console.log(dbsetup_result); - } else { - throw error; - } - } - } - - /** get db nfo */ - static async getDbVersion() { - let raw = await R.getCell('SELECT version();', [], false); - let ver = raw.split(',')[0]; - return ver; - } - - /** - * Aquire a direct connection to database - * @returns {any} - */ - static getDirectDatabaseConnection() { - return R.knex.client.acquireConnection(); - } - - /** - * Special handle, because tarn.js throw a promise reject that cannot be caught - * @returns {Promise} - */ - static async close() { - const listener = (reason, p) => { - Database.noReject = false; - }; - process.addListener("unhandledRejection", listener); - - log.info("db", "Closing the database"); - - while (true) { - Database.noReject = true; - await R.close(); - await sleep(2000); - - if (Database.noReject) { - break; - } else { - log.info("db", "Waiting to close the database"); - } - } - log.info("db", "PostgreSQL closed!"); - - process.removeListener("unhandledRejection", listener); - } - - /** Get the size of the database */ - static async getSize(table = 'all') { - log.debug("db", "Database.getSize()"); - let dbsize = await R.getCell('SELECT pg_size_pretty(pg_database_size(?));', [ Database.dbName], false); - log.debug("db", dbsize); - return dbsize; - } - - /** - * Shrink the database - * @returns {Promise} - */ - static async shrink() { - await R.getCell("VACUUM", [], false); - await sleep(500); - } - - /** - * Shring the database (FULL) - * @returns {Promise} + */ + static async connect(testMode = false, autoloadModels = true, noLog = false) { + + const acquireConnectionTimeout = 10 * 1000; + const idleTimeout = 300 * 1000; + + const knexInstance = knex({ + client: 'pg', + connection: { + host: Database.dbHost, + port: Database.dbPort, + user: Database.dbUser, + password: Database.dbPass, + database: Database.dbName, + // acquireConnectionTimeout: acquireConnectionTimeout + }, + pool: { + min: 1, + max: 20, + idleTimeoutMillis: idleTimeout, + propagateCreateError: false, + acquireTimeoutMillis: acquireConnectionTimeout, + }, + }); + + R.setup(knexInstance); + + if (process.env.SQL_LOG === "1") { + R.debug(true); + } + + if (process.env.DEV_DEBUG === "1") { + R.devDebug = true; + } + + // Auto map the model to a bean object + R.freeze(true); + + if (autoloadModels) { + R.autoloadModels("./server/model"); + } + + try { + let ok = await R.count("monitor", undefined, [], false); + if ((Number(ok) >= 0)) { + log.info("db", "Found an existing database to use, dbinit not needed."); + } else { + throw new Error("wtfff"); // this would be an odd case can't think of what would cause it + } + } catch (error) { + if (RegExp(/Knex: Timeout.*/).test(error.message)) { + log.error("db", "Timeout.. Does the database in /data/.env exist? Are you certain credentials in /data/.env are correct?"); + throw new Error("No database to work with..."); + } else if (RegExp(/.*does not exist$/).test(error.message)) { + /* run database setup; it very likely doesn't exist */ + log.info("db", "Looks like database tables don't exist, we'll build them out now ..."); + const sql_script = fs.readFileSync('./db/pginit.sql', { 'encoding': 'utf-8' }); + const dbsetup_result = await R.exec(sql_script, []); + console.log(dbsetup_result); + } else { + throw error; + } + } + } + + /** get db nfo */ + static async getDbVersion() { + let raw = await R.getCell('SELECT version();', [], false); + let ver = raw.split(',')[0]; + return ver; + } + + /** + * Aquire a direct connection to database + * @returns {any} + */ + static getDirectDatabaseConnection() { + return R.knex.client.acquireConnection(); + } + + /** + * Special handle, because tarn.js throw a promise reject that cannot be caught + * @returns {Promise} + */ + static async close() { + const listener = (reason, p) => { + Database.noReject = false; + }; + process.addListener("unhandledRejection", listener); + + log.info("db", "Closing the database"); + + while (true) { + Database.noReject = true; + await R.close(); + await sleep(2000); + + if (Database.noReject) { + break; + } else { + log.info("db", "Waiting to close the database"); + } + } + log.info("db", "PostgreSQL closed!"); + + process.removeListener("unhandledRejection", listener); + } + + /** Get the size of the database */ + static async getSize(table = 'all') { + log.debug("db", "Database.getSize()"); + let dbsize = await R.getCell('SELECT pg_size_pretty(pg_database_size(?));', [ Database.dbName], false); + log.debug("db", dbsize); + return dbsize; + } + + /** + * Shrink the database + * @returns {Promise} + */ + static async shrink() { + await R.getCell("VACUUM", [], false); + await sleep(500); + } + + /** + * Shring the database (FULL) + * @returns {Promise { - log.info("jobs", message); - } - }); - - bree.start(); - return bree; -}; - -/** Stop all background jobs if running */ -const stopBackgroundJobs = function () { - if (bree) { - bree.stop(); - } -}; - -module.exports = { - initBackgroundJobs, - stopBackgroundJobs -}; +const { UptimeKumaServer } = require("./uptime-kuma-server"); +const { clearOldData } = require("./jobs/clear-old-data"); +const Cron = require("croner"); + +const jobs = [ + { + name: "clear-old-data", + interval: "14 03 * * *", + jobFunc: clearOldData, + croner: null, + }, +]; + +/** + * Initialize background jobs + * @returns {Promise} + */ +const initBackgroundJobs = async function () { + const timezone = await UptimeKumaServer.getInstance().getTimezone(); + + for (const job of jobs) { + const cornerJob = new Cron( + job.interval, + { + name: job.name, + timezone, + }, + job.jobFunc, + ); + job.croner = cornerJob; + } + +}; + +/** Stop all background jobs if running */ +const stopBackgroundJobs = function () { + for (const job of jobs) { + if (job.croner) { + job.croner.stop(); + job.croner = null; + } + } +}; + +module.exports = { + initBackgroundJobs, + stopBackgroundJobs +}; diff --git a/server/jobs/clear-old-data.js b/server/jobs/clear-old-data.js index f599f626fd..beb9a4cbd1 100644 --- a/server/jobs/clear-old-data.js +++ b/server/jobs/clear-old-data.js @@ -1,48 +1,52 @@ -const { log, exit, connectDb } = require("./util-worker"); -const { R } = require("redbean-node"); -// const { R } = require("redbean-node"); -const { setSetting, setting } = require("../util-server"); - -const DEFAULT_KEEP_PERIOD = 180; - -(async () => { - await connectDb(); - - let period = await setting("keepDataPeriodDays"); - - // Set Default Period - if (period == null) { - await setSetting("keepDataPeriodDays", DEFAULT_KEEP_PERIOD, "general"); - period = DEFAULT_KEEP_PERIOD; - } - - // Try parse setting - let parsedPeriod; - try { - parsedPeriod = parseInt(period); - } catch (_) { - log("Failed to parse setting, resetting to default.."); - await setSetting("keepDataPeriodDays", DEFAULT_KEEP_PERIOD, "general"); - parsedPeriod = DEFAULT_KEEP_PERIOD; - } - - if (parsedPeriod < 1) { - log(`Data deletion has been disabled as period is less than 1. Period is ${parsedPeriod} days.`); - } else { - - log(`Clearing Data older than ${parsedPeriod} days...`); - - try { - await R.exec( - "DELETE FROM ?? WHERE ?? < DATETIME('now', '-' || ? || ' days') ", - 'heartbeat', - 'time', - [ parsedPeriod ] - ); - } catch (e) { - log(`Failed to clear old data: ${e.message}`); - } - } - - exit(); -})(); +const { R } = require("redbean-node"); +const { log } = require("../../src/util"); +const { setSetting, setting } = require("../util-server"); + +const DEFAULT_KEEP_PERIOD = 180; + +/** + * Clears old data from the heartbeat table of the database. + * @return {Promise} A promise that resolves when the data has been cleared. + */ + +const clearOldData = async () => { + let period = await setting("keepDataPeriodDays"); + + // Set Default Period + if (period == null) { + await setSetting("keepDataPeriodDays", DEFAULT_KEEP_PERIOD, "general"); + period = DEFAULT_KEEP_PERIOD; + } + + // Try parse setting + let parsedPeriod; + try { + parsedPeriod = parseInt(period); + } catch (_) { + log.warn("clearOldData", "Failed to parse setting, resetting to default.."); + await setSetting("keepDataPeriodDays", DEFAULT_KEEP_PERIOD, "general"); + parsedPeriod = DEFAULT_KEEP_PERIOD; + } + + if (parsedPeriod < 1) { + log.info("clearOldData", `Data deletion has been disabled as period is less than 1. Period is ${parsedPeriod} days.`); + } else { + + log.debug("clearOldData", `Clearing Data older than ${parsedPeriod} days...`); + + try { + await R.exec( + "DELETE FROM ?? WHERE ?? < DATETIME('now', '-' || ? || ' days') ", + 'heartbeat', + 'time', + [ parsedPeriod ] + ); + } catch (e) { + log.error("clearOldData", `Failed to clear old data: ${e.message}`); + } + } +}; + +module.exports = { + clearOldData, +}; diff --git a/server/model/maintenance.js b/server/model/maintenance.js index f30846005e..f18eb026d0 100644 --- a/server/model/maintenance.js +++ b/server/model/maintenance.js @@ -1,414 +1,415 @@ -const { BeanModel } = require("redbean-node/dist/bean-model"); -const { parseTimeObject, parseTimeFromTimeObject, log } = require("../../src/util"); -const { R } = require("redbean-node"); -const dayjs = require("dayjs"); -const Cron = require("croner"); -const { UptimeKumaServer } = require("../uptime-kuma-server"); -const apicache = require("../modules/apicache"); - -class Maintenance extends BeanModel { - - /** - * Return an object that ready to parse to JSON for public - * Only show necessary data to public - * @returns {Object} - */ - async toPublicJSON() { - - let dateRange = []; - if (this.start_date) { - dateRange.push(this.start_date); - } else { - dateRange.push(null); - } - - if (this.end_date) { - dateRange.push(this.end_date); - } - - let timeRange = []; - let startTime = parseTimeObject(this.start_time); - timeRange.push(startTime); - let endTime = parseTimeObject(this.end_time); - timeRange.push(endTime); - - let obj = { - id: this.id, - title: this.title, - description: this.description, - strategy: this.strategy, - intervalDay: this.interval_day, - active: !!this.active, - dateRange: dateRange, - timeRange: timeRange, - weekdays: (this.weekdays) ? JSON.parse(this.weekdays) : [], - daysOfMonth: (this.days_of_month) ? JSON.parse(this.days_of_month) : [], - timeslotList: [], - cron: this.cron, - duration: this.duration, - durationMinutes: parseInt(this.duration / 60), - timezone: await this.getTimezone(), - timezoneOffset: await this.getTimezoneOffset(), - status: await this.getStatus(), - }; - - if (this.strategy === "manual") { - // Do nothing, no timeslots - } else if (this.strategy === "single") { - obj.timeslotList.push({ - startDate: this.start_date, - endDate: this.end_date, - }); - } else { - // Should be cron or recurring here - if (this.beanMeta.job) { - let runningTimeslot = this.getRunningTimeslot(); - - if (runningTimeslot) { - obj.timeslotList.push(runningTimeslot); - } - - let nextRunDate = this.beanMeta.job.nextRun(); - if (nextRunDate) { - let startDateDayjs = dayjs(nextRunDate); - - let startDate = startDateDayjs.toISOString(); - let endDate = startDateDayjs.add(this.duration, "second").toISOString(); - - obj.timeslotList.push({ - startDate, - endDate, - }); - } - } - } - - if (!Array.isArray(obj.weekdays)) { - obj.weekdays = []; - } - - if (!Array.isArray(obj.daysOfMonth)) { - obj.daysOfMonth = []; - } - - return obj; - } - - /** - * Return an object that ready to parse to JSON - * @param {string} timezone If not specified, the timeRange will be in UTC - * @returns {Object} - */ - async toJSON(timezone = null) { - 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) { - return a - b; - }); - } - - /** - * Get a list of days in month that maintenance is active for - * @returns {number[]|string[]} Array of active days in month - */ - getDayOfMonthList() { - return JSON.parse(this.days_of_month).sort(function (a, b) { - return a - b; - }); - } - - /** - * Get the duration of maintenance in seconds - * @returns {number} Duration of maintenance - */ - calcDuration() { - 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 - if (duration < 0) { - duration += 24 * 3600; - } - 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 async jsonToBean(bean, obj) { - if (obj.id) { - bean.id = obj.id; - } - - bean.title = obj.title; - bean.description = obj.description; - bean.strategy = obj.strategy; - bean.interval_day = obj.intervalDay; - bean.timezone = obj.timezone; - bean.active = obj.active; - - if (obj.dateRange[0]) { - bean.start_date = obj.dateRange[0]; - } else { - bean.start_date = null; - } - - if (obj.dateRange[1]) { - bean.end_date = obj.dateRange[1]; - } else { - bean.end_date = null; - } - - if (bean.strategy === "cron") { - bean.duration = obj.durationMinutes * 60; - bean.cron = obj.cron; - this.validateCron(bean.cron); - } - - if (bean.strategy.startsWith("recurring-")) { - bean.start_time = parseTimeFromTimeObject(obj.timeRange[0]); - bean.end_time = parseTimeFromTimeObject(obj.timeRange[1]); - bean.weekdays = JSON.stringify(obj.weekdays); - bean.days_of_month = JSON.stringify(obj.daysOfMonth); - await bean.generateCron(); - this.validateCron(bean.cron); - } - return bean; - } - - /** - * Throw error if cron is invalid - * @param cron - * @returns {Promise} - */ - static async validateCron(cron) { - let job = new Cron(cron, () => {}); - job.stop(); - } - - /** - * Run the cron - */ - async run(throwError = false) { - if (this.beanMeta.job) { - log.debug("maintenance", "Maintenance is already running, stop it first. id: " + this.id); - this.stop(); - } - - log.debug("maintenance", "Run maintenance id: " + this.id); - - // 1.21.2 migration - if (!this.cron) { - await this.generateCron(); - if (!this.timezone) { - this.timezone = "UTC"; - } - if (this.cron) { - await R.store(this); - } - } - - if (this.strategy === "manual") { - // Do nothing, because it is controlled by the user - } else if (this.strategy === "single") { - this.beanMeta.job = new Cron(this.start_date, { timezone: await this.getTimezone() }, () => { - log.info("maintenance", "Maintenance id: " + this.id + " is under maintenance now"); - UptimeKumaServer.getInstance().sendMaintenanceListByUserID(this.user_id); - apicache.clear(); - }); - } else if (this.cron != null) { - // Here should be cron or recurring - try { - this.beanMeta.status = "scheduled"; - - let startEvent = (customDuration = 0) => { - log.info("maintenance", "Maintenance id: " + this.id + " is under maintenance now"); - - this.beanMeta.status = "under-maintenance"; - clearTimeout(this.beanMeta.durationTimeout); - - // Check if duration is still in the window. If not, use the duration from the current time to the end of the window - let duration; - - if (customDuration > 0) { - duration = customDuration; - } else if (this.end_date) { - let d = dayjs(this.end_date).diff(dayjs(), "second"); - if (d < this.duration) { - duration = d * 1000; - } - } else { - duration = this.duration * 1000; - } - - UptimeKumaServer.getInstance().sendMaintenanceListByUserID(this.user_id); - - this.beanMeta.durationTimeout = setTimeout(() => { - // End of maintenance for this timeslot - this.beanMeta.status = "scheduled"; - UptimeKumaServer.getInstance().sendMaintenanceListByUserID(this.user_id); - }, duration); - }; - - // Create Cron - this.beanMeta.job = new Cron(this.cron, { - timezone: await this.getTimezone(), - }, startEvent); - - // Continue if the maintenance is still in the window - let runningTimeslot = this.getRunningTimeslot(); - let current = dayjs(); - - if (runningTimeslot) { - let duration = dayjs(runningTimeslot.endDate).diff(current, "second") * 1000; - log.debug("maintenance", "Maintenance id: " + this.id + " Remaining duration: " + duration + "ms"); - startEvent(duration); - } - - } catch (e) { - log.error("maintenance", "Error in maintenance id: " + this.id); - log.error("maintenance", "Cron: " + this.cron); - log.error("maintenance", e); - - if (throwError) { - throw e; - } - } - - } else { - log.error("maintenance", "Maintenance id: " + this.id + " has no cron"); - } - } - - getRunningTimeslot() { - let start = dayjs(this.beanMeta.job.nextRun(dayjs().add(-this.duration, "second").format("YYYY-MM-DD HH:mm:ss"))); - let end = start.add(this.duration, "second"); - let current = dayjs(); - - if (current.isAfter(start) && current.isBefore(end)) { - return { - startDate: start.toISOString(), - endDate: end.toISOString(), - }; - } else { - return null; - } - } - - stop() { - if (this.beanMeta.job) { - this.beanMeta.job.stop(); - delete this.beanMeta.job; - } - } - - async isUnderMaintenance() { - return (await this.getStatus()) === "under-maintenance"; - } - - async getTimezone() { - if (!this.timezone) { - return await UptimeKumaServer.getInstance().getTimezone(); - } - return this.timezone; - } - - async getTimezoneOffset() { - return dayjs.tz(dayjs(), await this.getTimezone()).format("Z"); - } - - async getStatus() { - if (!this.active) { - return "inactive"; - } - - if (this.strategy === "manual") { - return "under-maintenance"; - } - - // Check if the maintenance is started - if (this.start_date && dayjs().isBefore(dayjs.tz(this.start_date, await this.getTimezone()))) { - return "scheduled"; - } - - // Check if the maintenance is ended - if (this.end_date && dayjs().isAfter(dayjs.tz(this.end_date, await this.getTimezone()))) { - return "ended"; - } - - if (this.strategy === "single") { - return "under-maintenance"; - } - - if (!this.beanMeta.status) { - return "unknown"; - } - - return this.beanMeta.status; - } - - /** - * Generate Cron for recurring maintenance - * @returns {Promise} - */ - async generateCron() { - log.info("maintenance", "Generate cron for maintenance id: " + this.id); - - if (this.strategy === "cron") { - // Do nothing for cron - } else if (!this.strategy.startsWith("recurring-")) { - this.cron = ""; - } else if (this.strategy === "recurring-interval") { - let array = this.start_time.split(":"); - let hour = parseInt(array[0]); - let minute = parseInt(array[1]); - this.cron = minute + " " + hour + " */" + this.interval_day + " * *"; - this.duration = this.calcDuration(); - log.debug("maintenance", "Cron: " + this.cron); - log.debug("maintenance", "Duration: " + this.duration); - } else if (this.strategy === "recurring-weekday") { - let list = this.getDayOfWeekList(); - let array = this.start_time.split(":"); - let hour = parseInt(array[0]); - let minute = parseInt(array[1]); - this.cron = minute + " " + hour + " * * " + list.join(","); - this.duration = this.calcDuration(); - } else if (this.strategy === "recurring-day-of-month") { - let list = this.getDayOfMonthList(); - let array = this.start_time.split(":"); - let hour = parseInt(array[0]); - let minute = parseInt(array[1]); - - let dayList = []; - - for (let day of list) { - if (typeof day === "string" && day.startsWith("lastDay")) { - if (day === "lastDay1") { - dayList.push("L"); - } - // Unfortunately, lastDay2-4 is not supported by cron - } else { - dayList.push(day); - } - } - - // Remove duplicate - dayList = [ ...new Set(dayList) ]; - - this.cron = minute + " " + hour + " " + dayList.join(",") + " * *"; - this.duration = this.calcDuration(); - } - - } -} - -module.exports = Maintenance; +const { BeanModel } = require("redbean-node/dist/bean-model"); +const { parseTimeObject, parseTimeFromTimeObject, log } = require("../../src/util"); +const { R } = require("redbean-node"); +const dayjs = require("dayjs"); +const Cron = require("croner"); +const { UptimeKumaServer } = require("../uptime-kuma-server"); +const apicache = require("../modules/apicache"); + +class Maintenance extends BeanModel { + + /** + * Return an object that ready to parse to JSON for public + * Only show necessary data to public + * @returns {Object} + */ + async toPublicJSON() { + + let dateRange = []; + if (this.start_date) { + dateRange.push(this.start_date); + } else { + dateRange.push(null); + } + + if (this.end_date) { + dateRange.push(this.end_date); + } + + let timeRange = []; + let startTime = parseTimeObject(this.start_time); + timeRange.push(startTime); + let endTime = parseTimeObject(this.end_time); + timeRange.push(endTime); + + let obj = { + id: this.id, + title: this.title, + description: this.description, + strategy: this.strategy, + intervalDay: this.interval_day, + active: !!this.active, + dateRange: dateRange, + timeRange: timeRange, + weekdays: (this.weekdays) ? JSON.parse(this.weekdays) : [], + daysOfMonth: (this.days_of_month) ? JSON.parse(this.days_of_month) : [], + timeslotList: [], + cron: this.cron, + duration: this.duration, + durationMinutes: parseInt(this.duration / 60), + timezone: await this.getTimezone(), // Only valid timezone + timezoneOption: this.timezone, // Mainly for dropdown menu, because there is a option "SAME_AS_SERVER" + timezoneOffset: await this.getTimezoneOffset(), + status: await this.getStatus(), + }; + + if (this.strategy === "manual") { + // Do nothing, no timeslots + } else if (this.strategy === "single") { + obj.timeslotList.push({ + startDate: this.start_date, + endDate: this.end_date, + }); + } else { + // Should be cron or recurring here + if (this.beanMeta.job) { + let runningTimeslot = this.getRunningTimeslot(); + + if (runningTimeslot) { + obj.timeslotList.push(runningTimeslot); + } + + let nextRunDate = this.beanMeta.job.nextRun(); + if (nextRunDate) { + let startDateDayjs = dayjs(nextRunDate); + + let startDate = startDateDayjs.toISOString(); + let endDate = startDateDayjs.add(this.duration, "second").toISOString(); + + obj.timeslotList.push({ + startDate, + endDate, + }); + } + } + } + + if (!Array.isArray(obj.weekdays)) { + obj.weekdays = []; + } + + if (!Array.isArray(obj.daysOfMonth)) { + obj.daysOfMonth = []; + } + + return obj; + } + + /** + * Return an object that ready to parse to JSON + * @param {string} timezone If not specified, the timeRange will be in UTC + * @returns {Object} + */ + async toJSON(timezone = null) { + 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) { + return a - b; + }); + } + + /** + * Get a list of days in month that maintenance is active for + * @returns {number[]|string[]} Array of active days in month + */ + getDayOfMonthList() { + return JSON.parse(this.days_of_month).sort(function (a, b) { + return a - b; + }); + } + + /** + * Get the duration of maintenance in seconds + * @returns {number} Duration of maintenance + */ + calcDuration() { + 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 + if (duration < 0) { + duration += 24 * 3600; + } + 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 async jsonToBean(bean, obj) { + if (obj.id) { + bean.id = obj.id; + } + + bean.title = obj.title; + bean.description = obj.description; + bean.strategy = obj.strategy; + bean.interval_day = obj.intervalDay; + bean.timezone = obj.timezoneOption; + bean.active = obj.active; + + if (obj.dateRange[0]) { + bean.start_date = obj.dateRange[0]; + } else { + bean.start_date = null; + } + + if (obj.dateRange[1]) { + bean.end_date = obj.dateRange[1]; + } else { + bean.end_date = null; + } + + if (bean.strategy === "cron") { + bean.duration = obj.durationMinutes * 60; + bean.cron = obj.cron; + this.validateCron(bean.cron); + } + + if (bean.strategy.startsWith("recurring-")) { + bean.start_time = parseTimeFromTimeObject(obj.timeRange[0]); + bean.end_time = parseTimeFromTimeObject(obj.timeRange[1]); + bean.weekdays = JSON.stringify(obj.weekdays); + bean.days_of_month = JSON.stringify(obj.daysOfMonth); + await bean.generateCron(); + this.validateCron(bean.cron); + } + return bean; + } + + /** + * Throw error if cron is invalid + * @param cron + * @returns {Promise} + */ + static async validateCron(cron) { + let job = new Cron(cron, () => {}); + job.stop(); + } + + /** + * Run the cron + */ + async run(throwError = false) { + if (this.beanMeta.job) { + log.debug("maintenance", "Maintenance is already running, stop it first. id: " + this.id); + this.stop(); + } + + log.debug("maintenance", "Run maintenance id: " + this.id); + + // 1.21.2 migration + if (!this.cron) { + await this.generateCron(); + if (!this.timezone) { + this.timezone = "UTC"; + } + if (this.cron) { + await R.store(this); + } + } + + if (this.strategy === "manual") { + // Do nothing, because it is controlled by the user + } else if (this.strategy === "single") { + this.beanMeta.job = new Cron(this.start_date, { timezone: await this.getTimezone() }, () => { + log.info("maintenance", "Maintenance id: " + this.id + " is under maintenance now"); + UptimeKumaServer.getInstance().sendMaintenanceListByUserID(this.user_id); + apicache.clear(); + }); + } else if (this.cron != null) { + // Here should be cron or recurring + try { + this.beanMeta.status = "scheduled"; + + let startEvent = (customDuration = 0) => { + log.info("maintenance", "Maintenance id: " + this.id + " is under maintenance now"); + + this.beanMeta.status = "under-maintenance"; + clearTimeout(this.beanMeta.durationTimeout); + + // Check if duration is still in the window. If not, use the duration from the current time to the end of the window + let duration; + + if (customDuration > 0) { + duration = customDuration; + } else if (this.end_date) { + let d = dayjs(this.end_date).diff(dayjs(), "second"); + if (d < this.duration) { + duration = d * 1000; + } + } else { + duration = this.duration * 1000; + } + + UptimeKumaServer.getInstance().sendMaintenanceListByUserID(this.user_id); + + this.beanMeta.durationTimeout = setTimeout(() => { + // End of maintenance for this timeslot + this.beanMeta.status = "scheduled"; + UptimeKumaServer.getInstance().sendMaintenanceListByUserID(this.user_id); + }, duration); + }; + + // Create Cron + this.beanMeta.job = new Cron(this.cron, { + timezone: await this.getTimezone(), + }, startEvent); + + // Continue if the maintenance is still in the window + let runningTimeslot = this.getRunningTimeslot(); + let current = dayjs(); + + if (runningTimeslot) { + let duration = dayjs(runningTimeslot.endDate).diff(current, "second") * 1000; + log.debug("maintenance", "Maintenance id: " + this.id + " Remaining duration: " + duration + "ms"); + startEvent(duration); + } + + } catch (e) { + log.error("maintenance", "Error in maintenance id: " + this.id); + log.error("maintenance", "Cron: " + this.cron); + log.error("maintenance", e); + + if (throwError) { + throw e; + } + } + + } else { + log.error("maintenance", "Maintenance id: " + this.id + " has no cron"); + } + } + + getRunningTimeslot() { + let start = dayjs(this.beanMeta.job.nextRun(dayjs().add(-this.duration, "second").toDate())); + let end = start.add(this.duration, "second"); + let current = dayjs(); + + if (current.isAfter(start) && current.isBefore(end)) { + return { + startDate: start.toISOString(), + endDate: end.toISOString(), + }; + } else { + return null; + } + } + + stop() { + if (this.beanMeta.job) { + this.beanMeta.job.stop(); + delete this.beanMeta.job; + } + } + + async isUnderMaintenance() { + return (await this.getStatus()) === "under-maintenance"; + } + + async getTimezone() { + if (!this.timezone || this.timezone === "SAME_AS_SERVER") { + return await UptimeKumaServer.getInstance().getTimezone(); + } + return this.timezone; + } + + async getTimezoneOffset() { + return dayjs.tz(dayjs(), await this.getTimezone()).format("Z"); + } + + async getStatus() { + if (!this.active) { + return "inactive"; + } + + if (this.strategy === "manual") { + return "under-maintenance"; + } + + // Check if the maintenance is started + if (this.start_date && dayjs().isBefore(dayjs.tz(this.start_date, await this.getTimezone()))) { + return "scheduled"; + } + + // Check if the maintenance is ended + if (this.end_date && dayjs().isAfter(dayjs.tz(this.end_date, await this.getTimezone()))) { + return "ended"; + } + + if (this.strategy === "single") { + return "under-maintenance"; + } + + if (!this.beanMeta.status) { + return "unknown"; + } + + return this.beanMeta.status; + } + + /** + * Generate Cron for recurring maintenance + * @returns {Promise} + */ + async generateCron() { + log.info("maintenance", "Generate cron for maintenance id: " + this.id); + + if (this.strategy === "cron") { + // Do nothing for cron + } else if (!this.strategy.startsWith("recurring-")) { + this.cron = ""; + } else if (this.strategy === "recurring-interval") { + let array = this.start_time.split(":"); + let hour = parseInt(array[0]); + let minute = parseInt(array[1]); + this.cron = minute + " " + hour + " */" + this.interval_day + " * *"; + this.duration = this.calcDuration(); + log.debug("maintenance", "Cron: " + this.cron); + log.debug("maintenance", "Duration: " + this.duration); + } else if (this.strategy === "recurring-weekday") { + let list = this.getDayOfWeekList(); + let array = this.start_time.split(":"); + let hour = parseInt(array[0]); + let minute = parseInt(array[1]); + this.cron = minute + " " + hour + " * * " + list.join(","); + this.duration = this.calcDuration(); + } else if (this.strategy === "recurring-day-of-month") { + let list = this.getDayOfMonthList(); + let array = this.start_time.split(":"); + let hour = parseInt(array[0]); + let minute = parseInt(array[1]); + + let dayList = []; + + for (let day of list) { + if (typeof day === "string" && day.startsWith("lastDay")) { + if (day === "lastDay1") { + dayList.push("L"); + } + // Unfortunately, lastDay2-4 is not supported by cron + } else { + dayList.push(day); + } + } + + // Remove duplicate + dayList = [ ...new Set(dayList) ]; + + this.cron = minute + " " + hour + " " + dayList.join(",") + " * *"; + this.duration = this.calcDuration(); + } + + } +} + +module.exports = Maintenance; diff --git a/server/model/monitor.js b/server/model/monitor.js index da73287073..c198c0a256 100644 --- a/server/model/monitor.js +++ b/server/model/monitor.js @@ -405,7 +405,7 @@ class Monitor extends BeanModel { bean.msg += ", keyword is found"; bean.status = UP; } else { - data = data.replace(/<[^>]*>?|[\n\r]|\s+/gm, " "); + data = data.replace(/<[^>]*>?|[\n\r]|\s+/gm, " ").trim(); if (data.length > 50) { data = data.substring(0, 47) + "..."; } diff --git a/server/notification-providers/dingding.js b/server/notification-providers/dingding.js index 8e56a304a6..cea0b0a1e3 100644 --- a/server/notification-providers/dingding.js +++ b/server/notification-providers/dingding.js @@ -1,96 +1,96 @@ -const NotificationProvider = require("./notification-provider"); -const { DOWN, UP } = require("../../src/util"); -const { default: axios } = require("axios"); -const Crypto = require("crypto"); - -class DingDing extends NotificationProvider { - name = "DingDing"; - - async send(notification, msg, monitorJSON = null, heartbeatJSON = null) { - let okMsg = "Sent Successfully."; - - try { - if (heartbeatJSON != null) { - let params = { - msgtype: "markdown", - markdown: { - title: `[${this.statusToString(heartbeatJSON["status"])}] ${monitorJSON["name"]}`, - text: `## [${this.statusToString(heartbeatJSON["status"])}] ${monitorJSON["name"]} \n > ${heartbeatJSON["msg"]} \n > Time(UTC):${heartbeatJSON["time"]}`, - } - }; - if (this.sendToDingDing(notification, params)) { - return okMsg; - } - } else { - let params = { - msgtype: "text", - text: { - content: msg - } - }; - if (this.sendToDingDing(notification, params)) { - return okMsg; - } - } - } catch (error) { - this.throwGeneralAxiosError(error); - } - } - - /** - * Send message to DingDing - * @param {BeanModel} notification - * @param {Object} params Parameters of message - * @returns {boolean} True if successful else false - */ - async sendToDingDing(notification, params) { - let timestamp = Date.now(); - - let config = { - method: "POST", - headers: { - "Content-Type": "application/json", - }, - url: `${notification.webHookUrl}×tamp=${timestamp}&sign=${encodeURIComponent(this.sign(timestamp, notification.secretKey))}`, - data: JSON.stringify(params), - }; - - let result = await axios(config); - if (result.data.errmsg === "ok") { - return true; - } - return false; - } - - /** - * DingDing sign - * @param {Date} timestamp Timestamp of message - * @param {string} secretKey Secret key to sign data with - * @returns {string} - */ - sign(timestamp, secretKey) { - return Crypto - .createHmac("sha256", Buffer.from(secretKey, "utf8")) - .update(Buffer.from(`${timestamp}\n${secretKey}`, "utf8")) - .digest("base64"); - } - - /** - * Convert status constant to string - * @param {const} status The status constant - * @returns {string} - */ - statusToString(status) { - // TODO: Move to notification-provider.js to avoid repetition in classes - switch (status) { - case DOWN: - return "DOWN"; - case UP: - return "UP"; - default: - return status; - } - } -} - -module.exports = DingDing; +const NotificationProvider = require("./notification-provider"); +const { DOWN, UP } = require("../../src/util"); +const { default: axios } = require("axios"); +const Crypto = require("crypto"); + +class DingDing extends NotificationProvider { + name = "DingDing"; + + async send(notification, msg, monitorJSON = null, heartbeatJSON = null) { + let okMsg = "Sent Successfully."; + + try { + if (heartbeatJSON != null) { + let params = { + msgtype: "markdown", + markdown: { + title: `[${this.statusToString(heartbeatJSON["status"])}] ${monitorJSON["name"]}`, + text: `## [${this.statusToString(heartbeatJSON["status"])}] ${monitorJSON["name"]} \n> ${heartbeatJSON["msg"]}\n> Time (${heartbeatJSON["timezone"]}): ${heartbeatJSON["localDateTime"]}`, + } + }; + if (this.sendToDingDing(notification, params)) { + return okMsg; + } + } else { + let params = { + msgtype: "text", + text: { + content: msg + } + }; + if (this.sendToDingDing(notification, params)) { + return okMsg; + } + } + } catch (error) { + this.throwGeneralAxiosError(error); + } + } + + /** + * Send message to DingDing + * @param {BeanModel} notification + * @param {Object} params Parameters of message + * @returns {boolean} True if successful else false + */ + async sendToDingDing(notification, params) { + let timestamp = Date.now(); + + let config = { + method: "POST", + headers: { + "Content-Type": "application/json", + }, + url: `${notification.webHookUrl}×tamp=${timestamp}&sign=${encodeURIComponent(this.sign(timestamp, notification.secretKey))}`, + data: JSON.stringify(params), + }; + + let result = await axios(config); + if (result.data.errmsg === "ok") { + return true; + } + return false; + } + + /** + * DingDing sign + * @param {Date} timestamp Timestamp of message + * @param {string} secretKey Secret key to sign data with + * @returns {string} + */ + sign(timestamp, secretKey) { + return Crypto + .createHmac("sha256", Buffer.from(secretKey, "utf8")) + .update(Buffer.from(`${timestamp}\n${secretKey}`, "utf8")) + .digest("base64"); + } + + /** + * Convert status constant to string + * @param {const} status The status constant + * @returns {string} + */ + statusToString(status) { + // TODO: Move to notification-provider.js to avoid repetition in classes + switch (status) { + case DOWN: + return "DOWN"; + case UP: + return "UP"; + default: + return status; + } + } +} + +module.exports = DingDing; diff --git a/server/notification-providers/ntfy.js b/server/notification-providers/ntfy.js index cb8785828b..2d8378e57c 100644 --- a/server/notification-providers/ntfy.js +++ b/server/notification-providers/ntfy.js @@ -1,73 +1,77 @@ -const NotificationProvider = require("./notification-provider"); -const axios = require("axios"); -const { DOWN, UP } = require("../../src/util"); - -class Ntfy extends NotificationProvider { - - name = "ntfy"; - - async send(notification, msg, monitorJSON = null, heartbeatJSON = null) { - let okMsg = "Sent Successfully."; - try { - let headers = {}; - if (notification.ntfyusername) { - headers = { - "Authorization": "Basic " + Buffer.from(notification.ntfyusername + ":" + notification.ntfypassword).toString("base64"), - }; - } - // If heartbeatJSON is null, assume non monitoring notification (Certificate warning) or testing. - if (heartbeatJSON == null) { - let ntfyTestData = { - "topic": notification.ntfytopic, - "title": (monitorJSON?.name || notification.ntfytopic) + " [Uptime-Kuma]", - "message": msg, - "priority": notification.ntfyPriority, - "tags": [ "test_tube" ], - }; - await axios.post(`${notification.ntfyserverurl}`, ntfyTestData, { headers: headers }); - return okMsg; - } - let tags = []; - let status = "unknown"; - let priority = notification.ntfyPriority || 4; - if ("status" in heartbeatJSON) { - if (heartbeatJSON.status === DOWN) { - tags = [ "red_circle" ]; - status = "Down"; - // if priority is not 5, increase priority for down alerts - priority = priority === 5 ? priority : priority + 1; - } else if (heartbeatJSON["status"] === UP) { - tags = [ "green_circle" ]; - status = "Up"; - } - } - let data = { - "topic": notification.ntfytopic, - "message": heartbeatJSON.msg, - "priority": priority, - "title": monitorJSON.name + " " + status + " [Uptime-Kuma]", - "tags": tags, - "actions": [ - { - "action": "view", - "label": "Open " + monitorJSON.name, - "url": monitorJSON.url, - } - ] - }; - - if (notification.ntfyIcon) { - data.icon = notification.ntfyIcon; - } - - await axios.post(`${notification.ntfyserverurl}`, data, { headers: headers }); - - return okMsg; - - } catch (error) { - this.throwGeneralAxiosError(error); - } - } -} - -module.exports = Ntfy; +const NotificationProvider = require("./notification-provider"); +const axios = require("axios"); +const { DOWN, UP } = require("../../src/util"); + +class Ntfy extends NotificationProvider { + + name = "ntfy"; + + async send(notification, msg, monitorJSON = null, heartbeatJSON = null) { + let okMsg = "Sent Successfully."; + try { + let headers = {}; + if (notification.ntfyAuthenticationMethod === "usernamePassword") { + headers = { + "Authorization": "Basic " + Buffer.from(notification.ntfyusername + ":" + notification.ntfypassword).toString("base64"), + }; + } else if (notification.ntfyAuthenticationMethod === "accessToken") { + headers = { + "Authorization": "Bearer " + notification.ntfyaccesstoken, + }; + } + // If heartbeatJSON is null, assume non monitoring notification (Certificate warning) or testing. + if (heartbeatJSON == null) { + let ntfyTestData = { + "topic": notification.ntfytopic, + "title": (monitorJSON?.name || notification.ntfytopic) + " [Uptime-Kuma]", + "message": msg, + "priority": notification.ntfyPriority, + "tags": [ "test_tube" ], + }; + await axios.post(`${notification.ntfyserverurl}`, ntfyTestData, { headers: headers }); + return okMsg; + } + let tags = []; + let status = "unknown"; + let priority = notification.ntfyPriority || 4; + if ("status" in heartbeatJSON) { + if (heartbeatJSON.status === DOWN) { + tags = [ "red_circle" ]; + status = "Down"; + // if priority is not 5, increase priority for down alerts + priority = priority === 5 ? priority : priority + 1; + } else if (heartbeatJSON["status"] === UP) { + tags = [ "green_circle" ]; + status = "Up"; + } + } + let data = { + "topic": notification.ntfytopic, + "message": heartbeatJSON.msg, + "priority": priority, + "title": monitorJSON.name + " " + status + " [Uptime-Kuma]", + "tags": tags, + "actions": [ + { + "action": "view", + "label": "Open " + monitorJSON.name, + "url": monitorJSON.url, + } + ] + }; + + if (notification.ntfyIcon) { + data.icon = notification.ntfyIcon; + } + + await axios.post(`${notification.ntfyserverurl}`, data, { headers: headers }); + + return okMsg; + + } catch (error) { + this.throwGeneralAxiosError(error); + } + } +} + +module.exports = Ntfy; diff --git a/server/notification-providers/opsgenie.js b/server/notification-providers/opsgenie.js index a54894bb69..5fa7f3e4ee 100644 --- a/server/notification-providers/opsgenie.js +++ b/server/notification-providers/opsgenie.js @@ -1,97 +1,97 @@ -const NotificationProvider = require("./notification-provider"); -const axios = require("axios"); -const { UP, DOWN } = require("../../src/util"); - -const opsgenieAlertsUrlEU = "https://api.eu.opsgenie.com/v2/alerts"; -const opsgenieAlertsUrlUS = "https://api.opsgenie.com/v2/alerts"; -let okMsg = "Sent Successfully."; - -class Opsgenie extends NotificationProvider { - - name = "Opsgenie"; - - /** - * @inheritdoc - */ - async send(notification, msg, monitorJSON = null, heartbeatJSON = null) { - let opsgenieAlertsUrl; - let priority = (notification.opsgeniePriority == "") ? 3 : notification.opsgeniePriority; - const textMsg = "Uptime Kuma Alert"; - - try { - switch (notification.opsgenieRegion) { - case "US": - opsgenieAlertsUrl = opsgenieAlertsUrlUS; - break; - case "EU": - opsgenieAlertsUrl = opsgenieAlertsUrlEU; - break; - default: - opsgenieAlertsUrl = opsgenieAlertsUrlUS; - } - - if (heartbeatJSON == null) { - let notificationTestAlias = "uptime-kuma-notification-test"; - let data = { - "message": msg, - "alias": notificationTestAlias, - "source": "Uptime Kuma", - "priority": "P5" - }; - - return this.post(notification, opsgenieAlertsUrl, data); - } - - if (heartbeatJSON.status === DOWN) { - let data = { - "message": monitorJSON ? textMsg + `: ${monitorJSON.name}` : textMsg, - "alias": monitorJSON.name, - "description": msg, - "source": "Uptime Kuma", - "priority": `P${priority}` - }; - - return this.post(notification, opsgenieAlertsUrl, data); - } - - if (heartbeatJSON.status === UP) { - let opsgenieAlertsCloseUrl = `${opsgenieAlertsUrl}/${encodeURIComponent(monitorJSON.name)}/close?identifierType=alias`; - let data = { - "source": "Uptime Kuma", - }; - - return this.post(notification, opsgenieAlertsCloseUrl, data); - } - } catch (error) { - this.throwGeneralAxiosError(error); - } - } - - /** - * - * @param {BeanModel} notification - * @param {string} url Request url - * @param {Object} data Request body - * @returns {Promise} - */ - async post(notification, url, data) { - let config = { - headers: { - "Content-Type": "application/json", - "Authorization": `GenieKey ${notification.opsgenieApiKey}`, - } - }; - - let res = await axios.post(url, data, config); - if (res.status == null) { - return "Opsgenie notification failed with invalid response!"; - } - if (res.status < 200 || res.status >= 300) { - return `Opsgenie notification failed with status code ${res.status}`; - } - - return okMsg; - } -} - -module.exports = Opsgenie; +const NotificationProvider = require("./notification-provider"); +const axios = require("axios"); +const { UP, DOWN } = require("../../src/util"); + +const opsgenieAlertsUrlEU = "https://api.eu.opsgenie.com/v2/alerts"; +const opsgenieAlertsUrlUS = "https://api.opsgenie.com/v2/alerts"; +let okMsg = "Sent Successfully."; + +class Opsgenie extends NotificationProvider { + + name = "Opsgenie"; + + /** + * @inheritdoc + */ + async send(notification, msg, monitorJSON = null, heartbeatJSON = null) { + let opsgenieAlertsUrl; + let priority = (!notification.opsgeniePriority) ? 3 : notification.opsgeniePriority; + const textMsg = "Uptime Kuma Alert"; + + try { + switch (notification.opsgenieRegion) { + case "US": + opsgenieAlertsUrl = opsgenieAlertsUrlUS; + break; + case "EU": + opsgenieAlertsUrl = opsgenieAlertsUrlEU; + break; + default: + opsgenieAlertsUrl = opsgenieAlertsUrlUS; + } + + if (heartbeatJSON == null) { + let notificationTestAlias = "uptime-kuma-notification-test"; + let data = { + "message": msg, + "alias": notificationTestAlias, + "source": "Uptime Kuma", + "priority": "P5" + }; + + return this.post(notification, opsgenieAlertsUrl, data); + } + + if (heartbeatJSON.status === DOWN) { + let data = { + "message": monitorJSON ? textMsg + `: ${monitorJSON.name}` : textMsg, + "alias": monitorJSON.name, + "description": msg, + "source": "Uptime Kuma", + "priority": `P${priority}` + }; + + return this.post(notification, opsgenieAlertsUrl, data); + } + + if (heartbeatJSON.status === UP) { + let opsgenieAlertsCloseUrl = `${opsgenieAlertsUrl}/${encodeURIComponent(monitorJSON.name)}/close?identifierType=alias`; + let data = { + "source": "Uptime Kuma", + }; + + return this.post(notification, opsgenieAlertsCloseUrl, data); + } + } catch (error) { + this.throwGeneralAxiosError(error); + } + } + + /** + * + * @param {BeanModel} notification + * @param {string} url Request url + * @param {Object} data Request body + * @returns {Promise} + */ + async post(notification, url, data) { + let config = { + headers: { + "Content-Type": "application/json", + "Authorization": `GenieKey ${notification.opsgenieApiKey}`, + } + }; + + let res = await axios.post(url, data, config); + if (res.status == null) { + return "Opsgenie notification failed with invalid response!"; + } + if (res.status < 200 || res.status >= 300) { + return `Opsgenie notification failed with status code ${res.status}`; + } + + return okMsg; + } +} + +module.exports = Opsgenie; diff --git a/server/notification-providers/telegram.js b/server/notification-providers/telegram.js index b763766b4b..561cabd87d 100644 --- a/server/notification-providers/telegram.js +++ b/server/notification-providers/telegram.js @@ -1,34 +1,37 @@ -const NotificationProvider = require("./notification-provider"); -const axios = require("axios"); - -class Telegram extends NotificationProvider { - - name = "telegram"; - - async send(notification, msg, monitorJSON = null, heartbeatJSON = null) { - 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: params, - }); - return okMsg; - - } catch (error) { - let msg = (error.response.data.description) ? error.response.data.description : "Error without description"; - throw new Error(msg); - } - } -} - -module.exports = Telegram; +const NotificationProvider = require("./notification-provider"); +const axios = require("axios"); + +class Telegram extends NotificationProvider { + + name = "telegram"; + + async send(notification, msg, monitorJSON = null, heartbeatJSON = null) { + 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: params, + }); + return okMsg; + + } catch (error) { + if (error.response && error.response.data && error.response.data.description) { + throw new Error(error.response.data.description); + } else { + throw new Error(error.message); + } + } + } +} + +module.exports = Telegram; diff --git a/server/server.js b/server/server.js index d7f0b5fb12..74266034d9 100644 --- a/server/server.js +++ b/server/server.js @@ -1663,7 +1663,7 @@ let needSetup = false; } }); - initBackgroundJobs(args); + await initBackgroundJobs(); // Start cloudflared at the end if configured await cloudflaredAutoStart(cloudflaredToken); diff --git a/src/assets/multiselect.scss b/src/assets/multiselect.scss index cd32af2b74..9ea04ca076 100644 --- a/src/assets/multiselect.scss +++ b/src/assets/multiselect.scss @@ -1,73 +1,81 @@ -@import "vars.scss"; -@import "node_modules/vue-multiselect/dist/vue-multiselect"; - -.multiselect__tags { - border-radius: 1.5rem; - border: 1px solid #ced4da; - min-height: 38px; - padding: 6px 40px 0 8px; -} - -.multiselect--active .multiselect__tags { - border-radius: 1rem; -} - -.multiselect__option--highlight { - background: $primary !important; -} - -.multiselect__option--highlight::after { - background: $primary !important; -} - -.multiselect__tag { - border-radius: $border-radius; - margin-bottom: 0; - padding: 6px 26px 6px 10px; - background: $primary !important; -} - -.multiselect__placeholder { - font-size: 1rem; - padding-left: 6px; - padding-top: 0; - padding-bottom: 0; - margin-bottom: 0; - opacity: 0.67; -} - -.multiselect__input, -.multiselect__single { - line-height: 14px; - margin-bottom: 0; -} - -.dark { - .multiselect__tag { - color: $dark-font-color2; - } - - .multiselect__tags { - background-color: $dark-bg2; - border-color: $dark-border-color; - } - - .multiselect__input, - .multiselect__single { - background-color: $dark-bg2; - color: $dark-font-color; - } - - .multiselect__content-wrapper { - background-color: $dark-bg2; - border-color: $dark-border-color; - } - - .multiselect--above .multiselect__content-wrapper { - border-color: $dark-border-color; - } - - .multiselect__option--selected { - background-color: $dark-bg; - } -} +@import "vars.scss"; +@import "node_modules/vue-multiselect/dist/vue-multiselect"; + +.multiselect { + .dark & { + color: $dark-font-color; + } +} + +.multiselect__tags { + border-radius: 1.5rem; + border: 1px solid #ced4da; + min-height: 38px; + padding: 6px 40px 0 8px; +} + +.multiselect--active .multiselect__tags { + border-radius: 1rem; +} + +.multiselect__option--highlight { + background: $primary !important; + color: $dark-font-color2 !important; +} + +.multiselect__option--highlight::after { + background: $primary !important; + color: $dark-font-color2 !important; +} + +.multiselect__tag { + border-radius: $border-radius; + margin-bottom: 0; + padding: 6px 26px 6px 10px; + background: $primary !important; +} + +.multiselect__placeholder { + font-size: 1rem; + padding-left: 6px; + padding-top: 0; + padding-bottom: 0; + margin-bottom: 0; + opacity: 0.67; +} + +.multiselect__input, +.multiselect__single { + line-height: 14px; + margin-bottom: 0; +} + +.dark { + .multiselect__tag { + color: $dark-font-color2; + } + + .multiselect__tags { + background-color: $dark-bg2; + border-color: $dark-border-color; + } + + .multiselect__input, + .multiselect__single { + background-color: $dark-bg2; + color: $dark-font-color; + } + + .multiselect__content-wrapper { + background-color: $dark-bg2; + border-color: $dark-border-color; + } + + .multiselect--above .multiselect__content-wrapper { + border-color: $dark-border-color; + } + + .multiselect__option--selected { + background-color: $dark-bg; + } +} diff --git a/src/components/NotificationDialog.vue b/src/components/NotificationDialog.vue index 6ef447c12c..856d6f5373 100644 --- a/src/components/NotificationDialog.vue +++ b/src/components/NotificationDialog.vue @@ -1,318 +1,319 @@ - - - - - + + + + + diff --git a/src/components/Tag.vue b/src/components/Tag.vue index dce7258a90..956eea3e72 100644 --- a/src/components/Tag.vue +++ b/src/components/Tag.vue @@ -1,86 +1,86 @@ - - - - - + + + + + diff --git a/src/components/TagEditDialog.vue b/src/components/TagEditDialog.vue index c8342b5f99..bdfbe13228 100644 --- a/src/components/TagEditDialog.vue +++ b/src/components/TagEditDialog.vue @@ -1,468 +1,483 @@ - - - - - + + + + + diff --git a/src/components/notifications/Ntfy.vue b/src/components/notifications/Ntfy.vue index 96aabb7d75..57fac671b0 100644 --- a/src/components/notifications/Ntfy.vue +++ b/src/components/notifications/Ntfy.vue @@ -1,50 +1,80 @@ - - - + + + diff --git a/src/lang/de-CH.json b/src/lang/de-CH.json index 25641633b4..3f3a860cc5 100644 --- a/src/lang/de-CH.json +++ b/src/lang/de-CH.json @@ -1,750 +1,752 @@ -{ - "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 Authentifizierung deaktivieren möchtest?", - "disableauth.message2": "Dies ist für Szenarien gedacht, in denen man eine externe Authentifizierung 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 -> Notifikationen -> Webhooks -> 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": "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": "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": "Erstellt mit", - "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 Spielserver", - "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 erhalten 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...": "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). Engagiere 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 die Backupfunktion nicht mehr gepflegt wird, kann keine vollständige Sicherung erstellt oder wiederhergestellt 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 Typ", - "SMSManager": "SMSManager", - "You can divide numbers with": "Du kannst Zahlen teilen mit", - "or": "oder", - "recurringInterval": "Intervall", - "Recurring": "Wiederkehrend", - "strategyManual": "Aktiv/Inaktiv Manuell", - "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", - "telegramMessageThreadID": "(Optional) Nachrichten Thread ID", - "telegramMessageThreadIDDescription": "Optionale eindeutige Kennung für den Ziel-Thread (Thema) des Forums; nur für Forum-Supergroups", - "Enable": "Aktivieren", - "telegramProtectContent": "Schütze gegen Weiterleiten/Speichern der Nachricht", - "telegramProtectContentDescription": "Die Bot-Nachrichten in Telegram sind gegen Weiterleitung und Speichern geschützt.", - "Disable": "Deaktivieren", - "plugin": "Plugin | Plugins", - "installing": "Installiere", - "uninstall": "Deinstallieren", - "uninstalling": "Deinstalliere", - "confirmUninstallPlugin": "Möchtest du dieses Plugin wirklich deinstallieren?", - "notificationRegional": "Regional", - "Single Maintenance Window": "Einmaliges Wartungsfenster", - "dnsCacheDescription": "In einigen IPv6-Umgebungen funktioniert es möglicherweise nicht. Deaktiviere es, wenn Probleme auftreten.", - "Maintenance Time Window of a Day": "Wartungszeitfenster eines Tages", - "Effective Date Range": "Gültigkeitsbereich (Optional)", - "Schedule Maintenance": "Wartung planen", - "Date and Time": "Datum und Uhrzeit", - "DateTime Range": "Datums- und Zeitbereich", - "telegramSendSilently": "Stumm senden", - "telegramSendSilentlyDescription": "Sende die Nachricht stumm. Nutzer bekommen eine Benachrichtigung ohne Ton.", - "markdownSupported": "Markdown-Syntax unterstützt", - "webhookAdditionalHeadersTitle": "Zusätzliche Header", - "webhookAdditionalHeadersDesc": "Legt zusätzliche Kopfzeilen fest, die mit dem Webhook gesendet werden.", - "Packet Size": "Paketgrösse", - "IconUrl": "Symbol URL", - "Enable DNS Cache": "DNS Cache aktivieren", - "Help": "Hilfe", - "Game": "Spiel", - "General Monitor Type": "Allgemeiner Monitortyp", - "Passive Monitor Type": "Passiver Monitortyp", - "Specific Monitor Type": "Spezifischer Monitortyp", - "Monitor": "Überwachung | Monitore", - "Custom": "Benutzerdefiniert", - "statusPageMaintenanceEndDate": "Ende", - "loadingError": "Die Daten konnten nicht abgerufen werden, bitte später noch einmal versuchen.", - "install": "Installieren", - "Body Encoding": "Body Encoding", - "Custom Monitor Type": "Benutzerdefinierter Monitortyp", - "Expiry": "Ablauf", - "Expiry date": "Ablaufdatum", - "Don't expire": "Nicht ablaufen", - "Add Another": "Hinzufügen", - "Key Added": "Schlüssel hinzugefügt", - "apiKeyAddedMsg": "API Schlüssel wurde hinzugefügt. Bitte notiere den Schlüssel, da er nicht erneut angezeigt wird.", - "Add API Key": "API Schlüssel hinzufügen", - "No API Keys": "Kein API Schlüssel", - "apiKey-active": "Aktiv", - "apiKey-expired": "Abgelaufen", - "apiKey-inactive": "Inaktiv", - "Expires": "Läuft ab", - "disableAPIKeyMsg": "Bist du sicher, dass du diesen API Schlüssel deaktivieren willst?", - "deleteAPIKeyMsg": "Bist du sicher, dass du diesen API Schlüssel löschen willst?", - "Generate": "Generieren", - "infiniteRetention": "Für unendliche Speicherung auf 0 setzen.", - "dataRetentionTimeError": "Aufbewahrungsfrist muss grösser oder gleich 0 sein", - "Clone Monitor": "Monitor klonen", - "Clone": "Klonen", - "cloneOf": "Klon von {0}", - "wayToGetZohoCliqURL": "Wie eine Webhook URL erstellt werden kann, erfährst du {0}.", - "enableGRPCTls": "Senden von gRPC Anforderungen mit TLS Verbindung zulassen", - "grpcMethodDescription": "Der Name der Methode wird in das \"cammelCase\" Format konvertiert (z.B. sayHello, check, etc.)", - "wayToGetKookGuildID": "Schalte den „Entwicklermodus“ in den Kook-Einstellungen ein und klicke mit der rechten Maustaste auf die Gilde, um die ID zu erhalten", - "Guild ID": "Gilde ID", - "Lowcost": "Kostengünstig", - "high": "hoch", - "Google Analytics ID": "Google Analytics ID", - "Enable TLS": "TLS aktivieren", - "Free Mobile API Key": "Kostenloser Mobile API Schlüssel", - "Proto Service Name": "Proto Dienst Name", - "Proto Method": "Proto Methode", - "Proto Content": "Proto Inhalt", - "Economy": "Economy", - "pagertreeIntegrationUrl": "Integrations-URL", - "pagertreeUrgency": "Dringlichkeit", - "pagertreeSilent": "Stumm", - "pagertreeLow": "Niedrig", - "pagertreeMedium": "Mittel", - "pagertreeHigh": "Hoch", - "pagertreeCritical": "Kritisch", - "pagertreeResolve": "Automatisch auflösen", - "pagertreeDoNothing": "Nichts tun", - "wayToGetPagerTreeIntegrationURL": "Nachdem du die Uptime Kuma Integration in PagerTree erstellt hast, kopiere den Endpunkt. Siehe details {0}", - "Server Address": "Serveradresse", - "Learn More": "Erfahre mehr", - "Edit Tag": "Tag editieren", - "promosmsAllowLongSMS": "Lange SMS erlauben", - "smseagleRecipientType": "Empfängertyp", - "smseagleToken": "API Zugriffstoken", - "smseagleTo": "Telefonnummer(n)", - "smseagleUrl": "Ihre SMSEagle Geräte URL", - "smseagleEncoding": "Als Unicode senden", - "smseaglePriority": "Nachrichtenpriorität (0-9, Standard = 0)", - "smseagleContact": "Telefonbuch Kontaktname(n)", - "confirmDeleteTagMsg": "Möchtest du dieses Tag wirklich löschen? Monitore, die mit diesem Tag verknüpft sind, werden nicht gelöscht.", - "wayToGetKookBotToken": "Erstelle eine Anwendung und erhalte den Bot-Token unter {0}", - "Strategy": "Strategie", - "Free Mobile User Identifier": "Kostenlose mobile Benutzerkennung", - "smseagleGroup": "Telefonbuch Gruppenname(n)", - "smseagleRecipient": "Empfänger (mehrere müssen durch Komma getrennt werden)", - "API Keys": "API Schlüssel", - "Continue": "Weiter", - "Add New Tag": "Neuen Tag hinzufügen", - "lunaseaTarget": "Ziel", - "lunaseaDeviceID": "Geräte-ID", - "lunaseaUserID": "Benutzer-ID", - "twilioAccountSID": "Account SID", - "twilioFromNumber": "Absender", - "twilioToNumber": "Empfänger", - "twilioAuthToken": "Auth Token", - "statusPageRefreshIn": "Aktualisierung in: {0}", - "sameAsServerTimezone": "Gleiche Zeitzone wie Server", - "startDateTime": "Start Datum/Uhrzeit", - "endDateTime": "Ende Datum/Uhrzeit", - "cronExpression": "Cron-Ausdruck", - "cronSchedule": "Zeitplan: ", - "invalidCronExpression": "Ungültiger Cron-Ausdruck: {0}" -} +{ + "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 Authentifizierung deaktivieren möchtest?", + "disableauth.message2": "Dies ist für Szenarien gedacht, in denen man eine externe Authentifizierung 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 -> Notifikationen -> Webhooks -> 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": "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": "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": "Erstellt mit", + "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 Spielserver", + "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 erhalten 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...": "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). Engagiere 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 die Backupfunktion nicht mehr gepflegt wird, kann keine vollständige Sicherung erstellt oder wiederhergestellt 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 Typ", + "SMSManager": "SMSManager", + "You can divide numbers with": "Du kannst Zahlen teilen mit", + "or": "oder", + "recurringInterval": "Intervall", + "Recurring": "Wiederkehrend", + "strategyManual": "Aktiv/Inaktiv Manuell", + "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", + "telegramMessageThreadID": "(Optional) Nachrichten Thread ID", + "telegramMessageThreadIDDescription": "Optionale eindeutige Kennung für den Ziel-Thread (Thema) des Forums; nur für Forum-Supergroups", + "Enable": "Aktivieren", + "telegramProtectContent": "Schütze gegen Weiterleiten/Speichern der Nachricht", + "telegramProtectContentDescription": "Die Bot-Nachrichten in Telegram sind gegen Weiterleitung und Speichern geschützt.", + "Disable": "Deaktivieren", + "plugin": "Plugin | Plugins", + "installing": "Installiere", + "uninstall": "Deinstallieren", + "uninstalling": "Deinstalliere", + "confirmUninstallPlugin": "Möchtest du dieses Plugin wirklich deinstallieren?", + "notificationRegional": "Regional", + "Single Maintenance Window": "Einmaliges Wartungsfenster", + "dnsCacheDescription": "In einigen IPv6-Umgebungen funktioniert es möglicherweise nicht. Deaktiviere es, wenn Probleme auftreten.", + "Maintenance Time Window of a Day": "Wartungszeitfenster eines Tages", + "Effective Date Range": "Gültigkeitsbereich (Optional)", + "Schedule Maintenance": "Wartung planen", + "Date and Time": "Datum und Uhrzeit", + "DateTime Range": "Datums- und Zeitbereich", + "telegramSendSilently": "Stumm senden", + "telegramSendSilentlyDescription": "Sende die Nachricht stumm. Nutzer bekommen eine Benachrichtigung ohne Ton.", + "markdownSupported": "Markdown-Syntax unterstützt", + "webhookAdditionalHeadersTitle": "Zusätzliche Header", + "webhookAdditionalHeadersDesc": "Legt zusätzliche Kopfzeilen fest, die mit dem Webhook gesendet werden.", + "Packet Size": "Paketgrösse", + "IconUrl": "Symbol URL", + "Enable DNS Cache": "DNS Cache aktivieren", + "Help": "Hilfe", + "Game": "Spiel", + "General Monitor Type": "Allgemeiner Monitortyp", + "Passive Monitor Type": "Passiver Monitortyp", + "Specific Monitor Type": "Spezifischer Monitortyp", + "Monitor": "Überwachung | Monitore", + "Custom": "Benutzerdefiniert", + "statusPageMaintenanceEndDate": "Ende", + "loadingError": "Die Daten konnten nicht abgerufen werden, bitte später noch einmal versuchen.", + "install": "Installieren", + "Body Encoding": "Body Encoding", + "Custom Monitor Type": "Benutzerdefinierter Monitortyp", + "Expiry": "Ablauf", + "Expiry date": "Ablaufdatum", + "Don't expire": "Nicht ablaufen", + "Add Another": "Hinzufügen", + "Key Added": "Schlüssel hinzugefügt", + "apiKeyAddedMsg": "API Schlüssel wurde hinzugefügt. Bitte notiere den Schlüssel, da er nicht erneut angezeigt wird.", + "Add API Key": "API Schlüssel hinzufügen", + "No API Keys": "Kein API Schlüssel", + "apiKey-active": "Aktiv", + "apiKey-expired": "Abgelaufen", + "apiKey-inactive": "Inaktiv", + "Expires": "Läuft ab", + "disableAPIKeyMsg": "Bist du sicher, dass du diesen API Schlüssel deaktivieren willst?", + "deleteAPIKeyMsg": "Bist du sicher, dass du diesen API Schlüssel löschen willst?", + "Generate": "Generieren", + "infiniteRetention": "Für unendliche Speicherung auf 0 setzen.", + "dataRetentionTimeError": "Aufbewahrungsfrist muss grösser oder gleich 0 sein", + "Clone Monitor": "Monitor klonen", + "Clone": "Klonen", + "cloneOf": "Klon von {0}", + "wayToGetZohoCliqURL": "Wie eine Webhook URL erstellt werden kann, erfährst du {0}.", + "enableGRPCTls": "Senden von gRPC Anforderungen mit TLS Verbindung zulassen", + "grpcMethodDescription": "Der Name der Methode wird in das \"cammelCase\" Format konvertiert (z.B. sayHello, check, etc.)", + "wayToGetKookGuildID": "Schalte den „Entwicklermodus“ in den Kook-Einstellungen ein und klicke mit der rechten Maustaste auf die Gilde, um die ID zu erhalten", + "Guild ID": "Gilde ID", + "Lowcost": "Kostengünstig", + "high": "hoch", + "Google Analytics ID": "Google Analytics ID", + "Enable TLS": "TLS aktivieren", + "Free Mobile API Key": "Kostenloser Mobile API Schlüssel", + "Proto Service Name": "Proto Dienst Name", + "Proto Method": "Proto Methode", + "Proto Content": "Proto Inhalt", + "Economy": "Economy", + "pagertreeIntegrationUrl": "Integrations-URL", + "pagertreeUrgency": "Dringlichkeit", + "pagertreeSilent": "Stumm", + "pagertreeLow": "Niedrig", + "pagertreeMedium": "Mittel", + "pagertreeHigh": "Hoch", + "pagertreeCritical": "Kritisch", + "pagertreeResolve": "Automatisch auflösen", + "pagertreeDoNothing": "Nichts tun", + "wayToGetPagerTreeIntegrationURL": "Nachdem du die Uptime Kuma Integration in PagerTree erstellt hast, kopiere den Endpunkt. Siehe details {0}", + "Server Address": "Serveradresse", + "Learn More": "Erfahre mehr", + "Edit Tag": "Tag editieren", + "promosmsAllowLongSMS": "Lange SMS erlauben", + "smseagleRecipientType": "Empfängertyp", + "smseagleToken": "API Zugriffstoken", + "smseagleTo": "Telefonnummer(n)", + "smseagleUrl": "Ihre SMSEagle Geräte URL", + "smseagleEncoding": "Als Unicode senden", + "smseaglePriority": "Nachrichtenpriorität (0-9, Standard = 0)", + "smseagleContact": "Telefonbuch Kontaktname(n)", + "confirmDeleteTagMsg": "Möchtest du dieses Tag wirklich löschen? Monitore, die mit diesem Tag verknüpft sind, werden nicht gelöscht.", + "wayToGetKookBotToken": "Erstelle eine Anwendung und erhalte den Bot-Token unter {0}", + "Strategy": "Strategie", + "Free Mobile User Identifier": "Kostenlose mobile Benutzerkennung", + "smseagleGroup": "Telefonbuch Gruppenname(n)", + "smseagleRecipient": "Empfänger (mehrere müssen durch Komma getrennt werden)", + "API Keys": "API Schlüssel", + "Continue": "Weiter", + "Add New Tag": "Neuen Tag hinzufügen", + "lunaseaTarget": "Ziel", + "lunaseaDeviceID": "Geräte-ID", + "lunaseaUserID": "Benutzer-ID", + "ntfyAuthenticationMethod": "Authentifizierungsmethode", + "ntfyUsernameAndPassword": "Benutzername und Passwort", + "twilioAccountSID": "Account SID", + "twilioFromNumber": "Absender", + "twilioToNumber": "Empfänger", + "twilioAuthToken": "Auth Token", + "statusPageRefreshIn": "Aktualisierung in: {0}", + "sameAsServerTimezone": "Gleiche Zeitzone wie Server", + "startDateTime": "Start Datum/Uhrzeit", + "endDateTime": "Ende Datum/Uhrzeit", + "cronExpression": "Cron-Ausdruck", + "cronSchedule": "Zeitplan: ", + "invalidCronExpression": "Ungültiger Cron-Ausdruck: {0}" +} diff --git a/src/lang/de-DE.json b/src/lang/de-DE.json index 37fd7a86a3..48a8cd7137 100644 --- a/src/lang/de-DE.json +++ b/src/lang/de-DE.json @@ -1,753 +1,755 @@ -{ - "languageName": "Deutsch (Deutschland)", - "Settings": "Einstellungen", - "Dashboard": "Dashboard", - "New Update": "Aktualisierung 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 Authentifizierung deaktivieren möchtest?", - "disableauth.message2": "Dies ist für Szenarien gedacht, in denen man eine externe Authentifizierung 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 Entwicklerkonsole - {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": "Erstellt mit", - "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": "Geheimer Zugangsschlüssel", - "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 Spielserver", - "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). Engagiere 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 Typ", - "SMSManager": "SMSManager", - "You can divide numbers with": "Du kannst Zahlen teilen mit", - "or": "oder", - "recurringInterval": "Intervall", - "Recurring": "Wiederkehrend", - "Single Maintenance Window": "Einmaliges Wartungsfenster", - "Maintenance Time Window of a Day": "Zeitfenster für die Wartung", - "Effective Date Range": "Bereich der Wirksamkeitsdaten (Optional)", - "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. Deaktiviere es, wenn Probleme auftreten.", - "loadingError": "Die Daten konnten nicht abgerufen werden, bitte später noch einmal versuchen.", - "confirmUninstallPlugin": "Möchtest du 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": "Wie eine Webhook URL erstellt werden kann, erfährst du {0}.", - "dataRetentionTimeError": "Aufbewahrungszeit muss 0 oder größer sein", - "infiniteRetention": "Für unendliche Aufbewahrung auf 0 setzen.", - "confirmDeleteTagMsg": "Möchtest du dieses Tag wirklich löschen? Monitore, die mit diesem Tag verknüpft sind, werden nicht gelöscht.", - "enableGRPCTls": "Senden von gRPC-Anforderungen mit TLS-Verbindung zulassen", - "ZohoCliq": "ZohoCliq", - "Monitor": "Überwachung | Monitore", - "plugin": "Plugin | Plugins", - "install": "Installieren", - "installing": "Installiere", - "uninstall": "Deinstallieren", - "uninstalling": "Deinstallation", - "markdownSupported": "Markdown-Syntax unterstützt", - "wayToGetKookBotToken": "Erstelle eine Anwendung und erhalte den Bot-Token unter {0}", - "wayToGetKookGuildID": "Schalte den „Entwicklermodus“ in den Kook-Einstellungen ein und klicke mit der rechten Maustaste auf die Gilde, um die ID zu erhalten", - "Guild ID": "Guild-ID", - "Free Mobile User Identifier": "Kostenlose mobile Benutzerkennung", - "Free Mobile API Key": "Kostenloser Mobile API-Schlüssel", - "Enable TLS": "Aktiviere TLS", - "Proto Service Name": "Name des Proto-Dienstes", - "Proto Method": "Proto-Methode", - "Proto Content": "Proto-Inhalt", - "Economy": "Wirtschaft", - "Lowcost": "Kostengünstig", - "high": "hoch", - "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 durch Komma getrennt werden)", - "smseagleToken": "API-Zugriffstoken", - "smseagleUrl": "Ihre 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", - "Body Encoding": "Körperkodierung", - "Add API Key": "API Schlüssel hinzufügen", - "apiKey-active": "Aktiv", - "apiKey-expired": "Abgelaufen", - "apiKey-inactive": "Inaktiv", - "Expires": "Läuft ab", - "deleteAPIKeyMsg": "Bist du sicher, dass du diesen API Schlüssel löschen willst?", - "Generate": "Generieren", - "API Keys": "API Schlüssel", - "Expiry": "Ablauf", - "Expiry date": "Ablaufdatum", - "Don't expire": "Nicht ablaufen", - "Continue": "Weiter", - "Add Another": "Hinzufügen", - "Clone Monitor": "Duplikat von", - "Clone": "Duplizieren", - "cloneOf": "Duplikat von {0}", - "pagertreeIntegrationUrl": "Integrations URL", - "pagertreeUrgency": "Dringlichkeit", - "pagertreeSilent": "Leise", - "pagertreeLow": "Niedrig", - "pagertreeMedium": "Medium", - "pagertreeHigh": "Hoch", - "pagertreeCritical": "Kritisch", - "pagertreeResolve": "Automatisch Auflösen", - "No API Keys": "Keine API Schlüssel", - "disableAPIKeyMsg": "Bist du sicher, dass du diesen API Schlüssel deaktivieren willst?", - "pagertreeDoNothing": "Nichts tun", - "wayToGetPagerTreeIntegrationURL": "Nachdem du die Uptime Kuma Integration in PagerTree erstellt hast, kopiere den Endpunkt. Siehe details {0}", - "telegramProtectContent": "Schütze gegen Weiterleiten/Speichern der Nachricht", - "telegramProtectContentDescription": "Die Bot-Nachrichten in Telegram sind gegen Weiterleitung und Speichern geschützt.", - "notificationRegional": "Regional", - "Key Added": "Schlüssel hinzugefügt", - "apiKeyAddedMsg": "API Schlüssel wurde hinzugefügt. Bitte notiere den Schlüssel, da er nicht erneut angezeigt wird.", - "telegramMessageThreadID": "(Optional) Nachrichten Thread ID", - "telegramMessageThreadIDDescription": "Optionale eindeutige Kennung für den Ziel-Thread (Thema) des Forums; nur für Forum-Supergroups", - "telegramSendSilently": "Stumm Senden", - "telegramSendSilentlyDescription": "Sende die Nachricht stumm. Nutzer bekommen eine Benachrichtigung ohne Ton.", - "Add New Tag": "Neuen Tag hinzufügen", - "lunaseaDeviceID": "Geräte-ID", - "lunaseaTarget": "Ziel", - "lunaseaUserID": "Benutzer-ID", - "twilioAccountSID": "Account SID", - "twilioFromNumber": "Absender", - "twilioToNumber": "Empfänger", - "twilioAuthToken": "Auth Token", - "statusPageRefreshIn": "Aktualisierung in: {0}", - "sameAsServerTimezone": "Gleiche Zeitzone wie Server", - "startDateTime": "Start Datum/Uhrzeit", - "endDateTime": "Ende Datum/Uhrzeit", - "cronExpression": "Cron-Ausdruck", - "cronSchedule": "Zeitplan: ", - "invalidCronExpression": "Ungültiger Cron-Ausdruck: {0}" -} +{ + "languageName": "Deutsch (Deutschland)", + "Settings": "Einstellungen", + "Dashboard": "Dashboard", + "New Update": "Aktualisierung 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 Authentifizierung deaktivieren möchtest?", + "disableauth.message2": "Dies ist für Szenarien gedacht, in denen man eine externe Authentifizierung 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 Entwicklerkonsole - {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": "Erstellt mit", + "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": "Geheimer Zugangsschlüssel", + "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 Spielserver", + "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). Engagiere 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 Typ", + "SMSManager": "SMSManager", + "You can divide numbers with": "Du kannst Zahlen teilen mit", + "or": "oder", + "recurringInterval": "Intervall", + "Recurring": "Wiederkehrend", + "Single Maintenance Window": "Einmaliges Wartungsfenster", + "Maintenance Time Window of a Day": "Zeitfenster für die Wartung", + "Effective Date Range": "Bereich der Wirksamkeitsdaten (Optional)", + "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. Deaktiviere es, wenn Probleme auftreten.", + "loadingError": "Die Daten konnten nicht abgerufen werden, bitte später noch einmal versuchen.", + "confirmUninstallPlugin": "Möchtest du 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": "Wie eine Webhook URL erstellt werden kann, erfährst du {0}.", + "dataRetentionTimeError": "Aufbewahrungszeit muss 0 oder größer sein", + "infiniteRetention": "Für unendliche Aufbewahrung auf 0 setzen.", + "confirmDeleteTagMsg": "Möchtest du dieses Tag wirklich löschen? Monitore, die mit diesem Tag verknüpft sind, werden nicht gelöscht.", + "enableGRPCTls": "Senden von gRPC-Anforderungen mit TLS-Verbindung zulassen", + "ZohoCliq": "ZohoCliq", + "Monitor": "Überwachung | Monitore", + "plugin": "Plugin | Plugins", + "install": "Installieren", + "installing": "Installiere", + "uninstall": "Deinstallieren", + "uninstalling": "Deinstallation", + "markdownSupported": "Markdown-Syntax unterstützt", + "wayToGetKookBotToken": "Erstelle eine Anwendung und erhalte den Bot-Token unter {0}", + "wayToGetKookGuildID": "Schalte den „Entwicklermodus“ in den Kook-Einstellungen ein und klicke mit der rechten Maustaste auf die Gilde, um die ID zu erhalten", + "Guild ID": "Guild-ID", + "Free Mobile User Identifier": "Kostenlose mobile Benutzerkennung", + "Free Mobile API Key": "Kostenloser Mobile API-Schlüssel", + "Enable TLS": "Aktiviere TLS", + "Proto Service Name": "Name des Proto-Dienstes", + "Proto Method": "Proto-Methode", + "Proto Content": "Proto-Inhalt", + "Economy": "Wirtschaft", + "Lowcost": "Kostengünstig", + "high": "hoch", + "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 durch Komma getrennt werden)", + "smseagleToken": "API-Zugriffstoken", + "smseagleUrl": "Ihre 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", + "Body Encoding": "Körperkodierung", + "Add API Key": "API Schlüssel hinzufügen", + "apiKey-active": "Aktiv", + "apiKey-expired": "Abgelaufen", + "apiKey-inactive": "Inaktiv", + "Expires": "Läuft ab", + "deleteAPIKeyMsg": "Bist du sicher, dass du diesen API Schlüssel löschen willst?", + "Generate": "Generieren", + "API Keys": "API Schlüssel", + "Expiry": "Ablauf", + "Expiry date": "Ablaufdatum", + "Don't expire": "Nicht ablaufen", + "Continue": "Weiter", + "Add Another": "Hinzufügen", + "Clone Monitor": "Duplikat von", + "Clone": "Duplizieren", + "cloneOf": "Duplikat von {0}", + "pagertreeIntegrationUrl": "Integrations URL", + "pagertreeUrgency": "Dringlichkeit", + "pagertreeSilent": "Leise", + "pagertreeLow": "Niedrig", + "pagertreeMedium": "Medium", + "pagertreeHigh": "Hoch", + "pagertreeCritical": "Kritisch", + "pagertreeResolve": "Automatisch Auflösen", + "No API Keys": "Keine API Schlüssel", + "disableAPIKeyMsg": "Bist du sicher, dass du diesen API Schlüssel deaktivieren willst?", + "pagertreeDoNothing": "Nichts tun", + "wayToGetPagerTreeIntegrationURL": "Nachdem du die Uptime Kuma Integration in PagerTree erstellt hast, kopiere den Endpunkt. Siehe details {0}", + "telegramProtectContent": "Schütze gegen Weiterleiten/Speichern der Nachricht", + "telegramProtectContentDescription": "Die Bot-Nachrichten in Telegram sind gegen Weiterleitung und Speichern geschützt.", + "notificationRegional": "Regional", + "Key Added": "Schlüssel hinzugefügt", + "apiKeyAddedMsg": "API Schlüssel wurde hinzugefügt. Bitte notiere den Schlüssel, da er nicht erneut angezeigt wird.", + "telegramMessageThreadID": "(Optional) Nachrichten Thread ID", + "telegramMessageThreadIDDescription": "Optionale eindeutige Kennung für den Ziel-Thread (Thema) des Forums; nur für Forum-Supergroups", + "telegramSendSilently": "Stumm Senden", + "telegramSendSilentlyDescription": "Sende die Nachricht stumm. Nutzer bekommen eine Benachrichtigung ohne Ton.", + "Add New Tag": "Neuen Tag hinzufügen", + "lunaseaDeviceID": "Geräte-ID", + "lunaseaTarget": "Ziel", + "lunaseaUserID": "Benutzer-ID", + "ntfyAuthenticationMethod": "Authentifizierungsmethode", + "ntfyUsernameAndPassword": "Benutzername und Passwort", + "twilioAccountSID": "Account SID", + "twilioFromNumber": "Absender", + "twilioToNumber": "Empfänger", + "twilioAuthToken": "Auth Token", + "statusPageRefreshIn": "Aktualisierung in: {0}", + "sameAsServerTimezone": "Gleiche Zeitzone wie Server", + "startDateTime": "Start Datum/Uhrzeit", + "endDateTime": "Ende Datum/Uhrzeit", + "cronExpression": "Cron-Ausdruck", + "cronSchedule": "Zeitplan: ", + "invalidCronExpression": "Ungültiger Cron-Ausdruck: {0}" +} diff --git a/src/lang/en.json b/src/lang/en.json index 80b95e1a69..6df6261d97 100644 --- a/src/lang/en.json +++ b/src/lang/en.json @@ -1,721 +1,723 @@ -{ - "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 disable authentication?", - "disableauth.message2": "It is designed for scenarios where you intend to implement third-party authentication 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 Tag": "Add New Tag", - "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.", - "statusPageRefreshIn": "Refresh in: {0}", - "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 VACUUM FULL for PostgreSQL database.", - "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", - "sameAsServerTimezone": "Same as Server Timezone", - "startDateTime": "Start Date/Time", - "endDateTime": "End Date/Time", - "cronExpression": "Cron Expression", - "cronSchedule": "Schedule: ", - "invalidCronExpression": "Invalid Cron Expression: {0}", - "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 (Optional)", - "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", - "Clone Monitor": "Clone Monitor", - "Clone": "Clone", - "cloneOf": "Clone of {0}", - "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": "You are about to delete ALL statistics for ALL monitors! Seems a bit EXTREME ...", - "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", - "API Keys": "API Keys", - "Expiry": "Expiry", - "Expiry date": "Expiry date", - "Don't expire": "Don't expire", - "Continue": "Continue", - "Add Another": "Add Another", - "Key Added": "Key Added", - "apiKeyAddedMsg": "Your API key has been added. Please make a note of it as it will not be shown again.", - "Add API Key": "Add API Key", - "No API Keys": "No API Keys", - "apiKey-active": "Active", - "apiKey-expired": "Expired", - "apiKey-inactive": "Inactive", - "Expires": "Expires", - "disableAPIKeyMsg": "Are you sure you want to disable this API key?", - "deleteAPIKeyMsg": "Are you sure you want to delete this API key?", - "Generate": "Generate", - "pagertreeIntegrationUrl": "Integration URL", - "pagertreeUrgency": "Urgency", - "pagertreeSilent": "Silent", - "pagertreeLow": "Low", - "pagertreeMedium": "Medium", - "pagertreeHigh": "High", - "pagertreeCritical": "Critical", - "pagertreeResolve": "Auto Resolve", - "pagertreeDoNothing": "Do Nothing", - "wayToGetPagerTreeIntegrationURL": "After creating the Uptime Kuma integration in PagerTree, copy the Endpoint. See full details {0}", - "lunaseaTarget": "Target", - "lunaseaDeviceID": "Device ID", - "lunaseaUserID": "User ID", - "twilioAccountSID": "Account SID", - "twilioAuthToken": "Auth Token", - "twilioFromNumber": "From Number", - "twilioToNumber": "To Number" -} +{ + "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 disable authentication?", + "disableauth.message2": "It is designed for scenarios where you intend to implement third-party authentication 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 Tag": "Add New Tag", + "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.", + "statusPageRefreshIn": "Refresh in: {0}", + "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 VACUUM FULL for PostgreSQL database.", + "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", + "sameAsServerTimezone": "Same as Server Timezone", + "startDateTime": "Start Date/Time", + "endDateTime": "End Date/Time", + "cronExpression": "Cron Expression", + "cronSchedule": "Schedule: ", + "invalidCronExpression": "Invalid Cron Expression: {0}", + "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 (Optional)", + "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", + "Clone Monitor": "Clone Monitor", + "Clone": "Clone", + "cloneOf": "Clone of {0}", + "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": "You are about to delete ALL statistics for ALL monitors! Seems a bit EXTREME ...", + "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", + "API Keys": "API Keys", + "Expiry": "Expiry", + "Expiry date": "Expiry date", + "Don't expire": "Don't expire", + "Continue": "Continue", + "Add Another": "Add Another", + "Key Added": "Key Added", + "apiKeyAddedMsg": "Your API key has been added. Please make a note of it as it will not be shown again.", + "Add API Key": "Add API Key", + "No API Keys": "No API Keys", + "apiKey-active": "Active", + "apiKey-expired": "Expired", + "apiKey-inactive": "Inactive", + "Expires": "Expires", + "disableAPIKeyMsg": "Are you sure you want to disable this API key?", + "deleteAPIKeyMsg": "Are you sure you want to delete this API key?", + "Generate": "Generate", + "pagertreeIntegrationUrl": "Integration URL", + "pagertreeUrgency": "Urgency", + "pagertreeSilent": "Silent", + "pagertreeLow": "Low", + "pagertreeMedium": "Medium", + "pagertreeHigh": "High", + "pagertreeCritical": "Critical", + "pagertreeResolve": "Auto Resolve", + "pagertreeDoNothing": "Do Nothing", + "wayToGetPagerTreeIntegrationURL": "After creating the Uptime Kuma integration in PagerTree, copy the Endpoint. See full details {0}", + "lunaseaTarget": "Target", + "lunaseaDeviceID": "Device ID", + "lunaseaUserID": "User ID", + "ntfyAuthenticationMethod": "Authentication Method", + "ntfyUsernameAndPassword": "Username and Password", + "twilioAccountSID": "Account SID", + "twilioAuthToken": "Auth Token", + "twilioFromNumber": "From Number", + "twilioToNumber": "To Number" +} diff --git a/src/pages/Details.vue b/src/pages/Details.vue index 26159290ce..688271a31f 100644 --- a/src/pages/Details.vue +++ b/src/pages/Details.vue @@ -1,535 +1,569 @@ - - - - - + + + + + diff --git a/src/pages/EditMaintenance.vue b/src/pages/EditMaintenance.vue index 4ef3f18df7..d3ec17373b 100644 --- a/src/pages/EditMaintenance.vue +++ b/src/pages/EditMaintenance.vue @@ -1,586 +1,584 @@ - - - - - + + + + + diff --git a/src/pages/StatusPage.vue b/src/pages/StatusPage.vue index 8825d25efd..4c6973bc25 100644 --- a/src/pages/StatusPage.vue +++ b/src/pages/StatusPage.vue @@ -1,1186 +1,1184 @@ - - - - - + + + + +