diff --git a/.DS_Store b/.DS_Store
new file mode 100644
index 0000000000..12094bb209
Binary files /dev/null and b/.DS_Store differ
diff --git a/.gitignore b/.gitignore
index ff828c1ec8..055e3d31ef 100644
--- a/.gitignore
+++ b/.gitignore
@@ -3,8 +3,10 @@
.VSCodeCounter
*.sh
mongo
+timescaledb
node_modules/
docs/architecture
docs/reviews
docs/todo
-docs/frontend
\ No newline at end of file
+docs/frontend
+docs/timescale
\ No newline at end of file
diff --git a/README.md b/README.md
index 786e6102b4..263d41436e 100644
--- a/README.md
+++ b/README.md
@@ -48,6 +48,10 @@ You can see the latest build of [Checkmate](https://checkmate-demo.bluewavelabs.
Usage instructions can be found [here](https://checkmate.so/docs).
+## Prerequisites
+- [Docker](https://www.docker.com/) installed
+- [Git](https://git-scm.com/) installed
+
## Installation
See installation instructions in [Checkmate documentation portal](https://checkmate.so/docs).
@@ -80,7 +84,7 @@ You can see the memory footprint of MongoDB and Redis on the same server (398Mb
If you have any questions, suggestions or comments, you have several options:
- [Discord channel](https://discord.gg/NAb6H3UTjK) (preferred)
-- [GitHub Discussions](https://github.com/bluewave-labs/bluewave-uptime/discussions) (we check here from time to time)
+- [GitHub Discussions](https://github.com/bluewave-labs/Checkmate/discussions) (we check here from time to time)
Feel free to ask questions or share your ideas - we'd love to hear from you!
@@ -167,7 +171,7 @@ Here's how you can contribute:
-[](https://star-history.com/#bluewave-labs/bluewave-uptime&Date)
+[](https://star-history.com/#bluewave-labs/Checkmate&Date)
## Our sponsors
diff --git a/client/scripts/migrate-locales.ts b/client/scripts/migrate-locales.ts
new file mode 100644
index 0000000000..721321882d
--- /dev/null
+++ b/client/scripts/migrate-locales.ts
@@ -0,0 +1,258 @@
+/**
+ * Locale Migration Script
+ *
+ * Restructures all non-English locale files to match en.json's nested key structure.
+ * Recovers translations via safe key-matching strategies, uses English placeholders
+ * for unmatched keys.
+ *
+ * Usage: npx tsx client/scripts/migrate-locales.ts
+ *
+ * SAFETY: en.json is NEVER modified. Originals are backed up before overwriting.
+ */
+
+import fs from "fs";
+import path from "path";
+
+const LOCALES_DIR = path.resolve(import.meta.dirname, "../src/locales");
+const BACKUP_DIR = path.join(LOCALES_DIR, "backup");
+const REPORT_PATH = path.join(LOCALES_DIR, "migration-report.json");
+
+// ── Helpers ──────────────────────────────────────────────────────────────────
+
+/** Flatten a nested object into { "a.b.c": value } pairs */
+function flattenKeys(obj: Record, prefix = ""): Record {
+ const result: Record = {};
+ for (const [key, value] of Object.entries(obj)) {
+ const fullPath = prefix ? `${prefix}.${key}` : key;
+ if (typeof value === "object" && value !== null && !Array.isArray(value)) {
+ Object.assign(result, flattenKeys(value as Record, fullPath));
+ } else {
+ result[fullPath] = String(value);
+ }
+ }
+ return result;
+}
+
+/** Set a value at a dot-separated path in a nested object */
+function setNestedValue(
+ obj: Record,
+ keyPath: string,
+ value: string
+): void {
+ const parts = keyPath.split(".");
+ let current = obj;
+ for (let i = 0; i < parts.length - 1; i++) {
+ const part = parts[i];
+ if (!(part in current) || typeof current[part] !== "object") {
+ current[part] = {};
+ }
+ current = current[part] as Record;
+ }
+ current[parts[parts.length - 1]] = value;
+}
+
+// ── Build mapping indexes from en.json ───────────────────────────────────────
+
+function buildIndexes(enFlat: Record) {
+ const enKeys = Object.keys(enFlat);
+
+ // last segment -> en key paths
+ const lastSegIndex: Record = {};
+ // last 2 segments -> en key paths
+ const suffixIndex: Record = {};
+
+ for (const keyPath of enKeys) {
+ const parts = keyPath.split(".");
+ const lastSeg = parts[parts.length - 1].toLowerCase();
+ if (!lastSegIndex[lastSeg]) lastSegIndex[lastSeg] = [];
+ lastSegIndex[lastSeg].push(keyPath);
+
+ if (parts.length >= 2) {
+ const suffix = parts.slice(-2).join(".").toLowerCase();
+ if (!suffixIndex[suffix]) suffixIndex[suffix] = [];
+ suffixIndex[suffix].push(keyPath);
+ }
+ }
+
+ return { lastSegIndex, suffixIndex };
+}
+
+// ── Mapping logic ────────────────────────────────────────────────────────────
+
+type MatchStrategy = "exact" | "suffix-2" | "unique-name" | "english-placeholder";
+
+interface KeyMatch {
+ enKey: string;
+ value: string;
+ strategy: MatchStrategy;
+}
+
+function buildMigratedLocale(
+ enFlat: Record,
+ langFlat: Record,
+ indexes: ReturnType
+): { matches: KeyMatch[]; result: Record } {
+ const { lastSegIndex, suffixIndex } = indexes;
+ const matches: KeyMatch[] = [];
+ const result: Record = {};
+
+ // Build reverse lookup: for each orphan key in lang, index by last segment and suffix
+ const langByLastSeg: Record = {};
+ const langBySuffix: Record = {};
+
+ for (const [langKey, langValue] of Object.entries(langFlat)) {
+ const parts = langKey.split(".");
+ const lastSeg = parts[parts.length - 1].toLowerCase();
+ if (!langByLastSeg[lastSeg]) langByLastSeg[lastSeg] = [];
+ langByLastSeg[lastSeg].push({ key: langKey, value: langValue });
+
+ if (parts.length >= 2) {
+ const suffix = parts.slice(-2).join(".").toLowerCase();
+ if (!langBySuffix[suffix]) langBySuffix[suffix] = [];
+ langBySuffix[suffix].push({ key: langKey, value: langValue });
+ }
+ }
+
+ for (const enKey of Object.keys(enFlat)) {
+ const enValue = enFlat[enKey];
+ const parts = enKey.split(".");
+ const lastSeg = parts[parts.length - 1].toLowerCase();
+ const suffix = parts.length >= 2 ? parts.slice(-2).join(".").toLowerCase() : null;
+
+ // Strategy 1: Exact path match
+ if (langFlat[enKey] !== undefined) {
+ const value = langFlat[enKey];
+ setNestedValue(result, enKey, value);
+ matches.push({ enKey, value, strategy: "exact" });
+ continue;
+ }
+
+ // Strategy 2: 2-segment suffix match (lang key suffix matches en key suffix, both unique)
+ if (suffix) {
+ const enCandidates = suffixIndex[suffix];
+ const langCandidates = langBySuffix[suffix];
+ if (
+ enCandidates &&
+ enCandidates.length === 1 &&
+ langCandidates &&
+ langCandidates.length === 1
+ ) {
+ const value = langCandidates[0].value;
+ setNestedValue(result, enKey, value);
+ matches.push({ enKey, value, strategy: "suffix-2" });
+ continue;
+ }
+ }
+
+ // Strategy 3: Unique last-segment match
+ const enCandidates = lastSegIndex[lastSeg];
+ const langCandidates = langByLastSeg[lastSeg];
+ if (
+ enCandidates &&
+ enCandidates.length === 1 &&
+ langCandidates &&
+ langCandidates.length === 1
+ ) {
+ const value = langCandidates[0].value;
+ setNestedValue(result, enKey, value);
+ matches.push({ enKey, value, strategy: "unique-name" });
+ continue;
+ }
+
+ // No match — use English placeholder
+ setNestedValue(result, enKey, enValue);
+ matches.push({ enKey, value: enValue, strategy: "english-placeholder" });
+ }
+
+ return { matches, result };
+}
+
+// ── Main ─────────────────────────────────────────────────────────────────────
+
+function main() {
+ // Load en.json
+ const enPath = path.join(LOCALES_DIR, "en.json");
+ const en = JSON.parse(fs.readFileSync(enPath, "utf8"));
+ const enFlat = flattenKeys(en);
+ const enKeyCount = Object.keys(enFlat).length;
+ const indexes = buildIndexes(enFlat);
+
+ console.log(`English: ${enKeyCount} keys (source of truth — NOT modified)\n`);
+
+ // Find all non-English locale files
+ const localeFiles = fs
+ .readdirSync(LOCALES_DIR)
+ .filter(
+ (f: string) =>
+ f.endsWith(".json") && f !== "en.json" && f !== "migration-report.json"
+ );
+
+ if (localeFiles.length === 0) {
+ console.log("No locale files to migrate.");
+ return;
+ }
+
+ // Create backup directory
+ if (!fs.existsSync(BACKUP_DIR)) {
+ fs.mkdirSync(BACKUP_DIR, { recursive: true });
+ }
+
+ const report: Record<
+ string,
+ {
+ total: number;
+ exact: number;
+ suffix: number;
+ uniqueName: number;
+ placeholder: number;
+ }
+ > = {};
+
+ for (const file of localeFiles) {
+ const lang = file.replace(".json", "");
+ const filePath = path.join(LOCALES_DIR, file);
+
+ // Backup original
+ const backupPath = path.join(BACKUP_DIR, file);
+ fs.copyFileSync(filePath, backupPath);
+
+ // Load and flatten
+ const langData = JSON.parse(fs.readFileSync(filePath, "utf8"));
+ const langFlat = flattenKeys(langData);
+
+ // Migrate
+ const { matches, result } = buildMigratedLocale(enFlat, langFlat, indexes);
+
+ // Write migrated file
+ fs.writeFileSync(filePath, JSON.stringify(result, null, "\t") + "\n", "utf8");
+
+ // Compute stats
+ const stats = {
+ total: enKeyCount,
+ exact: matches.filter((m) => m.strategy === "exact").length,
+ suffix: matches.filter((m) => m.strategy === "suffix-2").length,
+ uniqueName: matches.filter((m) => m.strategy === "unique-name").length,
+ placeholder: matches.filter((m) => m.strategy === "english-placeholder").length,
+ };
+ report[lang] = stats;
+
+ const translated = stats.exact + stats.suffix + stats.uniqueName;
+ const pct = ((translated / enKeyCount) * 100).toFixed(1);
+ console.log(
+ `${lang.padEnd(8)} ${String(translated).padStart(4)} translated (${pct}%) | ` +
+ `exact: ${stats.exact} suffix: ${stats.suffix} name: ${stats.uniqueName} ` +
+ `placeholder: ${stats.placeholder}`
+ );
+ }
+
+ // Write report
+ fs.writeFileSync(REPORT_PATH, JSON.stringify(report, null, "\t") + "\n", "utf8");
+
+ const totalLangs = localeFiles.length;
+ console.log(
+ `\nMigrated ${totalLangs} locale files. Originals backed up to locales/backup/`
+ );
+ console.log(`Report written to ${REPORT_PATH}`);
+}
+
+main();
diff --git a/client/src/Hooks/useMonitorForm.ts b/client/src/Hooks/useMonitorForm.ts
index 963409fc8a..c4b3452ccb 100644
--- a/client/src/Hooks/useMonitorForm.ts
+++ b/client/src/Hooks/useMonitorForm.ts
@@ -12,6 +12,8 @@ const getBaseDefaults = (data?: Monitor | null) => ({
description: data?.description || "",
interval: data?.interval || 60000,
notifications: data?.notifications || [],
+ escalationNotifications: data?.escalationNotifications || [],
+ escalateAfterMinutes: data?.escalateAfterMinutes ?? 5,
statusWindowSize: data?.statusWindowSize || 5,
statusWindowThreshold: data?.statusWindowThreshold || 60,
geoCheckEnabled: data?.geoCheckEnabled ?? false,
diff --git a/client/src/Hooks/useNotificationForm.ts b/client/src/Hooks/useNotificationForm.ts
index dd882db678..c45773db74 100644
--- a/client/src/Hooks/useNotificationForm.ts
+++ b/client/src/Hooks/useNotificationForm.ts
@@ -1,28 +1,76 @@
import { useMemo } from "react";
import { notificationSchema } from "@/Validation/notifications";
+import type { NotificationFormData } from "@/Validation/notifications";
import type { Notification } from "@/Types/Notification";
interface UseNotificationFormOptions {
data?: Notification | null;
}
+function buildDefaults(data: Notification | null): NotificationFormData {
+ if (data?.type === "matrix") {
+ return {
+ type: "matrix",
+ notificationName: data.notificationName || "",
+ homeserverUrl: data.homeserverUrl || "",
+ roomId: data.roomId || "",
+ accessToken: data.accessToken || "",
+ };
+ }
+ if (data?.type === "telegram") {
+ return {
+ type: "telegram",
+ notificationName: data.notificationName || "",
+ address: data.address || "",
+ accessToken: data.accessToken || "",
+ };
+ }
+ if (data?.type === "slack") {
+ return {
+ type: "slack",
+ notificationName: data.notificationName || "",
+ address: data.address || "",
+ };
+ }
+ if (data?.type === "discord") {
+ return {
+ type: "discord",
+ notificationName: data.notificationName || "",
+ address: data.address || "",
+ };
+ }
+ if (data?.type === "webhook") {
+ return {
+ type: "webhook",
+ notificationName: data.notificationName || "",
+ address: data.address || "",
+ };
+ }
+ if (data?.type === "pager_duty") {
+ return {
+ type: "pager_duty",
+ notificationName: data.notificationName || "",
+ address: data.address || "",
+ };
+ }
+ if (data?.type === "teams") {
+ return {
+ type: "teams",
+ notificationName: data.notificationName || "",
+ address: data.address || "",
+ };
+ }
+ // Default: email (covers both data === null and data.type === "email")
+ return {
+ type: "email",
+ notificationName: data?.notificationName || "",
+ address: data?.address || "",
+ };
+}
+
export const useNotificationForm = ({ data = null }: UseNotificationFormOptions = {}) => {
return useMemo(() => {
- const defaults =
- data?.type === "matrix"
- ? {
- type: "matrix" as const,
- notificationName: data.notificationName || "",
- homeserverUrl: data.homeserverUrl || "",
- roomId: data.roomId || "",
- accessToken: data.accessToken || "",
- }
- : {
- type: (data?.type || "email") as Exclude,
- notificationName: data?.notificationName || "",
- address: data?.address || "",
- };
-
+ const defaults = buildDefaults(data);
return { schema: notificationSchema, defaults };
}, [data]);
};
diff --git a/client/src/Pages/CreateMonitor/index.tsx b/client/src/Pages/CreateMonitor/index.tsx
index 15b76eab36..83ca32372b 100644
--- a/client/src/Pages/CreateMonitor/index.tsx
+++ b/client/src/Pages/CreateMonitor/index.tsx
@@ -764,6 +764,85 @@ const CreateMonitorPage = () => {
/>
}
/>
+
+ (
+ field.onChange(Number(event.target.value))}
+ fullWidth
+ />
+ )}
+ />
+ {
+ const notificationOptions = (notifications ?? []).map((n) => ({
+ ...n,
+ name: n.notificationName,
+ }));
+ const selectedEscalationNotifications = notificationOptions.filter((n) =>
+ (field.value ?? []).includes(n.id)
+ );
+ return (
+
+ option.name}
+ onChange={(_: unknown, newValue: typeof notificationOptions) => {
+ field.onChange(newValue.map((n) => n.id));
+ }}
+ isOptionEqualToValue={(option, value) => option.id === value.id}
+ />
+ {selectedEscalationNotifications.length > 0 && (
+
+ {selectedEscalationNotifications.map((notification, index) => (
+
+
+ {notification.notificationName}
+
+ {
+ field.onChange(
+ (field.value ?? []).filter(
+ (id: string) => id !== notification.id
+ )
+ );
+ }}
+ aria-label="Remove escalation notification"
+ >
+
+
+ {index < selectedEscalationNotifications.length - 1 && }
+
+ ))}
+
+ )}
+
+ );
+ }}
+ />
+
+ }
+ />
{(watchedType === "http" ||
watchedType === "grpc" ||
diff --git a/client/src/Pages/Notifications/create/index.tsx b/client/src/Pages/Notifications/create/index.tsx
index 7aa7bc831b..85568f8bdb 100644
--- a/client/src/Pages/Notifications/create/index.tsx
+++ b/client/src/Pages/Notifications/create/index.tsx
@@ -147,7 +147,7 @@ const NotificationsCreatePage = () => {
/>
}
/>
- {watchedType !== "matrix" && (
+ {watchedType !== "matrix" && watchedType !== "telegram" && (
{
(
{
}
/>
)}
+ {watchedType === "telegram" && (
+
+ (
+
+ )}
+ />
+ (
+
+ )}
+ />
+
+ }
+ />
+ )}
{watchedType === "matrix" && (
{
(
{
(
{
(
;
diff --git a/client/src/locales/ar.json b/client/src/locales/ar.json
index 6cec253d8a..28624c469a 100644
--- a/client/src/locales/ar.json
+++ b/client/src/locales/ar.json
@@ -1,1108 +1,1305 @@
{
- "submit": "",
- "title": "",
- "distributedStatusHeaderText": "",
- "distributedStatusSubHeaderText": "",
- "settingsDisabled": "",
- "settingsSuccessSaved": "",
- "settingsFailedToSave": "",
- "settingsStatsCleared": "",
- "settingsFailedToClearStats": "",
- "settingsMonitorsDeleted": "",
- "settingsFailedToDeleteMonitors": "",
- "starPromptTitle": "",
- "starPromptDescription": "",
- "https": "",
- "http": "",
- "monitor": "",
- "aboutus": "",
- "now": "",
- "delete": "",
- "configure": "",
- "responseTime": "",
- "ms": "",
- "bar": "",
- "area": "",
- "country": "",
- "city": "",
- "response": "",
- "monitorStatusUp": "",
- "monitorStatusDown": "",
- "webhookSendSuccess": "",
- "webhookSendError": "",
- "webhookUnsupportedPlatform": "",
- "distributedRightCategoryTitle": "",
- "distributedStatusServerMonitors": "",
- "distributedStatusServerMonitorsDescription": "",
- "distributedUptimeCreateSelectURL": "",
- "distributedUptimeCreateChecks": "",
- "distributedUptimeCreateChecksDescription": "",
- "distributedUptimeCreateIncidentNotification": "",
- "distributedUptimeCreateIncidentDescription": "",
- "distributedUptimeCreateAdvancedSettings": "",
- "distributedUptimeDetailsNoMonitorHistory": "",
- "distributedUptimeDetailsStatusHeaderUptime": "",
- "distributedUptimeDetailsStatusHeaderLastUpdate": "",
- "notifications": {
- "enableNotifications": "",
- "testNotification": "",
- "addOrEditNotifications": "",
- "slack": {
- "label": "",
- "description": "",
- "webhookLabel": "",
- "webhookPlaceholder": "",
- "webhookRequired": ""
- },
- "discord": {
- "label": "",
- "description": "",
- "webhookLabel": "",
- "webhookPlaceholder": "",
- "webhookRequired": ""
+ "common": {
+ "auth": {
+ "roles": {
+ "admin": "مسؤول",
+ "demo": "عرض توضيحي",
+ "superadmin": "مسؤول أعلى",
+ "user": "مستخدم"
+ }
},
- "telegram": {
- "label": "",
- "description": "",
- "tokenLabel": "",
- "tokenPlaceholder": "",
- "chatIdLabel": "",
- "chatIdPlaceholder": "",
- "fieldsRequired": ""
+ "alerts": {
+ "pageSpeedApiKey": {
+ "content": "تحذير: لم تقم بإضافة مفتاح Google PageSpeed API بعد. قم بزيارة الإعدادات لإضافته. بدونه، لن تعمل مراقبة PageSpeed."
+ }
},
- "webhook": {
- "label": "",
- "description": "",
- "urlLabel": "",
- "urlPlaceholder": "",
- "urlRequired": ""
+ "appName": "",
+ "breadcrumbs": {
+ "details": "التفاصيل",
+ "home": "الرئيسية"
},
- "testNotificationDevelop": "",
- "integrationButton": "",
- "testSuccess": "",
- "testFailed": "",
- "unsupportedType": "",
- "networkError": "",
- "fallback": {
- "title": "",
- "checks": [""],
- "actionButton": ""
+ "buttons": {
+ "addMember": "إضافة عضو",
+ "cancel": "إلغاء",
+ "close": "إغلاق",
+ "configure": "تهيئة",
+ "confirm": "تأكيد",
+ "create": "إنشاء",
+ "delete": "حذف",
+ "generateToken": "إنشاء رمز",
+ "incidents": "الحوادث",
+ "inviteMember": "دعوة عضو",
+ "pause": "إيقاف مؤقت",
+ "resume": "استئناف",
+ "save": "حفظ",
+ "sendInvite": "إرسال دعوة",
+ "test": "اختبار",
+ "testNotifications": "اختبار الإشعارات",
+ "toggleTheme": "",
+ "flushQueue": "تفريغ قائمة الانتظار",
+ "notFound": "الانتقال إلى لوحة التحكم الرئيسية",
+ "resetPassword": "",
+ "reset": "",
+ "clear": "مسح",
+ "addDemo": "إضافة مراقبات تجريبية",
+ "removeMonitors": "إزالة المراقبات",
+ "sendTestEmail": "إرسال بريد تجريبي",
+ "exportToJSON": "تصدير إلى JSON",
+ "importFromJSON": "استيراد من JSON",
+ "clearFilters": "مسح المرشحات",
+ "removeUser": "إزالة المستخدم"
},
- "createButton": "",
- "createTitle": "",
- "create": {
- "success": "",
- "failed": ""
+ "charts": {
+ "labels": {
+ "averageResponseTime": "متوسط وقت الاستجابة",
+ "downtime": "وقت التوقف",
+ "high": "",
+ "low": "",
+ "uptime": "وقت التشغيل"
+ },
+ "histogram": {
+ "avg": "المتوسط: {{value}} مللي ثانية",
+ "max": "الحد الأقصى: {{value}} مللي ثانية"
+ }
},
- "fetch": {
- "success": "",
- "failed": ""
+ "dialogs": {
+ "delete": {
+ "description": "لا يمكن التراجع عن هذا الإجراء.",
+ "title": "هل أنت متأكد أنك تريد حذف هذا؟"
+ }
},
- "delete": {
- "success": "",
- "failed": ""
+ "labels": {
+ "active": "نشط",
+ "paused": "متوقف مؤقتاً",
+ "na": "غير متوفر",
+ "resolved": "تم الحل",
+ "responseTime": "وقت الاستجابة"
},
- "edit": {
- "success": "",
- "failed": ""
+ "form": {
+ "role": {
+ "option": {
+ "role": {
+ "label": "الأدوار"
+ }
+ }
+ },
+ "name": {
+ "option": {
+ "firstName": {
+ "label": "",
+ "placeholder": ""
+ },
+ "lastName": {
+ "label": "",
+ "placeholder": ""
+ }
+ }
+ },
+ "email": {
+ "option": {
+ "email": {
+ "label": "البريد الإلكتروني",
+ "placeholder": "you@example.com"
+ }
+ }
+ }
},
- "test": {
- "success": "",
- "failed": ""
+ "table": {
+ "empty": "لا يوجد شيء هنا",
+ "headers": {
+ "actions": "",
+ "dateTime": "التاريخ والوقت",
+ "message": "الرسالة",
+ "monitor": "المراقب",
+ "monitorId": "معرّف المراقب",
+ "name": "الاسم",
+ "status": "الحالة",
+ "type": "",
+ "url": "الرابط",
+ "interval": "الفاصل الزمني",
+ "active": "نشط",
+ "responseTime": "وقت الاستجابة"
+ }
}
},
- "testLocale": "",
- "add": "",
- "monitors": "",
- "distributedUptimeStatusCreateStatusPage": "",
- "distributedUptimeStatusCreateStatusPageAccess": "",
- "distributedUptimeStatusCreateStatusPageReady": "",
- "distributedUptimeStatusBasicInfoHeader": "",
- "distributedUptimeStatusBasicInfoDescription": "",
- "distributedUptimeStatusLogoHeader": "",
- "distributedUptimeStatusLogoDescription": "",
- "distributedUptimeStatusLogoUploadButton": "",
- "distributedUptimeStatusStandardMonitorsHeader": "",
- "distributedUptimeStatusStandardMonitorsDescription": "",
- "distributedUptimeStatusCreateYour": "",
- "distributedUptimeStatusEditYour": "",
- "distributedUptimeStatusPublishedLabel": "",
- "distributedUptimeStatusCompanyNameLabel": "",
- "distributedUptimeStatusPageAddressLabel": "",
- "distributedUptimeStatus30Days": "",
- "distributedUptimeStatus60Days": "",
- "distributedUptimeStatus90Days": "",
- "distributedUptimeStatusPageNotSetUp": "",
- "distributedUptimeStatusContactAdmin": "",
- "distributedUptimeStatusPageNotPublic": "",
- "distributedUptimeStatusPageDeleteDialog": "",
- "distributedUptimeStatusPageDeleteConfirm": "",
- "distributedUptimeStatusPageDeleteDescription": "",
- "distributedUptimeStatusDevices": "",
- "distributedUptimeStatusUpt": "",
- "distributedUptimeStatusUptBurned": "",
- "distributedUptimeStatusUptLogo": "",
- "incidentsTableNoIncidents": "",
- "incidentsTablePaginationLabel": "",
- "incidentsTableMonitorName": "",
- "incidentsTableStatus": "",
- "incidentsTableDateTime": "",
- "incidentsTableStatusCode": "",
- "incidentsTableMessage": "",
- "incidentsOptionsHeader": "",
- "incidentsOptionsHeaderFilterBy": "",
- "incidentsOptionsHeaderFilterAll": "",
- "incidentsOptionsHeaderFilterDown": "",
- "incidentsOptionsHeaderFilterCannotResolve": "",
- "incidentsOptionsHeaderShow": "",
- "incidentsOptionsHeaderLastHour": "",
- "incidentsOptionsHeaderLastDay": "",
- "incidentsOptionsHeaderLastWeek": "",
- "incidentsOptionsPlaceholderAllServers": "",
- "infrastructureCreateYour": "",
- "infrastructureCreateGeneralSettingsDescription": "",
- "infrastructureServerRequirement": "",
- "infrastructureCustomizeAlerts": "",
- "infrastructureAlertNotificationDescription": "",
- "infrastructureCreateMonitor": "",
- "infrastructureProtocol": "",
- "infrastructureServerUrlLabel": "",
- "infrastructureDisplayNameLabel": "",
- "infrastructureAuthorizationSecretLabel": "",
- "gb": "",
- "mb": "",
- "mem": "",
- "memoryUsage": "",
- "cpu": "",
- "cpuUsage": "",
- "cpuTemperature": "",
- "diskUsage": "",
- "used": "",
- "total": "",
- "cores": "",
- "frequency": "",
- "status": "",
- "cpuPhysical": "",
- "cpuLogical": "",
- "cpuFrequency": "",
- "avgCpuTemperature": "",
- "memory": "",
- "disk": "",
- "uptime": "",
- "os": "",
- "host": "",
- "actions": "",
- "integrations": "",
- "integrationsPrism": "",
- "integrationsSlack": "",
- "integrationsSlackInfo": "",
- "integrationsDiscord": "",
- "integrationsDiscordInfo": "",
- "integrationsZapier": "",
- "integrationsZapierInfo": "",
- "commonSave": "",
- "createYour": "",
- "createMonitor": "",
- "pause": "",
- "resume": "",
- "editing": "",
- "url": "",
- "access": "",
- "timezone": "",
- "features": "",
- "administrator": "",
- "loginHere": "",
- "displayName": "",
- "urlMonitor": "",
- "portToMonitor": "",
- "websiteMonitoring": "",
- "websiteMonitoringDescription": "",
- "pingMonitoring": "",
- "pingMonitoringDescription": "",
- "dockerContainerMonitoring": "",
- "dockerContainerMonitoringDescription": "",
- "portMonitoring": "",
- "portMonitoringDescription": "",
- "createMaintenanceWindow": "",
- "createMaintenance": "",
- "editMaintenance": "",
- "maintenanceWindowName": "",
- "friendlyNameInput": "",
- "friendlyNamePlaceholder": "",
- "maintenanceRepeat": "",
- "maintenance": "",
- "duration": "",
- "addMonitors": "",
- "window": "",
- "cancel": "",
- "message": "",
- "low": "",
- "high": "",
- "statusCode": "",
- "date&Time": "",
- "type": "",
- "statusPageName": "",
- "publicURL": "",
- "repeat": "",
- "edit": "",
- "createA": "",
- "remove": "",
- "maintenanceWindowDescription": "",
- "startTime": "",
- "timeZoneInfo": "",
- "monitorsToApply": "",
- "nextWindow": "",
- "notFoundButton": "",
- "pageSpeedConfigureSettingsDescription": "",
- "monitorDisplayName": "",
- "whenNewIncident": "",
- "notifySMS": "",
- "notifyEmails": "",
- "seperateEmails": "",
- "checkFrequency": "",
- "matchMethod": "",
- "expectedValue": "",
- "deleteDialogTitle": "",
- "deleteDialogDescription": "",
- "pageSpeedMonitor": "",
- "shown": "",
- "ago": "",
- "companyName": "",
- "pageSpeedDetailsPerformanceReport": "",
- "pageSpeedDetailsPerformanceReportCalculator": "",
- "checkingEvery": "",
- "statusPageCreateSettings": "",
- "basicInformation": "",
- "statusPageCreateBasicInfoDescription": "",
- "statusPageCreateSelectTimeZoneDescription": "",
- "statusPageCreateAppearanceDescription": "",
- "statusPageCreateSettingsCheckboxLabel": "",
- "statusPageCreateBasicInfoStatusPageAddress": "",
- "statusPageCreateTabsContent": "",
- "statusPageCreateTabsContentDescription": "",
- "statusPageCreateTabsContentFeaturesDescription": "",
- "showCharts": "",
- "showUptimePercentage": "",
- "removeLogo": "",
- "statusPageStatus": "",
- "statusPageStatusContactAdmin": "",
- "statusPageStatusNotPublic": "",
- "statusPageStatusNoPage": "",
- "statusPageStatusServiceStatus": "",
- "deleteStatusPage": "",
- "deleteStatusPageConfirm": "",
- "deleteStatusPageDescription": "",
- "uptimeCreate": "",
- "uptimeCreateJsonPath": "",
- "uptimeCreateJsonPathQuery": "",
- "maintenanceTableActionMenuDialogTitle": "",
- "infrastructureEditYour": "",
- "infrastructureEditMonitor": "",
- "infrastructureMonitorCreated": "",
- "infrastructureMonitorUpdated": "",
- "errorInvalidTypeId": "",
- "errorInvalidFieldId": "",
- "inviteNoTokenFound": "",
- "pageSpeedWarning": "",
- "pageSpeedLearnMoreLink": "",
- "pageSpeedAddApiKey": "",
- "update": "",
- "invalidFileFormat": "",
- "invalidFileSize": "",
- "ClickUpload": "",
- "DragandDrop": "",
- "MaxSize": "",
- "SupportedFormats": "",
- "FirstName": "",
- "LastName": "",
- "EmailDescriptionText": "",
- "YourPhoto": "",
- "PhotoDescriptionText": "",
- "save": "",
- "DeleteDescriptionText": "",
- "DeleteAccountWarning": "",
- "DeleteWarningTitle": "",
- "bulkImport": {
- "title": "",
- "selectFileTips": "",
- "selectFileDescription": "",
- "selectFile": "",
- "parsingFailed": "",
- "uploadSuccess": "",
- "validationFailed": "",
- "noFileSelected": "",
- "fallbackPage": "",
- "invalidFileType": "",
- "uploadFailed": ""
- },
- "DeleteAccountTitle": "",
- "DeleteAccountButton": "",
- "publicLink": "",
- "maskedPageSpeedKeyPlaceholder": "",
- "reset": "",
- "ignoreTLSError": "",
- "tlsErrorIgnored": "",
- "ignoreTLSErrorDescription": "",
- "createNew": "",
- "greeting": {
- "prepend": "",
- "append": "",
- "overview": ""
- },
- "roles": {
- "superAdmin": "",
- "admin": "",
- "teamMember": "",
- "demoUser": ""
- },
- "teamPanel": {
- "teamMembers": "",
- "filter": {
- "all": "",
- "member": ""
+ "components": {
+ "imageUpload": {
+ "clickToUpload": "انقر للرفع",
+ "dragAndDrop": "",
+ "supportedFormats": "",
+ "maxSize": "",
+ "orDragAndDrop": "أو اسحب وأفلت",
+ "errors": {
+ "invalidFileSize": "",
+ "invalidFileFormat": ""
+ }
},
- "inviteTeamMember": "",
- "inviteNewTeamMember": "",
- "inviteDescription": "",
- "email": "",
- "selectRole": "",
- "inviteLink": "",
- "cancel": "",
- "noMembers": "",
- "getToken": "",
- "emailToken": "",
- "table": {
- "name": "",
- "email": "",
- "role": "",
- "created": ""
+ "headerStatusPageControls": {
+ "publicLink": ""
},
- "addTeamMember": {
- "addMemberMenu": "",
- "title": "",
- "description": "",
- "addButton": ""
+ "headerTimeRange": {
+ "labels": {
+ "day": "يوم",
+ "month": "شهر",
+ "recent": "الأخيرة",
+ "week": "أسبوع"
+ },
+ "description": {
+ "recent": "عرض الإحصائيات لآخر ساعتين.",
+ "day": "عرض الإحصائيات لآخر 24 ساعة.",
+ "week": "عرض الإحصائيات لآخر 7 أيام.",
+ "month": "عرض الإحصائيات لآخر 30 يوماً."
+ }
},
- "register": "",
- "registerToast": {
- "success": "",
- "dbUserExists": "",
- "unknownError": ""
+ "offlineBanner": {
+ "serverUnreachable": "تعذر الوصول إلى الخادم",
+ "retry": "إعادة المحاولة",
+ "retrying": "جارٍ إعادة المحاولة...",
+ "reconnected": ""
},
- "registerTeamMember": {
- "title": "",
- "auth": {
- "common": {
- "inputs": {
- "firstName": {
- "errors": {
- "empty": "",
- "pattern": ""
- }
- },
- "lastName": {
- "errors": {
- "empty": "",
- "pattern": ""
- }
+ "sidebar": {
+ "menu": {
+ "uptime": "",
+ "pagespeed": "",
+ "infrastructure": "",
+ "notifications": "",
+ "checks": "الفحوصات",
+ "incidents": "",
+ "statusPages": "",
+ "maintenance": "",
+ "logs": "",
+ "settings": ""
+ },
+ "bottomMenu": {
+ "support": "",
+ "discussions": "",
+ "docs": "",
+ "changelog": ""
+ },
+ "accountMenu": {
+ "profile": "الملف الشخصي",
+ "password": "كلمة المرور",
+ "team": "الفريق"
+ },
+ "starPrompt": {
+ "title": "أضف نجمة لـ Checkmate",
+ "description": "اطلع على أحدث الإصدارات وساعد في تنمية المجتمع على GitHub"
+ },
+ "authFooter": {
+ "navControls": "",
+ "logOut": "",
+ "roles": {
+ "superAdmin": "مسؤول أعلى",
+ "admin": "مسؤول",
+ "user": "مستخدم",
+ "demoUser": ""
+ }
+ }
+ },
+ "starPrompt": {
+ "title": "أضف نجمة لـ Checkmate",
+ "description": "اطلع على أحدث الإصدارات وساعد في تنمية المجتمع على GitHub"
+ }
+ },
+ "pages": {
+ "notFound": {
+ "title": "يا إلهي! لقد أسقطت السوشي!",
+ "subtitle": "إما أن الرابط غير موجود، أو ليس لديك صلاحية الوصول إليه."
+ },
+ "account": {
+ "tabs": {
+ "profile": "الملف الشخصي",
+ "password": "كلمة المرور",
+ "team": "الفريق"
+ },
+ "form": {
+ "name": {
+ "title": "الاسم",
+ "description": "تحديث معلوماتك الشخصية"
+ },
+ "photo": {
+ "title": "صورة الملف الشخصي",
+ "description": "رفع صورة للملف الشخصي"
+ },
+ "currentPassword": {
+ "title": "كلمة المرور الحالية",
+ "description": "أدخل كلمة المرور الحالية للتحقق من هويتك",
+ "option": {
+ "label": "كلمة المرور الحالية",
+ "placeholder": "أدخل كلمة المرور الحالية"
+ }
+ },
+ "newPassword": {
+ "title": "كلمة مرور جديدة",
+ "description": "اختر كلمة مرور قوية مكونة من 8 أحرف على الأقل",
+ "option": {
+ "newPassword": {
+ "label": "كلمة مرور جديدة",
+ "placeholder": "أدخل كلمة المرور الجديدة"
},
+ "confirm": {
+ "label": "تأكيد كلمة المرور",
+ "placeholder": "تأكيد كلمة المرور الجديدة"
+ }
+ }
+ },
+ "deleteAccount": {
+ "title": "حذف الحساب",
+ "description": "هذا الإجراء دائم ولا يمكن التراجع عنه"
+ }
+ },
+ "team": {
+ "filter": {
+ "placeholder": "تصفية حسب الدور",
+ "all": "",
+ "admin": "مسؤول",
+ "member": ""
+ },
+ "table": {
+ "headers": {
+ "email": "البريد الإلكتروني",
+ "role": "الدور",
+ "created": ""
+ }
+ },
+ "addMember": {
+ "title": "تسجيل عضو فريق جديد",
+ "description": "إنشاء حساب مستخدم جديد. شارك بيانات الاعتماد بشكل آمن بعد الإنشاء."
+ },
+ "invite": {
+ "title": "دعوة عضو فريق",
+ "description": "إرسال دعوة للانضمام إلى فريقك",
+ "email": {
+ "label": "عنوان البريد الإلكتروني",
+ "placeholder": "أدخل عنوان البريد الإلكتروني"
+ },
+ "role": {
+ "label": "الدور",
+ "placeholder": "اختر دوراً"
+ },
+ "linkLabel": "رابط الدعوة"
+ }
+ }
+ },
+ "auth": {
+ "common": {
+ "passwordRules": {
+ "length": {
+ "beginning": "",
+ "highlighted": ""
+ },
+ "lowercase": {
+ "beginning": "",
+ "highlighted": ""
+ },
+ "match": {
+ "beginning": "",
+ "highlighted": ""
+ },
+ "number": {
+ "beginning": "",
+ "highlighted": ""
+ },
+ "special": {
+ "beginning": "",
+ "highlighted": ""
+ },
+ "uppercase": {
+ "beginning": "",
+ "highlighted": ""
+ }
+ },
+ "form": {
+ "option": {
"email": {
- "errors": {
- "empty": "",
- "invalid": ""
- }
+ "label": "البريد الإلكتروني",
+ "placeholder": "me@example.com"
},
- "role": {
- "errors": {
- "empty": ""
- }
+ "password": {
+ "label": "كلمة المرور",
+ "placeholder": "********"
+ },
+ "confirmPassword": {
+ "label": "تأكيد كلمة المرور"
}
}
}
+ },
+ "login": {
+ "title": "مرحباً بعودتك إلى Checkmate!",
+ "subtitle": "سجّل الدخول للمتابعة",
+ "submit": "تسجيل الدخول",
+ "links": {
+ "forgotPassword": {
+ "text": "نسيت كلمة المرور؟",
+ "linkText": "إعادة تعيين كلمة المرور"
+ },
+ "register": {
+ "text": "ليس لديك حساب؟",
+ "linkText": "سجّل هنا"
+ }
+ }
+ },
+ "register": {
+ "title": "مرحباً بعودتك إلى Checkmate!",
+ "subtitle": "سجّل للبدء",
+ "submit": "تسجيل"
+ },
+ "forgotPassword": {
+ "title": "نسيت كلمة المرور؟",
+ "subtitle": "لا تقلق، سنرسل لك تعليمات إعادة التعيين.",
+ "submit": "طلب استرداد",
+ "links": {
+ "login": {
+ "text": "العودة إلى",
+ "linkText": "تسجيل الدخول"
+ }
+ }
+ },
+ "setNewPassword": {
+ "title": "إعادة تعيين كلمة المرور",
+ "subtitle": "يجب أن تكون كلمة المرور الجديدة مختلفة عن كلمات المرور المستخدمة سابقاً."
}
},
- "role": "",
- "changeTeamPassword": {
- "changePasswordMenu": "",
- "title": "",
- "description": "",
- "success": ""
- }
- },
- "monitorState": {
- "paused": "",
- "resumed": "",
- "active": ""
- },
- "menu": {
- "uptime": "",
- "pagespeed": "",
- "infrastructure": "",
- "incidents": "",
- "statusPages": "",
- "maintenance": "",
- "integrations": "",
- "settings": "",
- "support": "",
- "discussions": "",
- "docs": "",
- "changelog": "",
- "profile": "",
- "password": "",
- "team": "",
- "logOut": "",
- "notifications": "",
- "logs": ""
- },
- "settingsEmailUser": "",
- "state": "",
- "statusBreadCrumbsStatusPages": "",
- "statusBreadCrumbsDetails": "",
- "commonSaving": "",
- "navControls": "",
- "incidentsPageTitle": "",
- "passwordPanel": {
- "passwordChangedSuccess": "",
- "passwordInputIncorrect": "",
- "currentPassword": "",
- "enterCurrentPassword": "",
- "newPassword": "",
- "enterNewPassword": "",
- "confirmNewPassword": "",
- "passwordRequirements": "",
- "saving": ""
- },
- "emailSent": "",
- "failedToSendEmail": "",
- "settingsTestEmailSuccess": "",
- "settingsTestEmailFailed": "",
- "settingsTestEmailFailedWithReason": "",
- "settingsTestEmailUnknownError": "",
- "statusMsg": {
- "paused": "",
- "up": "",
- "down": "",
- "pending": ""
- },
- "uptimeGeneralInstructions": {
- "http": "",
- "ping": "",
- "docker": "",
- "port": "",
- "game": "",
- "https": ""
- },
- "common": {
- "appName": "",
- "monitoringAgentName": "",
- "buttons": {
- "toggleTheme": ""
+ "checks": {
+ "selects": {
+ "monitor": {
+ "all": "جميع المراقبات"
+ },
+ "status": {
+ "all": "الكل",
+ "down": "متوقف",
+ "up": "يعمل"
+ }
+ },
+ "table": {
+ "empty": "لا توجد فحوصات متوقفة في هذا النطاق الزمني",
+ "headers": {
+ "statusCode": "رمز الحالة",
+ "location": "الموقع"
+ }
+ }
},
- "toasts": {
- "networkError": "",
- "checkConnection": "",
- "unknownError": ""
- }
- },
- "auth": {
"common": {
- "navigation": {
- "continue": "",
- "back": ""
- },
- "inputs": {
- "email": {
- "label": "",
- "placeholder": "",
- "errors": {
- "empty": "",
- "invalid": ""
- }
+ "monitors": {
+ "actions": {
+ "configure": "تهيئة",
+ "delete": "حذف",
+ "generateToken": "إنشاء رمز",
+ "details": "التفاصيل",
+ "incidents": "الحوادث",
+ "inviteMember": "دعوة عضو",
+ "openSite": "فتح الموقع",
+ "pause": "إيقاف مؤقت",
+ "resume": "استئناف"
},
- "password": {
- "label": "",
- "rules": {
- "length": {
- "beginning": "",
- "highlighted": ""
+ "statBoxes": {
+ "activeFor": "نشط منذ",
+ "certificateExpiry": "انتهاء الشهادة",
+ "lastCheck": "آخر فحص",
+ "lastResponseTime": "آخر وقت استجابة"
+ },
+ "status": {
+ "down": "متوقف",
+ "breached": "تم تجاوز الحد",
+ "initializing": "جارٍ التهيئة",
+ "maintenance": "صيانة",
+ "paused": "متوقف مؤقتاً",
+ "total": "الإجمالي",
+ "up": "يعمل"
+ },
+ "monitorTypes": {
+ "optionDocker": "Docker",
+ "optionGame": "ألعاب",
+ "optionHttp": "HTTP(S)",
+ "optionPing": "Ping",
+ "optionPort": "منفذ",
+ "optionPagespeed": "PageSpeed",
+ "optionHardware": "البنية التحتية",
+ "optionGrpc": "gRPC",
+ "optionWebSocket": "WebSocket"
+ }
+ }
+ },
+ "createMonitor": {
+ "form": {
+ "advanced": {
+ "description": "إعدادات اختيارية لحالات الاستخدام المتقدمة",
+ "option": {
+ "advancedMatching": {
+ "label": "استخدام المطابقة المتقدمة"
},
- "special": {
- "beginning": "",
- "highlighted": ""
+ "expectedValue": {
+ "label": "القيمة المتوقعة"
},
- "number": {
- "beginning": "",
- "highlighted": ""
+ "jsonPath": {
+ "description": "سيتم تقييم هذا التعبير مقابل بيانات JSON للاستجابة وسيتم استخدام النتيجة للمطابقة مع القيمة المتوقعة. راجع jmespath.org لتوثيق لغة الاستعلام.",
+ "label": "تعبير JSONPath"
},
- "uppercase": {
- "beginning": "",
- "highlighted": ""
+ "matchMethod": {
+ "label": "طريقة المطابقة",
+ "equal": "",
+ "include": "",
+ "regex": ""
+ }
+ },
+ "title": "إعدادات متقدمة"
+ },
+ "frequency": {
+ "description": "كم مرة تريد التحقق من حالة هذا المراقب؟",
+ "option": {
+ "frequency": {
+ "label": "تكرار الفحص",
+ "value": {
+ "fifteenMinutes": "15 دقيقة",
+ "fifteenSeconds": "",
+ "fiveMinutes": "5 دقائق",
+ "fourMinutes": "",
+ "oneMinute": "",
+ "tenMinutes": "10 دقائق",
+ "thirtyMinutes": "30 دقيقة",
+ "thirtySeconds": "",
+ "threeMinutes": "",
+ "twoMinutes": ""
+ }
+ }
+ },
+ "title": "تكرار الفحص"
+ },
+ "general": {
+ "option": {
+ "container": {
+ "label": "اسم/معرّف الحاوية",
+ "placeholder": "my-app أو abcd1234"
+ },
+ "host": {
+ "label": "المضيف",
+ "placeholder": "192.168.1.100 أو example.com"
+ },
+ "name": {
+ "label": "اسم العرض",
+ "placeholder": "مثال: موقعي الإلكتروني"
+ },
+ "secret": {
+ "label": "مفتاح التفويض",
+ "placeholder": "أدخل مفتاحك السري"
+ },
+ "url": {
+ "label": "URL",
+ "placeholder": "https://www.google.com"
+ },
+ "game": {
+ "label": "",
+ "placeholder": ""
},
- "lowercase": {
- "beginning": "",
- "highlighted": ""
+ "port": {
+ "label": "المنفذ المراد مراقبته",
+ "placeholder": "80"
},
- "match": {
- "beginning": "",
- "highlighted": ""
+ "grpcServiceName": {
+ "label": "اسم الخدمة",
+ "placeholder": "مثال: my.service.v1 (اتركه فارغاً للفحص العام)"
+ },
+ "wsUrl": {
+ "label": "رابط WebSocket",
+ "placeholder": "wss://example.com/socket"
}
},
- "errors": {
- "empty": "",
- "length": "",
- "uppercase": "",
- "lowercase": "",
- "number": "",
- "special": "",
- "incorrect": ""
+ "title": "الإعدادات العامة",
+ "description": {
+ "http": "أدخل الرابط أو عنوان IP للمراقبة (مثال: https://example.com/ أو 192.168.1.100) وأضف اسم عرض واضح يظهر في لوحة التحكم.",
+ "ping": "",
+ "port": "",
+ "docker": "",
+ "game": "",
+ "pagespeed": "تتبع أداء تحميل الصفحة ومؤشرات Core Web Vitals ودرجات التحسين لموقعك.",
+ "grpc": "أدخل اسم المضيف ومنفذ خادم gRPC، وحدد اختيارياً اسم خدمة لفحص الصحة، وأضف اسم عرض.",
+ "websocket": "أدخل رابط WebSocket للمراقبة (مثال: wss://example.com/socket) وأضف اسم عرض.",
+ "hardware": "مراقبة استخدام CPU والذاكرة والقرص ودرجة الحرارة للبنية التحتية الخاصة بك."
}
},
- "passwordConfirm": {
- "label": "",
- "placeholder": "",
- "errors": {
- "empty": "",
- "different": ""
- }
+ "ignoreTls": {
+ "description": "تهيئة التحقق من شهادة TLS/SSL لاتصالات HTTPS.",
+ "option": {
+ "tls": {
+ "label": "تجاهل أخطاء TLS/SSL"
+ }
+ },
+ "title": "إعدادات TLS/SSL"
+ },
+ "incidents": {
+ "description": "يتم استخدام نافذة منزلقة لتحديد متى يتوقف المراقب. ستتغير حالة المراقب فقط عندما تستوفي نسبة الفحوصات في النافذة المنزلقة القيمة المحددة.",
+ "option": {
+ "checks": {
+ "label": "عدد الفحوصات في النافذة المنزلقة"
+ },
+ "percentage": {
+ "label": "ما نسبة الفحوصات في النافذة المنزلقة التي يجب أن تفشل/تنجح قبل تغيير حالة المراقب؟"
+ }
+ },
+ "title": "الحوادث"
},
- "firstName": {
- "label": "",
- "placeholder": "",
- "errors": {
- "empty": "",
- "length": "",
- "pattern": ""
+ "notifications": {
+ "description": "اختر قنوات الإشعارات التي تريد استخدامها",
+ "title": "الإشعارات"
+ },
+ "type": {
+ "description": "اختر نوع الفحص المراد تنفيذه",
+ "optionDockerDescription": "استخدم Docker لمراقبة ما إذا كانت الحاوية تعمل.",
+ "optionGameDescription": "مراقبة ما إذا كان خادم لعبة معين متصلاً.",
+ "optionGrpcDescription": "مراقبة خدمات gRPC باستخدام بروتوكول فحص الصحة القياسي.",
+ "optionWebSocketDescription": "مراقبة نقاط نهاية WebSocket لصحة الاتصال ووقت الاستجابة.",
+ "optionHttpDescription": "استخدم HTTP(S) لمراقبة موقعك الإلكتروني أو نقطة نهاية API.",
+ "optionPingDescription": "استخدم ICMP Ping لمراقبة ما إذا كان الخادم متصلاً.",
+ "optionPortDescription": "مراقبة ما إذا كان منفذ معين على الخادم مفتوحاً.",
+ "title": "النوع"
+ },
+ "thresholds": {
+ "title": "حدود التنبيه",
+ "description": "حدد الحدود التي يجب عندها تشغيل التنبيهات لمراقب الأجهزة هذا.",
+ "option": {
+ "cpuThreshold": {
+ "label": "حد تنبيه CPU (%)"
+ },
+ "memoryThreshold": {
+ "label": "حد تنبيه الذاكرة (%)"
+ },
+ "diskThreshold": {
+ "label": "حد تنبيه القرص (%)"
+ },
+ "tempThreshold": {
+ "label": "حد تنبيه الحرارة (°C)"
+ }
}
},
- "lastName": {
- "label": "",
- "placeholder": "",
- "errors": {
- "empty": "",
- "length": "",
- "pattern": ""
+ "geoChecks": {
+ "title": "فحوصات موزعة جغرافياً",
+ "description": "تشغيل فحوصات من مواقع جغرافية متعددة لمراقبة التوفر والأداء العالمي.",
+ "option": {
+ "enabled": {
+ "label": "تفعيل الفحوصات الموزعة جغرافياً"
+ },
+ "locations": {
+ "label": "المواقع",
+ "placeholder": "اختر المواقع",
+ "options": {
+ "EU": "أوروبا",
+ "NA": "أمريكا الشمالية",
+ "AS": "آسيا",
+ "SA": "أمريكا الجنوبية",
+ "AF": "أفريقيا",
+ "OC": "أوقيانوسيا"
+ }
+ },
+ "interval": {
+ "label": "فاصل الفحص",
+ "value": {
+ "fiveMinutes": "5 دقائق",
+ "tenMinutes": "10 دقائق",
+ "fifteenMinutes": "15 دقيقة",
+ "thirtyMinutes": "30 دقيقة"
+ }
+ }
}
- }
- },
- "errors": {
- "validation": ""
- },
- "fields": {
- "password": {
- "errors": {
- "incorrect": ""
+ },
+ "url": {
+ "title": "عرض IP/URL للمراقب في صفحة الحالة",
+ "description": "عرض عنوان IP أو رابط المراقب في صفحة الحالة العامة. إذا تم تعطيله، سيظهر فقط اسم المراقب لحماية المعلومات الحساسة.",
+ "option": {
+ "showURL": {
+ "label": "عرض IP/URL في صفحة الحالة",
+ "enabled": "مفعّل",
+ "disabled": "معطّل"
+ }
}
},
- "role": {
- "errors": {
- "min": ""
+ "stats": {
+ "title": "سجل المراقبة",
+ "description": "مسح جميع سجلات وإحصائيات المراقبة لفريقك. هذا الإجراء لا يمكن التراجع عنه.",
+ "buttonText": "مسح جميع الإحصائيات",
+ "dialog": {
+ "title": "مسح جميع سجلات المراقبة؟",
+ "description": "سيتم حذف جميع سجلات المراقبة والإحصائيات وبيانات الفحص لفريقك نهائياً. لا يمكن التراجع عن هذا الإجراء.",
+ "confirm": "نعم، مسح جميع الإحصائيات"
}
}
}
},
- "login": {
- "heading": "",
- "subheadings": {
- "stepOne": "",
- "stepTwo": ""
+ "editUser": {
+ "form": {
+ "roles": {
+ "title": "الأدوار",
+ "description": "تعيين أدوار للمستخدم. يمكن اختيار أدوار متعددة."
+ }
},
- "links": {
- "forgotPassword": "",
- "register": "",
- "forgotPasswordLink": "",
- "registerLink": ""
+ "dialog": {
+ "removeUser": {
+ "title": "إزالة المستخدم",
+ "content": "هل أنت متأكد أنك تريد إزالة {{name}} من فريقك؟ لا يمكن التراجع عن هذا الإجراء."
+ }
+ }
+ },
+ "incidents": {
+ "dialog": {
+ "resolveIncident": {
+ "title": "حل الحادثة",
+ "option": {
+ "comment": {
+ "label": "تعليق (اختياري)",
+ "placeholder": "أضف تعليقاً حول الحل..."
+ }
+ }
+ },
+ "details": {
+ "analysis": "تحليل الحادثة",
+ "comment": "تعليق:",
+ "detailsLabel": "التفاصيل",
+ "downtime": "وقت التوقف:",
+ "message": "الرسالة:",
+ "monitor": "المراقب:",
+ "overview": "نظرة عامة",
+ "resolutionDetails": "تفاصيل الحل",
+ "resolutionType": "النوع:",
+ "resolutionTypes": {
+ "automatic": "تلقائي",
+ "manual": "يدوي"
+ },
+ "resolve": "حل الحادثة",
+ "resolvedAt": "تم الحل في:",
+ "resolvedBy": "تم الحل بواسطة:",
+ "startedAt": "بدأت في:",
+ "status": "الحالة:",
+ "statusCode": "رمز الحالة:",
+ "timeline": "الجدول الزمني",
+ "title": "تفاصيل الحادثة",
+ "url": "URL:"
+ }
},
- "toasts": {
- "success": "",
- "incorrectPassword": ""
+ "filters": {
+ "allMonitors": "جميع المراقبات",
+ "monitor": "المراقب",
+ "resolutionType": "نوع الحل",
+ "resolutionTypes": {
+ "manual": "يدوي",
+ "automatic": "تلقائي",
+ "all": "الكل"
+ }
},
- "errors": {
- "password": {
- "incorrect": ""
+ "summaryCard": {
+ "activeIncidents": {
+ "title": "الحوادث النشطة",
+ "active_zero": "لا توجد حوادث نشطة",
+ "active_one": "{{count}} حادثة نشطة",
+ "active_other": "{{count}} حوادث نشطة"
+ },
+ "incidentStats": {
+ "avgResolutionTime": "متوسط وقت الحل",
+ "mostAffectedMonitor": "المراقب الأكثر تأثراً",
+ "title": "إحصائيات الحوادث",
+ "totalIncidents": "إجمالي الحوادث"
+ },
+ "latestIncidents": {
+ "title": "أحدث الحوادث"
}
},
- "welcome": ""
+ "table": {
+ "actions": {
+ "details": "التفاصيل",
+ "goToMonitor": "الانتقال إلى المراقب",
+ "resolveManually": "حل يدوياً"
+ },
+ "activeIncidents": "الحوادث النشطة",
+ "headers": {
+ "endTime": "وقت الانتهاء",
+ "resolutionType": "نوع الحل",
+ "startTime": "",
+ "statusCode": "رمز الحالة"
+ },
+ "resolvedIncidents": "الحوادث المحلولة",
+ "status": {
+ "active": "نشط",
+ "resolved": "تم الحل"
+ }
+ }
},
- "registration": {
- "heading": {
- "superAdmin": "",
- "user": ""
- },
- "subheadings": {
- "stepOne": "",
- "stepTwo": "",
- "stepThree": ""
+ "infrastructure": {
+ "charts": {
+ "labels": {
+ "cpu": "استخدام CPU",
+ "disk": "استخدام القرص",
+ "memory": "استخدام الذاكرة",
+ "netBytesRecv": "{{name}} - البايتات المستلمة",
+ "netBytesSent": "{{name}} - البايتات المرسلة",
+ "temp": "الحرارة"
+ }
},
- "description": {
- "superAdmin": "",
- "user": ""
+ "gauges": {
+ "cpu": {
+ "lowerLabel": "أقصى تردد",
+ "title": "استخدام CPU",
+ "upperLabel": "التردد الحالي"
+ },
+ "disk": {
+ "lowerLabel": "متاح",
+ "title": "استخدام القرص {{idx}}",
+ "upperLabel": "مستخدم"
+ },
+ "memory": {
+ "lowerLabel": "متاح",
+ "title": "استخدام الذاكرة",
+ "upperLabel": "مستخدم"
+ }
},
- "gettingStartedButton": {
- "superAdmin": "",
- "user": ""
+ "statBoxes": {
+ "avgCpuTemperature": "",
+ "cpuFrequency": "",
+ "cpuLogical": "",
+ "cpuPhysical": "",
+ "disk": "القرص",
+ "memory": "الذاكرة",
+ "os": ""
},
- "termsAndPolicies": "",
- "links": {
- "login": ""
+ "table": {
+ "headers": {
+ "cpu": "CPU",
+ "disk": "القرص",
+ "memory": "الذاكرة"
+ }
},
- "toasts": {
- "success": ""
+ "tabs": {
+ "labels": {
+ "network": "",
+ "overview": "نظرة عامة"
+ }
},
- "welcome": ""
+ "fallback": {
+ "actionButton": "أنشئ مراقباً!",
+ "checks": "تتبع أداء خوادمك,تحديد الاختناقات وتحسين الاستخدام,ضمان الموثوقية من خلال المراقبة في الوقت الفعلي",
+ "title": "يُستخدم مراقب البنية التحتية من أجل:"
+ }
},
- "forgotPassword": {
- "heading": "",
- "subheadings": {
- "stepOne": "",
- "stepTwo": "",
- "stepThree": "",
- "stepFour": ""
+ "logs": {
+ "tabs": {
+ "diagnostics": "",
+ "logs": "",
+ "queue": ""
},
- "buttons": {
- "openEmail": "",
- "resetPassword": ""
+ "logLevelSelect": {
+ "label": "مستوى السجل"
},
- "imageAlts": {
- "passwordKey": "",
- "email": "",
- "lock": "",
- "passwordConfirm": ""
+ "jobQueue": "قائمة المهام",
+ "failedJobs": "المهام الفاشلة",
+ "noLogs": "لم يتم العثور على سجلات",
+ "metrics": {
+ "jobs": "المهام",
+ "activeJobs": "المهام النشطة",
+ "failingJobs": "المهام الفاشلة",
+ "totalRuns": "إجمالي عمليات التشغيل",
+ "totalFailures": "إجمالي حالات الفشل"
},
- "links": {
- "login": "",
- "resend": ""
+ "diagnostics": {
+ "stats": {
+ "eventLoopDelay": "تأخير حلقة الأحداث",
+ "uptime": "وقت التشغيل",
+ "usedHeapSize": "حجم الذاكرة المستخدمة",
+ "totalHeapSize": "إجمالي حجم الذاكرة",
+ "osMemoryLimit": "حد ذاكرة نظام التشغيل"
+ },
+ "gauges": {
+ "heapAllocation": "تخصيص الذاكرة",
+ "heapUsage": "استخدام الذاكرة",
+ "heapUtilization": "معدل استخدام الذاكرة",
+ "instantCpuUsage": "استخدام CPU اللحظي",
+ "availableMemoryPercentage": "% من الذاكرة المتاحة",
+ "allocatedPercentage": "% مخصص",
+ "usedSPercentage": "% من 1 ثانية مستخدمة بواسطة CPU",
+ "total": "الإجمالي",
+ "used": "مستخدم"
+ }
},
- "toasts": {
- "sent": "",
- "emailNotFound": "",
- "redirect": "",
- "success": "",
- "error": ""
+ "table": {
+ "headers": {
+ "timestamp": "الطابع الزمني",
+ "level": "المستوى",
+ "service": "الخدمة",
+ "method": "الطريقة",
+ "monitorId": "معرّف المراقب",
+ "runCount": "عدد التشغيلات",
+ "failCount": "عدد حالات الفشل",
+ "lastRunAt": "آخر تشغيل في",
+ "lockedAt": "مقفل في",
+ "lastFinishedAt": "آخر انتهاء في",
+ "lastRunTook": "مدة آخر تشغيل",
+ "lastFailedAt": "آخر فشل في",
+ "failReason": "سبب الفشل"
+ }
}
- }
- },
- "errorPages": {
- "serverUnreachable": {
- "toasts": {
- "reconnected": "",
- "stillUnreachable": ""
+ },
+ "maintenanceWindow": {
+ "fallback": {
+ "actionButton": "أنشئ نافذة صيانة!",
+ "checks": "تحديد فترات الصيانة,التخلص من أي سوء فهم,إيقاف إرسال التنبيهات أثناء نوافذ الصيانة",
+ "title": "تُستخدم نافذة الصيانة من أجل:"
+ },
+ "table": {
+ "headers": {
+ "nextWindow": "",
+ "repeat": ""
+ }
},
- "alertBox": "",
- "description": "",
- "retryButton": {
- "default": "",
- "processing": ""
+ "form": {
+ "general": {
+ "title": "الإعدادات العامة",
+ "description": "حدد اسماً وخيار التكرار لنافذة الصيانة الخاصة بك.",
+ "option": {
+ "name": {
+ "label": "الاسم",
+ "placeholder": "مثال: صيانة أسبوعية"
+ },
+ "repeat": {
+ "label": "تكرار"
+ }
+ }
+ },
+ "startDate": {
+ "title": "تاريخ البدء",
+ "description": "اختر تاريخ البدء لنافذة الصيانة الخاصة بك.",
+ "option": {
+ "startDate": {
+ "label": "تاريخ البدء"
+ }
+ }
+ },
+ "startTime": {
+ "title": "وقت البدء",
+ "description": "حدد وقت البدء والمدة لنافذة الصيانة الخاصة بك. جميع القيم بتوقيت UTC",
+ "option": {
+ "duration": {
+ "label": "المدة"
+ },
+ "startTime": {
+ "label": "وقت البدء"
+ }
+ },
+ "monitors": {
+ "title": "المراقبات",
+ "description": "المراقبات التي يجب أن تنطبق عليها نافذة الصيانة",
+ "option": {
+ "addMonitors": {
+ "label": "إضافة مراقبات"
+ }
+ }
+ }
+ }
}
- }
- },
- "createNotifications": {
- "title": "",
- "nameSettings": {
- "title": "",
- "description": "",
- "nameLabel": "",
- "namePlaceholder": ""
- },
- "typeSettings": {
- "title": "",
- "description": "",
- "typeLabel": ""
- },
- "emailSettings": {
- "title": "",
- "description": "",
- "emailLabel": "",
- "emailPlaceholder": ""
- },
- "slackSettings": {
- "title": "",
- "description": "",
- "webhookLabel": "",
- "webhookPlaceholder": ""
- },
- "pagerdutySettings": {
- "title": "",
- "description": "",
- "integrationKeyLabel": "",
- "integrationKeyPlaceholder": ""
},
- "discordSettings": {
- "title": "",
- "description": "",
- "webhookLabel": "",
- "webhookPlaceholder": ""
- },
- "webhookSettings": {
- "title": "",
- "description": "",
- "webhookLabel": "",
- "webhookPlaceholder": ""
- },
- "testNotification": "",
- "dialogDeleteTitle": "",
- "dialogDeleteConfirm": ""
- },
- "notificationConfig": {
- "title": "",
- "description": ""
- },
- "monitorStatus": {
- "checkingEvery": "",
- "withCaptureAgent": "",
- "up": "",
- "down": "",
- "paused": ""
- },
- "advancedMatching": "",
- "sendTestNotifications": "",
- "selectAll": "",
- "showAdminLoginLink": "",
- "logsPage": {
- "title": "",
- "description": "",
- "tabs": {
- "queue": "",
- "logs": "",
- "diagnostics": ""
- },
- "toast": {
- "fetchLogsSuccess": ""
- },
- "logLevelSelect": {
- "title": "",
- "values": {
- "all": "",
- "info": "",
- "warn": "",
- "error": "",
- "debug": ""
+ "notifications": {
+ "fallback": {
+ "actionButton": "إنشاء قناة",
+ "checks": "تنبيه الفرق حول التوقف أو مشكلات الأداء,إعلام المهندسين عند حدوث الحوادث,إبقاء المسؤولين على اطلاع بتغييرات النظام",
+ "title": "تُستخدم قنوات الإشعارات من أجل:"
+ },
+ "form": {
+ "accessToken": {
+ "optionAccessToken": "رمز الوصول",
+ "placeholder": "syt_YWxleF9ob2xsaWRheQ_VmtScmV0U2VjcmV0S2V5_abc123"
+ },
+ "address": {
+ "description": "العنوان الذي سيتم إرسال الإشعارات إليه.",
+ "optionAddress": "العنوان",
+ "placeholderEmail": "example@example.com",
+ "placeholderWebhook": "https://your-server.com/webhook",
+ "title": "العنوان"
+ },
+ "homeServer": {
+ "optionHomeServer": "الخادم الرئيسي",
+ "placeholder": "example.com"
+ },
+ "matrix": {
+ "description": "تهيئة اتصال خادم Matrix الرئيسي للإشعارات.",
+ "title": "تهيئة Matrix"
+ },
+ "notificationName": {
+ "description": "اسم وصفي لقناة الإشعارات",
+ "optionName": "اسم القناة",
+ "placeholder": "مثال: تنبيهات الإنتاج",
+ "title": "اسم القناة"
+ },
+ "pagerDuty": {
+ "description": "مفتاح تكامل PagerDuty لتلقي التنبيهات.",
+ "optionIntegrationKey": "مفتاح التكامل",
+ "placeholder": "a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6",
+ "title": "مفتاح التكامل"
+ },
+ "roomId": {
+ "optionRoomId": "معرّف الغرفة",
+ "placeholder": "!abcdefg:matrix.org"
+ },
+ "type": {
+ "description": "اختر نوع قناة الإشعارات المراد إنشاؤها.",
+ "optionType": "النوع",
+ "title": "نوع القناة"
+ },
+ "telegram": {
+ "title": "تهيئة Telegram",
+ "description": "",
+ "optionBotToken": "رمز البوت",
+ "placeholderBotToken": "123456789:ABCdefGhIJKlmNoPQRsTUVwxyZ",
+ "optionChatId": "معرّف المحادثة",
+ "placeholderChatId": "-1001234567890"
+ }
+ },
+ "table": {
+ "headers": {
+ "destination": "الوجهة"
+ }
}
- }
- },
- "queuePage": {
- "title": "",
- "refreshButton": "",
- "flushButton": "",
- "jobTable": {
- "title": "",
- "idHeader": "",
- "urlHeader": "",
- "typeHeader": "",
- "activeHeader": "",
- "lockedAtHeader": "",
- "runCountHeader": "",
- "failCountHeader": "",
- "lastRunHeader": "",
- "lastFinishedAtHeader": "",
- "lastRunTookHeader": "",
- "intervalHeader": ""
- },
- "metricsTable": {
- "title": "",
- "metricHeader": "",
- "valueHeader": ""
- },
- "failedJobTable": {
- "title": "",
- "monitorIdHeader": "",
- "monitorUrlHeader": "",
- "failCountHeader": "",
- "failedAtHeader": "",
- "failReasonHeader": ""
- }
- },
- "export": {
- "title": "",
- "success": "",
- "failed": ""
- },
- "monitorActions": {
- "title": "",
- "import": "",
- "export": "",
- "deleteSuccess": "",
- "deleteFailed": "",
- "details": ""
- },
- "settingsPage": {
- "aboutSettings": {
- "labelDevelopedBy": "",
- "labelVersion": "",
- "title": ""
},
- "demoMonitorsSettings": {
- "buttonAddMonitors": "",
- "description": "",
- "title": ""
- },
- "emailSettings": {
- "buttonSendTestEmail": "",
- "description": "",
- "descriptionTransport": "",
- "labelAddress": "",
- "labelConnectionHost": "",
- "labelHost": "",
- "labelIgnoreTLS": "",
- "labelPassword": "",
- "labelPasswordSet": "",
- "labelPool": "",
- "labelPort": "",
- "labelRejectUnauthorized": "",
- "labelRequireTLS": "",
- "labelSecure": "",
- "labelTLSServername": "",
- "labelUser": "",
- "linkTransport": "",
- "placeholderUser": "",
- "title": "",
- "toastEmailRequiredFieldsError": ""
- },
- "pageSpeedSettings": {
- "description": "",
- "labelApiKeySet": "",
- "labelApiKey": "",
- "title": ""
- },
- "saveButtonLabel": "",
- "statsSettings": {
- "clearAllStatsButton": "",
- "clearAllStatsDescription": "",
- "clearAllStatsDialogConfirm": "",
- "clearAllStatsDialogDescription": "",
- "clearAllStatsDialogTitle": "",
- "description": "",
- "labelTTL": "",
- "labelTTLOptional": "",
- "title": ""
- },
- "systemResetSettings": {
- "buttonRemoveAllMonitors": "",
- "description": "",
- "dialogConfirm": "",
- "dialogDescription": "",
- "dialogTitle": "",
- "title": ""
- },
- "timezoneSettings": {
- "description": "",
- "label": "",
- "title": ""
- },
- "title": "",
- "uiSettings": {
- "description": "",
- "labelLanguage": "",
- "labelTheme": "",
- "title": ""
- },
- "urlSettings": {
- "description": "",
- "label": "",
- "selectDisabled": "",
- "selectEnabled": "",
- "title": ""
- },
- "globalThresholds": {
- "title": "",
- "description": ""
- }
- },
- "statusPageCreate": {
- "buttonSave": ""
- },
- "incidentsOptionsHeaderFilterResolved": "",
- "settingsSave": "",
- "statusPageCreateAppearanceTitle": "",
- "confirmPassword": "",
- "monitorHooks": {
- "failureAddDemoMonitors": "",
- "successAddDemoMonitors": ""
- },
- "settingsAppearance": "",
- "settingsDisplayTimezone": "",
- "settingsGeneralSettings": "",
- "incidentsOptionsHeaderTotalIncidents": "",
- "statusPage": {
- "deleteSuccess": "",
- "deleteFailed": "",
- "createSuccess": "",
- "updateSuccess": "",
- "generalSettings": "",
- "contents": "",
- "fallback": {
- "checks": [""],
- "title": "",
- "actionButton": ""
- }
- },
- "testNotificationsDisabled": "",
- "incidentsTableResolvedAt": "",
- "incidentsTableActionResolve": "",
- "checkHooks": {
- "failureResolveOne": "",
- "failureResolveAll": "",
- "failureResolveMonitor": ""
- },
- "checkFormError": "",
- "diagnosticsPage": {
- "diagnosticDescription": "",
- "statsDescription": "",
- "gauges": {
- "heapAllocationTitle": "",
- "heapAllocationSubtitle": "",
- "heapUsageTitle": "",
- "heapUsageSubtitle": "",
- "heapUtilizationTitle": "",
- "heapUtilizationSubtitle": "",
- "instantCpuUsageTitle": "",
- "instantCpuUsageSubtitle": ""
- },
- "stats": {
- "eventLoopDelayTitle": "",
- "uptimeTitle": "",
- "usedHeapSizeTitle": "",
- "totalHeapSizeTitle": "",
- "osMemoryLimitTitle": ""
- }
- },
- "pageSpeedLighthouseAPI": "",
- "time": {
- "threeMinutes": "",
- "fiveMinutes": "",
- "tenMinutes": "",
- "twentyMinutes": "",
- "oneHour": "",
- "oneDay": "",
- "oneWeek": "",
- "fourMinutes": "",
- "oneMinute": "",
- "twoMinutes": "",
- "fifteenSeconds": "",
- "thirtySeconds": ""
- },
- "general": {
- "noOptionsFound": ""
- },
- "infrastructureMonitor": {
- "fallback": {
- "checks": [""],
- "title": "",
- "actionButton": ""
- }
- },
- "maintenanceWindow": {
- "fallback": {
- "checks": [""],
- "title": "",
- "actionButton": ""
- }
- },
- "pageSpeed": {
- "fallback": {
- "checks": [""],
- "title": "",
- "actionButton": ""
- }
- },
- "uptimeMonitor": {
- "fallback": {
- "checks": [""],
- "title": "",
- "actionButton": ""
- }
- },
- "editUserPage": {
- "form": {
- "email": "",
- "firstName": "",
- "lastName": "",
- "role": "",
- "save": ""
- },
- "table": {
- "actionHeader": "",
- "roleHeader": ""
- },
- "title": "",
- "toast": {
- "successUserUpdate": "",
- "validationErrors": ""
- }
- },
- "incidentsPageActionResolveMonitor": "",
- "incidentsPageActionResolveAll": "",
- "matchMethodOptions": {
- "equal": "",
- "equalPlaceholder": "",
- "include": "",
- "includePlaceholder": "",
- "regex": "",
- "regexPlaceholder": "",
- "text": ""
- },
- "monitorType": {
- "docker": {
- "label": "",
- "namePlaceholder": "",
- "placeholder": ""
- },
- "http": {
- "label": "",
- "namePlaceholder": "",
- "placeholder": ""
+ "pageSpeed": {
+ "charts": {
+ "common": {
+ "cls": "إزاحة التخطيط التراكمية (CLS)",
+ "fcp": "أول رسم للمحتوى (FCP)",
+ "lcp": "أكبر رسم للمحتوى (LCP)",
+ "si": "مؤشر السرعة (SI)",
+ "tbt": "إجمالي وقت الحظر (TBT)"
+ },
+ "legend": {
+ "title": "تقرير PageSpeed",
+ "weight": "الوزن"
+ },
+ "pie": {
+ "title": "تقرير الأداء"
+ }
+ },
+ "table": {
+ "headers": {
+ "pageSpeedScore": "درجة PageSpeed"
+ }
+ },
+ "fallback": {
+ "actionButton": "أنشئ مراقباً!",
+ "checks": "تقديم تقرير عن تجربة المستخدم للصفحة,المساعدة في تحليل سرعة الصفحة,تقديم اقتراحات لتحسين الصفحة",
+ "title": "يُستخدم مراقب PageSpeed من أجل:"
+ }
},
- "ping": {
- "label": "",
- "namePlaceholder": "",
- "placeholder": ""
+ "settings": {
+ "form": {
+ "timezone": {
+ "title": "المنطقة الزمنية للعرض",
+ "description": "اختر المنطقة الزمنية المستخدمة لعرض التواريخ والأوقات في جميع أنحاء التطبيق.",
+ "option": {
+ "timezone": {
+ "label": "المنطقة الزمنية للعرض"
+ }
+ }
+ },
+ "ui": {
+ "title": "المظهر",
+ "description": "التبديل بين الوضع الفاتح والداكن، أو تغيير اللغة، أو تخصيص نوع عرض المخططات.",
+ "option": {
+ "theme": {
+ "label": "وضع السمة",
+ "light": "فاتح",
+ "dark": "داكن"
+ },
+ "language": {
+ "label": "اللغة"
+ },
+ "chartType": {
+ "label": "نوع المخطط",
+ "histogram": "مدرج تكراري",
+ "heatmap": "خريطة حرارية"
+ }
+ }
+ },
+ "pagespeed": {
+ "title": "مفتاح Google PageSpeed API",
+ "description": "أدخل مفتاح Google PageSpeed API لتفعيل مراقبة Google PageSpeed. انقر على إعادة تعيين لتحديث المفتاح.",
+ "option": {
+ "apiKey": {
+ "label": "مفتاح PageSpeed API",
+ "labelSet": "تم تعيين مفتاح API. انقر على إعادة تعيين لتغييره.",
+ "placeholder": "أدخل مفتاح Google PageSpeed API الخاص بك"
+ }
+ }
+ },
+ "url": {
+ "title": "عرض IP/URL للمراقب في صفحة الحالة",
+ "description": "عرض عنوان IP أو رابط المراقب في صفحة الحالة العامة. إذا تم تعطيله، سيظهر فقط اسم المراقب لحماية المعلومات الحساسة.",
+ "option": {
+ "showURL": {
+ "label": "عرض IP/URL في صفحة الحالة",
+ "enabled": "مفعّل",
+ "disabled": "معطّل"
+ }
+ }
+ },
+ "stats": {
+ "title": "سجل المراقبة",
+ "description": "مسح جميع سجلات وإحصائيات المراقبة لفريقك. هذا الإجراء لا يمكن التراجع عنه.",
+ "option": {
+ "clear": {
+ "label": "مسح جميع الإحصائيات. هذا الإجراء لا يمكن التراجع عنه."
+ }
+ },
+ "dialog": {
+ "title": "مسح جميع سجلات المراقبة؟",
+ "description": "لا يمكن التراجع عن هذا"
+ }
+ },
+ "retention": {
+ "title": "الاحتفاظ بالفحوصات",
+ "description": "حدد مدة الاحتفاظ ببيانات الفحص قبل التنظيف التلقائي.",
+ "option": {
+ "days": {
+ "label": "فترة الاحتفاظ (أيام)",
+ "unlimited": "غير محدود"
+ }
+ }
+ },
+ "thresholds": {
+ "title": "الحدود العامة",
+ "description": "تعيين حدود عامة لـ CPU والذاكرة والقرص والحرارة لمراقبة البنية التحتية. تنطبق على جميع مراقبات الأجهزة ما لم يتم تجاوزها.",
+ "option": {
+ "cpu": {
+ "label": "حد CPU (%)",
+ "placeholder": "1 - 100"
+ },
+ "memory": {
+ "label": "حد الذاكرة (%)",
+ "placeholder": "1 - 100"
+ },
+ "disk": {
+ "label": "حد القرص (%)",
+ "placeholder": "1 - 100"
+ },
+ "temperature": {
+ "label": "حد الحرارة (°C)",
+ "placeholder": "1 - 150"
+ }
+ }
+ },
+ "email": {
+ "title": "إعدادات البريد الإلكتروني",
+ "description": "تهيئة إعدادات البريد الإلكتروني لنظامك. يُستخدم لإرسال الإشعارات والتنبيهات.",
+ "descriptionTransport": "",
+ "descriptionTransportLink": "اطلع على المواصفات هنا",
+ "option": {
+ "host": {
+ "label": "مضيف البريد - اسم المضيف أو عنوان IP للاتصال",
+ "placeholder": "smtp.gmail.com"
+ },
+ "port": {
+ "label": "منفذ البريد - المنفذ للاتصال",
+ "placeholder": "587"
+ },
+ "address": {
+ "label": "عنوان البريد الإلكتروني - يُستخدم للمصادقة",
+ "placeholder": "you@example.com"
+ },
+ "user": {
+ "label": "مستخدم البريد - اسم المستخدم للمصادقة، يتجاوز عنوان البريد إذا تم تحديده",
+ "placeholder": "اتركه فارغاً إذا لم يكن مطلوباً"
+ },
+ "password": {
+ "label": "كلمة مرور البريد - كلمة المرور للمصادقة",
+ "labelSet": "تم تعيين كلمة المرور. انقر على إعادة تعيين لتغييرها.",
+ "placeholder": "أدخل كلمة المرور"
+ },
+ "tlsServername": {
+ "label": "اسم خادم TLS - اسم مضيف اختياري للتحقق من TLS عندما يكون المضيف عنوان IP",
+ "placeholder": "example.com"
+ },
+ "connectionHost": {
+ "label": "مضيف اتصال البريد - اسم المضيف المستخدم في تحية HELO/EHLO",
+ "placeholder": "localhost"
+ },
+ "secure": {
+ "label": "استخدام SSL (موصى به): تشفير الاتصال باستخدام SSL/TLS"
+ },
+ "pool": {
+ "label": "تفعيل تجميع الاتصالات: إعادة استخدام الاتصالات الموجودة لتحسين الأداء"
+ },
+ "ignoreTLS": {
+ "label": "تعطيل STARTTLS: عدم استخدام TLS حتى لو كان الخادم يدعمه"
+ },
+ "requireTLS": {
+ "label": "فرض STARTTLS: يتطلب ترقية TLS، يفشل إذا لم يكن مدعوماً"
+ },
+ "rejectUnauthorized": {
+ "label": "رفض الشهادات غير الصالحة: رفض الاتصالات ذات الشهادات الموقعة ذاتياً أو غير الموثوقة"
+ }
+ }
+ },
+ "demoMonitors": {
+ "title": "مراقبات تجريبية",
+ "description": "إضافة مراقبات نموذجية لأغراض العرض التوضيحي."
+ },
+ "removeMonitors": {
+ "title": "إعادة تعيين النظام",
+ "description": "إزالة جميع المراقبات من نظامك.",
+ "dialog": {
+ "title": "إزالة جميع المراقبات؟",
+ "description": "لا يمكن التراجع عن هذا."
+ }
+ },
+ "exportMonitors": {
+ "title": "تصدير المراقبات"
+ },
+ "importExportMonitors": {
+ "title": "استيراد / تصدير المراقبات",
+ "description": "استيراد أو تصدير بيانات المراقبات كملف JSON للنسخ الاحتياطي أو النقل."
+ },
+ "about": {
+ "title": "حول",
+ "developedBy": "تم التطوير بواسطة Bluewave Labs"
+ },
+ "validation": {
+ "errorMessage": "يرجى إصلاح أخطاء التحقق التالية:"
+ }
+ }
},
- "port": {
- "label": "",
- "namePlaceholder": "",
- "placeholder": ""
+ "statusPages": {
+ "deleteSuccess": "تم حذف صفحة الحالة بنجاح",
+ "fallback": {
+ "title": "تُستخدم صفحة الحالة من أجل:",
+ "checks": "إيصال حالة النظام للمستخدمين وأصحاب المصلحة,عرض معلومات وقت التشغيل في الوقت الفعلي للعامة,بناء الثقة من خلال مراقبة الخدمة الشفافة,تقليل طلبات الدعم أثناء الحوادث",
+ "actionButton": "أنشئ صفحة حالة!"
+ },
+ "monitorsList": {
+ "chartTypeHeatmap": "خريطة حرارية",
+ "chartTypeHistogram": "مدرج تكراري",
+ "noData": "لا تتوفر بيانات",
+ "infrastructure": {
+ "title": "البنية التحتية",
+ "cpu": "CPU",
+ "memory": "RAM",
+ "memoryText": "الذاكرة",
+ "disk": "القرص",
+ "usage": "الاستخدام",
+ "used": "مستخدم",
+ "total": "الإجمالي"
+ },
+ "uptime": {
+ "title": "وقت التشغيل",
+ "responseTime": "وقت الاستجابة"
+ }
+ },
+ "statusBar": {
+ "allDown": "جميع الأنظمة متوقفة",
+ "allUp": "جميع الأنظمة تعمل بشكل طبيعي",
+ "degraded": "بعض الأنظمة تواجه مشكلات",
+ "unknown": "تعذر تحديد حالة النظام"
+ },
+ "table": {
+ "headers": {
+ "name": "اسم صفحة الحالة",
+ "url": "الرابط العام"
+ },
+ "published": "منشور",
+ "unpublished": "غير منشور"
+ },
+ "title": "صفحات الحالة",
+ "details": {
+ "empty": {
+ "title": "لا يوجد شيء هنا بعد",
+ "addMonitor": "أضف مراقباً للبدء"
+ }
+ },
+ "form": {
+ "access": {
+ "title": "الوصول",
+ "description": "إذا كانت صفحة الحالة جاهزة، يمكنك وضع علامة منشور عليها.",
+ "option": {
+ "published": {
+ "name": "منشورة ومرئية للعامة"
+ }
+ }
+ },
+ "basicInfo": {
+ "title": "المعلومات الأساسية",
+ "description": "حدد اسم الشركة والنطاق الفرعي الذي تشير إليه صفحة الحالة.",
+ "option": {
+ "name": {
+ "label": "اسم الشركة",
+ "placeholder": "Acme Inc."
+ },
+ "url": {
+ "label": "عنوان صفحة الحالة",
+ "placeholder": "my-status-page"
+ }
+ }
+ },
+ "monitors": {
+ "title": "المراقبات",
+ "description": "اختر المراقبات لعرضها في صفحة الحالة.",
+ "noMonitors": "لم يتم اختيار مراقبات",
+ "option": {
+ "monitors": {
+ "label": "اختر المراقبات",
+ "placeholder": "ابحث واختر المراقبات..."
+ }
+ }
+ },
+ "timezone": {
+ "title": "المنطقة الزمنية",
+ "description": "اختر المنطقة الزمنية التي ستُعرض بها صفحة الحالة.",
+ "option": {
+ "timezone": {
+ "label": "المنطقة الزمنية",
+ "placeholder": "اختر المنطقة الزمنية..."
+ }
+ }
+ },
+ "appearance": {
+ "title": "المظهر",
+ "description": "حدد المظهر الافتراضي لصفحة الحالة العامة.",
+ "option": {
+ "logo": {
+ "label": "الشعار"
+ },
+ "color": {
+ "label": "لون العلامة التجارية"
+ }
+ }
+ },
+ "features": {
+ "title": "الميزات",
+ "description": "تهيئة المعلومات المعروضة في صفحة الحالة.",
+ "option": {
+ "showCharts": {
+ "label": "إظهار مخططات وقت الاستجابة"
+ },
+ "showUptimePercentage": {
+ "label": "إظهار نسبة وقت التشغيل"
+ },
+ "showAdminLoginLink": {
+ "label": "إظهار رابط تسجيل دخول المسؤول"
+ },
+ "showInfrastructure": {
+ "label": "إظهار مقاييس البنية التحتية"
+ }
+ }
+ }
+ }
},
- "game": {
- "label": "",
- "namePlaceholder": "",
- "placeholder": ""
+ "uptime": {
+ "filters": {
+ "search": {
+ "placeholder": "البحث في المراقبات..."
+ }
+ },
+ "table": {
+ "headers": {
+ "responseTime": "وقت الاستجابة"
+ }
+ },
+ "fallback": {
+ "actionButton": "أنشئ مراقباً!",
+ "checks": "التحقق مما إذا كانت المواقع أو الخوادم متصلة ومتجاوبة,تنبيه الفرق حول التوقف أو مشكلات الأداء,مراقبة نقاط نهاية HTTP والـ Ping والحاويات والمنافذ,تتبع اتجاهات وقت التشغيل والموثوقية التاريخية",
+ "title": "يُستخدم مراقب وقت التشغيل من أجل:"
+ }
}
- },
- "uptimeAdvancedMatching": {
- "jsonPath": ""
- },
- "bytesPerSecond": "",
- "bytesReceived": "",
- "bytesSent": "",
- "chooseGame": "",
- "createMonitorPage": {
- "incidentConfigDescription": "",
- "incidentConfigStatusWindowLabel": "",
- "incidentConfigStatusWindowThresholdLabel": "",
- "incidentConfigTitle": "",
- "incidentConfigDescriptionV2": "",
- "incidentConfigStatusCheckNumber": "",
- "intervalTitle": "",
- "intervalDescription": ""
- },
- "dataRate": "",
- "dataReceived": "",
- "dataSent": "",
- "details": "",
- "drops": "",
- "errors": "",
- "errorsIn": "",
- "errorsOut": "",
- "gameServerMonitoring": "",
- "gameServerMonitoringDescription": "",
- "network": "",
- "networkDrops": "",
- "networkErrors": "",
- "networkInterface": "",
- "noNetworkStatsAvailable": "",
- "packetsPerSecond": "",
- "packetsReceived": "",
- "packetsReceivedRate": "",
- "packetsSent": "",
- "rate": "",
- "selectInterface": ""
+ }
}
diff --git a/client/src/locales/cs.json b/client/src/locales/cs.json
index 837b498033..780a7a7231 100644
--- a/client/src/locales/cs.json
+++ b/client/src/locales/cs.json
@@ -1,1108 +1,1305 @@
{
- "submit": "Odeslat",
- "title": "",
- "distributedStatusHeaderText": "",
- "distributedStatusSubHeaderText": "",
- "settingsDisabled": "Vypnuto",
- "settingsSuccessSaved": "Nastavení bylo úspěšně uloženo",
- "settingsFailedToSave": "Nepodařilo se uložit nastavení",
- "settingsStatsCleared": "",
- "settingsFailedToClearStats": "",
- "settingsMonitorsDeleted": "",
- "settingsFailedToDeleteMonitors": "",
- "starPromptTitle": "",
- "starPromptDescription": "",
- "https": "",
- "http": "",
- "monitor": "",
- "aboutus": "",
- "now": "",
- "delete": "",
- "configure": "",
- "responseTime": "",
- "ms": "",
- "bar": "",
- "area": "",
- "country": "",
- "city": "",
- "response": "",
- "monitorStatusUp": "",
- "monitorStatusDown": "",
- "webhookSendSuccess": "",
- "webhookSendError": "",
- "webhookUnsupportedPlatform": "",
- "distributedRightCategoryTitle": "",
- "distributedStatusServerMonitors": "",
- "distributedStatusServerMonitorsDescription": "",
- "distributedUptimeCreateSelectURL": "",
- "distributedUptimeCreateChecks": "",
- "distributedUptimeCreateChecksDescription": "",
- "distributedUptimeCreateIncidentNotification": "",
- "distributedUptimeCreateIncidentDescription": "",
- "distributedUptimeCreateAdvancedSettings": "",
- "distributedUptimeDetailsNoMonitorHistory": "",
- "distributedUptimeDetailsStatusHeaderUptime": "",
- "distributedUptimeDetailsStatusHeaderLastUpdate": "",
- "notifications": {
- "enableNotifications": "",
- "testNotification": "",
- "addOrEditNotifications": "",
- "slack": {
- "label": "",
- "description": "",
- "webhookLabel": "",
- "webhookPlaceholder": "",
- "webhookRequired": ""
- },
- "discord": {
- "label": "",
- "description": "",
- "webhookLabel": "",
- "webhookPlaceholder": "",
- "webhookRequired": ""
+ "common": {
+ "auth": {
+ "roles": {
+ "admin": "Administrátor",
+ "demo": "Demo",
+ "superadmin": "Superadministrátor",
+ "user": "Uživatel"
+ }
},
- "telegram": {
- "label": "",
- "description": "",
- "tokenLabel": "",
- "tokenPlaceholder": "",
- "chatIdLabel": "",
- "chatIdPlaceholder": "",
- "fieldsRequired": ""
+ "alerts": {
+ "pageSpeedApiKey": {
+ "content": "Upozornění: Zatím jste nepřidali klíč Google PageSpeed API. Přejděte do Nastavení a přidejte ho. Bez něj nebude monitor PageSpeed fungovat."
+ }
},
- "webhook": {
- "label": "",
- "description": "",
- "urlLabel": "",
- "urlPlaceholder": "",
- "urlRequired": ""
+ "appName": "Checkmate",
+ "breadcrumbs": {
+ "details": "Podrobnosti",
+ "home": "Domů"
},
- "testNotificationDevelop": "",
- "integrationButton": "",
- "testSuccess": "",
- "testFailed": "",
- "unsupportedType": "",
- "networkError": "",
- "fallback": {
- "title": "",
- "checks": [""],
- "actionButton": ""
+ "buttons": {
+ "addMember": "Přidat člena",
+ "cancel": "Zrušit",
+ "close": "Zavřít",
+ "configure": "Konfigurovat",
+ "confirm": "Potvrdit",
+ "create": "Vytvořit",
+ "delete": "Smazat",
+ "generateToken": "Vygenerovat token",
+ "incidents": "Incidenty",
+ "inviteMember": "Pozvat člena",
+ "pause": "Pozastavit",
+ "resume": "Obnovit",
+ "save": "Uložit",
+ "sendInvite": "Odeslat pozvánku",
+ "test": "Test",
+ "testNotifications": "Testovat oznámení",
+ "toggleTheme": "Přepnout mezi světlým a tmavým motivem",
+ "flushQueue": "Vyprázdnit frontu",
+ "notFound": "Přejít na hlavní přehled",
+ "resetPassword": "Obnovit heslo",
+ "reset": "",
+ "clear": "Vymazat",
+ "addDemo": "Přidat ukázkové monitory",
+ "removeMonitors": "Odebrat monitory",
+ "sendTestEmail": "Odeslat testovací email",
+ "exportToJSON": "Exportovat do JSON",
+ "importFromJSON": "Importovat z JSON",
+ "clearFilters": "Vymazat filtry",
+ "removeUser": "Odebrat uživatele"
},
- "createButton": "",
- "createTitle": "",
- "create": {
- "success": "",
- "failed": ""
+ "charts": {
+ "labels": {
+ "averageResponseTime": "Průměrná doba odezvy",
+ "downtime": "Výpadek",
+ "high": "",
+ "low": "",
+ "uptime": "Dostupnost"
+ },
+ "histogram": {
+ "avg": "Prům.: {{value}} ms",
+ "max": "Max: {{value}} ms"
+ }
},
- "fetch": {
- "success": "",
- "failed": ""
+ "dialogs": {
+ "delete": {
+ "description": "Tuto akci nelze vrátit zpět.",
+ "title": "Opravdu chcete toto smazat?"
+ }
},
- "delete": {
- "success": "",
- "failed": ""
+ "labels": {
+ "active": "Aktivní",
+ "paused": "pozastaveno",
+ "na": "N/A",
+ "resolved": "Vyřešeno",
+ "responseTime": "Doba odezvy"
},
- "edit": {
- "success": "",
- "failed": ""
+ "form": {
+ "role": {
+ "option": {
+ "role": {
+ "label": "Role"
+ }
+ }
+ },
+ "name": {
+ "option": {
+ "firstName": {
+ "label": "Jméno",
+ "placeholder": "Jan"
+ },
+ "lastName": {
+ "label": "Příjmení",
+ "placeholder": "Novák"
+ }
+ }
+ },
+ "email": {
+ "option": {
+ "email": {
+ "label": "Email",
+ "placeholder": "you@example.com"
+ }
+ }
+ }
},
- "test": {
- "success": "",
- "failed": ""
+ "table": {
+ "empty": "Zde nic není",
+ "headers": {
+ "actions": "",
+ "dateTime": "Datum a čas",
+ "message": "Zpráva",
+ "monitor": "Monitor",
+ "monitorId": "ID monitoru",
+ "name": "Název",
+ "status": "Stav",
+ "type": "",
+ "url": "URL",
+ "interval": "Interval",
+ "active": "Aktivní",
+ "responseTime": "Doba odezvy"
+ }
}
},
- "testLocale": "",
- "add": "",
- "monitors": "",
- "distributedUptimeStatusCreateStatusPage": "",
- "distributedUptimeStatusCreateStatusPageAccess": "",
- "distributedUptimeStatusCreateStatusPageReady": "",
- "distributedUptimeStatusBasicInfoHeader": "",
- "distributedUptimeStatusBasicInfoDescription": "",
- "distributedUptimeStatusLogoHeader": "",
- "distributedUptimeStatusLogoDescription": "",
- "distributedUptimeStatusLogoUploadButton": "",
- "distributedUptimeStatusStandardMonitorsHeader": "",
- "distributedUptimeStatusStandardMonitorsDescription": "",
- "distributedUptimeStatusCreateYour": "",
- "distributedUptimeStatusEditYour": "",
- "distributedUptimeStatusPublishedLabel": "",
- "distributedUptimeStatusCompanyNameLabel": "",
- "distributedUptimeStatusPageAddressLabel": "",
- "distributedUptimeStatus30Days": "",
- "distributedUptimeStatus60Days": "",
- "distributedUptimeStatus90Days": "",
- "distributedUptimeStatusPageNotSetUp": "",
- "distributedUptimeStatusContactAdmin": "",
- "distributedUptimeStatusPageNotPublic": "",
- "distributedUptimeStatusPageDeleteDialog": "",
- "distributedUptimeStatusPageDeleteConfirm": "",
- "distributedUptimeStatusPageDeleteDescription": "",
- "distributedUptimeStatusDevices": "",
- "distributedUptimeStatusUpt": "",
- "distributedUptimeStatusUptBurned": "",
- "distributedUptimeStatusUptLogo": "",
- "incidentsTableNoIncidents": "",
- "incidentsTablePaginationLabel": "",
- "incidentsTableMonitorName": "",
- "incidentsTableStatus": "",
- "incidentsTableDateTime": "",
- "incidentsTableStatusCode": "",
- "incidentsTableMessage": "",
- "incidentsOptionsHeader": "",
- "incidentsOptionsHeaderFilterBy": "",
- "incidentsOptionsHeaderFilterAll": "",
- "incidentsOptionsHeaderFilterDown": "",
- "incidentsOptionsHeaderFilterCannotResolve": "",
- "incidentsOptionsHeaderShow": "",
- "incidentsOptionsHeaderLastHour": "",
- "incidentsOptionsHeaderLastDay": "",
- "incidentsOptionsHeaderLastWeek": "",
- "incidentsOptionsPlaceholderAllServers": "",
- "infrastructureCreateYour": "",
- "infrastructureCreateGeneralSettingsDescription": "",
- "infrastructureServerRequirement": "",
- "infrastructureCustomizeAlerts": "",
- "infrastructureAlertNotificationDescription": "",
- "infrastructureCreateMonitor": "",
- "infrastructureProtocol": "",
- "infrastructureServerUrlLabel": "",
- "infrastructureDisplayNameLabel": "",
- "infrastructureAuthorizationSecretLabel": "",
- "gb": "",
- "mb": "",
- "mem": "",
- "memoryUsage": "",
- "cpu": "",
- "cpuUsage": "",
- "cpuTemperature": "",
- "diskUsage": "",
- "used": "",
- "total": "",
- "cores": "",
- "frequency": "",
- "status": "",
- "cpuPhysical": "",
- "cpuLogical": "",
- "cpuFrequency": "",
- "avgCpuTemperature": "",
- "memory": "",
- "disk": "",
- "uptime": "",
- "os": "",
- "host": "",
- "actions": "",
- "integrations": "",
- "integrationsPrism": "",
- "integrationsSlack": "",
- "integrationsSlackInfo": "",
- "integrationsDiscord": "",
- "integrationsDiscordInfo": "",
- "integrationsZapier": "",
- "integrationsZapierInfo": "",
- "commonSave": "",
- "createYour": "",
- "createMonitor": "",
- "pause": "",
- "resume": "",
- "editing": "",
- "url": "",
- "access": "",
- "timezone": "",
- "features": "",
- "administrator": "",
- "loginHere": "",
- "displayName": "",
- "urlMonitor": "",
- "portToMonitor": "",
- "websiteMonitoring": "",
- "websiteMonitoringDescription": "",
- "pingMonitoring": "",
- "pingMonitoringDescription": "",
- "dockerContainerMonitoring": "",
- "dockerContainerMonitoringDescription": "",
- "portMonitoring": "",
- "portMonitoringDescription": "",
- "createMaintenanceWindow": "",
- "createMaintenance": "",
- "editMaintenance": "",
- "maintenanceWindowName": "",
- "friendlyNameInput": "",
- "friendlyNamePlaceholder": "",
- "maintenanceRepeat": "",
- "maintenance": "",
- "duration": "",
- "addMonitors": "",
- "window": "",
- "cancel": "",
- "message": "",
- "low": "",
- "high": "",
- "statusCode": "",
- "date&Time": "",
- "type": "",
- "statusPageName": "",
- "publicURL": "",
- "repeat": "",
- "edit": "",
- "createA": "",
- "remove": "",
- "maintenanceWindowDescription": "",
- "startTime": "",
- "timeZoneInfo": "",
- "monitorsToApply": "",
- "nextWindow": "",
- "notFoundButton": "",
- "pageSpeedConfigureSettingsDescription": "",
- "monitorDisplayName": "",
- "whenNewIncident": "",
- "notifySMS": "",
- "notifyEmails": "",
- "seperateEmails": "",
- "checkFrequency": "",
- "matchMethod": "",
- "expectedValue": "",
- "deleteDialogTitle": "",
- "deleteDialogDescription": "",
- "pageSpeedMonitor": "",
- "shown": "",
- "ago": "",
- "companyName": "",
- "pageSpeedDetailsPerformanceReport": "",
- "pageSpeedDetailsPerformanceReportCalculator": "",
- "checkingEvery": "",
- "statusPageCreateSettings": "",
- "basicInformation": "",
- "statusPageCreateBasicInfoDescription": "",
- "statusPageCreateSelectTimeZoneDescription": "",
- "statusPageCreateAppearanceDescription": "",
- "statusPageCreateSettingsCheckboxLabel": "",
- "statusPageCreateBasicInfoStatusPageAddress": "",
- "statusPageCreateTabsContent": "",
- "statusPageCreateTabsContentDescription": "",
- "statusPageCreateTabsContentFeaturesDescription": "",
- "showCharts": "",
- "showUptimePercentage": "",
- "removeLogo": "",
- "statusPageStatus": "",
- "statusPageStatusContactAdmin": "",
- "statusPageStatusNotPublic": "",
- "statusPageStatusNoPage": "",
- "statusPageStatusServiceStatus": "",
- "deleteStatusPage": "",
- "deleteStatusPageConfirm": "",
- "deleteStatusPageDescription": "",
- "uptimeCreate": "",
- "uptimeCreateJsonPath": "",
- "uptimeCreateJsonPathQuery": "",
- "maintenanceTableActionMenuDialogTitle": "",
- "infrastructureEditYour": "",
- "infrastructureEditMonitor": "",
- "infrastructureMonitorCreated": "",
- "infrastructureMonitorUpdated": "",
- "errorInvalidTypeId": "",
- "errorInvalidFieldId": "",
- "inviteNoTokenFound": "",
- "pageSpeedWarning": "",
- "pageSpeedLearnMoreLink": "",
- "pageSpeedAddApiKey": "",
- "update": "",
- "invalidFileFormat": "",
- "invalidFileSize": "",
- "ClickUpload": "",
- "DragandDrop": "",
- "MaxSize": "",
- "SupportedFormats": "",
- "FirstName": "",
- "LastName": "",
- "EmailDescriptionText": "",
- "YourPhoto": "",
- "PhotoDescriptionText": "",
- "save": "",
- "DeleteDescriptionText": "",
- "DeleteAccountWarning": "",
- "DeleteWarningTitle": "",
- "bulkImport": {
- "title": "",
- "selectFileTips": "",
- "selectFileDescription": "",
- "selectFile": "",
- "parsingFailed": "",
- "uploadSuccess": "",
- "validationFailed": "",
- "noFileSelected": "",
- "fallbackPage": "",
- "invalidFileType": "",
- "uploadFailed": ""
- },
- "DeleteAccountTitle": "",
- "DeleteAccountButton": "",
- "publicLink": "",
- "maskedPageSpeedKeyPlaceholder": "",
- "reset": "",
- "ignoreTLSError": "",
- "tlsErrorIgnored": "",
- "ignoreTLSErrorDescription": "",
- "createNew": "",
- "greeting": {
- "prepend": "",
- "append": "",
- "overview": ""
- },
- "roles": {
- "superAdmin": "",
- "admin": "",
- "teamMember": "",
- "demoUser": ""
- },
- "teamPanel": {
- "teamMembers": "",
- "filter": {
- "all": "",
- "member": ""
+ "components": {
+ "imageUpload": {
+ "clickToUpload": "Klikněte pro nahrání",
+ "dragAndDrop": "",
+ "supportedFormats": "",
+ "maxSize": "",
+ "orDragAndDrop": "nebo přetáhněte soubor",
+ "errors": {
+ "invalidFileSize": "",
+ "invalidFileFormat": ""
+ }
},
- "inviteTeamMember": "",
- "inviteNewTeamMember": "",
- "inviteDescription": "",
- "email": "",
- "selectRole": "",
- "inviteLink": "",
- "cancel": "",
- "noMembers": "",
- "getToken": "",
- "emailToken": "",
- "table": {
- "name": "",
- "email": "",
- "role": "",
- "created": ""
+ "headerStatusPageControls": {
+ "publicLink": ""
},
- "addTeamMember": {
- "addMemberMenu": "",
- "title": "",
- "description": "",
- "addButton": ""
+ "headerTimeRange": {
+ "labels": {
+ "day": "Den",
+ "month": "Měsíc",
+ "recent": "Nedávné",
+ "week": "Týden"
+ },
+ "description": {
+ "recent": "Zobrazení statistik za poslední 2 hodiny.",
+ "day": "Zobrazení statistik za posledních 24 hodin.",
+ "week": "Zobrazení statistik za posledních 7 dní.",
+ "month": "Zobrazení statistik za posledních 30 dní."
+ }
},
- "register": "",
- "registerToast": {
- "success": "",
- "dbUserExists": "",
- "unknownError": ""
+ "offlineBanner": {
+ "serverUnreachable": "Nelze se spojit se serverem",
+ "retry": "Zkusit znovu",
+ "retrying": "Opakuji pokus...",
+ "reconnected": "Podařilo se úspěšně obnovit spojení se serverem"
},
- "registerTeamMember": {
- "title": "",
- "auth": {
- "common": {
- "inputs": {
- "firstName": {
- "errors": {
- "empty": "",
- "pattern": ""
- }
- },
- "lastName": {
- "errors": {
- "empty": "",
- "pattern": ""
- }
+ "sidebar": {
+ "menu": {
+ "uptime": "",
+ "pagespeed": "",
+ "infrastructure": "",
+ "notifications": "",
+ "checks": "Kontroly",
+ "incidents": "",
+ "statusPages": "",
+ "maintenance": "",
+ "logs": "",
+ "settings": ""
+ },
+ "bottomMenu": {
+ "support": "",
+ "discussions": "",
+ "docs": "",
+ "changelog": ""
+ },
+ "accountMenu": {
+ "profile": "Profil",
+ "password": "Heslo",
+ "team": "Tým"
+ },
+ "starPrompt": {
+ "title": "Ohodnoťte Checkmate",
+ "description": "Sledujte nejnovější vydání a pomozte rozšířit komunitu na GitHubu"
+ },
+ "authFooter": {
+ "navControls": "",
+ "logOut": "",
+ "roles": {
+ "superAdmin": "Superadministrátor",
+ "admin": "Administrátor",
+ "user": "Uživatel",
+ "demoUser": ""
+ }
+ }
+ },
+ "starPrompt": {
+ "title": "Ohodnoťte Checkmate",
+ "description": "Sledujte nejnovější vydání a pomozte rozšířit komunitu na GitHubu"
+ }
+ },
+ "pages": {
+ "notFound": {
+ "title": "Ale ne! Upustili jste své sushi!",
+ "subtitle": "Buď tato URL neexistuje, nebo k ní nemáte přístup."
+ },
+ "account": {
+ "tabs": {
+ "profile": "Profil",
+ "password": "Heslo",
+ "team": "Tým"
+ },
+ "form": {
+ "name": {
+ "title": "Jméno",
+ "description": "Aktualizujte své osobní údaje"
+ },
+ "photo": {
+ "title": "Profilová fotografie",
+ "description": "Nahrajte profilový obrázek"
+ },
+ "currentPassword": {
+ "title": "Aktuální heslo",
+ "description": "Zadejte aktuální heslo pro ověření totožnosti",
+ "option": {
+ "label": "Aktuální heslo",
+ "placeholder": "Zadejte aktuální heslo"
+ }
+ },
+ "newPassword": {
+ "title": "Nové heslo",
+ "description": "Zvolte silné heslo s alespoň 8 znaky",
+ "option": {
+ "newPassword": {
+ "label": "Nové heslo",
+ "placeholder": "Zadejte nové heslo"
},
+ "confirm": {
+ "label": "Potvrzení hesla",
+ "placeholder": "Potvrďte nové heslo"
+ }
+ }
+ },
+ "deleteAccount": {
+ "title": "Smazat účet",
+ "description": "Tato akce je trvalá a nelze ji vrátit zpět"
+ }
+ },
+ "team": {
+ "filter": {
+ "placeholder": "Filtrovat podle role",
+ "all": "",
+ "admin": "Administrátor",
+ "member": ""
+ },
+ "table": {
+ "headers": {
+ "email": "Email",
+ "role": "Role",
+ "created": ""
+ }
+ },
+ "addMember": {
+ "title": "Registrace nového člena týmu",
+ "description": "Vytvořte nový uživatelský účet. Po vytvoření bezpečně sdílejte přihlašovací údaje."
+ },
+ "invite": {
+ "title": "Pozvat člena týmu",
+ "description": "Odešlete pozvánku k připojení do vašeho týmu",
+ "email": {
+ "label": "Emailová adresa",
+ "placeholder": "Zadejte emailovou adresu"
+ },
+ "role": {
+ "label": "Role",
+ "placeholder": "Vyberte roli"
+ },
+ "linkLabel": "Odkaz pro pozvánku"
+ }
+ }
+ },
+ "auth": {
+ "common": {
+ "passwordRules": {
+ "length": {
+ "beginning": "Heslo musí být dlouhé alespoň",
+ "highlighted": "8 znaků"
+ },
+ "lowercase": {
+ "beginning": "Heslo musí obsahovat alespoň",
+ "highlighted": "1 malé písmeno"
+ },
+ "match": {
+ "beginning": "Obě hesla se",
+ "highlighted": "musí shodovat"
+ },
+ "number": {
+ "beginning": "Heslo musí obsahovat alespoň",
+ "highlighted": "1 číslo"
+ },
+ "special": {
+ "beginning": "Heslo musí obsahovat alespoň",
+ "highlighted": "1 speciální znak"
+ },
+ "uppercase": {
+ "beginning": "Heslo musí obsahovat alespoň",
+ "highlighted": "1 velké písmeno"
+ }
+ },
+ "form": {
+ "option": {
"email": {
- "errors": {
- "empty": "",
- "invalid": ""
- }
+ "label": "Email",
+ "placeholder": "me@example.com"
},
- "role": {
- "errors": {
- "empty": ""
- }
+ "password": {
+ "label": "Heslo",
+ "placeholder": "********"
+ },
+ "confirmPassword": {
+ "label": "Potvrzení hesla"
}
}
}
+ },
+ "login": {
+ "title": "Vítejte zpět v Checkmate!",
+ "subtitle": "Přihlaste se pro pokračování",
+ "submit": "Přihlásit se",
+ "links": {
+ "forgotPassword": {
+ "text": "Zapomněli jste heslo?",
+ "linkText": "Obnovit heslo"
+ },
+ "register": {
+ "text": "Nemáte účet?",
+ "linkText": "Zaregistrujte se zde"
+ }
+ }
+ },
+ "register": {
+ "title": "Vítejte v Checkmate!",
+ "subtitle": "Zaregistrujte se a začněte",
+ "submit": "Registrovat"
+ },
+ "forgotPassword": {
+ "title": "Zapomněli jste heslo?",
+ "subtitle": "Žádný problém, zašleme vám pokyny k obnovení.",
+ "submit": "Požádat o obnovení",
+ "links": {
+ "login": {
+ "text": "Zpět na",
+ "linkText": "přihlášení"
+ }
+ }
+ },
+ "setNewPassword": {
+ "title": "Obnovte své heslo",
+ "subtitle": "Vaše nové heslo musí být odlišné od dříve použitých hesel."
}
},
- "role": "",
- "changeTeamPassword": {
- "changePasswordMenu": "",
- "title": "",
- "description": "",
- "success": ""
- }
- },
- "monitorState": {
- "paused": "",
- "resumed": "",
- "active": ""
- },
- "menu": {
- "uptime": "",
- "pagespeed": "",
- "infrastructure": "",
- "incidents": "",
- "statusPages": "",
- "maintenance": "",
- "integrations": "",
- "settings": "",
- "support": "",
- "discussions": "",
- "docs": "",
- "changelog": "",
- "profile": "",
- "password": "",
- "team": "",
- "logOut": "",
- "notifications": "",
- "logs": ""
- },
- "settingsEmailUser": "",
- "state": "",
- "statusBreadCrumbsStatusPages": "",
- "statusBreadCrumbsDetails": "",
- "commonSaving": "",
- "navControls": "",
- "incidentsPageTitle": "",
- "passwordPanel": {
- "passwordChangedSuccess": "",
- "passwordInputIncorrect": "",
- "currentPassword": "",
- "enterCurrentPassword": "",
- "newPassword": "",
- "enterNewPassword": "",
- "confirmNewPassword": "",
- "passwordRequirements": "",
- "saving": ""
- },
- "emailSent": "",
- "failedToSendEmail": "",
- "settingsTestEmailSuccess": "",
- "settingsTestEmailFailed": "",
- "settingsTestEmailFailedWithReason": "",
- "settingsTestEmailUnknownError": "",
- "statusMsg": {
- "paused": "",
- "up": "",
- "down": "",
- "pending": ""
- },
- "uptimeGeneralInstructions": {
- "http": "",
- "ping": "",
- "docker": "",
- "port": "",
- "game": "",
- "https": ""
- },
- "common": {
- "appName": "Checkmate",
- "monitoringAgentName": "Capture",
- "buttons": {
- "toggleTheme": "Přepnout mezi světlým a tmavým motivem"
+ "checks": {
+ "selects": {
+ "monitor": {
+ "all": "Všechny monitory"
+ },
+ "status": {
+ "all": "Vše",
+ "down": "Nedostupné",
+ "up": "Dostupné"
+ }
+ },
+ "table": {
+ "empty": "Žádné neúspěšné kontroly v tomto období",
+ "headers": {
+ "statusCode": "Stavový kód",
+ "location": "Umístění"
+ }
+ }
},
- "toasts": {
- "networkError": "Chyba připojení k síti",
- "checkConnection": "Zkontrolujte prosím své připojení k síti",
- "unknownError": "Nastala neznámá chyba"
- }
- },
- "auth": {
"common": {
- "navigation": {
- "continue": "Pokračovat",
- "back": "Zpět"
- },
- "inputs": {
- "email": {
- "label": "E-mail",
- "placeholder": "jan.novak@domena.cz",
- "errors": {
- "empty": "Zadejte prosím e-mailovou adresu",
- "invalid": "Překontrolujte si prosím správnost zadané e-mailové adresy"
- }
+ "monitors": {
+ "actions": {
+ "configure": "Konfigurovat",
+ "delete": "Smazat",
+ "generateToken": "Vygenerovat token",
+ "details": "Podrobnosti",
+ "incidents": "Incidenty",
+ "inviteMember": "Pozvat člena",
+ "openSite": "Otevřít stránku",
+ "pause": "Pozastavit",
+ "resume": "Obnovit"
},
- "password": {
- "label": "Heslo",
- "rules": {
- "length": {
- "beginning": "Heslo musí být dlouhé alespoň",
- "highlighted": "8 znaků"
+ "statBoxes": {
+ "activeFor": "Aktivní po dobu",
+ "certificateExpiry": "Expirace certifikátu",
+ "lastCheck": "Poslední kontrola",
+ "lastResponseTime": "Poslední doba odezvy"
+ },
+ "status": {
+ "down": "nedostupný",
+ "breached": "překročen práh",
+ "initializing": "inicializace",
+ "maintenance": "údržba",
+ "paused": "pozastaveno",
+ "total": "celkem",
+ "up": "dostupný"
+ },
+ "monitorTypes": {
+ "optionDocker": "Docker",
+ "optionGame": "Hra",
+ "optionHttp": "HTTP(S)",
+ "optionPing": "Ping",
+ "optionPort": "Port",
+ "optionPagespeed": "PageSpeed",
+ "optionHardware": "Infrastruktura",
+ "optionGrpc": "gRPC",
+ "optionWebSocket": "WebSocket"
+ }
+ }
+ },
+ "createMonitor": {
+ "form": {
+ "advanced": {
+ "description": "Volitelná nastavení pro pokročilé použití",
+ "option": {
+ "advancedMatching": {
+ "label": "Použít pokročilé porovnávání"
},
- "special": {
- "beginning": "Heslo musí obsahovat alespoň",
- "highlighted": "1 speciální znak"
+ "expectedValue": {
+ "label": "Očekávaná hodnota"
},
- "number": {
- "beginning": "Heslo musí obsahovat alespoň",
- "highlighted": "1 číslo"
+ "jsonPath": {
+ "description": "Tento výraz bude vyhodnocen proti odpovědi ve formátu JSON a výsledek bude použit k porovnání s očekávanou hodnotou. Dokumentaci dotazovacího jazyka naleznete na jmespath.org.",
+ "label": "Výraz JSONPath"
},
- "uppercase": {
- "beginning": "Heslo musí obsahovat alespoň",
- "highlighted": "1 velké písmeno"
+ "matchMethod": {
+ "label": "Metoda porovnání",
+ "equal": "",
+ "include": "",
+ "regex": ""
+ }
+ },
+ "title": "Pokročilá nastavení"
+ },
+ "frequency": {
+ "description": "Jak často chcete kontrolovat stav tohoto monitoru?",
+ "option": {
+ "frequency": {
+ "label": "Frekvence kontroly",
+ "value": {
+ "fifteenMinutes": "15 minut",
+ "fifteenSeconds": "",
+ "fiveMinutes": "5 minut",
+ "fourMinutes": "",
+ "oneMinute": "",
+ "tenMinutes": "10 minut",
+ "thirtyMinutes": "30 minut",
+ "thirtySeconds": "",
+ "threeMinutes": "",
+ "twoMinutes": ""
+ }
+ }
+ },
+ "title": "Frekvence kontroly"
+ },
+ "general": {
+ "option": {
+ "container": {
+ "label": "Název/ID kontejneru",
+ "placeholder": "my-app nebo abcd1234"
+ },
+ "host": {
+ "label": "Hostitel",
+ "placeholder": "192.168.1.100 nebo example.com"
+ },
+ "name": {
+ "label": "Zobrazovaný název",
+ "placeholder": "např. Moje stránka"
+ },
+ "secret": {
+ "label": "Autorizační tajný klíč",
+ "placeholder": "Zadejte svůj tajný klíč"
+ },
+ "url": {
+ "label": "URL",
+ "placeholder": "https://www.google.com"
+ },
+ "game": {
+ "label": "",
+ "placeholder": ""
},
- "lowercase": {
- "beginning": "Heslo musí obsahovat alespoň",
- "highlighted": "1 malé písmeno"
+ "port": {
+ "label": "Port ke sledování",
+ "placeholder": "80"
},
- "match": {
- "beginning": "Obě hesla se",
- "highlighted": "musí shodovat"
+ "grpcServiceName": {
+ "label": "Název služby",
+ "placeholder": "např. my.service.v1 (nechte prázdné pro celkový stav)"
+ },
+ "wsUrl": {
+ "label": "WebSocket URL",
+ "placeholder": "wss://example.com/socket"
}
},
- "errors": {
- "empty": "Zadejte prosím heslo",
- "length": "Heslo musí být dlouhé alespoň 8 znaků",
- "uppercase": "Heslo musí obsahovat alespoň 1 velké písmeno",
- "lowercase": "Heslo musí obsahovat alespoň 1 malé písmeno",
- "number": "Heslo musí obsahovat alespoň 1 číslo",
- "special": "Heslo musí obsahovat alespoň 1 speciální znak",
- "incorrect": "Zadané heslo neodpovídá tomu, co bylo nastaveno"
+ "title": "Obecná nastavení",
+ "description": {
+ "http": "Zadejte URL nebo IP adresu ke sledování (např. https://example.com/ nebo 192.168.1.100) a přidejte jasný zobrazovaný název, který se zobrazí na přehledu.",
+ "ping": "",
+ "port": "",
+ "docker": "",
+ "game": "",
+ "pagespeed": "Sledujte výkon načítání stránky, metriky Core Web Vitals a hodnocení optimalizace vašeho webu.",
+ "grpc": "Zadejte název hostitele a port gRPC serveru, volitelně zadejte název služby pro kontrolu stavu a přidejte zobrazovaný název.",
+ "websocket": "Zadejte WebSocket URL ke sledování (např. wss://example.com/socket) a přidejte zobrazovaný název.",
+ "hardware": "Sledujte využití CPU, paměti, disku a teplotu vaší infrastruktury."
}
},
- "passwordConfirm": {
- "label": "Potvrzení hesla",
- "placeholder": "Pro ověření správnosti zadejte heslo ještě jednou",
- "errors": {
- "empty": "Zadejte prosím své heslo ještě jednou, aby mohla být potvrzena jeho správnost (odhalí překlepy)",
- "different": "Zadaná hesla se liší, takže je nejspíše jedno z nich špatně zapsané"
- }
+ "ignoreTls": {
+ "description": "Nastavte ověřování TLS/SSL certifikátů pro HTTPS připojení.",
+ "option": {
+ "tls": {
+ "label": "Ignorovat chyby TLS/SSL"
+ }
+ },
+ "title": "Nastavení TLS/SSL"
+ },
+ "incidents": {
+ "description": "Klouzavé okno se používá k určení, kdy je monitor nedostupný. Stav monitoru se změní pouze tehdy, když procento kontrol v klouzavém okně dosáhne zadané hodnoty.",
+ "option": {
+ "checks": {
+ "label": "Počet kontrol v klouzavém okně"
+ },
+ "percentage": {
+ "label": "Jaké procento kontrol v klouzavém okně musí selhat/uspět, než se změní stav monitoru?"
+ }
+ },
+ "title": "Incidenty"
},
- "firstName": {
- "label": "Jméno",
- "placeholder": "Jan",
- "errors": {
- "empty": "Zadejte prosím své křestní jméno",
- "length": "Jméno se musí vejít do 50 znaků",
- "pattern": "Součástí jména mohou být pouze písmena, mezery apostrofy nebo spojovníky"
+ "notifications": {
+ "description": "Vyberte kanály pro oznámení, které chcete použít",
+ "title": "Oznámení"
+ },
+ "type": {
+ "description": "Vyberte typ kontroly, která se má provádět",
+ "optionDockerDescription": "Použijte Docker ke sledování, zda je kontejner spuštěn.",
+ "optionGameDescription": "Sledujte, zda je konkrétní herní server online.",
+ "optionGrpcDescription": "Sledujte gRPC služby pomocí standardního protokolu pro kontrolu stavu.",
+ "optionWebSocketDescription": "Sledujte WebSocket koncové body pro stav připojení a dobu odezvy.",
+ "optionHttpDescription": "Použijte HTTP(S) ke sledování vašeho webu nebo API koncového bodu.",
+ "optionPingDescription": "Použijte ICMP Ping ke sledování, zda je server online.",
+ "optionPortDescription": "Sledujte, zda je konkrétní port na serveru otevřen.",
+ "title": "Typ"
+ },
+ "thresholds": {
+ "title": "Prahové hodnoty upozornění",
+ "description": "Definujte prahové hodnoty, při kterých se mají spouštět upozornění pro tento monitor infrastruktury.",
+ "option": {
+ "cpuThreshold": {
+ "label": "Prahová hodnota upozornění CPU (%)"
+ },
+ "memoryThreshold": {
+ "label": "Prahová hodnota upozornění paměti (%)"
+ },
+ "diskThreshold": {
+ "label": "Prahová hodnota upozornění disku (%)"
+ },
+ "tempThreshold": {
+ "label": "Prahová hodnota upozornění teploty (°C)"
+ }
}
},
- "lastName": {
- "label": "Příjmení",
- "placeholder": "Novák",
- "errors": {
- "empty": "Zadejte prosím své příjmení",
- "length": "Příjmení se musí vejít do 50 znaků",
- "pattern": "Součástí příjmení mohou být pouze písmena, mezery apostrofy nebo spojovníky"
+ "geoChecks": {
+ "title": "Geograficky distribuované kontroly",
+ "description": "Spouštějte kontroly z více geografických lokací pro sledování globální dostupnosti a výkonu.",
+ "option": {
+ "enabled": {
+ "label": "Povolit geograficky distribuované kontroly"
+ },
+ "locations": {
+ "label": "Lokace",
+ "placeholder": "Vyberte lokace",
+ "options": {
+ "EU": "Evropa",
+ "NA": "Severní Amerika",
+ "AS": "Asie",
+ "SA": "Jižní Amerika",
+ "AF": "Afrika",
+ "OC": "Oceánie"
+ }
+ },
+ "interval": {
+ "label": "Interval kontroly",
+ "value": {
+ "fiveMinutes": "5 minut",
+ "tenMinutes": "10 minut",
+ "fifteenMinutes": "15 minut",
+ "thirtyMinutes": "30 minut"
+ }
+ }
}
- }
- },
- "errors": {
- "validation": "Nastala chyba při ověřování dat."
- },
- "fields": {
- "password": {
- "errors": {
- "incorrect": ""
+ },
+ "url": {
+ "title": "IP/URL monitoru na stavové stránce",
+ "description": "Zobrazí IP adresu nebo URL monitoru na veřejné stavové stránce. Pokud je tato možnost zakázána, zobrazí se pouze název monitoru pro ochranu citlivých informací.",
+ "option": {
+ "showURL": {
+ "label": "Zobrazit IP/URL na stavové stránce",
+ "enabled": "Povoleno",
+ "disabled": "Zakázáno"
+ }
}
},
- "role": {
- "errors": {
- "min": ""
+ "stats": {
+ "title": "Historie monitoru",
+ "description": "Vymazat veškerou historii sledování a statistiky vašeho týmu. Tato akce je nevratná.",
+ "buttonText": "Vymazat všechny statistiky",
+ "dialog": {
+ "title": "Vymazat veškerou historii sledování?",
+ "description": "Toto trvale smaže veškerou historii sledování, statistiky a data kontrol vašeho týmu. Tuto akci nelze vrátit zpět.",
+ "confirm": "Ano, vymazat všechny statistiky"
}
}
}
},
- "login": {
- "heading": "Přihlášení",
- "subheadings": {
- "stepOne": "Zadejte svůj e-mail",
- "stepTwo": "Zadejte své heslo"
+ "editUser": {
+ "form": {
+ "roles": {
+ "title": "Role",
+ "description": "Přiřaďte role uživateli. Lze vybrat více rolí."
+ }
},
- "links": {
- "forgotPassword": "Zapomněli jste heslo? Obnovte si ho",
- "register": "Ještě nemáte účet? Zaregistrujte se",
- "forgotPasswordLink": "",
- "registerLink": ""
+ "dialog": {
+ "removeUser": {
+ "title": "Odebrat uživatele",
+ "content": "Opravdu chcete odebrat uživatele {{name}} z vašeho týmu? Tuto akci nelze vrátit zpět."
+ }
+ }
+ },
+ "incidents": {
+ "dialog": {
+ "resolveIncident": {
+ "title": "Vyřešit incident",
+ "option": {
+ "comment": {
+ "label": "Komentář (volitelné)",
+ "placeholder": "Přidejte komentář k vyřešení..."
+ }
+ }
+ },
+ "details": {
+ "analysis": "Analýza incidentu",
+ "comment": "Komentář:",
+ "detailsLabel": "Podrobnosti",
+ "downtime": "Výpadek:",
+ "message": "Zpráva:",
+ "monitor": "Monitor:",
+ "overview": "Přehled",
+ "resolutionDetails": "Podrobnosti řešení",
+ "resolutionType": "Typ:",
+ "resolutionTypes": {
+ "automatic": "Automatický",
+ "manual": "Manuální"
+ },
+ "resolve": "Vyřešit incident",
+ "resolvedAt": "Vyřešeno v:",
+ "resolvedBy": "Vyřešil:",
+ "startedAt": "Začátek:",
+ "status": "Stav:",
+ "statusCode": "Stavový kód:",
+ "timeline": "Časová osa",
+ "title": "Podrobnosti incidentu",
+ "url": "URL:"
+ }
},
- "toasts": {
- "success": "Vítejte zpět",
- "incorrectPassword": "Nesprávné heslo"
+ "filters": {
+ "allMonitors": "Všechny monitory",
+ "monitor": "Monitor",
+ "resolutionType": "Typ řešení",
+ "resolutionTypes": {
+ "manual": "Manuální",
+ "automatic": "Automatický",
+ "all": "Vše"
+ }
},
- "errors": {
- "password": {
- "incorrect": ""
+ "summaryCard": {
+ "activeIncidents": {
+ "title": "Aktivní incidenty",
+ "active_zero": "Žádné aktivní incidenty",
+ "active_one": "{{count}} aktivní incident",
+ "active_other": "{{count}} aktivních incidentů"
+ },
+ "incidentStats": {
+ "avgResolutionTime": "Průměrná doba řešení",
+ "mostAffectedMonitor": "Nejvíce postižený monitor",
+ "title": "Statistiky incidentů",
+ "totalIncidents": "Celkem incidentů"
+ },
+ "latestIncidents": {
+ "title": "Nejnovější incidenty"
}
},
- "welcome": ""
+ "table": {
+ "actions": {
+ "details": "Podrobnosti",
+ "goToMonitor": "Přejít na monitor",
+ "resolveManually": "Vyřešit ručně"
+ },
+ "activeIncidents": "Aktivní incidenty",
+ "headers": {
+ "endTime": "Čas ukončení",
+ "resolutionType": "Typ řešení",
+ "startTime": "",
+ "statusCode": "Stavový kód"
+ },
+ "resolvedIncidents": "Vyřešené incidenty",
+ "status": {
+ "active": "Aktivní",
+ "resolved": "Vyřešeno"
+ }
+ }
},
- "registration": {
- "heading": {
- "superAdmin": "Vytvoření superadministrátora",
- "user": "Registrace"
- },
- "subheadings": {
- "stepOne": "Zadejte své osobní údaje",
- "stepTwo": "Zadejte svůj e-mail",
- "stepThree": "Nastavte si heslo"
+ "infrastructure": {
+ "charts": {
+ "labels": {
+ "cpu": "Využití CPU",
+ "disk": "Využití disku",
+ "memory": "Využití paměti",
+ "netBytesRecv": "{{name}} - přijaté bajty",
+ "netBytesSent": "{{name}} - odeslané bajty",
+ "temp": "Teplota"
+ }
},
- "description": {
- "superAdmin": "Pro začátek vytvořte účet superadministrátora",
- "user": "Zaregistrujte se jako uživatel a požádejte svého superadministrátora, aby vám přidělil oprávnění k hlídačům"
+ "gauges": {
+ "cpu": {
+ "lowerLabel": "Maximální frekvence",
+ "title": "Využití CPU",
+ "upperLabel": "Aktuální frekvence"
+ },
+ "disk": {
+ "lowerLabel": "Volné",
+ "title": "Využití disku {{idx}}",
+ "upperLabel": "Použité"
+ },
+ "memory": {
+ "lowerLabel": "Volné",
+ "title": "Využití paměti",
+ "upperLabel": "Použité"
+ }
},
- "gettingStartedButton": {
- "superAdmin": "Vytvořit účet superadministrátora",
- "user": "Zaregistrovat se jako běžný uživatel"
+ "statBoxes": {
+ "avgCpuTemperature": "",
+ "cpuFrequency": "",
+ "cpuLogical": "",
+ "cpuPhysical": "",
+ "disk": "Disk",
+ "memory": "Paměť",
+ "os": ""
},
- "termsAndPolicies": "Vytvořením účtu souhlasíte s našimi Podmínkami použití (anglicky) a Podmínkami zpracování osobních údajů (anglicky).",
- "links": {
- "login": "Máte již vytvořený účet? Přihlašte se"
+ "table": {
+ "headers": {
+ "cpu": "CPU",
+ "disk": "Disk",
+ "memory": "Paměť"
+ }
},
- "toasts": {
- "success": "Vítejte! Váš účet byl úspěšně vytvořen."
+ "tabs": {
+ "labels": {
+ "network": "",
+ "overview": "Přehled"
+ }
},
- "welcome": ""
+ "fallback": {
+ "actionButton": "Vytvořte monitor!",
+ "checks": "Track the performance of your servers,Identify bottlenecks and optimize usage,Ensure reliability with real-time monitoring",
+ "title": "Monitor infrastruktury slouží k:"
+ }
},
- "forgotPassword": {
- "heading": "Zapomenuté heslo",
- "subheadings": {
- "stepOne": "Nebojte se, zašleme vám pokyny pro obnovení hesla.",
- "stepTwo": "Odkaz pro obnovení hesla byl odeslán na ",
- "stepThree": "Nové heslo se musí lišit od těch, které jste již použili.",
- "stepFour": "Heslo bylo úspěšně obnoveno. Klepněte na tlačítko a dojde k čarovnému přihlášení."
+ "logs": {
+ "tabs": {
+ "diagnostics": "",
+ "logs": "",
+ "queue": ""
},
- "buttons": {
- "openEmail": "Otevřít e-mailovou aplikaci",
- "resetPassword": "Obnovit heslo"
+ "logLevelSelect": {
+ "label": "Úroveň logování"
},
- "imageAlts": {
- "passwordKey": "Ikonka přístupového klíče",
- "email": "Ikonka e-mailu",
- "lock": "Ikonka zámku",
- "passwordConfirm": "Ikonka potvrzeného hesla"
+ "jobQueue": "Fronta úloh",
+ "failedJobs": "Neúspěšné úlohy",
+ "noLogs": "Žádné logy nebyly nalezeny",
+ "metrics": {
+ "jobs": "Úlohy",
+ "activeJobs": "Aktivní úlohy",
+ "failingJobs": "Selhávající úlohy",
+ "totalRuns": "Celkem spuštění",
+ "totalFailures": "Celkem selhání"
},
- "links": {
- "login": "Vrátit se k Přihlášení",
- "resend": "Nedorazil vám e-mail? Klepněte pro opětovné zaslání"
+ "diagnostics": {
+ "stats": {
+ "eventLoopDelay": "Zpoždění smyčky událostí",
+ "uptime": "Doba provozu",
+ "usedHeapSize": "Použitá velikost haldy",
+ "totalHeapSize": "Celková velikost haldy",
+ "osMemoryLimit": "Limit paměti OS"
+ },
+ "gauges": {
+ "heapAllocation": "Alokace haldy",
+ "heapUsage": "Využití haldy",
+ "heapUtilization": "Utilizace haldy",
+ "instantCpuUsage": "Okamžité využití CPU",
+ "availableMemoryPercentage": "% dostupné paměti",
+ "allocatedPercentage": "% alokováno",
+ "usedSPercentage": "% z 1s využito CPU",
+ "total": "Celkem",
+ "used": "Použité"
+ }
},
- "toasts": {
- "sent": "Instrukce vám dorazí na .",
- "emailNotFound": "Nepodařilo se nalézt e-mailovou adresu.",
- "redirect": "Přesměrování proběhne za ...",
- "success": "Heslo bylo úspěšně obnoveno.",
- "error": "Obnova hesla se nepodařila. Zkuste to prosím znovu nebo kontaktujte podporu."
+ "table": {
+ "headers": {
+ "timestamp": "Časové razítko",
+ "level": "Úroveň",
+ "service": "Služba",
+ "method": "Metoda",
+ "monitorId": "ID monitoru",
+ "runCount": "Počet spuštění",
+ "failCount": "Počet selhání",
+ "lastRunAt": "Poslední spuštění",
+ "lockedAt": "Uzamčeno v",
+ "lastFinishedAt": "Naposledy dokončeno",
+ "lastRunTook": "Poslední běh trval",
+ "lastFailedAt": "Poslední selhání",
+ "failReason": "Důvod selhání"
+ }
}
- }
- },
- "errorPages": {
- "serverUnreachable": {
- "toasts": {
- "reconnected": "Podařilo se úspěšně obnovit spojení se serverem",
- "stillUnreachable": "Server je stále nedosažitelný. Zkuste to prosím později."
+ },
+ "maintenanceWindow": {
+ "fallback": {
+ "actionButton": "Vytvořte okno údržby!",
+ "checks": "Mark your maintenance periods,Eliminate any misunderstandings,Stop sending alerts in maintenance windows",
+ "title": "Okno údržby slouží k:"
+ },
+ "table": {
+ "headers": {
+ "nextWindow": "",
+ "repeat": ""
+ }
},
- "alertBox": "Chyba připojení k serveru",
- "description": "Nepodařilo se připojit k serveru. Zkontrolujte si prosím internetové připojení a pokud problém přetrvává, ověřte konfiguraci aplikace Checkmate.",
- "retryButton": {
- "default": "Zkusit se znovu připojit",
- "processing": "Probíhá připojování…"
+ "form": {
+ "general": {
+ "title": "Obecná nastavení",
+ "description": "Nastavte název a možnost opakování pro okno údržby.",
+ "option": {
+ "name": {
+ "label": "Název",
+ "placeholder": "např. Týdenní údržba"
+ },
+ "repeat": {
+ "label": "Opakování"
+ }
+ }
+ },
+ "startDate": {
+ "title": "Datum zahájení",
+ "description": "Vyberte datum zahájení okna údržby.",
+ "option": {
+ "startDate": {
+ "label": "Datum zahájení"
+ }
+ }
+ },
+ "startTime": {
+ "title": "Čas zahájení",
+ "description": "Nastavte čas zahájení a dobu trvání okna údržby. Všechny hodnoty jsou v UTC",
+ "option": {
+ "duration": {
+ "label": "Doba trvání"
+ },
+ "startTime": {
+ "label": "Čas zahájení"
+ }
+ },
+ "monitors": {
+ "title": "Monitory",
+ "description": "Monitory, na které se má okno údržby vztahovat",
+ "option": {
+ "addMonitors": {
+ "label": "Přidat monitory"
+ }
+ }
+ }
+ }
}
- }
- },
- "createNotifications": {
- "title": "",
- "nameSettings": {
- "title": "",
- "description": "",
- "nameLabel": "",
- "namePlaceholder": ""
- },
- "typeSettings": {
- "title": "",
- "description": "",
- "typeLabel": ""
- },
- "emailSettings": {
- "title": "",
- "description": "",
- "emailLabel": "",
- "emailPlaceholder": ""
- },
- "slackSettings": {
- "title": "",
- "description": "",
- "webhookLabel": "",
- "webhookPlaceholder": ""
- },
- "pagerdutySettings": {
- "title": "",
- "description": "",
- "integrationKeyLabel": "",
- "integrationKeyPlaceholder": ""
},
- "discordSettings": {
- "title": "",
- "description": "",
- "webhookLabel": "",
- "webhookPlaceholder": ""
- },
- "webhookSettings": {
- "title": "",
- "description": "",
- "webhookLabel": "",
- "webhookPlaceholder": ""
- },
- "testNotification": "",
- "dialogDeleteTitle": "",
- "dialogDeleteConfirm": ""
- },
- "notificationConfig": {
- "title": "",
- "description": ""
- },
- "monitorStatus": {
- "checkingEvery": "",
- "withCaptureAgent": "",
- "up": "",
- "down": "",
- "paused": ""
- },
- "advancedMatching": "",
- "sendTestNotifications": "",
- "selectAll": "",
- "showAdminLoginLink": "",
- "logsPage": {
- "title": "",
- "description": "",
- "tabs": {
- "queue": "",
- "logs": "",
- "diagnostics": ""
- },
- "toast": {
- "fetchLogsSuccess": ""
- },
- "logLevelSelect": {
- "title": "",
- "values": {
- "all": "",
- "info": "",
- "warn": "",
- "error": "",
- "debug": ""
+ "notifications": {
+ "fallback": {
+ "actionButton": "Vytvořit kanál",
+ "checks": "Alert teams about downtime or performance issues,Let engineers know when incidents happen,Keep administrators informed of system changes",
+ "title": "Kanály oznámení slouží k:"
+ },
+ "form": {
+ "accessToken": {
+ "optionAccessToken": "Přístupový token",
+ "placeholder": "syt_YWxleF9ob2xsaWRheQ_VmtScmV0U2VjcmV0S2V5_abc123"
+ },
+ "address": {
+ "description": "Adresa, na kterou budou zasílána oznámení.",
+ "optionAddress": "Adresa",
+ "placeholderEmail": "example@example.com",
+ "placeholderWebhook": "https://your-server.com/webhook",
+ "title": "Adresa"
+ },
+ "homeServer": {
+ "optionHomeServer": "Domovský server",
+ "placeholder": "example.com"
+ },
+ "matrix": {
+ "description": "Nastavte připojení k domovskému serveru Matrix pro oznámení.",
+ "title": "Konfigurace Matrix"
+ },
+ "notificationName": {
+ "description": "Popisný název kanálu oznámení",
+ "optionName": "Název kanálu",
+ "placeholder": "např. Produkční upozornění",
+ "title": "Název kanálu"
+ },
+ "pagerDuty": {
+ "description": "Váš integrační klíč PagerDuty pro příjem upozornění.",
+ "optionIntegrationKey": "Integrační klíč",
+ "placeholder": "a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6",
+ "title": "Integrační klíč"
+ },
+ "roomId": {
+ "optionRoomId": "ID místnosti",
+ "placeholder": "!abcdefg:matrix.org"
+ },
+ "type": {
+ "description": "Vyberte typ kanálu oznámení, který chcete vytvořit.",
+ "optionType": "Typ",
+ "title": "Typ kanálu"
+ },
+ "telegram": {
+ "title": "Konfigurace Telegramu",
+ "description": "",
+ "optionBotToken": "Token bota",
+ "placeholderBotToken": "123456789:ABCdefGhIJKlmNoPQRsTUVwxyZ",
+ "optionChatId": "ID chatu",
+ "placeholderChatId": "-1001234567890"
+ }
+ },
+ "table": {
+ "headers": {
+ "destination": "Cíl"
+ }
}
- }
- },
- "queuePage": {
- "title": "",
- "refreshButton": "",
- "flushButton": "",
- "jobTable": {
- "title": "",
- "idHeader": "",
- "urlHeader": "",
- "typeHeader": "",
- "activeHeader": "",
- "lockedAtHeader": "",
- "runCountHeader": "",
- "failCountHeader": "",
- "lastRunHeader": "",
- "lastFinishedAtHeader": "",
- "lastRunTookHeader": "",
- "intervalHeader": ""
- },
- "metricsTable": {
- "title": "",
- "metricHeader": "",
- "valueHeader": ""
- },
- "failedJobTable": {
- "title": "",
- "monitorIdHeader": "",
- "monitorUrlHeader": "",
- "failCountHeader": "",
- "failedAtHeader": "",
- "failReasonHeader": ""
- }
- },
- "export": {
- "title": "",
- "success": "",
- "failed": ""
- },
- "monitorActions": {
- "title": "",
- "import": "",
- "export": "",
- "deleteSuccess": "",
- "deleteFailed": "",
- "details": ""
- },
- "settingsPage": {
- "aboutSettings": {
- "labelDevelopedBy": "",
- "labelVersion": "",
- "title": ""
},
- "demoMonitorsSettings": {
- "buttonAddMonitors": "",
- "description": "",
- "title": ""
- },
- "emailSettings": {
- "buttonSendTestEmail": "",
- "description": "",
- "descriptionTransport": "",
- "labelAddress": "",
- "labelConnectionHost": "",
- "labelHost": "",
- "labelIgnoreTLS": "",
- "labelPassword": "",
- "labelPasswordSet": "",
- "labelPool": "",
- "labelPort": "",
- "labelRejectUnauthorized": "",
- "labelRequireTLS": "",
- "labelSecure": "",
- "labelTLSServername": "",
- "labelUser": "",
- "linkTransport": "",
- "placeholderUser": "",
- "title": "",
- "toastEmailRequiredFieldsError": ""
- },
- "pageSpeedSettings": {
- "description": "",
- "labelApiKeySet": "",
- "labelApiKey": "",
- "title": ""
- },
- "saveButtonLabel": "",
- "statsSettings": {
- "clearAllStatsButton": "",
- "clearAllStatsDescription": "",
- "clearAllStatsDialogConfirm": "",
- "clearAllStatsDialogDescription": "",
- "clearAllStatsDialogTitle": "",
- "description": "",
- "labelTTL": "",
- "labelTTLOptional": "",
- "title": ""
- },
- "systemResetSettings": {
- "buttonRemoveAllMonitors": "",
- "description": "",
- "dialogConfirm": "",
- "dialogDescription": "",
- "dialogTitle": "",
- "title": ""
- },
- "timezoneSettings": {
- "description": "",
- "label": "",
- "title": ""
- },
- "title": "",
- "uiSettings": {
- "description": "",
- "labelLanguage": "",
- "labelTheme": "",
- "title": ""
- },
- "urlSettings": {
- "description": "",
- "label": "",
- "selectDisabled": "",
- "selectEnabled": "",
- "title": ""
- },
- "globalThresholds": {
- "title": "",
- "description": ""
- }
- },
- "statusPageCreate": {
- "buttonSave": ""
- },
- "incidentsOptionsHeaderFilterResolved": "",
- "settingsSave": "",
- "statusPageCreateAppearanceTitle": "",
- "confirmPassword": "",
- "monitorHooks": {
- "failureAddDemoMonitors": "",
- "successAddDemoMonitors": ""
- },
- "settingsAppearance": "",
- "settingsDisplayTimezone": "",
- "settingsGeneralSettings": "",
- "incidentsOptionsHeaderTotalIncidents": "",
- "statusPage": {
- "deleteSuccess": "",
- "deleteFailed": "",
- "createSuccess": "",
- "updateSuccess": "",
- "generalSettings": "",
- "contents": "",
- "fallback": {
- "checks": [""],
- "title": "",
- "actionButton": ""
- }
- },
- "testNotificationsDisabled": "",
- "incidentsTableResolvedAt": "",
- "incidentsTableActionResolve": "",
- "checkHooks": {
- "failureResolveOne": "",
- "failureResolveAll": "",
- "failureResolveMonitor": ""
- },
- "checkFormError": "",
- "diagnosticsPage": {
- "diagnosticDescription": "",
- "statsDescription": "",
- "gauges": {
- "heapAllocationTitle": "",
- "heapAllocationSubtitle": "",
- "heapUsageTitle": "",
- "heapUsageSubtitle": "",
- "heapUtilizationTitle": "",
- "heapUtilizationSubtitle": "",
- "instantCpuUsageTitle": "",
- "instantCpuUsageSubtitle": ""
- },
- "stats": {
- "eventLoopDelayTitle": "",
- "uptimeTitle": "",
- "usedHeapSizeTitle": "",
- "totalHeapSizeTitle": "",
- "osMemoryLimitTitle": ""
- }
- },
- "pageSpeedLighthouseAPI": "",
- "time": {
- "threeMinutes": "",
- "fiveMinutes": "",
- "tenMinutes": "",
- "twentyMinutes": "",
- "oneHour": "",
- "oneDay": "",
- "oneWeek": "",
- "fourMinutes": "",
- "oneMinute": "",
- "twoMinutes": "",
- "fifteenSeconds": "",
- "thirtySeconds": ""
- },
- "general": {
- "noOptionsFound": ""
- },
- "infrastructureMonitor": {
- "fallback": {
- "checks": [""],
- "title": "",
- "actionButton": ""
- }
- },
- "maintenanceWindow": {
- "fallback": {
- "checks": [""],
- "title": "",
- "actionButton": ""
- }
- },
- "pageSpeed": {
- "fallback": {
- "checks": [""],
- "title": "",
- "actionButton": ""
- }
- },
- "uptimeMonitor": {
- "fallback": {
- "checks": [""],
- "title": "",
- "actionButton": ""
- }
- },
- "editUserPage": {
- "form": {
- "email": "",
- "firstName": "",
- "lastName": "",
- "role": "",
- "save": ""
- },
- "table": {
- "actionHeader": "",
- "roleHeader": ""
- },
- "title": "",
- "toast": {
- "successUserUpdate": "",
- "validationErrors": ""
- }
- },
- "incidentsPageActionResolveMonitor": "",
- "incidentsPageActionResolveAll": "",
- "matchMethodOptions": {
- "equal": "",
- "equalPlaceholder": "",
- "include": "",
- "includePlaceholder": "",
- "regex": "",
- "regexPlaceholder": "",
- "text": ""
- },
- "monitorType": {
- "docker": {
- "label": "",
- "namePlaceholder": "",
- "placeholder": ""
- },
- "http": {
- "label": "",
- "namePlaceholder": "",
- "placeholder": ""
+ "pageSpeed": {
+ "charts": {
+ "common": {
+ "cls": "Kumulativní posun rozvržení (CLS)",
+ "fcp": "První vykreslení obsahu (FCP)",
+ "lcp": "Největší vykreslení obsahu (LCP)",
+ "si": "Index rychlosti (SI)",
+ "tbt": "Celková doba blokování (TBT)"
+ },
+ "legend": {
+ "title": "Zpráva PageSpeed",
+ "weight": "Váha"
+ },
+ "pie": {
+ "title": "Zpráva o výkonu"
+ }
+ },
+ "table": {
+ "headers": {
+ "pageSpeedScore": "Hodnocení PageSpeed"
+ }
+ },
+ "fallback": {
+ "actionButton": "Vytvořte monitor!",
+ "checks": "Report on the user experience of a page,Help analyze webpage speed,Give suggestions on how the page can be improved",
+ "title": "Monitor PageSpeed slouží k:"
+ }
},
- "ping": {
- "label": "",
- "namePlaceholder": "",
- "placeholder": ""
+ "settings": {
+ "form": {
+ "timezone": {
+ "title": "Zobrazované časové pásmo",
+ "description": "Vyberte časové pásmo používané pro zobrazení dat a časů v celé aplikaci.",
+ "option": {
+ "timezone": {
+ "label": "Zobrazované časové pásmo"
+ }
+ }
+ },
+ "ui": {
+ "title": "Vzhled",
+ "description": "Přepínejte mezi světlým a tmavým režimem, měňte jazyk nebo upravte typ zobrazení grafů.",
+ "option": {
+ "theme": {
+ "label": "Režim motivu",
+ "light": "Světlý",
+ "dark": "Tmavý"
+ },
+ "language": {
+ "label": "Jazyk"
+ },
+ "chartType": {
+ "label": "Typ grafu",
+ "histogram": "Histogram",
+ "heatmap": "Heatmapa"
+ }
+ }
+ },
+ "pagespeed": {
+ "title": "Klíč Google PageSpeed API",
+ "description": "Zadejte klíč Google PageSpeed API pro aktivaci sledování Google PageSpeed. Klikněte na Obnovit pro aktualizaci klíče.",
+ "option": {
+ "apiKey": {
+ "label": "Klíč PageSpeed API",
+ "labelSet": "Klíč API je nastaven. Klikněte na Obnovit pro jeho změnu.",
+ "placeholder": "Zadejte klíč Google PageSpeed API"
+ }
+ }
+ },
+ "url": {
+ "title": "IP/URL monitoru na stavové stránce",
+ "description": "Zobrazí IP adresu nebo URL monitoru na veřejné stavové stránce. Pokud je tato možnost zakázána, zobrazí se pouze název monitoru pro ochranu citlivých informací.",
+ "option": {
+ "showURL": {
+ "label": "Zobrazit IP/URL na stavové stránce",
+ "enabled": "Povoleno",
+ "disabled": "Zakázáno"
+ }
+ }
+ },
+ "stats": {
+ "title": "Historie monitoru",
+ "description": "Vymazat veškerou historii sledování a statistiky vašeho týmu. Tato akce je nevratná.",
+ "option": {
+ "clear": {
+ "label": "Vymazat všechny statistiky. Tato akce je nevratná."
+ }
+ },
+ "dialog": {
+ "title": "Vymazat veškerou historii sledování?",
+ "description": "Tuto akci nelze vrátit zpět"
+ }
+ },
+ "retention": {
+ "title": "Uchovávání kontrol",
+ "description": "Nastavte, jak dlouho se mají uchovávat data kontrol před automatickým vymazáním.",
+ "option": {
+ "days": {
+ "label": "Doba uchovávání (dny)",
+ "unlimited": "Neomezeně"
+ }
+ }
+ },
+ "thresholds": {
+ "title": "Globální prahové hodnoty",
+ "description": "Nastavte globální prahové hodnoty CPU, paměti, disku a teploty pro sledování infrastruktury. Platí pro všechny monitory infrastruktury, pokud nejsou přepsány.",
+ "option": {
+ "cpu": {
+ "label": "Prahová hodnota CPU (%)",
+ "placeholder": "1 - 100"
+ },
+ "memory": {
+ "label": "Prahová hodnota paměti (%)",
+ "placeholder": "1 - 100"
+ },
+ "disk": {
+ "label": "Prahová hodnota disku (%)",
+ "placeholder": "1 - 100"
+ },
+ "temperature": {
+ "label": "Prahová hodnota teploty (°C)",
+ "placeholder": "1 - 150"
+ }
+ }
+ },
+ "email": {
+ "title": "Nastavení emailu",
+ "description": "Nastavte emailovou konfiguraci pro váš systém. Používá se k odesílání oznámení a upozornění.",
+ "descriptionTransport": "",
+ "descriptionTransportLink": "Zobrazit specifikace zde",
+ "option": {
+ "host": {
+ "label": "Emailový hostitel - název hostitele nebo IP adresa pro připojení",
+ "placeholder": "smtp.gmail.com"
+ },
+ "port": {
+ "label": "Emailový port - port pro připojení",
+ "placeholder": "587"
+ },
+ "address": {
+ "label": "Emailová adresa - použitá pro ověření",
+ "placeholder": "you@example.com"
+ },
+ "user": {
+ "label": "Emailový uživatel - uživatelské jméno pro ověření, přepíše emailovou adresu, pokud je zadáno",
+ "placeholder": "Nechte prázdné, pokud není vyžadováno"
+ },
+ "password": {
+ "label": "Emailové heslo - heslo pro ověření",
+ "labelSet": "Heslo je nastaveno. Klikněte na Obnovit pro jeho změnu.",
+ "placeholder": "Zadejte heslo"
+ },
+ "tlsServername": {
+ "label": "Název TLS serveru - volitelný název hostitele pro TLS validaci, když je hostitel IP",
+ "placeholder": "example.com"
+ },
+ "connectionHost": {
+ "label": "Hostitel emailového připojení - název hostitele pro HELO/EHLO pozdrav",
+ "placeholder": "localhost"
+ },
+ "secure": {
+ "label": "Použít SSL (doporučeno): Šifrovat připojení pomocí SSL/TLS"
+ },
+ "pool": {
+ "label": "Povolit sdílení připojení: Opakované použití stávajících připojení pro vyšší výkon"
+ },
+ "ignoreTLS": {
+ "label": "Zakázat STARTTLS: Nepoužívat TLS, i když to server podporuje"
+ },
+ "requireTLS": {
+ "label": "Vynutit STARTTLS: Vyžadovat upgrade TLS, selhat pokud není podporován"
+ },
+ "rejectUnauthorized": {
+ "label": "Odmítnout neplatné certifikáty: Odmítnout připojení se sebou podepsanými nebo nedůvěryhodnými certifikáty"
+ }
+ }
+ },
+ "demoMonitors": {
+ "title": "Ukázkové monitory",
+ "description": "Přidejte ukázkové monitory pro demonstrační účely."
+ },
+ "removeMonitors": {
+ "title": "Obnovení systému",
+ "description": "Odeberte všechny monitory z vašeho systému.",
+ "dialog": {
+ "title": "Odebrat všechny monitory?",
+ "description": "Tuto akci nelze vrátit zpět."
+ }
+ },
+ "exportMonitors": {
+ "title": "Exportovat monitory"
+ },
+ "importExportMonitors": {
+ "title": "Import / Export monitorů",
+ "description": "Importujte nebo exportujte data monitorů jako JSON soubor pro zálohu nebo přenos."
+ },
+ "about": {
+ "title": "O aplikaci",
+ "developedBy": "Vyvinulo Bluewave Labs"
+ },
+ "validation": {
+ "errorMessage": "Opravte prosím následující chyby validace:"
+ }
+ }
},
- "port": {
- "label": "",
- "namePlaceholder": "",
- "placeholder": ""
+ "statusPages": {
+ "deleteSuccess": "Stavová stránka byla úspěšně smazána",
+ "fallback": {
+ "title": "Stavová stránka slouží k:",
+ "checks": "Communicate system status to users and stakeholders,Display real-time uptime information publicly,Build trust with transparent service monitoring,Reduce support requests during incidents",
+ "actionButton": "Vytvořte stavovou stránku!"
+ },
+ "monitorsList": {
+ "chartTypeHeatmap": "Heatmapa",
+ "chartTypeHistogram": "Histogram",
+ "noData": "Žádná data nejsou k dispozici",
+ "infrastructure": {
+ "title": "Infrastruktura",
+ "cpu": "CPU",
+ "memory": "RAM",
+ "memoryText": "Paměť",
+ "disk": "Disk",
+ "usage": "Využití",
+ "used": "Použité",
+ "total": "Celkem"
+ },
+ "uptime": {
+ "title": "Dostupnost",
+ "responseTime": "Doba odezvy"
+ }
+ },
+ "statusBar": {
+ "allDown": "Všechny systémy jsou nedostupné",
+ "allUp": "Všechny systémy fungují",
+ "degraded": "Některé systémy mají problémy",
+ "unknown": "Nelze určit stav systému"
+ },
+ "table": {
+ "headers": {
+ "name": "Název stavové stránky",
+ "url": "Veřejná URL"
+ },
+ "published": "Publikováno",
+ "unpublished": "Nepublikováno"
+ },
+ "title": "Stavové stránky",
+ "details": {
+ "empty": {
+ "title": "Zatím zde nic není",
+ "addMonitor": "Přidejte monitor pro začátek"
+ }
+ },
+ "form": {
+ "access": {
+ "title": "Přístup",
+ "description": "Pokud je vaše stavová stránka připravena, můžete ji označit jako publikovanou.",
+ "option": {
+ "published": {
+ "name": "Publikováno a viditelné pro veřejnost"
+ }
+ }
+ },
+ "basicInfo": {
+ "title": "Základní informace",
+ "description": "Zadejte název společnosti a subdoménu, na kterou stavová stránka odkazuje.",
+ "option": {
+ "name": {
+ "label": "Název společnosti",
+ "placeholder": "Acme s.r.o."
+ },
+ "url": {
+ "label": "Adresa vaší stavové stránky",
+ "placeholder": "moje-stavova-stranka"
+ }
+ }
+ },
+ "monitors": {
+ "title": "Monitory",
+ "description": "Vyberte monitory, které se mají zobrazit na vaší stavové stránce.",
+ "noMonitors": "Žádné monitory nebyly vybrány",
+ "option": {
+ "monitors": {
+ "label": "Vybrat monitory",
+ "placeholder": "Hledejte a vyberte monitory..."
+ }
+ }
+ },
+ "timezone": {
+ "title": "Časové pásmo",
+ "description": "Vyberte časové pásmo, ve kterém se bude zobrazovat stavová stránka.",
+ "option": {
+ "timezone": {
+ "label": "Časové pásmo",
+ "placeholder": "Vyberte časové pásmo..."
+ }
+ }
+ },
+ "appearance": {
+ "title": "Vzhled",
+ "description": "Definujte výchozí vzhled vaší veřejné stavové stránky.",
+ "option": {
+ "logo": {
+ "label": "Logo"
+ },
+ "color": {
+ "label": "Barva značky"
+ }
+ }
+ },
+ "features": {
+ "title": "Funkce",
+ "description": "Nastavte, jaké informace se zobrazí na stavové stránce.",
+ "option": {
+ "showCharts": {
+ "label": "Zobrazit grafy doby odezvy"
+ },
+ "showUptimePercentage": {
+ "label": "Zobrazit procento dostupnosti"
+ },
+ "showAdminLoginLink": {
+ "label": "Zobrazit odkaz pro přihlášení administrátora"
+ },
+ "showInfrastructure": {
+ "label": "Zobrazit metriky infrastruktury"
+ }
+ }
+ }
+ }
},
- "game": {
- "label": "",
- "namePlaceholder": "",
- "placeholder": ""
+ "uptime": {
+ "filters": {
+ "search": {
+ "placeholder": "Hledat monitory..."
+ }
+ },
+ "table": {
+ "headers": {
+ "responseTime": "Doba odezvy"
+ }
+ },
+ "fallback": {
+ "actionButton": "Vytvořte monitor!",
+ "checks": "Check if websites or servers are online & responsive,Alert teams about downtime or performance issues,Monitor HTTP endpoints, pings, containers & ports,Track historical uptime and reliability trends",
+ "title": "Monitor dostupnosti slouží k:"
+ }
}
- },
- "uptimeAdvancedMatching": {
- "jsonPath": ""
- },
- "bytesPerSecond": "",
- "bytesReceived": "",
- "bytesSent": "",
- "chooseGame": "",
- "createMonitorPage": {
- "incidentConfigDescription": "",
- "incidentConfigStatusWindowLabel": "",
- "incidentConfigStatusWindowThresholdLabel": "",
- "incidentConfigTitle": "",
- "incidentConfigDescriptionV2": "",
- "incidentConfigStatusCheckNumber": "",
- "intervalTitle": "",
- "intervalDescription": ""
- },
- "dataRate": "",
- "dataReceived": "",
- "dataSent": "",
- "details": "",
- "drops": "",
- "errors": "",
- "errorsIn": "",
- "errorsOut": "",
- "gameServerMonitoring": "",
- "gameServerMonitoringDescription": "",
- "network": "",
- "networkDrops": "",
- "networkErrors": "",
- "networkInterface": "",
- "noNetworkStatsAvailable": "",
- "packetsPerSecond": "",
- "packetsReceived": "",
- "packetsReceivedRate": "",
- "packetsSent": "",
- "rate": "",
- "selectInterface": ""
+ }
}
diff --git a/client/src/locales/de.json b/client/src/locales/de.json
index fd39183785..34755aabaa 100644
--- a/client/src/locales/de.json
+++ b/client/src/locales/de.json
@@ -1,1140 +1,1305 @@
{
- "submit": "Absenden",
- "title": "Titel",
- "distributedStatusHeaderText": "Echtzeit Abdeckung",
- "distributedStatusSubHeaderText": "Genutzt von Millionen von Geräten weltweit, siehst Du die Systemleistung nach globaler Region, Land oder Stadt",
- "settingsDisabled": "Inaktiv",
- "settingsSuccessSaved": "Einstellungen erfolgreich gespeichert",
- "settingsFailedToSave": "Fehler beim Speichern der Einstellungen",
- "settingsStatsCleared": "Statistiken gelöscht",
- "settingsFailedToClearStats": "Fehler beim löschen der Statistiken",
- "settingsMonitorsDeleted": "Alle Monitore erfolgreich gelöscht.",
- "settingsFailedToDeleteMonitors": "Fehler beim Löschen aller Monitore",
- "starPromptTitle": "Stern vergeben",
- "starPromptDescription": "Sieh dir die neuesten Veröffentlichungen an und hilf der Community auf GitHub",
- "https": "HTTPS",
- "http": "HTTP",
- "monitor": "monitor",
- "aboutus": "Über uns",
- "now": "Jetzt",
- "delete": "Löschen",
- "configure": "Einstellungen",
- "responseTime": "Antwortzeit",
- "ms": "ms",
- "bar": "Bar",
- "area": "Bereich",
- "country": "Land",
- "city": "Stadt",
- "response": "Antwort",
- "monitorStatusUp": "Monitor {name} ({url}) ist jetzt ONLINE und antwortet",
- "monitorStatusDown": "Monitor {name} ({url}) ist jetzt OFFLINE und antwortet nicht",
- "webhookSendSuccess": "Webhook-Benachrichtigung erfolgreich gesendet",
- "webhookSendError": "Fehler beim Senden der Webhook-Benachrichtigung an {platform}",
- "webhookUnsupportedPlatform": "Nicht unterstützte Plattform: {platform}",
- "distributedRightCategoryTitle": "Monitor",
- "distributedStatusServerMonitors": "Server Monitore",
- "distributedStatusServerMonitorsDescription": "Überwache den Status der zugehörigen Server",
- "distributedUptimeCreateSelectURL": "Hier kannst Du die URL und Typ des Hosts auswählen",
- "distributedUptimeCreateChecks": "Durchzuführende Prüfungen",
- "distributedUptimeCreateChecksDescription": "Du kannst jederzeit Überprüfungen hinzufügen oder entfernen, nachdem Du Deine Seite hinzugefügt hast.\n",
- "distributedUptimeCreateIncidentNotification": "Ereignisbenachrichtigungen",
- "distributedUptimeCreateIncidentDescription": "Wenn es ein Ereignis gibt, benachrichtige die Benutzer.",
- "distributedUptimeCreateAdvancedSettings": "Erweiterte Einstellungen",
- "distributedUptimeDetailsNoMonitorHistory": "Es gibt noch keine Überprüfungshistorie für diesen Monitor.",
- "distributedUptimeDetailsStatusHeaderUptime": "Uptime:",
- "distributedUptimeDetailsStatusHeaderLastUpdate": "Zuletzt aktualisiert",
- "notifications": {
- "enableNotifications": "Aktiviere {{platform}} Benachrichtigungen\n",
- "testNotification": "Test Benachrichtigung",
- "addOrEditNotifications": "Benachrichtigungen hinzufügen oder bearbeiten",
- "slack": {
- "label": "Slack",
- "description": "Um Slack-Benachrichtigungen zu aktivieren, erstelle eine Slack-App und aktiviere eingehende Webhooks. Danach gib einfach die Webhook-URL hier ein.",
- "webhookLabel": "Webhook URL",
- "webhookPlaceholder": "https://hooks.slack.com/services/...",
- "webhookRequired": "Slack webhook URL wird benötigt"
- },
- "discord": {
- "label": "Discord",
- "description": "Um Daten von Checkmate an einen Discord-Kanal über Discord-Benachrichtigungen mithilfe von Webhooks zu senden, kannst Du die eingehenden Webhooks von Discord verwenden.",
- "webhookLabel": "Discord Webhook URL",
- "webhookPlaceholder": "https://discord.com/api/webhooks/...",
- "webhookRequired": "Discord webhook URL wird benötigt"
+ "common": {
+ "auth": {
+ "roles": {
+ "admin": "Admin",
+ "demo": "Demo",
+ "superadmin": "Super-Admin",
+ "user": "Benutzer"
+ }
},
- "telegram": {
- "label": "Telegram",
- "description": "Um Telegram-Benachrichtigungen zu aktivieren, erstelle einen Telegram-Bot mit BotFather, einem offiziellen Bot zum Erstellen und Verwalten von Telegram-Bots. Dann hole dir das API-Token und die Chat-ID und notiere sie hier.",
- "tokenLabel": "Dein bot token",
- "tokenPlaceholder": "123456:ABC-DEF1234ghIkl-zyx57W2v1u123ew11",
- "chatIdLabel": "Deine Chat ID",
- "chatIdPlaceholder": "-1001234567890",
- "fieldsRequired": "Telegram token und Chat-ID werden benötigt"
+ "alerts": {
+ "pageSpeedApiKey": {
+ "content": "Warnung: Sie haben noch keinen Google PageSpeed API-Schlüssel hinzugefügt. Besuchen Sie die Einstellungen, um einen hinzuzufügen. Ohne diesen funktioniert der PageSpeed-Monitor nicht."
+ }
},
- "webhook": {
- "label": "Webhooks",
- "description": "Du kannst einen benutzerdefinierten Webhook einrichten, um Benachrichtigungen zu erhalten, wenn Ereignisse auftreten.",
- "urlLabel": "Webhook URL",
- "urlPlaceholder": "https://your-server.com/webhook",
- "urlRequired": "Webhook URL wird benötigt"
+ "appName": "Checkmate",
+ "breadcrumbs": {
+ "details": "Details",
+ "home": "Startseite"
},
- "testNotificationDevelop": "Testbenachrichtigung 2",
- "integrationButton": "Benachrichtigungsintegration",
- "testSuccess": "Testbenachrichtigung erfolgreich gesendet!",
- "testFailed": "Senden der Testbenachrichtigung fehlgeschlagen",
- "unsupportedType": "Nicht unterstützter Benachrichtigungstyp",
- "networkError": "Netzwerkfehler aufgetreten",
- "fallback": {
- "title": "Ein Benachrichtigungskanal wird verwendet, um:",
- "checks": [
- "Teams über Ausfallzeiten oder Leistungsprobleme informieren",
- "Informieren Sie Techniker über Vorfälle",
- "Informieren Sie Administratoren über Systemänderungen"
- ],
- "actionButton": "Lassen Sie uns Ihren ersten Benachrichtigungskanal erstellen!"
+ "buttons": {
+ "addMember": "Mitglied hinzufügen",
+ "cancel": "Abbrechen",
+ "close": "Schließen",
+ "configure": "Konfigurieren",
+ "confirm": "Bestätigen",
+ "create": "Erstellen",
+ "delete": "Löschen",
+ "generateToken": "Token generieren",
+ "incidents": "Vorfälle",
+ "inviteMember": "Mitglied einladen",
+ "pause": "Pausieren",
+ "resume": "Fortsetzen",
+ "save": "Speichern",
+ "sendInvite": "Einladung senden",
+ "test": "Testen",
+ "testNotifications": "Benachrichtigungen testen",
+ "toggleTheme": "Schaltet hell und dunkel um",
+ "flushQueue": "Warteschlange leeren",
+ "notFound": "Zum Hauptdashboard",
+ "resetPassword": "Passwort zurücksetzen",
+ "reset": "Zurücksetzen",
+ "clear": "Löschen",
+ "addDemo": "Demo-Monitore hinzufügen",
+ "removeMonitors": "Monitore entfernen",
+ "sendTestEmail": "Test-E-Mail senden",
+ "exportToJSON": "Als JSON exportieren",
+ "importFromJSON": "Aus JSON importieren",
+ "clearFilters": "Filter zurücksetzen",
+ "removeUser": "Benutzer entfernen"
},
- "createButton": "Benachrichtigungskanal erstellen",
- "createTitle": "Benachrichtigungskanal",
- "create": {
- "success": "Benachrichtigung erfolgreich erstellt",
- "failed": "Benachrichtigung konnte nicht erstellt werden"
+ "charts": {
+ "labels": {
+ "averageResponseTime": "Durchschnittliche Antwortzeit",
+ "downtime": "Ausfallzeit",
+ "high": "hoch",
+ "low": "niedrig",
+ "uptime": "Verfügbarkeit"
+ },
+ "histogram": {
+ "avg": "Durchschn.: {{value}} ms",
+ "max": "Max.: {{value}} ms"
+ }
},
- "fetch": {
- "success": "Benachrichtigungen erfolgreich abgerufen",
- "failed": "Abrufen der Benachrichtigungen fehlgeschlagen"
+ "dialogs": {
+ "delete": {
+ "description": "Diese Aktion kann nicht rückgängig gemacht werden.",
+ "title": "Möchten Sie dies wirklich löschen?"
+ }
},
- "delete": {
- "success": "Benachrichtigung erfolgreich gelöscht",
- "failed": "Benachrichtigung konnte nicht gelöscht werden"
+ "labels": {
+ "active": "Aktiv",
+ "paused": "pausiert",
+ "na": "N/A",
+ "resolved": "Gelöst",
+ "responseTime": "Antwortzeit"
},
- "edit": {
- "success": "Benachrichtigung erfolgreich aktualisiert",
- "failed": "Benachrichtigung konnte nicht aktualisiert werden"
+ "form": {
+ "role": {
+ "option": {
+ "role": {
+ "label": "Rollen"
+ }
+ }
+ },
+ "name": {
+ "option": {
+ "firstName": {
+ "label": "Name",
+ "placeholder": "Jordan"
+ },
+ "lastName": {
+ "label": "Zuname",
+ "placeholder": "Ellis"
+ }
+ }
+ },
+ "email": {
+ "option": {
+ "email": {
+ "label": "E-Mail",
+ "placeholder": "you@example.com"
+ }
+ }
+ }
},
- "test": {
- "success": "Test Benachrichtigung erfolgreich gesendet",
- "failed": "Fehler beim senden der Test Benachrichtigung"
+ "table": {
+ "empty": "Nichts vorhanden",
+ "headers": {
+ "actions": "Aktionen",
+ "dateTime": "Datum & Uhrzeit",
+ "message": "Nachricht",
+ "monitor": "Monitor",
+ "monitorId": "Monitor-ID",
+ "name": "Name",
+ "status": "Status",
+ "type": "Art",
+ "url": "URL",
+ "interval": "Intervall",
+ "active": "Aktiv",
+ "responseTime": "Antwortzeit"
+ }
}
},
- "testLocale": "testLocale",
- "add": "Hinzufügen",
- "monitors": "Monitore",
- "distributedUptimeStatusCreateStatusPage": "Statusseite",
- "distributedUptimeStatusCreateStatusPageAccess": "Zugriff",
- "distributedUptimeStatusCreateStatusPageReady": "Wenn deine Statusseite bereit ist, kannst du sie als veröffentlicht markieren.",
- "distributedUptimeStatusBasicInfoHeader": "Grundlegende Informationen",
- "distributedUptimeStatusBasicInfoDescription": "Definiere den Firmennamen und die Subdomain, auf die deine Statusseite verweist.",
- "distributedUptimeStatusLogoHeader": "Logo",
- "distributedUptimeStatusLogoDescription": "Lade ein Logo für deine Statusseite hoch",
- "distributedUptimeStatusLogoUploadButton": "Logo hochladen",
- "distributedUptimeStatusStandardMonitorsHeader": "Standardmonitore",
- "distributedUptimeStatusStandardMonitorsDescription": "Füge Standardmonitore zu deiner Statusseite hinzu.",
- "distributedUptimeStatusCreateYour": "Erstelle Dein",
- "distributedUptimeStatusEditYour": "Ändere Dein",
- "distributedUptimeStatusPublishedLabel": "Veröffentlicht und für die Öffentlichkeit sichtbar",
- "distributedUptimeStatusCompanyNameLabel": "Firmenname",
- "distributedUptimeStatusPageAddressLabel": "Die Adresse deiner Statusseite",
- "distributedUptimeStatus30Days": "30 Tage",
- "distributedUptimeStatus60Days": "60 Tage",
- "distributedUptimeStatus90Days": "90 Tage",
- "distributedUptimeStatusPageNotSetUp": "Eine Statusseite ist nicht eingerichtet.",
- "distributedUptimeStatusContactAdmin": "Bitte kontaktiere deinen Administrator",
- "distributedUptimeStatusPageNotPublic": "Diese Statusseite ist nicht öffentlich.",
- "distributedUptimeStatusPageDeleteDialog": "Möchtest du diese Statusseite löschen?",
- "distributedUptimeStatusPageDeleteConfirm": "Ja, Statusseite löschen",
- "distributedUptimeStatusPageDeleteDescription": "Sobald sie gelöscht ist, kann deine Statusseite nicht wiederhergestellt werden.",
- "distributedUptimeStatusDevices": "Geräte",
- "distributedUptimeStatusUpt": "UPT",
- "distributedUptimeStatusUptBurned": "UPT Burned",
- "distributedUptimeStatusUptLogo": "Upt Logo",
- "incidentsTableNoIncidents": "Keine Ereignisse aufgezeichnet",
- "incidentsTablePaginationLabel": "Ereignisse",
- "incidentsTableMonitorName": "Monitor Name",
- "incidentsTableStatus": "Status",
- "incidentsTableDateTime": "Datum & Zeit",
- "incidentsTableStatusCode": "Status Code",
- "incidentsTableMessage": "Nachricht",
- "incidentsOptionsHeader": "Ereignisse für",
- "incidentsOptionsHeaderFilterBy": "Gefiltert nach:",
- "incidentsOptionsHeaderFilterAll": "Alle",
- "incidentsOptionsHeaderFilterDown": "offline",
- "incidentsOptionsHeaderFilterCannotResolve": "Kann nicht aufgelöst werden",
- "incidentsOptionsHeaderShow": "Anzeigen:",
- "incidentsOptionsHeaderLastHour": "Letzte Stunde",
- "incidentsOptionsHeaderLastDay": "Letzter Tag",
- "incidentsOptionsHeaderLastWeek": "Letzte Woche",
- "incidentsOptionsPlaceholderAllServers": "Alle Server",
- "infrastructureCreateYour": "Erstelle dein",
- "infrastructureCreateGeneralSettingsDescription": "Hier kannst du die URL des Hosts auswählen, zusammen mit dem Namen und dem Autorisierungs-token, um eine Verbindung zum Server-Agenten herzustellen.",
- "infrastructureServerRequirement": "Der Server, den du überwachst, muss die folgende Software ausführen:",
- "infrastructureCustomizeAlerts": "Benachrichtigungen anpassen",
- "infrastructureAlertNotificationDescription": "Sende eine Benachrichtigung an Benutzer, wenn Schwellenwerte einen bestimmten Prozentsatz überschreiten.",
- "infrastructureCreateMonitor": "Erstelle Infrastrukturmonitor",
- "infrastructureProtocol": "Protokoll",
- "infrastructureServerUrlLabel": "Server URL",
- "infrastructureDisplayNameLabel": "Anzeigename",
- "infrastructureAuthorizationSecretLabel": "Autorisierungs-token",
- "gb": "GB",
- "mb": "MB",
- "mem": "Speicher",
- "memoryUsage": "Speicher Nutzung",
- "cpu": "CPU",
- "cpuUsage": "CPU Nutzung",
- "cpuTemperature": "CPU Temperatur",
- "diskUsage": "Disk benutzt",
- "used": "benutzt",
- "total": "Total",
- "cores": "Kerne",
- "frequency": "Frequenz",
- "status": "Status",
- "cpuPhysical": "CPU (Physical)",
- "cpuLogical": "CPU (Logical)",
- "cpuFrequency": "CPU Frequenz",
- "avgCpuTemperature": "Durchschn. CPU Termperatur",
- "memory": "Speicher",
- "disk": "Disk",
- "uptime": "Uptime",
- "os": "OS",
- "host": "Host",
- "actions": "Aktionen",
- "integrations": "Integrationen",
- "integrationsPrism": "Verbinde Prism mit deinem favorisierten Gerät",
- "integrationsSlack": "Slack",
- "integrationsSlackInfo": "Verbinde dich mit Slack und sieh Ereignisse in einem Kanal",
- "integrationsDiscord": "Discord",
- "integrationsDiscordInfo": "Verbinde dich mit Discord und sieh Ereignisse direkt in einem Kanal",
- "integrationsZapier": "Zapier",
- "integrationsZapierInfo": "Sende alle Ereignisse an Zapier und sieh sie dann überall",
- "commonSave": "Speichern",
- "createYour": "Erstelle Deinen",
- "createMonitor": "Erstelle Monitor",
- "pause": "Pausieren",
- "resume": "Weiter",
- "editing": "Bearbeiten...",
- "url": "URL",
- "access": "Zugriff",
- "timezone": "Zeitzone",
- "features": "Funktionen",
- "administrator": "Administrator?",
- "loginHere": "Hier anmelden",
- "displayName": "Anzeigename",
- "urlMonitor": "zu überwachende URL",
- "portToMonitor": "zu überwachender Port",
- "websiteMonitoring": "Websiten-Überwachung",
- "websiteMonitoringDescription": "Verwende HTTP(s), um deine Website oder API-Endpunkt zu überwachen.",
- "pingMonitoring": "Ping-Überwachung",
- "pingMonitoringDescription": "Überprüfe, ob dein Server verfügbar ist oder nicht.",
- "dockerContainerMonitoring": "Docker-Container-Überwachung",
- "dockerContainerMonitoringDescription": "Überprüfe, ob dein Docker-Container läuft oder nicht.",
- "portMonitoring": "Port-Überwachung",
- "portMonitoringDescription": "Überprüfe, ob dein Port offen ist oder nicht.",
- "createMaintenanceWindow": "Erstelle Wartungsfenster",
- "createMaintenance": "Erstelle Wartungsfenster",
- "editMaintenance": "Ändere Wartungsfenster",
- "maintenanceWindowName": "Name des Wartungsfensters",
- "friendlyNameInput": "Freundlicher Name",
- "friendlyNamePlaceholder": "Wartung um __ : __ für ___ Minuten",
- "maintenanceRepeat": "Wartungsfenster wiederholen",
- "maintenance": "Wartungsfenster",
- "duration": "Dauer",
- "addMonitors": "Monitor hinzufügen",
- "window": "Fenster",
- "cancel": "Abbrechen",
- "message": "Nachricht",
- "low": "niedrig",
- "high": "hoch",
- "statusCode": "Status Code",
- "date&Time": "Datum & Zeit",
- "type": "Art",
- "statusPageName": "Name der Statusseite",
- "publicURL": "Öffentliche URL",
- "repeat": "Wiederholen",
- "edit": "Ändern",
- "createA": "Erstelle ein",
- "remove": "Löschen",
- "maintenanceWindowDescription": "Pings werden während dieses Zeitraums nicht gesendet",
- "startTime": "Anfangszeit",
- "timeZoneInfo": "Alle Daten und Zeiten sind in der Zeitzone GMT+0.",
- "monitorsToApply": "Monitore, auf die das Wartungsfenster angewendet werden soll",
- "nextWindow": "Nächstes Fenster",
- "notFoundButton": "Gehe zum Haupt-Dashboard",
- "pageSpeedConfigureSettingsDescription": "Hier kannst du die URL des Hosts auswählen, zusammen mit der Art des Monitors.",
- "monitorDisplayName": "Anzeigename des Monitors",
- "whenNewIncident": "Wenn es ein neues Ereignis gibt,",
- "notifySMS": "Benachrichtige per SMS (kommt bald)",
- "notifyEmails": "Benachrichtige auch per E-Mail an mehrere Adressen (kommt bald)",
- "seperateEmails": "Du kannst mehrere E-Mails mit einem Komma trennen",
- "checkFrequency": "Überprüfungsfrequenz",
- "matchMethod": "Übereinstimmungsmethode",
- "expectedValue": "Erwarteter Wert",
- "deleteDialogTitle": "Möchtest du diesen Monitor wirklich löschen?",
- "deleteDialogDescription": "Sobald dieser Monitor gelöscht ist, kann er nicht wiederhergestellt werden.",
- "pageSpeedMonitor": "PageSpeed-Monitor",
- "shown": "Gezeigt",
- "ago": "vor",
- "companyName": "Name der Firma",
- "pageSpeedDetailsPerformanceReport": "Die Werte sind geschätzt und können variieren.",
- "pageSpeedDetailsPerformanceReportCalculator": "Rechner öffnen",
- "checkingEvery": "Überprüfen alle",
- "statusPageCreateSettings": "Wenn Ihre Statusseite fertig ist, können Sie sie als veröffentlicht markieren.",
- "basicInformation": "Grundlegende Informationen",
- "statusPageCreateBasicInfoDescription": "Definieren Sie den Firmennamen und die Subdomäne, auf die Ihre Statusseite verweist.",
- "statusPageCreateSelectTimeZoneDescription": "Wählen Sie die Zeitzone aus, in der Ihre Statusseite angezeigt wird.",
- "statusPageCreateAppearanceDescription": "Definieren Sie das Standard-Erscheinungsbild Ihrer öffentlichen Statusseite.",
- "statusPageCreateSettingsCheckboxLabel": "Veröffentlicht und für die Öffentlichkeit sichtbar",
- "statusPageCreateBasicInfoStatusPageAddress": "Ihre Statusseitenadresse",
- "statusPageCreateTabsContent": "Statusseitenserver",
- "statusPageCreateTabsContentDescription": "Sie können Ihrer Statusseite beliebig viele Server hinzufügen, die Sie überwachen. Sie die Reihenfolge der Server ändern.",
- "statusPageCreateTabsContentFeaturesDescription": "Mehr Details auf der Statusseite anzeigen",
- "showCharts": "Diagramme anzeigen",
- "showUptimePercentage": "Verfügbarkeitsprozentsatz anzeigen",
- "removeLogo": "Entferne Logo",
- "statusPageStatus": "Eine öffentliche Statusseite ist nicht eingerichtet.",
- "statusPageStatusContactAdmin": "Bitte wenden Sie sich an Ihren Administrator",
- "statusPageStatusNotPublic": "Diese Statusseite ist nicht öffentlich.",
- "statusPageStatusNoPage": "Hier gibt es keine Statusseite.",
- "statusPageStatusServiceStatus": "Dienststatus",
- "deleteStatusPage": "Möchten Sie diese Statusseite löschen?",
- "deleteStatusPageConfirm": "Ja, Statusseite löschen",
- "deleteStatusPageDescription": "Nach dem Löschen kann Ihre Statusseite nicht mehr abgerufen werden.",
- "uptimeCreate": "Der erwartete Wert wird zum Abgleich mit dem Antwortergebnis verwendet und die Übereinstimmung bestimmt den Status.",
- "uptimeCreateJsonPath": "Dieser Ausdruck wird anhand der JSON-Antwortdaten ausgewertet und das Ergebnis wird zum Abgleich mit dem erwarteten Wert verwendet. Siehe",
- "uptimeCreateJsonPathQuery": "für die Dokumentation der Abfragesprache.",
- "maintenanceTableActionMenuDialogTitle": "Möchten Sie dieses Wartungsfenster wirklich entfernen?",
- "infrastructureEditYour": "Bearbeiten Sie Ihre",
- "infrastructureEditMonitor": "Infrastrukturmonitor speichern",
- "infrastructureMonitorCreated": "Infrastrukturmonitor erfolgreich erstellt!",
- "infrastructureMonitorUpdated": "Infrastrukturmonitor erfolgreich aktualisiert!",
- "errorInvalidTypeId": "Ungültiger Benachrichtigungstyp angegeben",
- "errorInvalidFieldId": "Ungültige Feld-ID angegeben",
- "inviteNoTokenFound": "Kein Einladungstoken gefunden",
- "pageSpeedWarning": "Warnung: Sie haben noch keinen Google PageSpeed API-Schlüssel hinzugefügt. Ohne diesen funktioniert der PageSpeed-Monitor nicht.",
- "pageSpeedLearnMoreLink": "Hier klicken",
- "pageSpeedAddApiKey": "um einen API key einzutragen",
- "update": "Update",
- "invalidFileFormat": "Nicht unterstützes Dateiformat",
- "invalidFileSize": "Dateigröße zu groß!",
- "ClickUpload": "Zum Hochladen klicken",
- "DragandDrop": "drag and drop",
- "MaxSize": "Maximalgröße",
- "SupportedFormats": "Unterstützte Formate",
- "FirstName": "Vorname",
- "LastName": "Zuname",
- "EmailDescriptionText": "Dies ist Ihre aktuelle E-Mail-Adresse – sie kann nicht geändert werden.",
- "YourPhoto": "Profilphoto",
- "PhotoDescriptionText": "Dieses Foto wird auf Ihrer Profilseite angezeigt.",
- "save": "Speichern",
- "DeleteDescriptionText": "Dadurch werden das Konto und alle zugehörigen Daten vom Server entfernt. Dieser Vorgang kann nicht rückgängig gemacht werden.",
- "DeleteAccountWarning": "Wenn Sie Ihr Konto löschen, können Sie sich nicht mehr anmelden und alle Ihre Daten werden gelöscht. Dieser Vorgang kann nicht rückgängig gemacht werden.",
- "DeleteWarningTitle": "Account wirklich löschen?",
- "bulkImport": {
- "title": "Massenimport",
- "selectFileTips": "Wählen Sie die CSV-Datei zum Hochladen aus",
- "selectFileDescription": "Sie können unsere Vorlage oder Beispiel herunterladen.",
- "selectFile": "Datei auswählen",
- "parsingFailed": "Parsen fehlgeschlagen",
- "uploadSuccess": "Monitore erfolgreich erstellt!",
- "validationFailed": "Prüfung fehlgeschlagen",
- "noFileSelected": "Keine Datei ausgewählt",
- "fallbackPage": "Importieren Sie eine Datei, um eine Liste von Servern gleichzeitig hochzuladen",
- "invalidFileType": "Ungültiger Dateityp",
- "uploadFailed": "Upload fehlgeschlagen"
- },
- "DeleteAccountTitle": "Account löschen",
- "DeleteAccountButton": "Account löschen",
- "publicLink": "Öffentlicher Link",
- "maskedPageSpeedKeyPlaceholder": "*************************************",
- "reset": "Reset",
- "ignoreTLSError": "TLS/SSL Fehler ignorieren",
- "tlsErrorIgnored": "TLS/SSL Fehler ignoriert",
- "ignoreTLSErrorDescription": "TLS/SSL Fehler ignorieren und Verfügbarkeit weiter prüfen",
- "createNew": "Neu anlegen",
- "greeting": {
- "prepend": "Hallo",
- "append": "Der Nachmittag gehört Ihnen – machen wir ihn episch!",
- "overview": "Hier ist eine Übersicht Ihrer {{type}}-Monitore."
- },
- "roles": {
- "superAdmin": "Super admin",
- "admin": "Admin",
- "teamMember": "Team Mitglied",
- "demoUser": "Demo user"
- },
- "teamPanel": {
- "teamMembers": "Team Mitglied",
- "filter": {
- "all": "Alle",
- "member": "Mitglied"
+ "components": {
+ "imageUpload": {
+ "clickToUpload": "Zum Hochladen klicken",
+ "dragAndDrop": "drag and drop",
+ "supportedFormats": "Unterstützte Formate",
+ "maxSize": "Maximalgröße",
+ "orDragAndDrop": "oder per Drag & Drop",
+ "errors": {
+ "invalidFileSize": "Dateigröße zu groß!",
+ "invalidFileFormat": "Nicht unterstützes Dateiformat"
+ }
},
- "inviteTeamMember": "Team Mirglied einladen",
- "inviteNewTeamMember": "Neues Team Mirglied einladen",
- "inviteDescription": "Wenn Sie ein neues Teammitglied hinzufügen, erhält dieses Zugriff auf alle Monitore.",
- "email": "Email",
- "selectRole": "Rolle auswählen",
- "inviteLink": "Einladungslink",
- "cancel": "Abbrechen",
- "noMembers": "Es gibt keine Team Mitglieder mit dieser Rolle",
- "getToken": "Token holen",
- "emailToken": "E-mail token",
- "table": {
- "name": "Name",
- "email": "Email",
- "role": "Rolle",
- "created": "Angelegt"
+ "headerStatusPageControls": {
+ "publicLink": "Öffentlicher Link"
},
- "addTeamMember": {
- "addMemberMenu": "Teammitglied hinzufügen",
- "title": "Neues Teammitglied registrieren",
- "description": "Einen neuen Benutzer anlegen und Zugangsdaten mit ihm teilen. Diese Methode gibt dem Mitglied direkt Zugriff auf alle Überwachungen.",
- "addButton": "Mitglied hinzufügen"
+ "headerTimeRange": {
+ "labels": {
+ "day": "Tag",
+ "month": "Monat",
+ "recent": "Aktuell",
+ "week": "Woche"
+ },
+ "description": {
+ "recent": "Statistiken der letzten 2 Stunden.",
+ "day": "Statistiken der letzten 24 Stunden.",
+ "week": "Statistiken der letzten 7 Tage.",
+ "month": "Statistiken der letzten 30 Tage."
+ }
},
- "register": "Teammitglied registrieren",
- "registerToast": {
- "success": "Benutzer erstellt, Zugangsdaten auf sichere Weise weitergeben.",
- "dbUserExists": "Der Benutzer existiert bereits.",
- "unknownError": "Unbekannter Fehler aufgetreten."
+ "offlineBanner": {
+ "serverUnreachable": "Server nicht erreichbar",
+ "retry": "Erneut versuchen",
+ "retrying": "Wird erneut versucht...",
+ "reconnected": "Verbindung zum Server wiederhergestellt."
},
- "registerTeamMember": {
- "title": "Teammitglied registrieren",
- "auth": {
- "common": {
- "inputs": {
- "firstName": {
- "errors": {
- "empty": "Bitte einen Namen eingeben",
- "pattern": "Der Name darf nur Buchstaben, Leerzeichen, Apostrophe oder Bindestriche enthalten"
- }
- },
- "lastName": {
- "errors": {
- "empty": "Bitte einen Vornamen eingeben",
- "pattern": "Der Vorname darf nur Buchstaben, Leerzeichen, Apostrophe oder Bindestriche enthalten"
- }
+ "sidebar": {
+ "menu": {
+ "uptime": "Verfügbarkeit",
+ "pagespeed": "Pagespeed",
+ "infrastructure": "Infrastruktur",
+ "notifications": "Benachrichtigungen",
+ "checks": "Checks",
+ "incidents": "Vorfälle",
+ "statusPages": "Statusseite",
+ "maintenance": "Wartung",
+ "logs": "Protokolle",
+ "settings": "Einstellungen"
+ },
+ "bottomMenu": {
+ "support": "Support",
+ "discussions": "Diskussionen",
+ "docs": "Anleitungen",
+ "changelog": "Änderungen"
+ },
+ "accountMenu": {
+ "profile": "Profil",
+ "password": "Passwort",
+ "team": "Team"
+ },
+ "starPrompt": {
+ "title": "Checkmate bewerten",
+ "description": "Entdecken Sie die neuesten Versionen und helfen Sie der Community auf GitHub"
+ },
+ "authFooter": {
+ "navControls": "Steuerungen",
+ "logOut": "Abmelden",
+ "roles": {
+ "superAdmin": "Super-Admin",
+ "admin": "Admin",
+ "user": "Benutzer",
+ "demoUser": "Demo-Benutzer"
+ }
+ }
+ },
+ "starPrompt": {
+ "title": "Checkmate bewerten",
+ "description": "Entdecken Sie die neuesten Versionen und helfen Sie der Community auf GitHub"
+ }
+ },
+ "pages": {
+ "notFound": {
+ "title": "Oh nein! Sie haben Ihr Sushi fallen lassen!",
+ "subtitle": "Entweder existiert die URL nicht oder Sie haben keinen Zugriff darauf."
+ },
+ "account": {
+ "tabs": {
+ "profile": "Profil",
+ "password": "Passwort",
+ "team": "Team"
+ },
+ "form": {
+ "name": {
+ "title": "Name",
+ "description": "Aktualisieren Sie Ihre persönlichen Informationen"
+ },
+ "photo": {
+ "title": "Profilbild",
+ "description": "Laden Sie ein Profilbild hoch"
+ },
+ "currentPassword": {
+ "title": "Aktuelles Passwort",
+ "description": "Geben Sie Ihr aktuelles Passwort ein, um Ihre Identität zu bestätigen",
+ "option": {
+ "label": "Aktuelles Passwort",
+ "placeholder": "Aktuelles Passwort eingeben"
+ }
+ },
+ "newPassword": {
+ "title": "Neues Passwort",
+ "description": "Wählen Sie ein sicheres Passwort mit mindestens 8 Zeichen",
+ "option": {
+ "newPassword": {
+ "label": "Neues Passwort",
+ "placeholder": "Neues Passwort eingeben"
},
+ "confirm": {
+ "label": "Passwort bestätigen",
+ "placeholder": "Neues Passwort bestätigen"
+ }
+ }
+ },
+ "deleteAccount": {
+ "title": "Konto löschen",
+ "description": "Diese Aktion ist dauerhaft und kann nicht rückgängig gemacht werden"
+ }
+ },
+ "team": {
+ "filter": {
+ "placeholder": "Nach Rolle filtern",
+ "all": "Alle",
+ "admin": "Admin",
+ "member": "Mitglied"
+ },
+ "table": {
+ "headers": {
+ "email": "E-Mail",
+ "role": "Rolle",
+ "created": "Angelegt"
+ }
+ },
+ "addMember": {
+ "title": "Neues Teammitglied registrieren",
+ "description": "Erstellen Sie ein neues Benutzerkonto. Teilen Sie die Zugangsdaten nach der Erstellung sicher mit."
+ },
+ "invite": {
+ "title": "Teammitglied einladen",
+ "description": "Senden Sie eine Einladung, Ihrem Team beizutreten",
+ "email": {
+ "label": "E-Mail-Adresse",
+ "placeholder": "E-Mail-Adresse eingeben"
+ },
+ "role": {
+ "label": "Rolle",
+ "placeholder": "Rolle auswählen"
+ },
+ "linkLabel": "Einladungslink"
+ }
+ }
+ },
+ "auth": {
+ "common": {
+ "passwordRules": {
+ "length": {
+ "beginning": "Muß mindestens",
+ "highlighted": "8 Zeichen lang"
+ },
+ "lowercase": {
+ "beginning": "Muß mindestens",
+ "highlighted": "einen Kleinbuchstaben enthalten"
+ },
+ "match": {
+ "beginning": "Passwort und Kennwort bestätigen",
+ "highlighted": "muß übereinstimmen"
+ },
+ "number": {
+ "beginning": "Muß mindestens",
+ "highlighted": "eine Zahl enthalten"
+ },
+ "special": {
+ "beginning": "Muß mindestens",
+ "highlighted": "ein Sonderzeichen enthalten"
+ },
+ "uppercase": {
+ "beginning": "Muß mindestens",
+ "highlighted": "einen Großbuchstaben enthalten"
+ }
+ },
+ "form": {
+ "option": {
"email": {
- "errors": {
- "empty": "Zum Fortsetzen bitte eine E-Mail-Adresse eingeben",
- "invalid": "Bitte die Gültigkeit der E-Mail-Adresse erneut prüfen"
- }
+ "label": "E-Mail",
+ "placeholder": "me@example.com"
},
- "role": {
- "errors": {
- "empty": "Eine Rolle wird benötigt"
- }
+ "password": {
+ "label": "Passwort",
+ "placeholder": "********"
+ },
+ "confirmPassword": {
+ "label": "Passwort bestätigen"
}
}
}
+ },
+ "login": {
+ "title": "Willkommen zurück bei Checkmate!",
+ "subtitle": "Melden Sie sich an, um fortzufahren",
+ "submit": "Anmelden",
+ "links": {
+ "forgotPassword": {
+ "text": "Passwort vergessen?",
+ "linkText": "Passwort zurücksetzen"
+ },
+ "register": {
+ "text": "Noch kein Konto?",
+ "linkText": "Hier registrieren"
+ }
+ }
+ },
+ "register": {
+ "title": "Willkommen bei Checkmate!",
+ "subtitle": "Registrieren Sie sich, um loszulegen",
+ "submit": "Registrieren"
+ },
+ "forgotPassword": {
+ "title": "Passwort vergessen?",
+ "subtitle": "Keine Sorge, wir senden Ihnen Anweisungen zum Zurücksetzen.",
+ "submit": "Wiederherstellung anfordern",
+ "links": {
+ "login": {
+ "text": "Zurück zum",
+ "linkText": "Login"
+ }
+ }
+ },
+ "setNewPassword": {
+ "title": "Passwort zurücksetzen",
+ "subtitle": "Ihr neues Passwort muss sich von zuvor verwendeten Passwörtern unterscheiden."
}
},
- "role": "Rolle",
- "changeTeamPassword": {
- "changePasswordMenu": "Passwort zurücksetzen",
- "title": "Passwort des Teammitgliedes zurücksetzen",
- "description": "Neues Passwort für dieses Teammitglied erstellen. Es muss auf einem Sicheren weg zur Verfügung gestellt werden.",
- "success": "Passwort erfolgreich zurückgesetzt. Bitte sicherstellen, dass die Zugangsdaten auf sichere Weise weitergegeben werden."
- }
- },
- "monitorState": {
- "paused": "Pausiert",
- "resumed": "Wiederaufgenommen",
- "active": "Aktiv"
- },
- "menu": {
- "uptime": "Uptime",
- "pagespeed": "Pagespeed",
- "infrastructure": "Infrastruktur",
- "incidents": "Vorfälle",
- "statusPages": "Statusseite",
- "maintenance": "Wartung",
- "integrations": "Integrationen",
- "settings": "Einstellungen",
- "support": "Support",
- "discussions": "Diskussionen",
- "docs": "Anleitungen",
- "changelog": "Änderungen",
- "profile": "Profil",
- "password": "Passwort",
- "team": "Team",
- "logOut": "Abmelden",
- "notifications": "Benachrichtigungen",
- "logs": "Logs"
- },
- "settingsEmailUser": "E-Mail-Benutzer – Benutzername zur Authentifizierung, überschreibt die E-Mail-Adresse, falls angegeben",
- "state": "Zustand",
- "statusBreadCrumbsStatusPages": "Statusseite",
- "statusBreadCrumbsDetails": "Details",
- "commonSaving": "Speichere...",
- "navControls": "Steuerungen",
- "incidentsPageTitle": "Ereignisse",
- "passwordPanel": {
- "passwordChangedSuccess": "Dein Passwort wurde erfolgreich geändert.",
- "passwordInputIncorrect": "Die Passworteingabe war nicht korrekt.",
- "currentPassword": "Aktuelles Passwort",
- "enterCurrentPassword": "Aktuelles Passwort eingeben",
- "newPassword": "Neues Passwort",
- "enterNewPassword": "Neues Passwort eingeben",
- "confirmNewPassword": "Neues Passwort wiederholen",
- "passwordRequirements": "Das Passwort muss mindestens 8 Zeichen, einen Großbuchstaben, eine Zahl und ein Sonderzeichen enthalten.",
- "saving": "Speichere..."
- },
- "emailSent": "Email erfolgreich gesendet",
- "failedToSendEmail": "Email konnte nicht gesendet werden",
- "settingsTestEmailSuccess": "Test-Email erfolgreich gesendet",
- "settingsTestEmailFailed": "Test-Email konnte nicht gesendet werden",
- "settingsTestEmailFailedWithReason": "Email konnte nicht gesendet werden: {{reason}}",
- "settingsTestEmailUnknownError": "Unbekannter Fehler",
- "statusMsg": {
- "paused": "Monitoring pausiert",
- "up": "Ihre Site ist online.",
- "down": "Ihre Site ist nicht erreichbar.",
- "pending": "Ausstehend..."
- },
- "uptimeGeneralInstructions": {
- "http": "Geben Sie die zu überwachende URL oder IP ein (z. B. https://example.com/ oder 192.168.1.100) und fügen Sie einen eindeutigen Anzeigenamen hinzu, der auf dem Dashboard angezeigt wird.",
- "ping": "Geben Sie die IP-Adresse oder den Hostnamen ein, der angepingt werden soll (z. B. 192.168.1.100 oder example.com), und fügen Sie einen eindeutigen Anzeigenamen hinzu, der auf dem Dashboard angezeigt wird.",
- "docker": "Geben Sie die Docker-ID Ihres Containers ein. Docker-IDs müssen die vollständige 64-Zeichen-ID sein. Sie können docker inspect ausführen, um die vollständige Container-ID abzurufen.",
- "port": "Geben Sie die URL oder IP des Servers, die Portnummer und einen eindeutigen Anzeigenamen ein, der auf dem Dashboard angezeigt wird.",
- "game": "IP Adresse oder Hostnamen und Port für Ping eingeben (z.B. 192.168.1.100 oder beispiel.de) und Spieletyp auswählen.",
- "https": "Zu überwachende Adresse oder IP (z.B. https://beispiel.de/ oder 192.168.1.100) eingeben und einen klaren Anzeigenamen, der im Dashboard erscheint."
- },
- "common": {
- "appName": "Checkmate",
- "monitoringAgentName": "Capture",
- "buttons": {
- "toggleTheme": "Schaltet hell und dunkel um"
+ "checks": {
+ "selects": {
+ "monitor": {
+ "all": "Alle Monitore"
+ },
+ "status": {
+ "all": "Alle",
+ "down": "Ausgefallen",
+ "up": "Erreichbar"
+ }
+ },
+ "table": {
+ "empty": "Keine ausgefallenen Checks in diesem Zeitraum",
+ "headers": {
+ "statusCode": "Statuscode",
+ "location": "Standort"
+ }
+ }
},
- "toasts": {
- "networkError": "Netzwerkfehler",
- "checkConnection": "Bitte Verbindung prüfen",
- "unknownError": "Unbekannter Fehler"
- }
- },
- "auth": {
"common": {
- "navigation": {
- "continue": "Weiter",
- "back": "Zurück"
- },
- "inputs": {
- "email": {
- "label": "Email",
- "placeholder": "jordan.ellis@domain.com",
- "errors": {
- "empty": "Email adresse eingeben um fortzufahren",
- "invalid": "Bitte überprüfen Sie die Gültigkeit der eingegebenen E-Mail-Adresse erneut"
- }
+ "monitors": {
+ "actions": {
+ "configure": "Konfigurieren",
+ "delete": "Löschen",
+ "generateToken": "Token generieren",
+ "details": "Details",
+ "incidents": "Vorfälle",
+ "inviteMember": "Mitglied einladen",
+ "openSite": "Seite öffnen",
+ "pause": "Pausieren",
+ "resume": "Fortsetzen"
+ },
+ "statBoxes": {
+ "activeFor": "Aktiv seit",
+ "certificateExpiry": "Zertifikatablauf",
+ "lastCheck": "Letzter Check",
+ "lastResponseTime": "Letzte Antwortzeit"
+ },
+ "status": {
+ "down": "ausgefallen",
+ "breached": "Schwellenwert überschritten",
+ "initializing": "wird initialisiert",
+ "maintenance": "Wartung",
+ "paused": "pausiert",
+ "total": "gesamt",
+ "up": "erreichbar"
+ },
+ "monitorTypes": {
+ "optionDocker": "Docker",
+ "optionGame": "Spiel",
+ "optionHttp": "HTTP(S)",
+ "optionPing": "Ping",
+ "optionPort": "Port",
+ "optionPagespeed": "PageSpeed",
+ "optionHardware": "Infrastruktur",
+ "optionGrpc": "gRPC",
+ "optionWebSocket": "WebSocket"
+ }
+ }
+ },
+ "createMonitor": {
+ "form": {
+ "advanced": {
+ "description": "Optionale Einstellungen für erweiterte Anwendungsfälle",
+ "option": {
+ "advancedMatching": {
+ "label": "Erweiterten Abgleich verwenden"
+ },
+ "expectedValue": {
+ "label": "Erwarteter Wert"
+ },
+ "jsonPath": {
+ "description": "Dieser Ausdruck wird gegen die JSON-Antwortdaten ausgewertet und das Ergebnis wird mit dem erwarteten Wert verglichen. Siehe jmespath.org für die Dokumentation der Abfragesprache.",
+ "label": "JSONPath-Ausdruck"
+ },
+ "matchMethod": {
+ "label": "Abgleichmethode",
+ "equal": "Gleich",
+ "include": "Enthält",
+ "regex": "Regex"
+ }
+ },
+ "title": "Erweiterte Einstellungen"
},
- "password": {
- "label": "Passwort",
- "rules": {
- "length": {
- "beginning": "Muß mindestens",
- "highlighted": "8 Zeichen lang"
+ "frequency": {
+ "description": "Wie oft möchten Sie den Status dieses Monitors überprüfen?",
+ "option": {
+ "frequency": {
+ "label": "Prüffrequenz",
+ "value": {
+ "fifteenMinutes": "15 Minuten",
+ "fifteenSeconds": "15 Sekunden",
+ "fiveMinutes": "5 Minuten",
+ "fourMinutes": "4 Minuten",
+ "oneMinute": "Eine Minute",
+ "tenMinutes": "10 Minuten",
+ "thirtyMinutes": "30 Minuten",
+ "thirtySeconds": "30 Sekunden",
+ "threeMinutes": "3 Minuten",
+ "twoMinutes": "Zwei Minuten"
+ }
+ }
+ },
+ "title": "Prüffrequenz"
+ },
+ "general": {
+ "option": {
+ "container": {
+ "label": "Containername/-ID",
+ "placeholder": "my-app oder abcd1234"
+ },
+ "host": {
+ "label": "Host",
+ "placeholder": "192.168.1.100 oder example.com"
+ },
+ "name": {
+ "label": "Anzeigename",
+ "placeholder": "z. B. Meine Website"
},
- "special": {
- "beginning": "Muß mindestens",
- "highlighted": "ein Sonderzeichen enthalten"
+ "secret": {
+ "label": "Autorisierungsschlüssel",
+ "placeholder": "Geben Sie Ihren geheimen Schlüssel ein"
},
- "number": {
- "beginning": "Muß mindestens",
- "highlighted": "eine Zahl enthalten"
+ "url": {
+ "label": "URL",
+ "placeholder": "https://www.google.com"
},
- "uppercase": {
- "beginning": "Muß mindestens",
- "highlighted": "einen Großbuchstaben enthalten"
+ "game": {
+ "label": "Zu überwachende URL",
+ "placeholder": "localhost"
},
- "lowercase": {
- "beginning": "Muß mindestens",
- "highlighted": "einen Kleinbuchstaben enthalten"
+ "port": {
+ "label": "Zu überwachender Port",
+ "placeholder": "80"
},
- "match": {
- "beginning": "Passwort und Kennwort bestätigen",
- "highlighted": "muß übereinstimmen"
+ "grpcServiceName": {
+ "label": "Dienstname",
+ "placeholder": "z. B. my.service.v1 (leer lassen für allgemeinen Status)"
+ },
+ "wsUrl": {
+ "label": "WebSocket-URL",
+ "placeholder": "wss://example.com/socket"
}
},
- "errors": {
- "empty": "Bitte Passwort eingeben",
- "length": "Passwort muss mindestens 8 Zeichen lang sein",
- "uppercase": "Passwort muss mindestens einen Großbuchstaben enthalten",
- "lowercase": "Passwort muss mindestens einen Kleinbuchstaben enthalten",
- "number": "Passwort muss mindestens eine Zahl enthalten",
- "special": "Passwort muss mindestens ein Sonderzeichen enthalten",
- "incorrect": "Das Passwort stimmt nicht mit dem gespeicherten überein"
+ "title": "Allgemeine Einstellungen",
+ "description": {
+ "http": "Geben Sie die zu überwachende URL oder IP ein (z. B. https://example.com/ oder 192.168.1.100) und fügen Sie einen eindeutigen Anzeigenamen hinzu, der auf dem Dashboard erscheint.",
+ "ping": "Geben Sie die IP-Adresse oder den Hostnamen ein, der angepingt werden soll (z. B. 192.168.1.100 oder example.com), und fügen Sie einen eindeutigen Anzeigenamen hinzu, der auf dem Dashboard angezeigt wird.",
+ "port": "Geben Sie die URL oder IP des Servers, die Portnummer und einen eindeutigen Anzeigenamen ein, der auf dem Dashboard angezeigt wird.",
+ "docker": "Geben Sie die Docker-ID Ihres Containers ein. Docker-IDs müssen die vollständige 64-Zeichen-ID sein. Sie können docker inspect ausführen, um die vollständige Container-ID abzurufen.",
+ "game": "IP Adresse oder Hostnamen und Port für Ping eingeben (z.B. 192.168.1.100 oder beispiel.de) und Spieletyp auswählen.",
+ "pagespeed": "Verfolgen Sie die Ladezeit, Core Web Vitals und Optimierungswerte Ihrer Website.",
+ "grpc": "Geben Sie den Hostnamen und Port des gRPC-Servers ein, optional einen Dienstnamen für den Health-Check, und fügen Sie einen Anzeigenamen hinzu.",
+ "websocket": "Geben Sie die zu überwachende WebSocket-URL ein (z. B. wss://example.com/socket) und fügen Sie einen Anzeigenamen hinzu.",
+ "hardware": "Überwachen Sie CPU-, Arbeitsspeicher-, Festplattenauslastung und Temperatur Ihrer Infrastruktur."
}
},
- "passwordConfirm": {
- "label": "Passwort bestätigen",
- "placeholder": "Passwort nochmal eingeben",
- "errors": {
- "empty": "Passwort nochmal eingeben",
- "different": "Die Passwörter stimmen nicht überein"
- }
+ "ignoreTls": {
+ "description": "Konfigurieren Sie die TLS/SSL-Zertifikatsvalidierung für HTTPS-Verbindungen.",
+ "option": {
+ "tls": {
+ "label": "TLS/SSL-Fehler ignorieren"
+ }
+ },
+ "title": "TLS/SSL-Einstellungen"
},
- "firstName": {
- "label": "Name",
- "placeholder": "Jordan",
- "errors": {
- "empty": "Bitte Name eingeben",
- "length": "Name darf nicht mehr als 50 Zeichen lang sein",
- "pattern": "Name darf nur aus Buchstaben, Leerstellen, Apostroph und Bindestrichen bestehen"
+ "incidents": {
+ "description": "Ein gleitendes Fenster wird verwendet, um festzustellen, wann ein Monitor ausfällt. Der Status eines Monitors ändert sich erst, wenn der Prozentsatz der Checks im gleitenden Fenster den angegebenen Wert erreicht.",
+ "option": {
+ "checks": {
+ "label": "Anzahl der Checks im gleitenden Fenster"
+ },
+ "percentage": {
+ "label": "Welcher Prozentsatz der Checks im gleitenden Fenster muss fehlschlagen/erfolgreich sein, bevor sich der Monitor-Status ändert?"
+ }
+ },
+ "title": "Vorfälle"
+ },
+ "notifications": {
+ "description": "Wählen Sie die Benachrichtigungskanäle aus, die Sie verwenden möchten",
+ "title": "Benachrichtigungen"
+ },
+ "type": {
+ "description": "Wählen Sie die Art der durchzuführenden Prüfung",
+ "optionDockerDescription": "Docker verwenden, um zu überwachen, ob ein Container läuft.",
+ "optionGameDescription": "Überwachen, ob ein bestimmter Spieleserver online ist.",
+ "optionGrpcDescription": "gRPC-Dienste mit dem Standard Health Checking Protocol überwachen.",
+ "optionWebSocketDescription": "WebSocket-Endpunkte auf Verbindungszustand und Antwortzeit überwachen.",
+ "optionHttpDescription": "HTTP(S) verwenden, um Ihre Website oder Ihren API-Endpunkt zu überwachen.",
+ "optionPingDescription": "ICMP-Ping verwenden, um zu überwachen, ob ein Server online ist.",
+ "optionPortDescription": "Überwachen, ob ein bestimmter Port auf einem Server geöffnet ist.",
+ "title": "Typ"
+ },
+ "thresholds": {
+ "title": "Alarmschwellenwerte",
+ "description": "Definieren Sie die Schwellenwerte, bei denen Alarme für diesen Hardware-Monitor ausgelöst werden sollen.",
+ "option": {
+ "cpuThreshold": {
+ "label": "CPU-Alarmschwelle (%)"
+ },
+ "memoryThreshold": {
+ "label": "Arbeitsspeicher-Alarmschwelle (%)"
+ },
+ "diskThreshold": {
+ "label": "Festplatten-Alarmschwelle (%)"
+ },
+ "tempThreshold": {
+ "label": "Temperatur-Alarmschwelle (°C)"
+ }
}
},
- "lastName": {
- "label": "Zuname",
- "placeholder": "Ellis",
- "errors": {
- "empty": "Bitte Zuname eingeben",
- "length": "Zuname darf nicht länger als 50 Zeichen sein",
- "pattern": "Zuname darf nur aus Buchstaben, Leerstellen, Apostroph und Bindestrichen bestehen"
+ "geoChecks": {
+ "title": "Geo-verteilte Checks",
+ "description": "Führen Sie Checks von mehreren geografischen Standorten aus, um die globale Verfügbarkeit und Leistung zu überwachen.",
+ "option": {
+ "enabled": {
+ "label": "Geo-verteilte Checks aktivieren"
+ },
+ "locations": {
+ "label": "Standorte",
+ "placeholder": "Standorte auswählen",
+ "options": {
+ "EU": "Europa",
+ "NA": "Nordamerika",
+ "AS": "Asien",
+ "SA": "Südamerika",
+ "AF": "Afrika",
+ "OC": "Ozeanien"
+ }
+ },
+ "interval": {
+ "label": "Prüfintervall",
+ "value": {
+ "fiveMinutes": "5 Minuten",
+ "tenMinutes": "10 Minuten",
+ "fifteenMinutes": "15 Minuten",
+ "thirtyMinutes": "30 Minuten"
+ }
+ }
}
- }
- },
- "errors": {
- "validation": "Fehler bei der prüfung der Daten"
- },
- "fields": {
- "password": {
- "errors": {
- "incorrect": "Das Passwort stimmt nicht mit dem gespeicherten überein"
+ },
+ "url": {
+ "title": "Monitor-IP/URL auf Statusseite",
+ "description": "Zeigt die IP-Adresse oder URL des Monitors auf der öffentlichen Statusseite an. Wenn deaktiviert, wird nur der Monitor-Name angezeigt, um sensible Informationen zu schützen.",
+ "option": {
+ "showURL": {
+ "label": "IP/URL auf Statusseite anzeigen",
+ "enabled": "Aktiviert",
+ "disabled": "Deaktiviert"
+ }
}
},
- "role": {
- "errors": {
- "min": "Mindestens eine Rolle ist erforderlich"
+ "stats": {
+ "title": "Monitor-Verlauf",
+ "description": "Löschen Sie alle Überwachungsverläufe und Statistiken für Ihr Team. Diese Aktion ist unwiderruflich.",
+ "buttonText": "Alle Statistiken löschen",
+ "dialog": {
+ "title": "Alle Überwachungsverläufe löschen?",
+ "description": "Dies wird alle Überwachungsverläufe, Statistiken und Check-Daten für Ihr Team dauerhaft löschen. Diese Aktion kann nicht rückgängig gemacht werden.",
+ "confirm": "Ja, alle Statistiken löschen"
}
}
}
},
- "login": {
- "heading": "Anmelden",
- "subheadings": {
- "stepOne": "Email eingeben",
- "stepTwo": "Passwort eingeben"
+ "editUser": {
+ "form": {
+ "roles": {
+ "title": "Rollen",
+ "description": "Weisen Sie dem Benutzer Rollen zu. Es können mehrere Rollen ausgewählt werden."
+ }
},
- "links": {
- "forgotPassword": "Passwort vergessen?",
- "register": "Noch keinen Account?",
- "forgotPasswordLink": "Passwort zurücksetzen",
- "registerLink": "Hier registrieren"
+ "dialog": {
+ "removeUser": {
+ "title": "Benutzer entfernen",
+ "content": "Möchten Sie {{name}} wirklich aus Ihrem Team entfernen? Diese Aktion kann nicht rückgängig gemacht werden."
+ }
+ }
+ },
+ "incidents": {
+ "dialog": {
+ "resolveIncident": {
+ "title": "Vorfall lösen",
+ "option": {
+ "comment": {
+ "label": "Kommentar (optional)",
+ "placeholder": "Kommentar zur Lösung hinzufügen..."
+ }
+ }
+ },
+ "details": {
+ "analysis": "Vorfallanalyse",
+ "comment": "Kommentar:",
+ "detailsLabel": "Details",
+ "downtime": "Ausfallzeit:",
+ "message": "Nachricht:",
+ "monitor": "Monitor:",
+ "overview": "Übersicht",
+ "resolutionDetails": "Lösungsdetails",
+ "resolutionType": "Typ:",
+ "resolutionTypes": {
+ "automatic": "Automatisch",
+ "manual": "Manuell"
+ },
+ "resolve": "Vorfall lösen",
+ "resolvedAt": "Gelöst am:",
+ "resolvedBy": "Gelöst von:",
+ "startedAt": "Begonnen am:",
+ "status": "Status:",
+ "statusCode": "Statuscode:",
+ "timeline": "Zeitverlauf",
+ "title": "Vorfalldetails",
+ "url": "URL:"
+ }
},
- "toasts": {
- "success": "Willkommen zurück. Erfolgreich angemeldet.",
- "incorrectPassword": "Falsches Passwort"
+ "filters": {
+ "allMonitors": "Alle Monitore",
+ "monitor": "Monitor",
+ "resolutionType": "Lösungstyp",
+ "resolutionTypes": {
+ "manual": "Manuell",
+ "automatic": "Automatisch",
+ "all": "Alle"
+ }
},
- "errors": {
- "password": {
- "incorrect": "Das Passwort stimmt nicht mit dem gespeicherten überein"
+ "summaryCard": {
+ "activeIncidents": {
+ "title": "Aktive Vorfälle",
+ "active_zero": "Keine aktiven Vorfälle",
+ "active_one": "{{count}} aktiver Vorfall",
+ "active_other": "{{count}} aktive Vorfälle"
+ },
+ "incidentStats": {
+ "avgResolutionTime": "Durchschn. Lösungszeit",
+ "mostAffectedMonitor": "Am meisten betroffener Monitor",
+ "title": "Vorfallstatistiken",
+ "totalIncidents": "Vorfälle gesamt"
+ },
+ "latestIncidents": {
+ "title": "Neueste Vorfälle"
}
},
- "welcome": "Willkommen zurück bei Checkmate!"
+ "table": {
+ "actions": {
+ "details": "Details",
+ "goToMonitor": "Zum Monitor",
+ "resolveManually": "Manuell lösen"
+ },
+ "activeIncidents": "Aktive Vorfälle",
+ "headers": {
+ "endTime": "Endzeit",
+ "resolutionType": "Lösungstyp",
+ "startTime": "Anfangszeit",
+ "statusCode": "Statuscode"
+ },
+ "resolvedIncidents": "Gelöste Vorfälle",
+ "status": {
+ "active": "Aktiv",
+ "resolved": "Gelöst"
+ }
+ }
},
- "registration": {
- "heading": {
- "superAdmin": "Super Admin anlegen",
- "user": "Anmelden"
- },
- "subheadings": {
- "stepOne": "Geben Sie Ihre persönlichen Daten ein",
- "stepTwo": "Email eingeben",
- "stepThree": "Passwort eingeben"
+ "infrastructure": {
+ "charts": {
+ "labels": {
+ "cpu": "CPU-Auslastung",
+ "disk": "Festplattenauslastung",
+ "memory": "Arbeitsspeicherauslastung",
+ "netBytesRecv": "{{name}} - Empfangene Bytes",
+ "netBytesSent": "{{name}} - Gesendete Bytes",
+ "temp": "Temp."
+ }
},
- "description": {
- "superAdmin": "Super admin account anlegen um zu beginnen",
- "user": "Melden Sie sich als Benutzer an und bitten Sie den Superadministrator um Zugriff auf Ihre Monitore"
+ "gauges": {
+ "cpu": {
+ "lowerLabel": "Max. Frequenz",
+ "title": "CPU-Auslastung",
+ "upperLabel": "Aktuelle Frequenz"
+ },
+ "disk": {
+ "lowerLabel": "Frei",
+ "title": "Festplatte {{idx}} Auslastung",
+ "upperLabel": "Belegt"
+ },
+ "memory": {
+ "lowerLabel": "Frei",
+ "title": "Arbeitsspeicherauslastung",
+ "upperLabel": "Belegt"
+ }
},
- "gettingStartedButton": {
- "superAdmin": "Super admin account anlegen",
- "user": "Normalen Benutzer anlegen"
+ "statBoxes": {
+ "avgCpuTemperature": "Durchschn. CPU Termperatur",
+ "cpuFrequency": "CPU Frequenz",
+ "cpuLogical": "CPU (logisch)",
+ "cpuPhysical": "CPU (physisch)",
+ "disk": "Festplatte",
+ "memory": "Arbeitsspeicher",
+ "os": "Betriebssystem"
},
- "termsAndPolicies": "Indem Sie ein Konto erstellen, stimmen Sie unseren Servicebedingungen und Datenschutzrichtlinien zu.",
- "links": {
- "login": "Du hast bereits einen Benutzer? Anmelden"
+ "table": {
+ "headers": {
+ "cpu": "CPU",
+ "disk": "Festplatte",
+ "memory": "Arbeitsspeicher"
+ }
},
- "toasts": {
- "success": "Willkommen! Benutzer erfolgreich angelegt"
+ "tabs": {
+ "labels": {
+ "network": "Netzwerk",
+ "overview": "Übersicht"
+ }
},
- "welcome": "Willkommen bei Checkmate!"
+ "fallback": {
+ "actionButton": "Monitor erstellen!",
+ "checks": "Track the performance of your servers,Identify bottlenecks and optimize usage,Ensure reliability with real-time monitoring",
+ "title": "Ein Infrastruktur-Monitor wird verwendet, um:"
+ }
},
- "forgotPassword": {
- "heading": "Passwort vergessen?",
- "subheadings": {
- "stepOne": "Kein Problem. Wir schicken Dir Infos zum zurücksetzen.",
- "stepTwo": "Link zum Password zurücksetzen an geschickt. ",
- "stepThree": "Das neue Passwort darf nicht gleich wie frühere Passwörter sein.",
- "stepFour": "Das Passwort wurde zurückgesetzt. Unten klicken zum Anmelden."
+ "logs": {
+ "tabs": {
+ "diagnostics": "Diagnose",
+ "logs": "Server logs",
+ "queue": "Warteschlange"
},
- "buttons": {
- "openEmail": "Email app öffnen",
- "resetPassword": "Passwort zurücksetzen"
+ "logLevelSelect": {
+ "label": "Log-Level"
},
- "imageAlts": {
- "passwordKey": "Password key icon",
- "email": "Email icon",
- "lock": "Lock icon",
- "passwordConfirm": "Password confirm icon"
+ "jobQueue": "Job-Warteschlange",
+ "failedJobs": "Fehlgeschlagene Jobs",
+ "noLogs": "Keine Protokolle gefunden",
+ "metrics": {
+ "jobs": "Jobs",
+ "activeJobs": "Aktive Jobs",
+ "failingJobs": "Fehlschlagende Jobs",
+ "totalRuns": "Ausführungen gesamt",
+ "totalFailures": "Fehler gesamt"
},
- "links": {
- "login": "Zurück zum Anmelden",
- "resend": "Keine Email bekommen? Klicken um nochmal zu senden"
+ "diagnostics": {
+ "stats": {
+ "eventLoopDelay": "Event-Loop-Verzögerung",
+ "uptime": "Betriebszeit",
+ "usedHeapSize": "Verwendete Heap-Größe",
+ "totalHeapSize": "Gesamte Heap-Größe",
+ "osMemoryLimit": "OS-Speicherlimit"
+ },
+ "gauges": {
+ "heapAllocation": "Heap-Zuweisung",
+ "heapUsage": "Heap-Nutzung",
+ "heapUtilization": "Heap-Auslastung",
+ "instantCpuUsage": "Momentane CPU-Auslastung",
+ "availableMemoryPercentage": "% des verfügbaren Speichers",
+ "allocatedPercentage": "% zugewiesen",
+ "usedSPercentage": "% von 1s durch CPU genutzt",
+ "total": "Gesamt",
+ "used": "Belegt"
+ }
},
- "toasts": {
- "sent": "Anleitung an gesendet.",
- "emailNotFound": "Email nicht gefunden.",
- "redirect": "Umleitung in ...",
- "success": "Passwort erfolgreich zurückgesetzt.",
- "error": "Kennwort konnte nicht zurückgesetzt werden. Bitte versuchen Sie es später erneut oder wenden Sie sich an den Support."
+ "table": {
+ "headers": {
+ "timestamp": "Zeitstempel",
+ "level": "Stufe",
+ "service": "Dienst",
+ "method": "Methode",
+ "monitorId": "Monitor-ID",
+ "runCount": "Ausführungen",
+ "failCount": "Fehlerzahl",
+ "lastRunAt": "Letzter Lauf am",
+ "lockedAt": "Gesperrt am",
+ "lastFinishedAt": "Zuletzt abgeschlossen am",
+ "lastRunTook": "Letzter Lauf dauerte",
+ "lastFailedAt": "Letzter Fehler am",
+ "failReason": "Fehlergrund"
+ }
}
- }
- },
- "errorPages": {
- "serverUnreachable": {
- "toasts": {
- "reconnected": "Verbindung zum Server wiederhergestellt.",
- "stillUnreachable": "Server immer noch nicht erreichbar. Bitte später erneut versuchen."
+ },
+ "maintenanceWindow": {
+ "fallback": {
+ "actionButton": "Wartungsfenster erstellen!",
+ "checks": "Mark your maintenance periods,Eliminate any misunderstandings,Stop sending alerts in maintenance windows",
+ "title": "Ein Wartungsfenster wird verwendet, um:"
+ },
+ "table": {
+ "headers": {
+ "nextWindow": "Nächstes Fenster",
+ "repeat": "Wiederholen"
+ }
},
- "alertBox": "Server Verbindungsfehler",
- "description": "Wir können keine Verbindung zum Server herstellen. Bitte überprüfen Sie Ihre Internetverbindung oder Ihre Bereitstellungskonfiguration, falls das Problem weiterhin besteht.",
- "retryButton": {
- "default": "Verbindung erneut versuchen",
- "processing": "Verbinde..."
+ "form": {
+ "general": {
+ "title": "Allgemeine Einstellungen",
+ "description": "Legen Sie einen Namen und eine Wiederholungsoption für Ihr Wartungsfenster fest.",
+ "option": {
+ "name": {
+ "label": "Name",
+ "placeholder": "z. B. Wöchentliche Wartung"
+ },
+ "repeat": {
+ "label": "Wiederholen"
+ }
+ }
+ },
+ "startDate": {
+ "title": "Startdatum",
+ "description": "Wählen Sie das Startdatum für Ihr Wartungsfenster.",
+ "option": {
+ "startDate": {
+ "label": "Startdatum"
+ }
+ }
+ },
+ "startTime": {
+ "title": "Startzeit",
+ "description": "Legen Sie die Startzeit und Dauer für Ihr Wartungsfenster fest. Alle Werte sind in UTC",
+ "option": {
+ "duration": {
+ "label": "Dauer"
+ },
+ "startTime": {
+ "label": "Startzeit"
+ }
+ },
+ "monitors": {
+ "title": "Monitore",
+ "description": "Monitore, für die das Wartungsfenster gelten soll",
+ "option": {
+ "addMonitors": {
+ "label": "Monitore hinzufügen"
+ }
+ }
+ }
+ }
}
- }
- },
- "createNotifications": {
- "title": "Benachrichtigungskanal erstellen",
- "nameSettings": {
- "title": "Name",
- "description": "Ein beschreibender Name für Ihre Integration.",
- "nameLabel": "Name",
- "namePlaceholder": "z.B. Slack Benachrichtigung"
- },
- "typeSettings": {
- "title": "Typ",
- "description": "Wählen Sie den Typ des Benachrichtigungskanals aus, den Sie erstellen möchten.",
- "typeLabel": "Typ"
- },
- "emailSettings": {
- "title": "Email",
- "description": "Empfänger Email adresse",
- "emailLabel": "Email addresse",
- "emailPlaceholder": "z.B. john@example.com"
- },
- "slackSettings": {
- "title": "Slack",
- "description": "Slack webhook hier konfigurieren",
- "webhookLabel": "Slack webhook URL",
- "webhookPlaceholder": "https://hooks.slack.com/services/..."
- },
- "pagerdutySettings": {
- "title": "PagerDuty",
- "description": "PagerDuty hier konfigurieren",
- "integrationKeyLabel": "Integration key",
- "integrationKeyPlaceholder": "1234567890"
- },
- "discordSettings": {
- "title": "Discord",
- "description": "Discord webhook hier konfigurieren",
- "webhookLabel": "Discord Webhook URL",
- "webhookPlaceholder": "https://your-server.com/webhook"
- },
- "webhookSettings": {
- "title": "Webhook",
- "description": "Webhook hier konfigurieren",
- "webhookLabel": "Webhook URL",
- "webhookPlaceholder": "https://your-server.com/webhook"
- },
- "testNotification": "Testbenachrichtigung",
- "dialogDeleteTitle": "Möchten Sie diese Benachrichtigung wirklich löschen?",
- "dialogDeleteConfirm": "Löschen"
- },
- "notificationConfig": {
- "title": "Benachrichtigungen",
- "description": "Wählen Sie die Benachrichtigungskanäle aus, die Sie verwenden möchten"
- },
- "monitorStatus": {
- "checkingEvery": "Überprüfung alle {{interval}}",
- "withCaptureAgent": "mit Capture-Agent {{version}}",
- "up": "Online",
- "down": "Offline",
- "paused": "pausiert"
- },
- "advancedMatching": "Erweiterter Abgleich",
- "sendTestNotifications": "Test Benachrichtigung senden",
- "selectAll": "Alle auswählen",
- "showAdminLoginLink": "Link „Administrator? Hier anmelden“ auf der Statusseite anzeigen",
- "logsPage": {
- "title": "Logs",
- "description": "Systemprotokolle – letzte 1000 Zeilen",
- "tabs": {
- "queue": "Warteschlange",
- "logs": "Server logs",
- "diagnostics": "Diagnose"
- },
- "toast": {
- "fetchLogsSuccess": "Protokolle erfolgreich abgerufen"
},
- "logLevelSelect": {
- "title": "Protokollebene",
- "values": {
- "all": "Alle",
- "info": "Info",
- "warn": "Warnung",
- "error": "Fehler",
- "debug": "Debug"
+ "notifications": {
+ "fallback": {
+ "actionButton": "Kanal erstellen",
+ "checks": "Alert teams about downtime or performance issues,Let engineers know when incidents happen,Keep administrators informed of system changes",
+ "title": "Benachrichtigungskanäle werden verwendet, um:"
+ },
+ "form": {
+ "accessToken": {
+ "optionAccessToken": "Zugriffstoken",
+ "placeholder": "syt_YWxleF9ob2xsaWRheQ_VmtScmV0U2VjcmV0S2V5_abc123"
+ },
+ "address": {
+ "description": "Die Adresse, an die Benachrichtigungen gesendet werden.",
+ "optionAddress": "Adresse",
+ "placeholderEmail": "example@example.com",
+ "placeholderWebhook": "https://your-server.com/webhook",
+ "title": "Adresse"
+ },
+ "homeServer": {
+ "optionHomeServer": "Home-Server",
+ "placeholder": "example.com"
+ },
+ "matrix": {
+ "description": "Konfigurieren Sie Ihre Matrix-Homeserver-Verbindung für Benachrichtigungen.",
+ "title": "Matrix-Konfiguration"
+ },
+ "notificationName": {
+ "description": "Ein beschreibender Name für den Benachrichtigungskanal",
+ "optionName": "Kanalname",
+ "placeholder": "z. B. Produktionsalarme",
+ "title": "Kanalname"
+ },
+ "pagerDuty": {
+ "description": "Ihr PagerDuty-Integrationsschlüssel für den Empfang von Alarmen.",
+ "optionIntegrationKey": "Integrationsschlüssel",
+ "placeholder": "a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6",
+ "title": "Integrationsschlüssel"
+ },
+ "roomId": {
+ "optionRoomId": "Raum-ID",
+ "placeholder": "!abcdefg:matrix.org"
+ },
+ "type": {
+ "description": "Wählen Sie den Typ des zu erstellenden Benachrichtigungskanals.",
+ "optionType": "Typ",
+ "title": "Kanaltyp"
+ },
+ "telegram": {
+ "title": "Telegram-Konfiguration",
+ "description": "Um Telegram-Benachrichtigungen zu aktivieren, erstelle einen Telegram-Bot mit BotFather, einem offiziellen Bot zum Erstellen und Verwalten von Telegram-Bots. Dann hole dir das API-Token und die Chat-ID und notiere sie hier.",
+ "optionBotToken": "Bot-Token",
+ "placeholderBotToken": "123456789:ABCdefGhIJKlmNoPQRsTUVwxyZ",
+ "optionChatId": "Chat-ID",
+ "placeholderChatId": "-1001234567890"
+ }
+ },
+ "table": {
+ "headers": {
+ "destination": "Ziel"
+ }
}
- }
- },
- "queuePage": {
- "title": "Warteschlange",
- "refreshButton": "Auffrischen",
- "flushButton": "Warteschlange leeren",
- "jobTable": {
- "title": "Aufgaben in der Warteschlange",
- "idHeader": "Monitor ID",
- "urlHeader": "URL",
- "typeHeader": "Typ",
- "activeHeader": "Aktiv",
- "lockedAtHeader": "Gesperrt bei",
- "runCountHeader": "Anzahl Läufe",
- "failCountHeader": "Anzahl Fehler",
- "lastRunHeader": "Letzter Lauf um",
- "lastFinishedAtHeader": "Zuletzt abgeschlossen um",
- "lastRunTookHeader": "Letzter Lauf dauerte",
- "intervalHeader": "Invervall"
- },
- "metricsTable": {
- "title": "Warteschlangenmetriken",
- "metricHeader": "Metrisch",
- "valueHeader": "Wert"
- },
- "failedJobTable": {
- "title": "Anzahl Fehler",
- "monitorIdHeader": "Monitor ID",
- "monitorUrlHeader": "Monitor URL",
- "failCountHeader": "Anzahl Fehler",
- "failedAtHeader": "Zuletzt fehlgeschlagen um",
- "failReasonHeader": "Fehlergrund"
- }
- },
- "export": {
- "title": "Monitore exportieren",
- "success": "Monitore erfolgreich exportiert",
- "failed": "Fehler beim exportieren der Monitore"
- },
- "monitorActions": {
- "title": "Export/Import",
- "import": "Monitore importieren",
- "export": "Monitore exportieren",
- "deleteSuccess": "Monitor erfolgreich gelöscht",
- "deleteFailed": "Monitor konnte nicht gelöscht werden",
- "details": "Details"
- },
- "settingsPage": {
- "aboutSettings": {
- "labelDevelopedBy": "Entwickelt von Bluewave Labs",
- "labelVersion": "Version",
- "title": "Über"
- },
- "demoMonitorsSettings": {
- "buttonAddMonitors": "Demo Monitor hinzufügen",
- "description": "Beispiel Monitor zur Demonstration hinzufügen.",
- "title": "Demo Monitore"
},
- "emailSettings": {
- "buttonSendTestEmail": "Test-Email senden",
- "description": "Konfigurieren Sie die E-Mail-Einstellungen für Ihr System. Diese werden zum Senden von Benachrichtigungen und Warnungen verwendet.",
- "descriptionTransport": "Dies erstellt einen SMTP-Transport für NodeMailer",
- "labelAddress": "E-Mail-Adresse - Wird zur Authentifizierung verwendet",
- "labelConnectionHost": "E-Mail-Verbindungshost – Hostname zur Verwendung in der HELO/EHLO-Begrüßung",
- "labelHost": "E-Mail-Host – Hostname oder IP-Adresse, mit der eine Verbindung hergestellt werden soll",
- "labelIgnoreTLS": "STARTTLS abschalten: TLS nicht nutzen, selbst wenn der Server es unterstützt",
- "labelPassword": "Email password - Password für Anmeldung",
- "labelPasswordSet": "Passwort erstellt. Reset drücken um es zu ändern.",
- "labelPool": "Verbindungspooling aktivieren: Vorhandene Verbindungen wiederverwenden, um die Leistung zu verbessern",
- "labelPort": "Email port - Port zum verbinden",
- "labelRejectUnauthorized": "Ungültige Zertifikate ablehnen. Verbindungen mit self-signed oder nicht vertrauenswürdigen Zertifikaten ablehnen.",
- "labelRequireTLS": "STARTTLS erzwingen: TLS-Upgrade erforderlich, schlägt fehl, wenn nicht unterstützt",
- "labelSecure": "SSL verwenden (empfohlen): Verbindung mit SSL/TLS verschlüsseln",
- "labelTLSServername": "TLS-Servername – Optionaler Hostname für die TLS-Validierung, wenn der Host eine IP ist",
- "labelUser": "E-Mail-Benutzer – Benutzername zur Authentifizierung, überschreibt die E-Mail-Adresse, falls angegeben",
- "linkTransport": "Spezifikationen finden Sie hier",
- "placeholderUser": "Leer lassen, wenn nicht benötigt",
- "title": "Email",
- "toastEmailRequiredFieldsError": "E-Mail-Adresse, Host, Port und Passwort sind erforderlich"
- },
- "pageSpeedSettings": {
- "description": "Geben Sie Ihren Google PageSpeed API-Schlüssel ein, um die Google PageSpeed-Überwachung zu aktivieren. Klicken Sie auf „Zurücksetzen“, um den Schlüssel zu aktualisieren.",
- "labelApiKeySet": "API key erstellt. Reset drücken um ihn zu ändern.",
- "labelApiKey": "PageSpeed API key",
- "title": "Google PageSpeed API key"
- },
- "saveButtonLabel": "Speichern",
- "statsSettings": {
- "clearAllStatsButton": "Alle Statistiken löschen",
- "clearAllStatsDescription": "Alle Statistiken löschen. Dies ist irreversibel.",
- "clearAllStatsDialogConfirm": "Ja, alle Statistiken löschen",
- "clearAllStatsDialogDescription": "Nach dem Entfernen können der Überwachungsverlauf und die Statistiken nicht mehr abgerufen werden.",
- "clearAllStatsDialogTitle": "Möchten Sie alle Statistiken löschen?",
- "description": "Legen Sie fest, wie lange Sie historische Daten aufbewahren möchten. Sie können auch alle vorhandenen Daten löschen.",
- "labelTTL": "Die Tage, an denen Sie den Überwachungsverlauf beibehalten möchten.",
- "labelTTLOptional": "0 für unendlich",
- "title": "Monitorverlauf"
- },
- "systemResetSettings": {
- "buttonRemoveAllMonitors": "Alle Monitore löschen",
- "description": "Alle Monitore löschen",
- "dialogConfirm": "Ja, alle Monitore löschen",
- "dialogDescription": "Gelöschte Monitore können nicht wiederhergestellt werden.",
- "dialogTitle": "Wirklich alle Monitore löschen?",
- "title": "System zurücksetzen"
- },
- "timezoneSettings": {
- "description": "Wählen Sie die Zeitzone aus, die zum Anzeigen von Datum und Uhrzeit in der gesamten Anwendung verwendet wird.",
- "label": "Zeitzone",
- "title": "Zeitzone"
- },
- "title": "Einstellungen",
- "uiSettings": {
- "description": "Wechseln Sie zwischen hellem und dunklem Modus oder ändern Sie die Sprache der Benutzeroberfläche.",
- "labelLanguage": "Sprache",
- "labelTheme": "Themenmodus",
- "title": "Aussehen"
- },
- "urlSettings": {
- "description": "Zeigt die IP-Adresse oder URL des Monitors auf der öffentlichen Statusseite an. Wenn diese Option deaktiviert ist, wird zum Schutz vertraulicher Informationen nur der Monitorname angezeigt.",
- "label": "IP/URL auf der Statusseite anzeigen",
- "selectDisabled": "Inaktiv",
- "selectEnabled": "Aktiv",
- "title": "Überwachen Sie IP/URL auf der Statusseite"
- },
- "globalThresholds": {
- "title": "Globale Schwellenwerte",
- "description": "Globale CPU-, Speicher-, Festplatten- und Temperaturschwellenwerte festlegen. Wenn ein Wert angegeben ist, wird er automatisch für die Überwachung genutzt."
- }
- },
- "statusPageCreate": {
- "buttonSave": "Speichern"
- },
- "incidentsOptionsHeaderFilterResolved": "Gelöst",
- "settingsSave": "Speichern",
- "statusPageCreateAppearanceTitle": "Aussehen",
- "confirmPassword": "Passwort bestätigen",
- "monitorHooks": {
- "failureAddDemoMonitors": "Demo Monitor konnte nicht hinzugefügt werden",
- "successAddDemoMonitors": "Demo Monitor erfolgreich hinzugefügt"
- },
- "settingsAppearance": "Aussehen",
- "settingsDisplayTimezone": "Zeitzone anzeigen",
- "settingsGeneralSettings": "Allgemeine Einstellungen",
- "incidentsOptionsHeaderTotalIncidents": "Gesamtanzahl der Vorfälle",
- "statusPage": {
- "deleteSuccess": "Statusseite erfolgreich gelöscht",
- "deleteFailed": "Löschen der Statusseite fehlgeschlagen",
- "createSuccess": "Statusseite erfolgreich erstellt",
- "updateSuccess": "Statusseite erfolgreich aktualisiert",
- "generalSettings": "Allgemeine Einstellungen",
- "contents": "Inhalt",
- "fallback": {
- "checks": [
- "Überwachen und zeigen Sie den Zustand Ihrer Dienste in Echtzeit an.",
- "Verfolgen Sie mehrere Dienste und teilen Sie deren Status.",
- "Informieren Sie Nutzer über Ausfälle und Leistung."
- ],
- "title": "Eine Statusseite wird verwendet, um:",
- "actionButton": "Lassen Sie uns Ihre erste Statusseite erstellen!"
- }
- },
- "testNotificationsDisabled": "Für diesen Monitor sind keine Benachrichtigungen eingerichtet. Sie müssen eine hinzufügen, indem Sie auf die Schaltfläche „Konfigurieren“ klicken.",
- "incidentsTableResolvedAt": "Gelöst am",
- "incidentsTableActionResolve": "Lösen",
- "checkHooks": {
- "failureResolveOne": "Der Vorfall konnte nicht gelöst werden.",
- "failureResolveAll": "Es konnten nicht alle Vorfälle gelöst werden.",
- "failureResolveMonitor": "Monitorvorfälle konnten nicht behoben werden."
- },
- "checkFormError": "Bitte überprüfen Sie das Formular auf Fehler.",
- "diagnosticsPage": {
- "diagnosticDescription": "Systemdiagnose",
- "statsDescription": "Systemstatistiken",
- "gauges": {
- "heapAllocationTitle": "Heap-Zuweisung",
- "heapAllocationSubtitle": "% des verfügbaren Speichers",
- "heapUsageTitle": "Heap-Nutzung",
- "heapUsageSubtitle": "% des verfügbaren Speichers",
- "heapUtilizationTitle": "Heap-Auslastung",
- "heapUtilizationSubtitle": "% der zugewiesenen",
- "instantCpuUsageTitle": "Sofortige CPU-Auslastung",
- "instantCpuUsageSubtitle": "% der von der CPU genutzten 1s"
- },
- "stats": {
- "eventLoopDelayTitle": "Ereignisschleifenverzögerung",
- "uptimeTitle": "Betriebszeit",
- "usedHeapSizeTitle": "Verwendete Heap-Größe",
- "totalHeapSizeTitle": "Gesamtgröße des Heapspeichers",
- "osMemoryLimitTitle": "Betriebssystem-Speicherlimit"
- }
- },
- "pageSpeedLighthouseAPI": "Verwenden Sie die Lighthouse PageSpeed API, um Ihre Website zu überwachen",
- "time": {
- "threeMinutes": "3 Minuten",
- "fiveMinutes": "5 Minuten",
- "tenMinutes": "10 Minuten",
- "twentyMinutes": "20 Minuten",
- "oneHour": "1 Stunde",
- "oneDay": "1 Tag",
- "oneWeek": "1 Woche",
- "fourMinutes": "4 Minuten",
- "oneMinute": "Eine Minute",
- "twoMinutes": "Zwei Minuten",
- "fifteenSeconds": "15 Sekunden",
- "thirtySeconds": "30 Sekunden"
- },
- "general": {
- "noOptionsFound": "Keine {{unit}} gefunden"
- },
- "infrastructureMonitor": {
- "fallback": {
- "checks": [
- "Verfolgen Sie die Leistung Ihrer Server",
- "Identifizieren Sie Engpässe und optimieren Sie die Nutzung",
- "Sorgen Sie für Zuverlässigkeit durch Echtzeitüberwachung"
- ],
- "title": "Ein Infrastrukturmonitor wird verwendet, um:",
- "actionButton": "Lassen Sie uns Ihren ersten Infrastrukturmonitor erstellen!"
- }
- },
- "maintenanceWindow": {
- "fallback": {
- "checks": [
- "Markieren Sie Ihre Wartungszeiträume.",
- "Beseitigen Sie Missverständnisse.",
- "Beenden Sie das Senden von Warnmeldungen in Wartungsfenstern."
- ],
- "title": "Ein Wartungsfenster wird verwendet, um:",
- "actionButton": "Lassen Sie uns Ihr erstes Wartungsfenster erstellen!"
- }
- },
- "pageSpeed": {
- "fallback": {
- "checks": [
- "Berichten Sie über die Benutzerfreundlichkeit einer Seite.",
- "Helfen Sie bei der Analyse der Webseitengeschwindigkeit.",
- "Geben Sie Verbesserungsvorschläge für die Seite."
- ],
- "title": "Ein PageSpeed-Monitor wird verwendet, um:",
- "actionButton": "Lassen Sie uns Ihren ersten PageSpeed-Monitor erstellen!"
- }
- },
- "uptimeMonitor": {
- "fallback": {
- "checks": [
- "Prüfen Sie, ob Websites oder Server online und reaktionsfähig sind.",
- "Benachrichtigen Sie Ihre Teams über Ausfallzeiten oder Leistungsprobleme.",
- "Überwachen Sie HTTP-Endpunkte, Pings, Container und Ports.",
- "Verfolgen Sie historische Verfügbarkeits- und Zuverlässigkeitstrends."
- ],
- "title": "Ein Uptime-Monitor wird verwendet, um:",
- "actionButton": "Lassen Sie uns Ihren ersten Uptime-Monitor erstellen!"
- }
- },
- "editUserPage": {
- "form": {
- "email": "E-Mail",
- "firstName": "Vorname",
- "lastName": "Nachname",
- "role": "Rollen",
- "save": "Speichern"
- },
- "table": {
- "actionHeader": "Aktion",
- "roleHeader": "Rolle"
- },
- "title": "Benutzer bearbeiten",
- "toast": {
- "successUserUpdate": "Benutzer erfolgreich aktualisiert",
- "validationErrors": "Validierungsfehler"
- }
- },
- "incidentsPageActionResolveMonitor": "Monitor-Vorfälle beheben",
- "incidentsPageActionResolveAll": "Alle Vorfälle lösen",
- "matchMethodOptions": {
- "equal": "Gleich",
- "equalPlaceholder": "Erfolg",
- "include": "Enthält",
- "includePlaceholder": "OK",
- "regex": "Regex",
- "regexPlaceholder": "^(success|ok)$",
- "text": "Übereinstummungsmethode"
- },
- "monitorType": {
- "docker": {
- "label": "Container Name/ID",
- "namePlaceholder": "Mein Container",
- "placeholder": "Meine-App"
- },
- "http": {
- "label": "Zu überwachende URL",
- "namePlaceholder": "Google",
- "placeholder": "google.de"
+ "pageSpeed": {
+ "charts": {
+ "common": {
+ "cls": "Cumulative Layout Shift (CLS)",
+ "fcp": "First Contentful Paint (FCP)",
+ "lcp": "Largest Contentful Paint (LCP)",
+ "si": "Speed Index (SI)",
+ "tbt": "Total Blocking Time (TBT)"
+ },
+ "legend": {
+ "title": "PageSpeed-Bericht",
+ "weight": "Gewichtung"
+ },
+ "pie": {
+ "title": "Leistungsbericht"
+ }
+ },
+ "table": {
+ "headers": {
+ "pageSpeedScore": "PageSpeed-Wert"
+ }
+ },
+ "fallback": {
+ "actionButton": "Monitor erstellen!",
+ "checks": "Report on the user experience of a page,Help analyze webpage speed,Give suggestions on how the page can be improved",
+ "title": "Ein PageSpeed-Monitor wird verwendet, um:"
+ }
},
- "ping": {
- "label": "Zu überwachende IP-Adresse",
- "namePlaceholder": "Google",
- "placeholder": "1.1.1.1"
+ "settings": {
+ "form": {
+ "timezone": {
+ "title": "Anzeigesprache Zeitzone",
+ "description": "Wählen Sie die Zeitzone, die für die Anzeige von Datum und Uhrzeit in der Anwendung verwendet wird.",
+ "option": {
+ "timezone": {
+ "label": "Anzeige-Zeitzone"
+ }
+ }
+ },
+ "ui": {
+ "title": "Erscheinungsbild",
+ "description": "Wechseln Sie zwischen hellem und dunklem Modus, ändern Sie die Sprache oder passen Sie den Diagrammtyp an.",
+ "option": {
+ "theme": {
+ "label": "Theme-Modus",
+ "light": "Hell",
+ "dark": "Dunkel"
+ },
+ "language": {
+ "label": "Sprache"
+ },
+ "chartType": {
+ "label": "Diagrammtyp",
+ "histogram": "Histogramm",
+ "heatmap": "Heatmap"
+ }
+ }
+ },
+ "pagespeed": {
+ "title": "Google PageSpeed API-Schlüssel",
+ "description": "Geben Sie Ihren Google PageSpeed API-Schlüssel ein, um die Google PageSpeed-Überwachung zu aktivieren. Klicken Sie auf Zurücksetzen, um den Schlüssel zu aktualisieren.",
+ "option": {
+ "apiKey": {
+ "label": "PageSpeed API-Schlüssel",
+ "labelSet": "API-Schlüssel ist gesetzt. Klicken Sie auf Zurücksetzen, um ihn zu ändern.",
+ "placeholder": "Geben Sie Ihren Google PageSpeed API-Schlüssel ein"
+ }
+ }
+ },
+ "url": {
+ "title": "Monitor-IP/URL auf Statusseite",
+ "description": "Zeigt die IP-Adresse oder URL des Monitors auf der öffentlichen Statusseite an. Wenn deaktiviert, wird nur der Monitor-Name angezeigt, um sensible Informationen zu schützen.",
+ "option": {
+ "showURL": {
+ "label": "IP/URL auf Statusseite anzeigen",
+ "enabled": "Aktiviert",
+ "disabled": "Deaktiviert"
+ }
+ }
+ },
+ "stats": {
+ "title": "Monitor-Verlauf",
+ "description": "Löschen Sie alle Überwachungsverläufe und Statistiken für Ihr Team. Diese Aktion ist unwiderruflich.",
+ "option": {
+ "clear": {
+ "label": "Alle Statistiken löschen. Dies ist unwiderruflich."
+ }
+ },
+ "dialog": {
+ "title": "Alle Überwachungsverläufe löschen?",
+ "description": "Dies kann nicht rückgängig gemacht werden"
+ }
+ },
+ "retention": {
+ "title": "Check-Aufbewahrung",
+ "description": "Legen Sie fest, wie lange Check-Daten aufbewahrt werden, bevor sie automatisch bereinigt werden.",
+ "option": {
+ "days": {
+ "label": "Aufbewahrungsdauer (Tage)",
+ "unlimited": "Unbegrenzt"
+ }
+ }
+ },
+ "thresholds": {
+ "title": "Globale Schwellenwerte",
+ "description": "Legen Sie globale CPU-, Arbeitsspeicher-, Festplatten- und Temperaturschwellenwerte für die Infrastrukturüberwachung fest. Diese gelten für alle Hardware-Monitore, sofern nicht überschrieben.",
+ "option": {
+ "cpu": {
+ "label": "CPU-Schwellenwert (%)",
+ "placeholder": "1 - 100"
+ },
+ "memory": {
+ "label": "Arbeitsspeicher-Schwellenwert (%)",
+ "placeholder": "1 - 100"
+ },
+ "disk": {
+ "label": "Festplatten-Schwellenwert (%)",
+ "placeholder": "1 - 100"
+ },
+ "temperature": {
+ "label": "Temperatur-Schwellenwert (°C)",
+ "placeholder": "1 - 150"
+ }
+ }
+ },
+ "email": {
+ "title": "E-Mail-Einstellungen",
+ "description": "Konfigurieren Sie die E-Mail-Einstellungen für Ihr System. Dies wird zum Senden von Benachrichtigungen und Alarmen verwendet.",
+ "descriptionTransport": "Dies erstellt einen SMTP-Transport für NodeMailer",
+ "descriptionTransportLink": "Spezifikationen hier ansehen",
+ "option": {
+ "host": {
+ "label": "E-Mail-Host - Hostname oder IP-Adresse für die Verbindung",
+ "placeholder": "smtp.gmail.com"
+ },
+ "port": {
+ "label": "E-Mail-Port - Port für die Verbindung",
+ "placeholder": "587"
+ },
+ "address": {
+ "label": "E-Mail-Adresse - Für die Authentifizierung verwendet",
+ "placeholder": "you@example.com"
+ },
+ "user": {
+ "label": "E-Mail-Benutzer - Benutzername für die Authentifizierung, überschreibt E-Mail-Adresse wenn angegeben",
+ "placeholder": "Leer lassen, wenn nicht erforderlich"
+ },
+ "password": {
+ "label": "E-Mail-Passwort - Passwort für die Authentifizierung",
+ "labelSet": "Passwort ist gesetzt. Klicken Sie auf Zurücksetzen, um es zu ändern.",
+ "placeholder": "Geben Sie Ihr Passwort ein"
+ },
+ "tlsServername": {
+ "label": "TLS-Servername - Optionaler Hostname für TLS-Validierung wenn Host eine IP ist",
+ "placeholder": "example.com"
+ },
+ "connectionHost": {
+ "label": "E-Mail-Verbindungshost - Hostname für die HELO/EHLO-Begrüßung",
+ "placeholder": "localhost"
+ },
+ "secure": {
+ "label": "SSL verwenden (empfohlen): Verbindung mit SSL/TLS verschlüsseln"
+ },
+ "pool": {
+ "label": "Verbindungspooling aktivieren: Bestehende Verbindungen zur Leistungsverbesserung wiederverwenden"
+ },
+ "ignoreTLS": {
+ "label": "STARTTLS deaktivieren: TLS nicht verwenden, auch wenn der Server es unterstützt"
+ },
+ "requireTLS": {
+ "label": "STARTTLS erzwingen: TLS-Upgrade erforderlich, Fehler wenn nicht unterstützt"
+ },
+ "rejectUnauthorized": {
+ "label": "Ungültige Zertifikate ablehnen: Verbindungen mit selbstsignierten oder nicht vertrauenswürdigen Zertifikaten ablehnen"
+ }
+ }
+ },
+ "demoMonitors": {
+ "title": "Demo-Monitore",
+ "description": "Beispiel-Monitore zu Demonstrationszwecken hinzufügen."
+ },
+ "removeMonitors": {
+ "title": "System zurücksetzen",
+ "description": "Alle Monitore aus Ihrem System entfernen.",
+ "dialog": {
+ "title": "Alle Monitore entfernen?",
+ "description": "Dies kann nicht rückgängig gemacht werden."
+ }
+ },
+ "exportMonitors": {
+ "title": "Monitore exportieren"
+ },
+ "importExportMonitors": {
+ "title": "Monitore importieren / exportieren",
+ "description": "Importieren oder exportieren Sie Ihre Monitor-Daten als JSON-Datei zur Sicherung oder Übertragung."
+ },
+ "about": {
+ "title": "Über",
+ "developedBy": "Entwickelt von Bluewave Labs"
+ },
+ "validation": {
+ "errorMessage": "Bitte beheben Sie die folgenden Validierungsfehler:"
+ }
+ }
},
- "port": {
- "label": "Zu überwachende URL",
- "namePlaceholder": "localhost:5173",
- "placeholder": "localhost"
+ "statusPages": {
+ "deleteSuccess": "Statusseite erfolgreich gelöscht",
+ "fallback": {
+ "title": "Eine Statusseite wird verwendet, um:",
+ "checks": "Communicate system status to users and stakeholders,Display real-time uptime information publicly,Build trust with transparent service monitoring,Reduce support requests during incidents",
+ "actionButton": "Statusseite erstellen!"
+ },
+ "monitorsList": {
+ "chartTypeHeatmap": "Heatmap",
+ "chartTypeHistogram": "Histogramm",
+ "noData": "Keine Daten verfügbar",
+ "infrastructure": {
+ "title": "Infrastruktur",
+ "cpu": "CPU",
+ "memory": "RAM",
+ "memoryText": "Arbeitsspeicher",
+ "disk": "Festplatte",
+ "usage": "Auslastung",
+ "used": "Belegt",
+ "total": "Gesamt"
+ },
+ "uptime": {
+ "title": "Verfügbarkeit",
+ "responseTime": "Antwortzeit"
+ }
+ },
+ "statusBar": {
+ "allDown": "Alle Systeme sind ausgefallen",
+ "allUp": "Alle Systeme funktionsfähig",
+ "degraded": "Einige Systeme haben Probleme",
+ "unknown": "Systemstatus kann nicht ermittelt werden"
+ },
+ "table": {
+ "headers": {
+ "name": "Name der Statusseite",
+ "url": "Öffentliche URL"
+ },
+ "published": "Veröffentlicht",
+ "unpublished": "Unveröffentlicht"
+ },
+ "title": "Statusseiten",
+ "details": {
+ "empty": {
+ "title": "Hier gibt es noch nichts",
+ "addMonitor": "Fügen Sie einen Monitor hinzu, um zu beginnen"
+ }
+ },
+ "form": {
+ "access": {
+ "title": "Zugriff",
+ "description": "Wenn Ihre Statusseite bereit ist, können Sie sie als veröffentlicht markieren.",
+ "option": {
+ "published": {
+ "name": "Veröffentlicht und öffentlich sichtbar"
+ }
+ }
+ },
+ "basicInfo": {
+ "title": "Grundinformationen",
+ "description": "Definieren Sie den Firmennamen und die Subdomain, auf die Ihre Statusseite verweist.",
+ "option": {
+ "name": {
+ "label": "Firmenname",
+ "placeholder": "Muster GmbH"
+ },
+ "url": {
+ "label": "Ihre Statusseiten-Adresse",
+ "placeholder": "my-status-page"
+ }
+ }
+ },
+ "monitors": {
+ "title": "Monitore",
+ "description": "Wählen Sie die Monitore aus, die auf Ihrer Statusseite angezeigt werden sollen.",
+ "noMonitors": "Keine Monitore ausgewählt",
+ "option": {
+ "monitors": {
+ "label": "Monitore auswählen",
+ "placeholder": "Monitore suchen und auswählen..."
+ }
+ }
+ },
+ "timezone": {
+ "title": "Zeitzone",
+ "description": "Wählen Sie die Zeitzone, in der Ihre Statusseite angezeigt wird.",
+ "option": {
+ "timezone": {
+ "label": "Zeitzone",
+ "placeholder": "Zeitzone auswählen..."
+ }
+ }
+ },
+ "appearance": {
+ "title": "Erscheinungsbild",
+ "description": "Definieren Sie das Standardaussehen Ihrer öffentlichen Statusseite.",
+ "option": {
+ "logo": {
+ "label": "Logo"
+ },
+ "color": {
+ "label": "Markenfarbe"
+ }
+ }
+ },
+ "features": {
+ "title": "Funktionen",
+ "description": "Konfigurieren Sie, welche Informationen auf Ihrer Statusseite angezeigt werden.",
+ "option": {
+ "showCharts": {
+ "label": "Antwortzeit-Diagramme anzeigen"
+ },
+ "showUptimePercentage": {
+ "label": "Verfügbarkeitsprozentsatz anzeigen"
+ },
+ "showAdminLoginLink": {
+ "label": "Admin-Login-Link anzeigen"
+ },
+ "showInfrastructure": {
+ "label": "Infrastruktur-Metriken anzeigen"
+ }
+ }
+ }
+ }
},
- "game": {
- "label": "Zu überwachende URL",
- "namePlaceholder": "localhost:5173",
- "placeholder": "localhost"
- }
- },
- "uptimeAdvancedMatching": {
- "jsonPath": "JSON Pfad"
- },
- "bytesPerSecond": "Bytes pro Sekunde",
- "bytesReceived": "Empfangene Bytes",
- "bytesSent": "Gesendete Bytes",
- "chooseGame": "Spiel auswählen",
- "createMonitorPage": {
- "incidentConfigDescription": "Mithilfe eines gleitenden Fensters wird ermittelt, wann ein Monitor ausfällt. Der Status eines Monitors ändert sich nur, wenn der Prozentsatz der Prüfungen im gleitenden Fenster den angegebenen Wert erreicht.",
- "incidentConfigStatusWindowLabel": "Wie viele Prüfungen sollen im gleitenden Fenster ausgeführt werden?",
- "incidentConfigStatusWindowThresholdLabel": "Wie viel Prozent der Prüfungen im gleitenden Fenster sollen fehlschlagen/erfolgreich sein, bevor sich der Status ändert?",
- "incidentConfigTitle": "Vorfälle",
- "incidentConfigDescriptionV2": "Anzahl der aufeinanderfolgenden Prüfungen, die zum Ändern des Monitorstatus erforderlich sind. Maximal 25",
- "incidentConfigStatusCheckNumber": "Anzahl der Prüfungen bevor sich er Status ändert",
- "intervalTitle": "Prüfintervall",
- "intervalDescription": "Wie oft soll die Überwachung geprüft werden."
- },
- "dataRate": "Datenrate",
- "dataReceived": "Empfangene Daten",
- "dataSent": "Gesendete Daten",
- "details": "Details",
- "drops": "verloren",
- "errors": "Fehler",
- "errorsIn": "Fehler eingehend",
- "errorsOut": "Fehler ausgehend",
- "gameServerMonitoring": "Spiele Server Überwachung",
- "gameServerMonitoringDescription": "Prüfen ob der Spiele-Server läuft oder nicht",
- "network": "Netzwerk",
- "networkDrops": "Netzwerkabbrüche",
- "networkErrors": "Netzwerkfehler",
- "networkInterface": "Netzwerkschnittstelle",
- "noNetworkStatsAvailable": "Keine Netzwerkstatistiken verfügbar.",
- "packetsPerSecond": "Pakete pro Sekunde",
- "packetsReceived": "Empfangene Pakete",
- "packetsReceivedRate": "Rate empfangener Pakete",
- "packetsSent": "Gesendete Pakete",
- "rate": "Rate",
- "selectInterface": "Schnittstelle auswählen",
- "v1": {
- "infrastructure": {
- "disk_selection_title": "Festplattenauswahl",
- "disk_selection_info": "Momentan wurde keine Festplatte erkannt.",
- "disk_selection_description": "Wählen Sie die spezifischen Festplatten aus, die Sie überwachen möchten."
+ "uptime": {
+ "filters": {
+ "search": {
+ "placeholder": "Monitore suchen..."
+ }
+ },
+ "table": {
+ "headers": {
+ "responseTime": "Antwortzeit"
+ }
+ },
+ "fallback": {
+ "actionButton": "Monitor erstellen!",
+ "checks": "Check if websites or servers are online & responsive,Alert teams about downtime or performance issues,Monitor HTTP endpoints, pings, containers & ports,Track historical uptime and reliability trends",
+ "title": "Ein Verfügbarkeitsmonitor wird verwendet, um:"
+ }
}
}
}
diff --git a/client/src/locales/en.json b/client/src/locales/en.json
index 92a21939f3..d7ac392c6f 100644
--- a/client/src/locales/en.json
+++ b/client/src/locales/en.json
@@ -543,6 +543,15 @@
"description": "Select the notification channels you want to use",
"title": "Notifications"
},
+ "escalation": {
+ "description": "Notify additional channels when a monitor outage is escalated.",
+ "option": {
+ "delay": {
+ "label": "Escalate after (minutes)"
+ }
+ },
+ "title": "Escalation notifications"
+ },
"type": {
"description": "Select the type of check to perform",
"optionDockerDescription": "Use Docker to monitor if a container is running.",
@@ -951,6 +960,14 @@
"description": "Select the type of notification channel to create.",
"optionType": "Type",
"title": "Channel type"
+ },
+ "telegram": {
+ "title": "Telegram configuration",
+ "description": "Configure your Telegram bot to send notifications.",
+ "optionBotToken": "Bot token",
+ "placeholderBotToken": "123456789:ABCdefGhIJKlmNoPQRsTUVwxyZ",
+ "optionChatId": "Chat ID",
+ "placeholderChatId": "-1001234567890"
}
},
"table": {
diff --git a/client/src/locales/es.json b/client/src/locales/es.json
index ed6a98c5d9..2006e1ceac 100644
--- a/client/src/locales/es.json
+++ b/client/src/locales/es.json
@@ -1,1108 +1,1305 @@
{
- "submit": "Enviar",
- "title": "Titulo",
- "distributedStatusHeaderText": "Cobertura en tiempo real, para dispositivos reales",
- "distributedStatusSubHeaderText": "Potenciado por millones de dispositivos alrededor del mundo, vea el rendimiento del sistema por región global, país o ciudad",
- "settingsDisabled": "Deshabilitado",
- "settingsSuccessSaved": "Ajustes guardados correctamente",
- "settingsFailedToSave": "Fallo al guardar los ajustes",
- "settingsStatsCleared": "Estadísticas eliminadas correctamente",
- "settingsFailedToClearStats": "Fallo al eliminar las estadísticas",
- "settingsMonitorsDeleted": "Todos los monitores eliminados correctamente",
- "settingsFailedToDeleteMonitors": "Fallo al eliminar todos los monitores",
- "starPromptTitle": "",
- "starPromptDescription": "Vea las últimas versiones y ayude a incrementar la comunidad en Github",
- "https": "HTTPS",
- "http": "HTTP",
- "monitor": "monitor",
- "aboutus": "Acerca de",
- "now": "Ahora",
- "delete": "Eliminar",
- "configure": "Configurar",
- "responseTime": "Tiempo de Respuesta",
- "ms": "ms",
- "bar": "Barra",
- "area": "Área",
- "country": "PAIS",
- "city": "CIUDAD",
- "response": "RESPUESTA",
- "monitorStatusUp": "El monitor {name} ({url}) está ahora activo y respondiendo",
- "monitorStatusDown": "El monitor {name} ({url}) está inactivo y no está respondiendo",
- "webhookSendSuccess": "Notificación webhook enviada correctamente",
- "webhookSendError": "Error al enviar notificación webhook a {platform}",
- "webhookUnsupportedPlatform": "Plataforma no soportada: {platform}",
- "distributedRightCategoryTitle": "Monitor",
- "distributedStatusServerMonitors": "Monitores de Servidores",
- "distributedStatusServerMonitorsDescription": "Monitoree el estado de los servidores relacionados",
- "distributedUptimeCreateSelectURL": "Aquí puede seleccionar la URL del anfitrión, junto con el tipo de monitor.",
- "distributedUptimeCreateChecks": "Verificaciones a realizar",
- "distributedUptimeCreateChecksDescription": "Usted siempre puede agregar o eliminar verificaciones luego de añadir su sitio.",
- "distributedUptimeCreateIncidentNotification": "Notificaciones de incidentes",
- "distributedUptimeCreateIncidentDescription": "Cuando ocurra un incidente, notificar a usuarios.",
- "distributedUptimeCreateAdvancedSettings": "Ajustes avanzados",
- "distributedUptimeDetailsNoMonitorHistory": "No hay historial de verificaciones para este monitor aún.",
- "distributedUptimeDetailsStatusHeaderUptime": "Tiempo de funcionamiento:",
- "distributedUptimeDetailsStatusHeaderLastUpdate": "Actualizado por última vez",
- "notifications": {
- "enableNotifications": "Habilitar notificaciones para {{platform}}",
- "testNotification": "Notificación de prueba",
- "addOrEditNotifications": "Agregar o eliminar notificaciones",
- "slack": {
- "label": "Slack",
- "description": "Para habilitar notificaciones de Slack, cree una aplicación de Slack y habilite los webhooks entrantes. Luego de eso, simplemente introduzca la URL del webhook aquí.",
- "webhookLabel": "URL del webhook",
- "webhookPlaceholder": "",
- "webhookRequired": ""
- },
- "discord": {
- "label": "Discord",
- "description": "Para enviar datos a un canal de Discord desde Checkmate a través de notificaciones de Discord utilizando webhooks, puede utilizar la característica de webhooks entrantes de Discord.",
- "webhookLabel": "URL de Webhooks de Discord",
- "webhookPlaceholder": "",
- "webhookRequired": ""
+ "common": {
+ "auth": {
+ "roles": {
+ "admin": "Administrador",
+ "demo": "Demostración",
+ "superadmin": "Superadministrador",
+ "user": "Usuario"
+ }
},
- "telegram": {
- "label": "Telegram",
- "description": "Para habilitar las notificaciones de Telegram, cree un bot de Telegram utilizando BotFather, un bot oficial para crear y administrar bots de Telegram. Entonces, obtenga una clave API y un ID de chat y escríbalos aquí.",
- "tokenLabel": "La clave de su bot",
- "tokenPlaceholder": "123456:ABC-DEF1234ghIkl-zyx57W2v1u123ew11",
- "chatIdLabel": "El ID de su Chat",
- "chatIdPlaceholder": "-1001234567890",
- "fieldsRequired": ""
+ "alerts": {
+ "pageSpeedApiKey": {
+ "content": "Advertencia: Aún no ha agregado una clave de API de Google PageSpeed. Visite Configuración para agregar una. Sin ella, el monitor de PageSpeed no funcionará."
+ }
},
- "webhook": {
- "label": "Webhooks",
- "description": "Puede establecer un webhook personalizado para recibir notificaciones cuando ocurra un incidente.",
- "urlLabel": "URL del webhook",
- "urlPlaceholder": "https://your-server.com/webhook",
- "urlRequired": ""
+ "appName": "",
+ "breadcrumbs": {
+ "details": "Detalles",
+ "home": "Inicio"
},
- "testNotificationDevelop": "Notificación de prueba 2",
- "integrationButton": "",
- "testSuccess": "",
- "testFailed": "",
- "unsupportedType": "",
- "networkError": "",
- "fallback": {
- "title": "",
- "checks": [""],
- "actionButton": ""
+ "buttons": {
+ "addMember": "Agregar miembro",
+ "cancel": "Cancelar",
+ "close": "Cerrar",
+ "configure": "Configurar",
+ "confirm": "Confirmar",
+ "create": "Crear",
+ "delete": "Eliminar",
+ "generateToken": "Generar token",
+ "incidents": "Incidentes",
+ "inviteMember": "Invitar miembro",
+ "pause": "Pausar",
+ "resume": "Reanudar",
+ "save": "Guardar",
+ "sendInvite": "Enviar invitación",
+ "test": "Probar",
+ "testNotifications": "Probar notificaciones",
+ "toggleTheme": "",
+ "flushQueue": "Vaciar cola",
+ "notFound": "Ir al panel principal",
+ "resetPassword": "",
+ "reset": "",
+ "clear": "Limpiar",
+ "addDemo": "Agregar monitores de demostración",
+ "removeMonitors": "Eliminar monitores",
+ "sendTestEmail": "Enviar correo de prueba",
+ "exportToJSON": "Exportar a JSON",
+ "importFromJSON": "Importar desde JSON",
+ "clearFilters": "Limpiar filtros",
+ "removeUser": "Eliminar usuario"
},
- "createButton": "",
- "createTitle": "",
- "create": {
- "success": "",
- "failed": ""
+ "charts": {
+ "labels": {
+ "averageResponseTime": "Tiempo de respuesta promedio",
+ "downtime": "Tiempo de inactividad",
+ "high": "alto",
+ "low": "bajo",
+ "uptime": "Tiempo de actividad"
+ },
+ "histogram": {
+ "avg": "Prom: {{value}} ms",
+ "max": "Máx: {{value}} ms"
+ }
},
- "fetch": {
- "success": "",
- "failed": ""
+ "dialogs": {
+ "delete": {
+ "description": "Esta acción no se puede deshacer.",
+ "title": "¿Está seguro de que desea eliminar esto?"
+ }
},
- "delete": {
- "success": "",
- "failed": ""
+ "labels": {
+ "active": "Activo",
+ "paused": "pausado",
+ "na": "N/D",
+ "resolved": "Resuelto",
+ "responseTime": "Tiempo de respuesta"
},
- "edit": {
- "success": "",
- "failed": ""
+ "form": {
+ "role": {
+ "option": {
+ "role": {
+ "label": "Roles"
+ }
+ }
+ },
+ "name": {
+ "option": {
+ "firstName": {
+ "label": "",
+ "placeholder": ""
+ },
+ "lastName": {
+ "label": "",
+ "placeholder": ""
+ }
+ }
+ },
+ "email": {
+ "option": {
+ "email": {
+ "label": "Correo electrónico",
+ "placeholder": "you@example.com"
+ }
+ }
+ }
},
- "test": {
- "success": "",
- "failed": ""
+ "table": {
+ "empty": "No hay nada aquí",
+ "headers": {
+ "actions": "",
+ "dateTime": "Fecha y hora",
+ "message": "Mensaje",
+ "monitor": "Monitor",
+ "monitorId": "ID de monitor",
+ "name": "Nombre",
+ "status": "Estado",
+ "type": "",
+ "url": "URL",
+ "interval": "Intervalo",
+ "active": "Activo",
+ "responseTime": "Tiempo de respuesta"
+ }
}
},
- "testLocale": "testLocale",
- "add": "Agregar",
- "monitors": "monitores",
- "distributedUptimeStatusCreateStatusPage": "página de estado",
- "distributedUptimeStatusCreateStatusPageAccess": "",
- "distributedUptimeStatusCreateStatusPageReady": "",
- "distributedUptimeStatusBasicInfoHeader": "",
- "distributedUptimeStatusBasicInfoDescription": "",
- "distributedUptimeStatusLogoHeader": "",
- "distributedUptimeStatusLogoDescription": "",
- "distributedUptimeStatusLogoUploadButton": "",
- "distributedUptimeStatusStandardMonitorsHeader": "",
- "distributedUptimeStatusStandardMonitorsDescription": "",
- "distributedUptimeStatusCreateYour": "",
- "distributedUptimeStatusEditYour": "",
- "distributedUptimeStatusPublishedLabel": "",
- "distributedUptimeStatusCompanyNameLabel": "",
- "distributedUptimeStatusPageAddressLabel": "",
- "distributedUptimeStatus30Days": "30 dias",
- "distributedUptimeStatus60Days": "60 días",
- "distributedUptimeStatus90Days": "90 dias",
- "distributedUptimeStatusPageNotSetUp": "",
- "distributedUptimeStatusContactAdmin": "",
- "distributedUptimeStatusPageNotPublic": "",
- "distributedUptimeStatusPageDeleteDialog": "",
- "distributedUptimeStatusPageDeleteConfirm": "",
- "distributedUptimeStatusPageDeleteDescription": "",
- "distributedUptimeStatusDevices": "Dispositivos",
- "distributedUptimeStatusUpt": "",
- "distributedUptimeStatusUptBurned": "",
- "distributedUptimeStatusUptLogo": "",
- "incidentsTableNoIncidents": "",
- "incidentsTablePaginationLabel": "Incidentes",
- "incidentsTableMonitorName": "",
- "incidentsTableStatus": "Estado",
- "incidentsTableDateTime": "",
- "incidentsTableStatusCode": "",
- "incidentsTableMessage": "Mensaje",
- "incidentsOptionsHeader": "",
- "incidentsOptionsHeaderFilterBy": "",
- "incidentsOptionsHeaderFilterAll": "Todo",
- "incidentsOptionsHeaderFilterDown": "",
- "incidentsOptionsHeaderFilterCannotResolve": "",
- "incidentsOptionsHeaderShow": "Mostrar:",
- "incidentsOptionsHeaderLastHour": "",
- "incidentsOptionsHeaderLastDay": "",
- "incidentsOptionsHeaderLastWeek": "",
- "incidentsOptionsPlaceholderAllServers": "",
- "infrastructureCreateYour": "",
- "infrastructureCreateGeneralSettingsDescription": "",
- "infrastructureServerRequirement": "",
- "infrastructureCustomizeAlerts": "",
- "infrastructureAlertNotificationDescription": "",
- "infrastructureCreateMonitor": "",
- "infrastructureProtocol": "Protocolo",
- "infrastructureServerUrlLabel": "",
- "infrastructureDisplayNameLabel": "",
- "infrastructureAuthorizationSecretLabel": "",
- "gb": "GB",
- "mb": "MB",
- "mem": "Mem",
- "memoryUsage": "",
- "cpu": "CPU",
- "cpuUsage": "",
- "cpuTemperature": "",
- "diskUsage": "",
- "used": "",
- "total": "Total",
- "cores": "Nucleos",
- "frequency": "Frecuencia",
- "status": "",
- "cpuPhysical": "",
- "cpuLogical": "",
- "cpuFrequency": "",
- "avgCpuTemperature": "",
- "memory": "",
- "disk": "",
- "uptime": "",
- "os": "SO",
- "host": "",
- "actions": "",
- "integrations": "",
- "integrationsPrism": "",
- "integrationsSlack": "Slack",
- "integrationsSlackInfo": "",
- "integrationsDiscord": "Discord",
- "integrationsDiscordInfo": "",
- "integrationsZapier": "Zapier",
- "integrationsZapierInfo": "",
- "commonSave": "Guardar",
- "createYour": "",
- "createMonitor": "",
- "pause": "Pausar",
- "resume": "Resumir",
- "editing": "Editando...",
- "url": "URL",
- "access": "Acceso",
- "timezone": "",
- "features": "",
- "administrator": "",
- "loginHere": "",
- "displayName": "",
- "urlMonitor": "",
- "portToMonitor": "",
- "websiteMonitoring": "",
- "websiteMonitoringDescription": "",
- "pingMonitoring": "",
- "pingMonitoringDescription": "",
- "dockerContainerMonitoring": "",
- "dockerContainerMonitoringDescription": "",
- "portMonitoring": "",
- "portMonitoringDescription": "",
- "createMaintenanceWindow": "",
- "createMaintenance": "",
- "editMaintenance": "",
- "maintenanceWindowName": "",
- "friendlyNameInput": "",
- "friendlyNamePlaceholder": "",
- "maintenanceRepeat": "",
- "maintenance": "",
- "duration": "Duración",
- "addMonitors": "",
- "window": "ventana",
- "cancel": "Cancelar",
- "message": "Mensaje",
- "low": "bajo",
- "high": "alto",
- "statusCode": "",
- "date&Time": "",
- "type": "",
- "statusPageName": "",
- "publicURL": "",
- "repeat": "",
- "edit": "",
- "createA": "",
- "remove": "",
- "maintenanceWindowDescription": "",
- "startTime": "",
- "timeZoneInfo": "",
- "monitorsToApply": "",
- "nextWindow": "",
- "notFoundButton": "",
- "pageSpeedConfigureSettingsDescription": "",
- "monitorDisplayName": "",
- "whenNewIncident": "",
- "notifySMS": "",
- "notifyEmails": "",
- "seperateEmails": "",
- "checkFrequency": "",
- "matchMethod": "",
- "expectedValue": "",
- "deleteDialogTitle": "",
- "deleteDialogDescription": "",
- "pageSpeedMonitor": "",
- "shown": "",
- "ago": "",
- "companyName": "",
- "pageSpeedDetailsPerformanceReport": "",
- "pageSpeedDetailsPerformanceReportCalculator": "",
- "checkingEvery": "",
- "statusPageCreateSettings": "",
- "basicInformation": "",
- "statusPageCreateBasicInfoDescription": "",
- "statusPageCreateSelectTimeZoneDescription": "",
- "statusPageCreateAppearanceDescription": "",
- "statusPageCreateSettingsCheckboxLabel": "",
- "statusPageCreateBasicInfoStatusPageAddress": "",
- "statusPageCreateTabsContent": "",
- "statusPageCreateTabsContentDescription": "",
- "statusPageCreateTabsContentFeaturesDescription": "",
- "showCharts": "",
- "showUptimePercentage": "",
- "removeLogo": "",
- "statusPageStatus": "",
- "statusPageStatusContactAdmin": "",
- "statusPageStatusNotPublic": "",
- "statusPageStatusNoPage": "",
- "statusPageStatusServiceStatus": "",
- "deleteStatusPage": "",
- "deleteStatusPageConfirm": "",
- "deleteStatusPageDescription": "",
- "uptimeCreate": "",
- "uptimeCreateJsonPath": "",
- "uptimeCreateJsonPathQuery": "",
- "maintenanceTableActionMenuDialogTitle": "",
- "infrastructureEditYour": "",
- "infrastructureEditMonitor": "",
- "infrastructureMonitorCreated": "",
- "infrastructureMonitorUpdated": "",
- "errorInvalidTypeId": "",
- "errorInvalidFieldId": "",
- "inviteNoTokenFound": "",
- "pageSpeedWarning": "",
- "pageSpeedLearnMoreLink": "",
- "pageSpeedAddApiKey": "",
- "update": "",
- "invalidFileFormat": "",
- "invalidFileSize": "",
- "ClickUpload": "",
- "DragandDrop": "",
- "MaxSize": "",
- "SupportedFormats": "",
- "FirstName": "",
- "LastName": "",
- "EmailDescriptionText": "",
- "YourPhoto": "",
- "PhotoDescriptionText": "",
- "save": "",
- "DeleteDescriptionText": "",
- "DeleteAccountWarning": "",
- "DeleteWarningTitle": "",
- "bulkImport": {
- "title": "",
- "selectFileTips": "",
- "selectFileDescription": "",
- "selectFile": "",
- "parsingFailed": "",
- "uploadSuccess": "",
- "validationFailed": "",
- "noFileSelected": "",
- "fallbackPage": "",
- "invalidFileType": "",
- "uploadFailed": ""
- },
- "DeleteAccountTitle": "",
- "DeleteAccountButton": "",
- "publicLink": "",
- "maskedPageSpeedKeyPlaceholder": "",
- "reset": "",
- "ignoreTLSError": "",
- "tlsErrorIgnored": "",
- "ignoreTLSErrorDescription": "",
- "createNew": "",
- "greeting": {
- "prepend": "",
- "append": "",
- "overview": ""
- },
- "roles": {
- "superAdmin": "",
- "admin": "",
- "teamMember": "",
- "demoUser": ""
- },
- "teamPanel": {
- "teamMembers": "",
- "filter": {
- "all": "",
- "member": ""
+ "components": {
+ "imageUpload": {
+ "clickToUpload": "Haga clic para subir",
+ "dragAndDrop": "",
+ "supportedFormats": "",
+ "maxSize": "",
+ "orDragAndDrop": "o arrastre y suelte",
+ "errors": {
+ "invalidFileSize": "",
+ "invalidFileFormat": ""
+ }
},
- "inviteTeamMember": "",
- "inviteNewTeamMember": "",
- "inviteDescription": "",
- "email": "",
- "selectRole": "",
- "inviteLink": "",
- "cancel": "",
- "noMembers": "",
- "getToken": "",
- "emailToken": "",
- "table": {
- "name": "",
- "email": "",
- "role": "",
- "created": ""
+ "headerStatusPageControls": {
+ "publicLink": ""
},
- "addTeamMember": {
- "addMemberMenu": "",
- "title": "",
- "description": "",
- "addButton": ""
+ "headerTimeRange": {
+ "labels": {
+ "day": "Día",
+ "month": "Mes",
+ "recent": "Reciente",
+ "week": "Semana"
+ },
+ "description": {
+ "recent": "Mostrando estadísticas de las últimas 2 horas.",
+ "day": "Mostrando estadísticas de las últimas 24 horas.",
+ "week": "Mostrando estadísticas de los últimos 7 días.",
+ "month": "Mostrando estadísticas de los últimos 30 días."
+ }
},
- "register": "",
- "registerToast": {
- "success": "",
- "dbUserExists": "",
- "unknownError": ""
+ "offlineBanner": {
+ "serverUnreachable": "No se puede conectar al servidor",
+ "retry": "Reintentar",
+ "retrying": "Reintentando...",
+ "reconnected": ""
},
- "registerTeamMember": {
- "title": "",
- "auth": {
- "common": {
- "inputs": {
- "firstName": {
- "errors": {
- "empty": "",
- "pattern": ""
- }
- },
- "lastName": {
- "errors": {
- "empty": "",
- "pattern": ""
- }
+ "sidebar": {
+ "menu": {
+ "uptime": "",
+ "pagespeed": "",
+ "infrastructure": "",
+ "notifications": "",
+ "checks": "Verificaciones",
+ "incidents": "",
+ "statusPages": "",
+ "maintenance": "",
+ "logs": "",
+ "settings": ""
+ },
+ "bottomMenu": {
+ "support": "",
+ "discussions": "",
+ "docs": "",
+ "changelog": ""
+ },
+ "accountMenu": {
+ "profile": "Perfil",
+ "password": "Contraseña",
+ "team": "Equipo"
+ },
+ "starPrompt": {
+ "title": "Dale estrella a Checkmate",
+ "description": "Vea las últimas versiones y ayude a crecer la comunidad en GitHub"
+ },
+ "authFooter": {
+ "navControls": "",
+ "logOut": "",
+ "roles": {
+ "superAdmin": "Superadministrador",
+ "admin": "Administrador",
+ "user": "Usuario",
+ "demoUser": ""
+ }
+ }
+ },
+ "starPrompt": {
+ "title": "Dale estrella a Checkmate",
+ "description": "Vea las últimas versiones y ayude a crecer la comunidad en GitHub"
+ }
+ },
+ "pages": {
+ "notFound": {
+ "title": "¡Oh no! ¡Se le cayó el sushi!",
+ "subtitle": "La URL no existe o no tiene acceso a ella."
+ },
+ "account": {
+ "tabs": {
+ "profile": "Perfil",
+ "password": "Contraseña",
+ "team": "Equipo"
+ },
+ "form": {
+ "name": {
+ "title": "Nombre",
+ "description": "Actualice su información personal"
+ },
+ "photo": {
+ "title": "Foto de perfil",
+ "description": "Suba una foto de perfil"
+ },
+ "currentPassword": {
+ "title": "Contraseña actual",
+ "description": "Ingrese su contraseña actual para verificar su identidad",
+ "option": {
+ "label": "Contraseña actual",
+ "placeholder": "Ingrese la contraseña actual"
+ }
+ },
+ "newPassword": {
+ "title": "Nueva contraseña",
+ "description": "Elija una contraseña segura de al menos 8 caracteres",
+ "option": {
+ "newPassword": {
+ "label": "Nueva contraseña",
+ "placeholder": "Ingrese la nueva contraseña"
},
+ "confirm": {
+ "label": "Confirmar contraseña",
+ "placeholder": "Confirmar nueva contraseña"
+ }
+ }
+ },
+ "deleteAccount": {
+ "title": "Eliminar cuenta",
+ "description": "Esta acción es permanente y no se puede deshacer"
+ }
+ },
+ "team": {
+ "filter": {
+ "placeholder": "Filtrar por rol",
+ "all": "",
+ "admin": "Administrador",
+ "member": ""
+ },
+ "table": {
+ "headers": {
+ "email": "Correo electrónico",
+ "role": "Rol",
+ "created": ""
+ }
+ },
+ "addMember": {
+ "title": "Registrar nuevo miembro del equipo",
+ "description": "Cree una nueva cuenta de usuario. Comparta las credenciales de forma segura después de la creación."
+ },
+ "invite": {
+ "title": "Invitar miembro del equipo",
+ "description": "Envíe una invitación para unirse a su equipo",
+ "email": {
+ "label": "Dirección de correo electrónico",
+ "placeholder": "Ingrese la dirección de correo electrónico"
+ },
+ "role": {
+ "label": "Rol",
+ "placeholder": "Seleccione un rol"
+ },
+ "linkLabel": "Enlace de invitación"
+ }
+ }
+ },
+ "auth": {
+ "common": {
+ "passwordRules": {
+ "length": {
+ "beginning": "",
+ "highlighted": ""
+ },
+ "lowercase": {
+ "beginning": "",
+ "highlighted": ""
+ },
+ "match": {
+ "beginning": "",
+ "highlighted": ""
+ },
+ "number": {
+ "beginning": "",
+ "highlighted": ""
+ },
+ "special": {
+ "beginning": "",
+ "highlighted": ""
+ },
+ "uppercase": {
+ "beginning": "",
+ "highlighted": ""
+ }
+ },
+ "form": {
+ "option": {
"email": {
- "errors": {
- "empty": "",
- "invalid": ""
- }
+ "label": "Correo electrónico",
+ "placeholder": "me@example.com"
},
- "role": {
- "errors": {
- "empty": ""
- }
+ "password": {
+ "label": "Contraseña",
+ "placeholder": "********"
+ },
+ "confirmPassword": {
+ "label": "Confirmar contraseña"
}
}
}
+ },
+ "login": {
+ "title": "¡Bienvenido de nuevo a Checkmate!",
+ "subtitle": "Inicie sesión para continuar",
+ "submit": "Iniciar sesión",
+ "links": {
+ "forgotPassword": {
+ "text": "¿Olvidó su contraseña?",
+ "linkText": "Restablecer contraseña"
+ },
+ "register": {
+ "text": "¿No tiene una cuenta?",
+ "linkText": "Regístrese aquí"
+ }
+ }
+ },
+ "register": {
+ "title": "¡Bienvenido de nuevo a Checkmate!",
+ "subtitle": "Regístrese para comenzar",
+ "submit": "Registrarse"
+ },
+ "forgotPassword": {
+ "title": "¿Olvidó su contraseña?",
+ "subtitle": "No se preocupe, le enviaremos instrucciones para restablecer.",
+ "submit": "Solicitar recuperación",
+ "links": {
+ "login": {
+ "text": "Regresar a",
+ "linkText": "iniciar sesión"
+ }
+ }
+ },
+ "setNewPassword": {
+ "title": "Restablezca su contraseña",
+ "subtitle": "Su nueva contraseña debe ser diferente a las contraseñas utilizadas anteriormente."
}
},
- "role": "",
- "changeTeamPassword": {
- "changePasswordMenu": "",
- "title": "",
- "description": "",
- "success": ""
- }
- },
- "monitorState": {
- "paused": "",
- "resumed": "",
- "active": ""
- },
- "menu": {
- "uptime": "",
- "pagespeed": "",
- "infrastructure": "",
- "incidents": "",
- "statusPages": "",
- "maintenance": "",
- "integrations": "",
- "settings": "",
- "support": "",
- "discussions": "",
- "docs": "",
- "changelog": "",
- "profile": "",
- "password": "",
- "team": "",
- "logOut": "",
- "notifications": "",
- "logs": ""
- },
- "settingsEmailUser": "",
- "state": "",
- "statusBreadCrumbsStatusPages": "",
- "statusBreadCrumbsDetails": "",
- "commonSaving": "",
- "navControls": "",
- "incidentsPageTitle": "",
- "passwordPanel": {
- "passwordChangedSuccess": "",
- "passwordInputIncorrect": "",
- "currentPassword": "",
- "enterCurrentPassword": "",
- "newPassword": "",
- "enterNewPassword": "",
- "confirmNewPassword": "",
- "passwordRequirements": "",
- "saving": ""
- },
- "emailSent": "",
- "failedToSendEmail": "",
- "settingsTestEmailSuccess": "",
- "settingsTestEmailFailed": "",
- "settingsTestEmailFailedWithReason": "",
- "settingsTestEmailUnknownError": "",
- "statusMsg": {
- "paused": "",
- "up": "",
- "down": "",
- "pending": ""
- },
- "uptimeGeneralInstructions": {
- "http": "",
- "ping": "",
- "docker": "",
- "port": "",
- "game": "",
- "https": ""
- },
- "common": {
- "appName": "",
- "monitoringAgentName": "",
- "buttons": {
- "toggleTheme": ""
+ "checks": {
+ "selects": {
+ "monitor": {
+ "all": "Todos los monitores"
+ },
+ "status": {
+ "all": "Todos",
+ "down": "Caído",
+ "up": "Activo"
+ }
+ },
+ "table": {
+ "empty": "No hay verificaciones caídas en este rango de tiempo",
+ "headers": {
+ "statusCode": "Código de estado",
+ "location": "Ubicación"
+ }
+ }
},
- "toasts": {
- "networkError": "",
- "checkConnection": "",
- "unknownError": ""
- }
- },
- "auth": {
"common": {
- "navigation": {
- "continue": "",
- "back": ""
- },
- "inputs": {
- "email": {
- "label": "",
- "placeholder": "",
- "errors": {
- "empty": "",
- "invalid": ""
- }
+ "monitors": {
+ "actions": {
+ "configure": "Configurar",
+ "delete": "Eliminar",
+ "generateToken": "Generar token",
+ "details": "Detalles",
+ "incidents": "Incidentes",
+ "inviteMember": "Invitar miembro",
+ "openSite": "Abrir sitio",
+ "pause": "Pausar",
+ "resume": "Reanudar"
},
- "password": {
- "label": "",
- "rules": {
- "length": {
- "beginning": "",
- "highlighted": ""
+ "statBoxes": {
+ "activeFor": "Activo desde hace",
+ "certificateExpiry": "Vencimiento del certificado",
+ "lastCheck": "Última verificación",
+ "lastResponseTime": "Último tiempo de respuesta"
+ },
+ "status": {
+ "down": "caído",
+ "breached": "umbral excedido",
+ "initializing": "inicializando",
+ "maintenance": "mantenimiento",
+ "paused": "pausado",
+ "total": "total",
+ "up": "activo"
+ },
+ "monitorTypes": {
+ "optionDocker": "Docker",
+ "optionGame": "Juego",
+ "optionHttp": "HTTP(S)",
+ "optionPing": "Ping",
+ "optionPort": "Puerto",
+ "optionPagespeed": "PageSpeed",
+ "optionHardware": "Infraestructura",
+ "optionGrpc": "gRPC",
+ "optionWebSocket": "WebSocket"
+ }
+ }
+ },
+ "createMonitor": {
+ "form": {
+ "advanced": {
+ "description": "Configuración opcional para casos de uso avanzados",
+ "option": {
+ "advancedMatching": {
+ "label": "Usar coincidencia avanzada"
},
- "special": {
- "beginning": "",
- "highlighted": ""
+ "expectedValue": {
+ "label": "Valor esperado"
},
- "number": {
- "beginning": "",
- "highlighted": ""
+ "jsonPath": {
+ "description": "Esta expresión se evaluará contra los datos JSON de la respuesta y el resultado se usará para comparar con el valor esperado. Consulte jmespath.org para documentación del lenguaje de consulta.",
+ "label": "Expresión JSONPath"
},
- "uppercase": {
- "beginning": "",
- "highlighted": ""
+ "matchMethod": {
+ "label": "Método de coincidencia",
+ "equal": "",
+ "include": "",
+ "regex": ""
+ }
+ },
+ "title": "Configuración avanzada"
+ },
+ "frequency": {
+ "description": "¿Con qué frecuencia desea verificar el estado de este monitor?",
+ "option": {
+ "frequency": {
+ "label": "Frecuencia de verificación",
+ "value": {
+ "fifteenMinutes": "15 minutos",
+ "fifteenSeconds": "",
+ "fiveMinutes": "5 minutos",
+ "fourMinutes": "",
+ "oneMinute": "",
+ "tenMinutes": "10 minutos",
+ "thirtyMinutes": "30 minutos",
+ "thirtySeconds": "",
+ "threeMinutes": "",
+ "twoMinutes": ""
+ }
+ }
+ },
+ "title": "Frecuencia de verificación"
+ },
+ "general": {
+ "option": {
+ "container": {
+ "label": "Nombre/ID de contenedor",
+ "placeholder": "my-app o abcd1234"
+ },
+ "host": {
+ "label": "Host",
+ "placeholder": "192.168.1.100 o example.com"
+ },
+ "name": {
+ "label": "Nombre para mostrar",
+ "placeholder": "p. ej. Mi sitio web"
+ },
+ "secret": {
+ "label": "Secreto de autorización",
+ "placeholder": "Ingrese su clave secreta"
+ },
+ "url": {
+ "label": "URL",
+ "placeholder": "https://www.google.com"
+ },
+ "game": {
+ "label": "",
+ "placeholder": ""
},
- "lowercase": {
- "beginning": "",
- "highlighted": ""
+ "port": {
+ "label": "Puerto a monitorear",
+ "placeholder": "80"
},
- "match": {
- "beginning": "",
- "highlighted": ""
+ "grpcServiceName": {
+ "label": "Nombre del servicio",
+ "placeholder": "p. ej. my.service.v1 (dejar vacío para estado general)"
+ },
+ "wsUrl": {
+ "label": "URL de WebSocket",
+ "placeholder": "wss://example.com/socket"
}
},
- "errors": {
- "empty": "",
- "length": "",
- "uppercase": "",
- "lowercase": "",
- "number": "",
- "special": "",
- "incorrect": ""
+ "title": "Configuración general",
+ "description": {
+ "http": "Ingrese la URL o IP a monitorear (p. ej., https://example.com/ o 192.168.1.100) y agregue un nombre para mostrar que aparecerá en el panel.",
+ "ping": "",
+ "port": "",
+ "docker": "",
+ "game": "",
+ "pagespeed": "Rastree el rendimiento de carga de página, Core Web Vitals y puntuaciones de optimización de su sitio web.",
+ "grpc": "Ingrese el nombre de host y puerto del servidor gRPC, opcionalmente especifique un nombre de servicio para la verificación de salud, y agregue un nombre para mostrar.",
+ "websocket": "Ingrese la URL de WebSocket a monitorear (p. ej., wss://example.com/socket) y agregue un nombre para mostrar.",
+ "hardware": "Monitoree el uso de CPU, memoria, disco y temperatura de su infraestructura."
}
},
- "passwordConfirm": {
- "label": "",
- "placeholder": "",
- "errors": {
- "empty": "",
- "different": ""
- }
+ "ignoreTls": {
+ "description": "Configure la validación de certificados TLS/SSL para conexiones HTTPS.",
+ "option": {
+ "tls": {
+ "label": "Ignorar errores de TLS/SSL"
+ }
+ },
+ "title": "Configuración de TLS/SSL"
+ },
+ "incidents": {
+ "description": "Se utiliza una ventana deslizante para determinar cuándo un monitor cae. El estado de un monitor solo cambiará cuando el porcentaje de verificaciones en la ventana deslizante cumpla con el valor especificado.",
+ "option": {
+ "checks": {
+ "label": "Número de verificaciones en la ventana deslizante"
+ },
+ "percentage": {
+ "label": "¿Qué porcentaje de verificaciones en la ventana deslizante deben fallar/tener éxito antes de que cambie el estado del monitor?"
+ }
+ },
+ "title": "Incidentes"
},
- "firstName": {
- "label": "",
- "placeholder": "",
- "errors": {
- "empty": "",
- "length": "",
- "pattern": ""
+ "notifications": {
+ "description": "Seleccione los canales de notificación que desea usar",
+ "title": "Notificaciones"
+ },
+ "type": {
+ "description": "Seleccione el tipo de verificación a realizar",
+ "optionDockerDescription": "Use Docker para monitorear si un contenedor está en ejecución.",
+ "optionGameDescription": "Monitoree si un servidor de juegos específico está en línea.",
+ "optionGrpcDescription": "Monitoree servicios gRPC usando el protocolo estándar de verificación de salud.",
+ "optionWebSocketDescription": "Monitoree endpoints de WebSocket para verificar la salud de la conexión y el tiempo de respuesta.",
+ "optionHttpDescription": "Use HTTP(S) para monitorear su sitio web o endpoint de API.",
+ "optionPingDescription": "Use ICMP Ping para monitorear si un servidor está en línea.",
+ "optionPortDescription": "Monitoree si un puerto específico de un servidor está abierto.",
+ "title": "Tipo"
+ },
+ "thresholds": {
+ "title": "Umbrales de alerta",
+ "description": "Defina los umbrales en los que se deben activar las alertas para este monitor de hardware.",
+ "option": {
+ "cpuThreshold": {
+ "label": "Umbral de alerta de CPU (%)"
+ },
+ "memoryThreshold": {
+ "label": "Umbral de alerta de memoria (%)"
+ },
+ "diskThreshold": {
+ "label": "Umbral de alerta de disco (%)"
+ },
+ "tempThreshold": {
+ "label": "Umbral de alerta de temperatura (°C)"
+ }
}
},
- "lastName": {
- "label": "",
- "placeholder": "",
- "errors": {
- "empty": "",
- "length": "",
- "pattern": ""
+ "geoChecks": {
+ "title": "Verificaciones geodistribuidas",
+ "description": "Ejecute verificaciones desde múltiples ubicaciones geográficas para monitorear la disponibilidad y el rendimiento global.",
+ "option": {
+ "enabled": {
+ "label": "Habilitar verificaciones geodistribuidas"
+ },
+ "locations": {
+ "label": "Ubicaciones",
+ "placeholder": "Seleccionar ubicaciones",
+ "options": {
+ "EU": "Europa",
+ "NA": "Norteamérica",
+ "AS": "Asia",
+ "SA": "Sudamérica",
+ "AF": "África",
+ "OC": "Oceanía"
+ }
+ },
+ "interval": {
+ "label": "Intervalo de verificación",
+ "value": {
+ "fiveMinutes": "5 minutos",
+ "tenMinutes": "10 minutos",
+ "fifteenMinutes": "15 minutos",
+ "thirtyMinutes": "30 minutos"
+ }
+ }
}
- }
- },
- "errors": {
- "validation": ""
- },
- "fields": {
- "password": {
- "errors": {
- "incorrect": ""
+ },
+ "url": {
+ "title": "IP/URL del monitor en la página de estado",
+ "description": "Muestre la dirección IP o URL del monitor en la página de estado pública. Si está deshabilitado, solo se mostrará el nombre del monitor para proteger información sensible.",
+ "option": {
+ "showURL": {
+ "label": "Mostrar IP/URL en la página de estado",
+ "enabled": "Habilitado",
+ "disabled": "Deshabilitado"
+ }
}
},
- "role": {
- "errors": {
- "min": ""
+ "stats": {
+ "title": "Historial del monitor",
+ "description": "Limpie todo el historial de monitoreo y estadísticas de su equipo. Esta acción es irreversible.",
+ "buttonText": "Limpiar todas las estadísticas",
+ "dialog": {
+ "title": "¿Limpiar todo el historial de monitoreo?",
+ "description": "Esto eliminará permanentemente todo el historial de monitoreo, estadísticas y datos de verificación de su equipo. Esta acción no se puede deshacer.",
+ "confirm": "Sí, limpiar todas las estadísticas"
}
}
}
},
- "login": {
- "heading": "",
- "subheadings": {
- "stepOne": "",
- "stepTwo": ""
+ "editUser": {
+ "form": {
+ "roles": {
+ "title": "Roles",
+ "description": "Asigne roles al usuario. Se pueden seleccionar múltiples roles."
+ }
},
- "links": {
- "forgotPassword": "",
- "register": "",
- "forgotPasswordLink": "",
- "registerLink": ""
+ "dialog": {
+ "removeUser": {
+ "title": "Eliminar usuario",
+ "content": "¿Está seguro de que desea eliminar a {{name}} de su equipo? Esta acción no se puede deshacer."
+ }
+ }
+ },
+ "incidents": {
+ "dialog": {
+ "resolveIncident": {
+ "title": "Resolver incidente",
+ "option": {
+ "comment": {
+ "label": "Comentario (opcional)",
+ "placeholder": "Agregue un comentario sobre la resolución..."
+ }
+ }
+ },
+ "details": {
+ "analysis": "Análisis del incidente",
+ "comment": "Comentario:",
+ "detailsLabel": "Detalles",
+ "downtime": "Tiempo de inactividad:",
+ "message": "Mensaje:",
+ "monitor": "Monitor:",
+ "overview": "Resumen",
+ "resolutionDetails": "Detalles de la resolución",
+ "resolutionType": "Tipo:",
+ "resolutionTypes": {
+ "automatic": "Automático",
+ "manual": "Manual"
+ },
+ "resolve": "Resolver incidente",
+ "resolvedAt": "Resuelto a las:",
+ "resolvedBy": "Resuelto por:",
+ "startedAt": "Iniciado a las:",
+ "status": "Estado:",
+ "statusCode": "Código de estado:",
+ "timeline": "Línea de tiempo",
+ "title": "Detalles del incidente",
+ "url": "URL:"
+ }
},
- "toasts": {
- "success": "",
- "incorrectPassword": ""
+ "filters": {
+ "allMonitors": "Todos los monitores",
+ "monitor": "Monitor",
+ "resolutionType": "Tipo de resolución",
+ "resolutionTypes": {
+ "manual": "Manual",
+ "automatic": "Automático",
+ "all": "Todos"
+ }
},
- "errors": {
- "password": {
- "incorrect": ""
+ "summaryCard": {
+ "activeIncidents": {
+ "title": "Incidentes activos",
+ "active_zero": "Sin incidentes activos",
+ "active_one": "{{count}} incidente activo",
+ "active_other": "{{count}} incidentes activos"
+ },
+ "incidentStats": {
+ "avgResolutionTime": "Tiempo prom. de resolución",
+ "mostAffectedMonitor": "Monitor más afectado",
+ "title": "Estadísticas de incidentes",
+ "totalIncidents": "Total de incidentes"
+ },
+ "latestIncidents": {
+ "title": "Últimos incidentes"
}
},
- "welcome": ""
+ "table": {
+ "actions": {
+ "details": "Detalles",
+ "goToMonitor": "Ir al monitor",
+ "resolveManually": "Resolver manualmente"
+ },
+ "activeIncidents": "Incidentes activos",
+ "headers": {
+ "endTime": "Hora de fin",
+ "resolutionType": "Tipo de resolución",
+ "startTime": "",
+ "statusCode": "Código de estado"
+ },
+ "resolvedIncidents": "Incidentes resueltos",
+ "status": {
+ "active": "Activo",
+ "resolved": "Resuelto"
+ }
+ }
},
- "registration": {
- "heading": {
- "superAdmin": "",
- "user": ""
- },
- "subheadings": {
- "stepOne": "",
- "stepTwo": "",
- "stepThree": ""
+ "infrastructure": {
+ "charts": {
+ "labels": {
+ "cpu": "Uso de CPU",
+ "disk": "Uso de disco",
+ "memory": "Uso de memoria",
+ "netBytesRecv": "{{name}} - Bytes recibidos",
+ "netBytesSent": "{{name}} - Bytes enviados",
+ "temp": "Temp"
+ }
},
- "description": {
- "superAdmin": "",
- "user": ""
+ "gauges": {
+ "cpu": {
+ "lowerLabel": "Frecuencia máxima",
+ "title": "Uso de CPU",
+ "upperLabel": "Frecuencia actual"
+ },
+ "disk": {
+ "lowerLabel": "Libre",
+ "title": "Uso de disco {{idx}}",
+ "upperLabel": "Usado"
+ },
+ "memory": {
+ "lowerLabel": "Libre",
+ "title": "Uso de memoria",
+ "upperLabel": "Usado"
+ }
},
- "gettingStartedButton": {
- "superAdmin": "",
- "user": ""
+ "statBoxes": {
+ "avgCpuTemperature": "",
+ "cpuFrequency": "",
+ "cpuLogical": "",
+ "cpuPhysical": "",
+ "disk": "Disco",
+ "memory": "Memoria",
+ "os": "SO"
},
- "termsAndPolicies": "",
- "links": {
- "login": ""
+ "table": {
+ "headers": {
+ "cpu": "CPU",
+ "disk": "Disco",
+ "memory": "Memoria"
+ }
},
- "toasts": {
- "success": ""
+ "tabs": {
+ "labels": {
+ "network": "",
+ "overview": "Resumen"
+ }
},
- "welcome": ""
+ "fallback": {
+ "actionButton": "¡Cree un monitor!",
+ "checks": "Track the performance of your servers,Identify bottlenecks and optimize usage,Ensure reliability with real-time monitoring",
+ "title": "Un monitor de infraestructura se usa para:"
+ }
},
- "forgotPassword": {
- "heading": "",
- "subheadings": {
- "stepOne": "",
- "stepTwo": "",
- "stepThree": "",
- "stepFour": ""
+ "logs": {
+ "tabs": {
+ "diagnostics": "",
+ "logs": "",
+ "queue": ""
},
- "buttons": {
- "openEmail": "",
- "resetPassword": ""
+ "logLevelSelect": {
+ "label": "Nivel de registro"
},
- "imageAlts": {
- "passwordKey": "",
- "email": "",
- "lock": "",
- "passwordConfirm": ""
+ "jobQueue": "Cola de trabajos",
+ "failedJobs": "Trabajos fallidos",
+ "noLogs": "No se encontraron registros",
+ "metrics": {
+ "jobs": "Trabajos",
+ "activeJobs": "Trabajos activos",
+ "failingJobs": "Trabajos con fallas",
+ "totalRuns": "Ejecuciones totales",
+ "totalFailures": "Fallas totales"
},
- "links": {
- "login": "",
- "resend": ""
+ "diagnostics": {
+ "stats": {
+ "eventLoopDelay": "Retraso del bucle de eventos",
+ "uptime": "Tiempo de actividad",
+ "usedHeapSize": "Tamaño de heap usado",
+ "totalHeapSize": "Tamaño total de heap",
+ "osMemoryLimit": "Límite de memoria del SO"
+ },
+ "gauges": {
+ "heapAllocation": "Asignación de heap",
+ "heapUsage": "Uso de heap",
+ "heapUtilization": "Utilización de heap",
+ "instantCpuUsage": "Uso instantáneo de CPU",
+ "availableMemoryPercentage": "% de memoria disponible",
+ "allocatedPercentage": "% asignado",
+ "usedSPercentage": "% de 1s usado por CPU",
+ "total": "Total",
+ "used": "Usado"
+ }
},
- "toasts": {
- "sent": "",
- "emailNotFound": "",
- "redirect": "",
- "success": "",
- "error": ""
+ "table": {
+ "headers": {
+ "timestamp": "Marca de tiempo",
+ "level": "Nivel",
+ "service": "Servicio",
+ "method": "Método",
+ "monitorId": "ID de monitor",
+ "runCount": "Conteo de ejecuciones",
+ "failCount": "Conteo de fallas",
+ "lastRunAt": "Última ejecución",
+ "lockedAt": "Bloqueado a las",
+ "lastFinishedAt": "Última finalización",
+ "lastRunTook": "Última ejecución tomó",
+ "lastFailedAt": "Última falla",
+ "failReason": "Razón de falla"
+ }
}
- }
- },
- "errorPages": {
- "serverUnreachable": {
- "toasts": {
- "reconnected": "",
- "stillUnreachable": ""
+ },
+ "maintenanceWindow": {
+ "fallback": {
+ "actionButton": "¡Cree una ventana de mantenimiento!",
+ "checks": "Mark your maintenance periods,Eliminate any misunderstandings,Stop sending alerts in maintenance windows",
+ "title": "Una ventana de mantenimiento se usa para:"
+ },
+ "table": {
+ "headers": {
+ "nextWindow": "",
+ "repeat": ""
+ }
},
- "alertBox": "",
- "description": "",
- "retryButton": {
- "default": "",
- "processing": ""
+ "form": {
+ "general": {
+ "title": "Configuración general",
+ "description": "Establezca un nombre y opción de repetición para su ventana de mantenimiento.",
+ "option": {
+ "name": {
+ "label": "Nombre",
+ "placeholder": "p. ej. Mantenimiento semanal"
+ },
+ "repeat": {
+ "label": "Repetir"
+ }
+ }
+ },
+ "startDate": {
+ "title": "Fecha de inicio",
+ "description": "Seleccione la fecha de inicio de su ventana de mantenimiento.",
+ "option": {
+ "startDate": {
+ "label": "Fecha de inicio"
+ }
+ }
+ },
+ "startTime": {
+ "title": "Hora de inicio",
+ "description": "Establezca la hora de inicio y duración de su ventana de mantenimiento. Todos los valores están en UTC",
+ "option": {
+ "duration": {
+ "label": "Duración"
+ },
+ "startTime": {
+ "label": "Hora de inicio"
+ }
+ },
+ "monitors": {
+ "title": "Monitores",
+ "description": "Monitores a los que se debe aplicar la ventana de mantenimiento",
+ "option": {
+ "addMonitors": {
+ "label": "Agregar monitores"
+ }
+ }
+ }
+ }
}
- }
- },
- "createNotifications": {
- "title": "",
- "nameSettings": {
- "title": "",
- "description": "",
- "nameLabel": "",
- "namePlaceholder": ""
- },
- "typeSettings": {
- "title": "",
- "description": "",
- "typeLabel": ""
- },
- "emailSettings": {
- "title": "",
- "description": "",
- "emailLabel": "",
- "emailPlaceholder": ""
- },
- "slackSettings": {
- "title": "",
- "description": "",
- "webhookLabel": "",
- "webhookPlaceholder": ""
- },
- "pagerdutySettings": {
- "title": "",
- "description": "",
- "integrationKeyLabel": "",
- "integrationKeyPlaceholder": ""
},
- "discordSettings": {
- "title": "",
- "description": "",
- "webhookLabel": "",
- "webhookPlaceholder": ""
- },
- "webhookSettings": {
- "title": "",
- "description": "",
- "webhookLabel": "",
- "webhookPlaceholder": ""
- },
- "testNotification": "",
- "dialogDeleteTitle": "",
- "dialogDeleteConfirm": ""
- },
- "notificationConfig": {
- "title": "",
- "description": ""
- },
- "monitorStatus": {
- "checkingEvery": "",
- "withCaptureAgent": "",
- "up": "",
- "down": "",
- "paused": ""
- },
- "advancedMatching": "",
- "sendTestNotifications": "",
- "selectAll": "",
- "showAdminLoginLink": "",
- "logsPage": {
- "title": "",
- "description": "",
- "tabs": {
- "queue": "",
- "logs": "",
- "diagnostics": ""
- },
- "toast": {
- "fetchLogsSuccess": ""
- },
- "logLevelSelect": {
- "title": "",
- "values": {
- "all": "",
- "info": "",
- "warn": "",
- "error": "",
- "debug": ""
+ "notifications": {
+ "fallback": {
+ "actionButton": "Crear un canal",
+ "checks": "Alert teams about downtime or performance issues,Let engineers know when incidents happen,Keep administrators informed of system changes",
+ "title": "Los canales de notificación se usan para:"
+ },
+ "form": {
+ "accessToken": {
+ "optionAccessToken": "Token de acceso",
+ "placeholder": "syt_YWxleF9ob2xsaWRheQ_VmtScmV0U2VjcmV0S2V5_abc123"
+ },
+ "address": {
+ "description": "La dirección donde se enviarán las notificaciones.",
+ "optionAddress": "Dirección",
+ "placeholderEmail": "example@example.com",
+ "placeholderWebhook": "https://your-server.com/webhook",
+ "title": "Dirección"
+ },
+ "homeServer": {
+ "optionHomeServer": "Servidor principal",
+ "placeholder": "example.com"
+ },
+ "matrix": {
+ "description": "Configure la conexión de su servidor Matrix para notificaciones.",
+ "title": "Configuración de Matrix"
+ },
+ "notificationName": {
+ "description": "Un nombre descriptivo para el canal de notificación",
+ "optionName": "Nombre del canal",
+ "placeholder": "p. ej. Alertas de producción",
+ "title": "Nombre del canal"
+ },
+ "pagerDuty": {
+ "description": "Su clave de integración de PagerDuty para recibir alertas.",
+ "optionIntegrationKey": "Clave de integración",
+ "placeholder": "a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6",
+ "title": "Clave de integración"
+ },
+ "roomId": {
+ "optionRoomId": "ID de sala",
+ "placeholder": "!abcdefg:matrix.org"
+ },
+ "type": {
+ "description": "Seleccione el tipo de canal de notificación a crear.",
+ "optionType": "Tipo",
+ "title": "Tipo de canal"
+ },
+ "telegram": {
+ "title": "Configuración de Telegram",
+ "description": "Para habilitar las notificaciones de Telegram, cree un bot de Telegram utilizando BotFather, un bot oficial para crear y administrar bots de Telegram. Entonces, obtenga una clave API y un ID de chat y escríbalos aquí.",
+ "optionBotToken": "Token del bot",
+ "placeholderBotToken": "123456789:ABCdefGhIJKlmNoPQRsTUVwxyZ",
+ "optionChatId": "ID de chat",
+ "placeholderChatId": "-1001234567890"
+ }
+ },
+ "table": {
+ "headers": {
+ "destination": "Destino"
+ }
}
- }
- },
- "queuePage": {
- "title": "",
- "refreshButton": "",
- "flushButton": "",
- "jobTable": {
- "title": "",
- "idHeader": "",
- "urlHeader": "",
- "typeHeader": "",
- "activeHeader": "",
- "lockedAtHeader": "",
- "runCountHeader": "",
- "failCountHeader": "",
- "lastRunHeader": "",
- "lastFinishedAtHeader": "",
- "lastRunTookHeader": "",
- "intervalHeader": ""
- },
- "metricsTable": {
- "title": "",
- "metricHeader": "",
- "valueHeader": ""
- },
- "failedJobTable": {
- "title": "",
- "monitorIdHeader": "",
- "monitorUrlHeader": "",
- "failCountHeader": "",
- "failedAtHeader": "",
- "failReasonHeader": ""
- }
- },
- "export": {
- "title": "",
- "success": "",
- "failed": ""
- },
- "monitorActions": {
- "title": "",
- "import": "",
- "export": "",
- "deleteSuccess": "",
- "deleteFailed": "",
- "details": ""
- },
- "settingsPage": {
- "aboutSettings": {
- "labelDevelopedBy": "",
- "labelVersion": "",
- "title": ""
},
- "demoMonitorsSettings": {
- "buttonAddMonitors": "",
- "description": "",
- "title": ""
- },
- "emailSettings": {
- "buttonSendTestEmail": "",
- "description": "",
- "descriptionTransport": "",
- "labelAddress": "",
- "labelConnectionHost": "",
- "labelHost": "",
- "labelIgnoreTLS": "",
- "labelPassword": "",
- "labelPasswordSet": "",
- "labelPool": "",
- "labelPort": "",
- "labelRejectUnauthorized": "",
- "labelRequireTLS": "",
- "labelSecure": "",
- "labelTLSServername": "",
- "labelUser": "",
- "linkTransport": "",
- "placeholderUser": "",
- "title": "",
- "toastEmailRequiredFieldsError": ""
- },
- "pageSpeedSettings": {
- "description": "",
- "labelApiKeySet": "",
- "labelApiKey": "",
- "title": ""
- },
- "saveButtonLabel": "",
- "statsSettings": {
- "clearAllStatsButton": "",
- "clearAllStatsDescription": "",
- "clearAllStatsDialogConfirm": "",
- "clearAllStatsDialogDescription": "",
- "clearAllStatsDialogTitle": "",
- "description": "",
- "labelTTL": "",
- "labelTTLOptional": "",
- "title": ""
- },
- "systemResetSettings": {
- "buttonRemoveAllMonitors": "",
- "description": "",
- "dialogConfirm": "",
- "dialogDescription": "",
- "dialogTitle": "",
- "title": ""
- },
- "timezoneSettings": {
- "description": "",
- "label": "",
- "title": ""
- },
- "title": "",
- "uiSettings": {
- "description": "",
- "labelLanguage": "",
- "labelTheme": "",
- "title": ""
- },
- "urlSettings": {
- "description": "",
- "label": "",
- "selectDisabled": "",
- "selectEnabled": "",
- "title": ""
- },
- "globalThresholds": {
- "title": "",
- "description": ""
- }
- },
- "statusPageCreate": {
- "buttonSave": ""
- },
- "incidentsOptionsHeaderFilterResolved": "",
- "settingsSave": "",
- "statusPageCreateAppearanceTitle": "",
- "confirmPassword": "",
- "monitorHooks": {
- "failureAddDemoMonitors": "",
- "successAddDemoMonitors": ""
- },
- "settingsAppearance": "",
- "settingsDisplayTimezone": "",
- "settingsGeneralSettings": "",
- "incidentsOptionsHeaderTotalIncidents": "",
- "statusPage": {
- "deleteSuccess": "",
- "deleteFailed": "",
- "createSuccess": "",
- "updateSuccess": "",
- "generalSettings": "",
- "contents": "",
- "fallback": {
- "checks": [""],
- "title": "",
- "actionButton": ""
- }
- },
- "testNotificationsDisabled": "",
- "incidentsTableResolvedAt": "",
- "incidentsTableActionResolve": "",
- "checkHooks": {
- "failureResolveOne": "",
- "failureResolveAll": "",
- "failureResolveMonitor": ""
- },
- "checkFormError": "",
- "diagnosticsPage": {
- "diagnosticDescription": "",
- "statsDescription": "",
- "gauges": {
- "heapAllocationTitle": "",
- "heapAllocationSubtitle": "",
- "heapUsageTitle": "",
- "heapUsageSubtitle": "",
- "heapUtilizationTitle": "",
- "heapUtilizationSubtitle": "",
- "instantCpuUsageTitle": "",
- "instantCpuUsageSubtitle": ""
- },
- "stats": {
- "eventLoopDelayTitle": "",
- "uptimeTitle": "",
- "usedHeapSizeTitle": "",
- "totalHeapSizeTitle": "",
- "osMemoryLimitTitle": ""
- }
- },
- "pageSpeedLighthouseAPI": "",
- "time": {
- "threeMinutes": "",
- "fiveMinutes": "",
- "tenMinutes": "",
- "twentyMinutes": "",
- "oneHour": "",
- "oneDay": "",
- "oneWeek": "",
- "fourMinutes": "",
- "oneMinute": "",
- "twoMinutes": "",
- "fifteenSeconds": "",
- "thirtySeconds": ""
- },
- "general": {
- "noOptionsFound": ""
- },
- "infrastructureMonitor": {
- "fallback": {
- "checks": [""],
- "title": "",
- "actionButton": ""
- }
- },
- "maintenanceWindow": {
- "fallback": {
- "checks": [""],
- "title": "",
- "actionButton": ""
- }
- },
- "pageSpeed": {
- "fallback": {
- "checks": [""],
- "title": "",
- "actionButton": ""
- }
- },
- "uptimeMonitor": {
- "fallback": {
- "checks": [""],
- "title": "",
- "actionButton": ""
- }
- },
- "editUserPage": {
- "form": {
- "email": "",
- "firstName": "",
- "lastName": "",
- "role": "",
- "save": ""
- },
- "table": {
- "actionHeader": "",
- "roleHeader": ""
- },
- "title": "",
- "toast": {
- "successUserUpdate": "",
- "validationErrors": ""
- }
- },
- "incidentsPageActionResolveMonitor": "",
- "incidentsPageActionResolveAll": "",
- "matchMethodOptions": {
- "equal": "",
- "equalPlaceholder": "",
- "include": "",
- "includePlaceholder": "",
- "regex": "",
- "regexPlaceholder": "",
- "text": ""
- },
- "monitorType": {
- "docker": {
- "label": "",
- "namePlaceholder": "",
- "placeholder": ""
- },
- "http": {
- "label": "",
- "namePlaceholder": "",
- "placeholder": ""
+ "pageSpeed": {
+ "charts": {
+ "common": {
+ "cls": "Cambio acumulativo de diseño (CLS)",
+ "fcp": "Primera pintura con contenido (FCP)",
+ "lcp": "Mayor pintura con contenido (LCP)",
+ "si": "Índice de velocidad (SI)",
+ "tbt": "Tiempo total de bloqueo (TBT)"
+ },
+ "legend": {
+ "title": "Reporte de PageSpeed",
+ "weight": "Peso"
+ },
+ "pie": {
+ "title": "Reporte de rendimiento"
+ }
+ },
+ "table": {
+ "headers": {
+ "pageSpeedScore": "Puntuación de PageSpeed"
+ }
+ },
+ "fallback": {
+ "actionButton": "¡Cree un monitor!",
+ "checks": "Report on the user experience of a page,Help analyze webpage speed,Give suggestions on how the page can be improved",
+ "title": "Un monitor de PageSpeed se usa para:"
+ }
},
- "ping": {
- "label": "",
- "namePlaceholder": "",
- "placeholder": ""
+ "settings": {
+ "form": {
+ "timezone": {
+ "title": "Zona horaria de visualización",
+ "description": "Seleccione la zona horaria utilizada para mostrar fechas y horas en toda la aplicación.",
+ "option": {
+ "timezone": {
+ "label": "Zona horaria de visualización"
+ }
+ }
+ },
+ "ui": {
+ "title": "Apariencia",
+ "description": "Cambie entre modo claro y oscuro, cambie el idioma o personalice el tipo de visualización de gráficos.",
+ "option": {
+ "theme": {
+ "label": "Modo de tema",
+ "light": "Claro",
+ "dark": "Oscuro"
+ },
+ "language": {
+ "label": "Idioma"
+ },
+ "chartType": {
+ "label": "Tipo de gráfico",
+ "histogram": "Histograma",
+ "heatmap": "Mapa de calor"
+ }
+ }
+ },
+ "pagespeed": {
+ "title": "Clave de API de Google PageSpeed",
+ "description": "Ingrese su clave de API de Google PageSpeed para habilitar el monitoreo de Google PageSpeed. Haga clic en Restablecer para actualizar la clave.",
+ "option": {
+ "apiKey": {
+ "label": "Clave de API de PageSpeed",
+ "labelSet": "La clave de API está configurada. Haga clic en Restablecer para cambiarla.",
+ "placeholder": "Ingrese su clave de API de Google PageSpeed"
+ }
+ }
+ },
+ "url": {
+ "title": "IP/URL del monitor en la página de estado",
+ "description": "Muestre la dirección IP o URL del monitor en la página de estado pública. Si está deshabilitado, solo se mostrará el nombre del monitor para proteger información sensible.",
+ "option": {
+ "showURL": {
+ "label": "Mostrar IP/URL en la página de estado",
+ "enabled": "Habilitado",
+ "disabled": "Deshabilitado"
+ }
+ }
+ },
+ "stats": {
+ "title": "Historial del monitor",
+ "description": "Limpie todo el historial de monitoreo y estadísticas de su equipo. Esta acción es irreversible.",
+ "option": {
+ "clear": {
+ "label": "Limpiar todas las estadísticas. Esto es irreversible."
+ }
+ },
+ "dialog": {
+ "title": "¿Limpiar todo el historial de monitoreo?",
+ "description": "Esto no se puede deshacer"
+ }
+ },
+ "retention": {
+ "title": "Retención de verificaciones",
+ "description": "Establezca cuánto tiempo se retienen los datos de verificación antes de ser limpiados automáticamente.",
+ "option": {
+ "days": {
+ "label": "Período de retención (días)",
+ "unlimited": "Ilimitado"
+ }
+ }
+ },
+ "thresholds": {
+ "title": "Umbrales globales",
+ "description": "Establezca umbrales globales de CPU, memoria, disco y temperatura para monitoreo de infraestructura. Se aplican a todos los monitores de hardware a menos que se anulen.",
+ "option": {
+ "cpu": {
+ "label": "Umbral de CPU (%)",
+ "placeholder": "1 - 100"
+ },
+ "memory": {
+ "label": "Umbral de memoria (%)",
+ "placeholder": "1 - 100"
+ },
+ "disk": {
+ "label": "Umbral de disco (%)",
+ "placeholder": "1 - 100"
+ },
+ "temperature": {
+ "label": "Umbral de temperatura (°C)",
+ "placeholder": "1 - 150"
+ }
+ }
+ },
+ "email": {
+ "title": "Configuración de correo electrónico",
+ "description": "Configure los ajustes de correo electrónico de su sistema. Se usa para enviar notificaciones y alertas.",
+ "descriptionTransport": "",
+ "descriptionTransportLink": "Ver especificaciones aquí",
+ "option": {
+ "host": {
+ "label": "Host de correo - Nombre de host o dirección IP para conectar",
+ "placeholder": "smtp.gmail.com"
+ },
+ "port": {
+ "label": "Puerto de correo - Puerto de conexión",
+ "placeholder": "587"
+ },
+ "address": {
+ "label": "Dirección de correo - Usada para autenticación",
+ "placeholder": "you@example.com"
+ },
+ "user": {
+ "label": "Usuario de correo - Nombre de usuario para autenticación, reemplaza la dirección de correo si se especifica",
+ "placeholder": "Dejar vacío si no es requerido"
+ },
+ "password": {
+ "label": "Contraseña de correo - Contraseña para autenticación",
+ "labelSet": "La contraseña está configurada. Haga clic en Restablecer para cambiarla.",
+ "placeholder": "Ingrese su contraseña"
+ },
+ "tlsServername": {
+ "label": "Nombre de servidor TLS - Nombre de host opcional para validación TLS cuando el host es una IP",
+ "placeholder": "example.com"
+ },
+ "connectionHost": {
+ "label": "Host de conexión de correo - Nombre de host a usar en el saludo HELO/EHLO",
+ "placeholder": "localhost"
+ },
+ "secure": {
+ "label": "Usar SSL (recomendado): Cifrar la conexión usando SSL/TLS"
+ },
+ "pool": {
+ "label": "Habilitar agrupación de conexiones: Reutilizar conexiones existentes para mejorar el rendimiento"
+ },
+ "ignoreTLS": {
+ "label": "Deshabilitar STARTTLS: No usar TLS aunque el servidor lo soporte"
+ },
+ "requireTLS": {
+ "label": "Forzar STARTTLS: Requerir actualización TLS, fallar si no es soportado"
+ },
+ "rejectUnauthorized": {
+ "label": "Rechazar certificados inválidos: Rechazar conexiones con certificados autofirmados o no confiables"
+ }
+ }
+ },
+ "demoMonitors": {
+ "title": "Monitores de demostración",
+ "description": "Agregue monitores de ejemplo con fines demostrativos."
+ },
+ "removeMonitors": {
+ "title": "Reinicio del sistema",
+ "description": "Elimine todos los monitores de su sistema.",
+ "dialog": {
+ "title": "¿Eliminar todos los monitores?",
+ "description": "Esto no se puede deshacer."
+ }
+ },
+ "exportMonitors": {
+ "title": "Exportar monitores"
+ },
+ "importExportMonitors": {
+ "title": "Importar / Exportar monitores",
+ "description": "Importe o exporte los datos de sus monitores como archivo JSON para respaldo o transferencia."
+ },
+ "about": {
+ "title": "Acerca de",
+ "developedBy": "Desarrollado por Bluewave Labs"
+ },
+ "validation": {
+ "errorMessage": "Corrija los siguientes errores de validación:"
+ }
+ }
},
- "port": {
- "label": "",
- "namePlaceholder": "",
- "placeholder": ""
+ "statusPages": {
+ "deleteSuccess": "Página de estado eliminada exitosamente",
+ "fallback": {
+ "title": "Una página de estado se usa para:",
+ "checks": "Communicate system status to users and stakeholders,Display real-time uptime information publicly,Build trust with transparent service monitoring,Reduce support requests during incidents",
+ "actionButton": "¡Cree una página de estado!"
+ },
+ "monitorsList": {
+ "chartTypeHeatmap": "Mapa de calor",
+ "chartTypeHistogram": "Histograma",
+ "noData": "No hay datos disponibles",
+ "infrastructure": {
+ "title": "Infraestructura",
+ "cpu": "CPU",
+ "memory": "RAM",
+ "memoryText": "Memoria",
+ "disk": "Disco",
+ "usage": "Uso",
+ "used": "Usado",
+ "total": "Total"
+ },
+ "uptime": {
+ "title": "Tiempo de actividad",
+ "responseTime": "Tiempo de respuesta"
+ }
+ },
+ "statusBar": {
+ "allDown": "Todos los sistemas están caídos",
+ "allUp": "Todos los sistemas operativos",
+ "degraded": "Algunos sistemas están experimentando problemas",
+ "unknown": "No se puede determinar el estado del sistema"
+ },
+ "table": {
+ "headers": {
+ "name": "Nombre de la página de estado",
+ "url": "URL pública"
+ },
+ "published": "Publicado",
+ "unpublished": "No publicado"
+ },
+ "title": "Páginas de estado",
+ "details": {
+ "empty": {
+ "title": "Aún no hay nada aquí",
+ "addMonitor": "Agregue un monitor para comenzar"
+ }
+ },
+ "form": {
+ "access": {
+ "title": "Acceso",
+ "description": "Si su página de estado está lista, puede marcarla como publicada.",
+ "option": {
+ "published": {
+ "name": "Publicado y visible al público"
+ }
+ }
+ },
+ "basicInfo": {
+ "title": "Información básica",
+ "description": "Defina el nombre de la empresa y el subdominio al que apunta su página de estado.",
+ "option": {
+ "name": {
+ "label": "Nombre de la empresa",
+ "placeholder": "Acme Inc."
+ },
+ "url": {
+ "label": "Dirección de su página de estado",
+ "placeholder": "mi-pagina-de-estado"
+ }
+ }
+ },
+ "monitors": {
+ "title": "Monitores",
+ "description": "Seleccione los monitores a mostrar en su página de estado.",
+ "noMonitors": "No hay monitores seleccionados",
+ "option": {
+ "monitors": {
+ "label": "Seleccionar monitores",
+ "placeholder": "Buscar y seleccionar monitores..."
+ }
+ }
+ },
+ "timezone": {
+ "title": "Zona horaria",
+ "description": "Seleccione la zona horaria en la que se mostrará su página de estado.",
+ "option": {
+ "timezone": {
+ "label": "Zona horaria",
+ "placeholder": "Seleccionar zona horaria..."
+ }
+ }
+ },
+ "appearance": {
+ "title": "Apariencia",
+ "description": "Defina la apariencia predeterminada de su página de estado pública.",
+ "option": {
+ "logo": {
+ "label": "Logo"
+ },
+ "color": {
+ "label": "Color de marca"
+ }
+ }
+ },
+ "features": {
+ "title": "Funcionalidades",
+ "description": "Configure qué información se muestra en su página de estado.",
+ "option": {
+ "showCharts": {
+ "label": "Mostrar gráficos de tiempo de respuesta"
+ },
+ "showUptimePercentage": {
+ "label": "Mostrar porcentaje de tiempo de actividad"
+ },
+ "showAdminLoginLink": {
+ "label": "Mostrar enlace de inicio de sesión de administrador"
+ },
+ "showInfrastructure": {
+ "label": "Mostrar métricas de infraestructura"
+ }
+ }
+ }
+ }
},
- "game": {
- "label": "",
- "namePlaceholder": "",
- "placeholder": ""
+ "uptime": {
+ "filters": {
+ "search": {
+ "placeholder": "Buscar monitores..."
+ }
+ },
+ "table": {
+ "headers": {
+ "responseTime": "Tiempo de respuesta"
+ }
+ },
+ "fallback": {
+ "actionButton": "¡Cree un monitor!",
+ "checks": "Check if websites or servers are online & responsive,Alert teams about downtime or performance issues,Monitor HTTP endpoints, pings, containers & ports,Track historical uptime and reliability trends",
+ "title": "Un monitor de tiempo de actividad se usa para:"
+ }
}
- },
- "uptimeAdvancedMatching": {
- "jsonPath": ""
- },
- "bytesPerSecond": "",
- "bytesReceived": "",
- "bytesSent": "",
- "chooseGame": "",
- "createMonitorPage": {
- "incidentConfigDescription": "",
- "incidentConfigStatusWindowLabel": "",
- "incidentConfigStatusWindowThresholdLabel": "",
- "incidentConfigTitle": "",
- "incidentConfigDescriptionV2": "",
- "incidentConfigStatusCheckNumber": "",
- "intervalTitle": "",
- "intervalDescription": ""
- },
- "dataRate": "",
- "dataReceived": "",
- "dataSent": "",
- "details": "",
- "drops": "",
- "errors": "",
- "errorsIn": "",
- "errorsOut": "",
- "gameServerMonitoring": "",
- "gameServerMonitoringDescription": "",
- "network": "",
- "networkDrops": "",
- "networkErrors": "",
- "networkInterface": "",
- "noNetworkStatsAvailable": "",
- "packetsPerSecond": "",
- "packetsReceived": "",
- "packetsReceivedRate": "",
- "packetsSent": "",
- "rate": "",
- "selectInterface": ""
+ }
}
diff --git a/client/src/locales/fi.json b/client/src/locales/fi.json
index 4949817c7a..d56cb5bda0 100644
--- a/client/src/locales/fi.json
+++ b/client/src/locales/fi.json
@@ -1,1108 +1,1305 @@
{
- "submit": "Lähetä",
- "title": "Otsikko",
- "distributedStatusHeaderText": "Reaaliaikainen kattavuus oikeilla laitteilla",
- "distributedStatusSubHeaderText": "Miljoonien laitteiden voimin ympäri maailman näet järjestelmän suorituskyvyn maailman alueittain, maittain tai kaupungeittain",
- "settingsDisabled": "Poistettu käytöstä",
- "settingsSuccessSaved": "",
- "settingsFailedToSave": "",
- "settingsStatsCleared": "",
- "settingsFailedToClearStats": "",
- "settingsMonitorsDeleted": "",
- "settingsFailedToDeleteMonitors": "",
- "starPromptTitle": "",
- "starPromptDescription": "",
- "https": "HTTPS",
- "http": "HTTP",
- "monitor": "Seurain",
- "aboutus": "Tietoja meistä",
- "now": "Nyt",
- "delete": "Poista",
- "configure": "Määritä",
- "responseTime": "Vasteaika",
- "ms": "ms",
- "bar": "Palkki",
- "area": "Alue",
- "country": "MAA",
- "city": "KAUPUNKI",
- "response": "Vastaus",
- "monitorStatusUp": "Valvontakohde {name} ({url}) on nyt toiminnassa ja vastaa",
- "monitorStatusDown": "Valvontakohde {name} ({url}) ei ole toiminnassa, eikä vastaa",
- "webhookSendSuccess": "Webhook-ilmoitus lähetettiin onnistuneesti",
- "webhookSendError": "Virhe lähetettäessä webhook-ilmoitusta palveluun {platform}",
- "webhookUnsupportedPlatform": "Ei tuettu palvelu: {platform}",
- "distributedRightCategoryTitle": "Valvonta",
- "distributedStatusServerMonitors": "Palvelin valvonta",
- "distributedStatusServerMonitorsDescription": "Valvo palvelimien tilaa",
- "distributedUptimeCreateSelectURL": "Tässä voit valita isäntäkohteen URL-osoitteen ja valvontatyypin.",
- "distributedUptimeCreateChecks": "Suoritettavat tarkistukset",
- "distributedUptimeCreateChecksDescription": "Voit aina lisätä tai poistaa tarkistuksia sivuston lisäämisen jälkeen.",
- "distributedUptimeCreateIncidentNotification": "Häiriöilmoitukset",
- "distributedUptimeCreateIncidentDescription": "Jos ilmenee häiriö, ilmoita käyttäjille.",
- "distributedUptimeCreateAdvancedSettings": "Lisäasetukset",
- "distributedUptimeDetailsNoMonitorHistory": "Tälle valvontakohteelle ei ole vielä tarkistushistoriaa.",
- "distributedUptimeDetailsStatusHeaderUptime": "",
- "distributedUptimeDetailsStatusHeaderLastUpdate": "Viimeksi päivitetty",
- "notifications": {
- "enableNotifications": "",
- "testNotification": "Testi-ilmoitus",
- "addOrEditNotifications": "Lisää tai muokkaa ilmoituksia",
- "slack": {
- "label": "Slack",
- "description": "",
- "webhookLabel": "Webhookin URL",
- "webhookPlaceholder": "",
- "webhookRequired": ""
- },
- "discord": {
- "label": "Discord",
- "description": "",
- "webhookLabel": "Discord Webhookin URL-osoite",
- "webhookPlaceholder": "https://discord.com/api/webhooks/...",
- "webhookRequired": ""
+ "common": {
+ "auth": {
+ "roles": {
+ "admin": "Ylläpitäjä",
+ "demo": "Demo",
+ "superadmin": "Pääylläpitäjä",
+ "user": "Käyttäjä"
+ }
},
- "telegram": {
- "label": "Telegram",
- "description": "",
- "tokenLabel": "",
- "tokenPlaceholder": "123456:ABC-DEF1234ghIkl-zyx57W2v1u123ew11",
- "chatIdLabel": "",
- "chatIdPlaceholder": "-1001234567890",
- "fieldsRequired": ""
+ "alerts": {
+ "pageSpeedApiKey": {
+ "content": "Varoitus: Et ole vielä lisännyt Google PageSpeed API -avainta. Siirry Asetuksiin lisätäksesi sellainen. Ilman sitä PageSpeed-monitorointi ei toimi."
+ }
},
- "webhook": {
- "label": "Webhookit",
- "description": "",
- "urlLabel": "Webhookin URL",
- "urlPlaceholder": "https://your-server.com/webhook",
- "urlRequired": ""
+ "appName": "",
+ "breadcrumbs": {
+ "details": "Tiedot",
+ "home": "Etusivu"
},
- "testNotificationDevelop": "Testi-ilmoitus 2",
- "integrationButton": "",
- "testSuccess": "Testi ilmoituksen lähetys onnistui!",
- "testFailed": "Testi ilmoituksen lähetys epäonnistui",
- "unsupportedType": "",
- "networkError": "",
- "fallback": {
- "title": "",
- "checks": [""],
- "actionButton": ""
+ "buttons": {
+ "addMember": "Lisää jäsen",
+ "cancel": "Peruuta",
+ "close": "Sulje",
+ "configure": "Määritä",
+ "confirm": "Vahvista",
+ "create": "Luo",
+ "delete": "Poista",
+ "generateToken": "Luo tunniste",
+ "incidents": "Häiriöt",
+ "inviteMember": "Kutsu jäsen",
+ "pause": "Keskeytä",
+ "resume": "Jatka",
+ "save": "Tallenna",
+ "sendInvite": "Lähetä kutsu",
+ "test": "Testaa",
+ "testNotifications": "Testaa ilmoitukset",
+ "toggleTheme": "",
+ "flushQueue": "Tyhjennä jono",
+ "notFound": "Siirry pääsivulle",
+ "resetPassword": "",
+ "reset": "Palauta",
+ "clear": "Tyhjennä",
+ "addDemo": "Lisää demomonitorit",
+ "removeMonitors": "Poista monitorit",
+ "sendTestEmail": "Lähetä testisähköposti",
+ "exportToJSON": "Vie JSON-muotoon",
+ "importFromJSON": "Tuo JSON-muodosta",
+ "clearFilters": "Tyhjennä suodattimet",
+ "removeUser": "Poista käyttäjä"
},
- "createButton": "",
- "createTitle": "",
- "create": {
- "success": "",
- "failed": ""
+ "charts": {
+ "labels": {
+ "averageResponseTime": "Keskimääräinen vasteaika",
+ "downtime": "Käyttökatko",
+ "high": "",
+ "low": "",
+ "uptime": "Käytettävyys"
+ },
+ "histogram": {
+ "avg": "Keskim.: {{value}} ms",
+ "max": "Maks.: {{value}} ms"
+ }
},
- "fetch": {
- "success": "",
- "failed": ""
+ "dialogs": {
+ "delete": {
+ "description": "Tätä toimintoa ei voi kumota.",
+ "title": "Haluatko varmasti poistaa tämän?"
+ }
},
- "delete": {
- "success": "",
- "failed": ""
+ "labels": {
+ "active": "Aktiivinen",
+ "paused": "keskeytetty",
+ "na": "Ei saatavilla",
+ "resolved": "Ratkaistu",
+ "responseTime": "Vasteaika"
},
- "edit": {
- "success": "",
- "failed": ""
+ "form": {
+ "role": {
+ "option": {
+ "role": {
+ "label": "Roolit"
+ }
+ }
+ },
+ "name": {
+ "option": {
+ "firstName": {
+ "label": "",
+ "placeholder": ""
+ },
+ "lastName": {
+ "label": "",
+ "placeholder": ""
+ }
+ }
+ },
+ "email": {
+ "option": {
+ "email": {
+ "label": "Sähköposti",
+ "placeholder": "you@example.com"
+ }
+ }
+ }
},
- "test": {
- "success": "",
- "failed": ""
+ "table": {
+ "empty": "Täällä ei ole mitään",
+ "headers": {
+ "actions": "",
+ "dateTime": "Päivämäärä ja aika",
+ "message": "Viesti",
+ "monitor": "Monitori",
+ "monitorId": "Monitorin tunnus",
+ "name": "Nimi",
+ "status": "Tila",
+ "type": "",
+ "url": "Osoite",
+ "interval": "Aikaväli",
+ "active": "Aktiivinen",
+ "responseTime": "Vasteaika"
+ }
}
},
- "testLocale": "",
- "add": "Lisää",
- "monitors": "Seuraimet",
- "distributedUptimeStatusCreateStatusPage": "",
- "distributedUptimeStatusCreateStatusPageAccess": "",
- "distributedUptimeStatusCreateStatusPageReady": "",
- "distributedUptimeStatusBasicInfoHeader": "",
- "distributedUptimeStatusBasicInfoDescription": "",
- "distributedUptimeStatusLogoHeader": "Logo",
- "distributedUptimeStatusLogoDescription": "",
- "distributedUptimeStatusLogoUploadButton": "",
- "distributedUptimeStatusStandardMonitorsHeader": "",
- "distributedUptimeStatusStandardMonitorsDescription": "",
- "distributedUptimeStatusCreateYour": "",
- "distributedUptimeStatusEditYour": "",
- "distributedUptimeStatusPublishedLabel": "",
- "distributedUptimeStatusCompanyNameLabel": "Yrityksen nimi",
- "distributedUptimeStatusPageAddressLabel": "",
- "distributedUptimeStatus30Days": "30 päivää",
- "distributedUptimeStatus60Days": "60 päivää",
- "distributedUptimeStatus90Days": "90 päivää",
- "distributedUptimeStatusPageNotSetUp": "",
- "distributedUptimeStatusContactAdmin": "Ota yhteys järjestelmävalvojaasi",
- "distributedUptimeStatusPageNotPublic": "",
- "distributedUptimeStatusPageDeleteDialog": "",
- "distributedUptimeStatusPageDeleteConfirm": "",
- "distributedUptimeStatusPageDeleteDescription": "",
- "distributedUptimeStatusDevices": "",
- "distributedUptimeStatusUpt": "",
- "distributedUptimeStatusUptBurned": "",
- "distributedUptimeStatusUptLogo": "UPT logo",
- "incidentsTableNoIncidents": "",
- "incidentsTablePaginationLabel": "",
- "incidentsTableMonitorName": "",
- "incidentsTableStatus": "Tila",
- "incidentsTableDateTime": "Päivämäärä ja aika",
- "incidentsTableStatusCode": "",
- "incidentsTableMessage": "Viesti",
- "incidentsOptionsHeader": "",
- "incidentsOptionsHeaderFilterBy": "",
- "incidentsOptionsHeaderFilterAll": "Kaikki",
- "incidentsOptionsHeaderFilterDown": "Alhaalla",
- "incidentsOptionsHeaderFilterCannotResolve": "",
- "incidentsOptionsHeaderShow": "Näytä:",
- "incidentsOptionsHeaderLastHour": "Viime tunti",
- "incidentsOptionsHeaderLastDay": "Viime päivä",
- "incidentsOptionsHeaderLastWeek": "Viime viikko",
- "incidentsOptionsPlaceholderAllServers": "Kaikki palvelimet",
- "infrastructureCreateYour": "",
- "infrastructureCreateGeneralSettingsDescription": "",
- "infrastructureServerRequirement": "",
- "infrastructureCustomizeAlerts": "",
- "infrastructureAlertNotificationDescription": "",
- "infrastructureCreateMonitor": "",
- "infrastructureProtocol": "Protokolla",
- "infrastructureServerUrlLabel": "Palvelimen URL-osoite",
- "infrastructureDisplayNameLabel": "",
- "infrastructureAuthorizationSecretLabel": "",
- "gb": "",
- "mb": "",
- "mem": "",
- "memoryUsage": "Muistinkäyttö",
- "cpu": "",
- "cpuUsage": "",
- "cpuTemperature": "",
- "diskUsage": "",
- "used": "",
- "total": "",
- "cores": "",
- "frequency": "",
- "status": "Tila",
- "cpuPhysical": "",
- "cpuLogical": "",
- "cpuFrequency": "",
- "avgCpuTemperature": "",
- "memory": "Muisti",
- "disk": "",
- "uptime": "",
- "os": "",
- "host": "",
- "actions": "",
- "integrations": "",
- "integrationsPrism": "",
- "integrationsSlack": "Slack",
- "integrationsSlackInfo": "",
- "integrationsDiscord": "",
- "integrationsDiscordInfo": "",
- "integrationsZapier": "Zapier",
- "integrationsZapierInfo": "",
- "commonSave": "Tallenna",
- "createYour": "",
- "createMonitor": "",
- "pause": "",
- "resume": "",
- "editing": "",
- "url": "",
- "access": "",
- "timezone": "Aikavyöhyke",
- "features": "",
- "administrator": "",
- "loginHere": "",
- "displayName": "",
- "urlMonitor": "",
- "portToMonitor": "",
- "websiteMonitoring": "",
- "websiteMonitoringDescription": "",
- "pingMonitoring": "",
- "pingMonitoringDescription": "",
- "dockerContainerMonitoring": "",
- "dockerContainerMonitoringDescription": "",
- "portMonitoring": "",
- "portMonitoringDescription": "",
- "createMaintenanceWindow": "",
- "createMaintenance": "",
- "editMaintenance": "",
- "maintenanceWindowName": "",
- "friendlyNameInput": "",
- "friendlyNamePlaceholder": "",
- "maintenanceRepeat": "",
- "maintenance": "",
- "duration": "",
- "addMonitors": "",
- "window": "",
- "cancel": "Peruuttaa",
- "message": "Viesti",
- "low": "",
- "high": "",
- "statusCode": "Tilakoodi",
- "date&Time": "Päivämäärä ja aika",
- "type": "",
- "statusPageName": "",
- "publicURL": "Julkinen URL-osoite",
- "repeat": "",
- "edit": "Muokkaa",
- "createA": "",
- "remove": "",
- "maintenanceWindowDescription": "",
- "startTime": "",
- "timeZoneInfo": "",
- "monitorsToApply": "",
- "nextWindow": "",
- "notFoundButton": "",
- "pageSpeedConfigureSettingsDescription": "",
- "monitorDisplayName": "",
- "whenNewIncident": "",
- "notifySMS": "Ilmoita tekstiviestillä (tulossa pian)",
- "notifyEmails": "",
- "seperateEmails": "",
- "checkFrequency": "",
- "matchMethod": "",
- "expectedValue": "",
- "deleteDialogTitle": "",
- "deleteDialogDescription": "",
- "pageSpeedMonitor": "",
- "shown": "",
- "ago": "sitten",
- "companyName": "Yrityksen nimi",
- "pageSpeedDetailsPerformanceReport": "",
- "pageSpeedDetailsPerformanceReportCalculator": "",
- "checkingEvery": "",
- "statusPageCreateSettings": "",
- "basicInformation": "",
- "statusPageCreateBasicInfoDescription": "",
- "statusPageCreateSelectTimeZoneDescription": "",
- "statusPageCreateAppearanceDescription": "",
- "statusPageCreateSettingsCheckboxLabel": "",
- "statusPageCreateBasicInfoStatusPageAddress": "",
- "statusPageCreateTabsContent": "",
- "statusPageCreateTabsContentDescription": "",
- "statusPageCreateTabsContentFeaturesDescription": "",
- "showCharts": "Näytä kaaviot",
- "showUptimePercentage": "",
- "removeLogo": "Poista logo",
- "statusPageStatus": "",
- "statusPageStatusContactAdmin": "Ota yhteyttä järjestelmänvalvojaan",
- "statusPageStatusNotPublic": "",
- "statusPageStatusNoPage": "",
- "statusPageStatusServiceStatus": "",
- "deleteStatusPage": "",
- "deleteStatusPageConfirm": "",
- "deleteStatusPageDescription": "",
- "uptimeCreate": "",
- "uptimeCreateJsonPath": "",
- "uptimeCreateJsonPathQuery": "",
- "maintenanceTableActionMenuDialogTitle": "",
- "infrastructureEditYour": "Muokkaa omaa",
- "infrastructureEditMonitor": "",
- "infrastructureMonitorCreated": "",
- "infrastructureMonitorUpdated": "",
- "errorInvalidTypeId": "",
- "errorInvalidFieldId": "",
- "inviteNoTokenFound": "",
- "pageSpeedWarning": "",
- "pageSpeedLearnMoreLink": "",
- "pageSpeedAddApiKey": "",
- "update": "Päivitä",
- "invalidFileFormat": "",
- "invalidFileSize": "Tiedoston koko on liian suuri!",
- "ClickUpload": "",
- "DragandDrop": "raahaa ja pudota",
- "MaxSize": "Enimmäiskoko",
- "SupportedFormats": "Tuetut muodot",
- "FirstName": "Etunimi",
- "LastName": "Sukunimi",
- "EmailDescriptionText": "Tämä on nykyinen sähköpostiosoitteesi — sitä ei voi vaihtaa.",
- "YourPhoto": "Profiilikuva",
- "PhotoDescriptionText": "",
- "save": "Tallenna",
- "DeleteDescriptionText": "",
- "DeleteAccountWarning": "",
- "DeleteWarningTitle": "Haluatko todella poistaa tämän tilin?",
- "bulkImport": {
- "title": "",
- "selectFileTips": "",
- "selectFileDescription": "",
- "selectFile": "Valitse tiedosto",
- "parsingFailed": "",
- "uploadSuccess": "",
- "validationFailed": "",
- "noFileSelected": "Ei valittua tiedostoa",
- "fallbackPage": "",
- "invalidFileType": "",
- "uploadFailed": ""
- },
- "DeleteAccountTitle": "Poista tili",
- "DeleteAccountButton": "Poista tili",
- "publicLink": "Julkinen linkki",
- "maskedPageSpeedKeyPlaceholder": "*************************************",
- "reset": "Palauta",
- "ignoreTLSError": "",
- "tlsErrorIgnored": "",
- "ignoreTLSErrorDescription": "",
- "createNew": "Luo uusi",
- "greeting": {
- "prepend": "Hei",
- "append": "",
- "overview": ""
- },
- "roles": {
- "superAdmin": "Pääylläpitäjä",
- "admin": "Ylläpitäjä",
- "teamMember": "Tiimin jäsen",
- "demoUser": "Demokäyttäjä"
- },
- "teamPanel": {
- "teamMembers": "Tiimin jäsenet",
- "filter": {
- "all": "Kaikki",
- "member": "Jäsen"
+ "components": {
+ "imageUpload": {
+ "clickToUpload": "Napsauta ladataksesi",
+ "dragAndDrop": "raahaa ja pudota",
+ "supportedFormats": "Tuetut muodot",
+ "maxSize": "Enimmäiskoko",
+ "orDragAndDrop": "tai vedä ja pudota",
+ "errors": {
+ "invalidFileSize": "Tiedoston koko on liian suuri!",
+ "invalidFileFormat": ""
+ }
},
- "inviteTeamMember": "",
- "inviteNewTeamMember": "",
- "inviteDescription": "",
- "email": "Sähköposti",
- "selectRole": "Valitse rooli",
- "inviteLink": "Kutsulinkki",
- "cancel": "Peruuttaa",
- "noMembers": "",
- "getToken": "Hae tunniste",
- "emailToken": "Sähköpostitunnus",
- "table": {
- "name": "Nimi",
- "email": "Sähköposti",
- "role": "Rooli",
- "created": "Luotu"
+ "headerStatusPageControls": {
+ "publicLink": "Julkinen linkki"
},
- "addTeamMember": {
- "addMemberMenu": "",
- "title": "",
- "description": "",
- "addButton": ""
+ "headerTimeRange": {
+ "labels": {
+ "day": "Päivä",
+ "month": "Kuukausi",
+ "recent": "Viimeisimmät",
+ "week": "Viikko"
+ },
+ "description": {
+ "recent": "Näytetään tilastot viimeisiltä 2 tunnilta.",
+ "day": "Näytetään tilastot viimeisiltä 24 tunnilta.",
+ "week": "Näytetään tilastot viimeisiltä 7 päivältä.",
+ "month": "Näytetään tilastot viimeisiltä 30 päivältä."
+ }
},
- "register": "",
- "registerToast": {
- "success": "",
- "dbUserExists": "",
- "unknownError": ""
+ "offlineBanner": {
+ "serverUnreachable": "Palvelimeen ei saada yhteyttä",
+ "retry": "Yritä uudelleen",
+ "retrying": "Yritetään uudelleen...",
+ "reconnected": ""
},
- "registerTeamMember": {
- "title": "",
- "auth": {
- "common": {
- "inputs": {
- "firstName": {
- "errors": {
- "empty": "",
- "pattern": ""
- }
- },
- "lastName": {
- "errors": {
- "empty": "",
- "pattern": ""
- }
+ "sidebar": {
+ "menu": {
+ "uptime": "",
+ "pagespeed": "",
+ "infrastructure": "Infrastruktuuri",
+ "notifications": "",
+ "checks": "Tarkistukset",
+ "incidents": "",
+ "statusPages": "Tilasivut",
+ "maintenance": "Huolto",
+ "logs": "",
+ "settings": "Asetukset"
+ },
+ "bottomMenu": {
+ "support": "Tuki",
+ "discussions": "Keskustelut",
+ "docs": "Dokumentit",
+ "changelog": "Muutosloki"
+ },
+ "accountMenu": {
+ "profile": "Profiili",
+ "password": "Salasana",
+ "team": "Tiimi"
+ },
+ "starPrompt": {
+ "title": "Lisää Checkmate suosikkeihin",
+ "description": "Katso uusimmat julkaisut ja auta kasvattamaan yhteisöä GitHubissa"
+ },
+ "authFooter": {
+ "navControls": "Ohjaimet",
+ "logOut": "Kirjaudu ulos",
+ "roles": {
+ "superAdmin": "Pääylläpitäjä",
+ "admin": "Ylläpitäjä",
+ "user": "Käyttäjä",
+ "demoUser": "Demokäyttäjä"
+ }
+ }
+ },
+ "starPrompt": {
+ "title": "Lisää Checkmate suosikkeihin",
+ "description": "Katso uusimmat julkaisut ja auta kasvattamaan yhteisöä GitHubissa"
+ }
+ },
+ "pages": {
+ "notFound": {
+ "title": "Voi ei! Sushisi putosi!",
+ "subtitle": "Joko URL-osoitetta ei ole olemassa tai sinulla ei ole pääsyä siihen."
+ },
+ "account": {
+ "tabs": {
+ "profile": "Profiili",
+ "password": "Salasana",
+ "team": "Tiimi"
+ },
+ "form": {
+ "name": {
+ "title": "Nimi",
+ "description": "Päivitä henkilökohtaiset tietosi"
+ },
+ "photo": {
+ "title": "Profiilikuva",
+ "description": "Lataa profiilikuva"
+ },
+ "currentPassword": {
+ "title": "Nykyinen salasana",
+ "description": "Syötä nykyinen salasanasi henkilöllisyytesi vahvistamiseksi",
+ "option": {
+ "label": "Nykyinen salasana",
+ "placeholder": "Syötä nykyinen salasana"
+ }
+ },
+ "newPassword": {
+ "title": "Uusi salasana",
+ "description": "Valitse vahva salasana, jossa on vähintään 8 merkkiä",
+ "option": {
+ "newPassword": {
+ "label": "Uusi salasana",
+ "placeholder": "Syötä uusi salasana"
},
+ "confirm": {
+ "label": "Vahvista salasana",
+ "placeholder": "Vahvista uusi salasana"
+ }
+ }
+ },
+ "deleteAccount": {
+ "title": "Poista tili",
+ "description": "Tämä toiminto on pysyvä eikä sitä voi kumota"
+ }
+ },
+ "team": {
+ "filter": {
+ "placeholder": "Suodata roolin mukaan",
+ "all": "Kaikki",
+ "admin": "Ylläpitäjä",
+ "member": "Jäsen"
+ },
+ "table": {
+ "headers": {
+ "email": "Sähköposti",
+ "role": "Rooli",
+ "created": "Luotu"
+ }
+ },
+ "addMember": {
+ "title": "Rekisteröi uusi tiimin jäsen",
+ "description": "Luo uusi käyttäjätili. Jaa tunnukset turvallisesti luomisen jälkeen."
+ },
+ "invite": {
+ "title": "Kutsu tiimin jäsen",
+ "description": "Lähetä kutsu liittyä tiimiisi",
+ "email": {
+ "label": "Sähköpostiosoite",
+ "placeholder": "Syötä sähköpostiosoite"
+ },
+ "role": {
+ "label": "Rooli",
+ "placeholder": "Valitse rooli"
+ },
+ "linkLabel": "Kutsulinkki"
+ }
+ }
+ },
+ "auth": {
+ "common": {
+ "passwordRules": {
+ "length": {
+ "beginning": "",
+ "highlighted": ""
+ },
+ "lowercase": {
+ "beginning": "",
+ "highlighted": ""
+ },
+ "match": {
+ "beginning": "",
+ "highlighted": ""
+ },
+ "number": {
+ "beginning": "",
+ "highlighted": ""
+ },
+ "special": {
+ "beginning": "",
+ "highlighted": ""
+ },
+ "uppercase": {
+ "beginning": "",
+ "highlighted": ""
+ }
+ },
+ "form": {
+ "option": {
"email": {
- "errors": {
- "empty": "",
- "invalid": ""
- }
+ "label": "Sähköposti",
+ "placeholder": "me@example.com"
},
- "role": {
- "errors": {
- "empty": ""
- }
+ "password": {
+ "label": "Salasana",
+ "placeholder": "********"
+ },
+ "confirmPassword": {
+ "label": "Vahvista salasana"
}
}
}
+ },
+ "login": {
+ "title": "Tervetuloa takaisin Checkmateen!",
+ "subtitle": "Kirjaudu sisään jatkaaksesi",
+ "submit": "Kirjaudu sisään",
+ "links": {
+ "forgotPassword": {
+ "text": "Unohditko salasanan?",
+ "linkText": "Nollaa salasana"
+ },
+ "register": {
+ "text": "Eikö sinulla ole tiliä?",
+ "linkText": "Rekisteröidy täällä"
+ }
+ }
+ },
+ "register": {
+ "title": "Tervetuloa takaisin Checkmateen!",
+ "subtitle": "Rekisteröidy aloittaaksesi",
+ "submit": "Rekisteröidy"
+ },
+ "forgotPassword": {
+ "title": "Unohditko salasanasi?",
+ "subtitle": "Ei hätää, lähetämme sinulle nollausohjeet.",
+ "submit": "Pyydä palautusta",
+ "links": {
+ "login": {
+ "text": "Palaa",
+ "linkText": "kirjautumiseen"
+ }
+ }
+ },
+ "setNewPassword": {
+ "title": "Nollaa salasanasi",
+ "subtitle": "Uuden salasanasi on oltava eri kuin aiemmin käytetyt salasanat."
}
},
- "role": "",
- "changeTeamPassword": {
- "changePasswordMenu": "",
- "title": "",
- "description": "",
- "success": ""
- }
- },
- "monitorState": {
- "paused": "Tauota",
- "resumed": "Jatka",
- "active": ""
- },
- "menu": {
- "uptime": "",
- "pagespeed": "",
- "infrastructure": "Infrastruktuuri",
- "incidents": "",
- "statusPages": "Tilasivut",
- "maintenance": "Huolto",
- "integrations": "",
- "settings": "Asetukset",
- "support": "Tuki",
- "discussions": "Keskustelut",
- "docs": "Dokumentit",
- "changelog": "Muutosloki",
- "profile": "Profiili",
- "password": "Salasana",
- "team": "Tiimi",
- "logOut": "Kirjaudu ulos",
- "notifications": "",
- "logs": ""
- },
- "settingsEmailUser": "",
- "state": "Tila",
- "statusBreadCrumbsStatusPages": "Tilasivut",
- "statusBreadCrumbsDetails": "Tiedot",
- "commonSaving": "Tallennetaan...",
- "navControls": "Ohjaimet",
- "incidentsPageTitle": "Häiriöt",
- "passwordPanel": {
- "passwordChangedSuccess": "Salasanasi vaihdettiin onnistuneesti.",
- "passwordInputIncorrect": "",
- "currentPassword": "Nykyinen salasana",
- "enterCurrentPassword": "Kirjoita nykyinen salasanasi",
- "newPassword": "Uusi salasana",
- "enterNewPassword": "Kirjoita uusi salasana",
- "confirmNewPassword": "Vahvista uusi salasana",
- "passwordRequirements": "Uuden salasanan on oltava vähintään 8 merkkiä pitkä ja sen on sisältävä vähintään yksi iso kirjain, yksi pieni kirjain, yksi numero sekä yksi erikoismerkki.",
- "saving": "Tallennetaan..."
- },
- "emailSent": "Sähköpostin lähetys onnistui",
- "failedToSendEmail": "Sähköpostin lähetys epäonnistui",
- "settingsTestEmailSuccess": "Testisähköpostin lähetys onnistui",
- "settingsTestEmailFailed": "Testisähköpostin lähetys epäonnistui",
- "settingsTestEmailFailedWithReason": "Testisähköpostin lähetys epäonnistui: {{reason}}",
- "settingsTestEmailUnknownError": "Tuntematon virhe",
- "statusMsg": {
- "paused": "Valvonta on keskeytetty.",
- "up": "Sivusi on ylhäällä.",
- "down": "Sivusi on alhaalla.",
- "pending": "Odottaa..."
- },
- "uptimeGeneralInstructions": {
- "http": "",
- "ping": "",
- "docker": "",
- "port": "",
- "game": "",
- "https": ""
- },
- "common": {
- "appName": "",
- "monitoringAgentName": "",
- "buttons": {
- "toggleTheme": ""
+ "checks": {
+ "selects": {
+ "monitor": {
+ "all": "Kaikki monitorit"
+ },
+ "status": {
+ "all": "Kaikki",
+ "down": "Alhaalla",
+ "up": "Ylhäällä"
+ }
+ },
+ "table": {
+ "empty": "Ei alhaalla-tarkistuksia tällä aikavälillä",
+ "headers": {
+ "statusCode": "Tilakoodi",
+ "location": "Sijainti"
+ }
+ }
},
- "toasts": {
- "networkError": "",
- "checkConnection": "",
- "unknownError": ""
- }
- },
- "auth": {
"common": {
- "navigation": {
- "continue": "",
- "back": ""
- },
- "inputs": {
- "email": {
- "label": "",
- "placeholder": "",
- "errors": {
- "empty": "",
- "invalid": ""
- }
+ "monitors": {
+ "actions": {
+ "configure": "Määritä",
+ "delete": "Poista",
+ "generateToken": "Luo tunniste",
+ "details": "Tiedot",
+ "incidents": "Häiriöt",
+ "inviteMember": "Kutsu jäsen",
+ "openSite": "Avaa sivusto",
+ "pause": "Keskeytä",
+ "resume": "Jatka"
},
- "password": {
- "label": "",
- "rules": {
- "length": {
- "beginning": "",
- "highlighted": ""
+ "statBoxes": {
+ "activeFor": "Aktiivinen",
+ "certificateExpiry": "Varmenteen vanheneminen",
+ "lastCheck": "Viimeisin tarkistus",
+ "lastResponseTime": "Viimeisin vasteaika"
+ },
+ "status": {
+ "down": "alhaalla",
+ "breached": "kynnysarvo ylitetty",
+ "initializing": "alustamassa",
+ "maintenance": "huollossa",
+ "paused": "keskeytetty",
+ "total": "yhteensä",
+ "up": "ylhäällä"
+ },
+ "monitorTypes": {
+ "optionDocker": "Docker",
+ "optionGame": "Peli",
+ "optionHttp": "HTTP(S)",
+ "optionPing": "Ping",
+ "optionPort": "Portti",
+ "optionPagespeed": "PageSpeed",
+ "optionHardware": "Infrastruktuuri",
+ "optionGrpc": "gRPC",
+ "optionWebSocket": "WebSocket"
+ }
+ }
+ },
+ "createMonitor": {
+ "form": {
+ "advanced": {
+ "description": "Valinnaisia asetuksia edistyneille käyttötapauksille",
+ "option": {
+ "advancedMatching": {
+ "label": "Käytä edistynyttä vastaavuutta"
},
- "special": {
- "beginning": "",
- "highlighted": ""
+ "expectedValue": {
+ "label": "Odotettu arvo"
},
- "number": {
- "beginning": "",
- "highlighted": ""
+ "jsonPath": {
+ "description": "Tämä lauseke arvioidaan vastauksen JSON-dataa vasten ja tulosta käytetään odotetun arvon vertailuun. Katso jmespath.org kyselykielen dokumentaatio.",
+ "label": "JSONPath-lauseke"
},
- "uppercase": {
- "beginning": "",
- "highlighted": ""
+ "matchMethod": {
+ "label": "Vertailutapa",
+ "equal": "",
+ "include": "",
+ "regex": ""
+ }
+ },
+ "title": "Lisäasetukset"
+ },
+ "frequency": {
+ "description": "Kuinka usein haluat tarkistaa tämän monitorin tilan?",
+ "option": {
+ "frequency": {
+ "label": "Tarkistusväli",
+ "value": {
+ "fifteenMinutes": "15 minuuttia",
+ "fifteenSeconds": "",
+ "fiveMinutes": "5 minuuttia",
+ "fourMinutes": "",
+ "oneMinute": "",
+ "tenMinutes": "10 minuuttia",
+ "thirtyMinutes": "30 minuuttia",
+ "thirtySeconds": "",
+ "threeMinutes": "",
+ "twoMinutes": ""
+ }
+ }
+ },
+ "title": "Tarkistusväli"
+ },
+ "general": {
+ "option": {
+ "container": {
+ "label": "Kontin nimi/tunnus",
+ "placeholder": "my-app tai abcd1234"
+ },
+ "host": {
+ "label": "Isäntä",
+ "placeholder": "192.168.1.100 tai example.com"
+ },
+ "name": {
+ "label": "Näyttönimi",
+ "placeholder": "esim. Oma verkkosivusto"
+ },
+ "secret": {
+ "label": "Valtuutusavain",
+ "placeholder": "Syötä salausavaimesi"
+ },
+ "url": {
+ "label": "URL",
+ "placeholder": "https://www.google.com"
+ },
+ "game": {
+ "label": "",
+ "placeholder": ""
},
- "lowercase": {
- "beginning": "",
- "highlighted": ""
+ "port": {
+ "label": "Monitoroitava portti",
+ "placeholder": "80"
},
- "match": {
- "beginning": "",
- "highlighted": ""
+ "grpcServiceName": {
+ "label": "Palvelun nimi",
+ "placeholder": "esim. my.service.v1 (jätä tyhjäksi yleistä tilaa varten)"
+ },
+ "wsUrl": {
+ "label": "WebSocket URL",
+ "placeholder": "wss://example.com/socket"
}
},
- "errors": {
- "empty": "",
- "length": "",
- "uppercase": "",
- "lowercase": "",
- "number": "",
- "special": "",
- "incorrect": ""
+ "title": "Yleiset asetukset",
+ "description": {
+ "http": "Syötä monitoroitava URL tai IP (esim. https://example.com/ tai 192.168.1.100) ja lisää selkeä näyttönimi, joka näkyy hallintapaneelissa.",
+ "ping": "",
+ "port": "",
+ "docker": "",
+ "game": "",
+ "pagespeed": "Seuraa sivun latausnopeutta, Core Web Vitals -arvoja ja optimointipisteitä verkkosivustollasi.",
+ "grpc": "Syötä gRPC-palvelimen isäntänimi ja portti, määritä halutessasi palvelun nimi terveystarkistusta varten ja lisää näyttönimi.",
+ "websocket": "Syötä monitoroitava WebSocket URL (esim. wss://example.com/socket) ja lisää näyttönimi.",
+ "hardware": "Monitoroi infrastruktuurisi CPU:n, muistin ja levyn käyttöä sekä lämpötilaa."
}
},
- "passwordConfirm": {
- "label": "",
- "placeholder": "",
- "errors": {
- "empty": "",
- "different": ""
- }
+ "ignoreTls": {
+ "description": "Määritä TLS/SSL-varmenteen vahvistus HTTPS-yhteyksiä varten.",
+ "option": {
+ "tls": {
+ "label": "Ohita TLS/SSL-virheet"
+ }
+ },
+ "title": "TLS/SSL-asetukset"
+ },
+ "incidents": {
+ "description": "Liukuva ikkuna määrittää, milloin monitori katsotaan alhaalla olevaksi. Monitorin tila muuttuu vasta, kun tarkistusten prosenttiosuus liukuvassa ikkunassa saavuttaa määritellyn arvon.",
+ "option": {
+ "checks": {
+ "label": "Tarkistusten määrä liukuvassa ikkunassa"
+ },
+ "percentage": {
+ "label": "Kuinka suuren osuuden tarkistuksista liukuvassa ikkunassa on epäonnistuttava/onnistuttava ennen kuin monitorin tila muuttuu?"
+ }
+ },
+ "title": "Häiriöt"
},
- "firstName": {
- "label": "",
- "placeholder": "",
- "errors": {
- "empty": "",
- "length": "",
- "pattern": ""
+ "notifications": {
+ "description": "Valitse ilmoituskanavat, joita haluat käyttää",
+ "title": "Ilmoitukset"
+ },
+ "type": {
+ "description": "Valitse suoritettavan tarkistuksen tyyppi",
+ "optionDockerDescription": "Käytä Dockeria monitoroimaan, onko kontti käynnissä.",
+ "optionGameDescription": "Monitoroi, onko tietty pelipalvelin verkossa.",
+ "optionGrpcDescription": "Monitoroi gRPC-palveluita standardin Health Checking Protocol -protokollan avulla.",
+ "optionWebSocketDescription": "Monitoroi WebSocket-päätepisteitä yhteyden kunnon ja vasteajan osalta.",
+ "optionHttpDescription": "Käytä HTTP(S)-protokollaa verkkosivustosi tai API-päätepisteen monitorointiin.",
+ "optionPingDescription": "Käytä ICMP Ping -komentoa monitoroimaan, onko palvelin verkossa.",
+ "optionPortDescription": "Monitoroi, onko tietty palvelimen portti auki.",
+ "title": "Tyyppi"
+ },
+ "thresholds": {
+ "title": "Hälytysrajat",
+ "description": "Määritä kynnysarvot, joiden ylittyessä hälytykset laukaistaan tälle laitemonitorille.",
+ "option": {
+ "cpuThreshold": {
+ "label": "CPU-hälytysraja (%)"
+ },
+ "memoryThreshold": {
+ "label": "Muistin hälytysraja (%)"
+ },
+ "diskThreshold": {
+ "label": "Levyn hälytysraja (%)"
+ },
+ "tempThreshold": {
+ "label": "Lämpötilan hälytysraja (°C)"
+ }
}
},
- "lastName": {
- "label": "",
- "placeholder": "",
- "errors": {
- "empty": "",
- "length": "",
- "pattern": ""
+ "geoChecks": {
+ "title": "Maantieteellisesti hajautetut tarkistukset",
+ "description": "Suorita tarkistuksia useista maantieteellisistä sijainneista globaalin saatavuuden ja suorituskyvyn monitoroimiseksi.",
+ "option": {
+ "enabled": {
+ "label": "Ota käyttöön maantieteellisesti hajautetut tarkistukset"
+ },
+ "locations": {
+ "label": "Sijainnit",
+ "placeholder": "Valitse sijainnit",
+ "options": {
+ "EU": "Eurooppa",
+ "NA": "Pohjois-Amerikka",
+ "AS": "Aasia",
+ "SA": "Etelä-Amerikka",
+ "AF": "Afrikka",
+ "OC": "Oseania"
+ }
+ },
+ "interval": {
+ "label": "Tarkistusväli",
+ "value": {
+ "fiveMinutes": "5 minuuttia",
+ "tenMinutes": "10 minuuttia",
+ "fifteenMinutes": "15 minuuttia",
+ "thirtyMinutes": "30 minuuttia"
+ }
+ }
}
- }
- },
- "errors": {
- "validation": ""
- },
- "fields": {
- "password": {
- "errors": {
- "incorrect": ""
+ },
+ "url": {
+ "title": "Monitorin IP/URL tilasivulla",
+ "description": "Näytä monitorin IP-osoite tai URL julkisella tilasivulla. Jos se on poistettu käytöstä, vain monitorin nimi näytetään arkaluonteisten tietojen suojaamiseksi.",
+ "option": {
+ "showURL": {
+ "label": "Näytä IP/URL tilasivulla",
+ "enabled": "Käytössä",
+ "disabled": "Pois käytöstä"
+ }
}
},
- "role": {
- "errors": {
- "min": ""
+ "stats": {
+ "title": "Monitorointihistoria",
+ "description": "Tyhjennä kaikki tiimisi monitorointihistoria ja tilastot. Tätä toimintoa ei voi kumota.",
+ "buttonText": "Tyhjennä kaikki tilastot",
+ "dialog": {
+ "title": "Tyhjennetäänkö kaikki monitorointihistoria?",
+ "description": "Tämä poistaa pysyvästi kaikki tiimisi monitorointihistorian, tilastot ja tarkistustiedot. Tätä toimintoa ei voi kumota.",
+ "confirm": "Kyllä, tyhjennä kaikki tilastot"
}
}
}
},
- "login": {
- "heading": "",
- "subheadings": {
- "stepOne": "",
- "stepTwo": ""
+ "editUser": {
+ "form": {
+ "roles": {
+ "title": "Roolit",
+ "description": "Määritä käyttäjälle roolit. Useita rooleja voi valita."
+ }
},
- "links": {
- "forgotPassword": "",
- "register": "",
- "forgotPasswordLink": "",
- "registerLink": ""
+ "dialog": {
+ "removeUser": {
+ "title": "Poista käyttäjä",
+ "content": "Haluatko varmasti poistaa käyttäjän {{name}} tiimistäsi? Tätä toimintoa ei voi kumota."
+ }
+ }
+ },
+ "incidents": {
+ "dialog": {
+ "resolveIncident": {
+ "title": "Ratkaise häiriö",
+ "option": {
+ "comment": {
+ "label": "Kommentti (valinnainen)",
+ "placeholder": "Lisää kommentti ratkaisusta..."
+ }
+ }
+ },
+ "details": {
+ "analysis": "Häiriöanalyysi",
+ "comment": "Kommentti:",
+ "detailsLabel": "Tiedot",
+ "downtime": "Käyttökatko:",
+ "message": "Viesti:",
+ "monitor": "Monitori:",
+ "overview": "Yleiskatsaus",
+ "resolutionDetails": "Ratkaisun tiedot",
+ "resolutionType": "Tyyppi:",
+ "resolutionTypes": {
+ "automatic": "Automaattinen",
+ "manual": "Manuaalinen"
+ },
+ "resolve": "Ratkaise häiriö",
+ "resolvedAt": "Ratkaistu:",
+ "resolvedBy": "Ratkaisija:",
+ "startedAt": "Alkanut:",
+ "status": "Tila:",
+ "statusCode": "Tilakoodi:",
+ "timeline": "Aikajana",
+ "title": "Häiriön tiedot",
+ "url": "URL:"
+ }
},
- "toasts": {
- "success": "",
- "incorrectPassword": ""
+ "filters": {
+ "allMonitors": "Kaikki monitorit",
+ "monitor": "Monitori",
+ "resolutionType": "Ratkaisun tyyppi",
+ "resolutionTypes": {
+ "manual": "Manuaalinen",
+ "automatic": "Automaattinen",
+ "all": "Kaikki"
+ }
},
- "errors": {
- "password": {
- "incorrect": ""
+ "summaryCard": {
+ "activeIncidents": {
+ "title": "Aktiiviset häiriöt",
+ "active_zero": "Ei aktiivisia häiriöitä",
+ "active_one": "{{count}} aktiivinen häiriö",
+ "active_other": "{{count}} aktiivista häiriötä"
+ },
+ "incidentStats": {
+ "avgResolutionTime": "Keskim. ratkaisuaika",
+ "mostAffectedMonitor": "Eniten häiriöitä kokenut monitori",
+ "title": "Häiriötilastot",
+ "totalIncidents": "Häiriöitä yhteensä"
+ },
+ "latestIncidents": {
+ "title": "Viimeisimmät häiriöt"
}
},
- "welcome": ""
+ "table": {
+ "actions": {
+ "details": "Tiedot",
+ "goToMonitor": "Siirry monitoriin",
+ "resolveManually": "Ratkaise manuaalisesti"
+ },
+ "activeIncidents": "Aktiiviset häiriöt",
+ "headers": {
+ "endTime": "Päättymisaika",
+ "resolutionType": "Ratkaisun tyyppi",
+ "startTime": "",
+ "statusCode": "Tilakoodi"
+ },
+ "resolvedIncidents": "Ratkaistut häiriöt",
+ "status": {
+ "active": "Aktiivinen",
+ "resolved": "Ratkaistu"
+ }
+ }
},
- "registration": {
- "heading": {
- "superAdmin": "",
- "user": ""
- },
- "subheadings": {
- "stepOne": "",
- "stepTwo": "",
- "stepThree": ""
+ "infrastructure": {
+ "charts": {
+ "labels": {
+ "cpu": "CPU:n käyttö",
+ "disk": "Levyn käyttö",
+ "memory": "Muistin käyttö",
+ "netBytesRecv": "{{name}} - tavua vastaanotettu",
+ "netBytesSent": "{{name}} - tavua lähetetty",
+ "temp": "Lämpö"
+ }
},
- "description": {
- "superAdmin": "",
- "user": ""
+ "gauges": {
+ "cpu": {
+ "lowerLabel": "Enimmäistaajuus",
+ "title": "CPU:n käyttö",
+ "upperLabel": "Nykyinen taajuus"
+ },
+ "disk": {
+ "lowerLabel": "Vapaa",
+ "title": "Levy {{idx}} käyttö",
+ "upperLabel": "Käytetty"
+ },
+ "memory": {
+ "lowerLabel": "Vapaa",
+ "title": "Muistin käyttö",
+ "upperLabel": "Käytetty"
+ }
},
- "gettingStartedButton": {
- "superAdmin": "",
- "user": ""
+ "statBoxes": {
+ "avgCpuTemperature": "",
+ "cpuFrequency": "",
+ "cpuLogical": "",
+ "cpuPhysical": "",
+ "disk": "Levy",
+ "memory": "Muisti",
+ "os": ""
},
- "termsAndPolicies": "",
- "links": {
- "login": ""
+ "table": {
+ "headers": {
+ "cpu": "CPU",
+ "disk": "Levy",
+ "memory": "Muisti"
+ }
},
- "toasts": {
- "success": ""
+ "tabs": {
+ "labels": {
+ "network": "",
+ "overview": "Yleiskatsaus"
+ }
},
- "welcome": ""
+ "fallback": {
+ "actionButton": "Luo monitori!",
+ "checks": "Track the performance of your servers,Identify bottlenecks and optimize usage,Ensure reliability with real-time monitoring",
+ "title": "Infrastruktuurimonitorilla voit:"
+ }
},
- "forgotPassword": {
- "heading": "",
- "subheadings": {
- "stepOne": "",
- "stepTwo": "",
- "stepThree": "",
- "stepFour": ""
+ "logs": {
+ "tabs": {
+ "diagnostics": "",
+ "logs": "",
+ "queue": ""
},
- "buttons": {
- "openEmail": "",
- "resetPassword": ""
+ "logLevelSelect": {
+ "label": "Lokitaso"
},
- "imageAlts": {
- "passwordKey": "",
- "email": "",
- "lock": "",
- "passwordConfirm": ""
+ "jobQueue": "Työnojono",
+ "failedJobs": "Epäonnistuneet työt",
+ "noLogs": "Lokeja ei löytynyt",
+ "metrics": {
+ "jobs": "Työt",
+ "activeJobs": "Aktiiviset työt",
+ "failingJobs": "Epäonnistuvat työt",
+ "totalRuns": "Suoritukset yhteensä",
+ "totalFailures": "Epäonnistumiset yhteensä"
},
- "links": {
- "login": "",
- "resend": ""
+ "diagnostics": {
+ "stats": {
+ "eventLoopDelay": "Tapahtumasilmukan viive",
+ "uptime": "Käytettävyys",
+ "usedHeapSize": "Käytetty keon koko",
+ "totalHeapSize": "Keon kokonaiskoko",
+ "osMemoryLimit": "Käyttöjärjestelmän muistiraja"
+ },
+ "gauges": {
+ "heapAllocation": "Keon varaus",
+ "heapUsage": "Keon käyttö",
+ "heapUtilization": "Keon hyödyntäminen",
+ "instantCpuUsage": "Hetkellinen CPU:n käyttö",
+ "availableMemoryPercentage": "% vapaasta muistista",
+ "allocatedPercentage": "% varattu",
+ "usedSPercentage": "% sekunnista CPU:n käytössä",
+ "total": "Yhteensä",
+ "used": "Käytetty"
+ }
},
- "toasts": {
- "sent": "",
- "emailNotFound": "",
- "redirect": "",
- "success": "",
- "error": ""
+ "table": {
+ "headers": {
+ "timestamp": "Aikaleima",
+ "level": "Taso",
+ "service": "Palvelu",
+ "method": "Metodi",
+ "monitorId": "Monitorin tunnus",
+ "runCount": "Suorituskerrat",
+ "failCount": "Epäonnistumiskerrat",
+ "lastRunAt": "Viimeisin suoritus",
+ "lockedAt": "Lukittu",
+ "lastFinishedAt": "Viimeisin valmistuminen",
+ "lastRunTook": "Viimeisin suoritus kesti",
+ "lastFailedAt": "Viimeisin epäonnistuminen",
+ "failReason": "Epäonnistumisen syy"
+ }
}
- }
- },
- "errorPages": {
- "serverUnreachable": {
- "toasts": {
- "reconnected": "",
- "stillUnreachable": ""
+ },
+ "maintenanceWindow": {
+ "fallback": {
+ "actionButton": "Luo huoltoikkuna!",
+ "checks": "Mark your maintenance periods,Eliminate any misunderstandings,Stop sending alerts in maintenance windows",
+ "title": "Huoltoikkunalla voit:"
+ },
+ "table": {
+ "headers": {
+ "nextWindow": "",
+ "repeat": ""
+ }
},
- "alertBox": "",
- "description": "",
- "retryButton": {
- "default": "",
- "processing": ""
+ "form": {
+ "general": {
+ "title": "Yleiset asetukset",
+ "description": "Aseta nimi ja toistovalinta huoltoikkunallesi.",
+ "option": {
+ "name": {
+ "label": "Nimi",
+ "placeholder": "esim. Viikoittainen huolto"
+ },
+ "repeat": {
+ "label": "Toista"
+ }
+ }
+ },
+ "startDate": {
+ "title": "Alkamispäivä",
+ "description": "Valitse huoltoikkunan alkamispäivä.",
+ "option": {
+ "startDate": {
+ "label": "Alkamispäivä"
+ }
+ }
+ },
+ "startTime": {
+ "title": "Alkamisaika",
+ "description": "Aseta huoltoikkunan alkamisaika ja kesto. Kaikki arvot ovat UTC-aikaa.",
+ "option": {
+ "duration": {
+ "label": "Kesto"
+ },
+ "startTime": {
+ "label": "Alkamisaika"
+ }
+ },
+ "monitors": {
+ "title": "Monitorit",
+ "description": "Monitorit, joihin huoltoikkuna kohdistuu",
+ "option": {
+ "addMonitors": {
+ "label": "Lisää monitorit"
+ }
+ }
+ }
+ }
}
- }
- },
- "createNotifications": {
- "title": "",
- "nameSettings": {
- "title": "",
- "description": "",
- "nameLabel": "",
- "namePlaceholder": ""
- },
- "typeSettings": {
- "title": "",
- "description": "",
- "typeLabel": ""
- },
- "emailSettings": {
- "title": "",
- "description": "",
- "emailLabel": "",
- "emailPlaceholder": ""
- },
- "slackSettings": {
- "title": "",
- "description": "",
- "webhookLabel": "",
- "webhookPlaceholder": ""
- },
- "pagerdutySettings": {
- "title": "",
- "description": "",
- "integrationKeyLabel": "",
- "integrationKeyPlaceholder": ""
},
- "discordSettings": {
- "title": "",
- "description": "",
- "webhookLabel": "",
- "webhookPlaceholder": ""
- },
- "webhookSettings": {
- "title": "",
- "description": "",
- "webhookLabel": "",
- "webhookPlaceholder": ""
- },
- "testNotification": "",
- "dialogDeleteTitle": "",
- "dialogDeleteConfirm": ""
- },
- "notificationConfig": {
- "title": "",
- "description": ""
- },
- "monitorStatus": {
- "checkingEvery": "",
- "withCaptureAgent": "",
- "up": "",
- "down": "",
- "paused": ""
- },
- "advancedMatching": "",
- "sendTestNotifications": "",
- "selectAll": "",
- "showAdminLoginLink": "",
- "logsPage": {
- "title": "",
- "description": "",
- "tabs": {
- "queue": "",
- "logs": "",
- "diagnostics": ""
- },
- "toast": {
- "fetchLogsSuccess": ""
- },
- "logLevelSelect": {
- "title": "",
- "values": {
- "all": "",
- "info": "",
- "warn": "",
- "error": "",
- "debug": ""
+ "notifications": {
+ "fallback": {
+ "actionButton": "Luo kanava",
+ "checks": "Alert teams about downtime or performance issues,Let engineers know when incidents happen,Keep administrators informed of system changes",
+ "title": "Ilmoituskanavia käytetään:"
+ },
+ "form": {
+ "accessToken": {
+ "optionAccessToken": "Pääsytunniste",
+ "placeholder": "syt_YWxleF9ob2xsaWRheQ_VmtScmV0U2VjcmV0S2V5_abc123"
+ },
+ "address": {
+ "description": "Osoite, johon ilmoitukset lähetetään.",
+ "optionAddress": "Osoite",
+ "placeholderEmail": "example@example.com",
+ "placeholderWebhook": "https://your-server.com/webhook",
+ "title": "Osoite"
+ },
+ "homeServer": {
+ "optionHomeServer": "Kotipalvelin",
+ "placeholder": "example.com"
+ },
+ "matrix": {
+ "description": "Määritä Matrix-kotipalvelimen yhteys ilmoituksia varten.",
+ "title": "Matrix-määritykset"
+ },
+ "notificationName": {
+ "description": "Kuvaava nimi ilmoituskanavalle",
+ "optionName": "Kanavan nimi",
+ "placeholder": "esim. Tuotantohälytykset",
+ "title": "Kanavan nimi"
+ },
+ "pagerDuty": {
+ "description": "PagerDuty-integrointiavaimesi hälytysten vastaanottamiseen.",
+ "optionIntegrationKey": "Integrointiavain",
+ "placeholder": "a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6",
+ "title": "Integrointiavain"
+ },
+ "roomId": {
+ "optionRoomId": "Huoneen tunnus",
+ "placeholder": "!abcdefg:matrix.org"
+ },
+ "type": {
+ "description": "Valitse luotavan ilmoituskanavan tyyppi.",
+ "optionType": "Tyyppi",
+ "title": "Kanavan tyyppi"
+ },
+ "telegram": {
+ "title": "Telegram-määritykset",
+ "description": "",
+ "optionBotToken": "Bottitunniste",
+ "placeholderBotToken": "123456789:ABCdefGhIJKlmNoPQRsTUVwxyZ",
+ "optionChatId": "Chat-tunnus",
+ "placeholderChatId": "-1001234567890"
+ }
+ },
+ "table": {
+ "headers": {
+ "destination": "Kohde"
+ }
}
- }
- },
- "queuePage": {
- "title": "",
- "refreshButton": "",
- "flushButton": "",
- "jobTable": {
- "title": "",
- "idHeader": "",
- "urlHeader": "",
- "typeHeader": "",
- "activeHeader": "",
- "lockedAtHeader": "",
- "runCountHeader": "",
- "failCountHeader": "",
- "lastRunHeader": "",
- "lastFinishedAtHeader": "",
- "lastRunTookHeader": "",
- "intervalHeader": ""
- },
- "metricsTable": {
- "title": "",
- "metricHeader": "",
- "valueHeader": ""
- },
- "failedJobTable": {
- "title": "",
- "monitorIdHeader": "",
- "monitorUrlHeader": "",
- "failCountHeader": "",
- "failedAtHeader": "",
- "failReasonHeader": ""
- }
- },
- "export": {
- "title": "",
- "success": "",
- "failed": ""
- },
- "monitorActions": {
- "title": "",
- "import": "",
- "export": "",
- "deleteSuccess": "",
- "deleteFailed": "",
- "details": ""
- },
- "settingsPage": {
- "aboutSettings": {
- "labelDevelopedBy": "",
- "labelVersion": "",
- "title": ""
},
- "demoMonitorsSettings": {
- "buttonAddMonitors": "",
- "description": "",
- "title": ""
- },
- "emailSettings": {
- "buttonSendTestEmail": "",
- "description": "",
- "descriptionTransport": "",
- "labelAddress": "",
- "labelConnectionHost": "",
- "labelHost": "",
- "labelIgnoreTLS": "",
- "labelPassword": "",
- "labelPasswordSet": "",
- "labelPool": "",
- "labelPort": "",
- "labelRejectUnauthorized": "",
- "labelRequireTLS": "",
- "labelSecure": "",
- "labelTLSServername": "",
- "labelUser": "",
- "linkTransport": "",
- "placeholderUser": "",
- "title": "",
- "toastEmailRequiredFieldsError": ""
- },
- "pageSpeedSettings": {
- "description": "",
- "labelApiKeySet": "",
- "labelApiKey": "",
- "title": ""
- },
- "saveButtonLabel": "",
- "statsSettings": {
- "clearAllStatsButton": "",
- "clearAllStatsDescription": "",
- "clearAllStatsDialogConfirm": "",
- "clearAllStatsDialogDescription": "",
- "clearAllStatsDialogTitle": "",
- "description": "",
- "labelTTL": "",
- "labelTTLOptional": "",
- "title": ""
- },
- "systemResetSettings": {
- "buttonRemoveAllMonitors": "",
- "description": "",
- "dialogConfirm": "",
- "dialogDescription": "",
- "dialogTitle": "",
- "title": ""
- },
- "timezoneSettings": {
- "description": "",
- "label": "",
- "title": ""
- },
- "title": "",
- "uiSettings": {
- "description": "",
- "labelLanguage": "",
- "labelTheme": "",
- "title": ""
- },
- "urlSettings": {
- "description": "",
- "label": "",
- "selectDisabled": "",
- "selectEnabled": "",
- "title": ""
- },
- "globalThresholds": {
- "title": "",
- "description": ""
- }
- },
- "statusPageCreate": {
- "buttonSave": ""
- },
- "incidentsOptionsHeaderFilterResolved": "",
- "settingsSave": "",
- "statusPageCreateAppearanceTitle": "",
- "confirmPassword": "",
- "monitorHooks": {
- "failureAddDemoMonitors": "",
- "successAddDemoMonitors": ""
- },
- "settingsAppearance": "",
- "settingsDisplayTimezone": "",
- "settingsGeneralSettings": "",
- "incidentsOptionsHeaderTotalIncidents": "",
- "statusPage": {
- "deleteSuccess": "",
- "deleteFailed": "",
- "createSuccess": "",
- "updateSuccess": "",
- "generalSettings": "",
- "contents": "",
- "fallback": {
- "checks": [""],
- "title": "",
- "actionButton": ""
- }
- },
- "testNotificationsDisabled": "",
- "incidentsTableResolvedAt": "",
- "incidentsTableActionResolve": "",
- "checkHooks": {
- "failureResolveOne": "",
- "failureResolveAll": "",
- "failureResolveMonitor": ""
- },
- "checkFormError": "",
- "diagnosticsPage": {
- "diagnosticDescription": "",
- "statsDescription": "",
- "gauges": {
- "heapAllocationTitle": "",
- "heapAllocationSubtitle": "",
- "heapUsageTitle": "",
- "heapUsageSubtitle": "",
- "heapUtilizationTitle": "",
- "heapUtilizationSubtitle": "",
- "instantCpuUsageTitle": "",
- "instantCpuUsageSubtitle": ""
- },
- "stats": {
- "eventLoopDelayTitle": "",
- "uptimeTitle": "",
- "usedHeapSizeTitle": "",
- "totalHeapSizeTitle": "",
- "osMemoryLimitTitle": ""
- }
- },
- "pageSpeedLighthouseAPI": "",
- "time": {
- "threeMinutes": "",
- "fiveMinutes": "",
- "tenMinutes": "",
- "twentyMinutes": "",
- "oneHour": "",
- "oneDay": "",
- "oneWeek": "",
- "fourMinutes": "",
- "oneMinute": "",
- "twoMinutes": "",
- "fifteenSeconds": "",
- "thirtySeconds": ""
- },
- "general": {
- "noOptionsFound": ""
- },
- "infrastructureMonitor": {
- "fallback": {
- "checks": [""],
- "title": "",
- "actionButton": ""
- }
- },
- "maintenanceWindow": {
- "fallback": {
- "checks": [""],
- "title": "",
- "actionButton": ""
- }
- },
- "pageSpeed": {
- "fallback": {
- "checks": [""],
- "title": "",
- "actionButton": ""
- }
- },
- "uptimeMonitor": {
- "fallback": {
- "checks": [""],
- "title": "",
- "actionButton": ""
- }
- },
- "editUserPage": {
- "form": {
- "email": "",
- "firstName": "",
- "lastName": "",
- "role": "",
- "save": ""
- },
- "table": {
- "actionHeader": "",
- "roleHeader": ""
- },
- "title": "",
- "toast": {
- "successUserUpdate": "",
- "validationErrors": ""
- }
- },
- "incidentsPageActionResolveMonitor": "",
- "incidentsPageActionResolveAll": "",
- "matchMethodOptions": {
- "equal": "",
- "equalPlaceholder": "",
- "include": "",
- "includePlaceholder": "",
- "regex": "",
- "regexPlaceholder": "",
- "text": ""
- },
- "monitorType": {
- "docker": {
- "label": "",
- "namePlaceholder": "",
- "placeholder": ""
- },
- "http": {
- "label": "",
- "namePlaceholder": "",
- "placeholder": ""
+ "pageSpeed": {
+ "charts": {
+ "common": {
+ "cls": "Kumulatiivinen asettelun muutos (CLS)",
+ "fcp": "Ensimmäinen sisältöpiirto (FCP)",
+ "lcp": "Suurin sisältöpiirto (LCP)",
+ "si": "Nopeusindeksi (SI)",
+ "tbt": "Kokonaisestymisaika (TBT)"
+ },
+ "legend": {
+ "title": "PageSpeed-raportti",
+ "weight": "Painoarvo"
+ },
+ "pie": {
+ "title": "Suorituskykyraportti"
+ }
+ },
+ "table": {
+ "headers": {
+ "pageSpeedScore": "PageSpeed-pisteet"
+ }
+ },
+ "fallback": {
+ "actionButton": "Luo monitori!",
+ "checks": "Report on the user experience of a page,Help analyze webpage speed,Give suggestions on how the page can be improved",
+ "title": "PageSpeed-monitorilla voit:"
+ }
},
- "ping": {
- "label": "",
- "namePlaceholder": "",
- "placeholder": ""
+ "settings": {
+ "form": {
+ "timezone": {
+ "title": "Näytettävä aikavyöhyke",
+ "description": "Valitse aikavyöhyke, jota käytetään päivämäärien ja aikojen näyttämiseen sovelluksessa.",
+ "option": {
+ "timezone": {
+ "label": "Näytettävä aikavyöhyke"
+ }
+ }
+ },
+ "ui": {
+ "title": "Ulkoasu",
+ "description": "Vaihda vaalean ja tumman tilan välillä, muuta kieltä tai muokkaa kaavion näyttötyyppiä.",
+ "option": {
+ "theme": {
+ "label": "Teematila",
+ "light": "Vaalea",
+ "dark": "Tumma"
+ },
+ "language": {
+ "label": "Kieli"
+ },
+ "chartType": {
+ "label": "Kaaviotyyppi",
+ "histogram": "Histogrammi",
+ "heatmap": "Lämpökartta"
+ }
+ }
+ },
+ "pagespeed": {
+ "title": "Google PageSpeed API -avain",
+ "description": "Syötä Google PageSpeed API -avaimesi ottaaksesi käyttöön Google PageSpeed -monitoroinnin. Napsauta Palauta päivittääksesi avaimen.",
+ "option": {
+ "apiKey": {
+ "label": "PageSpeed API -avain",
+ "labelSet": "API-avain on asetettu. Napsauta Palauta muuttaaksesi sitä.",
+ "placeholder": "Syötä Google PageSpeed API -avaimesi"
+ }
+ }
+ },
+ "url": {
+ "title": "Monitorin IP/URL tilasivulla",
+ "description": "Näytä monitorin IP-osoite tai URL julkisella tilasivulla. Jos se on poistettu käytöstä, vain monitorin nimi näytetään arkaluonteisten tietojen suojaamiseksi.",
+ "option": {
+ "showURL": {
+ "label": "Näytä IP/URL tilasivulla",
+ "enabled": "Käytössä",
+ "disabled": "Pois käytöstä"
+ }
+ }
+ },
+ "stats": {
+ "title": "Monitorointihistoria",
+ "description": "Tyhjennä kaikki tiimisi monitorointihistoria ja tilastot. Tätä toimintoa ei voi kumota.",
+ "option": {
+ "clear": {
+ "label": "Tyhjennä kaikki tilastot. Tätä ei voi kumota."
+ }
+ },
+ "dialog": {
+ "title": "Tyhjennetäänkö kaikki monitorointihistoria?",
+ "description": "Tätä ei voi kumota"
+ }
+ },
+ "retention": {
+ "title": "Tarkistusten säilytys",
+ "description": "Aseta kuinka kauan tarkistustietoja säilytetään ennen automaattista poistoa.",
+ "option": {
+ "days": {
+ "label": "Säilytysaika (päiviä)",
+ "unlimited": "Rajoittamaton"
+ }
+ }
+ },
+ "thresholds": {
+ "title": "Yleiset kynnysarvot",
+ "description": "Aseta yleiset CPU:n, muistin, levyn ja lämpötilan kynnysarvot infrastruktuurin monitorointiin. Nämä koskevat kaikkia laitemonitoreja, ellei niitä ohiteta.",
+ "option": {
+ "cpu": {
+ "label": "CPU-kynnysarvo (%)",
+ "placeholder": "1 - 100"
+ },
+ "memory": {
+ "label": "Muistin kynnysarvo (%)",
+ "placeholder": "1 - 100"
+ },
+ "disk": {
+ "label": "Levyn kynnysarvo (%)",
+ "placeholder": "1 - 100"
+ },
+ "temperature": {
+ "label": "Lämpötilan kynnysarvo (°C)",
+ "placeholder": "1 - 150"
+ }
+ }
+ },
+ "email": {
+ "title": "Sähköpostiasetukset",
+ "description": "Määritä järjestelmäsi sähköpostiasetukset. Niitä käytetään ilmoitusten ja hälytysten lähettämiseen.",
+ "descriptionTransport": "",
+ "descriptionTransportLink": "Katso tekniset tiedot täältä",
+ "option": {
+ "host": {
+ "label": "Sähköpostin isäntä - yhdistettävä isäntänimi tai IP-osoite",
+ "placeholder": "smtp.gmail.com"
+ },
+ "port": {
+ "label": "Sähköpostin portti - yhdistettävä portti",
+ "placeholder": "587"
+ },
+ "address": {
+ "label": "Sähköpostiosoite - käytetään tunnistautumiseen",
+ "placeholder": "you@example.com"
+ },
+ "user": {
+ "label": "Sähköpostin käyttäjä - tunnistautumisen käyttäjänimi, ohittaa sähköpostiosoitteen jos määritelty",
+ "placeholder": "Jätä tyhjäksi, jos ei tarvita"
+ },
+ "password": {
+ "label": "Sähköpostin salasana - tunnistautumisen salasana",
+ "labelSet": "Salasana on asetettu. Napsauta Palauta muuttaaksesi sitä.",
+ "placeholder": "Syötä salasanasi"
+ },
+ "tlsServername": {
+ "label": "TLS-palvelinnimi - valinnainen isäntänimi TLS-vahvistukseen, kun isäntä on IP-osoite",
+ "placeholder": "example.com"
+ },
+ "connectionHost": {
+ "label": "Sähköpostiyhteyden isäntä - HELO/EHLO-tervehdyksessä käytettävä isäntänimi",
+ "placeholder": "localhost"
+ },
+ "secure": {
+ "label": "Käytä SSL:ää (suositus): Salaa yhteys SSL/TLS:n avulla"
+ },
+ "pool": {
+ "label": "Ota yhteyspoolaus käyttöön: Käytä olemassa olevia yhteyksiä suorituskyvyn parantamiseksi"
+ },
+ "ignoreTLS": {
+ "label": "Poista STARTTLS käytöstä: Älä käytä TLS:ää, vaikka palvelin tukisi sitä"
+ },
+ "requireTLS": {
+ "label": "Pakota STARTTLS: Vaadi TLS-päivitys, epäonnistu jos ei tueta"
+ },
+ "rejectUnauthorized": {
+ "label": "Hylkää virheelliset varmenteet: Hylkää yhteydet itseallekirjoitetuilla tai ei-luotetuilla varmenteilla"
+ }
+ }
+ },
+ "demoMonitors": {
+ "title": "Demomonitorit",
+ "description": "Lisää esimerkkimonitoreja esittelytarkoituksiin."
+ },
+ "removeMonitors": {
+ "title": "Järjestelmän nollaus",
+ "description": "Poista kaikki monitorit järjestelmästäsi.",
+ "dialog": {
+ "title": "Poistetaanko kaikki monitorit?",
+ "description": "Tätä ei voi kumota."
+ }
+ },
+ "exportMonitors": {
+ "title": "Vie monitorit"
+ },
+ "importExportMonitors": {
+ "title": "Monitorien tuonti / vienti",
+ "description": "Tuo tai vie monitorien tiedot JSON-tiedostona varmuuskopiointia tai siirtoa varten."
+ },
+ "about": {
+ "title": "Tietoja",
+ "developedBy": "Kehittäjä: Bluewave Labs"
+ },
+ "validation": {
+ "errorMessage": "Korjaa seuraavat vahvistusvirheet:"
+ }
+ }
},
- "port": {
- "label": "",
- "namePlaceholder": "",
- "placeholder": ""
+ "statusPages": {
+ "deleteSuccess": "Tilasivu poistettu onnistuneesti",
+ "fallback": {
+ "title": "Tilasivulla voit:",
+ "checks": "Communicate system status to users and stakeholders,Display real-time uptime information publicly,Build trust with transparent service monitoring,Reduce support requests during incidents",
+ "actionButton": "Luo tilasivu!"
+ },
+ "monitorsList": {
+ "chartTypeHeatmap": "Lämpökartta",
+ "chartTypeHistogram": "Histogrammi",
+ "noData": "Tietoja ei saatavilla",
+ "infrastructure": {
+ "title": "Infrastruktuuri",
+ "cpu": "CPU",
+ "memory": "RAM",
+ "memoryText": "Muisti",
+ "disk": "Levy",
+ "usage": "Käyttö",
+ "used": "Käytetty",
+ "total": "Yhteensä"
+ },
+ "uptime": {
+ "title": "Käytettävyys",
+ "responseTime": "Vasteaika"
+ }
+ },
+ "statusBar": {
+ "allDown": "Kaikki järjestelmät ovat alhaalla",
+ "allUp": "Kaikki järjestelmät toiminnassa",
+ "degraded": "Joissakin järjestelmissä on ongelmia",
+ "unknown": "Järjestelmän tilaa ei voida määrittää"
+ },
+ "table": {
+ "headers": {
+ "name": "Tilasivun nimi",
+ "url": "Julkinen URL"
+ },
+ "published": "Julkaistu",
+ "unpublished": "Julkaisematon"
+ },
+ "title": "Tilasivut",
+ "details": {
+ "empty": {
+ "title": "Täällä ei ole vielä mitään",
+ "addMonitor": "Lisää monitori aloittaaksesi"
+ }
+ },
+ "form": {
+ "access": {
+ "title": "Käyttöoikeus",
+ "description": "Jos tilasivusi on valmis, voit merkitä sen julkaistuksi.",
+ "option": {
+ "published": {
+ "name": "Julkaistu ja julkisesti näkyvissä"
+ }
+ }
+ },
+ "basicInfo": {
+ "title": "Perustiedot",
+ "description": "Määritä yrityksen nimi ja aliverkkotunnus, johon tilasivusi osoittaa.",
+ "option": {
+ "name": {
+ "label": "Yrityksen nimi",
+ "placeholder": "Acme Inc."
+ },
+ "url": {
+ "label": "Tilasivusi osoite",
+ "placeholder": "my-status-page"
+ }
+ }
+ },
+ "monitors": {
+ "title": "Monitorit",
+ "description": "Valitse tilasivullasi näytettävät monitorit.",
+ "noMonitors": "Monitoreja ei valittu",
+ "option": {
+ "monitors": {
+ "label": "Valitse monitorit",
+ "placeholder": "Hae ja valitse monitorit..."
+ }
+ }
+ },
+ "timezone": {
+ "title": "Aikavyöhyke",
+ "description": "Valitse aikavyöhyke, jossa tilasivusi näytetään.",
+ "option": {
+ "timezone": {
+ "label": "Aikavyöhyke",
+ "placeholder": "Valitse aikavyöhyke..."
+ }
+ }
+ },
+ "appearance": {
+ "title": "Ulkoasu",
+ "description": "Määritä julkisen tilasivusi oletusilme.",
+ "option": {
+ "logo": {
+ "label": "Logo"
+ },
+ "color": {
+ "label": "Brändiväri"
+ }
+ }
+ },
+ "features": {
+ "title": "Ominaisuudet",
+ "description": "Määritä mitä tietoja tilasivullasi näytetään.",
+ "option": {
+ "showCharts": {
+ "label": "Näytä vasteaikakaaviot"
+ },
+ "showUptimePercentage": {
+ "label": "Näytä käytettävyysprosentti"
+ },
+ "showAdminLoginLink": {
+ "label": "Näytä ylläpitäjän kirjautumislinkki"
+ },
+ "showInfrastructure": {
+ "label": "Näytä infrastruktuurin mittarit"
+ }
+ }
+ }
+ }
},
- "game": {
- "label": "",
- "namePlaceholder": "",
- "placeholder": ""
+ "uptime": {
+ "filters": {
+ "search": {
+ "placeholder": "Hae monitoreja..."
+ }
+ },
+ "table": {
+ "headers": {
+ "responseTime": "Vasteaika"
+ }
+ },
+ "fallback": {
+ "actionButton": "Luo monitori!",
+ "checks": "Check if websites or servers are online & responsive,Alert teams about downtime or performance issues,Monitor HTTP endpoints, pings, containers & ports,Track historical uptime and reliability trends",
+ "title": "Käytettävyysmonitorilla voit:"
+ }
}
- },
- "uptimeAdvancedMatching": {
- "jsonPath": ""
- },
- "bytesPerSecond": "",
- "bytesReceived": "",
- "bytesSent": "",
- "chooseGame": "",
- "createMonitorPage": {
- "incidentConfigDescription": "",
- "incidentConfigStatusWindowLabel": "",
- "incidentConfigStatusWindowThresholdLabel": "",
- "incidentConfigTitle": "",
- "incidentConfigDescriptionV2": "",
- "incidentConfigStatusCheckNumber": "",
- "intervalTitle": "",
- "intervalDescription": ""
- },
- "dataRate": "",
- "dataReceived": "",
- "dataSent": "",
- "details": "",
- "drops": "",
- "errors": "",
- "errorsIn": "",
- "errorsOut": "",
- "gameServerMonitoring": "",
- "gameServerMonitoringDescription": "",
- "network": "",
- "networkDrops": "",
- "networkErrors": "",
- "networkInterface": "",
- "noNetworkStatsAvailable": "",
- "packetsPerSecond": "",
- "packetsReceived": "",
- "packetsReceivedRate": "",
- "packetsSent": "",
- "rate": "",
- "selectInterface": ""
+ }
}
diff --git a/client/src/locales/fr.json b/client/src/locales/fr.json
index 9e76440f0c..9b7ec03f98 100644
--- a/client/src/locales/fr.json
+++ b/client/src/locales/fr.json
@@ -1,1140 +1,1305 @@
{
- "submit": "Envoyer",
- "title": "Titre",
- "distributedStatusHeaderText": "Couverture en temps réel, sur des appareils en temps réel",
- "distributedStatusSubHeaderText": "Alimenté par des millions d'appareils à travers le monde, consultez les performances du système par région, pays ou ville",
- "settingsDisabled": "Désactivé",
- "settingsSuccessSaved": "Les paramètres ont bien été sauvegardés",
- "settingsFailedToSave": "Les paramètres n'ont pas pu être sauvegardés",
- "settingsStatsCleared": "Les statistiques ont été réinitialisées avec succès",
- "settingsFailedToClearStats": "Les statistiques n'ont pas pu être réinitialisées",
- "settingsMonitorsDeleted": "Tous les moniteurs ont bien été supprimés",
- "settingsFailedToDeleteMonitors": "La suppression de tous les moniteurs a échoué",
- "starPromptTitle": "Ajouter Checkmate aux favoris",
- "starPromptDescription": "Voir les dernières versions et aider la communauté à grandir sur Github",
- "https": "HTTPS",
- "http": "HTTP",
- "monitor": "Moniteur",
- "aboutus": "A propos de nous",
- "now": "Maintenant",
- "delete": "Supprimer",
- "configure": "Configurer",
- "responseTime": "Temps de réponse",
- "ms": "ms",
- "bar": "Graphique",
- "area": "Zone",
- "country": "PAYS",
- "city": "VILLE",
- "response": "Réponse",
- "monitorStatusUp": "Moniteur {name} ({url}) est désormais EN LIGNE et répond aux requêtes",
- "monitorStatusDown": "Moniteur {name} ({url}) est désormais HORS LIGNE et ne répond plus",
- "webhookSendSuccess": "La notification webhook a bien été envoyée",
- "webhookSendError": "Une erreur s'est produite lors de l'envoi de la notification webhook sur {platform}",
- "webhookUnsupportedPlatform": "La plateforme {platform} n'est pas supportée actuellement",
- "distributedRightCategoryTitle": "Moniteur",
- "distributedStatusServerMonitors": "Monitoring des serveurs",
- "distributedStatusServerMonitorsDescription": "Statut des moniteurs relatifs aux serveurs",
- "distributedUptimeCreateSelectURL": "Ici vous pouvez sélectionner l'URL de l'hôte et le type de moniteur",
- "distributedUptimeCreateChecks": "Vérifications à effectuer",
- "distributedUptimeCreateChecksDescription": "Vous pourrez ajouter ou supprimer des vérifications après l'ajout de votre site",
- "distributedUptimeCreateIncidentNotification": "Notifications d'incidents",
- "distributedUptimeCreateIncidentDescription": "Quand il y a un incident, notifier les utilisateurs",
- "distributedUptimeCreateAdvancedSettings": "Paramètres avancés",
- "distributedUptimeDetailsNoMonitorHistory": "Il n'y a pas encore d'historique de vérification pour ce moniteur",
- "distributedUptimeDetailsStatusHeaderUptime": "Temps en ligne :",
- "distributedUptimeDetailsStatusHeaderLastUpdate": "Dernière mise à jour",
- "notifications": {
- "enableNotifications": "Activer les notifications sur {{platform}}",
- "testNotification": "Notification de test",
- "addOrEditNotifications": "Ajouter ou éditer des notifications",
- "slack": {
- "label": "Slack",
- "description": "Pour activer les notifications Slack, créez une application Slack et activez les webhooks entrants. Ensuite, indiquer l'URL du webhook ici.",
- "webhookLabel": "URL du webhook",
- "webhookPlaceholder": "https://hooks.slack.com/services/...",
- "webhookRequired": "L'URL du webhook Slack est requise"
- },
- "discord": {
- "label": "Discord",
- "description": "Pour envoyer des données sur un canal Discord depuis Checkmate, utilisez l'intégration Webhook Discord.",
- "webhookLabel": "URL du webhook Discord",
- "webhookPlaceholder": "https://discord.com/api/webhooks/...",
- "webhookRequired": "L'URL du webhook Discord est requise"
+ "common": {
+ "auth": {
+ "roles": {
+ "admin": "Admin",
+ "demo": "Démo",
+ "superadmin": "Super admin",
+ "user": "Utilisateur"
+ }
},
- "telegram": {
- "label": "Telegram",
- "description": "Pour activer les notifications Telegram, créez un bot Telegram en utilisant BotFather, le robot officiel pour créer et gérer ses propres robots. Indiquez ensuite votre clé API et l'ID du chat ici.",
- "tokenLabel": "Token du robot",
- "tokenPlaceholder": "123456:ABC-DEF1234ghIkl-zyx57W2v1u123ew11",
- "chatIdLabel": "Votre Chat ID",
- "chatIdPlaceholder": "-1001234567890",
- "fieldsRequired": "Le token Telegram et l'ID du chat sont requis."
+ "alerts": {
+ "pageSpeedApiKey": {
+ "content": "Attention : vous n'avez pas encore ajouté de clé API Google PageSpeed. Rendez-vous dans Paramètres pour en ajouter une. Sans elle, le moniteur PageSpeed ne fonctionnera pas."
+ }
},
- "webhook": {
- "label": "Webhooks",
- "description": "Vous pouvez indiquer un webhook personnalisé pour recevoir des notifications lorsqu'un incident se produit.",
- "urlLabel": "URL du webhook",
- "urlPlaceholder": "https://votre-serveur.fr/webhook",
- "urlRequired": "L'URL du webhook est nécessaire"
+ "appName": "Checkmate",
+ "breadcrumbs": {
+ "details": "Détails",
+ "home": "Accueil"
},
- "testNotificationDevelop": "Notification de test 2",
- "integrationButton": "Intégration de notification",
- "testSuccess": "La notification de test a été envoyée avec succès !",
- "testFailed": "Échec de l'envoi de la notification de test",
- "unsupportedType": "Type de notification non supporté",
- "networkError": "Une erreur réseau s'est produite",
- "fallback": {
- "title": "canal de notification",
- "checks": [
- "Alertez les équipes en cas de temps d'arrêt ou de problèmes de performances",
- "Informez les ingénieurs lorsque des incidents se produisent",
- "Tenez les administrateurs informés des changements apportés au système"
- ],
- "actionButton": "Créez votre premier canal de notification !"
+ "buttons": {
+ "addMember": "Ajouter un membre",
+ "cancel": "Annuler",
+ "close": "Fermer",
+ "configure": "Configurer",
+ "confirm": "Confirmer",
+ "create": "Créer",
+ "delete": "Supprimer",
+ "generateToken": "Générer un jeton",
+ "incidents": "Incidents",
+ "inviteMember": "Inviter un membre",
+ "pause": "Pause",
+ "resume": "Reprendre",
+ "save": "Enregistrer",
+ "sendInvite": "Envoyer l'invitation",
+ "test": "Tester",
+ "testNotifications": "Tester les notifications",
+ "toggleTheme": "Afficher le mode clair & sombre",
+ "flushQueue": "Vider la file d'attente",
+ "notFound": "Aller au tableau de bord",
+ "resetPassword": "Réinitialiser le mot de passe",
+ "reset": "Réinitialiser",
+ "clear": "Effacer",
+ "addDemo": "Ajouter des moniteurs de démo",
+ "removeMonitors": "Supprimer les moniteurs",
+ "sendTestEmail": "Envoyer un email de test",
+ "exportToJSON": "Exporter en JSON",
+ "importFromJSON": "Importer depuis JSON",
+ "clearFilters": "Effacer les filtres",
+ "removeUser": "Supprimer l'utilisateur"
},
- "createButton": "Créer un canal de notification",
- "createTitle": "Canal de notification",
- "create": {
- "success": "La notification a été créée avec succès",
- "failed": "Une erreur s'est produite lors de la création de la notification"
+ "charts": {
+ "labels": {
+ "averageResponseTime": "Temps de réponse moyen",
+ "downtime": "Temps d'arrêt",
+ "high": "haut",
+ "low": "bas",
+ "uptime": "Disponibilité"
+ },
+ "histogram": {
+ "avg": "Moy : {{value}} ms",
+ "max": "Max : {{value}} ms"
+ }
},
- "fetch": {
- "success": "Les notifications ont été récupérées avec succès",
- "failed": "Une erreur s'est produite lors de la récupération des notifications"
+ "dialogs": {
+ "delete": {
+ "description": "Cette action est irréversible.",
+ "title": "Êtes-vous sûr de vouloir supprimer ceci ?"
+ }
},
- "delete": {
- "success": "Notification supprimée avec succès",
- "failed": "Une erreur s'est produite lors de la suppression de la notification"
+ "labels": {
+ "active": "Actif",
+ "paused": "en pause",
+ "na": "N/A",
+ "resolved": "Résolu",
+ "responseTime": "Temps de réponse"
},
- "edit": {
- "success": "Notification modifiée avec succès",
- "failed": "Une erreur s'est produite lors de la modification de la notification"
+ "form": {
+ "role": {
+ "option": {
+ "role": {
+ "label": "Rôles"
+ }
+ }
+ },
+ "name": {
+ "option": {
+ "firstName": {
+ "label": "Prénom",
+ "placeholder": "Jean"
+ },
+ "lastName": {
+ "label": "Nom",
+ "placeholder": "Dupont"
+ }
+ }
+ },
+ "email": {
+ "option": {
+ "email": {
+ "label": "Email",
+ "placeholder": "you@example.com"
+ }
+ }
+ }
},
- "test": {
- "success": "Notification de test envoyée avec succès",
- "failed": "Une erreur s'est produite lors de l'envoi de la notification de test"
+ "table": {
+ "empty": "Rien à afficher",
+ "headers": {
+ "actions": "Actions",
+ "dateTime": "Date et heure",
+ "message": "Message",
+ "monitor": "Moniteur",
+ "monitorId": "ID du moniteur",
+ "name": "Nom",
+ "status": "Statut",
+ "type": "Type",
+ "url": "URL",
+ "interval": "Intervalle",
+ "active": "Actif",
+ "responseTime": "Temps de réponse"
+ }
}
},
- "testLocale": "testLocale",
- "add": "Ajouter",
- "monitors": "moniteurs",
- "distributedUptimeStatusCreateStatusPage": "page de statut",
- "distributedUptimeStatusCreateStatusPageAccess": "Accès",
- "distributedUptimeStatusCreateStatusPageReady": "Si votre page de statut est prête, vous pouvez l'indiquer en \"Publiée\".",
- "distributedUptimeStatusBasicInfoHeader": "Informations de base",
- "distributedUptimeStatusBasicInfoDescription": "Définir le nom de la société et le sous domaine sur lequel votre page de statut pointe.",
- "distributedUptimeStatusLogoHeader": "Logo",
- "distributedUptimeStatusLogoDescription": "Ajoutez un logo pour votre page de statut",
- "distributedUptimeStatusLogoUploadButton": "Téléverser un logo",
- "distributedUptimeStatusStandardMonitorsHeader": "Moniteurs standards",
- "distributedUptimeStatusStandardMonitorsDescription": "Ajouter un moniteur standard à votre page de statut",
- "distributedUptimeStatusCreateYour": "Créer votre",
- "distributedUptimeStatusEditYour": "Editer votre",
- "distributedUptimeStatusPublishedLabel": "Publiée et visible publiquement",
- "distributedUptimeStatusCompanyNameLabel": "Nom de l'entreprise",
- "distributedUptimeStatusPageAddressLabel": "Adresse de votre page de statut",
- "distributedUptimeStatus30Days": "30 jours",
- "distributedUptimeStatus60Days": "60 jours",
- "distributedUptimeStatus90Days": "90 jours",
- "distributedUptimeStatusPageNotSetUp": "Aucune page de statut n'est mise en place.",
- "distributedUptimeStatusContactAdmin": "Veuillez contacter votre administrateur",
- "distributedUptimeStatusPageNotPublic": "Cette page de statut n'est pas publique.",
- "distributedUptimeStatusPageDeleteDialog": "Voulez-vous supprimer cette page de statut ?",
- "distributedUptimeStatusPageDeleteConfirm": "Oui, supprimer la page de statut",
- "distributedUptimeStatusPageDeleteDescription": "Supprimer votre page de statut est irréversible.",
- "distributedUptimeStatusDevices": "Équipements",
- "distributedUptimeStatusUpt": "UPT",
- "distributedUptimeStatusUptBurned": "",
- "distributedUptimeStatusUptLogo": "Logo Upt",
- "incidentsTableNoIncidents": "Aucun incident enregistrée",
- "incidentsTablePaginationLabel": "incidents",
- "incidentsTableMonitorName": "Nom du moniteur",
- "incidentsTableStatus": "Statut",
- "incidentsTableDateTime": "Date et heure",
- "incidentsTableStatusCode": "Code de statut",
- "incidentsTableMessage": "Message",
- "incidentsOptionsHeader": "Incidents pour :",
- "incidentsOptionsHeaderFilterBy": "Filtrer par :",
- "incidentsOptionsHeaderFilterAll": "Tout",
- "incidentsOptionsHeaderFilterDown": "Hors ligne",
- "incidentsOptionsHeaderFilterCannotResolve": "Impossible de résoudre",
- "incidentsOptionsHeaderShow": "Voir:",
- "incidentsOptionsHeaderLastHour": "Dernière heure",
- "incidentsOptionsHeaderLastDay": "Dernier jour",
- "incidentsOptionsHeaderLastWeek": "Dernière semaine",
- "incidentsOptionsPlaceholderAllServers": "Tous les serveurs",
- "infrastructureCreateYour": "Créer votre",
- "infrastructureCreateGeneralSettingsDescription": "Ici, vous pouvez sélectionner l'URL de l'hôte, ainsi que le nom familier et le secret d'autorisation pour vous connecter à l'agent sur le serveur.",
- "infrastructureServerRequirement": "Le serveur que vous surveillez doit exécuter le",
- "infrastructureCustomizeAlerts": "Personnaliser les alertes",
- "infrastructureAlertNotificationDescription": "Envoyer une notification aux utilisateurs lorsque le seuil dépasse un pourcentage spécifié.",
- "infrastructureCreateMonitor": "Créer un moniteur d'infrastructure",
- "infrastructureProtocol": "Protocole",
- "infrastructureServerUrlLabel": "URL du serveur",
- "infrastructureDisplayNameLabel": "Nom d'affichage",
- "infrastructureAuthorizationSecretLabel": "Secret d'autorisation",
- "gb": "GB",
- "mb": "MB",
- "mem": "Mém",
- "memoryUsage": "Utilisation de la mémoire",
- "cpu": "CPU",
- "cpuUsage": "Utilisation CPU",
- "cpuTemperature": "Température CPU",
- "diskUsage": "Utilisation du disque",
- "used": "Utilisé",
- "total": "Total",
- "cores": "Coeurs",
- "frequency": "Fréquence",
- "status": "Statut",
- "cpuPhysical": "CPU (Physique)",
- "cpuLogical": "CPU (Logique)",
- "cpuFrequency": "Fréquence CPU",
- "avgCpuTemperature": "Température moyenne du CPU",
- "memory": "Mémoire",
- "disk": "Disque",
- "uptime": "Temps en ligne",
- "os": "OS",
- "host": "Hôte",
- "actions": "Actions",
- "integrations": "Intégrations",
- "integrationsPrism": "Connecter Prism à votre service préféré.",
- "integrationsSlack": "Slack",
- "integrationsSlackInfo": "Connecter à Slack et voir les incidents dans un canal",
- "integrationsDiscord": "Discord",
- "integrationsDiscordInfo": "Connecter à Discord et voir les incidents dans un canal",
- "integrationsZapier": "Zapier",
- "integrationsZapierInfo": "Envoyer tous les incidents à Zapier",
- "commonSave": "Sauvegarder",
- "createYour": "Créez votre",
- "createMonitor": "Ajouter un moniteur",
- "pause": "Mettre en pause",
- "resume": "Reprendre",
- "editing": "Edition...",
- "url": "URL",
- "access": "Accès",
- "timezone": "Fuseau horaire",
- "features": "Fonctionnalités",
- "administrator": "Administrateur ?",
- "loginHere": "Connexion",
- "displayName": "Nom d'affichage",
- "urlMonitor": "URL à suivre",
- "portToMonitor": "Port du moniteur",
- "websiteMonitoring": "Monitoring d'un site internet",
- "websiteMonitoringDescription": "Utiliser HTTP(s) pour vérifier votre site ou votre API.",
- "pingMonitoring": "Monitoring par ping",
- "pingMonitoringDescription": "Vérifier si le serveur est disponible ou pas",
- "dockerContainerMonitoring": "Monitoring d'un container Docker",
- "dockerContainerMonitoringDescription": "Vérifier si votre container Docker fonctionne ou pas.",
- "portMonitoring": "Monitoring d'un port",
- "portMonitoringDescription": "Vérifier si votre port est ouvert ou non.",
- "createMaintenanceWindow": "Créer une fenêtre de maintenance",
- "createMaintenance": "Créer une maintenance",
- "editMaintenance": "Modifier la maintenance",
- "maintenanceWindowName": "Nom de la fenêtre de maintenance",
- "friendlyNameInput": "Nom",
- "friendlyNamePlaceholder": "Maintenance à __ : __ pendant ___ minutes",
- "maintenanceRepeat": "Répéter la maintenance",
- "maintenance": "maintenance",
- "duration": "Durée",
- "addMonitors": "Ajouter des moniteurs",
- "window": "fenêtre",
- "cancel": "Annuler",
- "message": "Message",
- "low": "bas",
- "high": "haut",
- "statusCode": "Code de statut",
- "date&Time": "Date et heure",
- "type": "Type",
- "statusPageName": "Nom de la page de statut",
- "publicURL": "URL publique",
- "repeat": "Répéter",
- "edit": "Modifier",
- "createA": "Créer un",
- "remove": "Supprimer",
- "maintenanceWindowDescription": "Vos pings ne seront pas envoyés pendant cette fenêtre de temps.",
- "startTime": "Date de démarrage",
- "timeZoneInfo": "Toutes les dates et heures sont dans le fuseau GMT+0",
- "monitorsToApply": "Moniteurs sur lesquels appliquer la fenêtre de maintenance",
- "nextWindow": "Prochaine fenêtre de maintenance",
- "notFoundButton": "Aller au tableau de bord principal",
- "pageSpeedConfigureSettingsDescription": "Vous pouvez sélectionner l'URL de hôte et le type de moniteur.",
- "monitorDisplayName": "Nom du moniteur",
- "whenNewIncident": "Lors d'un nouvel incident,",
- "notifySMS": "Notification par SMS (bientôt)",
- "notifyEmails": "Envoyer également une notification par email à plusieurs adresses (bientôt).",
- "seperateEmails": "Vous pouvez ajouter plusieurs adresses emails en les séparant par une virgule",
- "checkFrequency": "Vérifier la fréquence",
- "matchMethod": "Méthode de rapprochement",
- "expectedValue": "Valeur attendue",
- "deleteDialogTitle": "Voulez-vous vraiment supprimer ce moniteur ?",
- "deleteDialogDescription": "Une fois supprimé, le moniteur ne peut pas être récupéré.",
- "pageSpeedMonitor": "Moniteur PageSpeed",
- "shown": "Visibles",
- "ago": "depuis",
- "companyName": "Nom de la société",
- "pageSpeedDetailsPerformanceReport": "Les valeurs sont estimatives et peuvent varier.",
- "pageSpeedDetailsPerformanceReportCalculator": "Voir le calculateur",
- "checkingEvery": "Vérification tous les",
- "statusPageCreateSettings": "Si votre page de statut est prête, vous pouvez la rendre publique.",
- "basicInformation": "Informations de base",
- "statusPageCreateBasicInfoDescription": "Définir le nom de la société et le sous-domaine vers lequel pointe votre page de statut.",
- "statusPageCreateSelectTimeZoneDescription": "Sélectionnez le fuseau horaire qui sera utilisé pour votre page de statut",
- "statusPageCreateAppearanceDescription": "Définir le style par défaut de votre page de statut.",
- "statusPageCreateSettingsCheckboxLabel": "Publiée et visible au public",
- "statusPageCreateBasicInfoStatusPageAddress": "L'adresse de votre page de statut",
- "statusPageCreateTabsContent": "Serveurs de votre page de statut",
- "statusPageCreateTabsContentDescription": "Vous pouvez ajouter autant de moniteurs à votre page de statut que vous le souhaitez. Vous pouvez également les réordonner pour améliorer l'expérience utilisateur.",
- "statusPageCreateTabsContentFeaturesDescription": "Voir plus de détails sur la page de statut",
- "showCharts": "Voir les graphiques",
- "showUptimePercentage": "Voir le pourcentage de temps en ligne",
- "removeLogo": "Supprimer le logo",
- "statusPageStatus": "Aucune page de statut publique n'est déployée",
- "statusPageStatusContactAdmin": "Merci de contacter votre administrateur",
- "statusPageStatusNotPublic": "Cette page de statut n'est pas piblique",
- "statusPageStatusNoPage": "Il n'y a aucune page de statut ici",
- "statusPageStatusServiceStatus": "Statut des services",
- "deleteStatusPage": "Voulez-vous supprimer cette page de statut ?",
- "deleteStatusPageConfirm": "Oui, supprimer la page de statut",
- "deleteStatusPageDescription": "Une fois supprimée, votre page de statut ne pourra plus être récupérée.",
- "uptimeCreate": "La valeur attendue est utilisée pour comparer le résultat de la réponse et la correspondance détermine le statut du moniteur.",
- "uptimeCreateJsonPath": "Cette expression sera évaluée par rapport aux données JSON de la réponse et le résultat sera utilisé pour la comparaison avec la valeur attendue. Voir",
- "uptimeCreateJsonPathQuery": "pour la documentation sur le langage de requête.",
- "maintenanceTableActionMenuDialogTitle": "Voulez-vous vraiment supprimer cette fenêtre de maintenance ?",
- "infrastructureEditYour": "Modifier votre",
- "infrastructureEditMonitor": "Sauvegarder le moniteur d'infrastructure",
- "infrastructureMonitorCreated": "Le moniteur d'infrastructure a été créé avec succès !",
- "infrastructureMonitorUpdated": "Le moniteur d'infrastructure a été modifié avec succès !",
- "errorInvalidTypeId": "Le type de notification fourni est invalide",
- "errorInvalidFieldId": "Le champ ID fourni est invalide",
- "inviteNoTokenFound": "Aucun jeton d'invitation fourni",
- "pageSpeedWarning": "Attention : vous n'avez pas encore ajouté de clé API Google PageSpeed. Sans celle-ci, le moniteur PageSpeed ne fonctionnera pas.",
- "pageSpeedLearnMoreLink": "Cliquer ici",
- "pageSpeedAddApiKey": "pour ajouter votre clé API.",
- "update": "Mettre à jour",
- "invalidFileFormat": "Format de fichier non supporté !",
- "invalidFileSize": "Le fichier est trop volumineux !",
- "ClickUpload": "Cliquez pour téléverser",
- "DragandDrop": "glisser et déposer",
- "MaxSize": "Taille maximum",
- "SupportedFormats": "Formats supportés",
- "FirstName": "Prénom",
- "LastName": "Nom",
- "EmailDescriptionText": "Il s'agit de votre adresse email actuelle : elle ne peut pas être changée.",
- "YourPhoto": "Photo de profil",
- "PhotoDescriptionText": "La photo sera affichée sur votre page de profil.",
- "save": "Enregistrer",
- "DeleteDescriptionText": "Cela supprimera le compte et toutes les données associées du serveur. Cette opération est irréversible.",
- "DeleteAccountWarning": "Supprimer votre compte signifie que vous ne pourrez pas vous reconnecter et que toutes vos données seront supprimés. Ceci est irréversible.",
- "DeleteWarningTitle": "Vous supprimez vraiment ce compte ?",
- "bulkImport": {
- "title": "Import en masse",
- "selectFileTips": "Sélectionnez un fichier CSV pour l'upload",
- "selectFileDescription": "Vous pouvez télécharger notre modèle ou exemple.",
- "selectFile": "Sélectionner un fichier",
- "parsingFailed": "L'analyse du fichier a rencontré un problème",
- "uploadSuccess": "Moniteurs créés avec succès !",
- "validationFailed": "Echec de la validation",
- "noFileSelected": "Aucun fichier sélectionné",
- "fallbackPage": "Importer un fichier pour ajouter une liste de serveurs en masse",
- "invalidFileType": "Type de fichier invalide",
- "uploadFailed": "Le téléchargement a échoué"
- },
- "DeleteAccountTitle": "Supprimer le compte",
- "DeleteAccountButton": "Supprimer le compte",
- "publicLink": "Lien public",
- "maskedPageSpeedKeyPlaceholder": "*************************************",
- "reset": "Réinitialiser",
- "ignoreTLSError": "Ignorer les erreurs TLS/SSL",
- "tlsErrorIgnored": "Erreurs TLS/SSL ignorées",
- "ignoreTLSErrorDescription": "Ignorer les erreurs TLS/SSL et continuer à vérifier l'accessibilité du site web",
- "createNew": "Créer un nouveau",
- "greeting": {
- "prepend": "Salut !",
- "append": "L'après-midi est votre libre, rendons-le épique !",
- "overview": "Voici un aperçu de vos moniteurs {{type}}."
- },
- "roles": {
- "superAdmin": "Super admin",
- "admin": "Admin",
- "teamMember": "Membre de l'équipe",
- "demoUser": "Utilisateur de démonstration"
- },
- "teamPanel": {
- "teamMembers": "Membres de l'équipe",
- "filter": {
- "all": "Tous",
- "member": "Membre"
+ "components": {
+ "imageUpload": {
+ "clickToUpload": "Cliquer pour téléverser",
+ "dragAndDrop": "glisser et déposer",
+ "supportedFormats": "Formats supportés",
+ "maxSize": "Taille maximum",
+ "orDragAndDrop": "ou glisser et déposer",
+ "errors": {
+ "invalidFileSize": "Le fichier est trop volumineux !",
+ "invalidFileFormat": "Format de fichier non supporté !"
+ }
},
- "inviteTeamMember": "Inviter un membre de l'équipe",
- "inviteNewTeamMember": "Inviter un nouveau membre d'équipe",
- "inviteDescription": "Lorsque vous ajoutez un nouveau membre à l'équipe, il aura accès à tous les moniteurs.",
- "email": "Email",
- "selectRole": "Sélectionnez un rôle",
- "inviteLink": "Lien d'invitation",
- "cancel": "Annuler",
- "noMembers": "Il n'y a aucun membre d'équipe avec ce rôle",
- "getToken": "Récupérer un token",
- "emailToken": "Token de l'email",
- "table": {
- "name": "Nom",
- "email": "Email",
- "role": "Rôle",
- "created": "Créée"
+ "headerStatusPageControls": {
+ "publicLink": "Lien public"
},
- "addTeamMember": {
- "addMemberMenu": "",
- "title": "",
- "description": "",
- "addButton": ""
+ "headerTimeRange": {
+ "labels": {
+ "day": "Jour",
+ "month": "Mois",
+ "recent": "Récent",
+ "week": "Semaine"
+ },
+ "description": {
+ "recent": "Statistiques des 2 dernières heures.",
+ "day": "Statistiques des dernières 24 heures.",
+ "week": "Statistiques des 7 derniers jours.",
+ "month": "Statistiques des 30 derniers jours."
+ }
},
- "register": "",
- "registerToast": {
- "success": "",
- "dbUserExists": "",
- "unknownError": ""
+ "offlineBanner": {
+ "serverUnreachable": "Impossible de joindre le serveur",
+ "retry": "Réessayer",
+ "retrying": "Nouvelle tentative...",
+ "reconnected": "Connexion rétablie avec le serveur."
},
- "registerTeamMember": {
- "title": "",
- "auth": {
- "common": {
- "inputs": {
- "firstName": {
- "errors": {
- "empty": "",
- "pattern": ""
- }
- },
- "lastName": {
- "errors": {
- "empty": "",
- "pattern": ""
- }
+ "sidebar": {
+ "menu": {
+ "uptime": "Temps en ligne",
+ "pagespeed": "Vitesse",
+ "infrastructure": "Infrastructure",
+ "notifications": "Notifications",
+ "checks": "Vérifications",
+ "incidents": "Incidents",
+ "statusPages": "Pages de statut",
+ "maintenance": "Maintenance",
+ "logs": "Journaux",
+ "settings": "Paramètres"
+ },
+ "bottomMenu": {
+ "support": "Support",
+ "discussions": "Discussions",
+ "docs": "Documentation",
+ "changelog": "Journal des modifications"
+ },
+ "accountMenu": {
+ "profile": "Profil",
+ "password": "Mot de passe",
+ "team": "Équipe"
+ },
+ "starPrompt": {
+ "title": "Star Checkmate",
+ "description": "Consultez les dernières versions et aidez la communauté à grandir sur GitHub"
+ },
+ "authFooter": {
+ "navControls": "Contrôle",
+ "logOut": "Déconnexion",
+ "roles": {
+ "superAdmin": "Super admin",
+ "admin": "Admin",
+ "user": "Utilisateur",
+ "demoUser": "Utilisateur de démonstration"
+ }
+ }
+ },
+ "starPrompt": {
+ "title": "Star Checkmate",
+ "description": "Consultez les dernières versions et aidez la communauté à grandir sur GitHub"
+ }
+ },
+ "pages": {
+ "notFound": {
+ "title": "Oh non ! Vous avez fait tomber vos sushis !",
+ "subtitle": "Soit l'URL n'existe pas, soit vous n'y avez pas accès."
+ },
+ "account": {
+ "tabs": {
+ "profile": "Profil",
+ "password": "Mot de passe",
+ "team": "Équipe"
+ },
+ "form": {
+ "name": {
+ "title": "Nom",
+ "description": "Mettez à jour vos informations personnelles"
+ },
+ "photo": {
+ "title": "Photo de profil",
+ "description": "Téléversez une photo de profil"
+ },
+ "currentPassword": {
+ "title": "Mot de passe actuel",
+ "description": "Saisissez votre mot de passe actuel pour vérifier votre identité",
+ "option": {
+ "label": "Mot de passe actuel",
+ "placeholder": "Saisissez le mot de passe actuel"
+ }
+ },
+ "newPassword": {
+ "title": "Nouveau mot de passe",
+ "description": "Choisissez un mot de passe fort d'au moins 8 caractères",
+ "option": {
+ "newPassword": {
+ "label": "Nouveau mot de passe",
+ "placeholder": "Saisissez le nouveau mot de passe"
},
+ "confirm": {
+ "label": "Confirmer le mot de passe",
+ "placeholder": "Confirmez le nouveau mot de passe"
+ }
+ }
+ },
+ "deleteAccount": {
+ "title": "Supprimer le compte",
+ "description": "Cette action est permanente et irréversible"
+ }
+ },
+ "team": {
+ "filter": {
+ "placeholder": "Filtrer par rôle",
+ "all": "Tous",
+ "admin": "Admin",
+ "member": "Membre"
+ },
+ "table": {
+ "headers": {
+ "email": "Email",
+ "role": "Rôle",
+ "created": "Créée"
+ }
+ },
+ "addMember": {
+ "title": "Inscrire un nouveau membre",
+ "description": "Créez un nouveau compte utilisateur. Partagez les identifiants de manière sécurisée après la création."
+ },
+ "invite": {
+ "title": "Inviter un membre",
+ "description": "Envoyez une invitation à rejoindre votre équipe",
+ "email": {
+ "label": "Adresse email",
+ "placeholder": "Saisissez l'adresse email"
+ },
+ "role": {
+ "label": "Rôle",
+ "placeholder": "Sélectionnez un rôle"
+ },
+ "linkLabel": "Lien d'invitation"
+ }
+ }
+ },
+ "auth": {
+ "common": {
+ "passwordRules": {
+ "length": {
+ "beginning": "Doit contenir au moins",
+ "highlighted": "Longueur de 8 caractères"
+ },
+ "lowercase": {
+ "beginning": "Doit contenir au moins",
+ "highlighted": "un caractère miniscule"
+ },
+ "match": {
+ "beginning": "Confirmer le mot de passe et le mot de passe",
+ "highlighted": "doit valoir"
+ },
+ "number": {
+ "beginning": "Doit contenir au moins",
+ "highlighted": "un nombre"
+ },
+ "special": {
+ "beginning": "Doit contenir au moins",
+ "highlighted": "un caractère spécial"
+ },
+ "uppercase": {
+ "beginning": "Doit contenir au moins",
+ "highlighted": "un caractère majuscule"
+ }
+ },
+ "form": {
+ "option": {
"email": {
- "errors": {
- "empty": "",
- "invalid": ""
- }
+ "label": "Email",
+ "placeholder": "me@example.com"
},
- "role": {
- "errors": {
- "empty": ""
- }
+ "password": {
+ "label": "Mot de passe",
+ "placeholder": "********"
+ },
+ "confirmPassword": {
+ "label": "Confirmer le mot de passe"
}
}
}
+ },
+ "login": {
+ "title": "Bienvenue sur Checkmate !",
+ "subtitle": "Connectez-vous pour continuer",
+ "submit": "Connexion",
+ "links": {
+ "forgotPassword": {
+ "text": "Mot de passe oublié ?",
+ "linkText": "Réinitialiser le mot de passe"
+ },
+ "register": {
+ "text": "Vous n'avez pas de compte ?",
+ "linkText": "Inscrivez-vous ici"
+ }
+ }
+ },
+ "register": {
+ "title": "Bienvenue sur Checkmate !",
+ "subtitle": "Inscrivez-vous pour commencer",
+ "submit": "S'inscrire"
+ },
+ "forgotPassword": {
+ "title": "Mot de passe oublié ?",
+ "subtitle": "Pas de souci, nous vous enverrons les instructions de réinitialisation.",
+ "submit": "Demander la récupération",
+ "links": {
+ "login": {
+ "text": "Retour à la",
+ "linkText": "connexion"
+ }
+ }
+ },
+ "setNewPassword": {
+ "title": "Réinitialisez votre mot de passe",
+ "subtitle": "Votre nouveau mot de passe doit être différent des mots de passe utilisés précédemment."
}
},
- "role": "",
- "changeTeamPassword": {
- "changePasswordMenu": "",
- "title": "",
- "description": "",
- "success": ""
- }
- },
- "monitorState": {
- "paused": "Pause",
- "resumed": "Reprendre",
- "active": "Actif"
- },
- "menu": {
- "uptime": "Temps en ligne",
- "pagespeed": "Vitesse",
- "infrastructure": "Infrastructure",
- "incidents": "Incidents",
- "statusPages": "Pages de statut",
- "maintenance": "Maintenance",
- "integrations": "Intégrations",
- "settings": "Paramètres",
- "support": "Support",
- "discussions": "Discussions",
- "docs": "Documentation",
- "changelog": "Changelog",
- "profile": "Profil",
- "password": "Mot de passe",
- "team": "Équipe",
- "logOut": "Déconnexion",
- "notifications": "Notifications",
- "logs": "Journaux"
- },
- "settingsEmailUser": "Utilisateur SMTP - Utilisateur pour l'authentification, écrase l'adresse email si spécifiée",
- "state": "État",
- "statusBreadCrumbsStatusPages": "Pages de statut",
- "statusBreadCrumbsDetails": "Détails",
- "commonSaving": "Sauvegarde...",
- "navControls": "Contrôle",
- "incidentsPageTitle": "Incidents",
- "passwordPanel": {
- "passwordChangedSuccess": "Votre mot de passe a été modifié avec succès.",
- "passwordInputIncorrect": "La saisie de votre mot de passe est incorrecte.",
- "currentPassword": "Mot de passe actuel",
- "enterCurrentPassword": "Entrez votre mot de passe actuel",
- "newPassword": "Nouveau mot de passe",
- "enterNewPassword": "Entrez votre nouveau mot de passe",
- "confirmNewPassword": "Confirmer le nouveau mot de passe",
- "passwordRequirements": "Le nouveau mot de passe doit contenir au moins 8 caractères et au moins une lettre majuscule, une lettre minuscule, un chiffre et un caractère spécial.",
- "saving": "Sauvegarde..."
- },
- "emailSent": "Email envoyé avec succès",
- "failedToSendEmail": "Une erreur s'est produite lors de l'envoi de l'email",
- "settingsTestEmailSuccess": "Email de test envoyé avec succès",
- "settingsTestEmailFailed": "Une erreur s'est produite lors de l'envoi de l'email de test",
- "settingsTestEmailFailedWithReason": "Une erreur s'est produite lors de l'envoi de l'email de test : {{reason}}",
- "settingsTestEmailUnknownError": "Erreur inconnue",
- "statusMsg": {
- "paused": "Le moniteur est en pause.",
- "up": "Votre site est en ligne.",
- "down": "Votre site est hors-ligne.",
- "pending": "En attente..."
- },
- "uptimeGeneralInstructions": {
- "http": "Entrez l'URL ou l'IP du moniteur (par exemple https://exemple.fr ou 192.168.1.100) et ajoutez un nom familier qui apparaîtra sur le tableau de bord.",
- "ping": "Entrez l'adresse IP ou le nom d'hôte à tester (par exemple, 192.168.1.100 ou exemple.fr) et ajoutez un nom familier qui apparaîtra sur le tableau de bord.",
- "docker": "Entrer l'ID Docker du container. Les identifiants Docker doivent être les 64 caractères de l'ID Docker. Vous pouvez utiliser la commande docker inspect pour avoir l'ID complet.",
- "port": "Entrez l'URL ou l'adresse IP du serveur, le numéro de port et un nom d'affichage familier qui apparaîtra sur le tableau de bord.",
- "game": "",
- "https": ""
- },
- "common": {
- "appName": "Checkmate",
- "monitoringAgentName": "Capture",
- "buttons": {
- "toggleTheme": "Afficher le mode clair & sombre"
+ "checks": {
+ "selects": {
+ "monitor": {
+ "all": "Tous les moniteurs"
+ },
+ "status": {
+ "all": "Tous",
+ "down": "Hors ligne",
+ "up": "En ligne"
+ }
+ },
+ "table": {
+ "empty": "Aucune vérification en échec sur cette période",
+ "headers": {
+ "statusCode": "Code de statut",
+ "location": "Emplacement"
+ }
+ }
},
- "toasts": {
- "networkError": "Erreur de réseau",
- "checkConnection": "Merci de vérifier votre connexion",
- "unknownError": "Erreur inconnue"
- }
- },
- "auth": {
"common": {
- "navigation": {
- "continue": "Continuer",
- "back": "Retour"
- },
- "inputs": {
- "email": {
- "label": "Email",
- "placeholder": "jean.dupont@domaine.fr",
- "errors": {
- "empty": "Pour continuer, merci d'indiquer votre adresse email",
- "invalid": "Merci de vérifier la validité de l'adresse email saisie"
- }
+ "monitors": {
+ "actions": {
+ "configure": "Configurer",
+ "delete": "Supprimer",
+ "generateToken": "Générer un jeton",
+ "details": "Détails",
+ "incidents": "Incidents",
+ "inviteMember": "Inviter un membre",
+ "openSite": "Ouvrir le site",
+ "pause": "Pause",
+ "resume": "Reprendre"
+ },
+ "statBoxes": {
+ "activeFor": "Actif depuis",
+ "certificateExpiry": "Expiration du certificat",
+ "lastCheck": "Dernière vérification",
+ "lastResponseTime": "Dernier temps de réponse"
+ },
+ "status": {
+ "down": "hors ligne",
+ "breached": "seuil dépassé",
+ "initializing": "initialisation",
+ "maintenance": "maintenance",
+ "paused": "en pause",
+ "total": "total",
+ "up": "en ligne"
+ },
+ "monitorTypes": {
+ "optionDocker": "Docker",
+ "optionGame": "Jeu",
+ "optionHttp": "HTTP(S)",
+ "optionPing": "Ping",
+ "optionPort": "Port",
+ "optionPagespeed": "PageSpeed",
+ "optionHardware": "Infrastructure",
+ "optionGrpc": "gRPC",
+ "optionWebSocket": "WebSocket"
+ }
+ }
+ },
+ "createMonitor": {
+ "form": {
+ "advanced": {
+ "description": "Paramètres optionnels pour les cas d'utilisation avancés",
+ "option": {
+ "advancedMatching": {
+ "label": "Utiliser la correspondance avancée"
+ },
+ "expectedValue": {
+ "label": "Valeur attendue"
+ },
+ "jsonPath": {
+ "description": "Cette expression sera évaluée sur les données JSON de la réponse et le résultat sera utilisé pour la comparaison avec la valeur attendue. Consultez jmespath.org pour la documentation du langage de requête.",
+ "label": "Expression JSONPath"
+ },
+ "matchMethod": {
+ "label": "Méthode de correspondance",
+ "equal": "Égal",
+ "include": "Inclure",
+ "regex": "Regex"
+ }
+ },
+ "title": "Paramètres avancés"
},
- "password": {
- "label": "Mot de passe",
- "rules": {
- "length": {
- "beginning": "Doit contenir au moins",
- "highlighted": "Longueur de 8 caractères"
+ "frequency": {
+ "description": "À quelle fréquence souhaitez-vous vérifier le statut de ce moniteur ?",
+ "option": {
+ "frequency": {
+ "label": "Fréquence de vérification",
+ "value": {
+ "fifteenMinutes": "15 minutes",
+ "fifteenSeconds": "15 secondes",
+ "fiveMinutes": "5 minutes",
+ "fourMinutes": "4 minutes",
+ "oneMinute": "1 minute",
+ "tenMinutes": "10 minutes",
+ "thirtyMinutes": "30 minutes",
+ "thirtySeconds": "30 secondes",
+ "threeMinutes": "3 minutes",
+ "twoMinutes": "2 minutes"
+ }
+ }
+ },
+ "title": "Fréquence de vérification"
+ },
+ "general": {
+ "option": {
+ "container": {
+ "label": "Nom/ID du conteneur",
+ "placeholder": "my-app ou abcd1234"
+ },
+ "host": {
+ "label": "Hôte",
+ "placeholder": "192.168.1.100 ou example.com"
+ },
+ "name": {
+ "label": "Nom d'affichage",
+ "placeholder": "ex. Mon site web"
},
- "special": {
- "beginning": "Doit contenir au moins",
- "highlighted": "un caractère spécial"
+ "secret": {
+ "label": "Secret d'autorisation",
+ "placeholder": "Saisissez votre clé secrète"
},
- "number": {
- "beginning": "Doit contenir au moins",
- "highlighted": "un nombre"
+ "url": {
+ "label": "URL",
+ "placeholder": "https://www.google.com"
},
- "uppercase": {
- "beginning": "Doit contenir au moins",
- "highlighted": "un caractère majuscule"
+ "game": {
+ "label": "",
+ "placeholder": ""
},
- "lowercase": {
- "beginning": "Doit contenir au moins",
- "highlighted": "un caractère miniscule"
+ "port": {
+ "label": "Port à surveiller",
+ "placeholder": "80"
},
- "match": {
- "beginning": "Confirmer le mot de passe et le mot de passe",
- "highlighted": "doit valoir"
+ "grpcServiceName": {
+ "label": "Nom du service",
+ "placeholder": "ex. my.service.v1 (laisser vide pour la santé globale)"
+ },
+ "wsUrl": {
+ "label": "URL WebSocket",
+ "placeholder": "wss://example.com/socket"
}
},
- "errors": {
- "empty": "Merci d'entrer votre mot de passe",
- "length": "Le mot de passe doit faire 8 caractères minimum",
- "uppercase": "Le mot de passe doit contenir au minimum une lettre majuscule",
- "lowercase": "Le mot de passe doit contenir au minimum une lettre minuscule",
- "number": "Le mot de passe doit contenir au minimum un chiffre",
- "special": "Le mot de passe doit contenir au minimum un caractère spécial",
- "incorrect": "Le mot de passe fourni est erroné"
+ "title": "Paramètres généraux",
+ "description": {
+ "http": "Saisissez l'URL ou l'IP à surveiller (ex. https://example.com/ ou 192.168.1.100) et ajoutez un nom d'affichage clair visible sur le tableau de bord.",
+ "ping": "Entrez l'adresse IP ou le nom d'hôte à tester (par exemple, 192.168.1.100 ou exemple.fr) et ajoutez un nom familier qui apparaîtra sur le tableau de bord.",
+ "port": "Entrez l'URL ou l'adresse IP du serveur, le numéro de port et un nom d'affichage familier qui apparaîtra sur le tableau de bord.",
+ "docker": "Entrer l'ID Docker du container. Les identifiants Docker doivent être les 64 caractères de l'ID Docker. Vous pouvez utiliser la commande docker inspect pour avoir l'ID complet.",
+ "game": "",
+ "pagespeed": "Suivez les performances de chargement, les Core Web Vitals et les scores d'optimisation de votre site web.",
+ "grpc": "Saisissez le nom d'hôte et le port du serveur gRPC, spécifiez éventuellement un nom de service pour le bilan de santé, et ajoutez un nom d'affichage.",
+ "websocket": "Saisissez l'URL WebSocket à surveiller (ex. wss://example.com/socket) et ajoutez un nom d'affichage.",
+ "hardware": "Surveillez l'utilisation du CPU, de la mémoire, du disque et la température de votre infrastructure."
}
},
- "passwordConfirm": {
- "label": "Confirmer le mot de passe",
- "placeholder": "Entrez à nouveau le mot de passe pour confirmer",
- "errors": {
- "empty": "Merci d'entrer votre mot de passe à nouveau pour le confirmer (aide avec la typo)",
- "different": "Les mots de passe indiqués ne sont pas identiques, l'un d'entre eux est probablement mal écrit"
- }
+ "ignoreTls": {
+ "description": "Configurez la validation des certificats TLS/SSL pour les connexions HTTPS.",
+ "option": {
+ "tls": {
+ "label": "Ignorer les erreurs TLS/SSL"
+ }
+ },
+ "title": "Paramètres TLS/SSL"
},
- "firstName": {
- "label": "Prénom",
- "placeholder": "Jean",
- "errors": {
- "empty": "Merci d'entrer votre prénom",
- "length": "Le prénom doit être inférieur à 50 caractères",
- "pattern": "Le prénom ne peut contenir que des lettres, des espaces, des apostrophes ou des tirets"
+ "incidents": {
+ "description": "Une fenêtre glissante est utilisée pour déterminer quand un moniteur tombe en panne. Le statut d'un moniteur ne changera que lorsque le pourcentage de vérifications dans la fenêtre glissante atteindra la valeur spécifiée.",
+ "option": {
+ "checks": {
+ "label": "Nombre de vérifications dans la fenêtre glissante"
+ },
+ "percentage": {
+ "label": "Quel pourcentage de vérifications dans la fenêtre glissante doit échouer/réussir avant que le statut du moniteur ne change ?"
+ }
+ },
+ "title": "Incidents"
+ },
+ "notifications": {
+ "description": "Sélectionnez les canaux de notification que vous souhaitez utiliser",
+ "title": "Notifications"
+ },
+ "type": {
+ "description": "Sélectionnez le type de vérification à effectuer",
+ "optionDockerDescription": "Utilisez Docker pour surveiller si un conteneur est en cours d'exécution.",
+ "optionGameDescription": "Surveillez si un serveur de jeu spécifique est en ligne.",
+ "optionGrpcDescription": "Surveillez les services gRPC en utilisant le protocole standard de vérification de santé.",
+ "optionWebSocketDescription": "Surveillez les points de terminaison WebSocket pour la santé de connexion et le temps de réponse.",
+ "optionHttpDescription": "Utilisez HTTP(S) pour surveiller votre site web ou point de terminaison API.",
+ "optionPingDescription": "Utilisez le Ping ICMP pour surveiller si un serveur est en ligne.",
+ "optionPortDescription": "Surveillez si un port spécifique sur un serveur est ouvert.",
+ "title": "Type"
+ },
+ "thresholds": {
+ "title": "Seuils d'alerte",
+ "description": "Définissez les seuils auxquels les alertes doivent être déclenchées pour ce moniteur d'infrastructure.",
+ "option": {
+ "cpuThreshold": {
+ "label": "Seuil d'alerte CPU (%)"
+ },
+ "memoryThreshold": {
+ "label": "Seuil d'alerte mémoire (%)"
+ },
+ "diskThreshold": {
+ "label": "Seuil d'alerte disque (%)"
+ },
+ "tempThreshold": {
+ "label": "Seuil d'alerte température (°C)"
+ }
}
},
- "lastName": {
- "label": "Nom",
- "placeholder": "Dupont",
- "errors": {
- "empty": "Merci d'entrer votre nom",
- "length": "Le nom doit être inférieur à 50 caractères",
- "pattern": "Le nom ne peut contenir que des lettres, des espaces, des apostrophes ou des tirets"
+ "geoChecks": {
+ "title": "Vérifications géo-distribuées",
+ "description": "Exécutez des vérifications depuis plusieurs emplacements géographiques pour surveiller la disponibilité et les performances globales.",
+ "option": {
+ "enabled": {
+ "label": "Activer les vérifications géo-distribuées"
+ },
+ "locations": {
+ "label": "Emplacements",
+ "placeholder": "Sélectionner les emplacements",
+ "options": {
+ "EU": "Europe",
+ "NA": "Amérique du Nord",
+ "AS": "Asie",
+ "SA": "Amérique du Sud",
+ "AF": "Afrique",
+ "OC": "Océanie"
+ }
+ },
+ "interval": {
+ "label": "Intervalle de vérification",
+ "value": {
+ "fiveMinutes": "5 minutes",
+ "tenMinutes": "10 minutes",
+ "fifteenMinutes": "15 minutes",
+ "thirtyMinutes": "30 minutes"
+ }
+ }
}
- }
- },
- "errors": {
- "validation": "Une erreur s'est produite lors de la validation des données."
- },
- "fields": {
- "password": {
- "errors": {
- "incorrect": "Le mot de passe fourni est erroné"
+ },
+ "url": {
+ "title": "IP/URL du moniteur sur la page de statut",
+ "description": "Affichez l'adresse IP ou l'URL du moniteur sur la page de statut publique. Si désactivé, seul le nom du moniteur sera affiché pour protéger les informations sensibles.",
+ "option": {
+ "showURL": {
+ "label": "Afficher l'IP/URL sur la page de statut",
+ "enabled": "Activé",
+ "disabled": "Désactivé"
+ }
}
},
- "role": {
- "errors": {
- "min": "Au moins un rôle est requis"
+ "stats": {
+ "title": "Historique du moniteur",
+ "description": "Effacez tout l'historique de surveillance et les statistiques de votre équipe. Cette action est irréversible.",
+ "buttonText": "Effacer toutes les statistiques",
+ "dialog": {
+ "title": "Effacer tout l'historique de surveillance ?",
+ "description": "Ceci supprimera définitivement tout l'historique de surveillance, les statistiques et les données de vérification de votre équipe. Cette action est irréversible.",
+ "confirm": "Oui, tout effacer"
}
}
}
},
- "login": {
- "heading": "Connexion",
- "subheadings": {
- "stepOne": "Entrez votre adresse email",
- "stepTwo": "Entrez votre mot de passe"
+ "editUser": {
+ "form": {
+ "roles": {
+ "title": "Rôles",
+ "description": "Attribuez des rôles à l'utilisateur. Plusieurs rôles peuvent être sélectionnés."
+ }
},
- "links": {
- "forgotPassword": "Mot de passe oublié ?",
- "register": "Pas encore de compte ?",
- "forgotPasswordLink": "Réinitialiser le mot de passe",
- "registerLink": "Inscrivez vous ici"
+ "dialog": {
+ "removeUser": {
+ "title": "Supprimer l'utilisateur",
+ "content": "Êtes-vous sûr de vouloir supprimer {{name}} de votre équipe ? Cette action est irréversible."
+ }
+ }
+ },
+ "incidents": {
+ "dialog": {
+ "resolveIncident": {
+ "title": "Résoudre l'incident",
+ "option": {
+ "comment": {
+ "label": "Commentaire (optionnel)",
+ "placeholder": "Ajoutez un commentaire sur la résolution..."
+ }
+ }
+ },
+ "details": {
+ "analysis": "Analyse de l'incident",
+ "comment": "Commentaire :",
+ "detailsLabel": "Détails",
+ "downtime": "Temps d'arrêt :",
+ "message": "Message :",
+ "monitor": "Moniteur :",
+ "overview": "Aperçu",
+ "resolutionDetails": "Détails de la résolution",
+ "resolutionType": "Type :",
+ "resolutionTypes": {
+ "automatic": "Automatique",
+ "manual": "Manuelle"
+ },
+ "resolve": "Résoudre l'incident",
+ "resolvedAt": "Résolu le :",
+ "resolvedBy": "Résolu par :",
+ "startedAt": "Démarré le :",
+ "status": "Statut :",
+ "statusCode": "Code de statut :",
+ "timeline": "Chronologie",
+ "title": "Détails de l'incident",
+ "url": "URL :"
+ }
},
- "toasts": {
- "success": "Bon retour ! Vous êtes connecté avec succès.",
- "incorrectPassword": "Mot de passe incorrect"
+ "filters": {
+ "allMonitors": "Tous les moniteurs",
+ "monitor": "Moniteur",
+ "resolutionType": "Type de résolution",
+ "resolutionTypes": {
+ "manual": "Manuelle",
+ "automatic": "Automatique",
+ "all": "Tous"
+ }
},
- "errors": {
- "password": {
- "incorrect": "Le mot de passe fourni est erroné"
+ "summaryCard": {
+ "activeIncidents": {
+ "title": "Incidents actifs",
+ "active_zero": "Aucun incident actif",
+ "active_one": "{{count}} incident actif",
+ "active_other": "{{count}} incidents actifs"
+ },
+ "incidentStats": {
+ "avgResolutionTime": "Temps de résolution moyen",
+ "mostAffectedMonitor": "Moniteur le plus affecté",
+ "title": "Statistiques des incidents",
+ "totalIncidents": "Total des incidents"
+ },
+ "latestIncidents": {
+ "title": "Derniers incidents"
}
},
- "welcome": "Bon retour sur Checkmate !"
+ "table": {
+ "actions": {
+ "details": "Détails",
+ "goToMonitor": "Aller au moniteur",
+ "resolveManually": "Résoudre manuellement"
+ },
+ "activeIncidents": "Incidents actifs",
+ "headers": {
+ "endTime": "Heure de fin",
+ "resolutionType": "Type de résolution",
+ "startTime": "Date de démarrage",
+ "statusCode": "Code de statut"
+ },
+ "resolvedIncidents": "Incidents résolus",
+ "status": {
+ "active": "Actif",
+ "resolved": "Résolu"
+ }
+ }
},
- "registration": {
- "heading": {
- "superAdmin": "Créer un super admin",
- "user": "Inscription"
- },
- "subheadings": {
- "stepOne": "Entrez votre informations personnelles",
- "stepTwo": "Entrez votre adresse email",
- "stepThree": "Créez votre mot de passe"
+ "infrastructure": {
+ "charts": {
+ "labels": {
+ "cpu": "Utilisation CPU",
+ "disk": "Utilisation disque",
+ "memory": "Utilisation mémoire",
+ "netBytesRecv": "{{name}} - Octets reçus",
+ "netBytesSent": "{{name}} - Octets envoyés",
+ "temp": "Temp."
+ }
},
- "description": {
- "superAdmin": "Créer le compte \"SuperAdmin\" pour commencer",
- "user": "inscription comme utilisateur et demander à l'administrateur principal l'accès aux moniteurs"
+ "gauges": {
+ "cpu": {
+ "lowerLabel": "Fréquence max.",
+ "title": "Utilisation CPU",
+ "upperLabel": "Fréquence actuelle"
+ },
+ "disk": {
+ "lowerLabel": "Libre",
+ "title": "Utilisation disque {{idx}}",
+ "upperLabel": "Utilisé"
+ },
+ "memory": {
+ "lowerLabel": "Libre",
+ "title": "Utilisation mémoire",
+ "upperLabel": "Utilisé"
+ }
},
- "gettingStartedButton": {
- "superAdmin": "Créer un compte super admin",
- "user": "Inscription comme utilisateur normal"
+ "statBoxes": {
+ "avgCpuTemperature": "Température moyenne du CPU",
+ "cpuFrequency": "Fréquence CPU",
+ "cpuLogical": "CPU (Logique)",
+ "cpuPhysical": "CPU (Physique)",
+ "disk": "Disque",
+ "memory": "Mémoire",
+ "os": "OS"
},
- "termsAndPolicies": "En créant un compte, vous comprenez et acceptez les Conditions d'Utilisation et la Politique de Confidentialité.",
- "links": {
- "login": "Déjà inscrit ? Connexion"
+ "table": {
+ "headers": {
+ "cpu": "CPU",
+ "disk": "Disque",
+ "memory": "Mémoire"
+ }
},
- "toasts": {
- "success": "Bienvenue ! Votre compte a été créé avec succès."
+ "tabs": {
+ "labels": {
+ "network": "",
+ "overview": "Aperçu"
+ }
},
- "welcome": "Bienvenue sur Checkmate !"
+ "fallback": {
+ "actionButton": "Créer un moniteur !",
+ "checks": "Track the performance of your servers,Identify bottlenecks and optimize usage,Ensure reliability with real-time monitoring",
+ "title": "Un moniteur d'infrastructure sert à :"
+ }
},
- "forgotPassword": {
- "heading": "Mot de passe oublié ?",
- "subheadings": {
- "stepOne": "Pas d'inquiétude, nous allons vous envoyer des informations pour réinitialiser votre mot de passe.",
- "stepTwo": "Nous avons envoyer un lien de réinitialisation du mot de passe à l'email ",
- "stepThree": "Votre nouveau mot de passe doit être différent des précédents.",
- "stepFour": "Votre mot de passe a été réinitialisé avec succès. Cliquez ci-dessous pour vous connecter."
+ "logs": {
+ "tabs": {
+ "diagnostics": "Diagnostic",
+ "logs": "Journaux des serveurs",
+ "queue": "File d'attente des tâches"
},
- "buttons": {
- "openEmail": "Ouvrir votre application email",
- "resetPassword": "Réinitialiser le mot de passe"
+ "logLevelSelect": {
+ "label": "Niveau de log"
},
- "imageAlts": {
- "passwordKey": "Icône du mot de passe",
- "email": "Icône de l'email",
- "lock": "Icône de verrouillage",
- "passwordConfirm": "Icône de confirmation du mot de passe"
+ "jobQueue": "File d'attente des tâches",
+ "failedJobs": "Tâches échouées",
+ "noLogs": "Aucun log trouvé",
+ "metrics": {
+ "jobs": "Tâches",
+ "activeJobs": "Tâches actives",
+ "failingJobs": "Tâches en échec",
+ "totalRuns": "Exécutions totales",
+ "totalFailures": "Échecs totaux"
},
- "links": {
- "login": "Retourner à la page de connexion",
- "resend": "Vous n'avez pas reçu l'email ? Cliquez ici pour le renvoyer"
+ "diagnostics": {
+ "stats": {
+ "eventLoopDelay": "Délai de boucle d'événements",
+ "uptime": "Temps de fonctionnement",
+ "usedHeapSize": "Taille du tas utilisée",
+ "totalHeapSize": "Taille totale du tas",
+ "osMemoryLimit": "Limite mémoire de l'OS"
+ },
+ "gauges": {
+ "heapAllocation": "Allocation du tas",
+ "heapUsage": "Utilisation du tas",
+ "heapUtilization": "Utilisation du tas",
+ "instantCpuUsage": "Utilisation CPU instantanée",
+ "availableMemoryPercentage": "% de mémoire disponible",
+ "allocatedPercentage": "% alloué",
+ "usedSPercentage": "% de 1s utilisé par le CPU",
+ "total": "Total",
+ "used": "Utilisé"
+ }
},
- "toasts": {
- "sent": "Instructions envoyées sur l'adresse email .",
- "emailNotFound": "L'email n'a pas été trouvé.",
- "redirect": "Redirection dans ...",
- "success": "Votre mot de passe",
- "error": "Une erreur s'est produite lors de la réinitialisation du mot de passe. Réessayez ultérieurement ou contactez le support."
+ "table": {
+ "headers": {
+ "timestamp": "Horodatage",
+ "level": "Niveau",
+ "service": "Service",
+ "method": "Méthode",
+ "monitorId": "ID du moniteur",
+ "runCount": "Nombre d'exécutions",
+ "failCount": "Nombre d'échecs",
+ "lastRunAt": "Dernière exécution",
+ "lockedAt": "Verrouillé le",
+ "lastFinishedAt": "Dernière fin",
+ "lastRunTook": "Durée dernière exécution",
+ "lastFailedAt": "Dernier échec",
+ "failReason": "Raison de l'échec"
+ }
}
- }
- },
- "errorPages": {
- "serverUnreachable": {
- "toasts": {
- "reconnected": "Connexion rétablie avec le serveur.",
- "stillUnreachable": "Le serveur est toujours inaccessible. Réessayez ultérieurement."
+ },
+ "maintenanceWindow": {
+ "fallback": {
+ "actionButton": "Créer une fenêtre de maintenance !",
+ "checks": "Mark your maintenance periods,Eliminate any misunderstandings,Stop sending alerts in maintenance windows",
+ "title": "Une fenêtre de maintenance sert à :"
+ },
+ "table": {
+ "headers": {
+ "nextWindow": "Prochaine fenêtre de maintenance",
+ "repeat": "Répéter"
+ }
},
- "alertBox": "Erreur de connexion au serveur",
- "description": "Nous ne parvenons pas à nous connecter au serveur. Veuillez vérifier votre connexion Internet ou vérifier votre configuration de déploiement si le problème persiste.",
- "retryButton": {
- "default": "Réessayer la connexion",
- "processing": "Connexion..."
+ "form": {
+ "general": {
+ "title": "Paramètres généraux",
+ "description": "Définissez un nom et une option de répétition pour votre fenêtre de maintenance.",
+ "option": {
+ "name": {
+ "label": "Nom",
+ "placeholder": "ex. Maintenance hebdomadaire"
+ },
+ "repeat": {
+ "label": "Répéter"
+ }
+ }
+ },
+ "startDate": {
+ "title": "Date de début",
+ "description": "Sélectionnez la date de début de votre fenêtre de maintenance.",
+ "option": {
+ "startDate": {
+ "label": "Date de début"
+ }
+ }
+ },
+ "startTime": {
+ "title": "Heure de début",
+ "description": "Définissez l'heure de début et la durée de votre fenêtre de maintenance. Toutes les valeurs sont en UTC",
+ "option": {
+ "duration": {
+ "label": "Durée"
+ },
+ "startTime": {
+ "label": "Heure de début"
+ }
+ },
+ "monitors": {
+ "title": "Moniteurs",
+ "description": "Moniteurs auxquels la fenêtre de maintenance doit s'appliquer",
+ "option": {
+ "addMonitors": {
+ "label": "Ajouter des moniteurs"
+ }
+ }
+ }
+ }
}
- }
- },
- "createNotifications": {
- "title": "Créer un canal de notification",
- "nameSettings": {
- "title": "Nom",
- "description": "Une description pour votre intégration.",
- "nameLabel": "Nom",
- "namePlaceholder": "e.g. notifications Slack"
- },
- "typeSettings": {
- "title": "Type",
- "description": "Sélectionnez le type de canal de notification que vous souhaitez créer.",
- "typeLabel": "Type"
- },
- "emailSettings": {
- "title": "Email",
- "description": "Adresse email du destinataire",
- "emailLabel": "Adresse email",
- "emailPlaceholder": "e.g. jean@exemple.fr"
- },
- "slackSettings": {
- "title": "Slack",
- "description": "Configurez votre webhook Slack ici",
- "webhookLabel": "URL du webhook Slack",
- "webhookPlaceholder": "https://hooks.slack.com/services/..."
- },
- "pagerdutySettings": {
- "title": "PagerDuty",
- "description": "Configurez l'intégration PagerDuty ici",
- "integrationKeyLabel": "Clé d'intégration",
- "integrationKeyPlaceholder": "1234567890"
- },
- "discordSettings": {
- "title": "Discord",
- "description": "Configurez votre webhook Discord ici",
- "webhookLabel": "URL du webhook Discord",
- "webhookPlaceholder": "https://your-server.com/webhook"
- },
- "webhookSettings": {
- "title": "Webhook",
- "description": "Configurez votre webhook ici",
- "webhookLabel": "URL du webhook",
- "webhookPlaceholder": "https://your-server.com/webhook"
- },
- "testNotification": "Notification de test",
- "dialogDeleteTitle": "Voulez-vous vraiment supprimer cette notification ?",
- "dialogDeleteConfirm": "Supprimer"
- },
- "notificationConfig": {
- "title": "Notifications",
- "description": "Sélectionnez les canaux de notification que vous souhaitez utiliser"
- },
- "monitorStatus": {
- "checkingEvery": "Vérifier toutes les {{interval}}",
- "withCaptureAgent": "avec l'agent Capture {{version}}",
- "up": "en ligne",
- "down": "hors ligne",
- "paused": "en pause"
- },
- "advancedMatching": "Filtrage avancé",
- "sendTestNotifications": "Envoyer une notification de test",
- "selectAll": "Sélectionner tout",
- "showAdminLoginLink": "Voir le lien \"Administrateur ? Connectez-vous ici\" sur la page de statut",
- "logsPage": {
- "title": "Journaux",
- "description": "Journaux systèmes - 1000 dernières lignes",
- "tabs": {
- "queue": "File d'attente des tâches",
- "logs": "Journaux des serveurs",
- "diagnostics": "Diagnostic"
- },
- "toast": {
- "fetchLogsSuccess": "Journaux récupérés avec succès"
},
- "logLevelSelect": {
- "title": "Niveau de journalisation",
- "values": {
- "all": "Tout",
- "info": "Info",
- "warn": "Attention",
- "error": "Erreur",
- "debug": "Debug"
+ "notifications": {
+ "fallback": {
+ "actionButton": "Créer un canal",
+ "checks": "Alert teams about downtime or performance issues,Let engineers know when incidents happen,Keep administrators informed of system changes",
+ "title": "Les canaux de notification servent à :"
+ },
+ "form": {
+ "accessToken": {
+ "optionAccessToken": "Jeton d'accès",
+ "placeholder": "syt_YWxleF9ob2xsaWRheQ_VmtScmV0U2VjcmV0S2V5_abc123"
+ },
+ "address": {
+ "description": "L'adresse où les notifications seront envoyées.",
+ "optionAddress": "Adresse",
+ "placeholderEmail": "example@example.com",
+ "placeholderWebhook": "https://your-server.com/webhook",
+ "title": "Adresse"
+ },
+ "homeServer": {
+ "optionHomeServer": "Serveur d'accueil",
+ "placeholder": "example.com"
+ },
+ "matrix": {
+ "description": "Configurez la connexion de votre serveur Matrix pour les notifications.",
+ "title": "Configuration Matrix"
+ },
+ "notificationName": {
+ "description": "Un nom descriptif pour le canal de notification",
+ "optionName": "Nom du canal",
+ "placeholder": "ex. Alertes de production",
+ "title": "Nom du canal"
+ },
+ "pagerDuty": {
+ "description": "Votre clé d'intégration PagerDuty pour recevoir les alertes.",
+ "optionIntegrationKey": "Clé d'intégration",
+ "placeholder": "a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6",
+ "title": "Clé d'intégration"
+ },
+ "roomId": {
+ "optionRoomId": "ID de la salle",
+ "placeholder": "!abcdefg:matrix.org"
+ },
+ "type": {
+ "description": "Sélectionnez le type de canal de notification à créer.",
+ "optionType": "Type",
+ "title": "Type de canal"
+ },
+ "telegram": {
+ "title": "Configuration Telegram",
+ "description": "Pour activer les notifications Telegram, créez un bot Telegram en utilisant BotFather, le robot officiel pour créer et gérer ses propres robots. Indiquez ensuite votre clé API et l'ID du chat ici.",
+ "optionBotToken": "Jeton du bot",
+ "placeholderBotToken": "123456789:ABCdefGhIJKlmNoPQRsTUVwxyZ",
+ "optionChatId": "ID du chat",
+ "placeholderChatId": "-1001234567890"
+ }
+ },
+ "table": {
+ "headers": {
+ "destination": "Destination"
+ }
}
- }
- },
- "queuePage": {
- "title": "File d'attente",
- "refreshButton": "Rafraîchir",
- "flushButton": "Vider la file d'attente",
- "jobTable": {
- "title": "Tâches actuellement dans la file d'attente",
- "idHeader": "ID du moniteur",
- "urlHeader": "URL",
- "typeHeader": "Type",
- "activeHeader": "Actif",
- "lockedAtHeader": "Verrouillé le",
- "runCountHeader": "Nombre de tentatives",
- "failCountHeader": "Nombre d'échecs",
- "lastRunHeader": "Dernière tentative le",
- "lastFinishedAtHeader": "Dernière finalisation à",
- "lastRunTookHeader": "Dernière exécution effectuée",
- "intervalHeader": ""
- },
- "metricsTable": {
- "title": "Métriques des files",
- "metricHeader": "Métrique",
- "valueHeader": "Valeur"
- },
- "failedJobTable": {
- "title": "Tâches en échec",
- "monitorIdHeader": "ID du moniteur",
- "monitorUrlHeader": "URL du moniteur",
- "failCountHeader": "Nombre de tentatives échouées",
- "failedAtHeader": "Dernier échec à",
- "failReasonHeader": "Raison de l'échec"
- }
- },
- "export": {
- "title": "Export des moniteurs",
- "success": "Les moniteurs ont été exportés avec succès !",
- "failed": "Une erreur s'est produite lors de l'export des moniteurs"
- },
- "monitorActions": {
- "title": "Export/Import",
- "import": "Importer des moniteurs",
- "export": "Exporter des moniteurs",
- "deleteSuccess": "Le moniteur a été supprimé avec succès",
- "deleteFailed": "Une erreur s'est produite lors de la suppression du moniteur",
- "details": "Détails"
- },
- "settingsPage": {
- "aboutSettings": {
- "labelDevelopedBy": "Développé par Bluewave Labs",
- "labelVersion": "Version",
- "title": "A propos"
- },
- "demoMonitorsSettings": {
- "buttonAddMonitors": "Ajouter un moniteur de démonstration",
- "description": "Ajouter un moniteur à des fins de démonstration.",
- "title": "Moniteurs de démonstration"
},
- "emailSettings": {
- "buttonSendTestEmail": "Envoyer un mail de test",
- "description": "Configurez les paramètres emails pour le système. Il s'agit du système utilisé pour les notifications & alertes.",
- "descriptionTransport": "Ceci créé un transport SMTP pour NodeMailer",
- "labelAddress": "Adresse email - utilisée pour la connexion",
- "labelConnectionHost": "Hôte SMTP - Nom d'hôte à utiliser dans l'introduction HELO/EHLO",
- "labelHost": "Hôte SMTP - Nom d'hôte ou IP sur lequel se connecter",
- "labelIgnoreTLS": "Désactiver STARTTLS : ne pas utiliser TLS même si le serveur le supporte",
- "labelPassword": "Mot de passe SMTP - Mot de passe requis pour l'authentification",
- "labelPasswordSet": "Le mot de passe est renseigné. Réinitialisez le pour le changer.",
- "labelPool": "Activer le pool de connexion SMTP afin de réutiliser les connexions existantes pour améliorer la performance",
- "labelPort": "Port SMTP - Port auquel se connecter",
- "labelRejectUnauthorized": "Rejeter les certificats non valides : rejeter les connexions avec des certificats auto-signés ou non fiables",
- "labelRequireTLS": "Forcer STARTTLS : nécessite la mise à niveau TLS, échouer si ce n'est pas supporté",
- "labelSecure": "Utiliser le SSL (recommandé) : chiffrer la connexion SSL/TLS",
- "labelTLSServername": "Nom du serveur TLS - Nom d'hôte facultatif pour la validation TLS lorsque l'hôte est une adresse IP",
- "labelUser": "Utilisateur SMTP - Nom d'utilisateur pour l'authentification, remplace l'adresse email si spécifié",
- "linkTransport": "Voir les spécifications ici",
- "placeholderUser": "Laisser vide si non requis",
- "title": "Email",
- "toastEmailRequiredFieldsError": "L'adresse email, l'hôte, le port et le mot de passe sont obligatoires."
- },
- "pageSpeedSettings": {
- "description": "Entrez votre clé API Google PageSpeed pour activer la surveillance Google PageSpeed. Cliquez sur Réinitialiser pour mettre à jour la clé.",
- "labelApiKeySet": "La clé API est générée. Cliquez sur \"Réinitialiser\" pour la modifier.",
- "labelApiKey": "Clé API PageSpeed",
- "title": "Clé API Google PageSpeed"
- },
- "saveButtonLabel": "Sauvegarder",
- "statsSettings": {
- "clearAllStatsButton": "Supprimer toutes les statistiques",
- "clearAllStatsDescription": "Supprimer toutes les statistiques. Cette action est irréversible.",
- "clearAllStatsDialogConfirm": "Oui, supprimer toutes les statistiques",
- "clearAllStatsDialogDescription": "Une fois supprimés, l'historique et les statistiques du moniteur ne peuvent plus être récupérés.",
- "clearAllStatsDialogTitle": "Voulez-vous supprimer toutes les statistiques ?",
- "description": "Définissez la durée pendant laquelle vous souhaitez conserver les données historiques. Vous pouvez également effacer toutes les données existantes.",
- "labelTTL": "Le nombre de jours dont vous souhaitez garder l'historique.",
- "labelTTLOptional": "0 pour une durée infinie",
- "title": "Historique du moniteur"
- },
- "systemResetSettings": {
- "buttonRemoveAllMonitors": "Supprimer tous les moniteurs",
- "description": "Supprimer toutes les moniteurs du système.",
- "dialogConfirm": "Oui, supprimer tous les moniteurs",
- "dialogDescription": "Une fois supprimés, les moniteurs ne peuvent plus être récupérés.",
- "dialogTitle": "Voulez-vous supprimer tous les moniteurs ?",
- "title": "Réinitialisation du système"
- },
- "timezoneSettings": {
- "description": "Sélectionnez le fuseau horaire utilisé pour afficher les dates et les heures dans l'application.",
- "label": "Fuseau horaire d'affichage",
- "title": "Fuseau horaire d'affichage"
- },
- "title": "Paramètres",
- "uiSettings": {
- "description": "Changer entre le mode clair et sombre, ou changer le langage de l'interface utilisateur.",
- "labelLanguage": "Langage",
- "labelTheme": "Thème",
- "title": "Apparence"
- },
- "urlSettings": {
- "description": "Affichez l'adresse IP ou l'URL du moniteur sur la page de statut publique. Si cette option est désactivée, seul le nom du moniteur sera affiché afin de protéger les informations sensibles.",
- "label": "Afficher l'IP/URL sur la page de statut",
- "selectDisabled": "Désactivé",
- "selectEnabled": "Activé",
- "title": "IP/URL du moniteur sur la page de statut"
- },
- "globalThresholds": {
- "title": "Seuils globaux",
- "description": "Configurez des seuils globaux pour le CPU, la mémoire, le disque et la température. Si une valeur est fournie, elle sera automatiquement activée pour la surveillance."
- }
- },
- "statusPageCreate": {
- "buttonSave": "Sauvegarder"
- },
- "incidentsOptionsHeaderFilterResolved": "Résolu",
- "settingsSave": "Sauvegarder",
- "statusPageCreateAppearanceTitle": "Apparence",
- "confirmPassword": "Confirmer le mot de passe",
- "monitorHooks": {
- "failureAddDemoMonitors": "Une erreur s'est produite lors de l'ajout des moniteurs de démonstration",
- "successAddDemoMonitors": "Les moniteurs de démonstration ont bien été ajoutés"
- },
- "settingsAppearance": "Apparance",
- "settingsDisplayTimezone": "Fuseau horaire d'affichage",
- "settingsGeneralSettings": "Paramètres généraux",
- "incidentsOptionsHeaderTotalIncidents": "Nombre d'incidents",
- "statusPage": {
- "deleteSuccess": "La page de statut a été supprimée avec succès",
- "deleteFailed": "Une erreur s'est produite lors de l'ajout de la page de statut",
- "createSuccess": "La page de statut a été ajoutée avec succès",
- "updateSuccess": "La page de statut a été modifiée avec succès",
- "generalSettings": "Paramètres généraux",
- "contents": "Contenus",
- "fallback": {
- "checks": [
- "Surveillez et affichez l’état de santé de vos services en temps réel",
- "Suivez plusieurs services et partagez leur statut",
- "Tenez les utilisateurs informés des pannes et des performances"
- ],
- "title": "Une page de status est utilisée pour :",
- "actionButton": "Créer votre première page de status !"
- }
- },
- "testNotificationsDisabled": "Il n'y aucune notification paramétrée pour ce moniteur. Vous pouvez en ajouter une en cliquant sur le bouton 'Configurer'",
- "incidentsTableResolvedAt": "Résolu le",
- "incidentsTableActionResolve": "Résoudre",
- "checkHooks": {
- "failureResolveOne": "Une erreur s'est produite lors de la résolution de l'incident.",
- "failureResolveAll": "Une erreur s'est produite lors de la résolution des incidents.",
- "failureResolveMonitor": ""
- },
- "checkFormError": "Merci de vérifier les erreurs du formulaire",
- "diagnosticsPage": {
- "diagnosticDescription": "Diagnostic du système",
- "statsDescription": "Statistiques du système",
- "gauges": {
- "heapAllocationTitle": "Allocation du tas",
- "heapAllocationSubtitle": "% de mémoire disponible",
- "heapUsageTitle": "Utilisation du tas",
- "heapUsageSubtitle": "% de mémoire disponible",
- "heapUtilizationTitle": "Utilisation du tas",
- "heapUtilizationSubtitle": "% d'allocation",
- "instantCpuUsageTitle": "Utilisation instantanée du CPU",
- "instantCpuUsageSubtitle": "% de CPU utilisé"
- },
- "stats": {
- "eventLoopDelayTitle": "Délai de la boucle d'évènements",
- "uptimeTitle": "Temps en ligne",
- "usedHeapSizeTitle": "Taille du tas utilisé",
- "totalHeapSizeTitle": "Taille total du tas",
- "osMemoryLimitTitle": "Limite de mémoire de l'OS"
- }
- },
- "pageSpeedLighthouseAPI": "Utilisez l'API Lighthouse PageSpeed pour suivre votre site web",
- "time": {
- "threeMinutes": "3 minutes",
- "fiveMinutes": "5 minutes",
- "tenMinutes": "10 minutes",
- "twentyMinutes": "20 minutes",
- "oneHour": "1 heure",
- "oneDay": "1 jour",
- "oneWeek": "1 semaine",
- "fourMinutes": "4 minutes",
- "oneMinute": "1 minute",
- "twoMinutes": "2 minutes",
- "fifteenSeconds": "15 secondes",
- "thirtySeconds": "30 secondes"
- },
- "general": {
- "noOptionsFound": "Aucune {{unit}} trouvée"
- },
- "infrastructureMonitor": {
- "fallback": {
- "checks": [
- "Suivez les performances de vos serveurs",
- "Identifiez les points de blocage et optimisez l’utilisation",
- "Assurez la fiabilité grâce à la surveillance en temps réel"
- ],
- "title": "Une surveillance d'infrastructure est utilisé pour :",
- "actionButton": "Créer votre premier moniteur d'infrastructure !"
- }
- },
- "maintenanceWindow": {
- "fallback": {
- "checks": [
- "Marquez vos périodes de maintenance",
- "Éliminez tout malentendu",
- "Arrêtez d’envoyer des alertes pendant les fenêtres de maintenance"
- ],
- "title": "Une fenêtre de maintenance est utilisé pour :",
- "actionButton": "Créer votre première fenêtre de maintenance !"
- }
- },
- "pageSpeed": {
- "fallback": {
- "checks": [
- "Rapport sur l’expérience utilisateur d’une page",
- "Aider à analyser la vitesse de la page web",
- "Donner des suggestions sur la façon dont la page peut être améliorée"
- ],
- "title": "",
- "actionButton": ""
- }
- },
- "uptimeMonitor": {
- "fallback": {
- "checks": [
- "Vérifiez si les sites web ou serveurs sont en ligne et réactifs",
- "Alertez les équipes en cas de panne ou de problème de performance",
- "Surveillez les points de terminaison HTTP, les pings, les conteneurs et les ports",
- "Suivez l’historique de la disponibilité et les tendances de fiabilité"
- ],
- "title": "",
- "actionButton": ""
- }
- },
- "editUserPage": {
- "form": {
- "email": "Email",
- "firstName": "Prénom",
- "lastName": "Nom",
- "role": "Rôles",
- "save": "Enregistrer"
- },
- "table": {
- "actionHeader": "Action",
- "roleHeader": "Rôle"
- },
- "title": "Modifier l'utilisateur",
- "toast": {
- "successUserUpdate": "L'utilisateur à bien été modifié",
- "validationErrors": ""
- }
- },
- "incidentsPageActionResolveMonitor": "Résoudres les incidents de surveillance",
- "incidentsPageActionResolveAll": "Résoudre tous les incidents",
- "matchMethodOptions": {
- "equal": "Égal",
- "equalPlaceholder": "",
- "include": "Inclure",
- "includePlaceholder": "ok",
- "regex": "Regex",
- "regexPlaceholder": "",
- "text": ""
- },
- "monitorType": {
- "docker": {
- "label": "ID du conteneur",
- "namePlaceholder": "Mon conteneur",
- "placeholder": "abcd1234"
- },
- "http": {
- "label": "URL à surveiller",
- "namePlaceholder": "Google",
- "placeholder": "google.com"
+ "pageSpeed": {
+ "charts": {
+ "common": {
+ "cls": "Décalage cumulatif de mise en page (CLS)",
+ "fcp": "Premier affichage de contenu (FCP)",
+ "lcp": "Plus grand affichage de contenu (LCP)",
+ "si": "Indice de vitesse (SI)",
+ "tbt": "Temps de blocage total (TBT)"
+ },
+ "legend": {
+ "title": "Rapport PageSpeed",
+ "weight": "Poids"
+ },
+ "pie": {
+ "title": "Rapport de performance"
+ }
+ },
+ "table": {
+ "headers": {
+ "pageSpeedScore": "Score PageSpeed"
+ }
+ },
+ "fallback": {
+ "actionButton": "Créer un moniteur !",
+ "checks": "Report on the user experience of a page,Help analyze webpage speed,Give suggestions on how the page can be improved",
+ "title": "Un moniteur PageSpeed sert à :"
+ }
},
- "ping": {
- "label": "Adresse IP à surveiller",
- "namePlaceholder": "Google",
- "placeholder": "1.1.1.1"
+ "settings": {
+ "form": {
+ "timezone": {
+ "title": "Fuseau horaire d'affichage",
+ "description": "Sélectionnez le fuseau horaire utilisé pour afficher les dates et heures dans l'application.",
+ "option": {
+ "timezone": {
+ "label": "Fuseau horaire d'affichage"
+ }
+ }
+ },
+ "ui": {
+ "title": "Apparence",
+ "description": "Basculez entre le mode clair et sombre, changez la langue ou personnalisez le type de graphique.",
+ "option": {
+ "theme": {
+ "label": "Mode du thème",
+ "light": "Clair",
+ "dark": "Sombre"
+ },
+ "language": {
+ "label": "Langue"
+ },
+ "chartType": {
+ "label": "Type de graphique",
+ "histogram": "Histogramme",
+ "heatmap": "Carte thermique"
+ }
+ }
+ },
+ "pagespeed": {
+ "title": "Clé API Google PageSpeed",
+ "description": "Saisissez votre clé API Google PageSpeed pour activer la surveillance PageSpeed. Cliquez sur Réinitialiser pour mettre à jour la clé.",
+ "option": {
+ "apiKey": {
+ "label": "Clé API PageSpeed",
+ "labelSet": "La clé API est définie. Cliquez sur Réinitialiser pour la modifier.",
+ "placeholder": "Saisissez votre clé API Google PageSpeed"
+ }
+ }
+ },
+ "url": {
+ "title": "IP/URL du moniteur sur la page de statut",
+ "description": "Affichez l'adresse IP ou l'URL du moniteur sur la page de statut publique. Si désactivé, seul le nom du moniteur sera affiché pour protéger les informations sensibles.",
+ "option": {
+ "showURL": {
+ "label": "Afficher l'IP/URL sur la page de statut",
+ "enabled": "Activé",
+ "disabled": "Désactivé"
+ }
+ }
+ },
+ "stats": {
+ "title": "Historique du moniteur",
+ "description": "Effacez tout l'historique de surveillance et les statistiques de votre équipe. Cette action est irréversible.",
+ "option": {
+ "clear": {
+ "label": "Effacer toutes les statistiques. Cette action est irréversible."
+ }
+ },
+ "dialog": {
+ "title": "Effacer tout l'historique de surveillance ?",
+ "description": "Cette action est irréversible"
+ }
+ },
+ "retention": {
+ "title": "Rétention des vérifications",
+ "description": "Définissez la durée de conservation des données de vérification avant leur nettoyage automatique.",
+ "option": {
+ "days": {
+ "label": "Période de rétention (jours)",
+ "unlimited": "Illimité"
+ }
+ }
+ },
+ "thresholds": {
+ "title": "Seuils globaux",
+ "description": "Définissez les seuils globaux de CPU, mémoire, disque et température pour la surveillance d'infrastructure. Ils s'appliquent à tous les moniteurs d'infrastructure sauf remplacement.",
+ "option": {
+ "cpu": {
+ "label": "Seuil CPU (%)",
+ "placeholder": "1 - 100"
+ },
+ "memory": {
+ "label": "Seuil mémoire (%)",
+ "placeholder": "1 - 100"
+ },
+ "disk": {
+ "label": "Seuil disque (%)",
+ "placeholder": "1 - 100"
+ },
+ "temperature": {
+ "label": "Seuil température (°C)",
+ "placeholder": "1 - 150"
+ }
+ }
+ },
+ "email": {
+ "title": "Paramètres email",
+ "description": "Configurez les paramètres email de votre système. Ils sont utilisés pour envoyer des notifications et des alertes.",
+ "descriptionTransport": "Ceci créé un transport SMTP pour NodeMailer",
+ "descriptionTransportLink": "Voir les spécifications ici",
+ "option": {
+ "host": {
+ "label": "Hôte email - Nom d'hôte ou adresse IP de connexion",
+ "placeholder": "smtp.gmail.com"
+ },
+ "port": {
+ "label": "Port email - Port de connexion",
+ "placeholder": "587"
+ },
+ "address": {
+ "label": "Adresse email - Utilisée pour l'authentification",
+ "placeholder": "you@example.com"
+ },
+ "user": {
+ "label": "Utilisateur email - Nom d'utilisateur pour l'authentification, remplace l'adresse email si spécifié",
+ "placeholder": "Laisser vide si non requis"
+ },
+ "password": {
+ "label": "Mot de passe email - Mot de passe pour l'authentification",
+ "labelSet": "Le mot de passe est défini. Cliquez sur Réinitialiser pour le modifier.",
+ "placeholder": "Saisissez votre mot de passe"
+ },
+ "tlsServername": {
+ "label": "Nom de serveur TLS - Nom d'hôte optionnel pour la validation TLS quand l'hôte est une IP",
+ "placeholder": "example.com"
+ },
+ "connectionHost": {
+ "label": "Hôte de connexion email - Nom d'hôte à utiliser dans le message HELO/EHLO",
+ "placeholder": "localhost"
+ },
+ "secure": {
+ "label": "Utiliser SSL (recommandé) : chiffrer la connexion avec SSL/TLS"
+ },
+ "pool": {
+ "label": "Activer le pool de connexions : réutiliser les connexions existantes pour améliorer les performances"
+ },
+ "ignoreTLS": {
+ "label": "Désactiver STARTTLS : ne pas utiliser TLS même si le serveur le supporte"
+ },
+ "requireTLS": {
+ "label": "Forcer STARTTLS : exiger la mise à niveau TLS, échouer si non supporté"
+ },
+ "rejectUnauthorized": {
+ "label": "Rejeter les certificats invalides : refuser les connexions avec des certificats auto-signés ou non fiables"
+ }
+ }
+ },
+ "demoMonitors": {
+ "title": "Moniteurs de démonstration",
+ "description": "Ajoutez des moniteurs d'exemple à des fins de démonstration."
+ },
+ "removeMonitors": {
+ "title": "Réinitialisation du système",
+ "description": "Supprimez tous les moniteurs de votre système.",
+ "dialog": {
+ "title": "Supprimer tous les moniteurs ?",
+ "description": "Cette action est irréversible."
+ }
+ },
+ "exportMonitors": {
+ "title": "Exporter les moniteurs"
+ },
+ "importExportMonitors": {
+ "title": "Importer / Exporter les moniteurs",
+ "description": "Importez ou exportez vos données de moniteurs sous forme de fichier JSON pour sauvegarde ou transfert."
+ },
+ "about": {
+ "title": "À propos",
+ "developedBy": "Développé par Bluewave Labs"
+ },
+ "validation": {
+ "errorMessage": "Veuillez corriger les erreurs de validation suivantes :"
+ }
+ }
},
- "port": {
- "label": "URL à surveiller",
- "namePlaceholder": "",
- "placeholder": "localhost"
+ "statusPages": {
+ "deleteSuccess": "Page de statut supprimée avec succès",
+ "fallback": {
+ "title": "Une page de statut sert à :",
+ "checks": "Communicate system status to users and stakeholders,Display real-time uptime information publicly,Build trust with transparent service monitoring,Reduce support requests during incidents",
+ "actionButton": "Créer une page de statut !"
+ },
+ "monitorsList": {
+ "chartTypeHeatmap": "Carte thermique",
+ "chartTypeHistogram": "Histogramme",
+ "noData": "Aucune donnée disponible",
+ "infrastructure": {
+ "title": "Infrastructure",
+ "cpu": "CPU",
+ "memory": "RAM",
+ "memoryText": "Mémoire",
+ "disk": "Disque",
+ "usage": "Utilisation",
+ "used": "Utilisé",
+ "total": "Total"
+ },
+ "uptime": {
+ "title": "Disponibilité",
+ "responseTime": "Temps de réponse"
+ }
+ },
+ "statusBar": {
+ "allDown": "Tous les systèmes sont hors service",
+ "allUp": "Tous les systèmes sont opérationnels",
+ "degraded": "Certains systèmes rencontrent des problèmes",
+ "unknown": "Impossible de déterminer le statut du système"
+ },
+ "table": {
+ "headers": {
+ "name": "Nom de la page de statut",
+ "url": "URL publique"
+ },
+ "published": "Publiée",
+ "unpublished": "Non publiée"
+ },
+ "title": "Pages de statut",
+ "details": {
+ "empty": {
+ "title": "Il n'y a rien ici pour le moment",
+ "addMonitor": "Ajoutez un moniteur pour commencer"
+ }
+ },
+ "form": {
+ "access": {
+ "title": "Accès",
+ "description": "Si votre page de statut est prête, vous pouvez la marquer comme publiée.",
+ "option": {
+ "published": {
+ "name": "Publiée et visible par le public"
+ }
+ }
+ },
+ "basicInfo": {
+ "title": "Informations de base",
+ "description": "Définissez le nom de l'entreprise et le sous-domaine vers lequel pointe votre page de statut.",
+ "option": {
+ "name": {
+ "label": "Nom de l'entreprise",
+ "placeholder": "Acme Inc."
+ },
+ "url": {
+ "label": "Adresse de votre page de statut",
+ "placeholder": "ma-page-de-statut"
+ }
+ }
+ },
+ "monitors": {
+ "title": "Moniteurs",
+ "description": "Sélectionnez les moniteurs à afficher sur votre page de statut.",
+ "noMonitors": "Aucun moniteur sélectionné",
+ "option": {
+ "monitors": {
+ "label": "Sélectionner les moniteurs",
+ "placeholder": "Rechercher et sélectionner des moniteurs..."
+ }
+ }
+ },
+ "timezone": {
+ "title": "Fuseau horaire",
+ "description": "Sélectionnez le fuseau horaire d'affichage de votre page de statut.",
+ "option": {
+ "timezone": {
+ "label": "Fuseau horaire",
+ "placeholder": "Sélectionner un fuseau horaire..."
+ }
+ }
+ },
+ "appearance": {
+ "title": "Apparence",
+ "description": "Définissez l'apparence par défaut de votre page de statut publique.",
+ "option": {
+ "logo": {
+ "label": "Logo"
+ },
+ "color": {
+ "label": "Couleur de marque"
+ }
+ }
+ },
+ "features": {
+ "title": "Fonctionnalités",
+ "description": "Configurez les informations affichées sur votre page de statut.",
+ "option": {
+ "showCharts": {
+ "label": "Afficher les graphiques de temps de réponse"
+ },
+ "showUptimePercentage": {
+ "label": "Afficher le pourcentage de disponibilité"
+ },
+ "showAdminLoginLink": {
+ "label": "Afficher le lien de connexion administrateur"
+ },
+ "showInfrastructure": {
+ "label": "Afficher les métriques d'infrastructure"
+ }
+ }
+ }
+ }
},
- "game": {
- "label": "",
- "namePlaceholder": "",
- "placeholder": ""
- }
- },
- "uptimeAdvancedMatching": {
- "jsonPath": "Chemin JSON"
- },
- "bytesPerSecond": "",
- "bytesReceived": "",
- "bytesSent": "",
- "chooseGame": "",
- "createMonitorPage": {
- "incidentConfigDescription": "",
- "incidentConfigStatusWindowLabel": "",
- "incidentConfigStatusWindowThresholdLabel": "",
- "incidentConfigTitle": "",
- "incidentConfigDescriptionV2": "",
- "incidentConfigStatusCheckNumber": "",
- "intervalTitle": "",
- "intervalDescription": ""
- },
- "dataRate": "",
- "dataReceived": "",
- "dataSent": "",
- "details": "",
- "drops": "",
- "errors": "",
- "errorsIn": "",
- "errorsOut": "",
- "gameServerMonitoring": "",
- "gameServerMonitoringDescription": "",
- "network": "",
- "networkDrops": "",
- "networkErrors": "",
- "networkInterface": "",
- "noNetworkStatsAvailable": "",
- "packetsPerSecond": "",
- "packetsReceived": "",
- "packetsReceivedRate": "",
- "packetsSent": "",
- "rate": "",
- "selectInterface": "",
- "v1": {
- "infrastructure": {
- "disk_selection_title": "Sélection des disques",
- "disk_selection_info": "Aucun disque détecté pour le moment.",
- "disk_selection_description": "Sélectionnez les disques spécifiques que vous souhaitez surveiller."
+ "uptime": {
+ "filters": {
+ "search": {
+ "placeholder": "Rechercher des moniteurs..."
+ }
+ },
+ "table": {
+ "headers": {
+ "responseTime": "Temps de réponse"
+ }
+ },
+ "fallback": {
+ "actionButton": "Créer un moniteur !",
+ "checks": "Check if websites or servers are online & responsive,Alert teams about downtime or performance issues,Monitor HTTP endpoints, pings, containers & ports,Track historical uptime and reliability trends",
+ "title": "Un moniteur de disponibilité sert à :"
+ }
}
}
}
diff --git a/client/src/locales/ja.json b/client/src/locales/ja.json
index 68d94139fd..7dae6c9e0e 100644
--- a/client/src/locales/ja.json
+++ b/client/src/locales/ja.json
@@ -1,1119 +1,1305 @@
{
- "submit": "送信",
- "title": "タイトル",
- "distributedStatusHeaderText": "リアルタイム、実デバイス対応",
- "distributedStatusSubHeaderText": "世界中の数百万台のデバイスを活用し、グローバル地域、国、都市別にシステムパフォーマンスを表示",
- "settingsDisabled": "無効",
- "settingsSuccessSaved": "設定が正常に保存されました",
- "settingsFailedToSave": "設定の保存に失敗しました",
- "settingsStatsCleared": "統計が正常にクリアされました",
- "settingsFailedToClearStats": "統計のクリアに失敗しました",
- "settingsMonitorsDeleted": "すべてのモニターが正常に削除されました",
- "settingsFailedToDeleteMonitors": "すべてのモニターの削除に失敗しました",
- "starPromptTitle": "Checkmateにスター",
- "starPromptDescription": "GitHubで最新リリースを確認し、コミュニティの成長を支援",
- "https": "HTTPS",
- "http": "HTTP",
- "monitor": "モニター",
- "aboutus": "私たちについて",
- "now": "今",
- "delete": "削除",
- "configure": "設定",
- "responseTime": "レスポンス時間",
- "ms": "ミリ秒",
- "bar": "バー",
- "area": "エリア",
- "country": "国",
- "city": "都市",
- "response": "レスポンス",
- "monitorStatusUp": "モニター {name} ({url}) がアップして応答中です",
- "monitorStatusDown": "モニター {name} ({url}) がダウンして応答していません",
- "webhookSendSuccess": "Webhook通知が正常に送信されました",
- "webhookSendError": "{platform}へのWebhook通知送信エラー",
- "webhookUnsupportedPlatform": "サポートされていないプラットフォーム: {platform}",
- "distributedRightCategoryTitle": "モニター",
- "distributedStatusServerMonitors": "サーバーモニター",
- "distributedStatusServerMonitorsDescription": "関連サーバーのステータスを監視",
- "distributedUptimeCreateSelectURL": "ここでホストのURL、モニタータイプを選択できます。",
- "distributedUptimeCreateChecks": "実行するチェック",
- "distributedUptimeCreateChecksDescription": "サイト追加後はいつでもチェックを追加・削除できます。",
- "distributedUptimeCreateIncidentNotification": "インシデント通知",
- "distributedUptimeCreateIncidentDescription": "インシデント発生時、ユーザーに通知。",
- "distributedUptimeCreateAdvancedSettings": "詳細設定",
- "distributedUptimeDetailsNoMonitorHistory": "このモニターのチェック履歴はまだありません。",
- "distributedUptimeDetailsStatusHeaderUptime": "稼働時間:",
- "distributedUptimeDetailsStatusHeaderLastUpdate": "最終更新",
- "notifications": {
- "enableNotifications": "{{platform}}通知を有効化",
- "testNotification": "テスト通知",
- "addOrEditNotifications": "通知を追加または編集",
- "slack": {
- "label": "Slack",
- "description": "Slack通知を有効にするには、Slackアプリを作成し、incoming webhookを有効にします。その後、ここでWebhook URLを提供するだけです。",
- "webhookLabel": "Webhook URL",
- "webhookPlaceholder": "https://hooks.slack.com/services/...",
- "webhookRequired": "Slack Webhook URLが必要です"
- },
- "discord": {
- "label": "Discord",
- "description": "Webhookを使用してDiscord通知経由でCheckmateからDiscordチャンネルにデータを送信するには、DiscordのIncoming Webhook機能を使用できます。",
- "webhookLabel": "Discord Webhook URL",
- "webhookPlaceholder": "https://discord.com/api/webhooks/...",
- "webhookRequired": "Discord Webhook URLが必要です"
+ "common": {
+ "auth": {
+ "roles": {
+ "admin": "管理者",
+ "demo": "デモ",
+ "superadmin": "スーパー管理者",
+ "user": "ユーザー"
+ }
},
- "telegram": {
- "label": "Telegram",
- "description": "Telegram通知を有効にするには、Telegramボットを作成・管理するための公式ボットであるBotFatherを使用してTelegramボットを作成します。次に、APIトークンとチャットIDを取得してここに記入します。",
- "tokenLabel": "ボットトークン",
- "tokenPlaceholder": "123456:ABC-DEF1234ghIkl-zyx57W2v1u123ew11",
- "chatIdLabel": "チャットID",
- "chatIdPlaceholder": "-1001234567890",
- "fieldsRequired": "TelegramトークンとチャットIDが必要です"
+ "alerts": {
+ "pageSpeedApiKey": {
+ "content": "警告: Google PageSpeed APIキーがまだ追加されていません。設定からキーを追加してください。キーがないとPageSpeedモニターは機能しません。"
+ }
},
- "webhook": {
- "label": "Webhook",
- "description": "インシデント発生時に通知を受信するためのカスタムWebhookを設定できます。",
- "urlLabel": "Webhook URL",
- "urlPlaceholder": "https://your-server.com/webhook",
- "urlRequired": "Webhook URLが必要です"
+ "appName": "Checkmate",
+ "breadcrumbs": {
+ "details": "詳細",
+ "home": "ホーム"
},
- "testNotificationDevelop": "テスト通知2",
- "integrationButton": "通知統合",
- "testSuccess": "テスト通知が正常に送信されました!",
- "testFailed": "テスト通知の送信に失敗しました",
- "unsupportedType": "サポートされていない通知タイプ",
- "networkError": "ネットワークエラーが発生しました",
- "fallback": {
- "title": "通知チャンネル",
- "checks": [
- "ダウンタイムやパフォーマンス問題についてチームにアラート",
- "インシデント発生時にエンジニアに通知",
- "システム変更について管理者に情報提供"
- ],
- "actionButton": ""
+ "buttons": {
+ "addMember": "メンバーを追加",
+ "cancel": "キャンセル",
+ "close": "閉じる",
+ "configure": "設定",
+ "confirm": "確認",
+ "create": "作成",
+ "delete": "削除",
+ "generateToken": "トークンを生成",
+ "incidents": "インシデント",
+ "inviteMember": "メンバーを招待",
+ "pause": "一時停止",
+ "resume": "再開",
+ "save": "保存",
+ "sendInvite": "招待を送信",
+ "test": "テスト",
+ "testNotifications": "通知テスト",
+ "toggleTheme": "ライト&ダークを切り替え",
+ "flushQueue": "キューをフラッシュ",
+ "notFound": "メインダッシュボードへ移動",
+ "resetPassword": "パスワードをリセット",
+ "reset": "リセット",
+ "clear": "クリア",
+ "addDemo": "デモモニターを追加",
+ "removeMonitors": "モニターを削除",
+ "sendTestEmail": "テストメールを送信",
+ "exportToJSON": "JSONにエクスポート",
+ "importFromJSON": "JSONからインポート",
+ "clearFilters": "フィルターをクリア",
+ "removeUser": "ユーザーを削除"
},
- "createButton": "通知チャンネルを作成",
- "createTitle": "通知チャンネル",
- "create": {
- "success": "通知が正常に作成されました",
- "failed": "通知の作成に失敗しました"
+ "charts": {
+ "labels": {
+ "averageResponseTime": "平均応答時間",
+ "downtime": "ダウンタイム",
+ "high": "高",
+ "low": "低",
+ "uptime": "稼働時間"
+ },
+ "histogram": {
+ "avg": "平均: {{value}} ms",
+ "max": "最大: {{value}} ms"
+ }
},
- "fetch": {
- "success": "通知が正常に取得されました",
- "failed": "通知の取得に失敗しました"
+ "dialogs": {
+ "delete": {
+ "description": "この操作は元に戻せません。",
+ "title": "本当に削除しますか?"
+ }
},
- "delete": {
- "success": "通知が正常に削除されました",
- "failed": "通知の削除に失敗しました"
+ "labels": {
+ "active": "アクティブ",
+ "paused": "一時停止中",
+ "na": "N/A",
+ "resolved": "解決済み",
+ "responseTime": "応答時間"
},
- "edit": {
- "success": "通知が正常に更新されました",
- "failed": "通知の更新に失敗しました"
+ "form": {
+ "role": {
+ "option": {
+ "role": {
+ "label": "ロール"
+ }
+ }
+ },
+ "name": {
+ "option": {
+ "firstName": {
+ "label": "名前",
+ "placeholder": "太郎"
+ },
+ "lastName": {
+ "label": "姓",
+ "placeholder": "田中"
+ }
+ }
+ },
+ "email": {
+ "option": {
+ "email": {
+ "label": "メールアドレス",
+ "placeholder": "you@example.com"
+ }
+ }
+ }
},
- "test": {
- "success": "テスト通知が正常に送信されました",
- "failed": "テスト通知の送信に失敗しました"
+ "table": {
+ "empty": "データがありません",
+ "headers": {
+ "actions": "アクション",
+ "dateTime": "日時",
+ "message": "メッセージ",
+ "monitor": "モニター",
+ "monitorId": "モニターID",
+ "name": "名前",
+ "status": "ステータス",
+ "type": "タイプ",
+ "url": "URL",
+ "interval": "間隔",
+ "active": "アクティブ",
+ "responseTime": "応答時間"
+ }
}
},
- "testLocale": "テストロケール",
- "add": "追加",
- "monitors": "モニター",
- "distributedUptimeStatusCreateStatusPage": "ステータスページ",
- "distributedUptimeStatusCreateStatusPageAccess": "アクセス",
- "distributedUptimeStatusCreateStatusPageReady": "ステータスページの準備ができたら、公開済みとしてマークできます。",
- "distributedUptimeStatusBasicInfoHeader": "基本情報",
- "distributedUptimeStatusBasicInfoDescription": "会社名とステータスページが指すサブドメインを定義。",
- "distributedUptimeStatusLogoHeader": "ロゴ",
- "distributedUptimeStatusLogoDescription": "ステータスページ用のロゴをアップロード",
- "distributedUptimeStatusLogoUploadButton": "ロゴをアップロード",
- "distributedUptimeStatusStandardMonitorsHeader": "標準モニター",
- "distributedUptimeStatusStandardMonitorsDescription": "標準モニターをステータスページに添付。",
- "distributedUptimeStatusCreateYour": "作成する",
- "distributedUptimeStatusEditYour": "編集する",
- "distributedUptimeStatusPublishedLabel": "公開済みで一般に表示",
- "distributedUptimeStatusCompanyNameLabel": "会社名",
- "distributedUptimeStatusPageAddressLabel": "ステータスページアドレス",
- "distributedUptimeStatus30Days": "30日",
- "distributedUptimeStatus60Days": "60日",
- "distributedUptimeStatus90Days": "90日",
- "distributedUptimeStatusPageNotSetUp": "ステータスページが設定されていません。",
- "distributedUptimeStatusContactAdmin": "管理者にお問い合わせください",
- "distributedUptimeStatusPageNotPublic": "このステータスページは非公開です。",
- "distributedUptimeStatusPageDeleteDialog": "このステータスページを削除しますか?",
- "distributedUptimeStatusPageDeleteConfirm": "はい、ステータスページを削除",
- "distributedUptimeStatusPageDeleteDescription": "削除されると、ステータスページは復元できません。",
- "distributedUptimeStatusDevices": "デバイス",
- "distributedUptimeStatusUpt": "UPT",
- "distributedUptimeStatusUptBurned": "UPT消費",
- "distributedUptimeStatusUptLogo": "Uptロゴ",
- "incidentsTableNoIncidents": "記録されたインシデントはありません",
- "incidentsTablePaginationLabel": "インシデント",
- "incidentsTableMonitorName": "モニター名",
- "incidentsTableStatus": "ステータス",
- "incidentsTableDateTime": "日付と時刻",
- "incidentsTableStatusCode": "ステータスコード",
- "incidentsTableMessage": "メッセージ",
- "incidentsOptionsHeader": "インシデント対象:",
- "incidentsOptionsHeaderFilterBy": "フィルター:",
- "incidentsOptionsHeaderFilterAll": "すべて",
- "incidentsOptionsHeaderFilterDown": "ダウン",
- "incidentsOptionsHeaderFilterCannotResolve": "解決不可",
- "incidentsOptionsHeaderShow": "表示:",
- "incidentsOptionsHeaderLastHour": "最終時間",
- "incidentsOptionsHeaderLastDay": "最終日",
- "incidentsOptionsHeaderLastWeek": "最終週",
- "incidentsOptionsPlaceholderAllServers": "すべてのサーバー",
- "infrastructureCreateYour": "作成する",
- "infrastructureCreateGeneralSettingsDescription": "ここでホストのURL、フレンドリーネーム、サーバーエージェントに接続するための認証シークレットを選択できます。",
- "infrastructureServerRequirement": "監視中のサーバーで実行されている必要があります",
- "infrastructureCustomizeAlerts": "アラートをカスタマイズ",
- "infrastructureAlertNotificationDescription": "しきい値が指定された割合を超えた場合にユーザーに通知を送信。",
- "infrastructureCreateMonitor": "インフラストラクチャモニターを作成",
- "infrastructureProtocol": "プロトコル",
- "infrastructureServerUrlLabel": "サーバーURL",
- "infrastructureDisplayNameLabel": "表示名",
- "infrastructureAuthorizationSecretLabel": "認証シークレット",
- "gb": "GB",
- "mb": "MB",
- "mem": "メモリ",
- "memoryUsage": "メモリ使用率",
- "cpu": "CPU",
- "cpuUsage": "CPU使用率",
- "cpuTemperature": "CPU温度",
- "diskUsage": "ディスク使用率",
- "used": "使用済み",
- "total": "合計",
- "cores": "コア",
- "frequency": "頻度",
- "status": "ステータス",
- "cpuPhysical": "CPU(物理)",
- "cpuLogical": "CPU(論理)",
- "cpuFrequency": "CPU周波数",
- "avgCpuTemperature": "平均CPU温度",
- "memory": "メモリ",
- "disk": "ディスク",
- "uptime": "稼働時間",
- "os": "OS",
- "host": "ホスト",
- "actions": "アクション",
- "integrations": "統合",
- "integrationsPrism": "Prismをお気に入りのサービスに接続。",
- "integrationsSlack": "Slack",
- "integrationsSlackInfo": "Slackと接続してチャンネルでインシデントを表示",
- "integrationsDiscord": "Discord",
- "integrationsDiscordInfo": "Discordと接続してチャンネルでインシデントを直接表示",
- "integrationsZapier": "Zapier",
- "integrationsZapierInfo": "すべてのインシデントをZapierに送信し、どこでも表示",
- "commonSave": "保存",
- "createYour": "作成する",
- "createMonitor": "モニターを作成",
- "pause": "一時停止",
- "resume": "再開",
- "editing": "編集中...",
- "url": "URL",
- "access": "アクセス",
- "timezone": "タイムゾーン",
- "features": "機能",
- "administrator": "管理者?",
- "loginHere": "こちらでログイン",
- "displayName": "表示名",
- "urlMonitor": "監視するURL",
- "portToMonitor": "監視するポート",
- "websiteMonitoring": "ウェブサイト監視",
- "websiteMonitoringDescription": "HTTP(s)を使用してウェブサイトやAPIエンドポイントを監視。",
- "pingMonitoring": "Ping監視",
- "pingMonitoringDescription": "サーバーが利用可能かどうかをチェック。",
- "dockerContainerMonitoring": "Dockerコンテナ監視",
- "dockerContainerMonitoringDescription": "Dockerコンテナが実行中かどうかをチェック。",
- "portMonitoring": "ポート監視",
- "portMonitoringDescription": "ポートが開いているかどうかをチェック。",
- "createMaintenanceWindow": "メンテナンスウィンドウを作成",
- "createMaintenance": "メンテナンスを作成",
- "editMaintenance": "メンテナンスを編集",
- "maintenanceWindowName": "メンテナンスウィンドウ名",
- "friendlyNameInput": "フレンドリーネーム",
- "friendlyNamePlaceholder": "__:__で___分間のメンテナンス",
- "maintenanceRepeat": "メンテナンス繰り返し",
- "maintenance": "メンテナンス",
- "duration": "期間",
- "addMonitors": "モニターを追加",
- "window": "ウィンドウ",
- "cancel": "キャンセル",
- "message": "メッセージ",
- "low": "低",
- "high": "高",
- "statusCode": "ステータスコード",
- "date&Time": "日付と時刻",
- "type": "タイプ",
- "statusPageName": "ステータスページ名",
- "publicURL": "公開URL",
- "repeat": "繰り返し",
- "edit": "編集",
- "createA": "作成する",
- "remove": "削除",
- "maintenanceWindowDescription": "この時間帯はpingが送信されません",
- "startTime": "開始時刻",
- "timeZoneInfo": "すべての日付と時刻はGMT+0タイムゾーンです。",
- "monitorsToApply": "メンテナンスウィンドウを適用するモニター",
- "nextWindow": "次のウィンドウ",
- "notFoundButton": "メインダッシュボードに移動",
- "pageSpeedConfigureSettingsDescription": "ここでホストのURL、モニタータイプを選択できます。",
- "monitorDisplayName": "モニター表示名",
- "whenNewIncident": "新しいインシデントが発生した場合、",
- "notifySMS": "SMS経由で通知(近日公開)",
- "notifyEmails": "複数のアドレスにメールでも通知(近日公開)",
- "seperateEmails": "複数のメールはカンマで区切ることができます",
- "checkFrequency": "チェック頻度",
- "matchMethod": "マッチ方法",
- "expectedValue": "期待値",
- "deleteDialogTitle": "本当にこのモニターを削除しますか?",
- "deleteDialogDescription": "削除されると、このモニターは復元できません。",
- "pageSpeedMonitor": "PageSpeedモニター",
- "shown": "表示",
- "ago": "前",
- "companyName": "会社名",
- "pageSpeedDetailsPerformanceReport": "値は推定値で変動する可能性があります。",
- "pageSpeedDetailsPerformanceReportCalculator": "計算機を見る",
- "checkingEvery": "チェック間隔",
- "statusPageCreateSettings": "ステータスページの準備ができたら、公開済みとしてマークできます。",
- "basicInformation": "基本情報",
- "statusPageCreateBasicInfoDescription": "会社名とステータスページが指すサブドメインを定義。",
- "statusPageCreateSelectTimeZoneDescription": "ステータスページが表示されるタイムゾーンを選択。",
- "statusPageCreateAppearanceDescription": "公開ステータスページのデフォルトの外観を定義。",
- "statusPageCreateSettingsCheckboxLabel": "公開済みで一般に表示",
- "statusPageCreateBasicInfoStatusPageAddress": "ステータスページアドレス",
- "statusPageCreateTabsContent": "ステータスページサーバー",
- "statusPageCreateTabsContentDescription": "監視している任意の数のサーバーをステータスページに追加できます。最適な表示体験のために並び替えることもできます。",
- "statusPageCreateTabsContentFeaturesDescription": "ステータスページでより多くの詳細を表示",
- "showCharts": "チャートを表示",
- "showUptimePercentage": "稼働率を表示",
- "removeLogo": "ロゴを削除",
- "statusPageStatus": "公開ステータスページが設定されていません。",
- "statusPageStatusContactAdmin": "管理者にお問い合わせください",
- "statusPageStatusNotPublic": "このステータスページは非公開です。",
- "statusPageStatusNoPage": "ここにはステータスページがありません。",
- "statusPageStatusServiceStatus": "サービスステータス",
- "deleteStatusPage": "このステータスページを削除しますか?",
- "deleteStatusPageConfirm": "はい、ステータスページを削除",
- "deleteStatusPageDescription": "削除されると、ステータスページは復元できません。",
- "uptimeCreate": "期待値はレスポンス結果と照合するために使用され、マッチがステータスを決定します。",
- "uptimeCreateJsonPath": "この式はレスポンスJSONデータに対して評価され、結果は期待値との照合に使用されます。参照",
- "uptimeCreateJsonPathQuery": "クエリ言語ドキュメント。",
- "maintenanceTableActionMenuDialogTitle": "本当にこのメンテナンスウィンドウを削除しますか?",
- "infrastructureEditYour": "編集する",
- "infrastructureEditMonitor": "インフラストラクチャモニターを保存",
- "infrastructureMonitorCreated": "インフラストラクチャモニターが正常に作成されました!",
- "infrastructureMonitorUpdated": "インフラストラクチャモニターが正常に更新されました!",
- "errorInvalidTypeId": "無効な通知タイプが提供されました",
- "errorInvalidFieldId": "無効なフィールドIDが提供されました",
- "inviteNoTokenFound": "招待トークンが見つかりません",
- "pageSpeedWarning": "警告: Google PageSpeed APIキーがまだ追加されていません。これがないとPageSpeedモニターは機能しません。",
- "pageSpeedLearnMoreLink": "こちらをクリック",
- "pageSpeedAddApiKey": "APIキーを追加する。",
- "update": "更新",
- "invalidFileFormat": "サポートされていないファイル形式!",
- "invalidFileSize": "ファイルサイズが大きすぎます!",
- "ClickUpload": "クリックしてアップロード",
- "DragandDrop": "ドラッグアンドドロップ",
- "MaxSize": "最大サイズ",
- "SupportedFormats": "対応フォーマット",
- "FirstName": "名",
- "LastName": "姓",
- "EmailDescriptionText": "こちらは現在ご使用のメールアドレスです — 変更することはできません。",
- "YourPhoto": "プロフィール写真",
- "PhotoDescriptionText": "この写真はプロフィールページに表示されます。",
- "save": "保存",
- "DeleteDescriptionText": "これにより、アカウントと関連するすべてのデータがサーバーから削除されます。この操作は元に戻せません。",
- "DeleteAccountWarning": "アカウントを削除すると、再度サインインできなくなり、すべてのデータが削除されます。この操作は元に戻せません。",
- "DeleteWarningTitle": "本当にこのアカウントを削除しますか?",
- "bulkImport": {
- "title": "一括インポート",
- "selectFileTips": "アップロードするCSVファイルを選択",
- "selectFileDescription": "テンプレートまたはサンプルをダウンロードできます",
- "selectFile": "ファイルを選択",
- "parsingFailed": "解析に失敗しました",
- "uploadSuccess": "モニターが正常に作成されました!",
- "validationFailed": "検証に失敗しました",
- "noFileSelected": "ファイルが選択されていません",
- "fallbackPage": "サーバーのリストを一括アップロードするためのファイルをインポート",
- "invalidFileType": "無効なファイルタイプ",
- "uploadFailed": "アップロードに失敗しました"
- },
- "DeleteAccountTitle": "アカウントを削除",
- "DeleteAccountButton": "アカウントを削除",
- "publicLink": "公開リンク",
- "maskedPageSpeedKeyPlaceholder": "*************************************",
- "reset": "リセット",
- "ignoreTLSError": "TLS/SSLエラーを無視",
- "tlsErrorIgnored": "TLS/SSLエラーが無視されました",
- "ignoreTLSErrorDescription": "TLS/SSLエラーを無視してウェブサイトの可用性をチェック続行",
- "createNew": "新規作成",
- "greeting": {
- "prepend": "こんにちは",
- "append": "午後はあなたの遊び場です—壮大なものにしましょう!",
- "overview": "{{type}}モニターの概要です。"
- },
- "roles": {
- "superAdmin": "スーパー管理者",
- "admin": "管理者",
- "teamMember": "チームメンバー",
- "demoUser": "デモユーザー"
- },
- "teamPanel": {
- "teamMembers": "チームメンバー",
- "filter": {
- "all": "すべて",
- "member": "メンバー"
+ "components": {
+ "imageUpload": {
+ "clickToUpload": "クリックしてアップロード",
+ "dragAndDrop": "ドラッグアンドドロップ",
+ "supportedFormats": "対応フォーマット",
+ "maxSize": "最大サイズ",
+ "orDragAndDrop": "またはドラッグアンドドロップ",
+ "errors": {
+ "invalidFileSize": "ファイルサイズが大きすぎます!",
+ "invalidFileFormat": "サポートされていないファイル形式!"
+ }
},
- "inviteTeamMember": "チームメンバーを招待",
- "inviteNewTeamMember": "新しいチームメンバーを招待",
- "inviteDescription": "新しいチームメンバーを追加すると、すべてのモニターへのアクセス権が付与されます。",
- "email": "メール",
- "selectRole": "役割を選択",
- "inviteLink": "招待リンク",
- "cancel": "キャンセル",
- "noMembers": "この役割のチームメンバーはいません",
- "getToken": "トークンを取得",
- "emailToken": "メールトークン",
- "table": {
- "name": "名前",
- "email": "メール",
- "role": "役割",
- "created": "作成日"
+ "headerStatusPageControls": {
+ "publicLink": "公開リンク"
},
- "addTeamMember": {
- "addMemberMenu": "",
- "title": "",
- "description": "",
- "addButton": ""
+ "headerTimeRange": {
+ "labels": {
+ "day": "日",
+ "month": "月",
+ "recent": "最近",
+ "week": "週"
+ },
+ "description": {
+ "recent": "過去2時間の統計を表示しています。",
+ "day": "過去24時間の統計を表示しています。",
+ "week": "過去7日間の統計を表示しています。",
+ "month": "過去30日間の統計を表示しています。"
+ }
},
- "register": "",
- "registerToast": {
- "success": "",
- "dbUserExists": "",
- "unknownError": ""
+ "offlineBanner": {
+ "serverUnreachable": "サーバーに接続できません",
+ "retry": "再試行",
+ "retrying": "再試行中...",
+ "reconnected": "サーバーに正常に再接続しました。"
},
- "registerTeamMember": {
- "title": "",
- "auth": {
- "common": {
- "inputs": {
- "firstName": {
- "errors": {
- "empty": "",
- "pattern": ""
- }
- },
- "lastName": {
- "errors": {
- "empty": "",
- "pattern": ""
- }
+ "sidebar": {
+ "menu": {
+ "uptime": "稼働時間",
+ "pagespeed": "ページ速度",
+ "infrastructure": "インフラストラクチャ",
+ "notifications": "通知",
+ "checks": "チェック",
+ "incidents": "インシデント",
+ "statusPages": "ステータスページ",
+ "maintenance": "メンテナンス",
+ "logs": "ログ",
+ "settings": "設定"
+ },
+ "bottomMenu": {
+ "support": "サポート",
+ "discussions": "ディスカッション",
+ "docs": "ドキュメント",
+ "changelog": "変更履歴"
+ },
+ "accountMenu": {
+ "profile": "プロフィール",
+ "password": "パスワード",
+ "team": "チーム"
+ },
+ "starPrompt": {
+ "title": "Checkmateにスターを付ける",
+ "description": "GitHubで最新リリースを確認し、コミュニティの成長に貢献しましょう"
+ },
+ "authFooter": {
+ "navControls": "コントロール",
+ "logOut": "ログアウト",
+ "roles": {
+ "superAdmin": "スーパー管理者",
+ "admin": "管理者",
+ "user": "ユーザー",
+ "demoUser": "デモユーザー"
+ }
+ }
+ },
+ "starPrompt": {
+ "title": "Checkmateにスターを付ける",
+ "description": "GitHubで最新リリースを確認し、コミュニティの成長に貢献しましょう"
+ }
+ },
+ "pages": {
+ "notFound": {
+ "title": "おっと!お寿司を落としてしまいました!",
+ "subtitle": "URLが存在しないか、アクセス権限がありません。"
+ },
+ "account": {
+ "tabs": {
+ "profile": "プロフィール",
+ "password": "パスワード",
+ "team": "チーム"
+ },
+ "form": {
+ "name": {
+ "title": "名前",
+ "description": "個人情報を更新"
+ },
+ "photo": {
+ "title": "プロフィール写真",
+ "description": "プロフィール画像をアップロード"
+ },
+ "currentPassword": {
+ "title": "現在のパスワード",
+ "description": "本人確認のために現在のパスワードを入力してください",
+ "option": {
+ "label": "現在のパスワード",
+ "placeholder": "現在のパスワードを入力"
+ }
+ },
+ "newPassword": {
+ "title": "新しいパスワード",
+ "description": "8文字以上の強力なパスワードを選択してください",
+ "option": {
+ "newPassword": {
+ "label": "新しいパスワード",
+ "placeholder": "新しいパスワードを入力"
},
+ "confirm": {
+ "label": "パスワードを確認",
+ "placeholder": "新しいパスワードを確認"
+ }
+ }
+ },
+ "deleteAccount": {
+ "title": "アカウントを削除",
+ "description": "この操作は永久的で元に戻せません"
+ }
+ },
+ "team": {
+ "filter": {
+ "placeholder": "ロールでフィルター",
+ "all": "すべて",
+ "admin": "管理者",
+ "member": "メンバー"
+ },
+ "table": {
+ "headers": {
+ "email": "メールアドレス",
+ "role": "ロール",
+ "created": "作成日"
+ }
+ },
+ "addMember": {
+ "title": "新しいチームメンバーを登録",
+ "description": "新しいユーザーアカウントを作成します。作成後、認証情報を安全に共有してください。"
+ },
+ "invite": {
+ "title": "チームメンバーを招待",
+ "description": "チームへの招待を送信",
+ "email": {
+ "label": "メールアドレス",
+ "placeholder": "メールアドレスを入力"
+ },
+ "role": {
+ "label": "ロール",
+ "placeholder": "ロールを選択"
+ },
+ "linkLabel": "招待リンク"
+ }
+ }
+ },
+ "auth": {
+ "common": {
+ "passwordRules": {
+ "length": {
+ "beginning": "少なくとも",
+ "highlighted": "8文字である必要があります"
+ },
+ "lowercase": {
+ "beginning": "少なくとも",
+ "highlighted": "1つの小文字を含む必要があります"
+ },
+ "match": {
+ "beginning": "パスワードの確認とパスワードは",
+ "highlighted": "一致する必要があります"
+ },
+ "number": {
+ "beginning": "少なくとも",
+ "highlighted": "1つの数字を含む必要があります"
+ },
+ "special": {
+ "beginning": "少なくとも",
+ "highlighted": "1つの特殊文字を含む必要があります"
+ },
+ "uppercase": {
+ "beginning": "少なくとも",
+ "highlighted": "1つの大文字を含む必要があります"
+ }
+ },
+ "form": {
+ "option": {
"email": {
- "errors": {
- "empty": "",
- "invalid": ""
- }
+ "label": "メールアドレス",
+ "placeholder": "me@example.com"
},
- "role": {
- "errors": {
- "empty": ""
- }
+ "password": {
+ "label": "パスワード",
+ "placeholder": "********"
+ },
+ "confirmPassword": {
+ "label": "パスワードを確認"
}
}
}
+ },
+ "login": {
+ "title": "Checkmateへようこそ!",
+ "subtitle": "ログインして続行",
+ "submit": "ログイン",
+ "links": {
+ "forgotPassword": {
+ "text": "パスワードをお忘れですか?",
+ "linkText": "パスワードをリセット"
+ },
+ "register": {
+ "text": "アカウントをお持ちでないですか?",
+ "linkText": "こちらから登録"
+ }
+ }
+ },
+ "register": {
+ "title": "Checkmateへようこそ!",
+ "subtitle": "サインアップして始めましょう",
+ "submit": "登録"
+ },
+ "forgotPassword": {
+ "title": "パスワードをお忘れですか?",
+ "subtitle": "ご安心ください。リセット手順をお送りします。",
+ "submit": "リカバリーをリクエスト",
+ "links": {
+ "login": {
+ "text": "戻る:",
+ "linkText": "ログイン"
+ }
+ }
+ },
+ "setNewPassword": {
+ "title": "パスワードをリセット",
+ "subtitle": "新しいパスワードは以前使用したパスワードと異なる必要があります。"
}
},
- "role": "",
- "changeTeamPassword": {
- "changePasswordMenu": "",
- "title": "",
- "description": "",
- "success": ""
- }
- },
- "monitorState": {
- "paused": "一時停止",
- "resumed": "再開",
- "active": "アクティブ"
- },
- "menu": {
- "uptime": "稼働時間",
- "pagespeed": "ページ速度",
- "infrastructure": "インフラストラクチャ",
- "incidents": "インシデント",
- "statusPages": "ステータスページ",
- "maintenance": "メンテナンス",
- "integrations": "統合",
- "settings": "設定",
- "support": "サポート",
- "discussions": "ディスカッション",
- "docs": "ドキュメント",
- "changelog": "変更履歴",
- "profile": "プロフィール",
- "password": "パスワード",
- "team": "チーム",
- "logOut": "ログアウト",
- "notifications": "通知",
- "logs": "ログ"
- },
- "settingsEmailUser": "メールユーザー - 認証用ユーザー名、指定されている場合はメールアドレスを上書き",
- "state": "状態",
- "statusBreadCrumbsStatusPages": "ステータスページ",
- "statusBreadCrumbsDetails": "詳細",
- "commonSaving": "保存中...",
- "navControls": "コントロール",
- "incidentsPageTitle": "インシデント",
- "passwordPanel": {
- "passwordChangedSuccess": "パスワードが正常に変更されました。",
- "passwordInputIncorrect": "パスワード入力が間違っています。",
- "currentPassword": "現在のパスワード",
- "enterCurrentPassword": "現在のパスワードを入力",
- "newPassword": "新しいパスワード",
- "enterNewPassword": "新しいパスワードを入力",
- "confirmNewPassword": "新しいパスワードの確認",
- "passwordRequirements": "新しいパスワードは少なくとも8文字で、少なくとも1つの大文字、1つの小文字、1つの数字、1つの特殊文字を含む必要があります。",
- "saving": "保存中..."
- },
- "emailSent": "メールが正常に送信されました",
- "failedToSendEmail": "メールの送信に失敗しました",
- "settingsTestEmailSuccess": "テストメールが正常に送信されました",
- "settingsTestEmailFailed": "テストメールの送信に失敗しました",
- "settingsTestEmailFailedWithReason": "テストメールの送信に失敗しました: {{reason}}",
- "settingsTestEmailUnknownError": "不明なエラー",
- "statusMsg": {
- "paused": "監視が一時停止されています。",
- "up": "サイトが稼働中です。",
- "down": "サイトがダウンしています。",
- "pending": "保留中..."
- },
- "uptimeGeneralInstructions": {
- "http": "監視するURLまたはIPを入力(例: https://example.com/ または 192.168.1.100)し、ダッシュボードに表示される明確な表示名を追加。",
- "ping": "pingするIPアドレスまたはホスト名を入力(例: 192.168.1.100 または example.com)し、ダッシュボードに表示される明確な表示名を追加。",
- "docker": "コンテナのDocker IDを入力。Docker IDは64文字のフルDocker IDである必要があります。docker inspect を実行してフルコンテナIDを取得できます。",
- "port": "サーバーのURLまたはIP、ポート番号、ダッシュボードに表示される明確な表示名を入力。",
- "game": "",
- "https": ""
- },
- "common": {
- "appName": "Checkmate",
- "monitoringAgentName": "Capture",
- "buttons": {
- "toggleTheme": "ライト&ダークを切り替え"
+ "checks": {
+ "selects": {
+ "monitor": {
+ "all": "すべてのモニター"
+ },
+ "status": {
+ "all": "すべて",
+ "down": "ダウン",
+ "up": "アップ"
+ }
+ },
+ "table": {
+ "empty": "この期間にダウンチェックはありません",
+ "headers": {
+ "statusCode": "ステータスコード",
+ "location": "ロケーション"
+ }
+ }
},
- "toasts": {
- "networkError": "ネットワークエラー",
- "checkConnection": "接続を確認してください",
- "unknownError": "不明なエラー"
- }
- },
- "auth": {
"common": {
- "navigation": {
- "continue": "続行",
- "back": "戻る"
- },
- "inputs": {
- "email": {
- "label": "メール",
- "placeholder": "jordan.ellis@domain.com",
- "errors": {
- "empty": "続行するには、メールアドレスを入力してください",
- "invalid": "入力されたメールアドレスの有効性を再確認してください"
- }
+ "monitors": {
+ "actions": {
+ "configure": "設定",
+ "delete": "削除",
+ "generateToken": "トークンを生成",
+ "details": "詳細",
+ "incidents": "インシデント",
+ "inviteMember": "メンバーを招待",
+ "openSite": "サイトを開く",
+ "pause": "一時停止",
+ "resume": "再開"
+ },
+ "statBoxes": {
+ "activeFor": "稼働期間",
+ "certificateExpiry": "証明書の有効期限",
+ "lastCheck": "最終チェック",
+ "lastResponseTime": "最終応答時間"
+ },
+ "status": {
+ "down": "ダウン",
+ "breached": "しきい値超過",
+ "initializing": "初期化中",
+ "maintenance": "メンテナンス中",
+ "paused": "一時停止中",
+ "total": "合計",
+ "up": "稼働中"
+ },
+ "monitorTypes": {
+ "optionDocker": "Docker",
+ "optionGame": "ゲーム",
+ "optionHttp": "HTTP(S)",
+ "optionPing": "Ping",
+ "optionPort": "ポート",
+ "optionPagespeed": "PageSpeed",
+ "optionHardware": "インフラストラクチャ",
+ "optionGrpc": "gRPC",
+ "optionWebSocket": "WebSocket"
+ }
+ }
+ },
+ "createMonitor": {
+ "form": {
+ "advanced": {
+ "description": "高度なユースケース向けのオプション設定",
+ "option": {
+ "advancedMatching": {
+ "label": "高度なマッチングを使用"
+ },
+ "expectedValue": {
+ "label": "期待値"
+ },
+ "jsonPath": {
+ "description": "この式はレスポンスのJSONデータに対して評価され、結果は期待値とのマッチングに使用されます。クエリ言語のドキュメントはjmespath.orgをご参照ください。",
+ "label": "JSONPath式"
+ },
+ "matchMethod": {
+ "label": "マッチ方法",
+ "equal": "",
+ "include": "",
+ "regex": ""
+ }
+ },
+ "title": "詳細設定"
},
- "password": {
- "label": "パスワード",
- "rules": {
- "length": {
- "beginning": "少なくとも",
- "highlighted": "8文字である必要があります"
+ "frequency": {
+ "description": "このモニターのステータスをどのくらいの頻度で確認しますか?",
+ "option": {
+ "frequency": {
+ "label": "チェック頻度",
+ "value": {
+ "fifteenMinutes": "15分",
+ "fifteenSeconds": "",
+ "fiveMinutes": "5分",
+ "fourMinutes": "",
+ "oneMinute": "",
+ "tenMinutes": "10分",
+ "thirtyMinutes": "30分",
+ "thirtySeconds": "",
+ "threeMinutes": "3分",
+ "twoMinutes": ""
+ }
+ }
+ },
+ "title": "チェック頻度"
+ },
+ "general": {
+ "option": {
+ "container": {
+ "label": "コンテナ名/ID",
+ "placeholder": "my-app または abcd1234"
+ },
+ "host": {
+ "label": "ホスト",
+ "placeholder": "192.168.1.100 または example.com"
+ },
+ "name": {
+ "label": "表示名",
+ "placeholder": "例: My Website"
},
- "special": {
- "beginning": "少なくとも",
- "highlighted": "1つの特殊文字を含む必要があります"
+ "secret": {
+ "label": "認証シークレット",
+ "placeholder": "シークレットキーを入力"
},
- "number": {
- "beginning": "少なくとも",
- "highlighted": "1つの数字を含む必要があります"
+ "url": {
+ "label": "URL",
+ "placeholder": "https://www.google.com"
},
- "uppercase": {
- "beginning": "少なくとも",
- "highlighted": "1つの大文字を含む必要があります"
+ "game": {
+ "label": "",
+ "placeholder": ""
},
- "lowercase": {
- "beginning": "少なくとも",
- "highlighted": "1つの小文字を含む必要があります"
+ "port": {
+ "label": "監視するポート",
+ "placeholder": "80"
},
- "match": {
- "beginning": "パスワードの確認とパスワードは",
- "highlighted": "一致する必要があります"
+ "grpcServiceName": {
+ "label": "サービス名",
+ "placeholder": "例: my.service.v1(全体のヘルスチェックの場合は空欄)"
+ },
+ "wsUrl": {
+ "label": "WebSocket URL",
+ "placeholder": "wss://example.com/socket"
}
},
- "errors": {
- "empty": "パスワードを入力してください",
- "length": "パスワードは少なくとも8文字である必要があります",
- "uppercase": "パスワードは少なくとも1つの大文字を含む必要があります",
- "lowercase": "パスワードは少なくとも1つの小文字を含む必要があります",
- "number": "パスワードは少なくとも1つの数字を含む必要があります",
- "special": "パスワードは少なくとも1つの特殊文字を含む必要があります",
- "incorrect": "入力されたパスワードが記録と一致しません"
+ "title": "一般設定",
+ "description": {
+ "http": "監視するURLまたはIPを入力し(例: https://example.com/ または 192.168.1.100)、ダッシュボードに表示される表示名を追加してください。",
+ "ping": "pingするIPアドレスまたはホスト名を入力(例: 192.168.1.100 または example.com)し、ダッシュボードに表示される明確な表示名を追加。",
+ "port": "サーバーのURLまたはIP、ポート番号、ダッシュボードに表示される明確な表示名を入力。",
+ "docker": "コンテナのDocker IDを入力。Docker IDは64文字のフルDocker IDである必要があります。docker inspect を実行してフルコンテナIDを取得できます。",
+ "game": "",
+ "pagespeed": "Webサイトのページ読み込みパフォーマンス、Core Web Vitals、最適化スコアを追跡します。",
+ "grpc": "gRPCサーバーのホスト名とポートを入力し、必要に応じてヘルスチェック用のサービス名を指定し、表示名を追加してください。",
+ "websocket": "監視するWebSocket URLを入力し(例: wss://example.com/socket)、表示名を追加してください。",
+ "hardware": "インフラストラクチャのCPU、メモリ、ディスク使用量、温度を監視します。"
}
},
- "passwordConfirm": {
- "label": "パスワードの確認",
- "placeholder": "確認のためにパスワードを再入力",
- "errors": {
- "empty": "確認のためにパスワードを再度入力してください(タイプミスを防ぐため)",
- "different": "入力されたパスワードが一致しないため、どちらかが間違っています"
- }
+ "ignoreTls": {
+ "description": "HTTPS接続のTLS/SSL証明書検証を設定します。",
+ "option": {
+ "tls": {
+ "label": "TLS/SSLエラーを無視"
+ }
+ },
+ "title": "TLS/SSL設定"
},
- "firstName": {
- "label": "名前",
- "placeholder": "太郎",
- "errors": {
- "empty": "名前を入力してください",
- "length": "名前は50文字未満である必要があります",
- "pattern": "名前は文字、スペース、アポストロフィ、またはハイフンのみを含む必要があります"
+ "incidents": {
+ "description": "スライディングウィンドウを使用してモニターのダウンを判定します。スライディングウィンドウ内のチェックの割合が指定値を満たした場合にのみ、モニターのステータスが変更されます。",
+ "option": {
+ "checks": {
+ "label": "スライディングウィンドウ内のチェック数"
+ },
+ "percentage": {
+ "label": "モニターのステータスが変更される前に、スライディングウィンドウ内のチェックの何パーセントが失敗/成功する必要がありますか?"
+ }
+ },
+ "title": "インシデント"
+ },
+ "notifications": {
+ "description": "使用する通知チャンネルを選択してください",
+ "title": "通知"
+ },
+ "type": {
+ "description": "実行するチェックの種類を選択",
+ "optionDockerDescription": "Dockerを使用してコンテナが稼働しているか監視します。",
+ "optionGameDescription": "特定のゲームサーバーがオンラインかどうかを監視します。",
+ "optionGrpcDescription": "標準のHealth Checking Protocolを使用してgRPCサービスを監視します。",
+ "optionWebSocketDescription": "WebSocketエンドポイントの接続状態と応答時間を監視します。",
+ "optionHttpDescription": "HTTP(S)を使用してWebサイトまたはAPIエンドポイントを監視します。",
+ "optionPingDescription": "ICMP Pingを使用してサーバーがオンラインかどうかを監視します。",
+ "optionPortDescription": "サーバーの特定のポートが開いているかどうかを監視します。",
+ "title": "タイプ"
+ },
+ "thresholds": {
+ "title": "アラートしきい値",
+ "description": "このハードウェアモニターでアラートがトリガーされるしきい値を定義します。",
+ "option": {
+ "cpuThreshold": {
+ "label": "CPUアラートしきい値(%)"
+ },
+ "memoryThreshold": {
+ "label": "メモリアラートしきい値(%)"
+ },
+ "diskThreshold": {
+ "label": "ディスクアラートしきい値(%)"
+ },
+ "tempThreshold": {
+ "label": "温度アラートしきい値(°C)"
+ }
}
},
- "lastName": {
- "label": "姓",
- "placeholder": "田中",
- "errors": {
- "empty": "姓を入力してください",
- "length": "姓は50文字未満である必要があります",
- "pattern": "姓は文字、スペース、アポストロフィ、またはハイフンのみを含む必要があります"
+ "geoChecks": {
+ "title": "地理分散チェック",
+ "description": "複数の地理的ロケーションからチェックを実行し、グローバルな可用性とパフォーマンスを監視します。",
+ "option": {
+ "enabled": {
+ "label": "地理分散チェックを有効化"
+ },
+ "locations": {
+ "label": "ロケーション",
+ "placeholder": "ロケーションを選択",
+ "options": {
+ "EU": "ヨーロッパ",
+ "NA": "北米",
+ "AS": "アジア",
+ "SA": "南米",
+ "AF": "アフリカ",
+ "OC": "オセアニア"
+ }
+ },
+ "interval": {
+ "label": "チェック間隔",
+ "value": {
+ "fiveMinutes": "5分",
+ "tenMinutes": "10分",
+ "fifteenMinutes": "15分",
+ "thirtyMinutes": "30分"
+ }
+ }
}
- }
- },
- "errors": {
- "validation": "データの検証エラー。"
- },
- "fields": {
- "password": {
- "errors": {
- "incorrect": "入力されたパスワードが記録と一致しません"
+ },
+ "url": {
+ "title": "ステータスページにモニターのIP/URLを表示",
+ "description": "公開ステータスページにモニターのIPアドレスまたはURLを表示します。無効の場合、機密情報を保護するためにモニター名のみが表示されます。",
+ "option": {
+ "showURL": {
+ "label": "ステータスページにIP/URLを表示",
+ "enabled": "有効",
+ "disabled": "無効"
+ }
}
},
- "role": {
- "errors": {
- "min": ""
+ "stats": {
+ "title": "モニター履歴",
+ "description": "チームのすべての監視履歴と統計をクリアします。この操作は元に戻せません。",
+ "buttonText": "すべての統計をクリア",
+ "dialog": {
+ "title": "すべての監視履歴をクリアしますか?",
+ "description": "チームのすべての監視履歴、統計、チェックデータが完全に削除されます。この操作は元に戻せません。",
+ "confirm": "はい、すべての統計をクリア"
}
}
}
},
- "login": {
- "heading": "ログイン",
- "subheadings": {
- "stepOne": "メールアドレスを入力",
- "stepTwo": "パスワードを入力"
+ "editUser": {
+ "form": {
+ "roles": {
+ "title": "ロール",
+ "description": "ユーザーにロールを割り当てます。複数のロールを選択できます。"
+ }
},
- "links": {
- "forgotPassword": "パスワードを忘れましたか?",
- "register": "アカウントをお持ちでないですか?",
- "forgotPasswordLink": "パスワードをリセット",
- "registerLink": "こちらで登録"
+ "dialog": {
+ "removeUser": {
+ "title": "ユーザーを削除",
+ "content": "{{name}}をチームから削除してもよろしいですか?この操作は元に戻せません。"
+ }
+ }
+ },
+ "incidents": {
+ "dialog": {
+ "resolveIncident": {
+ "title": "インシデントを解決",
+ "option": {
+ "comment": {
+ "label": "コメント(任意)",
+ "placeholder": "解決に関するコメントを追加..."
+ }
+ }
+ },
+ "details": {
+ "analysis": "インシデント分析",
+ "comment": "コメント:",
+ "detailsLabel": "詳細",
+ "downtime": "ダウンタイム:",
+ "message": "メッセージ:",
+ "monitor": "モニター:",
+ "overview": "概要",
+ "resolutionDetails": "解決の詳細",
+ "resolutionType": "タイプ:",
+ "resolutionTypes": {
+ "automatic": "自動",
+ "manual": "手動"
+ },
+ "resolve": "インシデントを解決",
+ "resolvedAt": "解決日時:",
+ "resolvedBy": "解決者:",
+ "startedAt": "開始日時:",
+ "status": "ステータス:",
+ "statusCode": "ステータスコード:",
+ "timeline": "タイムライン",
+ "title": "インシデント詳細",
+ "url": "URL:"
+ }
},
- "toasts": {
- "success": "おかえりなさい!正常にログインしました。",
- "incorrectPassword": "パスワードが間違っています"
+ "filters": {
+ "allMonitors": "すべてのモニター",
+ "monitor": "モニター",
+ "resolutionType": "解決タイプ",
+ "resolutionTypes": {
+ "manual": "手動",
+ "automatic": "自動",
+ "all": "すべて"
+ }
},
- "errors": {
- "password": {
- "incorrect": "入力されたパスワードが記録と一致しません"
+ "summaryCard": {
+ "activeIncidents": {
+ "title": "アクティブなインシデント",
+ "active_zero": "アクティブなインシデントはありません",
+ "active_one": "{{count}}件のアクティブなインシデント",
+ "active_other": "{{count}}件のアクティブなインシデント"
+ },
+ "incidentStats": {
+ "avgResolutionTime": "平均解決時間",
+ "mostAffectedMonitor": "最も影響を受けたモニター",
+ "title": "インシデント統計",
+ "totalIncidents": "インシデント合計"
+ },
+ "latestIncidents": {
+ "title": "最新のインシデント"
}
},
- "welcome": ""
+ "table": {
+ "actions": {
+ "details": "詳細",
+ "goToMonitor": "モニターへ移動",
+ "resolveManually": "手動で解決"
+ },
+ "activeIncidents": "アクティブなインシデント",
+ "headers": {
+ "endTime": "終了時刻",
+ "resolutionType": "解決タイプ",
+ "startTime": "開始時刻",
+ "statusCode": "ステータスコード"
+ },
+ "resolvedIncidents": "解決済みインシデント",
+ "status": {
+ "active": "アクティブ",
+ "resolved": "解決済み"
+ }
+ }
},
- "registration": {
- "heading": {
- "superAdmin": "スーパー管理者を作成",
- "user": "サインアップ"
- },
- "subheadings": {
- "stepOne": "個人情報を入力",
- "stepTwo": "メールアドレスを入力",
- "stepThree": "パスワードを作成"
+ "infrastructure": {
+ "charts": {
+ "labels": {
+ "cpu": "CPU使用率",
+ "disk": "ディスク使用率",
+ "memory": "メモリ使用率",
+ "netBytesRecv": "{{name}} - 受信バイト数",
+ "netBytesSent": "{{name}} - 送信バイト数",
+ "temp": "温度"
+ }
},
- "description": {
- "superAdmin": "スーパー管理者アカウントを作成して開始",
- "user": "ユーザーとしてサインアップし、スーパー管理者にモニターへのアクセスを求める"
+ "gauges": {
+ "cpu": {
+ "lowerLabel": "最大周波数",
+ "title": "CPU使用率",
+ "upperLabel": "現在の周波数"
+ },
+ "disk": {
+ "lowerLabel": "空き",
+ "title": "ディスク{{idx}}使用率",
+ "upperLabel": "使用済み"
+ },
+ "memory": {
+ "lowerLabel": "空き",
+ "title": "メモリ使用率",
+ "upperLabel": "使用済み"
+ }
},
- "gettingStartedButton": {
- "superAdmin": "スーパー管理者アカウントを作成",
- "user": "一般ユーザーでサインアップ"
+ "statBoxes": {
+ "avgCpuTemperature": "平均CPU温度",
+ "cpuFrequency": "CPU周波数",
+ "cpuLogical": "CPU(論理)",
+ "cpuPhysical": "CPU(物理)",
+ "disk": "ディスク",
+ "memory": "メモリ",
+ "os": "OS"
},
- "termsAndPolicies": "アカウントを作成することで、利用規約とプライバシーポリシーに同意したことになります。",
- "links": {
- "login": "既にアカウントをお持ちですか? ログイン"
+ "table": {
+ "headers": {
+ "cpu": "CPU",
+ "disk": "ディスク",
+ "memory": "メモリ"
+ }
},
- "toasts": {
- "success": "ようこそ!アカウントが正常に作成されました。"
+ "tabs": {
+ "labels": {
+ "network": "",
+ "overview": "概要"
+ }
},
- "welcome": ""
+ "fallback": {
+ "actionButton": "モニターを作成!",
+ "checks": "Track the performance of your servers,Identify bottlenecks and optimize usage,Ensure reliability with real-time monitoring",
+ "title": "インフラストラクチャモニターの用途:"
+ }
},
- "forgotPassword": {
- "heading": "パスワードを忘れましたか?",
- "subheadings": {
- "stepOne": "ご心配なく、リセット手順をお送りします。",
- "stepTwo": "パスワードリセットリンクを に送信しました",
- "stepThree": "新しいパスワードは以前に使用したパスワードとは異なる必要があります。",
- "stepFour": "パスワードが正常にリセットされました。下記をクリックして魔法のようにログインしてください。"
+ "logs": {
+ "tabs": {
+ "diagnostics": "診断",
+ "logs": "サーバーログ",
+ "queue": "ジョブキュー"
},
- "buttons": {
- "openEmail": "メールアプリを開く",
- "resetPassword": "パスワードをリセット"
+ "logLevelSelect": {
+ "label": "ログレベル"
},
- "imageAlts": {
- "passwordKey": "パスワードキーアイコン",
- "email": "メールアイコン",
- "lock": "ロックアイコン",
- "passwordConfirm": "パスワード確認アイコン"
+ "jobQueue": "ジョブキュー",
+ "failedJobs": "失敗したジョブ",
+ "noLogs": "ログが見つかりません",
+ "metrics": {
+ "jobs": "ジョブ",
+ "activeJobs": "アクティブなジョブ",
+ "failingJobs": "失敗中のジョブ",
+ "totalRuns": "合計実行数",
+ "totalFailures": "合計失敗数"
},
- "links": {
- "login": "ログインに戻る",
- "resend": "メールが届きませんか? クリックして再送信"
+ "diagnostics": {
+ "stats": {
+ "eventLoopDelay": "イベントループ遅延",
+ "uptime": "稼働時間",
+ "usedHeapSize": "使用済みヒープサイズ",
+ "totalHeapSize": "合計ヒープサイズ",
+ "osMemoryLimit": "OSメモリ制限"
+ },
+ "gauges": {
+ "heapAllocation": "ヒープ割り当て",
+ "heapUsage": "ヒープ使用率",
+ "heapUtilization": "ヒープ使用効率",
+ "instantCpuUsage": "瞬時CPU使用率",
+ "availableMemoryPercentage": "利用可能メモリの%",
+ "allocatedPercentage": "割り当て済み%",
+ "usedSPercentage": "CPUによる1秒あたりの使用%",
+ "total": "合計",
+ "used": "使用済み"
+ }
},
- "toasts": {
- "sent": "手順を に送信しました。",
- "emailNotFound": "メールが見つかりません。",
- "redirect": "秒後にリダイレクトします...",
- "success": "パスワードが正常にリセットされました。",
- "error": "パスワードをリセットできません。後でもう一度試すか、サポートにお問い合わせください。"
+ "table": {
+ "headers": {
+ "timestamp": "タイムスタンプ",
+ "level": "レベル",
+ "service": "サービス",
+ "method": "メソッド",
+ "monitorId": "モニターID",
+ "runCount": "実行回数",
+ "failCount": "失敗回数",
+ "lastRunAt": "最終実行日時",
+ "lockedAt": "ロック日時",
+ "lastFinishedAt": "最終完了日時",
+ "lastRunTook": "最終実行時間",
+ "lastFailedAt": "最終失敗日時",
+ "failReason": "失敗理由"
+ }
}
- }
- },
- "errorPages": {
- "serverUnreachable": {
- "toasts": {
- "reconnected": "サーバーに正常に再接続しました。",
- "stillUnreachable": "サーバーにまだ到達できません。後でもう一度お試しください。"
+ },
+ "maintenanceWindow": {
+ "fallback": {
+ "actionButton": "メンテナンスウィンドウを作成!",
+ "checks": "Mark your maintenance periods,Eliminate any misunderstandings,Stop sending alerts in maintenance windows",
+ "title": "メンテナンスウィンドウの用途:"
+ },
+ "table": {
+ "headers": {
+ "nextWindow": "次のウィンドウ",
+ "repeat": "繰り返し"
+ }
},
- "alertBox": "サーバー接続エラー",
- "description": "サーバーに接続できません。インターネット接続を確認するか、問題が続く場合はデプロイ設定を確認してください。",
- "retryButton": {
- "default": "接続を再試行",
- "processing": "接続中..."
+ "form": {
+ "general": {
+ "title": "一般設定",
+ "description": "メンテナンスウィンドウの名前と繰り返しオプションを設定します。",
+ "option": {
+ "name": {
+ "label": "名前",
+ "placeholder": "例: 週次メンテナンス"
+ },
+ "repeat": {
+ "label": "繰り返し"
+ }
+ }
+ },
+ "startDate": {
+ "title": "開始日",
+ "description": "メンテナンスウィンドウの開始日を選択してください。",
+ "option": {
+ "startDate": {
+ "label": "開始日"
+ }
+ }
+ },
+ "startTime": {
+ "title": "開始時刻",
+ "description": "メンテナンスウィンドウの開始時刻と期間を設定します。すべての値はUTCです",
+ "option": {
+ "duration": {
+ "label": "期間"
+ },
+ "startTime": {
+ "label": "開始時刻"
+ }
+ },
+ "monitors": {
+ "title": "モニター",
+ "description": "メンテナンスウィンドウを適用するモニター",
+ "option": {
+ "addMonitors": {
+ "label": "モニターを追加"
+ }
+ }
+ }
+ }
}
- }
- },
- "createNotifications": {
- "title": "通知チャンネルを作成",
- "nameSettings": {
- "title": "名前",
- "description": "統合の説明的な名前。",
- "nameLabel": "名前",
- "namePlaceholder": "例: Slack通知"
- },
- "typeSettings": {
- "title": "タイプ",
- "description": "作成したい通知チャンネルのタイプを選択。",
- "typeLabel": "タイプ"
- },
- "emailSettings": {
- "title": "メール",
- "description": "送信先メールアドレス。",
- "emailLabel": "メールアドレス",
- "emailPlaceholder": "例: john@example.com"
- },
- "slackSettings": {
- "title": "Slack",
- "description": "Slack Webhookをここで設定",
- "webhookLabel": "Slack Webhook URL",
- "webhookPlaceholder": "https://hooks.slack.com/services/..."
- },
- "pagerdutySettings": {
- "title": "PagerDuty",
- "description": "PagerDuty統合をここで設定",
- "integrationKeyLabel": "統合キー",
- "integrationKeyPlaceholder": "1234567890"
- },
- "discordSettings": {
- "title": "Discord",
- "description": "Discord Webhookをここで設定",
- "webhookLabel": "Discord Webhook URL",
- "webhookPlaceholder": "https://your-server.com/webhook"
- },
- "webhookSettings": {
- "title": "Webhook",
- "description": "Webhookをここで設定",
- "webhookLabel": "Webhook URL",
- "webhookPlaceholder": "https://your-server.com/webhook"
- },
- "testNotification": "テスト通知",
- "dialogDeleteTitle": "この通知を削除してもよろしいですか?",
- "dialogDeleteConfirm": "削除"
- },
- "notificationConfig": {
- "title": "通知",
- "description": "使用したい通知チャンネルを選択"
- },
- "monitorStatus": {
- "checkingEvery": "{{interval}}ごとにチェック",
- "withCaptureAgent": "Captureエージェント{{version}}で",
- "up": "アップ",
- "down": "ダウン",
- "paused": "一時停止"
- },
- "advancedMatching": "高度なマッチング",
- "sendTestNotifications": "テスト通知を送信",
- "selectAll": "すべて選択",
- "showAdminLoginLink": "ステータスページに「管理者?こちらでログイン」リンクを表示",
- "logsPage": {
- "title": "ログ",
- "description": "システムログ - 最新1000行",
- "tabs": {
- "queue": "ジョブキュー",
- "logs": "サーバーログ",
- "diagnostics": "診断"
- },
- "toast": {
- "fetchLogsSuccess": "ログが正常に取得されました"
},
- "logLevelSelect": {
- "title": "ログレベル",
- "values": {
- "all": "すべて",
- "info": "情報",
- "warn": "警告",
- "error": "エラー",
- "debug": "デバッグ"
+ "notifications": {
+ "fallback": {
+ "actionButton": "チャンネルを作成",
+ "checks": "Alert teams about downtime or performance issues,Let engineers know when incidents happen,Keep administrators informed of system changes",
+ "title": "通知チャンネルの用途:"
+ },
+ "form": {
+ "accessToken": {
+ "optionAccessToken": "アクセストークン",
+ "placeholder": "syt_YWxleF9ob2xsaWRheQ_VmtScmV0U2VjcmV0S2V5_abc123"
+ },
+ "address": {
+ "description": "通知の送信先アドレスです。",
+ "optionAddress": "アドレス",
+ "placeholderEmail": "example@example.com",
+ "placeholderWebhook": "https://your-server.com/webhook",
+ "title": "アドレス"
+ },
+ "homeServer": {
+ "optionHomeServer": "ホームサーバー",
+ "placeholder": "example.com"
+ },
+ "matrix": {
+ "description": "通知用のMatrixホームサーバー接続を設定します。",
+ "title": "Matrix設定"
+ },
+ "notificationName": {
+ "description": "通知チャンネルの説明的な名前",
+ "optionName": "チャンネル名",
+ "placeholder": "例: 本番アラート",
+ "title": "チャンネル名"
+ },
+ "pagerDuty": {
+ "description": "アラート受信用のPagerDutyインテグレーションキーです。",
+ "optionIntegrationKey": "インテグレーションキー",
+ "placeholder": "a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6",
+ "title": "インテグレーションキー"
+ },
+ "roomId": {
+ "optionRoomId": "ルームID",
+ "placeholder": "!abcdefg:matrix.org"
+ },
+ "type": {
+ "description": "作成する通知チャンネルの種類を選択してください。",
+ "optionType": "タイプ",
+ "title": "チャンネルタイプ"
+ },
+ "telegram": {
+ "title": "Telegram設定",
+ "description": "Telegram通知を有効にするには、Telegramボットを作成・管理するための公式ボットであるBotFatherを使用してTelegramボットを作成します。次に、APIトークンとチャットIDを取得してここに記入します。",
+ "optionBotToken": "ボットトークン",
+ "placeholderBotToken": "123456789:ABCdefGhIJKlmNoPQRsTUVwxyZ",
+ "optionChatId": "チャットID",
+ "placeholderChatId": "-1001234567890"
+ }
+ },
+ "table": {
+ "headers": {
+ "destination": "送信先"
+ }
}
- }
- },
- "queuePage": {
- "title": "キュー",
- "refreshButton": "更新",
- "flushButton": "キューをフラッシュ",
- "jobTable": {
- "title": "現在キューにあるジョブ",
- "idHeader": "モニターID",
- "urlHeader": "URL",
- "typeHeader": "タイプ",
- "activeHeader": "アクティブ",
- "lockedAtHeader": "ロック日時",
- "runCountHeader": "実行回数",
- "failCountHeader": "失敗回数",
- "lastRunHeader": "最終実行日時",
- "lastFinishedAtHeader": "最終完了日時",
- "lastRunTookHeader": "最終実行時間",
- "intervalHeader": ""
- },
- "metricsTable": {
- "title": "キューメトリック",
- "metricHeader": "メトリック",
- "valueHeader": "値"
- },
- "failedJobTable": {
- "title": "失敗したジョブ",
- "monitorIdHeader": "モニターID",
- "monitorUrlHeader": "モニターURL",
- "failCountHeader": "失敗回数",
- "failedAtHeader": "最終失敗日時",
- "failReasonHeader": "失敗理由"
- }
- },
- "export": {
- "title": "モニターをエクスポート",
- "success": "モニターが正常にエクスポートされました!",
- "failed": "モニターのエクスポートに失敗しました"
- },
- "monitorActions": {
- "title": "エクスポート/インポート",
- "import": "モニターをインポート",
- "export": "モニターをエクスポート",
- "deleteSuccess": "モニターが正常に削除されました",
- "deleteFailed": "モニターの削除に失敗しました",
- "details": "詳細"
- },
- "settingsPage": {
- "aboutSettings": {
- "labelDevelopedBy": "Bluewave Labsによる開発",
- "labelVersion": "バージョン",
- "title": "について"
- },
- "demoMonitorsSettings": {
- "buttonAddMonitors": "デモモニターを追加",
- "description": "デモンストレーション目的でサンプルモニターを追加。",
- "title": "デモモニター"
},
- "emailSettings": {
- "buttonSendTestEmail": "テストメールを送信",
- "description": "システムのメール設定を構成。これは通知とアラートの送信に使用されます。",
- "descriptionTransport": "これはNodeMailer用のSMTPトランスポートを構築します",
- "labelAddress": "メールアドレス - 認証に使用",
- "labelConnectionHost": "メール接続ホスト - HELO/EHLO挨拶で使用するホスト名",
- "labelHost": "メールホスト - 接続するホスト名またはIPアドレス",
- "labelIgnoreTLS": "STARTTLSを無効化: サーバーがサポートしていてもTLSを使用しない",
- "labelPassword": "メールパスワード - 認証用パスワード",
- "labelPasswordSet": "パスワードが設定されています。変更するにはリセットをクリック。",
- "labelPool": "接続プーリングを有効化: パフォーマンス向上のため既存接続を再利用",
- "labelPort": "メールポート - 接続するポート",
- "labelRejectUnauthorized": "無効な証明書を拒否: 自己署名または信頼されていない証明書での接続を拒否",
- "labelRequireTLS": "STARTTLSを強制: TLSアップグレードを必須とし、サポートされていない場合は失敗",
- "labelSecure": "SSL使用(推奨): SSL/TLSを使用して接続を暗号化",
- "labelTLSServername": "TLS Servername - ホストがIPの場合のTLS検証用オプションホスト名",
- "labelUser": "メールユーザー - 認証用ユーザー名、指定されている場合はメールアドレスを上書き",
- "linkTransport": "仕様はこちらを参照",
- "placeholderUser": "不要な場合は空白のまま",
- "title": "メール",
- "toastEmailRequiredFieldsError": "メールアドレス、ホスト、ポート、パスワードが必要です"
- },
- "pageSpeedSettings": {
- "description": "Google PageSpeed APIキーを入力してGoogle PageSpeed監視を有効化。キーを更新するにはリセットをクリック。",
- "labelApiKeySet": "APIキーが設定されています。変更するにはリセットをクリック。",
- "labelApiKey": "PageSpeed APIキー",
- "title": "Google PageSpeed APIキー"
- },
- "saveButtonLabel": "保存",
- "statsSettings": {
- "clearAllStatsButton": "すべての統計をクリア",
- "clearAllStatsDescription": "すべての統計をクリア。この操作は元に戻せません。",
- "clearAllStatsDialogConfirm": "はい、すべての統計をクリア",
- "clearAllStatsDialogDescription": "削除されると、監視履歴と統計は復元できません。",
- "clearAllStatsDialogTitle": "すべての統計をクリアしますか?",
- "description": "履歴データを保持する期間を定義。既存のデータをすべてクリアすることもできます。",
- "labelTTL": "監視履歴を保持したい日数。",
- "labelTTLOptional": "0で無限",
- "title": "モニター履歴"
- },
- "systemResetSettings": {
- "buttonRemoveAllMonitors": "すべてのモニターを削除",
- "description": "システムからすべてのモニターを削除。",
- "dialogConfirm": "はい、すべてのモニターを削除",
- "dialogDescription": "削除されると、モニターは復元できません。",
- "dialogTitle": "すべてのモニターを削除しますか?",
- "title": "システムリセット"
- },
- "timezoneSettings": {
- "description": "アプリケーション全体で日付と時刻を表示するために使用するタイムゾーンを選択。",
- "label": "表示タイムゾーン",
- "title": "表示タイムゾーン"
- },
- "title": "設定",
- "uiSettings": {
- "description": "ライトモードとダークモードを切り替えるか、ユーザーインターフェース言語を変更。",
- "labelLanguage": "言語",
- "labelTheme": "テーマモード",
- "title": "外観"
- },
- "urlSettings": {
- "description": "公開ステータスページでモニターのIPアドレスまたはURLを表示。無効にすると、機密情報を保護するためモニター名のみが表示されます。",
- "label": "ステータスページでIP/URLを表示",
- "selectDisabled": "無効",
- "selectEnabled": "有効",
- "title": "ステータスページのモニターIP/URL"
- },
- "globalThresholds": {
- "title": "",
- "description": ""
- }
- },
- "statusPageCreate": {
- "buttonSave": "保存"
- },
- "incidentsOptionsHeaderFilterResolved": "解決済み",
- "settingsSave": "保存",
- "statusPageCreateAppearanceTitle": "外観",
- "confirmPassword": "パスワードの確認",
- "monitorHooks": {
- "failureAddDemoMonitors": "デモモニターの追加に失敗しました",
- "successAddDemoMonitors": "デモモニターが正常に追加されました"
- },
- "settingsAppearance": "外観",
- "settingsDisplayTimezone": "表示タイムゾーン",
- "settingsGeneralSettings": "一般設定",
- "incidentsOptionsHeaderTotalIncidents": "総インシデント",
- "statusPage": {
- "deleteSuccess": "ステータスページが正常に削除されました",
- "deleteFailed": "ステータスページの削除に失敗しました",
- "createSuccess": "ステータスページが正常に作成されました",
- "updateSuccess": "ステータスページが正常に更新されました",
- "generalSettings": "一般設定",
- "contents": "コンテンツ",
- "fallback": {
- "checks": [""],
- "title": "",
- "actionButton": ""
- }
- },
- "testNotificationsDisabled": "このモニターには通知が設定されていません。「設定」ボタンをクリックして追加する必要があります",
- "incidentsTableResolvedAt": "解決日時",
- "incidentsTableActionResolve": "解決",
- "checkHooks": {
- "failureResolveOne": "インシデントの解決に失敗しました。",
- "failureResolveAll": "すべてのインシデントの解決に失敗しました。",
- "failureResolveMonitor": ""
- },
- "checkFormError": "フォームでエラーを確認してください。",
- "diagnosticsPage": {
- "diagnosticDescription": "システム診断",
- "statsDescription": "システム統計",
- "gauges": {
- "heapAllocationTitle": "ヒープ割り当て",
- "heapAllocationSubtitle": "利用可能メモリの%",
- "heapUsageTitle": "ヒープ使用量",
- "heapUsageSubtitle": "利用可能メモリの%",
- "heapUtilizationTitle": "ヒープ利用率",
- "heapUtilizationSubtitle": "割り当て済みの%",
- "instantCpuUsageTitle": "瞬間CPU使用率",
- "instantCpuUsageSubtitle": "CPUが使用した1秒の%"
- },
- "stats": {
- "eventLoopDelayTitle": "イベントループ遅延",
- "uptimeTitle": "稼働時間",
- "usedHeapSizeTitle": "使用ヒープサイズ",
- "totalHeapSizeTitle": "総ヒープサイズ",
- "osMemoryLimitTitle": "OSメモリ制限"
- }
- },
- "pageSpeedLighthouseAPI": "Lighthouse PageSpeed APIを使用してウェブサイトを監視",
- "time": {
- "threeMinutes": "3分",
- "fiveMinutes": "5分",
- "tenMinutes": "10分",
- "twentyMinutes": "20分",
- "oneHour": "1時間",
- "oneDay": "1日",
- "oneWeek": "1週間",
- "fourMinutes": "",
- "oneMinute": "",
- "twoMinutes": "",
- "fifteenSeconds": "",
- "thirtySeconds": ""
- },
- "general": {
- "noOptionsFound": ""
- },
- "infrastructureMonitor": {
- "fallback": {
- "checks": [""],
- "title": "",
- "actionButton": ""
- }
- },
- "maintenanceWindow": {
- "fallback": {
- "checks": [""],
- "title": "",
- "actionButton": ""
- }
- },
- "pageSpeed": {
- "fallback": {
- "checks": [""],
- "title": "",
- "actionButton": ""
- }
- },
- "uptimeMonitor": {
- "fallback": {
- "checks": [""],
- "title": "",
- "actionButton": ""
- }
- },
- "editUserPage": {
- "form": {
- "email": "",
- "firstName": "",
- "lastName": "",
- "role": "",
- "save": ""
- },
- "table": {
- "actionHeader": "",
- "roleHeader": ""
- },
- "title": "",
- "toast": {
- "successUserUpdate": "",
- "validationErrors": ""
- }
- },
- "incidentsPageActionResolveMonitor": "",
- "incidentsPageActionResolveAll": "",
- "matchMethodOptions": {
- "equal": "",
- "equalPlaceholder": "",
- "include": "",
- "includePlaceholder": "",
- "regex": "",
- "regexPlaceholder": "",
- "text": ""
- },
- "monitorType": {
- "docker": {
- "label": "",
- "namePlaceholder": "",
- "placeholder": ""
- },
- "http": {
- "label": "",
- "namePlaceholder": "",
- "placeholder": ""
+ "pageSpeed": {
+ "charts": {
+ "common": {
+ "cls": "Cumulative Layout Shift (CLS)",
+ "fcp": "First Contentful Paint (FCP)",
+ "lcp": "Largest Contentful Paint (LCP)",
+ "si": "Speed Index (SI)",
+ "tbt": "Total Blocking Time (TBT)"
+ },
+ "legend": {
+ "title": "PageSpeedレポート",
+ "weight": "重み"
+ },
+ "pie": {
+ "title": "パフォーマンスレポート"
+ }
+ },
+ "table": {
+ "headers": {
+ "pageSpeedScore": "PageSpeedスコア"
+ }
+ },
+ "fallback": {
+ "actionButton": "モニターを作成!",
+ "checks": "Report on the user experience of a page,Help analyze webpage speed,Give suggestions on how the page can be improved",
+ "title": "PageSpeedモニターの用途:"
+ }
},
- "ping": {
- "label": "",
- "namePlaceholder": "",
- "placeholder": ""
+ "settings": {
+ "form": {
+ "timezone": {
+ "title": "表示タイムゾーン",
+ "description": "アプリケーション全体で日時の表示に使用するタイムゾーンを選択してください。",
+ "option": {
+ "timezone": {
+ "label": "表示タイムゾーン"
+ }
+ }
+ },
+ "ui": {
+ "title": "外観",
+ "description": "ライトモードとダークモードの切り替え、言語の変更、またはチャート表示タイプのカスタマイズができます。",
+ "option": {
+ "theme": {
+ "label": "テーマモード",
+ "light": "ライト",
+ "dark": "ダーク"
+ },
+ "language": {
+ "label": "言語"
+ },
+ "chartType": {
+ "label": "チャートタイプ",
+ "histogram": "ヒストグラム",
+ "heatmap": "ヒートマップ"
+ }
+ }
+ },
+ "pagespeed": {
+ "title": "Google PageSpeed APIキー",
+ "description": "Google PageSpeed監視を有効にするにはGoogle PageSpeed APIキーを入力してください。キーを更新するにはリセットをクリックしてください。",
+ "option": {
+ "apiKey": {
+ "label": "PageSpeed APIキー",
+ "labelSet": "APIキーが設定されています。変更するにはリセットをクリックしてください。",
+ "placeholder": "Google PageSpeed APIキーを入力"
+ }
+ }
+ },
+ "url": {
+ "title": "ステータスページにモニターのIP/URLを表示",
+ "description": "公開ステータスページにモニターのIPアドレスまたはURLを表示します。無効の場合、機密情報を保護するためにモニター名のみが表示されます。",
+ "option": {
+ "showURL": {
+ "label": "ステータスページにIP/URLを表示",
+ "enabled": "有効",
+ "disabled": "無効"
+ }
+ }
+ },
+ "stats": {
+ "title": "モニター履歴",
+ "description": "チームのすべての監視履歴と統計をクリアします。この操作は元に戻せません。",
+ "option": {
+ "clear": {
+ "label": "すべての統計をクリアします。この操作は元に戻せません。"
+ }
+ },
+ "dialog": {
+ "title": "すべての監視履歴をクリアしますか?",
+ "description": "この操作は元に戻せません"
+ }
+ },
+ "retention": {
+ "title": "チェックデータの保持",
+ "description": "チェックデータが自動クリーンアップされるまでの保持期間を設定します。",
+ "option": {
+ "days": {
+ "label": "保持期間(日数)",
+ "unlimited": "無制限"
+ }
+ }
+ },
+ "thresholds": {
+ "title": "グローバルしきい値",
+ "description": "インフラストラクチャ監視のグローバルなCPU、メモリ、ディスク、温度しきい値を設定します。オーバーライドしない限り、すべてのハードウェアモニターに適用されます。",
+ "option": {
+ "cpu": {
+ "label": "CPUしきい値(%)",
+ "placeholder": "1 - 100"
+ },
+ "memory": {
+ "label": "メモリしきい値(%)",
+ "placeholder": "1 - 100"
+ },
+ "disk": {
+ "label": "ディスクしきい値(%)",
+ "placeholder": "1 - 100"
+ },
+ "temperature": {
+ "label": "温度しきい値(°C)",
+ "placeholder": "1 - 150"
+ }
+ }
+ },
+ "email": {
+ "title": "メール設定",
+ "description": "システムのメール設定を構成します。通知とアラートの送信に使用されます。",
+ "descriptionTransport": "これはNodeMailer用のSMTPトランスポートを構築します",
+ "descriptionTransportLink": "仕様はこちらを参照",
+ "option": {
+ "host": {
+ "label": "メールホスト - 接続先のホスト名またはIPアドレス",
+ "placeholder": "smtp.gmail.com"
+ },
+ "port": {
+ "label": "メールポート - 接続先のポート",
+ "placeholder": "587"
+ },
+ "address": {
+ "label": "メールアドレス - 認証に使用",
+ "placeholder": "you@example.com"
+ },
+ "user": {
+ "label": "メールユーザー - 認証用のユーザー名、指定時はメールアドレスを上書き",
+ "placeholder": "不要な場合は空欄のまま"
+ },
+ "password": {
+ "label": "メールパスワード - 認証用のパスワード",
+ "labelSet": "パスワードが設定されています。変更するにはリセットをクリックしてください。",
+ "placeholder": "パスワードを入力"
+ },
+ "tlsServername": {
+ "label": "TLSサーバー名 - ホストがIPの場合のTLS検証用オプションホスト名",
+ "placeholder": "example.com"
+ },
+ "connectionHost": {
+ "label": "メール接続ホスト - HELO/EHLOグリーティングで使用するホスト名",
+ "placeholder": "localhost"
+ },
+ "secure": {
+ "label": "SSLを使用(推奨): SSL/TLSで接続を暗号化"
+ },
+ "pool": {
+ "label": "接続プーリングを有効化: 既存の接続を再利用してパフォーマンスを向上"
+ },
+ "ignoreTLS": {
+ "label": "STARTTLSを無効化: サーバーがサポートしていてもTLSを使用しない"
+ },
+ "requireTLS": {
+ "label": "STARTTLSを強制: TLSアップグレードを要求、未サポート時は失敗"
+ },
+ "rejectUnauthorized": {
+ "label": "無効な証明書を拒否: 自己署名または信頼されていない証明書の接続を拒否"
+ }
+ }
+ },
+ "demoMonitors": {
+ "title": "デモモニター",
+ "description": "デモ目的でサンプルモニターを追加します。"
+ },
+ "removeMonitors": {
+ "title": "システムリセット",
+ "description": "システムからすべてのモニターを削除します。",
+ "dialog": {
+ "title": "すべてのモニターを削除しますか?",
+ "description": "この操作は元に戻せません。"
+ }
+ },
+ "exportMonitors": {
+ "title": "モニターをエクスポート"
+ },
+ "importExportMonitors": {
+ "title": "モニターのインポート/エクスポート",
+ "description": "バックアップまたは転送のために、モニターデータをJSONファイルとしてインポートまたはエクスポートします。"
+ },
+ "about": {
+ "title": "概要",
+ "developedBy": "Bluewave Labsが開発"
+ },
+ "validation": {
+ "errorMessage": "以下のバリデーションエラーを修正してください:"
+ }
+ }
},
- "port": {
- "label": "",
- "namePlaceholder": "",
- "placeholder": ""
+ "statusPages": {
+ "deleteSuccess": "ステータスページが正常に削除されました",
+ "fallback": {
+ "title": "ステータスページの用途:",
+ "checks": "Communicate system status to users and stakeholders,Display real-time uptime information publicly,Build trust with transparent service monitoring,Reduce support requests during incidents",
+ "actionButton": "ステータスページを作成!"
+ },
+ "monitorsList": {
+ "chartTypeHeatmap": "ヒートマップ",
+ "chartTypeHistogram": "ヒストグラム",
+ "noData": "データがありません",
+ "infrastructure": {
+ "title": "インフラストラクチャ",
+ "cpu": "CPU",
+ "memory": "RAM",
+ "memoryText": "メモリ",
+ "disk": "ディスク",
+ "usage": "使用量",
+ "used": "使用済み",
+ "total": "合計"
+ },
+ "uptime": {
+ "title": "稼働時間",
+ "responseTime": "応答時間"
+ }
+ },
+ "statusBar": {
+ "allDown": "すべてのシステムがダウンしています",
+ "allUp": "すべてのシステムが正常に稼働しています",
+ "degraded": "一部のシステムに問題が発生しています",
+ "unknown": "システムステータスを判定できません"
+ },
+ "table": {
+ "headers": {
+ "name": "ステータスページ名",
+ "url": "公開URL"
+ },
+ "published": "公開済み",
+ "unpublished": "未公開"
+ },
+ "title": "ステータスページ",
+ "details": {
+ "empty": {
+ "title": "まだ何もありません",
+ "addMonitor": "開始するにはモニターを追加してください"
+ }
+ },
+ "form": {
+ "access": {
+ "title": "アクセス",
+ "description": "ステータスページの準備ができたら、公開済みとしてマークできます。",
+ "option": {
+ "published": {
+ "name": "公開済みで一般に表示"
+ }
+ }
+ },
+ "basicInfo": {
+ "title": "基本情報",
+ "description": "会社名とステータスページが指すサブドメインを定義します。",
+ "option": {
+ "name": {
+ "label": "会社名",
+ "placeholder": "Acme Inc."
+ },
+ "url": {
+ "label": "ステータスページのアドレス",
+ "placeholder": "my-status-page"
+ }
+ }
+ },
+ "monitors": {
+ "title": "モニター",
+ "description": "ステータスページに表示するモニターを選択してください。",
+ "noMonitors": "モニターが選択されていません",
+ "option": {
+ "monitors": {
+ "label": "モニターを選択",
+ "placeholder": "モニターを検索して選択..."
+ }
+ }
+ },
+ "timezone": {
+ "title": "タイムゾーン",
+ "description": "ステータスページの表示に使用するタイムゾーンを選択してください。",
+ "option": {
+ "timezone": {
+ "label": "タイムゾーン",
+ "placeholder": "タイムゾーンを選択..."
+ }
+ }
+ },
+ "appearance": {
+ "title": "外観",
+ "description": "公開ステータスページのデフォルトの外観を定義します。",
+ "option": {
+ "logo": {
+ "label": "ロゴ"
+ },
+ "color": {
+ "label": "ブランドカラー"
+ }
+ }
+ },
+ "features": {
+ "title": "機能",
+ "description": "ステータスページに表示する情報を設定します。",
+ "option": {
+ "showCharts": {
+ "label": "応答時間チャートを表示"
+ },
+ "showUptimePercentage": {
+ "label": "稼働率を表示"
+ },
+ "showAdminLoginLink": {
+ "label": "管理者ログインリンクを表示"
+ },
+ "showInfrastructure": {
+ "label": "インフラストラクチャメトリクスを表示"
+ }
+ }
+ }
+ }
},
- "game": {
- "label": "",
- "namePlaceholder": "",
- "placeholder": ""
- }
- },
- "uptimeAdvancedMatching": {
- "jsonPath": ""
- },
- "bytesPerSecond": "",
- "bytesReceived": "",
- "bytesSent": "",
- "chooseGame": "",
- "createMonitorPage": {
- "incidentConfigDescription": "",
- "incidentConfigStatusWindowLabel": "",
- "incidentConfigStatusWindowThresholdLabel": "",
- "incidentConfigTitle": "",
- "incidentConfigDescriptionV2": "",
- "incidentConfigStatusCheckNumber": "",
- "intervalTitle": "",
- "intervalDescription": ""
- },
- "dataRate": "",
- "dataReceived": "",
- "dataSent": "",
- "details": "",
- "drops": "",
- "errors": "",
- "errorsIn": "",
- "errorsOut": "",
- "gameServerMonitoring": "",
- "gameServerMonitoringDescription": "",
- "network": "",
- "networkDrops": "",
- "networkErrors": "",
- "networkInterface": "",
- "noNetworkStatsAvailable": "",
- "packetsPerSecond": "",
- "packetsReceived": "",
- "packetsReceivedRate": "",
- "packetsSent": "",
- "rate": "",
- "selectInterface": "",
- "v1": {
- "infrastructure": {
- "disk_selection_title": "ディスク選択",
- "disk_selection_info": "現在ディスクが検出されていません。",
- "disk_selection_description": "監視したい特定のディスクを選択してください。"
+ "uptime": {
+ "filters": {
+ "search": {
+ "placeholder": "モニターを検索..."
+ }
+ },
+ "table": {
+ "headers": {
+ "responseTime": "応答時間"
+ }
+ },
+ "fallback": {
+ "actionButton": "モニターを作成!",
+ "checks": "Check if websites or servers are online & responsive,Alert teams about downtime or performance issues,Monitor HTTP endpoints, pings, containers & ports,Track historical uptime and reliability trends",
+ "title": "稼働時間モニターの用途:"
+ }
}
}
}
diff --git a/client/src/locales/pt-BR.json b/client/src/locales/pt-BR.json
index 193c537883..9b292dd688 100644
--- a/client/src/locales/pt-BR.json
+++ b/client/src/locales/pt-BR.json
@@ -1,1140 +1,1305 @@
{
- "submit": "Enviar",
- "title": "Título",
- "distributedStatusHeaderText": "Cobertura em tempo real e em dispositivos reais",
- "distributedStatusSubHeaderText": "Impulsionado por milhões de dispositivos em todo o mundo, visualize o desempenho do sistema por região global, país ou cidade",
- "settingsDisabled": "Desabilitado",
- "settingsSuccessSaved": "Configurações salvas com sucesso",
- "settingsFailedToSave": "Falha ao salvar as configurações",
- "settingsStatsCleared": "Estatísticas limpas com sucesso",
- "settingsFailedToClearStats": "Falha ao limpar estatísticas",
- "settingsMonitorsDeleted": "Todos os monitores foram excluídos com sucesso",
- "settingsFailedToDeleteMonitors": "Falha ao excluir todos os monitores",
- "starPromptTitle": "Star Checkmate",
- "starPromptDescription": "Veja os últimos lançamentos e ajude a expandir a comunidade no GitHub",
- "https": "HTTPS",
- "http": "HTTP",
- "monitor": "monitor",
- "aboutus": "Sobre nós",
- "now": "Agora",
- "delete": "Deletar",
- "configure": "Configurar",
- "responseTime": "Tempo de resposta",
- "ms": "ms",
- "bar": "Bar",
- "area": "Área",
- "country": "PAÍS",
- "city": "CIDADE",
- "response": "RESPOSTA",
- "monitorStatusUp": "O monitor {name} ({url}) agora está ATIVO e respondendo",
- "monitorStatusDown": "O monitor {name} ({url}) está INATIVO e não está respondendo",
- "webhookSendSuccess": "Notificação de webhook enviada com sucesso",
- "webhookSendError": "Erro ao enviar notificação de webhook para {platform}",
- "webhookUnsupportedPlatform": "Plataforma não suportada: {platform}",
- "distributedRightCategoryTitle": "Monitor",
- "distributedStatusServerMonitors": "Monitores de servidor",
- "distributedStatusServerMonitorsDescription": "Monitorar o status dos servidores relacionados",
- "distributedUptimeCreateSelectURL": "Aqui você pode selecionar a URL do host, juntamente com o tipo de monitor.",
- "distributedUptimeCreateChecks": "Verificações para realizar",
- "distributedUptimeCreateChecksDescription": "Você sempre pode adicionar ou remover verificações depois de adicionar seu site.",
- "distributedUptimeCreateIncidentNotification": "Notificações de incidentes",
- "distributedUptimeCreateIncidentDescription": "Quando ocorrer um incidente, notifique os usuários.",
- "distributedUptimeCreateAdvancedSettings": "Configurações avançadas",
- "distributedUptimeDetailsNoMonitorHistory": "Ainda não há histórico de verificações para este monitor.",
- "distributedUptimeDetailsStatusHeaderUptime": "Uptime:",
- "distributedUptimeDetailsStatusHeaderLastUpdate": "Última atualização",
- "notifications": {
- "enableNotifications": "Habilitar notificações da {{platform}}",
- "testNotification": "Notificação de teste",
- "addOrEditNotifications": "Adicionar ou editar notificações",
- "slack": {
- "label": "Slack",
- "description": "Para habilitar as notificações do Slack, crie um aplicativo Slack e habilite os webhooks de entrada. Depois disso, basta fornecer a URL do webhook aqui.",
- "webhookLabel": "Webhook URL",
- "webhookPlaceholder": "https://hooks.slack.com/services/...",
- "webhookRequired": "A URL do webhook do Slack é necessária"
- },
- "discord": {
- "label": "Discord",
- "description": "Para enviar dados para um canal do Discord a partir do Checkmate por meio de notificações do Discord usando webhooks, você pode usar o recurso de Webhooks de entrada do Discord.",
- "webhookLabel": "Discord Webhook URL",
- "webhookPlaceholder": "https://discord.com/api/webhooks/...",
- "webhookRequired": "A URL do webhook do Discord é necessária"
+ "common": {
+ "auth": {
+ "roles": {
+ "admin": "Admin",
+ "demo": "Demo",
+ "superadmin": "Super admin",
+ "user": "Usuário"
+ }
},
- "telegram": {
- "label": "Telegram",
- "description": "Para habilitar as notificações do Telegram, crie um bot do Telegram usando o BotFather, um bot oficial para criar e gerenciar bots do Telegram. Em seguida, obtenha o token da API e o ID do chat e os coloque aqui.",
- "tokenLabel": "Seu token de bot",
- "tokenPlaceholder": "123456:ABC-DEF1234ghIkl-zyx57W2v1u123ew11",
- "chatIdLabel": "Seu ID de bate-papo",
- "chatIdPlaceholder": "-1001234567890",
- "fieldsRequired": "O token do Telegram e o ID do chat são necessários"
+ "alerts": {
+ "pageSpeedApiKey": {
+ "content": "Aviso: Você ainda não adicionou uma chave de API do Google PageSpeed. Acesse Configurações para adicionar uma. Sem ela, o monitor PageSpeed não funcionará."
+ }
},
- "webhook": {
- "label": "Webhooks",
- "description": "Você pode configurar um webhook personalizado para receber notificações quando ocorrerem incidentes.",
- "urlLabel": "Webhook URL",
- "urlPlaceholder": "https://seu-servidor.com/webhook",
- "urlRequired": "URL do webhook é necessária"
+ "appName": "Checkmate",
+ "breadcrumbs": {
+ "details": "Detalhes",
+ "home": "Início"
},
- "testNotificationDevelop": "Notificação de teste 2",
- "integrationButton": "Integração de notificação",
- "testSuccess": "Notificação de teste enviada com sucesso!",
- "testFailed": "Falha ao enviar notificação de teste",
- "unsupportedType": "Tipo de notificação não suportado",
- "networkError": "Ocorreu um erro de rede",
- "fallback": {
- "title": "Um canal de notificação é usado para:",
- "checks": [
- "Alerte as equipes sobre tempo de inatividade ou problemas de desempenho",
- "Informe os engenheiros sobre incidentes",
- "Mantenha os administradores informados sobre as mudanças no sistema"
- ],
- "actionButton": "Vamos criar seu primeiro canal de notificação!"
+ "buttons": {
+ "addMember": "Adicionar membro",
+ "cancel": "Cancelar",
+ "close": "Fechar",
+ "configure": "Configurar",
+ "confirm": "Confirmar",
+ "create": "Criar",
+ "delete": "Excluir",
+ "generateToken": "Gerar token",
+ "incidents": "Incidentes",
+ "inviteMember": "Convidar membro",
+ "pause": "Pausar",
+ "resume": "Retomar",
+ "save": "Salvar",
+ "sendInvite": "Enviar convite",
+ "test": "Testar",
+ "testNotifications": "Testar notificações",
+ "toggleTheme": "Trocar claro e escuro",
+ "flushQueue": "Limpar fila",
+ "notFound": "Ir para o painel principal",
+ "resetPassword": "Redefinir senha",
+ "reset": "Resetar",
+ "clear": "Limpar",
+ "addDemo": "Adicionar monitores demo",
+ "removeMonitors": "Remover monitores",
+ "sendTestEmail": "Enviar email de teste",
+ "exportToJSON": "Exportar para JSON",
+ "importFromJSON": "Importar de JSON",
+ "clearFilters": "Limpar filtros",
+ "removeUser": "Remover usuário"
},
- "createButton": "Criar canal de notificação",
- "createTitle": "Canal de notificação",
- "create": {
- "success": "Notificação criada com sucesso",
- "failed": "Falha ao criar notificação"
+ "charts": {
+ "labels": {
+ "averageResponseTime": "Tempo médio de resposta",
+ "downtime": "Tempo inativo",
+ "high": "alto",
+ "low": "baixo",
+ "uptime": "Uptime"
+ },
+ "histogram": {
+ "avg": "Média: {{value}} ms",
+ "max": "Máx: {{value}} ms"
+ }
},
- "fetch": {
- "success": "Notificações obtidas com sucesso",
- "failed": "Falha ao buscar notificações"
+ "dialogs": {
+ "delete": {
+ "description": "Esta ação não pode ser desfeita.",
+ "title": "Tem certeza de que deseja excluir isto?"
+ }
},
- "delete": {
- "success": "Notificação excluída com sucesso",
- "failed": "Falha ao excluir a notificação"
+ "labels": {
+ "active": "Ativo",
+ "paused": "pausado",
+ "na": "N/D",
+ "resolved": "Resolvido",
+ "responseTime": "Tempo de resposta"
},
- "edit": {
- "success": "Notificação atualizada com sucesso",
- "failed": "Falha ao atualizar a notificação"
+ "form": {
+ "role": {
+ "option": {
+ "role": {
+ "label": "Funções"
+ }
+ }
+ },
+ "name": {
+ "option": {
+ "firstName": {
+ "label": "Nome",
+ "placeholder": "João"
+ },
+ "lastName": {
+ "label": "Sobrenome",
+ "placeholder": "Silva"
+ }
+ }
+ },
+ "email": {
+ "option": {
+ "email": {
+ "label": "Email",
+ "placeholder": "voce@exemplo.com"
+ }
+ }
+ }
},
- "test": {
- "success": "Notificação de teste enviada com sucesso",
- "failed": "Falha ao enviar notificação de teste"
+ "table": {
+ "empty": "Nada aqui",
+ "headers": {
+ "actions": "Ações",
+ "dateTime": "Data e hora",
+ "message": "Mensagem",
+ "monitor": "Monitor",
+ "monitorId": "ID do monitor",
+ "name": "Nome",
+ "status": "Status",
+ "type": "Tipo",
+ "url": "URL",
+ "interval": "Intervalo",
+ "active": "Ativo",
+ "responseTime": "Tempo de resposta"
+ }
}
},
- "testLocale": "testLocale",
- "add": "Adicionar",
- "monitors": "monitores",
- "distributedUptimeStatusCreateStatusPage": "Pagina de status",
- "distributedUptimeStatusCreateStatusPageAccess": "Acesso",
- "distributedUptimeStatusCreateStatusPageReady": "Se sua página de status estiver pronta, você pode marcá-la como publicada.",
- "distributedUptimeStatusBasicInfoHeader": "Informação básica",
- "distributedUptimeStatusBasicInfoDescription": "Defina o nome da empresa e o subdomínio para o qual sua página de status aponta.",
- "distributedUptimeStatusLogoHeader": "Logo",
- "distributedUptimeStatusLogoDescription": "Carregue um logo para sua página de status",
- "distributedUptimeStatusLogoUploadButton": "Upload logo",
- "distributedUptimeStatusStandardMonitorsHeader": "Monitores padrão",
- "distributedUptimeStatusStandardMonitorsDescription": "Anexe monitores padrão à sua página de status.",
- "distributedUptimeStatusCreateYour": "Crie o seu",
- "distributedUptimeStatusEditYour": "Edite seu",
- "distributedUptimeStatusPublishedLabel": "Publicado e visível ao público",
- "distributedUptimeStatusCompanyNameLabel": "Nome da empresa",
- "distributedUptimeStatusPageAddressLabel": "Endereço da sua página de status",
- "distributedUptimeStatus30Days": "30 dias",
- "distributedUptimeStatus60Days": "60 dias",
- "distributedUptimeStatus90Days": "90 dias",
- "distributedUptimeStatusPageNotSetUp": "Uma página de status não está configurada.",
- "distributedUptimeStatusContactAdmin": "Entre em contato com seu administrador",
- "distributedUptimeStatusPageNotPublic": "Esta página de status não é pública.",
- "distributedUptimeStatusPageDeleteDialog": "Você quer excluir esta página de status?",
- "distributedUptimeStatusPageDeleteConfirm": "Sim, excluir página de status",
- "distributedUptimeStatusPageDeleteDescription": "Uma vez excluída, sua página de status não poderá ser recuperada.",
- "distributedUptimeStatusDevices": "Dispositivos",
- "distributedUptimeStatusUpt": "UPT",
- "distributedUptimeStatusUptBurned": "UPT queimado",
- "distributedUptimeStatusUptLogo": "Logo UPT",
- "incidentsTableNoIncidents": "Nenhum incidente registrado",
- "incidentsTablePaginationLabel": "incidentes",
- "incidentsTableMonitorName": "Nome do monitor",
- "incidentsTableStatus": "Status",
- "incidentsTableDateTime": "Data & Hora",
- "incidentsTableStatusCode": "Código de status",
- "incidentsTableMessage": "Mensagem",
- "incidentsOptionsHeader": "Incidentes para:",
- "incidentsOptionsHeaderFilterBy": "Filtrar por:",
- "incidentsOptionsHeaderFilterAll": "Todos",
- "incidentsOptionsHeaderFilterDown": "Inativos",
- "incidentsOptionsHeaderFilterCannotResolve": "Não é possível resolver",
- "incidentsOptionsHeaderShow": "Mostrar:",
- "incidentsOptionsHeaderLastHour": "Última hora",
- "incidentsOptionsHeaderLastDay": "Último dia",
- "incidentsOptionsHeaderLastWeek": "Ultima semana",
- "incidentsOptionsPlaceholderAllServers": "Todos os servidores",
- "infrastructureCreateYour": "Crie o seu",
- "infrastructureCreateGeneralSettingsDescription": "Aqui você pode inserir a URL do host, juntamente com o nome de exibição e o API secret de autorização para se conectar ao agente do servidor.",
- "infrastructureServerRequirement": "O servidor que você quer monitorar deve estar executando o",
- "infrastructureCustomizeAlerts": "Personalize alertas",
- "infrastructureAlertNotificationDescription": "Envie uma notificação ao(s) usuário(s) quando os limites excederem uma porcentagem especificada.",
- "infrastructureCreateMonitor": "Criar monitor de infraestrutura",
- "infrastructureProtocol": "Protocolo",
- "infrastructureServerUrlLabel": "URL do servidor",
- "infrastructureDisplayNameLabel": "Nome de exibição",
- "infrastructureAuthorizationSecretLabel": "API Secret",
- "gb": "GB",
- "mb": "MB",
- "mem": "Mem",
- "memoryUsage": "Uso de memória",
- "cpu": "CPU",
- "cpuUsage": "Uso da CPU",
- "cpuTemperature": "Temperatura da CPU",
- "diskUsage": "Uso de disco",
- "used": "Usado",
- "total": "Total",
- "cores": "Núcleos",
- "frequency": "Frequência",
- "status": "Status",
- "cpuPhysical": "CPU (Física)",
- "cpuLogical": "CPU (Lógica)",
- "cpuFrequency": "Frequência da CPU",
- "avgCpuTemperature": "Temperatura média da CPU",
- "memory": "Memória",
- "disk": "Disco",
- "uptime": "Uptime",
- "os": "OS",
- "host": "Host",
- "actions": "Ações",
- "integrations": "Integrações",
- "integrationsPrism": "Conecte o Prism ao seu serviço favorito.",
- "integrationsSlack": "Slack",
- "integrationsSlackInfo": "Conecte-se com o Slack e veja incidentes em um canal",
- "integrationsDiscord": "Discord",
- "integrationsDiscordInfo": "Conecte-se com o Discord e visualize incidentes diretamente em um canal",
- "integrationsZapier": "Zapier",
- "integrationsZapierInfo": "Envie todos os incidentes para o Zapier e veja-os em todos os lugares",
- "commonSave": "Salvar",
- "createYour": "Crie o seu",
- "createMonitor": "Criar monitor",
- "pause": "Pausar",
- "resume": "Resumir",
- "editing": "Editando...",
- "url": "URL",
- "access": "Acesso",
- "timezone": "Fuso horário",
- "features": "Recursos",
- "administrator": "Administrador?",
- "loginHere": "Login aqui",
- "displayName": "Nome de exibição",
- "urlMonitor": "URL do monitor",
- "portToMonitor": "Porta do monitor",
- "websiteMonitoring": "Monitoramento de sites",
- "websiteMonitoringDescription": "Use HTTP(s) para monitorar seu site ou API endpoint.",
- "pingMonitoring": "Monitoramento de ping",
- "pingMonitoringDescription": "Verifique se o seu servidor está disponível ou não.",
- "dockerContainerMonitoring": "Monitoramento de contêiner Docker",
- "dockerContainerMonitoringDescription": "Verifique se o seu contêiner Docker está em execução ou não.",
- "portMonitoring": "Monitoramento de porta",
- "portMonitoringDescription": "Verifique se sua porta está aberta ou não.",
- "createMaintenanceWindow": "Criar janela de manutenção",
- "createMaintenance": "Criar manutenção",
- "editMaintenance": "Editar manutenção",
- "maintenanceWindowName": "Nome da janela de manutenção",
- "friendlyNameInput": "Nome amigável",
- "friendlyNamePlaceholder": "Manutenção em __ : __ por ___ minutos",
- "maintenanceRepeat": "Repetição de manutenção",
- "maintenance": "manutenção",
- "duration": "Duração",
- "addMonitors": "Adicionar monitores",
- "window": "janela",
- "cancel": "Cancelar",
- "message": "Mensagem",
- "low": "baixo",
- "high": "alto",
- "statusCode": "Código de status",
- "date&Time": "Data & Hora",
- "type": "Tipo",
- "statusPageName": "Nome da página de status",
- "publicURL": "URL publica",
- "repeat": "Repetir",
- "edit": "Editar",
- "createA": "Crie um",
- "remove": "Remover",
- "maintenanceWindowDescription": "Seus pings não serão enviados durante esse período",
- "startTime": "Hora de início",
- "timeZoneInfo": "Todas as datas e horários estão no fuso horário GMT+0.",
- "monitorsToApply": "Monitores para aplicar a janela de manutenção",
- "nextWindow": "Próxima janela",
- "notFoundButton": "Vá para o painel principal",
- "pageSpeedConfigureSettingsDescription": "Aqui você pode selecionar a URL do host, juntamente com o tipo de monitor.",
- "monitorDisplayName": "Nome de exibição do monitor",
- "whenNewIncident": "Quando há um novo incidente,",
- "notifySMS": "Notificar via SMS (em breve)",
- "notifyEmails": "Também notificar por e-mail para vários endereços (em breve)",
- "seperateEmails": "Você pode separar vários e-mails com uma vírgula",
- "checkFrequency": "Verifique a frequência",
- "matchMethod": "Método de correspondência",
- "expectedValue": "Valor esperado",
- "deleteDialogTitle": "Você realmente deseja excluir este monitor?",
- "deleteDialogDescription": "Uma vez excluído, este monitor não poderá ser recuperado.",
- "pageSpeedMonitor": "Monitor PageSpeed",
- "shown": "Mostrado",
- "ago": "atrás",
- "companyName": "Nome da empresa",
- "pageSpeedDetailsPerformanceReport": "Os valores são estimados e podem variar.",
- "pageSpeedDetailsPerformanceReportCalculator": "Veja calculadora",
- "checkingEvery": "Verificando a cada",
- "statusPageCreateSettings": "Se sua página de status estiver pronta, você pode marcá-la como publicada.",
- "basicInformation": "Informações Básicas",
- "statusPageCreateBasicInfoDescription": "Defina o nome da empresa e o subdomínio para o qual sua página de status aponta.",
- "statusPageCreateSelectTimeZoneDescription": "Selecione o fuso horário em que será exibido na sua página de status.",
- "statusPageCreateAppearanceDescription": "Defina a aparência padrão da sua página de status pública.",
- "statusPageCreateSettingsCheckboxLabel": "Publicado e visível ao público",
- "statusPageCreateBasicInfoStatusPageAddress": "Endereço da sua página de status",
- "statusPageCreateTabsContent": "Servidores de páginas de status",
- "statusPageCreateTabsContentDescription": "Você pode adicionar quantos monitores quiser à sua página de status. Você também pode reordená-los para uma melhor experiência de visualização.",
- "statusPageCreateTabsContentFeaturesDescription": "Mostrar mais detalhes na página de status",
- "showCharts": "Mostrar gráficos",
- "showUptimePercentage": "Mostrar porcentagem de Uptime",
- "removeLogo": "Remover logo",
- "statusPageStatus": "Uma página de status pública não está configurada.",
- "statusPageStatusContactAdmin": "Entre em contato com seu administrador",
- "statusPageStatusNotPublic": "Esta página de status não é pública.",
- "statusPageStatusNoPage": "Não há página de status aqui.",
- "statusPageStatusServiceStatus": "Status do serviço",
- "deleteStatusPage": "Você quer excluir esta página de status?",
- "deleteStatusPageConfirm": "Sim, excluir página de status",
- "deleteStatusPageDescription": "Uma vez excluída, sua página de status não poderá ser recuperada.",
- "uptimeCreate": "O valor esperado é usado para corresponder ao resultado da resposta, e a correspondência determina o status.",
- "uptimeCreateJsonPath": "Esta expressão será avaliada em relação aos dados JSON de resposta e o resultado será usado para corresponder ao valor esperado. Veja",
- "uptimeCreateJsonPathQuery": "para documentação de linguagem de consulta.",
- "maintenanceTableActionMenuDialogTitle": "Você realmente deseja remover esta janela de manutenção?",
- "infrastructureEditYour": "Edite seu",
- "infrastructureEditMonitor": "Salvar Monitor de Infraestrutura",
- "infrastructureMonitorCreated": "Monitor de infraestrutura criado com sucesso!",
- "infrastructureMonitorUpdated": "Monitor de infraestrutura atualizado com sucesso!",
- "errorInvalidTypeId": "Tipo de notificação fornecido inválido",
- "errorInvalidFieldId": "ID do campo fornecido inválido",
- "inviteNoTokenFound": "Nenhum token de convite encontrado",
- "pageSpeedWarning": "Aviso: você ainda não adicionou uma chave de API do Google PageSpeed. Sem ela, o monitor PageSpeed não funcionará.",
- "pageSpeedLearnMoreLink": "Clique aqui",
- "pageSpeedAddApiKey": "para adicionar sua chave de API.",
- "update": "Atualizar",
- "invalidFileFormat": "Formato de arquivo não suportado!",
- "invalidFileSize": "O tamanho do arquivo é muito grande!",
- "ClickUpload": "Clique para enviar",
- "DragandDrop": "arraste e solte",
- "MaxSize": "Tamanho Máximo",
- "SupportedFormats": "Formatos suportados",
- "FirstName": "Nome",
- "LastName": "Sobrenome",
- "EmailDescriptionText": "Este é seu endereço de e-mail atual — ele não pode ser alterado.",
- "YourPhoto": "Foto de perfil",
- "PhotoDescriptionText": "Esta foto será exibida na sua página de perfil.",
- "save": "Salvar",
- "DeleteDescriptionText": "Isso removerá a conta e todos os dados associados do servidor. Essa ação não é reversível.",
- "DeleteAccountWarning": "Remover sua conta significa que você não poderá fazer login novamente e todos os seus dados serão removidos. Isso não é reversível.",
- "DeleteWarningTitle": "Deseja realmente remover esta conta?",
- "bulkImport": {
- "title": "Bulk Import",
- "selectFileTips": "Selecione o arquivo CSV para enviar",
- "selectFileDescription": "Você pode baixar nosso modelo ou amostra",
- "selectFile": "Selecione o arquivo",
- "parsingFailed": "Falha na análise",
- "uploadSuccess": "Monitores criados com sucesso!",
- "validationFailed": "Falha na validação",
- "noFileSelected": "Nenhum arquivo selecionado",
- "fallbackPage": "Importe um arquivo para enviar uma lista de servidores em massa",
- "invalidFileType": "Tipo de arquivo inválido",
- "uploadFailed": "Falha no upload"
- },
- "DeleteAccountTitle": "Remover conta",
- "DeleteAccountButton": "Remover conta",
- "publicLink": "Link publico",
- "maskedPageSpeedKeyPlaceholder": "*************************************",
- "reset": "Resetar",
- "ignoreTLSError": "Ignorar erro TLS/SSL",
- "tlsErrorIgnored": "Erros TLS/SSL ignorados",
- "ignoreTLSErrorDescription": "Ignore os erros de TLS/SSL e continue verificando a disponibilidade do site",
- "createNew": "Criar novo",
- "greeting": {
- "prepend": "Ei",
- "append": "A tarde é seu playground — vamos torná-la épica!",
- "overview": "Aqui está uma visão geral dos seus monitores {{type}}."
- },
- "roles": {
- "superAdmin": "Super Admin",
- "admin": "Admin",
- "teamMember": "Membro da equipe",
- "demoUser": "Usuário demo"
- },
- "teamPanel": {
- "teamMembers": "Membros da equipe",
- "filter": {
- "all": "Todos",
- "member": "Membro"
+ "components": {
+ "imageUpload": {
+ "clickToUpload": "Clique para enviar",
+ "dragAndDrop": "arraste e solte",
+ "supportedFormats": "Formatos suportados",
+ "maxSize": "Tamanho Máximo",
+ "orDragAndDrop": "ou arraste e solte",
+ "errors": {
+ "invalidFileSize": "O tamanho do arquivo é muito grande!",
+ "invalidFileFormat": "Formato de arquivo não suportado!"
+ }
},
- "inviteTeamMember": "Convidar um membro da equipe",
- "inviteNewTeamMember": "Convidar novo membro da equipe",
- "inviteDescription": "Ao adicionar um novo membro da equipe, ele terá acesso a todos os monitores.",
- "email": "E-mail",
- "selectRole": "Selecione a cargo",
- "inviteLink": "Link de convite",
- "cancel": "Cancelar",
- "noMembers": "Não há membros da equipe com este cargo",
- "getToken": "Obter token",
- "emailToken": "Token de e-mail",
- "table": {
- "name": "Nome",
- "email": "E-mail",
- "role": "Cargo",
- "created": "Criado"
+ "headerStatusPageControls": {
+ "publicLink": "Link publico"
},
- "addTeamMember": {
- "addMemberMenu": "",
- "title": "",
- "description": "",
- "addButton": ""
+ "headerTimeRange": {
+ "labels": {
+ "day": "Dia",
+ "month": "Mês",
+ "recent": "Recente",
+ "week": "Semana"
+ },
+ "description": {
+ "recent": "Exibindo estatísticas das últimas 2 horas.",
+ "day": "Exibindo estatísticas das últimas 24 horas.",
+ "week": "Exibindo estatísticas dos últimos 7 dias.",
+ "month": "Exibindo estatísticas dos últimos 30 dias."
+ }
},
- "register": "",
- "registerToast": {
- "success": "",
- "dbUserExists": "",
- "unknownError": ""
+ "offlineBanner": {
+ "serverUnreachable": "Não foi possível conectar ao servidor",
+ "retry": "Tentar novamente",
+ "retrying": "Tentando novamente...",
+ "reconnected": "Reconectado ao servidor com sucesso."
},
- "registerTeamMember": {
- "title": "",
- "auth": {
- "common": {
- "inputs": {
- "firstName": {
- "errors": {
- "empty": "",
- "pattern": ""
- }
- },
- "lastName": {
- "errors": {
- "empty": "",
- "pattern": ""
- }
+ "sidebar": {
+ "menu": {
+ "uptime": "Uptime",
+ "pagespeed": "Pagespeed",
+ "infrastructure": "Infraestrutura",
+ "notifications": "Notificações",
+ "checks": "Verificações",
+ "incidents": "Incidentes",
+ "statusPages": "Pagina de status",
+ "maintenance": "Manutenção",
+ "logs": "Registros",
+ "settings": "Configurações"
+ },
+ "bottomMenu": {
+ "support": "Suporte",
+ "discussions": "Discussões",
+ "docs": "Docs",
+ "changelog": "Changelog"
+ },
+ "accountMenu": {
+ "profile": "Perfil",
+ "password": "Senha",
+ "team": "Equipe"
+ },
+ "starPrompt": {
+ "title": "Avalie o Checkmate",
+ "description": "Veja os últimos lançamentos e ajude a comunidade a crescer no GitHub"
+ },
+ "authFooter": {
+ "navControls": "Controles",
+ "logOut": "Sair",
+ "roles": {
+ "superAdmin": "Super admin",
+ "admin": "Admin",
+ "user": "Usuário",
+ "demoUser": "Usuário demo"
+ }
+ }
+ },
+ "starPrompt": {
+ "title": "Avalie o Checkmate",
+ "description": "Veja os últimos lançamentos e ajude a comunidade a crescer no GitHub"
+ }
+ },
+ "pages": {
+ "notFound": {
+ "title": "Oh não! Você derrubou seu sushi!",
+ "subtitle": "A URL não existe ou você não tem acesso a ela."
+ },
+ "account": {
+ "tabs": {
+ "profile": "Perfil",
+ "password": "Senha",
+ "team": "Equipe"
+ },
+ "form": {
+ "name": {
+ "title": "Nome",
+ "description": "Atualize suas informações pessoais"
+ },
+ "photo": {
+ "title": "Foto de perfil",
+ "description": "Envie uma foto de perfil"
+ },
+ "currentPassword": {
+ "title": "Senha atual",
+ "description": "Digite sua senha atual para verificar sua identidade",
+ "option": {
+ "label": "Senha atual",
+ "placeholder": "Digite a senha atual"
+ }
+ },
+ "newPassword": {
+ "title": "Nova senha",
+ "description": "Escolha uma senha forte com pelo menos 8 caracteres",
+ "option": {
+ "newPassword": {
+ "label": "Nova senha",
+ "placeholder": "Digite a nova senha"
},
+ "confirm": {
+ "label": "Confirmar senha",
+ "placeholder": "Confirme a nova senha"
+ }
+ }
+ },
+ "deleteAccount": {
+ "title": "Excluir conta",
+ "description": "Esta ação é permanente e não pode ser desfeita"
+ }
+ },
+ "team": {
+ "filter": {
+ "placeholder": "Filtrar por função",
+ "all": "Todos",
+ "admin": "Admin",
+ "member": "Membro"
+ },
+ "table": {
+ "headers": {
+ "email": "Email",
+ "role": "Função",
+ "created": "Criado"
+ }
+ },
+ "addMember": {
+ "title": "Registrar novo membro da equipe",
+ "description": "Crie uma nova conta de usuário. Compartilhe as credenciais de forma segura após a criação."
+ },
+ "invite": {
+ "title": "Convidar membro da equipe",
+ "description": "Envie um convite para se juntar à sua equipe",
+ "email": {
+ "label": "Endereço de email",
+ "placeholder": "Digite o endereço de email"
+ },
+ "role": {
+ "label": "Função",
+ "placeholder": "Selecione uma função"
+ },
+ "linkLabel": "Link de convite"
+ }
+ }
+ },
+ "auth": {
+ "common": {
+ "passwordRules": {
+ "length": {
+ "beginning": "Deve ter no mínimo",
+ "highlighted": "8 caracteres de comprimento"
+ },
+ "lowercase": {
+ "beginning": "Deve ter pelo menos",
+ "highlighted": "uma letra minúscula"
+ },
+ "match": {
+ "beginning": "Senha e confirmação de senha",
+ "highlighted": "devem combinar"
+ },
+ "number": {
+ "beginning": "Deve ter pelo menos",
+ "highlighted": "um número"
+ },
+ "special": {
+ "beginning": "Deve conter pelo menos",
+ "highlighted": "um caractere especial"
+ },
+ "uppercase": {
+ "beginning": "Deve ter pelo menos",
+ "highlighted": "uma letra maiúscula"
+ }
+ },
+ "form": {
+ "option": {
"email": {
- "errors": {
- "empty": "",
- "invalid": ""
- }
+ "label": "Email",
+ "placeholder": "eu@exemplo.com"
},
- "role": {
- "errors": {
- "empty": ""
- }
+ "password": {
+ "label": "Senha",
+ "placeholder": "********"
+ },
+ "confirmPassword": {
+ "label": "Confirmar senha"
}
}
}
+ },
+ "login": {
+ "title": "Bem-vindo de volta ao Checkmate!",
+ "subtitle": "Faça login para continuar",
+ "submit": "Entrar",
+ "links": {
+ "forgotPassword": {
+ "text": "Esqueceu a senha?",
+ "linkText": "Redefinir senha"
+ },
+ "register": {
+ "text": "Não tem uma conta?",
+ "linkText": "Cadastre-se aqui"
+ }
+ }
+ },
+ "register": {
+ "title": "Bem-vindo ao Checkmate!",
+ "subtitle": "Cadastre-se para começar",
+ "submit": "Cadastrar"
+ },
+ "forgotPassword": {
+ "title": "Esqueceu sua senha?",
+ "subtitle": "Não se preocupe, enviaremos instruções de recuperação.",
+ "submit": "Solicitar recuperação",
+ "links": {
+ "login": {
+ "text": "Voltar para",
+ "linkText": "login"
+ }
+ }
+ },
+ "setNewPassword": {
+ "title": "Redefinir sua senha",
+ "subtitle": "Sua nova senha deve ser diferente das senhas usadas anteriormente."
}
},
- "role": "",
- "changeTeamPassword": {
- "changePasswordMenu": "",
- "title": "",
- "description": "",
- "success": ""
- }
- },
- "monitorState": {
- "paused": "Pausado",
- "resumed": "Retomado",
- "active": "Ativo"
- },
- "menu": {
- "uptime": "Uptime",
- "pagespeed": "Pagespeed",
- "infrastructure": "Infraestrutura",
- "incidents": "Incidentes",
- "statusPages": "Pagina de status",
- "maintenance": "Manutenção",
- "integrations": "Integrações",
- "settings": "Configurações",
- "support": "Suporte",
- "discussions": "Discussões",
- "docs": "Docs",
- "changelog": "Changelog",
- "profile": "Perfil",
- "password": "Senha",
- "team": "Equipe",
- "logOut": "Sair",
- "notifications": "Notificações",
- "logs": "Registros"
- },
- "settingsEmailUser": "Usuário de e-mail - Nome de usuário para autenticação, substitui o endereço de e-mail, se especificado",
- "state": "Estado",
- "statusBreadCrumbsStatusPages": "Pagina de status",
- "statusBreadCrumbsDetails": "Detalhes",
- "commonSaving": "Salvando...",
- "navControls": "Controles",
- "incidentsPageTitle": "Incidentes",
- "passwordPanel": {
- "passwordChangedSuccess": "Sua senha foi alterada com sucesso.",
- "passwordInputIncorrect": "Sua senha digitada está incorreta.",
- "currentPassword": "Senha atual",
- "enterCurrentPassword": "Digite sua senha atual",
- "newPassword": "Nova Senha",
- "enterNewPassword": "Digite sua nova senha",
- "confirmNewPassword": "Confirme a nova senha",
- "passwordRequirements": "A nova senha deve conter pelo menos 8 caracteres e deve ter pelo menos uma letra maiúscula, uma letra minúscula, um número e um caractere especial.",
- "saving": "Salvando..."
- },
- "emailSent": "E-mail enviado com sucesso",
- "failedToSendEmail": "Falha ao enviar e-mail",
- "settingsTestEmailSuccess": "E-mail de teste enviado com sucesso",
- "settingsTestEmailFailed": "Falha ao enviar e-mail de teste",
- "settingsTestEmailFailedWithReason": "Falha ao enviar e-mail de teste: {{reason}}",
- "settingsTestEmailUnknownError": "Erro desconhecido",
- "statusMsg": {
- "paused": "O monitoramento está pausado.",
- "up": "Seu site está no ar.",
- "down": "Seu site está fora do ar.",
- "pending": "Pendente..."
- },
- "uptimeGeneralInstructions": {
- "http": "Insira a URL ou IP para monitorar (ex. https://exemplo.com.br/ ou 192.168.1.100) e adicione uma descrição que aparecerá na dashboard.",
- "ping": "Insira o endereço IP ou nome de domínio para ping (ex. 192.168.1.100 ou exemplo.com.br) e adicione uma descrição que aparecerá na dashboard.",
- "docker": "Insira o Docker Id do seu container. Docker Ids devem ser todos os 64 caracteres. Você pode executar docker inspect para descobrir o Id completo.",
- "port": "Insira a URL ou o IP do servidor, aporta e uma descrição que aparecerá na dashboard.",
- "game": "",
- "https": ""
- },
- "common": {
- "appName": "Checkmate",
- "monitoringAgentName": "Capture",
- "buttons": {
- "toggleTheme": "Trocar claro e escuro"
+ "checks": {
+ "selects": {
+ "monitor": {
+ "all": "Todos os monitores"
+ },
+ "status": {
+ "all": "Todos",
+ "down": "Fora do ar",
+ "up": "Online"
+ }
+ },
+ "table": {
+ "empty": "Nenhuma verificação com falha neste período",
+ "headers": {
+ "statusCode": "Código de status",
+ "location": "Localização"
+ }
+ }
},
- "toasts": {
- "networkError": "Erro de rede",
- "checkConnection": "Por favor, verifique a conexão",
- "unknownError": "Erro desconhecido"
- }
- },
- "auth": {
"common": {
- "navigation": {
- "continue": "Continuar",
- "back": "Voltar"
- },
- "inputs": {
- "email": {
- "label": "Email",
- "placeholder": "joao.silva@dominio.com.br",
- "errors": {
- "empty": "Para continuar, insira seu endereço de email",
- "invalid": "Por favor, confirme o endereço de email informado"
- }
+ "monitors": {
+ "actions": {
+ "configure": "Configurar",
+ "delete": "Excluir",
+ "generateToken": "Gerar token",
+ "details": "Detalhes",
+ "incidents": "Incidentes",
+ "inviteMember": "Convidar membro",
+ "openSite": "Abrir site",
+ "pause": "Pausar",
+ "resume": "Retomar"
+ },
+ "statBoxes": {
+ "activeFor": "Ativo há",
+ "certificateExpiry": "Validade do certificado",
+ "lastCheck": "Última verificação",
+ "lastResponseTime": "Último tempo de resposta"
+ },
+ "status": {
+ "down": "fora do ar",
+ "breached": "limite excedido",
+ "initializing": "inicializando",
+ "maintenance": "manutenção",
+ "paused": "pausado",
+ "total": "total",
+ "up": "online"
+ },
+ "monitorTypes": {
+ "optionDocker": "Docker",
+ "optionGame": "Jogo",
+ "optionHttp": "HTTP(S)",
+ "optionPing": "Ping",
+ "optionPort": "Porta",
+ "optionPagespeed": "PageSpeed",
+ "optionHardware": "Infraestrutura",
+ "optionGrpc": "gRPC",
+ "optionWebSocket": "WebSocket"
+ }
+ }
+ },
+ "createMonitor": {
+ "form": {
+ "advanced": {
+ "description": "Configurações opcionais para casos de uso avançados",
+ "option": {
+ "advancedMatching": {
+ "label": "Usar correspondência avançada"
+ },
+ "expectedValue": {
+ "label": "Valor esperado"
+ },
+ "jsonPath": {
+ "description": "Esta expressão será avaliada contra os dados JSON da resposta e o resultado será usado para comparar com o valor esperado. Consulte jmespath.org para a documentação da linguagem de consulta.",
+ "label": "Expressão JSONPath"
+ },
+ "matchMethod": {
+ "label": "Método de correspondência",
+ "equal": "",
+ "include": "",
+ "regex": "Regex"
+ }
+ },
+ "title": "Configurações avançadas"
},
- "password": {
- "label": "Senha",
- "rules": {
- "length": {
- "beginning": "Deve ter no mínimo",
- "highlighted": "8 caracteres de comprimento"
+ "frequency": {
+ "description": "Com que frequência você deseja verificar o status deste monitor?",
+ "option": {
+ "frequency": {
+ "label": "Frequência de verificação",
+ "value": {
+ "fifteenMinutes": "15 minutos",
+ "fifteenSeconds": "",
+ "fiveMinutes": "5 minutos",
+ "fourMinutes": "4 minutos",
+ "oneMinute": "1 minuto",
+ "tenMinutes": "10 minutos",
+ "thirtyMinutes": "30 minutos",
+ "thirtySeconds": "",
+ "threeMinutes": "3 minutos",
+ "twoMinutes": "2 minutos"
+ }
+ }
+ },
+ "title": "Frequência de verificação"
+ },
+ "general": {
+ "option": {
+ "container": {
+ "label": "Nome/ID do container",
+ "placeholder": "meu-app ou abcd1234"
+ },
+ "host": {
+ "label": "Host",
+ "placeholder": "192.168.1.100 ou exemplo.com"
+ },
+ "name": {
+ "label": "Nome de exibição",
+ "placeholder": "ex. Meu Site"
},
- "special": {
- "beginning": "Deve conter pelo menos",
- "highlighted": "um caractere especial"
+ "secret": {
+ "label": "Chave de autorização",
+ "placeholder": "Digite sua chave secreta"
},
- "number": {
- "beginning": "Deve ter pelo menos",
- "highlighted": "um número"
+ "url": {
+ "label": "URL",
+ "placeholder": "https://www.google.com"
},
- "uppercase": {
- "beginning": "Deve ter pelo menos",
- "highlighted": "uma letra maiúscula"
+ "game": {
+ "label": "",
+ "placeholder": ""
},
- "lowercase": {
- "beginning": "Deve ter pelo menos",
- "highlighted": "uma letra minúscula"
+ "port": {
+ "label": "Porta para monitorar",
+ "placeholder": "80"
},
- "match": {
- "beginning": "Senha e confirmação de senha",
- "highlighted": "devem combinar"
+ "grpcServiceName": {
+ "label": "Nome do serviço",
+ "placeholder": "ex. meu.servico.v1 (deixe vazio para verificação geral)"
+ },
+ "wsUrl": {
+ "label": "URL do WebSocket",
+ "placeholder": "wss://exemplo.com/socket"
}
},
- "errors": {
- "empty": "Por favor, digite sua senha",
- "length": "A senha deve ter pelo menos 8 caracteres",
- "uppercase": "A senha deve conter pelo menos 1 letra maiúscula",
- "lowercase": "Senha deve ter pelo menos uma letra minúscula",
- "number": "Senha deve ter pelo menos um número",
- "special": "Senha deve ter pelo menos um caractere especial",
- "incorrect": "A senha que você forneceu não está registrada"
+ "title": "Configurações gerais",
+ "description": {
+ "http": "Digite a URL ou IP para monitorar (ex.: https://exemplo.com/ ou 192.168.1.100) e adicione um nome de exibição claro que aparecerá no painel.",
+ "ping": "Insira o endereço IP ou nome de domínio para ping (ex. 192.168.1.100 ou exemplo.com.br) e adicione uma descrição que aparecerá na dashboard.",
+ "port": "Insira a URL ou o IP do servidor, aporta e uma descrição que aparecerá na dashboard.",
+ "docker": "Insira o Docker Id do seu container. Docker Ids devem ser todos os 64 caracteres. Você pode executar docker inspect para descobrir o Id completo.",
+ "game": "",
+ "pagespeed": "Acompanhe o desempenho de carregamento da página, Core Web Vitals e pontuações de otimização do seu site.",
+ "grpc": "Digite o hostname e a porta do servidor gRPC, opcionalmente especifique um nome de serviço para a verificação de saúde e adicione um nome de exibição.",
+ "websocket": "Digite a URL do WebSocket para monitorar (ex.: wss://exemplo.com/socket) e adicione um nome de exibição.",
+ "hardware": "Monitore o uso de CPU, memória, disco e temperatura da sua infraestrutura."
}
},
- "passwordConfirm": {
- "label": "Confirme a senha",
- "placeholder": "Informe a senha novamente para confirmar",
- "errors": {
- "empty": "Por favor, informe a senha novamente para confirmação (cuidado com erros de digitação)",
- "different": "As senhas informadas não combinam, então uma deve estar errada"
- }
+ "ignoreTls": {
+ "description": "Configure a validação de certificados TLS/SSL para conexões HTTPS.",
+ "option": {
+ "tls": {
+ "label": "Ignorar erros de TLS/SSL"
+ }
+ },
+ "title": "Configurações de TLS/SSL"
},
- "firstName": {
- "label": "Nome",
- "placeholder": "João",
- "errors": {
- "empty": "Por favor, insira seu nome",
- "length": "Nome deve ter menos de 50 caracteres",
- "pattern": "Nome deve conter apenas letras, espaços, apóstrofos ou hífens"
+ "incidents": {
+ "description": "Uma janela deslizante é usada para determinar quando um monitor fica fora do ar. O status de um monitor só mudará quando a porcentagem de verificações na janela deslizante atingir o valor especificado.",
+ "option": {
+ "checks": {
+ "label": "Número de verificações na janela deslizante"
+ },
+ "percentage": {
+ "label": "Qual porcentagem de verificações na janela deslizante deve falhar/ter sucesso antes de mudar o status do monitor?"
+ }
+ },
+ "title": "Incidentes"
+ },
+ "notifications": {
+ "description": "Selecione os canais de notificação que deseja usar",
+ "title": "Notificações"
+ },
+ "type": {
+ "description": "Selecione o tipo de verificação a ser realizada",
+ "optionDockerDescription": "Use Docker para monitorar se um container está em execução.",
+ "optionGameDescription": "Monitore se um servidor de jogo específico está online.",
+ "optionGrpcDescription": "Monitore serviços gRPC usando o protocolo padrão de verificação de saúde.",
+ "optionWebSocketDescription": "Monitore endpoints WebSocket para verificar a saúde da conexão e o tempo de resposta.",
+ "optionHttpDescription": "Use HTTP(S) para monitorar seu site ou endpoint de API.",
+ "optionPingDescription": "Use ICMP Ping para monitorar se um servidor está online.",
+ "optionPortDescription": "Monitore se uma porta específica em um servidor está aberta.",
+ "title": "Tipo"
+ },
+ "thresholds": {
+ "title": "Limites de alerta",
+ "description": "Defina os limites em que os alertas devem ser disparados para este monitor de hardware.",
+ "option": {
+ "cpuThreshold": {
+ "label": "Limite de alerta de CPU (%)"
+ },
+ "memoryThreshold": {
+ "label": "Limite de alerta de memória (%)"
+ },
+ "diskThreshold": {
+ "label": "Limite de alerta de disco (%)"
+ },
+ "tempThreshold": {
+ "label": "Limite de alerta de temperatura (°C)"
+ }
}
},
- "lastName": {
- "label": "Sobrenome",
- "placeholder": "Silva",
- "errors": {
- "empty": "Por favor, insira seu sobrenome",
- "length": "Sobrenome deve ter menos de 50 caracteres",
- "pattern": "Sobrenome deve conter apenas letras, espaços, apóstrofos ou hífens"
+ "geoChecks": {
+ "title": "Verificações geodistribuídas",
+ "description": "Execute verificações de múltiplas localizações geográficas para monitorar a disponibilidade e o desempenho global.",
+ "option": {
+ "enabled": {
+ "label": "Ativar verificações geodistribuídas"
+ },
+ "locations": {
+ "label": "Localizações",
+ "placeholder": "Selecionar localizações",
+ "options": {
+ "EU": "Europa",
+ "NA": "América do Norte",
+ "AS": "Ásia",
+ "SA": "América do Sul",
+ "AF": "África",
+ "OC": "Oceania"
+ }
+ },
+ "interval": {
+ "label": "Intervalo de verificação",
+ "value": {
+ "fiveMinutes": "5 minutos",
+ "tenMinutes": "10 minutos",
+ "fifteenMinutes": "15 minutos",
+ "thirtyMinutes": "30 minutos"
+ }
+ }
}
- }
- },
- "errors": {
- "validation": "Erro de validação de dados."
- },
- "fields": {
- "password": {
- "errors": {
- "incorrect": "A senha que você forneceu não corresponde aos nossos registros"
+ },
+ "url": {
+ "title": "IP/URL do monitor na página de status",
+ "description": "Exiba o endereço IP ou a URL do monitor na página de status pública. Se desativado, apenas o nome do monitor será exibido para proteger informações sensíveis.",
+ "option": {
+ "showURL": {
+ "label": "Exibir IP/URL na página de status",
+ "enabled": "Ativado",
+ "disabled": "Desativado"
+ }
}
},
- "role": {
- "errors": {
- "min": "Pelo menos uma função é necessária"
+ "stats": {
+ "title": "Histórico do monitor",
+ "description": "Limpe todo o histórico de monitoramento e estatísticas da sua equipe. Esta ação é irreversível.",
+ "buttonText": "Limpar todas as estatísticas",
+ "dialog": {
+ "title": "Limpar todo o histórico de monitoramento?",
+ "description": "Isso excluirá permanentemente todo o histórico de monitoramento, estatísticas e dados de verificação da sua equipe. Esta ação não pode ser desfeita.",
+ "confirm": "Sim, limpar todas as estatísticas"
}
}
}
},
- "login": {
- "heading": "Entrar",
- "subheadings": {
- "stepOne": "Insira seu email",
- "stepTwo": "Insira sua senha"
+ "editUser": {
+ "form": {
+ "roles": {
+ "title": "Funções",
+ "description": "Atribua funções ao usuário. Múltiplas funções podem ser selecionadas."
+ }
},
- "links": {
- "forgotPassword": "Esqueceu sua senha?",
- "register": "Não tem uma conta?",
- "forgotPasswordLink": "Redefinir senha",
- "registerLink": "Registre-se aqui"
+ "dialog": {
+ "removeUser": {
+ "title": "Remover usuário",
+ "content": "Tem certeza de que deseja remover {{name}} da sua equipe? Esta ação não pode ser desfeita."
+ }
+ }
+ },
+ "incidents": {
+ "dialog": {
+ "resolveIncident": {
+ "title": "Resolver incidente",
+ "option": {
+ "comment": {
+ "label": "Comentário (opcional)",
+ "placeholder": "Adicione um comentário sobre a resolução..."
+ }
+ }
+ },
+ "details": {
+ "analysis": "Análise do incidente",
+ "comment": "Comentário:",
+ "detailsLabel": "Detalhes",
+ "downtime": "Tempo inativo:",
+ "message": "Mensagem:",
+ "monitor": "Monitor:",
+ "overview": "Visão geral",
+ "resolutionDetails": "Detalhes da resolução",
+ "resolutionType": "Tipo:",
+ "resolutionTypes": {
+ "automatic": "Automática",
+ "manual": "Manual"
+ },
+ "resolve": "Resolver incidente",
+ "resolvedAt": "Resolvido em:",
+ "resolvedBy": "Resolvido por:",
+ "startedAt": "Iniciado em:",
+ "status": "Status:",
+ "statusCode": "Código de status:",
+ "timeline": "Linha do tempo",
+ "title": "Detalhes do incidente",
+ "url": "URL:"
+ }
},
- "toasts": {
- "success": "Bem-vindo de volta! Você está autenticado.",
- "incorrectPassword": "Senha incorreta"
+ "filters": {
+ "allMonitors": "Todos os monitores",
+ "monitor": "Monitor",
+ "resolutionType": "Tipo de resolução",
+ "resolutionTypes": {
+ "manual": "Manual",
+ "automatic": "Automática",
+ "all": "Todos"
+ }
},
- "errors": {
- "password": {
- "incorrect": "A senha que você forneceu não corresponde aos nossos registros"
+ "summaryCard": {
+ "activeIncidents": {
+ "title": "Incidentes ativos",
+ "active_zero": "Nenhum incidente ativo",
+ "active_one": "{{count}} incidente ativo",
+ "active_other": "{{count}} incidentes ativos"
+ },
+ "incidentStats": {
+ "avgResolutionTime": "Tempo médio de resolução",
+ "mostAffectedMonitor": "Monitor mais afetado",
+ "title": "Estatísticas de incidentes",
+ "totalIncidents": "Total de incidentes"
+ },
+ "latestIncidents": {
+ "title": "Últimos incidentes"
}
},
- "welcome": ""
+ "table": {
+ "actions": {
+ "details": "Detalhes",
+ "goToMonitor": "Ir para o monitor",
+ "resolveManually": "Resolver manualmente"
+ },
+ "activeIncidents": "Incidentes ativos",
+ "headers": {
+ "endTime": "Hora de término",
+ "resolutionType": "Tipo de resolução",
+ "startTime": "Hora de início",
+ "statusCode": "Código de status"
+ },
+ "resolvedIncidents": "Incidentes resolvidos",
+ "status": {
+ "active": "Ativo",
+ "resolved": "Resolvido"
+ }
+ }
},
- "registration": {
- "heading": {
- "superAdmin": "Crie um usuário administrador",
- "user": "Se inscrever"
- },
- "subheadings": {
- "stepOne": "Informe seus dados pessoais",
- "stepTwo": "Informe seu email",
- "stepThree": "Crie sua senha"
+ "infrastructure": {
+ "charts": {
+ "labels": {
+ "cpu": "Uso de CPU",
+ "disk": "Uso de disco",
+ "memory": "Uso de memória",
+ "netBytesRecv": "{{name}} - Bytes recebidos",
+ "netBytesSent": "{{name}} - Bytes enviados",
+ "temp": "Temp"
+ }
},
- "description": {
- "superAdmin": "Crie sua conta de superadministrador para começar",
- "user": "Cadastre-se como usuário e peça ao superadministrador acesso aos seus monitores"
+ "gauges": {
+ "cpu": {
+ "lowerLabel": "Frequência máxima",
+ "title": "Uso de CPU",
+ "upperLabel": "Frequência atual"
+ },
+ "disk": {
+ "lowerLabel": "Livre",
+ "title": "Uso do disco {{idx}}",
+ "upperLabel": "Usado"
+ },
+ "memory": {
+ "lowerLabel": "Livre",
+ "title": "Uso de memória",
+ "upperLabel": "Usado"
+ }
},
- "gettingStartedButton": {
- "superAdmin": "Criar conta de superadministrador",
- "user": "Cadastre-se como usuário normal"
+ "statBoxes": {
+ "avgCpuTemperature": "Temperatura média da CPU",
+ "cpuFrequency": "Frequência da CPU",
+ "cpuLogical": "CPU (Lógica)",
+ "cpuPhysical": "CPU (Física)",
+ "disk": "Disco",
+ "memory": "Memória",
+ "os": "SO"
},
- "termsAndPolicies": "Ao criar uma conta, você concorda com nossos Termos de Serviço e Política de Privacidade.",
- "links": {
- "login": "Já tem uma conta? Entrar"
+ "table": {
+ "headers": {
+ "cpu": "CPU",
+ "disk": "Disco",
+ "memory": "Memória"
+ }
},
- "toasts": {
- "success": "Bem-vindo! Sua conta foi criada com sucesso."
+ "tabs": {
+ "labels": {
+ "network": "",
+ "overview": "Visão geral"
+ }
},
- "welcome": ""
+ "fallback": {
+ "actionButton": "Criar um monitor!",
+ "checks": "Track the performance of your servers,Identify bottlenecks and optimize usage,Ensure reliability with real-time monitoring",
+ "title": "Um monitor de infraestrutura é usado para:"
+ }
},
- "forgotPassword": {
- "heading": "Esqueceu sua senha?",
- "subheadings": {
- "stepOne": "Não se preocupe, enviaremos instruções de redefinição.",
- "stepTwo": "Enviamos um link de redefinição de senha para ",
- "stepThree": "Sua nova senha deve ser diferente das senhas usadas anteriormente.",
- "stepFour": "Sua senha foi redefinida com sucesso. Clique abaixo para fazer login magicamente."
+ "logs": {
+ "tabs": {
+ "diagnostics": "Diagnóstico",
+ "logs": "Logs do servidor",
+ "queue": "Fila de tarefas"
},
- "buttons": {
- "openEmail": "Abra o aplicativo de e-mail",
- "resetPassword": "Redefinir senha"
+ "logLevelSelect": {
+ "label": "Nível de log"
},
- "imageAlts": {
- "passwordKey": "Ícone de chave de senha",
- "email": "Ícone de e-mail",
- "lock": "Ícone de cadeado",
- "passwordConfirm": "Ícone de confirmação de senha"
+ "jobQueue": "Fila de tarefas",
+ "failedJobs": "Tarefas com falha",
+ "noLogs": "Nenhum log encontrado",
+ "metrics": {
+ "jobs": "Tarefas",
+ "activeJobs": "Tarefas ativas",
+ "failingJobs": "Tarefas com falha",
+ "totalRuns": "Total de execuções",
+ "totalFailures": "Total de falhas"
},
- "links": {
- "login": "Voltar para o login",
- "resend": "Não recebeu o email? Clique para reenviar"
+ "diagnostics": {
+ "stats": {
+ "eventLoopDelay": "Atraso do event loop",
+ "uptime": "Uptime",
+ "usedHeapSize": "Tamanho do heap usado",
+ "totalHeapSize": "Tamanho total do heap",
+ "osMemoryLimit": "Limite de memória do SO"
+ },
+ "gauges": {
+ "heapAllocation": "Alocação de heap",
+ "heapUsage": "Uso do heap",
+ "heapUtilization": "Utilização do heap",
+ "instantCpuUsage": "Uso instantâneo de CPU",
+ "availableMemoryPercentage": "% de memória disponível",
+ "allocatedPercentage": "% alocado",
+ "usedSPercentage": "% de 1s usado pela CPU",
+ "total": "Total",
+ "used": "Usado"
+ }
},
- "toasts": {
- "sent": "Instruções enviadas para .",
- "emailNotFound": "E-mail não encontrado.",
- "redirect": "Redirecionando em ...",
- "success": "Sua senha foi redefinida com sucesso.",
- "error": "Não foi possível redefinir a senha. Tente novamente mais tarde ou entre em contato com o suporte."
+ "table": {
+ "headers": {
+ "timestamp": "Data/hora",
+ "level": "Nível",
+ "service": "Serviço",
+ "method": "Método",
+ "monitorId": "ID do monitor",
+ "runCount": "Contagem de execuções",
+ "failCount": "Contagem de falhas",
+ "lastRunAt": "Última execução em",
+ "lockedAt": "Bloqueado em",
+ "lastFinishedAt": "Última conclusão em",
+ "lastRunTook": "Última execução durou",
+ "lastFailedAt": "Última falha em",
+ "failReason": "Motivo da falha"
+ }
}
- }
- },
- "errorPages": {
- "serverUnreachable": {
- "toasts": {
- "reconnected": "Reconectado ao servidor com sucesso.",
- "stillUnreachable": "O servidor ainda está inacessível. Tente novamente mais tarde."
+ },
+ "maintenanceWindow": {
+ "fallback": {
+ "actionButton": "Criar uma janela de manutenção!",
+ "checks": "Mark your maintenance periods,Eliminate any misunderstandings,Stop sending alerts in maintenance windows",
+ "title": "Uma janela de manutenção é usada para:"
+ },
+ "table": {
+ "headers": {
+ "nextWindow": "Próxima janela",
+ "repeat": "Repetir"
+ }
},
- "alertBox": "Erro de conexão do servidor",
- "description": "Não conseguimos conectar ao servidor. Verifique sua conexão com a internet ou sua configuração de implantação se o problema persistir.",
- "retryButton": {
- "default": "Tentar conectar novamente",
- "processing": "Conectando..."
+ "form": {
+ "general": {
+ "title": "Configurações gerais",
+ "description": "Defina um nome e a opção de repetição para sua janela de manutenção.",
+ "option": {
+ "name": {
+ "label": "Nome",
+ "placeholder": "ex. Manutenção semanal"
+ },
+ "repeat": {
+ "label": "Repetir"
+ }
+ }
+ },
+ "startDate": {
+ "title": "Data de início",
+ "description": "Selecione a data de início da sua janela de manutenção.",
+ "option": {
+ "startDate": {
+ "label": "Data de início"
+ }
+ }
+ },
+ "startTime": {
+ "title": "Hora de início",
+ "description": "Defina a hora de início e a duração da sua janela de manutenção. Todos os valores estão em UTC",
+ "option": {
+ "duration": {
+ "label": "Duração"
+ },
+ "startTime": {
+ "label": "Hora de início"
+ }
+ },
+ "monitors": {
+ "title": "Monitores",
+ "description": "Monitores aos quais a janela de manutenção deve ser aplicada",
+ "option": {
+ "addMonitors": {
+ "label": "Adicionar monitores"
+ }
+ }
+ }
+ }
}
- }
- },
- "createNotifications": {
- "title": "Criar canal de notificação",
- "nameSettings": {
- "title": "Nome",
- "description": "Um nome descritivo para sua integração.",
- "nameLabel": "Nome",
- "namePlaceholder": "por exemplo, notificações do Slack"
- },
- "typeSettings": {
- "title": "Tipo",
- "description": "Selecione o tipo de canal de notificação que você deseja criar.",
- "typeLabel": "Tipo"
- },
- "emailSettings": {
- "title": "E-mail",
- "description": "Endereços de e-mail de destino.",
- "emailLabel": "Endereço de email",
- "emailPlaceholder": "por exemplo john@example.com"
- },
- "slackSettings": {
- "title": "Folga",
- "description": "Configure seu webhook do Slack aqui",
- "webhookLabel": "URL do webhook do Slack",
- "webhookPlaceholder": "https://hooks.slack.com/services/..."
- },
- "pagerdutySettings": {
- "title": "PagerDuty",
- "description": "Configure sua integração com o PagerDuty aqui",
- "integrationKeyLabel": "Chave de integração",
- "integrationKeyPlaceholder": "1234567890"
- },
- "discordSettings": {
- "title": "Discórdia",
- "description": "Configure seu webhook do Discord aqui",
- "webhookLabel": "URL do webhook do Discord",
- "webhookPlaceholder": "https://seu-servidor.com/webhook"
- },
- "webhookSettings": {
- "title": "Webhook",
- "description": "Configure seu webhook aqui",
- "webhookLabel": "URL do webhook",
- "webhookPlaceholder": "https://seu-servidor.com/webhook"
- },
- "testNotification": "Notificação de teste",
- "dialogDeleteTitle": "Tem certeza de que deseja excluir esta notificação?",
- "dialogDeleteConfirm": "Excluir"
- },
- "notificationConfig": {
- "title": "Notificações",
- "description": "Selecione os canais de notificação que deseja usar"
- },
- "monitorStatus": {
- "checkingEvery": "Verificando a cada {{intervalo}}",
- "withCaptureAgent": "com agente de captura {{versão}}",
- "up": "acima",
- "down": "abaixo",
- "paused": "pausado"
- },
- "advancedMatching": "Correspondência avançada",
- "sendTestNotifications": "Enviar notificações de teste",
- "selectAll": "Selecionar tudo",
- "showAdminLoginLink": "Mostrar o link \"Administrador? Efetue login aqui\" na página de status",
- "logsPage": {
- "title": "Registros",
- "description": "Logs do sistema - últimas 1000 linhas",
- "tabs": {
- "queue": "Fila de tarefas",
- "logs": "Logs do servidor",
- "diagnostics": "Diagnóstico"
- },
- "toast": {
- "fetchLogsSuccess": "Logs obtidos com sucesso"
},
- "logLevelSelect": {
- "title": "Nível de log",
- "values": {
- "all": "Todos",
- "info": "Informações",
- "warn": "Avisar",
- "error": "Erro",
- "debug": "Depurar"
+ "notifications": {
+ "fallback": {
+ "actionButton": "Criar um canal",
+ "checks": "Alert teams about downtime or performance issues,Let engineers know when incidents happen,Keep administrators informed of system changes",
+ "title": "Canais de notificação são usados para:"
+ },
+ "form": {
+ "accessToken": {
+ "optionAccessToken": "Token de acesso",
+ "placeholder": "syt_YWxleF9ob2xsaWRheQ_VmtScmV0U2VjcmV0S2V5_abc123"
+ },
+ "address": {
+ "description": "O endereço para onde as notificações serão enviadas.",
+ "optionAddress": "Endereço",
+ "placeholderEmail": "exemplo@exemplo.com",
+ "placeholderWebhook": "https://seu-servidor.com/webhook",
+ "title": "Endereço"
+ },
+ "homeServer": {
+ "optionHomeServer": "Servidor principal",
+ "placeholder": "exemplo.com"
+ },
+ "matrix": {
+ "description": "Configure a conexão do seu servidor Matrix para notificações.",
+ "title": "Configuração do Matrix"
+ },
+ "notificationName": {
+ "description": "Um nome descritivo para o canal de notificação",
+ "optionName": "Nome do canal",
+ "placeholder": "ex. Alertas de produção",
+ "title": "Nome do canal"
+ },
+ "pagerDuty": {
+ "description": "Sua chave de integração do PagerDuty para receber alertas.",
+ "optionIntegrationKey": "Chave de integração",
+ "placeholder": "a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6",
+ "title": "Chave de integração"
+ },
+ "roomId": {
+ "optionRoomId": "ID da sala",
+ "placeholder": "!abcdefg:matrix.org"
+ },
+ "type": {
+ "description": "Selecione o tipo de canal de notificação a ser criado.",
+ "optionType": "Tipo",
+ "title": "Tipo de canal"
+ },
+ "telegram": {
+ "title": "Configuração do Telegram",
+ "description": "Para habilitar as notificações do Telegram, crie um bot do Telegram usando o BotFather, um bot oficial para criar e gerenciar bots do Telegram. Em seguida, obtenha o token da API e o ID do chat e os coloque aqui.",
+ "optionBotToken": "Token do bot",
+ "placeholderBotToken": "123456789:ABCdefGhIJKlmNoPQRsTUVwxyZ",
+ "optionChatId": "ID do chat",
+ "placeholderChatId": "-1001234567890"
+ }
+ },
+ "table": {
+ "headers": {
+ "destination": "Destino"
+ }
}
- }
- },
- "queuePage": {
- "title": "Fila",
- "refreshButton": "Atualizar",
- "flushButton": "Fila de descarga",
- "jobTable": {
- "title": "Empregos atualmente na fila",
- "idHeader": "ID do monitor",
- "urlHeader": "URL",
- "typeHeader": "Tipo",
- "activeHeader": "Ativo",
- "lockedAtHeader": "Trancado em",
- "runCountHeader": "Contagem de corridas",
- "failCountHeader": "Contagem de falhas",
- "lastRunHeader": "Última corrida em",
- "lastFinishedAtHeader": "Última conclusão em",
- "lastRunTookHeader": "A última corrida aconteceu",
- "intervalHeader": ""
- },
- "metricsTable": {
- "title": "Métricas de fila",
- "metricHeader": "Métrica",
- "valueHeader": "Valor"
- },
- "failedJobTable": {
- "title": "Trabalhos com falha",
- "monitorIdHeader": "ID do monitor",
- "monitorUrlHeader": "URL do monitor",
- "failCountHeader": "Contagem de falhas",
- "failedAtHeader": "Última falha em",
- "failReasonHeader": "Motivo da falha"
- }
- },
- "export": {
- "title": "Monitores de Exportação",
- "success": "Monitores exportados com sucesso!",
- "failed": "Falha ao exportar monitores"
- },
- "monitorActions": {
- "title": "Exportação/Importação",
- "import": "Monitores de importação",
- "export": "Monitores de Exportação",
- "deleteSuccess": "Monitor excluído com sucesso",
- "deleteFailed": "Falha ao excluir o monitor",
- "details": "Detalhes"
- },
- "settingsPage": {
- "aboutSettings": {
- "labelDevelopedBy": "Desenvolvido pela Bluewave Labs",
- "labelVersion": "Versão",
- "title": "Sobre"
- },
- "demoMonitorsSettings": {
- "buttonAddMonitors": "Adicionar monitores de demonstração",
- "description": "Adicione monitores de amostra para fins de demonstração.",
- "title": "Monitores de demonstração"
},
- "emailSettings": {
- "buttonSendTestEmail": "Enviar e-mail de teste",
- "description": "Configure as configurações de e-mail do seu sistema. Elas são usadas para enviar notificações e alertas.",
- "descriptionTransport": "Isso cria um transporte SMTP para o NodeMailer",
- "labelAddress": "Endereço de e-mail - Usado para autenticação",
- "labelConnectionHost": "Host de conexão de e-mail - Nome do host a ser usado na saudação HELO/EHLO",
- "labelHost": "Host de e-mail - Nome do host ou endereço IP para conectar",
- "labelIgnoreTLS": "Desabilitar STARTTLS: Não use TLS mesmo que o servidor suporte",
- "labelPassword": "Senha de e-mail - Senha para autenticação",
- "labelPasswordSet": "A senha foi definida. Clique em Redefinir para alterá-la.",
- "labelPool": "Habilitar pool de conexões: Reutilize conexões existentes para melhorar o desempenho",
- "labelPort": "Porta de e-mail - Porta para conectar",
- "labelRejectUnauthorized": "Rejeitar certificados inválidos: rejeitar conexões com certificados autoassinados ou não confiáveis",
- "labelRequireTLS": "Forçar STARTTLS: requer atualização de TLS, falha se não for suportado",
- "labelSecure": "Usar SSL (recomendado): criptografar a conexão usando SSL/TLS",
- "labelTLSServername": "Nome do servidor TLS - Nome do host opcional para validação TLS quando o host é um IP",
- "labelUser": "Usuário de e-mail - Nome de usuário para autenticação, substitui o endereço de e-mail, se especificado",
- "linkTransport": "Veja as especificações aqui",
- "placeholderUser": "Deixe em branco se não for necessário",
- "title": "E-mail",
- "toastEmailRequiredFieldsError": "Endereço de e-mail, host, porta e senha são obrigatórios"
- },
- "pageSpeedSettings": {
- "description": "Insira sua chave da API do Google PageSpeed para ativar o monitoramento do Google PageSpeed. Clique em Redefinir para atualizar a chave.",
- "labelApiKeySet": "A chave de API está definida. Clique em Redefinir para alterá-la.",
- "labelApiKey": "Chave da API do PageSpeed",
- "title": "Chave da API do Google PageSpeed"
- },
- "saveButtonLabel": "Salvar",
- "statsSettings": {
- "clearAllStatsButton": "Limpar todas as estatísticas",
- "clearAllStatsDescription": "Limpe todas as estatísticas. Isso é irreversível.",
- "clearAllStatsDialogConfirm": "Sim, limpar todas as estatísticas",
- "clearAllStatsDialogDescription": "Uma vez removido, o histórico de monitoramento e as estatísticas não podem ser recuperados.",
- "clearAllStatsDialogTitle": "Você quer limpar todas as estatísticas?",
- "description": "Defina por quanto tempo você deseja manter os dados históricos. Você também pode limpar todos os dados existentes.",
- "labelTTL": "Os dias em que você deseja continuar monitorando o histórico.",
- "labelTTLOptional": "0 para infinito",
- "title": "Histórico do monitor"
- },
- "systemResetSettings": {
- "buttonRemoveAllMonitors": "Remover todos os monitores",
- "description": "Remova todos os monitores do seu sistema.",
- "dialogConfirm": "Sim, remova todos os monitores",
- "dialogDescription": "Uma vez removidos, os monitores não podem ser recuperados.",
- "dialogTitle": "Você deseja remover todos os monitores?",
- "title": "Reinicialização do sistema"
- },
- "timezoneSettings": {
- "description": "Selecione o fuso horário usado para exibir datas e horas em todo o aplicativo.",
- "label": "Exibir fuso horário",
- "title": "Exibir fuso horário"
- },
- "title": "Configurações",
- "uiSettings": {
- "description": "Alterne entre o modo claro e escuro ou altere o idioma da interface do usuário.",
- "labelLanguage": "Linguagem",
- "labelTheme": "Modo de tema",
- "title": "Aparência"
- },
- "urlSettings": {
- "description": "Exiba o endereço IP ou URL do monitor na página de status pública. Se estiver desabilitado, apenas o nome do monitor será exibido para proteger informações confidenciais.",
- "label": "Exibir IP/URL na página de status",
- "selectDisabled": "Desabilitado",
- "selectEnabled": "Habilitado",
- "title": "Monitorar IP/URL na página de status"
- },
- "globalThresholds": {
- "title": "Limites Globais",
- "description": "Configurar limites globais da CPU, Memória, Disco e Temperatura. Se um valor for fornecido, o monitoramento será ativado automaticamente"
- }
- },
- "statusPageCreate": {
- "buttonSave": "Salvar"
- },
- "incidentsOptionsHeaderFilterResolved": "Resolvido",
- "settingsSave": "Salvar",
- "statusPageCreateAppearanceTitle": "Aparência",
- "confirmPassword": "Confirme sua senha",
- "monitorHooks": {
- "failureAddDemoMonitors": "Falha ao adicionar monitores de demonstração",
- "successAddDemoMonitors": "Monitores de demonstração adicionados com sucesso"
- },
- "settingsAppearance": "Aparência",
- "settingsDisplayTimezone": "Exibir fuso horário",
- "settingsGeneralSettings": "Configurações gerais",
- "incidentsOptionsHeaderTotalIncidents": "Total de incidentes",
- "statusPage": {
- "deleteSuccess": "Página de status excluída com sucesso",
- "deleteFailed": "Falha ao excluir a página de status",
- "createSuccess": "Página de status criada com sucesso",
- "updateSuccess": "Página de status atualizada com sucesso",
- "generalSettings": "Configurações gerais",
- "contents": "Conteúdo",
- "fallback": {
- "checks": [
- "Monitore e exiba a integridade dos seus serviços em tempo real",
- "Acompanhe vários serviços e compartilhe seus status",
- "Mantenha os usuários informados sobre interrupções e desempenho"
- ],
- "title": "Uma página de status é usada para:",
- "actionButton": "Vamos criar sua primeira página de status!"
- }
- },
- "testNotificationsDisabled": "Não há notificações configuradas para este monitor. Você precisa adicionar uma clicando no botão \"Configurar\".",
- "incidentsTableResolvedAt": "Resolvido em",
- "incidentsTableActionResolve": "Resolver",
- "checkHooks": {
- "failureResolveOne": "Falha ao resolver o incidente.",
- "failureResolveAll": "Falha ao resolver todos os incidentes.",
- "failureResolveMonitor": "Falha ao resolver incidentes do monitor."
- },
- "checkFormError": "Verifique se há erros no formulário.",
- "diagnosticsPage": {
- "diagnosticDescription": "Diagnóstico do sistema",
- "statsDescription": "Estatísticas do sistema",
- "gauges": {
- "heapAllocationTitle": "Alocação de heap",
- "heapAllocationSubtitle": "% de memória disponível",
- "heapUsageTitle": "Uso de heap",
- "heapUsageSubtitle": "% de memória disponível",
- "heapUtilizationTitle": "Utilização de heap",
- "heapUtilizationSubtitle": "% do alocado",
- "instantCpuUsageTitle": "Uso instantâneo da CPU",
- "instantCpuUsageSubtitle": "% de 1s usados pela CPU"
- },
- "stats": {
- "eventLoopDelayTitle": "Atraso do loop de eventos",
- "uptimeTitle": "Tempo de atividade",
- "usedHeapSizeTitle": "Tamanho de heap usado",
- "totalHeapSizeTitle": "Tamanho total do heap",
- "osMemoryLimitTitle": "Limite de memória do sistema operacional"
- }
- },
- "pageSpeedLighthouseAPI": "Use a API Lighthouse PageSpeed para monitorar seu site",
- "time": {
- "threeMinutes": "3 minutos",
- "fiveMinutes": "5 minutos",
- "tenMinutes": "10 minutos",
- "twentyMinutes": "20 minutos",
- "oneHour": "1 hora",
- "oneDay": "1 dia",
- "oneWeek": "1 semana",
- "fourMinutes": "4 minutos",
- "oneMinute": "1 minuto",
- "twoMinutes": "2 minutos",
- "fifteenSeconds": "",
- "thirtySeconds": ""
- },
- "general": {
- "noOptionsFound": "Nenhuma {{unidade}} encontrada"
- },
- "infrastructureMonitor": {
- "fallback": {
- "checks": [
- "Acompanhe o desempenho dos seus servidores",
- "Identifique gargalos e otimize o uso",
- "Garanta a confiabilidade com monitoramento em tempo real"
- ],
- "title": "Um monitor de infraestrutura é usado para:",
- "actionButton": "Vamos criar seu primeiro monitor de infraestrutura!"
- }
- },
- "maintenanceWindow": {
- "fallback": {
- "checks": [
- "Marque seus períodos de manutenção",
- "Elimine qualquer mal-entendido",
- "Pare de enviar alertas em janelas de manutenção"
- ],
- "title": "Uma janela de manutenção é usada para:",
- "actionButton": "Vamos criar sua primeira janela de manutenção!"
- }
- },
- "pageSpeed": {
- "fallback": {
- "checks": [
- "Relatar a experiência do usuário em uma página",
- "Ajudar a analisar a velocidade da página",
- "Dar sugestões sobre como a página pode ser melhorada"
- ],
- "title": "Um monitor PageSpeed é usado para:",
- "actionButton": "Vamos criar seu primeiro monitor PageSpeed!"
- }
- },
- "uptimeMonitor": {
- "fallback": {
- "checks": [
- "Verifique se sites ou servidores estão online e responsivos",
- "Alerte as equipes sobre tempo de inatividade ou problemas de desempenho",
- "Monitore endpoints HTTP, pings, contêineres e portas",
- "Acompanhe o histórico de tempo de atividade e tendências de confiabilidade"
- ],
- "title": "Um monitor de tempo de atividade é usado para:",
- "actionButton": "Vamos criar seu primeiro monitor de tempo de atividade!"
- }
- },
- "editUserPage": {
- "form": {
- "email": "E-mail",
- "firstName": "Primeiro nome",
- "lastName": "Sobrenome",
- "role": "Funções",
- "save": "Salvar"
- },
- "table": {
- "actionHeader": "Ação",
- "roleHeader": "Papel"
- },
- "title": "Editar usuário",
- "toast": {
- "successUserUpdate": "Usuário atualizado com sucesso",
- "validationErrors": "Erros de validação"
- }
- },
- "incidentsPageActionResolveMonitor": "Resolver incidentes de monitoramento",
- "incidentsPageActionResolveAll": "Resolver todos os incidentes",
- "matchMethodOptions": {
- "equal": "",
- "equalPlaceholder": "",
- "include": "",
- "includePlaceholder": "",
- "regex": "Regex",
- "regexPlaceholder": "",
- "text": ""
- },
- "monitorType": {
- "docker": {
- "label": "",
- "namePlaceholder": "Meu Contêiner",
- "placeholder": "abcd1234"
- },
- "http": {
- "label": "URL para monitorar",
- "namePlaceholder": "Google",
- "placeholder": "google.com"
+ "pageSpeed": {
+ "charts": {
+ "common": {
+ "cls": "Mudança cumulativa de layout (CLS)",
+ "fcp": "Primeira exibição de conteúdo (FCP)",
+ "lcp": "Maior exibição de conteúdo (LCP)",
+ "si": "Índice de velocidade (SI)",
+ "tbt": "Tempo total de bloqueio (TBT)"
+ },
+ "legend": {
+ "title": "Relatório PageSpeed",
+ "weight": "Peso"
+ },
+ "pie": {
+ "title": "Relatório de desempenho"
+ }
+ },
+ "table": {
+ "headers": {
+ "pageSpeedScore": "Pontuação PageSpeed"
+ }
+ },
+ "fallback": {
+ "actionButton": "Criar um monitor!",
+ "checks": "Report on the user experience of a page,Help analyze webpage speed,Give suggestions on how the page can be improved",
+ "title": "Um monitor PageSpeed é usado para:"
+ }
},
- "ping": {
- "label": "Endereço IP para monitorar",
- "namePlaceholder": "Google",
- "placeholder": "1.1.1.1"
+ "settings": {
+ "form": {
+ "timezone": {
+ "title": "Fuso horário de exibição",
+ "description": "Selecione o fuso horário usado para exibir datas e horários em toda a aplicação.",
+ "option": {
+ "timezone": {
+ "label": "Fuso horário de exibição"
+ }
+ }
+ },
+ "ui": {
+ "title": "Aparência",
+ "description": "Alterne entre modo claro e escuro, mude o idioma ou personalize o tipo de gráfico.",
+ "option": {
+ "theme": {
+ "label": "Modo do tema",
+ "light": "Claro",
+ "dark": "Escuro"
+ },
+ "language": {
+ "label": "Idioma"
+ },
+ "chartType": {
+ "label": "Tipo de gráfico",
+ "histogram": "Histograma",
+ "heatmap": "Mapa de calor"
+ }
+ }
+ },
+ "pagespeed": {
+ "title": "Chave de API do Google PageSpeed",
+ "description": "Digite sua chave de API do Google PageSpeed para ativar o monitoramento PageSpeed. Clique em Resetar para atualizar a chave.",
+ "option": {
+ "apiKey": {
+ "label": "Chave de API PageSpeed",
+ "labelSet": "Chave de API definida. Clique em Resetar para alterá-la.",
+ "placeholder": "Digite sua chave de API do Google PageSpeed"
+ }
+ }
+ },
+ "url": {
+ "title": "IP/URL do monitor na página de status",
+ "description": "Exiba o endereço IP ou a URL do monitor na página de status pública. Se desativado, apenas o nome do monitor será exibido para proteger informações sensíveis.",
+ "option": {
+ "showURL": {
+ "label": "Exibir IP/URL na página de status",
+ "enabled": "Ativado",
+ "disabled": "Desativado"
+ }
+ }
+ },
+ "stats": {
+ "title": "Histórico do monitor",
+ "description": "Limpe todo o histórico de monitoramento e estatísticas da sua equipe. Esta ação é irreversível.",
+ "option": {
+ "clear": {
+ "label": "Limpar todas as estatísticas. Isso é irreversível."
+ }
+ },
+ "dialog": {
+ "title": "Limpar todo o histórico de monitoramento?",
+ "description": "Isso não pode ser desfeito"
+ }
+ },
+ "retention": {
+ "title": "Retenção de verificações",
+ "description": "Defina por quanto tempo os dados de verificação são retidos antes de serem limpos automaticamente.",
+ "option": {
+ "days": {
+ "label": "Período de retenção (dias)",
+ "unlimited": "Ilimitado"
+ }
+ }
+ },
+ "thresholds": {
+ "title": "Limites globais",
+ "description": "Defina limites globais de CPU, memória, disco e temperatura para monitoramento de infraestrutura. Eles se aplicam a todos os monitores de hardware, a menos que sejam substituídos.",
+ "option": {
+ "cpu": {
+ "label": "Limite de CPU (%)",
+ "placeholder": "1 - 100"
+ },
+ "memory": {
+ "label": "Limite de memória (%)",
+ "placeholder": "1 - 100"
+ },
+ "disk": {
+ "label": "Limite de disco (%)",
+ "placeholder": "1 - 100"
+ },
+ "temperature": {
+ "label": "Limite de temperatura (°C)",
+ "placeholder": "1 - 150"
+ }
+ }
+ },
+ "email": {
+ "title": "Configurações de email",
+ "description": "Configure as configurações de email do seu sistema. Isso é usado para enviar notificações e alertas.",
+ "descriptionTransport": "Isso cria um transporte SMTP para o NodeMailer",
+ "descriptionTransportLink": "Veja as especificações aqui",
+ "option": {
+ "host": {
+ "label": "Host de email - Nome do host ou endereço IP para conectar",
+ "placeholder": "smtp.gmail.com"
+ },
+ "port": {
+ "label": "Porta de email - Porta para conectar",
+ "placeholder": "587"
+ },
+ "address": {
+ "label": "Endereço de email - Usado para autenticação",
+ "placeholder": "voce@exemplo.com"
+ },
+ "user": {
+ "label": "Usuário de email - Nome de usuário para autenticação, substitui o endereço de email se especificado",
+ "placeholder": "Deixe vazio se não for necessário"
+ },
+ "password": {
+ "label": "Senha de email - Senha para autenticação",
+ "labelSet": "Senha definida. Clique em Resetar para alterá-la.",
+ "placeholder": "Digite sua senha"
+ },
+ "tlsServername": {
+ "label": "Nome do servidor TLS - Nome de host opcional para validação TLS quando o host é um IP",
+ "placeholder": "exemplo.com"
+ },
+ "connectionHost": {
+ "label": "Host de conexão de email - Nome de host para usar na saudação HELO/EHLO",
+ "placeholder": "localhost"
+ },
+ "secure": {
+ "label": "Usar SSL (recomendado): Criptografar a conexão usando SSL/TLS"
+ },
+ "pool": {
+ "label": "Ativar pool de conexões: Reutilizar conexões existentes para melhorar o desempenho"
+ },
+ "ignoreTLS": {
+ "label": "Desativar STARTTLS: Não usar TLS mesmo que o servidor suporte"
+ },
+ "requireTLS": {
+ "label": "Forçar STARTTLS: Exigir atualização TLS, falhar se não suportado"
+ },
+ "rejectUnauthorized": {
+ "label": "Rejeitar certificados inválidos: Rejeitar conexões com certificados autoassinados ou não confiáveis"
+ }
+ }
+ },
+ "demoMonitors": {
+ "title": "Monitores demo",
+ "description": "Adicione monitores de exemplo para fins de demonstração."
+ },
+ "removeMonitors": {
+ "title": "Redefinição do sistema",
+ "description": "Remova todos os monitores do seu sistema.",
+ "dialog": {
+ "title": "Remover todos os monitores?",
+ "description": "Isso não pode ser desfeito."
+ }
+ },
+ "exportMonitors": {
+ "title": "Exportar monitores"
+ },
+ "importExportMonitors": {
+ "title": "Importar / Exportar monitores",
+ "description": "Importe ou exporte os dados dos seus monitores como um arquivo JSON para backup ou transferência."
+ },
+ "about": {
+ "title": "Sobre",
+ "developedBy": "Desenvolvido por Bluewave Labs"
+ },
+ "validation": {
+ "errorMessage": "Por favor, corrija os seguintes erros de validação:"
+ }
+ }
},
- "port": {
- "label": "URL para monitorar",
- "namePlaceholder": "Localhost:5173",
- "placeholder": "localhost"
+ "statusPages": {
+ "deleteSuccess": "Página de status excluída com sucesso",
+ "fallback": {
+ "title": "Uma página de status é usada para:",
+ "checks": "Communicate system status to users and stakeholders,Display real-time uptime information publicly,Build trust with transparent service monitoring,Reduce support requests during incidents",
+ "actionButton": "Criar uma página de status!"
+ },
+ "monitorsList": {
+ "chartTypeHeatmap": "Mapa de calor",
+ "chartTypeHistogram": "Histograma",
+ "noData": "Nenhum dado disponível",
+ "infrastructure": {
+ "title": "Infraestrutura",
+ "cpu": "CPU",
+ "memory": "RAM",
+ "memoryText": "Memória",
+ "disk": "Disco",
+ "usage": "Uso",
+ "used": "Usado",
+ "total": "Total"
+ },
+ "uptime": {
+ "title": "Uptime",
+ "responseTime": "Tempo de resposta"
+ }
+ },
+ "statusBar": {
+ "allDown": "Todos os sistemas estão fora do ar",
+ "allUp": "Todos os sistemas operacionais",
+ "degraded": "Alguns sistemas estão com problemas",
+ "unknown": "Não foi possível determinar o status do sistema"
+ },
+ "table": {
+ "headers": {
+ "name": "Nome da página de status",
+ "url": "URL pública"
+ },
+ "published": "Publicada",
+ "unpublished": "Não publicada"
+ },
+ "title": "Páginas de status",
+ "details": {
+ "empty": {
+ "title": "Ainda não há nada aqui",
+ "addMonitor": "Adicione um monitor para começar"
+ }
+ },
+ "form": {
+ "access": {
+ "title": "Acesso",
+ "description": "Se sua página de status estiver pronta, você pode marcá-la como publicada.",
+ "option": {
+ "published": {
+ "name": "Publicada e visível ao público"
+ }
+ }
+ },
+ "basicInfo": {
+ "title": "Informações básicas",
+ "description": "Defina o nome da empresa e o subdomínio para onde sua página de status aponta.",
+ "option": {
+ "name": {
+ "label": "Nome da empresa",
+ "placeholder": "Acme Inc."
+ },
+ "url": {
+ "label": "Endereço da sua página de status",
+ "placeholder": "minha-pagina-de-status"
+ }
+ }
+ },
+ "monitors": {
+ "title": "Monitores",
+ "description": "Selecione os monitores para exibir na sua página de status.",
+ "noMonitors": "Nenhum monitor selecionado",
+ "option": {
+ "monitors": {
+ "label": "Selecionar monitores",
+ "placeholder": "Buscar e selecionar monitores..."
+ }
+ }
+ },
+ "timezone": {
+ "title": "Fuso horário",
+ "description": "Selecione o fuso horário em que sua página de status será exibida.",
+ "option": {
+ "timezone": {
+ "label": "Fuso horário",
+ "placeholder": "Selecione o fuso horário..."
+ }
+ }
+ },
+ "appearance": {
+ "title": "Aparência",
+ "description": "Defina a aparência padrão da sua página de status pública.",
+ "option": {
+ "logo": {
+ "label": "Logo"
+ },
+ "color": {
+ "label": "Cor da marca"
+ }
+ }
+ },
+ "features": {
+ "title": "Recursos",
+ "description": "Configure quais informações são exibidas na sua página de status.",
+ "option": {
+ "showCharts": {
+ "label": "Mostrar gráficos de tempo de resposta"
+ },
+ "showUptimePercentage": {
+ "label": "Mostrar porcentagem de uptime"
+ },
+ "showAdminLoginLink": {
+ "label": "Mostrar link de login do admin"
+ },
+ "showInfrastructure": {
+ "label": "Mostrar métricas de infraestrutura"
+ }
+ }
+ }
+ }
},
- "game": {
- "label": "",
- "namePlaceholder": "",
- "placeholder": ""
- }
- },
- "uptimeAdvancedMatching": {
- "jsonPath": ""
- },
- "bytesPerSecond": "",
- "bytesReceived": "",
- "bytesSent": "",
- "chooseGame": "",
- "createMonitorPage": {
- "incidentConfigDescription": "",
- "incidentConfigStatusWindowLabel": "",
- "incidentConfigStatusWindowThresholdLabel": "",
- "incidentConfigTitle": "",
- "incidentConfigDescriptionV2": "",
- "incidentConfigStatusCheckNumber": "",
- "intervalTitle": "",
- "intervalDescription": ""
- },
- "dataRate": "",
- "dataReceived": "",
- "dataSent": "",
- "details": "",
- "drops": "",
- "errors": "",
- "errorsIn": "",
- "errorsOut": "",
- "gameServerMonitoring": "",
- "gameServerMonitoringDescription": "",
- "network": "",
- "networkDrops": "",
- "networkErrors": "",
- "networkInterface": "",
- "noNetworkStatsAvailable": "",
- "packetsPerSecond": "",
- "packetsReceived": "",
- "packetsReceivedRate": "",
- "packetsSent": "",
- "rate": "",
- "selectInterface": "",
- "v1": {
- "infrastructure": {
- "disk_selection_title": "Seleção de Discos",
- "disk_selection_info": "Nenhum disco detectado no momento.",
- "disk_selection_description": "Selecione os discos específicos que você deseja monitorar."
+ "uptime": {
+ "filters": {
+ "search": {
+ "placeholder": "Buscar monitores..."
+ }
+ },
+ "table": {
+ "headers": {
+ "responseTime": "Tempo de resposta"
+ }
+ },
+ "fallback": {
+ "actionButton": "Criar um monitor!",
+ "checks": "Check if websites or servers are online & responsive,Alert teams about downtime or performance issues,Monitor HTTP endpoints, pings, containers & ports,Track historical uptime and reliability trends",
+ "title": "Um monitor de uptime é usado para:"
+ }
}
}
}
diff --git a/client/src/locales/ru.json b/client/src/locales/ru.json
index ab40ecb0d2..4611874546 100644
--- a/client/src/locales/ru.json
+++ b/client/src/locales/ru.json
@@ -1,1140 +1,1305 @@
{
- "submit": "Подтвердить",
- "title": "Название",
- "distributedStatusHeaderText": "Охват реального времени и реального устройства",
- "distributedStatusSubHeaderText": "Работает на миллионах устройств по всему миру, просматривайте производительность системы по глобальному региону, стране или городу",
- "settingsDisabled": "Выключено",
- "settingsSuccessSaved": "Настройки успешно сохранены",
- "settingsFailedToSave": "Не удалось сохранить настройки",
- "settingsStatsCleared": "Статистика успешно очищена",
- "settingsFailedToClearStats": "Не удалось очистить статистику",
- "settingsMonitorsDeleted": "Успешно удалены все мониторы",
- "settingsFailedToDeleteMonitors": "Не удалось удалить все мониторы",
- "starPromptTitle": "Запустить Checkmate.",
- "starPromptDescription": "Ознакомьтесь с последними релизами и помогите развить сообщество на GitHub",
- "https": "HTTPS",
- "http": "HTTP",
- "monitor": "монитор",
- "aboutus": "О Нас",
- "now": "Сейчас",
- "delete": "Удалить",
- "configure": "Настроить",
- "responseTime": "Время ответа:",
- "ms": "мс",
- "bar": "Bar",
- "area": "Area",
- "country": "СТРАНА",
- "city": "ГОРОД",
- "response": "ОТВЕТ",
- "monitorStatusUp": "Монитор {name} ({url}) теперь включен и отвечает",
- "monitorStatusDown": "Монитор {name} ({url}) ОТКЛЮЧЕН и не отвечает",
- "webhookSendSuccess": "Уведомление Webhook успешно отправлено",
- "webhookSendError": "Ошибка отправки уведомления webhook на {platform}",
- "webhookUnsupportedPlatform": "Неподдерживаемая платформа: {platform}",
- "distributedRightCategoryTitle": "Монитор",
- "distributedStatusServerMonitors": "Серверные мониторы",
- "distributedStatusServerMonitorsDescription": "Мониторинг состояния связанных серверов",
- "distributedUptimeCreateSelectURL": "Здесь вы можете выбрать URL-адрес хоста, а также тип монитора.",
- "distributedUptimeCreateChecks": "Проверки, которые необходимо выполнить",
- "distributedUptimeCreateChecksDescription": "Вы всегда можете добавить или удалить проверки после добавления своего сайта.",
- "distributedUptimeCreateIncidentNotification": "Уведомления об инцидентах",
- "distributedUptimeCreateIncidentDescription": "В случае возникновения инцидента сообщите об этом пользователям.",
- "distributedUptimeCreateAdvancedSettings": "Расширенные настройки",
- "distributedUptimeDetailsNoMonitorHistory": "Для этого монитора пока нет истории проверок.",
- "distributedUptimeDetailsStatusHeaderUptime": "Аптайм:",
- "distributedUptimeDetailsStatusHeaderLastUpdate": "Последнее обновление",
- "notifications": {
- "enableNotifications": "Включить уведомления {{platform}}",
- "testNotification": "Тестовое уведомление",
- "addOrEditNotifications": "Добавить или изменить уведомления",
- "slack": {
- "label": "Slack",
- "description": "Чтобы включить уведомления Slack, создайте приложение Slack и включите входящие вебхуки. После этого просто укажите URL вебхука здесь.",
- "webhookLabel": "URL вебхука",
- "webhookPlaceholder": "https://hooks.slack.com/services/...",
- "webhookRequired": "Требуется URL-адрес Slack webhook"
- },
- "discord": {
- "label": "Discord",
- "description": "Чтобы отправить данные на канал Discord из Checkmate через уведомления Discord с использованием веб-хуков, вы можете использовать функцию входящих веб-хуков Discord.",
- "webhookLabel": "Discord Webhook URL",
- "webhookPlaceholder": "https://discord.com/api/webhooks/...",
- "webhookRequired": "Требуется URL-адрес веб-сайта Discord webhook"
+ "common": {
+ "auth": {
+ "roles": {
+ "admin": "Администратор",
+ "demo": "Демо",
+ "superadmin": "Суперадминистратор",
+ "user": "Пользователь"
+ }
},
- "telegram": {
- "label": "Telegram",
- "description": "Чтобы включить уведомления Telegram, создайте бота Telegram с помощью BotFather, официального бота для создания и управления ботами Telegram. Затем получите токен API и идентификатор чата и запишите их здесь.",
- "tokenLabel": "Ваш токен бота",
- "tokenPlaceholder": "123456:ABC-DEF1234ghIkl-zyx57W2v1u123ew11",
- "chatIdLabel": "ID Вашего Чата",
- "chatIdPlaceholder": "-1001234567890",
- "fieldsRequired": "Требуется токен Telegram и ID чата"
+ "alerts": {
+ "pageSpeedApiKey": {
+ "content": "Внимание: Вы ещё не добавили ключ API Google PageSpeed. Перейдите в Настройки, чтобы добавить его. Без него монитор PageSpeed не будет работать."
+ }
},
- "webhook": {
- "label": "Вебхуки",
- "description": "Вы можете настроить пользовательский вебхук для получения уведомлений о возникновении инцидентов.",
- "urlLabel": "URL вебхука",
- "urlPlaceholder": "https://your-server.com/webhook",
- "urlRequired": "Требуется URL-адрес webhook"
+ "appName": "Checkmate",
+ "breadcrumbs": {
+ "details": "Подробности",
+ "home": "Главная"
},
- "testNotificationDevelop": "Тестовое уведомление 2",
- "integrationButton": "Интеграция уведомлений",
- "testSuccess": "Уведомление о тестировании отправлено успешно!",
- "testFailed": "Не удалось отправить тестовое уведомление",
- "unsupportedType": "Неподдерживаемый тип уведомления",
- "networkError": "Произошла сетевая ошибка",
- "fallback": {
- "title": "Канал уведомлений используется для:",
- "checks": [
- "Дайте знать команде, если сервер ложится или что-то виснет",
- "Сообщите инженерам, когда появляется какая-то проблема",
- "Уведомляйте админов, если в системе что-то поменялось"
- ],
- "actionButton": "Давайте создадим ваш первый канал уведомлений!"
+ "buttons": {
+ "addMember": "Добавить участника",
+ "cancel": "Отмена",
+ "close": "Закрыть",
+ "configure": "Настроить",
+ "confirm": "Подтвердить",
+ "create": "Создать",
+ "delete": "Удалить",
+ "generateToken": "Сгенерировать токен",
+ "incidents": "Инциденты",
+ "inviteMember": "Пригласить участника",
+ "pause": "Пауза",
+ "resume": "Продолжить",
+ "save": "Сохранить",
+ "sendInvite": "Отправить приглашение",
+ "test": "Тест",
+ "testNotifications": "Тестовые уведомления",
+ "toggleTheme": "Переключить тему",
+ "flushQueue": "Очистить очередь",
+ "notFound": "Перейти на главную панель",
+ "resetPassword": "Сбросить пароль",
+ "reset": "Сброс",
+ "clear": "Очистить",
+ "addDemo": "Добавить демо-мониторы",
+ "removeMonitors": "Удалить мониторы",
+ "sendTestEmail": "Отправить тестовое письмо",
+ "exportToJSON": "Экспорт в JSON",
+ "importFromJSON": "Импорт из JSON",
+ "clearFilters": "Очистить фильтры",
+ "removeUser": "Удалить пользователя"
},
- "createButton": "Создать канал уведомлений",
- "createTitle": "Канал уведомлений",
- "create": {
- "success": "Уведомление успешно создано",
- "failed": "Не удалось создать уведомление."
+ "charts": {
+ "labels": {
+ "averageResponseTime": "Среднее время ответа",
+ "downtime": "Простой",
+ "high": "высокий",
+ "low": "низкий",
+ "uptime": "Аптайм"
+ },
+ "histogram": {
+ "avg": "Сред: {{value}} мс",
+ "max": "Макс: {{value}} мс"
+ }
},
- "fetch": {
- "success": "Уведомления успешно получены",
- "failed": "Не удалось получить уведомления."
+ "dialogs": {
+ "delete": {
+ "description": "Это действие нельзя отменить.",
+ "title": "Вы уверены, что хотите удалить это?"
+ }
},
- "delete": {
- "success": "Уведомление успешно удалено",
- "failed": "Не удалось удалить уведомление."
+ "labels": {
+ "active": "Активный",
+ "paused": "приостановлен",
+ "na": "Н/Д",
+ "resolved": "Решён",
+ "responseTime": "Время ответа"
},
- "edit": {
- "success": "Уведомление успешно обновлено",
- "failed": "Не удалось обновить уведомление."
+ "form": {
+ "role": {
+ "option": {
+ "role": {
+ "label": "Роли"
+ }
+ }
+ },
+ "name": {
+ "option": {
+ "firstName": {
+ "label": "Имя",
+ "placeholder": "Jordan"
+ },
+ "lastName": {
+ "label": "Фамилия",
+ "placeholder": "Ellis"
+ }
+ }
+ },
+ "email": {
+ "option": {
+ "email": {
+ "label": "Эл. почта",
+ "placeholder": "you@example.com"
+ }
+ }
+ }
},
- "test": {
- "success": "Тестовое уведомление успешно отправлено",
- "failed": "Не удалось отправить тестовое уведомление."
+ "table": {
+ "empty": "Здесь пусто",
+ "headers": {
+ "actions": "Действия",
+ "dateTime": "Дата и время",
+ "message": "Сообщение",
+ "monitor": "Монитор",
+ "monitorId": "ID монитора",
+ "name": "Имя",
+ "status": "Статус",
+ "type": "Тип",
+ "url": "URL",
+ "interval": "Интервал",
+ "active": "Активный",
+ "responseTime": "Время ответа"
+ }
}
},
- "testLocale": "testLocale",
- "add": "Добавить",
- "monitors": "мониторы",
- "distributedUptimeStatusCreateStatusPage": "страница статуса",
- "distributedUptimeStatusCreateStatusPageAccess": "Доступ",
- "distributedUptimeStatusCreateStatusPageReady": "Если ваша страница статуса готова, вы можете отметить ее как опубликованную.",
- "distributedUptimeStatusBasicInfoHeader": "Основная информация",
- "distributedUptimeStatusBasicInfoDescription": "Определите название компании и поддомен, на который ссылается ваша страница статуса.",
- "distributedUptimeStatusLogoHeader": "Логотип",
- "distributedUptimeStatusLogoDescription": "Загрузите логотип для своей страницы статуса",
- "distributedUptimeStatusLogoUploadButton": "Загрузить логотип",
- "distributedUptimeStatusStandardMonitorsHeader": "Стандартные Мониторы",
- "distributedUptimeStatusStandardMonitorsDescription": "Прикрепите стандартные мониторы к своей странице статуса.",
- "distributedUptimeStatusCreateYour": "Создайте свой",
- "distributedUptimeStatusEditYour": "Отредактируйте свой",
- "distributedUptimeStatusPublishedLabel": "Опубликовано и доступно для общественности",
- "distributedUptimeStatusCompanyNameLabel": "Название компании",
- "distributedUptimeStatusPageAddressLabel": "Адрес вашей страницы статуса",
- "distributedUptimeStatus30Days": "30 дней",
- "distributedUptimeStatus60Days": "60 дней",
- "distributedUptimeStatus90Days": "90 дней",
- "distributedUptimeStatusPageNotSetUp": "Страница статуса не настроена.",
- "distributedUptimeStatusContactAdmin": "Пожалуйста, свяжитесь с вашим администратором",
- "distributedUptimeStatusPageNotPublic": "Эта страница статуса не является публичной.",
- "distributedUptimeStatusPageDeleteDialog": "Вы хотите удалить эту страницу статуса?",
- "distributedUptimeStatusPageDeleteConfirm": "Да, удалить страницу статуса",
- "distributedUptimeStatusPageDeleteDescription": "После удаления ваша страница статуса не может быть восстановлена.",
- "distributedUptimeStatusDevices": "Устройства",
- "distributedUptimeStatusUpt": "UPT",
- "distributedUptimeStatusUptBurned": "UPT Burned",
- "distributedUptimeStatusUptLogo": "Upt Logo",
- "incidentsTableNoIncidents": "Инцидентов не зафиксировано",
- "incidentsTablePaginationLabel": "инциденты",
- "incidentsTableMonitorName": "Имя Монитора",
- "incidentsTableStatus": "Статус",
- "incidentsTableDateTime": "Дата и Время",
- "incidentsTableStatusCode": "Код Статуса",
- "incidentsTableMessage": "Сообщение",
- "incidentsOptionsHeader": "Инцидент для:",
- "incidentsOptionsHeaderFilterBy": "Фильтровать по:",
- "incidentsOptionsHeaderFilterAll": "Все",
- "incidentsOptionsHeaderFilterDown": "Недоступно",
- "incidentsOptionsHeaderFilterCannotResolve": "Невозможно решить",
- "incidentsOptionsHeaderShow": "Показать:",
- "incidentsOptionsHeaderLastHour": "Последний час",
- "incidentsOptionsHeaderLastDay": "Последний день",
- "incidentsOptionsHeaderLastWeek": "Последняя неделя",
- "incidentsOptionsPlaceholderAllServers": "Все сервера",
- "infrastructureCreateYour": "Создайте свой",
- "infrastructureCreateGeneralSettingsDescription": "Здесь вы можете выбрать URL-адрес хоста, а также понятное имя и секретный ключ авторизации для подключения к агенту сервера.",
- "infrastructureServerRequirement": "Сервер, который вы отслеживаете, должен быть запущен",
- "infrastructureCustomizeAlerts": "Настройте оповещения",
- "infrastructureAlertNotificationDescription": "Отправлять уведомления пользователям, когда пороговые значения превышают указанный процент.",
- "infrastructureCreateMonitor": "Создать Монитор Инфраструктуры",
- "infrastructureProtocol": "Протокол",
- "infrastructureServerUrlLabel": "URL Сервера",
- "infrastructureDisplayNameLabel": "Отображаемое имя",
- "infrastructureAuthorizationSecretLabel": "Секрет авторизации",
- "gb": "ГБ",
- "mb": "МБ",
- "mem": "Mem",
- "memoryUsage": "Использование памяти",
- "cpu": "CPU",
- "cpuUsage": "Использование CPU",
- "cpuTemperature": "Температура CPU",
- "diskUsage": "Использование диска",
- "used": "Использовал",
- "total": "Всего",
- "cores": "Ядра",
- "frequency": "Частота",
- "status": "Статус",
- "cpuPhysical": "CPU (физический)",
- "cpuLogical": "CPU (логический)",
- "cpuFrequency": "Частота CPU",
- "avgCpuTemperature": "Средняя температура CPU",
- "memory": "Память",
- "disk": "Диск",
- "uptime": "Аптайм",
- "os": "ОС",
- "host": "Хост",
- "actions": "Действия",
- "integrations": "Интеграции",
- "integrationsPrism": "Подключите Prism к вашему любимому сервису.",
- "integrationsSlack": "Slack",
- "integrationsSlackInfo": "Подключитесь к Slack и просматривайте инциденты в канале",
- "integrationsDiscord": "Discord",
- "integrationsDiscordInfo": "Подключитесь к Discord и просматривайте инциденты прямо в канале",
- "integrationsZapier": "Zapier",
- "integrationsZapierInfo": "Отправляйте все инциденты в Zapier, и тогда вы сможете видеть их везде",
- "commonSave": "Сохранить",
- "createYour": "Создать свой",
- "createMonitor": "Создать монитор",
- "pause": "Пауза",
- "resume": "Продолжить",
- "editing": "Редактирование...",
- "url": "URL",
- "access": "Доступ",
- "timezone": "Часовой пояс",
- "features": "Функции",
- "administrator": "Администратор?",
- "loginHere": "Войти здесь",
- "displayName": "Отображаемое имя",
- "urlMonitor": "URL для монитора",
- "portToMonitor": "Порт для монитора",
- "websiteMonitoring": "Мониторинг сайта",
- "websiteMonitoringDescription": "Используйте HTTP(s) для вашего веб-сайта или API-endpoint.",
- "pingMonitoring": "Ping мониторинг",
- "pingMonitoringDescription": "Проверьте, доступен ли ваш сервер.",
- "dockerContainerMonitoring": "Мониторинг Docker-контейнера",
- "dockerContainerMonitoringDescription": "Проверьте, запущен ли ваш Docker-контейнер.",
- "portMonitoring": "Мониторинг портов",
- "portMonitoringDescription": "Проверьте, открыт ли ваш порт.",
- "createMaintenanceWindow": "Создать окно техобслуживания",
- "createMaintenance": "Создание техобслуживания",
- "editMaintenance": "Редактировать техобслуживание",
- "maintenanceWindowName": "Название окна техобслуживания",
- "friendlyNameInput": "Дружественное имя",
- "friendlyNamePlaceholder": "Техническое обслуживание в __ : __ в течение ___ минут",
- "maintenanceRepeat": "Повторное техническое обслуживание",
- "maintenance": "техобслуживание",
- "duration": "Продолжительность",
- "addMonitors": "Добавить мониторы",
- "window": "окно",
- "cancel": "Отмена",
- "message": "Сообщение",
- "low": "низкий",
- "high": "высокий",
- "statusCode": "Код статуса",
- "date&Time": "Дата и Время",
- "type": "Тип",
- "statusPageName": "Имя страница статуса",
- "publicURL": "Публичный URL",
- "repeat": "Повторить",
- "edit": "Редактировать",
- "createA": "Создать",
- "remove": "Удалить",
- "maintenanceWindowDescription": "Ваши запросы не будут отправляться в этот период времени.",
- "startTime": "Время начала",
- "timeZoneInfo": "Все даты и время указаны в часовом поясе GMT+0.",
- "monitorsToApply": "Мониторы, к которым применяется окно техобслуживания",
- "nextWindow": "Следующее окно",
- "notFoundButton": "Перейти на главную панель управления",
- "pageSpeedConfigureSettingsDescription": "Здесь вы можете выбрать URL-адрес хоста, а также тип монитора.",
- "monitorDisplayName": "Отображаемое имя монитора",
- "whenNewIncident": "Когда происходит новый инцидент,",
- "notifySMS": "Уведомить по SMS (скоро)",
- "notifyEmails": "Также уведомлять по электронной почте на несколько адресов (скоро)",
- "seperateEmails": "Вы можете разделить несколько адресов электронной почты запятой.",
- "checkFrequency": "Проверить частоту",
- "matchMethod": "Метод сопоставления",
- "expectedValue": "Ожидаемое значение",
- "deleteDialogTitle": "Вы действительно хотите удалить этот монитор?",
- "deleteDialogDescription": "После удаления этот монитор не может быть восстановлен.",
- "pageSpeedMonitor": "PageSpeed монитор",
- "shown": "Показано",
- "ago": "назад",
- "companyName": "Название компании",
- "pageSpeedDetailsPerformanceReport": "Значения являются приблизительными и могут отличаться.",
- "pageSpeedDetailsPerformanceReportCalculator": "Посмотреть калькулятор",
- "checkingEvery": "Проверка каждого",
- "statusPageCreateSettings": "Если ваша страница статуса готова, вы можете отметить ее как опубликованную.",
- "basicInformation": "Основная информация",
- "statusPageCreateBasicInfoDescription": "Определите название компании и поддомен, на который ссылается ваша страница статуса.",
- "statusPageCreateSelectTimeZoneDescription": "Выберите часовой пояс, в котором будет отображаться ваша страница статуса.",
- "statusPageCreateAppearanceDescription": "Определите внешний вид и содержание вашей публичной страницы статуса по умолчанию.",
- "statusPageCreateSettingsCheckboxLabel": "Опубликовано и доступно для общественности",
- "statusPageCreateBasicInfoStatusPageAddress": "Адрес вашей страницы статуса",
- "statusPageCreateTabsContent": "Серверы страниц состояния",
- "statusPageCreateTabsContentDescription": "Вы можете добавить любое количество серверов, которые вы отслеживаете, на свою страницу статуса. Вы также можете изменить их порядок для лучшего просмотра.",
- "statusPageCreateTabsContentFeaturesDescription": "Показать больше подробностей на странице статуса",
- "showCharts": "Показать графики",
- "showUptimePercentage": "Показать процент работоспособности",
- "removeLogo": "Удалить логотип",
- "statusPageStatus": "Публичная страница статуса не создана.",
- "statusPageStatusContactAdmin": "Пожалуйста, свяжитесь с вашим администратором.",
- "statusPageStatusNotPublic": "Эта страница статуса не является публичной.",
- "statusPageStatusNoPage": "Здесь нет страницы статуса.",
- "statusPageStatusServiceStatus": "Статус услуги",
- "deleteStatusPage": "Вы хотите удалить эту страницу статуса?",
- "deleteStatusPageConfirm": "Да, удалить страницу статуса",
- "deleteStatusPageDescription": "После удаления ваша страница статуса не может быть восстановлена.",
- "uptimeCreate": "Ожидаемое значение используется для сопоставления с результатом ответа, и совпадение определяет статус.",
- "uptimeCreateJsonPath": "Это выражение будет оценено по данным ответа JSON, а результат будет использован для сопоставления с ожидаемым значением. См.",
- "uptimeCreateJsonPathQuery": "для документации по языку запросов.",
- "maintenanceTableActionMenuDialogTitle": "Вы действительно хотите удалить это окно обслуживания?",
- "infrastructureEditYour": "Отредактируйте свой",
- "infrastructureEditMonitor": "Сохранить Монитор Инфраструктуры",
- "infrastructureMonitorCreated": "Монитор инфраструктуры успешно создан!",
- "infrastructureMonitorUpdated": "Монитор инфраструктуры успешно обновлен!",
- "errorInvalidTypeId": "Указанный неверный тип уведомления",
- "errorInvalidFieldId": "Указан неверный идентификатор поля",
- "inviteNoTokenFound": "Токен приглашения не найден",
- "pageSpeedWarning": "Внимание: Вы еще не добавили API-ключ Google PageSpeed. Без него PageSpeed монитор не будет работать.",
- "pageSpeedLearnMoreLink": "Нажми здесь",
- "pageSpeedAddApiKey": "чтобы добавить свой API-ключ.",
- "update": "Обновить",
- "invalidFileFormat": "Неподдерживаемый формат файла!",
- "invalidFileSize": "Размер файла слишком велик!",
- "ClickUpload": "Нажмите, чтобы загрузить",
- "DragandDrop": "drag and drop",
- "MaxSize": "Максимальный размер",
- "SupportedFormats": "Поддерживаемые форматы",
- "FirstName": "Имя",
- "LastName": "Фамилия",
- "EmailDescriptionText": "Это ваш текущий адрес электронной почты — он не может быть изменен.",
- "YourPhoto": "Фотография профиля",
- "PhotoDescriptionText": "Эта фотография будет отображена на странице вашего профиля.",
- "save": "Сохранить",
- "DeleteDescriptionText": "Это приведет к удалению учетной записи и всех связанных с ней данных с сервера. Это необратимо.",
- "DeleteAccountWarning": "Удаление вашей учетной записи означает, что вы не сможете снова войти в систему, и все ваши данные будут удалены. Это необратимо.",
- "DeleteWarningTitle": "Действительно удаляете эту учетную запись?",
- "bulkImport": {
- "title": "Массовый импорт",
- "selectFileTips": "Выберите CSV-файл для загрузки",
- "selectFileDescription": "Вы можете скачать наш шаблон или образец",
- "selectFile": "Выберите файл",
- "parsingFailed": "Не удалось выполнить синтаксический анализ",
- "uploadSuccess": "Мониторы успешно созданы!",
- "validationFailed": "Не удалось выполнить проверку",
- "noFileSelected": "Файл не выбран",
- "fallbackPage": "Импортируйте файл для массовой загрузки списка серверов",
- "invalidFileType": "Неверный тип файла",
- "uploadFailed": "Загрузка не удалась"
- },
- "DeleteAccountTitle": "Удалить аккаунт",
- "DeleteAccountButton": "Удалить аккаунт",
- "publicLink": "Публичная ссылка",
- "maskedPageSpeedKeyPlaceholder": "*************************************",
- "reset": "Сброс",
- "ignoreTLSError": "Игнорировать ошибку TLS/SSL",
- "tlsErrorIgnored": "Ошибки TLS/SSL игнорируются",
- "ignoreTLSErrorDescription": "Игнорируйте ошибки TLS/SSL и продолжайте проверять доступность веб-сайта",
- "createNew": "Создавать новые",
- "greeting": {
- "prepend": "Эй там",
- "append": "Вторая половина дня — это ваша игровая площадка - давайте сделаем ее эпичной!",
- "overview": "Вот обзор ваших мониторов {{type}}."
- },
- "roles": {
- "superAdmin": "Главный админ",
- "admin": "Админ",
- "teamMember": "Член команды",
- "demoUser": "Демо пользователь"
- },
- "teamPanel": {
- "teamMembers": "Члены команды",
- "filter": {
- "all": "Все",
- "member": "Член"
+ "components": {
+ "imageUpload": {
+ "clickToUpload": "Нажмите для загрузки",
+ "dragAndDrop": "drag and drop",
+ "supportedFormats": "Поддерживаемые форматы",
+ "maxSize": "Максимальный размер",
+ "orDragAndDrop": "или перетащите",
+ "errors": {
+ "invalidFileSize": "Размер файла слишком велик!",
+ "invalidFileFormat": "Неподдерживаемый формат файла!"
+ }
},
- "inviteTeamMember": "Пригласить члена команды",
- "inviteNewTeamMember": "Пригласите нового члена команды",
- "inviteDescription": "Когда вы добавите нового члена команды, он получит доступ ко всем мониторам.",
- "email": "Email",
- "selectRole": "Выберите роль",
- "inviteLink": "Ссылка для приглашения",
- "cancel": "Отменить",
- "noMembers": "В команде нет членов с такой ролью",
- "getToken": "Получить токен",
- "emailToken": "E-mail токен",
- "table": {
- "name": "Имя",
- "email": "Email",
- "role": "Роль",
- "created": "Создано"
+ "headerStatusPageControls": {
+ "publicLink": "Публичная ссылка"
},
- "addTeamMember": {
- "addMemberMenu": "Добавить члена команды",
- "title": "Зарегистрируйте нового члена команды",
- "description": "Создайте нового пользователя и передайте ему учётные данные. Этот метод даёт участнику мгновенный доступ ко всем мониторам.",
- "addButton": "Добавить участника"
+ "headerTimeRange": {
+ "labels": {
+ "day": "День",
+ "month": "Месяц",
+ "recent": "Недавние",
+ "week": "Неделя"
+ },
+ "description": {
+ "recent": "Статистика за последние 2 часа.",
+ "day": "Статистика за последние 24 часа.",
+ "week": "Статистика за последние 7 дней.",
+ "month": "Статистика за последние 30 дней."
+ }
},
- "register": "Зарегистрируйте члена команды",
- "registerToast": {
- "success": "Созданный пользователем, безопасный обмен учетными данными с участником.",
- "dbUserExists": "Пользователь уже существует.",
- "unknownError": "Произошла неизвестная ошибка."
+ "offlineBanner": {
+ "serverUnreachable": "Не удаётся подключиться к серверу",
+ "retry": "Повторить",
+ "retrying": "Повторная попытка...",
+ "reconnected": "Успешное повторное подключение к серверу."
},
- "registerTeamMember": {
- "title": "Зарегистрировать члена команды",
- "auth": {
- "common": {
- "inputs": {
- "firstName": {
- "errors": {
- "empty": "Пожалуйста, введите имя",
- "pattern": "Имя должно содержать только буквы, пробелы, апострофы или дефисы."
- }
- },
- "lastName": {
- "errors": {
- "empty": "Пожалуйста, введите фамилию",
- "pattern": "Фамилия должна содержать только буквы, пробелы, апострофы или дефисы."
- }
+ "sidebar": {
+ "menu": {
+ "uptime": "Аптайм",
+ "pagespeed": "Pagespeed",
+ "infrastructure": "Инфраструктура",
+ "notifications": "Уведомления",
+ "checks": "Проверки",
+ "incidents": "Инциденты",
+ "statusPages": "Страницы статуса",
+ "maintenance": "Обслуживание",
+ "logs": "Логи",
+ "settings": "Настройки"
+ },
+ "bottomMenu": {
+ "support": "Поддержка",
+ "discussions": "Обсуждения",
+ "docs": "Документация",
+ "changelog": "Журнал изменений"
+ },
+ "accountMenu": {
+ "profile": "Профиль",
+ "password": "Пароль",
+ "team": "Команда"
+ },
+ "starPrompt": {
+ "title": "Star Checkmate",
+ "description": "Следите за последними релизами и помогайте развивать сообщество на GitHub"
+ },
+ "authFooter": {
+ "navControls": "Управления",
+ "logOut": "Выйти",
+ "roles": {
+ "superAdmin": "Суперадминистратор",
+ "admin": "Администратор",
+ "user": "Пользователь",
+ "demoUser": "Демо пользователь"
+ }
+ }
+ },
+ "starPrompt": {
+ "title": "Star Checkmate",
+ "description": "Следите за последними релизами и помогайте развивать сообщество на GitHub"
+ }
+ },
+ "pages": {
+ "notFound": {
+ "title": "Ой! Вы уронили суши!",
+ "subtitle": "Либо URL не существует, либо у Вас нет к нему доступа."
+ },
+ "account": {
+ "tabs": {
+ "profile": "Профиль",
+ "password": "Пароль",
+ "team": "Команда"
+ },
+ "form": {
+ "name": {
+ "title": "Имя",
+ "description": "Обновите свою личную информацию"
+ },
+ "photo": {
+ "title": "Фото профиля",
+ "description": "Загрузите фото профиля"
+ },
+ "currentPassword": {
+ "title": "Текущий пароль",
+ "description": "Введите текущий пароль для подтверждения личности",
+ "option": {
+ "label": "Текущий пароль",
+ "placeholder": "Введите текущий пароль"
+ }
+ },
+ "newPassword": {
+ "title": "Новый пароль",
+ "description": "Выберите надёжный пароль длиной не менее 8 символов",
+ "option": {
+ "newPassword": {
+ "label": "Новый пароль",
+ "placeholder": "Введите новый пароль"
},
+ "confirm": {
+ "label": "Подтвердите пароль",
+ "placeholder": "Подтвердите новый пароль"
+ }
+ }
+ },
+ "deleteAccount": {
+ "title": "Удалить аккаунт",
+ "description": "Это действие необратимо и не может быть отменено"
+ }
+ },
+ "team": {
+ "filter": {
+ "placeholder": "Фильтр по роли",
+ "all": "Все",
+ "admin": "Администратор",
+ "member": "Член"
+ },
+ "table": {
+ "headers": {
+ "email": "Эл. почта",
+ "role": "Роль",
+ "created": "Создано"
+ }
+ },
+ "addMember": {
+ "title": "Зарегистрировать нового участника",
+ "description": "Создайте новый аккаунт. После создания безопасно передайте учётные данные."
+ },
+ "invite": {
+ "title": "Пригласить участника команды",
+ "description": "Отправить приглашение в Вашу команду",
+ "email": {
+ "label": "Адрес эл. почты",
+ "placeholder": "Введите адрес эл. почты"
+ },
+ "role": {
+ "label": "Роль",
+ "placeholder": "Выберите роль"
+ },
+ "linkLabel": "Ссылка-приглашение"
+ }
+ }
+ },
+ "auth": {
+ "common": {
+ "passwordRules": {
+ "length": {
+ "beginning": "Должен быть как минимум",
+ "highlighted": "8 символов в длину"
+ },
+ "lowercase": {
+ "beginning": "Должен содержать как минимум",
+ "highlighted": "одну прописную букву"
+ },
+ "match": {
+ "beginning": "Пароли",
+ "highlighted": "должны совпадать"
+ },
+ "number": {
+ "beginning": "Должен содержать как минимум",
+ "highlighted": "одно число"
+ },
+ "special": {
+ "beginning": "Должен содержать как минимум",
+ "highlighted": "один спецсимвол"
+ },
+ "uppercase": {
+ "beginning": "Должен содержать как минимум",
+ "highlighted": "одну заглавную букву"
+ }
+ },
+ "form": {
+ "option": {
"email": {
- "errors": {
- "empty": "Чтобы продолжить, введите адрес электронной почты.",
- "invalid": "Пожалуйста, перепроверьте правильность введенного адреса электронной почты."
- }
+ "label": "Эл. почта",
+ "placeholder": "me@example.com"
},
- "role": {
- "errors": {
- "empty": "Требуется роль"
- }
+ "password": {
+ "label": "Пароль",
+ "placeholder": "********"
+ },
+ "confirmPassword": {
+ "label": "Подтвердите пароль"
}
}
}
+ },
+ "login": {
+ "title": "С возвращением в Checkmate!",
+ "subtitle": "Войдите, чтобы продолжить",
+ "submit": "Войти",
+ "links": {
+ "forgotPassword": {
+ "text": "Забыли пароль?",
+ "linkText": "Сбросить пароль"
+ },
+ "register": {
+ "text": "Нет аккаунта?",
+ "linkText": "Зарегистрируйтесь"
+ }
+ }
+ },
+ "register": {
+ "title": "С возвращением в Checkmate!",
+ "subtitle": "Зарегистрируйтесь, чтобы начать",
+ "submit": "Регистрация"
+ },
+ "forgotPassword": {
+ "title": "Забыли пароль?",
+ "subtitle": "Не беспокойтесь, мы отправим Вам инструкции по сбросу.",
+ "submit": "Запросить восстановление",
+ "links": {
+ "login": {
+ "text": "Вернуться к",
+ "linkText": "входу"
+ }
+ }
+ },
+ "setNewPassword": {
+ "title": "Сбросить пароль",
+ "subtitle": "Новый пароль должен отличаться от ранее использованных паролей."
}
},
- "role": "Роль",
- "changeTeamPassword": {
- "changePasswordMenu": "Сбросить пароль",
- "title": "Сбросить пароль члена команды",
- "description": "Создайте новый пароль для этого члена команды. Вам необходимо будет сообщить ему пароль по секретному адресу.",
- "success": "Пароль успешно сброшен. Убедитесь, что вы предоставили учётные данные участнику безопасным способом."
- }
- },
- "monitorState": {
- "paused": "Остановлено",
- "resumed": "Продолжено",
- "active": "Активно"
- },
- "menu": {
- "uptime": "Аптайм",
- "pagespeed": "Pagespeed",
- "infrastructure": "Инфраструктура",
- "incidents": "Инциденты",
- "statusPages": "Страницы статуса",
- "maintenance": "Обслуживание",
- "integrations": "Интеграции",
- "settings": "Настройки",
- "support": "Поддержка",
- "discussions": "Обсуждения",
- "docs": "Документация",
- "changelog": "Журнал изменений",
- "profile": "Профиль",
- "password": "Пароль",
- "team": "Команда",
- "logOut": "Выйти",
- "notifications": "Уведомления",
- "logs": "Логи"
- },
- "settingsEmailUser": "Email пользователь",
- "state": "Состояние",
- "statusBreadCrumbsStatusPages": "Страницы статуса",
- "statusBreadCrumbsDetails": "Подробности",
- "commonSaving": "Сохранение...",
- "navControls": "Управления",
- "incidentsPageTitle": "Инциденты",
- "passwordPanel": {
- "passwordChangedSuccess": "Ваш пароль был успешно изменен.",
- "passwordInputIncorrect": "Ваш пароль был введен неверно.",
- "currentPassword": "Current пароль",
- "enterCurrentPassword": "Введите свой текущий пароль",
- "newPassword": "Новый пароль",
- "enterNewPassword": "Введите свой новый пароль",
- "confirmNewPassword": "Подтвердите новый пароль",
- "passwordRequirements": "Новый пароль должен содержать не менее 8 символов и содержать как минимум одну заглавную букву, одну строчную букву, одну цифру и один специальный символ.",
- "saving": "Сохранение..."
- },
- "emailSent": "Письмо успешно отправлено",
- "failedToSendEmail": "Не удалось отправить письмо",
- "settingsTestEmailSuccess": "Тестовое письмо успешно отправлено",
- "settingsTestEmailFailed": "Не удалось отправить тестовое письмо",
- "settingsTestEmailFailedWithReason": "Не удалось отправить тестовое письмо: {{reason}}",
- "settingsTestEmailUnknownError": "Неизвестная ошибка",
- "statusMsg": {
- "paused": "Мониторинг приостановлен",
- "up": "Ваш сайт запущен.",
- "down": "Сайт оффлайн.",
- "pending": "Ожидание..."
- },
- "uptimeGeneralInstructions": {
- "http": "Введите URL-адрес или IP-адрес для мониторинга (например, https://example.com/ или 192.168.1.100) и добавьте понятное имя, которое будет отображаться на панели инструментов.",
- "ping": "Ведите IP-адрес или имя хоста для пинга (например, 192.168.1.100 или example.com) и добавьте понятное имя, которое будет отображаться на панели инструментов.",
- "docker": "Введите Docker ID вашего контейнера. Docker ID должен быть полным 64-символьным Docker ID. Вы можете запустить docker inspect , чтобы получить полный ID контейнера.",
- "port": "Введите URL-адрес или IP-адрес сервера, номер порта и понятное имя, которое будет отображаться на панели инструментов.",
- "game": "Введите IP-адрес или имя хоста и номер порта для пинга (например, 192.168.1.100 или example.com) и выберите тип игры.",
- "https": "Введите URL-адрес или IP-адрес для мониторинга (например, https://example.com/ или 192.168.1.100) и добавьте понятное отображаемое имя, которое будет отображаться на панели управления."
- },
- "common": {
- "appName": "Checkmate",
- "monitoringAgentName": "Захватить",
- "buttons": {
- "toggleTheme": "Переключить тему"
+ "checks": {
+ "selects": {
+ "monitor": {
+ "all": "Все мониторы"
+ },
+ "status": {
+ "all": "Все",
+ "down": "Недоступен",
+ "up": "Доступен"
+ }
+ },
+ "table": {
+ "empty": "Нет проверок с ошибками за этот период",
+ "headers": {
+ "statusCode": "Код статуса",
+ "location": "Расположение"
+ }
+ }
},
- "toasts": {
- "networkError": "Ошибка сети",
- "checkConnection": "Пожалуйста, проверьте свое сетевое соединение",
- "unknownError": "Неизвестная ошибка"
- }
- },
- "auth": {
"common": {
- "navigation": {
- "continue": "Продолжить",
- "back": "Назад"
- },
- "inputs": {
- "email": {
- "label": "Электронная почта",
- "placeholder": "jordan.ellis@domain.com",
- "errors": {
- "empty": "Для продолжения введите свой адрес электронной почты",
- "invalid": "Пожалуйста, проверьте правильность введённого адреса электронной почты"
- }
+ "monitors": {
+ "actions": {
+ "configure": "Настроить",
+ "delete": "Удалить",
+ "generateToken": "Сгенерировать токен",
+ "details": "Подробности",
+ "incidents": "Инциденты",
+ "inviteMember": "Пригласить участника",
+ "openSite": "Открыть сайт",
+ "pause": "Пауза",
+ "resume": "Продолжить"
+ },
+ "statBoxes": {
+ "activeFor": "Активен",
+ "certificateExpiry": "Истечение сертификата",
+ "lastCheck": "Последняя проверка",
+ "lastResponseTime": "Последнее время ответа"
+ },
+ "status": {
+ "down": "недоступен",
+ "breached": "порог превышен",
+ "initializing": "инициализация",
+ "maintenance": "обслуживание",
+ "paused": "приостановлен",
+ "total": "всего",
+ "up": "доступен"
+ },
+ "monitorTypes": {
+ "optionDocker": "Docker",
+ "optionGame": "Игра",
+ "optionHttp": "HTTP(S)",
+ "optionPing": "Ping",
+ "optionPort": "Порт",
+ "optionPagespeed": "PageSpeed",
+ "optionHardware": "Инфраструктура",
+ "optionGrpc": "gRPC",
+ "optionWebSocket": "WebSocket"
+ }
+ }
+ },
+ "createMonitor": {
+ "form": {
+ "advanced": {
+ "description": "Дополнительные настройки для расширенных сценариев",
+ "option": {
+ "advancedMatching": {
+ "label": "Использовать расширенное сопоставление"
+ },
+ "expectedValue": {
+ "label": "Ожидаемое значение"
+ },
+ "jsonPath": {
+ "description": "Это выражение будет вычислено для JSON-данных ответа, и результат будет сопоставлен с ожидаемым значением. См. документацию по языку запросов на jmespath.org.",
+ "label": "Выражение JSONPath"
+ },
+ "matchMethod": {
+ "label": "Метод сопоставления",
+ "equal": "Равный",
+ "include": "Включить",
+ "regex": "Regex"
+ }
+ },
+ "title": "Расширенные настройки"
},
- "password": {
- "label": "Пароль",
- "rules": {
- "length": {
- "beginning": "Должен быть как минимум",
- "highlighted": "8 символов в длину"
+ "frequency": {
+ "description": "Как часто Вы хотите проверять статус этого монитора?",
+ "option": {
+ "frequency": {
+ "label": "Частота проверки",
+ "value": {
+ "fifteenMinutes": "15 минут",
+ "fifteenSeconds": "15 секунд",
+ "fiveMinutes": "5 минут",
+ "fourMinutes": "4 минуты",
+ "oneMinute": "1 минута",
+ "tenMinutes": "10 минут",
+ "thirtyMinutes": "30 минут",
+ "thirtySeconds": "30 секунд",
+ "threeMinutes": "3 минуты",
+ "twoMinutes": "2 минуты"
+ }
+ }
+ },
+ "title": "Частота проверки"
+ },
+ "general": {
+ "option": {
+ "container": {
+ "label": "Имя/ID контейнера",
+ "placeholder": "my-app или abcd1234"
+ },
+ "host": {
+ "label": "Хост",
+ "placeholder": "192.168.1.100 или example.com"
+ },
+ "name": {
+ "label": "Отображаемое имя",
+ "placeholder": "напр. Мой сайт"
},
- "special": {
- "beginning": "Должен содержать как минимум",
- "highlighted": "один спецсимвол"
+ "secret": {
+ "label": "Секрет авторизации",
+ "placeholder": "Введите Ваш секретный ключ"
},
- "number": {
- "beginning": "Должен содержать как минимум",
- "highlighted": "одно число"
+ "url": {
+ "label": "URL",
+ "placeholder": "https://www.google.com"
},
- "uppercase": {
- "beginning": "Должен содержать как минимум",
- "highlighted": "одну заглавную букву"
+ "game": {
+ "label": "URL для мониторинга",
+ "placeholder": "localhost"
},
- "lowercase": {
- "beginning": "Должен содержать как минимум",
- "highlighted": "одну прописную букву"
+ "port": {
+ "label": "Порт для мониторинга",
+ "placeholder": "80"
},
- "match": {
- "beginning": "Пароли",
- "highlighted": "должны совпадать"
+ "grpcServiceName": {
+ "label": "Имя сервиса",
+ "placeholder": "напр. my.service.v1 (оставьте пустым для общей проверки)"
+ },
+ "wsUrl": {
+ "label": "WebSocket URL",
+ "placeholder": "wss://example.com/socket"
}
},
- "errors": {
- "empty": "Пожалуйста, введите пароль",
- "length": "Пароль должен быть длиной не менее 8 символов",
- "uppercase": "Пароль должен содержать минимум 1 прописную букву",
- "lowercase": "Пароль должен содержать минимум 1 строчную букву",
- "number": "Пароль должен содержать минимум 1 цифру",
- "special": "Пароль должен содержать минимум 1 спецсимвол",
- "incorrect": "Предоставленный вами пароль не соответствует нашим записям"
+ "title": "Основные настройки",
+ "description": {
+ "http": "Введите URL или IP для мониторинга (напр., https://example.com/ или 192.168.1.100) и добавьте понятное имя для отображения на панели.",
+ "ping": "Ведите IP-адрес или имя хоста для пинга (например, 192.168.1.100 или example.com) и добавьте понятное имя, которое будет отображаться на панели инструментов.",
+ "port": "Введите URL-адрес или IP-адрес сервера, номер порта и понятное имя, которое будет отображаться на панели инструментов.",
+ "docker": "Введите Docker ID вашего контейнера. Docker ID должен быть полным 64-символьным Docker ID. Вы можете запустить docker inspect , чтобы получить полный ID контейнера.",
+ "game": "Введите IP-адрес или имя хоста и номер порта для пинга (например, 192.168.1.100 или example.com) и выберите тип игры.",
+ "pagespeed": "Отслеживайте производительность загрузки, Core Web Vitals и показатели оптимизации для Вашего сайта.",
+ "grpc": "Введите имя хоста и порт gRPC-сервера, при необходимости укажите имя сервиса для проверки состояния и добавьте отображаемое имя.",
+ "websocket": "Введите WebSocket URL для мониторинга (напр., wss://example.com/socket) и добавьте отображаемое имя.",
+ "hardware": "Мониторинг CPU, памяти, дисков и температуры Вашей инфраструктуры."
}
},
- "passwordConfirm": {
- "label": "Подтвердите пароль",
- "placeholder": "Введите пароль еще раз для подтверждения",
- "errors": {
- "empty": "Пожалуйста, введите свой пароль еще раз для подтверждения (помогает избежать опечаток)",
- "different": "Введённые пароли не совпадают, вероятно, один из них напечатан с ошибкой"
- }
+ "ignoreTls": {
+ "description": "Настройте проверку сертификатов TLS/SSL для HTTPS-подключений.",
+ "option": {
+ "tls": {
+ "label": "Игнорировать ошибки TLS/SSL"
+ }
+ },
+ "title": "Настройки TLS/SSL"
},
- "firstName": {
- "label": "Имя",
- "placeholder": "Jordan",
- "errors": {
- "empty": "Пожалуйста, введите свое имя",
- "length": "Имя должно быть короче 50 символов",
- "pattern": "Имя должно содержать только буквы, пробелы, апострофы или дефисы"
+ "incidents": {
+ "description": "Скользящее окно используется для определения момента, когда монитор становится недоступным. Статус монитора изменится только когда процент проверок в скользящем окне достигнет указанного значения.",
+ "option": {
+ "checks": {
+ "label": "Количество проверок в скользящем окне"
+ },
+ "percentage": {
+ "label": "Какой процент проверок в скользящем окне должен завершиться неудачей/успехом, прежде чем статус монитора изменится?"
+ }
+ },
+ "title": "Инциденты"
+ },
+ "notifications": {
+ "description": "Выберите каналы уведомлений, которые хотите использовать",
+ "title": "Уведомления"
+ },
+ "type": {
+ "description": "Выберите тип проверки",
+ "optionDockerDescription": "Используйте Docker для мониторинга работы контейнера.",
+ "optionGameDescription": "Мониторинг доступности игрового сервера.",
+ "optionGrpcDescription": "Мониторинг gRPC-сервисов с использованием стандартного протокола проверки состояния.",
+ "optionWebSocketDescription": "Мониторинг WebSocket-эндпоинтов: состояние подключения и время ответа.",
+ "optionHttpDescription": "Используйте HTTP(S) для мониторинга Вашего сайта или API-эндпоинта.",
+ "optionPingDescription": "Используйте ICMP Ping для проверки доступности сервера.",
+ "optionPortDescription": "Мониторинг доступности определённого порта на сервере.",
+ "title": "Тип"
+ },
+ "thresholds": {
+ "title": "Пороги оповещений",
+ "description": "Определите пороговые значения, при которых должны срабатывать оповещения для этого монитора оборудования.",
+ "option": {
+ "cpuThreshold": {
+ "label": "Порог оповещения CPU (%)"
+ },
+ "memoryThreshold": {
+ "label": "Порог оповещения памяти (%)"
+ },
+ "diskThreshold": {
+ "label": "Порог оповещения диска (%)"
+ },
+ "tempThreshold": {
+ "label": "Порог оповещения температуры (°C)"
+ }
}
},
- "lastName": {
- "label": "Фамилия",
- "placeholder": "Ellis",
- "errors": {
- "empty": "Пожалуйста, введите свою фамилию",
- "length": "Фамилия должна быть короче 50 символов",
- "pattern": "Фамилия должна содержать только буквы, пробелы, апострофы или дефисы"
+ "geoChecks": {
+ "title": "Гео-распределённые проверки",
+ "description": "Запускайте проверки из нескольких географических точек для мониторинга глобальной доступности и производительности.",
+ "option": {
+ "enabled": {
+ "label": "Включить гео-распределённые проверки"
+ },
+ "locations": {
+ "label": "Расположения",
+ "placeholder": "Выберите расположения",
+ "options": {
+ "EU": "Европа",
+ "NA": "Северная Америка",
+ "AS": "Азия",
+ "SA": "Южная Америка",
+ "AF": "Африка",
+ "OC": "Океания"
+ }
+ },
+ "interval": {
+ "label": "Интервал проверки",
+ "value": {
+ "fiveMinutes": "5 минут",
+ "tenMinutes": "10 минут",
+ "fifteenMinutes": "15 минут",
+ "thirtyMinutes": "30 минут"
+ }
+ }
}
- }
- },
- "errors": {
- "validation": "Ошибка при проверке данных."
- },
- "fields": {
- "password": {
- "errors": {
- "incorrect": "Введённый вами пароль неверный"
+ },
+ "url": {
+ "title": "IP/URL монитора на странице статуса",
+ "description": "Отображать IP-адрес или URL монитора на публичной странице статуса. Если отключено, будет показано только имя монитора для защиты конфиденциальной информации.",
+ "option": {
+ "showURL": {
+ "label": "Отображать IP/URL на странице статуса",
+ "enabled": "Включено",
+ "disabled": "Отключено"
+ }
}
},
- "role": {
- "errors": {
- "min": "Требуется хотя бы одна роль"
+ "stats": {
+ "title": "История мониторинга",
+ "description": "Очистить всю историю мониторинга и статистику Вашей команды. Это действие необратимо.",
+ "buttonText": "Очистить всю статистику",
+ "dialog": {
+ "title": "Очистить всю историю мониторинга?",
+ "description": "Это навсегда удалит всю историю мониторинга, статистику и данные проверок Вашей команды. Это действие нельзя отменить.",
+ "confirm": "Да, очистить всю статистику"
}
}
}
},
- "login": {
- "heading": "Войдите, чтобы продолжить",
- "subheadings": {
- "stepOne": "Введите свою электронную почту",
- "stepTwo": "Введите свой пароль"
+ "editUser": {
+ "form": {
+ "roles": {
+ "title": "Роли",
+ "description": "Назначьте роли пользователю. Можно выбрать несколько ролей."
+ }
},
- "links": {
- "forgotPassword": "Забыли пароль?",
- "register": "У вас нет учетной записи?",
- "forgotPasswordLink": "Сбросить пароль",
- "registerLink": "Зарегистрируйтесь здесь"
+ "dialog": {
+ "removeUser": {
+ "title": "Удалить пользователя",
+ "content": "Вы уверены, что хотите удалить {{name}} из Вашей команды? Это действие нельзя отменить."
+ }
+ }
+ },
+ "incidents": {
+ "dialog": {
+ "resolveIncident": {
+ "title": "Решить инцидент",
+ "option": {
+ "comment": {
+ "label": "Комментарий (необязательно)",
+ "placeholder": "Добавьте комментарий о решении..."
+ }
+ }
+ },
+ "details": {
+ "analysis": "Анализ инцидента",
+ "comment": "Комментарий:",
+ "detailsLabel": "Подробности",
+ "downtime": "Простой:",
+ "message": "Сообщение:",
+ "monitor": "Монитор:",
+ "overview": "Обзор",
+ "resolutionDetails": "Подробности решения",
+ "resolutionType": "Тип:",
+ "resolutionTypes": {
+ "automatic": "Автоматически",
+ "manual": "Вручную"
+ },
+ "resolve": "Решить инцидент",
+ "resolvedAt": "Решён в:",
+ "resolvedBy": "Решён:",
+ "startedAt": "Начался в:",
+ "status": "Статус:",
+ "statusCode": "Код статуса:",
+ "timeline": "Хронология",
+ "title": "Подробности инцидента",
+ "url": "URL:"
+ }
},
- "toasts": {
- "success": "С возвращением! Вы успешно вошли в систему.",
- "incorrectPassword": "Неверный пароль"
+ "filters": {
+ "allMonitors": "Все мониторы",
+ "monitor": "Монитор",
+ "resolutionType": "Тип решения",
+ "resolutionTypes": {
+ "manual": "Вручную",
+ "automatic": "Автоматически",
+ "all": "Все"
+ }
},
- "errors": {
- "password": {
- "incorrect": "Предоставленный вами пароль не соответствует нашим записям."
+ "summaryCard": {
+ "activeIncidents": {
+ "title": "Активные инциденты",
+ "active_zero": "Нет активных инцидентов",
+ "active_one": "{{count}} активный инцидент",
+ "active_other": "{{count}} активных инцидентов"
+ },
+ "incidentStats": {
+ "avgResolutionTime": "Среднее время решения",
+ "mostAffectedMonitor": "Наиболее затронутый монитор",
+ "title": "Статистика инцидентов",
+ "totalIncidents": "Всего инцидентов"
+ },
+ "latestIncidents": {
+ "title": "Последние инциденты"
}
},
- "welcome": "Добро пожаловать обратно в Checkmate!"
+ "table": {
+ "actions": {
+ "details": "Подробности",
+ "goToMonitor": "Перейти к монитору",
+ "resolveManually": "Решить вручную"
+ },
+ "activeIncidents": "Активные инциденты",
+ "headers": {
+ "endTime": "Время окончания",
+ "resolutionType": "Тип решения",
+ "startTime": "Время начала",
+ "statusCode": "Код статуса"
+ },
+ "resolvedIncidents": "Решённые инциденты",
+ "status": {
+ "active": "Активный",
+ "resolved": "Решён"
+ }
+ }
},
- "registration": {
- "heading": {
- "superAdmin": "Создать супер-администратора",
- "user": "Зарегистрироваться"
- },
- "subheadings": {
- "stepOne": "Введите свои личные данные",
- "stepTwo": "Введите вашу электронную почту",
- "stepThree": "Создайте свой пароль"
+ "infrastructure": {
+ "charts": {
+ "labels": {
+ "cpu": "Загрузка CPU",
+ "disk": "Использование диска",
+ "memory": "Использование памяти",
+ "netBytesRecv": "{{name}} - байт получено",
+ "netBytesSent": "{{name}} - байт отправлено",
+ "temp": "Температура"
+ }
},
- "description": {
- "superAdmin": "Создайте свой аккаунт супер-администратора, чтобы начать",
- "user": "Зарегистрируйтесь как пользователь и обратитесь к супер-администратору для доступа к вашим мониторам"
+ "gauges": {
+ "cpu": {
+ "lowerLabel": "Макс. частота",
+ "title": "Загрузка CPU",
+ "upperLabel": "Текущая частота"
+ },
+ "disk": {
+ "lowerLabel": "Свободно",
+ "title": "Использование диска {{idx}}",
+ "upperLabel": "Использовано"
+ },
+ "memory": {
+ "lowerLabel": "Свободно",
+ "title": "Использование памяти",
+ "upperLabel": "Использовано"
+ }
},
- "gettingStartedButton": {
- "superAdmin": "Создать учетную запись супер-администратора",
- "user": "Зарегистрироваться как обычный пользователь"
+ "statBoxes": {
+ "avgCpuTemperature": "Средняя температура CPU",
+ "cpuFrequency": "Частота CPU",
+ "cpuLogical": "CPU (логический)",
+ "cpuPhysical": "CPU (физический)",
+ "disk": "Диск",
+ "memory": "Память",
+ "os": "ОС"
},
- "termsAndPolicies": "Создавая учетную запись, вы соглашаетесь с нашими Условиями предоставления услуг и Политикой конфиденциальности.",
- "links": {
- "login": "Уже есть учетная запись? Войти"
+ "table": {
+ "headers": {
+ "cpu": "CPU",
+ "disk": "Диск",
+ "memory": "Память"
+ }
},
- "toasts": {
- "success": "Добро пожаловать! Ваша учетная запись была создана успешно."
+ "tabs": {
+ "labels": {
+ "network": "Сеть",
+ "overview": "Обзор"
+ }
},
- "welcome": "Добро пожаловать в Checkmate!"
+ "fallback": {
+ "actionButton": "Создать монитор!",
+ "checks": "Track the performance of your servers,Identify bottlenecks and optimize usage,Ensure reliability with real-time monitoring",
+ "title": "Монитор инфраструктуры используется для:"
+ }
},
- "forgotPassword": {
- "heading": "Забыли пароль?",
- "subheadings": {
- "stepOne": "Не волнуйтесь, мы вышлем вам инструкции для сброса.",
- "stepTwo": "Мы выслали ссылку для сброса пароля на ",
- "stepThree": "Ваш новый пароль должен отличаться от ваших предыдущих пароей.",
- "stepFour": "Ваш пароль был успешно сброшен. Нажмите ниже, чтобы волшебным образом войти в систему."
+ "logs": {
+ "tabs": {
+ "diagnostics": "Диагностика",
+ "logs": "Серверные логи",
+ "queue": "Очередь заданий"
},
- "buttons": {
- "openEmail": "Открыть Gmail",
- "resetPassword": "Сбросить пароль"
+ "logLevelSelect": {
+ "label": "Уровень логов"
},
- "imageAlts": {
- "passwordKey": "Password key icon",
- "email": "Email icon",
- "lock": "Lock icon",
- "passwordConfirm": "Password confirm icon"
+ "jobQueue": "Очередь заданий",
+ "failedJobs": "Неудачные задания",
+ "noLogs": "Логи не найдены",
+ "metrics": {
+ "jobs": "Задания",
+ "activeJobs": "Активные задания",
+ "failingJobs": "Неудачные задания",
+ "totalRuns": "Всего запусков",
+ "totalFailures": "Всего ошибок"
},
- "links": {
- "login": "Вернуться к Входу",
- "resend": "Не получили письмо? Нажмите, чтобы отправить повторно"
+ "diagnostics": {
+ "stats": {
+ "eventLoopDelay": "Задержка цикла событий",
+ "uptime": "Аптайм",
+ "usedHeapSize": "Используемый размер кучи",
+ "totalHeapSize": "Общий размер кучи",
+ "osMemoryLimit": "Лимит памяти ОС"
+ },
+ "gauges": {
+ "heapAllocation": "Выделение кучи",
+ "heapUsage": "Использование кучи",
+ "heapUtilization": "Утилизация кучи",
+ "instantCpuUsage": "Мгновенная загрузка CPU",
+ "availableMemoryPercentage": "% доступной памяти",
+ "allocatedPercentage": "% выделено",
+ "usedSPercentage": "% 1с использовано CPU",
+ "total": "Всего",
+ "used": "Использовано"
+ }
},
- "toasts": {
- "sent": "Инструкция отправлена на .",
- "emailNotFound": "Email не найден.",
- "redirect": "Перенаправление через ...",
- "success": "Ваш пароль успешно сброшен.",
- "error": "Не удалось сбросить пароль. Повторите попытку позже или обратитесь в службу поддержки."
+ "table": {
+ "headers": {
+ "timestamp": "Метка времени",
+ "level": "Уровень",
+ "service": "Сервис",
+ "method": "Метод",
+ "monitorId": "ID монитора",
+ "runCount": "Кол-во запусков",
+ "failCount": "Кол-во ошибок",
+ "lastRunAt": "Последний запуск",
+ "lockedAt": "Заблокировано в",
+ "lastFinishedAt": "Последнее завершение",
+ "lastRunTook": "Последний запуск занял",
+ "lastFailedAt": "Последняя ошибка",
+ "failReason": "Причина ошибки"
+ }
}
- }
- },
- "errorPages": {
- "serverUnreachable": {
- "toasts": {
- "reconnected": "Успешное повторное подключение к серверу.",
- "stillUnreachable": "Сервер по-прежнему недоступен. Повторите попытку позже."
+ },
+ "maintenanceWindow": {
+ "fallback": {
+ "actionButton": "Создать окно обслуживания!",
+ "checks": "Mark your maintenance periods,Eliminate any misunderstandings,Stop sending alerts in maintenance windows",
+ "title": "Окно обслуживания используется для:"
+ },
+ "table": {
+ "headers": {
+ "nextWindow": "Следующее окно",
+ "repeat": "Повторить"
+ }
},
- "alertBox": "Ошибка подключения к серверу",
- "description": "Не удаётся подключиться к серверу. Проверьте подключение к Интернету или конфигурацию развёртывания, если проблема не устранена.",
- "retryButton": {
- "default": "Повторите попытку подключения",
- "processing": "Подключение..."
+ "form": {
+ "general": {
+ "title": "Основные настройки",
+ "description": "Задайте имя и параметры повтора для окна обслуживания.",
+ "option": {
+ "name": {
+ "label": "Имя",
+ "placeholder": "напр. Еженедельное обслуживание"
+ },
+ "repeat": {
+ "label": "Повтор"
+ }
+ }
+ },
+ "startDate": {
+ "title": "Дата начала",
+ "description": "Выберите дату начала окна обслуживания.",
+ "option": {
+ "startDate": {
+ "label": "Дата начала"
+ }
+ }
+ },
+ "startTime": {
+ "title": "Время начала",
+ "description": "Задайте время начала и продолжительность окна обслуживания. Все значения указаны в UTC",
+ "option": {
+ "duration": {
+ "label": "Продолжительность"
+ },
+ "startTime": {
+ "label": "Время начала"
+ }
+ },
+ "monitors": {
+ "title": "Мониторы",
+ "description": "Мониторы, к которым применяется окно обслуживания",
+ "option": {
+ "addMonitors": {
+ "label": "Добавить мониторы"
+ }
+ }
+ }
+ }
}
- }
- },
- "createNotifications": {
- "title": "Создать канал уведомлений",
- "nameSettings": {
- "title": "Имя",
- "description": "Описательное имя для вашей интеграции.",
- "nameLabel": "Имя",
- "namePlaceholder": "например, уведомления Slack"
- },
- "typeSettings": {
- "title": "Тип",
- "description": "Выберите тип канала уведомлений, который вы хотите создать.",
- "typeLabel": "Тип"
- },
- "emailSettings": {
- "title": "Электронная почта",
- "description": "Адреса электронной почты получателей.",
- "emailLabel": "Адрес электронной почты",
- "emailPlaceholder": "например, john@example.com"
- },
- "slackSettings": {
- "title": "Slack",
- "description": "Настройте свой вебхук Slack здесь",
- "webhookLabel": "Slack вебхук URL",
- "webhookPlaceholder": "https://hooks.slack.com/services/..."
- },
- "pagerdutySettings": {
- "title": "PagerDuty",
- "description": "Настройте интеграцию PagerDuty здесь",
- "integrationKeyLabel": "Интеграционный ключ",
- "integrationKeyPlaceholder": "1234567890"
- },
- "discordSettings": {
- "title": "Discord",
- "description": "Настройте вебхук Discord здесь",
- "webhookLabel": "Discord вебхук URL",
- "webhookPlaceholder": "https://your-server.com/webhook"
- },
- "webhookSettings": {
- "title": "Вебхук",
- "description": "Настройте свой вебхук здесь",
- "webhookLabel": "URL-адрес веб-перехватчика",
- "webhookPlaceholder": "https://your-server.com/webhook"
- },
- "testNotification": "Тестовое уведомление",
- "dialogDeleteTitle": "Вы уверены, что хотите удалить это уведомление?",
- "dialogDeleteConfirm": "Удалить"
- },
- "notificationConfig": {
- "title": "Уведомления",
- "description": "Выберите каналы уведомлений, которые вы хотите использовать"
- },
- "monitorStatus": {
- "checkingEvery": "Проверка каждый {{interval}}",
- "withCaptureAgent": "с агентом захвата {{version}}",
- "up": "вверх",
- "down": "вниз",
- "paused": "приостановлено"
- },
- "advancedMatching": "Расширенное сопоставление",
- "sendTestNotifications": "Отправить тестовое уведомление",
- "selectAll": "Выбрать все",
- "showAdminLoginLink": "Показывать ссылку «Администратор? Войти здесь» на странице статуса",
- "logsPage": {
- "title": "Логи",
- "description": "Системные логи - последние 1000 строк",
- "tabs": {
- "queue": "Очередь заданий",
- "logs": "Серверные логи",
- "diagnostics": "Диагностика"
- },
- "toast": {
- "fetchLogsSuccess": "Логи успешно получены"
},
- "logLevelSelect": {
- "title": "Уровень логов",
- "values": {
- "all": "Все",
- "info": "Информация",
- "warn": "Предупреждение",
- "error": "Ошибка",
- "debug": "Дебаг"
+ "notifications": {
+ "fallback": {
+ "actionButton": "Создать канал",
+ "checks": "Alert teams about downtime or performance issues,Let engineers know when incidents happen,Keep administrators informed of system changes",
+ "title": "Каналы уведомлений используются для:"
+ },
+ "form": {
+ "accessToken": {
+ "optionAccessToken": "Токен доступа",
+ "placeholder": "syt_YWxleF9ob2xsaWRheQ_VmtScmV0U2VjcmV0S2V5_abc123"
+ },
+ "address": {
+ "description": "Адрес, на который будут отправляться уведомления.",
+ "optionAddress": "Адрес",
+ "placeholderEmail": "example@example.com",
+ "placeholderWebhook": "https://your-server.com/webhook",
+ "title": "Адрес"
+ },
+ "homeServer": {
+ "optionHomeServer": "Домашний сервер",
+ "placeholder": "example.com"
+ },
+ "matrix": {
+ "description": "Настройте подключение к Matrix-серверу для уведомлений.",
+ "title": "Настройка Matrix"
+ },
+ "notificationName": {
+ "description": "Описательное имя канала уведомлений",
+ "optionName": "Имя канала",
+ "placeholder": "напр. Оповещения продакшена",
+ "title": "Имя канала"
+ },
+ "pagerDuty": {
+ "description": "Ваш ключ интеграции PagerDuty для получения оповещений.",
+ "optionIntegrationKey": "Ключ интеграции",
+ "placeholder": "a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6",
+ "title": "Ключ интеграции"
+ },
+ "roomId": {
+ "optionRoomId": "ID комнаты",
+ "placeholder": "!abcdefg:matrix.org"
+ },
+ "type": {
+ "description": "Выберите тип канала уведомлений для создания.",
+ "optionType": "Тип",
+ "title": "Тип канала"
+ },
+ "telegram": {
+ "title": "Настройка Telegram",
+ "description": "Чтобы включить уведомления Telegram, создайте бота Telegram с помощью BotFather, официального бота для создания и управления ботами Telegram. Затем получите токен API и идентификатор чата и запишите их здесь.",
+ "optionBotToken": "Токен бота",
+ "placeholderBotToken": "123456789:ABCdefGhIJKlmNoPQRsTUVwxyZ",
+ "optionChatId": "ID чата",
+ "placeholderChatId": "-1001234567890"
+ }
+ },
+ "table": {
+ "headers": {
+ "destination": "Назначение"
+ }
}
- }
- },
- "queuePage": {
- "title": "Очередь",
- "refreshButton": "Обновить",
- "flushButton": "Очистить очередь",
- "jobTable": {
- "title": "Задачи в настоящее время в очереди",
- "idHeader": "ID монитора",
- "urlHeader": "URL",
- "typeHeader": "Тип",
- "activeHeader": "Активный",
- "lockedAtHeader": "Заблокировано на",
- "runCountHeader": "Количество запусков",
- "failCountHeader": "Количество неудач",
- "lastRunHeader": "Последний запуск в",
- "lastFinishedAtHeader": "Последний раз закончил в",
- "lastRunTookHeader": "Последний забег занял",
- "intervalHeader": "Интервал"
- },
- "metricsTable": {
- "title": "Метрики очереди",
- "metricHeader": "Метрическая",
- "valueHeader": "Ценить"
- },
- "failedJobTable": {
- "title": "Неудачные задачи",
- "monitorIdHeader": "ID монитора",
- "monitorUrlHeader": "URL монитора",
- "failCountHeader": "Количество падений",
- "failedAtHeader": "Последнее падение в",
- "failReasonHeader": "Причина падения"
- }
- },
- "export": {
- "title": "Экспорт мониторов",
- "success": "Мониторы успешно экспортированы!",
- "failed": "Не удалось экспортировать мониторы"
- },
- "monitorActions": {
- "title": "Экспорт/Импорт",
- "import": "Импортные мониторы",
- "export": "Экспорт мониторов",
- "deleteSuccess": "Монитор успешно удален",
- "deleteFailed": "Не удалось удалить монитор",
- "details": "Подробности"
- },
- "settingsPage": {
- "aboutSettings": {
- "labelDevelopedBy": "Разработано Bluewave Labs",
- "labelVersion": "Версия",
- "title": "Об"
- },
- "demoMonitorsSettings": {
- "buttonAddMonitors": "Добавить демо мониторы",
- "description": "Добавьте образцы мониторов для демонстрации.",
- "title": "Демо мониторы"
},
- "emailSettings": {
- "buttonSendTestEmail": "Отправить тестовое письмо",
- "description": "Настройте параметры электронной почты в вашей системе. Она используется для отправки уведомлений и оповещений.",
- "descriptionTransport": "Это создает SMTP-транспорт для NodeMailer.",
- "labelAddress": "Адрес электронной почты — используется для аутентификации.",
- "labelConnectionHost": "Хост подключения электронной почты — имя хоста для использования в приветствии HELO/EHLO.",
- "labelHost": "Хост электронной почты — имя хоста или IP-адрес для подключения.",
- "labelIgnoreTLS": "Отключить STARTTLS: не использовать TLS, даже если сервер его поддерживает.",
- "labelPassword": "Пароль электронной почты - Пароль для аутентификации",
- "labelPasswordSet": "Пароль установлен. Нажмите «Сброс», чтобы изменить его.",
- "labelPool": "Включить пул соединений: повторно использовать существующие соединения для повышения производительности.",
- "labelPort": "Порт электронной почты — порт для подключения",
- "labelRejectUnauthorized": "Отклонять недействительные сертификаты: отклонять соединения с самоподписанными или ненадежными сертификатами.",
- "labelRequireTLS": "Принудительный STARTTLS: требуется обновление TLS, выдается ошибка, если не поддерживается",
- "labelSecure": "Использовать SSL (рекомендуется): зашифровать соединение с помощью SSL/TLS.",
- "labelTLSServername": "Имя сервера TLS — необязательное имя хоста для проверки TLS, если хост — это IP-адрес.",
- "labelUser": "Пользователь электронной почты — имя пользователя для аутентификации, переопределяет адрес электронной почты, если указан",
- "linkTransport": "Технические характеристики смотрите здесь.",
- "placeholderUser": "Оставьте пустым, если не требуется",
- "title": "Электронная почта",
- "toastEmailRequiredFieldsError": "Требуется адрес электронной почты, хост, порт и пароль"
- },
- "pageSpeedSettings": {
- "description": "Введите ключ API Google PageSpeed, чтобы включить мониторинг Google PageSpeed. Нажмите «Сбросить», чтобы обновить ключ.",
- "labelApiKeySet": "API-ключ установлен. Нажмите «Сброс», чтобы изменить его.",
- "labelApiKey": "API-ключ PageSpeed",
- "title": "API-ключ Google PageSpeed"
- },
- "saveButtonLabel": "Сохранить",
- "statsSettings": {
- "clearAllStatsButton": "Очистить всю статистику",
- "clearAllStatsDescription": "Очистить всю статистику. Это необратимо.",
- "clearAllStatsDialogConfirm": "Да, очистить всю статистику",
- "clearAllStatsDialogDescription": "После удаления история и статистика мониторинга не могут быть восстановлены.",
- "clearAllStatsDialogTitle": "Вы хотите очистить всю статистику?",
- "description": "Укажите, как долго вы хотите хранить данные. Вы также можете удалить все существующие данные.",
- "labelTTL": "Дни, за которые вы хотите посмотреть историю.",
- "labelTTLOptional": "0 для бесконечности",
- "title": "История монитора"
- },
- "systemResetSettings": {
- "buttonRemoveAllMonitors": "Удалить все мониторы",
- "description": "Удалите все мониторы из вашей системы.",
- "dialogConfirm": "Да, удалить все мониторы",
- "dialogDescription": "После удаления, мониторы нельзя будет воостановить.",
- "dialogTitle": "Вы хотите удалить все мониторы?",
- "title": "Сброс системы"
- },
- "timezoneSettings": {
- "description": "Выберите часовой пояс, используемый для отображения даты и времени в приложении.",
- "label": "Отображение часового пояса",
- "title": "Отображение часового пояса"
- },
- "title": "Настройки",
- "uiSettings": {
- "description": "Переключайтесь между светлым и темным режимами или меняйте язык пользовательского интерфейса.",
- "labelLanguage": "Язык",
- "labelTheme": "Режим темы",
- "title": "Появление"
- },
- "urlSettings": {
- "description": "Отображение IP-адреса или URL-адреса монитора на общедоступной странице состояния. Если эта опция отключена, для защиты конфиденциальной информации будет отображаться только имя монитора.",
- "label": "Отображать IP/URL на странице статуса",
- "selectDisabled": "Выключено",
- "selectEnabled": "Включено",
- "title": "Мониторинг IP/URL на странице статуса"
- },
- "globalThresholds": {
- "title": "Глобальные пороги",
- "description": "Настройте глобальные пороговые значения для процессора, памяти, диска и температуры. Если значение указано, оно будет автоматически включено для мониторинга."
- }
- },
- "statusPageCreate": {
- "buttonSave": "Сохранить"
- },
- "incidentsOptionsHeaderFilterResolved": "Решено",
- "settingsSave": "Сохранить",
- "statusPageCreateAppearanceTitle": "Внешний вид",
- "confirmPassword": "Подтвердите пароль",
- "monitorHooks": {
- "failureAddDemoMonitors": "Не удалось добавить демонстрационные мониторы.",
- "successAddDemoMonitors": "Демонстрационные мониторы успешно добавлены"
- },
- "settingsAppearance": "Внешний вид",
- "settingsDisplayTimezone": "Отображение часового пояса",
- "settingsGeneralSettings": "Общие настройки",
- "incidentsOptionsHeaderTotalIncidents": "Всего инцидентов",
- "statusPage": {
- "deleteSuccess": "Страница статуса успешно удалена",
- "deleteFailed": "Не удалось удалить страницу статуса",
- "createSuccess": "Страница статуса успешно создана",
- "updateSuccess": "Страница статуса успешно обновлена",
- "generalSettings": "Общие настройки",
- "contents": "Содержание",
- "fallback": {
- "checks": [
- "Мониторинг и отображение состояния ваших сервисов в режиме реального времени",
- "Отслеживайте состояние нескольких сервисов и делитесь их статусом",
- "Дайте пользователям информацию о сбоях и производительности"
- ],
- "title": "Страница статуса используется для:",
- "actionButton": "Давайте создадим вашу первую страницу статуса!"
- }
- },
- "testNotificationsDisabled": "Для этого монитора не настроены уведомления. Вам нужно добавить их, нажав кнопку «Настроить».",
- "incidentsTableResolvedAt": "Решено в",
- "incidentsTableActionResolve": "Решено",
- "checkHooks": {
- "failureResolveOne": "Не удалось разрешить инцидент.",
- "failureResolveAll": "Не удалось разрешить все инциденты.",
- "failureResolveMonitor": "Не удалось устранить инциденты с монитором."
- },
- "checkFormError": "Пожалуйста, проверьте форму на наличие ошибок.",
- "diagnosticsPage": {
- "diagnosticDescription": "Системная диагностика",
- "statsDescription": "Системная статистика",
- "gauges": {
- "heapAllocationTitle": "Использовано кучи",
- "heapAllocationSubtitle": "% доступной памяти",
- "heapUsageTitle": "Выделено памяти в куче",
- "heapUsageSubtitle": "% доступно памяти",
- "heapUtilizationTitle": "Использовано кучи",
- "heapUtilizationSubtitle": "% от доступного",
- "instantCpuUsageTitle": "Загруженность CPU",
- "instantCpuUsageSubtitle": "% загрузка CPU за 1s"
- },
- "stats": {
- "eventLoopDelayTitle": "Задержка цикла событий",
- "uptimeTitle": "Аптайм",
- "usedHeapSizeTitle": "Размер используемой кучи",
- "totalHeapSizeTitle": "Общий размер кучи",
- "osMemoryLimitTitle": "Ограничение памяти ОS"
- }
- },
- "pageSpeedLighthouseAPI": "Используйте API Lighthouse PageSpeed для мониторинга вашего сайта",
- "time": {
- "threeMinutes": "3 минуты",
- "fiveMinutes": "5 минут",
- "tenMinutes": "10 минут",
- "twentyMinutes": "20 минут",
- "oneHour": "1 час",
- "oneDay": "1 день",
- "oneWeek": "1 неделя",
- "fourMinutes": "4 минуты",
- "oneMinute": "1 минута",
- "twoMinutes": "2 минуты",
- "fifteenSeconds": "15 секунд",
- "thirtySeconds": "30 секунд"
- },
- "general": {
- "noOptionsFound": "{{unit}} не найдено"
- },
- "infrastructureMonitor": {
- "fallback": {
- "checks": [
- "Отслеживайте производительность серверов",
- "Выявляйте узкие места и оптимизируйте использование",
- "Обеспечивайте надежность с помощью мониторинга в режиме реального времени"
- ],
- "title": "Монитор инфраструктуры используется для:",
- "actionButton": "Давайте создадим ваш первый монитор инфраструктуры!"
- }
- },
- "maintenanceWindow": {
- "fallback": {
- "checks": [
- "Отметьте периоды технического обслуживания.",
- "Устраните любые недопонимания.",
- "Прекратите отправку оповещений в периоды технического обслуживания."
- ],
- "title": "Период технического обслуживания используется для:",
- "actionButton": "Давайте создадим ваше первое окно технического обслуживания!"
- }
- },
- "pageSpeed": {
- "fallback": {
- "checks": [
- "Отчет об удобстве использования страницы",
- "Помощь в анализе скорости загрузки веб-страницы",
- "Предложение о том, как можно улучшить страницу"
- ],
- "title": "Монитор PageSpeed используется для:",
- "actionButton": "Давайте создадим ваш первый монитор PageSpeed!"
- }
- },
- "uptimeMonitor": {
- "fallback": {
- "checks": [
- "Проверьте, доступны ли веб-сайты или серверы и отвечают ли они",
- "Оповещайте команды о сбоях или проблемах с производительностью",
- "Мониторинг конечных точек HTTP, пингов, контейнеров и портов",
- "Отслеживайте динамику времени безотказной работы и надежности"
- ],
- "title": "Монитор работоспособности используется для:",
- "actionButton": "Давайте создадим ваш первый монитор времени безотказной работы!"
- }
- },
- "editUserPage": {
- "form": {
- "email": "Электронная почта",
- "firstName": "Имя",
- "lastName": "Фамилия",
- "role": "Роли",
- "save": "Сохранить"
- },
- "table": {
- "actionHeader": "Действие",
- "roleHeader": "Роль"
- },
- "title": "Редактировать пользователя",
- "toast": {
- "successUserUpdate": "Пользователь успешно обновлен",
- "validationErrors": "Ошибки проверки"
- }
- },
- "incidentsPageActionResolveMonitor": "Разрешение инцидентов мониторинга",
- "incidentsPageActionResolveAll": "Решить все инциденты",
- "matchMethodOptions": {
- "equal": "Равный",
- "equalPlaceholder": "успех",
- "include": "Включить",
- "includePlaceholder": "хорошо",
- "regex": "Regex",
- "regexPlaceholder": "^(success|ok)$",
- "text": "Метод сопоставления"
- },
- "monitorType": {
- "docker": {
- "label": "Имя/ID контейнера",
- "namePlaceholder": "Мой контейнер",
- "placeholder": "my-app или abcd1234"
- },
- "http": {
- "label": "URL для мониторинга",
- "namePlaceholder": "Google",
- "placeholder": "google.com"
+ "pageSpeed": {
+ "charts": {
+ "common": {
+ "cls": "Cumulative Layout Shift (CLS)",
+ "fcp": "First Contentful Paint (FCP)",
+ "lcp": "Largest Contentful Paint (LCP)",
+ "si": "Speed Index (SI)",
+ "tbt": "Total Blocking Time (TBT)"
+ },
+ "legend": {
+ "title": "Отчёт PageSpeed",
+ "weight": "Вес"
+ },
+ "pie": {
+ "title": "Отчёт о производительности"
+ }
+ },
+ "table": {
+ "headers": {
+ "pageSpeedScore": "Оценка PageSpeed"
+ }
+ },
+ "fallback": {
+ "actionButton": "Создать монитор!",
+ "checks": "Report on the user experience of a page,Help analyze webpage speed,Give suggestions on how the page can be improved",
+ "title": "Монитор PageSpeed используется для:"
+ }
},
- "ping": {
- "label": "IP-адрес для мониторинга",
- "namePlaceholder": "Google",
- "placeholder": "1.1.1.1"
+ "settings": {
+ "form": {
+ "timezone": {
+ "title": "Часовой пояс отображения",
+ "description": "Выберите часовой пояс для отображения дат и времени в приложении.",
+ "option": {
+ "timezone": {
+ "label": "Часовой пояс отображения"
+ }
+ }
+ },
+ "ui": {
+ "title": "Внешний вид",
+ "description": "Переключайтесь между светлой и тёмной темой, меняйте язык или настраивайте тип отображения графиков.",
+ "option": {
+ "theme": {
+ "label": "Режим темы",
+ "light": "Светлая",
+ "dark": "Тёмная"
+ },
+ "language": {
+ "label": "Язык"
+ },
+ "chartType": {
+ "label": "Тип графика",
+ "histogram": "Гистограмма",
+ "heatmap": "Тепловая карта"
+ }
+ }
+ },
+ "pagespeed": {
+ "title": "Ключ API Google PageSpeed",
+ "description": "Введите ключ API Google PageSpeed для включения мониторинга Google PageSpeed. Нажмите «Сброс», чтобы обновить ключ.",
+ "option": {
+ "apiKey": {
+ "label": "Ключ API PageSpeed",
+ "labelSet": "Ключ API установлен. Нажмите «Сброс», чтобы изменить его.",
+ "placeholder": "Введите Ваш ключ API Google PageSpeed"
+ }
+ }
+ },
+ "url": {
+ "title": "IP/URL монитора на странице статуса",
+ "description": "Отображать IP-адрес или URL монитора на публичной странице статуса. Если отключено, будет показано только имя монитора для защиты конфиденциальной информации.",
+ "option": {
+ "showURL": {
+ "label": "Отображать IP/URL на странице статуса",
+ "enabled": "Включено",
+ "disabled": "Отключено"
+ }
+ }
+ },
+ "stats": {
+ "title": "История мониторинга",
+ "description": "Очистить всю историю мониторинга и статистику Вашей команды. Это действие необратимо.",
+ "option": {
+ "clear": {
+ "label": "Очистить всю статистику. Это действие необратимо."
+ }
+ },
+ "dialog": {
+ "title": "Очистить всю историю мониторинга?",
+ "description": "Это действие нельзя отменить"
+ }
+ },
+ "retention": {
+ "title": "Хранение проверок",
+ "description": "Укажите, как долго данные проверок хранятся перед автоматической очисткой.",
+ "option": {
+ "days": {
+ "label": "Период хранения (дни)",
+ "unlimited": "Без ограничений"
+ }
+ }
+ },
+ "thresholds": {
+ "title": "Глобальные пороги",
+ "description": "Задайте глобальные пороги CPU, памяти, дисков и температуры для мониторинга инфраструктуры. Они применяются ко всем мониторам оборудования, если не переопределены.",
+ "option": {
+ "cpu": {
+ "label": "Порог CPU (%)",
+ "placeholder": "1 - 100"
+ },
+ "memory": {
+ "label": "Порог памяти (%)",
+ "placeholder": "1 - 100"
+ },
+ "disk": {
+ "label": "Порог диска (%)",
+ "placeholder": "1 - 100"
+ },
+ "temperature": {
+ "label": "Порог температуры (°C)",
+ "placeholder": "1 - 150"
+ }
+ }
+ },
+ "email": {
+ "title": "Настройки эл. почты",
+ "description": "Настройте параметры эл. почты для Вашей системы. Используется для отправки уведомлений и оповещений.",
+ "descriptionTransport": "Это создает SMTP-транспорт для NodeMailer.",
+ "descriptionTransportLink": "Смотрите спецификации здесь",
+ "option": {
+ "host": {
+ "label": "Хост эл. почты — имя хоста или IP-адрес для подключения",
+ "placeholder": "smtp.gmail.com"
+ },
+ "port": {
+ "label": "Порт эл. почты — порт для подключения",
+ "placeholder": "587"
+ },
+ "address": {
+ "label": "Адрес эл. почты — используется для аутентификации",
+ "placeholder": "you@example.com"
+ },
+ "user": {
+ "label": "Пользователь эл. почты — имя пользователя для аутентификации, если указано, заменяет адрес",
+ "placeholder": "Оставьте пустым, если не требуется"
+ },
+ "password": {
+ "label": "Пароль эл. почты — пароль для аутентификации",
+ "labelSet": "Пароль установлен. Нажмите «Сброс», чтобы изменить его.",
+ "placeholder": "Введите пароль"
+ },
+ "tlsServername": {
+ "label": "Имя TLS-сервера — необязательное имя хоста для проверки TLS, когда хост является IP",
+ "placeholder": "example.com"
+ },
+ "connectionHost": {
+ "label": "Хост подключения — имя хоста для приветствия HELO/EHLO",
+ "placeholder": "localhost"
+ },
+ "secure": {
+ "label": "Использовать SSL (рекомендуется): шифрование подключения с помощью SSL/TLS"
+ },
+ "pool": {
+ "label": "Включить пул соединений: повторное использование соединений для повышения производительности"
+ },
+ "ignoreTLS": {
+ "label": "Отключить STARTTLS: не использовать TLS, даже если сервер его поддерживает"
+ },
+ "requireTLS": {
+ "label": "Принудительный STARTTLS: требовать обновление до TLS, ошибка если не поддерживается"
+ },
+ "rejectUnauthorized": {
+ "label": "Отклонять недействительные сертификаты: отклонять соединения с самоподписанными или ненадёжными сертификатами"
+ }
+ }
+ },
+ "demoMonitors": {
+ "title": "Демо-мониторы",
+ "description": "Добавить примеры мониторов для демонстрации."
+ },
+ "removeMonitors": {
+ "title": "Сброс системы",
+ "description": "Удалить все мониторы из Вашей системы.",
+ "dialog": {
+ "title": "Удалить все мониторы?",
+ "description": "Это действие нельзя отменить."
+ }
+ },
+ "exportMonitors": {
+ "title": "Экспорт мониторов"
+ },
+ "importExportMonitors": {
+ "title": "Импорт / Экспорт мониторов",
+ "description": "Импортируйте или экспортируйте данные мониторов в формате JSON для резервного копирования или переноса."
+ },
+ "about": {
+ "title": "О программе",
+ "developedBy": "Разработано Bluewave Labs"
+ },
+ "validation": {
+ "errorMessage": "Пожалуйста, исправьте следующие ошибки валидации:"
+ }
+ }
},
- "port": {
- "label": "URL для мониторинга",
- "namePlaceholder": "Локальный хост:5173",
- "placeholder": "локальный хост"
+ "statusPages": {
+ "deleteSuccess": "Страница статуса успешно удалена",
+ "fallback": {
+ "title": "Страница статуса используется для:",
+ "checks": "Communicate system status to users and stakeholders,Display real-time uptime information publicly,Build trust with transparent service monitoring,Reduce support requests during incidents",
+ "actionButton": "Создать страницу статуса!"
+ },
+ "monitorsList": {
+ "chartTypeHeatmap": "Тепловая карта",
+ "chartTypeHistogram": "Гистограмма",
+ "noData": "Нет доступных данных",
+ "infrastructure": {
+ "title": "Инфраструктура",
+ "cpu": "CPU",
+ "memory": "RAM",
+ "memoryText": "Память",
+ "disk": "Диск",
+ "usage": "Использование",
+ "used": "Использовано",
+ "total": "Всего"
+ },
+ "uptime": {
+ "title": "Аптайм",
+ "responseTime": "Время ответа"
+ }
+ },
+ "statusBar": {
+ "allDown": "Все системы недоступны",
+ "allUp": "Все системы работают",
+ "degraded": "Некоторые системы испытывают проблемы",
+ "unknown": "Не удаётся определить статус системы"
+ },
+ "table": {
+ "headers": {
+ "name": "Имя страницы статуса",
+ "url": "Публичный URL"
+ },
+ "published": "Опубликовано",
+ "unpublished": "Не опубликовано"
+ },
+ "title": "Страницы статуса",
+ "details": {
+ "empty": {
+ "title": "Здесь пока ничего нет",
+ "addMonitor": "Добавьте монитор, чтобы начать"
+ }
+ },
+ "form": {
+ "access": {
+ "title": "Доступ",
+ "description": "Если Ваша страница статуса готова, Вы можете отметить её как опубликованную.",
+ "option": {
+ "published": {
+ "name": "Опубликовано и доступно публично"
+ }
+ }
+ },
+ "basicInfo": {
+ "title": "Основная информация",
+ "description": "Укажите название компании и субдомен, на который указывает Ваша страница статуса.",
+ "option": {
+ "name": {
+ "label": "Название компании",
+ "placeholder": "Acme Inc."
+ },
+ "url": {
+ "label": "Адрес Вашей страницы статуса",
+ "placeholder": "my-status-page"
+ }
+ }
+ },
+ "monitors": {
+ "title": "Мониторы",
+ "description": "Выберите мониторы для отображения на Вашей странице статуса.",
+ "noMonitors": "Мониторы не выбраны",
+ "option": {
+ "monitors": {
+ "label": "Выберите мониторы",
+ "placeholder": "Поиск и выбор мониторов..."
+ }
+ }
+ },
+ "timezone": {
+ "title": "Часовой пояс",
+ "description": "Выберите часовой пояс для отображения Вашей страницы статуса.",
+ "option": {
+ "timezone": {
+ "label": "Часовой пояс",
+ "placeholder": "Выберите часовой пояс..."
+ }
+ }
+ },
+ "appearance": {
+ "title": "Внешний вид",
+ "description": "Определите внешний вид Вашей публичной страницы статуса.",
+ "option": {
+ "logo": {
+ "label": "Логотип"
+ },
+ "color": {
+ "label": "Цвет бренда"
+ }
+ }
+ },
+ "features": {
+ "title": "Функции",
+ "description": "Настройте, какая информация отображается на Вашей странице статуса.",
+ "option": {
+ "showCharts": {
+ "label": "Показывать графики времени ответа"
+ },
+ "showUptimePercentage": {
+ "label": "Показывать процент аптайма"
+ },
+ "showAdminLoginLink": {
+ "label": "Показывать ссылку входа администратора"
+ },
+ "showInfrastructure": {
+ "label": "Показывать метрики инфраструктуры"
+ }
+ }
+ }
+ }
},
- "game": {
- "label": "URL для мониторинга",
- "namePlaceholder": "localhost:5173",
- "placeholder": "localhost"
- }
- },
- "uptimeAdvancedMatching": {
- "jsonPath": "путь к JSON"
- },
- "bytesPerSecond": "Байты в секунду",
- "bytesReceived": "Получено байтов",
- "bytesSent": "Отправлено байтов",
- "chooseGame": "Выбрать игру",
- "createMonitorPage": {
- "incidentConfigDescription": "Мониторинг использует скользящее окно, чтобы понять, когда ресурс недоступен. Статус изменится, если нужный процент проверок покажет сбой.",
- "incidentConfigStatusWindowLabel": "Сколько проверок должно быть в скользящем окне?",
- "incidentConfigStatusWindowThresholdLabel": "Какой процент проверок в скользящем окне завершается неудачей/успешностью до изменения статуса монитора?",
- "incidentConfigTitle": "Инциденты",
- "incidentConfigDescriptionV2": "Количество последовательных проверок, необходимых для изменения статуса монитора. Максимум 25.",
- "incidentConfigStatusCheckNumber": "Сколько проверок перед сменой статуса?",
- "intervalTitle": "Интервал проверки",
- "intervalDescription": "Как часто следует проверять монитор."
- },
- "dataRate": "Скорость передачи данных",
- "dataReceived": "Данные получены",
- "dataSent": "Данные отправлены",
- "details": "Подробности",
- "drops": "Падений",
- "errors": "Ошибки",
- "errorsIn": "Ошибки в",
- "errorsOut": "Ошибки вне",
- "gameServerMonitoring": "Мониторинг игрового сервера",
- "gameServerMonitoringDescription": "Проверьте, запущен ли ваш игровой сервер.",
- "network": "Сеть",
- "networkDrops": "Сетевые падения",
- "networkErrors": "Ошибки сети",
- "networkInterface": "Сетевой интерфейс",
- "noNetworkStatsAvailable": "Статистика сети отсутствует.",
- "packetsPerSecond": "Пакетов в секунду",
- "packetsReceived": "Получено пакетов",
- "packetsReceivedRate": "Скорость получения пакетов",
- "packetsSent": "Отправлено пакетов",
- "rate": "коэффициент",
- "selectInterface": "Выберите интерфейс",
- "v1": {
- "infrastructure": {
- "disk_selection_title": "Выбор дисков",
- "disk_selection_info": "На данный момент диск не обнаружен.",
- "disk_selection_description": "Выберите конкретные диски, которые вы хотите отслеживать."
+ "uptime": {
+ "filters": {
+ "search": {
+ "placeholder": "Поиск мониторов..."
+ }
+ },
+ "table": {
+ "headers": {
+ "responseTime": "Время ответа"
+ }
+ },
+ "fallback": {
+ "actionButton": "Создать монитор!",
+ "checks": "Check if websites or servers are online & responsive,Alert teams about downtime or performance issues,Monitor HTTP endpoints, pings, containers & ports,Track historical uptime and reliability trends",
+ "title": "Монитор аптайма используется для:"
+ }
}
}
}
diff --git a/client/src/locales/th.json b/client/src/locales/th.json
index d5f9ad137d..cf92d999f8 100644
--- a/client/src/locales/th.json
+++ b/client/src/locales/th.json
@@ -1,1140 +1,1305 @@
{
- "submit": "ยอมรับ",
- "title": "หัวข้อ",
- "distributedStatusHeaderText": "ตรวจสอบแบบเรียลไทม์บนอุปกรณ์จริง",
- "distributedStatusSubHeaderText": "ระบบทำงานด้วยอุปกรณ์นับล้านทั่วโลก ให้คุณตรวจสอบประสิทธิภาพระบบตามภูมิภาค ประเทศ หรือเมืองได้",
- "settingsDisabled": "ปิดการใช้งาน",
- "settingsSuccessSaved": "บันทึกการตั้งค่าเรียบร้อยแล้ว",
- "settingsFailedToSave": "ไม่สามารถบันทึกการตั้งค่าได้",
- "settingsStatsCleared": "สถิติถูกล้างเรียบร้อยแล้ว",
- "settingsFailedToClearStats": "ไม่สามารถล้างสถิติได้",
- "settingsMonitorsDeleted": "ลบมอนิเตอร์ออกทั้งหมดเรียบร้อยแล้ว",
- "settingsFailedToDeleteMonitors": "ไม่สามารถลบมอนิเตอร์ออกทั้งหมดได้",
- "starPromptTitle": "ให้ดาวกับฉัน",
- "starPromptDescription": "ดูการอัปเดตล่าสุด และมีส่วนร่วมในการขยายชุมชนบน GitHub",
- "https": "HTTPS",
- "http": "HTTP",
- "monitor": "monitor",
- "aboutus": "เกี่ยวกับฉัน",
- "now": "ตอนนี้",
- "delete": "ลบ",
- "configure": "ตั้งค่า",
- "responseTime": "ระยะเวลาการตอบสนอง",
- "ms": "ms",
- "bar": "Bar",
- "area": "พื้นที่",
- "country": "ประเทศ",
- "city": "จังหวัด",
- "response": "การตอบสนอง",
- "monitorStatusUp": "มอนิเตอร์ {name} ({url}) สถานะตอนนี้ออนไลน์และตอบสนองปกติ",
- "monitorStatusDown": "มอนิเตอร์ {name} ({url}) สถานะตอนนี้ล่มและไม่ตอบสนอง",
- "webhookSendSuccess": "การแจ้งเตือนผ่าน Webhook ถูกส่งเรียบร้อยแล้ว",
- "webhookSendError": "ไม่สามารถส่งการแจ้งเตือนผ่าน Webhook ไปที่ {platform} ได้",
- "webhookUnsupportedPlatform": "ระบบไม่รองรับแพลตฟอร์ม {platform} นี้",
- "distributedRightCategoryTitle": "มอนิเตอร์",
- "distributedStatusServerMonitors": "มอนิเตอร์เชิร์ฟเวอร์",
- "distributedStatusServerMonitorsDescription": "ตรวจสอบสถานะของเซิร์ฟเวอร์ที่เกี่ยวข้อง",
- "distributedUptimeCreateSelectURL": "คุณสามารถระบุ URL ของโฮสต์และเลือกประเภทของตัวตรวจสอบได้ที่นี่",
- "distributedUptimeCreateChecks": "รายการตรวจสอบ",
- "distributedUptimeCreateChecksDescription": "คุณสามารถเพิ่มหรือลบการตรวจสอบได้เสมอหลังจากเพิ่มเว็บไซต์ของคุณแล้ว",
- "distributedUptimeCreateIncidentNotification": "การแจ้งเตือนปัญหา",
- "distributedUptimeCreateIncidentDescription": "เมื่อเกิดเหตุการณ์ผิดปกติ ให้แจ้งเตือนผู้ใช้งาน",
- "distributedUptimeCreateAdvancedSettings": "ตั้งค่าขั้นสูง",
- "distributedUptimeDetailsNoMonitorHistory": "ยังไม่มีประวัติการตรวจสอบสำหรับมอนิเตอร์นี้",
- "distributedUptimeDetailsStatusHeaderUptime": "เวลาระบบทำงาน:",
- "distributedUptimeDetailsStatusHeaderLastUpdate": "แก้ไขล่าสุด",
- "notifications": {
- "enableNotifications": "เปิดการแจ้งเตือนของแพลตฟอร์ม {{platform}} นี้",
- "testNotification": "ทดสอบระบบการแจ้งเตือน",
- "addOrEditNotifications": "เพิ่มและแก้ไขระบบการแจ้งเตือน",
- "slack": {
- "label": "Slack",
- "description": "เพื่อเปิดใช้งานการแจ้งเตือนผ่าน Slack ให้สร้างแอป Slack และเปิดใช้งาน Incoming Webhooks หลังจากนั้น เพียงใส่ URL ของ Webhook ที่นี่",
- "webhookLabel": "URL ของ Webhook/เว็บฮุค",
- "webhookPlaceholder": "https://hooks.slack.com/services/...",
- "webhookRequired": "ต้องระบุ URL ของ Slack webhook"
- },
- "discord": {
- "label": "Discord",
- "description": "เพื่อส่งข้อมูลไปยังช่อง Discord ผ่าน Discord notifications โดยใช้ Webhooks ให้เปิดใช้งาน Incoming Webhooks ของ Discord",
- "webhookLabel": "URL ของ Webhook/เว็บฮุค สำหรับ Discord",
- "webhookPlaceholder": "https://discord.com/api/webhooks/...",
- "webhookRequired": "ต้องระบุ URL ของ Discord webhook"
+ "common": {
+ "auth": {
+ "roles": {
+ "admin": "ผู้ดูแลระบบ",
+ "demo": "สาธิต",
+ "superadmin": "ผู้ดูแลระบบสูงสุด",
+ "user": "ผู้ใช้"
+ }
},
- "telegram": {
- "label": "Telegram",
- "description": "เพื่อเปิดใช้งานการแจ้งเตือนผ่าน Telegram ให้สร้างบอท Telegram โดยใช้ BotFather ซึ่งเป็นบอททางการสำหรับสร้างและจัดการบอท Telegram จากนั้นนำ API token และ Chat ID มาใส่ที่นี่",
- "tokenLabel": "Token/โทเคน ของบอท",
- "tokenPlaceholder": "123456:ABC-DEF1234ghIkl-zyx57W2v1u123ew11",
- "chatIdLabel": "Chat ID",
- "chatIdPlaceholder": "-1001234567890",
- "fieldsRequired": "ต้องระบุโทเค็นและรหัสแชทของ Telegram"
+ "alerts": {
+ "pageSpeedApiKey": {
+ "content": "คำเตือน: คุณยังไม่ได้เพิ่ม API key ของ Google PageSpeed ไปที่การตั้งค่าเพื่อเพิ่ม หากไม่มี ระบบตรวจสอบ PageSpeed จะไม่ทำงาน"
+ }
},
- "webhook": {
- "label": "Webhooks",
- "description": "คุณสามารถตั้งค่าเว็บฮุคแบบกำหนดเองเพื่อรับการแจ้งเตือนเมื่อเกิดเหตุการณ์ผิดปกติ",
- "urlLabel": "URL ของ Webhook",
- "urlPlaceholder": "https://your-server.com/webhook",
- "urlRequired": "ต้องระบุ URL ของ Webhook"
+ "appName": "Checkmate",
+ "breadcrumbs": {
+ "details": "รายละเอียด",
+ "home": "หน้าหลัก"
},
- "testNotificationDevelop": "ทดสอบการแจ้งเตือน 2",
- "integrationButton": "การรวมการแจ้งเตือน",
- "testSuccess": "ส่งการแจ้งเตือนทดสอบเรียบร้อยแล้ว!",
- "testFailed": "ไม่สามารถส่งการแจ้งเตือนทดสอบได้",
- "unsupportedType": "การแจ้งเตือนไม่ได้รับการสนับสนุนประเภทนี้",
- "networkError": "เกิดข้อผิดพลาดของเครือข่าย",
- "fallback": {
- "title": "ช่องทางแจ้งเตือนใช้เพื่อ:",
- "checks": [
- "แจ้งทีมเกี่ยวกับการหยุดทำงานหรือปัญหาประสิทธิภาพ",
- "แจ้งวิศวกรเมื่อเกิดเหตุการณ์",
- "ให้ผู้ดูแลระบบทราบเกี่ยวกับการเปลี่ยนแปลงของระบบ"
- ],
- "actionButton": "มาสร้างช่องทางการแจ้งเตือนแรกของคุณกันเถอะ!"
+ "buttons": {
+ "addMember": "เพิ่มสมาชิก",
+ "cancel": "ยกเลิก",
+ "close": "ปิด",
+ "configure": "ตั้งค่า",
+ "confirm": "ยืนยัน",
+ "create": "สร้าง",
+ "delete": "ลบ",
+ "generateToken": "สร้างโทเค็น",
+ "incidents": "เหตุการณ์",
+ "inviteMember": "เชิญสมาชิก",
+ "pause": "หยุดชั่วคราว",
+ "resume": "ดำเนินการต่อ",
+ "save": "บันทึก",
+ "sendInvite": "ส่งคำเชิญ",
+ "test": "ทดสอบ",
+ "testNotifications": "ทดสอบการแจ้งเตือน",
+ "toggleTheme": "สลับโหมดสว่าง & มืด",
+ "flushQueue": "ล้างคิว",
+ "notFound": "ไปยังแดชบอร์ดหลัก",
+ "resetPassword": "รีเซ็ตรหัสผ่าน",
+ "reset": "รีเช็ต",
+ "clear": "ล้าง",
+ "addDemo": "เพิ่มมอนิเตอร์สาธิต",
+ "removeMonitors": "ลบมอนิเตอร์",
+ "sendTestEmail": "ส่งอีเมลทดสอบ",
+ "exportToJSON": "ส่งออกเป็น JSON",
+ "importFromJSON": "นำเข้าจาก JSON",
+ "clearFilters": "ล้างตัวกรอง",
+ "removeUser": "ลบผู้ใช้"
},
- "createButton": "สร้างช่องทางแจ้งเตือน",
- "createTitle": "ช่องทางแจ้งเตือน",
- "create": {
- "success": "สร้างช่องทางแจ้งเตือนสำเร็จแล้ว",
- "failed": "ไม่สามารถสร้างช่องทางแจ้งเตือนได้"
+ "charts": {
+ "labels": {
+ "averageResponseTime": "เวลาตอบสนองเฉลี่ย",
+ "downtime": "ดาวน์ไทม์",
+ "high": "สูง",
+ "low": "ต่ำ",
+ "uptime": "อัปไทม์"
+ },
+ "histogram": {
+ "avg": "เฉลี่ย: {{value}} ms",
+ "max": "สูงสุด: {{value}} ms"
+ }
},
- "fetch": {
- "success": "ดึงข้อมูลการแจ้งเตือนสำเร็จแล้ว",
- "failed": "ไม่สามารถดึงข้อมูลการแจ้งเตือนได้"
+ "dialogs": {
+ "delete": {
+ "description": "การกระทำนี้ไม่สามารถย้อนกลับได้",
+ "title": "คุณแน่ใจหรือไม่ว่าต้องการลบรายการนี้?"
+ }
},
- "delete": {
- "success": "ลบช่องทางแจ้งเตือนสำเร็จแล้ว",
- "failed": "ไม่สามารถลบช่องทางแจ้งเตือนได้"
+ "labels": {
+ "active": "ใช้งานอยู่",
+ "paused": "หยุดชั่วคราว",
+ "na": "ไม่มีข้อมูล",
+ "resolved": "แก้ไขแล้ว",
+ "responseTime": "เวลาตอบสนอง"
},
- "edit": {
- "success": "ปรับปรุงช่องทางแจ้งเตือนสำเร็จแล้ว",
- "failed": "ไม่สามารถปรับปรุงการแจ้งเตือนได้"
+ "form": {
+ "role": {
+ "option": {
+ "role": {
+ "label": "บทบาท"
+ }
+ }
+ },
+ "name": {
+ "option": {
+ "firstName": {
+ "label": "ชื่อ",
+ "placeholder": "Brownyroll"
+ },
+ "lastName": {
+ "label": "นามสกุล",
+ "placeholder": "."
+ }
+ }
+ },
+ "email": {
+ "option": {
+ "email": {
+ "label": "อีเมล",
+ "placeholder": "you@example.com"
+ }
+ }
+ }
},
- "test": {
- "success": "ส่งการแจ้งเตือนทดสอบสำเร็จแล้ว",
- "failed": "ไม่สามารถส่งการแจ้งเตือนทดสอบได้"
+ "table": {
+ "empty": "ไม่มีข้อมูล",
+ "headers": {
+ "actions": "จัดการ",
+ "dateTime": "วันที่และเวลา",
+ "message": "ข้อความ",
+ "monitor": "มอนิเตอร์",
+ "monitorId": "รหัสมอนิเตอร์",
+ "name": "ชื่อ",
+ "status": "สถานะ",
+ "type": "ประเภท",
+ "url": "URL",
+ "interval": "ช่วงเวลา",
+ "active": "ใช้งานอยู่",
+ "responseTime": "เวลาตอบสนอง"
+ }
}
},
- "testLocale": "testLocale",
- "add": "เพิ่ม",
- "monitors": "monitors",
- "distributedUptimeStatusCreateStatusPage": "หน้าตรวจสอบสถานะระบบ",
- "distributedUptimeStatusCreateStatusPageAccess": "สิทธิ์เข้าถึง",
- "distributedUptimeStatusCreateStatusPageReady": "เมื่อหน้าสถานะพร้อม คุณสามารถตั้งค่าเป็นเผยแพร่สู่สาธารณะได้",
- "distributedUptimeStatusBasicInfoHeader": "ข้อมูลทั่วไป",
- "distributedUptimeStatusBasicInfoDescription": "ระบุชื่อบริษัทและซับโดเมนสำหรับหน้าสถานะของคุณ",
- "distributedUptimeStatusLogoHeader": "โลโก้",
- "distributedUptimeStatusLogoDescription": "อัปโหลดโลโก้ให้ Status Page ของคุณ",
- "distributedUptimeStatusLogoUploadButton": "อัพโหลดโลโก้",
- "distributedUptimeStatusStandardMonitorsHeader": "มอนิเตอร์พื้นฐาน",
- "distributedUptimeStatusStandardMonitorsDescription": "เพิ่มตัวตรวจสอบมาตรฐานไปยัง Status Page ของคุณ",
- "distributedUptimeStatusCreateYour": "Create your",
- "distributedUptimeStatusEditYour": "Edit your",
- "distributedUptimeStatusPublishedLabel": "เผยแพร่และมองเห็นได้ต่อสาธารณะ",
- "distributedUptimeStatusCompanyNameLabel": "ชื่อบริษัท",
- "distributedUptimeStatusPageAddressLabel": "ที่อยู่หน้าสถานะของคุณ",
- "distributedUptimeStatus30Days": "30 วัน",
- "distributedUptimeStatus60Days": "60 วัน",
- "distributedUptimeStatus90Days": "90 วัน",
- "distributedUptimeStatusPageNotSetUp": "หน้าสถานะยังไม่ถูกสร้างขึ้น",
- "distributedUptimeStatusContactAdmin": "กรุณาติดต่อผู้ดูแลระบบของคุณ เพื่อขอความช่วยเหลือ",
- "distributedUptimeStatusPageNotPublic": "หน้าสถานะนี้ไม่เปิดเผยต่อสาธารณะ",
- "distributedUptimeStatusPageDeleteDialog": "คุณต้องการลบหน้าสถานะนี้หรือไม่?",
- "distributedUptimeStatusPageDeleteConfirm": "ใช่ ฉันต้องการลบหน้าสถานะนี้",
- "distributedUptimeStatusPageDeleteDescription": "เมื่อถูกลบแล้ว หน้าสถานะของคุณจะไม่สามารถกู้คืนได้",
- "distributedUptimeStatusDevices": "อุปกรณ์",
- "distributedUptimeStatusUpt": "UPT",
- "distributedUptimeStatusUptBurned": "UPT Burned",
- "distributedUptimeStatusUptLogo": "Upt Logo",
- "incidentsTableNoIncidents": "ยังไม่มีเหตุการณ์ผิดปกติบันทึกไว้",
- "incidentsTablePaginationLabel": "เหตุการณ์ผิดปกติ",
- "incidentsTableMonitorName": "ชื่อมอนิเตอร์",
- "incidentsTableStatus": "สถานะ",
- "incidentsTableDateTime": "วันและเวลา",
- "incidentsTableStatusCode": "รหัสสถานะ",
- "incidentsTableMessage": "ข้อความ",
- "incidentsOptionsHeader": "เหตุการณ์ผิดปกติสำหรับ:",
- "incidentsOptionsHeaderFilterBy": "กรองโดย:",
- "incidentsOptionsHeaderFilterAll": "ท้ังหมด",
- "incidentsOptionsHeaderFilterDown": "ล่ม",
- "incidentsOptionsHeaderFilterCannotResolve": "ไม่แก้ไข/หาสาเหตุไม่ได้",
- "incidentsOptionsHeaderShow": "แสดง:",
- "incidentsOptionsHeaderLastHour": "ชั่วโมงที่แล้ว",
- "incidentsOptionsHeaderLastDay": "วันที่แล้ว",
- "incidentsOptionsHeaderLastWeek": "สัปดาห์ที่แล้ว",
- "incidentsOptionsPlaceholderAllServers": "เชิร์ฟเวอร์ทั้งหมด",
- "infrastructureCreateYour": "สร้าง",
- "infrastructureCreateGeneralSettingsDescription": "คุณสามารถเลือก URL ของโฮสต์ พร้อมกับชื่อที่เป็นมิตร Friendly Name และรหัสลับการอนุญาตเพื่อเชื่อมต่อกับตัวแทนเซิร์ฟเวอร์ Server Agent",
- "infrastructureServerRequirement": "เซิร์ฟเวอร์ที่คุณมอนิเตอร์ต้องกำลังทำงานด้วย",
- "infrastructureCustomizeAlerts": "ปรับแต่งการแจ้งเตือน",
- "infrastructureAlertNotificationDescription": "ส่งการแจ้งเตือนถึงผู้ใช้เมื่อค่าขีดจำกัดเกินเปอร์เซ็นต์ที่กำหนด",
- "infrastructureCreateMonitor": "สร้าง Infrastructure Monitor",
- "infrastructureProtocol": "โปรโตคอล",
- "infrastructureServerUrlLabel": "URL ของเซิร์ฟเวอร์",
- "infrastructureDisplayNameLabel": "ชื่อที่แสดง",
- "infrastructureAuthorizationSecretLabel": "Authorization secret / คีย์ลับสำหรับการยืนยันตัวตน",
- "gb": "กิกะไบต์ GB",
- "mb": "เมกะไบต์ MB",
- "mem": "แรม",
- "memoryUsage": "การใช้งานแรม",
- "cpu": "ซีพียู",
- "cpuUsage": "การใช้งาน CPU",
- "cpuTemperature": "อุณหภูมิ CPU",
- "diskUsage": "การใช้งาน Disk",
- "used": "ใช้งาน",
- "total": "ทั้งหมด",
- "cores": "คอร์",
- "frequency": "ความถี่",
- "status": "สถานะ",
- "cpuPhysical": "ซีพียู (คอร์หลัก)",
- "cpuLogical": "ซีพียู (คอร์เสมือน)",
- "cpuFrequency": "ความถี่ของ CPU",
- "avgCpuTemperature": "อุณหภูมิเฉลี่ยของซีพียู",
- "memory": "แรม",
- "disk": "ดิส/พื้นที่",
- "uptime": "",
- "os": "ระบบปฏิบัติการ",
- "host": "โฮส",
- "actions": "จัดการ",
- "integrations": "การรวมระบบ",
- "integrationsPrism": "เชื่อมต่อ Prism กับบริการที่คุณชื่นชอบ",
- "integrationsSlack": "Slack",
- "integrationsSlackInfo": "เชื่อมต่อกับ Slack และดูเหตุการณ์ผิดปกติในช่องทาง",
- "integrationsDiscord": "Discord",
- "integrationsDiscordInfo": "เชื่อมต่อกับ Discord และดูเหตุการณ์ผิดปกติได้โดยตรงในช่องทาง",
- "integrationsZapier": "Zapier",
- "integrationsZapierInfo": "ส่งเหตุการณ์ทั้งหมดไปยัง Zapier แล้วสามารถดูได้ทุกที่",
- "commonSave": "บันทึก",
- "createYour": "Create your",
- "createMonitor": "",
- "pause": "พักชั่วคราว",
- "resume": "ดำเนินการต่อ",
- "editing": "กำลังปรับปรุง…",
- "url": "URL",
- "access": "การเข้าถึง",
- "timezone": "เขตเวลา",
- "features": "ฟีเจอร์",
- "administrator": "ผู้ดูแลระบบ",
- "loginHere": "กรุณาเข้าสู่ระบบที่นี่",
- "displayName": "ชื่อที่แสดง",
- "urlMonitor": "ลิงก์ที่จะมอนิเตอร์",
- "portToMonitor": "พอร์ตที่จะมอนิเตอร์",
- "websiteMonitoring": "เว็บไชต์ที่จะมอนิเตอร์",
- "websiteMonitoringDescription": "ใช้ HTTP(s) เพื่อตรวจสอบเว็บไซต์หรือ API endpoint ของคุณ",
- "pingMonitoring": "มอนิเตอร์แบบ Ping",
- "pingMonitoringDescription": "ตรวจสอบว่าเซิร์ฟเวอร์ของคุณพร้อมใช้งานหรือไม่",
- "dockerContainerMonitoring": "มอนิเตอร์คอนเทนเนอร์ใน Docker",
- "dockerContainerMonitoringDescription": "ตรวจสอบว่าคอนเทนเนอร์ Docker ของคุณกำลังทำงานอยู่หรือไม่",
- "portMonitoring": "มอนิเตอร์แบบ Ping",
- "portMonitoringDescription": "ตรวจสอบว่าพอร์ตของคุณเปิดอยู่หรือไม่",
- "createMaintenanceWindow": "สร้างช่วงเวลาบำรุงรักษา",
- "createMaintenance": "สร้างการบำรุงรักษา",
- "editMaintenance": "แก้ไขการบำรุงรักษา",
- "maintenanceWindowName": "ชื่อหน้าบำรุงรักษา",
- "friendlyNameInput": "ชื่อแสดงผล",
- "friendlyNamePlaceholder": "Maintenance เริ่มต้นเวลา __ : __ และใช้เวลา ___ นาที",
- "maintenanceRepeat": "ทำซ้ำการบำรุงรักษา",
- "maintenance": "การบำรุงรักษา",
- "duration": "ระยะเวลา",
- "addMonitors": "เพิ่มมอนิเตอร์",
- "window": "ช่วงเวลา",
- "cancel": "ยกเลิก",
- "message": "ข้อความ",
- "low": "Low",
- "high": "High",
- "statusCode": "รหัสสถานะ",
- "date&Time": "วันที่และเวลา",
- "type": "ประเภท",
- "statusPageName": "ชื่อ Status Page",
- "publicURL": "URL สาธารณะ",
- "repeat": "ทำซ้ำ",
- "edit": "แก้ไข",
- "createA": "สร้าง A",
- "remove": "ลบ",
- "maintenanceWindowDescription": "ช่วงเวลาการบำรุงรักษา การตรวจสอบทั้งหมดของมอนิเตอร์ที่ถูกเลือกจะถูกระงับ ไม่ทำการตรวจสอบเครือข่ายใด ๆ ทำให้ไม่มีการอัปเดตสถานะหรือแจ้งเตือนเกิดขึ้น มอนิเตอร์ของคุณจะคงแสดงสถานะล่าสุดที่ทราบ และหน้าสถานะจะมีสัญลักษณ์บ่งบอกว่ากำลังอยู่ระหว่างการบำรุงรักษา เมื่อเวลาการบำรุงรักษาสิ้นสุด การตรวจสอบจะกลับมาทำงานโดยอัตโนมัติ และหากพบปัญหา การแจ้งเตือนจะถูกส่งออก ช่วงเวลาการบำรุงรักษาจะไม่ถูกนับรวมในการคำนวณความพร้อมใช้งาน",
- "startTime": "เวลาเริ่มต้น",
- "timeZoneInfo": "วันที่และเวลาทั้งหมดเป็นเวลาตามโซน GMT+0",
- "monitorsToApply": "มอนิเตอร์ที่จะใช้ช่วงเวลาการบำรุงรักษา",
- "nextWindow": "ช่วงเวลาถัดไป",
- "notFoundButton": "ไปยังหน้าจอแดชบอร์ดหลัก",
- "pageSpeedConfigureSettingsDescription": "คุณสามารถเลือก URL ของโฮสต์ พร้อมกับประเภทของมอนิเตอร์ได้",
- "monitorDisplayName": "ชื่อที่แสดงของมอนิเตอร์",
- "whenNewIncident": "เมื่อเกิดเหตุการณ์ใหม่",
- "notifySMS": "แจ้งเตือนทางSMS (กำลังจะมา)",
- "notifyEmails": "แจ้งเตือนทางอีเมลไปยังหลายที่อยู่ด้วย (กำลังจะมา)",
- "seperateEmails": "คุณสามารถแยกอีเมลหลายอันด้วยเครื่องหมายจุลภาค , ได้",
- "checkFrequency": "ความถี่ในการตรวจสอบ",
- "matchMethod": "วิธีการจับคู่",
- "expectedValue": "ค่าที่คาดหวัง",
- "deleteDialogTitle": "คุณแน่ใจหรือว่าต้องการลบมอนิเตอร์นี้ไหม",
- "deleteDialogDescription": "เมื่อลบแล้ว มอนิเตอร์นี้ไม่สามารถกู้คืนได้",
- "pageSpeedMonitor": "มอนิเตอร์ความเร็วหน้าเว็บ",
- "shown": "แสดง",
- "ago": "ที่ผ่านมา",
- "companyName": "ชื่อบริษัท",
- "pageSpeedDetailsPerformanceReport": "เป็นค่าโดยประมาณและอาจแตกต่างกันไป",
- "pageSpeedDetailsPerformanceReportCalculator": "ดูเครื่องคิดเลข",
- "checkingEvery": "ตรวจสอบทุก",
- "statusPageCreateSettings": "หากหน้าสถานะของคุณพร้อมแล้ว คุณสามารถทำเครื่องหมายว่าเผยแพร่แล้วได้",
- "basicInformation": "ข้อมูลพื้นฐาน",
- "statusPageCreateBasicInfoDescription": "กำหนดชื่อบริษัทและซับโดเมนที่หน้าสถานะของคุณชี้ไป",
- "statusPageCreateSelectTimeZoneDescription": "เลือกเขตเวลาที่หน้าสถานะของคุณจะแสดง",
- "statusPageCreateAppearanceDescription": "กําหนดรูปลักษณ์เริ่มต้นของหน้าสถานะสาธารณะของคุณ",
- "statusPageCreateSettingsCheckboxLabel": "เผยแพร่และเปิดเผยต่อสาธารณะ",
- "statusPageCreateBasicInfoStatusPageAddress": "ที่อยู่หน้าสถานะของคุณ",
- "statusPageCreateTabsContent": "หน้าสถานะเซิร์ฟเวอร์",
- "statusPageCreateTabsContentDescription": "คุณสามารถเพิ่มเซิร์ฟเวอร์ที่คุณตรวจสอบเข้าไปยังหน้าสถานะของคุณได้จำนวนเท่าใดก็ได้ และสามารถจัดลำดับใหม่เพื่อการแสดงผลที่ดีที่สุด",
- "statusPageCreateTabsContentFeaturesDescription": "แสดงรายละเอียดเพิ่มเติมบนหน้าสถานะ",
- "showCharts": "แสดงแผนภูมิ",
- "showUptimePercentage": "แสดงเปอร์เซ็นต์ความพร้อมใช้งาน",
- "removeLogo": "ลบโลโก้",
- "statusPageStatus": "ยังไม่ได้ตั้งค่าหน้าสถานะสาธารณะ",
- "statusPageStatusContactAdmin": "กรุณาติดต่อผู้ดูแลระบบของคุณ",
- "statusPageStatusNotPublic": "หน้าสถานะนี้ไม่เป็นสาธารณะ",
- "statusPageStatusNoPage": "ที่นี่ยังไม่มีหน้าสถานะ",
- "statusPageStatusServiceStatus": "สถานะบริการ",
- "deleteStatusPage": "คุณต้องการลบหน้าสถานะนี้หรือไม่ไหม?",
- "deleteStatusPageConfirm": "ใช่ ลบหน้าสถานะ",
- "deleteStatusPageDescription": "เมื่อลบแล้ว หน้าสถานะของคุณไม่สามารถกู้คืนได้",
- "uptimeCreate": "ค่าที่คาดหวังถูกใช้เพื่อตรวจสอบผลลัพธ์การตอบกลับ และการจับคู่จะเป็นตัวกำหนดสถานะ",
- "uptimeCreateJsonPath": "นิพจน์นี้จะถูกประเมินกับข้อมูล JSON ที่ตอบกลับ และผลลัพธ์จะถูกใช้เพื่อตรวจสอบกับค่าที่คาดหวัง ดู",
- "uptimeCreateJsonPathQuery": "for query language documentation.",
- "maintenanceTableActionMenuDialogTitle": "คุณแน่ใจหรือว่าต้องการลบช่วงเวลาการบำรุงรักษานี้?",
- "infrastructureEditYour": "Edit your",
- "infrastructureEditMonitor": "บันทึก Infrastructure มอนิเตอร์",
- "infrastructureMonitorCreated": "สร้างมอนิเตอร์ Infrastructure เรียบร้อยแล้ว!",
- "infrastructureMonitorUpdated": "อัพเดทมอนิเตอร์ Infrastructure เรียบร้อยแล้ว!",
- "errorInvalidTypeId": "ประเภทการแจ้งเตือนที่ระบุไม่ถูกต้อง",
- "errorInvalidFieldId": "รหัสฟิลด์ที่ระบุไม่ถูกต้อง",
- "inviteNoTokenFound": "ไม่พบโทเค็นคำเชิญ",
- "pageSpeedWarning": "คำเตือน: คุณยังไม่ได้เพิ่มคีย์ Google PageSpeed API หากไม่มีคีย์นี้ มอนิเตอร์ความเร็วหน้าเว็บจะไม่ทำงาน",
- "pageSpeedLearnMoreLink": "คลิกที่นี่",
- "pageSpeedAddApiKey": "เพื่อเพิ่มคีย์ API ของคุณ",
- "update": "อัปเดต",
- "invalidFileFormat": "รูปแบบไฟล์ไม่รองรับ!",
- "invalidFileSize": "ขนาดไฟล์ใหญ่เกินไป!",
- "ClickUpload": "คลิกเพื่ออัปโหลด",
- "DragandDrop": "ลากและวางเลย",
- "MaxSize": "ขนาดสูงสุด",
- "SupportedFormats": "รูปแบบที่รองรับ",
- "FirstName": "ชื่อจริง",
- "LastName": "นามสกุล",
- "EmailDescriptionText": "นี่คือที่อยู่อีเมลปัจจุบันของคุณ — ไม่สามารถแก้ไขได้",
- "YourPhoto": "รูปโปรไฟล์",
- "PhotoDescriptionText": "รูปนี้จะแสดงบนหน้าประวัติของคุณ",
- "save": "บันทึก",
- "DeleteDescriptionText": "การทำเช่นนี้จะลบบัญชีและข้อมูลทั้งหมดที่เกี่ยวข้องบนเซิร์ฟเวอร์ ไม่สามารถกู้คืนได้",
- "DeleteAccountWarning": "การลบบัญชีหมายความว่าคุณจะไม่สามารถเข้าสู่ระบบอีก และข้อมูลทั้งหมดของคุณจะถูกลบ ไม่สามารถกู้คืนได้",
- "DeleteWarningTitle": "คุณแน่ใจหรือว่าต้องการลบบัญชีนี้?",
- "bulkImport": {
- "title": "นำเข้าจำนวนมาก",
- "selectFileTips": "เลือกไฟล์ CSV เพื่อนำเข้า",
- "selectFileDescription": "คุณสามารถดาวน์โหลด template หรือ sample ของเราได้",
- "selectFile": "เลือกไฟล์",
- "parsingFailed": "การแยกวิเคราะห์ล้มเหลว",
- "uploadSuccess": "สร้างมอนิเตอร์เรียบร้อยแล้ว!",
- "validationFailed": "การตรวจสอบล้มเหลว",
- "noFileSelected": "ยังไม่ได้เลือกไฟล์",
- "fallbackPage": "นำเข้าไฟล์เพื่ออัปโหลดรายการเซิร์ฟเวอร์เป็นกลุ่ม",
- "invalidFileType": "ประเภทไฟล์ไม่ถูกต้อง",
- "uploadFailed": "อัปโหลดล้มเหลว"
- },
- "DeleteAccountTitle": "ลบบัญชี",
- "DeleteAccountButton": "ลบบัญชี",
- "publicLink": "ลิงก์สาธารณะ",
- "maskedPageSpeedKeyPlaceholder": "*************************************",
- "reset": "รีเช็ต",
- "ignoreTLSError": "ละเว้นข้อผิดพลาด TLS/SSL",
- "tlsErrorIgnored": "ละเว้นข้อผิดพลาด TLS/SSL แล้ว",
- "ignoreTLSErrorDescription": "ละเว้นข้อผิดพลาด TLS/SSL และดำเนินการตรวจสอบความพร้อมใช้งานของเว็บไซต์ต่อ",
- "createNew": "สร้างใหม่",
- "greeting": {
- "prepend": "สวัสดี",
- "append": "ช่วงบ่ายคือเวลาเล่นของคุณ—มาทำให้สุดยอดกันเถอะ!",
- "overview": "นี่คือภาพรวมระบบมอนิเตอร์ประเภท {{type}} ของคุณ"
- },
- "roles": {
- "superAdmin": "Super admin",
- "admin": "แอดมิน",
- "teamMember": "สมาชิกในทีม",
- "demoUser": "ผู้ใช้ Demo"
- },
- "teamPanel": {
- "teamMembers": "สมาชิกในทีม",
- "filter": {
- "all": "ทั้งหมด",
- "member": "สมาชิก"
+ "components": {
+ "imageUpload": {
+ "clickToUpload": "คลิกเพื่ออัปโหลด",
+ "dragAndDrop": "ลากและวางเลย",
+ "supportedFormats": "รูปแบบที่รองรับ",
+ "maxSize": "ขนาดสูงสุด",
+ "orDragAndDrop": "หรือลากและวาง",
+ "errors": {
+ "invalidFileSize": "ขนาดไฟล์ใหญ่เกินไป!",
+ "invalidFileFormat": "รูปแบบไฟล์ไม่รองรับ!"
+ }
},
- "inviteTeamMember": "เชิญสมาชิกเข้าทีม",
- "inviteNewTeamMember": "เชิญสมาชิกทีมใหม่",
- "inviteDescription": "เมื่อคุณเพิ่มสมาชิกทีมใหม่ เขาจะสามารถเข้าถึงมอนิเตอร์ทั้งหมดได้",
- "email": "อีเมล",
- "selectRole": "เลือกบทบาท",
- "inviteLink": "ลิงก์เชิญ",
- "cancel": "ยกเลิก",
- "noMembers": "ยังไม่มีสมาชิกทีมในบทบาทนี้",
- "getToken": "รับโทเค็น",
- "emailToken": "Token ทางอีเมล",
- "table": {
- "name": "ชื่อ",
- "email": "อีเมล",
- "role": "บทบาท",
- "created": "สร้างเมื่อ"
+ "headerStatusPageControls": {
+ "publicLink": "ลิงก์สาธารณะ"
},
- "addTeamMember": {
- "addMemberMenu": "เพิ่มสมาชิกทีม",
- "title": "ลงทะเบียนสมาชิกทีมใหม่",
- "description": "สร้างผู้ใช้ใหม่และแชร์ข้อมูลการเข้าสู่ระบบให้กับพวกเขา วิธีนี้จะทำให้สมาชิกสามารถเข้าถึงตัวตรวจสอบทั้งหมดได้ทันที",
- "addButton": "เพิ่มสมาชิก"
+ "headerTimeRange": {
+ "labels": {
+ "day": "วัน",
+ "month": "เดือน",
+ "recent": "ล่าสุด",
+ "week": "สัปดาห์"
+ },
+ "description": {
+ "recent": "แสดงสถิติย้อนหลัง 2 ชั่วโมง",
+ "day": "แสดงสถิติย้อนหลัง 24 ชั่วโมง",
+ "week": "แสดงสถิติย้อนหลัง 7 วัน",
+ "month": "แสดงสถิติย้อนหลัง 30 วัน"
+ }
},
- "register": "ลงทะเบียนสมาชิกทีม",
- "registerToast": {
- "success": "สร้างผู้ใช้เรียบร้อยแล้ว กรุณาแชร์ข้อมูลการเข้าสู่ระบบให้สมาชิกอย่างปลอดภัย",
- "dbUserExists": "ผู้ใช้นี้มีอยู่แล้ว",
- "unknownError": "เกิดข้อผิดพลาดที่ไม่ทราบสาเหตุ"
+ "offlineBanner": {
+ "serverUnreachable": "ไม่สามารถเชื่อมต่อเซิร์ฟเวอร์ได้",
+ "retry": "ลองอีกครั้ง",
+ "retrying": "กำลังลองอีกครั้ง...",
+ "reconnected": "เชื่อมต่อกับเซิร์ฟเวอร์สำเร็จแล้ว"
},
- "registerTeamMember": {
- "title": "ลงทะเบียนสมาชิกทีม",
- "auth": {
- "common": {
- "inputs": {
- "firstName": {
- "errors": {
- "empty": "กรุณากรอกชื่อ",
- "pattern": "ชื่อต้องมีเฉพาะตัวอักษร เว้นวรรค เครื่องหมายอัญประกาศ หรือขีดกลาง"
- }
- },
- "lastName": {
- "errors": {
- "empty": "กรุณากรอกนามสกุล",
- "pattern": "นามสกุลต้องมีเฉพาะตัวอักษร เว้นวรรค เครื่องหมายอัญประกาศ หรือขีดกลาง"
- }
+ "sidebar": {
+ "menu": {
+ "uptime": "ความพร้อมใช้งาน",
+ "pagespeed": "ความเร็วหน้าเว็บ",
+ "infrastructure": "โครงสร้างพื้นฐาน",
+ "notifications": "การแจ้งเตือน",
+ "checks": "การตรวจสอบ",
+ "incidents": "เหตุการณ์",
+ "statusPages": "หน้าสถานะ",
+ "maintenance": "การบำรุงรักษา",
+ "logs": "บันทึก",
+ "settings": "การตั้งค่า"
+ },
+ "bottomMenu": {
+ "support": "การสนับสนุน",
+ "discussions": "การสนทนา",
+ "docs": "เอกสาร",
+ "changelog": "บันทึกการเปลี่ยนแปลง"
+ },
+ "accountMenu": {
+ "profile": "โปรไฟล์",
+ "password": "รหัสผ่าน",
+ "team": "ทีม"
+ },
+ "starPrompt": {
+ "title": "ให้ดาว Checkmate",
+ "description": "ดูรุ่นล่าสุดและช่วยเติบโตชุมชนบน GitHub"
+ },
+ "authFooter": {
+ "navControls": "การควบคุม",
+ "logOut": "ออกจากระบบ",
+ "roles": {
+ "superAdmin": "ผู้ดูแลระบบสูงสุด",
+ "admin": "ผู้ดูแลระบบ",
+ "user": "ผู้ใช้",
+ "demoUser": "ผู้ใช้ Demo"
+ }
+ }
+ },
+ "starPrompt": {
+ "title": "ให้ดาว Checkmate",
+ "description": "ดูรุ่นล่าสุดและช่วยเติบโตชุมชนบน GitHub"
+ }
+ },
+ "pages": {
+ "notFound": {
+ "title": "โอ้ไม่! ซูชิของคุณหล่นแล้ว!",
+ "subtitle": "URL ไม่มีอยู่ หรือคุณไม่มีสิทธิ์เข้าถึง"
+ },
+ "account": {
+ "tabs": {
+ "profile": "โปรไฟล์",
+ "password": "รหัสผ่าน",
+ "team": "ทีม"
+ },
+ "form": {
+ "name": {
+ "title": "ชื่อ",
+ "description": "อัปเดตข้อมูลส่วนตัวของคุณ"
+ },
+ "photo": {
+ "title": "รูปโปรไฟล์",
+ "description": "อัปโหลดรูปโปรไฟล์"
+ },
+ "currentPassword": {
+ "title": "รหัสผ่านปัจจุบัน",
+ "description": "กรอกรหัสผ่านปัจจุบันเพื่อยืนยันตัวตน",
+ "option": {
+ "label": "รหัสผ่านปัจจุบัน",
+ "placeholder": "กรอกรหัสผ่านปัจจุบัน"
+ }
+ },
+ "newPassword": {
+ "title": "รหัสผ่านใหม่",
+ "description": "เลือกรหัสผ่านที่รัดกุมอย่างน้อย 8 ตัวอักษร",
+ "option": {
+ "newPassword": {
+ "label": "รหัสผ่านใหม่",
+ "placeholder": "กรอกรหัสผ่านใหม่"
},
+ "confirm": {
+ "label": "ยืนยันรหัสผ่าน",
+ "placeholder": "ยืนยันรหัสผ่านใหม่"
+ }
+ }
+ },
+ "deleteAccount": {
+ "title": "ลบบัญชี",
+ "description": "การกระทำนี้เป็นการถาวรและไม่สามารถย้อนกลับได้"
+ }
+ },
+ "team": {
+ "filter": {
+ "placeholder": "กรองตามบทบาท",
+ "all": "ทั้งหมด",
+ "admin": "ผู้ดูแลระบบ",
+ "member": "สมาชิก"
+ },
+ "table": {
+ "headers": {
+ "email": "อีเมล",
+ "role": "บทบาท",
+ "created": "สร้างเมื่อ"
+ }
+ },
+ "addMember": {
+ "title": "ลงทะเบียนสมาชิกทีมใหม่",
+ "description": "สร้างบัญชีผู้ใช้ใหม่ แชร์ข้อมูลรับรองอย่างปลอดภัยหลังสร้าง"
+ },
+ "invite": {
+ "title": "เชิญสมาชิกทีม",
+ "description": "ส่งคำเชิญเข้าร่วมทีม",
+ "email": {
+ "label": "ที่อยู่อีเมล",
+ "placeholder": "กรอกที่อยู่อีเมล"
+ },
+ "role": {
+ "label": "บทบาท",
+ "placeholder": "เลือกบทบาท"
+ },
+ "linkLabel": "ลิงก์เชิญ"
+ }
+ }
+ },
+ "auth": {
+ "common": {
+ "passwordRules": {
+ "length": {
+ "beginning": "ต้องมีความยาวอย่างน้อย",
+ "highlighted": "8 ตัวอักษร"
+ },
+ "lowercase": {
+ "beginning": "ต้องมีอย่างน้อย",
+ "highlighted": "ตัวอักษรเล็ก 1 ตัว"
+ },
+ "match": {
+ "beginning": "รหัสผ่าน",
+ "highlighted": "ต้องตรงกัน"
+ },
+ "number": {
+ "beginning": "ต้องมีอย่างน้อย",
+ "highlighted": "ตัวเลข 1 ตัว"
+ },
+ "special": {
+ "beginning": "ต้องมีอย่างน้อย",
+ "highlighted": "อักขระพิเศษ 1 ตัว"
+ },
+ "uppercase": {
+ "beginning": "ต้องมีอย่างน้อย",
+ "highlighted": "ตัวอักษรใหญ่ 1 ตัว"
+ }
+ },
+ "form": {
+ "option": {
"email": {
- "errors": {
- "empty": "กรุณากรอกอีเมลเพื่อดำเนินการต่อ",
- "invalid": "กรุณาตรวจสอบความถูกต้องของอีเมลอีกครั้ง"
- }
+ "label": "อีเมล",
+ "placeholder": "me@example.com"
},
- "role": {
- "errors": {
- "empty": "ต้องระบุบทบาท"
- }
+ "password": {
+ "label": "รหัสผ่าน",
+ "placeholder": "********"
+ },
+ "confirmPassword": {
+ "label": "ยืนยันรหัสผ่าน"
}
}
}
+ },
+ "login": {
+ "title": "ยินดีต้อนรับกลับสู่ Checkmate!",
+ "subtitle": "เข้าสู่ระบบเพื่อดำเนินการต่อ",
+ "submit": "เข้าสู่ระบบ",
+ "links": {
+ "forgotPassword": {
+ "text": "ลืมรหัสผ่าน?",
+ "linkText": "รีเซ็ตรหัสผ่าน"
+ },
+ "register": {
+ "text": "ยังไม่มีบัญชี?",
+ "linkText": "ลงทะเบียนที่นี่"
+ }
+ }
+ },
+ "register": {
+ "title": "ยินดีต้อนรับกลับสู่ Checkmate!",
+ "subtitle": "สมัครสมาชิกเพื่อเริ่มต้น",
+ "submit": "ลงทะเบียน"
+ },
+ "forgotPassword": {
+ "title": "ลืมรหัสผ่านใช่ไหม?",
+ "subtitle": "ไม่ต้องกังวล เราจะส่งคำแนะนำการรีเซ็ตให้คุณ",
+ "submit": "ขอกู้คืนรหัสผ่าน",
+ "links": {
+ "login": {
+ "text": "กลับไปยัง",
+ "linkText": "เข้าสู่ระบบ"
+ }
+ }
+ },
+ "setNewPassword": {
+ "title": "รีเซ็ตรหัสผ่านของคุณ",
+ "subtitle": "รหัสผ่านใหม่ต้องแตกต่างจากรหัสผ่านที่เคยใช้ก่อนหน้า"
}
},
- "role": "บทบาท",
- "changeTeamPassword": {
- "changePasswordMenu": "",
- "title": "",
- "description": "",
- "success": ""
- }
- },
- "monitorState": {
- "paused": "หยุดชั่วคราว",
- "resumed": "ดำเนินการต่อ",
- "active": "ใช้งานอยู่"
- },
- "menu": {
- "uptime": "ความพร้อมใช้งาน",
- "pagespeed": "ความเร็วหน้าเว็บ",
- "infrastructure": "โครงสร้างพื้นฐาน",
- "incidents": "เหตุการณ์",
- "statusPages": "หน้าสถานะ",
- "maintenance": "การบำรุงรักษา",
- "integrations": "การรวมระบบ",
- "settings": "การตั้งค่า",
- "support": "การสนับสนุน",
- "discussions": "การสนทนา",
- "docs": "เอกสาร",
- "changelog": "บันทึกการเปลี่ยนแปลง",
- "profile": "โปรไฟล์",
- "password": "รหัสผ่าน",
- "team": "ทีม",
- "logOut": "ออกจากระบบ",
- "notifications": "การแจ้งเตือน",
- "logs": "Logs"
- },
- "settingsEmailUser": "อีเมลผู้ใช้ - ชื่อผู้ใช้สำหรับการยืนยันตัวตน จะใช้แทนอีเมลหากระบุไว้",
- "state": "สถานะ",
- "statusBreadCrumbsStatusPages": "หน้าสถานะ",
- "statusBreadCrumbsDetails": "รายละเอียด",
- "commonSaving": "กำลังบันทึก...",
- "navControls": "การควบคุม",
- "incidentsPageTitle": "เหตุการณ์",
- "passwordPanel": {
- "passwordChangedSuccess": "รหัสผ่านของคุณถูกเปลี่ยนเรียบร้อยแล้ว",
- "passwordInputIncorrect": "คุณป้อนรหัสผ่านที่ไม่ถูกต้อง",
- "currentPassword": "รหัสผ่านปัจจุบัน",
- "enterCurrentPassword": "กรอกรหัสผ่านปัจจุบันของคุณ",
- "newPassword": "รหัสผ่านใหม่",
- "enterNewPassword": "กรอกรหัสผ่านใหม่ของคุณ",
- "confirmNewPassword": "ยืนยันรหัสผ่านใหม่อีกครั้ง",
- "passwordRequirements": "รหัสผ่านใหม่ต้องมีอย่างน้อย 8 ตัวอักษร และต้องมีตัวอักษรใหญ่ ตัวอักษรเล็ก ตัวเลข และอักขระพิเศษอย่างละอย่าง 1",
- "saving": "กำลังบันทึก..."
- },
- "emailSent": "ส่งอีเมลเรียบร้อยแล้ว",
- "failedToSendEmail": "ส่งอีเมลล้มเหลว",
- "settingsTestEmailSuccess": "ส่งอีเมลทดสอบเรียบร้อยแล้ว",
- "settingsTestEmailFailed": "ส่งอีเมลทดสอบล้มเหลว",
- "settingsTestEmailFailedWithReason": "ส่งอีเมลทดสอบล้มเหลว: {{reason}}",
- "settingsTestEmailUnknownError": "ข้อผิดพลาดไม่ทราบสาเหตุ",
- "statusMsg": {
- "paused": "การตรวจสอบถูกพักชั่วคราว",
- "up": "เว็บไซต์ของคุณใช้งานได้",
- "down": "เว็บไซต์ของคุณล่ม",
- "pending": "รอดำเนินการ..."
- },
- "uptimeGeneralInstructions": {
- "http": "กรอก URL หรือ IP ที่ต้องการตรวจสอบ (เช่น https://example.com/\n หรือ 192.168.1.100) และตั้งชื่อที่ชัดเจนให้แสดงบนแดชบอร์ด",
- "ping": "กรอกที่อยู่ IP หรือชื่อโฮสต์ที่ต้องการ ping (เช่น 192.168.1.100 หรือ example.com) และตั้งชื่อที่ชัดเจนให้แสดงบนแดชบอร์ด",
- "docker": "กรอกชื่อหรือ ID ของคอนเทนเนอร์ Docker คุณสามารถใช้ชื่อคอนเทนเนอร์ (เช่น my-app) หรือ ID ของคอนเทนเนอร์ (ID เต็ม 64 ตัวอักษร หรือ ID สั้น)",
- "port": "กรอก URL หรือ IP ของเซิร์ฟเวอร์ หมายเลขพอร์ต และตั้งชื่อที่ชัดเจนให้แสดงบนแดชบอร์ด",
- "game": "กรอกที่อยู่ IP หรือชื่อโฮสต์และหมายเลขพอร์ตเพื่อทำการ ping (เช่น 192.168.1.100 หรือ example.com) และเลือกประเภทเกม",
- "https": ""
- },
- "common": {
- "appName": "Checkmate",
- "monitoringAgentName": "Capture",
- "buttons": {
- "toggleTheme": "สลับโหมดสว่าง & มืด"
+ "checks": {
+ "selects": {
+ "monitor": {
+ "all": "มอนิเตอร์ทั้งหมด"
+ },
+ "status": {
+ "all": "ทั้งหมด",
+ "down": "ล่ม",
+ "up": "ปกติ"
+ }
+ },
+ "table": {
+ "empty": "ไม่พบการตรวจสอบที่ล้มเหลวในช่วงเวลานี้",
+ "headers": {
+ "statusCode": "รหัสสถานะ",
+ "location": "ตำแหน่ง"
+ }
+ }
},
- "toasts": {
- "networkError": "ข้อผิดพลาดเครือข่าย",
- "checkConnection": "กรุณาตรวจสอบการเชื่อมต่อของคุณ",
- "unknownError": "ข้อผิดพลาดไม่ทราบสาเหตุ"
- }
- },
- "auth": {
"common": {
- "navigation": {
- "continue": "ดำเนินการต่อ",
- "back": "ย้อนกลับ"
- },
- "inputs": {
- "email": {
- "label": "อีเมล",
- "placeholder": "jordan.ellis@domain.com",
- "errors": {
- "empty": "เพื่อดำเนินการต่อ กรุณากรอกที่อยู่อีเมลของคุณ",
- "invalid": "กรุณาตรวจสอบความถูกต้องของอีเมลที่กรอก"
- }
+ "monitors": {
+ "actions": {
+ "configure": "ตั้งค่า",
+ "delete": "ลบ",
+ "generateToken": "สร้างโทเค็น",
+ "details": "รายละเอียด",
+ "incidents": "เหตุการณ์",
+ "inviteMember": "เชิญสมาชิก",
+ "openSite": "เปิดเว็บไซต์",
+ "pause": "หยุดชั่วคราว",
+ "resume": "ดำเนินการต่อ"
+ },
+ "statBoxes": {
+ "activeFor": "ทำงานมาแล้ว",
+ "certificateExpiry": "วันหมดอายุใบรับรอง",
+ "lastCheck": "ตรวจสอบล่าสุด",
+ "lastResponseTime": "เวลาตอบสนองล่าสุด"
+ },
+ "status": {
+ "down": "ล่ม",
+ "breached": "เกินเกณฑ์",
+ "initializing": "กำลังเริ่มต้น",
+ "maintenance": "บำรุงรักษา",
+ "paused": "หยุดชั่วคราว",
+ "total": "ทั้งหมด",
+ "up": "ปกติ"
+ },
+ "monitorTypes": {
+ "optionDocker": "Docker",
+ "optionGame": "เกม",
+ "optionHttp": "HTTP(S)",
+ "optionPing": "Ping",
+ "optionPort": "พอร์ต",
+ "optionPagespeed": "PageSpeed",
+ "optionHardware": "โครงสร้างพื้นฐาน",
+ "optionGrpc": "gRPC",
+ "optionWebSocket": "WebSocket"
+ }
+ }
+ },
+ "createMonitor": {
+ "form": {
+ "advanced": {
+ "description": "ตั้งค่าเพิ่มเติมสำหรับกรณีใช้งานขั้นสูง",
+ "option": {
+ "advancedMatching": {
+ "label": "ใช้การจับคู่ขั้นสูง"
+ },
+ "expectedValue": {
+ "label": "ค่าที่คาดหวัง"
+ },
+ "jsonPath": {
+ "description": "นิพจน์นี้จะถูกประเมินกับข้อมูล JSON ที่ตอบกลับ และผลลัพธ์จะถูกใช้จับคู่กับค่าที่คาดหวัง ดูเอกสาร query language ที่ jmespath.org",
+ "label": "นิพจน์ JSONPath"
+ },
+ "matchMethod": {
+ "label": "วิธีการจับคู่",
+ "equal": "เท่ากับ",
+ "include": "รวม",
+ "regex": "Regex"
+ }
+ },
+ "title": "ตั้งค่าขั้นสูง"
},
- "password": {
- "label": "รหัสผ่าน",
- "rules": {
- "length": {
- "beginning": "ต้องมีความยาวอย่างน้อย",
- "highlighted": "8 ตัวอักษร"
+ "frequency": {
+ "description": "คุณต้องการตรวจสอบสถานะของมอนิเตอร์นี้บ่อยแค่ไหน?",
+ "option": {
+ "frequency": {
+ "label": "ความถี่การตรวจสอบ",
+ "value": {
+ "fifteenMinutes": "15 นาที",
+ "fifteenSeconds": "15 วินาที",
+ "fiveMinutes": "5 นาที",
+ "fourMinutes": "4 นาที",
+ "oneMinute": "1 นาที",
+ "tenMinutes": "10 นาที",
+ "thirtyMinutes": "30 นาที",
+ "thirtySeconds": "30 วินาที",
+ "threeMinutes": "3 นาที",
+ "twoMinutes": "2 นาที"
+ }
+ }
+ },
+ "title": "ความถี่การตรวจสอบ"
+ },
+ "general": {
+ "option": {
+ "container": {
+ "label": "ชื่อ/ID คอนเทนเนอร์",
+ "placeholder": "my-app หรือ abcd1234"
+ },
+ "host": {
+ "label": "โฮสต์",
+ "placeholder": "192.168.1.100 หรือ example.com"
+ },
+ "name": {
+ "label": "ชื่อที่แสดง",
+ "placeholder": "เช่น เว็บไซต์ของฉัน"
},
- "special": {
- "beginning": "ต้องมีอย่างน้อย",
- "highlighted": "อักขระพิเศษ 1 ตัว"
+ "secret": {
+ "label": "รหัสลับสำหรับยืนยันตัวตน",
+ "placeholder": "กรอกรหัสลับของคุณ"
},
- "number": {
- "beginning": "ต้องมีอย่างน้อย",
- "highlighted": "ตัวเลข 1 ตัว"
+ "url": {
+ "label": "URL",
+ "placeholder": "https://www.google.com"
},
- "uppercase": {
- "beginning": "ต้องมีอย่างน้อย",
- "highlighted": "ตัวอักษรใหญ่ 1 ตัว"
+ "game": {
+ "label": "URL ที่ต้องการมอนิเตอร์",
+ "placeholder": "localhost"
},
- "lowercase": {
- "beginning": "ต้องมีอย่างน้อย",
- "highlighted": "ตัวอักษรเล็ก 1 ตัว"
+ "port": {
+ "label": "พอร์ตที่ต้องการตรวจสอบ",
+ "placeholder": "80"
},
- "match": {
- "beginning": "รหัสผ่าน",
- "highlighted": "ต้องตรงกัน"
+ "grpcServiceName": {
+ "label": "ชื่อบริการ",
+ "placeholder": "เช่น my.service.v1 (เว้นว่างสำหรับสถานะสุขภาพโดยรวม)"
+ },
+ "wsUrl": {
+ "label": "URL ของ WebSocket",
+ "placeholder": "wss://example.com/socket"
}
},
- "errors": {
- "empty": "กรุณากรอกรหัสผ่านของคุณ",
- "length": "รหัสผ่านต้องมีความยาวอย่างน้อย 8 ตัวอักษร",
- "uppercase": "รหัสผ่านต้องมีตัวอักษรใหญ่อย่างน้อย 1 ตัว",
- "lowercase": "รหัสผ่านต้องมีตัวอักษรเล็กอย่างน้อย 1 ตัว",
- "number": "รหัสผ่านต้องมีตัวเลขอย่างน้อย 1 ตัว",
- "special": "รหัสผ่านต้องมีอักขระพิเศษอย่างน้อย 1 ตัว",
- "incorrect": "รหัสผ่านที่คุณกรอกไม่ตรงกับข้อมูลของเรา"
+ "title": "ตั้งค่าทั่วไป",
+ "description": {
+ "http": "กรอก URL หรือ IP ที่ต้องการตรวจสอบ (เช่น https://example.com/ หรือ 192.168.1.100) และตั้งชื่อที่แสดงบนแดชบอร์ด",
+ "ping": "กรอกที่อยู่ IP หรือชื่อโฮสต์ที่ต้องการ ping (เช่น 192.168.1.100 หรือ example.com) และตั้งชื่อที่ชัดเจนให้แสดงบนแดชบอร์ด",
+ "port": "กรอก URL หรือ IP ของเซิร์ฟเวอร์ หมายเลขพอร์ต และตั้งชื่อที่ชัดเจนให้แสดงบนแดชบอร์ด",
+ "docker": "กรอกชื่อหรือ ID ของคอนเทนเนอร์ Docker คุณสามารถใช้ชื่อคอนเทนเนอร์ (เช่น my-app) หรือ ID ของคอนเทนเนอร์ (ID เต็ม 64 ตัวอักษร หรือ ID สั้น)",
+ "game": "กรอกที่อยู่ IP หรือชื่อโฮสต์และหมายเลขพอร์ตเพื่อทำการ ping (เช่น 192.168.1.100 หรือ example.com) และเลือกประเภทเกม",
+ "pagespeed": "ติดตามประสิทธิภาพการโหลดหน้า Core Web Vitals และคะแนนการเพิ่มประสิทธิภาพของเว็บไซต์",
+ "grpc": "กรอกชื่อโฮสต์และพอร์ตของเซิร์ฟเวอร์ gRPC ระบุชื่อบริการสำหรับ health check (ไม่บังคับ) และตั้งชื่อที่แสดง",
+ "websocket": "กรอก URL ของ WebSocket ที่ต้องการตรวจสอบ (เช่น wss://example.com/socket) และตั้งชื่อที่แสดง",
+ "hardware": "ตรวจสอบการใช้งาน CPU หน่วยความจำ ดิสก์ และอุณหภูมิของโครงสร้างพื้นฐาน"
}
},
- "passwordConfirm": {
- "label": "ยืนยันรหัสผ่าน",
- "placeholder": "กรอกรหัสผ่านอีกครั้งเพื่อยืนยัน",
- "errors": {
- "empty": "กรุณากรอกรหัสผ่านอีกครั้งเพื่อยืนยัน (ช่วยลดข้อผิดพลาดจากการพิมพ์ผิด)",
- "different": "รหัสผ่านที่กรอกไม่ตรงกัน อาจมีตัวใดตัวหนึ่งพิมพ์ผิด"
- }
+ "ignoreTls": {
+ "description": "กำหนดค่าการตรวจสอบใบรับรอง TLS/SSL สำหรับการเชื่อมต่อ HTTPS",
+ "option": {
+ "tls": {
+ "label": "ข้ามข้อผิดพลาด TLS/SSL"
+ }
+ },
+ "title": "ตั้งค่า TLS/SSL"
},
- "firstName": {
- "label": "ชื่อ",
- "placeholder": "Brownyroll",
- "errors": {
- "empty": "กรุณากรอกชื่อของคุณ",
- "length": "ชื่อต้องมีความยาวไม่เกิน 50 ตัวอักษร",
- "pattern": "ชื่อต้องประกอบด้วยตัวอักษร ช่องว่าง เครื่องหมาย ' หรือ - เท่านั้น"
+ "incidents": {
+ "description": "ใช้หน้าต่างเลื่อนเพื่อกำหนดว่ามอนิเตอร์ล่มเมื่อใด สถานะของมอนิเตอร์จะเปลี่ยนเมื่อเปอร์เซ็นต์การตรวจสอบในหน้าต่างเลื่อนตรงตามค่าที่กำหนด",
+ "option": {
+ "checks": {
+ "label": "จำนวนการตรวจสอบในหน้าต่างเลื่อน"
+ },
+ "percentage": {
+ "label": "เปอร์เซ็นต์การตรวจสอบในหน้าต่างเลื่อนที่ล้มเหลว/สำเร็จก่อนเปลี่ยนสถานะมอนิเตอร์?"
+ }
+ },
+ "title": "เหตุการณ์"
+ },
+ "notifications": {
+ "description": "เลือกช่องทางการแจ้งเตือนที่คุณต้องการใช้",
+ "title": "การแจ้งเตือน"
+ },
+ "type": {
+ "description": "เลือกประเภทการตรวจสอบที่ต้องการ",
+ "optionDockerDescription": "ใช้ Docker เพื่อตรวจสอบว่าคอนเทนเนอร์กำลังทำงานอยู่",
+ "optionGameDescription": "ตรวจสอบว่าเซิร์ฟเวอร์เกมเฉพาะออนไลน์อยู่หรือไม่",
+ "optionGrpcDescription": "ตรวจสอบบริการ gRPC โดยใช้ Health Checking Protocol มาตรฐาน",
+ "optionWebSocketDescription": "ตรวจสอบ WebSocket endpoint สำหรับสุขภาพการเชื่อมต่อและเวลาตอบสนอง",
+ "optionHttpDescription": "ใช้ HTTP(S) เพื่อตรวจสอบเว็บไซต์หรือ API endpoint",
+ "optionPingDescription": "ใช้ ICMP Ping เพื่อตรวจสอบว่าเซิร์ฟเวอร์ออนไลน์อยู่หรือไม่",
+ "optionPortDescription": "ตรวจสอบว่าพอร์ตเฉพาะบนเซิร์ฟเวอร์เปิดอยู่หรือไม่",
+ "title": "ประเภท"
+ },
+ "thresholds": {
+ "title": "เกณฑ์การแจ้งเตือน",
+ "description": "กำหนดเกณฑ์ที่ควรทริกเกอร์การแจ้งเตือนสำหรับมอนิเตอร์ฮาร์ดแวร์นี้",
+ "option": {
+ "cpuThreshold": {
+ "label": "เกณฑ์แจ้งเตือน CPU (%)"
+ },
+ "memoryThreshold": {
+ "label": "เกณฑ์แจ้งเตือนหน่วยความจำ (%)"
+ },
+ "diskThreshold": {
+ "label": "เกณฑ์แจ้งเตือนดิสก์ (%)"
+ },
+ "tempThreshold": {
+ "label": "เกณฑ์แจ้งเตือนอุณหภูมิ (°C)"
+ }
}
},
- "lastName": {
- "label": "นามสกุล",
- "placeholder": ".",
- "errors": {
- "empty": "กรุณากรอกนามสกุลของคุณ",
- "length": "นามสกุลต้องมีความยาวไม่เกิน 50 ตัวอักษร",
- "pattern": "นามสกุลต้องประกอบด้วยตัวอักษร ช่องว่าง เครื่องหมาย ' หรือ - เท่านั้น"
+ "geoChecks": {
+ "title": "การตรวจสอบแบบกระจายทางภูมิศาสตร์",
+ "description": "เรียกใช้การตรวจสอบจากหลายตำแหน่งทางภูมิศาสตร์เพื่อตรวจสอบความพร้อมใช้งานและประสิทธิภาพทั่วโลก",
+ "option": {
+ "enabled": {
+ "label": "เปิดใช้งานการตรวจสอบแบบกระจายทางภูมิศาสตร์"
+ },
+ "locations": {
+ "label": "ตำแหน่ง",
+ "placeholder": "เลือกตำแหน่ง",
+ "options": {
+ "EU": "ยุโรป",
+ "NA": "อเมริกาเหนือ",
+ "AS": "เอเชีย",
+ "SA": "อเมริกาใต้",
+ "AF": "แอฟริกา",
+ "OC": "โอเชียเนีย"
+ }
+ },
+ "interval": {
+ "label": "ช่วงเวลาตรวจสอบ",
+ "value": {
+ "fiveMinutes": "5 นาที",
+ "tenMinutes": "10 นาที",
+ "fifteenMinutes": "15 นาที",
+ "thirtyMinutes": "30 นาที"
+ }
+ }
}
- }
- },
- "errors": {
- "validation": "เกิดข้อผิดพลาดในการตรวจสอบข้อมูล"
- },
- "fields": {
- "password": {
- "errors": {
- "incorrect": "รหัสผ่านที่คุณป้อนไม่ตรงกับข้อมูลของเรา"
+ },
+ "url": {
+ "title": "แสดง IP/URL ของมอนิเตอร์บนหน้าสถานะ",
+ "description": "แสดง IP หรือ URL ของมอนิเตอร์บนหน้าสถานะสาธารณะ หากปิดใช้งาน จะแสดงเฉพาะชื่อมอนิเตอร์เพื่อปกป้องข้อมูลที่ละเอียดอ่อน",
+ "option": {
+ "showURL": {
+ "label": "แสดง IP/URL บนหน้าสถานะ",
+ "enabled": "เปิดใช้งาน",
+ "disabled": "ปิดใช้งาน"
+ }
}
},
- "role": {
- "errors": {
- "min": "ต้องมีอย่างน้อยหนึ่งบทบาท"
+ "stats": {
+ "title": "ประวัติการตรวจสอบ",
+ "description": "ล้างประวัติการตรวจสอบและสถิติทั้งหมดของทีม การกระทำนี้ไม่สามารถย้อนกลับได้",
+ "buttonText": "ล้างสถิติทั้งหมด",
+ "dialog": {
+ "title": "ล้างประวัติการตรวจสอบทั้งหมด?",
+ "description": "การดำเนินการนี้จะลบประวัติการตรวจสอบ สถิติ และข้อมูลการตรวจสอบทั้งหมดของทีมอย่างถาวร ไม่สามารถย้อนกลับได้",
+ "confirm": "ใช่ ล้างสถิติทั้งหมด"
}
}
}
},
- "login": {
- "heading": "เข้าสู่ระบบเพื่อดำเนินการต่อ",
- "subheadings": {
- "stepOne": "กรอกอีเมลของคุณ",
- "stepTwo": "กรอกรหัสผ่านของคุณ"
+ "editUser": {
+ "form": {
+ "roles": {
+ "title": "บทบาท",
+ "description": "กำหนดบทบาทให้กับผู้ใช้ สามารถเลือกได้หลายบทบาท"
+ }
},
- "links": {
- "forgotPassword": "ลืมรหัสผ่าน?",
- "register": "ยังไม่มีบัญชีใช่ไหม?",
- "forgotPasswordLink": "รีเซ็ตรหัสผ่าน",
- "registerLink": "สมัครสมาชิกที่นี่"
+ "dialog": {
+ "removeUser": {
+ "title": "ลบผู้ใช้",
+ "content": "คุณแน่ใจหรือไม่ว่าต้องการลบ {{name}} ออกจากทีม? การกระทำนี้ไม่สามารถย้อนกลับได้"
+ }
+ }
+ },
+ "incidents": {
+ "dialog": {
+ "resolveIncident": {
+ "title": "แก้ไขเหตุการณ์",
+ "option": {
+ "comment": {
+ "label": "ความคิดเห็น (ไม่บังคับ)",
+ "placeholder": "เพิ่มความคิดเห็นเกี่ยวกับการแก้ไข..."
+ }
+ }
+ },
+ "details": {
+ "analysis": "การวิเคราะห์เหตุการณ์",
+ "comment": "ความคิดเห็น:",
+ "detailsLabel": "รายละเอียด",
+ "downtime": "ดาวน์ไทม์:",
+ "message": "ข้อความ:",
+ "monitor": "มอนิเตอร์:",
+ "overview": "ภาพรวม",
+ "resolutionDetails": "รายละเอียดการแก้ไข",
+ "resolutionType": "ประเภท:",
+ "resolutionTypes": {
+ "automatic": "อัตโนมัติ",
+ "manual": "ด้วยตนเอง"
+ },
+ "resolve": "แก้ไขเหตุการณ์",
+ "resolvedAt": "แก้ไขเมื่อ:",
+ "resolvedBy": "แก้ไขโดย:",
+ "startedAt": "เริ่มเมื่อ:",
+ "status": "สถานะ:",
+ "statusCode": "รหัสสถานะ:",
+ "timeline": "ไทม์ไลน์",
+ "title": "รายละเอียดเหตุการณ์",
+ "url": "URL:"
+ }
},
- "toasts": {
- "success": "ยินดีต้อนรับกลับ! คุณเข้าสู่ระบบเรียบร้อยแล้ว",
- "incorrectPassword": "รหัสผ่านไม่ถูกต้อง"
+ "filters": {
+ "allMonitors": "มอนิเตอร์ทั้งหมด",
+ "monitor": "มอนิเตอร์",
+ "resolutionType": "ประเภทการแก้ไข",
+ "resolutionTypes": {
+ "manual": "ด้วยตนเอง",
+ "automatic": "อัตโนมัติ",
+ "all": "ทั้งหมด"
+ }
},
- "errors": {
- "password": {
- "incorrect": "รหัสผ่านที่คุณป้อนไม่ตรงกับข้อมูลของเรา"
+ "summaryCard": {
+ "activeIncidents": {
+ "title": "เหตุการณ์ที่ยังดำเนินอยู่",
+ "active_zero": "ไม่มีเหตุการณ์ที่ยังดำเนินอยู่",
+ "active_one": "{{count}} เหตุการณ์ที่ยังดำเนินอยู่",
+ "active_other": "{{count}} เหตุการณ์ที่ยังดำเนินอยู่"
+ },
+ "incidentStats": {
+ "avgResolutionTime": "เวลาแก้ไขเฉลี่ย",
+ "mostAffectedMonitor": "มอนิเตอร์ที่ได้รับผลกระทบมากที่สุด",
+ "title": "สถิติเหตุการณ์",
+ "totalIncidents": "เหตุการณ์ทั้งหมด"
+ },
+ "latestIncidents": {
+ "title": "เหตุการณ์ล่าสุด"
}
},
- "welcome": "ยินดีต้อนรับกลับสู่ Checkmate!"
+ "table": {
+ "actions": {
+ "details": "รายละเอียด",
+ "goToMonitor": "ไปยังมอนิเตอร์",
+ "resolveManually": "แก้ไขด้วยตนเอง"
+ },
+ "activeIncidents": "เหตุการณ์ที่ยังดำเนินอยู่",
+ "headers": {
+ "endTime": "เวลาสิ้นสุด",
+ "resolutionType": "ประเภทการแก้ไข",
+ "startTime": "เวลาเริ่มต้น",
+ "statusCode": "รหัสสถานะ"
+ },
+ "resolvedIncidents": "เหตุการณ์ที่แก้ไขแล้ว",
+ "status": {
+ "active": "ใช้งานอยู่",
+ "resolved": "แก้ไขแล้ว"
+ }
+ }
},
- "registration": {
- "heading": {
- "superAdmin": "สร้าง Super Admin",
- "user": "สมัครสมาชิก"
- },
- "subheadings": {
- "stepOne": "กรอกรายละเอียดส่วนตัวของคุณ",
- "stepTwo": "กรอกอีเมลของคุณ",
- "stepThree": "สร้างรหัสผ่านของคุณ"
+ "infrastructure": {
+ "charts": {
+ "labels": {
+ "cpu": "การใช้งาน CPU",
+ "disk": "การใช้งานดิสก์",
+ "memory": "การใช้งานหน่วยความจำ",
+ "netBytesRecv": "{{name}} - ไบต์ที่รับ",
+ "netBytesSent": "{{name}} - ไบต์ที่ส่ง",
+ "temp": "อุณหภูมิ"
+ }
},
- "description": {
- "superAdmin": "สร้างบัญชี Super Admin เพื่อเริ่มต้นใช้งาน",
- "user": "สมัครสมาชิกผู้ใช้และขอสิทธิ์เข้าถึงมอนิเตอร์จาก Super Admin"
+ "gauges": {
+ "cpu": {
+ "lowerLabel": "ความถี่สูงสุด",
+ "title": "การใช้งาน CPU",
+ "upperLabel": "ความถี่ปัจจ��บัน"
+ },
+ "disk": {
+ "lowerLabel": "ว่าง",
+ "title": "การใช้งานดิสก์ {{idx}}",
+ "upperLabel": "ใช้แล้ว"
+ },
+ "memory": {
+ "lowerLabel": "ว่าง",
+ "title": "การใช้งานหน่วยความจำ",
+ "upperLabel": "ใช้แล้ว"
+ }
},
- "gettingStartedButton": {
- "superAdmin": "สร้างบัญชี Super Admin",
- "user": "สมัครสมาชิกผู้ใช้ทั่วไป"
+ "statBoxes": {
+ "avgCpuTemperature": "อุณหภูมิเฉลี่ยของซีพียู",
+ "cpuFrequency": "ความถี่ของ CPU",
+ "cpuLogical": "ซีพียู (คอร์เสมือน)",
+ "cpuPhysical": "ซีพียู (คอร์หลัก)",
+ "disk": "ดิสก์",
+ "memory": "หน่วยความจำ",
+ "os": "ระบบปฏิบัติการ"
},
- "termsAndPolicies": "การสร้างบัญชีถือว่าคุณยอมรับ ข้อกำหนดการให้บริการ และ นโยบายความเป็นส่วนตัว ของเรา",
- "links": {
- "login": "มีบัญชีแล้ว? เข้าสู่ระบบ"
+ "table": {
+ "headers": {
+ "cpu": "CPU",
+ "disk": "ดิสก์",
+ "memory": "หน่วยความจำ"
+ }
},
- "toasts": {
- "success": "ยินดีต้อนรับ! สร้างบัญชีเรียบร้อยแล้ว"
+ "tabs": {
+ "labels": {
+ "network": "เน็ตเวอร์",
+ "overview": "ภาพรวม"
+ }
},
- "welcome": "ยินดีต้อนรับสู่ Checkmate!"
+ "fallback": {
+ "actionButton": "สร้างมอนิเตอร์!",
+ "checks": "Track the performance of your servers,Identify bottlenecks and optimize usage,Ensure reliability with real-time monitoring",
+ "title": "มอนิเตอร์โครงสร้างพื้นฐานใช้เพื่อ:"
+ }
},
- "forgotPassword": {
- "heading": "ลืมรหัสผ่าน?",
- "subheadings": {
- "stepOne": "ไม่ต้องกังวล เราจะส่งคำแนะนำเพื่อรีเซ็ตรหัสผ่านให้คุณ",
- "stepTwo": "เราได้ส่งลิงก์รีเซ็ตรหัสผ่านไปยัง ",
- "stepThree": "รหัสผ่านใหม่ต้องแตกต่างจากรหัสผ่านที่ใช้ก่อนหน้านี้",
- "stepFour": "รีเซ็ตรหัสผ่านเรียบร้อยแล้ว คลิกด้านล่างเพื่อเข้าสู่ระบบทันที"
+ "logs": {
+ "tabs": {
+ "diagnostics": "วินิจฉัย",
+ "logs": "Logs เซิร์ฟเวอร์",
+ "queue": "คิวงาน"
},
- "buttons": {
- "openEmail": "เปิดแอปอีเมล",
- "resetPassword": "รีเซ็ตรหัสผ่าน"
+ "logLevelSelect": {
+ "label": "ระดับบันทึก"
},
- "imageAlts": {
- "passwordKey": "",
- "email": "",
- "lock": "",
- "passwordConfirm": ""
+ "jobQueue": "คิวงาน",
+ "failedJobs": "งานที่ล้มเหลว",
+ "noLogs": "ไม่พบบันทึก",
+ "metrics": {
+ "jobs": "งาน",
+ "activeJobs": "งานที่กำลังดำเนินการ",
+ "failingJobs": "งานที่ล้มเหลว",
+ "totalRuns": "จำนวนรันทั้งหมด",
+ "totalFailures": "จำนวนล้มเหลวทั้งหมด"
},
- "links": {
- "login": "กลับไปที่ เข้าสู่ระบบ",
- "resend": "ไม่ได้รับอีเมล? คลิกเพื่อส่งอีกครั้ง"
+ "diagnostics": {
+ "stats": {
+ "eventLoopDelay": "ดีเลย์ของ Event loop",
+ "uptime": "อัปไทม์",
+ "usedHeapSize": "ขนาด heap ที่ใช้",
+ "totalHeapSize": "ขนาด heap ทั้งหมด",
+ "osMemoryLimit": "ขีดจำกัดหน่วยความจำ OS"
+ },
+ "gauges": {
+ "heapAllocation": "การจัดสรร Heap",
+ "heapUsage": "การใช้งาน Heap",
+ "heapUtilization": "การใช้ประโยชน์ Heap",
+ "instantCpuUsage": "การใช้งาน CPU ขณะนี้",
+ "availableMemoryPercentage": "% ของหน่วยความจำที่มี",
+ "allocatedPercentage": "% ที่จัดสรร",
+ "usedSPercentage": "% ของ 1 วินาทีที่ CPU ใช้",
+ "total": "ทั้งหมด",
+ "used": "ใช้แล้ว"
+ }
},
- "toasts": {
- "sent": "คำแนะนำถูกส่งไปยัง .",
- "emailNotFound": "ไม่พบอีเมลนี้",
- "redirect": "กำลังเปลี่ยนหน้าใน ...",
- "success": "รีเซ็ตรหัสผ่านสำเร็จแล้ว",
- "error": "ไม่สามารถรีเซ็ตรหัสผ่านได้ กรุณาลองอีกครั้งภายหลังหรือติดต่อฝ่ายสนับสนุน"
+ "table": {
+ "headers": {
+ "timestamp": "เวลา",
+ "level": "ระดับ",
+ "service": "บริการ",
+ "method": "เมธอด",
+ "monitorId": "รหัสมอนิเตอร์",
+ "runCount": "จำนวนรัน",
+ "failCount": "จำนวนล้มเหลว",
+ "lastRunAt": "รันล่าสุดเมื่อ",
+ "lockedAt": "ล็อกเมื่อ",
+ "lastFinishedAt": "เสร็จสิ้นล่าสุดเมื่อ",
+ "lastRunTook": "รันล่าสุดใช้เวลา",
+ "lastFailedAt": "ล้มเหลวล่าสุดเมื่อ",
+ "failReason": "สาเหตุที่ล้มเหลว"
+ }
}
- }
- },
- "errorPages": {
- "serverUnreachable": {
- "toasts": {
- "reconnected": "เชื่อมต่อกับเซิร์ฟเวอร์สำเร็จแล้ว",
- "stillUnreachable": "เซิร์ฟเวอร์ยังไม่สามารถเข้าถึงได้ กรุณาลองอีกครั้งภายหลัง"
+ },
+ "maintenanceWindow": {
+ "fallback": {
+ "actionButton": "สร้างช่วงเวลาบำรุงรักษา!",
+ "checks": "Mark your maintenance periods,Eliminate any misunderstandings,Stop sending alerts in maintenance windows",
+ "title": "ช่วงเวลาบำรุงรักษาใช้เพื่อ:"
+ },
+ "table": {
+ "headers": {
+ "nextWindow": "ช่วงเวลาถัดไป",
+ "repeat": "ทำซ้ำ"
+ }
},
- "alertBox": "เกิดข้อผิดพลาดการเชื่อมต่อเซิร์ฟเวอร์",
- "description": "ไม่สามารถเชื่อมต่อกับเซิร์ฟเวอร์ได้ กรุณาตรวจสอบการเชื่อมต่ออินเทอร์เน็ตของคุณหรือยืนยันการตั้งค่า deployment หากปัญหายังคงอยู่",
- "retryButton": {
- "default": "ลองเชื่อมต่ออีกครั้ง",
- "processing": "กำลังเชื่อมต่อ…"
+ "form": {
+ "general": {
+ "title": "ตั้งค่าทั่วไป",
+ "description": "ตั้งชื่อและตัวเลือกการทำซ้ำสำหรับช่วงเวลาบำรุงรักษา",
+ "option": {
+ "name": {
+ "label": "ชื่อ",
+ "placeholder": "เช่น บำรุงรักษาประจำสัปดาห์"
+ },
+ "repeat": {
+ "label": "ทำซ้ำ"
+ }
+ }
+ },
+ "startDate": {
+ "title": "วันที่เริ่มต้น",
+ "description": "เลือกวันที่เริ่มต้นสำหรับช่วงเวลาบำรุงรักษา",
+ "option": {
+ "startDate": {
+ "label": "วันที่เริ่มต้น"
+ }
+ }
+ },
+ "startTime": {
+ "title": "เวลาเริ่มต้น",
+ "description": "ตั้งเวลาเริ่มต้นและระยะเวลาสำหรับช่วงเวลาบำรุงรักษา ค่าทั้งหมดเป็น UTC",
+ "option": {
+ "duration": {
+ "label": "ระยะเวลา"
+ },
+ "startTime": {
+ "label": "เวลาเริ่มต้น"
+ }
+ },
+ "monitors": {
+ "title": "มอนิเตอร์",
+ "description": "มอนิเตอร์ที่ช่วงเวลาบำรุงรักษาควรใช้งาน",
+ "option": {
+ "addMonitors": {
+ "label": "เพิ่มมอนิเตอร์"
+ }
+ }
+ }
+ }
}
- }
- },
- "createNotifications": {
- "title": "สร้างช่องทางแจ้งเตือน",
- "nameSettings": {
- "title": "ชื่อ",
- "description": "ชื่อที่บ่งบอกถึงการตั้งค่าการรวมระบบของคุณ",
- "nameLabel": "ชื่อ",
- "namePlaceholder": "เช่น การแจ้งเตือนผ่าน Slack"
- },
- "typeSettings": {
- "title": "ประเภท",
- "description": "เลือกประเภทของช่องทางแจ้งเตือนที่คุณต้องการสร้าง",
- "typeLabel": "ประเภท"
- },
- "emailSettings": {
- "title": "อีเมล",
- "description": "ที่อยู่อีเมลปลายทาง",
- "emailLabel": "อีเมล",
- "emailPlaceholder": "e.g. john@example.com"
- },
- "slackSettings": {
- "title": "Slack",
- "description": "ตั้งค่า Slack webhook ของคุณที่นี่",
- "webhookLabel": "URL ของ Slack webhook",
- "webhookPlaceholder": "https://hooks.slack.com/services/..."
- },
- "pagerdutySettings": {
- "title": "PagerDuty",
- "description": "ตั้งค่าการรวมระบบ PagerDuty ของคุณที่นี่",
- "integrationKeyLabel": "คีย์การรวมระบบ",
- "integrationKeyPlaceholder": "1234567890"
- },
- "discordSettings": {
- "title": "Discord",
- "description": "ตั้งค่า Discord webhook ของคุณที่นี่",
- "webhookLabel": "URL ของ Discord Webhook",
- "webhookPlaceholder": "https://your-server.com/webhook"
- },
- "webhookSettings": {
- "title": "Webhook",
- "description": "ตั้งค่า webhook ของคุณที่นี่",
- "webhookLabel": "Webhook URL",
- "webhookPlaceholder": "https://your-server.com/webhook"
- },
- "testNotification": "ทดสอบการแจ้งเตือน",
- "dialogDeleteTitle": "คุณแน่ใจหรือไม่ว่าต้องการลบการแจ้งเตือนนี้?",
- "dialogDeleteConfirm": "ลบ"
- },
- "notificationConfig": {
- "title": "การแจ้งเตือน",
- "description": "เลือกช่องทางแจ้งเตือนที่คุณต้องการใช้"
- },
- "monitorStatus": {
- "checkingEvery": "ตรวจสอบทุก {{interval}}",
- "withCaptureAgent": "โดยใช้ Capture agent {{version}}",
- "up": "ออนไลน์",
- "down": "ออฟไลน์",
- "paused": "หยุดชั่วคราว"
- },
- "advancedMatching": "การจับคู่ขั้นสูง",
- "sendTestNotifications": "ส่งการแจ้งเตือนทดสอบ",
- "selectAll": "Select all",
- "showAdminLoginLink": "แสดงลิงก์ \"ผู้ดูแลระบบ? เข้าสู่ระบบที่นี่\" บนหน้าสถานะ",
- "logsPage": {
- "title": "Logs",
- "description": "ระบบ Logs 1000 บรรทัดล่าสุด",
- "tabs": {
- "queue": "คิวงาน",
- "logs": "Logs เซิร์ฟเวอร์",
- "diagnostics": "วินิจฉัย"
- },
- "toast": {
- "fetchLogsSuccess": "ดึง Logs สำเร็จแล้ว"
},
- "logLevelSelect": {
- "title": "Logs level",
- "values": {
- "all": "All",
- "info": "Info",
- "warn": "Warn",
- "error": "Error",
- "debug": "Debug"
+ "notifications": {
+ "fallback": {
+ "actionButton": "สร้างช่องทาง",
+ "checks": "Alert teams about downtime or performance issues,Let engineers know when incidents happen,Keep administrators informed of system changes",
+ "title": "ช่องทางการแจ้งเตือนใช้เพื่อ:"
+ },
+ "form": {
+ "accessToken": {
+ "optionAccessToken": "โทเค็นการเข้าถึง",
+ "placeholder": "syt_YWxleF9ob2xsaWRheQ_VmtScmV0U2VjcmV0S2V5_abc123"
+ },
+ "address": {
+ "description": "ที่อยู่ที่จะส่งการแจ้งเตือน",
+ "optionAddress": "ที่อยู่",
+ "placeholderEmail": "example@example.com",
+ "placeholderWebhook": "https://your-server.com/webhook",
+ "title": "ที่อยู่"
+ },
+ "homeServer": {
+ "optionHomeServer": "โฮมเซิร์ฟเวอร์",
+ "placeholder": "example.com"
+ },
+ "matrix": {
+ "description": "กำหนดค่าการเชื่อมต่อ Matrix homeserver สำหรับการแจ้งเตือน",
+ "title": "ตั้งค่า Matrix"
+ },
+ "notificationName": {
+ "description": "ชื่อที่สื่อความหมายสำหรับช่องทางการแจ้งเตือน",
+ "optionName": "ชื่อช่องทาง",
+ "placeholder": "เช่น การแจ้งเตือน Production",
+ "title": "ชื่อช่องทาง"
+ },
+ "pagerDuty": {
+ "description": "คีย์การรวม PagerDuty สำหรับรับการแจ้งเตือน",
+ "optionIntegrationKey": "คีย์การรวม",
+ "placeholder": "a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6",
+ "title": "คีย์การรวม"
+ },
+ "roomId": {
+ "optionRoomId": "รหัสห้อง",
+ "placeholder": "!abcdefg:matrix.org"
+ },
+ "type": {
+ "description": "เลือกประเภทช่องทางการแจ้งเตือนที่ต้องการสร้าง",
+ "optionType": "ประเภท",
+ "title": "ประเภทช่องทาง"
+ },
+ "telegram": {
+ "title": "ตั้งค่า Telegram",
+ "description": "เพื่อเปิดใช้งานการแจ้งเตือนผ่าน Telegram ให้สร้างบอท Telegram โดยใช้ BotFather ซึ่งเป็นบอททางการสำหรับสร้างและจัดการบอท Telegram จากนั้นนำ API token และ Chat ID มาใส่ที่นี่",
+ "optionBotToken": "โทเค็นบอท",
+ "placeholderBotToken": "123456789:ABCdefGhIJKlmNoPQRsTUVwxyZ",
+ "optionChatId": "Chat ID",
+ "placeholderChatId": "-1001234567890"
+ }
+ },
+ "table": {
+ "headers": {
+ "destination": "ปลายทาง"
+ }
}
- }
- },
- "queuePage": {
- "title": "Queue",
- "refreshButton": "Refresh",
- "flushButton": "Flush queue",
- "jobTable": {
- "title": "งานที่อยู่ในคิวปัจจุบัน",
- "idHeader": "รหัสมอนิเตอร์",
- "urlHeader": "URL",
- "typeHeader": "Type",
- "activeHeader": "ใช้งานอยู่",
- "lockedAtHeader": "ล็อกเมื่อ",
- "runCountHeader": "จำนวนรัน",
- "failCountHeader": "จำนวนล้มเหลว",
- "lastRunHeader": "รันล่าสุดเมื่อ",
- "lastFinishedAtHeader": "เสร็จสิ้นล่าสุดเมื่อ",
- "lastRunTookHeader": "รันครั้งล่าสุดใช้เวลา",
- "intervalHeader": "ช่วงเวลา"
- },
- "metricsTable": {
- "title": "คิวเมตริก",
- "metricHeader": "เมตริก",
- "valueHeader": "Value"
- },
- "failedJobTable": {
- "title": "งานที่ล้มเหลว",
- "monitorIdHeader": "รหัสมอนิเตอร์",
- "monitorUrlHeader": "URL มอนิเตอร์",
- "failCountHeader": "จำนวนล้มเหลว",
- "failedAtHeader": "ล้มเหลวล่าสุดเมื่อ",
- "failReasonHeader": "สาเหตุที่ล้มเหลว"
- }
- },
- "export": {
- "title": "ส่งออกมอนิเตอร์",
- "success": "ส่งออกมอนิเตอร์สำเร็จแล้ว",
- "failed": "ไม่สามารถส่งออกมอนิเตอร์ได้"
- },
- "monitorActions": {
- "title": "ส่งออก/นำเข้า",
- "import": "นำเข้ามอนิเตอร์",
- "export": "ส่งออกมอนิเตอร์",
- "deleteSuccess": "ลบมอนิเตอร์สำเร็จ",
- "deleteFailed": "ลบมอนิเตอร์ล้มเหลว",
- "details": "รายละเอียด"
- },
- "settingsPage": {
- "aboutSettings": {
- "labelDevelopedBy": "พัฒนาโดย Bluewave Labs",
- "labelVersion": "เวอร์ชัน",
- "title": "เกี่ยวกับ"
- },
- "demoMonitorsSettings": {
- "buttonAddMonitors": "เพิ่มมอนิเตอร์ตัวอย่าง",
- "description": "เพิ่มมอนิเตอร์ตัวอย่างเพื่อการสาธิต",
- "title": "มอนิเตอร์สาธิต"
},
- "emailSettings": {
- "buttonSendTestEmail": "ส่งอีเมลทดสอบ",
- "description": "ตั้งค่าอีเมลสำหรับระบบของคุณ ใช้สำหรับส่งการแจ้งเตือนและเตือนภัย",
- "descriptionTransport": "สร้าง SMTP transport สำหรับ NodeMailer",
- "labelAddress": "ที่อยู่อีเมล - ใช้สำหรับการยืนยันตัวตน",
- "labelConnectionHost": "โฮสต์เชื่อมต่ออีเมล - ชื่อโฮสต์ที่ใช้ในคำทักทาย HELO/EHLO",
- "labelHost": "โฮสต์อีเมล - ชื่อโฮสต์หรือ IP สำหรับเชื่อมต่อ",
- "labelIgnoreTLS": "ปิดใช้งาน STARTTLS: ไม่ใช้ TLS แม้เซิร์ฟเวอร์รองรับ",
- "labelPassword": "รหัสผ่านอีเมล - สำหรับยืนยันตัวตน",
- "labelPasswordSet": "ตั้งรหัสผ่านเรียบร้อยแล้ว คลิก รีเซ็ต เพื่อเปลี่ยน",
- "labelPool": "เปิดใช้ connection pooling: ใช้การเชื่อมต่อเดิมซ้ำเพื่อเพิ่มประสิทธิภาพ",
- "labelPort": "พอร์ตอีเมล - พอร์ตสำหรับเชื่อมต่อ",
- "labelRejectUnauthorized": "ปฏิเสธใบรับรองไม่ถูกต้อง: ปฏิเสธการเชื่อมต่อที่ใช้ใบรับรอง self-signed หรือไม่เชื่อถือ",
- "labelRequireTLS": "บังคับ STARTTLS: ต้องการอัปเกรด TLS ล้มเหลวหากไม่รองรับ",
- "labelSecure": "ใช้ SSL (แนะนำ): เข้ารหัสการเชื่อมต่อด้วย SSL/TLS",
- "labelTLSServername": "ชื่อเซิร์ฟเวอร์ TLS - ชื่อโฮสต์เสริมสำหรับตรวจสอบ TLS เมื่อโฮสต์เป็น IP",
- "labelUser": "ผู้ใช้อีเมล - ชื่อผู้ใช้สำหรับยืนยันตัวตน ใช้แทนที่อีเมลถ้ามีการระบุ",
- "linkTransport": "ดูข้อกำหนดที่นี่",
- "placeholderUser": "ปล่อยว่างหากไม่จำเป็น",
- "title": "อีเมล",
- "toastEmailRequiredFieldsError": "ต้องระบุอีเมล, โฮสต์, พอร์ต และรหัสผ่าน"
- },
- "pageSpeedSettings": {
- "description": "ใส่ Google PageSpeed API Key ของคุณเพื่อเปิดใช้งานการตรวจสอบ PageSpeed ของ Google คลิก รีเซ็ต เพื่ออัปเดต Key",
- "labelApiKeySet": "ตั้งค่า API key แล้ว คลิก รีเซ็ต เพื่อเปลี่ยน",
- "labelApiKey": "PageSpeed API key",
- "title": "Google PageSpeed API key"
- },
- "saveButtonLabel": "บันทึก",
- "statsSettings": {
- "clearAllStatsButton": "ล้างสถิติทั้งหมด",
- "clearAllStatsDescription": "ล้างสถิติทั้งหมด การกระทำนี้ไม่สามารถย้อนกลับได้",
- "clearAllStatsDialogConfirm": "ใช่ ล้างสถิติทั้งหมด",
- "clearAllStatsDialogDescription": "เมื่อถูกลบแล้ว ประวัติการตรวจสอบและสถิติไม่สามารถกู้คืนได้",
- "clearAllStatsDialogTitle": "คุณต้องการล้างสถิติทั้งหมดหรือไม่?",
- "description": "กำหนดระยะเวลาที่ต้องการเก็บข้อมูลประวัติ คุณยังสามารถล้างข้อมูลทั้งหมดที่มีอยู่ได้",
- "labelTTL": "จำนวนวันที่ต้องการเก็บประวัติการตรวจสอบ",
- "labelTTLOptional": "0 หมายถึงไม่จำกัด",
- "title": "ประวัติการตรวจสอบ"
- },
- "systemResetSettings": {
- "buttonRemoveAllMonitors": "ลบมอนิเตอร์ทั้งหมด",
- "description": "ลบมอนิเตอร์ทั้งหมดออกจากระบบของคุณ",
- "dialogConfirm": "ใช่ ลบมอนิเตอร์ทั้งหมด",
- "dialogDescription": "เมื่อถูกลบแล้ว มอนิเตอร์ไม่สามารถกู้คืนได้",
- "dialogTitle": "คุณต้องการลบมอนิเตอร์ทั้งหมดหรือไม่?",
- "title": "รีเซ็ตระบบ"
- },
- "timezoneSettings": {
- "description": "เลือกโซนเวลาที่ใช้แสดงวันที่และเวลาในแอปทั้งหมด",
- "label": "โซนเวลาที่แสดง",
- "title": "โซนเวลาที่แสดง"
- },
- "title": "การตั้งค่า",
- "uiSettings": {
- "description": "สลับโหมดสว่าง/มืด หรือเปลี่ยนภาษาอินเทอร์เฟซผู้ใช้",
- "labelLanguage": "ภาษา",
- "labelTheme": "โหมดธีม",
- "title": "รูปลักษณ์"
- },
- "urlSettings": {
- "description": "แสดง IP/URL ของมอนิเตอร์บนหน้าสถานะสาธารณะ หากปิดใช้งาน จะแสดงเฉพาะชื่อมอนิเตอร์เพื่อป้องกันข้อมูลสำคัญ",
- "label": "แสดง IP/URL บนหน้าสถานะ",
- "selectDisabled": "ปิดใช้งาน",
- "selectEnabled": "เปิดใช้งาน",
- "title": "IP/URL ของมอนิเตอร์บนหน้าสถานะ"
- },
- "globalThresholds": {
- "title": "เกณฑ์การตรวจสอบแบบรวม",
- "description": "กำหนดค่าเกณฑ์ของ CPU, หน่วยความจำ, ดิสก์ และอุณหภูมิ หากระบุค่าไว้ ระบบจะเปิดใช้งานการตรวจสอบโดยอัตโนมัติ"
- }
- },
- "statusPageCreate": {
- "buttonSave": "บันทึก"
- },
- "incidentsOptionsHeaderFilterResolved": "แก้ไขแล้ว",
- "settingsSave": "บันทึก",
- "statusPageCreateAppearanceTitle": "รูปลักษณ์",
- "confirmPassword": "ยืนยันรหัสผ่าน",
- "monitorHooks": {
- "failureAddDemoMonitors": "ไม่สามารถเพิ่มมอนิเตอร์ตัวอย่างได้",
- "successAddDemoMonitors": "เพิ่มมอนิเตอร์ตัวอย่างสำเร็จ"
- },
- "settingsAppearance": "รูปลักษณ์",
- "settingsDisplayTimezone": "โซนเวลาที่แสดง",
- "settingsGeneralSettings": "การตั้งค่าทั่วไป",
- "incidentsOptionsHeaderTotalIncidents": "จำนวนเหตุการณ์ทั้งหมด",
- "statusPage": {
- "deleteSuccess": "ลบหน้าสถานะสำเร็จ",
- "deleteFailed": "ลบหน้าสถานะล้มเหลว",
- "createSuccess": "สร้างหน้าสถานะสำเร็จ",
- "updateSuccess": "อัปเดตหน้าสถานะสำเร็จ",
- "generalSettings": "การตั้งค่าทั่วไป",
- "contents": "เนื้อหา",
- "fallback": {
- "checks": [
- "ตรวจสอบและแสดงสุขภาพของบริการแบบเรียลไทม์",
- "ติดตามหลายบริการและแชร์สถานะ",
- "แจ้งผู้ใช้ให้ทราบเกี่ยวกับการหยุดทำงานและประสิทธิภาพ"
- ],
- "title": "หน้าสถานะใช้สำหรับ:",
- "actionButton": "มาสร้างหน้าสถานะแรกกันเถอะ!"
- }
- },
- "testNotificationsDisabled": "ยังไม่มีการตั้งค่าการแจ้งเตือนสำหรับมอนิเตอร์นี้ คุณต้องเพิ่มโดยคลิกปุ่ม 'ตั้งค่า'",
- "incidentsTableResolvedAt": "แก้ไขเมื่อ",
- "incidentsTableActionResolve": "แก้ไข",
- "checkHooks": {
- "failureResolveOne": "แก้ไขเหตุการณ์ล้มเหลว",
- "failureResolveAll": "แก้ไขเหตุการณ์ทั้งหมดล้มเหลว",
- "failureResolveMonitor": "ไม่สามารถแก้ไขเหตุการณ์ของตัวตรวจสอบได้"
- },
- "checkFormError": "กรุณาตรวจสอบแบบฟอร์มสำหรับข้อผิดพลาด",
- "diagnosticsPage": {
- "diagnosticDescription": "วินิจฉัยระบบ",
- "statsDescription": "สถิติระบบ",
- "gauges": {
- "heapAllocationTitle": "การจัดสรร Heap",
- "heapAllocationSubtitle": "% ของหน่วยความจำที่ใช้ได้",
- "heapUsageTitle": "การใช้งาน Heap",
- "heapUsageSubtitle": "% ของหน่วยความจำที่ใช้ได้",
- "heapUtilizationTitle": "การใช้งาน Heap",
- "heapUtilizationSubtitle": "% ของที่จัดสรรแล้ว",
- "instantCpuUsageTitle": "การใช้งาน CPU ทันที",
- "instantCpuUsageSubtitle": "% ของเวลา 1 วินาทีที่ CPU ใช้"
- },
- "stats": {
- "eventLoopDelayTitle": "ความล่าช้าวงจร Event Loop",
- "uptimeTitle": "เวลาทำงาน",
- "usedHeapSizeTitle": "ขนาดที่ใช้ Heap",
- "totalHeapSizeTitle": "รวมขนาด Heap",
- "osMemoryLimitTitle": "ขีดจำกัดหน่วยความจำ OS"
- }
- },
- "pageSpeedLighthouseAPI": "ใช้ Lighthouse PageSpeed API เพื่อตรวจสอบเว็บไซต์ของคุณ",
- "time": {
- "threeMinutes": "3 นาที",
- "fiveMinutes": "5 นาที",
- "tenMinutes": "10 นาที",
- "twentyMinutes": "20 นาที",
- "oneHour": "1 ชั่วโมง",
- "oneDay": "1 วัน",
- "oneWeek": "1 สัปดาห์",
- "fourMinutes": "4 นาที",
- "oneMinute": "1 นาที",
- "twoMinutes": "2 นาที",
- "fifteenSeconds": "15 วินาที",
- "thirtySeconds": "30 วินาที"
- },
- "general": {
- "noOptionsFound": "ไม่พบ {{unit}}"
- },
- "infrastructureMonitor": {
- "fallback": {
- "checks": [
- "ติดตามประสิทธิภาพของเซิร์ฟเวอร์ของคุณ",
- "ระบุจุดคอขวดและเพิ่มประสิทธิภาพการใช้งาน",
- "มั่นใจในความเสถียรด้วยการตรวจสอบแบบเรียลไทม์"
- ],
- "title": "ตัวตรวจสอบโครงสร้างพื้นฐานใช้สำหรับ:",
- "actionButton": "มาสร้างตัวตรวจสอบโครงสร้างพื้นฐานตัวแรกกันเถอะ!"
- }
- },
- "maintenanceWindow": {
- "fallback": {
- "checks": [
- "กำหนดช่วงเวลาบำรุงรักษา",
- "ลดความเข้าใจผิด",
- "หยุดส่งการแจ้งเตือนในช่วงเวลาบำรุงรักษา"
- ],
- "title": "ช่วงเวลาบำรุงรักษาใช้สำหรับ:",
- "actionButton": "มาสร้างช่วงเวลาบำรุงรักษาแรกกันเถอะ!"
- }
- },
- "pageSpeed": {
- "fallback": {
- "checks": [
- "รายงานเกี่ยวกับประสบการณ์ผู้ใช้ของหน้าเว็บ",
- "ช่วยวิเคราะห์ความเร็วของหน้าเว็บ",
- "ให้คำแนะนำในการปรับปรุงหน้าเว็บ"
- ],
- "title": "ตัวตรวจสอบ PageSpeed ใช้สำหรับ:",
- "actionButton": "มาสร้างตัวตรวจสอบ PageSpeed ตัวแรกกันเถอะ!"
- }
- },
- "uptimeMonitor": {
- "fallback": {
- "checks": [
- "ตรวจสอบว่าเว็บไซต์หรือเซิร์ฟเวอร์ออนไลน์และตอบสนองหรือไม่",
- "แจ้งทีมเมื่อเกิดปัญหาการหยุดทำงานหรือประสิทธิภาพ",
- "ตรวจสอบ HTTP endpoints, ping, คอนเทนเนอร์ และพอร์ต",
- "ติดตามสถิติ uptime และความเสถียรย้อนหลัง"
- ],
- "title": "ตัวตรวจสอบ Uptime ใช้สำหรับ:",
- "actionButton": "มาสร้างตัวตรวจสอบ Uptime ตัวแรกกันเถอะ!"
- }
- },
- "editUserPage": {
- "form": {
- "email": "อีเมล",
- "firstName": "ชื่อจริง",
- "lastName": "นามสกุล",
- "role": "บทบาท",
- "save": "บันทึก"
- },
- "table": {
- "actionHeader": "การดำเนินการ",
- "roleHeader": "บทบาท"
- },
- "title": "แก้ไขผู้ใช้",
- "toast": {
- "successUserUpdate": "อัปเดตผู้ใช้เรียบร้อยแล้ว",
- "validationErrors": "ข้อผิดพลาดในการตรวจสอบข้อมูล"
- }
- },
- "incidentsPageActionResolveMonitor": "แก้ไขเหตุการณ์ของตัวตรวจสอบ",
- "incidentsPageActionResolveAll": "แก้ไขเหตุการณ์ทั้งหมด",
- "matchMethodOptions": {
- "equal": "Equal",
- "equalPlaceholder": "success",
- "include": "Include",
- "includePlaceholder": "ok",
- "regex": "Regex",
- "regexPlaceholder": "^(success|ok)$",
- "text": "วิธีการจับคู่"
- },
- "monitorType": {
- "docker": {
- "label": "ชื่อ/ID คอนเทนเนอร์",
- "namePlaceholder": "คอนเทนเนอร์ของฉัน",
- "placeholder": "my-app or abcd1234"
- },
- "http": {
- "label": "URL ที่ต้องการตรวจสอบ",
- "namePlaceholder": "Google",
- "placeholder": "google.com"
+ "pageSpeed": {
+ "charts": {
+ "common": {
+ "cls": "Cumulative Layout Shift (CLS)",
+ "fcp": "First Contentful Paint (FCP)",
+ "lcp": "Largest Contentful Paint (LCP)",
+ "si": "Speed Index (SI)",
+ "tbt": "Total Blocking Time (TBT)"
+ },
+ "legend": {
+ "title": "รายงาน PageSpeed",
+ "weight": "น้ำหนัก"
+ },
+ "pie": {
+ "title": "รายงานประสิทธิภาพ"
+ }
+ },
+ "table": {
+ "headers": {
+ "pageSpeedScore": "คะแนน PageSpeed"
+ }
+ },
+ "fallback": {
+ "actionButton": "สร้างมอนิเตอร์!",
+ "checks": "Report on the user experience of a page,Help analyze webpage speed,Give suggestions on how the page can be improved",
+ "title": "มอนิเตอร์ PageSpeed ใช้เพื่อ:"
+ }
},
- "ping": {
- "label": "ที่อยู่ IP ที่ต้องการตรวจสอบ",
- "namePlaceholder": "Google",
- "placeholder": "1.1.1.1"
+ "settings": {
+ "form": {
+ "timezone": {
+ "title": "เขตเวลาที่แสดง",
+ "description": "เลือกเขตเวลาที่ใช้แสดงวันที่และเวลาทั่วทั้งแอปพลิเคชัน",
+ "option": {
+ "timezone": {
+ "label": "เขตเวลาที่แสดง"
+ }
+ }
+ },
+ "ui": {
+ "title": "รูปลักษณ์",
+ "description": "สลับระหว่างโหมดสว่างและมืด เปลี่ยนภาษา หรือปรับแต่งประเภทกราฟ",
+ "option": {
+ "theme": {
+ "label": "โหมดธีม",
+ "light": "สว่าง",
+ "dark": "มืด"
+ },
+ "language": {
+ "label": "ภาษา"
+ },
+ "chartType": {
+ "label": "ประเภทกราฟ",
+ "histogram": "ฮิสโตแกรม",
+ "heatmap": "แผนที่ความร้อน"
+ }
+ }
+ },
+ "pagespeed": {
+ "title": "คีย์ API ของ Google PageSpeed",
+ "description": "กรอกคีย์ API ของ Google PageSpeed เพื่อเปิดใช้งานการตรวจสอบ Google PageSpeed คลิกรีเซ็ตเพื่ออัปเดตคีย์",
+ "option": {
+ "apiKey": {
+ "label": "คีย์ API ของ PageSpeed",
+ "labelSet": "ตั้งค่าคีย์ API แล้ว คลิกรีเซ็ตเพื่อเปลี่ยน",
+ "placeholder": "กรอกคีย์ API ของ Google PageSpeed"
+ }
+ }
+ },
+ "url": {
+ "title": "แสดง IP/URL ของมอนิเตอร์บนหน้าสถานะ",
+ "description": "แสดง IP หรือ URL ของมอนิเตอร์บนหน้าสถานะสาธารณะ หากปิดใช้งาน จะแสดงเฉพาะชื่อมอนิเตอร์เพื่อปกป้องข้อมูลที่ละเอียดอ่อน",
+ "option": {
+ "showURL": {
+ "label": "แสดง IP/URL บนหน้าสถานะ",
+ "enabled": "เปิดใช้งาน",
+ "disabled": "ปิดใช้งาน"
+ }
+ }
+ },
+ "stats": {
+ "title": "ประวัติการตรวจสอบ",
+ "description": "ล้างประวัติการตรวจสอบและสถิติทั้งหมดของทีม การกระทำนี้ไม่สามารถย้อนกลับได้",
+ "option": {
+ "clear": {
+ "label": "ล้างสถิติทั้งหมด การกระทำนี้ไม่สามารถย้อนกลับได้"
+ }
+ },
+ "dialog": {
+ "title": "ล้างประวัติการตรวจสอบทั้งหมด?",
+ "description": "ไม่สามารถย้อนกลับได้"
+ }
+ },
+ "retention": {
+ "title": "การเก็บรักษาข้อมูลตรวจสอบ",
+ "description": "กำหนดระยะเวลาเก็บรักษาข้อมูลตรวจสอบก่อนถูกลบอัตโนมัติ",
+ "option": {
+ "days": {
+ "label": "ระยะเวลาเก็บรักษา (วัน)",
+ "unlimited": "ไม่จำกัด"
+ }
+ }
+ },
+ "thresholds": {
+ "title": "เกณฑ์ทั่วไป",
+ "description": "กำหนดเกณฑ์ CPU หน่วยความจำ ดิสก์ และอุณหภูมิทั่วไปสำหรับการตรวจสอบโครงสร้างพื้นฐาน ใช้กับมอนิเตอร์ฮาร์ดแวร์ทั้งหมด เว้นแต่ถูกแทนที่",
+ "option": {
+ "cpu": {
+ "label": "เกณฑ์ CPU (%)",
+ "placeholder": "1 - 100"
+ },
+ "memory": {
+ "label": "เกณฑ์หน่วยความจำ (%)",
+ "placeholder": "1 - 100"
+ },
+ "disk": {
+ "label": "เกณฑ์ดิสก์ (%)",
+ "placeholder": "1 - 100"
+ },
+ "temperature": {
+ "label": "เกณฑ์อุณหภูมิ (°C)",
+ "placeholder": "1 - 150"
+ }
+ }
+ },
+ "email": {
+ "title": "ตั้งค่าอีเมล",
+ "description": "กำหนดค่าอีเมลสำหรับระบบ ใช้สำหรับส่งการแจ้งเตือน",
+ "descriptionTransport": "สร้าง SMTP transport สำหรับ NodeMailer",
+ "descriptionTransportLink": "ดูข้อกำหนดที่นี่",
+ "option": {
+ "host": {
+ "label": "โฮสต์อีเมล - ชื่อโฮสต์หรือ IP ที่จะเชื่อมต่อ",
+ "placeholder": "smtp.gmail.com"
+ },
+ "port": {
+ "label": "พอร์ตอีเมล - พอร์ตที่จะเชื่อมต่อ",
+ "placeholder": "587"
+ },
+ "address": {
+ "label": "ที่อยู่อีเมล - ใช้สำหรับยืนยันตัวตน",
+ "placeholder": "you@example.com"
+ },
+ "user": {
+ "label": "ผู้ใช้อีเมล - ชื่อผู้ใช้สำหรับยืนยันตัวตน แทนที่อีเมลหากระบุ",
+ "placeholder": "เว้นว่างหากไม่จำเป็น"
+ },
+ "password": {
+ "label": "รหัสผ่านอีเมล - รหัสผ่านสำหรับยืนยันตัวตน",
+ "labelSet": "ตั้งค่ารหัสผ่านแล้ว คลิกรีเซ็ตเพื่อเปลี่ยน",
+ "placeholder": "กรอกรหัสผ่านของคุณ"
+ },
+ "tlsServername": {
+ "label": "ชื่อเซิร์ฟเวอร์ TLS - ชื่อโฮสต์สำหรับตรวจสอบ TLS เมื่อโฮสต์เป็น IP (ไม่บังคับ)",
+ "placeholder": "example.com"
+ },
+ "connectionHost": {
+ "label": "โฮสต์เชื่อมต่ออีเมล - ชื่อโฮสต์ที่ใช้ในการ HELO/EHLO",
+ "placeholder": "localhost"
+ },
+ "secure": {
+ "label": "ใช้ SSL (แนะนำ): เข้ารหัสการเชื่อมต่อด้วย SSL/TLS"
+ },
+ "pool": {
+ "label": "เปิดใช้งาน connection pooling: ใช้การเชื่อมต่อที่มีอยู่ซ้ำเพื่อเพิ่มประสิทธิภาพ"
+ },
+ "ignoreTLS": {
+ "label": "ปิดใช้งาน STARTTLS: ไม่ใช้ TLS แม้เซิร์ฟเวอร์จะรองรับ"
+ },
+ "requireTLS": {
+ "label": "บังคับใช้ STARTTLS: ต้องอัปเกรดเป็น TLS ล้มเหลวหากไม่รองรับ"
+ },
+ "rejectUnauthorized": {
+ "label": "ปฏิเสธใบรับรองที่ไม่ถูกต้อง: ปฏิเสธการเชื่อมต่อด้วยใบรับรอง self-signed หรือไม่น่าเชื่อถือ"
+ }
+ }
+ },
+ "demoMonitors": {
+ "title": "มอนิเตอร์สาธิต",
+ "description": "เพิ่มมอนิเตอร์ตัวอย่างเพื่อวัตถุประสงค์ในการ���าธิต"
+ },
+ "removeMonitors": {
+ "title": "รีเซ็ตระบบ",
+ "description": "ลบมอนิเตอร์ทั้งหมดออกจากระบบ",
+ "dialog": {
+ "title": "ลบมอนิเตอร์ทั้งหมด?",
+ "description": "ไม่สามารถย้อนกลับได้"
+ }
+ },
+ "exportMonitors": {
+ "title": "ส่งออกมอนิเตอร์"
+ },
+ "importExportMonitors": {
+ "title": "นำเข้า / ส่งออกมอนิเตอร์",
+ "description": "นำเข้าหรือส่งออกข้อมูลมอนิเตอร์เป็นไฟล์ JSON สำหรับสำรองหรือโอนย้าย"
+ },
+ "about": {
+ "title": "เกี่ยวกับ",
+ "developedBy": "พัฒนาโดย Bluewave Labs"
+ },
+ "validation": {
+ "errorMessage": "กรุณาแก้ไขข้อผิดพลาดการตรวจสอบต่อไปนี้:"
+ }
+ }
},
- "port": {
- "label": "ที่อยู่ IP ที่ต้องการตรวจสอบ",
- "namePlaceholder": "Localhost:5173",
- "placeholder": "localhost"
+ "statusPages": {
+ "deleteSuccess": "ลบหน้าสถานะสำเร็จ",
+ "fallback": {
+ "title": "หน้าสถานะใช้เพื่อ:",
+ "checks": "Communicate system status to users and stakeholders,Display real-time uptime information publicly,Build trust with transparent service monitoring,Reduce support requests during incidents",
+ "actionButton": "สร้างหน้าสถานะ!"
+ },
+ "monitorsList": {
+ "chartTypeHeatmap": "แผนที่ความร้อน",
+ "chartTypeHistogram": "ฮิสโตแกรม",
+ "noData": "ไม่มีข้อมูล",
+ "infrastructure": {
+ "title": "โครงสร้างพื้นฐาน",
+ "cpu": "CPU",
+ "memory": "RAM",
+ "memoryText": "หน่วยความจำ",
+ "disk": "ดิสก์",
+ "usage": "การใช้งาน",
+ "used": "ใช้แล้ว",
+ "total": "ทั้งหมด"
+ },
+ "uptime": {
+ "title": "อัปไทม์",
+ "responseTime": "เวลาตอบสนอง"
+ }
+ },
+ "statusBar": {
+ "allDown": "ระบบทั้งหมดล่ม",
+ "allUp": "ระบบทั้งหมดทำงานปกติ",
+ "degraded": "บางระบบกำลังประสบปัญหา",
+ "unknown": "ไม่สามารถระบุสถานะระบบได้"
+ },
+ "table": {
+ "headers": {
+ "name": "ชื่อหน้าสถานะ",
+ "url": "URL สาธารณะ"
+ },
+ "published": "เผยแพร่แล้ว",
+ "unpublished": "ยังไม่เผยแพร่"
+ },
+ "title": "หน้าสถานะ",
+ "details": {
+ "empty": {
+ "title": "ยังไม่มีข้อมูลที่นี่",
+ "addMonitor": "เพิ่มมอนิเตอร์เพื่อเริ่มต้น"
+ }
+ },
+ "form": {
+ "access": {
+ "title": "การเข้าถึง",
+ "description": "หากหน้าสถานะพร้อมแล้ว คุณสามารถทำเครื่องหมายว่าเผยแพร่แล้ว",
+ "option": {
+ "published": {
+ "name": "เผยแพร่แล้วและสาธารณะสามารถเห็นได้"
+ }
+ }
+ },
+ "basicInfo": {
+ "title": "ข้อมูลพื้นฐาน",
+ "description": "กำหนดชื่อบริษัทและซับโดเมนที่หน้าสถานะชี้ไป",
+ "option": {
+ "name": {
+ "label": "ชื่อบริษัท",
+ "placeholder": "Acme Inc."
+ },
+ "url": {
+ "label": "ที่อยู่หน้าสถานะของคุณ",
+ "placeholder": "my-status-page"
+ }
+ }
+ },
+ "monitors": {
+ "title": "มอนิเตอร์",
+ "description": "เลือกมอนิเตอร์ที่จะแสดงบนหน้าสถานะ",
+ "noMonitors": "ไม่ได้เลือกมอนิเตอร์",
+ "option": {
+ "monitors": {
+ "label": "เลือกมอนิเตอร์",
+ "placeholder": "ค้นหาและเลือกมอนิเตอร์..."
+ }
+ }
+ },
+ "timezone": {
+ "title": "เขตเวลา",
+ "description": "เลือกเขตเวลาที่หน้าสถานะจะแสดง",
+ "option": {
+ "timezone": {
+ "label": "เขตเวลา",
+ "placeholder": "เลือกเขตเวลา..."
+ }
+ }
+ },
+ "appearance": {
+ "title": "รูปลักษณ์",
+ "description": "กำหนดรูปลักษณ์เริ่มต้นของหน้าสถานะสาธารณะ",
+ "option": {
+ "logo": {
+ "label": "โลโก้"
+ },
+ "color": {
+ "label": "สีแบรนด์"
+ }
+ }
+ },
+ "features": {
+ "title": "ฟีเจอร์",
+ "description": "กำหนดค่าข้อมูลที่แสดงบนหน้าสถานะ",
+ "option": {
+ "showCharts": {
+ "label": "แสดงกราฟเวลาตอบสนอง"
+ },
+ "showUptimePercentage": {
+ "label": "แสดงเปอร์เซ็นต์อัปไทม์"
+ },
+ "showAdminLoginLink": {
+ "label": "แสดงลิงก์เข้าสู่ระบบผู้ดูแล"
+ },
+ "showInfrastructure": {
+ "label": "แสดงเมตริกโครงสร้างพื้นฐาน"
+ }
+ }
+ }
+ }
},
- "game": {
- "label": "URL ที่ต้องการมอนิเตอร์",
- "namePlaceholder": "localhost:5173",
- "placeholder": "localhost"
- }
- },
- "uptimeAdvancedMatching": {
- "jsonPath": "JSON Path"
- },
- "bytesPerSecond": "ไบต์ต่อวินาที",
- "bytesReceived": "ไบต์ที่รับ",
- "bytesSent": "ไบต์ที่ส่ง",
- "chooseGame": "เลือกเกม",
- "createMonitorPage": {
- "incidentConfigDescription": "การใช้หน้าต่างเลื่อนจะช่วยกำหนดเวลาที่ตัวตรวจสอบล้มเหลว สถานะของตัวตรวจสอบจะเปลี่ยนก็ต่อเมื่อเปอร์เซ็นต์ของการตรวจสอบในหน้าต่างเลื่อนตรงตามค่าที่กำหนด",
- "incidentConfigStatusWindowLabel": "ต้องมีการตรวจสอบกี่ครั้งในหน้าต่างเลื่อน?",
- "incidentConfigStatusWindowThresholdLabel": "ต้องการให้กี่เปอร์เซ็นต์ของการตรวจสอบในหน้าต่างเลื่อนล้มเหลว/สำเร็จ ก่อนที่จะเปลี่ยนสถานะของตัวตรวจสอบ?",
- "incidentConfigTitle": "เหตุการณ์",
- "incidentConfigDescriptionV2": "",
- "incidentConfigStatusCheckNumber": "",
- "intervalTitle": "",
- "intervalDescription": ""
- },
- "dataRate": "อัตราการส่งข้อมูล",
- "dataReceived": "ข้อมูลที่รับ",
- "dataSent": "ข้อมูลที่ส่ง",
- "details": "รายละเอียด",
- "drops": "แพ็กเก็ตที่หล่น",
- "errors": "ข้อผิดพลาด",
- "errorsIn": "ข้อผิดพลาดขาเข้า",
- "errorsOut": "ข้อผิดพลาดขาออก",
- "gameServerMonitoring": "มอนิเตอร์เซิร์ฟเวอร์เกม",
- "gameServerMonitoringDescription": "ตรวจสอบว่าเซิร์ฟเวอร์เกมของคุณกำลังทำงานอยู่หรือไม่",
- "network": "เน็ตเวอร์",
- "networkDrops": "การดรอปของเน็ตเวอร์",
- "networkErrors": "เน็ตเวอร์ ล้มเหลว",
- "networkInterface": "เน็ตเวอร์ อินเทอร์เฟซ",
- "noNetworkStatsAvailable": "ไม่มีสถิติของเน็ตเวอร์",
- "packetsPerSecond": "แพ็กเก็ตต่อวินาที",
- "packetsReceived": "แพ็กเก็ตที่รับ",
- "packetsReceivedRate": "อัตราการรับแพ็กเก็ต",
- "packetsSent": "แพ็กเก็ตที่ส่ง",
- "rate": "อัตรา",
- "selectInterface": "เลือกอินเทอร์เฟซ",
- "v1": {
- "infrastructure": {
- "disk_selection_title": "การเลือกดิสก์",
- "disk_selection_info": "ไม่พบดิสก์ในขณะนี้",
- "disk_selection_description": "เลือกดิสก์ที่คุณต้องการตรวจสอบ"
+ "uptime": {
+ "filters": {
+ "search": {
+ "placeholder": "ค้นหามอนิเตอร์..."
+ }
+ },
+ "table": {
+ "headers": {
+ "responseTime": "เวลาตอบสนอง"
+ }
+ },
+ "fallback": {
+ "actionButton": "สร้างมอนิเตอร์!",
+ "checks": "Check if websites or servers are online & responsive,Alert teams about downtime or performance issues,Monitor HTTP endpoints, pings, containers & ports,Track historical uptime and reliability trends",
+ "title": "มอนิเตอร์อัปไทม์ใช้เพื่อ:"
+ }
}
}
}
diff --git a/client/src/locales/tr.json b/client/src/locales/tr.json
index 59f2945333..43f0a80414 100644
--- a/client/src/locales/tr.json
+++ b/client/src/locales/tr.json
@@ -1,1108 +1,1305 @@
{
- "submit": "Gönder",
- "title": "Başlık",
- "distributedStatusHeaderText": "Gerçek zamanlı, Gerçek cihazlar kapsamı",
- "distributedStatusSubHeaderText": "Dünya çapında milyonlarca cihaz tarafından desteklenen sistem performansını küresel bölgeye, ülkeye veya şehre göre görüntüleyin",
- "settingsDisabled": "Devre dışı",
- "settingsSuccessSaved": "Ayarlar başarıyla kaydedildi",
- "settingsFailedToSave": "Ayarlar kaydedilemedi",
- "settingsStatsCleared": "İstatistikler başarıyla temizlendi",
- "settingsFailedToClearStats": "İstatistikler temizlenemedi",
- "settingsMonitorsDeleted": "Tüm monitörler başarıyla silindi",
- "settingsFailedToDeleteMonitors": "Monitörler silinemedi",
- "starPromptTitle": "Checkmate yıldızla değerlendirin",
- "starPromptDescription": "En son sürümleri görün ve GitHub'daki topluluğun büyümesine yardımcı olun",
- "https": "HTTPS",
- "http": "HTTP",
- "monitor": "monitör",
- "aboutus": "Hakkımızda",
- "now": "Şimdi",
- "delete": "Sil",
- "configure": "Yapılandır",
- "responseTime": "Yanıt süresi:",
- "ms": "ms",
- "bar": "Çubuk",
- "area": "Alan",
- "country": "ÜLKE",
- "city": "ŞEHİR",
- "response": "YANIT",
- "monitorStatusUp": "Monitör {name} ({url}) ayakta ve yanıt veriyor",
- "monitorStatusDown": "Monitör {name} ({url}) yanıt vermiyor",
- "webhookSendSuccess": "Web kanca bildirimi başarıyla gönderildi",
- "webhookSendError": "Web kanca bildirimi bu platforma gönderilemedi: {platform}",
- "webhookUnsupportedPlatform": "Desteklenmeyen platform: {platform}",
- "distributedRightCategoryTitle": "Monitör",
- "distributedStatusServerMonitors": "Sunucu monitörleri",
- "distributedStatusServerMonitorsDescription": "İlgili sunucuların monitör durumları",
- "distributedUptimeCreateSelectURL": "Burada sunucu adresini (URL) ve monitör türünü girebilirsiniz.",
- "distributedUptimeCreateChecks": "Yapılacak kontroller",
- "distributedUptimeCreateChecksDescription": "Adresi girdikten sonra kontrol ekleyebilir ya da çıkartabilirsiniz.",
- "distributedUptimeCreateIncidentNotification": "Olay bildirimleri",
- "distributedUptimeCreateIncidentDescription": "Bir olay olduğunda kullanıcıları bilgilendir.",
- "distributedUptimeCreateAdvancedSettings": "Gelişmiş ayarlar",
- "distributedUptimeDetailsNoMonitorHistory": "Bu monitör için henüz bir denetim günlüğü oluşturulmadı.",
- "distributedUptimeDetailsStatusHeaderUptime": "Erişilebilirlik",
- "distributedUptimeDetailsStatusHeaderLastUpdate": "Son güncelleme",
- "notifications": {
- "enableNotifications": "{{platform}} bildirimlerini etkinleştir",
- "testNotification": "Bildirimi test et",
- "addOrEditNotifications": "Bildirimleri ekle ya da düzenle",
- "slack": {
- "label": "Slack",
- "description": "Slack bildirimlerini etkinleştirmek için bir Slack uygulaması oluşturun ve gelen web kancalarını etkinleştirin. Daha sonra, webhook URL’sini buraya girmeniz yeterlidir.\n\n\n\n\n\n",
- "webhookLabel": "Web kanca URL:",
- "webhookPlaceholder": "https://hooks.slack.com/services/...",
- "webhookRequired": "Slack webhook URL'si gereklidir"
- },
- "discord": {
- "label": "Discord",
- "description": "Checkmate’ten Discord bildirimleri aracılığıyla bir Discord kanalına veri göndermek için Discord’un gelen web kancaları özelliğini kullanabilirsiniz.\n\n\n\n\n\n\n\n",
- "webhookLabel": "Discord web kanca URL",
- "webhookPlaceholder": "https://discord.com/api/webhooks/...",
- "webhookRequired": "Discord webhook URL'si gerekli"
+ "common": {
+ "auth": {
+ "roles": {
+ "admin": "Yönetici",
+ "demo": "Demo",
+ "superadmin": "Süper yönetici",
+ "user": "Kullanıcı"
+ }
},
- "telegram": {
- "label": "Telegram",
- "description": "Telegram bildirimlerini etkinleştirmek için, Telegram botlarını oluşturup yönetmek için kullanılan resmi bot BotFather ile bir Telegram botu oluşturun. Daha sonra, API jetonunu (token) ve sohbet kimliğini (chat ID) alın ve buraya yazın.",
- "tokenLabel": "Bot jetonu (token)",
- "tokenPlaceholder": "123456:ABC-DEF1234ghIkl-zyx57W2v1u123ew11",
- "chatIdLabel": "Sohbet ID",
- "chatIdPlaceholder": "-1001234567890",
- "fieldsRequired": "Telegram token ve sohbet kimliği gereklidir"
+ "alerts": {
+ "pageSpeedApiKey": {
+ "content": "Uyarı: Henüz bir Google PageSpeed API anahtarı eklemediniz. Eklemek için Ayarlar sayfasını ziyaret edin. Bu anahtar olmadan PageSpeed monitörü çalışmayacaktır."
+ }
},
- "webhook": {
- "label": "Web kancaları",
- "description": "Olaylar meydana geldiğinde bildirim almak için özel bir web kancası ayarlayabilirsiniz.",
- "urlLabel": "Web kanca URL:",
- "urlPlaceholder": "https://sunucu-adresiniz.com/webhook",
- "urlRequired": "Webhook URL'si gerekli"
+ "appName": "Checkmate",
+ "breadcrumbs": {
+ "details": "Detaylar",
+ "home": "Ana sayfa"
},
- "testNotificationDevelop": "Test bildirimi 2",
- "integrationButton": "Bildirim Entegrasyonu",
- "testSuccess": "Test bildirimi başarıyla gönderildi",
- "testFailed": "Test bildirimi gönderilemedi",
- "unsupportedType": "Desteklenmeyen bildirim türü",
- "networkError": "Ağ hatası oluştu",
- "fallback": {
- "title": "",
- "checks": [""],
- "actionButton": ""
+ "buttons": {
+ "addMember": "Üye ekle",
+ "cancel": "İptal",
+ "close": "Kapat",
+ "configure": "Yapılandır",
+ "confirm": "Onayla",
+ "create": "Oluştur",
+ "delete": "Sil",
+ "generateToken": "Token oluştur",
+ "incidents": "Olaylar",
+ "inviteMember": "Üye davet et",
+ "pause": "Duraklat",
+ "resume": "Devam et",
+ "save": "Kaydet",
+ "sendInvite": "Davet gönder",
+ "test": "Test",
+ "testNotifications": "Bildirimleri test et",
+ "toggleTheme": "",
+ "flushQueue": "Kuyruğu temizle",
+ "notFound": "Ana panele git",
+ "resetPassword": "Parolayı sıfırla",
+ "reset": "Sıfırla",
+ "clear": "Temizle",
+ "addDemo": "Demo monitörler ekle",
+ "removeMonitors": "Monitörleri kaldır",
+ "sendTestEmail": "Test e-postası gönder",
+ "exportToJSON": "JSON olarak dışa aktar",
+ "importFromJSON": "JSON dosyasından içe aktar",
+ "clearFilters": "Filtreleri temizle",
+ "removeUser": "Kullanıcıyı kaldır"
},
- "createButton": "Bildirim kanalı oluştur",
- "createTitle": "Bildirim kanalı",
- "create": {
- "success": "",
- "failed": "Bildirim kanalı oluşturulamadı"
+ "charts": {
+ "labels": {
+ "averageResponseTime": "Ortalama yanıt süresi",
+ "downtime": "Kesinti süresi",
+ "high": "yüksek",
+ "low": "düşük",
+ "uptime": "Çalışma süresi"
+ },
+ "histogram": {
+ "avg": "Ort: {{value}} ms",
+ "max": "Maks: {{value}} ms"
+ }
},
- "fetch": {
- "success": "Bildirimler başarıyla alındı",
- "failed": "Bildirimler alınamadı"
+ "dialogs": {
+ "delete": {
+ "description": "Bu işlem geri alınamaz.",
+ "title": "Bunu silmek istediğinizden emin misiniz?"
+ }
},
- "delete": {
- "success": "Bildirim başarıyla silindi",
- "failed": "Bildirim silinemedi"
+ "labels": {
+ "active": "Aktif",
+ "paused": "duraklatıldı",
+ "na": "N/A",
+ "resolved": "Çözüldü",
+ "responseTime": "Yanıt süresi"
},
- "edit": {
- "success": "Bildirim başarıyla güncellendi",
- "failed": "Bildirim güncellenemedi"
+ "form": {
+ "role": {
+ "option": {
+ "role": {
+ "label": "Roller"
+ }
+ }
+ },
+ "name": {
+ "option": {
+ "firstName": {
+ "label": "",
+ "placeholder": "Jordan"
+ },
+ "lastName": {
+ "label": "Soyadı",
+ "placeholder": "Ellis"
+ }
+ }
+ },
+ "email": {
+ "option": {
+ "email": {
+ "label": "E-posta",
+ "placeholder": "you@example.com"
+ }
+ }
+ }
},
- "test": {
- "success": "Test bildirimi başarıyla gönderildi",
- "failed": ""
+ "table": {
+ "empty": "Burada hiçbir şey yok",
+ "headers": {
+ "actions": "İşlemler",
+ "dateTime": "Tarih ve saat",
+ "message": "Mesaj",
+ "monitor": "Monitör",
+ "monitorId": "Monitör ID",
+ "name": "Ad",
+ "status": "Durum",
+ "type": "Tür",
+ "url": "URL",
+ "interval": "Aralık",
+ "active": "Aktif",
+ "responseTime": "Yanıt süresi"
+ }
}
},
- "testLocale": "TEST13 UPLOAD",
- "add": "Ekle",
- "monitors": "Monitörler",
- "distributedUptimeStatusCreateStatusPage": "durum sayfası",
- "distributedUptimeStatusCreateStatusPageAccess": "Erişim",
- "distributedUptimeStatusCreateStatusPageReady": "Durum sayfanız hazırsa yayınlayabilirsiniz.",
- "distributedUptimeStatusBasicInfoHeader": "Temel bilgiler",
- "distributedUptimeStatusBasicInfoDescription": "Şirket adınızı ve durum sayfanızın işaret ettiği alt alan adını tanımlayın.",
- "distributedUptimeStatusLogoHeader": "Logo",
- "distributedUptimeStatusLogoDescription": "Durum sayfanız için bir logo yükleyin",
- "distributedUptimeStatusLogoUploadButton": "Logo yükle",
- "distributedUptimeStatusStandardMonitorsHeader": "Standart monitörler",
- "distributedUptimeStatusStandardMonitorsDescription": "Durum sayfanıza standart monitörleri ekleyin.",
- "distributedUptimeStatusCreateYour": "Oluştur:",
- "distributedUptimeStatusEditYour": "Düzenle:",
- "distributedUptimeStatusPublishedLabel": "Yayında ve herkes tarafından görülebilir",
- "distributedUptimeStatusCompanyNameLabel": "Şirket adı",
- "distributedUptimeStatusPageAddressLabel": "Durum sayfası adresi",
- "distributedUptimeStatus30Days": "30 gün",
- "distributedUptimeStatus60Days": "60 gün",
- "distributedUptimeStatus90Days": "90 gün",
- "distributedUptimeStatusPageNotSetUp": "Henüz bir durum sayfası oluşturulmadı.",
- "distributedUptimeStatusContactAdmin": "Lütfen yöneticiniz ile görüşün",
- "distributedUptimeStatusPageNotPublic": "Bu durum sayfası herkese açık değil",
- "distributedUptimeStatusPageDeleteDialog": "Bu durum sayfasını silmek istiyor musunuz? ",
- "distributedUptimeStatusPageDeleteConfirm": "Evet, durum sayfasını sil",
- "distributedUptimeStatusPageDeleteDescription": "Silindiği zaman durum sayfalarını geri getiremezsiniz.",
- "distributedUptimeStatusDevices": "Cihazlar",
- "distributedUptimeStatusUpt": "UPT",
- "distributedUptimeStatusUptBurned": "Yakılan UPT",
- "distributedUptimeStatusUptLogo": "Upt Logo",
- "incidentsTableNoIncidents": "Hiç olay kaydedilmedi",
- "incidentsTablePaginationLabel": "olaylar",
- "incidentsTableMonitorName": "Monitör adı",
- "incidentsTableStatus": "Durum",
- "incidentsTableDateTime": "Tarih ve saat",
- "incidentsTableStatusCode": "Durum kodu",
- "incidentsTableMessage": "Mesaj",
- "incidentsOptionsHeader": "Servisler:",
- "incidentsOptionsHeaderFilterBy": "Filtrele:",
- "incidentsOptionsHeaderFilterAll": "Tümü",
- "incidentsOptionsHeaderFilterDown": "Erişilemiyor",
- "incidentsOptionsHeaderFilterCannotResolve": "Çözümlenemiyor",
- "incidentsOptionsHeaderShow": "Göster:",
- "incidentsOptionsHeaderLastHour": "Son saat",
- "incidentsOptionsHeaderLastDay": "Son gün",
- "incidentsOptionsHeaderLastWeek": "Son hafta",
- "incidentsOptionsPlaceholderAllServers": "Tüm sunucular",
- "infrastructureCreateYour": "Oluştur:",
- "infrastructureCreateGeneralSettingsDescription": "Burada, sunucu aracısına bağlanmak için kolay ad ve yetkilendirme sırrıyla birlikte ana bilgisayarın URL'sini seçebilirsiniz.",
- "infrastructureServerRequirement": "İzlediğiniz sunucunun şu şekilde çalışması gerekir:",
- "infrastructureCustomizeAlerts": "Alarmları özelleştir",
- "infrastructureAlertNotificationDescription": "Eşikler belirtilen bir yüzdeyi aştığında kullanıcıya bildirim gönder.",
- "infrastructureCreateMonitor": "Altyapı Monitörü oluştur",
- "infrastructureProtocol": "Protokol",
- "infrastructureServerUrlLabel": "Sunucu adresi",
- "infrastructureDisplayNameLabel": "Görünen adı",
- "infrastructureAuthorizationSecretLabel": "Kimlik denetimi parolası",
- "gb": "GB",
- "mb": "MB",
- "mem": "Bellek",
- "memoryUsage": "Bellek kullanımı",
- "cpu": "CPU",
- "cpuUsage": "CPU kullanımı",
- "cpuTemperature": "CPU sıcaklığı",
- "diskUsage": "Disk kullanımı",
- "used": "Kullanılan",
- "total": "Toplam",
- "cores": "Çekirdek",
- "frequency": "Frekans",
- "status": "Durum",
- "cpuPhysical": "CPU (fiziksel)",
- "cpuLogical": "CPU (Mantıksal)",
- "cpuFrequency": "CPU Frekansı",
- "avgCpuTemperature": "Ortalama CPU Isısı",
- "memory": "Bellek",
- "disk": "Disk",
- "uptime": "Çalışma süresi",
- "os": "İşletim sistemi",
- "host": "Makine",
- "actions": "İşlemler",
- "integrations": "Entegrasyonlar",
- "integrationsPrism": "Prism'i favori servisinize bağlayın.",
- "integrationsSlack": "Slack",
- "integrationsSlackInfo": "Slack'e bağlanın ve bir kanaldaki olayları görün",
- "integrationsDiscord": "Discord",
- "integrationsDiscordInfo": "Discord'a bağlanın ve olayları doğrudan bir kanalda görüntüleyin",
- "integrationsZapier": "Zapier",
- "integrationsZapierInfo": "Tüm olayları Zapier'a gönderin ve sonra her yerde görün",
- "commonSave": "Kaydet",
- "createYour": "Senin yarat",
- "createMonitor": "Monitör oluştur",
- "pause": "Beklet",
- "resume": "Yeniden başlat",
- "editing": "Düzenleniyor...",
- "url": "URL",
- "access": "Erişim",
- "timezone": "Zaman dilimi",
- "features": "Özellikler",
- "administrator": "Yönetici misin?",
- "loginHere": "Buradan giriş yap",
- "displayName": "Görüntülenecek isim",
- "urlMonitor": "Monitör edilecek URL",
- "portToMonitor": "Monitör edilecek port",
- "websiteMonitoring": "Web sitesi monitörü",
- "websiteMonitoringDescription": "Web sitenizi veya API uç noktanızı izlemek için HTTP(s) kullanın.",
- "pingMonitoring": "Ping monitörü",
- "pingMonitoringDescription": "Sitenizin ayakta olup olmadığını denetleyin.",
- "dockerContainerMonitoring": "Docker konteyner monitörü",
- "dockerContainerMonitoringDescription": "Docker konteynerinizin ayakta olup olmadığını denetleyin.",
- "portMonitoring": "Port monitörü",
- "portMonitoringDescription": "Portunuzun açık olup olmadığını denetleyin.",
- "createMaintenanceWindow": "Bakım aralığı oluşturun",
- "createMaintenance": "Bakım oluştur",
- "editMaintenance": "Bakımı düzenle",
- "maintenanceWindowName": "Bakım aralığı adı",
- "friendlyNameInput": "Görünen ad",
- "friendlyNamePlaceholder": "__:__ saatinde __ dakika boyunca bakım var",
- "maintenanceRepeat": "Bakım Tekrarı",
- "maintenance": "bakım",
- "duration": "Süre",
- "addMonitors": "Monitör ekle",
- "window": "pencere",
- "cancel": "İptal",
- "message": "Mesaj",
- "low": "düşük",
- "high": "yüksek",
- "statusCode": "Durum kodu",
- "date&Time": "Tarih & saat",
- "type": "Tür",
- "statusPageName": "Durum sayfası adı",
- "publicURL": "Genel URL",
- "repeat": "Tekrarla",
- "edit": "Düzenle",
- "createA": "Bir tane oluştur",
- "remove": "Kaldırmak",
- "maintenanceWindowDescription": "Bu zaman diliminde pingleriniz gönderilmeyecek",
- "startTime": "Başlangıç saati",
- "timeZoneInfo": "Tüm tarihler ve saatler GMT+0 zaman dilimindedir.",
- "monitorsToApply": "Bakım penceresini uygulamak için monitörler",
- "nextWindow": "Sonraki pencere",
- "notFoundButton": "Ana panoya git",
- "pageSpeedConfigureSettingsDescription": "Burada, monitör tipiyle birlikte sunucunun URL'sini seçebilirsiniz.",
- "monitorDisplayName": "Monitör görüntüleme adı",
- "whenNewIncident": "Yeni bir olay oluştuğunda,",
- "notifySMS": "SMS ile bildir (yakında)",
- "notifyEmails": "Ayrıca birden fazla eposta adresine bildirim gönderebilirsiniz (yakında geliyor)",
- "seperateEmails": "Birden fazla epostayı virgülle ayırabilirsiniz",
- "checkFrequency": "Frekansı denetle",
- "matchMethod": "Eşleşme yöntemi",
- "expectedValue": "Beklenen değer",
- "deleteDialogTitle": "Gerçekten bu monitörü silmek istiyor musunuz?",
- "deleteDialogDescription": "Bir kez silindiği zaman tekrar getiremezsiniz.",
- "pageSpeedMonitor": "Sayfa Hızı Monitörü",
- "shown": "Gösteriliyor: ",
- "ago": "önce",
- "companyName": "Firma adı",
- "pageSpeedDetailsPerformanceReport": "Değerler yaklaşıktır ve değişebilir",
- "pageSpeedDetailsPerformanceReportCalculator": "Hesap makinesini gör",
- "checkingEvery": "Denetleme sıklığı",
- "statusPageCreateSettings": "Eğer durum sayfanız hazırsa, herkese açık yayınlayabilirsiniz",
- "basicInformation": "Temel Bilgiler",
- "statusPageCreateBasicInfoDescription": "Şirket adınızı ve durum sayfanızın işaret ettiği alt alan adını tanımlayın.",
- "statusPageCreateSelectTimeZoneDescription": "Durum sayfanızın hangi zaman diliminde görüntüleneceğini seçin.",
- "statusPageCreateAppearanceDescription": "Genel durum sayfanızın varsayılan görünümünü ve hissini tanımlayın.",
- "statusPageCreateSettingsCheckboxLabel": "Yayınlandı ve herkese açık",
- "statusPageCreateBasicInfoStatusPageAddress": "Durum sayfası adresiniz",
- "statusPageCreateTabsContent": "Durum sayfası sunucuları",
- "statusPageCreateTabsContentDescription": "İzlediğiniz herhangi bir sayıda sunucuyu durum sayfanıza ekleyebilirsiniz. Ayrıca en iyi görüntüleme deneyimi için bunları yeniden sıralayabilirsiniz.",
- "statusPageCreateTabsContentFeaturesDescription": "Durum sayfasında daha fazla bilgi göster",
- "showCharts": "Çizelgeleri göster",
- "showUptimePercentage": "Çalışma süresi yüzdesini göster",
- "removeLogo": "Logoyu sil",
- "statusPageStatus": "Herkese açık bir durum sayfası henüz oluşturulmadı.",
- "statusPageStatusContactAdmin": "Lütfen yöneticinizle iletişime geçin.",
- "statusPageStatusNotPublic": "Durum sayfası herkese açık değil.",
- "statusPageStatusNoPage": "Burada bir durum sayfası bulunmuyor.",
- "statusPageStatusServiceStatus": "Servis durumu",
- "deleteStatusPage": "Gerçekten bu durum sayfasını silmek istiyor musunuz?",
- "deleteStatusPageConfirm": "Evet, durum sayfasını sil",
- "deleteStatusPageDescription": "Silindikten sonra durum sayfasını geri getiremezsiniz.",
- "uptimeCreate": "Beklenen değer, yanıt sonucuyla eşleştirilir ve bu eşleşme durumu belirler.",
- "uptimeCreateJsonPath": "Bu ifade, yanıt JSON verisi üzerinde değerlendirilir, ortaya çıkan sonuç beklenen değerle karşılaştırılır. Bkz:",
- "uptimeCreateJsonPathQuery": "Sorgu dili dokümantasyonu için.",
- "maintenanceTableActionMenuDialogTitle": "Gerçekten bu bakım aralığını silmek istiyor musunuz?",
- "infrastructureEditYour": "Düzenle",
- "infrastructureEditMonitor": "Altyapı İzlemeyi Kaydet",
- "infrastructureMonitorCreated": "Altyapı izleyicisi başarıyla oluşturuldu!",
- "infrastructureMonitorUpdated": "Altyapı izleyicisi başarıyla güncellendi!",
- "errorInvalidTypeId": "Geçersiz bildirim türü sağlandı",
- "errorInvalidFieldId": "Geçersiz alan kimliği sağlandı",
- "inviteNoTokenFound": "Davet belirteci bulunamadı",
- "pageSpeedWarning": "Uyarı: Henüz bir Google PageSpeed API anahtarı eklemediniz. Bu olmadan PageSpeed izleyicisi çalışmayacaktır.",
- "pageSpeedLearnMoreLink": "Buraya tıklayın",
- "pageSpeedAddApiKey": "(API anahtarınızı eklemek için)",
- "update": "Güncelleme",
- "invalidFileFormat": "Desteklenmeyen dosya biçimi!",
- "invalidFileSize": "Dosya boyutu çok büyük!",
- "ClickUpload": "Yüklemek için tıklayın",
- "DragandDrop": "sürükle ve bırak",
- "MaxSize": "Azami Boyut",
- "SupportedFormats": "Desteklenen formatlar",
- "FirstName": "İsim",
- "LastName": "Soyisim",
- "EmailDescriptionText": "Geçerli epostanız - bu eposta değiştirilemez.",
- "YourPhoto": "Profil fotoğrafı",
- "PhotoDescriptionText": "Bu fotoğrafınız profil sayfasında görüntülenecektir.",
- "save": "Kaydet",
- "DeleteDescriptionText": "Bu, hesabı ve ilişkili tüm verileri sunucudan kaldıracaktır. Bu geri alınamaz.",
- "DeleteAccountWarning": "Hesabınızı kaldırmanız, tekrar oturum açamayacağınız ve tüm verilerinizin silineceği anlamına gelir. Bu geri alınamaz.",
- "DeleteWarningTitle": "Gerçekten bu hesabı silmek istiyor musunuz?",
- "bulkImport": {
- "title": "Toplu içeri alma",
- "selectFileTips": "Yüklenecek CSV dosyasını seçin",
- "selectFileDescription": "Şablonumuzu veya örneğimizi indirebilirsiniz",
- "selectFile": "Dosyayı seçin",
- "parsingFailed": "Ayrıştırma başarısız oldu",
- "uploadSuccess": "Monitör başarıyla oluşturuldu!",
- "validationFailed": "Doğrulama başarısız oldu",
- "noFileSelected": "Hiçbir dosya seçilmedi",
- "fallbackPage": "Toplu olarak sunucu listesini yüklemek için bir dosyayı içe aktarın",
- "invalidFileType": "",
- "uploadFailed": ""
- },
- "DeleteAccountTitle": "Hesabı sil",
- "DeleteAccountButton": "Hesabı sil",
- "publicLink": "Herkese açık bağlantı",
- "maskedPageSpeedKeyPlaceholder": "*************************************",
- "reset": "Sıfırla",
- "ignoreTLSError": "TLS/SSL hatalarını gözardı et",
- "tlsErrorIgnored": "TLS/SSL hataları gözardı ediliyor",
- "ignoreTLSErrorDescription": "TLS/SSL hatalarını gözardı et ve websitesinin ayakta olduğunu denetle",
- "createNew": "Yeni oluştur",
- "greeting": {
- "prepend": "Merhaba",
- "append": "Öğleden sonra muhteşem geçsin!",
- "overview": ""
- },
- "roles": {
- "superAdmin": "Süper yönetici",
- "admin": "Yönetici",
- "teamMember": "Ekip elemanı",
- "demoUser": "Demo kullanıcısı"
- },
- "teamPanel": {
- "teamMembers": "Ekip elemanları",
- "filter": {
- "all": "Tümü",
- "member": "Eleman"
+ "components": {
+ "imageUpload": {
+ "clickToUpload": "Yüklemek için tıklayın",
+ "dragAndDrop": "sürükle ve bırak",
+ "supportedFormats": "Desteklenen formatlar",
+ "maxSize": "Azami Boyut",
+ "orDragAndDrop": "veya sürükle bırak",
+ "errors": {
+ "invalidFileSize": "Dosya boyutu çok büyük!",
+ "invalidFileFormat": "Desteklenmeyen dosya biçimi!"
+ }
},
- "inviteTeamMember": "Ekip elemanı davet et",
- "inviteNewTeamMember": "Yeni ekip elemanı davet et",
- "inviteDescription": "",
- "email": "Eposta",
- "selectRole": "Rolü seçin",
- "inviteLink": "Davet linki",
- "cancel": "İptal",
- "noMembers": "Bu role sahip hiç üye yok",
- "getToken": "",
- "emailToken": "",
- "table": {
- "name": "İsim",
- "email": "Eposta",
- "role": "Rol",
- "created": "Oluşturulma"
+ "headerStatusPageControls": {
+ "publicLink": "Herkese açık bağlantı"
},
- "addTeamMember": {
- "addMemberMenu": "",
- "title": "",
- "description": "",
- "addButton": ""
+ "headerTimeRange": {
+ "labels": {
+ "day": "Gün",
+ "month": "Ay",
+ "recent": "Son",
+ "week": "Hafta"
+ },
+ "description": {
+ "recent": "Son 2 saatin istatistikleri gösteriliyor.",
+ "day": "Son 24 saatin istatistikleri gösteriliyor.",
+ "week": "Son 7 günün istatistikleri gösteriliyor.",
+ "month": "Son 30 günün istatistikleri gösteriliyor."
+ }
},
- "register": "",
- "registerToast": {
- "success": "",
- "dbUserExists": "",
- "unknownError": ""
+ "offlineBanner": {
+ "serverUnreachable": "Sunucuya ulaşılamıyor",
+ "retry": "Tekrar dene",
+ "retrying": "Yeniden deneniyor...",
+ "reconnected": ""
},
- "registerTeamMember": {
- "title": "",
- "auth": {
- "common": {
- "inputs": {
- "firstName": {
- "errors": {
- "empty": "",
- "pattern": ""
- }
- },
- "lastName": {
- "errors": {
- "empty": "",
- "pattern": ""
- }
+ "sidebar": {
+ "menu": {
+ "uptime": "",
+ "pagespeed": "Sayfa hızı",
+ "infrastructure": "",
+ "notifications": "Bildirimler",
+ "checks": "Kontroller",
+ "incidents": "Olaylar",
+ "statusPages": "Durum sayfaları",
+ "maintenance": "Bakım",
+ "logs": "Günlükler",
+ "settings": "Ayarlar"
+ },
+ "bottomMenu": {
+ "support": "Destek",
+ "discussions": "Soru-cevap",
+ "docs": "Dokümanlar",
+ "changelog": "Değişiklik günlüğü"
+ },
+ "accountMenu": {
+ "profile": "Profil",
+ "password": "Parola",
+ "team": "Ekip"
+ },
+ "starPrompt": {
+ "title": "Checkmate'e yıldız verin",
+ "description": "En son sürümleri görün ve GitHub'da topluluğun büyümesine katkıda bulunun"
+ },
+ "authFooter": {
+ "navControls": "Kontroller",
+ "logOut": "Çıkış yap",
+ "roles": {
+ "superAdmin": "Süper yönetici",
+ "admin": "Yönetici",
+ "user": "Kullanıcı",
+ "demoUser": "Demo kullanıcısı"
+ }
+ }
+ },
+ "starPrompt": {
+ "title": "Checkmate'e yıldız verin",
+ "description": "En son sürümleri görün ve GitHub'da topluluğun büyümesine katkıda bulunun"
+ }
+ },
+ "pages": {
+ "notFound": {
+ "title": "Eyvah! Sushini düşürdün!",
+ "subtitle": "URL mevcut değil veya erişim yetkiniz yok."
+ },
+ "account": {
+ "tabs": {
+ "profile": "Profil",
+ "password": "Parola",
+ "team": "Ekip"
+ },
+ "form": {
+ "name": {
+ "title": "Ad",
+ "description": "Kişisel bilgilerinizi güncelleyin"
+ },
+ "photo": {
+ "title": "Profil fotoğrafı",
+ "description": "Bir profil fotoğrafı yükleyin"
+ },
+ "currentPassword": {
+ "title": "Mevcut parola",
+ "description": "Kimliğinizi doğrulamak için mevcut parolanızı girin",
+ "option": {
+ "label": "Mevcut parola",
+ "placeholder": "Mevcut parolanızı girin"
+ }
+ },
+ "newPassword": {
+ "title": "Yeni parola",
+ "description": "En az 8 karakter içeren güçlü bir parola seçin",
+ "option": {
+ "newPassword": {
+ "label": "Yeni parola",
+ "placeholder": "Yeni parolanızı girin"
},
+ "confirm": {
+ "label": "Parolayı onaylayın",
+ "placeholder": "Yeni parolanızı onaylayın"
+ }
+ }
+ },
+ "deleteAccount": {
+ "title": "Hesabı sil",
+ "description": "Bu işlem kalıcıdır ve geri alınamaz"
+ }
+ },
+ "team": {
+ "filter": {
+ "placeholder": "Role göre filtrele",
+ "all": "Tümü",
+ "admin": "Yönetici",
+ "member": "Eleman"
+ },
+ "table": {
+ "headers": {
+ "email": "E-posta",
+ "role": "Rol",
+ "created": "Oluşturulma"
+ }
+ },
+ "addMember": {
+ "title": "Yeni ekip üyesi kaydet",
+ "description": "Yeni bir kullanıcı hesabı oluşturun. Kimlik bilgilerini oluşturduktan sonra güvenli bir şekilde paylaşın."
+ },
+ "invite": {
+ "title": "Ekip üyesi davet et",
+ "description": "Ekibinize katılmak için bir davet gönderin",
+ "email": {
+ "label": "E-posta adresi",
+ "placeholder": "E-posta adresini girin"
+ },
+ "role": {
+ "label": "Rol",
+ "placeholder": "Bir rol seçin"
+ },
+ "linkLabel": "Davet bağlantısı"
+ }
+ }
+ },
+ "auth": {
+ "common": {
+ "passwordRules": {
+ "length": {
+ "beginning": "",
+ "highlighted": "8 karakter uzunluğunda"
+ },
+ "lowercase": {
+ "beginning": "En az içermelidir: ",
+ "highlighted": "Bir küçük harf"
+ },
+ "match": {
+ "beginning": "",
+ "highlighted": "eşleşmelidir"
+ },
+ "number": {
+ "beginning": "En az içermelidir: ",
+ "highlighted": "bir sayı"
+ },
+ "special": {
+ "beginning": "En az içermelidir: ",
+ "highlighted": "bir özel karakter"
+ },
+ "uppercase": {
+ "beginning": "En az içermelidir: ",
+ "highlighted": "Bir büyük harf"
+ }
+ },
+ "form": {
+ "option": {
"email": {
- "errors": {
- "empty": "",
- "invalid": ""
- }
+ "label": "E-posta",
+ "placeholder": "me@example.com"
},
- "role": {
- "errors": {
- "empty": ""
- }
+ "password": {
+ "label": "Parola",
+ "placeholder": "********"
+ },
+ "confirmPassword": {
+ "label": "Parolayı onaylayın"
}
}
}
+ },
+ "login": {
+ "title": "Checkmate'e tekrar hoş geldiniz!",
+ "subtitle": "Devam etmek için giriş yapın",
+ "submit": "Giriş yap",
+ "links": {
+ "forgotPassword": {
+ "text": "Parolanızı mı unuttunuz?",
+ "linkText": "Parolayı sıfırla"
+ },
+ "register": {
+ "text": "Hesabınız yok mu?",
+ "linkText": "Buradan kaydolun"
+ }
+ }
+ },
+ "register": {
+ "title": "Checkmate'e tekrar hoş geldiniz!",
+ "subtitle": "Başlamak için kaydolun",
+ "submit": "Kaydol"
+ },
+ "forgotPassword": {
+ "title": "Parolanızı mı unuttunuz?",
+ "subtitle": "Endişelenmeyin, size sıfırlama talimatları göndereceğiz.",
+ "submit": "Kurtarma talebi gönder",
+ "links": {
+ "login": {
+ "text": "Geri dön:",
+ "linkText": "giriş"
+ }
+ }
+ },
+ "setNewPassword": {
+ "title": "Parolanızı sıfırlayın",
+ "subtitle": "Yeni parolanız daha önce kullandığınız parolalardan farklı olmalıdır."
}
},
- "role": "",
- "changeTeamPassword": {
- "changePasswordMenu": "",
- "title": "",
- "description": "",
- "success": ""
- }
- },
- "monitorState": {
- "paused": "Durduruldu",
- "resumed": "Yeniden başlatıldı",
- "active": "Aktif"
- },
- "menu": {
- "uptime": "",
- "pagespeed": "Sayfa hızı",
- "infrastructure": "",
- "incidents": "Olaylar",
- "statusPages": "Durum sayfaları",
- "maintenance": "Bakım",
- "integrations": "Entegrasyonlar",
- "settings": "Ayarlar",
- "support": "Destek",
- "discussions": "Soru-cevap",
- "docs": "Dokümanlar",
- "changelog": "Değişiklik günlüğü",
- "profile": "Profil",
- "password": "Parola",
- "team": "Ekip",
- "logOut": "Çıkış yap",
- "notifications": "Bildirimler",
- "logs": "Günlükler"
- },
- "settingsEmailUser": "E-posta kullanıcısı – Kimlik doğrulama için kullanıcı adı; belirtilirse e-posta adresinin yerine geçer.",
- "state": "Durum",
- "statusBreadCrumbsStatusPages": "Durum sayfası",
- "statusBreadCrumbsDetails": "Detaylar",
- "commonSaving": "Kaydediliyor.",
- "navControls": "Kontroller",
- "incidentsPageTitle": "Olaylar",
- "passwordPanel": {
- "passwordChangedSuccess": "Şifreniz başarı ile değiştirildi.",
- "passwordInputIncorrect": "Şifreniz hatalı",
- "currentPassword": "Mevcut parola",
- "enterCurrentPassword": "Mevcut parolanızı girin",
- "newPassword": "Yeni parola",
- "enterNewPassword": "Yeni parolanızı girin",
- "confirmNewPassword": "Yeni şifrenizi onaylayın",
- "passwordRequirements": "Yeni şifreniz en az 8 karakterden oluşmalı ve en az bir büyük harf, bir küçük harf, bir rakam ve bir özel karakter içermelidir.",
- "saving": "Kaydediliyor..."
- },
- "emailSent": "E-posta başarı ile gönderildi.",
- "failedToSendEmail": "E-posta gönderimi başarısız.",
- "settingsTestEmailSuccess": "Test E-postası başarı ile gönderildi.",
- "settingsTestEmailFailed": "Test E-postası gönderimi başarısız.",
- "settingsTestEmailFailedWithReason": "Test E-postası gönderimi başarısız: {{reason}}",
- "settingsTestEmailUnknownError": "Bilinmeyen hata.",
- "statusMsg": {
- "paused": "İzleme duraklatıldı.",
- "up": "Siteniz yayında.",
- "down": "Siteniz kapalı.",
- "pending": "Sırada.."
- },
- "uptimeGeneralInstructions": {
- "http": "",
- "ping": "",
- "docker": "",
- "port": "",
- "game": "",
- "https": ""
- },
- "common": {
- "appName": "Checkmate",
- "monitoringAgentName": "",
- "buttons": {
- "toggleTheme": ""
+ "checks": {
+ "selects": {
+ "monitor": {
+ "all": "Tüm monitörler"
+ },
+ "status": {
+ "all": "Tümü",
+ "down": "Çevrimdışı",
+ "up": "Çevrimiçi"
+ }
+ },
+ "table": {
+ "empty": "Bu zaman aralığında çevrimdışı kontrol yok",
+ "headers": {
+ "statusCode": "Durum kodu",
+ "location": "Konum"
+ }
+ }
},
- "toasts": {
- "networkError": "",
- "checkConnection": "Lütfen bağlantınızı kontrol edin",
- "unknownError": "Bilinmeyen hata"
- }
- },
- "auth": {
"common": {
- "navigation": {
- "continue": "Devam et",
- "back": "Geri"
- },
- "inputs": {
- "email": {
- "label": "Eposta",
- "placeholder": "",
- "errors": {
- "empty": "Devam etmek için eposta adresinizi girin",
- "invalid": ""
- }
+ "monitors": {
+ "actions": {
+ "configure": "Yapılandır",
+ "delete": "Sil",
+ "generateToken": "Token oluştur",
+ "details": "Detaylar",
+ "incidents": "Olaylar",
+ "inviteMember": "Üye davet et",
+ "openSite": "Siteyi aç",
+ "pause": "Duraklat",
+ "resume": "Devam et"
},
- "password": {
- "label": "Parola",
- "rules": {
- "length": {
- "beginning": "",
- "highlighted": "8 karakter uzunluğunda"
+ "statBoxes": {
+ "activeFor": "Aktif süresi",
+ "certificateExpiry": "Sertifika bitiş tarihi",
+ "lastCheck": "Son kontrol",
+ "lastResponseTime": "Son yanıt süresi"
+ },
+ "status": {
+ "down": "çevrimdışı",
+ "breached": "eşik aşıldı",
+ "initializing": "başlatılıyor",
+ "maintenance": "bakım",
+ "paused": "duraklatıldı",
+ "total": "toplam",
+ "up": "çevrimiçi"
+ },
+ "monitorTypes": {
+ "optionDocker": "Docker",
+ "optionGame": "Oyun",
+ "optionHttp": "HTTP(S)",
+ "optionPing": "Ping",
+ "optionPort": "Port",
+ "optionPagespeed": "PageSpeed",
+ "optionHardware": "Altyapı",
+ "optionGrpc": "gRPC",
+ "optionWebSocket": "WebSocket"
+ }
+ }
+ },
+ "createMonitor": {
+ "form": {
+ "advanced": {
+ "description": "Gelişmiş kullanım senaryoları için isteğe bağlı ayarlar",
+ "option": {
+ "advancedMatching": {
+ "label": "Gelişmiş eşleştirme kullan"
},
- "special": {
- "beginning": "En az içermelidir: ",
- "highlighted": "bir özel karakter"
+ "expectedValue": {
+ "label": "Beklenen değer"
},
- "number": {
- "beginning": "En az içermelidir: ",
- "highlighted": "bir sayı"
+ "jsonPath": {
+ "description": "Bu ifade, yanıt JSON verisi üzerinde değerlendirilecek ve sonuç beklenen değerle eşleştirilecektir. Sorgu dili belgeleri için jmespath.org sayfasına bakın.",
+ "label": "JSONPath ifadesi"
},
- "uppercase": {
- "beginning": "En az içermelidir: ",
- "highlighted": "Bir büyük harf"
+ "matchMethod": {
+ "label": "Eşleştirme yöntemi",
+ "equal": "",
+ "include": "",
+ "regex": ""
+ }
+ },
+ "title": "Gelişmiş ayarlar"
+ },
+ "frequency": {
+ "description": "Bu monitörün durumunu ne sıklıkla kontrol etmek istiyorsunuz?",
+ "option": {
+ "frequency": {
+ "label": "Kontrol sıklığı",
+ "value": {
+ "fifteenMinutes": "15 dakika",
+ "fifteenSeconds": "",
+ "fiveMinutes": "5 dakika",
+ "fourMinutes": "",
+ "oneMinute": "",
+ "tenMinutes": "10 dakika",
+ "thirtyMinutes": "30 dakika",
+ "thirtySeconds": "",
+ "threeMinutes": "",
+ "twoMinutes": ""
+ }
+ }
+ },
+ "title": "Kontrol sıklığı"
+ },
+ "general": {
+ "option": {
+ "container": {
+ "label": "Container adı/ID",
+ "placeholder": "uygulamam veya abcd1234"
+ },
+ "host": {
+ "label": "Ana bilgisayar",
+ "placeholder": "192.168.1.100 veya example.com"
+ },
+ "name": {
+ "label": "Görünen ad",
+ "placeholder": "örn. Web Sitem"
+ },
+ "secret": {
+ "label": "Yetkilendirme anahtarı",
+ "placeholder": "Gizli anahtarınızı girin"
+ },
+ "url": {
+ "label": "URL",
+ "placeholder": "https://www.google.com"
+ },
+ "game": {
+ "label": "",
+ "placeholder": ""
},
- "lowercase": {
- "beginning": "En az içermelidir: ",
- "highlighted": "Bir küçük harf"
+ "port": {
+ "label": "İzlenecek port",
+ "placeholder": "80"
},
- "match": {
- "beginning": "",
- "highlighted": "eşleşmelidir"
+ "grpcServiceName": {
+ "label": "Servis adı",
+ "placeholder": "örn. my.service.v1 (genel sağlık için boş bırakın)"
+ },
+ "wsUrl": {
+ "label": "WebSocket URL",
+ "placeholder": "wss://example.com/socket"
}
},
- "errors": {
- "empty": "Lütfen parolanızı girin",
- "length": "Parolanız en az 8 karakter uzunluğunda olmalıdır",
- "uppercase": "Parola en az 1 büyük harf içermelidir",
- "lowercase": "Parola en az 1 küçük harf içermelidir",
- "number": "Parola en az 1 sayı içermelidir",
- "special": "Parola en az 1 özel karakter içermelidir",
- "incorrect": "Parolanız sistemdeki ile uyuşmuyor"
+ "title": "Genel ayarlar",
+ "description": {
+ "http": "İzlenecek URL veya IP adresini girin (örn. https://example.com/ veya 192.168.1.100) ve panoda görünecek açık bir ad ekleyin.",
+ "ping": "",
+ "port": "",
+ "docker": "",
+ "game": "",
+ "pagespeed": "Web sitenizin sayfa yükleme performansını, Core Web Vitals metriklerini ve optimizasyon puanlarını takip edin.",
+ "grpc": "gRPC sunucusunun ana bilgisayar adını ve portunu girin, isteğe bağlı olarak sağlık kontrolü için bir servis adı belirtin ve bir görünen ad ekleyin.",
+ "websocket": "İzlenecek WebSocket URL'sini girin (örn. wss://example.com/socket) ve bir görünen ad ekleyin.",
+ "hardware": "Altyapınız için CPU, bellek, disk kullanımı ve sıcaklığı izleyin."
}
},
- "passwordConfirm": {
- "label": "Parolayı onayla",
- "placeholder": "Onaylamak için parolayı yeniden gir",
- "errors": {
- "empty": "",
- "different": ""
- }
+ "ignoreTls": {
+ "description": "HTTPS bağlantıları için TLS/SSL sertifika doğrulamasını yapılandırın.",
+ "option": {
+ "tls": {
+ "label": "TLS/SSL hatalarını yoksay"
+ }
+ },
+ "title": "TLS/SSL ayarları"
+ },
+ "incidents": {
+ "description": "Bir monitörün ne zaman çevrimdışı olduğunu belirlemek için kayan pencere kullanılır. Monitörün durumu, yalnızca kayan penceredeki kontrol yüzdesi belirlenen değeri karşıladığında değişir.",
+ "option": {
+ "checks": {
+ "label": "Kayan penceredeki kontrol sayısı"
+ },
+ "percentage": {
+ "label": "Monitör durumu değişmeden önce kayan penceredeki kontrollerin yüzde kaçı başarısız/başarılı olmalı?"
+ }
+ },
+ "title": "Olaylar"
},
- "firstName": {
- "label": "",
- "placeholder": "Jordan",
- "errors": {
- "empty": "Lütfen adınızı girin",
- "length": "İsim 50 karakterden az olmalıdır",
- "pattern": "İsim yalnızca harfler, boşluklar, kesme işaretleri veya tireler içerebilir"
+ "notifications": {
+ "description": "Kullanmak istediğiniz bildirim kanallarını seçin",
+ "title": "Bildirimler"
+ },
+ "type": {
+ "description": "Gerçekleştirilecek kontrol türünü seçin",
+ "optionDockerDescription": "Bir container'ın çalışıp çalışmadığını izlemek için Docker kullanın.",
+ "optionGameDescription": "Belirli bir oyun sunucusunun çevrimiçi olup olmadığını izleyin.",
+ "optionGrpcDescription": "Standart Health Checking Protocol kullanarak gRPC servislerini izleyin.",
+ "optionWebSocketDescription": "Bağlantı sağlığı ve yanıt süresi için WebSocket uç noktalarını izleyin.",
+ "optionHttpDescription": "Web sitenizi veya API uç noktanızı izlemek için HTTP(S) kullanın.",
+ "optionPingDescription": "Bir sunucunun çevrimiçi olup olmadığını izlemek için ICMP Ping kullanın.",
+ "optionPortDescription": "Bir sunucuda belirli bir portun açık olup olmadığını izleyin.",
+ "title": "Tür"
+ },
+ "thresholds": {
+ "title": "Uyarı eşikleri",
+ "description": "Bu altyapı monitörü için uyarıların tetikleneceği eşikleri tanımlayın.",
+ "option": {
+ "cpuThreshold": {
+ "label": "CPU uyarı eşiği (%)"
+ },
+ "memoryThreshold": {
+ "label": "Bellek uyarı eşiği (%)"
+ },
+ "diskThreshold": {
+ "label": "Disk uyarı eşiği (%)"
+ },
+ "tempThreshold": {
+ "label": "Sıcaklık uyarı eşiği (°C)"
+ }
}
},
- "lastName": {
- "label": "Soyadı",
- "placeholder": "Ellis",
- "errors": {
- "empty": "Lütfen soyadınızı girin",
- "length": "Soyadı en çok 50 karakter olmalıdır",
- "pattern": "Soyad yalnızca harfler, boşluklar, kesme işaretleri veya tireler içerebilir"
+ "geoChecks": {
+ "title": "Coğrafi dağıtılmış kontroller",
+ "description": "Küresel erişilebilirlik ve performansı izlemek için birden fazla coğrafi konumdan kontrol çalıştırın.",
+ "option": {
+ "enabled": {
+ "label": "Coğrafi dağıtılmış kontrolleri etkinleştir"
+ },
+ "locations": {
+ "label": "Konumlar",
+ "placeholder": "Konum seçin",
+ "options": {
+ "EU": "Avrupa",
+ "NA": "Kuzey Amerika",
+ "AS": "Asya",
+ "SA": "Güney Amerika",
+ "AF": "Afrika",
+ "OC": "Okyanusya"
+ }
+ },
+ "interval": {
+ "label": "Kontrol aralığı",
+ "value": {
+ "fiveMinutes": "5 dakika",
+ "tenMinutes": "10 dakika",
+ "fifteenMinutes": "15 dakika",
+ "thirtyMinutes": "30 dakika"
+ }
+ }
}
- }
- },
- "errors": {
- "validation": "Veriyi işlerken hata oluştu."
- },
- "fields": {
- "password": {
- "errors": {
- "incorrect": ""
+ },
+ "url": {
+ "title": "Durum sayfasında monitör IP/URL gösterimi",
+ "description": "Monitörün IP adresini veya URL'sini herkese açık durum sayfasında görüntüleyin. Devre dışı bırakılırsa hassas bilgileri korumak için yalnızca monitör adı gösterilir.",
+ "option": {
+ "showURL": {
+ "label": "Durum sayfasında IP/URL göster",
+ "enabled": "Etkin",
+ "disabled": "Devre dışı"
+ }
}
},
- "role": {
- "errors": {
- "min": ""
+ "stats": {
+ "title": "Monitör geçmişi",
+ "description": "Ekibinizin tüm izleme geçmişini ve istatistiklerini temizleyin. Bu işlem geri alınamaz.",
+ "buttonText": "Tüm istatistikleri temizle",
+ "dialog": {
+ "title": "Tüm izleme geçmişi temizlensin mi?",
+ "description": "Bu işlem ekibinizin tüm izleme geçmişini, istatistiklerini ve kontrol verilerini kalıcı olarak silecektir. Bu işlem geri alınamaz.",
+ "confirm": "Evet, tüm istatistikleri temizle"
}
}
}
},
- "login": {
- "heading": "Giriş yap",
- "subheadings": {
- "stepOne": "Eposta adresinizi girin",
- "stepTwo": "Parolanızı girin"
+ "editUser": {
+ "form": {
+ "roles": {
+ "title": "Roller",
+ "description": "Kullanıcıya roller atayın. Birden fazla rol seçilebilir."
+ }
},
- "links": {
- "forgotPassword": "Parolanızı mı unuttunuz?",
- "register": "Hesabınız yok mu?",
- "forgotPasswordLink": "Parolayı sıfırla",
- "registerLink": "Buradan kayıt olun"
+ "dialog": {
+ "removeUser": {
+ "title": "Kullanıcıyı kaldır",
+ "content": "{{name}} adlı kullanıcıyı ekibinizden kaldırmak istediğinizden emin misiniz? Bu işlem geri alınamaz."
+ }
+ }
+ },
+ "incidents": {
+ "dialog": {
+ "resolveIncident": {
+ "title": "Olayı çöz",
+ "option": {
+ "comment": {
+ "label": "Yorum (isteğe bağlı)",
+ "placeholder": "Çözüm hakkında bir yorum ekleyin..."
+ }
+ }
+ },
+ "details": {
+ "analysis": "Olay analizi",
+ "comment": "Yorum:",
+ "detailsLabel": "Detaylar",
+ "downtime": "Kesinti süresi:",
+ "message": "Mesaj:",
+ "monitor": "Monitör:",
+ "overview": "Genel bakış",
+ "resolutionDetails": "Çözüm detayları",
+ "resolutionType": "Tür:",
+ "resolutionTypes": {
+ "automatic": "Otomatik",
+ "manual": "Manuel"
+ },
+ "resolve": "Olayı çöz",
+ "resolvedAt": "Çözülme zamanı:",
+ "resolvedBy": "Çözen:",
+ "startedAt": "Başlangıç zamanı:",
+ "status": "Durum:",
+ "statusCode": "Durum kodu:",
+ "timeline": "Zaman çizelgesi",
+ "title": "Olay detayları",
+ "url": "URL:"
+ }
},
- "toasts": {
- "success": "Tekrar hoşgeldiniz! Başarıyla sisteme giriş yaptınız.",
- "incorrectPassword": "Hatalı parola"
+ "filters": {
+ "allMonitors": "Tüm monitörler",
+ "monitor": "Monitör",
+ "resolutionType": "Çözüm türü",
+ "resolutionTypes": {
+ "manual": "Manuel",
+ "automatic": "Otomatik",
+ "all": "Tümü"
+ }
},
- "errors": {
- "password": {
- "incorrect": "Giriş yaptığınız parola sistemdekiyle uyuşmuyor"
+ "summaryCard": {
+ "activeIncidents": {
+ "title": "Aktif olaylar",
+ "active_zero": "Aktif olay yok",
+ "active_one": "{{count}} aktif olay",
+ "active_other": "{{count}} aktif olay"
+ },
+ "incidentStats": {
+ "avgResolutionTime": "Ort. çözüm süresi",
+ "mostAffectedMonitor": "En çok etkilenen monitör",
+ "title": "Olay istatistikleri",
+ "totalIncidents": "Toplam olay sayısı"
+ },
+ "latestIncidents": {
+ "title": "Son olaylar"
}
},
- "welcome": ""
+ "table": {
+ "actions": {
+ "details": "Detaylar",
+ "goToMonitor": "Monitöre git",
+ "resolveManually": "Manuel olarak çöz"
+ },
+ "activeIncidents": "Aktif olaylar",
+ "headers": {
+ "endTime": "Bitiş zamanı",
+ "resolutionType": "Çözüm türü",
+ "startTime": "Başlangıç saati",
+ "statusCode": "Durum kodu"
+ },
+ "resolvedIncidents": "Çözülen olaylar",
+ "status": {
+ "active": "Aktif",
+ "resolved": "Çözüldü"
+ }
+ }
},
- "registration": {
- "heading": {
- "superAdmin": "Süper yönetici oluştur",
- "user": "Kayıt ol"
- },
- "subheadings": {
- "stepOne": "Kişisel bilgilerinizi girin",
- "stepTwo": "Eposta adresinizi girin",
- "stepThree": "Parolanızı oluturun"
+ "infrastructure": {
+ "charts": {
+ "labels": {
+ "cpu": "CPU kullanımı",
+ "disk": "Disk kullanımı",
+ "memory": "Bellek kullanımı",
+ "netBytesRecv": "{{name}} - Alınan bayt",
+ "netBytesSent": "{{name}} - Gönderilen bayt",
+ "temp": "Sıcaklık"
+ }
},
- "description": {
- "superAdmin": "Başlamak için süper yönetici hesabı oluşturun",
- "user": ""
+ "gauges": {
+ "cpu": {
+ "lowerLabel": "Maks frekans",
+ "title": "CPU kullanımı",
+ "upperLabel": "Mevcut frekans"
+ },
+ "disk": {
+ "lowerLabel": "Boş",
+ "title": "Disk {{idx}} kullanımı",
+ "upperLabel": "Kullanılan"
+ },
+ "memory": {
+ "lowerLabel": "Boş",
+ "title": "Bellek kullanımı",
+ "upperLabel": "Kullanılan"
+ }
},
- "gettingStartedButton": {
- "superAdmin": "Süper yönetici hesabı oluşturun",
- "user": ""
+ "statBoxes": {
+ "avgCpuTemperature": "Ortalama CPU Isısı",
+ "cpuFrequency": "CPU Frekansı",
+ "cpuLogical": "CPU (Mantıksal)",
+ "cpuPhysical": "CPU (fiziksel)",
+ "disk": "Disk",
+ "memory": "Bellek",
+ "os": "İşletim sistemi"
},
- "termsAndPolicies": "Bir hesap oluşturarak Hizmet Şartları ve Gizlilik Politikası'nı kabul etmiş olursunuz.",
- "links": {
- "login": "Bir hesabınız mı var? Giriş yapın"
+ "table": {
+ "headers": {
+ "cpu": "CPU",
+ "disk": "Disk",
+ "memory": "Bellek"
+ }
},
- "toasts": {
- "success": "Hoşgeldiniz! Hesabınız başarıyla oluşturuldu."
+ "tabs": {
+ "labels": {
+ "network": "",
+ "overview": "Genel bakış"
+ }
},
- "welcome": ""
+ "fallback": {
+ "actionButton": "Monitör oluşturun!",
+ "checks": "Sunucularınızın performansını takip edin,Darboğazları belirleyin ve kullanımı optimize edin,Gerçek zamanlı izleme ile güvenilirliği sağlayın",
+ "title": "Bir altyapı monitörü şunlar için kullanılır:"
+ }
},
- "forgotPassword": {
- "heading": "Parolanızı mı kaybettiniz?",
- "subheadings": {
- "stepOne": "Endişelenmeyin, sıfırlamak için gerekli bilgileri göndereceğiz.",
- "stepTwo": "Parola sıfırlama için gerekli bilgileri hesabına ilettik.",
- "stepThree": "Parolanız daha önce kullandığınız paroladan farklı olmalıdır.",
- "stepFour": "Parolanız başarıyla sıfırlandı. Buraya tıklayarak giriş yapabilirsiniz."
+ "logs": {
+ "tabs": {
+ "diagnostics": "Teşhis",
+ "logs": "Sunucu günlükleri",
+ "queue": "İş kuyruğu"
},
- "buttons": {
- "openEmail": "Eposta uygulamasını aç",
- "resetPassword": "Parolayı sıfırla"
+ "logLevelSelect": {
+ "label": "Günlük seviyesi"
},
- "imageAlts": {
- "passwordKey": "",
- "email": "",
- "lock": "",
- "passwordConfirm": ""
+ "jobQueue": "İş kuyruğu",
+ "failedJobs": "Başarısız işler",
+ "noLogs": "Günlük bulunamadı",
+ "metrics": {
+ "jobs": "İşler",
+ "activeJobs": "Aktif işler",
+ "failingJobs": "Başarısız olan işler",
+ "totalRuns": "Toplam çalıştırma",
+ "totalFailures": "Toplam başarısızlık"
},
- "links": {
- "login": "",
- "resend": ""
+ "diagnostics": {
+ "stats": {
+ "eventLoopDelay": "Olay döngüsü gecikmesi",
+ "uptime": "Çalışma süresi",
+ "usedHeapSize": "Kullanılan heap boyutu",
+ "totalHeapSize": "Toplam heap boyutu",
+ "osMemoryLimit": "İşletim sistemi bellek limiti"
+ },
+ "gauges": {
+ "heapAllocation": "Heap tahsisi",
+ "heapUsage": "Heap kullanımı",
+ "heapUtilization": "Heap verimliliği",
+ "instantCpuUsage": "Anlık CPU kullanımı",
+ "availableMemoryPercentage": "% kullanılabilir bellek",
+ "allocatedPercentage": "% tahsis edilmiş",
+ "usedSPercentage": "% CPU tarafından kullanılan (1s)",
+ "total": "Toplam",
+ "used": "Kullanılan"
+ }
},
- "toasts": {
- "sent": "",
- "emailNotFound": "Eposta bulunamadı.",
- "redirect": "",
- "success": "",
- "error": ""
+ "table": {
+ "headers": {
+ "timestamp": "Zaman damgası",
+ "level": "Seviye",
+ "service": "Servis",
+ "method": "Yöntem",
+ "monitorId": "Monitör ID",
+ "runCount": "Çalışma sayısı",
+ "failCount": "Başarısızlık sayısı",
+ "lastRunAt": "Son çalışma zamanı",
+ "lockedAt": "Kilitlenme zamanı",
+ "lastFinishedAt": "Son tamamlanma zamanı",
+ "lastRunTook": "Son çalışma süresi",
+ "lastFailedAt": "Son başarısızlık zamanı",
+ "failReason": "Başarısızlık nedeni"
+ }
}
- }
- },
- "errorPages": {
- "serverUnreachable": {
- "toasts": {
- "reconnected": "",
- "stillUnreachable": ""
+ },
+ "maintenanceWindow": {
+ "fallback": {
+ "actionButton": "Bakım penceresi oluşturun!",
+ "checks": "Bakım dönemlerinizi işaretleyin,Yanlış anlamaları ortadan kaldırın,Bakım pencerelerinde uyarı göndermeyi durdurun",
+ "title": "Bakım penceresi şunlar için kullanılır:"
+ },
+ "table": {
+ "headers": {
+ "nextWindow": "Sonraki pencere",
+ "repeat": "Tekrarla"
+ }
},
- "alertBox": "Sunucu bağlantı hatası",
- "description": "",
- "retryButton": {
- "default": "Bağlantıyı tekrarla",
- "processing": "Bağlanıyor..."
+ "form": {
+ "general": {
+ "title": "Genel ayarlar",
+ "description": "Bakım pencereniz için bir ad ve tekrar seçeneği belirleyin.",
+ "option": {
+ "name": {
+ "label": "Ad",
+ "placeholder": "örn. Haftalık Bakım"
+ },
+ "repeat": {
+ "label": "Tekrarla"
+ }
+ }
+ },
+ "startDate": {
+ "title": "Başlangıç tarihi",
+ "description": "Bakım pencereniz için başlangıç tarihini seçin.",
+ "option": {
+ "startDate": {
+ "label": "Başlangıç tarihi"
+ }
+ }
+ },
+ "startTime": {
+ "title": "Başlangıç saati",
+ "description": "Bakım pencereniz için başlangıç saati ve süreyi ayarlayın. Tüm değerler UTC cinsindendir",
+ "option": {
+ "duration": {
+ "label": "Süre"
+ },
+ "startTime": {
+ "label": "Başlangıç saati"
+ }
+ },
+ "monitors": {
+ "title": "Monitörler",
+ "description": "Bakım penceresinin uygulanacağı monitörler",
+ "option": {
+ "addMonitors": {
+ "label": "Monitör ekle"
+ }
+ }
+ }
+ }
}
- }
- },
- "createNotifications": {
- "title": "Bildirim kanalları oluştur",
- "nameSettings": {
- "title": "İsim",
- "description": "Entegrasyon için açıklama",
- "nameLabel": "İsim",
- "namePlaceholder": "örn. Slack bildirimleri"
- },
- "typeSettings": {
- "title": "Tür",
- "description": "",
- "typeLabel": "Tür"
- },
- "emailSettings": {
- "title": "Eposta",
- "description": "Hedef eposta adresi",
- "emailLabel": "Eposta adresi",
- "emailPlaceholder": "örn. john@example.com"
- },
- "slackSettings": {
- "title": "Slack",
- "description": "Slack webhook'u burada tanımlayın",
- "webhookLabel": "Slack webhook adresi",
- "webhookPlaceholder": "https://hooks.slack.com/services/...\n"
- },
- "pagerdutySettings": {
- "title": "PagerDuty",
- "description": "PagerDuty entegrasyonunu burada yapın",
- "integrationKeyLabel": "Entegrasyon anahtarı",
- "integrationKeyPlaceholder": "1234567890"
},
- "discordSettings": {
- "title": "Discord",
- "description": "Discord webhook'u buradan ayarlayın",
- "webhookLabel": "Discord Webhook adresi",
- "webhookPlaceholder": "https://sunucu-adı.com/webhook\n"
- },
- "webhookSettings": {
- "title": "Webhook",
- "description": "",
- "webhookLabel": "",
- "webhookPlaceholder": "https://sunucu-adı.com/webhook\n"
- },
- "testNotification": "Test bildirimi",
- "dialogDeleteTitle": "Gerçekten bu bildirimi silmek istiyor musunuz?",
- "dialogDeleteConfirm": "Sil"
- },
- "notificationConfig": {
- "title": "Bildirimler",
- "description": ""
- },
- "monitorStatus": {
- "checkingEvery": "",
- "withCaptureAgent": "",
- "up": "ayakta",
- "down": "çalışmıyor",
- "paused": "beklemede"
- },
- "advancedMatching": "Gelişmiş eşleştirme",
- "sendTestNotifications": "Bildirimleri dene",
- "selectAll": "Tümünü seç",
- "showAdminLoginLink": "",
- "logsPage": {
- "title": "Günlükler",
- "description": "Sistem günlükleri - son 1000 satır",
- "tabs": {
- "queue": "İş kuyruğu",
- "logs": "Sunucu günlükleri",
- "diagnostics": "Teşhis"
- },
- "toast": {
- "fetchLogsSuccess": "Günlükler başarıyla alındı"
- },
- "logLevelSelect": {
- "title": "",
- "values": {
- "all": "",
- "info": "",
- "warn": "",
- "error": "",
- "debug": ""
+ "notifications": {
+ "fallback": {
+ "actionButton": "Kanal oluştur",
+ "checks": "Kesinti veya performans sorunları hakkında ekipleri uyarın,Olaylar meydana geldiğinde mühendisleri bilgilendirin,Yöneticileri sistem değişiklikleri hakkında haberdar edin",
+ "title": "Bildirim kanalları şunlar için kullanılır:"
+ },
+ "form": {
+ "accessToken": {
+ "optionAccessToken": "Erişim token'ı",
+ "placeholder": "syt_YWxleF9ob2xsaWRheQ_VmtScmV0U2VjcmV0S2V5_abc123"
+ },
+ "address": {
+ "description": "Bildirimlerin gönderileceği adres.",
+ "optionAddress": "Adres",
+ "placeholderEmail": "example@example.com",
+ "placeholderWebhook": "https://your-server.com/webhook",
+ "title": "Adres"
+ },
+ "homeServer": {
+ "optionHomeServer": "Ana sunucu",
+ "placeholder": "example.com"
+ },
+ "matrix": {
+ "description": "Bildirimler için Matrix ana sunucu bağlantınızı yapılandırın.",
+ "title": "Matrix yapılandırması"
+ },
+ "notificationName": {
+ "description": "Bildirim kanalı için açıklayıcı bir ad",
+ "optionName": "Kanal adı",
+ "placeholder": "örn. Üretim Uyarıları",
+ "title": "Kanal adı"
+ },
+ "pagerDuty": {
+ "description": "Uyarıları almak için PagerDuty entegrasyon anahtarınız.",
+ "optionIntegrationKey": "Entegrasyon anahtarı",
+ "placeholder": "a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6",
+ "title": "Entegrasyon anahtarı"
+ },
+ "roomId": {
+ "optionRoomId": "Oda ID",
+ "placeholder": "!abcdefg:matrix.org"
+ },
+ "type": {
+ "description": "Oluşturulacak bildirim kanalı türünü seçin.",
+ "optionType": "Tür",
+ "title": "Kanal türü"
+ },
+ "telegram": {
+ "title": "Telegram yapılandırması",
+ "description": "Telegram bildirimlerini etkinleştirmek için, Telegram botlarını oluşturup yönetmek için kullanılan resmi bot BotFather ile bir Telegram botu oluşturun. Daha sonra, API jetonunu (token) ve sohbet kimliğini (chat ID) alın ve buraya yazın.",
+ "optionBotToken": "Bot token",
+ "placeholderBotToken": "123456789:ABCdefGhIJKlmNoPQRsTUVwxyZ",
+ "optionChatId": "Sohbet ID",
+ "placeholderChatId": "-1001234567890"
+ }
+ },
+ "table": {
+ "headers": {
+ "destination": "Hedef"
+ }
}
- }
- },
- "queuePage": {
- "title": "",
- "refreshButton": "",
- "flushButton": "",
- "jobTable": {
- "title": "",
- "idHeader": "",
- "urlHeader": "",
- "typeHeader": "",
- "activeHeader": "Aktif",
- "lockedAtHeader": "",
- "runCountHeader": "",
- "failCountHeader": "",
- "lastRunHeader": "",
- "lastFinishedAtHeader": "Son tamamlama",
- "lastRunTookHeader": "",
- "intervalHeader": ""
- },
- "metricsTable": {
- "title": "",
- "metricHeader": "Metrik",
- "valueHeader": "Değer"
- },
- "failedJobTable": {
- "title": "Tamamlanamayan işler",
- "monitorIdHeader": "Monitör ID",
- "monitorUrlHeader": "Monitör URL",
- "failCountHeader": "Hata sayısı",
- "failedAtHeader": "",
- "failReasonHeader": ""
- }
- },
- "export": {
- "title": "Monitörleri dışarı al",
- "success": "Monitörler başarıyla dışarıya alındı",
- "failed": "Monitörleri dışarıya alırken bir hata oluştu"
- },
- "monitorActions": {
- "title": "Dışarı/İçeri al",
- "import": "",
- "export": "",
- "deleteSuccess": "Monitör başarıyla silindi",
- "deleteFailed": "Monitör silinemedi",
- "details": "Detaylar"
- },
- "settingsPage": {
- "aboutSettings": {
- "labelDevelopedBy": "",
- "labelVersion": "",
- "title": ""
},
- "demoMonitorsSettings": {
- "buttonAddMonitors": "",
- "description": "",
- "title": ""
- },
- "emailSettings": {
- "buttonSendTestEmail": "",
- "description": "",
- "descriptionTransport": "",
- "labelAddress": "",
- "labelConnectionHost": "",
- "labelHost": "",
- "labelIgnoreTLS": "",
- "labelPassword": "",
- "labelPasswordSet": "",
- "labelPool": "",
- "labelPort": "",
- "labelRejectUnauthorized": "",
- "labelRequireTLS": "",
- "labelSecure": "",
- "labelTLSServername": "",
- "labelUser": "",
- "linkTransport": "",
- "placeholderUser": "Eğer gerekmiyorsa boş bırakabilirsiniz",
- "title": "Eposta",
- "toastEmailRequiredFieldsError": ""
- },
- "pageSpeedSettings": {
- "description": "Google PageSpeed izlemeyi etkinleştirmek için Google PageSpeed API anahtarınızı girin. Anahtarı güncellemek için Sıfırla'ya tıklayın.",
- "labelApiKeySet": "API key tanımlandı. Sıfırla düğmesine tıklayarak değiştirebilirsiniz.",
- "labelApiKey": "PageSpeed API anahtarı",
- "title": "Google PageSpeed API anahtarı"
- },
- "saveButtonLabel": "Kaydet",
- "statsSettings": {
- "clearAllStatsButton": "",
- "clearAllStatsDescription": "",
- "clearAllStatsDialogConfirm": "",
- "clearAllStatsDialogDescription": "",
- "clearAllStatsDialogTitle": "",
- "description": "",
- "labelTTL": "",
- "labelTTLOptional": "Sonsuz için 0",
- "title": "İzleme geçmişi"
- },
- "systemResetSettings": {
- "buttonRemoveAllMonitors": "Tüm monitörleri sil",
- "description": "Sistemden tüm monitörleri sil",
- "dialogConfirm": "Evet, tüm monitörleri sil",
- "dialogDescription": "",
- "dialogTitle": "Gerçekten tüm monitörleri silmek istiyor musunuz?",
- "title": "Sistemi sıfırla"
- },
- "timezoneSettings": {
- "description": "",
- "label": "Görünüm zaman dilimi",
- "title": "Görünüm zaman dilimi"
- },
- "title": "Ayarlar",
- "uiSettings": {
- "description": "Aydınlık ve karanlık mod arasında geçiş yapın ya da kullanıcı arayüzü dilini değiştirin.",
- "labelLanguage": "Dil",
- "labelTheme": "Tema modu",
- "title": "Görünüm"
- },
- "urlSettings": {
- "description": "",
- "label": "",
- "selectDisabled": "Kapalı",
- "selectEnabled": "Etkin",
- "title": ""
- },
- "globalThresholds": {
- "title": "",
- "description": ""
- }
- },
- "statusPageCreate": {
- "buttonSave": ""
- },
- "incidentsOptionsHeaderFilterResolved": "",
- "settingsSave": "",
- "statusPageCreateAppearanceTitle": "",
- "confirmPassword": "",
- "monitorHooks": {
- "failureAddDemoMonitors": "",
- "successAddDemoMonitors": ""
- },
- "settingsAppearance": "",
- "settingsDisplayTimezone": "",
- "settingsGeneralSettings": "",
- "incidentsOptionsHeaderTotalIncidents": "",
- "statusPage": {
- "deleteSuccess": "Durum sayfası başarıyla silindi",
- "deleteFailed": "Durum sayfası silinemedi",
- "createSuccess": "Durum sayfası başarıyla oluşturuldu",
- "updateSuccess": "Durum sayfası başarıyla güncellendi",
- "generalSettings": "Genel ayarlar",
- "contents": "İçerikler",
- "fallback": {
- "checks": [""],
- "title": "",
- "actionButton": ""
- }
- },
- "testNotificationsDisabled": "Bu izleyici için ayarlanmış bir bildirim yok. 'Yapılandır' düğmesine tıklayarak bir bildirim eklemeniz gerekiyor.",
- "incidentsTableResolvedAt": "",
- "incidentsTableActionResolve": "Çözümle",
- "checkHooks": {
- "failureResolveOne": "Olay çözümlenirken bir hata oluştu.",
- "failureResolveAll": "Tüm olayları çözümlerken bir hata oluştu.",
- "failureResolveMonitor": ""
- },
- "checkFormError": "Formda hatalar var. Lütfen kontrol edin.",
- "diagnosticsPage": {
- "diagnosticDescription": "",
- "statsDescription": "",
- "gauges": {
- "heapAllocationTitle": "",
- "heapAllocationSubtitle": "",
- "heapUsageTitle": "",
- "heapUsageSubtitle": "",
- "heapUtilizationTitle": "",
- "heapUtilizationSubtitle": "",
- "instantCpuUsageTitle": "",
- "instantCpuUsageSubtitle": ""
- },
- "stats": {
- "eventLoopDelayTitle": "",
- "uptimeTitle": "",
- "usedHeapSizeTitle": "",
- "totalHeapSizeTitle": "",
- "osMemoryLimitTitle": ""
- }
- },
- "pageSpeedLighthouseAPI": "",
- "time": {
- "threeMinutes": "",
- "fiveMinutes": "",
- "tenMinutes": "",
- "twentyMinutes": "",
- "oneHour": "1 saat",
- "oneDay": "1 gün",
- "oneWeek": "1 hafta",
- "fourMinutes": "",
- "oneMinute": "",
- "twoMinutes": "",
- "fifteenSeconds": "",
- "thirtySeconds": ""
- },
- "general": {
- "noOptionsFound": ""
- },
- "infrastructureMonitor": {
- "fallback": {
- "checks": [""],
- "title": "",
- "actionButton": ""
- }
- },
- "maintenanceWindow": {
- "fallback": {
- "checks": [""],
- "title": "",
- "actionButton": ""
- }
- },
- "pageSpeed": {
- "fallback": {
- "checks": [""],
- "title": "",
- "actionButton": ""
- }
- },
- "uptimeMonitor": {
- "fallback": {
- "checks": [""],
- "title": "",
- "actionButton": ""
- }
- },
- "editUserPage": {
- "form": {
- "email": "",
- "firstName": "",
- "lastName": "",
- "role": "",
- "save": ""
- },
- "table": {
- "actionHeader": "",
- "roleHeader": ""
- },
- "title": "",
- "toast": {
- "successUserUpdate": "",
- "validationErrors": ""
- }
- },
- "incidentsPageActionResolveMonitor": "",
- "incidentsPageActionResolveAll": "",
- "matchMethodOptions": {
- "equal": "",
- "equalPlaceholder": "",
- "include": "",
- "includePlaceholder": "",
- "regex": "",
- "regexPlaceholder": "",
- "text": ""
- },
- "monitorType": {
- "docker": {
- "label": "",
- "namePlaceholder": "",
- "placeholder": ""
- },
- "http": {
- "label": "",
- "namePlaceholder": "",
- "placeholder": ""
+ "pageSpeed": {
+ "charts": {
+ "common": {
+ "cls": "Cumulative Layout Shift (CLS)",
+ "fcp": "First Contentful Paint (FCP)",
+ "lcp": "Largest Contentful Paint (LCP)",
+ "si": "Speed Index (SI)",
+ "tbt": "Total Blocking Time (TBT)"
+ },
+ "legend": {
+ "title": "PageSpeed raporu",
+ "weight": "Ağırlık"
+ },
+ "pie": {
+ "title": "Performans raporu"
+ }
+ },
+ "table": {
+ "headers": {
+ "pageSpeedScore": "PageSpeed puanı"
+ }
+ },
+ "fallback": {
+ "actionButton": "Monitör oluşturun!",
+ "checks": "Bir sayfanın kullanıcı deneyimini raporlayın,Web sayfası hızını analiz etmeye yardımcı olun,Sayfanın nasıl iyileştirilebileceğine dair öneriler sunun",
+ "title": "Bir PageSpeed monitörü şunlar için kullanılır:"
+ }
},
- "ping": {
- "label": "",
- "namePlaceholder": "",
- "placeholder": ""
+ "settings": {
+ "form": {
+ "timezone": {
+ "title": "Görüntüleme saat dilimi",
+ "description": "Uygulama genelinde tarih ve saatleri görüntülemek için kullanılacak saat dilimini seçin.",
+ "option": {
+ "timezone": {
+ "label": "Görüntüleme saat dilimi"
+ }
+ }
+ },
+ "ui": {
+ "title": "Görünüm",
+ "description": "Açık ve koyu mod arasında geçiş yapın, dili değiştirin veya grafik görüntüleme türünü özelleştirin.",
+ "option": {
+ "theme": {
+ "label": "Tema modu",
+ "light": "Açık",
+ "dark": "Koyu"
+ },
+ "language": {
+ "label": "Dil"
+ },
+ "chartType": {
+ "label": "Grafik türü",
+ "histogram": "Histogram",
+ "heatmap": "Isı haritası"
+ }
+ }
+ },
+ "pagespeed": {
+ "title": "Google PageSpeed API anahtarı",
+ "description": "Google PageSpeed izlemesini etkinleştirmek için Google PageSpeed API anahtarınızı girin. Anahtarı güncellemek için Sıfırla'ya tıklayın.",
+ "option": {
+ "apiKey": {
+ "label": "PageSpeed API anahtarı",
+ "labelSet": "API anahtarı ayarlandı. Değiştirmek için Sıfırla'ya tıklayın.",
+ "placeholder": "Google PageSpeed API anahtarınızı girin"
+ }
+ }
+ },
+ "url": {
+ "title": "Durum sayfasında monitör IP/URL gösterimi",
+ "description": "Monitörün IP adresini veya URL'sini herkese açık durum sayfasında görüntüleyin. Devre dışı bırakılırsa hassas bilgileri korumak için yalnızca monitör adı gösterilir.",
+ "option": {
+ "showURL": {
+ "label": "Durum sayfasında IP/URL göster",
+ "enabled": "Etkin",
+ "disabled": "Devre dışı"
+ }
+ }
+ },
+ "stats": {
+ "title": "Monitör geçmişi",
+ "description": "Ekibinizin tüm izleme geçmişini ve istatistiklerini temizleyin. Bu işlem geri alınamaz.",
+ "option": {
+ "clear": {
+ "label": "Tüm istatistikleri temizle. Bu işlem geri alınamaz."
+ }
+ },
+ "dialog": {
+ "title": "Tüm izleme geçmişi temizlensin mi?",
+ "description": "Bu işlem geri alınamaz"
+ }
+ },
+ "retention": {
+ "title": "Kontrol saklama",
+ "description": "Kontrol verilerinin otomatik temizlenmeden önce ne kadar süre saklanacağını ayarlayın.",
+ "option": {
+ "days": {
+ "label": "Saklama süresi (gün)",
+ "unlimited": "Sınırsız"
+ }
+ }
+ },
+ "thresholds": {
+ "title": "Genel eşikler",
+ "description": "Altyapı izleme için genel CPU, bellek, disk ve sıcaklık eşiklerini ayarlayın. Bunlar, geçersiz kılınmadığı sürece tüm donanım monitörlerine uygulanır.",
+ "option": {
+ "cpu": {
+ "label": "CPU eşiği (%)",
+ "placeholder": "1 - 100"
+ },
+ "memory": {
+ "label": "Bellek eşiği (%)",
+ "placeholder": "1 - 100"
+ },
+ "disk": {
+ "label": "Disk eşiği (%)",
+ "placeholder": "1 - 100"
+ },
+ "temperature": {
+ "label": "Sıcaklık eşiği (°C)",
+ "placeholder": "1 - 150"
+ }
+ }
+ },
+ "email": {
+ "title": "E-posta ayarları",
+ "description": "Sisteminiz için e-posta ayarlarını yapılandırın. Bu, bildirim ve uyarı göndermek için kullanılır.",
+ "descriptionTransport": "",
+ "descriptionTransportLink": "Özellikleri burada görün",
+ "option": {
+ "host": {
+ "label": "E-posta sunucusu - Bağlanılacak ana bilgisayar adı veya IP adresi",
+ "placeholder": "smtp.gmail.com"
+ },
+ "port": {
+ "label": "E-posta portu - Bağlanılacak port",
+ "placeholder": "587"
+ },
+ "address": {
+ "label": "E-posta adresi - Kimlik doğrulama için kullanılır",
+ "placeholder": "you@example.com"
+ },
+ "user": {
+ "label": "E-posta kullanıcısı - Kimlik doğrulama için kullanıcı adı, belirtilirse e-posta adresini geçersiz kılar",
+ "placeholder": "Gerekli değilse boş bırakın"
+ },
+ "password": {
+ "label": "E-posta parolası - Kimlik doğrulama için parola",
+ "labelSet": "Parola ayarlandı. Değiştirmek için Sıfırla'ya tıklayın.",
+ "placeholder": "Parolanızı girin"
+ },
+ "tlsServername": {
+ "label": "TLS sunucu adı - Ana bilgisayar IP olduğunda TLS doğrulama için isteğe bağlı ana bilgisayar adı",
+ "placeholder": "example.com"
+ },
+ "connectionHost": {
+ "label": "E-posta bağlantı sunucusu - HELO/EHLO karşılamasında kullanılacak ana bilgisayar adı",
+ "placeholder": "localhost"
+ },
+ "secure": {
+ "label": "SSL kullan (önerilen): Bağlantıyı SSL/TLS ile şifreleyin"
+ },
+ "pool": {
+ "label": "Bağlantı havuzunu etkinleştir: Performansı artırmak için mevcut bağlantıları yeniden kullanın"
+ },
+ "ignoreTLS": {
+ "label": "STARTTLS'yi devre dışı bırak: Sunucu desteklese bile TLS kullanma"
+ },
+ "requireTLS": {
+ "label": "STARTTLS'yi zorunlu kıl: TLS yükseltmesini zorunlu kıl, desteklenmiyorsa başarısız ol"
+ },
+ "rejectUnauthorized": {
+ "label": "Geçersiz sertifikaları reddet: Kendinden imzalı veya güvenilmeyen sertifikalı bağlantıları reddet"
+ }
+ }
+ },
+ "demoMonitors": {
+ "title": "Demo monitörler",
+ "description": "Gösterim amaçlı örnek monitörler ekleyin."
+ },
+ "removeMonitors": {
+ "title": "Sistem sıfırlama",
+ "description": "Sisteminizdeki tüm monitörleri kaldırın.",
+ "dialog": {
+ "title": "Tüm monitörler kaldırılsın mı?",
+ "description": "Bu işlem geri alınamaz."
+ }
+ },
+ "exportMonitors": {
+ "title": "Monitörleri dışa aktar"
+ },
+ "importExportMonitors": {
+ "title": "Monitörleri içe / dışa aktar",
+ "description": "Yedekleme veya aktarım için monitör verilerinizi JSON dosyası olarak içe veya dışa aktarın."
+ },
+ "about": {
+ "title": "Hakkında",
+ "developedBy": "Bluewave Labs tarafından geliştirildi"
+ },
+ "validation": {
+ "errorMessage": "Lütfen aşağıdaki doğrulama hatalarını düzeltin:"
+ }
+ }
},
- "port": {
- "label": "",
- "namePlaceholder": "",
- "placeholder": ""
+ "statusPages": {
+ "deleteSuccess": "Durum sayfası başarıyla silindi",
+ "fallback": {
+ "title": "Bir durum sayfası şunlar için kullanılır:",
+ "checks": "Kullanıcılara ve paydaşlara sistem durumunu iletin,Gerçek zamanlı çalışma süresi bilgilerini herkese açık olarak görüntüleyin,Şeffaf hizmet izleme ile güven oluşturun,Olaylar sırasında destek taleplerini azaltın",
+ "actionButton": "Durum sayfası oluşturun!"
+ },
+ "monitorsList": {
+ "chartTypeHeatmap": "Isı haritası",
+ "chartTypeHistogram": "Histogram",
+ "noData": "Veri mevcut değil",
+ "infrastructure": {
+ "title": "Altyapı",
+ "cpu": "CPU",
+ "memory": "RAM",
+ "memoryText": "Bellek",
+ "disk": "Disk",
+ "usage": "Kullanım",
+ "used": "Kullanılan",
+ "total": "Toplam"
+ },
+ "uptime": {
+ "title": "Çalışma süresi",
+ "responseTime": "Yanıt süresi"
+ }
+ },
+ "statusBar": {
+ "allDown": "Tüm sistemler çevrimdışı",
+ "allUp": "Tüm sistemler çalışıyor",
+ "degraded": "Bazı sistemlerde sorun yaşanıyor",
+ "unknown": "Sistem durumu belirlenemiyor"
+ },
+ "table": {
+ "headers": {
+ "name": "Durum sayfası adı",
+ "url": "Herkese açık URL"
+ },
+ "published": "Yayında",
+ "unpublished": "Yayında değil"
+ },
+ "title": "Durum sayfaları",
+ "details": {
+ "empty": {
+ "title": "Burada henüz hiçbir şey yok",
+ "addMonitor": "Başlamak için bir monitör ekleyin"
+ }
+ },
+ "form": {
+ "access": {
+ "title": "Erişim",
+ "description": "Durum sayfanız hazırsa yayında olarak işaretleyebilirsiniz.",
+ "option": {
+ "published": {
+ "name": "Yayında ve herkese açık"
+ }
+ }
+ },
+ "basicInfo": {
+ "title": "Temel bilgiler",
+ "description": "Şirket adını ve durum sayfanızın işaret ettiği alt alan adını tanımlayın.",
+ "option": {
+ "name": {
+ "label": "Şirket adı",
+ "placeholder": "Acme Inc."
+ },
+ "url": {
+ "label": "Durum sayfası adresiniz",
+ "placeholder": "my-status-page"
+ }
+ }
+ },
+ "monitors": {
+ "title": "Monitörler",
+ "description": "Durum sayfanızda görüntülenecek monitörleri seçin.",
+ "noMonitors": "Monitör seçilmedi",
+ "option": {
+ "monitors": {
+ "label": "Monitör seçin",
+ "placeholder": "Monitör arayın ve seçin..."
+ }
+ }
+ },
+ "timezone": {
+ "title": "Saat dilimi",
+ "description": "Durum sayfanızın görüntüleneceği saat dilimini seçin.",
+ "option": {
+ "timezone": {
+ "label": "Saat dilimi",
+ "placeholder": "Saat dilimi seçin..."
+ }
+ }
+ },
+ "appearance": {
+ "title": "Görünüm",
+ "description": "Herkese açık durum sayfanızın varsayılan görünümünü ve hissini tanımlayın.",
+ "option": {
+ "logo": {
+ "label": "Logo"
+ },
+ "color": {
+ "label": "Marka rengi"
+ }
+ }
+ },
+ "features": {
+ "title": "Özellikler",
+ "description": "Durum sayfanızda hangi bilgilerin görüntüleneceğini yapılandırın.",
+ "option": {
+ "showCharts": {
+ "label": "Yanıt süresi grafiklerini göster"
+ },
+ "showUptimePercentage": {
+ "label": "Çalışma süresi yüzdesini göster"
+ },
+ "showAdminLoginLink": {
+ "label": "Yönetici giriş bağlantısını göster"
+ },
+ "showInfrastructure": {
+ "label": "Altyapı metriklerini göster"
+ }
+ }
+ }
+ }
},
- "game": {
- "label": "",
- "namePlaceholder": "",
- "placeholder": ""
+ "uptime": {
+ "filters": {
+ "search": {
+ "placeholder": "Monitör ara..."
+ }
+ },
+ "table": {
+ "headers": {
+ "responseTime": "Yanıt süresi"
+ }
+ },
+ "fallback": {
+ "actionButton": "Monitör oluşturun!",
+ "checks": "Web sitelerinin veya sunucuların çevrimiçi ve yanıt verip vermediğini kontrol edin,Kesinti veya performans sorunları hakkında ekipleri uyarın,HTTP uç noktalarını, ping'leri, container'ları ve portları izleyin,Geçmiş çalışma süresi ve güvenilirlik trendlerini takip edin",
+ "title": "Bir çalışma süresi monitörü şunlar için kullanılır:"
+ }
}
- },
- "uptimeAdvancedMatching": {
- "jsonPath": ""
- },
- "bytesPerSecond": "",
- "bytesReceived": "",
- "bytesSent": "",
- "chooseGame": "",
- "createMonitorPage": {
- "incidentConfigDescription": "",
- "incidentConfigStatusWindowLabel": "",
- "incidentConfigStatusWindowThresholdLabel": "",
- "incidentConfigTitle": "",
- "incidentConfigDescriptionV2": "",
- "incidentConfigStatusCheckNumber": "",
- "intervalTitle": "",
- "intervalDescription": ""
- },
- "dataRate": "",
- "dataReceived": "",
- "dataSent": "",
- "details": "",
- "drops": "",
- "errors": "",
- "errorsIn": "",
- "errorsOut": "",
- "gameServerMonitoring": "",
- "gameServerMonitoringDescription": "",
- "network": "",
- "networkDrops": "",
- "networkErrors": "",
- "networkInterface": "",
- "noNetworkStatsAvailable": "",
- "packetsPerSecond": "",
- "packetsReceived": "",
- "packetsReceivedRate": "",
- "packetsSent": "",
- "rate": "",
- "selectInterface": ""
+ }
}
diff --git a/client/src/locales/uk.json b/client/src/locales/uk.json
index 22b96487c8..3872638aad 100644
--- a/client/src/locales/uk.json
+++ b/client/src/locales/uk.json
@@ -1,838 +1,1305 @@
{
- "submit": "",
- "title": "",
- "distributedStatusHeaderText": "",
- "distributedStatusSubHeaderText": "",
- "settingsDisabled": "",
- "settingsSuccessSaved": "",
- "settingsFailedToSave": "",
- "settingsStatsCleared": "",
- "settingsFailedToClearStats": "",
- "settingsFailedToAddDemoMonitors": "",
- "settingsMonitorsDeleted": "",
- "settingsFailedToDeleteMonitors": "",
- "starPromptTitle": "",
- "starPromptDescription": "",
- "https": "",
- "http": "",
- "monitor": "",
- "aboutus": "",
- "now": "",
- "delete": "",
- "configure": "",
- "responseTime": "",
- "ms": "",
- "bar": "",
- "area": "",
- "country": "",
- "city": "",
- "response": "",
- "monitorStatusUp": "",
- "monitorStatusDown": "",
- "webhookSendSuccess": "",
- "webhookSendError": "",
- "webhookUnsupportedPlatform": "",
- "distributedRightCategoryTitle": "",
- "distributedStatusServerMonitors": "",
- "distributedStatusServerMonitorsDescription": "",
- "distributedUptimeCreateSelectURL": "",
- "distributedUptimeCreateChecks": "",
- "distributedUptimeCreateChecksDescription": "",
- "distributedUptimeCreateIncidentNotification": "",
- "distributedUptimeCreateIncidentDescription": "",
- "distributedUptimeCreateAdvancedSettings": "",
- "distributedUptimeDetailsNoMonitorHistory": "",
- "distributedUptimeDetailsStatusHeaderUptime": "",
- "distributedUptimeDetailsStatusHeaderLastUpdate": "",
- "notifications": {
- "enableNotifications": "",
- "testNotification": "",
- "addOrEditNotifications": "",
- "slack": {
- "label": "",
- "description": "",
- "webhookLabel": "",
- "webhookPlaceholder": "",
- "webhookRequired": ""
- },
- "discord": {
- "label": "",
- "description": "",
- "webhookLabel": "",
- "webhookPlaceholder": "",
- "webhookRequired": ""
- },
- "telegram": {
- "label": "",
- "description": "",
- "tokenLabel": "",
- "tokenPlaceholder": "",
- "chatIdLabel": "",
- "chatIdPlaceholder": "",
- "fieldsRequired": ""
+ "common": {
+ "auth": {
+ "roles": {
+ "admin": "Адміністратор",
+ "demo": "Демо",
+ "superadmin": "Суперадміністратор",
+ "user": "Користувач"
+ }
},
- "webhook": {
- "label": "",
- "description": "",
- "urlLabel": "",
- "urlPlaceholder": "",
- "urlRequired": ""
+ "alerts": {
+ "pageSpeedApiKey": {
+ "content": "Увага: Ви ще не додали ключ API Google PageSpeed. Перейдіть у Налаштування, щоб додати його. Без нього моніторинг PageSpeed не працюватиме."
+ }
},
- "testNotificationDevelop": "",
- "integrationButton": "",
- "testSuccess": "",
- "testFailed": "",
- "unsupportedType": "",
- "networkError": "",
- "fallback": {
- "title": "",
- "checks": [""]
+ "appName": "",
+ "breadcrumbs": {
+ "details": "Деталі",
+ "home": "Головна"
},
- "createButton": "",
- "createTitle": "",
- "create": {
- "success": "",
- "failed": ""
+ "buttons": {
+ "addMember": "Додати учасника",
+ "cancel": "Скасувати",
+ "close": "Закрити",
+ "configure": "Налаштувати",
+ "confirm": "Підтвердити",
+ "create": "Створити",
+ "delete": "Видалити",
+ "generateToken": "Згенерувати токен",
+ "incidents": "Інциденти",
+ "inviteMember": "Запросити учасника",
+ "pause": "Призупинити",
+ "resume": "Відновити",
+ "save": "",
+ "sendInvite": "Надіслати запрошення",
+ "test": "Тест",
+ "testNotifications": "Тестові сповіщення",
+ "toggleTheme": "",
+ "flushQueue": "Очистити чергу",
+ "notFound": "Перейти на головну панель",
+ "resetPassword": "",
+ "reset": "",
+ "clear": "Очистити",
+ "addDemo": "Додати демо-монітори",
+ "removeMonitors": "Видалити монітори",
+ "sendTestEmail": "Надіслати тестовий лист",
+ "exportToJSON": "Експортувати в JSON",
+ "importFromJSON": "Імпортувати з JSON",
+ "clearFilters": "Очистити фільтри",
+ "removeUser": "Видалити користувача"
},
- "fetch": {
- "success": "",
- "failed": ""
+ "charts": {
+ "labels": {
+ "averageResponseTime": "Середній час відповіді",
+ "downtime": "Час простою",
+ "high": "",
+ "low": "",
+ "uptime": "Час роботи"
+ },
+ "histogram": {
+ "avg": "Сер: {{value}} мс",
+ "max": "Макс: {{value}} мс"
+ }
},
- "delete": {
- "success": "",
- "failed": ""
+ "dialogs": {
+ "delete": {
+ "description": "Цю дію не можна скасувати.",
+ "title": "Ви впевнені, що хочете це видалити?"
+ }
},
- "edit": {
- "success": "",
- "failed": ""
+ "labels": {
+ "active": "Активний",
+ "paused": "призупинено",
+ "na": "Н/Д",
+ "resolved": "Вирішено",
+ "responseTime": "Час відповіді"
},
- "test": {
- "success": "",
- "failed": ""
- }
- },
- "testLocale": "",
- "add": "",
- "monitors": "",
- "distributedUptimeStatusCreateStatusPage": "",
- "distributedUptimeStatusCreateStatusPageAccess": "",
- "distributedUptimeStatusCreateStatusPageReady": "",
- "distributedUptimeStatusBasicInfoHeader": "",
- "distributedUptimeStatusBasicInfoDescription": "",
- "distributedUptimeStatusLogoHeader": "",
- "distributedUptimeStatusLogoDescription": "",
- "distributedUptimeStatusLogoUploadButton": "",
- "distributedUptimeStatusStandardMonitorsHeader": "",
- "distributedUptimeStatusStandardMonitorsDescription": "",
- "distributedUptimeStatusCreateYour": "",
- "distributedUptimeStatusEditYour": "",
- "distributedUptimeStatusPublishedLabel": "",
- "distributedUptimeStatusCompanyNameLabel": "",
- "distributedUptimeStatusPageAddressLabel": "",
- "distributedUptimeStatus30Days": "",
- "distributedUptimeStatus60Days": "",
- "distributedUptimeStatus90Days": "",
- "distributedUptimeStatusPageNotSetUp": "",
- "distributedUptimeStatusContactAdmin": "",
- "distributedUptimeStatusPageNotPublic": "",
- "distributedUptimeStatusPageDeleteDialog": "",
- "distributedUptimeStatusPageDeleteConfirm": "",
- "distributedUptimeStatusPageDeleteDescription": "",
- "distributedUptimeStatusDevices": "",
- "distributedUptimeStatusUpt": "",
- "distributedUptimeStatusUptBurned": "",
- "distributedUptimeStatusUptLogo": "",
- "incidentsTableNoIncidents": "",
- "incidentsTablePaginationLabel": "",
- "incidentsTableMonitorName": "",
- "incidentsTableStatus": "",
- "incidentsTableDateTime": "",
- "incidentsTableStatusCode": "",
- "incidentsTableMessage": "",
- "incidentsOptionsHeader": "",
- "incidentsOptionsHeaderFilterBy": "",
- "incidentsOptionsHeaderFilterAll": "",
- "incidentsOptionsHeaderFilterDown": "",
- "incidentsOptionsHeaderFilterCannotResolve": "",
- "incidentsOptionsHeaderShow": "",
- "incidentsOptionsHeaderLastHour": "",
- "incidentsOptionsHeaderLastDay": "",
- "incidentsOptionsHeaderLastWeek": "",
- "incidentsOptionsPlaceholderAllServers": "",
- "infrastructureCreateYour": "",
- "infrastructureCreateGeneralSettingsDescription": "",
- "infrastructureServerRequirement": "",
- "infrastructureCustomizeAlerts": "",
- "infrastructureAlertNotificationDescription": "",
- "infrastructureCreateMonitor": "",
- "infrastructureProtocol": "",
- "infrastructureServerUrlLabel": "",
- "infrastructureDisplayNameLabel": "",
- "infrastructureAuthorizationSecretLabel": "",
- "gb": "",
- "mb": "",
- "mem": "",
- "memoryUsage": "",
- "cpu": "",
- "cpuUsage": "",
- "cpuTemperature": "",
- "diskUsage": "",
- "used": "",
- "total": "",
- "cores": "",
- "frequency": "",
- "status": "",
- "cpuPhysical": "",
- "cpuLogical": "",
- "cpuFrequency": "",
- "avgCpuTemperature": "",
- "memory": "",
- "disk": "",
- "uptime": "",
- "os": "",
- "host": "",
- "actions": "",
- "integrations": "",
- "integrationsPrism": "",
- "integrationsSlack": "",
- "integrationsSlackInfo": "",
- "integrationsDiscord": "",
- "integrationsDiscordInfo": "",
- "integrationsZapier": "",
- "integrationsZapierInfo": "",
- "commonSave": "",
- "createYour": "",
- "createMonitor": "",
- "pause": "",
- "resume": "",
- "editing": "",
- "url": "",
- "access": "",
- "timezone": "",
- "features": "",
- "administrator": "",
- "loginHere": "",
- "displayName": "",
- "urlMonitor": "",
- "portToMonitor": "",
- "websiteMonitoring": "",
- "websiteMonitoringDescription": "",
- "pingMonitoring": "",
- "pingMonitoringDescription": "",
- "dockerContainerMonitoring": "",
- "dockerContainerMonitoringDescription": "",
- "portMonitoring": "",
- "portMonitoringDescription": "",
- "createMaintenanceWindow": "",
- "createMaintenance": "",
- "editMaintenance": "",
- "maintenanceWindowName": "",
- "friendlyNameInput": "",
- "friendlyNamePlaceholder": "",
- "maintenanceRepeat": "",
- "maintenance": "",
- "duration": "",
- "addMonitors": "",
- "window": "",
- "cancel": "",
- "message": "",
- "low": "",
- "high": "",
- "statusCode": "",
- "date&Time": "",
- "type": "",
- "statusPageName": "",
- "publicURL": "",
- "repeat": "",
- "edit": "",
- "createA": "",
- "remove": "",
- "maintenanceWindowDescription": "",
- "startTime": "",
- "timeZoneInfo": "",
- "monitorsToApply": "",
- "nextWindow": "",
- "notFoundButton": "",
- "pageSpeedConfigureSettingsDescription": "",
- "monitorDisplayName": "",
- "whenNewIncident": "",
- "notifySMS": "",
- "notifyEmails": "",
- "seperateEmails": "",
- "checkFrequency": "",
- "chooseGame": "",
- "matchMethod": "",
- "expectedValue": "",
- "deleteDialogTitle": "",
- "deleteDialogDescription": "",
- "pageSpeedMonitor": "",
- "shown": "",
- "ago": "",
- "companyName": "",
- "pageSpeedDetailsPerformanceReport": "",
- "pageSpeedDetailsPerformanceReportCalculator": "",
- "checkingEvery": "",
- "statusPageCreateSettings": "",
- "basicInformation": "",
- "statusPageCreateBasicInfoDescription": "",
- "statusPageCreateSelectTimeZoneDescription": "",
- "statusPageCreateAppearanceDescription": "",
- "statusPageCreateSettingsCheckboxLabel": "",
- "statusPageCreateBasicInfoStatusPageAddress": "",
- "statusPageCreateTabsContent": "",
- "statusPageCreateTabsContentDescription": "",
- "statusPageCreateTabsContentFeaturesDescription": "",
- "showCharts": "",
- "showUptimePercentage": "",
- "removeLogo": "",
- "statusPageStatus": "",
- "statusPageStatusContactAdmin": "",
- "statusPageStatusNotPublic": "",
- "statusPageStatusNoPage": "",
- "statusPageStatusServiceStatus": "",
- "deleteStatusPage": "",
- "deleteStatusPageConfirm": "",
- "deleteStatusPageDescription": "",
- "uptimeCreate": "",
- "uptimeCreateJsonPath": "",
- "uptimeCreateJsonPathQuery": "",
- "maintenanceTableActionMenuDialogTitle": "",
- "infrastructureEditYour": "",
- "infrastructureEditMonitor": "",
- "infrastructureMonitorCreated": "",
- "infrastructureMonitorUpdated": "",
- "errorInvalidTypeId": "",
- "errorInvalidFieldId": "",
- "inviteNoTokenFound": "",
- "pageSpeedWarning": "",
- "pageSpeedLearnMoreLink": "",
- "pageSpeedAddApiKey": "",
- "update": "",
- "invalidFileFormat": "",
- "invalidFileSize": "",
- "ClickUpload": "",
- "DragandDrop": "",
- "MaxSize": "",
- "SupportedFormats": "",
- "FirstName": "",
- "LastName": "",
- "EmailDescriptionText": "",
- "YourPhoto": "",
- "PhotoDescriptionText": "",
- "save": "",
- "DeleteDescriptionText": "",
- "DeleteAccountWarning": "",
- "DeleteWarningTitle": "",
- "bulkImport": {
- "title": "",
- "selectFileTips": "",
- "selectFileDescription": "",
- "selectFile": "",
- "parsingFailed": "",
- "uploadSuccess": "",
- "validationFailed": "",
- "noFileSelected": "",
- "fallbackPage": ""
- },
- "DeleteAccountTitle": "",
- "DeleteAccountButton": "",
- "publicLink": "",
- "maskedPageSpeedKeyPlaceholder": "",
- "reset": "",
- "ignoreTLSError": "",
- "tlsErrorIgnored": "",
- "ignoreTLSErrorDescription": "",
- "createNew": "",
- "greeting": {
- "prepend": "",
- "append": "",
- "overview": ""
- },
- "roles": {
- "superAdmin": "",
- "admin": "",
- "teamMember": "",
- "demoUser": ""
- },
- "teamPanel": {
- "teamMembers": "",
- "filter": {
- "all": "",
- "member": ""
+ "form": {
+ "role": {
+ "option": {
+ "role": {
+ "label": "Ролі"
+ }
+ }
+ },
+ "name": {
+ "option": {
+ "firstName": {
+ "label": "",
+ "placeholder": ""
+ },
+ "lastName": {
+ "label": "",
+ "placeholder": ""
+ }
+ }
+ },
+ "email": {
+ "option": {
+ "email": {
+ "label": "Електронна пошта",
+ "placeholder": "you@example.com"
+ }
+ }
+ }
},
- "inviteTeamMember": "",
- "inviteNewTeamMember": "",
- "inviteDescription": "",
- "email": "",
- "selectRole": "",
- "inviteLink": "",
- "cancel": "",
- "noMembers": "",
- "getToken": "",
- "emailToken": "",
"table": {
- "name": "",
- "email": "",
- "role": "",
- "created": ""
+ "empty": "Тут нічого немає",
+ "headers": {
+ "actions": "",
+ "dateTime": "Дата і час",
+ "message": "Повідомлення",
+ "monitor": "Монітор",
+ "monitorId": "ID монітора",
+ "name": "Ім'я",
+ "status": "Статус",
+ "type": "",
+ "url": "URL",
+ "interval": "Інтервал",
+ "active": "Активний",
+ "responseTime": "Час відповіді"
+ }
}
},
- "monitorState": {
- "paused": "",
- "resumed": "",
- "active": ""
- },
- "menu": {
- "uptime": "",
- "pagespeed": "",
- "infrastructure": "",
- "incidents": "",
- "statusPages": "",
- "maintenance": "",
- "integrations": "",
- "settings": "",
- "support": "",
- "discussions": "",
- "docs": "",
- "changelog": "",
- "profile": "",
- "password": "",
- "team": "",
- "logOut": "",
- "notifications": "",
- "logs": ""
- },
- "settingsEmailUser": "",
- "state": "",
- "statusBreadCrumbsStatusPages": "",
- "statusBreadCrumbsDetails": "",
- "commonSaving": "",
- "navControls": "",
- "incidentsPageTitle": "",
- "passwordPanel": {
- "passwordChangedSuccess": "",
- "passwordInputIncorrect": "",
- "currentPassword": "",
- "enterCurrentPassword": "",
- "newPassword": "",
- "enterNewPassword": "",
- "confirmNewPassword": "",
- "passwordRequirements": "",
- "saving": ""
- },
- "emailSent": "",
- "failedToSendEmail": "",
- "settingsTestEmailSuccess": "",
- "settingsTestEmailFailed": "",
- "settingsTestEmailFailedWithReason": "",
- "settingsTestEmailUnknownError": "",
- "statusMsg": {
- "paused": "",
- "up": "",
- "down": "",
- "pending": ""
- },
- "uptimeGeneralInstructions": {
- "http": "",
- "ping": "",
- "docker": "",
- "port": "",
- "game": ""
- },
- "common": {
- "appName": "",
- "monitoringAgentName": "",
- "buttons": {
- "toggleTheme": ""
+ "components": {
+ "imageUpload": {
+ "clickToUpload": "Натисніть, щоб завантажити",
+ "dragAndDrop": "",
+ "supportedFormats": "",
+ "maxSize": "",
+ "orDragAndDrop": "або перетягніть файл",
+ "errors": {
+ "invalidFileSize": "",
+ "invalidFileFormat": ""
+ }
+ },
+ "headerStatusPageControls": {
+ "publicLink": ""
+ },
+ "headerTimeRange": {
+ "labels": {
+ "day": "День",
+ "month": "Місяць",
+ "recent": "Нещодавно",
+ "week": "Тиждень"
+ },
+ "description": {
+ "recent": "Показано статистику за останні 2 години.",
+ "day": "Показано статистику за останні 24 години.",
+ "week": "Показано статистику за останні 7 днів.",
+ "month": "Показано статистику за останні 30 днів."
+ }
},
- "toasts": {
- "networkError": "",
- "checkConnection": "",
- "unknownError": ""
+ "offlineBanner": {
+ "serverUnreachable": "Не вдається з'єднатися з сервером",
+ "retry": "Повторити",
+ "retrying": "Повторна спроба...",
+ "reconnected": ""
+ },
+ "sidebar": {
+ "menu": {
+ "uptime": "",
+ "pagespeed": "",
+ "infrastructure": "",
+ "notifications": "",
+ "checks": "Перевірки",
+ "incidents": "",
+ "statusPages": "",
+ "maintenance": "",
+ "logs": "",
+ "settings": ""
+ },
+ "bottomMenu": {
+ "support": "",
+ "discussions": "",
+ "docs": "",
+ "changelog": ""
+ },
+ "accountMenu": {
+ "profile": "Профіль",
+ "password": "Пароль",
+ "team": "Команда"
+ },
+ "starPrompt": {
+ "title": "Оцінити Checkmate",
+ "description": "Переглядайте останні оновлення та допомагайте розвивати спільноту на GitHub"
+ },
+ "authFooter": {
+ "navControls": "",
+ "logOut": "",
+ "roles": {
+ "superAdmin": "Суперадміністратор",
+ "admin": "Адміністратор",
+ "user": "Користувач",
+ "demoUser": ""
+ }
+ }
+ },
+ "starPrompt": {
+ "title": "Оцінити Checkmate",
+ "description": "Переглядайте останні оновлення та допомагайте розвивати спільноту на GitHub"
}
},
- "auth": {
- "common": {
- "navigation": {
- "continue": "",
- "back": ""
+ "pages": {
+ "notFound": {
+ "title": "Ой ні! Ви впустили суші!",
+ "subtitle": "Або URL не існує, або у Вас немає доступу до нього."
+ },
+ "account": {
+ "tabs": {
+ "profile": "Профіль",
+ "password": "Пароль",
+ "team": "Команда"
},
- "inputs": {
- "email": {
- "label": "",
- "placeholder": "",
- "errors": {
- "empty": "",
- "invalid": ""
- }
- },
- "password": {
- "label": "",
- "rules": {
- "length": {
- "beginning": "",
- "highlighted": ""
- },
- "special": {
- "beginning": "",
- "highlighted": ""
- },
- "number": {
- "beginning": "",
- "highlighted": ""
- },
- "uppercase": {
- "beginning": "",
- "highlighted": ""
- },
- "lowercase": {
- "beginning": "",
- "highlighted": ""
- },
- "match": {
- "beginning": "",
- "highlighted": ""
+ "form": {
+ "name": {
+ "title": "Ім'я",
+ "description": "Оновіть Вашу особисту інформацію"
+ },
+ "photo": {
+ "title": "Фото профілю",
+ "description": "Завантажте фото профілю"
+ },
+ "currentPassword": {
+ "title": "Поточний пароль",
+ "description": "Введіть поточний пароль для підтвердження Вашої особи",
+ "option": {
+ "label": "Поточний пароль",
+ "placeholder": "Введіть поточний пароль"
+ }
+ },
+ "newPassword": {
+ "title": "Новий пароль",
+ "description": "Оберіть надійний пароль довжиною не менше 8 символів",
+ "option": {
+ "newPassword": {
+ "label": "Новий пароль",
+ "placeholder": "Введіть новий пароль"
+ },
+ "confirm": {
+ "label": "Підтвердити пароль",
+ "placeholder": "Підтвердити новий пароль"
}
- },
- "errors": {
- "empty": "",
- "length": "",
- "uppercase": "",
- "lowercase": "",
- "number": "",
- "special": "",
- "incorrect": ""
}
},
- "passwordConfirm": {
- "label": "",
- "placeholder": "",
- "errors": {
- "empty": "",
- "different": ""
+ "deleteAccount": {
+ "title": "Видалити обліковий запис",
+ "description": "Ця дія є остаточною і не може бути скасована"
+ }
+ },
+ "team": {
+ "filter": {
+ "placeholder": "Фільтрувати за роллю",
+ "all": "",
+ "admin": "Адміністратор",
+ "member": ""
+ },
+ "table": {
+ "headers": {
+ "email": "Електронна пошта",
+ "role": "",
+ "created": ""
}
},
- "firstName": {
- "label": "",
- "placeholder": "",
- "errors": {
- "empty": "",
- "length": "",
- "pattern": ""
+ "addMember": {
+ "title": "Зареєструвати нового учасника команди",
+ "description": "Створіть новий обліковий запис. Безпечно передайте облікові дані після створення."
+ },
+ "invite": {
+ "title": "Запросити учасника команди",
+ "description": "Надіслати запрошення приєднатися до Вашої команди",
+ "email": {
+ "label": "Адреса електронної пошти",
+ "placeholder": "Введіть адресу електронної пошти"
+ },
+ "role": {
+ "label": "Роль",
+ "placeholder": "Оберіть роль"
+ },
+ "linkLabel": "Посилання для запрошення"
+ }
+ }
+ },
+ "auth": {
+ "common": {
+ "passwordRules": {
+ "length": {
+ "beginning": "",
+ "highlighted": ""
+ },
+ "lowercase": {
+ "beginning": "",
+ "highlighted": ""
+ },
+ "match": {
+ "beginning": "",
+ "highlighted": ""
+ },
+ "number": {
+ "beginning": "",
+ "highlighted": ""
+ },
+ "special": {
+ "beginning": "",
+ "highlighted": ""
+ },
+ "uppercase": {
+ "beginning": "",
+ "highlighted": ""
}
},
- "lastName": {
- "label": "",
- "placeholder": "",
- "errors": {
- "empty": "",
- "length": "",
- "pattern": ""
+ "form": {
+ "option": {
+ "email": {
+ "label": "Електронна пошта",
+ "placeholder": "me@example.com"
+ },
+ "password": {
+ "label": "Пароль",
+ "placeholder": "********"
+ },
+ "confirmPassword": {
+ "label": "Підтвердити пароль"
+ }
}
}
},
- "errors": {
- "validation": ""
+ "login": {
+ "title": "Ласкаво просимо до Checkmate!",
+ "subtitle": "Увійдіть, щоб продовжити",
+ "submit": "Увійти",
+ "links": {
+ "forgotPassword": {
+ "text": "Забули пароль?",
+ "linkText": "Скинути пароль"
+ },
+ "register": {
+ "text": "Не маєте облікового запису?",
+ "linkText": "Зареєструватися тут"
+ }
+ }
+ },
+ "register": {
+ "title": "Ласкаво просимо до Checkmate!",
+ "subtitle": "Зареєструйтесь, щоб розпочати",
+ "submit": "Зареєструватися"
},
- "fields": {
- "password": {
- "errors": {
- "incorrect": ""
+ "forgotPassword": {
+ "title": "Забули пароль?",
+ "subtitle": "Не хвилюйтесь, ми надішлемо Вам інструкції для скидання.",
+ "submit": "Запит на відновлення",
+ "links": {
+ "login": {
+ "text": "Повернутися до",
+ "linkText": "входу"
}
}
+ },
+ "setNewPassword": {
+ "title": "Скинути пароль",
+ "subtitle": "Ваш новий пароль повинен відрізнятися від раніше використаних паролів."
}
},
- "login": {
- "heading": "",
- "subheadings": {
- "stepOne": "",
- "stepTwo": ""
- },
- "links": {
- "forgotPassword": "",
- "register": "",
- "forgotPasswordLink": "",
- "registerLink": ""
- },
- "toasts": {
- "success": "",
- "incorrectPassword": ""
+ "checks": {
+ "selects": {
+ "monitor": {
+ "all": "Усі монітори"
+ },
+ "status": {
+ "all": "Усі",
+ "down": "Недоступний",
+ "up": "Доступний"
+ }
},
- "errors": {
- "password": {
- "incorrect": ""
+ "table": {
+ "empty": "Немає невдалих перевірок за цей період",
+ "headers": {
+ "statusCode": "Код статусу",
+ "location": "Розташування"
}
}
},
- "registration": {
- "heading": {
- "superAdmin": "",
- "user": ""
- },
- "subheadings": {
- "stepOne": "",
- "stepTwo": "",
- "stepThree": ""
+ "common": {
+ "monitors": {
+ "actions": {
+ "configure": "Налаштувати",
+ "delete": "Видалити",
+ "generateToken": "Згенерувати токен",
+ "details": "Деталі",
+ "incidents": "Інциденти",
+ "inviteMember": "Запросити учасника",
+ "openSite": "Відкрити сайт",
+ "pause": "Призупинити",
+ "resume": "Відновити"
+ },
+ "statBoxes": {
+ "activeFor": "Активний протягом",
+ "certificateExpiry": "Закінчення сертифіката",
+ "lastCheck": "Остання перевірка",
+ "lastResponseTime": "Останній час відповіді"
+ },
+ "status": {
+ "down": "недоступний",
+ "breached": "поріг перевищено",
+ "initializing": "ініціалізація",
+ "maintenance": "обслуговування",
+ "paused": "призупинено",
+ "total": "усього",
+ "up": "доступний"
+ },
+ "monitorTypes": {
+ "optionDocker": "Docker",
+ "optionGame": "Гра",
+ "optionHttp": "HTTP(S)",
+ "optionPing": "Ping",
+ "optionPort": "Порт",
+ "optionPagespeed": "PageSpeed",
+ "optionHardware": "Інфраструктура",
+ "optionGrpc": "gRPC",
+ "optionWebSocket": "WebSocket"
+ }
+ }
+ },
+ "createMonitor": {
+ "form": {
+ "advanced": {
+ "description": "Додаткові налаштування для складних випадків",
+ "option": {
+ "advancedMatching": {
+ "label": "Використовувати розширене зіставлення"
+ },
+ "expectedValue": {
+ "label": "Очікуване значення"
+ },
+ "jsonPath": {
+ "description": "Цей вираз буде обчислено для JSON-даних відповіді, а результат буде зіставлено з очікуваним значенням. Дивіться документацію мови запитів на jmespath.org.",
+ "label": "Вираз JSONPath"
+ },
+ "matchMethod": {
+ "label": "Метод зіставлення",
+ "equal": "Дорівнює",
+ "include": "Містить",
+ "regex": "Regex"
+ }
+ },
+ "title": "Розширені налаштування"
+ },
+ "frequency": {
+ "description": "Як часто Ви хочете перевіряти стан цього монітора?",
+ "option": {
+ "frequency": {
+ "label": "Частота перевірки",
+ "value": {
+ "fifteenMinutes": "15 хвилин",
+ "fifteenSeconds": "15 секунд",
+ "fiveMinutes": "5 хвилин",
+ "fourMinutes": "4 хвилини",
+ "oneMinute": "1 хвилина",
+ "tenMinutes": "10 хвилин",
+ "thirtyMinutes": "30 хвилин",
+ "thirtySeconds": "30 секунд",
+ "threeMinutes": "3 хвилини",
+ "twoMinutes": "2 хвилини"
+ }
+ }
+ },
+ "title": "Частота перевірки"
+ },
+ "general": {
+ "option": {
+ "container": {
+ "label": "Ім'я/ID контейнера",
+ "placeholder": "my-app або abcd1234"
+ },
+ "host": {
+ "label": "Хост",
+ "placeholder": "192.168.1.100 або example.com"
+ },
+ "name": {
+ "label": "Відображуване ім'я",
+ "placeholder": "напр. Мій сайт"
+ },
+ "secret": {
+ "label": "Секрет авторизації",
+ "placeholder": "Введіть Ваш секретний ключ"
+ },
+ "url": {
+ "label": "URL",
+ "placeholder": "https://www.google.com"
+ },
+ "game": {
+ "label": "Обрати гру",
+ "placeholder": "Оберіть гру"
+ },
+ "port": {
+ "label": "Порт для моніторингу",
+ "placeholder": "80"
+ },
+ "grpcServiceName": {
+ "label": "Назва сервісу",
+ "placeholder": "напр. my.service.v1 (залиште порожнім для загальної перевірки)"
+ },
+ "wsUrl": {
+ "label": "WebSocket URL",
+ "placeholder": "wss://example.com/socket"
+ }
+ },
+ "title": "Загальні налаштування",
+ "description": {
+ "http": "Введіть URL або IP для моніторингу (напр., https://example.com/ або 192.168.1.100) та додайте зрозуміле ім'я для відображення на панелі.",
+ "ping": "",
+ "port": "",
+ "docker": "",
+ "game": "",
+ "pagespeed": "Відстежуйте швидкість завантаження сторінки, показники Core Web Vitals та оцінки оптимізації Вашого сайту.",
+ "grpc": "Введіть ім'я хоста та порт gRPC-сервера, за бажанням вкажіть назву сервісу для перевірки стану та додайте відображуване ім'я.",
+ "websocket": "Введіть WebSocket URL для моніторингу (напр., wss://example.com/socket) та додайте відображуване ім'я.",
+ "hardware": "Моніторинг CPU, пам'яті, використання диска та температури Вашої інфраструктури."
+ }
+ },
+ "ignoreTls": {
+ "description": "Налаштуйте перевірку сертифікатів TLS/SSL для HTTPS-з'єднань.",
+ "option": {
+ "tls": {
+ "label": "Ігнорувати помилки TLS/SSL"
+ }
+ },
+ "title": "Налаштування TLS/SSL"
+ },
+ "incidents": {
+ "description": "Ковзне вікно використовується для визначення моменту, коли монітор стає недоступним. Статус монітора зміниться лише тоді, коли відсоток перевірок у ковзному вікні досягне вказаного значення.",
+ "option": {
+ "checks": {
+ "label": "Кількість перевірок у ковзному вікні"
+ },
+ "percentage": {
+ "label": "Який відсоток перевірок у ковзному вікні має зазнати невдачі/успіху перед зміною статусу монітора?"
+ }
+ },
+ "title": "Інциденти"
+ },
+ "notifications": {
+ "description": "Оберіть канали сповіщень, які Ви хочете використовувати",
+ "title": "Сповіщення"
+ },
+ "type": {
+ "description": "Оберіть тип перевірки",
+ "optionDockerDescription": "Використовуйте Docker для моніторингу роботи контейнера.",
+ "optionGameDescription": "Моніторинг доступності конкретного ігрового сервера.",
+ "optionGrpcDescription": "Моніторинг gRPC-сервісів за допомогою стандартного протоколу перевірки стану.",
+ "optionWebSocketDescription": "Моніторинг WebSocket-ендпоінтів на предмет стану з'єднання та часу відповіді.",
+ "optionHttpDescription": "Використовуйте HTTP(S) для моніторингу Вашого сайту або API-ендпоінту.",
+ "optionPingDescription": "Використовуйте ICMP Ping для моніторингу доступності сервера.",
+ "optionPortDescription": "Моніторинг відкритості конкретного порту на сервері.",
+ "title": "Тип"
+ },
+ "thresholds": {
+ "title": "Порогові значення сповіщень",
+ "description": "Визначте порогові значення, при яких мають спрацьовувати сповіщення для цього монітора обладнання.",
+ "option": {
+ "cpuThreshold": {
+ "label": "Поріг сповіщення CPU (%)"
+ },
+ "memoryThreshold": {
+ "label": "Поріг сповіщення пам'яті (%)"
+ },
+ "diskThreshold": {
+ "label": "Поріг сповіщення диска (%)"
+ },
+ "tempThreshold": {
+ "label": "Поріг сповіщення температури (°C)"
+ }
+ }
+ },
+ "geoChecks": {
+ "title": "Геоперевірки",
+ "description": "Запускайте перевірки з різних географічних локацій для моніторингу глобальної доступності та продуктивності.",
+ "option": {
+ "enabled": {
+ "label": "Увімкнути геоперевірки"
+ },
+ "locations": {
+ "label": "Розташування",
+ "placeholder": "Оберіть розташування",
+ "options": {
+ "EU": "Європа",
+ "NA": "Північна Америка",
+ "AS": "Азія",
+ "SA": "Південна Америка",
+ "AF": "Африка",
+ "OC": "Океанія"
+ }
+ },
+ "interval": {
+ "label": "Інтервал перевірки",
+ "value": {
+ "fiveMinutes": "5 хвилин",
+ "tenMinutes": "10 хвилин",
+ "fifteenMinutes": "15 хвилин",
+ "thirtyMinutes": "30 хвилин"
+ }
+ }
+ }
+ },
+ "url": {
+ "title": "IP/URL монітора на сторінці статусу",
+ "description": "Відображати IP-адресу або URL монітора на публічній сторінці статусу. Якщо вимкнено, буде показано лише назву монітора для захисту конфіденційної інформації.",
+ "option": {
+ "showURL": {
+ "label": "Відображати IP/URL на сторінці статусу",
+ "enabled": "Увімкнено",
+ "disabled": "Вимкнено"
+ }
+ }
+ },
+ "stats": {
+ "title": "Історія моніторингу",
+ "description": "Очистити всю історію моніторингу та статистику Вашої команди. Ця дія незворотна.",
+ "buttonText": "Очистити всю статистику",
+ "dialog": {
+ "title": "Очистити всю історію моніторингу?",
+ "description": "Це назавжди видалить всю історію моніторингу, статистику та дані перевірок Вашої команди. Цю дію не можна скасувати.",
+ "confirm": "Так, очистити всю статистику"
+ }
+ }
+ }
+ },
+ "editUser": {
+ "form": {
+ "roles": {
+ "title": "Ролі",
+ "description": "Призначте ролі користувачу. Можна обрати кілька ролей."
+ }
},
- "description": {
- "superAdmin": "",
- "user": ""
+ "dialog": {
+ "removeUser": {
+ "title": "Видалити користувача",
+ "content": "Ви впевнені, що хочете видалити {{name}} з Вашої команди? Цю дію не можна скасувати."
+ }
+ }
+ },
+ "incidents": {
+ "dialog": {
+ "resolveIncident": {
+ "title": "Вирішити інцидент",
+ "option": {
+ "comment": {
+ "label": "Коментар (необов'язково)",
+ "placeholder": "Додайте коментар щодо вирішення..."
+ }
+ }
+ },
+ "details": {
+ "analysis": "Аналіз інциденту",
+ "comment": "Коментар:",
+ "detailsLabel": "Деталі",
+ "downtime": "Час простою:",
+ "message": "Повідомлення:",
+ "monitor": "Монітор:",
+ "overview": "Огляд",
+ "resolutionDetails": "Деталі вирішення",
+ "resolutionType": "Тип:",
+ "resolutionTypes": {
+ "automatic": "Автоматично",
+ "manual": "Вручну"
+ },
+ "resolve": "Вирішити інцидент",
+ "resolvedAt": "Вирішено о:",
+ "resolvedBy": "Вирішив:",
+ "startedAt": "Початок:",
+ "status": "Статус:",
+ "statusCode": "Код статусу:",
+ "timeline": "Хронологія",
+ "title": "Деталі інциденту",
+ "url": "URL:"
+ }
},
- "gettingStartedButton": {
- "superAdmin": "",
- "user": ""
+ "filters": {
+ "allMonitors": "Усі монітори",
+ "monitor": "Монітор",
+ "resolutionType": "Тип вирішення",
+ "resolutionTypes": {
+ "manual": "Вручну",
+ "automatic": "Автоматично",
+ "all": "Усі"
+ }
},
- "termsAndPolicies": "",
- "links": {
- "login": ""
+ "summaryCard": {
+ "activeIncidents": {
+ "title": "Активні інциденти",
+ "active_zero": "Немає активних інцидентів",
+ "active_one": "{{count}} активний інцидент",
+ "active_other": "{{count}} активних інцидентів"
+ },
+ "incidentStats": {
+ "avgResolutionTime": "Середній час вирішення",
+ "mostAffectedMonitor": "Найвразливіший монітор",
+ "title": "Статистика інцидентів",
+ "totalIncidents": "Усього інцидентів"
+ },
+ "latestIncidents": {
+ "title": "Останні інциденти"
+ }
},
- "toasts": {
- "success": ""
+ "table": {
+ "actions": {
+ "details": "Деталі",
+ "goToMonitor": "Перейти до монітора",
+ "resolveManually": "Вирішити вручну"
+ },
+ "activeIncidents": "Активні інциденти",
+ "headers": {
+ "endTime": "Час завершення",
+ "resolutionType": "Тип вирішення",
+ "startTime": "",
+ "statusCode": "Код статусу"
+ },
+ "resolvedIncidents": "Вирішені інциденти",
+ "status": {
+ "active": "Активний",
+ "resolved": "Вирішено"
+ }
}
},
- "forgotPassword": {
- "heading": "",
- "subheadings": {
- "stepOne": "",
- "stepTwo": "",
- "stepThree": "",
- "stepFour": ""
- },
- "buttons": {
- "openEmail": "",
- "resetPassword": ""
- },
- "imageAlts": {
- "passwordKey": "",
- "email": "",
- "lock": "",
- "passwordConfirm": ""
- },
- "links": {
- "login": "",
- "resend": ""
- },
- "toasts": {
- "sent": "",
- "emailNotFound": "",
- "redirect": "",
- "success": "",
- "error": ""
- }
- }
- },
- "errorPages": {
- "serverUnreachable": {
- "toasts": {
- "reconnected": "",
- "stillUnreachable": ""
- },
- "alertBox": "",
- "description": "",
- "retryButton": {
- "default": "",
- "processing": ""
+ "infrastructure": {
+ "charts": {
+ "labels": {
+ "cpu": "Використання CPU",
+ "disk": "Використання диска",
+ "memory": "Використання пам'яті",
+ "netBytesRecv": "{{name}} - Отримано байтів",
+ "netBytesSent": "{{name}} - Надіслано байтів",
+ "temp": "Темп."
+ }
+ },
+ "gauges": {
+ "cpu": {
+ "lowerLabel": "Макс. частота",
+ "title": "Використання CPU",
+ "upperLabel": "Поточна частота"
+ },
+ "disk": {
+ "lowerLabel": "Вільно",
+ "title": "Використання диска {{idx}}",
+ "upperLabel": "Використано"
+ },
+ "memory": {
+ "lowerLabel": "Вільно",
+ "title": "Використання пам'яті",
+ "upperLabel": "Використано"
+ }
+ },
+ "statBoxes": {
+ "avgCpuTemperature": "",
+ "cpuFrequency": "",
+ "cpuLogical": "",
+ "cpuPhysical": "",
+ "disk": "Диск",
+ "memory": "Пам'ять",
+ "os": ""
+ },
+ "table": {
+ "headers": {
+ "cpu": "CPU",
+ "disk": "Диск",
+ "memory": "Пам'ять"
+ }
+ },
+ "tabs": {
+ "labels": {
+ "network": "Мережа",
+ "overview": "Огляд"
+ }
+ },
+ "fallback": {
+ "actionButton": "Створити монітор!",
+ "checks": "Track the performance of your servers,Identify bottlenecks and optimize usage,Ensure reliability with real-time monitoring",
+ "title": "Монітор інфраструктури використовується для:"
}
- }
- },
- "createNotifications": {
- "title": "",
- "nameSettings": {
- "title": "",
- "description": "",
- "nameLabel": "",
- "namePlaceholder": ""
- },
- "typeSettings": {
- "title": "",
- "description": "",
- "typeLabel": ""
- },
- "emailSettings": {
- "title": "",
- "description": "",
- "emailLabel": "",
- "emailPlaceholder": ""
- },
- "slackSettings": {
- "title": "",
- "description": "",
- "webhookLabel": "",
- "webhookPlaceholder": ""
- },
- "pagerdutySettings": {
- "title": "",
- "description": "",
- "integrationKeyLabel": "",
- "integrationKeyPlaceholder": ""
- },
- "discordSettings": {
- "title": "",
- "description": "",
- "webhookLabel": "",
- "webhookPlaceholder": ""
- },
- "webhookSettings": {
- "title": "",
- "description": "",
- "webhookLabel": "",
- "webhookPlaceholder": ""
- }
- },
- "notificationConfig": {
- "title": "",
- "description": ""
- },
- "monitorStatus": {
- "checkingEvery": "",
- "withCaptureAgent": "",
- "up": "",
- "down": "",
- "paused": ""
- },
- "advancedMatching": "",
- "sendTestNotifications": "",
- "testNotificationsDisabled": "",
- "selectAll": "",
- "showAdminLoginLink": "",
- "logsPage": {
- "title": "",
- "description": "",
- "tabs": {
- "queue": "",
- "logs": ""
- },
- "toast": {
- "fetchLogsSuccess": ""
},
- "logLevelSelect": {
- "title": "",
- "values": {
- "all": "",
- "info": "",
- "warn": "",
- "error": "",
- "debug": ""
+ "logs": {
+ "tabs": {
+ "diagnostics": "Діагностика",
+ "logs": "",
+ "queue": ""
+ },
+ "logLevelSelect": {
+ "label": "Рівень логів"
+ },
+ "jobQueue": "Черга завдань",
+ "failedJobs": "Невдалі завдання",
+ "noLogs": "Логи не знайдено",
+ "metrics": {
+ "jobs": "Завдання",
+ "activeJobs": "Активні завдання",
+ "failingJobs": "Невдалі завдання",
+ "totalRuns": "Усього запусків",
+ "totalFailures": "Усього помилок"
+ },
+ "diagnostics": {
+ "stats": {
+ "eventLoopDelay": "Затримка циклу подій",
+ "uptime": "Час роботи",
+ "usedHeapSize": "Використаний розмір купи",
+ "totalHeapSize": "Загальний розмір купи",
+ "osMemoryLimit": "Обмеження пам'яті ОС"
+ },
+ "gauges": {
+ "heapAllocation": "Виділення купи",
+ "heapUsage": "Використання купи",
+ "heapUtilization": "Утилізація купи",
+ "instantCpuUsage": "Миттєве використання CPU",
+ "availableMemoryPercentage": "% доступної пам'яті",
+ "allocatedPercentage": "% виділено",
+ "usedSPercentage": "% від 1с використано CPU",
+ "total": "Усього",
+ "used": "Використано"
+ }
+ },
+ "table": {
+ "headers": {
+ "timestamp": "Мітка часу",
+ "level": "Рівень",
+ "service": "Сервіс",
+ "method": "Метод",
+ "monitorId": "ID монітора",
+ "runCount": "Кількість запусків",
+ "failCount": "Кількість помилок",
+ "lastRunAt": "Останній запуск",
+ "lockedAt": "Заблоковано о",
+ "lastFinishedAt": "Останнє завершення",
+ "lastRunTook": "Останній запуск тривав",
+ "lastFailedAt": "Остання помилка",
+ "failReason": "Причина помилки"
+ }
}
- }
- },
- "queuePage": {
- "title": "",
- "refreshButton": "",
- "flushButton": "",
- "jobTable": {
- "title": "",
- "idHeader": "",
- "urlHeader": "",
- "typeHeader": "",
- "activeHeader": "",
- "lockedAtHeader": "",
- "runCountHeader": "",
- "failCountHeader": "",
- "lastRunHeader": "",
- "lastFinishedAtHeader": "",
- "lastRunTookHeader": ""
- },
- "metricsTable": {
- "title": "",
- "metricHeader": "",
- "valueHeader": ""
},
- "failedJobTable": {
- "title": "",
- "monitorIdHeader": "",
- "monitorUrlHeader": "",
- "failCountHeader": "",
- "failedAtHeader": "",
- "failReasonHeader": ""
- }
- },
- "export": {
- "title": "",
- "success": "",
- "failed": ""
- },
- "monitorActions": {
- "title": "",
- "import": "",
- "export": ""
- },
- "settingsPage": {
- "aboutSettings": {
- "labelDevelopedBy": "",
- "labelVersion": "",
- "title": ""
- },
- "demoMonitorsSettings": {
- "buttonAddMonitors": "",
- "description": "",
- "title": ""
- },
- "emailSettings": {
- "buttonSendTestEmail": "",
- "description": "",
- "descriptionTransport": "",
- "labelAddress": "",
- "labelConnectionHost": "",
- "labelHost": "",
- "labelIgnoreTLS": "",
- "labelPassword": "",
- "labelPasswordSet": "",
- "labelPool": "",
- "labelPort": "",
- "labelRejectUnauthorized": "",
- "labelRequireTLS": "",
- "labelSecure": "",
- "labelTLSServername": "",
- "labelUser": "",
- "linkTransport": "",
- "placeholderUser": "",
- "title": ""
- },
- "pageSpeedSettings": {
- "description": "",
- "labelApiKeySet": "",
- "labelApiKey": "",
- "title": ""
+ "maintenanceWindow": {
+ "fallback": {
+ "actionButton": "Створити вікно обслуговування!",
+ "checks": "Mark your maintenance periods,Eliminate any misunderstandings,Stop sending alerts in maintenance windows",
+ "title": "Вікно обслуговування використовується для:"
+ },
+ "table": {
+ "headers": {
+ "nextWindow": "",
+ "repeat": ""
+ }
+ },
+ "form": {
+ "general": {
+ "title": "Загальні налаштування",
+ "description": "Встановіть назву та параметр повтору для вікна обслуговування.",
+ "option": {
+ "name": {
+ "label": "Ім'я",
+ "placeholder": "напр. Щотижневе обслуговування"
+ },
+ "repeat": {
+ "label": "Повтор"
+ }
+ }
+ },
+ "startDate": {
+ "title": "Дата початку",
+ "description": "Оберіть дату початку вікна обслуговування.",
+ "option": {
+ "startDate": {
+ "label": "Дата початку"
+ }
+ }
+ },
+ "startTime": {
+ "title": "Час початку",
+ "description": "Встановіть час початку та тривалість вікна обслуговування. Усі значення вказані в UTC",
+ "option": {
+ "duration": {
+ "label": "Тривалість"
+ },
+ "startTime": {
+ "label": "Час початку"
+ }
+ },
+ "monitors": {
+ "title": "Монітори",
+ "description": "Монітори, до яких застосовується вікно обслуговування",
+ "option": {
+ "addMonitors": {
+ "label": "Додати монітори"
+ }
+ }
+ }
+ }
+ }
},
- "saveButtonLabel": "",
- "statsSettings": {
- "clearAllStatsButton": "",
- "clearAllStatsDescription": "",
- "clearAllStatsDialogConfirm": "",
- "clearAllStatsDialogDescription": "",
- "clearAllStatsDialogTitle": "",
- "description": "",
- "labelTTL": "",
- "labelTTLOptional": "",
- "title": ""
+ "notifications": {
+ "fallback": {
+ "actionButton": "Створити канал",
+ "checks": "Alert teams about downtime or performance issues,Let engineers know when incidents happen,Keep administrators informed of system changes",
+ "title": "Канали сповіщень використовуються для:"
+ },
+ "form": {
+ "accessToken": {
+ "optionAccessToken": "Токен доступу",
+ "placeholder": "syt_YWxleF9ob2xsaWRheQ_VmtScmV0U2VjcmV0S2V5_abc123"
+ },
+ "address": {
+ "description": "Адреса, на яку надсилатимуться сповіщення.",
+ "optionAddress": "Адреса",
+ "placeholderEmail": "example@example.com",
+ "placeholderWebhook": "https://your-server.com/webhook",
+ "title": "Адреса"
+ },
+ "homeServer": {
+ "optionHomeServer": "Домашній сервер",
+ "placeholder": "example.com"
+ },
+ "matrix": {
+ "description": "Налаштуйте підключення до Matrix homeserver для сповіщень.",
+ "title": "Налаштування Matrix"
+ },
+ "notificationName": {
+ "description": "Описова назва каналу сповіщень",
+ "optionName": "Назва каналу",
+ "placeholder": "напр. Сповіщення продакшену",
+ "title": "Назва каналу"
+ },
+ "pagerDuty": {
+ "description": "Ваш ключ інтеграції PagerDuty для отримання сповіщень.",
+ "optionIntegrationKey": "Ключ інтеграції",
+ "placeholder": "a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6",
+ "title": "Ключ інтеграції"
+ },
+ "roomId": {
+ "optionRoomId": "ID кімнати",
+ "placeholder": "!abcdefg:matrix.org"
+ },
+ "type": {
+ "description": "Оберіть тип каналу сповіщень для створення.",
+ "optionType": "Тип",
+ "title": "Тип каналу"
+ },
+ "telegram": {
+ "title": "Налаштування Telegram",
+ "description": "",
+ "optionBotToken": "Токен бота",
+ "placeholderBotToken": "123456789:ABCdefGhIJKlmNoPQRsTUVwxyZ",
+ "optionChatId": "ID чату",
+ "placeholderChatId": "-1001234567890"
+ }
+ },
+ "table": {
+ "headers": {
+ "destination": "Призначення"
+ }
+ }
},
- "systemResetSettings": {
- "buttonRemoveAllMonitors": "",
- "description": "",
- "dialogConfirm": "",
- "dialogDescription": "",
- "dialogTitle": "",
- "title": ""
+ "pageSpeed": {
+ "charts": {
+ "common": {
+ "cls": "Сукупний зсув макету (CLS)",
+ "fcp": "Перше відображення вмісту (FCP)",
+ "lcp": "Найбільше відображення вмісту (LCP)",
+ "si": "Індекс швидкості (SI)",
+ "tbt": "Загальний час блокування (TBT)"
+ },
+ "legend": {
+ "title": "Звіт PageSpeed",
+ "weight": "Вага"
+ },
+ "pie": {
+ "title": "Звіт продуктивності"
+ }
+ },
+ "table": {
+ "headers": {
+ "pageSpeedScore": "Оцінка PageSpeed"
+ }
+ },
+ "fallback": {
+ "actionButton": "Створити монітор!",
+ "checks": "Report on the user experience of a page,Help analyze webpage speed,Give suggestions on how the page can be improved",
+ "title": "Монітор PageSpeed використовується для:"
+ }
},
- "timezoneSettings": {
- "description": "",
- "label": "",
- "title": ""
+ "settings": {
+ "form": {
+ "timezone": {
+ "title": "Часовий пояс відображення",
+ "description": "Оберіть часовий пояс для відображення дат і часу у додатку.",
+ "option": {
+ "timezone": {
+ "label": "Часовий пояс відображення"
+ }
+ }
+ },
+ "ui": {
+ "title": "Зовнішній вигляд",
+ "description": "Перемикайтесь між світлою та темною темами, змінюйте мову або налаштовуйте тип відображення графіків.",
+ "option": {
+ "theme": {
+ "label": "Режим теми",
+ "light": "Світла",
+ "dark": "Темна"
+ },
+ "language": {
+ "label": "Мова"
+ },
+ "chartType": {
+ "label": "Тип графіка",
+ "histogram": "Гістограма",
+ "heatmap": "Теплова карта"
+ }
+ }
+ },
+ "pagespeed": {
+ "title": "Ключ API Google PageSpeed",
+ "description": "Введіть Ваш ключ API Google PageSpeed для увімкнення моніторингу PageSpeed. Натисніть Скинути, щоб оновити ключ.",
+ "option": {
+ "apiKey": {
+ "label": "Ключ API PageSpeed",
+ "labelSet": "Ключ API встановлено. Натисніть Скинути, щоб змінити.",
+ "placeholder": "Введіть Ваш ключ API Google PageSpeed"
+ }
+ }
+ },
+ "url": {
+ "title": "IP/URL монітора на сторінці статусу",
+ "description": "Відображати IP-адресу або URL монітора на публічній сторінці статусу. Якщо вимкнено, буде показано лише назву монітора для захисту конфіденційної інформації.",
+ "option": {
+ "showURL": {
+ "label": "Відображати IP/URL на сторінці статусу",
+ "enabled": "Увімкнено",
+ "disabled": "Вимкнено"
+ }
+ }
+ },
+ "stats": {
+ "title": "Історія моніторингу",
+ "description": "Очистити всю історію моніторингу та статистику Вашої команди. Ця дія незворотна.",
+ "option": {
+ "clear": {
+ "label": "Очистити всю статистику. Це незворотно."
+ }
+ },
+ "dialog": {
+ "title": "Очистити всю історію моніторингу?",
+ "description": "Це не можна скасувати"
+ }
+ },
+ "retention": {
+ "title": "Збереження перевірок",
+ "description": "Встановіть, як довго зберігаються дані перевірок перед автоматичним очищенням.",
+ "option": {
+ "days": {
+ "label": "Період збереження (дні)",
+ "unlimited": "Необмежено"
+ }
+ }
+ },
+ "thresholds": {
+ "title": "Глобальні порогові значення",
+ "description": "Встановіть глобальні порогові значення CPU, пам'яті, диска та температури для моніторингу інфраструктури. Вони застосовуються до всіх моніторів обладнання, якщо не перевизначені.",
+ "option": {
+ "cpu": {
+ "label": "Поріг CPU (%)",
+ "placeholder": "1 - 100"
+ },
+ "memory": {
+ "label": "Поріг пам'яті (%)",
+ "placeholder": "1 - 100"
+ },
+ "disk": {
+ "label": "Поріг диска (%)",
+ "placeholder": "1 - 100"
+ },
+ "temperature": {
+ "label": "Поріг температури (°C)",
+ "placeholder": "1 - 150"
+ }
+ }
+ },
+ "email": {
+ "title": "Налаштування пошти",
+ "description": "Налаштуйте параметри електронної пошти для Вашої системи. Використовується для надсилання сповіщень та попереджень.",
+ "descriptionTransport": "",
+ "descriptionTransportLink": "Дивіться специфікації тут",
+ "option": {
+ "host": {
+ "label": "Хост пошти — ім'я хоста або IP-адреса для підключення",
+ "placeholder": "smtp.gmail.com"
+ },
+ "port": {
+ "label": "Порт пошти — порт для підключення",
+ "placeholder": "587"
+ },
+ "address": {
+ "label": "Адреса пошти — використовується для автентифікації",
+ "placeholder": "you@example.com"
+ },
+ "user": {
+ "label": "Користувач пошти — ім'я для автентифікації, замінює адресу пошти, якщо вказано",
+ "placeholder": "Залиште порожнім, якщо не потрібно"
+ },
+ "password": {
+ "label": "Пароль пошти — пароль для автентифікації",
+ "labelSet": "Пароль встановлено. Натисніть Скинути, щоб змінити.",
+ "placeholder": "Введіть Ваш пароль"
+ },
+ "tlsServername": {
+ "label": "TLS Servername — необов'язкове ім'я хоста для валідації TLS, коли хост є IP",
+ "placeholder": "example.com"
+ },
+ "connectionHost": {
+ "label": "Хост з'єднання пошти — ім'я хоста для HELO/EHLO привітання",
+ "placeholder": "localhost"
+ },
+ "secure": {
+ "label": "Використовувати SSL (рекомендовано): шифрувати з'єднання за допомогою SSL/TLS"
+ },
+ "pool": {
+ "label": "Увімкнути пул з'єднань: повторне використання з'єднань для покращення продуктивності"
+ },
+ "ignoreTLS": {
+ "label": "Вимкнути STARTTLS: не використовувати TLS, навіть якщо сервер його підтримує"
+ },
+ "requireTLS": {
+ "label": "Примусовий STARTTLS: вимагати оновлення до TLS, помилка якщо не підтримується"
+ },
+ "rejectUnauthorized": {
+ "label": "Відхиляти недійсні сертифікати: відхиляти з'єднання із самопідписаними або ненадійними сертифікатами"
+ }
+ }
+ },
+ "demoMonitors": {
+ "title": "Демо-монітори",
+ "description": "Додайте зразки моніторів для демонстрації."
+ },
+ "removeMonitors": {
+ "title": "Скидання системи",
+ "description": "Видалити всі монітори з Вашої системи.",
+ "dialog": {
+ "title": "Видалити всі монітори?",
+ "description": "Це не можна скасувати."
+ }
+ },
+ "exportMonitors": {
+ "title": "Експортувати монітори"
+ },
+ "importExportMonitors": {
+ "title": "Імпорт / Експорт моніторів",
+ "description": "Імпортуйте або експортуйте дані моніторів у файлі JSON для резервного копіювання або перенесення."
+ },
+ "about": {
+ "title": "Про додаток",
+ "developedBy": "Розроблено Bluewave Labs"
+ },
+ "validation": {
+ "errorMessage": "Будь ласка, виправте такі помилки валідації:"
+ }
+ }
},
- "title": "",
- "uiSettings": {
- "description": "",
- "labelLanguage": "",
- "labelTheme": "",
- "title": ""
+ "statusPages": {
+ "deleteSuccess": "Сторінку статусу успішно видалено",
+ "fallback": {
+ "title": "Сторінка статусу використовується для:",
+ "checks": "Communicate system status to users and stakeholders,Display real-time uptime information publicly,Build trust with transparent service monitoring,Reduce support requests during incidents",
+ "actionButton": "Створити сторінку статусу!"
+ },
+ "monitorsList": {
+ "chartTypeHeatmap": "Теплова карта",
+ "chartTypeHistogram": "Гістограма",
+ "noData": "Немає доступних даних",
+ "infrastructure": {
+ "title": "Інфраструктура",
+ "cpu": "CPU",
+ "memory": "RAM",
+ "memoryText": "Пам'ять",
+ "disk": "Диск",
+ "usage": "Використання",
+ "used": "Використано",
+ "total": "Усього"
+ },
+ "uptime": {
+ "title": "Час роботи",
+ "responseTime": "Час відповіді"
+ }
+ },
+ "statusBar": {
+ "allDown": "Усі системи недоступні",
+ "allUp": "Усі системи працюють",
+ "degraded": "Деякі системи мають проблеми",
+ "unknown": "Неможливо визначити стан системи"
+ },
+ "table": {
+ "headers": {
+ "name": "Назва сторінки статусу",
+ "url": "Публічний URL"
+ },
+ "published": "Опубліковано",
+ "unpublished": "Неопубліковано"
+ },
+ "title": "Сторінки статусу",
+ "details": {
+ "empty": {
+ "title": "Тут ще нічого немає",
+ "addMonitor": "Додайте монітор, щоб розпочати"
+ }
+ },
+ "form": {
+ "access": {
+ "title": "Доступ",
+ "description": "Якщо Ваша сторінка статусу готова, Ви можете позначити її як опубліковану.",
+ "option": {
+ "published": {
+ "name": "Опубліковано та видно для всіх"
+ }
+ }
+ },
+ "basicInfo": {
+ "title": "Основна інформація",
+ "description": "Визначте назву компанії та піддомен, на який вказує Ваша сторінка статусу.",
+ "option": {
+ "name": {
+ "label": "Назва компанії",
+ "placeholder": "Acme Inc."
+ },
+ "url": {
+ "label": "Адреса Вашої сторінки статусу",
+ "placeholder": "my-status-page"
+ }
+ }
+ },
+ "monitors": {
+ "title": "Монітори",
+ "description": "Оберіть монітори для відображення на Вашій сторінці статусу.",
+ "noMonitors": "Монітори не обрані",
+ "option": {
+ "monitors": {
+ "label": "Оберіть монітори",
+ "placeholder": "Шукати та обрати монітори..."
+ }
+ }
+ },
+ "timezone": {
+ "title": "Часовий пояс",
+ "description": "Оберіть часовий пояс для відображення Вашої сторінки статусу.",
+ "option": {
+ "timezone": {
+ "label": "Часовий пояс",
+ "placeholder": "Оберіть часовий пояс..."
+ }
+ }
+ },
+ "appearance": {
+ "title": "Зовнішній вигляд",
+ "description": "Визначте стандартний вигляд Вашої публічної сторінки статусу.",
+ "option": {
+ "logo": {
+ "label": "Логотип"
+ },
+ "color": {
+ "label": "Колір бренду"
+ }
+ }
+ },
+ "features": {
+ "title": "Функції",
+ "description": "Налаштуйте, яка інформація відображається на Вашій сторінці статусу.",
+ "option": {
+ "showCharts": {
+ "label": "Показувати графіки часу відповіді"
+ },
+ "showUptimePercentage": {
+ "label": "Показувати відсоток часу роботи"
+ },
+ "showAdminLoginLink": {
+ "label": "Показувати посилання для входу адміністратора"
+ },
+ "showInfrastructure": {
+ "label": "Показувати метрики інфраструктури"
+ }
+ }
+ }
+ }
},
- "urlSettings": {
- "description": "",
- "label": "",
- "selectDisabled": "",
- "selectEnabled": "",
- "title": ""
+ "uptime": {
+ "filters": {
+ "search": {
+ "placeholder": "Шукати монітори..."
+ }
+ },
+ "table": {
+ "headers": {
+ "responseTime": "Час відповіді"
+ }
+ },
+ "fallback": {
+ "actionButton": "Створити монітор!",
+ "checks": "Check if websites or servers are online & responsive,Alert teams about downtime or performance issues,Monitor HTTP endpoints, pings, containers & ports,Track historical uptime and reliability trends",
+ "title": "Монітор доступності використовується для:"
+ }
}
}
}
diff --git a/client/src/locales/vi.json b/client/src/locales/vi.json
index 22b96487c8..f9963958b7 100644
--- a/client/src/locales/vi.json
+++ b/client/src/locales/vi.json
@@ -1,838 +1,1305 @@
{
- "submit": "",
- "title": "",
- "distributedStatusHeaderText": "",
- "distributedStatusSubHeaderText": "",
- "settingsDisabled": "",
- "settingsSuccessSaved": "",
- "settingsFailedToSave": "",
- "settingsStatsCleared": "",
- "settingsFailedToClearStats": "",
- "settingsFailedToAddDemoMonitors": "",
- "settingsMonitorsDeleted": "",
- "settingsFailedToDeleteMonitors": "",
- "starPromptTitle": "",
- "starPromptDescription": "",
- "https": "",
- "http": "",
- "monitor": "",
- "aboutus": "",
- "now": "",
- "delete": "",
- "configure": "",
- "responseTime": "",
- "ms": "",
- "bar": "",
- "area": "",
- "country": "",
- "city": "",
- "response": "",
- "monitorStatusUp": "",
- "monitorStatusDown": "",
- "webhookSendSuccess": "",
- "webhookSendError": "",
- "webhookUnsupportedPlatform": "",
- "distributedRightCategoryTitle": "",
- "distributedStatusServerMonitors": "",
- "distributedStatusServerMonitorsDescription": "",
- "distributedUptimeCreateSelectURL": "",
- "distributedUptimeCreateChecks": "",
- "distributedUptimeCreateChecksDescription": "",
- "distributedUptimeCreateIncidentNotification": "",
- "distributedUptimeCreateIncidentDescription": "",
- "distributedUptimeCreateAdvancedSettings": "",
- "distributedUptimeDetailsNoMonitorHistory": "",
- "distributedUptimeDetailsStatusHeaderUptime": "",
- "distributedUptimeDetailsStatusHeaderLastUpdate": "",
- "notifications": {
- "enableNotifications": "",
- "testNotification": "",
- "addOrEditNotifications": "",
- "slack": {
- "label": "",
- "description": "",
- "webhookLabel": "",
- "webhookPlaceholder": "",
- "webhookRequired": ""
- },
- "discord": {
- "label": "",
- "description": "",
- "webhookLabel": "",
- "webhookPlaceholder": "",
- "webhookRequired": ""
- },
- "telegram": {
- "label": "",
- "description": "",
- "tokenLabel": "",
- "tokenPlaceholder": "",
- "chatIdLabel": "",
- "chatIdPlaceholder": "",
- "fieldsRequired": ""
+ "common": {
+ "auth": {
+ "roles": {
+ "admin": "Quản trị viên",
+ "demo": "Demo",
+ "superadmin": "Quản trị viên cấp cao",
+ "user": "Người dùng"
+ }
},
- "webhook": {
- "label": "",
- "description": "",
- "urlLabel": "",
- "urlPlaceholder": "",
- "urlRequired": ""
+ "alerts": {
+ "pageSpeedApiKey": {
+ "content": "Cảnh báo: Bạn chưa thêm khóa API Google PageSpeed. Truy cập Cài đặt để thêm. Nếu không có khóa này, trình giám sát PageSpeed sẽ không hoạt động."
+ }
},
- "testNotificationDevelop": "",
- "integrationButton": "",
- "testSuccess": "",
- "testFailed": "",
- "unsupportedType": "",
- "networkError": "",
- "fallback": {
- "title": "",
- "checks": [""]
+ "appName": "",
+ "breadcrumbs": {
+ "details": "Chi tiết",
+ "home": "Trang chủ"
},
- "createButton": "",
- "createTitle": "",
- "create": {
- "success": "",
- "failed": ""
+ "buttons": {
+ "addMember": "Thêm thành viên",
+ "cancel": "Hủy",
+ "close": "Đóng",
+ "configure": "Cấu hình",
+ "confirm": "Xác nhận",
+ "create": "Tạo",
+ "delete": "Xóa",
+ "generateToken": "Tạo token",
+ "incidents": "Sự cố",
+ "inviteMember": "Mời thành viên",
+ "pause": "Tạm dừng",
+ "resume": "Tiếp tục",
+ "save": "",
+ "sendInvite": "Gửi lời mời",
+ "test": "Kiểm tra",
+ "testNotifications": "Kiểm tra thông báo",
+ "toggleTheme": "",
+ "flushQueue": "Xóa hàng đợi",
+ "notFound": "Về bảng điều khiển chính",
+ "resetPassword": "",
+ "reset": "",
+ "clear": "Xóa",
+ "addDemo": "Thêm trình giám sát mẫu",
+ "removeMonitors": "Xóa trình giám sát",
+ "sendTestEmail": "Gửi email kiểm tra",
+ "exportToJSON": "Xuất ra JSON",
+ "importFromJSON": "Nhập từ JSON",
+ "clearFilters": "Xóa bộ lọc",
+ "removeUser": "Xóa người dùng"
},
- "fetch": {
- "success": "",
- "failed": ""
+ "charts": {
+ "labels": {
+ "averageResponseTime": "Thời gian phản hồi trung bình",
+ "downtime": "Thời gian ngừng hoạt động",
+ "high": "",
+ "low": "",
+ "uptime": "Thời gian hoạt động"
+ },
+ "histogram": {
+ "avg": "TB: {{value}} ms",
+ "max": "Tối đa: {{value}} ms"
+ }
},
- "delete": {
- "success": "",
- "failed": ""
+ "dialogs": {
+ "delete": {
+ "description": "Hành động này không thể hoàn tác.",
+ "title": "Bạn có chắc chắn muốn xóa không?"
+ }
},
- "edit": {
- "success": "",
- "failed": ""
+ "labels": {
+ "active": "Đang hoạt động",
+ "paused": "tạm dừng",
+ "na": "N/A",
+ "resolved": "Đã giải quyết",
+ "responseTime": "Thời gian phản hồi"
},
- "test": {
- "success": "",
- "failed": ""
- }
- },
- "testLocale": "",
- "add": "",
- "monitors": "",
- "distributedUptimeStatusCreateStatusPage": "",
- "distributedUptimeStatusCreateStatusPageAccess": "",
- "distributedUptimeStatusCreateStatusPageReady": "",
- "distributedUptimeStatusBasicInfoHeader": "",
- "distributedUptimeStatusBasicInfoDescription": "",
- "distributedUptimeStatusLogoHeader": "",
- "distributedUptimeStatusLogoDescription": "",
- "distributedUptimeStatusLogoUploadButton": "",
- "distributedUptimeStatusStandardMonitorsHeader": "",
- "distributedUptimeStatusStandardMonitorsDescription": "",
- "distributedUptimeStatusCreateYour": "",
- "distributedUptimeStatusEditYour": "",
- "distributedUptimeStatusPublishedLabel": "",
- "distributedUptimeStatusCompanyNameLabel": "",
- "distributedUptimeStatusPageAddressLabel": "",
- "distributedUptimeStatus30Days": "",
- "distributedUptimeStatus60Days": "",
- "distributedUptimeStatus90Days": "",
- "distributedUptimeStatusPageNotSetUp": "",
- "distributedUptimeStatusContactAdmin": "",
- "distributedUptimeStatusPageNotPublic": "",
- "distributedUptimeStatusPageDeleteDialog": "",
- "distributedUptimeStatusPageDeleteConfirm": "",
- "distributedUptimeStatusPageDeleteDescription": "",
- "distributedUptimeStatusDevices": "",
- "distributedUptimeStatusUpt": "",
- "distributedUptimeStatusUptBurned": "",
- "distributedUptimeStatusUptLogo": "",
- "incidentsTableNoIncidents": "",
- "incidentsTablePaginationLabel": "",
- "incidentsTableMonitorName": "",
- "incidentsTableStatus": "",
- "incidentsTableDateTime": "",
- "incidentsTableStatusCode": "",
- "incidentsTableMessage": "",
- "incidentsOptionsHeader": "",
- "incidentsOptionsHeaderFilterBy": "",
- "incidentsOptionsHeaderFilterAll": "",
- "incidentsOptionsHeaderFilterDown": "",
- "incidentsOptionsHeaderFilterCannotResolve": "",
- "incidentsOptionsHeaderShow": "",
- "incidentsOptionsHeaderLastHour": "",
- "incidentsOptionsHeaderLastDay": "",
- "incidentsOptionsHeaderLastWeek": "",
- "incidentsOptionsPlaceholderAllServers": "",
- "infrastructureCreateYour": "",
- "infrastructureCreateGeneralSettingsDescription": "",
- "infrastructureServerRequirement": "",
- "infrastructureCustomizeAlerts": "",
- "infrastructureAlertNotificationDescription": "",
- "infrastructureCreateMonitor": "",
- "infrastructureProtocol": "",
- "infrastructureServerUrlLabel": "",
- "infrastructureDisplayNameLabel": "",
- "infrastructureAuthorizationSecretLabel": "",
- "gb": "",
- "mb": "",
- "mem": "",
- "memoryUsage": "",
- "cpu": "",
- "cpuUsage": "",
- "cpuTemperature": "",
- "diskUsage": "",
- "used": "",
- "total": "",
- "cores": "",
- "frequency": "",
- "status": "",
- "cpuPhysical": "",
- "cpuLogical": "",
- "cpuFrequency": "",
- "avgCpuTemperature": "",
- "memory": "",
- "disk": "",
- "uptime": "",
- "os": "",
- "host": "",
- "actions": "",
- "integrations": "",
- "integrationsPrism": "",
- "integrationsSlack": "",
- "integrationsSlackInfo": "",
- "integrationsDiscord": "",
- "integrationsDiscordInfo": "",
- "integrationsZapier": "",
- "integrationsZapierInfo": "",
- "commonSave": "",
- "createYour": "",
- "createMonitor": "",
- "pause": "",
- "resume": "",
- "editing": "",
- "url": "",
- "access": "",
- "timezone": "",
- "features": "",
- "administrator": "",
- "loginHere": "",
- "displayName": "",
- "urlMonitor": "",
- "portToMonitor": "",
- "websiteMonitoring": "",
- "websiteMonitoringDescription": "",
- "pingMonitoring": "",
- "pingMonitoringDescription": "",
- "dockerContainerMonitoring": "",
- "dockerContainerMonitoringDescription": "",
- "portMonitoring": "",
- "portMonitoringDescription": "",
- "createMaintenanceWindow": "",
- "createMaintenance": "",
- "editMaintenance": "",
- "maintenanceWindowName": "",
- "friendlyNameInput": "",
- "friendlyNamePlaceholder": "",
- "maintenanceRepeat": "",
- "maintenance": "",
- "duration": "",
- "addMonitors": "",
- "window": "",
- "cancel": "",
- "message": "",
- "low": "",
- "high": "",
- "statusCode": "",
- "date&Time": "",
- "type": "",
- "statusPageName": "",
- "publicURL": "",
- "repeat": "",
- "edit": "",
- "createA": "",
- "remove": "",
- "maintenanceWindowDescription": "",
- "startTime": "",
- "timeZoneInfo": "",
- "monitorsToApply": "",
- "nextWindow": "",
- "notFoundButton": "",
- "pageSpeedConfigureSettingsDescription": "",
- "monitorDisplayName": "",
- "whenNewIncident": "",
- "notifySMS": "",
- "notifyEmails": "",
- "seperateEmails": "",
- "checkFrequency": "",
- "chooseGame": "",
- "matchMethod": "",
- "expectedValue": "",
- "deleteDialogTitle": "",
- "deleteDialogDescription": "",
- "pageSpeedMonitor": "",
- "shown": "",
- "ago": "",
- "companyName": "",
- "pageSpeedDetailsPerformanceReport": "",
- "pageSpeedDetailsPerformanceReportCalculator": "",
- "checkingEvery": "",
- "statusPageCreateSettings": "",
- "basicInformation": "",
- "statusPageCreateBasicInfoDescription": "",
- "statusPageCreateSelectTimeZoneDescription": "",
- "statusPageCreateAppearanceDescription": "",
- "statusPageCreateSettingsCheckboxLabel": "",
- "statusPageCreateBasicInfoStatusPageAddress": "",
- "statusPageCreateTabsContent": "",
- "statusPageCreateTabsContentDescription": "",
- "statusPageCreateTabsContentFeaturesDescription": "",
- "showCharts": "",
- "showUptimePercentage": "",
- "removeLogo": "",
- "statusPageStatus": "",
- "statusPageStatusContactAdmin": "",
- "statusPageStatusNotPublic": "",
- "statusPageStatusNoPage": "",
- "statusPageStatusServiceStatus": "",
- "deleteStatusPage": "",
- "deleteStatusPageConfirm": "",
- "deleteStatusPageDescription": "",
- "uptimeCreate": "",
- "uptimeCreateJsonPath": "",
- "uptimeCreateJsonPathQuery": "",
- "maintenanceTableActionMenuDialogTitle": "",
- "infrastructureEditYour": "",
- "infrastructureEditMonitor": "",
- "infrastructureMonitorCreated": "",
- "infrastructureMonitorUpdated": "",
- "errorInvalidTypeId": "",
- "errorInvalidFieldId": "",
- "inviteNoTokenFound": "",
- "pageSpeedWarning": "",
- "pageSpeedLearnMoreLink": "",
- "pageSpeedAddApiKey": "",
- "update": "",
- "invalidFileFormat": "",
- "invalidFileSize": "",
- "ClickUpload": "",
- "DragandDrop": "",
- "MaxSize": "",
- "SupportedFormats": "",
- "FirstName": "",
- "LastName": "",
- "EmailDescriptionText": "",
- "YourPhoto": "",
- "PhotoDescriptionText": "",
- "save": "",
- "DeleteDescriptionText": "",
- "DeleteAccountWarning": "",
- "DeleteWarningTitle": "",
- "bulkImport": {
- "title": "",
- "selectFileTips": "",
- "selectFileDescription": "",
- "selectFile": "",
- "parsingFailed": "",
- "uploadSuccess": "",
- "validationFailed": "",
- "noFileSelected": "",
- "fallbackPage": ""
- },
- "DeleteAccountTitle": "",
- "DeleteAccountButton": "",
- "publicLink": "",
- "maskedPageSpeedKeyPlaceholder": "",
- "reset": "",
- "ignoreTLSError": "",
- "tlsErrorIgnored": "",
- "ignoreTLSErrorDescription": "",
- "createNew": "",
- "greeting": {
- "prepend": "",
- "append": "",
- "overview": ""
- },
- "roles": {
- "superAdmin": "",
- "admin": "",
- "teamMember": "",
- "demoUser": ""
- },
- "teamPanel": {
- "teamMembers": "",
- "filter": {
- "all": "",
- "member": ""
+ "form": {
+ "role": {
+ "option": {
+ "role": {
+ "label": "Vai trò"
+ }
+ }
+ },
+ "name": {
+ "option": {
+ "firstName": {
+ "label": "",
+ "placeholder": ""
+ },
+ "lastName": {
+ "label": "",
+ "placeholder": ""
+ }
+ }
+ },
+ "email": {
+ "option": {
+ "email": {
+ "label": "Email",
+ "placeholder": "you@example.com"
+ }
+ }
+ }
},
- "inviteTeamMember": "",
- "inviteNewTeamMember": "",
- "inviteDescription": "",
- "email": "",
- "selectRole": "",
- "inviteLink": "",
- "cancel": "",
- "noMembers": "",
- "getToken": "",
- "emailToken": "",
"table": {
- "name": "",
- "email": "",
- "role": "",
- "created": ""
+ "empty": "Không có dữ liệu",
+ "headers": {
+ "actions": "",
+ "dateTime": "Ngày & giờ",
+ "message": "Tin nhắn",
+ "monitor": "Trình giám sát",
+ "monitorId": "ID trình giám sát",
+ "name": "Tên",
+ "status": "Trạng thái",
+ "type": "",
+ "url": "Url",
+ "interval": "Khoảng thời gian",
+ "active": "Đang hoạt động",
+ "responseTime": "Thời gian phản hồi"
+ }
}
},
- "monitorState": {
- "paused": "",
- "resumed": "",
- "active": ""
- },
- "menu": {
- "uptime": "",
- "pagespeed": "",
- "infrastructure": "",
- "incidents": "",
- "statusPages": "",
- "maintenance": "",
- "integrations": "",
- "settings": "",
- "support": "",
- "discussions": "",
- "docs": "",
- "changelog": "",
- "profile": "",
- "password": "",
- "team": "",
- "logOut": "",
- "notifications": "",
- "logs": ""
- },
- "settingsEmailUser": "",
- "state": "",
- "statusBreadCrumbsStatusPages": "",
- "statusBreadCrumbsDetails": "",
- "commonSaving": "",
- "navControls": "",
- "incidentsPageTitle": "",
- "passwordPanel": {
- "passwordChangedSuccess": "",
- "passwordInputIncorrect": "",
- "currentPassword": "",
- "enterCurrentPassword": "",
- "newPassword": "",
- "enterNewPassword": "",
- "confirmNewPassword": "",
- "passwordRequirements": "",
- "saving": ""
- },
- "emailSent": "",
- "failedToSendEmail": "",
- "settingsTestEmailSuccess": "",
- "settingsTestEmailFailed": "",
- "settingsTestEmailFailedWithReason": "",
- "settingsTestEmailUnknownError": "",
- "statusMsg": {
- "paused": "",
- "up": "",
- "down": "",
- "pending": ""
- },
- "uptimeGeneralInstructions": {
- "http": "",
- "ping": "",
- "docker": "",
- "port": "",
- "game": ""
- },
- "common": {
- "appName": "",
- "monitoringAgentName": "",
- "buttons": {
- "toggleTheme": ""
+ "components": {
+ "imageUpload": {
+ "clickToUpload": "Nhấn để tải lên",
+ "dragAndDrop": "",
+ "supportedFormats": "",
+ "maxSize": "",
+ "orDragAndDrop": "hoặc kéo và thả",
+ "errors": {
+ "invalidFileSize": "",
+ "invalidFileFormat": ""
+ }
+ },
+ "headerStatusPageControls": {
+ "publicLink": ""
+ },
+ "headerTimeRange": {
+ "labels": {
+ "day": "Ngày",
+ "month": "Tháng",
+ "recent": "Gần đây",
+ "week": "Tuần"
+ },
+ "description": {
+ "recent": "Hiển thị thống kê trong 2 giờ qua.",
+ "day": "Hiển thị thống kê trong 24 giờ qua.",
+ "week": "Hiển thị thống kê trong 7 ngày qua.",
+ "month": "Hiển thị thống kê trong 30 ngày qua."
+ }
},
- "toasts": {
- "networkError": "",
- "checkConnection": "",
- "unknownError": ""
+ "offlineBanner": {
+ "serverUnreachable": "Không thể kết nối đến máy chủ",
+ "retry": "Thử lại",
+ "retrying": "Đang thử lại...",
+ "reconnected": ""
+ },
+ "sidebar": {
+ "menu": {
+ "uptime": "",
+ "pagespeed": "",
+ "infrastructure": "",
+ "notifications": "",
+ "checks": "Kiểm tra",
+ "incidents": "",
+ "statusPages": "",
+ "maintenance": "",
+ "logs": "",
+ "settings": ""
+ },
+ "bottomMenu": {
+ "support": "",
+ "discussions": "",
+ "docs": "",
+ "changelog": ""
+ },
+ "accountMenu": {
+ "profile": "Hồ sơ",
+ "password": "Mật khẩu",
+ "team": "Nhóm"
+ },
+ "starPrompt": {
+ "title": "Gắn sao Checkmate",
+ "description": "Xem các bản phát hành mới nhất và giúp phát triển cộng đồng trên GitHub"
+ },
+ "authFooter": {
+ "navControls": "",
+ "logOut": "",
+ "roles": {
+ "superAdmin": "Quản trị viên cấp cao",
+ "admin": "Quản trị viên",
+ "user": "Người dùng",
+ "demoUser": ""
+ }
+ }
+ },
+ "starPrompt": {
+ "title": "Gắn sao Checkmate",
+ "description": "Xem các bản phát hành mới nhất và giúp phát triển cộng đồng trên GitHub"
}
},
- "auth": {
- "common": {
- "navigation": {
- "continue": "",
- "back": ""
+ "pages": {
+ "notFound": {
+ "title": "Ôi không! Bạn đã làm rơi sushi!",
+ "subtitle": "Either the URL doesn’t exist, or you don’t have access to it."
+ },
+ "account": {
+ "tabs": {
+ "profile": "Hồ sơ",
+ "password": "Mật khẩu",
+ "team": "Nhóm"
},
- "inputs": {
- "email": {
- "label": "",
- "placeholder": "",
- "errors": {
- "empty": "",
- "invalid": ""
- }
- },
- "password": {
- "label": "",
- "rules": {
- "length": {
- "beginning": "",
- "highlighted": ""
- },
- "special": {
- "beginning": "",
- "highlighted": ""
- },
- "number": {
- "beginning": "",
- "highlighted": ""
- },
- "uppercase": {
- "beginning": "",
- "highlighted": ""
- },
- "lowercase": {
- "beginning": "",
- "highlighted": ""
- },
- "match": {
- "beginning": "",
- "highlighted": ""
+ "form": {
+ "name": {
+ "title": "Tên",
+ "description": "Cập nhật thông tin cá nhân của bạn"
+ },
+ "photo": {
+ "title": "Ảnh hồ sơ",
+ "description": "Tải lên ảnh hồ sơ"
+ },
+ "currentPassword": {
+ "title": "Mật khẩu hiện tại",
+ "description": "Nhập mật khẩu hiện tại để xác minh danh tính",
+ "option": {
+ "label": "Mật khẩu hiện tại",
+ "placeholder": "Nhập mật khẩu hiện tại"
+ }
+ },
+ "newPassword": {
+ "title": "Mật khẩu mới",
+ "description": "Chọn mật khẩu mạnh có ít nhất 8 ký tự",
+ "option": {
+ "newPassword": {
+ "label": "Mật khẩu mới",
+ "placeholder": "Nhập mật khẩu mới"
+ },
+ "confirm": {
+ "label": "Xác nhận mật khẩu",
+ "placeholder": "Xác nhận mật khẩu mới"
}
- },
- "errors": {
- "empty": "",
- "length": "",
- "uppercase": "",
- "lowercase": "",
- "number": "",
- "special": "",
- "incorrect": ""
}
},
- "passwordConfirm": {
- "label": "",
- "placeholder": "",
- "errors": {
- "empty": "",
- "different": ""
+ "deleteAccount": {
+ "title": "Xóa tài khoản",
+ "description": "Hành động này là vĩnh viễn và không thể hoàn tác"
+ }
+ },
+ "team": {
+ "filter": {
+ "placeholder": "Lọc theo vai trò",
+ "all": "",
+ "admin": "Quản trị viên",
+ "member": ""
+ },
+ "table": {
+ "headers": {
+ "email": "Email",
+ "role": "",
+ "created": ""
}
},
- "firstName": {
- "label": "",
- "placeholder": "",
- "errors": {
- "empty": "",
- "length": "",
- "pattern": ""
+ "addMember": {
+ "title": "Đăng ký thành viên mới",
+ "description": "Tạo tài khoản người dùng mới. Chia sẻ thông tin đăng nhập một cách an toàn sau khi tạo."
+ },
+ "invite": {
+ "title": "Mời thành viên nhóm",
+ "description": "Gửi lời mời tham gia nhóm của bạn",
+ "email": {
+ "label": "Địa chỉ email",
+ "placeholder": "Nhập địa chỉ email"
+ },
+ "role": {
+ "label": "Vai trò",
+ "placeholder": "Chọn vai trò"
+ },
+ "linkLabel": "Liên kết mời"
+ }
+ }
+ },
+ "auth": {
+ "common": {
+ "passwordRules": {
+ "length": {
+ "beginning": "",
+ "highlighted": ""
+ },
+ "lowercase": {
+ "beginning": "",
+ "highlighted": ""
+ },
+ "match": {
+ "beginning": "",
+ "highlighted": ""
+ },
+ "number": {
+ "beginning": "",
+ "highlighted": ""
+ },
+ "special": {
+ "beginning": "",
+ "highlighted": ""
+ },
+ "uppercase": {
+ "beginning": "",
+ "highlighted": ""
}
},
- "lastName": {
- "label": "",
- "placeholder": "",
- "errors": {
- "empty": "",
- "length": "",
- "pattern": ""
+ "form": {
+ "option": {
+ "email": {
+ "label": "Email",
+ "placeholder": "me@example.com"
+ },
+ "password": {
+ "label": "Mật khẩu",
+ "placeholder": "********"
+ },
+ "confirmPassword": {
+ "label": "Xác nhận mật khẩu"
+ }
}
}
},
- "errors": {
- "validation": ""
+ "login": {
+ "title": "Chào mừng bạn trở lại Checkmate!",
+ "subtitle": "Đăng nhập để tiếp tục",
+ "submit": "Đăng nhập",
+ "links": {
+ "forgotPassword": {
+ "text": "Quên mật khẩu?",
+ "linkText": "Đặt lại mật khẩu"
+ },
+ "register": {
+ "text": "Chưa có tài khoản?",
+ "linkText": "Đăng ký tại đây"
+ }
+ }
+ },
+ "register": {
+ "title": "Chào mừng bạn trở lại Checkmate!",
+ "subtitle": "Đăng ký để bắt đầu",
+ "submit": "Đăng ký"
},
- "fields": {
- "password": {
- "errors": {
- "incorrect": ""
+ "forgotPassword": {
+ "title": "Quên mật khẩu?",
+ "subtitle": "Đừng lo, chúng tôi sẽ gửi hướng dẫn đặt lại mật khẩu cho bạn.",
+ "submit": "Yêu cầu khôi phục",
+ "links": {
+ "login": {
+ "text": "Quay lại",
+ "linkText": "đăng nhập"
}
}
+ },
+ "setNewPassword": {
+ "title": "Đặt lại mật khẩu",
+ "subtitle": "Mật khẩu mới phải khác với các mật khẩu đã sử dụng trước đó."
}
},
- "login": {
- "heading": "",
- "subheadings": {
- "stepOne": "",
- "stepTwo": ""
- },
- "links": {
- "forgotPassword": "",
- "register": "",
- "forgotPasswordLink": "",
- "registerLink": ""
- },
- "toasts": {
- "success": "",
- "incorrectPassword": ""
+ "checks": {
+ "selects": {
+ "monitor": {
+ "all": "Tất cả trình giám sát"
+ },
+ "status": {
+ "all": "Tất cả",
+ "down": "Ngừng hoạt động",
+ "up": "Hoạt động"
+ }
},
- "errors": {
- "password": {
- "incorrect": ""
+ "table": {
+ "empty": "Không có kiểm tra lỗi trong khoảng thời gian này",
+ "headers": {
+ "statusCode": "Mã trạng thái",
+ "location": "Vị trí"
}
}
},
- "registration": {
- "heading": {
- "superAdmin": "",
- "user": ""
- },
- "subheadings": {
- "stepOne": "",
- "stepTwo": "",
- "stepThree": ""
+ "common": {
+ "monitors": {
+ "actions": {
+ "configure": "Cấu hình",
+ "delete": "Xóa",
+ "generateToken": "Tạo token",
+ "details": "Chi tiết",
+ "incidents": "Sự cố",
+ "inviteMember": "Mời thành viên",
+ "openSite": "Mở trang web",
+ "pause": "Tạm dừng",
+ "resume": "Tiếp tục"
+ },
+ "statBoxes": {
+ "activeFor": "Hoạt động từ",
+ "certificateExpiry": "Hạn chứng chỉ",
+ "lastCheck": "Lần kiểm tra cuối",
+ "lastResponseTime": "Thời gian phản hồi cuối"
+ },
+ "status": {
+ "down": "ngừng hoạt động",
+ "breached": "vượt ngưỡng",
+ "initializing": "đang khởi tạo",
+ "maintenance": "bảo trì",
+ "paused": "tạm dừng",
+ "total": "tổng",
+ "up": "hoạt động"
+ },
+ "monitorTypes": {
+ "optionDocker": "Docker",
+ "optionGame": "Trò chơi",
+ "optionHttp": "HTTP(S)",
+ "optionPing": "Ping",
+ "optionPort": "Cổng",
+ "optionPagespeed": "PageSpeed",
+ "optionHardware": "Hạ tầng",
+ "optionGrpc": "gRPC",
+ "optionWebSocket": "WebSocket"
+ }
+ }
+ },
+ "createMonitor": {
+ "form": {
+ "advanced": {
+ "description": "Cài đặt tùy chọn cho các trường hợp sử dụng nâng cao",
+ "option": {
+ "advancedMatching": {
+ "label": "Sử dụng đối sánh nâng cao"
+ },
+ "expectedValue": {
+ "label": "Giá trị mong đợi"
+ },
+ "jsonPath": {
+ "description": "Biểu thức này sẽ được đánh giá với dữ liệu JSON phản hồi và kết quả sẽ được dùng để đối sánh với giá trị mong đợi. Xem jmespath.org để biết tài liệu ngôn ngữ truy vấn.",
+ "label": "Biểu thức JSONPath"
+ },
+ "matchMethod": {
+ "label": "Phương thức đối sánh",
+ "equal": "Bằng",
+ "include": "Bao gồm",
+ "regex": "Regex"
+ }
+ },
+ "title": "Cài đặt nâng cao"
+ },
+ "frequency": {
+ "description": "Bạn muốn kiểm tra trạng thái trình giám sát này bao lâu một lần?",
+ "option": {
+ "frequency": {
+ "label": "Tần suất kiểm tra",
+ "value": {
+ "fifteenMinutes": "15 phút",
+ "fifteenSeconds": "15 giây",
+ "fiveMinutes": "5 phút",
+ "fourMinutes": "4 phút",
+ "oneMinute": "1 phút",
+ "tenMinutes": "10 phút",
+ "thirtyMinutes": "30 phút",
+ "thirtySeconds": "30 giây",
+ "threeMinutes": "3 phút",
+ "twoMinutes": "2 phút"
+ }
+ }
+ },
+ "title": "Tần suất kiểm tra"
+ },
+ "general": {
+ "option": {
+ "container": {
+ "label": "Tên/ID container",
+ "placeholder": "my-app hoặc abcd1234"
+ },
+ "host": {
+ "label": "Máy chủ",
+ "placeholder": "192.168.1.100 hoặc example.com"
+ },
+ "name": {
+ "label": "Tên hiển thị",
+ "placeholder": "vd: Website của tôi"
+ },
+ "secret": {
+ "label": "Khóa xác thực",
+ "placeholder": "Nhập khóa bí mật của bạn"
+ },
+ "url": {
+ "label": "URL",
+ "placeholder": "https://www.google.com"
+ },
+ "game": {
+ "label": "Chọn trò chơi",
+ "placeholder": "Chọn một trò chơi"
+ },
+ "port": {
+ "label": "Cổng cần giám sát",
+ "placeholder": "80"
+ },
+ "grpcServiceName": {
+ "label": "Tên dịch vụ",
+ "placeholder": "vd: my.service.v1 (để trống cho kiểm tra sức khỏe tổng thể)"
+ },
+ "wsUrl": {
+ "label": "URL WebSocket",
+ "placeholder": "wss://example.com/socket"
+ }
+ },
+ "title": "Cài đặt chung",
+ "description": {
+ "http": "Nhập URL hoặc IP cần giám sát (vd: https://example.com/ hoặc 192.168.1.100) và thêm tên hiển thị rõ ràng trên bảng điều khiển.",
+ "ping": "",
+ "port": "",
+ "docker": "",
+ "game": "",
+ "pagespeed": "Theo dõi hiệu suất tải trang, Core Web Vitals và điểm tối ưu hóa cho trang web của bạn.",
+ "grpc": "Nhập tên máy chủ và cổng của máy chủ gRPC, tùy chọn chỉ định tên dịch vụ cho kiểm tra sức khỏe và thêm tên hiển thị.",
+ "websocket": "Nhập URL WebSocket cần giám sát (vd: wss://example.com/socket) và thêm tên hiển thị.",
+ "hardware": "Giám sát CPU, bộ nhớ, dung lượng ổ đĩa và nhiệt độ cho hạ tầng của bạn."
+ }
+ },
+ "ignoreTls": {
+ "description": "Cấu hình xác thực chứng chỉ TLS/SSL cho kết nối HTTPS.",
+ "option": {
+ "tls": {
+ "label": "Bỏ qua lỗi TLS/SSL"
+ }
+ },
+ "title": "Cài đặt TLS/SSL"
+ },
+ "incidents": {
+ "description": "Cửa sổ trượt được sử dụng để xác định khi nào trình giám sát ngừng hoạt động. Trạng thái của trình giám sát chỉ thay đổi khi tỷ lệ kiểm tra trong cửa sổ trượt đạt giá trị được chỉ định.",
+ "option": {
+ "checks": {
+ "label": "Số lần kiểm tra trong cửa sổ trượt"
+ },
+ "percentage": {
+ "label": "Bao nhiêu phần trăm kiểm tra trong cửa sổ trượt thất bại/thành công trước khi trạng thái trình giám sát thay đổi?"
+ }
+ },
+ "title": "Sự cố"
+ },
+ "notifications": {
+ "description": "Chọn các kênh thông báo bạn muốn sử dụng",
+ "title": "Thông báo"
+ },
+ "type": {
+ "description": "Chọn loại kiểm tra để thực hiện",
+ "optionDockerDescription": "Sử dụng Docker để giám sát xem container có đang chạy không.",
+ "optionGameDescription": "Giám sát xem máy chủ trò chơi cụ thể có trực tuyến không.",
+ "optionGrpcDescription": "Giám sát dịch vụ gRPC bằng Giao thức Kiểm tra Sức khỏe tiêu chuẩn.",
+ "optionWebSocketDescription": "Giám sát điểm cuối WebSocket về sức khỏe kết nối và thời gian phản hồi.",
+ "optionHttpDescription": "Sử dụng HTTP(S) để giám sát trang web hoặc điểm cuối API của bạn.",
+ "optionPingDescription": "Sử dụng ICMP Ping để giám sát xem máy chủ có trực tuyến không.",
+ "optionPortDescription": "Giám sát xem một cổng cụ thể trên máy chủ có mở không.",
+ "title": "Loại"
+ },
+ "thresholds": {
+ "title": "Ngưỡng cảnh báo",
+ "description": "Xác định các ngưỡng kích hoạt cảnh báo cho trình giám sát phần cứng này.",
+ "option": {
+ "cpuThreshold": {
+ "label": "Ngưỡng cảnh báo CPU (%)"
+ },
+ "memoryThreshold": {
+ "label": "Ngưỡng cảnh báo bộ nhớ (%)"
+ },
+ "diskThreshold": {
+ "label": "Ngưỡng cảnh báo ổ đĩa (%)"
+ },
+ "tempThreshold": {
+ "label": "Ngưỡng cảnh báo nhiệt độ (°C)"
+ }
+ }
+ },
+ "geoChecks": {
+ "title": "Kiểm tra phân tán địa lý",
+ "description": "Chạy kiểm tra từ nhiều vị trí địa lý để giám sát tính khả dụng và hiệu suất toàn cầu.",
+ "option": {
+ "enabled": {
+ "label": "Bật kiểm tra phân tán địa lý"
+ },
+ "locations": {
+ "label": "Vị trí",
+ "placeholder": "Chọn vị trí",
+ "options": {
+ "EU": "Châu Âu",
+ "NA": "Bắc Mỹ",
+ "AS": "Châu Á",
+ "SA": "Nam Mỹ",
+ "AF": "Châu Phi",
+ "OC": "Châu Đại Dương"
+ }
+ },
+ "interval": {
+ "label": "Khoảng thời gian kiểm tra",
+ "value": {
+ "fiveMinutes": "5 phút",
+ "tenMinutes": "10 phút",
+ "fifteenMinutes": "15 phút",
+ "thirtyMinutes": "30 phút"
+ }
+ }
+ }
+ },
+ "url": {
+ "title": "Giám sát IP/URL trên trang trạng thái",
+ "description": "Hiển thị địa chỉ IP hoặc URL của trình giám sát trên trang trạng thái công khai. Nếu tắt, chỉ tên trình giám sát được hiển thị để bảo vệ thông tin nhạy cảm.",
+ "option": {
+ "showURL": {
+ "label": "Hiển thị IP/URL trên trang trạng thái",
+ "enabled": "Đã bật",
+ "disabled": "Đã tắt"
+ }
+ }
+ },
+ "stats": {
+ "title": "Lịch sử giám sát",
+ "description": "Xóa tất cả lịch sử giám sát và thống kê cho nhóm của bạn. Hành động này không thể hoàn tác.",
+ "buttonText": "Xóa tất cả thống kê",
+ "dialog": {
+ "title": "Xóa tất cả lịch sử giám sát?",
+ "description": "Điều này sẽ xóa vĩnh viễn tất cả lịch sử giám sát, thống kê và dữ liệu kiểm tra cho nhóm của bạn. Hành động này không thể hoàn tác.",
+ "confirm": "Có, xóa tất cả thống kê"
+ }
+ }
+ }
+ },
+ "editUser": {
+ "form": {
+ "roles": {
+ "title": "Vai trò",
+ "description": "Gán vai trò cho người dùng. Có thể chọn nhiều vai trò."
+ }
},
- "description": {
- "superAdmin": "",
- "user": ""
+ "dialog": {
+ "removeUser": {
+ "title": "Xóa người dùng",
+ "content": "Bạn có chắc chắn muốn xóa {{name}} khỏi nhóm không? Hành động này không thể hoàn tác."
+ }
+ }
+ },
+ "incidents": {
+ "dialog": {
+ "resolveIncident": {
+ "title": "Giải quyết sự cố",
+ "option": {
+ "comment": {
+ "label": "Nhận xét (tùy chọn)",
+ "placeholder": "Thêm nhận xét về cách giải quyết..."
+ }
+ }
+ },
+ "details": {
+ "analysis": "Phân tích sự cố",
+ "comment": "Nhận xét:",
+ "detailsLabel": "Chi tiết",
+ "downtime": "Thời gian ngừng:",
+ "message": "Tin nhắn:",
+ "monitor": "Trình giám sát:",
+ "overview": "Tổng quan",
+ "resolutionDetails": "Chi tiết giải quyết",
+ "resolutionType": "Loại:",
+ "resolutionTypes": {
+ "automatic": "Tự động",
+ "manual": "Thủ công"
+ },
+ "resolve": "Giải quyết sự cố",
+ "resolvedAt": "Đã giải quyết lúc:",
+ "resolvedBy": "Giải quyết bởi:",
+ "startedAt": "Bắt đầu lúc:",
+ "status": "Trạng thái:",
+ "statusCode": "Mã trạng thái:",
+ "timeline": "Dòng thời gian",
+ "title": "Chi tiết sự cố",
+ "url": "URL:"
+ }
},
- "gettingStartedButton": {
- "superAdmin": "",
- "user": ""
+ "filters": {
+ "allMonitors": "Tất cả trình giám sát",
+ "monitor": "Trình giám sát",
+ "resolutionType": "Loại giải quyết",
+ "resolutionTypes": {
+ "manual": "Thủ công",
+ "automatic": "Tự động",
+ "all": "Tất cả"
+ }
},
- "termsAndPolicies": "",
- "links": {
- "login": ""
+ "summaryCard": {
+ "activeIncidents": {
+ "title": "Sự cố đang xảy ra",
+ "active_zero": "Không có sự cố đang xảy ra",
+ "active_one": "{{count}} sự cố đang xảy ra",
+ "active_other": "{{count}} sự cố đang xảy ra"
+ },
+ "incidentStats": {
+ "avgResolutionTime": "Thời gian giải quyết TB",
+ "mostAffectedMonitor": "Trình giám sát bị ảnh hưởng nhiều nhất",
+ "title": "Thống kê sự cố",
+ "totalIncidents": "Tổng số sự cố"
+ },
+ "latestIncidents": {
+ "title": "Sự cố mới nhất"
+ }
},
- "toasts": {
- "success": ""
+ "table": {
+ "actions": {
+ "details": "Chi tiết",
+ "goToMonitor": "Đi đến trình giám sát",
+ "resolveManually": "Giải quyết thủ công"
+ },
+ "activeIncidents": "Sự cố đang xảy ra",
+ "headers": {
+ "endTime": "Thời gian kết thúc",
+ "resolutionType": "Loại giải quyết",
+ "startTime": "",
+ "statusCode": "Mã trạng thái"
+ },
+ "resolvedIncidents": "Sự cố đã giải quyết",
+ "status": {
+ "active": "Đang hoạt động",
+ "resolved": "Đã giải quyết"
+ }
}
},
- "forgotPassword": {
- "heading": "",
- "subheadings": {
- "stepOne": "",
- "stepTwo": "",
- "stepThree": "",
- "stepFour": ""
- },
- "buttons": {
- "openEmail": "",
- "resetPassword": ""
- },
- "imageAlts": {
- "passwordKey": "",
- "email": "",
- "lock": "",
- "passwordConfirm": ""
- },
- "links": {
- "login": "",
- "resend": ""
- },
- "toasts": {
- "sent": "",
- "emailNotFound": "",
- "redirect": "",
- "success": "",
- "error": ""
- }
- }
- },
- "errorPages": {
- "serverUnreachable": {
- "toasts": {
- "reconnected": "",
- "stillUnreachable": ""
- },
- "alertBox": "",
- "description": "",
- "retryButton": {
- "default": "",
- "processing": ""
+ "infrastructure": {
+ "charts": {
+ "labels": {
+ "cpu": "Sử dụng CPU",
+ "disk": "Sử dụng ổ đĩa",
+ "memory": "Sử dụng bộ nhớ",
+ "netBytesRecv": "{{name}} - Byte nhận",
+ "netBytesSent": "{{name}} - Byte gửi",
+ "temp": "Nhiệt độ"
+ }
+ },
+ "gauges": {
+ "cpu": {
+ "lowerLabel": "Tần số tối đa",
+ "title": "Sử dụng CPU",
+ "upperLabel": "Tần số hiện tại"
+ },
+ "disk": {
+ "lowerLabel": "Còn trống",
+ "title": "Sử dụng ổ đĩa {{idx}}",
+ "upperLabel": "Đã dùng"
+ },
+ "memory": {
+ "lowerLabel": "Còn trống",
+ "title": "Sử dụng bộ nhớ",
+ "upperLabel": "Đã dùng"
+ }
+ },
+ "statBoxes": {
+ "avgCpuTemperature": "",
+ "cpuFrequency": "",
+ "cpuLogical": "",
+ "cpuPhysical": "",
+ "disk": "Ổ đĩa",
+ "memory": "Bộ nhớ",
+ "os": ""
+ },
+ "table": {
+ "headers": {
+ "cpu": "CPU",
+ "disk": "Ổ đĩa",
+ "memory": "Bộ nhớ"
+ }
+ },
+ "tabs": {
+ "labels": {
+ "network": "Mạng",
+ "overview": "Tổng quan"
+ }
+ },
+ "fallback": {
+ "actionButton": "Tạo trình giám sát!",
+ "checks": "Track the performance of your servers,Identify bottlenecks and optimize usage,Ensure reliability with real-time monitoring",
+ "title": "Trình giám sát hạ tầng dùng để:"
}
- }
- },
- "createNotifications": {
- "title": "",
- "nameSettings": {
- "title": "",
- "description": "",
- "nameLabel": "",
- "namePlaceholder": ""
- },
- "typeSettings": {
- "title": "",
- "description": "",
- "typeLabel": ""
- },
- "emailSettings": {
- "title": "",
- "description": "",
- "emailLabel": "",
- "emailPlaceholder": ""
- },
- "slackSettings": {
- "title": "",
- "description": "",
- "webhookLabel": "",
- "webhookPlaceholder": ""
- },
- "pagerdutySettings": {
- "title": "",
- "description": "",
- "integrationKeyLabel": "",
- "integrationKeyPlaceholder": ""
- },
- "discordSettings": {
- "title": "",
- "description": "",
- "webhookLabel": "",
- "webhookPlaceholder": ""
- },
- "webhookSettings": {
- "title": "",
- "description": "",
- "webhookLabel": "",
- "webhookPlaceholder": ""
- }
- },
- "notificationConfig": {
- "title": "",
- "description": ""
- },
- "monitorStatus": {
- "checkingEvery": "",
- "withCaptureAgent": "",
- "up": "",
- "down": "",
- "paused": ""
- },
- "advancedMatching": "",
- "sendTestNotifications": "",
- "testNotificationsDisabled": "",
- "selectAll": "",
- "showAdminLoginLink": "",
- "logsPage": {
- "title": "",
- "description": "",
- "tabs": {
- "queue": "",
- "logs": ""
- },
- "toast": {
- "fetchLogsSuccess": ""
},
- "logLevelSelect": {
- "title": "",
- "values": {
- "all": "",
- "info": "",
- "warn": "",
- "error": "",
- "debug": ""
+ "logs": {
+ "tabs": {
+ "diagnostics": "Chẩn đoán",
+ "logs": "",
+ "queue": ""
+ },
+ "logLevelSelect": {
+ "label": "Mức nhật ký"
+ },
+ "jobQueue": "Hàng đợi công việc",
+ "failedJobs": "Công việc thất bại",
+ "noLogs": "Không tìm thấy nhật ký",
+ "metrics": {
+ "jobs": "Công việc",
+ "activeJobs": "Công việc đang chạy",
+ "failingJobs": "Công việc đang lỗi",
+ "totalRuns": "Tổng số lần chạy",
+ "totalFailures": "Tổng số lỗi"
+ },
+ "diagnostics": {
+ "stats": {
+ "eventLoopDelay": "Độ trễ vòng lặp sự kiện",
+ "uptime": "Thời gian hoạt động",
+ "usedHeapSize": "Kích thước heap đã dùng",
+ "totalHeapSize": "Tổng kích thước heap",
+ "osMemoryLimit": "Giới hạn bộ nhớ hệ điều hành"
+ },
+ "gauges": {
+ "heapAllocation": "Cấp phát heap",
+ "heapUsage": "Sử dụng heap",
+ "heapUtilization": "Hiệu suất sử dụng heap",
+ "instantCpuUsage": "Sử dụng CPU tức thời",
+ "availableMemoryPercentage": "% bộ nhớ khả dụng",
+ "allocatedPercentage": "% đã cấp phát",
+ "usedSPercentage": "% của 1 giây CPU sử dụng",
+ "total": "Tổng",
+ "used": "Đã dùng"
+ }
+ },
+ "table": {
+ "headers": {
+ "timestamp": "Thời gian",
+ "level": "Mức",
+ "service": "Dịch vụ",
+ "method": "Phương thức",
+ "monitorId": "ID trình giám sát",
+ "runCount": "Số lần chạy",
+ "failCount": "Số lần lỗi",
+ "lastRunAt": "Chạy lần cuối lúc",
+ "lockedAt": "Khóa lúc",
+ "lastFinishedAt": "Hoàn thành lần cuối lúc",
+ "lastRunTook": "Lần chạy cuối mất",
+ "lastFailedAt": "Lỗi lần cuối lúc",
+ "failReason": "Lý do lỗi"
+ }
}
- }
- },
- "queuePage": {
- "title": "",
- "refreshButton": "",
- "flushButton": "",
- "jobTable": {
- "title": "",
- "idHeader": "",
- "urlHeader": "",
- "typeHeader": "",
- "activeHeader": "",
- "lockedAtHeader": "",
- "runCountHeader": "",
- "failCountHeader": "",
- "lastRunHeader": "",
- "lastFinishedAtHeader": "",
- "lastRunTookHeader": ""
- },
- "metricsTable": {
- "title": "",
- "metricHeader": "",
- "valueHeader": ""
},
- "failedJobTable": {
- "title": "",
- "monitorIdHeader": "",
- "monitorUrlHeader": "",
- "failCountHeader": "",
- "failedAtHeader": "",
- "failReasonHeader": ""
- }
- },
- "export": {
- "title": "",
- "success": "",
- "failed": ""
- },
- "monitorActions": {
- "title": "",
- "import": "",
- "export": ""
- },
- "settingsPage": {
- "aboutSettings": {
- "labelDevelopedBy": "",
- "labelVersion": "",
- "title": ""
- },
- "demoMonitorsSettings": {
- "buttonAddMonitors": "",
- "description": "",
- "title": ""
- },
- "emailSettings": {
- "buttonSendTestEmail": "",
- "description": "",
- "descriptionTransport": "",
- "labelAddress": "",
- "labelConnectionHost": "",
- "labelHost": "",
- "labelIgnoreTLS": "",
- "labelPassword": "",
- "labelPasswordSet": "",
- "labelPool": "",
- "labelPort": "",
- "labelRejectUnauthorized": "",
- "labelRequireTLS": "",
- "labelSecure": "",
- "labelTLSServername": "",
- "labelUser": "",
- "linkTransport": "",
- "placeholderUser": "",
- "title": ""
- },
- "pageSpeedSettings": {
- "description": "",
- "labelApiKeySet": "",
- "labelApiKey": "",
- "title": ""
+ "maintenanceWindow": {
+ "fallback": {
+ "actionButton": "Tạo cửa sổ bảo trì!",
+ "checks": "Mark your maintenance periods,Eliminate any misunderstandings,Stop sending alerts in maintenance windows",
+ "title": "Cửa sổ bảo trì dùng để:"
+ },
+ "table": {
+ "headers": {
+ "nextWindow": "",
+ "repeat": ""
+ }
+ },
+ "form": {
+ "general": {
+ "title": "Cài đặt chung",
+ "description": "Đặt tên và tùy chọn lặp lại cho cửa sổ bảo trì.",
+ "option": {
+ "name": {
+ "label": "Tên",
+ "placeholder": "vd: Bảo trì hàng tuần"
+ },
+ "repeat": {
+ "label": "Lặp lại"
+ }
+ }
+ },
+ "startDate": {
+ "title": "Ngày bắt đầu",
+ "description": "Chọn ngày bắt đầu cho cửa sổ bảo trì.",
+ "option": {
+ "startDate": {
+ "label": "Ngày bắt đầu"
+ }
+ }
+ },
+ "startTime": {
+ "title": "Thời gian bắt đầu",
+ "description": "Đặt thời gian bắt đầu và thời lượng cho cửa sổ bảo trì. Tất cả giá trị theo UTC",
+ "option": {
+ "duration": {
+ "label": "Thời lượng"
+ },
+ "startTime": {
+ "label": "Thời gian bắt đầu"
+ }
+ },
+ "monitors": {
+ "title": "Trình giám sát",
+ "description": "Trình giám sát mà cửa sổ bảo trì áp dụng",
+ "option": {
+ "addMonitors": {
+ "label": "Thêm trình giám sát"
+ }
+ }
+ }
+ }
+ }
},
- "saveButtonLabel": "",
- "statsSettings": {
- "clearAllStatsButton": "",
- "clearAllStatsDescription": "",
- "clearAllStatsDialogConfirm": "",
- "clearAllStatsDialogDescription": "",
- "clearAllStatsDialogTitle": "",
- "description": "",
- "labelTTL": "",
- "labelTTLOptional": "",
- "title": ""
+ "notifications": {
+ "fallback": {
+ "actionButton": "Tạo kênh",
+ "checks": "Alert teams about downtime or performance issues,Let engineers know when incidents happen,Keep administrators informed of system changes",
+ "title": "Kênh thông báo dùng để:"
+ },
+ "form": {
+ "accessToken": {
+ "optionAccessToken": "Token truy cập",
+ "placeholder": "syt_YWxleF9ob2xsaWRheQ_VmtScmV0U2VjcmV0S2V5_abc123"
+ },
+ "address": {
+ "description": "Địa chỉ nơi thông báo sẽ được gửi đến.",
+ "optionAddress": "Địa chỉ",
+ "placeholderEmail": "example@example.com",
+ "placeholderWebhook": "https://your-server.com/webhook",
+ "title": "Địa chỉ"
+ },
+ "homeServer": {
+ "optionHomeServer": "Máy chủ chính",
+ "placeholder": "example.com"
+ },
+ "matrix": {
+ "description": "Cấu hình kết nối máy chủ Matrix cho thông báo.",
+ "title": "Cấu hình Matrix"
+ },
+ "notificationName": {
+ "description": "Tên mô tả cho kênh thông báo",
+ "optionName": "Tên kênh",
+ "placeholder": "vd: Cảnh báo sản xuất",
+ "title": "Tên kênh"
+ },
+ "pagerDuty": {
+ "description": "Khóa tích hợp PagerDuty để nhận cảnh báo.",
+ "optionIntegrationKey": "Khóa tích hợp",
+ "placeholder": "a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6",
+ "title": "Khóa tích hợp"
+ },
+ "roomId": {
+ "optionRoomId": "ID phòng",
+ "placeholder": "!abcdefg:matrix.org"
+ },
+ "type": {
+ "description": "Chọn loại kênh thông báo để tạo.",
+ "optionType": "Loại",
+ "title": "Loại kênh"
+ },
+ "telegram": {
+ "title": "Cấu hình Telegram",
+ "description": "",
+ "optionBotToken": "Token bot",
+ "placeholderBotToken": "123456789:ABCdefGhIJKlmNoPQRsTUVwxyZ",
+ "optionChatId": "ID cuộc trò chuyện",
+ "placeholderChatId": "-1001234567890"
+ }
+ },
+ "table": {
+ "headers": {
+ "destination": "Đích đến"
+ }
+ }
},
- "systemResetSettings": {
- "buttonRemoveAllMonitors": "",
- "description": "",
- "dialogConfirm": "",
- "dialogDescription": "",
- "dialogTitle": "",
- "title": ""
+ "pageSpeed": {
+ "charts": {
+ "common": {
+ "cls": "Cumulative Layout Shift (CLS)",
+ "fcp": "First Contentful Paint (FCP)",
+ "lcp": "Largest Contentful Paint (LCP)",
+ "si": "Speed Index (SI)",
+ "tbt": "Total Blocking Time (TBT)"
+ },
+ "legend": {
+ "title": "Báo cáo PageSpeed",
+ "weight": "Trọng số"
+ },
+ "pie": {
+ "title": "Báo cáo hiệu suất"
+ }
+ },
+ "table": {
+ "headers": {
+ "pageSpeedScore": "Điểm PageSpeed"
+ }
+ },
+ "fallback": {
+ "actionButton": "Tạo trình giám sát!",
+ "checks": "Report on the user experience of a page,Help analyze webpage speed,Give suggestions on how the page can be improved",
+ "title": "Trình giám sát PageSpeed dùng để:"
+ }
},
- "timezoneSettings": {
- "description": "",
- "label": "",
- "title": ""
+ "settings": {
+ "form": {
+ "timezone": {
+ "title": "Múi giờ hiển thị",
+ "description": "Chọn múi giờ dùng để hiển thị ngày và giờ trong toàn bộ ứng dụng.",
+ "option": {
+ "timezone": {
+ "label": "Múi giờ hiển thị"
+ }
+ }
+ },
+ "ui": {
+ "title": "Giao diện",
+ "description": "Chuyển đổi giữa chế độ sáng và tối, thay đổi ngôn ngữ hoặc tùy chỉnh kiểu hiển thị biểu đồ.",
+ "option": {
+ "theme": {
+ "label": "Chế độ giao diện",
+ "light": "Sáng",
+ "dark": "Tối"
+ },
+ "language": {
+ "label": "Ngôn ngữ"
+ },
+ "chartType": {
+ "label": "Loại biểu đồ",
+ "histogram": "Biểu đồ cột",
+ "heatmap": "Bản đồ nhiệt"
+ }
+ }
+ },
+ "pagespeed": {
+ "title": "Khóa API Google PageSpeed",
+ "description": "Nhập khóa API Google PageSpeed để bật giám sát PageSpeed. Nhấn Đặt lại để cập nhật khóa.",
+ "option": {
+ "apiKey": {
+ "label": "Khóa API PageSpeed",
+ "labelSet": "Khóa API đã được đặt. Nhấn Đặt lại để thay đổi.",
+ "placeholder": "Nhập khóa API Google PageSpeed của bạn"
+ }
+ }
+ },
+ "url": {
+ "title": "Giám sát IP/URL trên trang trạng thái",
+ "description": "Hiển thị địa chỉ IP hoặc URL của trình giám sát trên trang trạng thái công khai. Nếu tắt, chỉ tên trình giám sát được hiển thị để bảo vệ thông tin nhạy cảm.",
+ "option": {
+ "showURL": {
+ "label": "Hiển thị IP/URL trên trang trạng thái",
+ "enabled": "Đã bật",
+ "disabled": "Đã tắt"
+ }
+ }
+ },
+ "stats": {
+ "title": "Lịch sử giám sát",
+ "description": "Xóa tất cả lịch sử giám sát và thống kê cho nhóm của bạn. Hành động này không thể hoàn tác.",
+ "option": {
+ "clear": {
+ "label": "Xóa tất cả thống kê. Hành động này không thể hoàn tác."
+ }
+ },
+ "dialog": {
+ "title": "Xóa tất cả lịch sử giám sát?",
+ "description": "Không thể hoàn tác"
+ }
+ },
+ "retention": {
+ "title": "Lưu giữ dữ liệu kiểm tra",
+ "description": "Đặt thời gian lưu giữ dữ liệu kiểm tra trước khi tự động dọn dẹp.",
+ "option": {
+ "days": {
+ "label": "Thời gian lưu giữ (ngày)",
+ "unlimited": "Không giới hạn"
+ }
+ }
+ },
+ "thresholds": {
+ "title": "Ngưỡng toàn cục",
+ "description": "Đặt ngưỡng CPU, Bộ nhớ, Ổ đĩa và Nhiệt độ toàn cục cho giám sát hạ tầng. Áp dụng cho tất cả trình giám sát phần cứng trừ khi bị ghi đè.",
+ "option": {
+ "cpu": {
+ "label": "Ngưỡng CPU (%)",
+ "placeholder": "1 - 100"
+ },
+ "memory": {
+ "label": "Ngưỡng bộ nhớ (%)",
+ "placeholder": "1 - 100"
+ },
+ "disk": {
+ "label": "Ngưỡng ổ đĩa (%)",
+ "placeholder": "1 - 100"
+ },
+ "temperature": {
+ "label": "Ngưỡng nhiệt độ (°C)",
+ "placeholder": "1 - 150"
+ }
+ }
+ },
+ "email": {
+ "title": "Cài đặt email",
+ "description": "Cấu hình cài đặt email cho hệ thống. Được sử dụng để gửi thông báo và cảnh báo.",
+ "descriptionTransport": "",
+ "descriptionTransportLink": "Xem thông số kỹ thuật tại đây",
+ "option": {
+ "host": {
+ "label": "Máy chủ email - Tên máy chủ hoặc địa chỉ IP để kết nối",
+ "placeholder": "smtp.gmail.com"
+ },
+ "port": {
+ "label": "Cổng email - Cổng để kết nối",
+ "placeholder": "587"
+ },
+ "address": {
+ "label": "Địa chỉ email - Dùng để xác thực",
+ "placeholder": "you@example.com"
+ },
+ "user": {
+ "label": "Người dùng email - Tên đăng nhập để xác thực, ghi đè địa chỉ email nếu được chỉ định",
+ "placeholder": "Để trống nếu không cần"
+ },
+ "password": {
+ "label": "Mật khẩu email - Mật khẩu để xác thực",
+ "labelSet": "Mật khẩu đã được đặt. Nhấn Đặt lại để thay đổi.",
+ "placeholder": "Nhập mật khẩu của bạn"
+ },
+ "tlsServername": {
+ "label": "Tên máy chủ TLS - Tên máy chủ tùy chọn để xác thực TLS khi host là IP",
+ "placeholder": "example.com"
+ },
+ "connectionHost": {
+ "label": "Máy chủ kết nối email - Tên máy chủ dùng trong lời chào HELO/EHLO",
+ "placeholder": "localhost"
+ },
+ "secure": {
+ "label": "Sử dụng SSL (khuyến nghị): Mã hóa kết nối bằng SSL/TLS"
+ },
+ "pool": {
+ "label": "Bật gộp kết nối: Tái sử dụng kết nối hiện có để cải thiện hiệu suất"
+ },
+ "ignoreTLS": {
+ "label": "Tắt STARTTLS: Không sử dụng TLS ngay cả khi máy chủ hỗ trợ"
+ },
+ "requireTLS": {
+ "label": "Bắt buộc STARTTLS: Yêu cầu nâng cấp TLS, thất bại nếu không hỗ trợ"
+ },
+ "rejectUnauthorized": {
+ "label": "Từ chối chứng chỉ không hợp lệ: Từ chối kết nối với chứng chỉ tự ký hoặc không đáng tin cậy"
+ }
+ }
+ },
+ "demoMonitors": {
+ "title": "Trình giám sát mẫu",
+ "description": "Thêm trình giám sát mẫu cho mục đích trình diễn."
+ },
+ "removeMonitors": {
+ "title": "Đặt lại hệ thống",
+ "description": "Xóa tất cả trình giám sát khỏi hệ thống.",
+ "dialog": {
+ "title": "Xóa tất cả trình giám sát?",
+ "description": "Không thể hoàn tác."
+ }
+ },
+ "exportMonitors": {
+ "title": "Xuất trình giám sát"
+ },
+ "importExportMonitors": {
+ "title": "Nhập / Xuất trình giám sát",
+ "description": "Nhập hoặc xuất dữ liệu trình giám sát dưới dạng tệp JSON để sao lưu hoặc chuyển giao."
+ },
+ "about": {
+ "title": "Giới thiệu",
+ "developedBy": "Phát triển bởi Bluewave Labs"
+ },
+ "validation": {
+ "errorMessage": "Vui lòng sửa các lỗi xác thực sau:"
+ }
+ }
},
- "title": "",
- "uiSettings": {
- "description": "",
- "labelLanguage": "",
- "labelTheme": "",
- "title": ""
+ "statusPages": {
+ "deleteSuccess": "Đã xóa trang trạng thái thành công",
+ "fallback": {
+ "title": "Trang trạng thái dùng để:",
+ "checks": "Communicate system status to users and stakeholders,Display real-time uptime information publicly,Build trust with transparent service monitoring,Reduce support requests during incidents",
+ "actionButton": "Tạo trang trạng thái!"
+ },
+ "monitorsList": {
+ "chartTypeHeatmap": "Bản đồ nhiệt",
+ "chartTypeHistogram": "Biểu đồ cột",
+ "noData": "Không có dữ liệu",
+ "infrastructure": {
+ "title": "Hạ tầng",
+ "cpu": "CPU",
+ "memory": "RAM",
+ "memoryText": "Bộ nhớ",
+ "disk": "Ổ đĩa",
+ "usage": "Sử dụng",
+ "used": "Đã dùng",
+ "total": "Tổng"
+ },
+ "uptime": {
+ "title": "Thời gian hoạt động",
+ "responseTime": "Thời gian phản hồi"
+ }
+ },
+ "statusBar": {
+ "allDown": "Tất cả hệ thống đều ngừng hoạt động",
+ "allUp": "Tất cả hệ thống đang hoạt động",
+ "degraded": "Một số hệ thống đang gặp sự cố",
+ "unknown": "Không thể xác định trạng thái hệ thống"
+ },
+ "table": {
+ "headers": {
+ "name": "Tên trang trạng thái",
+ "url": "URL công khai"
+ },
+ "published": "Đã xuất bản",
+ "unpublished": "Chưa xuất bản"
+ },
+ "title": "Trang trạng thái",
+ "details": {
+ "empty": {
+ "title": "Chưa có gì ở đây",
+ "addMonitor": "Thêm trình giám sát để bắt đầu"
+ }
+ },
+ "form": {
+ "access": {
+ "title": "Truy cập",
+ "description": "Nếu trang trạng thái đã sẵn sàng, bạn có thể đánh dấu là đã xuất bản.",
+ "option": {
+ "published": {
+ "name": "Đã xuất bản và hiển thị công khai"
+ }
+ }
+ },
+ "basicInfo": {
+ "title": "Thông tin cơ bản",
+ "description": "Xác định tên công ty và tên miền phụ mà trang trạng thái trỏ đến.",
+ "option": {
+ "name": {
+ "label": "Tên công ty",
+ "placeholder": "Acme Inc."
+ },
+ "url": {
+ "label": "Địa chỉ trang trạng thái",
+ "placeholder": "my-status-page"
+ }
+ }
+ },
+ "monitors": {
+ "title": "Trình giám sát",
+ "description": "Chọn trình giám sát hiển thị trên trang trạng thái.",
+ "noMonitors": "Chưa chọn trình giám sát",
+ "option": {
+ "monitors": {
+ "label": "Chọn trình giám sát",
+ "placeholder": "Tìm kiếm và chọn trình giám sát..."
+ }
+ }
+ },
+ "timezone": {
+ "title": "Múi giờ",
+ "description": "Chọn múi giờ hiển thị cho trang trạng thái.",
+ "option": {
+ "timezone": {
+ "label": "Múi giờ",
+ "placeholder": "Chọn múi giờ..."
+ }
+ }
+ },
+ "appearance": {
+ "title": "Giao diện",
+ "description": "Xác định giao diện mặc định cho trang trạng thái công khai.",
+ "option": {
+ "logo": {
+ "label": "Logo"
+ },
+ "color": {
+ "label": "Màu thương hiệu"
+ }
+ }
+ },
+ "features": {
+ "title": "Tính năng",
+ "description": "Cấu hình thông tin hiển thị trên trang trạng thái.",
+ "option": {
+ "showCharts": {
+ "label": "Hiển thị biểu đồ thời gian phản hồi"
+ },
+ "showUptimePercentage": {
+ "label": "Hiển thị phần trăm thời gian hoạt động"
+ },
+ "showAdminLoginLink": {
+ "label": "Hiển thị liên kết đăng nhập quản trị"
+ },
+ "showInfrastructure": {
+ "label": "Hiển thị số liệu hạ tầng"
+ }
+ }
+ }
+ }
},
- "urlSettings": {
- "description": "",
- "label": "",
- "selectDisabled": "",
- "selectEnabled": "",
- "title": ""
+ "uptime": {
+ "filters": {
+ "search": {
+ "placeholder": "Tìm kiếm trình giám sát..."
+ }
+ },
+ "table": {
+ "headers": {
+ "responseTime": "Thời gian phản hồi"
+ }
+ },
+ "fallback": {
+ "actionButton": "Tạo trình giám sát!",
+ "checks": "Check if websites or servers are online & responsive,Alert teams about downtime or performance issues,Monitor HTTP endpoints, pings, containers & ports,Track historical uptime and reliability trends",
+ "title": "Trình giám sát hoạt động dùng để:"
+ }
}
}
}
diff --git a/client/src/locales/zh-CN.json b/client/src/locales/zh-CN.json
index 67b4194452..d6580e8514 100644
--- a/client/src/locales/zh-CN.json
+++ b/client/src/locales/zh-CN.json
@@ -1,1132 +1,1305 @@
{
- "submit": "提交",
- "title": "标题",
- "distributedStatusHeaderText": "实时、真实设备覆盖",
- "distributedStatusSubHeaderText": "在全球数百万设备的支持下,按全球区域、国家或城市查看系统性能",
- "settingsDisabled": "禁用",
- "settingsSuccessSaved": "设置保存成功",
- "settingsFailedToSave": "保存设置失败",
- "settingsStatsCleared": "统计数据已成功清除",
- "settingsFailedToClearStats": "清除统计数据失败",
- "settingsMonitorsDeleted": "已成功删除所有监视器",
- "settingsFailedToDeleteMonitors": "删除所有监视器失败",
- "starPromptTitle": "打星Checkmate",
- "starPromptDescription": "在 GitHub 上查看最新版本,并帮助社区发展壮大",
- "https": "HTTPS",
- "http": "HTTP",
- "monitor": "监控",
- "aboutus": "关于我们",
- "now": "现在",
- "delete": "删除",
- "configure": "配置",
- "responseTime": "响应时间",
- "ms": "毫秒",
- "bar": "条",
- "area": "区域",
- "country": "国家",
- "city": "城市",
- "response": "响应",
- "monitorStatusUp": "监控目标 {name} ({url}) 现在处于正常状态并正在响应",
- "monitorStatusDown": "监控目标 {name} ({url}) 已下线且无响应",
- "webhookSendSuccess": "Webhook通知发送成功",
- "webhookSendError": "向 {platform} 发送 Webhook 通知时出错",
- "webhookUnsupportedPlatform": "不支持的平台:{platform}",
- "distributedRightCategoryTitle": "监控",
- "distributedStatusServerMonitors": "服务器监控",
- "distributedStatusServerMonitorsDescription": "监控相关服务器的状态",
- "distributedUptimeCreateSelectURL": "在这里,您可以选择主机的URL以及监控类型。",
- "distributedUptimeCreateChecks": "分布式正常运行时间创建检查",
- "distributedUptimeCreateChecksDescription": "在添加站点之后,您随时可以增加或删除检查项。",
- "distributedUptimeCreateIncidentNotification": "事件通知",
- "distributedUptimeCreateIncidentDescription": "当发生事件时,通知用户。",
- "distributedUptimeCreateAdvancedSettings": "高级设置",
- "distributedUptimeDetailsNoMonitorHistory": "此监控器尚未有检查历史记录。",
- "distributedUptimeDetailsStatusHeaderUptime": "运行时间:",
- "distributedUptimeDetailsStatusHeaderLastUpdate": "最后更新于",
- "notifications": {
- "enableNotifications": "启用 {{platform}} 通知",
- "testNotification": "测试通知",
- "addOrEditNotifications": "添加或修改通知方式",
- "slack": {
- "label": "Slack",
- "description": "要启用 Slack 通知,请先创建一个 Slack 应用并启用传入的 Webhook。之后,只需在此处提供 Webhook URL 即可。",
- "webhookLabel": "Webhook 网址",
- "webhookPlaceholder": "https://hooks.slack.com/services/...",
- "webhookRequired": "需要 Slack Webhook URL"
- },
- "discord": {
- "label": "Discord",
- "description": "要通过 Discord 通知将数据从 Checkmate 发送到 Discord 频道,可以使用 Discord 的入站 WebHooks 功能。",
- "webhookLabel": "Discord 接收网址",
- "webhookPlaceholder": "https://discord.com/api/webhooks/...",
- "webhookRequired": "需要 Discord Webhook URL"
+ "common": {
+ "auth": {
+ "roles": {
+ "admin": "管理员",
+ "demo": "演示",
+ "superadmin": "超级管理员",
+ "user": "用户"
+ }
},
- "telegram": {
- "label": "Telegram",
- "description": "要启用 Telegram 通知,请使用 BotFather创建一个 Telegram 机器人。然后,获取 API 令牌和聊天 ID 并在此处填写。",
- "tokenLabel": "你的机器人token",
- "tokenPlaceholder": "123456:ABC-DEF1234ghIkl-zyx57W2v1u123ew11",
- "chatIdLabel": "你的Chat ID",
- "chatIdPlaceholder": "-1001234567890",
- "fieldsRequired": "需要 Telegram 令牌和聊天 ID"
+ "alerts": {
+ "pageSpeedApiKey": {
+ "content": "警告:您尚未添加 Google PageSpeed API 密钥。请访问设置添加。没有密钥,PageSpeed 监控将无法运行。"
+ }
},
- "webhook": {
- "label": "Webhooks",
- "description": "你可以设置自定义的 Webhook,以便在事件发生时接收通知。",
- "urlLabel": "Webhook URL",
- "urlPlaceholder": "https://your-server.com/webhook",
- "urlRequired": "Webhook URL 是必填项"
+ "appName": "Checkmate",
+ "breadcrumbs": {
+ "details": "详情",
+ "home": "首页"
},
- "testNotificationDevelop": "测试通知 2",
- "integrationButton": "通知集成",
- "testSuccess": "测试通知发送成功!",
- "testFailed": "测试通知发送失败",
- "unsupportedType": "不支持的通知类型",
- "networkError": "发生网络错误",
- "fallback": {
- "title": "通知通道用于:",
- "checks": [
- "提醒团队有关停机时间或性能问题",
- "让工程师知道事件发生时",
- "让管理员了解系统更改"
- ],
- "actionButton": "让我们创建您的第一个通知渠道!"
+ "buttons": {
+ "addMember": "添加成员",
+ "cancel": "取消",
+ "close": "关闭",
+ "configure": "配置",
+ "confirm": "确认",
+ "create": "创建",
+ "delete": "删除",
+ "generateToken": "生成令牌",
+ "incidents": "事件",
+ "inviteMember": "邀请成员",
+ "pause": "暂停",
+ "resume": "恢复",
+ "save": "保存",
+ "sendInvite": "发送邀请",
+ "test": "测试",
+ "testNotifications": "测试通知",
+ "toggleTheme": "切换主题明&暗",
+ "flushQueue": "清空队列",
+ "notFound": "前往主控制台",
+ "resetPassword": "重置密码",
+ "reset": "重置",
+ "clear": "清除",
+ "addDemo": "添加演示监控",
+ "removeMonitors": "移除监控",
+ "sendTestEmail": "发送测试邮件",
+ "exportToJSON": "导出为 JSON",
+ "importFromJSON": "从 JSON 导入",
+ "clearFilters": "清除筛选",
+ "removeUser": "移除用户"
},
- "createButton": "创建通知渠道",
- "createTitle": "通知渠道",
- "create": {
- "success": "通知创建成功",
- "failed": "通知创建失败"
+ "charts": {
+ "labels": {
+ "averageResponseTime": "平均响应时间",
+ "downtime": "停机时间",
+ "high": "高的",
+ "low": "低的",
+ "uptime": "正常运行时间"
+ },
+ "histogram": {
+ "avg": "平均: {{value}} ms",
+ "max": "最大: {{value}} ms"
+ }
},
- "fetch": {
- "success": "成功获取通知",
- "failed": "无法获取通知"
+ "dialogs": {
+ "delete": {
+ "description": "此操作无法撤销。",
+ "title": "确定要删除吗?"
+ }
},
- "delete": {
- "success": "通知已成功删除",
- "failed": "删除通知失败"
+ "labels": {
+ "active": "活跃",
+ "paused": "已暂停",
+ "na": "不适用",
+ "resolved": "已解决",
+ "responseTime": "响应时间"
},
- "edit": {
- "success": "通知已成功更新",
- "failed": "无法更新通知"
+ "form": {
+ "role": {
+ "option": {
+ "role": {
+ "label": "角色"
+ }
+ }
+ },
+ "name": {
+ "option": {
+ "firstName": {
+ "label": "名字",
+ "placeholder": "Jordan"
+ },
+ "lastName": {
+ "label": "姓",
+ "placeholder": "Ellis"
+ }
+ }
+ },
+ "email": {
+ "option": {
+ "email": {
+ "label": "邮箱",
+ "placeholder": "you@example.com"
+ }
+ }
+ }
},
- "test": {
- "success": "测试通知发送成功",
- "failed": "测试通知发送失败"
+ "table": {
+ "empty": "暂无数据",
+ "headers": {
+ "actions": "动作",
+ "dateTime": "日期和时间",
+ "message": "消息",
+ "monitor": "监控",
+ "monitorId": "监控 ID",
+ "name": "名称",
+ "status": "状态",
+ "type": "类型",
+ "url": "URL",
+ "interval": "间隔",
+ "active": "活跃",
+ "responseTime": "响应时间"
+ }
}
},
- "testLocale": "测试区域设置",
- "add": "添加",
- "monitors": "监视器",
- "distributedUptimeStatusCreateStatusPage": "状态页",
- "distributedUptimeStatusCreateStatusPageAccess": "访问",
- "distributedUptimeStatusCreateStatusPageReady": "如果状态页面准备就绪,您可以标记为已发布。",
- "distributedUptimeStatusBasicInfoHeader": "基础信息",
- "distributedUptimeStatusBasicInfoDescription": "定义公司名称和状态页指向的子域名。",
- "distributedUptimeStatusLogoHeader": "Logo",
- "distributedUptimeStatusLogoDescription": "为您的状态页面上传一个 Logo",
- "distributedUptimeStatusLogoUploadButton": "上传 Logo",
- "distributedUptimeStatusStandardMonitorsHeader": "标准监视器",
- "distributedUptimeStatusStandardMonitorsDescription": "将标准监视器附加到您的状态页面。",
- "distributedUptimeStatusCreateYour": "创建您的",
- "distributedUptimeStatusEditYour": "编辑您的",
- "distributedUptimeStatusPublishedLabel": "发布并公开可见",
- "distributedUptimeStatusCompanyNameLabel": "公司名称",
- "distributedUptimeStatusPageAddressLabel": "您的状态页面地址",
- "distributedUptimeStatus30Days": "30 天",
- "distributedUptimeStatus60Days": "60 天",
- "distributedUptimeStatus90Days": "90 天",
- "distributedUptimeStatusPageNotSetUp": "未设置状态页面。",
- "distributedUptimeStatusContactAdmin": "请联系您的管理员",
- "distributedUptimeStatusPageNotPublic": "此状态页面不公开。",
- "distributedUptimeStatusPageDeleteDialog": "你想删除这个状态页吗?",
- "distributedUptimeStatusPageDeleteConfirm": "确定,删除状态页",
- "distributedUptimeStatusPageDeleteDescription": "删除后将无法恢复您的状态页面。",
- "distributedUptimeStatusDevices": "设备",
- "distributedUptimeStatusUpt": "UPT",
- "distributedUptimeStatusUptBurned": "分布式正常运行时间状态运行已完成",
- "distributedUptimeStatusUptLogo": "分布式UptimeStatusUptLogo",
- "incidentsTableNoIncidents": "无事件记录",
- "incidentsTablePaginationLabel": "事件",
- "incidentsTableMonitorName": "监控名称",
- "incidentsTableStatus": "状态",
- "incidentsTableDateTime": "日期&时间",
- "incidentsTableStatusCode": "状态码",
- "incidentsTableMessage": "信息",
- "incidentsOptionsHeader": "事件:",
- "incidentsOptionsHeaderFilterBy": "筛选:",
- "incidentsOptionsHeaderFilterAll": "全部",
- "incidentsOptionsHeaderFilterDown": "离线",
- "incidentsOptionsHeaderFilterCannotResolve": "无法解析",
- "incidentsOptionsHeaderShow": "显示:",
- "incidentsOptionsHeaderLastHour": "过去一小时",
- "incidentsOptionsHeaderLastDay": "过去一天",
- "incidentsOptionsHeaderLastWeek": "过去一周",
- "incidentsOptionsPlaceholderAllServers": "所有服务器",
- "infrastructureCreateYour": "创建你的",
- "infrastructureCreateGeneralSettingsDescription": "在这里您可以选择主机的 URL,以及连接到服务器代理时使用的友好名称和授权密钥。",
- "infrastructureServerRequirement": "你正在监控的服务器必须运行在",
- "infrastructureCustomizeAlerts": "自定义告警",
- "infrastructureAlertNotificationDescription": "当阈值超过指定百分比时向用户(们)发送通知。",
- "infrastructureCreateMonitor": "创建基础设施监控",
- "infrastructureProtocol": "协议",
- "infrastructureServerUrlLabel": "服务器 URL",
- "infrastructureDisplayNameLabel": "显示名称",
- "infrastructureAuthorizationSecretLabel": "授权密钥",
- "gb": "GB",
- "mb": "MB",
- "mem": "内存",
- "memoryUsage": "内存使用率",
- "cpu": "CPU",
- "cpuUsage": "CPU 使用率",
- "cpuTemperature": "CPU 温度",
- "diskUsage": "硬盘使用率",
- "used": "已使用",
- "total": "总共",
- "cores": "核心",
- "frequency": "频率",
- "status": "状态",
- "cpuPhysical": "CPU(物理核心)",
- "cpuLogical": "CPU(逻辑核心)",
- "cpuFrequency": "CPU 频率",
- "avgCpuTemperature": "CPU 平均温度",
- "memory": "内存",
- "disk": "硬盘",
- "uptime": "运行时间",
- "os": "系统",
- "host": "主机",
- "actions": "动作",
- "integrations": "继承",
- "integrationsPrism": "将 Prism 连接到您喜欢的服务。",
- "integrationsSlack": "集成Slack",
- "integrationsSlackInfo": "集成SlackInfo",
- "integrationsDiscord": "集成Discord",
- "integrationsDiscordInfo": "集成Discord信息",
- "integrationsZapier": "集成Zapier",
- "integrationsZapierInfo": "集成ZapierInfo",
- "commonSave": "保存",
- "createYour": "创建你的",
- "createMonitor": "创建监控",
- "pause": "暂停",
- "resume": "恢复",
- "editing": "编辑中...",
- "url": "网址",
- "access": "访问",
- "timezone": "时区",
- "features": "特征",
- "administrator": "管理员?",
- "loginHere": "点击此处登录",
- "displayName": "显示名称",
- "urlMonitor": "监控的 URL",
- "portToMonitor": "监控端口",
- "websiteMonitoring": "网站监控",
- "websiteMonitoringDescription": "使用 HTTP(s)监控您的网站或 API 端点。",
- "pingMonitoring": "ping监控",
- "pingMonitoringDescription": "检查您的服务器是否可用。",
- "dockerContainerMonitoring": "Docker容器监控",
- "dockerContainerMonitoringDescription": "检查你的 Docker 容器是否正在运行。",
- "portMonitoring": "端口监控",
- "portMonitoringDescription": "检查你的端口是否已打开。",
- "createMaintenanceWindow": "创建维护窗口",
- "createMaintenance": "创建维护",
- "editMaintenance": "编辑维护",
- "maintenanceWindowName": "维护窗口名称",
- "friendlyNameInput": "友好名称",
- "friendlyNamePlaceholder": "维护时间于 __:__ ,持续 ___ 分钟",
- "maintenanceRepeat": "维护重复",
- "maintenance": "维护",
- "duration": "期间",
- "addMonitors": "添加监视器",
- "window": "窗口",
- "cancel": "取消",
- "message": "信息",
- "low": "低的",
- "high": "高的",
- "statusCode": "状态码",
- "date&Time": "日期&时间",
- "type": "类型",
- "statusPageName": "状态页名称",
- "publicURL": "公共 URL",
- "repeat": "重复",
- "edit": "编辑",
- "createA": "创建A",
- "remove": "移除",
- "maintenanceWindowDescription": "在维护时段内,所选监视器的所有监视都将暂停。不会执行任何网络检查,从而阻止触发任何状态更新或通知。您的显示器将冻结在其最后的已知状态,并且状态页面将显示维护指示器。维护时段结束后,监控会自动恢复,如果检测到问题,将触发警报。维护期不计入正常运行时间计算。",
- "startTime": "开始时间",
- "timeZoneInfo": "所有日期和时间均为 GMT+0 时区。",
- "monitorsToApply": "监控器应用",
- "nextWindow": "下一个窗口",
- "notFoundButton": "未找到按钮",
- "pageSpeedConfigureSettingsDescription": "您可以在此处选择主机的 URL 以及监视器类型。",
- "monitorDisplayName": "监视器显示名称",
- "whenNewIncident": "当新事件发生时",
- "notifySMS": "通过短信通知(即将推出)",
- "notifyEmails": "还通过电子邮件通知多个地址(即将推出)",
- "seperateEmails": "单独的电子邮件",
- "checkFrequency": "检查频率",
- "matchMethod": "match方法",
- "expectedValue": "预期值",
- "deleteDialogTitle": "确定要删除此监视器吗?",
- "deleteDialogDescription": "一旦删除,将无法检索此监视器。",
- "pageSpeedMonitor": "页面速度监控器",
- "shown": "显示",
- "ago": "前",
- "companyName": "公司名称",
- "pageSpeedDetailsPerformanceReport": "值是估计值,可能会有所不同。",
- "pageSpeedDetailsPerformanceReportCalculator": "页面速度详情性能报告计算器",
- "checkingEvery": "检查每一个",
- "statusPageCreateSettings": "如果您的状态页面已准备就绪,您可以将其标记为已发布。",
- "basicInformation": "基础信息",
- "statusPageCreateBasicInfoDescription": "定义公司名称和状态页面指向的子域。",
- "statusPageCreateSelectTimeZoneDescription": "选择状态页面的显示时区。",
- "statusPageCreateAppearanceDescription": "定义公共状态页面的默认外观。",
- "statusPageCreateSettingsCheckboxLabel": "已发布并向公众可见",
- "statusPageCreateBasicInfoStatusPageAddress": "您的状态页面地址",
- "statusPageCreateTabsContent": "状态页服务器",
- "statusPageCreateTabsContentDescription": "您可以将监视的任意数量的服务器添加到状态页面。您还可以重新排序它们以获得最佳观看体验。",
- "statusPageCreateTabsContentFeaturesDescription": "在状态页上显示更多详细信息",
- "showCharts": "显示图表",
- "showUptimePercentage": "显示正常运行时间百分比",
- "removeLogo": "移除Logo",
- "statusPageStatus": "未设置公开状态页面。",
- "statusPageStatusContactAdmin": "请联系您的管理员",
- "statusPageStatusNotPublic": "此状态页面不公开。",
- "statusPageStatusNoPage": "这里没有状态页面。",
- "statusPageStatusServiceStatus": "服务状态",
- "deleteStatusPage": "要删除此状态页面吗?",
- "deleteStatusPageConfirm": "是,删除状态页",
- "deleteStatusPageDescription": "一旦删除,您的状态页面将无法检索。",
- "uptimeCreate": "期望值用于与响应结果进行匹配,匹配确定状态。",
- "uptimeCreateJsonPath": "将根据响应 JSON 数据评估此表达式,并将结果用于与预期值进行匹配。看",
- "uptimeCreateJsonPathQuery": "查询语言文档。",
- "maintenanceTableActionMenuDialogTitle": "您真的想删除此维护窗口吗?",
- "infrastructureEditYour": "编辑您的",
- "infrastructureEditMonitor": "保存基础架构监视器",
- "infrastructureMonitorCreated": "基础设施监控创建成功!",
- "infrastructureMonitorUpdated": "基础设施监控更新成功!",
- "errorInvalidTypeId": "提供的通知类型无效",
- "errorInvalidFieldId": "提供的字段 ID 无效",
- "inviteNoTokenFound": "未找到邀请令牌",
- "pageSpeedWarning": "警告:您尚未添加 Google PageSpeed API 密钥。没有它,PageSpeed 监视器将无法运行。",
- "pageSpeedLearnMoreLink": "点击这里",
- "pageSpeedAddApiKey": "以添加您的 API 密钥。",
- "update": "更新",
- "invalidFileFormat": "不支持的文件格式!",
- "invalidFileSize": "文件太大了!",
- "ClickUpload": "点击上传",
- "DragandDrop": "拖放",
- "MaxSize": "最大尺寸",
- "SupportedFormats": "支持的格式",
- "FirstName": "名",
- "LastName": "姓",
- "EmailDescriptionText": "这是您当前的电子邮件地址 - 无法更改。",
- "YourPhoto": "个人资料照片",
- "PhotoDescriptionText": "这张照片将显示在您的个人资料页面中。",
- "save": "保存",
- "DeleteDescriptionText": "这将从服务器中删除帐户和所有关联数据。这是不可逆的。",
- "DeleteAccountWarning": "删除您的帐户意味着您将无法再次登录,并且您的所有数据都将被删除。这是不可逆的。",
- "DeleteWarningTitle": "真的删除这个帐户?",
- "bulkImport": {
- "title": "批量导入",
- "selectFileTips": "选择要上传的 CSV 文件",
- "selectFileDescription": "您可以下载我们的模板或示例",
- "selectFile": "选择文件",
- "parsingFailed": "解析失败",
- "uploadSuccess": "监视器创建成功!",
- "validationFailed": "验证失败",
- "noFileSelected": "未选择文件",
- "fallbackPage": "导入文件以批量上传服务器列表",
- "invalidFileType": "文件类型无效",
- "uploadFailed": "上传失败"
- },
- "DeleteAccountTitle": "删除账户",
- "DeleteAccountButton": "删除帐户",
- "publicLink": "公共链接",
- "maskedPageSpeedKeyPlaceholder": "*************************************",
- "reset": "重置",
- "ignoreTLSError": "忽略 TLS/SSL 错误",
- "tlsErrorIgnored": "已忽略 TLS/SSL 错误",
- "ignoreTLSErrorDescription": "忽略 TLS/SSL 错误并继续检查网站可用性",
- "createNew": "新建",
- "greeting": {
- "prepend": "你好",
- "append": "下午时间,尽情发挥!",
- "overview": "以下是您的 {{type}} 监视器的概述。"
- },
- "roles": {
- "superAdmin": "超级管理员",
- "admin": "管理",
- "teamMember": "团队成员",
- "demoUser": "演示用户"
- },
- "teamPanel": {
- "teamMembers": "团队成员",
- "filter": {
- "all": "全部",
- "member": "成员"
+ "components": {
+ "imageUpload": {
+ "clickToUpload": "点击上传",
+ "dragAndDrop": "拖放",
+ "supportedFormats": "支持的格式",
+ "maxSize": "最大尺寸",
+ "orDragAndDrop": "或拖放文件",
+ "errors": {
+ "invalidFileSize": "文件太大了!",
+ "invalidFileFormat": "不支持的文件格式!"
+ }
},
- "inviteTeamMember": "邀请新团队成员",
- "inviteNewTeamMember": "邀请新团队成员",
- "inviteDescription": "当您添加新的团队成员时,他们将可以访问所有监视器。",
- "email": "电子邮件",
- "selectRole": "选择角色",
- "inviteLink": "邀请链接",
- "cancel": "取消",
- "noMembers": "没有具有此角色的团队成员",
- "getToken": "获取Token",
- "emailToken": "电子邮件令牌",
- "table": {
- "name": "名字",
- "email": "邮箱",
- "role": "角色",
- "created": "创建"
+ "headerStatusPageControls": {
+ "publicLink": "公共链接"
},
- "addTeamMember": {
- "addMemberMenu": "添加团队成员",
- "title": "注册新团队成员",
- "description": "创建一个新用户并与他们共享凭据。此方法使成员能够立即访问所有监视器。",
- "addButton": "添加成员"
+ "headerTimeRange": {
+ "labels": {
+ "day": "日",
+ "month": "月",
+ "recent": "最近",
+ "week": "周"
+ },
+ "description": {
+ "recent": "显示过去 2 小时的统计数据。",
+ "day": "显示过去 24 小时的统计数据。",
+ "week": "显示过去 7 天的统计数据。",
+ "month": "显示过去 30 天的统计数据。"
+ }
},
- "register": "注册团队成员",
- "registerToast": {
- "success": "用户创建,安全地与成员共享凭据。",
- "dbUserExists": "用户已存在。",
- "unknownError": "发生未知错误。"
+ "offlineBanner": {
+ "serverUnreachable": "无法连接到服务器",
+ "retry": "重试",
+ "retrying": "重试中...",
+ "reconnected": "已成功重新连接到服务器。"
},
- "registerTeamMember": {
- "title": "注册团队成员",
- "auth": {
- "common": {
- "inputs": {
- "firstName": {
- "errors": {
- "empty": "请输入姓名",
- "pattern": "名称只能包含字母、空格、撇号或连字符"
- }
- },
- "lastName": {
- "errors": {
- "empty": "请输入姓氏",
- "pattern": "姓氏只能包含字母、空格、撇号或连字符"
- }
+ "sidebar": {
+ "menu": {
+ "uptime": "上线时间",
+ "pagespeed": "页面速度",
+ "infrastructure": "基础设施",
+ "notifications": "通知",
+ "checks": "检查",
+ "incidents": "事件",
+ "statusPages": "状态页",
+ "maintenance": "维护",
+ "logs": "日志",
+ "settings": "设置"
+ },
+ "bottomMenu": {
+ "support": "支持",
+ "discussions": "讨论",
+ "docs": "文档",
+ "changelog": "变更日志"
+ },
+ "accountMenu": {
+ "profile": "个人资料",
+ "password": "密码",
+ "team": "团队"
+ },
+ "starPrompt": {
+ "title": "Star Checkmate",
+ "description": "查看最新版本并在 GitHub 上帮助发展社区"
+ },
+ "authFooter": {
+ "navControls": "控制",
+ "logOut": "登出",
+ "roles": {
+ "superAdmin": "超级管理员",
+ "admin": "管理员",
+ "user": "用户",
+ "demoUser": "演示用户"
+ }
+ }
+ },
+ "starPrompt": {
+ "title": "Star Checkmate",
+ "description": "查看最新版本并在 GitHub 上帮助发展社区"
+ }
+ },
+ "pages": {
+ "notFound": {
+ "title": "哦不!你的寿司掉了!",
+ "subtitle": "该 URL 不存在,或者您没有访问权限。"
+ },
+ "account": {
+ "tabs": {
+ "profile": "个人资料",
+ "password": "密码",
+ "team": "团队"
+ },
+ "form": {
+ "name": {
+ "title": "名称",
+ "description": "更新您的个人信息"
+ },
+ "photo": {
+ "title": "个人头像",
+ "description": "上传个人头像"
+ },
+ "currentPassword": {
+ "title": "当前密码",
+ "description": "输入当前密码以验证您的身份",
+ "option": {
+ "label": "当前密码",
+ "placeholder": "输入当前密码"
+ }
+ },
+ "newPassword": {
+ "title": "新密码",
+ "description": "请选择至少 8 个字符的强密码",
+ "option": {
+ "newPassword": {
+ "label": "新密码",
+ "placeholder": "输入新密码"
},
+ "confirm": {
+ "label": "确认密码",
+ "placeholder": "确认新密码"
+ }
+ }
+ },
+ "deleteAccount": {
+ "title": "删除账户",
+ "description": "此操作是永久的,无法撤销"
+ }
+ },
+ "team": {
+ "filter": {
+ "placeholder": "按角色筛选",
+ "all": "全部",
+ "admin": "管理员",
+ "member": "成员"
+ },
+ "table": {
+ "headers": {
+ "email": "邮箱",
+ "role": "角色",
+ "created": "创建"
+ }
+ },
+ "addMember": {
+ "title": "注册新团队成员",
+ "description": "创建新用户账户。创建后请安全地分享凭据。"
+ },
+ "invite": {
+ "title": "邀请团队成员",
+ "description": "发送邀请以加入您的团队",
+ "email": {
+ "label": "邮箱地址",
+ "placeholder": "输入邮箱地址"
+ },
+ "role": {
+ "label": "角色",
+ "placeholder": "选择角色"
+ },
+ "linkLabel": "邀请链接"
+ }
+ }
+ },
+ "auth": {
+ "common": {
+ "passwordRules": {
+ "length": {
+ "beginning": "必须至少",
+ "highlighted": "8 个字符长"
+ },
+ "lowercase": {
+ "beginning": "必须至少包含",
+ "highlighted": "一个小写字母"
+ },
+ "match": {
+ "beginning": "密码",
+ "highlighted": "必须匹配"
+ },
+ "number": {
+ "beginning": "必须至少包含",
+ "highlighted": "一个数字"
+ },
+ "special": {
+ "beginning": "必须至少包含",
+ "highlighted": "一个特殊字符"
+ },
+ "uppercase": {
+ "beginning": "必须至少包含",
+ "highlighted": "一个大写字母"
+ }
+ },
+ "form": {
+ "option": {
"email": {
- "errors": {
- "empty": "要继续,请输入电子邮件地址",
- "invalid": "请重新检查输入的电子邮件地址的有效性"
- }
+ "label": "邮箱",
+ "placeholder": "me@example.com"
},
- "role": {
- "errors": {
- "empty": "角色是必需的"
- }
+ "password": {
+ "label": "密码",
+ "placeholder": "********"
+ },
+ "confirmPassword": {
+ "label": "确认密码"
}
}
}
+ },
+ "login": {
+ "title": "欢迎回到 Checkmate!",
+ "subtitle": "登录以继续",
+ "submit": "登录",
+ "links": {
+ "forgotPassword": {
+ "text": "忘记密码?",
+ "linkText": "重置密码"
+ },
+ "register": {
+ "text": "还没有账户?",
+ "linkText": "在此注册"
+ }
+ }
+ },
+ "register": {
+ "title": "欢迎回到 Checkmate!",
+ "subtitle": "注册以开始使用",
+ "submit": "注册"
+ },
+ "forgotPassword": {
+ "title": "忘记密码了?",
+ "subtitle": "别担心,我们会给您发送重置说明。",
+ "submit": "请求恢复",
+ "links": {
+ "login": {
+ "text": "返回到",
+ "linkText": "登录"
+ }
+ }
+ },
+ "setNewPassword": {
+ "title": "重置您的密码",
+ "subtitle": "您的新密码必须与之前使用过的密码不同。"
}
},
- "role": "角色",
- "changeTeamPassword": {
- "changePasswordMenu": "",
- "title": "",
- "description": "",
- "success": ""
- }
- },
- "monitorState": {
- "paused": "暂停",
- "resumed": "恢复",
- "active": "已激活"
- },
- "menu": {
- "uptime": "上线时间",
- "pagespeed": "页面速度",
- "infrastructure": "基础设施",
- "incidents": "事件",
- "statusPages": "状态页",
- "maintenance": "维护",
- "integrations": "集成",
- "settings": "设置",
- "support": "支持",
- "discussions": "讨论",
- "docs": "文档",
- "changelog": "变更日志",
- "profile": "用户配置",
- "password": "密码",
- "team": "团队",
- "logOut": "登出",
- "notifications": "通知",
- "logs": "日志"
- },
- "settingsEmailUser": "电子邮件用户 - 用于身份验证的用户名,如果指定,则覆盖电子邮件地址",
- "state": "状态",
- "statusBreadCrumbsStatusPages": "状态页",
- "statusBreadCrumbsDetails": "详情",
- "commonSaving": "保存中...",
- "navControls": "控制",
- "incidentsPageTitle": "事件页面标题",
- "passwordPanel": {
- "passwordChangedSuccess": "您的密码已成功更改。",
- "passwordInputIncorrect": "您的密码输入错误。",
- "currentPassword": "当前密码",
- "enterCurrentPassword": "输入当前密码",
- "newPassword": "新密码",
- "enterNewPassword": "输入新密码",
- "confirmNewPassword": "确认新密码",
- "passwordRequirements": "新密码必须至少包含 8 个字符,并且必须至少包含一个大写字母、一个小写字母、一个数字和一个特殊字符。",
- "saving": "保存..."
- },
- "emailSent": "电子邮件已发送",
- "failedToSendEmail": "电子邮件发送失败",
- "settingsTestEmailSuccess": "设置测试电子邮件成功",
- "settingsTestEmailFailed": "发送测试电子邮件失败",
- "settingsTestEmailFailedWithReason": "发送测试电子邮件失败: {{reason}}",
- "settingsTestEmailUnknownError": "未知错误",
- "statusMsg": {
- "paused": "监视已暂停。",
- "up": "您的网站已上线。",
- "down": "您的网站已下线。",
- "pending": "等待中..."
- },
- "uptimeGeneralInstructions": {
- "http": "输入要监控的 URL 或 IP(例如.. https://example.com/ or 192.168.1.100)并添加仪表板上显示的清晰显示名称。",
- "ping": "输入要 ping 的 IP 地址或主机名(例如.. 192.168.1.100 或 example.com),并添加显示在仪表板上的清晰显示名称。",
- "docker": "码输入 Docker 容器名称或 ID。您可以使用容器名称(例如.. my-app)或容器 ID(完整的 64 字符 ID 或短 ID)。",
- "port": "输入服务器的 URL 或 IP、端口号和仪表板上显示的清晰显示名称。",
- "game": "输入要 ping 的 IP 地址或主机名和端口号(例如.. 192.168.1.100 或 example.com)并选择游戏类型。",
- "https": ""
- },
- "common": {
- "appName": "Checkmate",
- "monitoringAgentName": "捕获",
- "buttons": {
- "toggleTheme": "切换主题明&暗"
+ "checks": {
+ "selects": {
+ "monitor": {
+ "all": "所有监控"
+ },
+ "status": {
+ "all": "全部",
+ "down": "宕机",
+ "up": "正常"
+ }
+ },
+ "table": {
+ "empty": "此时间范围内没有宕机检查",
+ "headers": {
+ "statusCode": "状态码",
+ "location": "位置"
+ }
+ }
},
- "toasts": {
- "networkError": "网络错误",
- "checkConnection": "请检查你的网络连接",
- "unknownError": "未知错误"
- }
- },
- "auth": {
"common": {
- "navigation": {
- "continue": "继续",
- "back": "返回"
- },
- "inputs": {
- "email": {
- "label": "电子邮件",
- "placeholder": "jordan.ellis@domain.com",
- "errors": {
- "empty": "要继续,请输入您的电子邮件地址",
- "invalid": "请重新检查输入的电子邮件地址的有效性"
- }
+ "monitors": {
+ "actions": {
+ "configure": "配置",
+ "delete": "删除",
+ "generateToken": "生成令牌",
+ "details": "详情",
+ "incidents": "事件",
+ "inviteMember": "邀请成员",
+ "openSite": "打开站点",
+ "pause": "暂停",
+ "resume": "恢复"
+ },
+ "statBoxes": {
+ "activeFor": "已活跃",
+ "certificateExpiry": "证书到期",
+ "lastCheck": "上次检查",
+ "lastResponseTime": "上次响应时间"
+ },
+ "status": {
+ "down": "宕机",
+ "breached": "超出阈值",
+ "initializing": "初始化中",
+ "maintenance": "维护中",
+ "paused": "已暂停",
+ "total": "总计",
+ "up": "正常"
+ },
+ "monitorTypes": {
+ "optionDocker": "Docker",
+ "optionGame": "游戏",
+ "optionHttp": "HTTP(S)",
+ "optionPing": "Ping",
+ "optionPort": "端口",
+ "optionPagespeed": "PageSpeed",
+ "optionHardware": "基础设施",
+ "optionGrpc": "gRPC",
+ "optionWebSocket": "WebSocket"
+ }
+ }
+ },
+ "createMonitor": {
+ "form": {
+ "advanced": {
+ "description": "高级用例的可选设置",
+ "option": {
+ "advancedMatching": {
+ "label": "使用高级匹配"
+ },
+ "expectedValue": {
+ "label": "期望值"
+ },
+ "jsonPath": {
+ "description": "此表达式将针对响应 JSON 数据进行计算,结果将用于与期望值进行匹配。查询语言文档请参见 jmespath.org。",
+ "label": "JSONPath 表达式"
+ },
+ "matchMethod": {
+ "label": "匹配方法",
+ "equal": "相等",
+ "include": "包含",
+ "regex": "正则表达式"
+ }
+ },
+ "title": "高级设置"
},
- "password": {
- "label": "密码",
- "rules": {
- "length": {
- "beginning": "必须至少",
- "highlighted": "8 个字符长"
+ "frequency": {
+ "description": "您希望多久检查一次此监控的状态?",
+ "option": {
+ "frequency": {
+ "label": "检查频率",
+ "value": {
+ "fifteenMinutes": "15 分钟",
+ "fifteenSeconds": "15 秒",
+ "fiveMinutes": "5 分钟",
+ "fourMinutes": "4 分钟",
+ "oneMinute": "1 分钟",
+ "tenMinutes": "10 分钟",
+ "thirtyMinutes": "30 分钟",
+ "thirtySeconds": "30 秒",
+ "threeMinutes": "3 分钟",
+ "twoMinutes": "2 分钟"
+ }
+ }
+ },
+ "title": "检查频率"
+ },
+ "general": {
+ "option": {
+ "container": {
+ "label": "容器名称/ID",
+ "placeholder": "my-app 或 abcd1234"
+ },
+ "host": {
+ "label": "主机",
+ "placeholder": "192.168.1.100 或 example.com"
+ },
+ "name": {
+ "label": "显示名称",
+ "placeholder": "例如 My Website"
},
- "special": {
- "beginning": "必须至少包含",
- "highlighted": "一个特殊字符"
+ "secret": {
+ "label": "授权密钥",
+ "placeholder": "输入您的密钥"
},
- "number": {
- "beginning": "必须至少包含",
- "highlighted": "一个数字"
+ "url": {
+ "label": "URL",
+ "placeholder": "https://www.google.com"
},
- "uppercase": {
- "beginning": "必须至少包含",
- "highlighted": "一个大写字母"
+ "game": {
+ "label": "丢包监控网址",
+ "placeholder": "localhost"
},
- "lowercase": {
- "beginning": "必须至少包含",
- "highlighted": "一个小写字母"
+ "port": {
+ "label": "要监控的端口",
+ "placeholder": "80"
},
- "match": {
- "beginning": "密码",
- "highlighted": "必须匹配"
+ "grpcServiceName": {
+ "label": "服务名称",
+ "placeholder": "例如 my.service.v1(留空则检查整体健康状态)"
+ },
+ "wsUrl": {
+ "label": "WebSocket URL",
+ "placeholder": "wss://example.com/socket"
}
},
- "errors": {
- "empty": "请输入您的密码",
- "length": "密码长度必须至少为 8 个字符",
- "uppercase": "密码必须至少包含 1 个大写字母",
- "lowercase": "密码必须至少包含 1 个小写字母",
- "number": "密码必须至少包含 1 个数字",
- "special": "密码必须至少包含 1 个特殊字符",
- "incorrect": "您提供的密码与我们的记录不符"
+ "title": "常规设置",
+ "description": {
+ "http": "输入要监控的 URL 或 IP(例如 https://example.com/ 或 192.168.1.100),并添加显示在仪表板上的清晰显示名称。",
+ "ping": "输入要 ping 的 IP 地址或主机名(例如.. 192.168.1.100 或 example.com),并添加显示在仪表板上的清晰显示名称。",
+ "port": "输入服务器的 URL 或 IP、端口号和仪表板上显示的清晰显示名称。",
+ "docker": "码输入 Docker 容器名称或 ID。您可以使用容器名称(例如.. my-app)或容器 ID(完整的 64 字符 ID 或短 ID)。",
+ "game": "输入要 ping 的 IP 地址或主机名和端口号(例如.. 192.168.1.100 或 example.com)并选择游戏类型。",
+ "pagespeed": "跟踪网站的页面加载性能、Core Web Vitals 和优化评分。",
+ "grpc": "输入 gRPC 服务器的主机名和端口,可选指定健康检查的服务名称,并添加显示名称。",
+ "websocket": "输入要监控的 WebSocket URL(例如 wss://example.com/socket),并添加显示名称。",
+ "hardware": "监控基础设施的 CPU、内存、磁盘使用率和温度。"
}
},
- "passwordConfirm": {
- "label": "确认密码",
- "placeholder": "重新输入密码以确认",
- "errors": {
- "empty": "请再次输入您的密码以进行确认(有助于解决拼写错误)",
- "different": "输入的密码不匹配,因此其中一个密码可能输入错误"
- }
+ "ignoreTls": {
+ "description": "配置 HTTPS 连接的 TLS/SSL 证书验证。",
+ "option": {
+ "tls": {
+ "label": "忽略 TLS/SSL 错误"
+ }
+ },
+ "title": "TLS/SSL 设置"
},
- "firstName": {
- "label": "名字",
- "placeholder": "Jordan",
- "errors": {
- "empty": "请输入您的姓名",
- "length": "姓名必须少于 50 个字符",
- "pattern": "名称只能包含字母、空格、撇号或连字符"
+ "incidents": {
+ "description": "滑动窗口用于判断监控何时宕机。监控的状态只有在滑动窗口中的检查百分比达到指定值时才会改变。",
+ "option": {
+ "checks": {
+ "label": "滑动窗口中的检查次数"
+ },
+ "percentage": {
+ "label": "滑动窗口中多少百分比的检查失败/成功后监控状态才会改变?"
+ }
+ },
+ "title": "事件"
+ },
+ "notifications": {
+ "description": "选择您要使用的通知渠道",
+ "title": "通知"
+ },
+ "type": {
+ "description": "选择要执行的检查类型",
+ "optionDockerDescription": "使用 Docker 监控容器是否正在运行。",
+ "optionGameDescription": "监控特定游戏服务器是否在线。",
+ "optionGrpcDescription": "使用标准健康检查协议监控 gRPC 服务。",
+ "optionWebSocketDescription": "监控 WebSocket 端点的连接健康状况和响应时间。",
+ "optionHttpDescription": "使用 HTTP(S) 监控您的网站或 API 端点。",
+ "optionPingDescription": "使用 ICMP Ping 监控服务器是否在线。",
+ "optionPortDescription": "监控服务器上的特定端口是否开放。",
+ "title": "类型"
+ },
+ "thresholds": {
+ "title": "告警阈值",
+ "description": "定义此硬件监控触发告警的阈值。",
+ "option": {
+ "cpuThreshold": {
+ "label": "CPU 告警阈值 (%)"
+ },
+ "memoryThreshold": {
+ "label": "内存告警阈值 (%)"
+ },
+ "diskThreshold": {
+ "label": "磁盘告警阈值 (%)"
+ },
+ "tempThreshold": {
+ "label": "温度告警阈值 (°C)"
+ }
}
},
- "lastName": {
- "label": "姓",
- "placeholder": "Ellis",
- "errors": {
- "empty": "请输入您的姓氏",
- "length": "姓氏必须少于 50 个字符",
- "pattern": "姓氏只能包含字母、空格、撇号或连字符"
+ "geoChecks": {
+ "title": "地理分布式检查",
+ "description": "从多个地理位置运行检查,以监控全球可用性和性能。",
+ "option": {
+ "enabled": {
+ "label": "启用地理分布式检查"
+ },
+ "locations": {
+ "label": "位置",
+ "placeholder": "选择位置",
+ "options": {
+ "EU": "欧洲",
+ "NA": "北美洲",
+ "AS": "亚洲",
+ "SA": "南美洲",
+ "AF": "非洲",
+ "OC": "大洋洲"
+ }
+ },
+ "interval": {
+ "label": "检查间隔",
+ "value": {
+ "fiveMinutes": "5 分钟",
+ "tenMinutes": "10 分钟",
+ "fifteenMinutes": "15 分钟",
+ "thirtyMinutes": "30 分钟"
+ }
+ }
}
- }
- },
- "errors": {
- "validation": "验证数据时出错。"
- },
- "fields": {
- "password": {
- "errors": {
- "incorrect": "您提供的密码与我们的记录不符"
+ },
+ "url": {
+ "title": "在状态页上监控 IP/URL",
+ "description": "在公共状态页上显示监控的 IP 地址或 URL。如果禁用,将仅显示监控名称以保护敏感信息。",
+ "option": {
+ "showURL": {
+ "label": "在状态页上显示 IP/URL",
+ "enabled": "已启用",
+ "disabled": "已禁用"
+ }
}
},
- "role": {
- "errors": {
- "min": "必须至少设置一个角色"
+ "stats": {
+ "title": "监控历史",
+ "description": "清除您团队的所有监控历史和统计数据。此操作不可逆。",
+ "buttonText": "清除所有统计",
+ "dialog": {
+ "title": "清除所有监控历史?",
+ "description": "这将永久删除您团队的所有监控历史、统计数据和检查数据。此操作无法撤销。",
+ "confirm": "是的,清除所有统计"
}
}
}
},
- "login": {
- "heading": "登录以继续",
- "subheadings": {
- "stepOne": "输入您的电子邮件",
- "stepTwo": "输入您的密码"
+ "editUser": {
+ "form": {
+ "roles": {
+ "title": "角色",
+ "description": "为用户分配角色。可以选择多个角色。"
+ }
},
- "links": {
- "forgotPassword": "忘记密码?",
- "register": "没有帐户?",
- "forgotPasswordLink": "重置密码",
- "registerLink": "注册链接"
+ "dialog": {
+ "removeUser": {
+ "title": "移除用户",
+ "content": "确定要将 {{name}} 从您的团队中移除吗?此操作无法撤销。"
+ }
+ }
+ },
+ "incidents": {
+ "dialog": {
+ "resolveIncident": {
+ "title": "解决事件",
+ "option": {
+ "comment": {
+ "label": "备注(可选)",
+ "placeholder": "添加关于解决方案的备注..."
+ }
+ }
+ },
+ "details": {
+ "analysis": "事件分析",
+ "comment": "备注:",
+ "detailsLabel": "详情",
+ "downtime": "停机时间:",
+ "message": "消息:",
+ "monitor": "监控:",
+ "overview": "概览",
+ "resolutionDetails": "解决详情",
+ "resolutionType": "类型:",
+ "resolutionTypes": {
+ "automatic": "自动",
+ "manual": "手动"
+ },
+ "resolve": "解决事件",
+ "resolvedAt": "解决于:",
+ "resolvedBy": "解决人:",
+ "startedAt": "开始于:",
+ "status": "状态:",
+ "statusCode": "状态码:",
+ "timeline": "时间线",
+ "title": "事件详情",
+ "url": "URL:"
+ }
},
- "toasts": {
- "success": "欢迎回来!您已成功登录。",
- "incorrectPassword": "密码错误"
+ "filters": {
+ "allMonitors": "所有监控",
+ "monitor": "监控",
+ "resolutionType": "解决类型",
+ "resolutionTypes": {
+ "manual": "手动",
+ "automatic": "自动",
+ "all": "全部"
+ }
},
- "errors": {
- "password": {
- "incorrect": "您提供的密码与我们的记录不符"
+ "summaryCard": {
+ "activeIncidents": {
+ "title": "活跃事件",
+ "active_zero": "没有活跃事件",
+ "active_one": "{{count}} 个活跃事件",
+ "active_other": "{{count}} 个活跃事件"
+ },
+ "incidentStats": {
+ "avgResolutionTime": "平均解决时间",
+ "mostAffectedMonitor": "受影响最大的监控",
+ "title": "事件统计",
+ "totalIncidents": "总事件数"
+ },
+ "latestIncidents": {
+ "title": "最新事件"
}
},
- "welcome": "欢迎回到 Checkmate!"
+ "table": {
+ "actions": {
+ "details": "详情",
+ "goToMonitor": "前往监控",
+ "resolveManually": "手动解决"
+ },
+ "activeIncidents": "活跃事件",
+ "headers": {
+ "endTime": "结束时间",
+ "resolutionType": "解决类型",
+ "startTime": "开始时间",
+ "statusCode": "状态码"
+ },
+ "resolvedIncidents": "已解决事件",
+ "status": {
+ "active": "活跃",
+ "resolved": "已解决"
+ }
+ }
},
- "registration": {
- "heading": {
- "superAdmin": "创建超级管理员",
- "user": "注册"
- },
- "subheadings": {
- "stepOne": "输入您的个人详细信息",
- "stepTwo": "输入您的电子邮件",
- "stepThree": "创建密码"
+ "infrastructure": {
+ "charts": {
+ "labels": {
+ "cpu": "CPU 使用率",
+ "disk": "磁盘使用率",
+ "memory": "内存使用率",
+ "netBytesRecv": "{{name}} - 接收字节",
+ "netBytesSent": "{{name}} - 发送字节",
+ "temp": "温度"
+ }
},
- "description": {
- "superAdmin": "创建超级用户帐户以开始使用",
- "user": "注册为用户并请求超级管理员访问您的监视器"
+ "gauges": {
+ "cpu": {
+ "lowerLabel": "最大频率",
+ "title": "CPU 使用率",
+ "upperLabel": "当前频率"
+ },
+ "disk": {
+ "lowerLabel": "可用",
+ "title": "磁盘 {{idx}} 使用率",
+ "upperLabel": "已使用"
+ },
+ "memory": {
+ "lowerLabel": "可用",
+ "title": "内存使用率",
+ "upperLabel": "已使用"
+ }
},
- "gettingStartedButton": {
- "superAdmin": "创建超级管理员帐户",
- "user": "注册普通用户"
+ "statBoxes": {
+ "avgCpuTemperature": "CPU 平均温度",
+ "cpuFrequency": "CPU 频率",
+ "cpuLogical": "CPU(逻辑核心)",
+ "cpuPhysical": "CPU(物理核心)",
+ "disk": "磁盘",
+ "memory": "内存",
+ "os": "系统"
},
- "termsAndPolicies": "创建帐户即表示您同意我们的服务条款和隐私政策 。",
- "links": {
- "login": "已拥有帐号? 登录"
+ "table": {
+ "headers": {
+ "cpu": "CPU",
+ "disk": "磁盘",
+ "memory": "内存"
+ }
},
- "toasts": {
- "success": "欢迎!您的账号已成功创建。"
+ "tabs": {
+ "labels": {
+ "network": "网络",
+ "overview": "概览"
+ }
},
- "welcome": "欢迎来到Checkmate!"
+ "fallback": {
+ "actionButton": "创建监控!",
+ "checks": "Track the performance of your servers,Identify bottlenecks and optimize usage,Ensure reliability with real-time monitoring",
+ "title": "基础设施监控用于:"
+ }
},
- "forgotPassword": {
- "heading": "忘记密码?",
- "subheadings": {
- "stepOne": "不用担心,我们会向您发送重置说明。",
- "stepTwo": "我们已发送密码重置链接到 ",
- "stepThree": "您的新密码必须与以前使用的密码不同。",
- "stepFour": "您的密码已成功重置。点击下方登录。"
+ "logs": {
+ "tabs": {
+ "diagnostics": "诊断",
+ "logs": "服务器日志",
+ "queue": "作业队列"
},
- "buttons": {
- "openEmail": "打开电子邮件应用",
- "resetPassword": "重置密码"
+ "logLevelSelect": {
+ "label": "日志级别"
},
- "imageAlts": {
- "passwordKey": "密码图标",
- "email": "电子邮件图标",
- "lock": "锁定图标",
- "passwordConfirm": "密码确认图标"
+ "jobQueue": "作业队列",
+ "failedJobs": "失败作业",
+ "noLogs": "未找到日志",
+ "metrics": {
+ "jobs": "作业",
+ "activeJobs": "活跃作业",
+ "failingJobs": "失败中的作业",
+ "totalRuns": "总运行次数",
+ "totalFailures": "总失败次数"
},
- "links": {
- "login": "返回到登录",
- "resend": "没有收到电子邮件? 点击重新发送"
+ "diagnostics": {
+ "stats": {
+ "eventLoopDelay": "事件循环延迟",
+ "uptime": "正常运行时间",
+ "usedHeapSize": "已使用堆大小",
+ "totalHeapSize": "总堆大小",
+ "osMemoryLimit": "操作系统内存限制"
+ },
+ "gauges": {
+ "heapAllocation": "堆分配",
+ "heapUsage": "堆使用率",
+ "heapUtilization": "堆利用率",
+ "instantCpuUsage": "即时 CPU 使用率",
+ "availableMemoryPercentage": "可用内存百分比",
+ "allocatedPercentage": "已分配百分比",
+ "usedSPercentage": "CPU 1 秒使用百分比",
+ "total": "总计",
+ "used": "已使用"
+ }
},
- "toasts": {
- "sent": "指令发送至 .",
- "emailNotFound": "未找到电子邮件。",
- "redirect": "将在秒后重定向...",
- "success": "您的密码已成功重置。",
- "error": "无法重置密码。请稍后重试或联系支持人员。"
+ "table": {
+ "headers": {
+ "timestamp": "时间戳",
+ "level": "级别",
+ "service": "服务",
+ "method": "方法",
+ "monitorId": "监控 ID",
+ "runCount": "运行次数",
+ "failCount": "失败次数",
+ "lastRunAt": "上次运行于",
+ "lockedAt": "锁定于",
+ "lastFinishedAt": "上次完成于",
+ "lastRunTook": "上次运行耗时",
+ "lastFailedAt": "上次失败于",
+ "failReason": "失败原因"
+ }
}
- }
- },
- "errorPages": {
- "serverUnreachable": {
- "toasts": {
- "reconnected": "已成功重新连接到服务器。",
- "stillUnreachable": "服务器仍然无法访问。请稍后重试。"
+ },
+ "maintenanceWindow": {
+ "fallback": {
+ "actionButton": "创建维护窗口!",
+ "checks": "Mark your maintenance periods,Eliminate any misunderstandings,Stop sending alerts in maintenance windows",
+ "title": "维护窗口用于:"
+ },
+ "table": {
+ "headers": {
+ "nextWindow": "下一个窗口",
+ "repeat": "重复"
+ }
},
- "alertBox": "服务器连接错误",
- "description": "我们无法连接到服务器。如果问题仍然存在,请检查您的互联网连接或验证您的部署配置。",
- "retryButton": {
- "default": "尝试重连",
- "processing": "连接中..."
+ "form": {
+ "general": {
+ "title": "常规设置",
+ "description": "为维护窗口设置名称和重复选项。",
+ "option": {
+ "name": {
+ "label": "名称",
+ "placeholder": "例如 每周维护"
+ },
+ "repeat": {
+ "label": "重复"
+ }
+ }
+ },
+ "startDate": {
+ "title": "开始日期",
+ "description": "选择维护窗口的开始日期。",
+ "option": {
+ "startDate": {
+ "label": "开始日期"
+ }
+ }
+ },
+ "startTime": {
+ "title": "开始时间",
+ "description": "设置维护窗口的开始时间和持续时间。所有时间均为 UTC",
+ "option": {
+ "duration": {
+ "label": "持续时间"
+ },
+ "startTime": {
+ "label": "开始时间"
+ }
+ },
+ "monitors": {
+ "title": "监控",
+ "description": "维护窗口应用的监控对象",
+ "option": {
+ "addMonitors": {
+ "label": "添加监控"
+ }
+ }
+ }
+ }
}
- }
- },
- "createNotifications": {
- "title": "创建通知通道",
- "nameSettings": {
- "title": "名字",
- "description": "集成的描述性名称。",
- "nameLabel": "名字",
- "namePlaceholder": "例如.. Slack 通知"
- },
- "typeSettings": {
- "title": "类型",
- "description": "选择要创建的通知通道类型。",
- "typeLabel": "类型"
- },
- "emailSettings": {
- "title": "邮箱",
- "description": "目标电子邮件地址。",
- "emailLabel": "电子邮件地址",
- "emailPlaceholder": "例如.. john@example.com"
- },
- "slackSettings": {
- "title": "Slack",
- "description": "在此处配置您的 Slack Webhook",
- "webhookLabel": "Slack webhook 网址",
- "webhookPlaceholder": "https://hooks.slack.com/services/..."
- },
- "pagerdutySettings": {
- "title": "PagerDuty",
- "description": "在此处配置您的 PagerDuty 集成",
- "integrationKeyLabel": "集成密钥",
- "integrationKeyPlaceholder": "1234567890"
- },
- "discordSettings": {
- "title": "Discord",
- "description": "在此处配置您的 Discord Webhook",
- "webhookLabel": "Discord Webhook 网址",
- "webhookPlaceholder": "https://your-server.com/webhook"
- },
- "webhookSettings": {
- "title": "Webhook",
- "description": "在此处配置 Webhook",
- "webhookLabel": "Webhook网址",
- "webhookPlaceholder": "https://your-server.com/webhook"
- },
- "testNotification": "测试通知",
- "dialogDeleteTitle": "你确认要删除此通知吗?",
- "dialogDeleteConfirm": "删除"
- },
- "notificationConfig": {
- "title": "通知",
- "description": "选择要使用的通知渠道"
- },
- "monitorStatus": {
- "checkingEvery": "每隔 {{interval}} 检查一次",
- "withCaptureAgent": "使用 Capture 代理 {{version}}",
- "up": "在线",
- "down": "离线",
- "paused": "暂停"
- },
- "advancedMatching": "高级匹配",
- "sendTestNotifications": "发送测试通知",
- "selectAll": "全选",
- "showAdminLoginLink": "显示“管理员?在此处登录“状态页面上的链接",
- "logsPage": {
- "title": "日志",
- "description": "系统日志 - 最后 1000 行",
- "tabs": {
- "queue": "作业队列",
- "logs": "服务器日志",
- "diagnostics": "诊断"
- },
- "toast": {
- "fetchLogsSuccess": "日志获取成功"
},
- "logLevelSelect": {
- "title": "日志等级",
- "values": {
- "all": "全部",
- "info": "信息",
- "warn": "警告",
- "error": "错误",
- "debug": "调试"
+ "notifications": {
+ "fallback": {
+ "actionButton": "创建渠道",
+ "checks": "Alert teams about downtime or performance issues,Let engineers know when incidents happen,Keep administrators informed of system changes",
+ "title": "通知渠道用于:"
+ },
+ "form": {
+ "accessToken": {
+ "optionAccessToken": "访问令牌",
+ "placeholder": "syt_YWxleF9ob2xsaWRheQ_VmtScmV0U2VjcmV0S2V5_abc123"
+ },
+ "address": {
+ "description": "通知将发送到的地址。",
+ "optionAddress": "地址",
+ "placeholderEmail": "example@example.com",
+ "placeholderWebhook": "https://your-server.com/webhook",
+ "title": "地址"
+ },
+ "homeServer": {
+ "optionHomeServer": "主服务器",
+ "placeholder": "example.com"
+ },
+ "matrix": {
+ "description": "配置 Matrix 主服务器连接以接收通知。",
+ "title": "Matrix 配置"
+ },
+ "notificationName": {
+ "description": "通知渠道的描述性名称",
+ "optionName": "渠道名称",
+ "placeholder": "例如 生产告警",
+ "title": "渠道名称"
+ },
+ "pagerDuty": {
+ "description": "您的 PagerDuty 集成密钥,用于接收告警。",
+ "optionIntegrationKey": "集成密钥",
+ "placeholder": "a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6",
+ "title": "集成密钥"
+ },
+ "roomId": {
+ "optionRoomId": "房间 ID",
+ "placeholder": "!abcdefg:matrix.org"
+ },
+ "type": {
+ "description": "选择要创建的通知渠道类型。",
+ "optionType": "类型",
+ "title": "渠道类型"
+ },
+ "telegram": {
+ "title": "Telegram 配置",
+ "description": "要启用 Telegram 通知,请使用 BotFather创建一个 Telegram 机器人。然后,获取 API 令牌和聊天 ID 并在此处填写。",
+ "optionBotToken": "机器人令牌",
+ "placeholderBotToken": "123456789:ABCdefGhIJKlmNoPQRsTUVwxyZ",
+ "optionChatId": "聊天 ID",
+ "placeholderChatId": "-1001234567890"
+ }
+ },
+ "table": {
+ "headers": {
+ "destination": "目标"
+ }
}
- }
- },
- "queuePage": {
- "title": "队列",
- "refreshButton": "刷新",
- "flushButton": "刷新队列",
- "jobTable": {
- "title": "当前在队列中的作业",
- "idHeader": "监视器 ID",
- "urlHeader": "网址",
- "typeHeader": "类型",
- "activeHeader": "有效",
- "lockedAtHeader": "锁定在",
- "runCountHeader": "运行计数",
- "failCountHeader": "失败计数",
- "lastRunHeader": "上次运行时间",
- "lastFinishedAtHeader": "最后完成时间",
- "lastRunTookHeader": "上次运行花费了",
- "intervalHeader": "间隔"
- },
- "metricsTable": {
- "title": "队列指标",
- "metricHeader": "度量",
- "valueHeader": "值"
- },
- "failedJobTable": {
- "title": "失败的作业",
- "monitorIdHeader": "监视器ID",
- "monitorUrlHeader": "监控网址",
- "failCountHeader": "失败计数",
- "failedAtHeader": "上次失败时于",
- "failReasonHeader": "失败原因"
- }
- },
- "export": {
- "title": "导出监视器",
- "success": "监视器导出成功!",
- "failed": "导出监视器失败"
- },
- "monitorActions": {
- "title": "导出/导入",
- "import": "导入监视器",
- "export": "导出监视器",
- "deleteSuccess": "监视项删除成功",
- "deleteFailed": "删除监视项失败",
- "details": "详情"
- },
- "settingsPage": {
- "aboutSettings": {
- "labelDevelopedBy": "由 Bluewave Labs 开发",
- "labelVersion": "版本",
- "title": "关于"
- },
- "demoMonitorsSettings": {
- "buttonAddMonitors": "添加演示监视器",
- "description": "添加示例监视器以进行演示。",
- "title": "示例监视器"
},
- "emailSettings": {
- "buttonSendTestEmail": "发送测试电子邮件",
- "description": "配置系统的电子邮件设置。这用于发送通知和警报。",
- "descriptionTransport": "这将为 NodeMailer 构建 SMTP 传输",
- "labelAddress": "电子邮件地址 - 用于身份验证",
- "labelConnectionHost": "电子邮件连接主机 - 要在 HELO/EHLO 问候语中使用的主机名",
- "labelHost": "电子邮件主机 - 要连接到的主机名或 IP 地址",
- "labelIgnoreTLS": "禁用 STARTTLS:即使服务器支持 TLS,也不要使用 TLS",
- "labelPassword": "电子邮件密码 - 身份验证密码",
- "labelPasswordSet": "已设置密码。单击重置以更改它。",
- "labelPool": "启用连接池:重用现有连接以提高性能",
- "labelPort": "电子邮件端口 - 要连接的端口",
- "labelRejectUnauthorized": "拒绝无效证书:拒绝具有自签名或不受信任的证书的连接",
- "labelRequireTLS": "强制 STARTTLS:需要 TLS 升级,如果不支持则失败",
- "labelSecure": "使用 SSL(推荐):使用 SSL/TLS 加密连接",
- "labelTLSServername": "TLS 服务器名称 - 当主机是 IP 时,用于 TLS 验证的可选主机名",
- "labelUser": "电子邮件用户 - 用于身份验证的用户名,如果指定,则覆盖电子邮件地址",
- "linkTransport": "在此处查看规格",
- "placeholderUser": "如果不需要,请留空",
- "title": "电子邮件",
- "toastEmailRequiredFieldsError": "需要输入电子邮件地址、主机、端口和密码"
- },
- "pageSpeedSettings": {
- "description": "输入您的 Google PageSpeed API 密钥以启用 Google PageSpeed 监控。单击重置以更新密钥。",
- "labelApiKeySet": "API 密钥已设置。单击重置以更改它。",
- "labelApiKey": "ageSpeed API 密钥",
- "title": "Google PageSpeed API 密钥"
- },
- "saveButtonLabel": "保存",
- "statsSettings": {
- "clearAllStatsButton": "清除所有统计",
- "clearAllStatsDescription": "清除所有统计数据。这是不可逆转的。",
- "clearAllStatsDialogConfirm": "是的,清除所有统计数据",
- "clearAllStatsDialogDescription": "一旦删除,监控历史记录和统计信息将无法检索。",
- "clearAllStatsDialogTitle": "你想清除所有的统计数据吗?",
- "description": "定义要保留历史数据的时间。您还可以清除所有现有数据。",
- "labelTTL": "要保留监控历史记录的天数。",
- "labelTTLOptional": "0 表示无限",
- "title": "查看历史记录"
- },
- "systemResetSettings": {
- "buttonRemoveAllMonitors": "移除所有监视项",
- "description": "从系统中移除所有监视项。",
- "dialogConfirm": "确定,移除所有监视项",
- "dialogDescription": "移除后,无法恢复这些监视项。",
- "dialogTitle": "你想移除所有的监视项吗?",
- "title": "系统复位"
- },
- "timezoneSettings": {
- "description": "选择用于在整个应用程序中显示日期和时间时区。",
- "label": "显示时区",
- "title": "显示时区"
- },
- "title": "设置",
- "uiSettings": {
- "description": "在亮色和暗色模式之间切换,或更改用户界面语言。",
- "labelLanguage": "语言",
- "labelTheme": "主题模式",
- "title": "外观"
- },
- "urlSettings": {
- "description": "在公共状态页面上显示监控的 IP 地址或 URL。如果禁用,则仅显示监控名称以保护敏感信息。",
- "label": "在状态页面显示 IP/URL",
- "selectDisabled": "禁用",
- "selectEnabled": "启用",
- "title": "在状态页面上监控 IP/URL"
- },
- "globalThresholds": {
- "title": "全局阈值",
- "description": "配置 CPU、内存、磁盘和温度阈值。如果提供了阈值,则会自动启用监控。"
- }
- },
- "statusPageCreate": {
- "buttonSave": "保存"
- },
- "incidentsOptionsHeaderFilterResolved": "已解决",
- "settingsSave": "保存",
- "statusPageCreateAppearanceTitle": "外观",
- "confirmPassword": "确认密码",
- "monitorHooks": {
- "failureAddDemoMonitors": "未能添加示例监视器",
- "successAddDemoMonitors": "成功添加示例监视器"
- },
- "settingsAppearance": "外观",
- "settingsDisplayTimezone": "显示时区",
- "settingsGeneralSettings": "常规设置",
- "incidentsOptionsHeaderTotalIncidents": "事件总数",
- "statusPage": {
- "deleteSuccess": "状态页面已成功删除",
- "deleteFailed": "删除状态页面失败",
- "createSuccess": "状态页创建成功",
- "updateSuccess": "状态页更新成功",
- "generalSettings": "常规设置",
- "contents": "内容",
- "fallback": {
- "checks": [
- "实时监控和显示服务的运行状况",
- "跟踪多个服务并共享其状态",
- "让用户了解中断和性能"
- ],
- "title": "状态页用于:",
- "actionButton": "让我们创建你的第一个状态页!"
- }
- },
- "testNotificationsDisabled": "此监视器没有通知设置。您需要通过单击‘配置’按钮来添加一个",
- "incidentsTableResolvedAt": "解决于",
- "incidentsTableActionResolve": "解决",
- "checkHooks": {
- "failureResolveOne": "未能解决事件。",
- "failureResolveAll": "未能解决所有事件。",
- "failureResolveMonitor": "故障排除监控事件失败。"
- },
- "checkFormError": "请检查表单中的错误。",
- "diagnosticsPage": {
- "diagnosticDescription": "系统诊断",
- "statsDescription": "系统统计数据",
- "gauges": {
- "heapAllocationTitle": "堆分配",
- "heapAllocationSubtitle": "% 的可用内存占用率",
- "heapUsageTitle": "堆使用情况",
- "heapUsageSubtitle": "% 的可用内存占用率",
- "heapUtilizationTitle": "堆利用率",
- "heapUtilizationSubtitle": "% 的分配百分比",
- "instantCpuUsageTitle": "当前 CPU 使用率",
- "instantCpuUsageSubtitle": "% 的1秒CPU占用率"
- },
- "stats": {
- "eventLoopDelayTitle": "事件循环延迟",
- "uptimeTitle": "运行时间",
- "usedHeapSizeTitle": "已用堆内存大小",
- "totalHeapSizeTitle": "总堆大小",
- "osMemoryLimitTitle": "系统内存限制"
- }
- },
- "pageSpeedLighthouseAPI": "使用 Lighthouse PageSpeed API 监控您的网站",
- "time": {
- "threeMinutes": "3 分钟",
- "fiveMinutes": "5 分钟",
- "tenMinutes": "10 分钟",
- "twentyMinutes": "20 分钟",
- "oneHour": "1 小时",
- "oneDay": "1 天",
- "oneWeek": "1 周",
- "fourMinutes": "4 分钟",
- "oneMinute": "1 分钟",
- "twoMinutes": "2 分钟",
- "fifteenSeconds": "15 秒",
- "thirtySeconds": "30 秒"
- },
- "general": {
- "noOptionsFound": "{{unit}} 未找到"
- },
- "infrastructureMonitor": {
- "fallback": {
- "checks": [
- "追踪服务器性能表现",
- "识别瓶颈并优化资源利用率",
- "通过实时监控保障系统可靠性"
- ],
- "title": "基础设施监视器用于:",
- "actionButton": "让我们创建你的第一个基础设施视器!"
- }
- },
- "maintenanceWindow": {
- "fallback": {
- "checks": ["标记维护时段", "消除所有误解", "停止在维护窗口内发送警报"],
- "title": "维护时段用于:",
- "actionButton": "让我们创建您的第一个维护时段!"
- }
- },
- "pageSpeed": {
- "fallback": {
- "checks": ["报告页面的用户体验", "帮助分析网页速度", "就如何改进页面提出建议"],
- "title": "PageSpeed 监视器用于:",
- "actionButton": "让我们创建您的第一个 PageSpeed 监视器!"
- }
- },
- "uptimeMonitor": {
- "fallback": {
- "checks": [
- "检测网站或服务器是否在线及响应正常",
- "向团队发送停机或性能问题警报",
- "监控 HTTP 端点、Ping 测试、容器及端口状态",
- "追踪历史运行时长与可靠性趋势"
- ],
- "title": "正常运行时间监视器用于:",
- "actionButton": "让我们创建您的第一个正常运行时间监视器!"
- }
- },
- "editUserPage": {
- "form": {
- "email": "电子邮件",
- "firstName": "名",
- "lastName": "姓氏",
- "role": "角色",
- "save": "保存"
- },
- "table": {
- "actionHeader": "操作",
- "roleHeader": "角色"
- },
- "title": "编辑用户",
- "toast": {
- "successUserUpdate": "用户更新成功",
- "validationErrors": "验证错误"
- }
- },
- "incidentsPageActionResolveMonitor": "解决监控事件",
- "incidentsPageActionResolveAll": "解决所有事件",
- "matchMethodOptions": {
- "equal": "相等",
- "equalPlaceholder": "成功",
- "include": "包含",
- "includePlaceholder": "OK",
- "regex": "正则表达式",
- "regexPlaceholder": "^(success|ok)$",
- "text": "匹配方法"
- },
- "monitorType": {
- "docker": {
- "label": "容器 ID",
- "namePlaceholder": "我的容器",
- "placeholder": "我的应用程序或 abcd1234"
- },
- "http": {
- "label": "要监控的 URL",
- "namePlaceholder": "Google",
- "placeholder": "google.com"
+ "pageSpeed": {
+ "charts": {
+ "common": {
+ "cls": "累积布局偏移 (CLS)",
+ "fcp": "首次内容绘制 (FCP)",
+ "lcp": "最大内容绘制 (LCP)",
+ "si": "速度指数 (SI)",
+ "tbt": "总阻塞时间 (TBT)"
+ },
+ "legend": {
+ "title": "PageSpeed 报告",
+ "weight": "权重"
+ },
+ "pie": {
+ "title": "性能报告"
+ }
+ },
+ "table": {
+ "headers": {
+ "pageSpeedScore": "PageSpeed 评分"
+ }
+ },
+ "fallback": {
+ "actionButton": "创建监控!",
+ "checks": "Report on the user experience of a page,Help analyze webpage speed,Give suggestions on how the page can be improved",
+ "title": "PageSpeed 监控用于:"
+ }
},
- "ping": {
- "label": "要监控的 IP 地址",
- "namePlaceholder": "Google",
- "placeholder": "1.1.1.1"
+ "settings": {
+ "form": {
+ "timezone": {
+ "title": "显示时区",
+ "description": "选择应用程序中用于显示日期和时间的时区。",
+ "option": {
+ "timezone": {
+ "label": "显示时区"
+ }
+ }
+ },
+ "ui": {
+ "title": "外观",
+ "description": "在浅色和深色模式之间切换、更改语言或自定义图表显示类型。",
+ "option": {
+ "theme": {
+ "label": "主题模式",
+ "light": "浅色",
+ "dark": "深色"
+ },
+ "language": {
+ "label": "语言"
+ },
+ "chartType": {
+ "label": "图表类型",
+ "histogram": "柱状图",
+ "heatmap": "热力图"
+ }
+ }
+ },
+ "pagespeed": {
+ "title": "Google PageSpeed API 密钥",
+ "description": "输入您的 Google PageSpeed API 密钥以启用 Google PageSpeed 监控。点击重置以更新密钥。",
+ "option": {
+ "apiKey": {
+ "label": "PageSpeed API 密钥",
+ "labelSet": "API 密钥已设置。点击重置以更改。",
+ "placeholder": "输入您的 Google PageSpeed API 密钥"
+ }
+ }
+ },
+ "url": {
+ "title": "在状态页上监控 IP/URL",
+ "description": "在公共状态页上显示监控的 IP 地址或 URL。如果禁用,将仅显示监控名称以保护敏感信息。",
+ "option": {
+ "showURL": {
+ "label": "在状态页上显示 IP/URL",
+ "enabled": "已启用",
+ "disabled": "已禁用"
+ }
+ }
+ },
+ "stats": {
+ "title": "监控历史",
+ "description": "清除您团队的所有监控历史和统计数据。此操作不可逆。",
+ "option": {
+ "clear": {
+ "label": "清除所有统计数据。此操作不可逆。"
+ }
+ },
+ "dialog": {
+ "title": "清除所有监控历史?",
+ "description": "此操作无法撤销"
+ }
+ },
+ "retention": {
+ "title": "检查数据保留",
+ "description": "设置检查数据在自动清理前保留多长时间。",
+ "option": {
+ "days": {
+ "label": "保留期限(天)",
+ "unlimited": "无限制"
+ }
+ }
+ },
+ "thresholds": {
+ "title": "全局阈值",
+ "description": "设置基础设施监控的全局 CPU、内存、磁盘和温度阈值。除非被覆盖,否则适用于所有硬件监控。",
+ "option": {
+ "cpu": {
+ "label": "CPU 阈值 (%)",
+ "placeholder": "1 - 100"
+ },
+ "memory": {
+ "label": "内存阈值 (%)",
+ "placeholder": "1 - 100"
+ },
+ "disk": {
+ "label": "磁盘阈值 (%)",
+ "placeholder": "1 - 100"
+ },
+ "temperature": {
+ "label": "温度阈值 (°C)",
+ "placeholder": "1 - 150"
+ }
+ }
+ },
+ "email": {
+ "title": "邮件设置",
+ "description": "配置系统的邮件设置。用于发送通知和告警。",
+ "descriptionTransport": "这将为 NodeMailer 构建 SMTP 传输",
+ "descriptionTransportLink": "在此查看规范",
+ "option": {
+ "host": {
+ "label": "邮件主机 - 要连接的主机名或 IP 地址",
+ "placeholder": "smtp.gmail.com"
+ },
+ "port": {
+ "label": "邮件端口 - 要连接的端口",
+ "placeholder": "587"
+ },
+ "address": {
+ "label": "邮箱地址 - 用于身份验证",
+ "placeholder": "you@example.com"
+ },
+ "user": {
+ "label": "邮件用户 - 用于身份验证的用户名,如果指定则覆盖邮箱地址",
+ "placeholder": "如不需要请留空"
+ },
+ "password": {
+ "label": "邮件密码 - 用于身份验证的密码",
+ "labelSet": "密码已设置。点击重置以更改。",
+ "placeholder": "输入您的密码"
+ },
+ "tlsServername": {
+ "label": "TLS 服务器名 - 当主机为 IP 时用于 TLS 验证的可选主机名",
+ "placeholder": "example.com"
+ },
+ "connectionHost": {
+ "label": "邮件连接主机 - 在 HELO/EHLO 问候中使用的主机名",
+ "placeholder": "localhost"
+ },
+ "secure": {
+ "label": "使用 SSL(推荐):使用 SSL/TLS 加密连接"
+ },
+ "pool": {
+ "label": "启用连接池:重用现有连接以提高性能"
+ },
+ "ignoreTLS": {
+ "label": "禁用 STARTTLS:即使服务器支持也不使用 TLS"
+ },
+ "requireTLS": {
+ "label": "强制 STARTTLS:要求 TLS 升级,不支持则失败"
+ },
+ "rejectUnauthorized": {
+ "label": "拒绝无效证书:拒绝自签名或不受信任证书的连接"
+ }
+ }
+ },
+ "demoMonitors": {
+ "title": "演示监控",
+ "description": "添加用于演示目的的示例监控。"
+ },
+ "removeMonitors": {
+ "title": "系统重置",
+ "description": "从系统中移除所有监控。",
+ "dialog": {
+ "title": "移除所有监控?",
+ "description": "此操作无法撤销。"
+ }
+ },
+ "exportMonitors": {
+ "title": "导出监控"
+ },
+ "importExportMonitors": {
+ "title": "导入/导出监控",
+ "description": "将监控数据导入或导出为 JSON 文件,用于备份或迁移。"
+ },
+ "about": {
+ "title": "关于",
+ "developedBy": "由 Bluewave Labs 开发"
+ },
+ "validation": {
+ "errorMessage": "请修复以下验证错误:"
+ }
+ }
},
- "port": {
- "label": "要监控的 URL",
- "namePlaceholder": "localhost:5173",
- "placeholder": "localhost"
+ "statusPages": {
+ "deleteSuccess": "状态页已成功删除",
+ "fallback": {
+ "title": "状态页用于:",
+ "checks": "Communicate system status to users and stakeholders,Display real-time uptime information publicly,Build trust with transparent service monitoring,Reduce support requests during incidents",
+ "actionButton": "创建状态页!"
+ },
+ "monitorsList": {
+ "chartTypeHeatmap": "热力图",
+ "chartTypeHistogram": "柱状图",
+ "noData": "无可用数据",
+ "infrastructure": {
+ "title": "基础设施",
+ "cpu": "CPU",
+ "memory": "RAM",
+ "memoryText": "内存",
+ "disk": "磁盘",
+ "usage": "使用率",
+ "used": "已使用",
+ "total": "总计"
+ },
+ "uptime": {
+ "title": "正常运行时间",
+ "responseTime": "响应时间"
+ }
+ },
+ "statusBar": {
+ "allDown": "所有系统已宕机",
+ "allUp": "所有系统运行正常",
+ "degraded": "部分系统正在出现问题",
+ "unknown": "无法确定系统状态"
+ },
+ "table": {
+ "headers": {
+ "name": "状态页名称",
+ "url": "公共 URL"
+ },
+ "published": "已发布",
+ "unpublished": "未发布"
+ },
+ "title": "状态页",
+ "details": {
+ "empty": {
+ "title": "这里还没有内容",
+ "addMonitor": "添加监控以开始"
+ }
+ },
+ "form": {
+ "access": {
+ "title": "访问",
+ "description": "如果您的状态页已准备就绪,可以将其标记为已发布。",
+ "option": {
+ "published": {
+ "name": "已发布且公众可见"
+ }
+ }
+ },
+ "basicInfo": {
+ "title": "基本信息",
+ "description": "定义公司名称和状态页指向的子域名。",
+ "option": {
+ "name": {
+ "label": "公司名称",
+ "placeholder": "Acme Inc."
+ },
+ "url": {
+ "label": "您的状态页地址",
+ "placeholder": "my-status-page"
+ }
+ }
+ },
+ "monitors": {
+ "title": "监控",
+ "description": "选择要在状态页上显示的监控。",
+ "noMonitors": "未选择监控",
+ "option": {
+ "monitors": {
+ "label": "选择监控",
+ "placeholder": "搜索并选择监控..."
+ }
+ }
+ },
+ "timezone": {
+ "title": "时区",
+ "description": "选择状态页显示的时区。",
+ "option": {
+ "timezone": {
+ "label": "时区",
+ "placeholder": "选择时区..."
+ }
+ }
+ },
+ "appearance": {
+ "title": "外观",
+ "description": "定义公共状态页的默认外观。",
+ "option": {
+ "logo": {
+ "label": "Logo"
+ },
+ "color": {
+ "label": "品牌颜色"
+ }
+ }
+ },
+ "features": {
+ "title": "功能",
+ "description": "配置状态页上显示的信息。",
+ "option": {
+ "showCharts": {
+ "label": "显示响应时间图表"
+ },
+ "showUptimePercentage": {
+ "label": "显示正常运行时间百分比"
+ },
+ "showAdminLoginLink": {
+ "label": "显示管理员登录链接"
+ },
+ "showInfrastructure": {
+ "label": "显示基础设施指标"
+ }
+ }
+ }
+ }
},
- "game": {
- "label": "丢包监控网址",
- "namePlaceholder": "localhost:5173",
- "placeholder": "localhost"
- }
- },
- "uptimeAdvancedMatching": {
- "jsonPath": "JSON 路径"
- },
- "bytesPerSecond": "每秒字节数",
- "bytesReceived": "已接收字节数",
- "bytesSent": "已发送字节数",
- "chooseGame": "选择游戏",
- "createMonitorPage": {
- "incidentConfigDescription": "滑动窗口用于确定监视器何时发生故障。仅当滑动窗口中的检查百分比满足指定值时,监视器的状态才会改变。",
- "incidentConfigStatusWindowLabel": "在滑动窗口中应包含多少次检测?",
- "incidentConfigStatusWindowThresholdLabel": "在监视器状态改变之前,滑动窗口中的检查失败/成功的百分比是多少?",
- "incidentConfigTitle": "事件",
- "incidentConfigDescriptionV2": "",
- "incidentConfigStatusCheckNumber": "",
- "intervalTitle": "",
- "intervalDescription": ""
- },
- "dataRate": "数据速率",
- "dataReceived": "已接收数据",
- "dataSent": "已发送数据",
- "details": "详情",
- "drops": "丢包",
- "errors": "错误",
- "errorsIn": "错误于",
- "errorsOut": "错误输出",
- "gameServerMonitoring": "游戏服务器监视",
- "gameServerMonitoringDescription": "检查你的游戏服务器是否正在运行",
- "network": "网络",
- "networkDrops": "网络丢包",
- "networkErrors": "网络错误",
- "networkInterface": "网络接口",
- "noNetworkStatsAvailable": "没有可用的网络统计数据。",
- "packetsPerSecond": "每秒数据包数",
- "packetsReceived": "已接收数据包",
- "packetsReceivedRate": "数据包接收率",
- "packetsSent": "已发送数据包",
- "rate": "速度",
- "selectInterface": "选择接口",
- "v1": {
- "infrastructure": {
- "disk_selection_title": "磁盘选择",
- "disk_selection_info": "目前没有检测到磁盘。",
- "disk_selection_description": "选择您要监控的特定磁盘。"
+ "uptime": {
+ "filters": {
+ "search": {
+ "placeholder": "搜索监控..."
+ }
+ },
+ "table": {
+ "headers": {
+ "responseTime": "响应时间"
+ }
+ },
+ "fallback": {
+ "actionButton": "创建监控!",
+ "checks": "Check if websites or servers are online & responsive,Alert teams about downtime or performance issues,Monitor HTTP endpoints, pings, containers & ports,Track historical uptime and reliability trends",
+ "title": "正常运行时间监控用于:"
+ }
}
}
}
diff --git a/client/src/locales/zh-TW.json b/client/src/locales/zh-TW.json
index e5ee58e586..e5f6a195b4 100644
--- a/client/src/locales/zh-TW.json
+++ b/client/src/locales/zh-TW.json
@@ -1,1112 +1,1305 @@
{
- "submit": "提交",
- "title": "名稱",
- "distributedStatusHeaderText": "實時、真實設備覆蓋",
- "distributedStatusSubHeaderText": "由全球數百萬個設備提供支持,您可以按全球區域、國家或城市查看系統效能",
- "settingsDisabled": "已停用",
- "settingsSuccessSaved": "設定已成功儲存",
- "settingsFailedToSave": "無法儲存設定",
- "settingsStatsCleared": "統計數據已成功清除",
- "settingsFailedToClearStats": "無法清除統計數據",
- "settingsMonitorsDeleted": "已成功刪除所有監視器",
- "settingsFailedToDeleteMonitors": "無法刪除所有監視器",
- "starPromptTitle": "星標Checkmate",
- "starPromptDescription": "查看最新版本發布及在 GitHub 上幫助社區成長",
- "https": "HTTPS",
- "http": "HTTP",
- "monitor": "監控",
- "aboutus": "關於我們",
- "now": "現在",
- "delete": "刪除",
- "configure": "設定",
- "responseTime": "回應時間",
- "ms": "毫秒",
- "bar": "條",
- "area": "區域",
- "country": "國家",
- "city": "城市",
- "response": "回應",
- "monitorStatusUp": "",
- "monitorStatusDown": "",
- "webhookSendSuccess": "Webhook 通知發送成功",
- "webhookSendError": "",
- "webhookUnsupportedPlatform": "不支援的平台: {platform}",
- "distributedRightCategoryTitle": "監控",
- "distributedStatusServerMonitors": "伺服器監控",
- "distributedStatusServerMonitorsDescription": "監控相關伺服器狀態",
- "distributedUptimeCreateSelectURL": "你可以在這裡選擇主機的 URL,同時選擇監視器類型。",
- "distributedUptimeCreateChecks": "要執行的檢查項目",
- "distributedUptimeCreateChecksDescription": "你可以在新增網站後,隨時新增或移除檢查項目。",
- "distributedUptimeCreateIncidentNotification": "事故通知",
- "distributedUptimeCreateIncidentDescription": "事故發生時,向用戶發送通知。",
- "distributedUptimeCreateAdvancedSettings": "進階設定",
- "distributedUptimeDetailsNoMonitorHistory": "此監控尚無檢查記錄。",
- "distributedUptimeDetailsStatusHeaderUptime": "正常運行時間:",
- "distributedUptimeDetailsStatusHeaderLastUpdate": "最後更新",
- "notifications": {
- "enableNotifications": "",
- "testNotification": "測試通知",
- "addOrEditNotifications": "新增或編輯通知",
- "slack": {
- "label": "Slack",
- "description": "要啟用 Slack 通知,請建立一個 Slack 應用程式並啟用傳入 Webhook。完成後,請在此提供 Webhook URL 即可。",
- "webhookLabel": "Webhook URL",
- "webhookPlaceholder": "https://hooks.slack.com/services/...",
- "webhookRequired": "Slack webhook URL is required"
- },
- "discord": {
- "label": "Discord",
- "description": "",
- "webhookLabel": "Discord Webhook URL",
- "webhookPlaceholder": "https://discord.com/api/webhooks/...",
- "webhookRequired": ""
+ "common": {
+ "auth": {
+ "roles": {
+ "admin": "管理員",
+ "demo": "示範",
+ "superadmin": "超級管理員",
+ "user": "使用者"
+ }
},
- "telegram": {
- "label": "Telegram",
- "description": "要啟用 Telegram 通知,請使用 BotFather 用於創建和管理 Telegram 的官方機器來建立一個 Telegram 機器人。接著,取得 API 金鑰和聊天室 ID,並在此處填寫。",
- "tokenLabel": "你的機器人金鑰",
- "tokenPlaceholder": "123456:ABC-DEF1234ghIkl-zyx57W2v1u123ew11",
- "chatIdLabel": "你的聊天 ID",
- "chatIdPlaceholder": "-1001234567890",
- "fieldsRequired": ""
+ "alerts": {
+ "pageSpeedApiKey": {
+ "content": "警告:您尚未新增 Google PageSpeed API 金鑰。請前往設定新增。若未設定,PageSpeed 監控將無法運作。"
+ }
},
- "webhook": {
- "label": "Webhooks",
- "description": "你可以設定自訂 webhook,在事件發生時接收通知。",
- "urlLabel": "Webhook URL",
- "urlPlaceholder": "https://your-server.com/webhook",
- "urlRequired": ""
+ "appName": "Checkmate",
+ "breadcrumbs": {
+ "details": "詳細資料",
+ "home": "首頁"
},
- "testNotificationDevelop": "測試通知 2",
- "integrationButton": "",
- "testSuccess": "",
- "testFailed": "",
- "unsupportedType": "",
- "networkError": "",
- "fallback": {
- "title": "",
- "checks": [
- "提醒團隊有關停機或性能問題",
- "讓工程師知道事件發生時的情況",
- "讓管理員了解系統變更情況"
- ],
- "actionButton": "讓我們建立您的第一個通知頻道!"
+ "buttons": {
+ "addMember": "新增成員",
+ "cancel": "取消",
+ "close": "關閉",
+ "configure": "設定",
+ "confirm": "確認",
+ "create": "建立",
+ "delete": "刪除",
+ "generateToken": "產生令牌",
+ "incidents": "事件",
+ "inviteMember": "邀請成員",
+ "pause": "暫停",
+ "resume": "恢復",
+ "save": "儲存",
+ "sendInvite": "發送邀請",
+ "test": "測試",
+ "testNotifications": "測試通知",
+ "toggleTheme": "",
+ "flushQueue": "清除佇列",
+ "notFound": "前往主儀表板",
+ "resetPassword": "",
+ "reset": "",
+ "clear": "清除",
+ "addDemo": "新增示範監控",
+ "removeMonitors": "移除監控",
+ "sendTestEmail": "發送測試郵件",
+ "exportToJSON": "匯出為 JSON",
+ "importFromJSON": "從 JSON 匯入",
+ "clearFilters": "清除篩選條件",
+ "removeUser": "移除使用者"
},
- "createButton": "",
- "createTitle": "",
- "create": {
- "success": "",
- "failed": ""
+ "charts": {
+ "labels": {
+ "averageResponseTime": "平均回應時間",
+ "downtime": "停機時間",
+ "high": "高",
+ "low": "低",
+ "uptime": "正常運行時間"
+ },
+ "histogram": {
+ "avg": "平均:{{value}} ms",
+ "max": "最大:{{value}} ms"
+ }
},
- "fetch": {
- "success": "",
- "failed": ""
+ "dialogs": {
+ "delete": {
+ "description": "此操作無法復原。",
+ "title": "您確定要刪除嗎?"
+ }
},
- "delete": {
- "success": "",
- "failed": ""
+ "labels": {
+ "active": "啟用中",
+ "paused": "已暫停",
+ "na": "N/A",
+ "resolved": "已解決",
+ "responseTime": "回應時間"
},
- "edit": {
- "success": "",
- "failed": ""
+ "form": {
+ "role": {
+ "option": {
+ "role": {
+ "label": "角色"
+ }
+ }
+ },
+ "name": {
+ "option": {
+ "firstName": {
+ "label": "",
+ "placeholder": ""
+ },
+ "lastName": {
+ "label": "",
+ "placeholder": ""
+ }
+ }
+ },
+ "email": {
+ "option": {
+ "email": {
+ "label": "電子郵件",
+ "placeholder": "you@example.com"
+ }
+ }
+ }
},
- "test": {
- "success": "",
- "failed": ""
+ "table": {
+ "empty": "這裡沒有資料",
+ "headers": {
+ "actions": "行動",
+ "dateTime": "日期和時間",
+ "message": "訊息",
+ "monitor": "監控",
+ "monitorId": "監控 ID",
+ "name": "名稱",
+ "status": "狀態",
+ "type": "類型",
+ "url": "URL",
+ "interval": "間隔",
+ "active": "啟用中",
+ "responseTime": "回應時間"
+ }
}
},
- "testLocale": "測試語言環境",
- "add": "新增",
- "monitors": "",
- "distributedUptimeStatusCreateStatusPage": "",
- "distributedUptimeStatusCreateStatusPageAccess": "",
- "distributedUptimeStatusCreateStatusPageReady": "",
- "distributedUptimeStatusBasicInfoHeader": "基本資料",
- "distributedUptimeStatusBasicInfoDescription": "",
- "distributedUptimeStatusLogoHeader": "標誌",
- "distributedUptimeStatusLogoDescription": "",
- "distributedUptimeStatusLogoUploadButton": "上傳標誌",
- "distributedUptimeStatusStandardMonitorsHeader": "",
- "distributedUptimeStatusStandardMonitorsDescription": "",
- "distributedUptimeStatusCreateYour": "",
- "distributedUptimeStatusEditYour": "",
- "distributedUptimeStatusPublishedLabel": "",
- "distributedUptimeStatusCompanyNameLabel": "公司名稱",
- "distributedUptimeStatusPageAddressLabel": "",
- "distributedUptimeStatus30Days": "30日",
- "distributedUptimeStatus60Days": "60日",
- "distributedUptimeStatus90Days": "90日",
- "distributedUptimeStatusPageNotSetUp": "",
- "distributedUptimeStatusContactAdmin": "",
- "distributedUptimeStatusPageNotPublic": "",
- "distributedUptimeStatusPageDeleteDialog": "",
- "distributedUptimeStatusPageDeleteConfirm": "",
- "distributedUptimeStatusPageDeleteDescription": "",
- "distributedUptimeStatusDevices": "設備",
- "distributedUptimeStatusUpt": "UPT",
- "distributedUptimeStatusUptBurned": "",
- "distributedUptimeStatusUptLogo": "",
- "incidentsTableNoIncidents": "",
- "incidentsTablePaginationLabel": "",
- "incidentsTableMonitorName": "",
- "incidentsTableStatus": "",
- "incidentsTableDateTime": "",
- "incidentsTableStatusCode": "",
- "incidentsTableMessage": "",
- "incidentsOptionsHeader": "",
- "incidentsOptionsHeaderFilterBy": "",
- "incidentsOptionsHeaderFilterAll": "",
- "incidentsOptionsHeaderFilterDown": "",
- "incidentsOptionsHeaderFilterCannotResolve": "",
- "incidentsOptionsHeaderShow": "",
- "incidentsOptionsHeaderLastHour": "",
- "incidentsOptionsHeaderLastDay": "",
- "incidentsOptionsHeaderLastWeek": "",
- "incidentsOptionsPlaceholderAllServers": "",
- "infrastructureCreateYour": "",
- "infrastructureCreateGeneralSettingsDescription": "",
- "infrastructureServerRequirement": "",
- "infrastructureCustomizeAlerts": "",
- "infrastructureAlertNotificationDescription": "",
- "infrastructureCreateMonitor": "",
- "infrastructureProtocol": "",
- "infrastructureServerUrlLabel": "",
- "infrastructureDisplayNameLabel": "",
- "infrastructureAuthorizationSecretLabel": "",
- "gb": "GB",
- "mb": "MB",
- "mem": "Mem",
- "memoryUsage": "",
- "cpu": "CPU",
- "cpuUsage": "CPU 使用量",
- "cpuTemperature": "CPU 溫度",
- "diskUsage": "",
- "used": "",
- "total": "",
- "cores": "核",
- "frequency": "",
- "status": "",
- "cpuPhysical": "CPU (實體核心)",
- "cpuLogical": "CPU (邏輯核心)",
- "cpuFrequency": "CPU 頻率",
- "avgCpuTemperature": "平均 CPU 溫度",
- "memory": "",
- "disk": "",
- "uptime": "",
- "os": "OS",
- "host": "",
- "actions": "行動",
- "integrations": "",
- "integrationsPrism": "",
- "integrationsSlack": "Slack",
- "integrationsSlackInfo": "",
- "integrationsDiscord": "",
- "integrationsDiscordInfo": "",
- "integrationsZapier": "",
- "integrationsZapierInfo": "",
- "commonSave": "儲存",
- "createYour": "",
- "createMonitor": "",
- "pause": "",
- "resume": "",
- "editing": "",
- "url": "UR:",
- "access": "存取",
- "timezone": "時區",
- "features": "",
- "administrator": "系統管理員?",
- "loginHere": "",
- "displayName": "",
- "urlMonitor": "",
- "portToMonitor": "",
- "websiteMonitoring": "網站監控",
- "websiteMonitoringDescription": "",
- "pingMonitoring": "",
- "pingMonitoringDescription": "",
- "dockerContainerMonitoring": "",
- "dockerContainerMonitoringDescription": "",
- "portMonitoring": "",
- "portMonitoringDescription": "",
- "createMaintenanceWindow": "",
- "createMaintenance": "",
- "editMaintenance": "",
- "maintenanceWindowName": "",
- "friendlyNameInput": "",
- "friendlyNamePlaceholder": "",
- "maintenanceRepeat": "",
- "maintenance": "",
- "duration": "",
- "addMonitors": "新增監視器",
- "window": "",
- "cancel": "取消",
- "message": "",
- "low": "低",
- "high": "高",
- "statusCode": "",
- "date&Time": "日期與時間",
- "type": "類型",
- "statusPageName": "",
- "publicURL": "",
- "repeat": "",
- "edit": "",
- "createA": "",
- "remove": "",
- "maintenanceWindowDescription": "",
- "startTime": "",
- "timeZoneInfo": "",
- "monitorsToApply": "",
- "nextWindow": "",
- "notFoundButton": "",
- "pageSpeedConfigureSettingsDescription": "",
- "monitorDisplayName": "",
- "whenNewIncident": "",
- "notifySMS": "",
- "notifyEmails": "",
- "seperateEmails": "",
- "checkFrequency": "檢查頻率",
- "matchMethod": "",
- "expectedValue": "",
- "deleteDialogTitle": "您確定要刪除此監視器嗎?",
- "deleteDialogDescription": "一旦刪除,該監視器無法恢復。",
- "pageSpeedMonitor": "",
- "shown": "",
- "ago": "",
- "companyName": "公司名稱",
- "pageSpeedDetailsPerformanceReport": "",
- "pageSpeedDetailsPerformanceReportCalculator": "",
- "checkingEvery": "",
- "statusPageCreateSettings": "",
- "basicInformation": "基本資料",
- "statusPageCreateBasicInfoDescription": "",
- "statusPageCreateSelectTimeZoneDescription": "",
- "statusPageCreateAppearanceDescription": "",
- "statusPageCreateSettingsCheckboxLabel": "",
- "statusPageCreateBasicInfoStatusPageAddress": "",
- "statusPageCreateTabsContent": "",
- "statusPageCreateTabsContentDescription": "",
- "statusPageCreateTabsContentFeaturesDescription": "",
- "showCharts": "",
- "showUptimePercentage": "",
- "removeLogo": "",
- "statusPageStatus": "",
- "statusPageStatusContactAdmin": "",
- "statusPageStatusNotPublic": "",
- "statusPageStatusNoPage": "",
- "statusPageStatusServiceStatus": "",
- "deleteStatusPage": "",
- "deleteStatusPageConfirm": "",
- "deleteStatusPageDescription": "",
- "uptimeCreate": "",
- "uptimeCreateJsonPath": "",
- "uptimeCreateJsonPathQuery": "",
- "maintenanceTableActionMenuDialogTitle": "",
- "infrastructureEditYour": "",
- "infrastructureEditMonitor": "",
- "infrastructureMonitorCreated": "",
- "infrastructureMonitorUpdated": "",
- "errorInvalidTypeId": "",
- "errorInvalidFieldId": "",
- "inviteNoTokenFound": "",
- "pageSpeedWarning": "",
- "pageSpeedLearnMoreLink": "",
- "pageSpeedAddApiKey": "",
- "update": "更新",
- "invalidFileFormat": "",
- "invalidFileSize": "",
- "ClickUpload": "點擊上傳",
- "DragandDrop": "",
- "MaxSize": "",
- "SupportedFormats": "",
- "FirstName": "",
- "LastName": "",
- "EmailDescriptionText": "",
- "YourPhoto": "頭像",
- "PhotoDescriptionText": "",
- "save": "",
- "DeleteDescriptionText": "這將刪除帳號以及所有相關的伺服器資料,此操作不可逆轉。",
- "DeleteAccountWarning": "刪除您的帳號表示您將無法再次登入,且所有資料都會被移除。此操作不可逆轉。",
- "DeleteWarningTitle": "",
- "bulkImport": {
- "title": "批量匯入",
- "selectFileTips": "",
- "selectFileDescription": "",
- "selectFile": "",
- "parsingFailed": "",
- "uploadSuccess": "",
- "validationFailed": "",
- "noFileSelected": "",
- "fallbackPage": "",
- "invalidFileType": "",
- "uploadFailed": ""
- },
- "DeleteAccountTitle": "刪除帳戶",
- "DeleteAccountButton": "刪除帳戶",
- "publicLink": "",
- "maskedPageSpeedKeyPlaceholder": "",
- "reset": "",
- "ignoreTLSError": "",
- "tlsErrorIgnored": "",
- "ignoreTLSErrorDescription": "",
- "createNew": "",
- "greeting": {
- "prepend": "",
- "append": "",
- "overview": ""
- },
- "roles": {
- "superAdmin": "",
- "admin": "管理員",
- "teamMember": "",
- "demoUser": "示範用戶"
- },
- "teamPanel": {
- "teamMembers": "",
- "filter": {
- "all": "全部",
- "member": ""
+ "components": {
+ "imageUpload": {
+ "clickToUpload": "點擊上傳",
+ "dragAndDrop": "",
+ "supportedFormats": "",
+ "maxSize": "",
+ "orDragAndDrop": "或拖放檔案",
+ "errors": {
+ "invalidFileSize": "",
+ "invalidFileFormat": ""
+ }
},
- "inviteTeamMember": "",
- "inviteNewTeamMember": "",
- "inviteDescription": "",
- "email": "",
- "selectRole": "",
- "inviteLink": "",
- "cancel": "取消",
- "noMembers": "",
- "getToken": "",
- "emailToken": "",
- "table": {
- "name": "",
- "email": "",
- "role": "",
- "created": ""
+ "headerStatusPageControls": {
+ "publicLink": ""
},
- "addTeamMember": {
- "addMemberMenu": "",
- "title": "",
- "description": "",
- "addButton": ""
+ "headerTimeRange": {
+ "labels": {
+ "day": "日",
+ "month": "月",
+ "recent": "最近",
+ "week": "週"
+ },
+ "description": {
+ "recent": "顯示過去 2 小時的統計資料。",
+ "day": "顯示過去 24 小時的統計資料。",
+ "week": "顯示過去 7 天的統計資料。",
+ "month": "顯示過去 30 天的統計資料。"
+ }
},
- "register": "",
- "registerToast": {
- "success": "",
- "dbUserExists": "",
- "unknownError": ""
+ "offlineBanner": {
+ "serverUnreachable": "無法連線至伺服器",
+ "retry": "重試",
+ "retrying": "重試中...",
+ "reconnected": ""
},
- "registerTeamMember": {
- "title": "",
- "auth": {
- "common": {
- "inputs": {
- "firstName": {
- "errors": {
- "empty": "",
- "pattern": ""
- }
- },
- "lastName": {
- "errors": {
- "empty": "",
- "pattern": ""
- }
+ "sidebar": {
+ "menu": {
+ "uptime": "",
+ "pagespeed": "",
+ "infrastructure": "",
+ "notifications": "",
+ "checks": "檢查",
+ "incidents": "",
+ "statusPages": "",
+ "maintenance": "",
+ "logs": "",
+ "settings": ""
+ },
+ "bottomMenu": {
+ "support": "",
+ "discussions": "",
+ "docs": "",
+ "changelog": "版本變更記錄"
+ },
+ "accountMenu": {
+ "profile": "個人檔案",
+ "password": "密碼",
+ "team": "團隊"
+ },
+ "starPrompt": {
+ "title": "為 Checkmate 加星",
+ "description": "查看最新版本並在 GitHub 上幫助社群成長"
+ },
+ "authFooter": {
+ "navControls": "",
+ "logOut": "",
+ "roles": {
+ "superAdmin": "超級管理員",
+ "admin": "管理員",
+ "user": "使用者",
+ "demoUser": "示範用戶"
+ }
+ }
+ },
+ "starPrompt": {
+ "title": "為 Checkmate 加星",
+ "description": "查看最新版本並在 GitHub 上幫助社群成長"
+ }
+ },
+ "pages": {
+ "notFound": {
+ "title": "哎呀!您的壽司掉了!",
+ "subtitle": "該 URL 不存在,或您沒有存取權限。"
+ },
+ "account": {
+ "tabs": {
+ "profile": "個人檔案",
+ "password": "密碼",
+ "team": "團隊"
+ },
+ "form": {
+ "name": {
+ "title": "名稱",
+ "description": "更新您的個人資訊"
+ },
+ "photo": {
+ "title": "個人頭像",
+ "description": "上傳個人頭像"
+ },
+ "currentPassword": {
+ "title": "目前密碼",
+ "description": "輸入您目前的密碼以驗證身份",
+ "option": {
+ "label": "目前密碼",
+ "placeholder": "輸入目前密碼"
+ }
+ },
+ "newPassword": {
+ "title": "新密碼",
+ "description": "請選擇至少 8 個字元的強密碼",
+ "option": {
+ "newPassword": {
+ "label": "新密碼",
+ "placeholder": "輸入新密碼"
},
+ "confirm": {
+ "label": "確認密碼",
+ "placeholder": "確認新密碼"
+ }
+ }
+ },
+ "deleteAccount": {
+ "title": "刪除帳號",
+ "description": "此操作為永久性,無法復原"
+ }
+ },
+ "team": {
+ "filter": {
+ "placeholder": "依角色篩選",
+ "all": "全部",
+ "admin": "管理員",
+ "member": ""
+ },
+ "table": {
+ "headers": {
+ "email": "電子郵件",
+ "role": "角色",
+ "created": ""
+ }
+ },
+ "addMember": {
+ "title": "註冊新團隊成員",
+ "description": "建立新的使用者帳號。建立後請安全地分享登入憑證。"
+ },
+ "invite": {
+ "title": "邀請團隊成員",
+ "description": "發送加入團隊的邀請",
+ "email": {
+ "label": "電子郵件地址",
+ "placeholder": "輸入電子郵件地址"
+ },
+ "role": {
+ "label": "角色",
+ "placeholder": "選擇角色"
+ },
+ "linkLabel": "邀請連結"
+ }
+ }
+ },
+ "auth": {
+ "common": {
+ "passwordRules": {
+ "length": {
+ "beginning": "必須至少",
+ "highlighted": ""
+ },
+ "lowercase": {
+ "beginning": "必須至少包含",
+ "highlighted": ""
+ },
+ "match": {
+ "beginning": "",
+ "highlighted": ""
+ },
+ "number": {
+ "beginning": "必須至少包含",
+ "highlighted": ""
+ },
+ "special": {
+ "beginning": "必須至少包含",
+ "highlighted": ""
+ },
+ "uppercase": {
+ "beginning": "必須至少包含",
+ "highlighted": ""
+ }
+ },
+ "form": {
+ "option": {
"email": {
- "errors": {
- "empty": "",
- "invalid": ""
- }
+ "label": "電子郵件",
+ "placeholder": "me@example.com"
},
- "role": {
- "errors": {
- "empty": ""
- }
+ "password": {
+ "label": "密碼",
+ "placeholder": "********"
+ },
+ "confirmPassword": {
+ "label": "確認密碼"
}
}
}
+ },
+ "login": {
+ "title": "歡迎回到 Checkmate!",
+ "subtitle": "請登入以繼續",
+ "submit": "登入",
+ "links": {
+ "forgotPassword": {
+ "text": "忘記密碼?",
+ "linkText": "重設密碼"
+ },
+ "register": {
+ "text": "還沒有帳號?",
+ "linkText": "在此註冊"
+ }
+ }
+ },
+ "register": {
+ "title": "歡迎回到 Checkmate!",
+ "subtitle": "註冊以開始使用",
+ "submit": "註冊"
+ },
+ "forgotPassword": {
+ "title": "忘記密碼了嗎?",
+ "subtitle": "別擔心,我們會發送重設密碼的說明給您。",
+ "submit": "請求復原",
+ "links": {
+ "login": {
+ "text": "返回",
+ "linkText": "登入"
+ }
+ }
+ },
+ "setNewPassword": {
+ "title": "重設您的密碼",
+ "subtitle": "您的新密碼必須與先前使用過的密碼不同。"
}
},
- "role": "",
- "changeTeamPassword": {
- "changePasswordMenu": "",
- "title": "",
- "description": "",
- "success": ""
- }
- },
- "monitorState": {
- "paused": "",
- "resumed": "",
- "active": "啟用中"
- },
- "menu": {
- "uptime": "",
- "pagespeed": "",
- "infrastructure": "",
- "incidents": "",
- "statusPages": "",
- "maintenance": "",
- "integrations": "",
- "settings": "",
- "support": "",
- "discussions": "",
- "docs": "",
- "changelog": "版本變更記錄",
- "profile": "",
- "password": "",
- "team": "",
- "logOut": "",
- "notifications": "",
- "logs": ""
- },
- "settingsEmailUser": "",
- "state": "",
- "statusBreadCrumbsStatusPages": "",
- "statusBreadCrumbsDetails": "",
- "commonSaving": "儲存中...",
- "navControls": "",
- "incidentsPageTitle": "",
- "passwordPanel": {
- "passwordChangedSuccess": "",
- "passwordInputIncorrect": "",
- "currentPassword": "當前密碼",
- "enterCurrentPassword": "",
- "newPassword": "",
- "enterNewPassword": "",
- "confirmNewPassword": "確認新密碼",
- "passwordRequirements": "",
- "saving": ""
- },
- "emailSent": "",
- "failedToSendEmail": "",
- "settingsTestEmailSuccess": "",
- "settingsTestEmailFailed": "",
- "settingsTestEmailFailedWithReason": "",
- "settingsTestEmailUnknownError": "",
- "statusMsg": {
- "paused": "",
- "up": "",
- "down": "",
- "pending": ""
- },
- "uptimeGeneralInstructions": {
- "http": "",
- "ping": "",
- "docker": "",
- "port": "",
- "game": "",
- "https": ""
- },
- "common": {
- "appName": "Checkmate",
- "monitoringAgentName": "",
- "buttons": {
- "toggleTheme": ""
+ "checks": {
+ "selects": {
+ "monitor": {
+ "all": "所有監控"
+ },
+ "status": {
+ "all": "全部",
+ "down": "離線",
+ "up": "上線"
+ }
+ },
+ "table": {
+ "empty": "此時間範圍內沒有離線檢查",
+ "headers": {
+ "statusCode": "狀態碼",
+ "location": "位置"
+ }
+ }
},
- "toasts": {
- "networkError": "",
- "checkConnection": "請檢查您的連線",
- "unknownError": ""
- }
- },
- "auth": {
"common": {
- "navigation": {
- "continue": "繼續",
- "back": "返回"
- },
- "inputs": {
- "email": {
- "label": "",
- "placeholder": "",
- "errors": {
- "empty": "",
- "invalid": ""
- }
+ "monitors": {
+ "actions": {
+ "configure": "設定",
+ "delete": "刪除",
+ "generateToken": "產生令牌",
+ "details": "詳細資料",
+ "incidents": "事件",
+ "inviteMember": "邀請成員",
+ "openSite": "開啟網站",
+ "pause": "暫停",
+ "resume": "恢復"
},
- "password": {
- "label": "",
- "rules": {
- "length": {
- "beginning": "必須至少",
- "highlighted": ""
+ "statBoxes": {
+ "activeFor": "已啟用",
+ "certificateExpiry": "憑證到期",
+ "lastCheck": "最後檢查",
+ "lastResponseTime": "最後回應時間"
+ },
+ "status": {
+ "down": "離線",
+ "breached": "超過閾值",
+ "initializing": "初始化中",
+ "maintenance": "維護中",
+ "paused": "已暫停",
+ "total": "總計",
+ "up": "上線"
+ },
+ "monitorTypes": {
+ "optionDocker": "Docker",
+ "optionGame": "遊戲",
+ "optionHttp": "HTTP(S)",
+ "optionPing": "Ping",
+ "optionPort": "連接埠",
+ "optionPagespeed": "PageSpeed",
+ "optionHardware": "基礎架構",
+ "optionGrpc": "gRPC",
+ "optionWebSocket": "WebSocket"
+ }
+ }
+ },
+ "createMonitor": {
+ "form": {
+ "advanced": {
+ "description": "進階使用案例的選用設定",
+ "option": {
+ "advancedMatching": {
+ "label": "使用進階配對"
},
- "special": {
- "beginning": "必須至少包含",
- "highlighted": ""
+ "expectedValue": {
+ "label": "預期值"
},
- "number": {
- "beginning": "必須至少包含",
- "highlighted": ""
+ "jsonPath": {
+ "description": "此表達式將對回應的 JSON 資料進行評估,結果將用於與預期值進行配對。查詢語法文件請參閱 jmespath.org。",
+ "label": "JSONPath 表達式"
},
- "uppercase": {
- "beginning": "必須至少包含",
- "highlighted": ""
+ "matchMethod": {
+ "label": "配對方式",
+ "equal": "",
+ "include": "",
+ "regex": ""
+ }
+ },
+ "title": "進階設定"
+ },
+ "frequency": {
+ "description": "您希望多久檢查一次此監控的狀態?",
+ "option": {
+ "frequency": {
+ "label": "檢查頻率",
+ "value": {
+ "fifteenMinutes": "15 分鐘",
+ "fifteenSeconds": "",
+ "fiveMinutes": "5 分鐘",
+ "fourMinutes": "",
+ "oneMinute": "",
+ "tenMinutes": "10 分鐘",
+ "thirtyMinutes": "30 分鐘",
+ "thirtySeconds": "",
+ "threeMinutes": "3分鐘",
+ "twoMinutes": ""
+ }
+ }
+ },
+ "title": "檢查頻率"
+ },
+ "general": {
+ "option": {
+ "container": {
+ "label": "容器名稱/ID",
+ "placeholder": "my-app 或 abcd1234"
+ },
+ "host": {
+ "label": "主機",
+ "placeholder": "192.168.1.100 或 example.com"
+ },
+ "name": {
+ "label": "顯示名稱",
+ "placeholder": "例如:我的網站"
+ },
+ "secret": {
+ "label": "授權密鑰",
+ "placeholder": "輸入您的密鑰"
+ },
+ "url": {
+ "label": "URL",
+ "placeholder": "https://www.google.com"
+ },
+ "game": {
+ "label": "",
+ "placeholder": ""
},
- "lowercase": {
- "beginning": "必須至少包含",
- "highlighted": ""
+ "port": {
+ "label": "監控的連接埠",
+ "placeholder": "80"
},
- "match": {
- "beginning": "",
- "highlighted": ""
+ "grpcServiceName": {
+ "label": "服務名稱",
+ "placeholder": "例如:my.service.v1(留空表示整體健康狀態)"
+ },
+ "wsUrl": {
+ "label": "WebSocket URL",
+ "placeholder": "wss://example.com/socket"
}
},
- "errors": {
- "empty": "",
- "length": "",
- "uppercase": "",
- "lowercase": "",
- "number": "",
- "special": "",
- "incorrect": ""
+ "title": "一般設定",
+ "description": {
+ "http": "輸入要監控的 URL 或 IP(例如 https://example.com/ 或 192.168.1.100),並新增一個顯示在儀表板上的清晰顯示名稱。",
+ "ping": "",
+ "port": "",
+ "docker": "",
+ "game": "",
+ "pagespeed": "追蹤您網站的頁面載入效能、Core Web Vitals 和最佳化分數。",
+ "grpc": "輸入 gRPC 伺服器的主機名稱和連接埠,可選擇指定健康檢查的服務名稱,並新增一個顯示名稱。",
+ "websocket": "輸入要監控的 WebSocket URL(例如 wss://example.com/socket),並新增一個顯示名稱。",
+ "hardware": "監控您基礎架構的 CPU、記憶體、磁碟使用量和溫度。"
}
},
- "passwordConfirm": {
- "label": "",
- "placeholder": "",
- "errors": {
- "empty": "",
- "different": ""
- }
+ "ignoreTls": {
+ "description": "設定 HTTPS 連線的 TLS/SSL 憑證驗證。",
+ "option": {
+ "tls": {
+ "label": "忽略 TLS/SSL 錯誤"
+ }
+ },
+ "title": "TLS/SSL 設定"
+ },
+ "incidents": {
+ "description": "使用滑動視窗來判斷監控何時離線。監控的狀態只有在滑動視窗內的檢查百分比達到指定值時才會變更。",
+ "option": {
+ "checks": {
+ "label": "滑動視窗中的檢查次數"
+ },
+ "percentage": {
+ "label": "滑動視窗中有多少百分比的檢查失敗/成功後,監控狀態才會變更?"
+ }
+ },
+ "title": "事件"
},
- "firstName": {
- "label": "",
- "placeholder": "",
- "errors": {
- "empty": "",
- "length": "",
- "pattern": ""
+ "notifications": {
+ "description": "選擇您要使用的通知頻道",
+ "title": "通知"
+ },
+ "type": {
+ "description": "選擇要執行的檢查類型",
+ "optionDockerDescription": "使用 Docker 監控容器是否正在執行。",
+ "optionGameDescription": "監控特定遊戲伺服器是否上線。",
+ "optionGrpcDescription": "使用標準健康檢查協定監控 gRPC 服務。",
+ "optionWebSocketDescription": "監控 WebSocket 端點的連線健康狀態和回應時間。",
+ "optionHttpDescription": "使用 HTTP(S) 監控您的網站或 API 端點。",
+ "optionPingDescription": "使用 ICMP Ping 監控伺服器是否上線。",
+ "optionPortDescription": "監控伺服器上的特定連接埠是否開啟。",
+ "title": "類型"
+ },
+ "thresholds": {
+ "title": "警報閾值",
+ "description": "定義此硬體監控應觸發警報的閾值。",
+ "option": {
+ "cpuThreshold": {
+ "label": "CPU 警報閾值 (%)"
+ },
+ "memoryThreshold": {
+ "label": "記憶體警報閾值 (%)"
+ },
+ "diskThreshold": {
+ "label": "磁碟警報閾值 (%)"
+ },
+ "tempThreshold": {
+ "label": "溫度警報閾值 (°C)"
+ }
}
},
- "lastName": {
- "label": "",
- "placeholder": "",
- "errors": {
- "empty": "",
- "length": "",
- "pattern": ""
+ "geoChecks": {
+ "title": "地理分散式檢查",
+ "description": "從多個地理位置執行檢查,以監控全球可用性和效能。",
+ "option": {
+ "enabled": {
+ "label": "啟用地理分散式檢查"
+ },
+ "locations": {
+ "label": "位置",
+ "placeholder": "選擇位置",
+ "options": {
+ "EU": "歐洲",
+ "NA": "北美洲",
+ "AS": "亞洲",
+ "SA": "南美洲",
+ "AF": "非洲",
+ "OC": "大洋洲"
+ }
+ },
+ "interval": {
+ "label": "檢查間隔",
+ "value": {
+ "fiveMinutes": "5 分鐘",
+ "tenMinutes": "10 分鐘",
+ "fifteenMinutes": "15 分鐘",
+ "thirtyMinutes": "30 分鐘"
+ }
+ }
}
- }
- },
- "errors": {
- "validation": ""
- },
- "fields": {
- "password": {
- "errors": {
- "incorrect": ""
+ },
+ "url": {
+ "title": "在狀態頁面上顯示監控 IP/URL",
+ "description": "在公開狀態頁面上顯示監控的 IP 位址或 URL。若停用此選項,將僅顯示監控名稱以保護敏感資訊。",
+ "option": {
+ "showURL": {
+ "label": "在狀態頁面上顯示 IP/URL",
+ "enabled": "啟用",
+ "disabled": "停用"
+ }
}
},
- "role": {
- "errors": {
- "min": ""
+ "stats": {
+ "title": "監控歷史",
+ "description": "清除團隊的所有監控歷史和統計資料。此操作無法復原。",
+ "buttonText": "清除所有統計資料",
+ "dialog": {
+ "title": "清除所有監控歷史?",
+ "description": "這將永久刪除團隊的所有監控歷史、統計資料和檢查資料。此操作無法復原。",
+ "confirm": "是的,清除所有統計資料"
}
}
}
},
- "login": {
- "heading": "",
- "subheadings": {
- "stepOne": "",
- "stepTwo": ""
+ "editUser": {
+ "form": {
+ "roles": {
+ "title": "角色",
+ "description": "為使用者指派角色。可以選擇多個角色。"
+ }
},
- "links": {
- "forgotPassword": "",
- "register": "",
- "forgotPasswordLink": "",
- "registerLink": ""
+ "dialog": {
+ "removeUser": {
+ "title": "移除使用者",
+ "content": "您確定要將 {{name}} 從團隊中移除嗎?此操作無法復原。"
+ }
+ }
+ },
+ "incidents": {
+ "dialog": {
+ "resolveIncident": {
+ "title": "解決事件",
+ "option": {
+ "comment": {
+ "label": "備註(選填)",
+ "placeholder": "新增關於解決方案的備註..."
+ }
+ }
+ },
+ "details": {
+ "analysis": "事件分析",
+ "comment": "備註:",
+ "detailsLabel": "詳細資料",
+ "downtime": "停機時間:",
+ "message": "訊息:",
+ "monitor": "監控:",
+ "overview": "概覽",
+ "resolutionDetails": "解決詳情",
+ "resolutionType": "類型:",
+ "resolutionTypes": {
+ "automatic": "自動",
+ "manual": "手動"
+ },
+ "resolve": "解決事件",
+ "resolvedAt": "解決於:",
+ "resolvedBy": "解決者:",
+ "startedAt": "開始於:",
+ "status": "狀態:",
+ "statusCode": "狀態碼:",
+ "timeline": "時間軸",
+ "title": "事件詳情",
+ "url": "URL:"
+ }
},
- "toasts": {
- "success": "歡迎回來!您已成功登入。",
- "incorrectPassword": ""
+ "filters": {
+ "allMonitors": "所有監控",
+ "monitor": "監控",
+ "resolutionType": "解決類型",
+ "resolutionTypes": {
+ "manual": "手動",
+ "automatic": "自動",
+ "all": "全部"
+ }
},
- "errors": {
- "password": {
- "incorrect": ""
+ "summaryCard": {
+ "activeIncidents": {
+ "title": "進行中的事件",
+ "active_zero": "沒有進行中的事件",
+ "active_one": "{{count}} 個進行中的事件",
+ "active_other": "{{count}} 個進行中的事件"
+ },
+ "incidentStats": {
+ "avgResolutionTime": "平均解決時間",
+ "mostAffectedMonitor": "受影響最多的監控",
+ "title": "事件統計",
+ "totalIncidents": "事件總數"
+ },
+ "latestIncidents": {
+ "title": "最新事件"
}
},
- "welcome": ""
+ "table": {
+ "actions": {
+ "details": "詳細資料",
+ "goToMonitor": "前往監控",
+ "resolveManually": "手動解決"
+ },
+ "activeIncidents": "進行中的事件",
+ "headers": {
+ "endTime": "結束時間",
+ "resolutionType": "解決類型",
+ "startTime": "",
+ "statusCode": "狀態碼"
+ },
+ "resolvedIncidents": "已解決的事件",
+ "status": {
+ "active": "啟用中",
+ "resolved": "已解決"
+ }
+ }
},
- "registration": {
- "heading": {
- "superAdmin": "",
- "user": ""
- },
- "subheadings": {
- "stepOne": "",
- "stepTwo": "",
- "stepThree": ""
+ "infrastructure": {
+ "charts": {
+ "labels": {
+ "cpu": "CPU 使用率",
+ "disk": "磁碟使用率",
+ "memory": "記憶體使用率",
+ "netBytesRecv": "{{name}} - 接收位元組",
+ "netBytesSent": "{{name}} - 發送位元組",
+ "temp": "溫度"
+ }
},
- "description": {
- "superAdmin": "",
- "user": ""
+ "gauges": {
+ "cpu": {
+ "lowerLabel": "最大頻率",
+ "title": "CPU 使用率",
+ "upperLabel": "目前頻率"
+ },
+ "disk": {
+ "lowerLabel": "可用",
+ "title": "磁碟 {{idx}} 使用率",
+ "upperLabel": "已使用"
+ },
+ "memory": {
+ "lowerLabel": "可用",
+ "title": "記憶體使用率",
+ "upperLabel": "已使用"
+ }
},
- "gettingStartedButton": {
- "superAdmin": "",
- "user": ""
+ "statBoxes": {
+ "avgCpuTemperature": "平均 CPU 溫度",
+ "cpuFrequency": "CPU 頻率",
+ "cpuLogical": "CPU (邏輯核心)",
+ "cpuPhysical": "CPU (實體核心)",
+ "disk": "磁碟",
+ "memory": "記憶體",
+ "os": "作業系統"
},
- "termsAndPolicies": "",
- "links": {
- "login": ""
+ "table": {
+ "headers": {
+ "cpu": "CPU",
+ "disk": "磁碟",
+ "memory": "記憶體"
+ }
},
- "toasts": {
- "success": "歡迎!您的帳號已成功建立。"
+ "tabs": {
+ "labels": {
+ "network": "",
+ "overview": "概覽"
+ }
},
- "welcome": ""
+ "fallback": {
+ "actionButton": "建立監控!",
+ "checks": "Track the performance of your servers,Identify bottlenecks and optimize usage,Ensure reliability with real-time monitoring",
+ "title": "基礎架構監控用於:"
+ }
},
- "forgotPassword": {
- "heading": "",
- "subheadings": {
- "stepOne": "",
- "stepTwo": "",
- "stepThree": "",
- "stepFour": ""
+ "logs": {
+ "tabs": {
+ "diagnostics": "",
+ "logs": "",
+ "queue": ""
},
- "buttons": {
- "openEmail": "",
- "resetPassword": ""
+ "logLevelSelect": {
+ "label": "日誌等級"
},
- "imageAlts": {
- "passwordKey": "",
- "email": "",
- "lock": "",
- "passwordConfirm": ""
+ "jobQueue": "工作佇列",
+ "failedJobs": "失敗的工作",
+ "noLogs": "找不到日誌",
+ "metrics": {
+ "jobs": "工作",
+ "activeJobs": "進行中的工作",
+ "failingJobs": "失敗中的工作",
+ "totalRuns": "總執行次數",
+ "totalFailures": "總失敗次數"
},
- "links": {
- "login": "",
- "resend": ""
+ "diagnostics": {
+ "stats": {
+ "eventLoopDelay": "事件迴圈延遲",
+ "uptime": "正常運行時間",
+ "usedHeapSize": "已使用堆積大小",
+ "totalHeapSize": "堆積總大小",
+ "osMemoryLimit": "作業系統記憶體限制"
+ },
+ "gauges": {
+ "heapAllocation": "堆積配置",
+ "heapUsage": "堆積使用率",
+ "heapUtilization": "堆積利用率",
+ "instantCpuUsage": "即時 CPU 使用率",
+ "availableMemoryPercentage": "可用記憶體百分比",
+ "allocatedPercentage": "已配置百分比",
+ "usedSPercentage": "CPU 使用 1 秒百分比",
+ "total": "總計",
+ "used": "已使用"
+ }
},
- "toasts": {
- "sent": "",
- "emailNotFound": "",
- "redirect": "",
- "success": "您的密碼已成功重設。",
- "error": ""
+ "table": {
+ "headers": {
+ "timestamp": "時間戳",
+ "level": "等級",
+ "service": "服務",
+ "method": "方法",
+ "monitorId": "監控 ID",
+ "runCount": "執行次數",
+ "failCount": "失敗次數",
+ "lastRunAt": "最後執行於",
+ "lockedAt": "鎖定於",
+ "lastFinishedAt": "最後完成於",
+ "lastRunTook": "最後執行耗時",
+ "lastFailedAt": "最後失敗於",
+ "failReason": "失敗原因"
+ }
}
- }
- },
- "errorPages": {
- "serverUnreachable": {
- "toasts": {
- "reconnected": "",
- "stillUnreachable": ""
+ },
+ "maintenanceWindow": {
+ "fallback": {
+ "actionButton": "建立維護時段!",
+ "checks": "Mark your maintenance periods,Eliminate any misunderstandings,Stop sending alerts in maintenance windows",
+ "title": "維護時段用於:"
+ },
+ "table": {
+ "headers": {
+ "nextWindow": "",
+ "repeat": ""
+ }
},
- "alertBox": "伺服器連線錯誤",
- "description": "我們無法連接到伺服器。請檢查您的網路連線,若問題持續,請確認您的部署設定是否正確。",
- "retryButton": {
- "default": "重新嘗試連線",
- "processing": ""
+ "form": {
+ "general": {
+ "title": "一般設定",
+ "description": "為維護時段設定名稱和重複選項。",
+ "option": {
+ "name": {
+ "label": "名稱",
+ "placeholder": "例如:每週維護"
+ },
+ "repeat": {
+ "label": "重複"
+ }
+ }
+ },
+ "startDate": {
+ "title": "開始日期",
+ "description": "選擇維護時段的開始日期。",
+ "option": {
+ "startDate": {
+ "label": "開始日期"
+ }
+ }
+ },
+ "startTime": {
+ "title": "開始時間",
+ "description": "設定維護時段的開始時間和持續時間。所有數值為 UTC 時間",
+ "option": {
+ "duration": {
+ "label": "持續時間"
+ },
+ "startTime": {
+ "label": "開始時間"
+ }
+ },
+ "monitors": {
+ "title": "監控",
+ "description": "維護時段應套用到的監控",
+ "option": {
+ "addMonitors": {
+ "label": "新增監控"
+ }
+ }
+ }
+ }
}
- }
- },
- "createNotifications": {
- "title": "",
- "nameSettings": {
- "title": "姓名",
- "description": "為您的整合設定描述名稱。",
- "nameLabel": "",
- "namePlaceholder": ""
- },
- "typeSettings": {
- "title": "類型",
- "description": "請選擇您想要建立的通知頻道類型。",
- "typeLabel": "類型"
- },
- "emailSettings": {
- "title": "電郵",
- "description": "目的地電子郵件位址。",
- "emailLabel": "",
- "emailPlaceholder": ""
- },
- "slackSettings": {
- "title": "Slack",
- "description": "在此配置您的 Slack webhook",
- "webhookLabel": "",
- "webhookPlaceholder": ""
- },
- "pagerdutySettings": {
- "title": "PagerDuty",
- "description": "在此配置您的 PagerDuty 整合",
- "integrationKeyLabel": "",
- "integrationKeyPlaceholder": ""
},
- "discordSettings": {
- "title": "Discord",
- "description": "在此配置您的 Discord webhook",
- "webhookLabel": "",
- "webhookPlaceholder": ""
- },
- "webhookSettings": {
- "title": "Webhook",
- "description": "",
- "webhookLabel": "",
- "webhookPlaceholder": ""
- },
- "testNotification": "",
- "dialogDeleteTitle": "",
- "dialogDeleteConfirm": ""
- },
- "notificationConfig": {
- "title": "通知",
- "description": "請選擇您想要使用的通知頻道"
- },
- "monitorStatus": {
- "checkingEvery": "",
- "withCaptureAgent": "",
- "up": "",
- "down": "",
- "paused": ""
- },
- "advancedMatching": "進階匹配",
- "sendTestNotifications": "",
- "selectAll": "",
- "showAdminLoginLink": "",
- "logsPage": {
- "title": "",
- "description": "",
- "tabs": {
- "queue": "",
- "logs": "",
- "diagnostics": ""
- },
- "toast": {
- "fetchLogsSuccess": ""
- },
- "logLevelSelect": {
- "title": "",
- "values": {
- "all": "全部",
- "info": "",
- "warn": "",
- "error": "",
- "debug": "除錯"
+ "notifications": {
+ "fallback": {
+ "actionButton": "建立頻道",
+ "checks": "Alert teams about downtime or performance issues,Let engineers know when incidents happen,Keep administrators informed of system changes",
+ "title": "通知頻道用於:"
+ },
+ "form": {
+ "accessToken": {
+ "optionAccessToken": "存取令牌",
+ "placeholder": "syt_YWxleF9ob2xsaWRheQ_VmtScmV0U2VjcmV0S2V5_abc123"
+ },
+ "address": {
+ "description": "通知將發送到的地址。",
+ "optionAddress": "地址",
+ "placeholderEmail": "example@example.com",
+ "placeholderWebhook": "https://your-server.com/webhook",
+ "title": "地址"
+ },
+ "homeServer": {
+ "optionHomeServer": "主伺服器",
+ "placeholder": "example.com"
+ },
+ "matrix": {
+ "description": "設定您的 Matrix 主伺服器連線以接收通知。",
+ "title": "Matrix 設定"
+ },
+ "notificationName": {
+ "description": "通知頻道的描述性名稱",
+ "optionName": "頻道名稱",
+ "placeholder": "例如:正式環境警報",
+ "title": "頻道名稱"
+ },
+ "pagerDuty": {
+ "description": "用於接收警報的 PagerDuty 整合金鑰。",
+ "optionIntegrationKey": "整合金鑰",
+ "placeholder": "a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6",
+ "title": "整合金鑰"
+ },
+ "roomId": {
+ "optionRoomId": "房間 ID",
+ "placeholder": "!abcdefg:matrix.org"
+ },
+ "type": {
+ "description": "選擇要建立的通知頻道類型。",
+ "optionType": "類型",
+ "title": "頻道類型"
+ },
+ "telegram": {
+ "title": "Telegram 設定",
+ "description": "要啟用 Telegram 通知,請使用 BotFather 用於創建和管理 Telegram 的官方機器來建立一個 Telegram 機器人。接著,取得 API 金鑰和聊天室 ID,並在此處填寫。",
+ "optionBotToken": "機器人令牌",
+ "placeholderBotToken": "123456789:ABCdefGhIJKlmNoPQRsTUVwxyZ",
+ "optionChatId": "聊天室 ID",
+ "placeholderChatId": "-1001234567890"
+ }
+ },
+ "table": {
+ "headers": {
+ "destination": "目的地"
+ }
}
- }
- },
- "queuePage": {
- "title": "",
- "refreshButton": "",
- "flushButton": "",
- "jobTable": {
- "title": "",
- "idHeader": "",
- "urlHeader": "",
- "typeHeader": "類型",
- "activeHeader": "啟用中",
- "lockedAtHeader": "",
- "runCountHeader": "",
- "failCountHeader": "",
- "lastRunHeader": "",
- "lastFinishedAtHeader": "",
- "lastRunTookHeader": "",
- "intervalHeader": ""
- },
- "metricsTable": {
- "title": "",
- "metricHeader": "",
- "valueHeader": ""
- },
- "failedJobTable": {
- "title": "",
- "monitorIdHeader": "",
- "monitorUrlHeader": "",
- "failCountHeader": "",
- "failedAtHeader": "",
- "failReasonHeader": ""
- }
- },
- "export": {
- "title": "",
- "success": "",
- "failed": ""
- },
- "monitorActions": {
- "title": "",
- "import": "",
- "export": "",
- "deleteSuccess": "",
- "deleteFailed": "",
- "details": ""
- },
- "settingsPage": {
- "aboutSettings": {
- "labelDevelopedBy": "",
- "labelVersion": "",
- "title": "關於"
},
- "demoMonitorsSettings": {
- "buttonAddMonitors": "",
- "description": "",
- "title": ""
- },
- "emailSettings": {
- "buttonSendTestEmail": "發送測試電子郵件",
- "description": "",
- "descriptionTransport": "",
- "labelAddress": "",
- "labelConnectionHost": "",
- "labelHost": "",
- "labelIgnoreTLS": "",
- "labelPassword": "",
- "labelPasswordSet": "",
- "labelPool": "",
- "labelPort": "",
- "labelRejectUnauthorized": "",
- "labelRequireTLS": "",
- "labelSecure": "",
- "labelTLSServername": "",
- "labelUser": "",
- "linkTransport": "",
- "placeholderUser": "",
- "title": "電郵",
- "toastEmailRequiredFieldsError": ""
- },
- "pageSpeedSettings": {
- "description": "",
- "labelApiKeySet": "",
- "labelApiKey": "",
- "title": "Google PageSpeed API 金鑰"
- },
- "saveButtonLabel": "",
- "statsSettings": {
- "clearAllStatsButton": "清除所有統計數據",
- "clearAllStatsDescription": "清除所有統計數據,此操作不可逆轉。",
- "clearAllStatsDialogConfirm": "是,請清除所有統計數據",
- "clearAllStatsDialogDescription": "一旦刪除,監控歷史和統計數據將無法復原。",
- "clearAllStatsDialogTitle": "您是否要清除所有統計數據?",
- "description": "",
- "labelTTL": "",
- "labelTTLOptional": "0 表示無限",
- "title": ""
- },
- "systemResetSettings": {
- "buttonRemoveAllMonitors": "",
- "description": "",
- "dialogConfirm": "",
- "dialogDescription": "",
- "dialogTitle": "",
- "title": "系統重設"
- },
- "timezoneSettings": {
- "description": "",
- "label": "",
- "title": "顯示時區"
- },
- "title": "設定",
- "uiSettings": {
- "description": "",
- "labelLanguage": "",
- "labelTheme": "",
- "title": "外觀"
- },
- "urlSettings": {
- "description": "",
- "label": "",
- "selectDisabled": "",
- "selectEnabled": "",
- "title": ""
- },
- "globalThresholds": {
- "title": "",
- "description": ""
- }
- },
- "statusPageCreate": {
- "buttonSave": "儲存"
- },
- "incidentsOptionsHeaderFilterResolved": "",
- "settingsSave": "",
- "statusPageCreateAppearanceTitle": "",
- "confirmPassword": "確認密碼",
- "monitorHooks": {
- "failureAddDemoMonitors": "",
- "successAddDemoMonitors": ""
- },
- "settingsAppearance": "",
- "settingsDisplayTimezone": "",
- "settingsGeneralSettings": "",
- "incidentsOptionsHeaderTotalIncidents": "",
- "statusPage": {
- "deleteSuccess": "",
- "deleteFailed": "刪除狀態頁面失敗",
- "createSuccess": "",
- "updateSuccess": "",
- "generalSettings": "",
- "contents": "內容",
- "fallback": {
- "checks": [""],
- "title": "",
- "actionButton": "讓我們建立您的第一個狀態頁面!"
- }
- },
- "testNotificationsDisabled": "",
- "incidentsTableResolvedAt": "",
- "incidentsTableActionResolve": "",
- "checkHooks": {
- "failureResolveOne": "",
- "failureResolveAll": "",
- "failureResolveMonitor": ""
- },
- "checkFormError": "",
- "diagnosticsPage": {
- "diagnosticDescription": "",
- "statsDescription": "",
- "gauges": {
- "heapAllocationTitle": "",
- "heapAllocationSubtitle": "",
- "heapUsageTitle": "",
- "heapUsageSubtitle": "",
- "heapUtilizationTitle": "",
- "heapUtilizationSubtitle": "",
- "instantCpuUsageTitle": "",
- "instantCpuUsageSubtitle": ""
- },
- "stats": {
- "eventLoopDelayTitle": "",
- "uptimeTitle": "",
- "usedHeapSizeTitle": "",
- "totalHeapSizeTitle": "",
- "osMemoryLimitTitle": ""
- }
- },
- "pageSpeedLighthouseAPI": "",
- "time": {
- "threeMinutes": "3分鐘",
- "fiveMinutes": "5分鐘",
- "tenMinutes": "10分鐘",
- "twentyMinutes": "20分鐘",
- "oneHour": "1小時",
- "oneDay": "1日",
- "oneWeek": "1星期",
- "fourMinutes": "",
- "oneMinute": "",
- "twoMinutes": "",
- "fifteenSeconds": "",
- "thirtySeconds": ""
- },
- "general": {
- "noOptionsFound": ""
- },
- "infrastructureMonitor": {
- "fallback": {
- "checks": ["追蹤伺服器的效能", "識別瓶頸並優化資源使用", "透過即時監控確保可靠性"],
- "title": "",
- "actionButton": "讓我們建立您的第一個基礎設施監視器!"
- }
- },
- "maintenanceWindow": {
- "fallback": {
- "checks": ["標記您的維護期間", "消除任何誤解", "在維護時段停止發送警報"],
- "title": "",
- "actionButton": "讓我們建立您的第一個維護時段!"
- }
- },
- "pageSpeed": {
- "fallback": {
- "checks": [""],
- "title": "",
- "actionButton": "讓我們建立您的第一個 PageSpeed 監視器!"
- }
- },
- "uptimeMonitor": {
- "fallback": {
- "checks": [""],
- "title": "",
- "actionButton": "讓我們建立您的第一個正常運行時間監視器!"
- }
- },
- "editUserPage": {
- "form": {
- "email": "電郵",
- "firstName": "名",
- "lastName": "姓",
- "role": "角色",
- "save": "儲存"
- },
- "table": {
- "actionHeader": "行動",
- "roleHeader": "角色"
- },
- "title": "編輯用戶",
- "toast": {
- "successUserUpdate": "",
- "validationErrors": ""
- }
- },
- "incidentsPageActionResolveMonitor": "解決監視器事故",
- "incidentsPageActionResolveAll": "解決所有事故",
- "matchMethodOptions": {
- "equal": "",
- "equalPlaceholder": "",
- "include": "",
- "includePlaceholder": "",
- "regex": "",
- "regexPlaceholder": "",
- "text": ""
- },
- "monitorType": {
- "docker": {
- "label": "",
- "namePlaceholder": "",
- "placeholder": ""
- },
- "http": {
- "label": "",
- "namePlaceholder": "",
- "placeholder": ""
+ "pageSpeed": {
+ "charts": {
+ "common": {
+ "cls": "累計版面配置位移 (CLS)",
+ "fcp": "首次內容繪製 (FCP)",
+ "lcp": "最大內容繪製 (LCP)",
+ "si": "速度指數 (SI)",
+ "tbt": "總阻塞時間 (TBT)"
+ },
+ "legend": {
+ "title": "PageSpeed 報告",
+ "weight": "權重"
+ },
+ "pie": {
+ "title": "效能報告"
+ }
+ },
+ "table": {
+ "headers": {
+ "pageSpeedScore": "PageSpeed 分數"
+ }
+ },
+ "fallback": {
+ "actionButton": "建立監控!",
+ "checks": "Report on the user experience of a page,Help analyze webpage speed,Give suggestions on how the page can be improved",
+ "title": "PageSpeed 監控用於:"
+ }
},
- "ping": {
- "label": "",
- "namePlaceholder": "",
- "placeholder": ""
+ "settings": {
+ "form": {
+ "timezone": {
+ "title": "顯示時區",
+ "description": "選擇用於在整個應用程式中顯示日期和時間的時區。",
+ "option": {
+ "timezone": {
+ "label": "顯示時區"
+ }
+ }
+ },
+ "ui": {
+ "title": "外觀",
+ "description": "切換淺色和深色模式、變更語言或自訂圖表顯示類型。",
+ "option": {
+ "theme": {
+ "label": "佈景主題模式",
+ "light": "淺色",
+ "dark": "深色"
+ },
+ "language": {
+ "label": "語言"
+ },
+ "chartType": {
+ "label": "圖表類型",
+ "histogram": "直方圖",
+ "heatmap": "熱力圖"
+ }
+ }
+ },
+ "pagespeed": {
+ "title": "Google PageSpeed API 金鑰",
+ "description": "輸入您的 Google PageSpeed API 金鑰以啟用 Google PageSpeed 監控。點擊重設以更新金鑰。",
+ "option": {
+ "apiKey": {
+ "label": "PageSpeed API 金鑰",
+ "labelSet": "API 金鑰已設定。點擊重設以變更。",
+ "placeholder": "輸入您的 Google PageSpeed API 金鑰"
+ }
+ }
+ },
+ "url": {
+ "title": "在狀態頁面上顯示監控 IP/URL",
+ "description": "在公開狀態頁面上顯示監控的 IP 位址或 URL。若停用此選項,將僅顯示監控名稱以保護敏感資訊。",
+ "option": {
+ "showURL": {
+ "label": "在狀態頁面上顯示 IP/URL",
+ "enabled": "啟用",
+ "disabled": "停用"
+ }
+ }
+ },
+ "stats": {
+ "title": "監控歷史",
+ "description": "清除團隊的所有監控歷史和統計資料。此操作無法復原。",
+ "option": {
+ "clear": {
+ "label": "清除所有統計資料。此操作無法復原。"
+ }
+ },
+ "dialog": {
+ "title": "清除所有監控歷史?",
+ "description": "此操作無法復原"
+ }
+ },
+ "retention": {
+ "title": "檢查資料保留",
+ "description": "設定檢查資料在自動清除之前的保留時間。",
+ "option": {
+ "days": {
+ "label": "保留期間(天)",
+ "unlimited": "無限制"
+ }
+ }
+ },
+ "thresholds": {
+ "title": "全域閾值",
+ "description": "設定基礎架構監控的全域 CPU、記憶體、磁碟和溫度閾值。這些設定將套用到所有硬體監控,除非被個別覆寫。",
+ "option": {
+ "cpu": {
+ "label": "CPU 閾值 (%)",
+ "placeholder": "1 - 100"
+ },
+ "memory": {
+ "label": "記憶體閾值 (%)",
+ "placeholder": "1 - 100"
+ },
+ "disk": {
+ "label": "磁碟閾值 (%)",
+ "placeholder": "1 - 100"
+ },
+ "temperature": {
+ "label": "溫度閾值 (°C)",
+ "placeholder": "1 - 150"
+ }
+ }
+ },
+ "email": {
+ "title": "電子郵件設定",
+ "description": "設定系統的電子郵件設定。此設定用於發送通知和警報。",
+ "descriptionTransport": "",
+ "descriptionTransportLink": "在此查看規格",
+ "option": {
+ "host": {
+ "label": "電子郵件主機 - 要連線的主機名稱或 IP 位址",
+ "placeholder": "smtp.gmail.com"
+ },
+ "port": {
+ "label": "電子郵件連接埠 - 要連線的連接埠",
+ "placeholder": "587"
+ },
+ "address": {
+ "label": "電子郵件地址 - 用於驗證",
+ "placeholder": "you@example.com"
+ },
+ "user": {
+ "label": "電子郵件使用者 - 用於驗證的使用者名稱,若指定則覆寫電子郵件地址",
+ "placeholder": "若非必要請留空"
+ },
+ "password": {
+ "label": "電子郵件密碼 - 用於驗證的密碼",
+ "labelSet": "密碼已設定。點擊重設以變更。",
+ "placeholder": "輸入您的密碼"
+ },
+ "tlsServername": {
+ "label": "TLS 伺服器名稱 - 當主機為 IP 時用於 TLS 驗證的選用主機名稱",
+ "placeholder": "example.com"
+ },
+ "connectionHost": {
+ "label": "電子郵件連線主機 - 用於 HELO/EHLO 問候的主機名稱",
+ "placeholder": "localhost"
+ },
+ "secure": {
+ "label": "使用 SSL(建議):使用 SSL/TLS 加密連線"
+ },
+ "pool": {
+ "label": "啟用連線池:重複使用現有連線以提升效能"
+ },
+ "ignoreTLS": {
+ "label": "停用 STARTTLS:即使伺服器支援也不使用 TLS"
+ },
+ "requireTLS": {
+ "label": "強制 STARTTLS:要求 TLS 升級,若不支援則失敗"
+ },
+ "rejectUnauthorized": {
+ "label": "拒絕無效憑證:拒絕使用自簽或不受信任憑證的連線"
+ }
+ }
+ },
+ "demoMonitors": {
+ "title": "示範監控",
+ "description": "新增範例監控以供示範用途。"
+ },
+ "removeMonitors": {
+ "title": "系統重設",
+ "description": "從系統中移除所有監控。",
+ "dialog": {
+ "title": "移除所有監控?",
+ "description": "此操作無法復原。"
+ }
+ },
+ "exportMonitors": {
+ "title": "匯出監控"
+ },
+ "importExportMonitors": {
+ "title": "匯入/匯出監控",
+ "description": "將監控資料匯入或匯出為 JSON 檔案以進行備份或轉移。"
+ },
+ "about": {
+ "title": "關於",
+ "developedBy": "由 Bluewave Labs 開發"
+ },
+ "validation": {
+ "errorMessage": "請修正以下驗證錯誤:"
+ }
+ }
},
- "port": {
- "label": "",
- "namePlaceholder": "",
- "placeholder": ""
+ "statusPages": {
+ "deleteSuccess": "狀態頁面已成功刪除",
+ "fallback": {
+ "title": "狀態頁面用於:",
+ "checks": "Communicate system status to users and stakeholders,Display real-time uptime information publicly,Build trust with transparent service monitoring,Reduce support requests during incidents",
+ "actionButton": "建立狀態頁面!"
+ },
+ "monitorsList": {
+ "chartTypeHeatmap": "熱力圖",
+ "chartTypeHistogram": "直方圖",
+ "noData": "沒有可用資料",
+ "infrastructure": {
+ "title": "基礎架構",
+ "cpu": "CPU",
+ "memory": "RAM",
+ "memoryText": "記憶體",
+ "disk": "磁碟",
+ "usage": "使用量",
+ "used": "已使用",
+ "total": "總計"
+ },
+ "uptime": {
+ "title": "正常運行時間",
+ "responseTime": "回應時間"
+ }
+ },
+ "statusBar": {
+ "allDown": "所有系統已停機",
+ "allUp": "所有系統運作正常",
+ "degraded": "部分系統正在發生問題",
+ "unknown": "無法判斷系統狀態"
+ },
+ "table": {
+ "headers": {
+ "name": "狀態頁面名稱",
+ "url": "公開 URL"
+ },
+ "published": "已發佈",
+ "unpublished": "未發佈"
+ },
+ "title": "狀態頁面",
+ "details": {
+ "empty": {
+ "title": "這裡還沒有任何內容",
+ "addMonitor": "新增一個監控以開始使用"
+ }
+ },
+ "form": {
+ "access": {
+ "title": "存取",
+ "description": "如果您的狀態頁面已準備就緒,可以將其標記為已發佈。",
+ "option": {
+ "published": {
+ "name": "已發佈且公開可見"
+ }
+ }
+ },
+ "basicInfo": {
+ "title": "基本資訊",
+ "description": "定義公司名稱和狀態頁面指向的子網域。",
+ "option": {
+ "name": {
+ "label": "公司名稱",
+ "placeholder": "Acme Inc."
+ },
+ "url": {
+ "label": "您的狀態頁面地址",
+ "placeholder": "my-status-page"
+ }
+ }
+ },
+ "monitors": {
+ "title": "監控",
+ "description": "選擇要在狀態頁面上顯示的監控。",
+ "noMonitors": "未選擇監控",
+ "option": {
+ "monitors": {
+ "label": "選擇監控",
+ "placeholder": "搜尋並選擇監控..."
+ }
+ }
+ },
+ "timezone": {
+ "title": "時區",
+ "description": "選擇狀態頁面顯示的時區。",
+ "option": {
+ "timezone": {
+ "label": "時區",
+ "placeholder": "選擇時區..."
+ }
+ }
+ },
+ "appearance": {
+ "title": "外觀",
+ "description": "定義公開狀態頁面的預設外觀。",
+ "option": {
+ "logo": {
+ "label": "Logo"
+ },
+ "color": {
+ "label": "品牌顏色"
+ }
+ }
+ },
+ "features": {
+ "title": "功能",
+ "description": "設定狀態頁面上顯示的資訊。",
+ "option": {
+ "showCharts": {
+ "label": "顯示回應時間圖表"
+ },
+ "showUptimePercentage": {
+ "label": "顯示正常運行時間百分比"
+ },
+ "showAdminLoginLink": {
+ "label": "顯示管理員登入連結"
+ },
+ "showInfrastructure": {
+ "label": "顯示基礎架構指標"
+ }
+ }
+ }
+ }
},
- "game": {
- "label": "",
- "namePlaceholder": "",
- "placeholder": ""
+ "uptime": {
+ "filters": {
+ "search": {
+ "placeholder": "搜尋監控..."
+ }
+ },
+ "table": {
+ "headers": {
+ "responseTime": "回應時間"
+ }
+ },
+ "fallback": {
+ "actionButton": "建立監控!",
+ "checks": "Check if websites or servers are online & responsive,Alert teams about downtime or performance issues,Monitor HTTP endpoints, pings, containers & ports,Track historical uptime and reliability trends",
+ "title": "正常運行時間監控用於:"
+ }
}
- },
- "uptimeAdvancedMatching": {
- "jsonPath": ""
- },
- "bytesPerSecond": "",
- "bytesReceived": "",
- "bytesSent": "",
- "chooseGame": "",
- "createMonitorPage": {
- "incidentConfigDescription": "",
- "incidentConfigStatusWindowLabel": "",
- "incidentConfigStatusWindowThresholdLabel": "",
- "incidentConfigTitle": "",
- "incidentConfigDescriptionV2": "",
- "incidentConfigStatusCheckNumber": "",
- "intervalTitle": "",
- "intervalDescription": ""
- },
- "dataRate": "",
- "dataReceived": "",
- "dataSent": "",
- "details": "",
- "drops": "",
- "errors": "",
- "errorsIn": "",
- "errorsOut": "",
- "gameServerMonitoring": "",
- "gameServerMonitoringDescription": "",
- "network": "",
- "networkDrops": "",
- "networkErrors": "",
- "networkInterface": "",
- "noNetworkStatsAvailable": "",
- "packetsPerSecond": "",
- "packetsReceived": "",
- "packetsReceivedRate": "",
- "packetsSent": "",
- "rate": "",
- "selectInterface": ""
+ }
}
diff --git a/server/package-lock.json b/server/package-lock.json
index 5d9d920ee5..295acbd0c6 100644
--- a/server/package-lock.json
+++ b/server/package-lock.json
@@ -37,10 +37,11 @@
"mongoose": "^8.3.3",
"multer": "^1.4.5-lts.1",
"nodemailer": "8.0.1",
+ "pg": "8.20.0",
"ping": "0.4.4",
"sharp": "0.33.5",
"ssl-checker": "2.0.10",
- "super-simple-scheduler": "1.4.5",
+ "super-simple-scheduler": "1.9.1",
"swagger-ui-express": "5.0.1",
"winston": "^3.13.0",
"ws": "^8.19.0",
@@ -62,6 +63,7 @@
"@types/multer": "^2.0.0",
"@types/nodemailer": "7.0.1",
"@types/papaparse": "^5.5.2",
+ "@types/pg": "8.20.0",
"@types/ping": "0.4.4",
"@types/swagger-ui-express": "4.1.8",
"@types/ws": "^8.18.1",
@@ -799,40 +801,20 @@
}
},
"node_modules/@aws-sdk/xml-builder": {
- "version": "3.972.10",
- "resolved": "https://registry.npmjs.org/@aws-sdk/xml-builder/-/xml-builder-3.972.10.tgz",
- "integrity": "sha512-OnejAIVD+CxzyAUrVic7lG+3QRltyja9LoNqCE/1YVs8ichoTbJlVSaZ9iSMcnHLyzrSNtvaOGjSDRP+d/ouFA==",
+ "version": "3.972.16",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/xml-builder/-/xml-builder-3.972.16.tgz",
+ "integrity": "sha512-iu2pyvaqmeatIJLURLqx9D+4jKAdTH20ntzB6BFwjyN7V960r4jK32mx0Zf7YbtOYAbmbtQfDNuL60ONinyw7A==",
"dev": true,
"license": "Apache-2.0",
"dependencies": {
- "@smithy/types": "^4.13.0",
- "fast-xml-parser": "5.4.1",
+ "@smithy/types": "^4.13.1",
+ "fast-xml-parser": "5.5.8",
"tslib": "^2.6.2"
},
"engines": {
"node": ">=20.0.0"
}
},
- "node_modules/@aws-sdk/xml-builder/node_modules/fast-xml-parser": {
- "version": "5.4.1",
- "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-5.4.1.tgz",
- "integrity": "sha512-BQ30U1mKkvXQXXkAGcuyUA/GA26oEB7NzOtsxCDtyu62sjGw5QraKFhx2Em3WQNjPw9PG6MQ9yuIIgkSDfGu5A==",
- "dev": true,
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/NaturalIntelligence"
- }
- ],
- "license": "MIT",
- "dependencies": {
- "fast-xml-builder": "^1.0.0",
- "strnum": "^2.1.2"
- },
- "bin": {
- "fxparser": "src/cli/cli.js"
- }
- },
"node_modules/@aws/lambda-invoke-store": {
"version": "0.2.3",
"resolved": "https://registry.npmjs.org/@aws/lambda-invoke-store/-/lambda-invoke-store-0.2.3.tgz",
@@ -3850,9 +3832,9 @@
}
},
"node_modules/@smithy/types": {
- "version": "4.13.0",
- "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.13.0.tgz",
- "integrity": "sha512-COuLsZILbbQsdrwKQpkkpyep7lCsByxwj7m0Mg5v66/ZTyenlfBc40/QFQ5chO0YN/PNEH1Bi3fGtfXPnYNeDw==",
+ "version": "4.13.1",
+ "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.13.1.tgz",
+ "integrity": "sha512-787F3yzE2UiJIQ+wYW1CVg2odHjmaWLGksnKQHUrK/lYZSEcy1msuLVvxaR/sI2/aDe9U+TBuLsXnr3vod1g0g==",
"dev": true,
"license": "Apache-2.0",
"dependencies": {
@@ -4522,6 +4504,18 @@
"@types/node": "*"
}
},
+ "node_modules/@types/pg": {
+ "version": "8.20.0",
+ "resolved": "https://registry.npmjs.org/@types/pg/-/pg-8.20.0.tgz",
+ "integrity": "sha512-bEPFOaMAHTEP1EzpvHTbmwR8UsFyHSKsRisLIHVMXnpNefSbGA1bD6CVy+qKjGSqmZqNqBDV2azOBo8TgkcVow==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/node": "*",
+ "pg-protocol": "*",
+ "pg-types": "^2.2.0"
+ }
+ },
"node_modules/@types/ping": {
"version": "0.4.4",
"resolved": "https://registry.npmjs.org/@types/ping/-/ping-0.4.4.tgz",
@@ -4942,9 +4936,9 @@
}
},
"node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": {
- "version": "5.0.4",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.4.tgz",
- "integrity": "sha512-h+DEnpVvxmfVefa4jFbCf5HdH5YMDXRsmKflpf1pILZWRFlTbJpxeU55nJl4Smt5HQaGzg1o6RHFPJaOqnmBDg==",
+ "version": "5.0.5",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.5.tgz",
+ "integrity": "sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -5884,9 +5878,9 @@
"license": "MIT"
},
"node_modules/brace-expansion": {
- "version": "1.1.12",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz",
- "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==",
+ "version": "1.1.13",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.13.tgz",
+ "integrity": "sha512-9ZLprWS6EENmhEOpjCYW2c8VkmOvckIJZfkr7rBW6dObmfgJ/L1GpSYW5Hpo9lDz4D1+n0Ckz8rU7FwHDQiG/w==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -8127,9 +8121,9 @@
"license": "MIT"
},
"node_modules/fast-xml-builder": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/fast-xml-builder/-/fast-xml-builder-1.0.0.tgz",
- "integrity": "sha512-fpZuDogrAgnyt9oDDz+5DBz0zgPdPZz6D4IR7iESxRXElrlGTRkHJ9eEt+SACRJwT0FNFrt71DFQIUFBJfX/uQ==",
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/fast-xml-builder/-/fast-xml-builder-1.1.4.tgz",
+ "integrity": "sha512-f2jhpN4Eccy0/Uz9csxh3Nu6q4ErKxf0XIsasomfOihuSUa3/xw6w8dnOtCDgEItQFJG8KyXPzQXzcODDrrbOg==",
"dev": true,
"funding": [
{
@@ -8137,7 +8131,31 @@
"url": "https://github.com/sponsors/NaturalIntelligence"
}
],
- "license": "MIT"
+ "license": "MIT",
+ "dependencies": {
+ "path-expression-matcher": "^1.1.3"
+ }
+ },
+ "node_modules/fast-xml-parser": {
+ "version": "5.5.8",
+ "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-5.5.8.tgz",
+ "integrity": "sha512-Z7Fh2nVQSb2d+poDViM063ix2ZGt9jmY1nWhPfHBOK2Hgnb/OW3P4Et3P/81SEej0J7QbWtJqxO05h8QYfK7LQ==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/NaturalIntelligence"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "fast-xml-builder": "^1.1.4",
+ "path-expression-matcher": "^1.2.0",
+ "strnum": "^2.2.0"
+ },
+ "bin": {
+ "fxparser": "src/cli/cli.js"
+ }
},
"node_modules/fastq": {
"version": "1.20.1",
@@ -8278,9 +8296,9 @@
}
},
"node_modules/flatted": {
- "version": "3.3.3",
- "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz",
- "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==",
+ "version": "3.4.2",
+ "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.2.tgz",
+ "integrity": "sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==",
"dev": true,
"license": "ISC"
},
@@ -8727,9 +8745,9 @@
}
},
"node_modules/glob/node_modules/brace-expansion": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz",
- "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==",
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.3.tgz",
+ "integrity": "sha512-MCV/fYJEbqx68aE58kv2cA/kiky1G8vux3OR6/jbS+jIMe/6fJWa0DTzJU7dqijOWYwHi1t29FlfYI9uytqlpA==",
"license": "MIT",
"dependencies": {
"balanced-match": "^1.0.0"
@@ -8829,9 +8847,9 @@
"license": "ISC"
},
"node_modules/handlebars": {
- "version": "4.7.8",
- "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz",
- "integrity": "sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==",
+ "version": "4.7.9",
+ "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.9.tgz",
+ "integrity": "sha512-4E71E0rpOaQuJR2A3xDZ+GM1HyWYv1clR58tC8emQNeQe3RH7MAzSbat+V0wG78LQBo6m6bzSG/L4pBuCsgnUQ==",
"license": "MIT",
"dependencies": {
"minimist": "^1.2.5",
@@ -10130,9 +10148,9 @@
}
},
"node_modules/jest-util/node_modules/picomatch": {
- "version": "4.0.3",
- "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz",
- "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==",
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz",
+ "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==",
"dev": true,
"license": "MIT",
"engines": {
@@ -10667,9 +10685,9 @@
}
},
"node_modules/lodash": {
- "version": "4.17.23",
- "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.23.tgz",
- "integrity": "sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w==",
+ "version": "4.18.1",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.18.1.tgz",
+ "integrity": "sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==",
"license": "MIT"
},
"node_modules/lodash.camelcase": {
@@ -11211,9 +11229,9 @@
}
},
"node_modules/mjml-cli/node_modules/brace-expansion": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz",
- "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==",
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.3.tgz",
+ "integrity": "sha512-MCV/fYJEbqx68aE58kv2cA/kiky1G8vux3OR6/jbS+jIMe/6fJWa0DTzJU7dqijOWYwHi1t29FlfYI9uytqlpA==",
"license": "MIT",
"dependencies": {
"balanced-match": "^1.0.0"
@@ -12307,6 +12325,22 @@
"node": ">=8"
}
},
+ "node_modules/path-expression-matcher": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/path-expression-matcher/-/path-expression-matcher-1.2.1.tgz",
+ "integrity": "sha512-d7gQQmLvAKXKXE2GeP9apIGbMYKz88zWdsn/BN2HRWVQsDFdUY36WSLTY0Jvd4HWi7Fb30gQ62oAOzdgJA6fZw==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/NaturalIntelligence"
+ }
+ ],
+ "license": "MIT",
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
"node_modules/path-is-absolute": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
@@ -12343,9 +12377,9 @@
}
},
"node_modules/path-to-regexp": {
- "version": "0.1.12",
- "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz",
- "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==",
+ "version": "0.1.13",
+ "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.13.tgz",
+ "integrity": "sha512-A/AGNMFN3c8bOlvV9RreMdrv7jsmF9XIfDeCd87+I8RNg6s78BhJxMu69NEMHBSJFxKidViTEdruRwEk/WIKqA==",
"license": "MIT"
},
"node_modules/path-type": {
@@ -12358,6 +12392,95 @@
"node": ">=8"
}
},
+ "node_modules/pg": {
+ "version": "8.20.0",
+ "resolved": "https://registry.npmjs.org/pg/-/pg-8.20.0.tgz",
+ "integrity": "sha512-ldhMxz2r8fl/6QkXnBD3CR9/xg694oT6DZQ2s6c/RI28OjtSOpxnPrUCGOBJ46RCUxcWdx3p6kw/xnDHjKvaRA==",
+ "license": "MIT",
+ "dependencies": {
+ "pg-connection-string": "^2.12.0",
+ "pg-pool": "^3.13.0",
+ "pg-protocol": "^1.13.0",
+ "pg-types": "2.2.0",
+ "pgpass": "1.0.5"
+ },
+ "engines": {
+ "node": ">= 16.0.0"
+ },
+ "optionalDependencies": {
+ "pg-cloudflare": "^1.3.0"
+ },
+ "peerDependencies": {
+ "pg-native": ">=3.0.1"
+ },
+ "peerDependenciesMeta": {
+ "pg-native": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/pg-cloudflare": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/pg-cloudflare/-/pg-cloudflare-1.3.0.tgz",
+ "integrity": "sha512-6lswVVSztmHiRtD6I8hw4qP/nDm1EJbKMRhf3HCYaqud7frGysPv7FYJ5noZQdhQtN2xJnimfMtvQq21pdbzyQ==",
+ "license": "MIT",
+ "optional": true
+ },
+ "node_modules/pg-connection-string": {
+ "version": "2.12.0",
+ "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.12.0.tgz",
+ "integrity": "sha512-U7qg+bpswf3Cs5xLzRqbXbQl85ng0mfSV/J0nnA31MCLgvEaAo7CIhmeyrmJpOr7o+zm0rXK+hNnT5l9RHkCkQ==",
+ "license": "MIT"
+ },
+ "node_modules/pg-int8": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/pg-int8/-/pg-int8-1.0.1.tgz",
+ "integrity": "sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==",
+ "license": "ISC",
+ "engines": {
+ "node": ">=4.0.0"
+ }
+ },
+ "node_modules/pg-pool": {
+ "version": "3.13.0",
+ "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-3.13.0.tgz",
+ "integrity": "sha512-gB+R+Xud1gLFuRD/QgOIgGOBE2KCQPaPwkzBBGC9oG69pHTkhQeIuejVIk3/cnDyX39av2AxomQiyPT13WKHQA==",
+ "license": "MIT",
+ "peerDependencies": {
+ "pg": ">=8.0"
+ }
+ },
+ "node_modules/pg-protocol": {
+ "version": "1.13.0",
+ "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.13.0.tgz",
+ "integrity": "sha512-zzdvXfS6v89r6v7OcFCHfHlyG/wvry1ALxZo4LqgUoy7W9xhBDMaqOuMiF3qEV45VqsN6rdlcehHrfDtlCPc8w==",
+ "license": "MIT"
+ },
+ "node_modules/pg-types": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/pg-types/-/pg-types-2.2.0.tgz",
+ "integrity": "sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==",
+ "license": "MIT",
+ "dependencies": {
+ "pg-int8": "1.0.1",
+ "postgres-array": "~2.0.0",
+ "postgres-bytea": "~1.0.0",
+ "postgres-date": "~1.0.4",
+ "postgres-interval": "^1.1.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/pgpass": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/pgpass/-/pgpass-1.0.5.tgz",
+ "integrity": "sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug==",
+ "license": "MIT",
+ "dependencies": {
+ "split2": "^4.1.0"
+ }
+ },
"node_modules/picocolors": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz",
@@ -12365,9 +12488,9 @@
"license": "ISC"
},
"node_modules/picomatch": {
- "version": "2.3.1",
- "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
- "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz",
+ "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==",
"license": "MIT",
"engines": {
"node": ">=8.6"
@@ -12982,6 +13105,45 @@
"integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==",
"license": "MIT"
},
+ "node_modules/postgres-array": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-2.0.0.tgz",
+ "integrity": "sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/postgres-bytea": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/postgres-bytea/-/postgres-bytea-1.0.1.tgz",
+ "integrity": "sha512-5+5HqXnsZPE65IJZSMkZtURARZelel2oXUEO8rH83VS/hxH5vv1uHquPg5wZs8yMAfdv971IU+kcPUczi7NVBQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/postgres-date": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/postgres-date/-/postgres-date-1.0.7.tgz",
+ "integrity": "sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/postgres-interval": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/postgres-interval/-/postgres-interval-1.2.0.tgz",
+ "integrity": "sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==",
+ "license": "MIT",
+ "dependencies": {
+ "xtend": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
"node_modules/posthtml": {
"version": "0.16.7",
"resolved": "https://registry.npmjs.org/posthtml/-/posthtml-0.16.7.tgz",
@@ -14027,6 +14189,15 @@
"integrity": "sha512-Q5thBSxp5t8WPTTJQS59LrGqOZqOsrhDGDVm8azCqIBjSBd7nd9o2PM+mDulQQkh8h//4U6hFZnc/mul8t5pWQ==",
"license": "ISC"
},
+ "node_modules/split2": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz",
+ "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==",
+ "license": "ISC",
+ "engines": {
+ "node": ">= 10.x"
+ }
+ },
"node_modules/sprintf-js": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
@@ -14344,9 +14515,9 @@
}
},
"node_modules/strnum": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/strnum/-/strnum-2.2.0.tgz",
- "integrity": "sha512-Y7Bj8XyJxnPAORMZj/xltsfo55uOiyHcU2tnAVzHUnSJR/KsEX+9RoDeXEnsXtl/CX4fAcrt64gZ13aGaWPeBg==",
+ "version": "2.2.2",
+ "resolved": "https://registry.npmjs.org/strnum/-/strnum-2.2.2.tgz",
+ "integrity": "sha512-DnR90I+jtXNSTXWdwrEy9FakW7UX+qUZg28gj5fk2vxxl7uS/3bpI4fjFYVmdK9etptYBPNkpahuQnEwhwECqA==",
"dev": true,
"funding": [
{
@@ -14373,25 +14544,12 @@
}
},
"node_modules/super-simple-scheduler": {
- "version": "1.4.5",
- "resolved": "https://registry.npmjs.org/super-simple-scheduler/-/super-simple-scheduler-1.4.5.tgz",
- "integrity": "sha512-xHR3a+pLywY7HtwjWj/+OaANdEwAieQhckC/i0s6OoHtVJQ4+VLO1VfkKUbxp+oSROGXcaZet8PTGONVdKNUUw==",
+ "version": "1.9.1",
+ "resolved": "https://registry.npmjs.org/super-simple-scheduler/-/super-simple-scheduler-1.9.1.tgz",
+ "integrity": "sha512-JSiEQLk7MsnlSkJ87uoyFKIseG2N27ikB0FSxlh25nnQHWC7R5Lrd0VcoLpwSBanyLzlAslhK4W2rQ0mCU8jCQ==",
"license": "MIT",
"dependencies": {
- "uuid": "11.1.0",
- "winston": "3.17.0"
- }
- },
- "node_modules/super-simple-scheduler/node_modules/is-stream": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz",
- "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==",
- "license": "MIT",
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
+ "uuid": "11.1.0"
}
},
"node_modules/super-simple-scheduler/node_modules/uuid": {
@@ -14407,28 +14565,6 @@
"uuid": "dist/esm/bin/uuid"
}
},
- "node_modules/super-simple-scheduler/node_modules/winston": {
- "version": "3.17.0",
- "resolved": "https://registry.npmjs.org/winston/-/winston-3.17.0.tgz",
- "integrity": "sha512-DLiFIXYC5fMPxaRg832S6F5mJYvePtmO5G9v9IgUFPhXm9/GkXarH/TUrBAVzhTCzAj9anE/+GjrgXp/54nOgw==",
- "license": "MIT",
- "dependencies": {
- "@colors/colors": "^1.6.0",
- "@dabh/diagnostics": "^2.0.2",
- "async": "^3.2.3",
- "is-stream": "^2.0.0",
- "logform": "^2.7.0",
- "one-time": "^1.0.0",
- "readable-stream": "^3.4.0",
- "safe-stable-stringify": "^2.3.1",
- "stack-trace": "0.0.x",
- "triple-beam": "^1.3.0",
- "winston-transport": "^4.9.0"
- },
- "engines": {
- "node": ">= 12.0.0"
- }
- },
"node_modules/supports-color": {
"version": "7.2.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
@@ -14532,9 +14668,9 @@
}
},
"node_modules/test-exclude/node_modules/brace-expansion": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz",
- "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==",
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.3.tgz",
+ "integrity": "sha512-MCV/fYJEbqx68aE58kv2cA/kiky1G8vux3OR6/jbS+jIMe/6fJWa0DTzJU7dqijOWYwHi1t29FlfYI9uytqlpA==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -14599,9 +14735,9 @@
}
},
"node_modules/tinyglobby/node_modules/picomatch": {
- "version": "4.0.3",
- "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz",
- "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==",
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz",
+ "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==",
"dev": true,
"license": "MIT",
"engines": {
@@ -14987,9 +15123,9 @@
"license": "MIT"
},
"node_modules/undici": {
- "version": "6.23.0",
- "resolved": "https://registry.npmjs.org/undici/-/undici-6.23.0.tgz",
- "integrity": "sha512-VfQPToRA5FZs/qJxLIinmU59u0r7LXqoJkCzinq3ckNJp3vKEh7jTWN589YQ5+aoAC/TGRLyJLCPKcLQbM8r9g==",
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/undici/-/undici-6.24.1.tgz",
+ "integrity": "sha512-sC+b0tB1whOCzbtlx20fx3WgCXwkW627p4EA9uM+/tNNPkSS+eSEld6pAs9nDv7WbY1UUljBMYPtu9BCOrCWKA==",
"license": "MIT",
"engines": {
"node": ">=18.17"
@@ -15657,9 +15793,9 @@
"license": "ISC"
},
"node_modules/yaml": {
- "version": "2.8.2",
- "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.2.tgz",
- "integrity": "sha512-mplynKqc1C2hTVYxd0PU2xQAc22TI1vShAYGksCCfxbn/dFwnHTNi1bvYsBTkhdUNtGIf5xNOg938rrSSYvS9A==",
+ "version": "2.8.3",
+ "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.3.tgz",
+ "integrity": "sha512-AvbaCLOO2Otw/lW5bmh9d/WEdcDFdQp2Z2ZUH3pX9U2ihyUY0nvLv7J6TrWowklRGPYbB/IuIMfYgxaCPg5Bpg==",
"dev": true,
"license": "ISC",
"bin": {
diff --git a/server/package.json b/server/package.json
index 88f90c68a8..4d1ab4c98c 100755
--- a/server/package.json
+++ b/server/package.json
@@ -52,10 +52,11 @@
"mongoose": "^8.3.3",
"multer": "^1.4.5-lts.1",
"nodemailer": "8.0.1",
+ "pg": "8.20.0",
"ping": "0.4.4",
"sharp": "0.33.5",
"ssl-checker": "2.0.10",
- "super-simple-scheduler": "1.4.5",
+ "super-simple-scheduler": "1.9.1",
"swagger-ui-express": "5.0.1",
"winston": "^3.13.0",
"ws": "^8.19.0",
@@ -77,6 +78,7 @@
"@types/multer": "^2.0.0",
"@types/nodemailer": "7.0.1",
"@types/papaparse": "^5.5.2",
+ "@types/pg": "8.20.0",
"@types/ping": "0.4.4",
"@types/swagger-ui-express": "4.1.8",
"@types/ws": "^8.18.1",
diff --git a/server/src/config/services.ts b/server/src/config/services.ts
index b31c8a5e91..8ed72862a9 100644
--- a/server/src/config/services.ts
+++ b/server/src/config/services.ts
@@ -28,6 +28,7 @@ import {
PagerDutyProvider,
MatrixProvider,
TeamsProvider,
+ TelegramProvider,
// Interfaces
INetworkService,
IEmailService,
@@ -46,6 +47,7 @@ import {
IIncidentService,
INotificationMessageBuilder,
ISettingsService,
+ SettingsService,
EnvConfig,
} from "@/service/index.js";
@@ -92,9 +94,23 @@ import {
MongoInvitesRepository,
MongoRecoveryTokensRepository,
MongoNotificationsRepository,
- MongoIncidentRepository,
+ MongoIncidentsRepository,
MongoTeamsRepository,
MongoMaintenanceWindowsRepository,
+ MongoSettingsRepository,
+ TimescaleMonitorsRepository,
+ TimescaleChecksRepository,
+ TimescaleGeoChecksRepository,
+ TimescaleMonitorStatsRepository,
+ TimescaleStatusPagesRepository,
+ TimescaleUsersRepository,
+ TimescaleInvitesRepository,
+ TimescaleRecoveryTokensRepository,
+ TimescaleNotificationsRepository,
+ TimescaleIncidentsRepository,
+ TimescaleTeamsRepository,
+ TimescaleMaintenanceWindowsRepository,
+ TimescaleSettingsRepository,
IMonitorsRepository,
IChecksRepository,
IGeoChecksRepository,
@@ -110,6 +126,8 @@ import {
IMaintenanceWindowsRepository,
} from "@/repositories/index.js";
import { ILogger } from "@/utils/logger.js";
+import TimescaleDB from "@/db/TimescaleDB.js";
+import { AppError } from "@/utils/AppError.js";
export type InitializedServices = {
settingsService: ISettingsService;
@@ -152,32 +170,81 @@ export const initializeServices = async ({
logger,
envSettings,
settingsService,
- settingsRepository,
}: {
logger: ILogger;
envSettings: EnvConfig;
settingsService: ISettingsService;
- settingsRepository: ISettingsRepository;
}): Promise => {
// Create DB
- const db = new MongoDB(logger, envSettings);
+ const dbType = envSettings.dbType;
+
+ let db: IDb | null = null;
+
+ if (dbType === "mongodb") {
+ db = new MongoDB(logger, envSettings);
+ } else if (dbType === "timescaledb") {
+ db = new TimescaleDB(logger, envSettings);
+ }
+
+ if (!db) {
+ throw new AppError({ message: "Unsupported database type", status: 500 });
+ }
await db.connect();
+ let monitorsRepository: IMonitorsRepository;
+ let checksRepository: IChecksRepository;
+ let geoChecksRepository: IGeoChecksRepository;
+ let monitorStatsRepository: IMonitorStatsRepository;
+ let statusPagesRepository: IStatusPagesRepository;
+ let usersRepository: IUsersRepository;
+ let invitesRepository: IInvitesRepository;
+ let recoveryTokensRepository: IRecoveryTokensRepository;
+ let settingsRepository: ISettingsRepository;
+ let notificationsRepository: INotificationsRepository;
+ let incidentsRepository: IIncidentsRepository;
+ let teamsRepository: ITeamsRepository;
+ let maintenanceWindowsRepository: IMaintenanceWindowsRepository;
+
// Repositories
- const monitorsRepository = new MongoMonitorsRepository();
- const checksRepository = new MongoChecksRepository(logger);
- const geoChecksRepository = new MongoGeoChecksRepository(logger);
- const monitorStatsRepository = new MongoMonitorStatsRepository();
- const statusPagesRepository = new MongoStatusPagesRepository();
- const usersRepository = new MongoUsersRepository();
- const invitesRepository = new MongoInvitesRepository();
- const recoveryTokensRepository = new MongoRecoveryTokensRepository();
- const notificationsRepository = new MongoNotificationsRepository();
- const incidentsRepository = new MongoIncidentRepository();
- const teamsRepository = new MongoTeamsRepository();
- const maintenanceWindowsRepository = new MongoMaintenanceWindowsRepository();
+
+ if (dbType === "mongodb") {
+ monitorsRepository = new MongoMonitorsRepository();
+ checksRepository = new MongoChecksRepository(logger);
+ geoChecksRepository = new MongoGeoChecksRepository(logger);
+ monitorStatsRepository = new MongoMonitorStatsRepository();
+ statusPagesRepository = new MongoStatusPagesRepository();
+ usersRepository = new MongoUsersRepository();
+ invitesRepository = new MongoInvitesRepository();
+ recoveryTokensRepository = new MongoRecoveryTokensRepository();
+ settingsRepository = new MongoSettingsRepository();
+ notificationsRepository = new MongoNotificationsRepository();
+ incidentsRepository = new MongoIncidentsRepository();
+ teamsRepository = new MongoTeamsRepository();
+ maintenanceWindowsRepository = new MongoMaintenanceWindowsRepository();
+ } else {
+ const pool = db.getPool();
+ if (!pool) {
+ throw new Error("Failed to get database pool");
+ }
+ monitorsRepository = new TimescaleMonitorsRepository(pool);
+ checksRepository = new TimescaleChecksRepository(pool);
+ geoChecksRepository = new TimescaleGeoChecksRepository(pool);
+ monitorStatsRepository = new TimescaleMonitorStatsRepository(pool);
+ statusPagesRepository = new TimescaleStatusPagesRepository(pool);
+ usersRepository = new TimescaleUsersRepository(pool);
+ invitesRepository = new TimescaleInvitesRepository(pool);
+ recoveryTokensRepository = new TimescaleRecoveryTokensRepository(pool);
+ settingsRepository = new TimescaleSettingsRepository(pool);
+ notificationsRepository = new TimescaleNotificationsRepository(pool);
+ incidentsRepository = new TimescaleIncidentsRepository(pool);
+ teamsRepository = new TimescaleTeamsRepository(pool);
+ maintenanceWindowsRepository = new TimescaleMaintenanceWindowsRepository(pool);
+ }
+
+ // Inject settings repository into settings service (now that DB is connected)
+ (settingsService as SettingsService).setRepository(settingsRepository);
// Network providers
const pingProvider = new PingProvider(ping);
@@ -230,6 +297,7 @@ export const initializeServices = async ({
const pagerDutyProvider = new PagerDutyProvider(logger);
const matrixProvider = new MatrixProvider(logger);
const teamsProvider = new TeamsProvider(logger);
+ const telegramProvider = new TelegramProvider(logger);
const notificationsService = new NotificationsService(
notificationsRepository,
@@ -241,6 +309,7 @@ export const initializeServices = async ({
pagerDutyProvider,
matrixProvider,
teamsProvider,
+ telegramProvider,
settingsService,
logger,
notificationMessageBuilder
diff --git a/server/src/controllers/geoCheckController.ts b/server/src/controllers/geoCheckController.ts
index 8ac1304590..96f9beeacd 100644
--- a/server/src/controllers/geoCheckController.ts
+++ b/server/src/controllers/geoCheckController.ts
@@ -26,16 +26,6 @@ class GeoCheckController implements IGeoCheckController {
const validatedParams = getChecksParamValidation.parse(req.params);
const validatedQuery = getChecksQueryValidation.parse(req.query);
- if (!validatedQuery.continent || validatedQuery.continent.length === 0) {
- throw new AppError({
- message: "At least one continent must be specified",
- service: SERVICE_NAME,
- method: "getGeoChecksByMonitor",
- details: { monitorId: validatedParams.monitorId },
- status: 400,
- });
- }
-
const teamId = requireTeamId(req.user?.teamId);
const result = await this.geoChecksService.getGeoChecksByMonitor({
diff --git a/server/src/db/IDb.ts b/server/src/db/IDb.ts
index 4c719999f2..e71e36cca1 100644
--- a/server/src/db/IDb.ts
+++ b/server/src/db/IDb.ts
@@ -1,4 +1,7 @@
+import { Pool } from "pg";
+
export interface IDb {
connect(): Promise;
disconnect(): Promise;
+ getPool(): Pool | null;
}
diff --git a/server/src/db/MongoDB.ts b/server/src/db/MongoDB.ts
index 82d05c3a20..8aea562799 100755
--- a/server/src/db/MongoDB.ts
+++ b/server/src/db/MongoDB.ts
@@ -5,6 +5,7 @@ import { ILogger } from "@/utils/logger.js";
import { EnvConfig } from "@/service/system/settingsService.js";
const SERVICE_NAME = "MongoDB";
import { IDb } from "@/db/IDb.js";
+import { Pool } from "pg";
class MongoDB implements IDb {
static SERVICE_NAME = SERVICE_NAME;
@@ -74,6 +75,10 @@ class MongoDB implements IDb {
});
}
};
+
+ getPool = () => {
+ return null;
+ };
}
export default MongoDB;
diff --git a/server/src/db/TimescaleDB.ts b/server/src/db/TimescaleDB.ts
new file mode 100644
index 0000000000..b36c542923
--- /dev/null
+++ b/server/src/db/TimescaleDB.ts
@@ -0,0 +1,105 @@
+import { IDb } from "@/db/IDb.js";
+import { ILogger } from "@/utils/logger.js";
+import { EnvConfig } from "@/service/system/settingsService.js";
+import { Client, Pool } from "pg";
+import { runTimescaleDBMigrations } from "@/db/migration/timescaledb/index.js";
+
+const SERVICE_NAME = "TimescaleDB";
+
+class TimescaleDB implements IDb {
+ private pool: Pool | null = null;
+
+ constructor(
+ private logger: ILogger,
+ private envSettings: EnvConfig
+ ) {}
+
+ private ensureDatabaseExists = async (connectionString: string) => {
+ const url = new URL(connectionString);
+ const dbName = url.pathname.slice(1); // Remove leading "/"
+
+ // Connect to the default "postgres" database
+ url.pathname = "/postgres";
+ const client = new Client({ connectionString: url.toString() });
+ await client.connect();
+
+ const result = await client.query("SELECT 1 FROM pg_database WHERE datname = $1", [dbName]);
+ if (result.rowCount === 0) {
+ await client.query(`CREATE DATABASE "${dbName}"`);
+ this.logger.info({
+ message: `Created database "${dbName}"`,
+ service: SERVICE_NAME,
+ method: "ensureDatabaseExists",
+ });
+ }
+ await client.end();
+ };
+
+ connect = async () => {
+ try {
+ const connectionString = this.envSettings.dbConnectionString || "postgresql://postgres:password@localhost:5432/checkmate";
+
+ await this.ensureDatabaseExists(connectionString);
+
+ this.pool = new Pool({ connectionString });
+
+ const client = await this.pool.connect();
+ client.release();
+
+ // Ensure TimescaleDB extension is enabled
+ await this.pool.query("CREATE EXTENSION IF NOT EXISTS timescaledb;");
+
+ this.logger.info({
+ message: "Connected to TimescaleDB",
+ service: SERVICE_NAME,
+ method: "connect",
+ });
+
+ await runTimescaleDBMigrations(this.pool, this.logger);
+ } catch (error: unknown) {
+ this.logger.error({
+ message: error instanceof Error ? error.message : "Unknown error",
+ service: SERVICE_NAME,
+ method: "connect",
+ stack: error instanceof Error ? error.stack : undefined,
+ });
+ throw error;
+ }
+ };
+
+ disconnect = async () => {
+ try {
+ if (this.pool === null) {
+ return;
+ }
+ this.logger.info({
+ message: "Disconnecting from TimescaleDB",
+ service: SERVICE_NAME,
+ method: "disconnect",
+ });
+ await this.pool.end();
+ this.pool = null;
+ this.logger.info({
+ message: "Disconnected from TimescaleDB",
+ service: SERVICE_NAME,
+ method: "disconnect",
+ });
+ } catch (error: unknown) {
+ this.logger.error({
+ message: error instanceof Error ? error.message : "Unknown error",
+ service: SERVICE_NAME,
+ method: "disconnect",
+ stack: error instanceof Error ? error.stack : undefined,
+ });
+ }
+ };
+
+ getPool = (): Pool => {
+ if (this.pool === null) {
+ throw new Error("TimescaleDB is not connected. Call connect() first.");
+ }
+ return this.pool;
+ };
+}
+
+export default TimescaleDB;
diff --git a/server/src/db/migration/timescaledb/0001_create_enums.ts b/server/src/db/migration/timescaledb/0001_create_enums.ts
new file mode 100644
index 0000000000..a16ec955b9
--- /dev/null
+++ b/server/src/db/migration/timescaledb/0001_create_enums.ts
@@ -0,0 +1,50 @@
+import type { Pool } from "pg";
+
+export const createEnums = async (pool: Pool) => {
+ await pool.query(`
+ DO $$ BEGIN
+ CREATE TYPE monitor_type AS ENUM ('http', 'ping', 'pagespeed', 'hardware', 'docker', 'port', 'game', 'grpc', 'websocket', 'unknown');
+ EXCEPTION WHEN duplicate_object THEN NULL; END $$;
+
+ DO $$ BEGIN
+ CREATE TYPE monitor_status AS ENUM ('up', 'down', 'paused', 'initializing', 'maintenance', 'breached');
+ EXCEPTION WHEN duplicate_object THEN NULL; END $$;
+
+ DO $$ BEGIN
+ CREATE TYPE notification_type AS ENUM ('email', 'slack', 'discord', 'webhook', 'pager_duty', 'matrix', 'teams');
+ EXCEPTION WHEN duplicate_object THEN NULL; END $$;
+
+ DO $$ BEGIN
+ CREATE TYPE user_role AS ENUM ('user', 'admin', 'superadmin', 'demo');
+ EXCEPTION WHEN duplicate_object THEN NULL; END $$;
+
+ DO $$ BEGIN
+ CREATE TYPE incident_resolution_type AS ENUM ('automatic', 'manual');
+ EXCEPTION WHEN duplicate_object THEN NULL; END $$;
+
+ DO $$ BEGIN
+ CREATE TYPE duration_unit AS ENUM ('seconds', 'minutes', 'hours', 'days');
+ EXCEPTION WHEN duplicate_object THEN NULL; END $$;
+
+ DO $$ BEGIN
+ CREATE TYPE status_page_type AS ENUM ('uptime', 'infrastructure');
+ EXCEPTION WHEN duplicate_object THEN NULL; END $$;
+
+ DO $$ BEGIN
+ CREATE TYPE match_method AS ENUM ('equal', 'include', 'regex');
+ EXCEPTION WHEN duplicate_object THEN NULL; END $$;
+ `);
+};
+
+export const dropEnums = async (pool: Pool) => {
+ await pool.query(`
+ DROP TYPE IF EXISTS match_method;
+ DROP TYPE IF EXISTS status_page_type;
+ DROP TYPE IF EXISTS duration_unit;
+ DROP TYPE IF EXISTS incident_resolution_type;
+ DROP TYPE IF EXISTS user_role;
+ DROP TYPE IF EXISTS notification_type;
+ DROP TYPE IF EXISTS monitor_status;
+ DROP TYPE IF EXISTS monitor_type;
+ `);
+};
diff --git a/server/src/db/migration/timescaledb/0002_create_teams.ts b/server/src/db/migration/timescaledb/0002_create_teams.ts
new file mode 100644
index 0000000000..905883eb21
--- /dev/null
+++ b/server/src/db/migration/timescaledb/0002_create_teams.ts
@@ -0,0 +1,18 @@
+import type { Pool } from "pg";
+
+export const createTeams = async (pool: Pool) => {
+ await pool.query(`
+ CREATE TABLE IF NOT EXISTS teams (
+ id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
+ email TEXT NOT NULL UNIQUE,
+ created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
+ updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
+ );
+
+ CREATE INDEX IF NOT EXISTS idx_teams_email ON teams (email);
+ `);
+};
+
+export const dropTeams = async (pool: Pool) => {
+ await pool.query(`DROP TABLE IF EXISTS teams;`);
+};
diff --git a/server/src/db/migration/timescaledb/0003_create_users.ts b/server/src/db/migration/timescaledb/0003_create_users.ts
new file mode 100644
index 0000000000..6c8f57027c
--- /dev/null
+++ b/server/src/db/migration/timescaledb/0003_create_users.ts
@@ -0,0 +1,30 @@
+import type { Pool } from "pg";
+
+export const createUsers = async (pool: Pool) => {
+ await pool.query(`
+ CREATE TABLE IF NOT EXISTS users (
+ id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
+ team_id UUID REFERENCES teams(id) ON DELETE SET NULL,
+ first_name TEXT NOT NULL,
+ last_name TEXT NOT NULL,
+ email TEXT NOT NULL UNIQUE,
+ password TEXT NOT NULL,
+ avatar_image TEXT,
+ profile_image BYTEA,
+ profile_image_content_type TEXT,
+ is_active BOOLEAN NOT NULL DEFAULT TRUE,
+ is_verified BOOLEAN NOT NULL DEFAULT FALSE,
+ roles user_role[] NOT NULL DEFAULT ARRAY['user']::user_role[],
+ check_ttl INTEGER,
+ created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
+ updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
+ );
+
+ CREATE INDEX IF NOT EXISTS idx_users_team_id ON users (team_id);
+ CREATE INDEX IF NOT EXISTS idx_users_email ON users (email);
+ `);
+};
+
+export const dropUsers = async (pool: Pool) => {
+ await pool.query(`DROP TABLE IF EXISTS users;`);
+};
diff --git a/server/src/db/migration/timescaledb/0004_create_monitors.ts b/server/src/db/migration/timescaledb/0004_create_monitors.ts
new file mode 100644
index 0000000000..a4829c7f51
--- /dev/null
+++ b/server/src/db/migration/timescaledb/0004_create_monitors.ts
@@ -0,0 +1,69 @@
+import type { Pool } from "pg";
+
+export const createMonitors = async (pool: Pool) => {
+ await pool.query(`
+ CREATE TABLE IF NOT EXISTS monitors (
+ id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
+ user_id UUID NOT NULL REFERENCES users(id),
+ team_id UUID NOT NULL REFERENCES teams(id),
+ name TEXT NOT NULL,
+ description TEXT,
+ type monitor_type NOT NULL,
+ status monitor_status NOT NULL DEFAULT 'initializing',
+
+ -- HTTP / Website monitoring
+ url TEXT,
+ port INTEGER,
+ ignore_tls_errors BOOLEAN DEFAULT FALSE,
+ use_advanced_matching BOOLEAN DEFAULT FALSE,
+ json_path TEXT,
+ expected_value TEXT,
+ match_method match_method,
+ secret TEXT,
+
+ -- Scheduling
+ interval_ms INTEGER NOT NULL DEFAULT 60000,
+ is_active BOOLEAN NOT NULL DEFAULT TRUE,
+
+ -- Uptime tracking
+ status_window BOOLEAN[],
+ status_window_size INTEGER DEFAULT 5,
+ status_window_threshold INTEGER DEFAULT 60,
+ uptime_percentage DOUBLE PRECISION,
+
+ -- Infrastructure alert thresholds
+ cpu_alert_threshold INTEGER,
+ cpu_alert_counter INTEGER,
+ memory_alert_threshold INTEGER,
+ memory_alert_counter INTEGER,
+ disk_alert_threshold INTEGER,
+ disk_alert_counter INTEGER,
+ temp_alert_threshold INTEGER,
+ temp_alert_counter INTEGER,
+ selected_disks TEXT[],
+
+ -- Game monitoring
+ game_id TEXT,
+ grpc_service_name TEXT,
+
+ -- Grouping
+ monitor_group TEXT,
+
+ -- Geo checks
+ geo_check_enabled BOOLEAN DEFAULT FALSE,
+ geo_check_locations TEXT[],
+ geo_check_interval_ms INTEGER DEFAULT 300000,
+
+ created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
+ updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
+ );
+
+ CREATE INDEX IF NOT EXISTS idx_monitors_team_type ON monitors (team_id, type);
+ CREATE INDEX IF NOT EXISTS idx_monitors_user_id ON monitors (user_id);
+ CREATE INDEX IF NOT EXISTS idx_monitors_status ON monitors (status);
+ `);
+};
+
+export const dropMonitors = async (pool: Pool) => {
+ await pool.query(`DROP TABLE IF EXISTS monitors;`);
+};
diff --git a/server/src/db/migration/timescaledb/0005_create_notifications.ts b/server/src/db/migration/timescaledb/0005_create_notifications.ts
new file mode 100644
index 0000000000..2a4a065fa8
--- /dev/null
+++ b/server/src/db/migration/timescaledb/0005_create_notifications.ts
@@ -0,0 +1,30 @@
+import type { Pool } from "pg";
+
+export const createNotifications = async (pool: Pool) => {
+ await pool.query(`
+ CREATE TABLE IF NOT EXISTS notifications (
+ id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
+ user_id UUID NOT NULL REFERENCES users(id),
+ team_id UUID NOT NULL REFERENCES teams(id),
+ type notification_type NOT NULL,
+ notification_name TEXT,
+ address TEXT,
+ phone TEXT,
+
+ -- Matrix-specific fields
+ homeserver_url TEXT,
+ room_id TEXT,
+ access_token TEXT,
+
+ created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
+ updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
+ );
+
+ CREATE INDEX IF NOT EXISTS idx_notifications_team ON notifications (team_id);
+ CREATE INDEX IF NOT EXISTS idx_notifications_user ON notifications (user_id);
+ `);
+};
+
+export const dropNotifications = async (pool: Pool) => {
+ await pool.query(`DROP TABLE IF EXISTS notifications;`);
+};
diff --git a/server/src/db/migration/timescaledb/0006_create_monitor_notifications.ts b/server/src/db/migration/timescaledb/0006_create_monitor_notifications.ts
new file mode 100644
index 0000000000..d2a3063223
--- /dev/null
+++ b/server/src/db/migration/timescaledb/0006_create_monitor_notifications.ts
@@ -0,0 +1,18 @@
+import type { Pool } from "pg";
+
+export const createMonitorNotifications = async (pool: Pool) => {
+ await pool.query(`
+ CREATE TABLE IF NOT EXISTS monitor_notifications (
+ monitor_id UUID NOT NULL REFERENCES monitors(id) ON DELETE CASCADE,
+ notification_id UUID NOT NULL REFERENCES notifications(id) ON DELETE CASCADE,
+ PRIMARY KEY (monitor_id, notification_id)
+ );
+
+ CREATE INDEX IF NOT EXISTS idx_monitor_notifications_notification
+ ON monitor_notifications (notification_id);
+ `);
+};
+
+export const dropMonitorNotifications = async (pool: Pool) => {
+ await pool.query(`DROP TABLE IF EXISTS monitor_notifications;`);
+};
diff --git a/server/src/db/migration/timescaledb/0007_create_incidents.ts b/server/src/db/migration/timescaledb/0007_create_incidents.ts
new file mode 100644
index 0000000000..e1c990f957
--- /dev/null
+++ b/server/src/db/migration/timescaledb/0007_create_incidents.ts
@@ -0,0 +1,34 @@
+import type { Pool } from "pg";
+
+export const createIncidents = async (pool: Pool) => {
+ await pool.query(`
+ CREATE TABLE IF NOT EXISTS incidents (
+ id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
+ monitor_id UUID NOT NULL REFERENCES monitors(id) ON DELETE CASCADE,
+ team_id UUID NOT NULL REFERENCES teams(id) ON DELETE CASCADE,
+ start_time TIMESTAMPTZ NOT NULL,
+ end_time TIMESTAMPTZ,
+ status BOOLEAN,
+ message TEXT,
+ status_code INTEGER,
+ resolution_type incident_resolution_type,
+ resolved_by UUID REFERENCES users(id) ON DELETE SET NULL,
+ resolved_by_email TEXT,
+ comment TEXT,
+ created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
+ updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
+ );
+
+ CREATE INDEX IF NOT EXISTS idx_incidents_monitor_status ON incidents (monitor_id, status);
+ CREATE INDEX IF NOT EXISTS idx_incidents_team_status ON incidents (team_id, status);
+ CREATE INDEX IF NOT EXISTS idx_incidents_team_start ON incidents (team_id, start_time DESC);
+ CREATE INDEX IF NOT EXISTS idx_incidents_status_start ON incidents (status, start_time DESC);
+ CREATE INDEX IF NOT EXISTS idx_incidents_resolution ON incidents (resolution_type, status);
+ CREATE INDEX IF NOT EXISTS idx_incidents_resolved_by ON incidents (resolved_by, status);
+ CREATE INDEX IF NOT EXISTS idx_incidents_created ON incidents (created_at DESC);
+ `);
+};
+
+export const dropIncidents = async (pool: Pool) => {
+ await pool.query(`DROP TABLE IF EXISTS incidents;`);
+};
diff --git a/server/src/db/migration/timescaledb/0008_create_monitor_stats.ts b/server/src/db/migration/timescaledb/0008_create_monitor_stats.ts
new file mode 100644
index 0000000000..f08004873b
--- /dev/null
+++ b/server/src/db/migration/timescaledb/0008_create_monitor_stats.ts
@@ -0,0 +1,25 @@
+import type { Pool } from "pg";
+
+export const createMonitorStats = async (pool: Pool) => {
+ await pool.query(`
+ CREATE TABLE IF NOT EXISTS monitor_stats (
+ id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
+ monitor_id UUID NOT NULL UNIQUE REFERENCES monitors(id) ON DELETE CASCADE,
+ avg_response_time DOUBLE PRECISION DEFAULT 0,
+ max_response_time DOUBLE PRECISION DEFAULT 0,
+ total_checks BIGINT DEFAULT 0,
+ total_up_checks BIGINT DEFAULT 0,
+ total_down_checks BIGINT DEFAULT 0,
+ uptime_percentage DOUBLE PRECISION DEFAULT 0,
+ last_check_timestamp TIMESTAMPTZ,
+ last_response_time DOUBLE PRECISION DEFAULT 0,
+ time_of_last_failure TIMESTAMPTZ,
+ created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
+ updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
+ );
+ `);
+};
+
+export const dropMonitorStats = async (pool: Pool) => {
+ await pool.query(`DROP TABLE IF EXISTS monitor_stats;`);
+};
diff --git a/server/src/db/migration/timescaledb/0009_create_checks.ts b/server/src/db/migration/timescaledb/0009_create_checks.ts
new file mode 100644
index 0000000000..27753f524c
--- /dev/null
+++ b/server/src/db/migration/timescaledb/0009_create_checks.ts
@@ -0,0 +1,105 @@
+import type { Pool } from "pg";
+
+export const createChecks = async (pool: Pool) => {
+ await pool.query(`
+ CREATE TABLE IF NOT EXISTS checks (
+ id UUID NOT NULL DEFAULT gen_random_uuid(),
+ monitor_id UUID NOT NULL,
+ team_id UUID NOT NULL,
+ monitor_type monitor_type NOT NULL,
+ status BOOLEAN,
+ response_time INTEGER,
+ status_code INTEGER,
+ message TEXT,
+
+ -- HTTP request timings
+ timing_start DOUBLE PRECISION,
+ timing_socket DOUBLE PRECISION,
+ timing_lookup DOUBLE PRECISION,
+ timing_connect DOUBLE PRECISION,
+ timing_secure_connect DOUBLE PRECISION,
+ timing_upload DOUBLE PRECISION,
+ timing_response DOUBLE PRECISION,
+ timing_end DOUBLE PRECISION,
+ phase_wait DOUBLE PRECISION,
+ phase_dns DOUBLE PRECISION,
+ phase_tcp DOUBLE PRECISION,
+ phase_tls DOUBLE PRECISION,
+ phase_request DOUBLE PRECISION,
+ phase_first_byte DOUBLE PRECISION,
+ phase_download DOUBLE PRECISION,
+ phase_total DOUBLE PRECISION,
+
+ -- CPU metrics
+ cpu_physical_core INTEGER,
+ cpu_logical_core INTEGER,
+ cpu_frequency DOUBLE PRECISION,
+ cpu_current_frequency DOUBLE PRECISION,
+ cpu_temperature DOUBLE PRECISION[],
+ cpu_free_percent DOUBLE PRECISION,
+ cpu_usage_percent DOUBLE PRECISION,
+
+ -- Memory metrics
+ mem_total_bytes BIGINT,
+ mem_available_bytes BIGINT,
+ mem_used_bytes BIGINT,
+ mem_usage_percent DOUBLE PRECISION,
+
+ -- Host info
+ host_os TEXT,
+ host_platform TEXT,
+ host_kernel_version TEXT,
+ host_pretty_name TEXT,
+
+ -- Capture agent info
+ capture_version TEXT,
+ capture_mode TEXT,
+
+ -- Lighthouse / PageSpeed scores
+ lighthouse_performance DOUBLE PRECISION,
+ lighthouse_accessibility DOUBLE PRECISION,
+ lighthouse_best_practices DOUBLE PRECISION,
+ lighthouse_seo DOUBLE PRECISION,
+
+ -- Lighthouse audit details
+ audit_cls_score DOUBLE PRECISION,
+ audit_cls_value DOUBLE PRECISION,
+ audit_cls_display TEXT,
+ audit_si_score DOUBLE PRECISION,
+ audit_si_value DOUBLE PRECISION,
+ audit_si_display TEXT,
+ audit_fcp_score DOUBLE PRECISION,
+ audit_fcp_value DOUBLE PRECISION,
+ audit_fcp_display TEXT,
+ audit_lcp_score DOUBLE PRECISION,
+ audit_lcp_value DOUBLE PRECISION,
+ audit_lcp_display TEXT,
+ audit_tbt_score DOUBLE PRECISION,
+ audit_tbt_value DOUBLE PRECISION,
+ audit_tbt_display TEXT,
+
+ created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
+ updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
+ );
+
+ SELECT create_hypertable('checks', 'created_at',
+ chunk_time_interval => INTERVAL '7 days',
+ if_not_exists => TRUE
+ );
+
+ CREATE INDEX IF NOT EXISTS idx_checks_monitor_time
+ ON checks (monitor_id, created_at DESC);
+ CREATE INDEX IF NOT EXISTS idx_checks_team_time
+ ON checks (team_id, created_at DESC);
+ CREATE INDEX IF NOT EXISTS idx_checks_monitor_type_time
+ ON checks (monitor_id, monitor_type, created_at DESC);
+ CREATE INDEX IF NOT EXISTS idx_checks_team_status_time
+ ON checks (team_id, status, created_at DESC);
+ CREATE INDEX IF NOT EXISTS idx_checks_status_code
+ ON checks (status_code, created_at DESC);
+ `);
+};
+
+export const dropChecks = async (pool: Pool) => {
+ await pool.query(`DROP TABLE IF EXISTS checks;`);
+};
diff --git a/server/src/db/migration/timescaledb/0010_create_check_disks.ts b/server/src/db/migration/timescaledb/0010_create_check_disks.ts
new file mode 100644
index 0000000000..e77784d39c
--- /dev/null
+++ b/server/src/db/migration/timescaledb/0010_create_check_disks.ts
@@ -0,0 +1,37 @@
+import type { Pool } from "pg";
+
+export const createCheckDisks = async (pool: Pool) => {
+ await pool.query(`
+ CREATE TABLE IF NOT EXISTS check_disks (
+ id UUID NOT NULL DEFAULT gen_random_uuid(),
+ check_id UUID NOT NULL,
+ check_created_at TIMESTAMPTZ NOT NULL,
+ device TEXT,
+ mountpoint TEXT,
+ total_bytes BIGINT,
+ free_bytes BIGINT,
+ used_bytes BIGINT,
+ usage_percent DOUBLE PRECISION,
+ total_inodes BIGINT,
+ free_inodes BIGINT,
+ used_inodes BIGINT,
+ inodes_usage_percent DOUBLE PRECISION,
+ read_bytes BIGINT,
+ write_bytes BIGINT,
+ read_time BIGINT,
+ write_time BIGINT
+ );
+
+ SELECT create_hypertable('check_disks', 'check_created_at',
+ chunk_time_interval => INTERVAL '7 days',
+ if_not_exists => TRUE
+ );
+
+ CREATE INDEX IF NOT EXISTS idx_check_disks_check
+ ON check_disks (check_id, check_created_at);
+ `);
+};
+
+export const dropCheckDisks = async (pool: Pool) => {
+ await pool.query(`DROP TABLE IF EXISTS check_disks;`);
+};
diff --git a/server/src/db/migration/timescaledb/0011_create_check_network_interfaces.ts b/server/src/db/migration/timescaledb/0011_create_check_network_interfaces.ts
new file mode 100644
index 0000000000..4988fe58e4
--- /dev/null
+++ b/server/src/db/migration/timescaledb/0011_create_check_network_interfaces.ts
@@ -0,0 +1,34 @@
+import type { Pool } from "pg";
+
+export const createCheckNetworkInterfaces = async (pool: Pool) => {
+ await pool.query(`
+ CREATE TABLE IF NOT EXISTS check_network_interfaces (
+ id UUID NOT NULL DEFAULT gen_random_uuid(),
+ check_id UUID NOT NULL,
+ check_created_at TIMESTAMPTZ NOT NULL,
+ name TEXT,
+ bytes_sent BIGINT,
+ bytes_recv BIGINT,
+ packets_sent BIGINT,
+ packets_recv BIGINT,
+ err_in BIGINT,
+ err_out BIGINT,
+ drop_in BIGINT,
+ drop_out BIGINT,
+ fifo_in BIGINT,
+ fifo_out BIGINT
+ );
+
+ SELECT create_hypertable('check_network_interfaces', 'check_created_at',
+ chunk_time_interval => INTERVAL '7 days',
+ if_not_exists => TRUE
+ );
+
+ CREATE INDEX IF NOT EXISTS idx_check_net_check
+ ON check_network_interfaces (check_id, check_created_at);
+ `);
+};
+
+export const dropCheckNetworkInterfaces = async (pool: Pool) => {
+ await pool.query(`DROP TABLE IF EXISTS check_network_interfaces;`);
+};
diff --git a/server/src/db/migration/timescaledb/0012_create_check_errors.ts b/server/src/db/migration/timescaledb/0012_create_check_errors.ts
new file mode 100644
index 0000000000..c84bacac8d
--- /dev/null
+++ b/server/src/db/migration/timescaledb/0012_create_check_errors.ts
@@ -0,0 +1,25 @@
+import type { Pool } from "pg";
+
+export const createCheckErrors = async (pool: Pool) => {
+ await pool.query(`
+ CREATE TABLE IF NOT EXISTS check_errors (
+ id UUID NOT NULL DEFAULT gen_random_uuid(),
+ check_id UUID NOT NULL,
+ check_created_at TIMESTAMPTZ NOT NULL,
+ metrics TEXT[],
+ error TEXT
+ );
+
+ SELECT create_hypertable('check_errors', 'check_created_at',
+ chunk_time_interval => INTERVAL '7 days',
+ if_not_exists => TRUE
+ );
+
+ CREATE INDEX IF NOT EXISTS idx_check_errors_check
+ ON check_errors (check_id, check_created_at);
+ `);
+};
+
+export const dropCheckErrors = async (pool: Pool) => {
+ await pool.query(`DROP TABLE IF EXISTS check_errors;`);
+};
diff --git a/server/src/db/migration/timescaledb/0013_create_geo_checks.ts b/server/src/db/migration/timescaledb/0013_create_geo_checks.ts
new file mode 100644
index 0000000000..a6ee03061a
--- /dev/null
+++ b/server/src/db/migration/timescaledb/0013_create_geo_checks.ts
@@ -0,0 +1,29 @@
+import type { Pool } from "pg";
+
+export const createGeoChecks = async (pool: Pool) => {
+ await pool.query(`
+ CREATE TABLE IF NOT EXISTS geo_checks (
+ id UUID NOT NULL DEFAULT gen_random_uuid(),
+ monitor_id UUID NOT NULL,
+ team_id UUID NOT NULL,
+ monitor_type monitor_type NOT NULL,
+ expiry TIMESTAMPTZ,
+ created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
+ updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
+ );
+
+ SELECT create_hypertable('geo_checks', 'created_at',
+ chunk_time_interval => INTERVAL '7 days',
+ if_not_exists => TRUE
+ );
+
+ CREATE INDEX IF NOT EXISTS idx_geo_checks_monitor_time
+ ON geo_checks (monitor_id, created_at DESC);
+ CREATE INDEX IF NOT EXISTS idx_geo_checks_team_time
+ ON geo_checks (team_id, created_at DESC);
+ `);
+};
+
+export const dropGeoChecks = async (pool: Pool) => {
+ await pool.query(`DROP TABLE IF EXISTS geo_checks;`);
+};
diff --git a/server/src/db/migration/timescaledb/0014_create_geo_check_results.ts b/server/src/db/migration/timescaledb/0014_create_geo_check_results.ts
new file mode 100644
index 0000000000..4e0e45e1a2
--- /dev/null
+++ b/server/src/db/migration/timescaledb/0014_create_geo_check_results.ts
@@ -0,0 +1,46 @@
+import type { Pool } from "pg";
+
+export const createGeoCheckResults = async (pool: Pool) => {
+ await pool.query(`
+ CREATE TABLE IF NOT EXISTS geo_check_results (
+ id UUID NOT NULL DEFAULT gen_random_uuid(),
+ geo_check_id UUID NOT NULL,
+ geo_check_created_at TIMESTAMPTZ NOT NULL,
+
+ -- Status
+ status BOOLEAN,
+ status_code INTEGER,
+
+ -- Location
+ location_continent TEXT,
+ location_region TEXT,
+ location_country TEXT,
+ location_state TEXT,
+ location_city TEXT,
+ location_longitude DOUBLE PRECISION,
+ location_latitude DOUBLE PRECISION,
+
+ -- Timings
+ timing_total DOUBLE PRECISION,
+ timing_dns DOUBLE PRECISION,
+ timing_tcp DOUBLE PRECISION,
+ timing_tls DOUBLE PRECISION,
+ timing_first_byte DOUBLE PRECISION,
+ timing_download DOUBLE PRECISION
+ );
+
+ SELECT create_hypertable('geo_check_results', 'geo_check_created_at',
+ chunk_time_interval => INTERVAL '7 days',
+ if_not_exists => TRUE
+ );
+
+ CREATE INDEX IF NOT EXISTS idx_geo_results_check
+ ON geo_check_results (geo_check_id, geo_check_created_at);
+ CREATE INDEX IF NOT EXISTS idx_geo_results_country
+ ON geo_check_results (location_country, geo_check_created_at DESC);
+ `);
+};
+
+export const dropGeoCheckResults = async (pool: Pool) => {
+ await pool.query(`DROP TABLE IF EXISTS geo_check_results;`);
+};
diff --git a/server/src/db/migration/timescaledb/0015_create_invites.ts b/server/src/db/migration/timescaledb/0015_create_invites.ts
new file mode 100644
index 0000000000..80aca5255e
--- /dev/null
+++ b/server/src/db/migration/timescaledb/0015_create_invites.ts
@@ -0,0 +1,22 @@
+import type { Pool } from "pg";
+
+export const createInvites = async (pool: Pool) => {
+ await pool.query(`
+ CREATE TABLE IF NOT EXISTS invites (
+ id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
+ email TEXT NOT NULL UNIQUE,
+ team_id UUID NOT NULL REFERENCES teams(id) ON DELETE CASCADE,
+ roles user_role[] NOT NULL DEFAULT ARRAY['user']::user_role[],
+ token TEXT NOT NULL,
+ expiry TIMESTAMPTZ,
+ created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
+ updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
+ );
+
+ CREATE INDEX IF NOT EXISTS idx_invites_expiry ON invites (expiry);
+ `);
+};
+
+export const dropInvites = async (pool: Pool) => {
+ await pool.query(`DROP TABLE IF EXISTS invites;`);
+};
diff --git a/server/src/db/migration/timescaledb/0016_create_recovery_tokens.ts b/server/src/db/migration/timescaledb/0016_create_recovery_tokens.ts
new file mode 100644
index 0000000000..36a9d0de33
--- /dev/null
+++ b/server/src/db/migration/timescaledb/0016_create_recovery_tokens.ts
@@ -0,0 +1,20 @@
+import type { Pool } from "pg";
+
+export const createRecoveryTokens = async (pool: Pool) => {
+ await pool.query(`
+ CREATE TABLE IF NOT EXISTS recovery_tokens (
+ id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
+ email TEXT NOT NULL UNIQUE,
+ token TEXT NOT NULL,
+ expiry TIMESTAMPTZ,
+ created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
+ updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
+ );
+
+ CREATE INDEX IF NOT EXISTS idx_recovery_expiry ON recovery_tokens (expiry);
+ `);
+};
+
+export const dropRecoveryTokens = async (pool: Pool) => {
+ await pool.query(`DROP TABLE IF EXISTS recovery_tokens;`);
+};
diff --git a/server/src/db/migration/timescaledb/0017_create_maintenance_windows.ts b/server/src/db/migration/timescaledb/0017_create_maintenance_windows.ts
new file mode 100644
index 0000000000..1907692615
--- /dev/null
+++ b/server/src/db/migration/timescaledb/0017_create_maintenance_windows.ts
@@ -0,0 +1,29 @@
+import type { Pool } from "pg";
+
+export const createMaintenanceWindows = async (pool: Pool) => {
+ await pool.query(`
+ CREATE TABLE IF NOT EXISTS maintenance_windows (
+ id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
+ monitor_id UUID NOT NULL REFERENCES monitors(id) ON DELETE CASCADE,
+ team_id UUID NOT NULL REFERENCES teams(id) ON DELETE CASCADE,
+ active BOOLEAN NOT NULL DEFAULT TRUE,
+ name TEXT,
+ duration INTEGER,
+ duration_unit duration_unit,
+ repeat INTEGER,
+ start_time TIMESTAMPTZ,
+ end_time TIMESTAMPTZ,
+ expiry TIMESTAMPTZ,
+ created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
+ updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
+ );
+
+ CREATE INDEX IF NOT EXISTS idx_maint_monitor ON maintenance_windows (monitor_id);
+ CREATE INDEX IF NOT EXISTS idx_maint_team ON maintenance_windows (team_id);
+ CREATE INDEX IF NOT EXISTS idx_maint_expiry ON maintenance_windows (expiry);
+ `);
+};
+
+export const dropMaintenanceWindows = async (pool: Pool) => {
+ await pool.query(`DROP TABLE IF EXISTS maintenance_windows;`);
+};
diff --git a/server/src/db/migration/timescaledb/0018_create_status_pages.ts b/server/src/db/migration/timescaledb/0018_create_status_pages.ts
new file mode 100644
index 0000000000..6037f6852a
--- /dev/null
+++ b/server/src/db/migration/timescaledb/0018_create_status_pages.ts
@@ -0,0 +1,51 @@
+import type { Pool } from "pg";
+
+export const createStatusPages = async (pool: Pool) => {
+ await pool.query(`
+ CREATE TABLE IF NOT EXISTS status_pages (
+ id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
+ user_id UUID NOT NULL REFERENCES users(id),
+ team_id UUID NOT NULL REFERENCES teams(id),
+ types status_page_type[] NOT NULL DEFAULT ARRAY['uptime']::status_page_type[],
+ company_name TEXT,
+ url TEXT NOT NULL UNIQUE,
+ timezone TEXT,
+ color TEXT DEFAULT '#4169E1',
+ logo_data BYTEA,
+ logo_content_type TEXT,
+ is_published BOOLEAN DEFAULT FALSE,
+ show_charts BOOLEAN DEFAULT FALSE,
+ show_uptime_percentage BOOLEAN DEFAULT FALSE,
+ show_admin_login_link BOOLEAN DEFAULT FALSE,
+ show_infrastructure BOOLEAN DEFAULT FALSE,
+ custom_css TEXT,
+ created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
+ updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
+ );
+
+ CREATE INDEX IF NOT EXISTS idx_status_pages_team ON status_pages (team_id);
+ CREATE INDEX IF NOT EXISTS idx_status_pages_url ON status_pages (url);
+
+ CREATE TABLE IF NOT EXISTS status_page_monitors (
+ status_page_id UUID NOT NULL REFERENCES status_pages(id) ON DELETE CASCADE,
+ monitor_id UUID NOT NULL REFERENCES monitors(id) ON DELETE CASCADE,
+ sort_order INTEGER DEFAULT 0,
+ PRIMARY KEY (status_page_id, monitor_id)
+ );
+
+ CREATE TABLE IF NOT EXISTS status_page_sub_monitors (
+ status_page_id UUID NOT NULL REFERENCES status_pages(id) ON DELETE CASCADE,
+ monitor_id UUID NOT NULL REFERENCES monitors(id) ON DELETE CASCADE,
+ sort_order INTEGER DEFAULT 0,
+ PRIMARY KEY (status_page_id, monitor_id)
+ );
+ `);
+};
+
+export const dropStatusPages = async (pool: Pool) => {
+ await pool.query(`
+ DROP TABLE IF EXISTS status_page_sub_monitors;
+ DROP TABLE IF EXISTS status_page_monitors;
+ DROP TABLE IF EXISTS status_pages;
+ `);
+};
diff --git a/server/src/db/migration/timescaledb/0019_create_app_settings.ts b/server/src/db/migration/timescaledb/0019_create_app_settings.ts
new file mode 100644
index 0000000000..d2d624d073
--- /dev/null
+++ b/server/src/db/migration/timescaledb/0019_create_app_settings.ts
@@ -0,0 +1,62 @@
+import type { Pool } from "pg";
+
+export const createAppSettings = async (pool: Pool) => {
+ await pool.query(`
+ CREATE TABLE IF NOT EXISTS app_settings (
+ id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
+ check_ttl INTEGER DEFAULT 30,
+ language TEXT,
+ jwt_secret TEXT,
+ pagespeed_api_key TEXT,
+
+ -- SMTP / Email settings
+ system_email_host TEXT,
+ system_email_port INTEGER,
+ system_email_address TEXT,
+ system_email_password TEXT,
+ system_email_user TEXT,
+ system_email_connection_host TEXT,
+ system_email_tls_servername TEXT,
+ system_email_secure BOOLEAN,
+ system_email_pool BOOLEAN,
+ system_email_ignore_tls BOOLEAN,
+ system_email_require_tls BOOLEAN,
+ system_email_reject_unauthorized BOOLEAN,
+
+ show_url BOOLEAN,
+ version TEXT,
+
+ -- Global infrastructure thresholds
+ threshold_cpu_usage INTEGER,
+ threshold_memory_usage INTEGER,
+ threshold_disk_usage INTEGER,
+ threshold_temperature INTEGER,
+
+ created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
+ updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
+ );
+
+ -- Enforce singleton: only one row allowed
+ CREATE OR REPLACE FUNCTION enforce_singleton_app_settings()
+ RETURNS TRIGGER AS $$
+ BEGIN
+ IF (SELECT COUNT(*) FROM app_settings) >= 1 THEN
+ RAISE EXCEPTION 'app_settings allows only one row';
+ END IF;
+ RETURN NEW;
+ END;
+ $$ LANGUAGE plpgsql;
+
+ DROP TRIGGER IF EXISTS trg_singleton_app_settings ON app_settings;
+ CREATE TRIGGER trg_singleton_app_settings
+ BEFORE INSERT ON app_settings
+ FOR EACH ROW EXECUTE FUNCTION enforce_singleton_app_settings();
+ `);
+};
+
+export const dropAppSettings = async (pool: Pool) => {
+ await pool.query(`
+ DROP TABLE IF EXISTS app_settings;
+ DROP FUNCTION IF EXISTS enforce_singleton_app_settings();
+ `);
+};
diff --git a/server/src/db/migration/timescaledb/0020_create_continuous_aggregates.ts b/server/src/db/migration/timescaledb/0020_create_continuous_aggregates.ts
new file mode 100644
index 0000000000..d435ffdf96
--- /dev/null
+++ b/server/src/db/migration/timescaledb/0020_create_continuous_aggregates.ts
@@ -0,0 +1,127 @@
+import type { Pool } from "pg";
+
+export const createContinuousAggregates = async (pool: Pool) => {
+ // Uptime & Response Time (Hourly)
+ await pool.query(`
+ CREATE MATERIALIZED VIEW IF NOT EXISTS checks_hourly
+ WITH (timescaledb.continuous) AS
+ SELECT
+ monitor_id,
+ time_bucket('1 hour', created_at) AS bucket,
+ COUNT(*) AS total_checks,
+ COUNT(*) FILTER (WHERE status = TRUE) AS up_checks,
+ COUNT(*) FILTER (WHERE status = FALSE) AS down_checks,
+ AVG(response_time) AS avg_response_time,
+ AVG(response_time) FILTER (WHERE status = TRUE) AS avg_up_response_time,
+ AVG(response_time) FILTER (WHERE status = FALSE) AS avg_down_response_time,
+ MAX(response_time) AS max_response_time,
+ MIN(response_time) AS min_response_time
+ FROM checks
+ GROUP BY monitor_id, bucket
+ WITH NO DATA;
+ `);
+ await pool.query(`ALTER MATERIALIZED VIEW checks_hourly SET (timescaledb.materialized_only = false);`);
+ await pool.query(`
+ SELECT add_continuous_aggregate_policy('checks_hourly',
+ start_offset => INTERVAL '3 hours',
+ end_offset => INTERVAL '1 hour',
+ schedule_interval => INTERVAL '1 hour',
+ if_not_exists => TRUE
+ );
+ `);
+ await pool.query(`CALL refresh_continuous_aggregate('checks_hourly', NULL, NULL);`);
+
+ // Uptime & Response Time (Daily)
+ await pool.query(`
+ CREATE MATERIALIZED VIEW IF NOT EXISTS checks_daily
+ WITH (timescaledb.continuous) AS
+ SELECT
+ monitor_id,
+ time_bucket('1 day', created_at) AS bucket,
+ COUNT(*) AS total_checks,
+ COUNT(*) FILTER (WHERE status = TRUE) AS up_checks,
+ COUNT(*) FILTER (WHERE status = FALSE) AS down_checks,
+ AVG(response_time) AS avg_response_time,
+ AVG(response_time) FILTER (WHERE status = TRUE) AS avg_up_response_time,
+ AVG(response_time) FILTER (WHERE status = FALSE) AS avg_down_response_time,
+ MAX(response_time) AS max_response_time
+ FROM checks
+ GROUP BY monitor_id, bucket
+ WITH NO DATA;
+ `);
+ await pool.query(`ALTER MATERIALIZED VIEW checks_daily SET (timescaledb.materialized_only = false);`);
+ await pool.query(`
+ SELECT add_continuous_aggregate_policy('checks_daily',
+ start_offset => INTERVAL '3 days',
+ end_offset => INTERVAL '1 day',
+ schedule_interval => INTERVAL '1 day',
+ if_not_exists => TRUE
+ );
+ `);
+ await pool.query(`CALL refresh_continuous_aggregate('checks_daily', NULL, NULL);`);
+
+ // Infrastructure Metrics (Hourly)
+ await pool.query(`
+ CREATE MATERIALIZED VIEW IF NOT EXISTS hardware_hourly
+ WITH (timescaledb.continuous) AS
+ SELECT
+ monitor_id,
+ time_bucket('1 hour', created_at) AS bucket,
+ AVG(cpu_usage_percent) AS avg_cpu,
+ MAX(cpu_usage_percent) AS max_cpu,
+ AVG(mem_usage_percent) AS avg_memory,
+ MAX(mem_usage_percent) AS max_memory,
+ COUNT(*) AS sample_count
+ FROM checks
+ WHERE monitor_type = 'hardware'
+ GROUP BY monitor_id, bucket
+ WITH NO DATA;
+ `);
+ await pool.query(`ALTER MATERIALIZED VIEW hardware_hourly SET (timescaledb.materialized_only = false);`);
+ await pool.query(`
+ SELECT add_continuous_aggregate_policy('hardware_hourly',
+ start_offset => INTERVAL '3 hours',
+ end_offset => INTERVAL '1 hour',
+ schedule_interval => INTERVAL '1 hour',
+ if_not_exists => TRUE
+ );
+ `);
+ await pool.query(`CALL refresh_continuous_aggregate('hardware_hourly', NULL, NULL);`);
+
+ // PageSpeed Scores (Daily)
+ await pool.query(`
+ CREATE MATERIALIZED VIEW IF NOT EXISTS pagespeed_daily
+ WITH (timescaledb.continuous) AS
+ SELECT
+ monitor_id,
+ time_bucket('1 day', created_at) AS bucket,
+ AVG(lighthouse_performance) AS avg_performance,
+ AVG(lighthouse_accessibility) AS avg_accessibility,
+ AVG(lighthouse_best_practices) AS avg_best_practices,
+ AVG(lighthouse_seo) AS avg_seo,
+ COUNT(*) AS sample_count
+ FROM checks
+ WHERE monitor_type = 'pagespeed'
+ GROUP BY monitor_id, bucket
+ WITH NO DATA;
+ `);
+ await pool.query(`ALTER MATERIALIZED VIEW pagespeed_daily SET (timescaledb.materialized_only = false);`);
+ await pool.query(`
+ SELECT add_continuous_aggregate_policy('pagespeed_daily',
+ start_offset => INTERVAL '3 days',
+ end_offset => INTERVAL '1 day',
+ schedule_interval => INTERVAL '1 day',
+ if_not_exists => TRUE
+ );
+ `);
+ await pool.query(`CALL refresh_continuous_aggregate('pagespeed_daily', NULL, NULL);`);
+};
+
+export const dropContinuousAggregates = async (pool: Pool) => {
+ await pool.query(`
+ DROP MATERIALIZED VIEW IF EXISTS pagespeed_daily CASCADE;
+ DROP MATERIALIZED VIEW IF EXISTS hardware_hourly CASCADE;
+ DROP MATERIALIZED VIEW IF EXISTS checks_daily CASCADE;
+ DROP MATERIALIZED VIEW IF EXISTS checks_hourly CASCADE;
+ `);
+};
diff --git a/server/src/db/migration/timescaledb/0021_create_retention_compression.ts b/server/src/db/migration/timescaledb/0021_create_retention_compression.ts
new file mode 100644
index 0000000000..95230e2485
--- /dev/null
+++ b/server/src/db/migration/timescaledb/0021_create_retention_compression.ts
@@ -0,0 +1,135 @@
+import type { Pool } from "pg";
+
+export const createRetentionCompression = async (pool: Pool) => {
+ // -- Compression policies --
+
+ // Checks
+ await pool.query(`
+ ALTER TABLE checks SET (
+ timescaledb.compress,
+ timescaledb.compress_segmentby = 'monitor_id',
+ timescaledb.compress_orderby = 'created_at DESC'
+ );
+ SELECT add_compression_policy('checks', INTERVAL '2 days', if_not_exists => TRUE);
+ `);
+
+ // Check child tables
+ await pool.query(`
+ ALTER TABLE check_disks SET (
+ timescaledb.compress,
+ timescaledb.compress_segmentby = 'check_id',
+ timescaledb.compress_orderby = 'check_created_at DESC'
+ );
+ SELECT add_compression_policy('check_disks', INTERVAL '2 days', if_not_exists => TRUE);
+ `);
+
+ await pool.query(`
+ ALTER TABLE check_network_interfaces SET (
+ timescaledb.compress,
+ timescaledb.compress_segmentby = 'check_id',
+ timescaledb.compress_orderby = 'check_created_at DESC'
+ );
+ SELECT add_compression_policy('check_network_interfaces', INTERVAL '2 days', if_not_exists => TRUE);
+ `);
+
+ await pool.query(`
+ ALTER TABLE check_errors SET (
+ timescaledb.compress,
+ timescaledb.compress_segmentby = 'check_id',
+ timescaledb.compress_orderby = 'check_created_at DESC'
+ );
+ SELECT add_compression_policy('check_errors', INTERVAL '2 days', if_not_exists => TRUE);
+ `);
+
+ // Geo checks
+ await pool.query(`
+ ALTER TABLE geo_checks SET (
+ timescaledb.compress,
+ timescaledb.compress_segmentby = 'monitor_id',
+ timescaledb.compress_orderby = 'created_at DESC'
+ );
+ SELECT add_compression_policy('geo_checks', INTERVAL '2 days', if_not_exists => TRUE);
+ `);
+
+ await pool.query(`
+ ALTER TABLE geo_check_results SET (
+ timescaledb.compress,
+ timescaledb.compress_segmentby = 'geo_check_id',
+ timescaledb.compress_orderby = 'geo_check_created_at DESC'
+ );
+ SELECT add_compression_policy('geo_check_results', INTERVAL '2 days', if_not_exists => TRUE);
+ `);
+
+ // -- Retention policies (default 30 days) --
+
+ await pool.query(`
+ SELECT add_retention_policy('checks', INTERVAL '30 days', if_not_exists => TRUE);
+ SELECT add_retention_policy('check_disks', INTERVAL '30 days', if_not_exists => TRUE);
+ SELECT add_retention_policy('check_network_interfaces', INTERVAL '30 days', if_not_exists => TRUE);
+ SELECT add_retention_policy('check_errors', INTERVAL '30 days', if_not_exists => TRUE);
+ SELECT add_retention_policy('geo_checks', INTERVAL '30 days', if_not_exists => TRUE);
+ SELECT add_retention_policy('geo_check_results', INTERVAL '30 days', if_not_exists => TRUE);
+ `);
+
+ // -- Dynamic retention helper function --
+
+ await pool.query(`
+ CREATE OR REPLACE FUNCTION update_check_retention(new_ttl_days INTEGER)
+ RETURNS VOID AS $$
+ DECLARE
+ ttl_interval INTERVAL;
+ BEGIN
+ ttl_interval := (new_ttl_days || ' days')::INTERVAL;
+
+ PERFORM remove_retention_policy('checks', if_exists => true);
+ PERFORM remove_retention_policy('check_disks', if_exists => true);
+ PERFORM remove_retention_policy('check_network_interfaces', if_exists => true);
+ PERFORM remove_retention_policy('check_errors', if_exists => true);
+ PERFORM remove_retention_policy('geo_checks', if_exists => true);
+ PERFORM remove_retention_policy('geo_check_results', if_exists => true);
+
+ PERFORM add_retention_policy('checks', ttl_interval);
+ PERFORM add_retention_policy('check_disks', ttl_interval);
+ PERFORM add_retention_policy('check_network_interfaces', ttl_interval);
+ PERFORM add_retention_policy('check_errors', ttl_interval);
+ PERFORM add_retention_policy('geo_checks', ttl_interval);
+ PERFORM add_retention_policy('geo_check_results', ttl_interval);
+ END;
+ $$ LANGUAGE plpgsql;
+ `);
+};
+
+export const dropRetentionCompression = async (pool: Pool) => {
+ // Remove retention policies
+ await pool.query(`
+ SELECT remove_retention_policy('checks', if_exists => true);
+ SELECT remove_retention_policy('check_disks', if_exists => true);
+ SELECT remove_retention_policy('check_network_interfaces', if_exists => true);
+ SELECT remove_retention_policy('check_errors', if_exists => true);
+ SELECT remove_retention_policy('geo_checks', if_exists => true);
+ SELECT remove_retention_policy('geo_check_results', if_exists => true);
+ `);
+
+ // Remove compression policies
+ await pool.query(`
+ SELECT remove_compression_policy('checks', if_exists => true);
+ SELECT remove_compression_policy('check_disks', if_exists => true);
+ SELECT remove_compression_policy('check_network_interfaces', if_exists => true);
+ SELECT remove_compression_policy('check_errors', if_exists => true);
+ SELECT remove_compression_policy('geo_checks', if_exists => true);
+ SELECT remove_compression_policy('geo_check_results', if_exists => true);
+ `);
+
+ // Disable compression on tables
+ await pool.query(`
+ ALTER TABLE checks SET (timescaledb.compress = false);
+ ALTER TABLE check_disks SET (timescaledb.compress = false);
+ ALTER TABLE check_network_interfaces SET (timescaledb.compress = false);
+ ALTER TABLE check_errors SET (timescaledb.compress = false);
+ ALTER TABLE geo_checks SET (timescaledb.compress = false);
+ ALTER TABLE geo_check_results SET (timescaledb.compress = false);
+ `);
+
+ // Drop dynamic retention function
+ await pool.query(`DROP FUNCTION IF EXISTS update_check_retention(INTEGER);`);
+};
diff --git a/server/src/db/migration/timescaledb/index.ts b/server/src/db/migration/timescaledb/index.ts
new file mode 100644
index 0000000000..14084ebf3d
--- /dev/null
+++ b/server/src/db/migration/timescaledb/index.ts
@@ -0,0 +1,148 @@
+import type { Pool } from "pg";
+import type { ILogger } from "@/utils/logger.js";
+import { createEnums, dropEnums } from "./0001_create_enums.js";
+import { createTeams, dropTeams } from "./0002_create_teams.js";
+import { createUsers, dropUsers } from "./0003_create_users.js";
+import { createMonitors, dropMonitors } from "./0004_create_monitors.js";
+import { createNotifications, dropNotifications } from "./0005_create_notifications.js";
+import { createMonitorNotifications, dropMonitorNotifications } from "./0006_create_monitor_notifications.js";
+import { createIncidents, dropIncidents } from "./0007_create_incidents.js";
+import { createMonitorStats, dropMonitorStats } from "./0008_create_monitor_stats.js";
+import { createChecks, dropChecks } from "./0009_create_checks.js";
+import { createCheckDisks, dropCheckDisks } from "./0010_create_check_disks.js";
+import { createCheckNetworkInterfaces, dropCheckNetworkInterfaces } from "./0011_create_check_network_interfaces.js";
+import { createCheckErrors, dropCheckErrors } from "./0012_create_check_errors.js";
+import { createGeoChecks, dropGeoChecks } from "./0013_create_geo_checks.js";
+import { createGeoCheckResults, dropGeoCheckResults } from "./0014_create_geo_check_results.js";
+import { createInvites, dropInvites } from "./0015_create_invites.js";
+import { createRecoveryTokens, dropRecoveryTokens } from "./0016_create_recovery_tokens.js";
+import { createMaintenanceWindows, dropMaintenanceWindows } from "./0017_create_maintenance_windows.js";
+import { createStatusPages, dropStatusPages } from "./0018_create_status_pages.js";
+import { createAppSettings, dropAppSettings } from "./0019_create_app_settings.js";
+import { createContinuousAggregates, dropContinuousAggregates } from "./0020_create_continuous_aggregates.js";
+import { createRetentionCompression, dropRetentionCompression } from "./0021_create_retention_compression.js";
+
+const SERVICE_NAME = "TimescaleDB Migrations";
+
+type MigrationEntry = {
+ name: string;
+ up: (pool: Pool) => Promise;
+ down: (pool: Pool) => Promise;
+};
+
+const migrations: MigrationEntry[] = [
+ { name: "0001_create_enums", up: createEnums, down: dropEnums },
+ { name: "0002_create_teams", up: createTeams, down: dropTeams },
+ { name: "0003_create_users", up: createUsers, down: dropUsers },
+ { name: "0004_create_monitors", up: createMonitors, down: dropMonitors },
+ { name: "0005_create_notifications", up: createNotifications, down: dropNotifications },
+ { name: "0006_create_monitor_notifications", up: createMonitorNotifications, down: dropMonitorNotifications },
+ { name: "0007_create_incidents", up: createIncidents, down: dropIncidents },
+ { name: "0008_create_monitor_stats", up: createMonitorStats, down: dropMonitorStats },
+ { name: "0009_create_checks", up: createChecks, down: dropChecks },
+ { name: "0010_create_check_disks", up: createCheckDisks, down: dropCheckDisks },
+ { name: "0011_create_check_network_interfaces", up: createCheckNetworkInterfaces, down: dropCheckNetworkInterfaces },
+ { name: "0012_create_check_errors", up: createCheckErrors, down: dropCheckErrors },
+ { name: "0013_create_geo_checks", up: createGeoChecks, down: dropGeoChecks },
+ { name: "0014_create_geo_check_results", up: createGeoCheckResults, down: dropGeoCheckResults },
+ { name: "0015_create_invites", up: createInvites, down: dropInvites },
+ { name: "0016_create_recovery_tokens", up: createRecoveryTokens, down: dropRecoveryTokens },
+ { name: "0017_create_maintenance_windows", up: createMaintenanceWindows, down: dropMaintenanceWindows },
+ { name: "0018_create_status_pages", up: createStatusPages, down: dropStatusPages },
+ { name: "0019_create_app_settings", up: createAppSettings, down: dropAppSettings },
+ { name: "0020_create_continuous_aggregates", up: createContinuousAggregates, down: dropContinuousAggregates },
+ { name: "0021_create_retention_compression", up: createRetentionCompression, down: dropRetentionCompression },
+];
+
+const ensureMigrationsTable = async (pool: Pool) => {
+ await pool.query(`
+ DO $$ BEGIN
+ CREATE TYPE migration_status AS ENUM ('completed', 'failed');
+ EXCEPTION
+ WHEN duplicate_object THEN NULL;
+ END $$;
+ `);
+ await pool.query(`
+ CREATE TABLE IF NOT EXISTS migrations (
+ id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
+ name TEXT NOT NULL UNIQUE,
+ status migration_status NOT NULL,
+ completed_at TIMESTAMPTZ,
+ error TEXT,
+ created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
+ updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
+ );
+ `);
+};
+
+const runTimescaleDBMigrations = async (pool: Pool, logger?: ILogger) => {
+ try {
+ logger?.info({ message: "Running migrations", service: SERVICE_NAME });
+
+ await ensureMigrationsTable(pool);
+
+ for (const migration of migrations) {
+ const result = await pool.query("SELECT 1 FROM migrations WHERE name = $1 AND status = 'completed'", [migration.name]);
+ if (result.rowCount !== null && result.rowCount > 0) {
+ logger?.info({ message: `Skipping ${migration.name}`, service: SERVICE_NAME });
+ continue;
+ }
+
+ try {
+ await migration.up(pool);
+ await pool.query(
+ `INSERT INTO migrations (name, status, completed_at)
+ VALUES ($1, 'completed', NOW())
+ ON CONFLICT (name) DO UPDATE SET status = 'completed', completed_at = NOW(), error = NULL, updated_at = NOW()`,
+ [migration.name]
+ );
+ logger?.info({ message: `Completed ${migration.name}`, service: SERVICE_NAME });
+ } catch (error) {
+ const err = error as Error;
+ await pool.query(
+ `INSERT INTO migrations (name, status, error)
+ VALUES ($1, 'failed', $2)
+ ON CONFLICT (name) DO UPDATE SET status = 'failed', error = $2, updated_at = NOW()`,
+ [migration.name, err?.message]
+ );
+ throw error;
+ }
+ }
+
+ logger?.info({ message: "Migrations completed", service: SERVICE_NAME });
+ } catch (error) {
+ const err = error as Error;
+ logger?.error({ message: "Migration failed", service: SERVICE_NAME, details: { error: err?.message }, stack: err?.stack });
+ throw error;
+ }
+};
+
+const rollbackTimescaleDBMigration = async (pool: Pool, logger?: ILogger) => {
+ try {
+ await ensureMigrationsTable(pool);
+
+ // Find the last completed migration
+ const result = await pool.query("SELECT name FROM migrations WHERE status = 'completed' ORDER BY completed_at DESC LIMIT 1");
+ if (result.rowCount === 0) {
+ logger?.info({ message: "No migrations to roll back", service: SERVICE_NAME });
+ return;
+ }
+
+ const lastMigrationName = result.rows[0].name;
+ const migration = migrations.find((m) => m.name === lastMigrationName);
+ if (!migration) {
+ throw new Error(`Migration "${lastMigrationName}" not found in migration list`);
+ }
+
+ logger?.info({ message: `Rolling back ${migration.name}`, service: SERVICE_NAME });
+ await migration.down(pool);
+ await pool.query("DELETE FROM migrations WHERE name = $1", [migration.name]);
+ logger?.info({ message: `Rolled back ${migration.name}`, service: SERVICE_NAME });
+ } catch (error) {
+ const err = error as Error;
+ logger?.error({ message: "Rollback failed", service: SERVICE_NAME, details: { error: err?.message }, stack: err?.stack });
+ throw error;
+ }
+};
+
+export { runTimescaleDBMigrations, rollbackTimescaleDBMigration };
diff --git a/server/src/db/models/DLQItem.ts b/server/src/db/models/DLQItem.ts
new file mode 100644
index 0000000000..707846adb8
--- /dev/null
+++ b/server/src/db/models/DLQItem.ts
@@ -0,0 +1,70 @@
+import { Schema, model, type Types } from "mongoose";
+import { DLQItemTypes, DLQItemStatuses, type DLQItem } from "@/types/dlqItem.js";
+
+export interface DLQItemDocument extends Omit {
+ _id: Types.ObjectId;
+ monitorId: Types.ObjectId;
+ teamId: Types.ObjectId;
+ nextRetryAt: Date;
+ createdAt: Date;
+ updatedAt: Date;
+}
+
+const DLQItemSchema = new Schema(
+ {
+ type: {
+ type: String,
+ enum: DLQItemTypes,
+ required: true,
+ },
+ status: {
+ type: String,
+ enum: DLQItemStatuses,
+ default: "pending",
+ },
+ payload: {
+ type: Schema.Types.Mixed,
+ required: true,
+ },
+ monitorId: {
+ type: Schema.Types.ObjectId,
+ ref: "Monitor",
+ required: true,
+ immutable: true,
+ index: true,
+ },
+ teamId: {
+ type: Schema.Types.ObjectId,
+ ref: "Team",
+ required: true,
+ immutable: true,
+ index: true,
+ },
+ retryCount: {
+ type: Number,
+ default: 0,
+ },
+ maxRetries: {
+ type: Number,
+ default: 5,
+ },
+ lastError: {
+ type: String,
+ default: "",
+ },
+ nextRetryAt: {
+ type: Date,
+ required: true,
+ },
+ },
+ { timestamps: true }
+);
+
+DLQItemSchema.index({ status: 1, nextRetryAt: 1 });
+DLQItemSchema.index({ teamId: 1, status: 1 });
+DLQItemSchema.index({ createdAt: 1 });
+
+const DLQItemModel = model("DLQItem", DLQItemSchema);
+
+export { DLQItemModel };
+export default DLQItemModel;
diff --git a/server/src/db/models/Monitor.ts b/server/src/db/models/Monitor.ts
index 036aeadad6..5032569380 100644
--- a/server/src/db/models/Monitor.ts
+++ b/server/src/db/models/Monitor.ts
@@ -284,6 +284,21 @@ const MonitorSchema = new Schema(
ref: "Notification",
},
],
+ escalationNotifications: {
+ type: [Schema.Types.ObjectId],
+ ref: "Notification",
+ default: [],
+ },
+ escalateAfterMinutes: {
+ type: Number,
+ default: 5,
+ },
+ escalationSentAt: {
+ type: Date,
+ },
+ lastStatusChangeAt: {
+ type: Date,
+ },
secret: {
type: String,
},
diff --git a/server/src/db/models/Notification.ts b/server/src/db/models/Notification.ts
index 9ea3f17bdd..5f6d234ddb 100755
--- a/server/src/db/models/Notification.ts
+++ b/server/src/db/models/Notification.ts
@@ -25,7 +25,7 @@ const NotificationSchema = new Schema(
},
type: {
type: String,
- enum: ["email", "slack", "discord", "webhook", "pager_duty", "matrix", "teams"] as NotificationChannel[],
+ enum: ["email", "slack", "discord", "webhook", "pager_duty", "matrix", "teams", "telegram"] as NotificationChannel[],
required: true,
},
notificationName: {
diff --git a/server/src/db/models/index.ts b/server/src/db/models/index.ts
index 1024b2b934..d4c8f1a3ba 100644
--- a/server/src/db/models/index.ts
+++ b/server/src/db/models/index.ts
@@ -36,3 +36,6 @@ export { default as MaintenanceWindowModel } from "@/db/models/MaintenanceWindow
export * from "@/db/models/GeoCheck.js";
export { default as GeoCheckModel } from "@/db/models/GeoCheck.js";
+
+export * from "@/db/models/DLQItem.js";
+export { default as DLQItemModel } from "@/db/models/DLQItem.js";
diff --git a/server/src/index.ts b/server/src/index.ts
index 2286d38871..83698b45c2 100755
--- a/server/src/index.ts
+++ b/server/src/index.ts
@@ -1,16 +1,14 @@
import { initializeServices } from "./config/services.js";
import { initializeControllers } from "./config/controllers.js";
import { createApp } from "./app.js";
-import { initShutdownListener } from "./shutdown.js";
-import { validateEnv } from "./validation/envValidation.js";
+import { initShutdownListener } from "@/shutdown.js";
+import { validateEnv } from "@/validation/envValidation.js";
import { fileURLToPath } from "url";
import path from "path";
import fs from "fs";
-import { runMigrations } from "./db/migration/index.js";
import Logger, { ILogger } from "@/utils/logger.js";
import { SettingsService } from "@/service/index.js";
-import { MongoSettingsRepository } from "./repositories/index.js";
const SERVICE_NAME = "Server";
let logger: ILogger;
@@ -25,19 +23,15 @@ const startApp = async () => {
const openApiSpec = JSON.parse(fs.readFileSync(path.join(__dirname, "../openapi.json"), "utf8"));
const frontendPath = path.join(__dirname, "..", "public");
- // Create services
- const settingsRepository = new MongoSettingsRepository();
- const settingsService = new SettingsService(settingsRepository, env);
-
+ // Create settings service (env only — DB repository injected after connect)
+ const settingsService = new SettingsService(env);
const envSettings = settingsService.loadSettings();
// Create logger
logger = new Logger({ envSettings });
- // Initialize services
- const services = await initializeServices({ logger, envSettings, settingsService, settingsRepository });
-
- await runMigrations(logger);
+ // Initialize services (connects DB, creates repositories, injects settingsRepository)
+ const services = await initializeServices({ logger, envSettings, settingsService });
// Initialize controllers
const controllers = initializeControllers(services);
diff --git a/server/src/middleware/handleErrors.ts b/server/src/middleware/handleErrors.ts
index be9d9ea1ee..ff591484f9 100755
--- a/server/src/middleware/handleErrors.ts
+++ b/server/src/middleware/handleErrors.ts
@@ -4,14 +4,14 @@ import { AppError } from "@/utils/AppError.js";
const handleErrors = (error: unknown, req: Request, res: Response, _next: NextFunction) => {
const status = error instanceof AppError ? error.status || 500 : 500;
- const message = error instanceof AppError ? error.message : "Server error";
+ const message = error instanceof AppError ? error.message : error instanceof Error ? error.message : "Server error";
const service = error instanceof AppError ? error.service : "unknownService";
const method = error instanceof AppError ? error.method : "unknownMethod";
logger.error({
message: message,
service: service,
method: method,
- stack: error instanceof AppError ? error.stack : undefined,
+ stack: error instanceof Error ? error.stack : undefined,
details: error instanceof AppError ? error.details : undefined,
});
res.status(status).json({
diff --git a/server/src/repositories/checks/TimescaleChecksRepository.ts b/server/src/repositories/checks/TimescaleChecksRepository.ts
new file mode 100644
index 0000000000..466be0f714
--- /dev/null
+++ b/server/src/repositories/checks/TimescaleChecksRepository.ts
@@ -0,0 +1,1012 @@
+import type { Pool } from "pg";
+import type { IChecksRepository } from "@/repositories/checks/IChecksRepository.js";
+import type {
+ Check,
+ CheckAudits,
+ CheckCaptureInfo,
+ CheckCpuInfo,
+ CheckDiskInfo,
+ CheckErrorInfo,
+ CheckHostInfo,
+ CheckMemoryInfo,
+ CheckNetworkInterfaceInfo,
+ ChecksQueryResult,
+ ChecksSummary,
+ MonitorType,
+ PageSpeedChecksResult,
+ HardwareChecksResult,
+ UptimeChecksResult,
+ GotTimings,
+} from "@/types/index.js";
+import type { LatestChecksMap } from "@/repositories/checks/MongoChecksRepistory.js";
+import { getDateForRange } from "@/utils/dataUtils.js";
+
+// Map MongoDB dateString formats to TimescaleDB time_bucket intervals
+const dateStringToBucket = (dateString: string): string => {
+ if (dateString.includes("%M")) return "1 minute";
+ if (dateString.includes("%H")) return "1 hour";
+ return "1 day";
+};
+
+export class TimescaleChecksRepository implements IChecksRepository {
+ constructor(private pool: Pool) {}
+
+ // Returns correct CA table name for the given bucket interval and query type
+ // Or returns null if no CA is available (fall back to raw checks table).
+ private getCaTable(bucket: string, type: "uptime" | "hardware" | "pagespeed"): string | null {
+ if (type === "uptime" && bucket === "1 hour") return "checks_hourly";
+ if (type === "uptime" && bucket === "1 day") return "checks_daily";
+ if (type === "hardware" && bucket === "1 hour") return "hardware_hourly";
+ if (type === "pagespeed" && bucket === "1 day") return "pagespeed_daily";
+ return null;
+ }
+
+ create = async (check: Check): Promise => {
+ const row = await this.insertCheck(check);
+ if (!row) {
+ throw new Error("Failed to create check");
+ }
+
+ if (check.disk?.length) {
+ await this.insertDisks(row.id, row.created_at, check.disk);
+ }
+ if (check.net?.length) {
+ await this.insertNetworkInterfaces(row.id, row.created_at, check.net);
+ }
+ if (check.errors?.length) {
+ await this.insertErrors(row.id, row.created_at, check.errors);
+ }
+
+ return this.toEntity(row, check.disk, check.errors, check.net);
+ };
+
+ createChecks = async (checks: Check[]): Promise => {
+ const results: Check[] = [];
+ for (const check of checks) {
+ results.push(await this.create(check));
+ }
+ return results;
+ };
+
+ findByMonitorId = async (
+ monitorId: string,
+ sortOrder: string,
+ dateRange: string,
+ filter: string | undefined,
+ page: number,
+ rowsPerPage: number,
+ status: boolean | undefined
+ ): Promise => {
+ const { conditions, values, paramIndex } = this.buildCheckFilters({ monitorId, dateRange, filter, status }, "monitor_id");
+
+ const direction = sortOrder === "asc" ? "ASC" : "DESC";
+ const offset = page && rowsPerPage ? page * rowsPerPage : 0;
+
+ const [countResult, checksResult] = await Promise.all([
+ this.pool.query(`SELECT COUNT(*)::int AS count FROM checks WHERE ${conditions.join(" AND ")}`, values),
+ this.pool.query(
+ `SELECT * FROM checks WHERE ${conditions.join(" AND ")} ORDER BY created_at ${direction} LIMIT $${paramIndex} OFFSET $${paramIndex + 1}`,
+ [...values, rowsPerPage, offset]
+ ),
+ ]);
+
+ return {
+ checksCount: countResult.rows[0].count,
+ checks: await this.populateChildData(checksResult.rows),
+ };
+ };
+
+ findByTeamId = async (
+ sortOrder: string,
+ dateRange: string,
+ filter: string | undefined,
+ page: number,
+ rowsPerPage: number,
+ teamId: string
+ ): Promise => {
+ const { conditions, values, paramIndex } = this.buildCheckFilters({ teamId, dateRange, filter }, "team_id");
+
+ const direction = sortOrder === "asc" ? "ASC" : "DESC";
+ const offset = page && rowsPerPage ? page * rowsPerPage : 0;
+
+ const [countResult, checksResult] = await Promise.all([
+ this.pool.query(`SELECT COUNT(*)::int AS count FROM checks WHERE ${conditions.join(" AND ")}`, values),
+ this.pool.query(
+ `SELECT * FROM checks WHERE ${conditions.join(" AND ")} ORDER BY created_at ${direction} LIMIT $${paramIndex} OFFSET $${paramIndex + 1}`,
+ [...values, rowsPerPage, offset]
+ ),
+ ]);
+
+ return {
+ checksCount: countResult.rows[0].count,
+ checks: await this.populateChildData(checksResult.rows),
+ };
+ };
+
+ findLatestByMonitorIds = async (monitorIds: string[], options?: { limitPerMonitor?: number }): Promise => {
+ if (!monitorIds.length) {
+ return {};
+ }
+ const limitPerMonitor = options?.limitPerMonitor ?? 25;
+ const dateFilter = new Date(Date.now() - 24 * 60 * 60 * 1000);
+
+ const allResult = await this.pool.query(
+ `SELECT * FROM (
+ SELECT *, ROW_NUMBER() OVER (PARTITION BY monitor_id ORDER BY created_at DESC) AS rn
+ FROM checks
+ WHERE monitor_id = ANY($1) AND created_at >= $2
+ ) sub
+ WHERE rn <= $3
+ ORDER BY monitor_id, created_at DESC`,
+ [monitorIds, dateFilter, limitPerMonitor]
+ );
+
+ const checks = await this.populateChildData(allResult.rows);
+
+ const mapped: LatestChecksMap = {};
+ for (let i = 0; i < allResult.rows.length; i++) {
+ const mid = allResult.rows[i].monitor_id;
+ if (!mapped[mid]) {
+ mapped[mid] = [];
+ }
+ const check = checks[i];
+ if (check !== undefined) {
+ mapped[mid].push(check);
+ }
+ }
+ // Ensure all requested IDs have an entry
+ for (const id of monitorIds) {
+ if (!mapped[id]) {
+ mapped[id] = [];
+ }
+ }
+ return mapped;
+ };
+
+ findByDateRangeAndMonitorId = async (
+ monitorId: string,
+ startDate: Date,
+ endDate: Date,
+ dateString: string,
+ options?: { type?: MonitorType }
+ ): Promise => {
+ if (options?.type === "hardware") {
+ return this.findHardwareDateRangeChecks(monitorId, startDate, endDate, dateString);
+ }
+ if (options?.type === "pagespeed") {
+ return this.findPageSpeedDateRangeChecks(monitorId, startDate, endDate, dateString);
+ }
+ return this.findUptimeDateRangeChecks(options?.type ?? "http", monitorId, startDate, endDate, dateString);
+ };
+
+ findSummaryByTeamId = async (teamId: string, dateRange: string): Promise => {
+ const rangeDate = getDateForRange(dateRange);
+ const conditions: string[] = ["team_id = $1"];
+ const values: unknown[] = [teamId];
+
+ if (rangeDate) {
+ conditions.push("created_at >= $2");
+ values.push(rangeDate);
+ }
+
+ const result = await this.pool.query(
+ `SELECT
+ COUNT(*)::int AS "totalChecks",
+ COUNT(*) FILTER (WHERE status = FALSE)::int AS "downChecks"
+ FROM checks WHERE ${conditions.join(" AND ")}`,
+ values
+ );
+
+ return result.rows[0] ?? { totalChecks: 0, downChecks: 0 };
+ };
+
+ deleteByMonitorId = async (monitorId: string): Promise => {
+ const result = await this.pool.query(`DELETE FROM checks WHERE monitor_id = $1`, [monitorId]);
+ return result.rowCount ?? 0;
+ };
+
+ deleteByTeamId = async (teamId: string): Promise => {
+ const result = await this.pool.query(`DELETE FROM checks WHERE team_id = $1`, [teamId]);
+ return result.rowCount ?? 0;
+ };
+
+ deleteByMonitorIdsNotIn = async (monitorIds: string[]): Promise => {
+ if (!monitorIds.length) {
+ const result = await this.pool.query(`DELETE FROM checks`);
+ return result.rowCount ?? 0;
+ }
+ const result = await this.pool.query(`DELETE FROM checks WHERE monitor_id != ALL($1)`, [monitorIds]);
+ return result.rowCount ?? 0;
+ };
+
+ deleteOlderThan = async (date: Date): Promise => {
+ const result = await this.pool.query(`DELETE FROM checks WHERE created_at < $1`, [date]);
+ return result.rowCount ?? 0;
+ };
+
+ private populateChildData = async (checkRows: Record[]): Promise => {
+ if (!checkRows.length) return [];
+
+ const checkIds = checkRows.map((r) => r.id as string);
+
+ const [disksResult, netsResult, errsResult] = await Promise.all([
+ this.pool.query(
+ `SELECT check_id, device, mountpoint, total_bytes, free_bytes, used_bytes, usage_percent,
+ total_inodes, free_inodes, used_inodes, inodes_usage_percent,
+ read_bytes, write_bytes, read_time, write_time
+ FROM check_disks WHERE check_id = ANY($1)`,
+ [checkIds]
+ ),
+ this.pool.query(
+ `SELECT check_id, name, bytes_sent, bytes_recv, packets_sent, packets_recv,
+ err_in, err_out, drop_in, drop_out, fifo_in, fifo_out
+ FROM check_network_interfaces WHERE check_id = ANY($1)`,
+ [checkIds]
+ ),
+ this.pool.query(
+ `SELECT check_id, metrics, error
+ FROM check_errors WHERE check_id = ANY($1)`,
+ [checkIds]
+ ),
+ ]);
+
+ const diskMap = new Map();
+ for (const d of disksResult.rows) {
+ const key = d.check_id as string;
+ if (!diskMap.has(key)) diskMap.set(key, []);
+ diskMap.get(key)!.push({
+ device: d.device,
+ mountpoint: d.mountpoint,
+ total_bytes: Number(d.total_bytes),
+ free_bytes: Number(d.free_bytes),
+ used_bytes: Number(d.used_bytes),
+ usage_percent: d.usage_percent,
+ total_inodes: Number(d.total_inodes),
+ free_inodes: Number(d.free_inodes),
+ used_inodes: Number(d.used_inodes),
+ inodes_usage_percent: d.inodes_usage_percent,
+ read_bytes: Number(d.read_bytes),
+ write_bytes: Number(d.write_bytes),
+ read_time: Number(d.read_time),
+ write_time: Number(d.write_time),
+ });
+ }
+
+ const netMap = new Map();
+ for (const n of netsResult.rows) {
+ const key = n.check_id as string;
+ if (!netMap.has(key)) netMap.set(key, []);
+ netMap.get(key)!.push({
+ name: n.name,
+ bytes_sent: Number(n.bytes_sent),
+ bytes_recv: Number(n.bytes_recv),
+ packets_sent: Number(n.packets_sent),
+ packets_recv: Number(n.packets_recv),
+ err_in: Number(n.err_in),
+ err_out: Number(n.err_out),
+ drop_in: Number(n.drop_in),
+ drop_out: Number(n.drop_out),
+ fifo_in: Number(n.fifo_in),
+ fifo_out: Number(n.fifo_out),
+ });
+ }
+
+ const errMap = new Map();
+ for (const e of errsResult.rows) {
+ const key = e.check_id as string;
+ if (!errMap.has(key)) errMap.set(key, []);
+ errMap.get(key)!.push({ metric: e.metrics ?? [], err: e.error ?? "" });
+ }
+
+ return checkRows.map((row) => {
+ const id = row.id as string;
+ return this.toEntity(row, diskMap.get(id) ?? [], errMap.get(id) ?? [], netMap.get(id) ?? []);
+ });
+ };
+
+ private insertCheck = async (check: Check) => {
+ const result = await this.pool.query(
+ `INSERT INTO checks (
+ monitor_id, team_id, monitor_type, status, response_time, status_code, message,
+ timing_start, timing_socket, timing_lookup, timing_connect, timing_secure_connect,
+ timing_upload, timing_response, timing_end,
+ phase_wait, phase_dns, phase_tcp, phase_tls, phase_request, phase_first_byte, phase_download, phase_total,
+ cpu_physical_core, cpu_logical_core, cpu_frequency, cpu_current_frequency, cpu_temperature,
+ cpu_free_percent, cpu_usage_percent,
+ mem_total_bytes, mem_available_bytes, mem_used_bytes, mem_usage_percent,
+ host_os, host_platform, host_kernel_version, host_pretty_name,
+ capture_version, capture_mode,
+ lighthouse_performance, lighthouse_accessibility, lighthouse_best_practices, lighthouse_seo,
+ audit_cls_score, audit_cls_value, audit_cls_display,
+ audit_si_score, audit_si_value, audit_si_display,
+ audit_fcp_score, audit_fcp_value, audit_fcp_display,
+ audit_lcp_score, audit_lcp_value, audit_lcp_display,
+ audit_tbt_score, audit_tbt_value, audit_tbt_display
+ ) VALUES (
+ $1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11,$12,$13,$14,$15,$16,$17,$18,$19,$20,$21,$22,$23,
+ $24,$25,$26,$27,$28,$29,$30,$31,$32,$33,$34,$35,$36,$37,$38,$39,$40,$41,$42,$43,$44,
+ $45,$46,$47,$48,$49,$50,$51,$52,$53,$54,$55,$56,$57,$58,$59
+ ) RETURNING *`,
+ [
+ check.metadata.monitorId,
+ check.metadata.teamId,
+ check.metadata.type,
+ check.status,
+ check.responseTime,
+ check.statusCode,
+ check.message,
+ check.timings?.start ?? null,
+ check.timings?.socket ?? null,
+ check.timings?.lookup ?? null,
+ check.timings?.connect ?? null,
+ check.timings?.secureConnect ?? null,
+ check.timings?.upload ?? null,
+ check.timings?.response ?? null,
+ check.timings?.end ?? null,
+ check.timings?.phases?.wait ?? null,
+ check.timings?.phases?.dns ?? null,
+ check.timings?.phases?.tcp ?? null,
+ check.timings?.phases?.tls ?? null,
+ check.timings?.phases?.request ?? null,
+ check.timings?.phases?.firstByte ?? null,
+ check.timings?.phases?.download ?? null,
+ check.timings?.phases?.total ?? null,
+ check.cpu?.physical_core ?? null,
+ check.cpu?.logical_core ?? null,
+ check.cpu?.frequency ?? null,
+ check.cpu?.current_frequency ?? null,
+ check.cpu?.temperature ?? null,
+ check.cpu?.free_percent ?? null,
+ check.cpu?.usage_percent ?? null,
+ check.memory?.total_bytes ?? null,
+ check.memory?.available_bytes ?? null,
+ check.memory?.used_bytes ?? null,
+ check.memory?.usage_percent ?? null,
+ check.host?.os ?? null,
+ check.host?.platform ?? null,
+ check.host?.kernel_version ?? null,
+ check.host?.pretty_name ?? null,
+ check.capture?.version ?? null,
+ check.capture?.mode ?? null,
+ check.performance ?? null,
+ check.accessibility ?? null,
+ check.bestPractices ?? null,
+ check.seo ?? null,
+ check.audits?.cls?.score ?? null,
+ check.audits?.cls?.numericValue ?? null,
+ check.audits?.cls?.displayValue ?? null,
+ check.audits?.si?.score ?? null,
+ check.audits?.si?.numericValue ?? null,
+ check.audits?.si?.displayValue ?? null,
+ check.audits?.fcp?.score ?? null,
+ check.audits?.fcp?.numericValue ?? null,
+ check.audits?.fcp?.displayValue ?? null,
+ check.audits?.lcp?.score ?? null,
+ check.audits?.lcp?.numericValue ?? null,
+ check.audits?.lcp?.displayValue ?? null,
+ check.audits?.tbt?.score ?? null,
+ check.audits?.tbt?.numericValue ?? null,
+ check.audits?.tbt?.displayValue ?? null,
+ ]
+ );
+ return result.rows[0];
+ };
+
+ private insertDisks = async (checkId: string, checkCreatedAt: Date, disks: CheckDiskInfo[]) => {
+ for (const disk of disks) {
+ await this.pool.query(
+ `INSERT INTO check_disks (check_id, check_created_at, device, mountpoint, total_bytes, free_bytes, used_bytes, usage_percent,
+ total_inodes, free_inodes, used_inodes, inodes_usage_percent, read_bytes, write_bytes, read_time, write_time)
+ VALUES ($1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11,$12,$13,$14,$15,$16)`,
+ [
+ checkId,
+ checkCreatedAt,
+ disk.device,
+ disk.mountpoint,
+ disk.total_bytes,
+ disk.free_bytes,
+ disk.used_bytes,
+ disk.usage_percent,
+ disk.total_inodes,
+ disk.free_inodes,
+ disk.used_inodes,
+ disk.inodes_usage_percent,
+ disk.read_bytes,
+ disk.write_bytes,
+ disk.read_time,
+ disk.write_time,
+ ]
+ );
+ }
+ };
+
+ private insertNetworkInterfaces = async (checkId: string, checkCreatedAt: Date, nets: CheckNetworkInterfaceInfo[]) => {
+ for (const net of nets) {
+ await this.pool.query(
+ `INSERT INTO check_network_interfaces (check_id, check_created_at, name, bytes_sent, bytes_recv, packets_sent, packets_recv,
+ err_in, err_out, drop_in, drop_out, fifo_in, fifo_out)
+ VALUES ($1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11,$12,$13)`,
+ [
+ checkId,
+ checkCreatedAt,
+ net.name,
+ net.bytes_sent,
+ net.bytes_recv,
+ net.packets_sent,
+ net.packets_recv,
+ net.err_in,
+ net.err_out,
+ net.drop_in,
+ net.drop_out,
+ net.fifo_in,
+ net.fifo_out,
+ ]
+ );
+ }
+ };
+
+ private insertErrors = async (checkId: string, checkCreatedAt: Date, errors: CheckErrorInfo[]) => {
+ for (const err of errors) {
+ await this.pool.query(
+ `INSERT INTO check_errors (check_id, check_created_at, metrics, error)
+ VALUES ($1,$2,$3,$4)`,
+ [checkId, checkCreatedAt, err.metric, err.err]
+ );
+ }
+ };
+
+ private buildCheckFilters = (
+ opts: { monitorId?: string; teamId?: string; dateRange?: string; filter?: string; status?: boolean },
+ idColumn: string
+ ) => {
+ const conditions: string[] = [];
+ const values: unknown[] = [];
+ let paramIndex = 1;
+
+ if (opts.monitorId) {
+ conditions.push(`${idColumn} = $${paramIndex++}`);
+ values.push(opts.monitorId);
+ } else if (opts.teamId) {
+ conditions.push(`${idColumn} = $${paramIndex++}`);
+ values.push(opts.teamId);
+ }
+
+ if (opts.dateRange) {
+ const rangeDate = getDateForRange(opts.dateRange);
+ if (rangeDate) {
+ conditions.push(`created_at >= $${paramIndex++}`);
+ values.push(rangeDate);
+ }
+ }
+
+ // Filter overwrites status (matching Mongo behavior where filter sets matchStage.status)
+ let statusApplied = false;
+ if (opts.filter !== undefined) {
+ switch (opts.filter) {
+ case "all":
+ break;
+ case "up":
+ conditions.push(`status = TRUE`);
+ statusApplied = true;
+ break;
+ case "down":
+ conditions.push(`status = FALSE`);
+ statusApplied = true;
+ break;
+ case "resolve":
+ conditions.push(`status = FALSE`);
+ conditions.push(`status_code = 5000`);
+ statusApplied = true;
+ break;
+ default:
+ break;
+ }
+ }
+
+ if (!statusApplied && opts.status !== undefined) {
+ conditions.push(`status = $${paramIndex++}`);
+ values.push(opts.status);
+ }
+
+ return { conditions, values, paramIndex };
+ };
+
+ private findUptimeDateRangeChecks = async (
+ monitorType: Exclude,
+ monitorId: string,
+ startDate: Date,
+ endDate: Date,
+ dateString: string
+ ): Promise => {
+ const bucket = dateStringToBucket(dateString);
+ const caTable = this.getCaTable(bucket, "uptime");
+
+ if (caTable) {
+ return this.findUptimeFromCa(monitorType, monitorId, startDate, endDate, caTable);
+ }
+ return this.findUptimeFromRaw(monitorType, monitorId, startDate, endDate, bucket);
+ };
+
+ private findUptimeFromCa = async (
+ monitorType: Exclude,
+ monitorId: string,
+ startDate: Date,
+ endDate: Date,
+ caTable: string
+ ): Promise => {
+ const result = await this.pool.query(
+ `SELECT bucket AS bucket_date, total_checks::int, up_checks::int, down_checks::int,
+ avg_response_time, avg_up_response_time, avg_down_response_time
+ FROM ${caTable}
+ WHERE monitor_id = $1 AND bucket >= $2 AND bucket <= $3
+ ORDER BY bucket`,
+ [monitorId, startDate, endDate]
+ );
+
+ let totalChecks = 0;
+ let totalUp = 0;
+ let weightedResponseTime = 0;
+
+ const groupedChecks = result.rows.map((row) => {
+ const count = Number(row.total_checks);
+ const up = Number(row.up_checks);
+ const avg = Number(row.avg_response_time ?? 0);
+ totalChecks += count;
+ totalUp += up;
+ weightedResponseTime += avg * count;
+ return {
+ bucketDate: (row.bucket_date as Date).toISOString(),
+ avgResponseTime: avg,
+ totalChecks: count,
+ };
+ });
+
+ const groupedUpChecks = result.rows
+ .filter((row) => Number(row.up_checks) > 0)
+ .map((row) => ({
+ bucketDate: (row.bucket_date as Date).toISOString(),
+ avgResponseTime: Number(row.avg_up_response_time ?? 0),
+ totalChecks: Number(row.up_checks),
+ }));
+
+ const groupedDownChecks = result.rows
+ .filter((row) => Number(row.down_checks) > 0)
+ .map((row) => ({
+ bucketDate: (row.bucket_date as Date).toISOString(),
+ avgResponseTime: Number(row.avg_down_response_time ?? 0),
+ totalChecks: Number(row.down_checks),
+ }));
+
+ return {
+ monitorType,
+ groupedChecks,
+ groupedUpChecks,
+ groupedDownChecks,
+ uptimePercentage: totalChecks > 0 ? totalUp / totalChecks : 0,
+ avgResponseTime: totalChecks > 0 ? weightedResponseTime / totalChecks : 0,
+ };
+ };
+
+ private findUptimeFromRaw = async (
+ monitorType: Exclude,
+ monitorId: string,
+ startDate: Date,
+ endDate: Date,
+ bucket: string
+ ): Promise => {
+ const [uptimeResult, groupedResult, upResult, downResult] = await Promise.all([
+ this.pool.query(
+ `SELECT
+ COUNT(*) FILTER (WHERE status = TRUE) AS up_checks,
+ COUNT(*) AS total_checks,
+ AVG(response_time) AS avg_response_time
+ FROM checks WHERE monitor_id = $1 AND created_at >= $2 AND created_at <= $3`,
+ [monitorId, startDate, endDate]
+ ),
+ this.pool.query(
+ `SELECT
+ time_bucket($1::interval, created_at) AS bucket_date,
+ AVG(response_time) AS "avgResponseTime",
+ COUNT(*)::int AS "totalChecks"
+ FROM checks WHERE monitor_id = $2 AND created_at >= $3 AND created_at <= $4
+ GROUP BY bucket_date ORDER BY bucket_date`,
+ [bucket, monitorId, startDate, endDate]
+ ),
+ this.pool.query(
+ `SELECT
+ time_bucket($1::interval, created_at) AS bucket_date,
+ AVG(response_time) AS "avgResponseTime",
+ COUNT(*)::int AS "totalChecks"
+ FROM checks WHERE monitor_id = $2 AND created_at >= $3 AND created_at <= $4 AND status = TRUE
+ GROUP BY bucket_date ORDER BY bucket_date`,
+ [bucket, monitorId, startDate, endDate]
+ ),
+ this.pool.query(
+ `SELECT
+ time_bucket($1::interval, created_at) AS bucket_date,
+ AVG(response_time) AS "avgResponseTime",
+ COUNT(*)::int AS "totalChecks"
+ FROM checks WHERE monitor_id = $2 AND created_at >= $3 AND created_at <= $4 AND status = FALSE
+ GROUP BY bucket_date ORDER BY bucket_date`,
+ [bucket, monitorId, startDate, endDate]
+ ),
+ ]);
+
+ const stats = uptimeResult.rows[0];
+ const totalChecks = Number(stats?.total_checks ?? 0);
+ const upChecks = Number(stats?.up_checks ?? 0);
+
+ const formatGrouped = (rows: Array>) =>
+ rows.map((row) => ({
+ bucketDate: (row.bucket_date as Date).toISOString(),
+ avgResponseTime: Number(row.avgResponseTime ?? 0),
+ totalChecks: Number(row.totalChecks ?? 0),
+ }));
+
+ return {
+ monitorType,
+ groupedChecks: formatGrouped(groupedResult.rows),
+ groupedUpChecks: formatGrouped(upResult.rows),
+ groupedDownChecks: formatGrouped(downResult.rows),
+ uptimePercentage: totalChecks > 0 ? upChecks / totalChecks : 0,
+ avgResponseTime: Number(stats?.avg_response_time ?? 0),
+ };
+ };
+
+ private findHardwareDateRangeChecks = async (
+ monitorId: string,
+ startDate: Date,
+ endDate: Date,
+ dateString: string
+ ): Promise => {
+ const bucket = dateStringToBucket(dateString);
+ const caTable = this.getCaTable(bucket, "hardware");
+
+ // Build the metrics query: use hardware_hourly CA for cpu/mem when available,
+ // but temperature always requires the raw table
+ const metricsQuery = caTable
+ ? this.pool.query(
+ `SELECT bucket AS bucket_date, avg_cpu, avg_memory
+ FROM ${caTable}
+ WHERE monitor_id = $1 AND bucket >= $2 AND bucket <= $3
+ ORDER BY bucket`,
+ [monitorId, startDate, endDate]
+ )
+ : this.pool.query(
+ `SELECT
+ time_bucket($1::interval, created_at) AS bucket_date,
+ AVG(cpu_usage_percent) AS avg_cpu,
+ AVG(mem_usage_percent) AS avg_memory
+ FROM checks
+ WHERE monitor_id = $2 AND monitor_type = 'hardware' AND created_at >= $3 AND created_at <= $4
+ GROUP BY bucket_date ORDER BY bucket_date`,
+ [bucket, monitorId, startDate, endDate]
+ );
+
+ // Temperature query always hits raw table (not in any CA)
+ const tempQuery = this.pool.query(
+ `WITH temp_avg AS (
+ SELECT time_bucket($1::interval, c.created_at) AS bucket_date, idx, AVG(val) AS avg_val
+ FROM checks c, unnest(c.cpu_temperature) WITH ORDINALITY AS t(val, idx)
+ WHERE c.monitor_id = $2 AND c.monitor_type = 'hardware' AND c.created_at >= $3 AND c.created_at <= $4
+ GROUP BY bucket_date, idx
+ )
+ SELECT bucket_date, array_agg(avg_val ORDER BY idx) AS avg_temperature
+ FROM temp_avg
+ GROUP BY bucket_date
+ ORDER BY bucket_date`,
+ [bucket, monitorId, startDate, endDate]
+ );
+
+ const diskQuery = this.pool.query(
+ `SELECT
+ time_bucket($1::interval, d.check_created_at) AS bucket_date,
+ d.device AS name,
+ AVG(d.read_bytes) AS "readSpeed",
+ AVG(d.write_bytes) AS "writeSpeed",
+ AVG(d.total_bytes) AS "totalBytes",
+ AVG(d.free_bytes) AS "freeBytes",
+ AVG(d.usage_percent) AS "usagePercent"
+ FROM check_disks d
+ WHERE d.check_id IN (
+ SELECT id FROM checks
+ WHERE monitor_id = $2 AND monitor_type = 'hardware' AND created_at >= $3 AND created_at <= $4
+ )
+ GROUP BY bucket_date, d.device
+ ORDER BY bucket_date, d.device`,
+ [bucket, monitorId, startDate, endDate]
+ );
+
+ // Batched network query across all buckets (eliminates N+1)
+ const netQuery = this.pool.query(
+ `WITH bounded AS (
+ SELECT
+ time_bucket($1::interval, c.created_at) AS bucket_date,
+ n.name,
+ FIRST_VALUE(n.bytes_sent) OVER w AS first_bytes_sent,
+ LAST_VALUE(n.bytes_sent) OVER w AS last_bytes_sent,
+ FIRST_VALUE(n.bytes_recv) OVER w AS first_bytes_recv,
+ LAST_VALUE(n.bytes_recv) OVER w AS last_bytes_recv,
+ FIRST_VALUE(n.packets_sent) OVER w AS first_packets_sent,
+ LAST_VALUE(n.packets_sent) OVER w AS last_packets_sent,
+ FIRST_VALUE(n.packets_recv) OVER w AS first_packets_recv,
+ LAST_VALUE(n.packets_recv) OVER w AS last_packets_recv,
+ FIRST_VALUE(n.err_in) OVER w AS first_err_in,
+ LAST_VALUE(n.err_in) OVER w AS last_err_in,
+ FIRST_VALUE(n.err_out) OVER w AS first_err_out,
+ LAST_VALUE(n.err_out) OVER w AS last_err_out,
+ FIRST_VALUE(n.drop_in) OVER w AS first_drop_in,
+ LAST_VALUE(n.drop_in) OVER w AS last_drop_in,
+ FIRST_VALUE(n.drop_out) OVER w AS first_drop_out,
+ LAST_VALUE(n.drop_out) OVER w AS last_drop_out,
+ FIRST_VALUE(n.fifo_in) OVER w AS first_fifo_in,
+ LAST_VALUE(n.fifo_in) OVER w AS last_fifo_in,
+ FIRST_VALUE(n.fifo_out) OVER w AS first_fifo_out,
+ LAST_VALUE(n.fifo_out) OVER w AS last_fifo_out,
+ FIRST_VALUE(c.created_at) OVER w AS first_time,
+ LAST_VALUE(c.created_at) OVER w AS last_time
+ FROM check_network_interfaces n
+ JOIN checks c ON c.id = n.check_id
+ WHERE c.monitor_id = $2 AND c.monitor_type = 'hardware'
+ AND c.created_at >= $3 AND c.created_at <= $4
+ WINDOW w AS (PARTITION BY time_bucket($1::interval, c.created_at), n.name
+ ORDER BY c.created_at ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING)
+ )
+ SELECT DISTINCT ON (bucket_date, name) bucket_date, name,
+ CASE WHEN EXTRACT(EPOCH FROM (last_time - first_time)) > 0
+ THEN (last_bytes_sent - first_bytes_sent) / EXTRACT(EPOCH FROM (last_time - first_time))
+ ELSE 0 END AS "bytesSentPerSecond",
+ CASE WHEN EXTRACT(EPOCH FROM (last_time - first_time)) > 0
+ THEN (last_bytes_recv - first_bytes_recv) / EXTRACT(EPOCH FROM (last_time - first_time))
+ ELSE 0 END AS "deltaBytesRecv",
+ CASE WHEN EXTRACT(EPOCH FROM (last_time - first_time)) > 0
+ THEN (last_packets_sent - first_packets_sent) / EXTRACT(EPOCH FROM (last_time - first_time))
+ ELSE 0 END AS "deltaPacketsSent",
+ CASE WHEN EXTRACT(EPOCH FROM (last_time - first_time)) > 0
+ THEN (last_packets_recv - first_packets_recv) / EXTRACT(EPOCH FROM (last_time - first_time))
+ ELSE 0 END AS "deltaPacketsRecv",
+ CASE WHEN EXTRACT(EPOCH FROM (last_time - first_time)) > 0
+ THEN (last_err_in - first_err_in) / EXTRACT(EPOCH FROM (last_time - first_time))
+ ELSE 0 END AS "deltaErrIn",
+ CASE WHEN EXTRACT(EPOCH FROM (last_time - first_time)) > 0
+ THEN (last_err_out - first_err_out) / EXTRACT(EPOCH FROM (last_time - first_time))
+ ELSE 0 END AS "deltaErrOut",
+ CASE WHEN EXTRACT(EPOCH FROM (last_time - first_time)) > 0
+ THEN (last_drop_in - first_drop_in) / EXTRACT(EPOCH FROM (last_time - first_time))
+ ELSE 0 END AS "deltaDropIn",
+ CASE WHEN EXTRACT(EPOCH FROM (last_time - first_time)) > 0
+ THEN (last_drop_out - first_drop_out) / EXTRACT(EPOCH FROM (last_time - first_time))
+ ELSE 0 END AS "deltaDropOut",
+ CASE WHEN EXTRACT(EPOCH FROM (last_time - first_time)) > 0
+ THEN (last_fifo_in - first_fifo_in) / EXTRACT(EPOCH FROM (last_time - first_time))
+ ELSE 0 END AS "deltaFifoIn",
+ CASE WHEN EXTRACT(EPOCH FROM (last_time - first_time)) > 0
+ THEN (last_fifo_out - first_fifo_out) / EXTRACT(EPOCH FROM (last_time - first_time))
+ ELSE 0 END AS "deltaFifoOut"
+ FROM bounded
+ ORDER BY bucket_date, name`,
+ [bucket, monitorId, startDate, endDate]
+ );
+
+ const [totalResult, upResult, metricsResult, tempResult, diskResult, netResult] = await Promise.all([
+ this.pool.query(
+ `SELECT COUNT(*)::int AS count FROM checks
+ WHERE monitor_id = $1 AND monitor_type = 'hardware' AND created_at >= $2 AND created_at <= $3`,
+ [monitorId, startDate, endDate]
+ ),
+ this.pool.query(
+ `SELECT COUNT(*)::int AS count FROM checks
+ WHERE monitor_id = $1 AND monitor_type = 'hardware' AND created_at >= $2 AND created_at <= $3 AND status = TRUE`,
+ [monitorId, startDate, endDate]
+ ),
+ metricsQuery,
+ tempQuery,
+ diskQuery,
+ netQuery,
+ ]);
+
+ // Group disk and net results by bucket date
+ const disksByBucket = new Map();
+ for (const row of diskResult.rows) {
+ const key = (row.bucket_date as Date).toISOString();
+ if (!disksByBucket.has(key)) disksByBucket.set(key, []);
+ disksByBucket.get(key)!.push(row);
+ }
+
+ const netsByBucket = new Map();
+ for (const row of netResult.rows) {
+ const key = (row.bucket_date as Date).toISOString();
+ if (!netsByBucket.has(key)) netsByBucket.set(key, []);
+ netsByBucket.get(key)!.push(row);
+ }
+
+ const tempByBucket = new Map();
+ for (const row of tempResult.rows) {
+ const key = (row.bucket_date as Date).toISOString();
+ tempByBucket.set(key, Array.isArray(row.avg_temperature) ? row.avg_temperature.map(Number) : []);
+ }
+
+ // Assemble checks array from metrics + disk/net maps
+ const checks = metricsResult.rows.map((row) => {
+ const bucketDate = (row.bucket_date as Date).toISOString();
+ const disks = disksByBucket.get(bucketDate) ?? [];
+ const nets = netsByBucket.get(bucketDate) ?? [];
+
+ return {
+ bucketDate,
+ avgCpuUsage: Number(row.avg_cpu ?? 0),
+ avgMemoryUsage: Number(row.avg_memory ?? 0),
+ avgTemperature: tempByBucket.get(bucketDate) ?? [],
+ disks: disks.map((d) => ({
+ name: d.name ?? "",
+ readSpeed: Number(d.readSpeed ?? 0),
+ writeSpeed: Number(d.writeSpeed ?? 0),
+ totalBytes: Number(d.totalBytes ?? 0),
+ freeBytes: Number(d.freeBytes ?? 0),
+ usagePercent: Number(d.usagePercent ?? 0),
+ })),
+ net: nets.map((n) => ({
+ name: n.name ?? "",
+ bytesSentPerSecond: Number(n.bytesSentPerSecond ?? 0),
+ deltaBytesRecv: Number(n.deltaBytesRecv ?? 0),
+ deltaPacketsSent: Number(n.deltaPacketsSent ?? 0),
+ deltaPacketsRecv: Number(n.deltaPacketsRecv ?? 0),
+ deltaErrIn: Number(n.deltaErrIn ?? 0),
+ deltaErrOut: Number(n.deltaErrOut ?? 0),
+ deltaDropIn: Number(n.deltaDropIn ?? 0),
+ deltaDropOut: Number(n.deltaDropOut ?? 0),
+ deltaFifoIn: Number(n.deltaFifoIn ?? 0),
+ deltaFifoOut: Number(n.deltaFifoOut ?? 0),
+ })),
+ };
+ });
+
+ return {
+ monitorType: "hardware" as const,
+ aggregateData: { totalChecks: totalResult.rows[0].count },
+ upChecks: { totalChecks: upResult.rows[0].count },
+ checks,
+ };
+ };
+
+ private findPageSpeedDateRangeChecks = async (
+ monitorId: string,
+ startDate: Date,
+ endDate: Date,
+ dateString: string
+ ): Promise => {
+ const bucket = dateStringToBucket(dateString);
+ const caTable = this.getCaTable(bucket, "pagespeed");
+
+ const result = caTable
+ ? await this.pool.query(
+ `SELECT bucket AS bucket_date,
+ avg_performance AS performance,
+ avg_accessibility AS accessibility,
+ avg_best_practices AS "bestPractices",
+ avg_seo AS seo,
+ sample_count::int AS "totalChecks"
+ FROM ${caTable}
+ WHERE monitor_id = $1 AND bucket >= $2 AND bucket <= $3
+ ORDER BY bucket`,
+ [monitorId, startDate, endDate]
+ )
+ : await this.pool.query(
+ `SELECT
+ time_bucket($1::interval, created_at) AS bucket_date,
+ AVG(lighthouse_performance) AS performance,
+ AVG(lighthouse_accessibility) AS accessibility,
+ AVG(lighthouse_best_practices) AS "bestPractices",
+ AVG(lighthouse_seo) AS seo,
+ COUNT(*)::int AS "totalChecks"
+ FROM checks
+ WHERE monitor_id = $2 AND monitor_type = 'pagespeed' AND created_at >= $3 AND created_at <= $4
+ GROUP BY bucket_date ORDER BY bucket_date`,
+ [bucket, monitorId, startDate, endDate]
+ );
+
+ return {
+ monitorType: "pagespeed" as const,
+ groupedChecks: result.rows.map((row) => ({
+ bucketDate: (row.bucket_date as Date).toISOString(),
+ performance: Number(row.performance ?? 0),
+ accessibility: Number(row.accessibility ?? 0),
+ bestPractices: Number(row.bestPractices ?? 0),
+ seo: Number(row.seo ?? 0),
+ totalChecks: Number(row.totalChecks ?? 0),
+ })),
+ };
+ };
+
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
+ private toEntity = (row: any, disk?: CheckDiskInfo[], errors?: CheckErrorInfo[], net?: CheckNetworkInterfaceInfo[]): Check => {
+ const timings: GotTimings = {
+ start: row.timing_start ?? 0,
+ socket: row.timing_socket ?? 0,
+ lookup: row.timing_lookup ?? 0,
+ connect: row.timing_connect ?? 0,
+ secureConnect: row.timing_secure_connect ?? 0,
+ upload: row.timing_upload ?? 0,
+ response: row.timing_response ?? 0,
+ end: row.timing_end ?? 0,
+ phases: {
+ wait: row.phase_wait ?? 0,
+ dns: row.phase_dns ?? 0,
+ tcp: row.phase_tcp ?? 0,
+ tls: row.phase_tls ?? 0,
+ request: row.phase_request ?? 0,
+ firstByte: row.phase_first_byte ?? 0,
+ download: row.phase_download ?? 0,
+ total: row.phase_total ?? 0,
+ },
+ };
+
+ const cpu: CheckCpuInfo = {
+ physical_core: row.cpu_physical_core ?? 0,
+ logical_core: row.cpu_logical_core ?? 0,
+ frequency: row.cpu_frequency ?? 0,
+ current_frequency: row.cpu_current_frequency ?? 0,
+ temperature: row.cpu_temperature ?? [],
+ free_percent: row.cpu_free_percent ?? 0,
+ usage_percent: row.cpu_usage_percent ?? 0,
+ };
+
+ const memory: CheckMemoryInfo = {
+ total_bytes: Number(row.mem_total_bytes ?? 0),
+ available_bytes: Number(row.mem_available_bytes ?? 0),
+ used_bytes: Number(row.mem_used_bytes ?? 0),
+ usage_percent: row.mem_usage_percent ?? 0,
+ };
+
+ const host: CheckHostInfo = {
+ os: row.host_os ?? "",
+ platform: row.host_platform ?? "",
+ kernel_version: row.host_kernel_version ?? "",
+ pretty_name: row.host_pretty_name ?? "",
+ };
+
+ const capture: CheckCaptureInfo = {
+ version: row.capture_version ?? "",
+ mode: row.capture_mode ?? "",
+ };
+
+ const audits: CheckAudits | undefined =
+ row.audit_cls_score !== null
+ ? {
+ cls: { score: row.audit_cls_score, numericValue: row.audit_cls_value, displayValue: row.audit_cls_display },
+ si: { score: row.audit_si_score, numericValue: row.audit_si_value, displayValue: row.audit_si_display },
+ fcp: { score: row.audit_fcp_score, numericValue: row.audit_fcp_value, displayValue: row.audit_fcp_display },
+ lcp: { score: row.audit_lcp_score, numericValue: row.audit_lcp_value, displayValue: row.audit_lcp_display },
+ tbt: { score: row.audit_tbt_score, numericValue: row.audit_tbt_value, displayValue: row.audit_tbt_display },
+ }
+ : undefined;
+
+ return {
+ id: row.id,
+ metadata: {
+ monitorId: row.monitor_id,
+ teamId: row.team_id,
+ type: row.monitor_type,
+ },
+ status: row.status ?? false,
+ responseTime: row.response_time ?? 0,
+ timings,
+ statusCode: row.status_code ?? 0,
+ message: row.message ?? "",
+ cpu,
+ memory,
+ disk: disk ?? [],
+ host,
+ errors: errors ?? [],
+ capture,
+ net: net ?? [],
+ accessibility: row.lighthouse_accessibility ?? undefined,
+ bestPractices: row.lighthouse_best_practices ?? undefined,
+ seo: row.lighthouse_seo ?? undefined,
+ performance: row.lighthouse_performance ?? undefined,
+ audits,
+ createdAt: row.created_at.toISOString(),
+ updatedAt: row.updated_at.toISOString(),
+ };
+ };
+}
diff --git a/server/src/repositories/dlq/IDLQRepository.ts b/server/src/repositories/dlq/IDLQRepository.ts
new file mode 100644
index 0000000000..5e26e6096d
--- /dev/null
+++ b/server/src/repositories/dlq/IDLQRepository.ts
@@ -0,0 +1,30 @@
+import type { DLQItem, DLQItemType, DLQItemStatus } from "@/types/index.js";
+
+export interface DLQQueryFilters {
+ type?: DLQItemType;
+ status?: DLQItemStatus;
+ page: number;
+ rowsPerPage: number;
+}
+
+export interface DLQStatusCount {
+ status: DLQItemStatus;
+ type: DLQItemType;
+ count: number;
+}
+
+export interface IDLQRepository {
+ // create
+ create(item: Partial): Promise;
+ // fetch
+ findById(id: string): Promise;
+ findByTeamId(teamId: string, filters: DLQQueryFilters): Promise;
+ findRetryable(limit: number): Promise;
+ countByTeamId(teamId: string): Promise;
+ countByTeamIdGrouped(teamId: string): Promise;
+ // update
+ updateById(id: string, patch: Partial): Promise;
+ // delete
+ deleteById(id: string, teamId: string): Promise;
+ deleteOlderThan(date: Date): Promise;
+}
diff --git a/server/src/repositories/dlq/MongoDLQRepository.ts b/server/src/repositories/dlq/MongoDLQRepository.ts
new file mode 100644
index 0000000000..8c9da76ad7
--- /dev/null
+++ b/server/src/repositories/dlq/MongoDLQRepository.ts
@@ -0,0 +1,139 @@
+import { DLQItemModel } from "@/db/models/index.js";
+import type { DLQItemDocument } from "@/db/models/DLQItem.js";
+import type { DLQItem } from "@/types/index.js";
+import type { IDLQRepository, DLQQueryFilters, DLQStatusCount } from "@/repositories/dlq/IDLQRepository.js";
+import mongoose from "mongoose";
+import { AppError } from "@/utils/AppError.js";
+
+class MongoDLQRepository implements IDLQRepository {
+ private toStringId = (value?: mongoose.Types.ObjectId | string | null): string => {
+ if (!value) {
+ return "";
+ }
+ return value instanceof mongoose.Types.ObjectId ? value.toString() : String(value);
+ };
+
+ private toDateString = (value?: Date | string | null): string => {
+ if (!value) {
+ return new Date(0).toISOString();
+ }
+ return value instanceof Date ? value.toISOString() : new Date(value).toISOString();
+ };
+
+ protected toEntity = (doc: DLQItemDocument): DLQItem => {
+ return {
+ id: this.toStringId(doc._id),
+ type: doc.type,
+ status: doc.status,
+ payload: doc.payload,
+ monitorId: this.toStringId(doc.monitorId),
+ teamId: this.toStringId(doc.teamId),
+ retryCount: doc.retryCount,
+ maxRetries: doc.maxRetries,
+ lastError: doc.lastError,
+ nextRetryAt: this.toDateString(doc.nextRetryAt),
+ createdAt: this.toDateString(doc.createdAt),
+ updatedAt: this.toDateString(doc.updatedAt),
+ };
+ };
+
+ protected mapDocuments = (documents: DLQItemDocument[] | DLQItemDocument | null): DLQItem[] => {
+ if (!documents) {
+ return [];
+ }
+ if (Array.isArray(documents)) {
+ return documents.map((doc) => this.toEntity(doc));
+ }
+ return [this.toEntity(documents)];
+ };
+
+ async create(item: Partial): Promise {
+ const newItem = await DLQItemModel.create(item);
+ return this.toEntity(newItem);
+ }
+
+ findById = async (id: string): Promise => {
+ const item = await DLQItemModel.findById(new mongoose.Types.ObjectId(id));
+ return item ? this.toEntity(item) : null;
+ };
+
+ findByTeamId = async (teamId: string, filters: DLQQueryFilters): Promise => {
+ const query: Record = {
+ teamId: new mongoose.Types.ObjectId(teamId),
+ };
+ if (filters.type) {
+ query.type = filters.type;
+ }
+ if (filters.status) {
+ query.status = filters.status;
+ }
+
+ const items = await DLQItemModel.find(query)
+ .sort({ createdAt: -1 })
+ .skip(filters.page * filters.rowsPerPage)
+ .limit(filters.rowsPerPage);
+ return this.mapDocuments(items);
+ };
+
+ findRetryable = async (limit: number): Promise => {
+ const items = await DLQItemModel.find({
+ status: { $in: ["pending", "retrying"] },
+ nextRetryAt: { $lte: new Date() },
+ })
+ .sort({ nextRetryAt: 1 })
+ .limit(limit);
+ return this.mapDocuments(items);
+ };
+
+ countByTeamId = async (teamId: string): Promise => {
+ return DLQItemModel.countDocuments({
+ teamId: new mongoose.Types.ObjectId(teamId),
+ });
+ };
+
+ countByTeamIdGrouped = async (teamId: string): Promise => {
+ const results = await DLQItemModel.aggregate([
+ { $match: { teamId: new mongoose.Types.ObjectId(teamId) } },
+ {
+ $group: {
+ _id: { status: "$status", type: "$type" },
+ count: { $sum: 1 },
+ },
+ },
+ ]);
+ return results.map((r) => ({
+ status: r._id.status,
+ type: r._id.type,
+ count: r.count,
+ }));
+ };
+
+ updateById = async (id: string, patch: Partial): Promise => {
+ const updated = await DLQItemModel.findOneAndUpdate(
+ { _id: new mongoose.Types.ObjectId(id) },
+ { $set: { ...patch } },
+ { new: true, runValidators: true }
+ );
+ if (!updated) {
+ throw new AppError({ message: `DLQ item with id ${id} not found`, status: 404 });
+ }
+ return this.toEntity(updated);
+ };
+
+ deleteById = async (id: string, teamId: string): Promise => {
+ const result = await DLQItemModel.deleteOne({
+ _id: new mongoose.Types.ObjectId(id),
+ teamId: new mongoose.Types.ObjectId(teamId),
+ });
+ return result.deletedCount || 0;
+ };
+
+ deleteOlderThan = async (date: Date): Promise => {
+ const result = await DLQItemModel.deleteMany({
+ createdAt: { $lt: date },
+ });
+ return result.deletedCount || 0;
+ };
+}
+
+export default MongoDLQRepository;
diff --git a/server/src/repositories/geo-checks/TimescaleGeoChecksRepository.ts b/server/src/repositories/geo-checks/TimescaleGeoChecksRepository.ts
new file mode 100644
index 0000000000..e4528f259e
--- /dev/null
+++ b/server/src/repositories/geo-checks/TimescaleGeoChecksRepository.ts
@@ -0,0 +1,274 @@
+import type { Pool } from "pg";
+import type { IGeoChecksRepository, FlatGeoChecksQueryResult } from "./IGeoChecksRepository.js";
+import type { GeoCheck, GeoCheckResult, GroupedGeoCheck, GeoContinent, FlatGeoCheck, MonitorType } from "@/types/index.js";
+import { getDateForRange } from "@/utils/dataUtils.js";
+
+const dateStringToBucket = (dateString: string): string => {
+ if (dateString.includes("%M")) return "1 minute";
+ if (dateString.includes("%H")) return "1 hour";
+ return "1 day";
+};
+
+export class TimescaleGeoChecksRepository implements IGeoChecksRepository {
+ constructor(private pool: Pool) {}
+
+ createGeoChecks = async (geoChecks: Omit[]): Promise => {
+ const created: GeoCheck[] = [];
+
+ for (const geoCheck of geoChecks) {
+ const geoResult = await this.pool.query(
+ `INSERT INTO geo_checks (monitor_id, team_id, monitor_type, expiry)
+ VALUES ($1, $2, $3, $4)
+ RETURNING id, monitor_id, team_id, monitor_type, expiry, created_at, updated_at`,
+ [geoCheck.metadata.monitorId, geoCheck.metadata.teamId, geoCheck.metadata.type, geoCheck.expiry ? new Date(geoCheck.expiry) : null]
+ );
+ const row = geoResult.rows[0];
+ if (!row) continue;
+
+ for (const result of geoCheck.results) {
+ await this.pool.query(
+ `INSERT INTO geo_check_results (
+ geo_check_id, geo_check_created_at,
+ status, status_code,
+ location_continent, location_region, location_country, location_state, location_city,
+ location_longitude, location_latitude,
+ timing_total, timing_dns, timing_tcp, timing_tls, timing_first_byte, timing_download
+ ) VALUES ($1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11,$12,$13,$14,$15,$16,$17)`,
+ [
+ row.id,
+ row.created_at,
+ result.status,
+ result.statusCode,
+ result.location.continent,
+ result.location.region,
+ result.location.country,
+ result.location.state,
+ result.location.city,
+ result.location.longitude,
+ result.location.latitude,
+ result.timings.total,
+ result.timings.dns,
+ result.timings.tcp,
+ result.timings.tls,
+ result.timings.firstByte,
+ result.timings.download,
+ ]
+ );
+ }
+
+ created.push(this.toGeoCheck(row, geoCheck.results));
+ }
+
+ return created;
+ };
+
+ findByMonitorId = async (
+ monitorId: string,
+ sortOrder: string,
+ dateRange: string,
+ page: number,
+ rowsPerPage: number,
+ continents?: GeoContinent[]
+ ): Promise => {
+ const conditions: string[] = ["gc.monitor_id = $1"];
+ const values: unknown[] = [monitorId];
+ let paramIndex = 2;
+
+ const rangeDate = getDateForRange(dateRange);
+ if (rangeDate) {
+ conditions.push(`gc.created_at >= $${paramIndex++}`);
+ values.push(rangeDate);
+ }
+
+ if (continents && continents.length > 0) {
+ conditions.push(`r.location_continent = ANY($${paramIndex++})`);
+ values.push(continents);
+ }
+
+ const where = conditions.join(" AND ");
+ const direction = sortOrder === "asc" ? "ASC" : "DESC";
+ const offset = page && rowsPerPage ? page * rowsPerPage : 0;
+
+ const countValues = [...values];
+ const dataValues = [...values, rowsPerPage, offset];
+
+ const [countResult, dataResult] = await Promise.all([
+ this.pool.query(
+ `SELECT COUNT(*)::int AS count
+ FROM geo_checks gc
+ JOIN geo_check_results r ON r.geo_check_id = gc.id
+ WHERE ${where}`,
+ countValues
+ ),
+ this.pool.query(
+ `SELECT gc.id, gc.monitor_id, gc.team_id, gc.monitor_type,
+ r.location_continent, r.location_region, r.location_country, r.location_state, r.location_city,
+ r.location_longitude, r.location_latitude,
+ r.status, r.status_code,
+ r.timing_total, r.timing_dns, r.timing_tcp, r.timing_tls, r.timing_first_byte, r.timing_download,
+ gc.created_at, gc.updated_at
+ FROM geo_checks gc
+ JOIN geo_check_results r ON r.geo_check_id = gc.id
+ WHERE ${where}
+ ORDER BY gc.created_at ${direction}
+ LIMIT $${paramIndex++} OFFSET $${paramIndex}`,
+ dataValues
+ ),
+ ]);
+
+ const geoChecks: FlatGeoCheck[] = dataResult.rows.map((row) => ({
+ id: `${row.monitor_id}-${new Date(row.created_at).getTime()}-${row.location_continent}-${row.location_city}-${row.id.substring(0, 8)}`,
+ monitorId: row.monitor_id,
+ teamId: row.team_id,
+ type: row.monitor_type,
+ location: {
+ continent: row.location_continent,
+ region: row.location_region,
+ country: row.location_country,
+ state: row.location_state,
+ city: row.location_city,
+ longitude: row.location_longitude,
+ latitude: row.location_latitude,
+ },
+ status: row.status,
+ statusCode: row.status_code,
+ timings: {
+ total: row.timing_total ?? 0,
+ dns: row.timing_dns ?? 0,
+ tcp: row.timing_tcp ?? 0,
+ tls: row.timing_tls ?? 0,
+ firstByte: row.timing_first_byte ?? 0,
+ download: row.timing_download ?? 0,
+ },
+ createdAt: row.created_at.toISOString(),
+ updatedAt: row.updated_at.toISOString(),
+ }));
+
+ return { geoChecksCount: countResult.rows[0].count, geoChecks };
+ };
+
+ findByMonitorIdAndDateRange = async (monitorId: string, startDate: Date, endDate: Date): Promise => {
+ const geoRows = await this.pool.query(
+ `SELECT id, monitor_id, team_id, monitor_type, expiry, created_at, updated_at
+ FROM geo_checks
+ WHERE monitor_id = $1 AND created_at >= $2 AND created_at <= $3
+ ORDER BY created_at DESC`,
+ [monitorId, startDate, endDate]
+ );
+
+ const geoChecks: GeoCheck[] = [];
+ for (const row of geoRows.rows) {
+ const resultsRows = await this.pool.query(
+ `SELECT status, status_code,
+ location_continent, location_region, location_country, location_state, location_city,
+ location_longitude, location_latitude,
+ timing_total, timing_dns, timing_tcp, timing_tls, timing_first_byte, timing_download
+ FROM geo_check_results
+ WHERE geo_check_id = $1`,
+ [row.id]
+ );
+
+ const results = resultsRows.rows.map(this.toGeoCheckResult);
+ geoChecks.push(this.toGeoCheck(row, results));
+ }
+
+ return geoChecks;
+ };
+
+ findGroupedByMonitorIdAndDateRange = async (
+ monitorId: string,
+ startDate: Date,
+ endDate: Date,
+ dateFormat: string,
+ continents?: GeoContinent[]
+ ): Promise => {
+ const bucket = dateStringToBucket(dateFormat);
+
+ const conditions: string[] = ["gc.monitor_id = $2", "gc.created_at >= $3", "gc.created_at <= $4"];
+ const values: unknown[] = [bucket, monitorId, startDate, endDate];
+ let paramIndex = 5;
+
+ if (continents && continents.length > 0) {
+ conditions.push(`r.location_continent = ANY($${paramIndex++})`);
+ values.push(continents);
+ }
+
+ const result = await this.pool.query(
+ `SELECT
+ time_bucket($1::interval, gc.created_at) AS bucket_date,
+ r.location_continent AS continent,
+ ROUND(AVG(r.timing_total)::numeric, 2) AS "avgResponseTime",
+ COUNT(*)::int AS "totalChecks",
+ ROUND((100.0 * COUNT(*) FILTER (WHERE r.status = TRUE) / COUNT(*))::numeric, 2) AS "uptimePercentage"
+ FROM geo_checks gc
+ JOIN geo_check_results r ON r.geo_check_id = gc.id
+ WHERE ${conditions.join(" AND ")}
+ GROUP BY bucket_date, r.location_continent
+ ORDER BY bucket_date, r.location_continent`,
+ values
+ );
+
+ return result.rows.map((row) => ({
+ bucketDate: (row.bucket_date as Date).toISOString(),
+ continent: row.continent as GeoContinent,
+ avgResponseTime: Number(row.avgResponseTime ?? 0),
+ totalChecks: Number(row.totalChecks ?? 0),
+ uptimePercentage: Number(row.uptimePercentage ?? 0),
+ }));
+ };
+
+ deleteByMonitorId = async (monitorId: string): Promise => {
+ const result = await this.pool.query(`DELETE FROM geo_checks WHERE monitor_id = $1`, [monitorId]);
+ return result.rowCount ?? 0;
+ };
+
+ deleteByTeamId = async (teamId: string): Promise => {
+ const result = await this.pool.query(`DELETE FROM geo_checks WHERE team_id = $1`, [teamId]);
+ return result.rowCount ?? 0;
+ };
+
+ deleteByMonitorIdsNotIn = async (monitorIds: string[]): Promise => {
+ if (!monitorIds.length) {
+ const result = await this.pool.query(`DELETE FROM geo_checks`);
+ return result.rowCount ?? 0;
+ }
+ const result = await this.pool.query(`DELETE FROM geo_checks WHERE monitor_id != ALL($1)`, [monitorIds]);
+ return result.rowCount ?? 0;
+ };
+
+ private toGeoCheckResult = (row: Record): GeoCheckResult => ({
+ location: {
+ continent: (row.location_continent as GeoContinent) ?? "",
+ region: (row.location_region as string) ?? "",
+ country: (row.location_country as string) ?? "",
+ state: (row.location_state as string) ?? "",
+ city: (row.location_city as string) ?? "",
+ longitude: (row.location_longitude as number) ?? 0,
+ latitude: (row.location_latitude as number) ?? 0,
+ },
+ status: (row.status as boolean) ?? false,
+ statusCode: (row.status_code as number) ?? 0,
+ timings: {
+ total: (row.timing_total as number) ?? 0,
+ dns: (row.timing_dns as number) ?? 0,
+ tcp: (row.timing_tcp as number) ?? 0,
+ tls: (row.timing_tls as number) ?? 0,
+ firstByte: (row.timing_first_byte as number) ?? 0,
+ download: (row.timing_download as number) ?? 0,
+ },
+ });
+
+ private toGeoCheck = (row: Record, results: GeoCheckResult[]): GeoCheck => ({
+ id: row.id as string,
+ metadata: {
+ monitorId: row.monitor_id as string,
+ teamId: row.team_id as string,
+ type: row.monitor_type as MonitorType,
+ },
+ results,
+ expiry: row.expiry ? (row.expiry as Date).toISOString() : new Date(0).toISOString(),
+ __v: 0,
+ createdAt: (row.created_at as Date).toISOString(),
+ updatedAt: (row.updated_at as Date).toISOString(),
+ });
+}
diff --git a/server/src/repositories/incidents/MongoIncidentRepository.ts b/server/src/repositories/incidents/MongoIncidentsRepository.ts
similarity index 98%
rename from server/src/repositories/incidents/MongoIncidentRepository.ts
rename to server/src/repositories/incidents/MongoIncidentsRepository.ts
index 096ba3d37b..e24551462f 100644
--- a/server/src/repositories/incidents/MongoIncidentRepository.ts
+++ b/server/src/repositories/incidents/MongoIncidentsRepository.ts
@@ -5,7 +5,7 @@ import type { IIncidentsRepository } from "@/repositories/index.js";
import mongoose from "mongoose";
import { AppError } from "@/utils/AppError.js";
-class MongoIncidentRepository implements IIncidentsRepository {
+class MongoIncidentsRepository implements IIncidentsRepository {
private toStringId = (value?: mongoose.Types.ObjectId | string | null): string => {
if (!value) {
return "";
@@ -288,4 +288,4 @@ class MongoIncidentRepository implements IIncidentsRepository {
return result.deletedCount ?? 0;
};
}
-export default MongoIncidentRepository;
+export default MongoIncidentsRepository;
diff --git a/server/src/repositories/incidents/TimescaleIncidentsRepository.ts b/server/src/repositories/incidents/TimescaleIncidentsRepository.ts
new file mode 100644
index 0000000000..8a6ad7d22e
--- /dev/null
+++ b/server/src/repositories/incidents/TimescaleIncidentsRepository.ts
@@ -0,0 +1,294 @@
+import type { Pool } from "pg";
+import type { Incident, IncidentSummary, IncidentResolutionType } from "@/types/incident.js";
+import type { IIncidentsRepository } from "@/repositories/incidents/IIncidentsRepository.js";
+import { AppError } from "@/utils/AppError.js";
+
+interface IncidentRow {
+ id: string;
+ monitor_id: string;
+ team_id: string;
+ start_time: Date;
+ end_time: Date | null;
+ status: boolean;
+ message: string | null;
+ status_code: number | null;
+ resolution_type: IncidentResolutionType;
+ resolved_by: string | null;
+ resolved_by_email: string | null;
+ comment: string | null;
+ created_at: Date;
+ updated_at: Date;
+}
+
+const COLUMNS = `id, monitor_id, team_id, start_time, end_time, status, message, status_code,
+ resolution_type, resolved_by, resolved_by_email, comment, created_at, updated_at`;
+
+export class TimescaleIncidentsRepository implements IIncidentsRepository {
+ constructor(private pool: Pool) {}
+
+ create = async (incident: Partial): Promise => {
+ const result = await this.pool.query(
+ `INSERT INTO incidents (monitor_id, team_id, start_time, end_time, status, message, status_code, resolution_type, resolved_by, resolved_by_email, comment)
+ VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11)
+ RETURNING ${COLUMNS}`,
+ [
+ incident.monitorId,
+ incident.teamId,
+ incident.startTime ? new Date(Number(incident.startTime) || incident.startTime) : new Date(),
+ incident.endTime ? new Date(Number(incident.endTime) || incident.endTime) : null,
+ incident.status ?? true,
+ incident.message ?? null,
+ incident.statusCode ?? null,
+ incident.resolutionType ?? null,
+ incident.resolvedBy ?? null,
+ incident.resolvedByEmail ?? null,
+ incident.comment ?? null,
+ ]
+ );
+ const row = result.rows[0];
+ if (!row) {
+ throw new AppError({ message: "Failed to create incident", status: 500 });
+ }
+ return this.toEntity(row);
+ };
+
+ findById = async (incidentId: string, teamId: string): Promise => {
+ const result = await this.pool.query(`SELECT ${COLUMNS} FROM incidents WHERE id = $1 AND team_id = $2`, [incidentId, teamId]);
+ const row = result.rows[0];
+ if (!row) {
+ throw new AppError({ message: `Incident with id ${incidentId} not found`, status: 404 });
+ }
+ return this.toEntity(row);
+ };
+
+ findActiveByIncidentId = async (incidentId: string, teamId: string): Promise => {
+ const result = await this.pool.query(`SELECT ${COLUMNS} FROM incidents WHERE id = $1 AND team_id = $2 AND status = TRUE`, [
+ incidentId,
+ teamId,
+ ]);
+ const row = result.rows[0];
+ return row ? this.toEntity(row) : null;
+ };
+
+ findActiveByMonitorId = async (monitorId: string, teamId: string): Promise => {
+ const result = await this.pool.query(`SELECT ${COLUMNS} FROM incidents WHERE monitor_id = $1 AND team_id = $2 AND status = TRUE`, [
+ monitorId,
+ teamId,
+ ]);
+ const row = result.rows[0];
+ return row ? this.toEntity(row) : null;
+ };
+
+ findByTeamId = async (
+ teamId: string,
+ startDate: Date | undefined,
+ page: number,
+ rowsPerPage: number,
+ sortOrder?: string,
+ status?: boolean,
+ monitorId?: string,
+ resolutionType?: string
+ ): Promise => {
+ const { conditions, values, paramIndex } = this.buildWhere(teamId, startDate, status, monitorId, resolutionType);
+ const direction = sortOrder === "asc" ? "ASC" : "DESC";
+ const offset = page * rowsPerPage;
+
+ const result = await this.pool.query(
+ `SELECT ${COLUMNS} FROM incidents
+ WHERE ${conditions.join(" AND ")}
+ ORDER BY created_at ${direction}
+ LIMIT $${paramIndex} OFFSET $${paramIndex + 1}`,
+ [...values, rowsPerPage, offset]
+ );
+ return result.rows.map(this.toEntity);
+ };
+
+ countByTeamId = async (
+ teamId: string,
+ startDate: Date | undefined,
+ status?: boolean,
+ monitorId?: string,
+ resolutionType?: string
+ ): Promise => {
+ const { conditions, values } = this.buildWhere(teamId, startDate, status, monitorId, resolutionType);
+ const result = await this.pool.query(`SELECT COUNT(*)::int AS count FROM incidents WHERE ${conditions.join(" AND ")}`, values);
+ return result.rows[0].count;
+ };
+
+ findSummaryByTeamId = async (teamId: string, limit?: number): Promise => {
+ // Counts by status and resolution type
+ const countsResult = await this.pool.query(
+ `SELECT
+ COUNT(*)::int AS total,
+ COUNT(*) FILTER (WHERE status = TRUE)::int AS active,
+ COUNT(*) FILTER (WHERE resolution_type = 'manual')::int AS manual,
+ COUNT(*) FILTER (WHERE resolution_type = 'automatic')::int AS automatic
+ FROM incidents WHERE team_id = $1`,
+ [teamId]
+ );
+ const counts = countsResult.rows[0] ?? { total: 0, active: 0, manual: 0, automatic: 0 };
+
+ // Average resolution time
+ const resTimeResult = await this.pool.query(
+ `SELECT AVG(EXTRACT(EPOCH FROM (end_time - start_time))) AS avg_seconds
+ FROM incidents
+ WHERE team_id = $1 AND status = FALSE AND end_time IS NOT NULL`,
+ [teamId]
+ );
+ const avgSeconds = resTimeResult.rows[0]?.avg_seconds ?? 0;
+ const avgResolutionTimeHours = Math.round((avgSeconds / 3600) * 100) / 100;
+
+ // Top monitor by incident count
+ const topMonitorResult = await this.pool.query(
+ `SELECT i.monitor_id, m.name AS monitor_name, COUNT(*)::int AS count
+ FROM incidents i
+ LEFT JOIN monitors m ON m.id = i.monitor_id
+ WHERE i.team_id = $1
+ GROUP BY i.monitor_id, m.name
+ ORDER BY count DESC
+ LIMIT 1`,
+ [teamId]
+ );
+
+ // Latest incidents
+ const latestLimit = Math.max(1, Number.isFinite(Number(limit)) ? Number(limit) : 10);
+ const latestResult = await this.pool.query(
+ `SELECT i.id, i.monitor_id, m.name AS monitor_name, i.status, i.start_time, i.end_time,
+ i.resolution_type, i.message, i.status_code, i.created_at
+ FROM incidents i
+ LEFT JOIN monitors m ON m.id = i.monitor_id
+ WHERE i.team_id = $1
+ ORDER BY i.created_at DESC
+ LIMIT $2`,
+ [teamId, latestLimit]
+ );
+
+ const topRow = topMonitorResult.rows[0];
+
+ return {
+ total: counts.total,
+ totalActive: counts.active,
+ totalManualResolutions: counts.manual,
+ totalAutomaticResolutions: counts.automatic,
+ avgResolutionTimeHours,
+ topMonitor: topRow
+ ? {
+ monitorId: topRow.monitor_id,
+ monitorName: topRow.monitor_name ?? null,
+ incidentCount: topRow.count,
+ }
+ : null,
+ latestIncidents: latestResult.rows.map((row) => ({
+ id: row.id,
+ monitorId: row.monitor_id,
+ monitorName: row.monitor_name ?? null,
+ status: row.status,
+ startTime: row.start_time.toISOString(),
+ endTime: row.end_time ? row.end_time.toISOString() : null,
+ resolutionType: row.resolution_type ?? null,
+ message: row.message ?? null,
+ statusCode: row.status_code ?? null,
+ createdAt: row.created_at.toISOString(),
+ })),
+ };
+ };
+
+ updateById = async (incidentId: string, teamId: string, patch: Partial): Promise => {
+ const sets: string[] = [];
+ const values: unknown[] = [];
+ let paramIndex = 1;
+
+ const fieldMap: [keyof Incident, string][] = [
+ ["status", "status"],
+ ["message", "message"],
+ ["statusCode", "status_code"],
+ ["endTime", "end_time"],
+ ["resolutionType", "resolution_type"],
+ ["resolvedBy", "resolved_by"],
+ ["resolvedByEmail", "resolved_by_email"],
+ ["comment", "comment"],
+ ];
+
+ for (const [key, column] of fieldMap) {
+ if (patch[key] !== undefined) {
+ const value = key === "endTime" && patch[key] ? new Date(Number(patch[key]) || (patch[key] as string)) : patch[key];
+ sets.push(`${column} = $${paramIndex++}`);
+ values.push(value);
+ }
+ }
+
+ if (sets.length === 0) {
+ return this.findById(incidentId, teamId);
+ }
+
+ sets.push(`updated_at = NOW()`);
+ values.push(incidentId, teamId);
+
+ const result = await this.pool.query(
+ `UPDATE incidents SET ${sets.join(", ")} WHERE id = $${paramIndex++} AND team_id = $${paramIndex}
+ RETURNING ${COLUMNS}`,
+ values
+ );
+ const row = result.rows[0];
+ if (!row) {
+ throw new AppError({ message: `Failed to update incident with id ${incidentId}`, status: 500 });
+ }
+ return this.toEntity(row);
+ };
+
+ deleteByMonitorId = async (monitorId: string, teamId: string): Promise => {
+ const result = await this.pool.query(`DELETE FROM incidents WHERE monitor_id = $1 AND team_id = $2`, [monitorId, teamId]);
+ return result.rowCount ?? 0;
+ };
+
+ deleteByMonitorIdsNotIn = async (monitorIds: string[]): Promise => {
+ if (!monitorIds.length) {
+ const result = await this.pool.query(`DELETE FROM incidents`);
+ return result.rowCount ?? 0;
+ }
+ const result = await this.pool.query(`DELETE FROM incidents WHERE monitor_id != ALL($1)`, [monitorIds]);
+ return result.rowCount ?? 0;
+ };
+
+ private buildWhere = (teamId: string, startDate: Date | undefined, status?: boolean, monitorId?: string, resolutionType?: string) => {
+ const conditions: string[] = ["team_id = $1"];
+ const values: unknown[] = [teamId];
+ let paramIndex = 2;
+
+ if (startDate) {
+ conditions.push(`created_at >= $${paramIndex++}`);
+ values.push(startDate);
+ }
+ if (status !== undefined) {
+ conditions.push(`status = $${paramIndex++}`);
+ values.push(status);
+ }
+ if (monitorId) {
+ conditions.push(`monitor_id = $${paramIndex++}`);
+ values.push(monitorId);
+ }
+ if (resolutionType) {
+ conditions.push(`resolution_type = $${paramIndex++}`);
+ values.push(resolutionType);
+ }
+
+ return { conditions, values, paramIndex };
+ };
+
+ private toEntity = (row: IncidentRow): Incident => ({
+ id: row.id,
+ monitorId: row.monitor_id,
+ teamId: row.team_id,
+ startTime: row.start_time.toISOString(),
+ endTime: row.end_time ? row.end_time.toISOString() : null,
+ status: row.status,
+ message: row.message ?? null,
+ statusCode: row.status_code ?? null,
+ resolutionType: row.resolution_type ?? null,
+ resolvedBy: row.resolved_by ?? null,
+ resolvedByEmail: row.resolved_by_email ?? null,
+ comment: row.comment ?? null,
+ createdAt: row.created_at.toISOString(),
+ updatedAt: row.updated_at.toISOString(),
+ });
+}
diff --git a/server/src/repositories/index.ts b/server/src/repositories/index.ts
index c1d8c2ecff..84a9a7cdad 100644
--- a/server/src/repositories/index.ts
+++ b/server/src/repositories/index.ts
@@ -1,38 +1,54 @@
export * from "@/repositories/monitors/IMonitorsRepository.js";
export { default as MongoMonitorsRepository } from "@/repositories/monitors/MongoMonitorsRepository.js";
+export { TimescaleMonitorsRepository } from "@/repositories/monitors/TimescaleMonitorsRepository.js";
export * from "@/repositories/checks/IChecksRepository.js";
export { default as MongoChecksRepository } from "@/repositories/checks/MongoChecksRepistory.js";
+export { TimescaleChecksRepository } from "@/repositories/checks/TimescaleChecksRepository.js";
export * from "@/repositories/monitor-stats/IMonitorStatsRepository.js";
export { default as MongoMonitorStatsRepository } from "@/repositories/monitor-stats/MongoMonitorStatsRepository.js";
+export { TimescaleMonitorStatsRepository } from "@/repositories/monitor-stats/TimescaleMonitorStatsRepository.js";
export * from "@/repositories/status-pages/IStatusPagesRepository.js";
export { default as MongoStatusPagesRepository } from "@/repositories/status-pages/MongoStatusPagesRepository.js";
+export { TimescaleStatusPagesRepository } from "@/repositories/status-pages/TimescaleStatusPagesRepository.js";
export * from "@/repositories/users/IUsersRepository.js";
export { default as MongoUsersRepository } from "@/repositories/users/MongoUsersRepository.js";
+export { TimescaleUsersRepository } from "@/repositories/users/TimescaleUsersRepository.js";
export * from "@/repositories/invites/IInvitesRepository.js";
export { default as MongoInvitesRepository } from "@/repositories/invites/MongoInviteRepository.js";
+export { TimescaleInvitesRepository } from "@/repositories/invites/TimescaleInvitesRepository.js";
export * from "@/repositories/recovery-tokens/IRecoveryTokensRepository.js";
export { default as MongoRecoveryTokensRepository } from "@/repositories/recovery-tokens/MongoRecoveryTokensRepository.js";
+export { TimescaleRecoveryTokensRepository } from "@/repositories/recovery-tokens/TimescaleRecoveryTokensRepository.js";
export * from "@/repositories/settings/ISettingsRepository.js";
export { default as MongoSettingsRepository } from "@/repositories/settings/MongoSettingsRepository.js";
+export { TimescaleSettingsRepository } from "@/repositories/settings/TimescaleSettingsRepository.js";
export * from "@/repositories/notifications/INotificationsRepository.js";
export { default as MongoNotificationsRepository } from "@/repositories/notifications/MongoNotificationsRepository.js";
+export { TimescaleNotificationsRepository } from "@/repositories/notifications/TimescaleNotificationsRepository.js";
export * from "@/repositories/incidents/IIncidentsRepository.js";
-export { default as MongoIncidentRepository } from "@/repositories/incidents/MongoIncidentRepository.js";
+export { default as MongoIncidentsRepository } from "@/repositories/incidents/MongoIncidentsRepository.js";
+export { TimescaleIncidentsRepository } from "@/repositories/incidents/TimescaleIncidentsRepository.js";
export * from "@/repositories/teams/ITeamsRepository.js";
export { default as MongoTeamsRepository } from "@/repositories/teams/MongoTeamsRepository.js";
+export { TimescaleTeamsRepository } from "@/repositories/teams/TimescaleTeamsRepository.js";
export * from "@/repositories/maintenance-windows/IMaintenanceWindowsRepository.js";
export { default as MongoMaintenanceWindowsRepository } from "@/repositories/maintenance-windows/MongoMaintenanceWindowsRepository.js";
+export { TimescaleMaintenanceWindowsRepository } from "@/repositories/maintenance-windows/TimescaleMaintenanceWindowsRepository.js";
export * from "@/repositories/geo-checks/IGeoChecksRepository.js";
export { default as MongoGeoChecksRepository } from "@/repositories/geo-checks/MongoGeoChecksRepository.js";
+
+export * from "@/repositories/dlq/IDLQRepository.js";
+export { default as MongoDLQRepository } from "@/repositories/dlq/MongoDLQRepository.js";
+export { TimescaleGeoChecksRepository } from "@/repositories/geo-checks/TimescaleGeoChecksRepository.js";
diff --git a/server/src/repositories/invites/TimescaleInvitesRepository.ts b/server/src/repositories/invites/TimescaleInvitesRepository.ts
new file mode 100644
index 0000000000..8530477457
--- /dev/null
+++ b/server/src/repositories/invites/TimescaleInvitesRepository.ts
@@ -0,0 +1,77 @@
+import type { Pool } from "pg";
+import crypto from "crypto";
+import type { IInvitesRepository } from "@/repositories/invites/IInvitesRepository.js";
+import type { Invite } from "@/types/invite.js";
+import type { UserRole } from "@/types/user.js";
+import { AppError } from "@/utils/AppError.js";
+
+const parsePostgresArray = (value: unknown): UserRole[] => {
+ if (typeof value !== "string") return [];
+ const inner = value.replace(/^\{|\}$/g, "");
+ if (inner === "") return [];
+ return inner.split(",") as UserRole[];
+};
+
+interface InviteRow {
+ id: string;
+ email: string;
+ team_id: string;
+ roles: UserRole[];
+ token: string;
+ expiry: Date | null;
+ created_at: Date;
+ updated_at: Date;
+}
+
+const COLUMNS = `id, email, team_id, roles, token, expiry, created_at, updated_at`;
+
+export class TimescaleInvitesRepository implements IInvitesRepository {
+ constructor(private pool: Pool) {}
+
+ create = async (invite: Partial): Promise => {
+ // Delete existing invites for this email
+ await this.pool.query(`DELETE FROM invites WHERE email = $1`, [invite.email]);
+
+ const token = crypto.randomBytes(32).toString("hex");
+ const result = await this.pool.query(
+ `INSERT INTO invites (email, team_id, roles, token, expiry)
+ VALUES ($1, $2, $3, $4, $5)
+ RETURNING ${COLUMNS}`,
+ [invite.email, invite.teamId, invite.role ?? ["user"], token, invite.expiry ? new Date(invite.expiry) : null]
+ );
+ const row = result.rows[0];
+ if (!row) {
+ throw new AppError({ message: "Failed to create invite", status: 500 });
+ }
+ return this.toEntity(row);
+ };
+
+ findByToken = async (token: string): Promise => {
+ const result = await this.pool.query(`SELECT ${COLUMNS} FROM invites WHERE token = $1`, [token]);
+ const row = result.rows[0];
+ if (!row) {
+ throw new AppError({ message: "Invite not found", status: 404 });
+ }
+ return this.toEntity(row);
+ };
+
+ findByTokenAndDelete = async (token: string): Promise => {
+ const result = await this.pool.query(`DELETE FROM invites WHERE token = $1 RETURNING ${COLUMNS}`, [token]);
+ const row = result.rows[0];
+ if (!row) {
+ throw new AppError({ message: "Invite not found", status: 404 });
+ }
+ return this.toEntity(row);
+ };
+
+ private toEntity = (row: InviteRow): Invite => ({
+ id: row.id,
+ email: row.email,
+ teamId: row.team_id,
+ role: Array.isArray(row.roles) ? row.roles : parsePostgresArray(row.roles),
+ token: row.token,
+ expiry: row.expiry ? row.expiry.toISOString() : new Date(0).toISOString(),
+ createdAt: row.created_at.toISOString(),
+ updatedAt: row.updated_at.toISOString(),
+ });
+}
diff --git a/server/src/repositories/maintenance-windows/TimescaleMaintenanceWindowsRepository.ts b/server/src/repositories/maintenance-windows/TimescaleMaintenanceWindowsRepository.ts
new file mode 100644
index 0000000000..cfe28198a1
--- /dev/null
+++ b/server/src/repositories/maintenance-windows/TimescaleMaintenanceWindowsRepository.ts
@@ -0,0 +1,197 @@
+import type { Pool } from "pg";
+import type { IMaintenanceWindowsRepository } from "./IMaintenanceWindowsRepository.js";
+import type { MaintenanceWindow, DurationUnit } from "@/types/maintenanceWindow.js";
+import { AppError } from "@/utils/AppError.js";
+
+interface MaintenanceWindowRow {
+ id: string;
+ monitor_id: string;
+ team_id: string;
+ active: boolean;
+ name: string;
+ duration: number;
+ duration_unit: DurationUnit;
+ repeat: number;
+ start_time: Date;
+ end_time: Date;
+ expiry: Date | null;
+ created_at: Date;
+ updated_at: Date;
+}
+
+const COLUMNS = `id, monitor_id, team_id, active, name, duration, duration_unit, repeat,
+ start_time, end_time, expiry, created_at, updated_at`;
+
+export class TimescaleMaintenanceWindowsRepository implements IMaintenanceWindowsRepository {
+ constructor(private pool: Pool) {}
+
+ create = async (data: Partial): Promise => {
+ const startTime = data.start ? new Date(data.start) : null;
+ const endTime = data.end ? new Date(data.end) : null;
+ // One-time windows expire at end time
+ const expiry = data.repeat === 0 ? endTime : null;
+
+ const result = await this.pool.query(
+ `INSERT INTO maintenance_windows (monitor_id, team_id, active, name, duration, duration_unit, repeat, start_time, end_time, expiry)
+ VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10)
+ RETURNING ${COLUMNS}`,
+ [
+ data.monitorId,
+ data.teamId,
+ data.active ?? true,
+ data.name ?? null,
+ data.duration ?? null,
+ data.durationUnit ?? null,
+ data.repeat ?? 0,
+ startTime,
+ endTime,
+ expiry,
+ ]
+ );
+ const row = result.rows[0];
+ if (!row) {
+ throw new AppError({ message: "Failed to create maintenance window", status: 500 });
+ }
+ return this.toEntity(row);
+ };
+
+ findById = async (id: string, teamId: string): Promise => {
+ const result = await this.pool.query(`SELECT ${COLUMNS} FROM maintenance_windows WHERE id = $1 AND team_id = $2`, [
+ id,
+ teamId,
+ ]);
+ const row = result.rows[0];
+ if (!row) {
+ throw new AppError({ message: "Maintenance Window not found", status: 404 });
+ }
+ return this.toEntity(row);
+ };
+
+ findByMonitorId = async (monitorId: string, teamId: string): Promise => {
+ const result = await this.pool.query(`SELECT ${COLUMNS} FROM maintenance_windows WHERE monitor_id = $1 AND team_id = $2`, [
+ monitorId,
+ teamId,
+ ]);
+ return result.rows.map(this.toEntity);
+ };
+
+ findByTeamId = async (
+ teamId: string,
+ page: number,
+ rowsPerPage: number,
+ field?: string,
+ order?: string,
+ active?: boolean
+ ): Promise => {
+ const conditions: string[] = ["team_id = $1"];
+ const values: unknown[] = [teamId];
+ let paramIndex = 2;
+
+ if (active !== undefined) {
+ conditions.push(`active = $${paramIndex++}`);
+ values.push(active);
+ }
+
+ const fieldMap: Record = {
+ createdAt: "created_at",
+ name: "name",
+ start: "start_time",
+ end: "end_time",
+ active: "active",
+ };
+ const sortColumn = field ? (fieldMap[field] ?? "created_at") : "created_at";
+ const sortDirection = order === "asc" ? "ASC" : "DESC";
+
+ const offset = page && rowsPerPage ? page * rowsPerPage : 0;
+
+ const result = await this.pool.query(
+ `SELECT ${COLUMNS} FROM maintenance_windows
+ WHERE ${conditions.join(" AND ")}
+ ORDER BY ${sortColumn} ${sortDirection}
+ LIMIT $${paramIndex++} OFFSET $${paramIndex}`,
+ [...values, rowsPerPage, offset]
+ );
+ return result.rows.map(this.toEntity);
+ };
+
+ updateById = async (id: string, teamId: string, patch: Partial): Promise => {
+ const sets: string[] = [];
+ const values: unknown[] = [];
+ let paramIndex = 1;
+
+ const fieldMap: [keyof MaintenanceWindow, string, boolean][] = [
+ ["active", "active", false],
+ ["name", "name", false],
+ ["duration", "duration", false],
+ ["durationUnit", "duration_unit", false],
+ ["repeat", "repeat", false],
+ ["start", "start_time", true],
+ ["end", "end_time", true],
+ ];
+
+ for (const [key, column, isDate] of fieldMap) {
+ if (patch[key] !== undefined) {
+ sets.push(`${column} = $${paramIndex++}`);
+ values.push(isDate ? new Date(patch[key] as string) : patch[key]);
+ }
+ }
+
+ if (sets.length === 0) {
+ return this.findById(id, teamId);
+ }
+
+ sets.push(`updated_at = NOW()`);
+ values.push(id, teamId);
+
+ const result = await this.pool.query(
+ `UPDATE maintenance_windows SET ${sets.join(", ")} WHERE id = $${paramIndex++} AND team_id = $${paramIndex}
+ RETURNING ${COLUMNS}`,
+ values
+ );
+ const row = result.rows[0];
+ if (!row) {
+ throw new AppError({ message: "Maintenance window not found or could not be updated", status: 404 });
+ }
+ return this.toEntity(row);
+ };
+
+ deleteById = async (id: string, teamId: string): Promise => {
+ const result = await this.pool.query(
+ `DELETE FROM maintenance_windows WHERE id = $1 AND team_id = $2 RETURNING ${COLUMNS}`,
+ [id, teamId]
+ );
+ const row = result.rows[0];
+ if (!row) {
+ throw new AppError({ message: "Maintenance window not found or could not be deleted", status: 404 });
+ }
+ return this.toEntity(row);
+ };
+
+ countByTeamId = async (teamId: string, active?: boolean): Promise => {
+ const conditions: string[] = ["team_id = $1"];
+ const values: unknown[] = [teamId];
+
+ if (active !== undefined) {
+ conditions.push(`active = $2`);
+ values.push(active);
+ }
+
+ const result = await this.pool.query(`SELECT COUNT(*)::int AS count FROM maintenance_windows WHERE ${conditions.join(" AND ")}`, values);
+ return result.rows[0].count;
+ };
+
+ private toEntity = (row: MaintenanceWindowRow): MaintenanceWindow => ({
+ id: row.id,
+ monitorId: row.monitor_id,
+ teamId: row.team_id,
+ active: row.active,
+ name: row.name,
+ duration: row.duration,
+ durationUnit: row.duration_unit,
+ repeat: row.repeat,
+ start: row.start_time.toISOString(),
+ end: row.end_time.toISOString(),
+ createdAt: row.created_at.toISOString(),
+ updatedAt: row.updated_at.toISOString(),
+ });
+}
diff --git a/server/src/repositories/monitor-stats/TimescaleMonitorStatsRepository.ts b/server/src/repositories/monitor-stats/TimescaleMonitorStatsRepository.ts
new file mode 100644
index 0000000000..f5801a1c0e
--- /dev/null
+++ b/server/src/repositories/monitor-stats/TimescaleMonitorStatsRepository.ts
@@ -0,0 +1,140 @@
+import type { Pool } from "pg";
+import type { IMonitorStatsRepository } from "./IMonitorStatsRepository.js";
+import type { MonitorStats } from "@/types/monitorStats.js";
+import { AppError } from "@/utils/AppError.js";
+
+interface MonitorStatsRow {
+ id: string;
+ monitor_id: string;
+ avg_response_time: number;
+ max_response_time: number;
+ total_checks: number;
+ total_up_checks: number;
+ total_down_checks: number;
+ uptime_percentage: number;
+ last_check_timestamp: Date | null;
+ last_response_time: number;
+ time_of_last_failure: Date | null;
+ created_at: Date;
+ updated_at: Date;
+}
+
+const COLUMNS = `id, monitor_id, avg_response_time, max_response_time, total_checks, total_up_checks,
+ total_down_checks, uptime_percentage, last_check_timestamp, last_response_time, time_of_last_failure,
+ created_at, updated_at`;
+
+export class TimescaleMonitorStatsRepository implements IMonitorStatsRepository {
+ constructor(private pool: Pool) {}
+
+ create = async (data: Omit): Promise => {
+ const result = await this.pool.query(
+ `INSERT INTO monitor_stats (monitor_id, avg_response_time, max_response_time, total_checks, total_up_checks,
+ total_down_checks, uptime_percentage, last_check_timestamp, last_response_time, time_of_last_failure)
+ VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10)
+ RETURNING ${COLUMNS}`,
+ [
+ data.monitorId,
+ data.avgResponseTime,
+ data.maxResponseTime,
+ data.totalChecks,
+ data.totalUpChecks,
+ data.totalDownChecks,
+ data.uptimePercentage,
+ data.lastCheckTimestamp ? new Date(data.lastCheckTimestamp) : null,
+ data.lastResponseTime,
+ data.timeOfLastFailure ? new Date(data.timeOfLastFailure) : null,
+ ]
+ );
+ const row = result.rows[0];
+ if (!row) {
+ throw new AppError({ message: "Failed to create monitor stats", status: 500 });
+ }
+ return this.toEntity(row);
+ };
+
+ findByMonitorId = async (monitorId: string): Promise => {
+ const result = await this.pool.query(`SELECT ${COLUMNS} FROM monitor_stats WHERE monitor_id = $1`, [monitorId]);
+ const row = result.rows[0];
+ if (!row) {
+ throw new AppError({ message: "Monitor stats not found", status: 404 });
+ }
+ return this.toEntity(row);
+ };
+
+ updateByMonitorId = async (monitorId: string, data: Omit): Promise => {
+ const result = await this.pool.query(
+ `UPDATE monitor_stats SET
+ avg_response_time = $2,
+ max_response_time = $3,
+ total_checks = $4,
+ total_up_checks = $5,
+ total_down_checks = $6,
+ uptime_percentage = $7,
+ last_check_timestamp = $8,
+ last_response_time = $9,
+ time_of_last_failure = $10,
+ updated_at = NOW()
+ WHERE monitor_id = $1
+ RETURNING ${COLUMNS}`,
+ [
+ monitorId,
+ data.avgResponseTime,
+ data.maxResponseTime,
+ data.totalChecks,
+ data.totalUpChecks,
+ data.totalDownChecks,
+ data.uptimePercentage,
+ data.lastCheckTimestamp ? new Date(data.lastCheckTimestamp) : null,
+ data.lastResponseTime,
+ data.timeOfLastFailure ? new Date(data.timeOfLastFailure) : null,
+ ]
+ );
+ const row = result.rows[0];
+ if (!row) {
+ throw new AppError({ message: "Monitor stats not found", status: 404 });
+ }
+ return this.toEntity(row);
+ };
+
+ deleteByMonitorId = async (monitorId: string): Promise => {
+ const result = await this.pool.query(`DELETE FROM monitor_stats WHERE monitor_id = $1 RETURNING ${COLUMNS}`, [monitorId]);
+ const row = result.rows[0];
+ if (!row) {
+ throw new AppError({ message: "Monitor stats not found", status: 404 });
+ }
+ return this.toEntity(row);
+ };
+
+ deleteByMonitorIds = async (monitorIds: string[]): Promise => {
+ if (!monitorIds.length) {
+ return 0;
+ }
+ const result = await this.pool.query(`DELETE FROM monitor_stats WHERE monitor_id = ANY($1)`, [monitorIds]);
+ return result.rowCount ?? 0;
+ };
+
+ deleteByMonitorIdsNotIn = async (monitorIds: string[]): Promise => {
+ if (!monitorIds.length) {
+ const result = await this.pool.query(`DELETE FROM monitor_stats`);
+ return result.rowCount ?? 0;
+ }
+ const result = await this.pool.query(`DELETE FROM monitor_stats WHERE monitor_id != ALL($1)`, [monitorIds]);
+ return result.rowCount ?? 0;
+ };
+
+ private toEntity = (row: MonitorStatsRow): MonitorStats => ({
+ id: row.id,
+ monitorId: row.monitor_id,
+ avgResponseTime: row.avg_response_time,
+ maxResponseTime: row.max_response_time,
+ totalChecks: Number(row.total_checks),
+ totalUpChecks: Number(row.total_up_checks),
+ totalDownChecks: Number(row.total_down_checks),
+ uptimePercentage: row.uptime_percentage,
+ lastCheckTimestamp: row.last_check_timestamp ? row.last_check_timestamp.getTime() : 0,
+ lastResponseTime: row.last_response_time,
+ timeOfLastFailure: row.time_of_last_failure ? row.time_of_last_failure.getTime() : undefined,
+ createdAt: row.created_at.toISOString(),
+ updatedAt: row.updated_at.toISOString(),
+ });
+}
diff --git a/server/src/repositories/monitors/MongoMonitorsRepository.ts b/server/src/repositories/monitors/MongoMonitorsRepository.ts
index b2d7594483..7909ae5472 100644
--- a/server/src/repositories/monitors/MongoMonitorsRepository.ts
+++ b/server/src/repositories/monitors/MongoMonitorsRepository.ts
@@ -374,6 +374,10 @@ class MongoMonitorsRepository implements IMonitorsRepository {
interval: doc.interval,
uptimePercentage: doc.uptimePercentage ?? undefined,
notifications: notificationIds,
+ escalationNotifications: (doc.escalationNotifications ?? []).map((notification) => toStringId(notification)),
+ escalateAfterMinutes: doc.escalateAfterMinutes ?? 5,
+ escalationSentAt: doc.escalationSentAt ? toDateString(doc.escalationSentAt) : undefined,
+ lastStatusChangeAt: doc.lastStatusChangeAt ? toDateString(doc.lastStatusChangeAt) : undefined,
secret: doc.secret ?? undefined,
cpuAlertThreshold: doc.cpuAlertThreshold,
cpuAlertCounter: doc.cpuAlertCounter,
@@ -433,6 +437,10 @@ class MongoMonitorsRepository implements IMonitorsRepository {
interval: doc.interval,
uptimePercentage: doc.uptimePercentage ?? undefined,
notifications: notificationIds,
+ escalationSentAt: doc.escalationSentAt ? toDateString(doc.escalationSentAt) : undefined,
+ lastStatusChangeAt: doc.lastStatusChangeAt ? toDateString(doc.lastStatusChangeAt) : undefined,
+ escalationNotifications: (doc.escalationNotifications ?? []).map((notification: unknown) => toStringId(notification)),
+ escalateAfterMinutes: doc.escalateAfterMinutes ?? 5,
secret: doc.secret ?? undefined,
cpuAlertThreshold: doc.cpuAlertThreshold,
cpuAlertCounter: doc.cpuAlertCounter,
diff --git a/server/src/repositories/monitors/TimescaleMonitorsRepository.ts b/server/src/repositories/monitors/TimescaleMonitorsRepository.ts
new file mode 100644
index 0000000000..a94d385042
--- /dev/null
+++ b/server/src/repositories/monitors/TimescaleMonitorsRepository.ts
@@ -0,0 +1,1044 @@
+import type { Pool } from "pg";
+import type { Monitor, MonitorsSummary, MonitorStatus, MonitorType, MonitorMatchMethod, GeoContinent } from "@/types/monitor.js";
+import type { IMonitorsRepository, TeamQueryConfig, SummaryConfig } from "./IMonitorsRepository.js";
+import { AppError } from "@/utils/AppError.js";
+
+interface MonitorRow {
+ id: string;
+ user_id: string;
+ team_id: string;
+ name: string;
+ description: string | null;
+ type: MonitorType;
+ status: MonitorStatus;
+ url: string | null;
+ port: number | null;
+ ignore_tls_errors: boolean;
+ use_advanced_matching: boolean;
+ json_path: string | null;
+ expected_value: string | null;
+ match_method: MonitorMatchMethod | null;
+ secret: string | null;
+ interval_ms: number;
+ is_active: boolean;
+ status_window: boolean[] | null;
+ status_window_size: number;
+ status_window_threshold: number;
+ uptime_percentage: number | null;
+ cpu_alert_threshold: number;
+ cpu_alert_counter: number;
+ memory_alert_threshold: number;
+ memory_alert_counter: number;
+ disk_alert_threshold: number;
+ disk_alert_counter: number;
+ temp_alert_threshold: number;
+ temp_alert_counter: number;
+ selected_disks: string[] | null;
+ game_id: string | null;
+ grpc_service_name: string | null;
+ monitor_group: string | null;
+ geo_check_enabled: boolean;
+ geo_check_locations: GeoContinent[] | null;
+ geo_check_interval_ms: number;
+ created_at: Date;
+ updated_at: Date;
+}
+
+const MONITOR_COLUMNS = `id, user_id, team_id, name, description, type, status, url, port,
+ ignore_tls_errors, use_advanced_matching, json_path, expected_value, match_method, secret,
+ interval_ms, is_active, status_window, status_window_size, status_window_threshold, uptime_percentage,
+ cpu_alert_threshold, cpu_alert_counter, memory_alert_threshold, memory_alert_counter,
+ disk_alert_threshold, disk_alert_counter, temp_alert_threshold, temp_alert_counter, selected_disks,
+ game_id, grpc_service_name, monitor_group, geo_check_enabled, geo_check_locations, geo_check_interval_ms,
+ created_at, updated_at`;
+
+export class TimescaleMonitorsRepository implements IMonitorsRepository {
+ constructor(private pool: Pool) {}
+
+ create = async (monitor: Monitor, teamId: string, userId: string): Promise => {
+ const result = await this.pool.query(
+ `INSERT INTO monitors (user_id, team_id, name, description, type, status, url, port,
+ ignore_tls_errors, use_advanced_matching, json_path, expected_value, match_method, secret,
+ interval_ms, is_active, status_window, status_window_size, status_window_threshold,
+ cpu_alert_threshold, cpu_alert_counter, memory_alert_threshold, memory_alert_counter,
+ disk_alert_threshold, disk_alert_counter, temp_alert_threshold, temp_alert_counter, selected_disks,
+ game_id, grpc_service_name, monitor_group, geo_check_enabled, geo_check_locations, geo_check_interval_ms)
+ VALUES ($1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11,$12,$13,$14,$15,$16,$17,$18,$19,$20,$21,$22,$23,$24,$25,$26,$27,$28,$29,$30,$31,$32,$33,$34)
+ RETURNING ${MONITOR_COLUMNS}`,
+ [
+ userId,
+ teamId,
+ monitor.name,
+ monitor.description ?? null,
+ monitor.type,
+ monitor.status ?? "initializing",
+ monitor.url ?? null,
+ monitor.port ?? null,
+ monitor.ignoreTlsErrors ?? false,
+ monitor.useAdvancedMatching ?? false,
+ monitor.jsonPath ?? null,
+ monitor.expectedValue ?? null,
+ monitor.matchMethod || null,
+ monitor.secret ?? null,
+ monitor.interval ?? 60000,
+ monitor.isActive ?? true,
+ monitor.statusWindow ?? null,
+ monitor.statusWindowSize ?? 5,
+ monitor.statusWindowThreshold ?? 60,
+ monitor.cpuAlertThreshold ?? 0,
+ monitor.cpuAlertCounter ?? 0,
+ monitor.memoryAlertThreshold ?? 0,
+ monitor.memoryAlertCounter ?? 0,
+ monitor.diskAlertThreshold ?? 0,
+ monitor.diskAlertCounter ?? 0,
+ monitor.tempAlertThreshold ?? 0,
+ monitor.tempAlertCounter ?? 0,
+ monitor.selectedDisks ?? [],
+ monitor.gameId ?? null,
+ monitor.grpcServiceName ?? null,
+ monitor.group ?? null,
+ monitor.geoCheckEnabled ?? false,
+ monitor.geoCheckLocations ?? [],
+ monitor.geoCheckInterval ?? 300000,
+ ]
+ );
+ const row = result.rows[0];
+ if (!row) {
+ return null;
+ }
+
+ // Insert notification associations
+ if (monitor.notifications?.length) {
+ for (const notificationId of monitor.notifications) {
+ await this.pool.query(`INSERT INTO monitor_notifications (monitor_id, notification_id) VALUES ($1, $2) ON CONFLICT DO NOTHING`, [
+ row.id,
+ notificationId,
+ ]);
+ }
+ }
+
+ const entity = this.toEntity(row);
+ entity.notifications = monitor.notifications ?? [];
+ return entity;
+ };
+
+ createMonitors = async (monitors: Monitor[]): Promise => {
+ if (!monitors.length) {
+ return [];
+ }
+ const created: Monitor[] = [];
+ for (const monitor of monitors) {
+ const result = await this.create(monitor, monitor.teamId, monitor.userId);
+ if (result) {
+ created.push(result);
+ }
+ }
+ return created;
+ };
+
+ findById = async (monitorId: string, teamId: string): Promise => {
+ const result = await this.pool.query(`SELECT ${MONITOR_COLUMNS} FROM monitors WHERE id = $1 AND team_id = $2`, [monitorId, teamId]);
+ const row = result.rows[0];
+ if (!row) {
+ throw new AppError({ message: `Monitor with ID ${monitorId} not found`, status: 404 });
+ }
+ const monitor = this.toEntity(row);
+
+ // Populate latest check with child data
+ const checkResult = await this.pool.query(`SELECT * FROM checks WHERE monitor_id = $1 ORDER BY created_at DESC LIMIT 1`, [monitorId]);
+ if (checkResult.rows[0]) {
+ const checkRow = checkResult.rows[0];
+ const childData = await this.fetchCheckChildData(checkRow.id);
+ monitor.recentChecks = [this.toCheckSnapshot(checkRow, childData)];
+ }
+
+ // Populate notifications
+ monitor.notifications = await this.fetchNotificationIds([monitorId]).then((m) => m.get(monitorId) ?? []);
+
+ return monitor;
+ };
+
+ findAll = async (): Promise => {
+ const result = await this.pool.query(`SELECT ${MONITOR_COLUMNS} FROM monitors`);
+ const monitors = result.rows.map(this.toEntity);
+ if (monitors.length > 0) {
+ const notifMap = await this.fetchNotificationIds(monitors.map((m) => m.id));
+ for (const monitor of monitors) {
+ monitor.notifications = notifMap.get(monitor.id) ?? [];
+ }
+ }
+ return monitors;
+ };
+
+ findByTeamId = async (teamId: string, config: TeamQueryConfig): Promise => {
+ const { page = 0, rowsPerPage = 0, filter, field = "createdAt", order = "desc", type } = config ?? {};
+
+ const conditions: string[] = ["team_id = $1"];
+ const values: unknown[] = [teamId];
+ let paramIndex = 2;
+
+ if (type !== undefined) {
+ if (Array.isArray(type)) {
+ conditions.push(`type = ANY($${paramIndex++})`);
+ values.push(type);
+ } else {
+ conditions.push(`type = $${paramIndex++}`);
+ values.push(type);
+ }
+ }
+
+ if (filter !== undefined) {
+ switch (field) {
+ case "name":
+ conditions.push(`(name ILIKE $${paramIndex} OR url ILIKE $${paramIndex})`);
+ values.push(`%${filter}%`);
+ paramIndex++;
+ break;
+ case "isActive":
+ conditions.push(`is_active = $${paramIndex++}`);
+ values.push(filter === "true");
+ break;
+ case "status":
+ conditions.push(`status = $${paramIndex++}`);
+ values.push(filter);
+ break;
+ case "type":
+ conditions.push(`type = $${paramIndex++}`);
+ values.push(filter);
+ break;
+ default:
+ break;
+ }
+ }
+
+ const fieldMap: Record = {
+ createdAt: "created_at",
+ name: "name",
+ status: "status",
+ type: "type",
+ isActive: "is_active",
+ };
+ const sortColumn = fieldMap[field] ?? "created_at";
+ const sortDirection = order === "asc" ? "ASC" : "DESC";
+
+ let query = `SELECT ${MONITOR_COLUMNS} FROM monitors WHERE ${conditions.join(" AND ")} ORDER BY ${sortColumn} ${sortDirection}`;
+
+ if (rowsPerPage > 0) {
+ const offset = Math.max(page, 0) * rowsPerPage;
+ query += ` LIMIT $${paramIndex++} OFFSET $${paramIndex++}`;
+ values.push(rowsPerPage, offset);
+ }
+
+ const result = await this.pool.query(query, values);
+ const monitors = result.rows.map(this.toEntity);
+
+ if (monitors.length === 0) return monitors;
+
+ // Populate recentChecks — 25 latest checks per monitor in a single query
+ const monitorIds = monitors.map((m) => m.id);
+ const checksResult = await this.pool.query(
+ `SELECT * FROM (
+ SELECT *, ROW_NUMBER() OVER (PARTITION BY monitor_id ORDER BY created_at DESC) AS rn
+ FROM checks
+ WHERE monitor_id = ANY($1)
+ ) sub WHERE rn <= 25
+ ORDER BY monitor_id, created_at ASC`,
+ [monitorIds]
+ );
+
+ // Group checks by monitor_id
+ const checksMap = new Map();
+ for (const row of checksResult.rows) {
+ if (!checksMap.has(row.monitor_id)) checksMap.set(row.monitor_id, []);
+ checksMap.get(row.monitor_id)!.push(row);
+ }
+
+ // Batch fetch child data for all checks in 3 queries
+ const checkIds = checksResult.rows.map((r) => r.id);
+ const diskMap = new Map[]>();
+ const netMap = new Map[]>();
+ const errorsMap = new Map[]>();
+
+ if (checkIds.length > 0) {
+ const [disksResult, netsResult, errsResult] = await Promise.all([
+ this.pool.query(
+ `SELECT check_id, device, mountpoint, total_bytes, free_bytes, used_bytes, usage_percent,
+ total_inodes, free_inodes, used_inodes, inodes_usage_percent,
+ read_bytes, write_bytes, read_time, write_time
+ FROM check_disks WHERE check_id = ANY($1)`,
+ [checkIds]
+ ),
+ this.pool.query(
+ `SELECT check_id, name, bytes_sent, bytes_recv, packets_sent, packets_recv,
+ err_in, err_out, drop_in, drop_out, fifo_in, fifo_out
+ FROM check_network_interfaces WHERE check_id = ANY($1)`,
+ [checkIds]
+ ),
+ this.pool.query(
+ `SELECT check_id, metrics, error
+ FROM check_errors WHERE check_id = ANY($1)`,
+ [checkIds]
+ ),
+ ]);
+
+ for (const d of disksResult.rows) {
+ const key = d.check_id as string;
+ if (!diskMap.has(key)) diskMap.set(key, []);
+ diskMap.get(key)!.push(d);
+ }
+ for (const n of netsResult.rows) {
+ const key = n.check_id as string;
+ if (!netMap.has(key)) netMap.set(key, []);
+ netMap.get(key)!.push(n);
+ }
+ for (const e of errsResult.rows) {
+ const key = e.check_id as string;
+ if (!errorsMap.has(key)) errorsMap.set(key, []);
+ errorsMap.get(key)!.push(e);
+ }
+ }
+
+ for (const monitor of monitors) {
+ const rows = checksMap.get(monitor.id) ?? [];
+ monitor.recentChecks = rows.map((row) => {
+ const childData = {
+ disk: (diskMap.get(row.id) ?? []).map((d) => ({
+ device: d.device,
+ mountpoint: d.mountpoint,
+ total_bytes: Number(d.total_bytes),
+ free_bytes: Number(d.free_bytes),
+ used_bytes: Number(d.used_bytes),
+ usage_percent: d.usage_percent as number,
+ total_inodes: Number(d.total_inodes),
+ free_inodes: Number(d.free_inodes),
+ used_inodes: Number(d.used_inodes),
+ inodes_usage_percent: d.inodes_usage_percent as number,
+ read_bytes: Number(d.read_bytes),
+ write_bytes: Number(d.write_bytes),
+ read_time: Number(d.read_time),
+ write_time: Number(d.write_time),
+ })),
+ net: (netMap.get(row.id) ?? []).map((n) => ({
+ name: n.name as string,
+ bytes_sent: Number(n.bytes_sent),
+ bytes_recv: Number(n.bytes_recv),
+ packets_sent: Number(n.packets_sent),
+ packets_recv: Number(n.packets_recv),
+ err_in: Number(n.err_in),
+ err_out: Number(n.err_out),
+ drop_in: Number(n.drop_in),
+ drop_out: Number(n.drop_out),
+ fifo_in: Number(n.fifo_in),
+ fifo_out: Number(n.fifo_out),
+ })),
+ errors: (errorsMap.get(row.id) ?? []).map((e) => ({
+ metric: (e.metrics as string[]) ?? [],
+ err: (e.error as string) ?? "",
+ })),
+ };
+ return this.toCheckSnapshot(row, childData);
+ });
+ }
+
+ // Populate notifications in batch
+ const notifMap = await this.fetchNotificationIds(monitorIds);
+ for (const monitor of monitors) {
+ monitor.notifications = notifMap.get(monitor.id) ?? [];
+ }
+
+ return monitors;
+ };
+
+ findByIds = async (monitorIds: string[]): Promise => {
+ if (!monitorIds.length) {
+ return [];
+ }
+ const result = await this.pool.query(`SELECT ${MONITOR_COLUMNS} FROM monitors WHERE id = ANY($1)`, [monitorIds]);
+ const monitors = result.rows.map(this.toEntity);
+ const notifMap = await this.fetchNotificationIds(monitorIds);
+ for (const monitor of monitors) {
+ monitor.notifications = notifMap.get(monitor.id) ?? [];
+ }
+ return monitors;
+ };
+
+ findByIdsWithChecks = async (monitorIds: string[], checksCount: number = 25): Promise => {
+ if (!monitorIds.length) {
+ return [];
+ }
+ const monitors = await this.findByIds(monitorIds);
+
+ for (const monitor of monitors) {
+ const checksResult = await this.pool.query(
+ `SELECT * FROM checks
+ WHERE monitor_id = $1
+ ORDER BY created_at DESC
+ LIMIT $2`,
+ [monitor.id, checksCount]
+ );
+ monitor.recentChecks = await Promise.all(
+ checksResult.rows.map(async (row) => {
+ // Fetch child records for hardware monitors
+ let disk: import("@/types/index.js").CheckDiskInfo[] = [];
+ let net: import("@/types/index.js").CheckNetworkInterfaceInfo[] = [];
+ let errors: import("@/types/index.js").CheckErrorInfo[] = [];
+
+ if (monitor.type === "hardware") {
+ const [diskResult, netResult, errorsResult] = await Promise.all([
+ this.pool.query(
+ `SELECT device, mountpoint, total_bytes, free_bytes, used_bytes, usage_percent,
+ total_inodes, free_inodes, used_inodes, inodes_usage_percent,
+ read_bytes, write_bytes, read_time, write_time
+ FROM check_disks WHERE check_id = $1`,
+ [row.id]
+ ),
+ this.pool.query(
+ `SELECT name, bytes_sent, bytes_recv, packets_sent, packets_recv,
+ err_in, err_out, drop_in, drop_out, fifo_in, fifo_out
+ FROM check_network_interfaces WHERE check_id = $1`,
+ [row.id]
+ ),
+ this.pool.query(`SELECT metrics, error FROM check_errors WHERE check_id = $1`, [row.id]),
+ ]);
+ disk = diskResult.rows.map((d) => ({
+ device: d.device,
+ mountpoint: d.mountpoint,
+ total_bytes: Number(d.total_bytes),
+ free_bytes: Number(d.free_bytes),
+ used_bytes: Number(d.used_bytes),
+ usage_percent: d.usage_percent,
+ total_inodes: Number(d.total_inodes),
+ free_inodes: Number(d.free_inodes),
+ used_inodes: Number(d.used_inodes),
+ inodes_usage_percent: d.inodes_usage_percent,
+ read_bytes: Number(d.read_bytes),
+ write_bytes: Number(d.write_bytes),
+ read_time: Number(d.read_time),
+ write_time: Number(d.write_time),
+ }));
+ net = netResult.rows.map((n) => ({
+ name: n.name,
+ bytes_sent: Number(n.bytes_sent),
+ bytes_recv: Number(n.bytes_recv),
+ packets_sent: Number(n.packets_sent),
+ packets_recv: Number(n.packets_recv),
+ err_in: Number(n.err_in),
+ err_out: Number(n.err_out),
+ drop_in: Number(n.drop_in),
+ drop_out: Number(n.drop_out),
+ fifo_in: Number(n.fifo_in),
+ fifo_out: Number(n.fifo_out),
+ }));
+ errors = errorsResult.rows.map((e) => ({ metric: e.metrics ?? [], err: e.error ?? "" }));
+ }
+
+ return {
+ id: row.id,
+ status: row.status,
+ responseTime: row.response_time ?? 0,
+ statusCode: row.status_code ?? 0,
+ message: row.message ?? "",
+ timings:
+ row.timing_start !== null
+ ? {
+ start: row.timing_start,
+ socket: row.timing_socket,
+ lookup: row.timing_lookup,
+ connect: row.timing_connect,
+ secureConnect: row.timing_secure_connect,
+ upload: row.timing_upload,
+ response: row.timing_response,
+ end: row.timing_end,
+ phases: {
+ wait: row.phase_wait,
+ dns: row.phase_dns,
+ tcp: row.phase_tcp,
+ tls: row.phase_tls,
+ request: row.phase_request,
+ firstByte: row.phase_first_byte,
+ download: row.phase_download,
+ total: row.phase_total,
+ },
+ }
+ : undefined,
+ cpu:
+ row.cpu_usage_percent !== null
+ ? {
+ physical_core: row.cpu_physical_core,
+ logical_core: row.cpu_logical_core,
+ frequency: row.cpu_frequency,
+ current_frequency: row.cpu_current_frequency,
+ temperature: row.cpu_temperature ?? [],
+ free_percent: row.cpu_free_percent,
+ usage_percent: row.cpu_usage_percent,
+ }
+ : undefined,
+ memory:
+ row.mem_usage_percent !== null
+ ? {
+ total_bytes: Number(row.mem_total_bytes),
+ available_bytes: Number(row.mem_available_bytes),
+ used_bytes: Number(row.mem_used_bytes),
+ usage_percent: row.mem_usage_percent,
+ }
+ : undefined,
+ disk,
+ host:
+ row.host_os !== null
+ ? {
+ os: row.host_os,
+ platform: row.host_platform,
+ kernel_version: row.host_kernel_version,
+ pretty_name: row.host_pretty_name,
+ }
+ : undefined,
+ errors,
+ capture:
+ row.capture_version !== null
+ ? {
+ version: row.capture_version,
+ mode: row.capture_mode,
+ }
+ : undefined,
+ net,
+ performance: row.lighthouse_performance ?? undefined,
+ accessibility: row.lighthouse_accessibility ?? undefined,
+ bestPractices: row.lighthouse_best_practices ?? undefined,
+ seo: row.lighthouse_seo ?? undefined,
+ audits:
+ row.audit_cls_score !== null
+ ? {
+ cls: { score: row.audit_cls_score, numericValue: row.audit_cls_value, displayValue: row.audit_cls_display },
+ si: { score: row.audit_si_score, numericValue: row.audit_si_value, displayValue: row.audit_si_display },
+ fcp: { score: row.audit_fcp_score, numericValue: row.audit_fcp_value, displayValue: row.audit_fcp_display },
+ lcp: { score: row.audit_lcp_score, numericValue: row.audit_lcp_value, displayValue: row.audit_lcp_display },
+ tbt: { score: row.audit_tbt_score, numericValue: row.audit_tbt_value, displayValue: row.audit_tbt_display },
+ }
+ : undefined,
+ createdAt: row.created_at.toISOString(),
+ };
+ })
+ );
+
+ const maintResult = await this.pool.query(
+ `SELECT 1 FROM maintenance_windows
+ WHERE monitor_id = $1 AND active = TRUE AND start_time <= NOW() AND end_time >= NOW()
+ LIMIT 1`,
+ [monitor.id]
+ );
+ if ((maintResult.rowCount ?? 0) > 0) {
+ monitor.status = "maintenance";
+ }
+
+ const statsResult = await this.pool.query(`SELECT uptime_percentage FROM monitor_stats WHERE monitor_id = $1`, [monitor.id]);
+ if (statsResult.rows[0]) {
+ monitor.uptimePercentage = statsResult.rows[0].uptime_percentage;
+ }
+ }
+
+ return monitors;
+ };
+
+ findMonitorCountByTeamIdAndType = async (teamId: string, config?: TeamQueryConfig): Promise => {
+ const { type } = config ?? {};
+ const conditions: string[] = ["team_id = $1"];
+ const values: unknown[] = [teamId];
+ let paramIndex = 2;
+
+ if (type !== undefined) {
+ if (Array.isArray(type)) {
+ conditions.push(`type = ANY($${paramIndex++})`);
+ values.push(type);
+ } else {
+ conditions.push(`type = $${paramIndex++}`);
+ values.push(type);
+ }
+ }
+
+ const result = await this.pool.query(`SELECT COUNT(*)::int AS count FROM monitors WHERE ${conditions.join(" AND ")}`, values);
+ return result.rows[0].count;
+ };
+
+ updateById = async (monitorId: string, teamId: string, patch: Partial): Promise => {
+ const sets: string[] = [];
+ const values: unknown[] = [];
+ let paramIndex = 1;
+
+ const fieldMap: [keyof Monitor, string][] = [
+ ["name", "name"],
+ ["description", "description"],
+ ["type", "type"],
+ ["status", "status"],
+ ["url", "url"],
+ ["port", "port"],
+ ["ignoreTlsErrors", "ignore_tls_errors"],
+ ["useAdvancedMatching", "use_advanced_matching"],
+ ["jsonPath", "json_path"],
+ ["expectedValue", "expected_value"],
+ ["matchMethod", "match_method"],
+ ["secret", "secret"],
+ ["interval", "interval_ms"],
+ ["isActive", "is_active"],
+ ["statusWindow", "status_window"],
+ ["statusWindowSize", "status_window_size"],
+ ["statusWindowThreshold", "status_window_threshold"],
+ ["uptimePercentage", "uptime_percentage"],
+ ["cpuAlertThreshold", "cpu_alert_threshold"],
+ ["cpuAlertCounter", "cpu_alert_counter"],
+ ["memoryAlertThreshold", "memory_alert_threshold"],
+ ["memoryAlertCounter", "memory_alert_counter"],
+ ["diskAlertThreshold", "disk_alert_threshold"],
+ ["diskAlertCounter", "disk_alert_counter"],
+ ["tempAlertThreshold", "temp_alert_threshold"],
+ ["tempAlertCounter", "temp_alert_counter"],
+ ["selectedDisks", "selected_disks"],
+ ["gameId", "game_id"],
+ ["grpcServiceName", "grpc_service_name"],
+ ["group", "monitor_group"],
+ ["geoCheckEnabled", "geo_check_enabled"],
+ ["geoCheckLocations", "geo_check_locations"],
+ ["geoCheckInterval", "geo_check_interval_ms"],
+ ];
+
+ for (const [key, column] of fieldMap) {
+ if (patch[key] !== undefined) {
+ sets.push(`${column} = $${paramIndex++}`);
+ // Empty string matchMethod is stored as NULL (not a valid enum value)
+ values.push(key === "matchMethod" && patch[key] === "" ? null : patch[key]);
+ }
+ }
+
+ if (sets.length === 0) {
+ return this.findById(monitorId, teamId);
+ }
+
+ sets.push(`updated_at = NOW()`);
+ values.push(monitorId, teamId);
+
+ const result = await this.pool.query(
+ `UPDATE monitors SET ${sets.join(", ")} WHERE id = $${paramIndex++} AND team_id = $${paramIndex}
+ RETURNING ${MONITOR_COLUMNS}`,
+ values
+ );
+ const row = result.rows[0];
+ if (!row) {
+ throw new AppError({ message: `Failed to update monitor with id ${monitorId}`, status: 500 });
+ }
+
+ // Update notification associations if provided
+ if (patch.notifications !== undefined) {
+ await this.pool.query(`DELETE FROM monitor_notifications WHERE monitor_id = $1`, [monitorId]);
+ for (const notificationId of patch.notifications) {
+ await this.pool.query(`INSERT INTO monitor_notifications (monitor_id, notification_id) VALUES ($1, $2) ON CONFLICT DO NOTHING`, [
+ monitorId,
+ notificationId,
+ ]);
+ }
+ }
+
+ const entity = this.toEntity(row);
+ entity.notifications = patch.notifications ?? (await this.fetchNotificationIds([monitorId]).then((m) => m.get(monitorId) ?? []));
+ return entity;
+ };
+
+ togglePauseById = async (monitorId: string, teamId: string): Promise => {
+ const result = await this.pool.query(
+ `UPDATE monitors SET
+ is_active = NOT is_active,
+ status = CASE WHEN status = 'paused' THEN 'initializing'::monitor_status ELSE 'paused'::monitor_status END,
+ updated_at = NOW()
+ WHERE id = $1 AND team_id = $2
+ RETURNING ${MONITOR_COLUMNS}`,
+ [monitorId, teamId]
+ );
+ const row = result.rows[0];
+ if (!row) {
+ throw new AppError({ message: `Monitor with ID ${monitorId} not found for the given team.`, status: 404 });
+ }
+ const entity = this.toEntity(row);
+ entity.notifications = await this.fetchNotificationIds([monitorId]).then((m) => m.get(monitorId) ?? []);
+ return entity;
+ };
+
+ deleteById = async (monitorId: string, teamId: string): Promise => {
+ // Fetch notifications before delete (FK cascade will remove join rows)
+ const notifs = await this.fetchNotificationIds([monitorId]).then((m) => m.get(monitorId) ?? []);
+ const result = await this.pool.query(`DELETE FROM monitors WHERE id = $1 AND team_id = $2 RETURNING ${MONITOR_COLUMNS}`, [
+ monitorId,
+ teamId,
+ ]);
+ const row = result.rows[0];
+ if (!row) {
+ throw new AppError({ message: `Monitor with ID ${monitorId} not found for the given team.`, status: 404 });
+ }
+ const entity = this.toEntity(row);
+ entity.notifications = notifs;
+ return entity;
+ };
+
+ deleteByTeamId = async (teamId: string): Promise<{ monitors: Monitor[]; deletedCount: number }> => {
+ // Fetch notifications before delete
+ const monitorsResult = await this.pool.query(`SELECT ${MONITOR_COLUMNS} FROM monitors WHERE team_id = $1`, [teamId]);
+ const monitorIds = monitorsResult.rows.map((r) => r.id);
+ const notifMap = monitorIds.length > 0 ? await this.fetchNotificationIds(monitorIds) : new Map();
+
+ const result = await this.pool.query(`DELETE FROM monitors WHERE team_id = $1 RETURNING ${MONITOR_COLUMNS}`, [teamId]);
+ const monitors = result.rows.map((row) => {
+ const entity = this.toEntity(row);
+ entity.notifications = notifMap.get(row.id) ?? [];
+ return entity;
+ });
+ return { monitors, deletedCount: result.rowCount ?? 0 };
+ };
+
+ findMonitorsSummaryByTeamId = async (teamId: string, config?: SummaryConfig): Promise => {
+ const conditions: string[] = ["team_id = $1"];
+ const values: unknown[] = [teamId];
+ let paramIndex = 2;
+
+ if (config?.type !== undefined) {
+ if (Array.isArray(config.type)) {
+ conditions.push(`type = ANY($${paramIndex++})`);
+ values.push(config.type);
+ } else {
+ conditions.push(`type = $${paramIndex++}`);
+ values.push(config.type);
+ }
+ }
+
+ const result = await this.pool.query(
+ `SELECT
+ COUNT(*)::int AS "totalMonitors",
+ COUNT(*) FILTER (WHERE status = 'up')::int AS "upMonitors",
+ COUNT(*) FILTER (WHERE status = 'down')::int AS "downMonitors",
+ COUNT(*) FILTER (WHERE status = 'paused')::int AS "pausedMonitors",
+ COUNT(*) FILTER (WHERE status = 'initializing')::int AS "initializingMonitors",
+ COUNT(*) FILTER (WHERE status = 'maintenance')::int AS "maintenanceMonitors",
+ COUNT(*) FILTER (WHERE status = 'breached')::int AS "breachedMonitors"
+ FROM monitors WHERE ${conditions.join(" AND ")}`,
+ values
+ );
+
+ return (
+ result.rows[0] ?? {
+ totalMonitors: 0,
+ upMonitors: 0,
+ downMonitors: 0,
+ pausedMonitors: 0,
+ initializingMonitors: 0,
+ maintenanceMonitors: 0,
+ breachedMonitors: 0,
+ }
+ );
+ };
+
+ findGroupsByTeamId = async (teamId: string): Promise => {
+ const result = await this.pool.query(
+ `SELECT DISTINCT monitor_group FROM monitors
+ WHERE team_id = $1 AND monitor_group IS NOT NULL AND monitor_group != ''
+ ORDER BY monitor_group`,
+ [teamId]
+ );
+ return result.rows.map((row) => row.monitor_group);
+ };
+
+ removeNotificationFromMonitors = async (notificationId: string): Promise => {
+ await this.pool.query(`DELETE FROM monitor_notifications WHERE notification_id = $1`, [notificationId]);
+ };
+
+ updateNotifications = async (
+ teamId: string,
+ monitorIds: string[],
+ notificationIds: string[],
+ action: "add" | "remove" | "set"
+ ): Promise => {
+ if (!monitorIds.length) {
+ return 0;
+ }
+
+ // Verify monitors belong to team
+ const monitorCheck = await this.pool.query(`SELECT id FROM monitors WHERE id = ANY($1) AND team_id = $2`, [monitorIds, teamId]);
+ const validMonitorIds = monitorCheck.rows.map((row) => row.id);
+
+ if (!validMonitorIds.length) {
+ return 0;
+ }
+
+ let modified = 0;
+
+ switch (action) {
+ case "set": {
+ // Track which monitors actually change
+ const existingSet = await this.pool.query(`SELECT monitor_id, notification_id FROM monitor_notifications WHERE monitor_id = ANY($1)`, [
+ validMonitorIds,
+ ]);
+ const existingByMonitor = new Map>();
+ for (const row of existingSet.rows) {
+ if (!existingByMonitor.has(row.monitor_id)) existingByMonitor.set(row.monitor_id, new Set());
+ existingByMonitor.get(row.monitor_id)!.add(row.notification_id);
+ }
+
+ await this.pool.query(`DELETE FROM monitor_notifications WHERE monitor_id = ANY($1)`, [validMonitorIds]);
+ for (const monitorId of validMonitorIds) {
+ const existing = existingByMonitor.get(monitorId);
+ const newSet = new Set(notificationIds);
+ const changed = !existing || existing.size !== newSet.size || [...newSet].some((id) => !existing.has(id));
+ if (changed) modified++;
+
+ for (const notificationId of notificationIds) {
+ await this.pool.query(
+ `INSERT INTO monitor_notifications (monitor_id, notification_id)
+ VALUES ($1, $2)
+ ON CONFLICT DO NOTHING`,
+ [monitorId, notificationId]
+ );
+ }
+ }
+ break;
+ }
+ case "add": {
+ // Count monitors where at least one new notification was added
+ const monitorsModified = new Set();
+ for (const monitorId of validMonitorIds) {
+ for (const notificationId of notificationIds) {
+ const res = await this.pool.query(
+ `INSERT INTO monitor_notifications (monitor_id, notification_id)
+ VALUES ($1, $2)
+ ON CONFLICT DO NOTHING`,
+ [monitorId, notificationId]
+ );
+ if ((res.rowCount ?? 0) > 0) {
+ monitorsModified.add(monitorId);
+ }
+ }
+ }
+ modified = monitorsModified.size;
+ break;
+ }
+ case "remove": {
+ // Count distinct monitors that will be affected before deleting
+ const affectedResult = await this.pool.query(
+ `SELECT COUNT(DISTINCT monitor_id)::int AS count FROM monitor_notifications
+ WHERE monitor_id = ANY($1) AND notification_id = ANY($2)`,
+ [validMonitorIds, notificationIds]
+ );
+ modified = affectedResult.rows[0]?.count ?? 0;
+ await this.pool.query(
+ `DELETE FROM monitor_notifications
+ WHERE monitor_id = ANY($1) AND notification_id = ANY($2)`,
+ [validMonitorIds, notificationIds]
+ );
+ break;
+ }
+ default:
+ throw new AppError({ message: `Invalid action: ${action}`, status: 400 });
+ }
+
+ return modified;
+ };
+
+ deleteByTeamIdsNotIn = async (teamIds: string[]): Promise => {
+ if (!teamIds.length) {
+ const result = await this.pool.query(`DELETE FROM monitors`);
+ return result.rowCount ?? 0;
+ }
+ const result = await this.pool.query(`DELETE FROM monitors WHERE team_id != ALL($1)`, [teamIds]);
+ return result.rowCount ?? 0;
+ };
+
+ findAllMonitorIds = async (): Promise => {
+ const result = await this.pool.query(`SELECT id FROM monitors`);
+ return result.rows.map((row) => row.id);
+ };
+
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
+ private toCheckSnapshot = (row: any, childData?: { disk: any[]; net: any[]; errors: any[] }) => ({
+ id: row.id,
+ status: row.status,
+ responseTime: row.response_time ?? 0,
+ statusCode: row.status_code ?? 0,
+ message: row.message ?? "",
+ timings:
+ row.timing_start !== null
+ ? {
+ start: row.timing_start,
+ socket: row.timing_socket,
+ lookup: row.timing_lookup,
+ connect: row.timing_connect,
+ secureConnect: row.timing_secure_connect,
+ upload: row.timing_upload,
+ response: row.timing_response,
+ end: row.timing_end,
+ phases: {
+ wait: row.phase_wait,
+ dns: row.phase_dns,
+ tcp: row.phase_tcp,
+ tls: row.phase_tls,
+ request: row.phase_request,
+ firstByte: row.phase_first_byte,
+ download: row.phase_download,
+ total: row.phase_total,
+ },
+ }
+ : undefined,
+ cpu:
+ row.cpu_usage_percent !== null
+ ? {
+ physical_core: row.cpu_physical_core,
+ logical_core: row.cpu_logical_core,
+ frequency: row.cpu_frequency,
+ current_frequency: row.cpu_current_frequency,
+ temperature: row.cpu_temperature ?? [],
+ free_percent: row.cpu_free_percent,
+ usage_percent: row.cpu_usage_percent,
+ }
+ : undefined,
+ memory:
+ row.mem_usage_percent !== null
+ ? {
+ total_bytes: Number(row.mem_total_bytes),
+ available_bytes: Number(row.mem_available_bytes),
+ used_bytes: Number(row.mem_used_bytes),
+ usage_percent: row.mem_usage_percent,
+ }
+ : undefined,
+ disk: childData?.disk ?? [],
+ host:
+ row.host_os !== null
+ ? {
+ os: row.host_os,
+ platform: row.host_platform,
+ kernel_version: row.host_kernel_version,
+ pretty_name: row.host_pretty_name,
+ }
+ : undefined,
+ errors: childData?.errors ?? [],
+ capture:
+ row.capture_version !== null
+ ? {
+ version: row.capture_version,
+ mode: row.capture_mode,
+ }
+ : undefined,
+ net: childData?.net ?? [],
+ performance: row.lighthouse_performance ?? undefined,
+ accessibility: row.lighthouse_accessibility ?? undefined,
+ bestPractices: row.lighthouse_best_practices ?? undefined,
+ seo: row.lighthouse_seo ?? undefined,
+ audits:
+ row.audit_cls_score !== null
+ ? {
+ cls: { score: row.audit_cls_score, numericValue: row.audit_cls_value, displayValue: row.audit_cls_display },
+ si: { score: row.audit_si_score, numericValue: row.audit_si_value, displayValue: row.audit_si_display },
+ fcp: { score: row.audit_fcp_score, numericValue: row.audit_fcp_value, displayValue: row.audit_fcp_display },
+ lcp: { score: row.audit_lcp_score, numericValue: row.audit_lcp_value, displayValue: row.audit_lcp_display },
+ tbt: { score: row.audit_tbt_score, numericValue: row.audit_tbt_value, displayValue: row.audit_tbt_display },
+ }
+ : undefined,
+ createdAt: row.created_at.toISOString(),
+ });
+
+ private fetchNotificationIds = async (monitorIds: string[]): Promise