Merge branch 'master' into willianrod_feat/add-favicon-badges

# Conflicts:
#	package-lock.json
#	src/mixins/socket.js
pull/835/head
Louis Lam 3 years ago
commit 04d93c2747

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

@ -1,8 +1,23 @@
name: "❓ Ask for help" name: "❓ Ask for help"
description: "Submit any question related to Uptime Kuma" description: "Submit any question related to Uptime Kuma"
title: "[Help]: <title>" #title: "[Help] "
labels: [help] labels: [help]
body: 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 - type: textarea
id: steps-to-reproduce id: steps-to-reproduce
validations: validations:
@ -14,17 +29,17 @@ body:
- type: input - type: input
id: uptime-kuma-version id: uptime-kuma-version
attributes: attributes:
label: "🐻 Uptime-Kuma version" label: "🐻 Uptime-Kuma Version"
description: "Which version of Uptime-Kuma are you running?" description: "Which version of Uptime-Kuma are you running? Please do NOT provide the docker tag such as latest or 1"
placeholder: "Ex. 1.9.x" placeholder: "Ex. 1.10.0"
validations: validations:
required: true required: true
- type: input - type: input
id: operating-system id: operating-system
attributes: attributes:
label: "💻 Operating System" label: "💻 Operating System and Arch"
description: "Which OS is your server/device running on?" description: "Which OS is your server/device running on?"
placeholder: "Ex. Ubuntu 20.04" placeholder: "Ex. Ubuntu 20.04 x86"
validations: validations:
required: true required: true
- type: input - type: input
@ -32,23 +47,15 @@ body:
attributes: attributes:
label: "🌐 Browser" label: "🌐 Browser"
description: "Which browser are you running on?" description: "Which browser are you running on?"
placeholder: "Ex. Firefox" placeholder: "Ex. Google Chrome 95.0.4638.69"
validations: validations:
required: true required: true
- type: input - type: input
id: docker-version id: docker-version
attributes: attributes:
label: "🐋 Docker" label: "🐋 Docker Version"
description: "If running with Docker, which version are you running?" description: "If running with Docker, which version are you running?"
placeholder: "Ex. 20.10.9" placeholder: "Ex. Docker 20.10.9 / K8S / Podman"
validations:
required: false
- type: input
id: docker-image-tag
attributes:
label: "🏷️ Docker Image Tag"
description: "Which Docker image tag are you using? If running '1' or 'latest', please specify image hash."
placeholder: "Ex. 1.9.1"
validations: validations:
required: false required: false
- type: input - type: input
@ -56,21 +63,6 @@ body:
attributes: attributes:
label: "🟩 NodeJS Version" label: "🟩 NodeJS Version"
description: "If running with Node.js? which version are you running?" description: "If running with Node.js? which version are you running?"
placeholder: "14.x" placeholder: "Ex. 14.18.0"
validations: validations:
required: false required: false
- type: checkboxes
id: no-duplicate-issues
attributes:
label: "👀 Have you spent some time to check if this question has been raised before?"
description: "Please search in the issues without filters [here](https://github.com/louislam/uptime-kuma/issues?q=)"
options:
- label: "I checked and didn't find similar question"
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

@ -1,8 +1,30 @@
name: "🐛 Bug Report" name: "🐛 Bug Report"
description: "Submit a bug report to help us improve" description: "Submit a bug report to help us improve"
title: "[Bug]: <title>" #title: "[Bug] "
labels: [bug] labels: [bug]
body: 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 - type: textarea
id: steps-to-reproduce id: steps-to-reproduce
validations: validations:
@ -16,7 +38,7 @@ body:
validations: validations:
required: true required: true
attributes: attributes:
label: "👍 Expected behavior" label: "👀 Expected behavior"
description: "What did you think would happen?" description: "What did you think would happen?"
placeholder: "..." placeholder: "..."
- type: textarea - type: textarea
@ -24,23 +46,23 @@ body:
validations: validations:
required: true required: true
attributes: attributes:
label: "👎 Actual Behavior" label: "😓 Actual Behavior"
description: "What actually happen?" description: "What actually happen?"
placeholder: "..." placeholder: "..."
- type: input - type: input
id: uptime-kuma-version id: uptime-kuma-version
attributes: attributes:
label: "🐻 Uptime-Kuma version" label: "🐻 Uptime-Kuma Version"
description: "Which version of Uptime-Kuma are you running?" description: "Which version of Uptime-Kuma are you running? Please do NOT provide the docker tag such as latest or 1"
placeholder: "Ex. 1.9.x" placeholder: "Ex. 1.10.0"
validations: validations:
required: true required: true
- type: input - type: input
id: operating-system id: operating-system
attributes: attributes:
label: "💻 Operating System" label: "💻 Operating System and Arch"
description: "Which OS is your server/device running on?" description: "Which OS is your server/device running on?"
placeholder: "Ex. Ubuntu 20.04" placeholder: "Ex. Ubuntu 20.04 x86"
validations: validations:
required: true required: true
- type: input - type: input
@ -48,23 +70,15 @@ body:
attributes: attributes:
label: "🌐 Browser" label: "🌐 Browser"
description: "Which browser are you running on?" description: "Which browser are you running on?"
placeholder: "Ex. Firefox" placeholder: "Ex. Google Chrome 95.0.4638.69"
validations: validations:
required: true required: true
- type: input - type: input
id: docker-version id: docker-version
attributes: attributes:
label: "🐋 Docker" label: "🐋 Docker Version"
description: "If running with Docker, which version are you running?" description: "If running with Docker, which version are you running?"
placeholder: "Ex. 20.10.9" placeholder: "Ex. Docker 20.10.9 / K8S / Podman"
validations:
required: false
- type: input
id: docker-image-tag
attributes:
label: "🏷️ Docker Image Tag"
description: "Which Docker image tag are you using? If running '1' or 'latest', please specify image hash."
placeholder: "Ex. 1.9.1"
validations: validations:
required: false required: false
- type: input - type: input
@ -72,7 +86,7 @@ body:
attributes: attributes:
label: "🟩 NodeJS Version" label: "🟩 NodeJS Version"
description: "If running with Node.js? which version are you running?" description: "If running with Node.js? which version are you running?"
placeholder: "14.x" placeholder: "Ex. 14.18.0"
validations: validations:
required: false required: false
- type: textarea - type: textarea
@ -83,18 +97,3 @@ body:
render: shell render: shell
validations: validations:
required: false required: false
- type: checkboxes
id: no-duplicate-issues
attributes:
label: "👀 Have you spent some time to check if this issue has been raised before?"
description: "Please search in the issues without filters [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

@ -1,8 +1,16 @@
name: 🚀 Feature Request name: 🚀 Feature Request
description: "Submit a proposal for a new feature" description: "Submit a proposal for a new feature"
title: "[Feature]: <title>" #title: "[Feature] "
labels: [enhancement] labels: [feature-request]
body: 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 - type: dropdown
id: feature-area id: feature-area
attributes: attributes:
@ -49,11 +57,3 @@ body:
label: "📝 Additional Context" label: "📝 Additional Context"
description: "Add any other context or screenshots about the feature request here." description: "Add any other context or screenshots about the feature request here."
placeholder: "..." placeholder: "..."
- type: checkboxes
id: no-duplicate-issues
attributes:
label: "👀 Have you spent some time to check if this feature request has been raised before?"
description: "Please search in the issues without filters [here](https://github.com/louislam/uptime-kuma/issues?q=)"
options:
- label: "I checked and didn't find similar feature request"
required: true

@ -4,10 +4,10 @@ Fixes #(issue)
## Type of change ## Type of change
Please delete options that are not relevant. Please delete any options that are not relevant.
- Bug fix (non-breaking change which fixes an issue) - Bug fix (non-breaking change which fixes an issue)
- User Interface - User interface (UI)
- New feature (non-breaking change which adds functionality) - New feature (non-breaking change which adds functionality)
- Breaking change (fix or feature that would cause existing functionality to not work as expected) - Breaking change (fix or feature that would cause existing functionality to not work as expected)
- Translation update - Translation update
@ -18,9 +18,11 @@ Please delete options that are not relevant.
- [ ] My code follows the style guidelines of this project - [ ] My code follows the style guidelines of this project
- [ ] I ran ESLint and other linters for modified files - [ ] I ran ESLint and other linters for modified files
- [ ] I have performed a self-review of my own code and test it - [ ] I have performed a self-review of my own code and tested it
- [ ] I have commented my code, particularly in hard-to-understand areas - [ ] I have commented my code, particularly in hard-to-understand areas
- [ ] My changes generate no new warnings - [ ] My changes generate no new warnings
- [ ] My code needed automated testing. I have added them (this is optional task) - [ ] My code needed automated testing. I have added them (this is optional task)
## Screenshots (if any) ## 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.

@ -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 }}

@ -1,22 +0,0 @@
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: 7
exempt-issue-labels: 'News,Medium,High,discussion,bug,doc,'
exempt-pr-labels: 'awaiting-approval,work-in-progress,enhancement,'
exempt-issue-assignees: 'louislam'
exempt-pr-assignees: 'louislam'

@ -1,8 +1,8 @@
# Project Info # 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. 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,10 +27,20 @@ The frontend code build into "dist" directory. The server (express.js) exposes t
## Can I create a pull request for Uptime Kuma? ## 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. ⚠️ 2022-03-02 Update:
If you are not sure whether I will accept your pull request, feel free to create an empty pull request draft first. Since I found that merging pull requests is a pretty heavy task for me, I try to rearrange it.
✅ Accept:
- Bug/Security fix
- Translations
- Adding notification providers
❌ Avoid:
- Large pull requests
- New big features
My long story here: https://www.reddit.com/r/UptimeKuma/comments/t1t6or/comment/hynyijx/
### Recommended Pull Request Guideline ### Recommended Pull Request Guideline
@ -44,43 +54,6 @@ If you are not sure whether I will accept your pull request, feel free to create
1. Write a proper description 1. Write a proper description
1. Click "Change to draft" 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
I do not have such knowledge to test it.
- Add k8s supports
#### ⚠ Low Priority - Harsh Mode
Some pull requests are required to modifiy 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
- Modifiy auth
#### *️⃣ Low Priority
It changed my current workflow and require further studies.
- Change my release approach
#### ❌ Won't Merge #### ❌ Won't Merge
- Any breaking changes - Any breaking changes
@ -114,7 +87,7 @@ I personally do not like something need to learn so much and need to config so m
- Node.js >= 14 - Node.js >= 14
- Git - 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) - A SQLite tool (SQLite Expert Personal is suggested)
## Install dependencies ## Install dependencies
@ -141,9 +114,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) - model/ (Object model, auto mapping to the database table name)
- modules/ (Modified 3rd-party modules) - modules/ (Modified 3rd-party modules)
- notification-providers/ (indivdual notification logic) - notification-providers/ (individual notification logic)
- routers/ (Express Routers) - routers/ (Express Routers)
- scoket-handler (Socket.io Handlers) - socket-handler (Socket.io Handlers)
- server.js (Server main logic) - server.js (Server main logic)
## How to start the Frontend Dev Server ## How to start the Frontend Dev Server
@ -201,7 +174,7 @@ ncu -u -t patch
npm install 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/)) Patch release = the third digit ([Semantic Versioning](https://semver.org/))
@ -209,46 +182,48 @@ Patch release = the third digit ([Semantic Versioning](https://semver.org/))
Please read: https://github.com/louislam/uptime-kuma/tree/master/src/languages Please read: https://github.com/louislam/uptime-kuma/tree/master/src/languages
## Wiki ## Wiki
Since there is no way to make a pull request to wiki's repo, I have set up another repo to do that. 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 https://github.com/louislam/uptime-kuma-wiki
## Maintainer ## Maintainer
Check the latest issues and pull requests: Check the latest issues and pull requests:
https://github.com/louislam/uptime-kuma/issues?q=sort%3Aupdated-desc https://github.com/louislam/uptime-kuma/issues?q=sort%3Aupdated-desc
### Release Procedures ### Release Procedures
1. Draft a release note 1. Draft a release note
1. Make sure the repo is cleared 1. Make sure the repo is cleared
1. `npm run update-version 1.X.X` 1. `npm run update-version 1.X.X`
1. `npm run build`
1. `npm run build-docker` 1. `npm run build-docker`
1. git push 1. `git push`
1. Publish the release note as 1.X.X 1. Publish the release note as 1.X.X
1. npm run upload-artifacts 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 1. SSH to demo site server and update to 1.X.X
Checking: Checking:
- Check all tags is fine on https://hub.docker.com/r/louislam/uptime-kuma/tags - 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 the Docker image with tag 1.X.X (Clean install / amd64 / arm64 / armv7)
- Try clean install with Node.js - Try clean installation with Node.js
### Release Wiki ### Release Wiki
#### Setup Repo #### Setup Repo
```
```bash
git clone https://github.com/louislam/uptime-kuma-wiki.git git clone https://github.com/louislam/uptime-kuma-wiki.git
cd uptime-kuma-wiki cd uptime-kuma-wiki
git remote add production https://github.com/louislam/uptime-kuma.wiki.git git remote add production https://github.com/louislam/uptime-kuma.wiki.git
``` ```
#### Push to Production Wiki #### Push to Production Wiki
```
```bash
git pull git pull
git push production master git push production master
``` ```

@ -17,13 +17,13 @@ Try it!
https://demo.uptime.kuma.pet 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! VPS is sponsored by Uptime Kuma sponsors on [Open Collective](https://opencollective.com/uptime-kuma)! Thank you so much!
## ⭐ Features ## ⭐ 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. * 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). * 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. * 20 second intervals.
@ -41,6 +41,8 @@ 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 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. Browse to http://localhost:3001 after starting.
### 💪🏻 Non-Docker ### 💪🏻 Non-Docker
@ -67,7 +69,7 @@ Browse to http://localhost:3001 after starting.
### Advanced Installation ### 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 https://github.com/louislam/uptime-kuma/wiki/%F0%9F%94%A7-How-to-Install
@ -87,6 +89,12 @@ Project Plan:
https://github.com/louislam/uptime-kuma/projects/1 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 ## 🖼 More Screenshots
Light Mode: Light Mode:
@ -107,7 +115,7 @@ Telegram Notification Sample:
## Motivation ## Motivation
* I was looking for a self-hosted monitoring tool like "Uptime Robot", but it is hard to find a suitable one. One of the close ones is statping. Unfortunately, it is not stable and unmaintained. * I was looking for a self-hosted monitoring tool like "Uptime Robot", but it is hard to find a suitable one. One of the close ones is statping. Unfortunately, it is not stable and no longer maintained.
* Want to build a fancy UI. * Want to build a fancy UI.
* Learn Vue 3 and vite.js. * Learn Vue 3 and vite.js.
* Show the power of Bootstrap 5. * Show the power of Bootstrap 5.
@ -120,7 +128,7 @@ If you love this project, please consider giving me a ⭐.
### Issues Page ### 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 ### Subreddit
@ -132,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 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 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. Unfortunately, English proofreading is needed too because my grammar is not that great. Feel free to correct my grammar in this README, source code, or wiki.

@ -1,5 +1,11 @@
# Security Policy # 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 ## Supported Versions
Use this section to tell people about which versions of your project are Use this section to tell people about which versions of your project are
@ -23,9 +29,3 @@ currently being supported with security updates.
| debian | :white_check_mark: | | debian | :white_check_mark: |
| alpine | :white_check_mark: | | alpine | :white_check_mark: |
| All other tags | ❌ | | 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.

@ -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;

@ -1,6 +1,20 @@
module.exports = { module.exports = {
"launch": { "launch": {
"dumpio": true,
"slowMo": 500,
"headless": process.env.HEADLESS_TEST || false, "headless": process.env.HEADLESS_TEST || false,
"userDataDir": "./data/test-chrome-profile", "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",
],
} }
}; };

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

@ -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;

@ -4,5 +4,5 @@ WORKDIR /app
# Install apprise, iputils for non-root ping, setpriv # 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 && \ 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 rm -rf /root/.cache

@ -4,9 +4,9 @@ FROM node:14-buster-slim
WORKDIR /app WORKDIR /app
# Install Apprise, add sqlite3 cli for debugging in the future, iputils-ping for ping, util-linux for setpriv # 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 && \ 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 \ 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 && \ 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/* rm -rf /var/lib/apt/lists/*

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

@ -4,9 +4,7 @@ WORKDIR /app
ENV PUPPETEER_SKIP_CHROMIUM_DOWNLOAD=1 ENV PUPPETEER_SKIP_CHROMIUM_DOWNLOAD=1
COPY . . COPY . .
RUN npm ci && \ RUN npm ci --production && \
npm run build && \
npm ci --production && \
chmod +x /app/extra/entrypoint.sh 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"] ENTRYPOINT ["/usr/bin/dumb-init", "--", "extra/entrypoint.sh"]
CMD ["node", "server/server.js"] CMD ["node", "server/server.js"]
FROM release AS nightly FROM release AS nightly
RUN npm run mark-as-nightly RUN npm run mark-as-nightly

@ -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);
}
})();

@ -1,25 +1,41 @@
/* /*
* This script should be run after a period of time (180s), because the server may need some time to prepare. * 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"; process.env.NODE_TLS_REJECT_UNAUTHORIZED = "0";
let client; 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"); client = require("https");
} else { } else {
client = require("http"); 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 = { let options = {
host: process.env.HOST || "127.0.0.1", host: hostname || "127.0.0.1",
port: parseInt(process.env.PORT) || 3001, port: port,
timeout: 28 * 1000, timeout: 28 * 1000,
}; };
let request = client.request(options, (res) => { let request = client.request(options, (res) => {
console.log(`Health Check OK [Res Code: ${res.statusCode}]`); console.log(`Health Check OK [Res Code: ${res.statusCode}]`);
if (res.statusCode === 200) { if (res.statusCode === 302) {
process.exit(0); process.exit(0);
} else { } else {
process.exit(1); process.exit(1);

@ -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,
};

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

17547
package-lock.json generated

File diff suppressed because it is too large Load Diff

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

@ -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;

@ -1,5 +1,6 @@
const { setSetting } = require("./util-server"); const { setSetting, setting } = require("./util-server");
const axios = require("axios"); const axios = require("axios");
const compareVersions = require("compare-versions");
exports.version = require("../package.json").version; exports.version = require("../package.json").version;
exports.latestVersion = null; exports.latestVersion = null;
@ -9,18 +10,30 @@ let interval;
exports.startInterval = () => { exports.startInterval = () => {
let check = async () => { let check = async () => {
try { try {
const res = await axios.get("https://raw.githubusercontent.com/louislam/uptime-kuma/master/package.json"); const res = await axios.get("https://uptime.kuma.pet/version");
if (typeof res.data === "string") {
res.data = JSON.parse(res.data);
}
// For debug // For debug
if (process.env.TEST_CHECK_VERSION === "1") { if (process.env.TEST_CHECK_VERSION === "1") {
res.data.version = "1000.0.0"; res.data.slow = "1000.0.0";
}
if (!await setting("checkUpdate")) {
return;
}
let checkBeta = await setting("checkBeta");
if (checkBeta && res.data.beta) {
if (compareVersions.compare(res.data.beta, res.data.beta, ">")) {
exports.latestVersion = res.data.beta;
return;
}
}
if (res.data.slow) {
exports.latestVersion = res.data.slow;
} }
exports.latestVersion = res.data.version;
} catch (_) { } } catch (_) { }
}; };

@ -52,6 +52,7 @@ class Database {
"patch-http-monitor-method-body-and-headers.sql": true, "patch-http-monitor-method-body-and-headers.sql": true,
"patch-2fa-invalidate-used-token.sql": true, "patch-2fa-invalidate-used-token.sql": true,
"patch-notification_sent_history.sql": true, "patch-notification_sent_history.sql": true,
"patch-monitor-basic-auth.sql": true,
} }
/** /**
@ -79,7 +80,7 @@ class Database {
console.log(`Data Dir: ${Database.dataDir}`); console.log(`Data Dir: ${Database.dataDir}`);
} }
static async connect() { static async connect(testMode = false) {
const acquireConnectionTimeout = 120 * 1000; const acquireConnectionTimeout = 120 * 1000;
const Dialect = require("knex/lib/dialects/sqlite3/index.js"); const Dialect = require("knex/lib/dialects/sqlite3/index.js");
@ -112,8 +113,13 @@ class Database {
await R.autoloadModels("./server/model"); await R.autoloadModels("./server/model");
await R.exec("PRAGMA foreign_keys = ON"); await R.exec("PRAGMA foreign_keys = ON");
if (testMode) {
// Change to MEMORY
await R.exec("PRAGMA journal_mode = MEMORY");
} else {
// Change to WAL // Change to WAL
await R.exec("PRAGMA journal_mode = WAL"); await R.exec("PRAGMA journal_mode = WAL");
}
await R.exec("PRAGMA cache_size = -12000"); await R.exec("PRAGMA cache_size = -12000");
await R.exec("PRAGMA auto_vacuum = FULL"); await R.exec("PRAGMA auto_vacuum = FULL");

@ -58,6 +58,8 @@ class Monitor extends BeanModel {
method: this.method, method: this.method,
body: this.body, body: this.body,
headers: this.headers, headers: this.headers,
basic_auth_user: this.basic_auth_user,
basic_auth_pass: this.basic_auth_pass,
hostname: this.hostname, hostname: this.hostname,
port: this.port, port: this.port,
maxretries: this.maxretries, 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 * Parse to boolean
* @returns {boolean} * @returns {boolean}
@ -108,6 +119,19 @@ class Monitor extends BeanModel {
const beat = async () => { 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 // Expose here for prometheus update
// undefined if not https // undefined if not https
let tlsInfo = undefined; let tlsInfo = undefined;
@ -141,15 +165,26 @@ class Monitor extends BeanModel {
// Do not do any queries/high loading things before the "bean.ping" // Do not do any queries/high loading things before the "bean.ping"
let startTime = dayjs().valueOf(); 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 = { const options = {
url: this.url, url: this.url,
method: (this.method || "get").toLowerCase(), method: (this.method || "get").toLowerCase(),
...(this.body ? { data: JSON.parse(this.body) } : {}), ...(this.body ? { data: JSON.parse(this.body) } : {}),
timeout: this.interval * 1000 * 0.8, timeout: this.interval * 1000 * 0.8,
headers: { 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, "User-Agent": "Uptime-Kuma/" + version,
...(this.headers ? JSON.parse(this.headers) : {}), ...(this.headers ? JSON.parse(this.headers) : {}),
...(basicAuthHeader),
}, },
httpsAgent: new https.Agent({ httpsAgent: new https.Agent({
maxCachedSessions: 0, // Use Custom agent to disable session reuse (https://github.com/nodejs/node/issues/3940) 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()); return checkStatusCode(status, this.getAcceptedStatuscodes());
}, },
}; };
debug(`[${this.name}] Axios Request`);
let res = await axios.request(options); let res = await axios.request(options);
bean.msg = `${res.status} - ${res.statusText}`; bean.msg = `${res.status} - ${res.statusText}`;
bean.ping = dayjs().valueOf() - startTime; bean.ping = dayjs().valueOf() - startTime;
@ -167,12 +204,13 @@ class Monitor extends BeanModel {
// Check certificate if https is used // Check certificate if https is used
let certInfoStartTime = dayjs().valueOf(); let certInfoStartTime = dayjs().valueOf();
if (this.getUrl()?.protocol === "https:") { if (this.getUrl()?.protocol === "https:") {
debug(`[${this.name}] Check cert`);
try { try {
let tlsInfoObject = checkCertificate(res); let tlsInfoObject = checkCertificate(res);
tlsInfo = await this.updateTlsInfo(tlsInfoObject); tlsInfo = await this.updateTlsInfo(tlsInfoObject);
if (!this.getIgnoreTls()) { if (!this.getIgnoreTls()) {
debug("call sendCertNotification"); debug(`[${this.name}] call sendCertNotification`);
await this.sendCertNotification(tlsInfoObject); await this.sendCertNotification(tlsInfoObject);
} }
@ -271,11 +309,14 @@ class Monitor extends BeanModel {
debug("heartbeatCount" + heartbeatCount + " " + time); debug("heartbeatCount" + heartbeatCount + " " + time);
if (heartbeatCount <= 0) { 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"); throw new Error("No heartbeat in the time window");
} else { } else {
// No need to insert successful heartbeat for push type, so end here // No need to insert successful heartbeat for push type, so end here
retries = 0; retries = 0;
this.heartbeatInterval = setTimeout(beat, this.interval * 1000); this.heartbeatInterval = setTimeout(beat, beatInterval * 1000);
return; return;
} }
@ -349,17 +390,19 @@ class Monitor extends BeanModel {
} }
} }
let beatInterval = this.interval; debug(`[${this.name}] Check isImportant`);
let isImportant = Monitor.isImportantBeat(isFirstBeat, previousBeat?.status, bean.status); let isImportant = Monitor.isImportantBeat(isFirstBeat, previousBeat?.status, bean.status);
// Mark as important if status changed, ignore pending pings, // Mark as important if status changed, ignore pending pings,
// Don't notify if disrupted changes to up // Don't notify if disrupted changes to up
if (isImportant) { if (isImportant) {
bean.important = true; bean.important = true;
debug(`[${this.name}] sendNotification`);
await Monitor.sendNotification(isFirstBeat, this, bean); await Monitor.sendNotification(isFirstBeat, this, bean);
// Clear Status Page Cache // Clear Status Page Cache
debug(`[${this.name}] apicache clear`);
apicache.clear(); apicache.clear();
} else { } else {
@ -377,24 +420,23 @@ class Monitor extends BeanModel {
console.warn(`Monitor #${this.id} '${this.name}': Failing: ${bean.msg} | Interval: ${beatInterval} seconds | Type: ${this.type}`); 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()); io.to(this.user_id).emit("heartbeat", bean.toJSON());
Monitor.sendStats(io, this.id, this.user_id); Monitor.sendStats(io, this.id, this.user_id);
debug(`[${this.name}] Store`);
await R.store(bean); await R.store(bean);
debug(`[${this.name}] prometheus.update`);
prometheus.update(bean, tlsInfo); prometheus.update(bean, tlsInfo);
previousBeat = bean; previousBeat = bean;
if (! this.isStop) { if (! this.isStop) {
debug(`[${this.name}] SetTimeout for next check.`);
if (demoMode) {
if (beatInterval < 20) {
console.log("beat interval too low, reset to 20s");
beatInterval = 20;
}
}
this.heartbeatInterval = setTimeout(safeBeat, beatInterval * 1000); this.heartbeatInterval = setTimeout(safeBeat, beatInterval * 1000);
} else {
console.log(`[${this.name}] isStop = true, no next check.`);
} }
}; };
@ -715,6 +757,15 @@ class Monitor extends BeanModel {
debug("No notification, no need to send cert notification"); 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; module.exports = Monitor;

@ -0,0 +1,67 @@
const NotificationProvider = require("./notification-provider");
const { DOWN, UP } = require("../../src/util");
const axios = require("axios");
class Alerta extends NotificationProvider {
name = "alerta";
async send(notification, msg, monitorJSON = null, heartbeatJSON = null) {
let okMsg = "Sent Successfully.";
try {
let alertaUrl = `${notification.alertaApiEndpoint}`;
let config = {
headers: {
"Content-Type": "application/json;charset=UTF-8",
"Authorization": "Key " + notification.alertaapiKey,
}
};
let data = {
environment: notification.alertaEnvironment,
severity: "critical",
correlate: [],
service: [ "UptimeKuma" ],
value: "Timeout",
tags: [ "uptimekuma" ],
attributes: {},
origin: "uptimekuma",
type: "exceptionAlert",
};
if (heartbeatJSON == null) {
let postData = Object.assign({
event: "msg",
text: msg,
group: "uptimekuma-msg",
resource: "Message",
}, data);
await axios.post(alertaUrl, postData, config);
} else {
let datadup = Object.assign( {
correlate: ["service_up", "service_down"],
event: monitorJSON["type"],
group: "uptimekuma-" + monitorJSON["type"],
resource: monitorJSON["name"],
}, data );
if (heartbeatJSON["status"] == DOWN) {
datadup.severity = notification.alertaAlertState; // critical
datadup.text = "Service " + monitorJSON["type"] + " is down.";
await axios.post(alertaUrl, datadup, config);
} else if (heartbeatJSON["status"] == UP) {
datadup.severity = notification.alertaRecoverState; // cleaned
datadup.text = "Service " + monitorJSON["type"] + " is up.";
await axios.post(alertaUrl, datadup, config);
}
}
return okMsg;
} catch (error) {
this.throwGeneralAxiosError(error);
}
}
}
module.exports = Alerta;

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

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

@ -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;

@ -0,0 +1,42 @@
const NotificationProvider = require("./notification-provider");
const axios = require("axios");
class Gorush extends NotificationProvider {
name = "gorush";
async send(notification, msg, monitorJSON = null, heartbeatJSON = null) {
let okMsg = "Sent Successfully.";
let platformMapping = {
"ios": 1,
"android": 2,
"huawei": 3,
};
try {
let data = {
"notifications": [
{
"tokens": [notification.gorushDeviceToken],
"platform": platformMapping[notification.gorushPlatform],
"message": msg,
// Optional
"title": notification.gorushTitle,
"priority": notification.gorushPriority,
"retry": parseInt(notification.gorushRetry) || 0,
"topic": notification.gorushTopic,
}
]
};
let config = {};
await axios.post(`${notification.gorushServerURL}/api/push`, data, config);
return okMsg;
} catch (error) {
this.throwGeneralAxiosError(error);
}
}
}
module.exports = Gorush;

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

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

@ -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;

@ -14,8 +14,20 @@ class SMTP extends NotificationProvider {
secure: notification.smtpSecure, secure: notification.smtpSecure,
tls: { tls: {
rejectUnauthorized: notification.smtpIgnoreTLSError || false, 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 // Should fix the issue in https://github.com/louislam/uptime-kuma/issues/26#issuecomment-896373904
if (notification.smtpUsername || notification.smtpPassword) { if (notification.smtpUsername || notification.smtpPassword) {

@ -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;

@ -0,0 +1,23 @@
const NotificationProvider = require("./notification-provider");
const axios = require("axios");
class TechulusPush extends NotificationProvider {
name = "PushByTechulus";
async send(notification, msg, monitorJSON = null, heartbeatJSON = null) {
let okMsg = "Sent Successfully.";
try {
await axios.post(`https://push.techulus.com/api/v1/notify/${notification.pushAPIKey}`, {
"title": "Uptime-Kuma",
"body": msg,
})
return okMsg;
} catch (error) {
this.throwGeneralAxiosError(error)
}
}
}
module.exports = TechulusPush;

@ -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;

@ -12,6 +12,7 @@ const ClickSendSMS = require("./notification-providers/clicksendsms");
const Pushbullet = require("./notification-providers/pushbullet"); const Pushbullet = require("./notification-providers/pushbullet");
const Pushover = require("./notification-providers/pushover"); const Pushover = require("./notification-providers/pushover");
const Pushy = require("./notification-providers/pushy"); const Pushy = require("./notification-providers/pushy");
const TechulusPush = require("./notification-providers/techulus-push");
const RocketChat = require("./notification-providers/rocket-chat"); const RocketChat = require("./notification-providers/rocket-chat");
const Signal = require("./notification-providers/signal"); const Signal = require("./notification-providers/signal");
const Slack = require("./notification-providers/slack"); const Slack = require("./notification-providers/slack");
@ -23,6 +24,12 @@ const Feishu = require("./notification-providers/feishu");
const AliyunSms = require("./notification-providers/aliyun-sms"); const AliyunSms = require("./notification-providers/aliyun-sms");
const DingDing = require("./notification-providers/dingding"); const DingDing = require("./notification-providers/dingding");
const Bark = require("./notification-providers/bark"); 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");
const Gorush = require("./notification-providers/gorush");
const Alerta = require("./notification-providers/alerta");
class Notification { class Notification {
@ -51,6 +58,7 @@ class Notification {
new Pushbullet(), new Pushbullet(),
new Pushover(), new Pushover(),
new Pushy(), new Pushy(),
new TechulusPush(),
new RocketChat(), new RocketChat(),
new Signal(), new Signal(),
new Slack(), new Slack(),
@ -58,6 +66,12 @@ class Notification {
new Telegram(), new Telegram(),
new Webhook(), new Webhook(),
new Bark(), new Bark(),
new SerwerSMS(),
new Stackfield(),
new WeCom(),
new GoogleChat(),
new Gorush(),
new Alerta(),
]; ];
for (let item of list) { for (let item of list) {

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

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

@ -31,12 +31,7 @@ router.get("/api/push/:pushToken", async (request, response) => {
throw new Error("Monitor not found or not active."); throw new Error("Monitor not found or not active.");
} }
const previousHeartbeat = await R.getRow(` const previousHeartbeat = await Monitor.getPreviousHeartbeat(monitor.id);
SELECT status, time FROM heartbeat
WHERE id = (select MAX(id) from heartbeat where monitor_id = ?)
`, [
monitor.id
]);
let status = UP; let status = UP;
if (monitor.isUpsideDown()) { if (monitor.isUpsideDown()) {
@ -101,6 +96,10 @@ router.get("/api/status-page/config", async (_request, response) => {
config.statusPagePublished = true; config.statusPagePublished = true;
} }
if (! config.statusPageTags) {
config.statusPageTags = false;
}
if (! config.title) { if (! config.title) {
config.title = "Uptime Kuma"; config.title = "Uptime Kuma";
} }
@ -140,10 +139,28 @@ router.get("/api/status-page/monitor-list", cache("5 minutes"), async (_request,
try { try {
await checkPublished(); await checkPublished();
const publicGroupList = []; 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) { 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); response.json(publicGroupList);

@ -1,4 +1,15 @@
console.log("Welcome to Uptime Kuma"); 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 args = require("args-parser")(process.argv);
const { sleep, debug, getRandomInt, genSecret } = require("../src/util"); const { sleep, debug, getRandomInt, genSecret } = require("../src/util");
const config = require("./config"); const config = require("./config");
@ -120,6 +131,7 @@ module.exports.io = io;
const { sendNotificationList, sendHeartbeatList, sendImportantHeartbeatList, sendInfo } = require("./client"); const { sendNotificationList, sendHeartbeatList, sendImportantHeartbeatList, sendInfo } = require("./client");
const { statusPageSocketHandler } = require("./socket-handlers/status-page-socket-handler"); const { statusPageSocketHandler } = require("./socket-handlers/status-page-socket-handler");
const databaseSocketHandler = require("./socket-handlers/database-socket-handler"); const databaseSocketHandler = require("./socket-handlers/database-socket-handler");
const TwoFA = require("./2fa");
app.use(express.json()); app.use(express.json());
@ -176,7 +188,7 @@ exports.entryPage = "dashboard";
(async () => { (async () => {
Database.init(args); Database.init(args);
await initDatabase(); await initDatabase(testMode);
exports.entryPage = await setting("entryPage"); exports.entryPage = await setting("entryPage");
@ -186,6 +198,15 @@ exports.entryPage = "dashboard";
// Normal Router here // Normal Router here
// *************************** // ***************************
// Entry Page
app.get("/", async (_request, response) => {
if (exports.entryPage === "statusPage") {
response.redirect("/status");
} else {
response.redirect("/dashboard");
}
});
// Robots.txt // Robots.txt
app.get("/robots.txt", async (_request, response) => { app.get("/robots.txt", async (_request, response) => {
let txt = "User-agent: *\nDisallow:"; let txt = "User-agent: *\nDisallow:";
@ -291,9 +312,8 @@ exports.entryPage = "dashboard";
let user = await login(data.username, data.password); let user = await login(data.username, data.password);
if (user) { if (user) {
afterLogin(socket, user);
if (user.twofa_status == 0) { if (user.twofa_status == 0) {
afterLogin(socket, user);
callback({ callback({
ok: true, ok: true,
token: jwt.sign({ token: jwt.sign({
@ -312,6 +332,7 @@ exports.entryPage = "dashboard";
let verify = notp.totp.verify(data.token, user.twofa_secret, twofa_verification_opts); let verify = notp.totp.verify(data.token, user.twofa_secret, twofa_verification_opts);
if (user.twofa_last_token !== data.token && verify) { if (user.twofa_last_token !== data.token && verify) {
afterLogin(socket, user);
await R.exec("UPDATE `user` SET twofa_last_token = ? WHERE id = ? ", [ await R.exec("UPDATE `user` SET twofa_last_token = ? WHERE id = ? ", [
data.token, data.token,
@ -411,10 +432,7 @@ exports.entryPage = "dashboard";
socket.on("disable2FA", async (callback) => { socket.on("disable2FA", async (callback) => {
try { try {
checkLogin(socket); checkLogin(socket);
await TwoFA.disable2FA(socket.userID);
await R.exec("UPDATE `user` SET twofa_status = 0 WHERE id = ? ", [
socket.userID,
]);
callback({ callback({
ok: true, ok: true,
@ -532,8 +550,8 @@ exports.entryPage = "dashboard";
await updateMonitorNotification(bean.id, notificationIDList); await updateMonitorNotification(bean.id, notificationIDList);
await startMonitor(socket.userID, bean.id);
await sendMonitorList(socket); await sendMonitorList(socket);
await startMonitor(socket.userID, bean.id);
callback({ callback({
ok: true, ok: true,
@ -566,6 +584,8 @@ exports.entryPage = "dashboard";
bean.method = monitor.method; bean.method = monitor.method;
bean.body = monitor.body; bean.body = monitor.body;
bean.headers = monitor.headers; 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.interval = monitor.interval;
bean.retryInterval = monitor.retryInterval; bean.retryInterval = monitor.retryInterval;
bean.hostname = monitor.hostname; bean.hostname = monitor.hostname;
@ -1130,6 +1150,8 @@ exports.entryPage = "dashboard";
method: monitorListData[i].method || "GET", method: monitorListData[i].method || "GET",
body: monitorListData[i].body, body: monitorListData[i].body,
headers: monitorListData[i].headers, headers: monitorListData[i].headers,
basic_auth_user: monitorListData[i].basic_auth_user,
basic_auth_pass: monitorListData[i].basic_auth_pass,
interval: monitorListData[i].interval, interval: monitorListData[i].interval,
retryInterval: retryInterval, retryInterval: retryInterval,
hostname: monitorListData[i].hostname, hostname: monitorListData[i].hostname,
@ -1408,14 +1430,14 @@ async function getMonitorJSONList(userID) {
return result; return result;
} }
async function initDatabase() { async function initDatabase(testMode = false) {
if (! fs.existsSync(Database.path)) { if (! fs.existsSync(Database.path)) {
console.log("Copying Database"); console.log("Copying Database");
fs.copyFileSync(Database.templatePath, Database.path); fs.copyFileSync(Database.templatePath, Database.path);
} }
console.log("Connecting to the Database"); console.log("Connecting to the Database");
await Database.connect(); await Database.connect(testMode);
console.log("Connected"); console.log("Connected");
// Patch the database // Patch the database

@ -16,6 +16,7 @@ exports.WIN = /^win/.test(process.platform);
exports.LIN = /^linux/.test(process.platform); exports.LIN = /^linux/.test(process.platform);
exports.MAC = /^darwin/.test(process.platform); exports.MAC = /^darwin/.test(process.platform);
exports.FBSD = /^freebsd/.test(process.platform); exports.FBSD = /^freebsd/.test(process.platform);
exports.BSD = /bsd$/.test(process.platform);
/** /**
* Init or reset JWT secret * Init or reset JWT secret
@ -201,8 +202,13 @@ const getDaysRemaining = (validFrom, validTo) => {
// param: info - the chain obtained from getPeerCertificate() // param: info - the chain obtained from getPeerCertificate()
const parseCertificateInfo = function (info) { const parseCertificateInfo = function (info) {
let link = info; let link = info;
let i = 0;
const existingList = {};
while (link) { while (link) {
debug(`[${i}] ${link.fingerprint}`);
if (!link.valid_from || !link.valid_to) { if (!link.valid_from || !link.valid_to) {
break; break;
} }
@ -210,15 +216,24 @@ const parseCertificateInfo = function (info) {
link.validFor = link.subjectaltname?.replace(/DNS:|IP Address:/g, "").split(", "); link.validFor = link.subjectaltname?.replace(/DNS:|IP Address:/g, "").split(", ");
link.daysRemaining = getDaysRemaining(new Date(), link.validTo); link.daysRemaining = getDaysRemaining(new Date(), link.validTo);
existingList[link.fingerprint] = true;
// Move up the chain until loop is encountered // Move up the chain until loop is encountered
if (link.issuerCertificate == null) { if (link.issuerCertificate == null) {
break; break;
} else if (link.fingerprint == link.issuerCertificate.fingerprint) { } else if (link.issuerCertificate.fingerprint in existingList) {
debug(`[Last] ${link.issuerCertificate.fingerprint}`);
link.issuerCertificate = null; link.issuerCertificate = null;
break; break;
} else { } else {
link = link.issuerCertificate; 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; return info;
@ -228,6 +243,7 @@ exports.checkCertificate = function (res) {
const info = res.request.res.socket.getPeerCertificate(true); const info = res.request.res.socket.getPeerCertificate(true);
const valid = res.request.res.socket.authorized || false; const valid = res.request.res.socket.authorized || false;
debug("Parsing Certificate Info");
const parsedInfo = parseCertificateInfo(info); const parsedInfo = parseCertificateInfo(info);
return { return {

@ -156,6 +156,11 @@ textarea.form-control {
.form-check-input { .form-check-input {
background-color: $dark-bg2; background-color: $dark-bg2;
border-color: $dark-border-color;
}
.form-check-input:checked {
border-color: $primary; // Re-apply bootstrap border
} }
.form-switch .form-check-input { .form-switch .form-check-input {
@ -189,7 +194,7 @@ textarea.form-control {
opacity: 1; opacity: 1;
} }
.table-hover > tbody > tr:hover { .table-hover > tbody > tr:hover > * {
--bs-table-accent-bg: #070a10; --bs-table-accent-bg: #070a10;
color: $dark-font-color; color: $dark-font-color;
} }
@ -313,6 +318,20 @@ textarea.form-control {
opacity: 0; 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 { .monitor-list {
&.scrollbar { &.scrollbar {
min-height: calc(100vh - 240px); min-height: calc(100vh - 240px);
@ -346,6 +365,10 @@ textarea.form-control {
&.active { &.active {
background-color: #cdf8f4; background-color: #cdf8f4;
} }
.tags {
// Removes margin to line up tags list with uptime percentage
margin-left: -0.25rem;
}
} }
} }

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

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

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

@ -85,7 +85,9 @@ export default {
model: null, model: null,
processing: false, processing: false,
id: null, id: null,
notificationTypes: Object.keys(NotificationFormList), notificationTypes: Object.keys(NotificationFormList).sort((a, b) => {
return a.toLowerCase().localeCompare(b.toLowerCase());
}),
notification: { notification: {
name: "", name: "",
/** @type { null | keyof NotificationFormList } */ /** @type { null | keyof NotificationFormList } */
@ -143,12 +145,9 @@ export default {
this.id = null; this.id = null;
this.notification = { this.notification = {
name: "", name: "",
type: null, type: "telegram",
isDefault: false, isDefault: false,
}; };
// Set Default value here
this.notification.type = this.notificationTypes[0];
} }
this.modal.show(); this.modal.show();

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

@ -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>

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

@ -0,0 +1,14 @@
<template>
<div class="mb-3">
<label for="alerta-api-endpoint" class="form-label">{{ $t("alertaApiEndpoint") }}</label>
<input id="alerta-api-endpoint" v-model="$parent.notification.alertaApiEndpoint" type="text" class="form-control" required>
<label for="alerta-environment" class="form-label">{{ $t("alertaEnvironment") }}</label>
<input id="alerta-environment" v-model="$parent.notification.alertaEnvironment" type="text" class="form-control" required>
<label for="alerta-api-key" class="form-label">{{ $t("alertaApiKey") }}</label>
<input id="alerta-api-key" v-model="$parent.notification.alertaApiKey" type="text" class="form-control" required>
<label for="alerta-alert-state" class="form-label">{{ $t("alertaAlertState") }}</label>
<input id="alerta-alert-state" v-model="$parent.notification.alertaAlertState" type="text" class="form-control" placeholder="critical" required>
<label for="alerta-recover-state" class="form-label">{{ $t("alertaRecoverState") }}</label>
<input id="alerta-recover-state" v-model="$parent.notification.alertaRecoverState" type="text" class="form-control" placeholder="cleared" required>
</div>
</template>

@ -6,7 +6,7 @@
<label for="secretAccessKey" class="form-label">{{ $t("SecretAccessKey") }}<span style="color: red;"><sup>*</sup></span></label> <label for="secretAccessKey" class="form-label">{{ $t("SecretAccessKey") }}<span style="color: red;"><sup>*</sup></span></label>
<input id="secretAccessKey" v-model="$parent.notification.secretAccessKey" type="text" class="form-control" required> <input id="secretAccessKey" v-model="$parent.notification.secretAccessKey" type="text" class="form-control" required>
<label for="phonenumber" class="form-label">{{ $t("Phonenumber") }}<span style="color: red;"><sup>*</sup></span></label> <label for="phonenumber" class="form-label">{{ $t("PhoneNumbers") }}<span style="color: red;"><sup>*</sup></span></label>
<input id="phonenumber" v-model="$parent.notification.phonenumber" type="text" class="form-control" required> <input id="phonenumber" v-model="$parent.notification.phonenumber" type="text" class="form-control" required>
<label for="templateCode" class="form-label">{{ $t("TemplateCode") }}<span style="color: red;"><sup>*</sup></span></label> <label for="templateCode" class="form-label">{{ $t("TemplateCode") }}<span style="color: red;"><sup>*</sup></span></label>
@ -16,7 +16,7 @@
<input id="signName" v-model="$parent.notification.signName" type="text" class="form-control" required> <input id="signName" v-model="$parent.notification.signName" type="text" class="form-control" required>
<div class="form-text"> <div class="form-text">
<p>Sms template must contain parameters: <br> <code>${name} ${time} ${status} ${msg}</code></p> <p>{{ $t("Sms template must contain parameters: ") }}<br> <code>${name} ${time} ${status} ${msg}</code></p>
<i18n-t tag="p" keypath="Read more:"> <i18n-t tag="p" keypath="Read more:">
<a href="https://help.aliyun.com/document_detail/101414.html" target="_blank">https://help.aliyun.com/document_detail/101414.html</a> <a href="https://help.aliyun.com/document_detail/101414.html" target="_blank">https://help.aliyun.com/document_detail/101414.html</a>
</i18n-t> </i18n-t>

@ -3,7 +3,7 @@
<label for="clicksendsms-login" class="form-label">API Username</label> <label for="clicksendsms-login" class="form-label">API Username</label>
<div class="form-text"> <div class="form-text">
{{ $t("apiCredentials") }} {{ $t("apiCredentials") }}
<a href="http://dashboard.clicksend.com/account/subaccounts" target="_blank">here</a> <a href="http://dashboard.clicksend.com/account/subaccounts" target="_blank">{{ $t("here") }}</a>
</div> </div>
<input id="clicksendsms-login" v-model="$parent.notification.clicksendsmsLogin" type="text" class="form-control" required> <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> <label for="clicksendsms-key" class="form-label">API Key</label>

@ -7,9 +7,9 @@
<input id="secretKey" v-model="$parent.notification.secretKey" type="text" class="form-control" required> <input id="secretKey" v-model="$parent.notification.secretKey" type="text" class="form-control" required>
<div class="form-text"> <div class="form-text">
<p>For safety, must use secret key</p> <p>{{ $t("For safety, must use secret key") }}</p>
<i18n-t tag="p" keypath="Read more:"> <i18n-t tag="p" keypath="Read more:">
<a href="https://developers.dingtalk.com/document/robots/custom-robot-access" target="_blank">https://developers.dingtalk.com/document/robots/custom-robot-access</a> <a href="https://developers.dingtalk.com/document/robots/custom-robot-access" target="_blank">https://developers.dingtalk.com/document/robots/custom-robot-access</a> <a href="https://open.dingtalk.com/document/robots/customize-robot-security-settings#title-7fs-kgs-36x" target="_blank">https://open.dingtalk.com/document/robots/customize-robot-security-settings#title-7fs-kgs-36x</a>
</i18n-t> </i18n-t>
</div> </div>
</div> </div>

@ -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>

@ -0,0 +1,51 @@
<template>
<div class="mb-3">
<label for="gorush-device-token" class="form-label">{{ $t("Device Token") }}</label><span style="color: red;"><sup>*</sup></span>
<div class="input-group mb-3">
<input id="gorush-device-token" v-model="$parent.notification.gorushDeviceToken" type="text" class="form-control" required>
</div>
</div>
<div class="mb-3">
<label for="gorush-server-url" class="form-label">{{ $t("Server URL") }}</label><span style="color: red;"><sup>*</sup></span>
<div class="input-group mb-3">
<input id="gorush-server-url" v-model="$parent.notification.gorushServerURL" type="text" class="form-control" required>
</div>
</div>
<div class="mb-3">
<label for="gorush-platform" class="form-label">{{ $t("Platform") }}</label><span style="color: red;"><sup>*</sup></span>
<select id="gorush-platform" v-model="$parent.notification.gorushPlatform" class="form-select">
<option value="ios">{{ $t("iOS") }}</option>
<option value="android">{{ $t("Android") }}</option>
<option value="huawei">{{ $t("Huawei") }}</option>
</select>
</div>
<div class="mb-3">
<label for="gorush-title" class="form-label">{{ $t("Title") }}</label>
<input id="gorush-title" v-model="$parent.notification.gorushTitle" type="text" class="form-control">
</div>
<div class="mb-3">
<label for="gorush-priority" class="form-label">{{ $t("Priority") }}</label>
<select id="gorush-priority" v-model="$parent.notification.gorushPriority" class="form-select">
<option value="normal">{{ $t("Normal") }}</option>
<option value="high">{{ $t("High") }}</option>
</select>
</div>
<div class="mb-3">
<label for="gorush-retry" class="form-label">{{ $t("Retry") }}</label>
<input id="gorush-retry" v-model="$parent.notification.gorushRetry" type="number" class="form-control">
</div>
<div class="mb-3">
<label for="gorush-topic" class="form-label">{{ $t("Topic") }}</label>
<input id="gorush-topic" v-model="$parent.notification.gorushTopic" type="text" class="form-control">
</div>
<div class="form-text">
<span style="color: red;"><sup>*</sup></span>{{ $t("Required") }}
</div>
</template>

@ -1,4 +1,5 @@
<template> <template>
<div>
<div class="mb-3"> <div class="mb-3">
<label for="hostname" class="form-label">{{ $t("Hostname") }}</label> <label for="hostname" class="form-label">{{ $t("Hostname") }}</label>
<input id="hostname" v-model="$parent.notification.smtpHost" type="text" class="form-control" required> <input id="hostname" v-model="$parent.notification.smtpHost" type="text" class="form-control" required>
@ -10,7 +11,7 @@
</div> </div>
<div class="mb-3"> <div class="mb-3">
<label for="secure" class="form-label">Secure</label> <label for="secure" class="form-label">{{ $t("Security") }}</label>
<select id="secure" v-model="$parent.notification.smtpSecure" class="form-select"> <select id="secure" v-model="$parent.notification.smtpSecure" class="form-select">
<option :value="false">{{ $t("secureOptionNone") }}</option> <option :value="false">{{ $t("secureOptionNone") }}</option>
<option :value="true">{{ $t("secureOptionTLS") }}</option> <option :value="true">{{ $t("secureOptionTLS") }}</option>
@ -58,6 +59,37 @@
<input id="to-bcc" v-model="$parent.notification.smtpBCC" type="text" class="form-control" autocomplete="false" :required="!hasRecipient"> <input id="to-bcc" v-model="$parent.notification.smtpBCC" type="text" class="form-control" autocomplete="false" :required="!hasRecipient">
</div> </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"> <div class="mb-3">
<label for="subject-email" class="form-label">{{ $t("emailCustomSubject") }}</label> <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=""> <input id="subject-email" v-model="$parent.notification.customSubject" type="text" class="form-control" autocomplete="false" placeholder="">
@ -69,14 +101,17 @@
{{STATUS}}: Status<br /> {{STATUS}}: Status<br />
</div> </div>
</div> </div>
</div>
</template> </template>
<script> <script>
import HiddenInput from "../HiddenInput.vue"; import HiddenInput from "../HiddenInput.vue";
import ToggleSection from "../ToggleSection.vue";
export default { export default {
components: { components: {
HiddenInput, HiddenInput,
ToggleSection,
}, },
computed: { computed: {
hasRecipient() { hasRecipient() {

@ -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>

@ -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>

@ -0,0 +1,20 @@
<template>
<div class="mb-3">
<label for="push-api-key" class="form-label">API_KEY</label>
<HiddenInput id="push-api-key" v-model="$parent.notification.pushAPIKey" :required="true" autocomplete="one-time-code"></HiddenInput>
</div>
<i18n-t tag="p" keypath="More info on:" style="margin-top: 8px;">
<a href="https://docs.push.techulus.com" target="_blank">https://docs.push.techulus.com</a>
</i18n-t>
</template>
<script>
import HiddenInput from "../HiddenInput.vue";
export default {
components: {
HiddenInput,
},
};
</script>

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

@ -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>

@ -1,4 +1,4 @@
import STMP from "./SMTP.vue" import STMP from "./SMTP.vue";
import Telegram from "./Telegram.vue"; import Telegram from "./Telegram.vue";
import Discord from "./Discord.vue"; import Discord from "./Discord.vue";
import Webhook from "./Webhook.vue"; import Webhook from "./Webhook.vue";
@ -9,6 +9,7 @@ import RocketChat from "./RocketChat.vue";
import Teams from "./Teams.vue"; import Teams from "./Teams.vue";
import Pushover from "./Pushover.vue"; import Pushover from "./Pushover.vue";
import Pushy from "./Pushy.vue"; import Pushy from "./Pushy.vue";
import TechulusPush from "./TechulusPush.vue";
import Octopush from "./Octopush.vue"; import Octopush from "./Octopush.vue";
import PromoSMS from "./PromoSMS.vue"; import PromoSMS from "./PromoSMS.vue";
import ClickSendSMS from "./ClickSendSMS.vue"; import ClickSendSMS from "./ClickSendSMS.vue";
@ -22,6 +23,12 @@ import Matrix from "./Matrix.vue";
import AliyunSMS from "./AliyunSms.vue"; import AliyunSMS from "./AliyunSms.vue";
import DingDing from "./DingDing.vue"; import DingDing from "./DingDing.vue";
import Bark from "./Bark.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";
import Gorush from "./Gorush.vue";
import Alerta from "./Alerta.vue";
/** /**
* Manage all notification form. * Manage all notification form.
@ -40,6 +47,7 @@ const NotificationFormList = {
"rocket.chat": RocketChat, "rocket.chat": RocketChat,
"pushover": Pushover, "pushover": Pushover,
"pushy": Pushy, "pushy": Pushy,
"PushByTechulus": TechulusPush,
"octopush": Octopush, "octopush": Octopush,
"promosms": PromoSMS, "promosms": PromoSMS,
"clicksendsms": ClickSendSMS, "clicksendsms": ClickSendSMS,
@ -52,7 +60,13 @@ const NotificationFormList = {
"mattermost": Mattermost, "mattermost": Mattermost,
"matrix": Matrix, "matrix": Matrix,
"DingDing": DingDing, "DingDing": DingDing,
"Bark": Bark "Bark": Bark,
} "serwersms": SerwerSMS,
"stackfield": Stackfield,
"WeCom": WeCom,
"GoogleChat": GoogleChat,
"gorush": Gorush,
"alerta": Alerta,
};
export default NotificationFormList export default NotificationFormList;

@ -0,0 +1,50 @@
<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-3 update-link"><a href="https://github.com/louislam/uptime-kuma/releases" target="_blank" rel="noopener">{{ $t("Check Update On GitHub") }}</a></div>
<div class="mt-1">
<div class="form-check">
<label><input v-model="settings.checkUpdate" type="checkbox" @change="saveSettings()" /> Show update if available</label>
</div>
<div class="form-check">
<label><input v-model="settings.checkBeta" type="checkbox" :disabled="!settings.checkUpdate" @change="saveSettings()" /> Also check beta release</label>
</div>
</div>
</div>
</div>
</template>
<script>
export default {
computed: {
settings() {
return this.$parent.$parent.$parent.settings;
},
saveSettings() {
return this.$parent.$parent.$parent.saveSettings;
},
settingsLoaded() {
return this.$parent.$parent.$parent.settingsLoaded;
},
},
watch: {
}
};
</script>
<style lang="scss" scoped>
.logo {
margin: 4em 1em;
}
.update-link {
font-size: 0.9em;
}
</style>

@ -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>

@ -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>

@ -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>

@ -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>

@ -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>

@ -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>

@ -1,62 +1,47 @@
import { createI18n } from "vue-i18n/index"; import { createI18n } from "vue-i18n/index";
import daDK from "./languages/da-DK";
import deDE from "./languages/de-DE";
import en from "./languages/en"; 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 hrHR from "./languages/hr-HR";
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 vi from "./languages/vi";
import zhCN from "./languages/zh-CN";
import zhHK from "./languages/zh-HK";
import zhTW from "./languages/zh-TW";
const languageList = { const languageList = {
"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, 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,
"hr-HR": hrHR,
"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,
"vi": vi,
"zh-TW": zhTW
}; };
for (let lang in languageList) {
messages[lang] = {
languageName: languageList[lang]
};
}
const rtlLangs = ["fa"]; const rtlLangs = ["fa"];
export const currentLocale = () => localStorage.locale export const currentLocale = () => localStorage.locale
@ -73,5 +58,5 @@ export const i18n = createI18n({
fallbackLocale: "en", fallbackLocale: "en",
silentFallbackWarn: true, silentFallbackWarn: true,
silentTranslationWarn: true, silentTranslationWarn: true,
messages: languageList, messages: messages,
}); });

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

@ -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 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. 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. 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"`). 5. Translate `src/components/settings/Security.vue` (search for a `Confirm` component with `rel="confirmDisableAuth"`).
6. Import your language file in `src/i18n.js` and add it to `languageList` constant. 6. Add it into `languageList` constant.
7. Make a [pull request](https://github.com/louislam/uptime-kuma/pulls) when you have done. 7. Make a [pull request](https://github.com/louislam/uptime-kuma/pulls) when you have done.
One of good examples: 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. 😏
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. 😏

@ -13,7 +13,7 @@ export default {
pauseDashboardHome: "Пауза", pauseDashboardHome: "Пауза",
deleteMonitorMsg: "Наистина ли желаете да изтриете този монитор?", deleteMonitorMsg: "Наистина ли желаете да изтриете този монитор?",
deleteNotificationMsg: "Наистина ли желаете да изтриете това известяване за всички монитори?", deleteNotificationMsg: "Наистина ли желаете да изтриете това известяване за всички монитори?",
resoverserverDescription: "Cloudflare е сървърът по подразбиране, но можете да го промените по всяко време.", resolverserverDescription: "Cloudflare е сървърът по подразбиране, но можете да го промените по всяко време.",
rrtypeDescription: "Изберете ресурсния запис, който желаете да наблюдавате", rrtypeDescription: "Изберете ресурсния запис, който желаете да наблюдавате",
pauseMonitorMsg: "Наистина ли желаете да поставите в режим пауза?", pauseMonitorMsg: "Наистина ли желаете да поставите в режим пауза?",
enableDefaultNotificationDescription: "За всеки нов монитор това известяване ще бъде активирано по подразбиране. Можете да го изключите за всеки отделен монитор.", enableDefaultNotificationDescription: "За всеки нов монитор това известяване ще бъде активирано по подразбиране. Можете да го изключите за всеки отделен монитор.",
@ -77,7 +77,7 @@ export default {
"Accepted Status Codes": "Допустими статус кодове", "Accepted Status Codes": "Допустими статус кодове",
Save: "Запази", Save: "Запази",
Notifications: "Известявания", Notifications: "Известявания",
"Not available, please setup.": "Не е налично. Моля, настройте.", "Not available, please setup.": "Не са налични. Моля, настройте.",
"Setup Notification": "Настройки за известявания", "Setup Notification": "Настройки за известявания",
Light: "Светла", Light: "Светла",
Dark: "Тъмна", Dark: "Тъмна",
@ -89,7 +89,7 @@ export default {
Timezone: "Часова зона", Timezone: "Часова зона",
"Search Engine Visibility": "Видимост за търсачки", "Search Engine Visibility": "Видимост за търсачки",
"Allow indexing": "Разреши индексиране", "Allow indexing": "Разреши индексиране",
"Discourage search engines from indexing site": "Обезкуражи индексирането на сайта от търсачките", "Discourage search engines from indexing site": "Не позволявай на търсачките да индексират този сайт",
"Change Password": "Промени парола", "Change Password": "Промени парола",
"Current Password": "Текуща парола", "Current Password": "Текуща парола",
"New Password": "Нова парола", "New Password": "Нова парола",
@ -131,8 +131,8 @@ export default {
Events: "Събития", Events: "Събития",
Heartbeats: "Проверки", Heartbeats: "Проверки",
"Auto Get": "Авт. попълване", "Auto Get": "Авт. попълване",
backupDescription: "Можете да архивирате всички монитори и всички известия в JSON файл.", backupDescription: "Можете да архивирате всички монитори и всички известявания в JSON файл.",
backupDescription2: "PS: Данни за история и събития не са включени.", backupDescription2: "PS: Имайте предвид, че данните за история и събития няма да бъдат включени.",
backupDescription3: "Чувствителни данни, като токен кодове за известяване, се съдържат в експортирания файл. Моля, бъдете внимателни с неговото съхранение.", backupDescription3: "Чувствителни данни, като токен кодове за известяване, се съдържат в експортирания файл. Моля, бъдете внимателни с неговото съхранение.",
alertNoFile: "Моля, изберете файл за импортиране.", alertNoFile: "Моля, изберете файл за импортиране.",
alertWrongFileType: "Моля, изберете JSON файл.", alertWrongFileType: "Моля, изберете JSON файл.",
@ -141,7 +141,7 @@ export default {
Overwrite: "Презапиши", Overwrite: "Презапиши",
Options: "Опции", Options: "Опции",
"Keep both": "Запази двете", "Keep both": "Запази двете",
"Verify Token": "Проверка на токен код", "Verify Token": "Провери токен код",
"Setup 2FA": "Настройка 2FA", "Setup 2FA": "Настройка 2FA",
"Enable 2FA": "Включи 2FA", "Enable 2FA": "Включи 2FA",
"Disable 2FA": "Изключи 2FA", "Disable 2FA": "Изключи 2FA",
@ -298,8 +298,66 @@ export default {
HeadersInvalidFormat: "Заявените хедъри не са валидни JSON: ", HeadersInvalidFormat: "Заявените хедъри не са валидни JSON: ",
BodyInvalidFormat: "Заявеното съобщение не е валиден JSON: ", BodyInvalidFormat: "Заявеното съобщение не е валиден JSON: ",
"Monitor History": "История на мониторите", "Monitor History": "История на мониторите",
clearDataOlderThan: "Ще се съхранява за {0} дни.", clearDataOlderThan: "Ще се съхранява {0} дни.",
records: "записа", records: "записа",
"One record": "Един запис", "One record": "Един запис",
steamApiKeyDescription: "За да мониторирате Steam Gameserver се нуждаете от Steam Web-API ключ. Може да регистрирате Вашия API ключ тук: ", 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: "Хедър ключове, които да не се подписват (по желание)",
}; };

@ -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?",
resolverserverDescription: "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é)",
};

@ -1,7 +1,7 @@
export default { export default {
languageName: "Danish (Danmark)", languageName: "Danish (Danmark)",
Settings: "Indstillinger", Settings: "Indstillinger",
Dashboard: "Dashboard", Dashboard: "Betjeningspanel",
"New Update": "Opdatering tilgængelig", "New Update": "Opdatering tilgængelig",
Language: "Sprog", Language: "Sprog",
Appearance: "Udseende", Appearance: "Udseende",
@ -98,7 +98,7 @@ export default {
keywordDescription: "Søg efter et søgeord i almindelig HTML- eller JSON -output. Bemærk, at der skelnes mellem store og små bogstaver.", keywordDescription: "Søg efter et søgeord i almindelig HTML- eller JSON -output. Bemærk, at der skelnes mellem store og små bogstaver.",
deleteMonitorMsg: "Er du sikker på, at du vil slette overvågeren?", deleteMonitorMsg: "Er du sikker på, at du vil slette overvågeren?",
deleteNotificationMsg: "Er du sikker på, at du vil slette denne underretning for alle overvågere? ", deleteNotificationMsg: "Er du sikker på, at du vil slette denne underretning for alle overvågere? ",
resoverserverDescription: "Cloudflare er standardserveren, den kan til enhver tid ændres.", resolverserverDescription: "Cloudflare er standardserveren, den kan til enhver tid ændres.",
"Resolver Server": "Navne-server", "Resolver Server": "Navne-server",
rrtypeDescription: "Vælg den type RR, du vil overvåge.", rrtypeDescription: "Vælg den type RR, du vil overvåge.",
"Last Result": "Seneste resultat", "Last Result": "Seneste resultat",
@ -110,11 +110,11 @@ export default {
notAvailableShort: "N/A", notAvailableShort: "N/A",
Create: "Opret", Create: "Opret",
clearEventsMsg: "Er du sikker på vil slette alle events for denne Overvåger?", 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?", confirmClearStatisticsMsg: "Vil du helt sikkert slette ALLE statistikker?",
"Clear Data": "Ryd Data", "Clear Data": "Ryd Data",
Events: "Events", Events: "Events",
Heartbeats: "Heartbeats", Heartbeats: "Hjerteslag",
"Auto Get": "Auto-hent", "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.", 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", "Default enabled": "Standard aktiveret",
@ -145,14 +145,14 @@ export default {
retryCheckEverySecond: "Prøv igen hvert {0} sekund.", 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.", 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.", 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", "Import Backup": "Importer Backup",
"Export Backup": "Eksporter Backup", "Export Backup": "Eksporter Backup",
"Skip existing": "Spring over eksisterende", "Skip existing": "Spring over eksisterende",
Overwrite: "Overskriv", Overwrite: "Overskriv",
Options: "Valgmuligheder", Options: "Valgmuligheder",
"Keep both": "Behold begge", "Keep both": "Behold begge",
Tags: "Tags", Tags: "Etiketter",
"Add New below or Select...": "Tilføj Nyt nedenfor eller Vælg ...", "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 name already exist.": "Et Tag med dette navn findes allerede.",
"Tag with this value already exist.": "Et Tag med denne værdi 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 Group": "Tilføj Gruppe",
"Add a monitor": "Tilføj en Overvåger", "Add a monitor": "Tilføj en Overvåger",
"Edit Status Page": "Rediger Statusside", "Edit Status Page": "Rediger Statusside",
"Go to Dashboard": "Gå til Dashboard", "Go to Dashboard": "Gå til Betjeningspanel",
"Status Page": "Status Page", "Status Page": "Statusside",
telegram: "Telegram", telegram: "Telegram",
webhook: "Webhook", webhook: "Webhook",
smtp: "Email (SMTP)", smtp: "Email (SMTP)",
@ -194,8 +194,162 @@ export default {
octopush: "Octopush", octopush: "Octopush",
promosms: "PromoSMS", promosms: "PromoSMS",
lunasea: "LunaSea", lunasea: "LunaSea",
apprise: "Apprise (Support 50+ Notification services)", apprise: "Apprise (Understøtter 50+ Notifikationstjenester)",
pushbullet: "Pushbullet", pushbullet: "Pushbullet",
line: "Line Messenger", line: "Line Messenger",
mattermost: "Mattermost", 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",
}; };

@ -4,14 +4,14 @@ export default {
Dashboard: "Dashboard", Dashboard: "Dashboard",
"New Update": "Update verfügbar", "New Update": "Update verfügbar",
Language: "Sprache", Language: "Sprache",
Appearance: "Erscheinung", Appearance: "Erscheinungsbild",
Theme: "Thema", Theme: "Erscheinungsbild",
General: "Allgemein", General: "Allgemein",
Version: "Version", Version: "Version",
"Check Update On GitHub": "Auf GitHub nach Updates suchen", "Check Update On GitHub": "Auf GitHub nach Updates suchen",
List: "Liste", List: "Liste",
Add: "Hinzufügen", Add: "Hinzufügen",
"Add New Monitor": "Neuer Monitor", "Add New Monitor": "Neuen Monitor hinzufügen",
"Quick Stats": "Übersicht", "Quick Stats": "Übersicht",
Up: "Aktiv", Up: "Aktiv",
Down: "Inaktiv", Down: "Inaktiv",
@ -49,20 +49,20 @@ export default {
retriesDescription: "Maximale Anzahl von Wiederholungen, bevor der Dienst als inaktiv markiert und eine Benachrichtigung gesendet wird.", retriesDescription: "Maximale Anzahl von Wiederholungen, bevor der Dienst als inaktiv markiert und eine Benachrichtigung gesendet wird.",
Advanced: "Erweitert", Advanced: "Erweitert",
ignoreTLSError: "Ignoriere TLS-/SSL-Fehler von Webseiten", ignoreTLSError: "Ignoriere TLS-/SSL-Fehler von Webseiten",
"Upside Down Mode": "Invertierter Modus", "Upside Down Mode": "Umgekehrter Modus",
upsideDownModeDescription: "Im invertierten Modus wird der Dienst als inaktiv angezeigt, wenn er erreichbar ist.", upsideDownModeDescription: "Im umgekehrten Modus wird der Dienst als inaktiv angezeigt, wenn er erreichbar ist.",
"Max. Redirects": "Max. Weiterleitungen", "Max. Redirects": "Max. Weiterleitungen",
maxRedirectDescription: "Maximale Anzahl von Weiterleitungen, denen gefolgt werden soll. Auf 0 setzen, um Weiterleitungen zu deaktivieren.", maxRedirectDescription: "Maximale Anzahl von Weiterleitungen, denen gefolgt werden soll. Auf 0 setzen, um Weiterleitungen zu deaktivieren.",
"Accepted Status Codes": "Erlaubte HTTP-Statuscodes", "Accepted Status Codes": "Erlaubte HTTP-Statuscodes",
acceptedStatusCodesDescription: "Wähle die Statuscodes aus, welche trotzdem als erfolgreich gewertet werden sollen.", acceptedStatusCodesDescription: "Statuscodes auswählen, die als erfolgreiche Verbindung gelten sollen.",
Save: "Speichern", Save: "Speichern",
Notifications: "Benachrichtigungen", Notifications: "Benachrichtigungen",
"Not available, please setup.": "Keine verfügbar, bitte einrichten.", "Not available, please setup.": "Nicht verfügbar, bitte einrichten.",
"Setup Notification": "Benachrichtigung einrichten", "Setup Notification": "Benachrichtigung einrichten",
Light: "Hell", Light: "Hell",
Dark: "Dunkel", Dark: "Dunkel",
Auto: "Auto", Auto: "Auto",
"Theme - Heartbeat Bar": "Thema - Zeitleiste", "Theme - Heartbeat Bar": "Erscheinungsbild - Zeitleiste",
Normal: "Normal", Normal: "Normal",
Bottom: "Unten", Bottom: "Unten",
None: "Keine", None: "Keine",
@ -71,7 +71,7 @@ export default {
"Allow indexing": "Indizierung zulassen", "Allow indexing": "Indizierung zulassen",
"Discourage search engines from indexing site": "Halte Suchmaschinen von der Indexierung der Seite ab", "Discourage search engines from indexing site": "Halte Suchmaschinen von der Indexierung der Seite ab",
"Change Password": "Passwort ändern", "Change Password": "Passwort ändern",
"Current Password": "Derzeitiges Passwort", "Current Password": "Aktuelles Passwort",
"New Password": "Neues Passwort", "New Password": "Neues Passwort",
"Repeat New Password": "Neues Passwort wiederholen", "Repeat New Password": "Neues Passwort wiederholen",
passwordNotMatchMsg: "Passwörter stimmen nicht überein.", passwordNotMatchMsg: "Passwörter stimmen nicht überein.",
@ -79,7 +79,7 @@ export default {
"Disable Auth": "Authentifizierung deaktivieren", "Disable Auth": "Authentifizierung deaktivieren",
"Enable Auth": "Authentifizierung aktivieren", "Enable Auth": "Authentifizierung aktivieren",
Logout: "Ausloggen", Logout: "Ausloggen",
notificationDescription: "Weise den Monitor(en) eine Benachrichtigung zu, damit diese Funktion greift.", notificationDescription: "Benachrichtigungen müssen einem Monitor zugewiesen werden, damit diese funktionieren.",
Leave: "Verlassen", Leave: "Verlassen",
"I understand, please disable": "Ich verstehe, bitte deaktivieren", "I understand, please disable": "Ich verstehe, bitte deaktivieren",
Confirm: "Bestätigen", Confirm: "Bestätigen",
@ -87,7 +87,7 @@ export default {
No: "Nein", No: "Nein",
Username: "Benutzername", Username: "Benutzername",
Password: "Passwort", Password: "Passwort",
"Remember me": "Passwort merken", "Remember me": "Angemeldet bleiben",
Login: "Einloggen", Login: "Einloggen",
"No Monitors, please": "Keine Monitore, bitte", "No Monitors, please": "Keine Monitore, bitte",
"add one": "hinzufügen", "add one": "hinzufügen",
@ -98,7 +98,7 @@ export default {
keywordDescription: "Ein Suchwort in der HTML- oder JSON-Ausgabe finden. Bitte beachte: es wird zwischen Groß-/Kleinschreibung unterschieden.", keywordDescription: "Ein Suchwort in der HTML- oder JSON-Ausgabe finden. Bitte beachte: es wird zwischen Groß-/Kleinschreibung unterschieden.",
deleteMonitorMsg: "Bist du sicher, dass du den Monitor löschen möchtest?", deleteMonitorMsg: "Bist du sicher, dass du den Monitor löschen möchtest?",
deleteNotificationMsg: "Möchtest du diese Benachrichtigung wirklich für alle Monitore löschen?", deleteNotificationMsg: "Möchtest du diese Benachrichtigung wirklich für alle Monitore löschen?",
resoverserverDescription: "Cloudflare ist als der Standardserver festgelegt, dieser kann jederzeit geändern werden.", resolverserverDescription: "Cloudflare ist als der Standardserver festgelegt. Dieser kann jederzeit geändert werden.",
"Resolver Server": "Auflösungsserver", "Resolver Server": "Auflösungsserver",
rrtypeDescription: "Wähle den RR-Typ aus, welchen du überwachen möchtest.", rrtypeDescription: "Wähle den RR-Typ aus, welchen du überwachen möchtest.",
"Last Result": "Letztes Ergebnis", "Last Result": "Letztes Ergebnis",
@ -110,8 +110,8 @@ export default {
Heartbeats: "Statistiken", Heartbeats: "Statistiken",
confirmClearStatisticsMsg: "Bist du dir sicher, dass du ALLE Statistiken löschen möchtest?", confirmClearStatisticsMsg: "Bist du dir sicher, dass du ALLE Statistiken löschen möchtest?",
"Create your admin account": "Erstelle dein Admin-Konto", "Create your admin account": "Erstelle dein Admin-Konto",
"Repeat Password": "Wiederhole das Passwort", "Repeat Password": "Passwort erneut eingeben",
"Resource Record Type": "Resource Record Type", "Resource Record Type": "Ressourcen Record Typ",
Export: "Export", Export: "Export",
Import: "Import", Import: "Import",
respTime: "Antw.-Zeit (ms)", respTime: "Antw.-Zeit (ms)",
@ -148,7 +148,7 @@ export default {
Token: "Token", Token: "Token",
"Show URI": "URI anzeigen", "Show URI": "URI anzeigen",
Tags: "Tags", Tags: "Tags",
"Add New below or Select...": "Bestehenden Tag auswählen oder neuen hinzufügen...", "Add New below or Select...": "Einen bestehenden Tag auswählen oder neuen hinzufügen...",
"Tag with this name already exist.": "Ein Tag mit diesem Namen existiert bereits.", "Tag with this name already exist.": "Ein Tag mit diesem Namen existiert bereits.",
"Tag with this value already exist.": "Ein Tag mit diesem Wert existiert bereits.", "Tag with this value already exist.": "Ein Tag mit diesem Wert existiert bereits.",
color: "Farbe", color: "Farbe",
@ -162,8 +162,8 @@ export default {
Purple: "Lila", Purple: "Lila",
Pink: "Pink", Pink: "Pink",
"Search...": "Suchen...", "Search...": "Suchen...",
"Heartbeat Retry Interval": "Heartbeat-Wiederholungsintervall", "Heartbeat Retry Interval": "Überprüfungsintervall",
retryCheckEverySecond: "Versuche alle {0} Sekunden", retryCheckEverySecond: "Alle {0} Sekunden neu versuchen",
"Import Backup": "Backup importieren", "Import Backup": "Backup importieren",
"Export Backup": "Backup exportieren", "Export Backup": "Backup exportieren",
"Avg. Ping": "Durchschn. Ping", "Avg. Ping": "Durchschn. Ping",
@ -194,6 +194,7 @@ export default {
promosms: "PromoSMS", promosms: "PromoSMS",
lunasea: "LunaSea", lunasea: "LunaSea",
apprise: "Apprise (Unterstützung für 50+ Benachrichtigungsdienste)", apprise: "Apprise (Unterstützung für 50+ Benachrichtigungsdienste)",
GoogleChat: "Google Chat (nur Google Workspace)",
pushbullet: "Pushbullet", pushbullet: "Pushbullet",
line: "Line Messenger", line: "Line Messenger",
mattermost: "Mattermost", mattermost: "Mattermost",
@ -201,7 +202,7 @@ export default {
"Push URL": "Push URL", "Push URL": "Push URL",
needPushEvery: "Du solltest diese URL alle {0} Sekunden aufrufen", needPushEvery: "Du solltest diese URL alle {0} Sekunden aufrufen",
pushOptionalParams: "Optionale Parameter: {0}", pushOptionalParams: "Optionale Parameter: {0}",
defaultNotificationName: "Meine {notification} Alarm ({number})", defaultNotificationName: "Mein {notification} Alarm ({number})",
here: "hier", here: "hier",
Required: "Erforderlich", Required: "Erforderlich",
"Bot Token": "Bot Token", "Bot Token": "Bot Token",
@ -213,23 +214,23 @@ export default {
chatIDNotFound: "Chat-ID wurde nicht gefunden: bitte sende zuerst eine Nachricht an diesen Bot", chatIDNotFound: "Chat-ID wurde nicht gefunden: bitte sende zuerst eine Nachricht an diesen Bot",
"Post URL": "Post URL", "Post URL": "Post URL",
"Content Type": "Content Type", "Content Type": "Content Type",
webhookJsonDesc: "{0} ist gut für alle modernen HTTP-Server sowie Express.js", webhookJsonDesc: "{0} ist gut für alle modernen HTTP-Server, wie z.B. Express.js, geeignet",
webhookFormDataDesc: "{multipart} ist gut für PHP. Die JSON muss mit {decodeFunction} geparst werden", webhookFormDataDesc: "{multipart} ist gut für PHP. Das JSON muss mit {decodeFunction} verarbeitet werden",
secureOptionNone: "Keine / STARTTLS (25, 587)", secureOptionNone: "Keine / STARTTLS (25, 587)",
secureOptionTLS: "TLS (465)", secureOptionTLS: "TLS (465)",
"Ignore TLS Error": "TLS-Fehler ignorieren", "Ignore TLS Error": "TLS-Fehler ignorieren",
"From Email": "Von Email", "From Email": "Absender E-Mail",
emailCustomSubject: "Benutzerdefinierter Betreff", emailCustomSubject: "Benutzerdefinierter Betreff",
"To Email": "Zu Email", "To Email": "Empfänger E-Mail",
smtpCC: "CC", smtpCC: "CC",
smtpBCC: "BCC", smtpBCC: "BCC",
"Discord Webhook URL": "Discord Webhook URL", "Discord Webhook URL": "Discord Webhook URL",
wayToGetDiscordURL: "Du kannst diesen erhalten, indem du zu den Servereinstellungen gehst -> Integrationen -> Neuer Webhook", wayToGetDiscordURL: "Du kannst diese erhalten, indem du zu den Servereinstellungen gehst -> Integrationen -> Neuer Webhook",
"Bot Display Name": "Bot-Anzeigename", "Bot Display Name": "Bot-Anzeigename",
"Prefix Custom Message": "Benutzerdefinierter Nachrichten Präfix", "Prefix Custom Message": "Benutzerdefinierter Nachrichten Präfix",
"Hello @everyone is...": "Hallo {'@'}everyone ist...", "Hello @everyone is...": "Hallo {'@'}everyone ist...",
"Webhook URL": "Webhook URL", "Webhook URL": "Webhook URL",
wayToGetTeamsURL: "Hier erfährst du, wie eine Webhook-URL erstellt werden kann {0}.", wayToGetTeamsURL: "Wie eine Webhook-URL erstellt werden kann, erfährst du {0}.",
Number: "Nummer", Number: "Nummer",
Recipients: "Empfänger", Recipients: "Empfänger",
needSignalAPI: "Es wird ein Signal Client mit REST-API benötigt.", needSignalAPI: "Es wird ein Signal Client mit REST-API benötigt.",
@ -242,22 +243,22 @@ export default {
"Channel Name": "Kanalname", "Channel Name": "Kanalname",
"Uptime Kuma URL": "Uptime Kuma URL", "Uptime Kuma URL": "Uptime Kuma URL",
aboutWebhooks: "Weitere Informationen zu Webhooks auf: {0}", 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", aboutChannelName: "Gebe den Kanalnamen ein in {0} Feld Kanalname, falls du den Webhook-Kanal umgehen möchtest. Ex: #other-channel",
aboutKumaURL: "Wenn das Feld für die Uptime Kuma URL leer gelassen wird, wird es standardmäßig die GitHub Projekt Seite verwenden.", aboutKumaURL: "Wenn das Feld für die Uptime Kuma URL leer gelassen wird, wird standardmäßig die GitHub Projekt Seite verwendet.",
emojiCheatSheet: "Emoji Cheat Sheet: {0}", emojiCheatSheet: "Emoji Cheat Sheet: {0}",
"User Key": "Benutzerschlüssel", "User Key": "Benutzerschlüssel",
Device: "Gerät", Device: "Gerät",
"Message Title": "Nachrichtentitel", "Message Title": "Nachrichtentitel",
"Notification Sound": "Benachrichtigungston", "Notification Sound": "Benachrichtigungston",
"More info on:": "Mehr Infos auf: {0}", "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.", 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.", pushoverDesc2: "Fülle das Geräte Feld aus, wenn du Benachrichtigungen an verschiedene Geräte senden möchtest.",
"SMS Type": "SMS Typ", "SMS Type": "SMS Typ",
octopushTypePremium: "Premium (Schnell - zur Benachrichtigung empfohlen)", octopushTypePremium: "Premium (Schnell - zur Benachrichtigung empfohlen)",
octopushTypeLowCost: "Kostengünstig (Langsam - manchmal vom Betreiber gesperrt)", octopushTypeLowCost: "Kostengünstig (Langsam - manchmal vom Betreiber gesperrt)",
checkPrice: "Prüfe {0} Preise:", checkPrice: "Prüfe {0} Preise:",
octopushLegacyHint: "Verwendest du die Legacy-Version von Octopush (2011-2020) oder die neue Version?", octopushLegacyHint: "Verwendest du die Legacy-Version von Octopush (2011-2020) oder die neue Version?",
"Check octopush prices": "Überprüfe die Oktopush Preise {0}.", "Check octopush prices": "Vergleiche die Oktopush Preise {0}.",
octopushPhoneNumber: "Telefonnummer (Internationales Format, z.B : +49612345678) ", octopushPhoneNumber: "Telefonnummer (Internationales Format, z.B : +49612345678) ",
octopushSMSSender: "Name des SMS-Absenders : 3-11 alphanumerische Zeichen und Leerzeichen (a-zA-Z0-9)", octopushSMSSender: "Name des SMS-Absenders : 3-11 alphanumerische Zeichen und Leerzeichen (a-zA-Z0-9)",
"LunaSea Device ID": "LunaSea Geräte ID", "LunaSea Device ID": "LunaSea Geräte ID",
@ -278,24 +279,24 @@ export default {
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.", 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", "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.", 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", aboutMattermostChannelName: "Du kannst den Standardkanal, auf dem der Webhook gesendet wird überschreiben, indem der Kanalnamen in das Feld 'Channel Name' eingeben wird. Dies muss in den Mattermost Webhook-Einstellungen aktiviert werden. Ex: #other-channel",
matrix: "Matrix", matrix: "Matrix",
promosmsTypeEco: "SMS ECO - billig, aber langsam und oft überladen. Nur auf polnische Empfänger beschränkt.", promosmsTypeEco: "SMS ECO - billig, aber langsam und oft überladen. Auf polnische Empfänger beschränkt.",
promosmsTypeFlash: "SMS FLASH - Die Nachricht wird automatisch auf dem Empfängergerät angezeigt. Nur auf polnische Empfänger beschränkt.", promosmsTypeFlash: "SMS FLASH - Die Nachricht wird automatisch auf dem Empfängergerät angezeigt. Auf polnische Empfänger beschränkt.",
promosmsTypeFull: "SMS FULL - Premium Stufe von SMS, es kann der Absendernamen verwendet werden (Der Name musst zuerst registriert werden). Zuverlässig für Warnungen.", 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).", 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)", promosmsPhoneNumber: "Telefonnummer (für polnische Empfänger können die Vorwahlen übersprungen werden)",
promosmsSMSSender: "Name des SMS-Absenders : vorregistrierter Name oder einer der Standardwerte: InfoSMS, SMS Info, MaxSMS, INFO, SMS", promosmsSMSSender: "Name des SMS-Absenders : vorregistrierter Name oder einer der Standardwerte: InfoSMS, SMS Info, MaxSMS, INFO, SMS",
"Feishu WebHookUrl": "Feishu Webhook URL", "Feishu WebHookUrl": "Feishu Webhook URL",
matrixHomeserverURL: "Heimserver URL (mit http(s):// und optionalen Ports)", matrixHomeserverURL: "Heimserver URL (mit http(s):// und optionalen Ports)",
"Internal Room Id": "Interne Raum-ID", "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.", matrixDesc1: "Die interne Raum-ID findest du im erweiterten Bereich der Raumeinstellungen im Matrix-Client. Es sollte aussehen wie z.B. !QMdRCpUIfLwsfjxye6:home.server.",
matrixDesc2: "Es wird dringend empfohlen, 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}", matrixDesc2: "Es wird dringend empfohlen einen neuen Benutzer anzulegen und nicht den Zugriffstoken deines eigenen Matrix-Benutzers zu verwenden. Anderenfalls ermöglicht es vollen Zugriff auf dein Konto und alle Räume, denen du beigetreten bist. Erstelle stattdessen einen neuen Benutzer und lade ihn nur in den Raum ein, in dem du die Benachrichtigung erhalten möchtest. Du kannst den Zugriffstoken erhalten, indem du Folgendes ausführst {0}",
Method: "Method", Method: "Method",
Body: "Body", Body: "Body",
Headers: "Headers", Headers: "Headers",
PushUrl: "Push URL", PushUrl: "Push URL",
HeadersInvalidFormat: "Die Header ist kein gültiges JSON: ", HeadersInvalidFormat: "Der Header ist kein gültiges JSON: ",
BodyInvalidFormat: "Der Body ist kein gültiges JSON: ", BodyInvalidFormat: "Der Body ist kein gültiges JSON: ",
"Monitor History": "Monitor Verlauf", "Monitor History": "Monitor Verlauf",
clearDataOlderThan: "Bewahre die Monitor-Verlaufsdaten für {0} Tage auf.", clearDataOlderThan: "Bewahre die Monitor-Verlaufsdaten für {0} Tage auf.",
@ -304,4 +305,60 @@ export default {
"One record": "Ein Eintrag", "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: ", 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", "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",
clicksendsms: "ClickSend SMS",
apiCredentials: "API Zugangsdaten",
smtpDkimSettings: "DKIM Einstellungen",
smtpDkimDesc: "Details zur Konfiguration sind in der Nodemailer DKIM {0} zu finden.",
documentation: "Dokumentation",
smtpDkimDomain: "Domain Name",
smtpDkimKeySelector: "Schlüssel Auswahl",
smtpDkimPrivateKey: "Privater Schlüssel",
smtpDkimHashAlgo: "Hash-Algorithmus (Optional)",
smtpDkimheaderFieldNames: "Zu validierende Header-Schlüssel (optional)",
smtpDkimskipFields: "Zu ignorierende Header Schlüssel (optional)",
}; };

@ -13,7 +13,7 @@ export default {
pauseDashboardHome: "Pause", pauseDashboardHome: "Pause",
deleteMonitorMsg: "Are you sure want to delete this monitor?", deleteMonitorMsg: "Are you sure want to delete this monitor?",
deleteNotificationMsg: "Are you sure want to delete this notification for all monitors?", 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.", resolverserverDescription: "Cloudflare is the default server. You can change the resolver server anytime.",
rrtypeDescription: "Select the RR type you want to monitor", rrtypeDescription: "Select the RR type you want to monitor",
pauseMonitorMsg: "Are you sure want to pause?", pauseMonitorMsg: "Are you sure want to pause?",
enableDefaultNotificationDescription: "This notification will be enabled by default for new monitors. You can still disable the notification separately for each monitor.", enableDefaultNotificationDescription: "This notification will be enabled by default for new monitors. You can still disable the notification separately for each monitor.",
@ -238,11 +238,13 @@ export default {
"rocket.chat": "Rocket.Chat", "rocket.chat": "Rocket.Chat",
pushover: "Pushover", pushover: "Pushover",
pushy: "Pushy", pushy: "Pushy",
PushByTechulus: "Push by Techulus",
octopush: "Octopush", octopush: "Octopush",
promosms: "PromoSMS", promosms: "PromoSMS",
clicksendsms: "ClickSend SMS", clicksendsms: "ClickSend SMS",
lunasea: "LunaSea", lunasea: "LunaSea",
apprise: "Apprise (Support 50+ Notification services)", apprise: "Apprise (Support 50+ Notification services)",
GoogleChat: "Google Chat (Google Workspace only)",
pushbullet: "Pushbullet", pushbullet: "Pushbullet",
line: "Line Messenger", line: "Line Messenger",
mattermost: "Mattermost", mattermost: "Mattermost",
@ -306,4 +308,65 @@ export default {
"One record": "One record", "One record": "One record",
steamApiKeyDescription: "For monitoring a Steam Game Server you need a Steam Web-API key. You can register your API key here: ", 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", "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)",
gorush: "Gorush",
alerta: 'Alerta',
alertaApiEndpoint: 'API Endpoint',
alertaEnvironment: 'Environment',
alertaApiKey: 'API Key',
alertaAlertState: 'Alert State',
alertaRecoverState: 'Recover State',
}; };

@ -12,7 +12,7 @@ export default {
pauseDashboardHome: "Pausado", pauseDashboardHome: "Pausado",
deleteMonitorMsg: "¿Seguro que quieres eliminar este monitor?", deleteMonitorMsg: "¿Seguro que quieres eliminar este monitor?",
deleteNotificationMsg: "¿Seguro que quieres eliminar esta notificación para todos los monitores?", deleteNotificationMsg: "¿Seguro que quieres eliminar esta notificación para todos los monitores?",
resoverserverDescription: "Cloudflare es el servidor por defecto, puedes cambiar el servidor de resolución en cualquier momento.", resolverserverDescription: "Cloudflare es el servidor por defecto, puedes cambiar el servidor de resolución en cualquier momento.",
rrtypeDescription: "Selecciona el tipo de registro que quieres monitorizar", rrtypeDescription: "Selecciona el tipo de registro que quieres monitorizar",
pauseMonitorMsg: "¿Seguro que quieres pausar?", pauseMonitorMsg: "¿Seguro que quieres pausar?",
Settings: "Ajustes", Settings: "Ajustes",

@ -12,7 +12,7 @@ export default {
pauseDashboardHome: "Seisatud", pauseDashboardHome: "Seisatud",
deleteMonitorMsg: "Kas soovid eemaldada seire?", deleteMonitorMsg: "Kas soovid eemaldada seire?",
deleteNotificationMsg: "Kas soovid eemaldada selle teavitusteenuse kõikidelt seiretelt?", deleteNotificationMsg: "Kas soovid eemaldada selle teavitusteenuse kõikidelt seiretelt?",
resoverserverDescription: "Cloudflare on vaikimisi pöördserver.", resolverserverDescription: "Cloudflare on vaikimisi pöördserver.",
rrtypeDescription: "Vali kirje tüüp, mida soovid jälgida.", rrtypeDescription: "Vali kirje tüüp, mida soovid jälgida.",
pauseMonitorMsg: "Kas soovid peatada seire?", pauseMonitorMsg: "Kas soovid peatada seire?",
Settings: "Seaded", Settings: "Seaded",

@ -13,7 +13,7 @@ export default {
pauseDashboardHome: "متوقف شده", pauseDashboardHome: "متوقف شده",
deleteMonitorMsg: "آیا از حذف این مانیتور مطمئن هستید؟", deleteMonitorMsg: "آیا از حذف این مانیتور مطمئن هستید؟",
deleteNotificationMsg: "آیا مطمئن هستید که میخواهید این سرویس اطلاع‌رسانی را برای تمامی مانیتورها حذف کنید؟", deleteNotificationMsg: "آیا مطمئن هستید که میخواهید این سرویس اطلاع‌رسانی را برای تمامی مانیتورها حذف کنید؟",
resoverserverDescription: "سرویس CloudFlare به عنوان سرور پیش‌فرض استفاده می‌شود، شما میتوانید آنرا به هر سرور دیگری بعدا تغییر دهید.", resolverserverDescription: "سرویس CloudFlare به عنوان سرور پیش‌فرض استفاده می‌شود، شما میتوانید آنرا به هر سرور دیگری بعدا تغییر دهید.",
rrtypeDescription: "لطفا نوع Resource Record را انتخاب کنید.", rrtypeDescription: "لطفا نوع Resource Record را انتخاب کنید.",
pauseMonitorMsg: "آیا مطمئن هستید که میخواهید این مانیتور را متوقف کنید ؟", pauseMonitorMsg: "آیا مطمئن هستید که میخواهید این مانیتور را متوقف کنید ؟",
enableDefaultNotificationDescription: "برای هر مانیتور جدید، این سرویس اطلاع‌رسانی به صورت پیش‌فرض فعال خواهد شد. البته که شما میتوانید به صورت دستی آنرا برای هر مانیتور به صورت جداگانه غیر فعال کنید.", enableDefaultNotificationDescription: "برای هر مانیتور جدید، این سرویس اطلاع‌رسانی به صورت پیش‌فرض فعال خواهد شد. البته که شما میتوانید به صورت دستی آنرا برای هر مانیتور به صورت جداگانه غیر فعال کنید.",

@ -1,5 +1,5 @@
export default { export default {
languageName: "Français (France)", languageName: "Français",
checkEverySecond: "Vérifier toutes les {0} secondes", checkEverySecond: "Vérifier toutes les {0} secondes",
retryCheckEverySecond: "Réessayer toutes les {0} secondes.", retryCheckEverySecond: "Réessayer toutes les {0} secondes.",
retriesDescription: "Nombre d'essais avant que le service soit déclaré hors-ligne.", retriesDescription: "Nombre d'essais avant que le service soit déclaré hors-ligne.",
@ -13,17 +13,17 @@ export default {
pauseDashboardHome: "En pause", pauseDashboardHome: "En pause",
deleteMonitorMsg: "Êtes-vous sûr de vouloir supprimer cette sonde ?", 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.", 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.", resolverserverDescription: "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", rrtypeDescription: "Veuillez sélectionner un type d'enregistrement DNS",
pauseMonitorMsg: "Êtes-vous sûr de vouloir mettre en pause cette sonde ?", 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.", 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 ?", 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 ?", clearHeartbeatsMsg: "Êtes-vous sûr de vouloir supprimer toutes les vérifications pour cette sonde ?",
confirmClearStatisticsMsg: "Êtes-vous sûr de vouloir supprimer tous les statistiques ?", 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.", 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.", 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.", 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 ?", confirmEnableTwoFAMsg: "Êtes-vous sûr de vouloir activer le 2FA ?",
confirmDisableTwoFAMsg: "Êtes-vous sûr de vouloir désactiver le 2FA ?", confirmDisableTwoFAMsg: "Êtes-vous sûr de vouloir désactiver le 2FA ?",
Settings: "Paramètres", Settings: "Paramètres",
@ -68,9 +68,9 @@ export default {
URL: "URL", URL: "URL",
Hostname: "Nom d'hôte / adresse IP", Hostname: "Nom d'hôte / adresse IP",
Port: "Port", Port: "Port",
"Heartbeat Interval": "Intervale de vérification", "Heartbeat Interval": "Intervalle de vérification",
Retries: "Essais", Retries: "Essais",
"Heartbeat Retry Interval": "Réessayer l'intervale de vérification", "Heartbeat Retry Interval": "Réessayer l'intervalle de vérification",
Advanced: "Avancé", Advanced: "Avancé",
"Upside Down Mode": "Mode inversé", "Upside Down Mode": "Mode inversé",
"Max. Redirects": "Nombre maximum de redirections", "Max. Redirects": "Nombre maximum de redirections",
@ -108,7 +108,7 @@ export default {
"Remember me": "Se souvenir de moi", "Remember me": "Se souvenir de moi",
Login: "Se connecter", Login: "Se connecter",
"No Monitors, please": "Pas de sondes, veuillez", "No Monitors, please": "Pas de sondes, veuillez",
"add one": "en ajouter une.", "add one": "en ajouter une",
"Notification Type": "Type de notification", "Notification Type": "Type de notification",
Email: "Email", Email: "Email",
Test: "Tester", Test: "Tester",
@ -129,7 +129,7 @@ export default {
Create: "Créer", Create: "Créer",
"Clear Data": "Effacer les données", "Clear Data": "Effacer les données",
Events: "Evénements", Events: "Evénements",
Heartbeats: "Vérfications", Heartbeats: "Vérifications",
"Auto Get": "Récuperer automatiquement", "Auto Get": "Récuperer automatiquement",
backupDescription: "Vous pouvez sauvegarder toutes les sondes et toutes les notifications dans un fichier JSON.", 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.",
@ -207,7 +207,7 @@ export default {
"Discord Webhook URL": "Discord Webhook URL", "Discord Webhook URL": "Discord Webhook URL",
wayToGetDiscordURL: "Vous pouvez l'obtenir en allant dans 'Paramètres du Serveur' -> 'Intégrations' -> 'Créer un Webhook'", 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é)", "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...", "Hello @everyone is...": "Bonjour {'@'}everyone il...",
teams: "Microsoft Teams", teams: "Microsoft Teams",
"Webhook URL": "Webhook URL", "Webhook URL": "Webhook URL",
@ -229,7 +229,7 @@ export default {
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", 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.", 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", "rocket.chat": "Rocket.chat",
pushover: "Pushover", pushover: "Pushover",
pushy: "Pushy", pushy: "Pushy",
@ -249,9 +249,9 @@ export default {
pushoverDesc2: "Si vous voulez envoyer des notifications sur différents Appareils, remplissez le champ 'Device'.", pushoverDesc2: "Si vous voulez envoyer des notifications sur différents Appareils, remplissez le champ 'Device'.",
"SMS Type": "SMS Type", "SMS Type": "SMS Type",
octopushTypePremium: "Premium (Rapide - recommandé pour les alertes)", 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}.", "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)", octopushSMSSender: "Nom de l'envoyer : 3-11 caractères alphanumériques avec espace (a-zA-Z0-9)",
"LunaSea Device ID": "LunaSea Device ID", "LunaSea Device ID": "LunaSea Device ID",
"Apprise URL": "Apprise URL", "Apprise URL": "Apprise URL",
@ -259,12 +259,12 @@ export default {
"Read more:": "En savoir plus : {0}", "Read more:": "En savoir plus : {0}",
"Status:": "Status : {0}", "Status:": "Status : {0}",
"Read more": "En savoir plus", "Read more": "En savoir plus",
appriseInstalled: "Apprise est intallé.", appriseInstalled: "Apprise est installé.",
appriseNotInstalled: "Apprise n'est pas intallé. {0}", appriseNotInstalled: "Apprise n'est pas installé. {0}",
"Access Token": "Access Token", "Access Token": "Access Token",
"Channel access token": "Channel access token", "Channel access token": "Token d'accès au canal",
"Line Developers Console": "Line Developers Console", "Line Developers Console": "Ligne console de développeurs",
lineDevConsoleTo: "Line Developers Console - {0}", lineDevConsoleTo: "Ligne console de développeurs - {0}",
"Basic Settings": "Paramètres de base", "Basic Settings": "Paramètres de base",
"User ID": "Identifiant utilisateur", "User ID": "Identifiant utilisateur",
"Messaging API": "Messaging API", "Messaging API": "Messaging API",
@ -279,4 +279,34 @@ export default {
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).", 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.)", 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", 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",
alertaApiEndpoint: 'API Endpoint',
alertaEnvironment: 'Environement',
alertaApiKey: "Clé de l'API",
alertaAlertState: "État de l'Alerte",
alertaRecoverState: 'État de récupération',
}; };

@ -2,30 +2,29 @@ export default {
languageName: "Hrvatski", languageName: "Hrvatski",
checkEverySecond: "Provjera svake {0} sekunde", checkEverySecond: "Provjera svake {0} sekunde",
retryCheckEverySecond: "Ponovni pokušaj svake {0} sekunde", retryCheckEverySecond: "Ponovni pokušaj svake {0} sekunde",
retriesDescription: "Broj ponovnih pokušaja prije nego će se servis označiti kao DOWN te poslati obavijest", 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", ignoreTLSError: "Ignoriraj TLS/SSL pogreške za HTTPS web stranice",
upsideDownModeDescription: "Preokreni logiku statusa. Ako je usluga dostupna, smatra se da je DOWN.", 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 preusmeravanja onemogućila.", maxRedirectDescription: "Maksimalan broj preusmjeravanja. Postaviti na 0 kako bi se preusmjeravanja onemogućila.",
acceptedStatusCodesDescription: "Odaberite statusne kodove koji se smatraju uspješnim odgovorom.", acceptedStatusCodesDescription: "Odaberite statusne kodove koji se smatraju uspješnim odgovorom.",
passwordNotMatchMsg: "Lozinke se ne poklapaju.", passwordNotMatchMsg: "Lozinke se ne poklapaju.",
notificationDescription: "Obavijesti će funkcionirati samo ako su dodijeljene monitoru.", notificationDescription: "Obavijesti će funkcionirati samo ako su dodijeljene monitoru.",
keywordDescription: "Ključna riječ za pretragu kao običan HTML ili u JSON formatu. Pretraga je case-sensitive.", keywordDescription: "Ključna riječ za pretragu, u obliku običnog HTML-a ili u JSON formatu. Pretraga je osjetljiva na velika i mala slova.",
pauseDashboardHome: "Pauziraj",
deleteMonitorMsg: "Jeste li sigurni da želite izbrisati monitor?", deleteMonitorMsg: "Jeste li sigurni da želite izbrisati monitor?",
deleteNotificationMsg: "Jeste li sigurni da želite izbrisati ovu obavijest za sve monitore?", 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.", resolverserverDescription: "Cloudflare je zadani DNS poslužitelj. Možete to promijeniti u bilo kojem trenutku.",
rrtypeDescription: "Odaberite vrstu DNS zapisa o resursu kojeg želite pratiti", rrtypeDescription: "Odaberite vrstu DNS zapisa o resursu kojeg želite pratiti",
pauseMonitorMsg: "Jeste li sigurni da želite pauzirati?", 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.", 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?", 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?", clearHeartbeatsMsg: "Jeste li sigurni da želite izbrisati sve zapise o provjerama za ovaj monitor?",
confirmClearStatisticsMsg: "Jeste li sigurni da želite izbrisati SVE statistike?", confirmClearStatisticsMsg: "Jeste li sigurni da želite izbrisati SVE statistike?",
importHandleDescription: "Odaberite opciju 'Preskoči postojeće' ako želite prekočiti uvoz već postojećih monitora i obavijesti. Opcija 'Prepiši' će izbrisati postojeće monitore i obavijesti.", 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.", confirmImportMsg: "Jeste li sigurni da želite pokrenuti uvoz? Provjerite jeste li odabrali ispravnu opciju uvoza.",
twoFAVerifyLabel: "Unesite svoj 2FA token:", twoFAVerifyLabel: "Unesite svoj 2FA token:",
tokenValidSettingsMsg: "Token je važeći! Sada možete spremiti postavke dvofaktorske autentikacije.", tokenValidSettingsMsg: "Token je važeći! Sada možete spremiti postavke dvofaktorske autentikacije.",
confirmEnableTwoFAMsg: "Želite li omogućiti dvofaktorsku autentikaciju?", confirmEnableTwoFAMsg: "Želite li omogućiti dvofaktorsku autentikaciju?",
confirmDisableTwoFAMsg: "Are you sure you want to disable dvofaktorsku autentikaciju?", confirmDisableTwoFAMsg: "Jeste li sigurni da želite onemogućiti dvofaktorsku autentikaciju?",
Settings: "Postavke", Settings: "Postavke",
Dashboard: "Kontrolna ploča", Dashboard: "Kontrolna ploča",
"New Update": "Novo ažuriranje", "New Update": "Novo ažuriranje",
@ -44,17 +43,18 @@ export default {
Down: "Nedostupno", Down: "Nedostupno",
Pending: "U tijeku", Pending: "U tijeku",
Unknown: "Nepoznato", Unknown: "Nepoznato",
Pause: "Pauziraj", pauseDashboardHome: "Pauzirano",
Name: "Naziv monitora", Name: "Naziv",
Status: "Status", Status: "Status",
DateTime: "Vremenska oznaka", DateTime: "Vremenska oznaka",
Message: "Izvještaj", Message: "Izvještaj",
"No important events": "Nema važnih događaja", "No important events": "Nema važnih događaja",
Pause: "Pauziraj",
Resume: "Nastavi", Resume: "Nastavi",
Edit: "Uredi", Edit: "Uredi",
Delete: "Obriši", Delete: "Obriši",
Current: "Trenutno", Current: "Trenutno",
Uptime: "Uptime", Uptime: "Dostupnost",
"Cert Exp.": "Istek cert.", "Cert Exp.": "Istek cert.",
days: "dana", days: "dana",
day: "dan", day: "dan",
@ -65,19 +65,19 @@ export default {
Ping: "Odziv", Ping: "Odziv",
"Monitor Type": "Vrsta Monitora", "Monitor Type": "Vrsta Monitora",
Keyword: "Ključna riječ", Keyword: "Ključna riječ",
"Friendly Name": "Lijep naziv", "Friendly Name": "Prilagođen naziv",
URL: "URL", URL: "URL",
Hostname: "Domaćin", Hostname: "Domaćin",
Port: "Port", Port: "Port",
"Heartbeat Interval": "Interval provjere", "Heartbeat Interval": "Interval provjere",
Retries: "Ponovnih pokušaja", Retries: "Broj ponovnih pokušaja",
"Heartbeat Retry Interval": "Interval ponovnih pokušaja", "Heartbeat Retry Interval": "Interval ponovnih pokušaja",
Advanced: "Napredne postavke", Advanced: "Napredne postavke",
"Upside Down Mode": "Obrnuti način", "Upside Down Mode": "Obrnuti način",
"Max. Redirects": "Maksimalan broj preusmjeravanja", "Max. Redirects": "Maksimalan broj preusmjeravanja",
"Accepted Status Codes": "Prihvaćeni statusni kodovi", "Accepted Status Codes": "Prihvaćeni statusni kodovi",
"Push URL": "Push URL", "Push URL": "Push URL",
needPushEvery: "Potrebno je zvati ovaj URL svakih {0} sekundi.", needPushEvery: "Potrebno je slati zahtjeve na URL svakih {0} sekundi.",
pushOptionalParams: "Neobavezni parametri: {0}", pushOptionalParams: "Neobavezni parametri: {0}",
Save: "Spremi", Save: "Spremi",
Notifications: "Obavijesti", Notifications: "Obavijesti",
@ -86,14 +86,14 @@ export default {
Light: "Svijetli način", Light: "Svijetli način",
Dark: "Tamni način", Dark: "Tamni način",
Auto: "Automatski", Auto: "Automatski",
"Theme - Heartbeat Bar": "Tema - Statusna traka", "Theme - Heartbeat Bar": "Tema za traku dostupnosti",
Normal: "Normalno", Normal: "Normalno",
Bottom: "Ispod", Bottom: "Ispod",
None: "Isključeno", None: "Isključeno",
Timezone: "Vremenska zona", Timezone: "Vremenska zona",
"Search Engine Visibility": "Vidljivost pretraživačima", "Search Engine Visibility": "Vidljivost tražilicama",
"Allow indexing": "Dopusti indeksiranje", "Allow indexing": "Dopusti indeksiranje",
"Discourage search engines from indexing site": "Sprječavanje indeksiranja stranice", "Discourage search engines from indexing site": "Sprječavanje indeksiranja",
"Change Password": "Promjena lozinke", "Change Password": "Promjena lozinke",
"Current Password": "Trenutna lozinka", "Current Password": "Trenutna lozinka",
"New Password": "Nova lozinka", "New Password": "Nova lozinka",
@ -103,7 +103,7 @@ export default {
"Enable Auth": "Omogući autentikaciju", "Enable Auth": "Omogući autentikaciju",
Logout: "Odjava", Logout: "Odjava",
Leave: "Poništi", Leave: "Poništi",
"I understand, please disable": "Razumijem, onemogući", "I understand, please disable": "Razumijem, svejedno onemogući",
Confirm: "Potvrda", Confirm: "Potvrda",
Yes: "Da", Yes: "Da",
No: "Ne", No: "Ne",
@ -112,10 +112,10 @@ export default {
"Remember me": "Zapamti me", "Remember me": "Zapamti me",
Login: "Prijava", Login: "Prijava",
"No Monitors, please": "Nema monitora, ", "No Monitors, please": "Nema monitora, ",
"add one": "dodaj jednog", "add one": "dodaj jedan",
"Notification Type": "Tip obavijesti", "Notification Type": "Tip obavijesti",
Email: "E-pošta", Email: "E-pošta",
Test: "Test", Test: "Testiraj",
"Certificate Info": "Informacije o certifikatu", "Certificate Info": "Informacije o certifikatu",
"Resolver Server": "DNS poslužitelj", "Resolver Server": "DNS poslužitelj",
"Resource Record Type": "Vrsta DNS zapisa", "Resource Record Type": "Vrsta DNS zapisa",
@ -130,14 +130,14 @@ export default {
notAvailableShort: "N/A", notAvailableShort: "N/A",
"Default enabled": "Omogući za nove monitore", "Default enabled": "Omogući za nove monitore",
"Apply on all existing monitors": "Primijeni na postojeće monitore", "Apply on all existing monitors": "Primijeni na postojeće monitore",
Create: "Create", Create: "Kreiraj",
"Clear Data": "Clear Data", "Clear Data": "Obriši podatke",
Events: "Events", Events: "Događaji",
Heartbeats: "Provjere", Heartbeats: "Provjere",
"Auto Get": "Automatski dohvat", "Auto Get": "Automatski dohvat",
backupDescription: "Moguće je napraviti sigurnosnu kopiju svih monitora i obavijesti u JSON datoteku.", 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.", backupDescription2: "Napomena: povijest i podaci o događajima nisu uključeni u sigurnosnu kopiju.",
backupDescription3: "Osjetljivi podaci poput tokena za obavijesti jesu uključeni u izvozu; potrebno je čuvati izvoz na sigurnom mjestu.", 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.", alertNoFile: "Datoteka za uvoz nije odabrana.",
alertWrongFileType: "Datoteka za uvoz nije u JSON formatu.", alertWrongFileType: "Datoteka za uvoz nije u JSON formatu.",
"Clear all statistics": "Obriši sve statistike", "Clear all statistics": "Obriši sve statistike",
@ -152,7 +152,7 @@ export default {
"2FA Settings": "Postavke 2FA", "2FA Settings": "Postavke 2FA",
"Two Factor Authentication": "Dvofaktorska autentikacija", "Two Factor Authentication": "Dvofaktorska autentikacija",
Active: "Aktivna", Active: "Aktivna",
Inactive: "Neaktivna", Inactive: "Neaktivno",
Token: "Token", Token: "Token",
"Show URI": "Pokaži URI", "Show URI": "Pokaži URI",
Tags: "Oznake", Tags: "Oznake",
@ -172,7 +172,7 @@ export default {
"Search...": "Pretraga...", "Search...": "Pretraga...",
"Avg. Ping": "Prosječni odziv", "Avg. Ping": "Prosječni odziv",
"Avg. Response": "Prosječni odgovor", "Avg. Response": "Prosječni odgovor",
"Entry Page": "Entry Page", "Entry Page": "Početna stranica",
statusPageNothing: "Ovdje nema ničega, dodajte grupu ili monitor.", statusPageNothing: "Ovdje nema ničega, dodajte grupu ili monitor.",
"No Services": "Nema usluga", "No Services": "Nema usluga",
"All Systems Operational": "Svi sustavi su operativni", "All Systems Operational": "Svi sustavi su operativni",
@ -183,7 +183,7 @@ export default {
"Edit Status Page": "Uredi Statusnu stranicu", "Edit Status Page": "Uredi Statusnu stranicu",
"Go to Dashboard": "Na Kontrolnu ploču", "Go to Dashboard": "Na Kontrolnu ploču",
"Status Page": "Statusna stranica", "Status Page": "Statusna stranica",
defaultNotificationName: "Moja {notification} obavijest ({number})", defaultNotificationName: "Moja {number}. {notification} obavijest",
here: "ovdje", here: "ovdje",
Required: "Potrebno", Required: "Potrebno",
telegram: "Telegram", telegram: "Telegram",
@ -195,16 +195,16 @@ export default {
"YOUR BOT TOKEN HERE": "OVDJE IDE TOKEN BOTA", "YOUR BOT TOKEN HERE": "OVDJE IDE TOKEN BOTA",
chatIDNotFound: "ID razgovora nije pronađen; prvo morate poslati poruku botu", chatIDNotFound: "ID razgovora nije pronađen; prvo morate poslati poruku botu",
webhook: "Webhook", webhook: "Webhook",
"Post URL": "Post URL", "Post URL": "URL Post zahtjeva",
"Content Type": "Tip sadržaja (Content Type)", "Content Type": "Tip sadržaja (Content Type)",
webhookJsonDesc: "{0} je moguća opcija za moderne HTTP poslužitelje poput Express.js-a", 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}", webhookFormDataDesc: "{multipart} je moguća alternativa za PHP, samo je potrebno parsirati JSON koristeći {decodeFunction}",
smtp: "E-pošta (SMTP)", smtp: "E-mail (SMTP)",
secureOptionNone: "Bez sigurnosti / STARTTLS (25, 587)", secureOptionNone: "Bez sigurnosti / STARTTLS (25, 587)",
secureOptionTLS: "TLS (465)", secureOptionTLS: "TLS (465)",
"Ignore TLS Error": "Ignoriraj greške TLS-a", "Ignore TLS Error": "Ignoriraj greške TLS-a",
"From Email": "Adresa za From polje", "From Email": "Adresa za \"From\" polje",
emailCustomSubject: "Prilagođeno Subject polje", emailCustomSubject: "Prilagođeno \"Subject\" polje",
"To Email": "Odredišne adrese e-pošte", "To Email": "Odredišne adrese e-pošte",
smtpCC: "Cc", smtpCC: "Cc",
smtpBCC: "Bcc", smtpBCC: "Bcc",
@ -215,7 +215,7 @@ export default {
"Prefix Custom Message": "Prefiks prilagođene poruke", "Prefix Custom Message": "Prefiks prilagođene poruke",
"Hello @everyone is...": "Pozdrav {'@'}everyone...", "Hello @everyone is...": "Pozdrav {'@'}everyone...",
teams: "Microsoft Teams", teams: "Microsoft Teams",
"Webhook URL": "URL Teams webhooka", "Webhook URL": "URL webhooka",
wayToGetTeamsURL: "Više informacija o Teams webhookovima možete pročitati {0}.", wayToGetTeamsURL: "Više informacija o Teams webhookovima možete pročitati {0}.",
signal: "Signal", signal: "Signal",
Number: "Broj", Number: "Broj",
@ -233,7 +233,7 @@ export default {
"Uptime Kuma URL": "Uptime Kuma URL", "Uptime Kuma URL": "Uptime Kuma URL",
aboutWebhooks: "Dodatne informacije o webhookovima su dostupne na: {0}", 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", 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.", aboutKumaURL: "Ako je polje \"Uptime Kuma URL\" prazno, koristi se zadana vrijednost koja vodi na GitHub stranicu projekta.",
emojiCheatSheet: "Popis emotikona: {0}", emojiCheatSheet: "Popis emotikona: {0}",
"rocket.chat": "Rocket.Chat", "rocket.chat": "Rocket.Chat",
pushover: "Pushover", pushover: "Pushover",
@ -242,7 +242,7 @@ export default {
promosms: "PromoSMS", promosms: "PromoSMS",
clicksendsms: "ClickSend SMS", clicksendsms: "ClickSend SMS",
lunasea: "LunaSea", lunasea: "LunaSea",
apprise: "Apprise (Support 50+ Notification services)", apprise: "Apprise (Podržava preko 50 usluga za obavijesti)",
pushbullet: "Pushbullet", pushbullet: "Pushbullet",
line: "LINE", line: "LINE",
mattermost: "Mattermost", mattermost: "Mattermost",
@ -252,7 +252,7 @@ export default {
"Notification Sound": "Zvuk obavijesti", "Notification Sound": "Zvuk obavijesti",
"More info on:": "Više informacija na: {0}", "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.", 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.", pushoverDesc2: "Ako želite slati obavijesti na više uređaja, ispunite polje \"Uređaji\".",
"SMS Type": "Tip SMS-a", "SMS Type": "Tip SMS-a",
octopushTypePremium: "Premium (Brzo - preporučeno za obavijesti)", octopushTypePremium: "Premium (Brzo - preporučeno za obavijesti)",
octopushTypeLowCost: "Low Cost (Sporo - mobilni operateri ponekad blokiraju ove poruke)", octopushTypeLowCost: "Low Cost (Sporo - mobilni operateri ponekad blokiraju ove poruke)",
@ -277,7 +277,7 @@ export default {
"Basic Settings": "Osnovne Postavke", "Basic Settings": "Osnovne Postavke",
"User ID": "Korisnički ID", "User ID": "Korisnički ID",
"Messaging API": "API za razmjenu poruka", "Messaging API": "API za razmjenu poruka",
wayToGetLineChannelToken: "Prvo, pristupite {0}, kreirajte create a pružatelja usluga te kanal (API za razmjenu poruka), zatim možete dobiti you can get the token za pristup kanalu te korisnički ID za polja iznad.", 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", "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\".", 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", 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",
@ -286,19 +286,19 @@ export default {
promosmsTypeFlash: "SMS FLASH - Poruka se automatski pojavljuje na uređaju primatelja. 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.", 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).", promosmsTypeSpeed: "SMS SPEED - Usluga najvećeg prioriteta. Brza i pouzdana, ali skupa (otprilike dvostruko skuplja od cijene usluge SMS FULL).",
promosmsPhoneNumber: "Telefonski broj (za primitalje unutar Poljske nije potrebno navoditi pozivni broj države)", 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", promosmsSMSSender: "Naziv SMS pošiljatelja: Registriran naziv ili jedan od zadanih: InfoSMS, SMS Info, MaxSMS, INFO, SMS",
"Feishu WebHookUrl": "Feishu URL webhooka", "Feishu WebHookUrl": "Feishu URL webhooka",
matrixHomeserverURL: "URL homeservera (uključujući http(s):// te port, ako je potrebno)", matrixHomeserverURL: "URL Matrix homeservera (uključujući http(s):// te port, ako je potrebno)",
"Internal Room Id": "Interni ID sobe", "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.", 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ča 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}", 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", Method: "Metoda",
Body: "Tijelo", Body: "Tijelo",
Headers: "Zaglavlja", Headers: "Zaglavlja",
PushUrl: "Push URL", PushUrl: "Push URL",
HeadersInvalidFormat: "Zaglavlja nisu nije valjani JSON: ", HeadersInvalidFormat: "Zaglavlja nisu nije valjani JSON: ",
BodyInvalidFormat: "Tijelo zahjeva nije valjani JSON: ", BodyInvalidFormat: "Tijelo zahtjeva nije valjani JSON: ",
"Monitor History": "Povijest monitora", "Monitor History": "Povijest monitora",
clearDataOlderThan: "Podaci o povijesti monitora čuvaju se {0} dana.", clearDataOlderThan: "Podaci o povijesti monitora čuvaju se {0} dana.",
PasswordsDoNotMatch: "Lozinke se ne poklapaju.", PasswordsDoNotMatch: "Lozinke se ne poklapaju.",
@ -307,4 +307,43 @@ export default {
"Showing {from} to {to} of {count} records": "Prikaz zapisa {from}-{to} od sveukupno {count}", "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: ", 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", "Current User": "Trenutni korisnik",
recent: "Nedavno",
Done: "Gotovo",
Info: "Informacije",
Security: "Sigurnost",
"Shrink Database": "Smanji bazu podataka",
"Pick a RR-Type...": "Odaberite vrstu DNS zapisa od navedenih...",
"Pick Accepted Status Codes...": "Odaberite HTTP statusne kodove koji će biti prihvaćeni...",
"Steam API Key": "Steam API ključ",
Default: "Zadano",
"HTTP Options": "HTTP Postavke",
"Create Incident": "Novi izvještaj o incidentu",
Title: "Naslov",
Content: "Sadržaj",
Style: "Stil",
info: "informacija",
warning: "upozorenje",
danger: "opasnost",
primary: "primarno",
light: "svijetlo",
dark: "tamno",
Post: "Objavi",
Created: "Stvoreno",
"Last Updated": "Uređeno",
"Please input title and content": "Naslov i sadržaj ne mogu biti prazni",
Unpin: "Ukloni",
"Switch to Light Theme": "Prebaci na svijetli način",
"Switch to Dark Theme": "Prebaci na tamni način",
"Show Tags": "Pokaži oznake",
"Hide Tags": "Sakrij oznake",
Description: "Opis",
"No monitors available.": "Nema dostupnih monitora.",
"Add one": "Stvori jednog",
"No Monitors": "Bez monitora",
"Untitled Group": "Bezimena grupa",
Services: "Usluge",
Discard: "Odbaci",
Cancel: "Otkaži",
"Powered by": "Pokreće",
Saved: "Spremljeno",
}; };

@ -2,26 +2,26 @@ export default {
languageName: "Magyar", languageName: "Magyar",
checkEverySecond: "Ellenőrzés {0} másodpercenként", checkEverySecond: "Ellenőrzés {0} másodpercenként",
retryCheckEverySecond: "Újrapróbál {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", 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", 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ú.", 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.", 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.", acceptedStatusCodesDescription: "Válassza ki az állapot kódokat amelyek sikeres válasznak fognak számítani.",
passwordNotMatchMsg: "A megismételt jelszó nem egyezik.", passwordNotMatchMsg: "A megismételt jelszó nem egyezik.",
notificationDescription: "Kérem, rendeljen egy értesítést a figyeléshez, hogy működjön.", 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", pauseDashboardHome: "Szünetel",
deleteMonitorMsg: "Biztos, hogy törölni akarja ezt a figyelőt?", 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?", 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.", resolverserverDescription: "A Cloudflare az alapértelmezett szerver, bármikor meg tudja változtatni a resolver server-t.",
rrtypeDescription: "Válassza ki az RR-Típust a figyelőhöz", rrtypeDescription: "Válassza ki az RR-típust a figyelőhöz",
pauseMonitorMsg: "Biztos, hogy szüneteltetni akarja?", 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.", 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?", 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?", clearHeartbeatsMsg: "Biztos, hogy törölni akar minden életjelet ennél a figyelőnél?",
confirmClearStatisticsMsg: "Biztos, hogy törölni akat MINDEN statisztikát?", 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.", 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", 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.", tokenValidSettingsMsg: "A token érvényes! El tudja menteni a 2FA beállításait.",
confirmEnableTwoFAMsg: "Biztosan engedélyezi a 2FA-t?", confirmEnableTwoFAMsg: "Biztosan engedélyezi a 2FA-t?",
@ -54,23 +54,23 @@ export default {
Delete: "Törlés", Delete: "Törlés",
Current: "Aktuális", Current: "Aktuális",
Uptime: "Uptime", Uptime: "Uptime",
"Cert Exp.": "Tanúsítvány lejár", "Cert Exp.": "SSL lejárat",
days: "napok", days: "nap",
day: "nap", day: "nap",
"-day": "-nap", "-day": " nap",
hour: "óra", hour: "óra",
"-hour": "-óra", "-hour": " óra",
Response: "Válasz", Response: "Válasz",
Ping: "Ping", Ping: "Ping",
"Monitor Type": "Figyelő típusa", "Monitor Type": "Figyelő típusa",
Keyword: "Kulcsszó", Keyword: "Kulcsszó",
"Friendly Name": "Rövid név", "Friendly Name": "Rövid név",
URL: "URL", URL: "URL",
Hostname: "Hostnév", Hostname: "Hosztnév",
Port: "Port", Port: "Port",
"Heartbeat Interval": "Heartbeat időköz", "Heartbeat Interval": "Életjel időköz",
Retries: "Újrapróbálkozás", 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ó", Advanced: "Haladó",
"Upside Down Mode": "Fordított mód", "Upside Down Mode": "Fordított mód",
"Max. Redirects": "Max. átirányítás", "Max. Redirects": "Max. átirányítás",
@ -82,8 +82,8 @@ export default {
Light: "Világos", Light: "Világos",
Dark: "Sötét", Dark: "Sötét",
Auto: "Auto", Auto: "Auto",
"Theme - Heartbeat Bar": "Téma - Heartbeat Bar", "Theme - Heartbeat Bar": "Téma - Életjel sáv",
Normal: "Normal", Normal: "Normál",
Bottom: "Nyomógomb", Bottom: "Nyomógomb",
None: "Nincs", None: "Nincs",
Timezone: "Időzóna", Timezone: "Időzóna",
@ -97,9 +97,9 @@ export default {
"Update Password": "Jelszó módosítása", "Update Password": "Jelszó módosítása",
"Disable Auth": "Hitelesítés tiltása", "Disable Auth": "Hitelesítés tiltása",
"Enable Auth": "Hitelesítés engedélyezése", "Enable Auth": "Hitelesítés engedélyezése",
Logout: "Kijelenetkezés", Logout: "Kijelentkezés",
Leave: "Elhagy", 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", Confirm: "Megerősítés",
Yes: "Igen", Yes: "Igen",
No: "Nem", No: "Nem",
@ -113,7 +113,7 @@ export default {
Email: "Email", Email: "Email",
Test: "Teszt", Test: "Teszt",
"Certificate Info": "Tanúsítvány információk", "Certificate Info": "Tanúsítvány információk",
"Resolver Server": "Resolver szerver", "Resolver Server": "DNS szerver",
"Resource Record Type": "Resource Record típusa", "Resource Record Type": "Resource Record típusa",
"Last Result": "Utolsó eredmény", "Last Result": "Utolsó eredmény",
"Create your admin account": "Hozza létre az adminisztrátor felhasználót", "Create your admin account": "Hozza létre az adminisztrátor felhasználót",
@ -129,11 +129,11 @@ export default {
Create: "Létrehozás", Create: "Létrehozás",
"Clear Data": "Adatok törlése", "Clear Data": "Adatok törlése",
Events: "Események", Events: "Események",
Heartbeats: "Heartbeats", Heartbeats: "Életjelek",
"Auto Get": "Auto Get", "Auto Get": "Auto lekérd.",
backupDescription: "Ki tudja menteni az összes figyelőt és értesítést egy JSON fájlba.", backupDescription: "Mentheti az összes figyelőt és értesítést egy JSON fájlba.",
backupDescription2: "Ui.: Történeti és esemény adatokat nem tartalmaz.", 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. Figyelmesen őrizze!", 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.", alertNoFile: "Válaszzon ki egy fájlt az importáláshoz.",
alertWrongFileType: "Válasszon egy JSON fájlt.", alertWrongFileType: "Válasszon egy JSON fájlt.",
"Clear all statistics": "Összes statisztika törlése", "Clear all statistics": "Összes statisztika törlése",
@ -144,17 +144,17 @@ export default {
"Verify Token": "Token ellenőrzése", "Verify Token": "Token ellenőrzése",
"Setup 2FA": "2FA beállítása", "Setup 2FA": "2FA beállítása",
"Enable 2FA": "2FA engedélyezése", "Enable 2FA": "2FA engedélyezése",
"Disable 2FA": "2FA toltása", "Disable 2FA": "2FA tiltása",
"2FA Settings": "2FA beállítások", "2FA Settings": "2FA beállítások",
"Two Factor Authentication": "Two Factor Authentication", "Two Factor Authentication": "Kétfaktoros hitelesítés",
Active: "Aktív", Active: "Aktív",
Inactive: "Inaktív", Inactive: "Inaktív",
Token: "Token", Token: "Token",
"Show URI": "URI megmutatása", "Show URI": "URI megmutatása",
Tags: "Cimkék", Tags: "Címkék",
"Add New below or Select...": "Adjon hozzá lentre vagy válasszon...", "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 name already exist.": "Ilyen nevű címke már létezik.",
"Tag with this value already exist.": "Ilyen értékű cimke már létezik.", "Tag with this value already exist.": "Ilyen értékű címke már létezik.",
color: "szín", color: "szín",
"value (optional)": "érték (opcionális)", "value (optional)": "érték (opcionális)",
Gray: "Szürke", Gray: "Szürke",
@ -169,15 +169,15 @@ export default {
"Avg. Ping": "Átl. ping", "Avg. Ping": "Átl. ping",
"Avg. Response": "Átl. válasz", "Avg. Response": "Átl. válasz",
"Entry Page": "Nyitólap", "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", "No Services": "Nincs szolgáltatás",
"All Systems Operational": "Minden rendszer működik", "All Systems Operational": "Minden rendszer működik",
"Partially Degraded Service": "Részlegesen leállt szolgáltatás", "Partially Degraded Service": "Részlegesen leállt szolgáltatás",
"Degraded Service": "Leállt szolgáltatás", "Degraded Service": "Leállt szolgáltatás",
"Add Group": "Csoport hozzáadása", "Add Group": "Csoport hozzáadása",
"Add a monitor": "Figyelő hozzáadása", "Add a monitor": "Figyelő hozzáadása",
"Edit Status Page": "Sátusz oldal szerkesztése", "Edit Status Page": "Státusz oldal szerkesztése",
"Go to Dashboard": "Menj az irányítópulthoz", "Go to Dashboard": "Irányítópulthoz",
telegram: "Telegram", telegram: "Telegram",
webhook: "Webhook", webhook: "Webhook",
smtp: "Email (SMTP)", smtp: "Email (SMTP)",
@ -192,9 +192,173 @@ export default {
octopush: "Octopush", octopush: "Octopush",
promosms: "PromoSMS", promosms: "PromoSMS",
lunasea: "LunaSea", lunasea: "LunaSea",
apprise: "Apprise (Support 50+ Notification services)", apprise: "Apprise (50+ értesítési szolgáltatás)",
pushbullet: "Pushbullet", pushbullet: "Pushbullet",
line: "Line Messenger", line: "Line Messenger",
mattermost: "Mattermost", 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ő)",
}; };

@ -7,13 +7,13 @@ export default {
upsideDownModeDescription: "Balikkan statusnya. Jika layanan dapat dijangkau, TIDAK AKTIF.", upsideDownModeDescription: "Balikkan statusnya. Jika layanan dapat dijangkau, TIDAK AKTIF.",
maxRedirectDescription: "Jumlah maksimum pengalihan untuk diikuti. Setel ke 0 untuk menonaktifkan pengalihan.", maxRedirectDescription: "Jumlah maksimum pengalihan untuk diikuti. Setel ke 0 untuk menonaktifkan pengalihan.",
acceptedStatusCodesDescription: "Pilih kode status yang dianggap sebagai tanggapan yang berhasil.", 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.", notificationDescription: "Harap atur notifikasi ke monitor agar berfungsi.",
keywordDescription: "Cari kata kunci dalam code html atau JSON huruf besar-kecil berpengaruh", keywordDescription: "Cari kata kunci dalam code html atau JSON huruf besar-kecil berpengaruh",
pauseDashboardHome: "Jeda", pauseDashboardHome: "Jeda",
deleteMonitorMsg: "Apakah Anda mau menghapus monitor ini?", 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.", resolverserverDescription: "Cloudflare adalah server bawaan, Anda dapat mengubah server resolver kapan saja.",
rrtypeDescription: "Pilih RR-Type yang mau Anda monitor", rrtypeDescription: "Pilih RR-Type yang mau Anda monitor",
pauseMonitorMsg: "Apakah Anda yakin mau menjeda?", pauseMonitorMsg: "Apakah Anda yakin mau menjeda?",
enableDefaultNotificationDescription: "Untuk setiap monitor baru, notifikasi ini akan diaktifkan secara bawaan. Anda masih dapat menonaktifkan notifikasi secara terpisah untuk setiap monitor.", enableDefaultNotificationDescription: "Untuk setiap monitor baru, notifikasi ini akan diaktifkan secara bawaan. Anda masih dapat menonaktifkan notifikasi secara terpisah untuk setiap monitor.",
@ -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.", 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.", 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", twoFAVerifyLabel: "Silakan ketik token Anda untuk memverifikasi bahwa 2FA berfungsi",
tokenValidSettingsMsg: "Tokennya benar! Anda sekarang dapat menyimpan pengaturan 2FA.", tokenValidSettingsMsg: "Token benar! Anda sekarang dapat menyimpan pengaturan 2FA.",
confirmEnableTwoFAMsg: "Apakah Anda yakin ingin mengaktifkan 2FA?", confirmEnableTwoFAMsg: "Apakah anda yakin ingin mengaktifkan 2FA?",
confirmDisableTwoFAMsg: "Apakah Anda yakin ingin menonaktifkan 2FA?", confirmDisableTwoFAMsg: "Apakah anda yakin ingin menonaktifkan 2FA?",
Settings: "Pengaturan", Settings: "Pengaturan",
Dashboard: "Dasbor", Dashboard: "Dasbor",
"New Update": "Pembaruan Baru", "New Update": "Pembaruan Baru",
@ -276,7 +276,7 @@ export default {
promosmsTypeEco: "SMS ECO - murah tapi lambat dan sering kelebihan beban. Terbatas hanya untuk penerima Polandia.", 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.", 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.", 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)", 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", promosmsSMSSender: "Nama Pengirim SMS : Nama pra-registrasi atau salah satu bawaan: InfoSMS, Info SMS, MaxSMS, INFO, SMS",
"Feishu WebHookUrl": "Feishu WebHookUrl", "Feishu WebHookUrl": "Feishu WebHookUrl",

@ -2,48 +2,49 @@ export default {
languageName: "Italiano (Italian)", languageName: "Italiano (Italian)",
checkEverySecond: "controlla ogni {0} secondi", checkEverySecond: "controlla ogni {0} secondi",
retryCheckEverySecond: "Riprova 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.", 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 in HTTPS.", ignoreTLSError: "Ignora gli errori TLS/SSL per i siti HTTPS.",
upsideDownModeDescription: "Capovolgi lo stato. Se il servizio è raggiungibile viene marcato come \"GIÙ\".", upsideDownModeDescription: "Se il servizio risulta raggiungibile viene marcato come \"DOWN\".",
maxRedirectDescription: "Numero massimo di redirezionamenti consentito. Per disabilitare impostare \"0\".", maxRedirectDescription: "Numero massimo di redirezionamenti consentito. Per disabilitare, impostare \"0\".",
acceptedStatusCodesDescription: "Inserire i codici di stato considerati come risposte corrette.", acceptedStatusCodesDescription: "Elenco di codici di stato HTTP che sono considerati validi.",
passwordNotMatchMsg: "La password non coincide.", 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", keywordDescription: "Cerca la parola chiave nella risposta in html o JSON e fai distinzione tra maiuscole e minuscole",
pauseDashboardHome: "In Pausa", 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?", deleteNotificationMsg: "Si è certi di voler eliminare questa notifica per tutti gli oggetti monitorati?",
resoverserverDescription: "Cloudflare è il server predefinito, è possibile cambiare il server DNS.", resolverserverDescription: "Cloudflare è il server predefinito, è possibile cambiare il server DNS.",
rrtypeDescription: "Scegliere il tipo di RR che si vuole monitorare", rrtypeDescription: "Scegliere il tipo di RR che si vuole monitorare",
pauseMonitorMsg: "Si è certi di voler mettere in pausa?", 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?", 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?", clearHeartbeatsMsg: "Si è certi di voler eliminare tutti gli intervalli di controllo per questo servizio?",
confirmClearStatisticsMsg: "Si è certi di voler eliminare TUTTE le statistiche?", 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.", 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.", tokenValidSettingsMsg: "Il token è valido! È ora possibile salvare le impostazioni.",
confirmEnableTwoFAMsg: "Si è certi di voler abilitare l'autenticazione a due fattori?", confirmEnableTwoFAMsg: "Si è certi di voler abilitare l'autenticazione a due fattori?",
confirmDisableTwoFAMsg: "Si è certi di voler disabilitare l'autenticazione a due fattori?", confirmDisableTwoFAMsg: "Si è certi di voler disabilitare l'autenticazione a due fattori?",
Settings: "Impostazioni", Settings: "Impostazioni",
Dashboard: "Cruscotto", Dashboard: "Dashboard",
"New Update": "Nuovo Aggiornamento Disponibile", "New Update": "Nuovo aggiornamento disponibile!",
Language: "Lingua", Language: "Lingua",
Appearance: "Aspetto", Appearance: "Aspetto",
Theme: "Tema", Theme: "Tema",
General: "Generali", General: "Generale",
"Primary Base URL": "URL base primario",
Version: "Versione", Version: "Versione",
"Check Update On GitHub": "Controlla aggiornamenti su GitHub", "Check Update On GitHub": "Controlla aggiornamenti su GitHub",
List: "Lista", List: "Lista",
Add: "Aggiungi", Add: "Aggiungi",
"Add New Monitor": "Aggiungi un nuovo monitoraggio", "Add New Monitor": "Aggiungi nuovo monitor",
"Quick Stats": "Statistiche rapide", "Quick Stats": "Statistiche rapide",
Up: "Su", Up: "Up",
Down: "Giù", Down: "Down",
Pending: "Pendente", Pending: "In attesa",
Unknown: "Sconosciuti", Unknown: "Sconosciuti",
Pause: "Metti in Pausa", Pause: "Metti in pausa",
Name: "Nome", Name: "Nome",
Status: "Stato", Status: "Stato",
DateTime: "Data e Ora", DateTime: "Data e Ora",
@ -62,67 +63,70 @@ export default {
"-hour": "-ore", "-hour": "-ore",
Response: "Risposta", Response: "Risposta",
Ping: "Ping", Ping: "Ping",
"Monitor Type": "Tipo di Monitoraggio", "Monitor Type": "Modalità di monitoraggio",
Keyword: "Parola chiave", Keyword: "Parola chiave",
"Friendly Name": "Nome Amichevole", "Friendly Name": "Nome",
URL: "URL", URL: "URL",
Hostname: "Nome Host", Hostname: "Nome Host",
Port: "Porta", Port: "Porta",
"Heartbeat Interval": "Intervallo di controllo", "Heartbeat Interval": "Intervallo di controllo",
Retries: "Tentativi", 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", Advanced: "Avanzate",
"Upside Down Mode": "Modalità capovolta", "Upside Down Mode": "Modalità invertita",
"Max. Redirects": "Reindirizzamenti massimi", "Max. Redirects": "Reindirizzamenti massimi",
"Accepted Status Codes": "Codici di stato accettati", "Accepted Status Codes": "Codici di stato accettati",
"Push URL": "Push URL",
needPushEvery: "Notificare questo URL ogni {0} secondi.",
pushOptionalParams: "Parametri aggiuntivi: {0}",
Save: "Salva", Save: "Salva",
Notifications: "Notifiche", Notifications: "Notifiche",
"Not available, please setup.": "Non disponibili, da impostare.", "Not available, please setup.": "Non disponibili, da configurare.",
"Setup Notification": "Imposta le notifiche", "Setup Notification": "Configura le notifiche",
Light: "Chiaro", Light: "Chiaro",
Dark: "Scuro", Dark: "Scuro",
Auto: "Automatico", Auto: "Automatico",
"Theme - Heartbeat Bar": "Tema - Barra di Stato", "Theme - Heartbeat Bar": "Tema (barra di stato)",
Normal: "Normale", Normal: "Normale",
Bottom: "Sotto", Bottom: "Sotto",
None: "Nessuna", None: "Nessuna",
Timezone: "Fuso Orario", Timezone: "Fuso Orario",
"Search Engine Visibility": "Visibilità ai motori di ricerca", "Search Engine Visibility": "Visibilità ai motori di ricerca",
"Allow indexing": "Permetti l'indicizzazione", "Allow indexing": "Consenti l'indicizzazione",
"Discourage search engines from indexing site": "Scoraggia l'indicizzazione da parte dei motori di ricerca", "Discourage search engines from indexing site": "Evita l'indicizzazione ai motori di ricerca",
"Change Password": "Cambio Password", "Change Password": "Cambia password",
"Current Password": "Password Corrente", "Current Password": "Password corrente",
"New Password": "Nuova Password", "New Password": "Nuova password",
"Repeat New Password": "Ripetere la nuova Password", "Repeat New Password": "Ripeti nuova password",
"Update Password": "Modifica Password", "Update Password": "Modifica password",
"Disable Auth": "Disabilita l'autenticazione", "Disable Auth": "Disabilita autenticazione",
"Enable Auth": "Abilita Autenticazione", "Enable Auth": "Abilita autenticazione",
Logout: "Esci", Logout: "Esci",
Leave: "Annulla", Leave: "Annulla",
"I understand, please disable": "Lo capisco, disabilitare l'autenticazione.", "I understand, please disable": "Lo capisco, disabilitare l'autenticazione.",
Confirm: "Conferma", Confirm: "Conferma",
Yes: "Sì", Yes: "Sì",
No: "No", No: "No",
Username: "Nome Utente", Username: "Nome utente",
Password: "Password", Password: "Password",
"Remember me": "Ricordami", "Remember me": "Ricorda credenziali",
Login: "Accesso", Login: "Accesso",
"No Monitors, please": "Nessun monitoraggio, cortesemente", "No Monitors, please": "Nessun monitor presente,",
"add one": "aggiungerne uno", "add one": "aggiungine uno!",
"Notification Type": "Tipo di notifica", "Notification Type": "Servizio di notifica",
Email: "E-mail", Email: "E-mail",
Test: "Prova", Test: "Fai una prova",
"Certificate Info": "Informazioni sul certificato", "Certificate Info": "Informazioni sul certificato",
"Resolver Server": "Server DNS", "Resolver Server": "Server DNS",
"Resource Record Type": "Tipo di Resource Record", "Resource Record Type": "Tipo di Resource Record",
"Last Result": "Ultimo risultato", "Last Result": "Ultimo risultato",
"Create your admin account": "Crea l'account amministratore", "Create your admin account": "Crea l'account amministratore",
"Repeat Password": "Ripeti Password", "Repeat Password": "Ripeti password",
"Import Backup": "Importa Backup", "Import Backup": "Importa backup",
"Export Backup": "Esporta Backup", "Export Backup": "Esporta backup",
Export: "Esporta", Export: "Esporta",
Import: "Importa", Import: "Importa",
respTime: "Tempo di Risposta (ms)", respTime: "Tempo di risposta (ms)",
notAvailableShort: "N/D", notAvailableShort: "N/D",
"Default enabled": "Abilitato di default", "Default enabled": "Abilitato di default",
"Apply on all existing monitors": "Applica su tutti i monitoraggi", "Apply on all existing monitors": "Applica su tutti i monitoraggi",
@ -130,71 +134,231 @@ export default {
"Clear Data": "Cancella dati", "Clear Data": "Cancella dati",
Events: "Eventi", Events: "Eventi",
Heartbeats: "Controlli", 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.", 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.", 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, tenere quindi in un luogo sicuro.", 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.", alertNoFile: "Selezionare il file da importare.",
alertWrongFileType: "Selezionare un file JSON.", alertWrongFileType: "Selezionare un file JSON.",
"Clear all statistics": "Pulisci tutte le statistiche", "Clear all statistics": "Cancella tutte le statistiche",
"Skip existing": "Ignora gli esistenti", "Skip existing": "Ignora esistenti",
Overwrite: "Sovrascrivi", Overwrite: "Sovrascrivi",
Options: "Opzioni", Options: "Opzioni",
"Keep both": "Mantieni entrambi", "Keep both": "Mantieni entrambi",
"Verify Token": "Verifica Token", "Verify Token": "Verifica token",
"Setup 2FA": "Imposta l'autenticazione a due fattori", "Setup 2FA": "Configura 2FA",
"Enable 2FA": "Abilita l'autenticazione a due fattori", "Enable 2FA": "Abilita 2FA",
"Disable 2FA": "Disabilita l'autenticazione a due fattori", "Disable 2FA": "Disabilita 2FA",
"2FA Settings": "Impostazioni autenticazione a due fattori", "2FA Settings": "Gestisci l'autenticazione a due fattori",
"Two Factor Authentication": "Autenticazione a due fattori", "Two Factor Authentication": "Autenticazione a due fattori (2FA)",
Active: "Attivata", Active: "Attivata",
Inactive: "Disattivata", Inactive: "Disattivata",
Token: "Token", Token: "Token",
"Show URI": "Mostra URI", "Show URI": "Mostra URI",
Tags: "Etichette", 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 name already exist.": "Un'etichetta con questo nome già esiste.",
"Tag with this value already exist.": "Un'etichetta con questo valore già esiste.", "Tag with this value already exist.": "Un'etichetta con questo valore già esiste.",
color: "colori", color: "colore",
"value (optional)": "valore (opzionale)", "value (optional)": "descrizione (opzionale)",
Gray: "Grigio", Gray: "Grigio",
Red: "Rosso", Red: "Rosso",
Orange: "Arancione", Orange: "Arancione",
Green: "Verde", Green: "Verde",
Blue: "Blu", Blue: "Blu",
Indigo: "Indigo", Indigo: "Indaco",
Purple: "Viola", Purple: "Viola",
Pink: "Rosa", Pink: "Rosa",
"Search...": "Cerca...", "Search...": "Cerca...",
"Avg. Ping": "Ping medio", "Avg. Ping": "Tempo medio di risposta al ping",
"Avg. Response": "Risposta media", "Avg. Response": "Tempo medio di risposta",
"Entry Page": "Entry Page", "Entry Page": "Pagina Principale",
statusPageNothing: "Non c'è nulla qui, aggiungere un gruppo oppure un monitoraggio.", statusPageNothing: "Non c'è nulla qui, aggiungi un gruppo oppure un monitor.",
"No Services": "Nessun Servizio", "No Services": "Nessun servizio",
"All Systems Operational": "Tutti i sistemi sono operativi", "All Systems Operational": "Tutti i sistemi sono funzionali",
"Partially Degraded Service": "Servizio parzialmente degradato", "Partially Degraded Service": "Servizio parzialmente degradato",
"Degraded Service": "Servizio degradato", "Degraded Service": "Servizio degradato",
"Add Group": "Aggiungi Gruppo", "Add Group": "Aggiungi gruppo",
"Add a monitor": "Aggiungi un monitoraggio", "Add a monitor": "Aggiungi monitor",
"Edit Status Page": "Modifica pagina di stato", "Edit Status Page": "Modifica pagina di stato",
"Go to Dashboard": "Vai al Cruscotto", "Go to Dashboard": "Vai alla dashboard",
"Status Page": "Status Page", "Status Page": "Pagina di stato",
defaultNotificationName: "Notifica {notification} ({number})",
here: "qui",
Required: "Obbligatorio",
telegram: "Telegram", 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", 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: "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", teams: "Microsoft Teams",
"Webhook URL": "URL Webhook",
wayToGetTeamsURL: "È possibile imparare a creare un URL Webhook {0}.",
signal: "Signal", 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", gotify: "Gotify",
"Application Token": "Token Applicazione",
"Server URL": "URL Server",
Priority: "Priorità",
slack: "Slack", 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", "rocket.chat": "Rocket.chat",
pushover: "Pushover", pushover: "Pushover",
pushy: "Pushy", pushy: "Pushy",
octopush: "Octopush", octopush: "Octopush",
promosms: "PromoSMS", promosms: "PromoSMS",
clicksendsms: "ClickSend SMS",
lunasea: "LunaSea", lunasea: "LunaSea",
apprise: "Apprise (Support 50+ Notification services)", apprise: "Apprise (Supporta più di 50 servizi di notifica)",
pushbullet: "Pushbullet", pushbullet: "Pushbullet",
line: "Line Messenger", line: "Line Messenger",
mattermost: "Mattermost", 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)",
}; };

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

@ -13,7 +13,7 @@ export default {
pauseDashboardHome: "일시 정지", pauseDashboardHome: "일시 정지",
deleteMonitorMsg: "정말 이 모니터링을 삭제할까요?", deleteMonitorMsg: "정말 이 모니터링을 삭제할까요?",
deleteNotificationMsg: "정말 이 알림을 모든 모니터링에서 삭제할까요?", deleteNotificationMsg: "정말 이 알림을 모든 모니터링에서 삭제할까요?",
resoverserverDescription: "Cloudflare가 기본 서버예요, 원한다면 언제나 다른 Resolver 서버로 변경할 수 있어요.", resolverserverDescription: "Cloudflare가 기본 서버예요, 원한다면 언제나 다른 Resolver 서버로 변경할 수 있어요.",
rrtypeDescription: "모니터링할 RR-Type을 선택해요.", rrtypeDescription: "모니터링할 RR-Type을 선택해요.",
pauseMonitorMsg: "정말 이 모니터링을 일시 정지할까요?", pauseMonitorMsg: "정말 이 모니터링을 일시 정지할까요?",
enableDefaultNotificationDescription: "새로 추가하는 모든 모니터링에 이 알림을 기본적으로 활성화해요. 각 모니터에 대해 별도로 알림을 비활성화할 수 있어요.", enableDefaultNotificationDescription: "새로 추가하는 모든 모니터링에 이 알림을 기본적으로 활성화해요. 각 모니터에 대해 별도로 알림을 비활성화할 수 있어요.",
@ -194,7 +194,7 @@ export default {
"Post URL": "Post URL", "Post URL": "Post URL",
"Content Type": "Content Type", "Content Type": "Content Type",
webhookJsonDesc: "{0}은 express.js와 같은 최신 HTTP 서버에 적합해요.", webhookJsonDesc: "{0}은 express.js와 같은 최신 HTTP 서버에 적합해요.",
webhookFormDataDesc: "{multipart}은 PHP에 적합해요. {decodeFunction}를 기준으로 json을 디코딩하면 요.", webhookFormDataDesc: "{multipart}은 PHP에 적합해요. {decodeFunction}를 기준으로 json을 디코딩하면 되어요.",
smtp: "Email (SMTP)", smtp: "Email (SMTP)",
secureOptionNone: "없음 / STARTTLS (25, 587)", secureOptionNone: "없음 / STARTTLS (25, 587)",
secureOptionTLS: "TLS (465)", secureOptionTLS: "TLS (465)",
@ -245,7 +245,7 @@ export default {
"Message Title": "메시지 제목", "Message Title": "메시지 제목",
"Notification Sound": "알림음", "Notification Sound": "알림음",
"More info on:": "자세한 정보: {0}", "More info on:": "자세한 정보: {0}",
pushoverDesc1: "긴급 우선 순위 (2)는 재시도 사이에 기본적으로 30초의 타임아웃이 있고, 1시간 후에 만료요.", pushoverDesc1: "긴급 우선 순위 (2)는 재시도 사이에 기본적으로 30초의 타임아웃이 있고, 1시간 후에 만료되어요.",
pushoverDesc2: "다른 장치에 알림을 보내려면 장치칸을 입력해주세요.", pushoverDesc2: "다른 장치에 알림을 보내려면 장치칸을 입력해주세요.",
"SMS Type": "SMS 종류", "SMS Type": "SMS 종류",
octopushTypePremium: "프리미엄 (빠름) - 알림 기능에 적합해요)", octopushTypePremium: "프리미엄 (빠름) - 알림 기능에 적합해요)",
@ -270,13 +270,85 @@ export default {
"Messaging API": "Messaging API 메뉴", "Messaging API": "Messaging API 메뉴",
wayToGetLineChannelToken: "먼저 {0}에 액세스하고, 공급자 및 채널 (Messaging API)을 만든 다음, 각 메뉴 밑에 언급된 메뉴에서 채널 액세스 토큰과 사용자 ID를 얻을 수 있어요.", wayToGetLineChannelToken: "먼저 {0}에 액세스하고, 공급자 및 채널 (Messaging API)을 만든 다음, 각 메뉴 밑에 언급된 메뉴에서 채널 액세스 토큰과 사용자 ID를 얻을 수 있어요.",
"Icon URL": "아이콘 URL", "Icon URL": "아이콘 URL",
aboutIconURL: "\"Icon URL\"에 사진 링크를 입력해 프로필 사진을 설정할 수 있어요. 아이콘 이모지가 설정되어 있으면 적용되지 않을 거예요.", aboutIconURL: "\"아이콘 URL\"에 사진 링크를 입력해 프로필 사진을 설정할 수 있어요. 아이콘 이모지가 설정되어 있으면 적용되지 않을 거예요.",
aboutMattermostChannelName: "채널 이름을 입력하면 Webhook이 게시할 기본 채널을 재설정할 수 있어요. 이 설정은 Mattermost 웹훅 설정에서 활성화해야 해요. 예: #기타-채널", aboutMattermostChannelName: "채널 이름을 입력하면 Webhook이 게시할 기본 채널을 재설정할 수 있어요. 이 설정은 Mattermost 웹훅 설정에서 활성화해야 해요. 예: #기타-채널",
matrix: "매트릭스", matrix: "Matrix",
promosmsTypeEco: "SMS ECO - 저렴하지만 느리고 가끔 과부하에 걸려요. 폴란드 수신자만 사용할 수 있어요. ", promosmsTypeEco: "SMS ECO - 저렴하지만 느리고 가끔 과부하에 걸려요. 폴란드 수신자만 사용할 수 있어요. ",
promosmsTypeFlash: "SMS FLASH - 메시지가 받는 사람 장치에 자동으로 표시요. 폴란드 수신자만 사용할 수 있어요.", promosmsTypeFlash: "SMS FLASH - 메시지가 받는 사람 장치에 자동으로 표시되어요. 폴란드 수신자만 사용할 수 있어요.",
promosmsTypeFull: "SMS FULL - SMS 프리미엄 티어, 보내는 사람 이름을 먼저 등록해야 해요. 알림 기능에 적합해요.", promosmsTypeFull: "SMS FULL - SMS 프리미엄 티어, 보내는 사람 이름을 먼저 등록해야 해요. 알림 기능에 적합해요.",
promosmsTypeSpeed: "SMS SPEED - 시스템에서 가장 높은 우선순위예요. 매우 빠르고 신뢰할 수 있지만 비용이 많이 들어요 (SMS 전체 가격의 약 두 배).", promosmsTypeSpeed: "SMS SPEED - 시스템에서 가장 높은 우선순위예요. 매우 빠르고 신뢰할 수 있지만 비용이 많이 들어요 (SMS 전체 가격의 약 두 배).",
promosmsPhoneNumber: "전화 번호 (폴란드 수신자라면 지역번호를 적지 않아도 요.)", promosmsPhoneNumber: "전화 번호 (폴란드 수신자라면 지역번호를 적지 않아도 되어요.)",
promosmsSMSSender: "SMS 보내는 사람 이름 : 미리 등록된 이름 혹은 기본값 중 하나예요: InfoSMS, SMS Info, MaxSMS, INFO, SMS", 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",
}; };

@ -4,24 +4,24 @@ export default {
retryCheckEverySecond: "Prøv igjen hvert {0} sekund.", retryCheckEverySecond: "Prøv igjen hvert {0} sekund.",
retriesDescription: "Maksimalt antall forsøk før tjenesten er merket som nede og et varsel sendes", retriesDescription: "Maksimalt antall forsøk før tjenesten er merket som nede og et varsel sendes",
ignoreTLSError: "Ignorer TLS/SSL-feil for HTTPS-nettsteder", 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.", 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.", passwordNotMatchMsg: "Passordene stemmer ikke overens.",
notificationDescription: "Tilordne et varsel for å overvåkningen for å få det til å fungere.", notificationDescription: "Varsler må tilordnes en overvåkning for å fungere.",
keywordDescription: "Søk etter nøkkelord i vanlig HTML eller JSON, og det er versalfølsom", keywordDescription: "Søk etter nøkkelord i ren HTML eller JSON. Søket skiller mellom store og små bokstaver.",
pauseDashboardHome: "Pause", pauseDashboardHome: "Pause",
deleteMonitorMsg: "Er du sikker på at du vil slette denne overvåkningen?", 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?", 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.", resolverserverDescription: "Cloudflare er standardserveren. Du kan endre DNS-serveren når som helst.",
rrtypeDescription: "Velg RR-typen du vil overvåke", 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.", 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?", 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?", 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?", 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.", 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", twoFAVerifyLabel: "Skriv inn tokenet ditt for å bekrefte at 2FA fungerer",
tokenValidSettingsMsg: "Token er gyldig! Du kan nå lagre 2FA-innstillingene.", tokenValidSettingsMsg: "Token er gyldig! Du kan nå lagre 2FA-innstillingene.",
confirmEnableTwoFAMsg: "Er du sikker på at du vil aktivere 2FA?", confirmEnableTwoFAMsg: "Er du sikker på at du vil aktivere 2FA?",
@ -50,7 +50,7 @@ export default {
Message: "Melding", Message: "Melding",
"No important events": "Ingen viktige hendelser", "No important events": "Ingen viktige hendelser",
Resume: "Fortsett", Resume: "Fortsett",
Edit: "Endre", Edit: "Rediger",
Delete: "Slett", Delete: "Slett",
Current: "Nåværende", Current: "Nåværende",
Uptime: "Oppetid", Uptime: "Oppetid",
@ -77,7 +77,7 @@ export default {
"Accepted Status Codes": "Godkjente statuskoder", "Accepted Status Codes": "Godkjente statuskoder",
Save: "Lagre", Save: "Lagre",
Notifications: "Varsler", Notifications: "Varsler",
"Not available, please setup.": "Ikke tilgjengelig, sett opp.", "Not available, please setup.": "Ikke tilgjengelig, venligst sett opp.",
"Setup Notification": "Sett opp varsel", "Setup Notification": "Sett opp varsel",
Light: "Lys", Light: "Lys",
Dark: "Mørk", Dark: "Mørk",
@ -87,9 +87,9 @@ export default {
Bottom: "Bunn", Bottom: "Bunn",
None: "Ingen", None: "Ingen",
Timezone: "Tidssone", Timezone: "Tidssone",
"Search Engine Visibility": "Søkemotor synlighet", "Search Engine Visibility": "Søkemotor-synlighet",
"Allow indexing": "Tillat indeksering", "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", "Change Password": "Endre passord",
"Current Password": "Nåværende passord", "Current Password": "Nåværende passord",
"New Password": "Nytt passord", "New Password": "Nytt passord",
@ -99,7 +99,7 @@ export default {
"Enable Auth": "Aktiver autentisering", "Enable Auth": "Aktiver autentisering",
Logout: "Logg ut", Logout: "Logg ut",
Leave: "Forlat", Leave: "Forlat",
"I understand, please disable": "Jeg forstår, deaktiver", "I understand, please disable": "Jeg forstår, vennligst deaktiver",
Confirm: "Bekreft", Confirm: "Bekreft",
Yes: "Ja", Yes: "Ja",
No: "Nei", No: "Nei",
@ -125,15 +125,15 @@ export default {
respTime: "Svartid (ms)", respTime: "Svartid (ms)",
notAvailableShort: "N/A", notAvailableShort: "N/A",
"Default enabled": "Standard aktivert", "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", Create: "Opprett",
"Clear Data": "Slett data", "Clear Data": "Slett data",
Events: "Hendelser", Events: "Hendelser",
Heartbeats: "Hjerteslag", Heartbeats: "Hjerteslag",
"Auto Get": "Auto Get", "Auto Get": "Auto Hent",
backupDescription: "Du kan sikkerhetskopiere alle overvåkninger og alle varsler til en JSON-fil.", backupDescription: "Du kan sikkerhetskopiere alle overvåkninger og alle varsler til en JSON-fil.",
backupDescription2: "PS: Historikk og hendelsesdata er ikke inkludert.", 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.", alertNoFile: "Velg en fil som skal importeres.",
alertWrongFileType: "Velg en JSON-fil.", alertWrongFileType: "Velg en JSON-fil.",
"Clear all statistics": "Fjern all statistikk", "Clear all statistics": "Fjern all statistikk",
@ -154,7 +154,7 @@ export default {
Tags: "Etiketter", Tags: "Etiketter",
"Add New below or Select...": "Legg til nytt nedenfor eller Velg ...", "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 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", color: "farge",
"value (optional)": "verdi (valgfritt)", "value (optional)": "verdi (valgfritt)",
Gray: "Grå", Gray: "Grå",
@ -172,29 +172,29 @@ export default {
statusPageNothing: "Ingenting her, vennligst legg til en gruppe eller en overvåkning.", statusPageNothing: "Ingenting her, vennligst legg til en gruppe eller en overvåkning.",
"No Services": "Ingen tjenester", "No Services": "Ingen tjenester",
"All Systems Operational": "Alle systemer i drift", "All Systems Operational": "Alle systemer i drift",
"Partially Degraded Service": "Delvis degradert drift", "Partially Degraded Service": "Delvis degradert tjeneste",
"Degraded Service": "Degradert drift", "Degraded Service": "Degradert tjeneste",
"Add Group": "Legg til gruppe", "Add Group": "Legg til gruppe",
"Add a monitor": "Legg til en overvåkning", "Add a monitor": "Legg til en overvåkning",
"Edit Status Page": "Rediger statusside", "Edit Status Page": "Rediger statusside",
"Go to Dashboard": "Gå til Dashboard", "Go to Dashboard": "Gå til Dashboard",
"Status Page": "Statusside", "Status Page": "Statusside",
defaultNotificationName: "Min {notification} varsling ({number})", defaultNotificationName: "Min {notification} varsling ({number})",
here: "here", here: "her",
Required: "Obligatorisk", Required: "Obligatorisk",
telegram: "Telegram", telegram: "Telegram",
"Bot Token": "Bot Token", "Bot Token": "Bot Token",
wayToGetTelegramToken: "Du kan få et token fra {0}.", wayToGetTelegramToken: "Du kan få et token fra {0}.",
"Chat ID": "Chat ID", "Chat ID": "Chat ID",
supportTelegramChatID: "Support Direct Chat / Group / Channel's 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", "YOUR BOT TOKEN HERE": "DITT BOT TOKEN HER",
chatIDNotFound: "Chat-ID ble ikke funnet. Send en melding til denne boten først", chatIDNotFound: "Chat-ID ble ikke funnet. Send en melding til denne boten først",
webhook: "Webhook", webhook: "Webhook",
"Post URL": "Post URL", "Post URL": "Post URL",
"Content Type": "Content Type", "Content Type": "Innholdstype",
webhookJsonDesc: "{0} er bra for alle moderne HTTP-servere som express.js", 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}", webhookFormDataDesc: "{multipart} er bra for PHP. JSON trenger å bli analysert med {decodeFunction}",
smtp: "E-post (SMTP)", smtp: "E-post (SMTP)",
secureOptionNone: "None / STARTTLS (25, 587)", secureOptionNone: "None / STARTTLS (25, 587)",
secureOptionTLS: "TLS (465)", secureOptionTLS: "TLS (465)",
@ -205,7 +205,7 @@ export default {
smtpBCC: "BCC", smtpBCC: "BCC",
discord: "Discord", discord: "Discord",
"Discord Webhook URL": "Discord Webhook URL", "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", "Bot Display Name": "Bot Visningsnavn",
"Prefix Custom Message": "Prefiks tilpasset melding", "Prefix Custom Message": "Prefiks tilpasset melding",
"Hello @everyone is...": "Hei {'@'}everyone det er...", "Hello @everyone is...": "Hei {'@'}everyone det er...",
@ -240,43 +240,43 @@ export default {
pushbullet: "Pushbullet", pushbullet: "Pushbullet",
line: "Line Messenger", line: "Line Messenger",
mattermost: "Mattermost", mattermost: "Mattermost",
"User Key": "User Key", "User Key": "Bruker-nøkkel",
Device: "Device", Device: "Enhet",
"Message Title": "Message Title", "Message Title": "Meldingstittel",
"Notification Sound": "Notification Sound", "Notification Sound": "Notifikasjonslyd",
"More info on:": "More info on: {0}", "More info on:": "Mer info på: {0}",
pushoverDesc1: "Emergency priority (2) has default 30 second timeout between retries and will expire after 1 hour.", pushoverDesc1: "Nødsprioritet (2) har en standard 30 sekunders tidsavbrudd mellom forsøk og vil utløpe etter 1 time.",
pushoverDesc2: "If you want to send notifications to different devices, fill out Device field.", pushoverDesc2: "Hvis du vil sende varsler til forskjellige enheteter, fyll ut Enhet-feltet.",
"SMS Type": "SMS Type", "SMS Type": "SMS Type",
octopushTypePremium: "Premium (Fast - recommended for alerting)", octopushTypePremium: "Premium (Raskt - anbefalt for varsling)",
octopushTypeLowCost: "Low Cost (Slow, sometimes blocked by operator)", octopushTypeLowCost: "Lav kostnad (Sakte, noen ganger blokkert av leverandør)",
"Check octopush prices": "Check octopush prices {0}.", "Check octopush prices": "Sjekk octopush priser {0}.",
octopushPhoneNumber: "Phone number (intl format, eg : +33612345678) ", octopushPhoneNumber: "Telefonnummer (intl format, eg : +4791234567) ",
octopushSMSSender: "SMS Sender Name : 3-11 alphanumeric characters and space (a-zA-Z0-9)", octopushSMSSender: "SMS Avsendernavn : 3-11 alphanumeriske tegn og mellomrom (a-zA-Z0-9)",
"LunaSea Device ID": "LunaSea Device ID", "LunaSea Device ID": "LunaSea Enhet ID",
"Apprise URL": "Apprise URL", "Apprise URL": "Apprise URL",
"Example:": "Example: {0}", "Example:": "Eksempel: {0}",
"Read more:": "Read more: {0}", "Read more:": "Les mer: {0}",
"Status:": "Status: {0}", "Status:": "Status: {0}",
"Read more": "Read more", "Read more": "Les mer",
appriseInstalled: "Apprise is installed.", appriseInstalled: "Apprise er installert.",
appriseNotInstalled: "Apprise is not installed. {0}", appriseNotInstalled: "Apprise ikke installert. {0}",
"Access Token": "Access Token", "Access Token": "Tilgangs-Token",
"Channel access token": "Channel access token", "Channel access token": "Kanal tilgangs-token",
"Line Developers Console": "Line Developers Console", "Line Developers Console": "Line Utviklserskonsoll",
lineDevConsoleTo: "Line Developers Console - {0}", lineDevConsoleTo: "Line Utviklserskonsoll - {0}",
"Basic Settings": "Basic Settings", "Basic Settings": "Grunnleggende instillinger",
"User ID": "User ID", "User ID": "Bruker-ID",
"Messaging API": "Messaging API", "Messaging API": "Meldings-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: "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": "Icon URL", "Icon URL": "Ikon 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.", 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: "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", 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", matrix: "Matrix",
promosmsTypeEco: "SMS ECO - cheap but slow and often overloaded. Limited only to Polish recipients.", promosmsTypeEco: "SMS ECO - billig, men treg og ofte overbelastet. Begrenset til bare polske mottakere.",
promosmsTypeFlash: "SMS FLASH - Message will automatically show on recipient device. Limited only to Polish recipients.", promosmsTypeFlash: "SMS FLASH - Melding vil automatisk vises på mottakker-enhet. Begrenset til bare polske mottakere.",
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 - Premuimnivå SMS. Du kan bruke dit avsendernavn (Du må registerere et navn først). Pålitelig for alle varslinger.",
promosmsTypeSpeed: "SMS SPEED - Highest priority in system. Very quick and reliable but costly (about twice of SMS FULL price).", promosmsTypeSpeed: "SMS SPEED - Høyest prioritet i systemet.Veldig rask på pålitelig, men dyrt (omtrent det dobbeltet av SMS FULL pris).",
promosmsPhoneNumber: "Phone number (for Polish recipient You can skip area codes)", promosmsPhoneNumber: "Telefonnummber (for polske mottakere. Du trenger ikke områdekode.)",
promosmsSMSSender: "SMS Sender Name : Pre-registred name or one of defaults: InfoSMS, SMS Info, MaxSMS, INFO, SMS", promosmsSMSSender: "SMS Avsendernavn : Forhåndsregistert navn eller en av standardnavnene: InfoSMS, SMS Info, MaxSMS, INFO, SMS",
}; };

@ -12,7 +12,7 @@ export default {
pauseDashboardHome: "Gepauzeerd", pauseDashboardHome: "Gepauzeerd",
deleteMonitorMsg: "Weet u zeker dat u deze monitor wilt verwijderen?", deleteMonitorMsg: "Weet u zeker dat u deze monitor wilt verwijderen?",
deleteNotificationMsg: "Weet u zeker dat u deze melding voor alle monitoren wilt verwijderen?", deleteNotificationMsg: "Weet u zeker dat u deze melding voor alle monitoren wilt verwijderen?",
resoverserverDescription: "Cloudflare is de standaardserver, u kunt de resolver server op elk moment wijzigen.", resolverserverDescription: "Cloudflare is de standaardserver, u kunt de resolver server op elk moment wijzigen.",
rrtypeDescription: "Selecteer het RR-type dat u wilt monitoren", rrtypeDescription: "Selecteer het RR-type dat u wilt monitoren",
pauseMonitorMsg: "Weet je zeker dat je wilt pauzeren?", pauseMonitorMsg: "Weet je zeker dat je wilt pauzeren?",
enableDefaultNotificationDescription: "Voor elke nieuwe monitor wordt deze melding standaard ingeschakeld. U kunt de melding nog steeds afzonderlijk uitschakelen voor elke monitor.", enableDefaultNotificationDescription: "Voor elke nieuwe monitor wordt deze melding standaard ingeschakeld. U kunt de melding nog steeds afzonderlijk uitschakelen voor elke monitor.",
@ -116,7 +116,7 @@ export default {
"Repeat Password": "Herhaal wachtwoord", "Repeat Password": "Herhaal wachtwoord",
Export: "Exporteren", Export: "Exporteren",
Import: "Importeren", Import: "Importeren",
respTime: "resp. tijd (ms)", respTime: "reactietijd (ms)",
notAvailableShort: "N.v.t.", notAvailableShort: "N.v.t.",
"Default enabled": "Default enabled", "Default enabled": "Default enabled",
"Apply on all existing monitors": "Pas toe op alle bestaande monitors", "Apply on all existing monitors": "Pas toe op alle bestaande monitors",
@ -138,48 +138,48 @@ export default {
"Two Factor Authentication": "Two Factor Authenticatie", "Two Factor Authentication": "Two Factor Authenticatie",
Active: "Actief", Active: "Actief",
Inactive: "Inactief", Inactive: "Inactief",
"Also apply to existing monitors": "Also apply to existing monitors", "Also apply to existing monitors": "Voeg ook toe aan bestaande monitors",
Token: "Token", Token: "Token",
"Show URI": "Toon URI", "Show URI": "Toon URI",
"Clear all statistics": "Wis alle statistieken", "Clear all statistics": "Wis alle statistieken",
retryCheckEverySecond: "Retry every {0} seconds.", retryCheckEverySecond: "Probeer elke {0} seconden.",
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.", importHandleDescription: "Kies 'Sla bestaande over' als je elke monitor of melding met dezelfde naam wilt overslaan. Kies 'Overschrijf' als je elke monitor of notificatie wilt verwijderen.",
confirmImportMsg: "Are you sure to import the backup? Please make sure you've selected the right import option.", confirmImportMsg: "Weet je zeker dat je dit bestand wilt importeren?",
"Heartbeat Retry Interval": "Heartbeat Retry Interval", "Heartbeat Retry Interval": "Heartbeat Retry Interval",
"Import Backup": "Import Backup", "Import Backup": "Importeer Backup",
"Export Backup": "Export Backup", "Export Backup": "Exporteer Backup",
"Skip existing": "Skip existing", "Skip existing": "Sla bestaande over",
Overwrite: "Overwrite", Overwrite: "Overschrijf",
Options: "Options", Options: "Opties",
"Keep both": "Keep both", "Keep both": "Bewaar beide",
Tags: "Tags", Tags: "Labels",
"Add New below or Select...": "Add New below or Select...", "Add New below or Select...": "Voeg nieuwe toe of selecteer...",
"Tag with this name already exist.": "Tag with this name already exist.", "Tag with this name already exist.": "Label met deze naam bestaat al",
"Tag with this value already exist.": "Tag with this value already exist.", "Tag with this value already exist.": "Label met deze waarde bestaat al",
color: "color", color: "Kleur",
"value (optional)": "value (optional)", "value (optional)": "waarde (optioneel)",
Gray: "Gray", Gray: "Grijs",
Red: "Red", Red: "Rood",
Orange: "Orange", Orange: "Oranje",
Green: "Green", Green: "Groen",
Blue: "Blue", Blue: "Blauw",
Indigo: "Indigo", Indigo: "Indigo",
Purple: "Purple", Purple: "Paars",
Pink: "Pink", Pink: "Roze",
"Search...": "Search...", "Search...": "Zoeken...",
"Avg. Ping": "Avg. Ping", "Avg. Ping": "Gemiddelde Ping",
"Avg. Response": "Avg. Response", "Avg. Response": "Gemiddelde Response",
"Entry Page": "Entry Page", "Entry Page": "Entry Page",
statusPageNothing: "Nothing here, please add a group or a monitor.", statusPageNothing: "Niets hier, voeg een groep of monitor toe.",
"No Services": "No Services", "No Services": "No Services",
"All Systems Operational": "All Systems Operational", "All Systems Operational": "Alle systemen operationeel",
"Partially Degraded Service": "Partially Degraded Service", "Partially Degraded Service": "Gedeeltelijk verminderde prestaties",
"Degraded Service": "Degraded Service", "Degraded Service": "Verminderde prestaties",
"Add Group": "Add Group", "Add Group": "Voeg groep toe",
"Add a monitor": "Add a monitor", "Add a monitor": "Voeg monitor toe",
"Edit Status Page": "Edit Status Page", "Edit Status Page": "Wijzig status pagina",
"Go to Dashboard": "Go to Dashboard", "Go to Dashboard": "Ga naar Dashboard",
"Status Page": "Status Page", "Status Page": "Status Pagina",
telegram: "Telegram", telegram: "Telegram",
webhook: "Webhook", webhook: "Webhook",
smtp: "Email (SMTP)", smtp: "Email (SMTP)",

@ -13,7 +13,7 @@ export default {
pauseDashboardHome: "Wstrzymane", pauseDashboardHome: "Wstrzymane",
deleteMonitorMsg: "Czy na pewno chcesz usunąć ten monitor?", deleteMonitorMsg: "Czy na pewno chcesz usunąć ten monitor?",
deleteNotificationMsg: "Czy na pewno chcesz usunąć to powiadomienie dla wszystkich monitorów?", deleteNotificationMsg: "Czy na pewno chcesz usunąć to powiadomienie dla wszystkich monitorów?",
resoverserverDescription: "Cloudflare jest domyślnym serwerem, możesz zmienić serwer resolver w każdej chwili.", resolverserverDescription: "Cloudflare jest domyślnym serwerem, możesz zmienić serwer resolver w każdej chwili.",
rrtypeDescription: "Wybierz rodzaj rekordu, który chcesz monitorować.", rrtypeDescription: "Wybierz rodzaj rekordu, który chcesz monitorować.",
pauseMonitorMsg: "Czy na pewno chcesz wstrzymać monitorowanie?", pauseMonitorMsg: "Czy na pewno chcesz wstrzymać monitorowanie?",
enableDefaultNotificationDescription: "Dla każdego nowego monitora to powiadomienie będzie domyślnie włączone. Nadal możesz wyłączyć powiadomienia osobno dla każdego monitora.", enableDefaultNotificationDescription: "Dla każdego nowego monitora to powiadomienie będzie domyślnie włączone. Nadal możesz wyłączyć powiadomienia osobno dla każdego monitora.",
@ -22,13 +22,13 @@ export default {
confirmClearStatisticsMsg: "Jesteś pewien, że chcesz usunąć WSZYSTKIE statystyki?", confirmClearStatisticsMsg: "Jesteś pewien, że chcesz usunąć WSZYSTKIE statystyki?",
importHandleDescription: "Wybierz 'Pomiń istniejące', jeśli chcesz pominąć każdy monitor lub powiadomienie o tej samej nazwie. 'Nadpisz' spowoduje usunięcie każdego istniejącego monitora i powiadomienia.", importHandleDescription: "Wybierz 'Pomiń istniejące', jeśli chcesz pominąć każdy monitor lub powiadomienie o tej samej nazwie. 'Nadpisz' spowoduje usunięcie każdego istniejącego monitora i powiadomienia.",
confirmImportMsg: "Czy na pewno chcesz zaimportować kopię zapasową? Upewnij się, że wybrałeś właściwą opcję importu.", confirmImportMsg: "Czy na pewno chcesz zaimportować kopię zapasową? Upewnij się, że wybrałeś właściwą opcję importu.",
twoFAVerifyLabel: "Proszę podaj swój token 2FA, aby sprawdzić czy 2FA działa.", twoFAVerifyLabel: "Proszę, podaj swój token 2FA, aby sprawdzić, czy 2FA działa.",
tokenValidSettingsMsg: "Token jest prawdiłowy! Teraz możesz zapisać ustawienia 2FA.", tokenValidSettingsMsg: "Token jest prawidłowy! Teraz możesz zapisać ustawienia 2FA.",
confirmEnableTwoFAMsg: "Jesteś pewien, że chcesz włączyć 2FA?", confirmEnableTwoFAMsg: "Jesteś pewien, że chcesz włączyć 2FA?",
confirmDisableTwoFAMsg: "Jesteś pewien, że chcesz wyłączyć 2FA?", confirmDisableTwoFAMsg: "Jesteś pewien, że chcesz wyłączyć 2FA?",
Settings: "Ustawienia", Settings: "Ustawienia",
Dashboard: "Panel", Dashboard: "Panel",
"New Update": "Nowa Aktualizacja", "New Update": "Nowa aktualizacja",
Language: "Język", Language: "Język",
Appearance: "Wygląd", Appearance: "Wygląd",
Theme: "Motyw", Theme: "Motyw",
@ -37,7 +37,7 @@ export default {
"Check Update On GitHub": "Sprawdź aktualizację na GitHub", "Check Update On GitHub": "Sprawdź aktualizację na GitHub",
List: "Lista", List: "Lista",
Add: "Dodaj", Add: "Dodaj",
"Add New Monitor": "Dodaj Monitor", "Add New Monitor": "Dodaj monitor",
"Quick Stats": "Szybki podgląd statystyk", "Quick Stats": "Szybki podgląd statystyk",
Up: "Online", Up: "Online",
Down: "Offline", Down: "Offline",
@ -53,8 +53,8 @@ export default {
Edit: "Edytuj", Edit: "Edytuj",
Delete: "Usuń", Delete: "Usuń",
Current: "Aktualny", Current: "Aktualny",
Uptime: "Czas Pracy", Uptime: "Czas pracy",
"Cert Exp.": "Certyfikat Wygasa", "Cert Exp.": "Certyfikat wygasa",
days: "dni", days: "dni",
day: "dzień", day: "dzień",
"-day": " dni", "-day": " dni",
@ -62,23 +62,23 @@ export default {
"-hour": " godzin", "-hour": " godzin",
Response: "Odpowiedź", Response: "Odpowiedź",
Ping: "Ping", Ping: "Ping",
"Monitor Type": "Rodzaj Monitora", "Monitor Type": "Rodzaj monitora",
Keyword: "Słowo kluczowe", Keyword: "Słowo kluczowe",
"Friendly Name": "Przyjazna Nazwa", "Friendly Name": "Przyjazna nazwa",
URL: "URL", URL: "URL",
Hostname: "Hostname", Hostname: "Hostname",
Port: "Port", Port: "Port",
"Heartbeat Interval": "Czętotliwość bicia serca", "Heartbeat Interval": "Częstotliwość bicia serca",
Retries: "Prób", Retries: "Prób",
"Heartbeat Retry Interval": "Częstotliwość ponawiania bicia serca", "Heartbeat Retry Interval": "Częstotliwość ponawiania bicia serca",
Advanced: "Zaawansowane", Advanced: "Zaawansowane",
"Upside Down Mode": "Tryb odwrócony", "Upside Down Mode": "Tryb odwrócony",
"Max. Redirects": "Maks. Przekierowań", "Max. Redirects": "Maks. przekierowań",
"Accepted Status Codes": "Akceptowane kody statusu", "Accepted Status Codes": "Akceptowane kody statusu",
Save: "Zapisz", Save: "Zapisz",
Notifications: "Powiadomienia", Notifications: "Powiadomienia",
"Not available, please setup.": "Niedostępne, proszę skonfigurować.", "Not available, please setup.": "Niedostępne, proszę skonfigurować.",
"Setup Notification": "Skonfiguruj Powiadomienie", "Setup Notification": "Skonfiguruj powiadomienie",
Light: "Jasny", Light: "Jasny",
Dark: "Ciemny", Dark: "Ciemny",
Auto: "Automatyczny", Auto: "Automatyczny",
@ -110,7 +110,7 @@ export default {
"No Monitors, please": "Brak monitorów, proszę", "No Monitors, please": "Brak monitorów, proszę",
"add one": "dodać jeden", "add one": "dodać jeden",
"Notification Type": "Rodzaj powiadomienia", "Notification Type": "Rodzaj powiadomienia",
Email: "Email", Email: "E-mail",
Test: "Test", Test: "Test",
"Certificate Info": "Informacje o certyfikacie", "Certificate Info": "Informacje o certyfikacie",
"Resolver Server": "Serwer rozwiązywania nazw", "Resolver Server": "Serwer rozwiązywania nazw",
@ -122,7 +122,7 @@ export default {
"Export Backup": "Eksportuj kopię zapasową", "Export Backup": "Eksportuj kopię zapasową",
Export: "Eksportuj", Export: "Eksportuj",
Import: "Importuj", Import: "Importuj",
respTime: "Czas Odp. (ms)", respTime: "Czas odp. (ms)",
notAvailableShort: "N/A", notAvailableShort: "N/A",
"Default enabled": "Włącz domyślnie", "Default enabled": "Włącz domyślnie",
"Apply on all existing monitors": "Zastosuj do istniejących monitorów", "Apply on all existing monitors": "Zastosuj do istniejących monitorów",
@ -183,35 +183,35 @@ export default {
here: "tutaj", here: "tutaj",
Required: "Wymagane", Required: "Wymagane",
telegram: "Telegram", telegram: "Telegram",
"Bot Token": "Token Bota", "Bot Token": "Token bota",
wayToGetTelegramToken: "Token można uzyskać z {0}.", wayToGetTelegramToken: "Token można uzyskać z {0}.",
"Chat ID": "Identyfikator Czatu", "Chat ID": "Identyfikator czatu",
supportTelegramChatID: "Czat wsprarcia technicznego / Bezpośrednia Rozmowa / Czat Grupowy", supportTelegramChatID: "Czat wsparcia technicznego / Bezpośrednia rozmowa / Czat grupowy",
wayToGetTelegramChatID: "Możesz uzyskać swój identyfikator czatu, wysyłając wiadomość do bota i przechodząc pod ten adres URL, aby wyświetlić identyfikator czatu:", wayToGetTelegramChatID: "Możesz uzyskać swój identyfikator czatu, wysyłając wiadomość do bota i przechodząc pod ten adres URL, aby wyświetlić identyfikator czatu:",
"YOUR BOT TOKEN HERE": "TWOJ TOKEN BOTA", "YOUR BOT TOKEN HERE": "TWÓJ TOKEN BOTA",
chatIDNotFound: "Identyfikator czatu nie znaleziony, najpierw napisz do bota", chatIDNotFound: "Identyfikator czatu nie znaleziony, najpierw napisz do bota",
webhook: "Webhook", webhook: "Webhook",
"Post URL": "Adres URL", "Post URL": "Adres URL",
"Content Type": "Rodzaj danych", "Content Type": "Rodzaj danych",
webhookJsonDesc: "{0} jest dobry w przypadku serwerów HTTP, takich jak express.js", webhookJsonDesc: "{0} jest dobry w przypadku serwerów HTTP, takich jak express.js",
webhookFormDataDesc: "{multipart} jest dobry dla PHP, musisz jedynie przetowrzyć dane przez {decodeFunction}", webhookFormDataDesc: "{multipart} jest dobry dla PHP, musisz jedynie przetworzyć dane przez {decodeFunction}",
smtp: "Email (SMTP)", smtp: "Email (SMTP)",
secureOptionNone: "Brak / STARTTLS (25, 587)", secureOptionNone: "Brak / STARTTLS (25, 587)",
secureOptionTLS: "TLS (465)", secureOptionTLS: "TLS (465)",
"Ignore TLS Error": "Zignrouj Błędy TLS", "Ignore TLS Error": "Zignoruj błędy TLS",
"From Email": "Nadawca (OD)", "From Email": "Nadawca (OD)",
"To Email": "Odbiorca (DO)", "To Email": "Odbiorca (DO)",
smtpCC: "DW", smtpCC: "DW",
smtpBCC: "UDW", smtpBCC: "UDW",
discord: "Discord", discord: "Discord",
"Discord Webhook URL": "URL Webhook Discorda", "Discord Webhook URL": "URL webhook Discorda",
wayToGetDiscordURL: "Możesz go uzyskać przechodząc do Ustawienia Serwera -> Integracje -> Tworzenie Webhooka", wayToGetDiscordURL: "Możesz go uzyskać, przechodząc do Ustawienia serwera -> Integracje -> Tworzenie webhooka",
"Bot Display Name": "Wyświetlana Nazwa Bota", "Bot Display Name": "Wyświetlana nazwa bota",
"Prefix Custom Message": "Własny Początek Wiadomości", "Prefix Custom Message": "Własny początek wiadomości",
"Hello @everyone is...": "Hej {'@'}everyone ...", "Hello @everyone is...": "Hej {'@'}everyone ...",
teams: "Microsoft Teams", teams: "Microsoft Teams",
"Webhook URL": "URL Webhooka", "Webhook URL": "URL webhooka",
wayToGetTeamsURL: "You can learn how to create a webhook url {0}.", wayToGetTeamsURL: "Możesz dowiedzieć się, jak utworzyć adres url webhooka {0}.",
signal: "Signal", signal: "Signal",
Number: "Numer", Number: "Numer",
Recipients: "Odbiorcy", Recipients: "Odbiorcy",
@ -219,66 +219,67 @@ export default {
wayToCheckSignalURL: "W celu dowiedzenia się, jak go skonfigurować, odwiedź poniższy link:", wayToCheckSignalURL: "W celu dowiedzenia się, jak go skonfigurować, odwiedź poniższy link:",
signalImportant: "UWAGA: Nie można mieszać nazw grup i numerów odbiorców!", signalImportant: "UWAGA: Nie można mieszać nazw grup i numerów odbiorców!",
gotify: "Gotify", gotify: "Gotify",
"Application Token": "Token Aplikacji", "Application Token": "Token aplikacji",
"Server URL": "Server URL", "Server URL": "Server URL",
Priority: "Priorytet", Priority: "Priorytet",
slack: "Slack", slack: "Slack",
"Icon Emoji": "Ikona Emoji", "Icon Emoji": "Ikona emoji",
"Channel Name": "Nazwa Kanału", "Channel Name": "Nazwa kanału",
"Uptime Kuma URL": "Adres Uptime Kuma", "Uptime Kuma URL": "Adres Uptime Kuma",
aboutWebhooks: "Więcej informacji na temat webhooków: {0}", aboutWebhooks: "Więcej informacji na temat webhooków: {0}",
aboutChannelName: "Podaj nazwę kanału {0} w polu Nazwa Kanału, jeśli chcesz pominąć kanał webhooka. Np.: #inny-kanal", aboutChannelName: "Podaj nazwę kanału {0} w polu Nazwa kanału, jeśli chcesz pominąć kanał webhooka. Np.: #inny-kanal",
aboutKumaURL: "Jeśli pozostawisz pole Adres Uptime Kuma puste, domyślnie będzie to strona projektu na Github.", aboutKumaURL: "Jeśli pozostawisz pole Adres Uptime Kuma puste, domyślnie będzie to strona projektu na GitHub.",
emojiCheatSheet: "Ściąga Emoji: {0}", emojiCheatSheet: "Ściąga emoji: {0}",
"rocket.chat": "Rocket.chat", "rocket.chat": "Rocket.chat",
pushover: "Pushover", pushover: "Pushover",
pushy: "Pushy", pushy: "Pushy",
octopush: "Octopush", octopush: "Octopush",
promosms: "PromoSMS", promosms: "PromoSMS",
lunasea: "LunaSea", lunasea: "LunaSea",
apprise: "Apprise (Obsługuje 50+ usług powiadomień)", apprise: "Apprise (obsługuje 50+ usług powiadomień)",
GoogleChat: "Google Chat (wyłącznie Google Workspace)",
pushbullet: "Pushbullet", pushbullet: "Pushbullet",
line: "Line Messenger", line: "Line Messenger",
mattermost: "Mattermost", mattermost: "Mattermost",
"User Key": "Klucz Użytkownika", "User Key": "Klucz użytkownika",
Device: "Urządzenie", Device: "Urządzenie",
"Message Title": "Tytuł Wiadomości", "Message Title": "Tytuł wiadomości",
"Notification Sound": "Dźwięk Powiadomienia", "Notification Sound": "Dźwięk powiadomienia",
"More info on:": "Więcej informacji na: {0}", "More info on:": "Więcej informacji na: {0}",
pushoverDesc1: "Priorytet awaryjny (2) ma domyślny 30-sekundowy limit czasu między kolejnymi próbami i wygaśnie po 1 godzinie.", pushoverDesc1: "Priorytet awaryjny (2) ma domyślny 30-sekundowy limit czasu między kolejnymi próbami i wygaśnie po 1 godzinie.",
pushoverDesc2: "Jeśli chcesz wysyłać powiadomienia na różne urządzenia, wypełnij pole Urządzenie.", pushoverDesc2: "Jeśli chcesz wysyłać powiadomienia na różne urządzenia, wypełnij pole Urządzenie.",
"SMS Type": "Rodzaj SMS", "SMS Type": "Rodzaj SMS",
octopushTypePremium: "Premium (Szybki - rekomendowany dla powiadomień)", octopushTypePremium: "Premium (szybki - rekomendowany dla powiadomień)",
octopushTypeLowCost: "Low Cost (Wolny, czasami blokowany przez operatorów)", octopushTypeLowCost: "Low Cost (wolny, czasami blokowany przez operatorów)",
"Check octopush prices": "Sprawdź ceny Octopush {0}.", "Check octopush prices": "Sprawdź ceny Octopush {0}.",
octopushPhoneNumber: "Numer Telefonu (Format międzynarodowy np.: +33612345678)", octopushPhoneNumber: "Numer telefonu (format międzynarodowy np.: +33612345678)",
octopushSMSSender: "Nadawca SMS: 3-11 znaków alfanumerycznych i spacji (a-zA-Z0-9)", octopushSMSSender: "Nadawca SMS: 3-11 znaków alfanumerycznych i spacji (a-zA-Z0-9)",
"LunaSea Device ID": "Idetyfikator Urządzenia LunaSea", "LunaSea Device ID": "Identyfikator urządzenia LunaSea",
"Apprise URL": "URL Apprise", "Apprise URL": "URL Apprise",
"Example:": "Przykład: {0}", "Example:": "Przykład: {0}",
"Read more:": "Czytaj Dalej: {0}", "Read more:": "Czytaj dalej: {0}",
"Status:": "Status: {0}", "Status:": "Status: {0}",
"Read more": "Czytaj dalej", "Read more": "Czytaj dalej",
appriseInstalled: "Apprise jest zostało zainstalowane.", appriseInstalled: "Apprise jest zainstalowane.",
appriseNotInstalled: "Apprise nie zostało zainstalowane. {0}", appriseNotInstalled: "Apprise nie zostało zainstalowane. {0}",
"Access Token": "Token Dostępu", "Access Token": "Token dostępu",
"Channel access token": "Token Dostępu Kanału", "Channel access token": "Token dostępu kanału",
"Line Developers Console": "Konsola Dewelopersja Line", "Line Developers Console": "Konsola deweloperska Line",
lineDevConsoleTo: "Konsola Dewelopersja Line - {0}", lineDevConsoleTo: "Konsola deweloperska Line - {0}",
"Basic Settings": "Ustawienia Ogólne", "Basic Settings": "Ustawienia ogólne",
"User ID": "Idetyfikator Użytkownika", "User ID": "Identyfikator użytkownika",
"Messaging API": "API Wiadomości", "Messaging API": "API wiadomości",
wayToGetLineChannelToken: "Najpierw uzyskaj dostęp do {0}, utwórz dostawcę i kanał (Messaging API), a następnie możesz uzyskać token dostępu do kanału i identyfikator użytkownika z wyżej wymienionych pozycji menu.", wayToGetLineChannelToken: "Najpierw uzyskaj dostęp do {0}, utwórz dostawcę i kanał (Messaging API), a następnie możesz uzyskać token dostępu do kanału i identyfikator użytkownika z wyżej wymienionych pozycji menu.",
"Icon URL": "Adres Ikony", "Icon URL": "Adres Ikony",
aboutIconURL: "Możesz podać link do zdjęcia w \"Adres URL ikony\", aby zastąpić domyślne zdjęcie profilowe. Nie będzie używany, jeśli ustawiona jest ikona Emoji.", aboutIconURL: "Możesz podać link do zdjęcia w \"Adres URL ikony\", aby zastąpić domyślne zdjęcie profilowe. Nie będzie używany, jeśli ustawiona jest ikona emoji.",
aboutMattermostChannelName: "Możesz zastąpić domyślny kanał, na którym publikowane są posty webhooka, wpisując nazwę kanału w polu \"Nazwa Kanału\". Należy to włączyć w ustawieniach webhooka Mattermost. Np.: #inny-kanał", aboutMattermostChannelName: "Możesz zastąpić domyślny kanał, na którym publikowane są posty webhooka, wpisując nazwę kanału w polu \"Nazwa kanału\". Należy to włączyć w ustawieniach webhooka Mattermost. Np.: #inny-kanał",
matrix: "Matrix", matrix: "Matrix",
promosmsTypeEco: "SMS ECO - Tanie, lecz wolne. Dostępne tylko w Polsce", promosmsTypeEco: "SMS ECO - tanie, lecz wolne. Dostępne tylko w Polsce",
promosmsTypeFlash: "SMS FLASH - Wiadomość automatycznie wyświetli się na urządzeniu. Dostępne tylko w Polsce.", promosmsTypeFlash: "SMS FLASH - wiadomość automatycznie wyświetli się na urządzeniu. Dostępne tylko w Polsce.",
promosmsTypeFull: "SMS FULL - Szybkie i dostępne międzynarodowo. Wersja premium usługi, która pozwala min. ustawić własną nazwę nadawcy.", promosmsTypeFull: "SMS FULL - szybkie i dostępne międzynarodowo. Wersja premium usługi, która pozwala min. ustawić własną nazwę nadawcy.",
promosmsTypeSpeed: "SMS SPEED - Wysyłka priorytetowa, posiada wszystkie zalety SMS FULL", promosmsTypeSpeed: "SMS SPEED - wysyłka priorytetowa, posiada wszystkie zalety SMS FULL",
promosmsPhoneNumber: "Numer Odbiorcy", promosmsPhoneNumber: "Numer odbiorcy",
promosmsSMSSender: "Nadawca SMS (Wcześniej zatwierdzone nazwy z panelu PromoSMS)", promosmsSMSSender: "Nadawca SMS (wcześniej zatwierdzone nazwy z panelu PromoSMS)",
"Primary Base URL": "Główny URL", "Primary Base URL": "Główny URL",
"Push URL": "Push URL", "Push URL": "Push URL",
needPushEvery: "Powinieneś wywoływać ten URL co {0} sekund", needPushEvery: "Powinieneś wywoływać ten URL co {0} sekund",
@ -289,7 +290,7 @@ export default {
"Feishu WebHookUrl": "Feishu WebHookURL", "Feishu WebHookUrl": "Feishu WebHookURL",
matrixHomeserverURL: "Adres URL serwera domowego (z http(s):// i opcjonalnie port)", matrixHomeserverURL: "Adres URL serwera domowego (z http(s):// i opcjonalnie port)",
"Internal Room Id": "Wewnętrzne ID pokoju", "Internal Room Id": "Wewnętrzne ID pokoju",
matrixDesc1: "Możesz znaleźć wewnętrzne ID pokoju patrząc w zaawansowanej sekcji ustawień pokoju w twoim kliencie Matrix. Powinien on wyglądać jak !QMdRCpUIfLwsfjxye6:home.server.", matrixDesc1: "Możesz znaleźć wewnętrzne ID pokoju, patrząc w zaawansowanej sekcji ustawień pokoju w twoim kliencie Matrix. Powinien on wyglądać jak !QMdRCpUIfLwsfjxye6:home.server.",
matrixDesc2: "Jest wysoce zalecane, abyś stworzył nowego użytkownika i nie używał tokena dostępu swojego użytkownika Matrix, ponieważ pozwoli on na pełny dostęp do twojego konta i wszystkich pokoi, do których dołączyłeś. Zamiast tego, utwórz nowego użytkownika i zaproś go tylko do pokoju, w którym chcesz otrzymywać powiadomienia. Możesz uzyskać token dostępu przez uruchomienie {0}", matrixDesc2: "Jest wysoce zalecane, abyś stworzył nowego użytkownika i nie używał tokena dostępu swojego użytkownika Matrix, ponieważ pozwoli on na pełny dostęp do twojego konta i wszystkich pokoi, do których dołączyłeś. Zamiast tego, utwórz nowego użytkownika i zaproś go tylko do pokoju, w którym chcesz otrzymywać powiadomienia. Możesz uzyskać token dostępu przez uruchomienie {0}",
Method: "Metoda", Method: "Metoda",
Body: "Treść", Body: "Treść",
@ -303,4 +304,61 @@ export default {
records: "rekordy", records: "rekordy",
"One record": "Jeden rekord", "One record": "Jeden rekord",
steamApiKeyDescription: "Do monitorowania serwera gier Steam potrzebny jest klucz Steam Web-API. Możesz zarejestrować swój klucz API tutaj: ", steamApiKeyDescription: "Do monitorowania serwera gier Steam potrzebny jest klucz Steam Web-API. Możesz zarejestrować swój klucz API tutaj: ",
"Current User": "Aktualny użytkownik",
recent: "Ostatnie",
Done: "Zrobione",
Info: "Info",
Security: "Bezpieczeństwo",
"Steam API Key": "Klucz Steam API",
"Shrink Database": "Zmniejsz bazę danych",
"Pick a RR-Type...": "Wybierz typ RR...",
"Pick Accepted Status Codes...": "Wybierz akceptowalne kody statusu...",
Default: "Domyślnie",
"HTTP Options": "Opcje HTTP",
"Create Incident": "Stwórz incydent",
Title: "Tytuł",
Content: "Treść",
Style: "Styl",
info: "info",
warning: "ostrzeżenie",
danger: "niebezpieczeństwo",
primary: "podstawowy",
light: "jasny",
dark: "ciemny",
Post: "Wyślij",
"Please input title and content": "Podaj tytuł i treść",
Created: "Stworzony",
"Last Updated": "Ostatnio zaktualizowany",
Unpin: "Odepnij",
"Switch to Light Theme": "Przełącz na jasny motyw",
"Switch to Dark Theme": "Przełącz na ciemny motyw",
"Show Tags": "Pokaż tagi",
"Hide Tags": "Ukryj tagi",
Description: "Opis",
"No monitors available.": "Brak dostępnych monitorów.",
"Add one": "Dodaj jeden",
"No Monitors": "Brak monitorów",
"Untitled Group": "Nienazwana grupa",
Services: "Usługi",
Discard: "Odrzuć",
Cancel: "Anuluj",
"Powered by": "Napędzane przez",
shrinkDatabaseDescription: "Uruchom VACUUM na bazie SQLite. Jeżeli twoja baza została stworzona po wersji 1.10.0, to posiada już włączoną opcję AUTO_VACUUM i stosowanie ręcznego oczyszczania nie jest potrzebne.",
clicksendsms: "ClickSend SMS",
apiCredentials: "Poświadczenia API",
serwersms: "SerwerSMS.pl",
serwersmsAPIUser: "Nazwa użytkownika API (z prefiksem webapi_)",
serwersmsAPIPassword: "Hasło API",
serwersmsPhoneNumber: "Numer telefonu",
serwersmsSenderName: "Nazwa nadawcy (zatwierdzona w panelu klienta)",
"stackfield": "Stackfield",
smtpDkimSettings: "Ustawienia DKIM",
smtpDkimDesc: "Zapoznaj się z Nodemailer DKIM {0}, aby dowiedzieć się więcej",
documentation: "dokumentacja",
smtpDkimDomain: "Nazwa domeny",
smtpDkimKeySelector: "Selektor klucza",
smtpDkimPrivateKey: "Klucz prywatny",
smtpDkimHashAlgo: "Algorytm Hashowania (opcjonalne)",
smtpDkimheaderFieldNames: "Klucze nagłówka do podpisu (opcjonalne)",
smtpDkimskipFields: "Klucze nagłówka do pominięcia (opcjonalne)",
}; };

@ -13,7 +13,7 @@ export default {
pauseDashboardHome: "Pausar", pauseDashboardHome: "Pausar",
deleteMonitorMsg: "Tem certeza de que deseja excluir este monitor?", deleteMonitorMsg: "Tem certeza de que deseja excluir este monitor?",
deleteNotificationMsg: "Tem certeza de que deseja excluir esta notificação para todos os monitores?", deleteNotificationMsg: "Tem certeza de que deseja excluir esta notificação para todos os monitores?",
resoverserverDescription: "Cloudflare é o servidor padrão, você pode alterar o servidor resolvedor a qualquer momento.", resolverserverDescription: "Cloudflare é o servidor padrão, você pode alterar o servidor resolvedor a qualquer momento.",
rrtypeDescription: "Selecione o RR-Type que você deseja monitorar", rrtypeDescription: "Selecione o RR-Type que você deseja monitorar",
pauseMonitorMsg: "Tem certeza que deseja fazer uma pausa?", pauseMonitorMsg: "Tem certeza que deseja fazer uma pausa?",
enableDefaultNotificationDescription: "Para cada novo monitor, esta notificação será habilitada por padrão. Você ainda pode desativar a notificação separadamente para cada monitor.", enableDefaultNotificationDescription: "Para cada novo monitor, esta notificação será habilitada por padrão. Você ainda pode desativar a notificação separadamente para cada monitor.",

@ -12,11 +12,11 @@ export default {
pauseDashboardHome: "Пауза", pauseDashboardHome: "Пауза",
deleteMonitorMsg: "Вы действительно хотите удалить данный монитор?", deleteMonitorMsg: "Вы действительно хотите удалить данный монитор?",
deleteNotificationMsg: "Вы действительно хотите удалить это уведомление для всех мониторов?", deleteNotificationMsg: "Вы действительно хотите удалить это уведомление для всех мониторов?",
resoverserverDescription: "Cloudflare является сервером по умолчанию. Вы всегда можете сменить данный сервер.", resolverserverDescription: "Cloudflare является сервером по умолчанию. Вы всегда можете сменить данный сервер.",
rrtypeDescription: "Выберите тип ресурсной записи, который вы хотите отслеживать", rrtypeDescription: "Выберите тип ресурсной записи, который вы хотите отслеживать",
pauseMonitorMsg: "Вы действительно хотите поставить на паузу?", pauseMonitorMsg: "Вы действительно хотите поставить на паузу?",
Settings: "Настройки", Settings: "Настройки",
Dashboard: "Панель мониторов", Dashboard: "Панель управления",
"New Update": "Обновление", "New Update": "Обновление",
Language: "Язык", Language: "Язык",
Appearance: "Внешний вид", Appearance: "Внешний вид",
@ -60,7 +60,7 @@ export default {
"Heartbeat Interval": "Частота опроса", "Heartbeat Interval": "Частота опроса",
Retries: "Попыток", Retries: "Попыток",
Advanced: "Дополнительно", Advanced: "Дополнительно",
"Upside Down Mode": "Режим реверса статуса", "Upside Down Mode": "Реверс статуса",
"Max. Redirects": "Макс. количество перенаправлений", "Max. Redirects": "Макс. количество перенаправлений",
"Accepted Status Codes": "Допустимые коды статуса", "Accepted Status Codes": "Допустимые коды статуса",
Save: "Сохранить", Save: "Сохранить",
@ -75,9 +75,9 @@ export default {
Bottom: "Снизу", Bottom: "Снизу",
None: "Отсутствует", None: "Отсутствует",
Timezone: "Часовой пояс", Timezone: "Часовой пояс",
"Search Engine Visibility": "Видимость поисковым движком", "Search Engine Visibility": "Индексация поисковыми системами:",
"Allow indexing": "Разрешить индексирование", "Allow indexing": "Разрешить индексирование",
"Discourage search engines from indexing site": "Не позволять индексировать сайт", "Discourage search engines from indexing site": "Запретить индексирование",
"Change Password": "Сменить пароль", "Change Password": "Сменить пароль",
"Current Password": "Текущий пароль", "Current Password": "Текущий пароль",
"New Password": "Новый пароль", "New Password": "Новый пароль",
@ -96,6 +96,7 @@ export default {
"Remember me": "Запомнить меня", "Remember me": "Запомнить меня",
Login: "Вход в систему", Login: "Вход в систему",
"No Monitors, please": "Мониторов нет, пожалуйста", "No Monitors, please": "Мониторов нет, пожалуйста",
"No Monitors": "Мониторы отсутствуют",
"add one": "создайте новый", "add one": "создайте новый",
"Notification Type": "Тип уведомления", "Notification Type": "Тип уведомления",
Email: "Почта", Email: "Почта",
@ -107,7 +108,7 @@ export default {
"Create your admin account": "Создайте аккаунт администратора", "Create your admin account": "Создайте аккаунт администратора",
"Repeat Password": "Повторите пароль", "Repeat Password": "Повторите пароль",
respTime: "Время ответа (мс)", respTime: "Время ответа (мс)",
notAvailableShort: "Н", notAvailableShort: "N/A",
Create: "Создать", Create: "Создать",
clearEventsMsg: "Вы действительно хотите удалить всю статистику событий данного монитора?", clearEventsMsg: "Вы действительно хотите удалить всю статистику событий данного монитора?",
clearHeartbeatsMsg: "Вы действительно хотите удалить всю статистику опросов данного монитора?", clearHeartbeatsMsg: "Вы действительно хотите удалить всю статистику опросов данного монитора?",
@ -119,8 +120,8 @@ export default {
enableDefaultNotificationDescription: "Для каждого нового монитора это уведомление будет включено по умолчанию. Вы всё ещё можете отключить уведомления в каждом мониторе отдельно.", enableDefaultNotificationDescription: "Для каждого нового монитора это уведомление будет включено по умолчанию. Вы всё ещё можете отключить уведомления в каждом мониторе отдельно.",
"Default enabled": "Использовать по умолчанию", "Default enabled": "Использовать по умолчанию",
"Also apply to existing monitors": "Применить к существующим мониторам", "Also apply to existing monitors": "Применить к существующим мониторам",
Export: "Резервная копия", Export: "Экспорт",
Import: "Восстановление", Import: "Импорт",
backupDescription: "Вы можете сохранить резервную копию всех мониторов и уведомлений в виде JSON-файла", backupDescription: "Вы можете сохранить резервную копию всех мониторов и уведомлений в виде JSON-файла",
backupDescription2: "P.S. История и события сохранены не будут", backupDescription2: "P.S. История и события сохранены не будут",
backupDescription3: "Важные данные, такие как токены уведомлений, добавляются при экспорте, поэтому храните файлы в безопасном месте", backupDescription3: "Важные данные, такие как токены уведомлений, добавляются при экспорте, поэтому храните файлы в безопасном месте",
@ -141,13 +142,13 @@ export default {
Inactive: "Неактивно", Inactive: "Неактивно",
Token: "Токен", Token: "Токен",
"Show URI": "Показать URI", "Show URI": "Показать URI",
"Clear all statistics": "Удалить всю статистику", "Clear all statistics": "Очистить статистику",
retryCheckEverySecond: "Повтор каждые {0} секунд", retryCheckEverySecond: "Повтор каждые {0} секунд",
importHandleDescription: "Выберите \"Пропустить существующие\", если вы хотите пропустить каждый монитор или уведомление с таким же именем. \"Перезаписать\" удалит каждый существующий монитор или уведомление и добавит заново. Вариант \"Не проверять\" принудительно восстанавливает все мониторы и уведомления, даже если они уже существуют.", importHandleDescription: "Выберите \"Пропустить существующие\", если вы хотите пропустить каждый монитор или уведомление с таким же именем. \"Перезаписать\" удалит каждый существующий монитор или уведомление и добавит заново. Вариант \"Не проверять\" принудительно восстанавливает все мониторы и уведомления, даже если они уже существуют.",
confirmImportMsg: "Вы действительно хотите восстановить резервную копию? Убедитесь, что вы выбрали подходящий вариант импорта.", confirmImportMsg: "Вы действительно хотите восстановить резервную копию? Убедитесь, что вы выбрали подходящий вариант импорта.",
"Heartbeat Retry Interval": "Интервал повтора опроса", "Heartbeat Retry Interval": "Интервал повтора опроса",
"Import Backup": "Восстановление резервной копии", "Import Backup": "Импорт",
"Export Backup": "Резервная копия", "Export Backup": "Скачать",
"Skip existing": "Пропустить существующие", "Skip existing": "Пропустить существующие",
Overwrite: "Перезаписать", Overwrite: "Перезаписать",
Options: "Опции", Options: "Опции",
@ -167,19 +168,19 @@ export default {
Purple: "Пурпурный", Purple: "Пурпурный",
Pink: "Розовый", Pink: "Розовый",
"Search...": "Поиск...", "Search...": "Поиск...",
"Avg. Ping": "Средн. пинг", "Avg. Ping": "Среднее значение пинга",
"Avg. Response": "Средн. ответ", "Avg. Response": "Среднее время ответа",
"Entry Page": "Главная страница", "Entry Page": "Главная страница",
statusPageNothing: "Здесь пусто. Добавьте группу или монитор.", 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": "Мониторинг",
Discard: "Отмена", Discard: "Отмена",
"Create Incident": "Создать инцидент", "Create Incident": "Создать инцидент",
"Switch to Dark Theme": "Тёмная тема", "Switch to Dark Theme": "Тёмная тема",
@ -302,10 +303,35 @@ export default {
PushUrl: "URL пуша", PushUrl: "URL пуша",
HeadersInvalidFormat: "Заголовки запроса некорректны JSON: ", HeadersInvalidFormat: "Заголовки запроса некорректны JSON: ",
BodyInvalidFormat: "Тело запроса некорректно JSON: ", BodyInvalidFormat: "Тело запроса некорректно JSON: ",
"Monitor History": "История мониторов", "Monitor History": "Статистика",
clearDataOlderThan: "Сохранять историю мониторов в течение {0} дней.", clearDataOlderThan: "Сохранять статистику за {0} дней.",
PasswordsDoNotMatch: "Пароли не совпадают.", PasswordsDoNotMatch: "Пароли не совпадают.",
records: "записей", records: "записей",
"One record": "Одна запись", "One record": "Одна запись",
steamApiKeyDescription: "Для мониторинга игрового сервера Steam вам необходим Web-API ключ Steam. Зарегистрировать его можно здесь: ", steamApiKeyDescription: "Для мониторинга игрового сервера Steam вам необходим Web-API ключ Steam. Зарегистрировать его можно здесь: ",
"Certificate Chain": "Цепочка сертификатов",
"Valid": "Действительный",
"Hide Tags": "Скрыть тэги",
"Title": "Название инцидента:",
"Content": "Содержание инцидента:",
"Post": "Опубликовать",
"Cancel": "Отмена",
"Created": "Создано",
"Unpin": "Открепить",
"Show Tags": "Показать тэги",
"recent": "Сейчас",
"3h": "3 часа",
"6h": "6 часов",
"24h": "24 часа",
"1w": "1 неделя",
"No monitors available.": "Нет доступных мониторов",
"Add one": "Добавить новый",
"Backup": "Резервная копия",
"Security": "Безопасность",
"Shrink Database": "Сжать Базу Данных",
"Current User": "Текущий пользователь",
"About": "О программе",
"Description": "Описание",
"Powered by": "Работает на основе скрипта от",
shrinkDatabaseDescription: "Включает VACUUM для базы данных SQLite. Если ваша база данных была создана на версии 1.10.0 и более, AUTO_VACUUM уже включен и это действие не требуется.",
}; };

@ -0,0 +1,354 @@
export default {
languageName: "Slovenščina",
checkEverySecond: "Preveri na vsakih {0} sekund",
retryCheckEverySecond: "Ponovno poskusi na vsakih {0} sekund",
retriesDescription: "Maksimalno število poskusov predenj se storitev označi kot 'ne deluje' in se pošlje obvestilo",
ignoreTLSError: "Ignoriraj TLS/SSL napake za HTTPS spletne strani",
upsideDownModeDescription: "Negiraj status. Če je storitev deluje bo označena kot 'ne deluje'.",
maxRedirectDescription: "Maksimalno število sledečih preusmeritev. 0 onemogoči preusmeritve.",
acceptedStatusCodesDescription: "Izberi kode statusa veljavna kot uspešen odgovor.",
passwordNotMatchMsg: "Ponovljeno geslo se ne ujema.",
notificationDescription: "Obvestila morajo biti dodeljena monitorju, da delujejo.",
keywordDescription: "Iskana ključna beseda v surovem HTML ali JSON odgovoru. Iskanje je občutljivo na začetnico.",
pauseDashboardHome: "Pavza",
deleteMonitorMsg: "Ste prepričani, da želite izbrisati ta monitor?",
deleteNotificationMsg: "Ste prepričani, da želite izbrisati to obvestilo za vse monitorje?",
resolverserverDescription: "Cloudflare je privzeti strežnik. DNS strežnik lahko spremenite kadarkoli.",
rrtypeDescription: "Izberite RR tip, ki ga želite spremljati",
pauseMonitorMsg: "Ste prepričani, da želite pavzirati?",
enableDefaultNotificationDescription: "To obvestilo bo kot privzeto omogočeno za vse nove monitorje. Še vedno ga lahko izključite posebej za vsak monitor.",
clearEventsMsg: "Ste prepričani da želite izbrisati vse dogodke tega monitorja?",
clearHeartbeatsMsg: "Ste prepričani da želite izbrisati vse srčne utripe tega monitorja?",
confirmClearStatisticsMsg: "Ste prepričani da želite izbrisati VSO statistiko?",
importHandleDescription: "Izberite 'Preskoči obstoječe', če želite preskočiti vsak monitor ali obvestilo z istim imenom. 'Prepiši' bo prepisal vse obstoječe monitorje in obvestila.",
confirmImportMsg: "Ste prepričani da želite uvoziti varnostno kopijo? Preverite da ste izbrali pravo opcijo za uvoz.",
twoFAVerifyLabel: "Prosimo vnesite žeton za potrditev 2FA:",
tokenValidSettingsMsg: "Žeton je veljaven! Sedaj lahko shranite 2FA nastavitev.",
confirmEnableTwoFAMsg: "Ste prepričani, da želite omogočiti 2FA?",
confirmDisableTwoFAMsg: "Ste prepričani, da želite onemogočiti 2FA?",
Settings: "Nastavitve",
Dashboard: "Nadzorna plošča",
"New Update": "Nova posodobitev",
Language: "Jezik",
Appearance: "Izgled",
Theme: "Teme",
General: "Splošno",
"Primary Base URL": "Primaren URL",
Version: "Različica",
"Check Update On GitHub": "Preveri posodobitev na GitHub-u",
List: "Seznam",
Add: "Dodaj",
"Add New Monitor": "Dodaj nov monitor",
"Quick Stats": "Hitro stanje",
Up: "Deluje",
Down: "Ne deluje",
Pending: "Na čakanju",
Unknown: "Neznano",
Pause: "Pavza",
Name: "Ime",
Status: "Status",
DateTime: "DateTime",
Message: "Sporočilo",
"No important events": "Ni pomembnih dogodkov",
Resume: "Nadaljuj",
Edit: "Uredi",
Delete: "Izbriši",
Current: "Trenutno",
Uptime: "Uptime",
"Cert Exp.": "Potek certifikata",
days: "dni",
day: "dan",
"-day": "-dni",
hour: "ura",
"-hour": "-ur",
Response: "Odgovor",
Ping: "Ping",
"Monitor Type": "Tip monitorja",
Keyword: "Ključna beseda",
"Friendly Name": "Ime za prikaz",
URL: "URL",
Hostname: "Hostname",
Port: "Vrata",
"Heartbeat Interval": "Interval srčnega utripa",
Retries: "Ponovni poskusi",
"Heartbeat Retry Interval": "Ponovni poskus srčnega utripa",
Advanced: "Napredno",
"Upside Down Mode": "Negiran način",
"Max. Redirects": "Max. preusmeritev",
"Accepted Status Codes": "Sprejete kode statusa",
"Push URL": "Push URL",
needPushEvery: "Pokliči ta URL vsakih {0} sekund.",
pushOptionalParams: "Dodatni parametri: {0}",
Save: "Shrani",
Notifications: "Obvestila",
"Not available, please setup.": "Ni na voljo, prosimo nastavite.",
"Setup Notification": "Nastavi obvestila",
Light: "Svetlo",
Dark: "Temno",
Auto: "Auto",
"Theme - Heartbeat Bar": "Tema - vrstica srčnega utripa",
Normal: "Normalna",
Bottom: "Spodaj",
None: "Brez",
Timezone: "Časovni pas",
"Search Engine Visibility": "Vidljivost v spletnih iskalnikih",
"Allow indexing": "Dovoli indeksiranje",
"Discourage search engines from indexing site": "Odvračaj spletne iskalnike od indeksiranja te strani",
"Change Password": "Zamenjaj geslo",
"Current Password": "Trenutno geslo",
"New Password": "Novo geslo",
"Repeat New Password": "Ponovi novo geslo",
"Update Password": "Posodobi geslo",
"Disable Auth": "Onemogoči auth",
"Enable Auth": "Omogoči auth",
Logout: "Odjava",
Leave: "Zapusti",
"I understand, please disable": "Razumem, prosim onemogočite",
Confirm: "Potrdi",
Yes: "Da",
No: "Ne",
Username: "Uporabniško ime",
Password: "Geslo",
"Remember me": "Zapomni si me",
Login: "Vpis",
"No Monitors, please": "Prosim, brez monitorjev",
"add one": "Dodaj enega",
"Notification Type": "Tip obvestila",
Email: "Email",
Test: "Test",
"Certificate Info": "Informacije certifikata",
"Resolver Server": "Strežnik za razreševanje",
"Resource Record Type": "Vrsta zapisa o viru",
"Last Result": "Zadnji rezultat",
"Create your admin account": "Ustvari administratorski račun",
"Repeat Password": "Ponovi geslo",
"Import Backup": "Uvozi varnostno kopijo",
"Export Backup": "Izvozi varnostno kopijo",
Export: "Izvozi",
Import: "Uvozi",
respTime: "Odzivni čas (ms)",
notAvailableShort: "N/A",
"Default enabled": "Privzeto omogočeno",
"Apply on all existing monitors": "Uporabi na vseh obstoječih monitorjih",
Create: "Ustvari",
"Clear Data": "Izbriši podatke",
Events: "Dogodki",
Heartbeats: "Srčni utripi",
"Auto Get": "Auto Get",
backupDescription: "Izvozite lahko vse monitorje in obvestila v JSON datoteko.",
backupDescription2: "Pomni: Zgodovina in podatki dogodkov niso vključeni.",
backupDescription3: "Občutljivi podatki, kot žetoni za obvestila so vlkjučeni v datoteko za izvoz; prosimo hranite na varnem.",
alertNoFile: "Izberite datoteko za Uvoz.",
alertWrongFileType: "Prosimo izberite JSON datoteko.",
"Clear all statistics": "Pobrišite vso statistiko",
"Skip existing": "Preskoči obstoječe",
Overwrite: "Prepiši",
Options: "Možnosti",
"Keep both": "Ohrani oboje",
"Verify Token": "Potrdi žeton",
"Setup 2FA": "Nastavi 2FA",
"Enable 2FA": "Omogoči 2FA",
"Disable 2FA": "Onemogoči 2FA",
"2FA Settings": "2FA nastavitve",
"Two Factor Authentication": "Preverjanje pristnosti z dvema dejavnikoma",
Active: "Aktivno",
Inactive: "Neaktivno",
Token: "Žeton",
"Show URI": "Prikaži URI",
Tags: "Značke",
"Add New below or Select...": "Dodaj novo spodaj ali izberi iz seznama...",
"Tag with this name already exist.": "Značka s tem imenom že obstaja.",
"Tag with this value already exist.": "Značka s to vrednostjo že obstaja.",
color: "barva",
"value (optional)": "vrednost (po želji)",
Gray: "Siva",
Red: "Rdeča",
Orange: "Oranžna",
Green: "Zelena",
Blue: "Modra",
Indigo: "Indigo",
Purple: "Vijolična",
Pink: "Roza",
"Search...": "Išči...",
"Avg. Ping": "Avg. Ping",
"Avg. Response": "Avg. odziv",
"Entry Page": "Vstopna stran",
statusPageNothing: "Nikjer nič... Dodajte skupino ali monitor.",
"No Services": "Ni storitev",
"All Systems Operational": "Vsi sistemi delujejo",
"Partially Degraded Service": "Delno poslabšana storitev",
"Degraded Service": "Poslabšana storitev",
"Add Group": "Dodaj skupino",
"Add a monitor": "Dodaj monitor",
"Edit Status Page": "Uredi statusno stran",
"Go to Dashboard": "Pojdi na nadzorno ploščo",
"Status Page": "Status",
defaultNotificationName: "Moje {notification} Obvestilo ({number})",
here: "tukaj",
Required: "Obvezno",
telegram: "Telegram",
"Bot Token": "Robotkov žetonček",
wayToGetTelegramToken: "Lahko dobiš žeton od {0}.",
"Chat ID": "ID pogovora",
supportTelegramChatID: "Direkten pogovor pomoči / Skupina / ID kanala",
wayToGetTelegramChatID: "Id lahko dobiš, če pošlješ sporočilo robotku in odpreš ta URL, da bi videl chat_id:",
"YOUR BOT TOKEN HERE": "ROBOTKOV ŽETON TUKAJ",
chatIDNotFound: "Ne najdem Chat Id-ja; prvo pošlji sporočilo robotku",
webhook: "Webhook",
"Post URL": "Post URL",
"Content Type": "Vrsta vsebine",
webhookJsonDesc: "{0} je v redu za vsak moderen HTTP strežnik, kot recimo Express.js",
webhookFormDataDesc: "{multipart} je v redu za PHP. JSON bo moral biti razčlenjen s {decodeFunction}",
smtp: "Email (SMTP)",
secureOptionNone: "Brez / STARTTLS (25, 587)",
secureOptionTLS: "TLS (465)",
"Ignore TLS Error": "Ignoriraj TLS napako",
"From Email": "Od Email",
emailCustomSubject: "Poljubna zadeva",
"To Email": "Za Email",
smtpCC: "CC",
smtpBCC: "BCC",
discord: "Discord",
"Discord Webhook URL": "Discord Webhook URL",
wayToGetDiscordURL: "To lahko dibiš v Server Settings -> Integrations -> Create Webhook",
"Bot Display Name": "Prikazno ime robotka",
"Prefix Custom Message": "Predpona poljubnega sporočila",
"Hello @everyone is...": "Pozdravljen {'@'}everyone je...",
teams: "Microsoft Teams",
"Webhook URL": "Webhook URL",
wayToGetTeamsURL: "Izvedi kako narediš webhook URL {0}.",
signal: "Signal",
Number: "Številka",
Recipients: "Prejemniki",
needSignalAPI: "Imeti moraš signal klienta z REST API.",
wayToCheckSignalURL: "Kako se to naredi, lahko preveriš na tem URL-ju:",
signalImportant: "POMEMBNO: Ne moreš mešati skupin in številk v prejemnikih!",
gotify: "Gotify",
"Application Token": "Žeton za aplikacijo",
"Server URL": "URL Strežnika",
Priority: "Prioriteta",
slack: "Slack",
"Icon Emoji": "Emoji ikona",
"Channel Name": "Ime kanala",
"Uptime Kuma URL": "Uptime Kuma URL",
aboutWebhooks: "Več o webhook-ih: {0}",
aboutChannelName: "Vnesi ime kanala na {0} Channel Name polje, če želiš preskočiti webhook kanal. npr.: #drug-kanal",
aboutKumaURL: "Če pustite polje Uptime Kuma URL prazno, bo nastavljeno privzeto na GitHub stran projekta.",
emojiCheatSheet: "Emoji plonk listek: {0}",
"rocket.chat": "Rocket.Chat",
pushover: "Pushover",
pushy: "Pushy",
octopush: "Octopush",
promosms: "PromoSMS",
clicksendsms: "ClickSend SMS",
lunasea: "LunaSea",
apprise: "Apprise (podpira 50+ storitev za obveščevanje)",
pushbullet: "Pushbullet",
line: "Line Messenger",
mattermost: "Mattermost",
"User Key": "User Key",
Device: "Naprava",
"Message Title": "Naslov sporočila",
"Notification Sound": "Zvok obvestila",
"More info on:": "Več informacij na: {0}",
pushoverDesc1: "Prioriteta nujnosti (2) ima privzeto nastavitev 30 sekund časa med ponovni poskusi in poteče po 1 uri.",
pushoverDesc2: "Če želite pošiljati obvestila na različne naprave izpolnite polje 'Naprava'.",
"SMS Type": "Vrsta SMS-a",
octopushTypePremium: "Premium (hitro - priporočljivo za opozarjanje)",
octopushTypeLowCost: "Cenovno ugodno (počasno - včasih jih blokira operater)",
checkPrice: "preveri {0} cene:",
apiCredentials: "API poverilnice",
octopushLegacyHint: "Uporabljate legacy verzijo Octopush-a (2011-2020) ali novo verzijo?",
"Check octopush prices": "Preveri octopush cene {0}.",
octopushPhoneNumber: "Telefonska številka (npr.: +386031234567) ",
octopushSMSSender: "Ime SMS pošiljatelja: 3-11 alfanumeričnih znakov in presledki (a-zA-Z0-9)",
"LunaSea Device ID": "LunaSea Device ID",
"Apprise URL": "Apprise URL",
"Example:": "Primer: {0}",
"Read more:": "Preberi več: {0}",
"Status:": "Status: {0}",
"Read more": "Preberi več",
appriseInstalled: "Apprise je nameščen.",
appriseNotInstalled: "Apprise ni nameščen. {0}",
"Access Token": "Žeton za dostop",
"Channel access token": "Žeton za dostop do kanala",
"Line Developers Console": "Line Developers Console",
lineDevConsoleTo: "Line Developers Console - {0}",
"Basic Settings": "Osnovne nastavitve",
"User ID": "User ID",
"Messaging API": "Messaging API",
wayToGetLineChannelToken: "Prvo odpri {0}, ustvarite ponudnika in kanal (Messaging API), potem lahko žeton za dostop do kanala in ID uporabnika dobite iz zgoraj navedenih elementov menija.",
"Icon URL": "URL ikone",
aboutIconURL: "V razdelku \"URL ikone\" lahko zagotovite povezavo do slike, ki bo nadomestila privzeto sliko profila. Ne bo uporabljena, če je nastavljena ikona Emoji.",
aboutMattermostChannelName: "V razdelku \"URL ikone\" lahko zagotovite povezavo do slike, ki bo nadomestila privzeto sliko profila. Ne bo uporabljena, če je nastavljena ikona Emoji",
matrix: "Matrix",
promosmsTypeEco: "SMS ECO - poceni, vendar počasen in pogosto preobremenjen. Omejeno samo na poljske prejemnike.",
promosmsTypeFlash: "SMS FLASH - sporočilo se samodejno prikaže v napravi prejemnika. Omejeno samo na poljske prejemnike.",
promosmsTypeFull: "SMS FULL - Premium raven SMS, Uporabite lahko svoje ime pošiljatelja (najprej morate registrirati ime). Zanesljivo za opozorila.",
promosmsTypeSpeed: "SMS SPEED - Najvišja prednost v sistemu. Zelo hitro in zanesljivo, vendar drago (približno dvakratnik cene SMS FULL)..",
promosmsPhoneNumber: "Telefonska številka (za poljskega prejemnika Lahko preskočite področne oznake",
promosmsSMSSender: "Ime pošiljatelja SMS : vnaprej registrirano ime ali eno od privzetih: SMS, SMS Info, MaxSMS, INFO, SMS",
"Feishu WebHookUrl": "Feishu WebHookURL",
matrixHomeserverURL: "Homeserver URL (z http(s):// in vrata po želji)",
"Internal Room Id": "Interni ID sobe",
matrixDesc1: "Notranji ID sobe lahko poiščete v naprednem razdelku nastavitev sobe v odjemalcu Matrix. Izgledati mora kot !QMdRCpUIfLwsfjxye6:home.server",
matrixDesc2: "Zelo priporočljivo je, da ustvarite novega uporabnika in ne uporabljate svojega žetona za dostop uporabnika Matrix, saj bo omogočil popoln dostop do vašega računa in vseh sob, ki ste se jim pridružili. Namesto tega ustvarite novega uporabnika in ga povabite le v sobo, v kateri želite prejemati obvestila. Token dostopa lahko dobite tako, da zaženete {0}",
Method: "Metoda",
Body: "Telo",
Headers: "Glave",
PushUrl: "Push URL",
HeadersInvalidFormat: "Glave zahtevka niso veljavni JSON: ",
BodyInvalidFormat: "Telo zahteve ni veljaven JSON: ",
"Monitor History": "Zgodovina",
clearDataOlderThan: "Ohrani zgodovino {0} dni.",
PasswordsDoNotMatch: "Gesli se ne ujemata.",
records: "vnosi",
"One record": "En vnos",
steamApiKeyDescription: "Za spremljanje igralnega strežnika Steam potrebujete ključ spletnega vmesnika Steam. Ključ API lahko registrirate tukaj: ",
"Current User": "Trenuten uporabnik",
recent: "Nedavno",
Done: "Zaključi",
Info: "Info",
Security: "Varnost",
"Steam API Key": "Steam API Key",
"Shrink Database": "Stisni bazo",
"Pick a RR-Type...": "Izberi RR tip...",
"Pick Accepted Status Codes...": "Izbiranje sprejetih kod stanja...",
Default: "Privzeto",
"HTTP Options": "HTTP možnosti",
"Create Incident": "Ustvari incident",
Title: "Naslov",
Content: "Vsebina",
Style: "Stil",
info: "info",
warning: "opozorilo",
danger: "nevarnost",
primary: "primarno",
light: "svetlo",
dark: "temno",
Post: "Objavi",
"Please input title and content": "Vnesi naslov in vsebino",
Created: "Ustvarjeno",
"Last Updated": "Nazadnje posodobljeno",
Unpin: "Odpni",
"Switch to Light Theme": "Preklopi na svetlo temo",
"Switch to Dark Theme": "Preklopi na temno temo",
"Show Tags": "Prikaži značke",
"Hide Tags": "Skrij značke",
Description: "Opis",
"No monitors available.": "Nobenega monitorja ni na voljo.",
"Add one": "Dodaj enega",
"No Monitors": "Ni monitorjev",
"Untitled Group": "Skupina brez imena",
Services: "Storitve",
Discard: "zavrzi",
Cancel: "Prekliči",
"Powered by": "Powered by",
shrinkDatabaseDescription: "Sprožitev podatkovne zbirke VACUUM za SQLite. Če je vaša zbirka podatkov ustvarjena po različici 1.10.0, je funkcija AUTO_VACUUM že omogočena in ta ukrep ni potreben.",
serwersms: "SerwerSMS.pl",
serwersmsAPIUser: "API uporabniško ime (vključno z webapi_ prefix)",
serwersmsAPIPassword: "API geslo",
serwersmsPhoneNumber: "Telefonska številka",
serwersmsSenderName: "Ime SMS pošiljatelja (registrirani prek portala za stranke)",
"stackfield": "Stackfield",
};

@ -12,7 +12,7 @@ export default {
pauseDashboardHome: "Pauziraj", pauseDashboardHome: "Pauziraj",
deleteMonitorMsg: "Da li ste sigurni da želite da obrišete ovog posmatrača?", deleteMonitorMsg: "Da li ste sigurni da želite da obrišete ovog posmatrača?",
deleteNotificationMsg: "Da li ste sigurni d aželite da uklonite ovo obaveštenje za sve posmatrače?", deleteNotificationMsg: "Da li ste sigurni d aželite da uklonite ovo obaveštenje za sve posmatrače?",
resoverserverDescription: "Cloudflare je podrazumevani server. Možete promeniti server za raszrešavanje u bilo kom trenutku.", resolverserverDescription: "Cloudflare je podrazumevani server. Možete promeniti server za raszrešavanje u bilo kom trenutku.",
rrtypeDescription: "Odaberite RR-Type koji želite da posmatrate", rrtypeDescription: "Odaberite RR-Type koji želite da posmatrate",
pauseMonitorMsg: "Da li ste sigurni da želite da pauzirate?", pauseMonitorMsg: "Da li ste sigurni da želite da pauzirate?",
Settings: "Podešavanja", Settings: "Podešavanja",

@ -12,7 +12,7 @@ export default {
pauseDashboardHome: "Паузирај", pauseDashboardHome: "Паузирај",
deleteMonitorMsg: "Да ли сте сигурни да желите да обришете овог посматрача?", deleteMonitorMsg: "Да ли сте сигурни да желите да обришете овог посматрача?",
deleteNotificationMsg: "Да ли сте сигурни д ажелите да уклоните ово обавештење за све посматраче?", deleteNotificationMsg: "Да ли сте сигурни д ажелите да уклоните ово обавештење за све посматраче?",
resoverserverDescription: "Cloudflare је подразумевани сервер. Можете променити сервер за расзрешавање у било ком тренутку.", resolverserverDescription: "Cloudflare је подразумевани сервер. Можете променити сервер за расзрешавање у било ком тренутку.",
rrtypeDescription: "Одаберите RR-Type који желите да посматрате", rrtypeDescription: "Одаберите RR-Type који желите да посматрате",
pauseMonitorMsg: "Да ли сте сигурни да желите да паузирате?", pauseMonitorMsg: "Да ли сте сигурни да желите да паузирате?",
Settings: "Подешавања", Settings: "Подешавања",

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

Loading…
Cancel
Save