+
diff --git a/src/components/notifications/index.js b/src/components/notifications/index.js
index 0c220b7174..86dad13e7f 100644
--- a/src/components/notifications/index.js
+++ b/src/components/notifications/index.js
@@ -42,6 +42,7 @@ import Telegram from "./Telegram.vue";
import Webhook from "./Webhook.vue";
import WeCom from "./WeCom.vue";
import GoAlert from "./GoAlert.vue";
+import ZohoCliq from "./ZohoCliq.vue";
/**
* Manage all notification form.
@@ -93,6 +94,7 @@ const NotificationFormList = {
"WeCom": WeCom,
"GoAlert": GoAlert,
"ServerChan": ServerChan,
+ "ZohoCliq": ZohoCliq
};
export default NotificationFormList;
diff --git a/src/languages/el-GR.js b/src/languages/el-GR.js
index c520a6079b..9b7c4cfb35 100644
--- a/src/languages/el-GR.js
+++ b/src/languages/el-GR.js
@@ -194,6 +194,7 @@ export default {
here: "εδώ",
Required: "Απαιτείται",
telegram: "Telegram",
+ "ZohoCliq": "ZohoCliq",
"Bot Token": "Διακριτικό Bot",
wayToGetTelegramToken: "Μπορείτε να πάρετε ένα διακριτικό από {0}.",
"Chat ID": "Chat ID",
@@ -224,6 +225,7 @@ export default {
teams: "Microsoft Teams",
"Webhook URL": "Webhook URL",
wayToGetTeamsURL: "Μπορείτε να μάθετε πώς να δημιουργείτε μια διεύθυνση URL webhook {0}.",
+ wayToGetZohoCliqURL: "Μπορείτε να μάθετε πώς να δημιουργείτε μια διεύθυνση URL webhook {0}.",
signal: "Signal",
Number: "Αριθμός",
Recipients: "Αποδέκτες",
diff --git a/src/languages/en.js b/src/languages/en.js
index e7de9648b7..106edf0e8a 100644
--- a/src/languages/en.js
+++ b/src/languages/en.js
@@ -209,6 +209,7 @@ export default {
here: "here",
Required: "Required",
telegram: "Telegram",
+ "ZohoCliq": "ZohoCliq",
"Bot Token": "Bot Token",
wayToGetTelegramToken: "You can get a token from {0}.",
"Chat ID": "Chat ID",
@@ -241,6 +242,7 @@ export default {
teams: "Microsoft Teams",
"Webhook URL": "Webhook URL",
wayToGetTeamsURL: "You can learn how to create a webhook URL {0}.",
+ wayToGetZohoCliqURL: "You can learn how to create a webhook URL {0}.",
signal: "Signal",
Number: "Number",
Recipients: "Recipients",
diff --git a/src/languages/eu.js b/src/languages/eu.js
index c99f1eb70d..a491c87285 100644
--- a/src/languages/eu.js
+++ b/src/languages/eu.js
@@ -191,6 +191,7 @@ export default {
here: "Hemen",
Required: "Beharrezkoa",
telegram: "Telegram",
+ "ZohoCliq": "ZohoCliq",
"Bot Token": "Bot Tokena",
wayToGetTelegramToken: "You can get a token from {0}.",
"Chat ID": "Txat IDa",
@@ -221,6 +222,7 @@ export default {
teams: "Microsoft Teams",
"Webhook URL": "Webhook URL",
wayToGetTeamsURL: "You can learn how to create a webhook URL {0}.",
+ wayToGetZohoCliqURL: "You can learn how to create a webhook URL {0}.",
signal: "Signal",
Number: "Zenbakia",
Recipients: "Recipients",
From 68bc7ac421baf0234ccf51059108dfb3d88cd943 Mon Sep 17 00:00:00 2001
From: panos
Date: Thu, 8 Dec 2022 13:41:05 +0200
Subject: [PATCH 0038/1864] zoho cliq code style
---
server/notification-providers/zoho-cliq.js | 36 ++++++++++------------
1 file changed, 16 insertions(+), 20 deletions(-)
diff --git a/server/notification-providers/zoho-cliq.js b/server/notification-providers/zoho-cliq.js
index d944089d4c..61fc68becb 100644
--- a/server/notification-providers/zoho-cliq.js
+++ b/server/notification-providers/zoho-cliq.js
@@ -43,8 +43,7 @@ class ZohoCliq extends NotificationProvider {
monitorMessage,
monitorName,
monitorUrl,
- }) => {
-
+ }) => {
const payload = ["### Uptime Kuma\n"];
payload.push(this._statusMessageFactory(status, monitorName));
payload.push(`*Description:* ${monitorMessage}`);
@@ -74,23 +73,6 @@ class ZohoCliq extends NotificationProvider {
return this._sendNotification(webhookUrl, payload);
};
- _monitorUrlFactory = (monitorJSON) => {
- let url;
- switch(monitorJSON["type"]) {
- case "http":
- case "keywork":
- url = monitorJSON["url"];
- break;
- case "docker":
- url = monitorJSON["docker_host"];
- break;
- default:
- url = monitorJSON["hostname"];
- break;
- }
- return url;
- };
-
async send(notification, msg, monitorJSON = null, heartbeatJSON = null) {
let okMsg = "Sent Successfully.";
@@ -100,10 +82,24 @@ class ZohoCliq extends NotificationProvider {
return okMsg;
}
+ let url;
+ switch(monitorJSON["type"]) {
+ case "http":
+ case "keywork":
+ url = monitorJSON["url"];
+ break;
+ case "docker":
+ url = monitorJSON["docker_host"];
+ break;
+ default:
+ url = monitorJSON["hostname"];
+ break;
+ }
+
const payload = this._notificationPayloadFactory({
monitorMessage: heartbeatJSON.msg,
monitorName: monitorJSON.name,
- monitorUrl: this._monitorUrlFactory(monitorJSON),
+ monitorUrl: url,
status: heartbeatJSON.status,
});
From 851a04b08215020c1c2d21418189f17c80b5ce44 Mon Sep 17 00:00:00 2001
From: panos
Date: Thu, 8 Dec 2022 13:53:02 +0200
Subject: [PATCH 0039/1864] zoho cliq code style
---
server/notification-providers/zoho-cliq.js | 9 +++++----
1 file changed, 5 insertions(+), 4 deletions(-)
diff --git a/server/notification-providers/zoho-cliq.js b/server/notification-providers/zoho-cliq.js
index 61fc68becb..b7885be425 100644
--- a/server/notification-providers/zoho-cliq.js
+++ b/server/notification-providers/zoho-cliq.js
@@ -1,6 +1,6 @@
const NotificationProvider = require("./notification-provider");
const axios = require("axios");
-const {DOWN, UP} = require("../../src/util");
+const { DOWN, UP } = require("../../src/util");
class ZohoCliq extends NotificationProvider {
@@ -44,7 +44,8 @@ class ZohoCliq extends NotificationProvider {
monitorName,
monitorUrl,
}) => {
- const payload = ["### Uptime Kuma\n"];
+ const payload = [];
+ payload.push("### Uptime Kuma\n");
payload.push(this._statusMessageFactory(status, monitorName));
payload.push(`*Description:* ${monitorMessage}`);
@@ -83,7 +84,7 @@ class ZohoCliq extends NotificationProvider {
}
let url;
- switch(monitorJSON["type"]) {
+ switch (monitorJSON["type"]) {
case "http":
case "keywork":
url = monitorJSON["url"];
@@ -100,7 +101,7 @@ class ZohoCliq extends NotificationProvider {
monitorMessage: heartbeatJSON.msg,
monitorName: monitorJSON.name,
monitorUrl: url,
- status: heartbeatJSON.status,
+ status: heartbeatJSON.status
});
await this._sendNotification(notification.webhookUrl, payload);
From 9da28fbbc75b16b0d90dd013057666b20be641c9 Mon Sep 17 00:00:00 2001
From: panos
Date: Thu, 8 Dec 2022 13:56:02 +0200
Subject: [PATCH 0040/1864] zoho cliq code style
---
server/notification-providers/zoho-cliq.js | 14 +++++++-------
1 file changed, 7 insertions(+), 7 deletions(-)
diff --git a/server/notification-providers/zoho-cliq.js b/server/notification-providers/zoho-cliq.js
index b7885be425..749647d066 100644
--- a/server/notification-providers/zoho-cliq.js
+++ b/server/notification-providers/zoho-cliq.js
@@ -26,8 +26,8 @@ class ZohoCliq extends NotificationProvider {
* @param {string} webhookUrl URL to send the request to
* @param {Array} payload Payload generated by _notificationPayloadFactory
*/
- _sendNotification = async(webhookUrl, payload) => {
- await axios.post(webhookUrl, {text: payload.join("\n")});
+ _sendNotification = async (webhookUrl, payload) => {
+ await axios.post(webhookUrl, { text: payload.join("\n") });
};
/**
@@ -39,10 +39,10 @@ class ZohoCliq extends NotificationProvider {
* @returns {Array}
*/
_notificationPayloadFactory = ({
- status,
- monitorMessage,
- monitorName,
- monitorUrl,
+ status,
+ monitorMessage,
+ monitorName,
+ monitorUrl,
}) => {
const payload = [];
payload.push("### Uptime Kuma\n");
@@ -107,7 +107,7 @@ class ZohoCliq extends NotificationProvider {
await this._sendNotification(notification.webhookUrl, payload);
return okMsg;
- } catch(error) {
+ } catch (error) {
this.throwGeneralAxiosError(error);
}
}
From 3ea67110538a60ed0cd316a38e4ec9bf5efa93ae Mon Sep 17 00:00:00 2001
From: Joppe Koers
Date: Thu, 15 Dec 2022 23:03:06 +0100
Subject: [PATCH 0041/1864] Remove docker compose again
---
README.md | 14 --------------
1 file changed, 14 deletions(-)
diff --git a/README.md b/README.md
index 6d10cf2a86..90c8ad75b6 100644
--- a/README.md
+++ b/README.md
@@ -42,20 +42,6 @@ It is a temporary live demo, all data will be deleted after 10 minutes. Use the
docker run -d --restart=always -p 3001:3001 -v uptime-kuma:/app/data --name uptime-kuma louislam/uptime-kuma:1
```
-### 🐳 Docker Compose
-```yaml
-version: "3"
-
-services:
- uptime-kuma:
- image: louislam/uptime-kuma:1
- restart: always
- ports:
- - "3001:3001"
- volumes:
- - uptime-kuma:/app/data
-```
-
⚠️ Please use a **local volume** only. Other types such as NFS are not supported.
Kuma is now running on http://localhost:3001
From c79b2913a2a36f24c9069294661b5bc4f31b6c0d Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Mathias=20Haugsb=C3=B8?=
Date: Sun, 18 Dec 2022 17:16:19 +0100
Subject: [PATCH 0042/1864] Auth: Case insensitive login check on username
Allows users to add users with capital letters and then login with just lowercase letters.
We accidentally capitalized the first letter of our username so the other people using it frequently thinks they wrote the wrong password.
---
server/auth.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/server/auth.js b/server/auth.js
index 3ce1a60415..9bb9dd01d7 100644
--- a/server/auth.js
+++ b/server/auth.js
@@ -15,7 +15,7 @@ exports.login = async function (username, password) {
return null;
}
- let user = await R.findOne("user", " username = ? AND active = 1 ", [
+ let user = await R.findOne("user", " username LIKE ? AND active = 1 ", [
username,
]);
From b3ac7c3d433568cd9737e1cb563efd9d19a073d2 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Mathias=20Haugsb=C3=B8?=
Date: Mon, 19 Dec 2022 12:18:33 +0100
Subject: [PATCH 0043/1864] Username case insensitive, patch db instead of
using LIKE
---
db/patch-user-username-case-insensitive.sql | 47 +++++++++++++++++++++
server/auth.js | 2 +-
server/database.js | 1 +
3 files changed, 49 insertions(+), 1 deletion(-)
create mode 100644 db/patch-user-username-case-insensitive.sql
diff --git a/db/patch-user-username-case-insensitive.sql b/db/patch-user-username-case-insensitive.sql
new file mode 100644
index 0000000000..90b7f1cb26
--- /dev/null
+++ b/db/patch-user-username-case-insensitive.sql
@@ -0,0 +1,47 @@
+CREATE TABLE [temp_user](
+ [id] INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
+ [username] VARCHAR(255) NOT NULL UNIQUE COLLATE NOCASE,
+ [password] VARCHAR(255),
+ [active] BOOLEAN NOT NULL DEFAULT 1,
+ [timezone] VARCHAR(150),
+ twofa_secret VARCHAR(64),
+ twofa_status BOOLEAN default 0 NOT NULL,
+ twofa_last_token VARCHAR(6)
+);
+
+INSERT INTO [temp_user] SELECT
+[id],
+[username],
+[password],
+[active],
+[timezone],
+twofa_secret,
+twofa_status,
+twofa_last_token
+ FROM user;
+
+DROP TABLE user;
+
+CREATE TABLE [user](
+ [id] INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
+ [username] VARCHAR(255) NOT NULL UNIQUE COLLATE NOCASE,
+ [password] VARCHAR(255),
+ [active] BOOLEAN NOT NULL DEFAULT 1,
+ [timezone] VARCHAR(150),
+ twofa_secret VARCHAR(64),
+ twofa_status BOOLEAN default 0 NOT NULL,
+ twofa_last_token VARCHAR(6)
+);
+
+INSERT INTO [user] SELECT
+[id],
+[username],
+[password],
+[active],
+[timezone],
+twofa_secret,
+twofa_status,
+twofa_last_token
+ FROM [temp_user];
+
+DROP TABLE [temp_user];
diff --git a/server/auth.js b/server/auth.js
index 9bb9dd01d7..b4eeee41fa 100644
--- a/server/auth.js
+++ b/server/auth.js
@@ -15,7 +15,7 @@ exports.login = async function (username, password) {
return null;
}
- let user = await R.findOne("user", " username LIKE ? AND active = 1 ", [
+ let user = await R.findOne("user", " username = ? AND active = 1", [
username,
]);
diff --git a/server/database.js b/server/database.js
index 2544f19729..7764df3f61 100644
--- a/server/database.js
+++ b/server/database.js
@@ -66,6 +66,7 @@ class Database {
"patch-add-radius-monitor.sql": true,
"patch-monitor-add-resend-interval.sql": true,
"patch-maintenance-table2.sql": true,
+ "patch-user-username-case-insensitive.sql": { parents: [ "patch-2fa-invalidate-used-token.sql", "patch-2fa.sql" ] }
};
/**
From a4de93f9763603dcb3e375e15db421e1bd9d3957 Mon Sep 17 00:00:00 2001
From: Louis Lam
Date: Fri, 23 Dec 2022 22:43:56 +0800
Subject: [PATCH 0044/1864] WIP
---
docker/dockerfile | 3 ++
docker/my.cnf | 0
server/database.js | 66 +++++++++++++++++++++++++++-----------
server/embedded-mariadb.js | 51 +++++++++++++++++++++++++++++
4 files changed, 102 insertions(+), 18 deletions(-)
create mode 100644 docker/my.cnf
create mode 100644 server/embedded-mariadb.js
diff --git a/docker/dockerfile b/docker/dockerfile
index 3cb27b50bb..acba709e4b 100644
--- a/docker/dockerfile
+++ b/docker/dockerfile
@@ -48,7 +48,10 @@ CMD ["node", "server/server.js"]
############################################
FROM release-slim AS release
RUN apt update && \
+ apt --yes --no-install-recommends install curl && \
+ curl -LsS https://r.mariadb.com/downloads/mariadb_repo_setup | bash -s -- --mariadb-server-version="mariadb-10.11" && \
apt --yes --no-install-recommends install mariadb-server && \
+ apt remove curl && \
rm -rf /var/lib/apt/lists/* && \
apt --yes autoremove
diff --git a/docker/my.cnf b/docker/my.cnf
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/server/database.js b/server/database.js
index 2544f19729..9bf94f9b34 100644
--- a/server/database.js
+++ b/server/database.js
@@ -4,6 +4,7 @@ const { setSetting, setting } = require("./util-server");
const { log, sleep } = require("../src/util");
const dayjs = require("dayjs");
const knex = require("knex");
+const path = require("path");
/**
* Database & App Data Folder
@@ -109,24 +110,53 @@ class Database {
static async connect(testMode = false, autoloadModels = true, noLog = false) {
const acquireConnectionTimeout = 120 * 1000;
- const Dialect = require("knex/lib/dialects/sqlite3/index.js");
- Dialect.prototype._driver = () => require("@louislam/sqlite3");
-
- const knexInstance = knex({
- client: Dialect,
- connection: {
- filename: Database.path,
- acquireConnectionTimeout: acquireConnectionTimeout,
- },
- useNullAsDefault: true,
- pool: {
- min: 1,
- max: 1,
- idleTimeoutMillis: 120 * 1000,
- propagateCreateError: false,
- acquireTimeoutMillis: acquireConnectionTimeout,
- }
- });
+ let dbConfig;
+
+ try {
+ dbConfig = fs.readFileSync(path.join(Database.dataDir, "db-config.json"));
+ } catch (_) {
+ dbConfig = {
+ type: "sqlite",
+ };
+ }
+
+ let config = {};
+
+ if (dbConfig.type === "sqlite") {
+ const Dialect = require("knex/lib/dialects/sqlite3/index.js");
+ Dialect.prototype._driver = () => require("@louislam/sqlite3");
+
+ config = {
+ client: Dialect,
+ connection: {
+ filename: Database.path,
+ acquireConnectionTimeout: acquireConnectionTimeout,
+ },
+ useNullAsDefault: true,
+ pool: {
+ min: 1,
+ max: 1,
+ idleTimeoutMillis: 120 * 1000,
+ propagateCreateError: false,
+ acquireTimeoutMillis: acquireConnectionTimeout,
+ }
+ };
+ } else if (dbConfig === "embedded-mariadb") {
+ config = {
+ client: "mysql",
+ connection: {
+ host: "127.0.0.1",
+ port: 3306,
+ user: "your_database_user",
+ password: "your_database_password",
+ database: "kuma"
+ }
+ };
+ } else {
+ throw new Error("Unknown Database type");
+ }
+
+ const knexInstance = knex(config);
R.setup(knexInstance);
diff --git a/server/embedded-mariadb.js b/server/embedded-mariadb.js
new file mode 100644
index 0000000000..eef789207b
--- /dev/null
+++ b/server/embedded-mariadb.js
@@ -0,0 +1,51 @@
+const { log } = require("../src/util");
+const childProcess = require("child_process");
+
+class EmbeddedMariaDB {
+
+ static childProcess = null;
+ static running = false;
+
+ static init() {
+
+ }
+
+ static start() {
+ if (this.childProcess) {
+ log.log("mariadb", "Already started");
+ return;
+ }
+
+ this.running = true;
+ this.emitChange("Starting cloudflared");
+ this.childProcess = childProcess.spawn(this.cloudflaredPath, args);
+ this.childProcess.stdout.pipe(process.stdout);
+ this.childProcess.stderr.pipe(process.stderr);
+
+ this.childProcess.on("close", (code) => {
+ this.running = false;
+ this.childProcess = null;
+ this.emitChange("Stopped cloudflared", code);
+ });
+
+ this.childProcess.on("error", (err) => {
+ if (err.code === "ENOENT") {
+ this.emitError(`Cloudflared error: ${this.cloudflaredPath} is not found`);
+ } else {
+ this.emitError(err);
+ }
+ });
+
+ this.childProcess.stderr.on("data", (data) => {
+ this.emitError(data.toString());
+ });
+ }
+
+ static stop() {
+ if (this.childProcess) {
+ this.childProcess.kill("SIGINT");
+ this.childProcess = null;
+ }
+ }
+
+}
From 9e9c5cd1d2183e9bdf644285454dfdf8ca193e3b Mon Sep 17 00:00:00 2001
From: Augustin
Date: Sat, 24 Dec 2022 19:41:55 +0100
Subject: [PATCH 0045/1864] (fr) Fix typo
---
src/languages/fr-FR.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/languages/fr-FR.js b/src/languages/fr-FR.js
index e3c2d133dc..ab7a0ca6fe 100644
--- a/src/languages/fr-FR.js
+++ b/src/languages/fr-FR.js
@@ -186,7 +186,7 @@ export default {
startOrEndWithOnly: "Commence uniquement par {0}",
"No consecutive dashes": "Pas de double tirets",
Next: "Continuer",
- "Setup Proxy": "Configuer Proxy",
+ "Setup Proxy": "Configurer Proxy",
defaultNotificationName: "Ma notification {notification} numéro ({number})",
here: "ici",
Required: "Requis",
From 1b6c587cc9eb34ec9638b81da7d9d29f9f1a4e9b Mon Sep 17 00:00:00 2001
From: Louis Lam
Date: Mon, 26 Dec 2022 14:46:12 +0800
Subject: [PATCH 0046/1864] Fix #2472
---
src/util.js | 8 +++++++-
src/util.ts | 7 ++++++-
2 files changed, 13 insertions(+), 2 deletions(-)
diff --git a/src/util.js b/src/util.js
index f157e9e92b..09e6d0ee7a 100644
--- a/src/util.js
+++ b/src/util.js
@@ -106,7 +106,13 @@ class Logger {
}
module = module.toUpperCase();
level = level.toUpperCase();
- const now = dayjs.tz(new Date()).format();
+ let now;
+ if (dayjs.tz) {
+ now = dayjs.tz(new Date()).format();
+ }
+ else {
+ now = dayjs().format();
+ }
const formattedMessage = (typeof msg === "string") ? `${now} [${module}] ${level}: ${msg}` : msg;
if (level === "INFO") {
console.info(formattedMessage);
diff --git a/src/util.ts b/src/util.ts
index 6d3aabeb6b..99038c8d3f 100644
--- a/src/util.ts
+++ b/src/util.ts
@@ -122,7 +122,12 @@ class Logger {
module = module.toUpperCase();
level = level.toUpperCase();
- const now = dayjs.tz(new Date()).format();
+ let now;
+ if (dayjs.tz) {
+ now = dayjs.tz(new Date()).format();
+ } else {
+ now = dayjs().format();
+ }
const formattedMessage = (typeof msg === "string") ? `${now} [${module}] ${level}: ${msg}` : msg;
if (level === "INFO") {
From e12225e59548bc60827b39d1da01516ffbdaa057 Mon Sep 17 00:00:00 2001
From: Louis Lam
Date: Mon, 26 Dec 2022 21:00:46 +0800
Subject: [PATCH 0047/1864] Fix #2475 #2468 #2455, add Accept-Encoding only if
encountered the abort error
---
server/model/monitor.js | 53 ++++++++++++++++++++++++++++-------------
1 file changed, 36 insertions(+), 17 deletions(-)
diff --git a/server/model/monitor.js b/server/model/monitor.js
index 81052777f7..186962b08d 100644
--- a/server/model/monitor.js
+++ b/server/model/monitor.js
@@ -275,9 +275,6 @@ class Monitor extends BeanModel {
...(this.body ? { data: JSON.parse(this.body) } : {}),
timeout: this.interval * 1000 * 0.8,
headers: {
- // Fix #2253
- // Read more: https://stackoverflow.com/questions/1759956/curl-error-18-transfer-closed-with-outstanding-read-data-remaining
- "Accept-Encoding": "gzip, deflate",
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9",
"User-Agent": "Uptime-Kuma/" + version,
...(this.headers ? JSON.parse(this.headers) : {}),
@@ -310,20 +307,8 @@ class Monitor extends BeanModel {
log.debug("monitor", `[${this.name}] Axios Options: ${JSON.stringify(options)}`);
log.debug("monitor", `[${this.name}] Axios Request`);
- let res;
- if (this.auth_method === "ntlm") {
- options.httpsAgent.keepAlive = true;
-
- res = await httpNtlm(options, {
- username: this.basic_auth_user,
- password: this.basic_auth_pass,
- domain: this.authDomain,
- workstation: this.authWorkstation ? this.authWorkstation : undefined
- });
-
- } else {
- res = await axios.request(options);
- }
+ // Make Request
+ let res = await this.makeAxiosRequest(options);
bean.msg = `${res.status} - ${res.statusText}`;
bean.ping = dayjs().valueOf() - startTime;
@@ -761,6 +746,40 @@ class Monitor extends BeanModel {
}
}
+ async makeAxiosRequest(options, finalCall = false) {
+ try {
+ let res;
+ if (this.auth_method === "ntlm") {
+ options.httpsAgent.keepAlive = true;
+
+ res = await httpNtlm(options, {
+ username: this.basic_auth_user,
+ password: this.basic_auth_pass,
+ domain: this.authDomain,
+ workstation: this.authWorkstation ? this.authWorkstation : undefined
+ });
+
+ } else {
+ res = await axios.request(options);
+ }
+
+ return res;
+ } catch (e) {
+ // Fix #2253
+ // Read more: https://stackoverflow.com/questions/1759956/curl-error-18-transfer-closed-with-outstanding-read-data-remaining
+ if (!finalCall && typeof e.message === "string" && e.message.includes("maxContentLength size of -1 exceeded")) {
+ log.debug("monitor", "makeAxiosRequest with gzip");
+ options.headers["Accept-Encoding"] = "gzip, deflate";
+ return this.makeAxiosRequest(options, true);
+ } else {
+ if (typeof e.message === "string" && e.message.includes("maxContentLength size of -1 exceeded")) {
+ e.message = "response timeout: incomplete response within a interval";
+ }
+ throw e;
+ }
+ }
+ }
+
/** Stop monitor */
stop() {
clearTimeout(this.heartbeatInterval);
From 056d957c1ee929cbf5716e6cfd796cf041942a62 Mon Sep 17 00:00:00 2001
From: Louis Lam
Date: Mon, 26 Dec 2022 23:49:20 +0800
Subject: [PATCH 0048/1864] Update to 1.19.1
---
package.json | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/package.json b/package.json
index 98ec7cc4f1..fbc7e2a2e3 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "uptime-kuma",
- "version": "1.19.0",
+ "version": "1.19.1",
"license": "MIT",
"repository": {
"type": "git",
@@ -38,7 +38,7 @@
"build-docker-nightly-amd64": "docker buildx build -f docker/dockerfile --platform linux/amd64 -t louislam/uptime-kuma:nightly-amd64 --target nightly . --push --progress plain",
"build-docker-pr-test": "docker buildx build -f docker/dockerfile --platform linux/amd64,linux/arm64 -t louislam/uptime-kuma:pr-test --target pr-test . --push",
"upload-artifacts": "docker buildx build -f docker/dockerfile --platform linux/amd64 -t louislam/uptime-kuma:upload-artifact --build-arg VERSION --build-arg GITHUB_TOKEN --target upload-artifact . --progress plain",
- "setup": "git checkout 1.19.0 && npm ci --production && npm run download-dist",
+ "setup": "git checkout 1.19.1 && npm ci --production && npm run download-dist",
"download-dist": "node extra/download-dist.js",
"mark-as-nightly": "node extra/mark-as-nightly.js",
"reset-password": "node extra/reset-password.js",
From 06852bbf0dc024bad7bccac7b665e0fa2e9bb037 Mon Sep 17 00:00:00 2001
From: Louis Lam
Date: Tue, 27 Dec 2022 00:22:09 +0800
Subject: [PATCH 0049/1864] Fix the UI broken after removed a monitor
---
src/mixins/socket.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/mixins/socket.js b/src/mixins/socket.js
index 7e3be52c2f..378af06a50 100644
--- a/src/mixins/socket.js
+++ b/src/mixins/socket.js
@@ -590,7 +590,7 @@ export default {
for (let monitorID in this.lastHeartbeatList) {
let lastHeartBeat = this.lastHeartbeatList[monitorID];
- if (this.monitorList[monitorID].maintenance) {
+ if (this.monitorList[monitorID] && this.monitorList[monitorID].maintenance) {
result[monitorID] = {
text: this.$t("statusMaintenance"),
color: "maintenance",
From aec80b53d53454a103490f91ef469e975062a24c Mon Sep 17 00:00:00 2001
From: Louis Lam
Date: Tue, 27 Dec 2022 00:22:52 +0800
Subject: [PATCH 0050/1864] Update to 1.19.2
---
package.json | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/package.json b/package.json
index fbc7e2a2e3..18ae4770fa 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "uptime-kuma",
- "version": "1.19.1",
+ "version": "1.19.2",
"license": "MIT",
"repository": {
"type": "git",
@@ -38,7 +38,7 @@
"build-docker-nightly-amd64": "docker buildx build -f docker/dockerfile --platform linux/amd64 -t louislam/uptime-kuma:nightly-amd64 --target nightly . --push --progress plain",
"build-docker-pr-test": "docker buildx build -f docker/dockerfile --platform linux/amd64,linux/arm64 -t louislam/uptime-kuma:pr-test --target pr-test . --push",
"upload-artifacts": "docker buildx build -f docker/dockerfile --platform linux/amd64 -t louislam/uptime-kuma:upload-artifact --build-arg VERSION --build-arg GITHUB_TOKEN --target upload-artifact . --progress plain",
- "setup": "git checkout 1.19.1 && npm ci --production && npm run download-dist",
+ "setup": "git checkout 1.19.2 && npm ci --production && npm run download-dist",
"download-dist": "node extra/download-dist.js",
"mark-as-nightly": "node extra/mark-as-nightly.js",
"reset-password": "node extra/reset-password.js",
From 625fd7c2aabc7be7b2082720eb9127fdc8498c26 Mon Sep 17 00:00:00 2001
From: DimitriDR
Date: Tue, 27 Dec 2022 01:02:43 +0100
Subject: [PATCH 0051/1864] Huge improvement for French localization.
---
src/languages/fr-FR.js | 614 ++++++++++++++++++++++-------------------
1 file changed, 333 insertions(+), 281 deletions(-)
diff --git a/src/languages/fr-FR.js b/src/languages/fr-FR.js
index ab7a0ca6fe..5ad04bfee6 100644
--- a/src/languages/fr-FR.js
+++ b/src/languages/fr-FR.js
@@ -1,31 +1,49 @@
export default {
languageName: "Français",
checkEverySecond: "Vérifier toutes les {0} secondes",
- retryCheckEverySecond: "Réessayer toutes les {0} secondes.",
- retriesDescription: "Nombre d'essais avant que le service soit déclaré hors-ligne.",
+ retryCheckEverySecond: "Réessayer toutes les {0} secondes",
+ resendEveryXTimes: "Renvoyez toutes les {0} fois",
+ resendDisabled: "Renvoi désactivé",
+ retriesDescription: "Nombre d'essais avant que le service ne soit déclaré hors ligne et qu'une notification soit envoyée.",
ignoreTLSError: "Ignorer les erreurs liées au certificat SSL/TLS",
- upsideDownModeDescription: "Si le service est en ligne, il sera alors noté hors-ligne et vice-versa.",
- maxRedirectDescription: "Nombre maximal de redirections avant que le service soit noté hors-ligne.",
- acceptedStatusCodesDescription: "Codes HTTP considérés comme en ligne",
+ upsideDownModeDescription: "Si le service est en ligne, il sera alors noté hors ligne et vice-versa.",
+ maxRedirectDescription: "Nombre maximal de redirections avant que le service ne soit marqué comme hors ligne.",
+ enableGRPCTls: "Autoriser l'envoi d'une requête gRPC avec une connexion TLS",
+ grpcMethodDescription: "Le nom de la méthode est converti au format CamelCase tel que sayHello, check, etc.",
+ acceptedStatusCodesDescription: "Codes HTTP qui considèrent le service comme étant disponible.",
+ Maintenance: "Maintenance",
+ statusMaintenance: "Maintenance",
+ "Schedule maintenance": "Planifier la maintenance",
+ "Affected Monitors": "Sondes concernées",
+ "Pick Affected Monitors...": "Sélectionner les sondes concernées...",
+ "Start of maintenance": "Début de la maintenance",
+ "All Status Pages": "Toutes les pages d'état",
+ "Select status pages...": "Sélectionner les pages d'état...",
+ recurringIntervalMessage: "Exécuter une fois par jour | Exécuter une fois tous les {0} jours",
+ affectedMonitorsDescription: "Sélectionnez les sondes concernées par la maintenance en cours",
+ affectedStatusPages: "Afficher ce message de maintenance sur les pages d'état sélectionnées",
+ atLeastOneMonitor: "Sélectionnez au moins une sonde concernée",
passwordNotMatchMsg: "Les mots de passe ne correspondent pas",
notificationDescription: "Une fois ajoutée, vous devez l'activer manuellement dans les paramètres de vos hôtes.",
keywordDescription: "Le mot clé sera recherché dans la réponse HTML/JSON reçue du site internet.",
pauseDashboardHome: "En pause",
- deleteMonitorMsg: "Êtes-vous sûr de vouloir supprimer cette sonde ?",
+ deleteMonitorMsg: "Êtes-vous sûr de vouloir supprimer cette sonde ?",
+ deleteMaintenanceMsg: "Voulez-vous vraiment supprimer cette maintenance ?",
deleteNotificationMsg: "Êtes-vous sûr de vouloir supprimer ce type de notifications ? Une fois désactivée, les services qui l'utilisent ne pourront plus envoyer de notifications.",
+ dnsPortDescription: "Port du serveur DNS. La valeur par défaut est 53. Vous pouvez modifier le port à tout moment.",
resolverserverDescription: "Le DNS de Cloudflare est utilisé par défaut, mais vous pouvez le changer si vous le souhaitez.",
rrtypeDescription: "Veuillez sélectionner un type d'enregistrement DNS",
- pauseMonitorMsg: "Êtes-vous sûr de vouloir mettre en pause cette sonde ?",
+ pauseMonitorMsg: "Êtes-vous sûr de vouloir mettre en pause cette sonde ?",
enableDefaultNotificationDescription: "Pour chaque nouvelle sonde, cette notification sera activée par défaut. Vous pouvez toujours désactiver la notification séparément pour chaque sonde.",
- clearEventsMsg: "Êtes-vous sûr de vouloir supprimer tous les événements pour cette sonde ?",
- clearHeartbeatsMsg: "Êtes-vous sûr de vouloir supprimer toutes les vérifications pour cette sonde ?",
+ clearEventsMsg: "Êtes-vous sûr de vouloir supprimer tous les événements pour cette sonde ?",
+ clearHeartbeatsMsg: "Êtes-vous sûr de vouloir supprimer toutes les vérifications pour cette sonde ?",
confirmClearStatisticsMsg: "Êtes-vous sûr de vouloir supprimer toutes les statistiques ?",
- importHandleDescription: "Choisissez 'Ignorer l'existant' si vous voulez ignorer chaque sonde ou notification portant le même nom. L'option 'Écraser' supprime toutes les sondes et notifications existantes.",
+ importHandleDescription: "Choisissez « Ignorer l'existant » si vous voulez ignorer chaque sonde ou notification portant le même nom. L'option « Écraser » supprime toutes les sondes et notifications existantes.",
confirmImportMsg: "Êtes-vous sûr de vouloir importer la sauvegarde ? Veuillez vous assurer que vous avez sélectionné la bonne option d'importation.",
twoFAVerifyLabel: "Veuillez saisir votre jeton pour vérifier que le système 2FA fonctionne.",
- tokenValidSettingsMsg: "Le jeton est valide. Vous pouvez maintenant sauvegarder les paramètres 2FA.",
- confirmEnableTwoFAMsg: "Êtes-vous sûr de vouloir activer le 2FA ?",
- confirmDisableTwoFAMsg: "Êtes-vous sûr de vouloir désactiver le 2FA ?",
+ tokenValidSettingsMsg: "Le jeton est valide. Vous pouvez maintenant sauvegarder les paramètres de double authentification (2FA).",
+ confirmEnableTwoFAMsg: "Êtes-vous sûr de vouloir activer la double authentification (2FA) ?",
+ confirmDisableTwoFAMsg: "Êtes-vous sûr de vouloir désactiver la double authentification (2FA) ?",
Settings: "Paramètres",
Dashboard: "Tableau de bord",
"New Update": "Mise à jour disponible",
@@ -33,8 +51,9 @@ export default {
Appearance: "Apparence",
Theme: "Thème",
General: "Général",
+ "Primary Base URL": "URL principale",
Version: "Version",
- "Check Update On GitHub": "Consulter les mises à jour sur Github",
+ "Check Update On GitHub": "Consulter les mises à jour sur GitHub",
List: "Lister",
Add: "Ajouter",
"Add New Monitor": "Ajouter une nouvelle sonde",
@@ -43,25 +62,25 @@ export default {
Down: "Hors ligne",
Pending: "En attente",
Unknown: "Inconnu",
- Pause: "En Pause",
+ Pause: "En pause",
Name: "Nom",
Status: "État",
DateTime: "Heure",
Message: "Messages",
- "No important events": "Pas d'évènements important",
+ "No important events": "Aucun évènement important",
Resume: "Reprendre",
Edit: "Modifier",
Delete: "Supprimer",
Current: "Actuellement",
- Uptime: "Uptime",
+ Uptime: "Disponibilité",
"Cert Exp.": "Expiration SSL",
day: "jour | jours",
- "-day": "-jours",
- hour: "-heure",
- "-hour": "-heures",
+ "-day": " jours",
+ hour: "heure",
+ "-hour": " heure",
Response: "Temps de réponse",
Ping: "Ping",
- "Monitor Type": "Type de Sonde",
+ "Monitor Type": "Type de sonde",
Keyword: "Mot-clé",
"Friendly Name": "Nom d'affichage",
URL: "URL",
@@ -70,25 +89,29 @@ export default {
"Heartbeat Interval": "Intervalle de vérification",
Retries: "Essais",
"Heartbeat Retry Interval": "Réessayer l'intervalle de vérification",
+ "Resend Notification if Down X times consequently": "Renvoyer une notification si hors ligne X fois",
Advanced: "Avancé",
"Upside Down Mode": "Mode inversé",
"Max. Redirects": "Nombre maximum de redirections",
"Accepted Status Codes": "Codes HTTP acceptés",
+ "Push URL": "Push URL",
+ needPushEvery: "Vous devez appeler cette URL toutes les {0} secondes.",
+ pushOptionalParams: "Paramètres facultatifs : {0}",
Save: "Sauvegarder",
Notifications: "Notifications",
- "Not available, please setup.": "Pas de système de notification disponible, merci de le configurer",
+ "Not available, please setup.": "Pas de système de notification disponible, merci de le configurer.",
"Setup Notification": "Créer une notification",
Light: "Clair",
Dark: "Sombre",
Auto: "Automatique",
- "Theme - Heartbeat Bar": "Voir les services surveillés",
+ "Theme - Heartbeat Bar": "Thème - barres d'état",
Normal: "Normal",
Bottom: "En dessous",
None: "Aucun",
- Timezone: "Fuseau Horaire",
+ Timezone: "Fuseau horaire",
"Search Engine Visibility": "Visibilité par les moteurs de recherche",
- "Allow indexing": "Autoriser l'indexation par des moteurs de recherche",
- "Discourage search engines from indexing site": "Refuser l'indexation par des moteurs de recherche",
+ "Allow indexing": "Autoriser l'indexation",
+ "Discourage search engines from indexing site": "Refuser l'indexation",
"Change Password": "Changer le mot de passe",
"Current Password": "Mot de passe actuel",
"New Password": "Nouveau mot de passe",
@@ -96,26 +119,29 @@ export default {
"Update Password": "Mettre à jour le mot de passe",
"Disable Auth": "Désactiver l'authentification",
"Enable Auth": "Activer l'authentification",
- Logout: "Se déconnecter",
+ "disableauth.message1": "Voulez-vous vraiment désactiver l'authentification ?",
+ "disableauth.message2": "Cette fonctionnalité est conçue pour les scénarios où vous avez l'intention d'implémenter une authentification tierce devant Uptime Kuma, comme Cloudflare Access, Authelia ou d'autres mécanismes d'authentification.",
+ "Please use this option carefully!": "Veuillez utiliser cette option avec précaution !",
+ Logout: "Déconnexion",
Leave: "Quitter",
- "I understand, please disable": "Je comprends, désactivez-le",
+ "I understand, please disable": "Je comprends, désactivez-la",
Confirm: "Confirmer",
Yes: "Oui",
No: "Non",
Username: "Nom d'utilisateur",
Password: "Mot de passe",
"Remember me": "Se souvenir de moi",
- Login: "Se connecter",
+ Login: "Connexion",
"No Monitors, please": "Pas de sondes, veuillez",
"add one": "en ajouter une",
"Notification Type": "Type de notification",
- Email: "Email",
+ Email: "Courriel",
Test: "Tester",
"Certificate Info": "Informations sur le certificat SSL",
"Resolver Server": "Serveur DNS utilisé",
"Resource Record Type": "Type d'enregistrement DNS recherché",
"Last Result": "Dernier résultat",
- "Create your admin account": "Créez votre compte administrateur",
+ "Create your admin account": "Créer votre compte administrateur",
"Repeat Password": "Répéter le mot de passe",
"Import Backup": "Importation de la sauvegarde",
"Export Backup": "Exportation de la sauvegarde",
@@ -127,9 +153,9 @@ export default {
"Apply on all existing monitors": "Appliquer sur toutes les sondes existantes",
Create: "Créer",
"Clear Data": "Effacer les données",
- Events: "Evénements",
+ Events: "Événements",
Heartbeats: "Vérifications",
- "Auto Get": "Récuperer automatiquement",
+ "Auto Get": "Récupérer automatiquement",
backupDescription: "Vous pouvez sauvegarder toutes les sondes et toutes les notifications dans un fichier JSON.",
backupDescription2: "PS : Les données relatives à l'historique et aux événements ne sont pas incluses.",
backupDescription3: "Les données sensibles telles que les jetons de notification sont incluses dans le fichier d'exportation, veuillez les conserver soigneusement.",
@@ -137,15 +163,15 @@ export default {
alertWrongFileType: "Veuillez sélectionner un fichier JSON à importer.",
"Clear all statistics": "Effacer toutes les statistiques",
"Skip existing": "Sauter l'existant",
- Overwrite: "Ecraser",
+ Overwrite: "Écraser",
Options: "Options",
"Keep both": "Garder les deux",
"Verify Token": "Vérifier le jeton",
- "Setup 2FA": "Configurer 2FA",
- "Enable 2FA": "Activer 2FA",
- "Disable 2FA": "Désactiver 2FA",
- "2FA Settings": "Paramètres 2FA",
- "Two Factor Authentication": "Authentification à deux facteurs",
+ "Setup 2FA": "Configurer la double authentification (2FA)",
+ "Enable 2FA": "Activer la double authentification (2FA)",
+ "Disable 2FA": "Désactiver la double authentification (2FA)",
+ "2FA Settings": "Paramètres de la la double authentification (2FA)",
+ "Two Factor Authentication": "Double authentification",
Active: "Actif",
Inactive: "Inactif",
Token: "Jeton",
@@ -179,52 +205,47 @@ export default {
"Go to Dashboard": "Accéder au tableau de bord",
"Status Page": "Page de statut",
"Status Pages": "Pages de statut",
- "New Status Page": "Ajouter page de statut",
- "Add New Status Page": "Ajouter une page de statut",
- "No status pages": "Aucune page de statut.",
- "Accept characters:": "Caractères acceptés:",
- startOrEndWithOnly: "Commence uniquement par {0}",
- "No consecutive dashes": "Pas de double tirets",
- Next: "Continuer",
- "Setup Proxy": "Configurer Proxy",
defaultNotificationName: "Ma notification {notification} numéro ({number})",
here: "ici",
Required: "Requis",
telegram: "Telegram",
- "Bot Token": "Bot Token",
+ "Bot Token": "Jeton du robot",
wayToGetTelegramToken: "Vous pouvez obtenir un token depuis {0}.",
"Chat ID": "Chat ID",
- supportTelegramChatID: "Supporte les messages privés / en groupe / l'ID du salon",
- wayToGetTelegramChatID: "Vous pouvez obtenir l'ID du chat en envoyant un message avec le bot puis en récupérant l'URL pour voir l'ID du salon :",
- "YOUR BOT TOKEN HERE": "VOTRE TOKEN BOT ICI",
- chatIDNotFound: "ID du salon introuvable, envoyez un message via le bot avant",
+ supportTelegramChatID: "Prend en charge les messages privés / messages de groupe / l'ID d'un salon",
+ wayToGetTelegramChatID: "Vous pouvez obtenir le Chat ID en envoyant un message avec le robot puis en récupérant l'URL pour voir l'ID du salon :",
+ "YOUR BOT TOKEN HERE": "VOTRE JETON ROBOT ICI",
+ chatIDNotFound: "ID du salon introuvable, envoyez un message via le robot avant",
webhook: "Webhook",
"Post URL": "Post URL",
"Content Type": "Type de contenu",
- webhookJsonDesc: "{0} est bien/bon pour tous les serveurs HTTP modernes comme express.js",
- webhookFormDataDesc: "{multipart} est bien/bon pour du PHP, vous avez juste besoin de mettre le json via/depuis {decodeFunction}",
- smtp: "Email (SMTP)",
- secureOptionNone: "Aucun/STARTTLS (25, 587)",
+ webhookJsonDesc: "{0} est bien pour tous les serveurs HTTP modernes comme Express.js",
+ webhookFormDataDesc: "{multipart} est bien pour du PHP. Le JSON aura besoin d'être parsé avec {decodeFunction}",
+ webhookAdditionalHeadersTitle: "En-têtes supplémentaires",
+ webhookAdditionalHeadersDesc: "Définit des en-têtes supplémentaires envoyés avec le webhook.",
+ smtp: "Courriel (SMTP)",
+ secureOptionNone: "Aucun / STARTTLS (25, 587)",
secureOptionTLS: "TLS (465)",
"Ignore TLS Error": "Ignorer les erreurs TLS",
- "From Email": "Depuis l'Email",
- "To Email": "Vers l'Email",
+ "From Email": "Depuis l'adresse",
+ emailCustomSubject: "Objet personnalisé",
+ "To Email": "Vers l'adresse",
smtpCC: "CC",
- smtpBCC: "BCC",
+ smtpBCC: "CCI",
discord: "Discord",
- "Discord Webhook URL": "Discord Webhook URL",
- wayToGetDiscordURL: "Vous pouvez l'obtenir en allant dans 'Paramètres du Serveur' -> 'Intégrations' -> 'Créer un Webhook'",
- "Bot Display Name": "Nom du bot (affiché)",
- "Prefix Custom Message": "Prefixe du message personnalisé",
+ "Discord Webhook URL": "URL vers le webhook Discord",
+ wayToGetDiscordURL: "Vous pouvez l'obtenir en allant dans « Paramètres du serveur » -> « Intégrations » -> « Créer un Webhook »",
+ "Bot Display Name": "Nom du robot (affiché)",
+ "Prefix Custom Message": "Préfixe du message personnalisé",
"Hello @everyone is...": "Bonjour {'@'}everyone il...",
teams: "Microsoft Teams",
- "Webhook URL": "Webhook URL",
+ "Webhook URL": "URL vers le webhook",
wayToGetTeamsURL: "Vous pouvez apprendre comment créer un Webhook {0}.",
signal: "Signal",
Number: "Numéro",
Recipients: "Destinataires",
needSignalAPI: "Vous avez besoin d'un client Signal avec l'API REST.",
- wayToCheckSignalURL: "Vous pouvez regarder l'URL sur comment le mettre en place :",
+ wayToCheckSignalURL: "Vous pouvez regarder l'URL suivante pour savoir comment la mettre en place :",
signalImportant: "IMPORTANT : Vous ne pouvez pas mixer les groupes et les numéros en destinataires !",
gotify: "Gotify",
"Application Token": "Jeton d'application",
@@ -233,18 +254,21 @@ export default {
slack: "Slack",
"Icon Emoji": "Icon Emoji",
"Channel Name": "Nom du salon",
- "Uptime Kuma URL": "Uptime Kuma URL",
- aboutWebhooks: "Plus d'informations sur les Webhooks ici : {0}",
- aboutChannelName: "Mettez le nom du salon dans {0} dans 'Channel Name' si vous voulez bypass le salon Webhook. Ex : #autre-salon",
+ "Uptime Kuma URL": "URL vers Uptime Kuma",
+ aboutWebhooks: "Plus d'informations sur les webhooks ici : {0}",
+ aboutChannelName: "Mettez le nom du salon dans {0} dans « Nom du salon » si vous voulez contourner le salon webhook. Ex. : #autre-salon",
aboutKumaURL: "Si vous laissez l'URL d'Uptime Kuma vierge, elle redirigera vers la page du projet GitHub.",
- emojiCheatSheet: "Aide emoji : {0}",
+ emojiCheatSheet: "Aide sur les émojis : {0}",
"rocket.chat": "Rocket.chat",
pushover: "Pushover",
pushy: "Pushy",
+ PushByTechulus: "Push by Techulus",
octopush: "Octopush",
promosms: "PromoSMS",
+ clicksendsms: "ClickSend SMS",
lunasea: "LunaSea",
- apprise: "Apprise (Prend en charge plus de 50 services de notification)",
+ apprise: "Apprise (prend en charge plus de 50 services de notification)",
+ GoogleChat: "Google Chat (Google Workspace uniquement)",
pushbullet: "Pushbullet",
line: "Line Messenger",
mattermost: "Mattermost",
@@ -253,91 +277,75 @@ export default {
"Message Title": "Titre du message",
"Notification Sound": "Son de notification",
"More info on:": "Plus d'informations sur : {0}",
- pushoverDesc1: "Priorité d'urgence (2) a par défaut 30 secondes de délai dépassé entre les tentatives et expierera après 1 heure.",
- pushoverDesc2: "Si vous voulez envoyer des notifications sur différents Appareils, remplissez le champ 'Device'.",
- "SMS Type": "SMS Type",
- octopushTypePremium: "Premium (Rapide - recommandé pour les alertes)",
- octopushTypeLowCost: "À bas prix (Lent, bloqué de temps en temps par l'opérateur)",
- "Check octopush prices": "Vérifier les prix d'octopush {0}.",
- octopushPhoneNumber: "Numéro de téléphone (format int., ex : +33612345678) ",
- octopushSMSSender: "Nom de l'envoyer : 3-11 caractères alphanumériques avec espace (a-zA-Z0-9)",
- "LunaSea Device ID": "LunaSea Device ID",
- "Apprise URL": "Apprise URL",
- "Example:": "Exemple : {0}",
+ pushoverDesc1: "Priorité d'urgence (2) a un délai par défaut de 30 secondes entre les tentatives et expire après une heure.",
+ pushoverDesc2: "Si vous voulez envoyer des notifications sur différents appareils, remplissez le champ « Appareil ».",
+ "SMS Type": "Type de SMS",
+ octopushTypePremium: "Premium (rapide - recommandé pour les alertes)",
+ octopushTypeLowCost: "Économique (lent, bloqué de temps en temps par l'opérateur)",
+ checkPrice: "Vérification {0} tarifs :",
+ apiCredentials: "Identifiants de l'API",
+ octopushLegacyHint: "Voulez-vous utiliser l'ancienne version d'Octopush (2011-2020) ou la nouvelle version ?",
+ "Check octopush prices": "Vérifier les prix d'Octopush {0}.",
+ octopushPhoneNumber: "Numéro de téléphone (format international, ex. : +33612345678)",
+ octopushSMSSender: "Nom de l'expéditeur : 3-11 caractères alphanumériques avec espace (a-zA-Z0-9)",
+ "LunaSea Device ID": "Identifiant d'appareil LunaSea",
+ "Apprise URL": "URL d'Apprise",
+ "Example:": "Exemple : {0}",
"Read more:": "En savoir plus : {0}",
- "Status:": "Status : {0}",
+ "Status:": "État : {0}",
"Read more": "En savoir plus",
appriseInstalled: "Apprise est installé.",
appriseNotInstalled: "Apprise n'est pas installé. {0}",
- "Access Token": "Token d'accès",
- "Channel access token": "Token d'accès au canal",
- "Line Developers Console": "Ligne console de développeurs",
- lineDevConsoleTo: "Ligne console de développeurs - {0}",
+ "Access Token": "Jeton d'accès",
+ "Channel access token": "Jeton d'accès au canal",
+ "Line Developers Console": "Console développeurs Line",
+ lineDevConsoleTo: "Console développeurs Line - {0}",
"Basic Settings": "Paramètres de base",
"User ID": "Identifiant utilisateur",
- "Messaging API": "Messaging API",
- wayToGetLineChannelToken: "Premièrement accéder à {0}, créez un Provider et un Salon (Messaging API), puis vous pourrez avoir le Token d'accès du salon ainsi que l'Identifiant utilisateur depuis le même menu.",
- "Icon URL": "Icon URL",
- aboutIconURL: "Vous pouvez mettre un lien vers l'image dans \"Icon URL\" pour remplacer l'image de profil par défaut. Ne sera pas utilisé si Icon Emoji est défini.",
- aboutMattermostChannelName: "Vous pouvez remplacer le salon par défaut que le Webhook utilise en mettant le nom du salon dans le champ \"Channel Name\". Vous aurez besoin de l'activer depuis les paramètres de Mattermost. Ex : #autre-salon",
+ "Messaging API": "Messaging API", // Ne pas traduire, il s'agit du type de salon affiché sur la console développeurs Line
+ wayToGetLineChannelToken: "Premièrement accédez à {0}, créez un provider et définissez un type de salon à « Messaging API ». Vous pourrez alors avoir puis vous pourrez avoir le jeton d'accès du salon et l'identifiant utilisateur demandés.",
+ "Icon URL": "URL vers l'icône",
+ aboutIconURL: "Vous pouvez mettre un lien vers une image dans « URL vers l'icône » pour remplacer l'image de profil par défaut. Elle ne sera utilisé que si « Icône émoji » n'est pas défini.",
+ aboutMattermostChannelName: "Vous pouvez remplacer le salon par défaut que le webhook utilise en mettant le nom du salon dans le champ « Nom du salon ». Vous aurez besoin de l'activer depuis les paramètres de Mattermost. Ex. : #autre-salon",
matrix: "Matrix",
- promosmsTypeEco: "SMS ECO - Pas cher mais lent et souvent surchargé. Limité uniquement aux déstinataires Polonais.",
- promosmsTypeFlash: "SMS FLASH - Le message sera automatiquement affiché sur l'appareil du destinataire. Limité uniquement aux déstinataires Polonais.",
- promosmsTypeFull: "SMS FULL - Version Premium des SMS, Vous pouvez mettre le nom de l'expéditeur (Vous devez vous enregistrer avant). Fiable pour les alertes.",
- promosmsTypeSpeed: "SMS SPEED - La plus haute des priorités dans le système. Très rapide et fiable mais cher (environ le double du prix d'un SMS FULL).",
- promosmsPhoneNumber: "Numéro de téléphone (Poiur les déstinataires Polonais, vous pouvez enlever les codes interna.)",
- promosmsSMSSender: "SMS Expéditeur : Nom pré-enregistré ou l'un de base : InfoSMS, SMS Info, MaxSMS, INFO, SMS",
- "Primary Base URL": "URL principale",
- 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 ?",
+ promosmsTypeEco: "SMS ECO - Bon marché mais lent et souvent surchargé. Limité uniquement aux destinataires polonais.",
+ promosmsTypeFlash: "SMS FLASH - Le message sera automatiquement affiché sur l'appareil du destinataire. Limité uniquement aux destinataires Polonais.",
+ promosmsTypeFull: "SMS FULL - Version premium des SMS. Vous pouvez mettre le nom de l'expéditeur (vous devez l'enregistrer au préalable). Fiable pour les alertes.",
+ promosmsTypeSpeed: "SMS SPEED - Priorité élevée pour le système. Très rapide et fiable mais coûteux (environ le double du prix d'un SMS FULL).",
+ promosmsPhoneNumber: "Numéro de téléphone (pour les destinataires polonais, vous pouvez ignorer l'indicatif international)",
+ promosmsSMSSender: "Nom de l'expéditeur du SMS : Nom pré-enregistré ou l'un de base : InfoSMS, SMS Info, MaxSMS, INFO, SMS",
"Feishu WebHookUrl": "Feishu WebHookURL",
- matrixHomeserverURL: "L'URL du serveur (avec http(s):// et le port de manière facultatif)",
+ matrixHomeserverURL: "L'URL du serveur (avec http(s):// et le port de manière facultative)",
"Internal Room Id": "ID de la salle interne",
matrixDesc1: "Vous pouvez trouver l'ID de salle interne en regardant dans la section avancée des paramètres dans le client Matrix. C'est censé ressembler à !QMdRCpUIfLwsfjxye6:home.server.",
- matrixDesc2: "Il est fortement recommandé de créer un nouvel utilisateur et de ne pas utiliser le jeton d'accès de votre propre utilisateur Matrix, car il vous donnera un accès complet à votre compte et à toutes les salles que vous avez rejointes. 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}",
+ matrixDesc2: "Il est fortement recommandé de créer un nouvel utilisateur et de ne pas utiliser le jeton d'accès de votre propre utilisateur Matrix, car il vous donnera un accès complet à votre compte et à toutes les salles que vous avez rejointes. Pour cela, créez un nouvel utilisateur et invitez-le uniquement dans la salle dans laquelle vous souhaitez recevoir la notification. Vous pouvez obtenir le jeton d'accès en exécutant {0}",
Method: "Méthode",
- Body: "Le corps",
+ Body: "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: ",
+ PushUrl: "URL Push",
+ HeadersInvalidFormat: "Les en-têtes de la requête ne sont pas dans un format JSON valide : ",
+ BodyInvalidFormat: "Le corps de la requête n'est pas dans un format JSON valide : ",
"Monitor History": "Historique de la sonde",
- clearDataOlderThan: "Garder l'historique des données de la sonde durant {0} jours.",
+ clearDataOlderThan: "Conserver l'historique des données de la sonde durant {0} jours.",
PasswordsDoNotMatch: "Les mots de passe ne correspondent pas.",
- records: "Enregistrements",
+ 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 : ",
+ steamApiKeyDescription: "Pour surveiller un serveur Steam, vous avez besoin d'une clé Steam Web-API. Vous pouvez enregistrer votre clé ici : ",
"Current User": "Utilisateur actuel",
+ topic: "Topic",
+ topicExplanation: "Topic MQTT à surveiller",
+ successMessage: "Message de réussite",
+ successMessageExplanation: "Message MQTT qui sera considéré comme un succès",
recent: "Récent",
- alertaApiEndpoint: "API Endpoint",
- alertaEnvironment: "Environement",
- alertaApiKey: "Clé de l'API",
- alertaAlertState: "État de l'Alerte",
- alertaRecoverState: "État de récupération",
- resendEveryXTimes: "Renvoyez toutes les {0} fois",
- resendDisabled: "Renvoi désactivé",
- dnsPortDescription: "Port du serveur DNS. La valeur par défaut est 53. Vous pouvez modifier le port à tout moment.",
- "Resend Notification if Down X times consequently": "Renvoyer la notification a partir d'un certain temps",
- "Push URL": "Push URL",
- needPushEvery: "Vous devez appeler cette URL toutes les {0} secondes.",
- pushOptionalParams: "parametres optionnels: {0}",
- "disableauth.message1": "Voulez-vous vraiment désactiver l'authentification?",
- "disableauth.message2": "Il est conçu pour les scénarios où vous avez l'intention d'implémenter une authentification tierce devant Uptime Kuma, comme Cloudflare Access, Authelia ou d'autres mécanismes d'authentification.",
- "Please use this option carefully!": "Veuillez utiliser cette option avec précaution !",
- PushByTechulus: "Pousser par Techulus",
- GoogleChat: "Google Chat (Google Workspace uniquement)",
Done: "Fait",
Info: "Info",
Security: "Sécurité",
- "Steam API Key": "Clé API Steam",
+ "Steam API Key": "Clé d'API Steam",
"Shrink Database": "Réduire la base de données",
"Pick a RR-Type...": "Choisissez un type d'enregistrement...",
"Pick Accepted Status Codes...": "Choisissez les codes de statut acceptés...",
Default: "Défaut",
- "HTTP Options": "Options HTTP ",
+ "HTTP Options": "Options HTTP",
"Create Incident": "Créer un incident",
Title: "Titre",
Content: "Contenu",
@@ -351,151 +359,160 @@ export default {
light: "Blanc",
dark: "Noir",
Post: "Post",
- "Please input title and content": "Veuillez entrer le titre et le contenu",
- Created: "Created",
+ "Please input title and content": "Veuillez saisir le titre et le contenu",
+ Created: "Créé",
"Last Updated": "Dernière mise à jour",
- Unpin: "Détacher",
+ Unpin: "Retirer",
"Switch to Light Theme": "Passer au thème clair",
"Switch to Dark Theme": "Passer au thème sombre",
- "Show Tags": "Voir les étiquettes",
+ "Show Tags": "Afficher les étiquettes",
"Hide Tags": "Masquer les étiquettes",
Description: "Description",
- "No monitors available.": "Aucun moniteur disponible.",
- "Add one": "En rajouter un",
- "No Monitors": "Aucun moniteur",
+ "No monitors available.": "Aucune sonde disponible.",
+ "Add one": "En rajouter une",
+ "No Monitors": "Aucune sonde",
"Untitled Group": "Groupe sans titre",
Services: "Services",
- Discard: "Annuler",
+ Discard: "Abandonner",
Cancel: "Annuler",
- shrinkDatabaseDescription: "Déclencher la base de données VACUUM pour SQLite. Si votre base de données est créée après 1.10.0, AUTO_VACUUM est déjà activé et cette action n'est pas nécessaire.",
+ "Powered by": "Propulsé par",
+ shrinkDatabaseDescription: "Déclenche la commande VACUUM pour SQLite. Si votre base de données a été créée après la version 1.10.0, AUTO_VACUUM est déjà activé et cette action n'est pas nécessaire.",
+ serwersms: "SerwerSMS.pl",
serwersmsAPIUser: "Nom d'utilisateur de l'API (incl. webapi_ prefix)",
serwersmsAPIPassword: "Mot de passe API",
serwersmsPhoneNumber: "Numéro de téléphone",
serwersmsSenderName: "Nom de l'expéditeur du SMS (enregistré via le portail client)",
+ smseagle: "SMSEagle",
+ smseagleTo: "Numéro(s) de téléphone",
+ smseagleGroup: "Nom(s) de groupe(s) de répertoire",
+ smseagleContact: "Nom(s) de contact du répertoire",
+ smseagleRecipientType: "Type de destinataire",
+ smseagleRecipient: "Destinataire(s) (les multiples doivent être séparés par une virgule)",
+ smseagleToken: "Jeton d'accès à l'API",
+ smseagleUrl: "L'URL de votre appareil SMSEagle",
+ smseagleEncoding: "Envoyer en Unicode",
+ smseaglePriority: "Priorité des messages (0-9, par défaut = 0)",
+ stackfield: "Stackfield",
Customize: "Personnaliser",
"Custom Footer": "Pied de page personnalisé",
"Custom CSS": "CSS personnalisé",
- deleteStatusPageMsg: "Voulez-vous vraiment supprimer cette page d'état ?",
- Proxies: "Proxies",
- default: "Défaut",
- enabled: "Activé",
- setAsDefault: "Définir par défaut",
- deleteProxyMsg: "Voulez-vous vraiment supprimer ce proxy pour tous les moniteurs ?",
- proxyDescription: "Les proxys doivent être affectés à un moniteur pour fonctionner.",
- enableProxyDescription: "Ce proxy n'aura pas d'effet sur les demandes de moniteur tant qu'il n'est pas activé. Vous pouvez contrôler la désactivation temporaire du proxy de tous les moniteurs en fonction de l'état d'activation.",
- setAsDefaultProxyDescription: "Ce proxy sera activé par défaut pour les nouveaux moniteurs. Vous pouvez toujours désactiver le proxy séparément pour chaque moniteur.",
- Valid: "Valide",
- Invalid: "Non valide",
- User: "Utilisateur",
- Installed: "Installé",
- "Not installed": "Pas installé",
- "Remove Token": "Supprimer le jeton",
- Slug: "Chemin",
- "The slug is already taken. Please choose another slug.": "Le chemin est déjà pris. Veuillez choisir un autre chemin.",
- Authentication: "Authentication",
- "Page Not Found": "Page non trouvée",
- Backup: "Sauvegarde",
- About: "À propos de",
- "Footer Text": "Texte de pied de page",
- "Domain Names": "Noms de domaine",
- signedInDisp: "Connecté en tant que {0}",
- signedInDispDisabled: "Authentification désactivée.",
- "Show update if available": "Afficher la mise à jour si disponible",
- "Also check beta release": "Vérifiez également la version bêta",
- "Steam Game Server": "Serveur de jeu Steam",
- "Most likely causes:": "Causes les plus probables:",
- "The resource is no longer available.": "La ressource n'est plus disponible.",
- "There might be a typing error in the address.": "Il se peut qu'il y ait une erreur de frappe dans l'adresse.",
- "What you can try:": "Ce que vous pouvez essayer:",
- "Retype the address.": "Retapez l'adresse.",
- "Go back to the previous page.": "Retournez à la page précédente.",
- "Coming Soon": "À venir",
- settingsCertificateExpiry: "Expiration du certificat TLS",
- certificationExpiryDescription: "Les moniteurs HTTPS déclenchent une notification lorsque le certificat TLS expire dans:",
- "Setup Docker Host": "Configurer l'hôte Docker",
- "Connection Type": "Type de connexion",
- deleteDockerHostMsg: "Voulez-vous vraiment supprimer cet hôte Docker pour tous les moniteurs ?",
- "Container Name / ID": "Nom / ID du conteneur",
- "Docker Host": "Hôte Docker",
- "Docker Hosts": "Hôtes Docker",
- Domain: "Domaine",
- trustProxyDescription: "Faire confiance aux en-têtes 'X-Forwarded-*'. Si vous souhaitez obtenir la bonne adresse IP client et que votre Uptime Kuma est en retard, comme Nginx ou Apache, vous devez l'activer.",
- wayToGetLineNotifyToken: "Vous pouvez obtenir un jeton d'accès auprès de {0}",
- Examples: "Exemples",
- "Home Assistant URL": "Home Assistant URL",
- "Long-Lived Access Token can be created by clicking on your profile name (bottom left) and scrolling to the bottom then click Create Token. ": "Un jeton d'accès de longue durée peut être créé en cliquant sur le nom de votre profil (en bas à gauche) et en faisant défiler vers le bas, puis cliquez sur Créer un jeton. ",
- "Notification Service": "Service de notifications",
- "default: notify all devices": "par défaut: notifier tous les appareils",
- "A list of Notification Services can be found in Home Assistant under \"Developer Tools > Services\" search for \"notification\" to find your device/phone name.": "Une liste des services de notification peut être trouvée dans Home Assistant sous \"Outils de développement > Services\" recherchez \"notification\" pour trouver le nom de votre appareil/téléphone.",
- "Automations can optionally be triggered in Home Assistant:": "Les automatisations peuvent éventuellement être déclenchées dans Home Assistant:",
- "Trigger type:": "Type de déclencheur:",
- "Event type:": "Type d'événement:",
- "Event data:": "Données d'événement:",
- topic: "Topic",
- topicExplanation: "MQTT sujet à surveiller",
- successMessage: "Message de réussite",
- successMessageExplanation: "MQTT message qui sera considéré comme un succès",
- "Powered by": "Propulsé par",
- serwersms: "SerwerSMS.pl",
- stackfield: "Stackfield",
smtpDkimSettings: "Paramètres DKIM",
smtpDkimDesc: "Veuillez vous référer au Nodemailer DKIM {0} pour l'utilisation.",
- documentation: "Documentation",
+ documentation: "documentation",
smtpDkimDomain: "Nom de domaine",
smtpDkimKeySelector: "Sélecteur de clé",
smtpDkimPrivateKey: "Clé privée",
smtpDkimHashAlgo: "Algorithme de hachage (facultatif)",
smtpDkimheaderFieldNames: "Clés d'en-tête à signer (facultatif)",
smtpDkimskipFields: "Clés d'en-tête à ne pas signer (facultatif)",
- wayToGetPagerDutyKey: "Vous pouvez l'obtenir en allant dans Service -> Annuaire des services -> (Sélectionner un service) -> Intégrations -> Ajouter une intégration. Ici, vous pouvez rechercher \"Events API V2\". Plus d'infos {0}",
+ wayToGetPagerDutyKey: "Vous pouvez l'obtenir en allant dans Service -> Annuaire des services -> (sélectionner un service) -> Intégrations -> Ajouter une intégration. Ici, vous pouvez rechercher \"Events API V2\". Plus d'infos {0}",
"Integration Key": "Clé d'intégration",
"Integration URL": "URL d'intégration",
"Auto resolve or acknowledged": "Résolution automatique ou accusé de réception",
"do nothing": "ne fais rien",
"auto acknowledged": "accusé de réception automatique",
"auto resolve": "résolution automatique",
+ gorush: "Gorush",
+ alerta: "Alerta",
+ alertaApiEndpoint: "API Endpoint",
+ alertaEnvironment: "Environnement",
+ alertaApiKey: "Clé de l'API",
+ alertaAlertState: "État de l'alerte",
+ alertaRecoverState: "État de récupération",
+ deleteStatusPageMsg: "Voulez-vous vraiment supprimer cette page d'état ?",
+ Proxies: "Proxies",
+ default: "Défaut",
+ enabled: "Activé",
+ setAsDefault: "Définir par défaut",
+ deleteProxyMsg: "Voulez-vous vraiment supprimer ce proxy pour toutes les sondes ?",
+ proxyDescription: "Les proxies doivent être affectés à une sonde pour fonctionner.",
+ enableProxyDescription: "Ce proxy n'aura pas d'effet sur les demandes de sonde tant qu'il n'est pas activé. Vous pouvez contrôler la désactivation temporaire du proxy de toutes les sondes en fonction de l'état d'activation.",
+ setAsDefaultProxyDescription: "Ce proxy sera activé par défaut pour les nouvelles sondes. Vous pouvez toujours désactiver le proxy séparément pour chaque sonde.",
+ "Certificate Chain": "Chaîne de certificats",
+ Valid: "Valide",
+ Invalid: "Non valide",
AccessKeyId: "ID de clé d'accès",
SecretAccessKey: "Clé secrète d'accès",
- PhoneNumbers: "Les numéros de téléphone",
+ PhoneNumbers: "Numéros de téléphone",
+ TemplateCode: "Modèle de code",
SignName: "Signature",
- "Sms template must contain parameters: ": "Le modèle de SMS doit contenir des paramètres : ",
+ "Sms template must contain parameters: ": "Le modèle de SMS doit contenir des paramètres : ",
+ "Bark Endpoint": "Endpoint Bark",
+ "Bark Group": "Groupe Bark",
+ "Bark Sound": "Son Bark",
+ WebHookUrl: "WebHookUrl",
SecretKey: "Clé secrète",
- "For safety, must use secret key": "Pour la sécurité, doit utiliser la clé secrète",
+ "For safety, must use secret key": "Par sécurité, utilisation obligatoire de la clé secrète",
"Device Token": "Jeton d'appareil",
Platform: "Plateforme",
+ iOS: "iOS",
+ Android: "Android",
+ Huawei: "Huawei",
+ High: "Haute",
Retry: "Recommencez",
Topic: "Topic",
- "Proxy server has authentication": "Le serveur proxy a une authentification",
+ "WeCom Bot Key": "Clé de robot WeCom",
+ "Setup Proxy": "Configurer le proxy",
+ "Proxy Protocol": "Protocole proxy",
+ "Proxy Server": "Serveur proxy",
+ "Proxy server has authentication": "Une authentification est nécessaire pour le serveur proxy",
+ User: "Utilisateur",
+ Installed: "Installé",
+ "Not installed": "Non installé",
Running: "Fonctionne",
"Not running": "Ne fonctionne pas",
- Start: "Start",
- Stop: "Stop",
+ "Remove Token": "Supprimer le jeton",
+ Start: "Démarrer",
+ Stop: "Arrêter",
"Uptime Kuma": "Uptime Kuma",
- "No Proxy": "Pas de Proxy",
+ "Add New Status Page": "Ajouter une page de statut",
+ Slug: "Chemin",
+ "Accept characters:": "Caractères acceptés : ",
+ startOrEndWithOnly: "Commence uniquement par {0}",
+ "No consecutive dashes": "Pas de double tirets",
+ Next: "Continuer",
+ "The slug is already taken. Please choose another slug.": "Un chemin existe déjà. Veuillez en choisir un autre.",
+ "No Proxy": "Pas de proxy",
+ Authentication: "Authentification",
"HTTP Basic Auth": "Authentification de base HTTP",
+ "New Status Page": "Nouvelle page de statut",
+ "Page Not Found": "Page non trouvée",
"Reverse Proxy": "Proxy inverse",
- wayToGetCloudflaredURL: "(Télécharger cloudflared depuis {0})",
- cloudflareWebsite: "le site Cloudflare ",
- "Message:": "Message:",
- "Don't know how to get the token? Please read the guide:": "Vous ne savez pas comment obtenir le jeton ? Veuillez lire le guide:",
- "The current connection may be lost if you are currently connecting via Cloudflare Tunnel. Are you sure want to stop it? Type your current password to confirm it.": "La connexion actuelle peut être perdue si vous vous connectez actuellement via Cloudflare Tunnel. Êtes-vous sûr de vouloir l'arrêter ? Tapez votre mot de passe actuel pour le confirmer.",
+ Backup: "Sauvegarde",
+ About: "À propos",
+ wayToGetCloudflaredURL: "(télécharger cloudflared depuis {0})",
+ cloudflareWebsite: "Site web de Cloudflare",
+ "Message:": "Message : ",
+ "Don't know how to get the token? Please read the guide:": "Vous ne savez pas comment obtenir le jeton ? Lisez le guide :",
+ "The current connection may be lost if you are currently connecting via Cloudflare Tunnel. Are you sure want to stop it? Type your current password to confirm it.": "La connexion actuelle peut être perdue si vous vous connectez actuellement via un tunnel Cloudflare. Êtes-vous sûr de vouloir l'arrêter ? Tapez votre mot de passe actuel pour le confirmer.",
"HTTP Headers": "En-têtes HTTP",
"Trust Proxy": "Proxy de confiance",
"Other Software": "Autres logiciels",
- "For example: nginx, Apache and Traefik.": "Par exemple : nginx, Apache et Traefik.",
- "Please read": "S'il vous plaît Lisez",
- "Valid To:": "Valable pour:",
- "Days Remaining:": "Jours restant:",
- "Domain Name Expiry Notification": "Notification d'expiration de nom de domaine",
+ "For example: nginx, Apache and Traefik.": "Par exemple : nginx, Apache et Traefik.",
+ "Please read": "Veuillez lire",
+ "Subject:": "Objet : ",
+ "Valid To:": "Valable jusqu'au : ",
+ "Days Remaining:": "Jours restants : ",
+ "Issuer:": "Émetteur : ",
+ "Fingerprint:": "Empreinte : ",
+ "No status pages": "Aucune page de statut.",
+ "Domain Name Expiry Notification": "Notification d'expiration du nom de domaine",
+ Proxy: "Proxy",
"Date Created": "Date de création",
HomeAssistant: "Home Assistant",
onebotHttpAddress: "Adresse HTTP OneBot",
onebotMessageType: "Type de message OneBot",
onebotGroupMessage: "Groupe",
+ onebotPrivateMessage: "Privé",
onebotUserOrGroupId: "ID de groupe/utilisateur",
onebotSafetyTips: "Pour des raisons de sécurité, vous devez définir un jeton d'accès",
"PushDeer Key": "Clé PushDeer",
- "Show Powered By": "Afficher \"Propulsé par\"",
+ "Footer Text": "Texte de pied de page",
+ "Show Powered By": "Afficher « Propulsé par »",
+ "Domain Names": "Noms de domaine",
+ signedInDisp: "Connecté en tant que {0}",
+ signedInDispDisabled: "Authentification désactivée.",
+ RadiusSecret: "Radius Secret",
RadiusSecretDescription: "Secret partagé entre le client et le serveur",
RadiusCalledStationId: "Identifiant de la station appelée",
RadiusCalledStationIdDescription: "Identifiant de l'appareil appelé",
@@ -505,56 +522,105 @@ export default {
"API Username": "Nom d'utilisateur de l'API",
"API Key": "Clé API",
"Recipient Number": "Numéro du destinataire",
- "From Name/Number": "De Nom/Numéro",
+ "From Name/Number": "De nom/numéro",
"Leave blank to use a shared sender number.": "Laisser vide pour utiliser un numéro d'expéditeur partagé.",
"Octopush API Version": "Version de l'API Octopush",
+ "Legacy Octopush-DM": "Ancien Octopush-DM",
+ endpoint: "endpoint",
octopushAPIKey: "\"Clé API\" à partir des informations d'identification de l'API HTTP dans le panneau de configuration",
- octopushLogin: "\"Connexion\" à partir des informations d'identification de l'API HTTP dans le panneau de configuration",
+ octopushLogin: "\"Identifiant\" à partir des informations d'identification de l'API HTTP dans le panneau de configuration",
+ promosmsLogin: "Nom de connexion API",
+ promosmsPassword: "Mot de passe API",
+ "pushoversounds pushover": "Pushover (par défaut)",
+ "pushoversounds bike": "Vélo",
+ "pushoversounds bugle": "Clairon",
+ "pushoversounds cashregister": "Caisse enregistreuse",
+ "pushoversounds classical": "Classique",
+ "pushoversounds cosmic": "Cosmique",
+ "pushoversounds falling": "Chute",
+ "pushoversounds gamelan": "Gamelan",
+ "pushoversounds incoming": "Arrivée",
+ "pushoversounds intermission": "Intermission",
+ "pushoversounds magic": "Magique",
+ "pushoversounds mechanical": "Mécanique",
+ "pushoversounds pianobar": "Piano-bar",
+ "pushoversounds siren": "Sirène",
+ "pushoversounds spacealarm": "Alarme spatiale",
+ "pushoversounds tugboat": "Remorqueur",
+ "pushoversounds alien": "Alarme alienne (version longue)",
+ "pushoversounds climb": "Escalade (version longue)",
+ "pushoversounds persistent": "Persistent (version longue)",
+ "pushoversounds echo": "Pushover Echo (version longue)",
+ "pushoversounds updown": "Up Down (version longue)",
+ "pushoversounds vibrate": "Vibration seulement",
+ "pushoversounds none": "Aucun (silencieux)",
+ pushyAPIKey: "Clé API secrète",
+ pushyToken: "Jeton d'appareil",
+ "Show update if available": "Afficher la mise à jour si disponible",
+ "Also check beta release": "Vérifiez également la version bêta",
"Using a Reverse Proxy?": "Utiliser un proxy inverse ?",
- "Check how to config it for WebSocket": "Vérifiez comment le configurer pour WebSocket",
+ "Check how to config it for WebSocket": "Vérifier comment le configurer pour WebSocket",
+ "Steam Game Server": "Serveur de jeu Steam",
+ "Most likely causes:": "Causes les plus probables : ",
+ "The resource is no longer available.": "La ressource n'est plus disponible.",
+ "There might be a typing error in the address.": "Il se peut qu'il y ait une erreur de frappe dans l'adresse.",
+ "What you can try:": "Ce que vous pouvez essayer :",
+ "Retype the address.": "Retaper l'adresse.",
+ "Go back to the previous page.": "Retourner à la page précédente.",
+ "Coming Soon": "Prochainement",
wayToGetClickSendSMSToken: "Vous pouvez obtenir le nom d'utilisateur API et la clé API à partir de {0} .",
"Connection String": "Chaîne de connexion",
Query: "Requête",
+ settingsCertificateExpiry: "Expiration du certificat TLS",
+ certificationExpiryDescription: "Les sondes HTTPS émettent une notification lorsque le certificat TLS expire dans :",
+ "Setup Docker Host": "Configurer l'hôte Docker",
+ "Connection Type": "Type de connexion",
+ "Docker Daemon": "Deamon Docker",
+ deleteDockerHostMsg: "Voulez-vous vraiment supprimer cet hôte Docker pour toutes les sondes ?",
+ socket: "Socket",
tcp: "TCP / HTTP",
"Docker Container": "Conteneur Docker",
+ "Container Name / ID": "Nom / ID du conteneur",
+ "Docker Host": "Hôte Docker",
+ "Docker Hosts": "Hôtes Docker",
+ "ntfy Topic": "Topic ntfy",
+ Domain: "Domaine",
Workstation: "Poste de travail",
disableCloudflaredNoAuthMsg: "Vous êtes en mode No Auth, un mot de passe n'est pas nécessaire.",
+ trustProxyDescription: "Faire confiance aux en-têtes 'X-Forwarded-*'. Si vous souhaitez obtenir la bonne adresse IP client et que votre Uptime Kuma se situe derrière (nginx ou Apache) vous devez l'activer.",
+ wayToGetLineNotifyToken: "Vous pouvez obtenir un jeton d'accès auprès de {0}",
+ Examples: "Exemples",
+ "Home Assistant URL": "URL vers Home Assistant",
"Long-Lived Access Token": "Jeton d'accès de longue durée",
+ "Long-Lived Access Token can be created by clicking on your profile name (bottom left) and scrolling to the bottom then click Create Token. ": "Un jeton d'accès de longue durée peut être créé en cliquant sur le nom de votre profil (en bas à gauche) et en faisant défiler vers le bas, puis cliquez sur Créer un jeton. ",
+ "Notification Service": "Service de notifications",
+ "default: notify all devices": "par défaut: notifier tous les appareils",
+ "A list of Notification Services can be found in Home Assistant under \"Developer Tools > Services\" search for \"notification\" to find your device/phone name.": "Une liste des services de notification peut être trouvée dans Home Assistant sous \"Outils de développement > Services\" recherchez \"notification\" pour trouver le nom de votre appareil/téléphone.",
+ "Automations can optionally be triggered in Home Assistant:": "Les automatisations peuvent éventuellement être déclenchées dans Home Assistant : ",
+ "Trigger type:": "Type de déclencheur : ",
+ "Event type:": "Type d'événement : ",
+ "Event data:": "Données d'événement : ",
"Then choose an action, for example switch the scene to where an RGB light is red.": "Ensuite, choisissez une action, par exemple basculer la scène là où une lumière RVB est rouge.",
- "Frontend Version": "Frontend Version",
- "Frontend Version do not match backend version!": "La version frontale ne correspond pas à la version principale !",
+ "Frontend Version": "Version frontend",
+ "Frontend Version do not match backend version!": "La version frontend ne correspond pas à la version backend !",
"Base URL": "URL de base",
- goAlertInfo: "GoAlert est une application open source pour la planification des appels, les escalades automatisées et les notifications (comme les SMS ou les appels vocaux). Engagez automatiquement la bonne personne, de la bonne manière et au bon moment ! {0}",
+ goAlertInfo: "GoAlert est une application open source pour la planification des appels, les escalades automatisées et les notifications (comme les SMS ou les appels vocaux). Impliquez automatiquement la bonne personne, de la bonne manière et au bon moment ! {0}",
goAlertIntegrationKeyInfo: "Obtenez la clé d'intégration d'API générique pour le service dans ce format \"aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee\" généralement la valeur du paramètre de jeton de l'URL copiée.",
goAlert: "GoAlert",
- backupOutdatedWarning: "Obsolète : étant donné que de nombreuses fonctionnalités ont été ajoutées et que cette fonctionnalité de sauvegarde est un peu non maintenue, elle ne peut pas générer ou restaurer une sauvegarde complète.",
+ backupOutdatedWarning: "Obsolète : étant donné que de nombreuses fonctionnalités ont été ajoutées et que cette fonctionnalité de sauvegarde est non maintenue, elle ne peut pas générer ou restaurer une sauvegarde complète.",
backupRecommend: "Veuillez sauvegarder le volume ou le dossier de données (./data/) directement à la place.",
Optional: "Optionnel",
squadcast: "Squadcast",
- Maintenance: "Maintenance",
- statusMaintenance: "Maintenance",
- "Schedule maintenance": "Planifier la maintenance",
- "Affected Monitors": "Moniteurs concernés",
- "Pick Affected Monitors...": "Sélectionnez les moniteurs concernés...",
- "Start of maintenance": "Début de la maintenance",
- "All Status Pages": "Toutes les pages d'état",
- "Select status pages...": "Sélectionnez les pages d'état...",
- recurringIntervalMessage: "Exécuter une fois par jour | Exécuter une fois tous les {0} jours",
- affectedMonitorsDescription: "Sélectionnez les moniteurs concernés par la maintenance en cours",
- affectedStatusPages: "Afficher ce message de maintenance sur les pages d'état sélectionnées",
- atLeastOneMonitor: "Sélectionnez au moins un moniteur concerné",
- deleteMaintenanceMsg: "Voulez-vous vraiment supprimer cette maintenance ?",
- pushyAPIKey: "Clé API secrète",
- pushyToken: "Jeton d'appareil",
+ SendKey: "SendKey",
+ "SMSManager API Docs": "Documentations de l'API SMSManager ",
+ "Gateway Type": "Type de passerelle",
+ SMSManager: "SMSManager",
"You can divide numbers with": "Vous pouvez diviser des nombres avec",
or: "ou",
recurringInterval: "Intervalle",
Recurring: "Récurrent",
- "Single Maintenance Window": "Fenêtre de maintenance unique",
- "Maintenance Time Window of a Day": "Fenêtre de temps de maintenance",
- "Effective Date Range": "Plage de dates d'effet",
- strategyManual: "activer/desactiver manuellement",
- warningTimezone: "Il utilise le fuseau horaire du serveur",
+ strategyManual: "Activer/désactiver manuellement",
+ warningTimezone: "Utilisation du fuseau horaire du serveur",
weekdayShortMon: "Lun",
weekdayShortTue: "Mar",
weekdayShortWed: "Mer",
@@ -566,11 +632,10 @@ export default {
dayOfMonth: "Jour du mois",
lastDay: "Dernier jour",
lastDay1: "Dernier jour du mois",
- lastDay2: "2ème dernier jour du mois",
+ lastDay2: "Avant-dernier jour du mois",
lastDay3: "3ème dernier jour du mois",
lastDay4: "4ème dernier jour du mois",
- "No Maintenance": "Aucune Maintenance",
- "Schedule Maintenance": "Crée une Maintenance",
+ "No Maintenance": "Aucune maintenance",
pauseMaintenanceMsg: "Voulez-vous vraiment mettre en pause ?",
"maintenanceStatus-under-maintenance": "En maintenance",
"maintenanceStatus-inactive": "Inactif",
@@ -579,42 +644,29 @@ export default {
"maintenanceStatus-unknown": "Inconnue",
"Display Timezone": "Afficher le fuseau horaire",
"Server Timezone": "Fuseau horaire du serveur",
+ statusPageMaintenanceEndDate: "Fin",
+ IconUrl: "URL vers l'icône",
+ "Enable DNS Cache": "Activer le cache DNS",
+ Enable: "Activer",
+ Disable: "Désactiver",
+ dnsCacheDescription: "Il peut ne pas fonctionner dans certains environnements IPv6, désactivez-le si vous rencontrez des problèmes.",
+ "Single Maintenance Window": "Créneau de maintenance unique",
+ "Maintenance Time Window of a Day": "Créneau de la maintenance",
+ "Effective Date Range": "Plage de dates d'effet",
+ "Schedule Maintenance": "Créer une maintenance",
"Date and Time": "Date et heure",
"DateTime Range": "Plage de dates et d'heures",
Strategy: "Stratégie",
- statusPageMaintenanceEndDate: "Fin",
"Free Mobile User Identifier": "Identifiant d'utilisateur Free Mobile",
- "Free Mobile API Key": "Clé API Free Mobile",
- enableGRPCTls: "Autoriser l'envoi d'une requête gRPC avec une connexion TLS",
- grpcMethodDescription: "Le nom de la méthode est converti au format cammelCase tel que sayHello, check, etc.",
- smseagleTo: "Numéro(s) de téléphone",
- smseagleGroup: "Nom(s) de groupe(s) de répertoire",
- smseagleContact: "Nom(s) de contact du répertoire",
- smseagleRecipientType: "Type de destinataire",
- smseagleRecipient: "Destinataire(s) (les multiples doivent être séparés par une virgule)",
- smseagleToken: "Jeton d'accès à l'API",
- smseagleUrl: "L'URL de votre appareil SMSEagle",
- smseagleEncoding: "Envoyer en Unicode",
- smseaglePriority: "Priorité des messages (0-9, par défaut = 0)",
- "Proxy Server": "Serveur proxy",
- promosmsLogin: "Nom de connexion API",
- promosmsPassword: "Mot de passe API",
- "SMSManager API Docs": "Documentations d'API SMSManager ",
- "Gateway Type": "Type de passerelle",
- webhookAdditionalHeadersTitle: "En-têtes supplémentaires",
- webhookAdditionalHeadersDesc: "Définit des en-têtes supplémentaires envoyés avec le webhook.",
+ "Free Mobile API Key": "Clé d'API Free Mobile",
"Enable TLS": "Activer le TLS",
"Proto Service Name": "Nom du service proto",
"Proto Method": "Méthode Proto",
"Proto Content": "Contenu proto",
- "Enable DNS Cache": "Activer le cache DNS",
- dnsCacheDescription: "Il peut ne pas fonctionner dans certains environnements IPv6, désactivez-le si vous rencontrez des problèmes.",
- Enable: "Activer",
- Disable: "Désactiver",
- "Economy": "économique",
+ "Economy": "Économique",
"Lowcost": "Faible coût",
"high": "Haute",
- "General Monitor Type": "Type de moniteur général",
- "Passive Monitor Type": "Type de moniteur passif",
- "Specific Monitor Type": "Type de moniteur spécifique",
+ "General Monitor Type": "Type de sonde générale",
+ "Passive Monitor Type": "Type de sonde passive",
+ "Specific Monitor Type": "Type de sonde spécifique",
};
From f6ea1fe9a57bac4e3c7b55a3200753ee54899592 Mon Sep 17 00:00:00 2001
From: thefourCraft
Date: Tue, 27 Dec 2022 08:04:53 +0200
Subject: [PATCH 0052/1864] he-IL (#2460)
---
package-lock.json | 4 +-
src/languages/he-IL.js | 672 +++++++++++++++++++++++++++++++++++++++++
2 files changed, 674 insertions(+), 2 deletions(-)
create mode 100644 src/languages/he-IL.js
diff --git a/package-lock.json b/package-lock.json
index 194962f8a0..d8b67781c4 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,12 +1,12 @@
{
"name": "uptime-kuma",
- "version": "1.19.0-beta.1",
+ "version": "1.19.0",
"lockfileVersion": 2,
"requires": true,
"packages": {
"": {
"name": "uptime-kuma",
- "version": "1.19.0-beta.1",
+ "version": "1.19.0",
"license": "MIT",
"dependencies": {
"@grpc/grpc-js": "~1.7.3",
diff --git a/src/languages/he-IL.js b/src/languages/he-IL.js
new file mode 100644
index 0000000000..d98b063dfb
--- /dev/null
+++ b/src/languages/he-IL.js
@@ -0,0 +1,672 @@
+export default {
+ languageName: "עברית",
+ checkEverySecond: "בדוק כל {0} שניות",
+ retryCheckEverySecond: "נסה שוב כל {0} שניות",
+ resendEveryXTimes: "התראה שוב כל {0} פעמים",
+ resendDisabled: "השליחה מחדש מושבתת",
+ retriesDescription: "מקסימום ניסיונות חוזרים לפני שהשירות יסומן כלא פעיל ונשלחת התראה",
+ ignoreTLSError: "התעלם משגיאת TLS/SSL עבור אתרי HTTPS",
+ upsideDownModeDescription: "הפוך את הסטטוס על הפוך. אם ניתן להגיע לשירות, הוא לא פעיל.",
+ maxRedirectDescription: "המספר המרבי של הפניות מחדש לעקוב. הגדר ל-0 כדי להשבית הפניות מחדש.",
+ enableGRPCTls: "אפשר לשלוח בקשת gRPC עם חיבור TLS",
+ grpcMethodDescription: "שם השיטה מומר לפורמט cammelCase כגון sayHello, check וכו.",
+ acceptedStatusCodesDescription: "בחר קודי סטטוס שנחשבים לתגובה מוצלחת.",
+ Maintenance: "תחזוקה",
+ statusMaintenance: "תחזוקה",
+ "Schedule maintenance": "תחזוקה מתוכננת",
+ "Affected Monitors": "מוניטורים מושפעים",
+ "Pick Affected Monitors...": "בחר המוניטרים מושפעים...",
+ "Start of maintenance": "תחילת תחזוקה",
+ "All Status Pages": "כל דפי הסטטוס",
+ "Select status pages...": "בחר דפי סטטוס...",
+ recurringIntervalMessage: "רוץ פעם ביום | הפעל אחת ל-{0} ימים",
+ affectedMonitorsDescription: "בחר מוניטורים שמושפעים מהתחזוקה הנוכחית",
+ affectedStatusPages: "הצג הודעת תחזוקה זו בדפי סטטוס שנבחרו",
+ atLeastOneMonitor: "בחר לפחות מוניטור אחד מושפע",
+ passwordNotMatchMsg: "הסיסמאות לא תואמות",
+ notificationDescription: "יש להקצות התראות למוניטור כדי שהן יעבדו.",
+ keywordDescription: "חפש מילת מפתח בתגובת HTML או JSON רגילה. החיפוש תלוי רישיות.",
+ pauseDashboardHome: "עצור",
+ deleteMonitorMsg: "האם אתה בטוח שברצונך למחוק את המוניטור הזה?",
+ deleteMaintenanceMsg: "האם אתה בטוח שברצונך למחוק את התחזוקה הזו?",
+ deleteNotificationMsg: "האם אתה בטוח שברצונך למחוק את ההודעה הזו עבור כל מוניטרים?",
+ dnsPortDescription: "יציאת שרת DNS. ברירת המחדל היא 53. אתה יכול לשנות את היציאה בכל עת.",
+ resolverserverDescription: "Cloudflare הוא שרת ברירת המחדל. אתה יכול לשנות את שרת הפותר בכל עת.",
+ rrtypeDescription: "בחר את סוג ה-RR שברצונך לפקח עליו",
+ pauseMonitorMsg: "האם אתה בטוח רוצה להשהות?",
+ enableDefaultNotificationDescription: "הודעה זו תופעל כברירת מחדל עבור מוניטרים חדשים. אתה עדיין יכול להשבית את ההודעה בנפרד עבור כל מוניטור.",
+ clearEventsMsg: "האם אתה בטוח שברצונך למחוק את כל האירועים עבור המוניטור הזה?",
+ clearHeartbeatsMsg: "האם אתה בטוח שברצונך למחוק את כל פעימות הלב עבור המוניטור הזה?",
+ confirmClearStatisticsMsg: "האם אתה בטוח שברצונך למחוק את כל הנתונים הסטטיסטיים?",
+ importHandleDescription: "בחר 'דלג על קיים' אם ברצונך לדלג על כל מוניטור או התראה באותו שם. 'החלף' ימחק כל מוניטור והתראה קיימים.",
+ confirmImportMsg: "האם אתה בטוח שברצונך לייבא את הגיבוי? אנא ודא שבחרת באפשרות הייבוא הנכונה.",
+ twoFAVerifyLabel: "אנא הזן את האסימון שלך כדי לאמת מערכת אדוש:",
+ tokenValidSettingsMsg: "האסימון תקף! כעת אתה יכול לשמור את הגדרות האדוש.",
+ confirmEnableTwoFAMsg: "האם אתה בטוח שברצונך להפעיל את מערכת אדוש?",
+ confirmDisableTwoFAMsg: "Are you sure you want to disable 2FA?",
+ Settings: "הגדרות",
+ Dashboard: "פאנל ניהול",
+ "New Update": "עדכון חדש",
+ Language: "שפה",
+ Appearance: "נראות",
+ Theme: "ערכת נושא",
+ General: "כללי",
+ "Primary Base URL": "כתובת האתר הראשית של הבסיס",
+ Version: "גרסה",
+ "Check Update On GitHub": "לבדוק עדכונים בגיטהאב",
+ List: "רשימה",
+ Add: "הוסף",
+ "Add New Monitor": "הוספת מוניטור חדש",
+ "Quick Stats": "נתונים בקצרה",
+ Up: "פעיל",
+ Down: "לא פעיל",
+ Pending: "ממתין",
+ Unknown: "לא יודע",
+ Pause: "עצור",
+ Name: "שם",
+ Status: "סטטוס",
+ DateTime: "תאריך שעה",
+ Message: "הודעה",
+ "No important events": "אין אירועים חשובים",
+ Resume: "המשך",
+ Edit: "עריכה",
+ Delete: "מחיקה",
+ Current: "עכשיו",
+ Uptime: "זמן פעילות",
+ "Cert Exp.": "Cert Exp.",
+ day: "יום | ימים",
+ "-day": "-יום",
+ hour: "שעה",
+ "-hour": "-שעה",
+ Response: "תגובה",
+ Ping: "פינג",
+ "Monitor Type": "סוג מוניטור",
+ Keyword: "מילת מפתח",
+ "Friendly Name": "שם ידידותי",
+ URL: "כתובת אתר",
+ Hostname: "שם המארח",
+ Port: "פורט",
+ "Heartbeat Interval": "מרווח פעימות",
+ Retries: "נסיונות חוזרים",
+ "Heartbeat Retry Interval": "מרווח נסיונות חוזר של פעימות",
+ "Resend Notification if Down X times consequently": "שלח שוב הודעה אם ירד X פעמים כתוצאה מכך",
+ Advanced: "מתקדם",
+ "Upside Down Mode": "מצב הפוך",
+ "Max. Redirects": "מקסימום הפניות מחדש",
+ "Accepted Status Codes": "קודי סטטוס מקובלים",
+ "Push URL": "דחף כתובת URL",
+ needPushEvery: "עליך להתקשר לכתובת האתר הזו כל {0} שניות.",
+ pushOptionalParams: "פרמטרים אופציונליים: {0}",
+ Save: "שמירה",
+ Notifications: "התראות",
+ "Not available, please setup.": "לא זמין, אנא הגדר.",
+ "Setup Notification": "הודעת הגדרה",
+ Light: "בהיר",
+ Dark: "חושך",
+ Auto: "אוטומטי",
+ "Theme - Heartbeat Bar": "ערכת נושא - Heartbeat Bar",
+ Normal: "נורמלי",
+ Bottom: "למטה",
+ None: "כלום",
+ Timezone: "אזור זמן",
+ "Search Engine Visibility": "נראות במנועי חיפוש",
+ "Allow indexing": "אפשר הוספה לאינדקס",
+ "Discourage search engines from indexing site": "לא לעודד מנועי חיפוש לאינדקס אתרים",
+ "Change Password": "שנה סיסמא",
+ "Current Password": "סיסמה נוכחית",
+ "New Password": "סיסמה חדשה",
+ "Repeat New Password": "חזור על סיסמה חדשה",
+ "Update Password": "עדכן סיסמה",
+ "Disable Auth": "השבתת אבטחה",
+ "Enable Auth": "הפעלת אבטחה",
+ "disableauth.message1": "האם אתה בטוח שברצונך להשבית את האבטחה?",
+ "disableauth.message2": "הוא מיועד לתרחישים שבהם אתה מתכוון ליישם אימות של צד שלישי מול Uptime Kuma כגון Cloudflare Access, Authelia או מנגנוני אימות אחרים.",
+ "Please use this option carefully!": "אנא השתמש באפשרות זו בזהירות!",
+ Logout: "התנתקות",
+ Leave: "יציאה",
+ "I understand, please disable": "אני מבין, אני רוצה להשבית",
+ Confirm: "אישור",
+ Yes: "כן",
+ No: "לא",
+ Username: "שם משתמש",
+ Password: "סיסמה",
+ "Remember me": "זכור אותי",
+ Login: "התחברות",
+ "No Monitors, please": "בלי מוניטורים, בבקשה",
+ "add one": "להוסיף אחד",
+ "Notification Type": "סוג התראה",
+ Email: "אימייל",
+ Test: "Test",
+ "Certificate Info": "פרטי תעודת אבטחה",
+ "Resolver Server": "שרת פותר",
+ "Resource Record Type": "סוג רשומת משאבים",
+ "Last Result": "תוצאה אחרונה",
+ "Create your admin account": "צור את חשבון הניהול שלך",
+ "Repeat Password": "חזור על הסיסמה",
+ "Import Backup": "ייבוא גיבוי",
+ "Export Backup": "ייצוא גיבוי",
+ Export: "ייצוא",
+ Import: "ייבוא",
+ respTime: "רפ. זמן (ms)",
+ notAvailableShort: "N/A",
+ "Default enabled": "ברירת המחדל מופעלת",
+ "Apply on all existing monitors": "החל על כל המסכים הקיימים",
+ Create: "ליצור",
+ "Clear Data": "נקה נתונים",
+ Events: "אירועים",
+ Heartbeats: "פעימות לב",
+ "Auto Get": "קבל אוטומטי",
+ backupDescription: "אתה יכול לגבות את כל המסכים וההתראות לקובץ JSON.",
+ backupDescription2: "הערה: היסטוריה ונתוני אירועים אינם כלולים.",
+ backupDescription3: "נתונים רגישים כגון אסימוני הודעה כלולים בקובץ הייצוא; נא לאחסן יצוא בצורה מאובטחת.",
+ alertNoFile: "אנא בחר קובץ לייבוא.",
+ alertWrongFileType: "אנא בחר קובץ JSON.",
+ "Clear all statistics": "נקה את כל הנתונים הסטטיסטיים",
+ "Skip existing": "דילוג על הקיים",
+ Overwrite: "החלף",
+ Options: "אפשרויות",
+ "Keep both": "שמור את שניהם",
+ "Verify Token": "אמת את האסימון",
+ "Setup 2FA": "הגדרת מערכת אדוש",
+ "Enable 2FA": "הפעלת אדוש",
+ "Disable 2FA": "כיבוי אדוש",
+ "2FA Settings": "הגדרות אדוש",
+ "Two Factor Authentication": "אימות דו-שלבי (מערכת אדוש)",
+ Active: "מופעל",
+ Inactive: "קבוי",
+ Token: "אסימון",
+ "Show URI": "הצג URI",
+ Tags: "תגים",
+ "Add New below or Select...": "הוסף חדש למטה או בחר...",
+ "Tag with this name already exist.": "תג בשם זה כבר קיים.",
+ "Tag with this value already exist.": "תג עם ערך זה כבר קיים.",
+ color: "צבע",
+ "value (optional)": "ערך (אופציונלי)",
+ Gray: "אפור",
+ Red: "אדום",
+ Orange: "כתום",
+ Green: "ירוק",
+ Blue: "כחול",
+ Indigo: "כחול כהה",
+ Purple: "סגול",
+ Pink: "כתום",
+ "Search...": "לחפש...",
+ "Avg. Ping": "פינג ממוצע",
+ "Avg. Response": "ממוצע תגובה",
+ "Entry Page": "דף כניסה",
+ statusPageNothing: "אין כאן שום דבר, בבקשה הוסף קבוצה או מוניטור.",
+ "No Services": "אין שירותים",
+ "All Systems Operational": "כל המערכות עובדות",
+ "Partially Degraded Service": "שירות פגום חלקית",
+ "Degraded Service": "שירות פגום",
+ "Add Group": "הוסף קבוצה",
+ "Add a monitor": "הוסף מוניטור",
+ "Edit Status Page": "ערוך דף סטטוס",
+ "Go to Dashboard": "מעבר לפאנל",
+ "Status Page": "דף סטטוס",
+ "Status Pages": "דפי סטטוס",
+ defaultNotificationName: "התראת {notification} שלי ({number})",
+ here: "פה",
+ Required: "נדרש",
+ telegram: "טלגרם",
+ "Bot Token": "אסימון בוט",
+ wayToGetTelegramToken: "אתה יכול לקבל אסימון מ-{0}.",
+ "Chat ID": "מזהה צ'אט",
+ supportTelegramChatID: "תמיכה בצ'אט ישיר / קבוצה / מזהה הצ'אט של הערוץ",
+ wayToGetTelegramChatID: "אתה יכול לקבל את מזהה הצ'אט שלך על ידי שליחת הודעה לבוט ומעבר לכתובת האתר הזו כדי להציג את ה-chat_id:",
+ "YOUR BOT TOKEN HERE": "אסימון הבוט שלך כאן",
+ chatIDNotFound: "מזהה צ'אט לא נמצא; אנא שלח הודעה לבוט זה תחילה",
+ webhook: "Webhook",
+ "Post URL": "כתובת אתר של פוסט",
+ "Content Type": "סוג התוכן",
+ webhookJsonDesc: "{0} מתאים לכל שרתי HTTP מודרניים כגון Express.js",
+ webhookFormDataDesc: "{multipart} טוב ל-PHP. יהיה צורך לנתח את ה-JSON באמצעות {decodeFunction}",
+ webhookAdditionalHeadersTitle: "כותרות נוספות",
+ webhookAdditionalHeadersDesc: "מגדיר כותרות נוספות שנשלחות עם ה-webhook.",
+ smtp: "אימייל (SMTP)",
+ secureOptionNone: "None / STARTTLS (25, 587)",
+ secureOptionTLS: "TLS (465)",
+ "Ignore TLS Error": "התעלם משגיאת TLS",
+ "From Email": "אמייל שולח",
+ emailCustomSubject: "נושא מותאם אישית",
+ "To Email": "למייל",
+ smtpCC: "עותק",
+ smtpBCC: "עותק מוסתר",
+ discord: "דיסקורד",
+ "Discord Webhook URL": "כתובת אתר של Discord Webhook",
+ wayToGetDiscordURL: "אתה יכול לקבל זאת על ידי מעבר להגדרות שרת -> אינטגרציות -> צור Webhook",
+ "Bot Display Name": "שם תצוגה של בוט",
+ "Prefix Custom Message": "קידומת הודעה מותאמת אישית",
+ "Hello @everyone is...": "שלום {'@'}כולם...",
+ teams: "Microsoft Teams",
+ "Webhook URL": "כתובת האתר של Webhook",
+ wayToGetTeamsURL: "אתה יכול ללמוד כיצד ליצור כתובת אתר ל-webhook {0}.",
+ signal: "אוֹת",
+ Number: "מספר",
+ Recipients: "נמענים",
+ needSignalAPI: "אתה צריך שיהיה לך לקוח איתות עם REST API.",
+ wayToCheckSignalURL: "אתה יכול לבדוק את כתובת האתר הזו כדי לראות כיצד להגדיר אחת:",
+ signalImportant: "חשוב: לא ניתן לערבב קבוצות ומספרים בנמענים!",
+ gotify: "Gotify",
+ "Application Token": "אסימון אפליקציה",
+ "Server URL": "כתובת האתר של השרת",
+ Priority: "עדיפות",
+ slack: "Slack",
+ "Icon Emoji": "אייקון אימוג'י",
+ "Channel Name": "שם הערוץ",
+ "Uptime Kuma URL": "Uptime Kuma URL",
+ aboutWebhooks: "מידע נוסף על Webhooks ב: {0}",
+ aboutChannelName: "הזן את שם הערוץ בשדה {0} שם ערוץ אם ברצונך לעקוף את ערוץ Webhook. לדוגמה: #ערוץ אחר",
+ aboutKumaURL: "אם תשאיר את השדה Uptime Kuma URL ריק, הוא יעבור כברירת מחדל לעמוד Project GitHub.",
+ emojiCheatSheet: "גיליון הונאה של אמוג'י: {0}",
+ "rocket.chat": "Rocket.Chat",
+ pushover: "Pushover",
+ pushy: "Pushy",
+ PushByTechulus: "Push by Techulus",
+ octopush: "Octopush",
+ promosms: "PromoSMS",
+ clicksendsms: "ClickSend SMS",
+ lunasea: "LunaSea",
+ apprise: "Apprise (תומך ב-50+ שירותי התראות)",
+ GoogleChat: "Google Chat (Google Workspace בלבד)",
+ pushbullet: "Pushbullet",
+ line: "Line Messenger",
+ mattermost: "Mattermost",
+ "User Key": "מפתח משתמש",
+ Device: "התקן",
+ "Message Title": "כותרת ההודעה",
+ "Notification Sound": "צליל התראה",
+ "More info on:": "מידע נוסף על: {0}",
+ pushoverDesc1: "לעדיפות חירום (2) יש פסק זמן של 30 שניות ברירת מחדל בין ניסיונות חוזרים, והיא תפוג לאחר שעה.",
+ pushoverDesc2: "אם ברצונך לשלוח התראות למכשירים שונים, מלא את שדה התקן.",
+ "SMS Type": "סוג SMS",
+ octopushTypePremium: "פרימיום (מהיר - מומלץ להתראה)",
+ octopushTypeLowCost: "עלות נמוכה (איטית - לפעמים חסומה על ידי המפעיל)",
+ checkPrice: "בדוק מחירים של {0}:",
+ apiCredentials: "אישורי API",
+ octopushLegacyHint: "האם אתה משתמש בגרסה הישנה של Octopush (2011-2020) או בגרסה החדשה?",
+ "Check octopush prices": "בדוק מחירי תמנון {0}.",
+ octopushPhoneNumber: "מספר טלפון (פורמט אינטלי, למשל: +33612345678)",
+ octopushSMSSender: "שם שולח SMS: 3-11 תווים אלפאנומריים ורווח (a-zA-Z0-9)",
+ "LunaSea Device ID": "מזהה מכשיר LunaSea",
+ "Apprise URL": "Apprise URL",
+ "Example:": "דוגמה: {0}",
+ "Read more:": "קרא עוד: {0}",
+ "Status:": "סטטוס: {0}",
+ "Read more": "קרא עוד",
+ appriseInstalled: "Apprise מותקן.",
+ appriseNotInstalled: "Apprise אינו מותקן. {0}",
+ "Access Token": "אסימון גישה",
+ "Channel access token": "אסימון גישה לערוץ",
+ "Line Developers Console": "קונסולת מפתחים",
+ lineDevConsoleTo: "קו מפתחי קונסולת - {0}",
+ "Basic Settings": "הגדרות בסיסיות",
+ "User ID": "תעודת זהות של משתמש",
+ "Messaging API": "Messaging API",
+ wayToGetLineChannelToken: "תחילה גש ל-{0}, צור ספק וערוץ (Messaging API), לאחר מכן תוכל לקבל את אסימון הגישה לערוץ ומזהה המשתמש מפריטי התפריט שהוזכרו לעיל.",
+ "Icon URL": "כתובת אתר של סמל",
+ aboutIconURL: "אתה יכול לספק קישור לתמונה ב\"כתובת URL של סמל\" כדי לעקוף את תמונת הפרופיל המוגדרת כברירת מחדל. לא ישמש אם Icon Emoji מוגדר.",
+ aboutMattermostChannelName: "אתה יכול לעקוף את ערוץ ברירת המחדל שאליו ה-Webhook מפרסם על ידי הזנת שם הערוץ בשדה \"שם ערוץ\". זה צריך להיות מופעל בהגדרות Mattermos Webhook. לדוגמה: #ערוץ אחר",
+ matrix: "Matrix",
+ promosmsTypeEco: "SMS ECO - זול אך איטי ולעיתים עמוס מדי. מוגבל רק לנמענים פולנים.",
+ promosmsTypeFlash: "SMS FLASH - ההודעה תוצג אוטומטית במכשיר הנמען. מוגבל לנמענים פולנים בלבד.",
+ promosmsTypeFull: "SMS FULL - שכבת פרימיום של SMS, אתה יכול להשתמש בשם השולח שלך (עליך לרשום את השם תחילה). אמין להתראות.",
+ promosmsTypeSpeed: "SMS SPEED - העדיפות הגבוהה ביותר במערכת. מאוד מהיר ואמין אבל יקר (בערך פי שניים ממחיר מלא של SMS).",
+ promosmsPhoneNumber: "מספר טלפון (לנמען פולני ניתן לדלג על אזורי חיוג)",
+ promosmsSMSSender: "שם שולח SMS: שם רשום מראש או אחת מברירות המחדל: InfoSMS, SMS Info, MaxSMS, INFO, SMS",
+ "Feishu WebHookUrl": "Feishu WebHookURL",
+ matrixHomeserverURL: "כתובת האתר של שרת הבית (עם http(s):// ויציאה אופציונלית)",
+ "Internal Room Id": "מזהה חדר פנימי",
+ matrixDesc1: "אתה יכול למצוא את מזהה החדר הפנימי על ידי עיון בחלק המתקדם של לקוח Matrix שלך בהגדרות החדר. זה צריך להיראות כמו !QMdRCpUIfLwsfjxye6:home.server.",
+ matrixDesc2: "מומלץ מאוד ליצור משתמש חדש ולא להשתמש באסימון הגישה של משתמש מטריקס משלך שכן הוא יאפשר גישה מלאה לחשבון שלך ולכל החדרים שהצטרפת אליהם. במקום זאת, צור משתמש חדש והזמן אותו רק לחדר שבו תרצה לקבל את ההתראה. תוכל לקבל את אסימון הגישה על ידי הפעלת {0}",
+ Method: "Method",
+ Body: "Body",
+ Headers: "Headers",
+ PushUrl: "Push URL",
+ HeadersInvalidFormat: "כותרות הבקשה אינן JSON חוקיות:",
+ BodyInvalidFormat: "גוף הבקשה אינו JSON חוקי:",
+ "Monitor History": "מעקב אחר היסטוריה",
+ clearDataOlderThan: "שמור את נתוני היסטוריית הצג למשך {0} ימים.",
+ PasswordsDoNotMatch: "סיסמאות לא תואמות.",
+ records: "רשומות",
+ "One record": "שיא אחד",
+ steamApiKeyDescription: "לניטור שרת משחקי Steam אתה צריך מפתח Steam Web-API. אתה יכול לרשום את מפתח ה-API שלך כאן:",
+ "Current User": "משתמש נוכחי",
+ topic: "נושא",
+ topicExplanation: "נושא MQTT למעקב",
+ successMessage: "הודעת הצלחה",
+ successMessageExplanation: "הודעת MQTT שתיחשב כהצלחה",
+ recent: "לאחרונה",
+ Done: "בוצע",
+ Info: "מידע",
+ Security: "אבטחה",
+ "Steam API Key": "מפתח API Steam",
+ "Shrink Database": "מסד נתונים מכווץ",
+ "Pick a RR-Type...": "בחר סוג RR ...",
+ "Pick Accepted Status Codes...": "בחר קודי סטטוס מקובלים ...",
+ Default: "בְּרִירַת מֶחדָל",
+ "HTTP Options": "אפשרויות HTTP",
+ "Create Incident": "ליצור אירוע",
+ Title: "כותרת",
+ Content: "תוֹכֶן",
+ Style: "Style",
+ info: "מידע",
+ warning: "אַזהָרָה",
+ danger: "סַכָּנָה",
+ error: "שְׁגִיאָה",
+ critical: "קריטי",
+ primary: "יְסוֹדִי",
+ light: "אוֹר",
+ dark: "אפל",
+ Post: "הודעה",
+ "Please input title and content": "אנא הזן כותרת ותוכן",
+ Created: "נוצר",
+ "Last Updated": "עודכן לאחרונה",
+ Unpin: "ענן חוף",
+ "Switch to Light Theme": "לעבור לנושא האור",
+ "Switch to Dark Theme": "לעבור לנושא אפל",
+ "Show Tags": "Show Tags",
+ "Hide Tags": "הסתר תגיות",
+ Description: "תיאור",
+ "No monitors available.": "אין צגים זמינים.",
+ "Add one": "הוסף אחד",
+ "No Monitors": "אין צגים",
+ "Untitled Group": "קבוצה ללא כותרת",
+ Services: "שירותים",
+ Discard: "להשליך",
+ Cancel: "לְבַטֵל",
+ "Powered by": "פועל על",
+ shrinkDatabaseDescription: "ואקום מסד נתונים להפעיל עבור SQLITE.אם בסיס הנתונים שלך נוצר לאחר 1.10.0, Auto_VACUUM כבר מופעל ואין צורך בפעולה זו.",
+ serwersms: "SerwerSMS.pl",
+ serwersmsAPIUser: "API Username (incl. webapi_ prefix)",
+ serwersmsAPIPassword: "סיסמת API",
+ serwersmsPhoneNumber: "מספר טלפון",
+ serwersmsSenderName: "שם שולח SMS (רשום באמצעות פורטל לקוחות)",
+ smseagle: "SMSEagle",
+ smseagleTo: "מספרי טלפון)",
+ smseagleGroup: "שם קבוצת ספר טלפונים",
+ smseagleContact: "שם איש קשר בספר הטלפונים",
+ smseagleRecipientType: "Rסוג הנמען",
+ smseagleRecipient: "נמענים (ים) (יש להפריד בין מרובים לפסיק)",
+ smseagleToken: "API Access Token",
+ smseagleUrl: "כתובת האתר של מכשיר ה- SMSeagege שלך",
+ smseagleEncoding: "שלח כ- Unicode",
+ smseaglePriority: "עדיפות הודעה (0-9, ברירת מחדל = 0)",
+ stackfield: "סטאקפילד",
+ Customize: "התאמה אישית",
+ "Custom Footer": "כותרת תחתונה מותאמת אישית",
+ "Custom CSS": "CSS מותאם אישית",
+ smtpDkimSettings: "הגדרות DKIM",
+ smtpDkimDesc: "אנא עיין ב- NodeMailer DKIM {0} לשימוש.",
+ documentation: "ווקיפדיית מדריכים",
+ smtpDkimDomain: "שם דומיין",
+ smtpDkimKeySelector: "בורר מפתח",
+ smtpDkimPrivateKey: "טוראי של פרטיy",
+ smtpDkimHashAlgo: "אלגוריתם hash (אופציונלי)",
+ smtpDkimheaderFieldNames: "מפתחות כותרת לחתום (אופציונלי)",
+ smtpDkimskipFields: "מפתחות כותרת לא לחתום (אופציונלי)",
+ wayToGetPagerDutyKey: "אתה יכול להשיג זאת על ידי מעבר לשירות -> ספריית שירות -> (בחר שירות) -> אינטגרציות -> הוסף אינטגרציה.כאן תוכלו לחפש \"אירועים API v2 \".מידע נוסף {0}",
+ "Integration Key": "מפתח אינטגרציה",
+ "Integration URL": "URL אינטגרציה",
+ "Auto resolve or acknowledged": "פיתרון אוטומטי או הודה",
+ "do nothing": "לעשות כלום",
+ "auto acknowledged": "Auto הודה",
+ "auto resolve": "פתרון אוטומטי",
+ gorush: "Gorush",
+ alerta: "Alerta",
+ alertaApiEndpoint: "נקודת קצה של API",
+ alertaEnvironment: "סביבה",
+ alertaApiKey: "מפתח API",
+ alertaAlertState: "מצב התראה",
+ alertaRecoverState: "לשחזר מדינה",
+ deleteStatusPageMsg: "האם אתה בטוח רוצה למחוק את דף הסטטוס הזה?",
+ Proxies: "Proxies",
+ default: "בְּרִירַת מֶחדָל",
+ enabled: "מופעל",
+ setAsDefault: "נקבע כברירת מחדל",
+ deleteProxyMsg: "האם אתה בטוח רוצה למחוק את הפרוקסי הזה לכל המסכים?",
+ proxyDescription: "Proxies must be assigned to a monitor to function.",
+ enableProxyDescription: "פרוקסי זה לא ישפיע על בקשות צג עד שהוא יופעל.אתה יכול לשלוט באופן זמני להשבית את ה- Proxy מכל המסכים לפי מצב ההפעלה.",
+ setAsDefaultProxyDescription: "פרוקסי זה יופעל כברירת מחדל עבור צגים חדשים.אתה עדיין יכול להשבית את ה- Proxy בנפרד עבור כל צג.",
+ "Certificate Chain": "שרשרת אישורים",
+ Valid: "תָקֵף",
+ Invalid: "לא חוקי",
+ AccessKeyId: "מזהה AccessKey",
+ SecretAccessKey: "גישהלמפתחסוד",
+ PhoneNumbers: "מספר טלפוןs",
+ TemplateCode: "TemplateCode",
+ SignName: "שם שם",
+ "Sms template must contain parameters: ": "תבנית SMS חייבת להכיל פרמטרים: ",
+ "Bark Endpoint": "Bark Endpoint",
+ "Bark Group": "Bark Group",
+ "Bark Sound": "Bark Sound",
+ WebHookUrl: "WebHookUrl",
+ SecretKey: "מפתח סודי",
+ "For safety, must use secret key": "לבטיחות, חייב להשתמש במפתח סודיy",
+ "Device Token": "אסימון מכשיר",
+ Platform: "פּלַטפוֹרמָה",
+ iOS: "iOS",
+ Android: "דְמוּי אָדָם",
+ Huawei: "huawei",
+ High: "High",
+ Retry: "נסה שוב",
+ Topic: "נוֹשֵׂא",
+ "WeCom Bot Key": "WeCom Bot Key",
+ "Setup Proxy": "הגדרת פרוקסי",
+ "Proxy Protocol": "פרוטוקול פרוקסי",
+ "Proxy Server": "שרת פרוקסי",
+ "Proxy server has authentication": "לשרת ה- Proxy יש אימות",
+ User: "מִשׁתַמֵשׁ",
+ Installed: "מוּתקָן",
+ "Not installed": "לא מותקן",
+ Running: "רץ",
+ "Not running": "לא רץ",
+ "Remove Token": "הסר אסימון",
+ Start: "הַתחָלָה",
+ Stop: "תפסיק",
+ "Uptime Kuma": "Uptime Kuma",
+ "Add New Status Page": "הוסף דף סטטוס חדש",
+ Slug: "Slug",
+ "Accept characters:": "קבל תווים:",
+ startOrEndWithOnly: "התחל או סוף עם {0} בלבד",
+ "No consecutive dashes": "אין מקפים רצופים",
+ Next: "הַבָּא",
+ "The slug is already taken. Please choose another slug.": "השבלול כבר נלקח.אנא בחר שבלול נוסף.",
+ "No Proxy": "אין פרוקסי",
+ Authentication: "אבטחה",
+ "HTTP Basic Auth": "HTTP בסיסי Auth",
+ "New Status Page": "דף סטטוס חדש",
+ "Page Not Found": "הדף לא נמצא",
+ "Reverse Proxy": "פרוקסי הפוך",
+ Backup: "גיבוי",
+ About: "אודות",
+ wayToGetCloudflaredURL: "(הורד את CloudFlared מ- {0})",
+ cloudflareWebsite: "אתר CloudFlare",
+ "Message:": "הוֹדָעָה:",
+ "Don't know how to get the token? Please read the guide:": "לא יודע איך להשיג את האסימון?אנא קרא את המדריך:",
+ "The current connection may be lost if you are currently connecting via Cloudflare Tunnel. Are you sure want to stop it? Type your current password to confirm it.": "החיבור הנוכחי עשוי ללכת לאיבוד אם אתה מתחבר כרגע באמצעות מנהרת CloudFlare.האם אתה בטוח רוצה לעצור את זה?הקלד את הסיסמה הנוכחית שלך כדי לאשר אותה.",
+ "HTTP Headers": "כותרות HTTP",
+ "Trust Proxy": "אמון בפרוקסי",
+ "Other Software": "תוכנה אחרת",
+ "For example: nginx, Apache and Traefik.": "למשל: Nginx, Apache ו- Traefik.",
+ "Please read": "בבקשה תקרא",
+ "Subject:": "נושא:",
+ "Valid To:": "תקף ל:",
+ "Days Remaining:": "ימים שנותרו:",
+ "Issuer:": "המנפיק:",
+ "Fingerprint:": "טביעת אצבע:",
+ "No status pages": "אין דפי סטטוס",
+ "Domain Name Expiry Notification": "הודעה על תום שם תחום",
+ Proxy: "פרוקסי",
+ "Date Created": "תאריך יצירה",
+ HomeAssistant: "Home Assistant",
+ onebotHttpAddress: "כתובת HTTP של OneBot ",
+ onebotMessageType: "סוג ההודעה OneBot",
+ onebotGroupMessage: "קְבוּצָה",
+ onebotPrivateMessage: "פְּרָטִי",
+ onebotUserOrGroupId: "מזהה קבוצה/משתמש ",
+ onebotSafetyTips: "לבטיחות, חייב לקבוע אסימון גישה ",
+ "PushDeer Key": "PushDeer Key",
+ "Footer Text": "טקסט כותרת תחתונה ",
+ "Show Powered By": "הצג מופעל על ידי ",
+ "Domain Names": "שמות דומיין ",
+ signedInDisp: "חתום כ- {0} ",
+ signedInDispDisabled: "Auth מושבת.",
+ RadiusSecret: "רדיוס סוד",
+ RadiusSecretDescription: "סוד משותף בין לקוח לשרת",
+ RadiusCalledStationId: "נקרא מזהה תחנה",
+ RadiusCalledStationIdDescription: "מזהה של המכשיר הנקרא ",
+ RadiusCallingStationId: "מזהה תחנת שיחה ",
+ RadiusCallingStationIdDescription: "מזהה של מכשיר השיחה ",
+ "Certificate Expiry Notification": "הודעת תפוגה של אישור",
+ "API Username": "שם משתמש API",
+ "API Key": "מפתח API",
+ "Recipient Number": "מספר הנמען",
+ "From Name/Number": "משם/מספר",
+ "Leave blank to use a shared sender number.": "השאר ריק כדי להשתמש במספר שולח משותף.",
+ "Octopush API Version": "גרסת API של תמנון",
+ "Legacy Octopush-DM": "Legacy Octopush-DM",
+ endpoint: "נקודת קצה",
+ octopushAPIKey: "\"מפתח API \" מתוך תעודות API של HTTP בלוח הבקרה",
+ octopushLogin: "\"כניסה \" מתעודות API של HTTP בלוח הבקרה",
+ promosmsLogin: "שם כניסה של API",
+ promosmsPassword: "סיסמת API",
+ "pushoversounds pushover": "Pushover (ברירת מחדל)",
+ "pushoversounds bike": "אופניים",
+ "pushoversounds bugle": "חֲצוֹצְרָה",
+ "pushoversounds cashregister": "קופה רושמת",
+ "pushoversounds classical": "קלַאסִי",
+ "pushoversounds cosmic": "קוֹסמִי",
+ "pushoversounds falling": "נופל",
+ "pushoversounds gamelan": "gamelan",
+ "pushoversounds incoming": "נִכנָס",
+ "pushoversounds intermission": "Intermission",
+ "pushoversounds magic": "קֶסֶם",
+ "pushoversounds mechanical": "מֵכָנִי",
+ "pushoversounds pianobar": "בר פסנתר",
+ "pushoversounds siren": "סִירֶנָה",
+ "pushoversounds spacealarm": "אזעקת חלל",
+ "pushoversounds tugboat": "סירת משיכה",
+ "pushoversounds alien": "אזעקת חייזרים (ארוכה)",
+ "pushoversounds climb": "לטפס (ארוך)",
+ "pushoversounds persistent": "מתמיד (ארוך)",
+ "pushoversounds echo": "הד Pushover (ארוך)",
+ "pushoversounds updown": "למעלה (ארוך)",
+ "pushoversounds vibrate": "לרטוט בלבד",
+ "pushoversounds none": "אף אחד (שקט)",
+ pushyAPIKey: "מפתח API סודי",
+ pushyToken: "אסימון מכשיר",
+ "Show update if available": "הצג עדכון אם זמין",
+ "Also check beta release": "בדוק גם את שחרור הבטא",
+ "Using a Reverse Proxy?": "באמצעות פרוקסי הפוך?",
+ "Check how to config it for WebSocket": "בדוק כיצד להגדיר אותו ל- WebSocket",
+ "Steam Game Server": "שרת משחק קיטור",
+ "Most likely causes:": "ככל הנראה גורם:",
+ "The resource is no longer available.": "המשאב כבר לא זמין.",
+ "There might be a typing error in the address.": "יתכן שיש שגיאת הקלדה בכתובת.",
+ "What you can try:": "מה שאתה יכול לנסות:",
+ "Retype the address.": "הקלד מחדש את הכתובת.",
+ "Go back to the previous page.": "חזור לדף הקודם.",
+ "Coming Soon": "בקרוב",
+ wayToGetClickSendSMSToken: "אתה יכול לקבל שם משתמש API ומפתח API מ- {0}.",
+ "Connection String": "מחרוזת חיבור",
+ Query: "שאילתא",
+ settingsCertificateExpiry: "תפוגת תעודת TLS",
+ certificationExpiryDescription: "HTTPS עוקב אחר התראה על התראה כאשר תעודת TLS פגה ב:",
+ "Setup Docker Host": "הגדרת מארח Docker",
+ "Connection Type": "סוג חיבור",
+ "Docker Daemon": "Docker Daemon",
+ deleteDockerHostMsg: "האם אתה בטוח רוצה למחוק את המארח של Docker לכל המוניטורים?",
+ socket: "Socket",
+ tcp: "TCP / HTTP",
+ "Docker Container": "מיכל Docker",
+ "Container Name / ID": "שם מכולה / מזהה",
+ "Docker Host": "מארח דוקר",
+ "Docker Hosts": "מארחי Docker",
+ "ntfy Topic": "ntfy Topic",
+ Domain: "תְחוּם",
+ Workstation: "עמדת עבודה",
+ disableCloudflaredNoAuthMsg: "אתה לא נמצא במצב AUTH, אין צורך בסיסמה.",
+ trustProxyDescription: "סמוך על כותרות 'x-forwarded-*'.אם אתה רוצה להשיג את ה- IP של הלקוח הנכון וה- Uptime Kuma שלך מאחור כמו Nginx או Apache, עליך לאפשר זאת.",
+ wayToGetLineNotifyToken: "אתה יכול לקבל אסימון גישה מ- {0}",
+ Examples: "דוגמאות",
+ "Home Assistant URL": "כתובת URL עוזרת ביתית",
+ "Long-Lived Access Token": "אסימון גישה ארוכת שנים",
+ "Long-Lived Access Token can be created by clicking on your profile name (bottom left) and scrolling to the bottom then click Create Token. ": "ניתן ליצור אסימון גישה לאורך זמן על ידי לחיצה על שם הפרופיל שלך (שמאל למטה) וגלילה לתחתית ואז לחץ על צור אסימון. ",
+ "Notification Service": "Notification Service",
+ "default: notify all devices": "default: notify all devices",
+ "A list of Notification Services can be found in Home Assistant under \"Developer Tools > Services\" search for \"notification\" to find your device/phone name.": "רשימה של שירותי הודעה ניתן למצוא בעוזר הבית תחת \"כלי מפתחים> שירותים \" חפש \"הודעה \" כדי למצוא את שם המכשיר/טלפון שלך.",
+ "Automations can optionally be triggered in Home Assistant:": "אוטומציות יכולות להיות מופעלות באופן אופציונלי לעוזר הבית:",
+ "Trigger type:": "סוג ההדק:",
+ "Event type:": "סוג אירוע:",
+ "Event data:": "נתוני אירועים:",
+ "Then choose an action, for example switch the scene to where an RGB light is red.": "ואז בחר פעולה, למשל העבר את הסצינה למקום בו אור RGB הוא אדום.",
+ "Frontend Version": "גרסת Frontend",
+ "Frontend Version do not match backend version!": "גרסת Frontend לא תואמת את גרסת Backend!",
+ "Base URL": "Base URL",
+ goAlertInfo: "SAETRERT הוא יישום קוד פתוח לתזמון שיחה, הסלמות והודעות אוטומטיות (כמו SMS או שיחות קוליות).לעסוק אוטומטית את האדם הנכון, בדרך הנכונה ובזמן הנכון!{0}",
+ goAlertIntegrationKeyInfo: "קבל מפתח אינטגרציה של API גנרי לשירות בפורמט זה \"AAAAAAAA-BBB-CCCC-DDDD-EEEEEEEEEEE \" בדרך כלל הערך של פרמטר האסימון של URL שהועתק.",
+ goAlert: "GoAlert",
+ backupOutdatedWarning: "מיושם: מכיוון שהרבה תכונות שנוספו ותכונת הגיבוי הזו מעט לא מצומצמת, היא לא יכולה לייצר או לשחזר גיבוי שלם.",
+ backupRecommend: "אנא גבה את עוצמת הקול או את תיקיית הנתונים (./data/) ישירות במקום.",
+ Optional: "אופציונאלי",
+ squadcast: "Squadcast",
+ SendKey: "SendKey",
+ "SMSManager API Docs": "מסמכי API של SmsManager ",
+ "Gateway Type": "סוג שער",
+ SMSManager: "SMSManager",
+ "You can divide numbers with": "אתה יכול לחלק מספרים עם",
+ or: "אוֹ",
+ recurringInterval: "הפסקה",
+ Recurring: "מחזורי",
+ strategyManual: "פעיל/לא פעיל באופן ידני",
+ warningTimezone: "זה משתמש באזור הזמן של השרת",
+ weekdayShortMon: "שני",
+ weekdayShortTue: "שלישי",
+ weekdayShortWed: "רביעי",
+ weekdayShortThu: "חמישי",
+ weekdayShortFri: "שישי",
+ weekdayShortSat: "שבת",
+ weekdayShortSun: "ראשון",
+ dayOfWeek: "יום בשבוע",
+ dayOfMonth: "יום בחודש",
+ lastDay: "Last Day",
+ lastDay1: "היום האחרון של החודש",
+ lastDay2: "יום שני האחרון של החודש",
+ lastDay3: "יום 3 האחרון של החודש",
+ lastDay4: "היום הרביעי האחרון בחודש",
+ "No Maintenance": "אין תחזוקה",
+ pauseMaintenanceMsg: "האם אתה בטוח רוצה להשהות?",
+ "maintenanceStatus-under-maintenance": "מתבצעות עבודות תחזוקה",
+ "maintenanceStatus-inactive": "לא פעיל",
+ "maintenanceStatus-scheduled": "מתוזמן",
+ "maintenanceStatus-ended": "הסתיים",
+ "maintenanceStatus-unknown": "לא ידוע",
+ "Display Timezone": "הצג אזור זמן",
+ "Server Timezone": "אזור זמן של שרת",
+ statusPageMaintenanceEndDate: "סוך",
+ IconUrl: "קישור לתמונת אייקון",
+ "Enable DNS Cache": "הפעל מטמון DNS",
+ Enable: "הפעל",
+ Disable: "השבת",
+ dnsCacheDescription: "ייתכן שהוא לא עובד בסביבות IPv6 מסוימות, השבת אותו אם אתה נתקל בבעיות כלשהן.",
+ "Single Maintenance Window": "חלון תחזוקה בודד",
+ "Maintenance Time Window of a Day": "חלון זמן תחזוקה ביום",
+ "Effective Date Range": "טווח תאריכים אפקטיבי",
+ "Schedule Maintenance": "לוח זמנים לתחזוקה",
+ "Date and Time": "תאריך ושעה",
+ "DateTime Range": "טווח תאריכים וזמן",
+ Strategy: "אסטרטגיה",
+ "Free Mobile User Identifier": "מזהה משתמש נייד בחינם",
+ "Free Mobile API Key": "מפתח API חינם לנייד",
+ "Enable TLS": "אפשר TLS",
+ "Proto Service Name": "שם שירות פרוטו",
+ "Proto Method": "שיטת פרוטו",
+ "Proto Content": "תוכן פרוטו",
+ Economy: "חיסכון",
+ Lowcost: "זול",
+ high: "גבוהה",
+ "General Monitor Type": "מוניטור כללי",
+ "Passive Monitor Type": "מוניטור פסיבי",
+ "Specific Monitor Type": "סוג מוניטור ספציפי",
+};
From c60b741406d45c7678e16a53500f1359678bd95c Mon Sep 17 00:00:00 2001
From: 401Unauthorized
Date: Tue, 27 Dec 2022 14:05:45 +0800
Subject: [PATCH 0053/1864] Add kook notification provider
---
server/notification-providers/kook.js | 31 +++++++++++++++++++++++
server/notification.js | 2 ++
src/components/notifications/Kook.vue | 36 +++++++++++++++++++++++++++
src/components/notifications/index.js | 2 ++
src/languages/en.js | 4 +++
src/languages/zh-CN.js | 4 +++
6 files changed, 79 insertions(+)
create mode 100644 server/notification-providers/kook.js
create mode 100644 src/components/notifications/Kook.vue
diff --git a/server/notification-providers/kook.js b/server/notification-providers/kook.js
new file mode 100644
index 0000000000..b37b75ab1e
--- /dev/null
+++ b/server/notification-providers/kook.js
@@ -0,0 +1,31 @@
+const NotificationProvider = require("./notification-provider");
+const axios = require("axios");
+
+class Kook extends NotificationProvider {
+
+ name = "Kook";
+
+ async send(notification, msg, monitorJSON = null, heartbeatJSON = null) {
+ let okMsg = "Sent Successfully.";
+ let url = "https://www.kookapp.cn/api/v3/message/create";
+ let data = {
+ target_id: notification.kookGuildID,
+ content: msg,
+ };
+ let config = {
+ headers: {
+ "Authorization": "Bot " + notification.kookBotToken,
+ "Content-Type": "application/json",
+ },
+ };
+ try {
+ await axios.post(url, data, config);
+ return okMsg;
+
+ } catch (error) {
+ this.throwGeneralAxiosError(error);
+ }
+ }
+}
+
+module.exports = Kook;
diff --git a/server/notification.js b/server/notification.js
index 9069601b4f..6ff42e013e 100644
--- a/server/notification.js
+++ b/server/notification.js
@@ -14,6 +14,7 @@ const GoogleChat = require("./notification-providers/google-chat");
const Gorush = require("./notification-providers/gorush");
const Gotify = require("./notification-providers/gotify");
const HomeAssistant = require("./notification-providers/home-assistant");
+const Kook = require("./notification-providers/kook");
const Line = require("./notification-providers/line");
const LineNotify = require("./notification-providers/linenotify");
const LunaSea = require("./notification-providers/lunasea");
@@ -70,6 +71,7 @@ class Notification {
new Gorush(),
new Gotify(),
new HomeAssistant(),
+ new Kook(),
new Line(),
new LineNotify(),
new LunaSea(),
diff --git a/src/components/notifications/Kook.vue b/src/components/notifications/Kook.vue
new file mode 100644
index 0000000000..d618750b76
--- /dev/null
+++ b/src/components/notifications/Kook.vue
@@ -0,0 +1,36 @@
+
+
@@ -391,7 +391,7 @@ export default {
/**
* If the monitor is added to public list, which will not be in this list.
*/
- allMonitorList() {
+ sortedMonitorList() {
let result = [];
for (let id in this.$root.monitorList) {
@@ -401,6 +401,31 @@ export default {
}
}
+ result.sort((m1, m2) => {
+
+ if (m1.active !== m2.active) {
+ if (m1.active === 0) {
+ return 1;
+ }
+
+ if (m2.active === 0) {
+ return -1;
+ }
+ }
+
+ if (m1.weight !== m2.weight) {
+ if (m1.weight > m2.weight) {
+ return -1;
+ }
+
+ if (m1.weight < m2.weight) {
+ return 1;
+ }
+ }
+
+ return m1.pathName.localeCompare(m2.pathName);
+ });
+
return result;
},
From 98f5bc51a8929c6f4cdc1e3a1d23a858307b2549 Mon Sep 17 00:00:00 2001
From: Louis Lam
Date: Sat, 28 Jan 2023 12:38:39 +0800
Subject: [PATCH 0211/1864] Change golang version
---
docker/builder-go.dockerfile | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/docker/builder-go.dockerfile b/docker/builder-go.dockerfile
index 79c1a95bac..1d25843bcd 100644
--- a/docker/builder-go.dockerfile
+++ b/docker/builder-go.dockerfile
@@ -2,7 +2,7 @@
# Build in Golang
# Run npm run build-healthcheck-armv7 in the host first, another it will be super slow where it is building the armv7 healthcheck
############################################
-FROM golang:1.19.4-buster
+FROM golang:1.19-buster
WORKDIR /app
ARG TARGETPLATFORM
COPY ./extra/ ./extra/
From 1dc2546a3910528ed341537571bfc81615e37d48 Mon Sep 17 00:00:00 2001
From: Louis Lam
Date: Sat, 28 Jan 2023 13:39:23 +0800
Subject: [PATCH 0212/1864] Lint
---
src/router.js | 1 -
tsconfig.json | 2 +-
2 files changed, 1 insertion(+), 2 deletions(-)
diff --git a/src/router.js b/src/router.js
index 7bb474eef0..35647511f1 100644
--- a/src/router.js
+++ b/src/router.js
@@ -32,7 +32,6 @@ import Proxies from "./components/settings/Proxies.vue";
import Backup from "./components/settings/Backup.vue";
import About from "./components/settings/About.vue";
-
const routes = [
{
path: "/",
diff --git a/tsconfig.json b/tsconfig.json
index c54546424d..441d846edc 100644
--- a/tsconfig.json
+++ b/tsconfig.json
@@ -6,7 +6,7 @@
"module": "commonjs",
"lib": [
"es2020",
- "DOM",
+ "DOM"
],
"removeComments": false,
"preserveConstEnums": true,
From ddce8f0cb06016d20c4f1910693d5258f95ff275 Mon Sep 17 00:00:00 2001
From: Louis Lam
Date: Sat, 28 Jan 2023 19:00:13 +0800
Subject: [PATCH 0213/1864] Fix plugin installation
---
docker/alpine-base.dockerfile | 2 +-
docker/debian-base.dockerfile | 2 +-
server/plugins-manager.js | 37 ++++++++++++++++++-----
server/socket-handlers/plugins-handler.js | 8 +++--
src/components/settings/Plugins.vue | 2 +-
5 files changed, 38 insertions(+), 13 deletions(-)
diff --git a/docker/alpine-base.dockerfile b/docker/alpine-base.dockerfile
index 82bc7bb054..276d6e450d 100644
--- a/docker/alpine-base.dockerfile
+++ b/docker/alpine-base.dockerfile
@@ -3,6 +3,6 @@ FROM node:16-alpine3.12
WORKDIR /app
# Install apprise, iputils for non-root ping, setpriv
-RUN apk add --no-cache iputils setpriv dumb-init python3 py3-cryptography py3-pip py3-six py3-yaml py3-click py3-markdown py3-requests py3-requests-oauthlib && \
+RUN apk add --no-cache iputils setpriv dumb-init python3 py3-cryptography py3-pip py3-six py3-yaml py3-click py3-markdown py3-requests py3-requests-oauthlib git && \
pip3 --no-cache-dir install apprise==1.2.1 && \
rm -rf /root/.cache
diff --git a/docker/debian-base.dockerfile b/docker/debian-base.dockerfile
index d94b4c7fe6..026189c475 100644
--- a/docker/debian-base.dockerfile
+++ b/docker/debian-base.dockerfile
@@ -10,7 +10,7 @@ WORKDIR /app
# Stupid python3 and python3-pip actually install a lot of useless things into Debian, specify --no-install-recommends to skip them, make the base even smaller than alpine!
RUN apt update && \
apt --yes --no-install-recommends install python3 python3-pip python3-cryptography python3-six python3-yaml python3-click python3-markdown python3-requests python3-requests-oauthlib \
- sqlite3 iputils-ping util-linux dumb-init && \
+ sqlite3 iputils-ping util-linux dumb-init git && \
pip3 --no-cache-dir install apprise==1.2.1 && \
rm -rf /var/lib/apt/lists/* && \
apt --yes autoremove
diff --git a/server/plugins-manager.js b/server/plugins-manager.js
index e48c53c897..674ab96915 100644
--- a/server/plugins-manager.js
+++ b/server/plugins-manager.js
@@ -72,6 +72,12 @@ class PluginsManager {
* @param {string} name Directory name, also known as plugin unique name
*/
downloadPlugin(repoURL, name) {
+ if (fs.existsSync(this.pluginsDir + name)) {
+ log.info("plugin", "Plugin folder already exists? Removing...");
+ fs.rmSync(this.pluginsDir + name, {
+ recursive: true
+ });
+ }
log.info("plugin", "Installing plugin: " + name + " " + repoURL);
let result = Git.clone(repoURL, this.pluginsDir, name);
log.info("plugin", "Install result: " + result);
@@ -115,13 +121,19 @@ class PluginsManager {
* @returns {Promise<[]>}
*/
async fetchPluginList() {
- const res = await axios.get("https://uptime.kuma.pet/c/plugins.json");
- const list = res.data.pluginList;
+ let remotePluginList;
+ try {
+ const res = await axios.get("https://uptime.kuma.pet/c/plugins.json");
+ remotePluginList = res.data.pluginList;
+ } catch (e) {
+ log.error("plugin", "Failed to fetch plugin list: " + e.message);
+ remotePluginList = [];
+ }
for (let plugin of this.pluginList) {
let find = false;
// Try to merge
- for (let remotePlugin of list) {
+ for (let remotePlugin of remotePluginList) {
if (remotePlugin.name === plugin.info.name) {
find = true;
remotePlugin.installed = true;
@@ -136,17 +148,17 @@ class PluginsManager {
// Local plugin
if (!find) {
plugin.info.local = true;
- list.push(plugin.info);
+ remotePluginList.push(plugin.info);
}
}
// Sort Installed first, then sort by name
- return list.sort((a, b) => {
+ return remotePluginList.sort((a, b) => {
if (a.installed === b.installed) {
- if ( a.fullName < b.fullName ) {
+ if (a.fullName < b.fullName) {
return -1;
}
- if ( a.fullName > b.fullName ) {
+ if (a.fullName > b.fullName) {
return 1;
}
return 0;
@@ -191,15 +203,24 @@ class PluginWrapper {
let indexFile = this.pluginDir + "/index.js";
let packageJSON = this.pluginDir + "/package.json";
+ log.info("plugin", "Installing dependencies");
+
if (fs.existsSync(indexFile)) {
// Install dependencies
- childProcess.execSync("npm install", {
+ let result = childProcess.spawnSync("npm", [ "install" ], {
cwd: this.pluginDir,
env: {
+ ...process.env,
PLAYWRIGHT_BROWSERS_PATH: "../../browsers", // Special handling for read-browser-monitor
}
});
+ if (result.stdout) {
+ log.info("plugin", "Install dependencies result: " + result.stdout.toString("utf-8"));
+ } else {
+ log.warn("plugin", "Install dependencies result: no output");
+ }
+
this.pluginClass = require(path.join(process.cwd(), indexFile));
let pluginClassType = typeof this.pluginClass;
diff --git a/server/socket-handlers/plugins-handler.js b/server/socket-handlers/plugins-handler.js
index 4ee712c79c..533da309bc 100644
--- a/server/socket-handlers/plugins-handler.js
+++ b/server/socket-handlers/plugins-handler.js
@@ -1,5 +1,6 @@
const { checkLogin } = require("../util-server");
-const { PluginManager } = require("../plugins-manager");
+const { PluginsManager } = require("../plugins-manager");
+const { log } = require("../../src/util.js");
/**
* Handlers for plugins
@@ -15,7 +16,9 @@ module.exports.pluginsHandler = (socket, server) => {
try {
checkLogin(socket);
- if (PluginManager.disable) {
+ log.debug("plugin", "PluginManager.disable: " + PluginsManager.disable);
+
+ if (PluginsManager.disable) {
throw new Error("Plugin Disabled: In order to enable plugin feature, you need to use the default data directory: ./data/");
}
@@ -25,6 +28,7 @@ module.exports.pluginsHandler = (socket, server) => {
pluginList,
});
} catch (error) {
+ log.warn("plugin", "Error: " + error.message);
callback({
ok: false,
msg: error.message,
diff --git a/src/components/settings/Plugins.vue b/src/components/settings/Plugins.vue
index ca39e7adc3..614034fcb6 100644
--- a/src/components/settings/Plugins.vue
+++ b/src/components/settings/Plugins.vue
@@ -48,7 +48,7 @@ export default {
this.remotePluginList = res.pluginList;
this.remotePluginListMsg = "";
} else {
- this.remotePluginListMsg = this.$t("loadingError") + " " + res.message;
+ this.remotePluginListMsg = this.$t("loadingError") + " " + res.msg;
}
});
}
From aba515e17245a743362380d118a12a73c6113f08 Mon Sep 17 00:00:00 2001
From: Peace
Date: Sat, 28 Jan 2023 13:39:17 +0100
Subject: [PATCH 0214/1864] feat: disable childs if parent is disabled
---
server/model/monitor.js | 66 ++++++++++++++++++++++++++++++++---------
server/server.js | 4 +--
src/pages/Details.vue | 2 +-
3 files changed, 55 insertions(+), 17 deletions(-)
diff --git a/server/model/monitor.js b/server/model/monitor.js
index 821a8dbb41..e81c4ad38c 100644
--- a/server/model/monitor.js
+++ b/server/model/monitor.js
@@ -81,7 +81,8 @@ class Monitor extends BeanModel {
port: this.port,
maxretries: this.maxretries,
weight: this.weight,
- active: this.active,
+ active: await this.isActive(),
+ forceInactive: !await Monitor.isParentActive(this.id),
type: this.type,
interval: this.interval,
retryInterval: this.retryInterval,
@@ -141,6 +142,16 @@ class Monitor extends BeanModel {
return data;
}
+ /**
+ * Checks if the monitor is active based on itself and its parents
+ * @returns {Promise}
+ */
+ async isActive() {
+ const parentActive = await Monitor.isParentActive(this.id);
+
+ return this.active && parentActive;
+ }
+
/**
* Get all tags applied to this monitor
* @returns {Promise[]>}
@@ -259,22 +270,32 @@ class Monitor extends BeanModel {
} else if (this.type === "group") {
const children = await Monitor.getChildren(this.id);
- bean.status = UP;
- bean.msg = "All childs up and running";
- for (const child of children) {
- const lastBeat = await Monitor.getPreviousHeartbeat(child.id);
-
- // Only change state if the monitor is in worse conditions then the ones before
- if (bean.status === UP && (lastBeat.status === PENDING || lastBeat.status === DOWN)) {
- bean.status = lastBeat.status;
- } else if (bean.status === PENDING && lastBeat.status === DOWN) {
- bean.status = lastBeat.status;
+ if (children.length > 0) {
+ bean.status = UP;
+ bean.msg = "All childs up and running";
+ for (const child of children) {
+ if (!child.active) {
+ // Ignore inactive childs
+ continue;
+ }
+ const lastBeat = await Monitor.getPreviousHeartbeat(child.id);
+
+ // Only change state if the monitor is in worse conditions then the ones before
+ if (bean.status === UP && (lastBeat.status === PENDING || lastBeat.status === DOWN)) {
+ bean.status = lastBeat.status;
+ } else if (bean.status === PENDING && lastBeat.status === DOWN) {
+ bean.status = lastBeat.status;
+ }
}
- }
- if (bean.status !== UP) {
- bean.msg = "Child inaccessible";
+ if (bean.status !== UP) {
+ bean.msg = "Child inaccessible";
+ }
+ } else {
+ // Set status pending if group is empty
+ bean.status = PENDING;
}
+
} else if (this.type === "http" || this.type === "keyword") {
// Do not do any queries/high loading things before the "bean.ping"
let startTime = dayjs().valueOf();
@@ -1366,6 +1387,7 @@ class Monitor extends BeanModel {
/**
* Gets recursive all child ids
+ * @param {number} monitorID ID of the monitor to get
* @returns {Promise}
*/
static async getAllChildrenIDs(monitorID) {
@@ -1384,6 +1406,22 @@ class Monitor extends BeanModel {
return childrenIDs;
}
+
+ /**
+ *
+ * @param {number} monitorID ID of the monitor to get
+ * @returns {Promise}
+ */
+ static async isParentActive(monitorID) {
+ const parent = await Monitor.getParent(monitorID);
+
+ if (parent === null) {
+ return true;
+ }
+
+ const parentActive = await Monitor.isParentActive(parent.id);
+ return parent.active && parentActive;
+ }
}
module.exports = Monitor;
diff --git a/server/server.js b/server/server.js
index 003d948680..deca267da6 100644
--- a/server/server.js
+++ b/server/server.js
@@ -734,7 +734,7 @@ let needSetup = false;
await updateMonitorNotification(bean.id, monitor.notificationIDList);
- if (bean.active) {
+ if (bean.isActive()) {
await restartMonitor(socket.userID, bean.id);
}
@@ -1398,7 +1398,7 @@ let needSetup = false;
await updateMonitorNotification(bean.id, notificationIDList);
// If monitor was active start it immediately, otherwise pause it
- if (monitorListData[i].active === 1) {
+ if (monitorListData[i].isActive === 1) {
await startMonitor(socket.userID, bean.id);
} else {
await pauseMonitor(socket.userID, bean.id);
diff --git a/src/pages/Details.vue b/src/pages/Details.vue
index b4aae8fc9e..f2cd1a0236 100644
--- a/src/pages/Details.vue
+++ b/src/pages/Details.vue
@@ -25,7 +25,7 @@
{{ $t("Pause") }}
-
+ {{ $t("Resume") }}
From f3ac351d755ffa6ba9195a45db8bf7eea261c492 Mon Sep 17 00:00:00 2001
From: Peace
Date: Sat, 28 Jan 2023 14:02:10 +0100
Subject: [PATCH 0215/1864] feat: set childs under maintenance if parent is too
---
server/model/monitor.js | 12 ++++++-
.../maintenance-socket-handler.js | 2 +-
src/pages/EditMaintenance.vue | 34 +++++++++++++++----
3 files changed, 40 insertions(+), 8 deletions(-)
diff --git a/server/model/monitor.js b/server/model/monitor.js
index e81c4ad38c..17722f9fef 100644
--- a/server/model/monitor.js
+++ b/server/model/monitor.js
@@ -1322,7 +1322,17 @@ class Monitor extends BeanModel {
ON maintenance_timeslot.maintenance_id = maintenance.id
WHERE ${activeCondition}
LIMIT 1`, [ monitorID ]);
- return maintenance.count !== 0;
+
+ if (maintenance.count !== 0) {
+ return true;
+ }
+
+ // Check if parent is under maintenance
+ const parent = await Monitor.getParent(monitorID);
+ if (parent === null) {
+ return false;
+ }
+ return await Monitor.isUnderMaintenance(parent.id);
}
/** Make sure monitor interval is between bounds */
diff --git a/server/socket-handlers/maintenance-socket-handler.js b/server/socket-handlers/maintenance-socket-handler.js
index 929150cdda..870f9a0336 100644
--- a/server/socket-handlers/maintenance-socket-handler.js
+++ b/server/socket-handlers/maintenance-socket-handler.js
@@ -187,7 +187,7 @@ module.exports.maintenanceSocketHandler = (socket) => {
log.debug("maintenance", `Get Monitors for Maintenance: ${maintenanceID} User ID: ${socket.userID}`);
- let monitors = await R.getAll("SELECT monitor.id, monitor.name FROM monitor_maintenance mm JOIN monitor ON mm.monitor_id = monitor.id WHERE mm.maintenance_id = ? ", [
+ let monitors = await R.getAll("SELECT monitor.id FROM monitor_maintenance mm JOIN monitor ON mm.monitor_id = monitor.id WHERE mm.maintenance_id = ? ", [
maintenanceID,
]);
diff --git a/src/pages/EditMaintenance.vue b/src/pages/EditMaintenance.vue
index f0d87fe5a8..103506e356 100644
--- a/src/pages/EditMaintenance.vue
+++ b/src/pages/EditMaintenance.vue
@@ -33,7 +33,7 @@
v-model="affectedMonitors"
:options="affectedMonitorsOptions"
track-by="id"
- label="name"
+ label="pathName"
:multiple="true"
:close-on-select="false"
:clear-on-select="false"
@@ -342,17 +342,39 @@ export default {
},
},
mounted() {
- this.init();
-
this.$root.getMonitorList((res) => {
if (res.ok) {
- Object.values(this.$root.monitorList).map(monitor => {
+ Object.values(this.$root.monitorList).sort((m1, m2) => {
+
+ if (m1.active !== m2.active) {
+ if (m1.active === 0) {
+ return 1;
+ }
+
+ if (m2.active === 0) {
+ return -1;
+ }
+ }
+
+ if (m1.weight !== m2.weight) {
+ if (m1.weight > m2.weight) {
+ return -1;
+ }
+
+ if (m1.weight < m2.weight) {
+ return 1;
+ }
+ }
+
+ return m1.pathName.localeCompare(m2.pathName);
+ }).map(monitor => {
this.affectedMonitorsOptions.push({
id: monitor.id,
- name: monitor.name,
+ pathName: monitor.pathName,
});
});
}
+ this.init();
});
},
methods: {
@@ -387,7 +409,7 @@ export default {
this.$root.getSocket().emit("getMonitorMaintenance", this.$route.params.id, (res) => {
if (res.ok) {
Object.values(res.monitors).map(monitor => {
- this.affectedMonitors.push(monitor);
+ this.affectedMonitors.push(this.affectedMonitorsOptions.find(item => item.id === monitor.id));
});
} else {
toast.error(res.msg);
From faf3488b1ea00d97386477017248430c7c020dab Mon Sep 17 00:00:00 2001
From: Peace
Date: Sat, 28 Jan 2023 14:15:25 +0100
Subject: [PATCH 0216/1864] fix: unfold tree if monitor is accessed directly
---
src/components/MonitorListItem.vue | 7 ++++++-
1 file changed, 6 insertions(+), 1 deletion(-)
diff --git a/src/components/MonitorListItem.vue b/src/components/MonitorListItem.vue
index d62d9158f0..58e3e78b55 100644
--- a/src/components/MonitorListItem.vue
+++ b/src/components/MonitorListItem.vue
@@ -117,7 +117,12 @@ export default {
}
},
beforeMount() {
- // this.isCollapsed = localStorage.getItem(`monitor_${this.monitor.id}_collapsed`) === "true";
+
+ // Always unfold if monitor is accessed directly
+ if (this.monitor.childrenIDs.includes(parseInt(this.$route.params.id))) {
+ this.isCollapsed = false;
+ return;
+ }
let storage = window.localStorage.getItem("monitorCollapsed");
if (storage === null) {
From 9a46b50989619251fbb022ead0481e5f51cd09c5 Mon Sep 17 00:00:00 2001
From: Peace
Date: Sat, 28 Jan 2023 14:22:15 +0100
Subject: [PATCH 0217/1864] docs: add comments
---
server/model/monitor.js | 2 +-
src/components/MonitorList.vue | 1 +
src/components/MonitorListItem.vue | 7 +++++++
src/pages/EditMonitor.vue | 10 ++--------
4 files changed, 11 insertions(+), 9 deletions(-)
diff --git a/server/model/monitor.js b/server/model/monitor.js
index 17722f9fef..b784eed3c5 100644
--- a/server/model/monitor.js
+++ b/server/model/monitor.js
@@ -1418,7 +1418,7 @@ class Monitor extends BeanModel {
}
/**
- *
+ * Checks recursive if parent (ancestors) are active
* @param {number} monitorID ID of the monitor to get
* @returns {Promise}
*/
diff --git a/src/components/MonitorList.vue b/src/components/MonitorList.vue
index f9ec1d4e3a..c69169ccf4 100644
--- a/src/components/MonitorList.vue
+++ b/src/components/MonitorList.vue
@@ -79,6 +79,7 @@ export default {
result = result.filter(monitor => monitor.parent === null);
}
+ // Filter result by active state, weight and alphabetical
result.sort((m1, m2) => {
if (m1.active !== m2.active) {
diff --git a/src/components/MonitorListItem.vue b/src/components/MonitorListItem.vue
index 58e3e78b55..64f8a8e740 100644
--- a/src/components/MonitorListItem.vue
+++ b/src/components/MonitorListItem.vue
@@ -53,10 +53,12 @@ export default {
type: Object,
default: null,
},
+ /** If the user is currently searching */
isSearch: {
type: Boolean,
default: false,
},
+ /** How many ancestors are above this monitor */
depth: {
type: Number,
default: 0,
@@ -124,6 +126,7 @@ export default {
return;
}
+ // Set collapsed value based on local storage
let storage = window.localStorage.getItem("monitorCollapsed");
if (storage === null) {
return;
@@ -137,9 +140,13 @@ export default {
this.isCollapsed = storageObject[`monitor_${this.monitor.id}`];
},
methods: {
+ /**
+ * Changes the collapsed value of the current monitor and saves it to local storage
+ */
changeCollapsed() {
this.isCollapsed = !this.isCollapsed;
+ // Save collapsed value into local storage
let storage = window.localStorage.getItem("monitorCollapsed");
let storageObject = {};
if (storage !== null) {
diff --git a/src/pages/EditMonitor.vue b/src/pages/EditMonitor.vue
index ad554c4f54..8206215e5a 100644
--- a/src/pages/EditMonitor.vue
+++ b/src/pages/EditMonitor.vue
@@ -755,15 +755,9 @@ message HealthCheckResponse {
return null;
},
+ // Filter result by active state, weight and alphabetical
+ // Only return groups which arent't itself and one of its decendants
sortedMonitorList() {
- // return Object.values(this.$root.monitorList).filter(monitor => {
- // // Only return monitors which aren't related to the current selected
- // if (monitor.id === this.monitor.id || monitor.parent === this.monitor.id) {
- // return false;
- // }
- // return true;
- // });
-
let result = Object.values(this.$root.monitorList);
console.log(this.monitor.childrenIDs);
result = result.filter(monitor => monitor.type === "group");
From aee4c22deef2c90c595e79c3dea44cf6f77133cb Mon Sep 17 00:00:00 2001
From: Peace
Date: Sat, 28 Jan 2023 14:28:34 +0100
Subject: [PATCH 0218/1864] perf: only do one filter instead of 3 in
editMonitor
---
src/pages/EditMonitor.vue | 10 +++++++---
1 file changed, 7 insertions(+), 3 deletions(-)
diff --git a/src/pages/EditMonitor.vue b/src/pages/EditMonitor.vue
index 8206215e5a..b9783c558a 100644
--- a/src/pages/EditMonitor.vue
+++ b/src/pages/EditMonitor.vue
@@ -760,9 +760,13 @@ message HealthCheckResponse {
sortedMonitorList() {
let result = Object.values(this.$root.monitorList);
console.log(this.monitor.childrenIDs);
- result = result.filter(monitor => monitor.type === "group");
- result = result.filter(monitor => monitor.id !== this.monitor.id);
- result = result.filter(monitor => !this.monitor.childrenIDs?.includes(monitor.id));
+
+ // Only groups, not itself, not a decendant
+ result = result.filter(
+ monitor => monitor.type === "group" &&
+ monitor.id !== this.monitor.id &&
+ !this.monitor.childrenIDs?.includes(monitor.id)
+ );
result.sort((m1, m2) => {
From d48eb24046ed7f11350b3e85a9e4731486fa837a Mon Sep 17 00:00:00 2001
From: Peace
Date: Sat, 28 Jan 2023 14:28:53 +0100
Subject: [PATCH 0219/1864] docs: more comments
---
src/pages/EditMonitor.vue | 1 +
1 file changed, 1 insertion(+)
diff --git a/src/pages/EditMonitor.vue b/src/pages/EditMonitor.vue
index b9783c558a..7122ed39f2 100644
--- a/src/pages/EditMonitor.vue
+++ b/src/pages/EditMonitor.vue
@@ -768,6 +768,7 @@ message HealthCheckResponse {
!this.monitor.childrenIDs?.includes(monitor.id)
);
+ // Filter result by active state, weight and alphabetical
result.sort((m1, m2) => {
if (m1.active !== m2.active) {
From 661fa87134cb84a3674ca68263a1eae5c5e9e9b5 Mon Sep 17 00:00:00 2001
From: Peace
Date: Sat, 28 Jan 2023 14:53:40 +0100
Subject: [PATCH 0220/1864] feat: make parent link clickable
---
src/pages/Details.vue | 12 +++++++++++-
1 file changed, 11 insertions(+), 1 deletion(-)
diff --git a/src/pages/Details.vue b/src/pages/Details.vue
index f2cd1a0236..22e795bb10 100644
--- a/src/pages/Details.vue
+++ b/src/pages/Details.vue
@@ -1,7 +1,7 @@
- {{ group }}
+ {{ group }}
{{ monitor.name }}
@@ -190,6 +190,7 @@ import Pagination from "v-pagination-3";
const PingChart = defineAsyncComponent(() => import("../components/PingChart.vue"));
import Tag from "../components/Tag.vue";
import CertificateInfo from "../components/CertificateInfo.vue";
+import { getMonitorRelativeURL } from "../util.ts";
export default {
components: {
@@ -386,6 +387,15 @@ export default {
return this.$t(translationPrefix + "Ping");
},
+
+ /**
+ * Get URL of monitor
+ * @param {number} id ID of monitor
+ * @returns {string} Relative URL of monitor
+ */
+ monitorURL(id) {
+ return getMonitorRelativeURL(id);
+ },
},
};
From c444d787067713138853201a4f334adb022caecc Mon Sep 17 00:00:00 2001
From: Peace
Date: Sat, 28 Jan 2023 15:20:40 +0100
Subject: [PATCH 0221/1864] style: fix linting errors
---
src/components/MonitorListItem.vue | 10 +++++-----
1 file changed, 5 insertions(+), 5 deletions(-)
diff --git a/src/components/MonitorListItem.vue b/src/components/MonitorListItem.vue
index 64f8a8e740..7328dce8ea 100644
--- a/src/components/MonitorListItem.vue
+++ b/src/components/MonitorListItem.vue
@@ -141,8 +141,8 @@ export default {
},
methods: {
/**
- * Changes the collapsed value of the current monitor and saves it to local storage
- */
+ * Changes the collapsed value of the current monitor and saves it to local storage
+ */
changeCollapsed() {
this.isCollapsed = !this.isCollapsed;
@@ -182,7 +182,7 @@ export default {
.collapse-padding {
padding-left: 8px !important;
- padding-right: 2px !important;
+ padding-right: 2px !important;
}
// .monitor-item {
@@ -198,11 +198,11 @@ export default {
}
.collapsed {
- transform: rotate(-90deg);
+ transform: rotate(-90deg);
}
.animated {
- transition: all 0.2s $easing-in;
+ transition: all 0.2s $easing-in;
}
From 66573934f6cda34bd36b66dfbcc9fc2d2d415152 Mon Sep 17 00:00:00 2001
From: Peace
Date: Sat, 28 Jan 2023 15:21:17 +0100
Subject: [PATCH 0222/1864] refactor: remove old code
---
src/components/MonitorListItem.vue | 4 ----
1 file changed, 4 deletions(-)
diff --git a/src/components/MonitorListItem.vue b/src/components/MonitorListItem.vue
index 7328dce8ea..f61df20202 100644
--- a/src/components/MonitorListItem.vue
+++ b/src/components/MonitorListItem.vue
@@ -164,10 +164,6 @@ export default {
monitorURL(id) {
return getMonitorRelativeURL(id);
},
- // /** Clear the search bar */
- // clearSearchText() {
- // this.searchText = "";
- // }
},
};
From 6828d337aee65a65490d66d32c26e37a72e09f71 Mon Sep 17 00:00:00 2001
From: Louis Lam
Date: Mon, 30 Jan 2023 00:00:41 +0800
Subject: [PATCH 0223/1864] Disable HTTP(s) - Browser Engine
Reason: Unfortunately, after some test, I found that Playwright requires a lot of libraries to be installed on the Linux host in order to start Chrome or Firefox. It will be hard to install, so I hide this feature for now.
---
src/pages/EditMonitor.vue | 4 ++++
src/pages/Settings.vue | 5 ++++-
2 files changed, 8 insertions(+), 1 deletion(-)
diff --git a/src/pages/EditMonitor.vue b/src/pages/EditMonitor.vue
index 0f7fc4a583..0f7e86a3c8 100644
--- a/src/pages/EditMonitor.vue
+++ b/src/pages/EditMonitor.vue
@@ -71,12 +71,16 @@
+
+
diff --git a/src/pages/Settings.vue b/src/pages/Settings.vue
index 2b08d04ea7..b034a54112 100644
--- a/src/pages/Settings.vue
+++ b/src/pages/Settings.vue
@@ -113,9 +113,12 @@ export default {
backup: {
title: this.$t("Backup"),
},
+ /*
+ Hidden for now: Unfortunately, after some test, I found that Playwright requires a lot of libraries to be installed on the Linux host in order to start Chrome or Firefox.
+ It will be hard to install, so I hide this feature for now. But it still accessible via URL: /settings/plugins.
plugins: {
title: this.$tc("plugin", 2),
- },
+ },*/
about: {
title: this.$t("About"),
},
From 4fb43034cda45230dd58bccbae50c8774d39b40d Mon Sep 17 00:00:00 2001
From: Louis Lam
Date: Mon, 30 Jan 2023 21:46:27 +0800
Subject: [PATCH 0224/1864] Handle k8s in healthcheck.go
---
extra/healthcheck.go | 11 ++++++++++-
1 file changed, 10 insertions(+), 1 deletion(-)
diff --git a/extra/healthcheck.go b/extra/healthcheck.go
index 302883d84b..f79b3e65b1 100644
--- a/extra/healthcheck.go
+++ b/extra/healthcheck.go
@@ -11,12 +11,17 @@ import (
"net/http"
"os"
"runtime"
+ "strings"
"time"
)
func main() {
isFreeBSD := runtime.GOOS == "freebsd"
+ // Is K8S + uptime-kuma as the container name
+ // See #2083
+ isK8s := strings.HasPrefix(os.Getenv("UPTIME_KUMA_PORT"), "tcp://")
+
// process.env.NODE_TLS_REJECT_UNAUTHORIZED = "0";
http.DefaultTransport.(*http.Transport).TLSClientConfig = &tls.Config{
InsecureSkipVerify: true,
@@ -44,7 +49,11 @@ func main() {
hostname = "127.0.0.1"
}
- port := os.Getenv("UPTIME_KUMA_PORT")
+ port := ""
+ // UPTIME_KUMA_PORT is override by K8S unexpectedly,
+ if !isK8s {
+ port = os.Getenv("UPTIME_KUMA_PORT")
+ }
if len(port) == 0 {
port = os.Getenv("PORT")
}
From a6894d36f2ed64178f872058cb2d652372bcbacd Mon Sep 17 00:00:00 2001
From: Sebastian Kaempfe
Date: Mon, 30 Jan 2023 15:55:12 +0100
Subject: [PATCH 0225/1864] [#2501] Dashboard: Details Page - enable clickable
URL on Dashboard Details if monitor is of type `mp-health`
---
src/pages/Details.vue | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/pages/Details.vue b/src/pages/Details.vue
index 8325caa45e..bd719ac13a 100644
--- a/src/pages/Details.vue
+++ b/src/pages/Details.vue
@@ -6,7 +6,7 @@
- {{ monitor.url }}
+ {{ monitor.url }}TCP Ping {{ monitor.hostname }}:{{ monitor.port }}Ping: {{ monitor.hostname }}
From 348d0170fa9f561c1ea8dcd714ff7936e44bc8d4 Mon Sep 17 00:00:00 2001
From: Nelson Chan
Date: Wed, 1 Feb 2023 05:33:36 +0800
Subject: [PATCH 0226/1864] Chore: Use constants instead of int
---
server/routers/api-router.js | 10 +++++-----
1 file changed, 5 insertions(+), 5 deletions(-)
diff --git a/server/routers/api-router.js b/server/routers/api-router.js
index 6001d58e00..e95fd045e2 100644
--- a/server/routers/api-router.js
+++ b/server/routers/api-router.js
@@ -4,7 +4,7 @@ const { R } = require("redbean-node");
const apicache = require("../modules/apicache");
const Monitor = require("../model/monitor");
const dayjs = require("dayjs");
-const { UP, MAINTENANCE, DOWN, flipStatus, log } = require("../../src/util");
+const { UP, MAINTENANCE, DOWN, PENDING, flipStatus, log } = require("../../src/util");
const StatusPage = require("../model/status_page");
const { UptimeKumaServer } = require("../uptime-kuma-server");
const { makeBadge } = require("badge-maker");
@@ -147,19 +147,19 @@ router.get("/api/badge/:id/status", cache("5 minutes"), async (request, response
badgeValues.label = label ?? "";
switch (state) {
- case 0:
+ case DOWN:
badgeValues.color = downColor;
badgeValues.message = downLabel;
break;
- case 1:
+ case UP:
badgeValues.color = upColor;
badgeValues.message = upLabel;
break;
- case 2:
+ case PENDING:
badgeValues.color = pendingColor;
badgeValues.message = pendingLabel;
break;
- case 3:
+ case MAINTENANCE:
badgeValues.color = maintenanceColor;
badgeValues.message = maintenanceLabel;
break;
From 95c934e08bf7ea97a85a7107059d804950907953 Mon Sep 17 00:00:00 2001
From: Nelson Chan
Date: Fri, 20 Jan 2023 06:33:45 +0800
Subject: [PATCH 0227/1864] Fix: Do not allow white space around IP
Feat: Trim input on submit
Test: Add test for whitespace regex match
---
src/pages/EditMonitor.vue | 8 ++++++++
src/util-frontend.js | 2 +-
test/cypress/unit/util-frontend.spec.js | 14 +++++++++++---
3 files changed, 20 insertions(+), 4 deletions(-)
diff --git a/src/pages/EditMonitor.vue b/src/pages/EditMonitor.vue
index 00f45d7eb0..e9cbd82458 100644
--- a/src/pages/EditMonitor.vue
+++ b/src/pages/EditMonitor.vue
@@ -949,6 +949,14 @@ message HealthCheckResponse {
this.monitor.headers = JSON.stringify(JSON.parse(this.monitor.headers), null, 4);
}
+ if (this.monitor.hostname) {
+ this.monitor.hostname = this.monitor.hostname.trim();
+ }
+
+ if (this.monitor.url) {
+ this.monitor.url = this.monitor.url.trim();
+ }
+
if (this.isAdd) {
this.$root.add(this.monitor, async (res) => {
diff --git a/src/util-frontend.js b/src/util-frontend.js
index 55d0f63499..882ee29146 100644
--- a/src/util-frontend.js
+++ b/src/util-frontend.js
@@ -88,7 +88,7 @@ export function hostNameRegexPattern(mqtt = false) {
// mqtt, mqtts, ws and wss schemes accepted by mqtt.js (https://github.com/mqttjs/MQTT.js/#connect)
const mqttSchemeRegexPattern = "((mqtt|ws)s?:\\/\\/)?";
// Source: https://digitalfortress.tech/tips/top-15-commonly-used-regex/
- const ipRegexPattern = `((^\\s*${mqtt ? mqttSchemeRegexPattern : ""}((([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]))\\s*$)|(^\\s*((([0-9A-Fa-f]{1,4}:){7}([0-9A-Fa-f]{1,4}|:))|(([0-9A-Fa-f]{1,4}:){6}(:[0-9A-Fa-f]{1,4}|((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){5}(((:[0-9A-Fa-f]{1,4}){1,2})|:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){4}(((:[0-9A-Fa-f]{1,4}){1,3})|((:[0-9A-Fa-f]{1,4})?:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){3}(((:[0-9A-Fa-f]{1,4}){1,4})|((:[0-9A-Fa-f]{1,4}){0,2}:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){2}(((:[0-9A-Fa-f]{1,4}){1,5})|((:[0-9A-Fa-f]{1,4}){0,3}:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){1}(((:[0-9A-Fa-f]{1,4}){1,6})|((:[0-9A-Fa-f]{1,4}){0,4}:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(:(((:[0-9A-Fa-f]{1,4}){1,7})|((:[0-9A-Fa-f]{1,4}){0,5}:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:)))(%.+)?\\s*$))`;
+ const ipRegexPattern = `((^${mqtt ? mqttSchemeRegexPattern : ""}((([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]))$)|(^((([0-9A-Fa-f]{1,4}:){7}([0-9A-Fa-f]{1,4}|:))|(([0-9A-Fa-f]{1,4}:){6}(:[0-9A-Fa-f]{1,4}|((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){5}(((:[0-9A-Fa-f]{1,4}){1,2})|:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){4}(((:[0-9A-Fa-f]{1,4}){1,3})|((:[0-9A-Fa-f]{1,4})?:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){3}(((:[0-9A-Fa-f]{1,4}){1,4})|((:[0-9A-Fa-f]{1,4}){0,2}:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){2}(((:[0-9A-Fa-f]{1,4}){1,5})|((:[0-9A-Fa-f]{1,4}){0,3}:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){1}(((:[0-9A-Fa-f]{1,4}){1,6})|((:[0-9A-Fa-f]{1,4}){0,4}:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(:(((:[0-9A-Fa-f]{1,4}){1,7})|((:[0-9A-Fa-f]{1,4}){0,5}:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:)))(%.+)?$))`;
// Source: https://stackoverflow.com/questions/106179/regular-expression-to-match-dns-hostname-or-ip-address
const hostNameRegexPattern = `^${mqtt ? mqttSchemeRegexPattern : ""}([a-zA-Z0-9])?(([a-zA-Z0-9_]|[a-zA-Z0-9_][a-zA-Z0-9\\-_]*[a-zA-Z0-9_])\\.)*([A-Za-z0-9_]|[A-Za-z0-9_][A-Za-z0-9\\-_]*[A-Za-z0-9_])$`;
diff --git a/test/cypress/unit/util-frontend.spec.js b/test/cypress/unit/util-frontend.spec.js
index 6abedf8212..9bfd4becc1 100644
--- a/test/cypress/unit/util-frontend.spec.js
+++ b/test/cypress/unit/util-frontend.spec.js
@@ -9,7 +9,11 @@ describe("Test util-frontend.js", () => {
expect(regex.test("www.test.com")).to.be.true;
expect(regex.test("127.0.0.1")).to.be.true;
expect(regex.test("192.168.1.156")).to.be.true;
-
+ expect(regex.test(" 192.168.1.145")).to.be.false;
+ expect(regex.test("192.168.1.145 ")).to.be.false;
+ expect(regex.test(" fe80::3282:3ff:ae28:592")).to.be.false;
+ expect(regex.test("fe80::3282:3ff:ae28:592 ")).to.be.false;
+
["mqtt", "mqtts", "ws", "wss"].forEach(schema => {
expect(regex.test(`${schema}://www.test.com`)).to.be.false;
expect(regex.test(`${schema}://127.0.0.1`)).to.be.false;
@@ -23,11 +27,15 @@ describe("Test util-frontend.js", () => {
expect(regex.test("www.test.com")).to.be.true;
expect(regex.test("127.0.0.1")).to.be.true;
expect(regex.test("192.168.1.156")).to.be.true;
-
+ expect(regex.test(" 192.168.1.145")).to.be.false;
+ expect(regex.test("192.168.1.145 ")).to.be.false;
+ expect(regex.test(" fe80::3282:3ff:ae28:592")).to.be.false;
+ expect(regex.test("fe80::3282:3ff:ae28:592 ")).to.be.false;
+
["mqtt", "mqtts", "ws", "wss"].forEach(schema => {
expect(regex.test(`${schema}://www.test.com`)).to.be.true;
expect(regex.test(`${schema}://127.0.0.1`)).to.be.true;
});
});
});
-});
\ No newline at end of file
+});
From a8f0f1d872b359e53efada97ab8f9e84a72b8cad Mon Sep 17 00:00:00 2001
From: Louis Lam
Date: Wed, 1 Feb 2023 15:51:33 +0800
Subject: [PATCH 0228/1864] Merge manually and remove to devDependencies
---
package-lock.json | 36 ++++++++++++++++++++++++++++++++++--
package.json | 4 ++--
src/lang/en.json | 1 +
3 files changed, 37 insertions(+), 4 deletions(-)
diff --git a/package-lock.json b/package-lock.json
index 9da6296878..c1e2645fc4 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,12 +1,12 @@
{
"name": "uptime-kuma",
- "version": "1.19.5",
+ "version": "1.19.6",
"lockfileVersion": 2,
"requires": true,
"packages": {
"": {
"name": "uptime-kuma",
- "version": "1.19.5",
+ "version": "1.19.6",
"license": "MIT",
"dependencies": {
"@grpc/grpc-js": "~1.7.3",
@@ -88,10 +88,12 @@
"cypress": "^10.1.0",
"delay": "^5.0.0",
"dns2": "~2.0.1",
+ "dompurify": "~2.4.3",
"eslint": "~8.14.0",
"eslint-plugin-vue": "~8.7.1",
"favico.js": "~0.3.10",
"jest": "~27.2.5",
+ "marked": "~4.2.5",
"postcss-html": "~1.5.0",
"postcss-rtlcss": "~3.7.2",
"postcss-scss": "~4.0.4",
@@ -7800,6 +7802,12 @@
"url": "https://github.com/fb55/domhandler?sponsor=1"
}
},
+ "node_modules/dompurify": {
+ "version": "2.4.3",
+ "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-2.4.3.tgz",
+ "integrity": "sha512-q6QaLcakcRjebxjg8/+NP+h0rPfatOgOzc46Fst9VAA3jF2ApfKBNKMzdP4DYTqtUMXSCd5pRS/8Po/OmoCHZQ==",
+ "dev": true
+ },
"node_modules/domutils": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/domutils/-/domutils-3.0.1.tgz",
@@ -13613,6 +13621,18 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
+ "node_modules/marked": {
+ "version": "4.2.12",
+ "resolved": "https://registry.npmjs.org/marked/-/marked-4.2.12.tgz",
+ "integrity": "sha512-yr8hSKa3Fv4D3jdZmtMMPghgVt6TWbk86WQaWhDloQjRSQhMMYCAro7jP7VDJrjjdV8pxVxMssXS8B8Y5DZ5aw==",
+ "dev": true,
+ "bin": {
+ "marked": "bin/marked.js"
+ },
+ "engines": {
+ "node": ">= 12"
+ }
+ },
"node_modules/mathml-tag-names": {
"version": "2.1.3",
"resolved": "https://registry.npmjs.org/mathml-tag-names/-/mathml-tag-names-2.1.3.tgz",
@@ -24871,6 +24891,12 @@
"domelementtype": "^2.3.0"
}
},
+ "dompurify": {
+ "version": "2.4.3",
+ "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-2.4.3.tgz",
+ "integrity": "sha512-q6QaLcakcRjebxjg8/+NP+h0rPfatOgOzc46Fst9VAA3jF2ApfKBNKMzdP4DYTqtUMXSCd5pRS/8Po/OmoCHZQ==",
+ "dev": true
+ },
"domutils": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/domutils/-/domutils-3.0.1.tgz",
@@ -29100,6 +29126,12 @@
"integrity": "sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==",
"dev": true
},
+ "marked": {
+ "version": "4.2.12",
+ "resolved": "https://registry.npmjs.org/marked/-/marked-4.2.12.tgz",
+ "integrity": "sha512-yr8hSKa3Fv4D3jdZmtMMPghgVt6TWbk86WQaWhDloQjRSQhMMYCAro7jP7VDJrjjdV8pxVxMssXS8B8Y5DZ5aw==",
+ "dev": true
+ },
"mathml-tag-names": {
"version": "2.1.3",
"resolved": "https://registry.npmjs.org/mathml-tag-names/-/mathml-tag-names-2.1.3.tgz",
diff --git a/package.json b/package.json
index 1dc87f0829..7a148ec2e8 100644
--- a/package.json
+++ b/package.json
@@ -84,7 +84,6 @@
"compare-versions": "~3.6.0",
"compression": "~1.7.4",
"dayjs": "~1.11.5",
- "dompurify": "^2.4.3",
"express": "~4.17.3",
"express-basic-auth": "~1.2.1",
"express-static-gzip": "~2.1.7",
@@ -98,7 +97,6 @@
"jsonwebtoken": "~9.0.0",
"jwt-decode": "~3.1.2",
"limiter": "~2.1.0",
- "marked": "^4.2.5",
"mongodb": "~4.13.0",
"mqtt": "~4.3.7",
"mssql": "~8.1.4",
@@ -147,9 +145,11 @@
"cypress": "^10.1.0",
"delay": "^5.0.0",
"dns2": "~2.0.1",
+ "dompurify": "~2.4.3",
"eslint": "~8.14.0",
"eslint-plugin-vue": "~8.7.1",
"favico.js": "~0.3.10",
+ "marked": "~4.2.5",
"jest": "~27.2.5",
"postcss-html": "~1.5.0",
"postcss-rtlcss": "~3.7.2",
diff --git a/src/lang/en.json b/src/lang/en.json
index cab3dcea33..072e07201c 100644
--- a/src/lang/en.json
+++ b/src/lang/en.json
@@ -25,6 +25,7 @@
"General Monitor Type": "General Monitor Type",
"Passive Monitor Type": "Passive Monitor Type",
"Specific Monitor Type": "Specific Monitor Type",
+ "markdownSupported": "Markdown syntax supported",
"pauseDashboardHome": "Pause",
"Pause": "Pause",
"Name": "Name",
From 683f446cf573127e7bd02fccabb31d051655277c Mon Sep 17 00:00:00 2001
From: Louis Lam
Date: Wed, 1 Feb 2023 20:07:08 +0800
Subject: [PATCH 0229/1864] Add support for `.env`
---
package-lock.json | 18 ++++++++++++++++--
package.json | 1 +
server/server.js | 3 +++
3 files changed, 20 insertions(+), 2 deletions(-)
diff --git a/package-lock.json b/package-lock.json
index 9da6296878..c5429446f1 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,12 +1,12 @@
{
"name": "uptime-kuma",
- "version": "1.19.5",
+ "version": "1.19.6",
"lockfileVersion": 2,
"requires": true,
"packages": {
"": {
"name": "uptime-kuma",
- "version": "1.19.5",
+ "version": "1.19.6",
"license": "MIT",
"dependencies": {
"@grpc/grpc-js": "~1.7.3",
@@ -27,6 +27,7 @@
"compare-versions": "~3.6.0",
"compression": "~1.7.4",
"dayjs": "~1.11.5",
+ "dotenv": "~16.0.3",
"express": "~4.17.3",
"express-basic-auth": "~1.2.1",
"express-static-gzip": "~2.1.7",
@@ -7813,6 +7814,14 @@
"url": "https://github.com/fb55/domutils?sponsor=1"
}
},
+ "node_modules/dotenv": {
+ "version": "16.0.3",
+ "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.0.3.tgz",
+ "integrity": "sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ==",
+ "engines": {
+ "node": ">=12"
+ }
+ },
"node_modules/duplexify": {
"version": "4.1.2",
"resolved": "https://registry.npmjs.org/duplexify/-/duplexify-4.1.2.tgz",
@@ -24881,6 +24890,11 @@
"domhandler": "^5.0.1"
}
},
+ "dotenv": {
+ "version": "16.0.3",
+ "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.0.3.tgz",
+ "integrity": "sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ=="
+ },
"duplexify": {
"version": "4.1.2",
"resolved": "https://registry.npmjs.org/duplexify/-/duplexify-4.1.2.tgz",
diff --git a/package.json b/package.json
index 9e635d1bab..901408363a 100644
--- a/package.json
+++ b/package.json
@@ -84,6 +84,7 @@
"compare-versions": "~3.6.0",
"compression": "~1.7.4",
"dayjs": "~1.11.5",
+ "dotenv": "~16.0.3",
"express": "~4.17.3",
"express-basic-auth": "~1.2.1",
"express-static-gzip": "~2.1.7",
diff --git a/server/server.js b/server/server.js
index 5fbc8e5545..1073f3bef2 100644
--- a/server/server.js
+++ b/server/server.js
@@ -11,6 +11,9 @@ dayjs.extend(require("dayjs/plugin/utc"));
dayjs.extend(require("./modules/dayjs/plugin/timezone"));
dayjs.extend(require("dayjs/plugin/customParseFormat"));
+// Load environment variables from `.env`
+require("dotenv").config();
+
// Check Node.js Version
const nodeVersion = parseInt(process.versions.node.split(".")[0]);
const requiredVersion = 14;
From 89465e676858b6f456f6d81f65dadadd60cead73 Mon Sep 17 00:00:00 2001
From: Louis Lam
Date: Wed, 1 Feb 2023 22:39:09 +0800
Subject: [PATCH 0230/1864] Update CONTRIBUTING.md
---
CONTRIBUTING.md | 36 +++++++++++++++++++++---------------
1 file changed, 21 insertions(+), 15 deletions(-)
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index f46b17e1a1..3f45509288 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -17,8 +17,11 @@ The frontend code build into "dist" directory. The server (express.js) exposes t
## Directories
+- config (dev config files)
- data (App data)
+- db (Base database and migration scripts)
- dist (Frontend build)
+- docker (Dockerfiles)
- extra (Extra useful scripts)
- public (Frontend resources for dev only)
- server (Server source code)
@@ -80,13 +83,13 @@ Before deep into coding, discussion first is preferred. Creating an empty pull r
## Project Styles
-I personally do not like it when something requires so much learning and configuration before you can finally start the app.
+I personally do not like something that requires so many configurations before you can finally start the app. I hope Uptime Kuma installation could be as easy as like installing a mobile app.
-- Easy to install for non-Docker users, no native build dependency is needed (at least for x86_64), no extra config, no extra effort required to get it running
+- Easy to install for non-Docker users, no native build dependency is needed (for x86_64/armv7/arm64), no extra config, no extra effort required to get it running
- Single container for Docker users, no very complex docker-compose file. Just map the volume and expose the port, then good to go
-- Settings should be configurable in the frontend. Environment variable is not encouraged, unless it is related to startup such as `DATA_DIR`.
+- Settings should be configurable in the frontend. Environment variable is not encouraged, unless it is related to startup such as `DATA_DIR`
- Easy to use
-- The web UI styling should be consistent and nice.
+- The web UI styling should be consistent and nice
## Coding Styles
@@ -95,7 +98,7 @@ I personally do not like it when something requires so much learning and configu
- Follow ESLint
- Methods and functions should be documented with JSDoc
-## Name convention
+## Name Conventions
- Javascript/Typescript: camelCaseType
- SQLite: snake_case (Underscore)
@@ -109,7 +112,7 @@ I personally do not like it when something requires so much learning and configu
- IDE that supports ESLint and EditorConfig (I am using IntelliJ IDEA)
- A SQLite GUI tool (SQLite Expert Personal is suggested)
-## Install dependencies
+## Install Dependencies for Development
```bash
npm ci
@@ -127,6 +130,12 @@ Port `3000` and port `3001` will be used.
npm run dev
```
+But sometimes, you would like to keep restart the server, but not the frontend, you can run these command in two terminals:
+```
+npm run start-frontend-dev
+npm run start-server-dev
+```
+
## Backend Server
It binds to `0.0.0.0:3001` by default.
@@ -142,12 +151,15 @@ express.js is used for:
### Structure in /server/
+- jobs/ (Jobs that are running in another process)
- model/ (Object model, auto mapping to the database table name)
- modules/ (Modified 3rd-party modules)
+- monitor_types (Monitor Types)
- notification-providers/ (individual notification logic)
- routers/ (Express Routers)
- socket-handler (Socket.io Handlers)
-- server.js (Server entry point and main logic)
+- server.js (Server entry point)
+- uptime-kuma-server.js (UptimeKumaServer class, main logic should be here, but some still in `server.js`)
## Frontend Dev Server
@@ -198,18 +210,12 @@ Both frontend and backend share the same package.json. However, the frontend dep
### Update Dependencies
-Install `ncu`
-https://github.com/raineorshine/npm-check-updates
-
-```bash
-ncu -u -t patch
-npm install
-```
-
Since previously updating Vite 2.5.10 to 2.6.0 broke the application completely, from now on, it should update patch release version only.
Patch release = the third digit ([Semantic Versioning](https://semver.org/))
+If for maybe security reasons, a library must be updated. Then you must need to check if there are any breaking changes.
+
## Translations
Please read: https://github.com/louislam/uptime-kuma/tree/master/src/languages
From 9286dcb6ce72210be85ffcecc3f4952eb11cfd19 Mon Sep 17 00:00:00 2001
From: Peace
Date: Wed, 1 Feb 2023 20:16:56 +0100
Subject: [PATCH 0231/1864] fix: add serverside check against endless loops
---
server/server.js | 8 ++++++++
1 file changed, 8 insertions(+)
diff --git a/server/server.js b/server/server.js
index deca267da6..2d065abea0 100644
--- a/server/server.js
+++ b/server/server.js
@@ -674,6 +674,14 @@ let needSetup = false;
throw new Error("Permission denied.");
}
+ // Check if Parent is Decendant (would cause endless loop)
+ if (monitor.parent !== null) {
+ const childIDs = await Monitor.getAllChildrenIDs(monitor.id);
+ if (childIDs.includes(monitor.parent)) {
+ throw new Error("Invalid Monitor Group");
+ }
+ }
+
// Reset Prometheus labels
server.monitorList[monitor.id]?.prometheus()?.remove();
From f286386f595b53994eaa5f72b8cb6f5e5813514f Mon Sep 17 00:00:00 2001
From: Peace
Date: Wed, 1 Feb 2023 20:19:47 +0100
Subject: [PATCH 0232/1864] fix: add message for empty group pending state
---
server/model/monitor.js | 1 +
1 file changed, 1 insertion(+)
diff --git a/server/model/monitor.js b/server/model/monitor.js
index b784eed3c5..78f162de69 100644
--- a/server/model/monitor.js
+++ b/server/model/monitor.js
@@ -294,6 +294,7 @@ class Monitor extends BeanModel {
} else {
// Set status pending if group is empty
bean.status = PENDING;
+ bean.msg = "Group empty";
}
} else if (this.type === "http" || this.type === "keyword") {
From 9446c2d1028f0f9d34ae2ee510654e6886c067e1 Mon Sep 17 00:00:00 2001
From: Peace
Date: Wed, 1 Feb 2023 23:39:42 +0100
Subject: [PATCH 0233/1864] fix: use active instead of isActive in uploadBackup
---
server/server.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/server/server.js b/server/server.js
index 841e7417bb..1ac24f1c63 100644
--- a/server/server.js
+++ b/server/server.js
@@ -1409,7 +1409,7 @@ let needSetup = false;
await updateMonitorNotification(bean.id, notificationIDList);
// If monitor was active start it immediately, otherwise pause it
- if (monitorListData[i].isActive === 1) {
+ if (monitorListData[i].active === 1) {
await startMonitor(socket.userID, bean.id);
} else {
await pauseMonitor(socket.userID, bean.id);
From 15ec8db48c3ff699301c6da920676debb4abf6b1 Mon Sep 17 00:00:00 2001
From: Anonymous
Date: Thu, 2 Feb 2023 16:04:49 +0000
Subject: [PATCH 0234/1864] Translated using Weblate (English)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Currently translated at 100.0% (692 of 692 strings)
Translated using Weblate (Turkish)
Currently translated at 97.9% (670 of 684 strings)
Translated using Weblate (Chinese (Traditional, Hong Kong))
Currently translated at 58.6% (401 of 684 strings)
Co-authored-by: Anonymous
Co-authored-by: Louis Lam
Co-authored-by: Weblate
Co-authored-by: Ömer Faruk Genç
Translate-URL: https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/en/
Translate-URL: https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/tr/
Translate-URL: https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/zh_Hant_HK/
Translation: Uptime Kuma/Uptime Kuma
---
src/lang/en.json | 3 ++-
src/lang/tr-TR.json | 11 ++++++++---
src/lang/zh-HK.json | 8 ++++----
3 files changed, 14 insertions(+), 8 deletions(-)
diff --git a/src/lang/en.json b/src/lang/en.json
index cab3dcea33..9c8bdf71c2 100644
--- a/src/lang/en.json
+++ b/src/lang/en.json
@@ -689,5 +689,6 @@
"onebotUserOrGroupId": "Group/User ID",
"onebotSafetyTips": "For safety, must set access token",
"PushDeer Key": "PushDeer Key",
- "wayToGetClickSendSMSToken": "You can get API Username and API Key from {0} ."
+ "wayToGetClickSendSMSToken": "You can get API Username and API Key from {0} .",
+ "Custom Monitor Type": "Custom Monitor Type"
}
diff --git a/src/lang/tr-TR.json b/src/lang/tr-TR.json
index f57e6c744d..a84bc1f475 100644
--- a/src/lang/tr-TR.json
+++ b/src/lang/tr-TR.json
@@ -578,10 +578,10 @@
"statusMaintenance": "Bakım",
"Schedule maintenance": "Bakım Planla",
"Affected Monitors": "Etkilenen Monitörler",
- "Pick Affected Monitors...": "Etkilenen Monitörleri Seçin...",
+ "Pick Affected Monitors...": "Etkilenen Monitörleri Seçin…",
"Start of maintenance": "Bakım başlangıcı",
"All Status Pages": "Tüm Durum Sayfaları",
- "Select status pages...": "Durum sayfalarını seçin...",
+ "Select status pages...": "Durum sayfalarını seçin…",
"recurringIntervalMessage": "Her gün bir kez çalıştırın | {0} günde bir çalıştırın",
"affectedMonitorsDescription": "Geçerli bakımdan etkilenen monitörleri seçin",
"affectedStatusPages": "Bu bakım mesajını seçili durum sayfalarında göster",
@@ -671,5 +671,10 @@
"dataRetentionTimeError": "Saklama süresi 0 veya daha büyük olmalıdır",
"confirmDeleteTagMsg": "Bu etiketi silmek istediğinizden emin misiniz? Bu etiketle ilişkili monitörler silinmez.",
"promosmsAllowLongSMS": "Uzun SMS'e izin ver",
- "infiniteRetention": "Sonsuza dek saklamak için 0 giriniz."
+ "infiniteRetention": "Sonsuza dek saklamak için 0 giriniz.",
+ "rocket.chat": "Rocket.Chat",
+ "slack": "Slack",
+ "pushover": "Pushover",
+ "Game": "Oyun",
+ "Packet Size": "Paket Boyutu"
}
diff --git a/src/lang/zh-HK.json b/src/lang/zh-HK.json
index 1d7c38d749..946080670e 100644
--- a/src/lang/zh-HK.json
+++ b/src/lang/zh-HK.json
@@ -155,7 +155,7 @@
"Options": "選項",
"Keep both": "兩者並存",
"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 value already exist.": "Tag with this value already exist.",
"color": "顏色",
@@ -168,7 +168,7 @@
"Indigo": "靛",
"Purple": "紫",
"Pink": "粉紅",
- "Search...": "搜尋...",
+ "Search...": "搜尋…",
"Avg. Ping": "平均反應時間",
"Avg. Response": "平均反應時間",
"Entry Page": "Entry Page",
@@ -318,8 +318,8 @@
"Security": "安全性",
"Steam API Key": "Steam API 金鑰",
"Shrink Database": "壓縮資料庫",
- "Pick a RR-Type...": "選擇資源記錄類型...",
- "Pick Accepted Status Codes...": "選擇可接受的狀態碼...",
+ "Pick a RR-Type...": "選擇資源記錄類型…",
+ "Pick Accepted Status Codes...": "選擇可接受的狀態碼…",
"Default": "預設",
"HTTP Options": "HTTP 選項",
"Create Incident": "建立事件",
From 1a601c937718c0c8d5c159c7deb5e67a1f27d7fb Mon Sep 17 00:00:00 2001
From: Louis Lam
Date: Thu, 2 Feb 2023 16:04:49 +0000
Subject: [PATCH 0235/1864] Translated using Weblate (Chinese (Traditional))
Currently translated at 97.2% (673 of 692 strings)
Translated using Weblate (English)
Currently translated at 100.0% (684 of 684 strings)
Translated using Weblate (Chinese (Traditional, Hong Kong))
Currently translated at 62.7% (429 of 684 strings)
Co-authored-by: Louis Lam
Translate-URL: https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/en/
Translate-URL: https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/zh_Hant/
Translate-URL: https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/zh_Hant_HK/
Translation: Uptime Kuma/Uptime Kuma
---
src/lang/en.json | 4 ++--
src/lang/zh-HK.json | 30 +++++++++++++++++++++++++++++-
src/lang/zh-TW.json | 22 ++++++++++++++--------
3 files changed, 45 insertions(+), 11 deletions(-)
diff --git a/src/lang/en.json b/src/lang/en.json
index 9c8bdf71c2..231fe29f16 100644
--- a/src/lang/en.json
+++ b/src/lang/en.json
@@ -368,7 +368,7 @@
"YOUR BOT TOKEN HERE": "YOUR BOT TOKEN HERE",
"chatIDNotFound": "Chat ID is not found; please send a message to this bot first",
"disableCloudflaredNoAuthMsg": "You are in No Auth mode, a password is not required.",
- "trustProxyDescription": "Trust 'X-Forwarded-*' headers. If you want to get the correct client IP and your Uptime Kuma is behind such as Nginx or Apache, you should enable this.",
+ "trustProxyDescription": "Trust 'X-Forwarded-*' headers. If you want to get the correct client IP and your Uptime Kuma is behind a proxy such as Nginx or Apache, you should enable this.",
"wayToGetLineNotifyToken": "You can get an access token from {0}",
"Examples": "Examples",
"Home Assistant URL": "Home Assistant URL",
@@ -384,7 +384,7 @@
"Then choose an action, for example switch the scene to where an RGB light is red.": "Then choose an action, for example switch the scene to where an RGB light is red.",
"Frontend Version": "Frontend Version",
"Frontend Version do not match backend version!": "Frontend Version do not match backend version!",
- "backupOutdatedWarning": "Deprecated: Since a lot of features added and this backup feature is a bit unmaintained, it cannot generate or restore a complete backup.",
+ "backupOutdatedWarning": "Deprecated: Since a lot of features were added and this backup feature is a bit unmaintained, it cannot generate or restore a complete backup.",
"backupRecommend": "Please backup the volume or the data folder (./data/) directly instead.",
"Optional": "Optional",
"squadcast": "Squadcast",
diff --git a/src/lang/zh-HK.json b/src/lang/zh-HK.json
index 946080670e..1111c3cb95 100644
--- a/src/lang/zh-HK.json
+++ b/src/lang/zh-HK.json
@@ -401,5 +401,33 @@
"Game": "遊戲",
"Specific Monitor Type": "特定監測器類型",
"Monitor": "監測器 | 監測器",
- "General Monitor Type": "一般監測器類型"
+ "General Monitor Type": "一般監測器類型",
+ "Affected Monitors": "受影響的監測器",
+ "Powered by": "技術支持:",
+ "Add New Status Page": "新增 Status Page",
+ "Page Not Found": "找不到頁面",
+ "Start of maintenance": "維護開始時間",
+ "All Status Pages": "所有 Status Page",
+ "webhookAdditionalHeadersTitle": "額外 Header",
+ "successMessage": "成功訊息",
+ "error": "錯誤",
+ "critical": "嚴重",
+ "Customize": "自定義",
+ "Custom Footer": "自訂 Footer",
+ "Custom CSS": "自訂 CSS",
+ "Valid": "有效",
+ "Invalid": "無效",
+ "Installed": "已安裝",
+ "Not installed": "未安裝",
+ "Running": "執行中",
+ "Stop": "停止",
+ "Next": "下一步",
+ "No Proxy": "無 Proxy",
+ "Backup": "備份",
+ "Pick Affected Monitors...": "挑選受影響的監測器…",
+ "Custom": "自訂",
+ "Not running": "未執行",
+ "Remove Token": "移除 Token",
+ "Start": "開始",
+ "User": "使用者"
}
diff --git a/src/lang/zh-TW.json b/src/lang/zh-TW.json
index 142ebf2d44..5eb0a699ec 100644
--- a/src/lang/zh-TW.json
+++ b/src/lang/zh-TW.json
@@ -15,10 +15,10 @@
"statusMaintenance": "維護",
"Schedule maintenance": "排程維護",
"Affected Monitors": "受影響的監測器",
- "Pick Affected Monitors...": "挑選受影響的監測器...",
+ "Pick Affected Monitors...": "挑選受影響的監測器…",
"Start of maintenance": "維護起始",
"All Status Pages": "所有狀態頁",
- "Select status pages...": "選擇狀態頁...",
+ "Select status pages...": "選擇狀態頁…",
"recurringIntervalMessage": "每日執行 | 每 {0} 天執行",
"affectedMonitorsDescription": "選擇受目前維護影響的監測器",
"affectedStatusPages": "在已選取的狀態頁中顯示此維護訊息",
@@ -177,7 +177,7 @@
"Token": "權杖",
"Show URI": "顯示 URI",
"Tags": "標籤",
- "Add New below or Select...": "在下方新增或選取...",
+ "Add New below or Select...": "在下方新增或選取…",
"Tag with this name already exist.": "已存在相同名稱的標籤。",
"Tag with this value already exist.": "已存在相同數值的標籤。",
"color": "顏色",
@@ -190,7 +190,7 @@
"Indigo": "靛色",
"Purple": "紫色",
"Pink": "粉色",
- "Search...": "搜尋...",
+ "Search...": "搜尋…",
"Avg. Ping": "平均 Ping",
"Avg. Response": "平均回應",
"Entry Page": "入口頁面",
@@ -237,7 +237,7 @@
"wayToGetDiscordURL": "您可以前往伺服器設定 -> 整合 -> Webhook -> 新 Webhook 以取得",
"Bot Display Name": "機器人顯示名稱",
"Prefix Custom Message": "前綴自訂訊息",
- "Hello @everyone is...": "Hello {'@'}everyone is...",
+ "Hello @everyone is...": "Hello {'@'}everyone is…",
"teams": "Microsoft Teams",
"Webhook URL": "Webhook 網址",
"wayToGetTeamsURL": "您可以前往此頁面以了解如何建立 Webhook 網址 {0}。",
@@ -342,8 +342,8 @@
"Security": "安全性",
"Steam API Key": "Steam API 金鑰",
"Shrink Database": "壓縮資料庫",
- "Pick a RR-Type...": "選擇資源記錄類型...",
- "Pick Accepted Status Codes...": "選擇可接受的狀態碼...",
+ "Pick a RR-Type...": "選擇資源記錄類型…",
+ "Pick Accepted Status Codes...": "選擇可接受的狀態碼…",
"Default": "預設",
"HTTP Options": "HTTP 選項",
"Create Incident": "建立事件",
@@ -668,5 +668,11 @@
"high": "高",
"General Monitor Type": "一般監測器類型",
"Passive Monitor Type": "被動監測器類型",
- "Specific Monitor Type": "指定監測器類型"
+ "Specific Monitor Type": "指定監測器類型",
+ "plugin": "插件 | 插件",
+ "install": "安裝",
+ "Game": "遊戲",
+ "Help": "幫助",
+ "Monitor": "監測器 | 監測器",
+ "Custom": "自訂"
}
From fef09d3abdc4b719accbf48b1d4062a409b75b0f Mon Sep 17 00:00:00 2001
From: Adam Stachowicz
Date: Thu, 2 Feb 2023 16:04:49 +0000
Subject: [PATCH 0236/1864] Translated using Weblate (Polish)
Currently translated at 100.0% (691 of 691 strings)
Translated using Weblate (Polish)
Currently translated at 100.0% (684 of 684 strings)
Co-authored-by: Adam Stachowicz
Translate-URL: https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/pl/
Translation: Uptime Kuma/Uptime Kuma
---
src/lang/pl.json | 14 +++++++++++---
1 file changed, 11 insertions(+), 3 deletions(-)
diff --git a/src/lang/pl.json b/src/lang/pl.json
index 802fa56da5..ebc587976f 100644
--- a/src/lang/pl.json
+++ b/src/lang/pl.json
@@ -130,7 +130,7 @@
"Apply on all existing monitors": "Zastosuj do istniejących monitorów",
"Create": "Stwórz",
"Clear Data": "Usuń dane",
- "Events": "Wydarzenia",
+ "Events": "Zdarzenia",
"Heartbeats": "Bicia serca",
"Auto Get": "Wykryj",
"backupDescription": "Możesz wykonać kopię zapasową wszystkich monitorów i wszystkich powiadomień do pliku JSON.",
@@ -584,7 +584,7 @@
"Domain": "Domena",
"Workstation": "Stacja robocza",
"disableCloudflaredNoAuthMsg": "Jesteś w trybie No Auth, hasło nie jest wymagane.",
- "trustProxyDescription": "Zaufaj nagłówkom 'X-Forwarded-*'. Jeśli chcesz uzyskać poprawne IP klienta, a twój Uptime Kuma jest za Nginx lub Apache, powinieneś to włączyć.",
+ "trustProxyDescription": "Zaufaj nagłówkom 'X-Forwarded-*'. Jeśli chcesz uzyskać poprawne IP klienta, a twój Uptime Kuma jest za proxy, takim jak Nginx lub Apache, powinieneś to włączyć.",
"wayToGetLineNotifyToken": "Możesz uzyskać token dostępu z {0}",
"Examples": "Przykłady",
"Home Assistant URL": "URL Home Assistant",
@@ -682,5 +682,13 @@
"Free Mobile API Key": "Darmowy mobilny klucz API",
"Lowcost": "Tani",
"high": "wysoki",
- "General Monitor Type": "Ogólny typ monitora"
+ "General Monitor Type": "Ogólny typ monitora",
+ "Packet Size": "Rozmiar pakietu",
+ "uninstalling": "Odinstalowywanie",
+ "loadingError": "Nie można pobrać danych, proszę spróbować ponownie później.",
+ "plugin": "Wtyczka | Wtyczki",
+ "install": "Instaluj",
+ "installing": "Instalowanie",
+ "uninstall": "Odinstaluj",
+ "confirmUninstallPlugin": "Czy na pewno chcesz odinstalować tę wtyczkę?"
}
From 3208d9873877ad576be1d79183f71a371c0d659a Mon Sep 17 00:00:00 2001
From: 401Unauthorized
Date: Thu, 2 Feb 2023 16:04:49 +0000
Subject: [PATCH 0237/1864] Translated using Weblate (Chinese (Simplified))
Currently translated at 100.0% (692 of 692 strings)
Translated using Weblate (Chinese (Simplified))
Currently translated at 100.0% (692 of 692 strings)
Translated using Weblate (Chinese (Simplified))
Currently translated at 100.0% (691 of 691 strings)
Translated using Weblate (Chinese (Simplified))
Currently translated at 98.5% (681 of 691 strings)
Co-authored-by: 401Unauthorized
Translate-URL: https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/zh_Hans/
Translation: Uptime Kuma/Uptime Kuma
---
src/lang/zh-CN.json | 17 +++++++++++++----
1 file changed, 13 insertions(+), 4 deletions(-)
diff --git a/src/lang/zh-CN.json b/src/lang/zh-CN.json
index 26ee57473e..a3393bd16b 100644
--- a/src/lang/zh-CN.json
+++ b/src/lang/zh-CN.json
@@ -77,7 +77,7 @@
"day": "天",
"-day": "天",
"hour": "小时",
- "-hour": " 小时",
+ "-hour": "小时",
"Response": "响应",
"Ping": "Ping",
"Monitor Type": "监控类型",
@@ -238,7 +238,7 @@
"wayToGetDiscordURL": "要获取,可以前往服务器设置 -> 整合 -> 创建 Webhook",
"Bot Display Name": "机器人显示名称",
"Prefix Custom Message": "自定义消息前缀",
- "Hello @everyone is...": "{'@'}everyone,……",
+ "Hello @everyone is...": "{'@'}everyone,…",
"teams": "Microsoft Teams",
"Webhook URL": "Webhook 网址",
"wayToGetTeamsURL": "您可以在{0}了解如何获取 Webhook URL。",
@@ -264,7 +264,7 @@
"rocket.chat": "Rocket.Chat",
"pushover": "Pushover",
"pushy": "Pushy",
- "PushByTechulus": "Push by Techulus",
+ "PushByTechulus": "使用 Techulus 推送",
"octopush": "Octopush",
"promosms": "PromoSMS",
"clicksendsms": "ClickSend SMS",
@@ -687,5 +687,14 @@
"confirmDeleteTagMsg": "你确定你要删除这个标签?与此标签关联的监视器不会被删除。",
"infiniteRetention": "设为0表示无限保留期。",
"Help": "帮助",
- "Game": "游戏"
+ "Game": "游戏",
+ "Packet Size": "数据包大小",
+ "loadingError": "无法获取数据,请稍后重试。",
+ "plugin": "插件 | 插件",
+ "install": "安装",
+ "installing": "正在安装",
+ "uninstall": "卸载",
+ "uninstalling": "正在卸载",
+ "confirmUninstallPlugin": "您确定要卸载此插件吗?",
+ "Custom Monitor Type": "自定义监控类型"
}
From 1aaf25184062b26d7077ac3278671fb4995132b9 Mon Sep 17 00:00:00 2001
From: Cyril59310
Date: Thu, 2 Feb 2023 16:04:49 +0000
Subject: [PATCH 0238/1864] Translated using Weblate (French)
Currently translated at 98.6% (683 of 692 strings)
Translated using Weblate (French)
Currently translated at 98.6% (682 of 691 strings)
Co-authored-by: Cyril59310
Translate-URL: https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/fr/
Translation: Uptime Kuma/Uptime Kuma
---
src/lang/fr-FR.json | 10 +++++++++-
1 file changed, 9 insertions(+), 1 deletion(-)
diff --git a/src/lang/fr-FR.json b/src/lang/fr-FR.json
index c87b4874dd..d973ec4713 100644
--- a/src/lang/fr-FR.json
+++ b/src/lang/fr-FR.json
@@ -683,5 +683,13 @@
"promosmsAllowLongSMS": "Autoriser les longs SMS",
"Help": "Aide",
"Game": "Jeux",
- "Packet Size": "Taille du paquet"
+ "Packet Size": "Taille du paquet",
+ "loadingError": "Impossible de récupérer les données, veuillez réessayer plus tard.",
+ "plugin": "Plugin | Plugins",
+ "install": "Installer",
+ "installing": "Installation",
+ "uninstall": "Désinstaller",
+ "uninstalling": "Désinstallation",
+ "confirmUninstallPlugin": "Voulez-vous vraiment désinstaller ce plugin ?",
+ "Custom Monitor Type": "Type de sonde personnalisé"
}
From c1461fd01f8080ed93c6f5cc80caac1c8cf8b5de Mon Sep 17 00:00:00 2001
From: Nelson Chan
Date: Thu, 2 Feb 2023 16:04:49 +0000
Subject: [PATCH 0239/1864] Translated using Weblate (Chinese (Traditional,
Hong Kong))
Currently translated at 82.8% (573 of 692 strings)
Translated using Weblate (Yue)
Currently translated at 2.6% (18 of 692 strings)
Translated using Weblate (Yue)
Currently translated at 2.1% (15 of 692 strings)
Co-authored-by: Nelson Chan
Translate-URL: https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/yue/
Translate-URL: https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/zh_Hant_HK/
Translation: Uptime Kuma/Uptime Kuma
---
src/lang/yue.json | 6 +-
src/lang/zh-HK.json | 150 +++++++++++++++++++++++++++++++++++++++++++-
2 files changed, 152 insertions(+), 4 deletions(-)
diff --git a/src/lang/yue.json b/src/lang/yue.json
index 6fdd7ac89b..c6fb894f3f 100644
--- a/src/lang/yue.json
+++ b/src/lang/yue.json
@@ -12,5 +12,9 @@
"Version": "版本",
"Check Update On GitHub": "去 GitHub 睇下有冇更新",
"List": "列表",
- "Add": "新增"
+ "Add": "新增",
+ "Primary Base URL": "主要 Base URL",
+ "Heartbeat Retry Interval": "確定為離線的重試間隔",
+ "retryCheckEverySecond": "每 {0} 秒重試一次",
+ "add one": "加一個"
}
diff --git a/src/lang/zh-HK.json b/src/lang/zh-HK.json
index 1111c3cb95..14f25b5e9d 100644
--- a/src/lang/zh-HK.json
+++ b/src/lang/zh-HK.json
@@ -178,7 +178,7 @@
"Partially Degraded Service": "部份服務受阻",
"Degraded Service": "服務受阻",
"Add Group": "新增群組",
- "Add a monitor": " 新增監測器",
+ "Add a monitor": "新增監測器",
"Edit Status Page": "編輯 Status Page",
"Go to Dashboard": "前往主控台",
"Status Page": "Status Page",
@@ -316,7 +316,7 @@
"Done": "完成",
"Info": "資訊",
"Security": "安全性",
- "Steam API Key": "Steam API 金鑰",
+ "Steam API Key": "Steam API Key",
"Shrink Database": "壓縮資料庫",
"Pick a RR-Type...": "選擇資源記錄類型…",
"Pick Accepted Status Codes...": "選擇可接受的狀態碼…",
@@ -429,5 +429,149 @@
"Not running": "未執行",
"Remove Token": "移除 Token",
"Start": "開始",
- "User": "使用者"
+ "User": "使用者",
+ "trustProxyDescription": "信任 'X-Forwarded-*' 的 Header。如果您想取得正確的 Client IP,且您的 Uptime Kuma 架設於 Nginx 或 Apache 之後,您應啟用此選項。",
+ "Reverse Proxy": "Reverse Proxy",
+ "Long-Lived Access Token can be created by clicking on your profile name (bottom left) and scrolling to the bottom then click Create Token. ": "若要取得長期有效 Access Token,請按您的個人檔案名稱 (左下角),捲動至最下方,然後按建立 Token。 ",
+ "A list of Notification Services can be found in Home Assistant under \"Developer Tools > Services\" search for \"notification\" to find your device/phone name.": "您可以在 Home Assistant 中查看通知服務的列表,在\"開發者工具 > 服務\"下搜尋\"通知\"來找到您的裝置/手機的名稱。",
+ "loadingError": "未能取得數據,請重新再試。",
+ "uninstall": "解除安裝",
+ "wayToGetZohoCliqURL": "您可以前往此頁面以了解如何建立 Webhook 網址 {0}。",
+ "Select status pages...": "選擇 Status Page…",
+ "webhookAdditionalHeadersDesc": "設定傳送 Webhook 時使用的額外 Header。",
+ "topic": "Topic",
+ "topicExplanation": "監測 MQTT 中的一個 Topic",
+ "successMessageExplanation": "MQTT 中收到視為成功的訊息",
+ "Certificate Chain": "証書信任鏈",
+ "Slug": "Slug",
+ "Accept characters:": "可用字元:",
+ "startOrEndWithOnly": "只能使用 {0} 開頭或結尾",
+ "No consecutive dashes": "不得連續使用破折號",
+ "The slug is already taken. Please choose another slug.": "此 slug 已被使用。請選擇其他 slug。",
+ "Authentication": "驗證",
+ "HTTP Basic Auth": "HTTP Basic Auth",
+ "New Status Page": "新 Status Page",
+ "Docker Daemon": "Docker Daemon",
+ "About": "關於",
+ "wayToGetCloudflaredURL": "(到 {0} 下載 cloudflared)",
+ "cloudflareWebsite": "Cloudflare 網頁",
+ "Message:": "訊息:",
+ "Don't know how to get the token? Please read the guide:": "不知道如何取得權杖?請閱讀指南:",
+ "The current connection may be lost if you are currently connecting via Cloudflare Tunnel. Are you sure want to stop it? Type your current password to confirm it.": "如果您正透過 Cloudflare Tunnel 連線,可能會導致連線中斷。您確定要停止嗎?請輸入密碼以確認。",
+ "HTTP Headers": "HTTP Headers",
+ "Trust Proxy": "信任 Proxy",
+ "Other Software": "其他軟件",
+ "For example: nginx, Apache and Traefik.": "例如 nginx、Apache 和 Traefik。",
+ "Please read": "請閱覽",
+ "Subject:": "標題:",
+ "Days Remaining:": "餘下日數:",
+ "Issuer:": "簽發者:",
+ "Fingerprint:": "指紋:",
+ "No status pages": "無 Status Page",
+ "Domain Name Expiry Notification": "Domain 到期通知",
+ "Footer Text": "Footer 文字",
+ "Show Powered By": "顯示 \"Powered By\"",
+ "Domain Names": "Domain",
+ "signedInDisp": "登入為 {0}",
+ "signedInDispDisabled": "驗證已停用。",
+ "RadiusSecret": "Radius Secret",
+ "RadiusSecretDescription": "Client 與 Server 之間的共享 Secret",
+ "RadiusCalledStationId": "Called Station Id",
+ "RadiusCallingStationId": "Calling Station Id",
+ "Certificate Expiry Notification": "証書過期通知",
+ "API Username": "API 使用者名稱",
+ "API Key": "API Key",
+ "Show update if available": "有更新時顯示",
+ "Also check beta release": "檢查 Beta 版本",
+ "Using a Reverse Proxy?": "正在使用 Reverse Proxy?",
+ "Check how to config it for WebSocket": "查看如何加入 WebSocket 設定",
+ "Steam Game Server": "Steam 遊戲 Server",
+ "Most likely causes:": "最可能原因:",
+ "The resource is no longer available.": "資源已不能存取。",
+ "There might be a typing error in the address.": "網址可能輸入錯誤。",
+ "What you can try:": "您可以嘗試:",
+ "Retype the address.": "重新輸入網址。",
+ "Go back to the previous page.": "返回上一頁。",
+ "Coming Soon": "即將推出",
+ "Connection String": "Connection String",
+ "Query": "Query",
+ "settingsCertificateExpiry": "TLS 証書到期",
+ "certificationExpiryDescription": "証書將於 X 天後到期時觸發 HTTPS 監測器通知:",
+ "Setup Docker Host": "設定 Docker 主機",
+ "Connection Type": "連線方式",
+ "deleteDockerHostMsg": "您確定要為所有監測器刪除此 Docker 主機嗎?",
+ "socket": "Socket",
+ "tcp": "TCP / HTTP",
+ "Docker Container": "Docker Container",
+ "Container Name / ID": "Container 名稱 / ID",
+ "Docker Host": "Docker 主機",
+ "Docker Hosts": "Docker 主機",
+ "Domain": "Domain",
+ "Workstation": "Workstation",
+ "ZohoCliq": "ZohoCliq",
+ "disableCloudflaredNoAuthMsg": "您處於無驗證模式。無須輸入密碼。",
+ "wayToGetLineNotifyToken": "您可以從 {0} 取得 Access Token。",
+ "Examples": "例子",
+ "Home Assistant URL": "Home Assistant 網址",
+ "Long-Lived Access Token": "長期有效 Access Token",
+ "Notification Service": "通知服務",
+ "default: notify all devices": "預設:通知所有服務",
+ "Automations can optionally be triggered in Home Assistant:": "可以選擇在 Home Assistant 中觸發自動程序:",
+ "Trigger type:": "觸發類型:",
+ "backupRecommend": "請直接備份 Docker Volume 或 ./data/ 資料夾。",
+ "squadcast": "Squadcast",
+ "or": "或",
+ "recurringInterval": "間隔",
+ "Recurring": "重複性",
+ "strategyManual": "手動啟用/停用",
+ "warningTimezone": "正在使用 Server 的時區",
+ "weekdayShortMon": "一",
+ "weekdayShortTue": "二",
+ "weekdayShortWed": "三",
+ "weekdayShortThu": "四",
+ "weekdayShortFri": "五",
+ "weekdayShortSat": "六",
+ "weekdayShortSun": "日",
+ "dayOfWeek": "每周特定一天",
+ "dayOfMonth": "每月特定一天",
+ "lastDay": "最後一天",
+ "lastDay1": "每月最後一天",
+ "maintenanceStatus-ended": "已結束",
+ "maintenanceStatus-unknown": "未知",
+ "Display Timezone": "顯示時區",
+ "Schedule Maintenance": "排程維護",
+ "Date and Time": "日期與時間",
+ "DateTime Range": "日期與時間範圍",
+ "plugin": "插件 | 插件",
+ "install": "安裝",
+ "installing": "正在安装",
+ "uninstalling": "正在解除安裝",
+ "confirmUninstallPlugin": "你確定要解除安裝?",
+ "dataRetentionTimeError": "保留限期必需為 0 或正數",
+ "infiniteRetention": "設定為 0 以作無限期保留。",
+ "Effective Date Range": "有效日期範圍",
+ "Hello @everyone is...": "Hello {'@'}everyone is…",
+ "Packet Size": "Packet 大小",
+ "Event type:": "事件類型:",
+ "Event data:": "事件資料:",
+ "Then choose an action, for example switch the scene to where an RGB light is red.": "然後選擇操作,例如切換至 RGB 燈為紅色的場景。",
+ "Frontend Version": "前端版本",
+ "Frontend Version do not match backend version!": "前端版本與後端版本不符!",
+ "lastDay2": "每月倒數第二天",
+ "lastDay3": "每月倒數第三天",
+ "lastDay4": "每月倒數第四天",
+ "No Maintenance": "無維護",
+ "pauseMaintenanceMsg": "您確定要暫停嗎?",
+ "maintenanceStatus-under-maintenance": "維護中",
+ "maintenanceStatus-inactive": "已停用",
+ "maintenanceStatus-scheduled": "已排程",
+ "Server Timezone": "伺服器時區",
+ "statusPageMaintenanceEndDate": "結束",
+ "IconUrl": "Icon 網址",
+ "dnsCacheDescription": "在某些情況 IPv6 可能會出現異常,如果您遇到任何問題,請停用。",
+ "Single Maintenance Window": "單一維護時段",
+ "Maintenance Time Window of a Day": "每日維護時段",
+ "Proxy": "Proxy",
+ "backupOutdatedWarning": "過時:由於備份功能未顧及新功能的增加,因此備份功能無法產生或復原完整的備份。",
+ "Optional": "可選填"
}
From 3bc9c19e7f860099d566e04520a797af24b7ab61 Mon Sep 17 00:00:00 2001
From: MrEddX
Date: Thu, 2 Feb 2023 16:04:50 +0000
Subject: [PATCH 0240/1864] Translated using Weblate (Bulgarian)
Currently translated at 100.0% (692 of 692 strings)
Translated using Weblate (Bulgarian)
Currently translated at 100.0% (692 of 692 strings)
Co-authored-by: MrEddX
Translate-URL: https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/bg/
Translation: Uptime Kuma/Uptime Kuma
---
src/lang/bg-BG.json | 20 ++++++++++++++------
1 file changed, 14 insertions(+), 6 deletions(-)
diff --git a/src/lang/bg-BG.json b/src/lang/bg-BG.json
index 0520760e5a..3a5f532d9d 100644
--- a/src/lang/bg-BG.json
+++ b/src/lang/bg-BG.json
@@ -109,8 +109,8 @@
"Password": "Парола",
"Remember me": "Запомни ме",
"Login": "Вход",
- "No Monitors, please": "Все още няма монитори. Моля, добавете поне",
- "add one": "един.",
+ "No Monitors, please": "Все още няма монитори. Моля,",
+ "add one": "добавете един.",
"Notification Type": "Тип известие",
"Email": "Имейл",
"Test": "Тест",
@@ -561,7 +561,7 @@
"Container Name / ID": "Име на контейнер / ID",
"Docker Host": "Docker хост",
"Docker Hosts": "Docker хостове",
- "trustProxyDescription": "Trust 'X-Forwarded-*' headers. Ако искате да получавате правилния IP адрес на клиента, а Uptime Kuma е зад системи като Nginx или Apache, трябва да разрешите тази опция.",
+ "trustProxyDescription": "Доверяване на 'X-Forwarded-*' хедърите. В случай, че желаете да получавате реалния IP адрес на клиента и Uptime Kuma е зад системи като Nginx или Apache, трябва да разрешите тази опция.",
"Examples": "Примери",
"Home Assistant URL": "Home Assistant URL адрес",
"Long-Lived Access Token": "Long-Lived токен за достъп",
@@ -580,8 +580,8 @@
"goAlertInfo": "GoAlert е приложение с отворен код за планиране на повиквания, автоматизирани ескалации и известия (като SMS или гласови повиквания). Автоматично ангажирайте точния човек, по точния начин и в точното време! {0}",
"goAlertIntegrationKeyInfo": "Вземете общ API интеграционен ключ за услугата във формат \"aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee\" обикновено стойността на параметъра token на копирания URL адрес.",
"goAlert": "GoAlert",
- "backupOutdatedWarning": "Отпаднало: Тъй като са добавени много функции, тази опция за архивиране не е достатъчно поддържана и не може да генерира или възстанови пълен архив.",
- "backupRecommend": "Моля, архивирайте дяла или папката (./data/) директно вместо това.",
+ "backupOutdatedWarning": "Отпаднала: Тъй като са добавени много функции, тази опция за архивиране не е достатъчно поддържана и не може да генерира или възстанови пълен архив.",
+ "backupRecommend": "Вместо това моля, архивирайте директно дяла или папката (./data/).",
"Maintenance": "Поддръжка",
"statusMaintenance": "Поддръжка",
"Schedule maintenance": "Планиране на поддръжка",
@@ -683,5 +683,13 @@
"dataRetentionTimeError": "Периодът на съхранение трябва да е 0 или по-голям",
"confirmDeleteTagMsg": "Сигурни ли сте, че желаете да изтриете този таг? Мониторите, свързани с него, няма да бъдат изтрити.",
"promosmsAllowLongSMS": "Позволи дълъг SMS",
- "Packet Size": "Размер на пакет"
+ "Packet Size": "Размер на пакет",
+ "Custom Monitor Type": "Потребителски тип монитор",
+ "loadingError": "Данните не могат да бъдат изтеглени. Моля, опитайте отново по-късно.",
+ "plugin": "Плъгин | Плъгини",
+ "install": "Инсталирай",
+ "installing": "Инсталиране",
+ "uninstall": "Деинсталирай",
+ "uninstalling": "Деинсталиране",
+ "confirmUninstallPlugin": "Сигурни ли сте, че желаете да деинсталирате този плъгин?"
}
From 47dd7ef4321351b437ab436e858e937af639fad7 Mon Sep 17 00:00:00 2001
From: Michal
Date: Thu, 2 Feb 2023 16:04:50 +0000
Subject: [PATCH 0241/1864] Translated using Weblate (Czech)
Currently translated at 100.0% (692 of 692 strings)
Translated using Weblate (Czech)
Currently translated at 99.8% (691 of 692 strings)
Co-authored-by: Michal
Translate-URL: https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/cs/
Translation: Uptime Kuma/Uptime Kuma
---
src/lang/cs-CZ.json | 31 ++++++++++++++++++++-----------
1 file changed, 20 insertions(+), 11 deletions(-)
diff --git a/src/lang/cs-CZ.json b/src/lang/cs-CZ.json
index ede498ffab..c6b28312e4 100644
--- a/src/lang/cs-CZ.json
+++ b/src/lang/cs-CZ.json
@@ -62,7 +62,7 @@
"Down": "Nedostupný",
"Pending": "Čekám",
"Unknown": "Neznámý",
- "Pause": "Pozastavit",
+ "Pause": "Pauza",
"Name": "Název",
"Status": "Stav",
"DateTime": "Časové razítko",
@@ -342,7 +342,7 @@
"steamApiKeyDescription": "Pro monitorování Steam Game Serveru je nutné zadat Steam Web-API klíč. Svůj API klíč získáte na následující stránce: ",
"Current User": "Aktuálně přihlášený uživatel",
"topic": "Téma",
- "topicExplanation": "MQTT topic, který chcete sledovat",
+ "topicExplanation": "MQTT téma, které chcete sledovat",
"successMessage": "Zpráva o úspěchu",
"successMessageExplanation": "MQTT zpráva považovaná za úspěšnou",
"recent": "Poslední",
@@ -351,7 +351,7 @@
"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 a RR-Type...": "Vyberte typ RR záznamu…",
"Pick Accepted Status Codes...": "Vyberte stavové kódy, které chcete akceptovat…",
"Default": "Výchozí",
"HTTP Options": "Možnosti protokolu HTTP",
@@ -578,7 +578,7 @@
"Go back to the previous page.": "Vrátit se na předchozí stránku.",
"Coming Soon": "Připravujeme",
"wayToGetClickSendSMSToken": "API Username a API Key získáte na adrese {0} .",
- "Connection String": "Connection String",
+ "Connection String": "Připojovací řetězec",
"Query": "Dotaz",
"settingsCertificateExpiry": "Platnost TLS certifikátu",
"certificationExpiryDescription": "Aktivovat oznámení nad HTTPS dohledy, pokud platnost TLS certifikátu vyprší za:",
@@ -596,7 +596,7 @@
"Domain": "Doména",
"Workstation": "Pracovní stanice",
"disableCloudflaredNoAuthMsg": "Používáte režim bez ověření, heslo není vyžadováno.",
- "trustProxyDescription": "Důvěřovat 'X-Forwarded-*' hlavičkám. Pokud chcete získat správnou IP adresu klientů a vaše instance Uptime Kuma je schována za Nginx nebo Apache, měli byste tuto možnost zapnout.",
+ "trustProxyDescription": "Důvěřovat 'X-Forwarded-*' hlavičkám. Pokud chcete získat správnou IP adresu klientů a vaše instance Uptime Kuma je za Nginx nebo Apache, měli byste tuto možnost zapnout.",
"wayToGetLineNotifyToken": "Přístupový token můžete získat na adrese {0}",
"Examples": "Příklady",
"Home Assistant URL": "Home Assistant URL",
@@ -616,7 +616,7 @@
"goAlertInfo": "GoAlert je aplikace s otevřeným zdrojovým kódem pro plánování hovorů, automatické eskalace a upozornění (jako jsou SMS nebo hlasové hovory). Automaticky zapojte správnou osobu, správným způsobem a ve správný čas! {0}",
"goAlertIntegrationKeyInfo": "Obecný API integrační klíč pro danou službu ve formátu \"aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee\" se obvykle nachází ve zkopírované URL jako hodnota parametru token.",
"goAlert": "GoAlert",
- "backupOutdatedWarning": "Zastaralé: V poslední době byla funkčnost aplikace značně rozšířena, nicméně součást pro zálohování nepokrývá všechny možnosti. Z tohoto důvodu není možné vygenerovat úplnou zálohu a zajistit obnovení všech dat.",
+ "backupOutdatedWarning": "Zastaralé: Vzhledem k tomu, že bylo přidáno mnoho funkcí a tato funkce zálohování je poněkud neudržovaná, nemůže vytvářet nebo obnovit kompletní zálohu.",
"backupRecommend": "Prosím, zálohujte si ručně celý svazek nebo datovou složku (./data/).",
"Optional": "Volitelný",
"squadcast": "Squadcast",
@@ -666,12 +666,12 @@
"Date and Time": "Datum a čas",
"DateTime Range": "Rozsah data a času",
"Strategy": "Strategie",
- "Free Mobile User Identifier": "Free Mobile User Identifier",
- "Free Mobile API Key": "Free Mobile API Key",
+ "Free Mobile User Identifier": "Identifikátor uživatele Free Mobile",
+ "Free Mobile API Key": "API klíč Free Mobile",
"Enable TLS": "Povolit TLS",
"Proto Service Name": "Proto Service Name",
- "Proto Method": "Proto Method",
- "Proto Content": "Proto Content",
+ "Proto Method": "Proto metoda",
+ "Proto Content": "Proto obsah",
"Economy": "Úsporná",
"Lowcost": "Nízkonákladová",
"high": "high",
@@ -682,5 +682,14 @@
"infiniteRetention": "Pro nekonečný záznam zadejte 0.",
"confirmDeleteTagMsg": "Opravdu chcete odstranit tento štítek? Provedením této akce nedojde k odstranění dohledů, které jej mají přiřazeny.",
"Help": "Nápověda",
- "Game": "Hra"
+ "Game": "Hra",
+ "Custom Monitor Type": "Vlastní typ dohledu",
+ "loadingError": "Nelze načíst data, zkuste to prosím později.",
+ "confirmUninstallPlugin": "Opravdu chcete tento zásuvný modul odinstalovat?",
+ "plugin": "Zásuvné moduly | Zásuvné moduly",
+ "install": "Instalace",
+ "installing": "Instaluji",
+ "uninstall": "Odinstalace",
+ "uninstalling": "Odinstalování",
+ "Packet Size": "Velikost paketu"
}
From a8af763f234ebe24889c86891d70156377f07583 Mon Sep 17 00:00:00 2001
From: Louis Lam
Date: Thu, 2 Feb 2023 16:04:50 +0000
Subject: [PATCH 0242/1864] Translated using Weblate (Yue)
Currently translated at 14.3% (99 of 692 strings)
Co-authored-by: Louis Lam
Translate-URL: https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/yue/
Translation: Uptime Kuma/Uptime Kuma
---
src/lang/yue.json | 83 ++++++++++++++++++++++++++++++++++++++++++++++-
1 file changed, 82 insertions(+), 1 deletion(-)
diff --git a/src/lang/yue.json b/src/lang/yue.json
index c6fb894f3f..98936dbc1b 100644
--- a/src/lang/yue.json
+++ b/src/lang/yue.json
@@ -16,5 +16,86 @@
"Primary Base URL": "主要 Base URL",
"Heartbeat Retry Interval": "確定為離線的重試間隔",
"retryCheckEverySecond": "每 {0} 秒重試一次",
- "add one": "加一個"
+ "add one": "加一個",
+ "upsideDownModeDescription": "反轉狀態,如果網址係可以正常瀏覽,會被判定為 '離線/DOWN'",
+ "Not available, please setup.": "未可以用,需要設定。",
+ "Discourage search engines from indexing site": "唔建議搜尋器索引",
+ "Remember me": "記住我",
+ "Test": "測試",
+ "DateTime": "日期時間",
+ "Resume": "恢復",
+ "statusMaintenance": "維護緊",
+ "Maintenance": "維護",
+ "Unknown": "唔知",
+ "pauseDashboardHome": "暫停",
+ "Pause": "暫停",
+ "Status": "狀態",
+ "Message": "內容",
+ "No important events": "冇重要事件",
+ "Edit": "編輯",
+ "Delete": "刪除",
+ "Current": "目前",
+ "Uptime": "上線率",
+ "day": "日 | 日",
+ "-day": "日",
+ "hour": "個鐘",
+ "-hour": "個鐘",
+ "Response": "反應時間",
+ "Ping": "反應時間",
+ "URL": "網址",
+ "Retries": "重試數次確定為離線",
+ "Advanced": "進階",
+ "ignoreTLSError": "唔理 TLS/SSL 錯誤",
+ "Upside Down Mode": "反轉模式",
+ "Accepted Status Codes": "接受為上線嘅 HTTP 狀態碼",
+ "Save": "儲存",
+ "Notifications": "通知",
+ "Setup Notification": "設定通知",
+ "Light": "明亮",
+ "Dark": "暗黑",
+ "Auto": "自動",
+ "Normal": "一般",
+ "Bottom": "下方",
+ "None": "冇",
+ "Timezone": "時區",
+ "Search Engine Visibility": "係咪允許搜尋器索引",
+ "Allow indexing": "允許索引",
+ "Change Password": "改密碼",
+ "Current Password": "而家嘅密碼",
+ "New Password": "新密碼",
+ "Repeat New Password": "確認新密碼",
+ "Update Password": "更新密碼",
+ "Disable Auth": "取消登入認証",
+ "Enable Auth": "開啟登入認証",
+ "disableauth.message1": "你係咪確認想取消登入認証?",
+ "Please use this option carefully!": "請小心使用。",
+ "Logout": "登出",
+ "Leave": "離開",
+ "I understand, please disable": "我知,唔該取消登入認証",
+ "Confirm": "確認",
+ "Yes": "係",
+ "No": "唔係",
+ "Username": "帳號",
+ "Password": "密碼",
+ "Login": "登入",
+ "Notification Type": "通知類型",
+ "Email": "電郵",
+ "Repeat Password": "重複密碼",
+ "Up": "上線",
+ "Down": "離線",
+ "Pending": "待定",
+ "Name": "名稱",
+ "General Monitor Type": "一般監測器類型",
+ "Passive Monitor Type": "被動監測器類型",
+ "Specific Monitor Type": "特定監測器類型",
+ "Monitor": "監測器 | 監測器",
+ "Keyword": "關鍵字",
+ "Friendly Name": "名稱",
+ "Hostname": "Hostname",
+ "Port": "Port",
+ "No Monitors, please": "冇監測器,請",
+ "Monitor Type": "監測器類型",
+ "Heartbeat Interval": "檢查間距",
+ "Add New Monitor": "新增監測器",
+ "Quick Stats": "綜合數據"
}
From 30fb5f0b7b4b830c66209479fe618d7b840de2a2 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=C3=96mer=20Faruk=20Gen=C3=A7?=
Date: Thu, 2 Feb 2023 16:04:50 +0000
Subject: [PATCH 0243/1864] Translated using Weblate (Turkish)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Currently translated at 100.0% (692 of 692 strings)
Co-authored-by: Ömer Faruk Genç
Translate-URL: https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/tr/
Translation: Uptime Kuma/Uptime Kuma
---
src/lang/tr-TR.json | 77 +++++++++++++++++++++++++++------------------
1 file changed, 46 insertions(+), 31 deletions(-)
diff --git a/src/lang/tr-TR.json b/src/lang/tr-TR.json
index a84bc1f475..b9bc8adcb9 100644
--- a/src/lang/tr-TR.json
+++ b/src/lang/tr-TR.json
@@ -1,7 +1,7 @@
{
"languageName": "Türkçe",
- "checkEverySecond": "{0} Saniyede bir kontrol et.",
- "retryCheckEverySecond": "{0} Saniyede bir dene.",
+ "checkEverySecond": "{0} saniyede bir kontrol et",
+ "retryCheckEverySecond": "{0} saniyede bir dene",
"resendEveryXTimes": "Her {0} bir yeniden gönder",
"resendDisabled": "Yeniden gönderme devre dışı",
"retriesDescription": "Servisin kapalı olarak işaretlenmeden ve bir bildirim gönderilmeden önce maksimum yeniden deneme sayısı",
@@ -11,7 +11,7 @@
"acceptedStatusCodesDescription": "Başarılı bir yanıt olarak kabul edilen durum kodlarını seçin.",
"passwordNotMatchMsg": "Şifre eşleşmiyor.",
"notificationDescription": "Servislerin bildirim gönderebilmesi için bir bildirim yöntemi belirleyin.",
- "keywordDescription": "Anahtar kelimeyi düz html veya JSON yanıtında arayın ve büyük/küçük harfe duyarlıdır",
+ "keywordDescription": "Anahtar kelimeyi düz html veya JSON yanıtında arayın ve büyük/küçük harfe duyarlıdır.",
"pauseDashboardHome": "Durdur",
"deleteMonitorMsg": "Servisi silmek istediğinden emin misin?",
"deleteNotificationMsg": "Bu bildirimi tüm servisler için silmek istediğinden emin misin?",
@@ -19,14 +19,14 @@
"resolverserverDescription": "Cloudflare varsayılan sunucudur, çözümleyici sunucusunu istediğiniz zaman değiştirebilirsiniz.",
"rrtypeDescription": "İzlemek istediğiniz servisin RR-Tipini seçin",
"pauseMonitorMsg": "Durdurmak istediğinden emin misin?",
- "enableDefaultNotificationDescription": "Bu bildirim her yeni serviste aktif olacaktır. Bildirimi servisler için ayrı ayrı deaktive edebilirsiniz. ",
+ "enableDefaultNotificationDescription": "Bu bildirim her yeni serviste aktif olacaktır. Bildirimi servisler için ayrı ayrı deaktive edebilirsiniz.",
"clearEventsMsg": "Bu servisin bütün kayıtlarını silmek istediğinden emin misin?",
"clearHeartbeatsMsg": "Bu servis için tüm sağlık durumunu silmek istediğinden emin misin?",
"confirmClearStatisticsMsg": "Tüm istatistikleri silmek istediğinden emin misin?",
- "importHandleDescription": "Aynı isimdeki bütün servisleri ve bildirimleri atlamak için 'Var olanı atla' seçiniz. 'Üzerine yaz' var olan bütün servisleri ve bildirimleri silecektir. ",
- "confirmImportMsg": "Yedeği içeri aktarmak istediğinize emin misiniz? Lütfen doğru içeri aktarma seçeneğini seçtiğinizden emin olunuz. ",
+ "importHandleDescription": "Aynı isimdeki bütün servisleri ve bildirimleri atlamak için 'Var olanı atla' seçiniz. 'Üzerine yaz' var olan bütün servisleri ve bildirimleri silecektir.",
+ "confirmImportMsg": "Yedeği içeri aktarmak istediğinize emin misiniz? Lütfen doğru içeri aktarma seçeneğini seçtiğinizden emin olunuz.",
"twoFAVerifyLabel": "2FA doğrulamasını sağlamak için lütfen token bilgisini giriniz:",
- "tokenValidSettingsMsg": "Token geçerli! Şimdi 2FA ayarlarını kaydedebilirsiniz. ",
+ "tokenValidSettingsMsg": "Token geçerli! Şimdi 2FA ayarlarını kaydedebilirsiniz.",
"confirmEnableTwoFAMsg": "2FA'ı etkinleştirmek istediğinizden emin misiniz?",
"confirmDisableTwoFAMsg": "2FA'ı devre dışı bırakmak istediğinize emin misiniz?",
"Settings": "Ayarlar",
@@ -69,7 +69,7 @@
"Keyword": "Anahtar Kelime",
"Friendly Name": "Panelde görünecek isim",
"URL": "URL",
- "Hostname": "IP Adresi",
+ "Hostname": "Hostname",
"Port": "Port",
"Heartbeat Interval": "Servis Test Aralığı",
"Retries": "Yeniden deneme",
@@ -102,8 +102,8 @@
"New Password": "Yeni Şifre",
"Repeat New Password": "Yeni Şifreyi Tekrar Girin",
"Update Password": "Şifreyi Değiştir",
- "Disable Auth": "Şifreli girişi iptal et.",
- "Enable Auth": "Şifreli girişi aktif et.",
+ "Disable Auth": "Şifreli girişi iptal et",
+ "Enable Auth": "Şifreli girişi aktif et",
"disableauth.message1": "Şifreli girişi devre dışı bırakmak istediğinizdenemin misiniz?",
"disableauth.message2": "Bu, Uptime Kuma'nın önünde Cloudflare Access gibi üçüncü taraf yetkilendirmesi olan kişiler içindir.",
"Please use this option carefully!": "Lütfen dikkatli kullanın!",
@@ -162,7 +162,7 @@
"Token": "Token",
"Show URI": "URI'yi göster",
"Tags": "Etiketler",
- "Add New below or Select...": "Aşağıya Yeni Ekle veya Seç...",
+ "Add New below or Select...": "Aşağıya Yeni Ekle veya Seç…",
"Tag with this name already exist.": "Bu ada sahip etiket zaten var.",
"Tag with this value already exist.": "Bu değere sahip etiket zaten var.",
"color": "renk",
@@ -175,7 +175,7 @@
"Indigo": "Çivit mavisi",
"Purple": "Mor",
"Pink": "Pembe",
- "Search...": "Ara...",
+ "Search...": "Ara…",
"Avg. Ping": "Ortalama Ping",
"Avg. Response": "Ortalama Cevap Süresi",
"Entry Page": "Giriş Sayfası",
@@ -190,7 +190,7 @@
"Go to Dashboard": "Panele Git",
"Status Page": "Durum Sayfası",
"Status Pages": "Durum Sayfaları",
- "defaultNotificationName": "My {notification} Alert ({number})",
+ "defaultNotificationName": "Benim {notification} Alarmım ({number})",
"here": "burada",
"Required": "Gerekli",
"telegram": "Telegram",
@@ -220,7 +220,7 @@
"wayToGetDiscordURL": "Bunu Sunucu Ayarları -> Entegrasyonlar -> Webhook Oluştur'a giderek alabilirsiniz.",
"Bot Display Name": "Botun Görünecek Adı",
"Prefix Custom Message": "Önek Özel Mesaj",
- "Hello @everyone is...": "Merhaba {'@'}everyone ...",
+ "Hello @everyone is...": "Merhaba {'@'}everyone…",
"teams": "Microsoft Teams",
"Webhook URL": "Webhook URL",
"wayToGetTeamsURL": "Bir webhook URL'sinin nasıl oluşturulacağını öğrenebilirsiniz {0}.",
@@ -240,7 +240,7 @@
"aboutWebhooks": "Webhook hakkında daha fazla bilgi: {0}",
"aboutChannelName": "Webhook kanalını atlamak istiyorsanız, {0} Kanal Adı alanına kanal adını girin. Ör: #diğer-kanal",
"aboutKumaURL": "Uptime Kuma URL alanını boş bırakırsanız, varsayılan olarak Project GitHub sayfası olur.",
- "emojiCheatSheet": "Emoji cheat sheet: {0}",
+ "emojiCheatSheet": "Emoji referans sayfası: {0}",
"PushByTechulus": "Push by Techulus",
"apprise": "Apprise (50'den fazla Bildirim hizmetini destekler)",
"GoogleChat": "Google Chat (sadece Google Workspace)",
@@ -315,8 +315,8 @@
"Security": "Güvenlik",
"Steam API Key": "Steam API Anahtarı",
"Shrink Database": "Veritabanını Küçült",
- "Pick a RR-Type...": "Bir RR-Tipi seçin...",
- "Pick Accepted Status Codes...": "Kabul Edilen Durum Kodlarını Seçin...",
+ "Pick a RR-Type...": "Bir RR-Tipi seçin…",
+ "Pick Accepted Status Codes...": "Kabul Edilen Durum Kodlarını Seçin…",
"Default": "Varsayılan",
"HTTP Options": "HTTP Ayarları",
"Create Incident": "Olay Oluştur",
@@ -324,13 +324,13 @@
"Content": "İçerik",
"Style": "Stil",
"info": "info",
- "warning": "warning",
- "danger": "danger",
+ "warning": "uyarı",
+ "danger": "tehlike",
"error": "hata",
"critical": "kritik",
- "primary": "primary",
- "light": "light",
- "dark": "dark",
+ "primary": "öncelik",
+ "light": "hafif",
+ "dark": "koyu",
"Post": "Post",
"Please input title and content": "Lütfen başlık ve içerik girin",
"Created": "Oluşturuldu",
@@ -348,7 +348,7 @@
"Services": "Hizmetler",
"Discard": "İptal Et",
"Cancel": "İptal Et",
- "Powered by": "Powered by",
+ "Powered by": "Tarafından desteklenmektedir",
"shrinkDatabaseDescription": "SQLite için veritabanı VACUUM'unu tetikleyin. Veritabanınız 1.10.0'dan sonra oluşturulduysa, AUTO_VACUUM zaten etkinleştirilmiştir ve bu eyleme gerek yoktur.",
"serwersms": "SerwerSMS.pl",
"serwersmsAPIUser": "API Kullanıcı Adı (webapi_ öneki dahil)",
@@ -390,13 +390,13 @@
"deleteProxyMsg": "Bu proxy'yi tüm servisler için silmek istediğinizden emin misiniz?",
"proxyDescription": "Proxy'lerin çalışması için bir servise atanması gerekir.",
"enableProxyDescription": "Bu proxy, etkinleştirilene kadar izleme isteklerini etkilemeyecektir. Aktivasyon durumuna göre proxy'yi tüm servislerden geçici olarak devre dışı bırakabilirsiniz.",
- "setAsDefaultProxyDescription": "Bu proxy, yeni servisler için varsayılan olarak etkinleştirilecektir. Yine de proxy'yi her servis için ayrı ayrı devre dışı bırakabilirsiniz.",
+ "setAsDefaultProxyDescription": "Bu proxy, yeni servisler için varsayılan olarak etkinleştirilecektir. Yine de proxy'yi her bir servis için devre dışı bırakabilirsiniz.",
"Certificate Chain": "Sertifika Zinciri",
"Valid": "Geçerli",
"Invalid": "Geçersiz",
"AccessKeyId": "AccessKey ID",
"SecretAccessKey": "AccessKey Secret",
- "PhoneNumbers": "PhoneNumbers",
+ "PhoneNumbers": "Telefon numaraları",
"TemplateCode": "TemplateCode",
"SignName": "SignName",
"Sms template must contain parameters: ": "Sms şablonu parametreleri içermelidir: ",
@@ -412,8 +412,8 @@
"Android": "Android",
"Huawei": "Huawei",
"High": "High",
- "Retry": "Retry",
- "Topic": "Topic",
+ "Retry": "Tekrar",
+ "Topic": "Başlık",
"WeCom Bot Key": "WeCom Bot Key",
"Setup Proxy": "Proxy kur",
"Proxy Protocol": "Proxy Protokolü",
@@ -550,7 +550,7 @@
"Domain": "Domain",
"Workstation": "İş İstasyonu",
"disableCloudflaredNoAuthMsg": "Yetki yok modundasınız, şifre gerekli değil.",
- "trustProxyDescription": "'X-Forwarded-*' başlıklarına güvenin. Doğru istemci IP'sini almak istiyorsanız ve Uptime Kuma'nız Nginx veya Apache'nin arkasındaysa, bunu etkinleştirmelisiniz.",
+ "trustProxyDescription": "'X-Forwarded-*' başlıklarına güvenin. Doğru istemci IP'sini almak istiyorsanız ve Uptime Kuma'nız Nginx veya Apache gibi bir proxy'nin arkasındaysa, bunu etkinleştirmelisiniz.",
"wayToGetLineNotifyToken": "{0} adresinden bir erişim jetonu alabilirsiniz.",
"Examples": "Örnekler",
"Home Assistant URL": "Home Assistant URL",
@@ -570,7 +570,7 @@
"goAlertInfo": "GoAlert, çağrı üzerine zamanlama, otomatik eskalasyonlar ve bildirimler (SMS veya sesli çağrılar gibi) için açık kaynaklı bir uygulamadır. Doğru kişiyi, doğru şekilde ve doğru zamanda otomatik olarak devreye sokun! {0}",
"goAlertIntegrationKeyInfo": "Servis için genel API entegrasyon anahtarını, genellikle kopyalanan URL'nin belirteç parametresinin değeri olan \"aaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee\" biçiminde alın.",
"goAlert": "GoAlert",
- "backupOutdatedWarning": "Kullanımdan Kaldırıldı: Birçok özellik eklendiğinden ve bu yedekleme özelliği biraz bakımsız olduğundan, tam bir yedekleme oluşturamaz veya geri yükleyemez.",
+ "backupOutdatedWarning": "Kullanımdan kaldırıldı: Birçok özellik eklendiğinden ve bu yedekleme özelliği biraz bakımsız olduğundan tam bir yedekleme oluşturamaz veya geri yükleyemez.",
"backupRecommend": "Lütfen bunun yerine birimi veya veri klasörünü (./data/) doğrudan yedekleyin.",
"enableGRPCTls": "TLS bağlantısıyla gRPC isteği göndermeye izin ver",
"grpcMethodDescription": "Yöntem adı, sayHello, check, vb. gibi cammelCase biçimine dönüştürülür.",
@@ -666,7 +666,7 @@
"Passive Monitor Type": "Pasif Monitör Tipi",
"Specific Monitor Type": "Özel Monitör Tipi",
"Help": "Yardım",
- "Monitor": "Ekran | Ekranlar",
+ "Monitor": "Monitör | Monitörler",
"Custom": "Özel",
"dataRetentionTimeError": "Saklama süresi 0 veya daha büyük olmalıdır",
"confirmDeleteTagMsg": "Bu etiketi silmek istediğinizden emin misiniz? Bu etiketle ilişkili monitörler silinmez.",
@@ -676,5 +676,20 @@
"slack": "Slack",
"pushover": "Pushover",
"Game": "Oyun",
- "Packet Size": "Paket Boyutu"
+ "Packet Size": "Paket Boyutu",
+ "Custom Monitor Type": "Özel Monitör Tipi",
+ "clicksendsms": "ClickSend SMS",
+ "loadingError": "Veriler getirilemiyor, lütfen daha sonra tekrar deneyin.",
+ "plugin": "Eklenti | Eklentiler",
+ "install": "Yükle",
+ "installing": "Yükleniyor",
+ "uninstall": "Kaldır",
+ "uninstalling": "Yükleme kaldırılıyor",
+ "confirmUninstallPlugin": "Bu eklentiyi kaldırmak istediğinizden emin misiniz?",
+ "pushy": "Pushy",
+ "octopush": "Octopush",
+ "promosms": "PromoSMS",
+ "lunasea": "LunaSea",
+ "line": "Line Messenger",
+ "mattermost": "Mattermost"
}
From c2ca60aaa2058e4859684e7d4db8b3aba793391f Mon Sep 17 00:00:00 2001
From: rubesaca
Date: Thu, 2 Feb 2023 16:04:50 +0000
Subject: [PATCH 0244/1864] Translated using Weblate (Spanish)
Currently translated at 94.6% (655 of 692 strings)
Translated using Weblate (Spanish)
Currently translated at 57.8% (400 of 692 strings)
Translated using Weblate (Spanish)
Currently translated at 56.6% (392 of 692 strings)
Translated using Weblate (Spanish)
Currently translated at 49.2% (341 of 692 strings)
Co-authored-by: rubesaca
Translate-URL: https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/es/
Translation: Uptime Kuma/Uptime Kuma
---
src/lang/es-ES.json | 470 +++++++++++++++++++++++++++++++++++++++++++-
1 file changed, 460 insertions(+), 10 deletions(-)
diff --git a/src/lang/es-ES.json b/src/lang/es-ES.json
index 9a40ee8bc9..8fa80158d4 100644
--- a/src/lang/es-ES.json
+++ b/src/lang/es-ES.json
@@ -1,14 +1,14 @@
{
"languageName": "Español",
- "checkEverySecond": "Comprobar cada {0} segundos.",
- "retriesDescription": "Número máximo de intentos antes de que el servicio se marque como CAÍDO y una notificación sea enviada.",
+ "checkEverySecond": "Comprobar cada {0} segundos",
+ "retriesDescription": "Número máximo de intentos antes de que el servicio se marque como CAÍDO y una notificación sea enviada",
"ignoreTLSError": "Ignorar error TLS/SSL para sitios web HTTPS",
"upsideDownModeDescription": "Invertir el estado. Si el servicio es alcanzable, está CAÍDO.",
"maxRedirectDescription": "Número máximo de direcciones a seguir. Establecer a 0 para deshabilitar.",
"acceptedStatusCodesDescription": "Seleccionar los códigos de estado que se consideran como respuesta exitosa.",
"passwordNotMatchMsg": "La contraseña repetida no coincide.",
"notificationDescription": "Por favor asigna una notificación a el/los monitor(es) para hacerlos funcional(es).",
- "keywordDescription": "Palabra clave en HTML plano o respuesta JSON, es sensible a mayúsculas",
+ "keywordDescription": "Buscar palabra clave en HTML plano o respuesta JSON. La búsqueda es sensible a mayúsculas.",
"pauseDashboardHome": "Pausado",
"deleteMonitorMsg": "¿Seguro que quieres eliminar este monitor?",
"deleteNotificationMsg": "¿Seguro que quieres eliminar esta notificación para todos los monitores?",
@@ -86,7 +86,7 @@
"Enable Auth": "Habilitar autenticación",
"disableauth.message1": "Seguro que deseas deshabilitar la autenticación?",
"disableauth.message2": "Es para quien implementa autenticación de terceros ante Uptime Kuma como por ejemplo Cloudflare Access.",
- "Please use this option carefully!": "Por favor usar con cuidado.",
+ "Please use this option carefully!": "¡Utilice esta opción con cuidado!",
"Logout": "Cerrar sesión",
"Leave": "Salir",
"I understand, please disable": "Entiendo, por favor deshabilitar",
@@ -128,7 +128,7 @@
"backupDescription3": "Los datos confidenciales, como los tokens de notificación, se incluyen en el archivo de exportación. Guárdalo con cuidado.",
"alertNoFile": "Selecciona un archivo para importar.",
"alertWrongFileType": "Selecciona un archivo JSON.",
- "twoFAVerifyLabel": "Ingresa tu token para verificar que 2FA está funcionando",
+ "twoFAVerifyLabel": "Ingresa tu token para verificar que 2FA está funcionando:",
"tokenValidSettingsMsg": "¡El token es válido! Ahora puedes guardar la configuración de 2FA.",
"confirmEnableTwoFAMsg": "¿Estás seguro de que quieres habilitar 2FA?",
"confirmDisableTwoFAMsg": "¿Estás seguro de que quieres desactivar 2FA?",
@@ -144,7 +144,7 @@
"Token": "Token",
"Show URI": "Mostrar URI",
"Clear all statistics": "Borrar todas las estadísticas",
- "retryCheckEverySecond": "Reintentar cada {0} segundo.",
+ "retryCheckEverySecond": "Reintentar cada {0} segundos",
"importHandleDescription": "Elige 'Omitir existente' si deseas omitir todos los monitores o notificaciones con el mismo nombre. 'Sobrescribir' eliminará todos los monitores y notificaciones existentes.",
"confirmImportMsg": "¿Estás seguro de importar la copia de seguridad? Asegúrate de haber seleccionado la opción de importación correcta.",
"Heartbeat Retry Interval": "Intervalo de reintento de latido",
@@ -155,7 +155,7 @@
"Options": "Opciones",
"Keep both": "Manténer ambos",
"Tags": "Etiquetas",
- "Add New below or Select...": "Agregar nuevo a continuación o seleccionar...",
+ "Add New below or Select...": "Agregar nuevo a continuación o seleccionar…",
"Tag with this name already exist.": "Una etiqueta con este nombre ya existe.",
"Tag with this value already exist.": "Una etiqueta con este valor ya existe.",
"color": "color",
@@ -168,7 +168,7 @@
"Indigo": "Índigo",
"Purple": "Morado",
"Pink": "Rosa",
- "Search...": "Buscar...",
+ "Search...": "Buscar…",
"Avg. Ping": "Ping promedio",
"Avg. Response": "Respuesta promedio",
"Entry Page": "Página de entrada",
@@ -188,7 +188,7 @@
"smtp": "Email (SMTP)",
"discord": "Discord",
"teams": "Microsoft Teams",
- "signal": "Signal",
+ "signal": "Señal",
"gotify": "Gotify",
"slack": "Slack",
"rocket.chat": "Rocket.chat",
@@ -205,5 +205,455 @@
"clearDataOlderThan": "Mantener los datos del historial del monitor durante {0} días.",
"records": "registros",
"One record": "Un registro",
- "steamApiKeyDescription": "Para monitorear un servidor de juegos de Steam, necesitas una clave Steam Web-API. Puedes registrar tu clave API aquí: "
+ "steamApiKeyDescription": "Para monitorear un servidor de juegos de Steam, necesitas una clave Steam Web-API. Puedes registrar tu clave API aquí: ",
+ "Custom Monitor Type": "Monitor Tipo Personalizado",
+ "Primary Base URL": "URL Base Primaria",
+ "Passive Monitor Type": "Monitor Tipo Pasivo",
+ "pushOptionalParams": "Parámetros opcionales: {0}",
+ "Schedule maintenance": "Programar mantenimiento",
+ "Pick Affected Monitors...": "Seleccionar Monitores Afectados…",
+ "Start of maintenance": "Inicio del mantenimiento",
+ "All Status Pages": "Todas las Páginas de Estado",
+ "Select status pages...": "Seleccionar páginas de estado…",
+ "Style": "Estilo",
+ "info": "información",
+ "warning": "advertencia",
+ "danger": "peligro",
+ "critical": "crítico",
+ "primary": "primario",
+ "Content": "Contenido",
+ "recent": "Reciente",
+ "Done": "Terminado",
+ "Create Incident": "Crear Incidente",
+ "Title": "Título",
+ "Info": "Información",
+ "Security": "Seguridad",
+ "Current User": "Usuario Actual",
+ "topic": "Asunto",
+ "Shrink Database": "Reducir Base de Datos",
+ "dark": "oscuro",
+ "light": "claro",
+ "Last Updated": "Última Actualización",
+ "Show Tags": "Mostrar Etiquetas",
+ "Switch to Light Theme": "Cambiar a Tema Claro",
+ "Add one": "Añadir uno",
+ "Description": "Descripción",
+ "Cancel": "Cancelar",
+ "No Monitors": "Sin Monitores",
+ "Untitled Group": "Grupo sin título",
+ "Services": "Servicios",
+ "Discard": "Descartar",
+ "Add New Status Page": "Añadir Nueva Página de Estado",
+ "Start": "Iniciar",
+ "Stop": "Parar",
+ "Remove Token": "Eliminar Token",
+ "Powered by": "Potenciado por",
+ "Customize": "Personalizar",
+ "Custom Footer": "Pie Personalizado",
+ "Custom CSS": "CSS Personalizado",
+ "Backup": "Respaldo",
+ "Go back to the previous page.": "Volver a la página anterior.",
+ "Query": "Consulta",
+ "Examples": "Ejemplos",
+ "weekdayShortMon": "Lun",
+ "weekdayShortWed": "Mie",
+ "weekdayShortSat": "Sab",
+ "Ignore TLS Error": "Ignorar Error TLS",
+ "secureOptionNone": "Ninguno / STARTTLS (25, 587)",
+ "Schedule Maintenance": "Programar Mantenimiento",
+ "Date and Time": "Fecha y Hora",
+ "Enable": "Habilitar",
+ "Disable": "Deshabilitar",
+ "maintenanceStatus-inactive": "Inactivo",
+ "maintenanceStatus-scheduled": "Programado",
+ "maintenanceStatus-unknown": "Desconocido",
+ "Display Timezone": "Mostrar Zona Horaria",
+ "Server Timezone": "Servidor de Zona Horaria",
+ "statusPageMaintenanceEndDate": "Finaliza",
+ "Enable DNS Cache": "Habilitar Cache DNS",
+ "No Maintenance": "Sin Mantenimiento",
+ "weekdayShortSun": "Dom",
+ "dayOfWeek": "Día de la Semana",
+ "dayOfMonth": "Día del Mes",
+ "lastDay": "Último día",
+ "lastDay1": "Último Día del Mes",
+ "pauseMaintenanceMsg": "¿Seguro que quiere pausar?",
+ "maintenanceStatus-under-maintenance": "En Mantenimiento",
+ "DateTime Range": "Rango de Fecha y Hora",
+ "infiniteRetention": "Poner a 0 para retención infinita.",
+ "confirmDeleteTagMsg": "¿Estas seguro que quieres eliminar esta etiqueta? Los monitores asociados a esta etiqueta no serán eliminados.",
+ "Example:": "Ejemplo: {0}",
+ "Strategy": "Estrategia",
+ "Read more:": "Leer más: {0}",
+ "onebotGroupMessage": "Grupo",
+ "Affected Monitors": "Monitores Afectados",
+ "Custom": "Personalizado",
+ "Headers": "Encabezados",
+ "PhoneNumbers": "Números de Teléfono",
+ "No monitors available.": "Sin monitores disponibles.",
+ "error": "error",
+ "deleteProxyMsg": "¿Seguro que quieres eliminar este proxy para todos los monitores?",
+ "Hide Tags": "Ocultar Etiquetas",
+ "Created": "Creado",
+ "Switch to Dark Theme": "Cambiar a Tema Oscuro",
+ "More info on:": "Más información en: {0}",
+ "weekdayShortTue": "Mar",
+ "PasswordsDoNotMatch": "Las contraseñas no coinciden.",
+ "statusMaintenance": "Mantenimiento",
+ "Maintenance": "Mantenimiento",
+ "General Monitor Type": "Monitor Tipo General",
+ "Specific Monitor Type": "Monitor Tipo Específico",
+ "Monitor": "Monitores",
+ "Resend Notification if Down X times consequently": "Reenviar Notificación si Caído X veces consecutivas",
+ "resendEveryXTimes": "Reenviar cada {0} veces",
+ "resendDisabled": "Reenvío deshabilitado",
+ "needPushEvery": "Debe llamar a esta URL cada {0} segundos.",
+ "here": "aquí",
+ "Content Type": "Tipo de Contenido",
+ "Required": "Requerido",
+ "defaultNotificationName": "Mi {notification} Alerta ({number})",
+ "Server URL": "URL del servidor",
+ "Priority": "Prioridad",
+ "Read more": "Leer más",
+ "Body": "Cuerpo",
+ "webhookAdditionalHeadersTitle": "Encabezados Adicionales",
+ "Method": "Método",
+ "Default": "Predeterminado",
+ "uninstalling": "Desinstalando",
+ "install": "Instalar",
+ "installing": "Instalando",
+ "uninstall": "Desinstalar",
+ "confirmUninstallPlugin": "¿Estas seguro que quieres desinstalar este complemento?",
+ "Recipients": "Destinatarios",
+ "User ID": "ID de Usuario",
+ "deleteMaintenanceMsg": "¿Seguro que quieres eliminar este mantenimiento?",
+ "promosmsLogin": "Nombre de inicio de sesión de la API",
+ "SMS Type": "Tipo de SMS",
+ "Device": "Dispositivo",
+ "Message Title": "Título del Mensaje",
+ "Notification Sound": "Sonido de Notificación",
+ "documentation": "documentación",
+ "onebotUserOrGroupId": "Grupo/ID de Usuario",
+ "Game": "Juego",
+ "or": "ó",
+ "Status:": "Estado: {0}",
+ "Help": "Ayuda",
+ "HTTP Options": "Opciones HTTP",
+ "weekdayShortThu": "Jue",
+ "weekdayShortFri": "Vie",
+ "maintenanceStatus-ended": "Finalizado",
+ "BodyInvalidFormat": "El cuerpo de la solicitud no es JSON válido: ",
+ "topicExplanation": "Tema MQTT para monitorear",
+ "successMessageExplanation": "Mensaje MQTT que será considerado como éxito",
+ "Steam API Key": "API Key de Steam",
+ "Please input title and content": "Por favor introduzca título y contenido",
+ "Footer Text": "Texto del Pié",
+ "Show Powered By": "Mostrar Potenciado Por",
+ "Domain Names": "Nombres de Dominio",
+ "signedInDisp": "Iniciada sesión como {0}",
+ "RadiusSecretDescription": "Secreto Compartido entre cliente y servidor",
+ "RadiusCalledStationId": "Id de la Estación Llamada",
+ "RadiusCalledStationIdDescription": "Identificador del dispositivo llamado",
+ "RadiusCallingStationId": "Id de Estación Llamante",
+ "Certificate Expiry Notification": "Notificación de Caducidad del Certificado",
+ "API Username": "Nombre Usuario API",
+ "API Key": "Clave API",
+ "Show update if available": "Mostrar actualización si está disponible",
+ "Also check beta release": "Comprobar también lanzamientos beta",
+ "Steam Game Server": "Servidor de Juegos de Steam",
+ "Most likely causes:": "Las causas más probables:",
+ "There might be a typing error in the address.": "Debe haber un error de escritura en la dirección.",
+ "What you can try:": "Lo que puedes intentar:",
+ "Retype the address.": "Reescriba la dirección.",
+ "Coming Soon": "Próximamente",
+ "Connection String": "Cadena de Conexión",
+ "settingsCertificateExpiry": "Caducidad del certificado TLS",
+ "certificationExpiryDescription": "Los monitores HTTPS activan una notificación cuando el certificado TLS caduca en:",
+ "Setup Docker Host": "Configurar Host de Docker",
+ "Connection Type": "Tipo de Conexión",
+ "Docker Daemon": "Demonio Docker",
+ "deleteDockerHostMsg": "¿Estas seguro que quieres eliminar este host de docker para todos los monitores?",
+ "Date Created": "Fecha de Creación",
+ "signedInDispDisabled": "Autenticación Deshabilitada.",
+ "RadiusCallingStationIdDescription": "Identificador del dispositivo llamante",
+ "Using a Reverse Proxy?": "¿Usando un Proxy Inverso?",
+ "Check how to config it for WebSocket": "Compruebe cómo configurarlo para WebSocket",
+ "The resource is no longer available.": "El recurso ya no está disponible.",
+ "Push URL": "URL Push",
+ "Webhook URL": "URL Webhook",
+ "Application Token": "Token de Aplicación",
+ "appriseNotInstalled": "Apprise no está instalado. {0}",
+ "PushUrl": "URL Push",
+ "HeadersInvalidFormat": "Los encabezados de solicitud no son JSON válido: ",
+ "Post URL": "URL Post",
+ "emojiCheatSheet": "Hoja de trucos Emoji: {0}",
+ "webhookJsonDesc": "{0} es bueno para cualquier servidor HTTP moderno como Express.js",
+ "webhookFormDataDesc": "{multipart} es bueno para PHP. El JSON deberá analizarse con {decodeFunction}",
+ "webhookAdditionalHeadersDesc": "Establece encabezados adicionales enviados con el webhook.",
+ "appriseInstalled": "Apprise está instalado.",
+ "successMessage": "Mensaje de éxito",
+ "Pick Accepted Status Codes...": "Elija códigos de estado aceptados…",
+ "Post": "Post",
+ "shrinkDatabaseDescription": "Activar ASPIRADORA para SQLite. Si tu base de datos fue creada después 1.10.0, AUTO_ASPIRADORA ya está habilitada y esta acción no es necesaria.",
+ "deleteStatusPageMsg": "¿Estas seguro que quieres eliminar esta página de estado?",
+ "default": "Predeterminado",
+ "enabled": "Habilitado",
+ "setAsDefault": "Establecer Por Defecto",
+ "proxyDescription": "Proxies deben ser asignados a un monitor para que funcionen.",
+ "warningTimezone": "Está usando la zona horaria del servidor",
+ "trustProxyDescription": "Confiar en los encabezados 'X-Forwarded-*'. Si desea obtener la IP de cliente correcta y su Uptime Kuma está detrás de un proxy como Nginx o Apache, debe habilitar esto.",
+ "enableProxyDescription": "Este proxy no afectará las solicitudes de monitoreo hasta que se active. Puede controlar deshabilitar temporalmente el proxy de todos los monitores por estado de activación.",
+ "setAsDefaultProxyDescription": "Este proxy estará habilitado de forma predeterminada para los nuevos monitores. Todavía puede deshabilitar el proxy por separado para cada monitor.",
+ "Certificate Chain": "Cadena de certificado",
+ "Valid": "Válido",
+ "Invalid": "Inválido",
+ "User": "Usuario",
+ "Installed": "Instalado",
+ "Not installed": "No instalado",
+ "Running": "Funcionando",
+ "Not running": "No funcionando",
+ "Slug": "Slug",
+ "Accept characters:": "Aceptar caracteres:",
+ "Proxies": "Proxys",
+ "startOrEndWithOnly": "Empezar o terminar sólo con {0}",
+ "No consecutive dashes": "Sin guiones consecutivos",
+ "Next": "Siguiente",
+ "The slug is already taken. Please choose another slug.": "Este slug ya está en uso. Por favor, elige otro slug.",
+ "No Proxy": "Sin Proxy",
+ "Authentication": "Autenticación",
+ "HTTP Basic Auth": "Autenticación básica HTTP",
+ "New Status Page": "Nueva Página de Estado",
+ "Page Not Found": "Página No Encontrada",
+ "Reverse Proxy": "Proxy Inverso",
+ "About": "Acerca de",
+ "wayToGetCloudflaredURL": "(Descargar cloudflared de {0})",
+ "cloudflareWebsite": "Web de Cloudflare",
+ "Message:": "Mensaje:",
+ "Don't know how to get the token? Please read the guide:": "No sabes como obtener el token? Por favor, lee la guía:",
+ "The current connection may be lost if you are currently connecting via Cloudflare Tunnel. Are you sure want to stop it? Type your current password to confirm it.": "La conexión actual puede perderse si actualmente se está conectando a través del Tunel Cloudflare. ¿Seguro que quieres detenerlo? Escriba su contraseña actual para confirmarlo.",
+ "HTTP Headers": "Encabezados HTTP",
+ "Trust Proxy": "Proxy de Confianza",
+ "Other Software": "Otro Software",
+ "For example: nginx, Apache and Traefik.": "Por ejemplo: nginx, Apache y Traefik.",
+ "Please read": "Por favor lee",
+ "Subject:": "Asunto:",
+ "Valid To:": "Válido Para:",
+ "Days Remaining:": "Días Restantes:",
+ "Issuer:": "Emisor:",
+ "Fingerprint:": "Huella:",
+ "No status pages": "Sin páginas de estado",
+ "Domain Name Expiry Notification": "Notificación de Caducidad de Nombre de Dominio",
+ "Proxy": "Proxy",
+ "RadiusSecret": "Secreto de Radius",
+ "socket": "Socket",
+ "tcp": "TCP / HTTP",
+ "Docker Container": "Contenedor de Docker",
+ "Container Name / ID": "Nombre / ID de Contenedor",
+ "Docker Host": "Host Docker",
+ "Docker Hosts": "Hosts Docker",
+ "Domain": "Dominio",
+ "Workstation": "Puesto de Trabajo",
+ "Packet Size": "Tamaño del Paquete",
+ "ZohoCliq": "ZohoCliq",
+ "Bot Token": "Token de Bot",
+ "wayToGetTelegramToken": "Puedes conseguir un token desde {0}.",
+ "Chat ID": "ID de Chat",
+ "supportTelegramChatID": "Chat Directo de Soporte / Grupo / ID de Chat del Canal",
+ "wayToGetTelegramChatID": "Puedes obtener tu ID de chat enviando un mensaje al bot y visitando esta URL para ver el chat_id:",
+ "YOUR BOT TOKEN HERE": "TU TOKEN DE BOT AQUÍ",
+ "chatIDNotFound": "ID de Chat no encontrada; por favor, primero envía un mensaje a este bot",
+ "disableCloudflaredNoAuthMsg": "Estas en modo No Autenticado, no es necesaria una contraseña.",
+ "wayToGetLineNotifyToken": "Puede obtener un token de acceso desde {0}",
+ "Home Assistant URL": "URL de Asistente de Hogar",
+ "Long-Lived Access Token": "Token de acceso de larga duración",
+ "Notification Service": "Servicio de Notificaciones",
+ "default: notify all devices": "predeterminado: notificar todos los dispositivos",
+ "A list of Notification Services can be found in Home Assistant under \"Developer Tools > Services\" search for \"notification\" to find your device/phone name.": "Puede encontrar una lista de Servicios de notificación en Asistente de Hogar en \"Herramientas para desarrolladores > Servicios\", busque \"notificación\" para encontrar el nombre de su dispositivo/teléfono.",
+ "Automations can optionally be triggered in Home Assistant:": "Las automatizaciones se pueden activar opcionalmente en Asistente de Hogar:",
+ "Trigger type:": "Tipo de disparador:",
+ "Event type:": "Tipo de Evento:",
+ "Event data:": "Datos del Evento:",
+ "Then choose an action, for example switch the scene to where an RGB light is red.": "Luego elija una acción, por ejemplo, cambie la escena a donde una luz RGB es roja.",
+ "Frontend Version": "Versión de Interfaz",
+ "Frontend Version do not match backend version!": "La Versión de Interfaz no coincide con la versión backend!",
+ "backupRecommend": "Por favor, haz copia de seguridad del volumen o el archivo de datos (./data/) directamente en su lugar.",
+ "recurringInterval": "Intervalo",
+ "Recurring": "Periódico",
+ "strategyManual": "Activo/Inactivo Manualmente",
+ "lastDay2": "Penúltimo Día del Mes",
+ "lastDay3": "Antepenúltimo día del mes",
+ "lastDay4": "Trasantepenúltimo Día del Mes",
+ "IconUrl": "URL de Icono",
+ "dnsCacheDescription": "Es posible que no funcione en algunos entornos IPv6; desactívelo si encuentra algún problema.",
+ "Single Maintenance Window": "Ventana de Mantenimiento Único",
+ "secureOptionTLS": "TLS (465)",
+ "aboutMattermostChannelName": "Puedes sobreescribir el canal por defecto en el cual el Webhook publica introduciendo el nombre del canal en el campo \"Nombre del Canal\". Esto tiene que estar habilitado en la configuración de Mattermost Webhook. Ejemplo: #otro-canal",
+ "dataRetentionTimeError": "El periodo de retención debe ser 0 o mayor",
+ "Enable TLS": "Habilita TLS",
+ "Lowcost": "Bajo coste",
+ "You can divide numbers with": "Puedes dividir números con",
+ "Base URL": "URL Base",
+ "Proto Service Name": "Nombre de Servicio Proto",
+ "Proto Method": "Método Proto",
+ "Proto Content": "Contenido Proto",
+ "Economy": "Económico",
+ "iOS": "iOS",
+ "Android": "Android",
+ "Platform": "Plataforma",
+ "onebotPrivateMessage": "Privado",
+ "onebotMessageType": "Tipo de Mensaje OneBot",
+ "smseagleRecipientType": "Tipo de destinatario",
+ "smseagleRecipient": "Destinatario(s) (multiples deben separarse por comas)",
+ "smseagleEncoding": "Enviar como Unicode",
+ "smseaglePriority": "Prioridad del mensaje (0-9, predeterminado = 0)",
+ "stackfield": "Stackfield",
+ "Leave blank to use a shared sender number.": "Dejar en blanco para usar un número de remitente compartido.",
+ "Octopush API Version": "Versión API Octopush",
+ "From Name/Number": "De Nombre/Número",
+ "Recipient Number": "Número de Destinatario",
+ "Long-Lived Access Token can be created by clicking on your profile name (bottom left) and scrolling to the bottom then click Create Token. ": "El token de acceso de larga duración se puede crear haciendo clic en el nombre de su perfil (abajo a la izquierda) y desplazándose hasta la parte inferior y luego haciendo clic en Crear token. ",
+ "backupOutdatedWarning": "Obsoleto: dado que se agregaron muchas funciones y esta función de copia de seguridad no se mantiene desde hace un tiempo, no puede generar ni restaurar una copia de seguridad completa.",
+ "Optional": "Opcional",
+ "loadingError": "No se pueden obtener los datos, inténtelo de nuevo más tarde.",
+ "pushoverDesc2": "Si quieres enviar notificaciones a diferentes dispositivos, rellena el campo Dispositivo.",
+ "octopushLegacyHint": "Utilizas la versión anterior de Octopush (2011-2020) o la nueva versión?",
+ "Sms template must contain parameters: ": "La plantilla SMS debería contener parámetros: ",
+ "For safety, must use secret key": "Por seguridad, deberías usar key secreta",
+ "signalImportant": "IMPORTANTE: No puedes mezclar grupos y números en destinatarios!",
+ "aboutWebhooks": "Más información sobre Webhooks en: {0}",
+ "smtpDkimHashAlgo": "Algoritmo Hash (Opcional)",
+ "promosmsPhoneNumber": "Número de teléfono (para destinatarios Polacos puedes omitir los códigos de área)",
+ "promosmsTypeFlash": "SMS FLASH - Mensaje se mostrará automáticamente en el dispositivo del destinatario. Limitado sólo a destinatarios Polacos.",
+ "promosmsSMSSender": "Nombre de Remitente SMS: Nombre pre-registrado o uno de los predeterminados: InfoSMS, SMS Info, MaxSMS, INFO, SMS",
+ "matrixDesc1": "Puedes encontrar la ID de sala interna mirando en la sección avanzado de los ajustes de sala en tu cliente Matrix. Debería ser algo como !QMdRCpUIfLwsfjxye6:home.server.",
+ "matrixDesc2": "Es altamente recomendable crear un nuevo usuario y no usar el token de acceso propio de tu usuario porque otorgaría acceso completo a tu cuenta y todas las salas que hayas entrado. En su lugar, crea un usuario nuevo e invítalo a la sala donde quieres recibir las notificaciones. Puedes obtener el token de acceso ejecutando {0}",
+ "plugin": "Complemento | Complementos",
+ "From Email": "Desde el Email",
+ "emailCustomSubject": "Asunto Personalizado",
+ "To Email": "Al Email",
+ "smtpCC": "CC",
+ "smtpBCC": "CCO",
+ "Discord Webhook URL": "URL Webhook de Discord",
+ "wayToGetDiscordURL": "Puede obtener esto yendo a Configuración del servidor -> Integraciones -> Crear webhook",
+ "Bot Display Name": "Nombre para mostrar del Bot",
+ "Hello @everyone is...": "Hola {'@'}todos están…",
+ "wayToGetTeamsURL": "Puedes aprender cómo crear una URL webhook {0}.",
+ "wayToGetZohoCliqURL": "Puedes aprender cómo crear una URL webhook {0}.",
+ "needSignalAPI": "Necesitas tener un cliente de señal con API REST.",
+ "wayToCheckSignalURL": "Puedes revisar esta URL para ver cómo configurar uno:",
+ "Number": "Número",
+ "Access Token": "Token de Acceso",
+ "Channel access token": "Token de acceso al canal",
+ "Line Developers Console": "Consola de Desarrolladores de Line",
+ "lineDevConsoleTo": "Consola de Desarrolladores de Line - {0}",
+ "Basic Settings": "Configuración Básica",
+ "Messaging API": "API de Mensajería",
+ "wayToGetLineChannelToken": "Primero accede al {0}, crea un proveedor y un canal (API de Mensajería), entonces puedes obtener el token de acceso al cana y el ID de usuario de los elementos de menú anteriormente mencionados.",
+ "Icon URL": "URL de Icono",
+ "aboutIconURL": "Puede proporcionar un enlace a una imagen en \"URL de icono\" para anular la imagen de perfil predeterminada. No se utilizará si se establece Icono Emoji.",
+ "enableGRPCTls": "Permite enviar solicitudes gRPC con conexión TLS",
+ "grpcMethodDescription": "Nombre del método es convertido a formato cammelCase tal como digoHola, verificandoTodo, etc.",
+ "dnsPortDescription": "Puerto servidor DNS. Por defecto al 53. Puedes cambiar el puerto en cualquier momento.",
+ "recurringIntervalMessage": "Ejecutar una vez al día | Ejecutar una vez cada {0} días",
+ "affectedMonitorsDescription": "Selecciona los monitores que se ven afectados por el mantenimiento actual",
+ "affectedStatusPages": "Muestra este mensaje de mantenimiento en las páginas de estado seleccionadas",
+ "atLeastOneMonitor": "Selecciona al menos un monitor afectado",
+ "endpoint": "punto final",
+ "promosmsPassword": "Contraseña API",
+ "pushoversounds pushover": "Pushover (predeterminado)",
+ "pushoversounds bike": "Bicicleta",
+ "pushoversounds bugle": "Bugle",
+ "pushoversounds cashregister": "Caja Registradora",
+ "pushoversounds classical": "Clásica",
+ "pushoversounds cosmic": "Cósmico",
+ "pushoversounds falling": "Descendente",
+ "pushoversounds gamelan": "Gamelán",
+ "pushoversounds incoming": "Entrante",
+ "pushoversounds intermission": "Intermedio",
+ "pushoversounds magic": "Mágico",
+ "pushoversounds mechanical": "Mecánica",
+ "pushoversounds pianobar": "Bar Piano",
+ "pushoversounds siren": "Sirena",
+ "pushoversounds spacealarm": "Alarma Espacial",
+ "pushoversounds tugboat": "Remolcador",
+ "pushoversounds alien": "Alarma Alienígena (largo)",
+ "pushoversounds climb": "Escalada (largo)",
+ "pushoversounds persistent": "Persistente (largo)",
+ "pushoversounds echo": "Pushover Eco (largo)",
+ "pushoversounds updown": "Arriba Abajo (largo)",
+ "pushoversounds vibrate": "Sólo Vibración",
+ "pushoversounds none": "Ninguno (silencio)",
+ "pushyAPIKey": "Key de Api Secreta",
+ "pushyToken": "Token de Dispositivo",
+ "PushByTechulus": "Push con Techulus",
+ "clicksendsms": "SMS con ClickSend",
+ "GoogleChat": "Chat de Google (sólo Google Workspace)",
+ "Kook": "Kook",
+ "wayToGetKookBotToken": "Crea aplicación y obtén tu token de bot en {0}",
+ "wayToGetKookGuildID": "Activa 'Modo Desarrollador' en los ajustes de Kook, y haz click derecho en la unión para obtener su ID",
+ "Guild ID": "",
+ "User Key": "Key de Usuario",
+ "octopushTypePremium": "Premium (Rápido - recomendado para alertas)",
+ "octopushTypeLowCost": "Bajo Coste (Lento - algunas veces bloqueado por operador)",
+ "checkPrice": "Consultar {0} precios:",
+ "apiCredentials": "Credenciales de API",
+ "Check octopush prices": "Consulta los precios de octopush {0}.",
+ "octopushPhoneNumber": "Número de teléfono (en formato internacional, ejemplo: +33612345678) ",
+ "octopushSMSSender": "Nombre de Remitente del SMS: 3-11 caracteres alfanuméricos y espacio (a-zA-Z0-9)",
+ "LunaSea Device ID": "ID Dispositivo LunaSea",
+ "goAlert": "GoAlert",
+ "pushoverDesc1": "La prioridad Emergencia (2) tiene predeterminado un tiempo muerto entre reintentos de 30 segundos y expirará después de 1 hora.",
+ "AccessKeyId": "ID de Key de Acceso",
+ "SecretAccessKey": "Secrreto de Key de Acceso",
+ "TemplateCode": "Código de Plantilla",
+ "Bark Group": "Grupo de Bark",
+ "Bark Sound": "Sonido de Bark",
+ "SecretKey": "Key Secreta",
+ "Huawei": "Huawei",
+ "Retry": "Reintentar",
+ "Proxy Server": "Servidor Proxy",
+ "Proxy Protocol": "Protocolo Proxy",
+ "Setup Proxy": "Configurar Proxy",
+ "Proxy server has authentication": "El servidor Proxy tiene autenticación",
+ "promosmsAllowLongSMS": "Permitir SMS largo",
+ "Uptime Kuma URL": "URL de Uptime Kuma",
+ "Icon Emoji": "Icono Emoji",
+ "aboutKumaURL": "Si dejas vacío el campo URL Uptime Kuma, predeterminará la página GitHub del Proyecto.",
+ "smtpDkimSettings": "Ajustes DKIM",
+ "smtpDkimDomain": "Nombre de Dominio",
+ "smtpDkimKeySelector": "Selector de Key",
+ "smtpDkimPrivateKey": "Key Privada",
+ "Integration Key": "Key de Integración",
+ "Integration URL": "URL de Integración",
+ "Device Token": "Token de Dispositivo",
+ "WeCom Bot Key": "Key de Bot WeCom",
+ "promosmsTypeEco": "SMS ECO - barato pero lento y a veces sobrecargado. Limitado sólo a destinatarios Polacos.",
+ "promosmsTypeSpeed": "SMS SPEED - La mayor prioridad en el sistema. Muy rápido y confiable pero costoso (alrededor del doble del precio de SMS FULL).",
+ "matrixHomeserverURL": "URL Servidor Casero (con http(s):// y opcionalmente el puerto)",
+ "Internal Room Id": "ID de Sala Interna",
+ "Channel Name": "Nombre del canal",
+ "aboutChannelName": "Introduce el nombre del canal en {0} campo Nombre del Canal si quieres evitar el canal Webhook. Ejemplo: #otro-canal",
+ "smtpDkimDesc": "Por favor, remitir a DKIM Nodemailer {0} para descubrir como se usa.",
+ "smtpDkimheaderFieldNames": "Keys de encabezado para firmar (Opcional)",
+ "smtpDkimskipFields": "Keys de encabezado para no firmar (Opcional)",
+ "Auto resolve or acknowledged": "Resolución automática o reconocida",
+ "promosmsTypeFull": "SMS FULL - Nivel Premium de SMS, puedes usar tu Nombre de Remitente (Tienes que registrarlo primero). Confiable para alertas.",
+ "do nothing": "no hacer nada",
+ "alerta": "Alerta",
+ "serwersmsAPIPassword": "Contraseña de API",
+ "serwersmsPhoneNumber": "Número de teléfono",
+ "smseagle": "SMSEagle",
+ "smseagleTo": "Número(s) de teléfono",
+ "serwersmsSenderName": "Nombre de remitente de SMS (registrado a través del portal de cliente)",
+ "auto resolve": "resolución automática",
+ "auto acknowledged": "Auto reconocida",
+ "alertaEnvironment": "Entorno",
+ "PushDeer Key": "Key de PushDeer",
+ "onebotSafetyTips": "Por seguridad, deberías colocara el token de acceso",
+ "wayToGetClickSendSMSToken": "Puedes obtener Nombre de Usuario API y la Key API en {0}.",
+ "Apprise URL": "URL Apprise",
+ "gorush": "Gorush",
+ "squadcast": "Squadcast",
+ "Maintenance Time Window of a Day": "Ventana de tiempo de mantenimiento de un día",
+ "Effective Date Range": "Rango de Fecha Efectivo"
}
From e1021ba38a2d5783bab4a2a9438a1d83be2d24b1 Mon Sep 17 00:00:00 2001
From: Dim
Date: Thu, 2 Feb 2023 16:04:50 +0000
Subject: [PATCH 0245/1864] Translated using Weblate (French)
Currently translated at 100.0% (692 of 692 strings)
Co-authored-by: Dim
Translate-URL: https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/fr/
Translation: Uptime Kuma/Uptime Kuma
---
src/lang/fr-FR.json | 20 ++++++++++----------
1 file changed, 10 insertions(+), 10 deletions(-)
diff --git a/src/lang/fr-FR.json b/src/lang/fr-FR.json
index d973ec4713..ae39af3c3e 100644
--- a/src/lang/fr-FR.json
+++ b/src/lang/fr-FR.json
@@ -15,10 +15,10 @@
"statusMaintenance": "Maintenance",
"Schedule maintenance": "Planifier la maintenance",
"Affected Monitors": "Sondes concernées",
- "Pick Affected Monitors...": "Sélectionner les sondes concernées...",
+ "Pick Affected Monitors...": "Sélectionner les sondes concernées…",
"Start of maintenance": "Début de la maintenance",
"All Status Pages": "Toutes les pages d'état",
- "Select status pages...": "Sélectionner les pages d'état...",
+ "Select status pages...": "Sélectionner les pages d'état…",
"recurringIntervalMessage": "Exécuter une fois par jour | Exécuter une fois tous les {0} jours",
"affectedMonitorsDescription": "Sélectionnez les sondes concernées par la maintenance en cours",
"affectedStatusPages": "Afficher ce message de maintenance sur les pages d'état sélectionnées",
@@ -29,7 +29,7 @@
"pauseDashboardHome": "En pause",
"deleteMonitorMsg": "Êtes-vous sûr de vouloir supprimer cette sonde ?",
"deleteMaintenanceMsg": "Voulez-vous vraiment supprimer cette maintenance ?",
- "deleteNotificationMsg": "Êtes-vous sûr de vouloir supprimer ce type de notifications ? Une fois désactivée, les services qui l'utilisent ne pourront plus envoyer de notifications.",
+ "deleteNotificationMsg": "Êtes-vous sûr de vouloir supprimer ce type de notification pour toutes les sondes ?",
"dnsPortDescription": "Port du serveur DNS. La valeur par défaut est 53. Vous pouvez modifier le port à tout moment.",
"resolverserverDescription": "Le DNS de Cloudflare est utilisé par défaut, mais vous pouvez le changer si vous le souhaitez.",
"rrtypeDescription": "Veuillez sélectionner un type d'enregistrement DNS",
@@ -177,7 +177,7 @@
"Token": "Jeton",
"Show URI": "Afficher l'URI",
"Tags": "Étiquettes",
- "Add New below or Select...": "Ajoutez-en un en dessous ou sélectionnez-le ici...",
+ "Add New below or Select...": "Ajoutez-en un en dessous ou sélectionnez-le ici…",
"Tag with this name already exist.": "Une étiquette portant ce nom existe déjà.",
"Tag with this value already exist.": "Une étiquette avec cette valeur existe déjà.",
"color": "Couleur",
@@ -190,7 +190,7 @@
"Indigo": "Indigo",
"Purple": "Violet",
"Pink": "Rose",
- "Search...": "Rechercher...",
+ "Search...": "Rechercher…",
"Avg. Ping": "Ping moyen",
"Avg. Response": "Réponse moyenne",
"Entry Page": "Page d'accueil",
@@ -238,7 +238,7 @@
"wayToGetDiscordURL": "Vous pouvez l'obtenir en allant dans « Paramètres du serveur » -> « Intégrations » -> « Créer un Webhook »",
"Bot Display Name": "Nom du robot (affiché)",
"Prefix Custom Message": "Préfixe du message personnalisé",
- "Hello @everyone is...": "Bonjour {'@'}everyone il...",
+ "Hello @everyone is...": "Bonjour {'@'}everyone il…",
"teams": "Microsoft Teams",
"Webhook URL": "URL vers le webhook",
"wayToGetTeamsURL": "Vous pouvez apprendre comment créer une URL Webhook {0}.",
@@ -348,8 +348,8 @@
"Security": "Sécurité",
"Steam API Key": "Clé d'API Steam",
"Shrink Database": "Réduire la base de données",
- "Pick a RR-Type...": "Choisissez un type d'enregistrement...",
- "Pick Accepted Status Codes...": "Choisissez les codes de statut acceptés...",
+ "Pick a RR-Type...": "Choisissez un type d'enregistrement…",
+ "Pick Accepted Status Codes...": "Choisissez les codes de statut acceptés…",
"Default": "Défaut",
"HTTP Options": "Options HTTP",
"Create Incident": "Créer un incident",
@@ -593,7 +593,7 @@
"Domain": "Domaine",
"Workstation": "Poste de travail",
"disableCloudflaredNoAuthMsg": "Vous êtes en mode No Auth, un mot de passe n'est pas nécessaire.",
- "trustProxyDescription": "Faire confiance aux en-têtes 'X-Forwarded-*'. Si vous souhaitez obtenir la bonne adresse IP client et que votre Uptime Kuma se situe derrière (nginx ou Apache) vous devez l'activer.",
+ "trustProxyDescription": "Faire confiance aux en-têtes 'X-Forwarded-*'. Si vous souhaitez obtenir la bonne adresse IP client et que votre Uptime Kuma se situe derrière un proxy (comme nginx ou Apache) vous devez l'activer.",
"wayToGetLineNotifyToken": "Vous pouvez obtenir un jeton d'accès auprès de {0}",
"Examples": "Exemples",
"Home Assistant URL": "URL vers Home Assistant",
@@ -613,7 +613,7 @@
"goAlertInfo": "GoAlert est une application open source pour la planification des appels, les escalades automatisées et les notifications (comme les SMS ou les appels vocaux). Impliquez automatiquement la bonne personne, de la bonne manière et au bon moment ! {0}",
"goAlertIntegrationKeyInfo": "Obtenez la clé d'intégration d'API générique pour le service dans ce format \"aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee\" généralement la valeur du paramètre de jeton de l'URL copiée.",
"goAlert": "GoAlert",
- "backupOutdatedWarning": "Obsolète : étant donné que de nombreuses fonctionnalités ont été ajoutées et que cette fonctionnalité de sauvegarde est non maintenue, elle ne peut pas générer ou restaurer une sauvegarde complète.",
+ "backupOutdatedWarning": "Obsolète : étant donné que de nombreuses fonctionnalités ont été ajoutées et que cette fonctionnalité de sauvegarde est non maintenue, elle ne peut pas générer ou restaurer une sauvegarde complète.",
"backupRecommend": "Veuillez sauvegarder le volume ou le dossier de données (./data/) directement à la place.",
"Optional": "Optionnel",
"squadcast": "Squadcast",
From 99d4b8ba5015c4688f71d8ee772d75560759fdc4 Mon Sep 17 00:00:00 2001
From: mrkbaji
Date: Thu, 2 Feb 2023 16:04:50 +0000
Subject: [PATCH 0246/1864] Translated using Weblate (Hungarian)
Currently translated at 58.8% (407 of 692 strings)
Co-authored-by: mrkbaji
Translate-URL: https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/hu/
Translation: Uptime Kuma/Uptime Kuma
---
src/lang/hu.json | 50 ++++++++++++++++++++++++++++++++++++++++++------
1 file changed, 44 insertions(+), 6 deletions(-)
diff --git a/src/lang/hu.json b/src/lang/hu.json
index 78036a1f5e..a6424a0f57 100644
--- a/src/lang/hu.json
+++ b/src/lang/hu.json
@@ -56,9 +56,9 @@
"Uptime": "Uptime",
"Cert Exp.": "SSL lejárat",
"day": "nap",
- "-day": " nap",
+ "-day": "-nap",
"hour": "óra",
- "-hour": " óra",
+ "-hour": "- óra",
"Response": "Válasz",
"Ping": "Ping",
"Monitor Type": "Figyelő típusa",
@@ -197,7 +197,7 @@
"apprise": "Apprise (50+ értesítési szolgáltatás)",
"pushbullet": "Pushbullet",
"line": "Line Messenger",
- "mattermost": "Mattermost",
+ "mattermost": "A legfontosabb",
"Status Page": "Státusz oldal",
"Status Pages": "Státusz oldalak",
"Primary Base URL": "Elsődleges URL",
@@ -315,8 +315,8 @@
"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...",
+ "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",
@@ -372,5 +372,43 @@
"alertaApiKey": "API kulcs",
"alertaAlertState": "Figyelmeztetési állapot",
"alertaRecoverState": "Visszaállási állapot",
- "deleteStatusPageMsg": "Biztos, hogy törölni akarja a státusz oldalt?"
+ "deleteStatusPageMsg": "Biztos, hogy törölni akarja a státusz oldalt?",
+ "Start of maintenance": "Karbantartás kezdete",
+ "successMessageExplanation": "MQTT üzenet, amely sikeresnek minősül",
+ "weekdayShortFri": "Pé",
+ "lastDay2": "A hónap 2. utolsó napja",
+ "maintenanceStatus-under-maintenance": "Karbantartás alatt",
+ "dnsCacheDescription": "Előfordulhat, hogy bizonyos IPv6-környezetekben nem működik, tiltsa le, ha problémákat tapasztal.",
+ "Add New Status Page": "Új állapotoldal hozzáadása",
+ "The resource is no longer available.": "Az erőforrás már nem elérhető.",
+ "Show update if available": "Frissítés megjelenítése, ha elérhető",
+ "weekdayShortMon": "Hé",
+ "weekdayShortTue": "Ke",
+ "weekdayShortWed": "Sze",
+ "weekdayShortThu": "Csüt",
+ "weekdayShortSat": "Szo",
+ "weekdayShortSun": "Vas",
+ "dayOfWeek": "A hét napja",
+ "dayOfMonth": "A hónap napja",
+ "lastDay": "Utolsó nap",
+ "lastDay3": "A hónap 3. utolsó napja",
+ "lastDay4": "A hónap 4. utolsó napja",
+ "No Maintenance": "Nincs karbantartás",
+ "pauseMaintenanceMsg": "Biztosan szüneteltetni akarja?",
+ "maintenanceStatus-inactive": "Inaktív",
+ "maintenanceStatus-scheduled": "Ütemezett",
+ "maintenanceStatus-ended": "Végzett",
+ "maintenanceStatus-unknown": "Ismeretlen",
+ "Display Timezone": "Időzóna megjelenítése",
+ "Server Timezone": "Szerver időzóna",
+ "statusPageMaintenanceEndDate": "Vége",
+ "Enable DNS Cache": "DNS-gyorsítótár engedélyezése",
+ "Enable": "Engedélyezze",
+ "Disable": "Letiltás",
+ "Affected Monitors": "Érintett monitorok",
+ "Packet Size": "Csomag mérete",
+ "IconUrl": "Ikon URL",
+ "successMessage": "Sikeres üzenet",
+ "lastDay1": "A hónap utolsó napja",
+ "Guild ID": "Guild ID"
}
From 2b1cb66ff7f6a1baf2720268b9bc3c29383c754b Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=EC=98=A4=EB=A1=9C=EB=9D=BC?=
Date: Thu, 2 Feb 2023 16:04:50 +0000
Subject: [PATCH 0247/1864] Translated using Weblate (Korean)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Currently translated at 100.0% (692 of 692 strings)
Co-authored-by: 오로라
Translate-URL: https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/ko/
Translation: Uptime Kuma/Uptime Kuma
---
src/lang/ko-KR.json | 238 +++++++++++++++++++++++++++++++++++++-------
1 file changed, 201 insertions(+), 37 deletions(-)
diff --git a/src/lang/ko-KR.json b/src/lang/ko-KR.json
index 2cb2131c65..2c2297c60b 100644
--- a/src/lang/ko-KR.json
+++ b/src/lang/ko-KR.json
@@ -1,7 +1,7 @@
{
"languageName": "한국어",
- "checkEverySecond": "{0}초마다 확인해요.",
- "retryCheckEverySecond": "{0}초마다 다시 확인해요.",
+ "checkEverySecond": "{0}초마다 확인해요",
+ "retryCheckEverySecond": "{0}초마다 다시 확인해요",
"retriesDescription": "서비스가 중단된 후 알림을 보내기 전 최대 재시도 횟수",
"ignoreTLSError": "HTTPS 웹사이트에서 TLS/SSL 오류 무시하기",
"upsideDownModeDescription": "서버 상태를 반대로 표시해요. 서버가 작동하면 오프라인으로 표시할 거예요.",
@@ -14,7 +14,7 @@
"deleteMonitorMsg": "정말 이 모니터링을 삭제할까요?",
"deleteNotificationMsg": "정말 이 알림을 모든 모니터링에서 삭제할까요?",
"resolverserverDescription": "Cloudflare가 기본 서버예요, 원한다면 언제나 다른 Resolver 서버로 변경할 수 있어요.",
- "rrtypeDescription": "모니터링할 RR-Type을 선택해요.",
+ "rrtypeDescription": "모니터링할 RR-Type을 선택해요",
"pauseMonitorMsg": "정말 이 모니터링을 일시 정지할까요?",
"enableDefaultNotificationDescription": "새로 추가하는 모든 모니터링에 이 알림을 기본적으로 활성화해요. 각 모니터에 대해 별도로 알림을 비활성화할 수 있어요.",
"clearEventsMsg": "정말 이 모니터링에 대한 모든 이벤트를 삭제할까요?",
@@ -22,7 +22,7 @@
"confirmClearStatisticsMsg": "정말 모든 통계를 삭제할까요?",
"importHandleDescription": "이름이 같은 모든 모니터링이나 알림을 건너뛰려면 '기존값 건너뛰기'를 선택해주세요. '덮어쓰기'는 기존의 모든 모니터링과 알림을 삭제해요.",
"confirmImportMsg": "정말 백업을 가져올까요? 가져오기 옵션을 제대로 설정했는지 다시 확인해주세요.",
- "twoFAVerifyLabel": "토큰을 입력해 2단계 인증이 작동하는지 확인해주세요.",
+ "twoFAVerifyLabel": "토큰을 입력해 2단계 인증이 작동하는지 확인해주세요",
"tokenValidSettingsMsg": "토큰이 유효해요! 이제 2단계 인증 설정을 저장할 수 있어요.",
"confirmEnableTwoFAMsg": "정말 2단계 인증을 활성화할까요?",
"confirmDisableTwoFAMsg": "정말 2단계 인증을 비활성화할까요?",
@@ -98,7 +98,7 @@
"Enable Auth": "인증 활성화",
"disableauth.message1": "정말로 인증 기능을 끌까요?",
"disableauth.message2": "이 기능은 Cloudflare Access와 같은 서드파티 인증을 Uptime Kuma 앞에 둔 사용자를 위한 기능이에요.",
- "Please use this option carefully!": "신중하게 사용하세요.",
+ "Please use this option carefully!": "신중하게 사용하세요!",
"Logout": "로그아웃",
"Leave": "나가기",
"I understand, please disable": "기능에 대해 이해했으니 꺼주세요.",
@@ -154,7 +154,7 @@
"Token": "토큰",
"Show URI": "URI 보기",
"Tags": "태그",
- "Add New below or Select...": "아래 새롭게 추가 또는 선택...",
+ "Add New below or Select...": "아래 새롭게 추가 또는 선택…",
"Tag with this name already exist.": "같은 태그 이름이 이미 존재해요.",
"Tag with this value already exist.": "같은 값을 가진 태그가 이미 존재해요.",
"color": "색상",
@@ -167,7 +167,7 @@
"Indigo": "남색",
"Purple": "보라색",
"Pink": "핑크색",
- "Search...": "검색...",
+ "Search...": "검색…",
"Avg. Ping": "평균 핑",
"Avg. Response": "평균 응답",
"Entry Page": "첫 페이지",
@@ -189,15 +189,15 @@
"Bot Token": "봇 토큰",
"wayToGetTelegramToken": "토큰은 여기서 얻을 수 있어요: {0}.",
"Chat ID": "채팅 ID",
- "supportTelegramChatID": "개인 채팅 / 그룹 / 채널의 ID를 지원해요.",
- "wayToGetTelegramChatID": "봇에 메시지를 보내 채팅 ID를 얻고 밑에 URL로 이동해 chat_id를 볼 수 있어요.",
+ "supportTelegramChatID": "개인 채팅 / 그룹 / 채널의 ID를 지원해요",
+ "wayToGetTelegramChatID": "봇에 메시지를 보내 채팅 ID를 얻고 밑에 URL로 이동해 chat_id를 볼 수 있어요",
"YOUR BOT TOKEN HERE": "봇 토큰",
- "chatIDNotFound": "채팅 ID를 찾을 수 없어요. 먼저 봇에게 메시지를 보내주세요.",
+ "chatIDNotFound": "채팅 ID를 찾을 수 없어요. 먼저 봇에게 메시지를 보내주세요",
"webhook": "Webhook",
"Post URL": "Post URL",
"Content Type": "Content Type",
- "webhookJsonDesc": "{0}은 express.js와 같은 최신 HTTP 서버에 적합해요.",
- "webhookFormDataDesc": "{multipart}은 PHP에 적합해요. {decodeFunction}를 기준으로 json을 디코딩하면 되어요.",
+ "webhookJsonDesc": "{0}은 Express.js와 같은 최신 HTTP 서버에 적합해요",
+ "webhookFormDataDesc": "{multipart}은 PHP에 적합해요. {decodeFunction}를 기준으로 JSON을 디코딩하면 되어요",
"smtp": "Email (SMTP)",
"secureOptionNone": "없음 / STARTTLS (25, 587)",
"secureOptionTLS": "TLS (465)",
@@ -207,24 +207,24 @@
"smtpCC": "참조",
"smtpBCC": "숨은 참조",
"discord": "Discord",
- "Discord Webhook URL": "Discord Webhook URL",
- "wayToGetDiscordURL": "서버 설정 -> 연동 -> 웹후크 보기 -> 새 웹후크에서 얻을 수 있어요!",
+ "Discord Webhook URL": "Discord 웹훅 URL",
+ "wayToGetDiscordURL": "서버 설정 -> 연동 -> 웹후크 보기 -> 새 웹후크에서 얻을 수 있어요",
"Bot Display Name": "표시 이름",
"Prefix Custom Message": "접두사 메시지",
- "Hello @everyone is...": "{'@'}everyone 서버 상태 알림이에요...",
+ "Hello @everyone is...": "{'@'}everyone 서버 상태 알림이에요…",
"teams": "Microsoft Teams",
- "Webhook URL": "Webhook URL",
- "wayToGetTeamsURL": "{0}에서 Webhook을 어떻게 만드는지 알아보세요!",
+ "Webhook URL": "웹훅 URL",
+ "wayToGetTeamsURL": "{0}에서 Webhook을 어떻게 만드는지 알아보세요.",
"signal": "Signal",
"Number": "숫자",
"Recipients": "받는 사람",
"needSignalAPI": "REST API를 사용하는 Signal 클라이언트가 있어야 해요.",
- "wayToCheckSignalURL": "밑에 URL을 확인해 URL 설정 방법을 볼 수 있어요.",
+ "wayToCheckSignalURL": "밑에 URL을 확인해 URL 설정 방법을 볼 수 있어요:",
"signalImportant": "경고: 받는 사람의 그룹과 숫자는 섞을 수 없어요!",
"gotify": "Gotify",
"Application Token": "애플리케이션 토큰",
"Server URL": "서버 URL",
- "Priority": "Priority",
+ "Priority": "우선 순위",
"slack": "Slack",
"Icon Emoji": "아이콘 이모지",
"Channel Name": "채널 이름",
@@ -276,7 +276,7 @@
"aboutIconURL": "\"아이콘 URL\"에 사진 링크를 입력해 프로필 사진을 설정할 수 있어요. 아이콘 이모지가 설정되어 있으면 적용되지 않을 거예요.",
"aboutMattermostChannelName": "채널 이름을 입력하면 Webhook이 게시할 기본 채널을 재설정할 수 있어요. 이 설정은 Mattermost 웹훅 설정에서 활성화해야 해요. 예: #기타-채널",
"matrix": "Matrix",
- "promosmsTypeEco": "SMS ECO - 저렴하지만 느리고 가끔 과부하에 걸려요. 폴란드 수신자만 사용할 수 있어요. ",
+ "promosmsTypeEco": "SMS ECO - 저렴하지만 느리고 가끔 과부하에 걸려요. 폴란드 수신자만 사용할 수 있어요.",
"promosmsTypeFlash": "SMS FLASH - 메시지가 받는 사람 장치에 자동으로 표시되어요. 폴란드 수신자만 사용할 수 있어요.",
"promosmsTypeFull": "SMS FULL - SMS 프리미엄 티어, 보내는 사람 이름을 먼저 등록해야 해요. 알림 기능에 적합해요.",
"promosmsTypeSpeed": "SMS SPEED - 시스템에서 가장 높은 우선순위예요. 매우 빠르고 신뢰할 수 있지만 비용이 많이 들어요 (SMS 전체 가격의 약 두 배).",
@@ -295,10 +295,10 @@
"matrixHomeserverURL": "Homeserver URL (http(s):// 와 함께 적어주세요. 그리고 포트 번호는 선택적 입니다.)",
"Internal Room Id": "내부 방 ID",
"matrixDesc1": "Matrix 클라이언트 방 설정의 고급 섹션에서 내부 방 ID를 찾을 수 있어요. 내부 방 ID는 이렇게 생겼답니다: !QMdRCpUIfLwsfjxye6:home.server.",
- "matrixDesc2": "사용자의 모든 방에 대한 엑세스가 허용될 수 있어서 새로운 사용자를 만들고 원하는 방에만 초대한 후 엑세스 토큰을 사용하는 것이 좋아요. {0} 이 명령어를 통해 엑세스 토큰을 얻을 수 있어요.",
- "Method": "Method",
+ "matrixDesc2": "사용자의 모든 방에 대한 엑세스가 허용될 수 있어서 새로운 사용자를 만들고 원하는 방에만 초대한 후 엑세스 토큰을 사용하는 것이 좋아요. {0} 이 명령어를 통해 엑세스 토큰을 얻을 수 있어요",
+ "Method": "메서드",
"Body": "Body",
- "Headers": "Headers",
+ "Headers": "헤더",
"PushUrl": "Push URL",
"HeadersInvalidFormat": "요청 Headers의 JSON 형식이 올바르지 않아요: ",
"BodyInvalidFormat": "요청 Body의 JSON 형식이 올바르지 않아요: ",
@@ -315,8 +315,8 @@
"Security": "보안",
"Steam API Key": "스팀 API 키",
"Shrink Database": "데이터베이스 축소",
- "Pick a RR-Type...": "RR-Type을 골라주세요...",
- "Pick Accepted Status Codes...": "상태 코드를 골라주세요...",
+ "Pick a RR-Type...": "RR-Type을 골라주세요…",
+ "Pick Accepted Status Codes...": "상태 코드를 골라주세요…",
"Default": "기본",
"HTTP Options": "HTTP 옵션",
"Create Incident": "인시던트 만들기",
@@ -330,7 +330,7 @@
"light": "화이트",
"dark": "다크",
"Post": "게시",
- "Please input title and content": "제목과 내용을 작성해주세요.",
+ "Please input title and content": "제목과 내용을 작성해주세요",
"Created": "생성 날짜",
"Last Updated": "마지막 업데이트",
"Unpin": "제거",
@@ -375,7 +375,7 @@
"smtpDkimHashAlgo": "해시 알고리즘 (선택)",
"smtpDkimheaderFieldNames": "서명할 헤더 키 (선택)",
"smtpDkimskipFields": "서명하지 않을 헤더 키 (선택)",
- "wayToGetPagerDutyKey": "Service -> Service Directory -> (서비스 선택) -> Integrations -> Add integration. 에서 찾을 수 있어요. 자세히 알아보려면 {0}에서 \"Events API V2\"를 검색해봐요.",
+ "wayToGetPagerDutyKey": "Service -> Service Directory -> (서비스 선택) -> Integrations -> Add integration. 에서 찾을 수 있어요. 자세히 알아보려면 {0}에서 \"Events API V2\"를 검색해봐요",
"Integration Key": "Integration 키",
"Integration URL": "Integration URL",
"Auto resolve or acknowledged": "자동 해결 혹은 승인",
@@ -406,7 +406,7 @@
"PhoneNumbers": "휴대전화 번호",
"TemplateCode": "템플릿 코드",
"SignName": "SignName",
- "Sms template must contain parameters: ": "SMS 템플릿은 다음과 같은 파라미터가 포함되어야 해요:",
+ "Sms template must contain parameters: ": "SMS 템플릿은 다음과 같은 파라미터가 포함되어야 해요: ",
"Bark Endpoint": "Bark Endpoint",
"WebHookUrl": "웹훅 URL",
"SecretKey": "Secret Key",
@@ -436,7 +436,7 @@
"Add New Status Page": "새로운 상태 페이지 만들기",
"Slug": "주소",
"Accept characters:": "허용되는 문자열:",
- "startOrEndWithOnly": "{0}로 시작하거나 끝나야 해요.",
+ "startOrEndWithOnly": "{0} 로 시작하거나 끝나야 해요",
"No consecutive dashes": "연속되는 대시는 허용되지 않아요",
"Next": "다음",
"The slug is already taken. Please choose another slug.": "이미 존재하는 주소에요. 다른 주소를 사용해 주세요.",
@@ -456,10 +456,10 @@
"Other Software": "다른 소프트웨어",
"For example: nginx, Apache and Traefik.": "nginx, Apache, Traefik 등을 사용할 수 있어요.",
"Please read": "이 문서를 참조하세요:",
- "Subject:": "Subject:",
- "Valid To:": "Valid To:",
+ "Subject:": "발급 대상:",
+ "Valid To:": "유효 기간:",
"Days Remaining:": "남은 일수:",
- "Issuer:": "Issuer:",
+ "Issuer:": "발급 기관:",
"Fingerprint:": "Fingerprint:",
"No status pages": "상태 페이지 없음",
"Domain Name Expiry Notification": "도메인 이름 만료 알림",
@@ -470,7 +470,7 @@
"onebotGroupMessage": "그룹 메시지",
"onebotPrivateMessage": "개인 메시지",
"onebotUserOrGroupId": "그룹/사용자 ID",
- "onebotSafetyTips": "안전을 위해 Access 토큰을 설정하세요.",
+ "onebotSafetyTips": "안전을 위해 Access 토큰을 설정하세요",
"PushDeer Key": "PushDeer 키",
"Footer Text": "Footer 문구",
"Show Powered By": "Powered By 문구 표시하기",
@@ -524,8 +524,172 @@
"The resource is no longer available.": "더 이상 사용할 수 없어요...",
"There might be a typing error in the address.": "주소에 오탈자가 있을 수 있어요.",
"What you can try:": "해결 방법:",
- "Retype the address.": "주소 다시 입력하기",
- "Go back to the previous page.": "이전 페이지로 돌아가기",
- "Coming Soon": "Coming Soon...",
- "wayToGetClickSendSMSToken": "{0}에서 API 사용자 이름과 키를 얻을 수 있어요."
+ "Retype the address.": "주소 다시 입력하기.",
+ "Go back to the previous page.": "이전 페이지로 돌아가기.",
+ "Coming Soon": "Coming Soon",
+ "wayToGetClickSendSMSToken": "{0}에서 API 사용자 이름과 키를 얻을 수 있어요.",
+ "Custom Monitor Type": "커스텀 모니터링",
+ "deleteDockerHostMsg": "정말 이 도커 호스트를 모든 모니터링에서 삭제할까요?",
+ "trustProxyDescription": "'X-Forwarded-*' 헤더를 신뢰해요. 올바른 클라이언트 IP를 얻어야하고Uptime Kuma가 Nginx나 Apache 같은 프록시 뒤에 있다면 이 기능을 활성화해야 해요.",
+ "Long-Lived Access Token can be created by clicking on your profile name (bottom left) and scrolling to the bottom then click Create Token. ": "프로필 이름(왼쪽 아래)을 클릭하고 아래로 스크롤한 다음 토큰 만들기를 클릭하여 장기 액세스 토큰을 만들 수 있어요. ",
+ "Then choose an action, for example switch the scene to where an RGB light is red.": "그런 다음 동작을 선택해요, 예를 들어 장면을 RGB 조명이 빨간색인 곳으로 전환해요.",
+ "backupOutdatedWarning": "Deprecated: 많은 기능이 추가되었고 이 백업 기능은 유지 관리되지 않아 전체 백업을 생성하거나 복원할 수 없어요.",
+ "lastDay3": "매월 세 번째 마지막 날",
+ "maintenanceStatus-under-maintenance": "점검 중",
+ "dnsCacheDescription": "일부 IPv6 환경에서는 작동하지 않을 수 있어요. 문제가 발생하면 비활성화하세요.",
+ "dataRetentionTimeError": "저장 기간은 0 이상이어야 해요",
+ "wayToGetKookGuildID": "Kook 설정에서 'Developer Mode'를 활성화하고 길드를 우클릭해 ID를 얻어요",
+ "You can divide numbers with": "다음과 같이 숫자를 구분할 수 있어요:",
+ "goAlertInfo": "GoAlert는 온콜 스케줄링, 자동 에스컬레이션 및 알림(SMS 또는 음성 통화와 같은)을 위한 오픈 소스 응용 프로그램이에요. 올바른 사람, 올바른 방법, 적절한 시간에 자동으로 참여하세요! {0}",
+ "smseagle": "SMSEagle",
+ "smseagleTo": "휴대전화 번호",
+ "smseagleRecipient": "받는 사람 (쉼표로 구분)",
+ "Maintenance": "점검",
+ "statusMaintenance": "점검 중",
+ "resendEveryXTimes": "{0}번마다 다시 보내요",
+ "resendDisabled": "다시 보내지 않아요",
+ "loadingError": "데이터를 가져올 수 없어요, 나중에 다시 시도하세요.",
+ "plugin": "플러그인",
+ "install": "설치",
+ "installing": "설치 중",
+ "uninstall": "삭제",
+ "uninstalling": "삭제 중",
+ "confirmUninstallPlugin": "정말 이 플러그인을 삭제할까요?",
+ "Guild ID": "길드 ID",
+ "Strategy": "계획",
+ "Free Mobile User Identifier": "무료 모바일 사용자 식별",
+ "Free Mobile API Key": "무료 모바일 API 키",
+ "Enable TLS": "TLS 활성화",
+ "Proto Service Name": "Proto 서비스 이름",
+ "Proto Method": "Proto 메서드",
+ "Proto Content": "Proto Content",
+ "Economy": "경제적",
+ "high": "높음",
+ "Lowcost": "저비용",
+ "SendKey": "SendKey",
+ "SMSManager API Docs": "SMSManager API 문서 ",
+ "Gateway Type": "게이트웨이 종류",
+ "SMSManager": "SMSManager",
+ "Base URL": "베이스 URL",
+ "goAlertIntegrationKeyInfo": "일반적으로 복사된 URL의 토큰 매개 변수 값을 \"aaaaaa-bbb-ccccc-ddd-eeeeeeeee\" 형식으로 서비스에 대한 일반 API 통합 키를 가져와요.",
+ "goAlert": "GoAlert",
+ "Bark Group": "Bark 그룹",
+ "Bark Sound": "Bark 소리",
+ "promosmsAllowLongSMS": "긴 SMS 허용",
+ "smseagleGroup": "전화번호부 그룹 이름",
+ "smseagleContact": "전화번호부 연락처 이름",
+ "smseagleRecipientType": "받는 사람 종류",
+ "smseagleToken": "API 엑세스 토큰",
+ "smseagleUrl": "SMSEagle 기기 URL",
+ "smseagleEncoding": "유니코드로 보내기",
+ "smseaglePriority": "메시지 우선 순위 (0-9, 기본값= 0)",
+ "ntfy Topic": "ntfy 주제",
+ "HomeAssistant": "홈 어시스턴트",
+ "RadiusSecretDescription": "클라이언트와 서버 간의 비밀 키",
+ "RadiusSecret": "Radius 비밀 키",
+ "RadiusCalledStationId": "접속 스테이션의 Id",
+ "RadiusCalledStationIdDescription": "접속 스테이션의 식별자",
+ "RadiusCallingStationId": "접속 요청 스테이션의 Id",
+ "RadiusCallingStationIdDescription": "접속 요청 스테이션의 식별자",
+ "Query": "쿼리",
+ "settingsCertificateExpiry": "TLS 인증서 만료",
+ "certificationExpiryDescription": "HTTPS 모니터링 TLS 인증서가 만료되면 알림을 활성화해요:",
+ "Setup Docker Host": "도커 호스트 설정",
+ "Docker Daemon": "도커 데몬",
+ "socket": "소켓",
+ "tcp": "TCP / HTTP",
+ "Docker Container": "도커 컨테이너",
+ "Container Name / ID": "컨테이너 이름 / ID",
+ "Docker Host": "도커 호스트",
+ "Docker Hosts": "도커 호스트",
+ "Domain": "도메인",
+ "Connection String": "연결 문자열",
+ "Workstation": "워크스테이션",
+ "Packet Size": "패킷 크기",
+ "ZohoCliq": "ZohoCliq",
+ "disableCloudflaredNoAuthMsg": "인증 없음 모드이므로 암호가 필요하지 않아요.",
+ "wayToGetLineNotifyToken": "토큰은 여기서 얻을 수 있어요: {0}",
+ "Examples": "예시",
+ "Home Assistant URL": "홈 어시스턴트 URL",
+ "Long-Lived Access Token": "장기 엑세스 토큰",
+ "Notification Service": "알림 서비스",
+ "default: notify all devices": "기본값: 모든 장치에 알림",
+ "A list of Notification Services can be found in Home Assistant under \"Developer Tools > Services\" search for \"notification\" to find your device/phone name.": "알림 서비스 목록은 홈 어시스턴트의 \"개발자 도구 > 서비스\"에서 \"알림\" 검색해 장치/전화 이름을 찾을 수 있어요.",
+ "Automations can optionally be triggered in Home Assistant:": "자동화는 Home Assistant에서 선택적으로 트리거될 수 있어요:",
+ "Connection Type": "연결 종류",
+ "Trigger type:": "트리거 종류:",
+ "Event type:": "이벤트 종류:",
+ "Event data:": "이벤트 데이터:",
+ "Frontend Version": "프론트엔드 버전",
+ "Frontend Version do not match backend version!": "프론트엔드 버전이 백엔드 버전과 일치하지 않아요!",
+ "confirmDeleteTagMsg": "정말 이 태그를 삭제할까요? 이 태그와 연결된 모니터링은 삭제되지 않아요.",
+ "infiniteRetention": "무한히 저장하려면 0으로 설정하세요.",
+ "backupRecommend": "대신 볼륨 또는 데이터 폴더 (./data/) 를 직접 백업하세요.",
+ "Optional": "선택",
+ "squadcast": "Squadcast",
+ "or": "혹은",
+ "recurringInterval": "반복 - 주기적",
+ "Recurring": "반복",
+ "strategyManual": "직접 활성/비활성화 하기",
+ "warningTimezone": "서버 표준 시간대를 사용해요",
+ "weekdayShortMon": "월",
+ "weekdayShortTue": "화",
+ "weekdayShortWed": "수",
+ "weekdayShortThu": "목",
+ "weekdayShortFri": "금",
+ "weekdayShortSat": "토",
+ "weekdayShortSun": "일",
+ "dayOfWeek": "요일",
+ "dayOfMonth": "날짜",
+ "lastDay": "마지막 날",
+ "lastDay1": "매월 마지막 날",
+ "lastDay2": "매월 마지막 날",
+ "lastDay4": "매월 네 번째 마지막 날",
+ "No Maintenance": "점검 일정이 없어요",
+ "pauseMaintenanceMsg": "정말 일시 정지 할까요?",
+ "maintenanceStatus-inactive": "비활성화",
+ "maintenanceStatus-scheduled": "예약됨",
+ "maintenanceStatus-ended": "완료됨",
+ "maintenanceStatus-unknown": "알 수 없음",
+ "Server Timezone": "서버 시간대",
+ "Display Timezone": "표시 시간대",
+ "statusPageMaintenanceEndDate": "종료",
+ "IconUrl": "아이콘 URL",
+ "Enable DNS Cache": "DNS 캐시 활성화",
+ "Enable": "활성화",
+ "Disable": "비활성화",
+ "Single Maintenance Window": "단일 점검",
+ "Maintenance Time Window of a Day": "점검 시간",
+ "Effective Date Range": "유효 날짜 범위",
+ "Schedule Maintenance": "점검 예약하기",
+ "Date and Time": "날짜 및 시간",
+ "DateTime Range": "날짜 시간 범위",
+ "wayToGetZohoCliqURL": "{0}에서 Webhook을 어떻게 만드는지 배울 수 있어요.",
+ "enableGRPCTls": "TLS 연결 gRPC 요청 전송 허용",
+ "grpcMethodDescription": "메서드 이름은 sayHello, check와 같은 카멜 케이스로 변환되어요.",
+ "deleteMaintenanceMsg": "정말 이 점검을 삭제할까요?",
+ "recurringIntervalMessage": "매일 한 번 실행 | {0}일마다 한 번 실행",
+ "affectedMonitorsDescription": "현재 점검에 영향을 받는 모니터링 선택하기",
+ "affectedStatusPages": "점검 메시지를 표시할 상태 페이지 선택하기",
+ "Kook": "Kook",
+ "atLeastOneMonitor": "최소 1개의 모니터링을 선택하세요",
+ "wayToGetKookBotToken": "{0} 에서 애플리케이션을 만들고 봇 토큰을 얻어요",
+ "Help": "도움말",
+ "Game": "게임",
+ "General Monitor Type": "일반 모니터링",
+ "Passive Monitor Type": "수동 모니터링",
+ "Specific Monitor Type": "특정 모니터링",
+ "Monitor": "모니터",
+ "Resend Notification if Down X times consequently": "X번 중단될 경우 알림 다시 보내기",
+ "Schedule maintenance": "점검 예약하기",
+ "Affected Monitors": "영향을 받는 모니터링",
+ "Pick Affected Monitors...": "영향을 받는 모니터링 선택하기…",
+ "Start of maintenance": "점검 시작",
+ "All Status Pages": "모든 상태 페이지",
+ "Select status pages...": "상태 페이지 선택하기…",
+ "Custom": "커스텀",
+ "webhookAdditionalHeadersTitle": "추가 헤더",
+ "webhookAdditionalHeadersDesc": "웹훅과 함께 전송될 추가 헤더를 설정해요.",
+ "HTTP Headers": "HTTP 헤더",
+ "Trust Proxy": "프록시 신뢰"
}
From b2ddb5c9eb47105d9855106960e44295e04e427c Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Faruk=20Gen=C3=A7?=
Date: Thu, 2 Feb 2023 19:50:14 +0300
Subject: [PATCH 0248/1864] Dummy commit for build
---
src/lang/en.json | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/lang/en.json b/src/lang/en.json
index dc5663f1ab..e1d7abec5e 100644
--- a/src/lang/en.json
+++ b/src/lang/en.json
@@ -691,5 +691,5 @@
"PushDeer Key": "PushDeer Key",
"wayToGetClickSendSMSToken": "You can get API Username and API Key from {0} .",
"Custom Monitor Type": "Custom Monitor Type",
- "Body Encoding": "Body Encoding"
+ "Body Encoding": "Body Encoding",
}
From 603b3a7fb6145c196114f9786637430e65e6b561 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Faruk=20Gen=C3=A7?=
Date: Thu, 2 Feb 2023 19:50:29 +0300
Subject: [PATCH 0249/1864] Dummy commit for build
---
src/lang/en.json | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/lang/en.json b/src/lang/en.json
index e1d7abec5e..dc5663f1ab 100644
--- a/src/lang/en.json
+++ b/src/lang/en.json
@@ -691,5 +691,5 @@
"PushDeer Key": "PushDeer Key",
"wayToGetClickSendSMSToken": "You can get API Username and API Key from {0} .",
"Custom Monitor Type": "Custom Monitor Type",
- "Body Encoding": "Body Encoding",
+ "Body Encoding": "Body Encoding"
}
From 3819266fa83605fac57eed55bc003bb07f7f5c50 Mon Sep 17 00:00:00 2001
From: Matthew Nickson
Date: Thu, 2 Feb 2023 17:55:40 +0000
Subject: [PATCH 0250/1864] Fixed style of links in markdown
Signed-off-by: Matthew Nickson
---
src/assets/app.scss | 10 ++++++++++
1 file changed, 10 insertions(+)
diff --git a/src/assets/app.scss b/src/assets/app.scss
index 7da76fff03..f550406fd8 100644
--- a/src/assets/app.scss
+++ b/src/assets/app.scss
@@ -35,6 +35,11 @@ textarea.form-control {
color: $maintenance !important;
}
+.incident a,
+.bg-maintenance a {
+ color: inherit;
+}
+
.list-group {
border-radius: 0.75rem;
@@ -248,6 +253,11 @@ optgroup {
}
}
+ .incident a,
+ .bg-maintenance a {
+ color: inherit;
+ }
+
.form-control,
.form-control:focus,
.form-select,
From 29e24e0de96c20a598e41a8a500a8be5848664c4 Mon Sep 17 00:00:00 2001
From: c
Date: Sun, 8 Jan 2023 17:19:07 +0000
Subject: [PATCH 0251/1864] Feature - Added Optional Google Analytics tag for
Status Page.
---
db/patch-add-google-analytics-status-page-tag.sql | 4 ++++
server/database.js | 1 +
server/model/status_page.js | 2 ++
.../socket-handlers/status-page-socket-handler.js | 1 +
src/pages/StatusPage.vue | 15 +++++++++++++++
5 files changed, 23 insertions(+)
create mode 100644 db/patch-add-google-analytics-status-page-tag.sql
diff --git a/db/patch-add-google-analytics-status-page-tag.sql b/db/patch-add-google-analytics-status-page-tag.sql
new file mode 100644
index 0000000000..15305ae252
--- /dev/null
+++ b/db/patch-add-google-analytics-status-page-tag.sql
@@ -0,0 +1,4 @@
+-- You should not modify if this have pushed to Github, unless it does serious wrong with the db.
+BEGIN TRANSACTION;
+ALTER TABLE status_page ADD google_analytics_tag_id TEXT;
+COMMIT;
diff --git a/server/database.js b/server/database.js
index 06b811537f..52c701fb56 100644
--- a/server/database.js
+++ b/server/database.js
@@ -69,6 +69,7 @@ class Database {
"patch-ping-packet-size.sql": true,
"patch-maintenance-table2.sql": true,
"patch-add-gamedig-monitor.sql": true,
+ "patch-add-google-analytics-status-page-tag.sql": true
};
/**
diff --git a/server/model/status_page.js b/server/model/status_page.js
index 0dabf5ab1f..8dbf1a8c26 100644
--- a/server/model/status_page.js
+++ b/server/model/status_page.js
@@ -225,6 +225,7 @@ class StatusPage extends BeanModel {
customCSS: this.custom_css,
footerText: this.footer_text,
showPoweredBy: !!this.show_powered_by,
+ googleAnalyticsId: this.google_analytics_tag_id
};
}
@@ -245,6 +246,7 @@ class StatusPage extends BeanModel {
customCSS: this.custom_css,
footerText: this.footer_text,
showPoweredBy: !!this.show_powered_by,
+ googleAnalyticsId: this.google_analytics_tag_id
};
}
diff --git a/server/socket-handlers/status-page-socket-handler.js b/server/socket-handlers/status-page-socket-handler.js
index 16d6ee73be..717aba9c4a 100644
--- a/server/socket-handlers/status-page-socket-handler.js
+++ b/server/socket-handlers/status-page-socket-handler.js
@@ -163,6 +163,7 @@ module.exports.statusPageSocketHandler = (socket) => {
statusPage.custom_css = config.customCSS;
statusPage.show_powered_by = config.showPoweredBy;
statusPage.modified_date = R.isoDateTime();
+ statusPage.google_analytics_tag_id = config.googleAnalyticsId;
await R.store(statusPage);
diff --git a/src/pages/StatusPage.vue b/src/pages/StatusPage.vue
index 6cecf66823..40a8e7c97f 100644
--- a/src/pages/StatusPage.vue
+++ b/src/pages/StatusPage.vue
@@ -64,6 +64,12 @@