refactor(i18n): U39 残余 JSX 属性/模板字面量中文清零 — 14 处→0

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 测试通过
This commit is contained in:
attacker committed 2026-07-13 13:12:54 +08:00
1 parent a1d82574a7
commit 5205def47f
14 files changed
+67 -29

No files matched your search

@@ -121,7 +121,7 @@ export default function NamespaceManagementPage() {
<PageShell
variant="list"
title={i18n.t('k8s.nsMgmt.title')}
subtitle={`${clusterCode} · 资源配额与生命周期管理`}
subtitle={i18n.t('k8s.nsMgmt.quotaSubtitle', { code: clusterCode })}
icon={<Boxes className="h-5 w-5" />}
metrics={!loading ? (
<StatStrip
@@ -68,7 +68,7 @@ export default function NamespaceOverviewPage() {
<PageShell
variant="default"
title={namespace || i18n.t('kubernetes.namespace.title')}
subtitle={`${clusterCode} · 命名空间概览`}
subtitle={i18n.t('k8s.nsOverview.subtitle', { code: clusterCode })}
icon={<Cloud className="h-5 w-5" />}
loading={loading}
loadingLabel={i18n.t('k8s.nsOverview.loadingStats')}
@@ -72,8 +72,8 @@ export function CreateHPADialog({ clusterCode, namespace, deploymentName, onCrea
</div>
<div>
<Label className="dg-text-secondary text-sm">{i18n.t("common.target")}</Label>
<p className="text-[var(--dg-text-secondary)] text-sm mt-1 bg-[var(--dg-bg-tertiary)] rounded px-3 py-2 truncate" title={`Deployment: ${deploymentName} · 命名空间: ${namespace}`}>
Deployment: {deploymentName} · 命名空间: {namespace}
<p className="text-[var(--dg-text-secondary)] text-sm mt-1 bg-[var(--dg-bg-tertiary)] rounded px-3 py-2 truncate" title={i18n.t('k8s.hpa.targetInfo', { deploy: deploymentName, ns: namespace })}>
{i18n.t('k8s.hpa.targetInfo', { deploy: deploymentName, ns: namespace })}
</p>
</div>
<div className="grid grid-cols-2 gap-3">
@@ -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 })}` : ''}`}
>
<input
type="checkbox"
@@ -232,7 +232,7 @@ export function LiveMonitorDialog({ open, onOpenChange, sessionId, sessionInfo }
type="button"
onClick={() => 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 ? <Minimize2 className="h-4 w-4" /> : <Maximize2 className="h-4 w-4" />}
</button>
@@ -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
@@ -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) {
<div className="flex items-center gap-3 mt-4 pt-4 border-t border-[var(--dg-border)]">
{ldapTestResult && (
<span
className={`text-xs ${ldapTestResult.includes("成功") ? "dg-text-green" : "dg-text-red"}`}
className={`text-xs ${ldapTestSuccess ? "dg-text-green" : "dg-text-red"}`}
>
{ldapTestResult}
</span>
@@ -38,6 +38,7 @@ export function useLdapManagement(onUsersChanged: () => Promise<void> | void) {
const [ldapSaving, setLdapSaving] = useState(false);
const [ldapTesting, setLdapTesting] = useState(false);
const [ldapTestResult, setLdapTestResult] = useState<string | null>(null);
const [ldapTestSuccess, setLdapTestSuccess] = useState(false);
const [ldapMgmtOpen, setLdapMgmtOpen] = useState(false);
const [importFeedback, setImportFeedback] = useState<string | null>(null);
const [importResultOpen, setImportResultOpen] = useState(false);
@@ -101,11 +102,14 @@ export function useLdapManagement(onUsersChanged: () => Promise<void> | 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> | void) {
ldapSaving,
ldapTesting,
ldapTestResult,
ldapTestSuccess,
handleLdapSave,
handleLdapTest,
ldapMgmtOpen,
@@ -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 })}
/>
</div>
<span className="text-[10px] dg-text-muted">{item.label}</span>