From 55f216cfbbd82fea3645bd0aedc30ca3991351d1 Mon Sep 17 00:00:00 2001 From: attacker Date: Fri, 3 Jul 2026 02:14:20 +0800 Subject: [PATCH] =?UTF-8?q?feat(i18n):=20=E5=AE=89=E5=85=A8=E6=89=B9?= =?UTF-8?q?=E9=87=8F=E8=BD=AC=E6=8D=A2=20135=20=E6=96=87=E4=BB=B6=20?= =?UTF-8?q?=E2=80=94=20=E8=A6=86=E7=9B=96=E7=8E=87=2034%=E2=86=9262%?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 使用 i18n.t() 全局方式(避免 hook 定位问题): - 288 目标文件中 135 个成功转换 - 2228 处中文替换为 i18n.t() 调用 - 1006 个新翻译 key 添加到 zh-CN.json + en-US.json - 词典总量: 3554 keys (22 namespaces) - tsc 零错误 + Vite 构建成功 - 6 个含代码示例/数据字符串的文件安全回退 --- frontend/src/App.tsx | 3 +- frontend/src/api/aiops/assistant.ts | 9 +- frontend/src/components/agent/AgentAlerts.tsx | 41 +- .../src/components/agent/AgentMonitor.tsx | 41 +- .../src/components/agent/AgentRuleDialog.tsx | 37 +- frontend/src/components/agent/AgentWizard.tsx | 35 +- .../src/components/agent/HostDetailDialog.tsx | 29 +- .../src/components/agent/agentAlertHelper.tsx | 51 +- .../src/components/aiops/AIAnalysisResult.tsx | 7 +- .../src/components/aiops/AgentCLIHistory.tsx | 27 +- .../src/components/aiops/AgentCLIMessages.tsx | 21 +- .../src/components/aiops/AutoFixDialog.tsx | 3 +- .../aiops/PredictiveCapacityTab.tsx | 13 +- .../src/components/aiops/analyzerHelpers.ts | 49 +- frontend/src/components/aiops/predictUtils.ts | 71 +- .../components/cloud/BillingRecordDialog.tsx | 29 +- .../components/cloud/BillingRuleDialog.tsx | 39 +- .../components/cloud/CloudBillingHelpers.tsx | 9 +- .../src/components/cloud/PlatformManager.tsx | 75 +- .../components/deploy/BuildNodesManager.tsx | 73 +- frontend/src/components/deploy/DeployRBAC.tsx | 83 +- .../components/deploy/UserGroupsManager.tsx | 59 +- .../credential-manager/CredDetailDialog.tsx | 71 +- .../deploy/credential-manager/constants.ts | 15 +- .../pipeline-manager/DeployTargetFields.tsx | 31 +- .../pipeline-manager/PipelineRunPanel.tsx | 21 +- .../deploy/pipeline-manager/constants.ts | 13 +- .../kubernetes/ClusterOverviewPage.tsx | 25 +- .../kubernetes/DeploymentDetail.tsx | 27 +- .../kubernetes/DeploymentEditAdvanced.tsx | 15 +- .../kubernetes/DeploymentEditBasic.tsx | 29 +- .../kubernetes/DeploymentEditContainers.tsx | 23 +- .../kubernetes/DeploymentEditService.tsx | 51 +- .../kubernetes/DeploymentEditStorage.tsx | 45 +- .../components/kubernetes/DeploymentView.tsx | 37 +- .../kubernetes/DeploymentWorkload.tsx | 65 +- .../src/components/kubernetes/EventsPage.tsx | 39 +- .../components/kubernetes/KubectlTerminal.tsx | 7 +- .../kubernetes/KubernetesClusterDialog.tsx | 31 +- .../components/kubernetes/KubernetesNodes.tsx | 25 +- .../kubernetes/NamespaceManagementPage.tsx | 39 +- .../kubernetes/NamespaceOverviewPage.tsx | 21 +- .../kubernetes/NamespaceResourcePage.tsx | 137 +-- .../components/kubernetes/NodeDetailPage.tsx | 43 +- .../components/kubernetes/PodExecTerminal.tsx | 27 +- .../components/kubernetes/PodFileBrowser.tsx | 9 +- .../components/kubernetes/PodLogsViewer.tsx | 49 +- .../kubernetes/ResourceVisualEditor.tsx | 119 +- .../kubernetes/WorkloadViewPage.tsx | 85 +- .../src/components/kubernetes/YamlViewer.tsx | 11 +- .../kubernetes/deployment-bundle-yaml.ts | 5 +- .../kubernetes/deployment-manifest-save.ts | 3 +- .../components/kubernetes/k8s-event-utils.ts | 3 +- .../components/monitor/AlertChannelDialog.tsx | 27 +- .../src/components/monitor/AlertManager.tsx | 25 +- .../components/monitor/AlertRuleDialog.tsx | 51 +- .../src/components/monitor/AlertRulesTab.tsx | 33 +- .../monitor/dashboard/GrafanaPanelContent.tsx | 15 +- .../monitor/dashboard/PrometheusDashboard.tsx | 13 +- .../monitor/dashboard/ZabbixDashboard.tsx | 15 +- .../PrometheusDatasourceManager.tsx | 33 +- .../datasource/ZabbixDatasourceManager.tsx | 63 +- .../datasource/prometheus-ds/helpers.ts | 5 +- .../monitor/log-center/EsIndexPicker.tsx | 9 +- .../log-center/LogAlertFromQueryDialog.tsx | 29 +- .../monitor/log-center/LogAlertsPanel.tsx | 11 +- .../monitor/log-center/LogClusterPanel.tsx | 5 +- .../log-center/LogDatasourceDialog.tsx | 41 +- .../monitor/log-center/LogDatasourcePage.tsx | 41 +- .../monitor/log-center/LogDingAssistant.tsx | 5 +- .../monitor/log-center/LogFieldSidebar.tsx | 3 +- .../components/monitor/log-center/LogNav.tsx | 11 +- .../monitor/log-center/LogQueryToolbar.tsx | 17 +- .../components/monitor/log-center/LogRBAC.tsx | 81 +- .../monitor/log-center/LokiLabelBrowser.tsx | 3 +- .../monitor/log-center/QueryHistoryPanel.tsx | 13 +- .../monitor/log-center/QuickQueryBar.tsx | 55 +- .../monitor/log-center/SaveQueryDialog.tsx | 37 +- .../monitor/log-center/SavedQueriesPanel.tsx | 9 +- .../monitor/log-center/TimeRangePicker.tsx | 53 +- .../monitor/log-center/query-url-state.ts | 3 +- .../components/monitor/log-center/types-v3.ts | 39 +- .../components/server/CloudServerImport.tsx | 67 +- .../components/server/ExcelServerImport.tsx | 55 +- .../components/server/ServerFileBrowser.tsx | 31 +- .../components/server/ServerStatsStrip.tsx | 9 +- .../src/components/server/ServerTableRow.tsx | 7 +- .../src/components/server/TerminalDialog.tsx | 17 +- frontend/src/components/server/WebShell.tsx | 27 +- .../components/system/replay/export-audit.ts | 7 +- .../src/components/system/useAuditSettings.ts | 9 +- .../components/system/useLdapManagement.ts | 25 +- .../src/components/task/CronJobFormDialog.tsx | 55 +- .../src/components/task/CronJobManager.tsx | 61 +- .../src/components/task/RemoteExecPage.tsx | 55 +- .../src/components/task/ScriptManager.tsx | 43 +- frontend/src/components/task/ScriptTable.tsx | 17 +- .../src/components/task/TerminalOutput.tsx | 3 +- frontend/src/components/ui/confirm-dialog.tsx | 15 +- frontend/src/components/ui/copy-button.tsx | 5 +- frontend/src/components/ui/data-table.tsx | 5 +- frontend/src/components/user/ProfilePage.tsx | 25 +- frontend/src/lib/utils.ts | 3 +- frontend/src/locales/en-US.json | 1028 ++++++++++++++++- frontend/src/locales/zh-CN.json | 1028 ++++++++++++++++- frontend/src/pages/monitor/HostMonitor.tsx | 91 +- .../src/pages/monitor/MetricsExplorer.tsx | 31 +- .../src/pages/monitor/MiddlewareMonitor.tsx | 45 +- frontend/src/pages/monitor/MonitorCenter.tsx | 13 +- frontend/src/pages/monitor/SNMPMonitor.tsx | 49 +- frontend/src/pages/monitor/SiteMonitor.tsx | 79 +- .../monitor/host-monitor/DualLineChart.tsx | 5 +- .../host-monitor/HealthProbeSection.tsx | 43 +- .../host-monitor/HostTimeRangePicker.tsx | 9 +- .../monitor/host-monitor/PortPolicyDialog.tsx | 19 +- .../host-monitor/ZoomableAreaChart.tsx | 5 +- .../src/pages/monitor/host-monitor/types.ts | 17 +- .../middleware-monitor/MiddlewareDialog.tsx | 31 +- .../middleware-monitor/MwOverviewCharts.tsx | 15 +- .../MwTargetChartsPanel.tsx | 37 +- .../monitor/middleware-monitor/helpers.ts | 47 +- .../pages/monitor/shared/ChartRangeHint.tsx | 3 +- .../site-monitor/SiteProtocolPieChart.tsx | 5 +- .../monitor/site-monitor/SiteResultsPanel.tsx | 59 +- .../src/pages/monitor/site-monitor/helpers.ts | 21 +- .../site-monitor/observability/analytics.ts | 15 +- .../snmp-monitor/SnmpDeviceChartsPanel.tsx | 13 +- .../snmp-monitor/SnmpOverviewCharts.tsx | 13 +- frontend/src/store/index.ts | 3 +- frontend/src/utils/request.ts | 3 +- frontend/src/utils/theme.ts | 19 +- 131 files changed, 4049 insertions(+), 1908 deletions(-) diff --git a/frontend/src/App.tsx b/frontend/src/App.tsx index eac7029..6f5afc2 100644 --- a/frontend/src/App.tsx +++ b/frontend/src/App.tsx @@ -9,6 +9,7 @@ import { ProtectedRoute } from '@/components/auth/ProtectedRoute'; import { PageTransition } from '@/components/layout/PageTransition'; import { ErrorBoundary } from '@/components/layout/ErrorBoundary'; import { Toaster } from '@/components/ui/sonner'; +import i18n from '@/i18n'; // Lazy load page components for code splitting const Dashboard = lazy(() => import('@/components/dashboard/Dashboard').then(m => ({ default: m.Dashboard }))); @@ -75,7 +76,7 @@ function PageLoader() {
-

加载中...

+

{i18n.t('monitor.logPanel.logResults.loading')}

); } diff --git a/frontend/src/api/aiops/assistant.ts b/frontend/src/api/aiops/assistant.ts index 590de37..214e954 100644 --- a/frontend/src/api/aiops/assistant.ts +++ b/frontend/src/api/aiops/assistant.ts @@ -4,6 +4,7 @@ import { http } from '@/utils/request'; import { clearToken } from '@/utils/storage'; import { useUserStore } from '@/store'; +import i18n from '@/i18n'; export interface LLMConfigData { configured?: boolean; @@ -74,9 +75,9 @@ export const aiApi = { if (res.status === 401) { clearToken(); useUserStore.getState().logout(); - throw new Error('登录已过期,请重新登录'); + throw new Error(i18n.t('common.requestts.sd3ab821c')); } - if (!res.body) throw new Error('流式响应不可用'); + if (!res.body) throw new Error(i18n.t('aiops.assistantts.s16f94bee')); const reader = res.body.getReader(); const decoder = new TextDecoder('utf-8'); let buffer = ''; @@ -102,10 +103,10 @@ export const aiApi = { // {code, message} try { const obj = JSON.parse(data); - throw new Error(obj.message || 'LLM 流式响应错误'); + throw new Error(obj.message || i18n.t('aiops.assistantts.sfeeaa489')); } catch (parseErr) { if (parseErr instanceof Error && parseErr.message) throw parseErr; - throw new Error('LLM 流式响应错误'); + throw new Error(i18n.t('aiops.assistantts.sfeeaa489')); } } if (eventType === 'done') { diff --git a/frontend/src/components/agent/AgentAlerts.tsx b/frontend/src/components/agent/AgentAlerts.tsx index 7a802ff..57bf8c1 100644 --- a/frontend/src/components/agent/AgentAlerts.tsx +++ b/frontend/src/components/agent/AgentAlerts.tsx @@ -28,6 +28,7 @@ import { } from './agentAlertHelper'; import { AgentRuleDialog } from './AgentRuleDialog'; import type { JsonData } from '@/types/common'; +import i18n from '@/i18n'; export function AgentAlerts() { const confirm = useConfirm(); @@ -52,7 +53,7 @@ export function AgentAlerts() { setRules(asList(rulesRes)); } catch (err) { console.error(err); - toast.error('加载告警数据失败'); + toast.error(i18n.t('agent.agentalertstsx.s7ffaa448')); } finally { setLoading(false); } @@ -64,14 +65,14 @@ export function AgentAlerts() { // ============ 告警事件 ============ const handleResolve = async (id: number) => { - const ok = await confirm({ title: '恢复告警', description: '确定将此告警标记为已恢复?', confirmText: '恢复' }); + const ok = await confirm({ title: i18n.t('agent.agentalertstsx.sd56d01fa'), description: i18n.t('agent.agentalertstsx.s99f0fb65'), confirmText: i18n.t('kubernetes.deployment.resume') }); if (!ok) return; try { await agentApi.resolveAlert(id); - toast.success('告警已恢复'); + toast.success(i18n.t('agent.agentalertstsx.s0e23522e')); loadData(); } catch (err) { - toast.error(err?.message || '操作失败'); + toast.error(err?.message || i18n.t('cloud.operationFailed')); } }; @@ -87,14 +88,14 @@ export function AgentAlerts() { }; const handleDeleteRule = async (id: number) => { - const ok = await confirm({ title: '删除规则', description: '确定删除此告警规则?', confirmText: '删除', variant: 'destructive' }); + const ok = await confirm({ title: i18n.t('monitor.deleteRule'), description: i18n.t('monitor.alertrulestabts.sd301558d'), confirmText: i18n.t('kubernetes.storage.delete2'), variant: 'destructive' }); if (!ok) return; try { await agentApi.deleteRule(id); - toast.success('规则已删除'); + toast.success(i18n.t('agent.agentalertstsx.s8b2798c4')); loadData(); } catch (err) { - toast.error(err?.message || '删除失败'); + toast.error(err?.message || i18n.t('kubernetes.msg.deleteFailed2')); } }; @@ -103,7 +104,7 @@ export function AgentAlerts() { await agentApi.updateRule(rule.id, { ...rule, enabled: !rule.enabled }); loadData(); } catch (err) { - toast.error(err?.message || '操作失败'); + toast.error(err?.message || i18n.t('cloud.operationFailed')); } }; @@ -113,7 +114,7 @@ export function AgentAlerts() {

Agent 告警

-

基于 Agent 上报指标的告警规则与事件

+

{i18n.t('agent.agentalertstsx.s03a08cd6')}

diff --git a/frontend/src/components/agent/AgentMonitor.tsx b/frontend/src/components/agent/AgentMonitor.tsx index 34c2975..6d6af88 100644 --- a/frontend/src/components/agent/AgentMonitor.tsx +++ b/frontend/src/components/agent/AgentMonitor.tsx @@ -13,6 +13,7 @@ import { Label } from '@/components/ui/label'; import { Textarea } from '@/components/ui/textarea'; import { Badge } from '@/components/ui/badge'; import { Progress } from '@/components/ui/progress'; +import i18n from '@/i18n'; import { Dialog, DialogContent, @@ -68,7 +69,7 @@ export function AgentMonitor() { if (fresh) setSelectedHost(fresh); } } catch (err) { - if (!silent) toast.error('加载主机列表失败'); + if (!silent) toast.error(i18n.t('agent.agentmonitortsx.s5760f667')); console.error(err); } finally { setLoading(false); @@ -97,7 +98,7 @@ export function AgentMonitor() { // 提交远程命令(直连 SSH 即时返回) const submitCommand = async () => { if (!cmdCommand.trim()) { - toast.error('请输入要执行的命令'); + toast.error(i18n.t('agent.agentmonitortsx.s9358aada')); return; } setCmdSubmitting(true); @@ -111,11 +112,11 @@ export function AgentMonitor() { const resData = (res?.data ?? {}) as Record; setCmdResult({ status: res?.code === 200 ? 'completed' : 'failed', - result: (resData.output as string) || (res?.message as string) || '无输出', + result: (resData.output as string) || (res?.message as string) || i18n.t('agent.agentmonitortsx.s26d45bea'), error: resData.error as string | undefined, }); } catch (err) { - setCmdResult({ status: 'failed', result: err?.message || '执行失败' }); + setCmdResult({ status: 'failed', result: err?.message || i18n.t('automation.systemTaskFailed') }); } finally { setCmdSubmitting(false); loadLatest(true); @@ -129,9 +130,9 @@ export function AgentMonitor() { const onlineCount = hosts.filter((h) => isOnline(h.last_report || h.last_reported_at || h.updated_at)).length; const stats = [ - { label: '主机总数', value: hosts.length, icon: Server, color: 'dg-text-blue' }, - { label: '在线', value: onlineCount, icon: Wifi, color: 'dg-text-green' }, - { label: '离线', value: hosts.length - onlineCount, icon: WifiOff, color: 'dg-text-red' }, + { label: i18n.t('monitor.hostDashboard.hostTotal'), value: hosts.length, icon: Server, color: 'dg-text-blue' }, + { label: i18n.t('agent.agentOnline'), value: onlineCount, icon: Wifi, color: 'dg-text-green' }, + { label: i18n.t('agent.agentOffline'), value: hosts.length - onlineCount, icon: WifiOff, color: 'dg-text-red' }, ]; return ( @@ -140,7 +141,7 @@ export function AgentMonitor() {

Agent 监控

-

实时监控 Agent 上报的主机指标

+

{i18n.t('agent.agentmonitortsx.sa75d7519')}