diff --git a/server/model/monitor.js b/server/model/monitor.js index 30b688065..e9f7380dc 100644 --- a/server/model/monitor.js +++ b/server/model/monitor.js @@ -1295,7 +1295,8 @@ class Monitor extends BeanModel { try { const heartbeatJSON = bean.toJSON(); const monitorData = [{ id: monitor.id, - active: monitor.active + active: monitor.active, + name: monitor.name }]; const preloadData = await Monitor.preparePreloadData(monitorData); // Prevent if the msg is undefined, notifications such as Discord cannot send out. diff --git a/server/notification-providers/discord.js b/server/notification-providers/discord.js index 6a52f8f3e..9ea260410 100644 --- a/server/notification-providers/discord.js +++ b/server/notification-providers/discord.js @@ -46,10 +46,10 @@ class Discord extends NotificationProvider { name: "Service Name", value: monitorJSON["name"], }, - { + ...(!notification.disableUrl ? [{ name: monitorJSON["type"] === "push" ? "Service Type" : "Service URL", value: this.extractAddress(monitorJSON), - }, + }] : []), { name: `Time (${heartbeatJSON["timezone"]})`, value: heartbeatJSON["localDateTime"], @@ -83,10 +83,10 @@ class Discord extends NotificationProvider { name: "Service Name", value: monitorJSON["name"], }, - { + ...(!notification.disableUrl ? [{ name: monitorJSON["type"] === "push" ? "Service Type" : "Service URL", value: this.extractAddress(monitorJSON), - }, + }] : []), { name: `Time (${heartbeatJSON["timezone"]})`, value: heartbeatJSON["localDateTime"], diff --git a/server/notification-providers/mattermost.js b/server/notification-providers/mattermost.js index 32d890981..9946d02b2 100644 --- a/server/notification-providers/mattermost.js +++ b/server/notification-providers/mattermost.js @@ -79,13 +79,11 @@ class Mattermost extends NotificationProvider { fallback: "Your " + monitorJSON.pathName + - monitorJSON.name + " service went " + statusText, color: color, title: monitorJSON.pathName + - monitorJSON.name + " service went " + statusText, title_link: monitorJSON.url, diff --git a/server/notification-providers/onechat.js b/server/notification-providers/onechat.js new file mode 100644 index 000000000..2d6ea1d5b --- /dev/null +++ b/server/notification-providers/onechat.js @@ -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; diff --git a/server/notification-providers/pumble.js b/server/notification-providers/pumble.js new file mode 100644 index 000000000..e1731c0ab --- /dev/null +++ b/server/notification-providers/pumble.js @@ -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; diff --git a/server/notification-providers/pushover.js b/server/notification-providers/pushover.js index 8422b64c2..fdceeaa44 100644 --- a/server/notification-providers/pushover.js +++ b/server/notification-providers/pushover.js @@ -1,5 +1,6 @@ const { getMonitorRelativeURL } = require("../../src/util"); const { setting } = require("../util-server"); +const { UP } = require("../../src/util"); const NotificationProvider = require("./notification-provider"); const axios = require("axios"); @@ -43,15 +44,20 @@ class Pushover extends NotificationProvider { if (heartbeatJSON == null) { await axios.post(url, data); return okMsg; - } else { - data.message += `\nTime (${heartbeatJSON["timezone"]}):${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 += `\nTime (${heartbeatJSON["timezone"]}): ${heartbeatJSON["localDateTime"]}`; + await axios.post(url, data); + return okMsg; + } catch (error) { this.throwGeneralAxiosError(error); } - } } diff --git a/server/notification-providers/slack.js b/server/notification-providers/slack.js index 5e25a1fbc..455d787c7 100644 --- a/server/notification-providers/slack.js +++ b/server/notification-providers/slack.js @@ -145,6 +145,7 @@ class Slack extends NotificationProvider { const title = "Uptime Kuma Alert"; let data = { + "text": msg, "channel": notification.slackchannel, "username": notification.slackusername, "icon_emoji": notification.slackiconemo, diff --git a/server/notification-providers/sms-planet.js b/server/notification-providers/sms-planet.js new file mode 100644 index 000000000..97e9e715e --- /dev/null +++ b/server/notification-providers/sms-planet.js @@ -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; diff --git a/server/notification-providers/smseagle.js b/server/notification-providers/smseagle.js index 4e897006c..a123243a4 100644 --- a/server/notification-providers/smseagle.js +++ b/server/notification-providers/smseagle.js @@ -11,59 +11,127 @@ class SMSEagle extends NotificationProvider { const okMsg = "Sent Successfully."; try { - let config = { - headers: { - "Content-Type": "application/json", + if (notification.smseagleApiType === "smseagle-apiv1") { // according to https://www.smseagle.eu/apiv1/ + let config = { + 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; - let sendMethod; - let recipientType; + const url = new URL(notification.smseagleUrl + "/http_api" + sendMethod); - let encoding = (notification.smseagleEncoding) ? "1" : "0"; - let priority = (notification.smseaglePriority) ? notification.smseaglePriority : "0"; - - if (notification.smseagleRecipientType === "smseagle-contact") { - recipientType = "contactname"; - 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)}`; + url.searchParams.append("access_token", notification.smseagleToken); + url.searchParams.append(recipientType, notification.smseagleRecipient); + if (!notification.smseagleRecipientType || notification.smseagleRecipientType === "smseagle-sms") { + url.searchParams.append("unicode", (notification.smseagleEncoding) ? "1" : "0"); + url.searchParams.append("highpriority", notification.smseaglePriority ?? "0"); } 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) { this.throwGeneralAxiosError(error); } diff --git a/server/notification-providers/smtp.js b/server/notification-providers/smtp.js index 980c7dfd3..d0ad5b728 100644 --- a/server/notification-providers/smtp.js +++ b/server/notification-providers/smtp.js @@ -42,6 +42,7 @@ class SMTP extends NotificationProvider { // default values in case the user does not want to template let subject = msg; let body = msg; + let useHTMLBody = false; if (heartbeatJSON) { 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 const customSubject = notification.customSubject?.trim() || ""; const customBody = notification.customBody?.trim() || ""; - if (customSubject !== "") { subject = await this.renderTemplate(customSubject, msg, monitorJSON, heartbeatJSON); } if (customBody !== "") { + useHTMLBody = notification.htmlBody || false; body = await this.renderTemplate(customBody, msg, monitorJSON, heartbeatJSON); } } @@ -67,7 +68,8 @@ class SMTP extends NotificationProvider { bcc: notification.smtpBCC, to: notification.smtpTo, 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; diff --git a/server/notification-providers/spugpush.js b/server/notification-providers/spugpush.js new file mode 100644 index 000000000..b04a20cac --- /dev/null +++ b/server/notification-providers/spugpush.js @@ -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; diff --git a/server/notification.js b/server/notification.js index 0c222d932..468d026c0 100644 --- a/server/notification.js +++ b/server/notification.js @@ -30,9 +30,11 @@ const Mattermost = require("./notification-providers/mattermost"); const Nostr = require("./notification-providers/nostr"); const Ntfy = require("./notification-providers/ntfy"); const Octopush = require("./notification-providers/octopush"); +const OneChat = require("./notification-providers/onechat"); const OneBot = require("./notification-providers/onebot"); const Opsgenie = require("./notification-providers/opsgenie"); const PagerDuty = require("./notification-providers/pagerduty"); +const Pumble = require("./notification-providers/pumble"); const FlashDuty = require("./notification-providers/flashduty"); const PagerTree = require("./notification-providers/pagertree"); const PromoSMS = require("./notification-providers/promosms"); @@ -72,6 +74,8 @@ const Onesender = require("./notification-providers/onesender"); const Wpush = require("./notification-providers/wpush"); const SendGrid = require("./notification-providers/send-grid"); const YZJ = require("./notification-providers/yzj"); +const SMSPlanet = require("./notification-providers/sms-planet"); +const SpugPush = require("./notification-providers/spugpush"); class Notification { @@ -119,6 +123,7 @@ class Notification { new Nostr(), new Ntfy(), new Octopush(), + new OneChat(), new OneBot(), new Onesender(), new Opsgenie(), @@ -126,6 +131,7 @@ class Notification { new FlashDuty(), new PagerTree(), new PromoSMS(), + new Pumble(), new Pushbullet(), new PushDeer(), new Pushover(), @@ -160,7 +166,9 @@ class Notification { new Cellsynt(), new Wpush(), new SendGrid(), - new YZJ() + new YZJ(), + new SMSPlanet(), + new SpugPush(), ]; for (let item of list) { if (! item.name) { diff --git a/src/components/NotificationDialog.vue b/src/components/NotificationDialog.vue index 56cae66c8..2e66de8e9 100644 --- a/src/components/NotificationDialog.vue +++ b/src/components/NotificationDialog.vue @@ -135,11 +135,13 @@ export default { "nostr": "Nostr", "ntfy": "Ntfy", "octopush": "Octopush", + "OneChat": "OneChat", "OneBot": "OneBot", "Onesender": "Onesender", "Opsgenie": "Opsgenie", "PagerDuty": "PagerDuty", "PagerTree": "PagerTree", + "pumble": "Pumble", "pushbullet": "Pushbullet", "PushByTechulus": "Push by Techulus", "pushover": "Pushover", @@ -183,9 +185,11 @@ export default { "WeCom": "WeCom (企业微信群机器人)", "ServerChan": "ServerChan (Server酱)", "PushPlus": "PushPlus (推送加)", + "SpugPush": "SpugPush(Spug推送助手)", "smsc": "SMSC", "WPush": "WPush(wpush.cn)", - "YZJ": "YZJ (云之家自定义机器人)" + "YZJ": "YZJ (云之家自定义机器人)", + "SMSPlanet": "SMSPlanet.pl" }; // Sort by notification name diff --git a/src/components/notifications/Discord.vue b/src/components/notifications/Discord.vue index 5d8334f5f..40d2f204e 100644 --- a/src/components/notifications/Discord.vue +++ b/src/components/notifications/Discord.vue @@ -53,6 +53,13 @@ + +
+
+ + +
+
diff --git a/src/components/notifications/OneChat.vue b/src/components/notifications/OneChat.vue new file mode 100644 index 000000000..b954d338b --- /dev/null +++ b/src/components/notifications/OneChat.vue @@ -0,0 +1,64 @@ + + + diff --git a/src/components/notifications/Pumble.vue b/src/components/notifications/Pumble.vue new file mode 100644 index 000000000..c577e0404 --- /dev/null +++ b/src/components/notifications/Pumble.vue @@ -0,0 +1,9 @@ + diff --git a/src/components/notifications/Pushover.vue b/src/components/notifications/Pushover.vue index 7ee0eafb6..e2fecd29f 100644 --- a/src/components/notifications/Pushover.vue +++ b/src/components/notifications/Pushover.vue @@ -16,34 +16,24 @@ - - + + + + + +
*{{ $t("Required") }} @@ -66,5 +56,34 @@ export default { components: { 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", + ], + }; + }, }; diff --git a/src/components/notifications/SMSEagle.vue b/src/components/notifications/SMSEagle.vue index ec781313a..16277a6ef 100644 --- a/src/components/notifications/SMSEagle.vue +++ b/src/components/notifications/SMSEagle.vue @@ -1,31 +1,123 @@ @@ -36,5 +128,16 @@ export default { components: { 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"; + } + } }; diff --git a/src/components/notifications/SMSPlanet.vue b/src/components/notifications/SMSPlanet.vue new file mode 100644 index 000000000..bbf070461 --- /dev/null +++ b/src/components/notifications/SMSPlanet.vue @@ -0,0 +1,46 @@ + + + diff --git a/src/components/notifications/SMTP.vue b/src/components/notifications/SMTP.vue index 4e0fb4b57..8f0e1501d 100644 --- a/src/components/notifications/SMTP.vue +++ b/src/components/notifications/SMTP.vue @@ -79,6 +79,15 @@
{{ $t("leave blank for default body") }}
+
+
+ + +
+
+ {{ $t("documentation") }} diff --git a/src/components/notifications/SpugPush.vue b/src/components/notifications/SpugPush.vue new file mode 100644 index 000000000..37dffccf3 --- /dev/null +++ b/src/components/notifications/SpugPush.vue @@ -0,0 +1,19 @@ + + + diff --git a/src/components/notifications/index.js b/src/components/notifications/index.js index cbd6f2b68..be7feb820 100644 --- a/src/components/notifications/index.js +++ b/src/components/notifications/index.js @@ -29,6 +29,7 @@ import Mattermost from "./Mattermost.vue"; import Nostr from "./Nostr.vue"; import Ntfy from "./Ntfy.vue"; import Octopush from "./Octopush.vue"; +import OneChat from "./OneChat.vue"; import OneBot from "./OneBot.vue"; import Onesender from "./Onesender.vue"; import Opsgenie from "./Opsgenie.vue"; @@ -36,6 +37,7 @@ import PagerDuty from "./PagerDuty.vue"; import FlashDuty from "./FlashDuty.vue"; import PagerTree from "./PagerTree.vue"; import PromoSMS from "./PromoSMS.vue"; +import Pumble from "./Pumble.vue"; import Pushbullet from "./Pushbullet.vue"; import PushDeer from "./PushDeer.vue"; import Pushover from "./Pushover.vue"; @@ -62,6 +64,7 @@ import WeCom from "./WeCom.vue"; import GoAlert from "./GoAlert.vue"; import ZohoCliq from "./ZohoCliq.vue"; import Splunk from "./Splunk.vue"; +import SpugPush from "./SpugPush.vue"; import SevenIO from "./SevenIO.vue"; import Whapi from "./Whapi.vue"; import WAHA from "./WAHA.vue"; @@ -70,6 +73,7 @@ import WPush from "./WPush.vue"; import SIGNL4 from "./SIGNL4.vue"; import SendGrid from "./SendGrid.vue"; import YZJ from "./YZJ.vue"; +import SMSPlanet from "./SMSPlanet.vue"; /** * Manage all notification form. @@ -106,6 +110,7 @@ const NotificationFormList = { "nostr": Nostr, "ntfy": Ntfy, "octopush": Octopush, + "OneChat": OneChat, "OneBot": OneBot, "Onesender": Onesender, "Opsgenie": Opsgenie, @@ -113,6 +118,7 @@ const NotificationFormList = { "FlashDuty": FlashDuty, "PagerTree": PagerTree, "promosms": PromoSMS, + "pumble": Pumble, "pushbullet": Pushbullet, "PushByTechulus": TechulusPush, "PushDeer": PushDeer, @@ -135,6 +141,7 @@ const NotificationFormList = { "threema": Threema, "twilio": Twilio, "Splunk": Splunk, + "SpugPush": SpugPush, "webhook": Webhook, "WeCom": WeCom, "GoAlert": GoAlert, @@ -148,6 +155,7 @@ const NotificationFormList = { "WPush": WPush, "SendGrid": SendGrid, "YZJ": YZJ, + "SMSPlanet": SMSPlanet, }; export default NotificationFormList; diff --git a/src/lang/bg-BG.json b/src/lang/bg-BG.json index 1154af1b0..63af43da0 100644 --- a/src/lang/bg-BG.json +++ b/src/lang/bg-BG.json @@ -1117,5 +1117,6 @@ "wayToWriteWahaChatId": "Телефонният номер с международния префикс, но без знака плюс в началото ({0}), ID на контакта ({1}) или ID на групата ({2}). Известията се изпращат до това чат ID от WAHA сесия.", "wayToGetWahaSession": "От тази сесия WAHA изпраща известия до чат ID. Можете да го намерите в таблото за управление на WAHA.", "telegramServerUrlDescription": "За премахване на API бот ограниченията за Telegram или за получаване на достъп в блокирани зони (Китай, Иран и др.). За повече информация щракнете върху {0}. По подразбиране: {1}", - "telegramServerUrl": "(По избор) URL адрес на сървъра" + "telegramServerUrl": "(По избор) URL адрес на сървъра", + "Font Twemoji by Twitter licensed under": "Шрифт Twemoji от Twitter, лицензиран под" } diff --git a/src/lang/ca.json b/src/lang/ca.json index 2f10f32cb..39d6bc77c 100644 --- a/src/lang/ca.json +++ b/src/lang/ca.json @@ -457,7 +457,7 @@ "installing": "Instal·lant", "uninstall": "Desinstal·la", "confirmUninstallPlugin": "Estàs segur de desinstal·lar aquest connector?", - "notificationRegional": "Regional", + "notificationRegional": "Local", "Clone Monitor": "Clona el monitor", "Clone": "Clona", "cloneOf": "Clon de {0}", @@ -478,7 +478,7 @@ "To Email": "Destí email", "smtpCC": "CC", "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", "Bot Display Name": "Nom de pantalla de bot", "Prefix Custom Message": "Prefix de missatge personalitzat", @@ -560,5 +560,14 @@ "templateStatus": "Estat", "telegramUseTemplate": "Fes servir una plantilla de missatge 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." } diff --git a/src/lang/de-CH.json b/src/lang/de-CH.json index 85a921ee9..f45d41e89 100644 --- a/src/lang/de-CH.json +++ b/src/lang/de-CH.json @@ -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.", "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", - "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" } diff --git a/src/lang/de-DE.json b/src/lang/de-DE.json index 5aff2e344..dc07a6262 100644 --- a/src/lang/de-DE.json +++ b/src/lang/de-DE.json @@ -1117,5 +1117,6 @@ "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.", "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" } diff --git a/src/lang/en.json b/src/lang/en.json index 7ebe8f39b..4ba1a1fc6 100644 --- a/src/lang/en.json +++ b/src/lang/en.json @@ -64,6 +64,7 @@ "Expected Value": "Expected Value", "Json Query Expression": "Json Query Expression", "Friendly Name": "Friendly Name", + "defaultFriendlyName": "New Monitor", "URL": "URL", "Hostname": "Hostname", "Host URL": "Host URL", @@ -517,6 +518,7 @@ "Clone": "Clone", "cloneOf": "Clone of {0}", "smtp": "Email (SMTP)", + "Use HTML for custom E-mail body": "Use HTML for custom E-mail body", "secureOptionNone": "None / STARTTLS (25, 587)", "secureOptionTLS": "TLS (465)", "Ignore TLS Error": "Ignore TLS Error", @@ -757,12 +759,26 @@ "smseagleTo": "Phone number(s)", "smseagleGroup": "Phonebook group name(s)", "smseagleContact": "Phonebook contact name(s)", + "smseagleGroupV2": "Phonebook group ID(s)", + "smseagleContactV2": "Phonebook contact ID(s)", "smseagleRecipientType": "Recipient type", "smseagleRecipient": "Recipient(s) (multiple must be separated with comma)", "smseagleToken": "API Access token", "smseagleUrl": "Your SMSEagle device URL", - "smseagleEncoding": "Send as Unicode", - "smseaglePriority": "Message priority (0-9, default = 0)", + "smseagleEncoding": "Send as Unicode (default=GSM-7)", + "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}", "smspartnerPhoneNumber": "Phone number(s)", "smspartnerPhoneNumberHelptext": "The number must be in the international format {0}, {1}. Multiple numbers must be separated by {2}", @@ -784,6 +800,7 @@ "PushDeer Server": "PushDeer Server", "pushDeerServerDescription": "Leave blank to use the official server", "PushDeer Key": "PushDeer Key", + "SpugPush Template Code": "Template Code", "wayToGetClickSendSMSToken": "You can get API Username and API Key from {0} .", "Custom Monitor Type": "Custom Monitor Type", "Google Analytics ID": "Google Analytics ID", @@ -1059,6 +1076,9 @@ "Separate multiple email addresses with commas": "Separate multiple email addresses with commas", "Public URL": "Public URL", "publicUrlDescription": "The public URL of the monitor. Can be displayed on the status page as the monitor link.", + "OneChatAccessToken": "OneChat Access Token", + "OneChatUserIdOrGroupId": "OneChat User ID or Group ID", + "OneChatBotId": "OneChat Bot ID", "wahaSession": "Session", "wahaChatId": "Chat ID (Phone Number / Contact ID / Group ID)", "wayToGetWahaApiUrl": "Your WAHA Instance URL.", @@ -1070,5 +1090,12 @@ "Plain Text": "Plain Text", "Message Template": "Message Template", "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" } diff --git a/src/lang/fi.json b/src/lang/fi.json index 8a77a20e0..bf203a749 100644 --- a/src/lang/fi.json +++ b/src/lang/fi.json @@ -341,7 +341,7 @@ "Packet Size": "Paketin koko", "telegram": "Telegram", "ZohoCliq": "ZohoCliq", - "Bot Token": "Botin token", + "Bot Token": "Botin tokeni", "wayToGetTelegramToken": "Voit saada tunnuksen osoitteesta {0}.", "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:", @@ -1096,5 +1096,25 @@ "RabbitMQ Nodes": "RabbitMQ-hallintasolmut", "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}.", - "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." } diff --git a/src/lang/fr-FR.json b/src/lang/fr-FR.json index 0a6f66cd7..2d09b0bac 100644 --- a/src/lang/fr-FR.json +++ b/src/lang/fr-FR.json @@ -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.", "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 l’API des bots Telegram ou accéder aux zones bloquées (Chine, Iran, etc.). Pour plus d’informations, 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" } diff --git a/src/lang/hu.json b/src/lang/hu.json index 2b0b8a625..2eb829c68 100644 --- a/src/lang/hu.json +++ b/src/lang/hu.json @@ -1080,5 +1080,24 @@ "Fail": "Hiba", "Pop": "Megjelen", "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}." } diff --git a/src/lang/it-IT.json b/src/lang/it-IT.json index 12278ff29..3104e5fcb 100644 --- a/src/lang/it-IT.json +++ b/src/lang/it-IT.json @@ -59,7 +59,7 @@ "day": "giorno | giorni", "-day": "-giorni", "hour": "ora", - "-hour": "-ore", + "-hour": "-ora", "Response": "Risposta", "Ping": "Ping", "Monitor Type": "Modalità di monitoraggio", @@ -80,7 +80,7 @@ "pushOptionalParams": "Parametri aggiuntivi: {0}", "Save": "Salva", "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", "Light": "Chiaro", "Dark": "Scuro", @@ -738,5 +738,9 @@ "invertKeywordDescription": "Cerca la parola chiave essere assente anziché presente.", "octopushAPIKey": "\"API Key\" dalle credenziali API HTTP nel pannello di controllo", "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" } diff --git a/src/lang/ja.json b/src/lang/ja.json index 0f040cced..cb46b1500 100644 --- a/src/lang/ja.json +++ b/src/lang/ja.json @@ -1065,5 +1065,25 @@ "Key Added": "追加キー", "Bark Sound": "Bark通知音", "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ライセンス下でライセンスされています" } diff --git a/src/lang/ko-KR.json b/src/lang/ko-KR.json index c8601efbe..be43aad89 100644 --- a/src/lang/ko-KR.json +++ b/src/lang/ko-KR.json @@ -76,7 +76,7 @@ "Accepted Status Codes": "응답 성공 상태 코드", "Save": "저장", "Notifications": "알림", - "Not available, please setup.": "존재하지 않아요, 새로운 거 하나 만드는 건 어때요?", + "Not available, please setup.": "존재하지 않아요. 새로운 거 하나 만드는 건 어때요?", "Setup Notification": "알림 설정", "Light": "화이트", "Dark": "다크", @@ -797,5 +797,42 @@ "successKeywordExplanation": "성공으로 간주되는 MQTT 키워드", "Reset Token": "토큰 초기화", "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" } diff --git a/src/lang/lv.json b/src/lang/lv.json new file mode 100644 index 000000000..c069c7303 --- /dev/null +++ b/src/lang/lv.json @@ -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." +} diff --git a/src/lang/ms.json b/src/lang/ms.json index 14ddd7d3a..ec7520832 100644 --- a/src/lang/ms.json +++ b/src/lang/ms.json @@ -7,24 +7,24 @@ "Game": "Permainan", "Primary Base URL": "URL Pangkalan Utama", "Version": "Versi", - "Add": "Menambah", - "Quick Stats": "Statistik ringkas", - "Up": "Dalam talian", - "Down": "Luar talian", - "Pending": "Belum selesai", - "statusMaintenance": "Membaiki", - "Maintenance": "Membaiki", - "Unknown": "Tidak ketahui", - "General Monitor Type": "Jenis monitor umum", - "Check Update On GitHub": "Semak kemas kini dalam GitHub", + "Add": "Tambah", + "Quick Stats": "Statistik Pantas", + "Up": "Atas", + "Down": "Bawah", + "Pending": "Dalam Proses", + "statusMaintenance": "Penyelenggaraan", + "Maintenance": "Penyelenggaraan", + "Unknown": "Tidak Diketahui", + "General Monitor Type": "Jenis Monitor Umum", + "Check Update On GitHub": "Semak kemas kini di GitHub", "List": "Senarai", - "Specific Monitor Type": "Jenis monitor spesifik", + "Specific Monitor Type": "Jenis Monitor Spesifik", "markdownSupported": "Sintaks markdown disokong", "languageName": "Bahasa inggeris", "Dashboard": "Papan pemuka", "Language": "Bahasa", - "Add New Monitor": "Tambah monitor baharu", - "Passive Monitor Type": "Jenis monitor pasif", + "Add New Monitor": "Tambah Monitor Baharu", + "Passive Monitor Type": "Jenis Monitor Pasif", "No Services": "Tiada Servis", "Add a monitor": "Tambah Monitor", "High": "Tinggi", @@ -49,5 +49,41 @@ "Content Type": "Jenis Content", "Home": "Laman Utama", "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" } diff --git a/src/lang/nl-NL.json b/src/lang/nl-NL.json index 4ddb77624..806c921ad 100644 --- a/src/lang/nl-NL.json +++ b/src/lang/nl-NL.json @@ -127,7 +127,7 @@ "Create": "Aanmaken", "Clear Data": "Data wissen", "Events": "Gebeurtenissen", - "Heartbeats": "Heartbeats", + "Heartbeats": "Hartslagen", "Auto Get": "Auto Get", "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.", @@ -464,24 +464,24 @@ "Show Powered By": "Laat \"Mogeljik gemaakt door\" zien", "Domain Names": "Domein Namen", "pushoversounds pushover": "Pushover (standaard)", - "pushoversounds bike": "Bike", - "pushoversounds bugle": "Bugle", - "pushoversounds cashregister": "Cash Register", + "pushoversounds bike": "Fiets", + "pushoversounds bugle": "Trompet", + "pushoversounds cashregister": "Kassa", "pushoversounds classical": "Classical", - "pushoversounds cosmic": "Cosmic", - "pushoversounds falling": "Falling", + "pushoversounds cosmic": "Buitenaards", + "pushoversounds falling": "Vallend", "pushoversounds gamelan": "Gamelan", - "pushoversounds incoming": "Incoming", - "pushoversounds intermission": "Intermission", - "pushoversounds magic": "Magic", - "pushoversounds mechanical": "Mechanical", + "pushoversounds incoming": "Inkomend", + "pushoversounds intermission": "Pauze", + "pushoversounds magic": "Magie", + "pushoversounds mechanical": "Mechanisch", "pushoversounds pianobar": "Piano Bar", - "pushoversounds siren": "Siren", - "pushoversounds spacealarm": "Space Alarm", + "pushoversounds siren": "Sirene", + "pushoversounds spacealarm": "Ruimte Alarm", "pushoversounds tugboat": "Tug Boat", "pushoversounds alien": "Alien Alarm (long)", "pushoversounds climb": "Climb (long)", - "pushoversounds persistent": "Persistent (long)", + "pushoversounds persistent": "Aanhoudend (lang)", "pushoversounds echo": "Pushover Echo (long)", "pushoversounds updown": "Up Down (long)", "pushoversounds vibrate": "Alleen trillen", @@ -649,8 +649,8 @@ "smseagleTo": "Telefoonnummer(s)", "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.", - "RadiusCalledStationId": "Called Station Id", - "RadiusCalledStationIdDescription": "Identifier of the called device", + "RadiusCalledStationId": "Genoemde stations ID", + "RadiusCalledStationIdDescription": "Identificatie van het genoemde apparaat", "RadiusCallingStationId": "Calling Station Id", "ZohoCliq": "ZohoCliq", "Long-Lived Access Token": "Long-Lived Access Token", @@ -789,7 +789,7 @@ "Badge Warn Days": "Badge Waarschuwing dagen", "Badge Down Days": "Badge Offline dagen", "Badge Style": "Badge stijl", - "chromeExecutable": "Chrome/Chromium Executable", + "chromeExecutable": "Chrome/Chromium Uitvoerbaar bestand", "chromeExecutableAutoDetect": "Automatisch detecteren", "Edit Maintenance": "Onderhoud bewerken", "Badge Label": "Badge Label", @@ -1039,36 +1039,36 @@ "ends with": "eindigt met", "not ends with": "eindigt niet met", "less than": "minder dan", - "greater than": "meer dan", + "greater than": "groter dan", "record": "dossier", "jsonQueryDescription": "Parseer en haal specifieke gegevens uit de JSON-respons van de server met behulp van JSON-query of gebruik \"$\" voor de onbewerkte respons, als u geen JSON verwacht. Het resultaat wordt vervolgens vergeleken met de verwachte waarde, als strings. Zie {0} voor documentatie en gebruik {1} om te experimenteren met query's.", - "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.", - "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 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}.", "SendGrid API Key": "SendGrid API sleutel", "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.", - "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.", - "cacheBusterParam": "Voeg de parameter {0} toe", - "Form Data Body": "Formulier Gegevens Content", - "Optional: Space separated list of scopes": "Optioneel: Reikwijdte door spaties gescheiden lijst", - "Alphanumerical string and hyphens only": "Alleen alfanumerieke tekenreeksen en koppeltekens", + "aboutSlackUsername": "Verandert de weergavenaam van de afzender. Als je iemand wil vermelden, voeg dit dan aan de vriendelijke naam toe.", + "cacheBusterParam": "Voeg de {0} parameter", + "Form Data Body": "Formulier Gegevens Body", + "Optional: Space separated list of scopes": "Optioneel: door spaties gescheiden lijst met scopes", + "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.", - "Message format": "Berichtformaat", - "Send rich messages": "Stuur rijke berichten", - "OAuth Scope": "OAuth Reikwijdte", - "equals": "gelijk aan", + "Message format": "Bericht opmaak", + "Send rich messages": "Verstuur berichten met opmaak", + "OAuth Scope": "OAuth bereik", + "equals": "hetzelfde als", "not equals": "niet gelijk aan", - "less than or equal to": "kleiner dan of gelijk aan", - "greater than or equal to": "groter dan of gelijk aan", - "Notification Channel": "Meldingskanaal", + "less than or equal to": "minder dan of gelijk aan", + "greater than or equal to": "meer dan of gelijk aan", + "Notification Channel": "Notificatie kanaal", "Sound": "Geluid", "Arcade": "Speelhal", - "Correct": "Juist", + "Correct": "Goed", "Fail": "Mislukt", "Harp": "Harp", "Reveal": "Laat zien", @@ -1082,12 +1082,31 @@ "Time Sensitive (iOS Only)": "Tijdsgevoelig (alleen voor iOs)", "From": "Van", "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.", "Clear": "Helder", "Elevator": "Lift", "Pop": "Pop", - "Community String": "Gemeenschap Tekst", - "Json Query Expression": "Json Query Expressie", - "ignoredTLSError": "TLS/SSL-fouten zijn genegeerd" + "Community String": "Gemeenschapsreeks", + "Json Query Expression": "JSON Query Expressie", + "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." } diff --git a/src/lang/pl.json b/src/lang/pl.json index 9832fb7c1..fd96faef6 100644 --- a/src/lang/pl.json +++ b/src/lang/pl.json @@ -1098,5 +1098,24 @@ "RabbitMQ Username": "Nazwa użytkownika RabbitMQ", "RabbitMQ Password": "Hasło RabbitMQ", "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." } diff --git a/src/lang/pt-BR.json b/src/lang/pt-BR.json index e6953ebfa..0764d1173 100644 --- a/src/lang/pt-BR.json +++ b/src/lang/pt-BR.json @@ -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.", "templateHostnameOrURL": "hostname ou URL", "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" } diff --git a/src/lang/ru-RU.json b/src/lang/ru-RU.json index a8935fe27..e055af110 100644 --- a/src/lang/ru-RU.json +++ b/src/lang/ru-RU.json @@ -1109,5 +1109,21 @@ "Json Query Expression": "Выражение запроса Json", "templateServiceName": "имя сервиса", "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": "Формат шаблона" } diff --git a/src/lang/tr-TR.json b/src/lang/tr-TR.json index 608ba8618..3c932d636 100644 --- a/src/lang/tr-TR.json +++ b/src/lang/tr-TR.json @@ -1,5 +1,5 @@ { - "languageName": "English", + "languageName": "İngilizce", "checkEverySecond": "{0} saniyede bir kontrol et", "retryCheckEverySecond": "{0} saniyede bir dene", "resendEveryXTimes": "Her {0} bir yeniden gönder", @@ -183,7 +183,7 @@ "Entry Page": "Giriş Sayfası", "statusPageNothing": "Burada hiçbir şey yok, lütfen bir grup veya servis ekleyin.", "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", "Degraded Service": "Bozulmuş Hizmet", "Add Group": "Grup Ekle", @@ -224,7 +224,7 @@ "Prefix Custom Message": "Özel Önek Mesajı", "Hello @everyone is...": "Merhaba {'@'}everyone…", "teams": "Microsoft Teams", - "Webhook URL": "Webhook URL", + "Webhook URL": "Webhook URL'si", "wayToGetTeamsURL": "Bir webhook URL'sinin nasıl oluşturulacağını öğrenebilirsiniz {0}.", "signal": "Sinyal", "Number": "Numara", @@ -378,8 +378,8 @@ "auto resolve": "otomatik çözümleme", "gorush": "Gorush", "alerta": "Alerta", - "alertaApiEndpoint": "API Endpoint", - "alertaEnvironment": "Environment", + "alertaApiEndpoint": "API Uç Noktası", + "alertaEnvironment": "Ortam", "alertaApiKey": "API Anahtarı", "alertaAlertState": "Uyarı Durumu", "alertaRecoverState": "Kurtarma Durumu", @@ -403,7 +403,7 @@ "Sms template must contain parameters: ": "Sms şablonu parametreleri içermelidir: ", "Bark Endpoint": "Bark Endpoint", "Bark Group": "Bark Group", - "Bark Sound": "Bark Sound", + "Bark Sound": "Havlama Sesi", "WebHookUrl": "WebHookUrl", "SecretKey": "SecretKey", "For safety, must use secret key": "Güvenlik için gizli anahtar kullanılmalıdır", @@ -593,7 +593,7 @@ "Kook": "Kook", "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", - "Guild ID": "Guild ID", + "Guild ID": "Sunucu ID'si", "smseagle": "SMSEagle", "smseagleTo": "Telefon numara(ları)", "smseagleGroup": "Telefon defteri grubu ad(lar)ı", @@ -840,11 +840,11 @@ "styleElapsedTime": "Kalp atışı çubuğunun altında geçen süre", "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", - "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.", - "setupDatabaseChooseDatabase": "Hangi veritabanını kullanmak istersiniz?", - "setupDatabaseMariaDB": "Harici bir MariaDB veritabanına bağlanın. Veritabanı bağlantı bilgilerini ayarlamanız gerekir.", - "dbName": "Veritabanı ismi", + "setupDatabaseChooseDatabase": "Hangi veri tabanını kullanmak istersiniz?", + "setupDatabaseMariaDB": "Harici bir MariaDB veri tabanına bağlanın. Veri tabanı bağlantı bilgilerini ayarlamanız gerekir.", + "dbName": "Veri tabanı ismi", "Saved.": "Kaydedildi.", "toastErrorTimeout": "Hata 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", "Command": "Komut", "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", "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", @@ -1098,5 +1098,24 @@ "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}", "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" } diff --git a/src/lang/uk-UA.json b/src/lang/uk-UA.json index fd1703085..63070db9f 100644 --- a/src/lang/uk-UA.json +++ b/src/lang/uk-UA.json @@ -1123,5 +1123,6 @@ "wayToGetWahaSession": "З цієї сесії WAHA надсилає сповіщення на ID чату. Ви можете знайти його в інформаційній панелі WAHA.", "wayToWriteWahaChatId": "Номер телефону з міжнародним префіксом, але без знака плюс на початку ({0}), ID контакту ({1}) або ID групи ({2}). На цей ID чату надсилаються сповіщення з сеансу WAHA.", "telegramServerUrl": "(Необов'язково) URL сервера", - "telegramServerUrlDescription": "Щоб зняти обмеження з Telegram bot api або отримати доступ у заблокованих регіонах (Китай, Іран тощо). Для отримання додаткової інформації натисніть {0}. За замовчуванням: {1}" + "telegramServerUrlDescription": "Щоб зняти обмеження з Telegram bot api або отримати доступ у заблокованих регіонах (Китай, Іран тощо). Для отримання додаткової інформації натисніть {0}. За замовчуванням: {1}", + "Font Twemoji by Twitter licensed under": "Шрифт Twemoji від Twitter ліцензований під" } diff --git a/src/lang/zh-CN.json b/src/lang/zh-CN.json index 5b473b071..88134e3d8 100644 --- a/src/lang/zh-CN.json +++ b/src/lang/zh-CN.json @@ -1117,5 +1117,8 @@ "wayToGetWahaApiKey": "API 密钥是你用于运行 WAHA 的 WHATSAPP_API_KEY 环境变量值。", "telegramTemplateFormatDescription": "Telegram 允许在消息中使用不同的标记语言,具体细节请参见 Telegram {0}。", "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 字体根据此许可证授权" } diff --git a/src/pages/EditMonitor.vue b/src/pages/EditMonitor.vue index d656c95ac..f8f23d6e3 100644 --- a/src/pages/EditMonitor.vue +++ b/src/pages/EditMonitor.vue @@ -109,7 +109,7 @@
- +
@@ -1167,6 +1167,25 @@ export default { }, computed: { + defaultFriendlyName() { + if (this.monitor.hostname) { + return this.monitor.hostname; + } + if (this.monitor.url) { + if (this.monitor.url !== "http://" && this.monitor.url !== "https://") { + // Ensure monitor without a URL is not affected by invisible URL. + try { + const url = new URL(this.monitor.url); + return url.hostname; + } catch (e) { + return this.monitor.url.replace(/https?:\/\//, ""); + } + } + } + // Default placeholder if neither hostname nor URL is available + return this.$t("defaultFriendlyName"); + }, + ipRegex() { // Allow to test with simple dns server with port (127.0.0.1:5300) @@ -1710,6 +1729,10 @@ message HealthCheckResponse { this.processing = true; + if (!this.monitor.name) { + this.monitor.name = this.defaultFriendlyName; + } + if (!this.isInputValid()) { this.processing = false; return; diff --git a/test/e2e/specs/fridendly-name.spec.js b/test/e2e/specs/fridendly-name.spec.js new file mode 100644 index 000000000..7dbe9dd06 --- /dev/null +++ b/test/e2e/specs/fridendly-name.spec.js @@ -0,0 +1,83 @@ +import { expect, test } from "@playwright/test"; +import { login, restoreSqliteSnapshot, screenshot } from "../util-test"; + +test.describe("Friendly Name Tests", () => { + test.beforeEach(async ({ page }) => { + await restoreSqliteSnapshot(page); + }); + + test("hostname", async ({ page }, testInfo) => { + // Test DNS monitor with hostname + await page.goto("./add"); + await login(page); + await screenshot(testInfo, page); + + await page.getByTestId("monitor-type-select").selectOption("dns"); + await page.getByTestId("hostname-input").fill("example.com"); + await screenshot(testInfo, page); + + await page.getByTestId("save-button").click(); + await page.waitForURL("/dashboard/*"); + + expect(page.getByTestId("monitor-list")).toContainText("example.com"); + await screenshot(testInfo, page); + }); + + test("URL hostname", async ({ page }, testInfo) => { + // Test HTTP monitor with URL + await page.goto("./add"); + await login(page); + await screenshot(testInfo, page); + + await page.getByTestId("monitor-type-select").selectOption("http"); + await page.getByTestId("url-input").fill("https://www.example.com/"); + await screenshot(testInfo, page); + + await page.getByTestId("save-button").click(); + await page.waitForURL("/dashboard/*"); + + expect(page.getByTestId("monitor-list")).toContainText("www.example.com"); + await screenshot(testInfo, page); + }); + + test("custom friendly name", async ({ page }, testInfo) => { + // Test custom friendly name for HTTP monitor + await page.goto("./add"); + await login(page); + await screenshot(testInfo, page); + + await page.getByTestId("monitor-type-select").selectOption("http"); + await page.getByTestId("url-input").fill("https://www.example.com/"); + + // Check if the friendly name placeholder is set to the hostname + const friendlyNameInput = page.getByTestId("friendly-name-input"); + expect(friendlyNameInput).toHaveAttribute("placeholder", "www.example.com"); + await screenshot(testInfo, page); + + const customName = "Example Monitor"; + await friendlyNameInput.fill(customName); + await screenshot(testInfo, page); + + await page.getByTestId("save-button").click(); + await page.waitForURL("/dashboard/*"); + + expect(page.getByTestId("monitor-list")).toContainText(customName); + await screenshot(testInfo, page); + }); + + test("default friendly name", async ({ page }, testInfo) => { + // Test default friendly name when no custom name is provided + await page.goto("./add"); + await login(page); + await screenshot(testInfo, page); + + await page.getByTestId("monitor-type-select").selectOption("group"); + await screenshot(testInfo, page); + + await page.getByTestId("save-button").click(); + await page.waitForURL("/dashboard/*"); + + expect(page.getByTestId("monitor-list")).toContainText("New Monitor"); + await screenshot(testInfo, page); + }); +});