diff --git a/db/knex_init_db.js b/db/knex_init_db.js
index 95f1c304e..897009797 100644
--- a/db/knex_init_db.js
+++ b/db/knex_init_db.js
@@ -87,8 +87,9 @@ async function createTables() {
table.string("dns_resolve_type", 5);
table.string("dns_resolve_server", 255);
table.string("dns_transport", 3);
- table.string("doh_query_path", 255);
- table.boolean("skip_remote_dnssec").defaultTo(false);
+ table.boolean("doh_query_path", 255).defaultTo("dns-query");
+ table.boolean("force_http2").notNullable().defaultTo(false);
+ table.boolean("skip_remote_dnssec").notNullable().defaultTo(false);
table.string("dns_last_result", 255);
table.integer("retry_interval").notNullable().defaultTo(0);
table.string("push_token", 20).defaultTo(null);
diff --git a/db/knex_migrations/2025-22-02-0000-dns-trasnsport.js b/db/knex_migrations/2025-22-02-0000-dns-trasnsport.js
index 66a51031a..c076fbd8e 100644
--- a/db/knex_migrations/2025-22-02-0000-dns-trasnsport.js
+++ b/db/knex_migrations/2025-22-02-0000-dns-trasnsport.js
@@ -1,9 +1,10 @@
exports.up = function (knex) {
return knex.schema
.alterTable("monitor", function (table) {
- table.string("dns_transport").notNullable().defaultTo("UDP");
- table.string("doh_query_path");
- table.boolean("skip_remote_dnssec").defaultTo(false);
+ table.string("dns_transport", 3).notNullable().defaultTo("UDP");
+ table.string("doh_query_path", 255).defaultTo("dns-query");
+ table.boolean("force_http2").notNullable().defaultTo(false);
+ table.boolean("skip_remote_dnssec").notNullable().defaultTo(false);
});
};
@@ -11,6 +12,7 @@ exports.down = function (knex) {
return knex.schema.alterTable("monitor", function (table) {
table.dropColumn("dns_transport");
table.dropColumn("doh_query_path");
+ table.dropColumn("force_http2");
table.dropColumn("skip_remote_dnssec");
});
};
diff --git a/server/model/monitor.js b/server/model/monitor.js
index 0fdf91322..95437cbca 100644
--- a/server/model/monitor.js
+++ b/server/model/monitor.js
@@ -116,12 +116,13 @@ class Monitor extends BeanModel {
packetSize: this.packetSize,
maxredirects: this.maxredirects,
accepted_statuscodes: this.getAcceptedStatuscodes(),
- dns_resolve_type: this.dns_resolve_type,
- dns_resolve_server: this.dns_resolve_server,
- dns_transport: this.dns_transport,
- doh_query_path: this.doh_query_path,
- skip_remote_dnssec: this.skip_remote_dnssec,
- dns_last_result: this.dns_last_result,
+ dnsResolveType: this.dnsResolveType,
+ dnsResolveServer: this.dnsResolveServer,
+ dnsTransport: this.dnsTransport,
+ dohQueryPath: this.dohQueryPath,
+ forceHttp2: Boolean(this.forceHttp2),
+ skipRemoteDnssec: Boolean(this.skipRemoteDnssec),
+ dnsLastResult: this.dnsLastResult,
docker_container: this.docker_container,
docker_host: this.docker_host,
proxyId: this.proxy_id,
diff --git a/server/monitor-types/dns.js b/server/monitor-types/dns.js
index 2d207558b..56565e8af 100644
--- a/server/monitor-types/dns.js
+++ b/server/monitor-types/dns.js
@@ -39,26 +39,46 @@ class DnsMonitorType extends MonitorType {
* @inheritdoc
*/
async check(monitor, heartbeat, _server) {
- let startTime = dayjs().valueOf();
- let dnsMessage = "";
-
const requestData = {
name: monitor.hostname,
- rrtype: monitor.dns_resolve_type,
+ rrtype: monitor.dnsResolveType,
dnssec: true, // Request DNSSEC information in the response
dnssecCheckingDisabled: monitor.skip_remote_dnssec,
};
- let dnsRes = await dnsResolve(requestData, monitor.dns_resolve_server, monitor.port, monitor.dns_transport, monitor.doh_query_path);
- const records = dnsRes.answers.map(record => {
- return Buffer.isBuffer(record.data) ? record.data.toString() : record.data;
- });
+ const transportData = {
+ type: monitor.dnsTransport,
+ ignoreCertErrors: monitor.ignoreTls,
+ dohQueryPath: monitor.dohQueryPath,
+ dohUsePost: monitor.method === "POST",
+ dohUseHttp2: monitor.forceHttp2,
+ };
+
+ let startTime = dayjs().valueOf();
+ let dnsRes = await dnsResolve(requestData, monitor.dnsResolveServer, monitor.port, transportData);
heartbeat.ping = dayjs().valueOf() - startTime;
+ let dnsMessage = "";
+ let rrtype = monitor.dnsResolveType;
const conditions = ConditionExpressionGroup.fromMonitor(monitor);
let conditionsResult = true;
const handleConditions = (data) => conditions ? evaluateExpressionGroup(conditions, data) : true;
- switch (monitor.dns_resolve_type) {
+ const records = dnsRes.answers.reduce((results, record) => {
+ // Omit records that are not the same as the requested rrtype
+ if (record.type === monitor.dnsResolveType) {
+ results.push(Buffer.isBuffer(record.data) ? record.data.toString() : record.data);
+ }
+ return results;
+ }, []);
+ // Return down status if no records are provided
+ if (records.length === 0) {
+ rrtype = null;
+ dnsMessage = "No records found";
+ conditionsResult = false;
+
+ }
+
+ switch (rrtype) {
case "A":
case "AAAA":
case "TXT":
@@ -114,7 +134,7 @@ class DnsMonitorType extends MonitorType {
break;
}
- if (monitor.dns_last_result !== dnsMessage && dnsMessage !== undefined) {
+ if (monitor.dnsLastResult !== dnsMessage && dnsMessage !== undefined) {
await R.exec("UPDATE `monitor` SET dns_last_result = ? WHERE id = ? ", [ dnsMessage, monitor.id ]);
}
diff --git a/server/server.js b/server/server.js
index 28666889b..85eb55c4e 100644
--- a/server/server.js
+++ b/server/server.js
@@ -824,11 +824,12 @@ let needSetup = false;
bean.packetSize = monitor.packetSize;
bean.maxredirects = monitor.maxredirects;
bean.accepted_statuscodes_json = JSON.stringify(monitor.accepted_statuscodes);
- bean.dns_resolve_type = monitor.dns_resolve_type;
- bean.dns_resolve_server = monitor.dns_resolve_server;
- bean.dns_transport = monitor.dns_transport;
- bean.doh_query_path = monitor.doh_query_path;
- bean.skip_remote_dnssec = monitor.skip_remote_dnssec;
+ bean.dnsResolveType = monitor.dnsResolveType;
+ bean.dnsResolveServer = monitor.dnsResolveServer;
+ bean.dnsTransport = monitor.dnsTransport;
+ bean.dohQueryPath = monitor.dohQueryPath;
+ bean.forceHttp2 = monitor.forceHttp2;
+ bean.skipRemoteDnssec = monitor.skipRemoteDnssec;
bean.pushToken = monitor.pushToken;
bean.docker_container = monitor.docker_container;
bean.docker_host = monitor.docker_host;
diff --git a/server/util-server.js b/server/util-server.js
index 490541463..4568b2fb4 100644
--- a/server/util-server.js
+++ b/server/util-server.js
@@ -24,8 +24,19 @@ const redis = require("redis");
const oidc = require("openid-client");
const tls = require("tls");
const https = require("https");
+const http2 = require("http2");
const url = require("url");
+const {
+ HTTP2_HEADER_PATH,
+ HTTP2_HEADER_METHOD,
+ HTTP2_HEADER_AUTHORITY,
+ HTTP2_HEADER_ACCEPT,
+ HTTP2_HEADER_CONTENT_LENGTH,
+ HTTP2_HEADER_CONTENT_TYPE,
+ HTTP2_HEADER_STATUS,
+} = http2.constants;
+
const {
dictionaries: {
rfc2865: { file, attributes },
@@ -287,25 +298,24 @@ exports.httpNtlm = function (options, ntlmOptions) {
};
/**
- * Adapted from https://github.com/hildjj/dohdec/blob/v7.0.2/pkg/dohdec/lib/dnsUtils.js
- * Encode a DNS query packet to a buffer.
+ * Encode DNS query packet data to a buffer. Adapted from
+ * https://github.com/hildjj/dohdec/blob/v7.0.2/pkg/dohdec/lib/dnsUtils.js
* @param {object} opts Options for the query.
* @param {string} opts.name The name to look up.
- * @param {number} [opts.id=0] ID for the query. SHOULD be 0 for DOH.
- * @param {packet.RecordType} [opts.rrtype="A"] The record type to look up.
- * @param {boolean} [opts.dnssec=false] Request DNSSec information?
- * @param {boolean} [opts.dnssecCheckingDisabled=false] Disable DNSSec
- * validation?
- * @param {string} [opts.ecsSubnet] Subnet to use for ECS.
- * @param {number} [opts.ecs] Number of ECS bits. Defaults to 24 or 56
- * (IPv4/IPv6).
- * @param {boolean} [opts.stream=false] Encode for streaming, with the packet
- * prefixed by a 2-byte big-endian integer of the number of bytes in the
- * packet.
+ * @param {number} opts.id ID for the query. SHOULD be 0 for DOH.
+ * @param {packet.RecordType} opts.rrtype The record type to look up.
+ * @param {boolean} opts.dnssec Request DNSSec information?
+ * @param {boolean} opts.dnssecCheckingDisabled Disable DNSSec validation?
+ * @param {string} opts.ecsSubnet Subnet to use for ECS.
+ * @param {number} opts.ecs Number of ECS bits. Defaults to 24 (IPv4) or 56
+ * (IPv6).
+ * @param {boolean} opts.stream Encode for streaming, with the packet prefixed
+ * by a 2-byte big-endian integer of the number of bytes in the packet.
+ * @param {number} opts.udpPayloadSize Set a custom UDP payload size (EDNS).
* @returns {Buffer} The encoded packet.
* @throws {TypeError} opts does not contain a name attribute.
*/
-exports.makePacket = function (opts) {
+exports.makeDnsPacket = function (opts) {
const PAD_SIZE = 128;
if (!opts?.name) {
@@ -316,7 +326,7 @@ exports.makePacket = function (opts) {
const opt = {
name: ".",
type: "OPT",
- udpPayloadSize: 4096,
+ udpPayloadSize: opts.udpPayloadSize || 4096,
extendedRcode: 0,
flags: 0,
flag_do: false, // Setting here has no effect
@@ -369,16 +379,65 @@ exports.makePacket = function (opts) {
return dnsPacket.encode(dns);
};
+/**
+ * Decodes DNS packet response data with error handling
+ * @param {Buffer} data DNS packet data to decode
+ * @param {boolean} isStream If the data is encoded as a stream
+ * @param {Function} callback function to call if error is encountered
+ * Passes error object as a parameter to the function
+ * @returns {dnsPacket.Packet} DNS packet data in an object
+ */
+exports.decodeDnsPacket = function (data, isStream = false, callback) {
+ let decodedData;
+ try {
+ decodedData = isStream ? dnsPacket.streamDecode(data) : dnsPacket.decode(data);
+ log.debug("dns", "Response decoded");
+ // If the truncated bit is set, the answers section was too large
+ if (decodedData.flag_tc) {
+ callback({ message: "Response is truncated." });
+ }
+ } catch (err) {
+ err.message = `Error decoding DNS response data: ${err.message}`;
+ log.warn("dns", err.message);
+ if (callback) {
+ callback(err);
+ }
+ }
+ return decodedData;
+};
+
/**
* Resolves a given record using the specified DNS server
- * @param {string} opts Options for the query
+ * @param {object} opts Options for the query, used to generate DNS packet
+ * @param {string} opts.name The name of the record to query
+ * @param {string} opts.rrtype The resource record type
+ * @param {number} opts.id Set a specific ID number to use on the query
+ * @param {number} opts.udpPayloadSize Set a custom UDP payload size (EDNS).
+ * Defaults to safe values, 1432 bytes (IPv4) or 1232 bytes (IPv6).
* @param {string} resolverServer The DNS server to use
- * @param {string} resolverPort Port the DNS server is listening on
- * @param {string} transport The transport method to use
- * @param {string} dohQuery The query path used only for DoH
+ * @param {number} resolverPort Port the DNS server is listening on
+ * @param {object} transport The transport method and options
+ * @param {string} transport.type Transport method, default is UDP
+ * @param {number} transport.timeout Timeout to use for queries
+ * @param {boolean} transport.ignoreCertErrors Proceed with secure connections
+ * even if the server presents an untrusted or expired certificate
+ * @param {string} transport.dohQueryPath Query path to use for DoH requests
+ * @param {boolean} transport.dohUsePost If true, DNS query will be sent using
+ * HTTP POST method for DoH requests, otherwise use HTTP GET method
+ * @param {boolean} transport.dohUseHttp2 If true, DNS query will be made with
+ * HTTP/2 session for DOH requests, otherwise use HTTP/1.1
* @returns {Promise<(string[] | object[] | object)>} DNS response
*/
-exports.dnsResolve = function (opts, resolverServer, resolverPort, transport, dohQuery) {
+exports.dnsResolve = function (opts, resolverServer, resolverPort, transport) {
+ // Set transport variables to defaults if not defined
+ const method = ("type" in transport) ? transport.type.toUpperCase() : "UDP";
+ const isSecure = [ "DOH", "DOT", "DOQ" ].includes(method);
+ const timeout = transport.timeout ?? 30000; // 30 seconds
+ const skipCertCheck = transport.ignoreCertErrors ?? false;
+ const dohQuery = transport.dohQueryPath ?? "dns-query";
+ const dohUsePost = transport.dohUsePost ?? false;
+ const dohUseHttp2 = transport.dohUseHttp2 ?? false;
+
// Parse IPv4 and IPv6 addresses to determine address family and
// add square brackets to IPv6 addresses, following RFC 3986 syntax
resolverServer = resolverServer.replace("[", "").replace("]", "");
@@ -404,29 +463,42 @@ exports.dnsResolve = function (opts, resolverServer, resolverPort, transport, do
if (opts.id == null) {
// Set query ID to "0" for HTTP cache friendlyness on DoH requests.
// See https://github.com/mafintosh/dns-packet/issues/77
- opts.id = (transport.toUpperCase() === "DOH") ? 0 : Math.floor(Math.random() * 65534) + 1;
+ opts.id = (method === "DOH") ? 0 : Math.floor(Math.random() * 65534) + 1;
}
+ // Set UDP payload size to safe levels for transmission over 1500 MTU
+ if (!opts.udpPayloadSize) {
+ opts.udpPayloadSize = (addressFamily === 4) ? 1432 : 1232;
+ }
+
+ // Enable stream encoding for TCP and DOT transport methods
+ if ([ "TCP", "DOT" ].includes(method)) {
+ opts.stream = true;
+ }
+ // Generate buffer with encoded DNS query
+ const buf = exports.makeDnsPacket(opts);
+
let client;
- let resolver = null;
+ let resolver;
// Transport method determines which client type to use
- const isSecure = [ "DOH", "DOT" ].includes(transport.toUpperCase());
- switch (transport.toUpperCase()) {
+ switch (method) {
case "TCP":
case "DOT": {
- opts.stream = true;
- const buf = exports.makePacket(opts);
if (isSecure) {
const options = {
port: resolverPort,
host: resolverServer,
- // TODO: Option for relaxing certificate validation
+ rejectUnauthorized: !skipCertCheck,
secureContext: tls.createSecureContext({
- secureProtocol: "TLSv1_2_method",
+ minVersion: "TLSv1.2",
}),
};
- // TODO: Error handling for untrusted or expired cert
+ // Set TLS ServerName only if server is not an IP address per
+ // Section 3 of RFC 6066
+ if (addressFamily === 0) {
+ options.servername = resolverServer;
+ }
client = tls.connect(options, () => {
log.debug("dns", `Connected to ${resolverServer}:${resolverPort}`);
client.write(buf);
@@ -438,99 +510,201 @@ exports.dnsResolve = function (opts, resolverServer, resolverPort, transport, do
client.write(buf);
});
}
- client.on("close", () => {
- log.debug("dns", "Connection closed");
- });
resolver = new Promise((resolve, reject) => {
+ // The below message is used when the response received does
+ // not follow Section 4.2.2 of RFC 1035
+ const lenErrMsg = "Resolver returned invalid DNS response";
let data = Buffer.alloc(0);
let expectedLength = 0;
+ let isValidLength = false;
+ client.on("error", (err) => {
+ reject(err);
+ });
+ client.setTimeout(timeout, () => {
+ client.destroy();
+ reject({ message: "Connection timed out" });
+ });
client.on("data", (chunk) => {
if (data.length === 0) {
if (chunk.byteLength > 1) {
- const plen = chunk.readUInt16BE(0);
- expectedLength = plen;
- if (plen < 12) {
- reject("Response received is below DNS minimum packet length");
+ expectedLength = chunk.readUInt16BE(0);
+ if (expectedLength < 12) {
+ reject({ message: lenErrMsg });
}
}
}
data = Buffer.concat([ data, chunk ]);
- if (data.byteLength >= expectedLength) {
+ if (data.byteLength - 2 === expectedLength) {
+ isValidLength = true;
client.destroy();
- const response = dnsPacket.streamDecode(data);
- log.debug("dns", "Response decoded");
+ const response = exports.decodeDnsPacket(data, true, reject);
resolve(response);
}
});
+ client.on("close", () => {
+ log.debug("dns", "Connection closed");
+ if (!isValidLength) {
+ reject({ message: lenErrMsg });
+ }
+ });
});
break;
}
case "DOH": {
- const buf = exports.makePacket(opts);
- // TODO: implement POST requests for wireformat and JSON
- dohQuery = dohQuery || "dns-query?dns={query}";
- dohQuery = dohQuery.replace("{query}", buf.toString("base64url"));
- const requestURL = url.parse(`https://${resolverServer}:${resolverPort}/${dohQuery}`, true);
+ const queryPath = dohUsePost ? dohQuery : `${dohQuery}?dns=${buf.toString("base64url")}`;
+ const requestURL = url.parse(`https://${resolverServer}:${resolverPort}/${queryPath}`, true);
+ const mimeType = "application/dns-message";
const options = {
hostname: requestURL.hostname,
port: requestURL.port,
path: requestURL.path,
method: "GET",
headers: {
- "Content-Type": "application/dns-message",
+ "accept": mimeType,
},
- // TODO: Option for relaxing certificate validation
+ rejectUnauthorized: !skipCertCheck,
};
+ if (dohUsePost) {
+ options.method = "POST";
+ // Setting Content-Length header is required for some resolvers
+ options.headers["content-length"] = buf.byteLength;
+ options.headers["content-type"] = mimeType;
+ }
resolver = new Promise((resolve, reject) => {
- client = https.request(options, (response) => {
+ /**
+ * Helper function to validate HTTP response
+ * @param {IncomingMessage|ClientHttp2Stream} httpResponse
+ * The response from https or http2 client
+ * @param {object} http2Headers Response headers from http2
+ * @returns {void}
+ * @throws missing one or more headers for HTTP/2 response
+ */
+ const handleResponse = (httpResponse, http2Headers) => {
+ // Determine status code and content type
+ let statusCode;
+ let contentType;
+ if (dohUseHttp2) {
+ if (!http2Headers) {
+ throw new Error("No headers passed for HTTP/2 response");
+ }
+ statusCode = http2Headers[HTTP2_HEADER_STATUS];
+ contentType = http2Headers[HTTP2_HEADER_CONTENT_TYPE];
+ } else {
+ statusCode = httpResponse.statusCode;
+ contentType = httpResponse.headers["content-type"];
+ }
+ // Validate response from resolver
+ if (statusCode !== 200) {
+ reject({ message: `Request failed with status code ${statusCode}` });
+ return;
+ } else if (contentType !== mimeType) {
+ reject({ message: `Content-Type was "${contentType}", expected ${mimeType}` });
+ return;
+ }
+ // Read the response body into a buffer
let data = Buffer.alloc(0);
- response.on("data", (chunk) => {
+ httpResponse.on("data", (chunk) => {
data = Buffer.concat([ data, chunk ]);
});
- response.on("end", () => {
- const response = dnsPacket.decode(data);
- log.debug("dns", "Response decoded");
+ httpResponse.on("end", () => {
+ const response = exports.decodeDnsPacket(data, false, reject);
resolve(response);
});
- });
- client.on("socket", (socket) => {
- socket.on("secureConnect", () => {
+ };
+ if (dohUseHttp2) {
+ const headers = {};
+ headers[HTTP2_HEADER_AUTHORITY] = options.hostname;
+ headers[HTTP2_HEADER_PATH] = options.path;
+ headers[HTTP2_HEADER_METHOD] = options.method;
+ headers[HTTP2_HEADER_ACCEPT] = options.headers["accept"];
+ if (dohUsePost) {
+ headers[HTTP2_HEADER_CONTENT_LENGTH] = options.headers["content-length"];
+ headers[HTTP2_HEADER_CONTENT_TYPE] = options.headers["content-type"];
+ }
+ client = http2.connect(`https://${options.hostname}:${options.port}`, {
+ rejectUnauthorized: options.rejectUnauthorized,
+ });
+ client.setTimeout(timeout, () => {
+ client.destroy();
+ reject({ message: "Request timed out" });
+ });
+ client.on("connect", () => {
log.debug("dns", `Connected to ${resolverServer}:${resolverPort}`);
});
- });
+ const req = client.request(headers);
+ req.on("error", (err) => {
+ err.message = "HTTP/2: " + err.message;
+ reject(err);
+ });
+ req.on("response", (resHeaders) => {
+ handleResponse(req, resHeaders);
+ });
+ req.on("end", () => {
+ client.close();
+ });
+ if (dohUsePost) {
+ req.write(buf);
+ }
+ req.end();
+ } else {
+ client = https.request(options, (httpResponse) => {
+ handleResponse(httpResponse);
+ });
+ client.setTimeout(timeout, () => {
+ client.destroy();
+ reject({ message: "Request timed out" });
+ });
+ client.on("socket", (socket) => {
+ socket.on("secureConnect", () => {
+ log.debug("dns", `Connected to ${resolverServer}:${resolverPort}`);
+ });
+ });
+ if (dohUsePost) {
+ client.write(buf);
+ }
+ client.end();
+ }
client.on("error", (err) => {
reject(err);
});
client.on("close", () => {
log.debug("dns", "Connection closed");
});
- client.write(buf);
- client.end();
});
break;
}
- //case "UDP":
+ case "UDP":
default: {
- const buf = exports.makePacket(opts);
- client = dgram.createSocket("udp" + String(addressFamily));
- client.on("connect", () => {
- log.debug("dns", `Connected to ${resolverServer}:${resolverPort}`);
- });
- client.on("close", () => {
- log.debug("dns", "Connection closed");
- });
+ if (addressFamily === 0) {
+ return new Promise((resolve, reject) => {
+ reject({ message: "Resolver server must be IP address for UDP transport method" });
+ });
+ }
+ client = dgram.createSocket(`udp${addressFamily}`);
resolver = new Promise((resolve, reject) => {
+ let timer;
client.on("message", (rdata, rinfo) => {
client.close();
- const response = dnsPacket.decode(rdata);
- log.debug("dns", "Response decoded");
+ const response = exports.decodeDnsPacket(rdata, false, reject);
resolve(response);
});
client.on("error", (err) => {
+ clearTimeout(timer);
reject(err);
});
+ client.on("listening", () => {
+ log.debug("dns", `Connected to ${resolverServer}:${resolverPort}`);
+ timer = setTimeout(() => {
+ reject({ message: "Query timed out" });
+ client.close();
+ }, timeout);
+ });
+ client.on("close", () => {
+ clearTimeout(timer);
+ log.debug("dns", "Connection closed");
+ });
});
client.send(buf, 0, buf.length, resolverPort, resolverServer);
}
diff --git a/src/assets/multiselect.scss b/src/assets/multiselect.scss
index bb24db76a..c4672dac6 100644
--- a/src/assets/multiselect.scss
+++ b/src/assets/multiselect.scss
@@ -48,6 +48,7 @@
.multiselect__single {
line-height: 14px;
margin-bottom: 0;
+ vertical-align: middle;
}
.dark {
diff --git a/src/lang/en.json b/src/lang/en.json
index 4d5bc5bd9..9ddda5958 100644
--- a/src/lang/en.json
+++ b/src/lang/en.json
@@ -1,1062 +1,1065 @@
{
- "languageName": "English",
- "setupDatabaseChooseDatabase": "Which database would you like to use?",
- "setupDatabaseEmbeddedMariaDB": "You don't need to set anything. This docker image has embedded and configured MariaDB for you automatically. Uptime Kuma will connect to this database via unix socket.",
- "setupDatabaseMariaDB": "Connect to an external MariaDB database. You need to set the database connection information.",
- "setupDatabaseSQLite": "A simple database file, recommended for small-scale deployments. Prior to v2.0.0, Uptime Kuma used SQLite as the default database.",
- "settingUpDatabaseMSG": "Setting up the database. It may take a while, please be patient.",
- "dbName": "Database Name",
- "Settings": "Settings",
- "Dashboard": "Dashboard",
- "Help": "Help",
- "New Update": "New Update",
- "Language": "Language",
- "Appearance": "Appearance",
- "Theme": "Theme",
- "General": "General",
- "Game": "Game",
- "Primary Base URL": "Primary Base URL",
- "Version": "Version",
- "Check Update On GitHub": "Check Update On GitHub",
- "List": "List",
- "Home": "Home",
- "Add": "Add",
- "Add New Monitor": "Add New Monitor",
- "Quick Stats": "Quick Stats",
- "Up": "Up",
- "Down": "Down",
- "Pending": "Pending",
- "statusMaintenance": "Maintenance",
- "Maintenance": "Maintenance",
- "Unknown": "Unknown",
- "Cannot connect to the socket server": "Cannot connect to the socket server",
- "Reconnecting...": "Reconnecting...",
- "General Monitor Type": "General Monitor Type",
- "Passive Monitor Type": "Passive Monitor Type",
- "Specific Monitor Type": "Specific Monitor Type",
- "markdownSupported": "Markdown syntax supported",
- "pauseDashboardHome": "Pause",
- "Pause": "Pause",
- "Name": "Name",
- "Status": "Status",
- "DateTime": "DateTime",
- "Message": "Message",
- "No important events": "No important events",
- "Resume": "Resume",
- "Edit": "Edit",
- "Delete": "Delete",
- "Current": "Current",
- "Uptime": "Uptime",
- "Cert Exp.": "Cert Exp.",
- "Monitor": "Monitor | Monitors",
- "now": "now",
- "time ago": "{0} ago",
- "day": "day | days",
- "-day": "-day",
- "hour": "hour",
- "-hour": "-hour",
- "-year": "-year",
- "Response": "Response",
- "Ping": "Ping",
- "Monitor Type": "Monitor Type",
- "Keyword": "Keyword",
- "Invert Keyword": "Invert Keyword",
- "Expected Value": "Expected Value",
- "Json Query Expression": "Json Query Expression",
- "Friendly Name": "Friendly Name",
- "URL": "URL",
- "Hostname": "Hostname",
- "Host URL": "Host URL",
- "locally configured mail transfer agent": "locally configured mail transfer agent",
- "Either enter the hostname of the server you want to connect to or localhost if you intend to use a locally configured mail transfer agent": "Either enter the hostname of the server you want to connect to or {localhost} if you intend to use a {local_mta}",
- "Port": "Port",
- "Heartbeat Interval": "Heartbeat Interval",
- "Request Timeout": "Request Timeout",
- "timeoutAfter": "Timeout after {0} seconds",
- "Retries": "Retries",
- "Heartbeat Retry Interval": "Heartbeat Retry Interval",
- "Resend Notification if Down X times consecutively": "Resend Notification if Down X times consecutively",
- "Advanced": "Advanced",
- "checkEverySecond": "Check every {0} seconds",
- "retryCheckEverySecond": "Retry every {0} seconds",
- "resendEveryXTimes": "Resend every {0} times",
- "resendDisabled": "Resend disabled",
- "retriesDescription": "Maximum retries before the service is marked as down and a notification is sent",
- "ignoredTLSError": "TLS/SSL errors have been ignored",
- "ignoreTLSError": "Ignore TLS/SSL errors for HTTPS websites",
- "ignoreTLSErrorGeneral": "Ignore TLS/SSL error for connection",
- "upsideDownModeDescription": "Flip the status upside down. If the service is reachable, it is DOWN.",
- "maxRedirectDescription": "Maximum number of redirects to follow. Set to 0 to disable redirects.",
- "Upside Down Mode": "Upside Down Mode",
- "Max. Redirects": "Max. Redirects",
- "Accepted Status Codes": "Accepted Status Codes",
- "Push URL": "Push URL",
- "needPushEvery": "You should call this URL every {0} seconds.",
- "pushOptionalParams": "Optional parameters: {0}",
- "pushViewCode": "How to use Push monitor? (View Code)",
- "pushOthers": "Others",
- "programmingLanguages": "Programming Languages",
- "Save": "Save",
- "Notifications": "Notifications",
- "Not available, please setup.": "Not available, please set up.",
- "Setup Notification": "Set Up Notification",
- "Light": "Light",
- "Dark": "Dark",
- "Auto": "Auto",
- "Theme - Heartbeat Bar": "Theme - Heartbeat Bar",
- "styleElapsedTime": "Elapsed time under the heartbeat bar",
- "styleElapsedTimeShowNoLine": "Show (No Line)",
- "styleElapsedTimeShowWithLine": "Show (With Line)",
- "Normal": "Normal",
- "Bottom": "Bottom",
- "None": "None",
- "Timezone": "Timezone",
- "Search Engine Visibility": "Search Engine Visibility",
- "Allow indexing": "Allow indexing",
- "Discourage search engines from indexing site": "Discourage search engines from indexing site",
- "Change Password": "Change Password",
- "Current Password": "Current Password",
- "New Password": "New Password",
- "Repeat New Password": "Repeat New Password",
- "Update Password": "Update Password",
- "Disable Auth": "Disable Auth",
- "Enable Auth": "Enable Auth",
- "disableauth.message1": "Are you sure want to {disableAuth}?",
- "disable authentication": "disable authentication",
- "disableauth.message2": "It is designed for scenarios {intendThirdPartyAuth} in front of Uptime Kuma such as Cloudflare Access, Authelia or other authentication mechanisms.",
- "where you intend to implement third-party authentication": "where you intend to implement third-party authentication",
- "Please use this option carefully!": "Please use this option carefully!",
- "Logout": "Log out",
- "Leave": "Leave",
- "I understand, please disable": "I understand, please disable",
- "Confirm": "Confirm",
- "Yes": "Yes",
- "No": "No",
- "Username": "Username",
- "Password": "Password",
- "Remember me": "Remember me",
- "Login": "Log in",
- "No Monitors, please": "No Monitors, please",
- "add one": "add one",
- "Notification Type": "Notification Type",
- "Email": "Email",
- "Test": "Test",
- "Certificate Info": "Certificate Info",
- "Resolver Server": "Resolver Server",
- "Transport Method": "Transport Method",
- "Query Path": "Query Path",
- "Resource Record Type": "Resource Record Type",
- "Skip Remote DNSSEC Verification": "Skip Remote DNSSEC Verification",
- "Last Result": "Last Result",
- "Create your admin account": "Create your admin account",
- "Repeat Password": "Repeat Password",
- "Import Backup": "Import Backup",
- "Export Backup": "Export Backup",
- "Export": "Export",
- "Import": "Import",
- "respTime": "Resp. Time (ms)",
- "notAvailableShort": "N/A",
- "Default enabled": "Default enabled",
- "Apply on all existing monitors": "Apply on all existing monitors",
- "Create": "Create",
- "Clear Data": "Clear Data",
- "Events": "Events",
- "Heartbeats": "Heartbeats",
- "Auto Get": "Auto Get",
- "Schedule maintenance": "Schedule maintenance",
- "Affected Monitors": "Affected Monitors",
- "Pick Affected Monitors...": "Pick Affected Monitors…",
- "Start of maintenance": "Start of maintenance",
- "All Status Pages": "All Status Pages",
- "Select status pages...": "Select status pages…",
- "alertNoFile": "Please select a file to import.",
- "alertWrongFileType": "Please select a JSON file.",
- "Clear all statistics": "Clear all Statistics",
- "Skip existing": "Skip existing",
- "Overwrite": "Overwrite",
- "Options": "Options",
- "Keep both": "Keep both",
- "Verify Token": "Verify Token",
- "Setup 2FA": "Set Up 2FA",
- "Enable 2FA": "Enable 2FA",
- "Disable 2FA": "Disable 2FA",
- "2FA Settings": "2FA Settings",
- "Two Factor Authentication": "Two Factor Authentication",
- "filterActive": "Active",
- "filterActivePaused": "Paused",
- "Active": "Active",
- "Inactive": "Inactive",
- "Token": "Token",
- "Show URI": "Show URI",
- "Tags": "Tags",
- "Add New Tag": "Add New Tag",
- "Add New below or Select...": "Add New below or Select…",
- "Tag with this name already exist.": "Tag with this name already exists.",
- "Tag with this value already exist.": "Tag with this value already exists.",
- "color": "Color",
- "value (optional)": "value (optional)",
- "Gray": "Gray",
- "Red": "Red",
- "Orange": "Orange",
- "Green": "Green",
- "Blue": "Blue",
- "Indigo": "Indigo",
- "Purple": "Purple",
- "Pink": "Pink",
- "Custom": "Custom",
- "Search...": "Search…",
- "Search monitored sites": "Search monitored sites",
- "Avg. Ping": "Avg. Ping",
- "Avg. Response": "Avg. Response",
- "Entry Page": "Entry Page",
- "statusPageNothing": "Nothing here, please add a group or a monitor.",
- "statusPageRefreshIn": "Refresh in: {0}",
- "No Services": "No Services",
- "All Systems Operational": "All Systems Operational",
- "Partially Degraded Service": "Partially Degraded Service",
- "Degraded Service": "Degraded Service",
- "Add Group": "Add Group",
- "Add a monitor": "Add a monitor",
- "Edit Status Page": "Edit Status Page",
- "Go to Dashboard": "Go to Dashboard",
- "Status Page": "Status Page",
- "Status Pages": "Status Pages",
- "defaultNotificationName": "My {notification} Alert ({number})",
- "here": "here",
- "Required": "Required",
- "Post URL": "Post URL",
- "Content Type": "Content Type",
- "webhookJsonDesc": "{0} is good for any modern HTTP servers such as Express.js",
- "webhookFormDataDesc": "{multipart} is good for PHP. The JSON will need to be parsed with {decodeFunction}",
- "liquidIntroduction": "Templatability is achieved via the Liquid templating language. Please refer to the {0} for usage instructions. These are the available variables:",
- "templateMsg": "message of the notification",
- "templateHeartbeatJSON": "object describing the heartbeat",
- "templateMonitorJSON": "object describing the monitor",
- "templateLimitedToUpDownCertNotifications": "only available for UP/DOWN/Certificate expiry notifications",
- "templateLimitedToUpDownNotifications": "only available for UP/DOWN notifications",
- "webhookAdditionalHeadersTitle": "Additional Headers",
- "webhookAdditionalHeadersDesc": "Sets additional headers sent with the webhook. Each header should be defined as a JSON key/value.",
- "webhookBodyPresetOption": "Preset - {0}",
- "webhookBodyCustomOption": "Custom Body",
- "Webhook URL": "Webhook URL",
- "Application Token": "Application Token",
- "Server URL": "Server URL",
- "Priority": "Priority",
- "emojiCheatSheet": "Emoji cheat sheet: {0}",
- "Read more": "Read more",
- "appriseInstalled": "Apprise is installed.",
- "appriseNotInstalled": "Apprise is not installed. {0}",
- "Method": "Method",
- "Body": "Body",
- "Headers": "Headers",
- "PushUrl": "Push URL",
- "HeadersInvalidFormat": "The request headers are not valid JSON: ",
- "BodyInvalidFormat": "The request body is not valid JSON: ",
- "Monitor History": "Monitor History",
- "clearDataOlderThan": "Keep monitor history data for {0} days.",
- "PasswordsDoNotMatch": "Passwords do not match.",
- "records": "records",
- "One record": "One record",
- "steamApiKeyDescription": "For monitoring a Steam Game Server you need a Steam Web-API key. You can register your API key here: ",
- "Current User": "Current User",
- "topic": "Topic",
- "topicExplanation": "MQTT topic to monitor",
- "successKeyword": "Success Keyword",
- "successKeywordExplanation": "MQTT Keyword that will be considered as success",
- "recent": "Recent",
- "Reset Token": "Reset Token",
- "Done": "Done",
- "Info": "Info",
- "Security": "Security",
- "Steam API Key": "Steam API Key",
- "Shrink Database": "Shrink Database",
- "shrinkDatabaseDescriptionSqlite": "Trigger database {vacuum} for SQLite. {auto_vacuum} is already enabled but this does not defragment the database nor repack individual database pages the way that the {vacuum} command does.",
- "Pick a RR-Type...": "Pick a RR-Type…",
- "Select the transport method...": "Select the transport method…",
- "Pick Accepted Status Codes...": "Pick Accepted Status Codes…",
- "Default": "Default",
- "HTTP Options": "HTTP Options",
- "Create Incident": "Create Incident",
- "Title": "Title",
- "Content": "Content",
- "Style": "Style",
- "info": "info",
- "warning": "warning",
- "danger": "danger",
- "error": "error",
- "critical": "critical",
- "primary": "primary",
- "light": "light",
- "dark": "dark",
- "Post": "Post",
- "Please input title and content": "Please input title and content",
- "Created": "Created",
- "Last Updated": "Last Updated",
- "Switch to Light Theme": "Switch to Light Theme",
- "Switch to Dark Theme": "Switch to Dark Theme",
- "Show Tags": "Show Tags",
- "Hide Tags": "Hide Tags",
- "Description": "Description",
- "No monitors available.": "No monitors available.",
- "Add one": "Add one",
- "No Monitors": "No Monitors",
- "Untitled Group": "Untitled Group",
- "Services": "Services",
- "Discard": "Discard",
- "Cancel": "Cancel",
- "Select": "Select",
- "selectedMonitorCount": "Selected: {0}",
- "Check/Uncheck": "Check/Uncheck",
- "Powered by": "Powered by",
- "Customize": "Customize",
- "Custom Footer": "Custom Footer",
- "Custom CSS": "Custom CSS",
- "deleteStatusPageMsg": "Are you sure want to delete this status page?",
- "Proxies": "Proxies",
- "default": "Default",
- "enabled": "Enabled",
- "setAsDefault": "Set As Default",
- "deleteProxyMsg": "Are you sure want to delete this proxy for all monitors?",
- "proxyDescription": "Proxies must be assigned to a monitor to function.",
- "enableProxyDescription": "This proxy will not effect on monitor requests until it is activated. You can control temporarily disable the proxy from all monitors by activation status.",
- "setAsDefaultProxyDescription": "This proxy will be enabled by default for new monitors. You can still disable the proxy separately for each monitor.",
- "Certificate Chain": "Certificate Chain",
- "Valid": "Valid",
- "Invalid": "Invalid",
- "User": "User",
- "Installed": "Installed",
- "Not installed": "Not installed",
- "Running": "Running",
- "Not running": "Not running",
- "Remove Token": "Remove Token",
- "Start": "Start",
- "Stop": "Stop",
- "Add New Status Page": "Add New Status Page",
- "Slug": "Slug",
- "Accept characters:": "Accept characters:",
- "startOrEndWithOnly": "Start or end with {0} only",
- "No consecutive dashes": "No consecutive dashes",
- "statusPageSpecialSlugDesc": "Special slug {0}: this page will be shown when no slug is provided",
- "Next": "Next",
- "The slug is already taken. Please choose another slug.": "The slug is already taken. Please choose another slug.",
- "No Proxy": "No Proxy",
- "Authentication": "Authentication",
- "HTTP Basic Auth": "HTTP Basic Auth",
- "New Status Page": "New Status Page",
- "Page Not Found": "Page Not Found",
- "Reverse Proxy": "Reverse Proxy",
- "Backup": "Backup",
- "About": "About",
- "wayToGetCloudflaredURL": "(Download cloudflared from {0})",
- "cloudflareWebsite": "Cloudflare Website",
- "Message:": "Message:",
- "Don't know how to get the token? Please read the guide:": "Don't know how to get the token? Please read the guide:",
- "The current connection may be lost if you are currently connecting via Cloudflare Tunnel. Are you sure want to stop it? Type your current password to confirm it.": "The current connection may be lost if you are currently connecting via Cloudflare Tunnel. Are you sure want to stop it? Type your current password to confirm it.",
- "HTTP Headers": "HTTP Headers",
- "Trust Proxy": "Trust Proxy",
- "Other Software": "Other Software",
- "For example: nginx, Apache and Traefik.": "For example: nginx, Apache and Traefik.",
- "Please read": "Please read",
- "Subject:": "Subject:",
- "Valid To:": "Valid To:",
- "Days Remaining:": "Days Remaining:",
- "Issuer:": "Issuer:",
- "Fingerprint:": "Fingerprint:",
- "No status pages": "No status pages",
- "Domain Name Expiry Notification": "Domain Name Expiry Notification",
- "Add a new expiry notification day": "Add a new expiry notification day",
- "Remove the expiry notification": "Remove the expiry notification day",
- "Proxy": "Proxy",
- "Date Created": "Date Created",
- "Footer Text": "Footer Text",
- "Refresh Interval": "Refresh Interval",
- "Refresh Interval Description": "The status page will do a full site refresh every {0} seconds",
- "Show Powered By": "Show Powered By",
- "Domain Names": "Domain Names",
- "signedInDisp": "Signed in as {0}",
- "signedInDispDisabled": "Auth Disabled.",
- "RadiusSecret": "Radius Secret",
- "RadiusSecretDescription": "Shared Secret between client and server",
- "RadiusCalledStationId": "Called Station Id",
- "RadiusCalledStationIdDescription": "Identifier of the called device",
- "RadiusCallingStationId": "Calling Station Id",
- "RadiusCallingStationIdDescription": "Identifier of the calling device",
- "Certificate Expiry Notification": "Certificate Expiry Notification",
- "API Username": "API Username",
- "API Key": "API Key",
- "Show update if available": "Show update if available",
- "Also check beta release": "Also check beta release",
- "Using a Reverse Proxy?": "Using a Reverse Proxy?",
- "Check how to config it for WebSocket": "Check how to config it for WebSocket",
- "Steam Game Server": "Steam Game Server",
- "Most likely causes:": "Most likely causes:",
- "The resource is no longer available.": "The resource is no longer available.",
- "There might be a typing error in the address.": "There might be a typing error in the address.",
- "What you can try:": "What you can try:",
- "Retype the address.": "Retype the address.",
- "Go back to the previous page.": "Go back to the previous page.",
- "Coming Soon": "Coming Soon",
- "Connection String": "Connection String",
- "Query": "Query",
- "settingsCertificateExpiry": "TLS Certificate Expiry",
- "certificationExpiryDescription": "HTTPS Monitors trigger notification when TLS certificate expires in:",
- "Setup Docker Host": "Set Up Docker Host",
- "Connection Type": "Connection Type",
- "Docker Daemon": "Docker Daemon",
- "noDockerHostMsg": "Not Available. Set Up a Docker Host First.",
- "DockerHostRequired": "Please set the Docker Host for this monitor.",
- "deleteDockerHostMsg": "Are you sure want to delete this docker host for all monitors?",
- "socket": "Socket",
- "tcp": "TCP / HTTP",
- "tailscalePingWarning": "In order to use the Tailscale Ping monitor, you need to install Uptime Kuma without Docker and also install Tailscale client on your server.",
- "Docker Container": "Docker Container",
- "Container Name / ID": "Container Name / ID",
- "Docker Host": "Docker Host",
- "Docker Hosts": "Docker Hosts",
- "Domain": "Domain",
- "Workstation": "Workstation",
- "Packet Size": "Packet Size",
- "Bot Token": "Bot Token",
- "wayToGetTelegramToken": "You can get a token from {0}.",
- "Chat ID": "Chat ID",
- "telegramMessageThreadID": "(Optional) Message Thread ID",
- "telegramMessageThreadIDDescription": "Optional Unique identifier for the target message thread (topic) of the forum; for forum supergroups only",
- "telegramSendSilently": "Send Silently",
- "telegramSendSilentlyDescription": "Sends the message silently. Users will receive a notification with no sound.",
- "telegramProtectContent": "Protect Forwarding/Saving",
- "telegramProtectContentDescription": "If enabled, the bot messages in Telegram will be protected from forwarding and saving.",
- "supportTelegramChatID": "Support Direct Chat / Group / Channel's Chat ID",
- "wayToGetTelegramChatID": "You can get your chat ID by sending a message to the bot and going to this URL to view the chat_id:",
- "YOUR BOT TOKEN HERE": "YOUR BOT TOKEN HERE",
- "chatIDNotFound": "Chat ID is not found; please send a message to this bot first",
- "disableCloudflaredNoAuthMsg": "You are in No Auth mode, a password is not required.",
- "trustProxyDescription": "Trust 'X-Forwarded-*' headers. If you want to get the correct client IP and your Uptime Kuma is behind a proxy such as Nginx or Apache, you should enable this.",
- "wayToGetLineNotifyToken": "You can get an access token from {0}",
- "Examples": "Examples",
- "Home Assistant URL": "Home Assistant URL",
- "Long-Lived Access Token": "Long-Lived Access Token",
- "Long-Lived Access Token can be created by clicking on your profile name (bottom left) and scrolling to the bottom then click Create Token. ": "Long-Lived Access Token can be created by clicking on your profile name (bottom left) and scrolling to the bottom then click Create Token. ",
- "Notification Service": "Notification Service",
- "default: notify all devices": "default: notify all devices",
- "A list of Notification Services can be found in Home Assistant under \"Developer Tools > Services\" search for \"notification\" to find your device/phone name.": "A list of Notification Services can be found in Home Assistant under \"Developer Tools > Services\" search for \"notification\" to find your device/phone name.",
- "Automations can optionally be triggered in Home Assistant:": "Automations can optionally be triggered in Home Assistant:",
- "Trigger type:": "Trigger type:",
- "Event type:": "Event type:",
- "Event data:": "Event data:",
- "Then choose an action, for example switch the scene to where an RGB light is red.": "Then choose an action, for example switch the scene to where an RGB light is red.",
- "Frontend Version": "Frontend Version",
- "Frontend Version do not match backend version!": "Frontend Version do not match backend version!",
- "backupOutdatedWarning": "Deprecated: Since a lot of features were added and this backup feature is a bit unmaintained, it cannot generate or restore a complete backup.",
- "backupRecommend": "Please backup the volume or the data folder (./data/) directly instead.",
- "Optional": "Optional",
- "and": "and",
- "or": "or",
- "sameAsServerTimezone": "Same as Server Timezone",
- "startDateTime": "Start Date/Time",
- "endDateTime": "End Date/Time",
- "cronExpression": "Cron Expression",
- "cronSchedule": "Schedule: ",
- "invalidCronExpression": "Invalid Cron Expression: {0}",
- "recurringInterval": "Interval",
- "Recurring": "Recurring",
- "strategyManual": "Active/Inactive Manually",
- "warningTimezone": "It is using the server's timezone",
- "weekdayShortMon": "Mon",
- "weekdayShortTue": "Tue",
- "weekdayShortWed": "Wed",
- "weekdayShortThu": "Thu",
- "weekdayShortFri": "Fri",
- "weekdayShortSat": "Sat",
- "weekdayShortSun": "Sun",
- "dayOfWeek": "Day of Week",
- "dayOfMonth": "Day of Month",
- "lastDay": "Last Day",
- "lastDay1": "Last Day of Month",
- "lastDay2": "2nd Last Day of Month",
- "lastDay3": "3rd Last Day of Month",
- "lastDay4": "4th Last Day of Month",
- "No Maintenance": "No Maintenance",
- "pauseMaintenanceMsg": "Are you sure want to pause?",
- "maintenanceStatus-under-maintenance": "Under Maintenance",
- "maintenanceStatus-inactive": "Inactive",
- "maintenanceStatus-scheduled": "Scheduled",
- "maintenanceStatus-ended": "Ended",
- "maintenanceStatus-unknown": "Unknown",
- "Display Timezone": "Display Timezone",
- "Server Timezone": "Server Timezone",
- "statusPageMaintenanceEndDate": "End",
- "IconUrl": "Icon URL",
- "Enable DNS Cache": "(Deprecated) Enable DNS Cache for HTTP(s) monitors",
- "Enable": "Enable",
- "Disable": "Disable",
- "enableNSCD": "Enable NSCD (Name Service Cache Daemon) for caching all DNS requests",
- "chromeExecutable": "Chrome/Chromium Executable",
- "chromeExecutableAutoDetect": "Auto Detect",
- "chromeExecutableDescription": "For Docker users, if Chromium is not yet installed, it may take a few minutes to install and display the test result. It takes 1GB of disk space.",
- "dnsCacheDescription": "It may be not working in some IPv6 environments, disable it if you encounter any issues.",
- "Single Maintenance Window": "Single Maintenance Window",
- "Maintenance Time Window of a Day": "Maintenance Time Window of a Day",
- "Effective Date Range": "Effective Date Range (Optional)",
- "Schedule Maintenance": "Schedule Maintenance",
- "Edit Maintenance": "Edit Maintenance",
- "Date and Time": "Date and Time",
- "DateTime Range": "DateTime Range",
- "loadingError": "Cannot fetch the data, please try again later.",
- "plugin": "Plugin | Plugins",
- "install": "Install",
- "installing": "Installing",
- "uninstall": "Uninstall",
- "uninstalling": "Uninstalling",
- "confirmUninstallPlugin": "Are you sure want to uninstall this plugin?",
- "notificationRegional": "Regional",
- "Clone Monitor": "Clone Monitor",
- "Clone": "Clone",
- "cloneOf": "Clone of {0}",
- "smtp": "Email (SMTP)",
- "secureOptionNone": "None / STARTTLS (25, 587)",
- "secureOptionTLS": "TLS (465)",
- "Ignore TLS Error": "Ignore TLS Error",
- "From Email": "From Email",
- "emailCustomisableContent": "Customisable content",
- "smtpLiquidIntroduction": "The following two fields are templatable via the Liquid templating Language. Please refer to the {0} for usage instructions. These are the available variables:",
- "emailCustomSubject": "Custom Subject",
- "leave blank for default subject": "leave blank for default subject",
- "emailCustomBody": "Custom Body",
- "leave blank for default body": "leave blank for default body",
- "emailTemplateServiceName": "Service Name",
- "emailTemplateHostnameOrURL": "Hostname or URL",
- "emailTemplateStatus": "Status",
- "emailTemplateMonitorJSON": "object describing the monitor",
- "emailTemplateHeartbeatJSON": "object describing the heartbeat",
- "emailTemplateMsg": "message of the notification",
- "emailTemplateLimitedToUpDownNotification": "only available for UP/DOWN heartbeats, otherwise null",
- "To Email": "To Email",
- "smtpCC": "CC",
- "smtpBCC": "BCC",
- "Discord Webhook URL": "Discord Webhook URL",
- "wayToGetDiscordURL": "You can get this by going to Server Settings -> Integrations -> View Webhooks -> New Webhook",
- "Bot Display Name": "Bot Display Name",
- "Prefix Custom Message": "Prefix Custom Message",
- "Hello @everyone is...": "Hello {'@'}everyone is…",
- "Select message type": "Select message type",
- "Send to channel": "Send to channel",
- "Create new forum post": "Create new forum post",
- "postToExistingThread": "Post to existing thread / forum post",
- "forumPostName": "Forum post name",
- "threadForumPostID": "Thread / Forum post ID",
- "e.g. {discordThreadID}": "e.g. {discordThreadID}",
- "whatHappensAtForumPost": "Create a new forum post. This does NOT post messages in existing post. To post in existing post use \"{option}\"",
- "wayToGetDiscordThreadId": "Getting a thread / forum post id is similar to getting a channel id. Read more about how to get ids {0}",
- "wayToGetTeamsURL": "You can learn how to create a webhook URL {0}.",
- "wayToGetZohoCliqURL": "You can learn how to create a webhook URL {0}.",
- "needSignalAPI": "You need to have a signal client with REST API.",
- "wayToCheckSignalURL": "You can check this URL to view how to set one up:",
- "Number": "Number",
- "Recipients": "Recipients",
- "Access Token": "Access Token",
- "Channel access token": "Channel access token",
- "Channel access token (Long-lived)": "Channel access token (Long-lived)",
- "Line Developers Console": "Line Developers Console",
- "lineDevConsoleTo": "Line Developers Console - {0}",
- "Basic Settings": "Basic Settings",
- "User ID": "User ID",
- "Your User ID": "Your user ID",
- "Messaging API": "Messaging API",
- "wayToGetLineChannelToken": "First access the {0}, create a provider and channel (Messaging API), then you can get the channel access token and user ID from the above mentioned menu items.",
- "Icon URL": "Icon URL",
- "aboutIconURL": "You can provide a link to a picture in \"Icon URL\" to override the default profile picture. Will not be used if Icon Emoji is set.",
- "aboutMattermostChannelName": "You can override the default channel that the Webhook posts to by entering the channel name into \"Channel Name\" field. This needs to be enabled in the Mattermost Webhook settings. Ex: #other-channel",
- "dataRetentionTimeError": "Retention period must be 0 or greater",
- "infiniteRetention": "Set to 0 for infinite retention.",
- "confirmDeleteTagMsg": "Are you sure you want to delete this tag? Monitors associated with this tag will not be deleted.",
- "enableGRPCTls": "Allow to send gRPC request with TLS connection",
- "grpcMethodDescription": "Method name is convert to camelCase format such as sayHello, check, etc.",
- "acceptedStatusCodesDescription": "Select status codes which are considered as a successful response.",
- "deleteMonitorMsg": "Are you sure want to delete this monitor?",
- "deleteMaintenanceMsg": "Are you sure want to delete this maintenance?",
- "deleteNotificationMsg": "Are you sure want to delete this notification for all monitors?",
- "dnsPortDescription": "DNS server port. Defaults to 53. Alternative ports are 443 for DoH and 853 for DoT.",
- "resolverserverDescription": "Cloudflare is the default server. Use IP address for UDP/TCP/DoT, and domain name for DoH/DoT.",
- "rrtypeDescription": "Select the RR type you want to monitor",
- "dnsTransportDescription": "Select the transport method for querying the DNS server.",
- "dohQueryPathDescription": "Set the query path to use for DNS wireformat. Must contain",
- "skipRemoteDnssecDescription": "Requests the resolver server not to perform DNSSEC verification against queried records.",
- "pauseMonitorMsg": "Are you sure want to pause?",
- "enableDefaultNotificationDescription": "This notification will be enabled by default for new monitors. You can still disable the notification separately for each monitor.",
- "clearEventsMsg": "Are you sure want to delete all events for this monitor?",
- "clearHeartbeatsMsg": "Are you sure want to delete all heartbeats for this monitor?",
- "confirmClearStatisticsMsg": "Are you sure you want to delete ALL statistics?",
- "importHandleDescription": "Choose 'Skip existing' if you want to skip every monitor or notification with the same name. 'Overwrite' will delete every existing monitor and notification.",
- "confirmImportMsg": "Are you sure you want to import the backup? Please verify you've selected the correct import option.",
- "twoFAVerifyLabel": "Please enter your token to verify 2FA:",
- "tokenValidSettingsMsg": "Token is valid! You can now save the 2FA settings.",
- "confirmEnableTwoFAMsg": "Are you sure you want to enable 2FA?",
- "confirmDisableTwoFAMsg": "Are you sure you want to disable 2FA?",
- "recurringIntervalMessage": "Run once every day | Run once every {0} days",
- "affectedMonitorsDescription": "Select monitors that are affected by current maintenance",
- "affectedStatusPages": "Show this maintenance message on selected status pages",
- "atLeastOneMonitor": "Select at least one affected monitor",
- "passwordNotMatchMsg": "The repeat password does not match.",
- "notificationDescription": "Notifications must be assigned to a monitor to function.",
- "keywordDescription": "Search keyword in plain HTML or JSON response. The search is case-sensitive.",
- "invertKeywordDescription": "Look for the keyword to be absent rather than present.",
- "jsonQueryDescription": "Parse and extract specific data from the server's JSON response using JSON query or use \"$\" for the raw response, if not expecting JSON. The result is then compared to the expected value, as strings. See {0} for documentation and use {1} to experiment with queries.",
- "backupDescription": "You can backup all monitors and notifications into a JSON file.",
- "backupDescription2": "Note: history and event data is not included.",
- "backupDescription3": "Sensitive data such as notification tokens are included in the export file; please store export securely.",
- "endpoint": "endpoint",
- "octopushAPIKey": "\"API key\" from HTTP API credentials in control panel",
- "octopushLogin": "\"Login\" from HTTP API credentials in control panel",
- "promosmsLogin": "API Login Name",
- "promosmsPassword": "API Password",
- "pushoversounds pushover": "Pushover (default)",
- "pushoversounds bike": "Bike",
- "pushoversounds bugle": "Bugle",
- "pushoversounds cashregister": "Cash Register",
- "pushoversounds classical": "Classical",
- "pushoversounds cosmic": "Cosmic",
- "pushoversounds falling": "Falling",
- "pushoversounds gamelan": "Gamelan",
- "pushoversounds incoming": "Incoming",
- "pushoversounds intermission": "Intermission",
- "pushoversounds magic": "Magic",
- "pushoversounds mechanical": "Mechanical",
- "pushoversounds pianobar": "Piano Bar",
- "pushoversounds siren": "Siren",
- "pushoversounds spacealarm": "Space Alarm",
- "pushoversounds tugboat": "Tug Boat",
- "pushoversounds alien": "Alien Alarm (long)",
- "pushoversounds climb": "Climb (long)",
- "pushoversounds persistent": "Persistent (long)",
- "pushoversounds echo": "Pushover Echo (long)",
- "pushoversounds updown": "Up Down (long)",
- "pushoversounds vibrate": "Vibrate Only",
- "pushoversounds none": "None (silent)",
- "pushyAPIKey": "Secret API Key",
- "pushyToken": "Device token",
- "apprise": "Apprise (Support 50+ Notification services)",
- "GoogleChat": "Google Chat (Google Workspace only)",
- "wayToGetKookBotToken": "Create application and get your bot token at {0}",
- "wayToGetKookGuildID": "Switch on 'Developer Mode' in Kook setting, and right click the guild to get its ID",
- "Guild ID": "Guild ID",
- "User Key": "User Key",
- "Device": "Device",
- "Message Title": "Message Title",
- "Notification Sound": "Notification Sound",
- "More info on:": "More info on: {0}",
- "pushoverDesc1": "Emergency priority (2) has default 30 second timeout between retries and will expire after 1 hour.",
- "pushoverDesc2": "If you want to send notifications to different devices, fill out Device field.",
- "pushoverMessageTtl": "Message TTL (Seconds)",
- "SMS Type": "SMS Type",
- "octopushTypePremium": "Premium (Fast - recommended for alerting)",
- "octopushTypeLowCost": "Low Cost (Slow - sometimes blocked by operator)",
- "checkPrice": "Check {0} prices:",
- "apiCredentials": "API credentials",
- "octopushLegacyHint": "Do you use the legacy version of Octopush (2011-2020) or the new version?",
- "Check octopush prices": "Check octopush prices {0}.",
- "octopushPhoneNumber": "Phone number (intl format, eg : +33612345678) ",
- "octopushSMSSender": "SMS Sender Name : 3-11 alphanumeric characters and space (a-zA-Z0-9)",
- "LunaSea Device ID": "LunaSea Device ID",
- "Apprise URL": "Apprise URL",
- "Example:": "Example: {0}",
- "Read more:": "Read more: {0}",
- "Status:": "Status: {0}",
- "Strategy": "Strategy",
- "Free Mobile User Identifier": "Free Mobile User Identifier",
- "Free Mobile API Key": "Free Mobile API Key",
- "Enable TLS": "Enable TLS",
- "Proto Service Name": "Proto Service Name",
- "Proto Method": "Proto Method",
- "Proto Content": "Proto Content",
- "Economy": "Economy",
- "Lowcost": "Lowcost",
- "high": "high",
- "SendKey": "SendKey",
- "SMSManager API Docs": "SMSManager API Docs ",
- "Gateway Type": "Gateway Type",
- "You can divide numbers with": "You can divide numbers with",
- "Base URL": "Base URL",
- "goAlertInfo": "GoAlert is a An open source application for on-call scheduling, automated escalations and notifications (like SMS or voice calls). Automatically engage the right person, the right way, and at the right time! {0}",
- "goAlertIntegrationKeyInfo": "Get generic API integration key for the service in this format \"aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee\" usually the value of token parameter of copied URL.",
- "AccessKeyId": "AccessKey ID",
- "SecretAccessKey": "AccessKey Secret",
- "PhoneNumbers": "PhoneNumbers",
- "TemplateCode": "TemplateCode",
- "SignName": "SignName",
- "Sms template must contain parameters: ": "Sms template must contain parameters: ",
- "Bark API Version": "Bark API Version",
- "Bark Endpoint": "Bark Endpoint",
- "Bark Group": "Bark Group",
- "Bark Sound": "Bark Sound",
- "WebHookUrl": "WebHookUrl",
- "SecretKey": "SecretKey",
- "For safety, must use secret key": "For safety, must use secret key",
- "Mentioning": "Mentioning",
- "Don't mention people": "Don't mention people",
- "Mention group": "Mention {group}",
- "Device Token": "Device Token",
- "Platform": "Platform",
- "Huawei": "Huawei",
- "High": "High",
- "Retry": "Retry",
- "Topic": "Topic",
- "WeCom Bot Key": "WeCom Bot Key",
- "Setup Proxy": "Set Up Proxy",
- "Proxy Protocol": "Proxy Protocol",
- "Proxy Server": "Proxy Server",
- "Proxy server has authentication": "Proxy server has authentication",
- "promosmsTypeEco": "SMS ECO - cheap but slow and often overloaded. Limited only to Polish recipients.",
- "promosmsTypeFlash": "SMS FLASH - Message will automatically show on recipient device. Limited only to Polish recipients.",
- "promosmsTypeFull": "SMS FULL - Premium tier of SMS, You can use your Sender Name (You need to register name first). Reliable for alerts.",
- "promosmsTypeSpeed": "SMS SPEED - Highest priority in system. Very quick and reliable but costly (about twice of SMS FULL price).",
- "promosmsPhoneNumber": "Phone number (for Polish recipient You can skip area codes)",
- "promosmsSMSSender": "SMS Sender Name : Pre-registred name or one of defaults: InfoSMS, SMS Info, MaxSMS, INFO, SMS",
- "promosmsAllowLongSMS": "Allow long SMS",
- "Feishu WebHookUrl": "Feishu WebHookURL",
- "matrixHomeserverURL": "Homeserver URL (with http(s):// and optionally port)",
- "Internal Room Id": "Internal Room ID",
- "matrixDesc1": "You can find the internal room ID by looking in the advanced section of the room settings in your Matrix client. It should look like !QMdRCpUIfLwsfjxye6:home.server.",
- "matrixDesc2": "It is highly recommended you create a new user and do not use your own Matrix user's access token as it will allow full access to your account and all the rooms you joined. Instead, create a new user and only invite it to the room that you want to receive the notification in. You can get the access token by running {0}",
- "Channel Name": "Channel Name",
- "Notify Channel": "Notify Channel",
- "aboutNotifyChannel": "Notify channel will trigger a desktop or mobile notification for all members of the channel, whether their availability is set to active or away.",
- "Uptime Kuma URL": "Uptime Kuma URL",
- "setup a new monitor group": "set up a new monitor group",
- "openModalTo": "open modal to {0}",
- "Add a domain": "Add a domain",
- "Remove domain": "Remove domain '{0}'",
- "Icon Emoji": "Icon Emoji",
- "signalImportant": "IMPORTANT: You cannot mix groups and numbers in recipients!",
- "aboutWebhooks": "More info about Webhooks on: {0}",
- "aboutSlackUsername": "Changes the display name of the message sender. If you want to mention someone, include it in the friendly name instead.",
- "aboutChannelName": "Enter the channel name on {0} Channel Name field if you want to bypass the Webhook channel. Ex: #other-channel",
- "aboutKumaURL": "If you leave the Uptime Kuma URL field blank, it will default to the Project GitHub page.",
- "smtpDkimSettings": "DKIM Settings",
- "smtpDkimDesc": "Please refer to the Nodemailer DKIM {0} for usage.",
- "documentation": "documentation",
- "smtpDkimDomain": "Domain Name",
- "smtpDkimKeySelector": "Key Selector",
- "smtpDkimPrivateKey": "Private Key",
- "smtpDkimHashAlgo": "Hash Algorithm (Optional)",
- "smtpDkimheaderFieldNames": "Header Keys to sign (Optional)",
- "smtpDkimskipFields": "Header Keys not to sign (Optional)",
- "wayToGetPagerDutyKey": "You can get this by going to Service -> Service Directory -> (Select a service) -> Integrations -> Add integration. Here you can search for \"Events API V2\". More info {0}",
- "Integration Key": "Integration Key",
- "Integration URL": "Integration URL",
- "Auto resolve or acknowledged": "Auto resolve or acknowledged",
- "do nothing": "do nothing",
- "auto acknowledged": "auto acknowledged",
- "auto resolve": "auto resolve",
- "alertaApiEndpoint": "API Endpoint",
- "alertaEnvironment": "Environment",
- "alertaApiKey": "API Key",
- "alertaAlertState": "Alert State",
- "alertaRecoverState": "Recover State",
- "serwersmsAPIUser": "API Username (incl. webapi_ prefix)",
- "serwersmsAPIPassword": "API Password",
- "serwersmsPhoneNumber": "Phone number",
- "serwersmsSenderName": "SMS Sender Name (registered via customer portal)",
- "smseagleTo": "Phone number(s)",
- "smseagleGroup": "Phonebook group name(s)",
- "smseagleContact": "Phonebook contact name(s)",
- "smseagleRecipientType": "Recipient type",
- "smseagleRecipient": "Recipient(s) (multiple must be separated with comma)",
- "smseagleToken": "API Access token",
- "smseagleUrl": "Your SMSEagle device URL",
- "smseagleEncoding": "Send as Unicode",
- "smseaglePriority": "Message priority (0-9, default = 0)",
- "smspartnerApiurl": "You can find your API key in your dashboard at {0}",
- "smspartnerPhoneNumber": "Phone number(s)",
- "smspartnerPhoneNumberHelptext": "The number must be in the international format {0}, {1}. Multiple numbers must be separated by {2}",
- "smspartnerSenderName": "SMS Sender Name",
- "smspartnerSenderNameInfo": "Must be between 3..=11 regular characters",
- "Recipient Number": "Recipient Number",
- "From Name/Number": "From Name/Number",
- "Leave blank to use a shared sender number.": "Leave blank to use a shared sender number.",
- "Octopush API Version": "Octopush API Version",
- "Legacy Octopush-DM": "Legacy Octopush-DM",
- "ntfy Topic": "ntfy Topic",
- "Server URL should not contain the nfty topic": "Server URL should not contain the nfty topic",
- "onebotHttpAddress": "OneBot HTTP Address",
- "onebotMessageType": "OneBot Message Type",
- "onebotGroupMessage": "Group",
- "onebotPrivateMessage": "Private",
- "onebotUserOrGroupId": "Group/User ID",
- "onebotSafetyTips": "For safety, must set access token",
- "PushDeer Server": "PushDeer Server",
- "pushDeerServerDescription": "Leave blank to use the official server",
- "PushDeer Key": "PushDeer Key",
- "wayToGetClickSendSMSToken": "You can get API Username and API Key from {0} .",
- "Custom Monitor Type": "Custom Monitor Type",
- "Google Analytics ID": "Google Analytics ID",
- "Edit Tag": "Edit Tag",
- "Server Address": "Server Address",
- "Learn More": "Learn More",
- "Body Encoding": "Body Encoding",
- "API Keys": "API Keys",
- "Expiry": "Expiry",
- "Expiry date": "Expiry date",
- "Don't expire": "Don't expire",
- "Continue": "Continue",
- "Add Another": "Add Another",
- "Key Added": "Key Added",
- "apiKeyAddedMsg": "Your API key has been added. Please make a note of it as it will not be shown again.",
- "Add API Key": "Add API Key",
- "No API Keys": "No API Keys",
- "apiKey-active": "Active",
- "apiKey-expired": "Expired",
- "apiKey-inactive": "Inactive",
- "Expires": "Expires",
- "disableAPIKeyMsg": "Are you sure you want to disable this API key?",
- "deleteAPIKeyMsg": "Are you sure you want to delete this API key?",
- "Generate": "Generate",
- "pagertreeIntegrationUrl": "Integration URL",
- "pagertreeUrgency": "Urgency",
- "pagertreeSilent": "Silent",
- "pagertreeLow": "Low",
- "pagertreeMedium": "Medium",
- "pagertreeHigh": "High",
- "pagertreeCritical": "Critical",
- "pagertreeResolve": "Auto Resolve",
- "pagertreeDoNothing": "Do Nothing",
- "wayToGetPagerTreeIntegrationURL": "After creating the Uptime Kuma integration in PagerTree, copy the Endpoint. See full details {0}",
- "lunaseaTarget": "Target",
- "lunaseaDeviceID": "Device ID",
- "lunaseaUserID": "User ID",
- "ntfyAuthenticationMethod": "Authentication Method",
- "ntfyPriorityHelptextAllEvents": "All events are sent with the maximum priority",
- "ntfyPriorityHelptextAllExceptDown": "All events are sent with this priority, except {0}-events, which have a priority of {1}",
- "ntfyUsernameAndPassword": "Username and Password",
- "twilioAccountSID": "Account SID",
- "twilioApiKey": "Api Key (optional)",
- "twilioAuthToken": "Auth Token / Api Key Secret",
- "twilioFromNumber": "From Number",
- "twilioToNumber": "To Number",
- "Monitor Setting": "{0}'s Monitor Setting",
- "Show Clickable Link": "Show Clickable Link",
- "Show Clickable Link Description": "If checked everyone who have access to this status page can have access to monitor URL.",
- "Open Badge Generator": "Open Badge Generator",
- "Badge Generator": "{0}'s Badge Generator",
- "Badge Type": "Badge Type",
- "Badge Duration (in hours)": "Badge Duration (in hours)",
- "Badge Label": "Badge Label",
- "Badge Prefix": "Badge Value Prefix",
- "Badge Suffix": "Badge Value Suffix",
- "Badge Label Color": "Badge Label Color",
- "Badge Color": "Badge Color",
- "Badge Label Prefix": "Badge Label Prefix",
- "Badge Preview": "Badge Preview",
- "Badge Label Suffix": "Badge Label Suffix",
- "Badge Up Color": "Badge Up Color",
- "Badge Down Color": "Badge Down Color",
- "Badge Pending Color": "Badge Pending Color",
- "Badge Maintenance Color": "Badge Maintenance Color",
- "Badge Warn Color": "Badge Warn Color",
- "Badge Warn Days": "Badge Warn Days",
- "Badge Down Days": "Badge Down Days",
- "Badge Style": "Badge Style",
- "Badge value (For Testing only.)": "Badge value (For Testing only.)",
- "Badge URL": "Badge URL",
- "Group": "Group",
- "Monitor Group": "Monitor Group",
- "monitorToastMessagesLabel": "Monitor Toast notifications",
- "monitorToastMessagesDescription": "Toast notifications for monitors disappear after given time in seconds. Set to -1 disables timeout. Set to 0 disables toast notifications.",
- "toastErrorTimeout": "Timeout for Error Notifications",
- "toastSuccessTimeout": "Timeout for Success Notifications",
- "Kafka Brokers": "Kafka Brokers",
- "Enter the list of brokers": "Enter the list of brokers",
- "Press Enter to add broker": "Press Enter to add broker",
- "Kafka Topic Name": "Kafka Topic Name",
- "Kafka Producer Message": "Kafka Producer Message",
- "Enable Kafka SSL": "Enable Kafka SSL",
- "Enable Kafka Producer Auto Topic Creation": "Enable Kafka Producer Auto Topic Creation",
- "Kafka SASL Options": "Kafka SASL Options",
- "Mechanism": "Mechanism",
- "Pick a SASL Mechanism...": "Pick a SASL Mechanism…",
- "Authorization Identity": "Authorization Identity",
- "AccessKey Id": "AccessKey Id",
- "Secret AccessKey": "Secret AccessKey",
- "Session Token": "Session Token",
- "noGroupMonitorMsg": "Not Available. Create a Group Monitor First.",
- "Close": "Close",
- "Request Body": "Request Body",
- "wayToGetFlashDutyKey": "You can go to Channel -> (Select a Channel) -> Integrations -> Add a new integration' page, add a 'Uptime Kuma' to get a push address, copy the Integration Key in the address. For more information, please visit",
- "FlashDuty Severity": "Severity",
- "nostrRelays": "Nostr relays",
- "nostrRelaysHelp": "One relay URL per line",
- "nostrSender": "Sender Private Key (nsec)",
- "nostrRecipients": "Recipients Public Keys (npub)",
- "nostrRecipientsHelp": "npub format, one per line",
- "showCertificateExpiry": "Show Certificate Expiry",
- "noOrBadCertificate": "No/Bad Certificate",
- "cacheBusterParam": "Add the {0} parameter",
- "cacheBusterParamDescription": "Randomly generated parameter to skip caches.",
- "gamedigGuessPort": "Gamedig: Guess Port",
- "gamedigGuessPortDescription": "The port used by Valve Server Query Protocol may be different from the client port. Try this if the monitor cannot connect to your server.",
- "Message format": "Message format",
- "Send rich messages": "Send rich messages",
- "Bitrix24 Webhook URL": "Bitrix24 Webhook URL",
- "wayToGetBitrix24Webhook": "You can create a webhook by following the steps at {0}",
- "bitrix24SupportUserID": "Enter your user ID in Bitrix24. You can find out the ID from the link by going to the user's profile.",
- "Saved.": "Saved.",
- "authUserInactiveOrDeleted": "The user is inactive or deleted.",
- "authInvalidToken": "Invalid Token.",
- "authIncorrectCreds": "Incorrect username or password.",
- "2faAlreadyEnabled": "2FA is already enabled.",
- "2faEnabled": "2FA Enabled.",
- "2faDisabled": "2FA Disabled.",
- "successAdded": "Added Successfully.",
- "successResumed": "Resumed Successfully.",
- "successPaused": "Paused Successfully.",
- "successDeleted": "Deleted Successfully.",
- "successEdited": "Edited Successfully.",
- "successAuthChangePassword": "Password has been updated successfully.",
- "successBackupRestored": "Backup successfully restored.",
- "successDisabled": "Disabled Successfully.",
- "successEnabled": "Enabled Successfully.",
- "tagNotFound": "Tag not found.",
- "foundChromiumVersion": "Found Chromium/Chrome. Version: {0}",
- "Remote Browsers": "Remote Browsers",
- "Remote Browser": "Remote Browser",
- "Add a Remote Browser": "Add a Remote Browser",
- "Remote Browser not found!": "Remote Browser not found!",
- "remoteBrowsersDescription": "Remote Browsers are an alternative to running Chromium locally. Set up with a service like browserless.io or connect to your own",
- "self-hosted container": "self-hosted container",
- "remoteBrowserToggle": "By default Chromium runs inside the Uptime Kuma container. You can use a remote browser by toggling this switch.",
- "useRemoteBrowser": "Use a Remote Browser",
- "deleteRemoteBrowserMessage": "Are you sure want to delete this Remote Browser for all monitors?",
- "GrafanaOncallUrl": "Grafana Oncall URL",
- "Browser Screenshot": "Browser Screenshot",
- "Command": "Command",
- "mongodbCommandDescription": "Run a MongoDB command against the database. For information about the available commands check out the {documentation}",
- "wayToGetSevenIOApiKey": "Visit the dashboard under app.seven.io > developer > api key > the green add button",
- "senderSevenIO": "Sending number or name",
- "receiverSevenIO": "Receiving number",
- "receiverInfoSevenIO": "If the receiving number is not located in Germany, you have to add the country code in front of the number (e.g. for the country code 1 from the US use 117612121212 instead of 017612121212)",
- "apiKeySevenIO": "SevenIO API Key",
- "wayToWriteWhapiRecipient": "The phone number with the international prefix, but without the plus sign at the start ({0}), the Contact ID ({1}) or the Group ID ({2}).",
- "wayToGetWhapiUrlAndToken": "You can get the API URL and the token by going into your desired channel from {0}",
- "whapiRecipient": "Phone Number / Contact ID / Group ID",
- "API URL": "API URL",
- "What is a Remote Browser?": "What is a Remote Browser?",
- "wayToGetHeiiOnCallDetails": "How to get the Trigger ID and API Keys is explained in the {documentation}",
- "documentationOf": "{0} Documentation",
- "callMeBotGet": "Here you can generate an endpoint for {0}, {1} and {2}. Keep in mind that you might get rate limited. The ratelimits appear to be: {3}",
- "gtxMessagingApiKeyHint": "You can find your API key at: My Routing Accounts > Show Account Information > API Credentials > REST API (v2.x)",
- "From Phone Number / Transmission Path Originating Address (TPOA)": "From Phone Number / Transmission Path Originating Address (TPOA)",
- "gtxMessagingFromHint": "On mobile phones, your recipients sees the TPOA displayed as the sender of the message. Allowed are up to 11 alphanumeric characters, a shortcode, the local longcode or international numbers ({e164}, {e212} or {e214})",
- "To Phone Number": "To Phone Number",
- "gtxMessagingToHint": "International format, with leading \"+\" ({e164}, {e212} or {e214})",
- "Originator type": "Originator type",
- "Alphanumeric (recommended)": "Alphanumeric (recommended)",
- "Telephone number": "Telephone number",
- "cellsyntOriginatortypeAlphanumeric": "Alphanumeric string (max 11 alphanumeric characters). Recipients can not reply to the message.",
- "cellsyntOriginatortypeNumeric": "Numeric value (max 15 digits) with telephone number on international format without leading 00 (example UK number 07920 110 000 should be set as 447920110000). Recipients can reply to the message.",
- "Originator": "Originator",
- "cellsyntOriginator": "Visible on recipient's mobile phone as originator of the message. Allowed values and function depends on parameter originatortype.",
- "Destination": "Destination",
- "cellsyntDestination": "Recipient's telephone number using international format with leading 00 followed by country code, e.g. 00447920110000 for the UK number 07920 110 000 (max 17 digits in total). Max 25000 comma separated recipients per HTTP request.",
- "Allow Long SMS": "Allow Long SMS",
- "cellsyntSplitLongMessages": "Split long messages into up to 6 parts. 153 x 6 = 918 characters.",
- "max 15 digits": "max 15 digits",
- "max 11 alphanumeric characters": "max 11 alphanumeric characters",
- "Community String": "Community String",
- "snmpCommunityStringHelptext": "This string functions as a password to authenticate and control access to SNMP-enabled devices. Match it with your SNMP device's configuration.",
- "OID (Object Identifier)": "OID (Object Identifier)",
- "snmpOIDHelptext": "Enter the OID for the sensor or status you want to monitor. Use network management tools like MIB browsers or SNMP software if you're unsure about the OID.",
- "Condition": "Condition",
- "SNMP Version": "SNMP Version",
- "Please enter a valid OID.": "Please enter a valid OID.",
- "wayToGetThreemaGateway": "You can register for Threema Gateway {0}.",
- "threemaRecipient": "Recipient",
- "threemaRecipientType": "Recipient Type",
- "threemaRecipientTypeIdentity": "Threema-ID",
- "threemaRecipientTypeIdentityFormat": "8 characters",
- "threemaRecipientTypePhone": "Phone Number",
- "threemaRecipientTypePhoneFormat": "E.164, without leading +",
- "threemaRecipientTypeEmail": "Email Address",
- "threemaSenderIdentity": "Gateway-ID",
- "threemaSenderIdentityFormat": "8 characters, usually starts with *",
- "threemaApiAuthenticationSecret": "Gateway-ID Secret",
- "threemaBasicModeInfo": "Note: This integration uses Threema Gateway in basic mode (server-based encryption). Further details can be found {0}.",
- "apiKeysDisabledMsg": "API keys are disabled because authentication is disabled.",
- "Host Onesender": "Host Onesender",
- "Token Onesender": "Token Onesender",
- "Recipient Type": "Recipient Type",
- "Private Number": "Private Number",
- "privateOnesenderDesc": "Make sure the number phone is valid. To send message into private number phone, ex: 628123456789",
- "groupOnesenderDesc": "Make sure the GroupID is valid. To send message into Group, ex: 628123456789-342345",
- "Group ID": "Group ID",
- "wayToGetOnesenderUrlandToken": "You can get the URL and Token by going to the Onesender website. More info {0}",
- "Add Remote Browser": "Add Remote Browser",
- "New Group": "New Group",
- "Group Name": "Group Name",
- "OAuth2: Client Credentials": "OAuth2: Client Credentials",
- "Authentication Method": "Authentication Method",
- "Authorization Header": "Authorization Header",
- "Form Data Body": "Form Data Body",
- "OAuth Token URL": "OAuth Token URL",
- "Client ID": "Client ID",
- "Client Secret": "Client Secret",
- "OAuth Scope": "OAuth Scope",
- "Optional: Space separated list of scopes": "Optional: Space separated list of scopes",
- "Go back to home page.": "Go back to home page.",
- "No tags found.": "No tags found.",
- "Lost connection to the socket server.": "Lost connection to the socket server.",
- "Cannot connect to the socket server.": "Cannot connect to the socket server.",
- "SIGNL4": "SIGNL4",
- "SIGNL4 Webhook URL": "SIGNL4 Webhook URL",
- "signl4Docs": "You can find more information about how to configure SIGNL4 and how to obtain the SIGNL4 webhook URL in the {0}.",
- "Conditions": "Conditions",
- "conditionAdd": "Add Condition",
- "conditionDelete": "Delete Condition",
- "conditionAddGroup": "Add Group",
- "conditionDeleteGroup": "Delete Group",
- "conditionValuePlaceholder": "Value",
- "equals": "equals",
- "not equals": "not equals",
- "contains": "contains",
- "not contains": "not contains",
- "starts with": "starts with",
- "not starts with": "not starts with",
- "ends with": "ends with",
- "not ends with": "not ends with",
- "less than": "less than",
- "greater than": "greater than",
- "less than or equal to": "less than or equal to",
- "greater than or equal to": "greater than or equal to",
- "record": "record",
- "Notification Channel": "Notification Channel",
- "Sound": "Sound",
- "Alphanumerical string and hyphens only": "Alphanumerical string and hyphens only",
- "Arcade": "Arcade",
- "Correct": "Correct",
- "Fail": "Fail",
- "Harp": "Harp",
- "Reveal": "Reveal",
- "Bubble": "Bubble",
- "Doorbell": "Doorbell",
- "Flute": "Flute",
- "Money": "Money",
- "Scifi": "Scifi",
- "Clear": "Clear",
- "Elevator": "Elevator",
- "Guitar": "Guitar",
- "Pop": "Pop",
- "Custom sound to override default notification sound": "Custom sound to override default notification sound",
- "Time Sensitive (iOS Only)": "Time Sensitive (iOS Only)",
- "Time sensitive notifications will be delivered immediately, even if the device is in do not disturb mode.": "Time sensitive notifications will be delivered immediately, even if the device is in do not disturb mode.",
- "From": "From",
- "Can be found on:": "Can be found on: {0}",
- "The phone number of the recipient in E.164 format.": "The phone number of the recipient in E.164 format.",
- "Either a text sender ID or a phone number in E.164 format if you want to be able to receive replies.": "Either a text sender ID or a phone number in E.164 format if you want to be able to receive replies.",
- "RabbitMQ Nodes": "RabbitMQ Management Nodes",
- "rabbitmqNodesDescription": "Enter the URL for the RabbitMQ management nodes including protocol and port. Example: {0}",
- "rabbitmqNodesRequired": "Please set the nodes for this monitor.",
- "rabbitmqNodesInvalid": "Please use a fully qualified (starting with 'http') URL for RabbitMQ nodes.",
- "RabbitMQ Username": "RabbitMQ Username",
- "RabbitMQ Password": "RabbitMQ Password",
- "rabbitmqHelpText": "To use the monitor, you will need to enable the Management Plugin in your RabbitMQ setup. For more information, please consult the {rabitmq_documentation}.",
- "SendGrid API Key": "SendGrid API Key",
- "Separate multiple email addresses with commas": "Separate multiple email addresses with commas"
+ "languageName": "English",
+ "setupDatabaseChooseDatabase": "Which database would you like to use?",
+ "setupDatabaseEmbeddedMariaDB": "You don't need to set anything. This docker image has embedded and configured MariaDB for you automatically. Uptime Kuma will connect to this database via unix socket.",
+ "setupDatabaseMariaDB": "Connect to an external MariaDB database. You need to set the database connection information.",
+ "setupDatabaseSQLite": "A simple database file, recommended for small-scale deployments. Prior to v2.0.0, Uptime Kuma used SQLite as the default database.",
+ "settingUpDatabaseMSG": "Setting up the database. It may take a while, please be patient.",
+ "dbName": "Database Name",
+ "Settings": "Settings",
+ "Dashboard": "Dashboard",
+ "Help": "Help",
+ "New Update": "New Update",
+ "Language": "Language",
+ "Appearance": "Appearance",
+ "Theme": "Theme",
+ "General": "General",
+ "Game": "Game",
+ "Primary Base URL": "Primary Base URL",
+ "Version": "Version",
+ "Check Update On GitHub": "Check Update On GitHub",
+ "List": "List",
+ "Home": "Home",
+ "Add": "Add",
+ "Add New Monitor": "Add New Monitor",
+ "Quick Stats": "Quick Stats",
+ "Up": "Up",
+ "Down": "Down",
+ "Pending": "Pending",
+ "statusMaintenance": "Maintenance",
+ "Maintenance": "Maintenance",
+ "Unknown": "Unknown",
+ "Cannot connect to the socket server": "Cannot connect to the socket server",
+ "Reconnecting...": "Reconnecting...",
+ "General Monitor Type": "General Monitor Type",
+ "Passive Monitor Type": "Passive Monitor Type",
+ "Specific Monitor Type": "Specific Monitor Type",
+ "markdownSupported": "Markdown syntax supported",
+ "pauseDashboardHome": "Pause",
+ "Pause": "Pause",
+ "Name": "Name",
+ "Status": "Status",
+ "DateTime": "DateTime",
+ "Message": "Message",
+ "No important events": "No important events",
+ "Resume": "Resume",
+ "Edit": "Edit",
+ "Delete": "Delete",
+ "Current": "Current",
+ "Uptime": "Uptime",
+ "Cert Exp.": "Cert Exp.",
+ "Monitor": "Monitor | Monitors",
+ "now": "now",
+ "time ago": "{0} ago",
+ "day": "day | days",
+ "-day": "-day",
+ "hour": "hour",
+ "-hour": "-hour",
+ "-year": "-year",
+ "Response": "Response",
+ "Ping": "Ping",
+ "Monitor Type": "Monitor Type",
+ "Keyword": "Keyword",
+ "Invert Keyword": "Invert Keyword",
+ "Expected Value": "Expected Value",
+ "Json Query Expression": "Json Query Expression",
+ "Friendly Name": "Friendly Name",
+ "URL": "URL",
+ "Hostname": "Hostname",
+ "Host URL": "Host URL",
+ "locally configured mail transfer agent": "locally configured mail transfer agent",
+ "Either enter the hostname of the server you want to connect to or localhost if you intend to use a locally configured mail transfer agent": "Either enter the hostname of the server you want to connect to or {localhost} if you intend to use a {local_mta}",
+ "Port": "Port",
+ "Heartbeat Interval": "Heartbeat Interval",
+ "Request Timeout": "Request Timeout",
+ "timeoutAfter": "Timeout after {0} seconds",
+ "Retries": "Retries",
+ "Heartbeat Retry Interval": "Heartbeat Retry Interval",
+ "Resend Notification if Down X times consecutively": "Resend Notification if Down X times consecutively",
+ "Advanced": "Advanced",
+ "checkEverySecond": "Check every {0} seconds",
+ "retryCheckEverySecond": "Retry every {0} seconds",
+ "resendEveryXTimes": "Resend every {0} times",
+ "resendDisabled": "Resend disabled",
+ "retriesDescription": "Maximum retries before the service is marked as down and a notification is sent",
+ "ignoredTLSError": "TLS/SSL errors have been ignored",
+ "ignoreTLSError": "Ignore TLS/SSL errors for HTTPS websites",
+ "ignoreTLSErrorGeneral": "Ignore TLS/SSL errors for secure connections",
+ "upsideDownModeDescription": "Flip the status upside down. If the service is reachable, it is DOWN.",
+ "maxRedirectDescription": "Maximum number of redirects to follow. Set to 0 to disable redirects.",
+ "Upside Down Mode": "Upside Down Mode",
+ "Max. Redirects": "Max. Redirects",
+ "Accepted Status Codes": "Accepted Status Codes",
+ "Push URL": "Push URL",
+ "needPushEvery": "You should call this URL every {0} seconds.",
+ "pushOptionalParams": "Optional parameters: {0}",
+ "pushViewCode": "How to use Push monitor? (View Code)",
+ "pushOthers": "Others",
+ "programmingLanguages": "Programming Languages",
+ "Save": "Save",
+ "Notifications": "Notifications",
+ "Not available, please setup.": "Not available, please set up.",
+ "Setup Notification": "Set Up Notification",
+ "Light": "Light",
+ "Dark": "Dark",
+ "Auto": "Auto",
+ "Theme - Heartbeat Bar": "Theme - Heartbeat Bar",
+ "styleElapsedTime": "Elapsed time under the heartbeat bar",
+ "styleElapsedTimeShowNoLine": "Show (No Line)",
+ "styleElapsedTimeShowWithLine": "Show (With Line)",
+ "Normal": "Normal",
+ "Bottom": "Bottom",
+ "None": "None",
+ "Timezone": "Timezone",
+ "Search Engine Visibility": "Search Engine Visibility",
+ "Allow indexing": "Allow indexing",
+ "Discourage search engines from indexing site": "Discourage search engines from indexing site",
+ "Change Password": "Change Password",
+ "Current Password": "Current Password",
+ "New Password": "New Password",
+ "Repeat New Password": "Repeat New Password",
+ "Update Password": "Update Password",
+ "Disable Auth": "Disable Auth",
+ "Enable Auth": "Enable Auth",
+ "disableauth.message1": "Are you sure want to {disableAuth}?",
+ "disable authentication": "disable authentication",
+ "disableauth.message2": "It is designed for scenarios {intendThirdPartyAuth} in front of Uptime Kuma such as Cloudflare Access, Authelia or other authentication mechanisms.",
+ "where you intend to implement third-party authentication": "where you intend to implement third-party authentication",
+ "Please use this option carefully!": "Please use this option carefully!",
+ "Logout": "Log out",
+ "Leave": "Leave",
+ "I understand, please disable": "I understand, please disable",
+ "Confirm": "Confirm",
+ "Yes": "Yes",
+ "No": "No",
+ "Username": "Username",
+ "Password": "Password",
+ "Remember me": "Remember me",
+ "Login": "Log in",
+ "No Monitors, please": "No Monitors, please",
+ "add one": "add one",
+ "Notification Type": "Notification Type",
+ "Email": "Email",
+ "Test": "Test",
+ "Certificate Info": "Certificate Info",
+ "Resolver Server": "Resolver Server",
+ "Transport Method": "Transport Method",
+ "Query Path": "Query Path",
+ "Force HTTP2": "HTTP/2",
+ "Resource Record Type": "Resource Record Type",
+ "Skip Remote DNSSEC Verification": "Skip Remote DNSSEC Verification",
+ "Last Result": "Last Result",
+ "Create your admin account": "Create your admin account",
+ "Repeat Password": "Repeat Password",
+ "Import Backup": "Import Backup",
+ "Export Backup": "Export Backup",
+ "Export": "Export",
+ "Import": "Import",
+ "respTime": "Resp. Time (ms)",
+ "notAvailableShort": "N/A",
+ "Default enabled": "Default enabled",
+ "Apply on all existing monitors": "Apply on all existing monitors",
+ "Create": "Create",
+ "Clear Data": "Clear Data",
+ "Events": "Events",
+ "Heartbeats": "Heartbeats",
+ "Auto Get": "Auto Get",
+ "Schedule maintenance": "Schedule maintenance",
+ "Affected Monitors": "Affected Monitors",
+ "Pick Affected Monitors...": "Pick Affected Monitors…",
+ "Start of maintenance": "Start of maintenance",
+ "All Status Pages": "All Status Pages",
+ "Select status pages...": "Select status pages…",
+ "alertNoFile": "Please select a file to import.",
+ "alertWrongFileType": "Please select a JSON file.",
+ "Clear all statistics": "Clear all Statistics",
+ "Skip existing": "Skip existing",
+ "Overwrite": "Overwrite",
+ "Options": "Options",
+ "Keep both": "Keep both",
+ "Verify Token": "Verify Token",
+ "Setup 2FA": "Set Up 2FA",
+ "Enable 2FA": "Enable 2FA",
+ "Disable 2FA": "Disable 2FA",
+ "2FA Settings": "2FA Settings",
+ "Two Factor Authentication": "Two Factor Authentication",
+ "filterActive": "Active",
+ "filterActivePaused": "Paused",
+ "Active": "Active",
+ "Inactive": "Inactive",
+ "Token": "Token",
+ "Show URI": "Show URI",
+ "Tags": "Tags",
+ "Add New Tag": "Add New Tag",
+ "Add New below or Select...": "Add New below or Select…",
+ "Tag with this name already exist.": "Tag with this name already exists.",
+ "Tag with this value already exist.": "Tag with this value already exists.",
+ "color": "Color",
+ "value (optional)": "value (optional)",
+ "Gray": "Gray",
+ "Red": "Red",
+ "Orange": "Orange",
+ "Green": "Green",
+ "Blue": "Blue",
+ "Indigo": "Indigo",
+ "Purple": "Purple",
+ "Pink": "Pink",
+ "Custom": "Custom",
+ "Search...": "Search…",
+ "Search monitored sites": "Search monitored sites",
+ "Avg. Ping": "Avg. Ping",
+ "Avg. Response": "Avg. Response",
+ "Entry Page": "Entry Page",
+ "statusPageNothing": "Nothing here, please add a group or a monitor.",
+ "statusPageRefreshIn": "Refresh in: {0}",
+ "No Services": "No Services",
+ "All Systems Operational": "All Systems Operational",
+ "Partially Degraded Service": "Partially Degraded Service",
+ "Degraded Service": "Degraded Service",
+ "Add Group": "Add Group",
+ "Add a monitor": "Add a monitor",
+ "Edit Status Page": "Edit Status Page",
+ "Go to Dashboard": "Go to Dashboard",
+ "Status Page": "Status Page",
+ "Status Pages": "Status Pages",
+ "defaultNotificationName": "My {notification} Alert ({number})",
+ "here": "here",
+ "Required": "Required",
+ "Post URL": "Post URL",
+ "Content Type": "Content Type",
+ "webhookJsonDesc": "{0} is good for any modern HTTP servers such as Express.js",
+ "webhookFormDataDesc": "{multipart} is good for PHP. The JSON will need to be parsed with {decodeFunction}",
+ "liquidIntroduction": "Templatability is achieved via the Liquid templating language. Please refer to the {0} for usage instructions. These are the available variables:",
+ "templateMsg": "message of the notification",
+ "templateHeartbeatJSON": "object describing the heartbeat",
+ "templateMonitorJSON": "object describing the monitor",
+ "templateLimitedToUpDownCertNotifications": "only available for UP/DOWN/Certificate expiry notifications",
+ "templateLimitedToUpDownNotifications": "only available for UP/DOWN notifications",
+ "webhookAdditionalHeadersTitle": "Additional Headers",
+ "webhookAdditionalHeadersDesc": "Sets additional headers sent with the webhook. Each header should be defined as a JSON key/value.",
+ "webhookBodyPresetOption": "Preset - {0}",
+ "webhookBodyCustomOption": "Custom Body",
+ "Webhook URL": "Webhook URL",
+ "Application Token": "Application Token",
+ "Server URL": "Server URL",
+ "Priority": "Priority",
+ "emojiCheatSheet": "Emoji cheat sheet: {0}",
+ "Read more": "Read more",
+ "appriseInstalled": "Apprise is installed.",
+ "appriseNotInstalled": "Apprise is not installed. {0}",
+ "Method": "Method",
+ "Body": "Body",
+ "Headers": "Headers",
+ "PushUrl": "Push URL",
+ "HeadersInvalidFormat": "The request headers are not valid JSON: ",
+ "BodyInvalidFormat": "The request body is not valid JSON: ",
+ "Monitor History": "Monitor History",
+ "clearDataOlderThan": "Keep monitor history data for {0} days.",
+ "PasswordsDoNotMatch": "Passwords do not match.",
+ "records": "records",
+ "One record": "One record",
+ "steamApiKeyDescription": "For monitoring a Steam Game Server you need a Steam Web-API key. You can register your API key here: ",
+ "Current User": "Current User",
+ "topic": "Topic",
+ "topicExplanation": "MQTT topic to monitor",
+ "successKeyword": "Success Keyword",
+ "successKeywordExplanation": "MQTT Keyword that will be considered as success",
+ "recent": "Recent",
+ "Reset Token": "Reset Token",
+ "Done": "Done",
+ "Info": "Info",
+ "Security": "Security",
+ "Steam API Key": "Steam API Key",
+ "Shrink Database": "Shrink Database",
+ "shrinkDatabaseDescriptionSqlite": "Trigger database {vacuum} for SQLite. {auto_vacuum} is already enabled but this does not defragment the database nor repack individual database pages the way that the {vacuum} command does.",
+ "Pick a RR-Type...": "Pick a RR-Type…",
+ "Select the transport method...": "Select the transport method…",
+ "Pick Accepted Status Codes...": "Pick Accepted Status Codes…",
+ "Default": "Default",
+ "HTTP Options": "HTTP Options",
+ "Create Incident": "Create Incident",
+ "Title": "Title",
+ "Content": "Content",
+ "Style": "Style",
+ "info": "info",
+ "warning": "warning",
+ "danger": "danger",
+ "error": "error",
+ "critical": "critical",
+ "primary": "primary",
+ "light": "light",
+ "dark": "dark",
+ "Post": "Post",
+ "Please input title and content": "Please input title and content",
+ "Created": "Created",
+ "Last Updated": "Last Updated",
+ "Switch to Light Theme": "Switch to Light Theme",
+ "Switch to Dark Theme": "Switch to Dark Theme",
+ "Show Tags": "Show Tags",
+ "Hide Tags": "Hide Tags",
+ "Description": "Description",
+ "No monitors available.": "No monitors available.",
+ "Add one": "Add one",
+ "No Monitors": "No Monitors",
+ "Untitled Group": "Untitled Group",
+ "Services": "Services",
+ "Discard": "Discard",
+ "Cancel": "Cancel",
+ "Select": "Select",
+ "selectedMonitorCount": "Selected: {0}",
+ "Check/Uncheck": "Check/Uncheck",
+ "Powered by": "Powered by",
+ "Customize": "Customize",
+ "Custom Footer": "Custom Footer",
+ "Custom CSS": "Custom CSS",
+ "deleteStatusPageMsg": "Are you sure want to delete this status page?",
+ "Proxies": "Proxies",
+ "default": "Default",
+ "enabled": "Enabled",
+ "setAsDefault": "Set As Default",
+ "deleteProxyMsg": "Are you sure want to delete this proxy for all monitors?",
+ "proxyDescription": "Proxies must be assigned to a monitor to function.",
+ "enableProxyDescription": "This proxy will not effect on monitor requests until it is activated. You can control temporarily disable the proxy from all monitors by activation status.",
+ "setAsDefaultProxyDescription": "This proxy will be enabled by default for new monitors. You can still disable the proxy separately for each monitor.",
+ "Certificate Chain": "Certificate Chain",
+ "Valid": "Valid",
+ "Invalid": "Invalid",
+ "User": "User",
+ "Installed": "Installed",
+ "Not installed": "Not installed",
+ "Running": "Running",
+ "Not running": "Not running",
+ "Remove Token": "Remove Token",
+ "Start": "Start",
+ "Stop": "Stop",
+ "Add New Status Page": "Add New Status Page",
+ "Slug": "Slug",
+ "Accept characters:": "Accept characters:",
+ "startOrEndWithOnly": "Start or end with {0} only",
+ "No consecutive dashes": "No consecutive dashes",
+ "statusPageSpecialSlugDesc": "Special slug {0}: this page will be shown when no slug is provided",
+ "Next": "Next",
+ "The slug is already taken. Please choose another slug.": "The slug is already taken. Please choose another slug.",
+ "No Proxy": "No Proxy",
+ "Authentication": "Authentication",
+ "HTTP Basic Auth": "HTTP Basic Auth",
+ "New Status Page": "New Status Page",
+ "Page Not Found": "Page Not Found",
+ "Reverse Proxy": "Reverse Proxy",
+ "Backup": "Backup",
+ "About": "About",
+ "wayToGetCloudflaredURL": "(Download cloudflared from {0})",
+ "cloudflareWebsite": "Cloudflare Website",
+ "Message:": "Message:",
+ "Don't know how to get the token? Please read the guide:": "Don't know how to get the token? Please read the guide:",
+ "The current connection may be lost if you are currently connecting via Cloudflare Tunnel. Are you sure want to stop it? Type your current password to confirm it.": "The current connection may be lost if you are currently connecting via Cloudflare Tunnel. Are you sure want to stop it? Type your current password to confirm it.",
+ "HTTP Headers": "HTTP Headers",
+ "Trust Proxy": "Trust Proxy",
+ "Other Software": "Other Software",
+ "For example: nginx, Apache and Traefik.": "For example: nginx, Apache and Traefik.",
+ "Please read": "Please read",
+ "Subject:": "Subject:",
+ "Valid To:": "Valid To:",
+ "Days Remaining:": "Days Remaining:",
+ "Issuer:": "Issuer:",
+ "Fingerprint:": "Fingerprint:",
+ "No status pages": "No status pages",
+ "Domain Name Expiry Notification": "Domain Name Expiry Notification",
+ "Add a new expiry notification day": "Add a new expiry notification day",
+ "Remove the expiry notification": "Remove the expiry notification day",
+ "Proxy": "Proxy",
+ "Date Created": "Date Created",
+ "Footer Text": "Footer Text",
+ "Refresh Interval": "Refresh Interval",
+ "Refresh Interval Description": "The status page will do a full site refresh every {0} seconds",
+ "Show Powered By": "Show Powered By",
+ "Domain Names": "Domain Names",
+ "signedInDisp": "Signed in as {0}",
+ "signedInDispDisabled": "Auth Disabled.",
+ "RadiusSecret": "Radius Secret",
+ "RadiusSecretDescription": "Shared Secret between client and server",
+ "RadiusCalledStationId": "Called Station Id",
+ "RadiusCalledStationIdDescription": "Identifier of the called device",
+ "RadiusCallingStationId": "Calling Station Id",
+ "RadiusCallingStationIdDescription": "Identifier of the calling device",
+ "Certificate Expiry Notification": "Certificate Expiry Notification",
+ "API Username": "API Username",
+ "API Key": "API Key",
+ "Show update if available": "Show update if available",
+ "Also check beta release": "Also check beta release",
+ "Using a Reverse Proxy?": "Using a Reverse Proxy?",
+ "Check how to config it for WebSocket": "Check how to config it for WebSocket",
+ "Steam Game Server": "Steam Game Server",
+ "Most likely causes:": "Most likely causes:",
+ "The resource is no longer available.": "The resource is no longer available.",
+ "There might be a typing error in the address.": "There might be a typing error in the address.",
+ "What you can try:": "What you can try:",
+ "Retype the address.": "Retype the address.",
+ "Go back to the previous page.": "Go back to the previous page.",
+ "Coming Soon": "Coming Soon",
+ "Connection String": "Connection String",
+ "Query": "Query",
+ "settingsCertificateExpiry": "TLS Certificate Expiry",
+ "certificationExpiryDescription": "HTTPS Monitors trigger notification when TLS certificate expires in:",
+ "Setup Docker Host": "Set Up Docker Host",
+ "Connection Type": "Connection Type",
+ "Docker Daemon": "Docker Daemon",
+ "noDockerHostMsg": "Not Available. Set Up a Docker Host First.",
+ "DockerHostRequired": "Please set the Docker Host for this monitor.",
+ "deleteDockerHostMsg": "Are you sure want to delete this docker host for all monitors?",
+ "socket": "Socket",
+ "tcp": "TCP / HTTP",
+ "tailscalePingWarning": "In order to use the Tailscale Ping monitor, you need to install Uptime Kuma without Docker and also install Tailscale client on your server.",
+ "Docker Container": "Docker Container",
+ "Container Name / ID": "Container Name / ID",
+ "Docker Host": "Docker Host",
+ "Docker Hosts": "Docker Hosts",
+ "Domain": "Domain",
+ "Workstation": "Workstation",
+ "Packet Size": "Packet Size",
+ "Bot Token": "Bot Token",
+ "wayToGetTelegramToken": "You can get a token from {0}.",
+ "Chat ID": "Chat ID",
+ "telegramMessageThreadID": "(Optional) Message Thread ID",
+ "telegramMessageThreadIDDescription": "Optional Unique identifier for the target message thread (topic) of the forum; for forum supergroups only",
+ "telegramSendSilently": "Send Silently",
+ "telegramSendSilentlyDescription": "Sends the message silently. Users will receive a notification with no sound.",
+ "telegramProtectContent": "Protect Forwarding/Saving",
+ "telegramProtectContentDescription": "If enabled, the bot messages in Telegram will be protected from forwarding and saving.",
+ "supportTelegramChatID": "Support Direct Chat / Group / Channel's Chat ID",
+ "wayToGetTelegramChatID": "You can get your chat ID by sending a message to the bot and going to this URL to view the chat_id:",
+ "YOUR BOT TOKEN HERE": "YOUR BOT TOKEN HERE",
+ "chatIDNotFound": "Chat ID is not found; please send a message to this bot first",
+ "disableCloudflaredNoAuthMsg": "You are in No Auth mode, a password is not required.",
+ "trustProxyDescription": "Trust 'X-Forwarded-*' headers. If you want to get the correct client IP and your Uptime Kuma is behind a proxy such as Nginx or Apache, you should enable this.",
+ "wayToGetLineNotifyToken": "You can get an access token from {0}",
+ "Examples": "Examples",
+ "Home Assistant URL": "Home Assistant URL",
+ "Long-Lived Access Token": "Long-Lived Access Token",
+ "Long-Lived Access Token can be created by clicking on your profile name (bottom left) and scrolling to the bottom then click Create Token. ": "Long-Lived Access Token can be created by clicking on your profile name (bottom left) and scrolling to the bottom then click Create Token. ",
+ "Notification Service": "Notification Service",
+ "default: notify all devices": "default: notify all devices",
+ "A list of Notification Services can be found in Home Assistant under \"Developer Tools > Services\" search for \"notification\" to find your device/phone name.": "A list of Notification Services can be found in Home Assistant under \"Developer Tools > Services\" search for \"notification\" to find your device/phone name.",
+ "Automations can optionally be triggered in Home Assistant:": "Automations can optionally be triggered in Home Assistant:",
+ "Trigger type:": "Trigger type:",
+ "Event type:": "Event type:",
+ "Event data:": "Event data:",
+ "Then choose an action, for example switch the scene to where an RGB light is red.": "Then choose an action, for example switch the scene to where an RGB light is red.",
+ "Frontend Version": "Frontend Version",
+ "Frontend Version do not match backend version!": "Frontend Version do not match backend version!",
+ "backupOutdatedWarning": "Deprecated: Since a lot of features were added and this backup feature is a bit unmaintained, it cannot generate or restore a complete backup.",
+ "backupRecommend": "Please backup the volume or the data folder (./data/) directly instead.",
+ "Optional": "Optional",
+ "and": "and",
+ "or": "or",
+ "sameAsServerTimezone": "Same as Server Timezone",
+ "startDateTime": "Start Date/Time",
+ "endDateTime": "End Date/Time",
+ "cronExpression": "Cron Expression",
+ "cronSchedule": "Schedule: ",
+ "invalidCronExpression": "Invalid Cron Expression: {0}",
+ "recurringInterval": "Interval",
+ "Recurring": "Recurring",
+ "strategyManual": "Active/Inactive Manually",
+ "warningTimezone": "It is using the server's timezone",
+ "weekdayShortMon": "Mon",
+ "weekdayShortTue": "Tue",
+ "weekdayShortWed": "Wed",
+ "weekdayShortThu": "Thu",
+ "weekdayShortFri": "Fri",
+ "weekdayShortSat": "Sat",
+ "weekdayShortSun": "Sun",
+ "dayOfWeek": "Day of Week",
+ "dayOfMonth": "Day of Month",
+ "lastDay": "Last Day",
+ "lastDay1": "Last Day of Month",
+ "lastDay2": "2nd Last Day of Month",
+ "lastDay3": "3rd Last Day of Month",
+ "lastDay4": "4th Last Day of Month",
+ "No Maintenance": "No Maintenance",
+ "pauseMaintenanceMsg": "Are you sure want to pause?",
+ "maintenanceStatus-under-maintenance": "Under Maintenance",
+ "maintenanceStatus-inactive": "Inactive",
+ "maintenanceStatus-scheduled": "Scheduled",
+ "maintenanceStatus-ended": "Ended",
+ "maintenanceStatus-unknown": "Unknown",
+ "Display Timezone": "Display Timezone",
+ "Server Timezone": "Server Timezone",
+ "statusPageMaintenanceEndDate": "End",
+ "IconUrl": "Icon URL",
+ "Enable DNS Cache": "(Deprecated) Enable DNS Cache for HTTP(s) monitors",
+ "Enable": "Enable",
+ "Disable": "Disable",
+ "enableNSCD": "Enable NSCD (Name Service Cache Daemon) for caching all DNS requests",
+ "chromeExecutable": "Chrome/Chromium Executable",
+ "chromeExecutableAutoDetect": "Auto Detect",
+ "chromeExecutableDescription": "For Docker users, if Chromium is not yet installed, it may take a few minutes to install and display the test result. It takes 1GB of disk space.",
+ "dnsCacheDescription": "It may be not working in some IPv6 environments, disable it if you encounter any issues.",
+ "Single Maintenance Window": "Single Maintenance Window",
+ "Maintenance Time Window of a Day": "Maintenance Time Window of a Day",
+ "Effective Date Range": "Effective Date Range (Optional)",
+ "Schedule Maintenance": "Schedule Maintenance",
+ "Edit Maintenance": "Edit Maintenance",
+ "Date and Time": "Date and Time",
+ "DateTime Range": "DateTime Range",
+ "loadingError": "Cannot fetch the data, please try again later.",
+ "plugin": "Plugin | Plugins",
+ "install": "Install",
+ "installing": "Installing",
+ "uninstall": "Uninstall",
+ "uninstalling": "Uninstalling",
+ "confirmUninstallPlugin": "Are you sure want to uninstall this plugin?",
+ "notificationRegional": "Regional",
+ "Clone Monitor": "Clone Monitor",
+ "Clone": "Clone",
+ "cloneOf": "Clone of {0}",
+ "smtp": "Email (SMTP)",
+ "secureOptionNone": "None / STARTTLS (25, 587)",
+ "secureOptionTLS": "TLS (465)",
+ "Ignore TLS Error": "Ignore TLS Error",
+ "From Email": "From Email",
+ "emailCustomisableContent": "Customisable content",
+ "smtpLiquidIntroduction": "The following two fields are templatable via the Liquid templating Language. Please refer to the {0} for usage instructions. These are the available variables:",
+ "emailCustomSubject": "Custom Subject",
+ "leave blank for default subject": "leave blank for default subject",
+ "emailCustomBody": "Custom Body",
+ "leave blank for default body": "leave blank for default body",
+ "emailTemplateServiceName": "Service Name",
+ "emailTemplateHostnameOrURL": "Hostname or URL",
+ "emailTemplateStatus": "Status",
+ "emailTemplateMonitorJSON": "object describing the monitor",
+ "emailTemplateHeartbeatJSON": "object describing the heartbeat",
+ "emailTemplateMsg": "message of the notification",
+ "emailTemplateLimitedToUpDownNotification": "only available for UP/DOWN heartbeats, otherwise null",
+ "To Email": "To Email",
+ "smtpCC": "CC",
+ "smtpBCC": "BCC",
+ "Discord Webhook URL": "Discord Webhook URL",
+ "wayToGetDiscordURL": "You can get this by going to Server Settings -> Integrations -> View Webhooks -> New Webhook",
+ "Bot Display Name": "Bot Display Name",
+ "Prefix Custom Message": "Prefix Custom Message",
+ "Hello @everyone is...": "Hello {'@'}everyone is…",
+ "Select message type": "Select message type",
+ "Send to channel": "Send to channel",
+ "Create new forum post": "Create new forum post",
+ "postToExistingThread": "Post to existing thread / forum post",
+ "forumPostName": "Forum post name",
+ "threadForumPostID": "Thread / Forum post ID",
+ "e.g. {discordThreadID}": "e.g. {discordThreadID}",
+ "whatHappensAtForumPost": "Create a new forum post. This does NOT post messages in existing post. To post in existing post use \"{option}\"",
+ "wayToGetDiscordThreadId": "Getting a thread / forum post id is similar to getting a channel id. Read more about how to get ids {0}",
+ "wayToGetTeamsURL": "You can learn how to create a webhook URL {0}.",
+ "wayToGetZohoCliqURL": "You can learn how to create a webhook URL {0}.",
+ "needSignalAPI": "You need to have a signal client with REST API.",
+ "wayToCheckSignalURL": "You can check this URL to view how to set one up:",
+ "Number": "Number",
+ "Recipients": "Recipients",
+ "Access Token": "Access Token",
+ "Channel access token": "Channel access token",
+ "Channel access token (Long-lived)": "Channel access token (Long-lived)",
+ "Line Developers Console": "Line Developers Console",
+ "lineDevConsoleTo": "Line Developers Console - {0}",
+ "Basic Settings": "Basic Settings",
+ "User ID": "User ID",
+ "Your User ID": "Your user ID",
+ "Messaging API": "Messaging API",
+ "wayToGetLineChannelToken": "First access the {0}, create a provider and channel (Messaging API), then you can get the channel access token and user ID from the above mentioned menu items.",
+ "Icon URL": "Icon URL",
+ "aboutIconURL": "You can provide a link to a picture in \"Icon URL\" to override the default profile picture. Will not be used if Icon Emoji is set.",
+ "aboutMattermostChannelName": "You can override the default channel that the Webhook posts to by entering the channel name into \"Channel Name\" field. This needs to be enabled in the Mattermost Webhook settings. Ex: #other-channel",
+ "dataRetentionTimeError": "Retention period must be 0 or greater",
+ "infiniteRetention": "Set to 0 for infinite retention.",
+ "confirmDeleteTagMsg": "Are you sure you want to delete this tag? Monitors associated with this tag will not be deleted.",
+ "enableGRPCTls": "Allow to send gRPC request with TLS connection",
+ "grpcMethodDescription": "Method name is convert to camelCase format such as sayHello, check, etc.",
+ "acceptedStatusCodesDescription": "Select status codes which are considered as a successful response.",
+ "deleteMonitorMsg": "Are you sure want to delete this monitor?",
+ "deleteMaintenanceMsg": "Are you sure want to delete this maintenance?",
+ "deleteNotificationMsg": "Are you sure want to delete this notification for all monitors?",
+ "dnsPortDescription": "DNS server port. Defaults to 53. Alternative ports are 443 for DoH and 853 for DoT.",
+ "resolverserverDescription": "Cloudflare is the default server. Use IP address for UDP/TCP/DoT, and domain name for DoH/DoT.",
+ "rrtypeDescription": "Select the RR type you want to monitor",
+ "dnsTransportDescription": "Select the transport method for querying the DNS server.",
+ "dohQueryPathDescription": "Set the query path to use for DNS wireformat.",
+ "dohHttpMethodDescription": "Set the HTTP method to use for DoH query.",
+ "forceHttp2": "Send the request using HTTP/2. Fails if the server does not support HTTP/2.",
+ "skipRemoteDnssecDescription": "Requests the resolver server not to perform DNSSEC verification against queried records.",
+ "pauseMonitorMsg": "Are you sure want to pause?",
+ "enableDefaultNotificationDescription": "This notification will be enabled by default for new monitors. You can still disable the notification separately for each monitor.",
+ "clearEventsMsg": "Are you sure want to delete all events for this monitor?",
+ "clearHeartbeatsMsg": "Are you sure want to delete all heartbeats for this monitor?",
+ "confirmClearStatisticsMsg": "Are you sure you want to delete ALL statistics?",
+ "importHandleDescription": "Choose 'Skip existing' if you want to skip every monitor or notification with the same name. 'Overwrite' will delete every existing monitor and notification.",
+ "confirmImportMsg": "Are you sure you want to import the backup? Please verify you've selected the correct import option.",
+ "twoFAVerifyLabel": "Please enter your token to verify 2FA:",
+ "tokenValidSettingsMsg": "Token is valid! You can now save the 2FA settings.",
+ "confirmEnableTwoFAMsg": "Are you sure you want to enable 2FA?",
+ "confirmDisableTwoFAMsg": "Are you sure you want to disable 2FA?",
+ "recurringIntervalMessage": "Run once every day | Run once every {0} days",
+ "affectedMonitorsDescription": "Select monitors that are affected by current maintenance",
+ "affectedStatusPages": "Show this maintenance message on selected status pages",
+ "atLeastOneMonitor": "Select at least one affected monitor",
+ "passwordNotMatchMsg": "The repeat password does not match.",
+ "notificationDescription": "Notifications must be assigned to a monitor to function.",
+ "keywordDescription": "Search keyword in plain HTML or JSON response. The search is case-sensitive.",
+ "invertKeywordDescription": "Look for the keyword to be absent rather than present.",
+ "jsonQueryDescription": "Parse and extract specific data from the server's JSON response using JSON query or use \"$\" for the raw response, if not expecting JSON. The result is then compared to the expected value, as strings. See {0} for documentation and use {1} to experiment with queries.",
+ "backupDescription": "You can backup all monitors and notifications into a JSON file.",
+ "backupDescription2": "Note: history and event data is not included.",
+ "backupDescription3": "Sensitive data such as notification tokens are included in the export file; please store export securely.",
+ "endpoint": "endpoint",
+ "octopushAPIKey": "\"API key\" from HTTP API credentials in control panel",
+ "octopushLogin": "\"Login\" from HTTP API credentials in control panel",
+ "promosmsLogin": "API Login Name",
+ "promosmsPassword": "API Password",
+ "pushoversounds pushover": "Pushover (default)",
+ "pushoversounds bike": "Bike",
+ "pushoversounds bugle": "Bugle",
+ "pushoversounds cashregister": "Cash Register",
+ "pushoversounds classical": "Classical",
+ "pushoversounds cosmic": "Cosmic",
+ "pushoversounds falling": "Falling",
+ "pushoversounds gamelan": "Gamelan",
+ "pushoversounds incoming": "Incoming",
+ "pushoversounds intermission": "Intermission",
+ "pushoversounds magic": "Magic",
+ "pushoversounds mechanical": "Mechanical",
+ "pushoversounds pianobar": "Piano Bar",
+ "pushoversounds siren": "Siren",
+ "pushoversounds spacealarm": "Space Alarm",
+ "pushoversounds tugboat": "Tug Boat",
+ "pushoversounds alien": "Alien Alarm (long)",
+ "pushoversounds climb": "Climb (long)",
+ "pushoversounds persistent": "Persistent (long)",
+ "pushoversounds echo": "Pushover Echo (long)",
+ "pushoversounds updown": "Up Down (long)",
+ "pushoversounds vibrate": "Vibrate Only",
+ "pushoversounds none": "None (silent)",
+ "pushyAPIKey": "Secret API Key",
+ "pushyToken": "Device token",
+ "apprise": "Apprise (Support 50+ Notification services)",
+ "GoogleChat": "Google Chat (Google Workspace only)",
+ "wayToGetKookBotToken": "Create application and get your bot token at {0}",
+ "wayToGetKookGuildID": "Switch on 'Developer Mode' in Kook setting, and right click the guild to get its ID",
+ "Guild ID": "Guild ID",
+ "User Key": "User Key",
+ "Device": "Device",
+ "Message Title": "Message Title",
+ "Notification Sound": "Notification Sound",
+ "More info on:": "More info on: {0}",
+ "pushoverDesc1": "Emergency priority (2) has default 30 second timeout between retries and will expire after 1 hour.",
+ "pushoverDesc2": "If you want to send notifications to different devices, fill out Device field.",
+ "pushoverMessageTtl": "Message TTL (Seconds)",
+ "SMS Type": "SMS Type",
+ "octopushTypePremium": "Premium (Fast - recommended for alerting)",
+ "octopushTypeLowCost": "Low Cost (Slow - sometimes blocked by operator)",
+ "checkPrice": "Check {0} prices:",
+ "apiCredentials": "API credentials",
+ "octopushLegacyHint": "Do you use the legacy version of Octopush (2011-2020) or the new version?",
+ "Check octopush prices": "Check octopush prices {0}.",
+ "octopushPhoneNumber": "Phone number (intl format, eg : +33612345678) ",
+ "octopushSMSSender": "SMS Sender Name : 3-11 alphanumeric characters and space (a-zA-Z0-9)",
+ "LunaSea Device ID": "LunaSea Device ID",
+ "Apprise URL": "Apprise URL",
+ "Example:": "Example: {0}",
+ "Read more:": "Read more: {0}",
+ "Status:": "Status: {0}",
+ "Strategy": "Strategy",
+ "Free Mobile User Identifier": "Free Mobile User Identifier",
+ "Free Mobile API Key": "Free Mobile API Key",
+ "Enable TLS": "Enable TLS",
+ "Proto Service Name": "Proto Service Name",
+ "Proto Method": "Proto Method",
+ "Proto Content": "Proto Content",
+ "Economy": "Economy",
+ "Lowcost": "Lowcost",
+ "high": "high",
+ "SendKey": "SendKey",
+ "SMSManager API Docs": "SMSManager API Docs ",
+ "Gateway Type": "Gateway Type",
+ "You can divide numbers with": "You can divide numbers with",
+ "Base URL": "Base URL",
+ "goAlertInfo": "GoAlert is a An open source application for on-call scheduling, automated escalations and notifications (like SMS or voice calls). Automatically engage the right person, the right way, and at the right time! {0}",
+ "goAlertIntegrationKeyInfo": "Get generic API integration key for the service in this format \"aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee\" usually the value of token parameter of copied URL.",
+ "AccessKeyId": "AccessKey ID",
+ "SecretAccessKey": "AccessKey Secret",
+ "PhoneNumbers": "PhoneNumbers",
+ "TemplateCode": "TemplateCode",
+ "SignName": "SignName",
+ "Sms template must contain parameters: ": "Sms template must contain parameters: ",
+ "Bark API Version": "Bark API Version",
+ "Bark Endpoint": "Bark Endpoint",
+ "Bark Group": "Bark Group",
+ "Bark Sound": "Bark Sound",
+ "WebHookUrl": "WebHookUrl",
+ "SecretKey": "SecretKey",
+ "For safety, must use secret key": "For safety, must use secret key",
+ "Mentioning": "Mentioning",
+ "Don't mention people": "Don't mention people",
+ "Mention group": "Mention {group}",
+ "Device Token": "Device Token",
+ "Platform": "Platform",
+ "Huawei": "Huawei",
+ "High": "High",
+ "Retry": "Retry",
+ "Topic": "Topic",
+ "WeCom Bot Key": "WeCom Bot Key",
+ "Setup Proxy": "Set Up Proxy",
+ "Proxy Protocol": "Proxy Protocol",
+ "Proxy Server": "Proxy Server",
+ "Proxy server has authentication": "Proxy server has authentication",
+ "promosmsTypeEco": "SMS ECO - cheap but slow and often overloaded. Limited only to Polish recipients.",
+ "promosmsTypeFlash": "SMS FLASH - Message will automatically show on recipient device. Limited only to Polish recipients.",
+ "promosmsTypeFull": "SMS FULL - Premium tier of SMS, You can use your Sender Name (You need to register name first). Reliable for alerts.",
+ "promosmsTypeSpeed": "SMS SPEED - Highest priority in system. Very quick and reliable but costly (about twice of SMS FULL price).",
+ "promosmsPhoneNumber": "Phone number (for Polish recipient You can skip area codes)",
+ "promosmsSMSSender": "SMS Sender Name : Pre-registred name or one of defaults: InfoSMS, SMS Info, MaxSMS, INFO, SMS",
+ "promosmsAllowLongSMS": "Allow long SMS",
+ "Feishu WebHookUrl": "Feishu WebHookURL",
+ "matrixHomeserverURL": "Homeserver URL (with http(s):// and optionally port)",
+ "Internal Room Id": "Internal Room ID",
+ "matrixDesc1": "You can find the internal room ID by looking in the advanced section of the room settings in your Matrix client. It should look like !QMdRCpUIfLwsfjxye6:home.server.",
+ "matrixDesc2": "It is highly recommended you create a new user and do not use your own Matrix user's access token as it will allow full access to your account and all the rooms you joined. Instead, create a new user and only invite it to the room that you want to receive the notification in. You can get the access token by running {0}",
+ "Channel Name": "Channel Name",
+ "Notify Channel": "Notify Channel",
+ "aboutNotifyChannel": "Notify channel will trigger a desktop or mobile notification for all members of the channel, whether their availability is set to active or away.",
+ "Uptime Kuma URL": "Uptime Kuma URL",
+ "setup a new monitor group": "set up a new monitor group",
+ "openModalTo": "open modal to {0}",
+ "Add a domain": "Add a domain",
+ "Remove domain": "Remove domain '{0}'",
+ "Icon Emoji": "Icon Emoji",
+ "signalImportant": "IMPORTANT: You cannot mix groups and numbers in recipients!",
+ "aboutWebhooks": "More info about Webhooks on: {0}",
+ "aboutSlackUsername": "Changes the display name of the message sender. If you want to mention someone, include it in the friendly name instead.",
+ "aboutChannelName": "Enter the channel name on {0} Channel Name field if you want to bypass the Webhook channel. Ex: #other-channel",
+ "aboutKumaURL": "If you leave the Uptime Kuma URL field blank, it will default to the Project GitHub page.",
+ "smtpDkimSettings": "DKIM Settings",
+ "smtpDkimDesc": "Please refer to the Nodemailer DKIM {0} for usage.",
+ "documentation": "documentation",
+ "smtpDkimDomain": "Domain Name",
+ "smtpDkimKeySelector": "Key Selector",
+ "smtpDkimPrivateKey": "Private Key",
+ "smtpDkimHashAlgo": "Hash Algorithm (Optional)",
+ "smtpDkimheaderFieldNames": "Header Keys to sign (Optional)",
+ "smtpDkimskipFields": "Header Keys not to sign (Optional)",
+ "wayToGetPagerDutyKey": "You can get this by going to Service -> Service Directory -> (Select a service) -> Integrations -> Add integration. Here you can search for \"Events API V2\". More info {0}",
+ "Integration Key": "Integration Key",
+ "Integration URL": "Integration URL",
+ "Auto resolve or acknowledged": "Auto resolve or acknowledged",
+ "do nothing": "do nothing",
+ "auto acknowledged": "auto acknowledged",
+ "auto resolve": "auto resolve",
+ "alertaApiEndpoint": "API Endpoint",
+ "alertaEnvironment": "Environment",
+ "alertaApiKey": "API Key",
+ "alertaAlertState": "Alert State",
+ "alertaRecoverState": "Recover State",
+ "serwersmsAPIUser": "API Username (incl. webapi_ prefix)",
+ "serwersmsAPIPassword": "API Password",
+ "serwersmsPhoneNumber": "Phone number",
+ "serwersmsSenderName": "SMS Sender Name (registered via customer portal)",
+ "smseagleTo": "Phone number(s)",
+ "smseagleGroup": "Phonebook group name(s)",
+ "smseagleContact": "Phonebook contact name(s)",
+ "smseagleRecipientType": "Recipient type",
+ "smseagleRecipient": "Recipient(s) (multiple must be separated with comma)",
+ "smseagleToken": "API Access token",
+ "smseagleUrl": "Your SMSEagle device URL",
+ "smseagleEncoding": "Send as Unicode",
+ "smseaglePriority": "Message priority (0-9, default = 0)",
+ "smspartnerApiurl": "You can find your API key in your dashboard at {0}",
+ "smspartnerPhoneNumber": "Phone number(s)",
+ "smspartnerPhoneNumberHelptext": "The number must be in the international format {0}, {1}. Multiple numbers must be separated by {2}",
+ "smspartnerSenderName": "SMS Sender Name",
+ "smspartnerSenderNameInfo": "Must be between 3..=11 regular characters",
+ "Recipient Number": "Recipient Number",
+ "From Name/Number": "From Name/Number",
+ "Leave blank to use a shared sender number.": "Leave blank to use a shared sender number.",
+ "Octopush API Version": "Octopush API Version",
+ "Legacy Octopush-DM": "Legacy Octopush-DM",
+ "ntfy Topic": "ntfy Topic",
+ "Server URL should not contain the nfty topic": "Server URL should not contain the nfty topic",
+ "onebotHttpAddress": "OneBot HTTP Address",
+ "onebotMessageType": "OneBot Message Type",
+ "onebotGroupMessage": "Group",
+ "onebotPrivateMessage": "Private",
+ "onebotUserOrGroupId": "Group/User ID",
+ "onebotSafetyTips": "For safety, must set access token",
+ "PushDeer Server": "PushDeer Server",
+ "pushDeerServerDescription": "Leave blank to use the official server",
+ "PushDeer Key": "PushDeer Key",
+ "wayToGetClickSendSMSToken": "You can get API Username and API Key from {0} .",
+ "Custom Monitor Type": "Custom Monitor Type",
+ "Google Analytics ID": "Google Analytics ID",
+ "Edit Tag": "Edit Tag",
+ "Server Address": "Server Address",
+ "Learn More": "Learn More",
+ "Body Encoding": "Body Encoding",
+ "API Keys": "API Keys",
+ "Expiry": "Expiry",
+ "Expiry date": "Expiry date",
+ "Don't expire": "Don't expire",
+ "Continue": "Continue",
+ "Add Another": "Add Another",
+ "Key Added": "Key Added",
+ "apiKeyAddedMsg": "Your API key has been added. Please make a note of it as it will not be shown again.",
+ "Add API Key": "Add API Key",
+ "No API Keys": "No API Keys",
+ "apiKey-active": "Active",
+ "apiKey-expired": "Expired",
+ "apiKey-inactive": "Inactive",
+ "Expires": "Expires",
+ "disableAPIKeyMsg": "Are you sure you want to disable this API key?",
+ "deleteAPIKeyMsg": "Are you sure you want to delete this API key?",
+ "Generate": "Generate",
+ "pagertreeIntegrationUrl": "Integration URL",
+ "pagertreeUrgency": "Urgency",
+ "pagertreeSilent": "Silent",
+ "pagertreeLow": "Low",
+ "pagertreeMedium": "Medium",
+ "pagertreeHigh": "High",
+ "pagertreeCritical": "Critical",
+ "pagertreeResolve": "Auto Resolve",
+ "pagertreeDoNothing": "Do Nothing",
+ "wayToGetPagerTreeIntegrationURL": "After creating the Uptime Kuma integration in PagerTree, copy the Endpoint. See full details {0}",
+ "lunaseaTarget": "Target",
+ "lunaseaDeviceID": "Device ID",
+ "lunaseaUserID": "User ID",
+ "ntfyAuthenticationMethod": "Authentication Method",
+ "ntfyPriorityHelptextAllEvents": "All events are sent with the maximum priority",
+ "ntfyPriorityHelptextAllExceptDown": "All events are sent with this priority, except {0}-events, which have a priority of {1}",
+ "ntfyUsernameAndPassword": "Username and Password",
+ "twilioAccountSID": "Account SID",
+ "twilioApiKey": "Api Key (optional)",
+ "twilioAuthToken": "Auth Token / Api Key Secret",
+ "twilioFromNumber": "From Number",
+ "twilioToNumber": "To Number",
+ "Monitor Setting": "{0}'s Monitor Setting",
+ "Show Clickable Link": "Show Clickable Link",
+ "Show Clickable Link Description": "If checked everyone who have access to this status page can have access to monitor URL.",
+ "Open Badge Generator": "Open Badge Generator",
+ "Badge Generator": "{0}'s Badge Generator",
+ "Badge Type": "Badge Type",
+ "Badge Duration (in hours)": "Badge Duration (in hours)",
+ "Badge Label": "Badge Label",
+ "Badge Prefix": "Badge Value Prefix",
+ "Badge Suffix": "Badge Value Suffix",
+ "Badge Label Color": "Badge Label Color",
+ "Badge Color": "Badge Color",
+ "Badge Label Prefix": "Badge Label Prefix",
+ "Badge Preview": "Badge Preview",
+ "Badge Label Suffix": "Badge Label Suffix",
+ "Badge Up Color": "Badge Up Color",
+ "Badge Down Color": "Badge Down Color",
+ "Badge Pending Color": "Badge Pending Color",
+ "Badge Maintenance Color": "Badge Maintenance Color",
+ "Badge Warn Color": "Badge Warn Color",
+ "Badge Warn Days": "Badge Warn Days",
+ "Badge Down Days": "Badge Down Days",
+ "Badge Style": "Badge Style",
+ "Badge value (For Testing only.)": "Badge value (For Testing only.)",
+ "Badge URL": "Badge URL",
+ "Group": "Group",
+ "Monitor Group": "Monitor Group",
+ "monitorToastMessagesLabel": "Monitor Toast notifications",
+ "monitorToastMessagesDescription": "Toast notifications for monitors disappear after given time in seconds. Set to -1 disables timeout. Set to 0 disables toast notifications.",
+ "toastErrorTimeout": "Timeout for Error Notifications",
+ "toastSuccessTimeout": "Timeout for Success Notifications",
+ "Kafka Brokers": "Kafka Brokers",
+ "Enter the list of brokers": "Enter the list of brokers",
+ "Press Enter to add broker": "Press Enter to add broker",
+ "Kafka Topic Name": "Kafka Topic Name",
+ "Kafka Producer Message": "Kafka Producer Message",
+ "Enable Kafka SSL": "Enable Kafka SSL",
+ "Enable Kafka Producer Auto Topic Creation": "Enable Kafka Producer Auto Topic Creation",
+ "Kafka SASL Options": "Kafka SASL Options",
+ "Mechanism": "Mechanism",
+ "Pick a SASL Mechanism...": "Pick a SASL Mechanism…",
+ "Authorization Identity": "Authorization Identity",
+ "AccessKey Id": "AccessKey Id",
+ "Secret AccessKey": "Secret AccessKey",
+ "Session Token": "Session Token",
+ "noGroupMonitorMsg": "Not Available. Create a Group Monitor First.",
+ "Close": "Close",
+ "Request Body": "Request Body",
+ "wayToGetFlashDutyKey": "You can go to Channel -> (Select a Channel) -> Integrations -> Add a new integration' page, add a 'Uptime Kuma' to get a push address, copy the Integration Key in the address. For more information, please visit",
+ "FlashDuty Severity": "Severity",
+ "nostrRelays": "Nostr relays",
+ "nostrRelaysHelp": "One relay URL per line",
+ "nostrSender": "Sender Private Key (nsec)",
+ "nostrRecipients": "Recipients Public Keys (npub)",
+ "nostrRecipientsHelp": "npub format, one per line",
+ "showCertificateExpiry": "Show Certificate Expiry",
+ "noOrBadCertificate": "No/Bad Certificate",
+ "cacheBusterParam": "Add the {0} parameter",
+ "cacheBusterParamDescription": "Randomly generated parameter to skip caches.",
+ "gamedigGuessPort": "Gamedig: Guess Port",
+ "gamedigGuessPortDescription": "The port used by Valve Server Query Protocol may be different from the client port. Try this if the monitor cannot connect to your server.",
+ "Message format": "Message format",
+ "Send rich messages": "Send rich messages",
+ "Bitrix24 Webhook URL": "Bitrix24 Webhook URL",
+ "wayToGetBitrix24Webhook": "You can create a webhook by following the steps at {0}",
+ "bitrix24SupportUserID": "Enter your user ID in Bitrix24. You can find out the ID from the link by going to the user's profile.",
+ "Saved.": "Saved.",
+ "authUserInactiveOrDeleted": "The user is inactive or deleted.",
+ "authInvalidToken": "Invalid Token.",
+ "authIncorrectCreds": "Incorrect username or password.",
+ "2faAlreadyEnabled": "2FA is already enabled.",
+ "2faEnabled": "2FA Enabled.",
+ "2faDisabled": "2FA Disabled.",
+ "successAdded": "Added Successfully.",
+ "successResumed": "Resumed Successfully.",
+ "successPaused": "Paused Successfully.",
+ "successDeleted": "Deleted Successfully.",
+ "successEdited": "Edited Successfully.",
+ "successAuthChangePassword": "Password has been updated successfully.",
+ "successBackupRestored": "Backup successfully restored.",
+ "successDisabled": "Disabled Successfully.",
+ "successEnabled": "Enabled Successfully.",
+ "tagNotFound": "Tag not found.",
+ "foundChromiumVersion": "Found Chromium/Chrome. Version: {0}",
+ "Remote Browsers": "Remote Browsers",
+ "Remote Browser": "Remote Browser",
+ "Add a Remote Browser": "Add a Remote Browser",
+ "Remote Browser not found!": "Remote Browser not found!",
+ "remoteBrowsersDescription": "Remote Browsers are an alternative to running Chromium locally. Set up with a service like browserless.io or connect to your own",
+ "self-hosted container": "self-hosted container",
+ "remoteBrowserToggle": "By default Chromium runs inside the Uptime Kuma container. You can use a remote browser by toggling this switch.",
+ "useRemoteBrowser": "Use a Remote Browser",
+ "deleteRemoteBrowserMessage": "Are you sure want to delete this Remote Browser for all monitors?",
+ "GrafanaOncallUrl": "Grafana Oncall URL",
+ "Browser Screenshot": "Browser Screenshot",
+ "Command": "Command",
+ "mongodbCommandDescription": "Run a MongoDB command against the database. For information about the available commands check out the {documentation}",
+ "wayToGetSevenIOApiKey": "Visit the dashboard under app.seven.io > developer > api key > the green add button",
+ "senderSevenIO": "Sending number or name",
+ "receiverSevenIO": "Receiving number",
+ "receiverInfoSevenIO": "If the receiving number is not located in Germany, you have to add the country code in front of the number (e.g. for the country code 1 from the US use 117612121212 instead of 017612121212)",
+ "apiKeySevenIO": "SevenIO API Key",
+ "wayToWriteWhapiRecipient": "The phone number with the international prefix, but without the plus sign at the start ({0}), the Contact ID ({1}) or the Group ID ({2}).",
+ "wayToGetWhapiUrlAndToken": "You can get the API URL and the token by going into your desired channel from {0}",
+ "whapiRecipient": "Phone Number / Contact ID / Group ID",
+ "API URL": "API URL",
+ "What is a Remote Browser?": "What is a Remote Browser?",
+ "wayToGetHeiiOnCallDetails": "How to get the Trigger ID and API Keys is explained in the {documentation}",
+ "documentationOf": "{0} Documentation",
+ "callMeBotGet": "Here you can generate an endpoint for {0}, {1} and {2}. Keep in mind that you might get rate limited. The ratelimits appear to be: {3}",
+ "gtxMessagingApiKeyHint": "You can find your API key at: My Routing Accounts > Show Account Information > API Credentials > REST API (v2.x)",
+ "From Phone Number / Transmission Path Originating Address (TPOA)": "From Phone Number / Transmission Path Originating Address (TPOA)",
+ "gtxMessagingFromHint": "On mobile phones, your recipients sees the TPOA displayed as the sender of the message. Allowed are up to 11 alphanumeric characters, a shortcode, the local longcode or international numbers ({e164}, {e212} or {e214})",
+ "To Phone Number": "To Phone Number",
+ "gtxMessagingToHint": "International format, with leading \"+\" ({e164}, {e212} or {e214})",
+ "Originator type": "Originator type",
+ "Alphanumeric (recommended)": "Alphanumeric (recommended)",
+ "Telephone number": "Telephone number",
+ "cellsyntOriginatortypeAlphanumeric": "Alphanumeric string (max 11 alphanumeric characters). Recipients can not reply to the message.",
+ "cellsyntOriginatortypeNumeric": "Numeric value (max 15 digits) with telephone number on international format without leading 00 (example UK number 07920 110 000 should be set as 447920110000). Recipients can reply to the message.",
+ "Originator": "Originator",
+ "cellsyntOriginator": "Visible on recipient's mobile phone as originator of the message. Allowed values and function depends on parameter originatortype.",
+ "Destination": "Destination",
+ "cellsyntDestination": "Recipient's telephone number using international format with leading 00 followed by country code, e.g. 00447920110000 for the UK number 07920 110 000 (max 17 digits in total). Max 25000 comma separated recipients per HTTP request.",
+ "Allow Long SMS": "Allow Long SMS",
+ "cellsyntSplitLongMessages": "Split long messages into up to 6 parts. 153 x 6 = 918 characters.",
+ "max 15 digits": "max 15 digits",
+ "max 11 alphanumeric characters": "max 11 alphanumeric characters",
+ "Community String": "Community String",
+ "snmpCommunityStringHelptext": "This string functions as a password to authenticate and control access to SNMP-enabled devices. Match it with your SNMP device's configuration.",
+ "OID (Object Identifier)": "OID (Object Identifier)",
+ "snmpOIDHelptext": "Enter the OID for the sensor or status you want to monitor. Use network management tools like MIB browsers or SNMP software if you're unsure about the OID.",
+ "Condition": "Condition",
+ "SNMP Version": "SNMP Version",
+ "Please enter a valid OID.": "Please enter a valid OID.",
+ "wayToGetThreemaGateway": "You can register for Threema Gateway {0}.",
+ "threemaRecipient": "Recipient",
+ "threemaRecipientType": "Recipient Type",
+ "threemaRecipientTypeIdentity": "Threema-ID",
+ "threemaRecipientTypeIdentityFormat": "8 characters",
+ "threemaRecipientTypePhone": "Phone Number",
+ "threemaRecipientTypePhoneFormat": "E.164, without leading +",
+ "threemaRecipientTypeEmail": "Email Address",
+ "threemaSenderIdentity": "Gateway-ID",
+ "threemaSenderIdentityFormat": "8 characters, usually starts with *",
+ "threemaApiAuthenticationSecret": "Gateway-ID Secret",
+ "threemaBasicModeInfo": "Note: This integration uses Threema Gateway in basic mode (server-based encryption). Further details can be found {0}.",
+ "apiKeysDisabledMsg": "API keys are disabled because authentication is disabled.",
+ "Host Onesender": "Host Onesender",
+ "Token Onesender": "Token Onesender",
+ "Recipient Type": "Recipient Type",
+ "Private Number": "Private Number",
+ "privateOnesenderDesc": "Make sure the number phone is valid. To send message into private number phone, ex: 628123456789",
+ "groupOnesenderDesc": "Make sure the GroupID is valid. To send message into Group, ex: 628123456789-342345",
+ "Group ID": "Group ID",
+ "wayToGetOnesenderUrlandToken": "You can get the URL and Token by going to the Onesender website. More info {0}",
+ "Add Remote Browser": "Add Remote Browser",
+ "New Group": "New Group",
+ "Group Name": "Group Name",
+ "OAuth2: Client Credentials": "OAuth2: Client Credentials",
+ "Authentication Method": "Authentication Method",
+ "Authorization Header": "Authorization Header",
+ "Form Data Body": "Form Data Body",
+ "OAuth Token URL": "OAuth Token URL",
+ "Client ID": "Client ID",
+ "Client Secret": "Client Secret",
+ "OAuth Scope": "OAuth Scope",
+ "Optional: Space separated list of scopes": "Optional: Space separated list of scopes",
+ "Go back to home page.": "Go back to home page.",
+ "No tags found.": "No tags found.",
+ "Lost connection to the socket server.": "Lost connection to the socket server.",
+ "Cannot connect to the socket server.": "Cannot connect to the socket server.",
+ "SIGNL4": "SIGNL4",
+ "SIGNL4 Webhook URL": "SIGNL4 Webhook URL",
+ "signl4Docs": "You can find more information about how to configure SIGNL4 and how to obtain the SIGNL4 webhook URL in the {0}.",
+ "Conditions": "Conditions",
+ "conditionAdd": "Add Condition",
+ "conditionDelete": "Delete Condition",
+ "conditionAddGroup": "Add Group",
+ "conditionDeleteGroup": "Delete Group",
+ "conditionValuePlaceholder": "Value",
+ "equals": "equals",
+ "not equals": "not equals",
+ "contains": "contains",
+ "not contains": "not contains",
+ "starts with": "starts with",
+ "not starts with": "not starts with",
+ "ends with": "ends with",
+ "not ends with": "not ends with",
+ "less than": "less than",
+ "greater than": "greater than",
+ "less than or equal to": "less than or equal to",
+ "greater than or equal to": "greater than or equal to",
+ "record": "record",
+ "Notification Channel": "Notification Channel",
+ "Sound": "Sound",
+ "Alphanumerical string and hyphens only": "Alphanumerical string and hyphens only",
+ "Arcade": "Arcade",
+ "Correct": "Correct",
+ "Fail": "Fail",
+ "Harp": "Harp",
+ "Reveal": "Reveal",
+ "Bubble": "Bubble",
+ "Doorbell": "Doorbell",
+ "Flute": "Flute",
+ "Money": "Money",
+ "Scifi": "Scifi",
+ "Clear": "Clear",
+ "Elevator": "Elevator",
+ "Guitar": "Guitar",
+ "Pop": "Pop",
+ "Custom sound to override default notification sound": "Custom sound to override default notification sound",
+ "Time Sensitive (iOS Only)": "Time Sensitive (iOS Only)",
+ "Time sensitive notifications will be delivered immediately, even if the device is in do not disturb mode.": "Time sensitive notifications will be delivered immediately, even if the device is in do not disturb mode.",
+ "From": "From",
+ "Can be found on:": "Can be found on: {0}",
+ "The phone number of the recipient in E.164 format.": "The phone number of the recipient in E.164 format.",
+ "Either a text sender ID or a phone number in E.164 format if you want to be able to receive replies.": "Either a text sender ID or a phone number in E.164 format if you want to be able to receive replies.",
+ "RabbitMQ Nodes": "RabbitMQ Management Nodes",
+ "rabbitmqNodesDescription": "Enter the URL for the RabbitMQ management nodes including protocol and port. Example: {0}",
+ "rabbitmqNodesRequired": "Please set the nodes for this monitor.",
+ "rabbitmqNodesInvalid": "Please use a fully qualified (starting with 'http') URL for RabbitMQ nodes.",
+ "RabbitMQ Username": "RabbitMQ Username",
+ "RabbitMQ Password": "RabbitMQ Password",
+ "rabbitmqHelpText": "To use the monitor, you will need to enable the Management Plugin in your RabbitMQ setup. For more information, please consult the {rabitmq_documentation}.",
+ "SendGrid API Key": "SendGrid API Key",
+ "Separate multiple email addresses with commas": "Separate multiple email addresses with commas"
}
diff --git a/src/pages/Details.vue b/src/pages/Details.vue
index 17d32365c..29f21b698 100644
--- a/src/pages/Details.vue
+++ b/src/pages/Details.vue
@@ -31,9 +31,9 @@
{{ $t("Expected Value") }}:{{ monitor.expectedValue }}
- [{{ monitor.dns_resolve_type }}] {{ monitor.hostname }}
+ [{{ monitor.dnsResolveType }}] {{ monitor.hostname }}
- {{ $t("Last Result") }}:{{ monitor.dns_last_result }}
+ {{ $t("Last Result") }}:{{ monitor.dnsLastResult }}Docker container: {{ monitor.docker_container }}Gamedig - {{ monitor.game }}: {{ monitor.hostname }}:{{ monitor.port }}
diff --git a/src/pages/EditMonitor.vue b/src/pages/EditMonitor.vue
index ac8f573ba..0634cd5a3 100644
--- a/src/pages/EditMonitor.vue
+++ b/src/pages/EditMonitor.vue
@@ -370,18 +370,19 @@