mirror of
				https://github.com/louislam/uptime-kuma.git
				synced 2025-10-31 19:39:20 +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,……", | ||||
| @@ -395,7 +395,7 @@ | ||||
|     "smseagleContact": "通讯录联系人", | ||||
|     "smseagleRecipientType": "收信人类型", | ||||
|     "smseagleRecipient": "收信人(多个需用半角逗号分隔)", | ||||
|     "smseagleToken": "API访问令牌", | ||||
|     "smseagleToken": "API 访问令牌", | ||||
|     "smseagleUrl": "您的 SMSEagle 设备 URL", | ||||
|     "smseagleEncoding": "以 Unicode 发送", | ||||
|     "smseaglePriority": "消息优先级(0-9,默认为 0)", | ||||
| @@ -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": "严重", | ||||
| @@ -738,8 +738,45 @@ | ||||
|     "pagertreeDoNothing": "什么都不做", | ||||
|     "wayToGetPagerTreeIntegrationURL": "在 PagerTree 中创建 Uptime Kuma 集成后,复制端点 URL 到此处。在 {0} 查看详情", | ||||
|     "Add New Tag": "添加新标签", | ||||
|     "lunaseaDeviceID": "设备ID", | ||||
|     "lunaseaDeviceID": "设备 ID", | ||||
|     "lunaseaTarget": "目标", | ||||
|     "lunaseaUserID": "用户ID", | ||||
|     "statusPageRefreshIn": "将于 {0} 后刷新" | ||||
|     "lunaseaUserID": "用户 ID", | ||||
|     "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