mirror of
				https://github.com/louislam/uptime-kuma.git
				synced 2025-11-04 13:46:13 +08:00 
			
		
		
		
	Merge branch 'louislam:master' into fix_redis_auth
This commit is contained in:
		
							
								
								
									
										4
									
								
								.github/ISSUE_TEMPLATE/bug_report.yaml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										4
									
								
								.github/ISSUE_TEMPLATE/bug_report.yaml
									
									
									
									
										vendored
									
									
								
							@@ -61,8 +61,8 @@ body:
 | 
			
		||||
    id: operating-system
 | 
			
		||||
    attributes:
 | 
			
		||||
      label: "💻 Operating System and Arch"
 | 
			
		||||
      description: "Which OS is your server/device running on?"
 | 
			
		||||
      placeholder: "Ex. Ubuntu 20.04 x64 (If your platform is not supported by Uptime Kuma such as Replit, please do not report this bug)"
 | 
			
		||||
      description: "Which OS is your server/device running on? (For Replit, please do not report this bug)"
 | 
			
		||||
      placeholder: "Ex. Ubuntu 20.04 x64 "
 | 
			
		||||
    validations:
 | 
			
		||||
      required: true
 | 
			
		||||
  - type: input
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										6
									
								
								db/patch-add-parent-monitor.sql
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								db/patch-add-parent-monitor.sql
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,6 @@
 | 
			
		||||
BEGIN TRANSACTION;
 | 
			
		||||
 | 
			
		||||
ALTER TABLE monitor
 | 
			
		||||
    ADD parent INTEGER REFERENCES [monitor] ([id]) ON DELETE SET NULL ON UPDATE CASCADE;
 | 
			
		||||
 | 
			
		||||
COMMIT
 | 
			
		||||
							
								
								
									
										2395
									
								
								package-lock.json
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										2395
									
								
								package-lock.json
									
									
									
										generated
									
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							@@ -1,6 +1,6 @@
 | 
			
		||||
{
 | 
			
		||||
    "name": "uptime-kuma",
 | 
			
		||||
    "version": "1.21.3",
 | 
			
		||||
    "version": "1.22.0-beta.0",
 | 
			
		||||
    "license": "MIT",
 | 
			
		||||
    "repository": {
 | 
			
		||||
        "type": "git",
 | 
			
		||||
@@ -171,7 +171,7 @@
 | 
			
		||||
        "timezones-list": "~3.0.1",
 | 
			
		||||
        "typescript": "~4.4.4",
 | 
			
		||||
        "v-pagination-3": "~0.1.7",
 | 
			
		||||
        "vite": "~3.1.0",
 | 
			
		||||
        "vite": "~3.2.7",
 | 
			
		||||
        "vite-plugin-compression": "^0.5.1",
 | 
			
		||||
        "vue": "~3.2.47",
 | 
			
		||||
        "vue-chartjs": "~5.2.0",
 | 
			
		||||
 
 | 
			
		||||
@@ -69,6 +69,7 @@ class Database {
 | 
			
		||||
        "patch-api-key-table.sql": true,
 | 
			
		||||
        "patch-monitor-tls.sql": true,
 | 
			
		||||
        "patch-maintenance-cron.sql": true,
 | 
			
		||||
        "patch-add-parent-monitor.sql": true,
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
 
 | 
			
		||||
@@ -74,13 +74,17 @@ class Monitor extends BeanModel {
 | 
			
		||||
            id: this.id,
 | 
			
		||||
            name: this.name,
 | 
			
		||||
            description: this.description,
 | 
			
		||||
            pathName: await this.getPathName(),
 | 
			
		||||
            parent: this.parent,
 | 
			
		||||
            childrenIDs: await Monitor.getAllChildrenIDs(this.id),
 | 
			
		||||
            url: this.url,
 | 
			
		||||
            method: this.method,
 | 
			
		||||
            hostname: this.hostname,
 | 
			
		||||
            port: this.port,
 | 
			
		||||
            maxretries: this.maxretries,
 | 
			
		||||
            weight: this.weight,
 | 
			
		||||
            active: this.active,
 | 
			
		||||
            active: await this.isActive(),
 | 
			
		||||
            forceInactive: !await Monitor.isParentActive(this.id),
 | 
			
		||||
            type: this.type,
 | 
			
		||||
            interval: this.interval,
 | 
			
		||||
            retryInterval: this.retryInterval,
 | 
			
		||||
@@ -144,6 +148,16 @@ class Monitor extends BeanModel {
 | 
			
		||||
        return data;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
	 * Checks if the monitor is active based on itself and its parents
 | 
			
		||||
	 * @returns {Promise<Boolean>}
 | 
			
		||||
	 */
 | 
			
		||||
    async isActive() {
 | 
			
		||||
        const parentActive = await Monitor.isParentActive(this.id);
 | 
			
		||||
 | 
			
		||||
        return this.active && parentActive;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Get all tags applied to this monitor
 | 
			
		||||
     * @returns {Promise<LooseObject<any>[]>}
 | 
			
		||||
@@ -259,6 +273,36 @@ class Monitor extends BeanModel {
 | 
			
		||||
                if (await Monitor.isUnderMaintenance(this.id)) {
 | 
			
		||||
                    bean.msg = "Monitor under maintenance";
 | 
			
		||||
                    bean.status = MAINTENANCE;
 | 
			
		||||
                } else if (this.type === "group") {
 | 
			
		||||
                    const children = await Monitor.getChildren(this.id);
 | 
			
		||||
 | 
			
		||||
                    if (children.length > 0) {
 | 
			
		||||
                        bean.status = UP;
 | 
			
		||||
                        bean.msg = "All children up and running";
 | 
			
		||||
                        for (const child of children) {
 | 
			
		||||
                            if (!child.active) {
 | 
			
		||||
                                // Ignore inactive childs
 | 
			
		||||
                                continue;
 | 
			
		||||
                            }
 | 
			
		||||
                            const lastBeat = await Monitor.getPreviousHeartbeat(child.id);
 | 
			
		||||
 | 
			
		||||
                            // Only change state if the monitor is in worse conditions then the ones before
 | 
			
		||||
                            if (bean.status === UP && (lastBeat.status === PENDING || lastBeat.status === DOWN)) {
 | 
			
		||||
                                bean.status = lastBeat.status;
 | 
			
		||||
                            } else if (bean.status === PENDING && lastBeat.status === DOWN) {
 | 
			
		||||
                                bean.status = lastBeat.status;
 | 
			
		||||
                            }
 | 
			
		||||
                        }
 | 
			
		||||
 | 
			
		||||
                        if (bean.status !== UP) {
 | 
			
		||||
                            bean.msg = "Child inaccessible";
 | 
			
		||||
                        }
 | 
			
		||||
                    } else {
 | 
			
		||||
                        // Set status pending if group is empty
 | 
			
		||||
                        bean.status = PENDING;
 | 
			
		||||
                        bean.msg = "Group empty";
 | 
			
		||||
                    }
 | 
			
		||||
 | 
			
		||||
                } else if (this.type === "http" || this.type === "keyword") {
 | 
			
		||||
                    // Do not do any queries/high loading things before the "bean.ping"
 | 
			
		||||
                    let startTime = dayjs().valueOf();
 | 
			
		||||
@@ -1329,6 +1373,11 @@ class Monitor extends BeanModel {
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        const parent = await Monitor.getParent(monitorID);
 | 
			
		||||
        if (parent != null) {
 | 
			
		||||
            return await Monitor.isUnderMaintenance(parent.id);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return false;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -1341,6 +1390,94 @@ class Monitor extends BeanModel {
 | 
			
		||||
            throw new Error(`Interval cannot be less than ${MIN_INTERVAL_SECOND} seconds`);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Gets Parent of the monitor
 | 
			
		||||
     * @param {number} monitorID ID of monitor to get
 | 
			
		||||
     * @returns {Promise<LooseObject<any>>}
 | 
			
		||||
     */
 | 
			
		||||
    static async getParent(monitorID) {
 | 
			
		||||
        return await R.getRow(`
 | 
			
		||||
            SELECT parent.* FROM monitor parent
 | 
			
		||||
    		LEFT JOIN monitor child
 | 
			
		||||
    			ON child.parent = parent.id
 | 
			
		||||
            WHERE child.id = ?
 | 
			
		||||
        `, [
 | 
			
		||||
            monitorID,
 | 
			
		||||
        ]);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Gets all Children of the monitor
 | 
			
		||||
     * @param {number} monitorID ID of monitor to get
 | 
			
		||||
     * @returns {Promise<LooseObject<any>>}
 | 
			
		||||
     */
 | 
			
		||||
    static async getChildren(monitorID) {
 | 
			
		||||
        return await R.getAll(`
 | 
			
		||||
            SELECT * FROM monitor
 | 
			
		||||
            WHERE parent = ?
 | 
			
		||||
        `, [
 | 
			
		||||
            monitorID,
 | 
			
		||||
        ]);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Gets Full Path-Name (Groups and Name)
 | 
			
		||||
     * @returns {Promise<String>}
 | 
			
		||||
     */
 | 
			
		||||
    async getPathName() {
 | 
			
		||||
        let path = this.name;
 | 
			
		||||
 | 
			
		||||
        if (this.parent === null) {
 | 
			
		||||
            return path;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        let parent = await Monitor.getParent(this.id);
 | 
			
		||||
        while (parent !== null) {
 | 
			
		||||
            path = `${parent.name} / ${path}`;
 | 
			
		||||
            parent = await Monitor.getParent(parent.id);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return path;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Gets recursive all child ids
 | 
			
		||||
	 * @param {number} monitorID ID of the monitor to get
 | 
			
		||||
     * @returns {Promise<Array>}
 | 
			
		||||
     */
 | 
			
		||||
    static async getAllChildrenIDs(monitorID) {
 | 
			
		||||
        const childs = await Monitor.getChildren(monitorID);
 | 
			
		||||
 | 
			
		||||
        if (childs === null) {
 | 
			
		||||
            return [];
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        let childrenIDs = [];
 | 
			
		||||
 | 
			
		||||
        for (const child of childs) {
 | 
			
		||||
            childrenIDs.push(child.id);
 | 
			
		||||
            childrenIDs = childrenIDs.concat(await Monitor.getAllChildrenIDs(child.id));
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return childrenIDs;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
	 * Checks recursive if parent (ancestors) are active
 | 
			
		||||
	 * @param {number} monitorID ID of the monitor to get
 | 
			
		||||
	 * @returns {Promise<Boolean>}
 | 
			
		||||
	 */
 | 
			
		||||
    static async isParentActive(monitorID) {
 | 
			
		||||
        const parent = await Monitor.getParent(monitorID);
 | 
			
		||||
 | 
			
		||||
        if (parent === null) {
 | 
			
		||||
            return true;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        const parentActive = await Monitor.isParentActive(parent.id);
 | 
			
		||||
        return parent.active && parentActive;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
module.exports = Monitor;
 | 
			
		||||
 
 | 
			
		||||
@@ -28,7 +28,7 @@ const monitorResponseTime = new PrometheusClient.Gauge({
 | 
			
		||||
 | 
			
		||||
const monitorStatus = new PrometheusClient.Gauge({
 | 
			
		||||
    name: "monitor_status",
 | 
			
		||||
    help: "Monitor Status (1 = UP, 0= DOWN)",
 | 
			
		||||
    help: "Monitor Status (1 = UP, 0= DOWN, 2= PENDING, 3= MAINTENANCE)",
 | 
			
		||||
    labelNames: commonLabels
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -684,8 +684,17 @@ let needSetup = false;
 | 
			
		||||
                    throw new Error("Permission denied.");
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                // Check if Parent is Decendant (would cause endless loop)
 | 
			
		||||
                if (monitor.parent !== null) {
 | 
			
		||||
                    const childIDs = await Monitor.getAllChildrenIDs(monitor.id);
 | 
			
		||||
                    if (childIDs.includes(monitor.parent)) {
 | 
			
		||||
                        throw new Error("Invalid Monitor Group");
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                bean.name = monitor.name;
 | 
			
		||||
                bean.description = monitor.description;
 | 
			
		||||
                bean.parent = monitor.parent;
 | 
			
		||||
                bean.type = monitor.type;
 | 
			
		||||
                bean.url = monitor.url;
 | 
			
		||||
                bean.method = monitor.method;
 | 
			
		||||
@@ -745,7 +754,7 @@ let needSetup = false;
 | 
			
		||||
 | 
			
		||||
                await updateMonitorNotification(bean.id, monitor.notificationIDList);
 | 
			
		||||
 | 
			
		||||
                if (bean.active) {
 | 
			
		||||
                if (bean.isActive()) {
 | 
			
		||||
                    await restartMonitor(socket.userID, bean.id);
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -186,7 +186,7 @@ module.exports.maintenanceSocketHandler = (socket) => {
 | 
			
		||||
 | 
			
		||||
            log.debug("maintenance", `Get Monitors for Maintenance: ${maintenanceID} User ID: ${socket.userID}`);
 | 
			
		||||
 | 
			
		||||
            let monitors = await R.getAll("SELECT monitor.id, monitor.name FROM monitor_maintenance mm JOIN monitor ON mm.monitor_id = monitor.id WHERE mm.maintenance_id = ? ", [
 | 
			
		||||
            let monitors = await R.getAll("SELECT monitor.id FROM monitor_maintenance mm JOIN monitor ON mm.monitor_id = monitor.id WHERE mm.maintenance_id = ? ", [
 | 
			
		||||
                maintenanceID,
 | 
			
		||||
            ]);
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -19,43 +19,18 @@
 | 
			
		||||
                {{ $t("No Monitors, please") }} <router-link to="/add">{{ $t("add one") }}</router-link>
 | 
			
		||||
            </div>
 | 
			
		||||
 | 
			
		||||
            <router-link v-for="(item, index) in sortedMonitorList" :key="index" :to="monitorURL(item.id)" class="item" :class="{ 'disabled': ! item.active }" :title="item.description">
 | 
			
		||||
                <div class="row">
 | 
			
		||||
                    <div class="col-9 col-md-8 small-padding" :class="{ 'monitor-item': $root.userHeartbeatBar == 'bottom' || $root.userHeartbeatBar == 'none' }">
 | 
			
		||||
                        <div class="info">
 | 
			
		||||
                            <Uptime :monitor="item" type="24" :pill="true" />
 | 
			
		||||
                            {{ item.name }}
 | 
			
		||||
                        </div>
 | 
			
		||||
                        <div class="tags">
 | 
			
		||||
                            <Tag v-for="tag in item.tags" :key="tag" :item="tag" :size="'sm'" />
 | 
			
		||||
                        </div>
 | 
			
		||||
                    </div>
 | 
			
		||||
                    <div v-show="$root.userHeartbeatBar == 'normal'" :key="$root.userHeartbeatBar" class="col-3 col-md-4">
 | 
			
		||||
                        <HeartbeatBar size="small" :monitor-id="item.id" />
 | 
			
		||||
                    </div>
 | 
			
		||||
                </div>
 | 
			
		||||
 | 
			
		||||
                <div v-if="$root.userHeartbeatBar == 'bottom'" class="row">
 | 
			
		||||
                    <div class="col-12 bottom-style">
 | 
			
		||||
                        <HeartbeatBar size="small" :monitor-id="item.id" />
 | 
			
		||||
                    </div>
 | 
			
		||||
                </div>
 | 
			
		||||
            </router-link>
 | 
			
		||||
            <MonitorListItem v-for="(item, index) in sortedMonitorList" :key="index" :monitor="item" :isSearch="searchText !== ''" />
 | 
			
		||||
        </div>
 | 
			
		||||
    </div>
 | 
			
		||||
</template>
 | 
			
		||||
 | 
			
		||||
<script>
 | 
			
		||||
import HeartbeatBar from "../components/HeartbeatBar.vue";
 | 
			
		||||
import Tag from "../components/Tag.vue";
 | 
			
		||||
import Uptime from "../components/Uptime.vue";
 | 
			
		||||
import MonitorListItem from "../components/MonitorListItem.vue";
 | 
			
		||||
import { getMonitorRelativeURL } from "../util.ts";
 | 
			
		||||
 | 
			
		||||
export default {
 | 
			
		||||
    components: {
 | 
			
		||||
        Uptime,
 | 
			
		||||
        HeartbeatBar,
 | 
			
		||||
        Tag,
 | 
			
		||||
        MonitorListItem,
 | 
			
		||||
    },
 | 
			
		||||
    props: {
 | 
			
		||||
        /** Should the scrollbar be shown */
 | 
			
		||||
@@ -91,6 +66,20 @@ export default {
 | 
			
		||||
        sortedMonitorList() {
 | 
			
		||||
            let result = Object.values(this.$root.monitorList);
 | 
			
		||||
 | 
			
		||||
            // Simple filter by search text
 | 
			
		||||
            // finds monitor name, tag name or tag value
 | 
			
		||||
            if (this.searchText !== "") {
 | 
			
		||||
                const loweredSearchText = this.searchText.toLowerCase();
 | 
			
		||||
                result = result.filter(monitor => {
 | 
			
		||||
                    return monitor.name.toLowerCase().includes(loweredSearchText)
 | 
			
		||||
                    || monitor.tags.find(tag => tag.name.toLowerCase().includes(loweredSearchText)
 | 
			
		||||
                    || tag.value?.toLowerCase().includes(loweredSearchText));
 | 
			
		||||
                });
 | 
			
		||||
            } else {
 | 
			
		||||
                result = result.filter(monitor => monitor.parent === null);
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            // Filter result by active state, weight and alphabetical
 | 
			
		||||
            result.sort((m1, m2) => {
 | 
			
		||||
 | 
			
		||||
                if (m1.active !== m2.active) {
 | 
			
		||||
@@ -116,17 +105,6 @@ export default {
 | 
			
		||||
                return m1.name.localeCompare(m2.name);
 | 
			
		||||
            });
 | 
			
		||||
 | 
			
		||||
            // Simple filter by search text
 | 
			
		||||
            // finds monitor name, tag name or tag value
 | 
			
		||||
            if (this.searchText !== "") {
 | 
			
		||||
                const loweredSearchText = this.searchText.toLowerCase();
 | 
			
		||||
                result = result.filter(monitor => {
 | 
			
		||||
                    return monitor.name.toLowerCase().includes(loweredSearchText)
 | 
			
		||||
                    || monitor.tags.find(tag => tag.name.toLowerCase().includes(loweredSearchText)
 | 
			
		||||
                    || tag.value?.toLowerCase().includes(loweredSearchText));
 | 
			
		||||
                });
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            return result;
 | 
			
		||||
        },
 | 
			
		||||
    },
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										204
									
								
								src/components/MonitorListItem.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										204
									
								
								src/components/MonitorListItem.vue
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,204 @@
 | 
			
		||||
<template>
 | 
			
		||||
    <div>
 | 
			
		||||
        <router-link :to="monitorURL(monitor.id)" class="item" :class="{ 'disabled': ! monitor.active }">
 | 
			
		||||
            <div class="row">
 | 
			
		||||
                <div class="col-9 col-md-8 small-padding" :class="{ 'monitor-item': $root.userHeartbeatBar == 'bottom' || $root.userHeartbeatBar == 'none' }">
 | 
			
		||||
                    <div class="info" :style="depthMargin">
 | 
			
		||||
                        <Uptime :monitor="monitor" type="24" :pill="true" />
 | 
			
		||||
                        <span v-if="hasChildren" class="collapse-padding" @click.prevent="changeCollapsed">
 | 
			
		||||
                            <font-awesome-icon icon="chevron-down" class="animated" :class="{ collapsed: isCollapsed}" />
 | 
			
		||||
                        </span>
 | 
			
		||||
                        {{ monitorName }}
 | 
			
		||||
                    </div>
 | 
			
		||||
                    <div class="tags">
 | 
			
		||||
                        <Tag v-for="tag in monitor.tags" :key="tag" :item="tag" :size="'sm'" />
 | 
			
		||||
                    </div>
 | 
			
		||||
                </div>
 | 
			
		||||
                <div v-show="$root.userHeartbeatBar == 'normal'" :key="$root.userHeartbeatBar" class="col-3 col-md-4">
 | 
			
		||||
                    <HeartbeatBar size="small" :monitor-id="monitor.id" />
 | 
			
		||||
                </div>
 | 
			
		||||
            </div>
 | 
			
		||||
 | 
			
		||||
            <div v-if="$root.userHeartbeatBar == 'bottom'" class="row">
 | 
			
		||||
                <div class="col-12 bottom-style">
 | 
			
		||||
                    <HeartbeatBar size="small" :monitor-id="monitor.id" />
 | 
			
		||||
                </div>
 | 
			
		||||
            </div>
 | 
			
		||||
        </router-link>
 | 
			
		||||
 | 
			
		||||
        <transition name="slide-fade-up">
 | 
			
		||||
            <div v-if="!isCollapsed" class="childs">
 | 
			
		||||
                <MonitorListItem v-for="(item, index) in sortedChildMonitorList" :key="index" :monitor="item" :isSearch="isSearch" :depth="depth + 1" />
 | 
			
		||||
            </div>
 | 
			
		||||
        </transition>
 | 
			
		||||
    </div>
 | 
			
		||||
</template>
 | 
			
		||||
 | 
			
		||||
<script>
 | 
			
		||||
import HeartbeatBar from "../components/HeartbeatBar.vue";
 | 
			
		||||
import Tag from "../components/Tag.vue";
 | 
			
		||||
import Uptime from "../components/Uptime.vue";
 | 
			
		||||
import { getMonitorRelativeURL } from "../util.ts";
 | 
			
		||||
 | 
			
		||||
export default {
 | 
			
		||||
    name: "MonitorListItem",
 | 
			
		||||
    components: {
 | 
			
		||||
        Uptime,
 | 
			
		||||
        HeartbeatBar,
 | 
			
		||||
        Tag,
 | 
			
		||||
    },
 | 
			
		||||
    props: {
 | 
			
		||||
        /** Monitor this represents */
 | 
			
		||||
        monitor: {
 | 
			
		||||
            type: Object,
 | 
			
		||||
            default: null,
 | 
			
		||||
        },
 | 
			
		||||
        /** If the user is currently searching */
 | 
			
		||||
        isSearch: {
 | 
			
		||||
            type: Boolean,
 | 
			
		||||
            default: false,
 | 
			
		||||
        },
 | 
			
		||||
        /** How many ancestors are above this monitor */
 | 
			
		||||
        depth: {
 | 
			
		||||
            type: Number,
 | 
			
		||||
            default: 0,
 | 
			
		||||
        },
 | 
			
		||||
    },
 | 
			
		||||
    data() {
 | 
			
		||||
        return {
 | 
			
		||||
            isCollapsed: true,
 | 
			
		||||
        };
 | 
			
		||||
    },
 | 
			
		||||
    computed: {
 | 
			
		||||
        sortedChildMonitorList() {
 | 
			
		||||
            let result = Object.values(this.$root.monitorList);
 | 
			
		||||
 | 
			
		||||
            result = result.filter(childMonitor => childMonitor.parent === this.monitor.id);
 | 
			
		||||
 | 
			
		||||
            result.sort((m1, m2) => {
 | 
			
		||||
 | 
			
		||||
                if (m1.active !== m2.active) {
 | 
			
		||||
                    if (m1.active === 0) {
 | 
			
		||||
                        return 1;
 | 
			
		||||
                    }
 | 
			
		||||
 | 
			
		||||
                    if (m2.active === 0) {
 | 
			
		||||
                        return -1;
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                if (m1.weight !== m2.weight) {
 | 
			
		||||
                    if (m1.weight > m2.weight) {
 | 
			
		||||
                        return -1;
 | 
			
		||||
                    }
 | 
			
		||||
 | 
			
		||||
                    if (m1.weight < m2.weight) {
 | 
			
		||||
                        return 1;
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                return m1.name.localeCompare(m2.name);
 | 
			
		||||
            });
 | 
			
		||||
 | 
			
		||||
            return result;
 | 
			
		||||
        },
 | 
			
		||||
        hasChildren() {
 | 
			
		||||
            return this.sortedChildMonitorList.length > 0;
 | 
			
		||||
        },
 | 
			
		||||
        depthMargin() {
 | 
			
		||||
            return {
 | 
			
		||||
                marginLeft: `${31 * this.depth}px`,
 | 
			
		||||
            };
 | 
			
		||||
        },
 | 
			
		||||
        monitorName() {
 | 
			
		||||
            if (this.isSearch) {
 | 
			
		||||
                return this.monitor.pathName;
 | 
			
		||||
            } else {
 | 
			
		||||
                return this.monitor.name;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    },
 | 
			
		||||
    beforeMount() {
 | 
			
		||||
 | 
			
		||||
        // Always unfold if monitor is accessed directly
 | 
			
		||||
        if (this.monitor.childrenIDs.includes(parseInt(this.$route.params.id))) {
 | 
			
		||||
            this.isCollapsed = false;
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // Set collapsed value based on local storage
 | 
			
		||||
        let storage = window.localStorage.getItem("monitorCollapsed");
 | 
			
		||||
        if (storage === null) {
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        let storageObject = JSON.parse(storage);
 | 
			
		||||
        if (storageObject[`monitor_${this.monitor.id}`] == null) {
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        this.isCollapsed = storageObject[`monitor_${this.monitor.id}`];
 | 
			
		||||
    },
 | 
			
		||||
    methods: {
 | 
			
		||||
        /**
 | 
			
		||||
         * Changes the collapsed value of the current monitor and saves it to local storage
 | 
			
		||||
         */
 | 
			
		||||
        changeCollapsed() {
 | 
			
		||||
            this.isCollapsed = !this.isCollapsed;
 | 
			
		||||
 | 
			
		||||
            // Save collapsed value into local storage
 | 
			
		||||
            let storage = window.localStorage.getItem("monitorCollapsed");
 | 
			
		||||
            let storageObject = {};
 | 
			
		||||
            if (storage !== null) {
 | 
			
		||||
                storageObject = JSON.parse(storage);
 | 
			
		||||
            }
 | 
			
		||||
            storageObject[`monitor_${this.monitor.id}`] = this.isCollapsed;
 | 
			
		||||
 | 
			
		||||
            window.localStorage.setItem("monitorCollapsed", JSON.stringify(storageObject));
 | 
			
		||||
        },
 | 
			
		||||
        /**
 | 
			
		||||
         * Get URL of monitor
 | 
			
		||||
         * @param {number} id ID of monitor
 | 
			
		||||
         * @returns {string} Relative URL of monitor
 | 
			
		||||
         */
 | 
			
		||||
        monitorURL(id) {
 | 
			
		||||
            return getMonitorRelativeURL(id);
 | 
			
		||||
        },
 | 
			
		||||
    },
 | 
			
		||||
};
 | 
			
		||||
</script>
 | 
			
		||||
 | 
			
		||||
<style lang="scss" scoped>
 | 
			
		||||
@import "../assets/vars.scss";
 | 
			
		||||
 | 
			
		||||
.small-padding {
 | 
			
		||||
    padding-left: 5px !important;
 | 
			
		||||
    padding-right: 5px !important;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.collapse-padding {
 | 
			
		||||
    padding-left: 8px !important;
 | 
			
		||||
    padding-right: 2px !important;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// .monitor-item {
 | 
			
		||||
//     width: 100%;
 | 
			
		||||
// }
 | 
			
		||||
 | 
			
		||||
.tags {
 | 
			
		||||
    margin-top: 4px;
 | 
			
		||||
    padding-left: 67px;
 | 
			
		||||
    display: flex;
 | 
			
		||||
    flex-wrap: wrap;
 | 
			
		||||
    gap: 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.collapsed {
 | 
			
		||||
    transform: rotate(-90deg);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.animated {
 | 
			
		||||
    transition: all 0.2s $easing-in;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
</style>
 | 
			
		||||
@@ -683,6 +683,6 @@
 | 
			
		||||
    "backupDescription2": "ملحوظة",
 | 
			
		||||
    "languageName": "العربية",
 | 
			
		||||
    "Game": "الألعاب",
 | 
			
		||||
    "List": "قائمة",
 | 
			
		||||
    "List": "القائمة",
 | 
			
		||||
    "statusMaintenance": "الصيانة"
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -178,7 +178,7 @@
 | 
			
		||||
    "Degraded Service": "Всички услуги са недостъпни",
 | 
			
		||||
    "Add Group": "Добави група",
 | 
			
		||||
    "Add a monitor": "Добави монитор",
 | 
			
		||||
    "Edit Status Page": "Редактиране Статус страница",
 | 
			
		||||
    "Edit Status Page": "Редактиране на статус страницата",
 | 
			
		||||
    "Go to Dashboard": "Към Таблото",
 | 
			
		||||
    "telegram": "Telegram",
 | 
			
		||||
    "webhook": "Уеб кука",
 | 
			
		||||
@@ -200,7 +200,7 @@
 | 
			
		||||
    "mattermost": "Mattermost",
 | 
			
		||||
    "Status Page": "Статус страница",
 | 
			
		||||
    "Status Pages": "Статус страници",
 | 
			
		||||
    "Primary Base URL": "Основен базов URL адрес",
 | 
			
		||||
    "Primary Base URL": "Базов URL адрес",
 | 
			
		||||
    "Push URL": "Генериран Push URL адрес",
 | 
			
		||||
    "needPushEvery": "Необходимо е да извършвате заявка към този URL адрес на всеки {0} секунди.",
 | 
			
		||||
    "pushOptionalParams": "Допълнителни, но не задължителни параметри: {0}",
 | 
			
		||||
@@ -591,7 +591,7 @@
 | 
			
		||||
    "All Status Pages": "Всички статус страници",
 | 
			
		||||
    "Select status pages...": "Изберете статус страници…",
 | 
			
		||||
    "recurringIntervalMessage": "Изпълнявай ежедневно | Изпълнявай всеки {0} дни",
 | 
			
		||||
    "affectedMonitorsDescription": "Изберете монитори, засегнати от текущата поддръжка",
 | 
			
		||||
    "affectedMonitorsDescription": "Изберете монитори, попадащи в обсега на текущата поддръжка",
 | 
			
		||||
    "affectedStatusPages": "Покажи това съобщение за поддръжка на избрани статус страници",
 | 
			
		||||
    "atLeastOneMonitor": "Изберете поне един засегнат монитор",
 | 
			
		||||
    "deleteMaintenanceMsg": "Сигурни ли сте, че желаете да изтриете тази поддръжка?",
 | 
			
		||||
@@ -652,7 +652,7 @@
 | 
			
		||||
    "dnsCacheDescription": "Възможно е да не работи в IPv6 среда - деактивирайте, ако срещнете проблеми.",
 | 
			
		||||
    "Single Maintenance Window": "Единичен времеви интервал за поддръжка",
 | 
			
		||||
    "Maintenance Time Window of a Day": "Времеви интервал от деня за поддръжка",
 | 
			
		||||
    "Effective Date Range": "Интервал от дни на влизане в сила",
 | 
			
		||||
    "Effective Date Range": "Ефективен интервал от дни (по желание)",
 | 
			
		||||
    "Schedule Maintenance": "Планирай поддръжка",
 | 
			
		||||
    "Date and Time": "Дата и час",
 | 
			
		||||
    "DateTime Range": "Изтрий времеви интервал",
 | 
			
		||||
@@ -707,7 +707,7 @@
 | 
			
		||||
    "telegramSendSilently": "Изпрати тихо",
 | 
			
		||||
    "Clone Monitor": "Клониране на монитор",
 | 
			
		||||
    "Clone": "Клонирай",
 | 
			
		||||
    "cloneOf": "Клонинг на {0}",
 | 
			
		||||
    "cloneOf": "Клониран {0}",
 | 
			
		||||
    "Expiry": "Валиден до",
 | 
			
		||||
    "Expiry date": "Дата на изтичане",
 | 
			
		||||
    "Add Another": "Добави друг",
 | 
			
		||||
@@ -738,5 +738,43 @@
 | 
			
		||||
    "Add New Tag": "Добави нов етикет",
 | 
			
		||||
    "lunaseaTarget": "Цел",
 | 
			
		||||
    "lunaseaDeviceID": "ID на устройството",
 | 
			
		||||
    "lunaseaUserID": "ID на потребител"
 | 
			
		||||
    "lunaseaUserID": "ID на потребител",
 | 
			
		||||
    "twilioAccountSID": "Профил SID",
 | 
			
		||||
    "twilioAuthToken": "Удостоверяващ токен",
 | 
			
		||||
    "twilioFromNumber": "От номер",
 | 
			
		||||
    "twilioToNumber": "Към номер",
 | 
			
		||||
    "sameAsServerTimezone": "Kато часовата зона на сървъра",
 | 
			
		||||
    "startDateTime": "Старт Дата/Час",
 | 
			
		||||
    "endDateTime": "Край Дата/Час",
 | 
			
		||||
    "cronSchedule": "График: ",
 | 
			
		||||
    "invalidCronExpression": "Невалиден \"Cron\" израз: {0}",
 | 
			
		||||
    "cronExpression": "Израз тип \"Cron\"",
 | 
			
		||||
    "statusPageRefreshIn": "Обновяване след: {0}",
 | 
			
		||||
    "ntfyUsernameAndPassword": "Потребителско име и парола",
 | 
			
		||||
    "ntfyAuthenticationMethod": "Метод за удостоверяване",
 | 
			
		||||
    "pushoverMessageTtl": "TTL на съобщението (секунди)",
 | 
			
		||||
    "Open Badge Generator": "Отвори генератора на баджове",
 | 
			
		||||
    "Badge Generator": "Генератор на баджове на {0}",
 | 
			
		||||
    "Badge Type": "Тип бадж",
 | 
			
		||||
    "Badge Duration": "Продължителност на баджа",
 | 
			
		||||
    "Badge Prefix": "Префикс на баджа",
 | 
			
		||||
    "Badge Label Color": "Цвят на етикета на баджа",
 | 
			
		||||
    "Badge Color": "Цвят на баджа",
 | 
			
		||||
    "Badge Label Suffix": "Суфикс на етикета на значката",
 | 
			
		||||
    "Badge Up Color": "Цвят на баджа за достъпен",
 | 
			
		||||
    "Badge Down Color": "Цвят на баджа за недостъпен",
 | 
			
		||||
    "Badge Maintenance Color": "Цвят на баджа за поддръжка",
 | 
			
		||||
    "Badge Warn Color": "Цвят на баджа за предупреждение",
 | 
			
		||||
    "Badge Warn Days": "Дни за показване на баджа",
 | 
			
		||||
    "Badge Style": "Стил на баджа",
 | 
			
		||||
    "Badge value (For Testing only.)": "Стойност на баджа (само за тест.)",
 | 
			
		||||
    "Badge URL": "URL адрес на баджа",
 | 
			
		||||
    "Monitor Setting": "Настройка на монитор {0}",
 | 
			
		||||
    "Show Clickable Link": "Покажи връзка, която може да се кликне",
 | 
			
		||||
    "Show Clickable Link Description": "Ако е отбелязано, всеки който има достъп до тази статус страница, ще може да достъпва URL адреса на монитора.",
 | 
			
		||||
    "Badge Label": "Етикет на баджа",
 | 
			
		||||
    "Badge Suffix": "Суфикс на баджа",
 | 
			
		||||
    "Badge Label Prefix": "Префикс на етикета на значката",
 | 
			
		||||
    "Badge Pending Color": "Цвят на баджа за изчакващ",
 | 
			
		||||
    "Badge Down Days": "Колко дни баджът да не се показва"
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										1
									
								
								src/lang/ckb.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								src/lang/ckb.json
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1 @@
 | 
			
		||||
{}
 | 
			
		||||
@@ -1,5 +1,5 @@
 | 
			
		||||
{
 | 
			
		||||
    "languageName": "Czech",
 | 
			
		||||
    "languageName": "Čeština",
 | 
			
		||||
    "checkEverySecond": "Kontrolovat každých {0} sekund",
 | 
			
		||||
    "retryCheckEverySecond": "Opakovat každých {0} sekund",
 | 
			
		||||
    "resendEveryXTimes": "Znovu zaslat {0}krát",
 | 
			
		||||
@@ -134,7 +134,7 @@
 | 
			
		||||
    "Remember me": "Zapamatovat si mě",
 | 
			
		||||
    "Login": "Přihlášení",
 | 
			
		||||
    "No Monitors, please": "Žádné dohledy, prosím",
 | 
			
		||||
    "add one": "přidat jeden",
 | 
			
		||||
    "add one": "začněte přidáním nového",
 | 
			
		||||
    "Notification Type": "Typ oznámení",
 | 
			
		||||
    "Email": "E-mail",
 | 
			
		||||
    "Test": "Test",
 | 
			
		||||
@@ -518,7 +518,7 @@
 | 
			
		||||
    "PushDeer Key": "PushDeer klíč",
 | 
			
		||||
    "Footer Text": "Text v patičce",
 | 
			
		||||
    "Show Powered By": "Zobrazit \"Poskytuje\"",
 | 
			
		||||
    "Domain Names": "Názvy domén",
 | 
			
		||||
    "Domain Names": "Doménová jména",
 | 
			
		||||
    "signedInDisp": "Přihlášen jako {0}",
 | 
			
		||||
    "signedInDispDisabled": "Ověření je vypnuté.",
 | 
			
		||||
    "RadiusSecret": "Tajemství Radius",
 | 
			
		||||
@@ -546,7 +546,7 @@
 | 
			
		||||
    "pushoversounds cashregister": "Pokladna",
 | 
			
		||||
    "pushoversounds classical": "Classical",
 | 
			
		||||
    "pushoversounds cosmic": "Kosmický",
 | 
			
		||||
    "pushoversounds falling": "Falling",
 | 
			
		||||
    "pushoversounds falling": "Padající",
 | 
			
		||||
    "pushoversounds gamelan": "Gamelan",
 | 
			
		||||
    "pushoversounds incoming": "Příchozí",
 | 
			
		||||
    "pushoversounds intermission": "Přestávka",
 | 
			
		||||
@@ -669,7 +669,7 @@
 | 
			
		||||
    "Free Mobile User Identifier": "Identifikátor uživatele Free Mobile",
 | 
			
		||||
    "Free Mobile API Key": "API klíč Free Mobile",
 | 
			
		||||
    "Enable TLS": "Povolit TLS",
 | 
			
		||||
    "Proto Service Name": "Proto Service Name",
 | 
			
		||||
    "Proto Service Name": "Jméno Proto Service",
 | 
			
		||||
    "Proto Method": "Proto metoda",
 | 
			
		||||
    "Proto Content": "Proto obsah",
 | 
			
		||||
    "Economy": "Úsporná",
 | 
			
		||||
@@ -705,9 +705,9 @@
 | 
			
		||||
    "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",
 | 
			
		||||
    "Clone": "Duplikovat",
 | 
			
		||||
    "cloneOf": "Kopie {0}",
 | 
			
		||||
    "Clone Monitor": "Duplikovat dohled",
 | 
			
		||||
    "API Keys": "API klíče",
 | 
			
		||||
    "Expiry": "Platnost",
 | 
			
		||||
    "Don't expire": "Nevyprší",
 | 
			
		||||
@@ -749,5 +749,29 @@
 | 
			
		||||
    "cronSchedule": "Plán: ",
 | 
			
		||||
    "invalidCronExpression": "Neplatný cron výraz: {0}",
 | 
			
		||||
    "startDateTime": "Počáteční datum/čas",
 | 
			
		||||
    "endDateTime": "Datum/čas konce"
 | 
			
		||||
    "endDateTime": "Datum/čas konce",
 | 
			
		||||
    "ntfyAuthenticationMethod": "Způsob ověření",
 | 
			
		||||
    "ntfyUsernameAndPassword": "Uživatelské jméno a heslo",
 | 
			
		||||
    "pushoverMessageTtl": "Zpráva TTL (Sekund)",
 | 
			
		||||
    "Show Clickable Link": "Zobrazit klikatelný odkaz",
 | 
			
		||||
    "Show Clickable Link Description": "Pokud je zaškrtnuto, všichni, kdo mají přístup k této stavové stránce, mají přístup k adrese URL monitoru.",
 | 
			
		||||
    "Open Badge Generator": "Otevřít generátor odznaků",
 | 
			
		||||
    "Badge Type": "Typ odznaku",
 | 
			
		||||
    "Badge Duration": "Délka platnosti odznaku",
 | 
			
		||||
    "Badge Label": "Štítek odznaku",
 | 
			
		||||
    "Badge Prefix": "Prefix odznaku",
 | 
			
		||||
    "Monitor Setting": "{0}'s Nastavení dohledu",
 | 
			
		||||
    "Badge Generator": "{0}'s Generátor odznaků",
 | 
			
		||||
    "Badge Label Color": "Barva štítku odznaku",
 | 
			
		||||
    "Badge Color": "Barva odznaku",
 | 
			
		||||
    "Badge Style": "Styl odznaku",
 | 
			
		||||
    "Badge Label Suffix": "Přípona štítku odznaku",
 | 
			
		||||
    "Badge URL": "URL odznaku",
 | 
			
		||||
    "Badge Suffix": "Přípona odznaku",
 | 
			
		||||
    "Badge Label Prefix": "Prefix štítku odznaku",
 | 
			
		||||
    "Badge Up Color": "Barva odzanaku při Běží",
 | 
			
		||||
    "Badge Down Color": "Barva odznaku při Nedostupné",
 | 
			
		||||
    "Badge Pending Color": "Barva odznaku při Pauze",
 | 
			
		||||
    "Badge Maintenance Color": "Barva odznaku při Údržbě",
 | 
			
		||||
    "Badge Warn Color": "Barva odznaku při Upozornění"
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -37,7 +37,7 @@
 | 
			
		||||
    "checkEverySecond": "Tjek hvert {0} sekund",
 | 
			
		||||
    "Response": "Respons",
 | 
			
		||||
    "Ping": "Ping",
 | 
			
		||||
    "Monitor Type": "Overvåger Type",
 | 
			
		||||
    "Monitor Type": "Overvåger type",
 | 
			
		||||
    "Keyword": "Nøgleord",
 | 
			
		||||
    "Friendly Name": "Visningsnavn",
 | 
			
		||||
    "URL": "URL",
 | 
			
		||||
@@ -144,7 +144,7 @@
 | 
			
		||||
    "retryCheckEverySecond": "Prøv igen hvert {0} sekund.",
 | 
			
		||||
    "importHandleDescription": "Vælg 'Spring over eksisterende', hvis du vil springe over hver overvåger eller underretning med samme navn. 'Overskriv' sletter alle eksisterende overvågere og underretninger.",
 | 
			
		||||
    "confirmImportMsg": "Er du sikker på at importere sikkerhedskopien? Sørg for, at du har valgt den rigtige importindstilling.",
 | 
			
		||||
    "Heartbeat Retry Interval": "Hjerteslag Gentagelsesinterval",
 | 
			
		||||
    "Heartbeat Retry Interval": "Hjerteslag gentagelsesinterval",
 | 
			
		||||
    "Import Backup": "Importer Backup",
 | 
			
		||||
    "Export Backup": "Eksporter Backup",
 | 
			
		||||
    "Skip existing": "Spring over eksisterende",
 | 
			
		||||
@@ -166,14 +166,14 @@
 | 
			
		||||
    "Purple": "Lilla",
 | 
			
		||||
    "Pink": "Pink",
 | 
			
		||||
    "Search...": "Søg…",
 | 
			
		||||
    "Avg. Ping": "Gns. Ping",
 | 
			
		||||
    "Avg. Response": "Gns. Respons",
 | 
			
		||||
    "Avg. Ping": "Gns. ping",
 | 
			
		||||
    "Avg. Response": "Gns. respons",
 | 
			
		||||
    "Entry Page": "Entry Side",
 | 
			
		||||
    "statusPageNothing": "Intet her, tilføj venligst en Gruppe eller en Overvåger.",
 | 
			
		||||
    "No Services": "Ingen Tjenester",
 | 
			
		||||
    "All Systems Operational": "Alle Systemer i Drift",
 | 
			
		||||
    "Partially Degraded Service": "Delvist Forringet Service",
 | 
			
		||||
    "Degraded Service": "Forringet Service",
 | 
			
		||||
    "Partially Degraded Service": "Delvist forringet service",
 | 
			
		||||
    "Degraded Service": "Forringet service",
 | 
			
		||||
    "Add Group": "Tilføj Gruppe",
 | 
			
		||||
    "Add a monitor": "Tilføj en Overvåger",
 | 
			
		||||
    "Edit Status Page": "Rediger Statusside",
 | 
			
		||||
@@ -314,7 +314,7 @@
 | 
			
		||||
    "Steam API Key": "Steam API-nøgle",
 | 
			
		||||
    "Shrink Database": "Krymp Database",
 | 
			
		||||
    "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",
 | 
			
		||||
    "HTTP Options": "HTTP Valgmuligheder",
 | 
			
		||||
    "Create Incident": "Opret Annoncering",
 | 
			
		||||
@@ -447,7 +447,7 @@
 | 
			
		||||
    "Docker Hosts": "Docker Hosts",
 | 
			
		||||
    "loadingError": "Kan ikke hente dataene, prøv igen senere.",
 | 
			
		||||
    "Custom": "Brugerdefineret",
 | 
			
		||||
    "Monitor": "Monitor | Monitors",
 | 
			
		||||
    "Monitor": "Overvåger | Overvågere",
 | 
			
		||||
    "Specific Monitor Type": "Specifik monitor-type",
 | 
			
		||||
    "topic": "Emne",
 | 
			
		||||
    "Fingerprint:": "Fingerprint:",
 | 
			
		||||
@@ -580,5 +580,7 @@
 | 
			
		||||
    "Expiry date": "Udløbsdato",
 | 
			
		||||
    "Expires": "Udløber",
 | 
			
		||||
    "deleteAPIKeyMsg": "Er du sikker på du vil slette denne API nøgle?",
 | 
			
		||||
    "pagertreeDoNothing": "Gør intet"
 | 
			
		||||
    "pagertreeDoNothing": "Gør intet",
 | 
			
		||||
    "Start of maintenance": "Start på vedligeholdelse",
 | 
			
		||||
    "Add New Tag": "Tilføj nyt tag"
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -10,6 +10,7 @@
 | 
			
		||||
    "Version": "Version",
 | 
			
		||||
    "Check Update On GitHub": "Auf GitHub nach Updates suchen",
 | 
			
		||||
    "List": "Liste",
 | 
			
		||||
    "Home": "Home",
 | 
			
		||||
    "Add": "Hinzufügen",
 | 
			
		||||
    "Add New Monitor": "Neuen Monitor hinzufügen",
 | 
			
		||||
    "Quick Stats": "Übersicht",
 | 
			
		||||
@@ -17,6 +18,8 @@
 | 
			
		||||
    "Down": "Inaktiv",
 | 
			
		||||
    "Pending": "Ausstehend",
 | 
			
		||||
    "Unknown": "Unbekannt",
 | 
			
		||||
    "Cannot connect to the socket server": "Es kann keine Verbindung zum Socket-Server hergestellt werden",
 | 
			
		||||
    "Reconnecting...": "Die Verbindung wird wiederhergestellt...",
 | 
			
		||||
    "Pause": "Pausieren",
 | 
			
		||||
    "pauseDashboardHome": "Pausiert",
 | 
			
		||||
    "Name": "Name",
 | 
			
		||||
@@ -749,5 +752,29 @@
 | 
			
		||||
    "endDateTime": "Ende Datum/Uhrzeit",
 | 
			
		||||
    "cronExpression": "Cron-Ausdruck",
 | 
			
		||||
    "cronSchedule": "Zeitplan: ",
 | 
			
		||||
    "invalidCronExpression": "Ungültiger Cron-Ausdruck: {0}"
 | 
			
		||||
    "invalidCronExpression": "Ungültiger Cron-Ausdruck: {0}",
 | 
			
		||||
    "Open Badge Generator": "Open Badge Generator",
 | 
			
		||||
    "Badge Generator": "{0}'s Badge Generator",
 | 
			
		||||
    "Badge Type": "Badge Typ",
 | 
			
		||||
    "Badge Duration": "Badge Dauer",
 | 
			
		||||
    "Badge Label": "Badge Label",
 | 
			
		||||
    "Badge Prefix": "Badge Präfix",
 | 
			
		||||
    "Badge Suffix": "Badge Suffix",
 | 
			
		||||
    "Badge Label Color": "Badge Label Farbe",
 | 
			
		||||
    "Badge Color": "Badge Farbe",
 | 
			
		||||
    "Badge Label Prefix": "Badge Label Präfix",
 | 
			
		||||
    "Badge Up Color": "Badge Up Farbe",
 | 
			
		||||
    "Badge Maintenance Color": "Badge Wartung Farbe",
 | 
			
		||||
    "Badge Warn Color": "Badge Warnung Farbe",
 | 
			
		||||
    "Badge Warn Days": "Badge Warnung Tage",
 | 
			
		||||
    "Badge Style": "Badge Stil",
 | 
			
		||||
    "Badge URL": "Badge URL",
 | 
			
		||||
    "Badge Pending Color": "Badge Pending Farbe",
 | 
			
		||||
    "Badge Down Days": "Badge Down Tage",
 | 
			
		||||
    "Monitor Setting": "{0}'s Monitor Einstellung",
 | 
			
		||||
    "Show Clickable Link": "Klickbaren Link anzeigen",
 | 
			
		||||
    "Badge Label Suffix": "Badge Label Suffix",
 | 
			
		||||
    "Badge value (For Testing only.)": "Badge Wert (nur für Tests)",
 | 
			
		||||
    "Show Clickable Link Description": "Wenn diese Option aktiviert ist, kann jeder, der Zugriff auf diese Statusseite hat, auf die Monitor URL zugreifen.",
 | 
			
		||||
    "Badge Down Color": "Badge Down Farbe"
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -10,6 +10,7 @@
 | 
			
		||||
    "Version": "Version",
 | 
			
		||||
    "Check Update On GitHub": "Auf GitHub nach Updates suchen",
 | 
			
		||||
    "List": "Liste",
 | 
			
		||||
    "Home": "Home",
 | 
			
		||||
    "Add": "Hinzufügen",
 | 
			
		||||
    "Add New Monitor": "Neuen Monitor hinzufügen",
 | 
			
		||||
    "Quick Stats": "Übersicht",
 | 
			
		||||
@@ -17,6 +18,8 @@
 | 
			
		||||
    "Down": "Inaktiv",
 | 
			
		||||
    "Pending": "Ausstehend",
 | 
			
		||||
    "Unknown": "Unbekannt",
 | 
			
		||||
    "Cannot connect to the socket server": "Es kann keine Verbindung zum Socket-Server hergestellt werden",
 | 
			
		||||
    "Reconnecting...": "Die Verbindung wird wiederhergestellt...",
 | 
			
		||||
    "Pause": "Pausieren",
 | 
			
		||||
    "pauseDashboardHome": "Pausiert",
 | 
			
		||||
    "Name": "Name",
 | 
			
		||||
@@ -627,6 +630,7 @@
 | 
			
		||||
    "lastDay4": "4. letzter Tag im Monat",
 | 
			
		||||
    "No Maintenance": "Keine Wartung",
 | 
			
		||||
    "Schedule Maintenance": "Wartung planen",
 | 
			
		||||
    "Edit Maintenance": "Wartung bearbeiten",
 | 
			
		||||
    "pauseMaintenanceMsg": "Möchtest du wirklich pausieren?",
 | 
			
		||||
    "maintenanceStatus-under-maintenance": "Unter Wartung",
 | 
			
		||||
    "maintenanceStatus-inactive": "Inaktiv",
 | 
			
		||||
@@ -752,5 +756,31 @@
 | 
			
		||||
    "endDateTime": "Ende Datum/Uhrzeit",
 | 
			
		||||
    "cronExpression": "Cron-Ausdruck",
 | 
			
		||||
    "cronSchedule": "Zeitplan: ",
 | 
			
		||||
    "invalidCronExpression": "Ungültiger Cron-Ausdruck: {0}"
 | 
			
		||||
    "invalidCronExpression": "Ungültiger Cron-Ausdruck: {0}",
 | 
			
		||||
    "Show Clickable Link": "Klickbaren Link anzeigen",
 | 
			
		||||
    "Open Badge Generator": "Open Badge Generator",
 | 
			
		||||
    "Badge Generator": "{0}'s Badge Generator",
 | 
			
		||||
    "Badge Type": "Badge Typ",
 | 
			
		||||
    "Badge Duration": "Badge Dauer",
 | 
			
		||||
    "Badge Label": "Badge Label",
 | 
			
		||||
    "Show Clickable Link Description": "Wenn diese Option aktiviert ist, kann jeder, der Zugriff auf diese Statusseite hat, auf die Monitor-URL zugreifen.",
 | 
			
		||||
    "Badge Label Color": "Badge Label Farbe",
 | 
			
		||||
    "Badge Color": "Badge Farbe",
 | 
			
		||||
    "Badge Label Prefix": "Badge Label Präfix",
 | 
			
		||||
    "Badge Label Suffix": "Badge Label Suffix",
 | 
			
		||||
    "Badge Maintenance Color": "Badge Wartung Farbe",
 | 
			
		||||
    "Badge Warn Color": "Badge Warnung Farbe",
 | 
			
		||||
    "Badge Style": "Badge Stil",
 | 
			
		||||
    "Badge value (For Testing only.)": "Badge Wert (nur für Tests)",
 | 
			
		||||
    "Badge URL": "Badge URL",
 | 
			
		||||
    "Badge Up Color": "Badge Up Farbe",
 | 
			
		||||
    "Badge Down Color": "Badge Down Farbe",
 | 
			
		||||
    "Badge Pending Color": "Badge Pending Farbe",
 | 
			
		||||
    "Badge Down Days": "Badge Down Tage",
 | 
			
		||||
    "Monitor Setting": "{0}'s Monitor Einstellung",
 | 
			
		||||
    "Badge Prefix": "Badge Präfix",
 | 
			
		||||
    "Badge Suffix": "Badge Suffix",
 | 
			
		||||
    "Badge Warn Days": "Badge Warnung Tage",
 | 
			
		||||
    "Group": "Gruppe",
 | 
			
		||||
    "Monitor Group": "Monitor Gruppe"
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -695,5 +695,7 @@
 | 
			
		||||
    "Learn More": "Μάθετε περισσότερα",
 | 
			
		||||
    "Free Mobile User Identifier": "Free Mobile User Identifier",
 | 
			
		||||
    "Free Mobile API Key": "Free Mobile API Key",
 | 
			
		||||
    "smseaglePriority": "Προτεραιότητα μηνύματος (0-9, προεπιλογή = 0)"
 | 
			
		||||
    "smseaglePriority": "Προτεραιότητα μηνύματος (0-9, προεπιλογή = 0)",
 | 
			
		||||
    "statusPageRefreshIn": "Ανανέωση σε {0}",
 | 
			
		||||
    "Add New Tag": "Πρόσθεσε νέα ετικέτα"
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -13,6 +13,7 @@
 | 
			
		||||
    "Version": "Version",
 | 
			
		||||
    "Check Update On GitHub": "Check Update On GitHub",
 | 
			
		||||
    "List": "List",
 | 
			
		||||
    "Home": "Home",
 | 
			
		||||
    "Add": "Add",
 | 
			
		||||
    "Add New Monitor": "Add New Monitor",
 | 
			
		||||
    "Quick Stats": "Quick Stats",
 | 
			
		||||
@@ -22,6 +23,8 @@
 | 
			
		||||
    "statusMaintenance": "Maintenance",
 | 
			
		||||
    "Maintenance": "Maintenance",
 | 
			
		||||
    "Unknown": "Unknown",
 | 
			
		||||
    "Cannot connect to the socket server": "Cannot connect to the socket server",
 | 
			
		||||
    "Reconnecting...": "Reconnecting...",
 | 
			
		||||
    "General Monitor Type": "General Monitor Type",
 | 
			
		||||
    "Passive Monitor Type": "Passive Monitor Type",
 | 
			
		||||
    "Specific Monitor Type": "Specific Monitor Type",
 | 
			
		||||
@@ -437,6 +440,7 @@
 | 
			
		||||
    "Maintenance Time Window of a Day": "Maintenance Time Window of a Day",
 | 
			
		||||
    "Effective Date Range": "Effective Date Range (Optional)",
 | 
			
		||||
    "Schedule Maintenance": "Schedule Maintenance",
 | 
			
		||||
    "Edit Maintenance": "Edit Maintenance",
 | 
			
		||||
    "Date and Time": "Date and Time",
 | 
			
		||||
    "DateTime Range": "DateTime Range",
 | 
			
		||||
    "loadingError": "Cannot fetch the data, please try again later.",
 | 
			
		||||
@@ -744,5 +748,7 @@
 | 
			
		||||
    "Badge Down Days": "Badge Down Days",
 | 
			
		||||
    "Badge Style": "Badge Style",
 | 
			
		||||
    "Badge value (For Testing only.)": "Badge value (For Testing only.)",
 | 
			
		||||
    "Badge URL": "Badge URL"
 | 
			
		||||
    "Badge URL": "Badge URL",
 | 
			
		||||
    "Group": "Group",
 | 
			
		||||
    "Monitor Group": "Monitor Group"
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -748,5 +748,8 @@
 | 
			
		||||
    "cronExpression": "Expresión Cron",
 | 
			
		||||
    "cronSchedule": "Cronograma: ",
 | 
			
		||||
    "invalidCronExpression": "Expresión Cron invalida:{0}",
 | 
			
		||||
    "statusPageRefreshIn": "Reinicio en: {0}"
 | 
			
		||||
    "statusPageRefreshIn": "Reinicio en: {0}",
 | 
			
		||||
    "twilioAuthToken": "Token de Autentificación",
 | 
			
		||||
    "ntfyUsernameAndPassword": "Nombre de Usuario y Contraseña",
 | 
			
		||||
    "ntfyAuthenticationMethod": "Método de Autentificación"
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -74,7 +74,7 @@
 | 
			
		||||
    "Heartbeat Retry Interval": "Pultsu errepikatze interbaloak",
 | 
			
		||||
    "Advanced": "Aurreratua",
 | 
			
		||||
    "Upside Down Mode": "Alderantzizkako modua",
 | 
			
		||||
    "Max. Redirects": "Berbideratze max.",
 | 
			
		||||
    "Max. Redirects": "Birbideratze max.",
 | 
			
		||||
    "Accepted Status Codes": "Onartutako egoera kodeak",
 | 
			
		||||
    "Push URL": "Push URLa",
 | 
			
		||||
    "needPushEvery": "URL hau {0} segunduro deitu beharko zenuke.",
 | 
			
		||||
@@ -159,7 +159,7 @@
 | 
			
		||||
    "Token": "Tokena",
 | 
			
		||||
    "Show URI": "Erakutsi URIa",
 | 
			
		||||
    "Tags": "Etiketak",
 | 
			
		||||
    "Add New below or Select...": "Gehitu beste bat behean edo hautatu...",
 | 
			
		||||
    "Add New below or Select...": "Gehitu beste bat behean edo hautatu…",
 | 
			
		||||
    "Tag with this name already exist.": "Izen hau duen etiketa dagoeneko badago.",
 | 
			
		||||
    "Tag with this value already exist.": "Balio hau duen etiketa dagoeneko badago.",
 | 
			
		||||
    "color": "kolorea",
 | 
			
		||||
@@ -172,7 +172,7 @@
 | 
			
		||||
    "Indigo": "Indigo",
 | 
			
		||||
    "Purple": "Morea",
 | 
			
		||||
    "Pink": "Arrosa",
 | 
			
		||||
    "Search...": "Bilatu...",
 | 
			
		||||
    "Search...": "Bilatu…",
 | 
			
		||||
    "Avg. Ping": "Batazbesteko Pinga",
 | 
			
		||||
    "Avg. Response": "Batazbesteko erantzuna",
 | 
			
		||||
    "Entry Page": "Sarrera orria",
 | 
			
		||||
@@ -218,7 +218,7 @@
 | 
			
		||||
    "wayToGetDiscordURL": "You can get this by going to Server Settings -> Integrations -> Create Webhook",
 | 
			
		||||
    "Bot Display Name": "Bot Display Name",
 | 
			
		||||
    "Prefix Custom Message": "Prefix Custom Message",
 | 
			
		||||
    "Hello @everyone is...": "Hello {'@'}everyone is...",
 | 
			
		||||
    "Hello @everyone is...": "Kaixo {'@'}edonor da…",
 | 
			
		||||
    "teams": "Microsoft Teams",
 | 
			
		||||
    "Webhook URL": "Webhook URL",
 | 
			
		||||
    "wayToGetTeamsURL": "You can learn how to create a webhook URL {0}.",
 | 
			
		||||
@@ -325,7 +325,7 @@
 | 
			
		||||
    "Steam API Key": "Steam API Giltza",
 | 
			
		||||
    "Shrink Database": "Shrink Datubasea",
 | 
			
		||||
    "Pick a RR-Type...": "Pick a RR-Type...",
 | 
			
		||||
    "Pick Accepted Status Codes...": "Hautatu onartutako egoera kodeak...",
 | 
			
		||||
    "Pick Accepted Status Codes...": "Hautatu onartutako egoera kodeak…",
 | 
			
		||||
    "Default": "Lehenetsia",
 | 
			
		||||
    "HTTP Options": "HTTP Aukerak",
 | 
			
		||||
    "Create Incident": "Sortu inzidentzia",
 | 
			
		||||
@@ -527,7 +527,7 @@
 | 
			
		||||
    "There might be a typing error in the address.": "Idazketa-akats bat egon daiteke helbidean.",
 | 
			
		||||
    "What you can try:": "Probatu dezakezuna:",
 | 
			
		||||
    "Retype the address.": "Berridatzi helbidea.",
 | 
			
		||||
    "Go back to the previous page.": "Itzuli aurreko orrialdera",
 | 
			
		||||
    "Go back to the previous page.": "Itzuli aurreko orrialdera.",
 | 
			
		||||
    "Coming Soon": "Laster",
 | 
			
		||||
    "wayToGetClickSendSMSToken": "API erabiltzailea and API giltza hemendik lortu ditzakezu: {0} .",
 | 
			
		||||
    "Connection String": "Konexio katea",
 | 
			
		||||
@@ -537,5 +537,39 @@
 | 
			
		||||
    "ntfy Topic": "ntfy Topic",
 | 
			
		||||
    "Domain": "Domeinua",
 | 
			
		||||
    "Workstation": "Lan gunea",
 | 
			
		||||
    "disableCloudflaredNoAuthMsg": "Ez Auth moduan zaude, pasahitza ez da beharrezkoa."
 | 
			
		||||
    "disableCloudflaredNoAuthMsg": "Ez Auth moduan zaude, pasahitza ez da beharrezkoa.",
 | 
			
		||||
    "maintenanceStatus-ended": "Bukatuta",
 | 
			
		||||
    "maintenanceStatus-unknown": "Ezezaguna",
 | 
			
		||||
    "Enable": "Gaitu",
 | 
			
		||||
    "Strategy": "Estrategia",
 | 
			
		||||
    "General Monitor Type": "Monitorizazio mota orokorra",
 | 
			
		||||
    "Select status pages...": "Hautatu egoera orriak…",
 | 
			
		||||
    "Server Address": "Zerbitzari helbidea",
 | 
			
		||||
    "Learn More": "Ikasi gehiago",
 | 
			
		||||
    "weekdayShortTue": "Ast",
 | 
			
		||||
    "weekdayShortWed": "Asz",
 | 
			
		||||
    "Disable": "Desgaitu",
 | 
			
		||||
    "warningTimezone": "Zerbitzariaren orduzona erabiltzen ari da",
 | 
			
		||||
    "weekdayShortThu": "Og",
 | 
			
		||||
    "weekdayShortMon": "Asl",
 | 
			
		||||
    "Base URL": "Oinarri URLa",
 | 
			
		||||
    "high": "altua",
 | 
			
		||||
    "Economy": "Ekonomia",
 | 
			
		||||
    "Help": "Laguntza",
 | 
			
		||||
    "Game": "Jokoa",
 | 
			
		||||
    "statusMaintenance": "Mantenuan",
 | 
			
		||||
    "Maintenance": "Mantenua",
 | 
			
		||||
    "Passive Monitor Type": "Monitorizazio mota pasiboa",
 | 
			
		||||
    "Specific Monitor Type": "Zehaztutako monitorizazio mota",
 | 
			
		||||
    "markdownSupported": "Markdown sintaxia onartzen du",
 | 
			
		||||
    "Monitor": "Monitorizazio | Monitorizazioak",
 | 
			
		||||
    "resendDisabled": "Berbidaltzea desgaituta",
 | 
			
		||||
    "weekdayShortFri": "Ost",
 | 
			
		||||
    "weekdayShortSat": "Lar",
 | 
			
		||||
    "weekdayShortSun": "Iga",
 | 
			
		||||
    "dayOfWeek": "Asteko eguna",
 | 
			
		||||
    "dayOfMonth": "Hilabeteko eguna",
 | 
			
		||||
    "lastDay": "Azken eguna",
 | 
			
		||||
    "lastDay1": "Hilabeteko azken eguna",
 | 
			
		||||
    "Resend Notification if Down X times consecutively": "Bidali jakinarazpena X aldiz jarraian erortzen bada"
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -173,7 +173,7 @@
 | 
			
		||||
    "Entry Page": "صفحه ورودی",
 | 
			
		||||
    "statusPageNothing": "چیزی اینجا نیست، لطفا یک گروه و یا یک مانیتور اضافه کنید.",
 | 
			
		||||
    "No Services": "هیچ سرویسی موجود نیست",
 | 
			
		||||
    "All Systems Operational": "تمامی سیستمها عملیاتی هستند",
 | 
			
		||||
    "All Systems Operational": "تمامی سیستمها فعال هستند",
 | 
			
		||||
    "Partially Degraded Service": "افت نسبی کیفیت سرویس",
 | 
			
		||||
    "Degraded Service": "افت کامل کیفیت سرویس",
 | 
			
		||||
    "Add Group": "اضافه کردن گروه",
 | 
			
		||||
@@ -323,7 +323,7 @@
 | 
			
		||||
    "Customize": "شخصی سازی",
 | 
			
		||||
    "Custom Footer": "فوتر اختصاصی",
 | 
			
		||||
    "No Proxy": "بدون پروکسی",
 | 
			
		||||
    "Authentication": "احراز هویت",
 | 
			
		||||
    "Authentication": "اعتبارسنجی",
 | 
			
		||||
    "steamApiKeyDescription": "برای مانیتورینگ یک سرور استیم، شما نیاز به یک \"Steam Web-API key\" دارید. برای دریافت کلید میتوانید از اینجا اقدام کنید: ",
 | 
			
		||||
    "No Monitors": "بدون مانیتور",
 | 
			
		||||
    "Untitled Group": "دسته بنده نشده",
 | 
			
		||||
@@ -677,7 +677,7 @@
 | 
			
		||||
    "Access Token": "توکن دسترسی",
 | 
			
		||||
    "smtp": "ایمیل (SMTP)",
 | 
			
		||||
    "Device": "دستگاه",
 | 
			
		||||
    "Proxy server has authentication": "پروکسی سرور دارای احراز هویت",
 | 
			
		||||
    "Proxy server has authentication": "پروکسی سرور دارای اعتبارسنجی است",
 | 
			
		||||
    "Add New Tag": "اضافه کردن تگ جدید",
 | 
			
		||||
    "Custom": "غیره",
 | 
			
		||||
    "default": "پیش فرض",
 | 
			
		||||
@@ -718,5 +718,32 @@
 | 
			
		||||
    "endDateTime": "ساعت/روز پایان",
 | 
			
		||||
    "cronSchedule": "برنامه زمانی: ",
 | 
			
		||||
    "invalidCronExpression": "حالت کرون نامعتبر است: {0}",
 | 
			
		||||
    "cronExpression": "حالت کرون"
 | 
			
		||||
    "cronExpression": "حالت کرون",
 | 
			
		||||
    "ntfyAuthenticationMethod": "روش اعتبارسنجی",
 | 
			
		||||
    "ntfyUsernameAndPassword": "نام کاربری و رمز عبور",
 | 
			
		||||
    "pushoverMessageTtl": "TTL پیام (ثانیه)",
 | 
			
		||||
    "Show Clickable Link": "نمایش لینک های قابل کلیک",
 | 
			
		||||
    "Open Badge Generator": "باز کردن نشان ساز (Badge Generator)",
 | 
			
		||||
    "Badge Generator": "نشان ساز (Badge Generator) {0}",
 | 
			
		||||
    "Badge Type": "نوع نشان",
 | 
			
		||||
    "Badge Duration": "مدت نشان",
 | 
			
		||||
    "Badge Label": "برچسب نشان",
 | 
			
		||||
    "Badge Prefix": "پیشوند نشان",
 | 
			
		||||
    "Badge Suffix": "پسوند نشان",
 | 
			
		||||
    "Badge Label Color": "رنگ برچسب نشان",
 | 
			
		||||
    "Badge Color": "رنگ نشان",
 | 
			
		||||
    "Badge Label Prefix": "پیشوند برچسب نشان",
 | 
			
		||||
    "Badge Label Suffix": "پسوند برچسب نشان",
 | 
			
		||||
    "Badge Down Color": "رنگ نشان زمانی که مانیتور دچار قطعی و Down شده است",
 | 
			
		||||
    "Badge Maintenance Color": "رنگ نشان برای زمانی که مانیتور در حالت نگهداری است",
 | 
			
		||||
    "Badge Warn Color": "رنگ نشان زمانی که مانیتور در حالت هشدار است",
 | 
			
		||||
    "Badge Down Days": "روز هایی که مانیتور دچار قطعی شده است",
 | 
			
		||||
    "Badge Style": "حالت نشان",
 | 
			
		||||
    "Badge value (For Testing only.)": "مقدار نشان (فقط برای تست.)",
 | 
			
		||||
    "Badge URL": "آدرس نشان",
 | 
			
		||||
    "Monitor Setting": "تنظیمات مانتیور {0}",
 | 
			
		||||
    "Show Clickable Link Description": "اگر انتخاب شود، همه کسانی که به این صفحه وضعیت دسترسی دارند میتوانند به صفحه مانیتور نیز دسترسی داشته باشند.",
 | 
			
		||||
    "Badge Up Color": "رنگ نشان زمانی که مانیتور بدون مشکل و بالا است",
 | 
			
		||||
    "Badge Pending Color": "رنگ نشان زمانی که مانیتور در حال انتظار است",
 | 
			
		||||
    "Badge Warn Days": "روزهایی که مانیتور در حالت هشدار است"
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -59,7 +59,7 @@
 | 
			
		||||
    "Add New Monitor": "Ajouter une nouvelle sonde",
 | 
			
		||||
    "Quick Stats": "Résumé",
 | 
			
		||||
    "Up": "En ligne",
 | 
			
		||||
    "Down": "Hors ligne",
 | 
			
		||||
    "Down": "Bas",
 | 
			
		||||
    "Pending": "En attente",
 | 
			
		||||
    "Unknown": "Inconnu",
 | 
			
		||||
    "Pause": "En pause",
 | 
			
		||||
@@ -73,7 +73,7 @@
 | 
			
		||||
    "Delete": "Supprimer",
 | 
			
		||||
    "Current": "Actuellement",
 | 
			
		||||
    "Uptime": "Disponibilité",
 | 
			
		||||
    "Cert Exp.": "Expiration SSL",
 | 
			
		||||
    "Cert Exp.": "Expiration Cert SSL",
 | 
			
		||||
    "day": "jour | jours",
 | 
			
		||||
    "-day": "-jour",
 | 
			
		||||
    "hour": "heure",
 | 
			
		||||
@@ -329,7 +329,7 @@
 | 
			
		||||
    "Body": "Corps",
 | 
			
		||||
    "Headers": "En-têtes",
 | 
			
		||||
    "PushUrl": "URL Push",
 | 
			
		||||
    "HeadersInvalidFormat": "Les en-têtes de la requête ne sont pas dans un format JSON valide : ",
 | 
			
		||||
    "HeadersInvalidFormat": "Les en-têtes de la requête ne sont pas dans un format JSON valide : ",
 | 
			
		||||
    "BodyInvalidFormat": "Le corps de la requête n'est pas dans un format JSON valide : ",
 | 
			
		||||
    "Monitor History": "Historique de la sonde",
 | 
			
		||||
    "clearDataOlderThan": "Conserver l'historique des données de la sonde durant {0} jours.",
 | 
			
		||||
@@ -338,7 +338,7 @@
 | 
			
		||||
    "One record": "Un enregistrement",
 | 
			
		||||
    "steamApiKeyDescription": "Pour surveiller un serveur Steam, vous avez besoin d'une clé Steam Web-API. Vous pouvez enregistrer votre clé ici : ",
 | 
			
		||||
    "Current User": "Utilisateur actuel",
 | 
			
		||||
    "topic": "Topic",
 | 
			
		||||
    "topic": "Sujet",
 | 
			
		||||
    "topicExplanation": "Topic MQTT à surveiller",
 | 
			
		||||
    "successMessage": "Message de réussite",
 | 
			
		||||
    "successMessageExplanation": "Message MQTT qui sera considéré comme un succès",
 | 
			
		||||
@@ -699,7 +699,7 @@
 | 
			
		||||
    "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",
 | 
			
		||||
    "telegramMessageThreadIDDescription": "(Facultatif) Identifiant unique pour le fil de discussion ciblé (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",
 | 
			
		||||
@@ -749,5 +749,31 @@
 | 
			
		||||
    "endDateTime": "Date/heure de fin",
 | 
			
		||||
    "cronExpression": "Expression cron",
 | 
			
		||||
    "cronSchedule": "Calendrier : ",
 | 
			
		||||
    "invalidCronExpression": "Expression Cron non valide : {0}"
 | 
			
		||||
    "invalidCronExpression": "Expression Cron non valide : {0}",
 | 
			
		||||
    "ntfyUsernameAndPassword": "Nom d'utilisateur et mot de passe",
 | 
			
		||||
    "ntfyAuthenticationMethod": "Méthode d'authentification",
 | 
			
		||||
    "pushoverMessageTtl": "TTL Message (Secondes)",
 | 
			
		||||
    "Show Clickable Link": "Afficher le lien cliquable",
 | 
			
		||||
    "Show Clickable Link Description": "Si cette case est cochée, tous ceux qui ont accès à cette page d'état peuvent accéder à l'URL du moniteur.",
 | 
			
		||||
    "Open Badge Generator": "Ouvrir le générateur de badges",
 | 
			
		||||
    "Badge Type": "Type de badge",
 | 
			
		||||
    "Badge Duration": "Durée du badge",
 | 
			
		||||
    "Badge Prefix": "Préfixe de badge",
 | 
			
		||||
    "Badge Suffix": "Suffixe de badge",
 | 
			
		||||
    "Badge Label Color": "Couleur de l'étiquette du badge",
 | 
			
		||||
    "Badge Color": "Couleur du badge",
 | 
			
		||||
    "Badge Label Prefix": "Préfixe d'étiquette de badge",
 | 
			
		||||
    "Badge Label Suffix": "Suffixe d'étiquette de badge",
 | 
			
		||||
    "Badge Up Color": "Couleur du badge en ligne",
 | 
			
		||||
    "Badge Down Color": "Couleur du badge hors ligne",
 | 
			
		||||
    "Badge Pending Color": "Couleur du badge en attente",
 | 
			
		||||
    "Badge Maintenance Color": "Couleur du badge maintenance",
 | 
			
		||||
    "Badge Warn Color": "Couleur du badge d'avertissement",
 | 
			
		||||
    "Badge Warn Days": "Jours d'avertissement de badge",
 | 
			
		||||
    "Badge Style": "Style de badge",
 | 
			
		||||
    "Badge value (For Testing only.)": "Valeur du badge (Pour les tests uniquement.)",
 | 
			
		||||
    "Monitor Setting": "Réglage de la sonde {0}",
 | 
			
		||||
    "Badge Generator": "Générateur de badges {0}",
 | 
			
		||||
    "Badge Label": "Étiquette de badge",
 | 
			
		||||
    "Badge URL": "URL du badge"
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,10 +1,10 @@
 | 
			
		||||
{
 | 
			
		||||
    "languageName": "日本語",
 | 
			
		||||
    "checkEverySecond": "{0}秒ごとにチェックします",
 | 
			
		||||
    "retriesDescription": "サービスがダウンとしてマークされ、通知が送信されるまでの最大リトライ数",
 | 
			
		||||
    "retriesDescription": "サービスが完全に停止したと判断し、通知を送信する前に再接続を試みる最大回数",
 | 
			
		||||
    "ignoreTLSError": "HTTPS ウェブサイトの TLS/SSL エラーを無視する",
 | 
			
		||||
    "upsideDownModeDescription": "ステータスの扱いを逆にします。サービスに到達可能な場合は、DOWNとなる。",
 | 
			
		||||
    "maxRedirectDescription": "フォローするリダイレクトの最大数。リダイレクトを無効にするには0を設定する。",
 | 
			
		||||
    "upsideDownModeDescription": "稼働ステータスを反転して扱います。サービスに接続可能な場合は、停止として扱います。",
 | 
			
		||||
    "maxRedirectDescription": "必要な場合にリダイレクトする最大回数です。リダイレクトを無効にしたい場合は、0に設定してください。",
 | 
			
		||||
    "acceptedStatusCodesDescription": "成功した応答とみなされるステータスコードを選択する。",
 | 
			
		||||
    "passwordNotMatchMsg": "繰り返しのパスワードが一致しません。",
 | 
			
		||||
    "notificationDescription": "監視を機能させるには、監視に通知を割り当ててください。",
 | 
			
		||||
@@ -21,15 +21,15 @@
 | 
			
		||||
    "Language": "言語",
 | 
			
		||||
    "Appearance": "外観",
 | 
			
		||||
    "Theme": "テーマ",
 | 
			
		||||
    "General": "全般的",
 | 
			
		||||
    "General": "全般",
 | 
			
		||||
    "Version": "バージョン",
 | 
			
		||||
    "Check Update On GitHub": "GitHubでアップデートを確認する",
 | 
			
		||||
    "List": "一覧",
 | 
			
		||||
    "Add": "追加",
 | 
			
		||||
    "Add New Monitor": "監視の追加",
 | 
			
		||||
    "Quick Stats": "統計",
 | 
			
		||||
    "Up": "Up",
 | 
			
		||||
    "Down": "Down",
 | 
			
		||||
    "Up": "正常",
 | 
			
		||||
    "Down": "停止",
 | 
			
		||||
    "Pending": "中止",
 | 
			
		||||
    "Unknown": "不明",
 | 
			
		||||
    "Pause": "一時停止",
 | 
			
		||||
@@ -42,12 +42,12 @@
 | 
			
		||||
    "Edit": "編集",
 | 
			
		||||
    "Delete": "削除",
 | 
			
		||||
    "Current": "現在",
 | 
			
		||||
    "Uptime": "起動時間",
 | 
			
		||||
    "Uptime": "稼働時間",
 | 
			
		||||
    "Cert Exp.": "証明書有効期限",
 | 
			
		||||
    "day": "日 | 日間",
 | 
			
		||||
    "-day": "-日",
 | 
			
		||||
    "hour": "時間",
 | 
			
		||||
    "-hour": "-時間",
 | 
			
		||||
    "-hour": "時間",
 | 
			
		||||
    "Response": "レスポンス",
 | 
			
		||||
    "Ping": "Ping",
 | 
			
		||||
    "Monitor Type": "監視タイプ",
 | 
			
		||||
@@ -57,19 +57,19 @@
 | 
			
		||||
    "Hostname": "ホスト名",
 | 
			
		||||
    "Port": "ポート",
 | 
			
		||||
    "Heartbeat Interval": "監視間隔",
 | 
			
		||||
    "Retries": "Retries",
 | 
			
		||||
    "Advanced": "Advanced",
 | 
			
		||||
    "Upside Down Mode": "Upside Down Mode",
 | 
			
		||||
    "Retries": "再試行回数",
 | 
			
		||||
    "Advanced": "詳細設定",
 | 
			
		||||
    "Upside Down Mode": "反転モード",
 | 
			
		||||
    "Max. Redirects": "最大リダイレクト数",
 | 
			
		||||
    "Accepted Status Codes": "正常なステータスコード",
 | 
			
		||||
    "Save": "保存",
 | 
			
		||||
    "Notifications": "通知",
 | 
			
		||||
    "Not available, please setup.": "利用できません。設定してください。",
 | 
			
		||||
    "Not available, please setup.": "利用できません。設定が必要です。",
 | 
			
		||||
    "Setup Notification": "通知設定",
 | 
			
		||||
    "Light": "Light",
 | 
			
		||||
    "Dark": "Dark",
 | 
			
		||||
    "Auto": "Auto",
 | 
			
		||||
    "Theme - Heartbeat Bar": "Theme - Heartbeat Bar",
 | 
			
		||||
    "Light": "ライト",
 | 
			
		||||
    "Dark": "ダーク",
 | 
			
		||||
    "Auto": "自動",
 | 
			
		||||
    "Theme - Heartbeat Bar": "テーマ - 監視バー",
 | 
			
		||||
    "Normal": "通常",
 | 
			
		||||
    "Bottom": "下部",
 | 
			
		||||
    "None": "なし",
 | 
			
		||||
@@ -120,7 +120,7 @@
 | 
			
		||||
    "Also apply to existing monitors": "既存のモニターにも適用する",
 | 
			
		||||
    "Export": "エクスポート",
 | 
			
		||||
    "Import": "インポート",
 | 
			
		||||
    "backupDescription": "すべての監視と通知方法をJSONファイルにできます。",
 | 
			
		||||
    "backupDescription": "すべての監視と通知設定をJSONファイルとしてバックアップすることができます。",
 | 
			
		||||
    "backupDescription2": "※ 履歴と統計のデータはバックアップされません。",
 | 
			
		||||
    "backupDescription3": "通知に使用するトークンなどの機密データも含まれています。注意して扱ってください。",
 | 
			
		||||
    "alertNoFile": "インポートするファイルを選択してください。",
 | 
			
		||||
@@ -171,7 +171,7 @@
 | 
			
		||||
    "Shrink Database": "データベースの縮小",
 | 
			
		||||
    "Start": "始める",
 | 
			
		||||
    "Retry": "リトライ",
 | 
			
		||||
    "Please read": "読んでください",
 | 
			
		||||
    "Please read": "次のリンクを参考にしてください",
 | 
			
		||||
    "Orange": "橙",
 | 
			
		||||
    "Gateway Type": "ゲートウェイの種類",
 | 
			
		||||
    "Game": "ゲーム",
 | 
			
		||||
@@ -240,7 +240,7 @@
 | 
			
		||||
    "Unpin": "ピンを外す",
 | 
			
		||||
    "Switch to Light Theme": "ライトテーマに切り替える",
 | 
			
		||||
    "Hide Tags": "タグを隠す",
 | 
			
		||||
    "Description": "概要",
 | 
			
		||||
    "Description": "メモ",
 | 
			
		||||
    "Untitled Group": "名前の無いグループ",
 | 
			
		||||
    "Services": "サービス",
 | 
			
		||||
    "Discard": "破棄",
 | 
			
		||||
@@ -258,7 +258,7 @@
 | 
			
		||||
    "proxyDescription": "プロキシはモニターに割り当てられていないと機能しません。",
 | 
			
		||||
    "setAsDefaultProxyDescription": "このプロキシは、新しいモニターに対してデフォルトで有効になっています。モニターごとに個別にプロキシを無効にすることができます。",
 | 
			
		||||
    "Remove Token": "Tokenを削除",
 | 
			
		||||
    "Stop": "止める",
 | 
			
		||||
    "Stop": "停止",
 | 
			
		||||
    "Add New Status Page": "新しいステータスページを追加",
 | 
			
		||||
    "Next": "次へ",
 | 
			
		||||
    "No Proxy": "プロキシなし",
 | 
			
		||||
@@ -500,7 +500,7 @@
 | 
			
		||||
    "default: notify all devices": "デフォルト:すべてのデバイスに通知する",
 | 
			
		||||
    "Trigger type:": "トリガータイプ:",
 | 
			
		||||
    "Event data:": "イベントデータ:",
 | 
			
		||||
    "backupOutdatedWarning": "非推奨:多くの機能が追加され、このバックアップ機能は少しメンテナンスされていないため、完全なバックアップの生成や復元はできません。",
 | 
			
		||||
    "backupOutdatedWarning": "非推奨: 多くの機能に変更があり、バックアップ機能の開発が一部滞っているため、完全なバックアップの作成や復元ができません。",
 | 
			
		||||
    "backupRecommend": "代わりにボリュームまたはデータフォルダ(./data/)を直接バックアップしてください。",
 | 
			
		||||
    "recurringInterval": "インターバル",
 | 
			
		||||
    "Recurring": "繰り返し",
 | 
			
		||||
@@ -512,5 +512,9 @@
 | 
			
		||||
    "Device Token": "デバイストークン",
 | 
			
		||||
    "recurringIntervalMessage": "毎日1回実行する|{0} 日に1回実行する",
 | 
			
		||||
    "Add New Tag": "新しいタグを追加",
 | 
			
		||||
    "statusPageMaintenanceEndDate": "終了日"
 | 
			
		||||
    "statusPageMaintenanceEndDate": "終了日",
 | 
			
		||||
    "Body Encoding": "ボディエンコード",
 | 
			
		||||
    "Learn More": "さらに詳しく",
 | 
			
		||||
    "infiniteRetention": "保持期間を無制限にしたい場合は、0に設定してください。",
 | 
			
		||||
    "Display Timezone": "表示タイムゾーン"
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -748,5 +748,6 @@
 | 
			
		||||
    "lunaseaTarget": "대상",
 | 
			
		||||
    "lunaseaDeviceID": "기기 ID",
 | 
			
		||||
    "statusPageRefreshIn": "{0} 후 새로고침",
 | 
			
		||||
    "telegramMessageThreadIDDescription": "포럼의 대상 메시지 쓰레드(주제)에 대한 선택적 고유 식별인, 포럼 관리자 그룹에만 해당"
 | 
			
		||||
    "telegramMessageThreadIDDescription": "포럼의 대상 메시지 쓰레드(주제)에 대한 선택적 고유 식별인, 포럼 관리자 그룹에만 해당",
 | 
			
		||||
    "pagertreeSilent": "없음"
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										28
									
								
								src/lang/ms.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										28
									
								
								src/lang/ms.json
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,28 @@
 | 
			
		||||
{
 | 
			
		||||
    "Help": "Bantuan",
 | 
			
		||||
    "New Update": "Kemaskini baharu",
 | 
			
		||||
    "Appearance": "Penampilan",
 | 
			
		||||
    "Theme": "Tema",
 | 
			
		||||
    "General": "Umum",
 | 
			
		||||
    "Game": "Permainan",
 | 
			
		||||
    "Primary Base URL": "URL Pangkalan Utama",
 | 
			
		||||
    "Version": "Versi",
 | 
			
		||||
    "Add": "Menambah",
 | 
			
		||||
    "Quick Stats": "Statistik ringkas",
 | 
			
		||||
    "Up": "Dalam talian",
 | 
			
		||||
    "Down": "Luar talian",
 | 
			
		||||
    "Pending": "Belum selesai",
 | 
			
		||||
    "statusMaintenance": "Membaiki",
 | 
			
		||||
    "Maintenance": "Membaiki",
 | 
			
		||||
    "Unknown": "Tidak ketahui",
 | 
			
		||||
    "General Monitor Type": "Jenis monitor umum",
 | 
			
		||||
    "Check Update On GitHub": "Semak kemas kini dalam GitHub",
 | 
			
		||||
    "List": "Senarai",
 | 
			
		||||
    "Specific Monitor Type": "Jenis monitor spesifik",
 | 
			
		||||
    "markdownSupported": "Sintaks markdown disokong",
 | 
			
		||||
    "languageName": "Bahasa inggeris",
 | 
			
		||||
    "Dashboard": "Papan pemuka",
 | 
			
		||||
    "Language": "Bahasa",
 | 
			
		||||
    "Add New Monitor": "Tambah monitor baharu",
 | 
			
		||||
    "Passive Monitor Type": "Jenis monitor pasif"
 | 
			
		||||
}
 | 
			
		||||
@@ -536,11 +536,11 @@
 | 
			
		||||
    "pushoversounds cosmic": "Kosmiczny",
 | 
			
		||||
    "pushoversounds falling": "Spadek",
 | 
			
		||||
    "pushoversounds gamelan": "Gamelan",
 | 
			
		||||
    "pushoversounds incoming": "Incoming",
 | 
			
		||||
    "pushoversounds intermission": "Intermission",
 | 
			
		||||
    "pushoversounds incoming": "Przychodzące",
 | 
			
		||||
    "pushoversounds intermission": "Przerwa",
 | 
			
		||||
    "pushoversounds magic": "Magia",
 | 
			
		||||
    "pushoversounds mechanical": "Mechaniczny",
 | 
			
		||||
    "pushoversounds pianobar": "Piano Bar",
 | 
			
		||||
    "pushoversounds pianobar": "fortepianowy klawisz",
 | 
			
		||||
    "pushoversounds siren": "Syrena",
 | 
			
		||||
    "pushoversounds spacealarm": "Alarm kosmiczny",
 | 
			
		||||
    "pushoversounds tugboat": "Holownik",
 | 
			
		||||
@@ -608,7 +608,7 @@
 | 
			
		||||
    "backupRecommend": "Zamiast tego należy wykonać bezpośrednią kopię zapasową woluminu lub folderu danych (./data/).",
 | 
			
		||||
    "Optional": "Opcjonalne",
 | 
			
		||||
    "squadcast": "Squadcast",
 | 
			
		||||
    "SendKey": "SendKey",
 | 
			
		||||
    "SendKey": "Przycisk Wyślij",
 | 
			
		||||
    "SMSManager API Docs": "Dokumentacja API SMSManager ",
 | 
			
		||||
    "Gateway Type": "Typ bramy",
 | 
			
		||||
    "SMSManager": "SMSManager",
 | 
			
		||||
@@ -663,7 +663,7 @@
 | 
			
		||||
    "IconUrl": "URL ikony",
 | 
			
		||||
    "Enable DNS Cache": "Włącz pamięć podręczną DNS",
 | 
			
		||||
    "Single Maintenance Window": "Pojedyncze okno konserwacji",
 | 
			
		||||
    "Effective Date Range": "Zakres dat obowiązywania",
 | 
			
		||||
    "Effective Date Range": "Zakres dat obowiązywania (opcjonalnie)",
 | 
			
		||||
    "Schedule Maintenance": "Planowanie konserwacji",
 | 
			
		||||
    "DateTime Range": "Zakres czasowy",
 | 
			
		||||
    "Maintenance Time Window of a Day": "Okno czasowe konserwacji na dzień",
 | 
			
		||||
@@ -743,5 +743,13 @@
 | 
			
		||||
    "statusPageRefreshIn": "Odświeżenie w ciągu: {0}",
 | 
			
		||||
    "lunaseaDeviceID": "ID urządzenia",
 | 
			
		||||
    "lunaseaUserID": "ID użytkownika",
 | 
			
		||||
    "Add New Tag": "Dodaj nowy tag"
 | 
			
		||||
    "Add New Tag": "Dodaj nowy tag",
 | 
			
		||||
    "startDateTime": "Data/godzina rozpoczęcia",
 | 
			
		||||
    "cronSchedule": "Harmonogram: ",
 | 
			
		||||
    "invalidCronExpression": "Nieprawidłowe sformułowanie Cron: {0}",
 | 
			
		||||
    "sameAsServerTimezone": "Tak jak strefa czasowa serwera",
 | 
			
		||||
    "endDateTime": "Data/godzina zakończenia",
 | 
			
		||||
    "cronExpression": "Wyrażenie Cron",
 | 
			
		||||
    "ntfyAuthenticationMethod": "Metoda Uwierzytelnienia",
 | 
			
		||||
    "ntfyUsernameAndPassword": "Nazwa użytkownika i hasło"
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,10 +1,10 @@
 | 
			
		||||
{
 | 
			
		||||
    "languageName": "Português (Brasileiro)",
 | 
			
		||||
    "languageName": "Português (Brasil)",
 | 
			
		||||
    "checkEverySecond": "Verificar a cada {0} segundos",
 | 
			
		||||
    "retryCheckEverySecond": "Tentar novamente a cada {0} segundos",
 | 
			
		||||
    "retriesDescription": "Máximo de tentativas antes que o serviço seja marcado como inativo e uma notificação seja enviada",
 | 
			
		||||
    "ignoreTLSError": "Ignorar erros TLS/SSL para sites HTTPS",
 | 
			
		||||
    "upsideDownModeDescription": "Inverta o status de cabeça para baixo. Se o serviço estiver acessível, ele está OFFLINE.",
 | 
			
		||||
    "upsideDownModeDescription": "Inverta o status. Se o serviço estiver acessível, ele está DESLIGADO.",
 | 
			
		||||
    "maxRedirectDescription": "Número máximo de redirecionamentos a seguir. Defina como 0 para desativar redirecionamentos.",
 | 
			
		||||
    "acceptedStatusCodesDescription": "Selecione os códigos de status que são considerados uma resposta bem-sucedida.",
 | 
			
		||||
    "passwordNotMatchMsg": "A senha repetida não corresponde.",
 | 
			
		||||
@@ -27,7 +27,7 @@
 | 
			
		||||
    "confirmEnableTwoFAMsg": "Tem certeza de que deseja habilitar 2FA?",
 | 
			
		||||
    "confirmDisableTwoFAMsg": "Tem certeza de que deseja desativar 2FA?",
 | 
			
		||||
    "Settings": "Configurações",
 | 
			
		||||
    "Dashboard": "Dashboard",
 | 
			
		||||
    "Dashboard": "Painel",
 | 
			
		||||
    "New Update": "Nova Atualização",
 | 
			
		||||
    "Language": "Linguagem",
 | 
			
		||||
    "Appearance": "Aparência",
 | 
			
		||||
@@ -39,8 +39,8 @@
 | 
			
		||||
    "Add": "Adicionar",
 | 
			
		||||
    "Add New Monitor": "Adicionar novo monitor",
 | 
			
		||||
    "Quick Stats": "Estatísticas rápidas",
 | 
			
		||||
    "Up": "On",
 | 
			
		||||
    "Down": "Off",
 | 
			
		||||
    "Up": "Ligado",
 | 
			
		||||
    "Down": "Desligado",
 | 
			
		||||
    "Pending": "Pendente",
 | 
			
		||||
    "Unknown": "Desconhecido",
 | 
			
		||||
    "Pause": "Pausar",
 | 
			
		||||
@@ -49,12 +49,12 @@
 | 
			
		||||
    "DateTime": "Data hora",
 | 
			
		||||
    "Message": "Mensagem",
 | 
			
		||||
    "No important events": "Nenhum evento importante",
 | 
			
		||||
    "Resume": "Resumo",
 | 
			
		||||
    "Resume": "Retomar",
 | 
			
		||||
    "Edit": "Editar",
 | 
			
		||||
    "Delete": "Deletar",
 | 
			
		||||
    "Delete": "Apagar",
 | 
			
		||||
    "Current": "Atual",
 | 
			
		||||
    "Uptime": "Tempo de atividade",
 | 
			
		||||
    "Cert Exp.": "Cert Exp.",
 | 
			
		||||
    "Cert Exp.": "Expiração Do Certificado",
 | 
			
		||||
    "day": "dia | dias",
 | 
			
		||||
    "-day": "-dia",
 | 
			
		||||
    "hour": "hora",
 | 
			
		||||
@@ -71,9 +71,9 @@
 | 
			
		||||
    "Retries": "Novas tentativas",
 | 
			
		||||
    "Heartbeat Retry Interval": "Intervalo de repetição de Heartbeat",
 | 
			
		||||
    "Advanced": "Avançado",
 | 
			
		||||
    "Upside Down Mode": "Modo de cabeça para baixo",
 | 
			
		||||
    "Upside Down Mode": "Modo Invertido",
 | 
			
		||||
    "Max. Redirects": "Redirecionamentos Máx",
 | 
			
		||||
    "Accepted Status Codes": "Status Code Aceitáveis",
 | 
			
		||||
    "Accepted Status Codes": "Códigos HTTP Aceitáveis",
 | 
			
		||||
    "Save": "Salvar",
 | 
			
		||||
    "Notifications": "Notificações",
 | 
			
		||||
    "Not available, please setup.": "Não disponível, por favor configure.",
 | 
			
		||||
@@ -131,7 +131,7 @@
 | 
			
		||||
    "Create": "Criar",
 | 
			
		||||
    "Clear Data": "Limpar Dados",
 | 
			
		||||
    "Events": "Eventos",
 | 
			
		||||
    "Heartbeats": "Heartbeats",
 | 
			
		||||
    "Heartbeats": "Batimentos Cardíacos",
 | 
			
		||||
    "Auto Get": "Obter Automático",
 | 
			
		||||
    "backupDescription": "Você pode fazer backup de todos os monitores e todas as notificações em um arquivo JSON.",
 | 
			
		||||
    "backupDescription2": "OBS: Os dados do histórico e do evento não estão incluídos.",
 | 
			
		||||
@@ -187,17 +187,17 @@
 | 
			
		||||
    "Select status pages...": "Selecionar status pages…",
 | 
			
		||||
    "Game": "Jogo",
 | 
			
		||||
    "Passive Monitor Type": "Tipo de monitoramento passivo",
 | 
			
		||||
    "Specific Monitor Type": "Especificar tipo de monitoramento",
 | 
			
		||||
    "Specific Monitor Type": "Tipo de monitoramento específico",
 | 
			
		||||
    "Monitor": "Monitoramento | Monitoramentos",
 | 
			
		||||
    "needPushEvery": "Você deve chamar esta URL a cada {0} segundos.",
 | 
			
		||||
    "Push URL": "Push URL",
 | 
			
		||||
    "Push URL": "URL de push",
 | 
			
		||||
    "Custom": "Personalizado",
 | 
			
		||||
    "here": "aqui",
 | 
			
		||||
    "Required": "Requerido",
 | 
			
		||||
    "webhookJsonDesc": "{0} é bom para qualquer servidor HTTP moderno, como Express.js",
 | 
			
		||||
    "webhookAdditionalHeadersTitle": "Cabeçalhos Adicionais",
 | 
			
		||||
    "webhookAdditionalHeadersDesc": "Define cabeçalhos adicionais enviados com o webhook.",
 | 
			
		||||
    "Webhook URL": "Webhook URL",
 | 
			
		||||
    "Webhook URL": "URL Do Webhook",
 | 
			
		||||
    "Priority": "Prioridade",
 | 
			
		||||
    "Read more": "Ver mais",
 | 
			
		||||
    "appriseInstalled": "Apprise está instalado.",
 | 
			
		||||
@@ -270,15 +270,319 @@
 | 
			
		||||
    "All Status Pages": "Todas as Status Pages",
 | 
			
		||||
    "Method": "Método",
 | 
			
		||||
    "General Monitor Type": "Tipo de monitoramento geral",
 | 
			
		||||
    "markdownSupported": "Sintaxe Markdown suportada",
 | 
			
		||||
    "emojiCheatSheet": "Folha de dicas de emojis: {0}",
 | 
			
		||||
    "topic": "Tema",
 | 
			
		||||
    "markdownSupported": "Markdown suportado",
 | 
			
		||||
    "emojiCheatSheet": "Dicas de Emojis",
 | 
			
		||||
    "topic": "Tópico",
 | 
			
		||||
    "topicExplanation": "Tópico MQTT para monitorar",
 | 
			
		||||
    "successMessageExplanation": "Mensagem MQTT que será considerada como sucesso",
 | 
			
		||||
    "Content Type": "Tipo de Conteúdo",
 | 
			
		||||
    "Content Type": "Tipo do Conteúdo",
 | 
			
		||||
    "Shrink Database": "Encolher Banco de Dados",
 | 
			
		||||
    "Content": "Conteúdo",
 | 
			
		||||
    "Pick a RR-Type...": "Escolha um tipo RR…",
 | 
			
		||||
    "Pick Accepted Status Codes...": "Escolha Códigos de Status Aceitos…",
 | 
			
		||||
    "Pick Affected Monitors...": "Escolher Monitores Afetados…"
 | 
			
		||||
    "Pick a RR-Type...": "Selecione um RR-Type…",
 | 
			
		||||
    "Pick Accepted Status Codes...": "Selecione Os Códigos de Status Aceitos…",
 | 
			
		||||
    "Pick Affected Monitors...": "Selecione os Monitores Afetados…",
 | 
			
		||||
    "Channel Name": "Nome Do Canal",
 | 
			
		||||
    "Don't know how to get the token? Please read the guide:": "Não sabe com pegar o token? Por favor, leia o guia:",
 | 
			
		||||
    "smtpDkimheaderFieldNames": "Chaves Do Cabeçalho para assinar (Opcional)",
 | 
			
		||||
    "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.": "A conexão atual pode ser perdida se você estiver se conectando pelo túnel da Cloudflare. Você tem certeza que deseja pará-lo? Digite a sua senha para confirmar.",
 | 
			
		||||
    "shrinkDatabaseDescription": "Acionar a limpeza do banco de dados para o SQLite. Se o seu banco de dados foi criado depois de 1.10.0, a limpeza automática(AUTO_VACUUM) já é habilitada por padrão e essa ação não é necessária.",
 | 
			
		||||
    "Powered by": "Fornecido por",
 | 
			
		||||
    "deleteProxyMsg": "Você tem certeza que deseja deletar este proxy para todos os monitores?",
 | 
			
		||||
    "proxyDescription": "Os proxies devem ser atribuídos a um monitor para funcionar.",
 | 
			
		||||
    "Certificate Chain": "Cadeia De Certificados",
 | 
			
		||||
    "Domain Name Expiry Notification": "Notificação De Expiração Do Nome Do Domínio",
 | 
			
		||||
    "Proxy": "Proxy",
 | 
			
		||||
    "wayToGetTelegramChatID": "Você pode pegar o Chat ID enviando uma mensagem marcando o bot no grupo e indo nessa URL para ver o chat_id:",
 | 
			
		||||
    "wayToGetLineNotifyToken": "Você pode pegar o token de acesso de {0}",
 | 
			
		||||
    "disableCloudflaredNoAuthMsg": "Você está no modo sem autenticação, a senha não é necessária.",
 | 
			
		||||
    "Frontend Version do not match backend version!": "Versão do frontend é diferente da versão do backend!",
 | 
			
		||||
    "strategyManual": "Ativar/Desativar Manualmente",
 | 
			
		||||
    "weekdayShortThu": "Qui",
 | 
			
		||||
    "Basic Settings": "Configurações Básicas",
 | 
			
		||||
    "User ID": "ID Do Usuário",
 | 
			
		||||
    "Line Developers Console": "Linha Do Terminal De Desenvolvimento",
 | 
			
		||||
    "lineDevConsoleTo": "Linha Do Terminal De Desenvolvimento- {0}",
 | 
			
		||||
    "smseagleToken": "Token De Acesso Da API",
 | 
			
		||||
    "Notification Service": "Serviço De Notificação",
 | 
			
		||||
    "default: notify all devices": "padrão: notificar todos os dispositivos",
 | 
			
		||||
    "Trigger type:": "Tipo Do Acionamento:",
 | 
			
		||||
    "Then choose an action, for example switch the scene to where an RGB light is red.": "",
 | 
			
		||||
    "Enable": "Habilitado",
 | 
			
		||||
    "Disable": "Desabilitado",
 | 
			
		||||
    "IconUrl": "URL Do Ícone",
 | 
			
		||||
    "Enable DNS Cache": "Habilitar Cache Do DNS",
 | 
			
		||||
    "Single Maintenance Window": "Janela Única De Manutenção",
 | 
			
		||||
    "dnsCacheDescription": "Pode não funcionar em alguns ambientes com IPv6, desabita caso encontre qualquer problema.",
 | 
			
		||||
    "Messaging API": "API Da Mensageira",
 | 
			
		||||
    "Icon URL": "URL Do Ícone",
 | 
			
		||||
    "Clone Monitor": "Clonar Monitoramento",
 | 
			
		||||
    "Clone": "Clonar",
 | 
			
		||||
    "cloneOf": "Clone do {0}",
 | 
			
		||||
    "deleteMaintenanceMsg": "Você tem certeza que deseja apagar essa manutenção?",
 | 
			
		||||
    "sameAsServerTimezone": "O mesmo do servidor de fuso-horário",
 | 
			
		||||
    "startDateTime": "Início Data/Horário",
 | 
			
		||||
    "endDateTime": "Fim Data/Horário",
 | 
			
		||||
    "cronExpression": "Expressão Do Cron",
 | 
			
		||||
    "cronSchedule": "Agendar: ",
 | 
			
		||||
    "invalidCronExpression": "Expressão Cron inválida: {0}",
 | 
			
		||||
    "Display Timezone": "Mostrar Fuso-horário",
 | 
			
		||||
    "Server Timezone": "Servidor De Fuso-horário",
 | 
			
		||||
    "statusPageMaintenanceEndDate": "Fim",
 | 
			
		||||
    "Schedule Maintenance": "Agendar Manutenção",
 | 
			
		||||
    "Date and Time": "Data E Horário",
 | 
			
		||||
    "DateTime Range": "Intervalo De Tempo",
 | 
			
		||||
    "Maintenance Time Window of a Day": "Janela de tempo de manutenção de um dia",
 | 
			
		||||
    "uninstalling": "Desinstalando",
 | 
			
		||||
    "confirmUninstallPlugin": "Você tem certeza were quer desinstalar esse plugin?",
 | 
			
		||||
    "notificationRegional": "Região",
 | 
			
		||||
    "dnsPortDescription": "Porta do servidor DNS. O padrão é 53. Você pode mudar a porta em qualquer momento.",
 | 
			
		||||
    "affectedMonitorsDescription": "Selecione os monitores afetados pela manutenção atual",
 | 
			
		||||
    "Icon Emoji": "Ícone Do Emoji",
 | 
			
		||||
    "wayToGetKookBotToken": "Criar aplicação e pegar o token do bot em {0}",
 | 
			
		||||
    "Notification Sound": "Som De Notificação",
 | 
			
		||||
    "More info on:": "Mais informações em: {0}",
 | 
			
		||||
    "SMS Type": "Tipo Do SMS",
 | 
			
		||||
    "Internal Room Id": "ID Interno Da Sala",
 | 
			
		||||
    "Platform": "Plataforma",
 | 
			
		||||
    "serwersmsAPIPassword": "Senha Da API",
 | 
			
		||||
    "serwersmsPhoneNumber": "Número Do Telefone",
 | 
			
		||||
    "documentation": "documentação",
 | 
			
		||||
    "smtpDkimDomain": "Nome Do Domínio",
 | 
			
		||||
    "smtpDkimKeySelector": "Chave Selecionadora",
 | 
			
		||||
    "smtpDkimPrivateKey": "Chave Privada",
 | 
			
		||||
    "smtpDkimHashAlgo": "Algoritmo Hash (Opcional)",
 | 
			
		||||
    "smtpDkimskipFields": "Chaves Do Cabeçalho para não assinar (Opcional)",
 | 
			
		||||
    "alertaEnvironment": "Ambiente",
 | 
			
		||||
    "alertaRecoverState": "Estado De Recuperação",
 | 
			
		||||
    "smseagleEncoding": "Enviar como Unicode",
 | 
			
		||||
    "onebotGroupMessage": "Grupo",
 | 
			
		||||
    "onebotPrivateMessage": "Privado",
 | 
			
		||||
    "onebotUserOrGroupId": "ID do Grupo/Usuário",
 | 
			
		||||
    "No Maintenance": "Sem Manutenção",
 | 
			
		||||
    "telegramProtectContentDescription": "Se ativado, a mensagens do bot do Telegram serão protegidas contra encaminhamentos e salvamento.",
 | 
			
		||||
    "telegramProtectContent": "Proteger Contra Encaminhamento/Salvamento",
 | 
			
		||||
    "affectedStatusPages": "Mostrar essa mensagem de manutenção nas páginas de status selecionadas",
 | 
			
		||||
    "loadingError": "Não foi possível pegar os dados, por favor tente novamente.",
 | 
			
		||||
    "Bot Display Name": "Nome Visível Do Bot",
 | 
			
		||||
    "Access Token": "Token De Acesso",
 | 
			
		||||
    "Unpin": "Desfixar",
 | 
			
		||||
    "telegramSendSilently": "Enviar Silenciosamente",
 | 
			
		||||
    "telegramSendSilentlyDescription": "Enviar a mensagem silenciosamente. Os usuários não receberam uma notificação com som.",
 | 
			
		||||
    "YOUR BOT TOKEN HERE": "O SEU TOKEN DO BOT VAI AQUI",
 | 
			
		||||
    "warningTimezone": "Está usando os servidores de fuso-horários",
 | 
			
		||||
    "dayOfWeek": "Dia Da Semana",
 | 
			
		||||
    "dayOfMonth": "Dia Do Mês",
 | 
			
		||||
    "lastDay": "Último Dia",
 | 
			
		||||
    "lastDay1": "Último Dia Do Mês",
 | 
			
		||||
    "lastDay2": "Penúltimo Dia Do Mês",
 | 
			
		||||
    "lastDay3": "Antepenúltimo Dia Do Mês",
 | 
			
		||||
    "lastDay4": "Quarto Último Dia Do Mês",
 | 
			
		||||
    "weekdayShortMon": "Seg",
 | 
			
		||||
    "weekdayShortTue": "Ter",
 | 
			
		||||
    "weekdayShortWed": "Qua",
 | 
			
		||||
    "weekdayShortFri": "Sex",
 | 
			
		||||
    "weekdayShortSat": "Sab",
 | 
			
		||||
    "weekdayShortSun": "Dom",
 | 
			
		||||
    "wayToGetTeamsURL": "Você pode aprender a como criar a URL do webhook {0}.",
 | 
			
		||||
    "Hello @everyone is...": "Olá {'@'}everyone é…",
 | 
			
		||||
    "Number": "Número",
 | 
			
		||||
    "install": "Instalar",
 | 
			
		||||
    "installing": "Instalando",
 | 
			
		||||
    "uninstall": "Desinstalar",
 | 
			
		||||
    "Ignore TLS Error": "Ignorar Erro De TLS",
 | 
			
		||||
    "Discord Webhook URL": "URL Do Webhook Do Discord",
 | 
			
		||||
    "emailCustomSubject": "Assunto Personalizado",
 | 
			
		||||
    "Prefix Custom Message": "Prefixo Personalizado Da Mensagem",
 | 
			
		||||
    "wayToGetZohoCliqURL": "Você pode aprender a como criar uma URL de Webhook {0}.",
 | 
			
		||||
    "Channel access token": "Canal do token de acesso",
 | 
			
		||||
    "promosmsPassword": "Senha Da API",
 | 
			
		||||
    "promosmsLogin": "Nome Do Login Da API",
 | 
			
		||||
    "atLeastOneMonitor": "Selecione pelo menos um monitoramento afetado",
 | 
			
		||||
    "apiCredentials": "Credenciais Da API",
 | 
			
		||||
    "For safety, must use secret key": "Para segurança deve se usar uma chave secreta",
 | 
			
		||||
    "Device Token": "Token Do Dispositivo",
 | 
			
		||||
    "Retry": "Tentar Novamente",
 | 
			
		||||
    "Topic": "Tópico",
 | 
			
		||||
    "Setup Proxy": "Configuração Do Proxy",
 | 
			
		||||
    "Proxy Protocol": "Protocolo Do Proxy",
 | 
			
		||||
    "Proxy Server": "Servidor Proxy",
 | 
			
		||||
    "Proxy server has authentication": "O servidor proxy tem autenticação",
 | 
			
		||||
    "aboutWebhooks": "Mais informações sobre Webhooks em: {0}",
 | 
			
		||||
    "Integration Key": "Chave De Integração",
 | 
			
		||||
    "Integration URL": "URL De Integração",
 | 
			
		||||
    "do nothing": "fazendo nada",
 | 
			
		||||
    "onebotSafetyTips": "Por segurança deve adicionar o token de acesso",
 | 
			
		||||
    "Subject:": "Assunto:",
 | 
			
		||||
    "Valid To:": "Válido para:",
 | 
			
		||||
    "For example: nginx, Apache and Traefik.": "Por exemplo: Nginx, Apache e Traefik.",
 | 
			
		||||
    "Please read": "Por favor, leia",
 | 
			
		||||
    "RadiusCallingStationIdDescription": "Identificador do dispositivo de chamada",
 | 
			
		||||
    "certificationExpiryDescription": "O monitoramento por HTTPS envia a notificação quando o certificado TLS expirar em:",
 | 
			
		||||
    "or": "ou",
 | 
			
		||||
    "Effective Date Range": "Intervalo Efetivo De Data (Opcional)",
 | 
			
		||||
    "recurringIntervalMessage": "Rodar diariamente | Rodar a cada {0} dias",
 | 
			
		||||
    "Status:": "Status: {0}",
 | 
			
		||||
    "smtpDkimSettings": "Configurações DKIM",
 | 
			
		||||
    "alertaApiKey": "Chave Da API",
 | 
			
		||||
    "alertaAlertState": "Estado Do Alerta",
 | 
			
		||||
    "statusPageRefreshIn": "Atualizando em: {0}",
 | 
			
		||||
    "Untitled Group": "Grupo Sem Título",
 | 
			
		||||
    "primary": "primário",
 | 
			
		||||
    "setAsDefaultProxyDescription": "Este proxy será habilitado por padrão em todos os novos monitores. Você pode desabilitar o proxy individualmente para cada monitor.",
 | 
			
		||||
    "Valid": "Válido",
 | 
			
		||||
    "Invalid": "Inválido",
 | 
			
		||||
    "User": "Usuário",
 | 
			
		||||
    "Installed": "Instalado",
 | 
			
		||||
    "Not installed": "Não instalado",
 | 
			
		||||
    "enableProxyDescription": "Este proxy não afetará as solicitações do monitor até que seja ativado. Você pode controlar temporariamente a desativação do proxy de todos os monitores pelo status de ativação.",
 | 
			
		||||
    "Not running": "Desabilitado",
 | 
			
		||||
    "Remove Token": "Remover Token",
 | 
			
		||||
    "Start": "Iniciar",
 | 
			
		||||
    "Stop": "Parar",
 | 
			
		||||
    "Add New Status Page": "Adicionar Nova Página De Status",
 | 
			
		||||
    "Accept characters:": "Caracteres aceitos:",
 | 
			
		||||
    "Running": "Habilitado",
 | 
			
		||||
    "startOrEndWithOnly": "Apenas iniciar ou parar com {0}",
 | 
			
		||||
    "No consecutive dashes": "Sem traços consecutivos",
 | 
			
		||||
    "Next": "Próximo",
 | 
			
		||||
    "No Proxy": "Sem Proxy",
 | 
			
		||||
    "Authentication": "Autenticação",
 | 
			
		||||
    "HTTP Basic Auth": "Autenticação Básica No HTTP",
 | 
			
		||||
    "New Status Page": "Nova Página De Status",
 | 
			
		||||
    "Page Not Found": "Página Não Encontrada",
 | 
			
		||||
    "Reverse Proxy": "Proxy Reverso",
 | 
			
		||||
    "About": "Sobre",
 | 
			
		||||
    "Message:": "Mensagem:",
 | 
			
		||||
    "HTTP Headers": "Cabeçalhos HTTP",
 | 
			
		||||
    "Trust Proxy": "Proxy Confiável",
 | 
			
		||||
    "Other Software": "Outros Programas",
 | 
			
		||||
    "Days Remaining:": "Dias Restantes:",
 | 
			
		||||
    "No status pages": "Sem página de status",
 | 
			
		||||
    "Date Created": "Data De Criação",
 | 
			
		||||
    "Backup": "Cópia de Segurança",
 | 
			
		||||
    "wayToGetCloudflaredURL": "(Baixe o CloudFlareD de {0})",
 | 
			
		||||
    "cloudflareWebsite": "Site Da CloudaFlare",
 | 
			
		||||
    "Issuer:": "Emissor:",
 | 
			
		||||
    "Fingerprint:": "Impressão Digital:",
 | 
			
		||||
    "Footer Text": "Texto Do Rodapé",
 | 
			
		||||
    "Domain Names": "Nome Dos Domínios",
 | 
			
		||||
    "signedInDispDisabled": "Autenticação Desabilitada.",
 | 
			
		||||
    "RadiusSecretDescription": "Compartilhe o Segredo entre o cliente e o servidor",
 | 
			
		||||
    "Certificate Expiry Notification": "Notificação De Certificado Expirado",
 | 
			
		||||
    "The resource is no longer available.": "O recurso não está mais disponível.",
 | 
			
		||||
    "There might be a typing error in the address.": "Pode ter um erro de digitação no endereço.",
 | 
			
		||||
    "Retype the address.": "Digitar novamente o endereço.",
 | 
			
		||||
    "Go back to the previous page.": "Voltar para a página anterior.",
 | 
			
		||||
    "Query": "Query",
 | 
			
		||||
    "settingsCertificateExpiry": "O Certificado TLS Expira",
 | 
			
		||||
    "Connection Type": "Tipo Da Conexão",
 | 
			
		||||
    "signedInDisp": "Assinado como {0}",
 | 
			
		||||
    "RadiusCallingStationId": "ID Da Estação De Chamada",
 | 
			
		||||
    "RadiusCalledStationIdDescription": "Identificador do dispositivo de chamada",
 | 
			
		||||
    "Coming Soon": "Em Breve",
 | 
			
		||||
    "Connection String": "String De Conexão",
 | 
			
		||||
    "Docker Daemon": "Daemon Do Docker",
 | 
			
		||||
    "Show Powered By": "Mostrar Distribuído Por",
 | 
			
		||||
    "RadiusSecret": "Segredo Radius",
 | 
			
		||||
    "RadiusCalledStationId": "ID Da Estação Chamada",
 | 
			
		||||
    "deleteDockerHostMsg": "Você tem certeza que quer deletar esse host do Docker para todos os monitores?",
 | 
			
		||||
    "tcp": "TCP / HTTP",
 | 
			
		||||
    "Docker Container": "Container Docker",
 | 
			
		||||
    "Container Name / ID": "Nome / ID do Container",
 | 
			
		||||
    "Domain": "Domínio",
 | 
			
		||||
    "Workstation": "Estação De Trabalho",
 | 
			
		||||
    "Packet Size": "Tamanho Do Pacote",
 | 
			
		||||
    "Bot Token": "Token do Bot",
 | 
			
		||||
    "wayToGetTelegramToken": "Você pode pegar o token de {0}.",
 | 
			
		||||
    "chatIDNotFound": "Chat ID não encontrado; por favor envia uma mensagem para o bot primeiro",
 | 
			
		||||
    "Chat ID": "Chat ID",
 | 
			
		||||
    "Docker Hosts": "Hosts Do Docker",
 | 
			
		||||
    "Docker Host": "Host Do Docker",
 | 
			
		||||
    "Examples": "Exemplos",
 | 
			
		||||
    "maintenanceStatus-under-maintenance": "Em Manutenção",
 | 
			
		||||
    "Long-Lived Access Token": "Token De Acesso De Longa Duração",
 | 
			
		||||
    "Home Assistant URL": "URL Do Home Assinant",
 | 
			
		||||
    "Long-Lived Access Token can be created by clicking on your profile name (bottom left) and scrolling to the bottom then click Create Token. ": "O token de acessos de longa duração pode ser criado clicando no nome do seu perfil, com o botão esquerdo, ir até o final da lista e clicar em Criar Token. ",
 | 
			
		||||
    "Event type:": "Tipo Do Evento:",
 | 
			
		||||
    "Event data:": "Dados Do Evento:",
 | 
			
		||||
    "Frontend Version": "Versão Do Frontend",
 | 
			
		||||
    "backupRecommend": "Por favor faça uma cópia do volume ou da pasta com dados(./data/) diretamente ao invés.",
 | 
			
		||||
    "Optional": "Opcional",
 | 
			
		||||
    "recurringInterval": "Intervalo",
 | 
			
		||||
    "Recurring": "Recorrente",
 | 
			
		||||
    "pauseMaintenanceMsg": "Você tem certeza que quer pausar?",
 | 
			
		||||
    "maintenanceStatus-inactive": "Inativo",
 | 
			
		||||
    "maintenanceStatus-scheduled": "Agendado",
 | 
			
		||||
    "maintenanceStatus-ended": "Terminando",
 | 
			
		||||
    "maintenanceStatus-unknown": "Desconhecido",
 | 
			
		||||
    "enableGRPCTls": "Permita para enviar requisições gRPC com conexões TLS",
 | 
			
		||||
    "confirmDeleteTagMsg": "Você tem certeza que deseja apagar essa tag? Monitores associados a essa tag não serão apagados.",
 | 
			
		||||
    "grpcMethodDescription": "O nome do método é convertido para o formato cammelCase, exemplos: enviarBomDia, verificar, etc.",
 | 
			
		||||
    "infiniteRetention": "Defina como 0 para um tempo infinito de retenção.",
 | 
			
		||||
    "octopushLegacyHint": "Você usa a versão legada do Octopush (2011-2020) ou a nova versão?",
 | 
			
		||||
    "Example:": "Exemplo: {0}",
 | 
			
		||||
    "Read more:": "Leia mais em: {0}",
 | 
			
		||||
    "promosmsAllowLongSMS": "Permitir SMS grandes",
 | 
			
		||||
    "Android": "Android",
 | 
			
		||||
    "Huawei": "Huawei",
 | 
			
		||||
    "smseagleTo": "Números Dos Telefones",
 | 
			
		||||
    "smseaglePriority": "Prioridade da mensagem (0-9, padrão=0)",
 | 
			
		||||
    "dataRetentionTimeError": "O período de retenção tem que ser maior ou igual a 0",
 | 
			
		||||
    "User Key": "Chave Do Usuário",
 | 
			
		||||
    "Device": "Dispositivo",
 | 
			
		||||
    "Message Title": "Título Da Mensagem",
 | 
			
		||||
    "defaultNotificationName": "Minha {notification} Alerta({number})",
 | 
			
		||||
    "light": "claro",
 | 
			
		||||
    "socket": "Soquete",
 | 
			
		||||
    "Add New Tag": "Adicionar Nova Tag",
 | 
			
		||||
    "API Username": "Usuário Da API",
 | 
			
		||||
    "API Key": "Chave Da API",
 | 
			
		||||
    "Show update if available": "Mostrar atualização se disponível",
 | 
			
		||||
    "Also check beta release": "Também verificar lançamentos em beta",
 | 
			
		||||
    "Using a Reverse Proxy?": "Está usando um Proxy Reverso?",
 | 
			
		||||
    "Check how to config it for WebSocket": "Verifique como configurar para o WebSocket",
 | 
			
		||||
    "Steam Game Server": "Servidor De Jogo Da Steam",
 | 
			
		||||
    "Most likely causes:": "Causas mais prováveis:",
 | 
			
		||||
    "What you can try:": "O que você pode tentar:",
 | 
			
		||||
    "apiKey-active": "Ativa",
 | 
			
		||||
    "Expiry": "Expiração",
 | 
			
		||||
    "endpoint": "endpoint",
 | 
			
		||||
    "pagertreeIntegrationUrl": "URL de Integração",
 | 
			
		||||
    "pagertreeUrgency": "Urgência",
 | 
			
		||||
    "telegramMessageThreadID": "(Opcional) Message Thread ID",
 | 
			
		||||
    "Edit Tag": "Editar Etiqueta",
 | 
			
		||||
    "Server Address": "Endereço do Servidor",
 | 
			
		||||
    "Learn More": "Aprender Mais",
 | 
			
		||||
    "needSignalAPI": "Você precisa de um cliente Signal com API REST.",
 | 
			
		||||
    "Generate": "Gerar",
 | 
			
		||||
    "deleteAPIKeyMsg": "Você tem certeza de que quer apagar essa chave de API?",
 | 
			
		||||
    "plugin": "Plugin | Plugins",
 | 
			
		||||
    "Expiry date": "Data de expiração",
 | 
			
		||||
    "Don't expire": "Não expira",
 | 
			
		||||
    "Continue": "Continuar",
 | 
			
		||||
    "Add Another": "Adicionar Outro",
 | 
			
		||||
    "Key Added": "Chave Adicionada",
 | 
			
		||||
    "Add API Key": "Adicionar chave de API",
 | 
			
		||||
    "No API Keys": "Sem chaves de API",
 | 
			
		||||
    "apiKey-expired": "Expirada",
 | 
			
		||||
    "apiKey-inactive": "Inativa",
 | 
			
		||||
    "Expires": "Expira",
 | 
			
		||||
    "disableAPIKeyMsg": "Você tem certeza de que quer desativar essa chave de API?",
 | 
			
		||||
    "smtp": "Email (SMTP)",
 | 
			
		||||
    "secureOptionTLS": "TLS (465)",
 | 
			
		||||
    "From Email": "Email De",
 | 
			
		||||
    "smtpCC": "CC",
 | 
			
		||||
    "smtpBCC": "CCO",
 | 
			
		||||
    "To Email": "Email Para",
 | 
			
		||||
    "Recipients": "Destinatários",
 | 
			
		||||
    "Google Analytics ID": "ID Google Analytics",
 | 
			
		||||
    "Post": "Post",
 | 
			
		||||
    "Slug": "Slug",
 | 
			
		||||
    "The slug is already taken. Please choose another slug.": "Esse slug já foi utilizado. Por favor escolha outro slug.",
 | 
			
		||||
    "Setup Docker Host": "Configurar Host Docker",
 | 
			
		||||
    "trustProxyDescription": "Confiar nos cabeçalhos 'X-Forwarded-*'. Se você quer obter o endereço IP do cliente correto no seu Uptime Kuma que está por trás de um proxy como Nginx ou Apache, você deve ativar isso.",
 | 
			
		||||
    "Automations can optionally be triggered in Home Assistant:": "Automações podem opcionalmente ser disparadas no Home Assistant:",
 | 
			
		||||
    "secureOptionNone": "Nenhum / STARTTLS (25, 587)",
 | 
			
		||||
    "apiKeyAddedMsg": "Sua chave de API foi adicionada. Por favor anote essa chave, ela não será mostrada novamente.",
 | 
			
		||||
    "Show Clickable Link": "Mostrar Link Clicável"
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -191,5 +191,15 @@
 | 
			
		||||
    "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."
 | 
			
		||||
    "statusPageNothing": "Nič tu nie je, pridajte skupinu alebo sledovanie.",
 | 
			
		||||
    "webhookAdditionalHeadersTitle": "Ďalšie položky",
 | 
			
		||||
    "webhookAdditionalHeadersDesc": "Nastaví ďalšie hlavičky odoslané s webovým hákom.",
 | 
			
		||||
    "Webhook URL": "Webhook URL",
 | 
			
		||||
    "Application Token": "Token aplikácie",
 | 
			
		||||
    "Server URL": "Server URL",
 | 
			
		||||
    "Priority": "Priorita",
 | 
			
		||||
    "statusPageRefreshIn": "Obnovenie za: {0}",
 | 
			
		||||
    "emojiCheatSheet": "Emotikony: {0}",
 | 
			
		||||
    "Read more": "Prečítajte si viac",
 | 
			
		||||
    "appriseInstalled": "Apprise je nainštalovaný."
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -105,5 +105,37 @@
 | 
			
		||||
    "Last Result": "Senaste resultat",
 | 
			
		||||
    "Create your admin account": "Skapa ditt administratörskonto",
 | 
			
		||||
    "Repeat Password": "Upprepa Lösenord",
 | 
			
		||||
    "respTime": "Svarstid (ms)"
 | 
			
		||||
    "respTime": "Svarstid (ms)",
 | 
			
		||||
    "Specific Monitor Type": "Applikationsspecifika övervakare",
 | 
			
		||||
    "Push URL": "Push URL",
 | 
			
		||||
    "Passive Monitor Type": "Passiva övervakare",
 | 
			
		||||
    "markdownSupported": "Stödjer markdown-syntax",
 | 
			
		||||
    "Heartbeat Retry Interval": "Omprövningsintervall",
 | 
			
		||||
    "needPushEvery": "Hämta denna URL var {0} sekund",
 | 
			
		||||
    "pushOptionalParams": "Valfria parametrar: {0}",
 | 
			
		||||
    "disableauth.message1": "Vill du verkligen <strong>avaktivera autentisering</strong>?",
 | 
			
		||||
    "disableauth.message2": "Det är designat för när en <strong>tredjeparts autentiseringstjänst</strong> såsom Cloudflare Access eller Authelia används framför Uptime Kuma.",
 | 
			
		||||
    "Please use this option carefully!": "Använd denna funktion varsamt!",
 | 
			
		||||
    "Import Backup": "Importera backup",
 | 
			
		||||
    "Affected Monitors": "Påverkade övervakare",
 | 
			
		||||
    "Start of maintenance": "Påbörja underhåll",
 | 
			
		||||
    "All Status Pages": "Alla statussidor",
 | 
			
		||||
    "alertNoFile": "Välj en fil att importera.",
 | 
			
		||||
    "alertWrongFileType": "Välj en JSON-formatterad fil.",
 | 
			
		||||
    "Help": "Hjälp",
 | 
			
		||||
    "Export": "Export",
 | 
			
		||||
    "Import": "Import",
 | 
			
		||||
    "Game": "Spel",
 | 
			
		||||
    "resendEveryXTimes": "Omsänd efter {0} gånger",
 | 
			
		||||
    "Export Backup": "Exportera backup",
 | 
			
		||||
    "Schedule maintenance": "Schemalägg underhåll",
 | 
			
		||||
    "Monitor": "Övervakare | Övervakare",
 | 
			
		||||
    "Resend Notification if Down X times consecutively": "Sänd notis igen om nere X gånger i rad",
 | 
			
		||||
    "Maintenance": "Underhåll",
 | 
			
		||||
    "retryCheckEverySecond": "Ompröva var {0} sekund",
 | 
			
		||||
    "statusMaintenance": "Underhåll",
 | 
			
		||||
    "resendDisabled": "Omsändning inaktiverat",
 | 
			
		||||
    "Pick Affected Monitors...": "Välj påverkade övervakare…",
 | 
			
		||||
    "Select status pages...": "Välj statussidor…",
 | 
			
		||||
    "General Monitor Type": "Allmänna övervakare"
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -605,5 +605,52 @@
 | 
			
		||||
    "pagertreeCritical": "วิกฤต",
 | 
			
		||||
    "pagertreeDoNothing": "ไม่ต้องทำอะไร",
 | 
			
		||||
    "pagertreeResolve": "แก้ไขอัตโนมัติ",
 | 
			
		||||
    "wayToGetPagerTreeIntegrationURL": "หลังจากสร้างการรวม Uptime Kuma ใน PagerTree แล้ว ให้คัดลอก Endpoint, ดูรายละเอียดทั้งหมด {0}"
 | 
			
		||||
    "wayToGetPagerTreeIntegrationURL": "หลังจากสร้างการรวม Uptime Kuma ใน PagerTree แล้ว ให้คัดลอก Endpoint, ดูรายละเอียดทั้งหมด {0}",
 | 
			
		||||
    "telegramSendSilently": "ส่งอย่างเงียบ ๆ",
 | 
			
		||||
    "maintenanceStatus-inactive": "ไม่ใช้งาน",
 | 
			
		||||
    "telegramProtectContent": "ป้องกันการส่งต่อ/บันทึก",
 | 
			
		||||
    "Add New Tag": "เพิ่มแท็กใหม่",
 | 
			
		||||
    "strategyManual": "ตั่งให้ใช้งาน/ไม่ใช้งานด้วยตนเอง",
 | 
			
		||||
    "warningTimezone": "ใช้เขตเวลาของเซิร์ฟเวอร์",
 | 
			
		||||
    "weekdayShortMon": "จันทร์",
 | 
			
		||||
    "weekdayShortTue": "วันอังคาร",
 | 
			
		||||
    "weekdayShortWed": "พุธ",
 | 
			
		||||
    "weekdayShortThu": "พฤหัสบดี",
 | 
			
		||||
    "weekdayShortFri": "ศุกร์",
 | 
			
		||||
    "weekdayShortSat": "เสาร์",
 | 
			
		||||
    "weekdayShortSun": "อาทิตย์",
 | 
			
		||||
    "dayOfWeek": "วันในสัปดาห์",
 | 
			
		||||
    "dayOfMonth": "วันในเดือน",
 | 
			
		||||
    "maintenanceStatus-under-maintenance": "อยู่ภายใต้การบำรุงรักษา",
 | 
			
		||||
    "maintenanceStatus-scheduled": "กำหนดการ",
 | 
			
		||||
    "maintenanceStatus-ended": "สิ้นสุด",
 | 
			
		||||
    "maintenanceStatus-unknown": "ไม่ทราบ",
 | 
			
		||||
    "Specific Monitor Type": "ประเภทมอนิเตอร์เฉพาะ",
 | 
			
		||||
    "telegramMessageThreadID": "(ตัวเลือก) ไอดีเทรดข้อความ",
 | 
			
		||||
    "telegramMessageThreadIDDescription": "ตัวระบุที่ไม่ซ้ำซึ่งเป็นทางเลือกสำหรับเธรดข้อความเป้าหมาย (หัวข้อ) ของฟอรัม สำหรับฟอรัมซูเปอร์กรุ๊ปเท่านั้น",
 | 
			
		||||
    "sameAsServerTimezone": "เช่นเดียวกับเขตเวลาของเซิร์ฟเวอร์",
 | 
			
		||||
    "startDateTime": "วันที่/เวลาเริ่มต้น",
 | 
			
		||||
    "endDateTime": "วันที่/เวลาสิ้นสุด",
 | 
			
		||||
    "cronSchedule": "กำหนดการ: ",
 | 
			
		||||
    "invalidCronExpression": "นิพจน์ Cron ไม่ถูกต้อง: {0}",
 | 
			
		||||
    "cronExpression": "นิพจน์ Cron",
 | 
			
		||||
    "lastDay": "วันสุดท้าย",
 | 
			
		||||
    "lastDay1": "วันสุดท้ายของเดือน",
 | 
			
		||||
    "lastDay2": "วันที่ 2 สุดท้ายของเดือน",
 | 
			
		||||
    "lastDay3": "วันที่ 3 สุดท้ายของเดือน",
 | 
			
		||||
    "lastDay4": "วันที่ 4 สุดท้ายของเดือน",
 | 
			
		||||
    "No Maintenance": "ไม่มีการบำรุงรักษา",
 | 
			
		||||
    "pauseMaintenanceMsg": "แน่ใจไหมว่าต้องการหยุดชั่วคราว",
 | 
			
		||||
    "Display Timezone": "แสดงเขตเวลา",
 | 
			
		||||
    "statusPageMaintenanceEndDate": "จบ",
 | 
			
		||||
    "Server Timezone": "เขตเวลาเซิร์ฟเวอร์",
 | 
			
		||||
    "statusPageRefreshIn": "รีโหลดใน: {0}",
 | 
			
		||||
    "telegramSendSilentlyDescription": "ส่งข้อความอย่างเงียบๆ ผู้ใช้จะได้รับการแจ้งเตือนโดยไม่มีเสียง",
 | 
			
		||||
    "telegramProtectContentDescription": "หากเปิดใช้งาน ข้อความบอทใน Telegram จะได้รับการปกป้องจากการส่งต่อและการบันทึก",
 | 
			
		||||
    "dnsCacheDescription": "อาจจะทำงานไม่ได้กับ IPv6, ปิดใช้งานถ้าเจอปัญหา",
 | 
			
		||||
    "IconUrl": "URL ไอคอน",
 | 
			
		||||
    "Enable DNS Cache": "เปิดใช้งาน DNS Cache",
 | 
			
		||||
    "Enable": "เปิดใช้งาน",
 | 
			
		||||
    "Disable": "ปิดใช้งาน",
 | 
			
		||||
    "Single Maintenance Window": "หน้าการปรับปรุงเดี่ยว"
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -58,7 +58,7 @@
 | 
			
		||||
    "Delete": "Sil",
 | 
			
		||||
    "Current": "Şu anda",
 | 
			
		||||
    "Uptime": "Çalışma zamanı",
 | 
			
		||||
    "Cert Exp.": "Sertifika Süresi",
 | 
			
		||||
    "Cert Exp.": "Sertifika Geç. Süresi",
 | 
			
		||||
    "day": "gün | günler",
 | 
			
		||||
    "-day": "-gün",
 | 
			
		||||
    "hour": "saat",
 | 
			
		||||
@@ -194,7 +194,7 @@
 | 
			
		||||
    "here": "burada",
 | 
			
		||||
    "Required": "Gerekli",
 | 
			
		||||
    "telegram": "Telegram",
 | 
			
		||||
    "Bot Token": "Bot Token",
 | 
			
		||||
    "Bot Token": "Bot Anahtarı",
 | 
			
		||||
    "wayToGetTelegramToken": "{0} adresinden bir token alabilirsiniz.",
 | 
			
		||||
    "Chat ID": "Chat ID",
 | 
			
		||||
    "supportTelegramChatID": "Doğrudan Sohbet / Grup / Kanalın Sohbet Kimliğini Destekleyin",
 | 
			
		||||
@@ -216,8 +216,8 @@
 | 
			
		||||
    "smtpCC": "CC",
 | 
			
		||||
    "smtpBCC": "BCC",
 | 
			
		||||
    "discord": "Discord",
 | 
			
		||||
    "Discord Webhook URL": "Discord Webhook URL",
 | 
			
		||||
    "wayToGetDiscordURL": "Bunu Sunucu Ayarları -> Entegrasyonlar -> Webhookları Görüntüle -> Yeni Webhook Oluştur adımını izleyerek alabilirsiniz.",
 | 
			
		||||
    "Discord Webhook URL": "Discord Webhook Bağlantısı",
 | 
			
		||||
    "wayToGetDiscordURL": "Bunu Sunucu Ayarları -> Entegrasyonlar -> Webhookları Görüntüle -> Yeni Webhook Oluştur adımını izleyerek alabilirsiniz",
 | 
			
		||||
    "Bot Display Name": "Botun Görünecek Adı",
 | 
			
		||||
    "Prefix Custom Message": "Önek Özel Mesaj",
 | 
			
		||||
    "Hello @everyone is...": "Merhaba {'@'}everyone…",
 | 
			
		||||
@@ -262,7 +262,7 @@
 | 
			
		||||
    "octopushPhoneNumber": "Telefon numarası (uluslararası biçim, örneğin: +33612345678) ",
 | 
			
		||||
    "octopushSMSSender": "SMS Gönderici Adı : 3-11 alfanümerik karakter ve boşluk (a-zA-Z0-9)",
 | 
			
		||||
    "LunaSea Device ID": "LunaSea Cihaz ID",
 | 
			
		||||
    "Apprise URL": "Apprise URL",
 | 
			
		||||
    "Apprise URL": "Apprise Bağlantısı",
 | 
			
		||||
    "Example:": "Örnek: {0}",
 | 
			
		||||
    "Read more:": "Daha fazla oku: {0}",
 | 
			
		||||
    "Status:": "Durum: {0}",
 | 
			
		||||
@@ -335,7 +335,7 @@
 | 
			
		||||
    "Please input title and content": "Lütfen başlık ve içerik girin",
 | 
			
		||||
    "Created": "Oluşturuldu",
 | 
			
		||||
    "Last Updated": "Son Güncelleme",
 | 
			
		||||
    "Unpin": "Unpin",
 | 
			
		||||
    "Unpin": "Sabitlemeyi Kaldır",
 | 
			
		||||
    "Switch to Light Theme": "Açık Temaya Geç",
 | 
			
		||||
    "Switch to Dark Theme": "Karanlık Temaya Geç",
 | 
			
		||||
    "Show Tags": "Etiketleri Göster",
 | 
			
		||||
@@ -395,7 +395,7 @@
 | 
			
		||||
    "Valid": "Geçerli",
 | 
			
		||||
    "Invalid": "Geçersiz",
 | 
			
		||||
    "AccessKeyId": "AccessKey ID",
 | 
			
		||||
    "SecretAccessKey": "AccessKey Secret",
 | 
			
		||||
    "SecretAccessKey": "AccessKey Gizli Anahtarı",
 | 
			
		||||
    "PhoneNumbers": "Telefon numaraları",
 | 
			
		||||
    "TemplateCode": "TemplateCode",
 | 
			
		||||
    "SignName": "SignName",
 | 
			
		||||
@@ -414,7 +414,7 @@
 | 
			
		||||
    "High": "High",
 | 
			
		||||
    "Retry": "Tekrar",
 | 
			
		||||
    "Topic": "Başlık",
 | 
			
		||||
    "WeCom Bot Key": "WeCom Bot Key",
 | 
			
		||||
    "WeCom Bot Key": "WeCom Bot Anahtarı",
 | 
			
		||||
    "Setup Proxy": "Proxy kur",
 | 
			
		||||
    "Proxy Protocol": "Proxy Protokolü",
 | 
			
		||||
    "Proxy Server": "Proxy Sunucusu",
 | 
			
		||||
@@ -444,7 +444,7 @@
 | 
			
		||||
    "Backup": "Yedek",
 | 
			
		||||
    "About": "Hakkında",
 | 
			
		||||
    "wayToGetCloudflaredURL": "(Cloudflared'i {0} adresinden indirin)",
 | 
			
		||||
    "cloudflareWebsite": "Cloudflare Website",
 | 
			
		||||
    "cloudflareWebsite": "Cloudflare İnt. Sitesi",
 | 
			
		||||
    "Message:": "Mesaj:",
 | 
			
		||||
    "Don't know how to get the token? Please read the guide:": "Tokeni nasıl alacağınızı bilmiyor musunuz? Lütfen kılavuzu okuyun:",
 | 
			
		||||
    "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.": "Halihazırda Cloudflare Tüneli üzerinden bağlanıyorsanız mevcut bağlantı kesilebilir. Durdurmak istediğinden emin misin? Onaylamak için mevcut şifrenizi yazın.",
 | 
			
		||||
@@ -475,7 +475,7 @@
 | 
			
		||||
    "Domain Names": "Alan isimleri",
 | 
			
		||||
    "signedInDisp": "{0} olarak oturum açıldı",
 | 
			
		||||
    "signedInDispDisabled": "Yetkilendirme Devre Dışı.",
 | 
			
		||||
    "RadiusSecret": "Radius Secret",
 | 
			
		||||
    "RadiusSecret": "Radius Gizli Anahtar",
 | 
			
		||||
    "RadiusSecretDescription": "İstemci ve sunucu arasında paylaşılan gizli anahtar",
 | 
			
		||||
    "RadiusCalledStationId": "Aranan İstasyon Kimliği",
 | 
			
		||||
    "RadiusCalledStationIdDescription": "Aranan cihazın tanımlayıcısı",
 | 
			
		||||
@@ -547,13 +547,13 @@
 | 
			
		||||
    "Docker Host": "Docker Ana Bilgisayarı",
 | 
			
		||||
    "Docker Hosts": "Docker Ana Bilgisayarları",
 | 
			
		||||
    "ntfy Topic": "ntfy Konu",
 | 
			
		||||
    "Domain": "Domain",
 | 
			
		||||
    "Domain": "Alan Adı",
 | 
			
		||||
    "Workstation": "İş İstasyonu",
 | 
			
		||||
    "disableCloudflaredNoAuthMsg": "Yetki yok modundasınız, şifre gerekli değil.",
 | 
			
		||||
    "trustProxyDescription": "'X-Forwarded-*' başlıklarına güvenin. Doğru istemci IP'sini almak istiyorsanız ve Uptime Kuma'nız Nginx veya Apache gibi bir proxy'nin arkasındaysa, bunu etkinleştirmelisiniz.",
 | 
			
		||||
    "wayToGetLineNotifyToken": "{0} adresinden bir erişim jetonu alabilirsiniz.",
 | 
			
		||||
    "wayToGetLineNotifyToken": "{0} adresinden bir erişim jetonu alabilirsiniz",
 | 
			
		||||
    "Examples": "Örnekler",
 | 
			
		||||
    "Home Assistant URL": "Home Assistant URL",
 | 
			
		||||
    "Home Assistant URL": "Home Assistant Bağlantısı",
 | 
			
		||||
    "Long-Lived Access Token": "Long-Lived Erişim Anahtarı",
 | 
			
		||||
    "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 Erişim Anahtarı, profil adınıza (sol altta) tıklayarak ve aşağıya kaydırarak ve ardından Anahtar Oluştur'a tıklayarak oluşturulabilir. ",
 | 
			
		||||
    "Notification Service": "Bildirim Hizmeti",
 | 
			
		||||
@@ -749,5 +749,32 @@
 | 
			
		||||
    "endDateTime": "Bitiş Tarihi/Saati",
 | 
			
		||||
    "cronExpression": "Cron İfadesi",
 | 
			
		||||
    "cronSchedule": "Zamanlama: ",
 | 
			
		||||
    "invalidCronExpression": "Geçersiz Cron İfadesi: {0}"
 | 
			
		||||
    "invalidCronExpression": "Geçersiz Cron İfadesi: {0}",
 | 
			
		||||
    "ntfyAuthenticationMethod": "Kimlik Doğrulama Yöntemi",
 | 
			
		||||
    "ntfyUsernameAndPassword": "Kullanıcı adı ve şifre",
 | 
			
		||||
    "pushoverMessageTtl": "Mesajın Yaşama Süresi (Saniye)",
 | 
			
		||||
    "Show Clickable Link": "Tıklanabilir Bağlantıyı Göster",
 | 
			
		||||
    "Open Badge Generator": "Rozet Oluşturucuyu Aç",
 | 
			
		||||
    "Badge Generator": "{0} Rozet Oluşturucu",
 | 
			
		||||
    "Badge Type": "Rozet Türü",
 | 
			
		||||
    "Badge Duration": "Rozet Süresi",
 | 
			
		||||
    "Badge Label": "Rozet Etiketi",
 | 
			
		||||
    "Badge Prefix": "Rozet Öneki",
 | 
			
		||||
    "Badge Suffix": "Rozet Eki",
 | 
			
		||||
    "Badge Label Color": "Rozet Etiket Rengi",
 | 
			
		||||
    "Badge Color": "Rozet Rengi",
 | 
			
		||||
    "Badge Label Prefix": "Rozet Etiket Öneki",
 | 
			
		||||
    "Badge Label Suffix": "Rozet Etiket Eki",
 | 
			
		||||
    "Badge Up Color": "Rozet Normal Rengi",
 | 
			
		||||
    "Badge Down Color": "Rozet Hatalı Rengi",
 | 
			
		||||
    "Badge Pending Color": "Rozet Bekleyen Rengi",
 | 
			
		||||
    "Badge Maintenance Color": "Rozet Bakım Rengi",
 | 
			
		||||
    "Badge Warn Color": "Rozet Uyarı Rengi",
 | 
			
		||||
    "Badge Warn Days": "Rozet Uyarı Günleri",
 | 
			
		||||
    "Badge Down Days": "Rozet Hatalı Günleri",
 | 
			
		||||
    "Badge Style": "Rozet Stili",
 | 
			
		||||
    "Badge value (For Testing only.)": "Rozet değeri (Yalnızca Test için.)",
 | 
			
		||||
    "Badge URL": "Rozet URL'i",
 | 
			
		||||
    "Monitor Setting": "{0}'nin Monitör Ayarı",
 | 
			
		||||
    "Show Clickable Link Description": "Eğer işaretlenirse, bu durum sayfasına erişimi olan herkes monitor URL'ine erişebilir."
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -16,7 +16,7 @@
 | 
			
		||||
    "rrtypeDescription": "Виберіть тип ресурсного запису, який ви хочете відстежувати",
 | 
			
		||||
    "pauseMonitorMsg": "Ви дійсно хочете поставити на паузу?",
 | 
			
		||||
    "Settings": "Налаштування",
 | 
			
		||||
    "Dashboard": "Панель управління",
 | 
			
		||||
    "Dashboard": "Панель керування",
 | 
			
		||||
    "New Update": "Оновлення",
 | 
			
		||||
    "Language": "Мова",
 | 
			
		||||
    "Appearance": "Зовнішній вигляд",
 | 
			
		||||
@@ -120,7 +120,7 @@
 | 
			
		||||
    "Heartbeats": "Опитування",
 | 
			
		||||
    "Auto Get": "Авто-отримання",
 | 
			
		||||
    "enableDefaultNotificationDescription": "Для кожного нового монітора це сповіщення буде включено за замовчуванням. Ви все ще можете відключити сповіщення в кожному моніторі окремо.",
 | 
			
		||||
    "Default enabled": "Використовувати за промовчанням",
 | 
			
		||||
    "Default enabled": "Використовувати за замовчуванням",
 | 
			
		||||
    "Also apply to existing monitors": "Застосувати до існуючих моніторів",
 | 
			
		||||
    "Export": "Експорт",
 | 
			
		||||
    "Import": "Імпорт",
 | 
			
		||||
@@ -270,7 +270,7 @@
 | 
			
		||||
    "octopushPhoneNumber": "Номер телефону (між. формат, наприклад: +380123456789) ",
 | 
			
		||||
    "octopushSMSSender": "Ім'я відправника SMS: 3-11 символів алвафіту, цифр та пробілів (a-zA-Z0-9)",
 | 
			
		||||
    "LunaSea Device ID": "ID пристрою LunaSea",
 | 
			
		||||
    "Apprise URL": "Apprise URL",
 | 
			
		||||
    "Apprise URL": "Apprise URL-адреса",
 | 
			
		||||
    "Example:": "Приклад: {0}",
 | 
			
		||||
    "Read more:": "Докладніше: {0}",
 | 
			
		||||
    "Status:": "Статус: {0}",
 | 
			
		||||
@@ -477,35 +477,35 @@
 | 
			
		||||
    "From Name/Number": "Від Ім'я/Номер",
 | 
			
		||||
    "Leave blank to use a shared sender number.": "Залиште поле порожнім, щоб використовувати спільний номер відправника.",
 | 
			
		||||
    "Octopush API Version": "Octopush API версія",
 | 
			
		||||
    "Legacy Octopush-DM": "Legacy Octopush-DM",
 | 
			
		||||
    "Legacy Octopush-DM": "Застарілий Octopush-DM",
 | 
			
		||||
    "endpoint": "кінцева точка",
 | 
			
		||||
    "octopushAPIKey": "\"Ключ API\" з облікових даних HTTP API в панелі керування",
 | 
			
		||||
    "octopushLogin": "\"Ім'я користувача\" з облікових даних HTTP API на панелі керування",
 | 
			
		||||
    "promosmsLogin": "API Логін",
 | 
			
		||||
    "promosmsPassword": "API Пароль",
 | 
			
		||||
    "pushoversounds pushover": "Pushover (по замовчуванню)",
 | 
			
		||||
    "pushoversounds bike": "Bike",
 | 
			
		||||
    "pushoversounds bugle": "Bugle",
 | 
			
		||||
    "pushoversounds cashregister": "Cash Register",
 | 
			
		||||
    "pushoversounds bike": "Велосипед",
 | 
			
		||||
    "pushoversounds bugle": "Горн",
 | 
			
		||||
    "pushoversounds cashregister": "Касовий апарат",
 | 
			
		||||
    "pushoversounds classical": "Classical",
 | 
			
		||||
    "pushoversounds cosmic": "Cosmic",
 | 
			
		||||
    "pushoversounds falling": "Falling",
 | 
			
		||||
    "pushoversounds gamelan": "Gamelan",
 | 
			
		||||
    "pushoversounds incoming": "Incoming",
 | 
			
		||||
    "pushoversounds intermission": "Intermission",
 | 
			
		||||
    "pushoversounds magic": "Magic",
 | 
			
		||||
    "pushoversounds mechanical": "Mechanical",
 | 
			
		||||
    "pushoversounds pianobar": "Piano Bar",
 | 
			
		||||
    "pushoversounds siren": "Siren",
 | 
			
		||||
    "pushoversounds spacealarm": "Space Alarm",
 | 
			
		||||
    "pushoversounds tugboat": "Tug Boat",
 | 
			
		||||
    "pushoversounds alien": "Alien Alarm (long)",
 | 
			
		||||
    "pushoversounds climb": "Climb (long)",
 | 
			
		||||
    "pushoversounds persistent": "Persistent (long)",
 | 
			
		||||
    "pushoversounds echo": "Pushover Echo (long)",
 | 
			
		||||
    "pushoversounds updown": "Up Down (long)",
 | 
			
		||||
    "pushoversounds vibrate": "Vibrate Only",
 | 
			
		||||
    "pushoversounds none": "None (silent)",
 | 
			
		||||
    "pushoversounds falling": "Падіння",
 | 
			
		||||
    "pushoversounds 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": "Pushover ехо (довгий)",
 | 
			
		||||
    "pushoversounds updown": "Вгору вниз (довгий)",
 | 
			
		||||
    "pushoversounds vibrate": "Тільки вібрація",
 | 
			
		||||
    "pushoversounds none": "Нічого (тиша)",
 | 
			
		||||
    "pushyAPIKey": "Секретний ключ API",
 | 
			
		||||
    "pushyToken": "Токен пристрою",
 | 
			
		||||
    "Using a Reverse Proxy?": "Використовувати зворотній проксі?",
 | 
			
		||||
@@ -587,7 +587,7 @@
 | 
			
		||||
    "weekdayShortSun": "Нд",
 | 
			
		||||
    "Single Maintenance Window": "Разове технічне обслуговування",
 | 
			
		||||
    "Maintenance Time Window of a Day": "Період доби для технічного обслуговування",
 | 
			
		||||
    "Effective Date Range": "Діапазон дат вступу в силу",
 | 
			
		||||
    "Effective Date Range": "Діапазон дат вступу в силу (необов'язково)",
 | 
			
		||||
    "Schedule Maintenance": "Розклад обслуговування",
 | 
			
		||||
    "DateTime Range": "Діапазон дат і часу",
 | 
			
		||||
    "loadingError": "Не вдалося отримати дані, спробуйте пізніше.",
 | 
			
		||||
@@ -744,5 +744,43 @@
 | 
			
		||||
    "lunaseaTarget": "Ціль",
 | 
			
		||||
    "Add New Tag": "Додати новий тег",
 | 
			
		||||
    "lunaseaDeviceID": "ID пристрою",
 | 
			
		||||
    "lunaseaUserID": "ID користувача"
 | 
			
		||||
    "lunaseaUserID": "ID користувача",
 | 
			
		||||
    "twilioAccountSID": "SID облікового запису",
 | 
			
		||||
    "twilioAuthToken": "Токен авторизації",
 | 
			
		||||
    "twilioFromNumber": "З номера",
 | 
			
		||||
    "twilioToNumber": "На номер",
 | 
			
		||||
    "sameAsServerTimezone": "Такий самий, як часовий пояс сервера",
 | 
			
		||||
    "startDateTime": "Дата і час початку",
 | 
			
		||||
    "endDateTime": "Дата і час закінчення",
 | 
			
		||||
    "cronExpression": "Cron-вираз",
 | 
			
		||||
    "cronSchedule": "Розклад: ",
 | 
			
		||||
    "invalidCronExpression": "Неправильний Cron-вираз: {0}",
 | 
			
		||||
    "statusPageRefreshIn": "Оновлювати кожні: {0}",
 | 
			
		||||
    "ntfyAuthenticationMethod": "Метод автентифікації",
 | 
			
		||||
    "ntfyUsernameAndPassword": "Ім'я користувача та пароль",
 | 
			
		||||
    "pushoverMessageTtl": "TTL повідомлення (секунди)",
 | 
			
		||||
    "Monitor Setting": "Налаштування монітора {0}",
 | 
			
		||||
    "Show Clickable Link": "Показувати клікабельне посилання",
 | 
			
		||||
    "Show Clickable Link Description": "Якщо позначено, кожен, хто має доступ до цієї сторінки статусу, може мати доступ до URL-адреси моніторингу.",
 | 
			
		||||
    "Open Badge Generator": "Відкрити генератор бейджів",
 | 
			
		||||
    "Badge Generator": "Генератор бейджів {0}",
 | 
			
		||||
    "Badge Type": "Тип бейджа",
 | 
			
		||||
    "Badge Duration": "Тривалість бейджа",
 | 
			
		||||
    "Badge Label": "Ярлик бейджа",
 | 
			
		||||
    "Badge Prefix": "Префікс бейджа",
 | 
			
		||||
    "Badge Suffix": "Суфікс бейджа",
 | 
			
		||||
    "Badge Label Color": "Колір ярлика бейджа",
 | 
			
		||||
    "Badge Color": "Колір бейджа",
 | 
			
		||||
    "Badge Label Prefix": "Префікс ярлика бейджа",
 | 
			
		||||
    "Badge Label Suffix": "Суфікс ярлика бейджа",
 | 
			
		||||
    "Badge Style": "Стиль бейджа",
 | 
			
		||||
    "Badge value (For Testing only.)": "Значення бейджа (тільки для тестування.)",
 | 
			
		||||
    "Badge URL": "URL бейджа",
 | 
			
		||||
    "Badge Up Color": "Колір бейджа \"Доступний\"",
 | 
			
		||||
    "Badge Down Color": "Колір бейджа \"Недоступний\"",
 | 
			
		||||
    "Badge Pending Color": "Колір бейджа \"Очікування\"",
 | 
			
		||||
    "Badge Warn Color": "Колір бейджа \"Попередження\"",
 | 
			
		||||
    "Badge Warn Days": "Бейдж \"Днів попередження\"",
 | 
			
		||||
    "Badge Maintenance Color": "Колір бейджа \"Обслуговування\"",
 | 
			
		||||
    "Badge Down Days": "Бейдж \"Днів недоступний\""
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,11 +1,11 @@
 | 
			
		||||
{
 | 
			
		||||
    "languageName": "Tiếng Việt",
 | 
			
		||||
    "checkEverySecond": "Kiểm tra mỗi {0} giây.",
 | 
			
		||||
    "retryCheckEverySecond": "Thử lại mỗi {0} giây.",
 | 
			
		||||
    "retriesDescription": "Số lần thử lại tối đa trước khi dịch vụ được đánh dấu là down và gửi thông báo.",
 | 
			
		||||
    "ignoreTLSError": "Bỏ qua lỗi TLS/SSL với các web HTTPS.",
 | 
			
		||||
    "upsideDownModeDescription": "Trạng thái đảo ngược, nếu dịch vụ có thể truy cập được nghĩa là DOWN.",
 | 
			
		||||
    "maxRedirectDescription": "Số lần chuyển hướng (redirect) tối đa. Đặt thành 0 để tắt chuyển hướng",
 | 
			
		||||
    "checkEverySecond": "Kiểm tra mỗi {0} giây",
 | 
			
		||||
    "retryCheckEverySecond": "Thử lại mỗi {0} giây",
 | 
			
		||||
    "retriesDescription": "Số lần thử lại tối đa trước khi dịch vụ được đánh dấu là down và gửi thông báo",
 | 
			
		||||
    "ignoreTLSError": "Bỏ qua lỗi TLS/SSL với các web HTTPS",
 | 
			
		||||
    "upsideDownModeDescription": "Chế độ đảo ngược, nếu dịch vụ có thể truy cập được nghĩa là DOWN.",
 | 
			
		||||
    "maxRedirectDescription": "Số lần chuyển hướng (redirect) tối đa. Đặt thành 0 để tắt chuyển hướng.",
 | 
			
		||||
    "acceptedStatusCodesDescription": "Chọn mã trạng thái được coi là phản hồi thành công.",
 | 
			
		||||
    "passwordNotMatchMsg": "Mật khẩu nhập lại không khớp.",
 | 
			
		||||
    "notificationDescription": "Vui lòng chỉ định một kênh thông báo.",
 | 
			
		||||
@@ -27,7 +27,7 @@
 | 
			
		||||
    "confirmEnableTwoFAMsg": "Bạn chắc chắn muốn bật xác thực 2 lớp (2FA) chứ?",
 | 
			
		||||
    "confirmDisableTwoFAMsg": "Bạn chắc chắn muốn tắt xác thực 2 lớp (2FA) chứ?",
 | 
			
		||||
    "Settings": "Cài đặt",
 | 
			
		||||
    "Dashboard": "Dashboard",
 | 
			
		||||
    "Dashboard": "Trang tổng quan",
 | 
			
		||||
    "New Update": "Bản cập nhật mới",
 | 
			
		||||
    "Language": "Ngôn ngữ",
 | 
			
		||||
    "Appearance": "Giao diện",
 | 
			
		||||
@@ -102,10 +102,10 @@
 | 
			
		||||
    "Enable Auth": "Bật xác minh",
 | 
			
		||||
    "disableauth.message1": "Bạn có muốn <strong>TẮT XÁC THỰC</strong> không?",
 | 
			
		||||
    "disableauth.message2": "Điều này rất nguy hiểm<strong>BẤT KỲ AI</strong> cũng có thể truy cập và cướp quyền điều khiển.",
 | 
			
		||||
    "Please use this option carefully!": "Vui lòng <strong>cẩn thận</strong>.",
 | 
			
		||||
    "Please use this option carefully!": "Vui lòng <strong>cẩn thận</strong>!",
 | 
			
		||||
    "Logout": "Đăng xuất",
 | 
			
		||||
    "Leave": "Rời",
 | 
			
		||||
    "I understand, please disable": "Tôi hiểu, làm ơn hãy tắt!",
 | 
			
		||||
    "I understand, please disable": "Tôi hiểu, làm ơn hãy tắt",
 | 
			
		||||
    "Confirm": "Xác nhận",
 | 
			
		||||
    "Yes": "Có",
 | 
			
		||||
    "No": "Không",
 | 
			
		||||
@@ -158,11 +158,11 @@
 | 
			
		||||
    "Token": "Token",
 | 
			
		||||
    "Show URI": "Hiển thị URI",
 | 
			
		||||
    "Tags": "Tags",
 | 
			
		||||
    "Add New below or Select...": "Thêm mới ở dưới hoặc Chọn...",
 | 
			
		||||
    "Tag with this name already exist.": "Tag với tên đã tồn tại.",
 | 
			
		||||
    "Tag with this value already exist.": "Tag với value đã tồn tại.",
 | 
			
		||||
    "Add New below or Select...": "Thêm mới ở dưới hoặc Chọn…",
 | 
			
		||||
    "Tag with this name already exist.": "Tag với tên này đã tồn tại.",
 | 
			
		||||
    "Tag with this value already exist.": "Tag với giá trị này đã tồn tại.",
 | 
			
		||||
    "color": "Màu sắc",
 | 
			
		||||
    "value (optional)": "Value (tuỳ chọn)",
 | 
			
		||||
    "value (optional)": "Giá trị (tuỳ chọn)",
 | 
			
		||||
    "Gray": "Xám",
 | 
			
		||||
    "Red": "Đỏ",
 | 
			
		||||
    "Orange": "Cam",
 | 
			
		||||
@@ -171,7 +171,7 @@
 | 
			
		||||
    "Indigo": "Chàm",
 | 
			
		||||
    "Purple": "Tím",
 | 
			
		||||
    "Pink": "Hồng",
 | 
			
		||||
    "Search...": "Tìm kiếm...",
 | 
			
		||||
    "Search...": "Tìm kiếm…",
 | 
			
		||||
    "Avg. Ping": "Ping trung bình",
 | 
			
		||||
    "Avg. Response": "Phản hồi trung bình",
 | 
			
		||||
    "Entry Page": "Entry Page",
 | 
			
		||||
@@ -459,5 +459,37 @@
 | 
			
		||||
    "onebotGroupMessage": "Group",
 | 
			
		||||
    "onebotPrivateMessage": "Private",
 | 
			
		||||
    "onebotUserOrGroupId": "Group/User ID",
 | 
			
		||||
    "onebotSafetyTips": "Để đảm bảo an toàn, hãy thiết lập access token"
 | 
			
		||||
    "onebotSafetyTips": "Để đảm bảo an toàn, hãy thiết lập access token",
 | 
			
		||||
    "Custom": "Tùy chỉnh",
 | 
			
		||||
    "Add New Tag": "Thêm thẻ mới",
 | 
			
		||||
    "webhookAdditionalHeadersDesc": "Đặt header bổ sung được gửi cùng với webhook.",
 | 
			
		||||
    "error": "lỗi",
 | 
			
		||||
    "HTTP Headers": "HTTP Headers",
 | 
			
		||||
    "recurringIntervalMessage": "Chạy một lần mỗi ngày | Chạy một lần mỗi {0} ngày",
 | 
			
		||||
    "Retype the address.": "Nhập lại địa chỉ.",
 | 
			
		||||
    "enableGRPCTls": "Cho phép gửi yêu cầu gRPC với kết nối TLS",
 | 
			
		||||
    "affectedMonitorsDescription": "Chọn kênh theo dõi bị ảnh hưởng bởi lịch bảo trì này",
 | 
			
		||||
    "statusMaintenance": "Bảo trì",
 | 
			
		||||
    "Maintenance": "Bảo trì",
 | 
			
		||||
    "Affected Monitors": "Kênh theo dõi bị ảnh hưởng",
 | 
			
		||||
    "Schedule maintenance": "Thêm lịch bảo trì",
 | 
			
		||||
    "markdownSupported": "Có hỗ trợ Markdown",
 | 
			
		||||
    "Start of maintenance": "Bắt đầu bảo trì",
 | 
			
		||||
    "All Status Pages": "Tất cả các trang trạng thái",
 | 
			
		||||
    "Select status pages...": "Chọn trang trạng thái…",
 | 
			
		||||
    "Certificate Expiry Notification": "Thông báo hết hạn chứng chỉ",
 | 
			
		||||
    "Show update if available": "Hiển thị cập nhật (nếu có)",
 | 
			
		||||
    "What you can try:": "Bạn có thể thử:",
 | 
			
		||||
    "trustProxyDescription": "Tin tưởng các header 'X-Forwarded-*'. Nếu bạn muốn lấy đúng IP máy khách và Uptime Kuma của bạn đứng sau một proxy như Nginx hoặc Apache, bạn nên kích hoạt tính năng này.",
 | 
			
		||||
    "webhookAdditionalHeadersTitle": "Header bổ sung",
 | 
			
		||||
    "Help": "Trợ giúp",
 | 
			
		||||
    "Game": "Trò chơi",
 | 
			
		||||
    "Pick Affected Monitors...": "Chọn kênh theo dõi…",
 | 
			
		||||
    "statusPageRefreshIn": "Làm mới trong: {0}",
 | 
			
		||||
    "Authentication": "Xác thực",
 | 
			
		||||
    "Using a Reverse Proxy?": "Bạn đang sử dụng Reverse Proxy?",
 | 
			
		||||
    "Check how to config it for WebSocket": "Kiểm tra cách cấu hình nó cho WebSocket",
 | 
			
		||||
    "Go back to the previous page.": "Quay trở lại trang trước.",
 | 
			
		||||
    "wayToGetLineNotifyToken": "Bạn có thể lấy access token từ {0}",
 | 
			
		||||
    "Resend Notification if Down X times consecutively": "Gửi lại thông báo nếu Down X lần liên tiếp"
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										1
									
								
								src/lang/xh.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								src/lang/xh.json
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1 @@
 | 
			
		||||
{}
 | 
			
		||||
@@ -60,7 +60,7 @@
 | 
			
		||||
    "Quick Stats": "状态速览",
 | 
			
		||||
    "Up": "正常",
 | 
			
		||||
    "Down": "故障",
 | 
			
		||||
    "Pending": "检测中",
 | 
			
		||||
    "Pending": "重试中",
 | 
			
		||||
    "Unknown": "未知",
 | 
			
		||||
    "Pause": "暂停",
 | 
			
		||||
    "Name": "名称",
 | 
			
		||||
@@ -235,7 +235,7 @@
 | 
			
		||||
    "smtpBCC": "密送",
 | 
			
		||||
    "discord": "Discord",
 | 
			
		||||
    "Discord Webhook URL": "Discord Webhook 网址",
 | 
			
		||||
    "wayToGetDiscordURL": "可在服务器设置 -> 整合 -> 创建 Webhook中获取",
 | 
			
		||||
    "wayToGetDiscordURL": "可在服务器设置 -> 整合 -> Webhook -> 创建 Webhook 中获取",
 | 
			
		||||
    "Bot Display Name": "机器人显示名称",
 | 
			
		||||
    "Prefix Custom Message": "自定义消息前缀",
 | 
			
		||||
    "Hello @everyone is...": "{'@'}everyone,……",
 | 
			
		||||
@@ -423,7 +423,7 @@
 | 
			
		||||
    "alerta": "Alerta",
 | 
			
		||||
    "alertaApiEndpoint": "API 接入点",
 | 
			
		||||
    "alertaEnvironment": "环境参数",
 | 
			
		||||
    "alertaApiKey": "API Key",
 | 
			
		||||
    "alertaApiKey": "API 密钥",
 | 
			
		||||
    "alertaAlertState": "报警时的严重性",
 | 
			
		||||
    "alertaRecoverState": "恢复后的严重性",
 | 
			
		||||
    "deleteStatusPageMsg": "您确认要删除此状态页吗?",
 | 
			
		||||
@@ -515,7 +515,7 @@
 | 
			
		||||
    "onebotPrivateMessage": "私聊",
 | 
			
		||||
    "onebotUserOrGroupId": "群组/用户 ID",
 | 
			
		||||
    "onebotSafetyTips": "出于安全原因,请务必设置 AccessToken",
 | 
			
		||||
    "PushDeer Key": "PushDeer Key",
 | 
			
		||||
    "PushDeer Key": "PushDeer 密钥",
 | 
			
		||||
    "Footer Text": "底部自定义文本",
 | 
			
		||||
    "Show Powered By": "显示 Powered By",
 | 
			
		||||
    "Domain Names": "域名",
 | 
			
		||||
@@ -528,8 +528,8 @@
 | 
			
		||||
    "RadiusCallingStationId": "呼叫方号码(Calling Station Id)",
 | 
			
		||||
    "RadiusCallingStationIdDescription": "发出请求的设备的标识",
 | 
			
		||||
    "Certificate Expiry Notification": "证书到期时通知",
 | 
			
		||||
    "API Username": "API Username",
 | 
			
		||||
    "API Key": "API Key",
 | 
			
		||||
    "API Username": "API  用户名",
 | 
			
		||||
    "API Key": "API  密钥",
 | 
			
		||||
    "Recipient Number": "收件人手机号码",
 | 
			
		||||
    "From Name/Number": "发件人名称/手机号码",
 | 
			
		||||
    "Leave blank to use a shared sender number.": "留空以使用平台共享的发件人手机号码。",
 | 
			
		||||
@@ -546,7 +546,7 @@
 | 
			
		||||
    "pushoversounds cashregister": "Cash Register",
 | 
			
		||||
    "pushoversounds classical": "Classical",
 | 
			
		||||
    "pushoversounds cosmic": "Cosmic",
 | 
			
		||||
    "pushoversounds falling": "下落",
 | 
			
		||||
    "pushoversounds falling": "Falling",
 | 
			
		||||
    "pushoversounds gamelan": "Gamelan",
 | 
			
		||||
    "pushoversounds incoming": "Incoming",
 | 
			
		||||
    "pushoversounds intermission": "Intermission",
 | 
			
		||||
@@ -592,7 +592,7 @@
 | 
			
		||||
    "Container Name / ID": "容器名称 / ID",
 | 
			
		||||
    "Docker Host": "Docker 宿主",
 | 
			
		||||
    "Docker Hosts": "Docker 宿主",
 | 
			
		||||
    "ntfy Topic": "ntfy Topic",
 | 
			
		||||
    "ntfy Topic": "ntfy 主题",
 | 
			
		||||
    "Domain": "域名",
 | 
			
		||||
    "Workstation": "工作站",
 | 
			
		||||
    "disableCloudflaredNoAuthMsg": "您现在正处于 No Auth 模式,无需输入密码。",
 | 
			
		||||
@@ -661,12 +661,12 @@
 | 
			
		||||
    "dnsCacheDescription": "可能无法在某些 IPv6 环境工作,如果遇到问题请禁用。",
 | 
			
		||||
    "Single Maintenance Window": "单一时间窗口",
 | 
			
		||||
    "Maintenance Time Window of a Day": "每日维护时间窗口",
 | 
			
		||||
    "Effective Date Range": "生效日期范围",
 | 
			
		||||
    "Effective Date Range": "生效日期范围(可选)",
 | 
			
		||||
    "Schedule Maintenance": "计划维护",
 | 
			
		||||
    "Date and Time": "日期时间",
 | 
			
		||||
    "DateTime Range": "日期时间范围",
 | 
			
		||||
    "Strategy": "策略",
 | 
			
		||||
    "Free Mobile User Identifier": "Free Mobile User Identifier",
 | 
			
		||||
    "Free Mobile User Identifier": "Free Mobile 用户 ID",
 | 
			
		||||
    "Free Mobile API Key": "Free Mobile API Key",
 | 
			
		||||
    "Enable TLS": "启用 TLS",
 | 
			
		||||
    "Proto Service Name": "Proto 服务名称",
 | 
			
		||||
@@ -682,7 +682,7 @@
 | 
			
		||||
    "Monitor": "监控项",
 | 
			
		||||
    "Custom": "自定义",
 | 
			
		||||
    "promosmsAllowLongSMS": "允许长的短信",
 | 
			
		||||
    "confirmDeleteTagMsg": "你确定你要删除这个标签?与此标签关联的监视器不会被删除。",
 | 
			
		||||
    "confirmDeleteTagMsg": "您确定要删除这个标签?与此标签关联的监控项不会被删除。",
 | 
			
		||||
    "infiniteRetention": "设为0表示无限保留期。",
 | 
			
		||||
    "Help": "帮助",
 | 
			
		||||
    "Game": "游戏",
 | 
			
		||||
@@ -720,13 +720,13 @@
 | 
			
		||||
    "apiKey-expired": "已过期",
 | 
			
		||||
    "Expires": "过期时间",
 | 
			
		||||
    "apiKey-inactive": "已禁用",
 | 
			
		||||
    "disableAPIKeyMsg": "你确定要禁用这个 API 密钥?",
 | 
			
		||||
    "deleteAPIKeyMsg": "你确定要删除这个 API 密钥?",
 | 
			
		||||
    "disableAPIKeyMsg": "您确定要禁用这个 API 密钥?",
 | 
			
		||||
    "deleteAPIKeyMsg": "您确定要删除这个 API 密钥?",
 | 
			
		||||
    "Generate": "生成",
 | 
			
		||||
    "API Keys": "API 密钥",
 | 
			
		||||
    "Don't expire": "从不过期",
 | 
			
		||||
    "Key Added": "API 密钥已生成",
 | 
			
		||||
    "apiKeyAddedMsg": "你的 API 密钥已生成。此页只会显示一次,请妥当保存。",
 | 
			
		||||
    "apiKeyAddedMsg": "您的 API 密钥已生成。此页只会显示一次,请妥当保存。",
 | 
			
		||||
    "pagertreeUrgency": "紧急程度",
 | 
			
		||||
    "pagertreeLow": "低",
 | 
			
		||||
    "pagertreeCritical": "严重",
 | 
			
		||||
@@ -741,5 +741,42 @@
 | 
			
		||||
    "lunaseaDeviceID": "设备 ID",
 | 
			
		||||
    "lunaseaTarget": "目标",
 | 
			
		||||
    "lunaseaUserID": "用户 ID",
 | 
			
		||||
    "statusPageRefreshIn": "将于 {0} 后刷新"
 | 
			
		||||
    "statusPageRefreshIn": "将于 {0} 后刷新",
 | 
			
		||||
    "twilioAccountSID": "账户 SID",
 | 
			
		||||
    "twilioAuthToken": "验证 Token",
 | 
			
		||||
    "twilioFromNumber": "发信号码",
 | 
			
		||||
    "twilioToNumber": "收信号码",
 | 
			
		||||
    "sameAsServerTimezone": "使用服务器时区",
 | 
			
		||||
    "startDateTime": "开始日期/时间",
 | 
			
		||||
    "invalidCronExpression": "无效的 Cron 表达式:{0}",
 | 
			
		||||
    "endDateTime": "结束日期/时间",
 | 
			
		||||
    "cronExpression": "Cron 表达式",
 | 
			
		||||
    "cronSchedule": "计划: ",
 | 
			
		||||
    "ntfyAuthenticationMethod": "鉴权方式",
 | 
			
		||||
    "ntfyUsernameAndPassword": "用户名和密码",
 | 
			
		||||
    "pushoverMessageTtl": "消息存活时间(秒)",
 | 
			
		||||
    "Monitor Setting": "{0} 监控项设置",
 | 
			
		||||
    "Badge Color": "徽章内容颜色",
 | 
			
		||||
    "Badge Suffix": "徽章内容后缀",
 | 
			
		||||
    "Badge Prefix": "徽章内容前缀",
 | 
			
		||||
    "Badge Label": "徽章标签",
 | 
			
		||||
    "Badge Duration": "徽章显示时段",
 | 
			
		||||
    "Badge Type": "徽章类型",
 | 
			
		||||
    "Badge Generator": "{0} 徽章生成器",
 | 
			
		||||
    "Open Badge Generator": "打开徽章生成器",
 | 
			
		||||
    "Badge Style": "徽章样式",
 | 
			
		||||
    "Badge Down Days": "徽章证书到期故障天数",
 | 
			
		||||
    "Badge Warn Days": "徽章证书到期警告天数",
 | 
			
		||||
    "Badge Warn Color": "警告状态下徽章颜色",
 | 
			
		||||
    "Badge Maintenance Color": "维护状态下徽章颜色",
 | 
			
		||||
    "Badge Down Color": "故障状态下徽章颜色",
 | 
			
		||||
    "Badge Up Color": "正常状态下徽章颜色",
 | 
			
		||||
    "Badge Label Suffix": "徽章标签后缀",
 | 
			
		||||
    "Badge URL": "徽章网址",
 | 
			
		||||
    "Badge value (For Testing only.)": "徽章内容(仅供测试)",
 | 
			
		||||
    "Badge Pending Color": "重试中状态下徽章颜色",
 | 
			
		||||
    "Badge Label Prefix": "徽章标签前缀",
 | 
			
		||||
    "Badge Label Color": "徽章标签颜色",
 | 
			
		||||
    "Show Clickable Link Description": "勾选后所有能访问本状态页的访客均可查看该监控项网址。",
 | 
			
		||||
    "Show Clickable Link": "显示可点击的监控项链接"
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -234,7 +234,7 @@
 | 
			
		||||
    "smtpBCC": "BCC",
 | 
			
		||||
    "discord": "Discord",
 | 
			
		||||
    "Discord Webhook URL": "Discord Webhook 網址",
 | 
			
		||||
    "wayToGetDiscordURL": "您可以前往伺服器設定 -> 整合 -> Webhook -> 新 Webhook 以取得",
 | 
			
		||||
    "wayToGetDiscordURL": "您可以前往伺服器設定 (Server Settings) -> 整合 (Integrations) -> 檢視 Webhooks (View Webhooks) -> 新 Webhook (New Webhook) 以取得新的 Webhook",
 | 
			
		||||
    "Bot Display Name": "機器人顯示名稱",
 | 
			
		||||
    "Prefix Custom Message": "前綴自訂訊息",
 | 
			
		||||
    "Hello @everyone is...": "Hello {'@'}everyone is…",
 | 
			
		||||
@@ -607,7 +607,7 @@
 | 
			
		||||
    "goAlertInfo": "GoAlert 是用於待命排程、升級自動化,以及通知 (如簡訊或語音通話) 的開源應用程式。自動在正確的時間、用洽當的方法、聯絡合適的人! {0}",
 | 
			
		||||
    "goAlertIntegrationKeyInfo": "取得服務的通用 API 整合金鑰,格式為 \"aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee\"。通常是已複製的網址的權杖參數值。",
 | 
			
		||||
    "goAlert": "GoAlert",
 | 
			
		||||
    "backupOutdatedWarning": "過時:由於新功能的增加,且未妥善維護,故此備份功能無法產生或復原完整備份。",
 | 
			
		||||
    "backupOutdatedWarning": "即將棄用:由於專案新增了大量新功能,且備份功能未被妥善維護,故此功能無法產生或復原完整備份。",
 | 
			
		||||
    "backupRecommend": "請直接備份磁碟區或 ./data/ 資料夾。",
 | 
			
		||||
    "Optional": "選填",
 | 
			
		||||
    "squadcast": "Squadcast",
 | 
			
		||||
@@ -652,7 +652,7 @@
 | 
			
		||||
    "dnsCacheDescription": "在某些 IPv6 環境可能會無法運作,如果您遇到任何問題,請停用。",
 | 
			
		||||
    "Single Maintenance Window": "單一維護時段",
 | 
			
		||||
    "Maintenance Time Window of a Day": "每日的維護時段",
 | 
			
		||||
    "Effective Date Range": "有效的日期範圍",
 | 
			
		||||
    "Effective Date Range": "有效的日期範圍(可選)",
 | 
			
		||||
    "Schedule Maintenance": "排程維護",
 | 
			
		||||
    "Date and Time": "時間和日期",
 | 
			
		||||
    "DateTime Range": "DateTime 範圍",
 | 
			
		||||
@@ -674,5 +674,37 @@
 | 
			
		||||
    "Game": "遊戲",
 | 
			
		||||
    "Help": "幫助",
 | 
			
		||||
    "Monitor": "監測器 | 監測器",
 | 
			
		||||
    "Custom": "自訂"
 | 
			
		||||
    "Custom": "自訂",
 | 
			
		||||
    "sameAsServerTimezone": "使用服務器時區",
 | 
			
		||||
    "cronExpression": "Cron 表達式",
 | 
			
		||||
    "telegramSendSilently": "靜默發送到 Telegram",
 | 
			
		||||
    "telegramSendSilentlyDescription": "靜默地發送消息。消息發布後用戶會收到無聲通知。",
 | 
			
		||||
    "pagertreeDoNothing": "什麼都不做",
 | 
			
		||||
    "Add New Tag": "添加新標籤",
 | 
			
		||||
    "telegramMessageThreadIDDescription": "(可選) Telegram 話題描述",
 | 
			
		||||
    "telegramMessageThreadID": "(可選)話題 ID",
 | 
			
		||||
    "startDateTime": "開始日期/時間",
 | 
			
		||||
    "endDateTime": "結束日期/時間",
 | 
			
		||||
    "cronSchedule": "計劃: ",
 | 
			
		||||
    "invalidCronExpression": "無效的 Cron 表達式:{0}",
 | 
			
		||||
    "telegramProtectContent": "阻止轉發/保存",
 | 
			
		||||
    "telegramProtectContentDescription": "如果啟用,Telegram 中的機器人消息將受到保護,不會被轉發和保存。",
 | 
			
		||||
    "installing": "安裝中",
 | 
			
		||||
    "uninstall": "卸載",
 | 
			
		||||
    "loadingError": "無法獲取數據, 請重試",
 | 
			
		||||
    "markdownSupported": "支持Markdown語法",
 | 
			
		||||
    "Packet Size": "數據包大小",
 | 
			
		||||
    "statusPageRefreshIn": "將於 {0} 後刷新",
 | 
			
		||||
    "confirmUninstallPlugin": "是否要卸載這個插件?",
 | 
			
		||||
    "Key Added": "已創建金鑰",
 | 
			
		||||
    "Clone Monitor": "複製監控項目",
 | 
			
		||||
    "Clone": "複製",
 | 
			
		||||
    "cloneOf": "從 {0} 複製",
 | 
			
		||||
    "uninstalling": "移除中",
 | 
			
		||||
    "notificationRegional": "地區限定",
 | 
			
		||||
    "wayToGetZohoCliqURL": "您可以前往此頁面以了解如何建立 webhook 網址 {0}。",
 | 
			
		||||
    "wayToGetKookBotToken": "到 {0} 創建應用程式並取得 bot token",
 | 
			
		||||
    "dataRetentionTimeError": "保留期限必須為 0 或正數",
 | 
			
		||||
    "infiniteRetention": "設定為 0 以作無限期保留。",
 | 
			
		||||
    "confirmDeleteTagMsg": "你確定你要刪除此標籤?相關的監測器不會被刪除。"
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -47,7 +47,7 @@ export default {
 | 
			
		||||
            statusPageListLoaded: false,
 | 
			
		||||
            statusPageList: [],
 | 
			
		||||
            proxyList: [],
 | 
			
		||||
            connectionErrorMsg: "Cannot connect to the socket server. Reconnecting...",
 | 
			
		||||
            connectionErrorMsg: `${this.$t("Cannot connect to the socket server.")} ${this.$t("Reconnecting...")}`,
 | 
			
		||||
            showReverseProxyGuide: true,
 | 
			
		||||
            cloudflared: {
 | 
			
		||||
                cloudflareTunnelToken: "",
 | 
			
		||||
@@ -228,7 +228,7 @@ export default {
 | 
			
		||||
 | 
			
		||||
            socket.on("connect_error", (err) => {
 | 
			
		||||
                console.error(`Failed to connect to the backend. Socket.io connect_error: ${err.message}`);
 | 
			
		||||
                this.connectionErrorMsg = `Cannot connect to the socket server. [${err}] Reconnecting...`;
 | 
			
		||||
                this.connectionErrorMsg = `${this.$t("Cannot connect to the socket server.")} [${err}] ${this.$t("Reconnecting...")}`;
 | 
			
		||||
                this.showReverseProxyGuide = true;
 | 
			
		||||
                this.socket.connected = false;
 | 
			
		||||
                this.socket.firstConnect = false;
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,7 @@
 | 
			
		||||
<template>
 | 
			
		||||
    <transition name="slide-fade" appear>
 | 
			
		||||
        <div v-if="monitor">
 | 
			
		||||
            <router-link v-if="group !== ''" :to="monitorURL(monitor.parent)"> {{ group }}</router-link>
 | 
			
		||||
            <h1> {{ monitor.name }}</h1>
 | 
			
		||||
            <p v-if="monitor.description">{{ monitor.description }}</p>
 | 
			
		||||
            <div class="tags">
 | 
			
		||||
@@ -40,7 +41,7 @@
 | 
			
		||||
                    <button v-if="monitor.active" class="btn btn-normal" @click="pauseDialog">
 | 
			
		||||
                        <font-awesome-icon icon="pause" /> {{ $t("Pause") }}
 | 
			
		||||
                    </button>
 | 
			
		||||
                    <button v-if="! monitor.active" class="btn btn-primary" @click="resumeMonitor">
 | 
			
		||||
                    <button v-if="! monitor.active" class="btn btn-primary" :disabled="monitor.forceInactive" @click="resumeMonitor">
 | 
			
		||||
                        <font-awesome-icon icon="play" /> {{ $t("Resume") }}
 | 
			
		||||
                    </button>
 | 
			
		||||
                    <router-link :to=" '/edit/' + monitor.id " class="btn btn-normal">
 | 
			
		||||
@@ -69,7 +70,7 @@
 | 
			
		||||
 | 
			
		||||
            <div class="shadow-box big-padding text-center stats">
 | 
			
		||||
                <div class="row">
 | 
			
		||||
                    <div class="col-12 col-sm col row d-flex align-items-center d-sm-block">
 | 
			
		||||
                    <div v-if="monitor.type !== 'group'" class="col-12 col-sm col row d-flex align-items-center d-sm-block">
 | 
			
		||||
                        <h4 class="col-4 col-sm-12">{{ pingTitle() }}</h4>
 | 
			
		||||
                        <p class="col-4 col-sm-12 mb-0 mb-sm-2">({{ $t("Current") }})</p>
 | 
			
		||||
                        <span class="col-4 col-sm-12 num">
 | 
			
		||||
@@ -78,7 +79,7 @@
 | 
			
		||||
                            </a>
 | 
			
		||||
                        </span>
 | 
			
		||||
                    </div>
 | 
			
		||||
                    <div class="col-12 col-sm col row d-flex align-items-center d-sm-block">
 | 
			
		||||
                    <div v-if="monitor.type !== 'group'" class="col-12 col-sm col row d-flex align-items-center d-sm-block">
 | 
			
		||||
                        <h4 class="col-4 col-sm-12">{{ pingTitle(true) }}</h4>
 | 
			
		||||
                        <p class="col-4 col-sm-12 mb-0 mb-sm-2">(24{{ $t("-hour") }})</p>
 | 
			
		||||
                        <span class="col-4 col-sm-12 num">
 | 
			
		||||
@@ -214,6 +215,7 @@ import Pagination from "v-pagination-3";
 | 
			
		||||
const PingChart = defineAsyncComponent(() => import("../components/PingChart.vue"));
 | 
			
		||||
import Tag from "../components/Tag.vue";
 | 
			
		||||
import CertificateInfo from "../components/CertificateInfo.vue";
 | 
			
		||||
import { getMonitorRelativeURL } from "../util.ts";
 | 
			
		||||
import { URL } from "whatwg-url";
 | 
			
		||||
 | 
			
		||||
export default {
 | 
			
		||||
@@ -313,6 +315,13 @@ export default {
 | 
			
		||||
            return this.heartBeatList.slice(startIndex, endIndex);
 | 
			
		||||
        },
 | 
			
		||||
 | 
			
		||||
        group() {
 | 
			
		||||
            if (!this.monitor.pathName.includes("/")) {
 | 
			
		||||
                return "";
 | 
			
		||||
            }
 | 
			
		||||
            return this.monitor.pathName.substr(0, this.monitor.pathName.lastIndexOf("/"));
 | 
			
		||||
        },
 | 
			
		||||
 | 
			
		||||
        pushURL() {
 | 
			
		||||
            return this.$root.baseURL + "/api/push/" + this.monitor.pushToken + "?status=up&msg=OK&ping=";
 | 
			
		||||
        },
 | 
			
		||||
@@ -409,6 +418,15 @@ export default {
 | 
			
		||||
            return this.$t(translationPrefix + "Ping");
 | 
			
		||||
        },
 | 
			
		||||
 | 
			
		||||
        /**
 | 
			
		||||
         * Get URL of monitor
 | 
			
		||||
         * @param {number} id ID of monitor
 | 
			
		||||
         * @returns {string} Relative URL of monitor
 | 
			
		||||
         */
 | 
			
		||||
        monitorURL(id) {
 | 
			
		||||
            return getMonitorRelativeURL(id);
 | 
			
		||||
        },
 | 
			
		||||
 | 
			
		||||
        /** Filter and hide password in URL for display */
 | 
			
		||||
        filterPassword(urlString) {
 | 
			
		||||
            try {
 | 
			
		||||
 
 | 
			
		||||
@@ -36,7 +36,7 @@
 | 
			
		||||
                                    v-model="affectedMonitors"
 | 
			
		||||
                                    :options="affectedMonitorsOptions"
 | 
			
		||||
                                    track-by="id"
 | 
			
		||||
                                    label="name"
 | 
			
		||||
                                    label="pathName"
 | 
			
		||||
                                    :multiple="true"
 | 
			
		||||
                                    :close-on-select="false"
 | 
			
		||||
                                    :clear-on-select="false"
 | 
			
		||||
@@ -381,17 +381,39 @@ export default {
 | 
			
		||||
        },
 | 
			
		||||
    },
 | 
			
		||||
    mounted() {
 | 
			
		||||
        this.init();
 | 
			
		||||
 | 
			
		||||
        this.$root.getMonitorList((res) => {
 | 
			
		||||
            if (res.ok) {
 | 
			
		||||
                Object.values(this.$root.monitorList).map(monitor => {
 | 
			
		||||
                Object.values(this.$root.monitorList).sort((m1, m2) => {
 | 
			
		||||
 | 
			
		||||
                    if (m1.active !== m2.active) {
 | 
			
		||||
                        if (m1.active === 0) {
 | 
			
		||||
                            return 1;
 | 
			
		||||
                        }
 | 
			
		||||
 | 
			
		||||
                        if (m2.active === 0) {
 | 
			
		||||
                            return -1;
 | 
			
		||||
                        }
 | 
			
		||||
                    }
 | 
			
		||||
 | 
			
		||||
                    if (m1.weight !== m2.weight) {
 | 
			
		||||
                        if (m1.weight > m2.weight) {
 | 
			
		||||
                            return -1;
 | 
			
		||||
                        }
 | 
			
		||||
 | 
			
		||||
                        if (m1.weight < m2.weight) {
 | 
			
		||||
                            return 1;
 | 
			
		||||
                        }
 | 
			
		||||
                    }
 | 
			
		||||
 | 
			
		||||
                    return m1.pathName.localeCompare(m2.pathName);
 | 
			
		||||
                }).map(monitor => {
 | 
			
		||||
                    this.affectedMonitorsOptions.push({
 | 
			
		||||
                        id: monitor.id,
 | 
			
		||||
                        name: monitor.name,
 | 
			
		||||
                        pathName: monitor.pathName,
 | 
			
		||||
                    });
 | 
			
		||||
                });
 | 
			
		||||
            }
 | 
			
		||||
            this.init();
 | 
			
		||||
        });
 | 
			
		||||
    },
 | 
			
		||||
    methods: {
 | 
			
		||||
@@ -429,7 +451,7 @@ export default {
 | 
			
		||||
                        this.$root.getSocket().emit("getMonitorMaintenance", this.$route.params.id, (res) => {
 | 
			
		||||
                            if (res.ok) {
 | 
			
		||||
                                Object.values(res.monitors).map(monitor => {
 | 
			
		||||
                                    this.affectedMonitors.push(monitor);
 | 
			
		||||
                                    this.affectedMonitors.push(this.affectedMonitorsOptions.find(item => item.id === monitor.id));
 | 
			
		||||
                                });
 | 
			
		||||
                            } else {
 | 
			
		||||
                                toast.error(res.msg);
 | 
			
		||||
 
 | 
			
		||||
@@ -12,6 +12,9 @@
 | 
			
		||||
                                <label for="type" class="form-label">{{ $t("Monitor Type") }}</label>
 | 
			
		||||
                                <select id="type" v-model="monitor.type" class="form-select">
 | 
			
		||||
                                    <optgroup :label="$t('General Monitor Type')">
 | 
			
		||||
                                        <option value="group">
 | 
			
		||||
                                            {{ $t("Group") }}
 | 
			
		||||
                                        </option>
 | 
			
		||||
                                        <option value="http">
 | 
			
		||||
                                            HTTP(s)
 | 
			
		||||
                                        </option>
 | 
			
		||||
@@ -89,6 +92,15 @@
 | 
			
		||||
                                <input id="name" v-model="monitor.name" type="text" class="form-control" required>
 | 
			
		||||
                            </div>
 | 
			
		||||
 | 
			
		||||
                            <!-- Parent Monitor -->
 | 
			
		||||
                            <div class="my-3">
 | 
			
		||||
                                <label for="parent" class="form-label">{{ $t("Monitor Group") }}</label>
 | 
			
		||||
                                <select v-model="monitor.parent" class="form-select" :disabled="sortedMonitorList.length === 0">
 | 
			
		||||
                                    <option :value="null" selected>{{ $t("None") }}</option>
 | 
			
		||||
                                    <option v-for="parentMonitor in sortedMonitorList" :key="parentMonitor.id" :value="parentMonitor.id">{{ parentMonitor.pathName }}</option>
 | 
			
		||||
                                </select>
 | 
			
		||||
                            </div>
 | 
			
		||||
 | 
			
		||||
                            <!-- URL -->
 | 
			
		||||
                            <div v-if="monitor.type === 'http' || monitor.type === 'keyword' || monitor.type === 'browser' " class="my-3">
 | 
			
		||||
                                <label for="url" class="form-label">{{ $t("URL") }}</label>
 | 
			
		||||
@@ -807,6 +819,48 @@ message HealthCheckResponse {
 | 
			
		||||
            return null;
 | 
			
		||||
        },
 | 
			
		||||
 | 
			
		||||
        // Filter result by active state, weight and alphabetical
 | 
			
		||||
        // Only return groups which arent't itself and one of its decendants
 | 
			
		||||
        sortedMonitorList() {
 | 
			
		||||
            let result = Object.values(this.$root.monitorList);
 | 
			
		||||
            console.log(this.monitor.childrenIDs);
 | 
			
		||||
 | 
			
		||||
            // Only groups, not itself, not a decendant
 | 
			
		||||
            result = result.filter(
 | 
			
		||||
                monitor => monitor.type === "group" &&
 | 
			
		||||
				monitor.id !== this.monitor.id &&
 | 
			
		||||
				!this.monitor.childrenIDs?.includes(monitor.id)
 | 
			
		||||
            );
 | 
			
		||||
 | 
			
		||||
            // Filter result by active state, weight and alphabetical
 | 
			
		||||
            result.sort((m1, m2) => {
 | 
			
		||||
 | 
			
		||||
                if (m1.active !== m2.active) {
 | 
			
		||||
                    if (m1.active === 0) {
 | 
			
		||||
                        return 1;
 | 
			
		||||
                    }
 | 
			
		||||
 | 
			
		||||
                    if (m2.active === 0) {
 | 
			
		||||
                        return -1;
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                if (m1.weight !== m2.weight) {
 | 
			
		||||
                    if (m1.weight > m2.weight) {
 | 
			
		||||
                        return -1;
 | 
			
		||||
                    }
 | 
			
		||||
 | 
			
		||||
                    if (m1.weight < m2.weight) {
 | 
			
		||||
                        return 1;
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                return m1.pathName.localeCompare(m2.pathName);
 | 
			
		||||
            });
 | 
			
		||||
 | 
			
		||||
            return result;
 | 
			
		||||
        },
 | 
			
		||||
 | 
			
		||||
    },
 | 
			
		||||
    watch: {
 | 
			
		||||
        "$root.proxyList"() {
 | 
			
		||||
@@ -926,6 +980,7 @@ message HealthCheckResponse {
 | 
			
		||||
                this.monitor = {
 | 
			
		||||
                    type: "http",
 | 
			
		||||
                    name: "",
 | 
			
		||||
                    parent: null,
 | 
			
		||||
                    url: "https://",
 | 
			
		||||
                    method: "GET",
 | 
			
		||||
                    interval: 60,
 | 
			
		||||
 
 | 
			
		||||
@@ -32,7 +32,7 @@
 | 
			
		||||
                <ul>
 | 
			
		||||
                    <li>{{ $t("Retype the address.") }}</li>
 | 
			
		||||
                    <li><a href="#" class="go-back" @click="goBack()">{{ $t("Go back to the previous page.") }}</a></li>
 | 
			
		||||
                    <li><a href="/" class="go-back">Go back to home page.</a></li>
 | 
			
		||||
                    <li><a href="/" class="go-back">{{ $t("Go back to home page.") }}</a></li>
 | 
			
		||||
                </ul>
 | 
			
		||||
            </div>
 | 
			
		||||
        </div>
 | 
			
		||||
 
 | 
			
		||||
@@ -278,11 +278,11 @@
 | 
			
		||||
                </div>
 | 
			
		||||
 | 
			
		||||
                <div class="mt-3">
 | 
			
		||||
                    <div v-if="allMonitorList.length > 0 && loadedData">
 | 
			
		||||
                    <div v-if="sortedMonitorList.length > 0 && loadedData">
 | 
			
		||||
                        <label>{{ $t("Add a monitor") }}:</label>
 | 
			
		||||
                        <VueMultiselect
 | 
			
		||||
                            v-model="selectedMonitor"
 | 
			
		||||
                            :options="allMonitorList"
 | 
			
		||||
                            :options="sortedMonitorList"
 | 
			
		||||
                            :multiple="false"
 | 
			
		||||
                            :searchable="true"
 | 
			
		||||
                            :placeholder="$t('Add a monitor')"
 | 
			
		||||
@@ -292,7 +292,7 @@
 | 
			
		||||
                        >
 | 
			
		||||
                            <template #option="{ option }">
 | 
			
		||||
                                <div class="d-inline-flex">
 | 
			
		||||
                                    <span>{{ option.name }} <Tag v-for="tag in option.tags" :key="tag" :item="tag" :size="'sm'" /></span>
 | 
			
		||||
                                    <span>{{ option.pathName }} <Tag v-for="tag in option.tags" :key="tag" :item="tag" :size="'sm'" /></span>
 | 
			
		||||
                                </div>
 | 
			
		||||
                            </template>
 | 
			
		||||
                        </VueMultiselect>
 | 
			
		||||
@@ -449,7 +449,7 @@ export default {
 | 
			
		||||
        /**
 | 
			
		||||
         * If the monitor is added to public list, which will not be in this list.
 | 
			
		||||
         */
 | 
			
		||||
        allMonitorList() {
 | 
			
		||||
        sortedMonitorList() {
 | 
			
		||||
            let result = [];
 | 
			
		||||
 | 
			
		||||
            for (let id in this.$root.monitorList) {
 | 
			
		||||
@@ -459,6 +459,31 @@ export default {
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            result.sort((m1, m2) => {
 | 
			
		||||
 | 
			
		||||
                if (m1.active !== m2.active) {
 | 
			
		||||
                    if (m1.active === 0) {
 | 
			
		||||
                        return 1;
 | 
			
		||||
                    }
 | 
			
		||||
 | 
			
		||||
                    if (m2.active === 0) {
 | 
			
		||||
                        return -1;
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                if (m1.weight !== m2.weight) {
 | 
			
		||||
                    if (m1.weight > m2.weight) {
 | 
			
		||||
                        return -1;
 | 
			
		||||
                    }
 | 
			
		||||
 | 
			
		||||
                    if (m1.weight < m2.weight) {
 | 
			
		||||
                        return 1;
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                return m1.pathName.localeCompare(m2.pathName);
 | 
			
		||||
            });
 | 
			
		||||
 | 
			
		||||
            return result;
 | 
			
		||||
        },
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user