diff --git a/application/src/components/dashboard/DashboardContent.tsx b/application/src/components/dashboard/DashboardContent.tsx index e12c14e..64308b6 100644 --- a/application/src/components/dashboard/DashboardContent.tsx +++ b/application/src/components/dashboard/DashboardContent.tsx @@ -7,6 +7,7 @@ import { StatusCards } from "./StatusCards"; import { ServiceFilters } from "./ServiceFilters"; import { ServicesTable } from "./ServicesTable"; import { AddServiceDialog } from "@/components/services/AddServiceDialog"; +import { useLanguage } from "@/contexts/LanguageContext"; interface DashboardContentProps { services: Service[]; @@ -15,6 +16,7 @@ interface DashboardContentProps { } export const DashboardContent = ({ services, isLoading, error }: DashboardContentProps) => { + const { t } = useLanguage(); const [filter, setFilter] = useState("all"); const [searchTerm, setSearchTerm] = useState(""); const [isAddDialogOpen, setIsAddDialogOpen] = useState(false); @@ -31,7 +33,7 @@ export const DashboardContent = ({ services, isLoading, error }: DashboardConten return (

Error loading service data.

- +
); } @@ -40,12 +42,12 @@ export const DashboardContent = ({ services, isLoading, error }: DashboardConten
-

Overview

+

{t('overview')}

diff --git a/application/src/components/dashboard/ServiceFilters.tsx b/application/src/components/dashboard/ServiceFilters.tsx index 726d4a2..613fba4 100644 --- a/application/src/components/dashboard/ServiceFilters.tsx +++ b/application/src/components/dashboard/ServiceFilters.tsx @@ -3,6 +3,7 @@ import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; import { Select, SelectTrigger, SelectValue, SelectContent, SelectItem } from "@/components/ui/select"; import { Plus } from "lucide-react"; +import { useLanguage } from "@/contexts/LanguageContext"; interface ServiceFiltersProps { filter: string; @@ -19,10 +20,11 @@ export const ServiceFilters = ({ setSearchTerm, servicesCount }: ServiceFiltersProps) => { + const { t } = useLanguage(); return (
-

Currently Monitoring

+

{t('currentlyMonitoring')}

{servicesCount} @@ -30,10 +32,10 @@ export const ServiceFilters = ({
setSearchTerm(e.target.value)} /> diff --git a/application/src/components/dashboard/StatusCards.tsx b/application/src/components/dashboard/StatusCards.tsx index 2ee4f5d..428f8c9 100644 --- a/application/src/components/dashboard/StatusCards.tsx +++ b/application/src/components/dashboard/StatusCards.tsx @@ -3,12 +3,15 @@ import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"; import { ArrowUp, ArrowDown, Pause, AlertTriangle } from "lucide-react"; import { Service } from "@/services/serviceService"; import { useTheme } from "@/contexts/ThemeContext"; +import {useLanguage} from "@/contexts/LanguageContext.tsx"; interface StatusCardsProps { services: Service[]; } export const StatusCards = ({ services }: StatusCardsProps) => { + const { t } = useLanguage(); + // Count services by status const upServices = services.filter(s => s.status === "up").length; const downServices = services.filter(s => s.status === "down").length; @@ -42,7 +45,7 @@ export const StatusCards = ({ services }: StatusCardsProps) => { >
- UP SERVICES + {t("upServices")} {upServices} @@ -74,7 +77,7 @@ export const StatusCards = ({ services }: StatusCardsProps) => { >
- DOWN SERVICES + {t("downServices")} {downServices} @@ -106,7 +109,7 @@ export const StatusCards = ({ services }: StatusCardsProps) => { > - PAUSED SERVICES + {t("pausedServices")} {pausedServices} @@ -138,7 +141,7 @@ export const StatusCards = ({ services }: StatusCardsProps) => { > - WARNING SERVICES + {t("warningServices")} {warningServices} diff --git a/application/src/components/services/AddServiceDialog.tsx b/application/src/components/services/AddServiceDialog.tsx index 13e5947..af1cb5d 100644 --- a/application/src/components/services/AddServiceDialog.tsx +++ b/application/src/components/services/AddServiceDialog.tsx @@ -9,6 +9,7 @@ import { import { ServiceForm } from "./ServiceForm"; import { ScrollArea } from "@/components/ui/scroll-area"; import { useQueryClient } from "@tanstack/react-query"; +import { useLanguage } from "@/contexts/LanguageContext"; interface AddServiceDialogProps { open: boolean; @@ -16,6 +17,7 @@ interface AddServiceDialogProps { } export function AddServiceDialog({ open, onOpenChange }: AddServiceDialogProps) { + const { t } = useLanguage(); const queryClient = useQueryClient(); const handleSuccess = async () => { // Immediately invalidate and refetch services data @@ -32,9 +34,9 @@ export function AddServiceDialog({ open, onOpenChange }: AddServiceDialogProps) - Create New Service + {t("createNewService")} - Fill in the details to create a new service to monitor. + {t("createNewServiceDesc")} diff --git a/application/src/components/services/add-service/ServiceBasicFields.tsx b/application/src/components/services/add-service/ServiceBasicFields.tsx index e729b73..5eda597 100644 --- a/application/src/components/services/add-service/ServiceBasicFields.tsx +++ b/application/src/components/services/add-service/ServiceBasicFields.tsx @@ -3,22 +3,24 @@ import { FormControl, FormField, FormItem, FormLabel, FormMessage } from "@/comp import { Input } from "@/components/ui/input"; import { UseFormReturn } from "react-hook-form"; import { ServiceFormData } from "./types"; +import {useLanguage} from "@/contexts/LanguageContext.tsx"; interface ServiceBasicFieldsProps { form: UseFormReturn; } export function ServiceBasicFields({ form }: ServiceBasicFieldsProps) { + const { t } = useLanguage(); return ( ( - Service Name + {t('serviceName')} diff --git a/application/src/components/services/add-service/ServiceConfigFields.tsx b/application/src/components/services/add-service/ServiceConfigFields.tsx index 7145df3..b9c2583 100644 --- a/application/src/components/services/add-service/ServiceConfigFields.tsx +++ b/application/src/components/services/add-service/ServiceConfigFields.tsx @@ -6,12 +6,14 @@ import { UseFormReturn } from "react-hook-form"; import { ServiceFormData } from "./types"; import { ServiceUrlField } from "./ServiceUrlField"; import { useState } from "react"; +import {useLanguage} from "@/contexts/LanguageContext.tsx"; interface ServiceConfigFieldsProps { form: UseFormReturn; } export function ServiceConfigFields({ form }: ServiceConfigFieldsProps) { + const { t } = useLanguage(); const [isCustomInterval, setIsCustomInterval] = useState(false); const intervalValue = form.watch("interval"); @@ -35,7 +37,7 @@ export function ServiceConfigFields({ form }: ServiceConfigFieldsProps) { name="interval" render={({ field }) => ( - Check Interval + {t("checkInterval")} {!isCustomInterval ? ( @@ -58,7 +60,7 @@ export function ServiceConfigFields({ form }: ServiceConfigFieldsProps) { - Back to presets + {t("backToPresets")} )} {isCustomInterval - ? "Enter custom interval in seconds (minimum 10 seconds)" - : "How often to check the service status" + ? t("checkIntervalDescCustom") + : t("checkIntervalDesc") } @@ -92,22 +94,22 @@ export function ServiceConfigFields({ form }: ServiceConfigFieldsProps) { name="retries" render={({ field }) => ( - Retry Attempts + {t("retryAttempts")} - Number of retry attempts before marking as down + {t("retryAttemptsDesc")} diff --git a/application/src/components/services/add-service/ServiceForm.tsx b/application/src/components/services/add-service/ServiceForm.tsx index a888b11..3023ff6 100644 --- a/application/src/components/services/add-service/ServiceForm.tsx +++ b/application/src/components/services/add-service/ServiceForm.tsx @@ -3,7 +3,7 @@ import { useForm } from "react-hook-form"; import { zodResolver } from "@hookform/resolvers/zod"; import { useState, useEffect } from "react"; import { useToast } from "@/hooks/use-toast"; -import { serviceSchema, ServiceFormData } from "./types"; +import { useServiceSchema, ServiceFormData } from "./types"; import { ServiceBasicFields } from "./ServiceBasicFields"; import { ServiceTypeField } from "./ServiceTypeField"; import { ServiceConfigFields } from "./ServiceConfigFields"; @@ -14,6 +14,7 @@ import { Service } from "@/types/service.types"; import { ServiceRegionalFields } from "./ServiceRegionalFields"; import { getServiceFormDefaults, mapServiceToFormData, mapFormDataToServiceData } from "./serviceFormUtils"; import { useQueryClient } from "@tanstack/react-query"; +import {useLanguage} from "@/contexts/LanguageContext.tsx"; interface ServiceFormProps { onSuccess: () => void; @@ -30,10 +31,13 @@ export function ServiceForm({ isEdit = false, onSubmitStart }: ServiceFormProps) { + const { t } = useLanguage(); const { toast } = useToast(); const [isSubmitting, setIsSubmitting] = useState(false); const queryClient = useQueryClient(); + const serviceSchema = useServiceSchema(); + // Initialize form with default values const form = useForm({ resolver: zodResolver(serviceSchema), @@ -124,23 +128,23 @@ export function ServiceForm({
-

Basic Information

+

{t('basicInformation')}

-

Configuration

+

{t('configuration')}

-

Regional Monitoring

+

{t('regionalMonitoring')}

-

Notifications

+

{t('notifications')}

@@ -148,7 +152,7 @@ export function ServiceForm({ diff --git a/application/src/components/services/add-service/ServiceNotificationFields.tsx b/application/src/components/services/add-service/ServiceNotificationFields.tsx index 075b253..32da21f 100644 --- a/application/src/components/services/add-service/ServiceNotificationFields.tsx +++ b/application/src/components/services/add-service/ServiceNotificationFields.tsx @@ -9,12 +9,14 @@ import { useQuery } from "@tanstack/react-query"; import { alertConfigService, AlertConfiguration } from "@/services/alertConfigService"; import { serviceNotificationTemplateService, ServiceNotificationTemplate } from "@/services/serviceNotificationTemplateService"; import { useState, useEffect } from "react"; +import { useLanguage } from "@/contexts/LanguageContext.tsx"; interface ServiceNotificationFieldsProps { form: UseFormReturn; } export function ServiceNotificationFields({ form }: ServiceNotificationFieldsProps) { + const { t } = useLanguage(); const [alertConfigs, setAlertConfigs] = useState([]); // Get the current form values for debugging @@ -88,10 +90,10 @@ export function ServiceNotificationFields({ form }: ServiceNotificationFieldsPro
- Enable Notifications + {t("enableNotifications")} - Enable or disable notifications for this service + {t("enableNotificationsDesc")}
@@ -115,11 +117,11 @@ export function ServiceNotificationFields({ form }: ServiceNotificationFieldsPro name="notificationChannels" render={({ field }) => ( - Notification Channels + {t("notificationChannels")} {notificationStatus === "enabled" - ? "Select notification channels for this service" - : "Enable notifications first to select channels"} + ? t("notificationChannelsEnabledDesc") + : t("notificationChannelsDesc")} {/* Display selected channels as badges */} @@ -144,7 +146,7 @@ export function ServiceNotificationFields({ form }: ServiceNotificationFieldsPro value="" // Always reset to empty after selection > - + {alertConfigs @@ -169,7 +171,7 @@ export function ServiceNotificationFields({ form }: ServiceNotificationFieldsPro return ( - Alert Template + {t("alertTemplate")} HTTP/S

- Monitor websites and REST APIs with HTTP/HTTPS Protocol + {t("serviceTypeHTTPDesc")}

@@ -67,7 +69,7 @@ export function ServiceTypeField({ form }: ServiceTypeFieldProps) { PING

- Monitor host availability with PING Protocol + {t("serviceTypePINGDesc")}

@@ -78,7 +80,7 @@ export function ServiceTypeField({ form }: ServiceTypeFieldProps) { TCP

- Monitor TCP port connectivity with TCP Protocol + {t("serviceTypeTCPDesc")}

@@ -89,7 +91,7 @@ export function ServiceTypeField({ form }: ServiceTypeFieldProps) { DNS

- Monitor DNS resolution + {t("serviceTypeDNSDesc")}

diff --git a/application/src/components/services/add-service/ServiceUrlField.tsx b/application/src/components/services/add-service/ServiceUrlField.tsx index f8419c4..8b4aee0 100644 --- a/application/src/components/services/add-service/ServiceUrlField.tsx +++ b/application/src/components/services/add-service/ServiceUrlField.tsx @@ -3,12 +3,14 @@ import { FormControl, FormField, FormItem, FormLabel, FormMessage, FormDescripti import { Input } from "@/components/ui/input"; import { UseFormReturn } from "react-hook-form"; import { ServiceFormData } from "./types"; +import { useLanguage } from "@/contexts/LanguageContext.tsx"; interface ServiceUrlFieldProps { form: UseFormReturn; } export function ServiceUrlField({ form }: ServiceUrlFieldProps) { + const { t } = useLanguage(); const serviceType = form.watch("type"); const getPlaceholder = () => { @@ -22,35 +24,35 @@ export function ServiceUrlField({ form }: ServiceUrlFieldProps) { case "dns": return "example.com"; default: - return "Enter URL or hostname"; + return t("targetDefaultPlaceholder"); } }; const getDescription = () => { switch (serviceType) { case "http": - return "Enter the full URL including protocol (http:// or https://)"; + return t("targetHTTPDesc"); case "ping": - return "Enter hostname or IP address to ping"; + return t("targetPINGDesc"); case "tcp": - return "Enter hostname or IP address for TCP connection test"; + return t("targetTCPDesc"); case "dns": - return "Enter domain name for DNS record monitoring (A, AAAA, MX, etc.)"; + return t("targetDNSDesc"); default: - return "Enter the target URL or hostname for monitoring"; + return t("targetDefaultDesc"); } }; const getFieldLabel = () => { switch (serviceType) { case "dns": - return "Domain Name"; + return t("targetDNS"); case "ping": return "Hostname/IP"; case "tcp": return "Hostname/IP"; default: - return "Target URL/Host"; + return t("targetDefault"); } }; @@ -99,7 +101,7 @@ export function ServiceUrlField({ form }: ServiceUrlFieldProps) { />
- Enter the port number for TCP connection test + {t("targetTCPPortDesc")}
diff --git a/application/src/components/services/add-service/types.ts b/application/src/components/services/add-service/types.ts index 4269a42..d3f8033 100644 --- a/application/src/components/services/add-service/types.ts +++ b/application/src/components/services/add-service/types.ts @@ -1,22 +1,42 @@ - import { z } from "zod"; +import type { ZodSchema } from "zod"; +import { useLanguage } from "@/contexts/LanguageContext"; -export const serviceSchema = z.object({ - name: z.string().min(1, "Service name is required"), - type: z.enum(["http", "ping", "tcp", "dns"]), - url: z.string().min(1, "URL/Domain/Host is required").refine((value) => { - // Basic validation - more specific validation can be added per type - return value.trim().length > 0; - }, "Please enter a valid URL, hostname, or domain"), - port: z.string().optional(), - interval: z.string(), - retries: z.string(), - notificationStatus: z.enum(["enabled", "disabled"]).optional(), - notificationChannels: z.array(z.string()).optional(), - alertTemplate: z.string().optional(), - // Regional monitoring fields - now supports multiple agents - regionalMonitoringEnabled: z.boolean().optional(), - regionalAgents: z.array(z.string()).optional(), -}); -export type ServiceFormData = z.infer; \ No newline at end of file +export type ServiceFormData = { + name: string; + type: "http" | "ping" | "tcp" | "dns"; + url: string; + port?: string; + interval: string; + retries: string; + notificationStatus?: "enabled" | "disabled"; + notificationChannels?: string[]; + alertTemplate?: string; + regionalMonitoringEnabled?: boolean; + regionalAgents?: string[]; +}; + +// Hook to use the schema with translations +export const useServiceSchema = () => { + const { t } = useLanguage(); + return z.object({ + name: z.string().min(1, t("serviceNameRequired")), + type: z.enum(["http", "ping", "tcp", "dns"]), + url: z.string() + .min(1, t("urlDomainHostRequired")) + .refine( + (value) => value.trim().length > 0, + t("enterValidUrlHostnameDomain") + ), + port: z.string().optional(), + interval: z.string(), + retries: z.string(), + notificationStatus: z.enum(["enabled", "disabled"]).optional(), + notificationChannels: z.array(z.string()).optional(), + alertTemplate: z.string().optional(), + // Regional monitoring fields - now supports multiple agents + regionalMonitoringEnabled: z.boolean().optional(), + regionalAgents: z.array(z.string()).optional(), + }); +}; \ No newline at end of file diff --git a/application/src/components/settings/data-retention/DataRetentionSettings.tsx b/application/src/components/settings/data-retention/DataRetentionSettings.tsx index 15c1d58..5aa246b 100644 --- a/application/src/components/settings/data-retention/DataRetentionSettings.tsx +++ b/application/src/components/settings/data-retention/DataRetentionSettings.tsx @@ -170,7 +170,7 @@ const DataRetentionSettings = () => { - Permission Notice: As an admin user, you do not have access to data retention settings. These settings can only be accessed and modified by Super Admins. + {t("permissionNotice")} As an admin user, you do not have access to data retention settings. These settings can only be accessed and modified by Super Admins.
diff --git a/application/src/components/settings/general/GeneralSettingsPanel.tsx b/application/src/components/settings/general/GeneralSettingsPanel.tsx index b990634..70019d3 100644 --- a/application/src/components/settings/general/GeneralSettingsPanel.tsx +++ b/application/src/components/settings/general/GeneralSettingsPanel.tsx @@ -143,7 +143,7 @@ const GeneralSettingsPanel: React.FC = () => { - Permission Notice: As an admin user, you do not have access to view or modify system and mail settings. These settings can only be accessed and modified by Super Admins. Contact your Super Admin if you need to make changes to system configuration or mail settings. + {t("permissionNotice")} {t("permissionNoticeAddUser")}
@@ -153,11 +153,11 @@ const GeneralSettingsPanel: React.FC = () => { } if (isLoading) { - return
Loading settings...
; + return
{t("loadingSettings")}
; } if (error) { - return
Error loading settings
; + return
{t("loadingSettingsError")}
; } return ( diff --git a/application/src/components/settings/user-management/UserManagement.tsx b/application/src/components/settings/user-management/UserManagement.tsx index 5865377..9e4e04f 100644 --- a/application/src/components/settings/user-management/UserManagement.tsx +++ b/application/src/components/settings/user-management/UserManagement.tsx @@ -10,7 +10,10 @@ import { UserCog, Loader2, AlertCircle, Info, Users, ShieldAlert } from "lucide- import { Button } from "@/components/ui/button"; import { Alert, AlertDescription } from "@/components/ui/alert"; import { authService } from "@/services/authService"; +import { useLanguage } from "@/contexts/LanguageContext.tsx"; + const UserManagement = () => { + const { t } = useLanguage(); const { users, loading, @@ -44,21 +47,21 @@ const UserManagement = () => {
- User Management + {t("userManagement")}
-

User Management

+

{t("userManagement")}

{isSuperAdmin && }
{!isSuperAdmin && - Permission Notice: As an admin user, you have access to view and modify existing user details. However, only Super Admins have permission to create new user accounts. Contact your Super Admin if you need to add a new user. + {t("permissionNotice")} As an admin user, you have access to view and modify existing user details. However, only Super Admins have permission to create new user accounts. Contact your Super Admin if you need to add a new user. } diff --git a/application/src/contexts/LanguageContext.tsx b/application/src/contexts/LanguageContext.tsx index b70f3dc..4419d86 100644 --- a/application/src/contexts/LanguageContext.tsx +++ b/application/src/contexts/LanguageContext.tsx @@ -1,4 +1,4 @@ -import React, { createContext, useContext, useState, ReactNode } from "react"; +import React, { createContext, useContext, useState, ReactNode, useCallback } from "react"; import { translations, Language, TranslationModule, TranslationKey } from "@/translations"; type LanguageContextType = { @@ -21,27 +21,39 @@ export const useLanguage = () => { export const LanguageProvider = ({ children }: { children: ReactNode }) => { const [language, setLanguage] = useState("en"); + const fallbackLanguage: Language = "en"; - const t = (key: string, module?: M): string => { + const t = useCallback((key: string, module?: M): string => { + const langPack = translations[language]; + const fallbackPack = translations[fallbackLanguage]; if (module) { - const translatedValue = translations[language][module][key as TranslationKey]; - return typeof translatedValue === "string" ? translatedValue : key; + const valCur = langPack?.[module]?.[key as TranslationKey]; + if (typeof valCur === "string") return valCur; + + const valEn = fallbackPack?.[module]?.[key as TranslationKey]; + if (typeof valEn === "string") return valEn; + + return key; } - for (const mod in translations[language]) { - const moduleKey = mod as TranslationModule; - const translatedValue = translations[language][moduleKey][key as any]; - if (translatedValue && typeof translatedValue === "string") { - return translatedValue; - } + for (const mod in langPack) { + const m = mod as TranslationModule; + const val = langPack[m]?.[key as any]; + if (typeof val === "string") return val; + } + + for (const mod in fallbackPack) { + const m = mod as TranslationModule; + const val = fallbackPack[m]?.[key as any]; + if (typeof val === "string") return val; } return key; - }; + }, [language]); return ( {children} ); -}; +}; \ No newline at end of file diff --git a/application/src/translations/de/about.ts b/application/src/translations/de/about.ts index ba49c4e..90ea64c 100644 --- a/application/src/translations/de/about.ts +++ b/application/src/translations/de/about.ts @@ -2,7 +2,7 @@ import { AboutTranslations } from '../types/about'; export const aboutTranslations: AboutTranslations = { - aboutCheckcle: "Über Checkcle", + aboutCheckCle: "Über Checkcle", systemDescription: "Checkcle ist ein Open-Source-Überwachungs-Stack, der Echtzeit-Einblicke in Server- und Dienstzustände, Vorfallmanagement und operative Transparenz bietet. Veröffentlicht unter der MIT-Lizenz.", systemVersion: "Systemversion", license: "Lizenz", @@ -15,6 +15,7 @@ export const aboutTranslations: AboutTranslations = { quickActions: "Schnelle Aktionen", quickActionsDescription: "Greifen Sie schnell auf gängige Überwachungsvorgänge und -funktionen zu. Wählen Sie unten eine Aktion aus, um loszulegen.", quickTips: "Schnelle Tipps", + releasedOn: "Veröffentlicht", }; diff --git a/application/src/translations/de/common.ts b/application/src/translations/de/common.ts index 070ace3..5d439c2 100644 --- a/application/src/translations/de/common.ts +++ b/application/src/translations/de/common.ts @@ -6,9 +6,10 @@ export const commonTranslations: CommonTranslations = { logout: "Abmelden", language: "Sprache", english: "Englisch", - khmer: "Khmer", + khmer: "ភាសាខ្មែរ", german: "Deutsch", - simplifiedChinese: "Simplified Chinese", + japanese: "日本語", + simplifiedChinese: "简体中文", goodMorning: "Guten Morgen", goodAfternoon: "Guten Nachmittag", goodEvening: "Guten Abend", diff --git a/application/src/translations/de/incident.ts b/application/src/translations/de/incident.ts index 9236dab..bb83ba0 100644 --- a/application/src/translations/de/incident.ts +++ b/application/src/translations/de/incident.ts @@ -51,4 +51,5 @@ export const incidentTranslations: IncidentTranslations = { configuration: 'Konfiguration', failedToUpdateStatus: 'Fehler beim Aktualisieren des Status', inProgress: 'In Bearbeitung', + enterRootCause: 'Grundursache eingeben', }; diff --git a/application/src/translations/de/services.ts b/application/src/translations/de/services.ts index 0dee15a..424d57e 100644 --- a/application/src/translations/de/services.ts +++ b/application/src/translations/de/services.ts @@ -4,10 +4,20 @@ import { ServicesTranslations } from '../types/services'; export const servicesTranslations: ServicesTranslations = { // Dienst-Tabelle serviceName: "Dienstname", + serviceNameDesc: "Geben Sie einen aussagekräftigen Namen für Ihren Service ein", serviceType: "Diensttyp", serviceStatus: "Dienststatus", responseTime: "Antwortzeit", uptime: "Betriebszeit", lastChecked: "Zuletzt überprüft", noServices: "Keine Dienste entsprechen Ihren Filterkriterien.", + currentlyMonitoring: "Derzeit überwacht", + retry: "Wiederholen", + overview: "Überblick", + newService: "Neuer Dienst", + rowsPerPage: "Zeilen pro Seite", + search: "Suchen", + allTypes: "Alle Arten", + createNewService: "Neuen Service hinzufügen", + createNewServiceDesc: "Geben Sie detaillierte Informationen ein, um einen neuen zu erstellen, den Sie überwachen möchten.", }; diff --git a/application/src/translations/de/ssl.ts b/application/src/translations/de/ssl.ts index 877b4b2..eb51064 100644 --- a/application/src/translations/de/ssl.ts +++ b/application/src/translations/de/ssl.ts @@ -112,6 +112,7 @@ export const sslTranslations: SSLTranslations = { created: "Erstellt", lastUpdated: "Zuletzt aktualisiert", lastNotification: "Letzte Benachrichtigung", - collectionId: "Sammlungs-ID" + collectionId: "Sammlungs-ID", + noCertificatesFound: "Keine Zertifikate gefunden", } diff --git a/application/src/translations/en/about.ts b/application/src/translations/en/about.ts index 83e4071..ef6ddcc 100644 --- a/application/src/translations/en/about.ts +++ b/application/src/translations/en/about.ts @@ -2,7 +2,7 @@ import { AboutTranslations } from '../types/about'; export const aboutTranslations: AboutTranslations = { - aboutCheckcle: "About Checkcle", + aboutCheckCle: "About Checkcle", systemDescription: "Checkcle is an open-source monitoring stack offering real-time insights into server and service health, incident management, and operational transparency. Released as MIT License.", systemVersion: "System Version", license: "License", @@ -15,4 +15,5 @@ export const aboutTranslations: AboutTranslations = { quickActions: "Quick Actions", quickActionsDescription: "Access common monitoring operations and features quickly. Select an action below to get started.", quickTips: "Quick Tips", + releasedOn: "Released On", }; diff --git a/application/src/translations/en/common.ts b/application/src/translations/en/common.ts index 4c02002..7033ff1 100644 --- a/application/src/translations/en/common.ts +++ b/application/src/translations/en/common.ts @@ -5,10 +5,11 @@ export const commonTranslations: CommonTranslations = { welcome: "Welcome", logout: "Logout", language: "Language", - english: "English", - khmer: "Khmer", + english: "Englisch", + khmer: "ភាសាខ្មែរ", german: "Deutsch", - simplifiedChinese: "Simplified Chinese", + japanese: "日本語", + simplifiedChinese: "简体中文", goodMorning: "Good morning", goodAfternoon: "Good afternoon", goodEvening: "Good evening", diff --git a/application/src/translations/en/incident.ts b/application/src/translations/en/incident.ts index 461babd..f7effaa 100644 --- a/application/src/translations/en/incident.ts +++ b/application/src/translations/en/incident.ts @@ -52,4 +52,5 @@ export const incidentTranslations: IncidentTranslations = { configuration: 'Configuration', failedToUpdateStatus: 'Failed to update status', inProgress: 'In Progress', + enterRootCause: 'Enter Root Cause', }; diff --git a/application/src/translations/en/services.ts b/application/src/translations/en/services.ts index 5501bd1..3058a85 100644 --- a/application/src/translations/en/services.ts +++ b/application/src/translations/en/services.ts @@ -2,11 +2,97 @@ import { ServicesTranslations } from '../types/services'; export const servicesTranslations: ServicesTranslations = { - serviceName: "Service Name", - serviceType: "Service Type", serviceStatus: "Service Status", responseTime: "Response Time", uptime: "Uptime", lastChecked: "Last Checked", noServices: "No services match your filter criteria.", -}; + currentlyMonitoring: "Currently Monitoring", + retry: "Retry", + overview: "Overview", + newService: "NewService", + rowsPerPage: "Rows Per Page", + search: "Search", + allTypes: "All Types", + createNewService: "Create New Service", + createNewServiceDesc: "Fill in the details to create a new service to monitor.", + + // ServiceBasicFields.tsx + serviceName: "Service Name", + serviceNameDesc: "Enter a descriptive name for your service", + + // ServiceConfigFields.tsx + checkInterval: "Check Interval", + seconds: "seconds", + minute: "minute", + minutes: "minutes", + hour: "hour", + hours: "hours", + custom: "Custom", + checkIntervalPlaceholder: "Enter interval in seconds", + backToPresets: "Back to presets", + checkIntervalDesc: "How often to check the service status", + checkIntervalDescCustom: "Enter custom interval in seconds (minimum 10 seconds)", + retryAttempts: "Retry Attempts", + attempt: "attempt", + attempts: "attempts", + retryAttemptsDesc: "Number of retry attempts before marking as down", + + // ServiceForm.tsx + updateService: "Update Service", + createService: "Create Service", + + // ServiceNotificationFields.tsx + enableNotifications: "Enable Notifications", + enableNotificationsDesc: "Enable or disable notifications for this service", + notificationChannels: "Notification Channels", + notificationChannelsEnabledDesc: "Select notification channels for this service", + notificationChannelsDesc: "Enable notifications first to select channels", + notificationChannelsPlaceholder: "Add a notification channel", + alertTemplate: "Alert Template", + alertTemplateLoading: "Loading templates...", + alertTemplatePlaceholder: "Select an alert template", + alertTemplateEnabledDesc: "Choose a template for alert messages", + alertTemplateDesc: "Enable notifications first to select template", + + // ServiceTypeField.tsx + serviceType: "Service Type", + serviceTypeHTTPDesc: "Monitor websites and REST APIs with HTTP/HTTPS Protocol", + serviceTypePINGDesc: "Monitor host availability with PING Protocol", + serviceTypeTCPDesc: "Monitor TCP port connectivity with TCP Protocol", + serviceTypeDNSDesc: "Monitor DNS resolution", + + // ServiceRegionalFields.tsx + regionalMonitoring: "Regional Monitoring", + regionalMonitoringDesc: "Assign this service to regional monitoring agents for distributed monitoring", + regionalAgents: "Regional Agents", + regionalAgentsLoading: "Loading agents...", + regionalAgentsAvailablePlaceholder: "Select additional regional agents...", + regionalAgentsAllSelected: "All available agents selected", + regionalAgentsNoAvailable: "No regional agents available", + regionalAgentsNoOnlineAvailable: "No online regional agents available", + regionalAgentsNotFoundMessage: "No online regional agents found. Services will use default monitoring.", + regionalAgentsNotSelectedMessage: "No regional agents selected. Service will use default monitoring.", + + // ServiceUrlField.tsx + targetDefault: "Target URL/Host", + targetDNS: "Domain Name", + targetHTTPDesc: "Enter the full URL including protocol (http:// or https://)", + targetPINGDesc: "Enter hostname or IP address to ping", + targetTCPDesc: "Enter hostname or IP address for TCP connection test", + targetTCPPortDesc: "Enter the port number for TCP connection test", + targetDNSDesc: "Enter domain name for DNS record monitoring (A, AAAA, MX, etc.)", + targetDefaultDesc: "Enter the target URL or hostname for monitoring", + targetDefaultPlaceholder: "Enter URL or hostname", + + // types.ts + serviceNameRequired: "Service name is required", + urlDomainHostRequired: "URL/Domain/Host is required", + enterValidUrlHostnameDomain: "Please enter a valid URL, hostname, or domain", + + // Dashboard + upServices: "UP SERVICES", + downServices: "DOWN SERVICES", + pausedServices: "PAUSED SERVICES", + warningServices: "WARNING SERVICES", +}; \ No newline at end of file diff --git a/application/src/translations/en/settings.ts b/application/src/translations/en/settings.ts index 9681f86..16077c5 100644 --- a/application/src/translations/en/settings.ts +++ b/application/src/translations/en/settings.ts @@ -2,18 +2,18 @@ import { SettingsTranslations } from '../types/settings'; export const settingsTranslations: SettingsTranslations = { - // Tabs + // General Settings - Tabs systemSettings: "System Settings", mailSettings: "Mail Settings", - // System Settings + // General Settings - System Settings appName: "Application Name", appURL: "Application URL", senderName: "Sender Name", senderEmail: "Sender Email Address", hideControls: "Hide Controls", - // Mail Settings + // General Settings - Mail Settings smtpSettings: "SMTP Configuration", smtpEnabled: "Enable SMTP", smtpHost: "SMTP Host", @@ -24,7 +24,7 @@ export const settingsTranslations: SettingsTranslations = { enableTLS: "Enable TLS", localName: "Local Name", - // Test Email + // General Settings - Test Email testEmail: "Test Email", sendTestEmail: "Send test email", emailTemplate: "Email template", @@ -39,7 +39,7 @@ export const settingsTranslations: SettingsTranslations = { enterEmailAddress: "Enter email address", sending: "Sending...", - // Actions and status + // General Settings - Actions and status save: "Save Changes", saving: "Saving...", settingsUpdated: "Settings updated successfully", @@ -48,5 +48,12 @@ export const settingsTranslations: SettingsTranslations = { testConnection: "Test Connection", testingConnection: "Testing Connection...", connectionSuccess: "Connection successful", - connectionFailed: "Connection failed" + connectionFailed: "Connection failed", + + // User Management + addUser: "Add User", + permissionNotice: "Permission Notice:", + permissionNoticeAddUser: "As an admin user, you do not have access to view or modify system and mail settings. These settings can only be accessed and modified by Super Admins. Contact your Super Admin if you need to make changes to system configuration or mail settings.", + loadingSettings: "Loading settings...", + loadingSettingsError: "Error loading settings", }; \ No newline at end of file diff --git a/application/src/translations/en/ssl.ts b/application/src/translations/en/ssl.ts index 1b2df8c..4cc13d8 100644 --- a/application/src/translations/en/ssl.ts +++ b/application/src/translations/en/ssl.ts @@ -112,5 +112,6 @@ export const sslTranslations: SSLTranslations = { created: "Created", lastUpdated: "Last Updated", lastNotification: "Last Notification", - collectionId: "Collection ID" + collectionId: "Collection ID", + noCertificatesFound: "No Certificates Found", }; diff --git a/application/src/translations/ja/about.ts b/application/src/translations/ja/about.ts index b8965f1..4f4799d 100644 --- a/application/src/translations/ja/about.ts +++ b/application/src/translations/ja/about.ts @@ -1,7 +1,7 @@ import { AboutTranslations } from '../types/about'; export const aboutTranslations: AboutTranslations = { - aboutCheckcle: "Checkcleについて", + aboutCheckCle: "Checkcleについて", systemDescription: "Checkcleは、サーバーとサービスの健全性に関するリアルタイム監視、インシデント管理、運用の透明性を提供するオープンソースの監視スタックです。MIT ライセンスの下で公開されています。", systemVersion: "システムバージョン", license: "ライセンス", @@ -14,4 +14,5 @@ export const aboutTranslations: AboutTranslations = { quickActions: "クイックアクション", quickActionsDescription: "一般的な監視操作と機能に素早くアクセスできます。開始するには、以下のアクションを選択してください。", quickTips: "クイックヒント", + releasedOn: "公開日", }; \ No newline at end of file diff --git a/application/src/translations/ja/common.ts b/application/src/translations/ja/common.ts index c8f0ce7..f53f178 100644 --- a/application/src/translations/ja/common.ts +++ b/application/src/translations/ja/common.ts @@ -4,11 +4,11 @@ export const commonTranslations: CommonTranslations = { welcome: "ようこそ", logout: "ログアウト", language: "言語", - english: "English", - khmer: "Khmer", + english: "Englisch", + khmer: "ភាសាខ្មែរ", german: "Deutsch", - simplifiedChinese: "简体中文", japanese: "日本語", + simplifiedChinese: "简体中文", goodMorning: "おはようございます", goodAfternoon: "こんにちは", goodEvening: "こんばんは", diff --git a/application/src/translations/ja/incident.ts b/application/src/translations/ja/incident.ts index b591f3c..331a832 100644 --- a/application/src/translations/ja/incident.ts +++ b/application/src/translations/ja/incident.ts @@ -51,4 +51,5 @@ export const incidentTranslations: IncidentTranslations = { configuration: '設定', failedToUpdateStatus: 'ステータスの更新に失敗しました', inProgress: '進行中', + enterRootCause: '原因を入力してください', }; \ No newline at end of file diff --git a/application/src/translations/ja/services.ts b/application/src/translations/ja/services.ts index 668a644..bb64ae0 100644 --- a/application/src/translations/ja/services.ts +++ b/application/src/translations/ja/services.ts @@ -2,10 +2,20 @@ import { ServicesTranslations } from '../types/services'; export const servicesTranslations: ServicesTranslations = { serviceName: "サービス名", + serviceNameDesc: "サービスのわかりやすい名前を入力してください", serviceType: "サービスタイプ", serviceStatus: "サービスステータス", responseTime: "応答時間", uptime: "稼働時間", lastChecked: "最終チェック", noServices: "フィルタ条件に一致するサービスがありません。", + currentlyMonitoring: "現在監視中", + retry: "再試行", + overview: "概要", + newService: "新しいサービス", + rowsPerPage: "1ページあたりの行数", + search: "検索", + allTypes: "すべてのタイプ", + createNewService: "新しいサービスを作成", + createNewServiceDesc: "監視する新しいサービスを作成するには、詳細を入力してください。", }; \ No newline at end of file diff --git a/application/src/translations/ja/ssl.ts b/application/src/translations/ja/ssl.ts index 4d2f7db..2fb3622 100644 --- a/application/src/translations/ja/ssl.ts +++ b/application/src/translations/ja/ssl.ts @@ -111,5 +111,6 @@ export const sslTranslations: SSLTranslations = { created: "作成日", lastUpdated: "最終更新", lastNotification: "最終通知", - collectionId: "コレクションID" + collectionId: "コレクションID", + noCertificatesFound: "証明書が見つかりません", }; \ No newline at end of file diff --git a/application/src/translations/km/about.ts b/application/src/translations/km/about.ts index dd44555..01183cf 100644 --- a/application/src/translations/km/about.ts +++ b/application/src/translations/km/about.ts @@ -2,7 +2,7 @@ import { AboutTranslations } from '../types/about'; export const aboutTranslations: AboutTranslations = { - aboutCheckcle: "អំពី Checkcle", + aboutCheckCle: "អំពី Checkcle", systemDescription: "Checkcle គឺជាស្តាកការត្រួតពិនិត្យប្រភពបើកទូលាយដែលផ្តល់នូវការយល់ដឹងជាក់ស្តែងអំពីសុខភាពម៉ាស៊ីនមេ និងសេវាកម្ម, ការគ្រប់គ្រងឧបទ្ទវហេតុ, និងតម្លាភាពនៃប្រតិបត្តិការ។ ចេញផ្សាយជាអាជ្ញាបណ្ណ MIT។", systemVersion: "កំណែប្រព័ន្ធ", license: "អាជ្ញាបណ្ណ", @@ -15,4 +15,5 @@ export const aboutTranslations: AboutTranslations = { quickActions: "សកម្មភាពរហ័ស", quickActionsDescription: "ចូលប្រើប្រតិបត្តិការត្រួតពិនិត្យ និងមុខងារទូទៅយ៉ាងរហ័ស។ ជ្រើសរើសសកម្មភាពខាងក្រោមដើម្បីចាប់ផ្តើម។", quickTips: "គន្លឹះរហ័ស", + releasedOn: "បានចេញផ្សាយនៅថ្ងៃទី", }; \ No newline at end of file diff --git a/application/src/translations/km/common.ts b/application/src/translations/km/common.ts index 47219ce..1215cfa 100644 --- a/application/src/translations/km/common.ts +++ b/application/src/translations/km/common.ts @@ -5,9 +5,10 @@ export const commonTranslations: CommonTranslations = { welcome: "សូមស្វាគមន៍", logout: "ចាកចេញ", language: "ភាសា", - english: "អង់គ្លេស", - khmer: "ខ្មែរ", + english: "Englisch", + khmer: "ភាសាខ្មែរ", german: "Deutsch", + japanese: "日本語", simplifiedChinese: "简体中文", goodMorning: "អរុណសួស្តី", goodAfternoon: "ទិវាសួស្តី", diff --git a/application/src/translations/km/incident.ts b/application/src/translations/km/incident.ts index c33191f..32cea91 100644 --- a/application/src/translations/km/incident.ts +++ b/application/src/translations/km/incident.ts @@ -52,4 +52,5 @@ export const incidentTranslations: IncidentTranslations = { configuration: "ការកំណត់រចនាសម្ព័ន្ធ", failedToUpdateStatus: "បរាជ័យក្នុងការធ្វើបច្ចុប្បន្នភាពស្ថានភាព", inProgress: "កំពុងដំណើរការ", + enterRootCause: 'បញ្ចូលហេតុផលដើម', }; diff --git a/application/src/translations/km/services.ts b/application/src/translations/km/services.ts index 658ac75..9cab3fc 100644 --- a/application/src/translations/km/services.ts +++ b/application/src/translations/km/services.ts @@ -3,10 +3,20 @@ import { ServicesTranslations } from '../types/services'; export const servicesTranslations: ServicesTranslations = { serviceName: "ឈ្មោះសេវាកម្ម", + serviceNameDesc: "បញ្ចូលឈ្មោះពិពណ៌នាសម្រាប់សេវាកម្មរបស់អ្នក", serviceType: "ប្រភេទសេវាកម្ម", serviceStatus: "ស្ថានភាពសេវាកម្ម", responseTime: "ពេលវេលាឆ្លើយតប", uptime: "ពេលវេលាដំណើរការ", lastChecked: "ពិនិត្យចុងក្រោយ", noServices: "មិនមានសេវាកម្មដែលត្រូវនឹងលក្ខណៈវិនិច្ឆ័យរបស់អ្នក។", + currentlyMonitoring: "កំពុងតាមដានពេលនេះ", + retry: "សាកល្បងម្ដងទៀត", + overview: "ទិដ្ឋភាពទូទៅ", + newService: "សេវាកម្មថ្មី", + rowsPerPage: "ចំនួនជួរដេកក្នុងមួយទំព័រ", + search: "ស្វែងរក", + allTypes: "គ្រប់ប្រភេទ", + createNewService: "បង្កើតសេវាកម្មថ្មី", + createNewServiceDesc: "បញ្ចូលព័ត៌មានលម្អិតដើម្បីបង្កើតសេវាកម្មថ្មីដែលត្រូវតាមដាន។", }; diff --git a/application/src/translations/km/ssl.ts b/application/src/translations/km/ssl.ts index 10ba129..05cb0fa 100644 --- a/application/src/translations/km/ssl.ts +++ b/application/src/translations/km/ssl.ts @@ -112,5 +112,6 @@ export const sslTranslations: SSLTranslations = { created: "បានបង្កើត", lastUpdated: "បានធ្វើបច្ចុប្បន្នភាពចុងក្រោយ", lastNotification: "ការជូនដំណឹងចុងក្រោយ", - collectionId: "លេខសម្គាល់ប្រមូលផ្តុំ" + collectionId: "លេខសម្គាល់ប្រមូលផ្តុំ", + noCertificatesFound: "រកមិនឃើញវិញ្ញាបនប័ត្រ", }; diff --git a/application/src/translations/types/about.ts b/application/src/translations/types/about.ts index 7197b39..9d8a1f6 100644 --- a/application/src/translations/types/about.ts +++ b/application/src/translations/types/about.ts @@ -13,4 +13,5 @@ export interface AboutTranslations { quickActions: string; quickActionsDescription: string; quickTips: string; + releasedOn: string; } diff --git a/application/src/translations/types/incident.ts b/application/src/translations/types/incident.ts index 83d2014..762338e 100644 --- a/application/src/translations/types/incident.ts +++ b/application/src/translations/types/incident.ts @@ -50,4 +50,5 @@ export interface IncidentTranslations { configuration: string; failedToUpdateStatus: string; inProgress: string; + enterRootCause: string; } diff --git a/application/src/translations/types/services.ts b/application/src/translations/types/services.ts index 5d93087..63bd1bd 100644 --- a/application/src/translations/types/services.ts +++ b/application/src/translations/types/services.ts @@ -1,10 +1,96 @@ export interface ServicesTranslations { - serviceName: string; - serviceType: string; + serviceStatus: string; responseTime: string; uptime: string; lastChecked: string; noServices: string; + currentlyMonitoring: string; + retry: string; + overview: string; + newService: string; + rowsPerPage: string; + search: string; + allTypes: string; + createNewService: string; + createNewServiceDesc: string; + + // ServiceBasicFields.tsx + serviceName: string; + serviceNameDesc: string; + + // ServiceConfigFields.tsx + checkInterval: string; + seconds: string; + minute: string; + minutes: string; + hour: string; + hours: string; + custom: string; + checkIntervalPlaceholder: string; + backToPresets: string; + checkIntervalDesc: string; + checkIntervalDescCustom: string; + retryAttempts: string; + attempt: string; + attempts: string; + retryAttemptsDesc: string; + + // ServiceForm.tsx + updateService: string; + createService: string; + + // ServiceNotificationFields.tsx + enableNotifications: string; + enableNotificationsDesc: string; + notificationChannels: string; + notificationChannelsEnabledDesc: string; + notificationChannelsDesc: string; + notificationChannelsPlaceholder: string; + alertTemplate: string; + alertTemplateLoading: string; + alertTemplatePlaceholder: string; + alertTemplateEnabledDesc: string; + alertTemplateDesc: string; + + // ServiceTypeField.tsx + serviceType: string; + serviceTypeHTTPDesc: string; + serviceTypePINGDesc: string; + serviceTypeTCPDesc: string; + serviceTypeDNSDesc: string; + + // ServiceRegionalFields.tsx + regionalMonitoring: string; + regionalMonitoringDesc: string; + regionalAgents: string; + regionalAgentsLoading: string; + regionalAgentsAvailablePlaceholder: string; + regionalAgentsAllSelected: string; + regionalAgentsNoAvailable: string; + regionalAgentsNotFoundMessage: string; + regionalAgentsNotSelectedMessage: string; + + // ServiceUrlField.tsx + targetDefault: string; + targetDNS: string; + targetHTTPDesc: string; + targetPINGDesc: string; + targetTCPDesc: string; + targetTCPPortDesc: string; + targetDNSDesc: string; + targetDefaultDesc: string; + targetDefaultPlaceholder: string; + + // types.ts + serviceNameRequired: string; + urlDomainHostRequired: string; + enterValidUrlHostnameDomain: string; + + // Dashboard + upServices: string; + downServices: string; + pausedServices: string; + warningServices: string; } diff --git a/application/src/translations/types/settings.ts b/application/src/translations/types/settings.ts index 71b07e5..cf4de01 100644 --- a/application/src/translations/types/settings.ts +++ b/application/src/translations/types/settings.ts @@ -1,17 +1,17 @@ export interface SettingsTranslations { - // Tabs + // General Settings - Tabs systemSettings: string; mailSettings: string; - // System Settings + // General Settings - System Settings appName: string; appURL: string; senderName: string; senderEmail: string; hideControls: string; - // Mail Settings + // General Settings - Mail Settings smtpSettings?: string; smtpEnabled: string; smtpHost: string; @@ -22,7 +22,7 @@ export interface SettingsTranslations { enableTLS: string; localName: string; - // Test Email + // General Settings - Test Email testEmail: string; sendTestEmail: string; emailTemplate: string; @@ -37,7 +37,7 @@ export interface SettingsTranslations { enterEmailAddress: string; sending: string; - // Actions and status + // General Settings - Actions and status save: string; saving: string; settingsUpdated: string; @@ -47,4 +47,11 @@ export interface SettingsTranslations { testingConnection: string; connectionSuccess: string; connectionFailed: string; + + // User Management + addUser: string; + permissionNotice: string; + permissionNoticeAddUser: string; + loadingSettings: string; + loadingSettingsError: string; } \ No newline at end of file diff --git a/application/src/translations/types/ssl.ts b/application/src/translations/types/ssl.ts index f42834d..04a6b43 100644 --- a/application/src/translations/types/ssl.ts +++ b/application/src/translations/types/ssl.ts @@ -111,4 +111,5 @@ export interface SSLTranslations { lastUpdated: string; lastNotification: string; collectionId: string; + noCertificatesFound: string; } \ No newline at end of file diff --git a/application/src/translations/zhcn/about.ts b/application/src/translations/zhcn/about.ts index 3914510..f8eb611 100644 --- a/application/src/translations/zhcn/about.ts +++ b/application/src/translations/zhcn/about.ts @@ -2,7 +2,7 @@ import { AboutTranslations } from '../types/about'; export const aboutTranslations: AboutTranslations = { - aboutCheckcle: "关于 Checkcle", + aboutCheckCle: "关于 Checkcle", systemDescription: "Checkcle 是一个开源监控平台,可提供有关服务器和服务健康状况的实时洞察、事件管理以及透明化运营。以 MIT 许可证发布。", systemVersion: "系统版本", license: "许可证", @@ -15,4 +15,5 @@ export const aboutTranslations: AboutTranslations = { quickActions: "快速操作", quickActionsDescription: "快速访问常用的监控操作和功能。选择下面的操作开始。", quickTips: "快速提示", + releasedOn: "发布于", }; diff --git a/application/src/translations/zhcn/common.ts b/application/src/translations/zhcn/common.ts index 0f5b71e..d6b8dad 100644 --- a/application/src/translations/zhcn/common.ts +++ b/application/src/translations/zhcn/common.ts @@ -5,9 +5,10 @@ export const commonTranslations: CommonTranslations = { welcome: "欢迎", logout: "注销", language: "语言", - english: "English", - khmer: "Khmer", + english: "Englisch", + khmer: "ភាសាខ្មែរ", german: "Deutsch", + japanese: "日本語", simplifiedChinese: "简体中文", goodMorning: "早上好", goodAfternoon: "下午好", diff --git a/application/src/translations/zhcn/incident.ts b/application/src/translations/zhcn/incident.ts index 8903f2d..16c21c6 100644 --- a/application/src/translations/zhcn/incident.ts +++ b/application/src/translations/zhcn/incident.ts @@ -52,4 +52,5 @@ export const incidentTranslations: IncidentTranslations = { configuration: '配置', failedToUpdateStatus: '更新状态失败', inProgress: '进行中', + enterRootCause: '输入故障根源', }; diff --git a/application/src/translations/zhcn/maintenance.ts b/application/src/translations/zhcn/maintenance.ts index 7dd51bd..fa8f7c3 100644 --- a/application/src/translations/zhcn/maintenance.ts +++ b/application/src/translations/zhcn/maintenance.ts @@ -4,7 +4,7 @@ import { MaintenanceTranslations } from '../types/maintenance'; export const maintenanceTranslations: MaintenanceTranslations = { scheduledMaintenance: '计划维护', scheduledMaintenanceDesc: '查看和管理您系统和服务的计划维护窗口', - upcomingMaintenance: '即将', + upcomingMaintenance: '计划中', ongoingMaintenance: '进行中', completedMaintenance: '已完成', createMaintenanceWindow: '创建维护', diff --git a/application/src/translations/zhcn/menu.ts b/application/src/translations/zhcn/menu.ts index 30c7ab0..0962799 100644 --- a/application/src/translations/zhcn/menu.ts +++ b/application/src/translations/zhcn/menu.ts @@ -2,7 +2,7 @@ import { MenuTranslations } from '../types/menu'; export const menuTranslations: MenuTranslations = { - uptimeMonitoring: "Uptime 监控", + uptimeMonitoring: "在线监控", instanceMonitoring: "实例监控", sslDomain: "SSL & 域名", scheduleIncident: "计划与事件", diff --git a/application/src/translations/zhcn/services.ts b/application/src/translations/zhcn/services.ts index 7cf86c7..4e9cc95 100644 --- a/application/src/translations/zhcn/services.ts +++ b/application/src/translations/zhcn/services.ts @@ -2,11 +2,97 @@ import { ServicesTranslations } from '../types/services'; export const servicesTranslations: ServicesTranslations = { - serviceName: "服务名称", - serviceType: "服务类型", serviceStatus: "服务状态", responseTime: "响应时间", - uptime: "Uptime", + uptime: "在线时间", lastChecked: "最后检查时间", noServices: "没有符合您筛选条件的服务。", -}; + currentlyMonitoring: "当前监控", + retry: "重试", + overview: "概览", + newService: "新增服务", + rowsPerPage: "每页行数", + search: "搜索", + allTypes: "所有类型", + createNewService: "添加新服务", + createNewServiceDesc: "填写详细信息以创建要监控的新服务。", + + // ServiceBasicFields.tsx + serviceName: "服务名称", + serviceNameDesc: "为你的服务输入一个描述性名称", + + // ServiceConfigFields.tsx + checkInterval: "检查间隔", + seconds: "秒", + minute: "分钟", + minutes: "分钟", + hour: "小时", + hours: "小时", + custom: "自定义", + checkIntervalPlaceholder: "输入间隔时间(秒)", + backToPresets: "回到预设", + checkIntervalDesc: "多久检查一次服务状态", + checkIntervalDescCustom: "输入自定义间隔时间(以秒为单位,最小10秒)", + retryAttempts: "重试次数", + attempt: "次", + attempts: "次", + retryAttemptsDesc: "在标记为下线之前重试的次数", + + // ServiceForm.tsx + updateService: "更新服务", + createService: "创建服务", + + // ServiceNotificationFields.tsx + enableNotifications: "启用通知", + enableNotificationsDesc: "为本服务启用或禁用通知", + notificationChannels: "通知渠道", + notificationChannelsEnabledDesc: "为本服务选择通知渠道", + notificationChannelsDesc: "先启用通知以选择渠道", + notificationChannelsPlaceholder: "添加一个通知渠道", + alertTemplate: "警报模板", + alertTemplateLoading: "正在加载模板...", + alertTemplatePlaceholder: "选择一个警报模板", + alertTemplateEnabledDesc: "选择一个警报消息的模板", + alertTemplateDesc: "先启用通知才能选择模板", + + // ServiceTypeField.tsx + serviceType: "服务类型", + serviceTypeHTTPDesc: "使用 HTTP/HTTPS 协议监控网站和 RESTAPI", + serviceTypePINGDesc: "使用 PING 协议监控主机可用性", + serviceTypeTCPDesc: "使用 TCP 协议监控 TCP 端口连接性", + serviceTypeDNSDesc: "监控 DNS 解析", + + // ServiceRegionalFields.tsx + regionalMonitoring: "区域监控", + regionalMonitoringDesc: "将此服务分配给区域监控代理以进行分布式监控", + regionalAgents: "区域代理", + regionalAgentsLoading: "加载代理中...", + regionalAgentsAvailablePlaceholder: "选择额外的区域代理...", + regionalAgentsAllSelected: "已选择所有可用代理", + regionalAgentsNoAvailable: "无可用区域代理", + regionalAgentsNoOnlineAvailable: "无可用在线区域代理", + regionalAgentsNotFoundMessage: "未找到在线区域代理。服务将使用默认监控。", + regionalAgentsNotSelectedMessage: "未选择区域代理。服务将使用默认监控。", + + // ServiceUrlField.tsx + targetDefault: "目标 URL/Host", + targetDNS: "域名", + targetHTTPDesc: "输入完整的 URL,包括协议(http:// 或 https://)", + targetPINGDesc: "输入要 ping 的主机名或 IP 地址", + targetTCPDesc: "输入主机名或 IP 地址以进行 TCP 连接测试", + targetTCPPortDesc: "输入用于 TCP 连接测试的端口号", + targetDNSDesc: "输入要监控的 DNS 记录域名(A、AAAA、MX等)", + targetDefaultDesc: "输入要监控的目标 URL 或主机名", + targetDefaultPlaceholder: "输入 URL 或主机名", + + // types.ts + serviceNameRequired: "服务名称是必填项", + urlDomainHostRequired: "URL/域名/主机名是必填项", + enterValidUrlHostnameDomain: "请输入有效的URL、主机名或域名", + + // Dashboard + upServices: "在线服务", + downServices: "下线服务", + pausedServices: "暂停服务", + warningServices: "告警服务", +}; \ No newline at end of file diff --git a/application/src/translations/zhcn/settings.ts b/application/src/translations/zhcn/settings.ts index 8f86b1b..a57757e 100644 --- a/application/src/translations/zhcn/settings.ts +++ b/application/src/translations/zhcn/settings.ts @@ -2,18 +2,18 @@ import { SettingsTranslations } from '../types/settings'; export const settingsTranslations: SettingsTranslations = { - // Tabs + // General Settings - Tabs systemSettings: "系统设置", mailSettings: "邮件设置", - // System Settings + // General Settings - System Settings appName: "应用名称", appURL: "应用 URL", senderName: "发送者名称", senderEmail: "发送者邮箱地址", hideControls: "隐藏控件", - // Mail Settings + // General Settings - Mail Settings smtpSettings: "SMTP 配置", smtpEnabled: "启用 SMTP", smtpHost: "SMTP 主机", @@ -24,7 +24,7 @@ export const settingsTranslations: SettingsTranslations = { enableTLS: "启用 TLS", localName: "本地名称", - // Test Email + // General Settings - Test Email testEmail: "测试邮箱", sendTestEmail: "发送测试邮箱", emailTemplate: "邮箱模板", @@ -39,7 +39,7 @@ export const settingsTranslations: SettingsTranslations = { enterEmailAddress: "输入收件人邮箱地址", sending: "发送中...", - // Actions and status + // General Settings - Actions and status save: "保存变更", saving: "保存中...", settingsUpdated: "设置已成功更新", @@ -48,5 +48,12 @@ export const settingsTranslations: SettingsTranslations = { testConnection: "测试连接", testingConnection: "测试连接中...", connectionSuccess: "连接成功", - connectionFailed: "连接失败" -}; + connectionFailed: "连接失败", + + // User Management + addUser: "添加用户", + permissionNotice: "权限问题:", + permissionNoticeAddUser: "作为管理员用户,您无权查看或修改系统及邮件设置。这些设置仅超级管理员可访问和修改。如需更改系统配置或邮件设置,请联系您的超级管理员。", + loadingSettings: "加载设置中...", + loadingSettingsError: "加载设置时出错", +}; \ No newline at end of file diff --git a/application/src/translations/zhcn/ssl.ts b/application/src/translations/zhcn/ssl.ts index a01249e..af4f7ae 100644 --- a/application/src/translations/zhcn/ssl.ts +++ b/application/src/translations/zhcn/ssl.ts @@ -112,5 +112,6 @@ export const sslTranslations: SSLTranslations = { created: "创建时间", lastUpdated: "最后更新时间", lastNotification: "最后通知时间", - collectionId: "集合 ID" + collectionId: "集合 ID", + noCertificatesFound: "未找到证书", };