Merge remote-tracking branch 'origin/master' into show-tags-in-status-page-monitor-select-list

# Conflicts:
#	src/pages/StatusPage.vue
pull/2752/head
Louis Lam 2 years ago
commit 9dd1b1ca0f

@ -26,6 +26,12 @@ body:
label: "📝 Describe your problem" label: "📝 Describe your problem"
description: "Please walk us through it step by step." description: "Please walk us through it step by step."
placeholder: "Describe what are you asking for..." placeholder: "Describe what are you asking for..."
- type: textarea
id: error-msg
validations:
required: false
attributes:
label: "📝 Error Message(s) or Log"
- type: input - type: input
id: uptime-kuma-version id: uptime-kuma-version
attributes: attributes:

@ -0,0 +1 @@
# This is a .gitignore style file for 'GrantBirki/json-yaml-validate' Action workflow

@ -0,0 +1,26 @@
name: json-yaml-validate
on:
push:
branches:
- master
pull_request:
branches:
- master
workflow_dispatch:
permissions:
contents: read
pull-requests: write # enable write permissions for pull request comments
jobs:
json-yaml-validate:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: json-yaml-validate
id: json-yaml-validate
uses: GrantBirki/json-yaml-validate@v1.3.0
with:
comment: "true" # enable comment mode
exclude_file: ".github/config/exclude.txt" # gitignore style file for exclusions

@ -0,0 +1,13 @@
-- You should not modify if this have pushed to Github, unless it does serious wrong with the db.
BEGIN TRANSACTION;
CREATE TABLE [api_key] (
[id] INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
[key] VARCHAR(255) NOT NULL,
[name] VARCHAR(255) NOT NULL,
[user_id] INTEGER NOT NULL,
[created_date] DATETIME DEFAULT (DATETIME('now')) NOT NULL,
[active] BOOLEAN DEFAULT 1 NOT NULL,
[expires] DATETIME DEFAULT NULL,
CONSTRAINT FK_user FOREIGN KEY ([user_id]) REFERENCES [user]([id]) ON DELETE CASCADE ON UPDATE CASCADE
);
COMMIT;

@ -0,0 +1,11 @@
-- You should not modify if this have pushed to Github, unless it does serious wrong with the db.
BEGIN TRANSACTION;
DROP TABLE maintenance_timeslot;
-- 999 characters. https://stackoverflow.com/questions/46134830/maximum-length-for-cron-job
ALTER TABLE maintenance ADD cron TEXT;
ALTER TABLE maintenance ADD timezone VARCHAR(255);
ALTER TABLE maintenance ADD duration INTEGER;
COMMIT;

@ -0,0 +1,13 @@
-- You should not modify if this have pushed to Github, unless it does serious wrong with the db.
BEGIN TRANSACTION;
ALTER TABLE monitor
ADD tls_ca TEXT default null;
ALTER TABLE monitor
ADD tls_cert TEXT default null;
ALTER TABLE monitor
ADD tls_key TEXT default null;
COMMIT;

@ -4,5 +4,5 @@ WORKDIR /app
# Install apprise, iputils for non-root ping, setpriv # Install apprise, iputils for non-root ping, setpriv
RUN apk add --no-cache iputils setpriv dumb-init python3 py3-cryptography py3-pip py3-six py3-yaml py3-click py3-markdown py3-requests py3-requests-oauthlib git && \ RUN apk add --no-cache iputils setpriv dumb-init python3 py3-cryptography py3-pip py3-six py3-yaml py3-click py3-markdown py3-requests py3-requests-oauthlib git && \
pip3 --no-cache-dir install apprise==1.2.1 && \ pip3 --no-cache-dir install apprise==1.3.0 && \
rm -rf /root/.cache rm -rf /root/.cache

@ -11,7 +11,7 @@ WORKDIR /app
RUN apt update && \ RUN apt update && \
apt --yes --no-install-recommends install python3 python3-pip python3-cryptography python3-six python3-yaml python3-click python3-markdown python3-requests python3-requests-oauthlib \ apt --yes --no-install-recommends install python3 python3-pip python3-cryptography python3-six python3-yaml python3-click python3-markdown python3-requests python3-requests-oauthlib \
sqlite3 iputils-ping util-linux dumb-init git && \ sqlite3 iputils-ping util-linux dumb-init git && \
pip3 --no-cache-dir install apprise==1.2.1 && \ pip3 --no-cache-dir install apprise==1.3.0 && \
rm -rf /var/lib/apt/lists/* && \ rm -rf /var/lib/apt/lists/* && \
apt --yes autoremove apt --yes autoremove

@ -43,10 +43,11 @@ const prompt = (query) => new Promise((resolve) => rl.question(query, resolve));
}); });
console.log(result.stdout + result.stderr); console.log(result.stdout + result.stderr);
/*
result = await ssh.execCommand("pm2 restart 1", { result = await ssh.execCommand("pm2 restart 1", {
cwd, cwd,
}); });
console.log(result.stdout + result.stderr); console.log(result.stdout + result.stderr);*/
} catch (e) { } catch (e) {
console.log(e); console.log(e);

@ -1,65 +0,0 @@
using System.IO;
using System.Reflection;
namespace UptimeKuma {
/**
* Current Directory using App location
*/
public class Directory {
private static string baseDir;
public static string FullPath(string path) {
return Path.Combine(GetBaseDir(), path);
}
public static string GetBaseDir() {
if (baseDir == null) {
baseDir = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
}
return baseDir;
}
public static bool Exists(string path) {
return System.IO.Directory.Exists(FullPath(path));
}
public static void Delete(string path, bool recursive) {
System.IO.Directory.Delete(FullPath(path), recursive);
}
public static void Move(string src, string dest) {
System.IO.Directory.Move(FullPath(src), FullPath(dest));
}
public static string[] GetDirectories(string path) {
return System.IO.Directory.GetDirectories(FullPath(path));
}
}
public class File {
private static string FullPath(string path) {
return Directory.FullPath(path);
}
public static bool Exists(string path) {
return System.IO.File.Exists(FullPath(path));
}
public static FileStream Create(string path) {
return System.IO.File.Create(FullPath(path));
}
public static string ReadAllText(string path) {
return System.IO.File.ReadAllText(FullPath(path));
}
public static void Delete(string path) {
System.IO.File.Delete(FullPath(path));
}
public static void WriteAllText(string path, string content) {
System.IO.File.WriteAllText(FullPath(path), content);
}
}
}

@ -8,6 +8,7 @@ using System.Net;
using System.Net.Sockets; using System.Net.Sockets;
using System.Reflection; using System.Reflection;
using System.Runtime.InteropServices; using System.Runtime.InteropServices;
using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
using System.Windows.Forms; using System.Windows.Forms;
using Microsoft.Win32; using Microsoft.Win32;
@ -21,6 +22,12 @@ namespace UptimeKuma {
/// </summary> /// </summary>
[STAThread] [STAThread]
static void Main(string[] args) { static void Main(string[] args) {
var cwd = Path.GetDirectoryName(Application.ExecutablePath);
if (cwd != null) {
Environment.CurrentDirectory = cwd;
}
Application.EnableVisualStyles(); Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false); Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new UptimeKumaApplicationContext()); Application.Run(new UptimeKumaApplicationContext());
@ -29,6 +36,8 @@ namespace UptimeKuma {
public class UptimeKumaApplicationContext : ApplicationContext public class UptimeKumaApplicationContext : ApplicationContext
{ {
private static Mutex mutex = null;
const string appName = "Uptime Kuma"; const string appName = "Uptime Kuma";
private NotifyIcon trayIcon; private NotifyIcon trayIcon;
@ -36,11 +45,20 @@ namespace UptimeKuma {
private MenuItem statusMenuItem; private MenuItem statusMenuItem;
private MenuItem runWhenStarts; private MenuItem runWhenStarts;
private MenuItem openMenuItem;
private RegistryKey registryKey = Registry.CurrentUser.OpenSubKey("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run", true); private RegistryKey registryKey = Registry.CurrentUser.OpenSubKey("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run", true);
public UptimeKumaApplicationContext() { public UptimeKumaApplicationContext() {
// Single instance only
bool createdNew;
mutex = new Mutex(true, appName, out createdNew);
if (!createdNew) {
return;
}
var startingText = "Starting server..."; var startingText = "Starting server...";
trayIcon = new NotifyIcon(); trayIcon = new NotifyIcon();
trayIcon.Text = startingText; trayIcon.Text = startingText;
@ -51,10 +69,13 @@ namespace UptimeKuma {
statusMenuItem = new MenuItem(startingText); statusMenuItem = new MenuItem(startingText);
statusMenuItem.Enabled = false; statusMenuItem.Enabled = false;
openMenuItem = new MenuItem("Open", Open);
openMenuItem.Enabled = false;
trayIcon.Icon = Icon.ExtractAssociatedIcon(Assembly.GetExecutingAssembly().Location); trayIcon.Icon = Icon.ExtractAssociatedIcon(Assembly.GetExecutingAssembly().Location);
trayIcon.ContextMenu = new ContextMenu(new MenuItem[] { trayIcon.ContextMenu = new ContextMenu(new MenuItem[] {
statusMenuItem, statusMenuItem,
new("Open", Open), openMenuItem,
//new("Debug Console", DebugConsole), //new("Debug Console", DebugConsole),
runWhenStarts, runWhenStarts,
new("Check for Update...", CheckForUpdate), new("Check for Update...", CheckForUpdate),
@ -125,6 +146,7 @@ namespace UptimeKuma {
try { try {
tcpClient.Connect("127.0.0.1", 3001); tcpClient.Connect("127.0.0.1", 3001);
statusMenuItem.Text = runningText; statusMenuItem.Text = runningText;
openMenuItem.Enabled = true;
trayIcon.Text = runningText; trayIcon.Text = runningText;
break; break;
} catch (Exception) { } catch (Exception) {

@ -160,7 +160,6 @@
<Compile Include="DownloadForm.Designer.cs"> <Compile Include="DownloadForm.Designer.cs">
<DependentUpon>DownloadForm.cs</DependentUpon> <DependentUpon>DownloadForm.cs</DependentUpon>
</Compile> </Compile>
<Compile Include="FS.cs" />
<Compile Include="Program.cs" /> <Compile Include="Program.cs" />
<Compile Include="Properties\AssemblyInfo.cs" /> <Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="Version.cs" /> <Compile Include="Version.cs" />

@ -0,0 +1,22 @@
const fs = require("fs");
// Read the file from private/sort-contributors.txt
const file = fs.readFileSync("private/sort-contributors.txt", "utf8");
// Convert to an array of lines
let lines = file.split("\n");
// Remove empty lines
lines = lines.filter((line) => line !== "");
// Remove duplicates
lines = [ ...new Set(lines) ];
// Remove @weblate and @UptimeKumaBot
lines = lines.filter((line) => line !== "@weblate" && line !== "@UptimeKumaBot" && line !== "@louislam");
// Sort the lines
lines = lines.sort();
// Output the lines, concat with " "
console.log(lines.join(" "));

17007
package-lock.json generated

File diff suppressed because it is too large Load Diff

@ -1,6 +1,6 @@
{ {
"name": "uptime-kuma", "name": "uptime-kuma",
"version": "1.20.1", "version": "1.21.2",
"license": "MIT", "license": "MIT",
"repository": { "repository": {
"type": "git", "type": "git",
@ -39,7 +39,7 @@
"build-docker-nightly-amd64": "docker buildx build -f docker/dockerfile --platform linux/amd64 -t louislam/uptime-kuma:nightly-amd64 --target nightly . --push --progress plain", "build-docker-nightly-amd64": "docker buildx build -f docker/dockerfile --platform linux/amd64 -t louislam/uptime-kuma:nightly-amd64 --target nightly . --push --progress plain",
"build-docker-pr-test": "docker buildx build -f docker/dockerfile --platform linux/amd64,linux/arm64 -t louislam/uptime-kuma:pr-test --target pr-test . --push", "build-docker-pr-test": "docker buildx build -f docker/dockerfile --platform linux/amd64,linux/arm64 -t louislam/uptime-kuma:pr-test --target pr-test . --push",
"upload-artifacts": "docker buildx build -f docker/dockerfile --platform linux/amd64 -t louislam/uptime-kuma:upload-artifact --build-arg VERSION --build-arg GITHUB_TOKEN --target upload-artifact . --progress plain", "upload-artifacts": "docker buildx build -f docker/dockerfile --platform linux/amd64 -t louislam/uptime-kuma:upload-artifact --build-arg VERSION --build-arg GITHUB_TOKEN --target upload-artifact . --progress plain",
"setup": "git checkout 1.20.1 && npm ci --production && npm run download-dist", "setup": "git checkout 1.21.2 && npm ci --production && npm run download-dist",
"download-dist": "node extra/download-dist.js", "download-dist": "node extra/download-dist.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",
@ -64,12 +64,13 @@
"cy:run:unit": "npx cypress run --browser chrome --headless --config-file ./config/cypress.frontend.config.js", "cy:run:unit": "npx cypress run --browser chrome --headless --config-file ./config/cypress.frontend.config.js",
"cypress-open": "concurrently -k -r \"node test/prepare-test-server.js && node server/server.js --port=3002 --data-dir=./data/test/\" \"cypress open --config-file ./config/cypress.config.js\"", "cypress-open": "concurrently -k -r \"node test/prepare-test-server.js && node server/server.js --port=3002 --data-dir=./data/test/\" \"cypress open --config-file ./config/cypress.config.js\"",
"build-healthcheck-armv7": "cross-env GOOS=linux GOARCH=arm GOARM=7 go build -x -o ./extra/healthcheck-armv7 ./extra/healthcheck.go", "build-healthcheck-armv7": "cross-env GOOS=linux GOARCH=arm GOARM=7 go build -x -o ./extra/healthcheck-armv7 ./extra/healthcheck.go",
"depoly-demo-server": "node extra/deploy-demo-server.js" "depoly-demo-server": "node extra/deploy-demo-server.js",
"sort-contributors": "node extra/sort-contributors.js"
}, },
"dependencies": { "dependencies": {
"@grpc/grpc-js": "~1.7.3", "@grpc/grpc-js": "~1.7.3",
"@louislam/ping": "~0.4.2-mod.1", "@louislam/ping": "~0.4.4-mod.0",
"@louislam/sqlite3": "15.1.2", "@louislam/sqlite3": "15.1.6",
"args-parser": "~1.3.0", "args-parser": "~1.3.0",
"axios": "~0.27.0", "axios": "~0.27.0",
"axios-ntlm": "1.3.0", "axios-ntlm": "1.3.0",
@ -84,6 +85,7 @@
"command-exists": "~1.2.9", "command-exists": "~1.2.9",
"compare-versions": "~3.6.0", "compare-versions": "~3.6.0",
"compression": "~1.7.4", "compression": "~1.7.4",
"croner": "^6.0.3",
"dayjs": "~1.11.5", "dayjs": "~1.11.5",
"dotenv": "~16.0.3", "dotenv": "~16.0.3",
"express": "~4.17.3", "express": "~4.17.3",
@ -99,10 +101,11 @@
"jsonwebtoken": "~9.0.0", "jsonwebtoken": "~9.0.0",
"jwt-decode": "~3.1.2", "jwt-decode": "~3.1.2",
"limiter": "~2.1.0", "limiter": "~2.1.0",
"mongodb": "~4.13.0", "mongodb": "~4.14.0",
"mqtt": "~4.3.7", "mqtt": "~4.3.7",
"mssql": "~8.1.4", "mssql": "~8.1.4",
"mysql2": "~2.3.3", "mysql2": "~2.3.3",
"nanoid": "^3.3.4",
"node-cloudflared-tunnel": "~1.0.9", "node-cloudflared-tunnel": "~1.0.9",
"node-radius-client": "~1.0.0", "node-radius-client": "~1.0.0",
"nodemailer": "~6.6.5", "nodemailer": "~6.6.5",
@ -144,6 +147,7 @@
"chartjs-adapter-dayjs": "~1.0.0", "chartjs-adapter-dayjs": "~1.0.0",
"concurrently": "^7.1.0", "concurrently": "^7.1.0",
"core-js": "~3.26.1", "core-js": "~3.26.1",
"cronstrue": "~2.24.0",
"cross-env": "~7.0.3", "cross-env": "~7.0.3",
"cypress": "^10.1.0", "cypress": "^10.1.0",
"delay": "^5.0.0", "delay": "^5.0.0",
@ -170,7 +174,7 @@
"v-pagination-3": "~0.1.7", "v-pagination-3": "~0.1.7",
"vite": "~3.1.0", "vite": "~3.1.0",
"vite-plugin-compression": "^0.5.1", "vite-plugin-compression": "^0.5.1",
"vue": "next", "vue": "~3.2.47",
"vue-chart-3": "3.0.9", "vue-chart-3": "3.0.9",
"vue-confirm-dialog": "~1.0.2", "vue-confirm-dialog": "~1.0.2",
"vue-contenteditable": "~3.0.4", "vue-contenteditable": "~3.0.4",

@ -2,7 +2,9 @@ const basicAuth = require("express-basic-auth");
const passwordHash = require("./password-hash"); const passwordHash = require("./password-hash");
const { R } = require("redbean-node"); const { R } = require("redbean-node");
const { setting } = require("./util-server"); const { setting } = require("./util-server");
const { loginRateLimiter } = require("./rate-limiter"); const { loginRateLimiter, apiRateLimiter } = require("./rate-limiter");
const { Settings } = require("./settings");
const dayjs = require("dayjs");
/** /**
* Login to web app * Login to web app
@ -34,8 +36,36 @@ exports.login = async function (username, password) {
}; };
/** /**
* Callback for myAuthorizer * Validate a provided API key
* @callback myAuthorizerCB * @param {string} key API key to verify
*/
async function verifyAPIKey(key) {
if (typeof key !== "string") {
return false;
}
// uk prefix + key ID is before _
let index = key.substring(2, key.indexOf("_"));
let clear = key.substring(key.indexOf("_") + 1, key.length);
let hash = await R.findOne("api_key", " id=? ", [ index ]);
if (hash === null) {
return false;
}
let current = dayjs();
let expiry = dayjs(hash.expires);
if (expiry.diff(current) < 0 || !hash.active) {
return false;
}
return hash && passwordHash.verify(clear, hash.key);
}
/**
* Callback for basic auth authorizers
* @callback authCallback
* @param {any} err Any error encountered * @param {any} err Any error encountered
* @param {boolean} authorized Is the client authorized? * @param {boolean} authorized Is the client authorized?
*/ */
@ -44,9 +74,31 @@ exports.login = async function (username, password) {
* Custom authorizer for express-basic-auth * Custom authorizer for express-basic-auth
* @param {string} username * @param {string} username
* @param {string} password * @param {string} password
* @param {myAuthorizerCB} callback * @param {authCallback} callback
*/
function apiAuthorizer(username, password, callback) {
// API Rate Limit
apiRateLimiter.pass(null, 0).then((pass) => {
if (pass) {
verifyAPIKey(password).then((valid) => {
callback(null, valid);
// Only allow a set number of api requests per minute
// (currently set to 60)
apiRateLimiter.removeTokens(1);
});
} else {
callback(null, false);
}
});
}
/**
* Custom authorizer for express-basic-auth
* @param {string} username
* @param {string} password
* @param {authCallback} callback
*/ */
function myAuthorizer(username, password, callback) { function userAuthorizer(username, password, callback) {
// Login Rate Limit // Login Rate Limit
loginRateLimiter.pass(null, 0).then((pass) => { loginRateLimiter.pass(null, 0).then((pass) => {
if (pass) { if (pass) {
@ -71,7 +123,7 @@ function myAuthorizer(username, password, callback) {
*/ */
exports.basicAuth = async function (req, res, next) { exports.basicAuth = async function (req, res, next) {
const middleware = basicAuth({ const middleware = basicAuth({
authorizer: myAuthorizer, authorizer: userAuthorizer,
authorizeAsync: true, authorizeAsync: true,
challenge: true, challenge: true,
}); });
@ -84,3 +136,32 @@ exports.basicAuth = async function (req, res, next) {
next(); next();
} }
}; };
/**
* Use use API Key if API keys enabled, else use basic auth
* @param {express.Request} req Express request object
* @param {express.Response} res Express response object
* @param {express.NextFunction} next
*/
exports.apiAuth = async function (req, res, next) {
if (!await Settings.get("disableAuth")) {
let usingAPIKeys = await Settings.get("apiKeysEnabled");
let middleware;
if (usingAPIKeys) {
middleware = basicAuth({
authorizer: apiAuthorizer,
authorizeAsync: true,
challenge: true,
});
} else {
middleware = basicAuth({
authorizer: userAuthorizer,
authorizeAsync: true,
challenge: true,
});
}
middleware(req, res, next);
} else {
next();
}
};

@ -113,6 +113,31 @@ async function sendProxyList(socket) {
return list; return list;
} }
/**
* Emit API key list to client
* @param {Socket} socket Socket.io socket instance
* @returns {Promise<void>}
*/
async function sendAPIKeyList(socket) {
const timeLogger = new TimeLogger();
let result = [];
const list = await R.find(
"api_key",
"user_id=?",
[ socket.userID ],
);
for (let bean of list) {
result.push(bean.toPublicJSON());
}
io.to(socket.userID).emit("apiKeyList", result);
timeLogger.print("Sent API Key List");
return list;
}
/** /**
* Emits the version information to the client. * Emits the version information to the client.
* @param {Socket} socket Socket.io socket instance * @param {Socket} socket Socket.io socket instance
@ -157,6 +182,7 @@ module.exports = {
sendImportantHeartbeatList, sendImportantHeartbeatList,
sendHeartbeatList, sendHeartbeatList,
sendProxyList, sendProxyList,
sendAPIKeyList,
sendInfo, sendInfo,
sendDockerHostList sendDockerHostList
}; };

@ -30,11 +30,6 @@ class Database {
*/ */
static patched = false; static patched = false;
/**
* For Backup only
*/
static backupPath = null;
/** /**
* Add patch filename in key * Add patch filename in key
* Values: * Values:
@ -72,6 +67,9 @@ class Database {
"patch-add-google-analytics-status-page-tag.sql": true, "patch-add-google-analytics-status-page-tag.sql": true,
"patch-http-body-encoding.sql": true, "patch-http-body-encoding.sql": true,
"patch-add-description-monitor.sql": true, "patch-add-description-monitor.sql": true,
"patch-api-key-table.sql": true,
"patch-monitor-tls.sql": true,
"patch-maintenance-cron.sql": true,
}; };
/** /**
@ -196,15 +194,7 @@ class Database {
} else { } else {
log.info("db", "Database patch is needed"); log.info("db", "Database patch is needed");
try { // Try catch anything here
this.backup(version);
} catch (e) {
log.error("db", e);
log.error("db", "Unable to create a backup before patching the database. Please make sure you have enough space and permission.");
process.exit(1);
}
// Try catch anything here, if gone wrong, restore the backup
try { try {
for (let i = version + 1; i <= this.latestVersion; i++) { for (let i = version + 1; i <= this.latestVersion; i++) {
const sqlFile = `./db/patch${i}.sql`; const sqlFile = `./db/patch${i}.sql`;
@ -220,7 +210,6 @@ class Database {
log.error("db", "Start Uptime-Kuma failed due to issue patching the database"); log.error("db", "Start Uptime-Kuma failed due to issue patching the database");
log.error("db", "Please submit a bug report if you still encounter the problem after restart: https://github.com/louislam/uptime-kuma/issues"); log.error("db", "Please submit a bug report if you still encounter the problem after restart: https://github.com/louislam/uptime-kuma/issues");
this.restore();
process.exit(1); process.exit(1);
} }
} }
@ -262,8 +251,6 @@ class Database {
log.error("db", "Start Uptime-Kuma failed due to issue patching the database"); log.error("db", "Start Uptime-Kuma failed due to issue patching the database");
log.error("db", "Please submit the bug report if you still encounter the problem after restart: https://github.com/louislam/uptime-kuma/issues"); log.error("db", "Please submit the bug report if you still encounter the problem after restart: https://github.com/louislam/uptime-kuma/issues");
this.restore();
process.exit(1); process.exit(1);
} }
@ -365,8 +352,6 @@ class Database {
} }
} }
this.backup(dayjs().format("YYYYMMDDHHmmss"));
log.info("db", sqlFilename + " is patching"); log.info("db", sqlFilename + " is patching");
this.patched = true; this.patched = true;
await this.importSQLFile("./db/" + sqlFilename); await this.importSQLFile("./db/" + sqlFilename);
@ -448,100 +433,6 @@ class Database {
process.removeListener("unhandledRejection", listener); process.removeListener("unhandledRejection", listener);
} }
/**
* One backup one time in this process.
* Reset this.backupPath if you want to backup again
* @param {string} version Version code of backup
*/
static backup(version) {
if (! this.backupPath) {
log.info("db", "Backing up the database");
this.backupPath = this.dataDir + "kuma.db.bak" + version;
fs.copyFileSync(Database.path, this.backupPath);
const shmPath = Database.path + "-shm";
if (fs.existsSync(shmPath)) {
this.backupShmPath = shmPath + ".bak" + version;
fs.copyFileSync(shmPath, this.backupShmPath);
}
const walPath = Database.path + "-wal";
if (fs.existsSync(walPath)) {
this.backupWalPath = walPath + ".bak" + version;
fs.copyFileSync(walPath, this.backupWalPath);
}
// Double confirm if all files actually backup
if (!fs.existsSync(this.backupPath)) {
throw new Error("Backup failed! " + this.backupPath);
}
if (fs.existsSync(shmPath)) {
if (!fs.existsSync(this.backupShmPath)) {
throw new Error("Backup failed! " + this.backupShmPath);
}
}
if (fs.existsSync(walPath)) {
if (!fs.existsSync(this.backupWalPath)) {
throw new Error("Backup failed! " + this.backupWalPath);
}
}
}
}
/** Restore from most recent backup */
static restore() {
if (this.backupPath) {
log.error("db", "Patching the database failed!!! Restoring the backup");
const shmPath = Database.path + "-shm";
const walPath = Database.path + "-wal";
// Make sure we have a backup to restore before deleting old db
if (
!fs.existsSync(this.backupPath)
&& !fs.existsSync(shmPath)
&& !fs.existsSync(walPath)
) {
log.error("db", "Backup file not found! Leaving database in failed state.");
process.exit(1);
}
// Delete patch failed db
try {
if (fs.existsSync(Database.path)) {
fs.unlinkSync(Database.path);
}
if (fs.existsSync(shmPath)) {
fs.unlinkSync(shmPath);
}
if (fs.existsSync(walPath)) {
fs.unlinkSync(walPath);
}
} catch (e) {
log.error("db", "Restore failed; you may need to restore the backup manually");
process.exit(1);
}
// Restore backup
fs.copyFileSync(this.backupPath, Database.path);
if (this.backupShmPath) {
fs.copyFileSync(this.backupShmPath, shmPath);
}
if (this.backupWalPath) {
fs.copyFileSync(this.backupWalPath, walPath);
}
} else {
log.info("db", "Nothing to restore");
}
}
/** Get the size of the database */ /** Get the size of the database */
static getSize() { static getSize() {
log.debug("db", "Database.getSize()"); log.debug("db", "Database.getSize()");

@ -0,0 +1,76 @@
const { BeanModel } = require("redbean-node/dist/bean-model");
const { R } = require("redbean-node");
const dayjs = require("dayjs");
class APIKey extends BeanModel {
/**
* Get the current status of this API key
* @returns {string} active, inactive or expired
*/
getStatus() {
let current = dayjs();
let expiry = dayjs(this.expires);
if (expiry.diff(current) < 0) {
return "expired";
}
return this.active ? "active" : "inactive";
}
/**
* Returns an object that ready to parse to JSON
* @returns {Object}
*/
toJSON() {
return {
id: this.id,
key: this.key,
name: this.name,
userID: this.user_id,
createdDate: this.created_date,
active: this.active,
expires: this.expires,
status: this.getStatus(),
};
}
/**
* Returns an object that ready to parse to JSON with sensitive fields
* removed
* @returns {Object}
*/
toPublicJSON() {
return {
id: this.id,
name: this.name,
userID: this.user_id,
createdDate: this.created_date,
active: this.active,
expires: this.expires,
status: this.getStatus(),
};
}
/**
* Create a new API Key and store it in the database
* @param {Object} key Object sent by client
* @param {int} userID ID of socket user
* @returns {Promise<bean>}
*/
static async save(key, userID) {
let bean;
bean = R.dispense("api_key");
bean.key = key.key;
bean.name = key.name;
bean.user_id = userID;
bean.active = key.active;
bean.expires = key.expires;
await R.store(bean);
return bean;
}
}
module.exports = APIKey;

@ -1,8 +1,10 @@
const { BeanModel } = require("redbean-node/dist/bean-model"); const { BeanModel } = require("redbean-node/dist/bean-model");
const { parseTimeObject, parseTimeFromTimeObject, utcToLocal, localToUTC, log } = require("../../src/util"); const { parseTimeObject, parseTimeFromTimeObject, log } = require("../../src/util");
const { timeObjectToUTC, timeObjectToLocal } = require("../util-server");
const { R } = require("redbean-node"); const { R } = require("redbean-node");
const dayjs = require("dayjs"); const dayjs = require("dayjs");
const Cron = require("croner");
const { UptimeKumaServer } = require("../uptime-kuma-server");
const apicache = require("../modules/apicache");
class Maintenance extends BeanModel { class Maintenance extends BeanModel {
@ -15,16 +17,19 @@ class Maintenance extends BeanModel {
let dateRange = []; let dateRange = [];
if (this.start_date) { if (this.start_date) {
dateRange.push(utcToLocal(this.start_date)); dateRange.push(this.start_date);
if (this.end_date) { } else {
dateRange.push(utcToLocal(this.end_date)); dateRange.push(null);
} }
if (this.end_date) {
dateRange.push(this.end_date);
} }
let timeRange = []; let timeRange = [];
let startTime = timeObjectToLocal(parseTimeObject(this.start_time)); let startTime = parseTimeObject(this.start_time);
timeRange.push(startTime); timeRange.push(startTime);
let endTime = timeObjectToLocal(parseTimeObject(this.end_time)); let endTime = parseTimeObject(this.end_time);
timeRange.push(endTime); timeRange.push(endTime);
let obj = { let obj = {
@ -39,68 +44,54 @@ class Maintenance extends BeanModel {
weekdays: (this.weekdays) ? JSON.parse(this.weekdays) : [], weekdays: (this.weekdays) ? JSON.parse(this.weekdays) : [],
daysOfMonth: (this.days_of_month) ? JSON.parse(this.days_of_month) : [], daysOfMonth: (this.days_of_month) ? JSON.parse(this.days_of_month) : [],
timeslotList: [], timeslotList: [],
cron: this.cron,
duration: this.duration,
durationMinutes: parseInt(this.duration / 60),
timezone: await this.getTimezone(),
timezoneOffset: await this.getTimezoneOffset(),
status: await this.getStatus(),
}; };
const timeslotList = await this.getTimeslotList(); if (this.strategy === "manual") {
// Do nothing, no timeslots
for (let timeslot of timeslotList) { } else if (this.strategy === "single") {
obj.timeslotList.push(await timeslot.toPublicJSON()); obj.timeslotList.push({
} startDate: this.start_date,
endDate: this.end_date,
if (!Array.isArray(obj.weekdays)) { });
obj.weekdays = []; } else {
} // Should be cron or recurring here
if (this.beanMeta.job) {
let runningTimeslot = this.getRunningTimeslot();
if (!Array.isArray(obj.daysOfMonth)) { if (runningTimeslot) {
obj.daysOfMonth = []; obj.timeslotList.push(runningTimeslot);
} }
// Maintenance Status let nextRunDate = this.beanMeta.job.nextRun();
if (!obj.active) { if (nextRunDate) {
obj.status = "inactive"; let startDateDayjs = dayjs(nextRunDate);
} else if (obj.strategy === "manual") {
obj.status = "under-maintenance";
} else if (obj.timeslotList.length > 0) {
let currentTimestamp = dayjs().unix();
for (let timeslot of obj.timeslotList) { let startDate = startDateDayjs.toISOString();
if (dayjs.utc(timeslot.startDate).unix() <= currentTimestamp && dayjs.utc(timeslot.endDate).unix() >= currentTimestamp) { let endDate = startDateDayjs.add(this.duration, "second").toISOString();
log.debug("timeslot", "Timeslot ID: " + timeslot.id);
log.debug("timeslot", "currentTimestamp:" + currentTimestamp);
log.debug("timeslot", "timeslot.start_date:" + dayjs.utc(timeslot.startDate).unix());
log.debug("timeslot", "timeslot.end_date:" + dayjs.utc(timeslot.endDate).unix());
obj.status = "under-maintenance"; obj.timeslotList.push({
break; startDate,
endDate,
});
} }
} }
if (!obj.status) {
obj.status = "scheduled";
} }
} else if (obj.timeslotList.length === 0) {
obj.status = "ended"; if (!Array.isArray(obj.weekdays)) {
} else { obj.weekdays = [];
obj.status = "unknown";
} }
return obj; if (!Array.isArray(obj.daysOfMonth)) {
obj.daysOfMonth = [];
} }
/** return obj;
* Only get future or current timeslots only
* @returns {Promise<[]>}
*/
async getTimeslotList() {
return R.convertToBeans("maintenance_timeslot", await R.getAll(`
SELECT maintenance_timeslot.*
FROM maintenance_timeslot, maintenance
WHERE maintenance_timeslot.maintenance_id = maintenance.id
AND maintenance.id = ?
AND ${Maintenance.getActiveAndFutureMaintenanceSQLCondition()}
`, [
this.id
]));
} }
/** /**
@ -126,7 +117,7 @@ class Maintenance extends BeanModel {
/** /**
* Get a list of days in month that maintenance is active for * Get a list of days in month that maintenance is active for
* @returns {number[]} Array of active days in month * @returns {number[]|string[]} Array of active days in month
*/ */
getDayOfMonthList() { getDayOfMonthList() {
return JSON.parse(this.days_of_month).sort(function (a, b) { return JSON.parse(this.days_of_month).sort(function (a, b) {
@ -135,26 +126,10 @@ class Maintenance extends BeanModel {
} }
/** /**
* Get the start date and time for maintenance * Get the duration of maintenance in seconds
* @returns {dayjs.Dayjs} Start date and time
*/
getStartDateTime() {
let startOfTheDay = dayjs.utc(this.start_date).format("HH:mm");
log.debug("timeslot", "startOfTheDay: " + startOfTheDay);
// Start Time
let startTimeSecond = dayjs.utc(this.start_time, "HH:mm").diff(dayjs.utc(startOfTheDay, "HH:mm"), "second");
log.debug("timeslot", "startTime: " + startTimeSecond);
// Bake StartDate + StartTime = Start DateTime
return dayjs.utc(this.start_date).add(startTimeSecond, "second");
}
/**
* Get the duraction of maintenance in seconds
* @returns {number} Duration of maintenance * @returns {number} Duration of maintenance
*/ */
getDuration() { calcDuration() {
let duration = dayjs.utc(this.end_time, "HH:mm").diff(dayjs.utc(this.start_time, "HH:mm"), "second"); let duration = dayjs.utc(this.end_time, "HH:mm").diff(dayjs.utc(this.start_time, "HH:mm"), "second");
// Add 24hours if it is across day // Add 24hours if it is across day
if (duration < 0) { if (duration < 0) {
@ -169,71 +144,270 @@ class Maintenance extends BeanModel {
* @param {Object} obj Data to fill bean with * @param {Object} obj Data to fill bean with
* @returns {Bean} Filled bean * @returns {Bean} Filled bean
*/ */
static jsonToBean(bean, obj) { static async jsonToBean(bean, obj) {
if (obj.id) { if (obj.id) {
bean.id = obj.id; bean.id = obj.id;
} }
// Apply timezone offset to timeRange, as it cannot apply automatically.
if (obj.timeRange[0]) {
timeObjectToUTC(obj.timeRange[0]);
if (obj.timeRange[1]) {
timeObjectToUTC(obj.timeRange[1]);
}
}
bean.title = obj.title; bean.title = obj.title;
bean.description = obj.description; bean.description = obj.description;
bean.strategy = obj.strategy; bean.strategy = obj.strategy;
bean.interval_day = obj.intervalDay; bean.interval_day = obj.intervalDay;
bean.timezone = obj.timezone;
bean.active = obj.active; bean.active = obj.active;
if (obj.dateRange[0]) { if (obj.dateRange[0]) {
bean.start_date = localToUTC(obj.dateRange[0]); bean.start_date = obj.dateRange[0];
} else {
bean.start_date = null;
}
if (obj.dateRange[1]) { if (obj.dateRange[1]) {
bean.end_date = localToUTC(obj.dateRange[1]); bean.end_date = obj.dateRange[1];
} else {
bean.end_date = null;
} }
if (bean.strategy === "cron") {
bean.duration = obj.durationMinutes * 60;
bean.cron = obj.cron;
this.validateCron(bean.cron);
} }
if (bean.strategy.startsWith("recurring-")) {
bean.start_time = parseTimeFromTimeObject(obj.timeRange[0]); bean.start_time = parseTimeFromTimeObject(obj.timeRange[0]);
bean.end_time = parseTimeFromTimeObject(obj.timeRange[1]); bean.end_time = parseTimeFromTimeObject(obj.timeRange[1]);
bean.weekdays = JSON.stringify(obj.weekdays); bean.weekdays = JSON.stringify(obj.weekdays);
bean.days_of_month = JSON.stringify(obj.daysOfMonth); bean.days_of_month = JSON.stringify(obj.daysOfMonth);
await bean.generateCron();
this.validateCron(bean.cron);
}
return bean; return bean;
} }
/** /**
* SQL conditions for active maintenance * Throw error if cron is invalid
* @returns {string} * @param cron
* @returns {Promise<void>}
*/ */
static getActiveMaintenanceSQLCondition() { static async validateCron(cron) {
return ` let job = new Cron(cron, () => {});
( job.stop();
(maintenance_timeslot.start_date <= DATETIME('now')
AND maintenance_timeslot.end_date >= DATETIME('now')
AND maintenance.active = 1)
OR
(maintenance.strategy = 'manual' AND active = 1)
)
`;
} }
/** /**
* SQL conditions for active and future maintenance * Run the cron
* @returns {string}
*/ */
static getActiveAndFutureMaintenanceSQLCondition() { async run(throwError = false) {
return ` if (this.beanMeta.job) {
( log.debug("maintenance", "Maintenance is already running, stop it first. id: " + this.id);
((maintenance_timeslot.end_date >= DATETIME('now') this.stop();
AND maintenance.active = 1) }
OR
(maintenance.strategy = 'manual' AND active = 1)) log.debug("maintenance", "Run maintenance id: " + this.id);
)
`; // 1.21.2 migration
if (!this.cron) {
await this.generateCron();
if (!this.timezone) {
this.timezone = "UTC";
}
if (this.cron) {
await R.store(this);
}
}
if (this.strategy === "manual") {
// Do nothing, because it is controlled by the user
} else if (this.strategy === "single") {
this.beanMeta.job = new Cron(this.start_date, { timezone: await this.getTimezone() }, () => {
log.info("maintenance", "Maintenance id: " + this.id + " is under maintenance now");
UptimeKumaServer.getInstance().sendMaintenanceListByUserID(this.user_id);
apicache.clear();
});
} else if (this.cron != null) {
// Here should be cron or recurring
try {
this.beanMeta.status = "scheduled";
let startEvent = (customDuration = 0) => {
log.info("maintenance", "Maintenance id: " + this.id + " is under maintenance now");
this.beanMeta.status = "under-maintenance";
clearTimeout(this.beanMeta.durationTimeout);
// Check if duration is still in the window. If not, use the duration from the current time to the end of the window
let duration;
if (customDuration > 0) {
duration = customDuration;
} else if (this.end_date) {
let d = dayjs(this.end_date).diff(dayjs(), "second");
if (d < this.duration) {
duration = d * 1000;
}
} else {
duration = this.duration * 1000;
}
UptimeKumaServer.getInstance().sendMaintenanceListByUserID(this.user_id);
this.beanMeta.durationTimeout = setTimeout(() => {
// End of maintenance for this timeslot
this.beanMeta.status = "scheduled";
UptimeKumaServer.getInstance().sendMaintenanceListByUserID(this.user_id);
}, duration);
};
// Create Cron
this.beanMeta.job = new Cron(this.cron, {
timezone: await this.getTimezone(),
}, startEvent);
// Continue if the maintenance is still in the window
let runningTimeslot = this.getRunningTimeslot();
let current = dayjs();
if (runningTimeslot) {
let duration = dayjs(runningTimeslot.endDate).diff(current, "second") * 1000;
log.debug("maintenance", "Maintenance id: " + this.id + " Remaining duration: " + duration + "ms");
startEvent(duration);
}
} catch (e) {
log.error("maintenance", "Error in maintenance id: " + this.id);
log.error("maintenance", "Cron: " + this.cron);
log.error("maintenance", e);
if (throwError) {
throw e;
}
}
} else {
log.error("maintenance", "Maintenance id: " + this.id + " has no cron");
}
}
getRunningTimeslot() {
let start = dayjs(this.beanMeta.job.nextRun(dayjs().add(-this.duration, "second").format("YYYY-MM-DD HH:mm:ss")));
let end = start.add(this.duration, "second");
let current = dayjs();
if (current.isAfter(start) && current.isBefore(end)) {
return {
startDate: start.toISOString(),
endDate: end.toISOString(),
};
} else {
return null;
}
}
stop() {
if (this.beanMeta.job) {
this.beanMeta.job.stop();
delete this.beanMeta.job;
}
}
async isUnderMaintenance() {
return (await this.getStatus()) === "under-maintenance";
}
async getTimezone() {
if (!this.timezone) {
return await UptimeKumaServer.getInstance().getTimezone();
}
return this.timezone;
}
async getTimezoneOffset() {
return dayjs.tz(dayjs(), await this.getTimezone()).format("Z");
}
async getStatus() {
if (!this.active) {
return "inactive";
}
if (this.strategy === "manual") {
return "under-maintenance";
}
// Check if the maintenance is started
if (this.start_date && dayjs().isBefore(dayjs.tz(this.start_date, await this.getTimezone()))) {
return "scheduled";
}
// Check if the maintenance is ended
if (this.end_date && dayjs().isAfter(dayjs.tz(this.end_date, await this.getTimezone()))) {
return "ended";
}
if (this.strategy === "single") {
return "under-maintenance";
}
if (!this.beanMeta.status) {
return "unknown";
}
return this.beanMeta.status;
}
/**
* Generate Cron for recurring maintenance
* @returns {Promise<void>}
*/
async generateCron() {
log.info("maintenance", "Generate cron for maintenance id: " + this.id);
if (this.strategy === "cron") {
// Do nothing for cron
} else if (!this.strategy.startsWith("recurring-")) {
this.cron = "";
} else if (this.strategy === "recurring-interval") {
let array = this.start_time.split(":");
let hour = parseInt(array[0]);
let minute = parseInt(array[1]);
this.cron = minute + " " + hour + " */" + this.interval_day + " * *";
this.duration = this.calcDuration();
log.debug("maintenance", "Cron: " + this.cron);
log.debug("maintenance", "Duration: " + this.duration);
} else if (this.strategy === "recurring-weekday") {
let list = this.getDayOfWeekList();
let array = this.start_time.split(":");
let hour = parseInt(array[0]);
let minute = parseInt(array[1]);
this.cron = minute + " " + hour + " * * " + list.join(",");
this.duration = this.calcDuration();
} else if (this.strategy === "recurring-day-of-month") {
let list = this.getDayOfMonthList();
let array = this.start_time.split(":");
let hour = parseInt(array[0]);
let minute = parseInt(array[1]);
let dayList = [];
for (let day of list) {
if (typeof day === "string" && day.startsWith("lastDay")) {
if (day === "lastDay1") {
dayList.push("L");
}
// Unfortunately, lastDay2-4 is not supported by cron
} else {
dayList.push(day);
}
}
// Remove duplicate
dayList = [ ...new Set(dayList) ];
this.cron = minute + " " + hour + " " + dayList.join(",") + " * *";
this.duration = this.calcDuration();
}
} }
} }

@ -1,198 +0,0 @@
const { BeanModel } = require("redbean-node/dist/bean-model");
const { R } = require("redbean-node");
const dayjs = require("dayjs");
const { log, utcToLocal, SQL_DATETIME_FORMAT_WITHOUT_SECOND, localToUTC } = require("../../src/util");
const { UptimeKumaServer } = require("../uptime-kuma-server");
class MaintenanceTimeslot extends BeanModel {
/**
* Return an object that ready to parse to JSON for public
* Only show necessary data to public
* @returns {Object}
*/
async toPublicJSON() {
const serverTimezoneOffset = UptimeKumaServer.getInstance().getTimezoneOffset();
const obj = {
id: this.id,
startDate: this.start_date,
endDate: this.end_date,
startDateServerTimezone: utcToLocal(this.start_date, SQL_DATETIME_FORMAT_WITHOUT_SECOND),
endDateServerTimezone: utcToLocal(this.end_date, SQL_DATETIME_FORMAT_WITHOUT_SECOND),
serverTimezoneOffset,
};
return obj;
}
/**
* Return an object that ready to parse to JSON
* @returns {Object}
*/
async toJSON() {
return await this.toPublicJSON();
}
/**
* @param {Maintenance} maintenance
* @param {dayjs} minDate (For recurring type only) Generate a next timeslot from this date.
* @param {boolean} removeExist Remove existing timeslot before create
* @returns {Promise<MaintenanceTimeslot>}
*/
static async generateTimeslot(maintenance, minDate = null, removeExist = false) {
if (removeExist) {
await R.exec("DELETE FROM maintenance_timeslot WHERE maintenance_id = ? ", [
maintenance.id
]);
}
if (maintenance.strategy === "manual") {
log.debug("maintenance", "No need to generate timeslot for manual type");
} else if (maintenance.strategy === "single") {
let bean = R.dispense("maintenance_timeslot");
bean.maintenance_id = maintenance.id;
bean.start_date = maintenance.start_date;
bean.end_date = maintenance.end_date;
bean.generated_next = true;
return await R.store(bean);
} else if (maintenance.strategy === "recurring-interval") {
// Prevent dead loop, in case interval_day is not set
if (!maintenance.interval_day || maintenance.interval_day <= 0) {
maintenance.interval_day = 1;
}
return await this.handleRecurringType(maintenance, minDate, (startDateTime) => {
return startDateTime.add(maintenance.interval_day, "day");
}, () => {
return true;
});
} else if (maintenance.strategy === "recurring-weekday") {
let dayOfWeekList = maintenance.getDayOfWeekList();
log.debug("timeslot", dayOfWeekList);
if (dayOfWeekList.length <= 0) {
log.debug("timeslot", "No weekdays selected?");
return null;
}
const isValid = (startDateTime) => {
log.debug("timeslot", "nextDateTime: " + startDateTime);
let day = startDateTime.local().day();
log.debug("timeslot", "nextDateTime.day(): " + day);
return dayOfWeekList.includes(day);
};
return await this.handleRecurringType(maintenance, minDate, (startDateTime) => {
while (true) {
startDateTime = startDateTime.add(1, "day");
if (isValid(startDateTime)) {
return startDateTime;
}
}
}, isValid);
} else if (maintenance.strategy === "recurring-day-of-month") {
let dayOfMonthList = maintenance.getDayOfMonthList();
if (dayOfMonthList.length <= 0) {
log.debug("timeslot", "No day selected?");
return null;
}
const isValid = (startDateTime) => {
let day = parseInt(startDateTime.local().format("D"));
log.debug("timeslot", "day: " + day);
// Check 1-31
if (dayOfMonthList.includes(day)) {
return startDateTime;
}
// Check "lastDay1","lastDay2"...
let daysInMonth = startDateTime.daysInMonth();
let lastDayList = [];
// Small first, e.g. 28 > 29 > 30 > 31
for (let i = 4; i >= 1; i--) {
if (dayOfMonthList.includes("lastDay" + i)) {
lastDayList.push(daysInMonth - i + 1);
}
}
log.debug("timeslot", lastDayList);
return lastDayList.includes(day);
};
return await this.handleRecurringType(maintenance, minDate, (startDateTime) => {
while (true) {
startDateTime = startDateTime.add(1, "day");
if (isValid(startDateTime)) {
return startDateTime;
}
}
}, isValid);
} else {
throw new Error("Unknown maintenance strategy");
}
}
/**
* Generate a next timeslot for all recurring types
* @param maintenance
* @param minDate
* @param {function} nextDayCallback The logic how to get the next possible day
* @param {function} isValidCallback Check the day whether is matched the current strategy
* @returns {Promise<null|MaintenanceTimeslot>}
*/
static async handleRecurringType(maintenance, minDate, nextDayCallback, isValidCallback) {
let bean = R.dispense("maintenance_timeslot");
let duration = maintenance.getDuration();
let startDateTime = maintenance.getStartDateTime();
let endDateTime;
// Keep generating from the first possible date, until it is ok
while (true) {
log.debug("timeslot", "startDateTime: " + startDateTime.format());
// Handling out of effective date range
if (startDateTime.diff(dayjs.utc(maintenance.end_date)) > 0) {
log.debug("timeslot", "Out of effective date range");
return null;
}
endDateTime = startDateTime.add(duration, "second");
// If endDateTime is out of effective date range, use the end datetime from effective date range
if (endDateTime.diff(dayjs.utc(maintenance.end_date)) > 0) {
endDateTime = dayjs.utc(maintenance.end_date);
}
// If minDate is set, the endDateTime must be bigger than it.
// And the endDateTime must be bigger current time
// Is valid under current recurring strategy
if (
(!minDate || endDateTime.diff(minDate) > 0) &&
endDateTime.diff(dayjs()) > 0 &&
isValidCallback(startDateTime)
) {
break;
}
startDateTime = nextDayCallback(startDateTime);
}
bean.maintenance_id = maintenance.id;
bean.start_date = localToUTC(startDateTime);
bean.end_date = localToUTC(endDateTime);
bean.generated_next = false;
return await R.store(bean);
}
}
module.exports = MaintenanceTimeslot;

@ -16,7 +16,6 @@ const apicache = require("../modules/apicache");
const { UptimeKumaServer } = require("../uptime-kuma-server"); const { UptimeKumaServer } = require("../uptime-kuma-server");
const { CacheableDnsHttpAgent } = require("../cacheable-dns-http-agent"); const { CacheableDnsHttpAgent } = require("../cacheable-dns-http-agent");
const { DockerHost } = require("../docker"); const { DockerHost } = require("../docker");
const Maintenance = require("./maintenance");
const { UptimeCacheList } = require("../uptime-cache-list"); const { UptimeCacheList } = require("../uptime-cache-list");
const Gamedig = require("gamedig"); const Gamedig = require("gamedig");
@ -133,6 +132,9 @@ class Monitor extends BeanModel {
mqttPassword: this.mqttPassword, mqttPassword: this.mqttPassword,
authWorkstation: this.authWorkstation, authWorkstation: this.authWorkstation,
authDomain: this.authDomain, authDomain: this.authDomain,
tlsCa: this.tlsCa,
tlsCert: this.tlsCert,
tlsKey: this.tlsKey,
}; };
} }
@ -331,6 +333,18 @@ class Monitor extends BeanModel {
options.httpsAgent = new https.Agent(httpsAgentOptions); options.httpsAgent = new https.Agent(httpsAgentOptions);
} }
if (this.auth_method === "mtls") {
if (this.tlsCert !== null && this.tlsCert !== "") {
options.httpsAgent.options.cert = Buffer.from(this.tlsCert);
}
if (this.tlsCa !== null && this.tlsCa !== "") {
options.httpsAgent.options.ca = Buffer.from(this.tlsCa);
}
if (this.tlsKey !== null && this.tlsKey !== "") {
options.httpsAgent.options.key = Buffer.from(this.tlsKey);
}
}
log.debug("monitor", `[${this.name}] Axios Options: ${JSON.stringify(options)}`); log.debug("monitor", `[${this.name}] Axios Options: ${JSON.stringify(options)}`);
log.debug("monitor", `[${this.name}] Axios Request`); log.debug("monitor", `[${this.name}] Axios Request`);
@ -622,9 +636,7 @@ class Monitor extends BeanModel {
} else if (this.type === "mysql") { } else if (this.type === "mysql") {
let startTime = dayjs().valueOf(); let startTime = dayjs().valueOf();
await mysqlQuery(this.databaseConnectionString, this.databaseQuery); bean.msg = await mysqlQuery(this.databaseConnectionString, this.databaseQuery);
bean.msg = "";
bean.status = UP; bean.status = UP;
bean.ping = dayjs().valueOf() - startTime; bean.ping = dayjs().valueOf() - startTime;
} else if (this.type === "mongodb") { } else if (this.type === "mongodb") {
@ -836,7 +848,6 @@ class Monitor extends BeanModel {
domain: this.authDomain, domain: this.authDomain,
workstation: this.authWorkstation ? this.authWorkstation : undefined workstation: this.authWorkstation ? this.authWorkstation : undefined
}); });
} else { } else {
res = await axios.request(options); res = await axios.request(options);
} }
@ -1233,7 +1244,7 @@ class Monitor extends BeanModel {
if (notificationList.length > 0) { if (notificationList.length > 0) {
let row = await R.getRow("SELECT * FROM notification_sent_history WHERE type = ? AND monitor_id = ? AND days = ?", [ let row = await R.getRow("SELECT * FROM notification_sent_history WHERE type = ? AND monitor_id = ? AND days <= ?", [
"certificate", "certificate",
this.id, this.id,
targetDays, targetDays,
@ -1251,7 +1262,7 @@ class Monitor extends BeanModel {
for (let notification of notificationList) { for (let notification of notificationList) {
try { try {
log.debug("monitor", "Sending to " + notification.name); log.debug("monitor", "Sending to " + notification.name);
await Notification.send(JSON.parse(notification.config), `[${this.name}][${this.url}] Certificate will be expired in ${daysRemaining} days`); await Notification.send(JSON.parse(notification.config), `[${this.name}][${this.url}] Certificate will expire in ${daysRemaining} days`);
sent = true; sent = true;
} catch (e) { } catch (e) {
log.error("monitor", "Cannot send cert notification to " + notification.name); log.error("monitor", "Cannot send cert notification to " + notification.name);
@ -1291,18 +1302,19 @@ class Monitor extends BeanModel {
* @returns {Promise<boolean>} * @returns {Promise<boolean>}
*/ */
static async isUnderMaintenance(monitorID) { static async isUnderMaintenance(monitorID) {
let activeCondition = Maintenance.getActiveMaintenanceSQLCondition(); const maintenanceIDList = await R.getCol(`
const maintenance = await R.getRow(` SELECT maintenance_id FROM monitor_maintenance
SELECT COUNT(*) AS count WHERE monitor_id = ?
FROM monitor_maintenance mm `, [ monitorID ]);
JOIN maintenance
ON mm.maintenance_id = maintenance.id for (const maintenanceID of maintenanceIDList) {
AND mm.monitor_id = ? const maintenance = await UptimeKumaServer.getInstance().getMaintenance(maintenanceID);
LEFT JOIN maintenance_timeslot if (maintenance && await maintenance.isUnderMaintenance()) {
ON maintenance_timeslot.maintenance_id = maintenance.id return true;
WHERE ${activeCondition} }
LIMIT 1`, [ monitorID ]); }
return maintenance.count !== 0;
return false;
} }
/** Make sure monitor interval is between bounds */ /** Make sure monitor interval is between bounds */

@ -3,7 +3,6 @@ const { R } = require("redbean-node");
const cheerio = require("cheerio"); const cheerio = require("cheerio");
const { UptimeKumaServer } = require("../uptime-kuma-server"); const { UptimeKumaServer } = require("../uptime-kuma-server");
const jsesc = require("jsesc"); const jsesc = require("jsesc");
const Maintenance = require("./maintenance");
const googleAnalytics = require("../google-analytics"); const googleAnalytics = require("../google-analytics");
class StatusPage extends BeanModel { class StatusPage extends BeanModel {
@ -290,21 +289,17 @@ class StatusPage extends BeanModel {
try { try {
const publicMaintenanceList = []; const publicMaintenanceList = [];
let activeCondition = Maintenance.getActiveMaintenanceSQLCondition(); let maintenanceIDList = await R.getCol(`
let maintenanceBeanList = R.convertToBeans("maintenance", await R.getAll(` SELECT DISTINCT maintenance_id
SELECT DISTINCT maintenance.* FROM maintenance_status_page
FROM maintenance WHERE status_page_id = ?
JOIN maintenance_status_page `, [ statusPageId ]);
ON maintenance_status_page.maintenance_id = maintenance.id
AND maintenance_status_page.status_page_id = ? for (const maintenanceID of maintenanceIDList) {
LEFT JOIN maintenance_timeslot let maintenance = UptimeKumaServer.getInstance().getMaintenance(maintenanceID);
ON maintenance_timeslot.maintenance_id = maintenance.id if (maintenance && await maintenance.isUnderMaintenance()) {
WHERE ${activeCondition} publicMaintenanceList.push(await maintenance.toPublicJSON());
ORDER BY maintenance.end_date }
`, [ statusPageId ]));
for (const bean of maintenanceBeanList) {
publicMaintenanceList.push(await bean.toPublicJSON());
} }
return publicMaintenanceList; return publicMaintenanceList;

@ -8,7 +8,12 @@ class LunaSea extends NotificationProvider {
async send(notification, msg, monitorJSON = null, heartbeatJSON = null) { async send(notification, msg, monitorJSON = null, heartbeatJSON = null) {
let okMsg = "Sent Successfully."; let okMsg = "Sent Successfully.";
let lunaseadevice = "https://notify.lunasea.app/v1/custom/device/" + notification.lunaseaDevice; let lunaseaurl = "";
if (notification.lunaseaTarget === "user") {
lunaseaurl = "https://notify.lunasea.app/v1/custom/user/" + notification.lunaseaUserID;
} else {
lunaseaurl = "https://notify.lunasea.app/v1/custom/device/" + notification.lunaseaDevice;
}
try { try {
if (heartbeatJSON == null) { if (heartbeatJSON == null) {
@ -16,7 +21,7 @@ class LunaSea extends NotificationProvider {
"title": "Uptime Kuma Alert", "title": "Uptime Kuma Alert",
"body": msg, "body": msg,
}; };
await axios.post(lunaseadevice, testdata); await axios.post(lunaseaurl, testdata);
return okMsg; return okMsg;
} }
@ -25,7 +30,7 @@ class LunaSea extends NotificationProvider {
"title": "UptimeKuma Alert: " + monitorJSON["name"], "title": "UptimeKuma Alert: " + monitorJSON["name"],
"body": "[🔴 Down] " + heartbeatJSON["msg"] + "\nTime (UTC): " + heartbeatJSON["time"], "body": "[🔴 Down] " + heartbeatJSON["msg"] + "\nTime (UTC): " + heartbeatJSON["time"],
}; };
await axios.post(lunaseadevice, downdata); await axios.post(lunaseaurl, downdata);
return okMsg; return okMsg;
} }
@ -34,7 +39,7 @@ class LunaSea extends NotificationProvider {
"title": "UptimeKuma Alert: " + monitorJSON["name"], "title": "UptimeKuma Alert: " + monitorJSON["name"],
"body": "[✅ Up] " + heartbeatJSON["msg"] + "\nTime (UTC): " + heartbeatJSON["time"], "body": "[✅ Up] " + heartbeatJSON["msg"] + "\nTime (UTC): " + heartbeatJSON["time"],
}; };
await axios.post(lunaseadevice, updata); await axios.post(lunaseaurl, updata);
return okMsg; return okMsg;
} }

@ -0,0 +1,97 @@
const NotificationProvider = require("./notification-provider");
const axios = require("axios");
const { UP, DOWN } = require("../../src/util");
const opsgenieAlertsUrlEU = "https://api.eu.opsgenie.com/v2/alerts";
const opsgenieAlertsUrlUS = "https://api.opsgenie.com/v2/alerts";
let okMsg = "Sent Successfully.";
class Opsgenie extends NotificationProvider {
name = "Opsgenie";
/**
* @inheritdoc
*/
async send(notification, msg, monitorJSON = null, heartbeatJSON = null) {
let opsgenieAlertsUrl;
let priority = (notification.opsgeniePriority == "") ? 3 : notification.opsgeniePriority;
const textMsg = "Uptime Kuma Alert";
try {
switch (notification.opsgenieRegion) {
case "US":
opsgenieAlertsUrl = opsgenieAlertsUrlUS;
break;
case "EU":
opsgenieAlertsUrl = opsgenieAlertsUrlEU;
break;
default:
opsgenieAlertsUrl = opsgenieAlertsUrlUS;
}
if (heartbeatJSON == null) {
let notificationTestAlias = "uptime-kuma-notification-test";
let data = {
"message": msg,
"alias": notificationTestAlias,
"source": "Uptime Kuma",
"priority": "P5"
};
return this.post(notification, opsgenieAlertsUrl, data);
}
if (heartbeatJSON.status === DOWN) {
let data = {
"message": monitorJSON ? textMsg + `: ${monitorJSON.name}` : textMsg,
"alias": monitorJSON.name,
"description": msg,
"source": "Uptime Kuma",
"priority": `P${priority}`
};
return this.post(notification, opsgenieAlertsUrl, data);
}
if (heartbeatJSON.status === UP) {
let opsgenieAlertsCloseUrl = `${opsgenieAlertsUrl}/${encodeURIComponent(monitorJSON.name)}/close?identifierType=alias`;
let data = {
"source": "Uptime Kuma",
};
return this.post(notification, opsgenieAlertsCloseUrl, data);
}
} catch (error) {
this.throwGeneralAxiosError(error);
}
}
/**
*
* @param {BeanModel} notification
* @param {string} url Request url
* @param {Object} data Request body
* @returns {Promise<string>}
*/
async post(notification, url, data) {
let config = {
headers: {
"Content-Type": "application/json",
"Authorization": `GenieKey ${notification.opsgenieApiKey}`,
}
};
let res = await axios.post(url, data, config);
if (res.status == null) {
return "Opsgenie notification failed with invalid response!";
}
if (res.status < 200 || res.status >= 300) {
return `Opsgenie notification failed with status code ${res.status}`;
}
return okMsg;
}
}
module.exports = Opsgenie;

@ -0,0 +1,91 @@
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 PagerTree extends NotificationProvider {
name = "PagerTree";
/**
* @inheritdoc
*/
async send(notification, msg, monitorJSON = null, heartbeatJSON = null) {
try {
if (heartbeatJSON == null) {
// general messages
return this.postNotification(notification, msg, monitorJSON, heartbeatJSON);
}
if (heartbeatJSON.status === UP && notification.pagertreeAutoResolve === "resolve") {
return this.postNotification(notification, null, monitorJSON, heartbeatJSON, notification.pagertreeAutoResolve);
}
if (heartbeatJSON.status === DOWN) {
const title = `Uptime Kuma Monitor "${monitorJSON.name}" is DOWN`;
return this.postNotification(notification, title, monitorJSON, heartbeatJSON);
}
} 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("PagerTree notification failed with invalid response!");
}
if (result.status < 200 || result.status >= 300) {
throw new Error("PagerTree notification failed with status code " + result.status);
}
}
/**
* Send the message
* @param {BeanModel} notification Message title
* @param {string} title Message title
* @param {Object} monitorJSON Monitor details (For Up/Down only)
* @param {?string} eventAction Action event for PagerTree (create, resolve)
* @returns {string}
*/
async postNotification(notification, title, monitorJSON, heartbeatJSON, eventAction = "create") {
if (eventAction == null) {
return "No action required";
}
const options = {
method: "POST",
url: notification.pagertreeIntegrationUrl,
headers: { "Content-Type": "application/json" },
data: {
event_type: eventAction,
id: heartbeatJSON?.monitorID || "uptime-kuma",
title: title,
urgency: notification.pagertreeUrgency,
heartbeat: heartbeatJSON,
monitor: monitorJSON
}
};
const baseURL = await setting("primaryBaseURL");
if (baseURL && monitorJSON) {
options.client = "Uptime Kuma";
options.client_url = baseURL + getMonitorRelativeURL(monitorJSON.id);
}
let result = await axios.request(options);
this.checkResult(result);
if (result.statusText != null) {
return "PagerTree notification succeed: " + result.statusText;
}
return successMessage;
}
}
module.exports = PagerTree;

@ -0,0 +1,41 @@
const NotificationProvider = require("./notification-provider");
const axios = require("axios");
class Twilio extends NotificationProvider {
name = "twilio";
async send(notification, msg, monitorJSON = null, heartbeatJSON = null) {
let okMsg = "Sent Successfully.";
let accountSID = notification.twilioAccountSID;
let authToken = notification.twilioAuthToken;
try {
let config = {
headers: {
"Content-Type": "application/x-www-form-urlencoded;charset=utf-8",
"Authorization": "Basic " + Buffer.from(accountSID + ":" + authToken).toString("base64"),
}
};
let data = new URLSearchParams();
data.append("To", notification.twilioToNumber);
data.append("From", notification.twilioFromNumber);
data.append("Body", msg);
let url = "https://api.twilio.com/2010-04-01/Accounts/" + accountSID + "/Messages.json";
await axios.post(url, data, config);
return okMsg;
} catch (error) {
this.throwGeneralAxiosError(error);
}
}
}
module.exports = Twilio;

@ -23,7 +23,9 @@ const Mattermost = require("./notification-providers/mattermost");
const Ntfy = require("./notification-providers/ntfy"); const Ntfy = require("./notification-providers/ntfy");
const Octopush = require("./notification-providers/octopush"); const Octopush = require("./notification-providers/octopush");
const OneBot = require("./notification-providers/onebot"); const OneBot = require("./notification-providers/onebot");
const Opsgenie = require("./notification-providers/opsgenie");
const PagerDuty = require("./notification-providers/pagerduty"); const PagerDuty = require("./notification-providers/pagerduty");
const PagerTree = require("./notification-providers/pagertree");
const PromoSMS = require("./notification-providers/promosms"); const PromoSMS = require("./notification-providers/promosms");
const Pushbullet = require("./notification-providers/pushbullet"); const Pushbullet = require("./notification-providers/pushbullet");
const PushDeer = require("./notification-providers/pushdeer"); const PushDeer = require("./notification-providers/pushdeer");
@ -40,6 +42,7 @@ const Stackfield = require("./notification-providers/stackfield");
const Teams = require("./notification-providers/teams"); const Teams = require("./notification-providers/teams");
const TechulusPush = require("./notification-providers/techulus-push"); const TechulusPush = require("./notification-providers/techulus-push");
const Telegram = require("./notification-providers/telegram"); const Telegram = require("./notification-providers/telegram");
const Twilio = require("./notification-providers/twilio");
const Splunk = require("./notification-providers/splunk"); const Splunk = require("./notification-providers/splunk");
const Webhook = require("./notification-providers/webhook"); const Webhook = require("./notification-providers/webhook");
const WeCom = require("./notification-providers/wecom"); const WeCom = require("./notification-providers/wecom");
@ -82,7 +85,9 @@ class Notification {
new Ntfy(), new Ntfy(),
new Octopush(), new Octopush(),
new OneBot(), new OneBot(),
new Opsgenie(),
new PagerDuty(), new PagerDuty(),
new PagerTree(),
new PromoSMS(), new PromoSMS(),
new Pushbullet(), new Pushbullet(),
new PushDeer(), new PushDeer(),
@ -101,6 +106,7 @@ class Notification {
new Teams(), new Teams(),
new TechulusPush(), new TechulusPush(),
new Telegram(), new Telegram(),
new Twilio(),
new Splunk(), new Splunk(),
new Webhook(), new Webhook(),
new WeCom(), new WeCom(),

@ -132,6 +132,9 @@ class Proxy {
...httpAgentOptions, ...httpAgentOptions,
...httpsAgentOptions, ...httpsAgentOptions,
...proxyOptions, ...proxyOptions,
tls: {
rejectUnauthorized: httpsAgentOptions.rejectUnauthorized,
},
}); });
httpAgent = agent; httpAgent = agent;

@ -54,6 +54,13 @@ const loginRateLimiter = new KumaRateLimiter({
errorMessage: "Too frequently, try again later." errorMessage: "Too frequently, try again later."
}); });
const apiRateLimiter = new KumaRateLimiter({
tokensPerInterval: 60,
interval: "minute",
fireImmediately: true,
errorMessage: "Too frequently, try again later."
});
const twoFaRateLimiter = new KumaRateLimiter({ const twoFaRateLimiter = new KumaRateLimiter({
tokensPerInterval: 30, tokensPerInterval: 30,
interval: "minute", interval: "minute",
@ -63,5 +70,6 @@ const twoFaRateLimiter = new KumaRateLimiter({
module.exports = { module.exports = {
loginRateLimiter, loginRateLimiter,
apiRateLimiter,
twoFaRateLimiter, twoFaRateLimiter,
}; };

@ -7,8 +7,10 @@ const dayjs = require("dayjs");
const { UP, MAINTENANCE, DOWN, PENDING, flipStatus, log } = require("../../src/util"); const { UP, MAINTENANCE, DOWN, PENDING, flipStatus, log } = require("../../src/util");
const StatusPage = require("../model/status_page"); const StatusPage = require("../model/status_page");
const { UptimeKumaServer } = require("../uptime-kuma-server"); const { UptimeKumaServer } = require("../uptime-kuma-server");
const { UptimeCacheList } = require("../uptime-cache-list");
const { makeBadge } = require("badge-maker"); const { makeBadge } = require("badge-maker");
const { badgeConstants } = require("../config"); const { badgeConstants } = require("../config");
const { Prometheus } = require("../prometheus");
let router = express.Router(); let router = express.Router();
@ -36,7 +38,7 @@ router.get("/api/push/:pushToken", async (request, response) => {
let pushToken = request.params.pushToken; let pushToken = request.params.pushToken;
let msg = request.query.msg || "OK"; let msg = request.query.msg || "OK";
let ping = request.query.ping || null; let ping = parseInt(request.query.ping) || null;
let statusString = request.query.status || "up"; let statusString = request.query.status || "up";
let status = (statusString === "up") ? UP : DOWN; let status = (statusString === "up") ? UP : DOWN;
@ -86,7 +88,9 @@ router.get("/api/push/:pushToken", async (request, response) => {
await R.store(bean); await R.store(bean);
io.to(monitor.user_id).emit("heartbeat", bean.toJSON()); io.to(monitor.user_id).emit("heartbeat", bean.toJSON());
UptimeCacheList.clearCache(monitor.id);
Monitor.sendStats(io, monitor.id, monitor.user_id); Monitor.sendStats(io, monitor.id, monitor.user_id);
new Prometheus(monitor).update(bean, undefined);
response.json({ response.json({
ok: true, ok: true,
@ -145,7 +149,11 @@ router.get("/api/badge/:id/status", cache("5 minutes"), async (request, response
const heartbeat = await Monitor.getPreviousHeartbeat(requestedMonitorId); const heartbeat = await Monitor.getPreviousHeartbeat(requestedMonitorId);
const state = overrideValue !== undefined ? overrideValue : heartbeat.status; const state = overrideValue !== undefined ? overrideValue : heartbeat.status;
badgeValues.label = label ?? "Status"; if (label === undefined) {
badgeValues.label = "Status";
} else {
badgeValues.label = label;
}
switch (state) { switch (state) {
case DOWN: case DOWN:
badgeValues.color = downColor; badgeValues.color = downColor;
@ -222,7 +230,7 @@ router.get("/api/badge/:id/uptime/:duration?", cache("5 minutes"), async (reques
); );
// limit the displayed uptime percentage to four (two, when displayed as percent) decimal digits // limit the displayed uptime percentage to four (two, when displayed as percent) decimal digits
const cleanUptime = parseFloat(uptime.toPrecision(4)); const cleanUptime = (uptime * 100).toPrecision(4);
// use a given, custom color or calculate one based on the uptime value // use a given, custom color or calculate one based on the uptime value
badgeValues.color = color ?? percentageToColor(uptime); badgeValues.color = color ?? percentageToColor(uptime);
@ -233,7 +241,7 @@ router.get("/api/badge/:id/uptime/:duration?", cache("5 minutes"), async (reques
labelPrefix, labelPrefix,
label ?? `Uptime (${requestedDuration}${labelSuffix})`, label ?? `Uptime (${requestedDuration}${labelSuffix})`,
]); ]);
badgeValues.message = filterAndJoin([ prefix, `${cleanUptime * 100}`, suffix ]); badgeValues.message = filterAndJoin([ prefix, cleanUptime, suffix ]);
} }
// build the SVG based on given values // build the SVG based on given values

@ -87,7 +87,7 @@ log.debug("server", "Importing Background Jobs");
const { initBackgroundJobs, stopBackgroundJobs } = require("./jobs"); const { initBackgroundJobs, stopBackgroundJobs } = require("./jobs");
const { loginRateLimiter, twoFaRateLimiter } = require("./rate-limiter"); const { loginRateLimiter, twoFaRateLimiter } = require("./rate-limiter");
const { basicAuth } = require("./auth"); const { apiAuth } = require("./auth");
const { login } = require("./auth"); const { login } = require("./auth");
const passwordHash = require("./password-hash"); const passwordHash = require("./password-hash");
@ -129,7 +129,7 @@ if (config.demoMode) {
} }
// Must be after io instantiation // Must be after io instantiation
const { sendNotificationList, sendHeartbeatList, sendImportantHeartbeatList, sendInfo, sendProxyList, sendDockerHostList } = require("./client"); const { sendNotificationList, sendHeartbeatList, sendImportantHeartbeatList, sendInfo, sendProxyList, sendDockerHostList, sendAPIKeyList } = require("./client");
const { statusPageSocketHandler } = require("./socket-handlers/status-page-socket-handler"); const { statusPageSocketHandler } = require("./socket-handlers/status-page-socket-handler");
const databaseSocketHandler = require("./socket-handlers/database-socket-handler"); const databaseSocketHandler = require("./socket-handlers/database-socket-handler");
const TwoFA = require("./2fa"); const TwoFA = require("./2fa");
@ -138,10 +138,12 @@ const { cloudflaredSocketHandler, autoStart: cloudflaredAutoStart, stop: cloudfl
const { proxySocketHandler } = require("./socket-handlers/proxy-socket-handler"); const { proxySocketHandler } = require("./socket-handlers/proxy-socket-handler");
const { dockerSocketHandler } = require("./socket-handlers/docker-socket-handler"); const { dockerSocketHandler } = require("./socket-handlers/docker-socket-handler");
const { maintenanceSocketHandler } = require("./socket-handlers/maintenance-socket-handler"); const { maintenanceSocketHandler } = require("./socket-handlers/maintenance-socket-handler");
const { apiKeySocketHandler } = require("./socket-handlers/api-key-socket-handler");
const { generalSocketHandler } = require("./socket-handlers/general-socket-handler"); const { generalSocketHandler } = require("./socket-handlers/general-socket-handler");
const { Settings } = require("./settings"); const { Settings } = require("./settings");
const { CacheableDnsHttpAgent } = require("./cacheable-dns-http-agent"); const { CacheableDnsHttpAgent } = require("./cacheable-dns-http-agent");
const { pluginsHandler } = require("./socket-handlers/plugins-handler"); const { pluginsHandler } = require("./socket-handlers/plugins-handler");
const apicache = require("./modules/apicache");
app.use(express.json()); app.use(express.json());
@ -229,7 +231,7 @@ let needSetup = false;
// Prometheus API metrics /metrics // Prometheus API metrics /metrics
// With Basic Auth using the first user's username/password // With Basic Auth using the first user's username/password
app.get("/metrics", basicAuth, prometheusAPIMetrics()); app.get("/metrics", apiAuth, prometheusAPIMetrics());
app.use("/", expressStaticGzip("dist", { app.use("/", expressStaticGzip("dist", {
enableBrotli: true, enableBrotli: true,
@ -686,6 +688,9 @@ let needSetup = false;
bean.headers = monitor.headers; bean.headers = monitor.headers;
bean.basic_auth_user = monitor.basic_auth_user; bean.basic_auth_user = monitor.basic_auth_user;
bean.basic_auth_pass = monitor.basic_auth_pass; bean.basic_auth_pass = monitor.basic_auth_pass;
bean.tlsCa = monitor.tlsCa;
bean.tlsCert = monitor.tlsCert;
bean.tlsKey = monitor.tlsKey;
bean.interval = monitor.interval; bean.interval = monitor.interval;
bean.retryInterval = monitor.retryInterval; bean.retryInterval = monitor.retryInterval;
bean.resendInterval = monitor.resendInterval; bean.resendInterval = monitor.resendInterval;
@ -883,6 +888,9 @@ let needSetup = false;
socket.userID, socket.userID,
]); ]);
// Fix #2880
apicache.clear();
callback({ callback({
ok: true, ok: true,
msg: "Deleted Successfully.", msg: "Deleted Successfully.",
@ -1503,6 +1511,7 @@ let needSetup = false;
proxySocketHandler(socket); proxySocketHandler(socket);
dockerSocketHandler(socket); dockerSocketHandler(socket);
maintenanceSocketHandler(socket); maintenanceSocketHandler(socket);
apiKeySocketHandler(socket);
generalSocketHandler(socket, server); generalSocketHandler(socket, server);
pluginsHandler(socket, server); pluginsHandler(socket, server);
@ -1611,6 +1620,7 @@ async function afterLogin(socket, user) {
sendNotificationList(socket); sendNotificationList(socket);
sendProxyList(socket); sendProxyList(socket);
sendDockerHostList(socket); sendDockerHostList(socket);
sendAPIKeyList(socket);
await sleep(500); await sleep(500);

@ -0,0 +1,150 @@
const { checkLogin } = require("../util-server");
const { log } = require("../../src/util");
const { R } = require("redbean-node");
const { nanoid } = require("nanoid");
const passwordHash = require("../password-hash");
const apicache = require("../modules/apicache");
const APIKey = require("../model/api_key");
const { Settings } = require("../settings");
const { sendAPIKeyList } = require("../client");
/**
* Handlers for Maintenance
* @param {Socket} socket Socket.io instance
*/
module.exports.apiKeySocketHandler = (socket) => {
// Add a new api key
socket.on("addAPIKey", async (key, callback) => {
try {
checkLogin(socket);
let clearKey = nanoid(40);
let hashedKey = passwordHash.generate(clearKey);
key["key"] = hashedKey;
let bean = await APIKey.save(key, socket.userID);
log.debug("apikeys", "Added API Key");
log.debug("apikeys", key);
// Append key ID and prefix to start of key seperated by _, used to get
// correct hash when validating key.
let formattedKey = "uk" + bean.id + "_" + clearKey;
await sendAPIKeyList(socket);
// Enable API auth if the user creates a key, otherwise only basic
// auth will be used for API.
await Settings.set("apiKeysEnabled", true);
callback({
ok: true,
msg: "Added Successfully.",
key: formattedKey,
keyID: bean.id,
});
} catch (e) {
callback({
ok: false,
msg: e.message,
});
}
});
socket.on("getAPIKeyList", async (callback) => {
try {
checkLogin(socket);
await sendAPIKeyList(socket);
callback({
ok: true,
});
} catch (e) {
console.error(e);
callback({
ok: false,
msg: e.message,
});
}
});
socket.on("deleteAPIKey", async (keyID, callback) => {
try {
checkLogin(socket);
log.debug("apikeys", `Deleted API Key: ${keyID} User ID: ${socket.userID}`);
await R.exec("DELETE FROM api_key WHERE id = ? AND user_id = ? ", [
keyID,
socket.userID,
]);
apicache.clear();
callback({
ok: true,
msg: "Deleted Successfully.",
});
await sendAPIKeyList(socket);
} catch (e) {
callback({
ok: false,
msg: e.message,
});
}
});
socket.on("disableAPIKey", async (keyID, callback) => {
try {
checkLogin(socket);
log.debug("apikeys", `Disabled Key: ${keyID} User ID: ${socket.userID}`);
await R.exec("UPDATE api_key SET active = 0 WHERE id = ? ", [
keyID,
]);
apicache.clear();
callback({
ok: true,
msg: "Disabled Successfully.",
});
await sendAPIKeyList(socket);
} catch (e) {
callback({
ok: false,
msg: e.message,
});
}
});
socket.on("enableAPIKey", async (keyID, callback) => {
try {
checkLogin(socket);
log.debug("apikeys", `Enabled Key: ${keyID} User ID: ${socket.userID}`);
await R.exec("UPDATE api_key SET active = 1 WHERE id = ? ", [
keyID,
]);
apicache.clear();
callback({
ok: true,
msg: "Enabled Successfully",
});
await sendAPIKeyList(socket);
} catch (e) {
callback({
ok: false,
msg: e.message,
});
}
});
};

@ -5,7 +5,6 @@ const apicache = require("../modules/apicache");
const { UptimeKumaServer } = require("../uptime-kuma-server"); const { UptimeKumaServer } = require("../uptime-kuma-server");
const Maintenance = require("../model/maintenance"); const Maintenance = require("../model/maintenance");
const server = UptimeKumaServer.getInstance(); const server = UptimeKumaServer.getInstance();
const MaintenanceTimeslot = require("../model/maintenance_timeslot");
/** /**
* Handlers for Maintenance * Handlers for Maintenance
@ -19,10 +18,12 @@ module.exports.maintenanceSocketHandler = (socket) => {
log.debug("maintenance", maintenance); log.debug("maintenance", maintenance);
let bean = Maintenance.jsonToBean(R.dispense("maintenance"), maintenance); let bean = await Maintenance.jsonToBean(R.dispense("maintenance"), maintenance);
bean.user_id = socket.userID; bean.user_id = socket.userID;
let maintenanceID = await R.store(bean); let maintenanceID = await R.store(bean);
await MaintenanceTimeslot.generateTimeslot(bean);
server.maintenanceList[maintenanceID] = bean;
await bean.run(true);
await server.sendMaintenanceList(socket); await server.sendMaintenanceList(socket);
@ -45,17 +46,15 @@ module.exports.maintenanceSocketHandler = (socket) => {
try { try {
checkLogin(socket); checkLogin(socket);
let bean = await R.findOne("maintenance", " id = ? ", [ maintenance.id ]); let bean = server.getMaintenance(maintenance.id);
if (bean.user_id !== socket.userID) { if (bean.user_id !== socket.userID) {
throw new Error("Permission denied."); throw new Error("Permission denied.");
} }
Maintenance.jsonToBean(bean, maintenance); await Maintenance.jsonToBean(bean, maintenance);
await R.store(bean); await R.store(bean);
await MaintenanceTimeslot.generateTimeslot(bean, null, true); await bean.run(true);
await server.sendMaintenanceList(socket); await server.sendMaintenanceList(socket);
callback({ callback({
@ -236,6 +235,7 @@ module.exports.maintenanceSocketHandler = (socket) => {
log.debug("maintenance", `Delete Maintenance: ${maintenanceID} User ID: ${socket.userID}`); log.debug("maintenance", `Delete Maintenance: ${maintenanceID} User ID: ${socket.userID}`);
if (maintenanceID in server.maintenanceList) { if (maintenanceID in server.maintenanceList) {
server.maintenanceList[maintenanceID].stop();
delete server.maintenanceList[maintenanceID]; delete server.maintenanceList[maintenanceID];
} }
@ -267,9 +267,15 @@ module.exports.maintenanceSocketHandler = (socket) => {
log.debug("maintenance", `Pause Maintenance: ${maintenanceID} User ID: ${socket.userID}`); log.debug("maintenance", `Pause Maintenance: ${maintenanceID} User ID: ${socket.userID}`);
await R.exec("UPDATE maintenance SET active = 0 WHERE id = ? ", [ let maintenance = server.getMaintenance(maintenanceID);
maintenanceID,
]); if (!maintenance) {
throw new Error("Maintenance not found");
}
maintenance.active = false;
await R.store(maintenance);
maintenance.stop();
apicache.clear(); apicache.clear();
@ -294,9 +300,15 @@ module.exports.maintenanceSocketHandler = (socket) => {
log.debug("maintenance", `Resume Maintenance: ${maintenanceID} User ID: ${socket.userID}`); log.debug("maintenance", `Resume Maintenance: ${maintenanceID} User ID: ${socket.userID}`);
await R.exec("UPDATE maintenance SET active = 1 WHERE id = ? ", [ let maintenance = server.getMaintenance(maintenanceID);
maintenanceID,
]); if (!maintenance) {
throw new Error("Maintenance not found");
}
maintenance.active = true;
await R.store(maintenance);
await maintenance.run();
apicache.clear(); apicache.clear();

@ -276,7 +276,7 @@ module.exports.statusPageSocketHandler = (socket) => {
let statusPage = R.dispense("status_page"); let statusPage = R.dispense("status_page");
statusPage.slug = slug; statusPage.slug = slug;
statusPage.title = title; statusPage.title = title;
statusPage.theme = "light"; statusPage.theme = "auto";
statusPage.icon = ""; statusPage.icon = "";
await R.store(statusPage); await R.store(statusPage);

@ -47,8 +47,6 @@ class UptimeKumaServer {
*/ */
indexHTML = ""; indexHTML = "";
generateMaintenanceTimeslotsInterval = undefined;
/** /**
* Plugins Manager * Plugins Manager
* @type {PluginsManager} * @type {PluginsManager}
@ -74,6 +72,7 @@ class UptimeKumaServer {
// SSL // SSL
const sslKey = args["ssl-key"] || process.env.UPTIME_KUMA_SSL_KEY || process.env.SSL_KEY || undefined; const sslKey = args["ssl-key"] || process.env.UPTIME_KUMA_SSL_KEY || process.env.SSL_KEY || undefined;
const sslCert = args["ssl-cert"] || process.env.UPTIME_KUMA_SSL_CERT || process.env.SSL_CERT || undefined; const sslCert = args["ssl-cert"] || process.env.UPTIME_KUMA_SSL_CERT || process.env.SSL_CERT || undefined;
const sslKeyPassphrase = args["ssl-key-passphrase"] || process.env.UPTIME_KUMA_SSL_KEY_PASSPHRASE || process.env.SSL_KEY_PASSPHRASE || undefined;
log.info("server", "Creating express and socket.io instance"); log.info("server", "Creating express and socket.io instance");
this.app = express(); this.app = express();
@ -81,7 +80,8 @@ class UptimeKumaServer {
log.info("server", "Server Type: HTTPS"); log.info("server", "Server Type: HTTPS");
this.httpServer = https.createServer({ this.httpServer = https.createServer({
key: fs.readFileSync(sslKey), key: fs.readFileSync(sslKey),
cert: fs.readFileSync(sslCert) cert: fs.readFileSync(sslCert),
passphrase: sslKeyPassphrase,
}, this.app); }, this.app);
} else { } else {
log.info("server", "Server Type: HTTP"); log.info("server", "Server Type: HTTP");
@ -110,8 +110,7 @@ class UptimeKumaServer {
log.debug("DEBUG", "Timezone: " + process.env.TZ); log.debug("DEBUG", "Timezone: " + process.env.TZ);
log.debug("DEBUG", "Current Time: " + dayjs.tz().format()); log.debug("DEBUG", "Current Time: " + dayjs.tz().format());
await this.generateMaintenanceTimeslots(); await this.loadMaintenanceList();
this.generateMaintenanceTimeslotsInterval = setInterval(this.generateMaintenanceTimeslots, 60 * 1000);
} }
/** /**
@ -173,16 +172,33 @@ class UptimeKumaServer {
*/ */
async getMaintenanceJSONList(userID) { async getMaintenanceJSONList(userID) {
let result = {}; let result = {};
for (let maintenanceID in this.maintenanceList) {
result[maintenanceID] = await this.maintenanceList[maintenanceID].toJSON();
}
return result;
}
/**
* Load maintenance list and run
* @param userID
* @returns {Promise<void>}
*/
async loadMaintenanceList(userID) {
let maintenanceList = await R.findAll("maintenance", " ORDER BY end_date DESC, title", [
let maintenanceList = await R.find("maintenance", " user_id = ? ORDER BY end_date DESC, title", [
userID,
]); ]);
for (let maintenance of maintenanceList) { for (let maintenance of maintenanceList) {
result[maintenance.id] = await maintenance.toJSON(); this.maintenanceList[maintenance.id] = maintenance;
maintenance.run(this);
}
} }
return result; getMaintenance(maintenanceID) {
if (this.maintenanceList[maintenanceID]) {
return this.maintenanceList[maintenanceID];
}
return null;
} }
/** /**
@ -238,7 +254,7 @@ class UptimeKumaServer {
* Attempt to get the current server timezone * Attempt to get the current server timezone
* If this fails, fall back to environment variables and then make a * If this fails, fall back to environment variables and then make a
* guess. * guess.
* @returns {string} * @returns {Promise<string>}
*/ */
async getTimezone() { async getTimezone() {
let timezone = await Settings.get("serverTimezone"); let timezone = await Settings.get("serverTimezone");
@ -269,23 +285,9 @@ class UptimeKumaServer {
dayjs.tz.setDefault(timezone); dayjs.tz.setDefault(timezone);
} }
/** Load the timeslots for maintenance */
async generateMaintenanceTimeslots() {
let list = await R.find("maintenance_timeslot", " generated_next = 0 AND start_date <= DATETIME('now') ");
for (let maintenanceTimeslot of list) {
let maintenance = await maintenanceTimeslot.maintenance;
await MaintenanceTimeslot.generateTimeslot(maintenance, maintenanceTimeslot.end_date, false);
maintenanceTimeslot.generated_next = true;
await R.store(maintenanceTimeslot);
}
}
/** Stop the server */ /** Stop the server */
async stop() { async stop() {
clearTimeout(this.generateMaintenanceTimeslotsInterval);
} }
loadPlugins() { loadPlugins() {
@ -334,5 +336,4 @@ module.exports = {
}; };
// Must be at the end // Must be at the end
const MaintenanceTimeslot = require("./model/maintenance_timeslot");
const { MonitorType } = require("./monitor-types/monitor-type"); const { MonitorType } = require("./monitor-types/monitor-type");

@ -87,7 +87,10 @@ exports.ping = async (hostname, size = 56) => {
return await exports.pingAsync(hostname, false, size); return await exports.pingAsync(hostname, false, size);
} catch (e) { } catch (e) {
// If the host cannot be resolved, try again with ipv6 // If the host cannot be resolved, try again with ipv6
if (e.message.includes("service not known")) { console.debug("ping", "IPv6 error message: " + e.message);
// As node-ping does not report a specific error for this, try again if it is an empty message with ipv6 no matter what.
if (!e.message) {
return await exports.pingAsync(hostname, true, size); return await exports.pingAsync(hostname, true, size);
} else { } else {
throw e; throw e;
@ -319,19 +322,26 @@ exports.postgresQuery = function (connectionString, query) {
* Run a query on MySQL/MariaDB * Run a query on MySQL/MariaDB
* @param {string} connectionString The database connection string * @param {string} connectionString The database connection string
* @param {string} query The query to validate the database with * @param {string} query The query to validate the database with
* @returns {Promise<(string[]|Object[]|Object)>} * @returns {Promise<(string)>}
*/ */
exports.mysqlQuery = function (connectionString, query) { exports.mysqlQuery = function (connectionString, query) {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
const connection = mysql.createConnection(connectionString); const connection = mysql.createConnection(connectionString);
connection.promise().query(query)
.then(res => { connection.on("error", (err) => {
resolve(res);
})
.catch(err => {
reject(err); reject(err);
}) });
.finally(() => {
connection.query(query, (err, res) => {
if (err) {
reject(err);
} else {
if (Array.isArray(res)) {
resolve("Rows: " + res.length);
} else {
resolve("No Error, but the result is not an array. Type: " + typeof res);
}
}
connection.destroy(); connection.destroy();
}); });
}); });
@ -405,6 +415,9 @@ exports.redisPingAsync = function (dsn) {
}); });
client.connect().then(() => { client.connect().then(() => {
client.ping().then((res, err) => { client.ping().then((res, err) => {
if (client.isOpen) {
client.disconnect();
}
if (err) { if (err) {
reject(err); reject(err);
} else { } else {

@ -556,6 +556,31 @@ h5.settings-subheading::after {
border-bottom: 1px solid $dark-border-color; border-bottom: 1px solid $dark-border-color;
} }
$shadow-box-padding: 20px;
.shadow-box-with-fixed-bottom-bar {
padding-top: $shadow-box-padding;
padding-bottom: 0;
padding-right: $shadow-box-padding;
padding-left: $shadow-box-padding;
}
.fixed-bottom-bar {
position: sticky;
bottom: 0;
margin-left: -$shadow-box-padding;
margin-right: -$shadow-box-padding;
z-index: 100;
background-color: rgba(white, 0.2);
backdrop-filter: blur(2px);
border-radius: 0 0 10px 10px;
.dark & {
background-color: rgba($dark-header-bg, 0.9);
}
}
// Localization // Localization
@import "localization.scss"; @import "localization.scss";

@ -0,0 +1,229 @@
<template>
<form @submit.prevent="submit">
<div ref="keyaddmodal" class="modal fade" tabindex="-1" data-bs-backdrop="static">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title">
{{ $t("Add API Key") }}
</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close" />
</div>
<div class="modal-body">
<!-- Name -->
<div class="mb-3">
<label for="name" class="form-label">{{ $t("Name") }}</label>
<input
id="name" v-model="key.name" type="text" class="form-control"
required
>
</div>
<!-- Expiry -->
<div class="my-3">
<label class="form-label">{{ $t("Expiry date") }}</label>
<div class="d-flex flex-row align-items-center">
<div class="col-6">
<Datepicker
v-model="key.expires"
:dark="$root.isDark"
:monthChangeOnScroll="false"
:minDate="minDate"
format="yyyy-MM-dd HH:mm"
modelType="yyyy-MM-dd HH:mm:ss"
:required="!noExpire"
:disabled="noExpire"
/>
</div>
<div class="col-6 ms-3">
<div class="form-check mb-0">
<input
id="no-expire" v-model="noExpire" class="form-check-input"
type="checkbox"
>
<label class="form-check-label" for="no-expire">{{
$t("Don't expire")
}}</label>
</div>
</div>
</div>
</div>
<div class="modal-footer">
<button
id="monitor-submit-btn" class="btn btn-primary" type="submit"
:disabled="processing"
>
{{ $t("Generate") }}
</button>
</div>
</div>
</div>
</div>
</div>
<div ref="keymodal" class="modal fade" tabindex="-1" data-bs-backdrop="static">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title">
{{ $t("Key Added") }}
</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close" />
</div>
<div class="modal-body">
<div class="mb-3">
{{ $t("apiKeyAddedMsg") }}
</div>
<div class="mb-3">
<CopyableInput v-model="clearKey" disabled="disabled" />
</div>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-primary" data-bs-dismiss="modal">
{{ $t('Continue') }}
</button>
</div>
</div>
</div>
</div>
</form>
</template>
<script lang="ts">
import { Modal } from "bootstrap";
import { useToast } from "vue-toastification";
import dayjs from "dayjs";
import Datepicker from "@vuepic/vue-datepicker";
import CopyableInput from "./CopyableInput.vue";
const toast = useToast();
export default {
components: {
CopyableInput,
Datepicker
},
props: {},
// emits: [ "added" ],
data() {
return {
keyaddmodal: null,
keymodal: null,
processing: false,
key: {},
dark: (this.$root.theme === "dark"),
minDate: this.$root.date(dayjs()) + " 00:00",
clearKey: null,
noExpire: false,
};
},
mounted() {
this.keyaddmodal = new Modal(this.$refs.keyaddmodal);
this.keymodal = new Modal(this.$refs.keymodal);
},
methods: {
/**
* Show modal
*/
show() {
this.id = null;
this.key = {
name: "",
expires: this.minDate,
active: 1,
};
this.keyaddmodal.show();
},
/** Submit data to server */
async submit() {
this.processing = true;
if (this.noExpire) {
this.key.expires = null;
}
this.$root.addAPIKey(this.key, async (res) => {
this.keyaddmodal.hide();
this.processing = false;
if (res.ok) {
this.clearKey = res.key;
this.keymodal.show();
this.clearForm();
} else {
toast.error(res.msg);
}
});
},
/** Clear Form inputs */
clearForm() {
this.key = {
name: "",
expires: this.minDate,
active: 1,
};
this.noExpire = false;
},
}
};
</script>
<style lang="scss" scoped>
@import "../assets/vars.scss";
.dark {
.modal-dialog .form-text, .modal-dialog p {
color: $dark-font-color;
}
}
.shadow-box {
padding: 20px;
}
textarea {
min-height: 150px;
}
.dark-calendar::-webkit-calendar-picker-indicator {
filter: invert(1);
}
.weekday-picker {
display: flex;
gap: 10px;
& > div {
display: flex;
flex-direction: column;
align-items: center;
width: 40px;
.form-check-inline {
margin-right: 0;
}
}
}
.day-picker {
display: flex;
gap: 10px;
flex-wrap: wrap;
& > div {
display: flex;
flex-direction: column;
align-items: center;
width: 40px;
.form-check-inline {
margin-right: 0;
}
}
}
</style>

@ -4,7 +4,7 @@
<div class="modal-content"> <div class="modal-content">
<div class="modal-header"> <div class="modal-header">
<h5 id="exampleModalLabel" class="modal-title"> <h5 id="exampleModalLabel" class="modal-title">
{{ $t("Confirm") }} {{ title || $t("Confirm") }}
</h5> </h5>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close" /> <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close" />
</div> </div>
@ -15,7 +15,7 @@
<button type="button" class="btn" :class="btnStyle" data-bs-dismiss="modal" @click="yes"> <button type="button" class="btn" :class="btnStyle" data-bs-dismiss="modal" @click="yes">
{{ yesText }} {{ yesText }}
</button> </button>
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal"> <button type="button" class="btn btn-secondary" data-bs-dismiss="modal" @click="no">
{{ noText }} {{ noText }}
</button> </button>
</div> </div>
@ -44,8 +44,13 @@ export default {
type: String, type: String,
default: "No", default: "No",
}, },
/** Title to show on modal. Defaults to translated version of "Config" */
title: {
type: String,
default: null,
}
}, },
emits: [ "yes" ], emits: [ "yes", "no" ],
data: () => ({ data: () => ({
modal: null, modal: null,
}), }),
@ -63,6 +68,12 @@ export default {
yes() { yes() {
this.$emit("yes"); this.$emit("yes");
}, },
/**
* @emits string "no" Notify the parent when No is pressed
*/
no() {
this.$emit("no");
}
}, },
}; };
</script> </script>

@ -13,6 +13,9 @@
:disabled="disabled" :disabled="disabled"
> >
<!-- A hidden textarea for copying text on non-https -->
<textarea ref="hiddenTextarea" style="position: fixed; left: -999999px; top: -999999px;"></textarea>
<a class="btn btn-outline-primary" @click="copyToClipboard(model)"> <a class="btn btn-outline-primary" @click="copyToClipboard(model)">
<font-awesome-icon :icon="icon" /> <font-awesome-icon :icon="icon" />
</a> </a>
@ -111,24 +114,19 @@ export default {
}, 3000); }, 3000);
// navigator clipboard api needs a secure context (https) // navigator clipboard api needs a secure context (https)
// For http, use the text area method (else part)
if (navigator.clipboard && window.isSecureContext) { if (navigator.clipboard && window.isSecureContext) {
// navigator clipboard api method' // navigator clipboard api method'
return navigator.clipboard.writeText(textToCopy); return navigator.clipboard.writeText(textToCopy);
} else { } else {
// text area method // text area method
let textArea = document.createElement("textarea"); let textArea = this.$refs.hiddenTextarea;
textArea.value = textToCopy; textArea.value = textToCopy;
// make the textarea out of viewport
textArea.style.position = "fixed";
textArea.style.left = "-999999px";
textArea.style.top = "-999999px";
document.body.appendChild(textArea);
textArea.focus(); textArea.focus();
textArea.select(); textArea.select();
return new Promise((res, rej) => { return new Promise((res, rej) => {
// here the magic happens // here the magic happens
document.execCommand("copy") ? res() : rej(); document.execCommand("copy") ? res() : rej();
textArea.remove();
}); });
} }
} }

@ -3,16 +3,23 @@
<div v-if="maintenance.strategy === 'manual'" class="timeslot"> <div v-if="maintenance.strategy === 'manual'" class="timeslot">
{{ $t("Manual") }} {{ $t("Manual") }}
</div> </div>
<div v-else-if="maintenance.timeslotList.length > 0" class="timeslot"> <div v-else-if="maintenance.timeslotList.length > 0">
{{ maintenance.timeslotList[0].startDateServerTimezone }} <div class="timeslot">
{{ startDateTime }}
<span class="to">-</span> <span class="to">-</span>
{{ maintenance.timeslotList[0].endDateServerTimezone }} {{ endDateTime }}
(UTC{{ maintenance.timeslotList[0].serverTimezoneOffset }}) </div>
<div class="timeslot">
UTC{{ maintenance.timezoneOffset }} <span v-if="maintenance.timezone !== 'UTC'">{{ maintenance.timezone }}</span>
</div>
</div> </div>
</div> </div>
</template> </template>
<script> <script>
import dayjs from "dayjs";
import { SQL_DATETIME_FORMAT_WITHOUT_SECOND } from "../util.ts";
export default { export default {
props: { props: {
maintenance: { maintenance: {
@ -20,6 +27,14 @@ export default {
required: true required: true
}, },
}, },
computed: {
startDateTime() {
return dayjs(this.maintenance.timeslotList[0].startDate).tz(this.maintenance.timezone).format(SQL_DATETIME_FORMAT_WITHOUT_SECOND);
},
endDateTime() {
return dayjs(this.maintenance.timeslotList[0].endDate).tz(this.maintenance.timezone).format(SQL_DATETIME_FORMAT_WITHOUT_SECOND);
}
},
}; };
</script> </script>
@ -31,6 +46,7 @@ export default {
background-color: rgba(255, 255, 255, 0.5); background-color: rgba(255, 255, 255, 0.5);
border-radius: 20px; border-radius: 20px;
padding: 0 10px; padding: 0 10px;
margin-right: 5px;
.to { .to {
margin: 0 6px; margin: 0 6px;

@ -129,6 +129,7 @@ export default {
"ntfy": "Ntfy", "ntfy": "Ntfy",
"octopush": "Octopush", "octopush": "Octopush",
"OneBot": "OneBot", "OneBot": "OneBot",
"Opsgenie": "Opsgenie",
"PagerDuty": "PagerDuty", "PagerDuty": "PagerDuty",
"pushbullet": "Pushbullet", "pushbullet": "Pushbullet",
"PushByTechulus": "Push by Techulus", "PushByTechulus": "Push by Techulus",
@ -143,6 +144,7 @@ export default {
"stackfield": "Stackfield", "stackfield": "Stackfield",
"teams": "Microsoft Teams", "teams": "Microsoft Teams",
"telegram": "Telegram", "telegram": "Telegram",
"twilio": "Twilio",
"Splunk": "Splunk", "Splunk": "Splunk",
"webhook": "Webhook", "webhook": "Webhook",
"GoAlert": "GoAlert", "GoAlert": "GoAlert",

@ -1,9 +1,33 @@
<template> <template>
<div class="mb-3"> <div class="mb-3">
<label for="lunasea-device" class="form-label">{{ $t("LunaSea Device ID") }}<span style="color: red;"><sup>*</sup></span></label> <label for="lunasea-notification-target" class="form-label">{{ $t("lunaseaTarget") }}<span style="color: red;"><sup>*</sup></span></label>
<input id="lunasea-device" v-model="$parent.notification.lunaseaDevice" type="text" class="form-control" required>
<div class="form-text"> <div class="form-text">
<p><span style="color: red;"><sup>*</sup></span>{{ $t("Required") }}</p> <p>
<select id="lunasea-notification-target" v-model="$parent.notification.lunaseaTarget" class="form-select" required>
<option value="device">{{ $t("lunaseaDeviceID") }}</option>
<option value="user">{{ $t("lunaseaUserID") }}</option>
</select>
</p>
</div>
<div v-if="$parent.notification.lunaseaTarget === 'device'">
<label for="lunasea-device" class="form-label">{{ $t("lunaseaDeviceID") }}<span style="color: red;"><sup>*</sup></span></label>
<input id="lunasea-device" v-model="$parent.notification.lunaseaDevice" type="text" class="form-control">
</div>
<div v-if="$parent.notification.lunaseaTarget === 'user'">
<label for="lunasea-device" class="form-label">{{ $t("lunaseaUserID") }}<span style="color: red;"><sup>*</sup></span></label>
<input id="lunasea-device" v-model="$parent.notification.lunaseaUserID" type="text" class="form-control">
</div> </div>
</div> </div>
</template> </template>
<script lang="ts">
export default {
mounted() {
if (typeof this.$parent.notification.lunaseaTarget === "undefined") {
this.$parent.notification.lunaseaTarget = "device";
}
}
};
</script>

@ -0,0 +1,36 @@
<template>
<div class="mb-3">
<label for="opsgenie-region" class="form-label">{{ $t("Region") }}<span style="color: red;"><sup>*</sup></span></label>
<select id="opsgenie-region" v-model="$parent.notification.opsgenieRegion" class="form-select" required>
<option value="us">
US (Default)
</option>
<option value="eu">
EU
</option>
</select>
</div>
<div class="mb-3">
<label for="opsgenie-apikey" class="form-label">{{ $t("API Key") }}<span style="color: red;"><sup>*</sup></span></label>
<HiddenInput id="opsgenie-apikey" v-model="$parent.notification.opsgenieApiKey" required="true" autocomplete="false"></HiddenInput>
</div>
<div class="mb-3">
<label for="opsgenie-priority" class="form-label">{{ $t("Priority") }}</label>
<input id="opsgenie-priority" v-model="$parent.notification.opsgeniePriority" type="number" class="form-control" min="1" max="5" step="1">
</div>
<div class="form-text">
<span style="color: red;"><sup>*</sup></span>{{ $t("Required") }}
<i18n-t tag="p" keypath="aboutWebhooks" style="margin-top: 8px;">
<a href="https://docs.opsgenie.com/docs/alert-api" target="_blank">https://docs.opsgenie.com/docs/alert-api</a>
</i18n-t>
</div>
</template>
<script>
import HiddenInput from "../HiddenInput.vue";
export default {
components: {
HiddenInput,
},
};
</script>

@ -0,0 +1,31 @@
<template>
<div class="mb-3">
<label for="pagertree-integration-url" class="form-label">{{ $t("pagertreeIntegrationUrl") }}<span style="color: red;"><sup>*</sup></span></label>
<input id="pagertree-integration-url" v-model="$parent.notification.pagertreeIntegrationUrl" type="text" class="form-control" autocomplete="false">
<i18n-t tag="div" keypath="wayToGetPagerTreeIntegrationURL" class="form-text">
<a href="https://pagertree.com/docs/integration-guides/introduction#copy-the-endpoint-url" target="_blank">{{ $t("here") }}</a>
</i18n-t>
</div>
<div class="mb-3">
<label for="pagertree-urgency" class="form-label">{{ $t("pagertreeUrgency") }}</label>
<select id="pagertree-urgency" v-model="$parent.notification.pagertreeUrgency" class="form-select">
<option value="silent">{{ $t("pagertreeSilent") }}</option>
<option value="low">{{ $t("pagertreeLow") }}</option>
<option value="medium" selected="selected">{{ $t("pagertreeMedium") }}</option>
<option value="high">{{ $t("pagertreeHigh") }}</option>
<option value="critical">{{ $t("pagertreeCritical") }}</option>
</select>
</div>
<div class="mb-3">
<label for="pagertree-resolve" class="form-label">{{ $t("pagertreeResolve") }}</label>
<select id="pagertree-resolve" v-model="$parent.notification.pagertreeAutoResolve" class="form-select">
<option value="resolve" selected="selected">{{ $t("pagertreeResolve") }}</option>
<option value="0">{{ $t("pagertreeDoNothing") }}</option>
</select>
</div>
</template>
<script>
export default {
};
</script>

@ -97,7 +97,6 @@
(leave blank for default one)<br /> (leave blank for default one)<br />
{{NAME}}: Service Name<br /> {{NAME}}: Service Name<br />
{{HOSTNAME_OR_URL}}: Hostname or URL<br /> {{HOSTNAME_OR_URL}}: Hostname or URL<br />
{{URL}}: URL<br />
{{STATUS}}: Status<br /> {{STATUS}}: Status<br />
</div> </div>
</div> </div>

@ -0,0 +1,27 @@
<template>
<div class="mb-3">
<label for="twilio-account-sid" class="form-label">{{ $t("Account SID") }}</label>
<input id="twilio-account-sid" v-model="$parent.notification.twilioAccountSID" type="text" class="form-control" required>
</div>
<div class="mb-3">
<label for="twilio-auth-token" class="form-label">{{ $t("Auth Token") }}</label>
<input id="twilio-auth-token" v-model="$parent.notification.twilioAuthToken" type="text" class="form-control" required>
</div>
<div class="mb-3">
<label for="twilio-from-number" class="form-label">{{ $t("From Number") }}</label>
<input id="twilio-from-number" v-model="$parent.notification.twilioFromNumber" type="text" class="form-control" required>
</div>
<div class="mb-3">
<label for="twilio-to-number" class="form-label">{{ $t("To Number") }}</label>
<input id="twilio-to-number" v-model="$parent.notification.twilioToNumber" type="text" class="form-control" required>
</div>
<div class="mb-3">
<i18n-t tag="p" keypath="More info on:" style="margin-top: 8px;">
<a href="https://www.twilio.com/docs/sms" target="_blank">https://www.twilio.com/docs/sms</a>
</i18n-t>
</div>
</template>

@ -21,7 +21,9 @@ import Mattermost from "./Mattermost.vue";
import Ntfy from "./Ntfy.vue"; import Ntfy from "./Ntfy.vue";
import Octopush from "./Octopush.vue"; import Octopush from "./Octopush.vue";
import OneBot from "./OneBot.vue"; import OneBot from "./OneBot.vue";
import Opsgenie from "./Opsgenie.vue";
import PagerDuty from "./PagerDuty.vue"; import PagerDuty from "./PagerDuty.vue";
import PagerTree from "./PagerTree.vue";
import PromoSMS from "./PromoSMS.vue"; import PromoSMS from "./PromoSMS.vue";
import Pushbullet from "./Pushbullet.vue"; import Pushbullet from "./Pushbullet.vue";
import PushDeer from "./PushDeer.vue"; import PushDeer from "./PushDeer.vue";
@ -40,6 +42,7 @@ import STMP from "./SMTP.vue";
import Teams from "./Teams.vue"; import Teams from "./Teams.vue";
import TechulusPush from "./TechulusPush.vue"; import TechulusPush from "./TechulusPush.vue";
import Telegram from "./Telegram.vue"; import Telegram from "./Telegram.vue";
import Twilio from "./Twilio.vue";
import Webhook from "./Webhook.vue"; import Webhook from "./Webhook.vue";
import WeCom from "./WeCom.vue"; import WeCom from "./WeCom.vue";
import GoAlert from "./GoAlert.vue"; import GoAlert from "./GoAlert.vue";
@ -75,7 +78,9 @@ const NotificationFormList = {
"ntfy": Ntfy, "ntfy": Ntfy,
"octopush": Octopush, "octopush": Octopush,
"OneBot": OneBot, "OneBot": OneBot,
"Opsgenie": Opsgenie,
"PagerDuty": PagerDuty, "PagerDuty": PagerDuty,
"PagerTree": PagerTree,
"promosms": PromoSMS, "promosms": PromoSMS,
"pushbullet": Pushbullet, "pushbullet": Pushbullet,
"PushByTechulus": TechulusPush, "PushByTechulus": TechulusPush,
@ -93,6 +98,7 @@ const NotificationFormList = {
"stackfield": Stackfield, "stackfield": Stackfield,
"teams": Teams, "teams": Teams,
"telegram": Telegram, "telegram": Telegram,
"twilio": Twilio,
"Splunk": Splunk, "Splunk": Splunk,
"webhook": Webhook, "webhook": Webhook,
"WeCom": WeCom, "WeCom": WeCom,

@ -0,0 +1,257 @@
<template>
<div>
<div class="add-btn">
<button class="btn btn-primary me-2" type="button" @click="$refs.apiKeyDialog.show()">
<font-awesome-icon icon="plus" /> {{ $t("Add API Key") }}
</button>
</div>
<div>
<span v-if="Object.keys(keyList).length === 0" class="d-flex align-items-center justify-content-center my-3">
{{ $t("No API Keys") }}
</span>
<div
v-for="(item, index) in keyList"
:key="index"
class="item"
:class="item.status"
>
<div class="left-part">
<div
class="circle"
></div>
<div class="info">
<div class="title">{{ item.name }}</div>
<div class="status">
{{ $t("apiKey-" + item.status) }}
</div>
<div class="date">
{{ $t("Created") }}: {{ item.createdDate }}
</div>
<div class="date">
{{ $t("Expires") }}: {{ item.expires || $t("Never") }}
</div>
</div>
</div>
<div class="buttons">
<div class="btn-group" role="group">
<button v-if="item.active" class="btn btn-normal" @click="disableDialog(item.id)">
<font-awesome-icon icon="pause" /> {{ $t("Disable") }}
</button>
<button v-if="!item.active" class="btn btn-primary" @click="enableKey(item.id)">
<font-awesome-icon icon="play" /> {{ $t("Enable") }}
</button>
<button class="btn btn-danger" @click="deleteDialog(item.id)">
<font-awesome-icon icon="trash" /> {{ $t("Delete") }}
</button>
</div>
</div>
</div>
</div>
<div class="text-center mt-3" style="font-size: 13px;">
<a href="https://github.com/louislam/uptime-kuma/wiki/API-Keys" target="_blank">{{ $t("Learn More") }}</a>
</div>
<Confirm ref="confirmPause" :yes-text="$t('Yes')" :no-text="$t('No')" @yes="disableKey">
{{ $t("disableAPIKeyMsg") }}
</Confirm>
<Confirm ref="confirmDelete" btn-style="btn-danger" :yes-text="$t('Yes')" :no-text="$t('No')" @yes="deleteKey">
{{ $t("deleteAPIKeyMsg") }}
</Confirm>
<APIKeyDialog ref="apiKeyDialog" />
</div>
</template>
<script>
import APIKeyDialog from "../../components/APIKeyDialog.vue";
import Confirm from "../Confirm.vue";
import { useToast } from "vue-toastification";
const toast = useToast();
export default {
components: {
APIKeyDialog,
Confirm,
},
data() {
return {
selectedKeyID: null,
};
},
computed: {
keyList() {
let result = Object.values(this.$root.apiKeyList);
return result;
},
},
methods: {
/**
* Show dialog to confirm deletion
* @param {number} keyID ID of monitor that is being deleted
*/
deleteDialog(keyID) {
this.selectedKeyID = keyID;
this.$refs.confirmDelete.show();
},
/**
* Delete a key
*/
deleteKey() {
this.$root.deleteAPIKey(this.selectedKeyID, (res) => {
if (res.ok) {
toast.success(res.msg);
} else {
toast.error(res.msg);
}
});
},
/**
* Show dialog to confirm pause
*/
disableDialog(keyID) {
this.selectedKeyID = keyID;
this.$refs.confirmPause.show();
},
/**
* Pause maintenance
*/
disableKey() {
this.$root.getSocket().emit("disableAPIKey", this.selectedKeyID, (res) => {
this.$root.toastRes(res);
});
},
/**
* Resume maintenance
*/
enableKey(id) {
this.$root.getSocket().emit("enableAPIKey", id, (res) => {
this.$root.toastRes(res);
});
},
},
};
</script>
<style lang="scss" scoped>
@import "../../assets/vars.scss";
.mobile {
.item {
flex-direction: column;
align-items: flex-start;
margin-bottom: 20px;
}
}
.add-btn {
padding-top: 20px;
padding-bottom: 20px;
}
.item {
display: flex;
align-items: center;
gap: 10px;
text-decoration: none;
border-radius: 10px;
transition: all ease-in-out 0.15s;
justify-content: space-between;
padding: 10px;
min-height: 90px;
margin-bottom: 5px;
&:hover {
background-color: $highlight-white;
}
&.active {
.circle {
background-color: $primary;
}
}
&.inactive {
.circle {
background-color: $danger;
}
}
&.expired {
.left-part {
opacity: 0.3;
}
.circle {
background-color: $dark-font-color;
}
}
.left-part {
display: flex;
gap: 12px;
align-items: center;
.circle {
width: 25px;
height: 25px;
border-radius: 50rem;
}
.info {
.title {
font-weight: bold;
font-size: 20px;
}
.status {
font-size: 14px;
}
}
}
.buttons {
display: flex;
gap: 8px;
flex-direction: row-reverse;
.btn-group {
width: 310px;
}
}
}
.date {
margin-top: 5px;
display: block;
font-size: 14px;
background-color: rgba(255, 255, 255, 0.5);
border-radius: 20px;
padding: 0 10px;
width: fit-content;
.dark & {
color: white;
background-color: rgba(255, 255, 255, 0.1);
}
}
.dark {
.item {
&:hover {
background-color: $dark-bg2;
}
}
}
</style>

@ -17,6 +17,7 @@ const languageList = {
"pt-BR": "Português (Brasileiro)", "pt-BR": "Português (Brasileiro)",
"fi": "Suomi", "fi": "Suomi",
"fr-FR": "Français (France)", "fr-FR": "Français (France)",
"he-IL": "עברית",
"hu": "Magyar", "hu": "Magyar",
"hr-HR": "Hrvatski", "hr-HR": "Hrvatski",
"it-IT": "Italiano (Italian)", "it-IT": "Italiano (Italian)",
@ -35,11 +36,13 @@ const languageList = {
"et-EE": "eesti", "et-EE": "eesti",
"vi-VN": "Tiếng Việt", "vi-VN": "Tiếng Việt",
"zh-TW": "繁體中文 (台灣)", "zh-TW": "繁體中文 (台灣)",
"uk-UA": "Український", "uk-UA": "Українська",
"th-TH": "ไทย", "th-TH": "ไทย",
"el-GR": "Ελληνικά", "el-GR": "Ελληνικά",
"yue": "繁體中文 (廣東話 / 粵語)", "yue": "繁體中文 (廣東話 / 粵語)",
"ro": "Limba română", "ro": "Limba română",
"ur": "Urdu",
"ge": "ქართული"
}; };
let messages = { let messages = {
@ -52,7 +55,7 @@ for (let lang in languageList) {
}; };
} }
const rtlLangs = [ "fa", "ar-SY" ]; const rtlLangs = [ "fa", "ar-SY", "ur" ];
export const currentLocale = () => localStorage.locale export const currentLocale = () => localStorage.locale
|| languageList[navigator.language] && navigator.language || languageList[navigator.language] && navigator.language

@ -1,5 +1,5 @@
{ {
"languageName": "العربية", "languageName": "إنجليزي",
"checkEverySecond": "تحقق من كل {0} ثانية", "checkEverySecond": "تحقق من كل {0} ثانية",
"retryCheckEverySecond": "أعد محاولة كل {0} ثانية", "retryCheckEverySecond": "أعد محاولة كل {0} ثانية",
"resendEveryXTimes": "إعادة تقديم كل {0} مرات", "resendEveryXTimes": "إعادة تقديم كل {0} مرات",
@ -15,10 +15,10 @@
"statusMaintenance": "صيانة", "statusMaintenance": "صيانة",
"Schedule maintenance": "جدولة الصيانة", "Schedule maintenance": "جدولة الصيانة",
"Affected Monitors": "الشاشات المتأثرة", "Affected Monitors": "الشاشات المتأثرة",
"Pick Affected Monitors...": "اختيار الشاشات المتأثرة ...", "Pick Affected Monitors...": "اختر الشاشات المتأثرة …",
"Start of maintenance": "بداية الصيانة", "Start of maintenance": "بداية الصيانة",
"All Status Pages": "جميع صفحات الحالة", "All Status Pages": "جميع صفحات الحالة",
"Select status pages...": "حدد صفحات الحالة ...", "Select status pages...": "حدد صفحات الحالة ",
"recurringIntervalMessage": "ركض مرة واحدة كل يوم | قم بالتشغيل مرة واحدة كل يوم {0}", "recurringIntervalMessage": "ركض مرة واحدة كل يوم | قم بالتشغيل مرة واحدة كل يوم {0}",
"affectedMonitorsDescription": "حدد المراقبين المتأثرة بالصيانة الحالية", "affectedMonitorsDescription": "حدد المراقبين المتأثرة بالصيانة الحالية",
"affectedStatusPages": "إظهار رسالة الصيانة هذه على صفحات الحالة المحددة", "affectedStatusPages": "إظهار رسالة الصيانة هذه على صفحات الحالة المحددة",
@ -178,7 +178,7 @@
"Token": "رمز", "Token": "رمز",
"Show URI": "أظهر URI", "Show URI": "أظهر URI",
"Tags": "العلامات", "Tags": "العلامات",
"Add New below or Select...": "أضف جديدًا أدناه أو حدد ...", "Add New below or Select...": "إضافة جديد أدناه أو تحديد …",
"Tag with this name already exist.": "علامة مع هذا الاسم موجود بالفعل.", "Tag with this name already exist.": "علامة مع هذا الاسم موجود بالفعل.",
"Tag with this value already exist.": "علامة مع هذه القيمة موجودة بالفعل.", "Tag with this value already exist.": "علامة مع هذه القيمة موجودة بالفعل.",
"color": "اللون", "color": "اللون",
@ -192,7 +192,7 @@
"Purple": "نفسجي", "Purple": "نفسجي",
"Pink": "لون القرنفل", "Pink": "لون القرنفل",
"Custom": "العادة", "Custom": "العادة",
"Search...": "يبحث...", "Search...": "يبحث",
"Avg. Ping": "متوسط. بينغ", "Avg. Ping": "متوسط. بينغ",
"Avg. Response": "متوسط. إجابة", "Avg. Response": "متوسط. إجابة",
"Entry Page": "صفحة الدخول", "Entry Page": "صفحة الدخول",
@ -238,10 +238,10 @@
"smtpBCC": "BCC", "smtpBCC": "BCC",
"discord": "خلاف", "discord": "خلاف",
"Discord Webhook URL": "Discord Webhook URL", "Discord Webhook URL": "Discord Webhook URL",
"wayToGetDiscordURL": "يمكنك الحصول على هذا عن طريق الانتقال إلى إعدادات الخادم -> التكامل -> إنشاء WebHook", "wayToGetDiscordURL": "يمكنك الحصول على هذا بالانتقال إلى إعدادات الخادم -> عمليات التكامل -> عرض الخطافات على الويب -> خطاف ويب جديد",
"Bot Display Name": "اسم عرض الروبوت", "Bot Display Name": "اسم عرض الروبوت",
"Prefix Custom Message": "بادئة رسالة مخصصة", "Prefix Custom Message": "بادئة رسالة مخصصة",
"Hello @everyone is...": "مرحبًا {'@'} الجميع ...", "Hello @everyone is...": "مرحبًا {'@'} الجميع",
"teams": "فرق Microsoft", "teams": "فرق Microsoft",
"Webhook URL": "Webhook URL", "Webhook URL": "Webhook URL",
"wayToGetTeamsURL": "يمكنك معرفة كيفية إنشاء عنوان URL webhook {0}.", "wayToGetTeamsURL": "يمكنك معرفة كيفية إنشاء عنوان URL webhook {0}.",
@ -352,8 +352,8 @@
"Security": "حماية", "Security": "حماية",
"Steam API Key": "مفتاح API Steam", "Steam API Key": "مفتاح API Steam",
"Shrink Database": "تقلص قاعدة البيانات", "Shrink Database": "تقلص قاعدة البيانات",
"Pick a RR-Type...": "اختر نوع RR ...", "Pick a RR-Type...": "اختر نوع RR ",
"Pick Accepted Status Codes...": "اختيار رموز الحالة المقبولة ...", "Pick Accepted Status Codes...": "اختر أكواد الحالة المقبولة …",
"Default": "تقصير", "Default": "تقصير",
"HTTP Options": "خيارات HTTP", "HTTP Options": "خيارات HTTP",
"Create Incident": "إنشاء حادث", "Create Incident": "إنشاء حادث",
@ -597,7 +597,7 @@
"Domain": "اِختِصاص", "Domain": "اِختِصاص",
"Workstation": "محطة العمل", "Workstation": "محطة العمل",
"disableCloudflaredNoAuthMsg": "أنت في وضع مصادقة لا توجد كلمة مرور غير مطلوبة.", "disableCloudflaredNoAuthMsg": "أنت في وضع مصادقة لا توجد كلمة مرور غير مطلوبة.",
"trustProxyDescription": "الثقة 'x-forward-*'. إذا كنت ترغب في الحصول على IP العميل الصحيح وكوما في الوقت المناسب مثل Nginx أو Apache ، فيجب عليك تمكين ذلك.", "trustProxyDescription": "ثق في رؤوس \"X-Forwarded- *\". إذا كنت ترغب في الحصول على عنوان IP الصحيح للعميل وكان Uptime Kuma خلف وكيل مثل Nginx أو Apache ، فيجب عليك تمكين هذا.",
"wayToGetLineNotifyToken": "يمكنك الحصول على رمز الوصول من {0}", "wayToGetLineNotifyToken": "يمكنك الحصول على رمز الوصول من {0}",
"Examples": "أمثلة", "Examples": "أمثلة",
"Home Assistant URL": "Home Assistant URL", "Home Assistant URL": "Home Assistant URL",
@ -617,7 +617,7 @@
"goAlertInfo": "الهدف هو تطبيق مفتوح المصدر لجدولة الجدولة التلقائية والإشعارات (مثل الرسائل القصيرة أو المكالمات الصوتية). إشراك الشخص المناسب تلقائيًا بالطريقة الصحيحة وفي الوقت المناسب! {0}", "goAlertInfo": "الهدف هو تطبيق مفتوح المصدر لجدولة الجدولة التلقائية والإشعارات (مثل الرسائل القصيرة أو المكالمات الصوتية). إشراك الشخص المناسب تلقائيًا بالطريقة الصحيحة وفي الوقت المناسب! {0}",
"goAlertIntegrationKeyInfo": "احصل على مفتاح تكامل API العام للخدمة في هذا التنسيق \"aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee\" عادةً قيمة المعلمة الرمزية لعنوان url المنسق.", "goAlertIntegrationKeyInfo": "احصل على مفتاح تكامل API العام للخدمة في هذا التنسيق \"aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee\" عادةً قيمة المعلمة الرمزية لعنوان url المنسق.",
"goAlert": "المرمى", "goAlert": "المرمى",
"backupOutdatedWarning": "إهمال", "backupOutdatedWarning": "مهمل: نظرًا لأنه تمت إضافة الكثير من الميزات وأن ميزة النسخ الاحتياطي هذه لم يتم الحفاظ عليها قليلاً ، فلا يمكنها إنشاء نسخة احتياطية كاملة أو استعادتها.",
"backupRecommend": "يرجى النسخ الاحتياطي لحجم الصوت أو مجلد البيانات (./data/) مباشرة بدلاً من ذلك.", "backupRecommend": "يرجى النسخ الاحتياطي لحجم الصوت أو مجلد البيانات (./data/) مباشرة بدلاً من ذلك.",
"Optional": "اختياري", "Optional": "اختياري",
"squadcast": "القاء فريقي", "squadcast": "القاء فريقي",
@ -681,5 +681,36 @@
"Specific Monitor Type": "نوع شاشة محدد", "Specific Monitor Type": "نوع شاشة محدد",
"dataRetentionTimeError": "يجب أن تكون فترة الاستبقاء 0 أو أكبر", "dataRetentionTimeError": "يجب أن تكون فترة الاستبقاء 0 أو أكبر",
"infiniteRetention": "ضبط على 0 للاحتفاظ لا نهائي.", "infiniteRetention": "ضبط على 0 للاحتفاظ لا نهائي.",
"confirmDeleteTagMsg": "هل أنت متأكد من أنك تريد حذف هذه العلامة؟ لن يتم حذف الشاشات المرتبطة بهذه العلامة." "confirmDeleteTagMsg": "هل أنت متأكد من أنك تريد حذف هذه العلامة؟ لن يتم حذف الشاشات المرتبطة بهذه العلامة.",
"Custom Monitor Type": "نوع الشاشة المخصص",
"Game": "لعبة",
"Don't know how to get the token? Please read the guide:": "لا أعرف كيفية الحصول على الرمز المميز؟ يرجى قراءة الدليل:",
"Subject:": "موضوع:",
"Valid To:": "صالحة ل:",
"Days Remaining:": "الأيام المتبقية:",
"Issuer:": "المُصدر:",
"Fingerprint:": "بصمة:",
"Most likely causes:": "الأسباب المرجحة:",
"Help": "يساعد",
"Accept characters:": "قبول الأحرف:",
"plugin": "البرنامج المساعد | الإضافات",
"install": "ثَبَّتَ",
"installing": "التثبيت",
"uninstall": "الغاء التثبيت",
"uninstalling": "إلغاء التثبيت",
"loadingError": "لا يمكن جلب البيانات ، يرجى المحاولة مرة أخرى في وقت لاحق.",
"Example:": "مثال: {0}",
"Google Analytics ID": "معرف Google Analytics",
"markdownSupported": "دعم صيغة Markdown",
"Edit Tag": "تحرير العلامة",
"Server Address": "عنوان المستقبل",
"Learn More": "يتعلم أكثر",
"Automations can optionally be triggered in Home Assistant:": "يمكن تشغيل الأتمتة اختياريًا في Home Assistant:",
"Trigger type:": "نوع الزناد:",
"Event type:": "نوع الحدث:",
"Event data:": "بيانات الحدث:",
"More info on:": "مزيد من المعلومات حول: {0}",
"What you can try:": "ماذا تستطيع أن تجرب:",
"Packet Size": "حجم الحزمة",
"confirmUninstallPlugin": "هل أنت متأكد من أنك تريد إلغاء تثبيت هذا المكون الإضافي؟"
} }

@ -0,0 +1,688 @@
{
"Edit": "تعديل",
"Delete": "حذف",
"Current": "حالي",
"Uptime": "مدة التشغيل",
"Monitor": "مراقب | مراقبات",
"day": "يوم | أيام",
"-day": "-يوم",
"hour": "ساعة",
"-hour": "-ساعة",
"Response": "استجاية",
"Ping": "بينغ",
"Monitor Type": "نوع المراقب",
"Cert Exp.": "انتهاء صَلاحِيَة شهادة الأمان SSL",
"Theme - Heartbeat Bar": "موضوع - بار نبضات",
"Normal": "طبيعي",
"Bottom": "الأسفل",
"None": "لا أحد",
"Current Password": "كلمة المرور الحالي",
"New Password": "كلمة سر جديدة",
"Repeat New Password": "كرر كلمة المرور الجديدة",
"Update Password": "تطوير كلمة السر",
"Disable Auth": "تعطيل المصادقة",
"Enable Auth": "تمكين المصادقة",
"disableauth.message1": "هل أنت متأكد من أن <strong> تعطيل المصادقة </strong>؟",
"disableauth.message2": "تم تصميمه للسيناريوهات <strong> حيث تنوي تنفيذ مصادقة الطرف الثالث </strong> أمام كوما في وقت التشغيل مثل CloudFlare Access Authelia أو آليات المصادقة الأخرى.",
"Please use this option carefully!": "الرجاء استخدام هذا الخيار بعناية!",
"Logout": "تسجيل خروج",
"Leave": "غادر",
"I understand, please disable": "أنا أفهم من فضلك تعطيل",
"Confirm": "يتأكد",
"Yes": "نعم",
"No": "رقم",
"Username": "اسم المستخدم",
"Password": "كلمة المرور",
"Remember me": "تذكرنى",
"Login": "تسجيل الدخول",
"No Monitors, please": "لا شاشات من فضلك",
"alertNoFile": "الرجاء تحديد ملف للاستيراد.",
"Skip existing": "تخطي الموجود",
"Search...": "يبحث…",
"Avg. Ping": "متوسط. بينغ",
"Avg. 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": "صفحة الحالة",
"Application Token": "رمز التطبيق",
"Server URL": "عنوان URL الخادم",
"Priority": "أولوية",
"Read more": "قراءة المزيد",
"topic": "عنوان",
"Last Updated": "التحديث الاخير",
"Unpin": "إلغاء",
"Show Tags": "أضهر العلامات",
"Add one": "أضف واحدا",
"wayToGetCloudflaredURL": "(قم بتنزيل CloudFlared من {0})",
"cloudflareWebsite": "موقع CloudFlare",
"Message:": ":رسالة",
"Don't know how to get the token? Please read the guide:": "لا أعرف كيفية الحصول على الرمز المميز؟ يرجى قراءة الدليل:",
"telegramSendSilently": "أرسل بصمت",
"telegramSendSilentlyDescription": "ترسل الرسالة بصمت ويتلقى المستخدمون إشعارا بدون صوت.",
"Enable": "يُمكَِن",
"notificationRegional": "إقليمي",
"Clone": "استنسخ",
"cloneOf": "مُستنسَخ من {0}",
"grpcMethodDescription": "يتم تحويل اسم الطريقة إلى تنسيق Cammelcase مثل Sayhello Check وما إلى ذلك.",
"acceptedStatusCodesDescription": "حدد رموز الحالة التي تعتبر استجابة ناجحة.",
"deleteNotificationMsg": "هل أنت متأكد من حذف هذا الإشعار لجميع الشاشات؟",
"dnsPortDescription": "منفذ خادم DNS. الافتراضيات إلى 53. يمكنك تغيير المنفذ في أي وقت.",
"pauseMonitorMsg": "هل أنت متأكد من أن تتوقف مؤقتًا؟",
"API Keys": "مفاتيح API",
"Expiry": "نهاية الصلاحية",
"Expiry date": "تاريخ نهاية الصلاحية",
"Continue": "مواصلة",
"Add Another": "إضافة آخر",
"Add API Key": "أضف مفتاح API",
"apiKey-active": "نشط",
"apiKey-expired": "منتهي الصلاحية",
"Generate": "توليد",
"Settings": "الإعدادات",
"Dashboard": "لوح التحكم",
"Help": "المساعدة",
"New Update": "تحديث جديد متوفر",
"Language": "اللغة",
"Appearance": "المظهر",
"Theme": "الحُلة",
"General": "العامة",
"Version": "الإصدار",
"Primary Base URL": "الرابط التشعبي الأساسي",
"Check Update On GitHub": "التحقق من التحديث على GitHub",
"Add New Monitor": "أضف شاشة جديدة",
"Quick Stats": "إحصائيات سريعة",
"Pending": "قيد الانتظار",
"General Monitor Type": "نوع الشاشة العامة",
"Passive Monitor Type": "نوع الشاشة السلبي",
"Specific Monitor Type": "نوع شاشة محدد",
"markdownSupported": "دعم صيغة Markdown",
"pauseDashboardHome": "وقفة",
"Pause": "إيقاف مؤقت",
"Name": "الاسم",
"Status": "الحالة",
"DateTime": "الوقت والتاريخ",
"Message": "الرسالة",
"No important events": "لا توجد أحداث مهمة",
"Resume": "استمرار",
"Keyword": "كلمة مفتاحية",
"Friendly Name": "اسم معروف",
"URL": "عنوان URL",
"Hostname": "اسم المضيف",
"Port": "المنفذ",
"Heartbeat Interval": "فاصل نبضات القلب",
"Add": "إضافة",
"Up": "متصل",
"Down": "غير متصل",
"Maintenance": "الصيانة",
"Unknown": "مجهول",
"Retries": "يحاول مجدداً",
"Heartbeat Retry Interval": "الفاصل الزمني لإعادة محاكمة نبضات القلب",
"Resend Notification if Down X times consecutively": "إعادة تقديم الإخطار إذا انخفض x مرات بالتالي",
"Advanced": "متقدم",
"checkEverySecond": "تحقق من كل {0} ثانية",
"retryCheckEverySecond": "أعد محاولة كل {0} ثانية",
"resendEveryXTimes": "إعادة تقديم كل {0} مرات",
"resendDisabled": "إعادة الالتزام بالتعطيل",
"retriesDescription": "الحد الأقصى لإعادة المحاولة قبل تمييز الخدمة على أنها لأسفل وإرسال إشعار",
"ignoreTLSError": "تجاهل خطأ TLS/SSL لمواقع HTTPS",
"upsideDownModeDescription": "اقلب الحالة رأسًا على عقب. إذا كانت الخدمة قابلة للوصول إلى أسفل.",
"maxRedirectDescription": "الحد الأقصى لعدد إعادة التوجيه لمتابعة. ضبط على 0 لتعطيل إعادة التوجيه.",
"Upside Down Mode": "وضع أسفل أسفل",
"Max. Redirects": "الأعلى. إعادة التوجيه",
"Accepted Status Codes": "رموز الحالة المقبولة",
"Push URL": "دفع عنوان URL",
"needPushEvery": "يجب عليك استدعاء عنوان URL هذا كل ثانية.",
"pushOptionalParams": "المعلمات الاختيارية",
"Save": "يحفظ",
"Notifications": "إشعارات",
"Not available, please setup.": "غير متوفر من فضلك الإعداد.",
"Setup Notification": "إشعار الإعداد",
"Light": "نور",
"Dark": "داكن",
"Auto": "آلي",
"Timezone": "وحدة زمنية",
"Search Engine Visibility": "محرك بحث الرؤية",
"Allow indexing": "السماح الفهرسة",
"Discourage search engines from indexing site": "تثبيط محركات البحث من موقع الفهرسة",
"Change Password": "غير كلمة السر",
"add one": "أضف واحدا",
"Notification Type": "نوع إعلام",
"Email": "بريد إلكتروني",
"Test": "امتحان",
"Certificate Info": "معلومات الشهادة",
"Resolver Server": "خادم Resolver",
"Resource Record Type": "نوع سجل الموارد",
"Last Result": "اخر نتيجة",
"Create your admin account": "إنشاء حساب المسؤول الخاص بك",
"Repeat Password": "اعد كلمة السر",
"Import Backup": "استيراد النسخ الاحتياطي",
"Export Backup": "النسخ الاحتياطي تصدير",
"Export": "يصدّر",
"Import": "يستورد",
"respTime": "resp. الوقت (MS)",
"notAvailableShort": "ن/أ",
"Default enabled": "التمكين الافتراضي",
"Apply on all existing monitors": "تنطبق على جميع الشاشات الحالية",
"Create": "خلق",
"Clear Data": "امسح البيانات",
"Events": "الأحداث",
"Heartbeats": "نبضات القلب",
"Schedule maintenance": "جدولة الصيانة",
"Affected Monitors": "الشاشات المتأثرة",
"Pick Affected Monitors...": "اختر الشاشات المتأثرة …",
"Start of maintenance": "بداية الصيانة",
"All Status Pages": "جميع صفحات الحالة",
"Select status pages...": "حدد صفحات الحالة …",
"alertWrongFileType": "الرجاء تحديد ملف JSON.",
"Clear all statistics": "مسح جميع الإحصاءات",
"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": "نفسجي",
"webhookAdditionalHeadersDesc": "يحدد رؤوس إضافية مرسلة مع webhook.",
"Webhook URL": "Webhook URL",
"Pink": "لون القرنفل",
"Custom": "العادة",
"Status Pages": "صفحات الحالة",
"defaultNotificationName": "تنبيه {الإخطار} ({number})",
"here": "هنا",
"Required": "مطلوب",
"Post URL": "بعد عنوان URL",
"Content Type": "نوع المحتوى",
"webhookJsonDesc": "{0} مفيد لأي خوادم HTTP الحديثة مثل Express.js",
"webhookFormDataDesc": "{multipart} مفيد لـ PHP. سيحتاج JSON إلى تحليل {decodefunction}",
"webhookAdditionalHeadersTitle": "رؤوس إضافية",
"emojiCheatSheet": "ورقة الغش في الرموز التعبيرية",
"appriseInstalled": "تم تثبيت Prosise.",
"appriseNotInstalled": "الإبرام غير مثبت. {0}",
"Method": "طريقة",
"Body": "الجسم",
"Headers": "الرؤوس",
"PushUrl": "دفع عنوان URL",
"HeadersInvalidFormat": "رؤوس الطلبات غير صالحة JSON ",
"BodyInvalidFormat": "هيئة الطلب غير صالحة JSON ",
"Monitor History": "مراقبة التاريخ",
"clearDataOlderThan": "الحفاظ على بيانات سجل المراقبة للأيام {0}.",
"PasswordsDoNotMatch": "كلمة المرور غير مطابقة.",
"records": "السجلات",
"One record": "سجل واحد",
"steamApiKeyDescription": "لمراقبة خادم لعبة Steam ، تحتاج إلى مفتاح Steam Web-API. يمكنك تسجيل مفتاح API الخاص بك هنا ",
"Current User": "المستخدم الحالي",
"topicExplanation": "موضوع MQTT لرصد",
"successMessage": "نجاح رسالة",
"successMessageExplanation": "رسالة MQTT التي ستعتبر نجاحًا",
"recent": "الأخيرة",
"Done": "فعله",
"Info": "معلومات",
"Security": "حماية",
"Steam API Key": "مفتاح API Steam",
"Shrink Database": "تقلص قاعدة البيانات",
"Pick a RR-Type...": "اختر نوع RR …",
"Pick Accepted Status Codes...": "اختر أكواد الحالة المقبولة …",
"Default": "تقصير",
"HTTP Options": "خيارات HTTP",
"Create Incident": "إنشاء حادث",
"Title": "لقب",
"Content": "المحتوى",
"Style": "أسلوب",
"info": "معلومات",
"warning": "تحذير",
"danger": "خطر",
"error": "خطأ",
"critical": "شديد الأهمية",
"primary": "الأولية",
"light": "نور",
"dark": "ظلام",
"Post": "بريد",
"Please input title and content": "الرجاء إدخال العنوان والمحتوى",
"Created": "مخلوق",
"Switch to Light Theme": "التبديل إلى موضوع الضوء",
"Switch to Dark Theme": "التبديل إلى موضوع الظلام",
"Hide Tags": "إخفاء العلامات",
"Description": "وصف",
"No monitors available.": "لا شاشات المتاحة.",
"No Monitors": "لا شاشات",
"Untitled Group": "مجموعة بلا عنوان",
"Services": "خدمات",
"Discard": "تجاهل",
"Cancel": "يلغي",
"Powered by": "مشغل بواسطة",
"shrinkDatabaseDescription": "تشغيل فراغ قاعدة البيانات لـ SQLite. إذا تم إنشاء قاعدة البيانات الخاصة بك بعد تمكين 1.10.0 AUTO_VACUUM بالفعل ولا يلزم هذا الإجراء.",
"Customize": "يعدل أو يكيف",
"Custom Footer": "تذييل مخصص",
"Custom CSS": "لغة تنسيق ويب حسب الطلب",
"deleteStatusPageMsg": "هل أنت متأكد من حذف صفحة الحالة هذه؟",
"Proxies": "وكلاء",
"default": "تقصير",
"enabled": "تمكين",
"setAsDefault": "تعيين كافتراضي",
"deleteProxyMsg": "هل أنت متأكد من حذف هذا الوكيل لجميع الشاشات؟",
"proxyDescription": "يجب تعيين الوكلاء إلى شاشة للعمل.",
"enableProxyDescription": "لن يؤثر هذا الوكيل على طلبات الشاشة حتى يتم تنشيطه. يمكنك التحكم مؤقتًا في تعطيل الوكيل من جميع الشاشات حسب حالة التنشيط.",
"setAsDefaultProxyDescription": "سيتم تمكين هذا الوكيل افتراضيًا للشاشات الجديدة. لا يزال بإمكانك تعطيل الوكيل بشكل منفصل لكل شاشة.",
"Certificate Chain": "سلسلة الشهادة",
"Valid": "صالح",
"Invalid": "غير صالح",
"User": "المستعمل",
"Installed": "المثبتة",
"Not installed": "غير مثبت",
"Running": "جري",
"Not running": "لا يعمل",
"Remove Token": "إزالة الرمز المميز",
"Start": "بداية",
"Stop": "قف",
"Add New Status Page": "أضف صفحة حالة جديدة",
"Slug": "سبيكة",
"Accept characters:": "قبول الأحرف:",
"startOrEndWithOnly": "ابدأ أو ينتهي بـ {0} فقط",
"No consecutive dashes": "لا شرطات متتالية",
"Next": "التالي",
"The slug is already taken. Please choose another slug.": "تم أخذ سبيكة بالفعل. الرجاء اختيار سبيكة أخرى.",
"No Proxy": "لا الوكيل",
"Authentication": "المصادقة",
"HTTP Basic Auth": "HTTP الأساسي Auth",
"New Status Page": "صفحة حالة جديدة",
"Page Not Found": "الصفحة غير موجودة",
"Reverse Proxy": "وكيل عكسي",
"Backup": "دعم",
"About": "عن",
"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. هل أنت متأكد تريد إيقافها؟ اكتب كلمة المرور الحالية لتأكيدها.",
"HTTP Headers": "رؤوس HTTP",
"Trust Proxy": "الوكيل الثقة",
"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": "الوكيل",
"Date Created": "تاريخ الإنشاء",
"Footer Text": "نص تذييل",
"Show Powered By": "عرض مدعوم من قبل",
"Domain Names": "أسماء المجال",
"signedInDisp": "وقعت في {0}",
"signedInDispDisabled": "معاق المصادقة.",
"RadiusSecret": "سر نصف القطر",
"RadiusSecretDescription": "السر المشترك بين العميل والخادم",
"RadiusCalledStationId": "يسمى معرف المحطة",
"RadiusCalledStationIdDescription": "معرف الجهاز المتصل",
"RadiusCallingStationId": "معرف محطة الاتصال",
"RadiusCallingStationIdDescription": "معرف جهاز الاتصال",
"Certificate Expiry Notification": "إشعار انتهاء الصلاحية",
"API Username": "اسم المستخدم API",
"API Key": "مفتاح API",
"Show update if available": "عرض التحديث إذا كان ذلك متاحًا",
"Also check beta release": "تحقق أيضًا من الإصدار التجريبي",
"Using a Reverse Proxy?": "باستخدام وكيل عكسي؟",
"Check how to config it for WebSocket": "تحقق من كيفية تكوينه لـ WebSocket",
"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": "قريبا",
"Connection String": "سلسلة الاتصال",
"Query": "استفسار",
"settingsCertificateExpiry": "شهادة TLS انتهاء الصلاحية",
"certificationExpiryDescription": "شاشات HTTPS تضيء عندما تنتهي شهادة TLS في",
"Setup Docker Host": "إعداد مضيف Docker",
"Connection Type": "نوع الاتصال",
"Docker Daemon": "Docker Daemon",
"deleteDockerHostMsg": "هل أنت متأكد من حذف مضيف Docker لجميع الشاشات؟",
"socket": "قابس كهرباء",
"tcp": "TCP / HTTP",
"Docker Container": "حاوية Docker",
"Container Name / ID": "اسم الحاوية / معرف",
"Docker Host": "مضيف Docker",
"Docker Hosts": "مضيفي Docker",
"Domain": "اِختِصاص",
"Workstation": "محطة العمل",
"Packet Size": "حجم الحزمة",
"Bot Token": "رمز الروبوت",
"wayToGetTelegramToken": "يمكنك الحصول على رمز من {0}.",
"Chat ID": "معرف الدردشة",
"telegramMessageThreadID": "معرف المواضيع",
"supportTelegramChatID": "دعم الدردشة المباشرة / معرف الدردشة للقناة",
"wayToGetTelegramChatID": "يمكنك الحصول على معرف الدردشة الخاص بك عن طريق إرسال رسالة إلى الروبوت والانتقال إلى عنوان URL هذا لعرض Chat_id",
"YOUR BOT TOKEN HERE": "رمز الروبوت الخاص بك هنا",
"chatIDNotFound": "لم يتم العثور على معرف الدردشة ؛ الرجاء إرسال رسالة إلى هذا الروبوت أولاً",
"disableCloudflaredNoAuthMsg": "أنت في وضع مصادقة لا توجد كلمة مرور غير مطلوبة.",
"trustProxyDescription": "ثق في رؤوس \"X-Forwarded- *\". إذا كنت ترغب في الحصول على عنوان IP الصحيح للعميل وكان Uptime Kuma خلف وكيل مثل Nginx أو Apache ، فيجب عليك تمكين هذا.",
"wayToGetLineNotifyToken": "يمكنك الحصول على رمز الوصول من {0}",
"Examples": "أمثلة",
"Home Assistant URL": "Home Assistant URL",
"Long-Lived Access Token": "الرمز المميز للوصول منذ فترة طويلة",
"Long-Lived Access Token can be created by clicking on your profile name (bottom left) and scrolling to the bottom then click Create Token. ": "يمكن إنشاء رمز الوصول منذ فترة طويلة عن طريق النقر على اسم ملف التعريف الخاص بك (أسفل اليسار) والتمرير إلى الأسفل ثم انقر فوق إنشاء الرمز المميز. ",
"Notification Service": "خدمة الإخطار",
"default: notify all devices": "الافتراضي: إخطار جميع الأجهزة",
"A list of Notification Services can be found in Home Assistant under \"Developer Tools > Services\" search for \"notification\" to find your device/phone name.": "يمكن العثور على قائمة بخدمات الإخطار في المساعد المنزلي ضمن \"Developer Tools > Services\" ابحث عن \"notification\" للعثور على اسم جهازك/هاتفك.",
"Automations can optionally be triggered in Home Assistant:": "يمكن تشغيل الأتمتة اختياريًا في Home Assistant:",
"Trigger type:": "نوع الزناد:",
"Event type:": "نوع الحدث:",
"Event data:": "بيانات الحدث:",
"Then choose an action, for example switch the scene to where an RGB light is red.": "ثم اختر إجراءً على سبيل المثال قم بتبديل المشهد إلى حيث يكون ضوء RGB أحمر.",
"Frontend Version": "إصدار الواجهة الأمامية",
"Frontend Version do not match backend version!": "إصدار Frontend لا يتطابق مع الإصدار الخلفي!",
"backupOutdatedWarning": "مهمل: نظرًا لأنه تمت إضافة الكثير من الميزات وأن ميزة النسخ الاحتياطي هذه لم يتم الحفاظ عليها قليلاً ، فلا يمكنها إنشاء نسخة احتياطية كاملة أو استعادتها.",
"backupRecommend": "يرجى النسخ الاحتياطي لحجم الصوت أو مجلد البيانات (./data/) مباشرة بدلاً من ذلك.",
"Optional": "اختياري",
"or": "أو",
"recurringInterval": "فترة",
"Recurring": "يتكرر",
"strategyManual": "نشط/غير نشط يدويًا",
"warningTimezone": "إنه يستخدم المنطقة الزمنية للخادم",
"weekdayShortMon": "الاثنين",
"weekdayShortTue": "الثلاثاء",
"weekdayShortWed": "تزوج",
"weekdayShortThu": "الخميس",
"weekdayShortFri": "الجمعة",
"No Maintenance": "لا صيانة",
"weekdayShortSat": "جلس",
"weekdayShortSun": "شمس",
"dayOfWeek": "يوم من الأسبوع",
"dayOfMonth": "يوم من الشهر",
"lastDay": "بالأمس",
"lastDay1": "آخر يوم من الشهر",
"lastDay2": "الثاني في اليوم الأخير من الشهر",
"lastDay3": "الثالث في اليوم الأخير من الشهر",
"lastDay4": "الرابع في اليوم الأخير من الشهر",
"pauseMaintenanceMsg": "هل أنت متأكد من أن تتوقف مؤقتًا؟",
"maintenanceStatus-under-maintenance": "تحت الصيانة",
"maintenanceStatus-inactive": "غير نشط",
"maintenanceStatus-scheduled": "المقرر",
"maintenanceStatus-ended": "انتهى",
"maintenanceStatus-unknown": "مجهول",
"Display Timezone": "عرض المنطقة الزمنية",
"Server Timezone": "المنطقة الزمنية الخادم",
"statusPageMaintenanceEndDate": "نهاية",
"IconUrl": "url url icon",
"Enable DNS Cache": "تمكين ذاكرة التخزين المؤقت DNS",
"Disable": "إبطال",
"dnsCacheDescription": "قد لا يعمل في بعض بيئات IPv6 تعطيله إذا واجهت أي مشكلات.",
"Single Maintenance Window": "نافذة صيانة واحدة",
"Maintenance Time Window of a Day": "نافذة وقت الصيانة لليوم",
"Effective Date Range": "نطاق التاريخ السريع",
"Schedule Maintenance": "جدولة الصيانة",
"Date and Time": "التاريخ و الوقت",
"DateTime Range": "نطاق DateTime",
"loadingError": "لا يمكن جلب البيانات ، يرجى المحاولة مرة أخرى في وقت لاحق.",
"plugin": "البرنامج المساعد | الإضافات",
"install": "ثَبَّتَ",
"installing": "التثبيت",
"uninstall": "الغاء التثبيت",
"uninstalling": "إلغاء التثبيت",
"confirmUninstallPlugin": "هل أنت متأكد من أنك تريد إلغاء تثبيت هذا المكون الإضافي؟",
"smtp": "البريد الإلكتروني (SMTP)",
"secureOptionNone": "لا شيء / startTls (25 587)",
"secureOptionTLS": "TLS (465)",
"Ignore TLS Error": "تجاهل خطأ TLS",
"From Email": "من البريد الإلكترونى",
"emailCustomSubject": "موضوع مخصص",
"To Email": "للبريد الإلكتروني",
"smtpCC": "نسخة",
"smtpBCC": "BCC",
"Discord Webhook URL": "Discord Webhook URL",
"wayToGetDiscordURL": "يمكنك الحصول على هذا بالانتقال إلى إعدادات الخادم -> عمليات التكامل -> عرض الخطافات على الويب -> خطاف ويب جديد",
"Bot Display Name": "اسم عرض الروبوت",
"Prefix Custom Message": "بادئة رسالة مخصصة",
"Hello @everyone is...": "مرحبًا {'@'} الجميع…",
"wayToGetTeamsURL": "يمكنك معرفة كيفية إنشاء عنوان URL webhook {0}.",
"wayToGetZohoCliqURL": "يمكنك معرفة كيفية إنشاء عنوان URL webhook {0}.",
"needSignalAPI": "تحتاج إلى وجود عميل إشارة مع REST API.",
"wayToCheckSignalURL": "يمكنك التحقق من عنوان URL هذا لعرض كيفية إعداد واحد",
"Number": "رقم",
"Recipients": "المستلمين",
"Access Token": "رمز وصول",
"Channel access token": "قناة الوصول إلى الرمز",
"Line Developers Console": "تحكم المطورين",
"lineDevConsoleTo": "وحدة المطورين Line Console - {0}",
"Basic Settings": "الإعدادات الأساسية",
"confirmClearStatisticsMsg": "هل أنت متأكد من أنك تريد حذف جميع الإحصائيات؟",
"importHandleDescription": "اختر 'تخطي موجود' إذا كنت تريد تخطي كل شاشة أو إشعار بنفس الاسم. 'الكتابة فوق' سوف يحذف كل شاشة وإخطار موجود.",
"User ID": "معرف المستخدم",
"Messaging API": "واجهة برمجة تطبيقات المراسلة",
"wayToGetLineChannelToken": "قم أولاً بالوصول إلى {0} إنشاء مزود وقناة (واجهة برمجة تطبيقات المراسلة) ، ثم يمكنك الحصول على رمز الوصول إلى القناة ومعرف المستخدم من عناصر القائمة المذكورة أعلاه.",
"Icon URL": "url url icon",
"aboutIconURL": "يمكنك توفير رابط لصورة في \"Icon URL\" لتجاوز صورة الملف الشخصي الافتراضي. لن يتم استخدامه إذا تم تعيين رمز رمز رمز.",
"aboutMattermostChannelName": "يمكنك تجاوز القناة الافتراضية التي تنشرها WebHook من خلال إدخال اسم القناة في \"Channel Name\" الحقل. يجب تمكين هذا في إعدادات Webhook Mattern. السابق",
"dataRetentionTimeError": "يجب أن تكون فترة الاستبقاء 0 أو أكبر",
"infiniteRetention": "ضبط على 0 للاحتفاظ لا نهائي.",
"confirmDeleteTagMsg": "هل أنت متأكد من أنك تريد حذف هذه العلامة؟ لن يتم حذف الشاشات المرتبطة بهذه العلامة.",
"enableGRPCTls": "السماح لإرسال طلب GRPC مع اتصال TLS",
"deleteMonitorMsg": "هل أنت متأكد من حذف هذا الشاشة؟",
"deleteMaintenanceMsg": "هل أنت متأكد من حذف هذه الصيانة؟",
"resolverserverDescription": "CloudFlare هو الخادم الافتراضي. يمكنك تغيير خادم المحوّل في أي وقت.",
"rrtypeDescription": "حدد نوع RR الذي تريد مراقبته",
"enableDefaultNotificationDescription": "سيتم تمكين هذا الإشعار افتراضيًا للشاشات الجديدة. لا يزال بإمكانك تعطيل الإخطار بشكل منفصل لكل شاشة.",
"clearEventsMsg": "هل أنت متأكد من حذف جميع الأحداث لهذا الشاشة؟",
"clearHeartbeatsMsg": "هل أنت متأكد من حذف جميع دقات القلب لهذا الشاشة؟",
"confirmImportMsg": "هل أنت متأكد من أنك تريد استيراد النسخ الاحتياطي؟ يرجى التحقق من أنك حددت خيار الاستيراد الصحيح.",
"twoFAVerifyLabel": "الرجاء إدخال الرمز المميز الخاص بك للتحقق من 2FA",
"pushoversounds pushover": "سداد (افتراضي)",
"pushoversounds bike": "دراجة هوائية",
"pushoversounds bugle": "بوق",
"tokenValidSettingsMsg": "الرمز المميز صالح! يمكنك الآن حفظ إعدادات 2FA.",
"confirmEnableTwoFAMsg": "هل أنت متأكد من أنك تريد تمكين 2FA؟",
"confirmDisableTwoFAMsg": "هل أنت متأكد من أنك تريد تعطيل 2FA؟",
"recurringIntervalMessage": "ركض مرة واحدة كل يوم | قم بالتشغيل مرة واحدة كل يوم {0}",
"affectedMonitorsDescription": "حدد المراقبين المتأثرة بالصيانة الحالية",
"affectedStatusPages": "إظهار رسالة الصيانة هذه على صفحات الحالة المحددة",
"atLeastOneMonitor": "حدد شاشة واحدة على الأقل من المتأثرين",
"passwordNotMatchMsg": "كلمة المرور المتكررة لا تتطابق.",
"notificationDescription": "يجب تعيين الإخطارات إلى شاشة للعمل.",
"keywordDescription": "ابحث في الكلمة الرئيسية في استجابة HTML العادية أو JSON. البحث حساس للحالة.",
"backupDescription": "يمكنك النسخ الاحتياطي لجميع الشاشات والإشعارات في ملف JSON.",
"backupDescription3": "يتم تضمين البيانات الحساسة مثل الرموز الإخطار في ملف التصدير ؛ يرجى تخزين التصدير بشكل آمن.",
"endpoint": "نقطة النهاية",
"octopushAPIKey": "\"API key\" from HTTP API بيانات اعتماد في لوحة التحكم",
"octopushLogin": "\"Login\" من بيانات اعتماد API HTTP في لوحة التحكم",
"promosmsLogin": "اسم تسجيل الدخول API",
"promosmsPassword": "كلمة مرور API",
"pushoversounds cashregister": "ماكينة تسجيل المدفوعات النقدية",
"pushoversounds classical": "كلاسيكي",
"pushoversounds cosmic": "كونية",
"pushoversounds falling": "هبوط",
"pushoversounds gamelan": "Gamelan",
"pushoversounds incoming": "واردة",
"pushoversounds intermission": "استراحة",
"pushoversounds magic": "سحر",
"pushoversounds mechanical": "ميكانيكي",
"pushoversounds pianobar": "شريط البيانو",
"pushoversounds siren": "صفارة إنذار",
"pushoversounds spacealarm": "إنذار الفضاء",
"pushoversounds tugboat": "قارب السحب",
"pushoversounds alien": "إنذار أجنبي (طويل)",
"pushoversounds climb": "تسلق (طويل)",
"pushoversounds persistent": "مستمر (طويل)",
"pushoversounds echo": "صدى مهووس (طويل)",
"pushoversounds updown": "صعودا (طويلة)",
"pushoversounds vibrate": "يهتز فقط",
"pushoversounds none": "لا شيء (صامت)",
"pushyAPIKey": "مفتاح API السري",
"pushyToken": "رمز الجهاز",
"apprise": "إبلاغ (دعم 50+ خدمات الإخطار)",
"GoogleChat": "دردشة Google",
"wayToGetKookBotToken": "قم بإنشاء تطبيق واحصل على رمز الروبوت الخاص بك على {0}",
"wayToGetKookGuildID": "قم بتشغيل 'وضع المطور' في إعداد Kook وانقر بزر الماوس الأيمن على النقابة للحصول على معرفه",
"Guild ID": "معرف النقابة",
"User Key": "مفتاح المستخدم",
"Device": "جهاز",
"Message Title": "عنوان الرسالة",
"Notification Sound": "صوت الإشعار",
"More info on:": "مزيد من المعلومات حول: {0}",
"pushoverDesc1": "أولوية الطوارئ (2) لها مهلة افتراضية 30 ثانية بين إعادة المحاولة وستنتهي صلاحيتها بعد ساعة واحدة.",
"pushoverDesc2": "إذا كنت ترغب في إرسال إشعارات إلى أجهزة مختلفة ، قم بملء حقل الجهاز.",
"SMS Type": "نوع الرسائل القصيرة",
"octopushTypePremium": "قسط (سريع - موصى به للتنبيه)",
"octopushTypeLowCost": "التكلفة المنخفضة (بطيئة - تم حظرها أحيانًا بواسطة المشغل)",
"checkPrice": "تحقق من الأسعار {0}",
"apiCredentials": "بيانات اعتماد API",
"octopushLegacyHint": "هل تستخدم الإصدار القديم من Octopush (2011-2020) أو الإصدار الجديد؟",
"Check octopush prices": "تحقق من أسعار Octopush {0}.",
"AccessKeyId": "معرف AccessKey",
"SecretAccessKey": "Accesskey Secret",
"PhoneNumbers": "أرقام الهواتف",
"octopushPhoneNumber": "رقم الهاتف (تنسيق intl على سبيل المثال ",
"octopushSMSSender": "اسم مرسل الرسائل القصيرة",
"LunaSea Device ID": "معرف جهاز Lunasea",
"Apprise URL": "إبلاغ عنوان URL",
"Example:": "مثال: {0}",
"Read more:": "{0} :قراءة المزيد",
"Status:": "{0} :حالة",
"Strategy": "إستراتيجية",
"Free Mobile User Identifier": "معرف مستخدم الهاتف المحمول المجاني",
"Free Mobile API Key": "مفتاح واجهة برمجة تطبيقات مجانية للهاتف المحمول",
"Enable TLS": "تمكين TLS",
"Proto Service Name": "اسم خدمة البروتو",
"Proto Method": "طريقة البروتو",
"Proto Content": "محتوى proto",
"Economy": "اقتصاد",
"Lowcost": "تكلفة منخفضة",
"high": "عالي",
"SendKey": "Sendkey",
"SMSManager API Docs": "مستندات SMSManager API ",
"Gateway Type": "نوع البوابة",
"You can divide numbers with": "يمكنك تقسيم الأرقام مع",
"Base URL": "عنوان URL الأساسي",
"goAlertInfo": "الهدف هو تطبيق مفتوح المصدر لجدولة الجدولة التلقائية والإشعارات (مثل الرسائل القصيرة أو المكالمات الصوتية). إشراك الشخص المناسب تلقائيًا بالطريقة الصحيحة وفي الوقت المناسب! {0}",
"goAlertIntegrationKeyInfo": "احصل على مفتاح تكامل API العام للخدمة في هذا التنسيق \"aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee\" عادةً قيمة المعلمة الرمزية لعنوان url المنسق.",
"TemplateCode": "TemplateCode",
"SignName": "اسم تسجيل الدخول",
"Sms template must contain parameters: ": "يجب أن يحتوي قالب الرسائل القصيرة على معلمات: ",
"Bark Endpoint": "نقطة نهاية اللحاء",
"Bark Group": "مجموعة اللحاء",
"Bark Sound": "صوت اللحاء",
"WebHookUrl": "webhookurl",
"SecretKey": "Secretkey",
"For safety, must use secret key": "للسلامة يجب استخدام المفتاح السري",
"Device Token": "رمز الجهاز",
"Platform": "منصة",
"Android": "ذكري المظهر",
"Huawei": "هواوي",
"High": "عالٍ",
"Retry": "إعادة المحاولة",
"Topic": "عنوان",
"WeCom Bot Key": "WECOM BOT KEY",
"Setup Proxy": "وكيل الإعداد",
"Proxy Protocol": "بروتوكول الوكيل",
"Proxy Server": "مخدم بروكسي",
"Proxy server has authentication": "خادم الوكيل لديه مصادقة",
"promosmsTypeEco": "SMS Eco - رخيصة ولكن بطيئة وغالبًا ما تكون محملة. يقتصر فقط على المستفيدين البولنديين.",
"promosmsTypeFlash": "SMS Flash - سيتم عرض الرسالة تلقائيًا على جهاز المستلم. يقتصر فقط على المستفيدين البولنديين.",
"promosmsTypeFull": "SMS Full - Tier Premium SMS يمكنك استخدام اسم المرسل الخاص بك (تحتاج إلى تسجيل الاسم أولاً). موثوقة للتنبيهات.",
"promosmsTypeSpeed": "سرعة الرسائل القصيرة - أولوية قصوى في النظام. سريع وموثوق للغاية ولكنه مكلف (حوالي مرتين من الرسائل القصيرة السعر الكامل).",
"promosmsPhoneNumber": "رقم الهاتف (للمستلم البولندي ، يمكنك تخطي رموز المنطقة)",
"matrixDesc2": "يوصى بشدة بإنشاء مستخدم جديد ولا تستخدم رمز الوصول إلى مستخدم Matrix الخاص بك لأنه سيتيح الوصول الكامل إلى حسابك وجميع الغرف التي انضمت إليها. بدلاً من ذلك ، قم بإنشاء مستخدم جديد ودعوته فقط إلى الغرفة التي تريد تلقيها الإشعار فيها. يمكنك الحصول على رمز الوصول عن طريق تشغيل {0}",
"Channel Name": "اسم القناة",
"promosmsSMSSender": "اسم مرسل الرسائل القصيرة",
"promosmsAllowLongSMS": "السماح الرسائل القصيرة الطويلة",
"Feishu WebHookUrl": "Feishu Webhookurl",
"matrixHomeserverURL": "عنوان URL HomeServer (مع HTTP (S)",
"Internal Room Id": "معرف الغرفة الداخلية",
"matrixDesc1": "يمكنك العثور على معرف الغرفة الداخلي من خلال البحث في القسم المتقدم من إعدادات الغرفة في عميل Matrix الخاص بك. يجب أن تبدو مثل! QMDRCPUIFLWSFJXYE6",
"Uptime Kuma URL": "UPTIME KUMA URL",
"Icon Emoji": "أيقونة الرموز التعبيرية",
"signalImportant": "مهم",
"aboutWebhooks": "مزيد من المعلومات حول Webhooks ON",
"aboutChannelName": "أدخل اسم القناة في حقل اسم القناة {0} إذا كنت تريد تجاوز قناة WebHook. السابق",
"aboutKumaURL": "إذا تركت حقل URL في وقت التشغيل KUMA فارغًا ، فسيتم افتراضيًا إلى صفحة GitHub Project.",
"smtpDkimSettings": "إعدادات DKIM",
"smtpDkimDesc": "يرجى الرجوع إلى Nodemailer dkim {0} للاستخدام.",
"documentation": "توثيق",
"smtpDkimDomain": "اسم النطاق",
"smtpDkimKeySelector": "المحدد الرئيسي",
"smtpDkimPrivateKey": "مفتاح سري",
"smtpDkimHashAlgo": "خوارزمية التجزئة (اختياري)",
"smtpDkimheaderFieldNames": "مفاتيح الرأس للتوقيع (اختياري)",
"smtpDkimskipFields": "مفاتيح الرأس لا توقيع (اختياري)",
"wayToGetPagerDutyKey": "يمكنك الحصول على هذا عن طريق الانتقال إلى الخدمة -> دليل الخدمة -> (حدد خدمة) -> تكامل -> إضافة التكامل. هنا يمكنك البحث عن \"Events API V2\". مزيد من المعلومات {0}",
"Integration Key": "مفتاح التكامل",
"Integration URL": "URL تكامل",
"do nothing": "لا تفعل شيئا",
"alertaApiEndpoint": "نقطة نهاية API",
"alertaEnvironment": "بيئة",
"alertaApiKey": "مفتاح API",
"alertaAlertState": "حالة التنبيه",
"alertaRecoverState": "استعادة الدولة",
"auto acknowledged": "",
"auto resolve": "",
"serwersmsAPIUser": "اسم مستخدم API (بما في ذلك بادئة WebAPI_)",
"serwersmsAPIPassword": "كلمة مرور API",
"serwersmsPhoneNumber": "رقم الهاتف",
"serwersmsSenderName": "اسم مرسل الرسائل القصيرة (مسجل عبر بوابة العملاء)",
"smseagleTo": "أرقام الهواتف)",
"smseagleGroup": "اسم مجموعة كتب الهاتف (S)",
"smseagleContact": "كتاب الاتصال اسم (S)",
"smseagleRecipientType": "نوع المستلم",
"smseagleRecipient": "المتلقي (المتلقيين) (يجب فصل المتعددة مع فاصلة)",
"smseagleToken": "API وصول الرمز المميز",
"smseagleUrl": "عنوان URL لجهاز SMSEGLE الخاص بك",
"smseagleEncoding": "إرسال Unicode",
"smseaglePriority": "أولوية الرسالة (0-9 افتراضي = 0)",
"Recipient Number": "رقم المستلم",
"From Name/Number": "من الاسم/الرقم",
"Leave blank to use a shared sender number.": "اترك فارغًا لاستخدام رقم المرسل المشترك.",
"Octopush API Version": "إصدار Octopush API",
"Legacy Octopush-DM": "Legacy Octopush-DM",
"ntfy Topic": "موضوع ntfy",
"onebotHttpAddress": "OneBot HTTP عنوان",
"onebotMessageType": "نوع رسالة OneBot",
"onebotGroupMessage": "مجموعة",
"onebotPrivateMessage": "خاص",
"onebotUserOrGroupId": "معرف المجموعة/المستخدم",
"onebotSafetyTips": "للسلامة يجب ضبط الرمز المميز للوصول",
"PushDeer Key": "مفتاح PushDeer",
"wayToGetClickSendSMSToken": "يمكنك الحصول على اسم مستخدم API ومفتاح API من {0}.",
"Custom Monitor Type": "نوع الشاشة المخصص",
"Google Analytics ID": "معرف Google Analytics",
"Edit Tag": "تحرير العلامة",
"Server Address": "عنوان المستقبل",
"Learn More": "يتعلم أكثر",
"apiKeyAddedMsg": "تمت إضافة مفتاح API خاص بك. يرجى تدوين ذلك لأنه لن يتم عرضه مرة أخرى.",
"No API Keys": "لا توجد مفاتيح API",
"apiKey-inactive": "غير نشط",
"disableAPIKeyMsg": "هل أنت متأكد أنك تريد تعطيل مفتاح API هذا؟",
"deleteAPIKeyMsg": "هل أنت متأكد أنك تريد حذف مفتاح API هذا؟",
"Auto Get": "الحصول التلقائي",
"Auto resolve or acknowledged": "",
"backupDescription2": "ملحوظة",
"languageName": "العربية",
"Game": "الألعاب",
"List": "قائمة",
"statusMaintenance": "الصيانة"
}

@ -681,7 +681,7 @@
"infiniteRetention": "Задайте стойност 0 за безкрайно съхранение.", "infiniteRetention": "Задайте стойност 0 за безкрайно съхранение.",
"Monitor": "Монитор | Монитори", "Monitor": "Монитор | Монитори",
"dataRetentionTimeError": "Периодът на съхранение трябва да е 0 или по-голям", "dataRetentionTimeError": "Периодът на съхранение трябва да е 0 или по-голям",
"confirmDeleteTagMsg": "Сигурни ли сте, че желаете да изтриете този таг? Мониторите, свързани с него, няма да бъдат изтрити.", "confirmDeleteTagMsg": "Сигурни ли сте, че желаете да изтриете този етикет? Мониторите, свързани с него, няма да бъдат изтрити.",
"promosmsAllowLongSMS": "Позволи дълъг SMS", "promosmsAllowLongSMS": "Позволи дълъг SMS",
"Packet Size": "Размер на пакет", "Packet Size": "Размер на пакет",
"Custom Monitor Type": "Потребителски тип монитор", "Custom Monitor Type": "Потребителски тип монитор",
@ -694,7 +694,49 @@
"confirmUninstallPlugin": "Сигурни ли сте, че желаете да деинсталирате този плъгин?", "confirmUninstallPlugin": "Сигурни ли сте, че желаете да деинсталирате този плъгин?",
"markdownSupported": "Поддържа се Markdown синтаксис", "markdownSupported": "Поддържа се Markdown синтаксис",
"Google Analytics ID": "Google Analytics ID", "Google Analytics ID": "Google Analytics ID",
"Edit Tag": "Редактиране на таг", "Edit Tag": "Редактиране на етикет",
"Learn More": "Научете повече", "Learn More": "Научете повече",
"Server Address": "Сървър адрес" "Server Address": "Сървър адрес",
"notificationRegional": "Регионални",
"Body Encoding": "Кодировка на тялото",
"telegramMessageThreadID": "(По избор) Thread ID на съобщението",
"telegramMessageThreadIDDescription": "Незадължителен уникален идентификатор за целевата нишка от съобщения (тема) на форума; само за форумни супергрупи",
"telegramProtectContent": "Защита на препращане/записване",
"telegramProtectContentDescription": "Ако е активирано, съобщенията от ботове в Telegram ще бъдат защитени от препращане и запазване.",
"telegramSendSilentlyDescription": "Изпраща съобщението тихо. Потребителите ще получат известие без звук.",
"telegramSendSilently": "Изпрати тихо",
"Clone Monitor": "Клониране на монитор",
"Clone": "Клонирай",
"cloneOf": "Клонинг на {0}",
"Expiry": "Валиден до",
"Expiry date": "Дата на изтичане",
"Add Another": "Добави друг",
"Key Added": "Ключът е добавен",
"Add API Key": "Добави API ключ",
"No API Keys": "Няма API ключове",
"apiKey-active": "Активен",
"Expires": "Изтича на",
"deleteAPIKeyMsg": "Сигурни ли сте, че желаете да изтриете този API ключ?",
"Generate": "Генерирай",
"API Keys": "API Ключове",
"Don't expire": "Не изтича",
"Continue": "Продължи",
"apiKeyAddedMsg": "Вашият API ключ е добавен. Моля, запишете го, тъй като той няма да бъде показан отново.",
"apiKey-expired": "Изтекъл",
"apiKey-inactive": "Неактивен",
"disableAPIKeyMsg": "Сигурни ли сте, че желаете да деактивирате този API ключ?",
"pagertreeUrgency": "Спешност",
"pagertreeSilent": "Тих",
"pagertreeLow": "Ниска",
"pagertreeHigh": "Висока",
"pagertreeResolve": "Автоматично разрешаване",
"pagertreeDoNothing": "Не прави нищо",
"wayToGetPagerTreeIntegrationURL": "След като създадете интеграция на Uptime Kuma в PagerTree, копирайте крайната точка. За пълни подробности вижте {0}",
"pagertreeIntegrationUrl": "URL Адрес за интеграция",
"pagertreeMedium": "Средна",
"pagertreeCritical": "Критична",
"Add New Tag": "Добави нов етикет",
"lunaseaTarget": "Цел",
"lunaseaDeviceID": "ID на устройството",
"lunaseaUserID": "ID на потребител"
} }

@ -12,7 +12,7 @@
"grpcMethodDescription": "Název metody se převede do cammelCase formátu jako je sayHello, check, aj.", "grpcMethodDescription": "Název metody se převede do cammelCase formátu jako je sayHello, check, aj.",
"acceptedStatusCodesDescription": "Vyberte stavové kódy, které jsou považovány za úspěšnou odpověď.", "acceptedStatusCodesDescription": "Vyberte stavové kódy, které jsou považovány za úspěšnou odpověď.",
"Maintenance": "Údržba", "Maintenance": "Údržba",
"statusMaintenance": "Údržba", "statusMaintenance": "V údržbě",
"Schedule maintenance": "Naplánovat údržbu", "Schedule maintenance": "Naplánovat údržbu",
"Affected Monitors": "Dotčené dohledy", "Affected Monitors": "Dotčené dohledy",
"Pick Affected Monitors...": "Vyberte dotčené dohledy…", "Pick Affected Monitors...": "Vyberte dotčené dohledy…",
@ -24,9 +24,9 @@
"affectedStatusPages": "Zobrazit tuto zprávu o údržbě na vybraných stavových stránkách", "affectedStatusPages": "Zobrazit tuto zprávu o údržbě na vybraných stavových stránkách",
"atLeastOneMonitor": "Vyberte alespoň jeden dotčený dohled", "atLeastOneMonitor": "Vyberte alespoň jeden dotčený dohled",
"passwordNotMatchMsg": "Hesla se neshodují.", "passwordNotMatchMsg": "Hesla se neshodují.",
"notificationDescription": "Pro zajištění funkčnosti oznámení je nutné jej přiřadit dohledu.", "notificationDescription": "Aby byla upozornění fungovalo, je nutné ho přiřadit k dohledu.",
"keywordDescription": "Vyhledat klíčové slovo v prosté odpovědi HTML nebo JSON. Při hledání se rozlišuje velikost písmen.", "keywordDescription": "Vyhledat klíčové slovo v prosté odpovědi HTML nebo JSON. Při hledání se rozlišuje velikost písmen.",
"pauseDashboardHome": "Pozastaveno", "pauseDashboardHome": "Pauza",
"deleteMonitorMsg": "Opravdu chcete odstranit tento dohled?", "deleteMonitorMsg": "Opravdu chcete odstranit tento dohled?",
"deleteMaintenanceMsg": "Opravdu chcete odstranit tuto údržbu?", "deleteMaintenanceMsg": "Opravdu chcete odstranit tuto údržbu?",
"deleteNotificationMsg": "Opravdu chcete odstranit toto oznámení pro všechny dohledy?", "deleteNotificationMsg": "Opravdu chcete odstranit toto oznámení pro všechny dohledy?",
@ -59,7 +59,7 @@
"Add New Monitor": "Přidat nový dohled", "Add New Monitor": "Přidat nový dohled",
"Quick Stats": "Rychlý přehled", "Quick Stats": "Rychlý přehled",
"Up": "Běží", "Up": "Běží",
"Down": "Nedostupný", "Down": "Nedostupné",
"Pending": "Čekám", "Pending": "Čekám",
"Unknown": "Neznámý", "Unknown": "Neznámý",
"Pause": "Pauza", "Pause": "Pauza",
@ -74,7 +74,7 @@
"Current": "Aktuální", "Current": "Aktuální",
"Uptime": "Doba provozu", "Uptime": "Doba provozu",
"Cert Exp.": "Platnost certifikátu", "Cert Exp.": "Platnost certifikátu",
"Monitor": "Dohled | Dohledy", "Monitor": "Dohled | Dohledů",
"day": "den | dny/í", "day": "den | dny/í",
"-day": "-dní", "-day": "-dní",
"hour": "hodina", "hour": "hodina",
@ -542,7 +542,7 @@
"promosmsPassword": "API Password", "promosmsPassword": "API Password",
"pushoversounds pushover": "Pushover (výchozí)", "pushoversounds pushover": "Pushover (výchozí)",
"pushoversounds bike": "Kolo", "pushoversounds bike": "Kolo",
"pushoversounds bugle": "Bugle", "pushoversounds bugle": "Trumpeta",
"pushoversounds cashregister": "Pokladna", "pushoversounds cashregister": "Pokladna",
"pushoversounds classical": "Classical", "pushoversounds classical": "Classical",
"pushoversounds cosmic": "Kosmický", "pushoversounds cosmic": "Kosmický",
@ -554,9 +554,9 @@
"pushoversounds mechanical": "Mechanika", "pushoversounds mechanical": "Mechanika",
"pushoversounds pianobar": "Barové piano", "pushoversounds pianobar": "Barové piano",
"pushoversounds siren": "Siréna", "pushoversounds siren": "Siréna",
"pushoversounds spacealarm": "Space Alarm", "pushoversounds spacealarm": "Vesmírný alarm",
"pushoversounds tugboat": "Tug Boat", "pushoversounds tugboat": "Remorkér",
"pushoversounds alien": "Alien Alarm (dlouhý)", "pushoversounds alien": "Mimozemský poplach (dlouhý)",
"pushoversounds climb": "Climb (dlouhý)", "pushoversounds climb": "Climb (dlouhý)",
"pushoversounds persistent": "Persistent (dlouhý)", "pushoversounds persistent": "Persistent (dlouhý)",
"pushoversounds echo": "Pushover Echo (dlouhý)", "pushoversounds echo": "Pushover Echo (dlouhý)",
@ -581,7 +581,7 @@
"Connection String": "Připojovací řetězec", "Connection String": "Připojovací řetězec",
"Query": "Dotaz", "Query": "Dotaz",
"settingsCertificateExpiry": "Platnost TLS certifikátu", "settingsCertificateExpiry": "Platnost TLS certifikátu",
"certificationExpiryDescription": "Aktivovat oznámení nad HTTPS dohledy, pokud platnost TLS certifikátu vyprší za:", "certificationExpiryDescription": "HTTPS dohledy upozorní na vypršení platnosti certifikátu TLS nastavenou dobu dopředu:",
"Setup Docker Host": "Nastavit Docker hostitele", "Setup Docker Host": "Nastavit Docker hostitele",
"Connection Type": "Typ připojení", "Connection Type": "Typ připojení",
"Docker Daemon": "Démon Dockeru", "Docker Daemon": "Démon Dockeru",
@ -620,8 +620,8 @@
"backupRecommend": "Prosím, zálohujte si ručně celý svazek nebo datovou složku (./data/).", "backupRecommend": "Prosím, zálohujte si ručně celý svazek nebo datovou složku (./data/).",
"Optional": "Volitelný", "Optional": "Volitelný",
"squadcast": "Squadcast", "squadcast": "Squadcast",
"SendKey": "SendKey", "SendKey": "Klíč k odesílání",
"SMSManager API Docs": "Dokumentace SMSManager API ", "SMSManager API Docs": "Dokumentace API služby SMSManager ",
"Gateway Type": "Typ brány", "Gateway Type": "Typ brány",
"SMSManager": "SMSManager", "SMSManager": "SMSManager",
"You can divide numbers with": "Čísla můžete oddělit pomocí", "You can divide numbers with": "Čísla můžete oddělit pomocí",
@ -661,7 +661,7 @@
"dnsCacheDescription": "V některých IPv6 prostředích nemusí fungovat. Pokud narazíte na nějaké problémy, vypněte jej.", "dnsCacheDescription": "V některých IPv6 prostředích nemusí fungovat. Pokud narazíte na nějaké problémy, vypněte jej.",
"Single Maintenance Window": "Konkrétní časové okno pro údržbu", "Single Maintenance Window": "Konkrétní časové okno pro údržbu",
"Maintenance Time Window of a Day": "Časové okno pro údržbu v daný den", "Maintenance Time Window of a Day": "Časové okno pro údržbu v daný den",
"Effective Date Range": "Časové období", "Effective Date Range": "Časové období (volitelné)",
"Schedule Maintenance": "Naplánovat údržbu", "Schedule Maintenance": "Naplánovat údržbu",
"Date and Time": "Datum a čas", "Date and Time": "Datum a čas",
"DateTime Range": "Rozsah data a času", "DateTime Range": "Rozsah data a času",
@ -696,5 +696,58 @@
"Google Analytics ID": "ID Google Analytics", "Google Analytics ID": "ID Google Analytics",
"Edit Tag": "Upravit štítek", "Edit Tag": "Upravit štítek",
"Server Address": "Adresa serveru", "Server Address": "Adresa serveru",
"Learn More": "Zjistěte více" "Learn More": "Zjistěte více",
"notificationRegional": "Místní",
"telegramMessageThreadID": "(Nepovinné) ID vlákna zprávy",
"telegramMessageThreadIDDescription": "Nepovinný jedinečný identifikátor cílového vlákna zprávy (tématu) fóra; pouze pro nadskupiny fóra",
"telegramProtectContentDescription": "Pokud je tato funkce povolena, budou zprávy bota v aplikaci Telegram chráněny před přeposíláním a ukládáním.",
"Body Encoding": "Kódování těla zprávy",
"telegramProtectContent": "Ochrana přeposílání/ukládání",
"telegramSendSilently": "Odeslat potichu",
"telegramSendSilentlyDescription": "Zprávu odešle tiše. Uživatelé obdrží oznámení bez zvuku.",
"Clone": "Klonovat",
"cloneOf": "Klonovat {0}",
"Clone Monitor": "Klonovat dohled",
"API Keys": "API klíče",
"Expiry": "Platnost",
"Don't expire": "Nevyprší",
"Continue": "Pokračovat",
"Add Another": "Přidat další",
"Key Added": "Klíč byl přidán",
"Expiry date": "Vyprší dne",
"No API Keys": "Žàdné API klíče",
"apiKey-active": "Aktivní",
"apiKey-expired": "Vypršel",
"Expires": "Vyprší",
"disableAPIKeyMsg": "Jste si jistý, že chcete deaktivovat tento API klíč?",
"Add API Key": "Přidat API klíč",
"apiKey-inactive": "Neaktivní",
"Generate": "Vygenerovat",
"apiKeyAddedMsg": "Váš klíč API byl přidán. Poznamenejte si jej, protože se již nebude zobrazovat.",
"deleteAPIKeyMsg": "Opravdu chcete tento klíč API odstranit?",
"pagertreeUrgency": "Urgence",
"pagertreeSilent": "Potichu",
"pagertreeLow": "Slabě",
"pagertreeCritical": "Kritické",
"pagertreeResolve": "Automatické řešení",
"pagertreeDoNothing": "Nedělej nic",
"pagertreeIntegrationUrl": "Integrační URL",
"pagertreeMedium": "Středně",
"pagertreeHigh": "Nahlas",
"wayToGetPagerTreeIntegrationURL": "Po vytvoření integrace Uptime Kuma v aplikaci PagerTree zkopírujte koncový bod. Zobrazit všechny podrobnosti {0}",
"Add New Tag": "Přidat nový štítek",
"lunaseaTarget": "Cíl",
"lunaseaDeviceID": "ID zařízení",
"lunaseaUserID": "ID uživatele",
"statusPageRefreshIn": "Obnovení za: {0}",
"twilioAccountSID": "SID účtu",
"twilioFromNumber": "Číslo odesílatele",
"twilioToNumber": "Číslo příjemce",
"twilioAuthToken": "Autorizační token",
"sameAsServerTimezone": "Stejné jako časové pásmo serveru",
"cronExpression": "Cron výraz",
"cronSchedule": "Plán: ",
"invalidCronExpression": "Neplatný cron výraz: {0}",
"startDateTime": "Počáteční datum/čas",
"endDateTime": "Datum/čas konce"
} }

@ -23,7 +23,7 @@
"Status": "Status", "Status": "Status",
"DateTime": "Dato / Tid", "DateTime": "Dato / Tid",
"Message": "Beskeder", "Message": "Beskeder",
"No important events": "Inden vigtige begivenheder", "No important events": "Ingen vigtige begivenheder",
"Resume": "Fortsæt", "Resume": "Fortsæt",
"Edit": "Rediger", "Edit": "Rediger",
"Delete": "Slet", "Delete": "Slet",
@ -43,7 +43,7 @@
"URL": "URL", "URL": "URL",
"Hostname": "Hostname", "Hostname": "Hostname",
"Port": "Port", "Port": "Port",
"Heartbeat Interval": "Taktinterval", "Heartbeat Interval": "Hjerteslag interval",
"Retries": "Gentagelser", "Retries": "Gentagelser",
"retriesDescription": "Maksimalt antal gentagelser, før tjenesten markeres som inaktiv og sender en meddelelse.", "retriesDescription": "Maksimalt antal gentagelser, før tjenesten markeres som inaktiv og sender en meddelelse.",
"Advanced": "Avanceret", "Advanced": "Avanceret",
@ -152,7 +152,7 @@
"Options": "Valgmuligheder", "Options": "Valgmuligheder",
"Keep both": "Behold begge", "Keep both": "Behold begge",
"Tags": "Etiketter", "Tags": "Etiketter",
"Add New below or Select...": "Tilføj Nyt nedenfor eller Vælg ...", "Add New below or Select...": "Tilføj Ny nedenfor eller Vælg…",
"Tag with this name already exist.": "Et Tag med dette navn findes allerede.", "Tag with this name already exist.": "Et Tag med dette navn findes allerede.",
"Tag with this value already exist.": "Et Tag med denne værdi findes allerede.", "Tag with this value already exist.": "Et Tag med denne værdi findes allerede.",
"color": "farve", "color": "farve",
@ -165,7 +165,7 @@
"Indigo": "Indigo", "Indigo": "Indigo",
"Purple": "Lilla", "Purple": "Lilla",
"Pink": "Pink", "Pink": "Pink",
"Search...": "Søg...", "Search...": "Søg",
"Avg. Ping": "Gns. Ping", "Avg. Ping": "Gns. Ping",
"Avg. Response": "Gns. Respons", "Avg. Response": "Gns. Respons",
"Entry Page": "Entry Side", "Entry Page": "Entry Side",
@ -313,7 +313,7 @@
"Security": "Sikkerhed", "Security": "Sikkerhed",
"Steam API Key": "Steam API-nøgle", "Steam API Key": "Steam API-nøgle",
"Shrink Database": "Krymp Database", "Shrink Database": "Krymp Database",
"Pick a RR-Type...": "Vælg en RR-Type...", "Pick a RR-Type...": "Vælg en RR-Type",
"Pick Accepted Status Codes...": "Vælg Accepterede Statuskoder...", "Pick Accepted Status Codes...": "Vælg Accepterede Statuskoder...",
"Default": "Standard", "Default": "Standard",
"HTTP Options": "HTTP Valgmuligheder", "HTTP Options": "HTTP Valgmuligheder",
@ -444,5 +444,141 @@
"Using a Reverse Proxy?": "Bruger du en Reverse Proxy?", "Using a Reverse Proxy?": "Bruger du en Reverse Proxy?",
"deleteDockerHostMsg": "Er du sikker på, at du vil slette denne docker host for alle monitors?", "deleteDockerHostMsg": "Er du sikker på, at du vil slette denne docker host for alle monitors?",
"Docker Host": "Docker Host", "Docker Host": "Docker Host",
"Docker Hosts": "Docker Hosts" "Docker Hosts": "Docker Hosts",
"loadingError": "Kan ikke hente dataene, prøv igen senere.",
"Custom": "Brugerdefineret",
"Monitor": "Monitor | Monitors",
"Specific Monitor Type": "Specifik monitor-type",
"topic": "Emne",
"Fingerprint:": "Fingerprint:",
"Issuer:": "Udsteder:",
"dayOfWeek": "Ugedag",
"dayOfMonth": "Dag i måneden",
"lastDay": "Sidste dag",
"lastDay1": "Sidste dag i måneden",
"weekdayShortThu": "Tor",
"weekdayShortFri": "Fre",
"weekdayShortSat": "Lør",
"weekdayShortSun": "Søn",
"weekdayShortWed": "Ons",
"lastDay2": "Anden sidste dag i måneden",
"lastDay3": "Tredje sidste dag i måneden",
"lastDay4": "Fjerde sidste dag i måneden",
"maintenanceStatus-under-maintenance": "Under vedligeholdelse",
"maintenanceStatus-inactive": "Inaktiv",
"maintenanceStatus-scheduled": "Planlagt",
"maintenanceStatus-ended": "Afsluttet",
"maintenanceStatus-unknown": "Ukendt",
"Display Timezone": "Vis tidszone",
"Server Timezone": "Serverens tidszone",
"IconUrl": "Ikon URL",
"Enable DNS Cache": "Aktiver DNS Cache",
"Enable": "Aktiver",
"Disable": "Deaktiver",
"dnsCacheDescription": "Det fungerer muligvis ikke i alle IPv6-miljøer, så deaktiver det, hvis du støder på problemer.",
"Maintenance Time Window of a Day": "Tidsvindue for vedligeholdelse af en dag",
"Schedule Maintenance": "Planlæg vedligeholdelse",
"Date and Time": "Dato og klokkeslæt",
"plugin": "Plugin | Plugins",
"install": "Installer",
"uninstall": "Afinstaller",
"uninstalling": "Afinstallerer",
"confirmUninstallPlugin": "Er du sikker på, at du vil afinstallere dette plugin?",
"installing": "Installerer",
"markdownSupported": "Markdown syntax understøttet",
"Affected Monitors": "Berørte monitors",
"All Status Pages": "Alle statussider",
"Pick Affected Monitors...": "Vælg berørte monitors…",
"Select status pages...": "Vælg statusside…",
"proxyDescription": "Proxyer skal være tilknyttet en monitor for at fungere.",
"Accept characters:": "Accepter tegn:",
"Authentication": "Godkendelse",
"wayToGetCloudflaredURL": "(Download cloudflared fra {0})",
"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.": "Den aktuelle forbindelse kan gå tabt, hvis du er forbundet via Cloudflare Tunnel. Er du sikker på, at du vil stoppe det? Indtast din nuværende adgangskode for at bekræfte den.",
"Other Software": "Anden software",
"Date Created": "Dato oprettet",
"signedInDispDisabled": "Auth Deaktiveret.",
"certificationExpiryDescription": "HTTPS Monitors sender en notifikation, når TLS-certifikatet udløber om:",
"Also check beta release": "Se også betaudgivelsen",
"Show update if available": "Vis opdatering, hvis tilgængelig",
"wayToGetZohoCliqURL": "Du kan lære, hvordan du opretter et webhook URL {0}.",
"recurringInterval": "Interval",
"weekdayShortMon": "Man",
"weekdayShortTue": "Tir",
"dnsPortDescription": "DNS server port. Standardværdien er 53. Du kan altid ændre porten.",
"Valid To:": "Gyldig til:",
"Domain Name Expiry Notification": "Notifikation om udløb af domænenavn",
"Custom Monitor Type": "Brugerdefineret overvågningstype",
"API Keys": "API Nøgler",
"Don't expire": "Udløb aldrig",
"Continue": "Fortsæt",
"Add Another": "Tilføj en mere",
"Key Added": "Nøgle tilføjet",
"Add API Key": "Tilføj API Nøgle",
"No API Keys": "Ingen API nøgler",
"apiKey-active": "Aktiv",
"apiKey-expired": "Udløbet",
"apiKey-inactive": "Inaktiv",
"disableAPIKeyMsg": "Er du sikker på du vil deaktivere denne API nøgle?",
"Generate": "Generér",
"Game": "Spil",
"General Monitor Type": "Generel Overvågningstype",
"Clone Monitor": "Duplikér overvågning",
"Clone": "Duplikér",
"cloneOf": "Kopi af {0}",
"promosmsLogin": "API Login Navn",
"pushoversounds siren": "Sirene",
"pushoversounds none": "Ingen (lydløs)",
"smtpDkimSettings": "DKIM Indstillinger",
"documentation": "dokumentation",
"smtpDkimDomain": "Domænenavn",
"smtpDkimPrivateKey": "Privat nøgle",
"alertaApiEndpoint": "API Slutpunkt",
"alertaApiKey": "API Nøgle",
"smseagleEncoding": "Send som Unicode",
"onebotHttpAddress": "OneBot HTTP Adresse",
"onebotMessageType": "OneBot Meddelelse Type",
"onebotGroupMessage": "Gruppe",
"onebotPrivateMessage": "Privat",
"onebotUserOrGroupId": "Gruppe/Bruger ID",
"promosmsPassword": "API Adgangskode",
"recurringIntervalMessage": "Kør hver dag | Kør hver {0}. dag",
"smseagleTo": "Telefon numre",
"pagertreeIntegrationUrl": "Integration URL",
"pagertreeSilent": "Lydløs",
"pagertreeLow": "Lav",
"pagertreeMedium": "Mellem",
"pagertreeHigh": "Høj",
"pagertreeCritical": "Kritisk",
"pushoversounds vibrate": "Kun Vibration",
"Server Address": "Server Adresse",
"pauseMaintenanceMsg": "Er du sikker på du vil pause?",
"Recurring": "Tilbagevendende",
"Enable TLS": "Aktivér TLS",
"high": "høj",
"Base URL": "Base URL",
"Platform": "Platform",
"Android": "Android",
"Huawei": "Huawei",
"Retry": "Forsøg igen",
"Topic": "Emne",
"Setup Proxy": "Opsæt Proxy",
"Proxy Server": "Proxy Server",
"wayToGetClickSendSMSToken": "Du kan få API brugernavn og API nøgle fra {0} .",
"PushDeer Key": "PushDeer Nøgle",
"The resource is no longer available.": "Denne ressource er ikke længere tilgængelig.",
"Proxy Protocol": "Proxy Protokol",
"Integration Key": "Integration Nøgle",
"Integration URL": "Integration URL",
"do nothing": "gør intet",
"Passive Monitor Type": "Passiv Overvågningstype",
"Most likely causes:": "Mest sandsynlige årsager:",
"statusPageMaintenanceEndDate": "Slut",
"pushoversounds magic": "Magisk",
"pushoversounds mechanical": "Mekanisk",
"pushyAPIKey": "Hemmelig API Nøgle",
"Expiry date": "Udløbsdato",
"Expires": "Udløber",
"deleteAPIKeyMsg": "Er du sikker på du vil slette denne API nøgle?",
"pagertreeDoNothing": "Gør intet"
} }

@ -102,7 +102,7 @@
"deleteNotificationMsg": "Möchtest du diese Benachrichtigung wirklich für alle Monitore löschen?", "deleteNotificationMsg": "Möchtest du diese Benachrichtigung wirklich für alle Monitore löschen?",
"resolverserverDescription": "Cloudflare ist als der Standardserver festgelegt. Dieser kann jederzeit geändert werden.", "resolverserverDescription": "Cloudflare ist als der Standardserver festgelegt. Dieser kann jederzeit geändert werden.",
"Resolver Server": "Auflösungsserver", "Resolver Server": "Auflösungsserver",
"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, dass du den Monitor pausieren möchtest?", "pauseMonitorMsg": "Bist du sicher, dass du den Monitor pausieren möchtest?",
"clearEventsMsg": "Bist du sicher, dass du alle Ereignisse für diesen Monitor löschen möchtest?", "clearEventsMsg": "Bist du sicher, dass du alle Ereignisse für diesen Monitor löschen möchtest?",
@ -135,7 +135,7 @@
"Options": "Optionen", "Options": "Optionen",
"confirmImportMsg": "Möchtest du das Backup wirklich importieren? Bitte stelle sicher, dass die richtige Import-Option ausgewählt ist.", "confirmImportMsg": "Möchtest du das Backup wirklich importieren? Bitte stelle sicher, dass die richtige Import-Option ausgewählt ist.",
"Keep both": "Beide behalten", "Keep both": "Beide behalten",
"twoFAVerifyLabel": "Bitte trage deinen Token ein, um zu verifizieren, dass 2FA funktioniert", "twoFAVerifyLabel": "Bitte trage deinen Token ein, um zu verifizieren, dass 2FA funktioniert:",
"Verify Token": "Token verifizieren", "Verify Token": "Token verifizieren",
"Setup 2FA": "2FA einrichten", "Setup 2FA": "2FA einrichten",
"Enable 2FA": "2FA aktivieren", "Enable 2FA": "2FA aktivieren",
@ -206,7 +206,7 @@
"mattermost": "Mattermost", "mattermost": "Mattermost",
"Primary Base URL": "Primär URL", "Primary Base URL": "Primär URL",
"Push URL": "Push URL", "Push URL": "Push URL",
"needPushEvery": "Du solltest diese URL alle {0} Sekunden aufrufen", "needPushEvery": "Du solltest diese URL alle {0} Sekunden aufrufen.",
"pushOptionalParams": "Optionale Parameter: {0}", "pushOptionalParams": "Optionale Parameter: {0}",
"defaultNotificationName": "Mein {notification} Alarm ({number})", "defaultNotificationName": "Mein {notification} Alarm ({number})",
"here": "hier", "here": "hier",
@ -231,7 +231,7 @@
"smtpCC": "CC", "smtpCC": "CC",
"smtpBCC": "BCC", "smtpBCC": "BCC",
"Discord Webhook URL": "Discord Webhook URL", "Discord Webhook URL": "Discord Webhook URL",
"wayToGetDiscordURL": "Du kannst diese erhalten, indem du zu den Servereinstellungen gehst -> Integrationen -> Neuer Webhook", "wayToGetDiscordURL": "Du kannst diese erhalten, indem du zu den Servereinstellungen gehst -> Notifikationen -> Webhooks -> Neuer Webhook",
"Bot Display Name": "Bot-Anzeigename", "Bot Display Name": "Bot-Anzeigename",
"Prefix Custom Message": "Benutzerdefinierter Nachrichten Präfix", "Prefix Custom Message": "Benutzerdefinierter Nachrichten Präfix",
"Hello @everyone is...": "Hallo {'@'}everyone ist…", "Hello @everyone is...": "Hallo {'@'}everyone ist…",
@ -276,10 +276,10 @@
"appriseInstalled": "Apprise ist installiert.", "appriseInstalled": "Apprise ist installiert.",
"appriseNotInstalled": "Apprise ist nicht installiert. {0}", "appriseNotInstalled": "Apprise ist nicht installiert. {0}",
"Access Token": "Access Token", "Access Token": "Access Token",
"Channel access token": "Channel access token", "Channel access token": "Channel Access Token",
"Line Developers Console": "Line Developers Console", "Line Developers Console": "Line Developers Console",
"lineDevConsoleTo": "Line Developers Console - {0}", "lineDevConsoleTo": "Line Developers Console - {0}",
"Basic Settings": "Basic Settings", "Basic Settings": "Grundeinstellungen",
"User ID": "User ID", "User ID": "User ID",
"Messaging API": "Messaging API", "Messaging API": "Messaging API",
"wayToGetLineChannelToken": "Rufe zuerst {0} auf, erstelle dann einen Provider und Channel (Messaging API). Als nächstes kannst du den Channel access token und die User ID aus den oben genannten Menüpunkten abrufen.", "wayToGetLineChannelToken": "Rufe zuerst {0} auf, erstelle dann einen Provider und Channel (Messaging API). Als nächstes kannst du den Channel access token und die User ID aus den oben genannten Menüpunkten abrufen.",
@ -298,7 +298,7 @@
"Internal Room Id": "Interne Raum-ID", "Internal Room Id": "Interne Raum-ID",
"matrixDesc1": "Die interne Raum-ID findest du im erweiterten Bereich der Raumeinstellungen im Matrix-Client. Es sollte aussehen wie z.B. !QMdRCpUIfLwsfjxye6:home.server.", "matrixDesc1": "Die interne Raum-ID findest du im erweiterten Bereich der Raumeinstellungen im Matrix-Client. Es sollte aussehen wie z.B. !QMdRCpUIfLwsfjxye6:home.server.",
"matrixDesc2": "Es wird dringend empfohlen einen neuen Benutzer anzulegen und nicht den Zugriffstoken deines eigenen Matrix-Benutzers zu verwenden. Anderenfalls ermöglicht es vollen Zugriff auf dein Konto und alle Räume, denen du beigetreten bist. Erstelle stattdessen einen neuen Benutzer und lade ihn nur in den Raum ein, in dem du die Benachrichtigung erhalten möchtest. Du kannst den Zugriffstoken erhalten, indem du Folgendes ausführst {0}", "matrixDesc2": "Es wird dringend empfohlen einen neuen Benutzer anzulegen und nicht den Zugriffstoken deines eigenen Matrix-Benutzers zu verwenden. Anderenfalls ermöglicht es vollen Zugriff auf dein Konto und alle Räume, denen du beigetreten bist. Erstelle stattdessen einen neuen Benutzer und lade ihn nur in den Raum ein, in dem du die Benachrichtigung erhalten möchtest. Du kannst den Zugriffstoken erhalten, indem du Folgendes ausführst {0}",
"Method": "Method", "Method": "Methode",
"Body": "Body", "Body": "Body",
"Headers": "Headers", "Headers": "Headers",
"PushUrl": "Push URL", "PushUrl": "Push URL",
@ -348,7 +348,7 @@
"Services": "Dienste", "Services": "Dienste",
"Discard": "Verwerfen", "Discard": "Verwerfen",
"Cancel": "Abbrechen", "Cancel": "Abbrechen",
"Powered by": "Powered by", "Powered by": "Erstellt mit",
"shrinkDatabaseDescription": "Löse VACUUM für die SQLite Datenbank aus. Wenn die Datenbank nach 1.10.0 erstellt wurde, ist AUTO_VACUUM bereits aktiviert und diese Aktion ist nicht erforderlich.", "shrinkDatabaseDescription": "Löse VACUUM für die SQLite Datenbank aus. Wenn die Datenbank nach 1.10.0 erstellt wurde, ist AUTO_VACUUM bereits aktiviert und diese Aktion ist nicht erforderlich.",
"serwersms": "SerwerSMS.pl", "serwersms": "SerwerSMS.pl",
"serwersmsAPIUser": "API Benutzername (inkl. webapi_ prefix)", "serwersmsAPIUser": "API Benutzername (inkl. webapi_ prefix)",
@ -533,7 +533,7 @@
"Also check beta release": "Auch nach beta Versionen schauen", "Also check beta release": "Auch nach beta Versionen schauen",
"Using a Reverse Proxy?": "Wird ein Reverse Proxy genutzt?", "Using a Reverse Proxy?": "Wird ein Reverse Proxy genutzt?",
"Check how to config it for WebSocket": "Prüfen, wie er für die Nutzung mit WebSocket konfiguriert wird", "Check how to config it for WebSocket": "Prüfen, wie er für die Nutzung mit WebSocket konfiguriert wird",
"Steam Game Server": "Steam Game Server", "Steam Game Server": "Steam Spielserver",
"Most likely causes:": "Wahrscheinliche Ursachen:", "Most likely causes:": "Wahrscheinliche Ursachen:",
"The resource is no longer available.": "Die Quelle ist nicht mehr verfügbar.", "The resource is no longer available.": "Die Quelle ist nicht mehr verfügbar.",
"There might be a typing error in the address.": "Es gibt einen Tippfehler in der Adresse.", "There might be a typing error in the address.": "Es gibt einen Tippfehler in der Adresse.",
@ -560,7 +560,7 @@
"Domain": "Domain", "Domain": "Domain",
"Workstation": "Workstation", "Workstation": "Workstation",
"disableCloudflaredNoAuthMsg": "Du bist im nicht-authentifizieren Modus, ein Passwort wird nicht benötigt.", "disableCloudflaredNoAuthMsg": "Du bist im nicht-authentifizieren Modus, ein Passwort wird nicht benötigt.",
"trustProxyDescription": "Vertraue 'X-Forwarded-*' headern. Wenn man die richtige client IP haben möchte und Uptime Kuma hinter einem Proxy wie Nginx or Apache läuft, wollte dies aktiviert werden.", "trustProxyDescription": "Vertraue 'X-Forwarded-*' headern. Wenn man die richtige Client IP erhalten möchte und Uptime Kuma hinter einem Proxy wie Nginx oder Apache läuft, sollte dies aktiviert werden.",
"wayToGetLineNotifyToken": "Du kannst hier ein Token erhalten: {0}", "wayToGetLineNotifyToken": "Du kannst hier ein Token erhalten: {0}",
"Examples": "Beispiele", "Examples": "Beispiele",
"Home Assistant URL": "Home Assistant URL", "Home Assistant URL": "Home Assistant URL",
@ -590,22 +590,22 @@
"atLeastOneMonitor": "Wähle mindestens einen Monitor", "atLeastOneMonitor": "Wähle mindestens einen Monitor",
"deleteMaintenanceMsg": "Möchtest du diese Wartung löschen?", "deleteMaintenanceMsg": "Möchtest du diese Wartung löschen?",
"Base URL": "Basis URL", "Base URL": "Basis URL",
"goAlertInfo": "GoAlert ist eine Open-Source Applikation für Rufbereitschaftsplanung, automatische Eskalation und Benachrichtigung (z.B. SMS oder Telefonanrufe). Beauftragen Sie automatisch die richtige Person, auf die richtige Art und Weise und zum richtigen Zeitpunkt. {0}", "goAlertInfo": "GoAlert ist eine Open-Source Applikation für Rufbereitschaftsplanung, automatische Eskalation und Benachrichtigung (z.B. SMS oder Telefonanrufe). Engagiere automatisch die richtige Person, auf die richtige Art und Weise und zum richtigen Zeitpunkt! {0}",
"goAlertIntegrationKeyInfo": "Bekommt einen generischen API Schlüssel in folgenden Format \"aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee\". Normalerweise entspricht dies dem Wert des Token aus der URL.", "goAlertIntegrationKeyInfo": "Bekommt einen generischen API Schlüssel in folgenden Format \"aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee\". Normalerweise entspricht dies dem Wert des Token aus der URL.",
"goAlert": "GoAlert", "goAlert": "GoAlert",
"backupOutdatedWarning": "Veraltet: Eine menge Neuerungen sind eingeflossen und diese Funktion wurde etwas vernachlässigt worden. Es kann kein vollständiges Backup erstellt oder eingespielt werden.", "backupOutdatedWarning": "Veraltet: Da viele Funktionen hinzugefügt wurden und die Backupfunktion nicht mehr gepflegt wird, kann keine vollständige Sicherung erstellt oder wiederhergestellt werden.",
"backupRecommend": "Bitte Backup das Volume oder den Ordner (./ data /) selbst.", "backupRecommend": "Bitte Backup das Volume oder den Ordner (./ data /) selbst.",
"Optional": "Optional", "Optional": "Optional",
"squadcast": "Squadcast", "squadcast": "Squadcast",
"SendKey": "SendKey", "SendKey": "SendKey",
"SMSManager API Docs": "SMSManager API Dokumente ", "SMSManager API Docs": "SMSManager API Dokumente ",
"Gateway Type": "Gateway Type", "Gateway Type": "Gateway Typ",
"SMSManager": "SMSManager", "SMSManager": "SMSManager",
"You can divide numbers with": "Du kannst Zahlen teilen mit", "You can divide numbers with": "Du kannst Zahlen teilen mit",
"or": "oder", "or": "oder",
"recurringInterval": "Intervall", "recurringInterval": "Intervall",
"Recurring": "Wiederkehrend", "Recurring": "Wiederkehrend",
"strategyManual": "Active/Inactive Manually", "strategyManual": "Aktiv/Inaktiv Manuell",
"warningTimezone": "Es wird die Zeitzone des Servers genutzt", "warningTimezone": "Es wird die Zeitzone des Servers genutzt",
"weekdayShortMon": "Mo", "weekdayShortMon": "Mo",
"weekdayShortTue": "Di", "weekdayShortTue": "Di",
@ -629,5 +629,122 @@
"maintenanceStatus-ended": "Ende", "maintenanceStatus-ended": "Ende",
"maintenanceStatus-unknown": "Unbekannt", "maintenanceStatus-unknown": "Unbekannt",
"Display Timezone": "Zeitzone anzeigen", "Display Timezone": "Zeitzone anzeigen",
"Server Timezone": "Server Zeitzone" "Server Timezone": "Server Zeitzone",
"telegramMessageThreadID": "(Optional) Nachrichten Thread ID",
"telegramMessageThreadIDDescription": "Optionale eindeutige Kennung für den Ziel-Thread (Thema) des Forums; nur für Forum-Supergroups",
"Enable": "Aktivieren",
"telegramProtectContent": "Schütze gegen Weiterleiten/Speichern der Nachricht",
"telegramProtectContentDescription": "Die Bot-Nachrichten in Telegram sind gegen Weiterleitung und Speichern geschützt.",
"Disable": "Deaktivieren",
"plugin": "Plugin | Plugins",
"installing": "Installiere",
"uninstall": "Deinstallieren",
"uninstalling": "Deinstalliere",
"confirmUninstallPlugin": "Möchtest du dieses Plugin wirklich deinstallieren?",
"notificationRegional": "Regional",
"Single Maintenance Window": "Einmaliges Wartungsfenster",
"dnsCacheDescription": "In einigen IPv6-Umgebungen funktioniert es möglicherweise nicht. Deaktiviere es, wenn Probleme auftreten.",
"Maintenance Time Window of a Day": "Wartungszeitfenster eines Tages",
"Effective Date Range": "Gültigkeitsbereich (Optional)",
"Schedule Maintenance": "Wartung planen",
"Date and Time": "Datum und Uhrzeit",
"DateTime Range": "Datums- und Zeitbereich",
"telegramSendSilently": "Stumm senden",
"telegramSendSilentlyDescription": "Sende die Nachricht stumm. Nutzer bekommen eine Benachrichtigung ohne Ton.",
"markdownSupported": "Markdown-Syntax unterstützt",
"webhookAdditionalHeadersTitle": "Zusätzliche Header",
"webhookAdditionalHeadersDesc": "Legt zusätzliche Kopfzeilen fest, die mit dem Webhook gesendet werden.",
"Packet Size": "Paketgrösse",
"IconUrl": "Symbol URL",
"Enable DNS Cache": "DNS Cache aktivieren",
"Help": "Hilfe",
"Game": "Spiel",
"General Monitor Type": "Allgemeiner Monitortyp",
"Passive Monitor Type": "Passiver Monitortyp",
"Specific Monitor Type": "Spezifischer Monitortyp",
"Monitor": "Überwachung | Monitore",
"Custom": "Benutzerdefiniert",
"statusPageMaintenanceEndDate": "Ende",
"loadingError": "Die Daten konnten nicht abgerufen werden, bitte später noch einmal versuchen.",
"install": "Installieren",
"Body Encoding": "Body Encoding",
"Custom Monitor Type": "Benutzerdefinierter Monitortyp",
"Expiry": "Ablauf",
"Expiry date": "Ablaufdatum",
"Don't expire": "Nicht ablaufen",
"Add Another": "Hinzufügen",
"Key Added": "Schlüssel hinzugefügt",
"apiKeyAddedMsg": "API Schlüssel wurde hinzugefügt. Bitte notiere den Schlüssel, da er nicht erneut angezeigt wird.",
"Add API Key": "API Schlüssel hinzufügen",
"No API Keys": "Kein API Schlüssel",
"apiKey-active": "Aktiv",
"apiKey-expired": "Abgelaufen",
"apiKey-inactive": "Inaktiv",
"Expires": "Läuft ab",
"disableAPIKeyMsg": "Bist du sicher, dass du diesen API Schlüssel deaktivieren willst?",
"deleteAPIKeyMsg": "Bist du sicher, dass du diesen API Schlüssel löschen willst?",
"Generate": "Generieren",
"infiniteRetention": "Für unendliche Speicherung auf 0 setzen.",
"dataRetentionTimeError": "Aufbewahrungsfrist muss grösser oder gleich 0 sein",
"Clone Monitor": "Monitor klonen",
"Clone": "Klonen",
"cloneOf": "Klon von {0}",
"wayToGetZohoCliqURL": "Wie eine Webhook URL erstellt werden kann, erfährst du {0}.",
"enableGRPCTls": "Senden von gRPC Anforderungen mit TLS Verbindung zulassen",
"grpcMethodDescription": "Der Name der Methode wird in das \"cammelCase\" Format konvertiert (z.B. sayHello, check, etc.)",
"wayToGetKookGuildID": "Schalte den „Entwicklermodus“ in den Kook-Einstellungen ein und klicke mit der rechten Maustaste auf die Gilde, um die ID zu erhalten",
"Guild ID": "Gilde ID",
"Lowcost": "Kostengünstig",
"high": "hoch",
"Google Analytics ID": "Google Analytics ID",
"Enable TLS": "TLS aktivieren",
"Free Mobile API Key": "Kostenloser Mobile API Schlüssel",
"Proto Service Name": "Proto Dienst Name",
"Proto Method": "Proto Methode",
"Proto Content": "Proto Inhalt",
"Economy": "Economy",
"pagertreeIntegrationUrl": "Integrations-URL",
"pagertreeUrgency": "Dringlichkeit",
"pagertreeSilent": "Stumm",
"pagertreeLow": "Niedrig",
"pagertreeMedium": "Mittel",
"pagertreeHigh": "Hoch",
"pagertreeCritical": "Kritisch",
"pagertreeResolve": "Automatisch auflösen",
"pagertreeDoNothing": "Nichts tun",
"wayToGetPagerTreeIntegrationURL": "Nachdem du die Uptime Kuma Integration in PagerTree erstellt hast, kopiere den Endpunkt. Siehe details {0}",
"Server Address": "Serveradresse",
"Learn More": "Erfahre mehr",
"Edit Tag": "Tag editieren",
"promosmsAllowLongSMS": "Lange SMS erlauben",
"smseagleRecipientType": "Empfängertyp",
"smseagleToken": "API Zugriffstoken",
"smseagleTo": "Telefonnummer(n)",
"smseagleUrl": "Ihre SMSEagle Geräte URL",
"smseagleEncoding": "Als Unicode senden",
"smseaglePriority": "Nachrichtenpriorität (0-9, Standard = 0)",
"smseagleContact": "Telefonbuch Kontaktname(n)",
"confirmDeleteTagMsg": "Möchtest du dieses Tag wirklich löschen? Monitore, die mit diesem Tag verknüpft sind, werden nicht gelöscht.",
"wayToGetKookBotToken": "Erstelle eine Anwendung und erhalte den Bot-Token unter {0}",
"Strategy": "Strategie",
"Free Mobile User Identifier": "Kostenlose mobile Benutzerkennung",
"smseagleGroup": "Telefonbuch Gruppenname(n)",
"smseagleRecipient": "Empfänger (mehrere müssen durch Komma getrennt werden)",
"API Keys": "API Schlüssel",
"Continue": "Weiter",
"Add New Tag": "Neuen Tag hinzufügen",
"lunaseaTarget": "Ziel",
"lunaseaDeviceID": "Geräte-ID",
"lunaseaUserID": "Benutzer-ID",
"twilioAccountSID": "Account SID",
"twilioFromNumber": "Absender",
"twilioToNumber": "Empfänger",
"twilioAuthToken": "Auth Token",
"statusPageRefreshIn": "Aktualisierung in: {0}",
"sameAsServerTimezone": "Gleiche Zeitzone wie Server",
"startDateTime": "Start Datum/Uhrzeit",
"endDateTime": "Ende Datum/Uhrzeit",
"cronExpression": "Cron-Ausdruck",
"cronSchedule": "Zeitplan: ",
"invalidCronExpression": "Ungültiger Cron-Ausdruck: {0}"
} }

@ -2,7 +2,7 @@
"languageName": "Deutsch (Deutschland)", "languageName": "Deutsch (Deutschland)",
"Settings": "Einstellungen", "Settings": "Einstellungen",
"Dashboard": "Dashboard", "Dashboard": "Dashboard",
"New Update": "Update verfügbar", "New Update": "Aktualisierung verfügbar",
"Language": "Sprache", "Language": "Sprache",
"Appearance": "Erscheinungsbild", "Appearance": "Erscheinungsbild",
"Theme": "Erscheinungsbild", "Theme": "Erscheinungsbild",
@ -278,7 +278,7 @@
"Access Token": "Zugriffstoken", "Access Token": "Zugriffstoken",
"Channel access token": "Channel access token", "Channel access token": "Channel access token",
"Line Developers Console": "Zeile Entwickler Konsole", "Line Developers Console": "Zeile Entwickler Konsole",
"lineDevConsoleTo": "Line Developers Console - {0}", "lineDevConsoleTo": "Line Entwicklerkonsole - {0}",
"Basic Settings": "Grundeinstellungen", "Basic Settings": "Grundeinstellungen",
"User ID": "User ID", "User ID": "User ID",
"Messaging API": "Messaging API", "Messaging API": "Messaging API",
@ -348,7 +348,7 @@
"Services": "Dienste", "Services": "Dienste",
"Discard": "Verwerfen", "Discard": "Verwerfen",
"Cancel": "Abbrechen", "Cancel": "Abbrechen",
"Powered by": "Powered by", "Powered by": "Erstellt mit",
"shrinkDatabaseDescription": "Löse VACUUM für die SQLite Datenbank aus. Wenn die Datenbank nach 1.10.0 erstellt wurde, ist AUTO_VACUUM bereits aktiviert und diese Aktion ist nicht erforderlich.", "shrinkDatabaseDescription": "Löse VACUUM für die SQLite Datenbank aus. Wenn die Datenbank nach 1.10.0 erstellt wurde, ist AUTO_VACUUM bereits aktiviert und diese Aktion ist nicht erforderlich.",
"serwersms": "SerwerSMS.pl", "serwersms": "SerwerSMS.pl",
"serwersmsAPIUser": "API Benutzername (inkl. webapi_ prefix)", "serwersmsAPIUser": "API Benutzername (inkl. webapi_ prefix)",
@ -388,7 +388,7 @@
"Valid": "Gültig", "Valid": "Gültig",
"Invalid": "Ungültig", "Invalid": "Ungültig",
"AccessKeyId": "AccessKey ID", "AccessKeyId": "AccessKey ID",
"SecretAccessKey": "AccessKey Secret", "SecretAccessKey": "Geheimer Zugangsschlüssel",
"PhoneNumbers": "Telefonnummern", "PhoneNumbers": "Telefonnummern",
"TemplateCode": "Vorlagencode", "TemplateCode": "Vorlagencode",
"SignName": "Signaturname", "SignName": "Signaturname",
@ -533,7 +533,7 @@
"Also check beta release": "Auch nach Beta Versionen schauen", "Also check beta release": "Auch nach Beta Versionen schauen",
"Using a Reverse Proxy?": "Wird ein Reverse Proxy genutzt?", "Using a Reverse Proxy?": "Wird ein Reverse Proxy genutzt?",
"Check how to config it for WebSocket": "Prüfen, wie er für die Nutzung mit WebSocket konfiguriert wird", "Check how to config it for WebSocket": "Prüfen, wie er für die Nutzung mit WebSocket konfiguriert wird",
"Steam Game Server": "Steam Game Server", "Steam Game Server": "Steam Spielserver",
"Most likely causes:": "Wahrscheinliche Ursachen:", "Most likely causes:": "Wahrscheinliche Ursachen:",
"The resource is no longer available.": "Die Quelle ist nicht mehr verfügbar.", "The resource is no longer available.": "Die Quelle ist nicht mehr verfügbar.",
"There might be a typing error in the address.": "Es gibt einen Tippfehler in der Adresse.", "There might be a typing error in the address.": "Es gibt einen Tippfehler in der Adresse.",
@ -590,7 +590,7 @@
"atLeastOneMonitor": "Wähle mindestens einen Monitor", "atLeastOneMonitor": "Wähle mindestens einen Monitor",
"deleteMaintenanceMsg": "Möchtest du diese Wartung löschen?", "deleteMaintenanceMsg": "Möchtest du diese Wartung löschen?",
"Base URL": "Basis URL", "Base URL": "Basis URL",
"goAlertInfo": "GoAlert ist eine Open-Source Applikation für Rufbereitschaftsplanung, automatische Eskalation und Benachrichtigung (z.B. SMS oder Telefonanrufe). Beauftragen Sie automatisch die richtige Person, auf die richtige Art und Weise und zum richtigen Zeitpunkt. {0}", "goAlertInfo": "GoAlert ist eine Open-Source Applikation für Rufbereitschaftsplanung, automatische Eskalation und Benachrichtigung (z.B. SMS oder Telefonanrufe). Engagiere automatisch die richtige Person, auf die richtige Art und Weise und zum richtigen Zeitpunkt! {0}",
"goAlertIntegrationKeyInfo": "Bekommt einen generischen API Schlüssel in folgenden Format \"aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee\". Normalerweise entspricht dies dem Wert des Token aus der URL.", "goAlertIntegrationKeyInfo": "Bekommt einen generischen API Schlüssel in folgenden Format \"aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee\". Normalerweise entspricht dies dem Wert des Token aus der URL.",
"goAlert": "GoAlert", "goAlert": "GoAlert",
"backupOutdatedWarning": "Veraltet: Da viele Funktionen hinzugefügt wurden und diese Sicherungsfunktion nicht mehr gepflegt wird, kann keine vollständige Sicherung erstellen oder wiederherstellen werden.", "backupOutdatedWarning": "Veraltet: Da viele Funktionen hinzugefügt wurden und diese Sicherungsfunktion nicht mehr gepflegt wird, kann keine vollständige Sicherung erstellen oder wiederherstellen werden.",
@ -599,15 +599,15 @@
"squadcast": "Squadcast", "squadcast": "Squadcast",
"SendKey": "SendKey", "SendKey": "SendKey",
"SMSManager API Docs": "SMSManager API Dokumente", "SMSManager API Docs": "SMSManager API Dokumente",
"Gateway Type": "Gateway Type", "Gateway Type": "Gateway Typ",
"SMSManager": "SMSManager", "SMSManager": "SMSManager",
"You can divide numbers with": "Du kannst Zahlen teilen mit", "You can divide numbers with": "Du kannst Zahlen teilen mit",
"or": "oder", "or": "oder",
"recurringInterval": "Intervall", "recurringInterval": "Intervall",
"Recurring": "Wiederkehrend", "Recurring": "Wiederkehrend",
"Single Maintenance Window": "Einzigartiges Wartungsfenster", "Single Maintenance Window": "Einmaliges Wartungsfenster",
"Maintenance Time Window of a Day": "Zeitfenster für die Wartung", "Maintenance Time Window of a Day": "Zeitfenster für die Wartung",
"Effective Date Range": "Bereich der Wirksamkeitsdaten", "Effective Date Range": "Bereich der Wirksamkeitsdaten (Optional)",
"strategyManual": "Aktiv/Inaktiv Manuell", "strategyManual": "Aktiv/Inaktiv Manuell",
"warningTimezone": "Es wird die Zeitzone des Servers verwendet", "warningTimezone": "Es wird die Zeitzone des Servers verwendet",
"weekdayShortMon": "Mo", "weekdayShortMon": "Mo",
@ -646,20 +646,20 @@
"Disable": "Deaktivieren", "Disable": "Deaktivieren",
"Custom Monitor Type": "Benutzerdefinierter Monitortyp", "Custom Monitor Type": "Benutzerdefinierter Monitortyp",
"webhookAdditionalHeadersDesc": "Legt zusätzliche Header fest, die mit der Webhook gesendet wurden.", "webhookAdditionalHeadersDesc": "Legt zusätzliche Header fest, die mit der Webhook gesendet wurden.",
"dnsCacheDescription": "In einigen IPv6-Umgebungen funktioniert es möglicherweise nicht. Deaktivieren Sie es, wenn Sie auf Probleme stoßen.", "dnsCacheDescription": "In einigen IPv6-Umgebungen funktioniert es möglicherweise nicht. Deaktiviere es, wenn Probleme auftreten.",
"loadingError": "Die Daten konnten nicht abgerufen werden, bitte später noch einmal versuchen.", "loadingError": "Die Daten konnten nicht abgerufen werden, bitte später noch einmal versuchen.",
"confirmUninstallPlugin": "Möchten Sie dieses Plugin wirklich deinstallieren?", "confirmUninstallPlugin": "Möchtest du dieses Plugin wirklich deinstallieren?",
"grpcMethodDescription": "Der Name der Methode wird in das \"cammelCase\"-Format konvertiert (z.B. sayHello, check, etc.)", "grpcMethodDescription": "Der Name der Methode wird in das \"cammelCase\"-Format konvertiert (z.B. sayHello, check, etc.)",
"Passive Monitor Type": "Passiver Monitortyp", "Passive Monitor Type": "Passiver Monitortyp",
"Specific Monitor Type": "Spezifischer Monitortyp", "Specific Monitor Type": "Spezifischer Monitortyp",
"webhookAdditionalHeadersTitle": "Zusätzliche Header", "webhookAdditionalHeadersTitle": "Zusätzliche Header",
"Packet Size": "Paketgröße", "Packet Size": "Paketgröße",
"IconUrl": "Symbol-URL", "IconUrl": "Symbol-URL",
"wayToGetZohoCliqURL": "Erfahren Sie, wie Sie eine Webhook-URL {0} erstellen.", "wayToGetZohoCliqURL": "Wie eine Webhook URL erstellt werden kann, erfährst du {0}.",
"dataRetentionTimeError": "Aufbewahrungszeit muss 0 oder größer sein", "dataRetentionTimeError": "Aufbewahrungszeit muss 0 oder größer sein",
"infiniteRetention": "Für unendliche Aufbewahrung auf 0 setzen.", "infiniteRetention": "Für unendliche Aufbewahrung auf 0 setzen.",
"confirmDeleteTagMsg": "Möchten Sie dieses Tag wirklich löschen? Mit diesem Tag verknüpfte Monitore werden nicht gelöscht.", "confirmDeleteTagMsg": "Möchtest du dieses Tag wirklich löschen? Monitore, die mit diesem Tag verknüpft sind, werden nicht gelöscht.",
"enableGRPCTls": "Erlaube das Senden von gRPC-Anfragen mit TLS-Verbindung", "enableGRPCTls": "Senden von gRPC-Anforderungen mit TLS-Verbindung zulassen",
"ZohoCliq": "ZohoCliq", "ZohoCliq": "ZohoCliq",
"Monitor": "Überwachung | Monitore", "Monitor": "Überwachung | Monitore",
"plugin": "Plugin | Plugins", "plugin": "Plugin | Plugins",
@ -668,18 +668,18 @@
"uninstall": "Deinstallieren", "uninstall": "Deinstallieren",
"uninstalling": "Deinstallation", "uninstalling": "Deinstallation",
"markdownSupported": "Markdown-Syntax unterstützt", "markdownSupported": "Markdown-Syntax unterstützt",
"wayToGetKookBotToken": "Anwendung erstellen und den Bot-Token {0} abrufen", "wayToGetKookBotToken": "Erstelle eine Anwendung und erhalte den Bot-Token unter {0}",
"wayToGetKookGuildID": "Schalten Sie den \"Entwicklermodus\" in den Kook-Einstellungen ein und klicken Sie mit der rechten Maustaste auf die Gilde, um ihre ID zu erhalten.", "wayToGetKookGuildID": "Schalte den „Entwicklermodus“ in den Kook-Einstellungen ein und klicke mit der rechten Maustaste auf die Gilde, um die ID zu erhalten",
"Guild ID": "Gilden-ID", "Guild ID": "Guild-ID",
"Free Mobile User Identifier": "Kostenlose mobile Benutzerkennung", "Free Mobile User Identifier": "Kostenlose mobile Benutzerkennung",
"Free Mobile API Key": "Kostenloser Mobile API-Schlüssel", "Free Mobile API Key": "Kostenloser Mobile API-Schlüssel",
"Enable TLS": "Aktiviere TLS", "Enable TLS": "Aktiviere TLS",
"Proto Service Name": "Proto Service Name", "Proto Service Name": "Name des Proto-Dienstes",
"Proto Method": "Proto Methode", "Proto Method": "Proto-Methode",
"Proto Content": "Proto Inhalt", "Proto Content": "Proto-Inhalt",
"Economy": "Economy-Modus", "Economy": "Wirtschaft",
"Lowcost": "Lowcost-Modus", "Lowcost": "Kostengünstig",
"high": "High-Modus", "high": "hoch",
"promosmsAllowLongSMS": "Erlaube lange SMS", "promosmsAllowLongSMS": "Erlaube lange SMS",
"General Monitor Type": "Allgemeiner Monitortyp", "General Monitor Type": "Allgemeiner Monitortyp",
"smseagle": "SMSEagle", "smseagle": "SMSEagle",
@ -687,14 +687,67 @@
"smseagleGroup": "Telefonbuch Gruppenname(n)", "smseagleGroup": "Telefonbuch Gruppenname(n)",
"smseagleContact": "Telefonbuch Kontaktname(n)", "smseagleContact": "Telefonbuch Kontaktname(n)",
"smseagleRecipientType": "Empfängertyp", "smseagleRecipientType": "Empfängertyp",
"smseagleRecipient": "Empfänger (mehrere müssen mit Komma getrennt werden)", "smseagleRecipient": "Empfänger (mehrere müssen durch Komma getrennt werden)",
"smseagleToken": "API-Zugriffstoken", "smseagleToken": "API-Zugriffstoken",
"smseagleUrl": "Deine SMSEagle-Geräte-URL", "smseagleUrl": "Ihre SMSEagle-Geräte-URL",
"Kook": "Kook", "Kook": "Kook",
"smseagleEncoding": "Als Unicode senden", "smseagleEncoding": "Als Unicode senden",
"smseaglePriority": "Nachrichtenpriorität (0-9, Standard = 0)", "smseaglePriority": "Nachrichtenpriorität (0-9, Standard = 0)",
"Google Analytics ID": "Google Analytics ID", "Google Analytics ID": "Google Analytics ID",
"Edit Tag": "bearbeite Tag", "Edit Tag": "bearbeite Tag",
"Server Address": "Server Adresse", "Server Address": "Server Adresse",
"Learn More": "Erfahre mehr" "Learn More": "Erfahre mehr",
"Body Encoding": "Körperkodierung",
"Add API Key": "API Schlüssel hinzufügen",
"apiKey-active": "Aktiv",
"apiKey-expired": "Abgelaufen",
"apiKey-inactive": "Inaktiv",
"Expires": "Läuft ab",
"deleteAPIKeyMsg": "Bist du sicher, dass du diesen API Schlüssel löschen willst?",
"Generate": "Generieren",
"API Keys": "API Schlüssel",
"Expiry": "Ablauf",
"Expiry date": "Ablaufdatum",
"Don't expire": "Nicht ablaufen",
"Continue": "Weiter",
"Add Another": "Hinzufügen",
"Clone Monitor": "Duplikat von",
"Clone": "Duplizieren",
"cloneOf": "Duplikat von {0}",
"pagertreeIntegrationUrl": "Integrations URL",
"pagertreeUrgency": "Dringlichkeit",
"pagertreeSilent": "Leise",
"pagertreeLow": "Niedrig",
"pagertreeMedium": "Medium",
"pagertreeHigh": "Hoch",
"pagertreeCritical": "Kritisch",
"pagertreeResolve": "Automatisch Auflösen",
"No API Keys": "Keine API Schlüssel",
"disableAPIKeyMsg": "Bist du sicher, dass du diesen API Schlüssel deaktivieren willst?",
"pagertreeDoNothing": "Nichts tun",
"wayToGetPagerTreeIntegrationURL": "Nachdem du die Uptime Kuma Integration in PagerTree erstellt hast, kopiere den Endpunkt. Siehe details {0}",
"telegramProtectContent": "Schütze gegen Weiterleiten/Speichern der Nachricht",
"telegramProtectContentDescription": "Die Bot-Nachrichten in Telegram sind gegen Weiterleitung und Speichern geschützt.",
"notificationRegional": "Regional",
"Key Added": "Schlüssel hinzugefügt",
"apiKeyAddedMsg": "API Schlüssel wurde hinzugefügt. Bitte notiere den Schlüssel, da er nicht erneut angezeigt wird.",
"telegramMessageThreadID": "(Optional) Nachrichten Thread ID",
"telegramMessageThreadIDDescription": "Optionale eindeutige Kennung für den Ziel-Thread (Thema) des Forums; nur für Forum-Supergroups",
"telegramSendSilently": "Stumm Senden",
"telegramSendSilentlyDescription": "Sende die Nachricht stumm. Nutzer bekommen eine Benachrichtigung ohne Ton.",
"Add New Tag": "Neuen Tag hinzufügen",
"lunaseaDeviceID": "Geräte-ID",
"lunaseaTarget": "Ziel",
"lunaseaUserID": "Benutzer-ID",
"twilioAccountSID": "Account SID",
"twilioFromNumber": "Absender",
"twilioToNumber": "Empfänger",
"twilioAuthToken": "Auth Token",
"statusPageRefreshIn": "Aktualisierung in: {0}",
"sameAsServerTimezone": "Gleiche Zeitzone wie Server",
"startDateTime": "Start Datum/Uhrzeit",
"endDateTime": "Ende Datum/Uhrzeit",
"cronExpression": "Cron-Ausdruck",
"cronSchedule": "Zeitplan: ",
"invalidCronExpression": "Ungültiger Cron-Ausdruck: {0}"
} }

@ -154,6 +154,7 @@
"Token": "Token", "Token": "Token",
"Show URI": "Show URI", "Show URI": "Show URI",
"Tags": "Tags", "Tags": "Tags",
"Add New Tag": "Add New Tag",
"Add New below or Select...": "Add New below or Select…", "Add New below or Select...": "Add New below or Select…",
"Tag with this name already exist.": "Tag with this name already exists.", "Tag with this name already exist.": "Tag with this name already exists.",
"Tag with this value already exist.": "Tag with this value already exists.", "Tag with this value already exist.": "Tag with this value already exists.",
@ -173,6 +174,7 @@
"Avg. Response": "Avg. Response", "Avg. Response": "Avg. Response",
"Entry Page": "Entry Page", "Entry Page": "Entry Page",
"statusPageNothing": "Nothing here, please add a group or a monitor.", "statusPageNothing": "Nothing here, please add a group or a monitor.",
"statusPageRefreshIn": "Refresh in: {0}",
"No Services": "No Services", "No Services": "No Services",
"All Systems Operational": "All Systems Operational", "All Systems Operational": "All Systems Operational",
"Partially Degraded Service": "Partially Degraded Service", "Partially Degraded Service": "Partially Degraded Service",
@ -392,6 +394,12 @@
"backupRecommend": "Please backup the volume or the data folder (./data/) directly instead.", "backupRecommend": "Please backup the volume or the data folder (./data/) directly instead.",
"Optional": "Optional", "Optional": "Optional",
"or": "or", "or": "or",
"sameAsServerTimezone": "Same as Server Timezone",
"startDateTime": "Start Date/Time",
"endDateTime": "End Date/Time",
"cronExpression": "Cron Expression",
"cronSchedule": "Schedule: ",
"invalidCronExpression": "Invalid Cron Expression: {0}",
"recurringInterval": "Interval", "recurringInterval": "Interval",
"Recurring": "Recurring", "Recurring": "Recurring",
"strategyManual": "Active/Inactive Manually", "strategyManual": "Active/Inactive Manually",
@ -427,7 +435,7 @@
"dnsCacheDescription": "It may be not working in some IPv6 environments, disable it if you encounter any issues.", "dnsCacheDescription": "It may be not working in some IPv6 environments, disable it if you encounter any issues.",
"Single Maintenance Window": "Single Maintenance Window", "Single Maintenance Window": "Single Maintenance Window",
"Maintenance Time Window of a Day": "Maintenance Time Window of a Day", "Maintenance Time Window of a Day": "Maintenance Time Window of a Day",
"Effective Date Range": "Effective Date Range", "Effective Date Range": "Effective Date Range (Optional)",
"Schedule Maintenance": "Schedule Maintenance", "Schedule Maintenance": "Schedule Maintenance",
"Date and Time": "Date and Time", "Date and Time": "Date and Time",
"DateTime Range": "DateTime Range", "DateTime Range": "DateTime Range",
@ -442,7 +450,6 @@
"Clone Monitor": "Clone Monitor", "Clone Monitor": "Clone Monitor",
"Clone": "Clone", "Clone": "Clone",
"cloneOf": "Clone of {0}", "cloneOf": "Clone of {0}",
"Description": "Description",
"smtp": "Email (SMTP)", "smtp": "Email (SMTP)",
"secureOptionNone": "None / STARTTLS (25, 587)", "secureOptionNone": "None / STARTTLS (25, 587)",
"secureOptionTLS": "TLS (465)", "secureOptionTLS": "TLS (465)",
@ -676,5 +683,39 @@
"Edit Tag": "Edit Tag", "Edit Tag": "Edit Tag",
"Server Address": "Server Address", "Server Address": "Server Address",
"Learn More": "Learn More", "Learn More": "Learn More",
"Body Encoding": "Body Encoding" "Body Encoding": "Body Encoding",
"API Keys": "API Keys",
"Expiry": "Expiry",
"Expiry date": "Expiry date",
"Don't expire": "Don't expire",
"Continue": "Continue",
"Add Another": "Add Another",
"Key Added": "Key Added",
"apiKeyAddedMsg": "Your API key has been added. Please make a note of it as it will not be shown again.",
"Add API Key": "Add API Key",
"No API Keys": "No API Keys",
"apiKey-active": "Active",
"apiKey-expired": "Expired",
"apiKey-inactive": "Inactive",
"Expires": "Expires",
"disableAPIKeyMsg": "Are you sure you want to disable this API key?",
"deleteAPIKeyMsg": "Are you sure you want to delete this API key?",
"Generate": "Generate",
"pagertreeIntegrationUrl": "Integration URL",
"pagertreeUrgency": "Urgency",
"pagertreeSilent": "Silent",
"pagertreeLow": "Low",
"pagertreeMedium": "Medium",
"pagertreeHigh": "High",
"pagertreeCritical": "Critical",
"pagertreeResolve": "Auto Resolve",
"pagertreeDoNothing": "Do Nothing",
"wayToGetPagerTreeIntegrationURL": "After creating the Uptime Kuma integration in PagerTree, copy the Endpoint. See full details {0}",
"lunaseaTarget": "Target",
"lunaseaDeviceID": "Device ID",
"lunaseaUserID": "User ID",
"twilioAccountSID": "Account SID",
"twilioAuthToken": "Auth Token",
"twilioFromNumber": "From Number",
"twilioToNumber": "To Number"
} }

@ -158,7 +158,7 @@
"Add New below or Select...": "Agregar nuevo a continuación o seleccionar…", "Add New below or Select...": "Agregar nuevo a continuación o seleccionar…",
"Tag with this name already exist.": "Una etiqueta con este nombre ya existe.", "Tag with this name already exist.": "Una etiqueta con este nombre ya existe.",
"Tag with this value already exist.": "Una etiqueta con este valor ya existe.", "Tag with this value already exist.": "Una etiqueta con este valor ya existe.",
"color": "color", "color": "Color",
"value (optional)": "valor (opcional)", "value (optional)": "valor (opcional)",
"Gray": "Gris", "Gray": "Gris",
"Red": "Rojo", "Red": "Rojo",
@ -303,7 +303,7 @@
"Maintenance": "Mantenimiento", "Maintenance": "Mantenimiento",
"General Monitor Type": "Monitor Tipo General", "General Monitor Type": "Monitor Tipo General",
"Specific Monitor Type": "Monitor Tipo Específico", "Specific Monitor Type": "Monitor Tipo Específico",
"Monitor": "Monitores", "Monitor": "Monitor | Monitores",
"Resend Notification if Down X times consecutively": "Reenviar Notificación si Caído X veces consecutivamente", "Resend Notification if Down X times consecutively": "Reenviar Notificación si Caído X veces consecutivamente",
"resendEveryXTimes": "Reenviar cada {0} veces", "resendEveryXTimes": "Reenviar cada {0} veces",
"resendDisabled": "Reenvío deshabilitado", "resendDisabled": "Reenvío deshabilitado",
@ -608,7 +608,7 @@
"TemplateCode": "Código de Plantilla", "TemplateCode": "Código de Plantilla",
"Bark Group": "Grupo de Bark", "Bark Group": "Grupo de Bark",
"Bark Sound": "Sonido de Bark", "Bark Sound": "Sonido de Bark",
"SecretKey": "Key Secreta", "SecretKey": "Clave Secreta",
"Huawei": "Huawei", "Huawei": "Huawei",
"Retry": "Reintentar", "Retry": "Reintentar",
"Proxy Server": "Servidor Proxy", "Proxy Server": "Servidor Proxy",
@ -621,12 +621,12 @@
"aboutKumaURL": "Si dejas vacío el campo URL Uptime Kuma, predeterminará la página GitHub del Proyecto.", "aboutKumaURL": "Si dejas vacío el campo URL Uptime Kuma, predeterminará la página GitHub del Proyecto.",
"smtpDkimSettings": "Ajustes DKIM", "smtpDkimSettings": "Ajustes DKIM",
"smtpDkimDomain": "Nombre de Dominio", "smtpDkimDomain": "Nombre de Dominio",
"smtpDkimKeySelector": "Selector de Key", "smtpDkimKeySelector": "Selector de Clave",
"smtpDkimPrivateKey": "Key Privada", "smtpDkimPrivateKey": "Clave Privada",
"Integration Key": "Key de Integración", "Integration Key": "Key de Integración",
"Integration URL": "URL de Integración", "Integration URL": "URL de Integración",
"Device Token": "Token de Dispositivo", "Device Token": "Token de Dispositivo",
"WeCom Bot Key": "Key de Bot WeCom", "WeCom Bot Key": "Clave de Bot WeCom",
"promosmsTypeEco": "SMS ECO - barato pero lento y a veces sobrecargado. Limitado sólo a destinatarios Polacos.", "promosmsTypeEco": "SMS ECO - barato pero lento y a veces sobrecargado. Limitado sólo a destinatarios Polacos.",
"promosmsTypeSpeed": "SMS SPEED - La mayor prioridad en el sistema. Muy rápido y confiable pero costoso (alrededor del doble del precio de SMS FULL).", "promosmsTypeSpeed": "SMS SPEED - La mayor prioridad en el sistema. Muy rápido y confiable pero costoso (alrededor del doble del precio de SMS FULL).",
"matrixHomeserverURL": "URL Servidor Casero (con http(s):// y opcionalmente el puerto)", "matrixHomeserverURL": "URL Servidor Casero (con http(s):// y opcionalmente el puerto)",
@ -679,14 +679,74 @@
"serwersms": "SerwerSMS.pl", "serwersms": "SerwerSMS.pl",
"serwersmsAPIUser": "Nombre de usuario de API (inc. webapi_ prefix)", "serwersmsAPIUser": "Nombre de usuario de API (inc. webapi_ prefix)",
"smseagleGroup": "Nombre(s) de grupo de Guía Telefónica", "smseagleGroup": "Nombre(s) de grupo de Guía Telefónica",
"Unpin": "Quitar de destacados", "Unpin": "Dejar de Fijar",
"Prefix Custom Message": "Prefijo personalizado", "Prefix Custom Message": "Prefijo personalizado",
"markdownSupported": "Soporta sintaxis Markdown", "markdownSupported": "Sintaxis de Markdown soportada",
"Server Address": "Dirección del Servidor", "Server Address": "Dirección del Servidor",
"Learn More": "Aprende Más", "Learn More": "Aprende Más",
"Pick a RR-Type...": "Seleccione un Tipo RR", "Pick a RR-Type...": "Seleccione un Tipo RR",
"onebotHttpAddress": "Dirección HTTP OneBot", "onebotHttpAddress": "Dirección HTTP OneBot",
"SendKey": "SendKey", "SendKey": "Clave de Envío",
"octopushAPIKey": "\"Clave API\" de las credenciales HTTP API en el panel de control", "octopushAPIKey": "\"Clave API\" desde credenciales API HTTP en panel de control",
"octopushLogin": "\"Inicio de Sesión\" a partir de las credenciales API HTTP en el panel de control" "octopushLogin": "\"Inicio de Sesión\" a partir de las credenciales API HTTP en el panel de control",
"ntfy Topic": "Tema ntfy",
"Google Analytics ID": "ID Analíticas de Google",
"Edit Tag": "Editar Etiqueta",
"SignName": "Firma",
"Bark Endpoint": "Endpoint Bark",
"WebHookUrl": "WebHookUrl",
"High": "Alto",
"alertaApiEndpoint": "Endpoint API",
"Body Encoding": "Codificación del cuerpo",
"Expiry date": "Fecha de expiración",
"Expiry": "Expiración",
"API Keys": "Claves API",
"Key Added": "Clave añadida",
"Add Another": "Añadir otro",
"Continue": "Continuar",
"Don't expire": "No caduca",
"apiKey-inactive": "Inactivo",
"apiKey-expired": "Expirado",
"apiKey-active": "Activo",
"No API Keys": "No hay claves API",
"Add API Key": "Añadir clave API",
"apiKeyAddedMsg": "Su clave API ha sido añadida. Anótala, ya que no se volverá a mostrar.",
"Clone": "Clonar",
"cloneOf": "Clon de {0}",
"pagertreeDoNothing": "No hacer nada",
"pagertreeResolve": "Resolución automática",
"pagertreeCritical": "Crítico",
"pagertreeHigh": "Alto",
"pagertreeMedium": "Medio",
"pagertreeLow": "Bajo",
"pagertreeSilent": "Silencio",
"pagertreeUrgency": "Urgencia",
"pagertreeIntegrationUrl": "URL de integración",
"lunaseaTarget": "Objetivo",
"wayToGetPagerTreeIntegrationURL": "Después de crear la integración Uptime Kuma en PagerTree, copie el Endpoint. Ver todos los detalles {0}",
"Generate": "Generar",
"deleteAPIKeyMsg": "¿Está seguro de que desea eliminar esta clave API?",
"telegramMessageThreadID": "(Opcional) ID del hilo de mensajes",
"telegramMessageThreadIDDescription": "Opcional Identificador único para el hilo de mensajes de destino (asunto) del foro; solo para supergrupos de foros",
"telegramProtectContent": "Proteger Forwarding/Saving",
"telegramProtectContentDescription": "Si se activa, los mensajes del bot en Telegram estarán protegidos contra el reenvío y el guardado.",
"notificationRegional": "Regional",
"Clone Monitor": "Clonar Monitor",
"telegramSendSilently": "Enviar en silencio",
"telegramSendSilentlyDescription": "Envía el mensaje en silencio. Los usuarios recibirán una notificación sin sonido.",
"Add New Tag": "Añadir nueva etiqueta",
"lunaseaUserID": "ID Usuario",
"lunaseaDeviceID": "ID Dispositivo",
"disableAPIKeyMsg": "¿Está seguro de que desea desactivar esta clave API?",
"Expires": "Expira",
"twilioAccountSID": "SID de Cuenta",
"twilioFromNumber": "Desde el numero",
"twilioToNumber": "Hasta el numero",
"startDateTime": "Fecha/Hora Inicio",
"sameAsServerTimezone": "Igual a Zona horaria del Servidor",
"endDateTime": "Fecha/Hora Fin",
"cronExpression": "Expresión Cron",
"cronSchedule": "Cronograma: ",
"invalidCronExpression": "Expresión Cron invalida:{0}",
"statusPageRefreshIn": "Reinicio en: {0}"
} }

@ -1,10 +1,10 @@
{ {
"languageName": "eesti", "languageName": "eesti",
"retryCheckEverySecond": "Kontrolli {0} sekundilise vahega.", "retryCheckEverySecond": "Kontrolli {0} sekundilise vahega",
"retriesDescription": "Mitu korda tuleb kontrollida, mille järel märkida 'maas' ja saata välja teavitus.", "retriesDescription": "Mitu korda tuleb kontrollida, mille järel märkida 'maas' ja saata välja teavitus",
"ignoreTLSError": "Eira TLS/SSL viga HTTPS veebisaitidel.", "ignoreTLSError": "Eira TLS/SSL viga HTTPS veebisaitidel",
"upsideDownModeDescription": "Käitle teenuse saadavust rikkena, teenuse kättesaamatust töötavaks.", "upsideDownModeDescription": "Käitle teenuse saadavust rikkena, teenuse kättesaamatust töötavaks.",
"maxRedirectDescription": "Suurim arv ümbersuunamisi, millele järgida. 0 ei luba ühtegi ", "maxRedirectDescription": "Suurim arv ümbersuunamisi, millele järgida. 0 ei luba ühtegi.",
"acceptedStatusCodesDescription": "Vali välja HTTP koodid, mida arvestada kõlblikuks.", "acceptedStatusCodesDescription": "Vali välja HTTP koodid, mida arvestada kõlblikuks.",
"passwordNotMatchMsg": "Salasõnad ei kattu.", "passwordNotMatchMsg": "Salasõnad ei kattu.",
"notificationDescription": "Teavitusteenuse kasutamiseks seo see seirega.", "notificationDescription": "Teavitusteenuse kasutamiseks seo see seirega.",
@ -19,7 +19,7 @@
"Status Page": "Ülevaade", "Status Page": "Ülevaade",
"Status Pages": "Ülevaated", "Status Pages": "Ülevaated",
"Dashboard": "Töölaud", "Dashboard": "Töölaud",
"New Update": "Uuem tarkvara versioon on saadaval.", "New Update": "Uuem tarkvara versioon on saadaval",
"Language": "Keel", "Language": "Keel",
"Appearance": "Välimus", "Appearance": "Välimus",
"Theme": "Teema", "Theme": "Teema",
@ -40,7 +40,7 @@
"Status": "Olek", "Status": "Olek",
"DateTime": "Kuupäev", "DateTime": "Kuupäev",
"Message": "Tulemus", "Message": "Tulemus",
"No important events": "Märkimisväärsed juhtumid puuduvad.", "No important events": "Märkimisväärsed juhtumid puuduvad",
"Resume": "Taasta", "Resume": "Taasta",
"Edit": "Muuda", "Edit": "Muuda",
"Delete": "Eemalda", "Delete": "Eemalda",
@ -81,26 +81,26 @@
"Allow indexing": "Luba indekseerimine", "Allow indexing": "Luba indekseerimine",
"Discourage search engines from indexing site": "Keela selle saidi indekseerimine otsimootorite poolt", "Discourage search engines from indexing site": "Keela selle saidi indekseerimine otsimootorite poolt",
"Change Password": "Muuda parooli", "Change Password": "Muuda parooli",
"Current Password": "praegune parool", "Current Password": "Praegune parool",
"New Password": "uus parool", "New Password": "Uus parool",
"Repeat New Password": "korda salasõna", "Repeat New Password": "Korda uut parooli",
"Update Password": "Uuenda salasõna", "Update Password": "Uuenda parooli",
"Disable Auth": "Lülita autentimine välja", "Disable Auth": "Lülita autentimine välja",
"Enable Auth": "Lülita autentimine sisse", "Enable Auth": "Lülita autentimine sisse",
"disableauth.message1": "Kas soovid <strong>lülitada autentimise välja</strong>?", "disableauth.message1": "Kas soovid <strong>lülitada autentimise välja</strong>?",
"disableauth.message2": "Kastuamiseks <strong>välise autentimispakkujaga</strong>, näiteks Cloudflare Access.", "disableauth.message2": "Kastuamiseks <strong>välise autentimispakkujaga</strong>, näiteks Cloudflare Access.",
"Please use this option carefully!": "Palun kasuta vastutustundlikult.", "Please use this option carefully!": "Palun kasuta seda valikut vastutustundlikult!",
"Logout": "Logi välja", "Logout": "Logi välja",
"Leave": "Lahku", "Leave": "Lahku",
"I understand, please disable": "Olen tutvunud riskidega, lülita välja", "I understand, please disable": "Olen tutvunud riskidega, lülita välja",
"Confirm": "Kinnita", "Confirm": "Kinnita",
"Yes": "Jah", "Yes": "Jah",
"No": "Ei", "No": "Ei",
"Username": "kasutajanimi", "Username": "Kasutajanimi",
"Password": "parool", "Password": "Parool",
"Remember me": "Mäleta mind", "Remember me": "Mäleta mind",
"Login": "Logi sisse", "Login": "Logi sisse",
"No Monitors, please": "Seired puuduvad.", "No Monitors, please": "Seired puuduvad, palun",
"add one": "Lisa esimene", "add one": "Lisa esimene",
"Notification Type": "Teavituse tüüp", "Notification Type": "Teavituse tüüp",
"Email": "e-posti aadress", "Email": "e-posti aadress",
@ -141,9 +141,9 @@
"Disable 2FA": "Lülita 2FA välja", "Disable 2FA": "Lülita 2FA välja",
"2FA Settings": "2FA seaded", "2FA Settings": "2FA seaded",
"Two Factor Authentication": "Kaksikautentimine", "Two Factor Authentication": "Kaksikautentimine",
"Active": "kasutusel", "Active": "Aktiivne",
"Inactive": "seadistamata", "Inactive": "Mitteaktiivne",
"Token": "kaksikautentimise kood", "Token": "Kaksikautentimise kood",
"Show URI": "Näita URId", "Show URI": "Näita URId",
"Clear all statistics": "Tühjenda ajalugu", "Clear all statistics": "Tühjenda ajalugu",
"importHandleDescription": "'kombineeri' täiendab varukoopiast ja kirjutab üle samanimelised seireid ja teavitusteenused; 'lisa praegustele' jätab olemasolevad puutumata; 'asenda' kustutab ja asendab kõik seired ja teavitusteenused.", "importHandleDescription": "'kombineeri' täiendab varukoopiast ja kirjutab üle samanimelised seireid ja teavitusteenused; 'lisa praegustele' jätab olemasolevad puutumata; 'asenda' kustutab ja asendab kõik seired ja teavitusteenused.",
@ -152,9 +152,9 @@
"Import Backup": "Varukoopia importimine", "Import Backup": "Varukoopia importimine",
"Export Backup": "Varukoopia eksportimine", "Export Backup": "Varukoopia eksportimine",
"Skip existing": "lisa praegustele", "Skip existing": "lisa praegustele",
"Overwrite": "asenda", "Overwrite": "Asenda",
"Options": "Mestimisviis", "Options": "Mestimisviis",
"Keep both": "kombineeri", "Keep both": "Kombineeri",
"Tags": "Sildid", "Tags": "Sildid",
"Add New below or Select...": "Leia või lisa all uus…", "Add New below or Select...": "Leia või lisa all uus…",
"Tag with this name already exist.": "Selle nimega silt on juba olemas.", "Tag with this name already exist.": "Selle nimega silt on juba olemas.",
@ -174,14 +174,14 @@
"Avg. Response": "Keskmine reaktsiooniaeg", "Avg. Response": "Keskmine reaktsiooniaeg",
"Entry Page": "Avaleht", "Entry Page": "Avaleht",
"statusPageNothing": "Kippu ega kõppu; siia saab lisada seireid või -gruppe.", "statusPageNothing": "Kippu ega kõppu; siia saab lisada seireid või -gruppe.",
"No Services": "Teenused puuduvad.", "No Services": "Teenused puuduvad",
"All Systems Operational": "Kõik töökorras", "All Systems Operational": "Kõik töökorras",
"Partially Degraded Service": "Teenuse töö osaliselt häiritud", "Partially Degraded Service": "Teenuse töö osaliselt häiritud",
"Degraded Service": "Teenuse töö häiritud", "Degraded Service": "Teenuse töö häiritud",
"Add Group": "Lisa grupp", "Add Group": "Lisa grupp",
"Edit Status Page": "Muuda lehte", "Edit Status Page": "Muuda lehte",
"Go to Dashboard": "Töölauale", "Go to Dashboard": "Töölauale",
"checkEverySecond": "Kontrolli peale tõrget {0} sekundilise vahega.", "checkEverySecond": "Kontrolli peale tõrget {0} sekundilise vahega",
"telegram": "Telegram", "telegram": "Telegram",
"webhook": "Webhook", "webhook": "Webhook",
"smtp": "elektronpost (SMTP)", "smtp": "elektronpost (SMTP)",
@ -205,5 +205,114 @@
"alertaEnvironment": "Keskkond", "alertaEnvironment": "Keskkond",
"alertaApiKey": "API võti", "alertaApiKey": "API võti",
"alertaAlertState": "Häireseisund", "alertaAlertState": "Häireseisund",
"alertaRecoverState": "Taasta algolek" "alertaRecoverState": "Taasta algolek",
"Game": "Mäng",
"Primary Base URL": "Peamine baas URL",
"Passive Monitor Type": "Passiivne monitori tüüp",
"Specific Monitor Type": "Spetsiifiline monitori tüüp",
"resendDisabled": "Uuesti saatmine keelatud",
"Push URL": "Lükka URL",
"needPushEvery": "Sa peaksid kutsuma seda URL-i iga {0} sekundi tagant.",
"pushOptionalParams": "Valikulised parameetrid: {0}",
"Schedule maintenance": "Planeeri hooldus",
"All Status Pages": "Kõik staatuse lehed",
"Select status pages...": "Vali staatuse lehed…",
"Custom": "Kohandatud",
"here": "siin",
"Required": "Nõutud",
"Post URL": "Postita URL",
"Affected Monitors": "Mõjutatud monitorid",
"Pick Affected Monitors...": "Vali mõjutatud monitorid…",
"Start of maintenance": "Hoolduse algus",
"Content Type": "Sisu tüüp",
"webhookJsonDesc": "{0} on hea iga modernse HTTP serveri jaoks nagu Express.js",
"webhookAdditionalHeadersTitle": "Täiendavad päised",
"setAsDefault": "Lisa vaikimisi",
"deleteProxyMsg": "Kas Sa oled kindel, et soovid kustutada seda puhverserverit kõkidel monitoridel?",
"proxyDescription": "Puhverserverid tuleb lisada monitorile selle töötamiseks.",
"setAsDefaultProxyDescription": "See puhverserver aktiveeritakse vaikimisi uutel monitoridel. Sa saad keelata seda puhverserverit igal monitoril eraldi.",
"Certificate Chain": "Sertifikaadi kett",
"Valid": "Kehtiv",
"Invalid": "Kehtetu",
"User": "Kasutaja",
"Installed": "Paigaldatud",
"Not installed": "Ei ole installeeritud",
"Running": "Töötab",
"resendEveryXTimes": "Saada uuesti {0} korda",
"statusMaintenance": "Hooldus",
"Webhook URL": "",
"Server URL": "Serveri URL",
"Priority": "Tähtsus",
"emojiCheatSheet": "Emotikoni spikker: {0}",
"appriseInstalled": "Apprise on installitud.",
"appriseNotInstalled": "Apprise ei ole installitud. {0}",
"Method": "Meetod",
"Body": "Keha",
"Headers": "Päis",
"PushUrl": "Lükka URL",
"Monitor History": "Monitori ajalugu",
"PasswordsDoNotMatch": "Paroolid ei ühti.",
"records": "",
"Current User": "Praegune kasutaja",
"topic": "Teema",
"successMessage": "Edukas sõnum",
"recent": "Hiljutine",
"Info": "Info",
"Security": "Turvalisus",
"Steam API Key": "Steam API võti",
"Pick a RR-Type...": "Vali RR-tüüp…",
"Default": "Vaikimisi",
"HTTP Options": "HTTP valikud",
"Create Incident": "Loo intsident",
"Title": "Pealkiri",
"Content": "Sisu",
"Style": "Stiil",
"info": "info",
"warning": "hoiatus",
"danger": "oht",
"error": "viga",
"critical": "kriitiline",
"primary": "peamine",
"dark": "tume",
"light": "hele",
"Post": "Postita",
"Please input title and content": "Palun lisa pealkiri ja sisu",
"Created": "Loodud",
"Last Updated": "Viimati uuendatud",
"Unpin": "Vabastada",
"Switch to Dark Theme": "Vaheta tumedale teemale",
"Hide Tags": "Peida tagid",
"Show Tags": "Näita tagid",
"Description": "Kirjeldus",
"No monitors available.": "Ühtegi monitori ei ole saadaval.",
"Add one": "Lisa üks",
"No Monitors": "Ei ole monitore",
"Untitled Group": "Nimetamata grupp",
"Services": "Teenused",
"Cancel": "Tühista",
"Customize": "Kohanda",
"Custom Footer": "Kohandatud jalus",
"Custom CSS": "Kohandatud CSS",
"Proxies": "Puhverserverid",
"default": "Vaikimisi",
"enabled": "Lubatud",
"Not running": "Ei tööta",
"Start": "Alusta",
"Stop": "Peata",
"Add New Status Page": "Lisa uus staatuse leht",
"Shrink Database": "Vähenda andmebaasi",
"Help": "Abi",
"Maintenance": "Hooldus",
"General Monitor Type": "Üldine monitori tüüp",
"webhookAdditionalHeadersDesc": "Lisab täiendavad päised saadetud webhookiga.",
"Read more": "Loe rohkem",
"HeadersInvalidFormat": "",
"clearDataOlderThan": "Hoia monitori ajalugu alles {0} päeva.",
"steamApiKeyDescription": "Steam Game Serveri monitoorimiseks on vaja sul Steam Web-API võtit. Sa saad registreerida enda API võtme siin: ",
"Done": "Tehtud",
"Pick Accepted Status Codes...": "Vali vastu võetud staatuse koodid…",
"Switch to Light Theme": "Vaheta heledale teemale",
"Discard": "Loobu",
"deleteStatusPageMsg": "Kas Sa oled kindel, et soovid kustutada seda staatuse lehte?",
"Resend Notification if Down X times consecutively": "Saada teavitus uuesti kui monitor on rikkis X korda järjest"
} }

@ -1,34 +1,34 @@
{ {
"languageName": "Farsi", "languageName": "فارسی",
"checkEverySecond": "بررسی هر {0} ثانیه.", "checkEverySecond": "بررسی هر {0} ثانیه",
"retryCheckEverySecond": "تکرار مجدد هر {0} ثانیه.", "retryCheckEverySecond": "تکرار مجدد هر {0} ثانیه",
"retriesDescription": "حداکثر تعداد تکرار پیش از علامت گذاری وب‌سایت بعنوان خارج از دسترس و ارسال اطلاع‌رسانی.", "retriesDescription": "حداکثر تعداد تکرار پیش از علامت گذاری وب‌سایت بعنوان خارج از دسترس و ارسال اطلاع‌رسانی",
"ignoreTLSError": "بی‌خیال ارور TLS/SSL برای سایت‌های HTTPS", "ignoreTLSError": "بی‌خیال ارور TLS/SSL برای سایت‌های HTTPS",
"upsideDownModeDescription": "نتیجه وضعیت را برعکس کن، مثلا اگر سرویس در دسترس بود فرض کن که سرویس پایین است!", "upsideDownModeDescription": "نتیجه وضعیت را برعکس کن، مثلا اگر سرویس در دسترس بود فرض کن که سرویس پایین است.",
"maxRedirectDescription": "حداکثر تعداد ریدایرکتی که سرویس پشتیبانی کند. برای اینکه ری‌دایرکت‌ها پشتیبانی نشوند، عدد 0 را وارد کنید.", "maxRedirectDescription": "حداکثر تعداد ریدایرکتی که سرویس پشتیبانی کند. برای اینکه ری‌دایرکت‌ها پشتیبانی نشوند، عدد 0 را وارد کنید.",
"acceptedStatusCodesDescription": "لطفا HTTP Status Code هایی که میخواهید به عنوان پاسخ موفقیت آمیز در نظر گرفته شود را انتخاب کنید.", "acceptedStatusCodesDescription": "لطفا HTTP Status Code هایی که میخواهید به عنوان پاسخ موفقیت آمیز در نظر گرفته شود را انتخاب کنید.",
"passwordNotMatchMsg": "تکرار رمز عبور مطابقت ندارد!", "passwordNotMatchMsg": "تکرار رمز عبور مطابقت ندارد.",
"notificationDescription": "برای اینکه سرویس اطلاع‌رسانی کار کند، آنرا به یکی از مانیتور‌ها متصل کنید.", "notificationDescription": "برای اینکه سرویس اطلاع‌رسانی کار کند، آنرا به یکی از مانیتور‌ها متصل کنید.",
"keywordDescription": "در نتیجه درخواست (اهمیتی ندارد پاسخ JSON است یا HTML) بدنبال این کلمه بگرد (حساس به کوچک/بزرگ بودن حروف).", "keywordDescription": "در نتیجه درخواست (اهمیتی ندارد پاسخ JSON است یا HTML) بدنبال این کلمه بگرد (حساس به کوچک/بزرگ بودن حروف).",
"pauseDashboardHome": "متوقف شده", "pauseDashboardHome": "متوقف شده",
"deleteMonitorMsg": "آیا از حذف این مانیتور مطمئن هستید؟", "deleteMonitorMsg": "آیا از حذف این مانیتور مطمئن هستید؟",
"deleteNotificationMsg": "آیا مطمئن هستید که میخواهید این سرویس اطلاع‌رسانی را برای تمامی مانیتورها حذف کنید؟", "deleteNotificationMsg": "آیا مطمئن هستید که میخواهید این سرویس اطلاع‌رسانی را برای تمامی مانیتورها حذف کنید؟",
"resolverserverDescription": "سرویس CloudFlare به عنوان سرور پیش‌فرض استفاده می‌شود، شما میتوانید آنرا به هر سرور دیگری بعدا تغییر دهید.", "resolverserverDescription": "سرویس CloudFlare به عنوان سرور پیش‌فرض استفاده می‌شود، شما میتوانید آنرا به هر سرور دیگری بعدا تغییر دهید.",
"rrtypeDescription": "لطفا نوع Resource Record را انتخاب کنید.", "rrtypeDescription": "لطفا نوع Resource Record را انتخاب کنید",
"pauseMonitorMsg": "آیا مطمئن هستید که میخواهید این مانیتور را متوقف کنید ؟", "pauseMonitorMsg": "آیا مطمئن هستید که میخواهید این مانیتور را متوقف کنید ؟",
"enableDefaultNotificationDescription": "برای هر مانیتور جدید، این سرویس اطلاع‌رسانی به صورت پیش‌فرض فعال خواهد شد. البته که شما میتوانید به صورت دستی آنرا برای هر مانیتور به صورت جداگانه غیر فعال کنید.", "enableDefaultNotificationDescription": "برای هر مانیتور جدید، این سرویس اطلاع‌رسانی به صورت پیش‌فرض فعال خواهد شد. البته که شما میتوانید به صورت دستی آنرا برای هر مانیتور به صورت جداگانه غیر فعال کنید.",
"clearEventsMsg": "آیا از اینکه تمامی تاریخچه رویداد‌های این مانیتور حذف شود مطمئن هستید؟", "clearEventsMsg": "آیا از اینکه تمامی تاریخچه رویداد‌های این مانیتور حذف شود مطمئن هستید؟",
"clearHeartbeatsMsg": "آیا از اینکه تاریخچه تمامی Heartbeat های این مانیتور حذف شود مطمئن هستید؟ ", "clearHeartbeatsMsg": "آیا از اینکه تاریخچه تمامی ضربان قلب های این مانیتور حذف شود مطمئن هستید؟",
"confirmClearStatisticsMsg": "آیا از حذف تمامی آمار و ارقام مطمئن هستید؟", "confirmClearStatisticsMsg": "آیا از حذف تمامی آمار و ارقام مطمئن هستید؟",
"importHandleDescription": "اگر که میخواهید بیخیال مانیتورها و یا سرویس‌های اطلاع‌رسانی که با نام مشابه از قبل موجود هستند شوید، گزینه 'بی‌خیال موارد ..' را انتخاب کنید. توجه کنید که گزینه 'بازنویسی' تمامی موارد موجود با نام مشابه را از بین خواهد برد.", "importHandleDescription": "اگر که میخواهید بیخیال مانیتورها و یا سرویس‌های اطلاع‌رسانی که با نام مشابه از قبل موجود هستند شوید، گزینه 'بی‌خیال موارد ..' را انتخاب کنید. توجه کنید که گزینه 'بازنویسی' تمامی موارد موجود با نام مشابه را از بین خواهد برد.",
"confirmImportMsg": "آیا از بازگردانی بک آپ مطمئن هستید؟ لطفا از اینکه نوع بازگردانی درستی را انتخاب کرده‌اید اطمینان حاصل کنید!", "confirmImportMsg": "آیا از بازگردانی بک آپ مطمئن هستید؟ لطفا از اینکه نوع بازگردانی درستی را انتخاب کرده‌اید اطمینان حاصل کنید.",
"twoFAVerifyLabel": "لطفا جهت اطمینان از عملکرد احراز هویت دو مرحله‌ای توکن خود را وارد کنید!", "twoFAVerifyLabel": "لطفا جهت اطمینان از عملکرد احراز هویت دو مرحله‌ای توکن خود را وارد کنید:",
"tokenValidSettingsMsg": "توکن شما معتبر است، هم اکنون میتوانید احراز هویت دو مرحله‌ای را فعال کنید!", "tokenValidSettingsMsg": "توکن شما معتبر است، هم اکنون میتوانید احراز هویت دو مرحله‌ای را فعال کنید.",
"confirmEnableTwoFAMsg": "آیا از فعال سازی احراز هویت دو مرحله‌ای مطمئن هستید؟", "confirmEnableTwoFAMsg": "آیا از فعال سازی احراز هویت دو مرحله‌ای مطمئن هستید؟",
"confirmDisableTwoFAMsg": "آیا از غیرفعال سازی احراز هویت دومرحله‌ای مطمئن هستید؟", "confirmDisableTwoFAMsg": "آیا از غیرفعال سازی احراز هویت دومرحله‌ای مطمئن هستید؟",
"Settings": "تنظیمات", "Settings": "تنظیمات",
"Dashboard": "پیشخوان", "Dashboard": "پیشخوان",
"New Update": "بروزرسانی جدید!", "New Update": "بروزرسانی جدید",
"Language": "زبان", "Language": "زبان",
"Appearance": "ظاهر", "Appearance": "ظاهر",
"Theme": "پوسته", "Theme": "پوسته",
@ -48,13 +48,13 @@
"Status": "وضعیت", "Status": "وضعیت",
"DateTime": "تاریخ و زمان", "DateTime": "تاریخ و زمان",
"Message": "پیام", "Message": "پیام",
"No important events": "رخداد جدیدی موجود نیست.", "No important events": "رخداد جدیدی موجود نیست",
"Resume": "ادامه", "Resume": "ادامه",
"Edit": "ویرایش", "Edit": "ویرایش",
"Delete": "حذف", "Delete": "حذف",
"Current": "فعلی", "Current": "فعلی",
"Uptime": "آپتایم", "Uptime": "آپتایم",
"Cert Exp.": "تاریخ انقضای SSL", "Cert Exp.": "تاریخ انقضای SSL.",
"day": "روز", "day": "روز",
"-day": "-روز", "-day": "-روز",
"hour": "ساعت", "hour": "ساعت",
@ -76,7 +76,7 @@
"Accepted Status Codes": "وضعیت‌های (Status Code) های قابل قبول", "Accepted Status Codes": "وضعیت‌های (Status Code) های قابل قبول",
"Save": "ذخیره", "Save": "ذخیره",
"Notifications": "اطلاع‌رسانی‌ها", "Notifications": "اطلاع‌رسانی‌ها",
"Not available, please setup.": "هیچ موردی موجود نیست، اولین مورد را راه اندازی کنید!", "Not available, please setup.": "هیچ موردی موجود نیست، اولین مورد را راه اندازی کنید.",
"Setup Notification": "راه اندازی اطلاع‌رسانی‌", "Setup Notification": "راه اندازی اطلاع‌رسانی‌",
"Light": "روشن", "Light": "روشن",
"Dark": "تاریک", "Dark": "تاریک",
@ -87,8 +87,8 @@
"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": "رمزعبور جدید",
@ -98,10 +98,10 @@
"Enable Auth": "فعال سازی تایید هویت", "Enable Auth": "فعال سازی تایید هویت",
"disableauth.message1": "آیا مطمئن هستید که میخواهید <strong>احراز هویت را غیر فعال کنید</strong>?", "disableauth.message1": "آیا مطمئن هستید که میخواهید <strong>احراز هویت را غیر فعال کنید</strong>?",
"disableauth.message2": "این ویژگی برای کسانی است که <strong> لایه امنیتی شخص ثالث دیگر بر روی این آدرس فعال کرده‌اند</strong>، مانند Cloudflare Access.", "disableauth.message2": "این ویژگی برای کسانی است که <strong> لایه امنیتی شخص ثالث دیگر بر روی این آدرس فعال کرده‌اند</strong>، مانند Cloudflare Access.",
"Please use this option carefully!": "لطفا از این امکان با دقت استفاده کنید.", "Please use this option carefully!": "لطفا از این امکان با دقت استفاده کنید!",
"Logout": "خروج", "Logout": "خروج",
"Leave": "منصرف شدم", "Leave": "منصرف شدم",
"I understand, please disable": "متوجه هستم، لطفا غیرفعال کنید!", "I understand, please disable": "متوجه هستم، غیرفعال کن",
"Confirm": "تایید", "Confirm": "تایید",
"Yes": "بلی", "Yes": "بلی",
"No": "خیر", "No": "خیر",
@ -126,12 +126,12 @@
"Import": "ورود اطلاعات", "Import": "ورود اطلاعات",
"respTime": "زمان پاسخگویی (میلی‌ثانیه)", "respTime": "زمان پاسخگویی (میلی‌ثانیه)",
"notAvailableShort": "ناموجود", "notAvailableShort": "ناموجود",
"Default enabled": "به صورت پیش‌فرض فعال باشد.", "Default enabled": "به صورت پیش‌فرض فعال باشد",
"Apply on all existing monitors": "بر روی تمامی مانیتور‌های فعلی اعمال شود.", "Apply on all existing monitors": "بر روی تمامی مانیتور‌های فعلی اعمال شود",
"Create": "ایجاد", "Create": "ایجاد",
"Clear Data": "پاکسازی داده‌ها", "Clear Data": "پاکسازی داده‌ها",
"Events": "رخداد‌ها", "Events": "رخداد‌ها",
"Heartbeats": "Heartbeats", "Heartbeats": "ضربان قلب",
"Auto Get": "Auto Get", "Auto Get": "Auto Get",
"backupDescription": "شما میتوانید تمامی مانیتورها و تنظیمات اطلاع‌رسانی‌ها را در قالب یه فایل JSON دریافت کنید.", "backupDescription": "شما میتوانید تمامی مانیتورها و تنظیمات اطلاع‌رسانی‌ها را در قالب یه فایل JSON دریافت کنید.",
"backupDescription2": "البته تاریخچه رخدادها دراین فایل قرار نخواهند داشت.", "backupDescription2": "البته تاریخچه رخدادها دراین فایل قرار نخواهند داشت.",
@ -155,7 +155,7 @@
"Show URI": "نمایش آدرس (URI)", "Show URI": "نمایش آدرس (URI)",
"Tags": "برچسب‌ها", "Tags": "برچسب‌ها",
"Add New below or Select...": "یک مورد جدید اضافه کنید و یا از لیست انتخاب کنید…", "Add New below or Select...": "یک مورد جدید اضافه کنید و یا از لیست انتخاب کنید…",
"Tag with this name already exist.": "یک برچسب با این «نام» از قبل وجود دارد", "Tag with this name already exist.": "یک برچسب با این «نام» از قبل وجود دارد.",
"Tag with this value already exist.": "یک برچسب با این «مقدار» از قبل وجود دارد.", "Tag with this value already exist.": "یک برچسب با این «مقدار» از قبل وجود دارد.",
"color": "رنگ", "color": "رنگ",
"value (optional)": "مقدار (اختیاری)", "value (optional)": "مقدار (اختیاری)",
@ -167,13 +167,13 @@
"Indigo": "نیلی", "Indigo": "نیلی",
"Purple": "بنفش", "Purple": "بنفش",
"Pink": "صورتی", "Pink": "صورتی",
"Search...": "جستجو...", "Search...": "جستجو",
"Avg. Ping": "متوسط پینگ", "Avg. Ping": "متوسط پینگ",
"Avg. Response": "متوسط زمان پاسخ", "Avg. Response": "متوسط زمان پاسخ",
"Entry Page": "صفحه ورودی", "Entry Page": "صفحه ورودی",
"statusPageNothing": "چیزی اینجا نیست، لطفا یک گروه و یا یک مانیتور اضافه کنید!", "statusPageNothing": "چیزی اینجا نیست، لطفا یک گروه و یا یک مانیتور اضافه کنید.",
"No Services": "هیچ سرویسی موجود نیست", "No Services": "هیچ سرویسی موجود نیست",
"All Systems Operational": "تمامی سیستم‌ها عملیاتی هستند!", "All Systems Operational": "تمامی سیستم‌ها عملیاتی هستند",
"Partially Degraded Service": "افت نسبی کیفیت سرویس", "Partially Degraded Service": "افت نسبی کیفیت سرویس",
"Degraded Service": "افت کامل کیفیت سرویس", "Degraded Service": "افت کامل کیفیت سرویس",
"Add Group": "اضافه کردن گروه", "Add Group": "اضافه کردن گروه",
@ -187,7 +187,7 @@
"One record": "یک مورد", "One record": "یک مورد",
"Info": "اطلاعات", "Info": "اطلاعات",
"Powered by": "نیرو گرفته از", "Powered by": "نیرو گرفته از",
"apprise": "Apprise (Support 50+ Notification services)", "apprise": "Apprise (پشتیبانی از 50+ خدمات اعلان)",
"Monitor": "مانیتور | مانتیور ها", "Monitor": "مانیتور | مانتیور ها",
"Help": "کمک", "Help": "کمک",
"Game": "بازی", "Game": "بازی",
@ -197,5 +197,526 @@
"statusMaintenance": "در دست تعمیر", "statusMaintenance": "در دست تعمیر",
"Maintenance": "در حال تعمیر", "Maintenance": "در حال تعمیر",
"General Monitor Type": "حالت مانیتور عمومی", "General Monitor Type": "حالت مانیتور عمومی",
"markdownSupported": "شیوه نگارشی Markdown پشتیبانی می شود" "markdownSupported": "شیوه نگارشی Markdown پشتیبانی می شود",
"Body Encoding": "انکودینگ محتوا",
"twilioFromNumber": "از شماره",
"twilioToNumber": "به شماره",
"Resend Notification if Down X times consecutively": "اگر X بار متوالی غیرفعال بود، مجددا اطلاع بده",
"successMessageExplanation": "پیام MQTT موفقیت آمیز به نظر نمیرسد",
"Create Incident": "یک حادثه را اطلاع دهید",
"Switch to Light Theme": "تغییر به حالت روشن",
"No monitors available.": "هیچ مانیتوری در دسترس نیست.",
"deleteProxyMsg": "آیا مطمئن هستید که میخواهید پروکسی را برای همه مانیتور ها غیرفعال کنید؟",
"enableProxyDescription": "این پروکسی تا زمانی که فعال نشود روی درخواست های مانیتور اثری نخواهد داشت. می‌توانید با توجه به وضعیت فعال‌سازی، پروکسی را از همه مانیتورها به طور موقت غیرفعال کنید.",
"supportTelegramChatID": "پشتیبانی از چت مستقیم / گروه / کانال",
"Long-Lived Access Token can be created by clicking on your profile name (bottom left) and scrolling to the bottom then click Create Token. ": "توکن دسترسی طولانی مدت (Long-Lived Access Token) را می توان با کلیک بر روی نام پروفایل خود (پایین سمت چپ) و اسکرول کردن به پایین و سپس روی Create Token ایجاد کرد. ",
"A list of Notification Services can be found in Home Assistant under \"Developer Tools > Services\" search for \"notification\" to find your device/phone name.": "فهرستی از سرویس‌های اعلان را می‌توانید در هوم اسیستنت در قسمت «ابزارهای برنامه‌نویس > خدمات» برای «اعلان» جستجو کنید تا نام دستگاه/تلفن خود را پیدا کنید.",
"lastDay4": "چهارمین روز آخر ماه",
"dnsCacheDescription": "ممکن است در برخی از محیط های IPv6 کار نکند، اگر با مشکلی مواجه شدید آن را غیرفعال کنید.",
"Maintenance Time Window of a Day": "صفحه نگه داری در روز",
"Messaging API": "API پیام (Messaging API)",
"wayToGetLineChannelToken": "ابتدا به {0} دسترسی پیدا کنید، یک ارائه دهنده و کانال ایجاد کنید (API پیام)، سپس می توانید رمز توکن کانال و آیدی کاربری را از آیتم های منوی ذکر شده در بالا دریافت کنید.",
"aboutMattermostChannelName": "می‌توانید با وارد کردن نام کانال در قسمت «نام کانال»، کانال پیش‌فرضی را که وب هوک به آن پست می‌کند لغو کنید. این باید در تنظیمات Mattermost Webhook فعال شود. مثال: #other-channel",
"dnsPortDescription": "پورت سرور DNS. پیش فرض ۵۳. می توانید این عدد را در هر زمانی عوض کنید.",
"affectedStatusPages": "نمایش این پیام تعمیر و نگه داری در صفحات استاتوس انتخاب شده",
"octopushSMSSender": "نام فرستنده پیامک: 3-11 الفبای انگلیسی، حروف و فاصله (a-zA-Z0-9)",
"Lowcost": "کم هزینه",
"You can divide numbers with": "می توانید اعداد را با آن تقسیم کنید",
"goAlertInfo": "GoAlert یک برنامه اوپن سورس برای زمان‌بندی تماس، افزایش خودکار و اعلان‌ها (مانند پیامک یا تماس‌های صوتی) است. به طور خودکار شخص مناسب، راه درست و در زمان مناسب را درگیر کنید! {0}",
"API Keys": "کلید های API",
"Expiry": "انقضا",
"Expiry date": "انقضا در تاریخ",
"Don't expire": "بدون انقضا (منقضی نمی شود)",
"For safety, must use secret key": "برای امنیت، میببایستی از SecretKey استفاده کنید",
"promosmsTypeFlash": "SMS FLASH - پیام به طور خودکار در دستگاه گیرنده نشان داده می شود. فقط به گیرندگان لهستانی محدود می شود.",
"promosmsTypeFull": "SMS FULL - پیامک پریموم، می توانید از نام فرستنده خود استفاده کنید (ابتدا باید نام خود را ثبت کنید). قابل اعتماد برای هشدار.",
"matrixHomeserverURL": "URL هوم سرور (با http(s):// و پورت اختیاری)",
"matrixDesc1": "با مراجعه به بخش پیشرفته تنظیمات اتاق در کلاینت Matrix خود می توانید آیدی داخلی اتاق را بیابید. باید شبیه \"!QMdRCpUIfLwsfjxye6:home.server\" باشد.",
"wayToGetPagerDutyKey": "با رفتن به Service -> Service Directory -> (Select a Service) -> Integrations -> Add integration می توانید این مورد را دریافت کنید. در اینجا می توانید \"Events API V2\" را جستجو کنید. اطلاعات بیشتر در {0}",
"smseagleRecipientType": "نوع گیرنده",
"smseagleEncoding": "ارسال به صورت یونیکد",
"Leave blank to use a shared sender number.": "برای استفاده از شماره فرستنده مشترک، آن را خالی بگذارید.",
"onebotSafetyTips": "برای امنیت، میبایستی توکن دسترسی اضافه کنید",
"Custom Monitor Type": "نوع مانیتور سفارشی",
"apiKeyAddedMsg": "کلید API شما اضافه شده است. لطفاً آن را یادداشت کنید زیرا دیگر نمایش داده نخواهد شد.",
"deleteAPIKeyMsg": "آیا مطمئن هستید که می خواهید این کلید API را غیرفعال کنید؟",
"twilioAccountSID": "SID حساب",
"twilioAuthToken": "توکن اعتبارسنجی",
"appriseNotInstalled": "Apprise نصب نشده است. {0}",
"trustProxyDescription": "به هدرهای «X-Forwarded-*» اعتماد کن. اگر می‌خواهید IP مشتری صحیح را دریافت کنید و آپ‌تایم کومای شما پشت پروکسی مانند Nginx یا Apache قرار دارد، باید این گزینه را فعال کنید.",
"matrixDesc2": "اکیداً توصیه می‌شود که یک کاربر جدید ایجاد کنید و از رمز دسترسی کاربر Matrix خود استفاده نکنید زیرا امکان دسترسی کامل به حساب شما و تمام اتاق‌هایی را که به آنها ملحق شده‌اید می‌دهد. در عوض، یک کاربر جدید ایجاد کنید و فقط او را به اتاقی دعوت کنید که می‌خواهید اعلان را دریافت کنید. می‌توانید با اجرای {0} توکن دسترسی را دریافت کنید",
"Certificate Chain": "زنجیره گواهی (Certificate Chain)",
"telegramMessageThreadID": "(اختیاری) آیدی Thread پیام",
"telegramMessageThreadIDDescription": "(اختیاری) شناسه منحصر به فرد برای موضوع پیام هدف در انجمن. فقط برای سوپر گروه های انجمن",
"Channel Name": "نام کانال",
"auto acknowledged": "تصدیق خودکار",
"needPushEvery": "هر {0} ثانیه، URL زیر را صدا بزن.",
"pushOptionalParams": "پارامترهای اختیاری: {0}",
"Affected Monitors": "مانیتورهای تحت تأثیر",
"Pick Affected Monitors...": "انتخاب مانیتورهای تحت تأثیر…",
"Start of maintenance": "زمان شروع نگهداری",
"All Status Pages": "همه صفحات مشاهده وضعیت",
"Select status pages...": "انتخاب صفحه مشاهده وضعیت…",
"here": "اینجا",
"Required": "اجباری",
"Post URL": "URL بعدی",
"defaultNotificationName": "هشدار {notification} در ({number})",
"Add one": "اضافه کردن",
"Page Not Found": "صفحه درخواستی پیدا نشد",
"Reverse Proxy": "ریورس پروکسی",
"Backup": "پشتیبان گیری",
"API Key": "کلید API",
"Show update if available": "نمایش بروز رسانی اگر موجود بود",
"Check how to config it for WebSocket": "بررسی چگونگی پیکربندی برای وب سوکت",
"Steam Game Server": "سرور گیم استیم",
"Most likely causes:": "به احتمال زیاد بخاطر:",
"The resource is no longer available.": "منبع دیگر در دسترس نیست.",
"Docker Container": "کانتینر داکر",
"Container Name / ID": "نام / آیدی کانتینر",
"Docker Host": "هاست داکر",
"Docker Hosts": "هاست های داکر",
"Domain": "دامنه",
"Clone Monitor": "تکثیر",
"Clone": "تکثیر",
"cloneOf": "تکثیر {0}",
"Prefix Custom Message": "پیشوند پیام سفارشی",
"enableGRPCTls": "امکان ارسال درخواست gRPC با اتصال TLS",
"pushoversounds classical": "کلاسیک",
"smtpDkimSettings": "تنظیمات DKIM",
"aboutChannelName": "اگر می‌خواهید کانال وب هوک را دور بزنید، نام کانال را در قسمت {0} نام کانال وارد کنید. مثال: #other-channel",
"aboutKumaURL": "اگر قسمت URL آپ‌تایم کوما را خالی بگذارید، به طور پیش‌فرض به صفحه پروژه گیت هاب تبدیل می‌شود.",
"smtpDkimDesc": "لطفاً برای استفاده به Nodemailer DKIM {0} مراجعه کنید.",
"alertaApiEndpoint": "اند پوینت API",
"serwersmsAPIUser": "نام کاربری API (شامل پیشوند webapi_)",
"serwersmsAPIPassword": "رمز عبور API",
"serwersmsPhoneNumber": "شماره موبایل",
"serwersmsSenderName": "نام فرستنده پیامک (ثبت شده از طریق پورتال مشتری)",
"alertaRecoverState": "حالت ریکاور (Recover State)",
"smseagleToken": "توکن دسترسی API",
"Google Analytics ID": "آیدی گوگل آنالیتیکس",
"pagertreeLow": "کم",
"pagertreeMedium": "متوسط",
"pagertreeHigh": "زیاد",
"pagertreeCritical": "حساس - خیلی مهم",
"pagertreeIntegrationUrl": "URL یکپارچه سازی",
"pagertreeUrgency": "اهمیت",
"pagertreeSilent": "بی صدا",
"pagertreeResolve": "Resolve اتوماتیک",
"pagertreeDoNothing": "هیچ کاری نکن",
"wayToGetPagerTreeIntegrationURL": "پس از ایجاد ادغام آپ‌تایم کوما در PagerTree، اند پوینت را کپی کنید. مشاهده جزئیات کامل در {0}",
"telegramProtectContent": "محافظت از ارسال/ذخیره",
"telegramProtectContentDescription": "در صورت فعال بودن، پیام‌های ربات در تلگرام از ارسال و ذخیره محافظت می‌شوند.",
"wayToGetTelegramChatID": "برای مشاهده chat_id می توانید شناسه چت خود را با ارسال یک پیام به ربات و رفتن به این URL دریافت کنید:",
"YOUR BOT TOKEN HERE": "شناسه ربات خود را اینجا وارد کنید",
"chatIDNotFound": "شناسه چت یافت نشد. لطفا ابتدا به ربات پیام دهید",
"disableCloudflaredNoAuthMsg": "شما در حالت بدون احراز هویت هستید، رمز عبور در این حالت لازم نیست.",
"Trigger type:": "نوع راه اندازی:",
"DateTime Range": "محدوده تاریخ",
"loadingError": "نمی توان داده ها را دریافت کرد، لطفاً بعداً دوباره امتحان کنید.",
"High": "زیاد",
"Retry": "تلاش مجدد",
"Topic": "موضوع",
"Integration Key": "کلید یکپارچه سازی",
"Edit Tag": "ویرایش تگ",
"Server Address": "آدرس سرور",
"Learn More": "بیشتر بدانید",
"Customize": "شخصی سازی",
"Custom Footer": "فوتر اختصاصی",
"No Proxy": "بدون پروکسی",
"Authentication": "احراز هویت",
"steamApiKeyDescription": "برای مانیتورینگ یک سرور استیم،‌ شما نیاز به یک \"Steam Web-API key\" دارید. برای دریافت کلید میتوانید از اینجا اقدام کنید: ",
"No Monitors": "بدون مانیتور",
"Untitled Group": "دسته بنده نشده",
"Services": "سرویس ها",
"Discard": "دست کشیدن",
"Cancel": "انصراف",
"About": "درباره آپ‌تایم کوما",
"wayToGetCloudflaredURL": "(دریافت Cloudflared از {0})",
"cloudflareWebsite": "وب سایت کلادفلر",
"shrinkDatabaseDescription": "تریگر VACUUM برای SQLite. اگر دیتابیس شما بعد از 1.10.0 ایجاد شده باشد، AUTO_VACUUM قبلاً فعال شده است و لازم نیست این عمل انجام شود. (Trigger database VACUUM for SQLite. If your database is created after 1.10.0, AUTO_VACUUM is already enabled and this action is not needed.).",
"Message:": "پیام:",
"HTTP Headers": "هدر های HTTP",
"Bot Token": "توکن بات",
"SecretKey": "کلید محرمانه (SecretKey)",
"telegramSendSilently": "ارسال بی صدا",
"telegramSendSilentlyDescription": "پیام را بی صدا ارسال کن. در این حالت کاربران یک اعلان بدون صدا دریافت خواهند کرد.",
"install": "نصب",
"Icon URL": "URL آیکون",
"Steam API Key": "کلید API استیم",
"Security": "امنیت",
"light": "روشن",
"Query": "کوئری",
"Effective Date Range": "محدوده تاریخ مورد تاثیر (اختیاری)",
"statusPageRefreshIn": "بارگذاری مجدد در هر: {0}",
"Content Type": "نوع محتوا (Content Type)",
"Server URL": "آدرس سرور",
"Priority": "اهمیت",
"emojiCheatSheet": "چیت شیت ایموجی ها: {0}",
"Read more": "بیشتر بدانید",
"webhookJsonDesc": "{0} برای هر HTTP سرور جدیدی مانند Express.js مناسب است",
"Method": "متد",
"Headers": "هدر ها",
"PushUrl": "URL پوش",
"HeadersInvalidFormat": "هدر ریکوئست یک JSON درست نیست: ",
"BodyInvalidFormat": "هدر ریکوئست یک JSON درست نیست: ",
"Monitor History": "گزارش مانیتورینگ",
"clearDataOlderThan": "گزارشات مانیتورینگ را برای {0} روز نگه دار.",
"PasswordsDoNotMatch": "رمز عبور وارد شده درست نیست.",
"topic": "موضوع",
"topicExplanation": "موضوع MQTT برای مانیتور",
"successMessage": "پیام موفقیت آمیز",
"recent": "اخیر",
"Done": "انجام شده",
"Shrink Database": "فشرده سازی دیتابیس",
"Pick a RR-Type...": "یک تایپ RR انتخاب کنید…",
"Pick Accepted Status Codes...": "یک استاتوس کد قابل قبول انتخاب کنید…",
"Default": "پیش فرض",
"HTTP Options": "آپشن های HTTP",
"Title": "عنوان",
"Content": "محتوا",
"primary": "اولیه",
"dark": "تیره",
"Post": "اطلاع بده",
"Please input title and content": "لطفا یک عنوان و محتوا وارد کنید",
"Created": "ساخته شده در",
"Last Updated": "ویرایش شده در",
"Unpin": "برداشتن",
"Switch to Dark Theme": "تغییر به حالت تیره",
"Show Tags": "نمایش تگ ها",
"Hide Tags": "مخفی سازی تگ ها",
"Description": "توضحیات",
"Custom CSS": "CSS اختصاصی",
"deleteStatusPageMsg": "آیا بابت حذف این استاتوس پیچ مطمئن هستید؟",
"Proxies": "پروکسی ها",
"appriseInstalled": "Apprise نصب شده است.",
"Body": "متن",
"Start": "شروع",
"Stop": "توقف",
"Add New Status Page": "افزودن صفحه استاتوس جدید",
"Slug": "لینک",
"Accept characters:": "کاراکتر های مورد تایید:",
"startOrEndWithOnly": "شروع یا پایان فقط با {0}",
"No consecutive dashes": "بدون خط تیره متوالی",
"Next": "بعدی",
"The slug is already taken. Please choose another slug.": "این لینک قبلا گرفته شده است. لطفا لینک دیگری را انتخاب کنید.",
"New Status Page": "صفحه استاتوس جدید",
"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.": "اگر در حال حاضر از طریق تونل به کلادفلر متصل می شوید، ممکن است اتصال فعلی قطع شود. آیا مطمئن هستید که می خواهید کلادفلر را متوقف کنید؟ رمز عبور خود را برای تایید این دستور تایپ کنید.",
"Trust Proxy": "پروکسی مورد اعتماد",
"Other Software": "برنامه های دیگر",
"For example: nginx, Apache and Traefik.": "برای مثال: Nginx ،Apache و Traefik.",
"signedInDispDisabled": "اعتبارسنجی غیرفعال شده است.",
"RadiusCallingStationIdDescription": "شناسه دستگاه تماس گیرنده",
"Certificate Expiry Notification": "اطلاعیه انقضای گواهی",
"RadiusSecret": "کلید Radius",
"API Username": "نام کاربری API",
"Also check beta release": "همچنین برای نسخه های بتا نیز جستجو کن",
"Using a Reverse Proxy?": "استفاده از ریورس پروکسی؟",
"There might be a typing error in the address.": "ممکن است یک خطای تایپ در آدرس وجود داشته باشد.",
"What you can try:": "آنچه می توانید امتحان کنید:",
"Go back to the previous page.": "بازگشت به صفحه قبلی.",
"Coming Soon": "به زودی",
"Connection String": "رشته اتصال‌ (Connection String)",
"settingsCertificateExpiry": "انقضای گواهی TLS",
"certificationExpiryDescription": "مانیتور های HTTPS راه اندازی میشود زمانی که گواهی TLS منقضی شود در:",
"Retype the address.": "آدرس را دوباره تایپ کنید.",
"Setup Docker Host": "راه اندازی هاست داکر",
"Connection Type": "نوع اتصال",
"Docker Daemon": "Daemon داکر",
"deleteDockerHostMsg": "آیا مطمئن هستید که می خواهید این هاست داکر را برای همه مانیتورها حذف کنید؟",
"Workstation": "محل کار (Workstation)",
"Packet Size": "سایز پکت",
"wayToGetTelegramToken": "شما میتوانید توکن خود را از {0} دریافت کنید.",
"Chat ID": "آیدی چت",
"wayToGetLineNotifyToken": "می‌توانید یک توکن جهت دسترسی از {0} دریافت کنید",
"Examples": "مثال ها",
"Home Assistant URL": "URL هوم اسیستنت شما",
"Long-Lived Access Token": "توکن دسترسی طولانی مدت",
"Notification Service": "سرویس اطلاع رسانی",
"default: notify all devices": "پیش فرض: اطلاع به همه دستگاه ها",
"Automations can optionally be triggered in Home Assistant:": "اتوماسیون ها می توانند به صورت اختیاری در هوم اسیستنت فعال شوند:",
"Event type:": "نوع ایونت:",
"Event data:": "نوع دیتا:",
"Then choose an action, for example switch the scene to where an RGB light is red.": "سپس یک عمل را انتخاب کنید، برای مثال صحنه را به جایی که نور RGB قرمز است تغییر دهید.",
"Optional": "اختیاری",
"recurringInterval": "وقفه",
"Recurring": "مکرر",
"strategyManual": "فعال/غیرفعال سازی به صورت دستی",
"warningTimezone": "این از منطقه زمانی سرور استفاده می کند",
"weekdayShortMon": "دوشنبه",
"weekdayShortTue": "سه شنبه",
"weekdayShortWed": "چهارشنبه",
"weekdayShortThu": "پنجشنبه",
"weekdayShortFri": "جمعه",
"weekdayShortSat": "شنبه",
"weekdayShortSun": "یکشنبه",
"dayOfWeek": "روز های هفته",
"dayOfMonth": "روز های ماه",
"lastDay": "روز آخر",
"lastDay1": "روز آخر ماه",
"lastDay2": "دومین روز آخر ماه",
"lastDay3": "سومین روز آخر ماه",
"Enable": "فعال سازی",
"Single Maintenance Window": "تعمیر و نگه داری تک صفحه",
"Schedule Maintenance": "زمانبندی تعمیر و نگهداری",
"Date and Time": "زمان و تاریخ",
"plugin": "پلاگین | پلاگین ها",
"installing": "در حال نصب",
"uninstall": "حذف از نصب",
"uninstalling": "درحال حذف",
"confirmUninstallPlugin": "آیا مطمئن هستید که می خواهید این پلاگین را حذف از نصب کنید؟",
"notificationRegional": "منطقه ای",
"secureOptionNone": "None / STARTTLS (25, 587)",
"secureOptionTLS": "TLS (465)",
"Ignore TLS Error": "خطای TLS را نادیده بگیر",
"From Email": "از ایمیل",
"emailCustomSubject": "موضوع سفارشی",
"To Email": "به ایمیل",
"smtpBCC": "BCC",
"Discord Webhook URL": "URL وب هوک دیسکورد",
"Bot Display Name": "نام نمایشی ربات",
"Hello @everyone is...": "سلام {'@'} همه…",
"wayToGetTeamsURL": "می‌توانید نحوه ایجاد وب هوک را در {0} بیاموزید.",
"wayToGetZohoCliqURL": "می‌توانید نحوه ایجاد وب هوک را در {0} بیاموزید.",
"needSignalAPI": "شما باید یک Signal Client با REST API داشته باشید.",
"wayToCheckSignalURL": "برای مشاهده نحوه تنظیم آن می توانید این URL را بررسی کنید:",
"Number": "عدد",
"Recipients": "گیرندگان",
"Channel access token": "توکن دسترسی به کانال",
"Line Developers Console": "کنسول توسعه دهندگان لاین (Line Developers Console)",
"lineDevConsoleTo": "کنسول توسعه دهندگان لاین (Line Developers Console) - {0}",
"Basic Settings": "تنظیمات پایه",
"User ID": "آیدی کاربر",
"aboutIconURL": "می‌توانید پیوندی به یک عکس در \"URL آیکون \" ارائه دهید تا عکس نمایه پیش‌فرض را لغو کنید. اگر نماد Emoji تنظیم شده باشد، این مورد استفاده نخواهد شد.",
"dataRetentionTimeError": "دوره نگهداری باید 0 یا بیشتر باشد",
"wayToGetDiscordURL": "شما می توانید این را با رفتن به تنظیمات سرور -> ادغام -> مشاهده وب هوک -> وب هوک جدید (Settings -> Integrations -> View Webhooks -> New Webhook) دریافت کنید",
"infiniteRetention": "برای دوره بی نهایت 0 را وارد تنظیم کنید.",
"confirmDeleteTagMsg": "آیا مطمئن هستید که می خواهید این تگ را حذف کنید؟ مانیتورهای مرتبط با این تگ حذف نخواهند شد.",
"grpcMethodDescription": "نام روش تبدیل به فرمت cammelCase مانند sayHello، check و غیره.",
"deleteMaintenanceMsg": "آیا مطمئن هستید که می خواهید این تعمیر و نگهداری را حذف کنید؟",
"recurringIntervalMessage": "یکبار اجرا برای هر روز | یکبار اجرا در هر {0} روز",
"affectedMonitorsDescription": "مانیتورهایی را انتخاب کنید که تحت تأثیر تعمیر و نگهداری فعلی هستند",
"atLeastOneMonitor": "حداقل یک مانیتور مورد تاثیر را انتخاب کنید",
"octopushAPIKey": "\"کلید API\" از اعتبارنامه های HTTP API در کنترل پنل",
"octopushLogin": "\"ورود\" از اعتبار HTTP API در کنترل پنل",
"promosmsLogin": "نام ورود API",
"pushoversounds cashregister": "صندوق فروش",
"pushoversounds falling": "رها کردن",
"pushoversounds incoming": "ورودی",
"pushoversounds intermission": "وقفه",
"pushoversounds magic": "سحر آمیز",
"pushoversounds mechanical": "مکانیکی",
"pushoversounds pianobar": "پیانو بار",
"pushoversounds siren": "آژیر",
"pushoversounds spacealarm": "هشدار فضایی",
"pushoversounds gamelan": "گیم لن (Gamelan)",
"Current User": "کاربر فعلی",
"pushoversounds none": "بی صدا",
"pushoversounds tugboat": "قایق یدک کش",
"pushoversounds alien": "هشدار بیگانه (طولانی)",
"pushoversounds climb": "صعود (طولانی)",
"pushoversounds persistent": "پایدار (طولانی)",
"pushoversounds echo": "اکو (طولانی)",
"pushoversounds updown": "بالا پایین (طولانی)",
"pushoversounds vibrate": "فقط ویبره",
"pushyToken": "توکن دستگاه",
"GoogleChat": "Google Chat (فقط Google Workspace)",
"wayToGetKookBotToken": "یک برنامه ایجاد کنید و توکن ربات خود را از {0} دریافت کنید",
"User Key": "کلید کاربر",
"Message Title": "عنوان پیام",
"Notification Sound": "صدای اعلان",
"More info on:": "اطلاعات بیشتر در مورد: {0}",
"pushoverDesc1": "اولویت اضطراری (2) دارای وقفه پیش‌فرض 30 ثانیه بین تلاش‌های مجدد است و پس از 1 ساعت منقضی می‌شود.",
"pushoverDesc2": "اگر می‌خواهید اعلان‌ها را به دستگاه‌های مختلف ارسال کنید، قسمت دستگاه را پر کنید.",
"pushyAPIKey": "کلید Secret API",
"wayToGetKookGuildID": "«حالت توسعه‌دهنده» را در تنظیمات کوک روشن کنید و روی انجمن کلیک راست کنید تا شناسه آن را دریافت کنید",
"Guild ID": "گیلد آیدی (Guild ID)",
"SMS Type": "نوع پیامک",
"octopushTypePremium": "پرمیوم (سریع - پیشنهاد شده برای هشدار ها)",
"octopushTypeLowCost": "کم هزینه (آهسته - گاهی اوقات توسط اپراتور مسدود می شود)",
"checkPrice": "بررسی قیمت‌های {0} :",
"apiCredentials": "اطلاعات API",
"octopushLegacyHint": "آیا از نسخه قدیمی Octopush (1387-1400) استفاده می کنید یا از نسخه جدید؟",
"octopushPhoneNumber": "شماره تلفن (حالت بین المللی مانند 989121234567+) ",
"LunaSea Device ID": "شناسه دستگاه LunaSea",
"Apprise URL": "آدرس Apprise",
"Example:": "مثال: {0}",
"Read more:": "بیشتر بخوانید: {0}",
"Free Mobile User Identifier": "شناسه کاربری Free Mobile",
"Free Mobile API Key": "کلید API در Free Mobile",
"Enable TLS": "فعال کردن TLS",
"Proto Service Name": "نام Proto Service",
"Proto Method": "متد Proto",
"Proto Content": "محتوای Proto",
"Economy": "اقتصاد",
"high": "زیاد",
"SMSManager API Docs": "مستندات SMSManager API ",
"Gateway Type": "نوع Gateway",
"Base URL": "URL پایه",
"goAlertIntegrationKeyInfo": "کلید ادغام API عمومی را برای سرویس در این قالب دریافت کنید \"aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeee\" معمولاً مقدار پارامتر توکن URL کپی شده است.",
"AccessKeyId": "آیدی AccessKey",
"PhoneNumbers": "شماره های موبایل",
"TemplateCode": "کد تمپلیت",
"Sms template must contain parameters: ": "قالب پیامک باید دارای پارامترهای زیر باشد: ",
"Bark Endpoint": "اند پوینت Bark",
"Bark Group": "گروه Bark",
"Bark Sound": "صدای Bark",
"WebHookUrl": "آدرس وب هوک",
"Device Token": "توکن دستگاه",
"Platform": "پلتفرم",
"Check octopush prices": "بررسی قیمت های octopush {0}.",
"SendKey": "کلید ارسال (SendKey)",
"SecretAccessKey": "کلید دسترسی مخفی (AccessKey Secret)",
"SignName": "نام امضا (SignName)",
"Android": "اندروید",
"Huawei": "هواوی",
"WeCom Bot Key": "کلید ربات WeCom",
"Setup Proxy": "تنظیم پروکسی",
"Proxy Protocol": "پروتکل پروکسی",
"Proxy Server": "پروتکل سرور",
"promosmsTypeEco": "SMS ECO - ارزان اما کند و اغلب بارگذاری شده است. فقط به گیرندگان لهستانی محدود می شود.",
"promosmsTypeSpeed": "SPEED SMS - بالاترین اولویت در سیستم. بسیار سریع و قابل اعتماد اما پرهزینه (حدود دو برابر قیمت SMS FULL).",
"promosmsPhoneNumber": "شماره تلفن (برای گیرنده لهستانی می توانید کدهای منطقه را نادیده بگیرید)",
"promosmsSMSSender": "نام فرستنده پیامک: نام از پیش ثبت شده یا یکی از پیش فرض ها: InfoSMS، SMS Info، MaxSMS، INFO، SMS",
"promosmsAllowLongSMS": "اجازه برای پیامک طولانی",
"Feishu WebHookUrl": "آدرس وب هوک Feishu",
"Internal Room Id": "آیدی اتاق داخلی",
"Uptime Kuma URL": "URL آپ‌تایم کوما",
"signalImportant": "مهم: شما نمی توانید گروه ها و اعداد را در گیرندگان ترکیب کنید!",
"aboutWebhooks": "اطلاعات بیشتر درباره وب هوک در: {0}",
"documentation": "مستندات",
"smtpDkimDomain": "نام دامنه",
"smtpDkimHashAlgo": "الگوریتم رمزگذاری (اختیاری)",
"smtpDkimheaderFieldNames": "کلیدهای هدر برای امضا (اختیاری)",
"smtpDkimskipFields": "کلیدهای هدر برای عدم امضا (اختیاری)",
"Integration URL": "URL یکپارچه سازی",
"smtpDkimKeySelector": "انتخابگر کلید (SecretKey)",
"smtpDkimPrivateKey": "کلید محرمانه (Private Key)",
"socket": "سوکت",
"do nothing": "هیچ کاری نکن",
"auto resolve": "حل خودکار",
"alertaEnvironment": "محیط",
"alertaApiKey": "کلید API",
"alertaAlertState": "وضعیت هشدار",
"smseagleTo": "شماره تلفن(ها)",
"smseagleGroup": "نام(های) گروه دفترچه تلفن",
"smseagleContact": "نام(های) تماس دفترچه تلفن",
"smseagleRecipient": "گیرنده(های) (چند مورد باید با کاما از هم جدا شوند)",
"smseagleUrl": "URL دستگاه SMSEagle شما",
"smseaglePriority": "اولویت پیام (0-9، پیش فرض = 0)",
"Recipient Number": "شماره گیرنده",
"From Name/Number": "از نام/شماره",
"Octopush API Version": "نسخه Octopush API",
"ntfy Topic": "موضوع ntfy",
"onebotHttpAddress": "آدرس HTTP OneBot",
"onebotMessageType": "نوع پیام OneBot",
"onebotGroupMessage": "گروه",
"onebotPrivateMessage": "خصوصی",
"onebotUserOrGroupId": "آیدی گروه/کاربر",
"PushDeer Key": "کلید PushDeer",
"wayToGetClickSendSMSToken": "می‌توانید نام کاربری و کلید API را از {0} دریافت کنید.",
"Continue": "ادامه",
"Add Another": "افزودن یکی دیگر",
"Key Added": "کلید API اضافه شد",
"Add API Key": "افزودن کلید API",
"No API Keys": "بدون کلید API",
"apiKey-active": "فعال",
"apiKey-expired": "منقضی شده",
"apiKey-inactive": "غیرفعال",
"Expires": "انقضا",
"disableAPIKeyMsg": "آیا مطمئن هستید که می خواهید این کلید API را غیرفعال کنید؟",
"Generate": "ایجاد یک کلید API جدید",
"lunaseaTarget": "هدف",
"lunaseaDeviceID": "آيدی دستگاه",
"lunaseaUserID": "آیدی کاربر",
"Auto resolve or acknowledged": "حل خودکار یا اعلام اطلاع یافته (Auto resolve or acknowledged)",
"Legacy Octopush-DM": "(Legacy Octopush-DM)",
"smtpCC": "ارسال نسخه به",
"promosmsPassword": "رمز عبور API",
"pushoversounds pushover": "Pushover (پیش‌فرض)",
"pushoversounds bike": "دوچرخه",
"pushoversounds bugle": "بوق",
"pushoversounds cosmic": "کیهانی",
"resendEveryXTimes": "پیام را هر {0} بار دوباره ارسال کن",
"resendDisabled": "ارسال مجدد غیرفعال است",
"Push URL": "URL پوش",
"Schedule maintenance": "زمانبندی نگهداری (غیرفعال سازی دستی)",
"webhookFormDataDesc": "{multipart} برای PHP مناسب است. آرایه JSON نیاز است تا به این شکل باز شود {decodeFunction}",
"webhookAdditionalHeadersTitle": "هدر اضافی",
"webhookAdditionalHeadersDesc": "تنظیم هدر های اضافی که نیاز است با وب هوک ارسال شود.",
"Webhook URL": "آدرس وب هوک",
"Application Token": "توکن اپلیکیشن",
"Style": "حالت ها",
"info": "اطلاعات",
"warning": "هشدار",
"danger": "خطر",
"error": "خطا",
"critical": "اهمیت ویژه",
"HTTP Basic Auth": "حالت پایه احراز هویت (HTTP Basic Auth)",
"RadiusSecretDescription": "اشتراک گذاری Secret بین کاربر و سرور",
"RadiusCalledStationId": "نام Station Id",
"RadiusCalledStationIdDescription": "شناسه دستگاه فراخوانی شده",
"RadiusCallingStationId": "آیدی ایستگاه تماس (Calling Station Id)",
"tcp": "TCP / HTTP",
"Frontend Version": "نسخه فرانت اند",
"Frontend Version do not match backend version!": "نسخه فرانت اند با نسخه بک اند مطابقت ندارد!",
"backupOutdatedWarning": "منسوخ شده: از آنجایی که بسیاری از ویژگی ها اضافه شده اند و این ویژگی پشتیبان گیری کمی حفظ نشده است، نمی تواند یک نسخه پشتیبان کامل ایجاد یا بازیابی شود.",
"backupRecommend": "لطفاً مستقیماً از Volume یا پوشه داده (./data/) نسخه پشتیبان تهیه کنید.",
"No Maintenance": "بدون تعمیر و نگهداری",
"pauseMaintenanceMsg": "آیا مطمئن هستید که می خواهید توقف کنید؟",
"maintenanceStatus-under-maintenance": "تحت تعمیر و نگهداری",
"maintenanceStatus-inactive": "غیرفعال",
"maintenanceStatus-scheduled": "برنامه ریزی شده",
"maintenanceStatus-ended": "پایان یافته",
"maintenanceStatus-unknown": "ناشناخته",
"Display Timezone": "منطقه زمانی برای نمایش",
"Server Timezone": "منطقه زمانی در سرور",
"statusPageMaintenanceEndDate": "پایان",
"IconUrl": "URL آیکون",
"Enable DNS Cache": "فعال سازی کش DNS",
"Access Token": "توکن دسترسی",
"smtp": "ایمیل (SMTP)",
"Device": "دستگاه",
"Proxy server has authentication": "پروکسی سرور دارای احراز هویت",
"Add New Tag": "اضافه کردن تگ جدید",
"Custom": "غیره",
"default": "پیش فرض",
"enabled": "فعال",
"setAsDefault": "ذخیره به عنوان پیش فرض",
"proxyDescription": "پروکسی برای راه اندازی این مانیتور اجباری است.",
"setAsDefaultProxyDescription": "این پروکسی به طور پیش فرض برای مانیتورهای جدید فعال می شود. همچنان می توانید پروکسی را به طور جداگانه برای هر مانیتور غیرفعال کنید.",
"Valid": "درست",
"Invalid": "نادرست",
"User": "کاربر",
"Installed": "نصب شده",
"Not installed": "نصب نشده",
"Running": "در حال اجرا",
"Not running": "اجرا نشده",
"Remove Token": "حذف توکن",
"Please read": "لطفا بخوانید",
"Subject:": "موضوع:",
"Valid To:": "معتبر تا:",
"Days Remaining:": "روز های باقی مانده:",
"Fingerprint:": "اثرانگشت (Fingerprint):",
"No status pages": "بدون صفحات استاتوس",
"Domain Name Expiry Notification": "اعلان انقضای نام دامنه",
"Issuer:": "صادرکننده:",
"Date Created": "ایجاد شده در",
"Footer Text": "متن فوتر",
"Show Powered By": "نمایش قدرت گرفته از آپ‌تایم کوما",
"Domain Names": "نام دامنه ها",
"Proxy": "پروکسی",
"signedInDisp": "وارد شده به عنوان {0}",
"or": "یا",
"Disable": "غیرفعال سازی",
"endpoint": "نقطه پایانی",
"Status:": "وضعیت: {0}",
"Strategy": "استراتژی",
"Icon Emoji": "ایموجی آیکون",
"sameAsServerTimezone": "مشابه با منطقه زمانی سرور",
"startDateTime": "ساعت/روز شروع",
"endDateTime": "ساعت/روز پایان",
"cronSchedule": "برنامه زمانی: ",
"invalidCronExpression": "حالت کرون نامعتبر است: {0}",
"cronExpression": "حالت کرون"
} }

@ -73,11 +73,11 @@
"Delete": "Supprimer", "Delete": "Supprimer",
"Current": "Actuellement", "Current": "Actuellement",
"Uptime": "Disponibilité", "Uptime": "Disponibilité",
"Cert Exp.": "Expiration SSL.", "Cert Exp.": "Expiration SSL",
"day": "jour | jours", "day": "jour | jours",
"-day": "-jour", "-day": "-jour",
"hour": "heure", "hour": "heure",
"-hour": "-heure", "-hour": "heures",
"Response": "Temps de réponse", "Response": "Temps de réponse",
"Ping": "Ping", "Ping": "Ping",
"Monitor Type": "Type de sonde", "Monitor Type": "Type de sonde",
@ -658,7 +658,7 @@
"dnsCacheDescription": "Il peut ne pas fonctionner dans certains environnements IPv6, désactivez-le si vous rencontrez des problèmes.", "dnsCacheDescription": "Il peut ne pas fonctionner dans certains environnements IPv6, désactivez-le si vous rencontrez des problèmes.",
"Single Maintenance Window": "Créneau de maintenance unique", "Single Maintenance Window": "Créneau de maintenance unique",
"Maintenance Time Window of a Day": "Créneau de la maintenance", "Maintenance Time Window of a Day": "Créneau de la maintenance",
"Effective Date Range": "Plage de dates d'effet", "Effective Date Range": "Plage de dates d'effet (facultatif)",
"Schedule Maintenance": "Créer une maintenance", "Schedule Maintenance": "Créer une maintenance",
"Date and Time": "Date et heure", "Date and Time": "Date et heure",
"DateTime Range": "Plage de dates et d'heures", "DateTime Range": "Plage de dates et d'heures",
@ -696,5 +696,58 @@
"Google Analytics ID": "Identifiant Google Analytics", "Google Analytics ID": "Identifiant Google Analytics",
"Server Address": "Adresse du serveur", "Server Address": "Adresse du serveur",
"Learn More": "En savoir plus", "Learn More": "En savoir plus",
"Edit Tag": "Modifier l'étiquette" "Edit Tag": "Modifier l'étiquette",
"Body Encoding": "Encodage du corps",
"telegramMessageThreadID": "(Facultatif) ID du fil de message",
"telegramMessageThreadIDDescription": "(Facultatif) Identifiant unique pour le fil de discussion cible (sujet) du forum; pour les supergroupes du forum uniquement",
"telegramProtectContent": "Protéger le transfert/l'enregistrement",
"telegramProtectContentDescription": "S'il est activé, les messages du robot dans Telegram seront protégés contre le transfert et l'enregistrement.",
"telegramSendSilently": "Envoyer silencieusement",
"telegramSendSilentlyDescription": "Envoie le message silencieusement. Les utilisateurs recevront une notification sans son.",
"notificationRegional": "Régional",
"Clone Monitor": "Cloner la sonde",
"Clone": "Cloner",
"cloneOf": "Clone de {0}",
"Expiry date": "Date d'expiration",
"Add Another": "Ajouter un autre",
"Key Added": "Clé ajoutée",
"Expiry": "Expiration",
"Continue": "Continuer",
"Add API Key": "Ajouter une clé API",
"No API Keys": "Aucune clé API",
"apiKey-active": "Active",
"apiKey-expired": "Expirée",
"apiKey-inactive": "Inactive",
"Expires": "Expire",
"disableAPIKeyMsg": "Voulez-vous vraiment désactiver cette clé API ?",
"deleteAPIKeyMsg": "Voulez-vous vraiment supprimer cette clé API ?",
"Generate": "Générer",
"API Keys": "Clés API",
"apiKeyAddedMsg": "Votre clé API a été ajoutée. Veuillez la noter car elle ne pourra plus être affichée.",
"Don't expire": "N'expire pas",
"pagertreeUrgency": "Urgence",
"pagertreeSilent": "Silencieux",
"pagertreeLow": "Faible",
"pagertreeMedium": "Moyen",
"pagertreeHigh": "Haut",
"pagertreeResolve": "Résolution automatique",
"pagertreeDoNothing": "Ne fais rien",
"pagertreeIntegrationUrl": "URL d'intégration",
"pagertreeCritical": "Critique",
"wayToGetPagerTreeIntegrationURL": "Après avoir créé l'intégration Uptime Kuma dans PagerTree, copiez le fichier Endpoint. Voir tous les détails {0}",
"lunaseaDeviceID": "Identifiant de l'appareil",
"lunaseaUserID": "Identifiant de l'utilisateur",
"Add New Tag": "Ajouter une étiquette",
"lunaseaTarget": "Cible",
"statusPageRefreshIn": "Actualisation dans: {0}",
"twilioFromNumber": "Du Nombre",
"twilioToNumber": "Au Nombre",
"twilioAccountSID": "ID du compte",
"twilioAuthToken": "Jeton d'authentification",
"sameAsServerTimezone": "Identique au fuseau horaire du serveur",
"startDateTime": "Date/heure de début",
"endDateTime": "Date/heure de fin",
"cronExpression": "Expression cron",
"cronSchedule": "Calendrier: ",
"invalidCronExpression": "Expression Cron non valide : {0}"
} }

@ -1,13 +1,13 @@
{ {
"languageName": "עברית", "languageName": "עברית",
"checkEverySecond": "בדוק כל {0} שניות", "checkEverySecond": "בדיקה כל {0} שניות",
"retryCheckEverySecond": סה שוב כל {0} שניות", "retryCheckEverySecond": יסיון חוזר כל {0} שניות",
"resendEveryXTimes": "התראה שוב כל {0} פעמים", "resendEveryXTimes": "שליחה שוב כל {0} פעמים",
"resendDisabled": "השליחה מחדש מושבתת", "resendDisabled": "שליחה מחדש מושבתת",
"retriesDescription": "מקסימום ניסיונות חוזרים לפני שהשירות יסומן כלא פעיל ונשלחת התראה", "retriesDescription": "מקסימום ניסיונות חוזרים לפני שהשירות יסומן כלא פעיל ותשלח התראה",
"ignoreTLSError": "התעלם משגיאת TLS/SSL עבור אתרי HTTPS", "ignoreTLSError": "התעלם משגיאת TLS/SSL עבור אתרי HTTPS",
"upsideDownModeDescription": "הפוך את הסטטוס על הפוך. אם ניתן להגיע לשירות, הוא לא פעיל.", "upsideDownModeDescription": "הפוך את יעד הסטטוס. אם ניתן להגיע לשירות, הוא ייחשב כלא פעיל.",
"maxRedirectDescription": "המספר המרבי של הפניות מחדש לעקוב. הגדר ל-0 כדי להשבית הפניות מחדש.", "maxRedirectDescription": "המספר המרבי של הפניות מחדש למעקב. ערך 0 ישבית הפניות מחדש לגמרי.",
"enableGRPCTls": "אפשר לשלוח בקשת gRPC עם חיבור TLS", "enableGRPCTls": "אפשר לשלוח בקשת gRPC עם חיבור TLS",
"grpcMethodDescription": "שם השיטה מומר לפורמט cammelCase כגון sayHello, check וכו.", "grpcMethodDescription": "שם השיטה מומר לפורמט cammelCase כגון sayHello, check וכו.",
"acceptedStatusCodesDescription": "בחר קודי סטטוס שנחשבים לתגובה מוצלחת.", "acceptedStatusCodesDescription": "בחר קודי סטטוס שנחשבים לתגובה מוצלחת.",
@ -23,7 +23,7 @@
"affectedMonitorsDescription": "בחר מוניטורים שמושפעים מהתחזוקה הנוכחית", "affectedMonitorsDescription": "בחר מוניטורים שמושפעים מהתחזוקה הנוכחית",
"affectedStatusPages": "הצג הודעת תחזוקה זו בדפי סטטוס שנבחרו", "affectedStatusPages": "הצג הודעת תחזוקה זו בדפי סטטוס שנבחרו",
"atLeastOneMonitor": "בחר לפחות מוניטור אחד מושפע", "atLeastOneMonitor": "בחר לפחות מוניטור אחד מושפע",
"passwordNotMatchMsg": "הסיסמאות לא תואמות", "passwordNotMatchMsg": "הסיסמאות שהזנתם אינן תואמות.",
"notificationDescription": "יש להקצות התראות למוניטור כדי שהן יעבדו.", "notificationDescription": "יש להקצות התראות למוניטור כדי שהן יעבדו.",
"keywordDescription": "חפש מילת מפתח בתגובת HTML או JSON רגילה. החיפוש תלוי רישיות.", "keywordDescription": "חפש מילת מפתח בתגובת HTML או JSON רגילה. החיפוש תלוי רישיות.",
"pauseDashboardHome": "עצור", "pauseDashboardHome": "עצור",
@ -43,37 +43,37 @@
"twoFAVerifyLabel": "אנא הזן את האסימון שלך כדי לאמת מערכת אדוש:", "twoFAVerifyLabel": "אנא הזן את האסימון שלך כדי לאמת מערכת אדוש:",
"tokenValidSettingsMsg": "האסימון תקף! כעת אתה יכול לשמור את הגדרות האדוש.", "tokenValidSettingsMsg": "האסימון תקף! כעת אתה יכול לשמור את הגדרות האדוש.",
"confirmEnableTwoFAMsg": "האם אתה בטוח שברצונך להפעיל את מערכת אדוש?", "confirmEnableTwoFAMsg": "האם אתה בטוח שברצונך להפעיל את מערכת אדוש?",
"confirmDisableTwoFAMsg": "Are you sure you want to disable 2FA?", "confirmDisableTwoFAMsg": "האם אתם בטוחים שאתם רוצים להשבית אימות 2FA (אימות כפול)?",
"Settings": "הגדרות", "Settings": "הגדרות",
"Dashboard": "פאנל ניהול", "Dashboard": "לוח בקרה",
"New Update": "עדכון חדש", "New Update": "עדכון חדש",
"Language": "שפה", "Language": "שפה",
"Appearance": "נראות", "Appearance": "תצוגה",
"Theme": "ערכת נושא", "Theme": "ערכת נושא",
"General": "כללי", "General": "כללי",
"Primary Base URL": "כתובת האתר הראשית של הבסיס", "Primary Base URL": "כתובת האתר הראשית",
"Version": "גרסה", "Version": "גרסה",
"Check Update On GitHub": "לבדוק עדכונים בגיטהאב", "Check Update On GitHub": "בדיקה לעדכונים מ-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.", "Cert Exp.": "תפוגת תעודה.",
"day": "יום | ימים", "day": "יום | ימים",
"-day": "-יום", "-day": "-יום",
"hour": "שעה", "hour": "שעה",
@ -82,49 +82,49 @@
"Ping": "פינג", "Ping": "פינג",
"Monitor Type": "סוג מוניטור", "Monitor Type": "סוג מוניטור",
"Keyword": "מילת מפתח", "Keyword": "מילת מפתח",
"Friendly Name": "שם ידידותי", "Friendly Name": "שם תצוגה",
"URL": "כתובת אתר", "URL": "כתובת אתר",
"Hostname": "שם המארח", "Hostname": "שם המארח",
"Port": "פורט", "Port": "פורט",
"Heartbeat Interval": "מרווח פעימות", "Heartbeat Interval": "מרווח פעימות (בין קריאה לקריאה)",
"Retries": "נסיונות חוזרים", "Retries": "נסיונות חוזרים",
"Heartbeat Retry Interval": "מרווח נסיונות חוזר של פעימות", "Heartbeat Retry Interval": "מרווח נסיונות חוזר של פעימות",
"Resend Notification if Down X times consecutively": "שלח שוב הודעה אם ירד X פעמים כתוצאה מכך", "Resend Notification if Down X times consecutively": "שליחת הודעה שוב אם לא פעיל X פעמים ברציפות",
"Advanced": "מתקדם", "Advanced": "מתקדם",
"Upside Down Mode": "מצב הפוך", "Upside Down Mode": "מצב הפוך",
"Max. Redirects": "מקסימום הפניות מחדש", "Max. Redirects": "מקסימום הפניות מחדש",
"Accepted Status Codes": "קודי סטטוס מקובלים", "Accepted Status Codes": "קודי סטטוס מאושרים",
"Push URL": "דחף כתובת URL", "Push URL": "כתובת URL ל-Push",
"needPushEvery": "עליך להתקשר לכתובת האתר הזו כל {0} שניות.", "needPushEvery": "יש לקרוא לכתובת הזו כל {0} שניות.",
"pushOptionalParams": "פרמטרים אופציונליים: {0}", "pushOptionalParams": "פרמטרים אופציונליים: {0}",
"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": "ערכת נושא - Heartbeat Bar", "Theme - Heartbeat Bar": "ערכת נושא - 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": "הפעלת התחברות",
"disableauth.message1": "האם אתה בטוח שברצונך <strong>להשבית את האבטחה</strong>?", "disableauth.message1": "האם אתם בטוחים שברצונכם<strong>להשבית את האבטחה</strong>?",
"disableauth.message2": "הוא מיועד לתרחישים <strong>שבהם אתה מתכוון ליישם אימות של צד שלישי</strong> מול Uptime Kuma כגון Cloudflare Access, Authelia או מנגנוני אימות אחרים.", "disableauth.message2": "אופציה זו מיועדת לתרחישים <strong>בהם בכוונתכם ליישם אימות של צד שלישי</strong> מול Uptime Kuma כגון Cloudflare Access, Authelia או מנגנוני אימות אחרים.",
"Please use this option carefully!": "אנא השתמש באפשרות זו בזהירות!", "Please use this option carefully!": "יש להשתמש באפשרות זו בזהירות!",
"Logout": "התנתקות", "Logout": "התנתקות",
"Leave": "יציאה", "Leave": "יציאה",
"I understand, please disable": "אני מבין, אני רוצה להשבית", "I understand, please disable": "מובן, אני רוצה להשבית",
"Confirm": "אישור", "Confirm": "אישור",
"Yes": "כן", "Yes": "כן",
"No": "לא", "No": "לא",
@ -234,7 +234,7 @@
"smtpBCC": "עותק מוסתר", "smtpBCC": "עותק מוסתר",
"discord": "דיסקורד", "discord": "דיסקורד",
"Discord Webhook URL": "כתובת אתר של Discord Webhook", "Discord Webhook URL": "כתובת אתר של Discord Webhook",
"wayToGetDiscordURL": "אתה יכול לקבל זאת על ידי מעבר להגדרות שרת -> אינטגרציות -> צור Webhook", "wayToGetDiscordURL": "אתה יכול לקבל זאת על ידי מעבר להגדרות שרת -> אינטגרציות -> יצירת Webhook",
"Bot Display Name": "שם תצוגה של בוט", "Bot Display Name": "שם תצוגה של בוט",
"Prefix Custom Message": "קידומת הודעה מותאמת אישית", "Prefix Custom Message": "קידומת הודעה מותאמת אישית",
"Hello @everyone is...": "שלום {'@'}כולם…", "Hello @everyone is...": "שלום {'@'}כולם…",
@ -286,10 +286,10 @@
"apiCredentials": "אישורי API", "apiCredentials": "אישורי API",
"octopushLegacyHint": "האם אתה משתמש בגרסה הישנה של Octopush (2011-2020) או בגרסה החדשה?", "octopushLegacyHint": "האם אתה משתמש בגרסה הישנה של Octopush (2011-2020) או בגרסה החדשה?",
"Check octopush prices": "בדוק מחירי תמנון {0}.", "Check octopush prices": "בדוק מחירי תמנון {0}.",
"octopushPhoneNumber": "מספר טלפון (פורמט אינטלי, למשל: +33612345678)", "octopushPhoneNumber": "מספר טלפון (בפורמט בינלאומי, למשל: +972501234567) ",
"octopushSMSSender": "שם שולח SMS: 3-11 תווים אלפאנומריים ורווח (a-zA-Z0-9)", "octopushSMSSender": "שם שולח SMS: 3-11 תווים אלפאנומריים ורווח (a-zA-Z0-9)",
"LunaSea Device ID": "מזהה מכשיר LunaSea", "LunaSea Device ID": "מזהה מכשיר LunaSea",
"Apprise URL": "Apprise URL", "Apprise URL": "כתובת URL ל-Apprize",
"Example:": "דוגמה: {0}", "Example:": "דוגמה: {0}",
"Read more:": "קרא עוד: {0}", "Read more:": "קרא עוד: {0}",
"Status:": "סטטוס: {0}", "Status:": "סטטוס: {0}",
@ -302,7 +302,7 @@
"lineDevConsoleTo": "קו מפתחי קונסולת - {0}", "lineDevConsoleTo": "קו מפתחי קונסולת - {0}",
"Basic Settings": "הגדרות בסיסיות", "Basic Settings": "הגדרות בסיסיות",
"User ID": "תעודת זהות של משתמש", "User ID": "תעודת זהות של משתמש",
"Messaging API": "Messaging API", "Messaging API": "API להודעות",
"wayToGetLineChannelToken": "תחילה גש ל-{0}, צור ספק וערוץ (Messaging API), לאחר מכן תוכל לקבל את אסימון הגישה לערוץ ומזהה המשתמש מפריטי התפריט שהוזכרו לעיל.", "wayToGetLineChannelToken": "תחילה גש ל-{0}, צור ספק וערוץ (Messaging API), לאחר מכן תוכל לקבל את אסימון הגישה לערוץ ומזהה המשתמש מפריטי התפריט שהוזכרו לעיל.",
"Icon URL": "כתובת אתר של סמל", "Icon URL": "כתובת אתר של סמל",
"aboutIconURL": "אתה יכול לספק קישור לתמונה ב\"כתובת URL של סמל\" כדי לעקוף את תמונת הפרופיל המוגדרת כברירת מחדל. לא ישמש אם Icon Emoji מוגדר.", "aboutIconURL": "אתה יכול לספק קישור לתמונה ב\"כתובת URL של סמל\" כדי לעקוף את תמונת הפרופיל המוגדרת כברירת מחדל. לא ישמש אם Icon Emoji מוגדר.",
@ -314,23 +314,23 @@
"promosmsTypeSpeed": "SMS SPEED - העדיפות הגבוהה ביותר במערכת. מאוד מהיר ואמין אבל יקר (בערך פי שניים ממחיר מלא של SMS).", "promosmsTypeSpeed": "SMS SPEED - העדיפות הגבוהה ביותר במערכת. מאוד מהיר ואמין אבל יקר (בערך פי שניים ממחיר מלא של SMS).",
"promosmsPhoneNumber": "מספר טלפון (לנמען פולני ניתן לדלג על אזורי חיוג)", "promosmsPhoneNumber": "מספר טלפון (לנמען פולני ניתן לדלג על אזורי חיוג)",
"promosmsSMSSender": "שם שולח SMS: שם רשום מראש או אחת מברירות המחדל: InfoSMS, SMS Info, MaxSMS, INFO, SMS", "promosmsSMSSender": "שם שולח SMS: שם רשום מראש או אחת מברירות המחדל: InfoSMS, SMS Info, MaxSMS, INFO, SMS",
"Feishu WebHookUrl": "Feishu WebHookURL", "Feishu WebHookUrl": "כתובת WebHook עבור Feishu",
"matrixHomeserverURL": "כתובת האתר של שרת הבית (עם http(s):// ויציאה אופציונלית)", "matrixHomeserverURL": "כתובת האתר של שרת הבית (עם http(s):// ויציאה אופציונלית)",
"Internal Room Id": "מזהה חדר פנימי", "Internal Room Id": "מזהה חדר פנימי",
"matrixDesc1": "אתה יכול למצוא את מזהה החדר הפנימי על ידי עיון בחלק המתקדם של לקוח Matrix שלך בהגדרות החדר. זה צריך להיראות כמו !QMdRCpUIfLwsfjxye6:home.server.", "matrixDesc1": "אתה יכול למצוא את מזהה החדר הפנימי על ידי עיון בחלק המתקדם של לקוח Matrix שלך בהגדרות החדר. זה צריך להיראות כמו !QMdRCpUIfLwsfjxye6:home.server.",
"matrixDesc2": "מומלץ מאוד ליצור משתמש חדש ולא להשתמש באסימון הגישה של משתמש מטריקס משלך שכן הוא יאפשר גישה מלאה לחשבון שלך ולכל החדרים שהצטרפת אליהם. במקום זאת, צור משתמש חדש והזמן אותו רק לחדר שבו תרצה לקבל את ההתראה. תוכל לקבל את אסימון הגישה על ידי הפעלת {0}", "matrixDesc2": "מומלץ מאוד ליצור משתמש חדש ולא להשתמש באסימון הגישה של משתמש מטריקס משלך שכן הוא יאפשר גישה מלאה לחשבון שלך ולכל החדרים שהצטרפת אליהם. במקום זאת, צור משתמש חדש והזמן אותו רק לחדר שבו תרצה לקבל את ההתראה. תוכל לקבל את אסימון הגישה על ידי הפעלת {0}",
"Method": "Method", "Method": "שיטה",
"Body": "Body", "Body": "תוכן (Body)",
"Headers": "Headers", "Headers": "האדרים (Headers)",
"PushUrl": "Push URL", "PushUrl": "Push URL",
"HeadersInvalidFormat": "כותרות הבקשה אינן JSON חוקיות:", "HeadersInvalidFormat": "ההאדרים בבקשה אינם בתחביר JSON תקני: ",
"BodyInvalidFormat": "גוף הבקשה אינו JSON חוקי:", "BodyInvalidFormat": "גוף הבקשה (Body) אינו JSON תקני: ",
"Monitor History": "מעקב אחר היסטוריה", "Monitor History": "מעקב אחר היסטוריה",
"clearDataOlderThan": "שמור את נתוני היסטוריית הצג למשך {0} ימים.", "clearDataOlderThan": "שמור את נתוני היסטוריית הצג למשך {0} ימים.",
"PasswordsDoNotMatch": "סיסמאות לא תואמות.", "PasswordsDoNotMatch": "סיסמאות לא תואמות.",
"records": "רשומות", "records": "רשומות",
"One record": "שיא אחד", "One record": "שיא אחד",
"steamApiKeyDescription": "לניטור שרת משחקי Steam אתה צריך מפתח Steam Web-API. אתה יכול לרשום את מפתח ה-API שלך כאן:", "steamApiKeyDescription": "לניטור שרת משחקי Steam יש צורך במפתח Steam Web-API. ניתן לרשום ולקבל את מפתח ה-API כאן: ",
"Current User": "משתמש נוכחי", "Current User": "משתמש נוכחי",
"topic": "נושא", "topic": "נושא",
"topicExplanation": "נושא MQTT למעקב", "topicExplanation": "נושא MQTT למעקב",
@ -365,7 +365,7 @@
"Unpin": "ענן חוף", "Unpin": "ענן חוף",
"Switch to Light Theme": "לעבור לנושא האור", "Switch to Light Theme": "לעבור לנושא האור",
"Switch to Dark Theme": "לעבור לנושא אפל", "Switch to Dark Theme": "לעבור לנושא אפל",
"Show Tags": "Show Tags", "Show Tags": "הצגת תגיות",
"Hide Tags": "הסתר תגיות", "Hide Tags": "הסתר תגיות",
"Description": "תיאור", "Description": "תיאור",
"No monitors available.": "אין צגים זמינים.", "No monitors available.": "אין צגים זמינים.",
@ -378,7 +378,7 @@
"Powered by": "פועל על", "Powered by": "פועל על",
"shrinkDatabaseDescription": "ואקום מסד נתונים להפעיל עבור SQLITE.אם בסיס הנתונים שלך נוצר לאחר 1.10.0, Auto_VACUUM כבר מופעל ואין צורך בפעולה זו.", "shrinkDatabaseDescription": "ואקום מסד נתונים להפעיל עבור SQLITE.אם בסיס הנתונים שלך נוצר לאחר 1.10.0, Auto_VACUUM כבר מופעל ואין צורך בפעולה זו.",
"serwersms": "SerwerSMS.pl", "serwersms": "SerwerSMS.pl",
"serwersmsAPIUser": "API Username (incl. webapi_ prefix)", "serwersmsAPIUser": "שם משתמש ל-API (כולל webapi_prefix)",
"serwersmsAPIPassword": "סיסמת API", "serwersmsAPIPassword": "סיסמת API",
"serwersmsPhoneNumber": "מספר טלפון", "serwersmsPhoneNumber": "מספר טלפון",
"serwersmsSenderName": "שם שולח SMS (רשום באמצעות פורטל לקוחות)", "serwersmsSenderName": "שם שולח SMS (רשום באמצעות פורטל לקוחות)",
@ -420,12 +420,12 @@
"alertaAlertState": "מצב התראה", "alertaAlertState": "מצב התראה",
"alertaRecoverState": "לשחזר מדינה", "alertaRecoverState": "לשחזר מדינה",
"deleteStatusPageMsg": "האם אתה בטוח רוצה למחוק את דף הסטטוס הזה?", "deleteStatusPageMsg": "האם אתה בטוח רוצה למחוק את דף הסטטוס הזה?",
"Proxies": "Proxies", "Proxies": "מתווכים",
"default": "בְּרִירַת מֶחדָל", "default": "בְּרִירַת מֶחדָל",
"enabled": "מופעל", "enabled": "מופעל",
"setAsDefault": "נקבע כברירת מחדל", "setAsDefault": "נקבע כברירת מחדל",
"deleteProxyMsg": "האם אתה בטוח רוצה למחוק את הפרוקסי הזה לכל המסכים?", "deleteProxyMsg": "האם אתה בטוח רוצה למחוק את הפרוקסי הזה לכל המסכים?",
"proxyDescription": "Proxies must be assigned to a monitor to function.", "proxyDescription": "מתווכים חייבים להיות משויכים למוניטור בשביל שיעבדו.",
"enableProxyDescription": "פרוקסי זה לא ישפיע על בקשות צג עד שהוא יופעל.אתה יכול לשלוט באופן זמני להשבית את ה- Proxy מכל המסכים לפי מצב ההפעלה.", "enableProxyDescription": "פרוקסי זה לא ישפיע על בקשות צג עד שהוא יופעל.אתה יכול לשלוט באופן זמני להשבית את ה- Proxy מכל המסכים לפי מצב ההפעלה.",
"setAsDefaultProxyDescription": "פרוקסי זה יופעל כברירת מחדל עבור צגים חדשים.אתה עדיין יכול להשבית את ה- Proxy בנפרד עבור כל צג.", "setAsDefaultProxyDescription": "פרוקסי זה יופעל כברירת מחדל עבור צגים חדשים.אתה עדיין יכול להשבית את ה- Proxy בנפרד עבור כל צג.",
"Certificate Chain": "שרשרת אישורים", "Certificate Chain": "שרשרת אישורים",
@ -434,13 +434,13 @@
"AccessKeyId": "מזהה AccessKey", "AccessKeyId": "מזהה AccessKey",
"SecretAccessKey": "גישהלמפתחסוד", "SecretAccessKey": "גישהלמפתחסוד",
"PhoneNumbers": "מספר טלפוןs", "PhoneNumbers": "מספר טלפוןs",
"TemplateCode": "TemplateCode", "TemplateCode": "מזהה TemplateCode",
"SignName": "שם שם", "SignName": "מזהה SignName",
"Sms template must contain parameters: ": "תבנית SMS חייבת להכיל פרמטרים: ", "Sms template must contain parameters: ": "תבנית SMS חייבת להכיל פרמטרים: ",
"Bark Endpoint": "Bark Endpoint", "Bark Endpoint": "כתובת יעד של Bark",
"Bark Group": "Bark Group", "Bark Group": "קבוצת Bark",
"Bark Sound": "Bark Sound", "Bark Sound": "צליל Bark",
"WebHookUrl": "WebHookUrl", "WebHookUrl": "כתובת ל-WebHookUrl",
"SecretKey": "מפתח סודי", "SecretKey": "מפתח סודי",
"For safety, must use secret key": "לבטיחות, חייב להשתמש במפתח סודיy", "For safety, must use secret key": "לבטיחות, חייב להשתמש במפתח סודיy",
"Device Token": "אסימון מכשיר", "Device Token": "אסימון מכשיר",
@ -451,7 +451,7 @@
"High": "High", "High": "High",
"Retry": "נסה שוב", "Retry": "נסה שוב",
"Topic": "נוֹשֵׂא", "Topic": "נוֹשֵׂא",
"WeCom Bot Key": "WeCom Bot Key", "WeCom Bot Key": "מפתח בוט ל-WeCom",
"Setup Proxy": "הגדרת פרוקסי", "Setup Proxy": "הגדרת פרוקסי",
"Proxy Protocol": "פרוטוקול פרוקסי", "Proxy Protocol": "פרוטוקול פרוקסי",
"Proxy Server": "שרת פרוקסי", "Proxy Server": "שרת פרוקסי",
@ -505,19 +505,19 @@
"onebotGroupMessage": "קְבוּצָה", "onebotGroupMessage": "קְבוּצָה",
"onebotPrivateMessage": "פְּרָטִי", "onebotPrivateMessage": "פְּרָטִי",
"onebotUserOrGroupId": "מזהה קבוצה/משתמש", "onebotUserOrGroupId": "מזהה קבוצה/משתמש",
"onebotSafetyTips": "לבטיחות, חייב לקבוע אסימון גישה ", "onebotSafetyTips": "לבטיחות, חובה לקבוע טוקן גישה",
"PushDeer Key": "PushDeer Key", "PushDeer Key": "מפתח PushDeer",
"Footer Text": "טקסט כותרת תחתונה ", "Footer Text": "טקסט לתחתית האתר (פוטר)",
"Show Powered By": "הצג מופעל על ידי ", "Show Powered By": "הצגת \"מופעל ע\"י\"",
"Domain Names": "שמות דומיין", "Domain Names": "שמות דומיין",
"signedInDisp": "חתום כ- {0}", "signedInDisp": "חתום כ- {0}",
"signedInDispDisabled": "Auth מושבת.", "signedInDispDisabled": "Auth מושבת.",
"RadiusSecret": "רדיוס סוד", "RadiusSecret": "רדיוס סוד",
"RadiusSecretDescription": "סוד משותף בין לקוח לשרת", "RadiusSecretDescription": "סוד משותף בין לקוח לשרת",
"RadiusCalledStationId": "נקרא מזהה תחנה", "RadiusCalledStationId": "נקרא מזהה תחנה",
"RadiusCalledStationIdDescription": "מזהה של המכשיר הנקרא ", "RadiusCalledStationIdDescription": "מזהה המכשיר שנקרא",
"RadiusCallingStationId": "מזהה תחנת שיחה ", "RadiusCallingStationId": "מזהה תחנת הקריאה",
"RadiusCallingStationIdDescription": "מזהה של מכשיר השיחה ", "RadiusCallingStationIdDescription": "מזהה של מכשיר הנקרא",
"Certificate Expiry Notification": "הודעת תפוגה של אישור", "Certificate Expiry Notification": "הודעת תפוגה של אישור",
"API Username": "שם משתמש API", "API Username": "שם משתמש API",
"API Key": "מפתח API", "API Key": "מפתח API",
@ -525,7 +525,7 @@
"From Name/Number": "משם/מספר", "From Name/Number": "משם/מספר",
"Leave blank to use a shared sender number.": "השאר ריק כדי להשתמש במספר שולח משותף.", "Leave blank to use a shared sender number.": "השאר ריק כדי להשתמש במספר שולח משותף.",
"Octopush API Version": "גרסת API של תמנון", "Octopush API Version": "גרסת API של תמנון",
"Legacy Octopush-DM": "Legacy Octopush-DM", "Legacy Octopush-DM": "שיטת DM (מיושנת)",
"endpoint": "נקודת קצה", "endpoint": "נקודת קצה",
"octopushAPIKey": "\"מפתח API \" מתוך תעודות API של HTTP בלוח הבקרה", "octopushAPIKey": "\"מפתח API \" מתוך תעודות API של HTTP בלוח הבקרה",
"octopushLogin": "\"כניסה \" מתעודות API של HTTP בלוח הבקרה", "octopushLogin": "\"כניסה \" מתעודות API של HTTP בלוח הבקרה",
@ -540,7 +540,7 @@
"pushoversounds falling": "נופל", "pushoversounds falling": "נופל",
"pushoversounds gamelan": "gamelan", "pushoversounds gamelan": "gamelan",
"pushoversounds incoming": "נִכנָס", "pushoversounds incoming": "נִכנָס",
"pushoversounds intermission": "Intermission", "pushoversounds intermission": "הפוגה",
"pushoversounds magic": "קֶסֶם", "pushoversounds magic": "קֶסֶם",
"pushoversounds mechanical": "מֵכָנִי", "pushoversounds mechanical": "מֵכָנִי",
"pushoversounds pianobar": "בר פסנתר", "pushoversounds pianobar": "בר פסנתר",
@ -575,7 +575,7 @@
"certificationExpiryDescription": "HTTPS עוקב אחר התראה על התראה כאשר תעודת TLS פגה ב:", "certificationExpiryDescription": "HTTPS עוקב אחר התראה על התראה כאשר תעודת TLS פגה ב:",
"Setup Docker Host": "הגדרת מארח Docker", "Setup Docker Host": "הגדרת מארח Docker",
"Connection Type": "סוג חיבור", "Connection Type": "סוג חיבור",
"Docker Daemon": "Docker Daemon", "Docker Daemon": "שירות Docker",
"deleteDockerHostMsg": "האם אתה בטוח רוצה למחוק את המארח של Docker לכל המוניטורים?", "deleteDockerHostMsg": "האם אתה בטוח רוצה למחוק את המארח של Docker לכל המוניטורים?",
"socket": "Socket", "socket": "Socket",
"tcp": "TCP / HTTP", "tcp": "TCP / HTTP",
@ -583,7 +583,7 @@
"Container Name / ID": "שם מכולה / מזהה", "Container Name / ID": "שם מכולה / מזהה",
"Docker Host": "מארח דוקר", "Docker Host": "מארח דוקר",
"Docker Hosts": "מארחי Docker", "Docker Hosts": "מארחי Docker",
"ntfy Topic": "ntfy Topic", "ntfy Topic": "נושא ntfy",
"Domain": "תְחוּם", "Domain": "תְחוּם",
"Workstation": "עמדת עבודה", "Workstation": "עמדת עבודה",
"disableCloudflaredNoAuthMsg": "אתה לא נמצא במצב AUTH, אין צורך בסיסמה.", "disableCloudflaredNoAuthMsg": "אתה לא נמצא במצב AUTH, אין צורך בסיסמה.",
@ -594,7 +594,7 @@
"Long-Lived Access Token": "אסימון גישה ארוכת שנים", "Long-Lived Access Token": "אסימון גישה ארוכת שנים",
"Long-Lived Access Token can be created by clicking on your profile name (bottom left) and scrolling to the bottom then click Create Token. ": "ניתן ליצור אסימון גישה לאורך זמן על ידי לחיצה על שם הפרופיל שלך (שמאל למטה) וגלילה לתחתית ואז לחץ על צור אסימון. ", "Long-Lived Access Token can be created by clicking on your profile name (bottom left) and scrolling to the bottom then click Create Token. ": "ניתן ליצור אסימון גישה לאורך זמן על ידי לחיצה על שם הפרופיל שלך (שמאל למטה) וגלילה לתחתית ואז לחץ על צור אסימון. ",
"Notification Service": "Notification Service", "Notification Service": "Notification Service",
"default: notify all devices": "default: notify all devices", "default: notify all devices": "ברירת מחדל: התראה לכלל המכשירים",
"A list of Notification Services can be found in Home Assistant under \"Developer Tools > Services\" search for \"notification\" to find your device/phone name.": "רשימה של שירותי הודעה ניתן למצוא בעוזר הבית תחת \"כלי מפתחים> שירותים \" חפש \"הודעה \" כדי למצוא את שם המכשיר/טלפון שלך.", "A list of Notification Services can be found in Home Assistant under \"Developer Tools > Services\" search for \"notification\" to find your device/phone name.": "רשימה של שירותי הודעה ניתן למצוא בעוזר הבית תחת \"כלי מפתחים> שירותים \" חפש \"הודעה \" כדי למצוא את שם המכשיר/טלפון שלך.",
"Automations can optionally be triggered in Home Assistant:": "אוטומציות יכולות להיות מופעלות באופן אופציונלי לעוזר הבית:", "Automations can optionally be triggered in Home Assistant:": "אוטומציות יכולות להיות מופעלות באופן אופציונלי לעוזר הבית:",
"Trigger type:": "סוג ההדק:", "Trigger type:": "סוג ההדק:",
@ -603,7 +603,7 @@
"Then choose an action, for example switch the scene to where an RGB light is red.": "ואז בחר פעולה, למשל העבר את הסצינה למקום בו אור RGB הוא אדום.", "Then choose an action, for example switch the scene to where an RGB light is red.": "ואז בחר פעולה, למשל העבר את הסצינה למקום בו אור RGB הוא אדום.",
"Frontend Version": "גרסת Frontend", "Frontend Version": "גרסת Frontend",
"Frontend Version do not match backend version!": "גרסת Frontend לא תואמת את גרסת Backend!", "Frontend Version do not match backend version!": "גרסת Frontend לא תואמת את גרסת Backend!",
"Base URL": "Base URL", "Base URL": "כתובת בסיס",
"goAlertInfo": "SAETRERT הוא יישום קוד פתוח לתזמון שיחה, הסלמות והודעות אוטומטיות (כמו SMS או שיחות קוליות).לעסוק אוטומטית את האדם הנכון, בדרך הנכונה ובזמן הנכון!{0}", "goAlertInfo": "SAETRERT הוא יישום קוד פתוח לתזמון שיחה, הסלמות והודעות אוטומטיות (כמו SMS או שיחות קוליות).לעסוק אוטומטית את האדם הנכון, בדרך הנכונה ובזמן הנכון!{0}",
"goAlertIntegrationKeyInfo": "קבל מפתח אינטגרציה של API גנרי לשירות בפורמט זה \"AAAAAAAA-BBB-CCCC-DDDD-EEEEEEEEEEE \" בדרך כלל הערך של פרמטר האסימון של URL שהועתק.", "goAlertIntegrationKeyInfo": "קבל מפתח אינטגרציה של API גנרי לשירות בפורמט זה \"AAAAAAAA-BBB-CCCC-DDDD-EEEEEEEEEEE \" בדרך כלל הערך של פרמטר האסימון של URL שהועתק.",
"goAlert": "GoAlert", "goAlert": "GoAlert",
@ -611,7 +611,7 @@
"backupRecommend": "אנא גבה את עוצמת הקול או את תיקיית הנתונים (./data/) ישירות במקום.", "backupRecommend": "אנא גבה את עוצמת הקול או את תיקיית הנתונים (./data/) ישירות במקום.",
"Optional": "אופציונאלי", "Optional": "אופציונאלי",
"squadcast": "Squadcast", "squadcast": "Squadcast",
"SendKey": "SendKey", "SendKey": "מזהה SendKey",
"SMSManager API Docs": "מסמכי API של SmsManager ", "SMSManager API Docs": "מסמכי API של SmsManager ",
"Gateway Type": "סוג שער", "Gateway Type": "סוג שער",
"SMSManager": "SMSManager", "SMSManager": "SMSManager",
@ -630,7 +630,7 @@
"weekdayShortSun": "ראשון", "weekdayShortSun": "ראשון",
"dayOfWeek": "יום בשבוע", "dayOfWeek": "יום בשבוע",
"dayOfMonth": "יום בחודש", "dayOfMonth": "יום בחודש",
"lastDay": "Last Day", "lastDay": "יום אחרון",
"lastDay1": "היום האחרון של החודש", "lastDay1": "היום האחרון של החודש",
"lastDay2": "יום שני האחרון של החודש", "lastDay2": "יום שני האחרון של החודש",
"lastDay3": "יום 3 האחרון של החודש", "lastDay3": "יום 3 האחרון של החודש",
@ -666,8 +666,8 @@
"Economy": "חיסכון", "Economy": "חיסכון",
"Lowcost": "זול", "Lowcost": "זול",
"high": "גבוהה", "high": "גבוהה",
"General Monitor Type": "מוניטור כללי", "General Monitor Type": "סוג מוניטור כללי",
"Passive Monitor Type": "מוניטור פסיבי", "Passive Monitor Type": "סוג מוניטור פסיבי",
"Specific Monitor Type": "סוג מוניטור ספציפי", "Specific Monitor Type": "סוג מוניטור ספציפי",
"Custom Monitor Type": "סוג צג מותאם אישית", "Custom Monitor Type": "סוג צג מותאם אישית",
"Monitor": "מוניטור | מוניטרים", "Monitor": "מוניטור | מוניטרים",
@ -682,7 +682,7 @@
"Help": "עזרה", "Help": "עזרה",
"Game": "משחק", "Game": "משחק",
"Packet Size": "גודל חבילה", "Packet Size": "גודל חבילה",
"markdownSupported": "תחביר סימון נתמך (Markdown )", "markdownSupported": "תחביר Markdown נתמך",
"Custom": "מותאם אישית", "Custom": "מותאם אישית",
"ZohoCliq": "זוהו קליק", "ZohoCliq": "זוהו קליק",
"wayToGetZohoCliqURL": "אתה יכול ללמוד כיצד ליצור כתובת אתר ל-webhook {0}.", "wayToGetZohoCliqURL": "אתה יכול ללמוד כיצד ליצור כתובת אתר ל-webhook {0}.",
@ -692,5 +692,37 @@
"Kook": "קוק", "Kook": "קוק",
"wayToGetKookBotToken": "צור יישום וקבל את אסימון הבוט שלך ב-{0}", "wayToGetKookBotToken": "צור יישום וקבל את אסימון הבוט שלך ב-{0}",
"wayToGetKookGuildID": "הפעל את 'מצב מפתח' בהגדרת קוק, ולחץ לחיצה ימנית על הגילדה כדי לקבל את המזהה שלה", "wayToGetKookGuildID": "הפעל את 'מצב מפתח' בהגדרת קוק, ולחץ לחיצה ימנית על הגילדה כדי לקבל את המזהה שלה",
"Guild ID": "מזהה גילד" "Guild ID": "מזהה גילד",
"Body Encoding": "קידוד Body",
"API Keys": "מפתחות API",
"Expiry": "תפוגה",
"Don't expire": "תוקף שלא פג",
"Continue": "להמשיך",
"Add Another": "להוסיף עוד",
"Key Added": "המפתח נוסף",
"Add API Key": "הוספת מפתח API",
"No API Keys": "אין מפתחות API",
"apiKey-active": "פעיל",
"apiKey-expired": "פג תוקף",
"apiKey-inactive": "לא פעיל",
"Expires": "תוקף",
"deleteAPIKeyMsg": "האם אתם בטוחים שאתם רוצים למחוק מפתח API זה?",
"Generate": "ייצור",
"telegramMessageThreadID": "מזהה ID לאשכול (אופציונאלי)",
"telegramMessageThreadIDDescription": "מזהה ייחודי אופציונאלי להזנת ההודעה לאשכול (הנושא) המתאים. נועד לסופר-קבוצות בלבד",
"telegramProtectContentDescription": "אם מופעל , הודעות הבוט ב-Telegram יהיו מוגנים מהעברה ושמירה שלהם.",
"Clone Monitor": "שכפול של Monitor",
"Expiry date": "תאריך תפוגה",
"apiKeyAddedMsg": "מפתח ה-API שלך נוסף. בבקשה רשמו אותו עבורכם כיוון שהוא לא יופיע שנית.",
"disableAPIKeyMsg": "האם אתם בטוחים שאתם רוצים להשבית מפתח API זה?",
"Clone": "שכפול",
"cloneOf": "שכפול של {0}",
"Google Analytics ID": "מזהה ID של Google Analytics",
"telegramProtectContent": "הגנת העברה \\ שמירה",
"notificationRegional": "לפי איזור",
"Server Address": "כתובת השרת",
"Edit Tag": "עריכת תגית",
"Learn More": "לקריאה נוספת",
"telegramSendSilently": "שליחה שקטה",
"telegramSendSilentlyDescription": "שליחת הודעות שקטה. משתמשים יקבלו ההתראה ללא צליל."
} }

@ -1,7 +1,7 @@
{ {
"languageName": "Magyar", "languageName": "Magyar",
"checkEverySecond": "Ellenőrzés {0} másodpercenként", "checkEverySecond": "Ellenőrzés {0} másodpercenként",
"retryCheckEverySecond": "Újrapróbál {0} másodpercenként.", "retryCheckEverySecond": "Újrapróbálkozás minden {0} másodpercenként",
"retriesDescription": "Maximális próbálkozás mielőtt a szolgáltatás 'Leállt' jelölést kap és értesítés kerül kiküldésre", "retriesDescription": "Maximális próbálkozás mielőtt a szolgáltatás 'Leállt' jelölést kap és értesítés kerül kiküldésre",
"ignoreTLSError": "TLS/SSL hibák figyelmen kívül hagyása HTTPS weboldalaknál", "ignoreTLSError": "TLS/SSL hibák figyelmen kívül hagyása HTTPS weboldalaknál",
"upsideDownModeDescription": "Az állapot megfordítása. Ha a szolgáltatás elérhető, akkor lesz leállt állapotú.", "upsideDownModeDescription": "Az állapot megfordítása. Ha a szolgáltatás elérhető, akkor lesz leállt állapotú.",
@ -22,7 +22,7 @@
"confirmClearStatisticsMsg": "Biztos, hogy törölni akar MINDEN statisztikát?", "confirmClearStatisticsMsg": "Biztos, hogy törölni akar MINDEN statisztikát?",
"importHandleDescription": "Válassza a 'Meglévő kihagyását', ha ki szeretné hagyni az azonos nevő figyelőket vagy értesítésket. A 'Felülírás' törölni fog minden meglévő figyelőt és értesítést.", "importHandleDescription": "Válassza a 'Meglévő kihagyását', ha ki szeretné hagyni az azonos nevő figyelőket vagy értesítésket. A 'Felülírás' törölni fog minden meglévő figyelőt és értesítést.",
"confirmImportMsg": "Biztos, hogy importálja a mentést? Győződjön meg róla, hogy jól választotta ki az importálás opciót.", "confirmImportMsg": "Biztos, hogy importálja a mentést? Győződjön meg róla, hogy jól választotta ki az importálás opciót.",
"twoFAVerifyLabel": "Kérem, adja meg a token-t, hogy a 2FA működését ellenőrizzük", "twoFAVerifyLabel": "Kérem add meg a token-t a 2FA ellenőrzéséhez:",
"tokenValidSettingsMsg": "A token érvényes! El tudja menteni a 2FA beállításait.", "tokenValidSettingsMsg": "A token érvényes! El tudja menteni a 2FA beállításait.",
"confirmEnableTwoFAMsg": "Biztosan engedélyezi a 2FA-t?", "confirmEnableTwoFAMsg": "Biztosan engedélyezi a 2FA-t?",
"confirmDisableTwoFAMsg": "Biztosan letiltja a 2FA-t?", "confirmDisableTwoFAMsg": "Biztosan letiltja a 2FA-t?",
@ -54,7 +54,7 @@
"Delete": "Törlés", "Delete": "Törlés",
"Current": "Aktuális", "Current": "Aktuális",
"Uptime": "Uptime", "Uptime": "Uptime",
"Cert Exp.": "SSL lejárat", "Cert Exp.": "Tanúsítvány Lejárata",
"day": "nap", "day": "nap",
"-day": "-nap", "-day": "-nap",
"hour": "óra", "hour": "óra",
@ -135,7 +135,7 @@
"Auto Get": "Auto lekérd.", "Auto Get": "Auto lekérd.",
"backupDescription": "Mentheti az összes figyelőt és értesítést egy JSON fájlba.", "backupDescription": "Mentheti az összes figyelőt és értesítést egy JSON fájlba.",
"backupDescription2": "Megj: Történeti és esemény adatokat nem tartalmaz.", "backupDescription2": "Megj: Történeti és esemény adatokat nem tartalmaz.",
"backupDescription3": "Érzékeny adatok, pl. szolgáltatás kulcsok is vannak az export fájlban. Figyeljen erre!", "backupDescription3": "Érzékeny adatok, pl. értesítés tokenek is vannak az export fájlban. Figyeljen erre!",
"alertNoFile": "Válaszzon ki egy fájlt az importáláshoz.", "alertNoFile": "Válaszzon ki egy fájlt az importáláshoz.",
"alertWrongFileType": "Válasszon egy JSON fájlt.", "alertWrongFileType": "Válasszon egy JSON fájlt.",
"Clear all statistics": "Összes statisztika törlése", "Clear all statistics": "Összes statisztika törlése",
@ -154,7 +154,7 @@
"Token": "Token", "Token": "Token",
"Show URI": "URI megmutatása", "Show URI": "URI megmutatása",
"Tags": "Címkék", "Tags": "Címkék",
"Add New below or Select...": "Adjon hozzá lentre vagy válasszon...", "Add New below or Select...": "Új hozzáadása alább vagy Válasszon…",
"Tag with this name already exist.": "Ilyen nevű címke már létezik.", "Tag with this name already exist.": "Ilyen nevű címke már létezik.",
"Tag with this value already exist.": "Ilyen értékű címke már létezik.", "Tag with this value already exist.": "Ilyen értékű címke már létezik.",
"color": "szín", "color": "szín",
@ -167,7 +167,7 @@
"Indigo": "Indigó", "Indigo": "Indigó",
"Purple": "Lila", "Purple": "Lila",
"Pink": "Rózsaszín", "Pink": "Rózsaszín",
"Search...": "Keres...", "Search...": "Keresés…",
"Avg. Ping": "Átl. ping", "Avg. Ping": "Átl. ping",
"Avg. Response": "Átl. válasz", "Avg. Response": "Átl. válasz",
"Entry Page": "Nyitólap", "Entry Page": "Nyitólap",
@ -188,7 +188,7 @@
"signal": "Signal", "signal": "Signal",
"gotify": "Gotify", "gotify": "Gotify",
"slack": "Slack", "slack": "Slack",
"rocket.chat": "Rocket.chat", "rocket.chat": "Rocket.Chat",
"pushover": "Pushover", "pushover": "Pushover",
"pushy": "Pushy", "pushy": "Pushy",
"octopush": "Octopush", "octopush": "Octopush",
@ -197,7 +197,7 @@
"apprise": "Apprise (50+ értesítési szolgáltatás)", "apprise": "Apprise (50+ értesítési szolgáltatás)",
"pushbullet": "Pushbullet", "pushbullet": "Pushbullet",
"line": "Line Messenger", "line": "Line Messenger",
"mattermost": "A legfontosabb", "mattermost": "Mattermost",
"Status Page": "Státusz oldal", "Status Page": "Státusz oldal",
"Status Pages": "Státusz oldalak", "Status Pages": "Státusz oldalak",
"Primary Base URL": "Elsődleges URL", "Primary Base URL": "Elsődleges URL",
@ -211,7 +211,7 @@
"wayToGetTelegramToken": "Innen kaphat token-t: {0}.", "wayToGetTelegramToken": "Innen kaphat token-t: {0}.",
"Chat ID": "Csevegés ID", "Chat ID": "Csevegés ID",
"supportTelegramChatID": "Támogatja a közvetlen csevegést, csoportnak küldést és csatona ID-t is", "supportTelegramChatID": "Támogatja a közvetlen csevegést, csoportnak küldést és csatona ID-t is",
"wayToGetTelegramChatID": "A csevegés ID-t kinyerheti azzal, hogy küld egy üzenetet a bot-nak és erre az URL-re ellátogat, ahol láthatja a chat_id:-t", "wayToGetTelegramChatID": "A csevegés ID-t szerezhet ha küld egy üzenetet a bot-nak és ellátogat erre az URL-re, ahol láthatja a chat_id-t:",
"YOUR BOT TOKEN HERE": "AZ ÖN BOT TOKENJE ITT", "YOUR BOT TOKEN HERE": "AZ ÖN BOT TOKENJE ITT",
"chatIDNotFound": "Csevegés ID nem található, küldjön egy első üzenetet a bot-nak", "chatIDNotFound": "Csevegés ID nem található, küldjön egy első üzenetet a bot-nak",
"Post URL": "Cél URL (Post)", "Post URL": "Cél URL (Post)",
@ -227,17 +227,17 @@
"smtpCC": "Másolat", "smtpCC": "Másolat",
"smtpBCC": "Titkos másolat", "smtpBCC": "Titkos másolat",
"Discord Webhook URL": "Discord cím (webhook URL)", "Discord Webhook URL": "Discord cím (webhook URL)",
"wayToGetDiscordURL": "Kaphat egy ilyet, ha ellátogat a Server Settings -> Integrations -> Create Webhook oldalra", "wayToGetDiscordURL": "Ezt itt szerezhetsz: Server Settings -> Integrations -> View Webhooks -> New Webhook",
"Bot Display Name": "Bot megjelenő neve", "Bot Display Name": "Bot megjelenő neve",
"Prefix Custom Message": "Egyedi előtét üzenet", "Prefix Custom Message": "Egyedi előtét üzenet",
"Hello @everyone is...": "Hello {'@'}mindenki...", "Hello @everyone is...": "Hello {'@'}everyone …",
"Webhook URL": "Cím (webhook URL)", "Webhook URL": "Cím (webhook URL)",
"wayToGetTeamsURL": "Itt megnézheti, hogy kell ilyen URL-t készíteni: {0}.", "wayToGetTeamsURL": "Itt megnézheti, hogy kell ilyen URL-t készíteni: {0}.",
"Number": "Szám", "Number": "Szám",
"Recipients": "Címzettek", "Recipients": "Címzettek",
"needSignalAPI": "Egy Signal kliensre van szüksége, amihez REST API tartozik.", "needSignalAPI": "Egy Signal kliensre van szüksége, amihez REST API tartozik.",
"wayToCheckSignalURL": "Itt megnézheti, hogy hozhat létre egyet:", "wayToCheckSignalURL": "Itt megnézheti, hogy hozhat létre egyet:",
"signalImportant": "FONTOS! Nem keverheti a csoportokat és számokat a címzetteknél.", "signalImportant": "FONTOS! Nem keverheti a csoportokat és számokat a címzetteknél!",
"Application Token": "Alkalmazás token", "Application Token": "Alkalmazás token",
"Server URL": "Szerver URL", "Server URL": "Szerver URL",
"Priority": "Prioritás", "Priority": "Prioritás",
@ -249,20 +249,20 @@
"aboutKumaURL": "Ha üresen hagyja a Uptime Kuma cím mezőt, akkor a projekt GitHub oldala lesz az alapértelmezett.", "aboutKumaURL": "Ha üresen hagyja a Uptime Kuma cím mezőt, akkor a projekt GitHub oldala lesz az alapértelmezett.",
"emojiCheatSheet": "Emoji csalás: {0}", "emojiCheatSheet": "Emoji csalás: {0}",
"clicksendsms": "ClickSend SMS", "clicksendsms": "ClickSend SMS",
"User Key": "Felhasználói kulcs", "User Key": "Felhasználói Kulcs",
"Device": "Eszköz", "Device": "Eszköz",
"Message Title": "Üzenet címe", "Message Title": "Üzenet Címe",
"Notification Sound": "Értesítési hang", "Notification Sound": "Értesítési Hang",
"More info on:": "További információ: {0}", "More info on:": "További információ: {0}",
"pushoverDesc1": "A vészhelyzeti prioritásnak (2) 30 másodperc az újrapróbálkozási alapértéke és egy óra után lejár.", "pushoverDesc1": "A vészhelyzeti prioritásnak (2) 30 másodperc az újrapróbálkozási alapértéke és egy óra után lejár.",
"pushoverDesc2": "Ha különböző eszközökre szeretne értesítést küldeni, töltse ki az Eszköz mezőt.", "pushoverDesc2": "Ha különböző eszközökre szeretne értesítést küldeni, töltse ki az Eszköz mezőt.",
"SMS Type": "SMS típusa", "SMS Type": "SMS típusa",
"octopushTypePremium": "Premium (Fast - recommended for alerting)", "octopushTypePremium": "Premium (Fast - recommended for alerting)",
"octopushTypeLowCost": "Low Cost (Slow - sometimes blocked by operator)", "octopushTypeLowCost": "Low Cost (Slow - sometimes blocked by operator)",
"checkPrice": "Nézze meg az {0} féle árat:", "checkPrice": "Ellenőrizze {0} árat:",
"apiCredentials": "API kulcsok", "apiCredentials": "API kulcsok",
"octopushLegacyHint": "Az Octopush régi (2011-2020) verzióját használja vagy az újat?", "octopushLegacyHint": "Az Octopush régi (2011-2020) verzióját használod vagy az újat?",
"Check octopush prices": "Nézze meg az Octopush {0} féle árát.", "Check octopush prices": "Csekkold az octopush {0} árakat.",
"octopushPhoneNumber": "Telefonszám (nemz. formátum, pl : +36705554433) ", "octopushPhoneNumber": "Telefonszám (nemz. formátum, pl : +36705554433) ",
"octopushSMSSender": "SMS küldő neve : 3-11 betű/szám (a-zA-Z0-9) vagy szóköz", "octopushSMSSender": "SMS küldő neve : 3-11 betű/szám (a-zA-Z0-9) vagy szóköz",
"LunaSea Device ID": "LunaSea eszköz ID", "LunaSea Device ID": "LunaSea eszköz ID",
@ -315,24 +315,24 @@
"Security": "Biztonság", "Security": "Biztonság",
"Steam API Key": "Steam API kulcs", "Steam API Key": "Steam API kulcs",
"Shrink Database": "Adatbázis tömörítése", "Shrink Database": "Adatbázis tömörítése",
"Pick a RR-Type...": "Válasszon egy RR-típust…", "Pick a RR-Type...": "Válassz egy RR-típust…",
"Pick Accepted Status Codes...": "Válasszon olyan kódot, ami elfogadottnak számít…", "Pick Accepted Status Codes...": "Válassz Elfogadható Állapot Kódokat…",
"Default": "Alapért.", "Default": "Alapértelmezett",
"HTTP Options": "HTTP beállítások", "HTTP Options": "HTTP beállítások",
"Create Incident": "Incidens létrehozása", "Create Incident": "Incidens létrehozása",
"Title": "Cím", "Title": "Cím",
"Content": "Tartalom", "Content": "Tartalom",
"Style": "Stílus", "Style": "Stílus",
"info": "info", "info": "info",
"warning": "warning", "warning": "figyelmeztetés",
"danger": "danger", "danger": "veszély",
"primary": "primary", "primary": "elsődleges",
"light": "light", "light": "világos",
"dark": "dark", "dark": "sötét",
"Post": "Bejegyzés", "Post": "Bejegyzés",
"Please input title and content": "Adjon meg címet és tartalmat", "Please input title and content": "Adjon meg címet és tartalmat",
"Created": "Létrehozva", "Created": "Létrehozva",
"Last Updated": "Utolsó mód.", "Last Updated": "Utoljára Módosítva",
"Unpin": "Leválaszt", "Unpin": "Leválaszt",
"Switch to Light Theme": "Világos témára váltás", "Switch to Light Theme": "Világos témára váltás",
"Switch to Dark Theme": "Sötét témára váltás", "Switch to Dark Theme": "Sötét témára váltás",
@ -408,11 +408,113 @@
"Affected Monitors": "Érintett monitorok", "Affected Monitors": "Érintett monitorok",
"Packet Size": "Csomag mérete", "Packet Size": "Csomag mérete",
"IconUrl": "Ikon URL", "IconUrl": "Ikon URL",
"successMessage": "Sikeres üzenet", "successMessage": "Siker Üzenet",
"lastDay1": "A hónap utolsó napja", "lastDay1": "A hónap utolsó napja",
"Guild ID": "Guild ID", "Guild ID": "Guild ID",
"Help": "Súgó", "Help": "Segítség",
"statusMaintenance": "Karbantartás", "statusMaintenance": "Karbantartás",
"Maintenance": "Karbantartás", "Maintenance": "Karbantartás",
"Game": "Játék" "Game": "Játék",
"markdownSupported": "Markdown szintaxis támogatott",
"Pick Affected Monitors...": "Érintett monitor(ok) kiválasztása…",
"All Status Pages": "Összes státusz oldal",
"topic": "Téma",
"topicExplanation": "MQTT téma a monitorhoz",
"webhookAdditionalHeadersDesc": "Hozzáad további fejléceket a webhook-hoz",
"error": "hiba",
"critical": "kritikus",
"Customize": "Testreszab",
"Custom Footer": "Egyedi Lábléc",
"Custom CSS": "Egyedi CSS",
"Proxies": "Proxyk",
"default": "Alapértelmezett",
"enabled": "Bekapcsolva",
"Certificate Chain": "Tanúsítvány Lánc",
"Valid": "Érvényes",
"Invalid": "Érvénytelen",
"User": "Felhasználó",
"Installed": "Telepítve",
"Not installed": "Nincs telepítve",
"Running": "Fut",
"Not running": "Nem fut",
"Remove Token": "Token Eltávolítása",
"Start": "Inditás",
"Stop": "Megállítás",
"Slug": "Slug",
"Accept characters:": "Karakterek engedélyezése:",
"Next": "Következő",
"The slug is already taken. Please choose another slug.": "Ez a slug már használatban van. Kérlek válassz másikat.",
"No Proxy": "Nincs Proxy",
"HTTP Basic Auth": "HTTP Basic Auth",
"New Status Page": "Új Állapot Oldal",
"Page Not Found": "Oldal Nem Található",
"Reverse Proxy": "Reverse Proxy",
"Backup": "Mentés",
"cloudflareWebsite": "Cloudflare Weboldal",
"Message:": "Üzenet:",
"Trust Proxy": "Trust Proxy",
"Other Software": "Egyébb Szoftware",
"Please read": "Olvasd el",
"Subject:": "Tárgy:",
"Valid To:": "Érvényes eddig:",
"Issuer:": "Kiállitó:",
"Fingerprint:": "Ujjlenyomat:",
"No status pages": "Nincsenek állapot oldalak",
"Domain Name Expiry Notification": "Domain Név Lejárás Értesítés",
"Date Created": "Létrehozva Ekkor",
"Footer Text": "Lábléc Szöveg",
"affectedMonitorsDescription": "Válaszd ki azokat a monitorokat amelyek a karbantartásban érintettek",
"affectedStatusPages": "Mutasd ezt az üzenetet a kiválasztott állapot oldalakon",
"atLeastOneMonitor": "Válassz legalább egy érintett monitort",
"endpoint": "végpont",
"promosmsLogin": "API Bejelentkezési Név",
"pushoversounds classical": "Klasszikus",
"pushoversounds cosmic": "Kozmikus",
"pushoversounds falling": "Esés",
"pushoversounds gamelan": "Gamelán",
"pushoversounds incoming": "Érkező",
"pushoversounds bike": "Bicikli",
"pushoversounds bugle": "Kürt",
"pushoversounds cashregister": "Pénztárgép",
"pushoversounds intermission": "Intermission",
"pushoversounds magic": "Varázslat",
"pushoversounds mechanical": "Mechanikus",
"pushoversounds pianobar": "Zongora",
"pushoversounds siren": "Sziréna",
"pushoversounds spacealarm": "Térriasztó",
"pushoversounds tugboat": "Vontatóhajó",
"pushoversounds alien": "Űrlény Riasztó (hosszú)",
"pushoversounds climb": "Mászás (hosszú)",
"pushoversounds persistent": "Állandó (hosszú)",
"pushoversounds echo": "Pushover Visszhang (hosszú)",
"pushoversounds updown": "Fent Lent (hosszú)",
"pushoversounds vibrate": "Csak Rezgés",
"pushoversounds none": "Egyik se (néma)",
"pushyAPIKey": "Titkos API Kulcs",
"pushyToken": "Eszköz token",
"Kook": "Kook",
"Free Mobile API Key": "Ingyenes Mobil API Kulcs",
"Enable TLS": "TLS bekapcsolása",
"proxyDescription": "A proxyk egy monitorhoz kell legyenek rendelve hogy működjenek.",
"Server Address": "Szerver Cím",
"resendEveryXTimes": "Újraküldés minden {0} időnként",
"resendDisabled": "Újraküldés kikapcsolva",
"Resend Notification if Down X times consequently": "Értesítés Újraküldése ha X-szer nem válaszol",
"Monitor": "Monitor | Monitorok",
"setAsDefault": "Beállítás Alapértelmezetnek",
"Proxy": "Proxy",
"Strategy": "Stratégia",
"Free Mobile User Identifier": "Ingyenes Mobil Felhasználó Azonosító",
"Schedule maintenance": "Karbantartás ütemezése",
"Select status pages...": "Státusz oldal kiválasztása…",
"Custom": "Egyedi",
"webhookAdditionalHeadersTitle": "További Fejlécek",
"deleteProxyMsg": "Biztos hogy kitörlöd ezt a proxy-t az összes monitorok-tól?",
"HTTP Headers": "HTTP Fejlécek",
"For example: nginx, Apache and Traefik.": "Például: nginx, Apache vagy Traefik.",
"dnsPortDescription": "DNS szerver portja. Alapéretelmezett az 53. Bármikor megváltoztathatja.",
"promosmsPassword": "API Jelszó",
"wayToGetKookBotToken": "Hozz létre egy app-ot és szerezz egy tokent itt: {0}",
"wayToGetKookGuildID": "Válts át 'Developer Mode'-ra a Kook beállításoknál majd jobb klikkelve a guildra megtalálod az ID-jét",
"Resend Notification if Down X times consecutively": "Értesítés Újraküldése ha X-szer nem válaszol"
} }

@ -416,5 +416,6 @@
"Page Not Found": "Pagina non trovata", "Page Not Found": "Pagina non trovata",
"Affected Monitors": "Monitoraggi interessati", "Affected Monitors": "Monitoraggi interessati",
"Pick Affected Monitors...": "Seleziona i monitoraggi interessati…", "Pick Affected Monitors...": "Seleziona i monitoraggi interessati…",
"Valid": "Valido" "Valid": "Valido",
"Certificate Expiry Notification": "Notifica scadenza certificato"
} }

@ -1,6 +1,6 @@
{ {
"languageName": "日本語", "languageName": "日本語",
"checkEverySecond": "{0}秒ごとにチェックします", "checkEverySecond": "{0}秒ごとにチェックします",
"retriesDescription": "サービスがダウンとしてマークされ、通知が送信されるまでの最大リトライ数", "retriesDescription": "サービスがダウンとしてマークされ、通知が送信されるまでの最大リトライ数",
"ignoreTLSError": "HTTPS ウェブサイトの TLS/SSL エラーを無視する", "ignoreTLSError": "HTTPS ウェブサイトの TLS/SSL エラーを無視する",
"upsideDownModeDescription": "ステータスの扱いを逆にします。サービスに到達可能な場合は、DOWNとなる。", "upsideDownModeDescription": "ステータスの扱いを逆にします。サービスに到達可能な場合は、DOWNとなる。",
@ -8,7 +8,7 @@
"acceptedStatusCodesDescription": "成功した応答とみなされるステータスコードを選択する。", "acceptedStatusCodesDescription": "成功した応答とみなされるステータスコードを選択する。",
"passwordNotMatchMsg": "繰り返しのパスワードが一致しません。", "passwordNotMatchMsg": "繰り返しのパスワードが一致しません。",
"notificationDescription": "監視を機能させるには、監視に通知を割り当ててください。", "notificationDescription": "監視を機能させるには、監視に通知を割り当ててください。",
"keywordDescription": "プレーンHTMLまたはJSON応答でキーワードを検索し、大文字と小文字を区別します", "keywordDescription": "プレーンHTMLまたはJSON応答でキーワードを検索し、大文字と小文字を区別します",
"pauseDashboardHome": "一時停止", "pauseDashboardHome": "一時停止",
"deleteMonitorMsg": "この監視を削除してよろしいですか?", "deleteMonitorMsg": "この監視を削除してよろしいですか?",
"deleteNotificationMsg": "全ての監視のこの通知を削除してよろしいですか?", "deleteNotificationMsg": "全ての監視のこの通知を削除してよろしいですか?",
@ -61,7 +61,7 @@
"Advanced": "Advanced", "Advanced": "Advanced",
"Upside Down Mode": "Upside Down Mode", "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.": "利用できません。設定してください。",
@ -137,7 +137,7 @@
"2FA Settings": "2段階認証の設定", "2FA Settings": "2段階認証の設定",
"Two Factor Authentication": "2段階認証", "Two Factor Authentication": "2段階認証",
"Clear all statistics": "すべての記録を削除", "Clear all statistics": "すべての記録を削除",
"retryCheckEverySecond": "Retry every {0} seconds.", "retryCheckEverySecond": "{0} 秒ごとにリトライします",
"importHandleDescription": "同じ名前のすべての監視または通知方法を上書きしない場合は、「既存のをスキップ」を選択します。 「上書きする」は、既存のすべてのモニターと通知を削除します。", "importHandleDescription": "同じ名前のすべての監視または通知方法を上書きしない場合は、「既存のをスキップ」を選択します。 「上書きする」は、既存のすべてのモニターと通知を削除します。",
"confirmImportMsg": "バックアップをインポートしてもよろしいですか?希望するオプションを選択してください。", "confirmImportMsg": "バックアップをインポートしてもよろしいですか?希望するオプションを選択してください。",
"Heartbeat Retry Interval": "異常検知後の再試行間隔", "Heartbeat Retry Interval": "異常検知後の再試行間隔",
@ -148,17 +148,17 @@
"Options": "オプション", "Options": "オプション",
"Keep both": "どちらも保持する", "Keep both": "どちらも保持する",
"Tags": "タグ", "Tags": "タグ",
"Add New below or Select...": "新規追加または選択...", "Add New below or Select...": "新規追加または選択",
"Tag with this name already exist.": "この名前のタグはすでに存在しています。", "Tag with this name already exist.": "この名前のタグはすでに存在しています。",
"Tag with this value already exist.": "この値のタグはすでに存在しています。", "Tag with this value already exist.": "この値のタグはすでに存在しています。",
"color": "色", "color": "色",
"value (optional)": "値 (optional)", "value (optional)": "値 (optional)",
"Search...": "検索...", "Search...": "検索",
"Avg. Ping": "平均Ping時間", "Avg. Ping": "平均Ping時間",
"Avg. Response": "平均応答時間", "Avg. Response": "平均応答時間",
"Entry Page": "エントリーページ", "Entry Page": "エントリーページ",
"statusPageNothing": "ここには何もありません。グループまたは監視を追加してください。", "statusPageNothing": "ここには何もありません。グループまたは監視を追加してください。",
"No Services": "No Services", "No Services": "サービス無し",
"All Systems Operational": "すべてのサービスが稼働中", "All Systems Operational": "すべてのサービスが稼働中",
"Partially Degraded Service": "部分的にサービスが停止中", "Partially Degraded Service": "部分的にサービスが停止中",
"Degraded Service": "サービスが停止中", "Degraded Service": "サービスが停止中",
@ -193,9 +193,324 @@
"pushOptionalParams": "オプションのパラメーター: {0}", "pushOptionalParams": "オプションのパラメーター: {0}",
"disableauth.message1": "<strong>認証を無効</strong>にしてもよろしいですか?", "disableauth.message1": "<strong>認証を無効</strong>にしてもよろしいですか?",
"disableauth.message2": "これは、Cloudflare Access、Authelia、またはその他の認証メカニズムなど、Uptime Kuma の前に<strong>サードパーティ認証を実装するシナリオ向けに設計されています</strong>。", "disableauth.message2": "これは、Cloudflare Access、Authelia、またはその他の認証メカニズムなど、Uptime Kuma の前に<strong>サードパーティ認証を実装するシナリオ向けに設計されています</strong>。",
"Please use this option carefully!": "このオプションは慎重に使用してください", "Please use this option carefully!": "このオプションは慎重に使用してください!",
"Primary Base URL": "プライマリ ベース URL", "Primary Base URL": "プライマリ ベース URL",
"statusMaintenance": "メンテナンス", "statusMaintenance": "メンテナンス",
"Passive Monitor Type": "パッシブモニタータイプ", "Passive Monitor Type": "パッシブモニタータイプ",
"Specific Monitor Type": "特定のモニターの種類" "Specific Monitor Type": "特定のモニターの種類",
"Security": "セキュリティ",
"Steam API Key": "Steam API Key",
"Default": "デフォルト",
"Title": "タイトル",
"No status pages": "ステータスページがありません",
"Proxy": "プロキシ",
"Date Created": "作成日",
"Content Type": "コンテンツタイプ",
"webhookAdditionalHeadersTitle": "追加ヘッダー",
"Server URL": "Server URL",
"Priority": "優先順位",
"Read more": "続きを読む",
"Show Tags": "タグを表示",
"Switch to Dark Theme": "ダークテーマに切り替える",
"Token": "Token",
"Show URI": "URIを表示する",
"Gray": "灰色",
"Red": "赤色",
"Green": "緑色",
"Blue": "青色",
"Indigo": "藍色",
"Purple": "紫色",
"Pink": "ピンク",
"Required": "必須",
"Select status pages...": "ステータスページを選択してください…",
"webhookAdditionalHeadersDesc": "Webhook で送信される追加ヘッダーを設定します。",
"Webhook URL": "Webhook URL",
"Application Token": "Application Token",
"steamApiKeyDescription": "Steam Game Server を監視するためには、Steam Web-API キーが必要です。APIキーの登録はこちらから行えます。 ",
"Monitor History": "監視履歴",
"clearDataOlderThan": "監視履歴データを {0} 日間、保持します。",
"PasswordsDoNotMatch": "パスワードが一致していません。",
"Current User": "現在のユーザー",
"topic": "トピック",
"Info": "Info",
"Create Incident": "インシデントを作成",
"Content": "内容",
"Please input title and content": "タイトルと内容を入力してください",
"Last Updated": "最終アップデート日時",
"Unpin": "ピンを外す",
"Switch to Light Theme": "ライトテーマに切り替える",
"Hide Tags": "タグを隠す",
"Description": "概要",
"Untitled Group": "名前の無いグループ",
"Services": "サービス",
"Discard": "破棄",
"Cancel": "キャンセル",
"Powered by": "Powered by",
"Customize": "カスタマイズ",
"Custom Footer": "カスタムフッター",
"Custom CSS": "カスタム CSS",
"deleteStatusPageMsg": "本当にこのステータスページを削除しますか?",
"Proxies": "プロキシ",
"default": "デフォルト",
"enabled": "有効",
"setAsDefault": "デフォルトに設定する",
"deleteProxyMsg": "本当にすべてのモニターからこのプロキシを削除しますか?",
"proxyDescription": "プロキシはモニターに割り当てられていないと機能しません。",
"setAsDefaultProxyDescription": "このプロキシは、新しいモニターに対してデフォルトで有効になっています。モニターごとに個別にプロキシを無効にすることができます。",
"Remove Token": "Tokenを削除",
"Stop": "止める",
"Add New Status Page": "新しいステータスページを追加",
"Next": "次へ",
"No Proxy": "プロキシなし",
"Authentication": "認証",
"HTTP Basic Auth": "HTTPベーシック認証",
"New Status Page": "新しいステータスページ",
"Page Not Found": "ページが見つかりません",
"Reverse Proxy": "リバースプロキシ",
"Backup": "バックアップ",
"About": "About",
"cloudflareWebsite": "Cloudflare Website",
"Don't know how to get the token? Please read the guide:": "トークンの取得方法が分かりませんか?ガイドをお読みください。",
"Custom": "カスタム",
"Created": "作成日時",
"Resend Notification if Down X times consecutively": "X回連続でダウンしたら通知を再送する",
"webhookJsonDesc": "{0}はExpress.jsのような最新のHTTPサーバに適しています",
"webhookFormDataDesc": "{multipart}はPHPに適しています。このJSONは{decodeFunction}でデコードする必要があります",
"appriseInstalled": "Appriseはインストール済みです。",
"emojiCheatSheet": "絵文字一覧: {0}",
"Inactive": "無効",
"defaultNotificationName": "{notification} 通知 ({number})",
"Post URL": "Post URL",
"Active": "有効",
"Pick a RR-Type...": "RR-Typeを選択…",
"Pick Accepted Status Codes...": "正常なステータスコードを選択…",
"appriseNotInstalled": "Apprise はインストールされていません。{0}",
"Method": "方式",
"Body": "ボディ",
"Headers": "ヘッダー",
"PushUrl": "Push URL",
"HeadersInvalidFormat": "リクエストヘッダーのJSONが無効です: ",
"BodyInvalidFormat": "リクエストボディのJSONが無効です: ",
"records": "レコード",
"One record": "レコード",
"topicExplanation": "監視するMQTTトピック",
"successMessage": "成功メッセージ",
"successMessageExplanation": "成功したとみなされるMQTTメッセージ",
"recent": "直近",
"Done": "完了",
"HTTP Options": "HTTPオプション",
"Style": "スタイル",
"info": "情報",
"warning": "警告",
"Valid To:": "有効期限:",
"Days Remaining:": "残りの有効日数:",
"Issuer:": "発行者:",
"Fingerprint:": "フィンガープリント:",
"Domain Name Expiry Notification": "ドメイン名有効期限通知",
"Footer Text": "フッター文章",
"Show Powered By": "Powered Byを表示",
"Domain Names": "ドメイン名",
"signedInDisp": "{0}としてログイン中",
"RadiusSecret": "Radius シークレット",
"RadiusSecretDescription": "クライアントとサーバー間の共有シークレット",
"RadiusCalledStationId": "Called Station Id",
"RadiusCallingStationId": "Calling Station Id",
"Subject:": "サブジェクト:",
"trustProxyDescription": "ヘッダー「X-Forwarded-*」を信頼します。Uptime Kumaがリバースプロキシの中にあり、正しいクライアントIPを取得する場合は、有効化してください。",
"Home Assistant URL": "ホームアシスタントURL",
"Examples": "例",
"telegramMessageThreadID": "(オプション) メッセージスレッドID",
"wayToGetLineNotifyToken": "{0}からアクセストークンを入手できます",
"Packet Size": "パケットサイズ",
"Bot Token": "ボットトークン",
"Chat ID": "チャットID",
"critical": "致命的エラー",
"signedInDispDisabled": "認証が無効化されています。",
"RadiusCalledStationIdDescription": "着信側の識別子",
"telegramProtectContent": "転送や保存を制限",
"YOUR BOT TOKEN HERE": "入手したボットトークン",
"API Key": "APIキー",
"Show update if available": "アップデートがあれば表示する",
"Using a Reverse Proxy?": "リバースプロキシを使用中ですか?",
"Go back to the previous page.": "前のページに戻る",
"Coming Soon": "近日公開予定",
"Workstation": "ワークステーション",
"wayToGetTelegramToken": "{0}からトークンを入手できます。",
"telegramMessageThreadIDDescription": "オプションとしてフォーラムのスレッド(話題)のIDを指定してメッセージを送信することができます。スーパーグループでのみ利用できます。",
"telegramProtectContentDescription": "有効な場合、Telegram上のボットのメッセージの転送や保存が制限されます。",
"danger": "危険",
"error": "エラー",
"primary": "プライマリー",
"light": "ライト",
"dark": "ダーク",
"Post": "Post",
"No monitors available.": "監視対象がありません。",
"Add one": "追加",
"No Monitors": "監視対象なし",
"shrinkDatabaseDescription": "SQLiteデーターベースにVACUUMを実行します。データーベースがv1.10.0以降に作成されている場合、AUTO_VACUUMが既に有効なため実行する必要はありません。",
"enableProxyDescription": "このプロキシは有効化されない限り、監視リクエストには影響しません。無効化した場合、一時的にプロキシをすべての監視から無効化することができます。",
"Certificate Chain": "証明書チェーン",
"Valid": "有効",
"Invalid": "無効",
"User": "ユーザー",
"Installed": "インストール済み",
"Not installed": "未インストール",
"Running": "稼働中",
"Not running": "停止中",
"Slug": "スラッグ",
"Accept characters:": "使用可能な文字:",
"startOrEndWithOnly": "{0}のみ最初と最後の文字として使用可能",
"No consecutive dashes": "連続したダッシュ記号は使用不可",
"The slug is already taken. Please choose another slug.": "指定されたスラグは既に使用されています。別のスラグを使用してください。",
"wayToGetCloudflaredURL": "({0}からcloudflaredをダウンロード)",
"Message:": "メッセージ:",
"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を経由した接続が遮断される可能性があります。停止してもよろしいですか? 確認のため、現在のパスワードを入力してください。",
"HTTP Headers": "HTTPヘッダー",
"Trust Proxy": "信頼できるプロキシ",
"Other Software": "その他のソフトウェア",
"For example: nginx, Apache and Traefik.": "例: nginxやApache、Traefikなど",
"RadiusCallingStationIdDescription": "発信側の識別子",
"Certificate Expiry Notification": "証明書有効期限通知",
"API Username": "APIユーザー名",
"Also check beta release": "ベータ版も表示する",
"Check how to config it for WebSocket": "WebSocketの設定方法について",
"Steam Game Server": "Steamゲームサーバー",
"Most likely causes:": "最も考えられる原因:",
"There might be a typing error in the address.": "アドレスの入力ミスの可能性があります。",
"What you can try:": "対応方法:",
"Retype the address.": "アドレスを入力し直してください。",
"The resource is no longer available.": "存在しないページです。",
"Connection String": "接続文字列",
"Query": "クエリ",
"settingsCertificateExpiry": "TLS証明書の有効期限",
"certificationExpiryDescription": "HTTPS監視のTLS証明書が以下の期限を迎えたときに通知を送信します。",
"Setup Docker Host": "Docker ホストを設定",
"Connection Type": "接続タイプ",
"Docker Daemon": "Docker デーモン",
"deleteDockerHostMsg": "すべての監視のDocker ホストを削除してもよろしいですか?",
"socket": "ソケット",
"tcp": "TCP / HTTP",
"Docker Container": "Docker コンテナー",
"Container Name / ID": "コンテナ名 / ID",
"Docker Host": "Docker ホスト",
"Docker Hosts": "Docker ホスト",
"Domain": "ドメイン",
"telegramSendSilently": "通知せずに送信",
"telegramSendSilentlyDescription": "通知せずにメッセージを送信します。通知音がなりません。",
"supportTelegramChatID": "チャットやグループ、チャンネルのチャットIDに対応",
"wayToGetTelegramChatID": "ボットにメッセージを送信し、以下のURLを開くとチャットIDのchat_idを入手できます。",
"chatIDNotFound": "チャットIDが存在しません。最初にメッセージをボットに送信してください",
"disableCloudflaredNoAuthMsg": "認証が無効化されているため、パスワードは必要ありません。",
"API Keys": "APIキー管理",
"Expiry": "期限切れ",
"Expiry date": "有効期限",
"No API Keys": "API Keyがありません",
"deleteAPIKeyMsg": "本当にこのAPIキーを削除しますか",
"Generate": "生成",
"pauseMaintenanceMsg": "本当に一時停止しますか?",
"maintenanceStatus-under-maintenance": "メンテナンス中",
"secureOptionNone": "None / STARTTLS (25, 587)",
"smtp": "Email (SMTP)",
"Bot Display Name": "BOTの表示名",
"Prefix Custom Message": "メッセージの先頭に送信する文章",
"endpoint": "エンドポイント",
"Proxy Protocol": "Proxy Protocol",
"Google Analytics ID": "Google アナリティクス ID",
"Frontend Version do not match backend version!": "フロントエンドとバックエンドのバージョンが一致しません!",
"or": "または",
"Frontend Version": "フロントエンドのバージョン",
"promosmsPassword": "APIパスワード",
"Notification Sound": "通知音",
"Clone Monitor": "監視の複製",
"Clone": "複製",
"cloneOf": "{0} の複製",
"Hello @everyone is...": "Hello {'@'}everyone is…",
"Icon URL": "アイコンURL",
"affectedStatusPages": "メンテナンスメッセージを選択したステータスページに表示する",
"GoogleChat": "Google Chat (Google Workspace 限定)",
"pushyToken": "デバイストークン",
"SMS Type": "SMSタイプ",
"Proxy Server": "Proxy Server",
"smtpDkimDomain": "ドメイン名",
"Uptime Kuma URL": "Uptime Kuma URL",
"Channel Name": "チャンネル名",
"smtpDkimSettings": "DKIM設定",
"Server Address": "サーバーアドレス",
"strategyManual": "手動で有効/無効を切り替える",
"warningTimezone": "サーバーのタイムゾーンを使用します",
"weekdayShortMon": "月",
"weekdayShortTue": "火",
"weekdayShortWed": "水",
"weekdayShortFri": "金",
"weekdayShortSat": "土",
"weekdayShortSun": "日",
"dayOfWeek": "曜日ごと",
"dayOfMonth": "日にちごと",
"maintenanceStatus-inactive": "無効",
"maintenanceStatus-scheduled": "スケジュール済み",
"maintenanceStatus-ended": "終了済み",
"maintenanceStatus-unknown": "不明",
"Server Timezone": "サーバータイムゾーン",
"IconUrl": "アイコンURL",
"Enable DNS Cache": "DNSキャッシュを有効にする",
"Enable": "有効",
"Disable": "無効",
"Schedule Maintenance": "スケジュールメンテナンス",
"loadingError": "データを取得できません。後でもう一度試してください。",
"uninstall": "アンインストール",
"installing": "インストール中",
"Ignore TLS Error": "TLSエラーを無視",
"smtpCC": "CC",
"secureOptionTLS": "TLS (465)",
"smtpBCC": "BCC",
"Discord Webhook URL": "Discord ウェブフック URL",
"wayToCheckSignalURL": "こちらから設定方法を確認できます:",
"Number": "Number",
"Line Developers Console": "Line Developers Console",
"Access Token": "アクセストークン",
"Channel access token": "チャンネルアクセストークン",
"enableGRPCTls": "TLS接続でgRPCリクエストを送信できるようにする",
"Messaging API": "Messaging API",
"dnsPortDescription": "DNSサーバーポートのデフォルトは53です。ポートはいつでも変更可能です。",
"Device": "デバイス",
"Event type:": "イベントタイプ:",
"here": "こちら",
"weekdayShortThu": "木",
"plugin": "プラグイン",
"No Maintenance": "メンテナンスはありません",
"dnsCacheDescription": "一部のIPv6環境では動作しない場合があります。問題が発生した場合は無効にしてください。",
"uninstalling": "アンインストール中",
"confirmUninstallPlugin": "本当にこのプラグインをアンインストールしていいですか?",
"wayToGetDiscordURL": "サーバー設定 -> 連携サービス -> ウェブフックを確認 -> 新しいウェブフック から新たに取得できます",
"wayToGetTeamsURL": "ウェブフックの作成方法は {0}",
"wayToGetZohoCliqURL": "ウェブフックの作成方法は {0}",
"confirmDeleteTagMsg": "このタグを本当に削除してよろしいですか?このタグが付けられたモニターは削除されません。",
"deleteMaintenanceMsg": "このメンテナンスを本当に削除していいですか?",
"promosmsLogin": "APIログイン名",
"pushyAPIKey": "シークレットAPI Key",
"Message Title": "メッセージタイトル",
"Setup Proxy": "プロキシを設定する",
"Proxy server has authentication": "プロキシサーバーは認証が必要",
"Edit Tag": "タグを編集",
"Add API Key": "API Keyを追加",
"Expires": "有効期限",
"disableAPIKeyMsg": "本当にこのAPIキーを無効化しますか",
"install": "インストール",
"affectedMonitorsDescription": "メンテナンスによって影響を受けるモニターを選択してください",
"default: notify all devices": "デフォルト:すべてのデバイスに通知する",
"Trigger type:": "トリガータイプ:",
"Event data:": "イベントデータ:",
"backupOutdatedWarning": "非推奨:多くの機能が追加され、このバックアップ機能は少しメンテナンスされていないため、完全なバックアップの生成や復元はできません。",
"backupRecommend": "代わりにボリュームまたはデータフォルダ(./data/)を直接バックアップしてください。",
"recurringInterval": "インターバル",
"Recurring": "繰り返し",
"lineDevConsoleTo": "Line Developers Console - {0}",
"Basic Settings": "基本設定",
"User ID": "User ID",
"Android": "Android",
"Huawei": "Huawei",
"Device Token": "デバイストークン",
"recurringIntervalMessage": "毎日1回実行する{0} 日に1回実行する",
"Add New Tag": "新しいタグを追加",
"statusPageMaintenanceEndDate": "終了日"
} }

@ -0,0 +1,21 @@
{
"Dashboard": "დაფა",
"Help": "დახმარება",
"New Update": "განახლება",
"Language": "ენა",
"Appearance": "ვიზუალი",
"Theme": "სტილი",
"Game": "თამაში",
"Version": "ვერსია",
"Quick Stats": "თვალის გადავლება",
"Up": "მაღლა",
"Pending": "მოლოდინი",
"languageName": "Georgian",
"Settings": "კონფიგურაცია",
"General": "ძირითადი",
"Check Update On GitHub": "GitHub_ზე განახლების შემოწმება",
"List": "სია",
"Add": "დამატება",
"Add New Monitor": "ახალი მონიტორის დამატება",
"Down": "დაბლა"
}

@ -208,7 +208,7 @@
"smtpBCC": "숨은 참조", "smtpBCC": "숨은 참조",
"discord": "Discord", "discord": "Discord",
"Discord Webhook URL": "Discord 웹훅 URL", "Discord Webhook URL": "Discord 웹훅 URL",
"wayToGetDiscordURL": "서버 설정 -> 연동 -> 웹후크 보기 -> 새 웹후크에서 얻을 수 있어요", "wayToGetDiscordURL": "서버 설정 -> 연동 -> 웹훅 보기 -> 새 웹훅 에서 얻을 수 있어요",
"Bot Display Name": "표시 이름", "Bot Display Name": "표시 이름",
"Prefix Custom Message": "접두사 메시지", "Prefix Custom Message": "접두사 메시지",
"Hello @everyone is...": "{'@'}everyone 서버 상태 알림이에요…", "Hello @everyone is...": "{'@'}everyone 서버 상태 알림이에요…",
@ -660,7 +660,7 @@
"Disable": "비활성화", "Disable": "비활성화",
"Single Maintenance Window": "단일 점검", "Single Maintenance Window": "단일 점검",
"Maintenance Time Window of a Day": "점검 시간", "Maintenance Time Window of a Day": "점검 시간",
"Effective Date Range": "유효 날짜 범위", "Effective Date Range": "유효 날짜 범위 (옵션)",
"Schedule Maintenance": "점검 예약하기", "Schedule Maintenance": "점검 예약하기",
"Date and Time": "날짜 및 시간", "Date and Time": "날짜 및 시간",
"DateTime Range": "날짜 시간 범위", "DateTime Range": "날짜 시간 범위",
@ -691,5 +691,62 @@
"webhookAdditionalHeadersTitle": "추가 헤더", "webhookAdditionalHeadersTitle": "추가 헤더",
"webhookAdditionalHeadersDesc": "웹훅과 함께 전송될 추가 헤더를 설정해요.", "webhookAdditionalHeadersDesc": "웹훅과 함께 전송될 추가 헤더를 설정해요.",
"HTTP Headers": "HTTP 헤더", "HTTP Headers": "HTTP 헤더",
"Trust Proxy": "프록시 신뢰" "Trust Proxy": "프록시 신뢰",
"API Keys": "API 키",
"markdownSupported": "Markdown 문법이 지원됨",
"telegramMessageThreadID": "(선택) 메시지 스레드 ID",
"Clone": "복제",
"cloneOf": "{0}의 복제본",
"Clone Monitor": "모니터링 복제",
"telegramProtectContent": "포워딩/저장 보호",
"telegramProtectContentDescription": "활성화 할경우 텔레그램 봇 메시지는 포워딩 및 저장으로부터 보호됩니다.",
"telegramSendSilentlyDescription": "조용히 메시지를 보냅니다. 사용자들은 무음으로 알림을 받습니다.",
"telegramSendSilently": "무음 알림",
"Add New Tag": "태그 추가",
"Edit Tag": "태그 수정",
"Server Address": "서버 주소",
"Learn More": "자세히 알아보기",
"Continue": "계속",
"Key Added": "키 추가됨",
"No API Keys": "API 키 없음",
"disableAPIKeyMsg": "이 API키를 정말로 비활성화하시겠습니까?",
"deleteAPIKeyMsg": "이 API키를 정말로 삭제하시겠습니까?",
"Generate": "생성",
"Body Encoding": "Body 인코딩",
"Expiry": "만료",
"Expiry date": "만료 날짜",
"Don't expire": "만료되지 않음",
"notificationRegional": "지역별",
"Google Analytics ID": "Google Analytics ID",
"Add API Key": "API 키 추가",
"apiKeyAddedMsg": "API 키가 추가되었습니다. 다시 표시되지 않을 것이므로 메모해 두세요.",
"pagertreeCritical": "긴급",
"apiKey-active": "사용 가능",
"lunaseaUserID": "사용자 ID",
"apiKey-expired": "만료됨",
"Expires": "만료일",
"twilioAuthToken": "인증 토큰",
"twilioFromNumber": "번호에서",
"twilioToNumber": "번호에서",
"twilioAccountSID": "계정 SID",
"pagertreeUrgency": "긴급",
"sameAsServerTimezone": "서버 시간대로 설정하기",
"startDateTime": "시작 시간",
"endDateTime": "종료 시간",
"cronExpression": "Cron 값",
"cronSchedule": "스케줄: ",
"invalidCronExpression": "알수없는 Cron 값입니다: {0}",
"Add Another": "다른 항목 추가",
"apiKey-inactive": "비활성화",
"pagertreeIntegrationUrl": "Integration 링크",
"pagertreeLow": "낮음",
"pagertreeMedium": "중간",
"pagertreeHigh": "높음",
"pagertreeResolve": "자동으로 해결하기",
"pagertreeDoNothing": "아무것도 하지 않음",
"wayToGetPagerTreeIntegrationURL": "PagerTree에서 Uptime Kuma 통합을 생성한 후 Endpoint를 복사합니다. 전체 세부 정보 보기 {0}",
"lunaseaTarget": "대상",
"lunaseaDeviceID": "기기 ID",
"statusPageRefreshIn": "{0} 후 새로고침",
"telegramMessageThreadIDDescription": "포럼의 대상 메시지 쓰레드(주제)에 대한 선택적 고유 식별인, 포럼 관리자 그룹에만 해당"
} }

@ -0,0 +1,27 @@
{
"Settings": "ക്രമീകരണം",
"Help": "സഹായം",
"New Update": "പുതിയ നവീകരണം",
"Language": "ഭാഷ",
"Appearance": "കാണപ്പെടുക",
"Theme": "ദൃശ്യക്രമീകരണം",
"General": "പൊതുവായത്",
"Version": "പതിപ്പ്",
"List": "പട്ടിക",
"Add": "ചേർക്കുക",
"Add New Monitor": "പുതിയ മോണിറ്റർ ചേർക്കുക",
"Quick Stats": "വേഗത്തിൽ ഇപ്പോളത്തെ അവസ്ഥ നോക്കുക",
"Up": "മുകളിൽ",
"Down": "താഴെ",
"statusMaintenance": "പരിപാലനം",
"Maintenance": "പരിപാലനം",
"Unknown": "അജ്ഞാതം",
"Passive Monitor Type": "പാർശമായ തിര നോട്ടം",
"Specific Monitor Type": "പ്രത്യേക തിര നോട്ടം",
"languageName": "മലയാളം",
"Dashboard": "നിയന്ത്രണോപകരണ സജ്ജീകരണം",
"Game": "കളികൾ",
"Check Update On GitHub": "പുതിയ മാറ്റങ്ങൾക്കായി GitHub നോക്കുക",
"Pending": "തീരുമാനം പ്രതീക്ഷിച്ചിരിക്കുന്ന",
"General Monitor Type": "പൊതുവരായ തിര നോട്ടം"
}

@ -281,5 +281,14 @@
"promosmsTypeFull": "SMS FULL - Premuimnivå SMS. Du kan bruke dit avsendernavn (Du må registerere et navn først). Pålitelig for alle varslinger.", "promosmsTypeFull": "SMS FULL - Premuimnivå SMS. Du kan bruke dit avsendernavn (Du må registerere et navn først). Pålitelig for alle varslinger.",
"promosmsTypeSpeed": "SMS SPEED - Høyest prioritet i systemet.Veldig rask på pålitelig, men dyrt (omtrent det dobbeltet av SMS FULL pris).", "promosmsTypeSpeed": "SMS SPEED - Høyest prioritet i systemet.Veldig rask på pålitelig, men dyrt (omtrent det dobbeltet av SMS FULL pris).",
"promosmsPhoneNumber": "Telefonnummber (for polske mottakere. Du trenger ikke områdekode.)", "promosmsPhoneNumber": "Telefonnummber (for polske mottakere. Du trenger ikke områdekode.)",
"promosmsSMSSender": "SMS Avsendernavn : Forhåndsregistert navn eller en av standardnavnene: InfoSMS, SMS Info, MaxSMS, INFO, SMS" "promosmsSMSSender": "SMS Avsendernavn : Forhåndsregistert navn eller en av standardnavnene: InfoSMS, SMS Info, MaxSMS, INFO, SMS",
"Help": "Hjelp",
"Game": "Spill",
"statusMaintenance": "Vedlikehold",
"Maintenance": "Maintenance",
"Passive Monitor Type": "Passiv Monitor Type",
"Specific Monitor Type": "Spesifik Monitor Type",
"General Monitor Type": "Generisk Monitor Type",
"markdownSupported": "Markdown syntax støttet",
"Resend Notification if Down X times consecutively": "Send notifikasjon på nytt dersom nede X antall ganger på rad"
} }

@ -1,14 +1,14 @@
{ {
"languageName": "Nederlands", "languageName": "Nederlands",
"checkEverySecond": "Controleer elke {0} seconden.", "checkEverySecond": "Controleer elke {0} seconden",
"retriesDescription": "Maximum aantal nieuwe pogingen voordat de service wordt gemarkeerd als niet beschikbaar en er een melding wordt verzonden", "retriesDescription": "Maximum aantal nieuwe pogingen voordat de service wordt gemarkeerd als niet beschikbaar en er een melding wordt verzonden",
"ignoreTLSError": "Negeer TLS/SSL-fout voor HTTPS-websites", "ignoreTLSError": "Negeer TLS/SSL-fout voor HTTPS-websites",
"upsideDownModeDescription": "Draai de status om. Als de service bereikbaar is, is deze OFFLINE.", "upsideDownModeDescription": "Draai de status om. Als de service bereikbaar is, zal OFFLINE getoond worden.",
"maxRedirectDescription": "Maximaal aantal te volgen omleidingen. Stel in op 0 om omleidingen uit te schakelen.", "maxRedirectDescription": "Maximaal aantal te volgen omleidingen. Stel in op 0 om omleidingen uit te schakelen.",
"acceptedStatusCodesDescription": "Selecteer statuscodes die als een succesvol antwoord worden beschouwd.", "acceptedStatusCodesDescription": "Selecteer statuscodes die als een succesvol antwoord worden beschouwd.",
"passwordNotMatchMsg": "Het herhaalwachtwoord komt niet overeen.", "passwordNotMatchMsg": "Het herhaalwachtwoord komt niet overeen.",
"notificationDescription": "Wijs a.u.b. een melding toe aan de monitor(s) om het te laten werken.", "notificationDescription": "Wijs a.u.b. een melding toe aan de monitor(s) om het te laten werken.",
"keywordDescription": "Zoek trefwoord in gewone html of JSON-response en het is hoofdlettergevoelig", "keywordDescription": "Zoek trefwoord in gewone html of JSON-response en het is hoofdlettergevoelig.",
"pauseDashboardHome": "Gepauzeerd", "pauseDashboardHome": "Gepauzeerd",
"deleteMonitorMsg": "Weet u zeker dat u deze monitor wilt verwijderen?", "deleteMonitorMsg": "Weet u zeker dat u deze monitor wilt verwijderen?",
"deleteNotificationMsg": "Weet u zeker dat u deze melding voor alle monitoren wilt verwijderen?", "deleteNotificationMsg": "Weet u zeker dat u deze melding voor alle monitoren wilt verwijderen?",
@ -19,7 +19,7 @@
"clearEventsMsg": "Weet je zeker dat je alle evenementen voor deze monitor wilt verwijderen?", "clearEventsMsg": "Weet je zeker dat je alle evenementen voor deze monitor wilt verwijderen?",
"clearHeartbeatsMsg": "Weet je zeker dat je alle heartbeats voor deze monitor wilt verwijderen?", "clearHeartbeatsMsg": "Weet je zeker dat je alle heartbeats voor deze monitor wilt verwijderen?",
"confirmClearStatisticsMsg": "Weet u zeker dat u alle statistieken wilt verwijderen?", "confirmClearStatisticsMsg": "Weet u zeker dat u alle statistieken wilt verwijderen?",
"twoFAVerifyLabel": "Voer uw 2FA controle token in voor verificatie", "twoFAVerifyLabel": "Voer uw 2FA controle token in voor verificatie:",
"tokenValidSettingsMsg": "Token is geldig! U kunt nu de 2FA-instellingen opslaan.", "tokenValidSettingsMsg": "Token is geldig! U kunt nu de 2FA-instellingen opslaan.",
"confirmEnableTwoFAMsg": "Weet je zeker dat je 2FA wilt inschakelen?", "confirmEnableTwoFAMsg": "Weet je zeker dat je 2FA wilt inschakelen?",
"confirmDisableTwoFAMsg": "Weet je zeker dat je 2FA wilt uitschakelen?", "confirmDisableTwoFAMsg": "Weet je zeker dat je 2FA wilt uitschakelen?",
@ -58,7 +58,7 @@
"-hour": "-uur", "-hour": "-uur",
"Response": "Antwoord", "Response": "Antwoord",
"Ping": "Ping", "Ping": "Ping",
"Monitor Type": "Monitortype:", "Monitor Type": "Monitortype",
"Keyword": "Trefwoord", "Keyword": "Trefwoord",
"Friendly Name": "Vriendelijke naam", "Friendly Name": "Vriendelijke naam",
"URL": "URL", "URL": "URL",
@ -105,7 +105,7 @@
"Password": "Wachtwoord", "Password": "Wachtwoord",
"Remember me": "Wachtwoord onthouden", "Remember me": "Wachtwoord onthouden",
"Login": "Inloggen", "Login": "Inloggen",
"No Monitors, please": "Geen monitoren, ", "No Monitors, please": "Geen monitoren, alstublieft",
"add one": "voeg een toe", "add one": "voeg een toe",
"Notification Type": "Melding type", "Notification Type": "Melding type",
"Email": "E-mail", "Email": "E-mail",
@ -120,7 +120,7 @@
"Import": "Importeren", "Import": "Importeren",
"respTime": "reactietijd (ms)", "respTime": "reactietijd (ms)",
"notAvailableShort": "N.v.t.", "notAvailableShort": "N.v.t.",
"Default enabled": "Default enabled", "Default enabled": "Standaard ingeschakeld",
"Apply on all existing monitors": "Pas toe op alle bestaande monitors", "Apply on all existing monitors": "Pas toe op alle bestaande monitors",
"Create": "Aanmaken", "Create": "Aanmaken",
"Clear Data": "Data wissen", "Clear Data": "Data wissen",
@ -144,9 +144,9 @@
"Token": "Token", "Token": "Token",
"Show URI": "Toon URI", "Show URI": "Toon URI",
"Clear all statistics": "Wis alle statistieken", "Clear all statistics": "Wis alle statistieken",
"retryCheckEverySecond": "Probeer elke {0} seconden.", "retryCheckEverySecond": "Probeer elke {0} seconden",
"importHandleDescription": "Kies 'Sla bestaande over' als je elke monitor of melding met dezelfde naam wilt overslaan. Kies 'Overschrijf' als je elke monitor of notificatie wilt verwijderen.", "importHandleDescription": "Kies 'Sla bestaande over' als je elke monitor of melding met dezelfde naam wilt overslaan. Kies 'Overschrijf' als je elke monitor of notificatie wilt verwijderen.",
"confirmImportMsg": "Weet je zeker dat je dit bestand wilt importeren?", "confirmImportMsg": "Weet je zeker dat je dit bestand wilt importeren? Controleer of je de correcte importeer optie hebt geselecteerd.",
"Heartbeat Retry Interval": "Heartbeat Retry Interval", "Heartbeat Retry Interval": "Heartbeat Retry Interval",
"Import Backup": "Importeer Backup", "Import Backup": "Importeer Backup",
"Export Backup": "Exporteer Backup", "Export Backup": "Exporteer Backup",
@ -155,9 +155,9 @@
"Options": "Opties", "Options": "Opties",
"Keep both": "Bewaar beide", "Keep both": "Bewaar beide",
"Tags": "Labels", "Tags": "Labels",
"Add New below or Select...": "Voeg nieuwe toe of selecteer...", "Add New below or Select...": "Voeg nieuwe toe of selecteer",
"Tag with this name already exist.": "Label met deze naam bestaat al", "Tag with this name already exist.": "Label met deze naam bestaat al.",
"Tag with this value already exist.": "Label met deze waarde bestaat al", "Tag with this value already exist.": "Label met deze waarde bestaat al.",
"color": "Kleur", "color": "Kleur",
"value (optional)": "waarde (optioneel)", "value (optional)": "waarde (optioneel)",
"Gray": "Grijs", "Gray": "Grijs",
@ -168,9 +168,9 @@
"Indigo": "Indigo", "Indigo": "Indigo",
"Purple": "Paars", "Purple": "Paars",
"Pink": "Roze", "Pink": "Roze",
"Search...": "Zoeken...", "Search...": "Zoeken",
"Avg. Ping": "Gemiddelde Ping", "Avg. Ping": "Gemiddelde ping",
"Avg. Response": "Gemiddelde Response", "Avg. Response": "Gemiddelde response",
"Entry Page": "Entry Page", "Entry Page": "Entry Page",
"statusPageNothing": "Niets hier, voeg een groep of monitor toe.", "statusPageNothing": "Niets hier, voeg een groep of monitor toe.",
"No Services": "Geen diensten", "No Services": "Geen diensten",
@ -234,10 +234,10 @@
"smtpCC": "CC", "smtpCC": "CC",
"smtpBCC": "BCC", "smtpBCC": "BCC",
"Discord Webhook URL": "Discord Webhook URL", "Discord Webhook URL": "Discord Webhook URL",
"wayToGetDiscordURL": "Je kunt dit krijgen door te gaan naar Server Instellingen -> Integraties -> Creëer Webhook", "wayToGetDiscordURL": "Je kunt dit krijgen door te gaan naar Server Instellingen -> Integraties -> Bekijk webhooks -> Nieuwe webhook",
"Bot Display Name": "Bot Weergave Naam", "Bot Display Name": "Bot Weergave Naam",
"Prefix Custom Message": "Prefix Aangepast Bericht", "Prefix Custom Message": "Prefix Aangepast Bericht",
"Hello @everyone is...": "Hallo {'@'}iedereen is...", "Hello @everyone is...": "Hallo {'@'}iedereen is",
"Webhook URL": "Webhook URL", "Webhook URL": "Webhook URL",
"wayToGetTeamsURL": "Je kunt hier leren hoe je een webhook URL kunt maken {0}.", "wayToGetTeamsURL": "Je kunt hier leren hoe je een webhook URL kunt maken {0}.",
"Number": "Nummer", "Number": "Nummer",
@ -300,14 +300,14 @@
"promosmsTypeSpeed": "SMS SPEED - Hoogste prioriteit in systeem. Is veel sneller en betrouwbaarder maar kost meer (ongeveer twee keer zoveel als volle SMS prijs).", "promosmsTypeSpeed": "SMS SPEED - Hoogste prioriteit in systeem. Is veel sneller en betrouwbaarder maar kost meer (ongeveer twee keer zoveel als volle SMS prijs).",
"promosmsPhoneNumber": "Telefoon nummer (voor Poolse ontvangers. Je kunt gebieds codes overslaan)", "promosmsPhoneNumber": "Telefoon nummer (voor Poolse ontvangers. Je kunt gebieds codes overslaan)",
"promosmsSMSSender": "SMS Ontvanger naam : Voor geregistreerde naam of een van de standaarden: InfoSMS, SMS Info, MaxSMS, INFO, SMS", "promosmsSMSSender": "SMS Ontvanger naam : Voor geregistreerde naam of een van de standaarden: InfoSMS, SMS Info, MaxSMS, INFO, SMS",
"Feishu WebHookUrl": "Feishu WebHookURL", "Feishu WebHookUrl": "Feishu Webhook URL",
"matrixHomeserverURL": "Homeserver URL (met http(s):// en optioneel poort)", "matrixHomeserverURL": "Homeserver URL (met http(s):// en optioneel poort)",
"Internal Room Id": "Interne Room ID", "Internal Room Id": "Interne Room ID",
"matrixDesc1": "Je kunt de interne room ID vinden door in de geavanceerde sectie van de room instellingen in je Matrix client te kijken. Het zou moeten uitzien als !QMdRCpUIfLwsfjxye6:home.server.", "matrixDesc1": "Je kunt de interne room ID vinden door in de geavanceerde sectie van de room instellingen in je Matrix client te kijken. Het zou moeten uitzien als !QMdRCpUIfLwsfjxye6:home.server.",
"matrixDesc2": "Het wordt ten zeerste aanbevolen om een nieuwe gebruiker aan te maken en niet de access token van je account te gebruiken, aangezien dit volledige toegang geeft tot je account en alle kamers waar je lid van bent. Maak in plaats daarvan een nieuwe gebruiker aan en nodig deze alleen uit voor de ruimte waarin je de melding wilt ontvangen. Je kunt de access token krijgen door het volgende uit te voeren {0}", "matrixDesc2": "Het wordt ten zeerste aanbevolen om een nieuwe gebruiker aan te maken en niet de access token van je account te gebruiken, aangezien dit volledige toegang geeft tot je account en alle kamers waar je lid van bent. Maak in plaats daarvan een nieuwe gebruiker aan en nodig deze alleen uit voor de ruimte waarin je de melding wilt ontvangen. Je kunt de access token krijgen door het volgende uit te voeren {0}",
"Monitor History": "Monitor Geschiedenis", "Monitor History": "Monitor Geschiedenis",
"clearDataOlderThan": "Bewaar monitor geschiedenis voor {0} dagen.", "clearDataOlderThan": "Bewaar monitor geschiedenis voor {0} dagen.",
"PasswordsDoNotMatch": "Wachtwoorden komen niet overeen", "PasswordsDoNotMatch": "Wachtwoorden komen niet overeen.",
"records": "records", "records": "records",
"One record": "Een record", "One record": "Een record",
"steamApiKeyDescription": "Om een Steam Game Server te monitoren heb je een Steam Web-API key nodig. Je kunt hier je API key registreren: ", "steamApiKeyDescription": "Om een Steam Game Server te monitoren heb je een Steam Web-API key nodig. Je kunt hier je API key registreren: ",
@ -315,15 +315,15 @@
"topic": "Onderwerp", "topic": "Onderwerp",
"topicExplanation": "MQTT onderwerp om te monitoren", "topicExplanation": "MQTT onderwerp om te monitoren",
"successMessage": "Succesbericht", "successMessage": "Succesbericht",
"successMessageExplanation": "MQTT bericht dat als succes wordt beschouwd.", "successMessageExplanation": "MQTT bericht dat als succes wordt beschouwd",
"recent": "Recent", "recent": "Recent",
"Done": "Klaar", "Done": "Klaar",
"Info": "Info", "Info": "Info",
"Security": "Beveiliging", "Security": "Beveiliging",
"Steam API Key": "Steam API Sleutel", "Steam API Key": "Steam API Sleutel",
"Shrink Database": "Verklein Database", "Shrink Database": "Verklein Database",
"Pick a RR-Type...": "Kies een RR-Type...", "Pick a RR-Type...": "Kies een RR-Type",
"Pick Accepted Status Codes...": "Kies geaccepteerde Status Codes...", "Pick Accepted Status Codes...": "Kies geaccepteerde Status Codes",
"Default": "Standaard", "Default": "Standaard",
"HTTP Options": "HTTP Opties", "HTTP Options": "HTTP Opties",
"Create Incident": "Creëer Incident", "Create Incident": "Creëer Incident",
@ -399,7 +399,7 @@
"SignName": "SignName", "SignName": "SignName",
"Sms template must contain parameters: ": "Sms sjabloon moet de volgende parameters bevatten: ", "Sms template must contain parameters: ": "Sms sjabloon moet de volgende parameters bevatten: ",
"Bark Endpoint": "Bark Endpoint", "Bark Endpoint": "Bark Endpoint",
"WebHookUrl": "WebHookUrl", "WebHookUrl": "Webhook URL",
"SecretKey": "SecretKey", "SecretKey": "SecretKey",
"For safety, must use secret key": "Voor de veiligheid moet je de secret key gebruiken", "For safety, must use secret key": "Voor de veiligheid moet je de secret key gebruiken",
"Device Token": "Apparaat Token", "Device Token": "Apparaat Token",
@ -464,7 +464,7 @@
"Footer Text": "Footer Tekst", "Footer Text": "Footer Tekst",
"Show Powered By": "Laat \"Mogeljik gemaakt door\" zien", "Show Powered By": "Laat \"Mogeljik gemaakt door\" zien",
"Domain Names": "Domein Namen", "Domain Names": "Domein Namen",
"pushoversounds pushover": "Pushover (default)", "pushoversounds pushover": "Pushover (standaard)",
"pushoversounds bike": "Bike", "pushoversounds bike": "Bike",
"pushoversounds bugle": "Bugle", "pushoversounds bugle": "Bugle",
"pushoversounds cashregister": "Cash Register", "pushoversounds cashregister": "Cash Register",
@ -485,7 +485,7 @@
"pushoversounds persistent": "Persistent (long)", "pushoversounds persistent": "Persistent (long)",
"pushoversounds echo": "Pushover Echo (long)", "pushoversounds echo": "Pushover Echo (long)",
"pushoversounds updown": "Up Down (long)", "pushoversounds updown": "Up Down (long)",
"pushoversounds vibrate": "Vibrate Only", "pushoversounds vibrate": "Alleen trillen",
"pushoversounds none": "None (silent)", "pushoversounds none": "None (silent)",
"dnsPortDescription": "DNS-serverpoort. Standaard ingesteld op 53. Je kunt de poort op elk moment wijzigen.", "dnsPortDescription": "DNS-serverpoort. Standaard ingesteld op 53. Je kunt de poort op elk moment wijzigen.",
"error": "fout", "error": "fout",
@ -523,9 +523,185 @@
"Connection String": "Connection String", "Connection String": "Connection String",
"Query": "Query", "Query": "Query",
"settingsCertificateExpiry": "TLS Certificate Expiry", "settingsCertificateExpiry": "TLS Certificate Expiry",
"certificationExpiryDescription": "HTTPS Monitors trigger notification when TLS certificate expires in:", "certificationExpiryDescription": "Stuur een melding bij het verlopen van het HTTPS TLS certificaat in:",
"ntfy Topic": "ntfy Topic", "ntfy Topic": "ntfy Topic",
"Domain": "Domein", "Domain": "Domein",
"Workstation": "Werkstation", "Workstation": "Werkstation",
"disableCloudflaredNoAuthMsg": "De \"Geen authenticatie\" modus staat aan, wachtwoord is niet vereist." "disableCloudflaredNoAuthMsg": "De \"Geen authenticatie\" modus staat aan, wachtwoord is niet vereist.",
"backupOutdatedWarning": "Deprecated: Er zijn een hoop nieuwe functies toegevoegd en daarom is de backup functie niet onderhouden, het is op dit moment niet mogelijk om een volledige backup te maken en te herstellen.",
"RadiusSecret": "Radius Secret",
"RadiusSecretDescription": "Shared Secret tussen client en server",
"API Key": "API Key",
"Connection Type": "Verbindingstype",
"Docker Daemon": "Docker Daemon",
"Trust Proxy": "Trust Proxy",
"Setup Docker Host": "Docker Host instellen",
"tcp": "TCP / HTTP",
"Optional": "Optioneel",
"socket": "Socket",
"Docker Container": "Docker Container",
"Container Name / ID": "Container Naam / ID",
"Docker Host": "Docker Host",
"Docker Hosts": "Docker Hosts",
"Packet Size": "Packet Grootte",
"wayToGetLineNotifyToken": "Je kan een Access Token van {0} krijgen",
"Examples": "Voorbeelden",
"Home Assistant URL": "Home Assistant URL",
"default: notify all devices": "Standaard: stuur melding naar alle apparaten",
"Automations can optionally be triggered in Home Assistant:": "Automations kunnen optioneel worden getriggerd in Home Assistant:",
"Event data:": "Event data:",
"Then choose an action, for example switch the scene to where an RGB light is red.": "Kies een actie, bijvoorbeeld het activeren van een scene.",
"Frontend Version": "Frontend Versie",
"Frontend Version do not match backend version!": "Frontend versie komt niet overeen niet met de backend versie!",
"backupRecommend": "In plaats daarvan, maak een backup van je Docker volume of de data map (./data/).",
"squadcast": "Squadcast",
"or": "of",
"recurringInterval": "Interval",
"Recurring": "Terugkerend",
"strategyManual": "Actief/Inactief handmatig",
"warningTimezone": "De tijdzone van de server wordt gebruikt",
"weekdayShortMon": "ma",
"weekdayShortTue": "di",
"weekdayShortWed": "wo",
"weekdayShortThu": "do",
"weekdayShortFri": "vr",
"weekdayShortSat": "za",
"weekdayShortSun": "zo",
"dayOfWeek": "Dag van de week",
"dayOfMonth": "Dag van de maand",
"lastDay": "Laatste dag",
"lastDay2": "1 na laatste dag van de maand",
"lastDay4": "3 na laatste dag van de maand",
"No Maintenance": "Geen onderhoud",
"pauseMaintenanceMsg": "Weet je zeker dat je wilt pauzeren?",
"maintenanceStatus-under-maintenance": "In onderhoud",
"maintenanceStatus-inactive": "Inactief",
"maintenanceStatus-scheduled": "Ingepland",
"maintenanceStatus-ended": "Beëindigd",
"Display Timezone": "Toon tijdzone",
"Server Timezone": "Server tijdzone",
"statusPageMaintenanceEndDate": "Einde",
"IconUrl": "Icoon URL",
"Enable DNS Cache": "DNS Cache inschakelen",
"Enable": "Inschakelen",
"Disable": "Uitschakelen",
"Single Maintenance Window": "Enkel onderhoudsperiode",
"Effective Date Range": "Effectieve periode",
"Schedule Maintenance": "Onderhoud inplannen",
"Date and Time": "Datum en tijd",
"DateTime Range": "Datum en tijd periode",
"wayToGetZohoCliqURL": "Via deze link kun je uitvinden hoe je een webhook URL maakt {0}.",
"dataRetentionTimeError": "Bewaarperiode moet 0 of groter zijn",
"infiniteRetention": "Stel in op 0 voor oneindige bewaarperiode.",
"enableGRPCTls": "Toestaan om gRPC aanvragen te sturen over TLS verbinding",
"deleteMaintenanceMsg": "Weet je zeker dat je dit onderhoud wilt verwijderen?",
"recurringIntervalMessage": "1 keer per dag uitvoeren | 1 keer per elke {0} dagen uitvoeren",
"affectedStatusPages": "Toon het onderhoudsbericht op de geselecteerde status pagina's",
"promosmsPassword": "API Wachtwoord",
"Kook": "Kook",
"high": "hoog",
"Base URL": "Base URL",
"goAlert": "GoAlert",
"Octopush API Version": "Octopush API versie",
"HomeAssistant": "Home Assistant",
"affectedMonitorsDescription": "Selecteer de monitors die zullen worden aangetast door het huidige onderhoud",
"Custom": "Aangepast",
"Affected Monitors": "Aangetaste monitors",
"Resend Notification if Down X times consequently": "Verzend offline melding X keer opnieuw bij blijvend offline",
"Monitor": "Monitor | Monitors",
"Start of maintenance": "Start van onderhoud",
"All Status Pages": "Alle status pagina's",
"Select status pages...": "Selecteer status pagina's…",
"API Username": "API Gebruikersnaam",
"Trigger type:": "Trigger type:",
"Event type:": "Event type:",
"Guild ID": "Guild ID",
"uninstalling": "Aan het verwijderen",
"Lowcost": "Lowcost",
"Economy": "Economy",
"webhookAdditionalHeadersTitle": "Extra Headers",
"webhookAdditionalHeadersDesc": "Voegt extra headers toe die meegestuurd worden met de webhook.",
"Help": "Hulp",
"Game": "Game",
"statusMaintenance": "Onderhoud",
"Maintenance": "Onderhoud",
"Passive Monitor Type": "Passieve Monitor Type",
"Pick Affected Monitors...": "Kies aangetaste monitors…",
"Specific Monitor Type": "Specifieke Monitor Type",
"promosmsLogin": "API Login naam",
"Schedule maintenance": "Onderhoud inplannen",
"resendEveryXTimes": "Verstuur elke {0} keer opnieuw",
"resendDisabled": "Opnieuw versturen uitgeschakeld",
"General Monitor Type": "Algemeen Monitor Type",
"Notification Service": "Melding diensten",
"uninstall": "Verwijderen",
"HTTP Headers": "HTTP Headers",
"Domain Name Expiry Notification": "Domeinnaam verlopen melding",
"deleteDockerHostMsg": "Weet je zeker dat je deze Docker host wilt verwijderen voor alle monitors?",
"A list of Notification Services can be found in Home Assistant under \"Developer Tools > Services\" search for \"notification\" to find your device/phone name.": "Een lijst van melding diensten kan worden gevonden in Home Assistant onder \"Developer Tools > Services\" en zoek voor \"notification\" om je apparaat/telefoon naam te vinden.",
"lastDay1": "Laatste dag van de maand",
"lastDay3": "2 na laatste dag van de maand",
"maintenanceStatus-unknown": "Onbekend",
"dnsCacheDescription": "Het werkt niet in sommige IPv6 omgevingen, schakel het uit als je problemen ervaart.",
"confirmDeleteTagMsg": "Weet je zeker dat je dit label wilt verwijderen? Monitors die gekoppeld zijn aan dit label worden niet verwijderd.",
"atLeastOneMonitor": "Selecteer tenminste 1 aangetaste monitor",
"Enable TLS": "TLS inschakelen",
"smseagle": "SMSEagle",
"smseagleTo": "Telefoonnummer(s)",
"Custom Monitor Type": "Custom Monitor Type",
"trustProxyDescription": "'X-Forwarded-*' headers vertrouwen. Als je de correcte client IP wilt krijgen en de Uptime Kuma installatie is achter een proxy zoals Nginx of Apache, schakel dan dit in.",
"RadiusCalledStationId": "Called Station Id",
"RadiusCalledStationIdDescription": "Identifier of the called device",
"RadiusCallingStationId": "Calling Station Id",
"ZohoCliq": "ZohoCliq",
"Long-Lived Access Token": "Long-Lived Access Token",
"Long-Lived Access Token can be created by clicking on your profile name (bottom left) and scrolling to the bottom then click Create Token. ": "Long-Lived Access Token kan aangemaakt worden via je profiel naam (links onder) en door naar beneden te scrollen en te klikken op Token Aanmaken. ",
"Maintenance Time Window of a Day": "Onderhoud tijdsvak van een dag",
"octopushAPIKey": "\"API key\" van HTTP API inloggegevens van het controle paneel",
"octopushLogin": "\"Login\" van HTTP API inloggegevens controle paneel",
"grpcMethodDescription": "Methode naam moet in cammelCase formaat zijn zoals zegHallo, check, etc.",
"wayToGetKookBotToken": "Maak een applicatie en haal je bot token op bij {0}",
"wayToGetKookGuildID": "Switch naar 'Developer Mode' in de Kook instellingen, en klik met de rechter muisknop op de guild om de ID op te halen",
"Strategy": "Strategy",
"Free Mobile User Identifier": "Free Mobile User Identifier",
"Free Mobile API Key": "Free Mobile API Key",
"Proto Service Name": "Proto service naam",
"Proto Method": "Proto methode",
"Proto Content": "Proto inhoud",
"SendKey": "SendKey",
"SMSManager API Docs": "SMSManager API documentatie ",
"Gateway Type": "Gateway Type",
"SMSManager": "SMSManager",
"You can divide numbers with": "Je kunt nummers delen met",
"Bark Group": "Bark Group",
"Bark Sound": "Bark Sound",
"promosmsAllowLongSMS": "Sta lange SMS toe",
"smseagleRecipientType": "Ontvanger type",
"smseagleRecipient": "Ontvanger(s) (gescheiden met comma)",
"smseagleToken": "API access token",
"smseagleEncoding": "Stuur als Unicode",
"smseaglePriority": "Bericht prioriteit (0-9, standaard = 0)",
"Legacy Octopush-DM": "Legacy Octopush-DM",
"smseagleGroup": "Telefoonboek groep namen",
"Google Analytics ID": "Google Analytics ID",
"Edit Tag": "Tag bewerken",
"Server Address": "Server Adres",
"Learn More": "Meer leren",
"RadiusCallingStationIdDescription": "Identifier of the calling device",
"plugin": "Plugin | Plugins",
"installing": "Installeren",
"install": "Installeer",
"confirmUninstallPlugin": "Weet je zeker dat je deze plugin wilt verwijderen?",
"smseagleUrl": "SMSEagle apparaat URL",
"markdownSupported": "Markdown syntax ondersteund",
"Resend Notification if Down X times consecutively": "Melding x keer opnieuw sturen als monitor offline is",
"loadingError": "Kan de data niet ophalen, probeer het later opnieuw.",
"smseagleContact": "Telefoonboek contact namen",
"apiKey-active": "Actief",
"apiKey-expired": "Verlopen",
"pagertreeLow": "Laag",
"pagertreeHigh": "Hoog",
"Clone": "Dupliceer",
"cloneOf": "Duplicaat van {0}",
"Add New Tag": "Voeg nieuw label toe"
} }

@ -696,5 +696,52 @@
"Google Analytics ID": "Identyfikator Google Analytics", "Google Analytics ID": "Identyfikator Google Analytics",
"Edit Tag": "Edytuj Tag", "Edit Tag": "Edytuj Tag",
"Server Address": "Adres Serwera", "Server Address": "Adres Serwera",
"Learn More": "Dowiedz się więcej" "Learn More": "Dowiedz się więcej",
"Body Encoding": "Kodowanie treści",
"Expiry": "Wygasa",
"Expiry date": "Data wygaśnięcia",
"Don't expire": "Nie wygaszaj",
"Continue": "Kontynuuj",
"Add Another": "Dodaj kolejne",
"Add API Key": "Dodaj klucz API",
"No API Keys": "Brak kluczy API",
"apiKey-active": "Aktywny",
"apiKey-expired": "Wygasły",
"apiKey-inactive": "Nieaktywny",
"Expires": "Wygasa",
"Generate": "Generuj",
"disableAPIKeyMsg": "Czy na pewno chcesz wyłączyć ten klucz API?",
"deleteAPIKeyMsg": "Czy na pewno chcesz usunąć ten klucz API?",
"pagertreeIntegrationUrl": "URL integracji",
"pagertreeUrgency": "Pilność",
"pagertreeSilent": "Cichy",
"pagertreeLow": "Niski",
"pagertreeMedium": "Średni",
"pagertreeHigh": "Wysoki",
"pagertreeCritical": "Krytyczny",
"pagertreeResolve": "Automatyczne rozwiązywanie",
"Clone Monitor": "Klonuj monitor",
"Clone": "Klonuj",
"cloneOf": "Klon {0}",
"API Keys": "Klucze API",
"Key Added": "Klucz dodany",
"pagertreeDoNothing": "Nie rób nic",
"wayToGetPagerTreeIntegrationURL": "Po utworzeniu integracji Uptime Kuma w PagerTree, należy skopiować Endpoint. Zobacz pełne szczegóły {0}",
"notificationRegional": "Regionalne",
"twilioFromNumber": "Z numeru",
"twilioToNumber": "Do numeru",
"lunaseaTarget": "Cel",
"twilioAccountSID": "SID konta",
"twilioAuthToken": "Token autoryzacyjny",
"apiKeyAddedMsg": "Twój klucz API został dodany. Prosimy o zanotowanie go, ponieważ nie będzie on już więcej pokazywany.",
"telegramMessageThreadID": "(Opcjonalne) ID wątku wiadomości",
"telegramMessageThreadIDDescription": "Opcjonalny Unikalny identyfikator dla docelowego wątku wiadomości (tematu) forum; tylko dla supergrup forum",
"telegramProtectContent": "Ochrona przekazywania/zapisywania",
"telegramProtectContentDescription": "Jeśli włączona, wiadomości bota w Telegramie będą chronione przed przekazywaniem i zapisywaniem.",
"telegramSendSilently": "Wyślij po cichu",
"telegramSendSilentlyDescription": "Wysyła wiadomość po cichu. Użytkownicy otrzymają powiadomienie bez dźwięku.",
"statusPageRefreshIn": "Odświeżenie w ciągu: {0}",
"lunaseaDeviceID": "ID urządzenia",
"lunaseaUserID": "ID użytkownika",
"Add New Tag": "Dodaj nowy tag"
} }

@ -8,7 +8,7 @@
"acceptedStatusCodesDescription": "Выберите коды статусов для определения доступности сервиса.", "acceptedStatusCodesDescription": "Выберите коды статусов для определения доступности сервиса.",
"passwordNotMatchMsg": "Повтор пароля не совпадает.", "passwordNotMatchMsg": "Повтор пароля не совпадает.",
"notificationDescription": "Привяжите уведомления к мониторам.", "notificationDescription": "Привяжите уведомления к мониторам.",
"keywordDescription": "Поиск слова в чистом HTML или в JSON-ответе (чувствительно к регистру)", "keywordDescription": "Поиск слова в чистом HTML или в JSON-ответе (чувствительно к регистру).",
"pauseDashboardHome": "Пауза", "pauseDashboardHome": "Пауза",
"deleteMonitorMsg": "Вы действительно хотите удалить данный монитор?", "deleteMonitorMsg": "Вы действительно хотите удалить данный монитор?",
"deleteNotificationMsg": "Вы действительно хотите удалить это уведомление для всех мониторов?", "deleteNotificationMsg": "Вы действительно хотите удалить это уведомление для всех мониторов?",
@ -45,9 +45,9 @@
"Uptime": "Аптайм", "Uptime": "Аптайм",
"Cert Exp.": "Сертификат истекает.", "Cert Exp.": "Сертификат истекает.",
"day": "день | дней", "day": "день | дней",
"-day": " дней", "-day": "-дней",
"hour": "час", "hour": "час",
"-hour": " часа", "-hour": "-часа",
"Response": "Ответ", "Response": "Ответ",
"Ping": "Пинг", "Ping": "Пинг",
"Monitor Type": "Тип монитора", "Monitor Type": "Тип монитора",
@ -124,12 +124,12 @@
"Also apply to existing monitors": "Применить к существующим мониторам", "Also apply to existing monitors": "Применить к существующим мониторам",
"Export": "Экспорт", "Export": "Экспорт",
"Import": "Импорт", "Import": "Импорт",
"backupDescription": "Вы можете сохранить резервную копию всех мониторов и уведомлений в виде JSON-файла", "backupDescription": "Вы можете сохранить резервную копию всех мониторов и уведомлений в виде JSON-файла.",
"backupDescription2": "P.S. История и события сохранены не будут", "backupDescription2": "Важно: история и события сохранены не будут.",
"backupDescription3": "Важные данные, такие как токены уведомлений, добавляются при экспорте, поэтому храните файлы в безопасном месте", "backupDescription3": "Важные данные, такие как токены уведомлений, добавляются при экспорте, поэтому храните файлы в безопасном месте.",
"alertNoFile": "Выберите файл для импорта.", "alertNoFile": "Выберите файл для импорта.",
"alertWrongFileType": "Выберите JSON-файл.", "alertWrongFileType": "Выберите JSON-файл.",
"twoFAVerifyLabel": "Пожалуйста, введите свой токен, чтобы проверить работу 2FA", "twoFAVerifyLabel": "Пожалуйста, введите свой токен, чтобы проверить работу 2FA:",
"tokenValidSettingsMsg": "Токен действителен! Теперь вы можете сохранить настройки 2FA.", "tokenValidSettingsMsg": "Токен действителен! Теперь вы можете сохранить настройки 2FA.",
"confirmEnableTwoFAMsg": "Вы действительно хотите включить 2FA?", "confirmEnableTwoFAMsg": "Вы действительно хотите включить 2FA?",
"confirmDisableTwoFAMsg": "Вы действительно хотите выключить 2FA?", "confirmDisableTwoFAMsg": "Вы действительно хотите выключить 2FA?",
@ -233,10 +233,10 @@
"smtpCC": "Копия", "smtpCC": "Копия",
"smtpBCC": "Скрытая копия", "smtpBCC": "Скрытая копия",
"Discord Webhook URL": "Discord вебхук URL", "Discord Webhook URL": "Discord вебхук URL",
"wayToGetDiscordURL": "Вы можете создать его в \"Настройки -> Интеграции -> Создать Вебхук\"", "wayToGetDiscordURL": "Вы можете создать его в настройках канала \"Настройки -> Интеграции -> Создать Вебхук\"",
"Bot Display Name": "Отображаемое имя бота", "Bot Display Name": "Отображаемое имя бота",
"Prefix Custom Message": "Свой префикс сообщения", "Prefix Custom Message": "Свой префикс сообщения",
"Hello @everyone is...": "Привет {'@'} всем это…", "Hello @everyone is...": "Привет {'@'}everyone это…",
"Webhook URL": "URL вебхука", "Webhook URL": "URL вебхука",
"wayToGetTeamsURL": "Как создать URL Вебхука вы можете узнать здесь - {0}.", "wayToGetTeamsURL": "Как создать URL Вебхука вы можете узнать здесь - {0}.",
"Number": "Номер", "Number": "Номер",
@ -441,14 +441,14 @@
"Accept characters:": "Принимаемые символы:", "Accept characters:": "Принимаемые символы:",
"startOrEndWithOnly": "Начинается или кончается только {0}", "startOrEndWithOnly": "Начинается или кончается только {0}",
"No consecutive dashes": "Без последовательных тире", "No consecutive dashes": "Без последовательных тире",
"The slug is already taken. Please choose another slug.": "The slug is already taken. Please choose another slug.", "The slug is already taken. Please choose another slug.": "Слово уже занято. Пожалуйста, выберите другой вариант.",
"Page Not Found": "Страница не найдена", "Page Not Found": "Страница не найдена",
"wayToGetCloudflaredURL": "(Скачать cloudflared с {0})", "wayToGetCloudflaredURL": "(Скачать cloudflared с {0})",
"cloudflareWebsite": "Cloudflare Website", "cloudflareWebsite": "Веб-сайт Cloudflare",
"Message:": "Сообщение:", "Message:": "Сообщение:",
"Don't know how to get the token? Please read the guide:": "Don't know how to get the token? Please read the guide:", "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.": "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.", "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. Вы уверены, что хотите это остановить? Введите свой текущий пароль, чтобы подтвердить это.",
"HTTP Headers": "HTTP заголовки", "HTTP Headers": "заголовки HTTP",
"Trust Proxy": "Доверять прокси", "Trust Proxy": "Доверять прокси",
"Other Software": "Другое программное обеспечение", "Other Software": "Другое программное обеспечение",
"For example: nginx, Apache and Traefik.": "К примеру: nginx, Apache и Traefik.", "For example: nginx, Apache and Traefik.": "К примеру: nginx, Apache и Traefik.",
@ -463,13 +463,13 @@
"Proxy": "Прокси", "Proxy": "Прокси",
"Date Created": "Дата создания", "Date Created": "Дата создания",
"HomeAssistant": "Home Assistant", "HomeAssistant": "Home Assistant",
"onebotHttpAddress": "OneBot HTTP Address", "onebotHttpAddress": "HTTP-адрес OneBot",
"onebotMessageType": "OneBot Message Type", "onebotMessageType": "Тип сообщения OneBot",
"onebotGroupMessage": "Группа", "onebotGroupMessage": "Группа",
"onebotPrivateMessage": "Private", "onebotPrivateMessage": "Private",
"onebotUserOrGroupId": "Группа/ID пользователя", "onebotUserOrGroupId": "ID группы или пользователя",
"onebotSafetyTips": "В целях безопасности необходимо установить токен доступа", "onebotSafetyTips": "В целях безопасности необходимо установить токен доступа",
"PushDeer Key": "PushDeer Key", "PushDeer Key": "ключ PushDeer",
"Footer Text": "Текст нижнего колонтитула", "Footer Text": "Текст нижнего колонтитула",
"Show Powered By": "Показывать на чем создано", "Show Powered By": "Показывать на чем создано",
"Domain Names": "Доменные имена", "Domain Names": "Доменные имена",
@ -488,40 +488,40 @@
"From Name/Number": "Имя/номер отправителя", "From Name/Number": "Имя/номер отправителя",
"Leave blank to use a shared sender number.": "Оставьте пустым, чтобы использовать общий номер отправителя.", "Leave blank to use a shared sender number.": "Оставьте пустым, чтобы использовать общий номер отправителя.",
"Octopush API Version": "Версия API Octopush", "Octopush API Version": "Версия API Octopush",
"Legacy Octopush-DM": "Legacy Octopush-DM", "Legacy Octopush-DM": "устаревший Octopush-DM",
"endpoint": "endpoint", "endpoint": "конечная точка",
"octopushAPIKey": "\"API key\" из учетных данных HTTP API в панели управления", "octopushAPIKey": "\"API key\" из учетных данных HTTP API в панели управления",
"octopushLogin": "\"Login\" из учетных данных HTTP API в панели управления", "octopushLogin": "\"Login\" из учетных данных HTTP API в панели управления",
"promosmsLogin": "Логин API", "promosmsLogin": "Логин API",
"promosmsPassword": "Пароль API", "promosmsPassword": "Пароль API",
"pushoversounds pushover": "Pushover (default)", "pushoversounds pushover": "Pushover (по умолчанию)",
"pushoversounds bike": "Bike", "pushoversounds bike": "Велосипед",
"pushoversounds bugle": "Bugle", "pushoversounds bugle": "Горн",
"pushoversounds cashregister": "Cash Register", "pushoversounds cashregister": "Кассовый аппарат",
"pushoversounds classical": "Classical", "pushoversounds classical": "Classical",
"pushoversounds cosmic": "Cosmic", "pushoversounds cosmic": "Космический",
"pushoversounds falling": "Falling", "pushoversounds falling": "Падающий",
"pushoversounds gamelan": "Gamelan", "pushoversounds gamelan": "Гамелан",
"pushoversounds incoming": "Incoming", "pushoversounds incoming": "Входящий",
"pushoversounds intermission": "Intermission", "pushoversounds intermission": "Антракт",
"pushoversounds magic": "Magic", "pushoversounds magic": "Магия",
"pushoversounds mechanical": "Mechanical", "pushoversounds mechanical": "Механический",
"pushoversounds pianobar": "Piano Bar", "pushoversounds pianobar": "Пиано-бар",
"pushoversounds siren": "Siren", "pushoversounds siren": "Сирена",
"pushoversounds spacealarm": "Space Alarm", "pushoversounds spacealarm": "Космическая сигнализация",
"pushoversounds tugboat": "Tug Boat", "pushoversounds tugboat": "Буксирное судно",
"pushoversounds alien": "Alien Alarm (long)", "pushoversounds alien": "Инопланетная тревога (долгое)",
"pushoversounds climb": "Climb (long)", "pushoversounds climb": "Подъем (долгое)",
"pushoversounds persistent": "Persistent (long)", "pushoversounds persistent": "Стойкий (долгое)",
"pushoversounds echo": "Pushover Echo (long)", "pushoversounds echo": "Pushover Эхо (долгое)",
"pushoversounds updown": "Up Down (long)", "pushoversounds updown": "Вверх вниз (долгое)",
"pushoversounds vibrate": "Vibrate Only", "pushoversounds vibrate": "Только вибрация",
"pushoversounds none": "None (silent)", "pushoversounds none": "Нет (тихо)",
"pushyAPIKey": "Secret API Key", "pushyAPIKey": "Секретный ключ API",
"pushyToken": "Токен устройства", "pushyToken": "Токен устройства",
"Using a Reverse Proxy?": "Используете обратный прокси?", "Using a Reverse Proxy?": "Используете обратный прокси?",
"Check how to config it for WebSocket": "Проверьте, как настроить его для WebSocket", "Check how to config it for WebSocket": "Проверьте, как настроить его для WebSocket",
"Steam Game Server": "Steam Game Server", "Steam Game Server": "Игровой сервер Steam",
"Most likely causes:": "Наиболее вероятные причины:", "Most likely causes:": "Наиболее вероятные причины:",
"The resource is no longer available.": "Ресурс больше не доступен.", "The resource is no longer available.": "Ресурс больше не доступен.",
"There might be a typing error in the address.": "В адресе может быть опечатка.", "There might be a typing error in the address.": "В адресе может быть опечатка.",
@ -536,24 +536,24 @@
"certificationExpiryDescription": "HTTPS Мониторы инициируют уведомление, когда срок действия сертификата TLS истечет:", "certificationExpiryDescription": "HTTPS Мониторы инициируют уведомление, когда срок действия сертификата TLS истечет:",
"Setup Docker Host": "Настроить Docker Host", "Setup Docker Host": "Настроить Docker Host",
"Connection Type": "Тип соединения", "Connection Type": "Тип соединения",
"Docker Daemon": "Docker Daemon", "Docker Daemon": "Демон Docker",
"deleteDockerHostMsg": "Are you sure want to delete this docker host for all monitors?", "deleteDockerHostMsg": "Вы уверены, что хотите удалить этот узел docker для всех мониторов?",
"socket": "Socket", "socket": "Сокет",
"tcp": "TCP / HTTP", "tcp": "TCP / HTTP",
"Docker Container": "Docker контейнер", "Docker Container": "Docker контейнер",
"Container Name / ID": "Название контейнера / ID", "Container Name / ID": "Название контейнера / ID",
"Docker Host": "Docker Host", "Docker Host": "Хост Docker",
"Docker Hosts": "Docker Hosts", "Docker Hosts": "Хосты Docker",
"ntfy Topic": "ntfy Topic", "ntfy Topic": "тема ntfy",
"Domain": "Домен", "Domain": "Домен",
"Workstation": "Workstation", "Workstation": "Рабочая станция",
"disableCloudflaredNoAuthMsg": "Вы находитесь в режиме без авторизации, пароль не требуется.", "disableCloudflaredNoAuthMsg": "Вы находитесь в режиме без авторизации, пароль не требуется.",
"trustProxyDescription": "Доверять заголовкам 'X-Forwarded-*'. Если вы хотите получить правильный IP-адрес клиента, а ваш Uptime Kuma находится под Nginx или Apache, вам следует включить этот параметр.", "trustProxyDescription": "Доверять заголовкам 'X-Forwarded-*'. Если вы хотите получить правильный IP-адрес клиента, а ваш Uptime Kuma находится под Nginx или Apache, вам следует включить этот параметр.",
"wayToGetLineNotifyToken": "Вы можете получить токен доступа в {0}", "wayToGetLineNotifyToken": "Вы можете получить токен доступа в {0}",
"Examples": "Примеры", "Examples": "Примеры",
"Home Assistant URL": "Home Assistant URL", "Home Assistant URL": "URL-адрес Home Assistant",
"Long-Lived Access Token": "Токен доступа с длительным сроком службы", "Long-Lived Access Token": "Токен доступа с длительным сроком службы",
"Long-Lived Access Token can be created by clicking on your profile name (bottom left) and scrolling to the bottom then click Create Token. ": "Long-Lived Access Token can be created by clicking on your profile name (bottom left) and scrolling to the bottom then click Create Token. ", "Long-Lived Access Token can be created by clicking on your profile name (bottom left) and scrolling to the bottom then click Create Token. ": "Токен доступа с длительным сроком действия можно создать, нажав на имя вашего профиля (внизу слева) и прокрутив его вниз, затем нажмите Создать токен. ",
"Notification Service": "Служба уведомлений", "Notification Service": "Служба уведомлений",
"default: notify all devices": "по стандарту: уведомлять все устройства", "default: notify all devices": "по стандарту: уведомлять все устройства",
"A list of Notification Services can be found in Home Assistant under \"Developer Tools > Services\" search for \"notification\" to find your device/phone name.": "Список служб уведомлений можно найти в Home Assistant в разделе \"Инструменты разработчика > Службы\", выполнив поиск по слову \"уведомление\", чтобы найти название вашего устройства/телефона.", "A list of Notification Services can be found in Home Assistant under \"Developer Tools > Services\" search for \"notification\" to find your device/phone name.": "Список служб уведомлений можно найти в Home Assistant в разделе \"Инструменты разработчика > Службы\", выполнив поиск по слову \"уведомление\", чтобы найти название вашего устройства/телефона.",
@ -565,7 +565,7 @@
"Frontend Version": "Версия интерфейса", "Frontend Version": "Версия интерфейса",
"Frontend Version do not match backend version!": "Версия интерфейса не соответствует версии серверной части!", "Frontend Version do not match backend version!": "Версия интерфейса не соответствует версии серверной части!",
"Base URL": "Базовый URL", "Base URL": "Базовый URL",
"goAlertInfo": "GoAlert is a An open source application for on-call scheduling, automated escalations and notifications (like SMS or voice calls). Automatically engage the right person, the right way, and at the right time! {0}", "goAlertInfo": "GoAlert — это приложение с открытым исходным кодом для составления расписания вызовов, автоматической эскалации и уведомлений (например, SMS или голосовых звонков). Автоматически привлекайте нужного человека, нужным способом и в нужное время! {0}",
"goAlertIntegrationKeyInfo": "Получить общий ключ интеграции API для сервиса в этом формате \"aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee\" обычно значение параметра токена скопированного URL.", "goAlertIntegrationKeyInfo": "Получить общий ключ интеграции API для сервиса в этом формате \"aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee\" обычно значение параметра токена скопированного URL.",
"goAlert": "GoAlert", "goAlert": "GoAlert",
"backupOutdatedWarning": "Устарело: поскольку добавлено множество функций, а эта функция резервного копирования немного не поддерживается, она не может создать или восстановить полную резервную копию.", "backupOutdatedWarning": "Устарело: поскольку добавлено множество функций, а эта функция резервного копирования немного не поддерживается, она не может создать или восстановить полную резервную копию.",
@ -618,7 +618,7 @@
"Custom CSS": "Пользовательские CSS", "Custom CSS": "Пользовательские CSS",
"weekdayShortTue": "Вт", "weekdayShortTue": "Вт",
"dayOfWeek": "День недели", "dayOfWeek": "День недели",
"confirmDeleteTagMsg": "Вы уверены, что хотите удалить этот тег? Мониторы с этим тегом удалены не будут.", "confirmDeleteTagMsg": "Вы уверены, что хотите удалить этот тег? Мониторы, связанные с этим тегом не будут удалены.",
"loadingError": "Невозможно получить данные, пожалуйста попробуйте позже.", "loadingError": "Невозможно получить данные, пожалуйста попробуйте позже.",
"Packet Size": "Размер пакета", "Packet Size": "Размер пакета",
"warningTimezone": "Используется часовой пояс сервера", "warningTimezone": "Используется часовой пояс сервера",
@ -630,7 +630,7 @@
"lastDay2": "Второй последний день месяца", "lastDay2": "Второй последний день месяца",
"lastDay3": "Третий последний день месяца", "lastDay3": "Третий последний день месяца",
"lastDay4": "Четвертый последний день месяца", "lastDay4": "Четвертый последний день месяца",
"No Maintenance": "Ничего не обслуживается", "No Maintenance": "Без обслуживания",
"pauseMaintenanceMsg": "Вы уверены что хотите поставить на паузу?", "pauseMaintenanceMsg": "Вы уверены что хотите поставить на паузу?",
"maintenanceStatus-under-maintenance": "На техобслуживании", "maintenanceStatus-under-maintenance": "На техобслуживании",
"maintenanceStatus-inactive": "Неактивен", "maintenanceStatus-inactive": "Неактивен",
@ -647,7 +647,7 @@
"Single Maintenance Window": "Единое Окно Обслуживания", "Single Maintenance Window": "Единое Окно Обслуживания",
"Schedule Maintenance": "Запланировать обслуживание", "Schedule Maintenance": "Запланировать обслуживание",
"Date and Time": "Дата и Время", "Date and Time": "Дата и Время",
"DateTime Range": "Промежуток Даты и Времени", "DateTime Range": "Промежуток даты и времени",
"uninstalling": "Удаляется", "uninstalling": "Удаляется",
"dataRetentionTimeError": "Период хранения должен быть равен 0 или больше", "dataRetentionTimeError": "Период хранения должен быть равен 0 или больше",
"infiniteRetention": "Установите 0 для бессрочного хранения.", "infiniteRetention": "Установите 0 для бессрочного хранения.",
@ -664,6 +664,99 @@
"install": "Установить", "install": "Установить",
"installing": "Устанавливается", "installing": "Устанавливается",
"uninstall": "Удалить", "uninstall": "Удалить",
"Recurring": "Повторяющийся", "Recurring": "Текущий",
"recurringInterval": "Интервал" "recurringInterval": "Интервал",
"smseagle": "SMSEagle",
"Google Analytics ID": "ID Google Аналитики",
"wayToGetZohoCliqURL": "Вы можете узнать как создать webhook URL тут {0}.",
"Effective Date Range": "Даты действия (Опционально)",
"wayToGetKookGuildID": "Включите \"Режим разработчика\" в настройках Kook, а затем нажмите правой кнопкой по гильдии чтобы скопировать её ID",
"Enable TLS": "Включить TLS",
"Integration Key": "Ключ интеграции",
"Integration URL": "URL интеграции",
"do nothing": "ничего не делать",
"smseagleTo": "Номер(а) телефона",
"smseagleGroup": "Название(я) групп телефонной книги",
"smseagleContact": "Имена контактов из телефонной книжки",
"smseagleRecipientType": "Тип получателя",
"smseagleRecipient": "Получатель(я) (через запятую, если необходимо указать несколько)",
"smseagleToken": "Токен доступа API",
"smseagleUrl": "URL вашего SMSEagle устройства",
"smseagleEncoding": "Отправить в юникоде",
"smseaglePriority": "Приоритет сообщения (0-9, по умолчанию = 0)",
"Server Address": "Адрес сервера",
"Learn More": "Узнать больше",
"topicExplanation": "MQTT топик для мониторинга",
"Guild ID": "Идентификатор гильдии",
"Kook": "Kook",
"wayToGetKookBotToken": "Создайте приложение и получите токен бота по адресу {0}",
"Resend Notification if Down X times consecutively": "Повторная отправка уведомления при падении несколько раз",
"telegramProtectContent": "Запретить пересылку/сохранение",
"telegramProtectContentDescription": "Если включено, сообщения бота в Telegram будут запрещены для пересылки и сохранения.",
"telegramSendSilently": "Отправить без звука",
"telegramSendSilentlyDescription": "Пользователи получат уведомление без звука.",
"Maintenance Time Window of a Day": "Суточный интервал для обслуживания",
"Clone Monitor": "Копия",
"Clone": "Копия",
"cloneOf": "Копия {0}",
"notificationRegional": "Региональный",
"Add New Tag": "Добавить тег",
"Body Encoding": "Тип содержимого запроса.(JSON or XML)",
"Strategy": "Стратегия",
"Free Mobile User Identifier": "Бесплатный идентификатор мобильного пользователя",
"Auto resolve or acknowledged": "Автоматическое разрешение или подтверждение",
"auto acknowledged": "автоматическое подтверждение",
"auto resolve": "автоматическое разрешение",
"API Keys": "Ключи API",
"Expiry": "Истекает",
"Expiry date": "Дата окончания действия",
"Don't expire": "Не истекает",
"Continue": "Продолжать",
"Add Another": "Добавьте еще один",
"Key Added": "Ключ добавлен",
"Add API Key": "Добавить ключ API",
"No API Keys": "Нет API ключей",
"apiKey-active": "Активный",
"apiKey-expired": "Истёк",
"apiKey-inactive": "Неактивный",
"Expires": "Истекает",
"disableAPIKeyMsg": "Вы уверены, что хотите отключить этот ключ?",
"Generate": "Сгенерировать",
"pagertreeResolve": "Автоматическое разрешение",
"pagertreeDoNothing": "ничего не делать",
"lunaseaTarget": "Цель",
"lunaseaDeviceID": "Идентификатор устройства",
"lunaseaUserID": "Идентификатор пользователя",
"Lowcost": "Низкая стоимость",
"pagertreeIntegrationUrl": "URL-адрес интеграции",
"pagertreeUrgency": "Срочность",
"pagertreeSilent": "Тихий",
"pagertreeLow": "Низкий",
"pagertreeMedium": "Средний",
"pagertreeHigh": "Высокий",
"pagertreeCritical": "Критический",
"high": "высокий",
"promosmsAllowLongSMS": "Разрешить длинные SMS-сообщения",
"Economy": "Экономия",
"wayToGetPagerDutyKey": "Вы можете получить это, перейдя в службу -> Каталог служб -> (Выберите службу) -> Интеграции -> Добавить интеграцию. Здесь вы можете выполнить поиск по \"Events API V2\". Дополнительная информация {0}",
"apiKeyAddedMsg": "Ваш API ключ был добавлен. Пожалуйста, запишите это, так как оно больше не будет показан.",
"deleteAPIKeyMsg": "Вы уверены, что хотите удалить этот ключ API?",
"wayToGetPagerTreeIntegrationURL": "После создания интеграции Uptime Kuma в PagerTree, скопируйте конечную точку. Смотрите полную информацию {0}",
"telegramMessageThreadIDDescription": "Необязательный уникальный идентификатор для цепочки сообщений (темы) форума; только для форумов-супергрупп",
"grpcMethodDescription": "Название метода - преобразовать в формат cammelCase, такой как sayHello, check и т.д.",
"Proto Service Name": "название службы Proto",
"Proto Method": "Метод Proto",
"Proto Content": "Содержание Proto",
"telegramMessageThreadID": "(Необязательно) ID цепочки сообщений",
"statusPageRefreshIn": "Обновлять каждые: {0}",
"twilioAccountSID": "SID учетной записи",
"twilioAuthToken": "Токен авторизации",
"twilioFromNumber": "С номера",
"twilioToNumber": "На номер",
"sameAsServerTimezone": "Аналогично часовому поясу сервера",
"startDateTime": "Начальная дата и время",
"endDateTime": "Конечная дата и время",
"cronExpression": "Выражение для Cron",
"cronSchedule": "Расписание: ",
"invalidCronExpression": "Неверное выражение Cron: {0}"
} }

@ -0,0 +1,195 @@
{
"Settings": "Nastavenia",
"Help": "Nápoveda",
"New Update": "Nová aktualizácia",
"Language": "Jazyk",
"Appearance": "Vzhľad",
"Theme": "Téma",
"General": "Základné",
"Primary Base URL": "Základná URL",
"Version": "Verzia",
"List": "Zoznam",
"Add": "Pridať",
"Add New Monitor": "Pridať nové Sledovanie",
"Quick Stats": "Rýchly prehľad",
"Pending": "Čaká sa",
"statusMaintenance": "Údržba",
"Maintenance": "Údržba",
"General Monitor Type": "Základný typ Sledovania",
"Passive Monitor Type": "Pasívny typ Sledovania",
"Specific Monitor Type": "Špecifický typ Sledovania",
"pauseDashboardHome": "Pauza",
"Pause": "Pauza",
"Status": "Stav",
"Message": "Správa",
"No important events": "Žiadne dôležité udalosti",
"Edit": "Upraviť",
"Delete": "Odstrániť",
"Current": "Aktuálne",
"Cert Exp.": "Platnosť cert.",
"day": "deň | dni",
"hour": "hodina",
"Response": "Odpoveď",
"Ping": "Ping",
"Keyword": "Kľúčové slovo",
"Friendly Name": "Názov",
"Port": "Port",
"Retries": "Opakovania",
"Resend Notification if Down X times consecutively": "Poslať oznámenie znovu, ak je nedostupné X-krát za sebou",
"Advanced": "Pokročilé",
"checkEverySecond": "Skontrolovať každých {0} sekúnd",
"retryCheckEverySecond": "Zopakovať každých {0} sekúnd",
"resendEveryXTimes": "Znovu poslať každých {0} krát",
"resendDisabled": "Opakované odoslanie vypnuté",
"ignoreTLSError": "Ignorovať TLS/SSL chyby pre HTTPS stránky",
"upsideDownModeDescription": "Obrátiť stav. Pokiaľ je služba dostupná, zobrazuje sa ako NEDOSTUPNÁ.",
"Upside Down Mode": "Obrátený režim",
"Max. Redirects": "Max. počet presmerovaní",
"Accepted Status Codes": "Akceptované stavové kódy",
"Push URL": "Push URL",
"Save": "Uložiť",
"Notifications": "Notifikácie",
"Not available, please setup.": "Nedostupné, prosím nastavte.",
"Setup Notification": "Nastavenie notifikácií",
"Dark": "Tmavá",
"Light": "Svetlá",
"Auto": "Automaticky",
"Normal": "Normálna",
"Bottom": "Dole",
"None": "Žiadne",
"Timezone": "Časová zóna",
"languageName": "Slovenčina",
"Dashboard": "Dashboard",
"Check Update On GitHub": "Skontrolovať aktualizáciu na GitHub-e",
"Up": "Dostupné",
"Down": "Nedostupné",
"Unknown": "Neznáme",
"markdownSupported": "Podpora Markdown syntaxu",
"Name": "Názov",
"DateTime": "Dátum a čas",
"Resume": "Pokračovať",
"Uptime": "Doba prevádzky",
"Monitor": "Sledovanie | Sledovania",
"-day": "-dní",
"-hour": "-hodín",
"Monitor Type": "Typ Sledovania",
"URL": "URL",
"Hostname": "Adresa",
"Heartbeat Interval": "Heartbeat Interval",
"Heartbeat Retry Interval": "Interval opakovania pre Heartbeat",
"retriesDescription": "Maximálny počet opakovaní pred tým, ako je služba označená ako nedostupná a je zaslaná notifikácia",
"maxRedirectDescription": "Maximálny počet presmerovaní. Hodnota 0 vypne presmerovania.",
"needPushEvery": "Tuto adresu by ste mali volať každých {0} sekúnd.",
"pushOptionalParams": "Voliteľné parametre: {0}",
"Theme - Heartbeat Bar": "Téma - Heartbeat riadok",
"Game": "Hra",
"Search Engine Visibility": "Viditeľnosť vyhľadávačmi",
"Allow indexing": "Povoliť indexovanie",
"Change Password": "Zmeniť heslo",
"Current Password": "Aktuálne heslo",
"New Password": "Nové heslo",
"Repeat New Password": "Zopakovať nové heslo",
"Update Password": "Aktualizovať heslo",
"Disable Auth": "Vypnúť autentifikáciu",
"Enable Auth": "Zapnúť autentifikáciu",
"Please use this option carefully!": "Túto možnosť používajte opatrne!",
"Logout": "Odhlásiť sa",
"Leave": "Odísť",
"I understand, please disable": "Rozumiem, vypnite to",
"Yes": "Áno",
"No": "Nie",
"Username": "Používateľské meno",
"Password": "Heslo",
"Login": "Prihlásiť sa",
"No Monitors, please": "Žiadne sledovanie, prosím",
"add one": "pridať jeden",
"Notification Type": "Typ notifikácie",
"Email": "E-mail",
"Test": "Test",
"Certificate Info": "Informácie o certifikáte",
"Resolver Server": "DNS server",
"Last Result": "Posledný výsledok",
"Repeat Password": "Zopakovať heslo",
"Import Backup": "Importovať zálohu",
"Export Backup": "Exportovať zálohu",
"Export": "Exportovať",
"Import": "Importovať",
"respTime": "Čas odozvy (ms)",
"notAvailableShort": "Nie je číslo",
"Default enabled": "Predvolene povolené",
"Create": "Vytvoriť",
"Clear Data": "Vyčistiť dáta",
"Events": "Udalosti",
"Heartbeats": "Odpovede",
"Auto Get": "Získať automaticky",
"Schedule maintenance": "Naplánovať údržbu",
"Affected Monitors": "Dotknuté sledovania",
"Pick Affected Monitors...": "Vybrať dotknuté sledovania…",
"Start of maintenance": "Začiatok údržby",
"All Status Pages": "Všetky stavové stránky",
"Select status pages...": "Vybrať stránky stavu…",
"alertNoFile": "Vyberte súbor na import.",
"alertWrongFileType": "Vyberte súbor JSON.",
"Clear all statistics": "Vymazať všetky štatistiky",
"Skip existing": "Preskočiť existujúce",
"Overwrite": "Prepísať",
"Options": "Možnosti",
"Keep both": "Ponechať obe",
"Setup 2FA": "Nastavenie 2FA",
"Disable 2FA": "Zakázať 2FA",
"2FA Settings": "Nastavenia 2FA",
"Two Factor Authentication": "Dvojfaktorová autentifikácia",
"Inactive": "Neaktívne",
"Token": "Token",
"Show URI": "Zobraziť URI",
"Tags": "Značky",
"Add New below or Select...": "Pridať novú nižšie alebo vybrať…",
"Tag with this value already exist.": "Značka s touto hodnotou už existuje.",
"color": "Farba",
"value (optional)": "hodnota (voliteľné)",
"Gray": "Šedá",
"Red": "Červená",
"Orange": "Oranžová",
"Green": "Zelená",
"Indigo": "Indigo",
"Purple": "Fialová",
"Pink": "Ružová",
"Custom": "Vlastná",
"Avg. Ping": "Priemerný ping",
"Avg. Response": "Priemerný čas odpovede",
"Entry Page": "Vstupná stránka",
"No Services": "Žiadne služby",
"All Systems Operational": "Všetky systémy funkčné",
"Partially Degraded Service": "Čiastočne zhoršená služba",
"Degraded Service": "Degradovaná služba",
"Add Group": "Pridať skupinu",
"Add a monitor": "Pridať sledovanie",
"Edit Status Page": "Upraviť stavovú stránku",
"Go to Dashboard": "Prejdite na informačný panel",
"Status Page": "Stavová stránka",
"Status Pages": "Stavové stránky",
"defaultNotificationName": "Moje {notification} upozornenie ({number})",
"here": "tu",
"Required": "Povinné",
"Post URL": "Post URL",
"Content Type": "Druh obsahu",
"webhookJsonDesc": "{0} je vhodný pre všetky moderné servery HTTP, ako napríklad Express.js",
"webhookFormDataDesc": "{multipart} je dobré pre PHP. JSON bude potrebné analyzovať pomocou {decodeFunction}",
"Generate": "Generovať",
"Discourage search engines from indexing site": "Odradiť vyhľadávacie nástroje od indexovania stránky",
"disableauth.message1": "Ste si istý, že chcete <strong>vypnúť autentifikáciu</strong>?",
"disableauth.message2": "Je navrhnutý pre scenáre, <strong>kde máte v úmysle implementovať autentifikáciu treťou stranou</strong> pred Uptime Kuma, ako je Cloudflare Access, Authelia alebo iné autentifikačné mechanizmy.",
"Confirm": "Potvrdiť",
"Remember me": "Zapamätať si ma",
"Resource Record Type": "Typ záznamu",
"Create your admin account": "Vytvorte si účet administrátora",
"Apply on all existing monitors": "Aplikujte na všetky existujúce sledovania",
"Verify Token": "Overiť token",
"Enable 2FA": "Povoliť 2FA",
"Active": "Aktívne",
"Add New Tag": "Pridať novú značku",
"Tag with this name already exist.": "Značka s týmto názvom už existuje.",
"Blue": "Modrá",
"Search...": "Hľadať…",
"statusPageNothing": "Nič tu nie je, pridajte skupinu alebo sledovanie."
}

@ -4,7 +4,7 @@
"retryCheckEverySecond": "ลองใหม่ทุก {0} วินาที", "retryCheckEverySecond": "ลองใหม่ทุก {0} วินาที",
"retriesDescription": "จำนวนครั้งสูงสุดที่จะลองก่อนบริการถูกระบุว่าไม่สามารถใช้งานได้และส่งการแจ้งเตือน", "retriesDescription": "จำนวนครั้งสูงสุดที่จะลองก่อนบริการถูกระบุว่าไม่สามารถใช้งานได้และส่งการแจ้งเตือน",
"ignoreTLSError": "ไม่สนใจข้อผิดพลาด TLS/SSL สำหรับเว็บไซต์ HTTPS", "ignoreTLSError": "ไม่สนใจข้อผิดพลาด TLS/SSL สำหรับเว็บไซต์ HTTPS",
"upsideDownModeDescription": "กลับด้านสถานะ เช่น ถ้าบริการสามารถใช้งานได้จะถูกเปลี่ยนเป็นใช้งานไม่ได้", "upsideDownModeDescription": "สลับสถานะ เช่น ถ้าบริการสามารถใช้งานได้จะถูกเปลี่ยนเป็นใช้งานไม่ได้",
"maxRedirectDescription": "จำนวนครั้งสูงสุดที่จะเปลี่ยนเส้นทาง, ตั้งเป็น 0 เพื่อปิดการเปลี่ยนเส้นทาง", "maxRedirectDescription": "จำนวนครั้งสูงสุดที่จะเปลี่ยนเส้นทาง, ตั้งเป็น 0 เพื่อปิดการเปลี่ยนเส้นทาง",
"acceptedStatusCodesDescription": "เลือกรหัสสถานะที่ถือว่าการตอบกลับสำเร็จ", "acceptedStatusCodesDescription": "เลือกรหัสสถานะที่ถือว่าการตอบกลับสำเร็จ",
"passwordNotMatchMsg": "รหัสผ่านไม่ตรงกัน", "passwordNotMatchMsg": "รหัสผ่านไม่ตรงกัน",
@ -30,7 +30,7 @@
"Dashboard": "แผงควบคุม", "Dashboard": "แผงควบคุม",
"New Update": "อัพเดทใหม่", "New Update": "อัพเดทใหม่",
"Language": "ภาษา", "Language": "ภาษา",
"Appearance": "รูปร่าง", "Appearance": "หน้าตา",
"Theme": "หน้าตา", "Theme": "หน้าตา",
"General": "ทั่วไป", "General": "ทั่วไป",
"Primary Base URL": "URL หลัก", "Primary Base URL": "URL หลัก",
@ -73,7 +73,7 @@
"Retries": "จำนวนครั้งที่จะลองใหม่", "Retries": "จำนวนครั้งที่จะลองใหม่",
"Heartbeat Retry Interval": "ระยะห่างระหว่างการทดสอบใหม่หลังจากไม่สำเร็จ", "Heartbeat Retry Interval": "ระยะห่างระหว่างการทดสอบใหม่หลังจากไม่สำเร็จ",
"Advanced": "ขั้นสูง", "Advanced": "ขั้นสูง",
"Upside Down Mode": "โหมดกลับด้าน", "Upside Down Mode": "โหมดสลับ",
"Max. Redirects": "จำนวนการเปลี่ยนเส้นทางสูงสุด", "Max. Redirects": "จำนวนการเปลี่ยนเส้นทางสูงสุด",
"Accepted Status Codes": "รหัสสถานะที่ยอมรับ", "Accepted Status Codes": "รหัสสถานะที่ยอมรับ",
"Push URL": "URL เป้าหมาย", "Push URL": "URL เป้าหมาย",
@ -473,8 +473,8 @@
"Recipient Number": "หมายเลขผู้รับ", "Recipient Number": "หมายเลขผู้รับ",
"From Name/Number": "จาก ชื่อ / หมายเลข", "From Name/Number": "จาก ชื่อ / หมายเลข",
"Leave blank to use a shared sender number.": "ไม่ต้องกรอกเพื่อใช้ชื่อผู้ส่งร่วมกัน", "Leave blank to use a shared sender number.": "ไม่ต้องกรอกเพื่อใช้ชื่อผู้ส่งร่วมกัน",
"Octopush API Version": "Octopush API Version", "Octopush API Version": "เวอร์ชั่น API Octopush",
"Legacy Octopush-DM": "Legacy Octopush-DM", "Legacy Octopush-DM": "Octopush-DM แบบเก่า",
"endpoint": "endpoint", "endpoint": "endpoint",
"octopushAPIKey": "\"API key\" จากข้อมูลยืนยันตัวตน HTTP API ในแผงควบคุม", "octopushAPIKey": "\"API key\" จากข้อมูลยืนยันตัวตน HTTP API ในแผงควบคุม",
"octopushLogin": "\"Login\" จากข้อมูลยืนยันตัวตน HTTP API ในแผงควบคุม", "octopushLogin": "\"Login\" จากข้อมูลยืนยันตัวตน HTTP API ในแผงควบคุม",
@ -558,7 +558,7 @@
"Container Name / ID": "Container Name / ID", "Container Name / ID": "Container Name / ID",
"Docker Host": "Docker Host", "Docker Host": "Docker Host",
"Docker Hosts": "Docker Hosts", "Docker Hosts": "Docker Hosts",
"ntfy Topic": "ntfy Topic", "ntfy Topic": "หัวข้อ ntfy",
"Domain": "โดเมน", "Domain": "โดเมน",
"Workstation": "Workstation", "Workstation": "Workstation",
"disableCloudflaredNoAuthMsg": "คุณอยู่ในโหมดไม่มีการตรวจสอบสิทธิ์, ไม่จำเป็นต้องมีรหัสผ่าน", "disableCloudflaredNoAuthMsg": "คุณอยู่ในโหมดไม่มีการตรวจสอบสิทธิ์, ไม่จำเป็นต้องมีรหัสผ่าน",
@ -601,5 +601,9 @@
"or": "หรือ", "or": "หรือ",
"recurringInterval": "ช่วงเวลา", "recurringInterval": "ช่วงเวลา",
"Recurring": "ทำซ้ำ", "Recurring": "ทำซ้ำ",
"General Monitor Type": "ชนิดมอนิเตอร์ทั่วไป" "General Monitor Type": "ชนิดมอนิเตอร์ทั่วไป",
"pagertreeCritical": "วิกฤต",
"pagertreeDoNothing": "ไม่ต้องทำอะไร",
"pagertreeResolve": "แก้ไขอัตโนมัติ",
"wayToGetPagerTreeIntegrationURL": "หลังจากสร้างการรวม Uptime Kuma ใน PagerTree แล้ว ให้คัดลอก Endpoint, ดูรายละเอียดทั้งหมด {0}"
} }

@ -379,7 +379,7 @@
"alerta": "Alerta", "alerta": "Alerta",
"alertaApiEndpoint": "API Endpoint", "alertaApiEndpoint": "API Endpoint",
"alertaEnvironment": "Environment", "alertaEnvironment": "Environment",
"alertaApiKey": "API Key", "alertaApiKey": "API Anahtarı",
"alertaAlertState": "Uyarı Durumu", "alertaAlertState": "Uyarı Durumu",
"alertaRecoverState": "Kurtarma Durumu", "alertaRecoverState": "Kurtarma Durumu",
"deleteStatusPageMsg": "Bu durum sayfasını silmek istediğinizden emin misiniz?", "deleteStatusPageMsg": "Bu durum sayfasını silmek istediğinizden emin misiniz?",
@ -648,7 +648,7 @@
"dnsCacheDescription": "Bazı IPv6 ortamlarında çalışmıyor olabilir, herhangi bir sorunla karşılaşırsanız devre dışı bırakın.", "dnsCacheDescription": "Bazı IPv6 ortamlarında çalışmıyor olabilir, herhangi bir sorunla karşılaşırsanız devre dışı bırakın.",
"Single Maintenance Window": "Tek Seferlik Bakım", "Single Maintenance Window": "Tek Seferlik Bakım",
"Maintenance Time Window of a Day": "Bür Günlük Bakım", "Maintenance Time Window of a Day": "Bür Günlük Bakım",
"Effective Date Range": "Bakim Tarih Aralığı", "Effective Date Range": "Geçerlilik Tarihi Aralığı (Opsiyonel)",
"Schedule Maintenance": "Bakım Planla", "Schedule Maintenance": "Bakım Planla",
"Date and Time": "Tarih ve Saat", "Date and Time": "Tarih ve Saat",
"DateTime Range": "Tarih ve Saat Aralığı", "DateTime Range": "Tarih ve Saat Aralığı",
@ -693,8 +693,61 @@
"line": "Line Messenger", "line": "Line Messenger",
"mattermost": "Mattermost", "mattermost": "Mattermost",
"markdownSupported": "Markdown yazım formatı desteklenir", "markdownSupported": "Markdown yazım formatı desteklenir",
"Google Analytics ID": "Google Analytics ID", "Google Analytics ID": "Google Analytics Kodu",
"Edit Tag": "Etiketi Düzenle", "Edit Tag": "Etiketi Düzenle",
"Learn More": "Daha fazla bilgi edin", "Learn More": "Daha fazla bilgi edin",
"Server Address": "Sunucu Adresi" "Server Address": "Sunucu Adresi",
"telegramMessageThreadIDDescription": "Forumun hedef ileti dizisi (konusu) için isteğe bağlı benzersiz kimlik; yalnızca forum üst grupları için geçerli",
"telegramMessageThreadID": "(İsteğe bağlı) Mesaj Thread ID",
"notificationRegional": "Bölgesel",
"telegramSendSilently": "Sessizce Gönder",
"telegramSendSilentlyDescription": "Mesajı sessizce gönderir. Kullanıcılar sessiz bir bildirim alacaktır.",
"telegramProtectContent": "Yönlendirmeyi/Kaydetmeyi Koru",
"telegramProtectContentDescription": "Etkinleştirilirse, Telegram'daki bot mesajları iletilmeye ve kaydedilmeye karşı korunacaktır.",
"Body Encoding": "JSON veya XML olabilen HTTP İstek Gövdesinin Kodlaması. İstek İçeriği Türü olarak da bilinir: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Type",
"Clone Monitor": "Klon Monitör",
"Clone": "Klon",
"cloneOf": "{0} Monitörünün Klonu",
"Expiry": "son kullanma tarihi",
"Expiry date": "Son kullanma tarihi",
"Don't expire": "sona erme",
"Continue": "Devam etmek",
"Key Added": "Anahtar Eklendi",
"Add API Key": "API Anahtarı Ekle",
"No API Keys": "API Anahtarı Yok",
"apiKey-active": "Aktif",
"apiKey-expired": "Günü geçmiş",
"apiKey-inactive": "etkin değil",
"Expires": "süresi doluyor",
"disableAPIKeyMsg": "Bu API anahtarını devre dışı bırakmak istediğinizden emin misiniz?",
"deleteAPIKeyMsg": "Bu API anahtarını silmek istediğinizden emin misiniz?",
"Generate": "oluştur",
"API Keys": "api anahtarları",
"Add Another": "Başka birtane ekle",
"apiKeyAddedMsg": "API anahtarınız eklendi. Bir daha gösterilmeyeceği için lütfen not edin.",
"pagertreeUrgency": "Önem",
"pagertreeSilent": "Sessiz",
"pagertreeLow": "Düşük",
"pagertreeMedium": "Orta",
"pagertreeHigh": "Yüksek",
"pagertreeCritical": "Kritik",
"pagertreeDoNothing": "Hiçbir şey yapma",
"wayToGetPagerTreeIntegrationURL": "PagerTree'de Uptime Kuma entegrasyonunu oluşturduktan sonra Endpoint'i kopyalayın. Tüm ayrıntıları görün {0}",
"pagertreeIntegrationUrl": "Entegrasyon URL",
"pagertreeResolve": "Otomatik Çöz",
"lunaseaTarget": "Hedef",
"Add New Tag": "Yeni Etiket Ekle",
"lunaseaDeviceID": "Cihaz ID",
"lunaseaUserID": "Kullanıcı ID",
"statusPageRefreshIn": "{0} içinde yenilenecek",
"twilioAuthToken": "Kimlik Doğrulama Jetonu",
"twilioFromNumber": "Gönderen Numara",
"twilioToNumber": "Alıcı Numara",
"twilioAccountSID": "Hesap ID",
"sameAsServerTimezone": "Sunucu Saat Dilimi ile aynı",
"startDateTime": "Başlangıç Tarihi/Saati",
"endDateTime": "Bitiş Tarihi/Saati",
"cronExpression": "Cron İfadesi",
"cronSchedule": "Zamanlama: ",
"invalidCronExpression": "Geçersiz Cron İfadesi: {0}"
} }

@ -8,7 +8,7 @@
"acceptedStatusCodesDescription": "Виберіть коди статусів для визначення доступності сервісу.", "acceptedStatusCodesDescription": "Виберіть коди статусів для визначення доступності сервісу.",
"passwordNotMatchMsg": "Повторення паролю не збігається.", "passwordNotMatchMsg": "Повторення паролю не збігається.",
"notificationDescription": "Прив'яжіть сповіщення до моніторів.", "notificationDescription": "Прив'яжіть сповіщення до моніторів.",
"keywordDescription": "Пошук слова в чистому HTML або JSON-відповіді (чутливо до регістру)", "keywordDescription": "Пошук слова в чистому HTML або JSON-відповіді. Пошук чутливий до регістру.",
"pauseDashboardHome": "Пауза", "pauseDashboardHome": "Пауза",
"deleteMonitorMsg": "Ви дійсно хочете видалити цей монітор?", "deleteMonitorMsg": "Ви дійсно хочете видалити цей монітор?",
"deleteNotificationMsg": "Ви дійсно хочете видалити це сповіщення для всіх моніторів?", "deleteNotificationMsg": "Ви дійсно хочете видалити це сповіщення для всіх моніторів?",
@ -124,12 +124,12 @@
"Also apply to existing monitors": "Застосувати до існуючих моніторів", "Also apply to existing monitors": "Застосувати до існуючих моніторів",
"Export": "Експорт", "Export": "Експорт",
"Import": "Імпорт", "Import": "Імпорт",
"backupDescription": "Ви можете зберегти резервну копію всіх моніторів та повідомлень у вигляді JSON-файлу", "backupDescription": "Ви можете зберегти резервну копію всіх моніторів та повідомлень у вигляді JSON-файлу.",
"backupDescription2": "P.S.: Історія та події збережені не будуть", "backupDescription2": "P.S.: Історія та події збережені не будуть.",
"backupDescription3": "Важливі дані, такі як токени повідомлень, додаються під час експорту, тому зберігайте файли в безпечному місці", "backupDescription3": "Важливі дані, такі як токени повідомлень, додаються під час експорту, тому зберігайте файли в безпечному місці.",
"alertNoFile": "Виберіть файл для імпорту.", "alertNoFile": "Виберіть файл для імпорту.",
"alertWrongFileType": "Виберіть JSON-файл.", "alertWrongFileType": "Виберіть JSON-файл.",
"twoFAVerifyLabel": "Будь ласка, введіть свій токен, щоб перевірити роботу 2FA", "twoFAVerifyLabel": "Будь ласка, введіть свій токен, щоб перевірити роботу 2FA:",
"tokenValidSettingsMsg": "Токен дійсний! Тепер ви можете зберегти налаштування 2FA.", "tokenValidSettingsMsg": "Токен дійсний! Тепер ви можете зберегти налаштування 2FA.",
"confirmEnableTwoFAMsg": "Ви дійсно хочете увімкнути 2FA?", "confirmEnableTwoFAMsg": "Ви дійсно хочете увімкнути 2FA?",
"confirmDisableTwoFAMsg": "Ви дійсно хочете вимкнути 2FA?", "confirmDisableTwoFAMsg": "Ви дійсно хочете вимкнути 2FA?",
@ -208,7 +208,7 @@
"mattermost": "Mattermost", "mattermost": "Mattermost",
"Primary Base URL": "Основна URL", "Primary Base URL": "Основна URL",
"Push URL": "URL пуша", "Push URL": "URL пуша",
"needPushEvery": "Цю URL необхідно викликати кожні {0} секунд", "needPushEvery": "Цю URL необхідно викликати кожні {0} секунд.",
"pushOptionalParams": "Додаткові параметри: {0}", "pushOptionalParams": "Додаткові параметри: {0}",
"defaultNotificationName": "Моє сповіщення {notification} ({number})", "defaultNotificationName": "Моє сповіщення {notification} ({number})",
"here": "тут", "here": "тут",
@ -233,10 +233,10 @@
"smtpCC": "Копія", "smtpCC": "Копія",
"smtpBCC": "Прихована копія", "smtpBCC": "Прихована копія",
"Discord Webhook URL": "Discord Вебхук URL", "Discord Webhook URL": "Discord Вебхук URL",
"wayToGetDiscordURL": "Ви можете створити його в Параметрах сервера -> Інтеграції -> Створити вебхук", "wayToGetDiscordURL": "Ви можете отримати його, перейшовши до Налаштування сервера -> Інтеграції -> Перегляд веб-хуків -> Новий веб-хук",
"Bot Display Name": "Ім'я бота, що відображається", "Bot Display Name": "Ім'я бота, що відображається",
"Prefix Custom Message": "Свій префікс повідомлення", "Prefix Custom Message": "Свій префікс повідомлення",
"Hello @everyone is...": "Привіт {'@'}everyone це...", "Hello @everyone is...": "Привіт {'@'}everyone це",
"Webhook URL": "URL вебхука", "Webhook URL": "URL вебхука",
"wayToGetTeamsURL": "Як створити URL вебхука ви можете дізнатися тут - {0}.", "wayToGetTeamsURL": "Як створити URL вебхука ви можете дізнатися тут - {0}.",
"Номер": "Номер", "Номер": "Номер",
@ -315,8 +315,8 @@
"Certificate Chain": "Ланцюжок сертифікатів", "Certificate Chain": "Ланцюжок сертифікатів",
"Valid": "Дійсний", "Valid": "Дійсний",
"Hide Tags": "Приховати теги", "Hide Tags": "Приховати теги",
"Title": "Назва інциденту:", "Title": "Заголовок",
"Content": "Зміст інциденту:", "Content": "Зміст",
"Post": "Опублікувати", "Post": "Опублікувати",
"Cancel": "Скасувати", "Cancel": "Скасувати",
"Created": "Створено", "Created": "Створено",
@ -327,7 +327,7 @@
"6h": "6 годин", "6h": "6 годин",
"24h": "24 години", "24h": "24 години",
"1w": "1 тиждень", "1w": "1 тиждень",
"No monitors available.": "Немає доступних моніторів", "No monitors available.": "Немає доступних моніторів.",
"Add one": "Додати новий", "Add one": "Додати новий",
"Backup": "Резервна копія", "Backup": "Резервна копія",
"Security": "Безпека", "Security": "Безпека",
@ -336,7 +336,7 @@
"About": "Про програму", "About": "Про програму",
"Description": "Опис", "Description": "Опис",
"Powered by": "Працює на основі скрипту від", "Powered by": "Працює на основі скрипту від",
"shrinkDatabaseDescription": "Включає VACUUM для бази даних SQLite. Якщо база даних була створена на версії 1.10.0 і більше, AUTO_VACUUM вже включений і ця дія не потрібна.", "shrinkDatabaseDescription": "Включає VACUUM для бази даних SQLite. Якщо база даних була створена після версії 1.10.0, AUTO_VACUUM вже включений і ця дія не потрібна.",
"Style": "Стиль", "Style": "Стиль",
"info": "ІНФО", "info": "ІНФО",
"warning": "УВАГА", "warning": "УВАГА",
@ -437,7 +437,7 @@
"Accept characters:": "Прийняти символи:", "Accept characters:": "Прийняти символи:",
"startOrEndWithOnly": "Починається або закінчується лише {0}", "startOrEndWithOnly": "Починається або закінчується лише {0}",
"No consecutive dashes": "Немає послідовних тире", "No consecutive dashes": "Немає послідовних тире",
"The slug is already taken. Please choose another slug.": "The slug is already taken. Please choose another slug.", "The slug is already taken. Please choose another slug.": "Slug вже зайнятий. Будь ласка, виберіть інший slug.",
"No Proxy": "Без проксі", "No Proxy": "Без проксі",
"Page Not Found": "Сторінку не знайдено", "Page Not Found": "Сторінку не знайдено",
"Reverse Proxy": "Реверсивний проксі", "Reverse Proxy": "Реверсивний проксі",
@ -563,5 +563,186 @@
"Custom": "Нестандартний", "Custom": "Нестандартний",
"successMessage": "Повідомлення про успіх", "successMessage": "Повідомлення про успіх",
"Customize": "Налаштувати", "Customize": "Налаштувати",
"topic": "Тема" "topic": "Тема",
"Body Encoding": "Кодування тіла",
"Event type:": "Тип події:",
"Event data:": "Дані подій:",
"Then choose an action, for example switch the scene to where an RGB light is red.": "Потім виберіть дію, наприклад, перемкнути сцену на червоне світло RGB.",
"backupRecommend": "Будь ласка, натомість створіть резервну копію тому або теки даних (./data/) напряму.",
"Optional": "Необов'язково",
"recurringInterval": "Інтервал",
"Recurring": "Повторюваний",
"strategyManual": "Активний/Неактивний вручну",
"telegramSendSilently": "Надіслати беззвучно",
"telegramSendSilentlyDescription": "Надсилає повідомлення беззвучно. Користувачі отримають сповіщення без звуку.",
"Trigger type:": "Тип тригера:",
"dayOfWeek": "День тижня",
"lastDay": "Останній день",
"warningTimezone": "Використовується часовий пояс сервера",
"weekdayShortMon": "Пн",
"weekdayShortTue": "Вт",
"weekdayShortWed": "Ср",
"weekdayShortThu": "Чт",
"weekdayShortFri": "Пт",
"weekdayShortSun": "Нд",
"Single Maintenance Window": "Разове технічне обслуговування",
"Maintenance Time Window of a Day": "Період доби для технічного обслуговування",
"Effective Date Range": "Діапазон дат вступу в силу",
"Schedule Maintenance": "Розклад обслуговування",
"DateTime Range": "Діапазон дат і часу",
"loadingError": "Не вдалося отримати дані, спробуйте пізніше.",
"install": "Встановити",
"installing": "Встановлення",
"uninstall": "Видалити",
"API Keys": "API-ключі",
"Expiry": "Закінчення терміну дії",
"Expiry date": "Дата закінчення терміну дії",
"Don't expire": "Не прострочувати термін дії",
"Continue": "Продовжити",
"Add Another": "Додати ще",
"Key Added": "Ключ додано",
"No API Keys": "Немає API-ключів",
"apiKey-active": "Активний",
"apiKey-inactive": "Неактивний",
"Expires": "Термін дії закінчується",
"deleteAPIKeyMsg": "Ви впевнені, що хочете видалити цей API-ключ?",
"Generate": "Згенерувати",
"pagertreeIntegrationUrl": "URL-адреса інтеграції",
"pagertreeSilent": "Тихо",
"pagertreeUrgency": "Терміновість",
"pagertreeLow": "Низька",
"pagertreeMedium": "Середня",
"pagertreeHigh": "Висока",
"pagertreeCritical": "Критична",
"pagertreeResolve": "Автоматичне вирішення",
"Edit Tag": "Редагувати тег",
"Server Address": "Адреса сервера",
"Learn More": "Дізнатися більше",
"or": "або",
"uninstalling": "Видалення",
"confirmUninstallPlugin": "Ви дійсно хочете видалити цей плагін?",
"notificationRegional": "Регіональні",
"Clone Monitor": "Копія",
"Clone": "Скопіювати",
"cloneOf": "Копія {0}",
"Custom Footer": "Користувацький Footer",
"Strategy": "Стратегія",
"Free Mobile User Identifier": "ID користувача Free Mobile",
"SendKey": "SendKey",
"Gateway Type": "Тип шлюзу",
"You can divide numbers with": "Числа можна ділити за допомогою",
"Bark Group": "Bark група",
"Bark Sound": "Bark звук",
"Custom CSS": "Користувацький CSS",
"promosmsAllowLongSMS": "Дозволити довгі SMS",
"Feishu WebHookUrl": "Feishu WebHookURL",
"auto resolve": "автоматичне вирішення",
"RadiusCallingStationIdDescription": "Ідентифікатор пристрою, який викликає",
"telegramMessageThreadID": "(Необов'язково) ID теми повідомлення",
"telegramMessageThreadIDDescription": "Необов'язковий ID для цільової гілки повідомлень (теми) форуму; тільки для форумів супергруп",
"backupOutdatedWarning": "Застаріло: Оскільки було додано багато функцій і ця функція резервного копіювання дещо застаріла, вона не може створити або відновити повну резервну копію.",
"dnsCacheDescription": "Це може не працювати в деяких середовищах IPv6, вимкніть це, якщо у вас виникнуть проблеми.",
"deleteMaintenanceMsg": "Ви дійсно хочете видалити це технічне обслуговування?",
"dnsPortDescription": "Порт DNS-сервера. За замовчуванням 53. Ви можете змінити порт у будь-який час.",
"recurringIntervalMessage": "Запускати раз на день | Запускати раз на {0} дні(в)",
"SMSManager API Docs": "SMSManager API документація ",
"Base URL": "Базова URL-адреса",
"goAlertInfo": "GoAlert - це програма з відкритим вихідним кодом для планування викликів, автоматичної ескалації та сповіщень (наприклад, SMS або голосових дзвінків). Автоматично залучайте потрібну людину, потрібним чином і в потрібний час! {0}",
"goAlertIntegrationKeyInfo": "Отримайте універсальний ключ інтеграції API для сервісу у форматі \"aaaaaaaa-bbbb-bbbb-cccc-dddd-eeeeeeeeeeee\", зазвичай це значення параметра токену скопійованої URL-адреси.",
"wayToGetPagerDutyKey": "Ви можете отримати його, перейшовши до Service -> Service Directory -> (Select a service) -> Integrations -> Add integration. Тут ви можете шукати \"Events API V2\". Більше інформації {0}",
"Google Analytics ID": "Google Analytics ID",
"apiKeyAddedMsg": "Ваш API-ключ додано. Будь ласка, запам'ятайте його, оскільки він більше не буде показаний.",
"Add API Key": "Додати API-ключ",
"apiKey-expired": "Прострочений",
"disableAPIKeyMsg": "Ви впевнені, що хочете деактивувати цей API-ключ?",
"pagertreeDoNothing": "Нічого не робити",
"wayToGetPagerTreeIntegrationURL": "Після створення інтеграції Uptime Kuma в PagerTree скопіюйте Endpoint. Дивіться повну інформацію {0}",
"Automations can optionally be triggered in Home Assistant:": "За бажанням можна активувати автоматизацію в Home Assistant:",
"dayOfMonth": "День місяця",
"telegramProtectContent": "Захист від пересилання/збереження",
"telegramProtectContentDescription": "Якщо увімкнено, повідомлення бота в Telegram будуть захищені від пересилання та збереження.",
"Notification Service": "Сервіс сповіщень",
"default: notify all devices": "за замовчуванням: сповіщати всі пристрої",
"A list of Notification Services can be found in Home Assistant under \"Developer Tools > Services\" search for \"notification\" to find your device/phone name.": "Список сервісів сповіщень можна знайти в Home Assistant в розділі \"Інструменти для розробників > Служби\", виконавши пошук за словом \"notification\" і знайшовши назву свого пристрою/телефону.",
"weekdayShortSat": "Сб",
"lastDay1": "Останній день місяця",
"lastDay2": "2-й останній день місяця",
"lastDay3": "3-й останній день місяця",
"lastDay4": "4-й останній день місяця",
"No Maintenance": "Немає технічного обслуговування",
"pauseMaintenanceMsg": "Ви впевнені, що хочете поставити на паузу?",
"maintenanceStatus-under-maintenance": "Перебуває на технічному обслуговуванні",
"maintenanceStatus-inactive": "Неактивне",
"maintenanceStatus-scheduled": "Заплановане",
"maintenanceStatus-ended": "Завершене",
"maintenanceStatus-unknown": "Невідоме",
"Display Timezone": "Відображати часовий пояс",
"Server Timezone": "Часовий пояс сервера",
"statusPageMaintenanceEndDate": "Закінчення",
"IconUrl": "URL-адреса іконки",
"Enable DNS Cache": "Увімкнути DNS-кеш",
"Enable": "Увімкнути",
"confirmDeleteTagMsg": "Ви впевнені, що хочете видалити цей тег? Монітори, пов'язані з цим тегом, не будуть видалені.",
"Guild ID": "ID гільдії",
"Free Mobile API Key": "Free Mobile API ключ",
"Enable TLS": "Увімкнути TLS",
"Proto Service Name": "Назва Proto-сервісу",
"Proto Content": "Вміст Proto",
"Proto Method": "Метод Proto",
"Economy": "Економічний",
"Lowcost": "Дешевий",
"Custom Monitor Type": "Користувацький тип монітора",
"topicExplanation": "MQTT тема для моніторингу",
"successMessageExplanation": "MQTT-повідомлення, яке буде вважатися успішним",
"HTTP Headers": "HTTP заголовки",
"Trust Proxy": "Довірений проксі",
"RadiusSecret": "Секрет Radius",
"RadiusSecretDescription": "Спільний секрет між клієнтом і сервером",
"RadiusCalledStationId": "ID станції, що викликається",
"Frontend Version": "Версія інтерфейсу",
"Frontend Version do not match backend version!": "Версія інтерфейсу не збігається з версією бекенду!",
"Number": "Номер",
"dataRetentionTimeError": "Період зберігання повинен бути 0 або більше",
"infiniteRetention": "Встановіть 0 для нескінченного зберігання.",
"affectedMonitorsDescription": "Виберіть монітори, які зачепить поточне технічне обслуговування",
"affectedStatusPages": "Показувати це повідомлення про технічне обслуговування на вибраних сторінках стану",
"atLeastOneMonitor": "Виберіть принаймні один монітор, який зазнав впливу",
"wayToGetKookBotToken": "Створіть заявку та отримайте токен бота тут {0}",
"wayToGetKookGuildID": "Увімкніть \"Режим розробника\" в налаштуваннях Kook і клацніть правою кнопкою миші на гільдії, щоб отримати її ID",
"Date and Time": "Дата і час",
"Integration Key": "Ключ інтеграції",
"Integration URL": "URL-адреса інтеграції",
"Auto resolve or acknowledged": "Автоматично вирішено або підтверджено",
"do nothing": "нічого не робити",
"auto acknowledged": "автоматично підтверджено",
"plugin": "Плагін | Плагіни",
"RadiusCalledStationIdDescription": "Ідентифікатор пристрою, що викликається",
"RadiusCallingStationId": "ID станції, яка викликає",
"Setup Docker Host": "Налаштування Docker-хосту",
"Connection Type": "Тип підключення",
"Docker Daemon": "Docker Daemon",
"socket": "Сокет",
"tcp": "TCP / HTTP",
"Container Name / ID": "Назва / ID контейнера",
"deleteDockerHostMsg": "Ви дійсно хочете видалити цей Docker-хост для всіх моніторів?",
"Docker Container": "Docker-контейнер",
"Docker Host": "Docker-хост",
"Docker Hosts": "Docker-хости",
"wayToGetZohoCliqURL": "Ви можете дізнатися, як створити URL-адресу веб-хука {0}.",
"enableGRPCTls": "Дозволити надсилати gRPC-запити з TLS-з'єднанням",
"grpcMethodDescription": "Ім'я методу перетворюється у формат cammelCase, наприклад, sayHello, check тощо.",
"Packet Size": "Розмір пакету",
"trustProxyDescription": "Довіряти заголовкам 'X-Forwarded-*'. Якщо ви хочете отримати правильний клієнтський IP, а ваш Uptime Kuma знаходиться за проксі-сервером, таким як Nginx або Apache, вам слід увімкнути цю опцію.",
"wayToGetLineNotifyToken": "Ви можете отримати токен доступу з {0}",
"Examples": "Приклади",
"Home Assistant URL": "URL-адреса Home Assistant",
"Long-Lived Access Token": "Довготривалий токен доступу",
"Long-Lived Access Token can be created by clicking on your profile name (bottom left) and scrolling to the bottom then click Create Token. ": "Довготривалий токен доступу можна створити, натиснувши на ім'я вашого профілю (внизу ліворуч), прокрутивши його донизу і натиснувши кнопку Створити токен. ",
"high": "високий",
"Disable": "Вимкнути",
"Resend Notification if Down X times consecutively": "Повторно надіслати сповіщення, якщо було падіння X разів поспіль",
"lunaseaTarget": "Ціль",
"Add New Tag": "Додати новий тег",
"lunaseaDeviceID": "ID пристрою",
"lunaseaUserID": "ID користувача"
} }

@ -0,0 +1,451 @@
{
"Dashboard": "ڈیش بورڈ",
"New Update": "نئی تازہ کاری",
"Language": "زبان",
"Appearance": "ظہور",
"Theme": "خیالیہ",
"General": "جنرل",
"Game": "کھیل",
"Version": "ورژن",
"List": "فہرست",
"Add": "شامل کریں۔",
"Add New Monitor": "نیا مانیٹر شامل کریں",
"Quick Stats": "فوری اعدادوشمار",
"Up": "اوپر",
"Down": "نیچے",
"statusMaintenance": "دیکھ بھال",
"Maintenance": "دیکھ بھال",
"Unknown": "نامعلوم",
"General Monitor Type": "جنرل مانیٹر کی قسم",
"Specific Monitor Type": "مانیٹر کی مخصوص قسم",
"markdownSupported": "مارک ڈاون نحو کی حمایت کی گئی",
"pauseDashboardHome": "توقف",
"Pause": "توقف",
"Name": "نام",
"Status": "حالت",
"DateTime": "تاریخ وقت",
"Message": "پیغام",
"Resume": "دوبارہ شروع کریں",
"Edit": "ترمیم",
"Delete": "حذف کریں",
"Current": "کرنٹ",
"Uptime": "اپ ٹائم",
"Cert Exp.": "Cert Exp .",
"Monitor": "مانیٹر | مانیٹر",
"day": "دن | دن",
"-day": "-دن",
"hour": "گھنٹہ",
"Response": "جواب",
"Check Update On GitHub": "GitHub پر اپ ڈیٹ چیک کریں",
"Ping": "پنگ",
"Monitor Type": "مانیٹر کی قسم",
"Friendly Name": "دوستانہ نام",
"URL": "URL",
"Hostname": "میزبان کا نام",
"Port": "بندرگاہ",
"Heartbeat Interval": "دل کی دھڑکن کا وقفہ",
"Heartbeat Retry Interval": "دل کی دھڑکن دوبارہ کوشش کا وقفہ",
"Advanced": "اعلی درجے کی",
"checkEverySecond": "ہر {0} سیکنڈ میں چیک کریں",
"retryCheckEverySecond": "ہر {0} سیکنڈ میں دوبارہ کوشش کریں",
"Help": "مدد",
"ignoreTLSError": "HTTPS ویب سائٹس کے لیے TLS/SSL کی خرابی کو نظر انداز کریں",
"upsideDownModeDescription": "اسٹیٹس کو الٹا پلٹائیں۔ اگر سروس قابل رسائی ہے، تو یہ نیچے ہے۔",
"Upside Down Mode": "الٹا ڈاؤن موڈ",
"Max. Redirects": "زیادہ سے زیادہ ری ڈائریکٹ کرتا ہے",
"Accepted Status Codes": "قبول شدہ اسٹیٹس کوڈز",
"Push URL": "یو آر ایل کو پش کریں",
"needPushEvery": "آپ کو اس URL کو ہر {0} سیکنڈ میں کال کرنا چاہیے۔",
"pushOptionalParams": "اختیاری پیرامیٹرز: {0}",
"Save": "محفوظ کریں",
"Notifications": "اطلاعات",
"Setup Notification": "سیٹ اپ نوٹیفکیشن",
"Light": "روشنی",
"Dark": "اندھیرا",
"Auto": "آٹو",
"Theme - Heartbeat Bar": "تھیم - دل کی دھڑکن بار",
"Normal": "نارمل",
"Bottom": "نیچے",
"None": "کوئی نہیں۔",
"Search Engine Visibility": "سرچ انجن کی مرئیت",
"Allow indexing": "اشاریہ سازی کی اجازت دیں",
"Change Password": "پاس ورڈ تبدیل کریں",
"Current Password": "موجودہ خفیہ لفظ",
"New Password": "نیا پاس ورڈ",
"Repeat New Password": "نیا پاس ورڈ دہرائیں",
"Update Password": "پاس ورڈ اپ ڈیٹ کریں",
"Disable Auth": "Auth کو غیر فعال کریں",
"Enable Auth": "Auth کو فعال کریں",
"Please use this option carefully!": "براہ کرم اس اختیار کو احتیاط سے استعمال کریں!",
"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": "سرٹیفکیٹ کی معلومات",
"Resource Record Type": "ریسورس ریکارڈ کی قسم",
"goAlert": "الرٹ جاؤ",
"SecretAccessKey": "کلیدی ID تک رسائی حاصل کریں",
"PhoneNumbers": "فون نمبر",
"TemplateCode": "ٹیمپلیٹ کوڈ",
"SignName": "سائن نام",
"Bark Endpoint": "بارک اینڈ پوائنٹ",
"Bark Group": "بارک گروپ",
"AccessKeyId": "کلیدی ID تک رسائی حاصل کریں",
"languageName": "انگریزی",
"Settings": "ترتیبات",
"Primary Base URL": "بنیادی بنیاد URL",
"Pending": "زیر التواء",
"Passive Monitor Type": "غیر فعال مانیٹر کی قسم",
"No important events": "کوئی اہم واقعات نہیں",
"-hour": "-گھنٹہ",
"shrinkDatabaseDescription": "SQLite کے لیے ڈیٹا بیس ویکیوم کو متحرک کریں۔ اگر آپ کا ڈیٹا بیس 1.10.0 کے بعد بنتا ہے، تو AUTO_VACUUM پہلے ہی فعال ہے اور اس کارروائی کی ضرورت نہیں ہے۔",
"goAlertIntegrationKeyInfo": "اس فارمیٹ میں سروس کے لیے عام API انٹیگریشن کلید حاصل کریں \"aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeee\" عام طور پر کاپی شدہ URL کے ٹوکن پیرامیٹر کی قدر۔",
"Sms template must contain parameters: ": "ایس ایم ایس ٹیمپلیٹ میں پیرامیٹرز ہونا ضروری ہے: ",
"Keyword": "کلیدی لفظ",
"Retries": "دوبارہ کوشش کرتا ہے",
"Resend Notification if Down X times consequently": "نوٹیفکیشن دوبارہ بھیجیں اگر X بار لگاتار نیچے جائیں",
"resendEveryXTimes": "ہر {0} بار دوبارہ بھیجیں",
"resendDisabled": "دوبارہ بھیجنا غیر فعال ہے",
"retriesDescription": "سروس کو ڈاؤن کے بطور نشان زد کرنے اور ایک اطلاع بھیجے جانے سے پہلے زیادہ سے زیادہ کوششیں کریں",
"maxRedirectDescription": "فالو کرنے کے لیے ری ڈائریکٹس کی زیادہ سے زیادہ تعداد۔ ری ڈائریکٹ کو غیر فعال کرنے کے لیے 0 پر سیٹ کریں۔",
"Not available, please setup.": "دستیاب نہیں، براہ کرم سیٹ اپ کریں۔",
"Timezone": "ٹائم زون",
"Discourage search engines from indexing site": "انڈیکسنگ سائٹ سے سرچ انجنوں کی حوصلہ شکنی کریں",
"disableauth.message1": "کیا آپ واقعی <strong>تصدیق کو غیر فعال</strong> کرنا چاہتے ہیں؟",
"disableauth.message2": "یہ ان منظرناموں کے لیے ڈیزائن کیا گیا ہے</strong> جہاں آپ کا ارادہ ہے کہ آپ فریق ثالث کی توثیق کو لاگو کریں</strong> اپ ٹائم کوما جیسے کہ Cloudflare Access، Authelia یا دیگر تصدیقی میکانزم کے سامنے۔",
"Resolver Server": "حل کرنے والا سرور",
"Last Result": "آخری نتیجہ",
"Create your admin account": "اپنا ایڈمن اکاؤنٹ بنائیں",
"Repeat Password": "پاس ورڈ دوبارہ لکھیے",
"Import Backup": "بیک اپ درآمد کریں",
"Export Backup": "بیک اپ درآمد کریں",
"Import": "درآمد کریں",
"respTime": "ریسپ وقت (ایم ایس)",
"notAvailableShort": "N / A",
"Default enabled": "ڈیفالٹ فعال ہے",
"Create": "بنانا",
"Clear Data": "واضح اعداد و شمار",
"Events": "تقریبات",
"Heartbeats": "دل کی دھڑکنیں",
"Auto Get": "آٹو حاصل کریں",
"Schedule maintenance": "شیڈول کی بحالی",
"Affected Monitors": "متاثرہ مانیٹر",
"Start of maintenance": "بحالی کا آغاز",
"All Status Pages": "تمام اسٹیٹس پیجز",
"Select status pages...": "اسٹیٹس کے صفحات منتخب کریں…",
"alertWrongFileType": "براہ کرم ایک JSON فائل منتخب کریں۔",
"Clear all statistics": "تمام اعدادوشمار کو صاف کریں",
"Skip existing": "موجودہ کو چھوڑ دیں",
"Overwrite": "اوور رائٹ کریں",
"Options": "اختیارات",
"Verify Token": "ٹوکن کی تصدیق کریں",
"Setup 2FA": "2FA سیٹ اپ کریں",
"Enable 2FA": "2FA کو فعال کریں",
"2FA Settings": "2FA کی ترتیبات",
"Two Factor Authentication": "دو عنصر کی تصدیق",
"Active": "فعال",
"Inactive": "غیر فعال",
"Token": "ٹوکن",
"Show URI": "URI دکھائیں",
"Tags": "ٹیگز",
"Tag with this name already exist.": "اس نام کا ٹیگ پہلے سے موجود ہے۔",
"Tag with this value already exist.": "اس قدر کے ساتھ ٹیگ پہلے سے موجود ہے۔",
"color": "رنگ",
"value (optional)": "قدر (اختیاری)",
"Gray": "سرمئی",
"Red": "سرخ",
"Orange": "کینو",
"Blue": "نیلا",
"Indigo": "انڈگو",
"Purple": "جامنی",
"Pink": "گلابی",
"Custom": "اپنی مرضی کے مطابق",
"Avg. Response": "اوسط جواب",
"No Services": "کوئی خدمات نہیں",
"All Systems Operational": "تمام سسٹمز آپریشنل",
"Partially Degraded Service": "جزوی طور پر انحطاط شدہ سروس",
"Degraded Service": "ڈیگریڈڈ سروس",
"Add Group": "گروپ شامل کریں",
"Add a monitor": "مانیٹر شامل کریں",
"Edit Status Page": "اسٹیٹس پیج میں ترمیم کریں",
"Go to Dashboard": "ڈیش بورڈ پر جائیں",
"Export": "برآمد کریں",
"Apply on all existing monitors": "تمام موجودہ مانیٹر پر لاگو کریں",
"Pick Affected Monitors...": "متاثرہ مانیٹر منتخب کریں…",
"alertNoFile": "براہ کرم درآمد کرنے کے لیے ایک فائل منتخب کریں۔",
"Keep both": "دونوں رکھو",
"Disable 2FA": "2FA کو غیر فعال کریں",
"Add New below or Select...": "ذیل میں نیا شامل کریں یا منتخب کریں…",
"Green": "سبز",
"Search...": "تلاش کریں…",
"Avg. Ping": "دسمبر پنگ",
"Entry Page": "داخلہ صفحہ",
"statusPageNothing": "یہاں کچھ نہیں، براہ کرم ایک گروپ یا مانیٹر شامل کریں۔",
"Resend Notification if Down X times consecutively": "نوٹیفکیشن دوبارہ بھیجیں اگر X بار لگاتار نیچے جائیں",
"Status Page": "اسٹیٹس پیج",
"Status Pages": "اسٹیٹس پیجز",
"defaultNotificationName": "میرا {notification} الرٹ ({number})",
"here": "یہاں",
"Required": "درکار ہے",
"webhook": "ویب ہُک",
"Post URL": "یو آر ایل پوسٹ کریں",
"Content Type": "مواد کی قسم",
"webhookJsonDesc": "{0} کسی بھی جدید HTTP سرورز جیسے Express.js کے لیے اچھا ہے",
"webhookFormDataDesc": "{multipart} پی ایچ پی کے لیے اچھا ہے۔ JSON کو {decodeFunction} کے ساتھ پارس کرنے کی ضرورت ہوگی",
"webhookAdditionalHeadersTitle": "اضافی ہیڈرز",
"webhookAdditionalHeadersDesc": "ویب ہک کے ساتھ بھیجے گئے اضافی ہیڈر سیٹ کرتا ہے۔",
"Webhook URL": "ابھوک دیہی",
"Application Token": "ایپلیکیشن ٹوکن",
"Server URL": "سرور URL",
"Priority": "ترجیح",
"emojiCheatSheet": "ایموجی چیٹ شیٹ: {0}",
"Read more": "مزید پڑھ",
"appriseInstalled": "اپرائز انسٹال ہے۔",
"appriseNotInstalled": "اپرائز انسٹال نہیں ہے۔ {0}",
"Method": "طریقہ",
"Body": "جسم",
"Headers": "ہیڈرز",
"PushUrl": "یو آر ایل کو پش کریں",
"HeadersInvalidFormat": "درخواست کے ہیڈر درست نہیں ہیں JSON: ",
"BodyInvalidFormat": "درخواست کا باڈی درست نہیں ہے JSON: ",
"Monitor History": "تاریخ کی نگرانی کریں",
"clearDataOlderThan": "مانیٹر کی سرگزشت کا ڈیٹا {0} دنوں تک رکھیں۔",
"PasswordsDoNotMatch": "پاس ورڈ میچ نہیں کرتے.",
"records": "ریکارڈز",
"One record": "ایک ریکارڈ",
"Current User": "موجودہ صارف",
"topic": "موضوع",
"topicExplanation": "نگرانی کے لیے MQTT موضوع",
"successMessage": "کامیابی کا پیغام",
"successMessageExplanation": "MQTT پیغام جسے کامیابی سمجھا جائے گا",
"recent": "حالیہ",
"Done": "ہو گیا",
"Info": "معلومات",
"Security": "سیکورٹی",
"Steam API Key": "بھاپ API کلید",
"Shrink Database": "ڈیٹا بیس کو سکڑیں",
"Pick a RR-Type...": "RR قسم کا انتخاب کریں…",
"Pick Accepted Status Codes...": "قبول شدہ اسٹیٹس کوڈز منتخب کریں…",
"Default": "طے شدہ",
"HTTP Options": "HTTP اختیارات",
"Create Incident": "واقعہ بنائیں",
"Title": "عنوان",
"Content": "مواد",
"Style": "انداز",
"info": "معلومات",
"danger": "خطرہ",
"error": "غلطی",
"critical": "تنقیدی",
"primary": "بنیادی",
"light": "روشنی",
"dark": "اندھیرا",
"Post": "پوسٹ",
"Created": "بنایا",
"Last Updated": "آخری تازہ کاری",
"Unpin": "بادل ساحل",
"Switch to Light Theme": "لائٹ تھیم پر سوئچ کریں",
"Switch to Dark Theme": "ڈارک تھیم پر سوئچ کریں",
"Hide Tags": "ٹیگز چھپائیں",
"Description": "تفصیل",
"No monitors available.": "کوئی مانیٹر دستیاب نہیں۔",
"Add one": "ایک شامل کریں",
"Untitled Group": "بلا عنوان گروپ",
"Services": "خدمات",
"Discard": "رد کر دیں",
"steamApiKeyDescription": "سٹیم گیم سرور کی نگرانی کے لیے آپ کو سٹیم ویب API کلید درکار ہے۔ آپ اپنی API کلید یہاں رجسٹر کر سکتے ہیں: ",
"warning": "انتباہ",
"Please input title and content": "براہ کرم عنوان اور مواد درج کریں",
"Show Tags": "ٹیگز دکھائیں",
"No Monitors": "کوئی مانیٹر نہیں",
"Cancel": "منسوخ کریں",
"Powered by": "کی طرف سے طاقت",
"Custom CSS": "اپنی مرضی کے مطابق سی ایس ایس",
"deleteProxyMsg": "کیا آپ واقعی اس پراکسی کو تمام مانیٹر کے لیے حذف کرنا چاہتے ہیں؟",
"enableProxyDescription": "یہ پراکسی مانیٹر کی درخواستوں پر اس وقت تک اثر نہیں کرے گی جب تک کہ اسے فعال نہ کیا جائے۔ آپ ایکٹیویشن اسٹیٹس کے ذریعے تمام مانیٹرس سے پراکسی کو عارضی طور پر غیر فعال کر سکتے ہیں۔",
"setAsDefaultProxyDescription": "یہ پراکسی نئے مانیٹرز کے لیے بطور ڈیفالٹ فعال ہو جائے گی۔ آپ اب بھی ہر مانیٹر کے لیے الگ الگ پراکسی کو غیر فعال کر سکتے ہیں۔",
"Page Not Found": "صفحہ نہیں ملا",
"wayToGetCloudflaredURL": "({0} سے کلاؤڈ فلارڈ ڈاؤن لوڈ کریں)",
"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 ٹنل کے ذریعے جڑ رہے ہیں تو موجودہ کنکشن ختم ہو سکتا ہے۔ کیا آپ واقعی اسے روکنا چاہتے ہیں؟ اس کی تصدیق کے لیے اپنا موجودہ پاس ورڈ ٹائپ کریں۔",
"RadiusCalledStationId": "اسٹیشن آئی ڈی کو کہتے ہیں",
"Certificate Expiry Notification": "سرٹیفکیٹ ختم ہونے کی اطلاع",
"Check how to config it for WebSocket": "اسے WebSocket کے لیے ترتیب دینے کا طریقہ چیک کریں",
"There might be a typing error in the address.": "ایڈریس میں ٹائپنگ کی غلطی ہو سکتی ہے۔",
"certificationExpiryDescription": "جب TLS سرٹیفکیٹ کی میعاد ختم ہو جاتی ہے تو HTTPS مانیٹر نوٹیفکیشن کو متحرک کرتے ہیں:",
"telegramMessageThreadID": "(اختیاری) میسج تھریڈ آئی ڈی",
"telegramMessageThreadIDDescription": "فورم کے ٹارگٹ میسج تھریڈ (موضوع) کے لیے اختیاری منفرد شناخت کنندہ؛ صرف فورم کے سپر گروپس کے لیے",
"chatIDNotFound": "چیٹ آئی ڈی نہیں ملی۔ براہ کرم پہلے اس بوٹ کو پیغام بھیجیں",
"disableCloudflaredNoAuthMsg": "آپ No Auth موڈ میں ہیں، پاس ورڈ کی ضرورت نہیں ہے۔",
"trustProxyDescription": "'X-Forwarded-*' ہیڈر پر بھروسہ کریں۔ اگر آپ صحیح کلائنٹ آئی پی حاصل کرنا چاہتے ہیں اور آپ کا اپ ٹائم کوما پراکسی جیسے Nginx یا Apache کے پیچھے ہے، تو آپ کو اسے فعال کرنا چاہیے۔",
"supportTelegramChatID": "براہ راست چیٹ / گروپ / چینل کی چیٹ آئی ڈی کو سپورٹ کریں",
"wayToGetTelegramChatID": "آپ بوٹ کو پیغام بھیج کر اور chat_id دیکھنے کے لیے اس URL پر جا کر اپنی چیٹ ID حاصل کر سکتے ہیں:",
"YOUR BOT TOKEN HERE": "یہاں آپ کا بوٹ ٹوکن",
"wayToGetLineNotifyToken": "آپ {0} سے ایک رسائی ٹوکن حاصل کر سکتے ہیں",
"Examples": "مثالیں",
"Running": "چل رہا ہے",
"Not running": "نہیں چل رہا ہے",
"Customize": "حسب ضرورت بنائیں",
"Custom Footer": "حسب ضرورت فوٹر",
"deleteStatusPageMsg": "کیا آپ واقعی اس اسٹیٹس پیج کو حذف کرنا چاہتے ہیں؟",
"Proxies": "پراکسیز",
"default": "طے شدہ",
"enabled": "فعال",
"setAsDefault": "ڈیفالٹ کے طور پر مقرر",
"proxyDescription": "پراکسیز کو کام کرنے کے لیے مانیٹر کو تفویض کیا جانا چاہیے۔",
"Certificate Chain": "سرٹیفکیٹ چین",
"Valid": "درست",
"Invalid": "غلط",
"User": "صارف",
"Installed": "انسٹال",
"Not installed": "انسٹال نہیں ہے",
"Remove Token": "ٹوکن کو ہٹا دیں",
"Start": "شروع کریں",
"Stop": "رک جاؤ",
"Add New Status Page": "نیا اسٹیٹس پیج شامل کریں",
"Slug": "سلگ",
"Accept characters:": "حروف کو قبول کریں:",
"startOrEndWithOnly": "صرف {0} سے شروع یا ختم کریں",
"No consecutive dashes": "کوئی لگاتار ڈیش نہیں ہے",
"Next": "اگلے",
"The slug is already taken. Please choose another slug.": "سلگ پہلے ہی لی گئی ہے۔ براہ کرم کوئی اور سلگ منتخب کریں۔",
"No Proxy": "کوئی پراکسی نہیں",
"Authentication": "تصدیق",
"HTTP Basic Auth": "HTTP بنیادی توثیق",
"New Status Page": "نیا اسٹیٹس پیج",
"Reverse Proxy": "ریورس پراکسی",
"Backup": "بیک اپ",
"About": "کے بارے میں",
"cloudflareWebsite": "Cloudflare ویب سائٹ",
"Message:": "پیغام:",
"HTTP Headers": "HTTP ہیڈر",
"Trust Proxy": "پراکسی پر اعتماد کریں",
"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": "پراکسی",
"Date Created": "تاریخ تخلیق",
"Footer Text": "فوٹر ٹیکسٹ",
"Show Powered By": "شو کے ذریعہ تقویت یافتہ",
"Domain Names": "ڈومین کے نام",
"signedInDisp": "بطور {0} سائن ان",
"signedInDispDisabled": "توثیق غیر فعال۔",
"RadiusSecret": "رداس راز",
"RadiusSecretDescription": "کلائنٹ اور سرور کے درمیان مشترکہ راز",
"RadiusCalledStationIdDescription": "کہلائے گئے آلے کا شناخت کنندہ",
"RadiusCallingStationId": "کالنگ اسٹیشن آئی ڈی",
"RadiusCallingStationIdDescription": "کالنگ ڈیوائس کا شناخت کنندہ",
"API Username": "API صارف نام",
"API Key": "API کلید",
"Show update if available": "اگر دستیاب ہو تو اپ ڈیٹ دکھائیں",
"Also check beta release": "بیٹا ریلیز بھی چیک کریں",
"Using a Reverse Proxy?": "ایک ریورس پراکسی کا استعمال کرتے ہوئے؟",
"Steam Game Server": "بھاپ گیم سرور",
"Most likely causes:": "زیادہ تر ممکنہ وجوہات:",
"The resource is no longer available.": "وسیلہ اب دستیاب نہیں ہے۔",
"What you can try:": "تم کیا کوشش کر سکتے ہو:",
"Retype the address.": "ایڈریس دوبارہ ٹائپ کریں۔",
"Go back to the previous page.": "پچھلے صفحے پر واپس جائیں۔",
"Coming Soon": "جلد آرہا ہے",
"Connection String": "کنکشن سٹرنگ",
"Query": "استفسار",
"settingsCertificateExpiry": "TLS سرٹیفکیٹ کی میعاد ختم",
"Setup Docker Host": "ڈوکر ہوسٹ سیٹ اپ کریں",
"Connection Type": "کنکشن کی قسم",
"Docker Daemon": "ڈوکر ڈیمون",
"deleteDockerHostMsg": "کیا آپ واقعی تمام مانیٹر کے لیے اس ڈاکر ہوسٹ کو حذف کرنا چاہتے ہیں؟",
"socket": "ساکٹ",
"tcp": "TCP / HTTP",
"Docker Container": "ڈوکر کنٹینر",
"Container Name / ID": "کنٹینر کا نام / ID",
"Docker Host": "ڈاکر میزبان",
"Docker Hosts": "ڈاکر میزبان",
"Domain": "ڈومین",
"Workstation": "ورک سٹیشن",
"Packet Size": "پیکٹ کا سائز",
"Bot Token": "بوٹ ٹوکن",
"wayToGetTelegramToken": "آپ {0} سے ٹوکن حاصل کر سکتے ہیں۔",
"Chat ID": "چیٹ آئی ڈی",
"default: notify all devices": "‏ڈیفالٹ: تمام آلات کو مطلع کریں",
"telegramSendSilently": "خاموشی سے بھیجیں",
"telegramSendSilentlyDescription": "خاموشی سے پیغام بھیجتا ہے۔ صارفین کو بغیر آواز کے ایک اطلاع موصول ہوگی۔",
"Long-Lived Access Token": "طویل المدت رسائی ٹوکن",
"Long-Lived Access Token can be created by clicking on your profile name (bottom left) and scrolling to the bottom then click Create Token. ": "آپ کے پروفائل کے نام (نیچے بائیں) پر کلک کرکے اور نیچے تک سکرول کرکے طویل المدت رسائی کا ٹوکن بنایا جاسکتا ہے پھر ٹوکن بنائیں پر کلک کریں۔ ",
"backupOutdatedWarning": "فرسودہ: چونکہ بہت ساری خصوصیات شامل کی گئی ہیں اور یہ بیک اپ خصوصیت تھوڑا سا غیر برقرار ہے، یہ مکمل بیک اپ پیدا یا بحال نہیں کر سکتا۔",
"telegramProtectContent": "فارورڈنگ/محفوظ کرنے کی حفاظت کریں",
"telegramProtectContentDescription": "فعال ہونے پر، ٹیلیگرام میں بوٹ پیغامات کو آگے بھیجنے اور محفوظ کرنے سے محفوظ رکھا جائے گا۔",
"Home Assistant URL": "ہوم اسسٹنٹ یو آر ایل",
"A list of Notification Services can be found in Home Assistant under \"Developer Tools > Services\" search for \"notification\" to find your device/phone name.": "آپ کے آلے/فون کا نام تلاش کرنے کے لیے \"اطلاعات\" تلاش کرنے کے لیے \"ڈیولپر ٹولز > سروسز\" کے تحت ہوم اسسٹنٹ میں اطلاعاتی خدمات کی فہرست مل سکتی ہے۔",
"Automations can optionally be triggered in Home Assistant:": "ہوم اسسٹنٹ میں آٹومیشن کو اختیاری طور پر متحرک کیا جا سکتا ہے:",
"Trigger type:": "محرک کی قسم:",
"Event type:": "تقریب کی قسم:",
"Event data:": "ایونٹ کا ڈیٹا:",
"Then choose an action, for example switch the scene to where an RGB light is red.": "پھر ایک عمل کا انتخاب کریں، مثال کے طور پر منظر کو اس طرف تبدیل کریں جہاں RGB لائٹ سرخ ہو۔",
"Frontend Version": "فرنٹ اینڈ ورژن",
"Frontend Version do not match backend version!": "فرنٹ اینڈ ورژن پسدید ورژن سے مماثل نہیں ہے!",
"backupRecommend": "براہ کرم اس کے بجائے براہ راست والیوم یا ڈیٹا فولڈر (./data/) کا بیک اپ لیں۔",
"Optional": "اختیاری",
"or": "یا",
"Notification Service": "نوٹیفکیشن سروس",
"maintenanceStatus-inactive": "غیر فعال",
"maintenanceStatus-under-maintenance": "دیکھ بھال کے تحت",
"maintenanceStatus-scheduled": "طے شدہ",
"maintenanceStatus-ended": "ختم ہوا",
"recurringInterval": "وقفہ",
"Recurring": "بار چلنے والا",
"strategyManual": "دستی طور پر فعال/غیر فعال",
"warningTimezone": "یہ سرور کا ٹائم زون استعمال کر رہا ہے",
"weekdayShortMon": "پیر",
"weekdayShortWed": "بدھ",
"weekdayShortThu": "جمعرات",
"weekdayShortFri": "جمعہ",
"weekdayShortSat": "سات",
"weekdayShortSun": "سورج",
"dayOfWeek": "ہفتہ کا دن",
"dayOfMonth": "مہینے کا دن",
"lastDay": "آخری دن",
"lastDay1": "مہینے کا آخری دن",
"lastDay2": "مہینے کا دوسرا آخری دن",
"lastDay3": "مہینے کا تیسرا آخری دن",
"lastDay4": "مہینے کا چوتھا آخری دن",
"pauseMaintenanceMsg": "کیا آپ واقعی روکنا چاہتے ہیں؟",
"No Maintenance": "کوئی دیکھ بھال نہیں",
"weekdayShortTue": "منگل",
"Add New Tag": "نیا ٹیگ شامل کریں",
"Enable DNS Cache": "ڈی این ایس کیشے کو فعال کریں",
"Effective Date Range": "مؤثر تاریخ کی حد",
"Schedule Maintenance": "شیڈول کی بحالی",
"Date and Time": "تاریخ اور وقت",
"DateTime Range": "تاریخ کے وقت کی حد",
"loadingError": "ڈیٹا حاصل نہیں کیا جا سکتا، براہ کرم بعد میں دوبارہ کوشش کریں۔",
"Enable": "فعال",
"Disable": "غیر فعال کریں",
"dnsCacheDescription": "ہو سکتا ہے یہ کچھ IPv6 ماحول میں کام نہ کر رہا ہو، اگر آپ کو کوئی مسئلہ درپیش ہو تو اسے غیر فعال کر دیں۔",
"Single Maintenance Window": "سنگل مینٹیننس ونڈو",
"Maintenance Time Window of a Day": "ایک دن کی مینٹیننس ٹائم ونڈو",
"plugin": "پلگ ان | پلگ انز",
"install": "انسٹال کریں",
"statusPageRefreshIn": "اس میں ریفریش کریں: {0}",
"maintenanceStatus-unknown": "نامعلوم",
"Display Timezone": "ٹائم زون ڈسپلے کریں",
"Server Timezone": "سرور ٹائم زون",
"statusPageMaintenanceEndDate": "ختم",
"IconUrl": "آئیکن یو آر ایل"
}

@ -97,5 +97,6 @@
"Monitor Type": "監測器類型", "Monitor Type": "監測器類型",
"Heartbeat Interval": "檢查間距", "Heartbeat Interval": "檢查間距",
"Add New Monitor": "新增監測器", "Add New Monitor": "新增監測器",
"Quick Stats": "綜合數據" "Quick Stats": "綜合數據",
"markdownSupported": "可以用 Markdown"
} }

@ -235,10 +235,10 @@
"smtpBCC": "密送", "smtpBCC": "密送",
"discord": "Discord", "discord": "Discord",
"Discord Webhook URL": "Discord Webhook 网址", "Discord Webhook URL": "Discord Webhook 网址",
"wayToGetDiscordURL": "要获取,可以前往服务器设置 -> 整合 -> 创建 Webhook", "wayToGetDiscordURL": "可在服务器设置 -> 整合 -> 创建 Webhook中获取",
"Bot Display Name": "机器人显示名称", "Bot Display Name": "机器人显示名称",
"Prefix Custom Message": "自定义消息前缀", "Prefix Custom Message": "自定义消息前缀",
"Hello @everyone is...": "{'@'}everyone", "Hello @everyone is...": "{'@'}everyone",
"teams": "Microsoft Teams", "teams": "Microsoft Teams",
"Webhook URL": "Webhook 网址", "Webhook URL": "Webhook 网址",
"wayToGetTeamsURL": "您可以在{0}了解如何获取 Webhook URL。", "wayToGetTeamsURL": "您可以在{0}了解如何获取 Webhook URL。",
@ -546,7 +546,7 @@
"pushoversounds cashregister": "Cash Register", "pushoversounds cashregister": "Cash Register",
"pushoversounds classical": "Classical", "pushoversounds classical": "Classical",
"pushoversounds cosmic": "Cosmic", "pushoversounds cosmic": "Cosmic",
"pushoversounds falling": "Falling", "pushoversounds falling": "下落",
"pushoversounds gamelan": "Gamelan", "pushoversounds gamelan": "Gamelan",
"pushoversounds incoming": "Incoming", "pushoversounds incoming": "Incoming",
"pushoversounds intermission": "Intermission", "pushoversounds intermission": "Intermission",
@ -698,5 +698,48 @@
"markdownSupported": "支持 Markdown 语法", "markdownSupported": "支持 Markdown 语法",
"Google Analytics ID": "Google Analytics分析ID", "Google Analytics ID": "Google Analytics分析ID",
"Learn More": "了解更多", "Learn More": "了解更多",
"Edit Tag": "编辑标签" "Edit Tag": "编辑标签",
"telegramMessageThreadID": "(可选)话题 ID",
"telegramMessageThreadIDDescription": "可选的唯一标识符,用以向该标识符对应的话题发送消息,仅限启用了话题功能的超级群组可用",
"notificationRegional": "地区性通知平台",
"telegramSendSilently": "静默发送",
"Body Encoding": "请求体编码",
"telegramSendSilentlyDescription": "静默地发送消息。消息发布后用户会收到无声通知。",
"telegramProtectContent": "阻止转发/保存",
"telegramProtectContentDescription": "如果启用Telegram 中的机器人消息将受到保护,不会被转发和保存。",
"Clone Monitor": "克隆监控项",
"Clone": "克隆",
"cloneOf": "{0} 的克隆",
"Expiry": "过期",
"Expiry date": "过期时间",
"Continue": "继续",
"Add Another": "添加另一个",
"Add API Key": "添加 API 密钥",
"No API Keys": "没有 API 密钥",
"apiKey-active": "有效",
"apiKey-expired": "已过期",
"Expires": "过期时间",
"apiKey-inactive": "已禁用",
"disableAPIKeyMsg": "你确定要禁用这个 API 密钥?",
"deleteAPIKeyMsg": "你确定要删除这个 API 密钥?",
"Generate": "生成",
"API Keys": "API 密钥",
"Don't expire": "从不过期",
"Key Added": "API 密钥已生成",
"apiKeyAddedMsg": "你的 API 密钥已生成。此页只会显示一次,请妥当保存。",
"pagertreeUrgency": "紧急程度",
"pagertreeLow": "低",
"pagertreeCritical": "严重",
"pagertreeIntegrationUrl": "集成 URL 地址",
"pagertreeSilent": "静默",
"pagertreeMedium": "中",
"pagertreeHigh": "高",
"pagertreeResolve": "自动解除",
"pagertreeDoNothing": "什么都不做",
"wayToGetPagerTreeIntegrationURL": "在 PagerTree 中创建 Uptime Kuma 集成后,复制端点 URL 到此处。在 {0} 查看详情",
"Add New Tag": "添加新标签",
"lunaseaDeviceID": "设备ID",
"lunaseaTarget": "目标",
"lunaseaUserID": "用户ID",
"statusPageRefreshIn": "将于 {0} 后刷新"
} }

@ -376,10 +376,10 @@
"default": "預設", "default": "預設",
"enabled": "啟用", "enabled": "啟用",
"setAsDefault": "設為預設", "setAsDefault": "設為預設",
"deleteProxyMsg": "您確定要為所有監測器刪除此代理伺服器嗎?", "deleteProxyMsg": "您確定要為所有監測器刪除此 Proxy 嗎?",
"proxyDescription": "必須將代理伺服器指派給監測器才能運作。", "proxyDescription": "必須將 Proxy 指派給監測器才能運作。",
"enableProxyDescription": "此代理伺服器在啟用前不會在監測器上生效,您可以藉由控制啟用狀態來暫時對所有的監測器停用代理伺服器。", "enableProxyDescription": "此 Proxy 在啟用前不會在監測器上生效,您可以藉由控制啟用狀態來暫時對所有的監測器停用 Proxy。",
"setAsDefaultProxyDescription": "預設情況下,新監測器將啟用此代理伺服器。您仍可分別停用各監測器的代理伺服器。", "setAsDefaultProxyDescription": "預設情況下,新監測器將啟用此 Proxy。您仍可分別停用各監測器的 Proxy。",
"Maintenance": "維護", "Maintenance": "維護",
"statusMaintenance": "維護中", "statusMaintenance": "維護中",
"Enable DNS Cache": "啟用 DNS 快取", "Enable DNS Cache": "啟用 DNS 快取",
@ -430,8 +430,8 @@
"Remove Token": "移除 Token", "Remove Token": "移除 Token",
"Start": "開始", "Start": "開始",
"User": "使用者", "User": "使用者",
"trustProxyDescription": "信任 'X-Forwarded-*' 的 Header。如果您想取得正確的 Client IP且您的 Uptime Kuma 架設於 Nginx 或 Apache 之後,您應啟用此選項。", "trustProxyDescription": "信任 'X-Forwarded-*' 的 Header。如果您想取得正確的 Client IP且您的 Uptime Kuma 架設於 Nginx 或 Apache Proxy 之後,您應啟用此選項。",
"Reverse Proxy": "Reverse Proxy", "Reverse Proxy": "反向 Proxy",
"Long-Lived Access Token can be created by clicking on your profile name (bottom left) and scrolling to the bottom then click Create Token. ": "若要取得長期有效 Access Token請按您的個人檔案名稱 (左下角),捲動至最下方,然後按建立 Token。 ", "Long-Lived Access Token can be created by clicking on your profile name (bottom left) and scrolling to the bottom then click Create Token. ": "若要取得長期有效 Access Token請按您的個人檔案名稱 (左下角),捲動至最下方,然後按建立 Token。 ",
"A list of Notification Services can be found in Home Assistant under \"Developer Tools > Services\" search for \"notification\" to find your device/phone name.": "您可以在 Home Assistant 中查看通知服務的列表,在\"開發者工具 > 服務\"下搜尋\"通知\"來找到您的裝置/手機的名稱。", "A list of Notification Services can be found in Home Assistant under \"Developer Tools > Services\" search for \"notification\" to find your device/phone name.": "您可以在 Home Assistant 中查看通知服務的列表,在\"開發者工具 > 服務\"下搜尋\"通知\"來找到您的裝置/手機的名稱。",
"loadingError": "未能取得數據,請重新再試。", "loadingError": "未能取得數據,請重新再試。",
@ -483,7 +483,7 @@
"API Key": "API Key", "API Key": "API Key",
"Show update if available": "有更新時顯示", "Show update if available": "有更新時顯示",
"Also check beta release": "檢查 Beta 版本", "Also check beta release": "檢查 Beta 版本",
"Using a Reverse Proxy?": "正在使用 Reverse Proxy", "Using a Reverse Proxy?": "正在使用反向代理 (Reverse Proxy)",
"Check how to config it for WebSocket": "查看如何加入 WebSocket 設定", "Check how to config it for WebSocket": "查看如何加入 WebSocket 設定",
"Steam Game Server": "Steam 遊戲 Server", "Steam Game Server": "Steam 遊戲 Server",
"Most likely causes:": "最可能原因:", "Most likely causes:": "最可能原因:",
@ -549,7 +549,7 @@
"confirmUninstallPlugin": "你確定要解除安裝?", "confirmUninstallPlugin": "你確定要解除安裝?",
"dataRetentionTimeError": "保留限期必需為 0 或正數", "dataRetentionTimeError": "保留限期必需為 0 或正數",
"infiniteRetention": "設定為 0 以作無限期保留。", "infiniteRetention": "設定為 0 以作無限期保留。",
"Effective Date Range": "有效日期範圍", "Effective Date Range": "有效日期範圍 (可選)",
"Hello @everyone is...": "Hello {'@'}everyone is…", "Hello @everyone is...": "Hello {'@'}everyone is…",
"Packet Size": "Packet 大小", "Packet Size": "Packet 大小",
"Event type:": "事件類型:", "Event type:": "事件類型:",
@ -656,5 +656,68 @@
"PushDeer Key": "PushDeer Key", "PushDeer Key": "PushDeer Key",
"onebotSafetyTips": "為了安全起見,必須設置存取 Token", "onebotSafetyTips": "為了安全起見,必須設置存取 Token",
"onebotUserOrGroupId": "群組/使用者 ID", "onebotUserOrGroupId": "群組/使用者 ID",
"onebotPrivateMessage": "私人" "onebotPrivateMessage": "私人",
"notificationRegional": "地區性",
"RadiusCalledStationIdDescription": "Called Device 識別碼",
"telegramSendSilently": "靜音發送",
"telegramMessageThreadID": "(選填) Message Thread ID",
"RadiusCallingStationIdDescription": "Calling Device 識別碼",
"Body Encoding": "Body Encoding",
"API Keys": "API Keys",
"deleteAPIKeyMsg": "你確定要刪除此 API Key?",
"disableAPIKeyMsg": "你確定要停用此 API Key?",
"apiKey-inactive": "已停用",
"apiKey-active": "有效",
"No API Keys": "沒有 API Keys",
"Add API Key": "新增 API Key",
"Expiry date": "失效時間",
"Don't expire": "不會失效",
"apiKey-expired": "已失效",
"Expires": "失效時間",
"Key Added": "API Key 已產生",
"Add Another": "加另一個",
"Continue": "繼續",
"Generate": "產生",
"apiKeyAddedMsg": "你的 API Key 已被產生。此頁只會顯示一次,請適當保存。",
"Expiry": "過期",
"telegramSendSilentlyDescription": "選擇以靜音發送。用戶會收到無聲通知。",
"Clone Monitor": "複製監察器",
"Clone": "複製",
"cloneOf": "複製的 {0}",
"Proxy server has authentication": "Proxy 伺服器啟用了驗證功能",
"Proxy Server": "Proxy 伺服器",
"Proxy Protocol": "Proxy 通訊協定",
"Setup Proxy": "設定 Proxy",
"Topic": "Topic",
"Retry": "重試",
"High": "高",
"Huawei": "華為",
"Android": "Android",
"For safety, must use secret key": "為安全起見,必須使用 Secret Key",
"SecretKey": "SecretKey",
"WebHookUrl": "WebHookUrl",
"Bark Sound": "Bark 鈴聲",
"Bark Group": "Bark 群組",
"Bark Endpoint": "Bark Endpoint",
"Platform": "平台",
"Device Token": "裝置 Token",
"telegramProtectContent": "禁止轉發/儲存",
"telegramProtectContentDescription": "如果選擇,用戶將不能轉發/儲存收到的信息。",
"Add New Tag": "加新標籤",
"Economy": "經濟",
"Lowcost": "平價",
"high": "高價",
"statusPageRefreshIn": "將於 {0} 後重新整理",
"SendKey": "SendKey",
"SMSManager API Docs": "SMSManager API 文件 ",
"startDateTime": "開始時間",
"pagertreeLow": "低",
"endDateTime": "結束時間",
"cronExpression": "Cron 表達式",
"cronSchedule": "排程: ",
"invalidCronExpression": "無效 Cron 表達式:{0}",
"sameAsServerTimezone": "使用伺服器時區",
"WeCom Bot Key": "WeCom 機器人 Key",
"pagertreeMedium": "中",
"pagertreeHigh": "高"
} }

@ -36,6 +36,7 @@ export default {
loggedIn: false, loggedIn: false,
monitorList: { }, monitorList: { },
maintenanceList: {}, maintenanceList: {},
apiKeyList: {},
heartbeatList: { }, heartbeatList: { },
importantHeartbeatList: { }, importantHeartbeatList: { },
avgPingList: { }, avgPingList: { },
@ -135,6 +136,10 @@ export default {
this.maintenanceList = data; this.maintenanceList = data;
}); });
socket.on("apiKeyList", (data) => {
this.apiKeyList = data;
});
socket.on("notificationList", (data) => { socket.on("notificationList", (data) => {
this.notificationList = data; this.notificationList = data;
}); });
@ -466,6 +471,17 @@ export default {
socket.emit("getMaintenanceList", callback); socket.emit("getMaintenanceList", callback);
}, },
/**
* Send list of API keys
* @param {socketCB} callback
*/
getAPIKeyList(callback) {
if (!callback) {
callback = () => { };
}
socket.emit("getAPIKeyList", callback);
},
/** /**
* Add a monitor * Add a monitor
* @param {Object} monitor Object representing monitor to add * @param {Object} monitor Object representing monitor to add
@ -540,6 +556,24 @@ export default {
socket.emit("deleteMaintenance", maintenanceID, callback); socket.emit("deleteMaintenance", maintenanceID, callback);
}, },
/**
* Add an API key
* @param {Object} key API key to add
* @param {socketCB} callback
*/
addAPIKey(key, callback) {
socket.emit("addAPIKey", key, callback);
},
/**
* Delete specified API key
* @param {int} keyID ID of key to delete
* @param {socketCB} callback
*/
deleteAPIKey(keyID, callback) {
socket.emit("deleteAPIKey", keyID, callback);
},
/** Clear the hearbeat list */ /** Clear the hearbeat list */
clearData() { clearData() {
console.log("reset heartbeat list"); console.log("reset heartbeat list");

@ -39,6 +39,9 @@ export default {
} }
if (this.path.startsWith("/status-page") || this.path.startsWith("/status")) { if (this.path.startsWith("/status-page") || this.path.startsWith("/status")) {
if (this.statusPageTheme === "auto") {
return this.system;
}
return this.statusPageTheme; return this.statusPageTheme;
} else { } else {
if (this.userTheme === "auto") { if (this.userTheme === "auto") {

@ -3,7 +3,7 @@
<div> <div>
<h1 class="mb-3">{{ pageName }}</h1> <h1 class="mb-3">{{ pageName }}</h1>
<form @submit.prevent="submit"> <form @submit.prevent="submit">
<div class="shadow-box"> <div class="shadow-box shadow-box-with-fixed-bottom-bar">
<div class="row"> <div class="row">
<div class="col-xl-10"> <div class="col-xl-10">
<!-- Title --> <!-- Title -->
@ -85,35 +85,39 @@
<h2 class="mt-5">{{ $t("Date and Time") }}</h2> <h2 class="mt-5">{{ $t("Date and Time") }}</h2>
<div> {{ $t("warningTimezone") }}: <mark>{{ $root.info.serverTimezone }} ({{ $root.info.serverTimezoneOffset }})</mark></div>
<!-- Strategy --> <!-- Strategy -->
<div class="my-3"> <div class="my-3">
<label for="strategy" class="form-label">{{ $t("Strategy") }}</label> <label for="strategy" class="form-label">{{ $t("Strategy") }}</label>
<select id="strategy" v-model="maintenance.strategy" class="form-select"> <select id="strategy" v-model="maintenance.strategy" class="form-select">
<option value="manual">{{ $t("strategyManual") }}</option> <option value="manual">{{ $t("strategyManual") }}</option>
<option value="single">{{ $t("Single Maintenance Window") }}</option> <option value="single">{{ $t("Single Maintenance Window") }}</option>
<option value="cron">{{ $t("cronExpression") }}</option>
<option value="recurring-interval">{{ $t("Recurring") }} - {{ $t("recurringInterval") }}</option> <option value="recurring-interval">{{ $t("Recurring") }} - {{ $t("recurringInterval") }}</option>
<option value="recurring-weekday">{{ $t("Recurring") }} - {{ $t("dayOfWeek") }}</option> <option value="recurring-weekday">{{ $t("Recurring") }} - {{ $t("dayOfWeek") }}</option>
<option value="recurring-day-of-month">{{ $t("Recurring") }} - {{ $t("dayOfMonth") }}</option> <option value="recurring-day-of-month">{{ $t("Recurring") }} - {{ $t("dayOfMonth") }}</option>
<option v-if="false" value="recurring-day-of-year">{{ $t("Recurring") }} - Day of Year</option>
</select> </select>
</div> </div>
<!-- Single Maintenance Window --> <!-- Single Maintenance Window -->
<template v-if="maintenance.strategy === 'single'"> <template v-if="maintenance.strategy === 'single'">
<!-- DateTime Range --> </template>
<template v-if="maintenance.strategy === 'cron'">
<!-- Cron -->
<div class="my-3"> <div class="my-3">
<label class="form-label">{{ $t("DateTime Range") }}</label> <label for="cron" class="form-label">
<Datepicker {{ $t("cronExpression") }}
v-model="maintenance.dateRange" </label>
:dark="$root.isDark" <p>{{ $t("cronSchedule") }}{{ cronDescription }}</p>
range <input id="cron" v-model="maintenance.cron" type="text" class="form-control" required>
:monthChangeOnScroll="false" </div>
:minDate="minDate"
format="yyyy-MM-dd HH:mm" <div class="my-3">
modelType="yyyy-MM-dd HH:mm:ss" <!-- Duration -->
/> <label for="duration" class="form-label">
{{ $t("Duration (Minutes)") }}
</label>
<input id="duration" v-model="maintenance.durationMinutes" type="number" class="form-control" required min="1" step="1">
</div> </div>
</template> </template>
@ -180,7 +184,6 @@
</div> </div>
</template> </template>
<!-- For any recurring types -->
<template v-if="maintenance.strategy === 'recurring-interval' || maintenance.strategy === 'recurring-weekday' || maintenance.strategy === 'recurring-day-of-month'"> <template v-if="maintenance.strategy === 'recurring-interval' || maintenance.strategy === 'recurring-weekday' || maintenance.strategy === 'recurring-day-of-month'">
<!-- Maintenance Time Window of a Day --> <!-- Maintenance Time Window of a Day -->
<div class="my-3"> <div class="my-3">
@ -192,33 +195,50 @@
disableTimeRangeValidation range disableTimeRangeValidation range
/> />
</div> </div>
</template>
<template v-if="maintenance.strategy === 'recurring-interval' || maintenance.strategy === 'recurring-weekday' || maintenance.strategy === 'recurring-day-of-month' || maintenance.strategy === 'cron' || maintenance.strategy === 'single'">
<!-- Timezone -->
<div class="mb-4">
<label for="timezone" class="form-label">
{{ $t("Timezone") }}
</label>
<select id="timezone" v-model="maintenance.timezone" class="form-select">
<option :value="null">{{ $t("sameAsServerTimezone") }}</option>
<option value="UTC">UTC</option>
<option
v-for="(timezone, index) in timezoneList"
:key="index"
:value="timezone.value"
>
{{ timezone.name }}
</option>
</select>
</div>
<!-- Date Range --> <!-- Date Range -->
<div class="my-3"> <div class="my-3">
<label class="form-label">{{ $t("Effective Date Range") }}</label> <label class="form-label">{{ $t("Effective Date Range") }}</label>
<Datepicker
v-model="maintenance.dateRange" <div class="row">
:dark="$root.isDark" <div class="col">
range datePicker <div class="mb-2">{{ $t("startDateTime") }}</div>
:monthChangeOnScroll="false" <input v-model="maintenance.dateRange[0]" type="datetime-local" class="form-control">
:minDate="minDate"
format="yyyy-MM-dd HH:mm:ss"
modelType="yyyy-MM-dd HH:mm:ss"
required
/>
</div> </div>
</template>
<div class="mt-4 mb-1"> <div class="col">
<button <div class="mb-2">{{ $t("endDateTime") }}</div>
id="monitor-submit-btn" class="btn btn-primary" type="submit" <input v-model="maintenance.dateRange[1]" type="datetime-local" class="form-control">
:disabled="processing"
>
{{ $t("Save") }}
</button>
</div> </div>
</div> </div>
</div> </div>
</template>
</div>
</div>
<div class="fixed-bottom-bar p-3">
<button id="monitor-submit-btn" class="btn btn-primary" type="submit" :disabled="processing">{{ $t("Save") }}</button>
</div>
</div> </div>
</form> </form>
</div> </div>
@ -226,11 +246,12 @@
</template> </template>
<script> <script>
import { useToast } from "vue-toastification"; import { useToast } from "vue-toastification";
import VueMultiselect from "vue-multiselect"; import VueMultiselect from "vue-multiselect";
import dayjs from "dayjs"; import dayjs from "dayjs";
import Datepicker from "@vuepic/vue-datepicker"; import Datepicker from "@vuepic/vue-datepicker";
import { timezoneList } from "../util-frontend";
import cronstrue from "cronstrue/i18n";
const toast = useToast(); const toast = useToast();
@ -242,6 +263,7 @@ export default {
data() { data() {
return { return {
timezoneList: timezoneList(),
processing: false, processing: false,
maintenance: {}, maintenance: {},
affectedMonitors: [], affectedMonitors: [],
@ -256,18 +278,6 @@ export default {
langKey: "lastDay1", langKey: "lastDay1",
value: "lastDay1", value: "lastDay1",
}, },
{
langKey: "lastDay2",
value: "lastDay2",
},
{
langKey: "lastDay3",
value: "lastDay3",
},
{
langKey: "lastDay4",
value: "lastDay4",
}
], ],
weekdays: [ weekdays: [
{ {
@ -311,6 +321,34 @@ export default {
computed: { computed: {
cronDescription() {
if (! this.maintenance.cron) {
return "";
}
let locale = "";
if (this.$root.language) {
locale = this.$root.language.replace("-", "_");
}
// Special handling
// If locale is also not working in your language, you can map it here
// https://github.com/bradymholt/cRonstrue/tree/master/src/i18n/locales
if (locale === "zh_HK") {
locale = "zh_TW";
}
try {
return cronstrue.toString(this.maintenance.cron, {
locale,
});
} catch (e) {
return this.$t("invalidCronExpression", e.message);
}
},
selectedStatusPagesOptions() { selectedStatusPagesOptions() {
return Object.values(this.$root.statusPageList).map(statusPage => { return Object.values(this.$root.statusPageList).map(statusPage => {
return { return {
@ -370,6 +408,8 @@ export default {
description: "", description: "",
strategy: "single", strategy: "single",
active: 1, active: 1,
cron: "30 3 * * *",
durationMinutes: 60,
intervalDay: 1, intervalDay: 1,
dateRange: [ this.minDate ], dateRange: [ this.minDate ],
timeRange: [{ timeRange: [{
@ -381,6 +421,7 @@ export default {
}], }],
weekdays: [], weekdays: [],
daysOfMonth: [], daysOfMonth: [],
timezone: null,
}; };
} else if (this.isEdit) { } else if (this.isEdit) {
this.$root.getSocket().emit("getMaintenance", this.$route.params.id, (res) => { this.$root.getSocket().emit("getMaintenance", this.$route.params.id, (res) => {
@ -501,10 +542,6 @@ export default {
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
.shadow-box {
padding: 20px;
}
textarea { textarea {
min-height: 150px; min-height: 150px;
} }

@ -3,7 +3,7 @@
<div> <div>
<h1 class="mb-3">{{ pageName }}</h1> <h1 class="mb-3">{{ pageName }}</h1>
<form @submit.prevent="submit"> <form @submit.prevent="submit">
<div class="shadow-box"> <div class="shadow-box shadow-box-with-fixed-bottom-bar">
<div class="row"> <div class="row">
<div class="col-md-6"> <div class="col-md-6">
<h2 class="mb-2">{{ $t("General") }}</h2> <h2 class="mb-2">{{ $t("General") }}</h2>
@ -283,13 +283,13 @@
<label for="sqlConnectionString" class="form-label">{{ $t("Connection String") }}</label> <label for="sqlConnectionString" class="form-label">{{ $t("Connection String") }}</label>
<template v-if="monitor.type === 'sqlserver'"> <template v-if="monitor.type === 'sqlserver'">
<input id="sqlConnectionString" v-model="monitor.databaseConnectionString" type="text" class="form-control" placeholder="Server=<hostname>,<port>;Database=<your database>;User Id=<your user id>;Password=<your password>;Encrypt=<true/false>;TrustServerCertificate=<Yes/No>;Connection Timeout=<int>"> <input id="sqlConnectionString" v-model="monitor.databaseConnectionString" type="text" class="form-control">
</template> </template>
<template v-if="monitor.type === 'postgres'"> <template v-if="monitor.type === 'postgres'">
<input id="sqlConnectionString" v-model="monitor.databaseConnectionString" type="text" class="form-control" placeholder="postgres://username:password@host:port/database"> <input id="sqlConnectionString" v-model="monitor.databaseConnectionString" type="text" class="form-control">
</template> </template>
<template v-if="monitor.type === 'mysql'"> <template v-if="monitor.type === 'mysql'">
<input id="sqlConnectionString" v-model="monitor.databaseConnectionString" type="text" class="form-control" placeholder="mysql://username:password@host:port/database"> <input id="sqlConnectionString" v-model="monitor.databaseConnectionString" type="text" class="form-control">
</template> </template>
</div> </div>
<div class="my-3"> <div class="my-3">
@ -301,7 +301,7 @@
<template v-if="monitor.type === 'redis'"> <template v-if="monitor.type === 'redis'">
<div class="my-3"> <div class="my-3">
<label for="redisConnectionString" class="form-label">{{ $t("Connection String") }}</label> <label for="redisConnectionString" class="form-label">{{ $t("Connection String") }}</label>
<input id="redisConnectionString" v-model="monitor.databaseConnectionString" type="text" class="form-control" placeholder="redis://user:password@host:port"> <input id="redisConnectionString" v-model="monitor.databaseConnectionString" type="text" class="form-control">
</div> </div>
</template> </template>
@ -311,7 +311,7 @@
<label for="sqlConnectionString" class="form-label">{{ $t("Connection String") }}</label> <label for="sqlConnectionString" class="form-label">{{ $t("Connection String") }}</label>
<template v-if="monitor.type === 'mongodb'"> <template v-if="monitor.type === 'mongodb'">
<input id="sqlConnectionString" v-model="monitor.databaseConnectionString" type="text" class="form-control" placeholder="mongodb://username:password@host:port/database"> <input id="sqlConnectionString" v-model="monitor.databaseConnectionString" type="text" class="form-control">
</template> </template>
</div> </div>
</template> </template>
@ -546,31 +546,50 @@
<option value="ntlm"> <option value="ntlm">
NTLM NTLM
</option> </option>
<option value="mtls">
mTLS
</option>
</select> </select>
</div> </div>
<template v-if="monitor.authMethod && monitor.authMethod !== null "> <template v-if="monitor.authMethod && monitor.authMethod !== null ">
<template v-if="monitor.authMethod === 'mtls' ">
<div class="my-3">
<label for="tls-cert" class="form-label">{{ $t("Cert") }}</label>
<textarea id="tls-cert" v-model="monitor.tlsCert" class="form-control" :placeholder="$t('Cert body')" required></textarea>
</div>
<div class="my-3">
<label for="tls-key" class="form-label">{{ $t("Key") }}</label>
<textarea id="tls-key" v-model="monitor.tlsKey" class="form-control" :placeholder="$t('Key body')" required></textarea>
</div>
<div class="my-3"> <div class="my-3">
<label for="basicauth" class="form-label">{{ $t("Username") }}</label> <label for="tls-ca" class="form-label">{{ $t("CA") }}</label>
<textarea id="tls-ca" v-model="monitor.tlsCa" class="form-control" :placeholder="$t('Server CA')"></textarea>
</div>
</template>
<template v-else>
<div class="my-3">
<label for="basicauth-user" class="form-label">{{ $t("Username") }}</label>
<input id="basicauth-user" v-model="monitor.basic_auth_user" type="text" class="form-control" :placeholder="$t('Username')"> <input id="basicauth-user" v-model="monitor.basic_auth_user" type="text" class="form-control" :placeholder="$t('Username')">
</div> </div>
<div class="my-3"> <div class="my-3">
<label for="basicauth" class="form-label">{{ $t("Password") }}</label> <label for="basicauth-pass" class="form-label">{{ $t("Password") }}</label>
<input id="basicauth-pass" v-model="monitor.basic_auth_pass" type="password" autocomplete="new-password" class="form-control" :placeholder="$t('Password')"> <input id="basicauth-pass" v-model="monitor.basic_auth_pass" type="password" autocomplete="new-password" class="form-control" :placeholder="$t('Password')">
</div> </div>
<template v-if="monitor.authMethod === 'ntlm' "> <template v-if="monitor.authMethod === 'ntlm' ">
<div class="my-3"> <div class="my-3">
<label for="basicauth" class="form-label">{{ $t("Domain") }}</label> <label for="ntlm-domain" class="form-label">{{ $t("Domain") }}</label>
<input id="basicauth-domain" v-model="monitor.authDomain" type="text" class="form-control" :placeholder="$t('Domain')"> <input id="ntlm-domain" v-model="monitor.authDomain" type="text" class="form-control" :placeholder="$t('Domain')">
</div> </div>
<div class="my-3"> <div class="my-3">
<label for="basicauth" class="form-label">{{ $t("Workstation") }}</label> <label for="ntlm-workstation" class="form-label">{{ $t("Workstation") }}</label>
<input id="basicauth-workstation" v-model="monitor.authWorkstation" type="text" class="form-control" :placeholder="$t('Workstation')"> <input id="ntlm-workstation" v-model="monitor.authWorkstation" type="text" class="form-control" :placeholder="$t('Workstation')">
</div> </div>
</template> </template>
</template> </template>
</template> </template>
</template>
<!-- gRPC Options --> <!-- gRPC Options -->
<template v-if="monitor.type === 'grpc-keyword' "> <template v-if="monitor.type === 'grpc-keyword' ">
@ -673,6 +692,13 @@ export default {
ipOrHostnameRegexPattern: hostNameRegexPattern(), ipOrHostnameRegexPattern: hostNameRegexPattern(),
mqttIpOrHostnameRegexPattern: hostNameRegexPattern(true), mqttIpOrHostnameRegexPattern: hostNameRegexPattern(true),
gameList: null, gameList: null,
connectionStringTemplates: {
"sqlserver": "Server=<hostname>,<port>;Database=<your database>;User Id=<your user id>;Password=<your password>;Encrypt=<true/false>;TrustServerCertificate=<Yes/No>;Connection Timeout=<int>",
"postgres": "postgres://username:password@host:port/database",
"mysql": "mysql://username:password@host:port/database",
"redis": "redis://user:password@host:port",
"mongodb": "mongodb://username:password@host:port/database",
}
}; };
}, },
@ -834,6 +860,24 @@ message HealthCheckResponse {
} }
}); });
} }
// Set default database connection string if empty or it is a template from another database monitor type
for (let monitorType in this.connectionStringTemplates) {
if (this.monitor.type === monitorType) {
let isTemplate = false;
for (let key in this.connectionStringTemplates) {
if (this.monitor.databaseConnectionString === this.connectionStringTemplates[key]) {
isTemplate = true;
break;
}
}
if (!this.monitor.databaseConnectionString || isTemplate) {
this.monitor.databaseConnectionString = this.connectionStringTemplates[monitorType];
}
break;
}
}
}, },
currentGameObject(newGameObject, previousGameObject) { currentGameObject(newGameObject, previousGameObject) {
@ -841,8 +885,7 @@ message HealthCheckResponse {
this.monitor.port = newGameObject.options.port; this.monitor.port = newGameObject.options.port;
} }
this.monitor.game = newGameObject.keys[0]; this.monitor.game = newGameObject.keys[0];
} },
}, },
mounted() { mounted() {
this.init(); this.init();
@ -888,7 +931,7 @@ message HealthCheckResponse {
interval: 60, interval: 60,
retryInterval: this.interval, retryInterval: this.interval,
resendInterval: 0, resendInterval: 0,
maxretries: 0, maxretries: 1,
notificationIDList: {}, notificationIDList: {},
ignoreTls: false, ignoreTls: false,
upsideDown: false, upsideDown: false,
@ -925,6 +968,14 @@ message HealthCheckResponse {
} else if (this.isEdit || this.isClone) { } else if (this.isEdit || this.isClone) {
this.$root.getSocket().emit("getMonitor", this.$route.params.id, (res) => { this.$root.getSocket().emit("getMonitor", this.$route.params.id, (res) => {
if (res.ok) { if (res.ok) {
if (this.isClone) {
// Reset push token for cloned monitors
if (res.monitor.type === "push") {
res.monitor.pushToken = undefined;
}
}
this.monitor = res.monitor; this.monitor = res.monitor;
if (this.isClone) { if (this.isClone) {
@ -936,7 +987,16 @@ message HealthCheckResponse {
this.monitor.includeSensitiveData = undefined; this.monitor.includeSensitiveData = undefined;
this.monitor.maintenance = undefined; this.monitor.maintenance = undefined;
this.monitor.name = this.$t("cloneOf", [ this.monitor.name ]); this.monitor.name = this.$t("cloneOf", [ this.monitor.name ]);
this.monitor.tags = undefined; // FIXME: Cloning tags does not work yet this.$refs.tagsManager.newTags = this.monitor.tags.map((monitorTag) => {
return {
id: monitorTag.tag_id,
name: monitorTag.name,
color: monitorTag.color,
value: monitorTag.value,
new: true,
};
});
this.monitor.tags = undefined;
} }
// Handling for monitors that are created before 1.7.0 // Handling for monitors that are created before 1.7.0
@ -1066,31 +1126,7 @@ message HealthCheckResponse {
<style lang="scss" scoped> <style lang="scss" scoped>
@import "../assets/vars.scss"; @import "../assets/vars.scss";
$padding: 20px;
.shadow-box {
padding-top: $padding;
padding-bottom: 0;
padding-right: $padding;
padding-left: $padding;
}
textarea { textarea {
min-height: 200px; min-height: 200px;
} }
.fixed-bottom-bar {
position: sticky;
bottom: 0;
margin-left: -$padding;
margin-right: -$padding;
z-index: 100;
background-color: rgba(white, 0.2);
backdrop-filter: blur(2px);
border-radius: 0 0 10px 10px;
.dark & {
background-color: rgba($dark-header-bg, 0.9);
}
}
</style> </style>

@ -107,6 +107,9 @@ export default {
security: { security: {
title: this.$t("Security"), title: this.$t("Security"),
}, },
"api-keys": {
title: this.$t("API Keys")
},
proxies: { proxies: {
title: this.$t("Proxies"), title: this.$t("Proxies"),
}, },

@ -34,9 +34,13 @@
</div> </div>
</div> </div>
<div class="my-3 form-check form-switch"> <div class="my-3">
<input id="switch-theme" v-model="config.theme" class="form-check-input" type="checkbox" true-value="dark" false-value="light"> <label for="switch-theme" class="form-label">{{ $t("Theme") }}</label>
<label class="form-check-label" for="switch-theme">{{ $t("Switch to Dark Theme") }}</label> <select id="switch-theme" v-model="config.theme" class="form-select">
<option value="auto">{{ $t("Auto") }}</option>
<option value="light">{{ $t("Light") }}</option>
<option value="dark">{{ $t("Dark") }}</option>
</select>
</div> </div>
<div class="my-3 form-check form-switch"> <div class="my-3 form-check form-switch">
@ -320,6 +324,11 @@
<p v-if="config.showPoweredBy"> <p v-if="config.showPoweredBy">
{{ $t("Powered by") }} <a target="_blank" rel="noopener noreferrer" href="https://github.com/louislam/uptime-kuma">{{ $t("Uptime Kuma" ) }}</a> {{ $t("Powered by") }} <a target="_blank" rel="noopener noreferrer" href="https://github.com/louislam/uptime-kuma">{{ $t("Uptime Kuma" ) }}</a>
</p> </p>
<div class="refresh-info mb-2">
<div>{{ $t("Last Updated") }}: <date-time :value="lastUpdateTime" /></div>
<div>{{ $tc("statusPageRefreshIn", [ updateCountdownText]) }}</div>
</div>
</footer> </footer>
</div> </div>
@ -336,6 +345,7 @@
<script> <script>
import axios from "axios"; import axios from "axios";
import dayjs from "dayjs"; import dayjs from "dayjs";
import duration from "dayjs/plugin/duration";
import Favico from "favico.js"; import Favico from "favico.js";
// import highlighting library (you can use any library you want just return html string) // import highlighting library (you can use any library you want just return html string)
import { highlight, languages } from "prismjs/components/prism-core"; import { highlight, languages } from "prismjs/components/prism-core";
@ -351,12 +361,14 @@ import DOMPurify from "dompurify";
import Confirm from "../components/Confirm.vue"; import Confirm from "../components/Confirm.vue";
import PublicGroupList from "../components/PublicGroupList.vue"; import PublicGroupList from "../components/PublicGroupList.vue";
import MaintenanceTime from "../components/MaintenanceTime.vue"; import MaintenanceTime from "../components/MaintenanceTime.vue";
import DateTime from "../components/Datetime.vue";
import { getResBaseURL } from "../util-frontend"; import { getResBaseURL } from "../util-frontend";
import { STATUS_PAGE_ALL_DOWN, STATUS_PAGE_ALL_UP, STATUS_PAGE_MAINTENANCE, STATUS_PAGE_PARTIAL_DOWN, UP, MAINTENANCE } from "../util.ts"; import { STATUS_PAGE_ALL_DOWN, STATUS_PAGE_ALL_UP, STATUS_PAGE_MAINTENANCE, STATUS_PAGE_PARTIAL_DOWN, UP, MAINTENANCE } from "../util.ts";
import Tag from "../components/Tag.vue"; import Tag from "../components/Tag.vue";
import VueMultiselect from "vue-multiselect"; import VueMultiselect from "vue-multiselect";
const toast = useToast(); const toast = useToast();
dayjs.extend(duration);
const leavePageMsg = "Do you really want to leave? you have unsaved changes!"; const leavePageMsg = "Do you really want to leave? you have unsaved changes!";
@ -375,6 +387,7 @@ export default {
Confirm, Confirm,
PrismEditor, PrismEditor,
MaintenanceTime, MaintenanceTime,
DateTime,
Tag, Tag,
VueMultiselect VueMultiselect
}, },
@ -418,6 +431,10 @@ export default {
baseURL: "", baseURL: "",
clickedEditButton: false, clickedEditButton: false,
maintenanceList: [], maintenanceList: [],
autoRefreshInterval: 5,
lastUpdateTime: dayjs(),
updateCountdown: null,
updateCountdownText: null,
}; };
}, },
computed: { computed: {
@ -655,11 +672,13 @@ export default {
console.log(error); console.log(error);
}); });
// 5mins a loop // Configure auto-refresh loop
this.updateHeartbeatList(); this.updateHeartbeatList();
feedInterval = setInterval(() => { feedInterval = setInterval(() => {
this.updateHeartbeatList(); this.updateHeartbeatList();
}, (300 + 10) * 1000); }, (this.autoRefreshInterval * 60 + 10) * 1000);
this.updateUpdateTimer();
// Go to edit page if ?edit present // Go to edit page if ?edit present
// null means ?edit present, but no value // null means ?edit present, but no value
@ -718,10 +737,29 @@ export default {
favicon.badge(downMonitors); favicon.badge(downMonitors);
this.loadedData = true; this.loadedData = true;
this.lastUpdateTime = dayjs();
this.updateUpdateTimer();
}); });
} }
}, },
/**
* Setup timer to display countdown to refresh
* @returns {void}
*/
updateUpdateTimer() {
clearInterval(this.updateCountdown);
this.updateCountdown = setInterval(() => {
const countdown = dayjs.duration(this.lastUpdateTime.add(this.autoRefreshInterval, "minutes").add(10, "seconds").diff(dayjs()));
if (countdown.as("seconds") < 0) {
clearInterval(this.updateCountdown);
} else {
this.updateCountdownText = countdown.format("mm:ss");
}
}, 1000);
},
/** Enable editing mode */ /** Enable editing mode */
edit() { edit() {
if (this.hasToken) { if (this.hasToken) {
@ -907,7 +945,11 @@ export default {
* @returns {string} Sanitized HTML * @returns {string} Sanitized HTML
*/ */
maintenanceHTML(description) { maintenanceHTML(description) {
if (description) {
return DOMPurify.sanitize(marked(description)); return DOMPurify.sanitize(marked(description));
} else {
return "";
}
}, },
} }
@ -1136,4 +1178,8 @@ footer {
} }
} }
.refresh-info {
opacity: 0.7;
}
</style> </style>

@ -18,6 +18,7 @@ import NotFound from "./pages/NotFound.vue";
import DockerHosts from "./components/settings/Docker.vue"; import DockerHosts from "./components/settings/Docker.vue";
import MaintenanceDetails from "./pages/MaintenanceDetails.vue"; import MaintenanceDetails from "./pages/MaintenanceDetails.vue";
import ManageMaintenance from "./pages/ManageMaintenance.vue"; import ManageMaintenance from "./pages/ManageMaintenance.vue";
import APIKeys from "./components/settings/APIKeys.vue";
import Plugins from "./components/settings/Plugins.vue"; import Plugins from "./components/settings/Plugins.vue";
// Settings - Sub Pages // Settings - Sub Pages
@ -117,6 +118,10 @@ const routes = [
path: "security", path: "security",
component: Security, component: Security,
}, },
{
path: "api-keys",
component: APIKeys,
},
{ {
path: "proxies", path: "proxies",
component: Proxies, component: Proxies,

Loading…
Cancel
Save