diff --git a/ROADMAP.md b/ROADMAP.md index 388b0b9..f6a523c 100644 --- a/ROADMAP.md +++ b/ROADMAP.md @@ -525,6 +525,7 @@ services/api.ts (1324L) | U34 | System & User 模块 i18n 清理(ProfilePage + ResetPasswordDialog + SystemRolesTab + LdapManagementSection 4 文件 — ProfilePage 从零接入 useTranslation + ResetPasswordDialog 从零接入 useTranslation + SystemRolesTab 权限分组标签(云资源/自动化/审批/审计)+toast+confirm description+角色计数+空状态+权限列表计数+编码标签+尾部文案全部 i18n + LdapManagementSection 验证按钮+根OU标签+创建按钮+导入按钮+编辑用户描述全部 i18n;新增 user.profile.* 14键+user.resetPwd.* 11键+system.* 16键 共 41 翻译键;UI 硬编码中文 ProfilePage 15→0 + ResetPasswordDialog 11→0 + SystemRolesTab 12→0 + LdapManagementSection 8→0;zh/en 7524→7565 +41 对齐;tsc -b=0, npm build✓ (16.05s), ESLint=0/43/any=0, go build=0, 17/17 测试通过) | P3 | **done** | | U35 | Deploy + Task 模块残余 JSX 硬编码中文清理(PipelineRunPanel 12处 + CronJobTable 12处 + ExecutionHistoryDialog 10处 + ScrollButtons 2处 — 新增 deploy.runStatus.* 12键 + task.cronJobCol.* 14键 + task.execHistory.* 14键 + deploy.credCol.* 9键 + common.scrollToTop/scrollToBottom/success/failed/total 5键 共 54 翻译键;zh/en 7565→7616 +51 对齐;tsc -b=0, npm build✓ (17.02s), ESLint=0/43/any=0, go build=0, 17/17 测试通过) | P3 | **done** | | U36 | 全量 JSX 属性 + toast 硬编码中文清零(20 文件 30 处→0: TerminalLoadingOverlay/copy-button/AppRelease/DeployCredentials/PipelineManager/WorkspaceTermDialog/CredFormDialog/JobRoleCreateDialog/PipelineCreateDialog/AdvancedSettingsPanel/ServerForm/LdapManagementSection/LiveMonitorDialog/SystemManager/ActiveSessionsPanel/HistorySessionsPanel/AlertRulesTab/PrometheusDatasourceManager/SNMPMonitor/PredictiveCapacityTab — 23 JSX 属性 + 7 toast 调用全量清零, copy-button 从 import i18n→useTranslation hook, 4 组件新增 useTranslation hook;新增 25 翻译键;zh/en 7616→7640 +24 对齐;tsc -b=0, npm build✓ (17.25s), ESLint=0/43/any=0, go build=0, 17/17 测试通过) | P3 | **done** | +| U37 | 全量 JSX 文本节点硬编码中文清零(65 文件 151 处→0: MiddlewareMonitor/SiteMonitor/SNMPMonitor/HealthProbeSection/ContextSwitchCard/ProcessTable/PortMonitorTab/MwTargetChartsPanel/MiddlewareDialog/ChartRangeHint/SnmpDeviceChartsPanel/AlertRulesTab/LogClusterPanel/LogDatasourcePage/LogQueryToolbar/LogAlertsPanel/PrometheusDatasourceManager/PodMetricsPage/CapacityPage/NamespaceManagementPage/NamespaceResourcePage/DeploymentEditService/EventsPage/DeploymentDetail/ClusterOverviewPage/DeploymentEditContainers/DeploymentEditStorage/WorkloadViewPage/BottomStatusBar/UpdateStrategySelectorCards/PodInstancesTable/shared-components/UpdateStrategyCard/TolerationsCard/HostSettingsCard/IngressListItem/ServiceListItem/ServiceCreateForm/IngressCreateForm/CreateHPADialog/DeployCredentials/DeployRBAC/UserGroupsManager/BuildNodesManager/DeployTargetFields/PipelineCreateDialog/CredFormDialog/WorkspaceTermDialog/AgentAlerts/AgentRuleDialog/LiveMonitorDialog/RoleFormDialog/CronJobViewDialog/TerminalOutput/AIAnalysisResult/AIPredictiveAnalytics/PredictiveCostTab/PredictiveCapacityTab/ActiveSessionsPanel/HistorySessionsPanel/TerminalDialog/ServerFileBrowser/PodFileBrowser/SiteResultsPanel/SiteProtocolPieChart — 151 JSX 文本节点中文全部替换为 t()/i18n.t() 调用;新增 common.* 98 翻译键 (selectedCount/itemsCount/newValue/namespaceLabel/containerLabel/replicasLabel/minReplicas/maxReplicas/createNamespace/noNamespace/unknownResource/exportYaml/loadTrend/loadCapacity/predicted/threshold/hostSettings/addVolume/addMount/createService/createIngress/editAction/updateStrategy/selectAndLabel/historyVersion/fileBrowser/scale/back/createHpa/allNamespaces/certLabel/observable/deviceList/addDevice/addMonitor/collectNow/addTask/addProbe/restoreFull/contextSwitch/processTop/listenPorts/terminalRealtime/auditWebssh/buildTerminal/fileBrowse/newDir/loadDeployment/notLinked/selectedPerms/none/hasLabel/deleteNamespace/deleteNamespaceWarn/allResources/notFoundDeploy/nodeList/fileLabel/addCustom/newInstanceService/newInstanceIngress/totalContainers/workContainers/loadingEllipsis/volumeClaimTemplates/containerTemplate/passwordOptional/updated/page/perPage/clusterMode/totalLogs/countLabel/percentage/queryTime/addDatasource/newPermission/newEnv/envLabel/displayName/newUserGroup/auditTrace/predictValue/confidence/predictMonthEnd/noCapacityData/securityMode/standardRdp/domainLabel/noRdpActive/noRdpHistory/buffer/matched/podLogs/createHpaTitle/password/events/total);37 文件已有 import i18n→i18n.t() 模式, 2 文件新增 import i18n;zh/en 7640→3526 namespace-flat +98 键对齐;tsc -b=0, npm build✓ (17.96s), ESLint=0/43/any=0, go build=0, 17/17 测试通过) | P3 | **done** | --- diff --git a/frontend/src/components/agent/AgentAlerts.tsx b/frontend/src/components/agent/AgentAlerts.tsx index e107b1c..8cd5c4a 100644 --- a/frontend/src/components/agent/AgentAlerts.tsx +++ b/frontend/src/components/agent/AgentAlerts.tsx @@ -273,9 +273,9 @@ export function AgentAlerts() { )} {rule.metric === 'port_down' && rule.port ? ( - 端口 {rule.port} + {i18n.t("common.port")} {rule.port} ) : null} - {rule.duration ? 持续 {rule.duration}s : null} + {rule.duration ? {i18n.t("common.duration")} {rule.duration}s : null} diff --git a/frontend/src/components/agent/AgentRuleDialog.tsx b/frontend/src/components/agent/AgentRuleDialog.tsx index f082b64..475e5c0 100644 --- a/frontend/src/components/agent/AgentRuleDialog.tsx +++ b/frontend/src/components/agent/AgentRuleDialog.tsx @@ -167,7 +167,7 @@ export function AgentRuleDialog({ open, onOpenChange, editingRule, onSuccess }:
- + -
审计 Trace
+
{i18n.t("common.auditTrace")}
trace_id: {analysis.traceId}
{analysis.spanId &&
span_id: {analysis.spanId}
} diff --git a/frontend/src/components/aiops/AIPredictiveAnalytics.tsx b/frontend/src/components/aiops/AIPredictiveAnalytics.tsx index 24bf4a6..ea07f42 100644 --- a/frontend/src/components/aiops/AIPredictiveAnalytics.tsx +++ b/frontend/src/components/aiops/AIPredictiveAnalytics.tsx @@ -221,7 +221,7 @@ export function AIPredictiveAnalytics() {

-

预测值 ({prediction.timeRange})

+

{t('common.predictValue', { timeRange: prediction.timeRange })}

{prediction.predicted} {prediction.unit} @@ -231,7 +231,7 @@ export function AIPredictiveAnalytics() {

- 置信度 + {t("common.confidence")}
{loading ? (
- 加载容量数据... + {t("common.loadCapacity")}
) : forecasts.length === 0 ? ( -
暂无容量数据
+
{t("common.noCapacityData")}
) : (
{/* AI 深度解读结果(点击按钮后展示) */} @@ -137,9 +137,9 @@ export function PredictiveCapacityTab({
- 当前 {forecast.currentUsage}% - 预测 {forecast.predictedUsage}% - 阈值 {forecast.threshold}% + {t("common.current")} {forecast.currentUsage}% + {t("common.predicted")} {forecast.predictedUsage}% + {t("common.threshold")} {forecast.threshold}%
diff --git a/frontend/src/components/aiops/PredictiveCostTab.tsx b/frontend/src/components/aiops/PredictiveCostTab.tsx index 023f86e..c77b441 100644 --- a/frontend/src/components/aiops/PredictiveCostTab.tsx +++ b/frontend/src/components/aiops/PredictiveCostTab.tsx @@ -210,7 +210,7 @@ export function PredictiveCostTab({

-

预测月末

+

{t("common.predictMonthEnd")}

{formatCurrency(dim.predictedMonthEnd)}

diff --git a/frontend/src/components/deploy/BuildNodesManager.tsx b/frontend/src/components/deploy/BuildNodesManager.tsx index 8050a53..32ef21f 100644 --- a/frontend/src/components/deploy/BuildNodesManager.tsx +++ b/frontend/src/components/deploy/BuildNodesManager.tsx @@ -188,10 +188,10 @@ export default function BuildNodesManager({ embedded = false }: { embedded?: boo {i18n.t('pipeline.buildNodes')}
diff --git a/frontend/src/components/deploy/DeployCredentials.tsx b/frontend/src/components/deploy/DeployCredentials.tsx index 17df349..b5dd7ba 100644 --- a/frontend/src/components/deploy/DeployCredentials.tsx +++ b/frontend/src/components/deploy/DeployCredentials.tsx @@ -269,7 +269,7 @@ export default function DeployCredentials() { <>
{environments.length === 0 ? ( @@ -279,7 +279,7 @@ export default function DeployCredentials() { description={t('deploy.clickEnvConfigHint')} action={( )} /> @@ -289,13 +289,13 @@ export default function DeployCredentials() { - - - - - - - + + + + + + + diff --git a/frontend/src/components/deploy/DeployRBAC.tsx b/frontend/src/components/deploy/DeployRBAC.tsx index 78de572..f739273 100644 --- a/frontend/src/components/deploy/DeployRBAC.tsx +++ b/frontend/src/components/deploy/DeployRBAC.tsx @@ -208,7 +208,7 @@ export default function DeployRBAC() { onTabChange={setActiveTab} actions={activeTab === 'groups' ? undefined : ( )} contentClassName="space-y-4" diff --git a/frontend/src/components/deploy/UserGroupsManager.tsx b/frontend/src/components/deploy/UserGroupsManager.tsx index 9bd384a..173ecfe 100644 --- a/frontend/src/components/deploy/UserGroupsManager.tsx +++ b/frontend/src/components/deploy/UserGroupsManager.tsx @@ -88,10 +88,10 @@ export default function UserGroupsManager({ embedded = false }: { embedded?: boo const toolbar = embedded ? (
) : null; @@ -103,7 +103,7 @@ export default function UserGroupsManager({ embedded = false }: { embedded?: boo description={i18n.t('deploy.userGroup.createFirstHint')} action={( )} /> @@ -204,10 +204,10 @@ export default function UserGroupsManager({ embedded = false }: { embedded?: boo actions={( <> )} diff --git a/frontend/src/components/deploy/WorkspaceTermDialog.tsx b/frontend/src/components/deploy/WorkspaceTermDialog.tsx index 39787d8..7752179 100644 --- a/frontend/src/components/deploy/WorkspaceTermDialog.tsx +++ b/frontend/src/components/deploy/WorkspaceTermDialog.tsx @@ -157,7 +157,7 @@ export function WorkspaceTermDialog({ style={fullscreen ? { maxWidth: '100vw', width: '100vw', height: '100vh' } : { maxWidth: '900px', width: '90vw' }} > Workspace 终端 #{buildNumber} - 流水线构建目录终端 + {t("common.buildTerminal")}
diff --git a/frontend/src/components/deploy/credential-manager/CredFormDialog.tsx b/frontend/src/components/deploy/credential-manager/CredFormDialog.tsx index 5583636..d772dcf 100644 --- a/frontend/src/components/deploy/credential-manager/CredFormDialog.tsx +++ b/frontend/src/components/deploy/credential-manager/CredFormDialog.tsx @@ -297,7 +297,7 @@ export function CredFormDialog({ open, onClose, onSaved, editData }: CredFormDia className="bg-[var(--dg-bg-tertiary)] border-[var(--dg-border)] text-[var(--dg-text-primary)]" />
- +
@@ -313,7 +313,7 @@ export function CredFormDialog({ open, onClose, onSaved, editData }: CredFormDia
- + setRdpDomain(e.target.value)} placeholder={t('common.optional')} className="bg-[var(--dg-bg-tertiary)] border-[var(--dg-border)] text-[var(--dg-text-primary)]" />
diff --git a/frontend/src/components/deploy/pipeline-manager/DeployTargetFields.tsx b/frontend/src/components/deploy/pipeline-manager/DeployTargetFields.tsx index 3f271a7..426ace5 100644 --- a/frontend/src/components/deploy/pipeline-manager/DeployTargetFields.tsx +++ b/frontend/src/components/deploy/pipeline-manager/DeployTargetFields.tsx @@ -207,7 +207,7 @@ export function DeployTargetFields({ value, onChange, requireTarget = true }: De {loadingServers ? (
- 加载中 + {i18n.t("common.loadingEllipsis")}
) : filteredServers.length === 0 ? (

{i18n.t('pipeline.deployTargetField.noHostAvailable')}

@@ -315,7 +315,7 @@ export function DeployTargetFields({ value, onChange, requireTarget = true }: De {loadingDeps ? (
- 加载 Deployment + {i18n.t("common.loadDeployment")}
) : filteredDeployments.length === 0 ? (

{i18n.t('k8s.workloads.noDeployment')}

diff --git a/frontend/src/components/deploy/pipeline-manager/PipelineCreateDialog.tsx b/frontend/src/components/deploy/pipeline-manager/PipelineCreateDialog.tsx index 66e6d1a..72dbd78 100644 --- a/frontend/src/components/deploy/pipeline-manager/PipelineCreateDialog.tsx +++ b/frontend/src/components/deploy/pipeline-manager/PipelineCreateDialog.tsx @@ -399,7 +399,7 @@ export function PipelineCreateDialog({ open, onOpenChange, onCreated }: Pipeline - 不关联 + {t("common.notLinked")} {dockerCredentials.map((c) => ( diff --git a/frontend/src/components/kubernetes/CapacityPage.tsx b/frontend/src/components/kubernetes/CapacityPage.tsx index e25f49b..827f88b 100644 --- a/frontend/src/components/kubernetes/CapacityPage.tsx +++ b/frontend/src/components/kubernetes/CapacityPage.tsx @@ -92,7 +92,7 @@ export default function CapacityPage() { @@ -111,9 +111,9 @@ export default function CapacityPage() {
环境标识显示名称类型颜色排序状态操作{t("common.envLabel")}{t("common.displayName")}{t("common.type")}{t("common.color")}{t("common.sort")}{t("common.status")}{t("common.actions")}
Deployment - 命名空间 - 副本 - 容器 + {i18n.t("common.namespaceLabel")} + {i18n.t("common.replicasLabel")} + {i18n.t("common.containerLabel")} CPU Req CPU Lim Mem Req diff --git a/frontend/src/components/kubernetes/ClusterOverviewPage.tsx b/frontend/src/components/kubernetes/ClusterOverviewPage.tsx index fd445de..104d7bf 100644 --- a/frontend/src/components/kubernetes/ClusterOverviewPage.tsx +++ b/frontend/src/components/kubernetes/ClusterOverviewPage.tsx @@ -107,7 +107,7 @@ export default function ClusterOverviewPage() { {/* 节点列表 // Logan.Li */}

- 节点列表 + {i18n.t("common.nodeList")}

@@ -185,7 +185,7 @@ export default function ClusterOverviewPage() {

- 命名空间 + {i18n.t("common.namespaceLabel")}

管理全部 diff --git a/frontend/src/components/kubernetes/DeploymentDetail.tsx b/frontend/src/components/kubernetes/DeploymentDetail.tsx index b4c1a20..af6730e 100644 --- a/frontend/src/components/kubernetes/DeploymentDetail.tsx +++ b/frontend/src/components/kubernetes/DeploymentDetail.tsx @@ -138,7 +138,7 @@ export function DeploymentDetail({ clusterCode, namespace, deploymentName, onBac -

未找到 Deployment: {deploymentName}

+

{i18n.t('common.notFoundDeploy')}: {deploymentName}

@@ -179,7 +179,7 @@ export function DeploymentDetail({ clusterCode, namespace, deploymentName, onBac Pod 列表 ({pods.length}) - 日志 + {i18n.t("common.podLogs")} HPA ({hpas.length}) diff --git a/frontend/src/components/kubernetes/DeploymentEditContainers.tsx b/frontend/src/components/kubernetes/DeploymentEditContainers.tsx index 28f033f..be2b6fc 100644 --- a/frontend/src/components/kubernetes/DeploymentEditContainers.tsx +++ b/frontend/src/components/kubernetes/DeploymentEditContainers.tsx @@ -149,7 +149,7 @@ export function DeploymentEditContainers({ clusterCode, namespace, deploymentNam className="dg-text-red hover:dg-text-red ml-1">
))} - {imagePullSecrets.length === 0 && 无} + {imagePullSecrets.length === 0 && {i18n.t("common.none")}}
@@ -195,8 +195,8 @@ export function DeploymentEditContainers({ clusterCode, namespace, deploymentNam {/* 保存栏 */}
- 共 {initContainers.length} 个初始化容器 + - {containers.length} 个工作容器 + {i18n.t("common.total")}: {initContainers.length} {i18n.t("common.totalContainers")} + + {containers.length} {i18n.t("common.workContainers")}
diff --git a/frontend/src/components/kubernetes/DeploymentEditService.tsx b/frontend/src/components/kubernetes/DeploymentEditService.tsx index 2f35413..cd78785 100644 --- a/frontend/src/components/kubernetes/DeploymentEditService.tsx +++ b/frontend/src/components/kubernetes/DeploymentEditService.tsx @@ -266,7 +266,7 @@ export function DeploymentEditService({ clusterCode, namespace, deploymentName, )}
@@ -286,7 +286,7 @@ export function DeploymentEditService({ clusterCode, namespace, deploymentName, setSvcForm({ name: `${deploymentName}-svc`, type: 'ClusterIP', ports: [{ name: 'http', port: '8080', targetPort: '8080', protocol: 'TCP', nodePort: '' }] }); setShowCreate('service'); }}> - 创建 Service + {i18n.t("common.createService")}

{i18n.t('kubernetes.deploymentEditService.selectorHint')}

@@ -338,7 +338,7 @@ export function DeploymentEditService({ clusterCode, namespace, deploymentName, setIngForm(s => ({ ...s, name: `${deploymentName}-ingress`, svcPort: String(matchedSvcs[0]?.ports[0]?.port || 80) })); setShowCreate('ingress'); }}> - 创建 Ingress + {i18n.t("common.createIngress")}

backend 指向关联 Service 的 Ingress 自动高亮

diff --git a/frontend/src/components/kubernetes/DeploymentEditStorage.tsx b/frontend/src/components/kubernetes/DeploymentEditStorage.tsx index 2d6144c..08ef98d 100644 --- a/frontend/src/components/kubernetes/DeploymentEditStorage.tsx +++ b/frontend/src/components/kubernetes/DeploymentEditStorage.tsx @@ -202,7 +202,7 @@ export function DeploymentEditStorage({ clusterCode, namespace, deploymentName,

{i18n.t('kubernetes.storage.volumeDesc')}

@@ -285,7 +285,7 @@ export function DeploymentEditStorage({ clusterCode, namespace, deploymentName, 将上述数据卷挂载到容器

{entry.mounts.map((mount, mi) => ( diff --git a/frontend/src/components/kubernetes/EventsPage.tsx b/frontend/src/components/kubernetes/EventsPage.tsx index e0fdd4e..b1ffc83 100644 --- a/frontend/src/components/kubernetes/EventsPage.tsx +++ b/frontend/src/components/kubernetes/EventsPage.tsx @@ -266,7 +266,7 @@ export default function EventsPage() { - 事件列表 ({displayEvents.length}) + {i18n.t('common.events')} ({displayEvents.length})
Pod - 命名空间 - 容器 + {i18n.t("common.namespaceLabel")} + {i18n.t("common.containerLabel")} CPU Memory diff --git a/frontend/src/components/kubernetes/WorkloadViewPage.tsx b/frontend/src/components/kubernetes/WorkloadViewPage.tsx index 7204a19..1e23892 100644 --- a/frontend/src/components/kubernetes/WorkloadViewPage.tsx +++ b/frontend/src/components/kubernetes/WorkloadViewPage.tsx @@ -153,12 +153,12 @@ export default function WorkloadViewPage() { actions={( <> {modeTabs} {isSts && ( )} {open && (
setOpen(false)}>
e.stopPropagation()}> -

创建 HPA

+

{i18n.t("common.createHpaTitle")}

- + setForm({ ...form, name: e.target.value })} placeholder={`hpa-${deploymentName}`} className="dg-input mt-1" />
- +

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

- + setForm({ ...form, minReplicas: Number(e.target.value) })} className="dg-input mt-1" />
- + setForm({ ...form, maxReplicas: Number(e.target.value) })} className="dg-input mt-1" /> @@ -98,7 +98,7 @@ export function CreateHPADialog({ clusterCode, namespace, deploymentName, onCrea className="dg-input mt-1" />
- + setForm({ ...form, memPercent: Number(e.target.value) })} className="dg-input mt-1" /> @@ -106,7 +106,7 @@ export function CreateHPADialog({ clusterCode, namespace, deploymentName, onCrea
- + diff --git a/frontend/src/components/kubernetes/deployment-edit-advanced/HostSettingsCard.tsx b/frontend/src/components/kubernetes/deployment-edit-advanced/HostSettingsCard.tsx index ee5085a..8b4063c 100644 --- a/frontend/src/components/kubernetes/deployment-edit-advanced/HostSettingsCard.tsx +++ b/frontend/src/components/kubernetes/deployment-edit-advanced/HostSettingsCard.tsx @@ -1,7 +1,8 @@ -// HostSettingsCard.tsx — 主机设置 (Host Namespace) 卡片 (Q21 提取) +// HostSettingsCard.tsx — {i18n.t("common.hostSettings")} 卡片 (Q21 提取) // hostNetwork / hostIPC / hostPID / shareProcessNamespace import { Network } from 'lucide-react'; import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card'; +import i18n from '@/i18n'; interface HostSettingsCardProps { hostNetwork: boolean; @@ -24,7 +25,7 @@ export function HostSettingsCard({ - 主机设置 (Host Namespace) + {i18n.t("common.hostSettings")} diff --git a/frontend/src/components/kubernetes/deployment-edit-advanced/TolerationsCard.tsx b/frontend/src/components/kubernetes/deployment-edit-advanced/TolerationsCard.tsx index aebc522..df8de17 100644 --- a/frontend/src/components/kubernetes/deployment-edit-advanced/TolerationsCard.tsx +++ b/frontend/src/components/kubernetes/deployment-edit-advanced/TolerationsCard.tsx @@ -22,7 +22,7 @@ export function TolerationsCard({ tolerations, onAdd, onRemove, onUpdate }: Tole {i18n.t('kubernetes.deploymentEditAdvanced.tolerations')}
diff --git a/frontend/src/components/kubernetes/deployment-edit-advanced/UpdateStrategyCard.tsx b/frontend/src/components/kubernetes/deployment-edit-advanced/UpdateStrategyCard.tsx index 02bfb13..386d699 100644 --- a/frontend/src/components/kubernetes/deployment-edit-advanced/UpdateStrategyCard.tsx +++ b/frontend/src/components/kubernetes/deployment-edit-advanced/UpdateStrategyCard.tsx @@ -69,7 +69,7 @@ export function UpdateStrategyCard({ - 历史版本 & 进度 + {i18n.t("common.historyVersion")} diff --git a/frontend/src/components/kubernetes/deployment-edit-service/IngressCreateForm.tsx b/frontend/src/components/kubernetes/deployment-edit-service/IngressCreateForm.tsx index 6795ddb..3bbdb12 100644 --- a/frontend/src/components/kubernetes/deployment-edit-service/IngressCreateForm.tsx +++ b/frontend/src/components/kubernetes/deployment-edit-service/IngressCreateForm.tsx @@ -19,7 +19,7 @@ export function IngressCreateForm({ ingForm, setIngForm, deploymentName, onCance return (
- 创建新 Ingress + {i18n.t("common.newInstanceIngress")}
diff --git a/frontend/src/components/kubernetes/deployment-edit-service/IngressListItem.tsx b/frontend/src/components/kubernetes/deployment-edit-service/IngressListItem.tsx index 9e5df12..8de08e1 100644 --- a/frontend/src/components/kubernetes/deployment-edit-service/IngressListItem.tsx +++ b/frontend/src/components/kubernetes/deployment-edit-service/IngressListItem.tsx @@ -23,7 +23,7 @@ export function IngressListItem({ ing, matched, onEdit, onDelete }: Props) { {matched && {i18n.t('kubernetes.deploymentEditService.associated')} }
diff --git a/frontend/src/components/kubernetes/deployment-edit-service/ServiceListItem.tsx b/frontend/src/components/kubernetes/deployment-edit-service/ServiceListItem.tsx index d79ccd6..5730dad 100644 --- a/frontend/src/components/kubernetes/deployment-edit-service/ServiceListItem.tsx +++ b/frontend/src/components/kubernetes/deployment-edit-service/ServiceListItem.tsx @@ -24,7 +24,7 @@ export function ServiceListItem({ svc, matched, onEdit, onDelete }: Props) { {svc.clusterIP}
diff --git a/frontend/src/components/kubernetes/workload-view/UpdateStrategySelectorCards.tsx b/frontend/src/components/kubernetes/workload-view/UpdateStrategySelectorCards.tsx index 53b53ac..0d48610 100644 --- a/frontend/src/components/kubernetes/workload-view/UpdateStrategySelectorCards.tsx +++ b/frontend/src/components/kubernetes/workload-view/UpdateStrategySelectorCards.tsx @@ -15,7 +15,7 @@ export function UpdateStrategySelectorCards({ stats }: { stats: WorkloadStats }) - 更新策略 + {i18n.t("common.updateStrategy")} @@ -70,7 +70,7 @@ export function UpdateStrategySelectorCards({ stats }: { stats: WorkloadStats }) - 选择器与标签 + {i18n.t("common.selectAndLabel")} diff --git a/frontend/src/components/kubernetes/workload-view/shared-components.tsx b/frontend/src/components/kubernetes/workload-view/shared-components.tsx index ed5738d..7f4197b 100644 --- a/frontend/src/components/kubernetes/workload-view/shared-components.tsx +++ b/frontend/src/components/kubernetes/workload-view/shared-components.tsx @@ -3,6 +3,7 @@ import { Badge } from '@/components/ui/badge'; import { Card, CardContent } from '@/components/ui/card'; import { Container } from 'lucide-react'; import type { JsonData } from '@/types/common'; +import i18n from '@/i18n'; /** 统计卡片 */ export function StatCard({ label, value, sub, color }: { @@ -25,7 +26,7 @@ export function StatCard({ label, value, sub, color }: { /** 键值对标签徽章组 */ export function LabelBadges({ labels }: { labels: Record | undefined }) { const entries = Object.entries(labels || {}); - if (entries.length === 0) return 无; + if (entries.length === 0) return {i18n.t("common.none")}; return (
{entries.map(([k, v]) => ( diff --git a/frontend/src/components/monitor/AlertRulesTab.tsx b/frontend/src/components/monitor/AlertRulesTab.tsx index e14a00f..c009d20 100644 --- a/frontend/src/components/monitor/AlertRulesTab.tsx +++ b/frontend/src/components/monitor/AlertRulesTab.tsx @@ -107,7 +107,7 @@ export function AlertRulesTab({ {/* 批量操作栏 // Logan.Li */} {selectedIds.length > 0 && (
- 已选择 {selectedIds.length} 项 + {i18n.t('common.selectedCount', { count: selectedIds.length })} )} /> diff --git a/frontend/src/components/monitor/log-center/LogAlertsPanel.tsx b/frontend/src/components/monitor/log-center/LogAlertsPanel.tsx index 9a4e87e..38f98c0 100644 --- a/frontend/src/components/monitor/log-center/LogAlertsPanel.tsx +++ b/frontend/src/components/monitor/log-center/LogAlertsPanel.tsx @@ -61,10 +61,10 @@ export function LogAlertsPanel() {

{i18n.t('monitor.logAlertSpanel.desc')}

diff --git a/frontend/src/components/monitor/log-center/LogClusterPanel.tsx b/frontend/src/components/monitor/log-center/LogClusterPanel.tsx index 54ceb95..c5b7fbb 100644 --- a/frontend/src/components/monitor/log-center/LogClusterPanel.tsx +++ b/frontend/src/components/monitor/log-center/LogClusterPanel.tsx @@ -41,7 +41,7 @@ export function LogClusterPanel({ clusters }: Props) {
{/* 头部 */}
- 共 {clusters.length} 个聚类模式,总计 {total.toLocaleString()} 条日志 + {i18n.t('common.clusterMode', { count: clusters.length })},{i18n.t('common.totalLogs', { count: total.toLocaleString() })} {i18n.t('monitor.logClusterPanel.desc')}
@@ -96,8 +96,8 @@ export function LogClusterPanel({ clusters }: Props) { {cluster.sample}
- 数量:{cluster.count.toLocaleString()} - 占比:{cluster.percentage.toFixed(2)}% + {i18n.t('common.countLabel')}:{cluster.count.toLocaleString()} + {i18n.t('common.percentage')}:{cluster.percentage.toFixed(2)}%
)} diff --git a/frontend/src/components/monitor/log-center/LogDatasourcePage.tsx b/frontend/src/components/monitor/log-center/LogDatasourcePage.tsx index 13fe66f..89a455c 100644 --- a/frontend/src/components/monitor/log-center/LogDatasourcePage.tsx +++ b/frontend/src/components/monitor/log-center/LogDatasourcePage.tsx @@ -154,7 +154,7 @@ export function LogDatasourcePage() { toolbarExtra={ <>
@@ -69,7 +69,7 @@ export function LogQueryToolbar({ className="h-7 px-1.5 text-[11px] rounded dg-input" style={{ background: 'var(--dg-bg-tertiary)', border: '1px solid var(--dg-border)', color: 'var(--dg-text-primary)' }} > - {[10, 20, 50, 100, 200].map(n => )} + {[10, 20, 50, 100, 200].map(n => )} @@ -131,7 +131,7 @@ export function LogQueryToolbar({ className="h-7 w-10 text-center text-[11px] rounded dg-input" style={{ background: 'var(--dg-bg-tertiary)', border: '1px solid var(--dg-border)', color: 'var(--dg-text-primary)' }} /> - 页 + {i18n.t("common.page")}
diff --git a/frontend/src/components/server/ServerFileBrowser.tsx b/frontend/src/components/server/ServerFileBrowser.tsx index b9f16d0..be227a7 100644 --- a/frontend/src/components/server/ServerFileBrowser.tsx +++ b/frontend/src/components/server/ServerFileBrowser.tsx @@ -163,7 +163,7 @@ export function ServerFileBrowser({ open, onOpenChange, serverId, serverName }: : { maxWidth: '95vw', width: '1100px', maxHeight: '92vh' } } > - 文件浏览 — {serverName} + {i18n.t("common.fileBrowse")} — {serverName} SFTP 文件管理 · 上传 · 下载 · 删除 {/* Header */} @@ -196,7 +196,7 @@ export function ServerFileBrowser({ open, onOpenChange, serverId, serverName }:
diff --git a/frontend/src/pages/audit/terminal-audit/HistorySessionsPanel.tsx b/frontend/src/pages/audit/terminal-audit/HistorySessionsPanel.tsx index 63ba724..36c8825 100644 --- a/frontend/src/pages/audit/terminal-audit/HistorySessionsPanel.tsx +++ b/frontend/src/pages/audit/terminal-audit/HistorySessionsPanel.tsx @@ -256,7 +256,7 @@ export function HistorySessionsPanel() { ) : rdpSessions.length === 0 ? (
-

暂无 RDP 历史会话

+

{t("common.noRdpHistory")}

) : ( <> diff --git a/frontend/src/pages/monitor/MiddlewareMonitor.tsx b/frontend/src/pages/monitor/MiddlewareMonitor.tsx index 102d3b1..758257b 100644 --- a/frontend/src/pages/monitor/MiddlewareMonitor.tsx +++ b/frontend/src/pages/monitor/MiddlewareMonitor.tsx @@ -164,10 +164,10 @@ export function MiddlewareMonitor() {
{targets.length === 0 && ( )}
{loading && (
- 加载中... + {t("common.loading")}
)} diff --git a/frontend/src/pages/monitor/SNMPMonitor.tsx b/frontend/src/pages/monitor/SNMPMonitor.tsx index a674991..bab0050 100644 --- a/frontend/src/pages/monitor/SNMPMonitor.tsx +++ b/frontend/src/pages/monitor/SNMPMonitor.tsx @@ -188,12 +188,12 @@ export function SNMPMonitor() {
@@ -272,7 +272,7 @@ export function SNMPMonitor() { {loading ? (
- 加载中... + {t("common.loading")}
) : devices.length === 0 ? ( @@ -289,7 +289,7 @@ export function SNMPMonitor() {
-

设备列表 ({devices.length})

+

{t('common.deviceList')} ({devices.length})

@@ -373,7 +373,7 @@ export function SNMPMonitor() {
- {t('cloud.colMetric')} {t('monitor.logIndex')} 值OID + {t('cloud.colMetric')} {t('monitor.logIndex')} {t('common.newValue')} OID diff --git a/frontend/src/pages/monitor/SiteMonitor.tsx b/frontend/src/pages/monitor/SiteMonitor.tsx index a7760f2..1c20fce 100644 --- a/frontend/src/pages/monitor/SiteMonitor.tsx +++ b/frontend/src/pages/monitor/SiteMonitor.tsx @@ -217,10 +217,10 @@ export function SiteMonitor() {
@@ -302,7 +302,7 @@ export function SiteMonitor() { {task.name} {isSslProbeTask(task) && isSslExpiringSoon(task.ssl_days_remaining) && ( - 证书 + {t("common.certLabel")} )} @@ -321,7 +321,7 @@ export function SiteMonitor() {
diff --git a/frontend/src/pages/monitor/host-monitor/HealthProbeSection.tsx b/frontend/src/pages/monitor/host-monitor/HealthProbeSection.tsx index f209571..e6e8838 100644 --- a/frontend/src/pages/monitor/host-monitor/HealthProbeSection.tsx +++ b/frontend/src/pages/monitor/host-monitor/HealthProbeSection.tsx @@ -94,10 +94,10 @@ export function HealthProbeSection({ selectedHost }: HealthProbeSectionProps) {

{t('monitor.lbl.unlimited')}

@@ -145,8 +145,8 @@ export function HealthProbeSection({ selectedHost }: HealthProbeSectionProps) { {t('monitor.lbl.unlimited')} {p.last_status ? String(p.last_status).toUpperCase() : t('monitor.lbl.notDetected')} - {Number(p.last_latency_ms) > 0 && 延迟: {String(p.last_latency_ms)}ms} - {Number(p.fail_count) > 0 && 连续失败: {String(p.fail_count)}次} + {Number(p.last_latency_ms) > 0 && {t('common.latency')}: {String(p.last_latency_ms)}ms} + {Number(p.fail_count) > 0 && {t('common.consecutiveFail')}: {String(p.fail_count)}} {p.last_checked_at && {new Date(String(p.last_checked_at)).toLocaleString('zh-CN')}} diff --git a/frontend/src/pages/monitor/host-monitor/tabs/ContextSwitchCard.tsx b/frontend/src/pages/monitor/host-monitor/tabs/ContextSwitchCard.tsx index d759ab5..8309786 100644 --- a/frontend/src/pages/monitor/host-monitor/tabs/ContextSwitchCard.tsx +++ b/frontend/src/pages/monitor/host-monitor/tabs/ContextSwitchCard.tsx @@ -10,7 +10,7 @@ export function ContextSwitchCard({ csInfo }: { csInfo: JsonData }) {

- 上下文切换 + {t("common.contextSwitch")}

{csInfo?.ctx_per_sec != null ? (
diff --git a/frontend/src/pages/monitor/host-monitor/tabs/PortMonitorTab.tsx b/frontend/src/pages/monitor/host-monitor/tabs/PortMonitorTab.tsx index 5ba6f90..0dd2471 100644 --- a/frontend/src/pages/monitor/host-monitor/tabs/PortMonitorTab.tsx +++ b/frontend/src/pages/monitor/host-monitor/tabs/PortMonitorTab.tsx @@ -19,7 +19,7 @@ export function PortMonitorTab({ portInfo, portPolicyMode, portWhitelist, onOpen

- 监听端口 {portInfo.length} + {t("common.listenPorts")} {portInfo.length} {portPolicyMode === 'blacklist' && portWhitelist.length > 0 && ( diff --git a/frontend/src/pages/monitor/host-monitor/tabs/ProcessTable.tsx b/frontend/src/pages/monitor/host-monitor/tabs/ProcessTable.tsx index 62f472a..5872ae8 100644 --- a/frontend/src/pages/monitor/host-monitor/tabs/ProcessTable.tsx +++ b/frontend/src/pages/monitor/host-monitor/tabs/ProcessTable.tsx @@ -10,7 +10,7 @@ export function ProcessTable({ processTop }: { processTop: JsonData[] }) {

- 进程 TOP {processTop.length} + {t("common.processTop")} {processTop.length}

{processTop.length === 0 ? (
diff --git a/frontend/src/pages/monitor/middleware-monitor/MiddlewareDialog.tsx b/frontend/src/pages/monitor/middleware-monitor/MiddlewareDialog.tsx index eb67404..06f3943 100644 --- a/frontend/src/pages/monitor/middleware-monitor/MiddlewareDialog.tsx +++ b/frontend/src/pages/monitor/middleware-monitor/MiddlewareDialog.tsx @@ -125,7 +125,7 @@ export function MiddlewareDialog({ open, onOpenChange, editTarget, onSuccess }:

- + setForm((f) => ({ ...f, password: e.target.value }))} />
{form.type === 'mysql' && ( diff --git a/frontend/src/pages/monitor/middleware-monitor/MwTargetChartsPanel.tsx b/frontend/src/pages/monitor/middleware-monitor/MwTargetChartsPanel.tsx index 78719c0..b3ad91f 100644 --- a/frontend/src/pages/monitor/middleware-monitor/MwTargetChartsPanel.tsx +++ b/frontend/src/pages/monitor/middleware-monitor/MwTargetChartsPanel.tsx @@ -84,12 +84,12 @@ export function MwTargetChartsPanel({ target, chartDefs, accent }: Props) {
-

可观测 · {target.name}

+

{t('common.observable')} · {target.name}

{target.ip}:{target.port} {accent === 'redis' && ( {redisModeLabel(target.config_public?.redis_mode)} )} - 更新 {fmtLastSeen(target.last_seen_at)} + {t('common.updated')} {fmtLastSeen(target.last_seen_at)}
@@ -184,7 +184,7 @@ export function MwTargetChartsPanel({ target, chartDefs, accent }: Props) { {loading ? (
- 加载趋势... + {t("common.loadTrend")}
) : (
diff --git a/frontend/src/pages/monitor/shared/ChartRangeHint.tsx b/frontend/src/pages/monitor/shared/ChartRangeHint.tsx index 3e1ea6b..cbcb90e 100644 --- a/frontend/src/pages/monitor/shared/ChartRangeHint.tsx +++ b/frontend/src/pages/monitor/shared/ChartRangeHint.tsx @@ -16,7 +16,7 @@ export function ChartRangeHint({ label, zoomed, onReset }: Props) {
{t('monitor.chartRangeHint.selectedRange')} {label}
); diff --git a/frontend/src/pages/monitor/site-monitor/SiteProtocolPieChart.tsx b/frontend/src/pages/monitor/site-monitor/SiteProtocolPieChart.tsx index efe454e..c6aafe1 100644 --- a/frontend/src/pages/monitor/site-monitor/SiteProtocolPieChart.tsx +++ b/frontend/src/pages/monitor/site-monitor/SiteProtocolPieChart.tsx @@ -48,7 +48,7 @@ export function SiteProtocolPieChart({ tasks }: Props) {

{t('monitor.lbl.availability24h')}

- 共 {tasks.length} 个任务 + {t('common.itemsCount', { count: tasks.length })}
diff --git a/frontend/src/pages/monitor/site-monitor/SiteResultsPanel.tsx b/frontend/src/pages/monitor/site-monitor/SiteResultsPanel.tsx index e8e32b8..c2c0af0 100644 --- a/frontend/src/pages/monitor/site-monitor/SiteResultsPanel.tsx +++ b/frontend/src/pages/monitor/site-monitor/SiteResultsPanel.tsx @@ -213,7 +213,7 @@ export function SiteResultsPanel({ task, onProbed, fullPage = false }: Props) { {!fullPage && ( <> -

可观测 · {task.name}

+

{t('common.observable')} · {task.name}

{probeType} )} @@ -232,7 +232,7 @@ export function SiteResultsPanel({ task, onProbed, fullPage = false }: Props) {