From 5205def47f37a21ace38cbe531aa2e7bc6ae5683 Mon Sep 17 00:00:00 2001 From: attacker Date: Mon, 13 Jul 2026 13:12:54 +0800 Subject: [PATCH] =?UTF-8?q?refactor(i18n):=20U39=20=E6=AE=8B=E4=BD=99=20JS?= =?UTF-8?q?X=20=E5=B1=9E=E6=80=A7/=E6=A8=A1=E6=9D=BF=E5=AD=97=E9=9D=A2?= =?UTF-8?q?=E9=87=8F=E4=B8=AD=E6=96=87=E6=B8=85=E9=9B=B6=20=E2=80=94=2014?= =?UTF-8?q?=20=E5=A4=84=E2=86=920?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 10 文件修复: - DualLineChart: subtitle 接收/发送→i18n.t(monitor.lbl.receiveSend) - NetworkTab: 5处 unit="个"→t(common.unitCount) - FDUsageCard: subtitle 当前→t(monitor.lbl.currentFDUsage) - NamespaceOverviewPage: subtitle 命名空间概览→i18n.t(k8s.nsOverview.subtitle) - NamespaceManagementPage: subtitle 资源配额→i18n.t(k8s.nsMgmt.quotaSubtitle) - CreateHPADialog: title+text 命名空间→i18n.t(k8s.hpa.targetInfo) - LogFieldSidebar: title 个值→i18n.t(common.fieldValues) - LiveMonitorDialog: title 全屏/退出全屏→t(common.fullscreen/exitFullscreen) - ExecutionHistoryDialog: title 成功/失败→t(task.execHistory.successFail) - LdapSettingsTab: className 成功检查→ldapTestSuccess boolean 状态 新增 11 翻译键 (common.unitCount/fieldValues/exitFullscreen/fullscreen + monitor.lbl.receiveSend/currentFDUsage + k8s.nsOverview.subtitle/nsMgmt.quotaSubtitle/hpa.targetInfo + task.execHistory.successFail), zh/en 7751→7762 对齐 tsc -b=0, npm build✓ (16.94s), ESLint=0/0/any=0, go build=0, 17/17 测试通过 --- .../kubernetes/NamespaceManagementPage.tsx | 2 +- .../kubernetes/NamespaceOverviewPage.tsx | 2 +- .../deployment-detail/CreateHPADialog.tsx | 4 +-- .../monitor/log-center/LogFieldSidebar.tsx | 2 +- .../components/system/LiveMonitorDialog.tsx | 2 +- .../components/system/SystemSettingsTab.tsx | 1 + .../system-settings/LdapSettingsTab.tsx | 4 ++- .../components/system/useLdapManagement.ts | 5 ++++ .../task/ExecutionHistoryDialog.tsx | 2 +- frontend/src/locales/en-US.json | 29 ++++++++++++++----- frontend/src/locales/zh-CN.json | 29 ++++++++++++++----- .../monitor/host-monitor/DualLineChart.tsx | 2 +- .../monitor/host-monitor/tabs/FDUsageCard.tsx | 2 +- .../monitor/host-monitor/tabs/NetworkTab.tsx | 10 +++---- 14 files changed, 67 insertions(+), 29 deletions(-) diff --git a/frontend/src/components/kubernetes/NamespaceManagementPage.tsx b/frontend/src/components/kubernetes/NamespaceManagementPage.tsx index 1e8869a..18a212a 100644 --- a/frontend/src/components/kubernetes/NamespaceManagementPage.tsx +++ b/frontend/src/components/kubernetes/NamespaceManagementPage.tsx @@ -121,7 +121,7 @@ export default function NamespaceManagementPage() { } metrics={!loading ? ( } loading={loading} loadingLabel={i18n.t('k8s.nsOverview.loadingStats')} diff --git a/frontend/src/components/kubernetes/deployment-detail/CreateHPADialog.tsx b/frontend/src/components/kubernetes/deployment-detail/CreateHPADialog.tsx index 35ea342..ee4d5d0 100644 --- a/frontend/src/components/kubernetes/deployment-detail/CreateHPADialog.tsx +++ b/frontend/src/components/kubernetes/deployment-detail/CreateHPADialog.tsx @@ -72,8 +72,8 @@ export function CreateHPADialog({ clusterCode, namespace, deploymentName, onCrea
-

- Deployment: {deploymentName} · 命名空间: {namespace} +

+ {i18n.t('k8s.hpa.targetInfo', { deploy: deploymentName, ns: namespace })}

diff --git a/frontend/src/components/monitor/log-center/LogFieldSidebar.tsx b/frontend/src/components/monitor/log-center/LogFieldSidebar.tsx index 8a1f5bd..f17d65e 100644 --- a/frontend/src/components/monitor/log-center/LogFieldSidebar.tsx +++ b/frontend/src/components/monitor/log-center/LogFieldSidebar.tsx @@ -92,7 +92,7 @@ export function LogFieldSidebar({ className="flex items-center gap-1.5 py-1 px-1.5 rounded cursor-pointer hover:opacity-80 transition-colors" style={{ background: selectedFields.includes(f.name) ? 'var(--dg-bg-tertiary)' : 'transparent' }} onClick={() => onFieldClick?.(f.name)} - title={`${f.name} (${f.type || 'text'})${f.count ? ` · ${f.count} 个值` : ''}`} + title={`${f.name} (${f.type || 'text'})${f.count ? ` · ${i18n.t('common.fieldValues', { count: f.count })}` : ''}`} > setFullscreen(!fullscreen)} className="p-1.5 rounded hover:bg-[var(--dg-bg-hover)] text-[var(--dg-text-secondary)]" - title={fullscreen ? '退出全屏' : '全屏'} + title={fullscreen ? t('common.exitFullscreen') : t('common.fullscreen')} > {fullscreen ? : } diff --git a/frontend/src/components/system/SystemSettingsTab.tsx b/frontend/src/components/system/SystemSettingsTab.tsx index 7859802..bda69ea 100644 --- a/frontend/src/components/system/SystemSettingsTab.tsx +++ b/frontend/src/components/system/SystemSettingsTab.tsx @@ -57,6 +57,7 @@ export interface SystemSettingsTabProps { ldapSaving: boolean; ldapTesting: boolean; ldapTestResult: string | null; + ldapTestSuccess: boolean; handleLdapSave: () => void; handleLdapTest: () => void; // LDAP management - pass-through to LdapManagementSection diff --git a/frontend/src/components/system/system-settings/LdapSettingsTab.tsx b/frontend/src/components/system/system-settings/LdapSettingsTab.tsx index de4b2dc..00b245e 100644 --- a/frontend/src/components/system/system-settings/LdapSettingsTab.tsx +++ b/frontend/src/components/system/system-settings/LdapSettingsTab.tsx @@ -17,6 +17,7 @@ type LdapSettingsTabProps = Pick< | "ldapSaving" | "ldapTesting" | "ldapTestResult" + | "ldapTestSuccess" | "handleLdapSave" | "handleLdapTest" > & @@ -75,6 +76,7 @@ export function LdapSettingsTab(props: LdapSettingsTabProps) { ldapSaving, ldapTesting, ldapTestResult, + ldapTestSuccess, handleLdapSave, handleLdapTest, } = props; @@ -204,7 +206,7 @@ export function LdapSettingsTab(props: LdapSettingsTabProps) {
{ldapTestResult && ( {ldapTestResult} diff --git a/frontend/src/components/system/useLdapManagement.ts b/frontend/src/components/system/useLdapManagement.ts index fd47b09..3ab71be 100644 --- a/frontend/src/components/system/useLdapManagement.ts +++ b/frontend/src/components/system/useLdapManagement.ts @@ -38,6 +38,7 @@ export function useLdapManagement(onUsersChanged: () => Promise | void) { const [ldapSaving, setLdapSaving] = useState(false); const [ldapTesting, setLdapTesting] = useState(false); const [ldapTestResult, setLdapTestResult] = useState(null); + const [ldapTestSuccess, setLdapTestSuccess] = useState(false); const [ldapMgmtOpen, setLdapMgmtOpen] = useState(false); const [importFeedback, setImportFeedback] = useState(null); const [importResultOpen, setImportResultOpen] = useState(false); @@ -101,11 +102,14 @@ export function useLdapManagement(onUsersChanged: () => Promise | void) { const handleLdapTest = async () => { setLdapTesting(true); setLdapTestResult(null); + setLdapTestSuccess(false); try { await ldapApi.updateConfig(ldapForm); const res = await ldapApi.testConnection(); + setLdapTestSuccess(!!res?.success); setLdapTestResult(res?.message || (res?.success ? i18n.t('aiops.llmTestSuccess') : i18n.t('aiops.llmTestFailed'))); } catch (error) { + setLdapTestSuccess(false); setLdapTestResult(error?.message || i18n.t('aiops.llmTestFailed')); } finally { setLdapTesting(false); @@ -293,6 +297,7 @@ export function useLdapManagement(onUsersChanged: () => Promise | void) { ldapSaving, ldapTesting, ldapTestResult, + ldapTestSuccess, handleLdapSave, handleLdapTest, ldapMgmtOpen, diff --git a/frontend/src/components/task/ExecutionHistoryDialog.tsx b/frontend/src/components/task/ExecutionHistoryDialog.tsx index 36cc015..d3d92b3 100644 --- a/frontend/src/components/task/ExecutionHistoryDialog.tsx +++ b/frontend/src/components/task/ExecutionHistoryDialog.tsx @@ -182,7 +182,7 @@ export function ExecutionHistoryDialog({ ? 'linear-gradient(to top, #ef4444 0%, #22c55e 100%)' : item.total > 0 ? '#22c55e' : 'var(--dg-border)', }} - title={`${item.label}: 成功 ${item.success} / 失败 ${item.failed}`} + title={t('task.execHistory.successFail', { label: item.label, success: item.success, failed: item.failed })} />
{item.label} diff --git a/frontend/src/locales/en-US.json b/frontend/src/locales/en-US.json index eac7a28..2fd2a64 100644 --- a/frontend/src/locales/en-US.json +++ b/frontend/src/locales/en-US.json @@ -621,7 +621,9 @@ "currentValue": "current value", "memberCount": "{{count}} members", "fillIfMultiContainer": "(required for multi-container)", - "confirmDeleteType": "Delete {{type}} \"{{name}}\"?" + "confirmDeleteType": "Delete {{type}} \"{{name}}\"?", + "unitCount": "", + "fieldValues": "{{count}} values" }, "menu": { "aiAgentCli": "Agent CLI", @@ -3031,7 +3033,8 @@ "maxReplicas": "Max Replicas", "cpuTarget": "CPU Target (%)", "memTarget": "Memory Target (%)", - "targetCPU": "Target CPU Utilization" + "targetCPU": "Target CPU Utilization", + "targetInfo": "Deployment: {{deploy}} · Namespace: {{ns}}" }, "hpaCronHpa": { "currentReplicas": "Current replicas:", @@ -3148,7 +3151,8 @@ "searchPlaceholder": "Search namespaces...", "title": "Namespace Management", "quotaLimit": "Quota Limits", - "nameExample": "e.g. my-app" + "nameExample": "e.g. my-app", + "quotaSubtitle": "{{code}} · Resource Quotas & Lifecycle" }, "nsOverview": { "workloadReplicas": "Workload replica management", @@ -3159,7 +3163,8 @@ "configMaps": "Configuration maps", "secrets": "Secrets & credentials", "hpaStrategy": "Horizontal autoscaling strategy", - "loadingStats": "Loading resource statistics..." + "loadingStats": "Loading resource statistics...", + "subtitle": "{{code}} · Namespace Overview" }, "nsResource": { "deployDesc": "Deployment workload status", @@ -4370,7 +4375,9 @@ "siteRequestTimeout": "Request Timeout", "siteConnFailed": "Connection Failed", "noProbeHint": "No health probes. Click \"{{action}}\" to create one.", - "searchFields": "Search fields" + "searchFields": "Search fields", + "receiveSend": "RX {{rx}} · TX {{tx}}", + "currentFDUsage": "Current {{pct}}%" }, "logAlertBell": { "linked": "Alert Policy Linked", @@ -5329,7 +5336,8 @@ "copied": "Copied to clipboard", "recentTrend": "Last 7 days trends and execution logs (latest 100)", "noRecords": "No execution records", - "last7days": "Last 7 days" + "last7days": "Last 7 days", + "successFail": "{{label}}: Success {{success}} / Failed {{failed}}" }, "remoteExec": { "subtitle": "Batch execute commands / upload files via native SSH", @@ -7663,7 +7671,11 @@ "userTitle": "Title", "userTitleField": "User Information", "users": "Users", - "validUntil": "Valid Until" + "validUntil": "Valid Until", + "liveMonitor": { + "exitFullscreen": "Exit Fullscreen", + "fullscreen": "Fullscreen" + } }, "aiops": { "activeCount": "{{count}} active", @@ -8541,5 +8553,8 @@ "oneDarkDesc": "Atom warm gray IDE, purple-green syntax", "system": "Follow System", "tokyoNightDesc": "Tokyo neon deep blue-purple, VS Code popular" + }, + "monitor.hostMonitorPanel": { + "unitCount": "" } } diff --git a/frontend/src/locales/zh-CN.json b/frontend/src/locales/zh-CN.json index c1022f9..ac6b68e 100644 --- a/frontend/src/locales/zh-CN.json +++ b/frontend/src/locales/zh-CN.json @@ -621,7 +621,9 @@ "currentValue": "当前值", "memberCount": "{{count}} 位成员", "fillIfMultiContainer": "(多容器时填写)", - "confirmDeleteType": "确认删除 {{type}} \"{{name}}\"?" + "confirmDeleteType": "确认删除 {{type}} \"{{name}}\"?", + "unitCount": "个", + "fieldValues": "{{count}} 个值" }, "menu": { "aiAgentCli": "Agent CLI", @@ -3031,7 +3033,8 @@ "maxReplicas": "最大副本数", "cpuTarget": "CPU 目标 (%)", "memTarget": "内存目标 (%)", - "targetCPU": "目标 CPU 使用率" + "targetCPU": "目标 CPU 使用率", + "targetInfo": "Deployment: {{deploy}} · 命名空间: {{ns}}" }, "hpaCronHpa": { "currentReplicas": "当前副本:", @@ -3148,7 +3151,8 @@ "searchPlaceholder": "搜索命名空间...", "title": "命名空间管理", "quotaLimit": "配额限制", - "nameExample": "例如: my-app" + "nameExample": "例如: my-app", + "quotaSubtitle": "{{code}} · 资源配额与生命周期管理" }, "nsOverview": { "workloadReplicas": "工作负载副本管理", @@ -3159,7 +3163,8 @@ "configMaps": "配置字典", "secrets": "密钥与凭证", "hpaStrategy": "水平自动伸缩策略", - "loadingStats": "加载资源统计..." + "loadingStats": "加载资源统计...", + "subtitle": "{{code}} · 命名空间概览" }, "nsResource": { "deployDesc": "Deployment 工作负载运行状态", @@ -4370,7 +4375,9 @@ "siteRequestTimeout": "请求超时", "siteConnFailed": "连接失败", "noProbeHint": "暂无健康探针,点击「{{action}}」创建", - "searchFields": "搜索字段" + "searchFields": "搜索字段", + "receiveSend": "接收 {{rx}} · 发送 {{tx}}", + "currentFDUsage": "当前 {{pct}}%" }, "logAlertBell": { "linked": "已关联告警策略", @@ -5329,7 +5336,8 @@ "copied": "已复制到剪贴板", "recentTrend": "近 7 天趋势与执行日志(最近 100 条)", "noRecords": "暂无执行记录", - "last7days": "最近 7 天" + "last7days": "最近 7 天", + "successFail": "{{label}}: 成功 {{success}} / 失败 {{failed}}" }, "remoteExec": { "subtitle": "关联主机后批量执行命令 / 上传文件(Go-native SSH)", @@ -7663,7 +7671,11 @@ "userTitle": "职位", "userTitleField": "用户信息", "users": "用户管理", - "validUntil": "有效至" + "validUntil": "有效至", + "liveMonitor": { + "exitFullscreen": "退出全屏", + "fullscreen": "全屏" + } }, "aiops": { "activeCount": "{{count}} 个活跃", @@ -8541,5 +8553,8 @@ "oneDarkDesc": "Atom 暖灰 IDE,紫绿语法渐变", "system": "跟随系统", "tokyoNightDesc": "东京霓虹深蓝紫,VS Code 热门" + }, + "monitor.hostMonitorPanel": { + "unitCount": "个" } } diff --git a/frontend/src/pages/monitor/host-monitor/DualLineChart.tsx b/frontend/src/pages/monitor/host-monitor/DualLineChart.tsx index ee9bf6a..f549cfd 100644 --- a/frontend/src/pages/monitor/host-monitor/DualLineChart.tsx +++ b/frontend/src/pages/monitor/host-monitor/DualLineChart.tsx @@ -68,7 +68,7 @@ export function DualLineChart({ unit={unit} chartId={`dual-${title.replace(/\s/g, '')}`} title={title} - subtitle={`接收 ${currentRx} · 发送 ${currentTx}`} + subtitle={i18n.t('monitor.lbl.receiveSend', { rx: currentRx, tx: currentTx })} height={208} toolbarPlacement="header" onZoomedChange={setZoomed} diff --git a/frontend/src/pages/monitor/host-monitor/tabs/FDUsageCard.tsx b/frontend/src/pages/monitor/host-monitor/tabs/FDUsageCard.tsx index ae1efb4..eed2fcf 100644 --- a/frontend/src/pages/monitor/host-monitor/tabs/FDUsageCard.tsx +++ b/frontend/src/pages/monitor/host-monitor/tabs/FDUsageCard.tsx @@ -63,7 +63,7 @@ export function FDUsageCard({ fdInfo, fdMetrics, aggType, fdChartRef, fdChartZoo unit="%" chartId="fd-usage" title={t('monitor.lbl.nicBandwidth')} - subtitle={fdInfo?.usage_pct != null ? `当前 ${fdInfo.usage_pct.toFixed(1)}%` : undefined} + subtitle={fdInfo?.usage_pct != null ? t('monitor.lbl.currentFDUsage', { pct: fdInfo.usage_pct.toFixed(1) }) : undefined} height={160} toolbarPlacement="header" onZoomedChange={setFdChartZoomed} diff --git a/frontend/src/pages/monitor/host-monitor/tabs/NetworkTab.tsx b/frontend/src/pages/monitor/host-monitor/tabs/NetworkTab.tsx index 60c3d79..8019cb5 100644 --- a/frontend/src/pages/monitor/host-monitor/tabs/NetworkTab.tsx +++ b/frontend/src/pages/monitor/host-monitor/tabs/NetworkTab.tsx @@ -28,11 +28,11 @@ export function NetworkTab({ metrics, netInfo, currentVal, aggType }: NetworkTab } iconTone="purple" data={metrics.tcpEst} color="#8b5cf6" unit={t('monitor.hostMonitorPanel.portUnit')} domain={[0, 'auto']} aggType={aggType} /> } iconTone="yellow" - data={metrics.tcpTW} color="#f59e0b" unit="个" domain={[0, 'auto']} aggType={aggType} /> + data={metrics.tcpTW} color="#f59e0b" unit={t('common.unitCount')} domain={[0, 'auto']} aggType={aggType} /> } iconTone="red" - data={metrics.tcpCW} color="#ef4444" unit="个" domain={[0, 'auto']} aggType={aggType} /> + data={metrics.tcpCW} color="#ef4444" unit={t('common.unitCount')} domain={[0, 'auto']} aggType={aggType} /> } iconTone="cyan" - data={metrics.connTotal} color="#22d3ee" unit="个" domain={[0, 'auto']} aggType={aggType} /> + data={metrics.connTotal} color="#22d3ee" unit={t('common.unitCount')} domain={[0, 'auto']} aggType={aggType} />
} iconTone="red" - data={metrics.rxErr} color="#ef4444" unit="个" domain={[0, 'auto']} aggType={aggType} /> + data={metrics.rxErr} color="#ef4444" unit={t('common.unitCount')} domain={[0, 'auto']} aggType={aggType} /> } iconTone="orange" - data={metrics.txErr} color="#f97316" unit="个" domain={[0, 'auto']} aggType={aggType} /> + data={metrics.txErr} color="#f97316" unit={t('common.unitCount')} domain={[0, 'auto']} aggType={aggType} />
);