Merge branch 'master' into feat/friendly-name

This commit is contained in:
Frank Elsinga 2025-05-08 10:59:46 +02:00 committed by GitHub
commit bb3f8262f4
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
47 changed files with 1095 additions and 231 deletions

View file

@ -380,39 +380,6 @@ class Monitor extends BeanModel {
if (await Monitor.isUnderMaintenance(this.id)) { if (await Monitor.isUnderMaintenance(this.id)) {
bean.msg = "Monitor under maintenance"; bean.msg = "Monitor under maintenance";
bean.status = MAINTENANCE; bean.status = MAINTENANCE;
} else if (this.type === "group") {
const children = await Monitor.getChildren(this.id);
if (children.length > 0) {
bean.status = UP;
bean.msg = "All children up and running";
for (const child of children) {
if (!child.active) {
// Ignore inactive childs
continue;
}
const lastBeat = await Monitor.getPreviousHeartbeat(child.id);
// Only change state if the monitor is in worse conditions then the ones before
// lastBeat.status could be null
if (!lastBeat) {
bean.status = PENDING;
} else if (bean.status === UP && (lastBeat.status === PENDING || lastBeat.status === DOWN)) {
bean.status = lastBeat.status;
} else if (bean.status === PENDING && lastBeat.status === DOWN) {
bean.status = lastBeat.status;
}
}
if (bean.status !== UP) {
bean.msg = "Child inaccessible";
}
} else {
// Set status pending if group is empty
bean.status = PENDING;
bean.msg = "Group empty";
}
} else if (this.type === "http" || this.type === "keyword" || this.type === "json-query") { } else if (this.type === "http" || this.type === "keyword" || this.type === "json-query") {
// Do not do any queries/high loading things before the "bean.ping" // Do not do any queries/high loading things before the "bean.ping"
let startTime = dayjs().valueOf(); let startTime = dayjs().valueOf();
@ -1327,7 +1294,8 @@ class Monitor extends BeanModel {
try { try {
const heartbeatJSON = bean.toJSON(); const heartbeatJSON = bean.toJSON();
const monitorData = [{ id: monitor.id, const monitorData = [{ id: monitor.id,
active: monitor.active active: monitor.active,
name: monitor.name
}]; }];
const preloadData = await Monitor.preparePreloadData(monitorData); 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.
@ -1625,7 +1593,7 @@ class Monitor extends BeanModel {
/** /**
* Gets all Children of the monitor * Gets all Children of the monitor
* @param {number} monitorID ID of monitor to get * @param {number} monitorID ID of monitor to get
* @returns {Promise<LooseObject<any>>} Children * @returns {Promise<LooseObject<any>[]>} Children
*/ */
static async getChildren(monitorID) { static async getChildren(monitorID) {
return await R.getAll(` return await R.getAll(`

View file

@ -0,0 +1,49 @@
const { UP, PENDING, DOWN } = require("../../src/util");
const { MonitorType } = require("./monitor-type");
const Monitor = require("../model/monitor");
class GroupMonitorType extends MonitorType {
name = "group";
/**
* @inheritdoc
*/
async check(monitor, heartbeat, _server) {
const children = await Monitor.getChildren(monitor.id);
if (children.length > 0) {
heartbeat.status = UP;
heartbeat.msg = "All children up and running";
for (const child of children) {
if (!child.active) {
// Ignore inactive childs
continue;
}
const lastBeat = await Monitor.getPreviousHeartbeat(child.id);
// Only change state if the monitor is in worse conditions then the ones before
// lastBeat.status could be null
if (!lastBeat) {
heartbeat.status = PENDING;
} else if (heartbeat.status === UP && (lastBeat.status === PENDING || lastBeat.status === DOWN)) {
heartbeat.status = lastBeat.status;
} else if (heartbeat.status === PENDING && lastBeat.status === DOWN) {
heartbeat.status = lastBeat.status;
}
}
if (heartbeat.status !== UP) {
heartbeat.msg = "Child inaccessible";
}
} else {
// Set status pending if group is empty
heartbeat.status = PENDING;
heartbeat.msg = "Group empty";
}
}
}
module.exports = {
GroupMonitorType,
};

View file

@ -46,10 +46,10 @@ class Discord extends NotificationProvider {
name: "Service Name", name: "Service Name",
value: monitorJSON["name"], value: monitorJSON["name"],
}, },
{ ...(!notification.disableUrl ? [{
name: monitorJSON["type"] === "push" ? "Service Type" : "Service URL", name: monitorJSON["type"] === "push" ? "Service Type" : "Service URL",
value: this.extractAddress(monitorJSON), value: this.extractAddress(monitorJSON),
}, }] : []),
{ {
name: `Time (${heartbeatJSON["timezone"]})`, name: `Time (${heartbeatJSON["timezone"]})`,
value: heartbeatJSON["localDateTime"], value: heartbeatJSON["localDateTime"],
@ -83,10 +83,10 @@ class Discord extends NotificationProvider {
name: "Service Name", name: "Service Name",
value: monitorJSON["name"], value: monitorJSON["name"],
}, },
{ ...(!notification.disableUrl ? [{
name: monitorJSON["type"] === "push" ? "Service Type" : "Service URL", name: monitorJSON["type"] === "push" ? "Service Type" : "Service URL",
value: this.extractAddress(monitorJSON), value: this.extractAddress(monitorJSON),
}, }] : []),
{ {
name: `Time (${heartbeatJSON["timezone"]})`, name: `Time (${heartbeatJSON["timezone"]})`,
value: heartbeatJSON["localDateTime"], value: heartbeatJSON["localDateTime"],

View file

@ -79,13 +79,11 @@ class Mattermost extends NotificationProvider {
fallback: fallback:
"Your " + "Your " +
monitorJSON.pathName + monitorJSON.pathName +
monitorJSON.name +
" service went " + " service went " +
statusText, statusText,
color: color, color: color,
title: title:
monitorJSON.pathName + monitorJSON.pathName +
monitorJSON.name +
" service went " + " service went " +
statusText, statusText,
title_link: monitorJSON.url, title_link: monitorJSON.url,

View file

@ -0,0 +1,73 @@
const NotificationProvider = require("./notification-provider");
const axios = require("axios");
const { DOWN, UP } = require("../../src/util");
class OneChat extends NotificationProvider {
name = "OneChat";
/**
* @inheritdoc
*/
async send(notification, msg, monitorJSON = null, heartbeatJSON = null) {
const okMsg = "Sent Successfully.";
const url = "https://chat-api.one.th/message/api/v1/push_message";
try {
const config = {
headers: {
"Content-Type": "application/json",
Authorization: "Bearer " + notification.accessToken,
},
};
if (heartbeatJSON == null) {
const testMessage = {
to: notification.recieverId,
bot_id: notification.botId,
type: "text",
message: "Test Successful!",
};
await axios.post(url, testMessage, config);
} else if (heartbeatJSON["status"] === DOWN) {
const downMessage = {
to: notification.recieverId,
bot_id: notification.botId,
type: "text",
message:
`UptimeKuma Alert:
[🔴 Down]
Name: ${monitorJSON["name"]}
${heartbeatJSON["msg"]}
Time (${heartbeatJSON["timezone"]}): ${heartbeatJSON["localDateTime"]}`,
};
await axios.post(url, downMessage, config);
} else if (heartbeatJSON["status"] === UP) {
const upMessage = {
to: notification.recieverId,
bot_id: notification.botId,
type: "text",
message:
`UptimeKuma Alert:
[🟢 Up]
Name: ${monitorJSON["name"]}
${heartbeatJSON["msg"]}
Time (${heartbeatJSON["timezone"]}): ${heartbeatJSON["localDateTime"]}`,
};
await axios.post(url, upMessage, config);
}
return okMsg;
} catch (error) {
// Handle errors and throw a descriptive message
if (error.response) {
const errorMessage =
error.response.data?.message ||
"Unknown API error occurred.";
throw new Error(`OneChat API Error: ${errorMessage}`);
} else {
this.throwGeneralAxiosError(error);
}
}
}
}
module.exports = OneChat;

View file

@ -0,0 +1,48 @@
const NotificationProvider = require("./notification-provider");
const axios = require("axios");
const { UP } = require("../../src/util");
class Pumble extends NotificationProvider {
name = "pumble";
/**
* @inheritDoc
*/
async send(notification, msg, monitorJSON = null, heartbeatJSON = null) {
const okMsg = "Sent Successfully.";
try {
if (heartbeatJSON === null && monitorJSON === null) {
let data = {
"attachments": [
{
"title": "Uptime Kuma Alert",
"text": msg,
"color": "#5BDD8B"
}
]
};
await axios.post(notification.webhookURL, data);
return okMsg;
}
let data = {
"attachments": [
{
"title": `${monitorJSON["name"]} is ${heartbeatJSON["status"] === UP ? "up" : "down"}`,
"text": heartbeatJSON["msg"],
"color": (heartbeatJSON["status"] === UP ? "#5BDD8B" : "#DC3645"),
}
]
};
await axios.post(notification.webhookURL, data);
return okMsg;
} catch (error) {
this.throwGeneralAxiosError(error);
}
}
}
module.exports = Pumble;

View file

@ -1,5 +1,6 @@
const { getMonitorRelativeURL } = require("../../src/util"); const { getMonitorRelativeURL } = require("../../src/util");
const { setting } = require("../util-server"); const { setting } = require("../util-server");
const { UP } = require("../../src/util");
const NotificationProvider = require("./notification-provider"); const NotificationProvider = require("./notification-provider");
const axios = require("axios"); const axios = require("axios");
@ -43,15 +44,20 @@ class Pushover extends NotificationProvider {
if (heartbeatJSON == null) { if (heartbeatJSON == null) {
await axios.post(url, data); await axios.post(url, data);
return okMsg; return okMsg;
} else {
data.message += `\n<b>Time (${heartbeatJSON["timezone"]})</b>:${heartbeatJSON["localDateTime"]}`;
await axios.post(url, data);
return okMsg;
} }
if (heartbeatJSON.status === UP && notification.pushoversounds_up) {
// default = DOWN => DOWN-sound is also played for non-UP/DOWN notiifcations
data.sound = notification.pushoversounds_up;
}
data.message += `\n<b>Time (${heartbeatJSON["timezone"]})</b>: ${heartbeatJSON["localDateTime"]}`;
await axios.post(url, data);
return okMsg;
} catch (error) { } catch (error) {
this.throwGeneralAxiosError(error); this.throwGeneralAxiosError(error);
} }
} }
} }

View file

@ -145,6 +145,7 @@ class Slack extends NotificationProvider {
const title = "Uptime Kuma Alert"; const title = "Uptime Kuma Alert";
let data = { let data = {
"text": msg,
"channel": notification.slackchannel, "channel": notification.slackchannel,
"username": notification.slackusername, "username": notification.slackusername,
"icon_emoji": notification.slackiconemo, "icon_emoji": notification.slackiconemo,

View file

@ -0,0 +1,40 @@
const NotificationProvider = require("./notification-provider");
const axios = require("axios");
class SMSPlanet extends NotificationProvider {
name = "SMSPlanet";
/**
* @inheritdoc
*/
async send(notification, msg, monitorJSON = null, heartbeatJSON = null) {
const okMsg = "Sent Successfully.";
const url = "https://api2.smsplanet.pl/sms";
try {
let config = {
headers: {
"Authorization": "Bearer " + notification.smsplanetApiToken,
"content-type": "multipart/form-data"
}
};
let data = {
"from": notification.smsplanetSenderName,
"to": notification.smsplanetPhoneNumbers,
"msg": msg.replace(/🔴/, "❌")
};
let response = await axios.post(url, data, config);
if (!response.data?.messageId) {
throw new Error(response.data?.errorMsg ?? "SMSPlanet server did not respond with the expected result");
}
return okMsg;
} catch (error) {
this.throwGeneralAxiosError(error);
}
}
}
module.exports = SMSPlanet;

View file

@ -11,59 +11,127 @@ class SMSEagle extends NotificationProvider {
const okMsg = "Sent Successfully."; const okMsg = "Sent Successfully.";
try { try {
let config = { if (notification.smseagleApiType === "smseagle-apiv1") { // according to https://www.smseagle.eu/apiv1/
headers: { let config = {
"Content-Type": "application/json", headers: {
"Content-Type": "application/x-www-form-urlencoded",
}
};
let sendMethod;
let recipientType;
let duration;
let voiceId;
if (notification.smseagleRecipientType === "smseagle-contact") {
recipientType = "contactname";
sendMethod = "/send_tocontact";
} else if (notification.smseagleRecipientType === "smseagle-group") {
recipientType = "groupname";
sendMethod = "/send_togroup";
} else if (notification.smseagleRecipientType === "smseagle-to") {
recipientType = "to";
sendMethod = "/send_sms";
if (notification.smseagleMsgType !== "smseagle-sms") {
duration = notification.smseagleDuration ?? 10;
if (notification.smseagleMsgType === "smseagle-ring") {
sendMethod = "/ring_call";
} else if (notification.smseagleMsgType === "smseagle-tts") {
sendMethod = "/tts_call";
} else if (notification.smseagleMsgType === "smseagle-tts-advanced") {
sendMethod = "/tts_adv_call";
voiceId = notification.smseagleTtsModel ? notification.smseagleTtsModel : 1;
}
}
} }
};
let postData; const url = new URL(notification.smseagleUrl + "/http_api" + sendMethod);
let sendMethod;
let recipientType;
let encoding = (notification.smseagleEncoding) ? "1" : "0"; url.searchParams.append("access_token", notification.smseagleToken);
let priority = (notification.smseaglePriority) ? notification.smseaglePriority : "0"; url.searchParams.append(recipientType, notification.smseagleRecipient);
if (!notification.smseagleRecipientType || notification.smseagleRecipientType === "smseagle-sms") {
if (notification.smseagleRecipientType === "smseagle-contact") { url.searchParams.append("unicode", (notification.smseagleEncoding) ? "1" : "0");
recipientType = "contactname"; url.searchParams.append("highpriority", notification.smseaglePriority ?? "0");
sendMethod = "sms.send_tocontact";
}
if (notification.smseagleRecipientType === "smseagle-group") {
recipientType = "groupname";
sendMethod = "sms.send_togroup";
}
if (notification.smseagleRecipientType === "smseagle-to") {
recipientType = "to";
sendMethod = "sms.send_sms";
}
let params = {
access_token: notification.smseagleToken,
[recipientType]: notification.smseagleRecipient,
message: msg,
responsetype: "extended",
unicode: encoding,
highpriority: priority
};
postData = {
method: sendMethod,
params: params
};
let resp = await axios.post(notification.smseagleUrl + "/jsonrpc/sms", postData, config);
if ((JSON.stringify(resp.data)).indexOf("message_id") === -1) {
let error = "";
if (resp.data.result && resp.data.result.error_text) {
error = `SMSEagle API returned error: ${JSON.stringify(resp.data.result.error_text)}`;
} else { } else {
error = "SMSEagle API returned an unexpected response"; url.searchParams.append("duration", duration);
}
if (notification.smseagleRecipientType !== "smseagle-ring") {
url.searchParams.append("message", msg);
}
if (voiceId) {
url.searchParams.append("voice_id", voiceId);
} }
throw new Error(error);
}
return okMsg; let resp = await axios.get(url.toString(), config);
if (resp.data.indexOf("OK") === -1) {
let error = `SMSEagle API returned error: ${resp.data}`;
throw new Error(error);
}
return okMsg;
} else if (notification.smseagleApiType === "smseagle-apiv2") { // according to https://www.smseagle.eu/docs/apiv2/
let config = {
headers: {
"access-token": notification.smseagleToken,
"Content-Type": "application/json",
}
};
let encoding = (notification.smseagleEncoding) ? "unicode" : "standard";
let priority = (notification.smseaglePriority) ?? 0;
let postData = {
text: msg,
encoding: encoding,
priority: priority
};
if (notification.smseagleRecipientContact) {
postData["contacts"] = notification.smseagleRecipientContact.split(",").map(Number);
}
if (notification.smseagleRecipientGroup) {
postData["groups"] = notification.smseagleRecipientGroup.split(",").map(Number);
}
if (notification.smseagleRecipientTo) {
postData["to"] = notification.smseagleRecipientTo.split(",");
}
let endpoint = "/messages/sms";
if (notification.smseagleMsgType !== "smseagle-sms") {
postData["duration"] = notification.smseagleDuration ?? 10;
if (notification.smseagleMsgType === "smseagle-ring") {
endpoint = "/calls/ring";
} else if (notification.smseagleMsgType === "smseagle-tts") {
endpoint = "/calls/tts";
} else if (notification.smseagleMsgType === "smseagle-tts-advanced") {
endpoint = "/calls/tts_advanced";
postData["voice_id"] = notification.smseagleTtsModel ?? 1;
}
}
let resp = await axios.post(notification.smseagleUrl + "/api/v2" + endpoint, postData, config);
const queuedCount = resp.data.filter(x => x.status === "queued").length;
const unqueuedCount = resp.data.length - queuedCount;
if (resp.status !== 200 || queuedCount === 0) {
if (!resp.data.length) {
throw new Error("SMSEagle API returned an empty response");
}
throw new Error(`SMSEagle API returned error: ${JSON.stringify(resp.data)}`);
}
if (unqueuedCount) {
return `Sent ${queuedCount}/${resp.data.length} Messages Successfully.`;
}
return okMsg;
}
} catch (error) { } catch (error) {
this.throwGeneralAxiosError(error); this.throwGeneralAxiosError(error);
} }

View file

@ -42,6 +42,7 @@ class SMTP extends NotificationProvider {
// default values in case the user does not want to template // default values in case the user does not want to template
let subject = msg; let subject = msg;
let body = msg; let body = msg;
let useHTMLBody = false;
if (heartbeatJSON) { if (heartbeatJSON) {
body = `${msg}\nTime (${heartbeatJSON["timezone"]}): ${heartbeatJSON["localDateTime"]}`; body = `${msg}\nTime (${heartbeatJSON["timezone"]}): ${heartbeatJSON["localDateTime"]}`;
} }
@ -50,11 +51,11 @@ class SMTP extends NotificationProvider {
// cannot end with whitespace as this often raises spam scores // cannot end with whitespace as this often raises spam scores
const customSubject = notification.customSubject?.trim() || ""; const customSubject = notification.customSubject?.trim() || "";
const customBody = notification.customBody?.trim() || ""; const customBody = notification.customBody?.trim() || "";
if (customSubject !== "") { if (customSubject !== "") {
subject = await this.renderTemplate(customSubject, msg, monitorJSON, heartbeatJSON); subject = await this.renderTemplate(customSubject, msg, monitorJSON, heartbeatJSON);
} }
if (customBody !== "") { if (customBody !== "") {
useHTMLBody = notification.htmlBody || false;
body = await this.renderTemplate(customBody, msg, monitorJSON, heartbeatJSON); body = await this.renderTemplate(customBody, msg, monitorJSON, heartbeatJSON);
} }
} }
@ -67,7 +68,8 @@ class SMTP extends NotificationProvider {
bcc: notification.smtpBCC, bcc: notification.smtpBCC,
to: notification.smtpTo, to: notification.smtpTo,
subject: subject, subject: subject,
text: body, // If the email body is custom, and the user wants it, set the email body as HTML
[useHTMLBody ? "html" : "text"]: body
}); });
return okMsg; return okMsg;

View file

@ -0,0 +1,37 @@
const NotificationProvider = require("./notification-provider");
const axios = require("axios");
const { DOWN, UP } = require("../../src/util");
class SpugPush extends NotificationProvider {
name = "SpugPush";
/**
* @inheritdoc
*/
async send(notification, msg, monitorJSON = null, heartbeatJSON = null) {
let okMsg = "Sent Successfully.";
try {
let formData = {
title: "Uptime Kuma Message",
content: msg
};
if (heartbeatJSON) {
if (heartbeatJSON["status"] === UP) {
formData.title = `UptimeKuma 「${monitorJSON["name"]}」 is Up`;
formData.content = `[✅ Up] ${heartbeatJSON["msg"]}`;
} else if (heartbeatJSON["status"] === DOWN) {
formData.title = `UptimeKuma 「${monitorJSON["name"]}」 is Down`;
formData.content = `[🔴 Down] ${heartbeatJSON["msg"]}`;
}
}
const apiUrl = `https://push.spug.cc/send/${notification.templateKey}`;
await axios.post(apiUrl, formData);
return okMsg;
} catch (error) {
this.throwGeneralAxiosError(error);
}
}
}
module.exports = SpugPush;

View file

@ -30,9 +30,11 @@ const Mattermost = require("./notification-providers/mattermost");
const Nostr = require("./notification-providers/nostr"); const Nostr = require("./notification-providers/nostr");
const Ntfy = require("./notification-providers/ntfy"); const Ntfy = require("./notification-providers/ntfy");
const Octopush = require("./notification-providers/octopush"); const Octopush = require("./notification-providers/octopush");
const OneChat = require("./notification-providers/onechat");
const OneBot = require("./notification-providers/onebot"); const OneBot = require("./notification-providers/onebot");
const Opsgenie = require("./notification-providers/opsgenie"); const Opsgenie = require("./notification-providers/opsgenie");
const PagerDuty = require("./notification-providers/pagerduty"); const PagerDuty = require("./notification-providers/pagerduty");
const Pumble = require("./notification-providers/pumble");
const FlashDuty = require("./notification-providers/flashduty"); const FlashDuty = require("./notification-providers/flashduty");
const PagerTree = require("./notification-providers/pagertree"); const PagerTree = require("./notification-providers/pagertree");
const PromoSMS = require("./notification-providers/promosms"); const PromoSMS = require("./notification-providers/promosms");
@ -72,6 +74,8 @@ const Onesender = require("./notification-providers/onesender");
const Wpush = require("./notification-providers/wpush"); const Wpush = require("./notification-providers/wpush");
const SendGrid = require("./notification-providers/send-grid"); const SendGrid = require("./notification-providers/send-grid");
const YZJ = require("./notification-providers/yzj"); const YZJ = require("./notification-providers/yzj");
const SMSPlanet = require("./notification-providers/sms-planet");
const SpugPush = require("./notification-providers/spugpush");
class Notification { class Notification {
@ -119,6 +123,7 @@ class Notification {
new Nostr(), new Nostr(),
new Ntfy(), new Ntfy(),
new Octopush(), new Octopush(),
new OneChat(),
new OneBot(), new OneBot(),
new Onesender(), new Onesender(),
new Opsgenie(), new Opsgenie(),
@ -126,6 +131,7 @@ class Notification {
new FlashDuty(), new FlashDuty(),
new PagerTree(), new PagerTree(),
new PromoSMS(), new PromoSMS(),
new Pumble(),
new Pushbullet(), new Pushbullet(),
new PushDeer(), new PushDeer(),
new Pushover(), new Pushover(),
@ -160,7 +166,9 @@ class Notification {
new Cellsynt(), new Cellsynt(),
new Wpush(), new Wpush(),
new SendGrid(), new SendGrid(),
new YZJ() new YZJ(),
new SMSPlanet(),
new SpugPush(),
]; ];
for (let item of list) { for (let item of list) {
if (! item.name) { if (! item.name) {

View file

@ -89,7 +89,7 @@ router.get("/api/status-page/heartbeat/:slug", cache("1 minutes"), async (reques
SELECT * FROM heartbeat SELECT * FROM heartbeat
WHERE monitor_id = ? WHERE monitor_id = ?
ORDER BY time DESC ORDER BY time DESC
LIMIT 50 LIMIT 100
`, [ `, [
monitorID, monitorID,
]); ]);

View file

@ -113,6 +113,7 @@ class UptimeKumaServer {
UptimeKumaServer.monitorTypeList["tailscale-ping"] = new TailscalePing(); UptimeKumaServer.monitorTypeList["tailscale-ping"] = new TailscalePing();
UptimeKumaServer.monitorTypeList["dns"] = new DnsMonitorType(); UptimeKumaServer.monitorTypeList["dns"] = new DnsMonitorType();
UptimeKumaServer.monitorTypeList["mqtt"] = new MqttMonitorType(); UptimeKumaServer.monitorTypeList["mqtt"] = new MqttMonitorType();
UptimeKumaServer.monitorTypeList["group"] = new GroupMonitorType();
UptimeKumaServer.monitorTypeList["snmp"] = new SNMPMonitorType(); UptimeKumaServer.monitorTypeList["snmp"] = new SNMPMonitorType();
UptimeKumaServer.monitorTypeList["mongodb"] = new MongodbMonitorType(); UptimeKumaServer.monitorTypeList["mongodb"] = new MongodbMonitorType();
UptimeKumaServer.monitorTypeList["rabbitmq"] = new RabbitMqMonitorType(); UptimeKumaServer.monitorTypeList["rabbitmq"] = new RabbitMqMonitorType();
@ -551,6 +552,7 @@ const { RealBrowserMonitorType } = require("./monitor-types/real-browser-monitor
const { TailscalePing } = require("./monitor-types/tailscale-ping"); const { TailscalePing } = require("./monitor-types/tailscale-ping");
const { DnsMonitorType } = require("./monitor-types/dns"); const { DnsMonitorType } = require("./monitor-types/dns");
const { MqttMonitorType } = require("./monitor-types/mqtt"); const { MqttMonitorType } = require("./monitor-types/mqtt");
const { GroupMonitorType } = require("./monitor-types/group");
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 { RabbitMqMonitorType } = require("./monitor-types/rabbitmq"); const { RabbitMqMonitorType } = require("./monitor-types/rabbitmq");

View file

@ -14,7 +14,7 @@
<router-link :to="monitorURL(monitor.id)" class="item" :class="{ 'disabled': ! monitor.active }"> <router-link :to="monitorURL(monitor.id)" class="item" :class="{ 'disabled': ! monitor.active }">
<div class="row"> <div class="row">
<div class="col-9 col-md-8 small-padding" :class="{ 'monitor-item': $root.userHeartbeatBar == 'bottom' || $root.userHeartbeatBar == 'none' }"> <div class="col-6 small-padding" :class="{ 'monitor-item': $root.userHeartbeatBar == 'bottom' || $root.userHeartbeatBar == 'none' }">
<div class="info"> <div class="info">
<Uptime :monitor="monitor" type="24" :pill="true" /> <Uptime :monitor="monitor" type="24" :pill="true" />
<span v-if="hasChildren" class="collapse-padding" @click.prevent="changeCollapsed"> <span v-if="hasChildren" class="collapse-padding" @click.prevent="changeCollapsed">
@ -26,7 +26,7 @@
<Tag v-for="tag in monitor.tags" :key="tag" :item="tag" :size="'sm'" /> <Tag v-for="tag in monitor.tags" :key="tag" :item="tag" :size="'sm'" />
</div> </div>
</div> </div>
<div v-show="$root.userHeartbeatBar == 'normal'" :key="$root.userHeartbeatBar" class="col-3 col-md-4"> <div v-show="$root.userHeartbeatBar == 'normal'" :key="$root.userHeartbeatBar" class="col-6">
<HeartbeatBar ref="heartbeatBar" size="small" :monitor-id="monitor.id" /> <HeartbeatBar ref="heartbeatBar" size="small" :monitor-id="monitor.id" />
</div> </div>
</div> </div>

View file

@ -135,11 +135,13 @@ export default {
"nostr": "Nostr", "nostr": "Nostr",
"ntfy": "Ntfy", "ntfy": "Ntfy",
"octopush": "Octopush", "octopush": "Octopush",
"OneChat": "OneChat",
"OneBot": "OneBot", "OneBot": "OneBot",
"Onesender": "Onesender", "Onesender": "Onesender",
"Opsgenie": "Opsgenie", "Opsgenie": "Opsgenie",
"PagerDuty": "PagerDuty", "PagerDuty": "PagerDuty",
"PagerTree": "PagerTree", "PagerTree": "PagerTree",
"pumble": "Pumble",
"pushbullet": "Pushbullet", "pushbullet": "Pushbullet",
"PushByTechulus": "Push by Techulus", "PushByTechulus": "Push by Techulus",
"pushover": "Pushover", "pushover": "Pushover",
@ -183,9 +185,11 @@ export default {
"WeCom": "WeCom (企业微信群机器人)", "WeCom": "WeCom (企业微信群机器人)",
"ServerChan": "ServerChan (Server酱)", "ServerChan": "ServerChan (Server酱)",
"PushPlus": "PushPlus (推送加)", "PushPlus": "PushPlus (推送加)",
"SpugPush": "SpugPushSpug推送助手",
"smsc": "SMSC", "smsc": "SMSC",
"WPush": "WPush(wpush.cn)", "WPush": "WPush(wpush.cn)",
"YZJ": "YZJ (云之家自定义机器人)" "YZJ": "YZJ (云之家自定义机器人)",
"SMSPlanet": "SMSPlanet.pl"
}; };
// Sort by notification name // Sort by notification name

View file

@ -33,7 +33,7 @@
<template #item="monitor"> <template #item="monitor">
<div class="item" data-testid="monitor"> <div class="item" data-testid="monitor">
<div class="row"> <div class="row">
<div class="col-9 col-md-8 small-padding"> <div class="col-6 small-padding">
<div class="info"> <div class="info">
<font-awesome-icon v-if="editMode" icon="arrows-alt-v" class="action drag me-3" /> <font-awesome-icon v-if="editMode" icon="arrows-alt-v" class="action drag me-3" />
<font-awesome-icon v-if="editMode" icon="times" class="action remove me-3" @click="removeMonitor(group.index, monitor.index)" /> <font-awesome-icon v-if="editMode" icon="times" class="action remove me-3" @click="removeMonitor(group.index, monitor.index)" />
@ -71,7 +71,7 @@
</div> </div>
</div> </div>
</div> </div>
<div :key="$root.userHeartbeatBar" class="col-3 col-md-4"> <div :key="$root.userHeartbeatBar" class="col-6">
<HeartbeatBar size="mid" :monitor-id="monitor.element.id" /> <HeartbeatBar size="mid" :monitor-id="monitor.element.id" />
</div> </div>
</div> </div>

View file

@ -53,6 +53,13 @@
</div> </div>
</div> </div>
</div> </div>
<div class="mb-3">
<div class="form-check form-switch">
<input id="discord-disable-url" v-model="$parent.notification.disableUrl" class="form-check-input" type="checkbox" role="switch">
<label class="form-check-label" for="discord-disable-url">{{ $t("Disable URL in Notification") }}</label>
</div>
</div>
</template> </template>
<script> <script>
export default { export default {
@ -60,6 +67,9 @@ export default {
if (!this.$parent.notification.discordChannelType) { if (!this.$parent.notification.discordChannelType) {
this.$parent.notification.discordChannelType = "channel"; this.$parent.notification.discordChannelType = "channel";
} }
if (this.$parent.notification.disableUrl === undefined) {
this.$parent.notification.disableUrl = false;
}
} }
}; };
</script> </script>

View file

@ -0,0 +1,64 @@
<template>
<div class="mb-3">
<!-- Access Token Input -->
<div class="mb-3">
<label for="onechat-access-token" class="form-label">
OneChat Access Token<span style="color: red;"><sup>*</sup></span>
</label>
<HiddenInput
id="onechat-access-token"
v-model="$parent.notification.accessToken"
:required="true"
>
</HiddenInput>
<div class="form-text">
<p>{{ $t("OneChatAccessToken") }}</p>
</div>
</div>
<!-- Receiver ID Input -->
<div class="mb-3">
<label for="onechat-receiver-id" class="form-label">
{{ $t("OneChatUserIdOrGroupId") }}<span style="color: red;"><sup>*</sup></span>
</label>
<input
id="onechat-receiver-id"
v-model="$parent.notification.recieverId"
type="text"
class="form-control"
required
/>
</div>
<!-- Bot ID Input -->
<div class="mb-3">
<label for="onechat-bot-id" class="form-label">
{{ $t("OneChatBotId") }}<span style="color: red;"><sup>*</sup></span>
</label>
<input
id="onechat-bot-id"
v-model="$parent.notification.botId"
type="text"
class="form-control"
required
/>
</div>
<!-- Document Link -->
<div class="form-text">
<i18n-t tag="p" keypath="Read more:">
<a href="https://chat-develop.one.th/docs" target="_blank">https://chat-develop.one.th/docs</a>
</i18n-t>
</div>
</div>
</template>
<script>
import HiddenInput from "../HiddenInput.vue";
export default {
components: {
HiddenInput,
},
};
</script>

View file

@ -0,0 +1,9 @@
<template>
<div class="mb-3">
<label for="pumble-webhook-url" class="form-label mb-2">{{ $t("Webhook URL") }}</label><span style="color: red;"><sup>*</sup></span>
<input id="pumble-webhook-url" v-model="$parent.notification.webhookURL" type="url" class="form-control" required>
</div>
<div class="mb-3">
<a href="https://pumble.com/help/integrations/add-pumble-apps/incoming-webhooks-for-pumble/" target="_blank">{{ $t("documentationOf", ["Pumble Webbhook"]) }}</a>
</div>
</template>

View file

@ -16,34 +16,24 @@
<option>1</option> <option>1</option>
<option>2</option> <option>2</option>
</select> </select>
<label for="pushover-sound" class="form-label">{{ $t("Notification Sound") }}</label>
<select id="pushover-sound" v-model="$parent.notification.pushoversounds" class="form-select"> <label for="pushover-sound-down" class="form-label">{{ $t("Notification Sound") }} - Up</label>
<option value="pushover">{{ $t("pushoversounds pushover") }}</option> <select id="pushover-sound-down" v-model="$parent.notification.pushoversounds" class="form-select">
<option value="bike">{{ $t("pushoversounds bike") }}</option> <option v-for="sound in soundOptions" :key="sound" :value="sound">
<option value="bugle">{{ $t("pushoversounds bugle") }}</option> {{ $t(`pushoversounds ${sound}`) }}
<option value="cashregister">{{ $t("pushoversounds cashregister") }}</option> </option>
<option value="classical">{{ $t("pushoversounds classical") }}</option>
<option value="cosmic">{{ $t("pushoversounds cosmic") }}</option>
<option value="falling">{{ $t("pushoversounds falling") }}</option>
<option value="gamelan">{{ $t("pushoversounds gamelan") }}</option>
<option value="incoming">{{ $t("pushoversounds incoming") }}</option>
<option value="intermission">{{ $t("pushoversounds intermission") }}</option>
<option value="magic">{{ $t("pushoversounds magic") }}</option>
<option value="mechanical">{{ $t("pushoversounds mechanical") }}</option>
<option value="pianobar">{{ $t("pushoversounds pianobar") }}</option>
<option value="siren">{{ $t("pushoversounds siren") }}</option>
<option value="spacealarm">{{ $t("pushoversounds spacealarm") }}</option>
<option value="tugboat">{{ $t("pushoversounds tugboat") }}</option>
<option value="alien">{{ $t("pushoversounds alien") }}</option>
<option value="climb">{{ $t("pushoversounds climb") }}</option>
<option value="persistent">{{ $t("pushoversounds persistent") }}</option>
<option value="echo">{{ $t("pushoversounds echo") }}</option>
<option value="updown">{{ $t("pushoversounds updown") }}</option>
<option value="vibrate">{{ $t("pushoversounds vibrate") }}</option>
<option value="none">{{ $t("pushoversounds none") }}</option>
</select> </select>
<label for="pushover-sound-up" class="form-label">{{ $t("Notification Sound") }} - Down</label>
<select id="pushover-sound-up" v-model="$parent.notification.pushoversounds_up" class="form-select">
<option v-for="sound in soundOptions" :key="sound" :value="sound">
{{ $t(`pushoversounds ${sound}`) }}
</option>
</select>
<label for="pushover-ttl" class="form-label">{{ $t("pushoverMessageTtl") }}</label> <label for="pushover-ttl" class="form-label">{{ $t("pushoverMessageTtl") }}</label>
<input id="pushover-ttl" v-model="$parent.notification.pushoverttl" type="number" min="0" step="1" class="form-control"> <input id="pushover-ttl" v-model="$parent.notification.pushoverttl" type="number" min="0" step="1" class="form-control">
<div class="form-text"> <div class="form-text">
<span style="color: red;"><sup>*</sup></span>{{ $t("Required") }} <span style="color: red;"><sup>*</sup></span>{{ $t("Required") }}
<i18n-t tag="p" keypath="More info on:" style="margin-top: 8px;"> <i18n-t tag="p" keypath="More info on:" style="margin-top: 8px;">
@ -66,5 +56,34 @@ export default {
components: { components: {
HiddenInput, HiddenInput,
}, },
data() {
return {
soundOptions: [
"pushover",
"bike",
"bugle",
"cashregister",
"classical",
"cosmic",
"falling",
"gamelan",
"incoming",
"intermission",
"magic",
"mechanical",
"pianobar",
"siren",
"spacealarm",
"tugboat",
"alien",
"climb",
"persistent",
"echo",
"updown",
"vibrate",
"none",
],
};
},
}; };
</script> </script>

View file

@ -1,31 +1,123 @@
<template> <template>
<div class="mb-3"> <div class="mb-3">
<label for="smseagle-url" class="form-label">{{ $t("smseagleUrl") }}</label> <label for="smseagle-url" class="form-label">{{ $t("smseagleUrl") }}</label>
<input id="smseagle-url" v-model="$parent.notification.smseagleUrl" type="text" minlength="7" class="form-control" placeholder="http://127.0.0.1" required> <input
id="smseagle-url" v-model="$parent.notification.smseagleUrl" type="text" minlength="7"
class="form-control" placeholder="http://127.0.0.1" required
>
</div> </div>
<div class="mb-3"> <div class="mb-3">
<label for="smseagle-token" class="form-label">{{ $t("smseagleToken") }}</label> <label for="smseagle-token" class="form-label">{{ $t("smseagleToken") }}</label>
<HiddenInput id="smseagle-token" v-model="$parent.notification.smseagleToken" :required="true"></HiddenInput> <HiddenInput id="smseagle-token" v-model="$parent.notification.smseagleToken" :required="true"></HiddenInput>
</div> </div>
<div class="mb-3"> <div class="mb-3">
<label for="smseagle-recipient-type" class="form-label">{{ $t("smseagleRecipientType") }}</label> <label for="smseagle-api-type" class="form-label">{{ $t("smseagleApiType") }} </label>
<select id="smseagle-recipient-type" v-model="$parent.notification.smseagleRecipientType" class="form-select"> <select id="smseagle-api-type" v-model="$parent.notification.smseagleApiType" class="form-select">
<option value="smseagle-to" selected>{{ $t("smseagleTo") }}</option> <option value="smseagle-apiv1" selected>{{ $t("smseagleApiv1") }} </option>
<option value="smseagle-group">{{ $t("smseagleGroup") }}</option> <option value="smseagle-apiv2">{{ $t("smseagleApiv2") }} </option>
<option value="smseagle-contact">{{ $t("smseagleContact") }}</option>
</select> </select>
<i18n-t tag="div" keypath="smseagleDocs" class="form-text">
<a href="https://www.smseagle.eu/api/" target="_blank">https://www.smseagle.eu/api/</a>
</i18n-t>
</div> </div>
<div class="mb-3"> <div v-if="$parent.notification.smseagleApiType === 'smseagle-apiv1'" class="mb-3">
<label for="smseagle-recipient" class="form-label">{{ $t("smseagleRecipient") }}</label> <div class="mb-3">
<input id="smseagle-recipient" v-model="$parent.notification.smseagleRecipient" type="text" class="form-control" required> <label for="smseagle-recipient-type" class="form-label">{{ $t("smseagleRecipientType") }}</label>
<select
id="smseagle-recipient-type" v-model="$parent.notification.smseagleRecipientType"
class="form-select"
>
<!-- phone number -->
<option value="smseagle-to" selected>{{ $t("smseagleTo") }}</option>
<option value="smseagle-group">{{ $t("smseagleGroup") }}</option>
<option value="smseagle-contact">{{ $t("smseagleContact") }}</option>
</select>
</div>
<div class="mb-3">
<label for="smseagle-recipient" class="form-label">{{ $t("smseagleRecipient") }}</label>
<input id="smseagle-recipient" v-model="$parent.notification.smseagleRecipient" type="text" class="form-control" required>
</div>
<div
v-if="$parent.notification.smseagleMsgType === 'smseagle-sms'
|| $parent.notification.smseagleRecipientType !== 'smseagle-to'" class="mb-3"
>
<label for="smseagle-priority" class="form-label">{{ $t("smseaglePriority") }}</label>
<input id="smseagle-priority" v-model="$parent.notification.smseaglePriority" type="number" class="form-control" min="0" max="9" step="1" placeholder="0" required>
</div>
<div
v-if="$parent.notification.smseagleMsgType === 'smseagle-sms'
|| $parent.notification.smseagleRecipientType !== 'smseagle-to'" class="mb-3 form-check form-switch"
>
<label for="smseagle-encoding" class="form-label">{{ $t("smseagleEncoding") }}</label>
<input id="smseagle-encoding" v-model="$parent.notification.smseagleEncoding" type="checkbox" class="form-check-input">
</div>
<div v-if="$parent.notification.smseagleRecipientType === 'smseagle-to'" class="mb-3">
<div class="mb-3">
<label for="smseagle-msg-type" class="form-label">{{ $t("smseagleMsgType") }} </label>
<select id="smseagle-msg-type" v-model="$parent.notification.smseagleMsgType" class="form-select">
<option value="smseagle-sms" selected>{{ $t("smseagleMsgSms") }} </option>
<option value="smseagle-ring">{{ $t("smseagleMsgRing") }} </option>
<option value="smseagle-tts">{{ $t("smseagleMsgTts") }} </option>
<option value="smseagle-tts-advanced">{{ $t("smseagleMsgTtsAdvanced") }} </option>
</select>
</div>
<div
v-if="$parent.notification.smseagleMsgType === 'smseagle-ring'
|| $parent.notification.smseagleMsgType === 'smseagle-tts'
|| $parent.notification.smseagleMsgType === 'smseagle-tts-advanced'" class="mb-3"
>
<label for="smseagle-duration" class="form-label">{{ $t("smseagleDuration") }}</label>
<input id="smseagle-duration" v-model="$parent.notification.smseagleDuration" type="number" class="form-control" min="0" max="30" step="1" placeholder="10">
</div>
<div v-if="$parent.notification.smseagleMsgType === 'smseagle-tts-advanced'" class="mb-3">
<label for="smseagle-tts-model" class="form-label">{{ $t("smseagleTtsModel") }} </label>
<input id="smseagle-tts-model" v-model="$parent.notification.smseagleTtsModel" type="number" class="form-control" placeholder="1" required>
</div>
</div>
</div> </div>
<div class="mb-3">
<label for="smseagle-priority" class="form-label">{{ $t("smseaglePriority") }}</label> <div v-if="$parent.notification.smseagleApiType === 'smseagle-apiv2'" class="mb-3">
<input id="smseagle-priority" v-model="$parent.notification.smseaglePriority" type="number" class="form-control" min="0" max="9" step="1" placeholder="0"> <div class="mb-3">
</div> <!-- phone number -->
<div class="mb-3 form-check form-switch"> <label for="smseagle-recipient-to" class="form-label">{{ $t("smseagleTo") }}</label>
<label for="smseagle-encoding" class="form-label">{{ $t("smseagleEncoding") }}</label> <input id="smseagle-recipient-to" v-model="$parent.notification.smseagleRecipientTo" type="text" class="form-control">
<input id="smseagle-encoding" v-model="$parent.notification.smseagleEncoding" type="checkbox" class="form-check-input"> <i18n-t tag="div" keypath="smseagleComma" class="form-text" />
</div>
<div class="mb-3">
<label for="smseagle-recipient-group" class="form-label">{{ $t("smseagleGroupV2") }}</label>
<input id="smseagle-recipient-group" v-model="$parent.notification.smseagleRecipientGroup" type="text" class="form-control">
<i18n-t tag="div" keypath="smseagleComma" class="form-text" />
</div>
<div class="mb-3">
<label for="smseagle-recipient-contact" class="form-label">{{ $t("smseagleContactV2") }}</label>
<input id="smseagle-recipient-contact" v-model="$parent.notification.smseagleRecipientContact" type="text" class="form-control">
<i18n-t tag="div" keypath="smseagleComma" class="form-text" />
</div>
<div class="mb-3">
<label for="smseagle-priority-v2" class="form-label">{{ $t("smseaglePriority") }}</label>
<input id="smseagle-priority-v2" v-model="$parent.notification.smseaglePriority" type="number" class="form-control" min="0" max="9" step="1" placeholder="0">
</div>
<div class="mb-3 form-check form-switch">
<label for="smseagle-encoding-v2" class="form-label">{{ $t("smseagleEncoding") }}</label>
<input id="smseagle-encoding-v2" v-model="$parent.notification.smseagleEncoding" type="checkbox" class="form-check-input">
</div>
<div class="mb-3">
<label for="smseagle-msg-type-v2" class="form-label">{{ $t("smseagleMsgType") }} </label>
<select id="smseagle-msg-type-v2" v-model="$parent.notification.smseagleMsgType" class="form-select">
<option value="smseagle-sms" selected>{{ $t("smseagleMsgSms") }} </option>
<option value="smseagle-ring">{{ $t("smseagleMsgRing") }} </option>
<option value="smseagle-tts">{{ $t("smseagleMsgTts") }} </option>
<option value="smseagle-tts-advanced">{{ $t("smseagleMsgTtsAdvanced") }} </option>
</select>
</div>
<div v-if="$parent.notification.smseagleMsgType && $parent.notification.smseagleMsgType !== 'smseagle-sms'" class="mb-3">
<label for="smseagle-duration-v2" class="form-label">{{ $t("smseagleDuration") }}</label>
<input id="smseagle-duration-v2" v-model="$parent.notification.smseagleDuration" type="number" class="form-control" min="0" max="30" step="1" placeholder="10">
</div>
<div v-if="$parent.notification.smseagleMsgType === 'smseagle-tts-advanced'" class="mb-3">
<label for="smseagle-tts-model-v2" class="form-label">{{ $t("smseagleTtsModel") }} </label>
<input id="smseagle-tts-model-v2" v-model="$parent.notification.smseagleTtsModel" type="number" class="form-control" placeholder="1" required>
</div>
</div> </div>
</template> </template>
@ -36,5 +128,16 @@ export default {
components: { components: {
HiddenInput, HiddenInput,
}, },
mounted() {
if (!this.$parent.notification.smseagleApiType) {
this.$parent.notification.smseagleApiType = "smseagle-apiv1";
}
if (!this.$parent.notification.smseagleMsgType) {
this.$parent.notification.smseagleMsgType = "smseagle-sms";
}
if (!this.$parent.notification.smseagleRecipientType) {
this.$parent.notification.smseagleRecipientType = "smseagle-to";
}
}
}; };
</script> </script>

View file

@ -0,0 +1,46 @@
<template>
<div class="mb-3">
<label for="smsplanet-api-token" class="form-label">{{ $t('smsplanetApiToken') }}</label>
<HiddenInput id="smsplanet-api-token" v-model="$parent.notification.smsplanetApiToken" :required="true"></HiddenInput>
<i18n-t tag="div" keypath="smsplanetApiDocs" class="form-text">
<template #the_smsplanet_documentation>
<a
href="https://smsplanet.pl/doc/slate/index.html#introduction"
target="_blank"
>{{ $t("the smsplanet documentation") }}</a>
</template>
</i18n-t>
</div>
<div class="mb-3">
<label for="smsplanet-phone-numbers" class="form-label">{{ $t("Phone numbers") }}</label>
<textarea
id="smsplanet-phone-numbers"
v-model="$parent.notification.smsplanetPhoneNumbers"
class="form-control"
:placeholder="smsplanetPhoneNumbers"
required
></textarea>
</div>
<div class="mb-3">
<label for="smsplanet-sender-name" class="form-label">{{ $t("Sender name") }}</label>
<input id="smsplanet-sender-name" v-model="$parent.notification.smsplanetSenderName" type="text" minlength="3" maxlength="11" class="form-control">
<div class="form-text">{{ $t("smsplanetNeedToApproveName") }}</div>
</div>
</template>
<script>
import HiddenInput from "../HiddenInput.vue";
export default {
components: {
HiddenInput,
},
computed: {
smsplanetPhoneNumbers() {
return this.$t("Example:", [
"+48123456789,+48111222333",
]);
}
}
};
</script>

View file

@ -79,6 +79,15 @@
<div class="form-text">{{ $t("leave blank for default body") }}</div> <div class="form-text">{{ $t("leave blank for default body") }}</div>
</div> </div>
<div class="mb-3">
<div class="form-check">
<input id="use-html-body" v-model="$parent.notification.htmlBody" class="form-check-input" type="checkbox" value="">
<label class="form-check-label" for="use-html-body">
{{ $t("Use HTML for custom E-mail body") }}
</label>
</div>
</div>
<ToggleSection :heading="$t('smtpDkimSettings')"> <ToggleSection :heading="$t('smtpDkimSettings')">
<i18n-t tag="div" keypath="smtpDkimDesc" class="form-text mb-3"> <i18n-t tag="div" keypath="smtpDkimDesc" class="form-text mb-3">
<a href="https://nodemailer.com/dkim/" target="_blank">{{ $t("documentation") }}</a> <a href="https://nodemailer.com/dkim/" target="_blank">{{ $t("documentation") }}</a>

View file

@ -0,0 +1,19 @@
<template>
<div class="mb-3">
<label for="spugpush-templateKey" class="form-label">{{ $t("SpugPush Template Code") }}</label>
<HiddenInput id="spugpush-templateKey" v-model="$parent.notification.templateKey" :required="true" autocomplete="new-password"></HiddenInput>
</div>
<i18n-t tag="p" keypath="More info on:" style="margin-top: 8px;">
<a href="https://push.spug.cc/guide/plugin/kuma" rel="noopener noreferrer" target="_blank">https://push.spug.cc</a>
</i18n-t>
</template>
<script>
import HiddenInput from "../HiddenInput.vue";
export default {
components: {
HiddenInput,
},
};
</script>

View file

@ -29,6 +29,7 @@ import Mattermost from "./Mattermost.vue";
import Nostr from "./Nostr.vue"; import Nostr from "./Nostr.vue";
import Ntfy from "./Ntfy.vue"; import Ntfy from "./Ntfy.vue";
import Octopush from "./Octopush.vue"; import Octopush from "./Octopush.vue";
import OneChat from "./OneChat.vue";
import OneBot from "./OneBot.vue"; import OneBot from "./OneBot.vue";
import Onesender from "./Onesender.vue"; import Onesender from "./Onesender.vue";
import Opsgenie from "./Opsgenie.vue"; import Opsgenie from "./Opsgenie.vue";
@ -36,6 +37,7 @@ import PagerDuty from "./PagerDuty.vue";
import FlashDuty from "./FlashDuty.vue"; import FlashDuty from "./FlashDuty.vue";
import PagerTree from "./PagerTree.vue"; import PagerTree from "./PagerTree.vue";
import PromoSMS from "./PromoSMS.vue"; import PromoSMS from "./PromoSMS.vue";
import Pumble from "./Pumble.vue";
import Pushbullet from "./Pushbullet.vue"; import Pushbullet from "./Pushbullet.vue";
import PushDeer from "./PushDeer.vue"; import PushDeer from "./PushDeer.vue";
import Pushover from "./Pushover.vue"; import Pushover from "./Pushover.vue";
@ -62,6 +64,7 @@ import WeCom from "./WeCom.vue";
import GoAlert from "./GoAlert.vue"; import GoAlert from "./GoAlert.vue";
import ZohoCliq from "./ZohoCliq.vue"; import ZohoCliq from "./ZohoCliq.vue";
import Splunk from "./Splunk.vue"; import Splunk from "./Splunk.vue";
import SpugPush from "./SpugPush.vue";
import SevenIO from "./SevenIO.vue"; import SevenIO from "./SevenIO.vue";
import Whapi from "./Whapi.vue"; import Whapi from "./Whapi.vue";
import WAHA from "./WAHA.vue"; import WAHA from "./WAHA.vue";
@ -70,6 +73,7 @@ import WPush from "./WPush.vue";
import SIGNL4 from "./SIGNL4.vue"; import SIGNL4 from "./SIGNL4.vue";
import SendGrid from "./SendGrid.vue"; import SendGrid from "./SendGrid.vue";
import YZJ from "./YZJ.vue"; import YZJ from "./YZJ.vue";
import SMSPlanet from "./SMSPlanet.vue";
/** /**
* Manage all notification form. * Manage all notification form.
@ -106,6 +110,7 @@ const NotificationFormList = {
"nostr": Nostr, "nostr": Nostr,
"ntfy": Ntfy, "ntfy": Ntfy,
"octopush": Octopush, "octopush": Octopush,
"OneChat": OneChat,
"OneBot": OneBot, "OneBot": OneBot,
"Onesender": Onesender, "Onesender": Onesender,
"Opsgenie": Opsgenie, "Opsgenie": Opsgenie,
@ -113,6 +118,7 @@ const NotificationFormList = {
"FlashDuty": FlashDuty, "FlashDuty": FlashDuty,
"PagerTree": PagerTree, "PagerTree": PagerTree,
"promosms": PromoSMS, "promosms": PromoSMS,
"pumble": Pumble,
"pushbullet": Pushbullet, "pushbullet": Pushbullet,
"PushByTechulus": TechulusPush, "PushByTechulus": TechulusPush,
"PushDeer": PushDeer, "PushDeer": PushDeer,
@ -135,6 +141,7 @@ const NotificationFormList = {
"threema": Threema, "threema": Threema,
"twilio": Twilio, "twilio": Twilio,
"Splunk": Splunk, "Splunk": Splunk,
"SpugPush": SpugPush,
"webhook": Webhook, "webhook": Webhook,
"WeCom": WeCom, "WeCom": WeCom,
"GoAlert": GoAlert, "GoAlert": GoAlert,
@ -148,6 +155,7 @@ const NotificationFormList = {
"WPush": WPush, "WPush": WPush,
"SendGrid": SendGrid, "SendGrid": SendGrid,
"YZJ": YZJ, "YZJ": YZJ,
"SMSPlanet": SMSPlanet,
}; };
export default NotificationFormList; export default NotificationFormList;

View file

@ -1117,5 +1117,6 @@
"wayToWriteWahaChatId": "Телефонният номер с международния префикс, но без знака плюс в началото ({0}), ID на контакта ({1}) или ID на групата ({2}). Известията се изпращат до това чат ID от WAHA сесия.", "wayToWriteWahaChatId": "Телефонният номер с международния префикс, но без знака плюс в началото ({0}), ID на контакта ({1}) или ID на групата ({2}). Известията се изпращат до това чат ID от WAHA сесия.",
"wayToGetWahaSession": "От тази сесия WAHA изпраща известия до чат ID. Можете да го намерите в таблото за управление на WAHA.", "wayToGetWahaSession": "От тази сесия WAHA изпраща известия до чат ID. Можете да го намерите в таблото за управление на WAHA.",
"telegramServerUrlDescription": "За премахване на API бот ограниченията за Telegram или за получаване на достъп в блокирани зони (Китай, Иран и др.). За повече информация щракнете върху {0}. По подразбиране: {1}", "telegramServerUrlDescription": "За премахване на API бот ограниченията за Telegram или за получаване на достъп в блокирани зони (Китай, Иран и др.). За повече информация щракнете върху {0}. По подразбиране: {1}",
"telegramServerUrl": "(По избор) URL адрес на сървъра" "telegramServerUrl": "(По избор) URL адрес на сървъра",
"Font Twemoji by Twitter licensed under": "Шрифт Twemoji от Twitter, лицензиран под"
} }

View file

@ -457,7 +457,7 @@
"installing": "Instal·lant", "installing": "Instal·lant",
"uninstall": "Desinstal·la", "uninstall": "Desinstal·la",
"confirmUninstallPlugin": "Estàs segur de desinstal·lar aquest connector?", "confirmUninstallPlugin": "Estàs segur de desinstal·lar aquest connector?",
"notificationRegional": "Regional", "notificationRegional": "Local",
"Clone Monitor": "Clona el monitor", "Clone Monitor": "Clona el monitor",
"Clone": "Clona", "Clone": "Clona",
"cloneOf": "Clon de {0}", "cloneOf": "Clon de {0}",
@ -478,7 +478,7 @@
"To Email": "Destí email", "To Email": "Destí email",
"smtpCC": "CC", "smtpCC": "CC",
"smtpBCC": "BCC", "smtpBCC": "BCC",
"Discord Webhook URL": "Discord Webhook URL", "Discord Webhook URL": "URL del Webhook de Discord",
"wayToGetDiscordURL": "Pots rebre aquest per anar a Paràmetres de Servidor -> Integracions -> Vista *Webhooks -> Nou *Webhook", "wayToGetDiscordURL": "Pots rebre aquest per anar a Paràmetres de Servidor -> Integracions -> Vista *Webhooks -> Nou *Webhook",
"Bot Display Name": "Nom de pantalla de bot", "Bot Display Name": "Nom de pantalla de bot",
"Prefix Custom Message": "Prefix de missatge personalitzat", "Prefix Custom Message": "Prefix de missatge personalitzat",
@ -560,5 +560,14 @@
"templateStatus": "Estat", "templateStatus": "Estat",
"telegramUseTemplate": "Fes servir una plantilla de missatge personalitzada", "telegramUseTemplate": "Fes servir una plantilla de missatge personalitzada",
"telegramUseTemplateDescription": "Si s'activa, el missatge s'enviarà fent servir una plantilla personalitzada.", "telegramUseTemplateDescription": "Si s'activa, el missatge s'enviarà fent servir una plantilla personalitzada.",
"telegramTemplateFormatDescription": "Telegram permet l'ús de diferents tipus de llenguatges de marcat, llegeix Telegram {0} per més detalls." "telegramTemplateFormatDescription": "Telegram permet l'ús de diferents tipus de llenguatges de marcat, llegeix Telegram {0} per més detalls.",
"wayToGetDiscordThreadId": "Obtenir un identificador de publicació del fil/fòrum és semblant a obtenir un identificador de canal. Més informació sobre com obtenir identificadors {0}",
"lineDevConsoleTo": "Consola de desenvolupadors de linia - {0}",
"Basic Settings": "Configuracions bàsiques",
"User ID": "ID d'usuari",
"Your User ID": "El teu identificador d'usuari",
"Messaging API": "API de missatges",
"wayToGetLineChannelToken": "Primer accediu a {0}, creeu un proveïdor i un canal (API de missatgeria) i, a continuació, podeu obtenir el token d'accés al canal i l'identificador d'usuari dels elements del menú esmentats anteriorment.",
"Icon URL": "URL de la icona",
"aboutIconURL": "Pots donar un enllaç a la imatge a \"URL de la icona\" per sobreposar-la a la imatge de perfil pere defecte. No s'usarà si hi ha una icona d'emoji establerta."
} }

View file

@ -1114,5 +1114,6 @@
"wayToGetWahaApiKey": "API-Schlüssel ist der Wert der WHATSAPP_API_KEY-Umgebungsvariable, den du beim Ausführen von WAHA verwendet hast.", "wayToGetWahaApiKey": "API-Schlüssel ist der Wert der WHATSAPP_API_KEY-Umgebungsvariable, den du beim Ausführen von WAHA verwendet hast.",
"wayToWriteWahaChatId": "Die Telefonnummer mit internationaler Vorwahl, ohne den anfänglichen Pluszeichen ({0}), die Kontakt-ID ({1}) oder die Gruppen-ID ({2}). Die Benachrichtigungen werden an diese Chat-ID von der WAHA-Sitzung gesendet.", "wayToWriteWahaChatId": "Die Telefonnummer mit internationaler Vorwahl, ohne den anfänglichen Pluszeichen ({0}), die Kontakt-ID ({1}) oder die Gruppen-ID ({2}). Die Benachrichtigungen werden an diese Chat-ID von der WAHA-Sitzung gesendet.",
"telegramServerUrl": "(Optional) Server URL", "telegramServerUrl": "(Optional) Server URL",
"telegramServerUrlDescription": "Um die Telegram-Bot-API-Beschränkungen aufzuheben oder in gesperrten Gebieten (China, Iran usw.) Zugriff zu erhalten. Weitere Informationen findest du unter {0}. Standard: {1}" "telegramServerUrlDescription": "Um die Telegram-Bot-API-Beschränkungen aufzuheben oder in gesperrten Gebieten (China, Iran usw.) Zugriff zu erhalten. Weitere Informationen findest du unter {0}. Standard: {1}",
"Font Twemoji by Twitter licensed under": "Schriftart Twemoji von Twitter lizenziert unter"
} }

View file

@ -1117,5 +1117,6 @@
"wayToGetWahaSession": "Von dieser Sitzung aus sendet WAHA Benachrichtigungen an die Chat-ID. Du kannst sie im WAHA Dashboard finden.", "wayToGetWahaSession": "Von dieser Sitzung aus sendet WAHA Benachrichtigungen an die Chat-ID. Du kannst sie im WAHA Dashboard finden.",
"wayToWriteWahaChatId": "Die Telefonnummer mit internationaler Vorwahl, ohne den anfänglichen Pluszeichen ({0}), die Kontakt-ID ({1}) oder die Gruppen-ID ({2}). Die Benachrichtigungen werden an diese Chat-ID von der WAHA-Sitzung gesendet.", "wayToWriteWahaChatId": "Die Telefonnummer mit internationaler Vorwahl, ohne den anfänglichen Pluszeichen ({0}), die Kontakt-ID ({1}) oder die Gruppen-ID ({2}). Die Benachrichtigungen werden an diese Chat-ID von der WAHA-Sitzung gesendet.",
"telegramServerUrlDescription": "Um die Telegram-Bot-API-Beschränkungen aufzuheben oder in gesperrten Gebieten (China, Iran usw.) Zugriff zu erhalten. Weitere Informationen findest du unter {0}. Standard: {1}", "telegramServerUrlDescription": "Um die Telegram-Bot-API-Beschränkungen aufzuheben oder in gesperrten Gebieten (China, Iran usw.) Zugriff zu erhalten. Weitere Informationen findest du unter {0}. Standard: {1}",
"telegramServerUrl": "(Optional) Server URL" "telegramServerUrl": "(Optional) Server URL",
"Font Twemoji by Twitter licensed under": "Schriftart Twemoji von Twitter lizenziert unter"
} }

View file

@ -518,6 +518,7 @@
"Clone": "Clone", "Clone": "Clone",
"cloneOf": "Clone of {0}", "cloneOf": "Clone of {0}",
"smtp": "Email (SMTP)", "smtp": "Email (SMTP)",
"Use HTML for custom E-mail body": "Use HTML for custom E-mail body",
"secureOptionNone": "None / STARTTLS (25, 587)", "secureOptionNone": "None / STARTTLS (25, 587)",
"secureOptionTLS": "TLS (465)", "secureOptionTLS": "TLS (465)",
"Ignore TLS Error": "Ignore TLS Error", "Ignore TLS Error": "Ignore TLS Error",
@ -758,12 +759,26 @@
"smseagleTo": "Phone number(s)", "smseagleTo": "Phone number(s)",
"smseagleGroup": "Phonebook group name(s)", "smseagleGroup": "Phonebook group name(s)",
"smseagleContact": "Phonebook contact name(s)", "smseagleContact": "Phonebook contact name(s)",
"smseagleGroupV2": "Phonebook group ID(s)",
"smseagleContactV2": "Phonebook contact ID(s)",
"smseagleRecipientType": "Recipient type", "smseagleRecipientType": "Recipient type",
"smseagleRecipient": "Recipient(s) (multiple must be separated with comma)", "smseagleRecipient": "Recipient(s) (multiple must be separated with comma)",
"smseagleToken": "API Access token", "smseagleToken": "API Access token",
"smseagleUrl": "Your SMSEagle device URL", "smseagleUrl": "Your SMSEagle device URL",
"smseagleEncoding": "Send as Unicode", "smseagleEncoding": "Send as Unicode (default=GSM-7)",
"smseaglePriority": "Message priority (0-9, default = 0)", "smseaglePriority": "Message priority (0-9, highest priority = 9)",
"smseagleMsgType": "Message type",
"smseagleMsgSms": "Sms message (default)",
"smseagleMsgRing": "Ring call",
"smseagleMsgTts": "Text-to-speech call",
"smseagleMsgTtsAdvanced": "Text-to-speech Advanced call",
"smseagleDuration": "Duration (in seconds)",
"smseagleTtsModel": "Text-to-speech model ID",
"smseagleApiType": "API version",
"smseagleApiv1": "APIv1 (for existing projects and backward compatibility)",
"smseagleApiv2": "APIv2 (recommended for new integrations)",
"smseagleDocs": "Check documentation or APIv2 availability: {0}",
"smseagleComma": "Multiple must be separated with comma",
"smspartnerApiurl": "You can find your API key in your dashboard at {0}", "smspartnerApiurl": "You can find your API key in your dashboard at {0}",
"smspartnerPhoneNumber": "Phone number(s)", "smspartnerPhoneNumber": "Phone number(s)",
"smspartnerPhoneNumberHelptext": "The number must be in the international format {0}, {1}. Multiple numbers must be separated by {2}", "smspartnerPhoneNumberHelptext": "The number must be in the international format {0}, {1}. Multiple numbers must be separated by {2}",
@ -785,6 +800,7 @@
"PushDeer Server": "PushDeer Server", "PushDeer Server": "PushDeer Server",
"pushDeerServerDescription": "Leave blank to use the official server", "pushDeerServerDescription": "Leave blank to use the official server",
"PushDeer Key": "PushDeer Key", "PushDeer Key": "PushDeer Key",
"SpugPush Template Code": "Template Code",
"wayToGetClickSendSMSToken": "You can get API Username and API Key from {0} .", "wayToGetClickSendSMSToken": "You can get API Username and API Key from {0} .",
"Custom Monitor Type": "Custom Monitor Type", "Custom Monitor Type": "Custom Monitor Type",
"Google Analytics ID": "Google Analytics ID", "Google Analytics ID": "Google Analytics ID",
@ -1058,6 +1074,9 @@
"rabbitmqHelpText": "To use the monitor, you will need to enable the Management Plugin in your RabbitMQ setup. For more information, please consult the {rabitmq_documentation}.", "rabbitmqHelpText": "To use the monitor, you will need to enable the Management Plugin in your RabbitMQ setup. For more information, please consult the {rabitmq_documentation}.",
"SendGrid API Key": "SendGrid API Key", "SendGrid API Key": "SendGrid API Key",
"Separate multiple email addresses with commas": "Separate multiple email addresses with commas", "Separate multiple email addresses with commas": "Separate multiple email addresses with commas",
"OneChatAccessToken": "OneChat Access Token",
"OneChatUserIdOrGroupId": "OneChat User ID or Group ID",
"OneChatBotId": "OneChat Bot ID",
"wahaSession": "Session", "wahaSession": "Session",
"wahaChatId": "Chat ID (Phone Number / Contact ID / Group ID)", "wahaChatId": "Chat ID (Phone Number / Contact ID / Group ID)",
"wayToGetWahaApiUrl": "Your WAHA Instance URL.", "wayToGetWahaApiUrl": "Your WAHA Instance URL.",
@ -1069,5 +1088,12 @@
"Plain Text": "Plain Text", "Plain Text": "Plain Text",
"Message Template": "Message Template", "Message Template": "Message Template",
"Template Format": "Template Format", "Template Format": "Template Format",
"Font Twemoji by Twitter licensed under": "Font Twemoji by Twitter licensed under" "Font Twemoji by Twitter licensed under": "Font Twemoji by Twitter licensed under",
"smsplanetApiToken": "Token for the SMSPlanet API",
"smsplanetApiDocs": "Detailed information on obtaining API tokens can be found in {the_smsplanet_documentation}.",
"the smsplanet documentation": "the smsplanet documentation",
"Phone numbers": "Phone numbers",
"Sender name": "Sender name",
"smsplanetNeedToApproveName": "Needs to be approved in the client panel",
"Disable URL in Notification": "Disable URL in Notification"
} }

View file

@ -341,7 +341,7 @@
"Packet Size": "Paketin koko", "Packet Size": "Paketin koko",
"telegram": "Telegram", "telegram": "Telegram",
"ZohoCliq": "ZohoCliq", "ZohoCliq": "ZohoCliq",
"Bot Token": "Botin token", "Bot Token": "Botin tokeni",
"wayToGetTelegramToken": "Voit saada tunnuksen osoitteesta {0}.", "wayToGetTelegramToken": "Voit saada tunnuksen osoitteesta {0}.",
"Chat ID": "Chat-tunnus", "Chat ID": "Chat-tunnus",
"wayToGetTelegramChatID": "Saat chat-tunnuksesi lähettämällä viestin botille ja siirtymällä tähän URL-osoitteeseen nähdäksesi chat_id:", "wayToGetTelegramChatID": "Saat chat-tunnuksesi lähettämällä viestin botille ja siirtymällä tähän URL-osoitteeseen nähdäksesi chat_id:",
@ -1096,5 +1096,25 @@
"RabbitMQ Nodes": "RabbitMQ-hallintasolmut", "RabbitMQ Nodes": "RabbitMQ-hallintasolmut",
"rabbitmqNodesDescription": "Anna URL RabbitMQ-hallintasolmuille sisältäen protokollan ja portin. Esimerkki: {0}", "rabbitmqNodesDescription": "Anna URL RabbitMQ-hallintasolmuille sisältäen protokollan ja portin. Esimerkki: {0}",
"rabbitmqHelpText": "Jotta voit käyttää seurainta, sinun on otettava hallintalaajennus käyttöön RabbitMQ-asetuksissa. Lisätietoja saat osoitteesta {rabitmq_documentation}.", "rabbitmqHelpText": "Jotta voit käyttää seurainta, sinun on otettava hallintalaajennus käyttöön RabbitMQ-asetuksissa. Lisätietoja saat osoitteesta {rabitmq_documentation}.",
"aboutSlackUsername": "Muuttaa viestin lähettäjän näyttönimeä. Jos haluat mainita jonkun, lisää se ystävälliseen nimeen." "aboutSlackUsername": "Muuttaa viestin lähettäjän näyttönimeä. Jos haluat mainita jonkun, lisää se ystävälliseen nimeen.",
"Font Twemoji by Twitter licensed under": "Twemoji-fontti (Twitter) on lisensoitu seuraavalla lisenssillä",
"wayToGetWahaSession": "Tästä istunnosta WAHA lähettää ilmoituksia Chat ID:hen. Löydät sen WAHA kojelaudasta.",
"wayToWriteWahaChatId": "Puhelinnumero kansainvälisellä etuliitteellä, mutta ilman plusmerkkiä alussa ({0}), yhteystietotunnusta ({1}) tai ryhmätunnusta ({2}). Ilmoitukset lähetetään tähän chat-tunnukseen WAHA-istunnosta.",
"wahaSession": "Istunto",
"wahaChatId": "Viesti ID (Puhelinnumero / Yhteystieto ID / Ryhmä ID)",
"Template Format": "Malli Muotoilu",
"wayToGetWahaApiUrl": "Sinun WAHA instanssin URL.",
"YZJ Webhook URL": "YZJ Webhook URL",
"telegramServerUrl": "(Valinnainen) Palvelin Url",
"telegramServerUrlDescription": "Telegramin bot-api-rajoitusten poistamiseksi tai pääsyn saamiseksi estetyille alueille (Kiina, Iran jne.). Saat lisätietoja napsauttamalla {0}. Oletus: {1}",
"Message Template": "Viesti Malli",
"YZJ Robot Token": "YZJ Robotti tokeni",
"wayToGetWahaApiKey": "API Key on WHATSAPP_API_KEY ympäristömuuttujan arvo, jota käytit WAHA käynnistämiseen.",
"Plain Text": "Pelkkää tekstiä",
"templateServiceName": "palvelin nimi",
"templateHostnameOrURL": "isäntänimi tai URL",
"templateStatus": "tila",
"telegramUseTemplate": "Käytä mukautettua viesti mallia",
"telegramUseTemplateDescription": "Jos aktivoitu, viesti lähetetään käyttämällä mukautettua mallia.",
"telegramTemplateFormatDescription": "Telegram sallii erilaisten merkintäkielien käytön viesteissä, katso Telegram {0} tarkempia tietoja."
} }

View file

@ -1117,5 +1117,6 @@
"wayToGetWahaApiKey": "La clé API est la valeur de la variable d'environnement WHATSAPP_API_KEY que vous avez utilisée pour exécuter WAHA.", "wayToGetWahaApiKey": "La clé API est la valeur de la variable d'environnement WHATSAPP_API_KEY que vous avez utilisée pour exécuter WAHA.",
"wayToWriteWahaChatId": "Le numéro de téléphone avec le préfixe international, mais sans le signe plus ({0}), l'identifiant de contact ({1}) ni l'identifiant de groupe ({2}). Les notifications sont envoyées à cet identifiant de chat depuis la session WAHA.", "wayToWriteWahaChatId": "Le numéro de téléphone avec le préfixe international, mais sans le signe plus ({0}), l'identifiant de contact ({1}) ni l'identifiant de groupe ({2}). Les notifications sont envoyées à cet identifiant de chat depuis la session WAHA.",
"telegramServerUrlDescription": "Pour lever les limitations de lAPI des bots Telegram ou accéder aux zones bloquées (Chine, Iran, etc.). Pour plus dinformations, cliquez sur {0}. Par défaut : {1}", "telegramServerUrlDescription": "Pour lever les limitations de lAPI des bots Telegram ou accéder aux zones bloquées (Chine, Iran, etc.). Pour plus dinformations, cliquez sur {0}. Par défaut : {1}",
"telegramServerUrl": "(Facultatif) URL du serveur" "telegramServerUrl": "(Facultatif) URL du serveur",
"Font Twemoji by Twitter licensed under": "La police Twemoji de Twitter est sous licence"
} }

View file

@ -1080,5 +1080,24 @@
"Fail": "Hiba", "Fail": "Hiba",
"Pop": "Megjelen", "Pop": "Megjelen",
"Bitrix24 Webhook URL": "Bitrix24 Webhook URL", "Bitrix24 Webhook URL": "Bitrix24 Webhook URL",
"wayToGetHeiiOnCallDetails": "A Trigger ID és az API kulcsok megszerzésének módja a {dokumentáció}" "wayToGetHeiiOnCallDetails": "A Trigger ID és az API kulcsok megszerzésének módja a {dokumentáció}",
"telegramServerUrl": "(Választható) Szerver Url",
"telegramServerUrlDescription": "A Telegram bot api korlátozásainak feloldása vagy hozzáférés a blokkolt területekhez (Kína, Irán stb.). További információért kattintson a {0} gombra. Alapértelmezett: {1}",
"wahaSession": "Munkamenet",
"wahaChatId": "Beszélgetés azonosító (Telefonszám / Kontakt azonosító / Csoport azonosító)",
"wayToGetWahaApiUrl": "WAHA példányod URL-je.",
"wayToGetWahaApiKey": "Az API-kulcs a WHATSAPP_API_KEY környezeti változó értéke, amelyet a WAHA futtatásához használt.",
"wayToWriteWahaChatId": "A telefonszám nemzetközi előtaggal, de az elején lévő pluszjel ({0}), a kapcsolattartó azonosítója ({1}) vagy a csoportazonosító ({2}) nélkül. A WAHA Session értesítéseket küld erre a beszélgetési azonosítóra.",
"Plain Text": "Sima Szöveg",
"Message Template": "Üzenet Sablon",
"Template Format": "Sablon Formátum",
"wayToGetWahaSession": "A munkamenetből WAHA küld egy értesítést a Beszélgetés azonosítóra. Az értesítést megtalálhatod a WAHA műszerfalon.",
"YZJ Webhook URL": "YZJ Webhook URL",
"YZJ Robot Token": "YZJ Robot token",
"templateServiceName": "szolgáltatás név",
"templateHostnameOrURL": "kiszolgáló név vagy URL",
"templateStatus": "státusz",
"telegramUseTemplate": "Egyéni üzenetsablon használata",
"telegramUseTemplateDescription": "Ha engedélyezve van, az üzenet egy egyéni sablon szerint lesz elküldve.",
"telegramTemplateFormatDescription": "Telegram különböző jelölőnyelvek használatát engedi, további információkért lásd {0}."
} }

View file

@ -59,7 +59,7 @@
"day": "giorno | giorni", "day": "giorno | giorni",
"-day": "-giorni", "-day": "-giorni",
"hour": "ora", "hour": "ora",
"-hour": "-ore", "-hour": "-ora",
"Response": "Risposta", "Response": "Risposta",
"Ping": "Ping", "Ping": "Ping",
"Monitor Type": "Modalità di monitoraggio", "Monitor Type": "Modalità di monitoraggio",
@ -80,7 +80,7 @@
"pushOptionalParams": "Parametri aggiuntivi: {0}", "pushOptionalParams": "Parametri aggiuntivi: {0}",
"Save": "Salva", "Save": "Salva",
"Notifications": "Notifiche", "Notifications": "Notifiche",
"Not available, please setup.": "Non disponibili, richiesta configurazione manuale.", "Not available, please setup.": "Non disponibile, richiesta configurazione manuale.",
"Setup Notification": "Configura le notifiche", "Setup Notification": "Configura le notifiche",
"Light": "Chiaro", "Light": "Chiaro",
"Dark": "Scuro", "Dark": "Scuro",
@ -738,5 +738,9 @@
"invertKeywordDescription": "Cerca la parola chiave essere assente anziché presente.", "invertKeywordDescription": "Cerca la parola chiave essere assente anziché presente.",
"octopushAPIKey": "\"API Key\" dalle credenziali API HTTP nel pannello di controllo", "octopushAPIKey": "\"API Key\" dalle credenziali API HTTP nel pannello di controllo",
"Enable TLS": "Abilita TLS", "Enable TLS": "Abilita TLS",
"ignoredTLSError": "Ignora errori TLS/SSL" "ignoredTLSError": "Ignora errori TLS/SSL",
"templateHostnameOrURL": "nome host o URL",
"templateStatus": "stato",
"templateServiceName": "nome del servizio",
"locally configured mail transfer agent": "agente mail configurato localmente"
} }

View file

@ -1065,5 +1065,25 @@
"Key Added": "追加キー", "Key Added": "追加キー",
"Bark Sound": "Bark通知音", "Bark Sound": "Bark通知音",
"Badge URL": "バッジURL", "Badge URL": "バッジURL",
"pushoversounds intermission": "Intermission" "pushoversounds intermission": "Intermission",
"telegramServerUrl": "(任意)サーバーUrl",
"telegramServerUrlDescription": "Telegramのボットapiの制限を解除したり、ブロックされた地域中国、イランなどでアクセスする。詳しくは {0} をクリックしてください。デフォルト: {1}",
"wayToWriteWahaChatId": "電話番号の先頭にプラス記号を付けない国際電話番号({0})、コンタクトID ({1})、またはグループID ({2}) 。WAHAセッションからこのチャットIDに通知が送信されます。",
"wahaSession": "セッション",
"wahaChatId": "チャットID電話番号連絡先IDグループID",
"wayToGetWahaApiUrl": "WAHAインスタンスのURL。",
"wayToGetWahaApiKey": "APIキーはWAHAを実行するために使用したWHATSAPP_API_KEY環境変数の値です。",
"wayToGetWahaSession": "このセッションから WAHA はチャット ID に通知を送信します。WAHAダッシュボードで確認できます。",
"YZJ Webhook URL": "YZJ ウェブフック URL",
"YZJ Robot Token": "YZJ ロボットトークン",
"Plain Text": "平文",
"Message Template": "メッセージテンプレート",
"Template Format": "テンプレート形式",
"templateServiceName": "サービス名",
"templateHostnameOrURL": "ホスト名またはURL",
"templateStatus": "ステータス",
"telegramUseTemplate": "カスタムメッセージテンプレートを使用",
"telegramUseTemplateDescription": "有効にすると、メッセージはカスタムテンプレートを使って送信されます。",
"telegramTemplateFormatDescription": "Telegramではメッセージに異なるマークアップ言語を使用することができます。詳細はTelegram {0} を参照してください。",
"Font Twemoji by Twitter licensed under": "TwemojiフォントはTwitterライセンス下でライセンスされています"
} }

View file

@ -76,7 +76,7 @@
"Accepted Status Codes": "응답 성공 상태 코드", "Accepted Status Codes": "응답 성공 상태 코드",
"Save": "저장", "Save": "저장",
"Notifications": "알림", "Notifications": "알림",
"Not available, please setup.": "존재하지 않아요, 새로운 거 하나 만드는 건 어때요?", "Not available, please setup.": "존재하지 않아요. 새로운 거 하나 만드는 건 어때요?",
"Setup Notification": "알림 설정", "Setup Notification": "알림 설정",
"Light": "화이트", "Light": "화이트",
"Dark": "다크", "Dark": "다크",
@ -797,5 +797,42 @@
"successKeywordExplanation": "성공으로 간주되는 MQTT 키워드", "successKeywordExplanation": "성공으로 간주되는 MQTT 키워드",
"Reset Token": "토큰 초기화", "Reset Token": "토큰 초기화",
"Check/Uncheck": "체크/체크 해제", "Check/Uncheck": "체크/체크 해제",
"pushViewCode": "푸시 모니터링는 어떻게 사용하나요? (코드 보기)" "pushViewCode": "푸시 모니터링는 어떻게 사용하나요? (코드 보기)",
"Search monitored sites": "모니터링중인 사이트 검색",
"templateHeartbeatJSON": "heartbeat를 설명하는 오브젝트",
"shrinkDatabaseDescriptionSqlite": "SQLite 데이터베이스에서 {vacuum} 명령을 실행해요. {auto_vacuum}이 이미 활성화되어 있지만, {auto_vacuum}은 {vacuum}이 하는 것처럼 데이터베이스를 조각 모음 하거나 페이지를 다시 압축하지는 않아요.",
"statusPageSpecialSlugDesc": "특별한 주소 {0}: 아무런 주소도 입력되지 않으면 이 페이지가 보여요",
"Add a new expiry notification day": "새 만료 알림 날짜 추가",
"Refresh Interval Description": "이 상태 페이지는 {0}초마다 완전 새로고침(F5) 돼요",
"telegramServerUrlDescription": "텔레그램 봇 API의 제한을 해제하거나, 차단된 지역(중국, 이란 등)에서 액세스하려면 {0}을 클릭하세요. 기본값: {1}",
"chromeExecutableDescription": "Docker 사용자의 경우, Chromium이 아직 설치되지 않았다면 이를 설치하고 테스트 결과를 표시하는 데 몇 분이 걸릴 수 있어요. 1GB의 디스크 공간을 사용해요.",
"templateMonitorJSON": "monitor를 설명하는 오브젝트",
"webhookBodyCustomOption": "커스텀 Body",
"telegramServerUrl": "(선택) 서버 URL",
"and": "그리고",
"emailCustomisableContent": "사용자 지정 가능한 콘텐츠",
"smtpLiquidIntroduction": "다음 두 개 필드는 Liquid 템플릿 언어를 통해 템플릿화할 수 있습니다. 사용 지침은 {0}을 참조하세요. 사용 가능한 변수는 다음과 같습니다:",
"leave blank for default subject": "기본값을 사용하려면 비워두세요",
"emailCustomBody": "커스텀 Body",
"leave blank for default body": "기본값을 사용하려면 비워두세요",
"templateServiceName": "서비스 이름",
"templateHostnameOrURL": "호스트명 또는 URL",
"templateStatus": "상태",
"selectedMonitorCount": "선택됨: {0}",
"Remove the expiry notification": "만료 알림 날짜 제거",
"Refresh Interval": "새로고침 주기",
"noDockerHostMsg": "사용할 수 없습니다. 먼저 도커 호스트를 설정하세요.",
"DockerHostRequired": "이 모니터링을 위한 도커 호스트를 설정해 주세요.",
"tailscalePingWarning": "Tailscale Ping 모니터링을 사용하려면 Docker 없이 Uptime Kuma를 설치하고 서버에 Tailscale 클라이언트도 설치해야 합니다.",
"telegramUseTemplate": "커스텀 메시지 템플릿 사용",
"telegramUseTemplateDescription": "활성화하면 메시지를 보낼 때 커스텀 템플릿을 사용해요.",
"telegramTemplateFormatDescription": "텔레그램은 메시지에 다양한 마크업 언어를 사용할 수 있어요. 자세한 내용은 텔레그램 {0}을 참조하세요.",
"RabbitMQ Username": "RabbitMQ 사용자명",
"RabbitMQ Password": "RabbitMQ 비밀번호",
"wahaSession": "세션",
"emailTemplateMsg": "알림 메시지",
"Select message type": "메시지 유형 선택",
"Send to channel": "채널로 전송",
"Create new forum post": "새 포럼 게시물 만들기",
"Your User ID": "사용자 ID"
} }

7
src/lang/lv.json Normal file
View file

@ -0,0 +1,7 @@
{
"languageName": "Latviešu",
"setupDatabaseChooseDatabase": "Kuru datubāzi izmantosiet?",
"setupDatabaseEmbeddedMariaDB": "Jums nav nekas jādara. Docker imidžā ir iebūvēta un automātiski konfigurēta MariaDB datubāze. Uptime Kuma pieslēgsies šai datubāzei izmantojot unix soketu.",
"setupDatabaseSQLite": "Vienkāršs datu bāzes fails, iesakāms maza izmēra risinājumiem. Pirms versijas v2.0.0 SQLite bija noklusējuma datubāze.",
"setupDatabaseMariaDB": "Pieslēgties ārējai MariaDB datubāzei. Jums būs jākonfigurē datubāzes pieslēgšanās informācija."
}

View file

@ -7,24 +7,24 @@
"Game": "Permainan", "Game": "Permainan",
"Primary Base URL": "URL Pangkalan Utama", "Primary Base URL": "URL Pangkalan Utama",
"Version": "Versi", "Version": "Versi",
"Add": "Menambah", "Add": "Tambah",
"Quick Stats": "Statistik ringkas", "Quick Stats": "Statistik Pantas",
"Up": "Dalam talian", "Up": "Atas",
"Down": "Luar talian", "Down": "Bawah",
"Pending": "Belum selesai", "Pending": "Dalam Proses",
"statusMaintenance": "Membaiki", "statusMaintenance": "Penyelenggaraan",
"Maintenance": "Membaiki", "Maintenance": "Penyelenggaraan",
"Unknown": "Tidak ketahui", "Unknown": "Tidak Diketahui",
"General Monitor Type": "Jenis monitor umum", "General Monitor Type": "Jenis Monitor Umum",
"Check Update On GitHub": "Semak kemas kini dalam GitHub", "Check Update On GitHub": "Semak kemas kini di GitHub",
"List": "Senarai", "List": "Senarai",
"Specific Monitor Type": "Jenis monitor spesifik", "Specific Monitor Type": "Jenis Monitor Spesifik",
"markdownSupported": "Sintaks markdown disokong", "markdownSupported": "Sintaks markdown disokong",
"languageName": "Bahasa inggeris", "languageName": "Bahasa inggeris",
"Dashboard": "Papan pemuka", "Dashboard": "Papan pemuka",
"Language": "Bahasa", "Language": "Bahasa",
"Add New Monitor": "Tambah monitor baharu", "Add New Monitor": "Tambah Monitor Baharu",
"Passive Monitor Type": "Jenis monitor pasif", "Passive Monitor Type": "Jenis Monitor Pasif",
"No Services": "Tiada Servis", "No Services": "Tiada Servis",
"Add a monitor": "Tambah Monitor", "Add a monitor": "Tambah Monitor",
"High": "Tinggi", "High": "Tinggi",
@ -49,5 +49,41 @@
"Content Type": "Jenis Content", "Content Type": "Jenis Content",
"Home": "Laman Utama", "Home": "Laman Utama",
"Settings": "Tetapan", "Settings": "Tetapan",
"Save": "Simpan" "Save": "Simpan",
"Cannot connect to the socket server": "Tidak dapat disambungkan kepada pelayan soket",
"Resume": "Sambung",
"Current": "Terkini",
"Uptime": "Uptime",
"Cert Exp.": "Tamat Sijil",
"now": "sekarang",
"setupDatabaseMariaDB": "Sambungan kepada pangkalan data MariaDB secara luaran. Anda perlu tetapkan maklumat sambungan pangkalan data.",
"hour": "jam",
"Ping": "Ping",
"settingUpDatabaseMSG": "Pangkalan data sedang ditetapkan. Sila tunggu sebentar.",
"Reconnecting...": "Penyambungan...",
"Message": "Mesej",
"No important events": "Tiada info penting",
"Edit": "Sunting",
"Delete": "Padam",
"Monitor": "Monitor | Monitors",
"time ago": "{0} yang lepas",
"day": "hari | hari",
"-day": "-hari",
"-year": "-tahun",
"Pause": "Rehat",
"Status": "Status",
"DateTime": "TarikhMasa",
"dbName": "Nama Pangkalan Data",
"-hour": "-jam",
"Response": "Tindakbalas",
"Monitor Type": "Jenis Monitor",
"Keyword": "Katakunci",
"pauseDashboardHome": "Rehat",
"Name": "Nama",
"setupDatabaseChooseDatabase": "Pangkalan Data yang mana hendak digunakan ?",
"Host URL": "URL Host",
"URL": "URL",
"Expected Value": "Nilai Sepatutnya",
"Friendly Name": "Nama Mudah",
"Hostname": "Nama Host"
} }

View file

@ -127,7 +127,7 @@
"Create": "Aanmaken", "Create": "Aanmaken",
"Clear Data": "Data wissen", "Clear Data": "Data wissen",
"Events": "Gebeurtenissen", "Events": "Gebeurtenissen",
"Heartbeats": "Heartbeats", "Heartbeats": "Hartslagen",
"Auto Get": "Auto Get", "Auto Get": "Auto Get",
"backupDescription": "U kunt een back-up maken van alle monitoren en alle meldingen in een JSON-bestand.", "backupDescription": "U kunt een back-up maken van alle monitoren en alle meldingen in een JSON-bestand.",
"backupDescription2": "PS: Geschiedenis- en gebeurtenisgegevens zijn niet inbegrepen.", "backupDescription2": "PS: Geschiedenis- en gebeurtenisgegevens zijn niet inbegrepen.",
@ -464,24 +464,24 @@
"Show Powered By": "Laat \"Mogeljik gemaakt door\" zien", "Show Powered By": "Laat \"Mogeljik gemaakt door\" zien",
"Domain Names": "Domein Namen", "Domain Names": "Domein Namen",
"pushoversounds pushover": "Pushover (standaard)", "pushoversounds pushover": "Pushover (standaard)",
"pushoversounds bike": "Bike", "pushoversounds bike": "Fiets",
"pushoversounds bugle": "Bugle", "pushoversounds bugle": "Trompet",
"pushoversounds cashregister": "Cash Register", "pushoversounds cashregister": "Kassa",
"pushoversounds classical": "Classical", "pushoversounds classical": "Classical",
"pushoversounds cosmic": "Cosmic", "pushoversounds cosmic": "Buitenaards",
"pushoversounds falling": "Falling", "pushoversounds falling": "Vallend",
"pushoversounds gamelan": "Gamelan", "pushoversounds gamelan": "Gamelan",
"pushoversounds incoming": "Incoming", "pushoversounds incoming": "Inkomend",
"pushoversounds intermission": "Intermission", "pushoversounds intermission": "Pauze",
"pushoversounds magic": "Magic", "pushoversounds magic": "Magie",
"pushoversounds mechanical": "Mechanical", "pushoversounds mechanical": "Mechanisch",
"pushoversounds pianobar": "Piano Bar", "pushoversounds pianobar": "Piano Bar",
"pushoversounds siren": "Siren", "pushoversounds siren": "Sirene",
"pushoversounds spacealarm": "Space Alarm", "pushoversounds spacealarm": "Ruimte Alarm",
"pushoversounds tugboat": "Tug Boat", "pushoversounds tugboat": "Tug Boat",
"pushoversounds alien": "Alien Alarm (long)", "pushoversounds alien": "Alien Alarm (long)",
"pushoversounds climb": "Climb (long)", "pushoversounds climb": "Climb (long)",
"pushoversounds persistent": "Persistent (long)", "pushoversounds persistent": "Aanhoudend (lang)",
"pushoversounds echo": "Pushover Echo (long)", "pushoversounds echo": "Pushover Echo (long)",
"pushoversounds updown": "Up Down (long)", "pushoversounds updown": "Up Down (long)",
"pushoversounds vibrate": "Alleen trillen", "pushoversounds vibrate": "Alleen trillen",
@ -649,8 +649,8 @@
"smseagleTo": "Telefoonnummer(s)", "smseagleTo": "Telefoonnummer(s)",
"Custom Monitor Type": "Custom Monitor Type", "Custom Monitor Type": "Custom Monitor Type",
"trustProxyDescription": "'X-Forwarded-*' headers vertrouwen. Als je de correcte client IP wilt krijgen en de Uptime Kuma installatie is achter een proxy zoals Nginx of Apache, schakel dan dit in.", "trustProxyDescription": "'X-Forwarded-*' headers vertrouwen. Als je de correcte client IP wilt krijgen en de Uptime Kuma installatie is achter een proxy zoals Nginx of Apache, schakel dan dit in.",
"RadiusCalledStationId": "Called Station Id", "RadiusCalledStationId": "Genoemde stations ID",
"RadiusCalledStationIdDescription": "Identifier of the called device", "RadiusCalledStationIdDescription": "Identificatie van het genoemde apparaat",
"RadiusCallingStationId": "Calling Station Id", "RadiusCallingStationId": "Calling Station Id",
"ZohoCliq": "ZohoCliq", "ZohoCliq": "ZohoCliq",
"Long-Lived Access Token": "Long-Lived Access Token", "Long-Lived Access Token": "Long-Lived Access Token",
@ -789,7 +789,7 @@
"Badge Warn Days": "Badge Waarschuwing dagen", "Badge Warn Days": "Badge Waarschuwing dagen",
"Badge Down Days": "Badge Offline dagen", "Badge Down Days": "Badge Offline dagen",
"Badge Style": "Badge stijl", "Badge Style": "Badge stijl",
"chromeExecutable": "Chrome/Chromium Executable", "chromeExecutable": "Chrome/Chromium Uitvoerbaar bestand",
"chromeExecutableAutoDetect": "Automatisch detecteren", "chromeExecutableAutoDetect": "Automatisch detecteren",
"Edit Maintenance": "Onderhoud bewerken", "Edit Maintenance": "Onderhoud bewerken",
"Badge Label": "Badge Label", "Badge Label": "Badge Label",
@ -1039,36 +1039,36 @@
"ends with": "eindigt met", "ends with": "eindigt met",
"not ends with": "eindigt niet met", "not ends with": "eindigt niet met",
"less than": "minder dan", "less than": "minder dan",
"greater than": "meer dan", "greater than": "groter dan",
"record": "dossier", "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.", "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.",
"rabbitmqNodesDescription": "Voer het URL voor de RabbitMQ beheerkooppunt inclusief protocol en poort in. Bijvoorbeeld: {0}", "rabbitmqNodesDescription": "Voer het URL voor de RabbitMQ beheer nodes inclusief protocol en poort in. Bijvoorbeeld: {0}",
"rabbitmqNodesRequired": "Aub stel de knooppunten voor deze monitor in.", "rabbitmqNodesRequired": "Aub stel de knooppunten voor deze monitor in.",
"rabbitmqNodesInvalid": "Stel gebruik een volledig gekwalificeerde (beginnend met 'http') URL voor RabbitMQ-knooppunten.", "rabbitmqNodesInvalid": "Gebruik een volledig gekwalificeerde (beginnend met 'http') URL voor de RabbitMQ nodes.",
"RabbitMQ Username": "RabbitMQ gebruikersnaam", "RabbitMQ Username": "RabbitMQ gebruikersnaam",
"RabbitMQ Password": "RabbitMQ wachtwoord", "RabbitMQ Password": "RabbitMQ wachtwoord",
"rabbitmqHelpText": "Om gebruik te maken van de monitor moet je de Management Plugin in de RabbitMQ setup aanzetten. Voor meer informatie zie de {rabitmq_documentatie}.", "rabbitmqHelpText": "Om gebruik te maken van de monitor moet je de Management Plugin in de RabbitMQ setup aanzetten. Voor meer informatie zie de {rabitmq_documentatie}.",
"SendGrid API Key": "SendGrid API sleutel", "SendGrid API Key": "SendGrid API sleutel",
"Separate multiple email addresses with commas": "Splits meerdere emailadressen met kommas", "Separate multiple email addresses with commas": "Splits meerdere emailadressen met kommas",
"RabbitMQ Nodes": "RabbitMQ Beheerknoppunten", "RabbitMQ Nodes": "RabbitMQ beheer Nodes",
"shrinkDatabaseDescriptionSqlite": "Trigger database {vacuum} voor SQLite. {auto_vacuum} is al ingeschakeld, maar hiermee wordt de database niet gedefragmenteerd en worden ook databasepagina's niet afzonderlijke opnieuw ingepakt zoals de opdracht {vacuum} dat doet.", "shrinkDatabaseDescriptionSqlite": "Trigger database {vacuum} voor SQLite. {auto_vacuum} is al ingeschakeld, maar hiermee wordt de database niet gedefragmenteerd en worden ook databasepagina's niet afzonderlijke opnieuw ingepakt zoals de opdracht {vacuum} dat doet.",
"aboutSlackUsername": "Wijzigt de weergavenaam van de afzender van het bericht. Als je iemand wilt vermelden, voer in dat geval de naam in als vriendelijke naam.", "aboutSlackUsername": "Verandert de weergavenaam van de afzender. Als je iemand wil vermelden, voeg dit dan aan de vriendelijke naam toe.",
"cacheBusterParam": "Voeg de parameter {0} toe", "cacheBusterParam": "Voeg de {0} parameter",
"Form Data Body": "Formulier Gegevens Content", "Form Data Body": "Formulier Gegevens Body",
"Optional: Space separated list of scopes": "Optioneel: Reikwijdte door spaties gescheiden lijst", "Optional: Space separated list of scopes": "Optioneel: door spaties gescheiden lijst met scopes",
"Alphanumerical string and hyphens only": "Alleen alfanumerieke tekenreeksen en koppeltekens", "Alphanumerical string and hyphens only": "Alleen alfanumerieke tekens en streepjes",
"Time sensitive notifications will be delivered immediately, even if the device is in do not disturb mode.": "Tijdsgevoelige meldingen worden meteen afgeleverd, zelfs als het apparaat in niet storen modus staat.", "Time sensitive notifications will be delivered immediately, even if the device is in do not disturb mode.": "Tijdsgevoelige meldingen worden meteen afgeleverd, zelfs als het apparaat in niet storen modus staat.",
"Message format": "Berichtformaat", "Message format": "Bericht opmaak",
"Send rich messages": "Stuur rijke berichten", "Send rich messages": "Verstuur berichten met opmaak",
"OAuth Scope": "OAuth Reikwijdte", "OAuth Scope": "OAuth bereik",
"equals": "gelijk aan", "equals": "hetzelfde als",
"not equals": "niet gelijk aan", "not equals": "niet gelijk aan",
"less than or equal to": "kleiner dan of gelijk aan", "less than or equal to": "minder dan of gelijk aan",
"greater than or equal to": "groter dan of gelijk aan", "greater than or equal to": "meer dan of gelijk aan",
"Notification Channel": "Meldingskanaal", "Notification Channel": "Notificatie kanaal",
"Sound": "Geluid", "Sound": "Geluid",
"Arcade": "Speelhal", "Arcade": "Speelhal",
"Correct": "Juist", "Correct": "Goed",
"Fail": "Mislukt", "Fail": "Mislukt",
"Harp": "Harp", "Harp": "Harp",
"Reveal": "Laat zien", "Reveal": "Laat zien",
@ -1082,12 +1082,31 @@
"Time Sensitive (iOS Only)": "Tijdsgevoelig (alleen voor iOs)", "Time Sensitive (iOS Only)": "Tijdsgevoelig (alleen voor iOs)",
"From": "Van", "From": "Van",
"Can be found on:": "Kan gevonden worden op: {0}", "Can be found on:": "Kan gevonden worden op: {0}",
"The phone number of the recipient in E.164 format.": "Het telefoonnummer van de ontvanger in E.164 formaat", "The phone number of the recipient in E.164 format.": "Het telefoonnummer van de ontvanger in E.164 formaat.",
"Either a text sender ID or a phone number in E.164 format if you want to be able to receive replies.": "Ofwel een sms zender ID of een telefoonnummer in E.164 formaat als je reacties wil ontvangen.", "Either a text sender ID or a phone number in E.164 format if you want to be able to receive replies.": "Ofwel een sms zender ID of een telefoonnummer in E.164 formaat als je reacties wil ontvangen.",
"Clear": "Helder", "Clear": "Helder",
"Elevator": "Lift", "Elevator": "Lift",
"Pop": "Pop", "Pop": "Pop",
"Community String": "Gemeenschap Tekst", "Community String": "Gemeenschapsreeks",
"Json Query Expression": "Json Query Expressie", "Json Query Expression": "JSON Query Expressie",
"ignoredTLSError": "TLS/SSL-fouten zijn genegeerd" "ignoredTLSError": "TLS/SSL-fouten zijn genegeerd",
"telegramServerUrl": "(Optioneel) Server Url",
"telegramServerUrlDescription": "Om de beperkingen van Telegram's bot api op te heffen of toegang te krijgen in geblokkeerde gebieden (China, Iran, enz.). Klik voor meer informatie op {0}. Standaard: {1}",
"wahaSession": "Sessie",
"wahaChatId": "Chat-ID (telefoonnummer / contact-ID / groeps-ID)",
"wayToGetWahaApiUrl": "Je WAHA Instance URL.",
"wayToGetWahaApiKey": "API Key is de WHATSAPP_API_KEY omgevingsvariabele die je hebt gebruikt om WAHA uit te voeren.",
"wayToGetWahaSession": "Vanaf deze sessie stuurt WAHA meldingen naar Chat ID. Je kunt deze vinden in WAHA Dashboard.",
"wayToWriteWahaChatId": "Het telefoonnummer met het internationale voorvoegsel, maar zonder het plusteken aan het begin ({0}), de contact-ID ({1}) of de groeps-ID ({2}). Vanuit WAHA Sessie worden meldingen naar deze Chat-ID verzonden.",
"YZJ Robot Token": "YZJ Robot token",
"Plain Text": "Platte tekst",
"Message Template": "Bericht Sjabloon",
"YZJ Webhook URL": "YZJ Webhook URL",
"Template Format": "Sjabloonformaat",
"templateServiceName": "service naam",
"templateHostnameOrURL": "hostnaam of url",
"templateStatus": "status",
"telegramUseTemplate": "Gebruik aangepaste bericht sjabloon",
"telegramTemplateFormatDescription": "Telegram staat het gebruik van verschillende opmaaktalen voor berichten toe, zie Telegram {0} voor specifieke details.",
"telegramUseTemplateDescription": "Indien ingeschakeld, wordt het bericht verzonden met een aangepaste sjabloon."
} }

View file

@ -1098,5 +1098,24 @@
"RabbitMQ Username": "Nazwa użytkownika RabbitMQ", "RabbitMQ Username": "Nazwa użytkownika RabbitMQ",
"RabbitMQ Password": "Hasło RabbitMQ", "RabbitMQ Password": "Hasło RabbitMQ",
"SendGrid API Key": "Klucz API SendGrid", "SendGrid API Key": "Klucz API SendGrid",
"Separate multiple email addresses with commas": "Oddziel wiele adresów e-mail przecinkami" "Separate multiple email addresses with commas": "Oddziel wiele adresów e-mail przecinkami",
"templateServiceName": "service name",
"telegramServerUrlDescription": "Aby znieść ograniczenia api bota Telegrama lub uzyskać dostęp w zablokowanych obszarach (Chiny, Iran itp.). Aby uzyskać więcej informacji, kliknij {0}. Domyślnie: {1}",
"wayToGetWahaSession": "Z tej sesji WAHA wysyła powiadomienia do Chat ID. Można go znaleźć w WAHA Dashboard.",
"wayToWriteWahaChatId": "Numer telefonu z prefiksem międzynarodowym, ale bez znaku plus na początku ({0}), identyfikator kontaktu ({1}) lub identyfikator grupy ({2}). Powiadomienia są wysyłane do tego identyfikatora czatu z sesji WAHA.",
"wahaSession": "Sesja",
"wahaChatId": "Identyfikator czatu (numer telefonu / identyfikator kontaktu / identyfikator grupy)",
"wayToGetWahaApiUrl": "Adres URL instancji WAHA.",
"wayToGetWahaApiKey": "Klucz API to wartość zmiennej środowiskowej WHATSAPP_API_KEY użytej do uruchomienia WAHA.",
"YZJ Robot Token": "Token robota YZJ",
"YZJ Webhook URL": "Adres URL usługi YZJ Webhook",
"telegramServerUrl": "(Opcjonalnie) Adres URL serwera",
"Plain Text": "Zwykły tekst",
"Message Template": "Szablon wiadomości",
"Template Format": "Format szablonu",
"templateHostnameOrURL": "nazwa hosta lub adres URL",
"templateStatus": "status",
"telegramUseTemplate": "Użyj niestandardowego szablonu wiadomości",
"telegramUseTemplateDescription": "Jeśli opcja ta jest włączona, wiadomość zostanie wysłana przy użyciu niestandardowego szablonu.",
"telegramTemplateFormatDescription": "Telegram pozwala na używanie różnych języków znaczników dla wiadomości, zobacz Telegram {0}, aby uzyskać szczegółowe informacje."
} }

View file

@ -1068,5 +1068,19 @@
"telegramTemplateFormatDescription": "O Telegram permite o uso de diferentes linguagens de marcação para mensagens. Veja o Telegram {0} para detalhes específicos.", "telegramTemplateFormatDescription": "O Telegram permite o uso de diferentes linguagens de marcação para mensagens. Veja o Telegram {0} para detalhes específicos.",
"templateHostnameOrURL": "hostname ou URL", "templateHostnameOrURL": "hostname ou URL",
"templateStatus": "status", "templateStatus": "status",
"telegramUseTemplateDescription": "Se habilitado, a mensagem será enviada usando um template personalizado." "telegramUseTemplateDescription": "Se habilitado, a mensagem será enviada usando um template personalizado.",
"telegramServerUrlDescription": "Para suspender as limitações da API de bots do Telegram ou obter acesso em áreas bloqueadas (China, Irã, etc). Para mais informações, clique em {0}. Padrão: {1}",
"wahaSession": "Sessão",
"wayToGetWahaApiUrl": "URL da sua instância WAHA.",
"wayToGetWahaApiKey": "API Key é o valor da variável de ambiente WHATSAPP_API_KEY que você usou para executar o WAHA.",
"wayToGetWahaSession": "A partir desta sessão, o WAHA envia notificações para o Chat ID. Você pode encontrá-lo no WAHA Dashboard.",
"wayToWriteWahaChatId": "O número de telefone com o prefixo internacional, mas sem o sinal de mais no início ({0}), o Contact ID ({1}) ou o Group ID ({2}). As notificações são enviadas para este Chat ID da sessão WAHA.",
"Plain Text": "Texto Simples",
"wahaChatId": "Chat ID (Número de Telefone / Contact ID / Group ID)",
"YZJ Webhook URL": "YZJ Webhook URL",
"YZJ Robot Token": "YZJ Robot token",
"telegramServerUrl": "(Opcional) URL do Servidor",
"Message Template": "Modelo de Mensagem",
"Template Format": "Formato do Modelo",
"Font Twemoji by Twitter licensed under": "Fonte Twemoji do Twitter licenciada sob"
} }

View file

@ -1109,5 +1109,21 @@
"Json Query Expression": "Выражение запроса Json", "Json Query Expression": "Выражение запроса Json",
"templateServiceName": "имя сервиса", "templateServiceName": "имя сервиса",
"templateHostnameOrURL": "hostname или URL", "templateHostnameOrURL": "hostname или URL",
"templateStatus": "статус" "templateStatus": "статус",
"telegramServerUrlDescription": "Чтобы поднять ограничения API API Telegram или получить доступ к заблокированным районам (Китай, Иран и т.д.). Для получения дополнительной информации нажмите {0}. По умолчанию: {1}",
"wayToGetWahaApiKey": "Ключ API - это значение переменной среды WHATSAPP_API_KEY, которое вы использовали для запуска WAHA.",
"wayToGetWahaSession": "Из этой сессии WAHA отправляет уведомления на удостоверение личности чата. Вы можете найти его на приборной панели Waha.",
"wayToWriteWahaChatId": "Номер телефона с международным префиксом, но без знака плюс в начале ({0}), идентификатор контакта ({1}) или идентификатора группы ({2}). Уведомления отправляются на этот идентификатор чата от сеанса Waha.",
"wahaSession": "Сессия",
"wahaChatId": "Идентификатор чата (номер телефона / идентификатор контакта / идентификатор группы)",
"wayToGetWahaApiUrl": "Ваш экземпляр WAHA URL.",
"YZJ Webhook URL": "YZJ Вебхук URL",
"YZJ Robot Token": "YZJ Токен Робота",
"telegramServerUrl": "(Необязательно) URL Сервера",
"telegramUseTemplate": "Используйте пользовательский шаблон сообщения",
"telegramUseTemplateDescription": "Если включено, сообщение будет отправлено с помощью пользовательского шаблона.",
"telegramTemplateFormatDescription": "Telegram позволяет использовать различные языки разметки для сообщений, см. Telegram {0} для конкретных деталей.",
"Plain Text": "Простой текст",
"Message Template": "Шаблон сообщения",
"Template Format": "Формат шаблона"
} }

View file

@ -1,5 +1,5 @@
{ {
"languageName": "English", "languageName": "İngilizce",
"checkEverySecond": "{0} saniyede bir kontrol et", "checkEverySecond": "{0} saniyede bir kontrol et",
"retryCheckEverySecond": "{0} saniyede bir dene", "retryCheckEverySecond": "{0} saniyede bir dene",
"resendEveryXTimes": "Her {0} bir yeniden gönder", "resendEveryXTimes": "Her {0} bir yeniden gönder",
@ -183,7 +183,7 @@
"Entry Page": "Giriş Sayfası", "Entry Page": "Giriş Sayfası",
"statusPageNothing": "Burada hiçbir şey yok, lütfen bir grup veya servis ekleyin.", "statusPageNothing": "Burada hiçbir şey yok, lütfen bir grup veya servis ekleyin.",
"No Services": "Hizmet Yok", "No Services": "Hizmet Yok",
"All Systems Operational": "Tüm Sistemler Operasyonel", "All Systems Operational": "Tüm Sistemler Sorunsuz",
"Partially Degraded Service": "Kısmen Bozulmuş Hizmet", "Partially Degraded Service": "Kısmen Bozulmuş Hizmet",
"Degraded Service": "Bozulmuş Hizmet", "Degraded Service": "Bozulmuş Hizmet",
"Add Group": "Grup Ekle", "Add Group": "Grup Ekle",
@ -224,7 +224,7 @@
"Prefix Custom Message": "Özel Önek Mesajı", "Prefix Custom Message": "Özel Önek Mesajı",
"Hello @everyone is...": "Merhaba {'@'}everyone…", "Hello @everyone is...": "Merhaba {'@'}everyone…",
"teams": "Microsoft Teams", "teams": "Microsoft Teams",
"Webhook URL": "Webhook URL", "Webhook URL": "Webhook URL'si",
"wayToGetTeamsURL": "Bir webhook URL'sinin nasıl oluşturulacağını öğrenebilirsiniz {0}.", "wayToGetTeamsURL": "Bir webhook URL'sinin nasıl oluşturulacağını öğrenebilirsiniz {0}.",
"signal": "Sinyal", "signal": "Sinyal",
"Number": "Numara", "Number": "Numara",
@ -378,8 +378,8 @@
"auto resolve": "otomatik çözümleme", "auto resolve": "otomatik çözümleme",
"gorush": "Gorush", "gorush": "Gorush",
"alerta": "Alerta", "alerta": "Alerta",
"alertaApiEndpoint": "API Endpoint", "alertaApiEndpoint": "API Uç Noktası",
"alertaEnvironment": "Environment", "alertaEnvironment": "Ortam",
"alertaApiKey": "API Anahtarı", "alertaApiKey": "API Anahtarı",
"alertaAlertState": "Uyarı Durumu", "alertaAlertState": "Uyarı Durumu",
"alertaRecoverState": "Kurtarma Durumu", "alertaRecoverState": "Kurtarma Durumu",
@ -403,7 +403,7 @@
"Sms template must contain parameters: ": "Sms şablonu parametreleri içermelidir: ", "Sms template must contain parameters: ": "Sms şablonu parametreleri içermelidir: ",
"Bark Endpoint": "Bark Endpoint", "Bark Endpoint": "Bark Endpoint",
"Bark Group": "Bark Group", "Bark Group": "Bark Group",
"Bark Sound": "Bark Sound", "Bark Sound": "Havlama Sesi",
"WebHookUrl": "WebHookUrl", "WebHookUrl": "WebHookUrl",
"SecretKey": "SecretKey", "SecretKey": "SecretKey",
"For safety, must use secret key": "Güvenlik için gizli anahtar kullanılmalıdır", "For safety, must use secret key": "Güvenlik için gizli anahtar kullanılmalıdır",
@ -593,7 +593,7 @@
"Kook": "Kook", "Kook": "Kook",
"wayToGetKookBotToken": "Uygulama oluşturun ve {0} adresinde bot tokenı alın", "wayToGetKookBotToken": "Uygulama oluşturun ve {0} adresinde bot tokenı alın",
"wayToGetKookGuildID": "Kook ayarında \"Geliştirici Modu\"nu açın ve kimliğini almak için guild'e sağ tıklayın", "wayToGetKookGuildID": "Kook ayarında \"Geliştirici Modu\"nu açın ve kimliğini almak için guild'e sağ tıklayın",
"Guild ID": "Guild ID", "Guild ID": "Sunucu ID'si",
"smseagle": "SMSEagle", "smseagle": "SMSEagle",
"smseagleTo": "Telefon numara(ları)", "smseagleTo": "Telefon numara(ları)",
"smseagleGroup": "Telefon defteri grubu ad(lar)ı", "smseagleGroup": "Telefon defteri grubu ad(lar)ı",
@ -840,11 +840,11 @@
"styleElapsedTime": "Kalp atışı çubuğunun altında geçen süre", "styleElapsedTime": "Kalp atışı çubuğunun altında geçen süre",
"styleElapsedTimeShowWithLine": "Göster (Satır ile birlikte)", "styleElapsedTimeShowWithLine": "Göster (Satır ile birlikte)",
"enableNSCD": "Tüm DNS isteklerini önbelleğe almak için NSCD'yi (Ad Hizmeti Önbellek Programı) etkinleştirin", "enableNSCD": "Tüm DNS isteklerini önbelleğe almak için NSCD'yi (Ad Hizmeti Önbellek Programı) etkinleştirin",
"setupDatabaseEmbeddedMariaDB": "Hiçbir şey ayarlamanıza gerek yok. Bu docker imajı, MariaDB'yi sizin için otomatik olarak yerleştirdi ve yapılandırdı. Çalışma Süresi Kuma bu veritabanına unix soketi aracılığıyla bağlanacaktır.", "setupDatabaseEmbeddedMariaDB": "Hiçbir şey ayarlamanıza gerek yok. Bu docker imajı, MariaDB'yi sizin için otomatik olarak yerleştirdi ve yapılandırdı. Çalışma Süresi Kuma bu veri tabanına unix soketi aracılığıyla bağlanacaktır.",
"setupDatabaseSQLite": "Küçük ölçekli dağıtımlar için önerilen basit bir veritabanı dosyası. v2.0.0'dan önce Uptime Kuma, varsayılan veritabanı olarak SQLite'ı kullanıyordu.", "setupDatabaseSQLite": "Küçük ölçekli dağıtımlar için önerilen basit bir veritabanı dosyası. v2.0.0'dan önce Uptime Kuma, varsayılan veritabanı olarak SQLite'ı kullanıyordu.",
"setupDatabaseChooseDatabase": "Hangi veritabanını kullanmak istersiniz?", "setupDatabaseChooseDatabase": "Hangi veri tabanını kullanmak istersiniz?",
"setupDatabaseMariaDB": "Harici bir MariaDB veritabanına bağlanın. Veritabanı bağlantı bilgilerini ayarlamanız gerekir.", "setupDatabaseMariaDB": "Harici bir MariaDB veri tabanına bağlanın. Veri tabanı bağlantı bilgilerini ayarlamanız gerekir.",
"dbName": "Veritabanı ismi", "dbName": "Veri tabanı ismi",
"Saved.": "Kaydedildi.", "Saved.": "Kaydedildi.",
"toastErrorTimeout": "Hata Bildirimleri için Zaman Aşımı", "toastErrorTimeout": "Hata Bildirimleri için Zaman Aşımı",
"toastSuccessTimeout": "Başarı Bildirimleri için Zaman Aşımı", "toastSuccessTimeout": "Başarı Bildirimleri için Zaman Aşımı",
@ -958,7 +958,7 @@
"whatHappensAtForumPost": "Yeni bir forum gönderisi oluşturun. Bu, mevcut gönderiye mesaj YAYINLAMAZ. Mevcut gönderide yayınlamak için \"{option}\" seçeneğini kullanın", "whatHappensAtForumPost": "Yeni bir forum gönderisi oluşturun. Bu, mevcut gönderiye mesaj YAYINLAMAZ. Mevcut gönderide yayınlamak için \"{option}\" seçeneğini kullanın",
"Command": "Komut", "Command": "Komut",
"mongodbCommandDescription": "Veritabanına karşı bir MongoDB komutu çalıştırın. Mevcut komutlar hakkında bilgi için {dokümantasyona} bakın", "mongodbCommandDescription": "Veritabanına karşı bir MongoDB komutu çalıştırın. Mevcut komutlar hakkında bilgi için {dokümantasyona} bakın",
"Bitrix24 Webhook URL": "Bitrix24 Webhook URL", "Bitrix24 Webhook URL": "Bitrix24 Webhook URL'si",
"wayToGetBitrix24Webhook": "{0} adresindeki adımları izleyerek bir web kancası oluşturabilirsiniz", "wayToGetBitrix24Webhook": "{0} adresindeki adımları izleyerek bir web kancası oluşturabilirsiniz",
"bitrix24SupportUserID": "Bitrix24'e kullanıcı kimliğinizi girin. Kullanıcının profiline giderek bağlantıdan kimliğini öğrenebilirsiniz.", "bitrix24SupportUserID": "Bitrix24'e kullanıcı kimliğinizi girin. Kullanıcının profiline giderek bağlantıdan kimliğini öğrenebilirsiniz.",
"Select message type": "Mesaj türünü seçin", "Select message type": "Mesaj türünü seçin",
@ -1098,5 +1098,24 @@
"RabbitMQ Nodes": "RabbitMQ Yönetim Sunucuları", "RabbitMQ Nodes": "RabbitMQ Yönetim Sunucuları",
"rabbitmqNodesDescription": "Protokol ve port dahil olmak üzere RabbitMQ yönetim düğümleri için URL'yi girin. Örnek: {0}", "rabbitmqNodesDescription": "Protokol ve port dahil olmak üzere RabbitMQ yönetim düğümleri için URL'yi girin. Örnek: {0}",
"rabbitmqHelpText": "Monitörü kullanmak için, RabbitMQ kurulumunuzda Yönetim Eklentisini etkinleştirmeniz gerekecektir. Daha fazla bilgi için lütfen {rabitmq_documentation}'a bakın.", "rabbitmqHelpText": "Monitörü kullanmak için, RabbitMQ kurulumunuzda Yönetim Eklentisini etkinleştirmeniz gerekecektir. Daha fazla bilgi için lütfen {rabitmq_documentation}'a bakın.",
"aboutSlackUsername": "Mesaj göndericinin görünen adını değiştir. Eğer birilerini etiketlemek isterseniz, onu ismini dostça ekleyebilirsiniz." "aboutSlackUsername": "Mesaj göndericinin görünen adını değiştir. Eğer birilerini etiketlemek isterseniz, onu ismini dostça ekleyebilirsiniz.",
"templateHostnameOrURL": "ana bilgisayar adı veya URL",
"templateStatus": "durum",
"telegramUseTemplate": "Özel mesaj şablonu kullan",
"telegramUseTemplateDescription": "Etkinleştirilirse mesaj özel bir şablon kullanılarak gönderilecektir.",
"telegramTemplateFormatDescription": "Telegram, mesajlar için farklı işaretleme dillerinin kullanılmasına izin verir, ayrıntılar için Telegram {0} bölümüne bakın.",
"templateServiceName": "servis adı",
"telegramServerUrlDescription": "Telegram'ın bot API sınırlamalarını kaldırmak veya engellenen alanlarda (Çin, İran vb.) erişim sağlamak için. Daha fazla bilgi için tıklayın {0}. Varsayılan: {1}",
"wahaSession": "Oturum",
"wahaChatId": "Sohbet Kimliği (Telefon Numarası / Kişi Kimliği / Grup Kimliği)",
"wayToGetWahaApiUrl": "WAHA Örnek URL'niz.",
"wayToGetWahaApiKey": "API Anahtarı, WAHA'yı çalıştırmak için kullandığınız WHATSAPP_API_KEY ortam değişkeni değeridir.",
"wayToGetWahaSession": "Bu oturumdan itibaren WAHA, Chat ID'ye bildirimler gönderir. Bunu WAHA Dashboard'da bulabilirsiniz.",
"wayToWriteWahaChatId": "Uluslararası ön eke sahip, ancak başında artı işareti olmayan telefon numarası ({0}), Kişi Kimliği ({1}) veya Grup Kimliği ({2}). Bildirimler WAHA Session'dan bu Sohbet Kimliğine gönderilir.",
"Plain Text": "Düz Metin",
"Message Template": "Mesaj Şablonu",
"Template Format": "Şablon Biçimi",
"YZJ Webhook URL": "YZJ Webhook URL'si",
"YZJ Robot Token": "YZJ Robot tokeni",
"telegramServerUrl": "(İsteğe bağlı) Sunucu URL'si"
} }

View file

@ -1123,5 +1123,6 @@
"wayToGetWahaSession": "З цієї сесії WAHA надсилає сповіщення на ID чату. Ви можете знайти його в інформаційній панелі WAHA.", "wayToGetWahaSession": "З цієї сесії WAHA надсилає сповіщення на ID чату. Ви можете знайти його в інформаційній панелі WAHA.",
"wayToWriteWahaChatId": "Номер телефону з міжнародним префіксом, але без знака плюс на початку ({0}), ID контакту ({1}) або ID групи ({2}). На цей ID чату надсилаються сповіщення з сеансу WAHA.", "wayToWriteWahaChatId": "Номер телефону з міжнародним префіксом, але без знака плюс на початку ({0}), ID контакту ({1}) або ID групи ({2}). На цей ID чату надсилаються сповіщення з сеансу WAHA.",
"telegramServerUrl": "(Необов'язково) URL сервера", "telegramServerUrl": "(Необов'язково) URL сервера",
"telegramServerUrlDescription": "Щоб зняти обмеження з Telegram bot api або отримати доступ у заблокованих регіонах (Китай, Іран тощо). Для отримання додаткової інформації натисніть {0}. За замовчуванням: {1}" "telegramServerUrlDescription": "Щоб зняти обмеження з Telegram bot api або отримати доступ у заблокованих регіонах (Китай, Іран тощо). Для отримання додаткової інформації натисніть {0}. За замовчуванням: {1}",
"Font Twemoji by Twitter licensed under": "Шрифт Twemoji від Twitter ліцензований під"
} }

View file

@ -1117,5 +1117,8 @@
"wayToGetWahaApiKey": "API 密钥是你用于运行 WAHA 的 WHATSAPP_API_KEY 环境变量值。", "wayToGetWahaApiKey": "API 密钥是你用于运行 WAHA 的 WHATSAPP_API_KEY 环境变量值。",
"telegramTemplateFormatDescription": "Telegram 允许在消息中使用不同的标记语言,具体细节请参见 Telegram {0}。", "telegramTemplateFormatDescription": "Telegram 允许在消息中使用不同的标记语言,具体细节请参见 Telegram {0}。",
"YZJ Webhook URL": "YZJ Webhook 地址", "YZJ Webhook URL": "YZJ Webhook 地址",
"YZJ Robot Token": "YZJ 机器人令牌" "YZJ Robot Token": "YZJ 机器人令牌",
"telegramServerUrl": "(可选) 服务器 Url",
"telegramServerUrlDescription": "用以解除 Telegram 的机器人 API 限制或在封锁区域(中国、伊朗等)获得访问权限。获取更多信息,请点击 {0}。默认值:{1}",
"Font Twemoji by Twitter licensed under": "由 Twitter 制作的 Twemoji 字体根据此许可证授权"
} }