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
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} />