# Conflicts: # package-lock.json # package.json # server/database.js # server/model/monitor.js # server/server.js # server/util-server.jspull/1639/head
commit
6682839ec8
@ -0,0 +1,10 @@
|
|||||||
|
BEGIN TRANSACTION;
|
||||||
|
|
||||||
|
ALTER TABLE monitor
|
||||||
|
ADD database_connection_string VARCHAR(2000);
|
||||||
|
|
||||||
|
ALTER TABLE monitor
|
||||||
|
ADD database_query TEXT;
|
||||||
|
|
||||||
|
|
||||||
|
COMMIT
|
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,26 @@
|
|||||||
|
const NotificationProvider = require("./notification-provider");
|
||||||
|
const axios = require("axios");
|
||||||
|
|
||||||
|
class Ntfy extends NotificationProvider {
|
||||||
|
|
||||||
|
name = "ntfy";
|
||||||
|
|
||||||
|
async send(notification, msg, monitorJSON = null, heartbeatJSON = null) {
|
||||||
|
let okMsg = "Sent Successfully.";
|
||||||
|
try {
|
||||||
|
await axios.post(`${notification.ntfyserverurl}`, {
|
||||||
|
"topic": notification.ntfytopic,
|
||||||
|
"message": msg,
|
||||||
|
"priority": notification.ntfyPriority || 4,
|
||||||
|
"title": "Uptime-Kuma",
|
||||||
|
});
|
||||||
|
|
||||||
|
return okMsg;
|
||||||
|
|
||||||
|
} catch (error) {
|
||||||
|
this.throwGeneralAxiosError(error);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = Ntfy;
|
@ -0,0 +1,113 @@
|
|||||||
|
const NotificationProvider = require("./notification-provider");
|
||||||
|
const axios = require("axios");
|
||||||
|
const { UP, DOWN, getMonitorRelativeURL } = require("../../src/util");
|
||||||
|
const { setting } = require("../util-server");
|
||||||
|
let successMessage = "Sent Successfully.";
|
||||||
|
|
||||||
|
class PagerDuty extends NotificationProvider {
|
||||||
|
name = "PagerDuty";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @inheritdoc
|
||||||
|
*/
|
||||||
|
async send(notification, msg, monitorJSON = null, heartbeatJSON = null) {
|
||||||
|
try {
|
||||||
|
if (heartbeatJSON == null) {
|
||||||
|
const title = "Uptime Kuma Alert";
|
||||||
|
const monitor = {
|
||||||
|
type: "ping",
|
||||||
|
url: "Uptime Kuma Test Button",
|
||||||
|
};
|
||||||
|
return this.postNotification(notification, title, msg, monitor);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (heartbeatJSON.status === UP) {
|
||||||
|
const title = "Uptime Kuma Monitor ✅ Up";
|
||||||
|
const eventAction = notification.pagerdutyAutoResolve || null;
|
||||||
|
|
||||||
|
return this.postNotification(notification, title, heartbeatJSON.msg, monitorJSON, eventAction);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (heartbeatJSON.status === DOWN) {
|
||||||
|
const title = "Uptime Kuma Monitor 🔴 Down";
|
||||||
|
return this.postNotification(notification, title, heartbeatJSON.msg, monitorJSON, "trigger");
|
||||||
|
}
|
||||||
|
} catch (error) {
|
||||||
|
this.throwGeneralAxiosError(error);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check if result is successful, result code should be in range 2xx
|
||||||
|
* @param {Object} result Axios response object
|
||||||
|
* @throws {Error} The status code is not in range 2xx
|
||||||
|
*/
|
||||||
|
checkResult(result) {
|
||||||
|
if (result.status == null) {
|
||||||
|
throw new Error("PagerDuty notification failed with invalid response!");
|
||||||
|
}
|
||||||
|
if (result.status < 200 || result.status >= 300) {
|
||||||
|
throw new Error("PagerDuty notification failed with status code " + result.status);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Send the message
|
||||||
|
* @param {BeanModel} notification Message title
|
||||||
|
* @param {string} title Message title
|
||||||
|
* @param {string} body Message
|
||||||
|
* @param {Object} monitorInfo Monitor details (For Up/Down only)
|
||||||
|
* @param {?string} eventAction Action event for PagerDuty (trigger, acknowledge, resolve)
|
||||||
|
* @returns {string}
|
||||||
|
*/
|
||||||
|
async postNotification(notification, title, body, monitorInfo, eventAction = "trigger") {
|
||||||
|
|
||||||
|
if (eventAction == null) {
|
||||||
|
return "No action required";
|
||||||
|
}
|
||||||
|
|
||||||
|
let monitorUrl;
|
||||||
|
if (monitorInfo.type === "port") {
|
||||||
|
monitorUrl = monitorInfo.hostname;
|
||||||
|
if (monitorInfo.port) {
|
||||||
|
monitorUrl += ":" + monitorInfo.port;
|
||||||
|
}
|
||||||
|
} else if (monitorInfo.hostname != null) {
|
||||||
|
monitorUrl = monitorInfo.hostname;
|
||||||
|
} else {
|
||||||
|
monitorUrl = monitorInfo.url;
|
||||||
|
}
|
||||||
|
|
||||||
|
const options = {
|
||||||
|
method: "POST",
|
||||||
|
url: notification.pagerdutyIntegrationUrl,
|
||||||
|
headers: { "Content-Type": "application/json" },
|
||||||
|
data: {
|
||||||
|
payload: {
|
||||||
|
summary: `[${title}] [${monitorInfo.name}] ${body}`,
|
||||||
|
severity: notification.pagerdutyPriority || "warning",
|
||||||
|
source: monitorUrl,
|
||||||
|
},
|
||||||
|
routing_key: notification.pagerdutyIntegrationKey,
|
||||||
|
event_action: eventAction,
|
||||||
|
dedup_key: "Uptime Kuma/" + monitorInfo.id,
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
const baseURL = await setting("primaryBaseURL");
|
||||||
|
if (baseURL && monitorInfo) {
|
||||||
|
options.client = "Uptime Kuma";
|
||||||
|
options.client_url = baseURL + getMonitorRelativeURL(monitorInfo.id);
|
||||||
|
}
|
||||||
|
|
||||||
|
let result = await axios.request(options);
|
||||||
|
this.checkResult(result);
|
||||||
|
if (result.statusText != null) {
|
||||||
|
return "PagerDuty notification succeed: " + result.statusText;
|
||||||
|
}
|
||||||
|
|
||||||
|
return successMessage;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = PagerDuty;
|
@ -0,0 +1,110 @@
|
|||||||
|
let express = require("express");
|
||||||
|
const apicache = require("../modules/apicache");
|
||||||
|
const { UptimeKumaServer } = require("../uptime-kuma-server");
|
||||||
|
const StatusPage = require("../model/status_page");
|
||||||
|
const { allowDevAllOrigin, send403 } = require("../util-server");
|
||||||
|
const { R } = require("redbean-node");
|
||||||
|
const Monitor = require("../model/monitor");
|
||||||
|
|
||||||
|
let router = express.Router();
|
||||||
|
|
||||||
|
let cache = apicache.middleware;
|
||||||
|
const server = UptimeKumaServer.getInstance();
|
||||||
|
|
||||||
|
router.get("/status/:slug", cache("5 minutes"), async (request, response) => {
|
||||||
|
let slug = request.params.slug;
|
||||||
|
await StatusPage.handleStatusPageResponse(response, server.indexHTML, slug);
|
||||||
|
});
|
||||||
|
|
||||||
|
router.get("/status", cache("5 minutes"), async (request, response) => {
|
||||||
|
let slug = "default";
|
||||||
|
await StatusPage.handleStatusPageResponse(response, server.indexHTML, slug);
|
||||||
|
});
|
||||||
|
|
||||||
|
router.get("/status-page", cache("5 minutes"), async (request, response) => {
|
||||||
|
let slug = "default";
|
||||||
|
await StatusPage.handleStatusPageResponse(response, server.indexHTML, slug);
|
||||||
|
});
|
||||||
|
|
||||||
|
// Status page config, incident, monitor list
|
||||||
|
router.get("/api/status-page/:slug", cache("5 minutes"), async (request, response) => {
|
||||||
|
allowDevAllOrigin(response);
|
||||||
|
let slug = request.params.slug;
|
||||||
|
|
||||||
|
try {
|
||||||
|
// Get Status Page
|
||||||
|
let statusPage = await R.findOne("status_page", " slug = ? ", [
|
||||||
|
slug
|
||||||
|
]);
|
||||||
|
|
||||||
|
if (!statusPage) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
let statusPageData = await StatusPage.getStatusPageData(statusPage);
|
||||||
|
|
||||||
|
if (!statusPageData) {
|
||||||
|
response.statusCode = 404;
|
||||||
|
response.json({
|
||||||
|
msg: "Not Found"
|
||||||
|
});
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Response
|
||||||
|
response.json(statusPageData);
|
||||||
|
|
||||||
|
} catch (error) {
|
||||||
|
send403(response, error.message);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// Status Page Polling Data
|
||||||
|
// Can fetch only if published
|
||||||
|
router.get("/api/status-page/heartbeat/:slug", cache("1 minutes"), async (request, response) => {
|
||||||
|
allowDevAllOrigin(response);
|
||||||
|
|
||||||
|
try {
|
||||||
|
let heartbeatList = {};
|
||||||
|
let uptimeList = {};
|
||||||
|
|
||||||
|
let slug = request.params.slug;
|
||||||
|
let statusPageID = await StatusPage.slugToID(slug);
|
||||||
|
|
||||||
|
let monitorIDList = await R.getCol(`
|
||||||
|
SELECT monitor_group.monitor_id FROM monitor_group, \`group\`
|
||||||
|
WHERE monitor_group.group_id = \`group\`.id
|
||||||
|
AND public = 1
|
||||||
|
AND \`group\`.status_page_id = ?
|
||||||
|
`, [
|
||||||
|
statusPageID
|
||||||
|
]);
|
||||||
|
|
||||||
|
for (let monitorID of monitorIDList) {
|
||||||
|
let list = await R.getAll(`
|
||||||
|
SELECT * FROM heartbeat
|
||||||
|
WHERE monitor_id = ?
|
||||||
|
ORDER BY time DESC
|
||||||
|
LIMIT 50
|
||||||
|
`, [
|
||||||
|
monitorID,
|
||||||
|
]);
|
||||||
|
|
||||||
|
list = R.convertToBeans("heartbeat", list);
|
||||||
|
heartbeatList[monitorID] = list.reverse().map(row => row.toPublicJSON());
|
||||||
|
|
||||||
|
const type = 24;
|
||||||
|
uptimeList[`${monitorID}_${type}`] = await Monitor.calcUptime(type, monitorID);
|
||||||
|
}
|
||||||
|
|
||||||
|
response.json({
|
||||||
|
heartbeatList,
|
||||||
|
uptimeList
|
||||||
|
});
|
||||||
|
|
||||||
|
} catch (error) {
|
||||||
|
send403(response, error.message);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
module.exports = router;
|
@ -0,0 +1,86 @@
|
|||||||
|
<template>
|
||||||
|
<div class="input-group mb-3">
|
||||||
|
<input
|
||||||
|
ref="input"
|
||||||
|
v-model="model"
|
||||||
|
class="form-control"
|
||||||
|
:type="type"
|
||||||
|
:placeholder="placeholder"
|
||||||
|
:disabled="!enabled"
|
||||||
|
>
|
||||||
|
<a class="btn btn-outline-primary" @click="action()">
|
||||||
|
<font-awesome-icon :icon="icon" />
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
/**
|
||||||
|
* Generic input field with a customizable action on the right.
|
||||||
|
* Action is passed in as a function.
|
||||||
|
*/
|
||||||
|
export default {
|
||||||
|
props: {
|
||||||
|
/**
|
||||||
|
* The value of the input field.
|
||||||
|
*/
|
||||||
|
modelValue: {
|
||||||
|
type: String,
|
||||||
|
default: ""
|
||||||
|
},
|
||||||
|
/**
|
||||||
|
* Whether the input field is enabled / disabled.
|
||||||
|
*/
|
||||||
|
enabled: {
|
||||||
|
type: Boolean,
|
||||||
|
default: true
|
||||||
|
},
|
||||||
|
/**
|
||||||
|
* Placeholder text for the input field.
|
||||||
|
*/
|
||||||
|
placeholder: {
|
||||||
|
type: String,
|
||||||
|
default: ""
|
||||||
|
},
|
||||||
|
/**
|
||||||
|
* The icon displayed in the right button of the input field.
|
||||||
|
* Accepts a Font Awesome icon string identifier.
|
||||||
|
* @example "plus"
|
||||||
|
*/
|
||||||
|
icon: {
|
||||||
|
type: String,
|
||||||
|
required: true,
|
||||||
|
},
|
||||||
|
/**
|
||||||
|
* The input type of the input field.
|
||||||
|
* @example "email"
|
||||||
|
*/
|
||||||
|
type: {
|
||||||
|
type: String,
|
||||||
|
default: "text",
|
||||||
|
},
|
||||||
|
/**
|
||||||
|
* The action to be performed when the button is clicked.
|
||||||
|
* Action is passed in as a function.
|
||||||
|
*/
|
||||||
|
action: {
|
||||||
|
type: Function,
|
||||||
|
default: () => {},
|
||||||
|
}
|
||||||
|
},
|
||||||
|
emits: [ "update:modelValue" ],
|
||||||
|
computed: {
|
||||||
|
/**
|
||||||
|
* Send value update to parent on change.
|
||||||
|
*/
|
||||||
|
model: {
|
||||||
|
get() {
|
||||||
|
return this.modelValue;
|
||||||
|
},
|
||||||
|
set(value) {
|
||||||
|
this.$emit("update:modelValue", value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
};
|
||||||
|
</script>
|
@ -0,0 +1,30 @@
|
|||||||
|
<template>
|
||||||
|
<div class="mb-3">
|
||||||
|
<label for="ntfy-ntfytopic" class="form-label">{{ $t("ntfy Topic") }}</label>
|
||||||
|
<div class="input-group mb-3">
|
||||||
|
<input id="ntfy-ntfytopic" v-model="$parent.notification.ntfytopic" type="text" class="form-control" required>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="mb-3">
|
||||||
|
<label for="ntfy-server-url" class="form-label">{{ $t("Server URL") }}</label>
|
||||||
|
<div class="input-group mb-3">
|
||||||
|
<input id="ntfy-server-url" v-model="$parent.notification.ntfyserverurl" type="text" class="form-control" required>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="mb-3">
|
||||||
|
<label for="ntfy-priority" class="form-label">{{ $t("Priority") }}</label>
|
||||||
|
<input id="ntfy-priority" v-model="$parent.notification.ntfyPriority" type="number" class="form-control" required min="1" max="5" step="1">
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
export default {
|
||||||
|
mounted() {
|
||||||
|
if (typeof this.$parent.notification.ntfyPriority === "undefined") {
|
||||||
|
this.$parent.notification.ntfyserverurl = "https://ntfy.sh";
|
||||||
|
this.$parent.notification.ntfyPriority = 5;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
};
|
||||||
|
</script>
|
@ -0,0 +1,45 @@
|
|||||||
|
<template>
|
||||||
|
<div class="mb-3">
|
||||||
|
<label for="pagerduty-integration-key" class="form-label">{{ $t("Integration Key") }}</label>
|
||||||
|
<HiddenInput id="pagerduty-integration-key" v-model="$parent.notification.pagerdutyIntegrationKey" :required="true" autocomplete="false"></HiddenInput>
|
||||||
|
<i18n-t tag="div" keypath="wayToGetPagerDutyKey" class="form-text">
|
||||||
|
<a href="https://support.pagerduty.com/docs/services-and-integrations" target="_blank">{{ $t("here") }}</a>
|
||||||
|
</i18n-t>
|
||||||
|
</div>
|
||||||
|
<div class="mb-3">
|
||||||
|
<label for="pagerduty-integration-url" class="form-label">{{ $t("Integration URL") }}</label>
|
||||||
|
<input id="pagerduty-integration-url" v-model="$parent.notification.pagerdutyIntegrationUrl" type="text" class="form-control" autocomplete="false">
|
||||||
|
</div>
|
||||||
|
<div class="mb-3">
|
||||||
|
<label for="pagerduty-priority" class="form-label">{{ $t("Priority") }}</label>
|
||||||
|
<select id="pagerduty-priority" v-model="$parent.notification.pagerdutyPriority" class="form-select">
|
||||||
|
<option value="info">{{ $t("info") }}</option>
|
||||||
|
<option value="warning" selected="selected">{{ $t("warning") }}</option>
|
||||||
|
<option value="error">{{ $t("error") }}</option>
|
||||||
|
<option value="critical">{{ $t("critical") }}</option>
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
<div class="mb-3">
|
||||||
|
<label for="pagerduty-resolve" class="form-label">{{ $t("Auto resolve or acknowledged") }}</label>
|
||||||
|
<select id="pagerduty-resolve" v-model="$parent.notification.pagerdutyAutoResolve" class="form-select">
|
||||||
|
<option value="0" selected="selected">{{ $t("do nothing") }}</option>
|
||||||
|
<option value="acknowledge">{{ $t("auto acknowledged") }}</option>
|
||||||
|
<option value="resolve">{{ $t("auto resolve") }}</option>
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
import HiddenInput from "../HiddenInput.vue";
|
||||||
|
|
||||||
|
export default {
|
||||||
|
components: {
|
||||||
|
HiddenInput,
|
||||||
|
},
|
||||||
|
mounted() {
|
||||||
|
if (typeof this.$parent.notification.pagerdutyIntegrationUrl === "undefined") {
|
||||||
|
this.$parent.notification.pagerdutyIntegrationUrl = "https://events.pagerduty.com/v2/enqueue";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
</script>
|
@ -0,0 +1,518 @@
|
|||||||
|
export default {
|
||||||
|
languageName: "ไทย",
|
||||||
|
checkEverySecond: "ตรวจสอบทุก {0} วินาที",
|
||||||
|
retryCheckEverySecond: "ลองใหม่ทุก {0} วินาที",
|
||||||
|
retriesDescription: "จำนวนครั้งสูงสุดที่จะลองก่อนบริการถูกระบุว่าไม่สามารถใช้งานได้และส่งการแจ้งเตือน",
|
||||||
|
ignoreTLSError: "ไม่สนใจข้อผิดพลาด TLS/SSL สำหรับเว็บไซต์ HTTPS",
|
||||||
|
upsideDownModeDescription: "กลับด้านสถานะ เช่น ถ้าบริการสามารถใช้งานได้จะถูกเปลี่ยนเป็นใช้งานไม่ได้",
|
||||||
|
maxRedirectDescription: "จำนวนครั้งสูงสุดที่จะเปลี่ยนเส้นทาง, ตั่งเป็น 0 เพื่อปิดการเปลี่ยนเส้นทาง",
|
||||||
|
acceptedStatusCodesDescription: "เลือกรหัสสถานะที่ถือว่าการตอบกลับสำเร็จ",
|
||||||
|
passwordNotMatchMsg: "รหัสผ่านไม่ตรงกัน",
|
||||||
|
notificationDescription: "การแจ้งเตือนต้องกำหนดให้มอนิเตอร์เพื่อให้สามารถใช้งานได้",
|
||||||
|
keywordDescription: "ค้นหาคำสำคัญใน HTML หรือ JSON ของการตอบกลับ, คำสำคัญต้องคำนึงถึงตัวพิมพ์เล็กและตัวพิมพ์ใหญ่",
|
||||||
|
pauseDashboardHome: "หยุดชั่วคราว",
|
||||||
|
deleteMonitorMsg: "คุณแน่ใจหรือไม่ที่จะลบมอนิเตอร์?",
|
||||||
|
deleteNotificationMsg: "คุณแน่ใจหรือไม่ที่จะลบการแจ้งเตือนสำหรับมอนิเตอร์ทั้งหมด?",
|
||||||
|
resolverserverDescription: "Cloudflare เป็นเซิร์ฟเวอร์ค้นหาเริ่มต้น, คุณสามารถเปลี่ยนเซิร์ฟเวอร์ได้ตลอดเวลา",
|
||||||
|
rrtypeDescription: "เลือกประเภท DNS Record ที่คุณต้องการจะมอนิเตอร์",
|
||||||
|
pauseMonitorMsg: "คุณแน่ใจหรือไม่ที่จะหยุดมอนิเตอร์ชั่วคราว?",
|
||||||
|
enableDefaultNotificationDescription: "การแจ้งเตือนนี้จะถูกเปิดโดนค่าเริ่มต้นสำหรับมอนิเตอร์ใหม่, คุณสามารถปิดการแจ้งเตือนสำหรับแต่ละมอนิเตอร์ได้",
|
||||||
|
clearEventsMsg: "คุณแน่ใจหรือไม่ที่จะลบเหตุการณ์ทั้งหมดสำหรับมอนิเตอร์นี้?",
|
||||||
|
clearHeartbeatsMsg: "คุณแน่ใจหรือไม่ที่จะลบประวัติการตรวจสอบทั้งหมดสำหรับมอนิเตอร์นี้?",
|
||||||
|
confirmClearStatisticsMsg: "คุณแน่ใจหรือไม่ที่จะลบสถิติทั้งหมด?",
|
||||||
|
importHandleDescription: "เลือก \"ข้ามรายการที่มีอยู่แล้ว\" ถ้าคุณต้องการข้ามทุกมอนิเตอร์หรือการแจ้งเตือนที่มีชื่อซ้ำกัน, \"เขียนทับ\" จะลบทุกมอนิเตอร์หรือการแจ้งเตือนที่มีชื่อซ้ำกัน",
|
||||||
|
confirmImportMsg: "คุณแน่ใจหรือไม่ที่จะนำเข้าข้อมูลสำรอง, กรุณาตรวจสอบว่าคุณเลือกข้อมูลที่ถูกต้อง",
|
||||||
|
twoFAVerifyLabel: "โปรดกรอกกุญแจ 2FA ของคุณเพื่อยืนยัน:",
|
||||||
|
tokenValidSettingsMsg: "กุญแจถูกต้อง, ตอนนี้คุณสามารถบันทึกการตั้งค่า 2FA ของคุณได้แล้ว",
|
||||||
|
confirmEnableTwoFAMsg: "คุณแน่ใจหรือไม่ที่จะเปิดใช้งาน 2FA?",
|
||||||
|
confirmDisableTwoFAMsg: "คุณแน่ใจหรือไม่ที่จะปิดใช้งาน 2FA?",
|
||||||
|
Settings: "การตั้งค่า",
|
||||||
|
Dashboard: "แผงควบคุม",
|
||||||
|
"New Update": "อัพเดทใหม่",
|
||||||
|
Language: "ภาษา",
|
||||||
|
Appearance: "รูปร่าง",
|
||||||
|
Theme: "หน้าตา",
|
||||||
|
General: "ทั่วไป",
|
||||||
|
"Primary Base URL": "URL หลัก",
|
||||||
|
Version: "เวอร์ชั่น",
|
||||||
|
"Check Update On GitHub": "ตรวจสอบการอัปเดตบน GitHub",
|
||||||
|
List: "รายการ",
|
||||||
|
Add: "เพิ่ม",
|
||||||
|
"Add New Monitor": "เพิ่มมอนิเตอร์ใหม่",
|
||||||
|
"Quick Stats": "สถิติด่วน",
|
||||||
|
Up: "ใช้งานได้",
|
||||||
|
Down: "ไม่สามารถใช้งานได้",
|
||||||
|
Pending: "รอดำเนินการ",
|
||||||
|
Unknown: "ไม่ทราบ",
|
||||||
|
Pause: "หยุดชั่วคราว",
|
||||||
|
Name: "ชื่อ",
|
||||||
|
Status: "สถานะ",
|
||||||
|
DateTime: "วันที่และเวลา",
|
||||||
|
Message: "ข้อความ",
|
||||||
|
"No important events": "ไม่มีกิจกรรมที่สำคัญ",
|
||||||
|
Resume: "ดำเนินการต่อ",
|
||||||
|
Edit: "แก้ไข",
|
||||||
|
Delete: "ลบ",
|
||||||
|
Current: "ปัจจุบัน",
|
||||||
|
Uptime: "เวลาที่ใช้งาน",
|
||||||
|
"Cert Exp.": "วันหมดอายุใบรับรอง",
|
||||||
|
days: "วัน",
|
||||||
|
day: "วัน",
|
||||||
|
"-day": "-วัน",
|
||||||
|
hour: "ชั่วโมง",
|
||||||
|
"-hour": "-ชั่วโมง",
|
||||||
|
Response: "การตอบสนอง",
|
||||||
|
Ping: "การตอบสนอง",
|
||||||
|
"Monitor Type": "ประเภทมอนิเตอร์",
|
||||||
|
Keyword: "คำสำคัญ",
|
||||||
|
"Friendly Name": "ชื่อที่เป็นมิตร",
|
||||||
|
URL: "URL",
|
||||||
|
Hostname: "ชื่อโฮสต์",
|
||||||
|
Port: "พอร์ต",
|
||||||
|
"Heartbeat Interval": "ระยะห่างระหว่างการทดสอบ",
|
||||||
|
Retries: "จำนวนครั้งที่จะลองใหม่",
|
||||||
|
"Heartbeat Retry Interval": "ระยะห่างระหว่างการทดสอบใหม่หลังจากไม่สำเร็จ",
|
||||||
|
Advanced: "ขั้นสูง",
|
||||||
|
"Upside Down Mode": "โหมดกลับด้าน",
|
||||||
|
"Max. Redirects": "จำนวนการเปลี่ยนเส้นทางสูงสุด",
|
||||||
|
"Accepted Status Codes": "รหัสสถานะที่ยอมรับ",
|
||||||
|
"Push URL": "URL เป้าหมาย",
|
||||||
|
needPushEvery: "คุณควรเรียก URL นี้ทุก {0} วินาที",
|
||||||
|
pushOptionalParams: "ตัวแปรเสริม: {0}",
|
||||||
|
Save: "บันทึก",
|
||||||
|
Notifications: "การแจ้งเตือน",
|
||||||
|
"Not available, please setup.": "ไม่พร้อมใช้งาน, กรุณาตั้งค่า",
|
||||||
|
"Setup Notification": "ตั้งค่าการแจ้งเตือน",
|
||||||
|
Light: "สว่าง",
|
||||||
|
Dark: "มืด",
|
||||||
|
Auto: "อัตโนมัติ",
|
||||||
|
"Theme - Heartbeat Bar": "หน้าตา - แถบการตอบสนอง",
|
||||||
|
Normal: "ปกติ",
|
||||||
|
Bottom: "ด้านล่าง",
|
||||||
|
None: "ไม่มี",
|
||||||
|
Timezone: "เขตเวลา",
|
||||||
|
"Search Engine Visibility": "การมองเห็นของเครื่องมือค้นหา",
|
||||||
|
"Allow indexing": "อนุญาตให้สร้างดัชนี",
|
||||||
|
"Discourage search engines from indexing site": "ปฏิเสธเครื่องมือค้นหาไม่ให้สร้างดัชนีของเว็บไซต์",
|
||||||
|
"Change Password": "เปลี่ยนรหัสผ่าน",
|
||||||
|
"Current Password": "รหัสผ่านปัจจุบัน",
|
||||||
|
"New Password": "รหัสผ่านใหม่",
|
||||||
|
"Repeat New Password": "ยืนยันรหัสผ่านใหม่",
|
||||||
|
"Update Password": "อัพเดทรหัสผ่าน",
|
||||||
|
"Disable Auth": "ปิดใช้งานการตรวจสอบสิทธิ์",
|
||||||
|
"Enable Auth": "เปิดใช้งานการตรวจสอบสิทธิ์",
|
||||||
|
Logout: "ออกจากระบบ",
|
||||||
|
Leave: "ออก",
|
||||||
|
"I understand, please disable": "ฉันเข้าใจแล้ว, กรุณาปิดการใช้งาน",
|
||||||
|
Confirm: "ยืนยัน",
|
||||||
|
Yes: "ใช่",
|
||||||
|
No: "ไม่",
|
||||||
|
Username: "ชื่อผู้ใช้",
|
||||||
|
Password: "รหัสผ่าน",
|
||||||
|
"Remember me": "คงอยู่ในระบบ",
|
||||||
|
Login: "เข้าสู่ระบบ",
|
||||||
|
"No Monitors, please": "ไม่มีมอนิเตอร์, กรุณา",
|
||||||
|
"add one": "สร้าง",
|
||||||
|
"Notification Type": "ประเภทการแจ้งเตือน",
|
||||||
|
Email: "อีเมล",
|
||||||
|
Test: "ทดสอบ",
|
||||||
|
"Certificate Info": "ข้อมูลใบรับรอง",
|
||||||
|
"Resolver Server": "เซิร์ฟเวอร์ทีค้นหา",
|
||||||
|
"Resource Record Type": "ประเภท DNS Record",
|
||||||
|
"Last Result": "ผลล่าสุด",
|
||||||
|
"Create your admin account": "สร้างบัญชีผู้ดูแลระบบ",
|
||||||
|
"Repeat Password": "ยืนยันรหัสผ่าน",
|
||||||
|
"Import Backup": "นำเข้าข้อมูลสำรอง",
|
||||||
|
"Export Backup": "ส่งออกข้อมูลสำรอง",
|
||||||
|
Export: "ส่งออก",
|
||||||
|
Import: "นำเข้า",
|
||||||
|
respTime: "ระยะเวลาการตอบสนอง (ms)",
|
||||||
|
notAvailableShort: "ไม่สามารถใช้งานได้",
|
||||||
|
"Default enabled": "เปิดใช้งานโดยค่าเริ่มต้น",
|
||||||
|
"Apply on all existing monitors": "ใช้กับมอนิเตอร์ทั้งหมด",
|
||||||
|
Create: "สร้าง",
|
||||||
|
"Clear Data": "ล้างข้อมูล",
|
||||||
|
Events: "เหตุการณ์",
|
||||||
|
Heartbeats: "ประวัติการตรวจสอบ",
|
||||||
|
"Auto Get": "ดึงอัตโนมัติ",
|
||||||
|
backupDescription: "คุณสามารถสำรองข้อมูลการแจ้งเตือนและมอนิเตอร์ทั้งหมดได้ในไฟล์ JSON",
|
||||||
|
backupDescription2: "หมายเหตุ : ประวัติและข้อมูลกิจกรรมจะไม่ถูกสำรอง",
|
||||||
|
backupDescription3: "ข้อมูลที่ละเอียดอ่อนเช่นกุญแจการแจ้งเตือนจะรวมอยู่ในไฟล์ข้อมูลสำรอง, โปรดเก็บข้อมูลสำรองอย่างปลอดภัย",
|
||||||
|
alertNoFile: "กรุณาเลือกไฟล์ที่จะใช้งาน",
|
||||||
|
alertWrongFileType: "กรุณาเลือกไฟล์ที่เป็น JSON",
|
||||||
|
"Clear all statistics": "ล้างข้อมูลสถิติทั้งหมด",
|
||||||
|
"Skip existing": "ข้ามรายการที่มีอยู่แล้ว",
|
||||||
|
Overwrite: "เขียนทับ",
|
||||||
|
Options: "ตัวเลือก",
|
||||||
|
"Keep both": "เก็บทั้งสอง",
|
||||||
|
"Verify Token": "ยืนยันกุญแจ",
|
||||||
|
"Setup 2FA": "ติดตั้ง 2FA",
|
||||||
|
"Enable 2FA": "เปิดใช้งาน 2FA",
|
||||||
|
"Disable 2FA": "ปิดใช้งาน 2FA",
|
||||||
|
"2FA Settings": "ตั้งค่า 2FA",
|
||||||
|
"Two Factor Authentication": "การตรวจสอบสิทธิ์สองปัจจัย",
|
||||||
|
Active: "ใช้งาน",
|
||||||
|
Inactive: "ไม่ใช้งาน",
|
||||||
|
Token: "กุญแจ",
|
||||||
|
"Show URI": "แสดง URI",
|
||||||
|
Tags: "แท็ก",
|
||||||
|
"Add New below or Select...": "เพิ่มใหม่ด้านล่างหรือเลือก...",
|
||||||
|
"Tag with this name already exist.": "แท็กที่มีชื่อนี้มีอยู่แล้ว",
|
||||||
|
"Tag with this value already exist.": "แท็กที่มีข้อมูลนี้มีอยู่แล้ว",
|
||||||
|
color: "สี",
|
||||||
|
"value (optional)": "ข้อมูล (ไม่จำเป็น)",
|
||||||
|
Gray: "เทา",
|
||||||
|
Red: "แดง",
|
||||||
|
Orange: "ส้ม",
|
||||||
|
Green: "เขียว",
|
||||||
|
Blue: "น้ำเงิน",
|
||||||
|
Indigo: "ม่วง",
|
||||||
|
Purple: "ม่วง",
|
||||||
|
Pink: "ชมพู",
|
||||||
|
"Search...": "ค้นหา...",
|
||||||
|
"Avg. Ping": "ค่า Ping เฉลี่ย",
|
||||||
|
"Avg. Response": "ค่า Response เฉลี่ย",
|
||||||
|
"Entry Page": "หน้าต้อนรับ",
|
||||||
|
statusPageNothing: "ไม่มีอะไรตรงนี้ !, กรุณาเพิ่มกลุ่มหรือมอนิเตอร์",
|
||||||
|
"No Services": "ไม่มีบริการ",
|
||||||
|
"All Systems Operational": "บริการทั้งหมดทำงานได้ปกติ",
|
||||||
|
"Partially Degraded Service": "บริการมีปัญหาบางส่วน",
|
||||||
|
"Degraded Service": "บริการมีปัญหา",
|
||||||
|
"Add Group": "เพิ่มกลุ่ม",
|
||||||
|
"Add a monitor": "เพิ่มมอนิเตอร์",
|
||||||
|
"Edit Status Page": "แก้ไขหน้าสถานะ",
|
||||||
|
"Go to Dashboard": "ไปที่หน้าควบคุม",
|
||||||
|
"Status Page": "หน้าสถานะ",
|
||||||
|
"Status Pages": "หน้าสถานะ",
|
||||||
|
defaultNotificationName: "การแจ้งเตือน {notification} ของฉัน ({number})",
|
||||||
|
here: "ที่นี่",
|
||||||
|
Required: "ต้องการ",
|
||||||
|
telegram: "Telegram",
|
||||||
|
"Bot Token": "กุญแจของบอท",
|
||||||
|
wayToGetTelegramToken: "คุณสามารถรับกุญแจได้จาก {0}.",
|
||||||
|
"Chat ID": "ไอดีแชท",
|
||||||
|
supportTelegramChatID: "รองรับ แชทส่วนตัว, แชทกลุ่ม, ไอดีแชท",
|
||||||
|
wayToGetTelegramChatID: "คุณสามารถรับ ID แชทของคุณได้โดยส่งข้อความไปยังบอทและไปที่ URL นี้เพื่อดู chat_id :",
|
||||||
|
"YOUR BOT TOKEN HERE": "กุญแจของบอทของคุณที่นี่",
|
||||||
|
chatIDNotFound: "ไม่พบไอดีแชท, กรุณาส่งข้อความไปที่บอท",
|
||||||
|
webhook: "Webhook",
|
||||||
|
"Post URL": "URL โพสต์",
|
||||||
|
"Content Type": "ประเภทเนื้อหา",
|
||||||
|
webhookJsonDesc: "{0} ดีสำหรับเซิร์ฟเวอร์ HTTP สมัยใหม่เช่น Express.js",
|
||||||
|
webhookFormDataDesc: "{multipart} ดีสำหรับ PHP, JSON จะต้องถูกประมวลผลด้วย {decodeFunction}",
|
||||||
|
smtp: "Email (SMTP)",
|
||||||
|
secureOptionNone: "None / STARTTLS (25, 587)",
|
||||||
|
secureOptionTLS: "TLS (465)",
|
||||||
|
"Ignore TLS Error": "Ignore TLS Error",
|
||||||
|
"From Email": "From Email",
|
||||||
|
emailCustomSubject: "Custom Subject",
|
||||||
|
"To Email": "To Email",
|
||||||
|
smtpCC: "CC",
|
||||||
|
smtpBCC: "BCC",
|
||||||
|
discord: "Discord",
|
||||||
|
"Discord Webhook URL": "Discord Webhook URL",
|
||||||
|
wayToGetDiscordURL: "คุณสามารถรับได้โดยการไปที่ Server Settings -> Integrations -> Create Webhook",
|
||||||
|
"Bot Display Name": "ชื่อบอท",
|
||||||
|
"Prefix Custom Message": "คำนำหน้าข้อความที่กำหนดเอง",
|
||||||
|
"Hello @everyone is...": "สวัสดี {'@'}everyone นี่...",
|
||||||
|
teams: "Microsoft Teams",
|
||||||
|
"Webhook URL": "Webhook URL",
|
||||||
|
wayToGetTeamsURL: "คุณสามารถเรียนรู้วิธีการสร้าง Webhook URL {0}",
|
||||||
|
signal: "Signal",
|
||||||
|
Number: "หมายเลข",
|
||||||
|
Recipients: "ผู้รับ",
|
||||||
|
needSignalAPI: "คุณต้องมี Signal Client ที่มี Rest APIl",
|
||||||
|
wayToCheckSignalURL: "คุณสามารถตรวจสอบ URL นี้เพื่อดูวิธีตั้งค่า :",
|
||||||
|
signalImportant: "สำคัญ: คุณไม่สามารถผสมกลุ่มและตัวเลขในผู้รับได้!",
|
||||||
|
gotify: "Gotify",
|
||||||
|
"Application Token": "กุญแจของแอพพลิเคชั่น",
|
||||||
|
"Server URL": "Server URL",
|
||||||
|
Priority: "ลำดับความสำคัญ",
|
||||||
|
slack: "Slack",
|
||||||
|
"Icon Emoji": "Icon Emoji",
|
||||||
|
"Channel Name": "ชื่อห้อง",
|
||||||
|
"Uptime Kuma URL": "Uptime Kuma URL",
|
||||||
|
aboutWebhooks: "ข้อมูลเพิ่มเติมสำหรับ Webhooks : {0}",
|
||||||
|
aboutChannelName: "ใส่ชื่อห้องบน {0} ในช่องชื่อห้องถ้าต้องการที่จะข้าม Webhook, เช่น: #ช่องอื่นๆ",
|
||||||
|
aboutKumaURL: "ถ้าคุณไม่ใส่ข้อมูลในช่อง Uptime Kuma URL ค่าเริ่มต้นจะเป็นจะเป็น Uptime Kuma Github",
|
||||||
|
emojiCheatSheet: "ตาราง Emoji : {0}",
|
||||||
|
"rocket.chat": "Rocket.Chat",
|
||||||
|
pushover: "Pushover",
|
||||||
|
pushy: "Pushy",
|
||||||
|
PushByTechulus: "Push by Techulus",
|
||||||
|
octopush: "Octopush",
|
||||||
|
promosms: "PromoSMS",
|
||||||
|
clicksendsms: "ClickSend SMS",
|
||||||
|
lunasea: "LunaSea",
|
||||||
|
apprise: "Apprise (รองรับการแจ้งเตือนมากกว่า 50 บริการ)",
|
||||||
|
GoogleChat: "Google Chat (Google Workspace only)",
|
||||||
|
pushbullet: "Pushbullet",
|
||||||
|
line: "Line Messenger",
|
||||||
|
mattermost: "Mattermost",
|
||||||
|
"User Key": "กุญแจผู้ใช้งาน",
|
||||||
|
Device: "อุปกรณ์",
|
||||||
|
"Message Title": "หัวข้อข้อความ",
|
||||||
|
"Notification Sound": "เสียงแจ้งเตือน",
|
||||||
|
"More info on:": "ข้อมูลเพิ่มเติม : {0}",
|
||||||
|
pushoverDesc1: "ลำดับความสำตคญฉุกเฉิน (2) มีการหมดเวลาเริ่มต้น 30 วินาทีระหว่างลองใหม่และจะหมดอายุหลังจาก 1 ชั่วโมง",
|
||||||
|
pushoverDesc2: "ถ้าคุณต้องการจะส่งการแจ้งเตือนไปยังอุปกรณ์อื่น ๆ สามารถกำหนดได้ที่ช่องอุปกรณ์",
|
||||||
|
"SMS Type": "ประเภท SMS",
|
||||||
|
octopushTypePremium: "พรีเมี่ยม (เร็ว - แนะนำสำหรับการแจ้งเตือน)",
|
||||||
|
octopushTypeLowCost: "ต้นทุนต่ำ (ช้า - บางครั้งจะถูกบล็อกโดยผู้ให้บริการ)",
|
||||||
|
checkPrice: "ตรวจสอบราคาของ {0} :",
|
||||||
|
apiCredentials: "ข้อมูลการตรวจสอบสิทธิ์ API",
|
||||||
|
octopushLegacyHint: "คุณใช้เวอร์ชันดั้งเดิมของ Octopush (2011 - 2020) หรือเวอร์ชันใหม่หรือไม่?",
|
||||||
|
"Check octopush prices": "ตรวจสอบราคาของ Octopush {0}",
|
||||||
|
octopushPhoneNumber: "หมายเลขโทรศัพท์ (รูปแบบสากล เช่น +33612345678) ",
|
||||||
|
octopushSMSSender: "ชื่อผู้ส่ง SMS : ความยาว 3 - 11 ตัวอักษร, ตัวเลข และช่องว่าง (a-zA-Z0-9 )",
|
||||||
|
"LunaSea Device ID": "ไอดีอุปกรณ์ LunaSea",
|
||||||
|
"Apprise URL": "Apprise URL",
|
||||||
|
"Example:": "ตัวอย่าง : {0}",
|
||||||
|
"Read more:": "อ่านเพิ่มเติม : {0}",
|
||||||
|
"Status:": "สถานะ : {0}",
|
||||||
|
"Read more": "อ่านเพิ่มเติม",
|
||||||
|
appriseInstalled: "Apprise ถูกติดตั่งแล้ว",
|
||||||
|
appriseNotInstalled: "Apprise ยังไม่ถูกติดตั่ง {0}",
|
||||||
|
"Access Token": "กุญแจการเข้าถึง",
|
||||||
|
"Channel access token": "กุญแจการเข้าถึงของช่อง",
|
||||||
|
"Line Developers Console": "Line Developers Console",
|
||||||
|
lineDevConsoleTo: "Line Developers Console - {0}",
|
||||||
|
"Basic Settings": "การตั้งค่าพื้นฐาน",
|
||||||
|
"User ID": "ไอดีผู้ใช้",
|
||||||
|
"Messaging API": "Messaging API",
|
||||||
|
wayToGetLineChannelToken: "ขั้นแรกให้เข้า {0} สร้างผู้ให้บริการและช่องทาง (Messaging API) จากนั้นคุณจะได้รับกุญแจการเข้าถึงช่องและไอดีผู้ใช้จากรายการเมนูที่กล่าวถึงข้างต้น",
|
||||||
|
"Icon URL": "Icon URL",
|
||||||
|
aboutIconURL: "คุณสามารถระบุลิงก์ไปยังรูปภาพใน \"URL ไอคอน\" เพื่อแทนที่รูปภาพโปรไฟล์เริ่มต้น จะไม่ถูกใช้หากมีการตั้งค่า Icon Emoji",
|
||||||
|
aboutMattermostChannelName: "คุณลบล้างช่องเริ่มต้นที่ Webhook โพสต์ได้ด้วยการป้อนชื่อช่องลงในช่อง \"ชื่อช่อง\" ต้องเปิดใช้งานในการตั้งค่า Mattermost Webhook เช่น #ช่องอื่นๆ",
|
||||||
|
matrix: "Matrix",
|
||||||
|
promosmsTypeEco: "SMS ECO - ราคาถูก แต่ช้าและมักจะโอเวอร์โหลด จำกัดเฉพาะผู้รับโปแลนด์",
|
||||||
|
promosmsTypeFlash: "SMS FLASH - ข้อความจะแสดงบนอุปกรณ์ของผู้รับโดยอัตโนมัติ จำกัดเฉพาะผู้รับโปแลนด์",
|
||||||
|
promosmsTypeFull: "SMS FULL - SMS ระดับพรีเมียม คุณสามารถใช้ชื่อผู้ส่งของคุณได้ (คุณต้องลงทะเบียนชื่อก่อน) เชื่อถือได้สำหรับการแจ้งเตือน",
|
||||||
|
promosmsTypeSpeed: "SMS SPEED - ลำดับความสำคัญสูงสุดในระบบ รวดเร็วและเชื่อถือได้ แต่มีค่าใช้จ่ายสูง (ประมาณสองเท่าของราคาเต็ม SMS)",
|
||||||
|
promosmsPhoneNumber: "หมายเลขโทรศัพท์ (สำหรับผู้รับโปแลนด์ คุณสามารถข้ามรหัสพื้นที่ได้)",
|
||||||
|
promosmsSMSSender: "ชื่อผู้ส่ง SMS : ชื่อที่ลงทะเบียนล่วงหน้าหรือหนึ่งในค่าเริ่มต้น: InfoSMS, ข้อมูล SMS, MaxSMS, INFO, SMS",
|
||||||
|
"Feishu WebHookUrl": "Feishu WebHookURL",
|
||||||
|
matrixHomeserverURL: "URL ของโฮมเซิร์ฟเวอร์ (พร้อม http(s):// และพอร์ตเสริม)",
|
||||||
|
"Internal Room Id": "รหัสห้องภายใน",
|
||||||
|
matrixDesc1: "คุณค้นหารหัสห้องภายในได้โดยดูในส่วนขั้นสูงของการตั้งค่าห้องในไคลเอ็นต์ Matrix มันควรจะมีลักษณะเช่น !PMdRCpsIfLwsfjIye6:kiznick.server.",
|
||||||
|
matrixDesc2: "ขอแนะนำเป็นอย่างยิ่งให้คุณสร้างผู้ใช้ใหม่และอย่าใช้โทเค็นการเข้าถึงของผู้ใช้ Matrix ของคุณเอง เนื่องจากจะทำให้สามารถเข้าถึงบัญชีของคุณและห้องทั้งหมดที่คุณเข้าร่วมได้อย่างเต็มที่ ให้สร้างผู้ใช้ใหม่และเชิญเฉพาะห้องที่คุณต้องการรับการแจ้งเตือนแทน คุณสามารถรับโทเค็นเพื่อการเข้าถึงได้โดยเรียกใช้ {0}",
|
||||||
|
Method: "วิธี",
|
||||||
|
Body: "เนื้อหา",
|
||||||
|
Headers: "ส่วนหัว",
|
||||||
|
PushUrl: "Push URL",
|
||||||
|
HeadersInvalidFormat: "เนื้อหาคำขอส่วนหัวไม่ใช่ JSON ที่ถูกต้อง :",
|
||||||
|
BodyInvalidFormat: "เนื้อหาคำขอไม่ใช่ JSON ที่ถูกต้อง : ",
|
||||||
|
"Monitor History": "ประวัติมอนิเตอร์",
|
||||||
|
clearDataOlderThan: "เก็บข้อมูลมอนิเตอร์ {0} วัน",
|
||||||
|
PasswordsDoNotMatch: "รหัสผ่านไม่ตรงกัน",
|
||||||
|
records: "บันทึก",
|
||||||
|
"One record": "หนึ่งบันทึก",
|
||||||
|
steamApiKeyDescription: "สำหรับการมอนิเตอร์ Steam Game Server คุณต้องมี Steam Web-API key, คุณสามารถรสมัครได้จากที่นี่ : ",
|
||||||
|
"Current User": "ผู้ใช้ปัจจุบัน",
|
||||||
|
topic: "หัวข้อ",
|
||||||
|
topicExplanation: "MQTT หัวข้อที่จะมอนิเตอร์",
|
||||||
|
successMessage: "ข้อความที่จะถือว่าประสบความสำเร็จ",
|
||||||
|
successMessageExplanation: "MQTT ข้อความที่จะถือว่าประสบความสำเร็จ",
|
||||||
|
recent: "ล่าสุด",
|
||||||
|
Done: "สำเร็จ",
|
||||||
|
Info: "ข้อมูล",
|
||||||
|
Security: "ความปลอดภัย",
|
||||||
|
"Steam API Key": "Steam API Key",
|
||||||
|
"Shrink Database": "ย่อฐานข้อมูล",
|
||||||
|
"Pick a RR-Type...": "เลือกชนิด DNS Record",
|
||||||
|
"Pick Accepted Status Codes...": "เลือกสถานะที่ยอมรับ...",
|
||||||
|
Default: "ค่าเริ่มต้น",
|
||||||
|
"HTTP Options": "ตัวเลือก HTTP",
|
||||||
|
"Create Incident": "สร้างเหตุการณ์",
|
||||||
|
Title: "หัวข้อ",
|
||||||
|
Content: "เนื้อหา",
|
||||||
|
Style: "สไตล์",
|
||||||
|
info: "ข้อมูล",
|
||||||
|
warning: "แจ้งเตือน",
|
||||||
|
danger: "อันตราย",
|
||||||
|
primary: "หลัก",
|
||||||
|
light: "สว่าง",
|
||||||
|
dark: "มืด",
|
||||||
|
Post: "โพสต์",
|
||||||
|
"Please input title and content": "กรุณาใส่ชื่อและเนื้อหา",
|
||||||
|
Created: "สร้าง",
|
||||||
|
"Last Updated": "อัพเดทล่าสุด",
|
||||||
|
Unpin: "เลิกตรึง",
|
||||||
|
"Switch to Light Theme": "เปลี่ยนเป็นแบบสว่าง",
|
||||||
|
"Switch to Dark Theme": "เปลี่ยนเป็นแบบมืด",
|
||||||
|
"Show Tags": "แสดงแท็ก",
|
||||||
|
"Hide Tags": "ซ่อนแท็ก",
|
||||||
|
Description: "รายละเอียด",
|
||||||
|
"No monitors available.": "ไม่มีมอนิเตอร์ที่สามารถใช้งานได้",
|
||||||
|
"Add one": "เพิ่ม",
|
||||||
|
"No Monitors": "ไม่มีมอนิเตอร์",
|
||||||
|
"Untitled Group": "กลุ่มที่ไม่มีชื่อ",
|
||||||
|
Services: "บริการ",
|
||||||
|
Discard: "ทิ้ง",
|
||||||
|
Cancel: "ยกเลิก",
|
||||||
|
"Powered by": "ขับเคลื่อนโดย",
|
||||||
|
shrinkDatabaseDescription: "ทริกเกอร์ฐานข้อมูล VACUUM สำหรับ SQLite หากฐานข้อมูลของคุณถูกสร้างขึ้นหลังจาก 1.10.0 แสดงว่า AUTO_VACUUM เปิดใช้งานอยู่แล้วและไม่จำเป็นต้องดำเนินการนี้",
|
||||||
|
serwersms: "SerwerSMS.pl",
|
||||||
|
serwersmsAPIUser: "API Username (incl. webapi_ prefix)",
|
||||||
|
serwersmsAPIPassword: "API Password",
|
||||||
|
serwersmsPhoneNumber: "หมายเลขโทรศัพท์",
|
||||||
|
serwersmsSenderName: "ชื่อผู้ส่ง SMS (ลงทะเบียนผ่านหน้าควบคุม)",
|
||||||
|
stackfield: "Stackfield",
|
||||||
|
Customize: "ปรับแต่ง",
|
||||||
|
"Custom Footer": "ส่วนท้ายที่กำหนดเอง",
|
||||||
|
"Custom CSS": "CSS ที่กำหนดเอง",
|
||||||
|
smtpDkimSettings: "ตั้งค่า DKIM",
|
||||||
|
smtpDkimDesc: "โปรดดู Nodemailer DKIM {0} สำหรับการใช้งาน",
|
||||||
|
documentation: "เอกสาร",
|
||||||
|
smtpDkimDomain: "ชื่อโดเมน",
|
||||||
|
smtpDkimKeySelector: "Key Selector",
|
||||||
|
smtpDkimPrivateKey: "Private Key",
|
||||||
|
smtpDkimHashAlgo: "อัลกอริทึมแฮช (ไม่บังคับ)",
|
||||||
|
smtpDkimheaderFieldNames: "คีย์ส่วนหัวเพื่อลงชื่อ (ไม่บังคับ)",
|
||||||
|
smtpDkimskipFields: "Header Keys ไม่ต้องเซ็น (ไม่บังคับ)",
|
||||||
|
gorush: "Gorush",
|
||||||
|
alerta: "Alerta",
|
||||||
|
alertaApiEndpoint: "API Endpoint",
|
||||||
|
alertaEnvironment: "Environment",
|
||||||
|
alertaApiKey: "กุญแจ API",
|
||||||
|
alertaAlertState: "แจ้งเตือนสถานะ",
|
||||||
|
alertaRecoverState: "กู้คืนสถานะ",
|
||||||
|
deleteStatusPageMsg: "คุณแน่ใจหรือไม่ว่าต้องการลบหน้าสถานะนี้",
|
||||||
|
Proxies: "พร็อกซี",
|
||||||
|
default: "ค่าเริ่มต้น",
|
||||||
|
enabled: "เปิดใช้งาน",
|
||||||
|
setAsDefault: "ตั่งเป็นค่าเริ่มต้น",
|
||||||
|
deleteProxyMsg: "คุณแน่ใจหรือไม่ว่าต้องการลบพร็อกซีสำหรับมอนิเตอร์ทั้งหมด?",
|
||||||
|
proxyDescription: "พร็อกซีจะต้องตั้งค่าให้มอนิเตอร์เพื่อให้ใช้งานได้",
|
||||||
|
enableProxyDescription: "พร็อกซีนี้จะไม่ส่งผลต่อมอนิเตอร์จนกว่าจะเปิดใช้งาน คุณสามารถควบคุมการปิดใช้งานพร็อกซีชั่วคราวจากมอนิเตอร์ทั้งหมดได้โดยสถานะการเปิดใช้งาน",
|
||||||
|
setAsDefaultProxyDescription: "พร็อกซีนี้จะถูกเปิดโดนค่าเริ่มต้นสำหรับมอนิเตอร์ใหม่, คุณสามารถปิดการแจ้งเตือนสำหรับแต่ละมอนิเตอร์ได้",
|
||||||
|
"Certificate Chain": "ห่วงโซ่ใบรับรอง",
|
||||||
|
Valid: "ถูกต้อง",
|
||||||
|
Invalid: "ไม่ถูกต้อง",
|
||||||
|
AccessKeyId: "กุญแจสิทธิ ID",
|
||||||
|
SecretAccessKey: "กุญแจสิทธิ Secret",
|
||||||
|
PhoneNumbers: "PhoneNumbers",
|
||||||
|
TemplateCode: "รหัสเทมเพลต",
|
||||||
|
SignName: "ป้ายชื่อ",
|
||||||
|
"Sms template must contain parameters: ": "เทมเพลต SMS ต้องมีพารามิเตอร์ : ",
|
||||||
|
"Bark Endpoint": "Bark Endpoint",
|
||||||
|
WebHookUrl: "WebHookUrl",
|
||||||
|
SecretKey: "SecretKey",
|
||||||
|
"For safety, must use secret key": "เพื่อความปลอดภัย จำเป็นต้องตั้งค่ากุญแจการเข้าถึง",
|
||||||
|
"Device Token": "Device Token",
|
||||||
|
Platform: "แพลตฟอร์ม",
|
||||||
|
iOS: "iOS",
|
||||||
|
Android: "Android",
|
||||||
|
Huawei: "Huawei",
|
||||||
|
High: "สูง",
|
||||||
|
Retry: "ลองใหม่",
|
||||||
|
Topic: "หัวข้อ",
|
||||||
|
"WeCom Bot Key": "WeCom Bot Key",
|
||||||
|
"Setup Proxy": "ติดตั้งพร็อกซี่",
|
||||||
|
"Proxy Protocol": "โปรโตคอลพร็อกซี่",
|
||||||
|
"Proxy Server": "พร็อกซีเซิร์ฟ",
|
||||||
|
"Proxy server has authentication": "พร็อกซีเซิร์ฟเวอร์มีการตรวจสอบสิทธิ์",
|
||||||
|
User: "ผู้ใช้",
|
||||||
|
Installed: "ติดตั้งแล้ว",
|
||||||
|
"Not installed": "ไม่ได้ติดตั้ง",
|
||||||
|
Running: "กำลังทำงาน",
|
||||||
|
"Not running": "ไม่ได้ทำงาน",
|
||||||
|
"Remove Token": "ลบกุญแจ",
|
||||||
|
Start: "เริ่ม",
|
||||||
|
Stop: "หยุด",
|
||||||
|
"Uptime Kuma": "Uptime Kuma",
|
||||||
|
"Add New Status Page": "เพิ่มหน้าสถานะใหม่",
|
||||||
|
Slug: "ชื่อ",
|
||||||
|
"Accept characters:": "ตัวอักษรที่ใช้งานได้ :",
|
||||||
|
startOrEndWithOnly: "เริ่มหรือจบด้วย {0} เท่านั้น",
|
||||||
|
"No consecutive dashes": "ไม่มีขีดกลางติดต่อกัน",
|
||||||
|
Next: "ต่อไป",
|
||||||
|
"The slug is already taken. Please choose another slug.": "ชื่อนี้ถูกใช้งานไปแล้ว กรุณาใช้ชื่ออื่น",
|
||||||
|
"No Proxy": "ไม่มีพร็อกซี่",
|
||||||
|
"HTTP Basic Auth": "HTTP Basic Auth",
|
||||||
|
"New Status Page": "หน้าสถานะใหม่",
|
||||||
|
"Page Not Found": "ไม่พบหน้านี้",
|
||||||
|
"Reverse Proxy": "พร็อกซีย้อนกลับ",
|
||||||
|
Backup: "สำรอง",
|
||||||
|
About: "เกี่ยวกับ",
|
||||||
|
wayToGetCloudflaredURL: "(ดาวโหลด cloudflared จาก {0})",
|
||||||
|
cloudflareWebsite: "เว็บไซต์ Cloudflare",
|
||||||
|
"Message:": "ข้อความ :",
|
||||||
|
"Don't know how to get the token? Please read the guide:": "ไม่รู้วิธีการรับกุญแจ?, กรุณาอ่านคู่มือ",
|
||||||
|
"The current connection may be lost if you are currently connecting via Cloudflare Tunnel. Are you sure want to stop it? Type your current password to confirm it.": "การเชื่อมต่อปัจุบันอาจขาดหายหากคุณกำลังเชื่อมต่อ Cloudflare Tunnel คุณแน่ใจหรือไม่ที่จะหยุด, พิมรหัสผ่านของคุณเพื่อยืนยัน",
|
||||||
|
"Other Software": "ซอฟต์แวร์อื่น ๆ ",
|
||||||
|
"For example: nginx, Apache and Traefik.": "เช่น: nginx, Apache และ Traefik",
|
||||||
|
"Please read": "กรุณาอ่าน",
|
||||||
|
"Subject:": "เรื่อง :",
|
||||||
|
"Valid To:": "ถูกต้องถึง :",
|
||||||
|
"Days Remaining:": "จำนวนวันที่เหลือ :",
|
||||||
|
"Issuer:": "ผู้ออก :",
|
||||||
|
"Fingerprint:": "ลายนิ้วมือ :",
|
||||||
|
"No status pages": "ไม่มีหน้าสถานะ",
|
||||||
|
"Domain Name Expiry Notification": "แจ้งเตือนการหมดอายุโดเมน",
|
||||||
|
Proxy: "Proxy",
|
||||||
|
"Date Created": "วันที่สร้าง",
|
||||||
|
onebotHttpAddress: "ที่อยู่ HTTP OneBot ",
|
||||||
|
onebotMessageType: "ชนิดข้อความ OneBot",
|
||||||
|
onebotGroupMessage: "กลุ่ม",
|
||||||
|
onebotPrivateMessage: "ส่วนตัว",
|
||||||
|
onebotUserOrGroupId: "กลุ่ม / ไอดีผู้ใช้",
|
||||||
|
onebotSafetyTips: "เพื่อความปลอดภัย จำเป็นต้องตั้งค่ากุญแจการเข้าถึง",
|
||||||
|
"PushDeer Key": "กุญแจ PushDeer",
|
||||||
|
"Footer Text": "ข้อความส่วนท้าย",
|
||||||
|
"Show Powered By": "แสดงข้อความ \"ขับเคลื่อนโดย\"",
|
||||||
|
"Domain Names": "Domain Names",
|
||||||
|
signedInDisp: "เข้าใช้งานในฐานะ {0}",
|
||||||
|
signedInDispDisabled: "ปิดการตรวจสอบสิทธิ์",
|
||||||
|
"Certificate Expiry Notification": "แจ้งเตือนการรับรองหมดอายุ",
|
||||||
|
"API Username": "API Username",
|
||||||
|
"API Key": "API Key",
|
||||||
|
"Recipient Number": "หมายเลขผู้รับ",
|
||||||
|
"From Name/Number": "จาก ชื่อ / หมายเลข",
|
||||||
|
"Leave blank to use a shared sender number.": "ไม่ต้องกรอกเพื่อใช้ชื่อผู้ส่งร่วมกัน",
|
||||||
|
"Octopush API Version": "Octopush API Version",
|
||||||
|
"Legacy Octopush-DM": "Legacy Octopush-DM",
|
||||||
|
endpoint: "endpoint",
|
||||||
|
octopushAPIKey: "\"API key\" จากข้อมูลรับรอง HTTP API ในแผงควบคุม",
|
||||||
|
octopushLogin: "\"Login\" จากข้อมูลรับรอง HTTP API ในแผงควบคุม",
|
||||||
|
promosmsLogin: "API Login Name",
|
||||||
|
promosmsPassword: "API Password",
|
||||||
|
"pushoversounds pushover": "Pushover (default)",
|
||||||
|
"pushoversounds bike": "Bike",
|
||||||
|
"pushoversounds bugle": "Bugle",
|
||||||
|
"pushoversounds cashregister": "Cash Register",
|
||||||
|
"pushoversounds classical": "Classical",
|
||||||
|
"pushoversounds cosmic": "Cosmic",
|
||||||
|
"pushoversounds falling": "Falling",
|
||||||
|
"pushoversounds gamelan": "Gamelan",
|
||||||
|
"pushoversounds incoming": "Incoming",
|
||||||
|
"pushoversounds intermission": "Intermission",
|
||||||
|
"pushoversounds magic": "Magic",
|
||||||
|
"pushoversounds mechanical": "Mechanical",
|
||||||
|
"pushoversounds pianobar": "Piano Bar",
|
||||||
|
"pushoversounds siren": "Siren",
|
||||||
|
"pushoversounds spacealarm": "Space Alarm",
|
||||||
|
"pushoversounds tugboat": "Tug Boat",
|
||||||
|
"pushoversounds alien": "Alien Alarm (long)",
|
||||||
|
"pushoversounds climb": "Climb (long)",
|
||||||
|
"pushoversounds persistent": "Persistent (long)",
|
||||||
|
"pushoversounds echo": "Pushover Echo (long)",
|
||||||
|
"pushoversounds updown": "Up Down (long)",
|
||||||
|
"pushoversounds vibrate": "Vibrate Only",
|
||||||
|
"pushoversounds none": "None (silent)",
|
||||||
|
pushyAPIKey: "Secret API Key",
|
||||||
|
pushyToken: "Device token",
|
||||||
|
"Show update if available": "แสดงการอัปเดตถ้ามี",
|
||||||
|
"Also check beta release": "ตรวจสอบรุ่นเบต้า",
|
||||||
|
"Using a Reverse Proxy?": "ใช้ Reverse Proxy?",
|
||||||
|
"Check how to config it for WebSocket": "ตรวจสอบวิธีการตั้งค่าสำหรับ WebSocket",
|
||||||
|
"Steam Game Server": "Steam Game Server",
|
||||||
|
"Most likely causes:": "สาเหตุที่เป็นไปได้มากที่สุด :",
|
||||||
|
"The resource is no longer available.": "ทรัพยากรไม่สามารถใช้งานได้อีกต่อไป",
|
||||||
|
"There might be a typing error in the address.": "อาจมีข้อผิดพลาดในการพิมพ์ที่อยู่",
|
||||||
|
"What you can try:": "สิ่งที่คุณสามารถลอง :",
|
||||||
|
"Retype the address.": "พิมพ์ที่อยู่อีกครั้ง",
|
||||||
|
"Go back to the previous page.": "กลับไปที่หน้าก่อนหน้า",
|
||||||
|
"Coming Soon": "เร็ว ๆ นี้",
|
||||||
|
wayToGetClickSendSMSToken: "คุณสามารถรับ API Username และ API Key ได้จาก {0}",
|
||||||
|
};
|
Loading…
Reference in new issue