Compare commits

..

519 Commits

Author SHA1 Message Date
Louis Lam
b31af8a15c update to 1.12.1 2022-02-26 17:05:13 +08:00
Louis Lam
60f67ccb35 Revert commit: a6fd626f 2022-02-26 16:57:13 +08:00
Louis Lam
81a9807a0a Update release procedures 2022-02-26 16:03:43 +08:00
Louis Lam
3681934d05 Update Apprise to 0.9.7 2022-02-26 15:57:26 +08:00
Louis Lam
d5d63474d8 update to 1.12.0 2022-02-26 15:41:32 +08:00
Louis Lam
a6fd626fb8 Locked Russian language, ask Putin to stop the war and unlock it 2022-02-26 14:56:57 +08:00
Louis Lam
3a5b413af4 Update axios to 0.26.0 due to vulnerability 2022-02-26 14:36:38 +08:00
Louis Lam
595cd93220 Check invalid interval 2022-02-24 15:11:17 +08:00
Louis Lam
e12c1511db Merge pull request #1330 from BCsabaEngine/master
fix: hu lang
2022-02-23 22:36:05 +08:00
Balázs Csaba
f3112c0b85 fix: hu lang 2022-02-23 09:35:56 +01:00
Louis Lam
af07850ddf Merge pull request #1287 from sovushik/patch-5
Update ru-RU.js
2022-02-21 15:12:27 +08:00
Louis Lam
211b44269c Do not close feature-request 2022-02-21 11:48:03 +08:00
Louis Lam
7638b73645 Fix #1300 2022-02-15 23:30:07 +08:00
Louis Lam
d0ed99a310 Merge pull request #1298 from ananthkamath/master
Fix mattermost couldn't find channel issue
2022-02-13 23:56:12 +08:00
Ananth Kamath
258d93be72 Fix mattermost couldn't find channel issue 2022-02-13 21:17:02 +05:30
Louis Lam
986ddd92ff Merge pull request #1198 from Buchtic/master
CSY translation
2022-02-13 14:11:00 +08:00
sovushik
79f99ce215 Update ru-RU.js
Add new string
2022-02-09 21:19:00 +05:00
Louis Lam
e7e30bf497 update to 1.11.4 2022-02-09 21:54:33 +08:00
Louis Lam
efaa55ad1f Merge pull request #1269 from holao09/master
Update Vietnamese language
2022-02-09 21:42:02 +08:00
Louis Lam
32a898bee5 Merge pull request #1270 from rovast/master
Update zh-CN  translation for setting module.
2022-02-09 21:36:07 +08:00
Louis Lam
561a0a3c9a Merge pull request #1278 from jamesmacwhite/disable-auth-lang
Fix minor typos on disable auth warning
2022-02-09 21:35:37 +08:00
Việt Nguyễn
daac9ddffc Update Vietnamese language
Cập nhật một số thông tin tiếng Việt
2022-02-09 16:17:10 +07:00
James White
6bd2ee8c69 Fix minor typos on disable auth warning 2022-02-08 21:53:15 +00:00
rovast
45dca072b2 Update zh-CN translation for setting module. 2022-02-07 15:28:21 +08:00
Louis Lam
742ad083e5 Fix security vulnerabilities 2022-02-03 12:26:50 +08:00
Louis Lam
27f4f5ee0b Merge remote-tracking branch 'origin/master' 2022-02-03 12:20:29 +08:00
Louis Lam
41f1686147 Fix security vulnerabilities 2022-02-03 12:20:15 +08:00
Louis Lam
faab1ead92 Merge pull request #1251 from dave9123/patch-2
id-ID.js - Fixed the grammar issue
2022-02-03 12:11:31 +08:00
dave9123
c1c1e2ba5b Fixed the grammar issue
Here's my pull request
2022-02-02 10:13:55 +07:00
Louis Lam
2f7e24191a Merge pull request #1237 from dave9123/patch-1
[id-ID] Fixed some grammar error
2022-02-02 00:31:50 +08:00
vfaergestad
0fce1b4b9b Update nb-NO.js (#1232)
Improved and finished the translation.
2022-02-02 00:31:00 +08:00
dave9123
65896ed035 Fixed some grammar error
I fixed at some part of the text.
2022-01-31 08:01:45 +07:00
Phuong Nguyen Minh
a9df7b4a14 Update vi.js (#1226)
* update vi.js
2022-01-28 21:23:37 +08:00
Louis Lam
c3c4db52ec Merge pull request #1184 from Khord/patch-1
Rename 2FA/TOTP field ID for password manager filling compatibility
2022-01-20 15:18:42 +08:00
Louis Lam
aba6cb2c52 Merge pull request #1169 from jbenguira/patch-1
Fixed #1024
2022-01-19 14:41:15 +08:00
Louis Lam
ff0e85737f Merge pull request #1182 from sovushik/patch-4
Update ru-RU.js
2022-01-19 14:37:08 +08:00
Buchtič
4713820da7 first csy translation 2022-01-18 14:44:11 +01:00
Buchtič
a99e87c02c cs-CZ 2022-01-18 08:50:11 +01:00
Buchtič
3f8ca82434 cs-CZ translation 2022-01-18 08:48:39 +01:00
Buchtič
60f1eb7b45 new cs-CZ.js 2022-01-17 18:42:32 +01:00
Louis
55a593f75d Merge remote-tracking branch 'origin/master' 2022-01-18 01:24:28 +08:00
Louis
a0d51a15cf Fix security vulnerabilities 2022-01-18 01:24:07 +08:00
Louis Lam
5a08b42e4f Merge pull request #1194 from Rayzggz/master
Update zh-CN.js
2022-01-18 01:17:33 +08:00
Louis
6961af005e eslint 2022-01-18 01:12:25 +08:00
Roy Feng
847a19afc1 Update zh-CN.js 2022-01-17 15:03:39 +08:00
Louis Lam
7532e7fd3e Merge pull request #1192 from drodmantras/master
Update sl-SI.js
2022-01-17 14:18:27 +08:00
Erik
63a3704836 Update sl-SI.js 2022-01-16 12:29:00 +01:00
Louis
bd8fa17887 Merge remote-tracking branch 'origin/master' 2022-01-15 01:25:50 +08:00
Louis
d1a99b0a22 Check Node.js version, better error message 2022-01-15 01:25:28 +08:00
Joseph Benguira
3b9fac2942 Update server/prometheus.js
removed useless spaces

Co-authored-by: Adam Stachowicz <saibamenppl@gmail.com>
2022-01-14 08:51:45 +02:00
Dylan Khor
812e80030b revert Token because of language file 2022-01-13 23:43:57 -05:00
Dylan Khor
b89efa49aa retain Token verbiage in display name
since "Token" is used in several places in the 2FA setup screen
2022-01-13 16:58:46 -05:00
Dylan Khor
6490ef3787 rename 2fa input element id and display name 2022-01-13 16:46:09 -05:00
sovushik
329c8cbc2d Update ru-RU.js
Add new string
2022-01-13 22:07:21 +05:00
Louis Lam
2bf9764cec Merge pull request #1175 from sovushik/patch-3
Update ru-RU.js
2022-01-13 13:18:23 +08:00
Louis Lam
c116754360 Merge pull request #1171 from Saibamen/patch-1
Update pl.js
2022-01-13 13:17:06 +08:00
Louis Lam
2c7a701c84 Merge remote-tracking branch 'origin/master' 2022-01-13 11:24:21 +08:00
Louis Lam
fd1fce0143 Update stylelint from 13.13.x to 14.2.x 2022-01-13 11:15:38 +08:00
sovushik
52e0d74a1e Update ru-RU.js
Add new string
2022-01-12 20:49:41 +05:00
Adam Stachowicz
23532aaafe Update pl.js
Addendum to ab61acab63
2022-01-12 12:26:23 +01:00
Louis Lam
ab61acab63 Merge pull request #1170 from NixNotCastey/update-pl
Update pl.js
2022-01-12 17:39:12 +08:00
Łukasz Szczepański
06aab3dee8 Added missing text and fix typos 2022-01-12 09:48:37 +01:00
Joseph Benguira
13acdd4c65 Fix for issue in logs
This fix address the issue described here: https://github.com/louislam/uptime-kuma/issues/1024
2022-01-12 10:12:12 +02:00
Louis Lam
fe0bce268d Merge pull request #1164 from ledeuns/master
Fix comment (FreeBSD->*BSD)
2022-01-12 01:49:57 +08:00
Louis
ed64853125 Keep FBSD, BSD for ping only 2022-01-12 01:44:01 +08:00
Denis
0f822d3b2a FBSD does not exists anymore 2022-01-11 13:42:51 +01:00
Denis
6bda5c6329 update comment 2022-01-11 13:39:45 +01:00
Denis Fondras
44bc98a453 Merge branch 'louislam:master' into master 2022-01-11 13:37:54 +01:00
Louis
f9751d0c01 Fix FBSD to BSD https://github.com/louislam/uptime-kuma/pull/1155#issuecomment-1009544236 2022-01-11 19:15:28 +08:00
Denis
53df9a36e3 reintroduce exports.FBSD 2022-01-11 10:07:00 +01:00
Louis Lam
ccfd04a431 Merge pull request #1155 from ledeuns/master
ping path is common to all BSDs
2022-01-10 18:20:06 +08:00
Louis Lam
9324137123 Merge pull request #1151 from sovushik/patch-2
Update ru-RU.js
2022-01-10 18:19:04 +08:00
Louis Lam
9f063cf477 Merge branch 'master' into patch-2 2022-01-10 17:56:47 +08:00
Louis Lam
b83c896d0c Merge pull request #1150 from sovushik/patch-1
Update ru-RU.js
2022-01-10 17:55:46 +08:00
Louis Lam
aa37383065 Merge pull request #1154 from jamesmacwhite/pull-request-guidelines
Update PULL_REQUEST_TEMPLATE.md
2022-01-10 17:54:55 +08:00
Louis Lam
5e2c39eb4b Merge pull request #1144 from alex3025/master
Fixed italian (it-IT) translations
2022-01-10 17:54:22 +08:00
Louis Lam
2a1f011f05 Merge pull request #1153 from drodmantras/master
Update sl-SI.js
2022-01-10 17:53:03 +08:00
Denis
8063449f49 ping path is common to all BSDs 2022-01-09 17:27:24 +01:00
James White
b6ad4c845a Update PULL_REQUEST_TEMPLATE.md
Correct checklist item and make the UI type of change consistent with all others.
2022-01-09 15:31:26 +00:00
Erik
cdcdf377ec Update sl-SI.js
Small langue updates
2022-01-09 11:39:05 +01:00
sovushik
30a345d8b6 Update ru-RU.js
Updated language files and added new lines
2022-01-08 23:00:18 +05:00
sovushik
83d60fea29 Update ru-RU.js
1. Updated the language lines (in the correct declension)
2. Added new lines for the "Create Incident" functionality
2022-01-08 22:46:05 +05:00
Matteo D
2304c53c8d Fixed some translations
And made them more user-friendly.
2022-01-08 13:28:48 +01:00
Louis Lam
d4b86dc472 Merge pull request #1133 from thomasleveil/patch-1
fix `TypeError: Cannot read property 'id' of null`
2022-01-06 16:19:36 +08:00
Thomas LÉVEIL
46fa6a56fa fix TypeError: Cannot read property 'id' of null
when testing a Google Chat notification

see https://github.com/louislam/uptime-kuma/issues/1126#issuecomment-1006343423
2022-01-06 08:48:12 +01:00
Louis Lam
ec5037f30d update to 1.11.3 2022-01-06 14:51:20 +08:00
Louis Lam
81a194d826 Merge remote-tracking branch 'origin/master' 2022-01-06 14:47:21 +08:00
Louis Lam
64b3e04d3f Fix #1129 2022-01-06 14:34:45 +08:00
Louis Lam
4ee829ab25 Merge pull request #1130 from bilipp/google-chat-notifications
Fix Google Chat notification type mismatch
2022-01-06 13:05:55 +08:00
Philipp Bischoff
bcc3cec7d6 extract translation for notification type 2022-01-05 23:57:40 +01:00
Philipp Bischoff
f8c5015e3f fix google chat type mismatch 2022-01-05 23:44:14 +01:00
Louis Lam
8f3ec33591 update to 1.11.2 2022-01-05 16:40:50 +08:00
Louis Lam
c5fe3a64c2 Merge remote-tracking branch 'origin/master' 2022-01-05 16:26:03 +08:00
Louis Lam
2a1456cfd0 Merge pull request #1124 from MrEddX/bulgarian
Update bg-BG.js
2022-01-05 14:28:39 +08:00
MrEddX
69dfc0c0d2 Update bg-BG.js
Fixed some typos.
2022-01-05 08:15:34 +02:00
Louis Lam
6d11289257 Merge pull request #1095 from LeslieLeung/add-wecom-notification
feat(*): support WeCom notification
2022-01-04 22:50:30 +08:00
Leslie Leung
590859a95b Merge branch 'master' into add-wecom-notification 2022-01-03 21:43:56 +08:00
Louis Lam
f9c0ff1841 Merge pull request #1109 from iomataani/master
Updated translation
2022-01-03 20:05:46 +08:00
Louis Lam
a8566acbaa Merge pull request #1116 from Minvinea/master
Update translation FR
2022-01-03 20:04:33 +08:00
Minvinea
4b07ec23fe Update 2022-01-03 00:27:51 +01:00
Ioma Taani
0e50b71290 Merge branch 'louislam:master' into master 2021-12-31 09:09:53 +01:00
Louis Lam
390b50353f Merge pull request #1106 from MrEddX/bulgarian
Update bg-BG.js
2021-12-30 19:10:42 +08:00
MrEddX
d7cb4fa331 Update bg-BG.js
- Updated Bulgarian language file
2021-12-30 08:12:25 +02:00
Louis Lam
e18d4b6ad0 Merge pull request #1045 from bilipp/google-chat-notifications
Add support for Google Chat Notifications
2021-12-30 00:16:34 +08:00
Louis Lam
f6fc3737fc Change name from "Google Chat" to Google Chat (Google Workspace only) 2021-12-30 00:10:54 +08:00
Louis Lam
4005856ba6 run build dist when building docker image 2021-12-27 19:09:51 +08:00
LeslieLeung
40b70277c7 feat(*): support WeCom notification 2021-12-26 13:11:42 +08:00
Ioma Taani
a2bc74c4fd updated 2021-12-24 12:02:50 +01:00
Louis Lam
a48176bd48 Merge pull request #1080 from chakflying/feat/smtp-dkim
Feat: Add SMTP DKIM settings
2021-12-22 20:08:29 +08:00
Louis Lam
7cfc5c64b7 Missing a full stop 2021-12-22 13:49:57 +08:00
Nelson Chan
624cd862a5 Feat: Expose SMTP DKIM settings 2021-12-19 13:30:53 +08:00
Louis Lam
0ca68f791f Merge pull request #1060 from drodmantras/master
Added sl-SI language
2021-12-18 00:58:56 +08:00
Louis Lam
6127eab517 Merge pull request #1071 from MrEddX/bulgarian
Update bg-BG.js
2021-12-18 00:57:31 +08:00
MrEddX
0de7fb69f6 Update bg-BG.js
Added new fields.
Translated new fields.
2021-12-17 12:29:53 +02:00
Louis Lam
a42932a43e Simulate Chrome's request Accept header. Better handling of #1067 2021-12-16 15:09:10 +08:00
Philipp Bischoff
a6072a0e30 google chat: only show offline message in notification when service went down 2021-12-15 13:40:21 +01:00
Ivan Bratović
475a466c7e Add attribute to basicauth-pass to prevent browsers from autocompleting (#1063) 2021-12-15 18:18:30 +08:00
Louis Lam
5bc68d7f3b Update README.md 2021-12-15 02:50:45 +08:00
Louis Lam
000703837b Update README.md 2021-12-15 02:46:13 +08:00
Erik
b10cecb362 Added sl-SI language
Added sl-SI language
2021-12-14 17:59:26 +01:00
Louis Lam
6d6cb2ad49 Merge pull request #1047 from dhfhfk/master
Update Ko-KR.js
2021-12-14 17:28:38 +08:00
Louis Lam
cb76801b85 Merge pull request #1049 from Ponkhy/german-language
Updated de-De.js
2021-12-14 13:17:22 +08:00
Ponkhy
aa92727a61 Updated de-De 2021-12-12 21:52:51 +01:00
dhfhfk
56dfa05642 Update Ko-KR.js 2021-12-12 18:56:10 +09:00
Philipp Bischoff
8ad6bd31d4 Revert "order notification types by name"
This reverts commit 8398466860.
2021-12-12 00:08:33 +01:00
Philipp Bischoff
a71569379e add missing import 2021-12-12 00:01:12 +01:00
Philipp Bischoff
8398466860 order notification types by name 2021-12-11 23:50:03 +01:00
Philipp Bischoff
8050cb8e99 implement google chat notification type 2021-12-11 23:43:12 +01:00
Louis Lam
71492aeb3a Merge remote-tracking branch 'origin/master' 2021-12-11 20:59:45 +08:00
Louis Lam
5ee5ea909d Add Github Action: close-incorrect-issue.yml 2021-12-11 20:59:31 +08:00
Louis Lam
a09b97f778 Merge pull request #1032 from titiscan/patch-1
Update fr-FR.js
2021-12-11 17:31:13 +08:00
Louis Lam
e0a08e6b5d Merge pull request #1038 from iomataani/master
Updated italian translation
2021-12-11 17:30:44 +08:00
Louis Lam
6f5cbbdf69 Merge pull request #1018 from Lrss/master
Update Danish translation
2021-12-11 17:29:46 +08:00
Louis Lam
34ee342d3e eslint 2021-12-11 17:20:51 +08:00
Ioma Taani
f793aa5264 better translations 2021-12-10 09:26:55 +01:00
Ioma Taani
728485d686 updated translations 2021-12-10 09:08:01 +01:00
titiscan
cb3429d3c7 Update fr-FR.js
typo fix
2021-12-09 17:26:05 +01:00
Louis Lam
0d69b4426e Merge pull request #1017 from SiderealArt/patch-1
update zh-TW translation
2021-12-09 21:32:10 +08:00
Louis Lam
8bb8b0a53c update to 1.11.1 2021-12-09 01:23:49 +08:00
Louis Lam
a4841eb8aa Fix #1016, .at() is not support in Safari 2021-12-09 01:19:09 +08:00
Lars Sørensen
2ef2a42e87 Fixed string enclosure as suggested by update-language-files 2021-12-08 11:35:55 +01:00
Lars Sørensen
9473cd6919 Update da-DK.js translation 2021-12-08 11:14:10 +01:00
SiderealArt
74f18a2b3f update zh-TW translation 2021-12-08 17:23:13 +08:00
Louis Lam
f9cd0eb084 fix upload-artifacts 2021-12-08 15:35:44 +08:00
Louis Lam
6a845bd937 Merge remote-tracking branch 'origin/master' 2021-12-08 15:26:19 +08:00
Louis Lam
c91f517121 Update README.md 2021-12-08 15:25:43 +08:00
Louis Lam
7899707582 update to 1.11.0 2021-12-08 15:17:37 +08:00
Louis Lam
12215af2f4 Merge pull request #1014 from iooner/patch-2
Fix typos
2021-12-08 15:04:33 +08:00
Louis Lam
d4bfe57b79 minor: improve formatting 2021-12-08 15:04:18 +08:00
Louis Lam
dcc91d6c72 Fix #922 2021-12-08 14:59:59 +08:00
iooner
a041a7964a Fix typos 2021-12-07 14:23:13 +01:00
Louis Lam
76611ecaca Merge pull request #1011 from iomataani/master
Updated translation
2021-12-07 19:26:22 +08:00
Ioma Taani
f802154456 updated 2021-12-06 11:33:39 +01:00
Ioma Taani
9fb461976d Merge branch 'louislam:master' into master 2021-12-06 11:32:24 +01:00
Louis Lam
c8e364911f Delete close-issue.yml, no idea why not working 2021-12-06 17:46:46 +08:00
Louis Lam
88bc08e7b7 Update close-issue.yml 2021-12-06 17:36:18 +08:00
Louis Lam
03aeab0421 close issues that don't follow the issue template
Copy from axios
2021-12-06 17:31:25 +08:00
Louis Lam
f331f1a63e Merge pull request #873 from Saibamen/fix_871
Fix Telegram Bot Token displayed in notification setup view
2021-12-05 18:04:54 +08:00
Louis
d645e29455 mask telegram api url with asterisk 2021-12-05 17:40:13 +08:00
Louis Lam
b4507f9706 Merge pull request #992 from jlbrt/stackfield-notifications
Add support for Stackfield notifications
2021-12-05 16:45:30 +08:00
Louis Lam
fc6d0d1fca Merge pull request #1000 from BCsabaEngine/master
NPM update and (boring) HU lang
2021-12-05 16:30:31 +08:00
Louis
b62f1475ee 🐍 2021-12-05 16:28:59 +08:00
Louis
d47d8517a8 update apprise to 0.9.6 2021-12-05 16:05:52 +08:00
Ioma Taani
19d2db6c8c better translation 2021-12-04 11:19:56 +01:00
Balázs Csaba
5a8162747c Upgrade qrcode to 1.5.0 2021-12-03 22:47:40 +01:00
Balázs Csaba
220108ebc6 Upgrade bree to 7.1 2021-12-03 22:39:38 +01:00
Balázs Csaba
984a3704e0 HU lang 2021-12-03 22:29:53 +01:00
Ioma Taani
909412c87e Merge branch 'louislam:master' into master 2021-12-03 11:11:38 +01:00
Ashish Bansal
481fd3a05f Updated monitor service details in README.md (#990)
* Updated monitor service details in README.md

Added `Steam Gamer Server' to the monitor service list.

* Update README.md

* Update README.md

* Update README.md
2021-12-03 15:49:46 +08:00
Louis Lam
5434e2da4f Merge pull request #993 from Saibamen/patch-1
Fix typos in markdown files
2021-12-03 15:48:57 +08:00
Ioma Taani
b3d348dcea Translation Update (#994)
* Better translation

* better translation

* aggiornato
2021-12-03 15:48:11 +08:00
Csaba Balázs
0aca0455ab HU language typo and missing items (#996)
* HU language

* run eslint on hu.js

* Last HU typo

* package.json valid required node engine syntax

Package.json required node engine version can contain multiple rules separated with ||. With this mode package-lock.json will be valid and error codes does not diplay.

Co-authored-by: Louis Lam <louislam@users.noreply.github.com>
2021-12-03 15:47:35 +08:00
Louis Lam
8f3ef734bc disable e2e test, as it is getting unstable recently on GitHub action 2021-12-03 01:31:19 +08:00
Ioma Taani
120eb0d85f aggiornato 2021-12-02 12:51:10 +01:00
Ioma Taani
4aaed0837e Merge branch 'louislam:master' into master 2021-12-02 12:44:13 +01:00
Adam Stachowicz
60657132c0 Update PULL_REQUEST_TEMPLATE.md 2021-12-02 11:19:59 +01:00
Adam Stachowicz
76cbef85d5 Update README.md 2021-12-02 11:18:30 +01:00
Adam Stachowicz
e17ef02008 Update CONTRIBUTING.md 2021-12-02 11:15:14 +01:00
Adam Stachowicz
f33d55c92d Update README.md 2021-12-02 11:09:27 +01:00
Jonas Liebert
67849a9e84 add support for stackfield notifications 2021-12-02 08:53:45 +01:00
Louis Lam
ee79a34148 Merge pull request #989 from BCsabaEngine/master
HU language typo
2021-12-02 12:44:18 +08:00
Louis Lam
d2f0480889 Merge pull request #988 from tgcentral/readme-md-typo
Typo correction
2021-12-02 12:43:19 +08:00
Balázs Csaba
c36190bba6 Node engine version 2021-12-01 15:40:22 +01:00
Balázs Csaba
4b3fae53d4 HU language typo 2021-12-01 15:32:39 +01:00
tgcentral
4dd60cba3d Typo correction 2021-12-01 09:43:58 +00:00
Ioma Taani
4bc84d2122 Merge branch 'louislam:master' into master 2021-12-01 08:47:57 +01:00
Louis Lam
a796f80018 Merge pull request #902 from ivanbratovic/improve-translatables
Fix untranslatable parts of the UI
2021-12-01 13:59:00 +08:00
Louis Lam
40cb22e671 Merge pull request #963 from kffl/feat/serwersms-provider
Add SerwerSMS.pl notification provider
2021-11-29 20:43:38 +08:00
Ivan Bratović
d95258e7db Merge remote-tracking branch 'upstream/master' into improve-translatables 2021-11-29 12:51:08 +01:00
Ivan Bratović
baae4b5a5e Remove unused translation keys from hr-HR 2021-11-29 12:49:38 +01:00
Ivan Bratović
c1b118a0f6 Use existing Example translation for HTTP headers and body placeholders 2021-11-29 12:49:08 +01:00
Ivan Bratović
9c5466890e Revert "Replace body and header placeholder functions with translations"
This reverts commit 2c85491ee0.
2021-11-29 12:40:53 +01:00
Louis Lam
bf8dbd78b3 temporary disable test for settings page 2021-11-29 17:25:30 +08:00
Louis Lam
6cd130de38 minor 2021-11-29 17:20:12 +08:00
Louis Lam
a864b72e03 fix pushover for general message 2021-11-29 17:19:55 +08:00
Louis Lam
5070927478 Merge pull request #980 from MrEddX/bulgarian
Update bg-BG.js
2021-11-29 16:56:02 +08:00
Louis Lam
bedc1f8617 Merge pull request #966 from louislam/lazy-load-lang
Lazy load language files
2021-11-29 16:54:25 +08:00
Louis Lam
077f3837d9 update language guide 2021-11-29 16:53:00 +08:00
Louis Lam
aea128a85b make settings' menu reactive 2021-11-29 16:50:00 +08:00
Louis Lam
c50b2b636a [lazy load lang] load the language file on create 2021-11-29 16:45:52 +08:00
MrEddX
a284703d9e Update bg-BG.js
- Fixed existing field
- Added new field
- Translated new field
2021-11-28 07:11:20 +02:00
kffl
64ec766423 translate(serwersms): fix pl translation capitalization
Co-authored-by: Adam Stachowicz <saibamenppl@gmail.com>
2021-11-27 13:22:54 +01:00
kffl
186c11540f style(serwersms): add missing trailing commas
Co-authored-by: Adam Stachowicz <saibamenppl@gmail.com>
2021-11-27 13:16:17 +01:00
Ioma Taani
4d947d9374 better translation 2021-11-26 10:37:42 +01:00
Ioma Taani
4888c97d86 Better translation 2021-11-26 10:33:15 +01:00
Louis Lam
50593f3edf [wip] lazy load language file 2021-11-26 16:31:19 +08:00
Paweł Kuffel
c1267e9b3b feat: add SerwerSMS notification provider 2021-11-25 18:24:36 +01:00
Ivan Bratović
2ca7a5b962 Merge branch 'master' into improve-translatables 2021-11-24 10:03:30 +01:00
Louis Lam
9f0c66d775 fix node-sqlite3 security issues 2021-11-24 14:53:15 +08:00
Louis Lam
a1f9a82537 Merge pull request #884 from thomasleveil/ux/add-group-at-the-top
🚸 Status page - add group action adds the new group at the top
2021-11-24 11:48:58 +08:00
Louis Lam
37e6ca8d77 Merge pull request #950 from dingdayu/master
Update dingding notification title
2021-11-24 11:36:00 +08:00
Louis Lam
0b0fd6609d Merge pull request #951 from iomataani/master
Updated translations.
2021-11-24 00:37:12 +08:00
Ioma Taani
3a32fd6f42 aggiornata la traduzione 2021-11-23 16:39:38 +01:00
Ioma Taani
97cb060cf5 another typo 2021-11-23 16:39:04 +01:00
Ioma Taani
5afb29f8f9 typo 2021-11-23 16:35:18 +01:00
Ioma Taani
f9b8dbf4db Merge branch 'louislam:master' into master 2021-11-23 16:30:48 +01:00
Louis Lam
92a5f18bf5 Merge pull request #864 from ivanbratovic/http-basicauth
Implement explicit HTTP "basic" authentication support
2021-11-23 22:48:54 +08:00
小雨
dce908a07b Update dingding notification title
Add the status to the title, you can see the message title on the friend list page.
2021-11-23 20:36:22 +08:00
Louis
4155f84eec improve basic auth style 2021-11-23 19:20:55 +08:00
Louis Lam
94ffeeeab6 update dependencies 2021-11-23 13:32:24 +08:00
Louis Lam
3d222ac5f5 fix btoa is not define 2021-11-23 12:59:48 +08:00
Louis Lam
c811c1ccde Merge pull request #753 from chakflying/settings-redesign
UI: Redesign/organize settings page
2021-11-23 12:46:59 +08:00
Ioma Taani
bd3d34400d Merge branch 'master' of https://github.com/iomataani/uptime-kuma 2021-11-22 23:39:10 +01:00
Louis Lam
5d3bf68123 add remove-2fa command 2021-11-18 18:22:03 +08:00
Nelson Chan
1f77526210 Chore: Run spell check 2021-11-17 14:09:12 +08:00
Nelson Chan
88ed965d69 Test: Disable clear stats test 2021-11-17 10:52:14 +08:00
Nelson Chan
7f4d5a0f76 Test: fix tests
Test: Attempt to fix tests

Test: Attempt to fix tests

Test: Attempt to fix tests

Test: Attempt to fix tests

Test: Attempt to fix tests

Test: Attempt to fix tests

Test: Attempt to fix tests

Test: Attempt to fix tests

Test: Attempt to fix tests

Test: Attempt to fix tests

Test: Attempt to fix tests

Test: Attempt to fix tests

Test: Attempt to fix tests

Test: Attempt to fix tests

Test: Investigate error message

Test: Attempt to fix tests

Chore: Cleanup code

Test: Attempt to fix tests

Test: Attempt to fix tests
2021-11-17 10:45:24 +08:00
Nelson Chan
df813fbdee Fix: Add save in monitor history 2021-11-17 10:45:19 +08:00
Nelson Chan
07742799ed Test: Fix tests
Test: Add clear stats test

Test: Attempt to fix tests

Test: Add test for disable auth

Update README
2021-11-17 10:45:19 +08:00
Nelson Chan
f65cc655c0 Fix: Fix nav highlight in settings sub-page 2021-11-17 10:45:19 +08:00
Nelson Chan
1a218aaa17 Fix: Fix page transition & improve active handling
Fix: Fix current route parsing
2021-11-17 10:45:19 +08:00
Nelson Chan
369cad90c1 WIP: Convert to use vue-router & improve layout
WIP: Fix security page & improve layout

WIP: Fix displaying current page

UI: Improve spacing

Chore: Improve styling
2021-11-17 10:45:18 +08:00
Nelson Chan
f9bb48de13 WIP: Convert Settings to components 2021-11-17 10:45:18 +08:00
Louis Lam
74d2b38cb6 Merge pull request #925 from iomataani/italian-language-update
Translation update
2021-11-16 19:12:07 +08:00
Louis Lam
7bba4fe2d0 Merge pull request #926 from MG8853/patch-1
Update ja.js
2021-11-16 18:53:30 +08:00
MultiGamer8853
be3a791e6e Update ja.js
日本語を最適化
2021-11-16 18:14:23 +09:00
Ioma Taani
9747048890 correzioni e miglioramenti 2021-11-16 09:04:10 +01:00
Phuong Nguyen Minh
d5d957b748 update vi.js (#853)
* update vi.js

* Update vi.js

* Update vi.js
2021-11-15 13:27:31 +08:00
Ioma Taani
5cdb5edeb3 corretto 2021-11-13 17:00:23 +01:00
Ioma Taani
73c18b6ff0 correzione 2021-11-13 16:53:07 +01:00
Ivan
567ea346fe Add missing translations for placeholders in EditMonitor page 2021-11-12 15:30:31 +01:00
Ivan
453f6fbadf Add more missing translations 2021-11-12 15:19:33 +01:00
Ivan
dd79042128 Add translation for "Info" in Settings 2021-11-12 15:14:28 +01:00
Ivan
583e6bf978 Update croatian language for testing new translation 2021-11-12 13:32:24 +01:00
Ivan
b1fca7c1a7 Add translation of toast success message 2021-11-12 12:00:10 +01:00
Ivan
19dd11d624 Add translation for incident error message 2021-11-12 10:14:23 +01:00
Ivan
42ce34b6c7 Add more Status page tranlations 2021-11-12 09:54:31 +01:00
Ivan
b7a9d1474f Fix translation of selected incident style 2021-11-12 09:53:41 +01:00
Ivan
31fa67452e Delint English language file 2021-11-12 09:31:27 +01:00
Ivan
9ef3727c91 Backed out of commit be1933614
Running update-language-files will just confuse translators
2021-11-12 09:29:06 +01:00
Ivan Bratović
ed39485af9 Merge with upstream master
Signed-off-by: Ivan Bratović <ivanbratovic4@gmail.com>
2021-11-12 09:23:20 +01:00
Ioma Taani
daef238a70 Updated Italian Language (#911)
Co-authored-by: Paride Barison <paride.barison@lantechlongwave.it>
2021-11-12 01:28:22 +08:00
Ivan
4cc433166e Add missing translation for SMTP security option 2021-11-11 11:14:21 +01:00
Ivan
28f530394e Add missing translation lookup for ClickSendSMS 2021-11-11 11:12:48 +01:00
Ivan
b0615d347b Add incident creation translations 2021-11-11 11:07:48 +01:00
Ivan
be19336149 Run update-language-files for all languages 2021-11-11 10:57:33 +01:00
Ivan
94508cae2f Add some missing translations 2021-11-11 10:54:36 +01:00
Ivan
265cca9ed1 Replace "Default" notification badge with translation 2021-11-11 10:54:09 +01:00
Ivan
267654c987 Replace hard-coded names for groups in Status page with translations 2021-11-11 10:53:38 +01:00
Ivan
2c85491ee0 Replace body and header placeholder functions with translations 2021-11-11 10:52:22 +01:00
Ivan Bratović
5d836cf05d [empty commit] pull request for updating translatables 2021-11-10 10:09:21 +01:00
Adam Stachowicz
ba46fb6b1c Clickable URL 2021-11-10 09:11:19 +01:00
Louis Lam
5df34cd137 Merge pull request #885 from ZegertBoele/patch-1
Update to dutch translations
2021-11-09 23:20:21 +08:00
Louis Lam
bf64095cea update to 1.10.2 2021-11-09 22:42:13 +08:00
Louis Lam
2333d1c7a7 Merge remote-tracking branch 'origin/master' 2021-11-09 22:37:20 +08:00
Louis Lam
95bae8289d Fix setting page when disabled auth 2021-11-09 22:37:05 +08:00
Louis Lam
45f7c647a6 Update feature_request.yaml 2021-11-09 21:31:04 +08:00
Zegert Boele
dff1056bb1 Update nl-NL.js
@deefdragon noticed a flaw, fixed in here
2021-11-09 09:52:09 +01:00
Zegert Boele
62222c0336 Update src/languages/nl-NL.js
@koen20 added this correction.

Co-authored-by: Koen Habets <6172623+koen20@users.noreply.github.com>
2021-11-09 09:49:42 +01:00
Louis Lam
733d0af75f update to 1.10.1 2021-11-08 18:03:00 +08:00
Louis Lam
b88e74fad8 Merge pull request #891 from ivanbratovic/croatian-language
Update Croatian languange
2021-11-08 17:35:13 +08:00
Ivan Bratović
734762b773 Merge with master
Signed-off-by: Ivan Bratović <ivanbratovic4@gmail.com>
2021-11-08 09:53:54 +01:00
Louis Lam
0275d7a42b minor 2021-11-08 15:51:32 +08:00
Louis Lam
41a6d1b701 Fix parseCertificateInfo possibly in dead loop 2021-11-08 15:39:17 +08:00
Ivan Bratović
34d8984e3a Merge branch 'master' into http-basicauth 2021-11-07 17:15:36 +01:00
Louis Lam
c92153c97e add more debug msg 2021-11-07 21:00:47 +08:00
Louis Lam
ad82ab0305 Merge pull request #883 from andreasbrett/patch-7
24h tooltip on status page
2021-11-07 17:24:03 +08:00
Louis Lam
f952d283c6 Merge pull request #815 from Fallstop/tags-on-status
Display Monitor Tags on Status Page
2021-11-07 17:05:21 +08:00
Louis Lam
e164fabf81 Merge pull request #849 from Minvinea/master
Adding missing translations
2021-11-07 13:56:15 +08:00
Louis Lam
bc69a331ee eslint 2021-11-07 13:50:22 +08:00
Jasper Miller-Waugh
e4506963d9 Merge branch 'louislam:master' into tags-on-status 2021-11-07 14:39:43 +13:00
Zegert Boele
222540898b Some translations were not translated
Some translations were not translated yet. I have added them and can be contacted if you want more English-Dutch translations.
2021-11-05 13:57:55 +01:00
Thomas LEVEIL
baf3612ece 🚸 Status page - add group action adds the new group at the top of the page 2021-11-05 11:27:19 +01:00
Andreas Brett
8f44b9f618 24h tooltip on status page 2021-11-05 09:54:10 +01:00
Louis Lam
210566c7af remove prefix for issue title, so users need to input the title 2021-11-05 11:34:50 +08:00
Ivan Bratović
0481a241f3 Add translated placeholders for editing basic auth 2021-11-04 10:22:42 +01:00
Ivan Bratović
179ca232bc Minor refactor - change variable names and add commas to object definitions 2021-11-04 10:14:17 +01:00
Ivan Bratović
0dcb7aed21 Delinting 2021-11-04 09:50:10 +01:00
Ivan Bratović
23736549f9 Implement HTTP basic auth feature 2021-11-04 09:50:10 +01:00
Ivan Bratović
665c263c03 Add db migrations for new basic auth fields 2021-11-04 09:50:10 +01:00
Louis Lam
c5e6628803 Merge pull request #870 from chakflying/patch-3
Update PULL_REQUEST_TEMPLATE.md
2021-11-04 11:55:06 +08:00
Louis Lam
3a1d8ddc11 Merge pull request #869 from MrEddX/bulgarian
Update bg-BG.js
2021-11-04 11:54:25 +08:00
Nelson Chan
bc5f61b3ec Chore: Add drag and drop
Co-authored-by: Adam Stachowicz <saibamenppl@gmail.com>
2021-11-04 10:21:57 +08:00
Adam Stachowicz
314fa18bdc Fix #871 2021-11-04 00:19:04 +01:00
Nelson Chan
57389fab2c Update PULL_REQUEST_TEMPLATE.md 2021-11-03 19:13:11 +08:00
MrEddX
ee2c54cfd1 Update bg-BG.js
- Added New Fields
- Fixed Existing Fields
2021-11-03 11:49:22 +02:00
Louis Lam
82cde7c847 Merge pull request #854 from 634750802/patch-1
Add a status prefix for feishu notification's title
2021-11-03 16:36:21 +08:00
Louis Lam
1ba2034701 freeze bootstrap to 5.1.3 to prevent breaking changes 2021-11-03 13:03:36 +08:00
Louis Lam
dee131c25d fix table hover color not working after updated bootstrap to 5.1.3 2021-11-03 13:02:44 +08:00
Jasper Miller-Waugh
e5d6410caf Apply formatting suggestions from code review
Co-authored-by: Adam Stachowicz <saibamenppl@gmail.com>
2021-11-03 11:46:53 +13:00
Louis Lam
e496c3b3be update healthcheck.js 2021-11-02 22:03:02 +08:00
Louis Lam
69f5112b38 Merge remote-tracking branch 'origin/master' 2021-11-02 21:49:02 +08:00
Louis Lam
c094dc0c5b speed up redirect by using 302 redirect instead of vue redirect 2021-11-02 21:48:46 +08:00
Ivan Bratović
1fb9b25d13 Improve hr-HR translations 2021-11-02 14:09:01 +01:00
Ivan Bratović
9a135deac2 Add new translation for 'Uptime' 2021-11-02 11:48:55 +01:00
Your Name
8e6173c05e Fix and add new hr-HR translations 2021-11-02 10:33:13 +01:00
Louis Lam
dec84282ed Update bug_report.yaml 2021-11-02 13:31:27 +08:00
Louis Lam
df80f413b5 Update feature_request.yaml 2021-11-02 13:31:19 +08:00
Louis Lam
17e59f1d8d Update ask-for-help.yaml 2021-11-02 13:30:39 +08:00
Louis Lam
973c2bb429 Update ask-for-help.yaml 2021-11-02 13:30:13 +08:00
Louis Lam
da0eaddeb8 Update SECURITY.md 2021-11-02 13:25:34 +08:00
Louis Lam
b2bc8d9db9 Update bug_report.yaml 2021-11-02 13:24:15 +08:00
Louis Lam
541068ff3b Update bug_report.yaml 2021-11-02 13:23:47 +08:00
Louis Lam
83ee46454a Update bug_report.yaml 2021-11-02 13:12:46 +08:00
Louis Lam
75b21c905f Merge pull request #847 from Saibamen/update_pl
Update `pl.js`
2021-11-02 10:44:19 +08:00
Louis Lam
60e12f4bfa fix healthcheck.js with prefix UPTIME_KUMA_ 2021-11-02 01:13:05 +08:00
Jasper Miller-Waugh
191b81ee07 Fix grammer in comment
Co-authored-by: Nelson Chan <chakflying@hotmail.com>
2021-11-01 22:14:41 +13:00
Jagger
f3651a1219 Add a status prefix for feishu notification 2021-11-01 13:31:31 +08:00
Jasper Miller-Waugh
12ef9f39c5 Merged buttons, cleaned up SS tag retrieval and made tagsVisible a bool.
Also to note: due to the transition of tagsVisible this breaks compatibility with the previous commits, delete the  tagsVisible setting in the database to fix.
2021-11-01 13:23:46 +13:00
Jasper Miller-Waugh
4004926e64 Small formatting changes from code-review
Co-authored-by: deef <deef551@gmail.com>
2021-11-01 12:52:21 +13:00
Adam Stachowicz
4d3d6d6e25 Missing this... 2021-10-31 21:59:56 +01:00
Adam Stachowicz
d06e5ef6fa More small letters 2021-10-31 21:53:11 +01:00
Adam Stachowicz
b12b848d97 One more typo... 2021-10-31 21:48:43 +01:00
Adam Stachowicz
bb96a577ca Fix typos + translate wayToGetTeamsURL 2021-10-31 21:47:07 +01:00
Adam Stachowicz
8840ca618b Update pl.js 2021-10-31 21:22:19 +01:00
Minvinea
8ec858fd14 Add missing translation
Line 282 to 306
2021-10-31 21:18:36 +01:00
Louis Lam
124c98ce76 update to 1.10.0 2021-10-31 13:48:05 +08:00
Louis Lam
61135e8500 update package-lock.json 2021-10-31 13:18:06 +08:00
Louis Lam
08a58dec2b fix manifest.json path 2021-10-31 13:17:34 +08:00
Louis Lam
741ed548da Merge branch 'master' into use_hideCount_option 2021-10-31 13:09:50 +08:00
Louis Lam
52d80d3a5d Merge remote-tracking branch 'origin/master' 2021-10-31 13:08:00 +08:00
Louis Lam
586c748d44 vite build on host machine, since it is very slow on armv7/arm64 build 2021-10-31 13:07:10 +08:00
Louis Lam
b5d6e96b1d Merge pull request #842 from gaby/issue-form-updates
Update the wording used when reporting an Issue via Forms
2021-10-31 10:49:24 +08:00
Juan Calderon-Perez
68b74f07e4 Update wording of form field 2021-10-30 19:06:32 -04:00
Louis Lam
bc615c2dd8 Merge pull request #832 from ivanbratovic/croatian-language
Clarity and grammar fixes to hr-HR languange file
2021-10-31 00:52:41 +08:00
Louis Lam
e7104737e7 prevent to show "New Update" when the Docker image is not ready yet 2021-10-31 00:36:46 +08:00
Louis Lam
1dbf1c3dea fix logout 2021-10-30 23:33:20 +08:00
Jasper Miller-Waugh
74688e69aa Remove debug statement in server/routers/api-router.js
Co-authored-by: Adam Stachowicz <saibamenppl@gmail.com>
2021-10-30 21:16:10 +13:00
Jasper Miller-Waugh
b32bfb3ff1 Added toggle for tag visibility 2021-10-30 21:16:10 +13:00
Jasper Miller-Waugh
24664cde2c Smarter CSS to fix Mobile alignment 2021-10-30 21:16:10 +13:00
Jasper Miller-Waugh
348c5ec995 Match lint settings 2021-10-30 21:16:10 +13:00
Jasper Miller-Waugh
9143b73f84 Styling for tags 2021-10-30 21:16:10 +13:00
Jasper Miller-Waugh
5e6d945095 Most hacked in POC 2021-10-30 21:16:10 +13:00
Louis
ba93129b18 Merge branch '1.9.X'
# Conflicts:
#	server/server.js
2021-10-30 10:05:08 +08:00
Adam Stachowicz
69aa60d1fb Add missing i18n key + translate 2 keys for polish 2021-10-29 17:01:29 +02:00
Ivan Bratović
eaecd6e571 Clarity and grammar fixes to hr_HR languange file 2021-10-29 16:53:55 +02:00
Adam Stachowicz
f2a27a2cf1 Use hideCount option for pagination 2021-10-29 13:37:38 +02:00
Louis
d4c9431142 catch createWriteStream error 2021-10-29 18:28:31 +08:00
Louis
d7f7dba13f write some error logs to ./data/error.log 2021-10-29 18:24:47 +08:00
Louis
3e5ae00d25 update dependencies 2021-10-29 18:04:58 +08:00
Louis Lam
5311bef3eb Merge pull request #809 from Saibamen/pagination_no_text
Don't display "count" text for pagination
2021-10-29 16:05:59 +08:00
Louis Lam
c400595f67 Merge pull request #825 from SiderealArt/patch-1
Add Traditional Chinese (Taiwan) translation
2021-10-29 16:05:01 +08:00
Louis Lam
e84f7dac60 Merge pull request #821 from ivanbratovic/croatian-language
Add Croatian language
2021-10-29 16:03:28 +08:00
SiderealArt
67a22399bc Update i18n.js 2021-10-29 15:44:33 +08:00
SiderealArt
947fc6001e Update Settings.vue 2021-10-29 15:43:21 +08:00
SiderealArt
c87e67ad1b Add Traditional Chinese (Taiwan) translation 2021-10-29 15:39:02 +08:00
Ivan Bratović
6f92774a8f ESLint pass on hr-HR.js file 2021-10-28 16:17:07 +02:00
Ivan Bratović
6e76ab7426 Import hr-HR language in i18n.js 2021-10-28 16:07:47 +02:00
Ivan Bratović
b2fbd7e263 Add confirmDisableAuth tranlation for hr-HR 2021-10-28 16:04:56 +02:00
Ivan Bratović
199e6ec82b Add initial version of Croatian language 2021-10-28 15:56:34 +02:00
Adam Stachowicz
18a99c2016 Revert deleting records and "One record" keys 2021-10-28 14:20:56 +02:00
Louis Lam
e261a27ebe fix wrong call of rejectUnauthorized for smtp (#757) 2021-10-28 11:10:09 +08:00
Louis Lam
de5cce9d90 Steam API Key to HiddenInput 2021-10-27 23:03:03 +08:00
Louis Lam
b85c9186f9 Merge pull request #781 from louislam/cert-notification
Certificate renewal notifications
2021-10-27 22:43:43 +08:00
Louis Lam
eb22ad5ffe [certificate notification] error handling and better msg 2021-10-27 16:12:18 +08:00
Louis Lam
f5f4835b74 [certificate notification] clear sent history if the cert is changed 2021-10-27 16:03:16 +08:00
Louis Lam
44c1b336dc send certificate notifications in 21, 14, 7 days 2021-10-27 15:33:15 +08:00
Louis Lam
110ec491ee Merge branch 'master' into cert-notification 2021-10-27 14:16:37 +08:00
Louis Lam
640b6e5b1c prevent monitor dead for unexpected error 2021-10-27 14:08:44 +08:00
Louis Lam
234fba3978 Update SECURITY.md 2021-10-27 12:31:18 +08:00
Louis Lam
1285ccb537 Merge pull request #784 from gaby/issue-forms
Migrate issue templates to Github Issue Forms
2021-10-27 12:29:44 +08:00
Juan Calderon-Perez
6c542edfc9 Add examples for version and image tag. 2021-10-27 00:23:13 -04:00
Juan Calderon-Perez
767807dd22 Added text placeholders for versions. 2021-10-27 00:18:05 -04:00
Juan Calderon-Perez
546402f3d2 Added docker-image-tag field. 2021-10-27 00:11:50 -04:00
Louis Lam
698a38e773 clear status page cache in a better place 2021-10-27 11:39:46 +08:00
Louis Lam
71884cf42a Merge pull request #772 from andreasbrett/patch-6
show logged in user on settings page
2021-10-27 10:24:45 +08:00
Louis Lam
d676c782bb Update README.md 2021-10-27 10:11:08 +08:00
Juan Calderon-Perez
dd773aa5a2 Updates based on PR comments. 2021-10-26 22:10:48 -04:00
Louis Lam
2852e59ffb Merge pull request #812 from MrEddX/bulgarian
Update bg-BG.js
2021-10-27 09:37:42 +08:00
MrEddX
cb3da50e7e Update bg-BG.js
Small fixes
2021-10-26 22:46:57 +03:00
Louis Lam
f25653d778 Update README.md 2021-10-27 00:07:17 +08:00
Adam Stachowicz
2e7ad1b7b2 Don't display "count" text for pagination 2021-10-26 18:03:49 +02:00
Louis Lam
e0e1ab6fa6 Update CONTRIBUTING.md 2021-10-27 00:02:20 +08:00
Louis Lam
8d984881c9 Update CONTRIBUTING.md 2021-10-26 23:56:14 +08:00
Louis Lam
955f9ae20a Merge pull request #794 from louislam/free-disk-space
Free Disk Space
2021-10-26 23:09:27 +08:00
Louis Lam
a9e319517a add auto vacuum and shrink database button 2021-10-26 23:02:32 +08:00
Louis Lam
39ad8b4bb7 Merge branch 'master' into free-disk-space 2021-10-26 21:18:22 +08:00
Andreas Brett
8fb8cbdaf3 use auth0/jwt-decode 2021-10-26 13:15:31 +02:00
Andreas Brett
3f3d8b4eb3 fixes 2021-10-26 12:58:04 +02:00
Louis Lam
9123e9461f Update CONTRIBUTING.md 2021-10-26 16:38:00 +08:00
Louis Lam
77addfebc8 Merge branch 'tarun7singh_master'
# Conflicts:
#	src/languages/vi.js
2021-10-26 16:26:59 +08:00
Louis Lam
16846c7c6d Merge pull request #790 from Saibamen/pl_update+fixes
PL update + fixes
2021-10-26 16:25:04 +08:00
Louis Lam
d1c4d13903 Merge pull request #782 from Co2333/dev-lakr233-bark_notification
Support for Bark (APN) notifications
2021-10-26 16:23:11 +08:00
Louis Lam
7cd4bfc11d Merge pull request #806 from Saibamen/patch-1
Update PULL_REQUEST_TEMPLATE.md
2021-10-26 15:58:14 +08:00
Adam Stachowicz
1d5c0502ab Add other 2021-10-26 09:48:17 +02:00
Adam Stachowicz
a1cda93ad5 Update PULL_REQUEST_TEMPLATE.md
See https://github.com/louislam/uptime-kuma/pull/785#issuecomment-950521657
2021-10-26 09:46:12 +02:00
Louis Lam
3bd420f0e0 Merge pull request #752 from chakflying/feat/chart-period
Feat: Add options for Chart period
2021-10-26 12:53:42 +08:00
Louis Lam
78424b4f2d add simple loading chart effect 2021-10-26 12:48:21 +08:00
Louis Lam
f8055ed03d minor css 2021-10-26 12:33:46 +08:00
Louis Lam
fe4724fc53 Merge branch 'master' into feat/chart-period 2021-10-26 12:25:07 +08:00
Louis Lam
7f0dda6a44 Update CONTRIBUTING.md 2021-10-26 11:28:38 +08:00
Lakr Aream
43791ee97e Merge branch 'master' into dev-lakr233-bark_notification 2021-10-26 09:08:11 +08:00
Tarun Singh
6362ef6a9c removed other langauge translation data 2021-10-25 18:30:40 -04:00
Adam Stachowicz
9d3a4e9d1e Remove dot from needPushEvery 2021-10-26 00:00:54 +02:00
Tarun Singh
6c60096f56 Merge branch 'louislam:master' into master 2021-10-25 04:12:39 -04:00
Tarun Singh
ba1e025353 added click send to number 2021-10-25 04:11:57 -04:00
Louis Lam
a41a081727 Merge remote-tracking branch 'origin/master' 2021-10-25 12:29:53 +08:00
Louis Lam
a5f15f2319 Fix #793, check dist-backup existing before delete 2021-10-25 12:29:40 +08:00
Louis Lam
e69799f613 Update CONTRIBUTING.md 2021-10-25 12:07:44 +08:00
Louis Lam
3c795bebe3 Update CONTRIBUTING.md 2021-10-25 12:06:49 +08:00
Louis Lam
3a43fec666 add recommend pull request guideline 2021-10-25 12:06:01 +08:00
Louis Lam
24c645e437 [empty commit] pull request for free-disk-space 2021-10-25 10:59:13 +08:00
Louis Lam
9d31da1fe8 Merge pull request #792 from gaby/stalebot-fix
Rename stale-bot to stale-bot.yml
2021-10-25 10:26:15 +08:00
Juan Calderon-Perez
2e4c42941a Rename stale-bot to stale-bot.yml 2021-10-24 21:31:10 -04:00
Andreas Brett
4fc2603818 Merge branch 'patch-6' of https://github.com/andreasbrett/uptime-kuma into patch-6 2021-10-25 01:34:06 +02:00
Andreas Brett
7bc38d4231 remove unused vars 2021-10-25 01:33:45 +02:00
Andreas Brett
daad63d70b Merge branch 'master' into patch-6 2021-10-25 01:24:31 +02:00
Andreas Brett
9ddd2c7365 use jwt 2021-10-25 01:23:02 +02:00
Adam Stachowicz
fa5ba12e14 Missing this 2021-10-24 22:15:02 +02:00
Adam Stachowicz
85053f865e Fix typo 2021-10-24 21:56:37 +02:00
Adam Stachowicz
1239f6d1a2 PL update + fixes 2021-10-24 21:50:02 +02:00
Tarun Singh
fed611d1b9 Merge branch 'master' of https://github.com/louislam/uptime-kuma 2021-10-24 15:19:25 -04:00
Tarun Singh
bc68088350 Click send sms integration for notifications 2021-10-24 15:17:29 -04:00
Louis Lam
90200958cd Merge pull request #780 from kry008/patch-4
Update pl.js
2021-10-25 00:35:31 +08:00
Louis Lam
aa13d74d7a Merge pull request #788 from Ponkhy/german-language
Updated german language file
2021-10-25 00:32:40 +08:00
Ponkhy
d82f305f6e Updated german language file 2021-10-24 17:56:05 +02:00
Louis Lam
7c63cbfd84 add node.js 17 to auto test 2021-10-24 22:50:33 +08:00
Juan Calderon-Perez
c7e1267779 More syntax changes. Change What to Which 2021-10-24 10:12:17 -04:00
Louis Lam
5d0b54c292 Merge pull request #785 from Saibamen/patch-1
Create PULL_REQUEST_TEMPLATE.md
2021-10-24 22:07:46 +08:00
Juan Calderon-Perez
b50b390048 Changes based on PR requests 2021-10-24 10:04:56 -04:00
Adam Stachowicz
65158cb06b Update PULL_REQUEST_TEMPLATE.md
Changes after Code Review
2021-10-24 12:21:59 +02:00
Adam Stachowicz
8fe5e4e605 Fix lint 2021-10-24 11:19:42 +02:00
Adam Stachowicz
ab5ddae2ee Delete double new line 2021-10-24 11:18:07 +02:00
Adam Stachowicz
89c64f4ea2 Create PULL_REQUEST_TEMPLATE.md
From https://github.com/Harsha200105/DesktopAssistant/pull/51
2021-10-24 11:16:29 +02:00
Juan Calderon-Perez
40a1ebecc5 Update feature_request.yaml 2021-10-24 00:51:47 -04:00
Juan Calderon-Perez
e1793596fe Merge pull request #1 from gaby/issue-forms 2021-10-24 00:49:18 -04:00
Juan Calderon-Perez
c489058a57 Update labels for each form 2021-10-24 00:46:10 -04:00
Juan Calderon-Perez
95342ec006 Update label for ask for help 2021-10-24 00:41:51 -04:00
Juan Calderon-Perez
bdebbf8e40 Add Support for Issue Forms 2021-10-24 00:40:06 -04:00
Juan Calderon-Perez
9a9fca67d5 Migrate Bug Report to Github Issue Forms 2021-10-23 22:58:35 -04:00
Nelson Chan
665bae0806 UI: Simplify dropdown design 2021-10-24 01:45:57 +08:00
Nelson Chan
e4be28a9e7 Fix: Validate beat time before appending 2021-10-24 01:45:38 +08:00
Nelson Chan
445674aacb Chore: Improve code formatting & comments 2021-10-24 01:45:10 +08:00
Nelson Chan
2f7b60f5e5 Feat: Use separate storage for custom chart period
Fix: Fix import error
2021-10-24 01:44:55 +08:00
Nelson Chan
b83c59e308 WIP: Add options for chart period
Fix: Fix callback, add toast on error

Fix: Improve styling

Fix: Restore default chart behavior

Fix: Replace 1h with 3h

draft only
2021-10-24 01:44:08 +08:00
Lakr Aream
ce852dfa02 Support for Bark (APN) notifications
Update bark.js
2021-10-24 00:31:43 +08:00
Louis Lam
c9549c0de2 change body and header placeholders, less misleading. 2021-10-23 22:14:05 +08:00
Louis Lam
957c292307 add certificate-notification job 2021-10-23 21:44:21 +08:00
kry008
b5eb17ed93 Update pl.js 2021-10-23 15:07:24 +02:00
Louis Lam
d578300104 Merge pull request #743 from andreasbrett/patch-4
Harden 2FA/TOTP implementation according to rfc6238 (part 2)
2021-10-23 17:00:46 +08:00
Louis Lam
b77b33e790 add login rate limiter 2021-10-23 16:35:13 +08:00
Andreas Brett
4becb97a5d Update en.js 2021-10-23 01:54:36 +02:00
Andreas Brett
85e2b36424 Update en.js 2021-10-23 01:54:07 +02:00
Andreas Brett
abdf1ae90a Update en.js 2021-10-23 01:53:31 +02:00
Andreas Brett
606c967985 Merge branch 'master' into patch-6 2021-10-23 01:52:54 +02:00
Andreas Brett
93c231b4d9 Update server/server.js
Co-authored-by: Adam Stachowicz <saibamenppl@gmail.com>
2021-10-23 01:52:02 +02:00
Andreas Brett
9ad8e5f56a show logged in user 2021-10-22 13:05:52 +02:00
Louis Lam
8a481a1be0 Merge pull request #769 from andreasbrett/patch-5
show beat.msg only if available
2021-10-22 18:14:52 +08:00
Andreas Brett
657987a013 fix: show beat.msg only if available 2021-10-22 11:59:53 +02:00
Louis Lam
d74577608b Merge pull request #766 from DX37/translation-ru
Update notifications area in ru-RU.js
2021-10-22 14:10:15 +08:00
Louis Lam
20a399c557 Merge pull request #767 from mrphuongbn/master
Add Vietnamese language
2021-10-22 14:04:32 +08:00
Phuong Nguyen Minh
060dde9827 Merge branch 'louislam:master' into master 2021-10-22 08:08:22 +07:00
DX37
1d1601cf24 Update notifications area in ru-RU.js 2021-10-21 22:49:17 +07:00
Louis Lam
ff5f2e8dfb add limiter 2021-10-21 23:03:40 +08:00
Louis Lam
5451fb7672 Merge remote-tracking branch 'origin/master' 2021-10-21 22:54:21 +08:00
Louis Lam
56094a43d7 add passwordStrength 2021-10-21 22:54:04 +08:00
Louis Lam
68bbe8944a Merge pull request #756 from DX37/translation-ru
Update ru-RU.js
2021-10-21 10:56:54 +08:00
Louis Lam
8f1da6aa22 Update CONTRIBUTING.md 2021-10-21 00:08:46 +08:00
Louis Lam
c0d6fe0d76 Update CONTRIBUTING.md 2021-10-21 00:03:55 +08:00
DX37
29e4e41215 Update ru-RU.js 2021-10-20 23:00:29 +07:00
Louis Lam
7a1bb964e9 Update bug_report.md 2021-10-20 18:09:23 +08:00
Louis Lam
3fe0e9bf1e Update ask-for-help.md 2021-10-20 18:09:10 +08:00
Louis Lam
9982887783 Update feature_request.md 2021-10-20 18:08:52 +08:00
Louis Lam
c31efc0ef4 Merge pull request #748 from MrEddX/bulgarian
Fix: Integration Link Text
2021-10-20 14:37:45 +08:00
MrEddX
6463d4b209 Fix: Integration Link Text
Maybe left there from the Slack template.
2021-10-20 09:09:08 +03:00
Louis Lam
acada8028a Merge pull request #747 from MrEddX/bulgarian
Update bg-BG.js
2021-10-20 11:58:12 +08:00
MrEddX
d0b0c64b81 Update bg-BG.js
- Fixed existing fields
- Added new fields
- Translated new fields
2021-10-19 23:03:46 +03:00
Louis Lam
cd04ac4557 "dist/index.html" is no longer needed for development environment 2021-10-20 01:32:19 +08:00
Louis Lam
d7d2f7b7fc Merge pull request #745 from dpatrongomez/patch-2
Add steam translation in spanish
2021-10-20 00:46:55 +08:00
Daniel Patrón Gómez
5a05d135b8 Add steam translation in spanish 2021-10-19 17:11:32 +02:00
Louis Lam
e03ee593e2 Merge pull request #716 from NeuralMiner/textchanges
Text update
2021-10-19 16:34:00 +08:00
Louis Lam
6c1ee70e15 fix 2021-10-19 16:29:09 +08:00
Louis Lam
5c3892313e add env var: UPTIME_KUMA_DISABLE_FRAME_SAMEORIGIN 2021-10-19 14:41:05 +08:00
Louis Lam
c57c94642c Merge remote-tracking branch 'origin/master' 2021-10-19 14:26:26 +08:00
Louis Lam
62f168a2a5 config response header 2021-10-19 14:26:10 +08:00
Louis Lam
c808f78f09 Merge pull request #735 from gaby/stale-bot
Support for closing stale Issues/PRs after 6 months of inactivity
2021-10-19 11:59:37 +08:00
Louis Lam
9c80e1c732 Merge pull request #641 from andreasbrett/patch-1
Harden 2FA/TOTP implementation according to rfc6238 (part 1)
2021-10-19 10:17:04 +08:00
Andreas Brett
acc2995d86 invalidate used token 2021-10-19 00:42:33 +02:00
Andreas Brett
7def9dcec7 Merge branch 'louislam:master' into patch-1 2021-10-19 00:37:15 +02:00
NeuralMiner
a35569481d Updates 2021-10-18 15:26:38 -06:00
NeuralMiner
9ddffc0f7f Updates 2021-10-18 14:35:47 -06:00
NeuralMiner
76e7c8b276 Rebase 2021-10-18 14:35:36 -06:00
NeuralMiner
572a5300aa Recommended updates. 2021-10-18 13:25:53 -06:00
NeuralMiner
e1f1d4a959 Merge branch 'louislam:master' into textchanges 2021-10-18 12:57:28 -06:00
Juan Calderon-Perez
b5857f7c0c Fix syntax issue. 2021-10-18 08:23:18 -04:00
Juan Calderon-Perez
6277babf25 Migrate to actions/stale v4.0 2021-10-18 08:22:08 -04:00
Louis Lam
300a95d779 recompile util.js with tsconfig.json 2021-10-18 17:51:40 +08:00
Louis Lam
23714ab688 genSecret don't need await 2021-10-18 17:37:11 +08:00
Louis Lam
16b44001e7 Merge remote-tracking branch 'andreasbrett/patch-1' into andreasbrett_patch-1
# Conflicts:
#	src/util.js
2021-10-18 17:35:17 +08:00
Louis Lam
f2f8f33b86 Merge branch 'master' into andreasbrett_patch-1
# Conflicts:
#	src/util.js
2021-10-18 17:30:21 +08:00
Andreas Brett
df4682d19b Merge branch 'master' into patch-1 2021-10-18 01:14:58 +02:00
Andreas Brett
11a1f35cc5 independent csprng solution 2021-10-18 01:06:20 +02:00
Juan Calderon-Perez
2a3ce15328 Use default number of operations per day. Defaults to 30 2021-10-17 17:23:44 -04:00
Juan Calderon-Perez
7cb25255bf Update stale-bot 2021-10-17 17:20:32 -04:00
Juan Calderon-Perez
c622f7958f Add support for closing stale Issues/PR 2021-10-17 17:16:07 -04:00
NeuralMiner
8cb26d2b31 Text update 2021-10-15 19:12:09 -06:00
Phuong Nguyen Minh
bda481c61e Update vi.js 2021-10-15 08:26:33 +07:00
Andreas Brett
86dcc9bc8f import webcrypto lib 2021-10-13 17:34:56 +02:00
Louis Lam
145b722aec Merge branch 'master' into andreasbrett_patch-1 2021-10-13 22:17:33 +08:00
Louis Lam
79c81395bc Merge branch 'master' into andreasbrett_patch-1 2021-10-13 22:02:27 +08:00
Phuong Nguyen Minh
89c0f8b734 Update i18n.js 2021-10-13 13:44:31 +07:00
Phuong Nguyen Minh
dc805cff97 Add files via upload 2021-10-13 13:36:09 +07:00
Andreas Brett
dc1de50a02 fix for max-inclusive 2021-10-11 01:18:33 +02:00
Andreas Brett
0e6d7694ce Update util.js 2021-10-10 23:54:45 +02:00
Andreas Brett
11bcd1e2ed const 2021-10-10 22:55:32 +02:00
Andreas Brett
06310423f4 typo 2021-10-10 22:19:10 +02:00
Andreas Brett
e127e168b6 typed parameters 2021-10-10 22:15:42 +02:00
Andreas Brett
075535ba46 Update util.ts 2021-10-10 21:59:23 +02:00
Andreas Brett
13cf6891ac cryptographically strong secret generation
generate TOTP secret using WebCrypto API (see https://github.com/louislam/uptime-kuma/issues/640)
2021-10-10 21:58:23 +02:00
123 changed files with 15020 additions and 7377 deletions

View File

@@ -1,5 +1,4 @@
/.idea
/dist
/node_modules
/data
/out

View File

@@ -1,21 +0,0 @@
---
name: Ask for help
about: You can ask any question related to Uptime Kuma.
title: ''
labels: help
assignees: ''
---
**Is it a duplicate question?**
Please search in Issues without filters: https://github.com/louislam/uptime-kuma/issues?q=
**Describe your problem**
Please describe what you are asking for
**Info**
Uptime Kuma Version:
Using Docker?: Yes/No
Docker Version:
Node.js Version (Without Docker only):
OS:
Browser:

View File

@@ -0,0 +1,68 @@
name: "❓ Ask for help"
description: "Submit any question related to Uptime Kuma"
#title: "[Help] "
labels: [help]
body:
- type: checkboxes
id: no-duplicate-issues
attributes:
label: "⚠️ Please verify that this bug has NOT been raised before."
description: "Search in the issues sections by clicking [HERE](https://github.com/louislam/uptime-kuma/issues?q=)"
options:
- label: "I checked and didn't find similar issue"
required: true
- type: checkboxes
attributes:
label: "🛡️ Security Policy"
description: Please review the security policy before reporting security related issues/bugs.
options:
- label: I agree to have read this project [Security Policy](https://github.com/louislam/uptime-kuma/security/policy)
required: true
- type: textarea
id: steps-to-reproduce
validations:
required: true
attributes:
label: "📝 Describe your problem"
description: "Please walk us through it step by step."
placeholder: "Describe what are you asking for..."
- type: input
id: uptime-kuma-version
attributes:
label: "🐻 Uptime-Kuma Version"
description: "Which version of Uptime-Kuma are you running? Please do NOT provide the docker tag such as latest or 1"
placeholder: "Ex. 1.10.0"
validations:
required: true
- type: input
id: operating-system
attributes:
label: "💻 Operating System and Arch"
description: "Which OS is your server/device running on?"
placeholder: "Ex. Ubuntu 20.04 x86"
validations:
required: true
- type: input
id: browser-vendor
attributes:
label: "🌐 Browser"
description: "Which browser are you running on?"
placeholder: "Ex. Google Chrome 95.0.4638.69"
validations:
required: true
- type: input
id: docker-version
attributes:
label: "🐋 Docker Version"
description: "If running with Docker, which version are you running?"
placeholder: "Ex. Docker 20.10.9 / K8S / Podman"
validations:
required: false
- type: input
id: nodejs-version
attributes:
label: "🟩 NodeJS Version"
description: "If running with Node.js? which version are you running?"
placeholder: "Ex. 14.18.0"
validations:
required: false

View File

@@ -1,42 +0,0 @@
---
name: Bug report
about: Create a report to help us improve
title: ''
labels: bug
assignees: ''
---
**Is it a duplicate question?**
Please search in Issues without filters: https://github.com/louislam/uptime-kuma/issues?q=
**Describe the bug**
A clear and concise description of what the bug is.
**To Reproduce**
Steps to reproduce the behavior:
1. Go to '...'
2. Click on '....'
3. Scroll down to '....'
4. See error
**Expected behavior**
A clear and concise description of what you expected to happen.
**Info**
Uptime Kuma Version:
Using Docker?: Yes/No
Docker Version:
Node.js Version (Without Docker only):
OS:
Browser:
**Screenshots**
If applicable, add screenshots to help explain your problem.
**Error Log**
It is easier for us to find out the problem.
Docker: `docker logs <container id>`
PM2: `~/.pm2/logs/` (e.g. `/home/ubuntu/.pm2/logs`)

99
.github/ISSUE_TEMPLATE/bug_report.yaml vendored Normal file
View File

@@ -0,0 +1,99 @@
name: "🐛 Bug Report"
description: "Submit a bug report to help us improve"
#title: "[Bug] "
labels: [bug]
body:
- type: checkboxes
id: no-duplicate-issues
attributes:
label: "⚠️ Please verify that this bug has NOT been raised before."
description: "Search in the issues sections by clicking [HERE](https://github.com/louislam/uptime-kuma/issues?q=)"
options:
- label: "I checked and didn't find similar issue"
required: true
- type: checkboxes
attributes:
label: "🛡️ Security Policy"
description: Please review the security policy before reporting security related issues/bugs.
options:
- label: I agree to have read this project [Security Policy](https://github.com/louislam/uptime-kuma/security/policy)
required: true
- type: textarea
id: description
validations:
required: false
attributes:
label: "Description"
description: "You could also upload screenshots"
- type: textarea
id: steps-to-reproduce
validations:
required: true
attributes:
label: "👟 Reproduction steps"
description: "How do you trigger this bug? Please walk us through it step by step."
placeholder: "..."
- type: textarea
id: expected-behavior
validations:
required: true
attributes:
label: "👀 Expected behavior"
description: "What did you think would happen?"
placeholder: "..."
- type: textarea
id: actual-behavior
validations:
required: true
attributes:
label: "😓 Actual Behavior"
description: "What actually happen?"
placeholder: "..."
- type: input
id: uptime-kuma-version
attributes:
label: "🐻 Uptime-Kuma Version"
description: "Which version of Uptime-Kuma are you running? Please do NOT provide the docker tag such as latest or 1"
placeholder: "Ex. 1.10.0"
validations:
required: true
- type: input
id: operating-system
attributes:
label: "💻 Operating System and Arch"
description: "Which OS is your server/device running on?"
placeholder: "Ex. Ubuntu 20.04 x86"
validations:
required: true
- type: input
id: browser-vendor
attributes:
label: "🌐 Browser"
description: "Which browser are you running on?"
placeholder: "Ex. Google Chrome 95.0.4638.69"
validations:
required: true
- type: input
id: docker-version
attributes:
label: "🐋 Docker Version"
description: "If running with Docker, which version are you running?"
placeholder: "Ex. Docker 20.10.9 / K8S / Podman"
validations:
required: false
- type: input
id: nodejs-version
attributes:
label: "🟩 NodeJS Version"
description: "If running with Node.js? which version are you running?"
placeholder: "Ex. 14.18.0"
validations:
required: false
- type: textarea
id: logs
attributes:
label: "📝 Relevant log output"
description: Please copy and paste any relevant log output. This will be automatically formatted into code, so no need for backticks.
render: shell
validations:
required: false

View File

@@ -1,22 +0,0 @@
---
name: Feature request
about: Suggest an idea for this project
title: ''
labels: enhancement
assignees: ''
---
**Is it a duplicate question?**
Please search in Issues without filters: https://github.com/louislam/uptime-kuma/issues?q=
**Is your feature request related to a problem? Please describe.**
A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
**Describe the solution you'd like**
A clear and concise description of what you want to happen.
**Describe alternatives you've considered**
A clear and concise description of any alternative solutions or features you've considered.
**Additional context**
Add any other context or screenshots about the feature request here.

View File

@@ -0,0 +1,59 @@
name: 🚀 Feature Request
description: "Submit a proposal for a new feature"
#title: "[Feature] "
labels: [feature-request]
body:
- type: checkboxes
id: no-duplicate-issues
attributes:
label: "⚠️ Please verify that this feature request has NOT been suggested before."
description: "Search in the issues sections by clicking [HERE](https://github.com/louislam/uptime-kuma/issues?q=)"
options:
- label: "I checked and didn't find similar feature request"
required: true
- type: dropdown
id: feature-area
attributes:
label: "🏷️ Feature Request Type"
description: "What kind of feature request is this?"
multiple: true
options:
- API
- New Notification
- New Monitor
- UI Feature
- Other
validations:
required: true
- type: textarea
id: feature-description
validations:
required: true
attributes:
label: "🔖 Feature description"
description: "A clear and concise description of what the feature request is."
placeholder: "You should add ..."
- type: textarea
id: solution
validations:
required: true
attributes:
label: "✔️ Solution"
description: "A clear and concise description of what you want to happen."
placeholder: "In my use-case, ..."
- type: textarea
id: alternatives
validations:
required: false
attributes:
label: "❓ Alternatives"
description: "A clear and concise description of any alternative solutions or features you've considered."
placeholder: "I have considered ..."
- type: textarea
id: additional-context
validations:
required: false
attributes:
label: "📝 Additional Context"
description: "Add any other context or screenshots about the feature request here."
placeholder: "..."

28
.github/PULL_REQUEST_TEMPLATE.md vendored Normal file
View File

@@ -0,0 +1,28 @@
# Description
Fixes #(issue)
## Type of change
Please delete any options that are not relevant.
- Bug fix (non-breaking change which fixes an issue)
- User interface (UI)
- New feature (non-breaking change which adds functionality)
- Breaking change (fix or feature that would cause existing functionality to not work as expected)
- Translation update
- Other
- This change requires a documentation update
## Checklist
- [ ] My code follows the style guidelines of this project
- [ ] I ran ESLint and other linters for modified files
- [ ] I have performed a self-review of my own code and tested it
- [ ] I have commented my code, particularly in hard-to-understand areas
- [ ] My changes generate no new warnings
- [ ] My code needed automated testing. I have added them (this is optional task)
## Screenshots (if any)
Please do not use any external image service. Instead, just paste in or drag and drop the image here, and it will be uploaded automatically.

View File

@@ -16,7 +16,7 @@ jobs:
strategy:
matrix:
os: [macos-latest, ubuntu-latest, windows-latest]
node-version: [14.x, 16.x]
node-version: [14.x, 16.x, 17.x]
# See supported Node.js release schedule at https://nodejs.org/en/about/releases/
steps:

View File

@@ -0,0 +1,26 @@
name: Close Incorrect Issue
on:
issues:
types: [opened]
jobs:
close-incorrect-issue:
runs-on: ${{ matrix.os }}
strategy:
matrix:
os: [ubuntu-latest]
node-version: [16.x]
steps:
- uses: actions/checkout@v2
- name: Use Node.js ${{ matrix.node-version }}
uses: actions/setup-node@v2
with:
node-version: ${{ matrix.node-version }}
cache: 'npm'
- run: npm ci
- run: node extra/close-incorrect-issue.js ${{ secrets.GITHUB_TOKEN }} ${{ github.event.issue.number }} ${{ github.event.issue.user.login }}

22
.github/workflows/stale-bot.yml vendored Normal file
View File

@@ -0,0 +1,22 @@
name: 'Automatically close stale issues and PRs'
on:
schedule:
- cron: '0 0 * * *'
#Run once a day at midnight
jobs:
stale:
runs-on: ubuntu-latest
steps:
- uses: actions/stale@v4
with:
stale-issue-message: 'We are clearing up our old issues and your ticket has been open for 6 months with no activity. Remove stale label or comment or this will be closed in 7 days.'
stale-pr-message: 'We are clearing up our old Pull Requests and yours has been open for 6 months with no activity. Remove stale label or comment or this will be closed in 7 days.'
close-issue-message: 'This issue was closed because it has been stalled for 7 days with no activity.'
close-pr-message: 'This PR was closed because it has been stalled for 7 days with no activity.'
days-before-stale: 180
days-before-close: 0
exempt-issue-labels: 'News,Medium,High,discussion,bug,doc,'
exempt-pr-labels: 'awaiting-approval,work-in-progress,enhancement,feature-request'
exempt-issue-assignees: 'louislam'
exempt-pr-assignees: 'louislam'

View File

@@ -1,8 +1,8 @@
# Project Info
First of all, thank you everyone who made pull requests for Uptime Kuma, I never thought GitHub Community can be that nice! And also because of this, I also never thought other people actually read my code and edit my code. It is not structed and commented so well, lol. Sorry about that.
First of all, thank you everyone who made pull requests for Uptime Kuma, I never thought GitHub Community can be that nice! And also because of this, I also never thought other people actually read my code and edit my code. It is not structured and commented so well, lol. Sorry about that.
The project was created with vite.js (vue3). Then I created a sub-directory called "server" for server part. Both frontend and backend share the same package.json.
The project was created with vite.js (vue3). Then I created a subdirectory called "server" for server part. Both frontend and backend share the same package.json.
The frontend code build into "dist" directory. The server (express.js) exposes the "dist" directory as root of the endpoint. This is how production is working.
@@ -27,18 +27,35 @@ The frontend code build into "dist" directory. The server (express.js) exposes t
## Can I create a pull request for Uptime Kuma?
Generally, if the pull request is working fine and it do not affect any existing logic, workflow and perfomance, I will merge into the master branch once it is tested.
Generally, if the pull request is working fine, and it does not affect any existing logic, workflow and performance, I will merge into the master branch once it is tested.
If you are not sure, feel free to create an empty pull request draft first.
If you are not sure whether I will accept your pull request, feel free to create an empty pull request draft first.
### Recommended Pull Request Guideline
1. Fork the project
1. Clone your fork repo to local
1. Create a new branch
1. Create an empty commit
`git commit -m "[empty commit] pull request for <YOUR TASK NAME>" --allow-empty`
1. Push to your fork repo
1. Create a pull request: https://github.com/louislam/uptime-kuma/compare
1. Write a proper description
1. Click "Change to draft"
### Pull Request Examples
Here are some example situations in the past.
#### ✅ High - Medium Priority
Easy to review, no breaking change and not touching the existing code
- Add a new notification
- Add a chart
- Fix a bug
- Translations
- Add a independent new feature
#### *️⃣ Requires one more reviewer
@@ -46,6 +63,16 @@ I do not have such knowledge to test it.
- Add k8s supports
#### ⚠ Low Priority - Harsh Mode
Some pull requests are required to modify the core. To be honest, I do not want anyone to try to do that, because it would spend a lot of your time. I will review your pull request harshly. Also, you may need to write a lot of unit tests to ensure that there is no breaking change.
- Touch large parts of code of any very important features
- Touch monitoring logic
- Drop a table or drop a column for any reason
- Touch the entry point of Docker or Node.js
- Modify auth
#### *️⃣ Low Priority
It changed my current workflow and require further studies.
@@ -54,6 +81,7 @@ It changed my current workflow and require further studies.
#### ❌ Won't Merge
- Any breaking changes
- Duplicated pull request
- Buggy
- Existing logic is completely modified or deleted
@@ -84,7 +112,7 @@ I personally do not like something need to learn so much and need to config so m
- Node.js >= 14
- Git
- IDE that supports ESLint and EditorConfig (I am using Intellji Idea)
- IDE that supports ESLint and EditorConfig (I am using IntelliJ IDEA)
- A SQLite tool (SQLite Expert Personal is suggested)
## Install dependencies
@@ -111,9 +139,9 @@ express.js is just used for serving the frontend built files (index.html, .js an
- model/ (Object model, auto mapping to the database table name)
- modules/ (Modified 3rd-party modules)
- notification-providers/ (indivdual notification logic)
- notification-providers/ (individual notification logic)
- routers/ (Express Routers)
- scoket-handler (Socket.io Handlers)
- socket-handler (Socket.io Handlers)
- server.js (Server main logic)
## How to start the Frontend Dev Server
@@ -171,10 +199,56 @@ ncu -u -t patch
npm install
```
Since previously updating vite 2.5.10 to 2.6.0 broke the application completely, from now on, it should update patch release version only.
Since previously updating Vite 2.5.10 to 2.6.0 broke the application completely, from now on, it should update patch release version only.
Patch release = the third digit ([Semantic Versioning](https://semver.org/))
## Translations
Please read: https://github.com/louislam/uptime-kuma/tree/master/src/languages
## Wiki
Since there is no way to make a pull request to wiki's repo, I have set up another repo to do that.
https://github.com/louislam/uptime-kuma-wiki
## Maintainer
Check the latest issues and pull requests:
https://github.com/louislam/uptime-kuma/issues?q=sort%3Aupdated-desc
### Release Procedures
1. Draft a release note
1. Make sure the repo is cleared
1. `npm run update-version 1.X.X`
1. `npm run build`
1. `npm run build-docker`
1. `git push`
1. Publish the release note as 1.X.X
1. `npm run upload-artifacts` with env vars VERSION=1.X.X;GITHUB_TOKEN=XXXX
1. SSH to demo site server and update to 1.X.X
Checking:
- Check all tags is fine on https://hub.docker.com/r/louislam/uptime-kuma/tags
- Try the Docker image with tag 1.X.X (Clean install / amd64 / arm64 / armv7)
- Try clean installation with Node.js
### Release Wiki
#### Setup Repo
```bash
git clone https://github.com/louislam/uptime-kuma-wiki.git
cd uptime-kuma-wiki
git remote add production https://github.com/louislam/uptime-kuma.wiki.git
```
#### Push to Production Wiki
```bash
git pull
git push production master
```

View File

@@ -1,6 +1,7 @@
# Uptime Kuma
<a target="_blank" href="https://github.com/louislam/uptime-kuma"><img src="https://img.shields.io/github/stars/louislam/uptime-kuma" /></a> <a target="_blank" href="https://hub.docker.com/r/louislam/uptime-kuma"><img src="https://img.shields.io/docker/pulls/louislam/uptime-kuma" /></a> <a target="_blank" href="https://hub.docker.com/r/louislam/uptime-kuma"><img src="https://img.shields.io/docker/v/louislam/uptime-kuma/latest?label=docker%20image%20ver." /></a> <a target="_blank" href="https://github.com/louislam/uptime-kuma"><img src="https://img.shields.io/github/last-commit/louislam/uptime-kuma" /></a> <a target="_blank" href="https://opencollective.com/uptime-kuma"><img src="https://opencollective.com/uptime-kuma/total/badge.svg?label=Backers&color=brightgreen" /></a>
<a target="_blank" href="https://github.com/louislam/uptime-kuma"><img src="https://img.shields.io/github/stars/louislam/uptime-kuma" /></a> <a target="_blank" href="https://hub.docker.com/r/louislam/uptime-kuma"><img src="https://img.shields.io/docker/pulls/louislam/uptime-kuma" /></a> <a target="_blank" href="https://hub.docker.com/r/louislam/uptime-kuma"><img src="https://img.shields.io/docker/v/louislam/uptime-kuma/latest?label=docker%20image%20ver." /></a> <a target="_blank" href="https://github.com/louislam/uptime-kuma"><img src="https://img.shields.io/github/last-commit/louislam/uptime-kuma" /></a> <a target="_blank" href="https://opencollective.com/uptime-kuma"><img src="https://opencollective.com/uptime-kuma/total/badge.svg?label=Open%20Collective%20Backers&color=brightgreen" /></a>
[![GitHub Sponsors](https://img.shields.io/github/sponsors/louislam?label=GitHub%20Sponsors)](https://github.com/sponsors/louislam)
<div align="center" width="100%">
<img src="./public/icon.svg" width="128" alt="" />
@@ -16,13 +17,13 @@ Try it!
https://demo.uptime.kuma.pet
It is a temporary live demo, all data will be deleted after 10 minutes. The server is located at Tokyo, so if you live far from there it may affect your experience. I suggest that you should install and try it out for the best demo experience.
It is a temporary live demo, all data will be deleted after 10 minutes. The server is located in Tokyo, so if you live far from there, it may affect your experience. I suggest that you should install and try it out for the best demo experience.
VPS is sponsored by Uptime Kuma sponsors on [Open Collective](https://opencollective.com/uptime-kuma)! Thank you so much!
## ⭐ Features
* Monitoring uptime for HTTP(s) / TCP / Ping / DNS Record / Push.
* Monitoring uptime for HTTP(s) / TCP / HTTP(s) Keyword / Ping / DNS Record / Push / Steam Game Server.
* Fancy, Reactive, Fast UI/UX.
* Notifications via Telegram, Discord, Gotify, Slack, Pushover, Email (SMTP), and [70+ notification services, click here for the full list](https://github.com/louislam/uptime-kuma/tree/master/src/components/notifications).
* 20 second intervals.
@@ -40,9 +41,11 @@ docker volume create uptime-kuma
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.
Browse to http://localhost:3001 after starting.
### 💪🏻 Without Docker
### 💪🏻 Non-Docker
Required Tools: Node.js >= 14, git and pm2.
@@ -66,7 +69,7 @@ Browse to http://localhost:3001 after starting.
### Advanced Installation
If you need more options or need to browse via a reserve proxy, please read:
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
@@ -86,6 +89,12 @@ Project Plan:
https://github.com/louislam/uptime-kuma/projects/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)
<img src="https://uptime.kuma.pet/sponsors?v=3" alt />
## 🖼 More Screenshots
Light Mode:
@@ -119,7 +128,7 @@ If you love this project, please consider giving me a ⭐.
### Issues Page
You can discuss or ask for help in [Issues](https://github.com/louislam/uptime-kuma/issues).
You can discuss or ask for help in [issues](https://github.com/louislam/uptime-kuma/issues).
### Subreddit
@@ -131,8 +140,8 @@ https://www.reddit.com/r/UptimeKuma/
If you want to report a bug or request a new feature. Free feel to open a [new issue](https://github.com/louislam/uptime-kuma/issues).
If you want to translate Uptime Kuma into your langauge, please read: https://github.com/louislam/uptime-kuma/tree/master/src/languages
If you want to translate Uptime Kuma into your language, please read: https://github.com/louislam/uptime-kuma/tree/master/src/languages
If you want to modify Uptime Kuma, this guideline may be useful for you: https://github.com/louislam/uptime-kuma/blob/master/CONTRIBUTING.md
English proofreading is needed too because my grammar is not that great sadly. Feel free to correct my grammar in this readme, source code, or wiki.
English proofreading is needed too because my grammar is not that great, sadly. Feel free to correct my grammar in this README, source code, or wiki.

View File

@@ -1,5 +1,11 @@
# Security Policy
## Reporting a Vulnerability
Please report security issues to uptime@kuma.pet.
Do not use the issue tracker or discuss it in the public as it will cause more damage.
## Supported Versions
Use this section to tell people about which versions of your project are
@@ -9,8 +15,8 @@ currently being supported with security updates.
| Version | Supported |
| ------- | ------------------ |
| 1.8.X | :white_check_mark: |
| <= 1.7.X | ❌ |
| 1.9.X | :white_check_mark: |
| <= 1.8.X | ❌ |
### Upgradable Docker Tags
@@ -23,9 +29,3 @@ currently being supported with security updates.
| debian | :white_check_mark: |
| alpine | :white_check_mark: |
| All other tags | ❌ |
## Reporting a Vulnerability
Please report security issues to uptime@kuma.pet.
Do not use the issue tracker or discuss it in the public as it will cause more damage.

33
config/jest-debug-env.js Normal file
View File

@@ -0,0 +1,33 @@
const PuppeteerEnvironment = require("jest-environment-puppeteer");
const util = require("util");
class DebugEnv extends PuppeteerEnvironment {
async handleTestEvent(event, state) {
const ignoredEvents = [
"setup",
"add_hook",
"start_describe_definition",
"add_test",
"finish_describe_definition",
"run_start",
"run_describe_start",
"test_start",
"hook_start",
"hook_success",
"test_fn_start",
"test_fn_success",
"test_done",
"run_describe_finish",
"run_finish",
"teardown",
"test_fn_failure",
];
if (!ignoredEvents.includes(event.name)) {
console.log(
new Date().toString() + ` Unhandled event [${event.name}] ` + util.inspect(event)
);
}
}
}
module.exports = DebugEnv;

View File

@@ -1,6 +1,20 @@
module.exports = {
"launch": {
"dumpio": true,
"slowMo": 500,
"headless": process.env.HEADLESS_TEST || false,
"userDataDir": "./data/test-chrome-profile",
args: [
"--disable-setuid-sandbox",
"--disable-gpu",
"--disable-dev-shm-usage",
"--no-default-browser-check",
"--no-experiments",
"--no-first-run",
"--no-pings",
"--no-sandbox",
"--no-zygote",
"--single-process",
],
}
};

View File

@@ -5,6 +5,7 @@ module.exports = {
"__DEV__": true
},
"testRegex": "./test/e2e.spec.js",
"testEnvironment": "./config/jest-debug-env.js",
"rootDir": "..",
"testTimeout": 30000,
};

View File

@@ -0,0 +1,7 @@
-- You should not modify if this have pushed to Github, unless it does serious wrong with the db.
BEGIN TRANSACTION;
ALTER TABLE user
ADD twofa_last_token VARCHAR(6);
COMMIT;

View File

@@ -0,0 +1,10 @@
-- You should not modify if this have pushed to Github, unless it does serious wrong with the db.
BEGIN TRANSACTION;
ALTER TABLE monitor
ADD basic_auth_user TEXT default null;
ALTER TABLE monitor
ADD basic_auth_pass TEXT default null;
COMMIT;

View File

@@ -0,0 +1,18 @@
-- You should not modify if this have pushed to Github, unless it does serious wrong with the db.
BEGIN TRANSACTION;
CREATE TABLE [notification_sent_history] (
[id] INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
[type] VARCHAR(50) NOT NULL,
[monitor_id] INTEGER NOT NULL,
[days] INTEGER NOT NULL,
UNIQUE([type], [monitor_id], [days])
);
CREATE INDEX [good_index] ON [notification_sent_history] (
[type],
[monitor_id],
[days]
);
COMMIT;

View File

@@ -4,5 +4,5 @@ WORKDIR /app
# Install apprise, iputils for non-root ping, setpriv
RUN apk add --no-cache iputils setpriv dumb-init python3 py3-cryptography py3-pip py3-six py3-yaml py3-click py3-markdown py3-requests py3-requests-oauthlib && \
pip3 --no-cache-dir install apprise && \
pip3 --no-cache-dir install apprise==0.9.7 && \
rm -rf /root/.cache

View File

@@ -4,9 +4,9 @@ FROM node:14-buster-slim
WORKDIR /app
# 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, specific --no-install-recommends to skip them, make the base even smaller than alpine!
# Stupid python3 and python3-pip actually install a lot of useless things into Debian, specify --no-install-recommends to skip them, make the base even smaller than alpine!
RUN apt update && \
apt --yes --no-install-recommends install python3 python3-pip python3-cryptography python3-six python3-yaml python3-click python3-markdown python3-requests python3-requests-oauthlib \
sqlite3 iputils-ping util-linux dumb-init && \
pip3 --no-cache-dir install apprise && \
pip3 --no-cache-dir install apprise==0.9.7 && \
rm -rf /var/lib/apt/lists/*

View File

@@ -4,9 +4,7 @@ WORKDIR /app
ENV PUPPETEER_SKIP_CHROMIUM_DOWNLOAD=1
COPY . .
RUN npm ci && \
npm run build && \
npm ci --production && \
RUN npm ci --production && \
chmod +x /app/extra/entrypoint.sh
@@ -22,23 +20,26 @@ HEALTHCHECK --interval=60s --timeout=30s --start-period=180s --retries=5 CMD nod
ENTRYPOINT ["/usr/bin/dumb-init", "--", "extra/entrypoint.sh"]
CMD ["node", "server/server.js"]
FROM release AS nightly
RUN npm run mark-as-nightly
# Upload the artifact to Github
FROM louislam/uptime-kuma:base-debian AS upload-artifact
WORKDIR /
RUN apt update && \
apt --yes install curl file
COPY --from=build /app /app
ARG VERSION
ARG GITHUB_TOKEN
ARG TARGETARCH
ARG PLATFORM=debian
ARG VERSION=1.9.0
ARG FILE=$PLATFORM-$TARGETARCH-$VERSION.tar.gz
ARG DIST=dist.tar.gz
COPY --from=build /app /app
RUN chmod +x /app/extra/upload-github-release-asset.sh
# Full Build

View File

@@ -4,9 +4,7 @@ WORKDIR /app
ENV PUPPETEER_SKIP_CHROMIUM_DOWNLOAD=1
COPY . .
RUN npm ci && \
npm run build && \
npm ci --production && \
RUN npm ci --production && \
chmod +x /app/extra/entrypoint.sh
@@ -22,5 +20,6 @@ HEALTHCHECK --interval=60s --timeout=30s --start-period=180s --retries=5 CMD nod
ENTRYPOINT ["/usr/bin/dumb-init", "--", "extra/entrypoint.sh"]
CMD ["node", "server/server.js"]
FROM release AS nightly
RUN npm run mark-as-nightly

View File

@@ -0,0 +1,57 @@
const github = require("@actions/github");
(async () => {
try {
const token = process.argv[2];
const issueNumber = process.argv[3];
const username = process.argv[4];
const client = github.getOctokit(token).rest;
const issue = {
owner: "louislam",
repo: "uptime-kuma",
number: issueNumber,
};
const labels = (
await client.issues.listLabelsOnIssue({
owner: issue.owner,
repo: issue.repo,
issue_number: issue.number
})
).data.map(({ name }) => name);
if (labels.length === 0) {
console.log("Bad format here");
await client.issues.addLabels({
owner: issue.owner,
repo: issue.repo,
issue_number: issue.number,
labels: ["invalid-format"]
});
// Add the issue closing comment
await client.issues.createComment({
owner: issue.owner,
repo: issue.repo,
issue_number: issue.number,
body: `@${username}: Hello! :wave:\n\nThis issue is being automatically closed because it does not follow the issue template. Please DO NOT open a blank issue.`
});
// Close the issue
await client.issues.update({
owner: issue.owner,
repo: issue.repo,
issue_number: issue.number,
state: "closed"
});
} else {
console.log("Pass!");
}
} catch (e) {
console.log(e);
}
})();

View File

@@ -34,9 +34,11 @@ function download(url) {
});
tarStream.on("close", () => {
fs.rmdirSync("./dist-backup", {
recursive: true
});
if (fs.existsSync("./dist-backup")) {
fs.rmdirSync("./dist-backup", {
recursive: true
});
}
console.log("Done");
});
@@ -44,7 +46,7 @@ function download(url) {
if (fs.existsSync("./dist-backup")) {
fs.renameSync("./dist-backup", "./dist");
}
console.log("Done");
console.error("Error from tarStream");
});
response.pipe(tarStream);

View File

@@ -1,25 +1,41 @@
/*
* This script should be run after a period of time (180s), because the server may need some time to prepare.
*/
const { FBSD } = require("../server/util-server");
process.env.NODE_TLS_REJECT_UNAUTHORIZED = "0";
let client;
if (process.env.SSL_KEY && process.env.SSL_CERT) {
const sslKey = process.env.UPTIME_KUMA_SSL_KEY || process.env.SSL_KEY || undefined;
const sslCert = process.env.UPTIME_KUMA_SSL_CERT || process.env.SSL_CERT || undefined;
if (sslKey && sslCert) {
client = require("https");
} else {
client = require("http");
}
// If host is omitted, the server will accept connections on the unspecified IPv6 address (::) when IPv6 is available and the unspecified IPv4 address (0.0.0.0) otherwise.
// Dual-stack support for (::)
let hostname = process.env.UPTIME_KUMA_HOST;
// Also read HOST if not *BSD, as HOST is a system environment variable in FreeBSD
if (!hostname && !FBSD) {
hostname = process.env.HOST;
}
const port = parseInt(process.env.UPTIME_KUMA_PORT || process.env.PORT || 3001);
let options = {
host: process.env.HOST || "127.0.0.1",
port: parseInt(process.env.PORT) || 3001,
host: hostname || "127.0.0.1",
port: port,
timeout: 28 * 1000,
};
let request = client.request(options, (res) => {
console.log(`Health Check OK [Res Code: ${res.statusCode}]`);
if (res.statusCode === 200) {
if (res.statusCode === 302) {
process.exit(0);
} else {
process.exit(1);

60
extra/remove-2fa.js Normal file
View File

@@ -0,0 +1,60 @@
console.log("== Uptime Kuma Remove 2FA Tool ==");
console.log("Loading the database");
const Database = require("../server/database");
const { R } = require("redbean-node");
const readline = require("readline");
const TwoFA = require("../server/2fa");
const args = require("args-parser")(process.argv);
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout
});
const main = async () => {
Database.init(args);
await Database.connect();
try {
// No need to actually reset the password for testing, just make sure no connection problem. It is ok for now.
if (!process.env.TEST_BACKEND) {
const user = await R.findOne("user");
if (! user) {
throw new Error("user not found, have you installed?");
}
console.log("Found user: " + user.username);
let ans = await question("Are you sure want to remove 2FA? [y/N]");
if (ans.toLowerCase() === "y") {
await TwoFA.disable2FA(user.id);
console.log("2FA has been removed successfully.");
}
}
} catch (e) {
console.error("Error: " + e.message);
}
await Database.close();
rl.close();
console.log("Finished.");
};
function question(question) {
return new Promise((resolve) => {
rl.question(question, (answer) => {
resolve(answer);
});
});
}
if (!process.env.TEST_BACKEND) {
main();
}
module.exports = {
main,
};

View File

@@ -5,7 +5,7 @@
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon.png">
<link rel="icon" type="image/svg+xml" href="/icon.svg" />
<link rel="manifest" href="manifest.json" />
<link rel="manifest" href="/manifest.json" />
<meta name="theme-color" id="theme-color" content="" />
<meta name="description" content="Uptime Kuma monitoring tool" />
<title>Uptime Kuma</title>

13434
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@@ -1,13 +1,13 @@
{
"name": "uptime-kuma",
"version": "1.9.2",
"version": "1.12.1",
"license": "MIT",
"repository": {
"type": "git",
"url": "https://github.com/louislam/uptime-kuma.git"
},
"engines": {
"node": "14.*"
"node": "14.* || >=16.*"
},
"scripts": {
"install-legacy": "npm install --legacy-peer-deps",
@@ -22,25 +22,26 @@
"build": "vite build --config ./config/vite.config.js",
"test": "node test/prepare-test-server.js && node server/server.js --port=3002 --data-dir=./data/test/ --test",
"test-with-build": "npm run build && npm test",
"jest": "node test/prepare-jest.js && npm run jest-frontend && npm run jest-backend && jest --config=./config/jest.config.js",
"jest": "node test/prepare-jest.js && npm run jest-frontend && npm run jest-backend",
"jest-frontend": "cross-env TEST_FRONTEND=1 jest --config=./config/jest-frontend.config.js",
"jest-backend": "cross-env TEST_BACKEND=1 jest --config=./config/jest-backend.config.js",
"tsc": "tsc",
"vite-preview-dist": "vite preview --host --config ./config/vite.config.js",
"build-docker": "npm run build-docker-debian && npm run build-docker-alpine",
"build-docker": "npm run build && npm run build-docker-debian && npm run build-docker-alpine",
"build-docker-alpine-base": "docker buildx build -f docker/alpine-base.dockerfile --platform linux/amd64,linux/arm64,linux/arm/v7 -t louislam/uptime-kuma:base-alpine . --push",
"build-docker-debian-base": "docker buildx build -f docker/debian-base.dockerfile --platform linux/amd64,linux/arm64,linux/arm/v7 -t louislam/uptime-kuma:base-debian . --push",
"build-docker-alpine": "docker buildx build -f docker/dockerfile-alpine --platform linux/amd64,linux/arm64,linux/arm/v7 -t louislam/uptime-kuma:alpine -t louislam/uptime-kuma:1-alpine -t louislam/uptime-kuma:1.9.2-alpine --target release . --push",
"build-docker-debian": "docker buildx build -f docker/dockerfile --platform linux/amd64,linux/arm64,linux/arm/v7 -t louislam/uptime-kuma -t louislam/uptime-kuma:1 -t louislam/uptime-kuma:1.9.2 -t louislam/uptime-kuma:debian -t louislam/uptime-kuma:1-debian -t louislam/uptime-kuma:1.9.2-debian --target release . --push",
"build-docker-nightly": "docker buildx build -f docker/dockerfile --platform linux/amd64,linux/arm64,linux/arm/v7 -t louislam/uptime-kuma:nightly --target nightly . --push",
"build-docker-alpine": "docker buildx build -f docker/dockerfile-alpine --platform linux/amd64,linux/arm64,linux/arm/v7 -t louislam/uptime-kuma:alpine -t louislam/uptime-kuma:1-alpine -t louislam/uptime-kuma:1.12.1-alpine --target release . --push",
"build-docker-debian": "docker buildx build -f docker/dockerfile --platform linux/amd64,linux/arm64,linux/arm/v7 -t louislam/uptime-kuma -t louislam/uptime-kuma:1 -t louislam/uptime-kuma:1.12.1 -t louislam/uptime-kuma:debian -t louislam/uptime-kuma:1-debian -t louislam/uptime-kuma:1.12.1-debian --target release . --push",
"build-docker-nightly": "npm run build && docker buildx build -f docker/dockerfile --platform linux/amd64,linux/arm64,linux/arm/v7 -t louislam/uptime-kuma:nightly --target nightly . --push",
"build-docker-nightly-alpine": "docker buildx build -f docker/dockerfile-alpine --platform linux/amd64,linux/arm64,linux/arm/v7 -t louislam/uptime-kuma:nightly-alpine --target nightly . --push",
"build-docker-nightly-amd64": "docker buildx build -f docker/dockerfile --platform linux/amd64 -t louislam/uptime-kuma:nightly-amd64 --target nightly . --push --progress plain",
"upload-artifacts": "docker buildx build -f docker/dockerfile --platform linux/amd64 -t louislam/uptime-kuma:upload-artifact --build-arg GITHUB_TOKEN --target upload-artifact . --progress plain",
"setup": "git checkout 1.9.2 && npm ci --production && npm run download-dist",
"upload-artifacts": "docker buildx build -f docker/dockerfile --platform linux/amd64 -t louislam/uptime-kuma:upload-artifact --build-arg VERSION --build-arg GITHUB_TOKEN --target upload-artifact . --progress plain",
"setup": "git checkout 1.12.1 && npm ci --production && npm run download-dist",
"download-dist": "node extra/download-dist.js",
"update-version": "node extra/update-version.js",
"mark-as-nightly": "node extra/mark-as-nightly.js",
"reset-password": "node extra/reset-password.js",
"remove-2fa": "node extra/remove-2fa.js",
"compile-install-script": "@powershell -NoProfile -ExecutionPolicy Unrestricted -Command ./extra/compile-install-script.ps1",
"test-install-script-centos7": "npm run compile-install-script && docker build --progress plain -f test/test_install_script/centos7.dockerfile .",
"test-install-script-alpine3": "npm run compile-install-script && docker build --progress plain -f test/test_install_script/alpine3.dockerfile .",
@@ -49,80 +50,85 @@
"test-nodejs16": "docker build --progress plain -f test/ubuntu-nodejs16.dockerfile .",
"simple-dns-server": "node extra/simple-dns-server.js",
"update-language-files-with-base-lang": "cd extra/update-language-files && node index.js %npm_config_base_lang% && eslint ../../src/languages/**.js --fix",
"update-language-files": "cd extra/update-language-files && node index.js && eslint ../../src/languages/**.js --fix"
"update-language-files": "cd extra/update-language-files && node index.js && eslint ../../src/languages/**.js --fix",
"ncu-patch": "ncu -u -t patch"
},
"dependencies": {
"@fortawesome/fontawesome-svg-core": "~1.2.36",
"@fortawesome/free-regular-svg-icons": "~5.15.4",
"@fortawesome/free-solid-svg-icons": "~5.15.4",
"@fortawesome/vue-fontawesome": "~3.0.0-4",
"@louislam/sqlite3": "~6.0.0",
"@fortawesome/vue-fontawesome": "~3.0.0-5",
"@louislam/sqlite3": "~6.0.1",
"@popperjs/core": "~2.10.2",
"args-parser": "~1.3.0",
"axios": "~0.21.4",
"axios": "~0.26.0",
"bcryptjs": "~2.4.3",
"bootstrap": "~5.1.1",
"bootstrap": "5.1.3",
"bree": "~7.1.0",
"chardet": "^1.3.0",
"bree": "~6.3.1",
"chart.js": "~3.5.1",
"chart.js": "~3.6.0",
"chartjs-adapter-dayjs": "~1.0.0",
"check-password-strength": "^2.0.3",
"command-exists": "~1.2.9",
"compare-versions": "~3.6.0",
"dayjs": "~1.10.7",
"express": "~4.17.1",
"express-basic-auth": "~1.2.0",
"form-data": "~4.0.0",
"http-graceful-shutdown": "~3.1.4",
"http-graceful-shutdown": "~3.1.5",
"iconv-lite": "^0.6.3",
"jsonwebtoken": "~8.5.1",
"jwt-decode": "^3.1.2",
"limiter": "^2.1.0",
"nodemailer": "~6.6.5",
"notp": "~2.0.3",
"password-hash": "~1.2.2",
"postcss-rtlcss": "~3.4.1",
"postcss-scss": "~4.0.1",
"postcss-scss": "~4.0.2",
"prom-client": "~13.2.0",
"prometheus-api-metrics": "~3.2.0",
"qrcode": "~1.4.4",
"redbean-node": "0.1.2",
"socket.io": "~4.2.0",
"socket.io-client": "~4.2.0",
"qrcode": "~1.5.0",
"redbean-node": "0.1.3",
"socket.io": "~4.4.1",
"socket.io-client": "~4.4.1",
"tar": "^6.1.11",
"tcp-ping": "~0.1.1",
"thirty-two": "~1.0.2",
"timezones-list": "~3.0.1",
"v-pagination-3": "~0.1.6",
"v-pagination-3": "~0.1.7",
"vue": "next",
"vue-chart-3": "~0.5.8",
"vue-chart-3": "3.0.9",
"vue-confirm-dialog": "~1.0.2",
"vue-contenteditable": "~3.0.4",
"vue-i18n": "~9.1.9",
"vue-image-crop-upload": "~3.0.3",
"vue-multiselect": "~3.0.0-alpha.2",
"vue-qrcode": "~1.0.0",
"vue-router": "~4.0.11",
"vue-toastification": "~2.0.0-rc.1",
"vue-router": "~4.0.12",
"vue-toastification": "~2.0.0-rc.5",
"vuedraggable": "~4.1.0"
},
"devDependencies": {
"@babel/eslint-parser": "~7.15.7",
"@actions/github": "~5.0.0",
"@babel/eslint-parser": "~7.15.8",
"@babel/preset-env": "^7.15.8",
"@types/bootstrap": "~5.1.6",
"@vitejs/plugin-legacy": "~1.6.1",
"@vitejs/plugin-vue": "~1.9.2",
"@vue/compiler-sfc": "~3.2.19",
"@vitejs/plugin-legacy": "~1.6.3",
"@vitejs/plugin-vue": "~1.9.4",
"@vue/compiler-sfc": "~3.2.22",
"babel-plugin-rewire": "~1.2.0",
"core-js": "~3.18.1",
"core-js": "~3.18.3",
"cross-env": "~7.0.3",
"dns2": "~2.0.1",
"eslint": "~7.32.0",
"eslint-plugin-vue": "~7.18.0",
"jest": "~27.2.4",
"jest": "~27.2.5",
"jest-puppeteer": "~6.0.0",
"puppeteer": "~10.4.0",
"puppeteer": "~13.1.3",
"sass": "~1.42.1",
"stylelint": "~13.13.1",
"stylelint-config-standard": "~22.0.0",
"typescript": "~4.4.3",
"vite": "~2.6.4"
"stylelint": "~14.2.0",
"stylelint-config-standard": "~24.0.0",
"typescript": "~4.4.4",
"vite": "~2.6.14"
}
}

14
server/2fa.js Normal file
View File

@@ -0,0 +1,14 @@
const { checkLogin } = require("./util-server");
const { R } = require("redbean-node");
class TwoFA {
static async disable2FA(userID) {
return await R.exec("UPDATE `user` SET twofa_status = 0 WHERE id = ? ", [
userID,
]);
}
}
module.exports = TwoFA;

View File

@@ -1,8 +1,9 @@
const basicAuth = require("express-basic-auth")
const basicAuth = require("express-basic-auth");
const passwordHash = require("./password-hash");
const { R } = require("redbean-node");
const { setting } = require("./util-server");
const { debug } = require("../src/util");
const { loginRateLimiter } = require("./rate-limiter");
/**
*
@@ -13,7 +14,7 @@ const { debug } = require("../src/util");
exports.login = async function (username, password) {
let user = await R.findOne("user", " username = ? AND active = 1 ", [
username,
])
]);
if (user && passwordHash.verify(password, user.password)) {
// Upgrade the hash to bcrypt
@@ -27,21 +28,30 @@ exports.login = async function (username, password) {
}
return null;
}
};
function myAuthorizer(username, password, callback) {
setting("disableAuth").then((result) => {
if (result) {
callback(null, true)
callback(null, true);
} else {
exports.login(username, password).then((user) => {
callback(null, user != null)
})
}
})
// Login Rate Limit
loginRateLimiter.pass(null, 0).then((pass) => {
if (pass) {
exports.login(username, password).then((user) => {
callback(null, user != null);
if (user == null) {
loginRateLimiter.removeTokens(1);
}
});
} else {
callback(null, false);
}
});
}
});
}
exports.basicAuth = basicAuth({

View File

@@ -9,18 +9,17 @@ let interval;
exports.startInterval = () => {
let check = async () => {
try {
const res = await axios.get("https://raw.githubusercontent.com/louislam/uptime-kuma/master/package.json");
if (typeof res.data === "string") {
res.data = JSON.parse(res.data);
}
const res = await axios.get("https://uptime.kuma.pet/version");
// For debug
if (process.env.TEST_CHECK_VERSION === "1") {
res.data.version = "1000.0.0";
res.data.slow = "1000.0.0";
}
if (res.data.slow) {
exports.latestVersion = res.data.slow;
}
exports.latestVersion = res.data.version;
} catch (_) { }
};

View File

@@ -50,6 +50,9 @@ class Database {
"patch-group-table.sql": true,
"patch-monitor-push_token.sql": true,
"patch-http-monitor-method-body-and-headers.sql": true,
"patch-2fa-invalidate-used-token.sql": true,
"patch-notification_sent_history.sql": true,
"patch-monitor-basic-auth.sql": true,
}
/**
@@ -77,7 +80,7 @@ class Database {
console.log(`Data Dir: ${Database.dataDir}`);
}
static async connect() {
static async connect(testMode = false) {
const acquireConnectionTimeout = 120 * 1000;
const Dialect = require("knex/lib/dialects/sqlite3/index.js");
@@ -110,9 +113,15 @@ class Database {
await R.autoloadModels("./server/model");
await R.exec("PRAGMA foreign_keys = ON");
// Change to WAL
await R.exec("PRAGMA journal_mode = WAL");
if (testMode) {
// Change to MEMORY
await R.exec("PRAGMA journal_mode = MEMORY");
} else {
// Change to WAL
await R.exec("PRAGMA journal_mode = WAL");
}
await R.exec("PRAGMA cache_size = -12000");
await R.exec("PRAGMA auto_vacuum = FULL");
console.log("SQLite config:");
console.log(await R.getAll("PRAGMA journal_mode"));
@@ -131,7 +140,7 @@ class Database {
console.info("Latest database version: " + this.latestVersion);
if (version === this.latestVersion) {
console.info("Database no need to patch");
console.info("Database patch not needed");
} else if (version > this.latestVersion) {
console.info("Warning: Database version is newer than expected");
} else {
@@ -152,8 +161,8 @@ class Database {
await Database.close();
console.error(ex);
console.error("Start Uptime-Kuma failed due to patch db failed");
console.error("Please submit the bug report if you still encounter the problem after restart: https://github.com/louislam/uptime-kuma/issues");
console.error("Start Uptime-Kuma failed due to issue patching the database");
console.error("Please submit a bug report if you still encounter the problem after restart: https://github.com/louislam/uptime-kuma/issues");
this.restore();
process.exit(1);
@@ -191,7 +200,7 @@ class Database {
await Database.close();
console.error(ex);
console.error("Start Uptime-Kuma failed due to patch db failed");
console.error("Start Uptime-Kuma failed due to issue patching the database");
console.error("Please submit the bug report if you still encounter the problem after restart: https://github.com/louislam/uptime-kuma/issues");
this.restore();
@@ -232,7 +241,7 @@ class Database {
this.patched = true;
await this.importSQLFile("./db/" + sqlFilename);
databasePatchedFiles[sqlFilename] = true;
console.log(sqlFilename + " is patched successfully");
console.log(sqlFilename + " was patched successfully");
} else {
debug(sqlFilename + " is already patched, skip");
@@ -287,7 +296,7 @@ class Database {
};
process.addListener("unhandledRejection", listener);
console.log("Closing DB");
console.log("Closing the database");
while (true) {
Database.noReject = true;
@@ -297,7 +306,7 @@ class Database {
if (Database.noReject) {
break;
} else {
console.log("Waiting to close the db");
console.log("Waiting to close the database");
}
}
console.log("SQLite closed");
@@ -312,7 +321,7 @@ class Database {
*/
static backup(version) {
if (! this.backupPath) {
console.info("Backup the db");
console.info("Backing up the database");
this.backupPath = this.dataDir + "kuma.db.bak" + version;
fs.copyFileSync(Database.path, this.backupPath);
@@ -335,7 +344,7 @@ class Database {
*/
static restore() {
if (this.backupPath) {
console.error("Patch db failed!!! Restoring the backup");
console.error("Patching the database failed!!! Restoring the backup");
const shmPath = Database.path + "-shm";
const walPath = Database.path + "-wal";
@@ -354,7 +363,7 @@ class Database {
fs.unlinkSync(walPath);
}
} catch (e) {
console.log("Restore failed, you may need to restore the backup manually");
console.log("Restore failed; you may need to restore the backup manually");
process.exit(1);
}
@@ -373,6 +382,17 @@ class Database {
console.log("Nothing to restore");
}
}
static getSize() {
debug("Database.getSize()");
let stats = fs.statSync(Database.path);
debug(stats);
return stats.size;
}
static async shrink() {
await R.exec("VACUUM");
}
}
module.exports = Database;

View File

@@ -6,7 +6,7 @@ const jobs = [
{
name: "clear-old-data",
interval: "at 03:14",
}
},
];
const initBackgroundJobs = function (args) {

View File

@@ -7,7 +7,7 @@ dayjs.extend(timezone);
const axios = require("axios");
const { Prometheus } = require("../prometheus");
const { debug, UP, DOWN, PENDING, flipStatus, TimeLogger } = require("../../src/util");
const { tcping, ping, dnsResolve, checkCertificate, checkStatusCode, getTotalClientInRoom, setting } = require("../util-server");
const { tcping, ping, dnsResolve, checkCertificate, checkStatusCode, getTotalClientInRoom, setting, errorLog } = require("../util-server");
const { R } = require("redbean-node");
const { BeanModel } = require("redbean-node/dist/bean-model");
const { Notification } = require("../notification");
@@ -58,6 +58,8 @@ class Monitor extends BeanModel {
method: this.method,
body: this.body,
headers: this.headers,
basic_auth_user: this.basic_auth_user,
basic_auth_pass: this.basic_auth_pass,
hostname: this.hostname,
port: this.port,
maxretries: this.maxretries,
@@ -80,6 +82,15 @@ class Monitor extends BeanModel {
};
}
/**
* Encode user and password to Base64 encoding
* for HTTP "basic" auth, as per RFC-7617
* @returns {string}
*/
encodeBase64(user, pass) {
return Buffer.from(user + ":" + pass).toString("base64");
}
/**
* Parse to boolean
* @returns {boolean}
@@ -108,6 +119,19 @@ class Monitor extends BeanModel {
const beat = async () => {
let beatInterval = this.interval;
if (! beatInterval) {
beatInterval = 1;
}
if (demoMode) {
if (beatInterval < 20) {
console.log("beat interval too low, reset to 20s");
beatInterval = 20;
}
}
// Expose here for prometheus update
// undefined if not https
let tlsInfo = undefined;
@@ -141,15 +165,26 @@ class Monitor extends BeanModel {
// Do not do any queries/high loading things before the "bean.ping"
let startTime = dayjs().valueOf();
// HTTP basic auth
let basicAuthHeader = {};
if (this.basic_auth_user) {
basicAuthHeader = {
"Authorization": "Basic " + this.encodeBase64(this.basic_auth_user, this.basic_auth_pass),
};
}
debug(`[${this.name}] Prepare Options for axios`);
const options = {
url: this.url,
method: (this.method || "get").toLowerCase(),
...(this.body ? { data: JSON.parse(this.body) } : {}),
timeout: this.interval * 1000 * 0.8,
headers: {
"Accept": "*/*",
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9",
"User-Agent": "Uptime-Kuma/" + version,
...(this.headers ? JSON.parse(this.headers) : {}),
...(basicAuthHeader),
},
httpsAgent: new https.Agent({
maxCachedSessions: 0, // Use Custom agent to disable session reuse (https://github.com/nodejs/node/issues/3940)
@@ -160,6 +195,8 @@ class Monitor extends BeanModel {
return checkStatusCode(status, this.getAcceptedStatuscodes());
},
};
debug(`[${this.name}] Axios Request`);
let res = await axios.request(options);
bean.msg = `${res.status} - ${res.statusText}`;
bean.ping = dayjs().valueOf() - startTime;
@@ -167,8 +204,16 @@ class Monitor extends BeanModel {
// Check certificate if https is used
let certInfoStartTime = dayjs().valueOf();
if (this.getUrl()?.protocol === "https:") {
debug(`[${this.name}] Check cert`);
try {
tlsInfo = await this.updateTlsInfo(checkCertificate(res));
let tlsInfoObject = checkCertificate(res);
tlsInfo = await this.updateTlsInfo(tlsInfoObject);
if (!this.getIgnoreTls()) {
debug(`[${this.name}] call sendCertNotification`);
await this.sendCertNotification(tlsInfoObject);
}
} catch (e) {
if (e.message !== "No TLS certificate in response") {
console.error(e.message);
@@ -264,11 +309,14 @@ class Monitor extends BeanModel {
debug("heartbeatCount" + heartbeatCount + " " + time);
if (heartbeatCount <= 0) {
// Fix #922, since previous heartbeat could be inserted by api, it should get from database
previousBeat = await Monitor.getPreviousHeartbeat(this.id);
throw new Error("No heartbeat in the time window");
} else {
// No need to insert successful heartbeat for push type, so end here
retries = 0;
this.heartbeatInterval = setTimeout(beat, this.interval * 1000);
this.heartbeatInterval = setTimeout(beat, beatInterval * 1000);
return;
}
@@ -342,15 +390,21 @@ class Monitor extends BeanModel {
}
}
let beatInterval = this.interval;
debug(`[${this.name}] Check isImportant`);
let isImportant = Monitor.isImportantBeat(isFirstBeat, previousBeat?.status, bean.status);
// Mark as important if status changed, ignore pending pings,
// Don't notify if disrupted changes to up
if (isImportant) {
bean.important = true;
debug(`[${this.name}] sendNotification`);
await Monitor.sendNotification(isFirstBeat, this, bean);
// Clear Status Page Cache
debug(`[${this.name}] apicache clear`);
apicache.clear();
} else {
bean.important = false;
}
@@ -366,35 +420,49 @@ class Monitor extends BeanModel {
console.warn(`Monitor #${this.id} '${this.name}': Failing: ${bean.msg} | Interval: ${beatInterval} seconds | Type: ${this.type}`);
}
debug(`[${this.name}] Send to socket`);
io.to(this.user_id).emit("heartbeat", bean.toJSON());
Monitor.sendStats(io, this.id, this.user_id);
debug(`[${this.name}] Store`);
await R.store(bean);
debug(`[${this.name}] prometheus.update`);
prometheus.update(bean, tlsInfo);
previousBeat = bean;
if (! this.isStop) {
if (demoMode) {
if (beatInterval < 20) {
console.log("beat interval too low, reset to 20s");
beatInterval = 20;
}
}
this.heartbeatInterval = setTimeout(beat, beatInterval * 1000);
debug(`[${this.name}] SetTimeout for next check.`);
this.heartbeatInterval = setTimeout(safeBeat, beatInterval * 1000);
} else {
console.log(`[${this.name}] isStop = true, no next check.`);
}
};
const safeBeat = async () => {
try {
await beat();
} catch (e) {
console.trace(e);
errorLog(e, false);
console.error("Please report to https://github.com/louislam/uptime-kuma/issues");
if (! this.isStop) {
console.log("Try to restart the monitor");
this.heartbeatInterval = setTimeout(safeBeat, this.interval * 1000);
}
}
};
// Delay Push Type
if (this.type === "push") {
setTimeout(() => {
beat();
safeBeat();
}, this.interval * 1000);
} else {
beat();
safeBeat();
}
}
@@ -426,10 +494,36 @@ class Monitor extends BeanModel {
let tls_info_bean = await R.findOne("monitor_tls_info", "monitor_id = ?", [
this.id,
]);
if (tls_info_bean == null) {
tls_info_bean = R.dispense("monitor_tls_info");
tls_info_bean.monitor_id = this.id;
} else {
// Clear sent history if the cert changed.
try {
let oldCertInfo = JSON.parse(tls_info_bean.info_json);
let isValidObjects = oldCertInfo && oldCertInfo.certInfo && checkCertificateResult && checkCertificateResult.certInfo;
if (isValidObjects) {
if (oldCertInfo.certInfo.fingerprint256 !== checkCertificateResult.certInfo.fingerprint256) {
debug("Resetting sent_history");
await R.exec("DELETE FROM notification_sent_history WHERE type = 'certificate' AND monitor_id = ?", [
this.id
]);
} else {
debug("No need to reset sent_history");
debug(oldCertInfo.certInfo.fingerprint256);
debug(checkCertificateResult.certInfo.fingerprint256);
}
} else {
debug("Not valid object");
}
} catch (e) { }
}
tls_info_bean.info_json = JSON.stringify(checkCertificateResult);
await R.store(tls_info_bean);
@@ -577,9 +671,7 @@ class Monitor extends BeanModel {
static async sendNotification(isFirstBeat, monitor, bean) {
if (!isFirstBeat || bean.status === DOWN) {
let notificationList = await R.getAll("SELECT notification.* FROM notification, monitor_notification WHERE monitor_id = ? AND monitor_notification.notification_id = notification.id ", [
monitor.id,
]);
const notificationList = await Monitor.getNotificationList(monitor);
let text;
if (bean.status === UP) {
@@ -598,12 +690,82 @@ class Monitor extends BeanModel {
console.log(e);
}
}
// Clear Status Page Cache
apicache.clear();
}
}
static async getNotificationList(monitor) {
let notificationList = await R.getAll("SELECT notification.* FROM notification, monitor_notification WHERE monitor_id = ? AND monitor_notification.notification_id = notification.id ", [
monitor.id,
]);
return notificationList;
}
async sendCertNotification(tlsInfoObject) {
if (tlsInfoObject && tlsInfoObject.certInfo && tlsInfoObject.certInfo.daysRemaining) {
const notificationList = await Monitor.getNotificationList(this);
debug("call sendCertNotificationByTargetDays");
await this.sendCertNotificationByTargetDays(tlsInfoObject.certInfo.daysRemaining, 21, notificationList);
await this.sendCertNotificationByTargetDays(tlsInfoObject.certInfo.daysRemaining, 14, notificationList);
await this.sendCertNotificationByTargetDays(tlsInfoObject.certInfo.daysRemaining, 7, notificationList);
}
}
async sendCertNotificationByTargetDays(daysRemaining, targetDays, notificationList) {
if (daysRemaining > targetDays) {
debug(`No need to send cert notification. ${daysRemaining} > ${targetDays}`);
return;
}
if (notificationList.length > 0) {
let row = await R.getRow("SELECT * FROM notification_sent_history WHERE type = ? AND monitor_id = ? AND days = ?", [
"certificate",
this.id,
targetDays,
]);
// Sent already, no need to send again
if (row) {
debug("Sent already, no need to send again");
return;
}
let sent = false;
debug("Send certificate notification");
for (let notification of notificationList) {
try {
debug("Sending to " + notification.name);
await Notification.send(JSON.parse(notification.config), `[${this.name}][${this.url}] Certificate will be expired in ${daysRemaining} days`);
sent = true;
} catch (e) {
console.error("Cannot send cert notification to " + notification.name);
console.error(e);
}
}
if (sent) {
await R.exec("INSERT INTO notification_sent_history (type, monitor_id, days) VALUES(?, ?, ?)", [
"certificate",
this.id,
targetDays,
]);
}
} else {
debug("No notification, no need to send cert notification");
}
}
static async getPreviousHeartbeat(monitorID) {
return await R.getRow(`
SELECT status, time FROM heartbeat
WHERE id = (select MAX(id) from heartbeat where monitor_id = ?)
`, [
monitorID
]);
}
}
module.exports = Monitor;

View File

@@ -0,0 +1,89 @@
//
// bark.js
// UptimeKuma
//
// Created by Lakr Aream on 2021/10/24.
// Copyright © 2021 Lakr Aream. All rights reserved.
//
const NotificationProvider = require("./notification-provider");
const { DOWN, UP } = require("../../src/util");
const { default: axios } = require("axios");
// bark is an APN bridge that sends notifications to Apple devices.
const barkNotificationGroup = "UptimeKuma";
const barkNotificationAvatar = "https://github.com/louislam/uptime-kuma/raw/master/public/icon.png";
const barkNotificationSound = "telegraph";
const successMessage = "Successes!";
class Bark extends NotificationProvider {
name = "Bark";
async send(notification, msg, monitorJSON = null, heartbeatJSON = null) {
try {
var barkEndpoint = notification.barkEndpoint;
// check if the endpoint has a "/" suffix, if so, delete it first
if (barkEndpoint.endsWith("/")) {
barkEndpoint = barkEndpoint.substring(0, barkEndpoint.length - 1);
}
if (msg != null && heartbeatJSON != null && heartbeatJSON["status"] == UP) {
let title = "UptimeKuma Monitor Up";
return await this.postNotification(title, msg, barkEndpoint);
}
if (msg != null && heartbeatJSON != null && heartbeatJSON["status"] == DOWN) {
let title = "UptimeKuma Monitor Down";
return await this.postNotification(title, msg, barkEndpoint);
}
if (msg != null) {
let title = "UptimeKuma Message";
return await this.postNotification(title, msg, barkEndpoint);
}
} catch (error) {
throw error;
}
}
// add additional parameter for better on device styles (iOS 15 optimized)
appendAdditionalParameters(postUrl) {
// grouping all our notifications
postUrl += "?group=" + barkNotificationGroup;
// set icon to uptime kuma icon, 11kb should be fine
postUrl += "&icon=" + barkNotificationAvatar;
// picked a sound, this should follow system's mute status when arrival
postUrl += "&sound=" + barkNotificationSound;
return postUrl;
}
// thrown if failed to check result, result code should be in range 2xx
checkResult(result) {
if (result.status == null) {
throw new Error("Bark notification failed with invalid response!");
}
if (result.status < 200 || result.status >= 300) {
throw new Error("Bark notification failed with status code " + result.status);
}
}
async postNotification(title, subtitle, endpoint) {
// url encode title and subtitle
title = encodeURIComponent(title);
subtitle = encodeURIComponent(subtitle);
let postUrl = endpoint + "/" + title + "/" + subtitle;
postUrl = this.appendAdditionalParameters(postUrl);
let result = await axios.get(postUrl);
this.checkResult(result);
if (result.statusText != null) {
return "Bark notification succeed: " + result.statusText;
}
// because returned in range 200 ..< 300
return successMessage;
}
}
module.exports = Bark;

View File

@@ -0,0 +1,42 @@
const NotificationProvider = require("./notification-provider");
const axios = require("axios");
class ClickSendSMS extends NotificationProvider {
name = "clicksendsms";
async send(notification, msg, monitorJSON = null, heartbeatJSON = null) {
let okMsg = "Sent Successfully.";
try {
console.log({ notification });
let config = {
headers: {
"Content-Type": "application/json",
"Authorization": "Basic " + Buffer.from(notification.clicksendsmsLogin + ":" + notification.clicksendsmsPassword).toString('base64'),
"Accept": "text/json",
}
};
let data = {
messages: [
{
"body": msg.replace(/[^\x00-\x7F]/g, ""),
"to": notification.clicksendsmsToNumber,
"source": "uptime-kuma",
"from": notification.clicksendsmsSenderName,
}
]
};
let resp = await axios.post("https://rest.clicksend.com/v3/sms/send", data, config);
if (resp.data.data.messages[0].status !== "SUCCESS") {
let error = "Something gone wrong. Api returned " + resp.data.data.messages[0].status + ".";
this.throwGeneralAxiosError(error);
}
return okMsg;
} catch (error) {
this.throwGeneralAxiosError(error);
}
}
}
module.exports = ClickSendSMS;

View File

@@ -14,8 +14,8 @@ class DingDing extends NotificationProvider {
let params = {
msgtype: "markdown",
markdown: {
title: monitorJSON["name"],
text: `## [${this.statusToString(heartbeatJSON["status"])}] \n > ${heartbeatJSON["msg"]} \n > Time(UTC):${heartbeatJSON["time"]}`,
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)) {

View File

@@ -27,7 +27,7 @@ class Feishu extends NotificationProvider {
content: {
post: {
zh_cn: {
title: "UptimeKuma Alert: " + monitorJSON["name"],
title: "UptimeKuma Alert: [Down] " + monitorJSON["name"],
content: [
[
{
@@ -54,7 +54,7 @@ class Feishu extends NotificationProvider {
content: {
post: {
zh_cn: {
title: "UptimeKuma Alert: " + monitorJSON["name"],
title: "UptimeKuma Alert: [Up] " + monitorJSON["name"],
content: [
[
{

View File

@@ -0,0 +1,47 @@
const NotificationProvider = require("./notification-provider");
const axios = require("axios");
const { setting } = require("../util-server");
const { getMonitorRelativeURL } = require("../../src/util");
const { DOWN, UP } = require("../../src/util");
class GoogleChat extends NotificationProvider {
name = "GoogleChat";
async send(notification, msg, monitorJSON = null, heartbeatJSON = null) {
let okMsg = "Sent Successfully.";
try {
// Google Chat message formatting: https://developers.google.com/chat/api/guides/message-formats/basic
let textMsg = ''
if (heartbeatJSON && heartbeatJSON.status === UP) {
textMsg = `✅ Application is back online\n`;
} else if (heartbeatJSON && heartbeatJSON.status === DOWN) {
textMsg = `🔴 Application went down\n`;
}
if (monitorJSON && monitorJSON.name) {
textMsg += `*${monitorJSON.name}*\n`;
}
textMsg += `${msg}`;
const baseURL = await setting("primaryBaseURL");
if (baseURL && monitorJSON) {
textMsg += `\n${baseURL + getMonitorRelativeURL(monitorJSON.id)}`;
}
const data = {
"text": textMsg,
};
await axios.post(notification.googleChatWebhookURL, data);
return okMsg;
} catch (error) {
this.throwGeneralAxiosError(error);
}
}
}
module.exports = GoogleChat;

View File

@@ -20,7 +20,7 @@ class Mattermost extends NotificationProvider {
return okMsg;
}
const mattermostChannel = notification.mattermostchannel;
const mattermostChannel = notification.mattermostchannel.toLowerCase();
const mattermostIconEmoji = notification.mattermosticonemo;
const mattermostIconUrl = notification.mattermosticonurl;

View File

@@ -7,12 +7,12 @@ class Pushover extends NotificationProvider {
async send(notification, msg, monitorJSON = null, heartbeatJSON = null) {
let okMsg = "Sent Successfully.";
let pushoverlink = "https://api.pushover.net/1/messages.json"
let pushoverlink = "https://api.pushover.net/1/messages.json";
try {
if (heartbeatJSON == null) {
let data = {
"message": "<b>Uptime Kuma Pushover testing successful.</b>",
"message": msg,
"user": notification.pushoveruserkey,
"token": notification.pushoverapptoken,
"sound": notification.pushoversounds,
@@ -21,8 +21,8 @@ class Pushover extends NotificationProvider {
"retry": "30",
"expire": "3600",
"html": 1,
}
await axios.post(pushoverlink, data)
};
await axios.post(pushoverlink, data);
return okMsg;
}
@@ -36,11 +36,11 @@ class Pushover extends NotificationProvider {
"retry": "30",
"expire": "3600",
"html": 1,
}
await axios.post(pushoverlink, data)
};
await axios.post(pushoverlink, data);
return okMsg;
} catch (error) {
this.throwGeneralAxiosError(error)
this.throwGeneralAxiosError(error);
}
}

View File

@@ -0,0 +1,44 @@
const NotificationProvider = require("./notification-provider");
const axios = require("axios");
class SerwerSMS extends NotificationProvider {
name = "serwersms";
async send(notification, msg, monitorJSON = null, heartbeatJSON = null) {
let okMsg = "Sent Successfully.";
try {
let config = {
headers: {
"Content-Type": "application/json",
}
};
let data = {
"username": notification.serwersmsUsername,
"password": notification.serwersmsPassword,
"phone": notification.serwersmsPhoneNumber,
"text": msg.replace(/[^\x00-\x7F]/g, ""),
"sender": notification.serwersmsSenderName,
};
let resp = await axios.post("https://api2.serwersms.pl/messages/send_sms", data, config);
if (!resp.data.success) {
if (resp.data.error) {
let error = `SerwerSMS.pl API returned error code ${resp.data.error.code} (${resp.data.error.type}) with error message: ${resp.data.error.message}`;
this.throwGeneralAxiosError(error);
} else {
let error = "SerwerSMS.pl API returned an unexpected response";
this.throwGeneralAxiosError(error);
}
}
return okMsg;
} catch (error) {
this.throwGeneralAxiosError(error);
}
}
}
module.exports = SerwerSMS;

View File

@@ -12,8 +12,23 @@ class SMTP extends NotificationProvider {
host: notification.smtpHost,
port: notification.smtpPort,
secure: notification.smtpSecure,
tls: {
rejectUnauthorized: notification.smtpIgnoreTLSError || false,
}
};
// Fix #1129
if (notification.smtpDkimDomain) {
config.dkim = {
domainName: notification.smtpDkimDomain,
keySelector: notification.smtpDkimKeySelector,
privateKey: notification.smtpDkimPrivateKey,
hashAlgo: notification.smtpDkimHashAlgo,
headerFieldNames: notification.smtpDkimheaderFieldNames,
skipFields: notification.smtpDkimskipFields,
};
}
// Should fix the issue in https://github.com/louislam/uptime-kuma/issues/26#issuecomment-896373904
if (notification.smtpUsername || notification.smtpPassword) {
config.auth = {
@@ -87,9 +102,6 @@ class SMTP extends NotificationProvider {
to: notification.smtpTo,
subject: subject,
text: bodyTextContent,
tls: {
rejectUnauthorized: notification.smtpIgnoreTLSError || false,
},
});
return "Sent Successfully.";

View File

@@ -0,0 +1,41 @@
const NotificationProvider = require("./notification-provider");
const axios = require("axios");
const { setting } = require("../util-server");
const { getMonitorRelativeURL } = require("../../src/util");
class Stackfield extends NotificationProvider {
name = "stackfield";
async send(notification, msg, monitorJSON = null) {
let okMsg = "Sent Successfully.";
try {
// Stackfield message formatting: https://www.stackfield.com/help/formatting-messages-2001
let textMsg = "+Uptime Kuma Alert+";
if (monitorJSON && monitorJSON.name) {
textMsg += `\n*${monitorJSON.name}*`;
}
textMsg += `\n${msg}`;
const baseURL = await setting("primaryBaseURL");
if (baseURL) {
textMsg += `\n${baseURL + getMonitorRelativeURL(monitorJSON.id)}`;
}
const data = {
"Title": textMsg,
};
await axios.post(notification.stackfieldwebhookURL, data);
return okMsg;
} catch (error) {
this.throwGeneralAxiosError(error);
}
}
}
module.exports = Stackfield;

View File

@@ -0,0 +1,47 @@
const NotificationProvider = require("./notification-provider");
const axios = require("axios");
const { DOWN, UP } = require("../../src/util");
class WeCom extends NotificationProvider {
name = "WeCom";
async send(notification, msg, monitorJSON = null, heartbeatJSON = null) {
let okMsg = "Sent Successfully.";
try {
let WeComUrl = "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=" + notification.weComBotKey;
let config = {
headers: {
"Content-Type": "application/json"
}
};
let body = this.composeMessage(heartbeatJSON, msg);
await axios.post(WeComUrl, body, config);
return okMsg;
} catch (error) {
this.throwGeneralAxiosError(error);
}
}
composeMessage(heartbeatJSON, msg) {
let title;
if (msg != null && heartbeatJSON != null && heartbeatJSON['status'] == UP) {
title = "UptimeKuma Monitor Up";
}
if (msg != null && heartbeatJSON != null && heartbeatJSON["status"] == DOWN) {
title = "UptimeKuma Monitor Down";
}
if (msg != null) {
title = "UptimeKuma Message";
}
return {
msgtype: "text",
text: {
content: title + msg
}
};
}
}
module.exports = WeCom;

View File

@@ -8,6 +8,7 @@ const Mattermost = require("./notification-providers/mattermost");
const Matrix = require("./notification-providers/matrix");
const Octopush = require("./notification-providers/octopush");
const PromoSMS = require("./notification-providers/promosms");
const ClickSendSMS = require("./notification-providers/clicksendsms");
const Pushbullet = require("./notification-providers/pushbullet");
const Pushover = require("./notification-providers/pushover");
const Pushy = require("./notification-providers/pushy");
@@ -21,6 +22,11 @@ const Webhook = require("./notification-providers/webhook");
const Feishu = require("./notification-providers/feishu");
const AliyunSms = require("./notification-providers/aliyun-sms");
const DingDing = require("./notification-providers/dingding");
const Bark = require("./notification-providers/bark");
const SerwerSMS = require("./notification-providers/serwersms");
const Stackfield = require("./notification-providers/stackfield");
const WeCom = require("./notification-providers/wecom");
const GoogleChat = require("./notification-providers/google-chat");
class Notification {
@@ -45,6 +51,7 @@ class Notification {
new Matrix(),
new Octopush(),
new PromoSMS(),
new ClickSendSMS(),
new Pushbullet(),
new Pushover(),
new Pushy(),
@@ -54,6 +61,11 @@ class Notification {
new SMTP(),
new Telegram(),
new Webhook(),
new Bark(),
new SerwerSMS(),
new Stackfield(),
new WeCom(),
new GoogleChat()
];
for (let item of list) {

View File

@@ -48,7 +48,7 @@ function Ping(host, options) {
this._args = (options.args) ? options.args : [ "-n", "-t", timeout, "-c", "1", host ];
this._regmatch = /=([0-9.]+?) ms/;
} else if (util.FBSD) {
} else if (util.BSD) {
this._bin = "/sbin/ping";
const defaultArgs = [ "-n", "-t", timeout, "-c", "1", host ];

View File

@@ -60,7 +60,9 @@ class Prometheus {
}
try {
monitor_cert_days_remaining.set(this.monitorLabelValues, tlsInfo.certInfo.daysRemaining);
if (tlsInfo.certInfo != null) {
monitor_cert_days_remaining.set(this.monitorLabelValues, tlsInfo.certInfo.daysRemaining);
}
} catch (e) {
console.error(e);
}

39
server/rate-limiter.js Normal file
View File

@@ -0,0 +1,39 @@
const { RateLimiter } = require("limiter");
const { debug } = require("../src/util");
class KumaRateLimiter {
constructor(config) {
this.errorMessage = config.errorMessage;
this.rateLimiter = new RateLimiter(config);
}
async pass(callback, num = 1) {
const remainingRequests = await this.removeTokens(num);
debug("Rate Limit (remainingRequests):" + remainingRequests);
if (remainingRequests < 0) {
if (callback) {
callback({
ok: false,
msg: this.errorMessage,
});
}
return false;
}
return true;
}
async removeTokens(num = 1) {
return await this.rateLimiter.removeTokens(num);
}
}
const loginRateLimiter = new KumaRateLimiter({
tokensPerInterval: 20,
interval: "minute",
fireImmediately: true,
errorMessage: "Too frequently, try again later."
});
module.exports = {
loginRateLimiter
};

View File

@@ -31,12 +31,7 @@ router.get("/api/push/:pushToken", async (request, response) => {
throw new Error("Monitor not found or not active.");
}
const previousHeartbeat = await R.getRow(`
SELECT status, time FROM heartbeat
WHERE id = (select MAX(id) from heartbeat where monitor_id = ?)
`, [
monitor.id
]);
const previousHeartbeat = await Monitor.getPreviousHeartbeat(monitor.id);
let status = UP;
if (monitor.isUpsideDown()) {
@@ -101,6 +96,10 @@ router.get("/api/status-page/config", async (_request, response) => {
config.statusPagePublished = true;
}
if (! config.statusPageTags) {
config.statusPageTags = false;
}
if (! config.title) {
config.title = "Uptime Kuma";
}
@@ -140,10 +139,28 @@ router.get("/api/status-page/monitor-list", cache("5 minutes"), async (_request,
try {
await checkPublished();
const publicGroupList = [];
let list = await R.find("group", " public = 1 ORDER BY weight ");
const tagsVisible = (await getSettings("statusPage")).statusPageTags;
const list = await R.find("group", " public = 1 ORDER BY weight ");
for (let groupBean of list) {
publicGroupList.push(await groupBean.toPublicJSON());
let monitorGroup = await groupBean.toPublicJSON();
if (tagsVisible) {
monitorGroup.monitorList = await Promise.all(monitorGroup.monitorList.map(async (monitor) => {
// Includes tags as an array in response, allows for tags to be displayed on public status page
const tags = await R.getAll(
`SELECT monitor_tag.monitor_id, monitor_tag.value, tag.name, tag.color
FROM monitor_tag
JOIN tag
ON monitor_tag.tag_id = tag.id
WHERE monitor_tag.monitor_id = ?`, [monitor.id]
);
return {
...monitor,
tags: tags
};
}));
}
publicGroupList.push(monitorGroup);
}
response.json(publicGroupList);

View File

@@ -1,4 +1,15 @@
console.log("Welcome to Uptime Kuma");
// Check Node.js Version
const nodeVersion = parseInt(process.versions.node.split(".")[0]);
const requiredVersion = 14;
console.log(`Your Node.js version: ${nodeVersion}`);
if (nodeVersion < requiredVersion) {
console.error(`Error: Your Node.js version is not supported, please upgrade to Node.js >= ${requiredVersion}.`);
process.exit(-1);
}
const args = require("args-parser")(process.argv);
const { sleep, debug, getRandomInt, genSecret } = require("../src/util");
const config = require("./config");
@@ -31,6 +42,7 @@ debug("Importing prometheus-api-metrics");
const prometheusAPIMetrics = require("prometheus-api-metrics");
debug("Importing compare-versions");
const compareVersions = require("compare-versions");
const { passwordStrength } = require("check-password-strength");
debug("Importing 2FA Modules");
const notp = require("notp");
@@ -40,7 +52,7 @@ console.log("Importing this project modules");
debug("Importing Monitor");
const Monitor = require("./model/monitor");
debug("Importing Settings");
const { getSettings, setSettings, setting, initJWTSecret, checkLogin, startUnitTest, FBSD } = require("./util-server");
const { getSettings, setSettings, setting, initJWTSecret, checkLogin, startUnitTest, FBSD, errorLog } = require("./util-server");
debug("Importing Notification");
const { Notification } = require("./notification");
@@ -51,6 +63,7 @@ const Database = require("./database");
debug("Importing Background Jobs");
const { initBackgroundJobs } = require("./jobs");
const { loginRateLimiter } = require("./rate-limiter");
const { basicAuth } = require("./auth");
const { login } = require("./auth");
@@ -77,6 +90,7 @@ const port = parseInt(process.env.UPTIME_KUMA_PORT || process.env.PORT || args.p
// SSL
const sslKey = process.env.UPTIME_KUMA_SSL_KEY || process.env.SSL_KEY || args["ssl-key"] || undefined;
const sslCert = process.env.UPTIME_KUMA_SSL_CERT || process.env.SSL_CERT || args["ssl-cert"] || undefined;
const disableFrameSameOrigin = !!process.env.UPTIME_KUMA_DISABLE_FRAME_SAMEORIGIN || args["disable-frame-sameorigin"] || false;
// 2FA / notp verification defaults
const twofa_verification_opts = {
@@ -116,9 +130,20 @@ module.exports.io = io;
// Must be after io instantiation
const { sendNotificationList, sendHeartbeatList, sendImportantHeartbeatList, sendInfo } = require("./client");
const { statusPageSocketHandler } = require("./socket-handlers/status-page-socket-handler");
const databaseSocketHandler = require("./socket-handlers/database-socket-handler");
const TwoFA = require("./2fa");
app.use(express.json());
// Global Middleware
app.use(function (req, res, next) {
if (!disableFrameSameOrigin) {
res.setHeader("X-Frame-Options", "SAMEORIGIN");
}
res.removeHeader("X-Powered-By");
next();
});
/**
* Total WebSocket client connected to server currently, no actual use
* @type {number}
@@ -147,13 +172,23 @@ let needSetup = false;
* Cache Index HTML
* @type {string}
*/
let indexHTML = fs.readFileSync("./dist/index.html").toString();
let indexHTML = "";
try {
indexHTML = fs.readFileSync("./dist/index.html").toString();
} catch (e) {
// "dist/index.html" is not necessary for development
if (process.env.NODE_ENV !== "development") {
console.error("Error: Cannot find 'dist/index.html', did you install correctly?");
process.exit(1);
}
}
exports.entryPage = "dashboard";
(async () => {
Database.init(args);
await initDatabase();
await initDatabase(testMode);
exports.entryPage = await setting("entryPage");
@@ -163,6 +198,15 @@ exports.entryPage = "dashboard";
// Normal Router here
// ***************************
// Entry Page
app.get("/", async (_request, response) => {
if (exports.entryPage === "statusPage") {
response.redirect("/status");
} else {
response.redirect("/dashboard");
}
});
// Robots.txt
app.get("/robots.txt", async (_request, response) => {
let txt = "User-agent: *\nDisallow:";
@@ -192,7 +236,7 @@ exports.entryPage = "dashboard";
const apiRouter = require("./routers/api-router");
app.use(apiRouter);
// Universal Route Handler, must be at the end of all express route.
// Universal Route Handler, must be at the end of all express routes.
app.get("*", async (_request, response) => {
if (_request.originalUrl.startsWith("/upload/")) {
response.status(404).send("File not found.");
@@ -260,10 +304,15 @@ exports.entryPage = "dashboard";
socket.on("login", async (data, callback) => {
console.log("Login");
// Login Rate Limit
if (! await loginRateLimiter.pass(callback)) {
return;
}
let user = await login(data.username, data.password);
if (user) {
if (user.twofaStatus == 0) {
if (user.twofa_status == 0) {
afterLogin(socket, user);
callback({
ok: true,
@@ -273,7 +322,7 @@ exports.entryPage = "dashboard";
});
}
if (user.twofaStatus == 1 && !data.token) {
if (user.twofa_status == 1 && !data.token) {
callback({
tokenRequired: true,
});
@@ -282,8 +331,14 @@ exports.entryPage = "dashboard";
if (data.token) {
let verify = notp.totp.verify(data.token, user.twofa_secret, twofa_verification_opts);
if (verify && verify.delta == 0) {
if (user.twofa_last_token !== data.token && verify) {
afterLogin(socket, user);
await R.exec("UPDATE `user` SET twofa_last_token = ? WHERE id = ? ", [
data.token,
socket.userID,
]);
callback({
ok: true,
token: jwt.sign({
@@ -321,7 +376,7 @@ exports.entryPage = "dashboard";
]);
if (user.twofa_status == 0) {
let newSecret = await genSecret();
let newSecret = genSecret();
let encodedSecret = base32.encode(newSecret);
// Google authenticator doesn't like equal signs
@@ -377,10 +432,7 @@ exports.entryPage = "dashboard";
socket.on("disable2FA", async (callback) => {
try {
checkLogin(socket);
await R.exec("UPDATE `user` SET twofa_status = 0 WHERE id = ? ", [
socket.userID,
]);
await TwoFA.disable2FA(socket.userID);
callback({
ok: true,
@@ -401,7 +453,7 @@ exports.entryPage = "dashboard";
let verify = notp.totp.verify(token, user.twofa_secret, twofa_verification_opts);
if (verify && verify.delta == 0) {
if (user.twofa_last_token !== token && verify) {
callback({
ok: true,
valid: true,
@@ -448,8 +500,12 @@ exports.entryPage = "dashboard";
socket.on("setup", async (username, password, callback) => {
try {
if (passwordStrength(password).value === "Too weak") {
throw new Error("Password is too weak. It should contain alphabetic and numeric characters. It must be at least 6 characters in length.");
}
if ((await R.count("user")) !== 0) {
throw new Error("Uptime Kuma has been setup. If you want to setup again, please delete the database.");
throw new Error("Uptime Kuma has been initialized. If you want to run setup again, please delete the database.");
}
let user = R.dispense("user");
@@ -494,8 +550,8 @@ exports.entryPage = "dashboard";
await updateMonitorNotification(bean.id, notificationIDList);
await startMonitor(socket.userID, bean.id);
await sendMonitorList(socket);
await startMonitor(socket.userID, bean.id);
callback({
ok: true,
@@ -528,6 +584,8 @@ exports.entryPage = "dashboard";
bean.method = monitor.method;
bean.body = monitor.body;
bean.headers = monitor.headers;
bean.basic_auth_user = monitor.basic_auth_user;
bean.basic_auth_pass = monitor.basic_auth_pass;
bean.interval = monitor.interval;
bean.retryInterval = monitor.retryInterval;
bean.hostname = monitor.hostname;
@@ -607,6 +665,38 @@ exports.entryPage = "dashboard";
}
});
socket.on("getMonitorBeats", async (monitorID, period, callback) => {
try {
checkLogin(socket);
console.log(`Get Monitor Beats: ${monitorID} User ID: ${socket.userID}`);
if (period == null) {
throw new Error("Invalid period.");
}
let list = await R.getAll(`
SELECT * FROM heartbeat
WHERE monitor_id = ? AND
time > DATETIME('now', '-' || ? || ' hours')
ORDER BY time ASC
`, [
monitorID,
period,
]);
callback({
ok: true,
data: list,
});
} catch (e) {
callback({
ok: false,
msg: e.message,
});
}
});
// Start or Resume the monitor
socket.on("resumeMonitor", async (monitorID, callback) => {
try {
@@ -837,10 +927,14 @@ exports.entryPage = "dashboard";
try {
checkLogin(socket);
if (! password.currentPassword) {
if (! password.newPassword) {
throw new Error("Invalid new password");
}
if (passwordStrength(password.newPassword).value === "Too weak") {
throw new Error("Password is too weak. It should contain alphabetic and numeric characters. It must be at least 6 characters in length.");
}
let user = await R.findOne("user", " id = ? AND active = 1 ", [
socket.userID,
]);
@@ -1056,6 +1150,8 @@ exports.entryPage = "dashboard";
method: monitorListData[i].method || "GET",
body: monitorListData[i].body,
headers: monitorListData[i].headers,
basic_auth_user: monitorListData[i].basic_auth_user,
basic_auth_pass: monitorListData[i].basic_auth_pass,
interval: monitorListData[i].interval,
retryInterval: retryInterval,
hostname: monitorListData[i].hostname,
@@ -1222,6 +1318,7 @@ exports.entryPage = "dashboard";
// Status Page Socket Handler for admin only
statusPageSocketHandler(socket);
databaseSocketHandler(socket);
debug("added all socket handlers");
@@ -1333,14 +1430,14 @@ async function getMonitorJSONList(userID) {
return result;
}
async function initDatabase() {
async function initDatabase(testMode = false) {
if (! fs.existsSync(Database.path)) {
console.log("Copying Database");
fs.copyFileSync(Database.templatePath, Database.path);
}
console.log("Connecting to Database");
await Database.connect();
console.log("Connecting to the Database");
await Database.connect(testMode);
console.log("Connected");
// Patch the database
@@ -1439,7 +1536,7 @@ async function shutdownFunction(signal) {
}
function finalFunction() {
console.log("Graceful shutdown successfully!");
console.log("Graceful shutdown successful!");
}
gracefulShutdown(server, {
@@ -1454,5 +1551,6 @@ gracefulShutdown(server, {
// Catch unexpected errors here
process.addListener("unhandledRejection", (error, promise) => {
console.trace(error);
errorLog(error, false);
console.error("If you keep encountering errors, please report to https://github.com/louislam/uptime-kuma/issues");
});

View File

@@ -0,0 +1,37 @@
const { checkLogin } = require("../util-server");
const Database = require("../database");
module.exports = (socket) => {
// Post or edit incident
socket.on("getDatabaseSize", async (callback) => {
try {
checkLogin(socket);
callback({
ok: true,
size: Database.getSize(),
});
} catch (error) {
callback({
ok: false,
msg: error.message,
});
}
});
socket.on("shrinkDatabase", async (callback) => {
try {
checkLogin(socket);
Database.shrink();
callback({
ok: true,
});
} catch (error) {
callback({
ok: false,
msg: error.message,
});
}
});
};

View File

@@ -8,12 +8,15 @@ const { Resolver } = require("dns");
const child_process = require("child_process");
const iconv = require("iconv-lite");
const chardet = require("chardet");
const fs = require("fs");
const nodeJsUtil = require("util");
// From ping-lite
exports.WIN = /^win/.test(process.platform);
exports.LIN = /^linux/.test(process.platform);
exports.MAC = /^darwin/.test(process.platform);
exports.FBSD = /^freebsd/.test(process.platform);
exports.BSD = /bsd$/.test(process.platform);
/**
* Init or reset JWT secret
@@ -199,8 +202,13 @@ const getDaysRemaining = (validFrom, validTo) => {
// param: info - the chain obtained from getPeerCertificate()
const parseCertificateInfo = function (info) {
let link = info;
let i = 0;
const existingList = {};
while (link) {
debug(`[${i}] ${link.fingerprint}`);
if (!link.valid_from || !link.valid_to) {
break;
}
@@ -208,15 +216,24 @@ const parseCertificateInfo = function (info) {
link.validFor = link.subjectaltname?.replace(/DNS:|IP Address:/g, "").split(", ");
link.daysRemaining = getDaysRemaining(new Date(), link.validTo);
existingList[link.fingerprint] = true;
// Move up the chain until loop is encountered
if (link.issuerCertificate == null) {
break;
} else if (link.fingerprint == link.issuerCertificate.fingerprint) {
} else if (link.issuerCertificate.fingerprint in existingList) {
debug(`[Last] ${link.issuerCertificate.fingerprint}`);
link.issuerCertificate = null;
break;
} else {
link = link.issuerCertificate;
}
// Should be no use, but just in case.
if (i > 500) {
throw new Error("Dead loop occurred in parseCertificateInfo");
}
i++;
}
return info;
@@ -226,6 +243,7 @@ exports.checkCertificate = function (res) {
const info = res.request.res.socket.getPeerCertificate(true);
const valid = res.request.res.socket.authorized || false;
debug("Parsing Certificate Info");
const parsedInfo = parseCertificateInfo(info);
return {
@@ -332,3 +350,24 @@ exports.convertToUTF8 = (body) => {
const str = iconv.decode(body, guessEncoding);
return str.toString();
};
let logFile;
try {
logFile = fs.createWriteStream("./data/error.log", {
flags: "a"
});
} catch (_) { }
exports.errorLog = (error, outputToConsole = true) => {
try {
if (logFile) {
const dateTime = R.isoDateTime();
logFile.write(`[${dateTime}] ` + nodeJsUtil.format(error) + "\n");
if (outputToConsole) {
console.error(error);
}
}
} catch (_) { }
};

View File

@@ -189,7 +189,7 @@ textarea.form-control {
opacity: 1;
}
.table-hover > tbody > tr:hover {
.table-hover > tbody > tr:hover > * {
--bs-table-accent-bg: #070a10;
color: $dark-font-color;
}
@@ -313,6 +313,20 @@ textarea.form-control {
opacity: 0;
}
.slide-fade-up-enter-active {
transition: all 0.2s $easing-in;
}
.slide-fade-up-leave-active {
transition: all 0.2s $easing-in;
}
.slide-fade-up-enter-from,
.slide-fade-up-leave-to {
transform: translateY(-50px);
opacity: 0;
}
.monitor-list {
&.scrollbar {
min-height: calc(100vh - 240px);
@@ -346,6 +360,10 @@ textarea.form-control {
&.active {
background-color: #cdf8f4;
}
.tags {
// Removes margin to line up tags list with uptime percentage
margin-left: -0.25rem;
}
}
}

View File

@@ -12,6 +12,7 @@ $dark-font-color2: #020b05;
$dark-bg: #0d1117;
$dark-bg2: #070a10;
$dark-border-color: #1d2634;
$dark-header-bg: #161b22;
$easing-in: cubic-bezier(0.54, 0.78, 0.55, 0.97);
$easing-out: cubic-bezier(0.25, 0.46, 0.45, 0.94);

View File

@@ -167,7 +167,7 @@ export default {
},
getBeatTitle(beat) {
return `${this.$root.datetime(beat.time)} - ${beat.msg}`;
return `${this.$root.datetime(beat.time)}` + ((beat.msg) ? ` - ${beat.msg}` : ``);
}
},
}

View File

@@ -16,8 +16,8 @@
<div v-if="tokenRequired">
<div class="form-floating mt-3">
<input id="floatingToken" v-model="token" type="text" maxlength="6" class="form-control" placeholder="123456">
<label for="floatingToken">{{ $t("Token") }}</label>
<input id="otp" v-model="token" type="text" maxlength="6" class="form-control" placeholder="123456">
<label for="otp">{{ $t("Token") }}</label>
</div>
</div>

View File

@@ -137,7 +137,7 @@ export default {
justify-content: space-between;
.dark & {
background-color: #161b22;
background-color: $dark-header-bg;
border-bottom: 0;
}
}

View File

@@ -1,16 +1,34 @@
<template>
<LineChart :chart-data="chartData" :options="chartOptions" />
<div>
<div class="period-options">
<button type="button" class="btn btn-light dropdown-toggle btn-period-toggle" data-bs-toggle="dropdown" aria-expanded="false">
{{ chartPeriodOptions[chartPeriodHrs] }}&nbsp;
</button>
<ul class="dropdown-menu dropdown-menu-end">
<li v-for="(item, key) in chartPeriodOptions" :key="key">
<a class="dropdown-item" :class="{ active: chartPeriodHrs == key }" href="#" @click="chartPeriodHrs = key">{{ item }}</a>
</li>
</ul>
</div>
<div class="chart-wrapper" :class="{ loading : loading}">
<LineChart :chart-data="chartData" :options="chartOptions" />
</div>
</div>
</template>
<script>
<script lang="ts">
import { BarController, BarElement, Chart, Filler, LinearScale, LineController, LineElement, PointElement, TimeScale, Tooltip } from "chart.js";
import dayjs from "dayjs";
import utc from "dayjs/plugin/utc";
import timezone from "dayjs/plugin/timezone";
import "chartjs-adapter-dayjs";
import { LineChart } from "vue-chart-3";
import { useToast } from "vue-toastification";
import { UP, DOWN, PENDING } from "../util.ts";
dayjs.extend(utc);
dayjs.extend(timezone);
const toast = useToast();
Chart.register(LineController, BarController, LineElement, PointElement, TimeScale, BarElement, LinearScale, Tooltip, Filler);
@@ -24,8 +42,23 @@ export default {
},
data() {
return {
loading: false,
// Configurable filtering on top of the returned data
chartPeriodHrs: 6,
chartPeriodHrs: 0,
chartPeriodOptions: {
0: this.$t("recent"),
3: "3h",
6: "6h",
24: "24h",
168: "1w",
},
// A heartbeatList for 3h, 6h, 24h, 1w
// Uses the $root.heartbeatList when value is null
heartbeatList: null
};
},
computed: {
@@ -117,7 +150,7 @@ export default {
},
callbacks: {
label: (context) => {
return ` ${new Intl.NumberFormat().format(context.parsed.y)} ms`
return ` ${new Intl.NumberFormat().format(context.parsed.y)} ms`;
},
}
},
@@ -125,27 +158,36 @@ export default {
display: false,
},
},
}
};
},
chartData() {
let pingData = []; // Ping Data for Line Chart, y-axis contains ping time
let downData = []; // Down Data for Bar Chart, y-axis is 1 if target is down, 0 if target is up
if (this.monitorId in this.$root.heartbeatList) {
this.$root.heartbeatList[this.monitorId]
.filter(
(beat) => dayjs.utc(beat.time).tz(this.$root.timezone).isAfter(dayjs().subtract(this.chartPeriodHrs, "hours")))
.map((beat) => {
const x = this.$root.datetime(beat.time);
pingData.push({
x,
y: beat.ping,
});
downData.push({
x,
y: beat.status === 0 ? 1 : 0,
})
let heartbeatList = this.heartbeatList ||
(this.monitorId in this.$root.heartbeatList && this.$root.heartbeatList[this.monitorId]) ||
[];
heartbeatList
.filter(
// Filtering as data gets appended
// not the most efficient, but works for now
(beat) => dayjs.utc(beat.time).tz(this.$root.timezone).isAfter(
dayjs().subtract(Math.max(this.chartPeriodHrs, 6), "hours")
)
)
.map((beat) => {
const x = this.$root.datetime(beat.time);
pingData.push({
x,
y: beat.ping,
});
}
downData.push({
x,
y: beat.status === DOWN ? 1 : 0,
});
});
return {
datasets: [
{
@@ -172,5 +214,110 @@ export default {
};
},
},
watch: {
// Update chart data when the selected chart period changes
chartPeriodHrs: function (newPeriod) {
if (newPeriod == "0") {
newPeriod = null;
this.heartbeatList = null;
} else {
this.loading = true;
this.$root.getMonitorBeats(this.monitorId, newPeriod, (res) => {
if (!res.ok) {
toast.error(res.msg);
} else {
this.heartbeatList = res.data;
}
this.loading = false;
});
}
}
},
created() {
// Setup Watcher on the root heartbeatList,
// And mirror latest change to this.heartbeatList
this.$watch(() => this.$root.heartbeatList[this.monitorId],
(heartbeatList) => {
if (this.chartPeriodHrs != 0) {
const newBeat = heartbeatList.at(-1);
if (newBeat && dayjs.utc(newBeat.time) > dayjs.utc(this.heartbeatList.at(-1)?.time)) {
this.heartbeatList.push(heartbeatList.at(-1));
}
}
},
{ deep: true }
);
}
};
</script>
<style lang="scss" scoped>
@import "../assets/vars.scss";
.form-select {
width: unset;
display: inline-flex;
}
.period-options {
padding: 0.1em 1em;
margin-bottom: -1.2em;
float: right;
position: relative;
z-index: 10;
.dropdown-menu {
padding: 0;
min-width: 50px;
font-size: 0.9em;
.dark & {
background: $dark-bg;
}
.dropdown-item {
border-radius: 0.3rem;
padding: 2px 16px 4px 16px;
.dark & {
background: $dark-bg;
}
.dark &:hover {
background: $dark-font-color;
}
}
.dark & .dropdown-item.active {
background: $primary;
color: $dark-font-color2;
}
}
.btn-period-toggle {
padding: 2px 15px;
background: transparent;
border: 0;
color: $link-color;
opacity: 0.7;
font-size: 0.9em;
&::after {
vertical-align: 0.155em;
}
.dark & {
color: $dark-font-color;
}
}
}
.chart-wrapper {
margin-bottom: 0.5em;
&.loading {
filter: blur(10px);
}
}
</style>

View File

@@ -41,6 +41,9 @@
<Uptime :monitor="monitor.element" type="24" :pill="true" />
{{ monitor.element.name }}
</div>
<div class="tags">
<Tag v-for="tag in monitor.element.tags" :key="tag" :item="tag" :size="'sm'" />
</div>
</div>
<div :key="$root.userHeartbeatBar" class="col-3 col-md-4">
<HeartbeatBar size="small" :monitor-id="monitor.element.id" />
@@ -59,12 +62,14 @@
import Draggable from "vuedraggable";
import HeartbeatBar from "./HeartbeatBar.vue";
import Uptime from "./Uptime.vue";
import Tag from "./Tag.vue";
export default {
components: {
Draggable,
HeartbeatBar,
Uptime,
Tag,
},
props: {
editMode: {

View File

@@ -0,0 +1,67 @@
<template>
<div class="my-3 py-3">
<h5 @click="isOpen = !isOpen">
<div
class="
w-50
d-flex
justify-content-between
align-items-center
pe-2
"
>
<span class="pb-2">{{ heading }}</span>
<font-awesome-icon
icon="chevron-down"
class="animated"
:class="{ open: isOpen }"
/>
</div>
</h5>
<transition name="slide-fade-up">
<div v-if="isOpen" class="mt-3">
<slot></slot>
</div>
</transition>
</div>
</template>
<script>
export default {
props: {
heading: {
type: String,
default: "",
},
defaultOpen: {
type: Boolean,
default: false,
},
},
data() {
return {
isOpen: this.defaultOpen,
};
},
};
</script>
<style lang="scss" scoped>
@import "../assets/vars.scss";
h5:after {
content: "";
display: block;
width: 50%;
padding-top: 8px;
border-bottom: 1px solid $dark-border-color;
}
.open {
transform: rotate(180deg);
}
.animated {
transition: all 0.2s $easing-in;
}
</style>

View File

@@ -1,5 +1,5 @@
<template>
<span :class="className">{{ uptime }}</span>
<span :class="className" :title="24 + $t('-hour')">{{ uptime }}</span>
</template>
<script>

View File

@@ -0,0 +1,15 @@
<template>
<div class="mb-3">
<label for="Bark Endpoint" class="form-label">{{ $t("Bark Endpoint") }}<span style="color: red;"><sup>*</sup></span></label>
<input id="Bark Endpoint" v-model="$parent.notification.barkEndpoint" type="text" class="form-control" required>
<div class="form-text">
<p><span style="color: red;"><sup>*</sup></span>{{ $t("Required") }}</p>
</div>
<i18n-t tag="div" keypath="wayToGetTeamsURL" class="form-text">
<a
href="https://github.com/Finb/Bark"
target="_blank"
>{{ $t("here") }}</a>
</i18n-t>
</div>
</template>

View File

@@ -0,0 +1,38 @@
<template>
<div class="mb-3">
<label for="clicksendsms-login" class="form-label">API Username</label>
<div class="form-text">
{{ $t("apiCredentials") }}
<a href="http://dashboard.clicksend.com/account/subaccounts" target="_blank">{{ $t("here") }}</a>
</div>
<input id="clicksendsms-login" v-model="$parent.notification.clicksendsmsLogin" type="text" class="form-control" required>
<label for="clicksendsms-key" class="form-label">API Key</label>
<HiddenInput id="clicksendsms-key" v-model="$parent.notification.clicksendsmsPassword" :required="true" autocomplete="one-time-code"></HiddenInput>
</div>
<div class="mb-3">
<div class="form-text">
{{ $t("checkPrice", [$t("clicksendsms")]) }}
<a href="https://www.clicksend.com/us/pricing" target="_blank">https://clicksend.com/us/pricing</a>
</div>
</div>
<div class="mb-3">
<label for="clicksendsms-to-number" class="form-label">Recipient Number</label>
<input id="clicksendsms-to-number" v-model="$parent.notification.clicksendsmsToNumber" type="text" minlength="8" maxlength="14" class="form-control" required>
</div>
<div class="mb-3">
<label for="clicksendsms-sender-name" class="form-label">From Name/Number -
<a href="https://help.clicksend.com/article/4kgj7krx00-what-is-a-sender-id-or-sender-number" target="_blank">More Info</a>
</label>
<input id="clicksendsms-sender-name" v-model="$parent.notification.clicksendsmsSenderName" type="text" minlength="3" maxlength="11" class="form-control">
<div class="form-text">Leave blank to use a shared sender number.</div>
</div>
</template>
<script>
import HiddenInput from "../HiddenInput.vue";
export default {
components: {
HiddenInput,
},
};
</script>

View File

@@ -0,0 +1,13 @@
<template>
<div class="mb-3">
<label for="google-chat-webhook-url" class="form-label">{{ $t("Webhook URL") }}<span style="color: red;"><sup>*</sup></span></label>
<input id="google-chat-webhook-url" v-model="$parent.notification.googleChatWebhookURL" type="text" class="form-control" required>
<div class="form-text">
<span style="color: red;"><sup>*</sup></span>{{ $t("Required") }}
<i18n-t tag="p" keypath="aboutWebhooks" style="margin-top: 8px;">
<a href="https://developers.google.com/chat/how-tos/webhooks" target="_blank">https://developers.google.com/chat/how-tos/webhooks</a>
</i18n-t>
</div>
</div>
</template>

View File

@@ -11,7 +11,7 @@
<div class="form-text">
<span style="color: red;"><sup>*</sup></span>{{ $t("Required") }}
<i18n-t tag="p" keypath="aboutWebhooks" style="margin-top: 8px;">
<a href="https://docs.rocket.chat/guides/administration/administration/integrations" target="_blank">https://api.slack.com/messaging/webhooks</a>
<a href="https://docs.rocket.chat/guides/administration/administration/integrations" target="_blank">https://docs.rocket.chat/guides/administration/administration/integrations</a>
</i18n-t>
<p style="margin-top: 8px;">
{{ $t("aboutChannelName", [$t("rocket.chat")]) }}

View File

@@ -1,82 +1,117 @@
<template>
<div class="mb-3">
<label for="hostname" class="form-label">{{ $t("Hostname") }}</label>
<input id="hostname" v-model="$parent.notification.smtpHost" type="text" class="form-control" required>
</div>
<div class="mb-3">
<label for="port" class="form-label">{{ $t("Port") }}</label>
<input id="port" v-model="$parent.notification.smtpPort" type="number" class="form-control" required min="0" max="65535" step="1">
</div>
<div class="mb-3">
<label for="secure" class="form-label">Secure</label>
<select id="secure" v-model="$parent.notification.smtpSecure" class="form-select">
<option :value="false">{{ $t("secureOptionNone") }}</option>
<option :value="true">{{ $t("secureOptionTLS") }}</option>
</select>
</div>
<div class="mb-3">
<div class="form-check">
<input id="ignore-tls-error" v-model="$parent.notification.smtpIgnoreTLSError" class="form-check-input" type="checkbox" value="">
<label class="form-check-label" for="ignore-tls-error">
{{ $t("Ignore TLS Error") }}
</label>
<div>
<div class="mb-3">
<label for="hostname" class="form-label">{{ $t("Hostname") }}</label>
<input id="hostname" v-model="$parent.notification.smtpHost" type="text" class="form-control" required>
</div>
</div>
<div class="mb-3">
<label for="username" class="form-label">{{ $t("Username") }}</label>
<input id="username" v-model="$parent.notification.smtpUsername" type="text" class="form-control" autocomplete="false">
</div>
<div class="mb-3">
<label for="password" class="form-label">{{ $t("Password") }}</label>
<HiddenInput id="password" v-model="$parent.notification.smtpPassword" :required="false" autocomplete="one-time-code"></HiddenInput>
</div>
<div class="mb-3">
<label for="from-email" class="form-label">{{ $t("From Email") }}</label>
<input id="from-email" v-model="$parent.notification.smtpFrom" type="text" class="form-control" required autocomplete="false" placeholder="&quot;Uptime Kuma&quot; &lt;example@kuma.pet&gt;">
<div class="form-text">
<div class="mb-3">
<label for="port" class="form-label">{{ $t("Port") }}</label>
<input id="port" v-model="$parent.notification.smtpPort" type="number" class="form-control" required min="0" max="65535" step="1">
</div>
</div>
<div class="mb-3">
<label for="to-email" class="form-label">{{ $t("To Email") }}</label>
<input id="to-email" v-model="$parent.notification.smtpTo" type="text" class="form-control" autocomplete="false" placeholder="example2@kuma.pet, example3@kuma.pet" :required="!hasRecipient">
</div>
<div class="mb-3">
<label for="secure" class="form-label">{{ $t("Security") }}</label>
<select id="secure" v-model="$parent.notification.smtpSecure" class="form-select">
<option :value="false">{{ $t("secureOptionNone") }}</option>
<option :value="true">{{ $t("secureOptionTLS") }}</option>
</select>
</div>
<div class="mb-3">
<label for="to-cc" class="form-label">{{ $t("smtpCC") }}</label>
<input id="to-cc" v-model="$parent.notification.smtpCC" type="text" class="form-control" autocomplete="false" :required="!hasRecipient">
</div>
<div class="mb-3">
<div class="form-check">
<input id="ignore-tls-error" v-model="$parent.notification.smtpIgnoreTLSError" class="form-check-input" type="checkbox" value="">
<label class="form-check-label" for="ignore-tls-error">
{{ $t("Ignore TLS Error") }}
</label>
</div>
</div>
<div class="mb-3">
<label for="to-bcc" class="form-label">{{ $t("smtpBCC") }}</label>
<input id="to-bcc" v-model="$parent.notification.smtpBCC" type="text" class="form-control" autocomplete="false" :required="!hasRecipient">
</div>
<div class="mb-3">
<label for="username" class="form-label">{{ $t("Username") }}</label>
<input id="username" v-model="$parent.notification.smtpUsername" type="text" class="form-control" autocomplete="false">
</div>
<div class="mb-3">
<label for="subject-email" class="form-label">{{ $t("emailCustomSubject") }}</label>
<input id="subject-email" v-model="$parent.notification.customSubject" type="text" class="form-control" autocomplete="false" placeholder="">
<div v-pre class="form-text">
(leave blank for default one)<br />
{{NAME}}: Service Name<br />
{{HOSTNAME_OR_URL}}: Hostname or URL<br />
{{URL}}: URL<br />
{{STATUS}}: Status<br />
<div class="mb-3">
<label for="password" class="form-label">{{ $t("Password") }}</label>
<HiddenInput id="password" v-model="$parent.notification.smtpPassword" :required="false" autocomplete="one-time-code"></HiddenInput>
</div>
<div class="mb-3">
<label for="from-email" class="form-label">{{ $t("From Email") }}</label>
<input id="from-email" v-model="$parent.notification.smtpFrom" type="text" class="form-control" required autocomplete="false" placeholder="&quot;Uptime Kuma&quot; &lt;example@kuma.pet&gt;">
<div class="form-text">
</div>
</div>
<div class="mb-3">
<label for="to-email" class="form-label">{{ $t("To Email") }}</label>
<input id="to-email" v-model="$parent.notification.smtpTo" type="text" class="form-control" autocomplete="false" placeholder="example2@kuma.pet, example3@kuma.pet" :required="!hasRecipient">
</div>
<div class="mb-3">
<label for="to-cc" class="form-label">{{ $t("smtpCC") }}</label>
<input id="to-cc" v-model="$parent.notification.smtpCC" type="text" class="form-control" autocomplete="false" :required="!hasRecipient">
</div>
<div class="mb-3">
<label for="to-bcc" class="form-label">{{ $t("smtpBCC") }}</label>
<input id="to-bcc" v-model="$parent.notification.smtpBCC" type="text" class="form-control" autocomplete="false" :required="!hasRecipient">
</div>
<ToggleSection :heading="$t('smtpDkimSettings')">
<i18n-t tag="div" keypath="smtpDkimDesc" class="form-text mb-3">
<a href="https://nodemailer.com/dkim/" target="_blank">{{ $t("documentation") }}</a>
</i18n-t>
<div class="mb-3">
<label for="dkim-domain" class="form-label">{{ $t("smtpDkimDomain") }}</label>
<input id="dkim-domain" v-model="$parent.notification.smtpDkimDomain" type="text" class="form-control" autocomplete="false" placeholder="example.com">
</div>
<div class="mb-3">
<label for="dkim-key-selector" class="form-label">{{ $t("smtpDkimKeySelector") }}</label>
<input id="dkim-key-selector" v-model="$parent.notification.smtpDkimKeySelector" type="text" class="form-control" autocomplete="false" placeholder="2017">
</div>
<div class="mb-3">
<label for="dkim-private-key" class="form-label">{{ $t("smtpDkimPrivateKey") }}</label>
<textarea id="dkim-private-key" v-model="$parent.notification.smtpDkimPrivateKey" rows="5" type="text" class="form-control" autocomplete="false" placeholder="-----BEGIN PRIVATE KEY-----"></textarea>
</div>
<div class="mb-3">
<label for="dkim-hash-algo" class="form-label">{{ $t("smtpDkimHashAlgo") }}</label>
<input id="dkim-hash-algo" v-model="$parent.notification.smtpDkimHashAlgo" type="text" class="form-control" autocomplete="false" placeholder="sha256">
</div>
<div class="mb-3">
<label for="dkim-header-fields" class="form-label">{{ $t("smtpDkimheaderFieldNames") }}</label>
<input id="dkim-header-fields" v-model="$parent.notification.smtpDkimheaderFieldNames" type="text" class="form-control" autocomplete="false" placeholder="message-id:date:from:to">
</div>
<div class="mb-3">
<label for="dkim-skip-fields" class="form-label">{{ $t("smtpDkimskipFields") }}</label>
<input id="dkim-skip-fields" v-model="$parent.notification.smtpDkimskipFields" type="text" class="form-control" autocomplete="false" placeholder="message-id:date">
</div>
</ToggleSection>
<div class="mb-3">
<label for="subject-email" class="form-label">{{ $t("emailCustomSubject") }}</label>
<input id="subject-email" v-model="$parent.notification.customSubject" type="text" class="form-control" autocomplete="false" placeholder="">
<div v-pre class="form-text">
(leave blank for default one)<br />
{{NAME}}: Service Name<br />
{{HOSTNAME_OR_URL}}: Hostname or URL<br />
{{URL}}: URL<br />
{{STATUS}}: Status<br />
</div>
</div>
</div>
</template>
<script>
import HiddenInput from "../HiddenInput.vue";
import ToggleSection from "../ToggleSection.vue";
export default {
components: {
HiddenInput,
ToggleSection,
},
computed: {
hasRecipient() {

View File

@@ -0,0 +1,28 @@
<template>
<div class="mb-3">
<label for="serwersms-username" class="form-label">{{ $t('serwersmsAPIUser') }}</label>
<input id="serwersms-username" v-model="$parent.notification.serwersmsUsername" type="text" class="form-control" required>
</div>
<div class="mb-3">
<label for="serwersms-key" class="form-label">{{ $t('serwersmsAPIPassword') }}</label>
<HiddenInput id="serwersms-key" v-model="$parent.notification.serwersmsPassword" :required="true" autocomplete="one-time-code"></HiddenInput>
</div>
<div class="mb-3">
<label for="serwersms-phone-number" class="form-label">{{ $t("serwersmsPhoneNumber") }}</label>
<input id="serwersms-phone-number" v-model="$parent.notification.serwersmsPhoneNumber" type="text" class="form-control" required>
</div>
<div class="mb-3">
<label for="serwersms-sender-name" class="form-label">{{ $t("serwersmsSenderName") }}</label>
<input id="serwersms-sender-name" v-model="$parent.notification.serwersmsSenderName" type="text" minlength="3" maxlength="11" class="form-control">
</div>
</template>
<script>
import HiddenInput from "../HiddenInput.vue";
export default {
components: {
HiddenInput,
},
};
</script>

View File

@@ -0,0 +1,13 @@
<template>
<div class="mb-3">
<label for="stackfield-webhook-url" class="form-label">{{ $t("Webhook URL") }}<span style="color: red;"><sup>*</sup></span></label>
<input id="stackfield-webhook-url" v-model="$parent.notification.stackfieldwebhookURL" type="text" class="form-control" required>
<div class="form-text">
<span style="color: red;"><sup>*</sup></span>{{ $t("Required") }}
<i18n-t tag="p" keypath="aboutWebhooks" style="margin-top: 8px;">
<a href="https://www.stackfield.com/developer-api#AnchorAPI2" target="_blank">https://www.stackfield.com/developer-api#AnchorAPI2</a>
</i18n-t>
</div>
</div>
</template>

View File

@@ -25,13 +25,7 @@
</p>
<p style="margin-top: 8px;">
<template v-if="$parent.notification.telegramBotToken">
<a :href="telegramGetUpdatesURL" target="_blank" style="word-break: break-word;">{{ telegramGetUpdatesURL }}</a>
</template>
<template v-else>
{{ telegramGetUpdatesURL }}
</template>
<a :href="telegramGetUpdatesURL('withToken')" target="_blank" style="word-break: break-word;">{{ telegramGetUpdatesURL("masked") }}</a>
</p>
</div>
</div>
@@ -40,49 +34,51 @@
<script>
import HiddenInput from "../HiddenInput.vue";
import axios from "axios";
import { useToast } from "vue-toastification"
import { useToast } from "vue-toastification";
const toast = useToast();
export default {
components: {
HiddenInput,
},
computed: {
telegramGetUpdatesURL() {
let token = `<${this.$t("YOUR BOT TOKEN HERE")}>`
methods: {
telegramGetUpdatesURL(mode = "masked") {
let token = `<${this.$t("YOUR BOT TOKEN HERE")}>`;
if (this.$parent.notification.telegramBotToken) {
token = this.$parent.notification.telegramBotToken;
if (mode === "withToken") {
token = this.$parent.notification.telegramBotToken;
} else if (mode === "masked") {
token = "*".repeat(this.$parent.notification.telegramBotToken.length);
}
}
return `https://api.telegram.org/bot${token}/getUpdates`;
},
},
methods: {
async autoGetTelegramChatID() {
try {
let res = await axios.get(this.telegramGetUpdatesURL)
let res = await axios.get(this.telegramGetUpdatesURL("withToken"));
if (res.data.result.length >= 1) {
let update = res.data.result[res.data.result.length - 1]
let update = res.data.result[res.data.result.length - 1];
if (update.channel_post) {
this.notification.telegramChatID = update.channel_post.chat.id;
this.$parent.notification.telegramChatID = update.channel_post.chat.id;
} else if (update.message) {
this.notification.telegramChatID = update.message.chat.id;
this.$parent.notification.telegramChatID = update.message.chat.id;
} else {
throw new Error(this.$t("chatIDNotFound"))
throw new Error(this.$t("chatIDNotFound"));
}
} else {
throw new Error(this.$t("chatIDNotFound"))
throw new Error(this.$t("chatIDNotFound"));
}
} catch (error) {
toast.error(error.message)
toast.error(error.message);
}
},
}
}
};
</script>

View File

@@ -0,0 +1,12 @@
<template>
<div class="mb-3">
<label for="WeCom Bot Key" class="form-label">{{ $t("WeCom Bot Key") }}<span style="color: red;"><sup>*</sup></span></label>
<input id="WeCom Bot Key" v-model="$parent.notification.weComBotKey" type="text" class="form-control" required>
<div class="form-text">
<p><span style="color: red;"><sup>*</sup></span>{{ $t("Required") }}</p>
</div>
<i18n-t tag="p" keypath="Read more:">
<a href="https://work.weixin.qq.com/api/doc/90000/90136/91770" target="_blank">https://work.weixin.qq.com/api/doc/90000/90136/91770</a>
</i18n-t>
</div>
</template>

View File

@@ -1,4 +1,4 @@
import STMP from "./SMTP.vue"
import STMP from "./SMTP.vue";
import Telegram from "./Telegram.vue";
import Discord from "./Discord.vue";
import Webhook from "./Webhook.vue";
@@ -11,6 +11,7 @@ import Pushover from "./Pushover.vue";
import Pushy from "./Pushy.vue";
import Octopush from "./Octopush.vue";
import PromoSMS from "./PromoSMS.vue";
import ClickSendSMS from "./ClickSendSMS.vue";
import LunaSea from "./LunaSea.vue";
import Feishu from "./Feishu.vue";
import Apprise from "./Apprise.vue";
@@ -20,6 +21,11 @@ import Mattermost from "./Mattermost.vue";
import Matrix from "./Matrix.vue";
import AliyunSMS from "./AliyunSms.vue";
import DingDing from "./DingDing.vue";
import Bark from "./Bark.vue";
import SerwerSMS from "./SerwerSMS.vue";
import Stackfield from './Stackfield.vue';
import WeCom from "./WeCom.vue";
import GoogleChat from "./GoogleChat.vue";
/**
* Manage all notification form.
@@ -40,6 +46,7 @@ const NotificationFormList = {
"pushy": Pushy,
"octopush": Octopush,
"promosms": PromoSMS,
"clicksendsms": ClickSendSMS,
"lunasea": LunaSea,
"Feishu": Feishu,
"AliyunSMS": AliyunSMS,
@@ -48,7 +55,12 @@ const NotificationFormList = {
"line": Line,
"mattermost": Mattermost,
"matrix": Matrix,
"DingDing": DingDing
}
"DingDing": DingDing,
"Bark": Bark,
"serwersms": SerwerSMS,
"stackfield": Stackfield,
"WeCom": WeCom,
"GoogleChat": GoogleChat
};
export default NotificationFormList
export default NotificationFormList;

View File

@@ -0,0 +1,25 @@
<template>
<div class="d-flex justify-content-center align-items-center">
<div class="logo d-flex flex-column justify-content-center align-items-center">
<object class="my-4" width="200" height="200" data="/icon.svg" />
<div class="fs-4 fw-bold">Uptime Kuma</div>
<div>{{ $t("Version") }}: {{ $root.info.version }}</div>
<div class="my-1 update-link"><a href="https://github.com/louislam/uptime-kuma/releases" target="_blank" rel="noopener">{{ $t("Check Update On GitHub") }}</a></div>
</div>
</div>
</template>
<script>
export default {
};
</script>
<style lang="scss" scoped>
.logo {
margin: 4em 1em;
}
.update-link {
font-size: 0.9em;
}
</style>

View File

@@ -0,0 +1,143 @@
<template>
<div>
<div class="my-4">
<label for="language" class="form-label">
{{ $t("Language") }}
</label>
<select id="language" v-model="$root.language" class="form-select">
<option
v-for="(lang, i) in $i18n.availableLocales"
:key="`Lang${i}`"
:value="lang"
>
{{ $i18n.messages[lang].languageName }}
</option>
</select>
</div>
<div class="my-4">
<label for="timezone" class="form-label">{{ $t("Theme") }}</label>
<div>
<div
class="btn-group"
role="group"
aria-label="Basic checkbox toggle button group"
>
<input
id="btncheck1"
v-model="$root.userTheme"
type="radio"
class="btn-check"
name="theme"
autocomplete="off"
value="light"
/>
<label class="btn btn-outline-primary" for="btncheck1">
{{ $t("Light") }}
</label>
<input
id="btncheck2"
v-model="$root.userTheme"
type="radio"
class="btn-check"
name="theme"
autocomplete="off"
value="dark"
/>
<label class="btn btn-outline-primary" for="btncheck2">
{{ $t("Dark") }}
</label>
<input
id="btncheck3"
v-model="$root.userTheme"
type="radio"
class="btn-check"
name="theme"
autocomplete="off"
value="auto"
/>
<label class="btn btn-outline-primary" for="btncheck3">
{{ $t("Auto") }}
</label>
</div>
</div>
</div>
<div class="my-4">
<label class="form-label">{{ $t("Theme - Heartbeat Bar") }}</label>
<div>
<div
class="btn-group"
role="group"
aria-label="Basic checkbox toggle button group"
>
<input
id="btncheck4"
v-model="$root.userHeartbeatBar"
type="radio"
class="btn-check"
name="heartbeatBarTheme"
autocomplete="off"
value="normal"
/>
<label class="btn btn-outline-primary" for="btncheck4">
{{ $t("Normal") }}
</label>
<input
id="btncheck5"
v-model="$root.userHeartbeatBar"
type="radio"
class="btn-check"
name="heartbeatBarTheme"
autocomplete="off"
value="bottom"
/>
<label class="btn btn-outline-primary" for="btncheck5">
{{ $t("Bottom") }}
</label>
<input
id="btncheck6"
v-model="$root.userHeartbeatBar"
type="radio"
class="btn-check"
name="heartbeatBarTheme"
autocomplete="off"
value="none"
/>
<label class="btn btn-outline-primary" for="btncheck6">
{{ $t("None") }}
</label>
</div>
</div>
</div>
</div>
</template>
<script>
export default {
};
</script>
<style lang="scss" scoped>
@import "../../assets/vars.scss";
.btn-check:active + .btn-outline-primary,
.btn-check:checked + .btn-outline-primary,
.btn-check:hover + .btn-outline-primary {
color: #fff;
.dark & {
color: #000;
}
}
.dark {
.list-group-item {
background-color: $dark-bg2;
color: $dark-font-color;
}
}
</style>

View File

@@ -0,0 +1,213 @@
<template>
<div>
<div class="my-4">
<h4 class="mt-4 mb-2">{{ $t("Export Backup") }}</h4>
<p>
{{ $t("backupDescription") }} <br />
({{ $t("backupDescription2") }}) <br />
</p>
<div class="mb-2">
<button class="btn btn-primary" @click="downloadBackup">
{{ $t("Export") }}
</button>
</div>
<p>
<strong>{{ $t("backupDescription3") }}</strong>
</p>
</div>
<div class="my-4">
<h4 class="mt-4 mb-2">{{ $t("Import Backup") }}</h4>
<label class="form-label">{{ $t("Options") }}:</label>
<br />
<div class="form-check form-check-inline">
<input
id="radioKeep"
v-model="importHandle"
class="form-check-input"
type="radio"
name="radioImportHandle"
value="keep"
/>
<label class="form-check-label" for="radioKeep">
{{ $t("Keep both") }}
</label>
</div>
<div class="form-check form-check-inline">
<input
id="radioSkip"
v-model="importHandle"
class="form-check-input"
type="radio"
name="radioImportHandle"
value="skip"
/>
<label class="form-check-label" for="radioSkip">
{{ $t("Skip existing") }}
</label>
</div>
<div class="form-check form-check-inline">
<input
id="radioOverwrite"
v-model="importHandle"
class="form-check-input"
type="radio"
name="radioImportHandle"
value="overwrite"
/>
<label class="form-check-label" for="radioOverwrite">
{{ $t("Overwrite") }}
</label>
</div>
<div class="form-text mb-2">
{{ $t("importHandleDescription") }}
</div>
<div class="mb-2">
<input
id="importBackup"
type="file"
class="form-control"
accept="application/json"
/>
</div>
<div class="input-group mb-2 justify-content-end">
<button
type="button"
class="btn btn-outline-primary"
:disabled="processing"
@click="confirmImport"
>
<div
v-if="processing"
class="spinner-border spinner-border-sm me-1"
></div>
{{ $t("Import") }}
</button>
</div>
<div
v-if="importAlert"
class="alert alert-danger mt-3"
style="padding: 6px 16px"
>
{{ importAlert }}
</div>
</div>
<Confirm
ref="confirmImport"
btn-style="btn-danger"
:yes-text="$t('Yes')"
:no-text="$t('No')"
@yes="importBackup"
>
{{ $t("confirmImportMsg") }}
</Confirm>
</div>
</template>
<script>
import Confirm from "../../components/Confirm.vue";
import dayjs from "dayjs";
import { useToast } from "vue-toastification";
const toast = useToast();
export default {
components: {
Confirm,
},
data() {
return {
processing: false,
importHandle: "skip",
importAlert: null,
};
},
methods: {
confirmImport() {
this.$refs.confirmImport.show();
},
downloadBackup() {
let time = dayjs().format("YYYY_MM_DD-hh_mm_ss");
let fileName = `Uptime_Kuma_Backup_${time}.json`;
let monitorList = Object.values(this.$root.monitorList);
let exportData = {
version: this.$root.info.version,
notificationList: this.$root.notificationList,
monitorList: monitorList,
};
exportData = JSON.stringify(exportData, null, 4);
let downloadItem = document.createElement("a");
downloadItem.setAttribute(
"href",
"data:application/json;charset=utf-8," +
encodeURIComponent(exportData)
);
downloadItem.setAttribute("download", fileName);
downloadItem.click();
},
importBackup() {
this.processing = true;
let uploadItem = document.getElementById("importBackup").files;
if (uploadItem.length <= 0) {
this.processing = false;
return (this.importAlert = this.$t("alertNoFile"));
}
if (uploadItem.item(0).type !== "application/json") {
this.processing = false;
return (this.importAlert = this.$t("alertWrongFileType"));
}
let fileReader = new FileReader();
fileReader.readAsText(uploadItem.item(0));
fileReader.onload = (item) => {
this.$root.uploadBackup(
item.target.result,
this.importHandle,
(res) => {
this.processing = false;
if (res.ok) {
toast.success(res.msg);
} else {
toast.error(res.msg);
}
}
);
};
},
},
};
</script>
<style lang="scss" scoped>
@import "../../assets/vars.scss";
.dark {
#importBackup {
&::file-selector-button {
color: $primary;
background-color: $dark-bg;
}
&:hover:not(:disabled):not([readonly])::file-selector-button {
color: $dark-font-color2;
background-color: $primary;
}
}
}
</style>

View File

@@ -0,0 +1,192 @@
<template>
<div>
<form class="my-4" @submit.prevent="saveGeneral">
<!-- Timezone -->
<div class="mb-4">
<label for="timezone" class="form-label">
{{ $t("Timezone") }}
</label>
<select id="timezone" v-model="$root.userTimezone" class="form-select">
<option value="auto">
{{ $t("Auto") }}: {{ guessTimezone }}
</option>
<option
v-for="(timezone, index) in timezoneList"
:key="index"
:value="timezone.value"
>
{{ timezone.name }}
</option>
</select>
</div>
<!-- Search Engine -->
<div class="mb-4">
<label class="form-label">
{{ $t("Search Engine Visibility") }}
</label>
<div class="form-check">
<input
id="searchEngineIndexYes"
v-model="settings.searchEngineIndex"
class="form-check-input"
type="radio"
name="flexRadioDefault"
:value="true"
required
/>
<label class="form-check-label" for="searchEngineIndexYes">
{{ $t("Allow indexing") }}
</label>
</div>
<div class="form-check">
<input
id="searchEngineIndexNo"
v-model="settings.searchEngineIndex"
class="form-check-input"
type="radio"
name="flexRadioDefault"
:value="false"
required
/>
<label class="form-check-label" for="searchEngineIndexNo">
{{ $t("Discourage search engines from indexing site") }}
</label>
</div>
</div>
<!-- Entry Page -->
<div class="mb-4">
<label class="form-label">{{ $t("Entry Page") }}</label>
<div class="form-check">
<input
id="entryPageYes"
v-model="settings.entryPage"
class="form-check-input"
type="radio"
name="statusPage"
value="dashboard"
required
/>
<label class="form-check-label" for="entryPageYes">
{{ $t("Dashboard") }}
</label>
</div>
<div class="form-check">
<input
id="entryPageNo"
v-model="settings.entryPage"
class="form-check-input"
type="radio"
name="statusPage"
value="statusPage"
required
/>
<label class="form-check-label" for="entryPageNo">
{{ $t("Status Page") }}
</label>
</div>
</div>
<!-- Primary Base URL -->
<div class="mb-4">
<label class="form-label" for="primaryBaseURL">
{{ $t("Primary Base URL") }}
</label>
<div class="input-group mb-3">
<input
id="primaryBaseURL"
v-model="settings.primaryBaseURL"
class="form-control"
name="primaryBaseURL"
placeholder="https://"
pattern="https?://.+"
/>
<button class="btn btn-outline-primary" type="button" @click="autoGetPrimaryBaseURL">
{{ $t("Auto Get") }}
</button>
</div>
<div class="form-text"></div>
</div>
<!-- Steam API Key -->
<div class="mb-4">
<label class="form-label" for="steamAPIKey">
{{ $t("Steam API Key") }}
</label>
<HiddenInput
id="steamAPIKey"
v-model="settings.steamAPIKey"
autocomplete="one-time-code"
/>
<div class="form-text">
{{ $t("steamApiKeyDescription") }}
<a href="https://steamcommunity.com/dev" target="_blank">
https://steamcommunity.com/dev
</a>
</div>
</div>
<!-- Save Button -->
<div>
<button class="btn btn-primary" type="submit">
{{ $t("Save") }}
</button>
</div>
</form>
</div>
</template>
<script>
import HiddenInput from "../../components/HiddenInput.vue";
import dayjs from "dayjs";
import utc from "dayjs/plugin/utc";
import timezone from "dayjs/plugin/timezone";
import { timezoneList } from "../../util-frontend";
dayjs.extend(utc);
dayjs.extend(timezone);
export default {
components: {
HiddenInput,
},
data() {
return {
timezoneList: timezoneList(),
};
},
computed: {
settings() {
return this.$parent.$parent.$parent.settings;
},
saveSettings() {
return this.$parent.$parent.$parent.saveSettings;
},
settingsLoaded() {
return this.$parent.$parent.$parent.settingsLoaded;
},
guessTimezone() {
return dayjs.tz.guess();
}
},
methods: {
saveGeneral() {
localStorage.timezone = this.$root.userTimezone;
this.saveSettings();
},
autoGetPrimaryBaseURL() {
this.settings.primaryBaseURL = location.protocol + "//" + location.host;
},
},
};
</script>
<style></style>

View File

@@ -0,0 +1,133 @@
<template>
<div>
<div class="my-4">
<label for="keepDataPeriodDays" class="form-label">
{{
$t("clearDataOlderThan", [
settings.keepDataPeriodDays,
])
}}
</label>
<input
id="keepDataPeriodDays"
v-model="settings.keepDataPeriodDays"
type="number"
class="form-control"
required
min="1"
step="1"
/>
</div>
<div class="my-4">
<button class="btn btn-primary" type="button" @click="saveSettings()">
{{ $t("Save") }}
</button>
</div>
<div class="my-4">
<div class="my-3">
<button class="btn btn-outline-info me-2" @click="shrinkDatabase">
{{ $t("Shrink Database") }} ({{ databaseSizeDisplay }})
</button>
<div class="form-text mt-2 mb-4 ms-2">{{ $t("shrinkDatabaseDescription") }}</div>
</div>
<button
id="clearAllStats-btn"
class="btn btn-outline-danger me-2 mb-2"
@click="confirmClearStatistics"
>
{{ $t("Clear all statistics") }}
</button>
</div>
<Confirm
ref="confirmClearStatistics"
btn-style="btn-danger"
:yes-text="$t('Yes')"
:no-text="$t('No')"
@yes="clearStatistics"
>
{{ $t("confirmClearStatisticsMsg") }}
</Confirm>
</div>
</template>
<script>
import Confirm from "../../components/Confirm.vue";
import { debug } from "../../util.ts";
import { useToast } from "vue-toastification";
const toast = useToast();
export default {
components: {
Confirm,
},
data() {
return {
databaseSize: 0,
};
},
computed: {
settings() {
return this.$parent.$parent.$parent.settings;
},
saveSettings() {
return this.$parent.$parent.$parent.saveSettings;
},
settingsLoaded() {
return this.$parent.$parent.$parent.settingsLoaded;
},
databaseSizeDisplay() {
return (
Math.round((this.databaseSize / 1024 / 1024) * 10) / 10 + " MB"
);
},
},
mounted() {
this.loadDatabaseSize();
},
methods: {
loadDatabaseSize() {
debug("load database size");
this.$root.getSocket().emit("getDatabaseSize", (res) => {
if (res.ok) {
this.databaseSize = res.size;
debug("database size: " + res.size);
} else {
debug(res);
}
});
},
shrinkDatabase() {
this.$root.getSocket().emit("shrinkDatabase", (res) => {
if (res.ok) {
this.loadDatabaseSize();
toast.success("Done");
} else {
debug(res);
}
});
},
confirmClearStatistics() {
this.$refs.confirmClearStatistics.show();
},
clearStatistics() {
this.$root.clearStatistics((res) => {
if (res.ok) {
this.$router.go();
} else {
toast.error(res.msg);
}
});
},
},
};
</script>
<style></style>

View File

@@ -0,0 +1,46 @@
<template>
<div>
<div class="notification-list my-4">
<p v-if="$root.notificationList.length === 0">
{{ $t("Not available, please setup.") }}
</p>
<p v-else>
{{ $t("notificationDescription") }}
</p>
<ul class="list-group mb-3" style="border-radius: 1rem;">
<li v-for="(notification, index) in $root.notificationList" :key="index" class="list-group-item">
{{ notification.name }}<br>
<a href="#" @click="$refs.notificationDialog.show(notification.id)">{{ $t("Edit") }}</a>
</li>
</ul>
<button class="btn btn-primary me-2" type="button" @click="$refs.notificationDialog.show()">
{{ $t("Setup Notification") }}
</button>
</div>
<NotificationDialog ref="notificationDialog" />
</div>
</template>
<script>
import NotificationDialog from "../../components/NotificationDialog.vue";
export default {
components: {
NotificationDialog
},
};
</script>
<style lang="scss" scoped>
@import "../../assets/vars.scss";
.dark {
.list-group-item {
background-color: $dark-bg2;
color: $dark-font-color;
}
}
</style>

View File

@@ -0,0 +1,341 @@
<template>
<div>
<div v-if="settingsLoaded" class="my-4">
<!-- Change Password -->
<template v-if="!settings.disableAuth">
<p>
{{ $t("Current User") }}: <strong>{{ username }}</strong>
<button v-if="! settings.disableAuth" id="logout-btn" class="btn btn-danger ms-4 me-2 mb-2" @click="$root.logout">{{ $t("Logout") }}</button>
</p>
<h5 class="my-4">{{ $t("Change Password") }}</h5>
<form class="mb-3" @submit.prevent="savePassword">
<div class="mb-3">
<label for="current-password" class="form-label">
{{ $t("Current Password") }}
</label>
<input
id="current-password"
v-model="password.currentPassword"
type="password"
class="form-control"
required
/>
</div>
<div class="mb-3">
<label for="new-password" class="form-label">
{{ $t("New Password") }}
</label>
<input
id="new-password"
v-model="password.newPassword"
type="password"
class="form-control"
required
/>
</div>
<div class="mb-3">
<label for="repeat-new-password" class="form-label">
{{ $t("Repeat New Password") }}
</label>
<input
id="repeat-new-password"
v-model="password.repeatNewPassword"
type="password"
class="form-control"
:class="{ 'is-invalid': invalidPassword }"
required
/>
<div class="invalid-feedback">
{{ $t("passwordNotMatchMsg") }}
</div>
</div>
<div>
<button class="btn btn-primary" type="submit">
{{ $t("Update Password") }}
</button>
</div>
</form>
</template>
<div v-if="! settings.disableAuth" class="mt-5 mb-3">
<h5 class="my-4">
{{ $t("Two Factor Authentication") }}
</h5>
<div class="mb-4">
<button
class="btn btn-primary me-2"
type="button"
@click="$refs.TwoFADialog.show()"
>
{{ $t("2FA Settings") }}
</button>
</div>
</div>
<div class="my-4">
<!-- Advanced -->
<h5 class="my-4">{{ $t("Advanced") }}</h5>
<div class="mb-4">
<button v-if="settings.disableAuth" id="enableAuth-btn" class="btn btn-outline-primary me-2 mb-2" @click="enableAuth">{{ $t("Enable Auth") }}</button>
<button v-if="! settings.disableAuth" id="disableAuth-btn" class="btn btn-primary me-2 mb-2" @click="confirmDisableAuth">{{ $t("Disable Auth") }}</button>
</div>
</div>
</div>
<TwoFADialog ref="TwoFADialog" />
<Confirm ref="confirmDisableAuth" btn-style="btn-danger" :yes-text="$t('I understand, please disable')" :no-text="$t('Leave')" @yes="disableAuth">
<template v-if="$i18n.locale === 'es-ES' ">
<p>Seguro que deseas <strong>deshabilitar la autenticación</strong>?</p>
<p>Es para <strong>quien implementa autenticación de terceros</strong> ante Uptime Kuma como por ejemplo Cloudflare Access.</p>
<p>Por favor usar con cuidado.</p>
</template>
<template v-else-if="$i18n.locale === 'pt-BR' ">
<p>Você tem certeza que deseja <strong>desativar a autenticação</strong>?</p>
<p>Isso é para <strong>alguém que tem autenticação de terceiros</strong> na frente do 'UpTime Kuma' como o Cloudflare Access.</p>
<p>Por favor, utilize isso com cautela.</p>
</template>
<template v-else-if="$i18n.locale === 'zh-HK' ">
<p>你是否確認<strong>取消登入認証</strong></p>
<p>這個功能是設計給已有<strong>第三方認証</strong>的用家例如 Cloudflare Access</p>
<p>請小心使用</p>
</template>
<template v-else-if="$i18n.locale === 'zh-CN' ">
<p>是否确定 <strong>取消登录验证</strong></p>
<p>这是为 <strong>有第三方认证</strong> 的用户提供的功能 Cloudflare Access</p>
<p>请谨慎使用</p>
</template>
<template v-else-if="$i18n.locale === 'zh-TW' ">
<p>你是否要<strong>取消登入驗證</strong></p>
<p>此功能是設計給已有<strong>第三方認證</strong>的使用者例如 Cloudflare Access</p>
<p>請謹慎使用</p>
</template>
<template v-else-if="$i18n.locale === 'de-DE' ">
<p>Bist du sicher das du die <strong>Authentifizierung deaktivieren</strong> möchtest?</p>
<p>Es ist für <strong>jemanden der eine externe Authentifizierung</strong> vor Uptime Kuma geschaltet hat, wie z.B. Cloudflare Access.</p>
<p>Bitte mit Vorsicht nutzen.</p>
</template>
<template v-else-if="$i18n.locale === 'sl-SI' ">
<p>Ali ste prepričani, da želite onemogočiti <strong>avtentikacijo</strong>?</p>
<p>Namenjen je <strong>nekomu, ki ima pred programom Uptime Kuma vklopljeno zunanje preverjanje pristnosti</strong>, na primer Cloudflare Access.</p>
<p>Uporabljajte previdno.</p>
</template>
<template v-else-if="$i18n.locale === 'sr' ">
<p>Да ли сте сигурни да желите да <strong>искључите аутентификацију</strong>?</p>
<p>То је за <strong>оне који имају додату аутентификацију</strong> испред Uptime Kuma као на пример Cloudflare Access.</p>
<p>Молим Вас користите ово са пажњом.</p>
</template>
<template v-else-if="$i18n.locale === 'sr-latn' ">
<p>Da li ste sigurni da želite da <strong>isključite autentifikaciju</strong>?</p>
<p>To je za <strong>one koji imaju dodatu autentifikaciju</strong> ispred Uptime Kuma kao na primer Cloudflare Access.</p>
<p>Molim Vas koristite ovo sa pažnjom.</p>
</template>
<template v-if="$i18n.locale === 'hr-HR' ">
<p>Jeste li sigurni da želite <strong>isključiti autentikaciju</strong>?</p>
<p>To je za <strong>korisnike koji imaju vanjsku autentikaciju stranice</strong> ispred Uptime Kume, poput usluge Cloudflare Access.</p>
<p>Pažljivo koristite ovu opciju.</p>
</template>
<template v-else-if="$i18n.locale === 'tr-TR' ">
<p><strong>Şifreli girişi devre dışı bırakmak istediğinizden</strong>emin misiniz?</p>
<p>Bu, Uptime Kuma'nın önünde Cloudflare Access gibi <strong>üçüncü taraf yetkilendirmesi olan</strong> kişiler içindir.</p>
<p>Lütfen dikkatli kullanın.</p>
</template>
<template v-else-if="$i18n.locale === 'ko-KR' ">
<p>정말로 <strong>인증 기능을 끌까요</strong>?</p>
<p>이 기능은 <strong>Cloudflare Access와 같은 서드파티 인증</strong>을 Uptime Kuma 앞에 둔 사용자를 위한 기능이에요.</p>
<p>신중하게 사용하세요.</p>
</template>
<template v-else-if="$i18n.locale === 'pl' ">
<p>Czy na pewno chcesz <strong>wyłączyć autoryzację</strong>?</p>
<p>Jest przeznaczony dla <strong>kogoś, kto ma autoryzację zewnętrzną</strong> przed Uptime Kuma, taką jak Cloudflare Access.</p>
<p>Proszę używać ostrożnie.</p>
</template>
<template v-else-if="$i18n.locale === 'et-EE' ">
<p>Kas soovid <strong>lülitada autentimise välja</strong>?</p>
<p>Kastuamiseks <strong>välise autentimispakkujaga</strong>, näiteks Cloudflare Access.</p>
<p>Palun kasuta vastutustundlikult.</p>
</template>
<template v-else-if="$i18n.locale === 'it-IT' ">
<p><strong>Disabilitare l'autenticazione?</strong></p>
<p><strong>Questa opzione è per chi un sistema di autenticazione gestito da terze parti</strong> messo davanti ad Uptime Kuma, ad esempio Cloudflare Access.</p>
<p>Utilizzare con attenzione!</p>
</template>
<template v-else-if="$i18n.locale === 'id-ID' ">
<p>Apakah Anda yakin ingin <strong>menonaktifkan autentikasi</strong>?</p>
<p>Ini untuk <strong>mereka yang memiliki autentikasi pihak ketiga</strong> diletakkan di depan Uptime Kuma, misalnya akses Cloudflare.</p>
<p>Gunakan dengan hati-hati.</p>
</template>
<template v-else-if="$i18n.locale === 'ru-RU' ">
<p>Вы уверены, что хотите <strong>отключить авторизацию</strong>?</p>
<p>Это подходит для <strong>тех, у кого стоит другая авторизация</strong> перед открытием Uptime Kuma, например Cloudflare Access.</p>
<p>Пожалуйста, используйте с осторожностью.</p>
</template>
<template v-else-if="$i18n.locale === 'fa' ">
<p>آیا مطمئن هستید که میخواهید <strong>احراز هویت را غیر فعال کنید</strong>?</p>
<p>این ویژگی برای کسانی است که <strong> لایه امنیتی شخص ثالث دیگر بر روی این آدرس فعال کردهاند</strong>، مانند Cloudflare Access.</p>
<p>لطفا از این امکان با دقت استفاده کنید.</p>
</template>
<template v-else-if="$i18n.locale === 'bg-BG' ">
<p>Сигурни ли сте, че желаете да <strong>изключите удостоверяването</strong>?</p>
<p>Използва се в случаите, когато <strong>има настроен алтернативен метод за удостоверяване</strong> преди Uptime Kuma, например Cloudflare Access.</p>
<p>Моля, използвайте с повишено внимание.</p>
</template>
<template v-else-if="$i18n.locale === 'hu' ">
<p>Biztos benne, hogy <strong>kikapcsolja a hitelesítést</strong>?</p>
<p>Akkor érdemes, ha <strong>van 3rd-party hitelesítés</strong> az Uptime Kuma-t megelőzően mint a Cloudflare Access.</p>
<p>Használja megfontoltan!</p>
</template>
<template v-else-if="$i18n.locale === 'nb-NO' ">
<p>Er du sikker at du vil <strong>deaktiver autentisering</strong>?</p>
<p>Dette er for <strong>de som har tredjepartsautorisering</strong> foran Uptime Kuma, for eksempel Cloudflare Access.</p>
<p>Vennligst vær forsiktig.</p>
</template>
<template v-else-if="$i18n.locale === 'cs-CZ' ">
<p>Opravdu chcete <strong>deaktivovat autentifikaci</strong>?</p>
<p>Tato možnost je určena pro případy, kdy <strong>máte autentifikaci zajištěnou třetí stranou</strong> ještě před přístupem do Uptime Kuma, například prostřednictvím Cloudflare Access.</p>
<p>Používejte ji prosím s rozmyslem.</p>
</template>
<template v-else-if="$i18n.locale === 'vi-VN' ">
<p>Bạn muốn <strong>TẮT XÁC THỰC</strong> không?</p>
<p>Điều này rất nguy hiểm<strong>BẤT KỲ AI</strong> cũng thể truy cập cướp quyền điều khiển.</p>
<p>Vui lòng <strong>cẩn thận</strong>.</p>
</template>
<!-- English (en) -->
<template v-else>
<p>Are you sure want to <strong>disable authentication</strong>?</p>
<p>It is designed for scenarios <strong>where you intend to implement third-party authentication</strong> in front of Uptime Kuma such as Cloudflare Access, Authelia or other authentication mechanisms.</p>
<p>Please use this option carefully!</p>
</template>
</Confirm>
</div>
</template>
<script>
import Confirm from "../../components/Confirm.vue";
import TwoFADialog from "../../components/TwoFADialog.vue";
export default {
components: {
Confirm,
TwoFADialog
},
data() {
return {
username: "",
invalidPassword: false,
password: {
currentPassword: "",
newPassword: "",
repeatNewPassword: "",
}
};
},
computed: {
settings() {
return this.$parent.$parent.$parent.settings;
},
saveSettings() {
return this.$parent.$parent.$parent.saveSettings;
},
settingsLoaded() {
return this.$parent.$parent.$parent.settingsLoaded;
}
},
watch: {
"password.repeatNewPassword"() {
this.invalidPassword = false;
},
},
mounted() {
this.loadUsername();
},
methods: {
savePassword() {
if (this.password.newPassword !== this.password.repeatNewPassword) {
this.invalidPassword = true;
} else {
this.$root
.getSocket()
.emit("changePassword", this.password, (res) => {
this.$root.toastRes(res);
if (res.ok) {
this.password.currentPassword = "";
this.password.newPassword = "";
this.password.repeatNewPassword = "";
}
});
}
},
loadUsername() {
const jwtPayload = this.$root.getJWTPayload();
if (jwtPayload) {
this.username = jwtPayload.username;
}
},
disableAuth() {
this.settings.disableAuth = true;
this.saveSettings();
},
enableAuth() {
this.settings.disableAuth = false;
this.saveSettings();
this.$root.storage().removeItem("token");
location.reload();
},
confirmDisableAuth() {
this.$refs.confirmDisableAuth.show();
},
},
};
</script>
<style lang="scss" scoped>
@import "../../assets/vars.scss";
h5:after {
content: "";
display: block;
width: 50%;
padding-top: 8px;
border-bottom: 1px solid $dark-border-color;
}
</style>

View File

@@ -1,56 +1,47 @@
import { createI18n } from "vue-i18n/index";
import daDK from "./languages/da-DK";
import deDE from "./languages/de-DE";
import en from "./languages/en";
import esEs from "./languages/es-ES";
import etEE from "./languages/et-EE";
import fa from "./languages/fa";
import frFR from "./languages/fr-FR";
import hu from "./languages/hu";
import itIT from "./languages/it-IT";
import idID from "./languages/id-ID";
import ja from "./languages/ja";
import koKR from "./languages/ko-KR";
import nlNL from "./languages/nl-NL";
import nbNO from "./languages/nb-NO";
import pl from "./languages/pl";
import ptBR from "./languages/pt-BR";
import bgBG from "./languages/bg-BG";
import ruRU from "./languages/ru-RU";
import sr from "./languages/sr";
import srLatn from "./languages/sr-latn";
import svSE from "./languages/sv-SE";
import trTR from "./languages/tr-TR";
import zhCN from "./languages/zh-CN";
import zhHK from "./languages/zh-HK";
const languageList = {
en,
"zh-HK": zhHK,
"bg-BG": bgBG,
"de-DE": deDE,
"nl-NL": nlNL,
"nb-NO": nbNO,
"es-ES": esEs,
"fa": fa,
"pt-BR": ptBR,
"fr-FR": frFR,
"hu": hu,
"it-IT": itIT,
"id-ID" : idID,
"ja": ja,
"da-DK": daDK,
"sr": sr,
"sr-latn": srLatn,
"sv-SE": svSE,
"tr-TR": trTR,
"ko-KR": koKR,
"ru-RU": ruRU,
"zh-CN": zhCN,
"pl": pl,
"et-EE": etEE,
"cs-CZ": "Čeština",
"zh-HK": "繁體中文 (香港)",
"bg-BG": "Български",
"de-DE": "Deutsch (Deutschland)",
"nl-NL": "Nederlands",
"nb-NO": "Norsk",
"es-ES": "Español",
"fa": "Farsi",
"pt-BR": "Português (Brasileiro)",
"fr-FR": "Français (France)",
"hu": "Magyar",
"hr-HR": "Hrvatski",
"it-IT": "Italiano (Italian)",
"id-ID": "Bahasa Indonesia (Indonesian)",
"ja": "日本語",
"da-DK": "Danish (Danmark)",
"sr": "Српски",
"sl-SI": "Slovenščina",
"sr-latn": "Srpski",
"sv-SE": "Svenska",
"tr-TR": "Türkçe",
"ko-KR": "한국어",
"ru-RU": "Русский",
"zh-CN": "简体中文",
"pl": "Polski",
"et-EE": "eesti",
"vi-VN": "Tiếng Việt",
"zh-TW": "繁體中文 (台灣)"
};
let messages = {
en,
};
for (let lang in languageList) {
messages[lang] = {
languageName: languageList[lang]
};
}
const rtlLangs = ["fa"];
export const currentLocale = () => localStorage.locale
@@ -67,5 +58,5 @@ export const i18n = createI18n({
fallbackLocale: "en",
silentFallbackWarn: true,
silentTranslationWarn: true,
messages: languageList,
messages: messages,
});

View File

@@ -33,6 +33,7 @@ import {
faFile,
faAward,
faLink,
faChevronDown,
} from "@fortawesome/free-solid-svg-icons";
library.add(
@@ -65,6 +66,7 @@ library.add(
faFile,
faAward,
faLink,
faChevronDown,
);
export { FontAwesomeIcon };

View File

@@ -4,11 +4,8 @@
2. Create a language file (e.g. `zh-TW.js`). The filename must be ISO language code: http://www.lingoes.net/en/translator/langcode.htm
3. Run `npm run update-language-files`. You can also use this command to check if there are new strings to translate for your language.
4. Your language file should be filled in. You can translate now.
5. Translate `src/pages/Settings.vue` (search for a `Confirm` component with `rel="confirmDisableAuth"`).
6. Import your language file in `src/i18n.js` and add it to `languageList` constant.
5. Translate `src/components/settings/Security.vue` (search for a `Confirm` component with `rel="confirmDisableAuth"`).
6. Add it into `languageList` constant.
7. Make a [pull request](https://github.com/louislam/uptime-kuma/pulls) when you have done.
One of good examples:
https://github.com/louislam/uptime-kuma/pull/316/files
If you do not have programming skills, let me know in [Issues section](https://github.com/louislam/uptime-kuma/issues). I will assist you. 😏
If you do not have programming skills, let me know in [the issues section](https://github.com/louislam/uptime-kuma/issues). I will assist you. 😏

View File

@@ -2,11 +2,11 @@ export default {
languageName: "Български",
checkEverySecond: "Ще се извършва на всеки {0} секунди",
retryCheckEverySecond: "Ще се извършва на всеки {0} секунди",
retriesDescription: "Максимакен брой опити преди услугата да бъде маркирана като недостъпна и да бъде изпратено известие",
retriesDescription: "Максимакен брой опити преди маркиране на услугата като недостъпна и изпращане на известие",
ignoreTLSError: "Игнорирай TLS/SSL грешки за HTTPS уебсайтове",
upsideDownModeDescription: "Обърни статуса от достъпен на недостъпен. Ако услугата е достъпна се вижда НЕДОСТЪПНА.",
upsideDownModeDescription: "Обръща статуса от достъпен на недостъпен. Ако услугата е достъпна, ще се вижда като НЕДОСТЪПНА.",
maxRedirectDescription: "Максимален брой пренасочвания, които да бъдат следвани. Въведете 0 за да изключите пренасочване.",
acceptedStatusCodesDescription: "Изберете статус кодове, които се считат за успешен отговор.",
acceptedStatusCodesDescription: "Изберете статус кодове, които да се считат за успешен отговор.",
passwordNotMatchMsg: "Повторената парола не съвпада.",
notificationDescription: "Моля, задайте известието към монитор(и), за да функционира.",
keywordDescription: "Търси ключова дума в чист html или JSON отговор - чувствителна е към регистъра",
@@ -48,7 +48,7 @@ export default {
Status: "Статус",
DateTime: "Дата и час",
Message: "Отговор",
"No important events": "Няма важни събития",
"No important events": "Все още няма събития",
Resume: "Възобнови",
Edit: "Редактирай",
Delete: "Изтрий",
@@ -77,7 +77,7 @@ export default {
"Accepted Status Codes": "Допустими статус кодове",
Save: "Запази",
Notifications: "Известявания",
"Not available, please setup.": "Не е налично. Моля, настройте.",
"Not available, please setup.": "Не са налични. Моля, настройте.",
"Setup Notification": "Настройки за известявания",
Light: "Светла",
Dark: "Тъмна",
@@ -89,7 +89,7 @@ export default {
Timezone: "Часова зона",
"Search Engine Visibility": "Видимост за търсачки",
"Allow indexing": "Разреши индексиране",
"Discourage search engines from indexing site": "Обезкуражи индексирането на сайта от търсачките",
"Discourage search engines from indexing site": "Не позволявай на търсачките да индексират този сайт",
"Change Password": "Промени парола",
"Current Password": "Текуща парола",
"New Password": "Нова парола",
@@ -107,8 +107,8 @@ export default {
Password: "Парола",
"Remember me": "Запомни ме",
Login: "Вход",
"No Monitors, please": "Моля, без монитори",
"add one": "добави един",
"No Monitors, please": "Все още няма монитори. Моля, добавете поне ",
"add one": "един.",
"Notification Type": "Тип известяване",
Email: "Имейл",
Test: "Тест",
@@ -130,9 +130,9 @@ export default {
"Clear Data": "Изтрий данни",
Events: "Събития",
Heartbeats: "Проверки",
"Auto Get": "Автоматияно получаване",
backupDescription: "Можете да архивирате всички монитори и всички известия в JSON файл.",
backupDescription2: "PS: Данни за история и събития не са включени.",
"Auto Get": "Авт. попълване",
backupDescription: "Можете да архивирате всички монитори и всички известявания в JSON файл.",
backupDescription2: "PS: Имайте предвид, че данните за история и събития няма да бъдат включени.",
backupDescription3: "Чувствителни данни, като токен кодове за известяване, се съдържат в експортирания файл. Моля, бъдете внимателни с неговото съхранение.",
alertNoFile: "Моля, изберете файл за импортиране.",
alertWrongFileType: "Моля, изберете JSON файл.",
@@ -141,7 +141,7 @@ export default {
Overwrite: "Презапиши",
Options: "Опции",
"Keep both": "Запази двете",
"Verify Token": "Проверка на токен код",
"Verify Token": "Провери токен код",
"Setup 2FA": "Настройка 2FA",
"Enable 2FA": "Включи 2FA",
"Disable 2FA": "Изключи 2FA",
@@ -179,8 +179,8 @@ export default {
"Edit Status Page": "Редактиране Статус страница",
"Go to Dashboard": "Към Таблото",
telegram: "Telegram",
webhook: "Webhook",
smtp: "Email (SMTP)",
webhook: "Уеб кука",
smtp: "Имейл (SMTP)",
discord: "Discord",
teams: "Microsoft Teams",
signal: "Signal",
@@ -197,4 +197,167 @@ export default {
line: "Line Messenger",
mattermost: "Mattermost",
"Status Page": "Статус страница",
"Primary Base URL": "Основен базов URL адрес",
"Push URL": "Генериран Push URL адрес",
needPushEvery: "Необходимо е да извършвате заявка към този URL адрес на всеки {0} секунди",
pushOptionalParams: "Допълнителни, но не задължителни параметри: {0}",
defaultNotificationName: "Моето {notification} известяване ({number})",
here: "тук",
Required: "Задължително поле",
"Bot Token": "Бот токен",
wayToGetTelegramToken: "Можете да получите токен от {0}.",
"Chat ID": "Чат ID",
supportTelegramChatID: "Поддържа Direct Chat / Group / Channel's Chat ID",
wayToGetTelegramChatID: "Можете да получите вашето чат ID, като изпратите съобщение на бота, след което е нужно да посетите този URL адрес за да го видите:",
"YOUR BOT TOKEN HERE": "ВАШИЯТ БОТ ТОКЕН ТУК",
chatIDNotFound: "Чат ID не е намерено. Моля, първо изпратете съобщение до този бот",
"Post URL": "Post URL адрес",
"Content Type": "Тип съдържание",
webhookJsonDesc: "{0} е подходящ за всички съвременни http сървъри, като например express.js",
webhookFormDataDesc: "{multipart} е подходящ за PHP, нужно е да анализирате json чрез {decodeFunction}",
secureOptionNone: "Няма (25) / STARTTLS (587)",
secureOptionTLS: "TLS (465)",
"Ignore TLS Error": "Игнорирай TLS грешките",
"From Email": "От имейл адрес",
emailCustomSubject: "Модифициране на тема",
"To Email": "Получател имейл адрес",
smtpCC: "Явно копие до имейл адрес:",
smtpBCC: "Скрито копие до имейл адрес:",
"Discord Webhook URL": "Discord URL адрес на уеб кука",
wayToGetDiscordURL: "Може да създадете, от меню \"Настройки на сървъра\" -> \"Интеграции\" -> \"Уеб куки\" -> \"Нова уеб кука\"",
"Bot Display Name": "Име на бота, което да се показва",
"Prefix Custom Message": "Модифицирано обръщение",
"Hello @everyone is...": "Здравейте, {'@'}everyone е...",
"Webhook URL": "Уеб кука URL адрес",
wayToGetTeamsURL: "Можете да научите как се създава URL адрес за уеб кука {0}.",
Number: "Номер",
Recipients: "Получатели",
needSignalAPI: "Необходимо е да разполагате със Signal клиент с REST API.",
wayToCheckSignalURL: "Може да посетите този URL адрес, ако се нуждаете от помощ при настройването:",
signalImportant: "ВАЖНО: Не може да смесвате \"Групи\" и \"Номера\" в поле \"Получатели\"!",
"Application Token": "Токен код за приложението",
"Server URL": "URL адрес на сървъра",
Priority: "Приоритет",
"Icon Emoji": "Иконка Емотикон",
"Channel Name": "Канал име",
"Uptime Kuma URL": "Uptime Kuma URL адрес",
aboutWebhooks: "Повече информация относно уеб куки на: {0}",
aboutChannelName: "Въведете името на канала в поле {0} \"Канал име\", ако желаете да заобиколите канала от уеб куката. Например: #other-channel",
aboutKumaURL: "Ако оставите празно полето \"Uptime Kuma URL адрес\", по подразбиране ще се използва GitHub страницата на проекта.",
emojiCheatSheet: "Подсказки за емотикони: {0}",
"User Key": "Потребителски ключ",
Device: "Устройство",
"Message Title": "Заглавие на съобщението",
"Notification Sound": "Звуков сигнал",
"More info on:": "Повече информация на: {0}",
pushoverDesc1: "Приоритет Спешно (2) по подразбиране изчаква 30 секунди между повторните опити и изтича след 1 час.",
pushoverDesc2: "Ако желаете да изпратите известявания до различни устройства, попълнете полето Устройство.",
"SMS Type": "SMS тип",
octopushTypePremium: "Премиум (Бърз - препоръчителен в случай на тревога)",
octopushTypeLowCost: "Евтин (Бавен - понякога бива блокиран от оператора)",
checkPrice: "Тарифни планове на {0}:",
octopushLegacyHint: "Дали използвате съвместима версия на Octopush (2011-2020) или нова версия?",
"Check octopush prices": "Тарифни планове на octopush {0}.",
octopushPhoneNumber: "Телефонен номер (в международен формат, например: +33612345678) ",
octopushSMSSender: "SMS подател Име: 3-11 знака - букви, цифри и интервал (a-zA-Z0-9)",
"LunaSea Device ID": "LunaSea ID на устройство",
"Apprise URL": "Apprise URL адрес",
"Example:": "Пример: {0}",
"Read more:": "Научете повече: {0}",
"Status:": "Статус: {0}",
"Read more": "Научете повече",
appriseInstalled: "Apprise е инсталиран.",
appriseNotInstalled: "Apprise не е инсталиран. {0}",
"Access Token": "Токен код за достъп",
"Channel access token": "Канал токен код",
"Line Developers Console": "Line - Конзола за разработчици",
lineDevConsoleTo: "Line - Конзола за разработчици - {0}",
"Basic Settings": "Основни настройки",
"User ID": "Потребител ID",
"Messaging API": "API за известяване",
wayToGetLineChannelToken: "Необходимо е първо да посетите {0}, за да създадете (Messaging API) за доставчик и канал, след което може да вземете токен кода за канал и потребителско ID от споменатите по-горе елементи на менюто.",
"Icon URL": "URL адрес за иконка",
aboutIconURL: "Може да предоставите линк към картинка в поле \"URL Адрес за иконка\" за да отмените картинката на профила по подразбиране. Няма да се използва, ако вече сте настроили емотикон.",
aboutMattermostChannelName: "Може да замените канала по подразбиране, към който публикува уеб куката, като въведете името на канала в полето \"Канал име\". Tрябва да бъде активирано в настройките за уеб кука на Mattermost. Например: #other-channel",
matrix: "Matrix",
promosmsTypeEco: "SMS ECO - евтин, но бавен. Често е претоварен. Само за получатели от Полша.",
promosmsTypeFlash: "SMS FLASH - Съобщението автоматично се показва на устройството на получателя. Само за получатели от Полша.",
promosmsTypeFull: "SMS FULL - Високо ниво на SMS услуга. Може да използвате Вашето име като подател (Необходимо е първо да регистрирате името). Надежден метод за съобщения тип тревога.",
promosmsTypeSpeed: "SMS SPEED - Най-висок приоритет в системата. Много бърза и надеждна, но същвременно скъпа услуга. (Около два пъти по-висока цена в сравнение с SMS FULL).",
promosmsPhoneNumber: "Телефонен номер (за получатели от Полша, може да пропуснете въвеждането на код за населено място)",
promosmsSMSSender: "SMS Подател име: Предварително регистрирано име или някое от имената по подразбиране: InfoSMS, SMS Info, MaxSMS, INFO, SMS",
"Feishu WebHookUrl": "Feishu URL адрес за уеб кука",
matrixHomeserverURL: "Сървър URL адрес (започва с http(s):// и порт по желание)",
"Internal Room Id": "ID на вътрешна стая",
matrixDesc1: "Може да намерите \"ID на вътрешна стая\" в разширените настройки на стаята във вашия Matrix клиент. Примерен изглед: !QMdRCpUIfLwsfjxye6:home.server.",
matrixDesc2: "Силно препоръчваме да създадете НОВ потребител и да НЕ използвате токен кодът на вашия личен Matrix потребирел, т.к. той позволява пълен достъп до вашия акаунт и всички стаи към които сте се присъединили. Вместо това създайте нов потребител и го поканете само в стаята, където желаете да получавате известяванията. Токен код за достъп ще получите изпълнявайки {0}",
Method: "Метод",
Body: "Съобщение",
Headers: "Хедъри",
PushUrl: "Push URL адрес",
HeadersInvalidFormat: "Заявените хедъри не са валидни JSON: ",
BodyInvalidFormat: "Заявеното съобщение не е валиден JSON: ",
"Monitor History": "История на мониторите",
clearDataOlderThan: "Ще се съхранява {0} дни.",
records: "записа",
"One record": "Един запис",
steamApiKeyDescription: "За да мониторирате Steam Gameserver се нуждаете от Steam Web-API ключ. Може да регистрирате Вашия API ключ тук: ",
clicksendsms: "ClickSend SMS",
apiCredentials: "API удостоверяване",
PasswordsDoNotMatch: "Паролите не съвпадат.",
"Current User": "Текущ потребител",
recent: "Скорошни",
shrinkDatabaseDescription: "Инициира \"VACUUM\" за \"SQLite\" база данни. Ако Вашата база данни е създадена след версия 1.10.0, \"AUTO_VACUUM\" функцията е активна и това действие не нужно.",
Done: "Готово",
Info: "Информация",
Security: "Сигурност",
"Steam API Key": "Steam API ключ",
"Shrink Database": "Редуциране база данни",
"Pick a RR-Type...": "Изберете вида на ресурсния запис за мониторитане...",
"Pick Accepted Status Codes...": "Изберете статус кодове, които да се считат за успешен отговор...",
Default: "По подразбиране",
"HTTP Options": "HTTP Опции",
"Create Incident": "Създаване на инцидент",
Title: "Заглавие",
Content: "Съдържание",
Style: "Стил",
info: "информация",
warning: "предупреждение",
danger: "опасност",
primary: "основен",
light: "светъл",
dark: "тъмен",
Post: "Публикувай",
"Please input title and content": "Моля, въведете заглавие и съдържание",
Created: "Създаден",
"Last Updated": "Последно обновен",
Unpin: "Откачи",
"Switch to Light Theme": "Превключи към светла тема",
"Switch to Dark Theme": "Превключи към тъмна тема",
"Show Tags": "Покажи етикети",
"Hide Tags": "Скрий етикети",
Description: "Описание",
"No monitors available.": "Няма налични монитори.",
"Add one": "Добави един",
"No Monitors": "Няма монитори",
"Untitled Group": "Група без заглавие",
Services: "Услуги",
Discard: "Премахни",
Cancel: "Отмени",
"Powered by": "Създадено чрез",
serwersms: "SerwerSMS.pl",
serwersmsAPIUser: "API Потребителско име (вкл. webapi_ prefix)",
serwersmsAPIPassword: "API Парола",
serwersmsPhoneNumber: "Телефон номер",
serwersmsSenderName: "SMS Подател име (регистриран през клиентския портал)",
stackfield: "Stackfield",
smtpDkimSettings: "DKIM Настройки",
smtpDkimDesc: "Моля, вижте Nodemailer DKIM {0} за инструкции.",
documentation: "документация",
smtpDkimDomain: "Домейн",
smtpDkimKeySelector: "Селектор на ключ",
smtpDkimPrivateKey: "Частен ключ",
smtpDkimHashAlgo: "Хеш алгоритъм (по желание)",
smtpDkimheaderFieldNames: "Хедър ключове за подписване (по желание)",
smtpDkimskipFields: "Хедър ключове, които да не се подписват (по желание)",
};

364
src/languages/cs-CZ.js Normal file
View File

@@ -0,0 +1,364 @@
export default {
languageName: "Czech",
checkEverySecond: "Kontrolovat každých {0} sekund",
retryCheckEverySecond: "Opakovat každých {0} sekund",
retriesDescription: "Maximální počet pokusů před označením služby jako nedostupné a odesláním oznámení",
ignoreTLSError: "Ignorovat TLS/SSL chyby na HTTPS stránkách",
upsideDownModeDescription: "Pomocí této možnosti změníte způsob vyhodnocování stavu. Pokud je služba dosažitelná, je NEDOSTUPNÁ.",
maxRedirectDescription: "Maximální počet přesměrování, která se mají následovat. Nastavením hodnoty 0 zakážete přesměrování.",
acceptedStatusCodesDescription: "Vyberte stavové kódy, které jsou považovány za úspěšnou odpověď.",
passwordNotMatchMsg: "Hesla se neshodují",
notificationDescription: "Pro zajištění funkčnosti oznámení je nutné je přiřadit dohledu.",
keywordDescription: "Vyhledat klíčové slovo v prosté odpovědi HTML nebo JSON. Při hledání se rozlišuje velikost písmen.",
pauseDashboardHome: "Pozastavit",
deleteMonitorMsg: "Opravdu chcete odstranit tento dohled?",
deleteNotificationMsg: "Opravdu chcete odstranit toto oznámení pro všechny dohledy?",
resoverserverDescription: "Cloudflare je výchozí server. Resolver server můžete kdykoli změnit.",
rrtypeDescription: "Vyberte typ záznamu o prostředku, který chcete monitorovat",
pauseMonitorMsg: "Opravdu chcete dohled pozastavit?",
enableDefaultNotificationDescription: "Toto oznámení bude standardně aktivní pro nové dohledy. V případě potřeby můžete oznámení stále zakázat na úrovni jednotlivých dohledů.",
clearEventsMsg: "Opravdu chcete odstranit všechny události pro tento dohled?",
clearHeartbeatsMsg: "Opravdu chcete odstranit všechny heartbeaty pro tento dohled?",
confirmClearStatisticsMsg: "Opravdu chcete smazat VŠECHNY statistiky?",
importHandleDescription: "Možnost 'Přeskočit existující' vyberte v případě, že chcete přeskočit všechny dohledy nebo oznámení se stejným názvem. Vybráním možnosti 'Přepsat' dojde k odstranění všech existujících dohledů a oznámení.",
confirmImportMsg: "Opravdu chcete importovat zálohu? Prosím ověřte, zda jste vybrali správnou možnost importu.",
twoFAVerifyLabel: "Prosím, zadejte svůj token pro ověření 2FA:",
tokenValidSettingsMsg: "Token je platný! Nyní můžete uložit nastavení 2FA.",
confirmEnableTwoFAMsg: "Opravdu chcete zapnout 2FA?",
confirmDisableTwoFAMsg: "Opravdu chcete deaktivovat 2FA?",
Settings: "Nastavení",
Dashboard: "Nástěnka",
"New Update": "Nová aktualizace",
Language: "Jazyk",
Appearance: "Vzhled",
Theme: "Motiv",
General: "Obecné",
"Primary Base URL": "Primární URL adresa",
Version: "Verze",
"Check Update On GitHub": "Zkontrolovat aktualizace na GitHubu",
List: "Seznam",
Add: "Přidat",
"Add New Monitor": "Přidat nový dohled",
"Quick Stats": "Rychlé statistiky",
Up: "Běží",
Down: "Nedostupný",
Pending: "Čekám",
Unknown: "Neznámý",
Pause: "Pozastavit",
Name: "Název",
Status: "Stav",
DateTime: "DateTime",
Message: "Zpráva",
"No important events": "Žádné důležité události",
Resume: "Pokračovat",
Edit: "Změnit",
Delete: "Vymazat",
Current: "Aktuální",
Uptime: "Doba provozu",
"Cert Exp.": "Platnost certifikátu",
days: "dny/í",
day: "den",
"-day": "-dní",
hour: "hodina",
"-hour": "-hodin",
Response: "Odpověď",
Ping: "Ping",
"Monitor Type": "Typ dohledu",
Keyword: "Klíčové slovo",
"Friendly Name": "Obecný název",
URL: "URL",
Hostname: "Adresa serveru",
Port: "Port",
"Heartbeat Interval": "Heartbeat interval",
Retries: "Počet pokusů",
"Heartbeat Retry Interval": "Interval opakování prezenčního signálu",
Advanced: "Rozšířené",
"Upside Down Mode": "Inverzní režim",
"Max. Redirects": "Max. Přesměrování",
"Accepted Status Codes": "Akceptované stavové kódy",
"Push URL": "Push URL",
needPushEvery: "Tuto URL adresu byste měli volat každých {0} sekund.",
pushOptionalParams: "Volitelné parametry: {0}",
Save: "Uložit",
Notifications: "Oznámení",
"Not available, please setup.": "Není k dispozici, prosím nastavte.",
"Setup Notification": "Nastavení oznámení",
Light: "Světlý",
Dark: "Tmavý",
Auto: "Automaticky",
"Theme - Heartbeat Bar": "Motiv Heartbeat panel",
Normal: "Normální",
Bottom: "Dole",
None: "Žádné",
Timezone: "Časové pásmo",
"Search Engine Visibility": "Viditelnost pro vyhledávače",
"Allow indexing": "Povolit indexování",
"Discourage search engines from indexing site": "Zabránit vyhledávačům v indexování stránky",
"Change Password": "Změnit heslo",
"Current Password": "Aktuální heslo",
"New Password": "Nové heslo",
"Repeat New Password": "Znovu zadat nové heslo",
"Update Password": "Aktualizovat heslo",
"Disable Auth": "Deaktivovat ověřování",
"Enable Auth": "Povolit ověřování",
Logout: "Odhlášení",
Leave: "Odejít",
"I understand, please disable": "Rozumím, chci ji deaktivovat",
Confirm: "Potvrzení",
Yes: "Ano",
No: "Ne",
Username: "Uživatelské jméno",
Password: "Heslo",
"Remember me": "Zapamatovat si mě",
Login: "Přihlášení",
"No Monitors, please": "Žádné dohledy, prosím",
"add one": "přidat jeden",
"Notification Type": "Typ oznámení",
Email: "E-mail",
Test: "Test",
"Certificate Info": "Informace o certifikátu",
"Resolver Server": "Resolver Server",
"Resource Record Type": "Typ záznamu o prostředku",
"Last Result": "Poslední výsledek",
"Create your admin account": "Vytvořit účet administrátora",
"Repeat Password": "Znovu zadat heslo",
"Import Backup": "Importovat zálohu",
"Export Backup": "Exportovat zálohu",
Export: "Exportovat",
Import: "Importovat",
respTime: "Odezva Čas (ms)",
notAvailableShort: "N/A",
"Default enabled": "Standardně povoleno",
"Apply on all existing monitors": "Použít pro všechny existující dohledy",
Create: "Vytvořit",
"Clear Data": "Vymazat data",
Events: "Události",
Heartbeats: "Heartbeaty",
"Auto Get": "Získat automaticky",
backupDescription: "Všechny dohledy a oznámení můžete zálohovat do souboru ve formátu JSON.",
backupDescription2: "Poznámka: Nezahrnuje historii a data událostí.",
backupDescription3: "Součástí exportovaného souboru jsou citlivá data jako tokeny oznámení; export si prosím bezpečně uložte.",
alertNoFile: "Vyberte soubor, který chcete importovat.",
alertWrongFileType: "Vyberte soubor ve formátu JSON.",
"Clear all statistics": "Vymazat všechny statistiky",
"Skip existing": "Přeskočit existující",
Overwrite: "Přepsat",
Options: "Možnosti",
"Keep both": "Ponechat obojí",
"Verify Token": "Ověřit token",
"Setup 2FA": "Nastavení 2FA",
"Enable 2FA": "Povolit 2FA",
"Disable 2FA": "Deaktivovat 2FA",
"2FA Settings": "Nastavení 2FA",
"Two Factor Authentication": "Dvoufaktorová autentifikace",
Active: "Zapnuto",
Inactive: "Neaktivní",
Token: "Token",
"Show URI": "Zobrazit URI",
Tags: "Štítky",
"Add New below or Select...": "Níže přidejte nový nebo vyberte existující…",
"Tag with this name already exist.": "Štítek s tímto názvem již existuje.",
"Tag with this value already exist.": "Štítek touto hodnotou již existuje.",
color: "barva",
"value (optional)": "hodnota (volitelné)",
Gray: "Šedá",
Red: "Červená",
Orange: "Oranžová",
Green: "Zelená",
Blue: "Modrá",
Indigo: "Indigo",
Purple: "Purpurová",
Pink: "Růžová",
"Search...": "Hledat…",
"Avg. Ping": "Průměr Ping",
"Avg. Response": "Průměr Odpověď",
"Entry Page": "Vstupní stránka",
statusPageNothing: "Nic tady není, přidejte prosím skupinu nebo dohled.",
"No Services": "Žádné služby",
"All Systems Operational": "Všechny systémy běží",
"Partially Degraded Service": "Částečně zhoršená služba",
"Degraded Service": "Zhoršená služba",
"Add Group": "Přidat skupinu",
"Add a monitor": "Přidání dohledu",
"Edit Status Page": "Upravit stavovou stránku",
"Go to Dashboard": "Přejít na nástěnku",
"Status Page": "Stavová stránka",
defaultNotificationName: "Moje {notification} upozornění ({číslo})",
here: "sem",
Required: "Vyžadováno",
telegram: "Telegram",
"Bot Token": "Token robota",
wayToGetTelegramToken: "Token můžete získat od {0}.",
"Chat ID": "ID chatu",
supportTelegramChatID: "Podpora přímého chatu / skupiny / ID chatu kanálu",
wayToGetTelegramChatID: "ID chatu můžete získat tak, že robotovi zašlete zprávu a přejdete na tuto adresu URL, kde zobrazíte chat_id:",
"YOUR BOT TOKEN HERE": "YOUR BOT TOKEN HERE",
chatIDNotFound: "ID chatu nebylo nalezeno; nejprve tomuto robotovi zašlete zprávu",
webhook: "Webhook",
"Post URL": "URL adresa příspěvku",
"Content Type": "Typ obsahu",
webhookJsonDesc: "{0} je vhodný pro všechny moderní servery HTTP, jako je Express.js",
webhookFormDataDesc: "{multipart} je vhodné pro PHP. JSON bude nutné analyzovat prostřednictvím {decodeFunction}",
smtp: "E-mail (SMTP)",
secureOptionNone: "Žádné / STARTTLS (25, 587)",
secureOptionTLS: "TLS (465)",
"Ignore TLS Error": "Ignorovat chybu TLS",
"From Email": "Odesílatel",
emailCustomSubject: "Vlastní předmět",
"To Email": "Příjemce",
smtpCC: "Kopie",
smtpBCC: "Skrytá kopie",
discord: "Discord",
"Discord Webhook URL": "Discord Webhook URL",
wayToGetDiscordURL: "Získáte tak, že přejdete do Nastavení serveru - > Integrace - > Vytvořit Webhook",
"Bot Display Name": "Zobrazované jméno robota",
"Prefix Custom Message": "Předpona vlastní zprávy",
"Hello @everyone is...": "Dobrý den, {'@'}všichni jsou…",
teams: "Microsoft Teams",
"Webhook URL": "URL adresa webhooku",
wayToGetTeamsURL: "Informace o tom, jak vytvořit URL adresu webhooku naleznete {0}.",
signal: "Signal",
Number: "Číslo",
Recipients: "Příjemci",
needSignalAPI: "Musíte mít Signal klienta s REST API.",
wayToCheckSignalURL: "Pro zobrazení instrukcí, jak službu nastavit, přejděte na následující adresu:",
signalImportant: "Důležité V seznamu příjemců není možné současně použít skupiny a čísla!",
gotify: "Gotify",
"Application Token": "Token aplikace",
"Server URL": "URL adresa serveru",
Priority: "Priorita",
slack: "Slack",
"Icon Emoji": "Ikona smajlíka",
"Channel Name": "Název kanálu",
"Uptime Kuma URL": "Uptime Kuma URL",
aboutWebhooks: "Více informací o Webhoocích naleznete na adrese: {0}",
aboutChannelName: "Pro vynechání Webhook kanálu zadejte jeho název do pole Název kanálu {0}. Příklad: #jiny-kanal",
aboutKumaURL: "Pokud ponecháte pole URL adresa Uptime Kuma prázdné, použije se domovská stránka GitHub projektu.",
emojiCheatSheet: "Tahák smajlíků: {0}",
"rocket.chat": "Rocket.Chat",
pushover: "Pushover",
pushy: "Pushy",
octopush: "Octopush",
promosms: "PromoSMS",
clicksendsms: "ClickSend SMS",
lunasea: "LunaSea",
apprise: "Apprise (podpora více než 50 oznamovacích služeb)",
GoogleChat: "Google Chat (pouze Google Workspace)",
pushbullet: "Pushbullet",
line: "Line Messenger",
mattermost: "Mattermost",
"User Key": "Klíč uživatele",
Device: "Zařízení",
"Message Title": "Nadpis zprávy",
"Notification Sound": "Zvuk oznámení",
"More info on:": "Více informací naleznete na adrese: {0}",
pushoverDesc1: "Výchozí časový limit pro emergency prioritu (2) je 30 sekund mezi opakovanými pokusy a vyprší po 1 hodině.",
pushoverDesc2: "Pokud chcete odesílat oznámení do různých zařízení, vyplňte pole Zařízení.",
"SMS Type": "Typ SMS",
octopushTypePremium: "Premium (rychlé doporučeno pro upozornění)",
octopushTypeLowCost: "Nízké náklady (pomalé někdy blokované operátorem)",
checkPrice: "Ceny {0} zjistíte na adrese:",
apiCredentials: "API přihlašovací údaje",
octopushLegacyHint: "Používáte starší verzi Octopush (2011-2020) nebo novou verzi?",
"Check octopush prices": "Ceny octopush naleznete na adrese {0}.",
octopushPhoneNumber: "Telefonní číslo (v mezinárodním formátu, např: +42012345678) ",
octopushSMSSender: "Odesílatel SMS: 3-11 alfanumerických znaků a mezera (a-zA-Z0-9)",
"LunaSea Device ID": "ID zařízení LunaSea",
"Apprise URL": "Apprise URL",
"Example:": "Příklad: {0}",
"Read more:": "Více informací: {0}",
"Status:": "Stav: {0}",
"Read more": "Více informací",
appriseInstalled: "Apprise je nainstalován.",
appriseNotInstalled: "Apprise není nainstalován. {0}",
"Access Token": "Přístupový token",
"Channel access token": "Přístupový token ke kanálu",
"Line Developers Console": "Konzole Line Developers",
lineDevConsoleTo: "Konzole Line Developers - {0}",
"Basic Settings": "Obecné nastavení",
"User ID": "ID uživatele",
"Messaging API": "Messaging API",
wayToGetLineChannelToken: "Nejprve otevřete {0}, vytvořte poskytovatele a kanál (Messaging API). Poté můžete získat přístupový token ke kanálu a ID uživatele, v sekci uvedené výše.",
"Icon URL": "URL adresa ikony",
aboutIconURL: "Pro přepsání výchozího profilového obrázku můžete do pole \"URL adresa ikony\" zadat odkaz na obrázek. Nebude použito, pokud je nastavena ikona smajlíka.",
aboutMattermostChannelName: "Výchozí kanál, do kterého jsou zasílány Webhook příspěvky, můžete přepsat zadáním názvu kanálu do pole \"Název kanálu\". Tato možnost musí být povolena v nastavení Mattermost Webhooku. Příklad: #jiny-kanal",
matrix: "Matrix",
promosmsTypeEco: "SMS ECO levné, ale pomalé a často přetížené. Omezeno pouze na polské příjemce.",
promosmsTypeFlash: "SMS FLASH zpráva se automaticky zobrazí na zařízení příjemce. Omezeno pouze na polské příjemce.",
promosmsTypeFull: "SMS FULL prémiová úroveň SMS. Můžete definovat odesílatele (vyžadována registrace jména). Spolehlivý pro výstrahy.",
promosmsTypeSpeed: "SMS SPEED nejvyšší priorita v systému. Velmi rychlé a spolehlivé, ale nákladné (přibližně dvojnásobek ceny SMS FULL).",
promosmsPhoneNumber: "Telefonní číslo (polští příjemci mohou vynechat telefonní předvolbu)",
promosmsSMSSender: "Odesílatel SMS: Předem zaregistrovaný název nebo jeden z výchozích: InfoSMS, SMS Info, MaxSMS, INFO, SMS",
"Feishu WebHookUrl": "Feishu WebHookURL",
matrixHomeserverURL: "URL adresa domácího serveru (s http(s):// a volitelně portem)",
"Internal Room Id": "ID interní místnosti",
matrixDesc1: "ID interní místnosti naleznete v Matrix klientovi v rozšířeném nastavení místnosti. Mělo by být ve tvaru !QMdRCpUIfLwsfjxye6:home.server.",
matrixDesc2: "Důrazně doporučujeme vytvořit nového uživatele a nepoužívat váš vlastní přístupový token uživatele Matrix. Pomocí něj je možné získat přístup k vašemu účtu a všem místnostem, ke kterým jste se připojili. Místo toho vytvořte nového uživatele a pozvěte jej pouze do místnosti, do které chcete oznámení dostávat. Přístupový token můžete získat spuštěním {0}",
Method: "Metoda",
Body: "Tělo",
Headers: "Hlavičky",
PushUrl: "Push URL",
HeadersInvalidFormat: "The request headers are not valid JSON: ",
BodyInvalidFormat: "The request body is not valid JSON: ",
"Monitor History": "Historie dohledu",
clearDataOlderThan: "Historie dohledu bude uchovávána po dobu {0} dní.",
PasswordsDoNotMatch: "Hesla se neshodují.",
records: "záznamů",
"One record": "Jeden záznam",
steamApiKeyDescription: "For monitoring a Steam Game Server you need a Steam Web-API key. You can register your API key here: ",
"Current User": "Aktuálně přihlášený uživatel",
recent: "Poslední",
Done: "Hotovo",
Info: "Informace",
Security: "Bezpečnost",
"Steam API Key": "API klíč služby Steam",
"Shrink Database": "Zmenšit databázi",
"Pick a RR-Type...": "Vyberte typ záznamu o prostředku…",
"Pick Accepted Status Codes...": "Vyberte stavové kódy, které chcete akceptovat…",
Default: "Standardní",
"HTTP Options": "Možnosti protokolu HTTP",
"Create Incident": "Vytvořit incident",
Title: "Předmět",
Content: "Obsah",
Style: "Styl",
info: "informace",
warning: "upozornění",
danger: "riziko",
primary: "primární",
light: "světlý",
dark: "tmavý",
Post: "Publikovat",
"Please input title and content": "Zadejte prosím název a obsah",
Created: "Vytvořen",
"Last Updated": "Poslední aktualizace",
Unpin: "Odepnout",
"Switch to Light Theme": "Přepnout na světlý motiv",
"Switch to Dark Theme": "Přepnutí na tmavý motiv",
"Show Tags": "Zobrazit štítky",
"Hide Tags": "Skrýt štítky",
Description: "Popis",
"No monitors available.": "Není dostupný žádný dohled.",
"Add one": "Přidat jeden",
"No Monitors": "Žádný dohled",
"Untitled Group": "Skupina bez názvu",
Services: "Služby",
Discard: "Zahodit",
Cancel: "Zrušit",
"Powered by": "Poskytuje",
shrinkDatabaseDescription: "Pomocí této možnosti provedete příkaz VACUUM nad SQLite databází. Pokud byla databáze vytvořena po vydání verze 1.10.0, AUTO_VACUUM je již povolena a tato akce není vyžadována.",
serwersms: "SerwerSMS.pl",
serwersmsAPIUser: "API uživatelské jméno (včetně předpony webapi_)",
serwersmsAPIPassword: "API heslo",
serwersmsPhoneNumber: "Telefonní číslo",
serwersmsSenderName: "Odesílatel SMS (registrováno prostřednictvím zákaznického portálu)",
"stackfield": "Stackfield",
smtpDkimSettings: "Nastavení DKIM",
smtpDkimDesc: "Informace o použití naleznete v {0} Nodemailer DKIM.",
documentation: "dokumentaci",
smtpDkimDomain: "Název domény",
smtpDkimKeySelector: "Selector klíče",
smtpDkimPrivateKey: "Privátní klíč",
smtpDkimHashAlgo: "Hashovací algoritmus (volitelné)",
smtpDkimheaderFieldNames: "Podepisovat tyto hlavičky (volitelné)",
smtpDkimskipFields: "Nepodepisovat tyto hlavičky (volitelné)",
};

View File

@@ -1,7 +1,7 @@
export default {
languageName: "Danish (Danmark)",
Settings: "Indstillinger",
Dashboard: "Dashboard",
Dashboard: "Betjeningspanel",
"New Update": "Opdatering tilgængelig",
Language: "Sprog",
Appearance: "Udseende",
@@ -110,11 +110,11 @@ export default {
notAvailableShort: "N/A",
Create: "Opret",
clearEventsMsg: "Er du sikker på vil slette alle events for denne Overvåger?",
clearHeartbeatsMsg: "Er du sikker på vil slette alle heartbeats for denne Overvåger?",
clearHeartbeatsMsg: "Er du sikker på vil slette alle hjerteslag for denne Overvåger?",
confirmClearStatisticsMsg: "Vil du helt sikkert slette ALLE statistikker?",
"Clear Data": "Ryd Data",
Events: "Events",
Heartbeats: "Heartbeats",
Heartbeats: "Hjerteslag",
"Auto Get": "Auto-hent",
enableDefaultNotificationDescription: "For hver ny overvåger aktiveres denne underretning som standard. Du kan stadig deaktivere underretningen separat for hver skærm.",
"Default enabled": "Standard aktiveret",
@@ -145,14 +145,14 @@ export default {
retryCheckEverySecond: "Prøv igen hvert {0} sekund.",
importHandleDescription: "Vælg 'Spring over eksisterende', hvis du vil springe over hver overvåger eller underretning med samme navn. 'Overskriv' sletter alle eksisterende overvågere og underretninger.",
confirmImportMsg: "Er du sikker på at importere sikkerhedskopien? Sørg for, at du har valgt den rigtige importindstilling.",
"Heartbeat Retry Interval": "Heartbeat Gentagelsesinterval",
"Heartbeat Retry Interval": "Hjerteslag Gentagelsesinterval",
"Import Backup": "Importer Backup",
"Export Backup": "Eksporter Backup",
"Skip existing": "Spring over eksisterende",
Overwrite: "Overskriv",
Options: "Valgmuligheder",
"Keep both": "Behold begge",
Tags: "Tags",
Tags: "Etiketter",
"Add New below or Select...": "Tilføj Nyt nedenfor eller Vælg ...",
"Tag with this name already exist.": "Et Tag med dette navn findes allerede.",
"Tag with this value already exist.": "Et Tag med denne værdi findes allerede.",
@@ -178,8 +178,8 @@ export default {
"Add Group": "Tilføj Gruppe",
"Add a monitor": "Tilføj en Overvåger",
"Edit Status Page": "Rediger Statusside",
"Go to Dashboard": "Gå til Dashboard",
"Status Page": "Status Page",
"Go to Dashboard": "Gå til Betjeningspanel",
"Status Page": "Statusside",
telegram: "Telegram",
webhook: "Webhook",
smtp: "Email (SMTP)",
@@ -194,8 +194,162 @@ export default {
octopush: "Octopush",
promosms: "PromoSMS",
lunasea: "LunaSea",
apprise: "Apprise (Support 50+ Notification services)",
apprise: "Apprise (Understøtter 50+ Notifikationstjenester)",
pushbullet: "Pushbullet",
line: "Line Messenger",
mattermost: "Mattermost",
"Primary Base URL": "Primær Basis-URL",
"Push URL": "Push URL",
needPushEvery: "Du bør kalde denne webadresse hvert {0} sekund.",
pushOptionalParams: "Valgfrie parametre: {0}",
defaultNotificationName: "Min {notification} Advarsel ({number})",
here: "her",
Required: "Påkrævet",
"Bot Token": "Bot Token",
wayToGetTelegramToken: "Du kan få et token fra {0}.",
"Chat ID": "Chat ID",
supportTelegramChatID: "Support Direct Chat / Group / Channel's Chat ID",
wayToGetTelegramChatID: "Du kan få dit chat-ID ved at sende en besked til bot'en og gå til denne URL for at se chat_id'et:",
"YOUR BOT TOKEN HERE": "DIT BOT TOKEN HER",
chatIDNotFound: "Chat-ID blev ikke fundet; send venligst en besked til denne bot først ",
"Post URL": "Post URL",
"Content Type": "Indholdstype",
webhookJsonDesc: "{0} er god til alle moderne HTTP-servere som f.eks Express.js",
webhookFormDataDesc: "{multipart} er god til PHP. JSON'en skal parses med {decodeFunction}",
secureOptionNone: "Ingen / STARTTLS (25, 587)",
secureOptionTLS: "TLS (465)",
"Ignore TLS Error": "Ignorer TLS-fejl",
"From Email": "Afsender Email",
emailCustomSubject: "Brugerdefineret Emne",
"To Email": "Modtager Email",
smtpCC: "CC",
smtpBCC: "BCC",
"Discord Webhook URL": "Discord Webhook URL",
wayToGetDiscordURL: "Du kan få dette ved at gå til Serverindstillinger -> Integrationer -> Opret webhook ",
"Bot Display Name": "Bot Visningsnavn",
"Prefix Custom Message": "Præfiks Brugerdefineret Besked",
"Hello @everyone is...": "Hello {'@'}everyone is...",
"Webhook URL": "Webhook URL",
wayToGetTeamsURL: "Du kan lære, hvordan du laver en webhook URL {0}.",
Number: "Nummer",
Recipients: "Modtagere",
needSignalAPI: "Du skal have en Signal-klient med REST API.",
wayToCheckSignalURL: "Du kan tjekke denne URL for at se, hvordan du konfigurerer en:",
signalImportant: "VIGTIGT: Du kan ikke blande grupper og numre i modtagere!",
"Application Token": "Program Token",
"Server URL": "Server URL",
Priority: "Prioritet",
"Icon Emoji": "Icon Emoji",
"Channel Name": "Kanalnavn",
"Uptime Kuma URL": "Uptime Kuma URL",
aboutWebhooks: "Mere info om Webhooks på: {0}",
aboutChannelName: "Indtast kanalnavnet i {0} Kanalnavn feltet, hvis du vil omgå Webhook-kanalen. Eks: #anden-kanal",
aboutKumaURL: "Hvis du efterlader Uptime Kuma URL-feltet tomt, vil det som standard gå til projektets GitHub-siden.",
emojiCheatSheet: "Emoji cheat sheet: {0}",
clicksendsms: "ClickSend SMS",
"User Key": "Bruger-Nøgle",
Device: "Enhed",
"Message Title": "Besked Titel",
"Notification Sound": "Notifikationslyd",
"More info on:": "Mere info på: {0}",
pushoverDesc1: "Nødprioritet (2) har som standard 30 sekunders timeout mellem genforsøg og udløber efter 1 time.",
pushoverDesc2: "Hvis du vil sende meddelelser til forskellige enheder, skal du udfylde feltet Enhed.",
"SMS Type": "SMS Type",
octopushTypePremium: "Premium (Hurtig - anbefales til advarsel)",
octopushTypeLowCost: "Lavpris (Langsom - nogle gange blokeret af operatøren)",
checkPrice: "Tjek {0} priser:",
apiCredentials: "API legitimationsoplysninger",
octopushLegacyHint: "Bruger du den ældre version af Octopush (2011-2020) eller den nye version?",
"Check octopush prices": "Tjek octopush priser {0}.",
octopushPhoneNumber: "Telefonnummer (intl format, f.eks : +4512345678) ",
octopushSMSSender: "SMS Afsender Navn : 3-11 alfanumeriske tegn og mellemrum (a-zA-Z0-9)",
"LunaSea Device ID": "LunaSea Enhed-ID",
"Apprise URL": "Apprise URL",
"Example:": "Eksempel: {0}",
"Read more:": "Læs mere: {0}",
"Status:": "Status: {0}",
"Read more": "Læs mere",
appriseInstalled: "Apprise er installeret.",
appriseNotInstalled: "Apprise er ikke installeret. {0}",
"Access Token": "Access Token",
"Channel access token": "kanaladgangstoken",
"Line Developers Console": "Line Udviklerkonsol",
lineDevConsoleTo: "Line Udviklerkonsol - {0}",
"Basic Settings": "Basisindstillinger",
"User ID": "Bruger-ID",
"Messaging API": "Messaging API",
wayToGetLineChannelToken: "Tilgå først {0}, opret en udbyder og kanal (Messaging API), så kan du få kanaladgangstoken'et og bruger-ID'et fra de ovennævnte menupunkter.",
"Icon URL": "Ikon URL",
aboutIconURL: "Du kan angive et link til et billede i \"Ikon URL\" for at tilsidesætte standardprofilbilledet. Vil ikke blive brugt, hvis Ikon Emoji er angivet.",
aboutMattermostChannelName: "Du kan tilsidesætte standardkanalen, som Webhoo'en sender til ved at indtaste kanalnavnet i feltet \"Kanalnavn\". Dette skal aktiveres i Mattermost Webhook-indstillingerne. Eks: #anden-kanal",
matrix: "Matrix",
promosmsTypeEco: "SMS ECO - billig, men langsom og ofte overbelastet. Begrænset kun til polske modtagere.",
promosmsTypeFlash: "SMS FLASH - Beskeden vises automatisk på modtagerenheden. Begrænset kun til polske modtagere.",
promosmsTypeFull: "SMS FULL - Premium-niveau af SMS, Du kan bruge dit \"Sender Name\" (Du skal først registrere navn). Pålidelig til advarsler.",
promosmsTypeSpeed: "SMS SPEED - Højeste prioritet i systemet. Meget hurtig og pålidelig, men dyr (ca. to gange af SMS FULL pris).",
promosmsPhoneNumber: "Telefonnummer (polske numre behøver ikke angive områdenumre)",
promosmsSMSSender: "SMS Sender Name : Forudregistreret navn eller en af standarderne: InfoSMS, SMS Info, MaxSMS, INFO, SMS",
"Feishu WebHookUrl": "Feishu WebHookURL",
matrixHomeserverURL: "Hjemmeserver-URL (med http(s):// og eventuel port)",
"Internal Room Id": "Intern Rum-ID",
matrixDesc1: "Du kan finde det interne rum-ID ved at se i det avancerede afsnit af rumindstillingerne i din Matrix-klient. Det skulle ligne !QMdRCpUIfLwsfjxye6:home.server.",
matrixDesc2: "Det anbefales stærkt, at du opretter en ny bruger og ikke bruger din egen Matrix-brugers adgangstoken, da det giver fuld adgang til din konto og alle de rum, du har tilsluttet dig. I stedet skal du oprette en ny bruger og kun invitere den til det rum, du vil modtage meddelelsen i. Du kan få adgangstokenet ved at køre {0}",
Method: "Metode",
Body: "Body",
Headers: "Headers",
PushUrl: "Push URL",
HeadersInvalidFormat: "\"request headers\"-erne er ikke gyldige JSON: ",
BodyInvalidFormat: "\"request body\"-en er ikke gyldige JSON: ",
"Monitor History": "Overvåger Historik",
clearDataOlderThan: "Gem overvågningshistorikdata i {0} dage.",
PasswordsDoNotMatch: "Adgangskoderne stemmer ikke overens.",
records: "forekomster",
"One record": "Én forekomst",
steamApiKeyDescription: "For at overvåge en Steam Game Server skal du bruge en Steam Web-API nøgle. Du kan registrere din API-nøgle her: ",
"Current User": "Nuværende Bruger",
recent: "Seneste",
Done: "Færdig",
Info: "Info",
Security: "Sikkerhed",
"Steam API Key": "Steam API-nøgle",
"Shrink Database": "Krymp Database",
"Pick a RR-Type...": "Vælg en RR-Type...",
"Pick Accepted Status Codes...": "Vælg Accepterede Statuskoder...",
Default: "Standard",
"HTTP Options": "HTTP Valgmuligheder",
"Create Incident": "Opret Annoncering",
Title: "Titel",
Content: "Indhold",
Style: "Type",
info: "info",
warning: "advarsel",
danger: "fare",
primary: "primær",
light: "lys",
dark: "mørk",
Post: "Udgiv",
"Please input title and content": "Indtast venligst titel og indhold",
Created: "Oprettet",
"Last Updated": "Sidst Opdateret",
Unpin: "Frigør",
"Switch to Light Theme": "Skift til Lys Tema",
"Switch to Dark Theme": "Skift til Mørkt Tema",
"Show Tags": "Vis Etiketter",
"Hide Tags": "Skjul Etiketter",
Description: "Beskrivelse",
"No monitors available.": "No monitors available.",
"Add one": "Tilføj en",
"No Monitors": "Ingen Overvågere",
"Untitled Group": "Unavngivet Gruppe",
Services: "Tjenester",
Discard: "Kassér",
Cancel: "Annullér",
"Powered by": "Drevet af",
shrinkDatabaseDescription: "Udfør database VACUUM for SQLite. Hvis din database er oprettet efter 1.10.0, er AUTO_VACUUM allerede aktiveret, og denne handling er ikke nødvendig.",
serwersms: "SerwerSMS.pl",
serwersmsAPIUser: "API Brugernavn (inkl. webapi_ prefix)",
serwersmsAPIPassword: "API Adgangskode",
serwersmsPhoneNumber: "Telefonnummer",
serwersmsSenderName: "SMS Afsender Navn (registreret via kundeportal)",
stackfield: "Stackfield",
};

View File

@@ -194,7 +194,160 @@ export default {
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: "Meine {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 sowie Express.js",
webhookFormDataDesc: "{multipart} ist gut für PHP. Die JSON muss mit {decodeFunction} geparst werden",
secureOptionNone: "Keine / STARTTLS (25, 587)",
secureOptionTLS: "TLS (465)",
"Ignore TLS Error": "TLS-Fehler ignorieren",
"From Email": "Von Email",
emailCustomSubject: "Benutzerdefinierter Betreff",
"To Email": "Zu Email",
smtpCC: "CC",
smtpBCC: "BCC",
"Discord Webhook URL": "Discord Webhook URL",
wayToGetDiscordURL: "Du kannst diesen erhalten, indem du zu den Servereinstellungen gehst -> Integrationen -> Neuer Webhook",
"Bot Display Name": "Bot-Anzeigename",
"Prefix Custom Message": "Benutzerdefinierter Nachrichten Präfix",
"Hello @everyone is...": "Hallo {'@'}everyone ist...",
"Webhook URL": "Webhook URL",
wayToGetTeamsURL: "Hier erfährst du, wie eine Webhook-URL erstellt werden kann {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 auf {0} Feld Kanalname, wenn du den Webhook-Kanal umgehen möchtest. Ex: #other-channel",
aboutKumaURL: "Wenn das Feld für die Uptime Kuma URL leer gelassen wird, wird es standardmäßig die GitHub Projekt Seite verwenden.",
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": "Überprüfe die Oktopush Preise {0}.",
octopushPhoneNumber: "Telefonnummer (Internationales Format, z.B : +49612345678) ",
octopushSMSSender: "Name des SMS-Absenders : 3-11 alphanumerische Zeichen und Leerzeichen (a-zA-Z0-9)",
"LunaSea Device ID": "LunaSea Geräte ID",
"Apprise URL": "Apprise URL",
"Example:": "Beispiel: {0}",
"Read more:": "Weiterlesen: {0}",
"Status:": "Status: {0}",
"Read more": "Weiterlesen",
appriseInstalled: "Apprise ist installiert.",
appriseNotInstalled: "Apprise ist nicht installiert. {0}",
"Access Token": "Access Token",
"Channel access token": "Channel access token",
"Line Developers Console": "Line Developers Console",
lineDevConsoleTo: "Line Developers Console - {0}",
"Basic Settings": "Basic Settings",
"User ID": "User ID",
"Messaging API": "Messaging API",
wayToGetLineChannelToken: "Rufe zuerst {0} auf, erstelle dann einen Provider und Channel (Messaging API). Als nächstes kannst du den Channel access token und die User ID aus den oben genannten Menüpunkten abrufen.",
"Icon URL": "Icon URL",
aboutIconURL: "Du kannst einen Link zu einem Bild in 'Icon URL' übergeben um das Standardprofilbild zu überschreiben. Wird nicht verwendet, wenn ein Icon Emoji gesetzt ist.",
aboutMattermostChannelName: "Du kannst den Standardkanal, auf dem der Webhook postet ü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. Nur auf polnische Empfänger beschränkt.",
promosmsTypeFlash: "SMS FLASH - Die Nachricht wird automatisch auf dem Empfängergerät angezeigt. Nur 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: "Phone number (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 es aussehen wie z.B. !QMdRCpUIfLwsfjxye6:home.server.",
matrixDesc2: "Es wird dringend empfohlen, dass ein neuen Benutzer erstellt wird und nicht den Zugriffstoken deines eigenen Matrix-Benutzers verwendest. Anderfalls ermöglicht es vollen Zugriff auf dein Konto und alle Räume, denen du beigetreten bist. Erstelle stattdessen einen neuen Benutzer und lade ihn nur in den Raum ein, in dem du die Benachrichtigung erhalten möchtest. Du kannst den Zugriffstoken erhalten, indem du folgendes ausführst {0}",
Method: "Method",
Body: "Body",
Headers: "Headers",
PushUrl: "Push URL",
HeadersInvalidFormat: "Die Header ist kein gültiges JSON: ",
BodyInvalidFormat: "Der Body ist kein gültiges JSON: ",
"Monitor History": "Monitor Verlauf",
clearDataOlderThan: "Bewahre die Monitor-Verlaufsdaten für {0} Tage auf.",
PasswordsDoNotMatch: "Passwörter stimmen nicht überein.",
records: "Einträge",
"One record": "Ein Eintrag",
steamApiKeyDescription: "Um einen Steam Game Server zu überwachen, wird ein Steam Web-API-Schlüssel benötigt. Dieser kann hier registriert werden: ",
"Current User": "Aktueller Benutzer",
recent: "Letzte",
Done: "Fertig",
Info: "Info",
Security: "Sicherheit",
"Steam API Key": "Steam API Key",
"Shrink Database": "Datenbank verkleinern",
"Pick a RR-Type...": "Wähle ein RR-Typ aus...",
"Pick Accepted Status Codes...": "Wähle akzeptierte Statuscodes aus...",
Default: "Standard",
"HTTP Options": "HTTP Optionen",
"Create Incident": "Vorfall erstellen",
Title: "Titel",
Content: "Inhalt",
Style: "Stil",
info: "info",
warning: "warnung",
danger: "gefahr",
primary: "primär",
light: "hell",
dark: "dunkel",
Post: "Eintrag",
"Please input title and content": "Bitte Titel und Inhalt eingeben",
Created: "Erstellt",
"Last Updated": "Zuletzt aktualisiert",
Unpin: "Loslösen",
"Switch to Light Theme": "Zu hellem Thema wechseln",
"Switch to Dark Theme": "Zum dunklen Thema wechseln",
"Show Tags": "Tags anzeigen",
"Hide Tags": "Tags ausblenden",
Description: "Beschreibung",
"No monitors available.": "Keine Monitore verfügbar.",
"Add one": "Füge eins hinzu",
"No Monitors": "Keine Monitore",
"Untitled Group": "Gruppe ohne Titel",
Services: "Dienste",
Discard: "Verwerfen",
Cancel: "Abbrechen",
"Powered by": "Powered by",
shrinkDatabaseDescription: "Löse VACUUM für die SQLite Datenbank aus. Wenn die Datenbank nach 1.10.0 erstellt wurde, ist AUTO_VACUUM bereits aktiviert und diese Aktion ist nicht erforderlich.",
serwersms: "SerwerSMS.pl",
serwersmsAPIUser: "API Benutzername (inkl. webapi_ prefix)",
serwersmsAPIPassword: "API Passwort",
serwersmsPhoneNumber: "Telefonnummer",
serwersmsSenderName: "Name des SMS-Absenders (über Kundenportal registriert)",
"stackfield": "Stackfield",
};

View File

@@ -1,28 +1,28 @@
export default {
languageName: "English",
checkEverySecond: "Check every {0} seconds.",
retryCheckEverySecond: "Retry every {0} seconds.",
checkEverySecond: "Check every {0} seconds",
retryCheckEverySecond: "Retry every {0} seconds",
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.",
acceptedStatusCodesDescription: "Select status codes which are considered as a successful response.",
passwordNotMatchMsg: "The repeat password does not match.",
notificationDescription: "Please assign a notification to monitor(s) to get it to work.",
keywordDescription: "Search keyword in plain html or JSON response and it is case-sensitive",
notificationDescription: "Notifications must be assigned to a monitor to function.",
keywordDescription: "Search keyword in plain HTML or JSON response. The search is case-sensitive.",
pauseDashboardHome: "Pause",
deleteMonitorMsg: "Are you sure want to delete this monitor?",
deleteNotificationMsg: "Are you sure want to delete this notification for all monitors?",
resoverserverDescription: "Cloudflare is the default server, you can change the resolver server anytime.",
rrtypeDescription: "Select the RR-Type you want to monitor",
resoverserverDescription: "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: "For every new monitor this notification will be enabled by default. You can still disable the notification separately for each monitor.",
enableDefaultNotificationDescription: "This notification will be enabled by default for new monitors. You can still disable the notification separately for each monitor.",
clearEventsMsg: "Are you sure want to delete all events for this monitor?",
clearHeartbeatsMsg: "Are you sure want to delete all heartbeats for this monitor?",
confirmClearStatisticsMsg: "Are you sure you want to delete ALL statistics?",
importHandleDescription: "Choose 'Skip existing' if you want to skip every monitor or notification with the same name. 'Overwrite' will delete every existing monitor and notification.",
confirmImportMsg: "Are you sure to import the backup? Please make sure you've selected the right import option.",
twoFAVerifyLabel: "Please type in your token to verify that 2FA is working",
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?",
@@ -77,7 +77,7 @@ export default {
"Max. Redirects": "Max. Redirects",
"Accepted Status Codes": "Accepted Status Codes",
"Push URL": "Push URL",
needPushEvery: "You should call this url every {0} seconds.",
needPushEvery: "You should call this URL every {0} seconds.",
pushOptionalParams: "Optional parameters: {0}",
Save: "Save",
Notifications: "Notifications",
@@ -135,9 +135,9 @@ export default {
Events: "Events",
Heartbeats: "Heartbeats",
"Auto Get": "Auto Get",
backupDescription: "You can backup all monitors and all notifications into a JSON file.",
backupDescription2: "PS: History and event data is not included.",
backupDescription3: "Sensitive data such as notification tokens is included in the export file, please keep it carefully.",
backupDescription: "You can backup all monitors and notifications into a JSON file.",
backupDescription2: "Note: history and event data is not included.",
backupDescription3: "Sensitive data such as notification tokens are included in the export file; please store export securely.",
alertNoFile: "Please select a file to import.",
alertWrongFileType: "Please select a JSON file.",
"Clear all statistics": "Clear all Statistics",
@@ -157,8 +157,8 @@ export default {
"Show URI": "Show URI",
Tags: "Tags",
"Add New below or Select...": "Add New below or Select...",
"Tag with this name already exist.": "Tag with this name already exist.",
"Tag with this value already exist.": "Tag with this value already exist.",
"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",
@@ -183,24 +183,23 @@ export default {
"Edit Status Page": "Edit Status Page",
"Go to Dashboard": "Go to Dashboard",
"Status Page": "Status Page",
// Start notification form
defaultNotificationName: "My {notification} Alert ({number})",
here: "here",
"Required": "Required",
"telegram": "Telegram",
Required: "Required",
telegram: "Telegram",
"Bot Token": "Bot Token",
wayToGetTelegramToken: "You can get a token from {0}.",
"Chat ID": "Chat ID",
supportTelegramChatID: "Support Direct Chat / Group / Channel's Chat ID",
wayToGetTelegramChatID: "You can get your chat id by sending message to the bot and go to this url to view the chat_id:",
wayToGetTelegramChatID: "You can get your chat ID by sending a message to the bot and going to this URL to view the chat_id:",
"YOUR BOT TOKEN HERE": "YOUR BOT TOKEN HERE",
chatIDNotFound: "Chat ID is not found, please send a message to this bot first",
"webhook": "Webhook",
chatIDNotFound: "Chat ID is not found; please send a message to this bot first",
webhook: "Webhook",
"Post URL": "Post URL",
"Content Type": "Content Type",
webhookJsonDesc: "{0} is good for any modern http servers such as express.js",
webhookFormDataDesc: "{multipart} is good for PHP, you just need to parse the json by {decodeFunction}",
"smtp": "Email (SMTP)",
webhookJsonDesc: "{0} is good for any modern HTTP servers such as Express.js",
webhookFormDataDesc: "{multipart} is good for PHP. The JSON will need to be parsed with {decodeFunction}",
smtp: "Email (SMTP)",
secureOptionNone: "None / STARTTLS (25, 587)",
secureOptionTLS: "TLS (465)",
"Ignore TLS Error": "Ignore TLS Error",
@@ -209,45 +208,47 @@ export default {
"To Email": "To Email",
smtpCC: "CC",
smtpBCC: "BCC",
"discord": "Discord",
discord: "Discord",
"Discord Webhook URL": "Discord Webhook URL",
wayToGetDiscordURL: "You can get this by going to Server Settings -> Integrations -> Create Webhook",
"Bot Display Name": "Bot Display Name",
"Prefix Custom Message": "Prefix Custom Message",
"Hello @everyone is...": "Hello {'@'}everyone is...",
"teams": "Microsoft Teams",
teams: "Microsoft Teams",
"Webhook URL": "Webhook URL",
wayToGetTeamsURL: "You can learn how to create a webhook url {0}.",
"signal": "Signal",
"Number": "Number",
"Recipients": "Recipients",
wayToGetTeamsURL: "You can learn how to create a webhook URL {0}.",
signal: "Signal",
Number: "Number",
Recipients: "Recipients",
needSignalAPI: "You need to have a signal client with REST API.",
wayToCheckSignalURL: "You can check this url to view how to setup one:",
wayToCheckSignalURL: "You can check this URL to view how to set one up:",
signalImportant: "IMPORTANT: You cannot mix groups and numbers in recipients!",
"gotify": "Gotify",
gotify: "Gotify",
"Application Token": "Application Token",
"Server URL": "Server URL",
"Priority": "Priority",
"slack": "Slack",
Priority: "Priority",
slack: "Slack",
"Icon Emoji": "Icon Emoji",
"Channel Name": "Channel Name",
"Uptime Kuma URL": "Uptime Kuma URL",
aboutWebhooks: "More info about webhooks on: {0}",
aboutChannelName: "Enter the channel name on {0} Channel Name field if you want to bypass the webhook channel. Ex: #other-channel",
aboutKumaURL: "If you leave the Uptime Kuma URL field blank, it will default to the Project Github page.",
aboutWebhooks: "More info about Webhooks on: {0}",
aboutChannelName: "Enter the channel name on {0} Channel Name field if you want to bypass the Webhook channel. Ex: #other-channel",
aboutKumaURL: "If you leave the Uptime Kuma URL field blank, it will default to the Project GitHub page.",
emojiCheatSheet: "Emoji cheat sheet: {0}",
"rocket.chat": "Rocket.chat",
"rocket.chat": "Rocket.Chat",
pushover: "Pushover",
pushy: "Pushy",
octopush: "Octopush",
promosms: "PromoSMS",
clicksendsms: "ClickSend SMS",
lunasea: "LunaSea",
apprise: "Apprise (Support 50+ Notification services)",
GoogleChat: "Google Chat (Google Workspace only)",
pushbullet: "Pushbullet",
line: "Line Messenger",
mattermost: "Mattermost",
"User Key": "User Key",
"Device": "Device",
Device: "Device",
"Message Title": "Message Title",
"Notification Sound": "Notification Sound",
"More info on:": "More info on: {0}",
@@ -255,8 +256,9 @@ export default {
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)",
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) ",
@@ -276,33 +278,87 @@ export default {
"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.",
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 webhook posts to by entering the channel name into \"Channel Name\" field. This needs to be enabled in Mattermost webhook settings. Ex: #other-channel",
"matrix": "Matrix",
aboutMattermostChannelName: "You can override the default channel that the Webhook posts to by entering the channel name into \"Channel Name\" field. This needs to be enabled in the Mattermost Webhook settings. Ex: #other-channel",
matrix: "Matrix",
promosmsTypeEco: "SMS ECO - cheap but slow and often overloaded. Limited only to Polish recipients.",
promosmsTypeFlash: "SMS FLASH - Message will automatically show on recipient device. Limited only to Polish recipients.",
promosmsTypeFull: "SMS FULL - Premium tier of SMS, You can use Your Sender Name (You need to register name first). Reliable for alerts.",
promosmsTypeFull: "SMS FULL - Premium tier of SMS, You can use your Sender Name (You need to register name first). Reliable for alerts.",
promosmsTypeSpeed: "SMS SPEED - Highest priority in system. Very quick and reliable but costly (about twice of SMS FULL price).",
promosmsPhoneNumber: "Phone number (for Polish recipient You can skip area codes)",
promosmsSMSSender: "SMS Sender Name : Pre-registred name or one of defaults: InfoSMS, SMS Info, MaxSMS, INFO, SMS",
"Feishu WebHookUrl": "Feishu WebHookUrl",
"Feishu WebHookUrl": "Feishu WebHookURL",
matrixHomeserverURL: "Homeserver URL (with http(s):// and optionally port)",
"Internal Room Id": "Internal Room Id",
"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}",
// End notification form
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:",
"Monitor History": "Monitor History",
clearDataOlderThan: "Keep monitor history data for {0} days.",
PasswordsDoNotMatch: "Passwords do not match.",
records: "records",
"One record": "One record",
"Showing {from} to {to} of {count} records": "Showing {from} to {to} of {count} records",
steamApiKeyDescription: "For monitoring a Steam Gameserver you need a steam Web-API key. You can register your api key here: ",
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",
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",
primary: "primary",
light: "light",
dark: "dark",
Post: "Post",
"Please input title and content": "Please input title and content",
Created: "Created",
"Last Updated": "Last Updated",
Unpin: "Unpin",
"Switch to Light Theme": "Switch to Light Theme",
"Switch to Dark Theme": "Switch to Dark Theme",
"Show Tags": "Show Tags",
"Hide Tags": "Hide Tags",
Description: "Description",
"No monitors available.": "No monitors available.",
"Add one": "Add one",
"No Monitors": "No Monitors",
"Untitled Group": "Untitled Group",
Services: "Services",
Discard: "Discard",
Cancel: "Cancel",
"Powered by": "Powered by",
shrinkDatabaseDescription: "Trigger database VACUUM for SQLite. If your database is created after 1.10.0, AUTO_VACUUM is already enabled and this action is not needed.",
serwersms: "SerwerSMS.pl",
serwersmsAPIUser: "API Username (incl. webapi_ prefix)",
serwersmsAPIPassword: "API Password",
serwersmsPhoneNumber: "Phone number",
serwersmsSenderName: "SMS Sender Name (registered via customer portal)",
"stackfield": "Stackfield",
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)",
};

View File

@@ -198,9 +198,9 @@ export default {
pushbullet: "Pushbullet",
line: "Line Messenger",
mattermost: "Mattermost",
"Monitor History": "Historial de monitor:",
"Monitor History": "Historial de monitor",
clearDataOlderThan: "Mantener los datos del historial del monitor durante {0} días.",
records: "registros",
"One record": "Un registro",
"Showing {from} to {to} of {count} records": "Mostrando desde {from} a {to} de {count} registros",
steamApiKeyDescription: "Para monitorear un servidor de juegos de Steam, necesita una clave Steam Web-API. Puede registrar su clave API aquí: ",
};

View File

@@ -182,9 +182,6 @@ export default {
"Uptime Kuma": "آپتایم کوما",
records: "مورد",
"One record": "یک مورد",
"Showing {from} to {to} of {count} records": "نمایش از {from} تا {to} از {count} مورد",
First: "اولین",
Last: "آخرین",
Info: "اطلاعات",
"Powered by": "نیرو گرفته از",
telegram: "Telegram",

View File

@@ -1,5 +1,5 @@
export default {
languageName: "Français (France)",
languageName: "Français",
checkEverySecond: "Vérifier toutes les {0} secondes",
retryCheckEverySecond: "Réessayer toutes les {0} secondes.",
retriesDescription: "Nombre d'essais avant que le service soit déclaré hors-ligne.",
@@ -13,17 +13,17 @@ export default {
pauseDashboardHome: "En pause",
deleteMonitorMsg: "Êtes-vous sûr de vouloir supprimer cette sonde ?",
deleteNotificationMsg: "Êtes-vous sûr de vouloir supprimer ce type de notifications ? Une fois désactivée, les services qui l'utilisent ne pourront plus envoyer de notifications.",
resoverserverDescription: "Le DNS de cloudflare est utilisé par défaut, mais vous pouvez le changer si vous le souhaitez.",
rrtypeDescription: "Veuillez séléctionner un type d'enregistrement DNS",
resoverserverDescription: "Le DNS de Cloudflare est utilisé par défaut, mais vous pouvez le changer si vous le souhaitez.",
rrtypeDescription: "Veuillez sélectionner un type d'enregistrement DNS",
pauseMonitorMsg: "Êtes-vous sûr de vouloir mettre en pause cette sonde ?",
enableDefaultNotificationDescription: "Pour chaque nouvelle sonde, cette notification sera activée par défaut. Vous pouvez toujours désactiver la notification séparément pour chaque sonde.",
clearEventsMsg: "Êtes-vous sûr de vouloir supprimer tous les événements pour cette sonde ?",
clearHeartbeatsMsg: "Êtes-vous sûr de vouloir supprimer tous les vérifications pour cette sonde ?",
confirmClearStatisticsMsg: "Êtes-vous sûr de vouloir supprimer tous les statistiques ?",
clearHeartbeatsMsg: "Êtes-vous sûr de vouloir supprimer toutes les vérifications pour cette sonde ?",
confirmClearStatisticsMsg: "Êtes-vous sûr de vouloir supprimer toutes les statistiques ?",
importHandleDescription: "Choisissez 'Ignorer l'existant' si vous voulez ignorer chaque sonde ou notification portant le même nom. L'option 'Écraser' supprime toutes les sondes et notifications existantes.",
confirmImportMsg: "Êtes-vous sûr de vouloir importer la sauvegarde ? Veuillez vous assurer que vous avez sélectionné la bonne option d'importation.",
twoFAVerifyLabel: "Veuillez saisir votre jeton pour vérifier que le système 2FA fonctionne.",
tokenValidSettingsMsg: "Le jeton est valide ; Vous pouvez maintenant sauvegarder les paramètres 2FA.",
tokenValidSettingsMsg: "Le jeton est valide. Vous pouvez maintenant sauvegarder les paramètres 2FA.",
confirmEnableTwoFAMsg: "Êtes-vous sûr de vouloir activer le 2FA ?",
confirmDisableTwoFAMsg: "Êtes-vous sûr de vouloir désactiver le 2FA ?",
Settings: "Paramètres",
@@ -68,9 +68,9 @@ export default {
URL: "URL",
Hostname: "Nom d'hôte / adresse IP",
Port: "Port",
"Heartbeat Interval": "Intervale de vérification",
"Heartbeat Interval": "Intervalle de vérification",
Retries: "Essais",
"Heartbeat Retry Interval": "Réessayer l'intervale de vérification",
"Heartbeat Retry Interval": "Réessayer l'intervalle de vérification",
Advanced: "Avancé",
"Upside Down Mode": "Mode inversé",
"Max. Redirects": "Nombre maximum de redirections",
@@ -107,8 +107,8 @@ export default {
Password: "Mot de passe",
"Remember me": "Se souvenir de moi",
Login: "Se connecter",
"No Monitors, please": "Pas de sondes, veuillez ",
"add one": "en ajouter une.",
"No Monitors, please": "Pas de sondes, veuillez",
"add one": "en ajouter une",
"Notification Type": "Type de notification",
Email: "Email",
Test: "Tester",
@@ -129,10 +129,10 @@ export default {
Create: "Créer",
"Clear Data": "Effacer les données",
Events: "Evénements",
Heartbeats: "Vérfications",
Heartbeats: "Vérifications",
"Auto Get": "Récuperer automatiquement",
backupDescription: "Vous pouvez sauvegarder toutes les sondes et toutes les notifications dans un fichier JSON.",
backupDescription2: "PS: Les données relatives à l'historique et aux événements ne sont pas incluses.",
backupDescription2: "PS : Les données relatives à l'historique et aux événements ne sont pas incluses.",
backupDescription3: "Les données sensibles telles que les jetons de notification sont incluses dans le fichier d'exportation, veuillez les conserver soigneusement.",
alertNoFile: "Veuillez sélectionner un fichier à importer.",
alertWrongFileType: "Veuillez sélectionner un fichier JSON à importer.",
@@ -179,11 +179,10 @@ export default {
"Edit Status Page": "Modifier la page de statut",
"Go to Dashboard": "Accéder au tableau de bord",
"Status Page": "Status Page",
// Start notification form
defaultNotificationName: "Ma notification {notification} numéro ({number})",
here: "ici",
"Required": "Requis",
"telegram": "Telegram",
Required: "Requis",
telegram: "Telegram",
"Bot Token": "Bot Token",
wayToGetTelegramToken: "Vous pouvez obtenir un token depuis {0}.",
"Chat ID": "Chat ID",
@@ -191,46 +190,46 @@ export default {
wayToGetTelegramChatID: "Vous pouvez obtenir l'ID du chat en envoyant un message avec le bot puis en récupérant l'URL pour voir l'ID du salon :",
"YOUR BOT TOKEN HERE": "VOTRE TOKEN BOT ICI",
chatIDNotFound: "ID du salon introuvable, envoyez un message via le bot avant",
"webhook": "Webhook",
webhook: "Webhook",
"Post URL": "Post URL",
"Content Type": "Content Type",
webhookJsonDesc: "{0} est bien/bon pour tous les serveurs HTTP modernes comme express.js",
webhookFormDataDesc: "{multipart} est bien/bon pour du PHP, vous avez juste besoin de mettre le json via/depuis {decodeFunction}",
"smtp": "Email (SMTP)",
secureOptionNone: "Aucun / STARTTLS (25, 587)",
smtp: "Email (SMTP)",
secureOptionNone: "Aucun/STARTTLS (25, 587)",
secureOptionTLS: "TLS (465)",
"Ignore TLS Error": "Ignorer les erreurs TLS",
"From Email": "Depuis l'Email",
"To Email": "Vers l'Email",
smtpCC: "CC",
smtpBCC: "BCC",
"discord": "Discord",
discord: "Discord",
"Discord Webhook URL": "Discord Webhook URL",
wayToGetDiscordURL: "Vous pouvez l'obtenir en allant dans 'Paramètres du Serveur' -> 'Intégrations' -> 'Créer un Webhook'",
"Bot Display Name": "Nom du bot (affiché)",
"Prefix Custom Message": "Prefix Custom Message",
"Prefix Custom Message": "Prefixe du message personnalisé",
"Hello @everyone is...": "Bonjour {'@'}everyone il...",
"teams": "Microsoft Teams",
teams: "Microsoft Teams",
"Webhook URL": "Webhook URL",
wayToGetTeamsURL: "Vous pouvez apprendre comment créer un Webhook {0}.",
"signal": "Signal",
"Number": "Numéro",
"Recipients": "Destinataires",
signal: "Signal",
Number: "Numéro",
Recipients: "Destinataires",
needSignalAPI: "Vous avez besoin d'un client Signal avec l'API REST.",
wayToCheckSignalURL: "Vous pouvez regarder l'URL sur comment le mettre en place :",
signalImportant: "IMPORTANT: Vous ne pouvez pas mixer les groupes et les numéros en destinataires !",
"gotify": "Gotify",
signalImportant: "IMPORTANT : Vous ne pouvez pas mixer les groupes et les numéros en destinataires !",
gotify: "Gotify",
"Application Token": "Application Token",
"Server URL": "Server URL",
"Priority": "Priorité",
"slack": "Slack",
Priority: "Priorité",
slack: "Slack",
"Icon Emoji": "Icon Emoji",
"Channel Name": "Nom du salon",
"Uptime Kuma URL": "Uptime Kuma URL",
aboutWebhooks: "Plus d'informations sur les Webhooks ici: {0}",
aboutWebhooks: "Plus d'informations sur les Webhooks ici : {0}",
aboutChannelName: "Mettez le nom du salon dans {0} dans 'Channel Name' si vous voulez bypass le salon Webhook. Ex : #autre-salon",
aboutKumaURL: "Si vous laissez l'URL d'Uptime Kuma vierge, elle redirigera vers la page du projet GitHub.",
emojiCheatSheet: "Emoji cheat sheet : {0}",
emojiCheatSheet: "Aide emoji : {0}",
"rocket.chat": "Rocket.chat",
pushover: "Pushover",
pushy: "Pushy",
@@ -242,17 +241,17 @@ export default {
line: "Line Messenger",
mattermost: "Mattermost",
"User Key": "Clé d'utilisateur",
"Device": "Appareil",
Device: "Appareil",
"Message Title": "Titre du message",
"Notification Sound": "Son de notification",
"More info on:": "Plus d'informations sur: {0}",
"More info on:": "Plus d'informations sur : {0}",
pushoverDesc1: "Priorité d'urgence (2) a par défaut 30 secondes de délai dépassé entre les tentatives et expierera après 1 heure.",
pushoverDesc2: "Si vous voulez envoyer des notifications sur différents Appareils, remplissez le champ 'Device'.",
"SMS Type": "SMS Type",
octopushTypePremium: "Premium (Rapide - recommandé pour les alertes)",
octopushTypeLowCost: "A bas prix (Lent, bloqué de temps en temps par l'opérateur)",
octopushTypeLowCost: "À bas prix (Lent, bloqué de temps en temps par l'opérateur)",
"Check octopush prices": "Vérifier les prix d'octopush {0}.",
octopushPhoneNumber: "Numéro de téléphone (format intérn., ex : +33612345678) ",
octopushPhoneNumber: "Numéro de téléphone (format int., ex : +33612345678) ",
octopushSMSSender: "Nom de l'envoyer : 3-11 caractères alphanumériques avec espace (a-zA-Z0-9)",
"LunaSea Device ID": "LunaSea Device ID",
"Apprise URL": "Apprise URL",
@@ -260,12 +259,12 @@ export default {
"Read more:": "En savoir plus : {0}",
"Status:": "Status : {0}",
"Read more": "En savoir plus",
appriseInstalled: "Apprise est intallé.",
appriseNotInstalled: "Apprise n'est pas intallé. {0}",
appriseInstalled: "Apprise est installé.",
appriseNotInstalled: "Apprise n'est pas installé. {0}",
"Access Token": "Access Token",
"Channel access token": "Channel access token",
"Line Developers Console": "Line Developers Console",
lineDevConsoleTo: "Line Developers Console - {0}",
"Channel access token": "Token d'accès au canal",
"Line Developers Console": "Ligne console de développeurs",
lineDevConsoleTo: "Ligne console de développeurs - {0}",
"Basic Settings": "Paramètres de base",
"User ID": "Identifiant utilisateur",
"Messaging API": "Messaging API",
@@ -273,12 +272,36 @@ export default {
"Icon URL": "Icon URL",
aboutIconURL: "Vous pouvez mettre un lien vers l'image dans \"Icon URL\" pour remplacer l'image de profil par défaut. Ne sera pas utilisé si Icon Emoji est défini.",
aboutMattermostChannelName: "Vous pouvez remplacer le salon par défaut que le Webhook utilise en mettant le nom du salon dans le champ \"Channel Name\". Vous aurez besoin de l'activer depuis les paramètres de Mattermost. Ex : #autre-salon",
"matrix": "Matrix",
matrix: "Matrix",
promosmsTypeEco: "SMS ECO - Pas cher mais lent et souvent surchargé. Limité uniquement aux déstinataires Polonais.",
promosmsTypeFlash: "SMS FLASH - Le message sera automatiquement affiché sur l'appareil du destinataire. Limité uniquement aux déstinataires Polonais.",
promosmsTypeFull: "SMS FULL - Version Premium des SMS, Vous pouvez mettre le nom de l'expéditeur (Vous devez vous enregistrer avant). Fiable pour les alertes.",
promosmsTypeSpeed: "SMS SPEED - La plus haute des priorités dans le système. Très rapide et fiable mais cher (environ le double du prix d'un SMS FULL).",
promosmsPhoneNumber: "Numéro de téléphone (Poiur les déstinataires Polonais, vous pouvez enlever les codes interna.)",
promosmsSMSSender: "SMS Expéditeur : Nom pré-enregistré ou l'un de base: InfoSMS, SMS Info, MaxSMS, INFO, SMS",
// End notification form
promosmsSMSSender: "SMS Expéditeur : Nom pré-enregistré ou l'un de base : InfoSMS, SMS Info, MaxSMS, INFO, SMS",
"Primary Base URL": "Primary Base URL",
emailCustomSubject: "Sujet personalisé",
clicksendsms: "ClickSend SMS",
checkPrice: "Vérification {0} tarifs :",
apiCredentials: "Crédentials de l'API",
octopushLegacyHint: "Vous utilisez l'ancienne version d'Octopush (2011-2020) ou la nouvelle version ?",
"Feishu WebHookUrl": "Feishu WebHookURL",
matrixHomeserverURL: "L'URL du serveur (avec http(s):// et le port de manière facultatif)",
"Internal Room Id": "ID de la salle interne",
matrixDesc1: "Vous pouvez trouver l'ID de salle interne en regardant dans la section avancée des paramètres dans le client Matrix. C'est censé ressembler à !QMdRCpUIfLwsfjxye6:home.server.",
matrixDesc2: "Il est fortement recommandé de créer un nouvel utilisateur et de ne pas utiliser le jeton d'accès de votre propre utilisateur Matrix, car il vous donnera un accès complet à votre compte et à toutes les salles que vous avez rejointes. Au lieu de cela, créez un nouvel utilisateur et invitez-le uniquement dans la salle dans laquelle vous souhaitez recevoir la notification. Vous pouvez obtenir le jeton d'accès en exécutant {0}",
Method: "Méthode",
Body: "Le corps",
Headers: "En-têtes",
PushUrl: "Push URL",
HeadersInvalidFormat: "Les en-têtes de la requête ne sont pas dans un format JSON valide: ",
BodyInvalidFormat: "Le corps de la requête n'est pas dans un format JSON valide: ",
"Monitor History": "Historique de la sonde",
clearDataOlderThan: "Garder l'historique des données de la sonde durant {0} jours.",
PasswordsDoNotMatch: "Les mots de passe ne correspondent pas.",
records: "Enregistrements",
"One record": "Un enregistrement",
steamApiKeyDescription: "Pour surveiller un serveur Steam, vous avez besoin d'une clé Steam Web-API. Vous pouvez enregistrer votre clé ici : ",
"Current User": "Utilisateur actuel",
recent: "Récent",
};

350
src/languages/hr-HR.js Normal file
View File

@@ -0,0 +1,350 @@
export default {
languageName: "Hrvatski",
checkEverySecond: "Provjera svake {0} sekunde",
retryCheckEverySecond: "Ponovni pokušaj svake {0} sekunde",
retriesDescription: "Broj ponovnih pokušaja prije nego će se servis označiti kao nedostupan te poslati obavijest",
ignoreTLSError: "Ignoriraj TLS/SSL pogreške za HTTPS web stranice",
upsideDownModeDescription: "Preokreni logiku statusa. Ako se primi pozitivan odgovor, smatra se da je usluga nedostupna.",
maxRedirectDescription: "Maksimalan broj preusmjeravanja. Postaviti na 0 kako bi se preusmjeravanja onemogućila.",
acceptedStatusCodesDescription: "Odaberite statusne kodove koji se smatraju uspješnim odgovorom.",
passwordNotMatchMsg: "Lozinke se ne poklapaju.",
notificationDescription: "Obavijesti će funkcionirati samo ako su dodijeljene monitoru.",
keywordDescription: "Ključna riječ za pretragu, u obliku običnog HTML-a ili u JSON formatu. Pretraga je osjetljiva na velika i mala slova.",
deleteMonitorMsg: "Jeste li sigurni da želite izbrisati monitor?",
deleteNotificationMsg: "Jeste li sigurni da želite izbrisati ovu obavijest za sve monitore?",
resoverserverDescription: "Cloudflare je zadani DNS poslužitelj. Možete to promijeniti u bilo kojem trenutku.",
rrtypeDescription: "Odaberite vrstu DNS zapisa o resursu kojeg želite pratiti",
pauseMonitorMsg: "Jeste li sigurni da želite pauzirati?",
enableDefaultNotificationDescription: "Ova će obavijesti biti omogućena za sve nove monitore. Možete ju ručno onemogućiti za pojedini monitor.",
clearEventsMsg: "Jeste li sigurni da želite izbrisati sve zapise o događajima za ovaj monitor?",
clearHeartbeatsMsg: "Jeste li sigurni da želite izbrisati sve zapise o provjerama za ovaj monitor?",
confirmClearStatisticsMsg: "Jeste li sigurni da želite izbrisati SVE statistike?",
importHandleDescription: "Odaberite opciju \"Preskoči postojeće\" ako želite preskočiti uvoz postojećih monitora i obavijesti ako dođe do poklapanja u imenu. Opcija \"Prepiši\" će izbrisati postojeće monitore i obavijesti.",
confirmImportMsg: "Jeste li sigurni da želite pokrenuti uvoz? Provjerite jeste li odabrali ispravnu opciju uvoza.",
twoFAVerifyLabel: "Unesite svoj 2FA token:",
tokenValidSettingsMsg: "Token je važeći! Sada možete spremiti postavke dvofaktorske autentikacije.",
confirmEnableTwoFAMsg: "Želite li omogućiti dvofaktorsku autentikaciju?",
confirmDisableTwoFAMsg: "Jeste li sigurni da želite onemogućiti dvofaktorsku autentikaciju?",
Settings: "Postavke",
Dashboard: "Kontrolna ploča",
"New Update": "Novo ažuriranje",
Language: "Jezik",
Appearance: "Izgled",
Theme: "Tema",
General: "Općenito",
"Primary Base URL": "Osnovni URL",
Version: "Inačica",
"Check Update On GitHub": "Provjeri dostupnost nove inačice na GitHubu",
List: "Popis",
Add: "Dodaj",
"Add New Monitor": "Dodaj novi Monitor",
"Quick Stats": "Statistika",
Up: "Dostupno",
Down: "Nedostupno",
Pending: "U tijeku",
Unknown: "Nepoznato",
pauseDashboardHome: "Pauzirano",
Name: "Naziv",
Status: "Status",
DateTime: "Vremenska oznaka",
Message: "Izvještaj",
"No important events": "Nema važnih događaja",
Pause: "Pauziraj",
Resume: "Nastavi",
Edit: "Uredi",
Delete: "Obriši",
Current: "Trenutno",
Uptime: "Dostupnost",
"Cert Exp.": "Istek cert.",
days: "dana",
day: "dan",
"-day": "-dnevno",
hour: "sat",
"-hour": "-satno",
Response: "Odgovor",
Ping: "Odziv",
"Monitor Type": "Vrsta Monitora",
Keyword: "Ključna riječ",
"Friendly Name": "Prilagođen naziv",
URL: "URL",
Hostname: "Domaćin",
Port: "Port",
"Heartbeat Interval": "Interval provjere",
Retries: "Broj ponovnih pokušaja",
"Heartbeat Retry Interval": "Interval ponovnih pokušaja",
Advanced: "Napredne postavke",
"Upside Down Mode": "Obrnuti način",
"Max. Redirects": "Maksimalan broj preusmjeravanja",
"Accepted Status Codes": "Prihvaćeni statusni kodovi",
"Push URL": "Push URL",
needPushEvery: "Potrebno je slati zahtjeve na URL svakih {0} sekundi.",
pushOptionalParams: "Neobavezni parametri: {0}",
Save: "Spremi",
Notifications: "Obavijesti",
"Not available, please setup.": "Obavijesti nisu dostupne, potrebno dodati novu obavijest.",
"Setup Notification": "Dodaj obavijest",
Light: "Svijetli način",
Dark: "Tamni način",
Auto: "Automatski",
"Theme - Heartbeat Bar": "Tema za traku dostupnosti",
Normal: "Normalno",
Bottom: "Ispod",
None: "Isključeno",
Timezone: "Vremenska zona",
"Search Engine Visibility": "Vidljivost tražilicama",
"Allow indexing": "Dopusti indeksiranje",
"Discourage search engines from indexing site": "Sprječavanje indeksiranja",
"Change Password": "Promjena lozinke",
"Current Password": "Trenutna lozinka",
"New Password": "Nova lozinka",
"Repeat New Password": "Potvrdite novu lozinku",
"Update Password": "Spremi novu lozinku",
"Disable Auth": "Onemogući autentikaciju",
"Enable Auth": "Omogući autentikaciju",
Logout: "Odjava",
Leave: "Poništi",
"I understand, please disable": "Razumijem, svejedno onemogući",
Confirm: "Potvrda",
Yes: "Da",
No: "Ne",
Username: "Korisničko ime",
Password: "Lozinka",
"Remember me": "Zapamti me",
Login: "Prijava",
"No Monitors, please": "Nema monitora, ",
"add one": "dodaj jedan",
"Notification Type": "Tip obavijesti",
Email: "E-pošta",
Test: "Testiraj",
"Certificate Info": "Informacije o certifikatu",
"Resolver Server": "DNS poslužitelj",
"Resource Record Type": "Vrsta DNS zapisa",
"Last Result": "Posljednji rezultat",
"Create your admin account": "Stvori administratorski račun",
"Repeat Password": "Potvrda lozinke",
"Import Backup": "Uvoz sigurnosne kopije",
"Export Backup": "Izvoz sigurnosne kopije",
Export: "Izvoz",
Import: "Uvoz",
respTime: "Vrijeme odgovora (ms)",
notAvailableShort: "N/A",
"Default enabled": "Omogući za nove monitore",
"Apply on all existing monitors": "Primijeni na postojeće monitore",
Create: "Kreiraj",
"Clear Data": "Obriši podatke",
Events: "Događaji",
Heartbeats: "Provjere",
"Auto Get": "Automatski dohvat",
backupDescription: "Moguće je napraviti sigurnosnu kopiju svih monitora i obavijesti koja će biti spremljena kao JSON datoteka.",
backupDescription2: "Napomena: povijest i podaci o događajima nisu uključeni u sigurnosnu kopiju.",
backupDescription3: "Osjetljivi podaci poput tokena za obavijesti uključeni su u sigurnosnu kopiju. Zato je potrebno čuvati izvoz na sigurnom mjestu.",
alertNoFile: "Datoteka za uvoz nije odabrana.",
alertWrongFileType: "Datoteka za uvoz nije u JSON formatu.",
"Clear all statistics": "Obriši sve statistike",
"Skip existing": "Preskoči postojeće",
Overwrite: "Prepiši",
Options: "Opcije",
"Keep both": "Zadrži sve",
"Verify Token": "Provjeri Token",
"Setup 2FA": "Postavi dvofaktorsku autentikaciju",
"Enable 2FA": "Omogući dvofaktorsku autentikaciju",
"Disable 2FA": "Onemogući dvofaktorsku autentikaciju",
"2FA Settings": "Postavke 2FA",
"Two Factor Authentication": "Dvofaktorska autentikacija",
Active: "Aktivna",
Inactive: "Neaktivno",
Token: "Token",
"Show URI": "Pokaži URI",
Tags: "Oznake",
"Add New below or Select...": "Dodajte novu oznaku ispod ili odaberite...",
"Tag with this name already exist.": "Oznaka s tim nazivom već postoji",
"Tag with this value already exist.": "Oznaka s tom vrijednošću već postoji.",
color: "Boja",
"value (optional)": "Vrijednost (neobavezno)",
Gray: "Siva",
Red: "Crvena",
Orange: "Narančasta",
Green: "Zelena",
Blue: "Plava",
Indigo: "Indigo",
Purple: "Ljubičasta",
Pink: "Ružičasta",
"Search...": "Pretraga...",
"Avg. Ping": "Prosječni odziv",
"Avg. Response": "Prosječni odgovor",
"Entry Page": "Početna stranica",
statusPageNothing: "Ovdje nema ničega, dodajte grupu ili monitor.",
"No Services": "Nema usluga",
"All Systems Operational": "Svi sustavi su operativni",
"Partially Degraded Service": "Usluga djelomično nedostupna",
"Degraded Service": "Usluga nedostupna",
"Add Group": "Dodaj grupu",
"Add a monitor": "Dodaj monitor",
"Edit Status Page": "Uredi Statusnu stranicu",
"Go to Dashboard": "Na Kontrolnu ploču",
"Status Page": "Statusna stranica",
defaultNotificationName: "Moja {number}. {notification} obavijest",
here: "ovdje",
Required: "Potrebno",
telegram: "Telegram",
"Bot Token": "Token bota",
wayToGetTelegramToken: "Token možete nabaviti preko {0}.",
"Chat ID": "ID razgovora",
supportTelegramChatID: "Podržani su ID-jevi izravnih razgovora, grupa i kanala",
wayToGetTelegramChatID: "ID razgovora možete saznati tako da botu pošaljete poruku te odete na ovaj URL:",
"YOUR BOT TOKEN HERE": "OVDJE IDE TOKEN BOTA",
chatIDNotFound: "ID razgovora nije pronađen; prvo morate poslati poruku botu",
webhook: "Webhook",
"Post URL": "URL Post zahtjeva",
"Content Type": "Tip sadržaja (Content Type)",
webhookJsonDesc: "{0} je dobra opcija za moderne HTTP poslužitelje poput Express.js-a",
webhookFormDataDesc: "{multipart} je moguća alternativa za PHP, samo je potrebno parsirati JSON koristeći {decodeFunction}",
smtp: "E-mail (SMTP)",
secureOptionNone: "Bez sigurnosti / STARTTLS (25, 587)",
secureOptionTLS: "TLS (465)",
"Ignore TLS Error": "Ignoriraj greške TLS-a",
"From Email": "Adresa za \"From\" polje",
emailCustomSubject: "Prilagođeno \"Subject\" polje",
"To Email": "Odredišne adrese e-pošte",
smtpCC: "Cc",
smtpBCC: "Bcc",
discord: "Discord",
"Discord Webhook URL": "URL Discord webhooka",
wayToGetDiscordURL: "Ovo možete dobiti tako da odete na Postavke servera -> Integracije -> Napravi webhook",
"Bot Display Name": "Nadimak Bota unutar servera",
"Prefix Custom Message": "Prefiks prilagođene poruke",
"Hello @everyone is...": "Pozdrav {'@'}everyone...",
teams: "Microsoft Teams",
"Webhook URL": "URL webhooka",
wayToGetTeamsURL: "Više informacija o Teams webhookovima možete pročitati {0}.",
signal: "Signal",
Number: "Broj",
Recipients: "Primatelji",
needSignalAPI: "Potreban je klijent s REST sučeljem.",
wayToCheckSignalURL: "Više informacija o postavljanju Signal klijenta:",
signalImportant: "VAŽNO: Grupe i brojevi se ne mogu istovremeno koristiti kao primatelji!",
gotify: "Gotify",
"Application Token": "Token Aplikacije",
"Server URL": "URL poslužitelja",
Priority: "Prioritet",
slack: "Slack",
"Icon Emoji": "Emotikon",
"Channel Name": "Naziv kanala",
"Uptime Kuma URL": "Uptime Kuma URL",
aboutWebhooks: "Dodatne informacije o webhookovima su dostupne na: {0}",
aboutChannelName: "Unesite ime {0} kanala u polju Naziv kanala ako želite zaobići webhook kanal. Primjerice: #neki-kanal",
aboutKumaURL: "Ako je polje \"Uptime Kuma URL\" prazno, koristi se zadana vrijednost koja vodi na GitHub stranicu projekta.",
emojiCheatSheet: "Popis emotikona: {0}",
"rocket.chat": "Rocket.Chat",
pushover: "Pushover",
pushy: "Pushy",
octopush: "Octopush",
promosms: "PromoSMS",
clicksendsms: "ClickSend SMS",
lunasea: "LunaSea",
apprise: "Apprise (Podržava preko 50 usluga za obavijesti)",
pushbullet: "Pushbullet",
line: "LINE",
mattermost: "Mattermost",
"User Key": "Korisnički ključ",
Device: "Uređaji",
"Message Title": "Naslov poruke",
"Notification Sound": "Zvuk obavijesti",
"More info on:": "Više informacija na: {0}",
pushoverDesc1: "Hitni prioritet (2) ima zadani istek vremena od 30 sekundi između ponovnih pokušaja te će isteći nakon 1 sata.",
pushoverDesc2: "Ako želite slati obavijesti na više uređaja, ispunite polje \"Uređaji\".",
"SMS Type": "Tip SMS-a",
octopushTypePremium: "Premium (Brzo - preporučeno za obavijesti)",
octopushTypeLowCost: "Low Cost (Sporo - mobilni operateri ponekad blokiraju ove poruke)",
checkPrice: "Provjerite {0} cijene:",
apiCredentials: "Vjerodajnice za API",
octopushLegacyHint: "Koristite li staru inačicu usluge Octopush (2011-2020) ili noviju inačicu?",
"Check octopush prices": "Provjerite cijene usluge Octopush {0}.",
octopushPhoneNumber: "Telefonski broj (međunarodni format, primjerice: +38512345678) ",
octopushSMSSender: "Naziv SMS pošiljatelja : 3-11 alfanumeričkih znakova i razmak (a-zA-Z0-9)",
"LunaSea Device ID": "LunaSea ID Uređaja",
"Apprise URL": "URL usluge Apprise",
"Example:": "Primjerice: {0}",
"Read more:": "Pročitajte više: {0}",
"Status:": "Status: {0}",
"Read more": "Pročitaj više",
appriseInstalled: "Apprise je instaliran.",
appriseNotInstalled: "Apprise nije instaliran. {0}",
"Access Token": "Pristupni token",
"Channel access token": "Token za pristup kanalu",
"Line Developers Console": "LINE razvojnoj konzoli",
lineDevConsoleTo: "LINE razvojna konzola - {0}",
"Basic Settings": "Osnovne Postavke",
"User ID": "Korisnički ID",
"Messaging API": "API za razmjenu poruka",
wayToGetLineChannelToken: "Prvo, pristupite {0}, kreirajte pružatelja usluga te kanal (API za razmjenu poruka), zatim možete dobiti token za pristup kanalu te korisnički ID za polja iznad.",
"Icon URL": "URL slike",
aboutIconURL: "Možete postaviti poveznicu na sliku u polju \"URL slike\" kako biste spriječili korištenje zadane slike. Ovo se polje neće koristiti ako je postavljeno polje \"Emotikon\".",
aboutMattermostChannelName: "Možete promijeniti kanal u kojeg webhook šalje tako da ispunite polje \"Naziv kanala\". Ta opcija mora biti omogućena unutar Mattermost postavki za webhook. Primjerice: #neki-kanal",
matrix: "Matrix",
promosmsTypeEco: "SMS ECO - jeftina, ali spora opcija koja je često preopterećena. Ograničeno samo na primatelje unutar Poljske.",
promosmsTypeFlash: "SMS FLASH - Poruka se automatski pojavljuje na uređaju primatelja. Ograničeno samo na primatelje unutar Poljske.",
promosmsTypeFull: "SMS FULL - Premium razina usluge, dozvoljava postavljanje naziva SMS pošiljatelja (Naziv mora biti registriran). Usluga pouzdana za obavijesti.",
promosmsTypeSpeed: "SMS SPEED - Usluga najvećeg prioriteta. Brza i pouzdana, ali skupa (otprilike dvostruko skuplja od cijene usluge SMS FULL).",
promosmsPhoneNumber: "Telefonski broj (za primatelje unutar Poljske nije potrebno navoditi pozivni broj države)",
promosmsSMSSender: "Naziv SMS pošiljatelja: Registriran naziv ili jedan od zadanih: InfoSMS, SMS Info, MaxSMS, INFO, SMS",
"Feishu WebHookUrl": "Feishu URL webhooka",
matrixHomeserverURL: "URL Matrix homeservera (uključujući http(s):// te port, ako je potrebno)",
"Internal Room Id": "Interni ID sobe",
matrixDesc1: "Interni ID sobe se može pronaći u naprednim postavkama sobe unutar Matrix klijenta. ID sobe nalikuje idućem zapisu: !QMdRCpUIfLwsfjxye6:home.server.",
matrixDesc2: "Preporučuje se stvaranje novog korisnika te suzdržavanje od korištenja pristupnog tokena vlastitog Matrix korisnika. Novog korisnika potrebno je dodati u sobe u kojima želite primati obavijesti. Pristupni token možete dobiti pokretanjem naredbe {0}",
Method: "Metoda",
Body: "Tijelo",
Headers: "Zaglavlja",
PushUrl: "Push URL",
HeadersInvalidFormat: "Zaglavlja nisu nije valjani JSON: ",
BodyInvalidFormat: "Tijelo zahtjeva nije valjani JSON: ",
"Monitor History": "Povijest monitora",
clearDataOlderThan: "Podaci o povijesti monitora čuvaju se {0} dana.",
PasswordsDoNotMatch: "Lozinke se ne poklapaju.",
records: "zapisa",
"One record": "Jedan zapis",
"Showing {from} to {to} of {count} records": "Prikaz zapisa {from}-{to} od sveukupno {count}",
steamApiKeyDescription: "Za praćenje Steam poslužitelja za igru, potrebno je imati Steam Web-API ključ. Možete registrirati vlastiti ključ ovdje: ",
"Current User": "Trenutni korisnik",
recent: "Nedavno",
Done: "Gotovo",
Info: "Informacije",
Security: "Sigurnost",
"Shrink Database": "Smanji bazu podataka",
"Pick a RR-Type...": "Odaberite vrstu DNS zapisa od navedenih...",
"Pick Accepted Status Codes...": "Odaberite HTTP statusne kodove koji će biti prihvaćeni...",
"Steam API Key": "Steam API ključ",
Default: "Zadano",
"HTTP Options": "HTTP Postavke",
"Create Incident": "Novi izvještaj o incidentu",
Title: "Naslov",
Content: "Sadržaj",
Style: "Stil",
info: "informacija",
warning: "upozorenje",
danger: "opasnost",
primary: "primarno",
light: "svijetlo",
dark: "tamno",
Post: "Objavi",
Created: "Stvoreno",
"Last Updated": "Uređeno",
"Please input title and content": "Naslov i sadržaj ne mogu biti prazni",
Unpin: "Ukloni",
"Switch to Light Theme": "Prebaci na svijetli način",
"Switch to Dark Theme": "Prebaci na tamni način",
"Show Tags": "Pokaži oznake",
"Hide Tags": "Sakrij oznake",
Description: "Opis",
"No monitors available.": "Nema dostupnih monitora.",
"Add one": "Add one",
"No Monitors": "Bez monitora",
"Add one": "Stvori jednog",
"Untitled Group": "Bezimena grupa",
Services: "Usluge",
Discard: "Odbaci",
Cancel: "Otkaži",
"Powered by": "Pokreće",
Saved: "Spremljeno",
};

View File

@@ -2,26 +2,26 @@ export default {
languageName: "Magyar",
checkEverySecond: "Ellenőrzés {0} másodpercenként",
retryCheckEverySecond: "Újrapróbál {0} másodpercenként.",
retriesDescription: "Maximális próbálkozás mielőtt a szolgáltatás leállt jelőlést kap és értesítés kerül kiküldésre",
ignoreTLSError: "TLS/SSL hibák figyelnen kívül hagyása HTTPS weboldalaknál",
retriesDescription: "Maximális próbálkozás mielőtt a szolgáltatás 'Leállt' jelölést kap és értesítés kerül kiküldésre",
ignoreTLSError: "TLS/SSL hibák figyelmen kívül hagyása HTTPS weboldalaknál",
upsideDownModeDescription: "Az állapot megfordítása. Ha a szolgáltatás elérhető, akkor lesz leállt állapotú.",
maxRedirectDescription: "Az átirányítások maximális száma. állítsa 0-ra az átirányítás tiltásához.",
acceptedStatusCodesDescription: "Válassza ki az állapot kódokat amelyek sikeres válasznak fognak számítani.",
passwordNotMatchMsg: "A megismételt jelszó nem egyezik.",
notificationDescription: "Kérem, rendeljen egy értesítést a figyeléshez, hogy működjön.",
keywordDescription: "Kulcsszó keresése a html-ben vagy a JSON válaszban. (kis-nagybetű érzékeny)",
keywordDescription: "Kulcsszó keresése a HTML-ben vagy a JSON válaszban. (kis-nagybetű érzékeny)",
pauseDashboardHome: "Szünetel",
deleteMonitorMsg: "Biztos, hogy törölni akarja ezt a figyelőt?",
deleteNotificationMsg: "Biztos, hogy törölni akarja ezt az értesítést az összes figyelőnél?",
resoverserverDescription: "A Cloudflare az alapértelmezett szerver, bármikor meg tudja változtatni a resolver server-t.",
rrtypeDescription: "Válassza ki az RR-Típust a figyelőhöz",
rrtypeDescription: "Válassza ki az RR-típust a figyelőhöz",
pauseMonitorMsg: "Biztos, hogy szüneteltetni akarja?",
enableDefaultNotificationDescription: "Minden új figyelőhöz ez az értesítés engedélyezett lesz alapértelmezetten. Kikapcsolhatja az értesítést külön minden figyelőnél.",
clearEventsMsg: "Biztos, hogy törölni akar miden eseményt ennél a figyelnél?",
clearHeartbeatsMsg: "Biztos, hogy törölni akar minden heartbeat-et ennél a figyelőnél?",
confirmClearStatisticsMsg: "Biztos, hogy törölni akat MINDEN statisztikát?",
clearHeartbeatsMsg: "Biztos, hogy törölni akar minden életjelet ennél a figyelőnél?",
confirmClearStatisticsMsg: "Biztos, hogy törölni akar MINDEN statisztikát?",
importHandleDescription: "Válassza a 'Meglévő kihagyását', ha ki szeretné hagyni az azonos nevő figyelőket vagy értesítésket. A 'Felülírás' törölni fog minden meglévő figyelőt és értesítést.",
confirmImportMsg: "Biztos, hogy importálja a mentést? Győzödjön meg róla, hogy jól választotta ki az importálás opciót.",
confirmImportMsg: "Biztos, hogy importálja a mentést? Győződjön meg róla, hogy jól választotta ki az importálás opciót.",
twoFAVerifyLabel: "Kérem, adja meg a token-t, hogy a 2FA működését ellenőrizzük",
tokenValidSettingsMsg: "A token érvényes! El tudja menteni a 2FA beállításait.",
confirmEnableTwoFAMsg: "Biztosan engedélyezi a 2FA-t?",
@@ -54,23 +54,23 @@ export default {
Delete: "Törlés",
Current: "Aktuális",
Uptime: "Uptime",
"Cert Exp.": "Tanúsítvány lejár",
days: "napok",
"Cert Exp.": "SSL lejárat",
days: "nap",
day: "nap",
"-day": "-nap",
"-day": " nap",
hour: "óra",
"-hour": "-óra",
"-hour": " óra",
Response: "Válasz",
Ping: "Ping",
"Monitor Type": "Figyelő típusa",
Keyword: "Kulcsszó",
"Friendly Name": "Rövid név",
URL: "URL",
Hostname: "Hostnév",
Hostname: "Hosztnév",
Port: "Port",
"Heartbeat Interval": "Heartbeat időköz",
"Heartbeat Interval": "Életjel időköz",
Retries: "Újrapróbálkozás",
"Heartbeat Retry Interval": "Heartbeat újrapróbálkozások időköze",
"Heartbeat Retry Interval": "Életjel újrapróbálkozások időköze",
Advanced: "Haladó",
"Upside Down Mode": "Fordított mód",
"Max. Redirects": "Max. átirányítás",
@@ -82,8 +82,8 @@ export default {
Light: "Világos",
Dark: "Sötét",
Auto: "Auto",
"Theme - Heartbeat Bar": "Téma - Heartbeat Bar",
Normal: "Normal",
"Theme - Heartbeat Bar": "Téma - Életjel sáv",
Normal: "Normál",
Bottom: "Nyomógomb",
None: "Nincs",
Timezone: "Időzóna",
@@ -97,9 +97,9 @@ export default {
"Update Password": "Jelszó módosítása",
"Disable Auth": "Hitelesítés tiltása",
"Enable Auth": "Hitelesítés engedélyezése",
Logout: "Kijelenetkezés",
Logout: "Kijelentkezés",
Leave: "Elhagy",
"I understand, please disable": "Megértettem, kérem tilsa le",
"I understand, please disable": "Megértettem, kérem tiltsa le",
Confirm: "Megerősítés",
Yes: "Igen",
No: "Nem",
@@ -113,7 +113,7 @@ export default {
Email: "Email",
Test: "Teszt",
"Certificate Info": "Tanúsítvány információk",
"Resolver Server": "Resolver szerver",
"Resolver Server": "DNS szerver",
"Resource Record Type": "Resource Record típusa",
"Last Result": "Utolsó eredmény",
"Create your admin account": "Hozza létre az adminisztrátor felhasználót",
@@ -129,11 +129,11 @@ export default {
Create: "Létrehozás",
"Clear Data": "Adatok törlése",
Events: "Események",
Heartbeats: "Heartbeats",
"Auto Get": "Auto Get",
backupDescription: "Ki tudja menteni az összes figyelőt és értesítést egy JSON fájlba.",
backupDescription2: "Ui.: Történeti és esemény adatokat nem tartalmaz.",
backupDescription3: "Érzékeny adatok, pl. szolgáltatás kulcsok is vannak az export fájlban. Figyelmesen őrizze!",
Heartbeats: "Életjelek",
"Auto Get": "Auto lekérd.",
backupDescription: "Mentheti az összes figyelőt és értesítést egy JSON fájlba.",
backupDescription2: "Megj: Történeti és esemény adatokat nem tartalmaz.",
backupDescription3: "Érzékeny adatok, pl. szolgáltatás kulcsok is vannak az export fájlban. Figyeljen erre!",
alertNoFile: "Válaszzon ki egy fájlt az importáláshoz.",
alertWrongFileType: "Válasszon egy JSON fájlt.",
"Clear all statistics": "Összes statisztika törlése",
@@ -144,17 +144,17 @@ export default {
"Verify Token": "Token ellenőrzése",
"Setup 2FA": "2FA beállítása",
"Enable 2FA": "2FA engedélyezése",
"Disable 2FA": "2FA toltása",
"Disable 2FA": "2FA tiltása",
"2FA Settings": "2FA beállítások",
"Two Factor Authentication": "Two Factor Authentication",
"Two Factor Authentication": "Kétfaktoros hitelesítés",
Active: "Aktív",
Inactive: "Inaktív",
Token: "Token",
"Show URI": "URI megmutatása",
Tags: "Cimkék",
Tags: "Címkék",
"Add New below or Select...": "Adjon hozzá lentre vagy válasszon...",
"Tag with this name already exist.": "Ilyen nevű cimke már létezik.",
"Tag with this value already exist.": "Ilyen értékű cimke már létezik.",
"Tag with this name already exist.": "Ilyen nevű címke már létezik.",
"Tag with this value already exist.": "Ilyen értékű címke már létezik.",
color: "szín",
"value (optional)": "érték (opcionális)",
Gray: "Szürke",
@@ -169,15 +169,15 @@ export default {
"Avg. Ping": "Átl. ping",
"Avg. Response": "Átl. válasz",
"Entry Page": "Nyitólap",
statusPageNothing: "Semmi nincs itt, kérem, adjon hozzá egy figyelőt.",
statusPageNothing: "Semmi nincs itt. Adjon hozzá egy vagy több figyelőt.",
"No Services": "Nincs szolgáltatás",
"All Systems Operational": "Minden rendszer működik",
"Partially Degraded Service": "Részlegesen leállt szolgáltatás",
"Degraded Service": "Leállt szolgáltatás",
"Add Group": "Csoport hozzáadása",
"Add a monitor": "Figyelő hozzáadása",
"Edit Status Page": "Sátusz oldal szerkesztése",
"Go to Dashboard": "Menj az irányítópulthoz",
"Edit Status Page": "Státusz oldal szerkesztése",
"Go to Dashboard": "Irányítópulthoz",
telegram: "Telegram",
webhook: "Webhook",
smtp: "Email (SMTP)",
@@ -192,9 +192,173 @@ export default {
octopush: "Octopush",
promosms: "PromoSMS",
lunasea: "LunaSea",
apprise: "Apprise (Support 50+ Notification services)",
apprise: "Apprise (50+ értesítési szolgáltatás)",
pushbullet: "Pushbullet",
line: "Line Messenger",
mattermost: "Mattermost",
"Status Page": "Status Page",
"Status Page": "Státusz oldal",
"Primary Base URL": "Elsődleges URL",
"Push URL": "Meghívandó URL",
needPushEvery: "Ezt az URL-t kell meghívni minden {0} másodpercben.",
pushOptionalParams: "Opcionális paraméterek: {0}",
defaultNotificationName: "{notification} értesítésem ({number})",
here: "itt",
Required: "Kötelező",
"Bot Token": "BOT token",
wayToGetTelegramToken: "Innen kaphat token-t: {0}.",
"Chat ID": "Csevegés ID",
supportTelegramChatID: "Támogatja a közvetlen csevegést, csoportnak küldést és csatona ID-t is",
wayToGetTelegramChatID: "A csevegés ID-t kinyerheti azzal, hogy küld egy üzenetet a bot-nak és erre az URL-re ellátogat, ahol láthatja a chat_id:-t",
"YOUR BOT TOKEN HERE": "AZ ÖN BOT TOKENJE ITT",
chatIDNotFound: "Csevegés ID nem található, küldjön egy első üzenetet a bot-nak",
"Post URL": "Cél URL (Post)",
"Content Type": "Tartalom típus (Content Type)",
webhookJsonDesc: "{0} ideális a moderh HTTP szerverekhez, mint az Express.js",
webhookFormDataDesc: "{multipart} ideális a PHP-hez. A JSON értelmezhető ezzel: {decodeFunction}",
secureOptionNone: "Nincs / STARTTLS (25, 587)",
secureOptionTLS: "TLS (465)",
"Ignore TLS Error": "TLS hiba figyelmen kívül hagyása",
"From Email": "Feladó email",
emailCustomSubject: "Egyedi tárgy",
"To Email": "Cél email",
smtpCC: "Másolat",
smtpBCC: "Titkos másolat",
"Discord Webhook URL": "Discord cím (webhook URL)",
wayToGetDiscordURL: "Kaphat egy ilyet, ha ellátogat a Server Settings -> Integrations -> Create Webhook oldalra",
"Bot Display Name": "Bot megjelenő neve",
"Prefix Custom Message": "Egyedi előtét üzenet",
"Hello @everyone is...": "Hello {'@'}mindenki...",
"Webhook URL": "Cím (webhook URL)",
wayToGetTeamsURL: "Itt megnézheti, hogy kell ilyen URL-t készíteni: {0}.",
Number: "Szám",
Recipients: "Címzettek",
needSignalAPI: "Egy Signal kliensre van szüksége, amihez REST API tartozik.",
wayToCheckSignalURL: "Itt megnézheti, hogy hozhat létre egyet:",
signalImportant: "FONTOS! Nem keverheti a csoportokat és számokat a címzetteknél.",
"Application Token": "Alkalmazás token",
"Server URL": "Szerver URL",
Priority: "Prioritás",
"Icon Emoji": "Emoji ikonok",
"Channel Name": "Csatorna neve",
"Uptime Kuma URL": "Uptime Kuma cím",
aboutWebhooks: "Webhook-okról több info: {0}",
aboutChannelName: "Adja meg a {0} csatorna nevét ha szeretné elkerülni a webhook-ot. Pl: #masik-csatorna",
aboutKumaURL: "Ha üresen hagyja a Uptime Kuma cím mezőt, akkor a projekt GitHub oldala lesz az alapértelmezett.",
emojiCheatSheet: "Emoji csalás: {0}",
clicksendsms: "ClickSend SMS",
"User Key": "Felhasználói kulcs",
Device: "Eszköz",
"Message Title": "Üzenet címe",
"Notification Sound": "Értesítési hang",
"More info on:": "További információ: {0}",
pushoverDesc1: "A vészhelyzeti prioritásnak (2) 30 másodperc az újrapróbálkozási alapértéke és egy óra után lejár.",
pushoverDesc2: "Ha különböző eszközökre szeretne értesítést küldeni, töltse ki az Eszköz mezőt.",
"SMS Type": "SMS típusa",
octopushTypePremium: "Premium (Fast - recommended for alerting)",
octopushTypeLowCost: "Low Cost (Slow - sometimes blocked by operator)",
checkPrice: "Nézze meg az {0} féle árat:",
apiCredentials: "API kulcsok",
octopushLegacyHint: "Az Octopush régi (2011-2020) verzióját használja vagy az újat?",
"Check octopush prices": "Nézze meg az Octopush {0} féle árát.",
octopushPhoneNumber: "Telefonszám (nemz. formátum, pl : +36705554433) ",
octopushSMSSender: "SMS küldő neve : 3-11 betű/szám (a-zA-Z0-9) vagy szóköz",
"LunaSea Device ID": "LunaSea eszköz ID",
"Apprise URL": "Apprise cím (URL)",
"Example:": "Például: {0}",
"Read more:": "Itt olvashat róla: {0}",
"Status:": "Állapot: {0}",
"Read more": "Tovább olvasom",
appriseInstalled: "Apprise telepítve.",
appriseNotInstalled: "Apprise nincs telepítve. {0}",
"Access Token": "Elérési token",
"Channel access token": "Csatorna elérési token",
"Line Developers Console": "Line Developers konzol",
lineDevConsoleTo: "Line Developers konzol - {0}",
"Basic Settings": "Alap beállítások",
"User ID": "Felhasználó ID",
"Messaging API": "Üzenet API",
wayToGetLineChannelToken: "{0} első eléréséhez készítsen egy Provider-t és csatornát (Messaging API), utána kaphatja meg a csatorna elérési token-t és felhasználó ID-t az alábbi menüpontban.",
"Icon URL": "Ikon cím (URL)",
aboutIconURL: "Megadhat egy webcímet az Ikon cím mezőben, ezzel felülírva az alapértelmezet képet. Nem kerül felhasználásra, ha az Emoji-k be vannak állítva.",
aboutMattermostChannelName: "Felülírhatja az alapértelmezett csatornát, ahova a webhook az adatokat küldi. Ehhez töltse ki a \"Csatorna neve\" mezőt (pl: #egyeb-csatorna). A Mattermost webhook beállításaiban további engedélyek szükségesek",
matrix: "Matrix",
promosmsTypeEco: "SMS ECO - olcsó, de lassú, gyakran túlterhelt. Csak lengyel címzettekhez.",
promosmsTypeFlash: "SMS FLASH - Az üzenet automatikusan megjelenik a fogadó eszközön. Csak lengyel címzettekhez.",
promosmsTypeFull: "SMS FULL - Prémium szintje az SMS-nek. Megadható a feladó neve, de előtte jóváhagyás szükséges. Ideális értesítésekhez.",
promosmsTypeSpeed: "SMS SPEED - A legmagasabb prioritás a rendszerben. Nagyon gyors és pontos, de költséges (kb. duplája a hagyományos SMS-nek).",
promosmsPhoneNumber: "Telefonszám (lengyel címzett esetén az országkód elhagyható)",
promosmsSMSSender: "SMS feladónév: Előre beállított név vagy az alábbiak egyike: InfoSMS, SMS Info, MaxSMS, INFO, SMS",
"Feishu WebHookUrl": "Feishu webhook cím (URL)",
matrixHomeserverURL: "Homeserver cím (URL http(s):// előtaggal és opcionálisan port-tal)",
"Internal Room Id": "Belső Szoba ID",
matrixDesc1: "A belső szoba ID-t a szpbák speciális beállítások között találja meg a Matrix kliens programban. Így kell kinéznie: !QMdRCpUIfLwsfjxye6:home.server.",
matrixDesc2: "Erősen ajánlott készíteni egy új felhasználót és nem a teljes joggal rendelkező felhasználót használni. Az új felhasználó létrehozása után csak azokba a szobákba kell megjhívni a felhasználót, ahol értesítéseket szeretne kapni. Ezzel a művelettel lehet elérési token-t kérni: {0}",
Method: "Metódus",
Body: "Törzs",
Headers: "Fejlécek",
PushUrl: "Push cím (URL)",
HeadersInvalidFormat: "A kérés fejléc nem egy valós JSON: ",
BodyInvalidFormat: "A kérés törzse nem egy valós JSON: ",
"Monitor History": "Vizsgálatok előzményei",
clearDataOlderThan: "Előzmények megtartása {0} napig.",
PasswordsDoNotMatch: "Jelszó nem egyezik.",
records: "sorok",
"One record": "Egy sor",
steamApiKeyDescription: "Steam Game Server ellenőrzéséhez szükséges egy Steam Web-API kulcs. Itt létrehozhat egy API kulcsot: ",
"Current User": "Felhasználó",
recent: "Legújabb",
Done: "Kész",
Info: "Infó",
Security: "Biztonság",
"Steam API Key": "Steam API kulcs",
"Shrink Database": "Adatbázis tömörítése",
"Pick a RR-Type...": "Válasszon egy RR-típust...",
"Pick Accepted Status Codes...": "Válasszon olyan kódot, ami elfogadottnak számít...",
Default: "Alapért.",
"HTTP Options": "HTTP beállítások",
"Create Incident": "Incidens létrehozása",
Title: "Cím",
Content: "Tartalom",
Style: "Stílus",
info: "info",
warning: "warning",
danger: "danger",
primary: "primary",
light: "light",
dark: "dark",
Post: "Bejegyzés",
"Please input title and content": "Adjon meg címet és tartalmat",
Created: "Létrehozva",
"Last Updated": "Utolsó mód.",
Unpin: "Leválaszt",
"Switch to Light Theme": "Világos témára váltás",
"Switch to Dark Theme": "Sötét témára váltás",
"Show Tags": "Címkék mutatása",
"Hide Tags": "Címkék elrejtése",
Description: "Leírás",
"No monitors available.": "Nincs még figyelő beállítva.",
"Add one": "Adjon hozzá egyet",
"No Monitors": "Nincs figyelő",
"Untitled Group": "Névtelen csoport",
Services: "Szolgáltatások",
Discard: "Elvet",
Cancel: "Mégsem",
"Powered by": "A megoldást szállítja az",
shrinkDatabaseDescription: "VACUUM futtatása az SQLite-on. Ha az adatbázisod 1.10.0-nál újabb, akkor az AUTO_VACUUM engedélyezve van, nincs szükség a műveletre.",
serwersms: "SerwerSMS.pl",
serwersmsAPIUser: "API felhasználónév (webapi_ előtaggal együtt)",
serwersmsAPIPassword: "API jelszó",
serwersmsPhoneNumber: "Telefonszám",
serwersmsSenderName: "SMS feladó neve (regisztrált név az oldalon)",
GoogleChat: "Google Chat (csak Google Workspace)",
stackfield: "Stackfield",
smtpDkimSettings: "DKIM beállítások",
smtpDkimDesc: "Nézze meg a Nodemailer DKIM {0} használati szabályokat.",
documentation: "dokumentáció",
smtpDkimDomain: "Domain név",
smtpDkimKeySelector: "Kulcs választó",
smtpDkimPrivateKey: "Privát kulcs",
smtpDkimHashAlgo: "Hash algoritmus (nem kötelező)",
smtpDkimheaderFieldNames: "Fejléc kulcsok a bejelentkezéshez (nem kötelező)",
smtpDkimskipFields: "Fejléc kulcsok egyéb esetben (nem kötelező)",
};

View File

@@ -7,12 +7,12 @@ export default {
upsideDownModeDescription: "Balikkan statusnya. Jika layanan dapat dijangkau, TIDAK AKTIF.",
maxRedirectDescription: "Jumlah maksimum pengalihan untuk diikuti. Setel ke 0 untuk menonaktifkan pengalihan.",
acceptedStatusCodesDescription: "Pilih kode status yang dianggap sebagai tanggapan yang berhasil.",
passwordNotMatchMsg: "Sandi kedua tidak cocok.",
passwordNotMatchMsg: "Kata sandi kedua tidak cocok.",
notificationDescription: "Harap atur notifikasi ke monitor agar berfungsi.",
keywordDescription: "Cari kata kunci dalam code html atau JSON huruf besar-kecil berpengaruh",
pauseDashboardHome: "Jeda",
deleteMonitorMsg: "Apakah Anda mau menghapus monitor ini?",
deleteNotificationMsg: "Apakah Anda mau menghapus notifikasi ini untuk semua monitor?",
deleteNotificationMsg: "Apakah Anda mau menghapus notifikasi untuk semua monitor?",
resoverserverDescription: "Cloudflare adalah server bawaan, Anda dapat mengubah server resolver kapan saja.",
rrtypeDescription: "Pilih RR-Type yang mau Anda monitor",
pauseMonitorMsg: "Apakah Anda yakin mau menjeda?",
@@ -23,9 +23,9 @@ export default {
importHandleDescription: "Pilih 'Lewati yang ada' jika Anda ingin melewati setiap monitor atau notifikasi dengan nama yang sama. 'Timpa' akan menghapus setiap monitor dan notifikasi yang ada.",
confirmImportMsg: "Apakah Anda yakin untuk mengimpor cadangan? Pastikan Anda telah memilih opsi impor yang tepat.",
twoFAVerifyLabel: "Silakan ketik token Anda untuk memverifikasi bahwa 2FA berfungsi",
tokenValidSettingsMsg: "Tokennya benar! Anda sekarang dapat menyimpan pengaturan 2FA.",
confirmEnableTwoFAMsg: "Apakah Anda yakin ingin mengaktifkan 2FA?",
confirmDisableTwoFAMsg: "Apakah Anda yakin ingin menonaktifkan 2FA?",
tokenValidSettingsMsg: "Token benar! Anda sekarang dapat menyimpan pengaturan 2FA.",
confirmEnableTwoFAMsg: "Apakah anda yakin ingin mengaktifkan 2FA?",
confirmDisableTwoFAMsg: "Apakah anda yakin ingin menonaktifkan 2FA?",
Settings: "Pengaturan",
Dashboard: "Dasbor",
"New Update": "Pembaruan Baru",
@@ -179,11 +179,10 @@ export default {
"Edit Status Page": "Edit Halaman Status",
"Go to Dashboard": "Pergi ke Dasbor",
"Status Page": "Halaman Status",
// Start notification form
defaultNotificationName: "{notification} saya Peringatan ({number})",
here: "di sini",
"Required": "Dibutuhkan",
"telegram": "Telegram",
Required: "Dibutuhkan",
telegram: "Telegram",
"Bot Token": "Bot Token",
"You can get a token from": "Anda bisa mendapatkan token dari",
"Chat ID": "Chat ID",
@@ -191,12 +190,12 @@ export default {
wayToGetTelegramChatID: "Anda bisa mendapatkan chat id Anda dengan mengirim pesan ke bot dan pergi ke url ini untuk melihat chat_id:",
"YOUR BOT TOKEN HERE": "BOT TOKEN ANDA DI SINI",
chatIDNotFound: "Chat ID tidak ditemukan, tolong kirim pesan ke bot ini dulu",
"webhook": "Webhook",
webhook: "Webhook",
"Post URL": "Post URL",
"Content Type": "Tipe konten",
webhookJsonDesc: "{0} bagus untuk peladen http modern seperti express.js",
webhookFormDataDesc: "{multipart} bagus untuk PHP, Anda hanya perlu mengurai json dengan {decodeFunction}",
"smtp": "Surel (SMTP)",
smtp: "Surel (SMTP)",
secureOptionNone: "None / STARTTLS (25, 587)",
secureOptionTLS: "TLS (465)",
"Ignore TLS Error": "Abaikan Kesalahan TLS",
@@ -204,26 +203,26 @@ export default {
"To Email": "Ke Surel",
smtpCC: "CC",
smtpBCC: "BCC",
"discord": "Discord",
discord: "Discord",
"Discord Webhook URL": "Discord Webhook URL",
wayToGetDiscordURL: "Anda bisa mendapatkan ini dengan pergi ke Server Settings -> Integrations -> Create Webhook",
"Bot Display Name": "Nama Bot",
"Prefix Custom Message": "Awalan Pesan",
"Hello @everyone is...": "Halo {'@'}everyone is...",
"teams": "Microsoft Teams",
teams: "Microsoft Teams",
"Webhook URL": "Webhook URL",
wayToGetTeamsURL: "Anda dapat mempelajari cara membuat url webhook {0}.",
"signal": "Sinyal",
"Number": "Nomer",
"Recipients": "Penerima",
signal: "Sinyal",
Number: "Nomer",
Recipients: "Penerima",
needSignalAPI: "Anda harus memiliki klien sinyal dengan REST API.",
wayToCheckSignalURL: "Anda dapat memeriksa url ini untuk melihat cara menyiapkannya:",
signalImportant: "PENTING: Anda tidak dapat mencampur grup dan nomor di penerima!",
"gotify": "Gotify",
gotify: "Gotify",
"Application Token": "Token Aplikasi",
"Server URL": "URL Peladen",
"Priority": "Prioritas",
"slack": "Slack",
Priority: "Prioritas",
slack: "Slack",
"Icon Emoji": "Ikon Emoji",
"Channel Name": "Nama Saluran",
"Uptime Kuma URL": "Uptime Kuma URL",
@@ -242,7 +241,7 @@ export default {
line: "Line Messenger",
mattermost: "Mattermost",
"User Key": "Kunci pengguna",
"Device": "Perangkat",
Device: "Perangkat",
"Message Title": "Judul Pesan",
"Notification Sound": "Suara Nofifikasi",
"More info on:": "Info lebih lanjut tentang: {0}",
@@ -273,13 +272,12 @@ export default {
"Icon URL": "Icon URL",
aboutIconURL: "Anda dapat memberikan tautan ke gambar di \"Icon URL\" untuk mengganti gambar profil bawaan. Tidak akan digunakan jika Ikon Emoji diset.",
aboutMattermostChannelName: "Anda dapat mengganti saluran bawaan tujuan posting webhook dengan memasukkan nama saluran ke dalam Kolom \"Channel Name\". Ini perlu diaktifkan di pengaturan webhook Mattermost. contoh: #other-channel",
"matrix": "Matrix",
matrix: "Matrix",
promosmsTypeEco: "SMS ECO - murah tapi lambat dan sering kelebihan beban. Terbatas hanya untuk penerima Polandia.",
promosmsTypeFlash: "SMS FLASH - Pesan akan otomatis muncul di perangkat penerima. Terbatas hanya untuk penerima Polandia.",
promosmsTypeFull: "SMS FULL - SMS tingkat premium, Anda dapat menggunakan Nama Pengirim Anda (Anda harus mendaftarkan nama terlebih dahulu). Dapat diAndalkan untuk peringatan.",
promosmsTypeSpeed: "SMS SPEED - Prioritas tertinggi dalam sistem. Sangat cepat dan dapat diAndalkan tetapi mahal (sekitar dua kali lipat dari harga SMS FULL).",
promosmsTypeSpeed: "SMS SPEED - Prioritas tertinggi dalam sistem. Sangat cepat dan dapat diandalkan tetapi mahal (sekitar dua kali lipat dari harga SMS FULL).",
promosmsPhoneNumber: "Nomor telepon (untuk penerima Polandia Anda dapat melewati kode area)",
promosmsSMSSender: "Nama Pengirim SMS : Nama pra-registrasi atau salah satu bawaan: InfoSMS, Info SMS, MaxSMS, INFO, SMS",
"Feishu WebHookUrl": "Feishu WebHookUrl",
// End notification form
};

View File

@@ -2,48 +2,49 @@ export default {
languageName: "Italiano (Italian)",
checkEverySecond: "controlla ogni {0} secondi",
retryCheckEverySecond: "Riprova ogni {0} secondi.",
retriesDescription: "Tentativi da fare prima che il servizio venga marcato come \"giù\" e che una notifica venga inviata.",
ignoreTLSError: "Ignora gli errori TLS/SSL per i siti in HTTPS.",
upsideDownModeDescription: "Capovolgi lo stato. Se il servizio è raggiungibile viene marcato come \"GIÙ\".",
maxRedirectDescription: "Numero massimo di redirezionamenti consentito. Per disabilitare impostare \"0\".",
acceptedStatusCodesDescription: "Inserire i codici di stato considerati come risposte corrette.",
retriesDescription: "Tentativi prima che il servizio venga marcato come \"DOWN\" e che una notifica venga inviata.",
ignoreTLSError: "Ignora gli errori TLS/SSL per i siti HTTPS.",
upsideDownModeDescription: "Se il servizio risulta raggiungibile viene marcato come \"DOWN\".",
maxRedirectDescription: "Numero massimo di redirezionamenti consentito. Per disabilitare, impostare \"0\".",
acceptedStatusCodesDescription: "Elenco di codici di stato HTTP che sono considerati validi.",
passwordNotMatchMsg: "La password non coincide.",
notificationDescription: "Assegnare la notifica a uno o più elementi monitorati per metterla in funzione.",
notificationDescription: "Assegnare la notifica a uno o più oggetti monitorati per metterla in funzione.",
keywordDescription: "Cerca la parola chiave nella risposta in html o JSON e fai distinzione tra maiuscole e minuscole",
pauseDashboardHome: "In Pausa",
deleteMonitorMsg: "Si è certi di voler eliminare questo monitoraggio?",
deleteMonitorMsg: "Si è certi di voler eliminare questo oggetto monitorato?",
deleteNotificationMsg: "Si è certi di voler eliminare questa notifica per tutti gli oggetti monitorati?",
resoverserverDescription: "Cloudflare è il server predefinito, è possibile cambiare il server DNS.",
rrtypeDescription: "Scegliere il tipo di RR che si vuole monitorare",
pauseMonitorMsg: "Si è certi di voler mettere in pausa?",
enableDefaultNotificationDescription: "Per ogni nuovo monitoraggio questa notifica sarà abilitata di default. È comunque possibile disabilitare la notifica separatamente per ogni monitoraggio.",
enableDefaultNotificationDescription: "Per ogni nuovo monitor questa notifica sarà abilitata di default. È comunque possibile disabilitare la notifica singolarmente.",
clearEventsMsg: "Si è certi di voler eliminare tutti gli eventi per questo servizio?",
clearHeartbeatsMsg: "Si è certi di voler eliminare tutti gli intervalli di controllo per questo servizio?",
confirmClearStatisticsMsg: "Si è certi di voler eliminare TUTTE le statistiche?",
importHandleDescription: "Selezionare 'Ignora gli esistenti' si vuole ignorare l'importazione dei monitoraggi o delle notifiche con lo stesso nome. 'Sovrascrivi' eliminerà ogni monitoraggio e notifica esistente.",
importHandleDescription: "Selezionare \"Ignora esistenti\" se si vuole ignorare l'importazione dei monitor o delle notifiche con lo stesso nome. \"Sovrascrivi\" rimpiazzerà tutti i monitor e le notifiche presenti con quelli nel backup.",
confirmImportMsg: "Si è certi di voler importare il backup? Essere certi di aver selezionato l'opzione corretta di importazione.",
twoFAVerifyLabel: "Scrivi il token per verificare che l'autenticazione a due fattori funzioni",
twoFAVerifyLabel: "Digita il token per verificare che l'autenticazione a due fattori funzioni correttamente:",
tokenValidSettingsMsg: "Il token è valido! È ora possibile salvare le impostazioni.",
confirmEnableTwoFAMsg: "Si è certi di voler abilitare l'autenticazione a due fattori?",
confirmDisableTwoFAMsg: "Si è certi di voler disabilitare l'autenticazione a due fattori?",
Settings: "Impostazioni",
Dashboard: "Cruscotto",
"New Update": "Nuovo Aggiornamento Disponibile",
Dashboard: "Dashboard",
"New Update": "Nuovo aggiornamento disponibile!",
Language: "Lingua",
Appearance: "Aspetto",
Theme: "Tema",
General: "Generali",
General: "Generale",
"Primary Base URL": "URL base primario",
Version: "Versione",
"Check Update On GitHub": "Controlla aggiornamenti su GitHub",
List: "Lista",
Add: "Aggiungi",
"Add New Monitor": "Aggiungi un nuovo monitoraggio",
"Add New Monitor": "Aggiungi nuovo monitor",
"Quick Stats": "Statistiche rapide",
Up: "Su",
Down: "Giù",
Pending: "Pendente",
Up: "Up",
Down: "Down",
Pending: "In attesa",
Unknown: "Sconosciuti",
Pause: "Metti in Pausa",
Pause: "Metti in pausa",
Name: "Nome",
Status: "Stato",
DateTime: "Data e Ora",
@@ -62,67 +63,70 @@ export default {
"-hour": "-ore",
Response: "Risposta",
Ping: "Ping",
"Monitor Type": "Tipo di Monitoraggio",
"Monitor Type": "Modalità di monitoraggio",
Keyword: "Parola chiave",
"Friendly Name": "Nome Amichevole",
"Friendly Name": "Nome",
URL: "URL",
Hostname: "Nome Host",
Port: "Porta",
"Heartbeat Interval": "Intervallo di controllo",
Retries: "Tentativi",
"Heartbeat Retry Interval": "Intervallo tra un tentativo di controllo e l'altro",
"Heartbeat Retry Interval": "Intervallo tra i tentativo di controllo",
Advanced: "Avanzate",
"Upside Down Mode": "Modalità capovolta",
"Upside Down Mode": "Modalità invertita",
"Max. Redirects": "Reindirizzamenti massimi",
"Accepted Status Codes": "Codici di stato accettati",
"Push URL": "Push URL",
needPushEvery: "Notificare questo URL ogni {0} secondi.",
pushOptionalParams: "Parametri aggiuntivi: {0}",
Save: "Salva",
Notifications: "Notifiche",
"Not available, please setup.": "Non disponibili, da impostare.",
"Setup Notification": "Imposta le notifiche",
"Not available, please setup.": "Non disponibili, da configurare.",
"Setup Notification": "Configura le notifiche",
Light: "Chiaro",
Dark: "Scuro",
Auto: "Automatico",
"Theme - Heartbeat Bar": "Tema - Barra di Stato",
"Theme - Heartbeat Bar": "Tema (barra di stato)",
Normal: "Normale",
Bottom: "Sotto",
None: "Nessuna",
Timezone: "Fuso Orario",
"Search Engine Visibility": "Visibilità ai motori di ricerca",
"Allow indexing": "Permetti l'indicizzazione",
"Discourage search engines from indexing site": "Scoraggia l'indicizzazione da parte dei motori di ricerca",
"Change Password": "Cambio Password",
"Current Password": "Password Corrente",
"New Password": "Nuova Password",
"Repeat New Password": "Ripetere la nuova Password",
"Update Password": "Modifica Password",
"Disable Auth": "Disabilita l'autenticazione",
"Enable Auth": "Abilita Autenticazione",
"Allow indexing": "Consenti l'indicizzazione",
"Discourage search engines from indexing site": "Evita l'indicizzazione ai motori di ricerca",
"Change Password": "Cambia password",
"Current Password": "Password corrente",
"New Password": "Nuova password",
"Repeat New Password": "Ripeti nuova password",
"Update Password": "Modifica password",
"Disable Auth": "Disabilita autenticazione",
"Enable Auth": "Abilita autenticazione",
Logout: "Esci",
Leave: "Annulla",
"I understand, please disable": "Lo capisco, disabilitare l'autenticazione.",
Confirm: "Conferma",
Yes: "Sì",
No: "No",
Username: "Nome Utente",
Username: "Nome utente",
Password: "Password",
"Remember me": "Ricordami",
"Remember me": "Ricorda credenziali",
Login: "Accesso",
"No Monitors, please": "Nessun monitoraggio, cortesemente",
"add one": "aggiungerne uno",
"Notification Type": "Tipo di notifica",
"No Monitors, please": "Nessun monitor presente,",
"add one": "aggiungine uno!",
"Notification Type": "Servizio di notifica",
Email: "E-mail",
Test: "Prova",
Test: "Fai una prova",
"Certificate Info": "Informazioni sul certificato",
"Resolver Server": "Server DNS",
"Resource Record Type": "Tipo di Resource Record",
"Last Result": "Ultimo risultato",
"Create your admin account": "Crea l'account amministratore",
"Repeat Password": "Ripeti Password",
"Import Backup": "Importa Backup",
"Export Backup": "Esporta Backup",
"Repeat Password": "Ripeti password",
"Import Backup": "Importa backup",
"Export Backup": "Esporta backup",
Export: "Esporta",
Import: "Importa",
respTime: "Tempo di Risposta (ms)",
respTime: "Tempo di risposta (ms)",
notAvailableShort: "N/D",
"Default enabled": "Abilitato di default",
"Apply on all existing monitors": "Applica su tutti i monitoraggi",
@@ -130,71 +134,231 @@ export default {
"Clear Data": "Cancella dati",
Events: "Eventi",
Heartbeats: "Controlli",
"Auto Get": "Auto Get",
"Auto Get": "Rileva",
backupDescription: "È possibile fare il backup di tutti i monitoraggi e di tutte le notifiche in un file JSON.",
backupDescription2: "P.S.: lo storico e i dati relativi agli eventi non saranno inclusi.",
backupDescription3: "Dati sensibili come i token di autenticazione saranno inclusi nel backup, tenere quindi in un luogo sicuro.",
backupDescription2: "NOTA: lo storico e i dati relativi agli eventi non saranno inclusi nel backup",
backupDescription3: "Dati sensibili come i token di autenticazione saranno inclusi nel backup, custodisci il file in un luogo sicuro!",
alertNoFile: "Selezionare il file da importare.",
alertWrongFileType: "Selezionare un file JSON.",
"Clear all statistics": "Pulisci tutte le statistiche",
"Skip existing": "Ignora gli esistenti",
"Clear all statistics": "Cancella tutte le statistiche",
"Skip existing": "Ignora esistenti",
Overwrite: "Sovrascrivi",
Options: "Opzioni",
"Keep both": "Mantieni entrambi",
"Verify Token": "Verifica Token",
"Setup 2FA": "Imposta l'autenticazione a due fattori",
"Enable 2FA": "Abilita l'autenticazione a due fattori",
"Disable 2FA": "Disabilita l'autenticazione a due fattori",
"2FA Settings": "Impostazioni autenticazione a due fattori",
"Two Factor Authentication": "Autenticazione a due fattori",
"Verify Token": "Verifica token",
"Setup 2FA": "Configura 2FA",
"Enable 2FA": "Abilita 2FA",
"Disable 2FA": "Disabilita 2FA",
"2FA Settings": "Gestisci l'autenticazione a due fattori",
"Two Factor Authentication": "Autenticazione a due fattori (2FA)",
Active: "Attivata",
Inactive: "Disattivata",
Token: "Token",
"Show URI": "Mostra URI",
Tags: "Etichette",
"Add New below or Select...": "Aggiungine una oppure scegli...",
"Add New below or Select...": "Aggiungi oppure scegli...",
"Tag with this name already exist.": "Un'etichetta con questo nome già esiste.",
"Tag with this value already exist.": "Un'etichetta con questo valore già esiste.",
color: "colori",
"value (optional)": "valore (opzionale)",
color: "colore",
"value (optional)": "descrizione (opzionale)",
Gray: "Grigio",
Red: "Rosso",
Orange: "Arancione",
Green: "Verde",
Blue: "Blu",
Indigo: "Indigo",
Indigo: "Indaco",
Purple: "Viola",
Pink: "Rosa",
"Search...": "Cerca...",
"Avg. Ping": "Ping medio",
"Avg. Response": "Risposta media",
"Entry Page": "Entry Page",
statusPageNothing: "Non c'è nulla qui, aggiungere un gruppo oppure un monitoraggio.",
"No Services": "Nessun Servizio",
"All Systems Operational": "Tutti i sistemi sono operativi",
"Avg. Ping": "Tempo medio di risposta al ping",
"Avg. Response": "Tempo medio di risposta",
"Entry Page": "Pagina Principale",
statusPageNothing: "Non c'è nulla qui, aggiungi un gruppo oppure un monitor.",
"No Services": "Nessun servizio",
"All Systems Operational": "Tutti i sistemi sono funzionali",
"Partially Degraded Service": "Servizio parzialmente degradato",
"Degraded Service": "Servizio degradato",
"Add Group": "Aggiungi Gruppo",
"Add a monitor": "Aggiungi un monitoraggio",
"Add Group": "Aggiungi gruppo",
"Add a monitor": "Aggiungi monitor",
"Edit Status Page": "Modifica pagina di stato",
"Go to Dashboard": "Vai al Cruscotto",
"Status Page": "Status Page",
"Go to Dashboard": "Vai alla dashboard",
"Status Page": "Pagina di stato",
defaultNotificationName: "Notifica {notification} ({number})",
here: "qui",
Required: "Obbligatorio",
telegram: "Telegram",
"Bot Token": "Token del bot",
wayToGetTelegramToken: "Puoi ottenere il token da {0}.",
"Chat ID": "ID Chat",
supportTelegramChatID: "Supporta chat private, gruppi e canali.",
wayToGetTelegramChatID: "È possibile ricereve l'ID chat mandando un messaggio al bot e poi andando in questo URL per visualizzare il chat_id:",
"YOUR BOT TOKEN HERE": "QUI IL TOKEN DEL BOT",
chatIDNotFound: "Non trovo l'ID chat. Prima bisogna mandare un messaggio al bot",
webhook: "Webhook",
smtp: "Email (SMTP)",
"Post URL": "Post URL",
"Content Type": "Content Type",
webhookJsonDesc: "{0} va bene per qualsiasi server HTTP moderno ad esempio express.js",
webhookFormDataDesc: "{multipart} va bene per PHP, c'è solo bisogno di analizzare il json con {decodeFunction}",
smtp: "E-mail (SMTP)",
secureOptionNone: "Nessuno / STARTTLS (25, 587)",
secureOptionTLS: "TLS (465)",
"Ignore TLS Error": "Ignora gli errori TLS",
"From Email": "Mittente",
emailCustomSubject: "Oggetto personalizzato",
"To Email": "Destinatario",
smtpCC: "CC",
smtpBCC: "CCn",
discord: "Discord",
"Discord Webhook URL": "URL Webhook di Discord",
wayToGetDiscordURL: "È possibile recuperarlo da Impostazioni server -> Integrazioni -> Creare Webhook",
"Bot Display Name": "Nome del Bot",
"Prefix Custom Message": "Prefisso per il messaggio personalizzato",
"Hello @everyone is...": "Ciao a {'@'}everyone ...",
teams: "Microsoft Teams",
"Webhook URL": "URL Webhook",
wayToGetTeamsURL: "È possibile imparare a creare un URL Webhook {0}.",
signal: "Signal",
Number: "Numero",
Recipients: "Destinatari",
needSignalAPI: "È necessario avere un client Signal con le API REST.",
wayToCheckSignalURL: "Controllare questo url per capire come impostarne uno:",
signalImportant: "IMPORTANTE: Non è possibile mischiare gruppi e numeri all'interno dei destinatari!",
gotify: "Gotify",
"Application Token": "Token Applicazione",
"Server URL": "URL Server",
Priority: "Priorità",
slack: "Slack",
"Icon Emoji": "Icona Emoji",
"Channel Name": "Nome Canale",
"Uptime Kuma URL": "Indirizzo Uptime Kuma",
aboutWebhooks: "Maggiori informazioni riguardo ai webhooks su: {0}",
aboutChannelName: "Inserire il nome del canale nel campo \"Nome Canale\" {0} se si vuole bypassare il canale webhook. Ad esempio: #altro-canale",
aboutKumaURL: "Se si lascia bianco il campo Indirizzo Uptime Kuma, la pagina GitHub sarà il valore predefinito.",
emojiCheatSheet: "Lista Emoji: {0}",
"rocket.chat": "Rocket.chat",
pushover: "Pushover",
pushy: "Pushy",
octopush: "Octopush",
promosms: "PromoSMS",
clicksendsms: "ClickSend SMS",
lunasea: "LunaSea",
apprise: "Apprise (Support 50+ Notification services)",
apprise: "Apprise (Supporta più di 50 servizi di notifica)",
pushbullet: "Pushbullet",
line: "Line Messenger",
mattermost: "Mattermost",
"User Key": "Chiave Utente",
Device: "Dispositivo",
"Message Title": "Titolo Messaggio",
"Notification Sound": "Suono di Notifica",
"More info on:": "Maggiori informazioni su: {0}",
pushoverDesc1: "Priorità di Emergenza (2) ha 30 secondi di timeout tra un tentativo e l'altro e scadrà dopo un'ora.",
pushoverDesc2: "Se si vuole inviare la notifica a dispositivi differenti, riempire il campo Dispositivi.",
"SMS Type": "Tipo di SMS",
octopushTypePremium: "Premium (Veloce - raccomandato per allertare)",
octopushTypeLowCost: "A Basso Costo (Lento - talvolta bloccato dall'operatore)",
checkPrice: "Controlla {0} prezzi:",
apiCredentials: "Credenziali API",
octopushLegacyHint: "Si vuole utilizzare la vecchia versione (2011-2020) oppure la nuova versione di Octopush?",
"Check octopush prices": "Controlla i prezzi di Octopush {0}.",
octopushPhoneNumber: "Numero di telefono (formato internazionale (p.e.): +33612345678) ",
octopushSMSSender: "Nome del mittente: 3-11 caratteri alfanumerici e spazi (a-zA-Z0-9)",
"LunaSea Device ID": "ID dispositivo LunaSea",
"Apprise URL": "URL Apprise",
"Example:": "Esempio: {0}",
"Read more:": "Maggiori informazioni: {0}",
"Status:": "Stato: {0}",
"Read more": "Maggiori informazioni",
appriseInstalled: "Apprise è installato.",
appriseNotInstalled: "Apprise non è installato. {0}",
"Access Token": "Token di accesso",
"Channel access token": "Token di accesso al canale",
"Line Developers Console": "Console sviluppatori Line",
lineDevConsoleTo: "Console sviluppatori Line - {0}",
"Basic Settings": "Impostazioni Base",
"User ID": "ID Utente",
"Messaging API": "API di Messaggistica",
wayToGetLineChannelToken: "Prima accedi a {0}, crea un provider e un canale (API di Messaggistica), dopodiché puoi avere il token di accesso e l'id utente dal menù sopra.",
"Icon URL": "URL Icona",
aboutIconURL: "È possibile impostare un collegameno a una immagine in \"URL Icona\" per modificare l'immagine di profilo. Non verrà utilizzata se è impostata l'Icona Emoji.",
aboutMattermostChannelName: "È possibile modificare il canale predefinito che dove il webhook manda messaggi immettendo il nome del canale nel campo \"Nome Canale\". Questo va abilitato nelle impostazioni webhook di Mattermost webhook. P.E.: #altro-canale",
matrix: "Matrix",
promosmsTypeEco: "SMS ECO - economico, ma lento e spesso sovraccarico. Limitato solamente a destinatari Polacchi.",
promosmsTypeFlash: "SMS FLASH - Il messaggio sarà automaticamente mostrato sul dispositivo dei destinatari. Limitato solo a destinatari Polacchi.",
promosmsTypeFull: "SMS FULL - Premium, È possibile utilizzare il proprio come come mittente (è necessario prima registrare il nome). Affidabile per gli allarmi.",
promosmsTypeSpeed: "SMS SPEED - Maggior priorità. Rapido, affidabile, ma costoso (costa il doppio di SMS FULL).",
promosmsPhoneNumber: "Numero di Telefono (per destinatari Polacchi si può omettere il codice area)",
promosmsSMSSender: "Mittente SMS : Nome preregistrato oppure uno dei seguenti: InfoSMS, SMS Info, MaxSMS, INFO, SMS",
"Feishu WebHookUrl": "URL WebHook di Feishu",
matrixHomeserverURL: "URL Server (con http(s):// e opzionalmente la porta)",
"Internal Room Id": "ID Stanza Interna",
matrixDesc1: "È possibile recuperare l'ID della stanza all'interno delle impostazioni avanzate della stanza nel client Matrix. Dovrebbe essere simile a !QMdRCpUIfLwsfjxye6:server.di.casa.",
matrixDesc2: "È altamente raccomandata la creazione di un nuovo utente e di non utilizare il proprio token di accesso Matrix poiché darà pieno controllo al proprio account e a tutte le stanze in cui si ha accesso. Piuttosto, si crei un nuovo utente per invitarlo nella stanza dove si vuole ricevere le notifiche. Si può accedere al token eseguendo {0}",
Method: "Metodo",
Body: "Body",
Headers: "Intestazioni",
PushUrl: "URL di Push",
HeadersInvalidFormat: "L'intestazione di richiesta non è un JSON valido: ",
BodyInvalidFormat: "Il corpo di richiesta non è un JSON valido: ",
"Monitor History": "Storico monitor",
clearDataOlderThan: "Mantieni lo storico per {0} giorni.",
PasswordsDoNotMatch: "Le password non corrispondono!",
records: "records",
"One record": "One record",
steamApiKeyDescription: "Per monitorare un server di gioco Steam è necessaria una Web-API Key di Steam. È possibile registrarne una qui: ",
"Current User": "Utente corrente",
recent: "Recenti",
Done: "Fatto",
Info: "Info",
Security: "Sicurezza",
"Steam API Key": "API Key di Steam",
"Shrink Database": "Comprimi database",
"Pick a RR-Type...": "Scegli un tipo di RR...",
"Pick Accepted Status Codes...": "Scegli i codici di Stato Accettati...",
Default: "Predefinito",
"HTTP Options": "Opzioni HTTP",
"Create Incident": "Segnala incidente",
Title: "Titolo",
Content: "Contenuto",
Style: "Stile",
info: "informativo",
warning: "attenzione",
danger: "critico",
primary: "predefinito",
light: "chiaro",
dark: "scuro",
Post: "Posta",
"Please input title and content": "Inserire il titolo e il contenuto",
Created: "Creato",
"Last Updated": "Ultima modifica",
Unpin: "Rimuovi",
"Switch to Light Theme": "Utilizza il tema chiaro",
"Switch to Dark Theme": "Utilizza il tema scuro",
"Show Tags": "Mostra etichette",
"Hide Tags": "Nascondi etichette",
Description: "Descrizione",
"No monitors available.": "Nessun monitor disponibile.",
"Add one": "Aggiungine uno!",
"No Monitors": "Nessun monitor presente.",
"Untitled Group": "Gruppo senza titolo",
Services: "Servizi",
Discard: "Scarta modifiche",
Cancel: "Annulla",
"Powered by": "Powered by",
shrinkDatabaseDescription: "Lancia il comando \"VACUUM\" sul database SQLite. Se il database è stato creato dopo la versione 1.10.0, la funzione \"AUTO_VACUUM\" è già abilitata di default e quindi questa azione non è necessaria.",
serwersms: "SerwerSMS.pl",
serwersmsAPIUser: "Nome utente API (incl. prefisso webapi_)",
serwersmsAPIPassword: "Password API",
serwersmsPhoneNumber: "Numero di Telefono",
serwersmsSenderName: "Nome del mittente SMS (registrato via portale cliente)",
stackfield: "Stackfield",
smtpDkimSettings: "Impostazioni DKIM",
smtpDkimDesc: "Fare riferimento a Nodemailer DKIM {0} per l'utilizzo.",
documentation: "documentazione",
smtpDkimDomain: "Dominio",
smtpDkimKeySelector: "Selettore Chiave",
smtpDkimPrivateKey: "Chiave Privata",
smtpDkimHashAlgo: "Algoritmo di hashing (opzionale)",
smtpDkimheaderFieldNames: "Campi Intestazione da firmare (opzionale)",
smtpDkimskipFields: "Campi Intestazione da non firmare (opzionale)",
GoogleChat: "Google Chat (solo per Google Workspace)",
};

View File

@@ -17,7 +17,7 @@ export default {
pauseMonitorMsg: "一時停止しますか?",
Settings: "設定",
Dashboard: "ダッシュボード",
"New Update": "New Update",
"New Update": "新しいアップデート",
Language: "言語",
Appearance: "外観",
Theme: "テーマ",
@@ -53,7 +53,7 @@ export default {
Ping: "Ping",
"Monitor Type": "監視タイプ",
Keyword: "キーワード",
"Friendly Name": "Friendly Name",
"Friendly Name": "分かりやすい名前",
URL: "URL",
Hostname: "ホスト名",
Port: "ポート",
@@ -104,60 +104,60 @@ export default {
"Resolver Server": "問い合わせ先DNSサーバ",
"Resource Record Type": "DNSレコード設定",
"Last Result": "最終結果",
"Create your admin account": "Create your admin account",
"Repeat Password": "Repeat Password",
respTime: "Resp. Time (ms)",
"Create your admin account": "Adminアカウントの作成",
"Repeat Password": "パスワード確認",
respTime: "応答時間 (ms)",
notAvailableShort: "N/A",
Create: "Create",
clearEventsMsg: "Are you sure want to delete all events for this monitor?",
clearHeartbeatsMsg: "Are you sure want to delete all heartbeats for this monitor?",
confirmClearStatisticsMsg: "Are you sure want to delete ALL statistics?",
"Clear Data": "Clear Data",
Events: "Events",
Heartbeats: "Heartbeats",
"Auto Get": "Auto Get",
enableDefaultNotificationDescription: "For every new monitor this notification will be enabled by default. You can still disable the notification separately for each monitor.",
"Default enabled": "Default enabled",
"Also apply to existing monitors": "Also apply to existing monitors",
Export: "Export",
Import: "Import",
backupDescription: "You can backup all monitors and all notifications into a JSON file.",
backupDescription2: "PS: History and event data is not included.",
backupDescription3: "Sensitive data such as notification tokens is included in the export file, please keep it carefully.",
alertNoFile: "Please select a file to import.",
alertWrongFileType: "Please select a JSON file.",
twoFAVerifyLabel: "Please type in your token to verify that 2FA is working",
tokenValidSettingsMsg: "Token is valid! You can now save the 2FA settings.",
confirmEnableTwoFAMsg: "Are you sure you want to enable 2FA?",
confirmDisableTwoFAMsg: "Are you sure you want to disable 2FA?",
"Apply on all existing monitors": "Apply on all existing monitors",
"Verify Token": "Verify Token",
"Setup 2FA": "Setup 2FA",
"Enable 2FA": "Enable 2FA",
"Disable 2FA": "Disable 2FA",
"2FA Settings": "2FA Settings",
"Two Factor Authentication": "Two Factor Authentication",
Create: "作成",
clearEventsMsg: "この監視のすべての記録を削除してもよろしいですか?",
clearHeartbeatsMsg: "この監視のすべての異常記録を削除してもよろしいですか?",
confirmClearStatisticsMsg: "すべての統計を削除してもよろしいですか?",
"Clear Data": "データを削除",
Events: "統計",
Heartbeats: "異常記録",
"Auto Get": "自動取得",
enableDefaultNotificationDescription: "監視を作成するごとに、この通知方法はデフォルトで有効になります。監視ごとに通知を無効にすることもできます。",
"Default enabled": "デフォルトで有効にする",
"Also apply to existing monitors": "既存のモニターにも適用する",
Export: "エクスポート",
Import: "インポート",
backupDescription: "すべての監視と通知方法をJSONファイルにできます。",
backupDescription2: "※ 履歴と統計のデータはバックアップされません。",
backupDescription3: "通知に使用するトークンなどの機密データも含まれています。注意して扱ってください。",
alertNoFile: "インポートするファイルを選択してください。",
alertWrongFileType: "JSONファイルを選択してください。",
twoFAVerifyLabel: "トークンを入力して、2段階認証を有効にします。",
tokenValidSettingsMsg: "トークンの確認が完了しました! 「保存」をしてください。",
confirmEnableTwoFAMsg: "2段階認証を「有効」にします。よろしいですか?",
confirmDisableTwoFAMsg: "2段階認証を「無効」にします。よろしいですか?",
"Apply on all existing monitors": "既存のすべてのモニターに適用する",
"Verify Token": "認証する",
"Setup 2FA": "2段階認証の設定",
"Enable 2FA": "2段階認証を有効にする",
"Disable 2FA": "2段階認証を無効にする",
"2FA Settings": "2段階認証の設定",
"Two Factor Authentication": "2段階認証",
Active: "Active",
Inactive: "Inactive",
Token: "Token",
"Show URI": "Show URI",
"Clear all statistics": "Clear all Statistics",
"Clear all statistics": "すべての記録を削除",
retryCheckEverySecond: "Retry every {0} seconds.",
importHandleDescription: "Choose 'Skip existing' if you want to skip every monitor or notification with the same name. 'Overwrite' will delete every existing monitor and notification.",
confirmImportMsg: "Are you sure to import the backup? Please make sure you've selected the right import option.",
"Heartbeat Retry Interval": "Heartbeat Retry Interval",
"Import Backup": "Import Backup",
"Export Backup": "Export Backup",
"Skip existing": "Skip existing",
Overwrite: "Overwrite",
Options: "Options",
"Keep both": "Keep both",
Tags: "Tags",
"Add New below or Select...": "Add New below or Select...",
"Tag with this name already exist.": "Tag with this name already exist.",
"Tag with this value already exist.": "Tag with this value already exist.",
color: "color",
"value (optional)": "value (optional)",
importHandleDescription: "同じ名前のすべての監視または通知方法を上書きしない場合は、「既存のをスキップ」を選択します。 「上書きする」は、既存のすべてのモニターと通知を削除します。",
confirmImportMsg: "バックアップをインポートしてもよろしいですか?希望するオプションを選択してください。",
"Heartbeat Retry Interval": "異常検知後の再試行間隔",
"Import Backup": "バックアップのインポート",
"Export Backup": "バックアップのエクスポート",
"Skip existing": "既存のをスキップする",
Overwrite: "上書きする",
Options: "オプション",
"Keep both": "どちらも保持する",
Tags: "タグ",
"Add New below or Select...": "新規追加または選択...",
"Tag with this name already exist.": "この名前のタグはすでに存在しています。",
"Tag with this value already exist.": "この値のタグはすでに存在しています。",
color: "",
"value (optional)": " (optional)",
Gray: "Gray",
Red: "Red",
Orange: "Orange",
@@ -166,20 +166,20 @@ export default {
Indigo: "Indigo",
Purple: "Purple",
Pink: "Pink",
"Search...": "Search...",
"Avg. Ping": "Avg. Ping",
"Avg. Response": "Avg. Response",
"Entry Page": "Entry Page",
statusPageNothing: "Nothing here, please add a group or a monitor.",
"Search...": "検索...",
"Avg. Ping": "平均Ping時間",
"Avg. Response": "平均応答時間",
"Entry Page": "エントリーページ",
statusPageNothing: "ここには何もありません。グループまたは監視を追加してください。",
"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",
"All Systems Operational": "すべてのサービスが稼働中",
"Partially Degraded Service": "部分的にサービスが停止中",
"Degraded Service": "サービスが停止中",
"Add Group": "グループの追加",
"Add a monitor": "監視の追加",
"Edit Status Page": "ステータスページ編集",
"Go to Dashboard": "ダッシュボード",
"Status Page": "ステータスページ",
telegram: "Telegram",
webhook: "Webhook",
smtp: "Email (SMTP)",

View File

@@ -194,7 +194,7 @@ export default {
"Post URL": "Post URL",
"Content Type": "Content Type",
webhookJsonDesc: "{0}은 express.js와 같은 최신 HTTP 서버에 적합해요.",
webhookFormDataDesc: "{multipart}은 PHP에 적합해요. {decodeFunction}를 기준으로 json을 디코딩하면 요.",
webhookFormDataDesc: "{multipart}은 PHP에 적합해요. {decodeFunction}를 기준으로 json을 디코딩하면 되어요.",
smtp: "Email (SMTP)",
secureOptionNone: "없음 / STARTTLS (25, 587)",
secureOptionTLS: "TLS (465)",
@@ -245,7 +245,7 @@ export default {
"Message Title": "메시지 제목",
"Notification Sound": "알림음",
"More info on:": "자세한 정보: {0}",
pushoverDesc1: "긴급 우선 순위 (2)는 재시도 사이에 기본적으로 30초의 타임아웃이 있고, 1시간 후에 만료요.",
pushoverDesc1: "긴급 우선 순위 (2)는 재시도 사이에 기본적으로 30초의 타임아웃이 있고, 1시간 후에 만료되어요.",
pushoverDesc2: "다른 장치에 알림을 보내려면 장치칸을 입력해주세요.",
"SMS Type": "SMS 종류",
octopushTypePremium: "프리미엄 (빠름) - 알림 기능에 적합해요)",
@@ -270,13 +270,85 @@ export default {
"Messaging API": "Messaging API 메뉴",
wayToGetLineChannelToken: "먼저 {0}에 액세스하고, 공급자 및 채널 (Messaging API)을 만든 다음, 각 메뉴 밑에 언급된 메뉴에서 채널 액세스 토큰과 사용자 ID를 얻을 수 있어요.",
"Icon URL": "아이콘 URL",
aboutIconURL: "\"Icon URL\"에 사진 링크를 입력해 프로필 사진을 설정할 수 있어요. 아이콘 이모지가 설정되어 있으면 적용되지 않을 거예요.",
aboutIconURL: "\"아이콘 URL\"에 사진 링크를 입력해 프로필 사진을 설정할 수 있어요. 아이콘 이모지가 설정되어 있으면 적용되지 않을 거예요.",
aboutMattermostChannelName: "채널 이름을 입력하면 Webhook이 게시할 기본 채널을 재설정할 수 있어요. 이 설정은 Mattermost 웹훅 설정에서 활성화해야 해요. 예: #기타-채널",
matrix: "매트릭스",
matrix: "Matrix",
promosmsTypeEco: "SMS ECO - 저렴하지만 느리고 가끔 과부하에 걸려요. 폴란드 수신자만 사용할 수 있어요. ",
promosmsTypeFlash: "SMS FLASH - 메시지가 받는 사람 장치에 자동으로 표시요. 폴란드 수신자만 사용할 수 있어요.",
promosmsTypeFlash: "SMS FLASH - 메시지가 받는 사람 장치에 자동으로 표시되어요. 폴란드 수신자만 사용할 수 있어요.",
promosmsTypeFull: "SMS FULL - SMS 프리미엄 티어, 보내는 사람 이름을 먼저 등록해야 해요. 알림 기능에 적합해요.",
promosmsTypeSpeed: "SMS SPEED - 시스템에서 가장 높은 우선순위예요. 매우 빠르고 신뢰할 수 있지만 비용이 많이 들어요 (SMS 전체 가격의 약 두 배).",
promosmsPhoneNumber: "전화 번호 (폴란드 수신자라면 지역번호를 적지 않아도 요.)",
promosmsPhoneNumber: "전화 번호 (폴란드 수신자라면 지역번호를 적지 않아도 되어요.)",
promosmsSMSSender: "SMS 보내는 사람 이름 : 미리 등록된 이름 혹은 기본값 중 하나예요: InfoSMS, SMS Info, MaxSMS, INFO, SMS",
"Primary Base URL": "기본 URL",
"Push URL": "Push URL",
needPushEvery: "You should call this URL every {0} seconds.",
pushOptionalParams: "Optional parameters: {0}",
emailCustomSubject: "Custom Subject",
clicksendsms: "ClickSend SMS",
checkPrice: "{0} 가격 확인:",
apiCredentials: "API credentials",
octopushLegacyHint: "Octopush 레거시 버전 (2011-2020) 을 사용하시나요? 아니면 새 버전을 사용하시나요?",
"Feishu WebHookUrl": "Feishu WebHookURL",
matrixHomeserverURL: "Homeserver URL (with http(s):// and optionally port)",
"Internal Room Id": "내부 방 ID",
matrixDesc1: "Matrix 클라이언트 방 설정의 고급 섹션에서 내부 방 ID를 찾을 수 있어요. 내부 방 ID는 이렇게 생겼답니다: !QMdRCpUIfLwsfjxye6:home.server.",
matrixDesc2: "사용자의 모든 방에 대한 엑세스가 허용될 수 있어서 새로운 사용자를 만들고 원하는 방에만 초대한 후 엑세스 토큰을 사용하는 것이 좋아요. {0} 이 명령어를 통해 엑세스 토큰을 얻을 수 있어요.",
Method: "Method",
Body: "Body",
Headers: "Headers",
PushUrl: "Push URL",
HeadersInvalidFormat: "요청 Headers의 JSON 형식이 올바르지 않아요: ",
BodyInvalidFormat: "요청 Body의 JSON 형식이 올바르지 않아요: ",
"Monitor History": "모니터링 기록",
clearDataOlderThan: "모니터링 기록을 {0}일 동안 저장해요.",
PasswordsDoNotMatch: "비밀번호가 일치하지 않아요.",
records: "records",
"One record": "One record",
steamApiKeyDescription: "스팀 게임 서버를 모니터링하려면 Steam Web API 키가 필요해요. API 키는 하단 사이트에서 등록할 수 있어요: ",
"Current User": "현재 사용자",
recent: "최근",
Done: "완료",
Info: "정보",
Security: "보안",
"Steam API Key": "Steam API Key",
"Shrink Database": "데이터베이스 축소",
"Pick a RR-Type...": "RR-Type을 골라주세요...",
"Pick Accepted Status Codes...": "상태 코드를 골라주세요...",
Default: "기본",
"HTTP Options": "HTTP 옵션",
"Create Incident": "인시던트 만들기",
Title: "제목",
Content: "내용",
Style: "스타일",
info: "정보",
warning: "경고",
danger: "위험",
primary: "기본",
light: "라이트",
dark: "다크",
Post: "올리기",
"Please input title and content": "제목과 내용을 작성해주세요.",
Created: "생성 날짜",
"Last Updated": "마지막 업데이트",
Unpin: "제거",
"Switch to Light Theme": "라이트 테마로 전환",
"Switch to Dark Theme": "다크 테마로 전환",
"Show Tags": "태그 보이기",
"Hide Tags": "태그 숨기기",
Description: "설명",
"No monitors available.": "모니터링이 없어요.",
"Add one": "추가하기",
"No Monitors": "모니터링 없음",
"Untitled Group": "이름없는 그룹",
Services: "서비스",
Discard: "취소",
Cancel: "취소",
"Powered by": "Powered by",
shrinkDatabaseDescription: "SQLite 데이터베이스 VACUUM을 트리거해요. 만약 데이터베이스가 1.10.0 버전 이후에 생성되었다면 AUTO_VACUUM이 설정되어 있어 이 작업은 필요 없을 거에요.",
serwersms: "SerwerSMS.pl",
serwersmsAPIUser: "API Usename (webapi_ 접두사 포함)",
serwersmsAPIPassword: "API 비밀번호",
serwersmsPhoneNumber: "휴대전화 번호",
serwersmsSenderName: "보내는 사람 이름 (registered via customer portal)",
stackfield: "Stackfield",
};

View File

@@ -4,24 +4,24 @@ export default {
retryCheckEverySecond: "Prøv igjen hvert {0} sekund.",
retriesDescription: "Maksimalt antall forsøk før tjenesten er merket som nede og et varsel sendes",
ignoreTLSError: "Ignorer TLS/SSL-feil for HTTPS-nettsteder",
upsideDownModeDescription: "Snu statusen opp ned. Hvis tjenesten er tilgjengelig, er den NED.",
upsideDownModeDescription: "Snu statusen opp ned. Hvis tjenesten er tilgjengelig, er den NEDE.",
maxRedirectDescription: "Maksimalt antall viderekoblinger å følge. Sett til 0 for å deaktivere viderekoblinger.",
acceptedStatusCodesDescription: "Velg statuskoder som anses som et vellykket svar.",
acceptedStatusCodesDescription: "Velg statuskoder som anses som en vellykket respons.",
passwordNotMatchMsg: "Passordene stemmer ikke overens.",
notificationDescription: "Tilordne et varsel for å overvåkningen for å få det til å fungere.",
keywordDescription: "Søk etter nøkkelord i vanlig HTML eller JSON, og det er versalfølsom",
notificationDescription: "Varsler må tilordnes en overvåkning for å fungere.",
keywordDescription: "Søk etter nøkkelord i ren HTML eller JSON. Søket skiller mellom store og små bokstaver.",
pauseDashboardHome: "Pause",
deleteMonitorMsg: "Er du sikker på at du vil slette denne overvåkningen?",
deleteNotificationMsg: "Er du sikker på at du vil slette dette varselet for alle overvåkningene?",
resoverserverDescription: "Cloudflare er standardserveren, kan du når som helst endre DNS-serveren.",
resoverserverDescription: "Cloudflare er standardserveren. Du kan endre DNS-serveren når som helst.",
rrtypeDescription: "Velg RR-typen du vil overvåke",
pauseMonitorMsg: "Er du sikker på at du vil sette en pause?",
pauseMonitorMsg: "Er du sikker på at du vil sette pause?",
enableDefaultNotificationDescription: "For hver ny overvåkning vil denne varslingen være aktivert som standard. Du kan fortsatt deaktivere varselet separat for hver overvåkning.",
clearEventsMsg: "Er du sikker på at du vil slette alle hendelser for denne overvåkningen?",
clearHeartbeatsMsg: "Er du sikker på at du vil slette alle hjerteslag for denne overvåkningen?",
confirmClearStatisticsMsg: "Er du sikker på at du vil slette ALL statistikk?",
importHandleDescription: "Velg 'Hopp over eksisterende' hvis du vil hoppe over hver overvåkning eller varsel med samme navn. 'Overskriv' sletter alle eksisterende overvåkninger og varsler.",
confirmImportMsg: "Er du sikker på å importere sikkerhetskopien? Sørg for at du har valgt riktig importalternativ.",
confirmImportMsg: "Er du sikker på at du vil importere denne sikkerhetskopien? Sørg for at du har valgt riktig importalternativ.",
twoFAVerifyLabel: "Skriv inn tokenet ditt for å bekrefte at 2FA fungerer",
tokenValidSettingsMsg: "Token er gyldig! Du kan nå lagre 2FA-innstillingene.",
confirmEnableTwoFAMsg: "Er du sikker på at du vil aktivere 2FA?",
@@ -50,7 +50,7 @@ export default {
Message: "Melding",
"No important events": "Ingen viktige hendelser",
Resume: "Fortsett",
Edit: "Endre",
Edit: "Rediger",
Delete: "Slett",
Current: "Nåværende",
Uptime: "Oppetid",
@@ -77,7 +77,7 @@ export default {
"Accepted Status Codes": "Godkjente statuskoder",
Save: "Lagre",
Notifications: "Varsler",
"Not available, please setup.": "Ikke tilgjengelig, sett opp.",
"Not available, please setup.": "Ikke tilgjengelig, venligst sett opp.",
"Setup Notification": "Sett opp varsel",
Light: "Lys",
Dark: "Mørk",
@@ -87,9 +87,9 @@ export default {
Bottom: "Bunn",
None: "Ingen",
Timezone: "Tidssone",
"Search Engine Visibility": "Søkemotor synlighet",
"Search Engine Visibility": "Søkemotor-synlighet",
"Allow indexing": "Tillat indeksering",
"Discourage search engines from indexing site": "Avskrekk søkemotorer fra å indeksere nettstedet",
"Discourage search engines from indexing site": "Fraråd søkemotorer fra å indeksere nettstedet",
"Change Password": "Endre passord",
"Current Password": "Nåværende passord",
"New Password": "Nytt passord",
@@ -99,7 +99,7 @@ export default {
"Enable Auth": "Aktiver autentisering",
Logout: "Logg ut",
Leave: "Forlat",
"I understand, please disable": "Jeg forstår, deaktiver",
"I understand, please disable": "Jeg forstår, vennligst deaktiver",
Confirm: "Bekreft",
Yes: "Ja",
No: "Nei",
@@ -125,15 +125,15 @@ export default {
respTime: "Svartid (ms)",
notAvailableShort: "N/A",
"Default enabled": "Standard aktivert",
"Apply on all existing monitors": "Påfør på alle eksisterende overvåkninger",
"Apply on all existing monitors": "Anvend for alle eksisterende overvåkninger",
Create: "Opprett",
"Clear Data": "Slett data",
Events: "Hendelser",
Heartbeats: "Hjerteslag",
"Auto Get": "Auto Get",
"Auto Get": "Auto Hent",
backupDescription: "Du kan sikkerhetskopiere alle overvåkninger og alle varsler til en JSON-fil.",
backupDescription2: "PS: Historikk og hendelsesdata er ikke inkludert.",
backupDescription3: "Følsomme data som varslingstokener er inkludert i eksportfilen. Vennligst oppbevar dem nøye.",
backupDescription3: "Følsomme data som varslingstokener er inkludert i eksportfilen. Vennligst oppbevar dem sikkert.",
alertNoFile: "Velg en fil som skal importeres.",
alertWrongFileType: "Velg en JSON-fil.",
"Clear all statistics": "Fjern all statistikk",
@@ -154,7 +154,7 @@ export default {
Tags: "Etiketter",
"Add New below or Select...": "Legg til nytt nedenfor eller Velg ...",
"Tag with this name already exist.": "Etikett med dette navnet eksisterer allerede.",
"Tag with this value already exist.": "Etikett med denne verdien finnes allerede.",
"Tag with this value already exist.": "Etikett med denne verdien eksisterer allerede.",
color: "farge",
"value (optional)": "verdi (valgfritt)",
Gray: "Grå",
@@ -172,31 +172,30 @@ export default {
statusPageNothing: "Ingenting her, vennligst legg til en gruppe eller en overvåkning.",
"No Services": "Ingen tjenester",
"All Systems Operational": "Alle systemer i drift",
"Partially Degraded Service": "Delvis degradert drift",
"Degraded Service": "Degradert drift",
"Partially Degraded Service": "Delvis degradert tjeneste",
"Degraded Service": "Degradert tjeneste",
"Add Group": "Legg til gruppe",
"Add a monitor": "Legg til en overvåkning",
"Edit Status Page": "Rediger statusside",
"Go to Dashboard": "Gå til Dashboard",
"Status Page": "Statusside",
// Start notification form
defaultNotificationName: "Min {notification} varsling ({number})",
here: "here",
"Required": "Obligatorisk",
"telegram": "Telegram",
here: "her",
Required: "Obligatorisk",
telegram: "Telegram",
"Bot Token": "Bot Token",
wayToGetTelegramToken: "Du kan få et token fra {0}.",
"Chat ID": "Chat ID",
supportTelegramChatID: "Support Direct Chat / Group / Channel's Chat ID",
wayToGetTelegramChatID: "Du kan få chat-ID-en din ved å sende meldingen til boten og gå til denne nettadressen for å se chat_id:",
wayToGetTelegramChatID: "Du kan få chat-ID-en din ved å sende en melding til boten og gå til denne nettadressen for å se chat_id:",
"YOUR BOT TOKEN HERE": "DITT BOT TOKEN HER",
chatIDNotFound: "Chat-ID ble ikke funnet. Send en melding til denne boten først",
"webhook": "Webhook",
webhook: "Webhook",
"Post URL": "Post URL",
"Content Type": "Content Type",
"Content Type": "Innholdstype",
webhookJsonDesc: "{0} er bra for alle moderne HTTP-servere som express.js",
webhookFormDataDesc: "{multipart} er bra for PHP, du trenger bare å analysere JSON etter {decodeFunction}",
"smtp": "E-post (SMTP)",
webhookFormDataDesc: "{multipart} er bra for PHP. JSON trenger å bli analysert med {decodeFunction}",
smtp: "E-post (SMTP)",
secureOptionNone: "None / STARTTLS (25, 587)",
secureOptionTLS: "TLS (465)",
"Ignore TLS Error": "Ignorer TLS feilmelding",
@@ -204,26 +203,26 @@ export default {
"To Email": "Til E-post",
smtpCC: "CC",
smtpBCC: "BCC",
"discord": "Discord",
discord: "Discord",
"Discord Webhook URL": "Discord Webhook URL",
wayToGetDiscordURL: "Du kan få dette ved å gå til Serverinnstillinger -> Integrasjoner -> Webhooks -> Ny webhook",
wayToGetDiscordURL: "Du kan få denne ved å gå til Serverinnstillinger -> Integrasjoner -> Opprett en Webhook",
"Bot Display Name": "Bot Visningsnavn",
"Prefix Custom Message": "Prefiks tilpasset melding",
"Hello @everyone is...": "Hei {'@'}everyone det er...",
"teams": "Microsoft Teams",
teams: "Microsoft Teams",
"Webhook URL": "Webhook URL",
wayToGetTeamsURL: "Du kan lære hvordan du oppretter en webhook-URL {0}.",
"signal": "Signal",
"Number": "Nummer",
"Recipients": "Mottakere",
signal: "Signal",
Number: "Nummer",
Recipients: "Mottakere",
needSignalAPI: "Du må ha en Signal-klient med REST API.",
wayToCheckSignalURL: "Du kan sjekke denne nettadressen for å se hvordan du konfigurerer en:",
signalImportant: "VIKTIG: Du kan ikke blande grupper og nummere i mottakere!",
"gotify": "Gotify",
gotify: "Gotify",
"Application Token": "Application Token",
"Server URL": "Server URL",
"Priority": "Prioritet",
"slack": "Slack",
Priority: "Prioritet",
slack: "Slack",
"Icon Emoji": "Icon Emoji",
"Channel Name": "Kanal navn",
"Uptime Kuma URL": "Uptime Kuma URL",
@@ -241,44 +240,43 @@ export default {
pushbullet: "Pushbullet",
line: "Line Messenger",
mattermost: "Mattermost",
"User Key": "User Key",
"Device": "Device",
"Message Title": "Message Title",
"Notification Sound": "Notification Sound",
"More info on:": "More info on: {0}",
pushoverDesc1: "Emergency priority (2) has default 30 second timeout between retries and will expire after 1 hour.",
pushoverDesc2: "If you want to send notifications to different devices, fill out Device field.",
"User Key": "Bruker-nøkkel",
Device: "Enhet",
"Message Title": "Meldingstittel",
"Notification Sound": "Notifikasjonslyd",
"More info on:": "Mer info : {0}",
pushoverDesc1: "Nødsprioritet (2) har en standard 30 sekunders tidsavbrudd mellom forsøk og vil utløpe etter 1 time.",
pushoverDesc2: "Hvis du vil sende varsler til forskjellige enheteter, fyll ut Enhet-feltet.",
"SMS Type": "SMS Type",
octopushTypePremium: "Premium (Fast - recommended for alerting)",
octopushTypeLowCost: "Low Cost (Slow, sometimes blocked by operator)",
"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",
octopushTypePremium: "Premium (Raskt - anbefalt for varsling)",
octopushTypeLowCost: "Lav kostnad (Sakte, noen ganger blokkert av leverandør)",
"Check octopush prices": "Sjekk octopush priser {0}.",
octopushPhoneNumber: "Telefonnummer (intl format, eg : +4791234567) ",
octopushSMSSender: "SMS Avsendernavn : 3-11 alphanumeriske tegn og mellomrom (a-zA-Z0-9)",
"LunaSea Device ID": "LunaSea Enhet ID",
"Apprise URL": "Apprise URL",
"Example:": "Example: {0}",
"Read more:": "Read more: {0}",
"Example:": "Eksempel: {0}",
"Read more:": "Les mer: {0}",
"Status:": "Status: {0}",
"Read more": "Read more",
appriseInstalled: "Apprise is installed.",
appriseNotInstalled: "Apprise is not installed. {0}",
"Access Token": "Access Token",
"Channel access token": "Channel access token",
"Line Developers Console": "Line Developers Console",
lineDevConsoleTo: "Line Developers Console - {0}",
"Basic Settings": "Basic Settings",
"User ID": "User ID",
"Messaging API": "Messaging API",
wayToGetLineChannelToken: "First access the {0}, create a provider and channel (Messaging API), then you can get the channel access token and user id from the above mentioned menu items.",
"Icon URL": "Icon URL",
aboutIconURL: "You can provide a link to a picture in \"Icon URL\" to override the default profile picture. Will not be used if Icon Emoji is set.",
aboutMattermostChannelName: "You can override the default channel that webhook posts to by entering the channel name into \"Channel Name\" field. This needs to be enabled in Mattermost webhook settings. Ex: #other-channel",
"matrix": "Matrix",
promosmsTypeEco: "SMS ECO - cheap but slow and often overloaded. Limited only to Polish recipients.",
promosmsTypeFlash: "SMS FLASH - Message will automatically show on recipient device. Limited only to Polish recipients.",
promosmsTypeFull: "SMS FULL - Premium tier of SMS, You can use Your Sender Name (You need to register name first). Reliable for alerts.",
promosmsTypeSpeed: "SMS SPEED - Highest priority in system. Very quick and reliable but costly (about twice of SMS FULL price).",
promosmsPhoneNumber: "Phone number (for Polish recipient You can skip area codes)",
promosmsSMSSender: "SMS Sender Name : Pre-registred name or one of defaults: InfoSMS, SMS Info, MaxSMS, INFO, SMS",
// End notification form
"Read more": "Les mer",
appriseInstalled: "Apprise er installert.",
appriseNotInstalled: "Apprise ikke installert. {0}",
"Access Token": "Tilgangs-Token",
"Channel access token": "Kanal tilgangs-token",
"Line Developers Console": "Line Utviklserskonsoll",
lineDevConsoleTo: "Line Utviklserskonsoll - {0}",
"Basic Settings": "Grunnleggende instillinger",
"User ID": "Bruker-ID",
"Messaging API": "Meldings-API",
wayToGetLineChannelToken: "Først, få tilgang til {0}, lag en leverandør og kanal (Meldings-API), deretter kan du hente kanaltilgangs-token og bruker id fra menu-valgene nevnt over.",
"Icon URL": "Ikon URL",
aboutIconURL: "Du kan gi en link til et bilde i \"Ikon URL\" for å overskrive det standard profilbildet. Vil ikke bli brukt hvis Ikon Emoji ikke er satt.",
aboutMattermostChannelName: "Du kan overskrive standardkanalen som webhook-en poster i ved å skrive enn kanalnavnet i \"Kanalnavn\" feltet. Dette må være skrudd på i Mattermost webhook-instillingene. Eks: #other-channel",
matrix: "Matrix",
promosmsTypeEco: "SMS ECO - billig, men treg og ofte overbelastet. Begrenset til bare polske mottakere.",
promosmsTypeFlash: "SMS FLASH - Melding vil automatisk vises på mottakker-enhet. Begrenset til bare polske mottakere.",
promosmsTypeFull: "SMS FULL - Premuimnivå SMS. Du kan bruke dit avsendernavn (Du må registerere et navn først). Pålitelig for alle varslinger.",
promosmsTypeSpeed: "SMS SPEED - Høyest prioritet i systemet.Veldig rask på pålitelig, men dyrt (omtrent det dobbeltet av SMS FULL pris).",
promosmsPhoneNumber: "Telefonnummber (for polske mottakere. Du trenger ikke områdekode.)",
promosmsSMSSender: "SMS Avsendernavn : Forhåndsregistert navn eller en av standardnavnene: InfoSMS, SMS Info, MaxSMS, INFO, SMS",
};

Some files were not shown because too many files have changed in this diff Show More