Merge branch 'master' into 2.0-last-part

2.0-last-part
Louis Lam 2 months ago
commit 7f1042976b

@ -15,14 +15,14 @@ on:
jobs: jobs:
auto-test: auto-test:
needs: [ check-linters, e2e-test ] needs: [ check-linters ]
runs-on: ${{ matrix.os }} runs-on: ${{ matrix.os }}
timeout-minutes: 15 timeout-minutes: 15
strategy: strategy:
matrix: matrix:
os: [macos-latest, ubuntu-latest, windows-latest, ARM64] os: [macos-latest, ubuntu-latest, windows-latest, ARM64]
node: [ 18, 20.5 ] node: [ 18, 20 ]
# See supported Node.js release schedule at https://nodejs.org/en/about/releases/ # See supported Node.js release schedule at https://nodejs.org/en/about/releases/
steps: steps:
@ -42,7 +42,7 @@ jobs:
# As a lot of dev dependencies are not supported on ARMv7, we have to test it separately and just test if `npm ci --production` works # As a lot of dev dependencies are not supported on ARMv7, we have to test it separately and just test if `npm ci --production` works
armv7-simple-test: armv7-simple-test:
needs: [ check-linters ] needs: [ ]
runs-on: ${{ matrix.os }} runs-on: ${{ matrix.os }}
timeout-minutes: 15 timeout-minutes: 15
if: ${{ github.repository == 'louislam/uptime-kuma' }} if: ${{ github.repository == 'louislam/uptime-kuma' }}
@ -77,7 +77,7 @@ jobs:
- run: npm run lint:prod - run: npm run lint:prod
e2e-test: e2e-test:
needs: [ check-linters ] needs: [ ]
runs-on: ARM64 runs-on: ARM64
steps: steps:
- run: git config --global core.autocrlf false # Mainly for Windows - run: git config --global core.autocrlf false # Mainly for Windows

@ -4,7 +4,6 @@ const tar = require("tar");
const packageJSON = require("../package.json"); const packageJSON = require("../package.json");
const fs = require("fs"); const fs = require("fs");
const rmSync = require("./fs-rmSync.js");
const version = packageJSON.version; const version = packageJSON.version;
const filename = "dist.tar.gz"; const filename = "dist.tar.gz";
@ -29,8 +28,9 @@ function download(url) {
if (fs.existsSync("./dist")) { if (fs.existsSync("./dist")) {
if (fs.existsSync("./dist-backup")) { if (fs.existsSync("./dist-backup")) {
rmSync("./dist-backup", { fs.rmSync("./dist-backup", {
recursive: true recursive: true,
force: true,
}); });
} }
@ -43,8 +43,9 @@ function download(url) {
tarStream.on("close", () => { tarStream.on("close", () => {
if (fs.existsSync("./dist-backup")) { if (fs.existsSync("./dist-backup")) {
rmSync("./dist-backup", { fs.rmSync("./dist-backup", {
recursive: true recursive: true,
force: true,
}); });
} }
console.log("Done"); console.log("Done");

@ -1,23 +0,0 @@
const fs = require("fs");
/**
* Detect if `fs.rmSync` is available
* to avoid the runtime deprecation warning triggered for using `fs.rmdirSync` with `{ recursive: true }` in Node.js v16,
* or the `recursive` property removing completely in the future Node.js version.
* See the link below.
* @todo Once we drop the support for Node.js v14 (or at least versions before v14.14.0), we can safely replace this function with `fs.rmSync`, since `fs.rmSync` was add in Node.js v14.14.0 and currently we supports all the Node.js v14 versions that include the versions before the v14.14.0, and this function have almost the same signature with `fs.rmSync`.
* @link https://nodejs.org/docs/latest-v16.x/api/deprecations.html#dep0147-fsrmdirpath--recursive-true- the deprecation information of `fs.rmdirSync`
* @link https://nodejs.org/docs/latest-v16.x/api/fs.html#fsrmsyncpath-options the document of `fs.rmSync`
* @param {fs.PathLike} path Valid types for path values in "fs".
* @param {fs.RmDirOptions} options options for `fs.rmdirSync`, if `fs.rmSync` is available and property `recursive` is true, it will automatically have property `force` with value `true`.
* @returns {void}
*/
const rmSync = (path, options) => {
if (typeof fs.rmSync === "function") {
if (options.recursive) {
options.force = true;
}
return fs.rmSync(path, options);
}
return fs.rmdirSync(path, options);
};
module.exports = rmSync;

@ -2,7 +2,6 @@
import fs from "fs"; import fs from "fs";
import util from "util"; import util from "util";
import rmSync from "../fs-rmSync.js";
/** /**
* Copy across the required language files * Copy across the required language files
@ -16,7 +15,10 @@ import rmSync from "../fs-rmSync.js";
*/ */
function copyFiles(langCode, baseLang) { function copyFiles(langCode, baseLang) {
if (fs.existsSync("./languages")) { if (fs.existsSync("./languages")) {
rmSync("./languages", { recursive: true }); fs.rmSync("./languages", {
recursive: true,
force: true,
});
} }
fs.mkdirSync("./languages"); fs.mkdirSync("./languages");
@ -93,6 +95,9 @@ console.log("Updating: " + langCode);
copyFiles(langCode, baseLangCode); copyFiles(langCode, baseLangCode);
await updateLanguage(langCode, baseLangCode); await updateLanguage(langCode, baseLangCode);
rmSync("./languages", { recursive: true }); fs.rmSync("./languages", {
recursive: true,
force: true,
});
console.log("Done. Fixing formatting by ESLint..."); console.log("Done. Fixing formatting by ESLint...");

@ -68,8 +68,7 @@
"sort-contributors": "node extra/sort-contributors.js", "sort-contributors": "node extra/sort-contributors.js",
"quick-run-nightly": "docker run --rm --env NODE_ENV=development -p 3001:3001 louislam/uptime-kuma:nightly2", "quick-run-nightly": "docker run --rm --env NODE_ENV=development -p 3001:3001 louislam/uptime-kuma:nightly2",
"start-dev-container": "cd docker && docker-compose -f docker-compose-dev.yml up --force-recreate", "start-dev-container": "cd docker && docker-compose -f docker-compose-dev.yml up --force-recreate",
"rebase-pr-to-1.23.X": "node extra/rebase-pr.js 1.23.X", "rebase-pr-to-1.23.X": "node extra/rebase-pr.js 1.23.X"
"start-server-node14-win": "private\\node14\\node.exe server/server.js"
}, },
"dependencies": { "dependencies": {
"@grpc/grpc-js": "~1.8.22", "@grpc/grpc-js": "~1.8.22",

@ -72,23 +72,12 @@ class Monitor extends BeanModel {
/** /**
* Return an object that ready to parse to JSON * Return an object that ready to parse to JSON
* @param {object} preloadData to prevent n+1 problems, we query the data in a batch outside of this function
* @param {boolean} includeSensitiveData Include sensitive data in * @param {boolean} includeSensitiveData Include sensitive data in
* JSON * JSON
* @returns {Promise<object>} Object ready to parse * @returns {object} Object ready to parse
*/ */
async toJSON(includeSensitiveData = true) { toJSON(preloadData = {}, includeSensitiveData = true) {
let notificationIDList = {};
let list = await R.find("monitor_notification", " monitor_id = ? ", [
this.id,
]);
for (let bean of list) {
notificationIDList[bean.notification_id] = true;
}
const tags = await this.getTags();
let screenshot = null; let screenshot = null;
@ -96,7 +85,7 @@ class Monitor extends BeanModel {
screenshot = "/screenshots/" + jwt.sign(this.id, UptimeKumaServer.getInstance().jwtSecret) + ".png"; screenshot = "/screenshots/" + jwt.sign(this.id, UptimeKumaServer.getInstance().jwtSecret) + ".png";
} }
const path = await this.getPath(); const path = preloadData.paths.get(this.id) || [];
const pathName = path.join(" / "); const pathName = path.join(" / ");
let data = { let data = {
@ -106,15 +95,15 @@ class Monitor extends BeanModel {
path, path,
pathName, pathName,
parent: this.parent, parent: this.parent,
childrenIDs: await Monitor.getAllChildrenIDs(this.id), childrenIDs: preloadData.childrenIDs.get(this.id) || [],
url: this.url, url: this.url,
method: this.method, method: this.method,
hostname: this.hostname, hostname: this.hostname,
port: this.port, port: this.port,
maxretries: this.maxretries, maxretries: this.maxretries,
weight: this.weight, weight: this.weight,
active: await this.isActive(), active: preloadData.activeStatus.get(this.id),
forceInactive: !await Monitor.isParentActive(this.id), forceInactive: preloadData.forceInactive.get(this.id),
type: this.type, type: this.type,
timeout: this.timeout, timeout: this.timeout,
interval: this.interval, interval: this.interval,
@ -134,9 +123,9 @@ class Monitor extends BeanModel {
docker_container: this.docker_container, docker_container: this.docker_container,
docker_host: this.docker_host, docker_host: this.docker_host,
proxyId: this.proxy_id, proxyId: this.proxy_id,
notificationIDList, notificationIDList: preloadData.notifications.get(this.id) || {},
tags: tags, tags: preloadData.tags.get(this.id) || [],
maintenance: await Monitor.isUnderMaintenance(this.id), maintenance: preloadData.maintenanceStatus.get(this.id),
mqttTopic: this.mqttTopic, mqttTopic: this.mqttTopic,
mqttSuccessMessage: this.mqttSuccessMessage, mqttSuccessMessage: this.mqttSuccessMessage,
mqttCheckType: this.mqttCheckType, mqttCheckType: this.mqttCheckType,
@ -202,16 +191,6 @@ class Monitor extends BeanModel {
return data; return data;
} }
/**
* Checks if the monitor is active based on itself and its parents
* @returns {Promise<boolean>} Is the monitor active?
*/
async isActive() {
const parentActive = await Monitor.isParentActive(this.id);
return (this.active === 1) && parentActive;
}
/** /**
* Get all tags applied to this monitor * Get all tags applied to this monitor
* @returns {Promise<LooseObject<any>[]>} List of tags on the * @returns {Promise<LooseObject<any>[]>} List of tags on the
@ -1197,6 +1176,18 @@ class Monitor extends BeanModel {
return checkCertificateResult; return checkCertificateResult;
} }
/**
* Checks if the monitor is active based on itself and its parents
* @param {number} monitorID ID of monitor to send
* @param {boolean} active is active
* @returns {Promise<boolean>} Is the monitor active?
*/
static async isActive(monitorID, active) {
const parentActive = await Monitor.isParentActive(monitorID);
return (active === 1) && parentActive;
}
/** /**
* Send statistics to clients * Send statistics to clients
* @param {Server} io Socket server instance * @param {Server} io Socket server instance
@ -1333,7 +1324,10 @@ class Monitor extends BeanModel {
for (let notification of notificationList) { for (let notification of notificationList) {
try { try {
const heartbeatJSON = bean.toJSON(); const heartbeatJSON = bean.toJSON();
const monitorData = [{ id: monitor.id,
active: monitor.active
}];
const preloadData = await Monitor.preparePreloadData(monitorData);
// Prevent if the msg is undefined, notifications such as Discord cannot send out. // Prevent if the msg is undefined, notifications such as Discord cannot send out.
if (!heartbeatJSON["msg"]) { if (!heartbeatJSON["msg"]) {
heartbeatJSON["msg"] = "N/A"; heartbeatJSON["msg"] = "N/A";
@ -1344,7 +1338,7 @@ class Monitor extends BeanModel {
heartbeatJSON["timezoneOffset"] = UptimeKumaServer.getInstance().getTimezoneOffset(); heartbeatJSON["timezoneOffset"] = UptimeKumaServer.getInstance().getTimezoneOffset();
heartbeatJSON["localDateTime"] = dayjs.utc(heartbeatJSON["time"]).tz(heartbeatJSON["timezone"]).format(SQL_DATETIME_FORMAT); heartbeatJSON["localDateTime"] = dayjs.utc(heartbeatJSON["time"]).tz(heartbeatJSON["timezone"]).format(SQL_DATETIME_FORMAT);
await Notification.send(JSON.parse(notification.config), msg, await monitor.toJSON(false), heartbeatJSON); await Notification.send(JSON.parse(notification.config), msg, monitor.toJSON(preloadData, false), heartbeatJSON);
} catch (e) { } catch (e) {
log.error("monitor", "Cannot send notification to " + notification.name); log.error("monitor", "Cannot send notification to " + notification.name);
log.error("monitor", e); log.error("monitor", e);
@ -1507,6 +1501,111 @@ class Monitor extends BeanModel {
} }
} }
/**
* Gets monitor notification of multiple monitor
* @param {Array} monitorIDs IDs of monitor to get
* @returns {Promise<LooseObject<any>>} object
*/
static async getMonitorNotification(monitorIDs) {
return await R.getAll(`
SELECT monitor_notification.monitor_id, monitor_notification.notification_id
FROM monitor_notification
WHERE monitor_notification.monitor_id IN (?)
`, [
monitorIDs,
]);
}
/**
* Gets monitor tags of multiple monitor
* @param {Array} monitorIDs IDs of monitor to get
* @returns {Promise<LooseObject<any>>} object
*/
static async getMonitorTag(monitorIDs) {
return await R.getAll(`
SELECT monitor_tag.monitor_id, tag.name, tag.color
FROM monitor_tag
JOIN tag ON monitor_tag.tag_id = tag.id
WHERE monitor_tag.monitor_id IN (?)
`, [
monitorIDs,
]);
}
/**
* prepare preloaded data for efficient access
* @param {Array} monitorData IDs & active field of monitor to get
* @returns {Promise<LooseObject<any>>} object
*/
static async preparePreloadData(monitorData) {
const notificationsMap = new Map();
const tagsMap = new Map();
const maintenanceStatusMap = new Map();
const childrenIDsMap = new Map();
const activeStatusMap = new Map();
const forceInactiveMap = new Map();
const pathsMap = new Map();
if (monitorData.length > 0) {
const monitorIDs = monitorData.map(monitor => monitor.id);
const notifications = await Monitor.getMonitorNotification(monitorIDs);
const tags = await Monitor.getMonitorTag(monitorIDs);
const maintenanceStatuses = await Promise.all(monitorData.map(monitor => Monitor.isUnderMaintenance(monitor.id)));
const childrenIDs = await Promise.all(monitorData.map(monitor => Monitor.getAllChildrenIDs(monitor.id)));
const activeStatuses = await Promise.all(monitorData.map(monitor => Monitor.isActive(monitor.id, monitor.active)));
const forceInactiveStatuses = await Promise.all(monitorData.map(monitor => Monitor.isParentActive(monitor.id)));
const paths = await Promise.all(monitorData.map(monitor => Monitor.getAllPath(monitor.id, monitor.name)));
notifications.forEach(row => {
if (!notificationsMap.has(row.monitor_id)) {
notificationsMap.set(row.monitor_id, {});
}
notificationsMap.get(row.monitor_id)[row.notification_id] = true;
});
tags.forEach(row => {
if (!tagsMap.has(row.monitor_id)) {
tagsMap.set(row.monitor_id, []);
}
tagsMap.get(row.monitor_id).push({
name: row.name,
color: row.color
});
});
monitorData.forEach((monitor, index) => {
maintenanceStatusMap.set(monitor.id, maintenanceStatuses[index]);
});
monitorData.forEach((monitor, index) => {
childrenIDsMap.set(monitor.id, childrenIDs[index]);
});
monitorData.forEach((monitor, index) => {
activeStatusMap.set(monitor.id, activeStatuses[index]);
});
monitorData.forEach((monitor, index) => {
forceInactiveMap.set(monitor.id, !forceInactiveStatuses[index]);
});
monitorData.forEach((monitor, index) => {
pathsMap.set(monitor.id, paths[index]);
});
}
return {
notifications: notificationsMap,
tags: tagsMap,
maintenanceStatus: maintenanceStatusMap,
childrenIDs: childrenIDsMap,
activeStatus: activeStatusMap,
forceInactive: forceInactiveMap,
paths: pathsMap,
};
}
/** /**
* Gets Parent of the monitor * Gets Parent of the monitor
* @param {number} monitorID ID of monitor to get * @param {number} monitorID ID of monitor to get
@ -1539,16 +1638,18 @@ class Monitor extends BeanModel {
/** /**
* Gets the full path * Gets the full path
* @param {number} monitorID ID of the monitor to get
* @param {string} name of the monitor to get
* @returns {Promise<string[]>} Full path (includes groups and the name) of the monitor * @returns {Promise<string[]>} Full path (includes groups and the name) of the monitor
*/ */
async getPath() { static async getAllPath(monitorID, name) {
const path = [ this.name ]; const path = [ name ];
if (this.parent === null) { if (this.parent === null) {
return path; return path;
} }
let parent = await Monitor.getParent(this.id); let parent = await Monitor.getParent(monitorID);
while (parent !== null) { while (parent !== null) {
path.unshift(parent.name); path.unshift(parent.name);
parent = await Monitor.getParent(parent.id); parent = await Monitor.getParent(parent.id);

@ -11,8 +11,13 @@ class ServerChan extends NotificationProvider {
async send(notification, msg, monitorJSON = null, heartbeatJSON = null) { async send(notification, msg, monitorJSON = null, heartbeatJSON = null) {
const okMsg = "Sent Successfully."; const okMsg = "Sent Successfully.";
// serverchan3 requires sending via ft07.com
const url = String(notification.serverChanSendKey).startsWith("sctp")
? `https://${notification.serverChanSendKey}.push.ft07.com/send`
: `https://sctapi.ftqq.com/${notification.serverChanSendKey}.send`;
try { try {
await axios.post(`https://sctapi.ftqq.com/${notification.serverChanSendKey}.send`, { await axios.post(url, {
"title": this.checkStatus(heartbeatJSON, monitorJSON), "title": this.checkStatus(heartbeatJSON, monitorJSON),
"desp": msg, "desp": msg,
}); });

@ -726,7 +726,7 @@ let needSetup = false;
await updateMonitorNotification(bean.id, notificationIDList); await updateMonitorNotification(bean.id, notificationIDList);
await server.sendMonitorList(socket); await server.sendUpdateMonitorIntoList(socket, bean.id);
if (monitor.active !== false) { if (monitor.active !== false) {
await startMonitor(socket.userID, bean.id); await startMonitor(socket.userID, bean.id);
@ -879,11 +879,11 @@ let needSetup = false;
await updateMonitorNotification(bean.id, monitor.notificationIDList); await updateMonitorNotification(bean.id, monitor.notificationIDList);
if (await bean.isActive()) { if (await Monitor.isActive(bean.id, bean.active)) {
await restartMonitor(socket.userID, bean.id); await restartMonitor(socket.userID, bean.id);
} }
await server.sendMonitorList(socket); await server.sendUpdateMonitorIntoList(socket, bean.id);
callback({ callback({
ok: true, ok: true,
@ -923,14 +923,17 @@ let needSetup = false;
log.info("monitor", `Get Monitor: ${monitorID} User ID: ${socket.userID}`); log.info("monitor", `Get Monitor: ${monitorID} User ID: ${socket.userID}`);
let bean = await R.findOne("monitor", " id = ? AND user_id = ? ", [ let monitor = await R.findOne("monitor", " id = ? AND user_id = ? ", [
monitorID, monitorID,
socket.userID, socket.userID,
]); ]);
const monitorData = [{ id: monitor.id,
active: monitor.active
}];
const preloadData = await Monitor.preparePreloadData(monitorData);
callback({ callback({
ok: true, ok: true,
monitor: await bean.toJSON(), monitor: monitor.toJSON(preloadData),
}); });
} catch (e) { } catch (e) {
@ -981,7 +984,7 @@ let needSetup = false;
try { try {
checkLogin(socket); checkLogin(socket);
await startMonitor(socket.userID, monitorID); await startMonitor(socket.userID, monitorID);
await server.sendMonitorList(socket); await server.sendUpdateMonitorIntoList(socket, monitorID);
callback({ callback({
ok: true, ok: true,
@ -1001,7 +1004,7 @@ let needSetup = false;
try { try {
checkLogin(socket); checkLogin(socket);
await pauseMonitor(socket.userID, monitorID); await pauseMonitor(socket.userID, monitorID);
await server.sendMonitorList(socket); await server.sendUpdateMonitorIntoList(socket, monitorID);
callback({ callback({
ok: true, ok: true,
@ -1047,8 +1050,7 @@ let needSetup = false;
msg: "successDeleted", msg: "successDeleted",
msgi18n: true, msgi18n: true,
}); });
await server.sendDeleteMonitorFromList(socket, monitorID);
await server.sendMonitorList(socket);
} catch (e) { } catch (e) {
callback({ callback({
@ -1678,13 +1680,13 @@ async function afterLogin(socket, user) {
await StatusPage.sendStatusPageList(io, socket); await StatusPage.sendStatusPageList(io, socket);
const monitorPromises = [];
for (let monitorID in monitorList) { for (let monitorID in monitorList) {
await sendHeartbeatList(socket, monitorID); monitorPromises.push(sendHeartbeatList(socket, monitorID));
monitorPromises.push(Monitor.sendStats(io, monitorID, user.id));
} }
for (let monitorID in monitorList) { await Promise.all(monitorPromises);
await Monitor.sendStats(io, monitorID, user.id);
}
// Set server timezone from client browser if not set // Set server timezone from client browser if not set
// It should be run once only // It should be run once only

@ -205,24 +205,56 @@ class UptimeKumaServer {
return list; return list;
} }
/**
* Update Monitor into list
* @param {Socket} socket Socket to send list on
* @param {number} monitorID update or deleted monitor id
* @returns {Promise<void>}
*/
async sendUpdateMonitorIntoList(socket, monitorID) {
let list = await this.getMonitorJSONList(socket.userID, monitorID);
this.io.to(socket.userID).emit("updateMonitorIntoList", list);
}
/**
* Delete Monitor from list
* @param {Socket} socket Socket to send list on
* @param {number} monitorID update or deleted monitor id
* @returns {Promise<void>}
*/
async sendDeleteMonitorFromList(socket, monitorID) {
this.io.to(socket.userID).emit("deleteMonitorFromList", monitorID);
}
/** /**
* Get a list of monitors for the given user. * Get a list of monitors for the given user.
* @param {string} userID - The ID of the user to get monitors for. * @param {string} userID - The ID of the user to get monitors for.
* @param {number} monitorID - The ID of monitor for.
* @returns {Promise<object>} A promise that resolves to an object with monitor IDs as keys and monitor objects as values. * @returns {Promise<object>} A promise that resolves to an object with monitor IDs as keys and monitor objects as values.
* *
* Generated by Trelent * Generated by Trelent
*/ */
async getMonitorJSONList(userID) { async getMonitorJSONList(userID, monitorID = null) {
let result = {};
let monitorList = await R.find("monitor", " user_id = ? ORDER BY weight DESC, name", [ let query = " user_id = ? ";
userID, let queryParams = [ userID ];
]);
for (let monitor of monitorList) { if (monitorID) {
result[monitor.id] = await monitor.toJSON(); query += "AND id = ? ";
queryParams.push(monitorID);
} }
let monitorList = await R.find("monitor", query + "ORDER BY weight DESC, name", queryParams);
const monitorData = monitorList.map(monitor => ({
id: monitor.id,
active: monitor.active,
name: monitor.name,
}));
const preloadData = await Monitor.preparePreloadData(monitorData);
const result = {};
monitorList.forEach(monitor => result[monitor.id] = monitor.toJSON(preloadData));
return result; return result;
} }
@ -520,3 +552,4 @@ const { DnsMonitorType } = require("./monitor-types/dns");
const { MqttMonitorType } = require("./monitor-types/mqtt"); const { MqttMonitorType } = require("./monitor-types/mqtt");
const { SNMPMonitorType } = require("./monitor-types/snmp"); const { SNMPMonitorType } = require("./monitor-types/snmp");
const { MongodbMonitorType } = require("./monitor-types/mongodb"); const { MongodbMonitorType } = require("./monitor-types/mongodb");
const Monitor = require("./model/monitor");

@ -32,7 +32,14 @@
<button class="btn btn-outline-info me-2" @click="shrinkDatabase"> <button class="btn btn-outline-info me-2" @click="shrinkDatabase">
{{ $t("Shrink Database") }} ({{ databaseSizeDisplay }}) {{ $t("Shrink Database") }} ({{ databaseSizeDisplay }})
</button> </button>
<div class="form-text mt-2 mb-4 ms-2">{{ $t("shrinkDatabaseDescription") }}</div> <i18n-t tag="div" keypath="shrinkDatabaseDescriptionSqlite" class="form-text mt-2 mb-4 ms-2">
<template #vacuum>
<code>VACUUM</code>
</template>
<template #auto_vacuum>
<code>AUTO_VACUUM</code>
</template>
</i18n-t>
</div> </div>
<button <button
id="clearAllStats-btn" id="clearAllStats-btn"

@ -388,7 +388,6 @@
"Discard": "تجاهل", "Discard": "تجاهل",
"Cancel": "يلغي", "Cancel": "يلغي",
"Powered by": "مشغل بواسطة", "Powered by": "مشغل بواسطة",
"shrinkDatabaseDescription": "تشغيل فراغ قاعدة البيانات لـ SQLite. إذا تم إنشاء قاعدة البيانات الخاصة بك بعد تمكين 1.10.0 AUTO_VACUUM بالفعل ولا يلزم هذا الإجراء.",
"serwersms": "Serwersms.pl", "serwersms": "Serwersms.pl",
"serwersmsAPIUser": "اسم مستخدم API (بما في ذلك بادئة WebAPI_)", "serwersmsAPIUser": "اسم مستخدم API (بما في ذلك بادئة WebAPI_)",
"serwersmsAPIPassword": "كلمة مرور API", "serwersmsAPIPassword": "كلمة مرور API",

@ -278,7 +278,6 @@
"Discard": "تجاهل", "Discard": "تجاهل",
"Cancel": "يلغي", "Cancel": "يلغي",
"Powered by": "مشغل بواسطة", "Powered by": "مشغل بواسطة",
"shrinkDatabaseDescription": "تشغيل فراغ قاعدة البيانات لـ SQLite. إذا تم إنشاء قاعدة البيانات الخاصة بك بعد تمكين 1.10.0 AUTO_VACUUM بالفعل ولا يلزم هذا الإجراء.",
"Customize": "يعدل أو يكيف", "Customize": "يعدل أو يكيف",
"Custom Footer": "تذييل مخصص", "Custom Footer": "تذييل مخصص",
"Custom CSS": "لغة تنسيق ويب حسب الطلب", "Custom CSS": "لغة تنسيق ويب حسب الطلب",

@ -931,5 +931,7 @@
"gtxMessagingFromHint": "На мабільных тэлефонах атрымальнікі бачаць АІПП як адпраўшчыка паведамлення. Дапускаецца выкарыстаньне да 11 літарна-лічбавых сімвалаў, шорткода, мясцовага доўгага кода або міжнародных нумароў ({e164}, {e212} або {e214})", "gtxMessagingFromHint": "На мабільных тэлефонах атрымальнікі бачаць АІПП як адпраўшчыка паведамлення. Дапускаецца выкарыстаньне да 11 літарна-лічбавых сімвалаў, шорткода, мясцовага доўгага кода або міжнародных нумароў ({e164}, {e212} або {e214})",
"Send to channel": "Адправіць у канал", "Send to channel": "Адправіць у канал",
"threadForumPostID": "Трэд / ID паста", "threadForumPostID": "Трэд / ID паста",
"whatHappensAtForumPost": "Стварыць новы пост на форуме. Гэта НЕ размяшчае паведамленні ў існуючым пасце. Для публікацыі ў існуючай публікацыі выкарыстоўвайце \"{option}\"" "whatHappensAtForumPost": "Стварыць новы пост на форуме. Гэта НЕ размяшчае паведамленні ў існуючым пасце. Для публікацыі ў існуючай публікацыі выкарыстоўвайце \"{option}\"",
"now": "зараз",
"-year": "-год"
} }

@ -312,7 +312,6 @@
"PasswordsDoNotMatch": "Паролите не съвпадат.", "PasswordsDoNotMatch": "Паролите не съвпадат.",
"Current User": "Текущ потребител", "Current User": "Текущ потребител",
"recent": "Скорошни", "recent": "Скорошни",
"shrinkDatabaseDescription": "Инициира \"VACUUM\" за \"SQLite\" база данни. Ако Вашата база данни е създадена след версия 1.10.0, \"AUTO_VACUUM\" функцията е активна и това действие не е нужно.",
"Done": "Готово", "Done": "Готово",
"Info": "Информация", "Info": "Информация",
"Security": "Сигурност", "Security": "Сигурност",
@ -990,5 +989,66 @@
"threemaRecipientTypeIdentityFormat": "8 знака", "threemaRecipientTypeIdentityFormat": "8 знака",
"threemaRecipientTypePhoneFormat": "E.164, без водещ +", "threemaRecipientTypePhoneFormat": "E.164, без водещ +",
"threemaBasicModeInfo": "Забележка: Тази интеграция използва Threema Gateway в основен режим (сървърно базирано криптиране). Допълнителни подробности можете да намерите {0}.", "threemaBasicModeInfo": "Забележка: Тази интеграция използва Threema Gateway в основен режим (сървърно базирано криптиране). Допълнителни подробности можете да намерите {0}.",
"apiKeysDisabledMsg": "API ключовете са деактивирани, защото удостоверяването е деактивирано." "apiKeysDisabledMsg": "API ключовете са деактивирани, защото удостоверяването е деактивирано.",
"jsonQueryDescription": "Анализира и извлича конкретни данни от JSON отговора на сървъра, използвайки JSON заявка или чрез \"$\" за необработения отговор, ако не очаква JSON. След това резултатът се сравнява с очакваната стойност като низове. Вижте {0} за документация и използвайте {1}, за да експериментирате със заявки.",
"starts with": "започва с",
"less than or equal to": "по-малко или равно на",
"now": "сега",
"time ago": "преди {0}",
"-year": "-година",
"Json Query Expression": "Json израз на заявка",
"and": "и",
"cacheBusterParam": "Добави параметъра {0}",
"cacheBusterParamDescription": "Произволно генериран параметър за пропускане на кешове.",
"Community String": "Общностен низ",
"snmpCommunityStringHelptext": "Този низ функционира като парола за удостоверяване и контрол на достъпа до устройства с активиран SNMP. Сравнете го с конфигурацията на вашето SNMP устройство.",
"OID (Object Identifier)": "OID (Идентификатор на обект)",
"snmpOIDHelptext": "Въведете OID за сензора или състоянието, които искате да мониторирате. Използвайте инструменти за управление на мрежата като MIB браузъри или SNMP софтуер, ако не сте сигурни за OID.",
"SNMP Version": "SNMP Версия",
"Please enter a valid OID.": "Моля, въведете валиден OID.",
"Host Onesender": "Onesender хост",
"Token Onesender": "Onesender токен",
"Recipient Type": "Тип получател",
"Private Number": "Частен номер",
"privateOnesenderDesc": "Уверете се, че телефонният номер е валиден. За да изпратите съобщение на личен телефонен номер, напр.: 628123456789",
"groupOnesenderDesc": "Уверете се, че GroupID е валиден. За да изпратите съобщение в група, напр.: 628123456789-342345",
"Group ID": "ID на групата",
"wayToGetOnesenderUrlandToken": "Можете да получите URL адреса и токена, като посетите уебсайта на Onesender. Повече информация {0}",
"Add Remote Browser": "Добави отдалечен браузър",
"New Group": "Нова група",
"Group Name": "Име на групата",
"OAuth2: Client Credentials": "OAuth2: Идентификационни данни на клиента",
"Condition": "Условие",
"Authentication Method": "Метод за удостоверяване",
"Authorization Header": "Хедър за оторизация",
"Form Data Body": "Тяло на формата за данни",
"OAuth Token URL": "URL адрес на OAuth токена",
"Client ID": "ID на клиента",
"Client Secret": "Тайна на клиента",
"OAuth Scope": "Обхват на OAuth",
"Optional: Space separated list of scopes": "По избор: разделен с интервал списък с обхвати",
"Go back to home page.": "Обратно към началната страница.",
"No tags found.": "Няма намерени етикети.",
"Lost connection to the socket server.": "Изгубена връзка със сокет сървъра.",
"Cannot connect to the socket server.": "Не може да се свърже със сокет сървъра.",
"SIGNL4": "SIGNL4",
"SIGNL4 Webhook URL": "SIGNL4 URL адрес на уеб кука",
"signl4Docs": "Повече информация относно конфигуриране на SIGNL4 и получаване на URL адрес за уеб кука SIGNL4 в {0}.",
"Conditions": "Условия",
"conditionAdd": "Добави условие",
"conditionDelete": "Изтрий условие",
"conditionAddGroup": "Добави група",
"conditionDeleteGroup": "Изтрий група",
"conditionValuePlaceholder": "Стойност",
"contains": "съдържа",
"equals": "равно на",
"not equals": "не е равно на",
"not contains": "не съдържа",
"not starts with": "не започва с",
"ends with": "завършва с",
"not ends with": "не завършва с",
"less than": "по-малко от",
"greater than": "по-голямо от",
"greater than or equal to": "по-голямо или равно на",
"record": "запис"
} }

@ -387,7 +387,6 @@
"Discard": "Zahodit", "Discard": "Zahodit",
"Cancel": "Zrušit", "Cancel": "Zrušit",
"Powered by": "Poskytuje", "Powered by": "Poskytuje",
"shrinkDatabaseDescription": "Pomocí této možnosti provedete příkaz VACUUM nad SQLite databází. Pokud byla databáze vytvořena po vydání verze 1.10.0, AUTO_VACUUM je již povolena a tato akce není vyžadována.",
"serwersms": "SerwerSMS.pl", "serwersms": "SerwerSMS.pl",
"serwersmsAPIUser": "API uživatelské jméno (včetně předpony webapi_)", "serwersmsAPIUser": "API uživatelské jméno (včetně předpony webapi_)",
"serwersmsAPIPassword": "API heslo", "serwersmsAPIPassword": "API heslo",
@ -989,5 +988,28 @@
"threemaRecipientTypeIdentityFormat": "8 znaků", "threemaRecipientTypeIdentityFormat": "8 znaků",
"threemaRecipientTypeIdentity": "Threema-ID", "threemaRecipientTypeIdentity": "Threema-ID",
"threemaRecipientTypePhone": "Telefonní číslo", "threemaRecipientTypePhone": "Telefonní číslo",
"wayToGetThreemaGateway": "Můžete se zaregistrovat do služby brány Threema {0}." "wayToGetThreemaGateway": "Můžete se zaregistrovat do služby brány Threema {0}.",
"privateOnesenderDesc": "Zkontrolujte, zda je telefonní číslo platné. Odeslání zprávy na soukromé telefonní číslo, např.: 628123456789",
"wayToGetOnesenderUrlandToken": "Adresu URL a token získáte na webových stránkách společnosti Onesender. Více informací {0}",
"now": "nyní",
"time ago": "před {0}",
"-year": "-rok",
"Json Query Expression": "Výraz dotazu JSON",
"and": "a",
"cacheBusterParam": "Přidání parametru {0}",
"cacheBusterParamDescription": "Náhodně generovaný parametr pro vynechání mezipaměti.",
"OID (Object Identifier)": "OID (identifikátor objektu)",
"Condition": "Stav",
"SNMP Version": "Verze SNMP",
"Please enter a valid OID.": "Zadejte prosím platný identifikátor OID.",
"Recipient Type": "Typ příjemce",
"Private Number": "Soukromé číslo",
"Group ID": "ID skupiny",
"Add Remote Browser": "Přidat vzdálený prohlížeč",
"New Group": "Nová skupina",
"Group Name": "Název skupiny",
"OAuth2: Client Credentials": "OAuth2: přihlašovací údaje klienta",
"Authentication Method": "Metoda ověřování",
"Authorization Header": "Hlavička autorizace",
"Form Data Body": "Tělo formuláře s daty"
} }

@ -345,7 +345,6 @@
"Discard": "Kassér", "Discard": "Kassér",
"Cancel": "Annullér", "Cancel": "Annullér",
"Powered by": "Drevet af", "Powered by": "Drevet af",
"shrinkDatabaseDescription": "Udfør database VACUUM for SQLite. Hvis din database er oprettet efter 1.10.0, er AUTO_VACUUM allerede aktiveret, og denne handling er ikke nødvendig.",
"serwersms": "SerwerSMS.pl", "serwersms": "SerwerSMS.pl",
"serwersmsAPIUser": "API Brugernavn (inkl. webapi_ prefix)", "serwersmsAPIUser": "API Brugernavn (inkl. webapi_ prefix)",
"serwersmsAPIPassword": "API Adgangskode", "serwersmsAPIPassword": "API Adgangskode",

@ -355,7 +355,6 @@
"Discard": "Verwerfen", "Discard": "Verwerfen",
"Cancel": "Abbrechen", "Cancel": "Abbrechen",
"Powered by": "Erstellt mit", "Powered by": "Erstellt mit",
"shrinkDatabaseDescription": "Löse VACUUM für die SQLite Datenbank aus. Wenn die Datenbank nach 1.10.0 erstellt wurde, ist AUTO_VACUUM bereits aktiviert und diese Aktion ist nicht erforderlich.",
"serwersms": "SerwerSMS.pl", "serwersms": "SerwerSMS.pl",
"serwersmsAPIUser": "API Benutzername (inkl. webapi_ prefix)", "serwersmsAPIUser": "API Benutzername (inkl. webapi_ prefix)",
"serwersmsAPIPassword": "API Passwort", "serwersmsAPIPassword": "API Passwort",
@ -987,5 +986,66 @@
"threemaRecipientTypeIdentityFormat": "8 Zeichen", "threemaRecipientTypeIdentityFormat": "8 Zeichen",
"threemaSenderIdentityFormat": "8 Zeichen, beginnt normalerweise mit *", "threemaSenderIdentityFormat": "8 Zeichen, beginnt normalerweise mit *",
"threemaBasicModeInfo": "Hinweis: Diese Integration verwendet Threema Gateway im Basismodus (serverbasierte Verschlüsselung). Weitere Details siehe {0}.", "threemaBasicModeInfo": "Hinweis: Diese Integration verwendet Threema Gateway im Basismodus (serverbasierte Verschlüsselung). Weitere Details siehe {0}.",
"apiKeysDisabledMsg": "API-Schlüssel sind deaktiviert, da die Authentifizierung deaktiviert ist." "apiKeysDisabledMsg": "API-Schlüssel sind deaktiviert, da die Authentifizierung deaktiviert ist.",
"Json Query Expression": "Json Query Ausdrck",
"Cannot connect to the socket server.": "Es kann keine Verbindung zum Socket-Server hergestellt werden.",
"not ends with": "endet nicht mit",
"signl4Docs": "Weitere Informationen zur Konfiguration von SIGNL4 und zum Abrufen der SIGNL4-Webhook-URL siehe {0}.",
"now": "jetzt",
"time ago": "vor {0}",
"-year": "-Jahr",
"and": "und",
"jsonQueryDescription": "Parsen und Extrahieren spezifischer Daten aus der JSON-Antwort des Servers mittels JSON-Abfrage oder Verwendung von \"$\" für die rohe Antwort, wenn kein JSON erwartet wird. Das Ergebnis wird dann mit dem erwarteten Wert in Form von Strings verglichen. Siehe {0} für die Dokumentation und verwende {1}, um mit Abfragen zu experimentieren.",
"cacheBusterParamDescription": "Zufällig generierter Parameter um den Cache zu umgehen.",
"cacheBusterParam": "Den Parameter {0} hinzufügen",
"Community String": "Gemeinschaftliche Zeichenkette",
"snmpCommunityStringHelptext": "Diese Zeichenfolge dient als Passwort zur Authentifizierung und Kontrolle des Zugriffs auf SNMP-fähigen Geräten. Pass sie an die Konfiguration des SNMP-Geräts an.",
"OID (Object Identifier)": "OID (Objekt-Identifikator)",
"Condition": "Bedingung",
"SNMP Version": "SNMP Version",
"Please enter a valid OID.": "Gib eine gültige OID ein.",
"Host Onesender": "Host Onesender",
"Token Onesender": "Token Onesender",
"Recipient Type": "Empfänger Typ",
"Private Number": "Private Nummer",
"Group ID": "Gruppen ID",
"wayToGetOnesenderUrlandToken": "Du kannst die URL und den Token auf der Onesender-Website erhalten. Weitere Infos {0}",
"Add Remote Browser": "Remote-Browser hinzufügen",
"New Group": "Neue Gruppe",
"Group Name": "Gruppenname",
"OAuth2: Client Credentials": "OAuth2: Client-Anmeldeinformationen",
"snmpOIDHelptext": "Gib die OID für den zu überwachenden Sensor oder Status ein. Verwende Netzwerkverwaltungstools wie MIB-Browser oder SNMP-Software, wenn du bezüglich OID unsicher bist.",
"privateOnesenderDesc": "Stell sicher, dass die Telefonnummer gültig ist. Um Nachrichten an private Telefonnummer zu senden, z. B.: 628123456789",
"groupOnesenderDesc": "Stell sicher, dass die GroupID gültig ist. Um Nachricht an die Gruppe zu senden, z.B.: 628123456789-342345",
"Authentication Method": "Authentifizierungsmethode",
"Authorization Header": "Autorisierungs-Header",
"Form Data Body": "Formular 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: Durch Leerzeichen getrennte Liste der Scopes",
"Go back to home page.": "Zurück zur Startseite.",
"No tags found.": "Keine Tags gefunden.",
"Lost connection to the socket server.": "Verbindung zum Socket-Server verloren.",
"SIGNL4": "SIGNL4",
"SIGNL4 Webhook URL": "SIGNL4 Webhook URL",
"Conditions": "Bedingungen",
"conditionAdd": "Bedingung hinzufügen",
"conditionDelete": "Bedingung löschen",
"conditionAddGroup": "Gruppe hinzufügen",
"conditionDeleteGroup": "Gruppe löschen",
"conditionValuePlaceholder": "Wert",
"equals": "ist gleich",
"not equals": "ist nicht gleich",
"contains": "enthält",
"not contains": "enthält nicht",
"starts with": "beginnt mit",
"not starts with": "beginnt nicht mit",
"ends with": "endet mit",
"less than": "weniger als",
"greater than": "mehr als",
"less than or equal to": "kleiner als oder gleich",
"greater than or equal to": "grösser als oder gleich",
"record": "Eintrag"
} }

@ -355,7 +355,6 @@
"Discard": "Verwerfen", "Discard": "Verwerfen",
"Cancel": "Abbrechen", "Cancel": "Abbrechen",
"Powered by": "Erstellt mit", "Powered by": "Erstellt mit",
"shrinkDatabaseDescription": "Löse VACUUM für die SQLite Datenbank aus. Wenn die Datenbank nach 1.10.0 erstellt wurde, ist AUTO_VACUUM bereits aktiviert und diese Aktion ist nicht erforderlich.",
"serwersms": "SerwerSMS.pl", "serwersms": "SerwerSMS.pl",
"serwersmsAPIUser": "API Benutzername (inkl. webapi_ prefix)", "serwersmsAPIUser": "API Benutzername (inkl. webapi_ prefix)",
"serwersmsAPIPassword": "API Passwort", "serwersmsAPIPassword": "API Passwort",
@ -990,5 +989,66 @@
"threemaRecipientTypeIdentityFormat": "8 Zeichen", "threemaRecipientTypeIdentityFormat": "8 Zeichen",
"threemaSenderIdentityFormat": "8 Zeichen, beginnt normalerweise mit *", "threemaSenderIdentityFormat": "8 Zeichen, beginnt normalerweise mit *",
"threemaBasicModeInfo": "Hinweis: Diese Integration verwendet Threema Gateway im Basismodus (serverbasierte Verschlüsselung). Weitere Details siehe {0}.", "threemaBasicModeInfo": "Hinweis: Diese Integration verwendet Threema Gateway im Basismodus (serverbasierte Verschlüsselung). Weitere Details siehe {0}.",
"apiKeysDisabledMsg": "API-Schlüssel sind deaktiviert, da die Authentifizierung deaktiviert ist." "apiKeysDisabledMsg": "API-Schlüssel sind deaktiviert, da die Authentifizierung deaktiviert ist.",
"wayToGetOnesenderUrlandToken": "Du kannst die URL und den Token auf der Onesender-Website erhalten. Weitere Infos {0}",
"Lost connection to the socket server.": "Verbindung zum Socket-Server verloren.",
"conditionDeleteGroup": "Gruppe löschen",
"greater than": "mehr als",
"snmpOIDHelptext": "Gib die OID für den zu überwachenden Sensor oder Status ein. Verwende Netzwerkverwaltungstools wie MIB-Browser oder SNMP-Software, wenn du bezüglich OID unsicher bist.",
"signl4Docs": "Weitere Informationen zur Konfiguration von SIGNL4 und zum Abrufen der SIGNL4-Webhook-URL siehe {0}.",
"now": "jetzt",
"time ago": "vor {0}",
"Json Query Expression": "Json Query Ausdrck",
"-year": "-Jahr",
"and": "und",
"jsonQueryDescription": "Parsen und Extrahieren spezifischer Daten aus der JSON-Antwort des Servers mittels JSON-Abfrage oder Verwendung von \"$\" für die rohe Antwort, wenn kein JSON erwartet wird. Das Ergebnis wird dann mit dem erwarteten Wert in Form von Strings verglichen. Siehe {0} für die Dokumentation und verwende {1}, um mit Abfragen zu experimentieren.",
"cacheBusterParamDescription": "Zufällig generierter Parameter um den Cache zu umgehen.",
"cacheBusterParam": "Den Parameter {0} hinzufügen",
"Community String": "Gemeinschaftliche Zeichenkette",
"snmpCommunityStringHelptext": "Diese Zeichenfolge dient als Passwort zur Authentifizierung und Kontrolle des Zugriffs auf SNMP-fähigen Geräten. Pass sie an die Konfiguration des SNMP-Geräts an.",
"OID (Object Identifier)": "OID (Objekt-Identifikator)",
"Condition": "Bedingung",
"SNMP Version": "SNMP Version",
"Please enter a valid OID.": "Gib eine gültige OID ein.",
"Host Onesender": "Host Onesender",
"Token Onesender": "Token Onesender",
"Recipient Type": "Empfänger Typ",
"Private Number": "Private Nummer",
"Group ID": "Gruppen ID",
"privateOnesenderDesc": "Stell sicher, dass die Telefonnummer gültig ist. Um Nachrichten an private Telefonnummer zu senden, z. B.: 628123456789",
"groupOnesenderDesc": "Stell sicher, dass die GroupID gültig ist. Um Nachricht an die Gruppe zu senden, z.B.: 628123456789-342345",
"Add Remote Browser": "Remote-Browser hinzufügen",
"New Group": "Neue Gruppe",
"Group Name": "Gruppenname",
"OAuth2: Client Credentials": "OAuth2: Client-Anmeldeinformationen",
"Authentication Method": "Authentifizierungsmethode",
"Authorization Header": "Autorisierungs-Header",
"Form Data Body": "Formular 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: Durch Leerzeichen getrennte Liste der Scopes",
"Go back to home page.": "Zurück zur Startseite.",
"No tags found.": "Keine Tags gefunden.",
"Cannot connect to the socket server.": "Es kann keine Verbindung zum Socket-Server hergestellt werden.",
"SIGNL4": "SIGNL4",
"SIGNL4 Webhook URL": "SIGNL4 Webhook URL",
"Conditions": "Bedingungen",
"conditionAdd": "Bedingung hinzufügen",
"conditionDelete": "Bedingung löschen",
"conditionAddGroup": "Gruppe hinzufügen",
"conditionValuePlaceholder": "Wert",
"equals": "ist gleich",
"not equals": "ist nicht gleich",
"contains": "enthält",
"not contains": "enthält nicht",
"starts with": "beginnt mit",
"not starts with": "beginnt nicht mit",
"ends with": "endet mit",
"not ends with": "endet nicht mit",
"less than": "weniger als",
"less than or equal to": "kleiner als oder gleich",
"greater than or equal to": "größer als oder gleich",
"record": "Eintrag"
} }

@ -363,7 +363,6 @@
"Discard": "Απορρίψει", "Discard": "Απορρίψει",
"Cancel": "Ακυρο", "Cancel": "Ακυρο",
"Powered by": "Με την υποστήριξη του", "Powered by": "Με την υποστήριξη του",
"shrinkDatabaseDescription": "Ενεργοποίηση βάσης δεδομένων VACUUM για SQLite. Εάν η βάση δεδομένων σας έχει δημιουργηθεί μετά την έκδοση 1.10.0, το AUTO_VACUUM είναι ήδη ενεργοποιημένο και αυτή η ενέργεια δεν χρειάζεται.",
"serwersms": "SerwerSMS.pl", "serwersms": "SerwerSMS.pl",
"serwersmsAPIUser": "API Username (incl. webapi_ prefix)", "serwersmsAPIUser": "API Username (incl. webapi_ prefix)",
"serwersmsAPIPassword": "API κωδικός πρόσβασης", "serwersmsAPIPassword": "API κωδικός πρόσβασης",

@ -82,6 +82,7 @@
"resendEveryXTimes": "Resend every {0} times", "resendEveryXTimes": "Resend every {0} times",
"resendDisabled": "Resend disabled", "resendDisabled": "Resend disabled",
"retriesDescription": "Maximum retries before the service is marked as down and a notification is sent", "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", "ignoreTLSError": "Ignore TLS/SSL errors for HTTPS websites",
"ignoreTLSErrorGeneral": "Ignore TLS/SSL error for connection", "ignoreTLSErrorGeneral": "Ignore TLS/SSL error for connection",
"upsideDownModeDescription": "Flip the status upside down. If the service is reachable, it is DOWN.", "upsideDownModeDescription": "Flip the status upside down. If the service is reachable, it is DOWN.",
@ -96,6 +97,8 @@
"pushOthers": "Others", "pushOthers": "Others",
"programmingLanguages": "Programming Languages", "programmingLanguages": "Programming Languages",
"Save": "Save", "Save": "Save",
"Debug": "Debug",
"Copy": "Copy",
"Notifications": "Notifications", "Notifications": "Notifications",
"Not available, please setup.": "Not available, please set up.", "Not available, please setup.": "Not available, please set up.",
"Setup Notification": "Set Up Notification", "Setup Notification": "Set Up Notification",
@ -248,6 +251,14 @@
"PushUrl": "Push URL", "PushUrl": "Push URL",
"HeadersInvalidFormat": "The request headers are not valid JSON: ", "HeadersInvalidFormat": "The request headers are not valid JSON: ",
"BodyInvalidFormat": "The request body is not valid JSON: ", "BodyInvalidFormat": "The request body is not valid JSON: ",
"CopyToClipboardError": "Couldn't copy to clipbard: {error}",
"CopyToClipboardSuccess": "Copied!",
"CurlDebugInfo": "To debug the monitor, you can either paste this into your own machines terminal or into the machines terminal which uptime kuma is running on and see what you are requesting.{newiline}Please be aware of networking differences like {firewalls}, {dns_resolvers} or {docker_networks}.",
"firewalls": "firewalls",
"dns resolvers": "dns resolvers",
"docker networks": "docker networks",
"CurlDebugInfoOAuth2CCUnsupported": "Full oauth client credential flow is not supported in {curl}.{newline}Please get a bearer token and pass it via the {oauth2_bearer} option.",
"CurlDebugInfoProxiesUnsupported": "Proxy support in the above {curl} command is currently not implemented.",
"Monitor History": "Monitor History", "Monitor History": "Monitor History",
"clearDataOlderThan": "Keep monitor history data for {0} days.", "clearDataOlderThan": "Keep monitor history data for {0} days.",
"PasswordsDoNotMatch": "Passwords do not match.", "PasswordsDoNotMatch": "Passwords do not match.",
@ -266,6 +277,7 @@
"Security": "Security", "Security": "Security",
"Steam API Key": "Steam API Key", "Steam API Key": "Steam API Key",
"Shrink Database": "Shrink Database", "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…", "Pick a RR-Type...": "Pick a RR-Type…",
"Pick Accepted Status Codes...": "Pick Accepted Status Codes…", "Pick Accepted Status Codes...": "Pick Accepted Status Codes…",
"Default": "Default", "Default": "Default",
@ -302,7 +314,6 @@
"selectedMonitorCount": "Selected: {0}", "selectedMonitorCount": "Selected: {0}",
"Check/Uncheck": "Check/Uncheck", "Check/Uncheck": "Check/Uncheck",
"Powered by": "Powered by", "Powered by": "Powered by",
"shrinkDatabaseDescription": "Trigger database VACUUM for SQLite. If your database is created after 1.10.0, AUTO_VACUUM is already enabled and this action is not needed.",
"Customize": "Customize", "Customize": "Customize",
"Custom Footer": "Custom Footer", "Custom Footer": "Custom Footer",
"Custom CSS": "Custom CSS", "Custom CSS": "Custom CSS",
@ -976,7 +987,7 @@
"privateOnesenderDesc": "Make sure the number phone is valid. To send message into private number phone, ex: 628123456789", "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", "groupOnesenderDesc": "Make sure the GroupID is valid. To send message into Group, ex: 628123456789-342345",
"Group ID": "Group ID", "Group ID": "Group ID",
"wayToGetOnesenderUrlandToken":"You can get the URL and Token by going to the Onesender website. More info {0}", "wayToGetOnesenderUrlandToken": "You can get the URL and Token by going to the Onesender website. More info {0}",
"Add Remote Browser": "Add Remote Browser", "Add Remote Browser": "Add Remote Browser",
"New Group": "New Group", "New Group": "New Group",
"Group Name": "Group Name", "Group Name": "Group Name",

@ -396,7 +396,6 @@
"successMessage": "Mensaje de éxito", "successMessage": "Mensaje de éxito",
"Pick Accepted Status Codes...": "Seleccione Códigos de Estado Aceptados…", "Pick Accepted Status Codes...": "Seleccione Códigos de Estado Aceptados…",
"Post": "Post", "Post": "Post",
"shrinkDatabaseDescription": "Activar VACUUM para SQLite. Si tu base de datos fue creada después 1.10.0, AUTO_VACUUM ya está habilitada y esta acción no es necesaria.",
"deleteStatusPageMsg": "¿Estas seguro que quieres eliminar esta página de estado?", "deleteStatusPageMsg": "¿Estas seguro que quieres eliminar esta página de estado?",
"default": "Predeterminado", "default": "Predeterminado",
"enabled": "Habilitado", "enabled": "Habilitado",

@ -360,7 +360,6 @@
"Discard": "Baztertu", "Discard": "Baztertu",
"Cancel": "Ezeztatu", "Cancel": "Ezeztatu",
"Powered by": "Honekin egina:", "Powered by": "Honekin egina:",
"shrinkDatabaseDescription": "Trigger database VACUUM for SQLite. If your database is created after 1.10.0, AUTO_VACUUM is already enabled and this action is not needed.",
"serwersms": "SerwerSMS.pl", "serwersms": "SerwerSMS.pl",
"serwersmsAPIUser": "API erabiltzailea (webapi_ aurre-hizkia barne)", "serwersmsAPIUser": "API erabiltzailea (webapi_ aurre-hizkia barne)",
"serwersmsAPIPassword": "API pasahitza", "serwersmsAPIPassword": "API pasahitza",

@ -335,7 +335,6 @@
"About": "درباره آپ‌تایم کوما", "About": "درباره آپ‌تایم کوما",
"wayToGetCloudflaredURL": "(دریافت Cloudflared از {0})", "wayToGetCloudflaredURL": "(دریافت Cloudflared از {0})",
"cloudflareWebsite": "وب سایت کلادفلر", "cloudflareWebsite": "وب سایت کلادفلر",
"shrinkDatabaseDescription": "تریگر VACUUM برای SQLite. اگر دیتابیس شما بعد از 1.10.0 ایجاد شده باشد، AUTO_VACUUM قبلاً فعال شده است و لازم نیست این عمل انجام شود. (Trigger database VACUUM for SQLite. If your database is created after 1.10.0, AUTO_VACUUM is already enabled and this action is not needed.).",
"Message:": "پیام:", "Message:": "پیام:",
"HTTP Headers": "هدر های HTTP", "HTTP Headers": "هدر های HTTP",
"Bot Token": "توکن بات", "Bot Token": "توکن بات",
@ -960,5 +959,66 @@
"From Phone Number / Transmission Path Originating Address (TPOA)": "از شماره تلفن / آدرس مبدأ مسیر انتقال (TPOA)", "From Phone Number / Transmission Path Originating Address (TPOA)": "از شماره تلفن / آدرس مبدأ مسیر انتقال (TPOA)",
"Alphanumeric (recommended)": "الفبا و اعداد (پیشنهاد شده)", "Alphanumeric (recommended)": "الفبا و اعداد (پیشنهاد شده)",
"Telephone number": "شماره تلفن", "Telephone number": "شماره تلفن",
"cellsyntOriginatortypeAlphanumeric": "الفبا و اعداد (حداکثر 11 کاراکتر). گیرندگان نمی توانند به پیام پاسخ دهند." "cellsyntOriginatortypeAlphanumeric": "الفبا و اعداد (حداکثر 11 کاراکتر). گیرندگان نمی توانند به پیام پاسخ دهند.",
"cacheBusterParam": "افزودن پارامتر {0}",
"Private Number": "شماره شخصی",
"jsonQueryDescription": "با استفاده از JSON query پاسخ JSON سرور را تحلیل و استخراج کنید یا از «$» برای پاسخ خام استفاده کنید، در صورتی که JSON نباشد. سپس نتیجه با مقدار مورد نظر به عنوان رشته مقایسه می‌شود. برای مستندات به {0} بروید و از {1} برای آزمایش کوئری‌ها استفاده کنید.",
"now": "الان",
"-year": "-سال",
"time ago": "{0} پیش",
"and": "و",
"Condition": "شرط",
"SNMP Version": "نسخه SNMP",
"privateOnesenderDesc": "مطمئن شوید که شماره تلفن درست است. برای ارسال پیام به شماره شخصی، مثل: 09123456789",
"Group ID": "شناسه گروه",
"Add Remote Browser": "افزودن مرورگر ریموت",
"New Group": "گروه جدید",
"Group Name": "نام گروه",
"Authentication Method": "روش احراز هویت",
"Client ID": "شناسه کلاینت",
"Client Secret": "رمز کلاینت",
"Go back to home page.": "بازگشت به صفحه اصلی.",
"No tags found.": "برچسبی یافت نشد.",
"Lost connection to the socket server.": "اتصال به سوکت سرور از دست رفت.",
"Cannot connect to the socket server.": "نمی‌توان به سوکت سرور متصل شد.",
"SIGNL4": "SIGNL4",
"SIGNL4 Webhook URL": "پیوند وب‌هوک SIGNL4",
"Conditions": "شرایط",
"conditionAdd": "افزودن شرط",
"conditionDelete": "حذف شرط",
"conditionAddGroup": "افزودن گروه",
"conditionDeleteGroup": "حذف گروه",
"conditionValuePlaceholder": "مقدار",
"equals": "برابر",
"not equals": "نابرابر",
"contains": "شامل",
"starts with": "شروع با",
"not starts with": "عدم شروع با",
"not contains": "شامل نباشد",
"ends with": "پایان با",
"not ends with": "عدم پایان با",
"less than": "کمتر از",
"greater than": "بیشتر از",
"less than or equal to": "کمتر یا مساوی با",
"greater than or equal to": "بیشتر یا مساوی با",
"record": "رکورد",
"snmpCommunityStringHelptext": "این رشته به عنوان پسورد برای احراز هویت و کنترل دسترسی به دستگاه‌های آماده SNMP استفاده می‌شود. این پسورد را با توجه به تنظیمات دستگاه SNMP خود مطابقت دهید.",
"snmpOIDHelptext": "OID برای سنسور یا وضعیتی که می‌خواهید مانیتور کنید را وارد کنید. اگر درباره مقدار OID اطمینان ندارید از ابزارهای مدیریت شبکه‌ای مانند MIB یا SNMP استفاده کنید.",
"Json Query Expression": "عبارت کوئری JSON",
"cacheBusterParamDescription": "پارامتر تولید شده رندوم برای رد کردن کش.",
"Community String": "رشته انجمن",
"OID (Object Identifier)": "OID (شناسه شئ)",
"Please enter a valid OID.": "لطفا یک OID معتبر وارد کنید.",
"Host Onesender": "هاست Onesender",
"Token Onesender": "توکن Onesender",
"Recipient Type": "نوع دریافت کننده",
"groupOnesenderDesc": "از معتبر بودن GroupID اطمینان حاصل کنید. برای ارسال پیام در گروه، برای مثال: 628123456789-342345",
"wayToGetOnesenderUrlandToken": "برای دریافت URL و توکن می‌توانید به وبسایت Onesender مراجعه گنید. اطلاعات بیشتر {0}",
"OAuth2: Client Credentials": "OAuth2: گواهی مشتری",
"Authorization Header": "هدر Authorization",
"Form Data Body": "از اطلاعات بدنه",
"OAuth Token URL": "URL توکن OAuth",
"OAuth Scope": "اسکوپ OAuth",
"Optional: Space separated list of scopes": "اختیاری: لیست جدا شده با فاصله از اسکوپ‌ها",
"signl4Docs": "شما می‌توانید اطلاعات بیشتر در رابطه با نحوه تنظیم SIGNL4 و به دست آوردن URL وب‌هوک SIGNL4 را در {0} پیدا کنید."
} }

@ -640,7 +640,6 @@
"light": "vaalea", "light": "vaalea",
"Switch to Light Theme": "Vaihda vaaleaan teemaan", "Switch to Light Theme": "Vaihda vaaleaan teemaan",
"Powered by": "Voimanlähteenä", "Powered by": "Voimanlähteenä",
"shrinkDatabaseDescription": "Käynnistä tietokannan VACUUM SQLitelle. Jos tietokanta on luotu 1.10.0:n jälkeen, AUTO_VACUUM on jo käytössä eikä tätä toimintoa tarvita.",
"Accept characters:": "Hyväksy merkit:", "Accept characters:": "Hyväksy merkit:",
"New Status Page": "Uusi tilasivu", "New Status Page": "Uusi tilasivu",
"wayToGetCloudflaredURL": "(Lataa cloudflared osoitteesta {0})", "wayToGetCloudflaredURL": "(Lataa cloudflared osoitteesta {0})",
@ -988,5 +987,66 @@
"threemaRecipientTypeIdentity": "Threema-tunnus (Threema-ID)", "threemaRecipientTypeIdentity": "Threema-tunnus (Threema-ID)",
"threemaSenderIdentityFormat": "8 merkkiä, alkaa useimmiten merkillä *", "threemaSenderIdentityFormat": "8 merkkiä, alkaa useimmiten merkillä *",
"threemaBasicModeInfo": "Huomio: Tämä integraatio käyttää Threema Gateway:tä perustilassa (palvelinpohjainen salaus). Lisätietoja löytyy {0}.", "threemaBasicModeInfo": "Huomio: Tämä integraatio käyttää Threema Gateway:tä perustilassa (palvelinpohjainen salaus). Lisätietoja löytyy {0}.",
"apiKeysDisabledMsg": "API-avaimet eivät ole käytössä koska tunnistautuminen ei ole käytössä." "apiKeysDisabledMsg": "API-avaimet eivät ole käytössä koska tunnistautuminen ei ole käytössä.",
"snmpCommunityStringHelptext": "Tämä merkkijono toimii salasanana ja pääsyoikeutena SNMP-laitteisiin. Aseta se samaksi kuin SNMP-laitteen asetuksissa.",
"privateOnesenderDesc": "Varmista, että puhelinnumero on kelvollinen. Lähettääksesi viestin yksityiseen numeroon esim. 628123456789",
"Authorization Header": "Tunnistautumisen otsikko (Authorization Header)",
"Optional: Space separated list of scopes": "Valinnainen: Luettelo näkyvyysalueista (scope) välilyönnillä erotettuna",
"jsonQueryDescription": "Valitse sisältö palvelimen JSON-vastauksesta käyttämällä JSON-kyselyä tai käytä alkuperäistä sisältöä merkillä \"$\", jos palvelimen vastaus ei ole JSON-muodossa. Tämän jälkeen sisältöä verrataan odotettuun arvoon (merkkijonona). Katso kyselykielen ohjeita osoitteesta {0}. Leikkikenttä löytyy osoitteesta {1}.",
"now": "nyt",
"time ago": "{0} sitten",
"-year": "-vuosi",
"Json Query Expression": "Json-kyselylauseke",
"and": "ja",
"cacheBusterParam": "Lisää parametri {0}",
"cacheBusterParamDescription": "Satunnaisesti luotu parametri välimuistien ohittamiseksi.",
"Community String": "Yhteisömerkkijono",
"OID (Object Identifier)": "OID (Objektin tunniste)",
"snmpOIDHelptext": "Syötä OID anturille tai tilalle jota haluat valvoa. Käytä verkonvalvontatyökaluja kuten MIB-selaimia tai SNMP-ohjelmistoja jos olet epävarma OID:n valinnasta.",
"Condition": "Ehto",
"SNMP Version": "SNMP-versio",
"Please enter a valid OID.": "Ole hyvä ja syötä kelvollinen OID.",
"Host Onesender": "OneSender-isäntä",
"Token Onesender": "OneSender-tokeni",
"Recipient Type": "Vastaanottajan tyyppi",
"Private Number": "Yksityinen numero",
"Group ID": "Ryhmän tunnus (Group ID)",
"groupOnesenderDesc": "Varmista, että ryhmän tunnus (Group ID) on kelvollinen. Lähettääksesi viestin ryhmälle, esim. 628123456789-342345",
"wayToGetOnesenderUrlandToken": "Saat URL-osoitteen ja tokenin vierailemalla OneSenderin verkkosivulla. Lisätietoja osoitteesta {0}",
"Add Remote Browser": "Lisää etäselain",
"New Group": "Uusi ryhmä",
"Group Name": "Ryhmän nimi",
"OAuth2: Client Credentials": "OAuth2: Asiakkaan tunnukset",
"Authentication Method": "Tunnistustapa",
"Form Data Body": "Lomakkeen tietosisältö (Form data body)",
"OAuth Token URL": "OAuth tokenin URL",
"Client ID": "Asiakkaan ID",
"Client Secret": "Asiakkaan salaisuus",
"OAuth Scope": "OAuth-näkyvyysalue (scope)",
"Go back to home page.": "Palaa etusivulle.",
"No tags found.": "Tunnisteita ei löytynyt.",
"Lost connection to the socket server.": "Menetettiin yhteys Socket-palvelimeen.",
"Cannot connect to the socket server.": "Socket-palvelimeen ei voi yhdistää.",
"SIGNL4": "SIGNL4",
"SIGNL4 Webhook URL": "SIGNL4 Webhookin URL",
"signl4Docs": "Löydät lisätietoja SIGNL4-asetuksista ja webhook URLin hankinnasta osoitteesta {0}.",
"Conditions": "Ehdot",
"conditionAdd": "Lisää ehto",
"conditionDelete": "Poista ehto",
"conditionAddGroup": "Lisää ryhmä",
"conditionDeleteGroup": "Poista ryhmä",
"conditionValuePlaceholder": "Arvo",
"contains": "sisältää",
"not contains": "ei sisällä",
"not equals": "ei yhtä suuri kuin",
"equals": "yhtä suuri kuin",
"starts with": "alkaa",
"not starts with": "ei ala",
"ends with": "päättyy",
"not ends with": "ei pääty",
"less than": "vähemmän kuin",
"greater than": "enemmän kuin",
"less than or equal to": "vähemmän tai yhtä paljon kuin",
"greater than or equal to": "enemmän tai yhtä paljon kuin",
"record": "tietue"
} }

@ -384,7 +384,6 @@
"Discard": "Abandonner", "Discard": "Abandonner",
"Cancel": "Annuler", "Cancel": "Annuler",
"Powered by": "Propulsé par", "Powered by": "Propulsé par",
"shrinkDatabaseDescription": "Déclenche la commande VACUUM pour SQLite. Si votre base de données a été créée après la version 1.10.0, AUTO_VACUUM est déjà activé et cette action n'est pas nécessaire.",
"serwersms": "SerwerSMS.pl", "serwersms": "SerwerSMS.pl",
"serwersmsAPIUser": "Nom d'utilisateur de l'API (incl. webapi_ prefix)", "serwersmsAPIUser": "Nom d'utilisateur de l'API (incl. webapi_ prefix)",
"serwersmsAPIPassword": "Mot de passe API", "serwersmsAPIPassword": "Mot de passe API",
@ -990,5 +989,66 @@
"threemaApiAuthenticationSecret": "Secret de l'identifiant de la passerelle", "threemaApiAuthenticationSecret": "Secret de l'identifiant de la passerelle",
"wayToGetThreemaGateway": "Vous pouvez vous inscrire à Threema Gateway {0}.", "wayToGetThreemaGateway": "Vous pouvez vous inscrire à Threema Gateway {0}.",
"threemaBasicModeInfo": "Note : Cette intégration utilise Threema Gateway en mode basique (chiffrement basé sur le serveur). Vous pouvez trouver plus de détails {0}.", "threemaBasicModeInfo": "Note : Cette intégration utilise Threema Gateway en mode basique (chiffrement basé sur le serveur). Vous pouvez trouver plus de détails {0}.",
"apiKeysDisabledMsg": "Les clés API sont désactivées car l'authentification est désactivée." "apiKeysDisabledMsg": "Les clés API sont désactivées car l'authentification est désactivée.",
"cacheBusterParam": "Ajoutez le paramètre {0}",
"snmpCommunityStringHelptext": "Cette chaîne fonctionne comme un mot de passe pour authentifier et contrôler l'accès aux appareils compatibles SNMP. Faites-le correspondre à la configuration de votre périphérique SNMP.",
"privateOnesenderDesc": "Assurez-vous que le numéro de téléphone est valide. Pour envoyer un message vers un numéro de téléphone privé, ex : 628123456789",
"groupOnesenderDesc": "Assurez-vous que le GroupID est valide. Pour envoyer un message dans le groupe, ex: 628123456789-342345",
"Optional: Space separated list of scopes": "Facultatif : liste des étendues séparées par des espaces",
"jsonQueryDescription": "Analyser et extraire des données spécifiques de la réponse JSON du serveur en utilisant une requête JSON ou utiliser « $ » pour la réponse brute, si un JSON n'est pas attendu. Le résultat est ensuite comparé à la valeur attendue, en tant que chaînes de caractères. Consultez {0} pour la documentation et utilisez {1} pour expérimenter avec des requêtes.",
"now": "Maintenant",
"time ago": "il y a {0}",
"-year": "-année",
"Json Query Expression": "Expression de requête JSON",
"and": "et",
"cacheBusterParamDescription": "Paramètre généré aléatoirement pour ignorer les caches.",
"Community String": "Chaîne de communauté",
"OID (Object Identifier)": "OID (identifiant d'objet)",
"snmpOIDHelptext": "Entrez l'OID du capteur ou de l'état que vous souhaitez surveiller. Utilisez des outils de gestion de réseau tels que les navigateurs MIB ou le logiciel SNMP si vous n'êtes pas sûr de l'OID.",
"Condition": "Condition",
"SNMP Version": "Version SNMP",
"Please enter a valid OID.": "Veuillez saisir un OID valide.",
"Host Onesender": "Héberger un expéditeur",
"Token Onesender": "Jeton Onesender",
"Recipient Type": "Type de destinataire",
"Private Number": "Numéro privé",
"Group ID": "Identifiant du groupe",
"wayToGetOnesenderUrlandToken": "Vous pouvez obtenir l'URL et le jeton en accédant au site Web Onesender. Plus d'informations {0}",
"Add Remote Browser": "Ajouter un navigateur distant",
"New Group": "Nouveau groupe",
"Group Name": "Nom du groupe",
"OAuth2: Client Credentials": "OAuth2 : informations d'identification du client",
"Authentication Method": "Méthode d'authentification",
"Authorization Header": "En-tête d'autorisation",
"Form Data Body": "Corps des données du formulaire",
"OAuth Token URL": "URL du jeton OAuth",
"Client ID": "Identifiant client",
"Client Secret": "Secret client",
"OAuth Scope": "Portée OAuth",
"Go back to home page.": "Retournez à la page d'accueil.",
"No tags found.": "Aucune étiquettes trouvée.",
"Lost connection to the socket server.": "Connexion au serveur de socket perdue.",
"Cannot connect to the socket server.": "Impossible de se connecter au serveur de socket.",
"SIGNL4": "SIGNL4",
"SIGNL4 Webhook URL": "URL du webhook SIGNL4",
"signl4Docs": "Vous pouvez trouver plus d'informations sur la façon de configurer SIGNL4 et sur la façon d'obtenir l'URL du webhook SIGNL4 dans le {0}.",
"Conditions": "Conditions",
"conditionAdd": "Ajouter une condition",
"conditionDelete": "Supprimer la condition",
"conditionAddGroup": "Ajouter un groupe",
"conditionDeleteGroup": "Supprimer le groupe",
"conditionValuePlaceholder": "Valeur",
"equals": "est égal",
"not equals": "pas égal",
"contains": "contient",
"not contains": "ne contient pas",
"starts with": "commence par",
"not starts with": "ne commence pas par",
"ends with": "se termine par",
"not ends with": "ne se termine pas par",
"less than": "moins que",
"greater than": "supérieur à",
"less than or equal to": "inférieur ou égal à",
"greater than or equal to": "supérieur ou égal à",
"record": "enregistrer"
} }

@ -397,7 +397,6 @@
"steamApiKeyDescription": "Chun monatóireacht a dhéanamh ar Fhreastalaí Cluiche Gaile is gá duit eochair Steam Web-API. Is féidir leat deochair API a chlárú anseo: ", "steamApiKeyDescription": "Chun monatóireacht a dhéanamh ar Fhreastalaí Cluiche Gaile is gá duit eochair Steam Web-API. Is féidir leat deochair API a chlárú anseo: ",
"Shrink Database": "Laghdaigh Bunachar Sonraí", "Shrink Database": "Laghdaigh Bunachar Sonraí",
"No monitors available.": "Níl monatóirí ar fáil.", "No monitors available.": "Níl monatóirí ar fáil.",
"shrinkDatabaseDescription": "Truicear bunachar sonraí Folamh do SQLite. Má chruthaítear do bhunachar sonraí tar éis 1.10.0, tá AUTO_VACUUM cumasaithe cheana féin agus níl an gníomh seo de dhíth.",
"deleteStatusPageMsg": "An bhfuil tú cinnte gur mhaith leat an leathanach stádais seo a scriosadh?", "deleteStatusPageMsg": "An bhfuil tú cinnte gur mhaith leat an leathanach stádais seo a scriosadh?",
"deleteProxyMsg": "An bhfuil tú cinnte gur mhaith leat an seachfhreastalaí seo a scriosadh do gach monatóir?", "deleteProxyMsg": "An bhfuil tú cinnte gur mhaith leat an seachfhreastalaí seo a scriosadh do gach monatóir?",
"enableProxyDescription": "Ní bheidh éifeacht ag an seachfhreastalaí seo ar iarratais ar mhonatóir go dtí go ngníomhófar é. Is féidir leat an seachfhreastalaí a dhíchumasú go sealadach ó gach monatóir de réir stádas gníomhachtaithe.", "enableProxyDescription": "Ní bheidh éifeacht ag an seachfhreastalaí seo ar iarratais ar mhonatóir go dtí go ngníomhófar é. Is féidir leat an seachfhreastalaí a dhíchumasú go sealadach ó gach monatóir de réir stádas gníomhachtaithe.",
@ -955,5 +954,66 @@
"smspartnerPhoneNumberHelptext": "Caithfidh an uimhir a bheith san fhormáid idirnáisiúnta {0}, {1}. Ní mór uimhreacha iolracha a dheighilt le {2}", "smspartnerPhoneNumberHelptext": "Caithfidh an uimhir a bheith san fhormáid idirnáisiúnta {0}, {1}. Ní mór uimhreacha iolracha a dheighilt le {2}",
"wayToGetThreemaGateway": "Is féidir leat clárú le haghaidh Threema Gateway {0}.", "wayToGetThreemaGateway": "Is féidir leat clárú le haghaidh Threema Gateway {0}.",
"threemaSenderIdentityFormat": "8 gcarachtar, a thosaíonn le * de ghnáth", "threemaSenderIdentityFormat": "8 gcarachtar, a thosaíonn le * de ghnáth",
"threemaBasicModeInfo": "Nóta: Úsáideann an comhtháthú seo Threema Gateway i mód bunúsach (criptiúchán freastalaí-bhunaithe). Is féidir tuilleadh sonraí a fháil {0}." "threemaBasicModeInfo": "Nóta: Úsáideann an comhtháthú seo Threema Gateway i mód bunúsach (criptiúchán freastalaí-bhunaithe). Is féidir tuilleadh sonraí a fháil {0}.",
"jsonQueryDescription": "Parsáil agus bain sonraí ar leith ó fhreagra JSON an fhreastalaí ag baint úsáide as ceist JSON nó úsáid \"$\" don fhreagra amh, mura bhfuil tú ag súil le JSON. Cuirtear an toradh i gcomparáid ansin leis an luach ionchais, mar teaghráin. Féach ar {0} le haghaidh doiciméadú agus úsáid {1} chun triail a bhaint as fiosruithe.",
"snmpCommunityStringHelptext": "Feidhmíonn an teaghrán seo mar phasfhocal chun rochtain ar ghléasanna SNMP-chumasaithe a fhíordheimhniú agus a rialú. Meaitseáil sé le cumraíocht do ghléis SNMP.",
"snmpOIDHelptext": "Cuir isteach an OID don braiteoir nó don stádas ar mhaith leat monatóireacht a dhéanamh air. Úsáid uirlisí bainistíochta líonra ar nós brabhsálaithe MIB nó bogearraí SNMP mura bhfuil tú cinnte faoin OID.",
"wayToGetOnesenderUrlandToken": "Is féidir leat an URL agus Token a fháil ach dul chuig láithreán gréasáin Onesender. Tuilleadh eolais {0}",
"Lost connection to the socket server.": "Ceangal caillte leis an bhfreastalaí soicéad.",
"signl4Docs": "Is féidir leat tuilleadh faisnéise a fháil faoi conas SIGNL4 a chumrú agus conas an URL SIGNL4 a fháil sa {0}.",
"not starts with": "ní thosaíonn le",
"greater than or equal to": "níos mó ná nó cothrom le",
"now": "anois",
"time ago": "{0} ó shin",
"-year": "-bliain",
"Json Query Expression": "Léiriú Ceist Json",
"and": "agus",
"cacheBusterParam": "Cuir an {0} paraiméadar leis",
"cacheBusterParamDescription": "Paraiméadar ginte go randamach chun scipeáil a dhéanamh ar thaisce.",
"Community String": "Teaghrán Pobail",
"OID (Object Identifier)": "OID (Aitheantóir Oibiachta)",
"Condition": "Coinníoll",
"SNMP Version": "Leagan SNMP",
"Please enter a valid OID.": "Cuir isteach OID bailí.",
"Host Onesender": "Óstach Onesender",
"Token Onesender": "Token Onesender",
"Recipient Type": "Cineál Faighteoir",
"Private Number": "Uimhir Phríobháideach",
"privateOnesenderDesc": "Cinntigh go bhfuil an uimhir theileafóin bailí. Chun teachtaireacht a sheoladh chuig uimhir ghutháin phríobháideach, sean: 628123456789",
"groupOnesenderDesc": "Cinntigh go bhfuil an GroupID bailí. Chun teachtaireacht a sheoladh chuig an nGrúpa, sean: 628123456789-342345",
"Group ID": "ID grúpa",
"Add Remote Browser": "Cuir Brabhsálaí Cianda leis",
"New Group": "Grúpa Nua",
"Group Name": "Ainm an Ghrúpa",
"OAuth2: Client Credentials": "OAuth2: Dintiúir Cliant",
"Authentication Method": "Modh Fíordheimhnithe",
"Authorization Header": "Ceanntásc Údaraithe",
"Form Data Body": "Comhlacht Sonraí Foirm",
"OAuth Token URL": "URL OAuth Token",
"Client ID": "ID Cliant",
"Client Secret": "Rúnda Cliant",
"OAuth Scope": "OAuth Scóip",
"Optional: Space separated list of scopes": "Roghnach: Liosta scóip spásscartha",
"Go back to home page.": "Téigh ar ais go dtí an leathanach baile.",
"No tags found.": "Níor aimsíodh clibeanna.",
"Cannot connect to the socket server.": "Ní féidir ceangal leis an bhfreastalaí soicéad.",
"SIGNL4": "SIGNL4",
"SIGNL4 Webhook URL": "URL SIGNL4 Cabhrán Gréasáin",
"Conditions": "Coinníollacha",
"conditionAdd": "Cuir Coinníoll leis",
"conditionDelete": "Scrios Coinníoll",
"conditionAddGroup": "Cuir Grúpa leis",
"conditionDeleteGroup": "Scrios Grúpa",
"conditionValuePlaceholder": "Luach",
"equals": "comhionann",
"not equals": "ní ionann",
"contains": "ina bhfuil",
"not contains": "nach bhfuil",
"starts with": "thosaíonn le",
"ends with": "chríochnaíonn le",
"not ends with": "ní chríochnaíonn le",
"less than": "níos lú ná",
"greater than": "níos mó ná",
"less than or equal to": "níos lú ná nó cothrom le",
"record": "taifead"
} }

@ -378,7 +378,6 @@
"Discard": "להשליך", "Discard": "להשליך",
"Cancel": "לְבַטֵל", "Cancel": "לְבַטֵל",
"Powered by": "פועל על", "Powered by": "פועל על",
"shrinkDatabaseDescription": "ואקום מסד נתונים להפעיל עבור SQLITE.אם בסיס הנתונים שלך נוצר לאחר 1.10.0, Auto_VACUUM כבר מופעל ואין צורך בפעולה זו.",
"serwersms": "SerwerSMS.pl", "serwersms": "SerwerSMS.pl",
"serwersmsAPIUser": "שם משתמש ל-API (כולל webapi_prefix)", "serwersmsAPIUser": "שם משתמש ל-API (כולל webapi_prefix)",
"serwersmsAPIPassword": "סיסמת API", "serwersmsAPIPassword": "סיסמת API",

@ -40,5 +40,23 @@
"Down": "बंद", "Down": "बंद",
"Passive Monitor Type": "निष्क्रिय मॉनिटर प्रकार", "Passive Monitor Type": "निष्क्रिय मॉनिटर प्रकार",
"Status": "स्थिति", "Status": "स्थिति",
"showCertificateExpiry": "प्रमाणपत्र समाप्ति दिखाएँ" "showCertificateExpiry": "प्रमाणपत्र समाप्ति दिखाएँ",
"setupDatabaseEmbeddedMariaDB": "आपको कुछ भी सेट करने की जरूरत नहीं है. इस डॉकर छवि ने आपके लिए मारियाडीबी को स्वचालित रूप से एम्बेड और कॉन्फ़िगर किया है। अपटाइम कुमा यूनिक्स सॉकेट के माध्यम से इस डेटाबेस से कनेक्ट होगा।",
"setupDatabaseChooseDatabase": "आप किस डेटाबेस का उपयोग करना चाहेंगे?",
"setupDatabaseMariaDB": "किसी बाहरी मारियाडीबी डेटाबेस से कनेक्ट करें। आपको डेटाबेस कनेक्शन जानकारी सेट करने की आवश्यकता है।",
"setupDatabaseSQLite": "एक सरल डेटाबेस फ़ाइल, जो छोटे पैमाने पर तैनाती के लिए अनुशंसित है। V2.0.0 से पहले, अपटाइम कुमा ने डिफ़ॉल्ट डेटाबेस के रूप में SQLite का उपयोग किया था।",
"settingUpDatabaseMSG": "डेटाबेस की स्थापना. इसमें थोड़ा समय लग सकता है, कृपया धैर्य रखें।",
"markdownSupported": "मार्कडाउन सिंटैक्स समर्थित",
"time ago": "समय पहले",
"day": "दिन",
"Primary Base URL": "प्राथमिक आधार यूआरएल",
"-hour": "-घंटा",
"-day": "-दिन",
"hour": "घंटे",
"DateTime": "दिनांक समय",
"Uptime": "उपरिकाल",
"Cert Exp.": "प्रमाणपत्र अनुभव.",
"dbName": "डेटाबेस का नाम",
"now": "अभी",
"-year": "-वर्ष"
} }

@ -353,7 +353,6 @@
"Saved.": "Spremljeno.", "Saved.": "Spremljeno.",
"PushByTechulus": "Push by Techulus", "PushByTechulus": "Push by Techulus",
"GoogleChat": "Google Chat (preko platforme Google Workspace)", "GoogleChat": "Google Chat (preko platforme Google Workspace)",
"shrinkDatabaseDescription": "Pokreni VACUUM operaciju za SQLite. Ako je baza podataka kreirana nakon inačice 1.10.0, AUTO_VACUUM opcija već je uključena te ova akcija nije nužna.",
"serwersms": "SerwerSMS.pl", "serwersms": "SerwerSMS.pl",
"serwersmsAPIUser": "API korisničko ime (uključujući webapi_ prefiks)", "serwersmsAPIUser": "API korisničko ime (uključujući webapi_ prefiks)",
"serwersmsAPIPassword": "API lozinka", "serwersmsAPIPassword": "API lozinka",

@ -349,7 +349,6 @@
"Discard": "Elvet", "Discard": "Elvet",
"Cancel": "Mégsem", "Cancel": "Mégsem",
"Powered by": "A megoldást szállítja az", "Powered by": "A megoldást szállítja az",
"shrinkDatabaseDescription": "VACUUM futtatása az SQLite-on. Ha az adatbázisod 1.10.0-nál újabb, akkor az AUTO_VACUUM engedélyezve van, nincs szükség a műveletre.",
"serwersms": "SerwerSMS.pl", "serwersms": "SerwerSMS.pl",
"serwersmsAPIUser": "API felhasználónév (webapi_ előtaggal együtt)", "serwersmsAPIUser": "API felhasználónév (webapi_ előtaggal együtt)",
"serwersmsAPIPassword": "API jelszó", "serwersmsAPIPassword": "API jelszó",

@ -361,7 +361,6 @@
"Discard": "Buang", "Discard": "Buang",
"Cancel": "Batal", "Cancel": "Batal",
"Powered by": "Dipersembahkan oleh", "Powered by": "Dipersembahkan oleh",
"shrinkDatabaseDescription": "Trigger database VACUUM untuk SQLite. Jika database Anda dibuat setelah 1.10.0, AUTO_VACUUM sudah otomatis diaktifkan dan aksi berikut tidak dibutuhkan.",
"serwersms": "SerwerSMS.pl", "serwersms": "SerwerSMS.pl",
"serwersmsAPIUser": "Nama Pengguna API ( termamsuk awalan webapi_ )", "serwersmsAPIUser": "Nama Pengguna API ( termamsuk awalan webapi_ )",
"serwersmsAPIPassword": "Kata Sandi API", "serwersmsAPIPassword": "Kata Sandi API",
@ -985,5 +984,66 @@
"apiKeySevenIO": "Kunci API SevenIO", "apiKeySevenIO": "Kunci API SevenIO",
"locally configured mail transfer agent": "transfer email agent yang dikonfigurasi secara lokal", "locally configured mail transfer agent": "transfer email agent yang dikonfigurasi secara lokal",
"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": "Masukkan nama host server yang ingin Anda sambungkan atau {localhost} jika Anda ingin menggunakan {local_mta}", "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": "Masukkan nama host server yang ingin Anda sambungkan atau {localhost} jika Anda ingin menggunakan {local_mta}",
"ignoreTLSErrorGeneral": "Abaikan kesalahan TLS/SSL untuk koneksi" "ignoreTLSErrorGeneral": "Abaikan kesalahan TLS/SSL untuk koneksi",
"jsonQueryDescription": "Mengurai dan mengekstrak data spesifik dari respons JSON server menggunakan query JSON atau menggunakan “$” untuk respons mentah, jika tidak menginginkan JSON. Hasilnya kemudian dibandingkan dengan nilai yang diharapkan, sebagai string. Lihat {0} untuk dokumentasi dan gunakan {1} untuk bereksperimen dengan query.",
"now": "sekarang",
"time ago": "{0} yang lalu",
"-year": "-tahun",
"Json Query Expression": "Ekspresi Kueri Json",
"and": "dan",
"cacheBusterParam": "Tambahkan parameter {0}",
"cacheBusterParamDescription": "Parameter yang dihasilkan secara acak untuk melewati cache.",
"Community String": "Community String",
"snmpCommunityStringHelptext": "String ini berfungsi sebagai kata sandi untuk autentikasi dan mengontrol akses ke perangkat SNMP. Cocokkan dengan konfigurasi perangkat SNMP Anda.",
"OID (Object Identifier)": "OID (Object Identifier)",
"snmpOIDHelptext": "Masukkan OID untuk sensor atau status yang ingin Anda pantau. Gunakan alat manajemen jaringan seperti browser MIB atau perangkat lunak SNMP jika Anda tidak yakin tentang OID.",
"signl4Docs": "Anda dapat menemukan informasi selengkapnya tentang cara mengonfigurasi SIGNL4 dan cara mendapatkan URL webhook SIGNL4 di {0}.",
"greater than or equal to": "lebih dari atau sama dengan",
"wayToGetOnesenderUrlandToken": "Anda bisa mendapatkan URL dan Token dengan mengunjungi situs Onesender. Informasi lebih lanjut {0}",
"Condition": "Kondisi",
"SNMP Version": "Versi SNMP",
"Please enter a valid OID.": "Silakan masukkan OID yang tepat.",
"Host Onesender": "Host Onesender",
"Token Onesender": "Token Onesender",
"Recipient Type": "Tipe Penerima",
"Private Number": "Nomor Pribadi",
"privateOnesenderDesc": "Pastikan nomor telepon valid. Untuk mengirim pesan ke nomor telepon pribadi, contoh: 628123456789",
"Authorization Header": "Authorization Header",
"Form Data Body": "Form Data Body",
"OAuth Token URL": "OAuth Token URL",
"Client ID": "ID Klien",
"Client Secret": "Client Secret",
"OAuth Scope": "OAuth Scope",
"Optional: Space separated list of scopes": "Opsional: Daftar cakupan yang dipisahkan spasi",
"Go back to home page.": "Kembali ke halaman beranda.",
"No tags found.": "Tidak ada tag yang ditemukan.",
"Lost connection to the socket server.": "Kehilangan koneksi ke server soket.",
"Cannot connect to the socket server.": "Tidak dapat terhubung ke server soket.",
"SIGNL4": "SIGNL4",
"SIGNL4 Webhook URL": "SIGNL4 Webhook URL",
"Conditions": "Kondisi",
"conditionAdd": "Tambahkan Kondisi",
"conditionDelete": "Menghapus Kondisi",
"conditionAddGroup": "Tambahkan Grup",
"conditionDeleteGroup": "Menghapus Grup",
"conditionValuePlaceholder": "Nilai",
"equals": "sama dengan",
"not equals": "tidak sama dengan",
"contains": "berisi",
"not contains": "tidak berisi",
"starts with": "dimulai dengan",
"not starts with": "tidak dimulai dengan",
"ends with": "diakhiri dengan",
"not ends with": "tidak diakhiri dengan",
"less than": "kurang dari",
"greater than": "lebih dari",
"less than or equal to": "kurang dari atau sama dengan",
"record": "rekaman",
"groupOnesenderDesc": "Pastikan GroupIDnya valid. Untuk mengirim pesan ke Grup, misal: 628123456789-342345",
"Group ID": "ID Grup",
"Add Remote Browser": "Tambahkan Remote Browser",
"New Group": "Grup Baru",
"Group Name": "Nama Grup",
"OAuth2: Client Credentials": "OAuth2: Kredensial Klien",
"Authentication Method": "Metode Autentikasi"
} }

@ -349,7 +349,6 @@
"Discard": "Scarta modifiche", "Discard": "Scarta modifiche",
"Cancel": "Annulla", "Cancel": "Annulla",
"Powered by": "Powered by", "Powered by": "Powered by",
"shrinkDatabaseDescription": "Lancia il comando \"VACUUM\" sul database SQLite. Se il database è stato creato dopo la versione 1.10.0, la funzione \"AUTO_VACUUM\" è già abilitata di default e quindi questa azione non è necessaria.",
"serwersms": "SerwerSMS.pl", "serwersms": "SerwerSMS.pl",
"serwersmsAPIUser": "Nome utente API (incl. prefisso webapi_)", "serwersmsAPIUser": "Nome utente API (incl. prefisso webapi_)",
"serwersmsAPIPassword": "Password API", "serwersmsAPIPassword": "Password API",
@ -686,7 +685,7 @@
"forumPostName": "Nome forum del post", "forumPostName": "Nome forum del post",
"threadForumPostID": "ID della conversazione / Forum del post", "threadForumPostID": "ID della conversazione / Forum del post",
"e.g. {discordThreadID}": "es. {discordThreadID}", "e.g. {discordThreadID}": "es. {discordThreadID}",
"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": "Inserisci il nome host del server a cui vuoi connetterti oppure {localhost} se intendi utilizzare un {local_mta}", "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": "Inserisci l'hostname del server a cui ti vuoi connettere o {localhost} se vuoi usare {local_mta}",
"templateLimitedToUpDownCertNotifications": "disponibile solo per le notifiche UP/DOWN/Scadenza certificato", "templateLimitedToUpDownCertNotifications": "disponibile solo per le notifiche UP/DOWN/Scadenza certificato",
"emailTemplateMsg": "Messaggio della notifica", "emailTemplateMsg": "Messaggio della notifica",
"emailTemplateLimitedToUpDownNotification": "disponibile solo per controlli UP/DOWN, altrimenti nullo", "emailTemplateLimitedToUpDownNotification": "disponibile solo per controlli UP/DOWN, altrimenti nullo",
@ -698,5 +697,45 @@
"emailTemplateStatus": "Stato", "emailTemplateStatus": "Stato",
"ignoreTLSErrorGeneral": "Ignora gli errori TLS/SSL per la connessione", "ignoreTLSErrorGeneral": "Ignora gli errori TLS/SSL per la connessione",
"statusPageSpecialSlugDesc": "Slug speciale {0}: questa pagina verrà mostrata quando non viene fornito alcuno slug", "statusPageSpecialSlugDesc": "Slug speciale {0}: questa pagina verrà mostrata quando non viene fornito alcuno slug",
"successKeywordExplanation": "Parola chiave MQTT che verrà considerata come corretta" "successKeywordExplanation": "Parola chiave MQTT che verrà considerata come corretta",
"signl4Docs": "Puoi trovare maggiori informazioni su come configurare SIGNL4 e su come ottenere l'URL del webhook SIGNL4 in {0}.",
"contains": "contiene",
"not contains": "non contiene",
"starts with": "inizia con",
"equals": "uguale",
"not equals": "non uguale",
"less than": "meno di",
"greater than": "maggiore di",
"successKeyword": "Parola chiave corretta",
"templateMonitorJSON": "oggetto che descrive il monitor",
"Cannot connect to the socket server.": "Impossibile connettersi al server socket.",
"wayToGetDiscordThreadId": "Ottenere l'ID di un thread/post del forum è simile a ottenere un ID di canale. Scopri di più su come ottenere gli ID {0}",
"pushoversounds pushover": "Pushover (predefinita)",
"pushoversounds none": "Nessuno (silenzioso)",
"Don't mention people": "Non menzionare le persone",
"Mention group": "Menzionare {group}",
"Host URL": "URL dell'host",
"emailTemplateMonitorJSON": "oggetto che descrive il monitor",
"Channel access token (Long-lived)": "Token di accesso al canale (di lunga durata)",
"Your User ID": "Il tuo ID utente",
"pushoverMessageTtl": "Messaggio TTL (secondi)",
"SendKey": "SendKey",
"Sms template must contain parameters: ": "Il modello SMS deve contenere i parametri: ",
"Bark API Version": "Versione API Bark",
"Bark Group": "Gruppo Bark",
"Bark Endpoint": "Endpoint Bark",
"Bark Sound": "Suono Bark",
"aboutNotifyChannel": "Notify channel attiverà una notifica desktop o mobile per tutti i membri del canale, indipendentemente dal fatto che la loro disponibilità sia impostata su attivo o assente.",
"promosmsPassword": "Password API",
"You can divide numbers with": "Puoi dividere i numeri con",
"Base URL": "URL base",
"-year": "-anno",
"now": "ora",
"time ago": "fa",
"Json Query Expression": "Espressione di query JSON",
"and": "e",
"whatHappensAtForumPost": "Crea un nuovo post sul forum. Questo NON pubblica messaggi in post esistenti. Per pubblicare in un post esistente utilizzare \"{option}\"",
"invertKeywordDescription": "Cerca la parola chiave essere assente anziché presente.",
"octopushAPIKey": "\"API Key\" dalle credenziali API HTTP nel pannello di controllo",
"Enable TLS": "Abilita TLS"
} }

@ -349,7 +349,6 @@
"No monitors available.": "監視対象がありません。", "No monitors available.": "監視対象がありません。",
"Add one": "追加", "Add one": "追加",
"No Monitors": "監視対象なし", "No Monitors": "監視対象なし",
"shrinkDatabaseDescription": "SQLiteデーターベースにVACUUMを実行します。データーベースがv1.10.0以降に作成されている場合、AUTO_VACUUMが既に有効なため実行する必要はありません。",
"enableProxyDescription": "このプロキシは有効化されない限り、監視リクエストには影響しません。無効化した場合、一時的にプロキシをすべての監視から無効化することができます。", "enableProxyDescription": "このプロキシは有効化されない限り、監視リクエストには影響しません。無効化した場合、一時的にプロキシをすべての監視から無効化することができます。",
"Certificate Chain": "証明書チェーン", "Certificate Chain": "証明書チェーン",
"Valid": "有効", "Valid": "有効",

@ -349,7 +349,6 @@
"Discard": "취소", "Discard": "취소",
"Cancel": "취소", "Cancel": "취소",
"Powered by": "Powered by", "Powered by": "Powered by",
"shrinkDatabaseDescription": "SQLite 데이터베이스 VACUUM을 트리거해요. 만약 데이터베이스가 1.10.0 버전 이후에 생성되었다면 AUTO_VACUUM이 설정되어 있어 이 작업은 필요 없을 거에요.",
"serwersms": "SerwerSMS.pl", "serwersms": "SerwerSMS.pl",
"serwersmsAPIUser": "API Usename (webapi_ 접두사 포함)", "serwersmsAPIUser": "API Usename (webapi_ 접두사 포함)",
"serwersmsAPIPassword": "API 비밀번호", "serwersmsAPIPassword": "API 비밀번호",
@ -779,5 +778,12 @@
"Add a domain": "도메인 추가", "Add a domain": "도메인 추가",
"Remove domain": "도메인 '{0}' 제거", "Remove domain": "도메인 '{0}' 제거",
"Monitor Group": "모니터링 그룹", "Monitor Group": "모니터링 그룹",
"Monitor Setting": "{0}의 모니터 설정" "Monitor Setting": "{0}의 모니터 설정",
"now": "지금",
"time ago": "{0} 전",
"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": "연결하려는 서버의 호스트 이름을 입력하거나 {local_mta}를 사용하려는 경우 {localhost}를 입력합니다",
"-year": "-연도",
"Json Query Expression": "Json 쿼리 표현식",
"Host URL": "호스트 URL",
"locally configured mail transfer agent": "로컬로 구성된 메일 전송 에이전트"
} }

@ -33,7 +33,7 @@
"Down": "ကွန်ရက်ပြတ်တောက်နေသည်", "Down": "ကွန်ရက်ပြတ်တောက်နေသည်",
"Pending": "ဆိုင်းငံ့ဆဲ", "Pending": "ဆိုင်းငံ့ဆဲ",
"statusMaintenance": "ပြုပြင်ထိန်းသိမ်းခြင်း", "statusMaintenance": "ပြုပြင်ထိန်းသိမ်းခြင်း",
"Cannot connect to the socket server": "Socket Server အားချိတ်ဆက်မှုမအောင်မြင်ပါ", "Cannot connect to the socket server": "Why Socket Server အားချိတ်ဆက်မှုမအောင်မြင်ပါ",
"Passive Monitor Type": "Passive စောင့်ကြည့်မှုပုံစံ", "Passive Monitor Type": "Passive စောင့်ကြည့်မှုပုံစံ",
"Specific Monitor Type": "သီးခြားစောင့်ကြည့်မှုပုံစံ", "Specific Monitor Type": "သီးခြားစောင့်ကြည့်မှုပုံစံ",
"Resume": "ဆက်သွားမည်", "Resume": "ဆက်သွားမည်",
@ -89,5 +89,7 @@
"Heartbeat Retry Interval": "ကွန်ယက်ချိတ်ဆက်နိုင်မှုတိုင်းတာခြင်း ထပ်မံကြိုးစားခြင်း အချိန်ကွာဟချက်", "Heartbeat Retry Interval": "ကွန်ယက်ချိတ်ဆက်နိုင်မှုတိုင်းတာခြင်း ထပ်မံကြိုးစားခြင်း အချိန်ကွာဟချက်",
"Resend Notification if Down X times consecutively": "ကွန်ယက်ချိတ်ဆက်မှု X အကြိမ်ထိ ဆက်တိုက်ကျနေပါက သတိပေးချက်ထပ်မံပေးပို့ရန်", "Resend Notification if Down X times consecutively": "ကွန်ယက်ချိတ်ဆက်မှု X အကြိမ်ထိ ဆက်တိုက်ကျနေပါက သတိပေးချက်ထပ်မံပေးပို့ရန်",
"retriesDescription": "ဝန်ဆောင်မှုကွန်ယက်ပြတ်တောက်နေ၍ သတိပေးချက်ပေးပို့ပြီး အများဆုံးထပ်မံကြိုးစားနိုင်မှု", "retriesDescription": "ဝန်ဆောင်မှုကွန်ယက်ပြတ်တောက်နေ၍ သတိပေးချက်ပေးပို့ပြီး အများဆုံးထပ်မံကြိုးစားနိုင်မှု",
"Search Engine Visibility": "ရှာဖွေမှုအင်ဂျင်များ၏မြင်နိုင်စွမ်း" "Search Engine Visibility": "ရှာဖွေမှုအင်ဂျင်များ၏မြင်နိုင်စွမ်း",
"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.",
"setupDatabaseChooseDatabase": "English"
} }

@ -254,7 +254,7 @@
"Channel Name": "Kanaal Naam", "Channel Name": "Kanaal Naam",
"Uptime Kuma URL": "Uptime Kuma URL", "Uptime Kuma URL": "Uptime Kuma URL",
"aboutWebhooks": "Meer info over Webhooks op: {0}", "aboutWebhooks": "Meer info over Webhooks op: {0}",
"aboutChannelName": "Voer de kanaal naam in op {0} Kannaal Naam veld als je het Webhook kanaal wilt omzeilen. Bv: #other-channel", "aboutChannelName": "Voer de kanaal naam in op {0} Kanaal naam veld als je het Webhook kanaal wilt omzeilen. Bijv: #other-channel",
"aboutKumaURL": "Als je de Uptime Kuma URL veld leeg laat, wordt standaard het GitHub project pagina weergegeven.", "aboutKumaURL": "Als je de Uptime Kuma URL veld leeg laat, wordt standaard het GitHub project pagina weergegeven.",
"emojiCheatSheet": "Emoji cheat sheet: {0}", "emojiCheatSheet": "Emoji cheat sheet: {0}",
"PushByTechulus": "Push door Techulus", "PushByTechulus": "Push door Techulus",
@ -356,7 +356,6 @@
"Discard": "Weggooien", "Discard": "Weggooien",
"Cancel": "Annuleren", "Cancel": "Annuleren",
"Powered by": "Mogelijk gemaakt door", "Powered by": "Mogelijk gemaakt door",
"shrinkDatabaseDescription": "Activeer database VACUUM voor SQLite. Als de database na 1.10.0 aangemaakt is, dan staat AUTO_VACUUM al aan en is deze actie niet nodig.",
"serwersms": "SerwerSMS.pl", "serwersms": "SerwerSMS.pl",
"serwersmsAPIUser": "API Gebruikersnaam (incl. webapi_ prefix)", "serwersmsAPIUser": "API Gebruikersnaam (incl. webapi_ prefix)",
"serwersmsAPIPassword": "API Wachtwoord", "serwersmsAPIPassword": "API Wachtwoord",
@ -432,7 +431,7 @@
"Next": "Volgende", "Next": "Volgende",
"The slug is already taken. Please choose another slug.": "De slug is al in gebruik. Kies een andere slug.", "The slug is already taken. Please choose another slug.": "De slug is al in gebruik. Kies een andere slug.",
"No Proxy": "Geen Proxy", "No Proxy": "Geen Proxy",
"HTTP Basic Auth": "HTTP Basic Auth", "HTTP Basic Auth": "HTTP Basis Authenticatie",
"New Status Page": "Nieuwe Status Pagina", "New Status Page": "Nieuwe Status Pagina",
"Page Not Found": "Pagina Niet gevonden", "Page Not Found": "Pagina Niet gevonden",
"Reverse Proxy": "Reverse Proxy", "Reverse Proxy": "Reverse Proxy",
@ -529,9 +528,9 @@
"Workstation": "Werkstation", "Workstation": "Werkstation",
"disableCloudflaredNoAuthMsg": "De \"Geen authenticatie\" modus staat aan, wachtwoord is niet vereist.", "disableCloudflaredNoAuthMsg": "De \"Geen authenticatie\" modus staat aan, wachtwoord is niet vereist.",
"backupOutdatedWarning": "Deprecated: Er zijn een hoop nieuwe functies toegevoegd en daarom is de backup functie niet onderhouden, het is op dit moment niet mogelijk om een volledige backup te maken en te herstellen.", "backupOutdatedWarning": "Deprecated: Er zijn een hoop nieuwe functies toegevoegd en daarom is de backup functie niet onderhouden, het is op dit moment niet mogelijk om een volledige backup te maken en te herstellen.",
"RadiusSecret": "Radius Secret", "RadiusSecret": "Radius Geheim",
"RadiusSecretDescription": "Shared Secret tussen client en server", "RadiusSecretDescription": "Shared Secret tussen client en server",
"API Key": "API Key", "API Key": "API Sleutel",
"Connection Type": "Verbindingstype", "Connection Type": "Verbindingstype",
"Docker Daemon": "Docker Daemon", "Docker Daemon": "Docker Daemon",
"Trust Proxy": "Trust Proxy", "Trust Proxy": "Trust Proxy",
@ -964,7 +963,7 @@
"threemaRecipientTypeIdentityFormat": "8 Karakters", "threemaRecipientTypeIdentityFormat": "8 Karakters",
"threemaRecipientTypePhone": "Telefoonnummer", "threemaRecipientTypePhone": "Telefoonnummer",
"threemaRecipientTypePhoneFormat": "E.164, zonder voorgaande +", "threemaRecipientTypePhoneFormat": "E.164, zonder voorgaande +",
"threemaSenderIdentityFormat": "8 karakters, begint normaliter met een *", "threemaSenderIdentityFormat": "8 karakters, begint normaal met een *",
"smspartnerPhoneNumber": "Telefoonnummer(s)", "smspartnerPhoneNumber": "Telefoonnummer(s)",
"smspartnerSenderNameInfo": "Moet tussen 3..=11 reguliere karakters zijn", "smspartnerSenderNameInfo": "Moet tussen 3..=11 reguliere karakters zijn",
"Bitrix24 Webhook URL": "Bitrix24 Webhook URL", "Bitrix24 Webhook URL": "Bitrix24 Webhook URL",
@ -990,6 +989,57 @@
"wayToGetDiscordThreadId": "Verkrijgen van een thread / forum bericht id is vergelijkbaar met het verkrijgen van een kanaal id. Lees meer over het verkrijgen van ids {0}", "wayToGetDiscordThreadId": "Verkrijgen van een thread / forum bericht id is vergelijkbaar met het verkrijgen van een kanaal id. Lees meer over het verkrijgen van ids {0}",
"threemaRecipientTypeEmail": "E-mailadres", "threemaRecipientTypeEmail": "E-mailadres",
"threemaSenderIdentity": "Gateway ID", "threemaSenderIdentity": "Gateway ID",
"threemaApiAuthenticationSecret": "Gateway ID Secret", "threemaApiAuthenticationSecret": "Gateway ID Geheim",
"smspartnerSenderName": "SMS afzender naam" "smspartnerSenderName": "SMS afzender naam",
"and": "en",
"snmpCommunityStringHelptext": "Deze string fungeert als een wachtwoord om toegang tot SNMP-apparaten te verifiëren en te beheren. Match het met de configuratie van uw SNMP-apparaat.",
"groupOnesenderDesc": "Zorg ervoor dat de GroupID juist is. Om een bericht naar een groep te sturen, bijvoorbeeld: 628123456789-342345",
"privateOnesenderDesc": "Zorg ervoor dat het telefoonnummer juist is. Om een bericht te sturen naar een privé telefoonnummer, bijvoorbeeld: 628123456789",
"now": "nu",
"time ago": "{0} geleden",
"-year": "-jaar",
"cacheBusterParamDescription": "Willekeurig gegenereerde parameter om caches over te slaan.",
"OID (Object Identifier)": "OID (Object indentificatie)",
"snmpOIDHelptext": "Voer de OID in voor de sensor of status die u wilt monitoren. Gebruik netwerkbeheertools zoals MIB-browsers of SNMP-software als u niet zeker bent over de OID.",
"Condition": "Conditie",
"SNMP Version": "SNMP Versie",
"Please enter a valid OID.": "Voer a.u.b. een geldige OID in.",
"Host Onesender": "Host Onesender",
"Token Onesender": "Token Onesender",
"Recipient Type": "Ontvanger Type",
"Private Number": "Privé Nummer",
"Group ID": "Groep ID",
"wayToGetOnesenderUrlandToken": "U kunt de URL en Token krijgen door naar de Onesender website te gaan. Meer informatie {0}",
"Add Remote Browser": "Externe browser toevoegen",
"New Group": "Nieuwe Groep",
"Group Name": "Groeps naam",
"OAuth2: Client Credentials": "OAuth2: Client referenties",
"Authentication Method": "Authenticatie methode",
"Authorization Header": "Autorisatie Header",
"OAuth Token URL": "OAuth Token URL",
"Client ID": "Client ID",
"Client Secret": "Client geheim",
"Go back to home page.": "Ga terug naar de home pagina.",
"No tags found.": "Geen tags gevonden.",
"Lost connection to the socket server.": "Verbinding met de socketserver verloren.",
"Cannot connect to the socket server.": "Kan geen verbinding maken met de socketserver.",
"SIGNL4": "SIGNL4",
"SIGNL4 Webhook URL": "SIGNL4 Webhook URL",
"signl4Docs": "Meer informatie over het configureren van SIGNL4 en het verkrijgen van de SIGNL4-webhook-URL kunt u hier vinden {0}.",
"Conditions": "Voorwaarden",
"conditionAdd": "Voorwaarde toevoegen",
"conditionDelete": "Voorwaarde verweideren",
"conditionAddGroup": "Groep toevoegen",
"conditionDeleteGroup": "Groep verweideren",
"conditionValuePlaceholder": "Waarde",
"contains": "bevat",
"not contains": "bevat niet",
"starts with": "start met",
"not starts with": "start niet met",
"ends with": "eindigt met",
"not ends with": "eindigt niet met",
"less than": "minder dan",
"greater than": "meer dan",
"record": "dossier",
"jsonQueryDescription": "Parseer en haal specifieke gegevens uit de JSON-respons van de server met behulp van JSON-query of gebruik \"$\" voor de onbewerkte respons, als u geen JSON verwacht. Het resultaat wordt vervolgens vergeleken met de verwachte waarde, als strings. Zie {0} voor documentatie en gebruik {1} om te experimenteren met query's."
} }

@ -354,7 +354,6 @@
"Discard": "Odrzuć", "Discard": "Odrzuć",
"Cancel": "Anuluj", "Cancel": "Anuluj",
"Powered by": "Napędzane przez", "Powered by": "Napędzane przez",
"shrinkDatabaseDescription": "Uruchom VACUUM na bazie SQLite. Jeżeli twoja baza została stworzona po wersji 1.10.0, to ma już włączoną opcję AUTO_VACUUM i stosowanie ręcznego oczyszczania nie jest potrzebne.",
"clicksendsms": "ClickSend SMS", "clicksendsms": "ClickSend SMS",
"apiCredentials": "Poświadczenia API", "apiCredentials": "Poświadczenia API",
"serwersms": "SerwerSMS.pl", "serwersms": "SerwerSMS.pl",

@ -287,7 +287,6 @@
"Don't know how to get the token? Please read the guide:": "Não sabe com pegar o token? Por favor, leia o guia:", "Don't know how to get the token? Please read the guide:": "Não sabe com pegar o token? Por favor, leia o guia:",
"smtpDkimheaderFieldNames": "Chaves Do Cabeçalho para assinar (Opcional)", "smtpDkimheaderFieldNames": "Chaves Do Cabeçalho para assinar (Opcional)",
"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.": "A conexão atual pode ser perdida se você estiver se conectando pelo túnel da Cloudflare. Você tem certeza que deseja pará-lo? Digite a sua senha para confirmar.", "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.": "A conexão atual pode ser perdida se você estiver se conectando pelo túnel da Cloudflare. Você tem certeza que deseja pará-lo? Digite a sua senha para confirmar.",
"shrinkDatabaseDescription": "Acionar a limpeza do banco de dados para o SQLite. Se o seu banco de dados foi criado depois de 1.10.0, a limpeza automática(AUTO_VACUUM) já é habilitada por padrão e essa ação não é necessária.",
"Powered by": "Fornecido por", "Powered by": "Fornecido por",
"deleteProxyMsg": "Você tem certeza que deseja deletar este proxy para todos os monitores?", "deleteProxyMsg": "Você tem certeza que deseja deletar este proxy para todos os monitores?",
"proxyDescription": "Os proxies devem ser atribuídos a um monitor para funcionar.", "proxyDescription": "Os proxies devem ser atribuídos a um monitor para funcionar.",
@ -958,5 +957,28 @@
"whatHappensAtForumPost": "Criar um novo tópico no fórum. Isto NÃO publica mensagens em tópicos existentes. Para publicar em um tópico existente, use \"{option}\"", "whatHappensAtForumPost": "Criar um novo tópico no fórum. Isto NÃO publica mensagens em tópicos existentes. Para publicar em um tópico existente, use \"{option}\"",
"e.g. {discordThreadID}": "Por exemplo {discordThreadID}", "e.g. {discordThreadID}": "Por exemplo {discordThreadID}",
"receiverInfoSevenIO": "Se o número de destino não estiver localizado na Alemanha, você deve adicionar o código do país antes do número (por exemplo, para o código de país 1 dos EUA, use 117612121212 em vez de 017612121212)", "receiverInfoSevenIO": "Se o número de destino não estiver localizado na Alemanha, você deve adicionar o código do país antes do número (por exemplo, para o código de país 1 dos EUA, use 117612121212 em vez de 017612121212)",
"apiKeysDisabledMsg": "As chaves de API estão desativadas porque a autenticação está desativada." "apiKeysDisabledMsg": "As chaves de API estão desativadas porque a autenticação está desativada.",
"now": "agora",
"and": "e",
"jsonQueryDescription": "Analise e extraia dados específicos da resposta JSON do servidor usando uma query JSON ou use \"$\" para a resposta em raw, se não estiver esperando JSON. O resultado é então comparado ao valor esperado, como strings. Veja {0} para documentação e use {1} para experimentar com queries.",
"time ago": "atrás",
"-year": "-ano",
"Json Query Expression": "Expressão Json Query",
"cacheBusterParam": "Adicionar o parâmetro {0}",
"snmpCommunityStringHelptext": "Esta string funciona como uma senha para autenticar e controlar o acesso a dispositivos habilitados para SNMP. Combine-a com a configuração do seu dispositivo SNMP.",
"OID (Object Identifier)": "OID (Identificador do Objeto)",
"Condition": "Condição",
"Recipient Type": "Tipo de destinatário",
"wayToGetOnesenderUrlandToken": "Você pode obter a URL e o Token acessando o site da Onesender. Mais informações {0}",
"cacheBusterParamDescription": "Parâmetro gerado randomicamente para ignorar cache.",
"SNMP Version": "Versão SNMP",
"Please enter a valid OID.": "Por favor, insira um OID válido.",
"Private Number": "Número Privado",
"Group ID": "ID do Grupo",
"Add Remote Browser": "Adicionar Navegador Remoto",
"New Group": "Novo Grupo",
"Group Name": "Nome do Grupo",
"OAuth2: Client Credentials": "OAuth2: Client Credentials",
"Authentication Method": "Método de Autenticação",
"Authorization Header": "Header de Autorização"
} }

@ -405,7 +405,6 @@
"Please input title and content": "Por favor insira o título e o conteúdo", "Please input title and content": "Por favor insira o título e o conteúdo",
"Hide Tags": "Ocultar Tags", "Hide Tags": "Ocultar Tags",
"Description": "Descrição", "Description": "Descrição",
"shrinkDatabaseDescription": "Acionar banco de dados VACUUM para SQLite. Se seu banco de dados for criado após 1.10.0, AUTO_VACUUM já está ativado e esta ação não é necessária.",
"proxyDescription": "Os proxies devem ser atribuídos a um monitor para funcionar.", "proxyDescription": "Os proxies devem ser atribuídos a um monitor para funcionar.",
"enableProxyDescription": "Este proxy não afetará as solicitações do monitor até que seja ativado. Você pode controlar temporariamente a desativação do proxy de todos os monitores pelo status de ativação.", "enableProxyDescription": "Este proxy não afetará as solicitações do monitor até que seja ativado. Você pode controlar temporariamente a desativação do proxy de todos os monitores pelo status de ativação.",
"Don't know how to get the token? Please read the guide:": "Não sabe como obter o token? Por favor, leia o guia:", "Don't know how to get the token? Please read the guide:": "Não sabe como obter o token? Por favor, leia o guia:",

@ -511,7 +511,6 @@
"No Monitors": "Niciun monitor", "No Monitors": "Niciun monitor",
"Untitled Group": "Grup fără nume", "Untitled Group": "Grup fără nume",
"Services": "Servicii", "Services": "Servicii",
"shrinkDatabaseDescription": "Declanșează database VACUUM pentru SQLite. Dacă baza ta de date a fost creată după 1.10.0, AUTO_VACUUM este deja activat și această acțiune nu este necesară.",
"proxyDescription": "Proxy-urile trebuie să fie atribuite unui monitor pentru a funcționa.", "proxyDescription": "Proxy-urile trebuie să fie atribuite unui monitor pentru a funcționa.",
"enableProxyDescription": "Acest proxy nu va avea efect asupra solicitărilor monitoarelor până când nu este activat. Puteți controla dezactivarea temporară a proxy-ului de pe toate monitoarele prin starea de activare.", "enableProxyDescription": "Acest proxy nu va avea efect asupra solicitărilor monitoarelor până când nu este activat. Puteți controla dezactivarea temporară a proxy-ului de pe toate monitoarele prin starea de activare.",
"setAsDefaultProxyDescription": "Acest proxy va fi activat în mod implicit pentru monitoare noi. Puteți dezactiva în continuare proxy-ul separat pentru fiecare monitor.", "setAsDefaultProxyDescription": "Acest proxy va fi activat în mod implicit pentru monitoare noi. Puteți dezactiva în continuare proxy-ul separat pentru fiecare monitor.",
@ -979,5 +978,66 @@
"wayToGetThreemaGateway": "Vă puteți înregistra pentru Threema Gateway {0}.", "wayToGetThreemaGateway": "Vă puteți înregistra pentru Threema Gateway {0}.",
"threemaSenderIdentityFormat": "8 caractere, de obicei începe cu *", "threemaSenderIdentityFormat": "8 caractere, de obicei începe cu *",
"threemaBasicModeInfo": "Notă: Această integrare utilizează Threema Gateway în modul de bază (criptare bazată pe server). Mai multe detalii pot fi găsite {0}.", "threemaBasicModeInfo": "Notă: Această integrare utilizează Threema Gateway în modul de bază (criptare bazată pe server). Mai multe detalii pot fi găsite {0}.",
"apiKeysDisabledMsg": "Cheile API sunt dezactivate deoarece autentificarea este dezactivată." "apiKeysDisabledMsg": "Cheile API sunt dezactivate deoarece autentificarea este dezactivată.",
"and": "și",
"jsonQueryDescription": "Analizați și extrageți date specifice din răspunsul JSON al serverului folosind interogarea JSON sau folosiți „$” pentru răspunsul brut, dacă nu vă așteptați JSON. Rezultatul este apoi comparat cu valoarea așteptată, sub formă de șiruri. Consultați {0} pentru documentație și utilizați {1} pentru a experimenta interogări.",
"snmpCommunityStringHelptext": "Acest șir funcționează ca o parolă pentru autentificarea și controlul accesului la dispozitivele SNMP activate. Potriviți-l cu configurația dispozitivului dvs. SNMP.",
"Please enter a valid OID.": "Vă rugăm să introduceți un OID valid.",
"now": "acum",
"time ago": "acum {0}",
"-year": "-an",
"Json Query Expression": "Expresie de interogare Json",
"cacheBusterParam": "Adăugați parametrul {0}",
"cacheBusterParamDescription": "Parametru generat aleatoriu pentru a ignora memoria cache.",
"Community String": "Șir de comunitate",
"OID (Object Identifier)": "OID (identificator de obiect)",
"snmpOIDHelptext": "Introduceți OID-ul pentru senzorul sau starea pe care doriți să-l monitorizați. Utilizați instrumente de gestionare a rețelei, cum ar fi browserele MIB sau software-ul SNMP, dacă nu sunteți sigur de OID.",
"Condition": "Stare",
"SNMP Version": "Versiunea SNMP",
"Host Onesender": "Gazdă Onesender",
"privateOnesenderDesc": "Asigurați-vă că numărul de telefon este valid. Pentru a trimite mesaj la numărul de telefon privat, ex: 628123456789",
"wayToGetOnesenderUrlandToken": "Puteți obține adresa URL și Token accesând site-ul web Onesender. Mai multe informații {0}",
"OAuth Token URL": "Adresa URL a tokenului OAuth",
"No tags found.": "Nu au fost găsite etichete.",
"signl4Docs": "Puteți găsi mai multe informații despre cum să configurați SIGNL4 și despre cum să obțineți adresa URL a webhook-ului SIGNL4 în {0}.",
"greater than": "mai mare decât",
"Token Onesender": "Onesender Token",
"Recipient Type": "Tip Destinatar",
"Private Number": "Număr privat",
"groupOnesenderDesc": "Asigurați-vă că GroupID este valid. Pentru a trimite un mesaj în grup, de exemplu: 628123456789-342345",
"Group ID": "ID grup",
"Add Remote Browser": "Adăugați browser la distanță",
"New Group": "Grup nou",
"Group Name": "Numele grupului",
"OAuth2: Client Credentials": "OAuth2: credențialele clientului",
"Authentication Method": "Metoda de autentificare",
"Authorization Header": "Antet de autorizare",
"Form Data Body": "Corpul datelor formularului",
"Client ID": "ID client",
"Client Secret": "Secret client",
"OAuth Scope": "Domeniul OAuth",
"Optional: Space separated list of scopes": "Opțional: listă de domenii separate prin spații",
"Go back to home page.": "Reveniți la pagina de start.",
"Lost connection to the socket server.": "S-a pierdut conexiunea la serverul socket.",
"Cannot connect to the socket server.": "Nu se poate conecta la serverul socket.",
"SIGNL4": "SIGNL4",
"SIGNL4 Webhook URL": "URL SIGNL4 Webhook",
"Conditions": "Condiții",
"conditionAdd": "Adăugați o condiție",
"conditionDelete": "Ștergeți condiția",
"conditionAddGroup": "Adăugați grup",
"conditionDeleteGroup": "Ștergeți grupul",
"conditionValuePlaceholder": "Valoare",
"equals": "egală",
"not equals": "nu este egală",
"contains": "conţine",
"not contains": "nu conține",
"starts with": "începe cu",
"not starts with": "nu începe cu",
"ends with": "se termină cu",
"not ends with": "nu se termină cu",
"less than": "mai puțin decât",
"less than or equal to": "mai mic sau egal cu",
"greater than or equal to": "mai mare sau egal cu",
"record": "înregistrare"
} }

@ -338,7 +338,6 @@
"About": "О программе", "About": "О программе",
"Description": "Описание", "Description": "Описание",
"Powered by": "Работает на", "Powered by": "Работает на",
"shrinkDatabaseDescription": "Включает VACUUM для базы данных SQLite. Если ваша база данных была создана на версии 1.10.0 и более, AUTO_VACUUM уже включен и это действие не требуется.",
"deleteStatusPageMsg": "Вы действительно хотите удалить эту страницу статуса?", "deleteStatusPageMsg": "Вы действительно хотите удалить эту страницу статуса?",
"Style": "Стиль", "Style": "Стиль",
"info": "ИНФО", "info": "ИНФО",

@ -349,7 +349,6 @@
"Discard": "zavrzi", "Discard": "zavrzi",
"Cancel": "Prekliči", "Cancel": "Prekliči",
"Powered by": "Poganja ga", "Powered by": "Poganja ga",
"shrinkDatabaseDescription": "Sprožitev podatkovne zbirke VACUUM za SQLite. Če je vaša zbirka podatkov ustvarjena po različici 1.10.0, je funkcija AUTO_VACUUM že omogočena in ta ukrep ni potreben.",
"serwersms": "SerwerSMS.pl", "serwersms": "SerwerSMS.pl",
"serwersmsAPIUser": "API uporabniško ime (vključno z webapi_ prefix)", "serwersmsAPIUser": "API uporabniško ime (vključno z webapi_ prefix)",
"serwersmsAPIPassword": "API geslo", "serwersmsAPIPassword": "API geslo",

@ -145,7 +145,6 @@
"clearDataOlderThan": "Behåll övervakarhistoriksdata i {0} dagar.", "clearDataOlderThan": "Behåll övervakarhistoriksdata i {0} dagar.",
"steamApiKeyDescription": "För att övervaka en Steam Game Server behöver man en Steam Web-API nyckel. Du kan registrera din API nyckel här: ", "steamApiKeyDescription": "För att övervaka en Steam Game Server behöver man en Steam Web-API nyckel. Du kan registrera din API nyckel här: ",
"No Monitors": "Inga övervakare", "No Monitors": "Inga övervakare",
"shrinkDatabaseDescription": "Utlös databasdammsugning för SQLite. Om din databas skapades efter 1.10.0, AUTO_VACUUM är redan aktiverat och detta behövs inte.",
"proxyDescription": "Proxyservrar måste tilldelas en övervakare för att fungera.", "proxyDescription": "Proxyservrar måste tilldelas en övervakare för att fungera.",
"setAsDefaultProxyDescription": "Denna proxyserver kommer att aktiveras som standard för nya övervakare. Du kan fortfarande inaktivera proxyserven var för sig övervakare.", "setAsDefaultProxyDescription": "Denna proxyserver kommer att aktiveras som standard för nya övervakare. Du kan fortfarande inaktivera proxyserven var för sig övervakare.",
"Content Type": "Innehållstyp", "Content Type": "Innehållstyp",

@ -303,7 +303,6 @@
"Discard": "విస్మరించండి", "Discard": "విస్మరించండి",
"Cancel": "రద్దు చేయండి", "Cancel": "రద్దు చేయండి",
"Check/Uncheck": "చెక్/చెక్చేయవద్దు", "Check/Uncheck": "చెక్/చెక్చేయవద్దు",
"shrinkDatabaseDescription": "SQLite కోసం డేటాబేస్ VACUUMని ట్రిగ్గర్ చేయండి. మీ డేటాబేస్ 1.10.0 తర్వాత సృష్టించబడితే, AUTO_VACUUM ఇప్పటికే ప్రారంభించబడింది మరియు ఈ చర్య అవసరం లేదు.",
"setAsDefault": "డిఫాల్ట్ సెట్ చేయబడింది", "setAsDefault": "డిఫాల్ట్ సెట్ చేయబడింది",
"deleteProxyMsg": "మీరు ఖచ్చితంగా అన్ని మానిటర్‌ల కోసం ఈ ప్రాక్సీని తొలగించాలనుకుంటున్నారా?", "deleteProxyMsg": "మీరు ఖచ్చితంగా అన్ని మానిటర్‌ల కోసం ఈ ప్రాక్సీని తొలగించాలనుకుంటున్నారా?",
"proxyDescription": "పనిచేయడానికి ప్రాక్సీలు తప్పనిసరిగా మానిటర్‌కు కేటాయించబడాలి.", "proxyDescription": "పనిచేయడానికి ప్రాక్సీలు తప్పనిసరిగా మానిటర్‌కు కేటాయించబడాలి.",

@ -355,7 +355,6 @@
"Discard": "ทิ้ง", "Discard": "ทิ้ง",
"Cancel": "ยกเลิก", "Cancel": "ยกเลิก",
"Powered by": "ขับเคลื่อนโดย", "Powered by": "ขับเคลื่อนโดย",
"shrinkDatabaseDescription": "ทริกเกอร์ฐานข้อมูล VACUUM สำหรับ SQLite หากฐานข้อมูลของคุณถูกสร้างขึ้นหลังจากเวอร์ชั่น 1.10.0 แสดงว่า AUTO_VACUUM เปิดใช้งานอยู่แล้วและไม่จำเป็นต้องดำเนินการนี้",
"serwersms": "SerwerSMS.pl", "serwersms": "SerwerSMS.pl",
"serwersmsAPIUser": "API Username (incl. webapi_ prefix)", "serwersmsAPIUser": "API Username (incl. webapi_ prefix)",
"serwersmsAPIPassword": "API Password", "serwersmsAPIPassword": "API Password",

@ -351,7 +351,6 @@
"Discard": "İptal Et", "Discard": "İptal Et",
"Cancel": "İptal Et", "Cancel": "İptal Et",
"Powered by": "Tarafından desteklenmektedir", "Powered by": "Tarafından desteklenmektedir",
"shrinkDatabaseDescription": "SQLite için veritabanı VACUUM'unu tetikleyin. Veritabanınız 1.10.0'dan sonra oluşturulduysa, AUTO_VACUUM zaten etkinleştirilmiştir ve bu eyleme gerek yoktur.",
"serwersms": "SerwerSMS.pl", "serwersms": "SerwerSMS.pl",
"serwersmsAPIUser": "API Kullanıcı Adı (webapi_ öneki dahil)", "serwersmsAPIUser": "API Kullanıcı Adı (webapi_ öneki dahil)",
"serwersmsAPIPassword": "API Şifre", "serwersmsAPIPassword": "API Şifre",
@ -990,5 +989,66 @@
"wayToGetThreemaGateway": "Threema Gateway {0}'e kaydolabilirsiniz.", "wayToGetThreemaGateway": "Threema Gateway {0}'e kaydolabilirsiniz.",
"threemaRecipientTypeIdentityFormat": "8 karakter", "threemaRecipientTypeIdentityFormat": "8 karakter",
"threemaRecipientTypePhoneFormat": "E.164, başında + olmadan", "threemaRecipientTypePhoneFormat": "E.164, başında + olmadan",
"apiKeysDisabledMsg": "Kimlik doğrulama devre dışı olduğundan API anahtarları devre dışı bırakıldı." "apiKeysDisabledMsg": "Kimlik doğrulama devre dışı olduğundan API anahtarları devre dışı bırakıldı.",
"now": "Şimdi",
"time ago": "{0} önce",
"-year": "-yıl",
"Json Query Expression": "JSON Sorgu İfadesi",
"and": "ve",
"cacheBusterParam": "{0} parametresini ekleyin",
"cacheBusterParamDescription": "Önbellekleri atlamak için rastgele oluşturulmuş parametre.",
"Community String": "Topluluk Metni",
"snmpCommunityStringHelptext": "Bu metin, SNMP özellikli cihazlara erişimi doğrulamak ve kontrol etmek için bir şifre işlevi görür. Bunu SNMP cihazınızın yapılandırmasıyla eşleştirin.",
"OID (Object Identifier)": "OID (Nesne Tanımlayıcı)",
"snmpOIDHelptext": "İzlemek istediğiniz sensörün veya durumun OID'sini girin. OID'den emin değilseniz MIB tarayıcıları veya SNMP yazılımı gibi ağ yönetimi araçlarını kullanın.",
"Condition": "Koşul",
"SNMP Version": "SNMP Sürümü",
"Please enter a valid OID.": "Lütfen geçerli bir OID girin.",
"groupOnesenderDesc": "Gruba mesaj göndermek için, GroupID değerinin geçerli olduğundan emin olun. Örneğin: 628123456789-342345",
"Group ID": "Grup Kimliği",
"wayToGetOnesenderUrlandToken": "Onesender web sitesine giderek URL'yi ve Jetonu alabilirsiniz. Daha fazla bilgi için {0}",
"Add Remote Browser": "Uzak Tarayıcı Ekle",
"New Group": "Yeni Grup",
"Host Onesender": "Onesender Host Adresi",
"Token Onesender": "Onesender Jetonu",
"Group Name": "Grup Adı",
"OAuth2: Client Credentials": "OAuth2: İstemci Kimlik Bilgileri",
"Recipient Type": "Alıcı Türü",
"Private Number": "Özel Numara",
"Authentication Method": "Kimlik Doğrulama Yöntemi",
"privateOnesenderDesc": "Özel numaralı telefona mesaj göndermek için, telefon numarasının geçerli olduğundan emin olun. Örneğin: 628123456789",
"Authorization Header": "Yetkilendirme Başlığı",
"Form Data Body": "Form Veri Gövdesi",
"Go back to home page.": "Ana sayfaya geri dönün.",
"No tags found.": "Etiket bulunamadı.",
"Lost connection to the socket server.": "Soket sunucusuyla bağlantı kesildi.",
"Cannot connect to the socket server.": "Soket sunucusuna bağlanılamıyor.",
"SIGNL4": "SIGNL4",
"SIGNL4 Webhook URL": "SIGNL4 Web Kancası URL'si",
"OAuth Token URL": "OAuth Jetonu URL'si",
"Client ID": "İstemci Kimliği",
"Client Secret": "İstemci Jetonu",
"OAuth Scope": "OAuth Kapsamı",
"Optional: Space separated list of scopes": "İsteğe bağlı: Kapsamların boşlukla ayrılmış listesi",
"signl4Docs": "SIGNL4'ün nasıl yapılandırılacağı ve SIGNL4 web kancası URL'sinin nasıl elde edileceği hakkında daha fazla bilgiyi {0} içinde bulabilirsiniz.",
"not contains": "içermez/içermiyor",
"starts with": "başlar/başlıyor",
"equals": "eşit",
"not starts with": "ile başlamaz",
"not equals": "eşit değil",
"contains": "içerir",
"conditionDeleteGroup": "Grubu Sil",
"conditionValuePlaceholder": "Değer",
"Conditions": "Koşullar",
"conditionAdd": "Koşul Ekle",
"conditionDelete": "Koşul Sil",
"conditionAddGroup": "Grup Ekle",
"ends with": "ile biter",
"not ends with": "ile bitmiyor",
"less than or equal to": "küçük veya eşit",
"greater than": "daha büyük",
"less than": "daha küçük",
"greater than or equal to": "büyük veya eşit",
"record": "kayıt",
"jsonQueryDescription": "JSON sorgusunu kullanarak sunucunun JSON yanıtından belirli verileri ayrıştırın ve çıkarın. JSON beklemiyorsanız ham yanıt için \"$\" sembolünü kullanın. Sonuç daha sonra metin olarak beklenen değerle karşılaştırılır. Belgeler için {0}'a bakın ve sorgularla denemeler yapmak için {1}'i kullanın."
} }

@ -338,7 +338,6 @@
"About": "Про програму", "About": "Про програму",
"Description": "Опис", "Description": "Опис",
"Powered by": "Працює на основі скрипту від", "Powered by": "Працює на основі скрипту від",
"shrinkDatabaseDescription": "Включає VACUUM для бази даних SQLite. Якщо база даних була створена після версії 1.10.0, AUTO_VACUUM вже включений і ця дія не потрібна.",
"Style": "Стиль", "Style": "Стиль",
"info": "ІНФО", "info": "ІНФО",
"warning": "УВАГА", "warning": "УВАГА",
@ -996,5 +995,66 @@
"threemaRecipientTypeIdentityFormat": "8 символів", "threemaRecipientTypeIdentityFormat": "8 символів",
"threemaSenderIdentityFormat": "8 символів, зазвичай починається з *", "threemaSenderIdentityFormat": "8 символів, зазвичай починається з *",
"threemaBasicModeInfo": "Примітка: Ця інтеграція використовує Threema Gateway у базовому режимі (шифрування на основі сервера). Більш детальну інформацію можна знайти {0}.", "threemaBasicModeInfo": "Примітка: Ця інтеграція використовує Threema Gateway у базовому режимі (шифрування на основі сервера). Більш детальну інформацію можна знайти {0}.",
"apiKeysDisabledMsg": "API-ключі вимкнено, оскільки автентифікація вимкнена." "apiKeysDisabledMsg": "API-ключі вимкнено, оскільки автентифікація вимкнена.",
"jsonQueryDescription": "Розбір і вилучення конкретних даних з JSON-відповіді сервера за допомогою JSON-запиту або використання символу «$» для необробленої відповіді, якщо не очікується JSON. Результат порівнюється з очікуваним значенням у вигляді рядків. Дивіться {0} для отримання документації і використовуйте {1} для експериментів із запитами.",
"snmpCommunityStringHelptext": "Цей рядок слугує паролем для автентифікації та контролю доступу до пристроїв з підтримкою SNMP. Узгодьте його з конфігурацією вашого SNMP-пристрою.",
"snmpOIDHelptext": "Введіть OID для датчика або стану, який ви хочете моніторити. Якщо ви не впевнені щодо OID, скористайтеся інструментами керування мережею, як-от MIB-браузерами або програмним забезпеченням SNMP.",
"wayToGetOnesenderUrlandToken": "Ви можете отримати URL-адресу і токен, перейшовши на сайт Onesender. Більше інформації {0}",
"conditionValuePlaceholder": "Значення",
"not equals": "не дорівнює",
"not ends with": "не закінчується на",
"and": "і",
"Private Number": "Приватний номер",
"signl4Docs": "Ви можете знайти більше інформації про те, як налаштувати SIGNL4 і як отримати URL-адресу вебхука SIGNL4 в розділі {0}.",
"now": "зараз",
"time ago": "{0} тому",
"-year": "-рік",
"Json Query Expression": "Вираз запиту Json",
"cacheBusterParam": "Додати параметр {0}",
"cacheBusterParamDescription": "Випадково згенерований параметр для обходу кешування.",
"OID (Object Identifier)": "OID (ідентифікатор об'єкта)",
"Condition": "Умова",
"SNMP Version": "Версія SNMP",
"Please enter a valid OID.": "Будь ласка, введіть дійсний OID.",
"privateOnesenderDesc": "Переконайтеся, що номер телефону дійсний. Щоб надіслати повідомлення на приватний номер телефону, наприклад: 628123456789",
"groupOnesenderDesc": "Переконайтеся, що GroupID дійсний. Щоб надіслати повідомлення в Групу, наприклад: 628123456789-342345",
"Add Remote Browser": "Додати віддалений браузер",
"New Group": "Нова група",
"Group Name": "Назва групи",
"Group ID": "ID групи",
"OAuth2: Client Credentials": "OAuth2: Облікові дані клієнта",
"Authentication Method": "Метод автентифікації",
"Authorization Header": "Заголовок авторизації",
"OAuth Token URL": "URL-адреса токену OAuth",
"Community String": "Рядок спільноти",
"Host Onesender": "Хост Onesender",
"Token Onesender": "Токен Onesender",
"Recipient Type": "Тип отримувача",
"Form Data Body": "Тіло даних форми",
"Client ID": "ID клієнта",
"Client Secret": "Секрет клієнта",
"Go back to home page.": "Повернутися на головну сторінку.",
"No tags found.": "Тегів не знайдено.",
"Lost connection to the socket server.": "Втрачено з'єднання з сервером сокетів.",
"Cannot connect to the socket server.": "Не вдається з'єднатися з сервером сокетів.",
"Conditions": "Умови",
"conditionAdd": "Додати умову",
"conditionDelete": "Видалити умову",
"conditionAddGroup": "Додати групу",
"conditionDeleteGroup": "Видалити групу",
"OAuth Scope": "OAuth дозволи",
"Optional: Space separated list of scopes": "Необов'язково: Розділений пробілами список дозволів",
"SIGNL4": "SIGNL4",
"SIGNL4 Webhook URL": "URL-адреса вебхука SIGNL4",
"equals": "дорівнює",
"contains": "містить",
"not contains": "не містить",
"starts with": "починається з",
"not starts with": "не починається з",
"ends with": "закінчується на",
"less than": "менше, ніж",
"greater than": "більше, ніж",
"less than or equal to": "менше або дорівнює",
"greater than or equal to": "більше або дорівнює",
"record": "запис"
} }

@ -109,7 +109,6 @@
"Passive Monitor Type": "غیر فعال مانیٹر کی قسم", "Passive Monitor Type": "غیر فعال مانیٹر کی قسم",
"No important events": "کوئی اہم واقعات نہیں", "No important events": "کوئی اہم واقعات نہیں",
"-hour": "-گھنٹہ", "-hour": "-گھنٹہ",
"shrinkDatabaseDescription": "SQLite کے لیے ڈیٹا بیس ویکیوم کو متحرک کریں۔ اگر آپ کا ڈیٹا بیس 1.10.0 کے بعد بنتا ہے، تو AUTO_VACUUM پہلے ہی فعال ہے اور اس کارروائی کی ضرورت نہیں ہے۔",
"goAlertIntegrationKeyInfo": "اس فارمیٹ میں سروس کے لیے عام API انٹیگریشن کلید حاصل کریں \"aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeee\" عام طور پر کاپی شدہ URL کے ٹوکن پیرامیٹر کی قدر۔", "goAlertIntegrationKeyInfo": "اس فارمیٹ میں سروس کے لیے عام API انٹیگریشن کلید حاصل کریں \"aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeee\" عام طور پر کاپی شدہ URL کے ٹوکن پیرامیٹر کی قدر۔",
"Sms template must contain parameters: ": "ایس ایم ایس ٹیمپلیٹ میں پیرامیٹرز ہونا ضروری ہے: ", "Sms template must contain parameters: ": "ایس ایم ایس ٹیمپلیٹ میں پیرامیٹرز ہونا ضروری ہے: ",
"Keyword": "کلیدی لفظ", "Keyword": "کلیدی لفظ",

@ -80,8 +80,8 @@
"pushOptionalParams": "Tham số tuỳ chọn: {0}", "pushOptionalParams": "Tham số tuỳ chọn: {0}",
"Save": "Lưu", "Save": "Lưu",
"Notifications": "Thông báo", "Notifications": "Thông báo",
"Not available, please setup.": "Chưa sẵn sàng, hãy cài đặt.", "Not available, please setup.": "Không tồn tại, hãy cài đặt.",
"Setup Notification": "Cài đặt thông báo", "Setup Notification": "Thiết lập thông báo",
"Light": "Sáng", "Light": "Sáng",
"Dark": "Tối", "Dark": "Tối",
"Auto": "Tự động", "Auto": "Tự động",
@ -150,7 +150,7 @@
"Options": "Tuỳ chọn", "Options": "Tuỳ chọn",
"Keep both": "Giữ lại cả hai", "Keep both": "Giữ lại cả hai",
"Verify Token": "Xác minh Token", "Verify Token": "Xác minh Token",
"Setup 2FA": "Cài đặt xác thực 2 lớp (2FA)", "Setup 2FA": "Thiết lập xác thực 2 lớp (2FA)",
"Enable 2FA": "Bật xác thực 2 lớp (2FA)", "Enable 2FA": "Bật xác thực 2 lớp (2FA)",
"Disable 2FA": "Tắt xác thực 2 lớp (2FA)", "Disable 2FA": "Tắt xác thực 2 lớp (2FA)",
"2FA Settings": "Cài đặt xác thực 2 lớp (2FA)", "2FA Settings": "Cài đặt xác thực 2 lớp (2FA)",
@ -355,7 +355,6 @@
"Discard": "Bỏ", "Discard": "Bỏ",
"Cancel": "Hủy", "Cancel": "Hủy",
"Powered by": "Được cung cấp bởi", "Powered by": "Được cung cấp bởi",
"shrinkDatabaseDescription": "Khởi chạy database VACCUM cho SQLite. Nếu database được tạo sau version 1.10.0, AUTO_VACCUM đã được bật sẵn, hành động này không cần thiết.",
"serwersms": "SerwerSMS.pl", "serwersms": "SerwerSMS.pl",
"serwersmsAPIUser": "API Username (incl. webapi_ prefix)", "serwersmsAPIUser": "API Username (incl. webapi_ prefix)",
"serwersmsAPIPassword": "API Password", "serwersmsAPIPassword": "API Password",
@ -451,7 +450,7 @@
"Issuer:": "Issuer:", "Issuer:": "Issuer:",
"Fingerprint:": "Fingerprint:", "Fingerprint:": "Fingerprint:",
"No status pages": "No status pages", "No status pages": "No status pages",
"Domain Name Expiry Notification": "Cảnh báo hạn hạn Domain Name", "Domain Name Expiry Notification": "Cảnh báo hết hạn tên miền",
"Proxy": "Proxy", "Proxy": "Proxy",
"Date Created": "Ngày khởi tạo", "Date Created": "Ngày khởi tạo",
"onebotHttpAddress": "OneBot HTTP Address", "onebotHttpAddress": "OneBot HTTP Address",
@ -504,7 +503,7 @@
"resendDisabled": "Vô hiệu hoá gửi phản hồi liên tục", "resendDisabled": "Vô hiệu hoá gửi phản hồi liên tục",
"resendEveryXTimes": "Gửi phản hồi mỗi {0} lần", "resendEveryXTimes": "Gửi phản hồi mỗi {0} lần",
"setupDatabaseMariaDB": "Kết nối tới một cơ sở dữ liệu MariaDB bên ngoài. Bạn cần cấu hình thông tin kết nối cơ sở dữ liệu.", "setupDatabaseMariaDB": "Kết nối tới một cơ sở dữ liệu MariaDB bên ngoài. Bạn cần cấu hình thông tin kết nối cơ sở dữ liệu.",
"setupDatabaseChooseDatabase": "Bạn muốn dùng cơ sở dữ liệu nào?", "setupDatabaseChooseDatabase": "Bạn muốn dùng loại cơ sở dữ liệu nào?",
"setupDatabaseEmbeddedMariaDB": "Bạn không cần phải cài đặt bất cứ thứ gì. Docker image đã nhúng và cấu hình tự động cơ sở dữ liệu MariaDB cho bạn. Uptime Kuma sẽ kết nối tới cơ sở dữ liệu thông qua unix socket.", "setupDatabaseEmbeddedMariaDB": "Bạn không cần phải cài đặt bất cứ thứ gì. Docker image đã nhúng và cấu hình tự động cơ sở dữ liệu MariaDB cho bạn. Uptime Kuma sẽ kết nối tới cơ sở dữ liệu thông qua unix socket.",
"setupDatabaseSQLite": "Một tệp cơ sở dữ liệu đơn giản, được khuyên dùng cho quy mô triển khai nhỏ. Trước v2.0.0, Uptime Kuma sử dụng SQLite như là một cơ sở dữ liệu mặc định.", "setupDatabaseSQLite": "Một tệp cơ sở dữ liệu đơn giản, được khuyên dùng cho quy mô triển khai nhỏ. Trước v2.0.0, Uptime Kuma sử dụng SQLite như là một cơ sở dữ liệu mặc định.",
"dbName": "Tên cơ sở dữ liệu", "dbName": "Tên cơ sở dữ liệu",
@ -522,5 +521,39 @@
"styleElapsedTime": "Thời gian đã qua dưới thanh trạng thái", "styleElapsedTime": "Thời gian đã qua dưới thanh trạng thái",
"styleElapsedTimeShowNoLine": "Hiển Thị (Không Dòng Kẻ)", "styleElapsedTimeShowNoLine": "Hiển Thị (Không Dòng Kẻ)",
"styleElapsedTimeShowWithLine": "Hiển Thị (Có Dòng Kẻ)", "styleElapsedTimeShowWithLine": "Hiển Thị (Có Dòng Kẻ)",
"Request Timeout": "Yêu cầu hết hạn" "Request Timeout": "Yêu cầu hết hạn",
"now": "hiện tại",
"Add a new expiry notification day": "Thêm ngày hết hạn",
"time ago": "đã qua {0} giây",
"There might be a typing error in the address.": "Có lỗi trong quá trình nhập địa chỉ",
"DockerHostRequired": "Vui lòng đặt Docker Host cho trang giám sát này",
"templateMsg": "Tin nhắn",
"-year": "-năm",
"filterActive": "Hoạt động",
"filterActivePaused": "Tạm dừng",
"Search monitored sites": "Tìm kiếm trang",
"Reset Token": "Thiết lập lại Token",
"Remove the expiry notification": "Xóa ngày hết hạn",
"API Username": "Tên người dùng API",
"Also check beta release": "Hãy kiểm tra bản beta",
"Check/Uncheck": "Chọn/Bỏ chọn",
"API Key": "mã API",
"Coming Soon": "Sắp tới",
"Query": "Tìm kiếm",
"Setup Docker Host": "Thiết lập máy chủ Docker",
"Connection Type": "Loại kết nối",
"Docker Daemon": "Trình nền docker",
"noDockerHostMsg": "Không tồn tại. Vui lòng thiết lập máy chủ Docker trước",
"Host URL": "URL Máy chủ",
"Footer Text": "Chân trang",
"Refresh Interval": "Tốc độ làm mới",
"Refresh Interval Description": "Trang status sẽ tự làm mới mỗi {0} giây",
"Connection String": "Chuỗi kết nối",
"settingsCertificateExpiry": "Ngày hết hạn chứng chỉ TLS",
"ignoreTLSErrorGeneral": "Bỏ qua lỗi TLS/SSL cho kết nối",
"Select": "Chọn",
"selectedMonitorCount": "Đã chọn: {0}",
"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": "nhập hostname của server bạn muốn kết nối hoặc {localhost} nếu bạn muốn dùng {local_mta}",
"webhookBodyPresetOption": "Cài đặt sẵn",
"critical": "nguy kịch"
} }

@ -385,7 +385,6 @@
"Discard": "放弃", "Discard": "放弃",
"Cancel": "取消", "Cancel": "取消",
"Powered by": "本站使用", "Powered by": "本站使用",
"shrinkDatabaseDescription": "触发 SQLite 数据库的 VACUUM 命令,如果您的数据库是在 1.10.0 版本之后创建的,则已启用 AUTO_VACUUM不再需要此操作。",
"serwersms": "SerwerSMS.pl", "serwersms": "SerwerSMS.pl",
"serwersmsAPIUser": "API 用户名(包括 webapi_ 前缀)", "serwersmsAPIUser": "API 用户名(包括 webapi_ 前缀)",
"serwersmsAPIPassword": "API 密码", "serwersmsAPIPassword": "API 密码",
@ -780,7 +779,7 @@
"Badge Label Color": "徽章标签颜色", "Badge Label Color": "徽章标签颜色",
"Show Clickable Link Description": "勾选后所有能访问本状态页的访客均可查看该监控项网址。", "Show Clickable Link Description": "勾选后所有能访问本状态页的访客均可查看该监控项网址。",
"Show Clickable Link": "显示可点击的监控项链接", "Show Clickable Link": "显示可点击的监控项链接",
"Group": "组", "Group": "组",
"Monitor Group": "监控项组", "Monitor Group": "监控项组",
"Cannot connect to the socket server": "无法连接到后端服务器", "Cannot connect to the socket server": "无法连接到后端服务器",
"Reconnecting...": "重连中……", "Reconnecting...": "重连中……",
@ -992,5 +991,66 @@
"threemaBasicModeInfo": "注:此通知类型所使用的 Threema 网关为基础模式(服务器端加密)。更多细节参见 {0}。", "threemaBasicModeInfo": "注:此通知类型所使用的 Threema 网关为基础模式(服务器端加密)。更多细节参见 {0}。",
"threemaRecipientTypePhoneFormat": "E.164 标准,不含前导 + 号", "threemaRecipientTypePhoneFormat": "E.164 标准,不含前导 + 号",
"wayToGetThreemaGateway": "你可以在 {0} 注册 Threema 网关。", "wayToGetThreemaGateway": "你可以在 {0} 注册 Threema 网关。",
"apiKeysDisabledMsg": "由于登录验证被禁用API 密钥也被禁用。" "apiKeysDisabledMsg": "由于登录验证被禁用API 密钥也被禁用。",
"now": "现在",
"Json Query Expression": "JSON 查询表达式",
"and": "与",
"cacheBusterParam": "添加参数 {0}",
"cacheBusterParamDescription": "随机生成一个参数以绕过缓存。",
"Community String": "SNMP 通讯字符串",
"snmpCommunityStringHelptext": "此字符串用作密码以验证和控制对SNMP启用设备的访问。请将其与您的SNMP设备配置匹配。",
"Please enter a valid OID.": "请输入一个合法的 OID。",
"privateOnesenderDesc": "请确保电话号码有效。要向私人电话号码发送消息格式形如628123456789",
"wayToGetOnesenderUrlandToken": "你可以在 Onesender 网站获取地址和令牌。更多信息参见 {0}",
"signl4Docs": "你可以在此找到更多关于如何配置 SIGNL4 以及如何获取 SIGNL4 Webhook 地址的信息:{0}。",
"groupOnesenderDesc": "请确保分组 ID 有效。要向分组发送消息格式形如628123456789-342345",
"time ago": "{0} 之前",
"-year": "年",
"OID (Object Identifier)": "OID对象标识符",
"snmpOIDHelptext": "输入您想监控的传感器或状态的 OID。如果您不确定 OID 是什么,可以使用 MIB 浏览器或 SNMP 软件等网络管理工具进行查找。",
"Condition": "条件",
"SNMP Version": "SNMP 版本",
"Host Onesender": "Onesender 服务器",
"Token Onesender": "Onesender 令牌",
"Recipient Type": "收件人类型",
"Private Number": "私密号码",
"Add Remote Browser": "添加远程浏览器",
"OAuth2: Client Credentials": "OAuth2客户端凭据",
"Authentication Method": "鉴权方式",
"Authorization Header": "鉴权请求头",
"Form Data Body": "表单数据请求体",
"OAuth Token URL": "OAuth 令牌地址",
"Client ID": "客户端 ID",
"Client Secret": "客户端秘钥",
"OAuth Scope": "OAuth 范围",
"New Group": "新分组",
"Group ID": "分组 ID",
"Group Name": "分组名称",
"Optional: Space separated list of scopes": "可选项:用空格分隔的范围列表",
"Go back to home page.": "返回到首页。",
"No tags found.": "未找到标签。",
"Lost connection to the socket server.": "与 socket 服务器的连接丢失。",
"Cannot connect to the socket server.": "无法连接到 socket 服务器。",
"SIGNL4": "SIGNL4",
"SIGNL4 Webhook URL": "SIGNL4 Webhook 地址",
"Conditions": "条件",
"conditionAdd": "添加条件",
"conditionDelete": "删除条件",
"conditionAddGroup": "添加分组",
"conditionDeleteGroup": "删除分组",
"conditionValuePlaceholder": "值",
"equals": "相等",
"not equals": "不相等",
"contains": "包含",
"not contains": "不包含",
"starts with": "以此开头",
"not starts with": "不以此开头",
"ends with": "以此结尾",
"not ends with": "不以此结尾",
"less than": "少于",
"greater than": "多于",
"less than or equal to": "不多于",
"greater than or equal to": "不少于",
"record": "记录",
"jsonQueryDescription": "使用 JSON 查询解析并提取服务器 JSON 响应中的特定数据,或者,如果不期望得到 JSON 响应,则可使用 \"$\" 获取原始响应。然后将结果转为字符串并与期望值进行字符串比较。有关更多文档,请参阅 {0},亦可使用 {1} 来尝试查询。"
} }

@ -47,7 +47,7 @@
"Retries": "重試數次確定為離線", "Retries": "重試數次確定為離線",
"retriesDescription": "重試多少次後才判定為離線及傳送通知。如數值為 0 會即判定為離線及傳送通知。", "retriesDescription": "重試多少次後才判定為離線及傳送通知。如數值為 0 會即判定為離線及傳送通知。",
"Advanced": "進階", "Advanced": "進階",
"ignoreTLSError": "忽略 TLS/SSL 錯誤", "ignoreTLSError": "忽略 HTTPS 網站的 TLS/SSL 錯誤",
"Upside Down Mode": "反轉模式", "Upside Down Mode": "反轉模式",
"upsideDownModeDescription": "反轉狀態,如網址是可正常瀏覽,會被判定為 '離線/DOWN'", "upsideDownModeDescription": "反轉狀態,如網址是可正常瀏覽,會被判定為 '離線/DOWN'",
"Max. Redirects": "跟隨重新導向 (Redirect) 的次數", "Max. Redirects": "跟隨重新導向 (Redirect) 的次數",
@ -56,7 +56,7 @@
"acceptedStatusCodesDescription": "可多選", "acceptedStatusCodesDescription": "可多選",
"Save": "儲存", "Save": "儲存",
"Notifications": "通知", "Notifications": "通知",
"Not available, please setup.": "無法使用,需要設定", "Not available, please setup.": "無法使用,需要設定",
"Setup Notification": "設定通知", "Setup Notification": "設定通知",
"Light": "明亮", "Light": "明亮",
"Dark": "暗黑", "Dark": "暗黑",
@ -353,7 +353,6 @@
"Services": "服務", "Services": "服務",
"Discard": "捨棄", "Discard": "捨棄",
"Cancel": "取消", "Cancel": "取消",
"shrinkDatabaseDescription": "觸發 SQLite 的資料庫清理 (VACUUM)。如果您的資料庫是在 1.10.0 版本後建立AUTO_VACUUM 已自動啟用,則無需此操作。",
"serwersms": "SerwerSMS.pl", "serwersms": "SerwerSMS.pl",
"serwersmsAPIUser": "API 使用者名稱 (包括 webapi_ 前綴)", "serwersmsAPIUser": "API 使用者名稱 (包括 webapi_ 前綴)",
"serwersmsAPIPassword": "API 密碼", "serwersmsAPIPassword": "API 密碼",
@ -738,7 +737,7 @@
"selectedMonitorCount": "已選:{0}", "selectedMonitorCount": "已選:{0}",
"Check/Uncheck": "選取中/取消選取", "Check/Uncheck": "選取中/取消選取",
"telegramMessageThreadIDDescription": "(可選) Telegram 在超級群組使用的話題標識字串", "telegramMessageThreadIDDescription": "(可選) Telegram 在超級群組使用的話題標識字串",
"pushViewCode": "查看代碼", "pushViewCode": "如何使用 Push 監控?(檢視程式碼)",
"pushOthers": "其他", "pushOthers": "其他",
"webhookBodyCustomOption": "自定義內容", "webhookBodyCustomOption": "自定義內容",
"tailscalePingWarning": "如要使用 Tailscale Ping ,您需要以非 docker 方式安裝 Uptime Kuma並在系統安裝 Tailscale 客戶端。", "tailscalePingWarning": "如要使用 Tailscale Ping ,您需要以非 docker 方式安裝 Uptime Kuma並在系統安裝 Tailscale 客戶端。",
@ -758,5 +757,8 @@
"timeoutAfter": "{0} 秒後為超時", "timeoutAfter": "{0} 秒後為超時",
"settingUpDatabaseMSG": "正在設定資料庫。可能需要一段時間,請耐心等待。", "settingUpDatabaseMSG": "正在設定資料庫。可能需要一段時間,請耐心等待。",
"Host URL": "主機網址", "Host URL": "主機網址",
"locally configured mail transfer agent": "本機設定的郵件傳輸代理" "locally configured mail transfer agent": "本機設定的郵件傳輸代理",
"now": "現在",
"time ago": "{0} 之前",
"ignoreTLSErrorGeneral": "忽略連接中的TLS/SSL錯誤"
} }

@ -378,7 +378,6 @@
"Discard": "捨棄", "Discard": "捨棄",
"Cancel": "取消", "Cancel": "取消",
"Powered by": "技術支援", "Powered by": "技術支援",
"shrinkDatabaseDescription": "觸發 SQLite 的資料庫清理 (VACUUM)。如果您的資料庫是在 1.10.0 版本後建立AUTO_VACUUM 已自動啟用,則無需此操作。",
"serwersms": "SerwerSMS.pl", "serwersms": "SerwerSMS.pl",
"serwersmsAPIUser": "API 使用者名稱 (包括 webapi_ 前綴)", "serwersmsAPIUser": "API 使用者名稱 (包括 webapi_ 前綴)",
"serwersmsAPIPassword": "API 密碼", "serwersmsAPIPassword": "API 密碼",

@ -141,19 +141,23 @@ export default {
}); });
socket.on("monitorList", (data) => { socket.on("monitorList", (data) => {
// Add Helper function this.assignMonitorUrlParser(data);
Object.entries(data).forEach(([ monitorID, monitor ]) => {
monitor.getUrl = () => {
try {
return new URL(monitor.url);
} catch (_) {
return null;
}
};
});
this.monitorList = data; this.monitorList = data;
}); });
socket.on("updateMonitorIntoList", (data) => {
this.assignMonitorUrlParser(data);
Object.entries(data).forEach(([ monitorID, updatedMonitor ]) => {
this.monitorList[monitorID] = updatedMonitor;
});
});
socket.on("deleteMonitorFromList", (monitorID) => {
if (this.monitorList[monitorID]) {
delete this.monitorList[monitorID];
}
});
socket.on("monitorTypeList", (data) => { socket.on("monitorTypeList", (data) => {
this.monitorTypeList = data; this.monitorTypeList = data;
}); });
@ -289,6 +293,23 @@ export default {
location.reload(); location.reload();
}); });
}, },
/**
* parse all urls from list.
* @param {object} data Monitor data to modify
* @returns {object} list
*/
assignMonitorUrlParser(data) {
Object.entries(data).forEach(([ monitorID, monitor ]) => {
monitor.getUrl = () => {
try {
return new URL(monitor.url);
} catch (_) {
return null;
}
};
});
return data;
},
/** /**
* The storage currently in use * The storage currently in use

@ -565,8 +565,8 @@
<h2 v-if="monitor.type !== 'push'" class="mt-5 mb-2">{{ $t("Advanced") }}</h2> <h2 v-if="monitor.type !== 'push'" class="mt-5 mb-2">{{ $t("Advanced") }}</h2>
<div v-if="monitor.type === 'http' || monitor.type === 'keyword' || monitor.type === 'json-query' " class="my-3 form-check"> <div v-if="monitor.type === 'http' || monitor.type === 'keyword' || monitor.type === 'json-query' " class="my-3 form-check" :title="monitor.ignoreTls ? $t('ignoredTLSError') : ''">
<input id="expiry-notification" v-model="monitor.expiryNotification" class="form-check-input" type="checkbox"> <input id="expiry-notification" v-model="monitor.expiryNotification" class="form-check-input" type="checkbox" :disabled="monitor.ignoreTls">
<label class="form-check-label" for="expiry-notification"> <label class="form-check-label" for="expiry-notification">
{{ $t("Certificate Expiry Notification") }} {{ $t("Certificate Expiry Notification") }}
</label> </label>
@ -982,13 +982,23 @@
<div class="fixed-bottom-bar p-3"> <div class="fixed-bottom-bar p-3">
<button <button
id="monitor-submit-btn" id="monitor-submit-btn"
class="btn btn-primary" class="btn btn-primary me-2"
type="submit" type="submit"
:disabled="processing" :disabled="processing"
data-testid="save-button" data-testid="save-button"
> >
{{ $t("Save") }} {{ $t("Save") }}
</button> </button>
<button
v-if="monitor.type === 'http'"
id="monitor-debug-btn"
class="btn btn-outline-primary"
type="button"
:disabled="processing"
@click.stop="modal.show()"
>
{{ $t("Debug") }}
</button>
</div> </div>
</div> </div>
</form> </form>
@ -1000,9 +1010,58 @@
<RemoteBrowserDialog ref="remoteBrowserDialog" /> <RemoteBrowserDialog ref="remoteBrowserDialog" />
</div> </div>
</transition> </transition>
<div ref="modal" class="modal fade" tabindex="-1">
<div class="modal-dialog modal-dialog-centered">
<div class="modal-content">
<div class="modal-body">
<textarea id="curl-debug" v-model="curlCommand" class="form-control mb-3" readonly wrap="off"></textarea>
<button id="debug-copy-btn" class="btn btn-outline-primary position-absolute top-0 end-0 mt-3 me-3 border-0" type="button" @click.stop="copyToClipboard">
<font-awesome-icon icon="copy" />
</button>
<i18n-t keypath="CurlDebugInfo" tag="p" class="form-text">
<template #newiline>
<br>
</template>
<template #firewalls>
<a href="https://xkcd.com/2259/" target="_blank">{{ $t('firewalls') }}</a>
</template>
<template #dns_resolvers>
<a href="https://www.reddit.com/r/sysadmin/comments/rxho93/thank_you_for_the_running_its_always_dns_joke_its/" target="_blank">{{ $t('dns resolvers') }}</a>
</template>
<template #docker_networks>
<a href="https://youtu.be/bKFMS5C4CG0" target="_blank">{{ $t('docker networks') }}</a>
</template>
</i18n-t>
<div v-if="monitor.authMethod === 'oauth2-cc'" class="alert alert-warning d-flex align-items-center gap-2" role="alert">
<div role="img" aria-label="Warning:"></div>
<i18n-t keypath="CurlDebugInfoOAuth2CCUnsupported" tag="div">
<template #curl>
<code>curl</code>
</template>
<template #newline>
<br>
</template>
<template #oauth2_bearer>
<code>--oauth2-bearer TOKEN</code>
</template>
</i18n-t>
</div>
<div v-if="monitor.proxyId" class="alert alert-warning d-flex align-items-center gap-2" role="alert">
<div role="img" aria-label="Warning:"></div>
<i18n-t keypath="CurlDebugInfoProxiesUnsupported" tag="div">
<template #curl>
<code>curl</code>
</template>
</i18n-t>
</div>
</div>
</div>
</div>
</div>
</template> </template>
<script> <script>
import { Modal } from "bootstrap";
import VueMultiselect from "vue-multiselect"; import VueMultiselect from "vue-multiselect";
import { useToast } from "vue-toastification"; import { useToast } from "vue-toastification";
import ActionSelect from "../components/ActionSelect.vue"; import ActionSelect from "../components/ActionSelect.vue";
@ -1017,8 +1076,10 @@ import { genSecret, isDev, MAX_INTERVAL_SECOND, MIN_INTERVAL_SECOND, sleep } fro
import { hostNameRegexPattern } from "../util-frontend"; import { hostNameRegexPattern } from "../util-frontend";
import HiddenInput from "../components/HiddenInput.vue"; import HiddenInput from "../components/HiddenInput.vue";
import EditMonitorConditions from "../components/EditMonitorConditions.vue"; import EditMonitorConditions from "../components/EditMonitorConditions.vue";
import { version } from "../../package.json";
const userAgent = `'Uptime-Kuma/${version}'`;
const toast = useToast; const toast = useToast();
const pushTokenLength = 32; const pushTokenLength = 32;
@ -1081,6 +1142,7 @@ export default {
data() { data() {
return { return {
modal: null,
minInterval: MIN_INTERVAL_SECOND, minInterval: MIN_INTERVAL_SECOND,
maxInterval: MAX_INTERVAL_SECOND, maxInterval: MAX_INTERVAL_SECOND,
processing: false, processing: false,
@ -1108,6 +1170,53 @@ export default {
computed: { computed: {
curlCommand() {
const command = [ "curl", "--verbose", "--head", "--request", this.monitor.method, "\\\n", "--user-agent", userAgent, "\\\n" ];
if (this.monitor.ignoreTls) {
command.push("--insecure", "\\\n");
}
if (this.monitor.headers) {
try {
// trying to parse the supplied data as json to trim whitespace
for (const [ key, value ] of Object.entries(JSON.parse(this.monitor.headers))) {
command.push("--header", `'${key}: ${value}'`, "\\\n");
}
} catch (e) {
command.push("--header", `'${this.monitor.headers}'`, "\\\n");
}
}
if (this.monitor.authMethod === "basic") {
command.push("--user", `${this.monitor.basic_auth_user}:${this.monitor.basic_auth_pass}`, "--basic", "\\\n");
} else if (this.monitor.authmethod === "mtls") {
command.push("--cacert", `'${this.monitor.tlsCa}'`, "\\\n", "--key", `'${this.monitor.tlsKey}'`, "\\\n", "--cert", `'${this.monitor.tlsCert}'`, "\\\n");
} else if (this.monitor.authMethod === "ntlm") {
command.push("--user", `'${this.monitor.authDomain ? `${this.monitor.authDomain}/` : ""}${this.monitor.basic_auth_user}:${this.monitor.basic_auth_pass}'`, "--ntlm", "\\\n");
}
if (this.monitor.body && this.monitor.httpBodyEncoding === "json") {
let json = "";
try {
// trying to parse the supplied data as json to trim whitespace
json = JSON.stringify(JSON.parse(this.monitor.body));
} catch (e) {
json = this.monitor.body;
}
command.push("--header", "'Content-Type: application/json'", "\\\n", "--data", `'${json}'`, "\\\n");
} else if (this.monitor.body && this.monitor.httpBodyEncoding === "xml") {
command.push("--headers", "'Content-Type: application/xml'", "\\\n", "--data", `'${this.monitor.body}'`, "\\\n");
}
if (this.monitor.maxredirects) {
command.push("--location", "--max-redirs", this.monitor.maxredirects, "\\\n");
}
if (this.monitor.timeout) {
command.push("--max-time", this.monitor.timeout, "\\\n");
}
if (this.monitor.maxretries) {
command.push("--retry", this.monitor.maxretries, "\\\n");
}
command.push("--url", this.monitor.url);
return command.join(" ");
},
ipRegex() { ipRegex() {
// Allow to test with simple dns server with port (127.0.0.1:5300) // Allow to test with simple dns server with port (127.0.0.1:5300)
@ -1456,8 +1565,15 @@ message HealthCheckResponse {
} }
this.monitor.game = newGameObject.keys[0]; this.monitor.game = newGameObject.keys[0];
}, },
"monitor.ignoreTls"(newVal) {
if (newVal) {
this.monitor.expiryNotification = false;
}
},
}, },
mounted() { mounted() {
this.modal = new Modal(this.$refs.modal);
this.init(); this.init();
let acceptedStatusCodeOptions = [ let acceptedStatusCodeOptions = [
@ -1498,6 +1614,14 @@ message HealthCheckResponse {
this.kafkaSaslMechanismOptions = kafkaSaslMechanismOptions; this.kafkaSaslMechanismOptions = kafkaSaslMechanismOptions;
}, },
methods: { methods: {
async copyToClipboard() {
try {
await navigator.clipboard.writeText(this.curlCommand);
toast.success(this.$t("CopyToClipboardSuccess"));
} catch (err) {
toast.error(this.$t("CopyToClipboardError", { error: err.message }));
}
},
/** /**
* Initialize the edit monitor form * Initialize the edit monitor form
* @returns {void} * @returns {void}
@ -1689,7 +1813,6 @@ message HealthCheckResponse {
await this.startParentGroupMonitor(); await this.startParentGroupMonitor();
} }
this.processing = false; this.processing = false;
this.$root.getMonitorList();
this.$router.push("/dashboard/" + res.monitorID); this.$router.push("/dashboard/" + res.monitorID);
} else { } else {
this.processing = false; this.processing = false;
@ -1786,4 +1909,9 @@ message HealthCheckResponse {
textarea { textarea {
min-height: 200px; min-height: 200px;
} }
#curl-debug {
font-family: monospace;
overflow: auto;
}
</style> </style>

@ -68,15 +68,17 @@ const routes = [
}, },
], ],
}, },
{ ],
path: "/clone/:id",
component: EditMonitor,
}, },
{ {
path: "/add", path: "/add",
component: EditMonitor, component: EditMonitor,
children: [
{
path: "/clone/:id",
component: EditMonitor,
}, },
], ]
}, },
{ {
path: "/list", path: "/list",

@ -83,6 +83,7 @@ exports.CONSOLE_STYLE_BgMagenta = "\x1b[45m";
exports.CONSOLE_STYLE_BgCyan = "\x1b[46m"; exports.CONSOLE_STYLE_BgCyan = "\x1b[46m";
exports.CONSOLE_STYLE_BgWhite = "\x1b[47m"; exports.CONSOLE_STYLE_BgWhite = "\x1b[47m";
exports.CONSOLE_STYLE_BgGray = "\x1b[100m"; exports.CONSOLE_STYLE_BgGray = "\x1b[100m";
const consoleModuleColors = [ const consoleModuleColors = [
exports.CONSOLE_STYLE_FgCyan, exports.CONSOLE_STYLE_FgCyan,
exports.CONSOLE_STYLE_FgGreen, exports.CONSOLE_STYLE_FgGreen,

@ -1,8 +1,22 @@
import { expect, test } from "@playwright/test"; import { expect, test } from "@playwright/test";
import { login, restoreSqliteSnapshot, screenshot } from "../util-test"; import { login, restoreSqliteSnapshot, screenshot } from "../util-test";
test.describe("Monitor Form", () => { /**
* Selects the monitor type from the dropdown.
* @param {import('@playwright/test').Page} page - The Playwright page instance.
* @param {string} monitorType - The monitor type to select (default is "dns").
* @returns {Promise<void>} - A promise that resolves when the monitor type is selected.
*/
async function selectMonitorType(page, monitorType = "dns") {
const monitorTypeSelect = page.getByTestId("monitor-type-select");
await expect(monitorTypeSelect).toBeVisible();
await monitorTypeSelect.selectOption(monitorType);
const selectedValue = await monitorTypeSelect.evaluate((select) => select.value);
expect(selectedValue).toBe(monitorType);
}
test.describe("Monitor Form", () => {
test.beforeEach(async ({ page }) => { test.beforeEach(async ({ page }) => {
await restoreSqliteSnapshot(page); await restoreSqliteSnapshot(page);
}); });
@ -11,30 +25,20 @@ test.describe("Monitor Form", () => {
await page.goto("./add"); await page.goto("./add");
await login(page); await login(page);
await screenshot(testInfo, page); await screenshot(testInfo, page);
await selectMonitorType(page);
const monitorTypeSelect = page.getByTestId("monitor-type-select");
await expect(monitorTypeSelect).toBeVisible();
await monitorTypeSelect.selectOption("dns");
const selectedValue = await monitorTypeSelect.evaluate(select => select.value);
expect(selectedValue).toBe("dns");
// Add Conditions & verify:
await page.getByTestId("add-condition-button").click(); await page.getByTestId("add-condition-button").click();
expect(await page.getByTestId("condition").count()).toEqual(2); // 1 added by default + 1 explicitly added expect(await page.getByTestId("condition").count()).toEqual(2); // 1 added by default + 1 explicitly added
// Add a Condition Group & verify:
await page.getByTestId("add-group-button").click(); await page.getByTestId("add-group-button").click();
expect(await page.getByTestId("condition-group").count()).toEqual(1); expect(await page.getByTestId("condition-group").count()).toEqual(1);
expect(await page.getByTestId("condition").count()).toEqual(3); // 2 solo conditions + 1 condition in group expect(await page.getByTestId("condition").count()).toEqual(3); // 2 solo conditions + 1 condition in group
await screenshot(testInfo, page); await screenshot(testInfo, page);
// Remove a condition & verify:
await page.getByTestId("remove-condition").first().click(); await page.getByTestId("remove-condition").first().click();
expect(await page.getByTestId("condition").count()).toEqual(2); // 1 solo condition + 1 condition in group expect(await page.getByTestId("condition").count()).toEqual(2); // 1 solo condition + 1 condition in group
// Remove a condition group & verify:
await page.getByTestId("remove-condition-group").first().click(); await page.getByTestId("remove-condition-group").first().click();
expect(await page.getByTestId("condition-group").count()).toEqual(0); expect(await page.getByTestId("condition-group").count()).toEqual(0);
@ -45,33 +49,29 @@ test.describe("Monitor Form", () => {
await page.goto("./add"); await page.goto("./add");
await login(page); await login(page);
await screenshot(testInfo, page); await screenshot(testInfo, page);
await selectMonitorType(page);
const monitorTypeSelect = page.getByTestId("monitor-type-select");
await expect(monitorTypeSelect).toBeVisible();
await monitorTypeSelect.selectOption("dns");
const selectedValue = await monitorTypeSelect.evaluate(select => select.value);
expect(selectedValue).toBe("dns");
const friendlyName = "Example DNS NS"; const friendlyName = "Example DNS NS";
await page.getByTestId("friendly-name-input").fill(friendlyName); await page.getByTestId("friendly-name-input").fill(friendlyName);
await page.getByTestId("hostname-input").fill("example.com"); await page.getByTestId("hostname-input").fill("example.com");
// Vue-Multiselect component
const resolveTypeSelect = page.getByTestId("resolve-type-select"); const resolveTypeSelect = page.getByTestId("resolve-type-select");
await resolveTypeSelect.click(); await resolveTypeSelect.click();
await resolveTypeSelect.getByRole("option", { name: "NS" }).click(); await resolveTypeSelect.getByRole("option", { name: "NS" }).click();
await page.getByTestId("add-condition-button").click(); await page.getByTestId("add-condition-button").click();
expect(await page.getByTestId("condition").count()).toEqual(2); // 1 added by default + 1 explicitly added expect(await page.getByTestId("condition").count()).toEqual(2); // 1 added by default + 1 explicitly added
await page.getByTestId("condition-value").nth(0).fill("a.iana-servers.net"); await page.getByTestId("condition-value").nth(0).fill("a.iana-servers.net");
await page.getByTestId("condition-and-or").nth(0).selectOption("or"); await page.getByTestId("condition-and-or").nth(0).selectOption("or");
await page.getByTestId("condition-value").nth(1).fill("b.iana-servers.net"); await page.getByTestId("condition-value").nth(1).fill("b.iana-servers.net");
await screenshot(testInfo, page);
await screenshot(testInfo, page);
await page.getByTestId("save-button").click(); await page.getByTestId("save-button").click();
await page.waitForURL("/dashboard/*"); // wait for the monitor to be created await page.waitForURL("/dashboard/*");
await expect(page.getByTestId("monitor-status")).toHaveText("up", { ignoreCase: true });
expect(page.getByTestId("monitor-status")).toHaveText("up", { ignoreCase: true });
await screenshot(testInfo, page); await screenshot(testInfo, page);
}); });
@ -79,31 +79,26 @@ test.describe("Monitor Form", () => {
await page.goto("./add"); await page.goto("./add");
await login(page); await login(page);
await screenshot(testInfo, page); await screenshot(testInfo, page);
await selectMonitorType(page);
const monitorTypeSelect = page.getByTestId("monitor-type-select");
await expect(monitorTypeSelect).toBeVisible();
await monitorTypeSelect.selectOption("dns");
const selectedValue = await monitorTypeSelect.evaluate(select => select.value);
expect(selectedValue).toBe("dns");
const friendlyName = "Example DNS NS"; const friendlyName = "Example DNS NS";
await page.getByTestId("friendly-name-input").fill(friendlyName); await page.getByTestId("friendly-name-input").fill(friendlyName);
await page.getByTestId("hostname-input").fill("example.com"); await page.getByTestId("hostname-input").fill("example.com");
// Vue-Multiselect component
const resolveTypeSelect = page.getByTestId("resolve-type-select"); const resolveTypeSelect = page.getByTestId("resolve-type-select");
await resolveTypeSelect.click(); await resolveTypeSelect.click();
await resolveTypeSelect.getByRole("option", { name: "NS" }).click(); await resolveTypeSelect.getByRole("option", { name: "NS" }).click();
expect(await page.getByTestId("condition").count()).toEqual(1); // 1 added by default expect(await page.getByTestId("condition").count()).toEqual(1); // 1 added by default
await page.getByTestId("condition-value").nth(0).fill("definitely-not.net"); await page.getByTestId("condition-value").nth(0).fill("definitely-not.net");
await screenshot(testInfo, page);
await screenshot(testInfo, page);
await page.getByTestId("save-button").click(); await page.getByTestId("save-button").click();
await page.waitForURL("/dashboard/*"); // wait for the monitor to be created await page.waitForURL("/dashboard/*");
await expect(page.getByTestId("monitor-status")).toHaveText("down", { ignoreCase: true });
expect(page.getByTestId("monitor-status")).toHaveText("down", { ignoreCase: true });
await screenshot(testInfo, page); await screenshot(testInfo, page);
}); });
}); });

@ -5,6 +5,10 @@ test.describe("Uptime Kuma Setup", () => {
test.skip(() => getSqliteDatabaseExists(), "Must only run once per session"); test.skip(() => getSqliteDatabaseExists(), "Must only run once per session");
test.afterEach(async ({ page }, testInfo) => {
await screenshot(testInfo, page);
});
/* /*
* Setup * Setup
*/ */
@ -15,10 +19,9 @@ test.describe("Uptime Kuma Setup", () => {
await page.getByRole("button", { name: "Next" }).click(); await page.getByRole("button", { name: "Next" }).click();
await screenshot(testInfo, page); await screenshot(testInfo, page);
await page.waitForURL("/setup"); // ensures the server is ready to continue to the next test await page.waitForURL("/setup"); // ensures the server is ready to continue to the next test
await screenshot(testInfo, page);
}); });
test("setup admin", async ({ page }, testInfo) => { test("setup admin", async ({ page }) => {
await page.goto("./"); await page.goto("./");
await page.getByPlaceholder("Username").click(); await page.getByPlaceholder("Username").click();
await page.getByPlaceholder("Username").fill("admin"); await page.getByPlaceholder("Username").fill("admin");
@ -27,30 +30,26 @@ test.describe("Uptime Kuma Setup", () => {
await page.getByPlaceholder("Password", { exact: true }).press("Tab"); await page.getByPlaceholder("Password", { exact: true }).press("Tab");
await page.getByPlaceholder("Repeat Password").fill("admin123"); await page.getByPlaceholder("Repeat Password").fill("admin123");
await page.getByRole("button", { name: "Create" }).click(); await page.getByRole("button", { name: "Create" }).click();
await screenshot(testInfo, page);
}); });
/* /*
* All other tests should be run after setup * All other tests should be run after setup
*/ */
test("login", async ({ page }, testInfo) => { test("login", async ({ page }) => {
await page.goto("./dashboard"); await page.goto("./dashboard");
await login(page); await login(page);
await screenshot(testInfo, page);
}); });
test("logout", async ({ page }, testInfo) => { test("logout", async ({ page }) => {
await page.goto("./dashboard"); await page.goto("./dashboard");
await login(page); await login(page);
await page.getByText("A", { exact: true }).click(); await page.getByText("A", { exact: true }).click();
await page.getByRole("button", { name: "Log out" }).click(); await page.getByRole("button", { name: "Log out" }).click();
await screenshot(testInfo, page);
}); });
test("take sqlite snapshot", async ({ page }, testInfo) => { test("take sqlite snapshot", async ({ page }) => {
await takeSqliteSnapshot(page); await takeSqliteSnapshot(page);
await screenshot(testInfo, page);
}); });
}); });

@ -95,7 +95,7 @@ test.describe("Status Page", () => {
await expect(page.getByTestId("powered-by")).toHaveCount(0); await expect(page.getByTestId("powered-by")).toHaveCount(0);
await expect(page.getByTestId("update-countdown-text")).toContainText("00:"); await expect(page.getByTestId("update-countdown-text")).toContainText("00:");
const updateCountdown = Number((await page.getByTestId("update-countdown-text").textContent()).match(/(\d+):(\d+)/)[2]) ; const updateCountdown = Number((await page.getByTestId("update-countdown-text").textContent()).match(/(\d+):(\d+)/)[2]);
expect(updateCountdown).toBeGreaterThanOrEqual(refreshInterval); // cant be certain when the timer will start, so ensure it's within expected range expect(updateCountdown).toBeGreaterThanOrEqual(refreshInterval); // cant be certain when the timer will start, so ensure it's within expected range
expect(updateCountdown).toBeLessThanOrEqual(refreshInterval + 10); expect(updateCountdown).toBeLessThanOrEqual(refreshInterval + 10);

@ -1,10 +1,10 @@
const fs = require("fs"); const fs = require("fs");
const rmSync = require("../extra/fs-rmSync.js");
const path = "./data/test"; const path = "./data/test";
if (fs.existsSync(path)) { if (fs.existsSync(path)) {
rmSync(path, { fs.rmSync(path, {
recursive: true, recursive: true,
force: true,
}); });
} }

Loading…
Cancel
Save