Merge branch 'master' into master

This commit is contained in:
Ionys 2025-05-08 21:32:08 +02:00 committed by GitHub
commit ab70a99f90
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
44 changed files with 1146 additions and 193 deletions

View file

@ -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.

View file

@ -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"],

View file

@ -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,

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 { 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 += `\n<b>Time (${heartbeatJSON["timezone"]})</b>:${heartbeatJSON["localDateTime"]}`;
}
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) {
this.throwGeneralAxiosError(error);
}
}
}

View file

@ -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,

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.";
try {
if (notification.smseagleApiType === "smseagle-apiv1") { // according to https://www.smseagle.eu/apiv1/
let config = {
headers: {
"Content-Type": "application/json",
"Content-Type": "application/x-www-form-urlencoded",
}
};
let postData;
let sendMethod;
let recipientType;
let encoding = (notification.smseagleEncoding) ? "1" : "0";
let priority = (notification.smseaglePriority) ? notification.smseaglePriority : "0";
let duration;
let voiceId;
if (notification.smseagleRecipientType === "smseagle-contact") {
recipientType = "contactname";
sendMethod = "sms.send_tocontact";
}
if (notification.smseagleRecipientType === "smseagle-group") {
sendMethod = "/send_tocontact";
} else if (notification.smseagleRecipientType === "smseagle-group") {
recipientType = "groupname";
sendMethod = "sms.send_togroup";
}
if (notification.smseagleRecipientType === "smseagle-to") {
sendMethod = "/send_togroup";
} else if (notification.smseagleRecipientType === "smseagle-to") {
recipientType = "to";
sendMethod = "sms.send_sms";
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 params = {
access_token: notification.smseagleToken,
[recipientType]: notification.smseagleRecipient,
message: msg,
responsetype: "extended",
unicode: encoding,
highpriority: priority
};
const url = new URL(notification.smseagleUrl + "/http_api" + sendMethod);
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);
}
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);
}

View file

@ -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;

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 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) {

View file

@ -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": "SpugPushSpug推送助手",
"smsc": "SMSC",
"WPush": "WPush(wpush.cn)",
"YZJ": "YZJ (云之家自定义机器人)"
"YZJ": "YZJ (云之家自定义机器人)",
"SMSPlanet": "SMSPlanet.pl"
};
// Sort by notification name

View file

@ -53,6 +53,13 @@
</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>
<script>
export default {
@ -60,6 +67,9 @@ export default {
if (!this.$parent.notification.discordChannelType) {
this.$parent.notification.discordChannelType = "channel";
}
if (this.$parent.notification.disableUrl === undefined) {
this.$parent.notification.disableUrl = false;
}
}
};
</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>2</option>
</select>
<label for="pushover-sound" class="form-label">{{ $t("Notification Sound") }}</label>
<select id="pushover-sound" v-model="$parent.notification.pushoversounds" class="form-select">
<option value="pushover">{{ $t("pushoversounds pushover") }}</option>
<option value="bike">{{ $t("pushoversounds bike") }}</option>
<option value="bugle">{{ $t("pushoversounds bugle") }}</option>
<option value="cashregister">{{ $t("pushoversounds cashregister") }}</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>
<label for="pushover-sound-down" class="form-label">{{ $t("Notification Sound") }} - Up</label>
<select id="pushover-sound-down" v-model="$parent.notification.pushoversounds" class="form-select">
<option v-for="sound in soundOptions" :key="sound" :value="sound">
{{ $t(`pushoversounds ${sound}`) }}
</option>
</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>
<input id="pushover-ttl" v-model="$parent.notification.pushoverttl" type="number" min="0" step="1" class="form-control">
<div class="form-text">
<span style="color: red;"><sup>*</sup></span>{{ $t("Required") }}
<i18n-t tag="p" keypath="More info on:" style="margin-top: 8px;">
@ -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",
],
};
},
};
</script>

View file

@ -1,15 +1,33 @@
<template>
<div class="mb-3">
<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 class="mb-3">
<label for="smseagle-token" class="form-label">{{ $t("smseagleToken") }}</label>
<HiddenInput id="smseagle-token" v-model="$parent.notification.smseagleToken" :required="true"></HiddenInput>
</div>
<div class="mb-3">
<label for="smseagle-api-type" class="form-label">{{ $t("smseagleApiType") }} </label>
<select id="smseagle-api-type" v-model="$parent.notification.smseagleApiType" class="form-select">
<option value="smseagle-apiv1" selected>{{ $t("smseagleApiv1") }} </option>
<option value="smseagle-apiv2">{{ $t("smseagleApiv2") }} </option>
</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 v-if="$parent.notification.smseagleApiType === 'smseagle-apiv1'" class="mb-3">
<div class="mb-3">
<label for="smseagle-recipient-type" class="form-label">{{ $t("smseagleRecipientType") }}</label>
<select id="smseagle-recipient-type" v-model="$parent.notification.smseagleRecipientType" class="form-select">
<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>
@ -19,14 +37,88 @@
<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 class="mb-3">
<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">
<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 class="mb-3 form-check form-switch">
<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 v-if="$parent.notification.smseagleApiType === 'smseagle-apiv2'" class="mb-3">
<div class="mb-3">
<!-- phone number -->
<label for="smseagle-recipient-to" class="form-label">{{ $t("smseagleTo") }}</label>
<input id="smseagle-recipient-to" v-model="$parent.notification.smseagleRecipientTo" type="text" class="form-control">
<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>
</template>
<script>
@ -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";
}
}
};
</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>
<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')">
<i18n-t tag="div" keypath="smtpDkimDesc" class="form-text mb-3">
<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 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;

View file

@ -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, лицензиран под"
}

View file

@ -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."
}

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.",
"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"
}

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.",
"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"
}

View file

@ -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"
}

View file

@ -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."
}

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.",
"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}",
"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",
"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}."
}

View file

@ -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"
}

View file

@ -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ライセンス下でライセンスされています"
}

View file

@ -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"
}

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",
"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"
}

View file

@ -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."
}

View file

@ -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."
}

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.",
"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"
}

View file

@ -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": "Формат шаблона"
}

View file

@ -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"
}

View file

@ -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 ліцензований під"
}

View file

@ -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 字体根据此许可证授权"
}

View file

@ -109,7 +109,7 @@
<!-- Friendly Name -->
<div class="my-3">
<label for="name" class="form-label">{{ $t("Friendly Name") }}</label>
<input id="name" v-model="monitor.name" type="text" class="form-control" required data-testid="friendly-name-input">
<input id="name" v-model="monitor.name" type="text" class="form-control" data-testid="friendly-name-input" :placeholder="defaultFriendlyName">
</div>
<!-- URL -->
@ -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;

View file

@ -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);
});
});