Compare commits

..

4 Commits

Author SHA1 Message Date
Louis Lam
e4aedeb7af WIP 2023-08-11 21:26:25 +08:00
Louis Lam
642136780f WIP 2023-08-11 20:27:57 +08:00
Louis Lam
80d5f6840b Merge branch '2.0.X' into npm-publish 2023-08-11 20:27:34 +08:00
Louis Lam
d76a515cbf WIP 2023-08-03 20:51:11 +08:00
33 changed files with 226 additions and 413 deletions

View File

@@ -1,3 +1,5 @@
# Should be very similar to .npmignore, but the syntax is a bit different
/.idea
/node_modules
/data*
@@ -12,9 +14,8 @@
**/.gitignore
**/docker-compose*
**/[Dd]ockerfile*
LICENSE
README.md
.editorconfig
.vs
.vscode
.eslint*
.stylelint*
@@ -32,22 +33,15 @@ tsconfig.json
/tmp
/babel.config.js
/ecosystem.config.js
/extra/healthcheck.exe
/extra/healthcheck
extra/exe-builder
/public
### .gitignore content (commented rules are duplicated)
#node_modules
.DS_Store
#dist
dist-ssr
*.local
#.idea
#/data
#!/data/.gitkeep
#.vscode
### End of .gitignore content
# .dockerignore only, not in .npmignore
/extra/healthcheck.exe
/extra/healthcheck
LICENSE
README.md

View File

@@ -113,7 +113,7 @@ module.exports = {
"error",
{ "noOptionalParamNames": true }
],
"jsdoc/require-throws": "warn",
"jsdoc/require-throws": "error",
"jsdoc/require-jsdoc": [
"error",
{
@@ -124,20 +124,19 @@ module.exports = {
}
],
"jsdoc/no-blank-block-descriptions": "error",
"jsdoc/require-returns-description": "warn",
"jsdoc/require-returns-check": [
"error",
{ "reportMissingReturnForUndefinedTypes": false }
],
"jsdoc/require-returns": [
"warn",
"error",
{
"forceRequireReturn": true,
"forceReturnsWithAsync": true
}
],
"jsdoc/require-param-type": "warn",
"jsdoc/require-param-description": "warn"
"jsdoc/require-param-type": "error",
"jsdoc/require-param-description": "error"
},
"overrides": [
{

View File

@@ -9,7 +9,7 @@ on:
paths-ignore:
- '*.md'
pull_request:
branches: [ master, 2.0.X ]
branches: [ master ]
paths-ignore:
- '*.md'
@@ -50,7 +50,7 @@ jobs:
strategy:
matrix:
os: [ ARMv7 ]
node: [ 14, 20 ]
node: [ 14.21.3, 20.5.0 ]
# See supported Node.js release schedule at https://nodejs.org/en/about/releases/
steps:
@@ -78,21 +78,20 @@ jobs:
- run: npm install
- run: npm run lint
# TODO: Temporarily disable, as it cannot pass the test in 2.0.0 yet
# e2e-tests:
# needs: [ check-linters ]
# runs-on: ubuntu-latest
# steps:
# - run: git config --global core.autocrlf false # Mainly for Windows
# - uses: actions/checkout@v3
#
# - name: Use Node.js 14
# uses: actions/setup-node@v3
# with:
# node-version: 14
# - run: npm install
# - run: npm run build
# - run: npm run cy:test
e2e-tests:
needs: [ check-linters ]
runs-on: ubuntu-latest
steps:
- run: git config --global core.autocrlf false # Mainly for Windows
- uses: actions/checkout@v3
- name: Use Node.js 14
uses: actions/setup-node@v3
with:
node-version: 14
- run: npm install
- run: npm run build
- run: npm run cy:test
frontend-unit-tests:
needs: [ check-linters ]

View File

@@ -1,4 +1,4 @@
name: json-yaml-validate
name: json-yaml-validate
on:
push:
branches:
@@ -6,7 +6,6 @@ on:
pull_request:
branches:
- master
- 2.0.X
workflow_dispatch:
permissions:

45
.npmignore Normal file
View File

@@ -0,0 +1,45 @@
# Should be very similar to .dockerignore, but the syntax is a bit different
/.idea
/node_modules
/data
/cypress
/out
/test
/kubernetes
/.do
/.dockerignore
/private
/.git
/.gitignore
/docker-compose*
/[Dd]ockerfile*
.editorconfig
.vs
.vscode
.eslint*
.stylelint*
/.devcontainer
/.github
yarn.lock
app.json
CODE_OF_CONDUCT.md
CONTRIBUTING.md
CNAME
install.sh
SECURITY.md
tsconfig.json
.env
/tmp
/babel.config.js
/ecosystem.config.js
extra/exe-builder
/public
.DS_Store
dist-ssr
*.local
## .npmignore only, not in .dockerignore
/docker
/extra/healthcheck*

View File

@@ -214,7 +214,7 @@ Since previously updating Vite 2.5.10 to 2.6.0 broke the application completely,
Patch release = the third digit ([Semantic Versioning](https://semver.org/))
If for security / bug / other reasons, a library must be updated, breaking changes need to be checked by the person proposing the change.
If for maybe security reasons, a library must be updated. Then you must need to check if there are any breaking changes.
## Translations

View File

@@ -2,10 +2,6 @@
https://knexjs.org/guide/migrations.html#knexfile-in-other-languages
## Basic rules
- All tables must have a primary key named `id`
- Filename format: `YYYY-MM-DD-HHMM-patch-name.js`
- Avoid native SQL syntax, use knex methods, because Uptime Kuma supports multiple databases
## Template
@@ -25,17 +21,19 @@ exports.down = function(knex) {
## Example
Filename: 2023-06-30-1348-create-user-and-product.js
YYYY-MM-DD-HHMM-create-users-products.js
2023-06-30-1348-create-users-products.js
```js
exports.up = function(knex) {
return knex.schema
.createTable('user', function (table) {
.createTable('users', function (table) {
table.increments('id');
table.string('first_name', 255).notNullable();
table.string('last_name', 255).notNullable();
})
.createTable('product', function (table) {
.createTable('products', function (table) {
table.increments('id');
table.decimal('price').notNullable();
table.string('name', 1000).notNullable();
@@ -49,8 +47,8 @@ exports.up = function(knex) {
exports.down = function(knex) {
return knex.schema
.dropTable("product")
.dropTable("user");
.dropTable("products")
.dropTable("users");
};
```

75
extra/cli.js Normal file
View File

@@ -0,0 +1,75 @@
#!/usr/bin/env node
const path = require("path");
const args = require("args-parser")(process.argv);
// Set the data directory
if (!process.env.DATA_DIR) {
if (process.platform === "win32") {
process.env.DATA_DIR = process.env.LOCALAPPDATA + "\\uptime-kuma\\";
} else if (process.platform === "linux") {
process.env.DATA_DIR = process.env.HOME + "/.local/share/uptime-kuma/";
} else if (process.platform === "darwin") {
// TODO: Not sure if this is the correct path for macOS
process.env.DATA_DIR = process.env.HOME + "/Library/Preferences/uptime-kuma/";
} else {
console.error("Unable to detect app data directory on platform: " + process.platform);
console.error("Please set the DATA_DIR environment variable or `--data-dir=` to the directory where you want to store your data.");
process.exit(1);
}
}
// Change the working directory to the root of the project, so it can read the dist folder
process.chdir(path.join(__dirname, ".."));
if (args.run) {
require("../server/server");
} else if (args.installService) {
if (process.platform === "win32") {
let Service = require("node-windows").Service;
// Create a new service object
let svc = new Service({
name: "Uptime Kuma",
description: "Uptime Kuma is an easy-to-use self-hosted monitoring tool.",
script: "C:\\path\\to\\helloworld.js",
nodeOptions: [
"--harmony",
"--max_old_space_size=4096"
]
//, workingDirectory: '...'
//, allowServiceLogon: true
});
// Listen for the "install" event, which indicates the
// process is available as a service.
svc.on("install", function () {
svc.start();
});
svc.install();
} else if (process.platform === "linux") {
} else {
console.error("Unable to install service on platform: " + process.platform);
process.exit(1);
}
} else if (args.version || args.v) {
const version = require("../package.json").version;
console.log("Uptime Kuma version: " + version);
} else {
console.log(`Usage: uptime-kuma [options]
Options:
--install-service Install Uptime Kuma service (Windows and Linux only)
--uninstall-service Uninstall Uptime Kuma service
--run Run Uptime Kuma directly in the terminal
--data-dir="your path" Set the data directory
--version Print the version
--help Print this help
`);
}

View File

@@ -9,24 +9,8 @@
<meta name="theme-color" id="theme-color" content="" />
<meta name="description" content="Uptime Kuma monitoring tool" />
<title>Uptime Kuma</title>
<style>
.noscript-message {
font-size: 20px;
text-align: center;
padding: 10px;
max-width: 500px;
margin: 0 auto;
}
</style>
</head>
<body>
<noscript>
<div class="noscript-message">
Sorry, you don't seem to have JavaScript enabled or your browser
doesn't support it.<br />This website requires JavaScript to function.
Please enable JavaScript in your browser settings to continue.
</div>
</noscript>
<div id="app"></div>
<script type="module" src="/src/main.js"></script>
</body>

18
package-lock.json generated
View File

@@ -53,6 +53,7 @@
"nanoid": "~3.3.4",
"node-cloudflared-tunnel": "~1.0.9",
"node-radius-client": "~1.0.0",
"node-windows": "^1.0.0-beta.8",
"nodemailer": "~6.6.5",
"nostr-tools": "^1.13.1",
"notp": "~2.0.3",
@@ -76,6 +77,9 @@
"thirty-two": "~1.0.2",
"ws": "^8.13.0"
},
"bin": {
"uptime-kuma": "extra/cli.js"
},
"devDependencies": {
"@actions/github": "~5.0.1",
"@babel/eslint-parser": "^7.22.7",
@@ -14642,6 +14646,15 @@
"node": ">= 10"
}
},
"node_modules/node-windows": {
"version": "1.0.0-beta.8",
"resolved": "https://registry.npmjs.org/node-windows/-/node-windows-1.0.0-beta.8.tgz",
"integrity": "sha512-uLekXnSeem3nW5escID224Fd0U/1VtvE796JpSpOY+c73Cslz/Qn2WUHRJyPQJEMrNGAy/FMRFjjhh4z1alZTA==",
"dependencies": {
"xml": "1.0.1",
"yargs": "^17.5.1"
}
},
"node_modules/nodemailer": {
"version": "6.6.5",
"resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.6.5.tgz",
@@ -19016,6 +19029,11 @@
}
}
},
"node_modules/xml": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/xml/-/xml-1.0.1.tgz",
"integrity": "sha512-huCv9IH9Tcf95zuYCsQraZtWnJvBtLVE0QHMOs8bWyZAFZNDcYjsPq1nEx8jKA9y+Beo9v+7OBPRisQTjinQMw=="
},
"node_modules/xmlbuilder": {
"version": "8.2.2",
"resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-8.2.2.tgz",

View File

@@ -1,5 +1,6 @@
{
"name": "uptime-kuma",
"description": "Uptime Kuma is an easy-to-use self-hosted monitoring tool",
"version": "1.23.0-beta.1",
"license": "MIT",
"repository": {
@@ -9,7 +10,11 @@
"engines": {
"node": "14 || 16 || 18 || >= 20.4.0"
},
"bin": {
"uptime-kuma": "./extra/cli.js"
},
"scripts": {
"uptime-kuma": "node ./extra/cli.js",
"install-legacy": "npm install",
"update-legacy": "npm update",
"lint:js": "eslint --ext \".js,.vue\" --ignore-path .gitignore .",
@@ -55,8 +60,8 @@
"simple-dns-server": "node extra/simple-dns-server.js",
"simple-mqtt-server": "node extra/simple-mqtt-server.js",
"update-language-files": "cd extra/update-language-files && node index.js && cross-env-shell eslint ../../src/languages/$npm_config_language.js --fix",
"release-final": "node ./extra/test-docker.js && node extra/update-version.js && npm run build-docker && node ./extra/press-any-key.js && npm run upload-artifacts && node ./extra/update-wiki-version.js",
"release-beta": "node ./extra/test-docker.js && node extra/beta/update-version.js && npm run build && node ./extra/env2arg.js docker buildx build -f docker/dockerfile --platform linux/amd64,linux/arm64,linux/arm/v7 -t louislam/uptime-kuma:$VERSION -t louislam/uptime-kuma:beta . --target release --push && node ./extra/press-any-key.js && npm run upload-artifacts",
"release-final": "node ./extra/test-docker.js && node extra/update-version.js && npm run build-docker && node ./extra/press-any-key.js && npm run upload-artifacts && node ./extra/update-wiki-version.js && npm run publish-to-npm",
"release-beta": "node ./extra/test-docker.js && node extra/beta/update-version.js && npm run build && node ./extra/env2arg.js docker buildx build -f docker/dockerfile --platform linux/amd64,linux/arm64,linux/arm/v7 -t louislam/uptime-kuma:$VERSION -t louislam/uptime-kuma:beta . --target release --push && node ./extra/press-any-key.js && npm run upload-artifacts && npm run publish-to-npm-beta",
"git-remove-tag": "git tag -d",
"build-dist-and-restart": "npm run build && npm run start-server-dev",
"start-pr-test": "node extra/checkout-pr.js && npm install && npm run dev",
@@ -68,7 +73,10 @@
"deploy-demo-server": "node extra/deploy-demo-server.js",
"sort-contributors": "node extra/sort-contributors.js",
"quick-run-nightly": "docker run --rm --env NODE_ENV=development -p 3001:3001 louislam/uptime-kuma:nightly2",
"start-dev-container": "cd docker && docker-compose -f docker-compose-dev.yml up --force-recreate"
"start-dev-container": "cd docker && docker-compose -f docker-compose-dev.yml up --force-recreate",
"publish-to-npm-dev": "npm run build && npm publish --tag dev",
"publish-to-npm-beta": "npm publish --tag beta",
"publish-to-npm": "npm publish"
},
"dependencies": {
"@grpc/grpc-js": "~1.7.3",
@@ -115,6 +123,7 @@
"nanoid": "~3.3.4",
"node-cloudflared-tunnel": "~1.0.9",
"node-radius-client": "~1.0.0",
"node-windows": "^1.0.0-beta.8",
"nodemailer": "~6.6.5",
"nostr-tools": "^1.13.1",
"notp": "~2.0.3",

View File

@@ -133,9 +133,6 @@ class Database {
log.info("db", `Data Dir: ${Database.dataDir}`);
}
/**
*
*/
static readDBConfig() {
let dbConfig;
@@ -152,9 +149,6 @@ class Database {
return dbConfig;
}
/**
* @param dbConfig
*/
static writeDBConfig(dbConfig) {
fs.writeFileSync(path.join(Database.dataDir, "db-config.json"), JSON.stringify(dbConfig, null, 4));
}
@@ -282,10 +276,6 @@ class Database {
}
}
/**
* @param testMode
* @param noLog
*/
static async initSQLite(testMode, noLog) {
await R.exec("PRAGMA foreign_keys = ON");
if (testMode) {
@@ -311,9 +301,6 @@ class Database {
}
}
/**
*
*/
static async initMariaDB() {
log.debug("db", "Checking if MariaDB database exists...");
@@ -350,6 +337,7 @@ class Database {
}
/**
*
* @returns {Promise<void>}
*/
static async rollbackLatestPatch() {
@@ -640,9 +628,6 @@ class Database {
await R.exec("VACUUM");
}
/**
*
*/
static sqlHourOffset() {
if (this.dbConfig.client === "sqlite3") {
return "DATETIME('now', ? || ' hours')";

View File

@@ -24,6 +24,7 @@ class EmbeddedMariaDB {
started = false;
/**
*
* @returns {EmbeddedMariaDB}
*/
static getInstance() {
@@ -33,9 +34,6 @@ class EmbeddedMariaDB {
return EmbeddedMariaDB.instance;
}
/**
*
*/
static hasInstance() {
return !!EmbeddedMariaDB.instance;
}
@@ -102,9 +100,6 @@ class EmbeddedMariaDB {
});
}
/**
*
*/
stop() {
if (this.childProcess) {
this.childProcess.kill("SIGINT");
@@ -112,9 +107,6 @@ class EmbeddedMariaDB {
}
}
/**
*
*/
initDB() {
if (!fs.existsSync(this.mariadbDataDir)) {
log.info("mariadb", `Embedded MariaDB: ${this.mariadbDataDir} is not found, create one now.`);
@@ -145,9 +137,6 @@ class EmbeddedMariaDB {
}
/**
*
*/
async initDBAfterStarted() {
const connection = mysql.createConnection({
socketPath: this.socketPath,

View File

@@ -39,14 +39,6 @@ class Heartbeat extends BeanModel {
};
}
/**
* TODO: Find the msg from the `msg` table and get the msg_id
* @param value
*/
set msg(value) {
throw new Error("Not implemented yet")
}
}
module.exports = Heartbeat;

View File

@@ -291,9 +291,6 @@ class Monitor extends BeanModel {
return JSON.parse(this.accepted_statuscodes_json);
}
/**
*
*/
getGameDigGivenPortOnly() {
return Boolean(this.gamedigGivenPortOnly);
}

View File

@@ -21,7 +21,7 @@ class AliyunSMS extends NotificationProvider {
status: this.statusToString(heartbeatJSON["status"]),
msg: heartbeatJSON["msg"],
});
if (await this.sendSms(notification, msgBody)) {
if (this.sendSms(notification, msgBody)) {
return okMsg;
}
} else {
@@ -31,7 +31,7 @@ class AliyunSMS extends NotificationProvider {
status: "",
msg: msg,
});
if (await this.sendSms(notification, msgBody)) {
if (this.sendSms(notification, msgBody)) {
return okMsg;
}
}
@@ -76,8 +76,7 @@ class AliyunSMS extends NotificationProvider {
if (result.data.Message === "OK") {
return true;
}
throw new Error(result.data.Message);
return false;
}
/**

View File

@@ -23,10 +23,6 @@ class SetupDatabase {
server;
/**
* @param args
* @param server
*/
constructor(args, server) {
this.server = server;
@@ -76,17 +72,10 @@ class SetupDatabase {
return this.needSetup;
}
/**
*
*/
isEnabledEmbeddedMariaDB() {
return process.env.UPTIME_KUMA_ENABLE_EMBEDDED_MARIADB === "1";
}
/**
* @param hostname
* @param port
*/
start(hostname, port) {
return new Promise((resolve) => {
const app = express();

View File

@@ -68,7 +68,8 @@ export default {
/**
* Calculates the amount of beats of padding needed to fill the length of shortBeatList.
* @returns {number} The amount of beats of padding needed to fill the length of shortBeatList.
*
* @return {number} The amount of beats of padding needed to fill the length of shortBeatList.
*/
numPadding() {
if (!this.beatList) {
@@ -148,7 +149,7 @@ export default {
/**
* Returns the style object for positioning the time element.
* @returns {object} The style object containing the CSS properties for positioning the time element.
* @return {Object} The style object containing the CSS properties for positioning the time element.
*/
timeStyle() {
return {
@@ -158,7 +159,8 @@ export default {
/**
* Calculates the time elapsed since the first valid beat.
* @returns {string} The time elapsed in minutes or hours.
*
* @return {string} The time elapsed in minutes or hours.
*/
timeSinceFirstBeat() {
const firstValidBeat = this.shortBeatList.at(this.numPadding);
@@ -172,7 +174,8 @@ export default {
/**
* Calculates the elapsed time since the last valid beat was registered.
* @returns {string} The elapsed time in a minutes, hours or "now".
*
* @return {string} The elapsed time in a minutes, hours or "now".
*/
timeSinceLastBeat() {
const lastValidBeat = this.shortBeatList.at(-1);

View File

@@ -120,7 +120,8 @@ export default {
/**
* Returns a sorted list of monitors based on the applied filters and search text.
* @returns {Array} The sorted list of monitors.
*
* @return {Array} The sorted list of monitors.
*/
sortedMonitorList() {
let result = Object.values(this.$root.monitorList);
@@ -221,7 +222,8 @@ export default {
/**
* Determines if any filters are active.
* @returns {boolean} True if any filter is active, false otherwise.
*
* @return {boolean} True if any filter is active, false otherwise.
*/
filtersActive() {
return this.filterState.status != null || this.filterState.active != null || this.filterState.tags != null || this.searchText !== "";

View File

@@ -109,10 +109,10 @@
"Last Result": "Letztes Ergebnis",
"pauseMonitorMsg": "Bist du sicher, dass du den Monitor pausieren möchtest?",
"clearEventsMsg": "Bist du sicher, dass du alle Ereignisse für diesen Monitor löschen möchtest?",
"clearHeartbeatsMsg": "Bist du sicher, dass du alle Prüfintervalle für diesen Monitor löschen möchtest?",
"clearHeartbeatsMsg": "Bist du sicher, dass du alle Statistiken für diesen Monitor löschen möchtest?",
"Clear Data": "Lösche Daten",
"Events": "Ereignisse",
"Heartbeats": "Prüfintervalle",
"Heartbeats": "Statistiken",
"confirmClearStatisticsMsg": "Bist du dir sicher, dass du ALLE Statistiken löschen möchtest?",
"Create your admin account": "Erstelle dein Admin-Konto",
"Repeat Password": "Passwort erneut eingeben",
@@ -380,12 +380,12 @@
"alertaAlertState": "Alarmstatus",
"alertaRecoverState": "Wiederherstellungsstatus",
"deleteStatusPageMsg": "Bist du sicher, dass du diese Status-Seite löschen willst?",
"Proxies": "Proxys",
"Proxies": "Proxies",
"default": "Standard",
"enabled": "Aktiviert",
"setAsDefault": "Als Standard setzen",
"deleteProxyMsg": "Bist du sicher, dass du diesen Proxy für alle Monitore löschen willst?",
"proxyDescription": "Proxys müssen einem Monitor zugewiesen werden, um zu funktionieren.",
"proxyDescription": "Proxies müssen einem Monitor zugewiesen werden, um zu funktionieren.",
"enableProxyDescription": "Dieser Proxy wird keinen Effekt auf Monitor-Anfragen haben, bis er aktiviert ist. Du kannst ihn temporär von allen Monitoren nach Aktivierungsstatus deaktivieren.",
"setAsDefaultProxyDescription": "Dieser Proxy wird standardmässig für alle neuen Monitore aktiviert sein. Du kannst den Proxy immer noch für jeden Monitor einzeln deaktivieren.",
"Certificate Chain": "Zertifikatskette",
@@ -815,25 +815,5 @@
"Badge Preview": "Badge Vorschau",
"tailscalePingWarning": "Um den Tailscale Ping Monitor nutzen zu können, musst du Uptime Kuma ohne Docker installieren und den Tailscale Client auf dem Server installieren.",
"Server URL should not contain the nfty topic": "Die Server-URL sollte das nfty-Thema nicht enthalten",
"pushDeerServerDescription": "Leer lassen um den offiziellen Server zu verwenden",
"FlashDuty Severity": "Schweregrad",
"nostrSender": "Privater Schlüssel des Absenders (nsec)",
"nostrRecipientsHelp": "npub-Format, eine pro Zeile",
"noOrBadCertificate": "Kein/schlechtes Zertifikat",
"wayToGetFlashDutyKey": "Gehe zu Channel -> (Wähle einen Channel) -> Integrationen -> Neue Integration hinzufügen', füge ein 'Custom Event' hinzu, um eine Push-Adresse zu erhalten, und kopiere den Integrationsschlüssel in die Adresse. Für weitere Informationen besuche bitte",
"nostrRelays": "Nostr relays",
"nostrRelaysHelp": "Eine Relay-URL pro Zeile",
"nostrRecipients": "Öffentliche Schlüssel des Empfängers (npub)",
"gamedigGuessPort": "Gamedig: Guess Port",
"Request Timeout": "Zeitüberschreitung der Anfrage",
"styleElapsedTimeShowNoLine": "Anzeigen (keine Zeile)",
"styleElapsedTimeShowWithLine": "Anzeigen (mit Zeile)",
"Select": "Auswählen",
"selectedMonitorCount": "Ausgewählt: {0}",
"PushDeer Server": "PushDeer Server",
"showCertificateExpiry": "Ablauf des Zertifikats anzeigen",
"gamedigGuessPortDescription": "Der vom Valve Server Query Protocol verwendete Port kann sich vom Port des Clients unterscheiden. Versuche dies, wenn der Monitor keine Verbindung zum Server herstellen kann.",
"timeoutAfter": "Zeitüberschreitung nach {0} Sekunden",
"styleElapsedTime": "Verstrichene Zeit unter der Prüfintervallleiste",
"Check/Uncheck": "Aktivieren/Deaktivieren"
"pushDeerServerDescription": "Leer lassen, um den offiziellen Server zu verwenden"
}

View File

@@ -109,10 +109,10 @@
"Last Result": "Letztes Ergebnis",
"pauseMonitorMsg": "Bist du sicher, dass du den Monitor pausieren möchtest?",
"clearEventsMsg": "Bist du sicher, dass du alle Ereignisse für diesen Monitor löschen möchtest?",
"clearHeartbeatsMsg": "Bist du sicher, dass du alle Prüfintervalle für diesen Monitor löschen möchtest?",
"clearHeartbeatsMsg": "Bist du sicher, dass du alle Statistiken für diesen Monitor löschen möchtest?",
"Clear Data": "Lösche Daten",
"Events": "Ereignisse",
"Heartbeats": "Prüfintervalle",
"Heartbeats": "Statistiken",
"confirmClearStatisticsMsg": "Bist du dir sicher, dass du ALLE Statistiken löschen möchtest?",
"Create your admin account": "Erstelle dein Admin-Konto",
"Repeat Password": "Passwort erneut eingeben",
@@ -385,7 +385,7 @@
"enabled": "Aktiviert",
"setAsDefault": "Als Standard setzen",
"deleteProxyMsg": "Bist du sicher, dass du diesen Proxy für alle Monitore löschen willst?",
"proxyDescription": "Proxys müssen einem Monitor zugewiesen werden, um zu funktionieren.",
"proxyDescription": "Proxies müssen einem Monitor zugewiesen werden, um zu funktionieren.",
"enableProxyDescription": "Dieser Proxy wird keinen Effekt auf Monitor-Anfragen haben, bis er aktiviert ist. Du kannst ihn temporär von allen Monitoren nach Aktivierungsstatus deaktivieren.",
"setAsDefaultProxyDescription": "Dieser Proxy wird standardmäßig für alle neuen Monitore aktiviert sein. Du kannst den Proxy immer noch für jeden Monitor einzeln deaktivieren.",
"Certificate Chain": "Zertifikatskette",
@@ -818,25 +818,5 @@
"jsonQueryDescription": "Führe eine JSON-Abfrage gegen die Antwort durch und prüfe den erwarteten Wert (der Rückgabewert wird zum Vergleich in eine Zeichenkette umgewandelt). Auf <a href='https://jsonata.org/'>jsonata.org</a> findest du die Dokumentation zur Abfragesprache. <a href='https://try.jsonata.org/'>Hier</a> kannst du Abfragen üben.",
"tailscalePingWarning": "Um den Tailscale Ping Monitor nutzen zu können, musst du Uptime Kuma ohne Docker installieren und den Tailscale Client auf dem Server installieren.",
"Server URL should not contain the nfty topic": "Die Server-URL sollte das nfty-Thema nicht enthalten",
"pushDeerServerDescription": "Leer lassen um den offiziellen Server zu verwenden",
"FlashDuty Severity": "Schweregrad",
"nostrRelays": "Nostr relays",
"gamedigGuessPort": "Gamedig: Guess Port",
"Request Timeout": "Zeitüberschreitung der Anfrage",
"styleElapsedTimeShowNoLine": "Anzeigen (keine Zeile)",
"Select": "Auswählen",
"selectedMonitorCount": "Ausgewählt: {0}",
"PushDeer Server": "PushDeer Server",
"nostrRelaysHelp": "Eine Relay-URL pro Zeile",
"nostrSender": "Privater Schlüssel des Absenders (nsec)",
"gamedigGuessPortDescription": "Der vom Valve Server Query Protocol verwendete Port kann sich vom Port des Clients unterscheiden. Versuche dies, wenn der Monitor keine Verbindung zum Server herstellen kann.",
"wayToGetFlashDutyKey": "Gehe zu Channel -> (Wähle einen Channel) -> Integrationen -> Neue Integration hinzufügen', füge ein 'Custom Event' hinzu, um eine Push-Adresse zu erhalten, und kopiere den Integrationsschlüssel in die Adresse. Für weitere Informationen besuche bitte",
"timeoutAfter": "Zeitüberschreitung nach {0} Sekunden",
"styleElapsedTimeShowWithLine": "Anzeigen (mit Zeile)",
"styleElapsedTime": "Verstrichene Zeit unter der Prüfintervallleiste",
"Check/Uncheck": "Aktivieren/Deaktivieren",
"nostrRecipients": "Öffentliche Schlüssel des Empfängers (npub)",
"nostrRecipientsHelp": "npub-Format, eine pro Zeile",
"showCertificateExpiry": "Ablauf des Zertifikats anzeigen",
"noOrBadCertificate": "Kein/schlechtes Zertifikat"
"pushDeerServerDescription": "Leer lassen, um den offiziellen Server zu verwenden"
}

View File

@@ -159,7 +159,7 @@
"Show URI": "Mostra URI",
"Tags": "Etichette",
"Add New below or Select...": "Aggiungi oppure scegli…",
"Tag with this name already exist.": "Un'etichetta con questo nome esiste già.",
"Tag with this name already exist.": "Un'etichetta con questo nome già esiste.",
"Tag with this value already exist.": "Un'etichetta con questo valore già esiste.",
"color": "colore",
"value (optional)": "descrizione (opzionale)",
@@ -213,7 +213,7 @@
"smtpBCC": "CCn",
"discord": "Discord",
"Discord Webhook URL": "URL Webhook di Discord",
"wayToGetDiscordURL": "Puoi ottenerlo andando su Impostazioni server -> Integrazioni -> Visualizza webhook -> Nuovo webhook",
"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 …",
@@ -384,7 +384,7 @@
"resendDisabled": "Reinvio disabilitato",
"Resend Notification if Down X times consequently": "Reinvia la notifica se Down X volte di seguito",
"Add New Status Page": "Aggiungi nuova pagina di stato",
"webhookAdditionalHeadersDesc": "Imposta intestazioni aggiuntive inviate con il webhook. Ogni intestazione deve essere definita come chiave/valore JSON.",
"webhookAdditionalHeadersDesc": "Imposta gli header aggiuntivi inviati nel webhook.",
"topicExplanation": "MQTT topic da controllare",
"successMessage": "Messaggio con successo",
"successMessageExplanation": "Messaggio MQTT considerato come successo",
@@ -417,196 +417,5 @@
"Affected Monitors": "Monitoraggi interessati",
"Pick Affected Monitors...": "Seleziona i monitoraggi interessati…",
"Valid": "Valido",
"Certificate Expiry Notification": "Notifica scadenza certificato",
"styleElapsedTimeShowWithLine": "Mostra (con linea)",
"webhookBodyPresetOption": "Predefinito - {0}",
"webhookBodyCustomOption": "Corpo personalizzato",
"topic": "Topic",
"selectedMonitorCount": "Selezionato: {0}",
"Check/Uncheck": "Seleziona/Deseleziona",
"Proxies": "Proxy",
"Stop": "Fermare",
"startOrEndWithOnly": "Inizia o termina solo con {0}",
"No consecutive dashes": "Nessun trattino consecutivo",
"HTTP Basic Auth": "Autenticazione di base HTTP",
"Reverse Proxy": "Proxy inverso",
"Backup": "Backup",
"About": "Di",
"wayToGetCloudflaredURL": "(Scarica cloudflared da {0})",
"cloudflareWebsite": "Sito web di Cloudflare",
"Message:": "Messaggio:",
"Don't know how to get the token? Please read the guide:": "Non sai come ottenere il token? Si prega di leggere la guida:",
"Trust Proxy": "Proxy di fiducia",
"Other Software": "Altro Software",
"For example: nginx, Apache and Traefik.": "Ad esempio: nginx, Apache e Traefik.",
"Please read": "Si prega di leggere",
"Subject:": "Soggetto:",
"Valid To:": "Valido per:",
"Days Remaining:": "Giorni rimanenti:",
"Issuer:": "Emittente",
"Fingerprint:": "Impronta digitale:",
"No status pages": "Nessuna pagina di stato",
"Domain Name Expiry Notification": "Notifica di scadenza del nome di dominio",
"Date Created": "Data di creazione",
"Slug": "Slug",
"Show Powered By": "Mostra Alimentato da",
"Domain Names": "Nomi di dominio",
"signedInDispDisabled": "Autenticazione disabilitata.",
"RadiusSecret": "Radius Segreto",
"RadiusCalledStationId": "Identificativo della stazione chiamata",
"RadiusCallingStationId": "Id stazione chiamante",
"RadiusCallingStationIdDescription": "Identificativo del dispositivo chiamante",
"API Username": "Nome utente dell'API",
"API Key": "Chiave dell'API",
"Show update if available": "Mostra aggiornamento se disponibile",
"RadiusSecretDescription": "Segreto condiviso tra client e server",
"Also check beta release": "Controlla anche la versione beta",
"Check how to config it for WebSocket": "Controlla come configurarlo per WebSocket",
"Steam Game Server": "Server di gioco Steam",
"Most likely causes:": "Cause più probabili:",
"The resource is no longer available.": "La risorsa non è più disponibile.",
"What you can try:": "Cosa puoi provare:",
"Retype the address.": "Ridigita l'indirizzo.",
"Go back to the previous page.": "Torna alla pagina precedente.",
"Coming Soon": "Prossimamente",
"Connection String": "Stringa di connessione",
"Query": "Richiesta",
"settingsCertificateExpiry": "Scadenza certificato TLS",
"deleteDockerHostMsg": "Sei sicuro di voler eliminare questo host docker per tutti i monitor?",
"tcp": "TCP / HTTP",
"Docker Container": "Contenitore Docker",
"Container Name / ID": "Nome/ID contenitore",
"Docker Host": "Host Docker",
"Docker Hosts": "Host Docker",
"Domain": "Dominio",
"Workstation": "Postazione di lavoro",
"Packet Size": "Dimensione del pacchetto",
"Setup Docker Host": "Configurare l'host Docker",
"telegramSendSilently": "Invia silenziosamente",
"telegramSendSilentlyDescription": "Invia il messaggio in silenzio. Gli utenti riceveranno una notifica senza audio.",
"telegramProtectContent": "Proteggi inoltro/salvataggio",
"disableCloudflaredNoAuthMsg": "Sei in modalità No Auth, non è richiesta una password.",
"wayToGetLineNotifyToken": "Puoi ottenere un token di accesso da {0}",
"Examples": "Esempi",
"Long-Lived Access Token": "Token di accesso di lunga durata",
"Long-Lived Access Token can be created by clicking on your profile name (bottom left) and scrolling to the bottom then click Create Token. ": "Il token di accesso di lunga durata può essere creato facendo clic sul nome del tuo profilo (in basso a sinistra) e scorrendo verso il basso, quindi fai clic su Crea token. ",
"Notification Service": "Servizio di notifica",
"default: notify all devices": "default: notifica a tutti i dispositivi",
"Automations can optionally be triggered in Home Assistant:": "Le automazioni possono essere facoltativamente attivate in Home Assistant:",
"Trigger type:": "Tipo di attivazione:",
"Event type:": "Tipo di evento:",
"Event data:": "Dati dell'evento:",
"Then choose an action, for example switch the scene to where an RGB light is red.": "Quindi scegli un'azione, ad esempio cambia la scena in cui una luce RGB è rossa.",
"Frontend Version": "Versione front-end",
"Frontend Version do not match backend version!": "La versione del frontend non corrisponde alla versione del backend!",
"backupOutdatedWarning": "Deprecato: poiché sono state aggiunte molte funzionalità e questa funzionalità di backup è un po' trascurata, non può generare o ripristinare un backup completo.",
"backupRecommend": "Eseguire invece il backup diretto del volume o della cartella dei dati (./data/).",
"Optional": "Opzionale",
"sameAsServerTimezone": "Uguale al fuso orario del server",
"startDateTime": "Data/ora di inizio",
"endDateTime": "Data/ora di fine",
"cronExpression": "Espressione Cron",
"cronSchedule": "Programma: ",
"recurringInterval": "Intervallo",
"Recurring": "Ricorrente",
"strategyManual": "Attivo/Inattivo manualmente",
"warningTimezone": "Sta usando il fuso orario del server",
"weekdayShortMon": "Lun",
"weekdayShortTue": "Mar",
"weekdayShortWed": "Mer",
"weekdayShortThu": "Gio",
"weekdayShortSat": "Sab",
"weekdayShortSun": "Dom",
"dayOfWeek": "Giorno della settimana",
"dayOfMonth": "Giorno del mese",
"lastDay": "Ultimo giorno",
"lastDay1": "Ultimo giorno del mese",
"lastDay3": "3° ultimo giorno del mese",
"lastDay4": "4° ultimo giorno del mese",
"No Maintenance": "Nessuna manutenzione",
"pauseMaintenanceMsg": "Sei sicuro di voler mettere in pausa?",
"maintenanceStatus-inactive": "Inattivo",
"maintenanceStatus-scheduled": "Programmato",
"maintenanceStatus-ended": "Conclusa",
"maintenanceStatus-unknown": "Sconosciuto",
"Display Timezone": "Mostra fuso orario",
"Server Timezone": "Fuso orario del server",
"statusPageMaintenanceEndDate": "Fine",
"IconUrl": "URL dell'icona",
"Enable DNS Cache": "Abilita la cache DNS per i monitor HTTP(s).",
"Enable": "Abilitare",
"Disable": "Disattivare",
"chromeExecutableAutoDetect": "Trovato automaticamente",
"dnsCacheDescription": "Potrebbe non funzionare in alcuni ambienti IPv6, disabilitalo in caso di problemi.",
"Single Maintenance Window": "Singola finestra di manutenzione",
"Maintenance Time Window of a Day": "Finestra temporale di manutenzione di un giorno",
"Effective Date Range": "Intervallo di date effettivo (facoltativo)",
"Schedule Maintenance": "Pianificare la manutenzione",
"Edit Maintenance": "Modifica Manutenzione",
"Date and Time": "Data e ora",
"DateTime Range": "Intervallo DataOra",
"loadingError": "Impossibile recuperare i dati, riprova più tardi.",
"plugin": "Plug-in | Plugin",
"install": "Installare",
"installing": "Installazione",
"uninstall": "Disinstalla",
"confirmUninstallPlugin": "Sei sicuro di voler disinstallare questo plugin?",
"notificationRegional": "Regionale",
"Clone": "Clone",
"cloneOf": "Clone di {0}",
"wayToGetZohoCliqURL": "Puoi scoprire come creare un URL webhook {0}.",
"dataRetentionTimeError": "Il periodo di conservazione deve essere pari o superiore a 0",
"infiniteRetention": "Impostare su 0 per la conservazione infinita.",
"enableGRPCTls": "Consenti l'invio di richieste gRPC con connessione TLS",
"grpcMethodDescription": "Il nome del metodo viene convertito nel formato cammelCase come sayHello, check, ecc.",
"styleElapsedTimeShowNoLine": "Mostra (nessuna riga)",
"Add New Tag": "Aggiungi nuova etichetta",
"webhookCustomBodyDesc": "Definire un corpo HTTP personalizzato per la richiesta. Le variabili modello {msg}, {heartbeat}, {monitor} sono accettate.",
"Select": "Selezionare",
"Accept characters:": "Accetta caratteri:",
"The slug is already taken. Please choose another slug.": "La lumaca è già slug. Scegli un'altra slug.",
"The current connection may be lost if you are currently connecting via Cloudflare Tunnel. Are you sure want to stop it? Type your current password to confirm it.": "La connessione corrente potrebbe andare persa se ti stai connettendo tramite Cloudflare Tunnel. Sei sicuro di volerlo fermare? Digita la tua password attuale per confermarla.",
"Footer Text": "Testo piè di pagina",
"signedInDisp": "Accesso eseguito come {0}",
"RadiusCalledStationIdDescription": "Identificativo del dispositivo chiamato",
"Clone Monitor": "Monitoraggio clonazione",
"styleElapsedTime": "Tempo trascorso sotto la barra del battito cardiaco",
"enableProxyDescription": "Questo proxy non avrà effetto sulle richieste di monitoraggio fino a quando non viene attivato. È possibile controllare la disabilitazione temporanea del proxy da tutti i monitor in base allo stato di attivazione.",
"Using a Reverse Proxy?": "Utilizzo di un proxy inverso?",
"There might be a typing error in the address.": "Potrebbe esserci un errore di battitura nell'indirizzo.",
"certificationExpiryDescription": "HTTPS monitora la notifica di attivazione quando il certificato TLS scade tra:",
"tailscalePingWarning": "Per utilizzare il monitor Tailscale Ping, è necessario installare Uptime Kuma senza Docker e installare anche il client Tailscale sul server.",
"telegramMessageThreadID": "(Facoltativo) ID thread messaggio",
"telegramMessageThreadIDDescription": "Facoltativo Identificatore univoco per il thread del messaggio di destinazione (argomento) del forum; solo per i supergruppi del forum",
"telegramProtectContentDescription": "Se abilitato, i messaggi del bot in Telegram saranno protetti dall'inoltro e dal salvataggio.",
"trustProxyDescription": "Fidati delle intestazioni 'X-Forwarded-*'. Se vuoi ottenere l'IP client corretto e il tuo Uptime Kuma è dietro un proxy come Nginx o Apache, dovresti abilitarlo.",
"A list of Notification Services can be found in Home Assistant under \"Developer Tools > Services\" search for \"notification\" to find your device/phone name.": "Un elenco di servizi di notifica è disponibile in Home Assistant in \"Strumenti per sviluppatori> Servizi\" cerca \"notifica\" per trovare il nome del tuo dispositivo/telefono.",
"invalidCronExpression": "Espressione Cron non valida: {0}",
"lastDay2": "2° ultimo giorno del mese",
"maintenanceStatus-under-maintenance": "In manutenzione",
"chromeExecutable": "Cromo/cromo eseguibile",
"chromeExecutableDescription": "Per gli utenti Docker, se Chromium non è ancora installato, potrebbero essere necessari alcuni minuti per l'installazione e la visualizzazione del risultato del test. Richiede 1 GB di spazio su disco.",
"uninstalling": "Disinstallazione",
"confirmDeleteTagMsg": "Sei sicuro di voler eliminare questo tag? I monitor associati a questo tag non verranno eliminati.",
"Request Timeout": "Richiedi timeout",
"timeoutAfter": "Timeout dopo {0} secondi",
"Resend Notification if Down X times consecutively": "Invia di nuovo la notifica se giù X volte consecutivamente",
"Proxy": "Proxy",
"or": "o",
"statusPageRefreshIn": "Aggiorna tra: {0}",
"HTTP Headers": "Intestazioni HTTP",
"Custom": "Personalizzato",
"Connection Type": "Tipo di connessione",
"Docker Daemon": "Deamon Docker",
"socket": "Socket",
"Home Assistant URL": "URL dell'assistente domestico",
"weekdayShortFri": "Ven",
"Home": "Accoglienza",
"Invert Keyword": "Inverti parola chiave",
"filterActive": "Attiva",
"filterActivePaused": "In pausa",
"Cannot connect to the socket server": "Impossibile connettersi al server socket",
"Reconnecting...": "Riconnessione...",
"Expected Value": "Valore atteso",
"Json Query": "Query Json"
"Certificate Expiry Notification": "Notifica scadenza certificato"
}

View File

@@ -43,7 +43,7 @@
"Delete": "Удалить",
"Current": "Текущий",
"Uptime": "Аптайм",
"Cert Exp.": "Сертификат ист.",
"Cert Exp.": "Сертификат истекает",
"day": "день | дней",
"-day": "-дней",
"hour": "час",
@@ -542,7 +542,7 @@
"Container Name / ID": "Название контейнера / ID",
"Docker Host": "Хост Docker",
"Docker Hosts": "Хосты Docker",
"ntfy Topic": "Тема ntfy",
"ntfy Topic": "тема ntfy",
"Domain": "Домен",
"Workstation": "Рабочая станция",
"disableCloudflaredNoAuthMsg": "Вы находитесь в режиме без авторизации, пароль не требуется.",
@@ -639,7 +639,7 @@
"Server Timezone": "Часовой пояс сервера",
"statusPageMaintenanceEndDate": "Конец",
"IconUrl": "URL иконки",
"Enable DNS Cache": "Включить DNS кэш для мониторов HTTP(S)",
"Enable DNS Cache": "Включить DNS кэш",
"Enable": "Включить",
"Disable": "Отключить",
"Single Maintenance Window": "Единое окно техбслуживания",
@@ -825,27 +825,5 @@
"filterActive": "Активный",
"filterActivePaused": "На паузе",
"Invert Keyword": "Инвертировать ключевое слово",
"tailscalePingWarning": "Для того чтобы использовать монитор Tailscale Ping, необходимо установить Uptime Kuma без Docker, а также установить на сервер клиент Tailscale.",
"PushDeer Server": "Сервер PushDeer",
"pushDeerServerDescription": "Оставьте пустым для использования официального сервера",
"showCertificateExpiry": "Показывать истекающий сертификат",
"Request Timeout": "Тайм-Аут запроса",
"timeoutAfter": "Тайм-Аут через {0} секунд",
"Select": "Выбрать",
"selectedMonitorCount": "Выбрано: {0}",
"Check/Uncheck": "Отметить/Снять",
"gamedigGuessPort": "Gamedig: Угадай порт",
"styleElapsedTime": "Прошедшее время под полосой частоты опроса",
"noOrBadCertificate": "Отсутствие сертификата",
"gamedigGuessPortDescription": "Порт, используемый протоколом Valve Server Query Protocol, может отличаться от порта клиента. Попробуйте это сделать, если монитор не может подключиться к серверу.",
"nostrSender": "Закрытый ключ отправителя (nsec)",
"wayToGetFlashDutyKey": "Вы можете перейти на страницу \"Канал\" -> (Выберите канал) -> \"Интеграции\" -> \"Добавить новую страницу интеграции\", добавить \"Пользовательское событие\", чтобы получить push-адрес, скопировать ключ интеграции в адрес. Для получения дополнительной информации, пожалуйста, посетите",
"styleElapsedTimeShowNoLine": "Показать (Без линии)",
"styleElapsedTimeShowWithLine": "Показать (С линией)",
"Server URL should not contain the nfty topic": "URL сервера не должен содержать тему nfty",
"nostrRecipients": "Открытые ключи получателей (npub)",
"nostrRecipientsHelp": "формат npub, по одному в строке",
"FlashDuty Severity": "Серьёзность",
"nostrRelays": "Реле Nostr",
"nostrRelaysHelp": "Один URL-адрес ретрансляции в каждой строке"
"tailscalePingWarning": "Для того чтобы использовать монитор Tailscale Ping, необходимо установить Uptime Kuma без Docker, а также установить на сервер клиент Tailscale."
}

View File

@@ -833,10 +833,5 @@
"Check/Uncheck": "İşaretle/İşareti Kaldır",
"pushDeerServerDescription": "Resmi sunucuyu kullanmak için boş bırakın",
"Request Timeout": "İstek zaman aşımına uğradı",
"timeoutAfter": "{0} saniye sonra zaman aşımı",
"gamedigGuessPort": "Gamedig: Ziyaretçi Portu",
"gamedigGuessPortDescription": "Valve Server Sorgu Protokolü tarafından kullanılan bağlantı noktası, istemci bağlantı noktasından farklı olabilir. Monitör sunucunuza bağlanamıyorsa bunu deneyin.",
"styleElapsedTimeShowNoLine": "Göster (Satır Yok)",
"styleElapsedTime": "Kalp atışı çubuğunun altında geçen süre",
"styleElapsedTimeShowWithLine": "Göster (Satır ile birlikte)"
"timeoutAfter": "{0} saniye sonra zaman aşımı"
}

View File

@@ -835,10 +835,5 @@
"pushDeerServerDescription": "留空则使用官方服务器",
"PushDeer Server": "PushDeer 服务器",
"timeoutAfter": "{0} 秒后超时",
"Request Timeout": "请求超时",
"gamedigGuessPortDescription": "Valve 服务器查询协议使用的端口可能与客户端端口不同。如果监控器无法连接到服务器,请尝试此方法。",
"gamedigGuessPort": "Gamedig: 自动检测端口号",
"styleElapsedTimeShowWithLine": "显示(带连接线)",
"styleElapsedTimeShowNoLine": "显示(不带连接线)",
"styleElapsedTime": "在监控项详情的心跳栏下显示起止时间"
"Request Timeout": "请求超时"
}

View File

@@ -23,17 +23,17 @@
</div>
<div class="form-floating mt-3">
<input id="floatingInput" v-model="username" type="text" class="form-control" :placeholder="$t('Username')" required data-cy="username-input">
<input id="floatingInput" v-model="username" type="text" class="form-control" placeholder="Username" required data-cy="username-input">
<label for="floatingInput">{{ $t("Username") }}</label>
</div>
<div class="form-floating mt-3">
<input id="floatingPassword" v-model="password" type="password" class="form-control" :placeholder="$t('Password')" required data-cy="password-input">
<input id="floatingPassword" v-model="password" type="password" class="form-control" placeholder="Password" required data-cy="password-input">
<label for="floatingPassword">{{ $t("Password") }}</label>
</div>
<div class="form-floating mt-3">
<input id="repeat" v-model="repeatPassword" type="password" class="form-control" :placeholder="$t('Repeat Password')" required data-cy="password-repeat-input">
<input id="repeat" v-model="repeatPassword" type="password" class="form-control" placeholder="Repeat Password" required data-cy="password-repeat-input">
<label for="repeat">{{ $t("Repeat Password") }}</label>
</div>