From b6ef4ff7a53d7e2b2ba0453e4070a96f946df4dd Mon Sep 17 00:00:00 2001 From: lyker189 Date: Thu, 2 Oct 2025 05:10:11 +0700 Subject: [PATCH] feat(i18n): localize frontend components and add missing translations - Replaced hardcoded UI strings with translation keys across frontend files - Added and updated English(en) and Khmer(km) translation files for settings, notifications, and server components - Improved localization and multi-language support throughout the frontend --- .../docker/DockerContainersTable.tsx | 4 +- .../components/docker/DockerMetricsDialog.tsx | 92 ++++---- .../components/docker/DockerStatsCards.tsx | 12 +- .../components/docker/DockerStatusBadge.tsx | 10 +- .../docker/table/DockerEmptyState.tsx | 6 +- .../docker/table/DockerRowActions.tsx | 8 +- .../docker/table/DockerTableHeader.tsx | 18 +- .../docker/table/DockerTableSearch.tsx | 6 +- .../operational-page/ComponentsSelector.tsx | 36 ++-- .../CreateOperationalPageDialog.tsx | 56 ++--- .../EditOperationalPageDialog.tsx | 54 ++--- .../operational-page/OperationalPageCard.tsx | 17 +- .../OperationalPageContent.tsx | 33 +-- .../public/CurrentStatusSection.tsx | 30 +-- .../components/public/PublicStatusPage.tsx | 18 +- .../AddRegionalAgentDialog.tsx | 126 +++++------ .../regional-monitoring/RegionalAgentCard.tsx | 28 +-- .../RegionalMonitoringContent.tsx | 40 ++-- .../servers/AddServerAgentDialog.tsx | 26 +-- .../components/servers/DockerOneClickTab.tsx | 38 ++-- .../components/servers/EditServerDialog.tsx | 134 ++++++------ .../components/servers/ManualInstallTab.tsx | 37 ++-- .../components/servers/OneClickInstallTab.tsx | 21 +- .../servers/ServerAgentConfigForm.tsx | 53 ++--- .../servers/ServerHistoryCharts.tsx | 30 +-- .../components/servers/ServerStatsCards.tsx | 10 +- .../src/components/servers/ServerTable.tsx | 66 +++--- .../data-retention/DataRetentionSettings.tsx | 22 +- .../NotificationChannelDialog.tsx | 176 +++++++-------- .../NotificationSettings.tsx | 24 ++- application/src/pages/ContainerMonitoring.tsx | 18 +- application/src/pages/InstanceMonitoring.tsx | 12 +- application/src/pages/ServerDetail.tsx | 19 +- .../src/services/serverThresholdService.ts | 2 + application/src/translations/en/docker.ts | 71 ++++++ application/src/translations/en/index.ts | 12 +- application/src/translations/en/instance.ts | 169 +++++++++++++++ application/src/translations/en/operation.ts | 87 ++++++++ application/src/translations/en/public.ts | 23 ++ application/src/translations/en/region.ts | 94 ++++++++ application/src/translations/en/services.ts | 61 ++++++ application/src/translations/en/settings.ts | 104 +++++++++ application/src/translations/km/about.ts | 15 ++ application/src/translations/km/docker.ts | 71 ++++++ application/src/translations/km/incident.ts | 9 + application/src/translations/km/index.ts | 13 +- application/src/translations/km/instance.ts | 165 ++++++++++++++ .../src/translations/km/maintenance.ts | 21 ++ application/src/translations/km/menu.ts | 8 +- application/src/translations/km/operation.ts | 86 ++++++++ application/src/translations/km/public.ts | 23 ++ application/src/translations/km/region.ts | 95 ++++++++ application/src/translations/km/services.ts | 202 ++++++++++++++++-- application/src/translations/km/settings.ts | 135 +++++++++++- application/src/translations/types/docker.ts | 76 +++++++ application/src/translations/types/index.ts | 10 + .../src/translations/types/instance.ts | 162 ++++++++++++++ .../src/translations/types/operation.ts | 85 ++++++++ application/src/translations/types/public.ts | 23 ++ application/src/translations/types/region.ts | 92 ++++++++ .../src/translations/types/services.ts | 63 ++++++ .../src/translations/types/settings.ts | 103 +++++++++ 62 files changed, 2721 insertions(+), 639 deletions(-) create mode 100644 application/src/translations/en/docker.ts create mode 100644 application/src/translations/en/instance.ts create mode 100644 application/src/translations/en/operation.ts create mode 100644 application/src/translations/en/public.ts create mode 100644 application/src/translations/en/region.ts create mode 100644 application/src/translations/km/docker.ts create mode 100644 application/src/translations/km/instance.ts create mode 100644 application/src/translations/km/operation.ts create mode 100644 application/src/translations/km/public.ts create mode 100644 application/src/translations/km/region.ts create mode 100644 application/src/translations/types/docker.ts create mode 100644 application/src/translations/types/instance.ts create mode 100644 application/src/translations/types/operation.ts create mode 100644 application/src/translations/types/public.ts create mode 100644 application/src/translations/types/region.ts diff --git a/application/src/components/docker/DockerContainersTable.tsx b/application/src/components/docker/DockerContainersTable.tsx index 9e39429..45e4c5d 100644 --- a/application/src/components/docker/DockerContainersTable.tsx +++ b/application/src/components/docker/DockerContainersTable.tsx @@ -4,6 +4,7 @@ import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"; import { Table, TableBody } from "@/components/ui/table"; import { DockerContainer } from "@/types/docker.types"; import { DockerMetricsDialog } from "./DockerMetricsDialog"; +import { useLanguage } from "@/contexts/LanguageContext"; import { DockerTableSearch, DockerTableHeader, @@ -18,6 +19,7 @@ interface DockerContainersTableProps { } export const DockerContainersTable = ({ containers, isLoading, onRefresh }: DockerContainersTableProps) => { + const { t } = useLanguage(); const [searchTerm, setSearchTerm] = useState(""); const [selectedContainer, setSelectedContainer] = useState(null); const [metricsDialogOpen, setMetricsDialogOpen] = useState(false); @@ -49,7 +51,7 @@ export const DockerContainersTable = ({ containers, isLoading, onRefresh }: Dock
- Docker Containers + {t('dockerContainers', 'docker')} { const [timeRange, setTimeRange] = useState("1d"); const { theme } = useTheme(); + const { t } = useLanguage(); const { data: metrics = [], @@ -232,11 +234,11 @@ export const DockerMetricsDialog = ({ container, open, onOpenChange }: DockerMet -
+
- Container Metrics: {container.name} + {t('containerMetricsTitle', 'docker', { name: container.name })}
onSearchChange(e.target.value)} className="pl-10 sm:w-64 bg-background border-border" @@ -30,7 +32,7 @@ export const DockerTableSearch = ({ searchTerm, onSearchChange, onRefresh, isLoa className="w-full sm:w-auto bg-background border-border hover:bg-muted" > - Refresh + {t('refresh', 'docker')}
); diff --git a/application/src/components/operational-page/ComponentsSelector.tsx b/application/src/components/operational-page/ComponentsSelector.tsx index 9478fc7..25e3eb1 100644 --- a/application/src/components/operational-page/ComponentsSelector.tsx +++ b/application/src/components/operational-page/ComponentsSelector.tsx @@ -11,6 +11,7 @@ import { Plus, X, Server } from 'lucide-react'; import { StatusPageComponentRecord } from '@/types/statusPageComponents.types'; import { useQuery } from '@tanstack/react-query'; import { serviceService } from '@/services/serviceService'; +import { useLanguage } from "@/contexts/LanguageContext"; interface ComponentsSelectorProps { selectedComponents: Partial[]; @@ -19,6 +20,7 @@ interface ComponentsSelectorProps { } export const ComponentsSelector = ({ selectedComponents, onComponentsChange, onComponentDelete }: ComponentsSelectorProps) => { + const { t } = useLanguage(); const [showAddForm, setShowAddForm] = useState(false); const [newComponent, setNewComponent] = useState({ name: '', @@ -71,16 +73,16 @@ export const ComponentsSelector = ({ selectedComponents, onComponentsChange, onC - Status Page Components + {t('statusPageComponents')} - Add monitoring components like uptime services, SSL certificates, and incident tracking + {t('addMonitoringComponentsDesc')} {selectedComponents.length > 0 && (
- +
{selectedComponents.map((component, index) => (
@@ -92,12 +94,12 @@ export const ComponentsSelector = ({ selectedComponents, onComponentsChange, onC
{component.service_id && ( - Service: {services.find(s => s.id === component.service_id)?.name || component.service_id} + {t('service')}: {services.find(s => s.id === component.service_id)?.name || component.service_id} )} {component.server_id && ( - Server: {component.server_id} + {t('server')}: {component.server_id} )}
@@ -122,22 +124,22 @@ export const ComponentsSelector = ({ selectedComponents, onComponentsChange, onC className="w-full" > - Add Component + {t('addComponent')} ) : (
- + setNewComponent({ ...newComponent, name: e.target.value })} />
- +
- +