mirror of
https://github.com/louislam/uptime-kuma.git
synced 2024-10-30 11:10:40 +00:00
Merge branch 'master' into kometchtech_patch-1
This commit is contained in:
commit
3b0191210b
14 changed files with 1198 additions and 620 deletions
|
@ -2,6 +2,13 @@
|
||||||
FROM node:14-alpine3.12 AS release
|
FROM node:14-alpine3.12 AS release
|
||||||
WORKDIR /app
|
WORKDIR /app
|
||||||
|
|
||||||
|
# split the sqlite install here, so that it can caches the arm prebuilt
|
||||||
|
RUN apk add --no-cache --virtual .build-deps make g++ python3 python3-dev git && \
|
||||||
|
ln -s /usr/bin/python3 /usr/bin/python && \
|
||||||
|
npm install mapbox/node-sqlite3#593c9d && \
|
||||||
|
apk del .build-deps && \
|
||||||
|
rm -f /usr/bin/python
|
||||||
|
|
||||||
# Install apprise
|
# Install apprise
|
||||||
RUN apk add --no-cache python3 py3-cryptography py3-pip py3-six py3-yaml py3-click py3-markdown py3-requests py3-requests-oauthlib
|
RUN apk add --no-cache python3 py3-cryptography py3-pip py3-six py3-yaml py3-click py3-markdown py3-requests py3-requests-oauthlib
|
||||||
RUN pip3 --no-cache-dir install apprise && \
|
RUN pip3 --no-cache-dir install apprise && \
|
||||||
|
|
|
@ -212,8 +212,8 @@ if (type == "local") {
|
||||||
bash("check=$(docker info)");
|
bash("check=$(docker info)");
|
||||||
|
|
||||||
bash("if [[ \"$check\" == *\"Is the docker daemon running\"* ]]; then
|
bash("if [[ \"$check\" == *\"Is the docker daemon running\"* ]]; then
|
||||||
echo \"Error: docker is not running\"
|
\"echo\" \"Error: docker is not running\"
|
||||||
exit 1
|
\"exit\" \"1\"
|
||||||
fi");
|
fi");
|
||||||
|
|
||||||
if ("$3" != "") {
|
if ("$3" != "") {
|
||||||
|
|
3
extra/update-language-files/.gitignore
vendored
Normal file
3
extra/update-language-files/.gitignore
vendored
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
package-lock.json
|
||||||
|
test.js
|
||||||
|
languages/
|
77
extra/update-language-files/index.js
Normal file
77
extra/update-language-files/index.js
Normal file
|
@ -0,0 +1,77 @@
|
||||||
|
// Need to use es6 to read language files
|
||||||
|
|
||||||
|
import fs from "fs";
|
||||||
|
import path from "path";
|
||||||
|
import util from "util";
|
||||||
|
|
||||||
|
// https://stackoverflow.com/questions/13786160/copy-folder-recursively-in-node-js
|
||||||
|
/**
|
||||||
|
* Look ma, it's cp -R.
|
||||||
|
* @param {string} src The path to the thing to copy.
|
||||||
|
* @param {string} dest The path to the new copy.
|
||||||
|
*/
|
||||||
|
const copyRecursiveSync = function (src, dest) {
|
||||||
|
let exists = fs.existsSync(src);
|
||||||
|
let stats = exists && fs.statSync(src);
|
||||||
|
let isDirectory = exists && stats.isDirectory();
|
||||||
|
if (isDirectory) {
|
||||||
|
fs.mkdirSync(dest);
|
||||||
|
fs.readdirSync(src).forEach(function (childItemName) {
|
||||||
|
copyRecursiveSync(path.join(src, childItemName),
|
||||||
|
path.join(dest, childItemName));
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
fs.copyFileSync(src, dest);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
console.log(process.argv)
|
||||||
|
const baseLangCode = process.argv[2] || "zh-HK";
|
||||||
|
console.log("Base Lang: " + baseLangCode);
|
||||||
|
fs.rmdirSync("./languages", { recursive: true });
|
||||||
|
copyRecursiveSync("../../src/languages", "./languages");
|
||||||
|
|
||||||
|
const en = (await import("./languages/en.js")).default;
|
||||||
|
const baseLang = (await import(`./languages/${baseLangCode}.js`)).default;
|
||||||
|
const files = fs.readdirSync("./languages");
|
||||||
|
console.log(files);
|
||||||
|
for (const file of files) {
|
||||||
|
if (file.endsWith(".js")) {
|
||||||
|
console.log("Processing " + file);
|
||||||
|
const lang = await import("./languages/" + file);
|
||||||
|
|
||||||
|
let obj;
|
||||||
|
|
||||||
|
if (lang.default) {
|
||||||
|
console.log("is js module");
|
||||||
|
obj = lang.default;
|
||||||
|
} else {
|
||||||
|
console.log("empty file");
|
||||||
|
obj = {
|
||||||
|
languageName: "<Your Language name in your language (not in English)>"
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
// En first
|
||||||
|
for (const key in en) {
|
||||||
|
if (! obj[key]) {
|
||||||
|
obj[key] = en[key];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Base second
|
||||||
|
for (const key in baseLang) {
|
||||||
|
if (! obj[key]) {
|
||||||
|
obj[key] = key;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const code = "export default " + util.inspect(obj, {
|
||||||
|
depth: null,
|
||||||
|
});
|
||||||
|
|
||||||
|
fs.writeFileSync(`../../src/languages/${file}`, code);
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fs.rmdirSync("./languages", { recursive: true });
|
12
extra/update-language-files/package.json
Normal file
12
extra/update-language-files/package.json
Normal file
|
@ -0,0 +1,12 @@
|
||||||
|
{
|
||||||
|
"name": "update-language-files",
|
||||||
|
"type": "module",
|
||||||
|
"version": "1.0.0",
|
||||||
|
"description": "",
|
||||||
|
"main": "index.js",
|
||||||
|
"scripts": {
|
||||||
|
"test": "echo \"Error: no test specified\" && exit 1"
|
||||||
|
},
|
||||||
|
"author": "",
|
||||||
|
"license": "ISC"
|
||||||
|
}
|
|
@ -176,8 +176,8 @@ else
|
||||||
fi
|
fi
|
||||||
check=$(docker info)
|
check=$(docker info)
|
||||||
if [[ "$check" == *"Is the docker daemon running"* ]]; then
|
if [[ "$check" == *"Is the docker daemon running"* ]]; then
|
||||||
echo "Error: docker is not running"
|
"echo" "Error: docker is not running"
|
||||||
exit 1
|
"exit" "1"
|
||||||
fi
|
fi
|
||||||
if [ "$3" != "" ]; then
|
if [ "$3" != "" ]; then
|
||||||
port="$3"
|
port="$3"
|
||||||
|
|
1574
package-lock.json
generated
1574
package-lock.json
generated
File diff suppressed because it is too large
Load diff
13
package.json
13
package.json
|
@ -1,6 +1,6 @@
|
||||||
{
|
{
|
||||||
"name": "uptime-kuma",
|
"name": "uptime-kuma",
|
||||||
"version": "1.5.0",
|
"version": "1.5.2",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"repository": {
|
"repository": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
|
@ -20,10 +20,11 @@
|
||||||
"update": "",
|
"update": "",
|
||||||
"build": "vite build",
|
"build": "vite build",
|
||||||
"vite-preview-dist": "vite preview --host",
|
"vite-preview-dist": "vite preview --host",
|
||||||
"build-docker": "docker buildx build --platform linux/amd64,linux/arm64,linux/arm/v7 -t louislam/uptime-kuma -t louislam/uptime-kuma:1 -t louislam/uptime-kuma:1.5.0 --target release . --push",
|
"build-docker": "docker buildx build --platform linux/amd64,linux/arm64,linux/arm/v7 -t louislam/uptime-kuma -t louislam/uptime-kuma:1 -t louislam/uptime-kuma:1.5.2 --target release . --push",
|
||||||
"build-docker-nightly": "docker buildx build --platform linux/amd64,linux/arm64,linux/arm/v7 -t louislam/uptime-kuma:nightly --target nightly . --push",
|
"build-docker-nightly": "docker buildx build --platform linux/amd64,linux/arm64,linux/arm/v7 -t louislam/uptime-kuma:nightly --target nightly . --push",
|
||||||
"build-docker-nightly-amd64": "docker buildx build --platform linux/amd64 -t louislam/uptime-kuma:nightly-amd64 --target nightly . --push --progress plain",
|
"build-docker-nightly-amd64": "docker buildx build --platform linux/amd64 -t louislam/uptime-kuma:nightly-amd64 --target nightly . --push --progress plain",
|
||||||
"setup": "git checkout 1.5.0 && npm install --legacy-peer-deps && npm run build && npm prune",
|
"build-docker-1.5.0-debian": "docker buildx build --platform linux/amd64,linux/arm64,linux/arm/v7 -t louislam/uptime-kuma:1.5.0-debian --target release . --push",
|
||||||
|
"setup": "git checkout 1.5.2 && npm install --legacy-peer-deps && node node_modules/esbuild/install.js && npm run build && npm prune",
|
||||||
"update-version": "node extra/update-version.js",
|
"update-version": "node extra/update-version.js",
|
||||||
"mark-as-nightly": "node extra/mark-as-nightly.js",
|
"mark-as-nightly": "node extra/mark-as-nightly.js",
|
||||||
"reset-password": "node extra/reset-password.js",
|
"reset-password": "node extra/reset-password.js",
|
||||||
|
@ -32,15 +33,14 @@
|
||||||
"test-install-script-alpine3": "npm run compile-install-script && docker build --progress plain -f test/test_install_script/alpine3.dockerfile .",
|
"test-install-script-alpine3": "npm run compile-install-script && docker build --progress plain -f test/test_install_script/alpine3.dockerfile .",
|
||||||
"test-install-script-ubuntu": "npm run compile-install-script && docker build --progress plain -f test/test_install_script/ubuntu.dockerfile .",
|
"test-install-script-ubuntu": "npm run compile-install-script && docker build --progress plain -f test/test_install_script/ubuntu.dockerfile .",
|
||||||
"test-install-script-ubuntu1604": "npm run compile-install-script && docker build --progress plain -f test/test_install_script/ubuntu1604.dockerfile .",
|
"test-install-script-ubuntu1604": "npm run compile-install-script && docker build --progress plain -f test/test_install_script/ubuntu1604.dockerfile .",
|
||||||
"test-install-script-debian": "npm run compile-install-script && docker build --progress plain -f test/test_install_script/debian.dockerfile .",
|
"simple-dns-server": "node extra/simple-dns-server.js",
|
||||||
"simple-dns-server": "node extra/simple-dns-server.js"
|
"update-language-files": "cd extra/update-language-files && node index.js %npm_config_base_lang% && eslint ../../src/languages/**.js --fix"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@fortawesome/fontawesome-svg-core": "^1.2.36",
|
"@fortawesome/fontawesome-svg-core": "^1.2.36",
|
||||||
"@fortawesome/free-regular-svg-icons": "^5.15.4",
|
"@fortawesome/free-regular-svg-icons": "^5.15.4",
|
||||||
"@fortawesome/free-solid-svg-icons": "^5.15.4",
|
"@fortawesome/free-solid-svg-icons": "^5.15.4",
|
||||||
"@fortawesome/vue-fontawesome": "^3.0.0-4",
|
"@fortawesome/vue-fontawesome": "^3.0.0-4",
|
||||||
"@louislam/better-sqlite3-with-prebuilds": "^7.4.3",
|
|
||||||
"@popperjs/core": "^2.9.3",
|
"@popperjs/core": "^2.9.3",
|
||||||
"args-parser": "^1.3.0",
|
"args-parser": "^1.3.0",
|
||||||
"axios": "^0.21.1",
|
"axios": "^0.21.1",
|
||||||
|
@ -63,6 +63,7 @@
|
||||||
"redbean-node": "0.1.2",
|
"redbean-node": "0.1.2",
|
||||||
"socket.io": "^4.1.3",
|
"socket.io": "^4.1.3",
|
||||||
"socket.io-client": "^4.1.3",
|
"socket.io-client": "^4.1.3",
|
||||||
|
"sqlite3": "github:mapbox/node-sqlite3#593c9d",
|
||||||
"tcp-ping": "^0.1.1",
|
"tcp-ping": "^0.1.1",
|
||||||
"v-pagination-3": "^0.1.6",
|
"v-pagination-3": "^0.1.6",
|
||||||
"vue": "^3.2.2",
|
"vue": "^3.2.2",
|
||||||
|
|
|
@ -13,9 +13,6 @@ class Database {
|
||||||
static async connect() {
|
static async connect() {
|
||||||
const acquireConnectionTimeout = 120 * 1000;
|
const acquireConnectionTimeout = 120 * 1000;
|
||||||
|
|
||||||
R.useBetterSQLite3 = true;
|
|
||||||
R.betterSQLite3Options.timeout = acquireConnectionTimeout;
|
|
||||||
|
|
||||||
R.setup("sqlite", {
|
R.setup("sqlite", {
|
||||||
filename: Database.path,
|
filename: Database.path,
|
||||||
useNullAsDefault: true,
|
useNullAsDefault: true,
|
||||||
|
@ -124,11 +121,8 @@ class Database {
|
||||||
return statement !== "";
|
return statement !== "";
|
||||||
})
|
})
|
||||||
|
|
||||||
// Use better-sqlite3 to run, prevent "This statement does not return data. Use run() instead"
|
|
||||||
const db = await this.getBetterSQLite3Database();
|
|
||||||
|
|
||||||
for (let statement of statements) {
|
for (let statement of statements) {
|
||||||
db.prepare(statement).run();
|
await R.exec(statement);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
10
src/languages/README.md
Normal file
10
src/languages/README.md
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
# How to translate
|
||||||
|
|
||||||
|
1. Fork this repo.
|
||||||
|
2. Create a language file. (e.g. zh-TW.js) The filename must be ISO language code: http://www.lingoes.net/en/translator/langcode.htm
|
||||||
|
3. `npm run update-language-files --base-lang=de-DE`
|
||||||
|
6. Your language file should be filled in. You can translate now.
|
||||||
|
7. Make a pull request when you have done.
|
||||||
|
|
||||||
|
If you do not have programming skills, let me know in Issue section. I will assist you. 😏
|
||||||
|
|
|
@ -93,8 +93,8 @@ export default {
|
||||||
"No Monitors, please": "Keine Monitore, bitte",
|
"No Monitors, please": "Keine Monitore, bitte",
|
||||||
"add one": "hinzufügen",
|
"add one": "hinzufügen",
|
||||||
"Notification Type": "Benachrichtigungs Dienst",
|
"Notification Type": "Benachrichtigungs Dienst",
|
||||||
"Email": "E-Mail",
|
Email: "E-Mail",
|
||||||
"Test": "Test",
|
Test: "Test",
|
||||||
"Certificate Info": "Zertifikatsinfo",
|
"Certificate Info": "Zertifikatsinfo",
|
||||||
keywordDescription: "Suche nach einen Schlüsselwort in einer schlichten HTML oder JSON Ausgabe. Bitte beachte, es wird in der Groß-/Kleinschreibung unterschieden.",
|
keywordDescription: "Suche nach einen Schlüsselwort in einer schlichten HTML oder JSON Ausgabe. Bitte beachte, es wird in der Groß-/Kleinschreibung unterschieden.",
|
||||||
deleteMonitorMsg: "Bist du sicher das du den Monitor löschen möchtest?",
|
deleteMonitorMsg: "Bist du sicher das du den Monitor löschen möchtest?",
|
||||||
|
@ -104,4 +104,5 @@ export default {
|
||||||
rrtypeDescription: "Wähle den RR-Typ aus, welchen du überwachen möchtest.",
|
rrtypeDescription: "Wähle den RR-Typ aus, welchen du überwachen möchtest.",
|
||||||
"Last Result": "Letztes Ergebnis",
|
"Last Result": "Letztes Ergebnis",
|
||||||
pauseMonitorMsg: "Bist du sicher das du den Monitor pausieren möchtest?",
|
pauseMonitorMsg: "Bist du sicher das du den Monitor pausieren möchtest?",
|
||||||
|
"Resource Record Type": "Resource Record Type"
|
||||||
}
|
}
|
||||||
|
|
|
@ -16,4 +16,93 @@ export default {
|
||||||
resoverserverDescription: "Cloudflare is the default server, you can change the resolver server anytime.",
|
resoverserverDescription: "Cloudflare is the default server, you can change the resolver server anytime.",
|
||||||
rrtypeDescription: "Select the RR-Type you want to monitor",
|
rrtypeDescription: "Select the RR-Type you want to monitor",
|
||||||
pauseMonitorMsg: "Are you sure want to pause?",
|
pauseMonitorMsg: "Are you sure want to pause?",
|
||||||
|
Settings: "Settings",
|
||||||
|
Dashboard: "Dashboard",
|
||||||
|
"New Update": "New Update",
|
||||||
|
Language: "Language",
|
||||||
|
Appearance: "Appearance",
|
||||||
|
Theme: "Theme",
|
||||||
|
General: "General",
|
||||||
|
Version: "Version",
|
||||||
|
"Check Update On GitHub": "Check Update On GitHub",
|
||||||
|
List: "List",
|
||||||
|
Add: "Add",
|
||||||
|
"Add New Monitor": "Add New Monitor",
|
||||||
|
"Quick Stats": "Quick Stats",
|
||||||
|
Up: "Up",
|
||||||
|
Down: "Down",
|
||||||
|
Pending: "Pending",
|
||||||
|
Unknown: "Unknown",
|
||||||
|
Pause: "Pause",
|
||||||
|
Name: "Name",
|
||||||
|
Status: "Status",
|
||||||
|
DateTime: "DateTime",
|
||||||
|
Message: "Message",
|
||||||
|
"No important events": "No important events",
|
||||||
|
Resume: "Resume",
|
||||||
|
Edit: "Edit",
|
||||||
|
Delete: "Delete",
|
||||||
|
Current: "Current",
|
||||||
|
Uptime: "Uptime",
|
||||||
|
"Cert Exp.": "Cert Exp.",
|
||||||
|
days: "days",
|
||||||
|
day: "day",
|
||||||
|
"-day": "-day",
|
||||||
|
hour: "hour",
|
||||||
|
"-hour": "-hour",
|
||||||
|
Response: "Response",
|
||||||
|
Ping: "Ping",
|
||||||
|
"Monitor Type": "Monitor Type",
|
||||||
|
Keyword: "Keyword",
|
||||||
|
"Friendly Name": "Friendly Name",
|
||||||
|
URL: "URL",
|
||||||
|
Hostname: "Hostname",
|
||||||
|
Port: "Port",
|
||||||
|
"Heartbeat Interval": "Heartbeat Interval",
|
||||||
|
Retries: "Retries",
|
||||||
|
Advanced: "Advanced",
|
||||||
|
"Upside Down Mode": "Upside Down Mode",
|
||||||
|
"Max. Redirects": "Max. Redirects",
|
||||||
|
"Accepted Status Codes": "Accepted Status Codes",
|
||||||
|
Save: "Save",
|
||||||
|
Notifications: "Notifications",
|
||||||
|
"Not available, please setup.": "Not available, please setup.",
|
||||||
|
"Setup Notification": "Setup Notification",
|
||||||
|
Light: "Light",
|
||||||
|
Dark: "Dark",
|
||||||
|
Auto: "Auto",
|
||||||
|
"Theme - Heartbeat Bar": "Theme - Heartbeat Bar",
|
||||||
|
Normal: "Normal",
|
||||||
|
Bottom: "Bottom",
|
||||||
|
None: "None",
|
||||||
|
Timezone: "Timezone",
|
||||||
|
"Search Engine Visibility": "Search Engine Visibility",
|
||||||
|
"Allow indexing": "Allow indexing",
|
||||||
|
"Discourage search engines from indexing site": "Discourage search engines from indexing site",
|
||||||
|
"Change Password": "Change Password",
|
||||||
|
"Current Password": "Current Password",
|
||||||
|
"New Password": "New Password",
|
||||||
|
"Repeat New Password": "Repeat New Password",
|
||||||
|
"Update Password": "Update Password",
|
||||||
|
"Disable Auth": "Disable Auth",
|
||||||
|
"Enable Auth": "Enable Auth",
|
||||||
|
Logout: "Logout",
|
||||||
|
Leave: "Leave",
|
||||||
|
"I understand, please disable": "I understand, please disable",
|
||||||
|
Confirm: "Confirm",
|
||||||
|
Yes: "Yes",
|
||||||
|
No: "No",
|
||||||
|
Username: "Username",
|
||||||
|
Password: "Password",
|
||||||
|
"Remember me": "Remember me",
|
||||||
|
Login: "Login",
|
||||||
|
"No Monitors, please": "No Monitors, please",
|
||||||
|
"add one": "add one",
|
||||||
|
"Notification Type": "Notification Type",
|
||||||
|
Email: "Email",
|
||||||
|
Test: "Test",
|
||||||
|
"Certificate Info": "Certificate Info",
|
||||||
|
"Resolver Server": "Resolver Server",
|
||||||
|
"Resource Record Type": "Resource Record Type",
|
||||||
|
"Last Result": "Last Result"
|
||||||
}
|
}
|
||||||
|
|
|
@ -93,8 +93,8 @@ export default {
|
||||||
"No Monitors, please": "Pas de monitor, veuillez ",
|
"No Monitors, please": "Pas de monitor, veuillez ",
|
||||||
"add one": "en ajouter un.",
|
"add one": "en ajouter un.",
|
||||||
"Notification Type": "Type de notification",
|
"Notification Type": "Type de notification",
|
||||||
"Email": "Email",
|
Email: "Email",
|
||||||
"Test": "Tester",
|
Test: "Tester",
|
||||||
keywordDescription: "Le mot clé sera cherché dans la réponse HTML/JSON reçue du site internet.",
|
keywordDescription: "Le mot clé sera cherché dans la réponse HTML/JSON reçue du site internet.",
|
||||||
"Certificate Info": "Des informations sur le certificat SSL",
|
"Certificate Info": "Des informations sur le certificat SSL",
|
||||||
deleteMonitorMsg: "Êtes-vous sûr de vouloir supprimer ce monitor ?",
|
deleteMonitorMsg: "Êtes-vous sûr de vouloir supprimer ce monitor ?",
|
||||||
|
@ -103,4 +103,6 @@ export default {
|
||||||
"Resource Record Type": "Type d'enregistrement DNS recherché",
|
"Resource Record Type": "Type d'enregistrement DNS recherché",
|
||||||
resoverserverDescription: "Le DNS de cloudflare est utilisé par défaut, mais vous pouvez le changer si vous le souhaitez.",
|
resoverserverDescription: "Le DNS de cloudflare est utilisé par défaut, mais vous pouvez le changer si vous le souhaitez.",
|
||||||
rrtypeDescription: "Veuillez séléctionner un type d'enregistrement DNS",
|
rrtypeDescription: "Veuillez séléctionner un type d'enregistrement DNS",
|
||||||
|
pauseMonitorMsg: "Are you sure want to pause?",
|
||||||
|
"Last Result": "Last Result"
|
||||||
}
|
}
|
||||||
|
|
|
@ -93,8 +93,8 @@ export default {
|
||||||
"No Monitors, please": "沒有監測器,請",
|
"No Monitors, please": "沒有監測器,請",
|
||||||
"add one": "新增",
|
"add one": "新增",
|
||||||
"Notification Type": "通知類型",
|
"Notification Type": "通知類型",
|
||||||
"Email": "電郵",
|
Email: "電郵",
|
||||||
"Test": "測試",
|
Test: "測試",
|
||||||
keywordDescription: "搜索 HTML 或 JSON 裡是否有出現關鍵字(注意英文大細階)",
|
keywordDescription: "搜索 HTML 或 JSON 裡是否有出現關鍵字(注意英文大細階)",
|
||||||
"Certificate Info": "憑證詳細資料",
|
"Certificate Info": "憑證詳細資料",
|
||||||
deleteMonitorMsg: "是否確定刪除這個監測器",
|
deleteMonitorMsg: "是否確定刪除這個監測器",
|
||||||
|
@ -103,4 +103,6 @@ export default {
|
||||||
"Resource Record Type": "DNS 記錄類型",
|
"Resource Record Type": "DNS 記錄類型",
|
||||||
resoverserverDescription: "預設值為 Cloudflare DNS 伺服器,你可以轉用其他 DNS 伺服器。",
|
resoverserverDescription: "預設值為 Cloudflare DNS 伺服器,你可以轉用其他 DNS 伺服器。",
|
||||||
rrtypeDescription: "請選擇 DNS 記錄類型",
|
rrtypeDescription: "請選擇 DNS 記錄類型",
|
||||||
|
pauseMonitorMsg: "Are you sure want to pause?",
|
||||||
|
"Last Result": "Last Result"
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue