mirror of
https://github.com/louislam/uptime-kuma.git
synced 2025-05-20 06:02:33 +02:00
Merge branch 'master' into sorting-and-search
This commit is contained in:
commit
f359f87fd5
58 changed files with 1451 additions and 494 deletions
|
@ -3,6 +3,7 @@ console.log("== Uptime Kuma Reset Password Tool ==");
|
|||
const Database = require("../server/database");
|
||||
const { R } = require("redbean-node");
|
||||
const readline = require("readline");
|
||||
const { passwordStrength } = require("check-password-strength");
|
||||
const { initJWTSecret } = require("../server/util-server");
|
||||
const User = require("../server/model/user");
|
||||
const { io } = require("socket.io-client");
|
||||
|
@ -42,8 +43,15 @@ const main = async () => {
|
|||
console.log("Using password from argument");
|
||||
console.warn("\x1b[31m%s\x1b[0m", "Warning: the password might be stored, in plain text, in your shell's history");
|
||||
password = confirmPassword = args["new-password"] + "";
|
||||
if (passwordStrength(password).value === "Too weak") {
|
||||
throw new Error("Password is too weak, please use a stronger password.");
|
||||
}
|
||||
} else {
|
||||
password = await question("New Password: ");
|
||||
if (passwordStrength(password).value === "Too weak") {
|
||||
console.log("Password is too weak, please try again.");
|
||||
continue;
|
||||
}
|
||||
confirmPassword = await question("Confirm New Password: ");
|
||||
}
|
||||
|
||||
|
|
521
package-lock.json
generated
521
package-lock.json
generated
File diff suppressed because it is too large
Load diff
|
@ -72,7 +72,7 @@
|
|||
"@louislam/sqlite3": "15.1.6",
|
||||
"@vvo/tzdb": "^6.125.0",
|
||||
"args-parser": "~1.3.0",
|
||||
"axios": "~0.29.0",
|
||||
"axios": "~0.30.0",
|
||||
"badge-maker": "~3.3.1",
|
||||
"bcryptjs": "~2.4.3",
|
||||
"chardet": "~1.4.0",
|
||||
|
@ -82,6 +82,7 @@
|
|||
"command-exists": "~1.2.9",
|
||||
"compare-versions": "~3.6.0",
|
||||
"compression": "~1.7.4",
|
||||
"country-flag-emoji-polyfill": "^0.1.8",
|
||||
"croner": "~8.1.0",
|
||||
"dayjs": "~1.11.5",
|
||||
"dev-null": "^0.1.1",
|
||||
|
|
|
@ -380,39 +380,6 @@ class Monitor extends BeanModel {
|
|||
if (await Monitor.isUnderMaintenance(this.id)) {
|
||||
bean.msg = "Monitor under maintenance";
|
||||
bean.status = MAINTENANCE;
|
||||
} else if (this.type === "group") {
|
||||
const children = await Monitor.getChildren(this.id);
|
||||
|
||||
if (children.length > 0) {
|
||||
bean.status = UP;
|
||||
bean.msg = "All children up and running";
|
||||
for (const child of children) {
|
||||
if (!child.active) {
|
||||
// Ignore inactive childs
|
||||
continue;
|
||||
}
|
||||
const lastBeat = await Monitor.getPreviousHeartbeat(child.id);
|
||||
|
||||
// Only change state if the monitor is in worse conditions then the ones before
|
||||
// lastBeat.status could be null
|
||||
if (!lastBeat) {
|
||||
bean.status = PENDING;
|
||||
} else if (bean.status === UP && (lastBeat.status === PENDING || lastBeat.status === DOWN)) {
|
||||
bean.status = lastBeat.status;
|
||||
} else if (bean.status === PENDING && lastBeat.status === DOWN) {
|
||||
bean.status = lastBeat.status;
|
||||
}
|
||||
}
|
||||
|
||||
if (bean.status !== UP) {
|
||||
bean.msg = "Child inaccessible";
|
||||
}
|
||||
} else {
|
||||
// Set status pending if group is empty
|
||||
bean.status = PENDING;
|
||||
bean.msg = "Group empty";
|
||||
}
|
||||
|
||||
} else if (this.type === "http" || this.type === "keyword" || this.type === "json-query") {
|
||||
// Do not do any queries/high loading things before the "bean.ping"
|
||||
let startTime = dayjs().valueOf();
|
||||
|
@ -1327,7 +1294,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.
|
||||
|
@ -1625,7 +1593,7 @@ class Monitor extends BeanModel {
|
|||
/**
|
||||
* Gets all Children of the monitor
|
||||
* @param {number} monitorID ID of monitor to get
|
||||
* @returns {Promise<LooseObject<any>>} Children
|
||||
* @returns {Promise<LooseObject<any>[]>} Children
|
||||
*/
|
||||
static async getChildren(monitorID) {
|
||||
return await R.getAll(`
|
||||
|
|
|
@ -34,12 +34,16 @@ class DnsMonitorType extends MonitorType {
|
|||
switch (monitor.dns_resolve_type) {
|
||||
case "A":
|
||||
case "AAAA":
|
||||
case "TXT":
|
||||
case "PTR":
|
||||
dnsMessage = `Records: ${dnsRes.join(" | ")}`;
|
||||
conditionsResult = dnsRes.some(record => handleConditions({ record }));
|
||||
break;
|
||||
|
||||
case "TXT":
|
||||
dnsMessage = `Records: ${dnsRes.join(" | ")}`;
|
||||
conditionsResult = dnsRes.flat().some(record => handleConditions({ record }));
|
||||
break;
|
||||
|
||||
case "CNAME":
|
||||
dnsMessage = dnsRes[0];
|
||||
conditionsResult = handleConditions({ record: dnsRes[0] });
|
||||
|
|
49
server/monitor-types/group.js
Normal file
49
server/monitor-types/group.js
Normal file
|
@ -0,0 +1,49 @@
|
|||
const { UP, PENDING, DOWN } = require("../../src/util");
|
||||
const { MonitorType } = require("./monitor-type");
|
||||
const Monitor = require("../model/monitor");
|
||||
|
||||
class GroupMonitorType extends MonitorType {
|
||||
name = "group";
|
||||
|
||||
/**
|
||||
* @inheritdoc
|
||||
*/
|
||||
async check(monitor, heartbeat, _server) {
|
||||
const children = await Monitor.getChildren(monitor.id);
|
||||
|
||||
if (children.length > 0) {
|
||||
heartbeat.status = UP;
|
||||
heartbeat.msg = "All children up and running";
|
||||
for (const child of children) {
|
||||
if (!child.active) {
|
||||
// Ignore inactive childs
|
||||
continue;
|
||||
}
|
||||
const lastBeat = await Monitor.getPreviousHeartbeat(child.id);
|
||||
|
||||
// Only change state if the monitor is in worse conditions then the ones before
|
||||
// lastBeat.status could be null
|
||||
if (!lastBeat) {
|
||||
heartbeat.status = PENDING;
|
||||
} else if (heartbeat.status === UP && (lastBeat.status === PENDING || lastBeat.status === DOWN)) {
|
||||
heartbeat.status = lastBeat.status;
|
||||
} else if (heartbeat.status === PENDING && lastBeat.status === DOWN) {
|
||||
heartbeat.status = lastBeat.status;
|
||||
}
|
||||
}
|
||||
|
||||
if (heartbeat.status !== UP) {
|
||||
heartbeat.msg = "Child inaccessible";
|
||||
}
|
||||
} else {
|
||||
// Set status pending if group is empty
|
||||
heartbeat.status = PENDING;
|
||||
heartbeat.msg = "Group empty";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
GroupMonitorType,
|
||||
};
|
||||
|
|
@ -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"],
|
||||
|
|
73
server/notification-providers/onechat.js
Normal file
73
server/notification-providers/onechat.js
Normal 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;
|
48
server/notification-providers/pumble.js
Normal file
48
server/notification-providers/pumble.js
Normal 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;
|
|
@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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,
|
||||
|
|
40
server/notification-providers/sms-planet.js
Normal file
40
server/notification-providers/sms-planet.js
Normal 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;
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
37
server/notification-providers/spugpush.js
Normal file
37
server/notification-providers/spugpush.js
Normal 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;
|
|
@ -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) {
|
||||
|
|
|
@ -89,7 +89,7 @@ router.get("/api/status-page/heartbeat/:slug", cache("1 minutes"), async (reques
|
|||
SELECT * FROM heartbeat
|
||||
WHERE monitor_id = ?
|
||||
ORDER BY time DESC
|
||||
LIMIT 50
|
||||
LIMIT 100
|
||||
`, [
|
||||
monitorID,
|
||||
]);
|
||||
|
|
|
@ -113,6 +113,7 @@ class UptimeKumaServer {
|
|||
UptimeKumaServer.monitorTypeList["tailscale-ping"] = new TailscalePing();
|
||||
UptimeKumaServer.monitorTypeList["dns"] = new DnsMonitorType();
|
||||
UptimeKumaServer.monitorTypeList["mqtt"] = new MqttMonitorType();
|
||||
UptimeKumaServer.monitorTypeList["group"] = new GroupMonitorType();
|
||||
UptimeKumaServer.monitorTypeList["snmp"] = new SNMPMonitorType();
|
||||
UptimeKumaServer.monitorTypeList["mongodb"] = new MongodbMonitorType();
|
||||
UptimeKumaServer.monitorTypeList["rabbitmq"] = new RabbitMqMonitorType();
|
||||
|
@ -551,6 +552,7 @@ const { RealBrowserMonitorType } = require("./monitor-types/real-browser-monitor
|
|||
const { TailscalePing } = require("./monitor-types/tailscale-ping");
|
||||
const { DnsMonitorType } = require("./monitor-types/dns");
|
||||
const { MqttMonitorType } = require("./monitor-types/mqtt");
|
||||
const { GroupMonitorType } = require("./monitor-types/group");
|
||||
const { SNMPMonitorType } = require("./monitor-types/snmp");
|
||||
const { MongodbMonitorType } = require("./monitor-types/mongodb");
|
||||
const { RabbitMqMonitorType } = require("./monitor-types/rabbitmq");
|
||||
|
|
|
@ -4,9 +4,11 @@
|
|||
|
||||
<script>
|
||||
import { setPageLocale } from "./util-frontend";
|
||||
import { polyfillCountryFlagEmojis } from "country-flag-emoji-polyfill";
|
||||
export default {
|
||||
created() {
|
||||
setPageLocale();
|
||||
},
|
||||
};
|
||||
polyfillCountryFlagEmojis();
|
||||
</script>
|
||||
|
|
|
@ -3,7 +3,7 @@
|
|||
@import "node_modules/bootstrap/scss/bootstrap";
|
||||
|
||||
#app {
|
||||
font-family: BlinkMacSystemFont, segoe ui, Roboto, helvetica neue, Arial, noto sans, sans-serif, apple color emoji, segoe ui emoji, segoe ui symbol, noto color emoji;
|
||||
font-family: "Twemoji Country Flags", BlinkMacSystemFont, segoe ui, Roboto, helvetica neue, Arial, noto sans, sans-serif, apple color emoji, segoe ui emoji, segoe ui symbol, noto color emoji;
|
||||
}
|
||||
|
||||
h1 {
|
||||
|
|
|
@ -42,6 +42,9 @@ export default {
|
|||
mounted() {
|
||||
this.modal = new Modal(this.$refs.modal);
|
||||
},
|
||||
beforeUnmount() {
|
||||
this.cleanupModal();
|
||||
},
|
||||
methods: {
|
||||
/**
|
||||
* Show the confirm dialog
|
||||
|
@ -58,6 +61,19 @@ export default {
|
|||
this.$emit("added", this.groupName);
|
||||
this.modal.hide();
|
||||
},
|
||||
/**
|
||||
* Clean up modal and restore scroll behavior
|
||||
* @returns {void}
|
||||
*/
|
||||
cleanupModal() {
|
||||
if (this.modal) {
|
||||
try {
|
||||
this.modal.hide();
|
||||
} catch (e) {
|
||||
console.warn("Modal hide failed:", e);
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
};
|
||||
</script>
|
||||
|
|
|
@ -14,7 +14,7 @@
|
|||
|
||||
<router-link :to="monitorURL(monitor.id)" class="item" :class="{ 'disabled': ! monitor.active }">
|
||||
<div class="row">
|
||||
<div class="col-9 col-md-8 small-padding" :class="{ 'monitor-item': $root.userHeartbeatBar == 'bottom' || $root.userHeartbeatBar == 'none' }">
|
||||
<div class="col-6 small-padding" :class="{ 'monitor-item': $root.userHeartbeatBar == 'bottom' || $root.userHeartbeatBar == 'none' }">
|
||||
<div class="info">
|
||||
<Uptime :monitor="monitor" type="24" :pill="true" />
|
||||
<span v-if="hasChildren" class="collapse-padding" @click.prevent="changeCollapsed">
|
||||
|
@ -22,11 +22,11 @@
|
|||
</span>
|
||||
{{ monitor.name }}
|
||||
</div>
|
||||
<div v-if="monitor.tags.length > 0" class="tags">
|
||||
<div v-if="monitor.tags.length > 0" class="tags gap-1">
|
||||
<Tag v-for="tag in monitor.tags" :key="tag" :item="tag" :size="'sm'" />
|
||||
</div>
|
||||
</div>
|
||||
<div v-show="$root.userHeartbeatBar == 'normal'" :key="$root.userHeartbeatBar" class="col-3 col-md-4">
|
||||
<div v-show="$root.userHeartbeatBar == 'normal'" :key="$root.userHeartbeatBar" class="col-6">
|
||||
<HeartbeatBar ref="heartbeatBar" size="small" :monitor-id="monitor.id" />
|
||||
</div>
|
||||
</div>
|
||||
|
|
|
@ -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
|
||||
|
@ -235,6 +239,9 @@ export default {
|
|||
mounted() {
|
||||
this.modal = new Modal(this.$refs.modal);
|
||||
},
|
||||
beforeUnmount() {
|
||||
this.cleanupModal();
|
||||
},
|
||||
methods: {
|
||||
|
||||
/**
|
||||
|
@ -339,6 +346,20 @@ export default {
|
|||
});
|
||||
} while (this.$root.notificationList.find(it => it.name === name));
|
||||
return name;
|
||||
},
|
||||
|
||||
/**
|
||||
* Clean up modal and restore scroll behavior
|
||||
* @returns {void}
|
||||
*/
|
||||
cleanupModal() {
|
||||
if (this.modal) {
|
||||
try {
|
||||
this.modal.hide();
|
||||
} catch (e) {
|
||||
console.warn("Modal hide failed:", e);
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
};
|
||||
|
|
|
@ -125,11 +125,12 @@ export default {
|
|||
}
|
||||
};
|
||||
},
|
||||
|
||||
mounted() {
|
||||
this.modal = new Modal(this.$refs.modal);
|
||||
},
|
||||
|
||||
beforeUnmount() {
|
||||
this.cleanupModal();
|
||||
},
|
||||
methods: {
|
||||
/**
|
||||
* Show dialog to confirm deletion
|
||||
|
@ -209,6 +210,20 @@ export default {
|
|||
}
|
||||
});
|
||||
},
|
||||
|
||||
/**
|
||||
* Clean up modal and restore scroll behavior
|
||||
* @returns {void}
|
||||
*/
|
||||
cleanupModal() {
|
||||
if (this.modal) {
|
||||
try {
|
||||
this.modal.hide();
|
||||
} catch (e) {
|
||||
console.warn("Modal hide failed:", e);
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
};
|
||||
</script>
|
||||
|
|
|
@ -111,7 +111,7 @@
|
|||
<template #item="monitor">
|
||||
<div class="item" data-testid="monitor">
|
||||
<div class="row">
|
||||
<div class="col-9 col-md-8 small-padding">
|
||||
<div class="col-6 small-padding">
|
||||
<div class="info">
|
||||
<font-awesome-icon v-if="editMode" icon="arrows-alt-v" class="action drag me-3" />
|
||||
<font-awesome-icon v-if="editMode" icon="times" class="action remove me-3" @click="removeMonitor(group.index, monitor.index)" />
|
||||
|
@ -149,7 +149,7 @@
|
|||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div :key="$root.userHeartbeatBar" class="col-3 col-md-4">
|
||||
<div :key="$root.userHeartbeatBar" class="col-6">
|
||||
<HeartbeatBar size="mid" :monitor-id="monitor.element.id" />
|
||||
</div>
|
||||
</div>
|
||||
|
|
|
@ -6,7 +6,6 @@
|
|||
'm-2': size == 'normal',
|
||||
'px-2': size == 'sm',
|
||||
'py-0': size == 'sm',
|
||||
'mx-1': size == 'sm',
|
||||
}"
|
||||
:style="{ backgroundColor: item.color, fontSize: size == 'sm' ? '0.7em' : '1em' }"
|
||||
>
|
||||
|
@ -48,7 +47,7 @@ export default {
|
|||
},
|
||||
computed: {
|
||||
displayText() {
|
||||
if (this.item.value === "" || this.item.value === undefined) {
|
||||
if (this.item.value === "" || this.item.value === undefined || this.item.value === null) {
|
||||
return this.item.name;
|
||||
} else {
|
||||
return `${this.item.name}: ${this.item.value}`;
|
||||
|
|
|
@ -248,6 +248,9 @@ export default {
|
|||
this.modal = new Modal(this.$refs.modal);
|
||||
this.getExistingTags();
|
||||
},
|
||||
beforeUnmount() {
|
||||
this.cleanupModal();
|
||||
},
|
||||
methods: {
|
||||
/**
|
||||
* Show the add tag dialog
|
||||
|
@ -459,6 +462,19 @@ export default {
|
|||
this.newTags = [];
|
||||
this.deleteTags = [];
|
||||
this.processing = false;
|
||||
},
|
||||
/**
|
||||
* Clean up modal and restore scroll behavior
|
||||
* @returns {void}
|
||||
*/
|
||||
cleanupModal() {
|
||||
if (this.modal) {
|
||||
try {
|
||||
this.modal.hide();
|
||||
} catch (e) {
|
||||
console.warn("Modal hide failed:", e);
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
};
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -18,7 +18,7 @@
|
|||
{{ $t("matrixDesc1") }}
|
||||
</p>
|
||||
<i18n-t tag="p" keypath="matrixDesc2" style="margin-top: 8px;">
|
||||
<code>curl -XPOST -d '{"type": "m.login.password", "identifier": {"user": "botusername", "type": "m.id.user"}, "password": "passwordforuser"}' "https://home.server/_matrix/client/r0/login"</code>.
|
||||
<code>curl -XPOST -d '{"type": "m.login.password", "identifier": {"user": "botusername", "type": "m.id.user"}, "password": "passwordforuser"}' "https://home.server/_matrix/client/v3/login"</code>.
|
||||
</i18n-t>
|
||||
</div>
|
||||
</template>
|
||||
|
|
64
src/components/notifications/OneChat.vue
Normal file
64
src/components/notifications/OneChat.vue
Normal 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>
|
9
src/components/notifications/Pumble.vue
Normal file
9
src/components/notifications/Pumble.vue
Normal 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>
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
46
src/components/notifications/SMSPlanet.vue
Normal file
46
src/components/notifications/SMSPlanet.vue
Normal 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>
|
|
@ -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>
|
||||
|
|
19
src/components/notifications/SpugPush.vue
Normal file
19
src/components/notifications/SpugPush.vue
Normal 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>
|
|
@ -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;
|
||||
|
|
|
@ -21,6 +21,9 @@
|
|||
<label><input v-model="settings.checkBeta" type="checkbox" :disabled="!settings.checkUpdate" @change="saveSettings()" /> {{ $t("Also check beta release") }}</label>
|
||||
</div>
|
||||
</div>
|
||||
<div class="mt-5">
|
||||
<p>{{ $t("Font Twemoji by Twitter licensed under") }} <a href="https://creativecommons.org/licenses/by/4.0/">CC-BY 4.0</a></p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
|
|
@ -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, лицензиран под"
|
||||
}
|
||||
|
|
|
@ -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."
|
||||
}
|
||||
|
|
|
@ -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"
|
||||
}
|
||||
|
|
|
@ -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"
|
||||
}
|
||||
|
|
|
@ -517,6 +517,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 +758,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 +799,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",
|
||||
|
@ -1057,6 +1073,9 @@
|
|||
"rabbitmqHelpText": "To use the monitor, you will need to enable the Management Plugin in your RabbitMQ setup. For more information, please consult the {rabitmq_documentation}.",
|
||||
"SendGrid API Key": "SendGrid API Key",
|
||||
"Separate multiple email addresses with commas": "Separate multiple email addresses with commas",
|
||||
"OneChatAccessToken": "OneChat Access Token",
|
||||
"OneChatUserIdOrGroupId": "OneChat User ID or Group ID",
|
||||
"OneChatBotId": "OneChat Bot ID",
|
||||
"wahaSession": "Session",
|
||||
"wahaChatId": "Chat ID (Phone Number / Contact ID / Group ID)",
|
||||
"wayToGetWahaApiUrl": "Your WAHA Instance URL.",
|
||||
|
@ -1067,5 +1086,13 @@
|
|||
"YZJ Robot Token": "YZJ Robot token",
|
||||
"Plain Text": "Plain Text",
|
||||
"Message Template": "Message Template",
|
||||
"Template Format": "Template Format"
|
||||
"Template Format": "Template Format",
|
||||
"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"
|
||||
}
|
||||
|
|
|
@ -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."
|
||||
}
|
||||
|
|
|
@ -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"
|
||||
}
|
||||
|
|
|
@ -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}."
|
||||
}
|
||||
|
|
|
@ -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"
|
||||
}
|
||||
|
|
|
@ -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ライセンス下でライセンスされています"
|
||||
}
|
||||
|
|
|
@ -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
7
src/lang/lv.json
Normal 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."
|
||||
}
|
|
@ -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"
|
||||
}
|
||||
|
|
|
@ -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."
|
||||
}
|
||||
|
|
|
@ -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."
|
||||
}
|
||||
|
|
|
@ -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"
|
||||
}
|
||||
|
|
|
@ -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": "Формат шаблона"
|
||||
}
|
||||
|
|
|
@ -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"
|
||||
}
|
||||
|
|
|
@ -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 ліцензований під"
|
||||
}
|
||||
|
|
|
@ -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 字体根据此许可证授权"
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue