# Conflicts: # package-lock.json # package.jsonpull/1598/head
commit
f570d41142
@ -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
@ -1,7 +1,20 @@
|
||||
const args = require("args-parser")(process.argv);
|
||||
const demoMode = args["demo"] || false;
|
||||
|
||||
const badgeConstants = {
|
||||
naColor: "#999",
|
||||
defaultUpColor: "#66c20a",
|
||||
defaultDownColor: "#c2290a",
|
||||
defaultPingColor: "blue", // as defined by badge-maker / shields.io
|
||||
defaultStyle: "flat",
|
||||
defaultPingValueSuffix: "ms",
|
||||
defaultPingLabelSuffix: "h",
|
||||
defaultUptimeValueSuffix: "%",
|
||||
defaultUptimeLabelSuffix: "h",
|
||||
};
|
||||
|
||||
module.exports = {
|
||||
args,
|
||||
demoMode
|
||||
demoMode,
|
||||
badgeConstants,
|
||||
};
|
||||
|
@ -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,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