diff --git a/frontend/src/api/aiops/assistant.ts b/frontend/src/api/aiops/assistant.ts index 7ad9729..b54f242 100644 --- a/frontend/src/api/aiops/assistant.ts +++ b/frontend/src/api/aiops/assistant.ts @@ -218,7 +218,7 @@ export const aiApi = { useUserStore.getState().logout(); throw new Error(i18n.t('common.request.tokenExpired')); } - if (!res.body) throw new Error(i18n.t('aiops.assistantts.s16f94bee')); + if (!res.body) throw new Error(i18n.t('aiops.assistant.streamUnavailable')); const reader = res.body.getReader(); const decoder = new TextDecoder('utf-8'); let buffer = ''; @@ -244,10 +244,10 @@ export const aiApi = { // {code, message} try { const obj = JSON.parse(data); - throw new Error(obj.message || i18n.t('aiops.assistantts.sfeeaa489')); + throw new Error(obj.message || i18n.t('aiops.assistant.streamError')); } catch (parseErr) { if (parseErr instanceof Error && parseErr.message) throw parseErr; - throw new Error(i18n.t('aiops.assistantts.sfeeaa489')); + throw new Error(i18n.t('aiops.assistant.streamError')); } } if (eventType === 'done') { diff --git a/frontend/src/components/agent/AgentAlerts.tsx b/frontend/src/components/agent/AgentAlerts.tsx index 728fa0c..e107b1c 100644 --- a/frontend/src/components/agent/AgentAlerts.tsx +++ b/frontend/src/components/agent/AgentAlerts.tsx @@ -124,7 +124,7 @@ export function AgentAlerts() { - {i18n.t('kubernetes.eventspagetsx.s0e5b83cc')} + {i18n.t('kubernetes.eventsPage.alertEvents')} {i18n.t('monitor.alertRules')} @@ -185,11 +185,11 @@ export function AgentAlerts() { {alert.hostname || '--'} - {i18n.t('agent.agentalertstsx.sbfdcf242')} {getMetricLabel(alert.metric)} + {i18n.t('agent.agentAlerts.metric')} {getMetricLabel(alert.metric)} {alert.value != null && ( - {i18n.t('agent.agentalertstsx.s2d13763b')} {alert.value} + {i18n.t('agent.agentAlerts.currentValue')} {alert.value} )} diff --git a/frontend/src/components/agent/AgentMonitor.tsx b/frontend/src/components/agent/AgentMonitor.tsx index e6d843e..9ffe16e 100644 --- a/frontend/src/components/agent/AgentMonitor.tsx +++ b/frontend/src/components/agent/AgentMonitor.tsx @@ -142,8 +142,8 @@ export function AgentMonitor() { {/* 页头 */}
-

{t("agent.agentmonitortsx.s1a2b3c4d")}

-

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

+

{t("agent.agentMonitor.title")}

+

{i18n.t('agent.agentMonitor.subtitle')}

) : chartData.length === 0 ? ( -
{i18n.t('agent.hostdetaildialo.sdc73dbe9')}
+
{i18n.t('agent.hostDetailDialog.noHistoryData')}
) : ( @@ -161,7 +161,7 @@ export function HostDetailDialog({ 端口发现 ({ports.length}) {ports.length === 0 ? ( -

{i18n.t('agent.hostdetaildialo.se7887d60')}

+

{i18n.t('agent.hostDetailDialog.noPortData')}

) : (
{ports.map((p, idx) => ( diff --git a/frontend/src/components/aiops/AIAnalysisResult.tsx b/frontend/src/components/aiops/AIAnalysisResult.tsx index 2f74d40..50fc954 100644 --- a/frontend/src/components/aiops/AIAnalysisResult.tsx +++ b/frontend/src/components/aiops/AIAnalysisResult.tsx @@ -20,7 +20,7 @@ export function AIAnalysisResult({ selectedAlert, isAnalyzing, analysis, onAutoF - {i18n.t('aiops.aiAnalysisResult')} + {i18n.t('aiops.aiAnalysisResult.title')} @@ -28,13 +28,13 @@ export function AIAnalysisResult({ selectedAlert, isAnalyzing, analysis, onAutoF {!selectedAlert ? (
-

{i18n.t('aiops.aianalysisresul.s52bbd52d')}

+

{i18n.t('aiops.aiAnalysisResult.selectAlertHint')}

) : isAnalyzing ? (

{i18n.t('aiops.analyzingRootCause')}

-

{i18n.t('aiops.aianalysisresul.sf7d04a0f')}

+

{i18n.t('aiops.aiAnalysisResult.correlatingHint')}

) : analysis ? (
diff --git a/frontend/src/components/aiops/AgentCLIMessages.tsx b/frontend/src/components/aiops/AgentCLIMessages.tsx index 02cedd0..656ed6d 100644 --- a/frontend/src/components/aiops/AgentCLIMessages.tsx +++ b/frontend/src/components/aiops/AgentCLIMessages.tsx @@ -270,7 +270,7 @@ function ThoughtBlock({ {open ? : } {!hideRoundLabel && round != null && {i18n.t('aiops.roundThinking', { round })}} - {hideRoundLabel && {i18n.t('aiops.agentclimessage.s21d68b2d')} } + {hideRoundLabel && {i18n.t('aiops.agentCliMessage.thinking')} } {streaming && } {!open && preview} diff --git a/frontend/src/components/aiops/analyzerHelpers.ts b/frontend/src/components/aiops/analyzerHelpers.ts index 1f748c7..94477ba 100644 --- a/frontend/src/components/aiops/analyzerHelpers.ts +++ b/frontend/src/components/aiops/analyzerHelpers.ts @@ -53,7 +53,7 @@ export function generateAIAnalysis(alert: AlertItem): AIAnalysis { `考虑临时扩容或将部分流量调度到其他节点`, i18n.t('aiops.analysis.checkAbnormalTasks'), ], - autoFixScript: `#!/bin/bash\n# CPU 高负载诊断脚本 - ${target}\necho "${i18n.t('aiops.analysis.topCpuProcess')}"\nps aux --sort=-%cpu | head -11\necho ""\necho "${i18n.t('aiops.analyzerhelpers.sc4e238d7')}"\nuptime\necho ""\necho "${i18n.t('aiops.analyzerhelpers.sfaca56f5')}"\nPID=$(ps aux --sort=-%cpu | sed -n '2p' | awk '{print $2}')\nif [ -n "$PID" ]; then\n echo "${i18n.t('aiops.analyzerhelpers.s303a9855')}"\n cat /proc/$PID/cmdline | tr '\\0' ' '\n echo ""\nfi\n`, + autoFixScript: `#!/bin/bash\n# CPU 高负载诊断脚本 - ${target}\necho "${i18n.t('aiops.analysis.topCpuProcess')}"\nps aux --sort=-%cpu | head -11\necho ""\necho "${i18n.t('aiops.analyzerHelpers.systemLoad')}"\nuptime\necho ""\necho "${i18n.t('aiops.analyzerHelpers.highCpuProcessDetail')}"\nPID=$(ps aux --sort=-%cpu | sed -n '2p' | awk '{print $2}')\nif [ -n "$PID" ]; then\n echo "${i18n.t('aiops.analyzerHelpers.topCpuProcess')}"\n cat /proc/$PID/cmdline | tr '\\0' ' '\n echo ""\nfi\n`, similarCases: 0, confidence: 0, }; @@ -90,7 +90,7 @@ export function generateAIAnalysis(alert: AlertItem): AIAnalysis { i18n.t('aiops.analysis.checkAbnormalTasks'), i18n.t('aiops.analysis.checkAbnormalTasks'), ], - autoFixScript: `#!/bin/bash\n# 磁盘清理脚本 - ${target}\necho "${i18n.t('aiops.analyzerhelpers.s5b91c16b')}"\ndf -h /\necho ""\necho "${i18n.t('aiops.analyzerhelpers.s3b1993da')}"\nfind /var/log -name "*.log" -mtime +30 -delete 2>/dev/null\nfind /var/log -name "*.gz" -mtime +30 -delete 2>/dev/null\necho ""\necho "${i18n.t('aiops.analyzerhelpers.sb513e117')}"\njournalctl --vacuum-time=7d 2>/dev/null\necho ""\necho "${i18n.t('aiops.analyzerhelpers.s4c139c9f')}"\ndf -h /\n`, + autoFixScript: `#!/bin/bash\n# 磁盘清理脚本 - ${target}\necho "${i18n.t('aiops.analyzerHelpers.diskBeforeClean')}"\ndf -h /\necho ""\necho "${i18n.t('aiops.analyzerHelpers.cleanOldLogs')}"\nfind /var/log -name "*.log" -mtime +30 -delete 2>/dev/null\nfind /var/log -name "*.gz" -mtime +30 -delete 2>/dev/null\necho ""\necho "${i18n.t('aiops.analyzerHelpers.cleanSystemCache')}"\njournalctl --vacuum-time=7d 2>/dev/null\necho ""\necho "${i18n.t('aiops.analyzerHelpers.diskAfterClean')}"\ndf -h /\n`, similarCases: 0, confidence: 0, }; @@ -127,7 +127,7 @@ export function generateAIAnalysis(alert: AlertItem): AIAnalysis { i18n.t('aiops.analysis.checkAbnormalTasks'), i18n.t('aiops.analysis.checkAbnormalTasks'), ], - autoFixScript: `#!/bin/bash\n# 服务恢复脚本 - ${target}\necho "${i18n.t('aiops.analyzerhelpers.se59337b9')}"\nsystemctl list-units --state=failed\necho ""\necho "${i18n.t('aiops.analyzerhelpers.scdd631f0')}"\nss -tlnp | grep -E ':(80|443|8080|3306|6379|9090)'\necho ""\necho "${i18n.t('aiops.analyzerhelpers.sad3e7bba')}"\nsystemctl reset-failed\n`, + autoFixScript: `#!/bin/bash\n# 服务恢复脚本 - ${target}\necho "${i18n.t('aiops.analyzerHelpers.checkServiceStatus')}"\nsystemctl list-units --state=failed\necho ""\necho "${i18n.t('aiops.analyzerHelpers.checkPortListen')}"\nss -tlnp | grep -E ':(80|443|8080|3306|6379|9090)'\necho ""\necho "${i18n.t('aiops.analyzerHelpers.restartFailedService')}"\nsystemctl reset-failed\n`, similarCases: 0, confidence: 0, }; diff --git a/frontend/src/components/aiops/cost-predict.ts b/frontend/src/components/aiops/cost-predict.ts index 5151e55..21d8b80 100644 --- a/frontend/src/components/aiops/cost-predict.ts +++ b/frontend/src/components/aiops/cost-predict.ts @@ -98,9 +98,9 @@ export function costRecommendation(trend: 'up' | 'down' | 'stable', ratio: numbe function budgetRiskAction(metric: 'daily' | 'monthly', provider: string): string { const scope = provider && provider !== i18n.t('aiops.predictutilsts.sg5a3d8e1') ? `${provider} ` : ''; if (metric === 'daily') { - return i18n.t('aiops.predictutilsts.se4b7a5d2', { scope }); + return i18n.t('aiops.predictUtils.dailyCostHint', { scope }); } - return i18n.t('aiops.predictutilsts.sf2d8c6b4', { scope }); + return i18n.t('aiops.predictUtils.monthlyBillHint', { scope }); } interface MonthEndForecast { diff --git a/frontend/src/components/cloud/BillingRecordDialog.tsx b/frontend/src/components/cloud/BillingRecordDialog.tsx index 6e28640..f4f08d4 100644 --- a/frontend/src/components/cloud/BillingRecordDialog.tsx +++ b/frontend/src/components/cloud/BillingRecordDialog.tsx @@ -93,12 +93,12 @@ export function BillingRecordDialog({ open, onOpenChange, editingRecord, onSucce {editingRecord ? i18n.t('cloud.billingRecordDialog.editRecord') : i18n.t('cloud.recordCost')} - {i18n.t('cloud.billingrecorddi.s09e541fd')} + {i18n.t('cloud.billingRecordDialog.desc')}
- +
- + setForm({ ...form, billing_date: e.target.value })} />
- + setForm({ ...form, cost: e.target.value })} />
diff --git a/frontend/src/components/cloud/BillingRuleDialog.tsx b/frontend/src/components/cloud/BillingRuleDialog.tsx index b1fc462..92860f7 100644 --- a/frontend/src/components/cloud/BillingRuleDialog.tsx +++ b/frontend/src/components/cloud/BillingRuleDialog.tsx @@ -84,7 +84,7 @@ export function BillingRuleDialog({ open, onOpenChange, editingRule, onSuccess } {editingRule ? i18n.t('cloud.billingRuleDialog.editRule') : i18n.t('cloud.billingRuleDialog.addRule')} - {i18n.t('cloud.billingruledial.s75227f20')} + {i18n.t('cloud.billingRuleDialog.desc')}
@@ -97,7 +97,7 @@ export function BillingRuleDialog({ open, onOpenChange, editingRule, onSuccess } setForm({ ...form, operator: v })}> - {i18n.t('cloud.billingruledial.s3dba9756')} - {i18n.t('cloud.billingruledial.s8e1e26d1')} - {i18n.t('cloud.billingruledial.s0196c18c')} - {i18n.t('cloud.billingruledial.s45c301a8')} + {i18n.t('cloud.billingRuleDialog.gt')} + {i18n.t('cloud.billingRuleDialog.gte')} + {i18n.t('cloud.billingRuleDialog.lt')} + {i18n.t('cloud.billingRuleDialog.lte')}
- + setForm({ ...form, threshold: e.target.value })} />
diff --git a/frontend/src/components/cloud/PlatformManager.tsx b/frontend/src/components/cloud/PlatformManager.tsx index b10c103..c61686c 100644 --- a/frontend/src/components/cloud/PlatformManager.tsx +++ b/frontend/src/components/cloud/PlatformManager.tsx @@ -349,7 +349,7 @@ export function PlatformManager() { {i18n.t('k8s.actionModal.confirmDelete')} {i18n.t('aiops.llmModelDesc')} -

{i18n.t('cloud.platformmanager.s452abbb1')}

+

{i18n.t('cloud.platformManager.deleteConfirm')}

diff --git a/frontend/src/components/deploy/BuildNodesManager.tsx b/frontend/src/components/deploy/BuildNodesManager.tsx index 891026f..8050a53 100644 --- a/frontend/src/components/deploy/BuildNodesManager.tsx +++ b/frontend/src/components/deploy/BuildNodesManager.tsx @@ -202,13 +202,13 @@ export default function BuildNodesManager({ embedded = false }: { embedded?: boo
{i18n.t('deploy.buildNodes.masterBuiltin')} - {i18n.t('pipeline.buildnodesmanag.sa419fe03')} + {i18n.t('pipeline.buildNodesManage.defaultSchedule')} {i18n.t('deploy.buildNodes.executorUsage', { running: master.running_count, max: master.max_executors })}
- +
- + setMaxExecutors(e.target.value)} type="number" min={1} className="h-8 text-xs dg-input" />
- + setWorkspacePath(e.target.value)} className="h-8 text-xs font-mono dg-input" />
diff --git a/frontend/src/components/deploy/DeployRBAC.tsx b/frontend/src/components/deploy/DeployRBAC.tsx index 910c03a..78de572 100644 --- a/frontend/src/components/deploy/DeployRBAC.tsx +++ b/frontend/src/components/deploy/DeployRBAC.tsx @@ -219,7 +219,7 @@ export default function DeployRBAC() { icon={} title={i18n.t('deploy.rbac.policy.noPolicy')} description={i18n.t('deploy.rbac.policy.createHint')} - action={} + action={} /> ) : (
@@ -313,7 +313,7 @@ export default function DeployRBAC() {
{selectedUser ? ( assignments.length === 0 ? ( -

{i18n.t('pipeline.deployrbactsx.sef9548ee')}

+

{i18n.t('pipeline.deployRbac.noJobPermission')}

) : (
{assignments.map((a) => { @@ -334,7 +334,7 @@ export default function DeployRBAC() {
) ) : ( -

{i18n.t('monitor.logrbactsx.s9be00c95')}

+

{i18n.t('monitor.logRbac.selectUserHint')}

)} @@ -369,7 +369,7 @@ export default function DeployRBAC() { ))} {previewRoleId !== null && previewMatches.length === 0 && ( - {i18n.t('monitor.logrbactsx.s64096f4d')} + {i18n.t('monitor.logRbac.noMatchHint')} )}
diff --git a/frontend/src/components/deploy/pipeline-manager/DeployTargetFields.tsx b/frontend/src/components/deploy/pipeline-manager/DeployTargetFields.tsx index ebbf929..3f271a7 100644 --- a/frontend/src/components/deploy/pipeline-manager/DeployTargetFields.tsx +++ b/frontend/src/components/deploy/pipeline-manager/DeployTargetFields.tsx @@ -210,7 +210,7 @@ export function DeployTargetFields({ value, onChange, requireTarget = true }: De 加载中
) : filteredServers.length === 0 ? ( -

{i18n.t('pipeline.deploytargetfie.sb4240171')}

+

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

) : (
{filteredServers.map((srv) => { @@ -242,7 +242,7 @@ export function DeployTargetFields({ value, onChange, requireTarget = true }: De
)} -

{i18n.t('pipeline.deploytargetfie.sb2b6db98')}

+

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

diff --git a/frontend/src/components/kubernetes/DeploymentEditAdvanced.tsx b/frontend/src/components/kubernetes/DeploymentEditAdvanced.tsx index 554d9aa..499c246 100644 --- a/frontend/src/components/kubernetes/DeploymentEditAdvanced.tsx +++ b/frontend/src/components/kubernetes/DeploymentEditAdvanced.tsx @@ -170,7 +170,7 @@ export function DeploymentEditAdvanced({ clusterCode, namespace, deploymentName, }; const base = buildAdvancedManifest(rawManifest, state); await saveDeploymentManifest(clusterCode, namespace, deploymentName, base); - toast({ title: i18n.t('kubernetes.deploymentedita.s9762d0a4'), description: `${deploymentName} 更新已提交` }); + toast({ title: i18n.t('kubernetes.deploymentEditAdvanced.saved'), description: `${deploymentName} 更新已提交` }); onSaved(base); } catch (e) { toast({ title: i18n.t('kubernetes.msg.saveFailed'), description: e instanceof Error ? e.message : String(e), variant: 'destructive' }); diff --git a/frontend/src/components/kubernetes/DeploymentEditService.tsx b/frontend/src/components/kubernetes/DeploymentEditService.tsx index fb43972..f016fd1 100644 --- a/frontend/src/components/kubernetes/DeploymentEditService.tsx +++ b/frontend/src/components/kubernetes/DeploymentEditService.tsx @@ -256,7 +256,7 @@ export function DeploymentEditService({ clusterCode, namespace, deploymentName,
- {i18n.t('kubernetes.deploymentedits.sb8eef7f0')} + {i18n.t('kubernetes.deploymentEditService.selectorLabel')}
{Object.entries(selectorLabels).map(([k, v]) => ( {k}={v} @@ -289,7 +289,7 @@ export function DeploymentEditService({ clusterCode, namespace, deploymentName, 创建 Service
-

{i18n.t('kubernetes.deploymentedits.sd0ad85b8')}

+

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

{matchedSvcs.length === 0 && showCreate !== 'service' ? ( @@ -387,7 +387,7 @@ export function DeploymentEditService({ clusterCode, namespace, deploymentName, )}
- +
); diff --git a/frontend/src/components/kubernetes/DeploymentEditStorage.tsx b/frontend/src/components/kubernetes/DeploymentEditStorage.tsx index 35dae93..99f3b37 100644 --- a/frontend/src/components/kubernetes/DeploymentEditStorage.tsx +++ b/frontend/src/components/kubernetes/DeploymentEditStorage.tsx @@ -223,7 +223,7 @@ export function DeploymentEditStorage({ clusterCode, namespace, deploymentName,
- {i18n.t('kubernetes.deploymentedits.sa3119d33')} + {i18n.t('kubernetes.deploymentEditService.volumeName')} { @@ -322,7 +322,7 @@ export function DeploymentEditStorage({ clusterCode, namespace, deploymentName, )}
- {i18n.t('kubernetes.deploymentedits.sf4b25a22')} + {i18n.t('kubernetes.deploymentEditService.subPath')} updateMount(i, mi, { subPath: e.target.value })} diff --git a/frontend/src/components/kubernetes/DeploymentView.tsx b/frontend/src/components/kubernetes/DeploymentView.tsx index 5107dc7..55ba14e 100644 --- a/frontend/src/components/kubernetes/DeploymentView.tsx +++ b/frontend/src/components/kubernetes/DeploymentView.tsx @@ -195,7 +195,7 @@ export function DeploymentView(props: DeploymentViewProps) { {pods[0].node_name || pods[0].node || '-'} } /> - {pods[0].ip || pods[0].pod_ip || '-'}} /> + {pods[0].ip || pods[0].pod_ip || '-'}} /> )} diff --git a/frontend/src/components/kubernetes/DeploymentWorkload.tsx b/frontend/src/components/kubernetes/DeploymentWorkload.tsx index 61107e5..f029274 100644 --- a/frontend/src/components/kubernetes/DeploymentWorkload.tsx +++ b/frontend/src/components/kubernetes/DeploymentWorkload.tsx @@ -336,7 +336,7 @@ export function DeploymentWorkload({ clusterCode, namespace, deploymentName, mod {modeTabs} - +
{/* ============ 主体:view / edit / yaml ============ */} diff --git a/frontend/src/components/kubernetes/EventsPage.tsx b/frontend/src/components/kubernetes/EventsPage.tsx index b0d0ae8..849b2b0 100644 --- a/frontend/src/components/kubernetes/EventsPage.tsx +++ b/frontend/src/components/kubernetes/EventsPage.tsx @@ -162,7 +162,7 @@ export default function EventsPage() { const filterToolbar = (selectedReason || selectedKind) ? (
- {i18n.t('kubernetes.eventspagetsx.s841389c5')} + {i18n.t('kubernetes.eventsPage.filterLabel')} {selectedReason && (
- + setFormData({ ...formData, config_type: Number(v) })} diff --git a/frontend/src/components/kubernetes/NamespaceManagementPage.tsx b/frontend/src/components/kubernetes/NamespaceManagementPage.tsx index b6d818e..d9daaf4 100644 --- a/frontend/src/components/kubernetes/NamespaceManagementPage.tsx +++ b/frontend/src/components/kubernetes/NamespaceManagementPage.tsx @@ -182,7 +182,7 @@ export default function NamespaceManagementPage() { {i18n.t('kubernetes.secret.secretName')} {i18n.t('system.terminalStatus')} - {i18n.t('kubernetes.namespacemanage.sa01a9963')} + {i18n.t('kubernetes.namespaceManage.age')} Deploy Pods Svc diff --git a/frontend/src/components/kubernetes/NamespaceResourcePage.tsx b/frontend/src/components/kubernetes/NamespaceResourcePage.tsx index 3b4a2fc..a236279 100644 --- a/frontend/src/components/kubernetes/NamespaceResourcePage.tsx +++ b/frontend/src/components/kubernetes/NamespaceResourcePage.tsx @@ -172,7 +172,7 @@ export default function NamespaceResourcePage() { const searchToolbar = (
- setSearch(e.target.value)} className="pl-9 h-9 dg-input" /> + setSearch(e.target.value)} className="pl-9 h-9 dg-input" />
); diff --git a/frontend/src/components/kubernetes/PodDetailDialog.tsx b/frontend/src/components/kubernetes/PodDetailDialog.tsx index c59ae77..aed5940 100644 --- a/frontend/src/components/kubernetes/PodDetailDialog.tsx +++ b/frontend/src/components/kubernetes/PodDetailDialog.tsx @@ -95,7 +95,7 @@ export function PodDetailDialog({ pod, onClose }: PodDetailDialogProps) { {/* 现状详情(Conditions) */}
-

{i18n.t('kubernetes.namespaceresour.s1d8d6e2e')}

+

{i18n.t('kubernetes.namespaceResource.conditionsDetail')}

{cond.length === 0 ? (

{i18n.t('aiops.assistantNoData')}

) : ( diff --git a/frontend/src/components/kubernetes/PodFileBrowser.tsx b/frontend/src/components/kubernetes/PodFileBrowser.tsx index e744da9..a99ab5a 100644 --- a/frontend/src/components/kubernetes/PodFileBrowser.tsx +++ b/frontend/src/components/kubernetes/PodFileBrowser.tsx @@ -273,7 +273,7 @@ export function PodFileBrowser({
-                  {preview.content || i18n.t('kubernetes.podfilebrowsert.sf42649da')}
+                  {preview.content || i18n.t('kubernetes.podFileBrowser.emptyFile')}
                 
diff --git a/frontend/src/components/kubernetes/ResourceVisualEditor.tsx b/frontend/src/components/kubernetes/ResourceVisualEditor.tsx index b95cdbf..e4b971d 100644 --- a/frontend/src/components/kubernetes/ResourceVisualEditor.tsx +++ b/frontend/src/components/kubernetes/ResourceVisualEditor.tsx @@ -263,7 +263,7 @@ export function ResourceVisualEditor({ clusterCode, namespace, resource, name, o

{i18n.t('k8s.rve.hostPlaceholder')}

- +
)} @@ -271,7 +271,7 @@ export function ResourceVisualEditor({ clusterCode, namespace, resource, name, o ) : (

{i18n.t('k8s.rve.keyPlaceholder')}

- +
)}
diff --git a/frontend/src/components/kubernetes/WorkloadViewPage.tsx b/frontend/src/components/kubernetes/WorkloadViewPage.tsx index e1d6746..23149a3 100644 --- a/frontend/src/components/kubernetes/WorkloadViewPage.tsx +++ b/frontend/src/components/kubernetes/WorkloadViewPage.tsx @@ -175,7 +175,7 @@ export default function WorkloadViewPage() { {namespace} {isHealthy ? {i18n.t('k8s.clusters.statusHealthy')} - : {i18n.t('kubernetes.workloadviewpag.sf339d471')} } + : {i18n.t('kubernetes.workloadViewPage.updating')} }
{!loading && (mode === 'yaml' ? ( @@ -198,7 +198,7 @@ export default function WorkloadViewPage() {
{isSts ? ( <> - + @@ -277,7 +277,7 @@ export default function WorkloadViewPage() {
)} {containers.length === 0 ? ( -

{i18n.t('kubernetes.workloadviewpag.se4b61048')}

+

{i18n.t('kubernetes.workloadViewPage.noContainerData')}

) : (

Containers

diff --git a/frontend/src/components/kubernetes/deployment-bundle-yaml.ts b/frontend/src/components/kubernetes/deployment-bundle-yaml.ts index b93171e..d6265b8 100644 --- a/frontend/src/components/kubernetes/deployment-bundle-yaml.ts +++ b/frontend/src/components/kubernetes/deployment-bundle-yaml.ts @@ -81,7 +81,7 @@ export async function saveDeploymentBundleYaml( yamlText: string, ): Promise { const { manifests } = await parseEditableManifests(yamlText); - if (manifests.length === 0) throw new Error(i18n.t('kubernetes.deploymentbundl.s47161e05')); + if (manifests.length === 0) throw new Error(i18n.t('kubernetes.deploymentBundle.yamlEmpty')); for (const manifest of manifests) { const kind = String(manifest.kind || '').toLowerCase(); diff --git a/frontend/src/components/kubernetes/deployment-edit-advanced/TolerationsCard.tsx b/frontend/src/components/kubernetes/deployment-edit-advanced/TolerationsCard.tsx index 389de29..aebc522 100644 --- a/frontend/src/components/kubernetes/deployment-edit-advanced/TolerationsCard.tsx +++ b/frontend/src/components/kubernetes/deployment-edit-advanced/TolerationsCard.tsx @@ -19,7 +19,7 @@ export function TolerationsCard({ tolerations, onAdd, onRemove, onUpdate }: Tole
- {i18n.t('kubernetes.deploymentedita.s13a8310b')} + {i18n.t('kubernetes.deploymentEditAdvanced.tolerations')}
- {tolerations.length === 0 &&

{i18n.t('kubernetes.deploymentedita.s8bc06bde')}

} + {tolerations.length === 0 &&

{i18n.t('kubernetes.deploymentEditAdvanced.noTolerations')}

} {tolerations.map((t, i) => (
onUpdate(i, { key: e.target.value })} @@ -42,7 +42,7 @@ export function TolerationsCard({ tolerations, onAdd, onRemove, onUpdate }: Tole className="h-7 dg-input text-xs font-mono" /> setSearch(e.target.value)} - placeholder={i18n.t('monitor.esindexpickerts.s9ae0c004')} + placeholder={i18n.t('monitor.esIndexPicker.searchPlaceholder')} className="flex-1 bg-transparent text-xs outline-none font-mono" style={{ color: 'var(--dg-text-primary)' }} /> @@ -90,7 +90,7 @@ export function EsIndexPicker({ datasourceId, value, onChange }: Props) { ))} {!loading && filtered.length === 0 && ( -

{i18n.t('monitor.esindexpickerts.saf5cc132')}

+

{i18n.t('monitor.esIndexPicker.noMatch')}

)}
diff --git a/frontend/src/components/monitor/log-center/LogAlertsPanel.tsx b/frontend/src/components/monitor/log-center/LogAlertsPanel.tsx index e92e3e5..9a4e87e 100644 --- a/frontend/src/components/monitor/log-center/LogAlertsPanel.tsx +++ b/frontend/src/components/monitor/log-center/LogAlertsPanel.tsx @@ -58,7 +58,7 @@ export function LogAlertsPanel() { return (
-

{i18n.t('monitor.logalertspanelt.s5bc514d8')}

+

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

- {i18n.t('monitor.logquerytoolbar.s8b76adb2')} + {i18n.t('monitor.logQueryToolbar.goTo')} } title={i18n.t('monitor.logRbac.noPolicies')} description={i18n.t('monitor.logRbac.noPoliciesDesc')} - action={} + action={} /> ) : (
@@ -319,7 +319,7 @@ export default function LogRBAC() {
{selectedUser ? ( assignments.length === 0 ? ( -

{i18n.t('monitor.logrbactsx.sa120fc78')}

+

{i18n.t('monitor.logRbac.noPermissionAssigned')}

) : (
{assignments.map((a) => { @@ -340,7 +340,7 @@ export default function LogRBAC() {
) ) : ( -

{i18n.t('monitor.logrbactsx.s9be00c95')}

+

{i18n.t('monitor.logRbac.selectUserHint')}

)} @@ -373,7 +373,7 @@ export default function LogRBAC() { ))} {previewRoleId !== null && previewMatches.length === 0 && ( - {i18n.t('monitor.logrbactsx.s64096f4d')} + {i18n.t('monitor.logRbac.noMatchHint')} )}
diff --git a/frontend/src/components/monitor/log-center/LokiLabelBrowser.tsx b/frontend/src/components/monitor/log-center/LokiLabelBrowser.tsx index ff7cd30..b3f3391 100644 --- a/frontend/src/components/monitor/log-center/LokiLabelBrowser.tsx +++ b/frontend/src/components/monitor/log-center/LokiLabelBrowser.tsx @@ -98,7 +98,7 @@ export function LokiLabelBrowser({ datasourceId, query, timeRange, onQueryChange ))}
- {!activeLabel &&

{i18n.t('monitor.lokilabelbrowse.s088b9477')}

} + {!activeLabel &&

{i18n.t('monitor.lokiLabelBrowse.selectLabelHint')}

} {loadingValues &&
} {!loadingValues && activeLabel && values.map((v) => (
) : (
@@ -139,7 +139,7 @@ export function QueryHistoryPanel({ visible, onClose, onSelect, onCreateAlert }: onClick={() => onSelect(item)} className="h-6 w-6 flex items-center justify-center rounded transition-colors" style={{ background: 'var(--dg-bg-tertiary)', color: 'var(--dg-green)' }} - title={i18n.t('monitor.queryhistorypan.s4fb36a61')} + title={i18n.t('monitor.queryHistoryPan.runQuery')} > diff --git a/frontend/src/components/monitor/log-center/SavedQueriesPanel.tsx b/frontend/src/components/monitor/log-center/SavedQueriesPanel.tsx index 34aafb5..af47f43 100644 --- a/frontend/src/components/monitor/log-center/SavedQueriesPanel.tsx +++ b/frontend/src/components/monitor/log-center/SavedQueriesPanel.tsx @@ -43,7 +43,7 @@ export function SavedQueriesPanel({ visible, onClose, onSelect }: Props) {
{items.length === 0 ? ( -

{i18n.t('monitor.savedqueriespan.s9c8dc62b')}

+

{i18n.t('monitor.savedQueriesPan.emptySaved')}

) : items.map((item) => (
0 ? `,清理 ${s.total} 条` - : i18n.t("system.useauditsetting.s7d55bd57"); + : i18n.t("system.auditSetting.noExpiredRecords"); } } catch { // ignore diff --git a/frontend/src/components/task/CronJobManager.tsx b/frontend/src/components/task/CronJobManager.tsx index 1517e7e..7159816 100644 --- a/frontend/src/components/task/CronJobManager.tsx +++ b/frontend/src/components/task/CronJobManager.tsx @@ -56,11 +56,10 @@ export function CronJobManager() { const _confirm = useConfirm(); - // eslint-disable-next-line react-hooks/exhaustive-deps const pageTabs = useMemo(() => [ { id: 'user', label: t('task.cronJobStats.userJobs'), badge: jobs.length || undefined }, { id: 'system', label: t('automation.systemTask'), badge: systemTaskCount || undefined }, - ], [jobs.length, systemTaskCount]); + ], [jobs.length, systemTaskCount, t]); const openCreate = () => { setEditJob(null); diff --git a/frontend/src/locales/en-US.json b/frontend/src/locales/en-US.json index 19e437f..76c35ce 100644 --- a/frontend/src/locales/en-US.json +++ b/frontend/src/locales/en-US.json @@ -3709,7 +3709,10 @@ "title": "Monitoring", "subtitle": "Comprehensive Monitoring & Alerting", "resourceMonitor": "Resource Monitor", - "hostMonitor": "Host Monitor", + "hostMonitor": { + "loadingData": "Loading monitor data...", + "title": "Host Monitor" + }, "hostMetrics": "Host Metrics", "hostList": "Host List", "hostDetail": "Host Details", @@ -4110,64 +4113,6 @@ "toastPanelFailed": "Failed to add" } }, - "middlewaremonit.sbbe62a10": "No middleware monitoring targets", - "middlewaremonit.se5caf12b": "Add Platform Default", - "middlewaremonit.s63edd678": "Add Manually", - "middlewaremonit.s8ec8a6e8": "Add Now", - "sitemonitortsx.sb2da5804": "Alerting", - "sitemonitortsx.s62a0023a": "Probe task does not exist or has been deleted", - "sitemonitortsx.s30319e1c": "Probe Tasks", - "sitemonitortsx.sa5e6b654": "Click to view details", - "sitemonitortsx.s6173cf9a": "Configure probe tasks by protocol type, the system will automatically probe at intervals", - "snmpmonitortsx.s29b90990": "Add SNMP Device", - "snmpmonitortsx.s11ea7d0c": "Select vendor OID template, configure management IP and Community", - "snmpmonitortsx.s9f694f60": "Device Name", - "hostmonitortsx.sc23e802e": "Loading monitor data...", - "metricsexplorer.s3ec50388": "Metrics List", - "helpersts.sf972b7b1": "Last 1 hour", - "helpersts.s6e99b786": "Last 24 hours", - "helpersts.sd765efc4": "Last 7 days", - "helpersts.sd3fd8f1d": "DNS Resolution Latency & Results", - "portpolicydialo.s868e3dd0": "Port Monitoring Policy", - "portpolicydialo.scd27ad47": "Configure Agent port reporting filter rules", - "portpolicydialo.s7824bdd1": "Filter Mode", - "portpolicydialo.s2ff12d51": "Never report", - "mwoverviewchart.s07d3e014": "MySQL Connections", - "chartrangehintt.s39ce9bad": "Selected period:", - "snmpoverviewcha.s64f5a4da": "Device CPU Comparison", - "snmpoverviewcha.s1f441890": "No CPU metrics available, please complete collection first", - "snmpoverviewcha.sbb0ae97f": "Device Status", - "alertrulestabts.s65939ccd": "Trigger Condition", - "alertchanneldia.s976ad48f": "Notification Channel Configuration", - "alertchanneldia.s8c852a4c": "Not Tested", - "alertchanneldia.sbdab1c59": "Enable this channel", - "alertmanagertsx.s358b05d0": "Alert Trends", - "alertmanagertsx.s615fa6cb": "Past 24 hours alert statistics", - "logrbactsx.s6058845c": "New Permission", - "logrbactsx.sa120fc78": "This user has not been assigned log permissions", - "logrbactsx.s9be00c95": "Select a user to view assigned permissions", - "logrbactsx.s64096f4d": "No match — please adjust the regex", - "savedqueriespan.s9c8dc62b": "No saved queries", - "queryhistorypan.s1e60bc17": "No query history", - "queryhistorypan.s3895021f": "Queries will be automatically recorded after execution", - "queryhistorypan.s4fb36a61": "Execute Query", - "logdingassistan.s26b79b6b": "DingDang · Add Alert", - "logdingassistan.s1a663141": "DingDang", - "logclusterpanel.s38112792": "Auto-cluster based on log similarity", - "logclusterpanel.se909e426": "Sample logs:", - "lokilabelbrowse.s088b9477": "Select a label on the left", - "logquerytoolbar.s8b76adb2": "To page", - "logalertspanelt.s5bc514d8": "Only saves alert policies (LogQL / Lucene), log data remains in external Loki / ES", - "esindexpickerts.sa0eff8ea": "Select or search ES index", - "esindexpickerts.s9ae0c004": "Search index...", - "esindexpickerts.saf5cc132": "No matching index", - "zabbixdatasourc.s79e929d8": "Configure Zabbix API connection to get host monitoring data", - "zabbixdatasourc.sc9c9bd18": "No Zabbix data sources", - "zabbixdatasourc.s85260abd": "Direct DB Connection", - "zabbixdatasourc.s413ec771": "Read-only User Disable Confirmation", - "zabbixdatasourc.s6d4d6f81": "Disable Data Alignment", - "prometheusdashb.s5e8eb212": "Connecting…", - "zabbixdashboard.sdb131ab4": "No monitored Zabbix hosts found", "alertChannel": { "addBtn": "Add Channel", "addTitle": "Add Notification Channel", @@ -4248,7 +4193,8 @@ "loading": "Loading rules...", "deleteRule": "Delete Alert Rule", "deleteConfirm": "Delete this alert rule?", - "deleted": "Alert rule deleted" + "deleted": "Alert rule deleted", + "condition": "Trigger Condition" }, "contactDialog": { "addContactBtn": "Add Contact", @@ -4778,7 +4724,11 @@ "scopeCount": "{{count}} scopes", "userPolicyHint": "Users without any policy are not blocked (backward compatible); once assigned, only queries matching policies are allowed.", "assign": "Assign", - "all": "All" + "all": "All", + "newPermission": "New Permission", + "noMatchHint": "No match — please adjust the regex", + "selectUserHint": "Select a user to view assigned permissions", + "noPermissionAssigned": "This user has not been assigned log permissions" }, "lbl": { "unlimited": "Unlimited", @@ -4951,13 +4901,107 @@ }, "logQueryToolbar": { "exactMatch": "Exact match", - "partialMatch": "Partial match" + "partialMatch": "Partial match", + "goTo": "To page" }, "healthProbe": { "namePlaceholder": "e.g., cex-agent health check" }, "hostMonitorTypes": { "systemInfo": "System Info" + }, + "alertChannelDialog": { + "notTested": "Not Tested", + "title": "Notification Channel Configuration", + "enableChannel": "Enable this channel" + }, + "alertManager": { + "trendTitle": "Alert Trends", + "last24hStats": "Past 24 hours alert statistics" + }, + "chartRangeHint": { + "selectedRange": "Selected period:" + }, + "esIndexPicker": { + "searchPlaceholder": "Search index...", + "selectHint": "Select or search ES index", + "noMatch": "No matching index" + }, + "helpers": { + "last24h": "Last 24 hours", + "dnsHint": "DNS Resolution Latency & Results", + "last7d": "Last 7 days", + "last1h": "Last 1 hour" + }, + "logAlertSpanel": { + "desc": "Only saves alert policies (LogQL / Lucene), log data remains in external Loki / ES" + }, + "logClusterPanel": { + "desc": "Auto-cluster based on log similarity", + "sampleLog": "Sample logs:" + }, + "logDingAssistant": { + "ding": "DingDang", + "addAlert": "DingDang · Add Alert" + }, + "lokiLabelBrowse": { + "selectLabelHint": "Select a label on the left" + }, + "metricsExplorer": { + "metricList": "Metrics List" + }, + "middlewareMonit": { + "manualAdd": "Add Manually", + "addNow": "Add Now", + "emptyTargets": "No middleware monitoring targets", + "addPlatformDefault": "Add Platform Default" + }, + "mwOverviewChart": { + "mysqlConnections": "MySQL Connections" + }, + "portPolicyDialog": { + "neverReport": "Never report", + "filterMode": "Filter Mode", + "title": "Port Monitoring Policy", + "desc": "Configure Agent port reporting filter rules" + }, + "prometheusDashb": { + "connecting": "Connecting…" + }, + "queryHistoryPan": { + "emptyHistory": "No query history", + "autoRecordHint": "Queries will be automatically recorded after execution", + "runQuery": "Execute Query" + }, + "savedQueriesPan": { + "emptySaved": "No saved queries" + }, + "siteMonitor": { + "probeTaskTitle": "Probe Tasks", + "probeDesc": "Configure probe tasks by protocol type, the system will automatically probe at intervals", + "taskNotFound": "Probe task does not exist or has been deleted", + "clickToObserve": "Click to view details", + "alerting": "Alerting" + }, + "snmpMonitor": { + "addDeviceDesc": "Select vendor OID template, configure management IP and Community", + "addDeviceTitle": "Add SNMP Device", + "deviceName": "Device Name" + }, + "snmpOverviewChart": { + "noCpuMetrics": "No CPU metrics available, please complete collection first", + "cpuCompare": "Device CPU Comparison", + "deviceStatus": "Device Status" + }, + "zabbixDashboard": { + "noHostFound": "No monitored Zabbix hosts found" + }, + "zabbixDatasource": { + "readonlyConfirm": "Read-only User Disable Confirmation", + "disableAlign": "Disable Data Alignment", + "configDesc": "Configure Zabbix API connection to get host monitoring data", + "directDb": "Direct DB Connection", + "emptyDatasource": "No Zabbix data sources" } }, "task": { @@ -5910,48 +5954,78 @@ "loadFailed": "Failed to load", "notFound": "Resource not found" }, - "podmetricspaget.s58173b22": "All Namespaces", - "podexecterminal.sc8107726": "\\r\\n\\x1b[31m[ConnectionError occurred]\\x1b[0m\\r\\n", - "podlogsviewerts.s58b02a7a": "Last 100 lines", - "podlogsviewerts.s9a036801": "Last 500 lines", - "podlogsviewerts.sf89a330c": "Last 1000 lines", - "podlogsviewerts.sd9c71f71": "Live Tail", - "podlogsviewerts.sf3280b73": " (buffer full)", - "podlogsviewerts.sd7eb1e98": "Follow Bottom", - "podlogsviewerts.s130db316": "Follow Paused", - "deploymentedita.s9762d0a4": "Advanced settings saved", - "deploymentedita.s13a8310b": "Tolerations", - "deploymentedita.s8bc06bde": "No tolerations configured", - "deploymentedita.s2a6eb2dd": "Any", - "deploymentviewt.s6d2d954e": "Pod IP", - "deploymentedits.sb8eef7f0": "Selector:", - "deploymentedits.sd0ad85b8": "Only show Services with selector matching this Deployment", - "deploymentedits.s1c3cf7f5": "Related", - "deploymentedits.s83907cde": "Quick add common ports", - "deploymentedits.s5847b0f9": "Not detected", - "deploymentedits.s3a77522f": "Go Back", - "deploymentbundl.s47161e05": "YAML content is empty or parsing failed", - "eventspagetsx.s841389c5": "Filter:", - "eventspagetsx.s0e5b83cc": "Alert Events", - "eventspagetsx.s98c99f62": "All Time", - "eventspagetsx.sfb995166": "All Types", - "namespaceresour.s64e327ed": "Search...", - "namespaceresour.s1d8d6e2e": "Current Details", - "namespacemanage.sa01a9963": "Age", - "podfilebrowsert.sf42649da": "(Empty file)", - "resourcevisuale.s54c78d4f": "Switch to YAML Edit", - "deploymentedits.sa3119d33": "Volume Name", - "deploymentedits.sf4b25a22": "SubPath", - "kubernetesclust.sbf23eb8e": "Version (optional)", - "kubernetesclust.saaa159b7": "Connection Method", - "deploymentworkl.sf2e0208b": "Update Image", - "deploymentworkl.s8be2521d": "Updates Paused", - "workloadviewpag.sf339d471": "Updating", - "workloadviewpag.sea639697": "Replicas Ready", - "workloadviewpag.s23c944c1": "All Ready", - "workloadviewpag.sac100213": "Partially Not Ready", - "workloadviewpag.se4b61048": "No container data, please check YAML", - "workloadviewpag.s7f541ee2": "Scale StatefulSet" + "deploymentBundle": { + "yamlEmpty": "YAML content is empty or parsing failed" + }, + "deploymentEditAdvanced": { + "tolerations": "Tolerations", + "any": "Any", + "noTolerations": "No tolerations configured", + "saved": "Advanced settings saved" + }, + "deploymentEditService": { + "associated": "Related", + "backToView": "Go Back", + "notDetected": "Not detected", + "quickAddPorts": "Quick add common ports", + "volumeName": "Volume Name", + "selectorLabel": "Selector:", + "selectorHint": "Only show Services with selector matching this Deployment", + "subPath": "SubPath" + }, + "deploymentView": { + "podIp": "Pod IP" + }, + "deploymentWorkload": { + "paused": "Updates Paused", + "adjustImage": "Update Image" + }, + "eventsPage": { + "alertEvents": "Alert Events", + "filterLabel": "Filter:", + "allTime": "All Time", + "allTypes": "All Types" + }, + "kubernetesCluster": { + "accessMethod": "Connection Method", + "versionOptional": "Version (optional)" + }, + "namespaceManage": { + "age": "Age" + }, + "namespaceResource": { + "conditionsDetail": "Current Details", + "searchPlaceholder": "Search..." + }, + "podExecTerminal": { + "connectError": "\\r\\n\\x1b[31m[ConnectionError occurred]\\x1b[0m\\r\\n" + }, + "podFileBrowser": { + "emptyFile": "(Empty file)" + }, + "podLogsViewer": { + "followPaused": "Follow Paused", + "last100": "Last 100 lines", + "last500": "Last 500 lines", + "followBottom": "Follow Bottom", + "liveTail": "Live Tail", + "bufferFull": " (buffer full)", + "last1000": "Last 1000 lines" + }, + "podMetricsPage": { + "allNamespaces": "All Namespaces" + }, + "resourceVisualEditor": { + "switchToYaml": "Switch to YAML Edit" + }, + "workloadViewPage": { + "allReady": "All Ready", + "scaleStatefulSet": "Scale StatefulSet", + "partialReady": "Partially Not Ready", + "noContainerData": "No container data, please check YAML", + "replicasReady": "Replicas Ready", + "updating": "Updating" + } }, "pipeline": { "title": "Pipelines", @@ -6246,12 +6320,18 @@ "username": "Username", "usernamePlaceholder": "Enter username", "usernameRequired": "Username is required", - "deployrbactsx.sef9548ee": "This user has not been assigned Job permissions", - "buildnodesmanag.sa419fe03": "Default Schedule", - "buildnodesmanag.s8e408e28": "Max Concurrency", - "buildnodesmanag.sbcfcd088": "Workspace Path", - "deploytargetfie.sb4240171": "No available hosts", - "deploytargetfie.sb2b6db98": "After build, SCP upload jar/tar.gz to remote directory and execute deploy command" + "buildNodesManage": { + "maxConcurrency": "Max Concurrency", + "defaultSchedule": "Default Schedule", + "workspacePath": "Workspace Path" + }, + "deployRbac": { + "noJobPermission": "This user has not been assigned Job permissions" + }, + "deployTargetField": { + "scpDeployHint": "After build, SCP upload jar/tar.gz to remote directory and execute deploy command", + "noHostAvailable": "No available hosts" + } }, "automation": { "title": "Task Automation", @@ -6611,19 +6691,6 @@ "editDomainDesc": "Modify domain registration, DNS config and SSL certificate status", "addDomainDesc": "Enter domain info including registrar, DNS provider and expiry date", "daysLeft": "{{count}} days", - "platformmanager.s452abbb1": "Are you sure you want to delete this cloud platform? This action cannot be undone.", - "billingrecorddi.s09e541fd": "Record a daily cloud resource cost", - "billingrecorddi.sb11d8416": "Vendor *", - "billingrecorddi.s3abdefe2": "Date *", - "billingrecorddi.s6f252687": "Cost (CNY) *", - "billingruledial.s75227f20": "Set cost threshold, auto-alert when exceeded", - "billingruledial.sc356f198": "All Vendors", - "billingruledial.sd7650ece": "Compare", - "billingruledial.s3dba9756": "Greater Than >", - "billingruledial.s8e1e26d1": "Greater Than or Equal ≥", - "billingruledial.s0196c18c": "Less Than <", - "billingruledial.s45c301a8": "Less Than or Equal ≤", - "billingruledial.s11f9fb4c": "Threshold (CNY) *", "platform": { "publicCloud": "Public Cloud", "searchPlaceholder": "Search platform name or code...", @@ -6642,12 +6709,27 @@ "fillFields": "Please fill in rule name and threshold", "editRule": "Edit Alert Rule", "addRule": "Add Alert Rule", - "namePlaceholder": "e.g., Daily cost over ¥500 alert" + "namePlaceholder": "e.g., Daily cost over ¥500 alert", + "lt": "Less Than <", + "thresholdLabel": "Threshold (CNY) *", + "gt": "Greater Than >", + "lte": "Less Than or Equal ≤", + "desc": "Set cost threshold, auto-alert when exceeded", + "gte": "Greater Than or Equal ≥", + "allProviders": "All Vendors", + "compare": "Compare" }, "billingRecordDialog": { "fillFields": "Please fill in required fields", "editRecord": "Edit Cost Record", - "mainAccount": "Main Account" + "mainAccount": "Main Account", + "desc": "Record a daily cloud resource cost", + "dateLabel": "Date *", + "costLabel": "Cost (CNY) *", + "providerLabel": "Vendor *" + }, + "platformManager": { + "deleteConfirm": "Are you sure you want to delete this cloud platform? This action cannot be undone." } }, "agent": { @@ -6783,7 +6865,12 @@ "noAgentData": "No agent data", "agentCount": "{{count}} agents", "agentManage": "Agent Management", - "agentMonitor": "Agent Monitor", + "agentMonitor": { + "title": "Agent Monitor", + "refresh": "Refresh", + "deployAgent": "Deploy Agent", + "subtitle": "Real-time monitoring of Agent-reported host metrics" + }, "agentMetrics": "Agent Metrics", "agentConfig": "Agent Config", "agentLog": "Agent Log", @@ -6800,18 +6887,6 @@ "agentServiceRestart": "Restart", "agentServiceEnable": "Enable", "agentServiceDisable": "Disable", - "agentalertstsx.sbfdcf242": "Metric:", - "agentalertstsx.s2d13763b": "Current Value:", - "agentmonitortsx.sa75d7519": "Real-time monitoring of Agent-reported host metrics", - "hostdetaildialo.sffa4f720": "View host details and metric trends", - "hostdetaildialo.s3851af2c": "Last 1 hour", - "hostdetaildialo.s2d59b172": "Last 6 hours", - "hostdetaildialo.s768a1b34": "Last 24 hours", - "hostdetaildialo.sdc73dbe9": "No historical data", - "hostdetaildialo.se7887d60": "No port data", - "agentmonitortsx.s1a2b3c4d": "Agent Monitor", - "agentmonitortsx.s2b3c4d5e": "Refresh", - "agentmonitortsx.s3c4d5e6f": "Deploy Agent", "agentmonitortsx.s4d5e6f7g": "Deploy Now", "agentmonitortsx.s5e6f7g8h": "Online", "agentmonitortsx.s6f7g8h9i": "Offline", @@ -6897,7 +6972,19 @@ "monitor2": { "commandPlaceholder2": "e.g., free -m && df -h" }, - "portCount": "Port Count" + "portCount": "Port Count", + "agentAlerts": { + "currentValue": "Current Value:", + "metric": "Metric:" + }, + "hostDetailDialog": { + "last6h": "Last 6 hours", + "last1h": "Last 1 hour", + "last24h": "Last 24 hours", + "noHistoryData": "No historical data", + "noPortData": "No port data", + "desc": "View host details and metric trends" + } }, "system": { "title": "System", @@ -7308,9 +7395,6 @@ "authHeaderValue": "X-AIOps-Access-Key: ", "auditWebssh": "Audit live WebSSH sessions", "ldapClickRefresh": "Click \"Refresh\" to load LDAP users", - "useauditsetting.s32e8a76e": "Failed to load audit settings", - "useauditsetting.s51680af0": "Please select valid retention days", - "useauditsetting.s7d55bd57": ", no expired records", "useldapmanageme.ouExists": "OU \"{{name}}\" already exists, please use a different name", "useldapmanageme.createOuFailed": "Failed to create OU: ", "ldapMgmt": { @@ -7320,6 +7404,11 @@ "verifyFailed": "Verification failed", "selectUsers": "Please select at least one user", "importFailed": "Import failed: " + }, + "auditSetting": { + "loadFailed": "Failed to load audit settings", + "invalidRetentionDays": "Please select valid retention days", + "noExpiredRecords": ", no expired records" } }, "aiops": { @@ -7613,21 +7702,6 @@ "noModelContent": "(The model returned no content)", "selfEvolveDesc": "Four-layer memory learns asynchronously; historical experience is auto-injected for similar tasks — smarter with use.", "zhipuCodingHint": "Requires a separate coding plan via the Anthropic protocol; the key is not interchangeable with general GLM", - "aianalysisresul.s52bbd52d": "Select an alert on the left for AI analysis", - "aianalysisresul.sf7d04a0f": "Correlating logs, metrics and historical cases", - "analyzerhelpers.sc4e238d7": "===== System Load =====", - "analyzerhelpers.sfaca56f5": "===== High CPU Process Details =====", - "analyzerhelpers.s303a9855": "Highest CPU Process: PID=$PID", - "analyzerhelpers.s5b91c16b": "===== Disk Usage Before Cleanup =====", - "analyzerhelpers.s3b1993da": "===== Clean Logs Older Than 30 Days =====", - "analyzerhelpers.sb513e117": "===== Clean System Cache =====", - "analyzerhelpers.s4c139c9f": "===== Disk Usage After Cleanup =====", - "analyzerhelpers.se59337b9": "===== Check Service Status =====", - "analyzerhelpers.scdd631f0": "===== Check Port Listening =====", - "analyzerhelpers.sad3e7bba": "===== Restart Failed Services =====", - "agentclimessage.s21d68b2d": "Thinking", - "assistantts.s16f94bee": "Streaming response unavailable", - "assistantts.sfeeaa489": "LLM streaming response error", "history": "History", "examplePrefix": "Ex: ", "roundTokens": "Round {{round}} · {{tokens}}t", @@ -7666,7 +7740,11 @@ "durationM": "{{mins}}m", "confidencePercent": "Confidence {{n}}%", "noAnalysisYet": "Select an alert to view AI analysis", - "aiAnalysisResult": "AI Analysis Result", + "aiAnalysisResult": { + "selectAlertHint": "Select an alert on the left for AI analysis", + "correlatingHint": "Correlating logs, metrics and historical cases", + "title": "AI Analysis" + }, "analyzingRootCause": "AI is analyzing alert root cause...", "rootCauseAnalysis": "Root Cause Analysis", "impactScopeLabel": "Impact Scope", @@ -7712,8 +7790,6 @@ "daysToThreshold": "reaches threshold in {{days}} days", "forecastSummary": "- {{resource}}: Current {{current}}% → 7-day forecast {{predicted}}% (threshold {{threshold}}%), {{risk}}", "safetyBalancedExamples": "cat/grep/df auto · rm/reboot confirm", - "predictutilsts.se4b7a5d2": "Review {{scope}}today's high-cost services, pause non-essential resources or adjust auto-scaling", - "predictutilsts.sf2d8c6b4": "Review {{scope}}this month's bill composition, optimize storage/CDN/compute, reduce over-budget quotas", "predictutilsts.sg5a3d8e1": "All", "predictutilsts.sh7c2b9d6": "Other", "predictutilsts.providerAliyun": "Alibaba Cloud", @@ -8018,6 +8094,29 @@ "stop": "Stop", "execute": "Run" } + }, + "agentCliMessage": { + "thinking": "Thinking" + }, + "analyzerHelpers": { + "topCpuProcess": "Highest CPU Process: PID=$PID", + "cleanOldLogs": "===== Clean Logs Older Than 30 Days =====", + "diskAfterClean": "===== Disk Usage After Cleanup =====", + "diskBeforeClean": "===== Disk Usage Before Cleanup =====", + "restartFailedService": "===== Restart Failed Services =====", + "cleanSystemCache": "===== Clean System Cache =====", + "systemLoad": "===== System Load =====", + "checkPortListen": "===== Check Port Listening =====", + "checkServiceStatus": "===== Check Service Status =====", + "highCpuProcessDetail": "===== High CPU Process Details =====" + }, + "assistant": { + "streamUnavailable": "Streaming response unavailable", + "streamError": "LLM streaming response error" + }, + "predictUtils": { + "dailyCostHint": "Review {{scope}}today's high-cost services, pause non-essential resources or adjust auto-scaling", + "monthlyBillHint": "Review {{scope}}this month's bill composition, optimize storage/CDN/compute, reduce over-budget quotas" } }, "breadcrumb": { diff --git a/frontend/src/locales/zh-CN.json b/frontend/src/locales/zh-CN.json index 788a582..d2f4af8 100644 --- a/frontend/src/locales/zh-CN.json +++ b/frontend/src/locales/zh-CN.json @@ -3709,7 +3709,10 @@ "title": "监控中心", "subtitle": "全方位监控与告警", "resourceMonitor": "资源监控", - "hostMonitor": "主机监控", + "hostMonitor": { + "loadingData": "加载监控数据...", + "title": "主机监控" + }, "hostMetrics": "主机指标", "hostList": "主机列表", "hostDetail": "主机详情", @@ -4511,66 +4514,9 @@ "emptyDesc": "点击「添加规则」或「默认规则」创建", "deleteRule": "删除告警规则", "deleteConfirm": "确定删除此告警规则?", - "deleted": "告警规则已删除" + "deleted": "告警规则已删除", + "condition": "触发条件" }, - "middlewaremonit.sbbe62a10": "暂无中间件监控目标", - "middlewaremonit.se5caf12b": "添加平台默认", - "middlewaremonit.s63edd678": "手动添加", - "middlewaremonit.s8ec8a6e8": "立即添加", - "sitemonitortsx.sb2da5804": "告警中", - "sitemonitortsx.s62a0023a": "拨测任务不存在或已删除", - "sitemonitortsx.s30319e1c": "拨测任务", - "sitemonitortsx.sa5e6b654": "点击可观测进入详情页", - "sitemonitortsx.s6173cf9a": "按协议类型配置探活任务,系统将按间隔自动拨测", - "snmpmonitortsx.s29b90990": "添加 SNMP 设备", - "snmpmonitortsx.s11ea7d0c": "选择厂商 OID 模板,配置管理 IP 与 Community", - "snmpmonitortsx.s9f694f60": "设备名称", - "hostmonitortsx.sc23e802e": "加载监控数据...", - "metricsexplorer.s3ec50388": "指标列表", - "helpersts.sf972b7b1": "近 1 小时", - "helpersts.s6e99b786": "近 24 小时", - "helpersts.sd765efc4": "近 7 天", - "helpersts.sd3fd8f1d": "DNS 解析延迟与结果", - "portpolicydialo.s868e3dd0": "端口监控策略", - "portpolicydialo.scd27ad47": "配置 Agent 端口上报过滤规则", - "portpolicydialo.s7824bdd1": "过滤模式", - "portpolicydialo.s2ff12d51": "永远不上报", - "mwoverviewchart.s07d3e014": "MySQL 连接", - "chartrangehintt.s39ce9bad": "已选时段:", - "snmpoverviewcha.s64f5a4da": "设备 CPU 对比", - "snmpoverviewcha.s1f441890": "暂无 CPU 指标,请先完成采集", - "snmpoverviewcha.sbb0ae97f": "设备状态", - "alertrulestabts.s65939ccd": "触发条件", - "alertchanneldia.s976ad48f": "通知渠道配置", - "alertchanneldia.s8c852a4c": "未测试", - "alertchanneldia.sbdab1c59": "启用此渠道", - "alertmanagertsx.s358b05d0": "告警趋势", - "alertmanagertsx.s615fa6cb": "过去24小时告警统计", - "logrbactsx.s6058845c": "新建权限", - "logrbactsx.sa120fc78": "该用户尚未分配日志权限", - "logrbactsx.s9be00c95": "选择用户后查看已分配权限", - "logrbactsx.s64096f4d": "无匹配 — 请调整正则", - "savedqueriespan.s9c8dc62b": "暂无保存的查询", - "queryhistorypan.s1e60bc17": "暂无查询记录", - "queryhistorypan.s3895021f": "执行查询后将自动记录", - "queryhistorypan.s4fb36a61": "执行查询", - "logdingassistan.s26b79b6b": "叮当 · 添加告警", - "logdingassistan.s1a663141": "叮当", - "logclusterpanel.s38112792": "基于日志相似度自动聚类", - "logclusterpanel.se909e426": "样例日志:", - "lokilabelbrowse.s088b9477": "选择左侧标签", - "logquerytoolbar.s8b76adb2": "到第", - "logalertspanelt.s5bc514d8": "仅保存告警策略(LogQL / Lucene),日志数据仍在外部 Loki / ES", - "esindexpickerts.sa0eff8ea": "选择或搜索 ES 索引", - "esindexpickerts.s9ae0c004": "搜索索引...", - "esindexpickerts.saf5cc132": "无匹配索引", - "zabbixdatasourc.s79e929d8": "配置 Zabbix API 连接,获取主机监控数据", - "zabbixdatasourc.sc9c9bd18": "暂无 Zabbix 数据源", - "zabbixdatasourc.s85260abd": "直连DB", - "zabbixdatasourc.s413ec771": "只读用户禁用确认", - "zabbixdatasourc.s6d4d6f81": "禁用数据对齐", - "prometheusdashb.s5e8eb212": "连接中…", - "zabbixdashboard.sdb131ab4": "未找到被监控的 Zabbix 主机", "logDatasource": { "connectionSuccess": "连接成功", "connectionFailed": "连接失败", @@ -4778,7 +4724,11 @@ "scopeCount": "{{count}} 个范围", "userPolicyHint": "用户未分配任何策略时不拦截(向后兼容);分配后仅允许命中策略的查询。", "assign": "分配", - "all": "全部" + "all": "全部", + "newPermission": "新建权限", + "noMatchHint": "无匹配 — 请调整正则", + "selectUserHint": "选择用户后查看已分配权限", + "noPermissionAssigned": "该用户尚未分配日志权限" }, "lbl": { "unlimited": "无限制", @@ -4951,13 +4901,107 @@ }, "logQueryToolbar": { "exactMatch": "结果精确", - "partialMatch": "部分命中" + "partialMatch": "部分命中", + "goTo": "到第" }, "healthProbe": { "namePlaceholder": "如:cex-agent 健康检查" }, "hostMonitorTypes": { "systemInfo": "系统信息" + }, + "alertChannelDialog": { + "notTested": "未测试", + "title": "通知渠道配置", + "enableChannel": "启用此渠道" + }, + "alertManager": { + "trendTitle": "告警趋势", + "last24hStats": "过去24小时告警统计" + }, + "chartRangeHint": { + "selectedRange": "已选时段:" + }, + "esIndexPicker": { + "searchPlaceholder": "搜索索引...", + "selectHint": "选择或搜索 ES 索引", + "noMatch": "无匹配索引" + }, + "helpers": { + "last24h": "近 24 小时", + "dnsHint": "DNS 解析延迟与结果", + "last7d": "近 7 天", + "last1h": "近 1 小时" + }, + "logAlertSpanel": { + "desc": "仅保存告警策略(LogQL / Lucene),日志数据仍在外部 Loki / ES" + }, + "logClusterPanel": { + "desc": "基于日志相似度自动聚类", + "sampleLog": "样例日志:" + }, + "logDingAssistant": { + "ding": "叮当", + "addAlert": "叮当 · 添加告警" + }, + "lokiLabelBrowse": { + "selectLabelHint": "选择左侧标签" + }, + "metricsExplorer": { + "metricList": "指标列表" + }, + "middlewareMonit": { + "manualAdd": "手动添加", + "addNow": "立即添加", + "emptyTargets": "暂无中间件监控目标", + "addPlatformDefault": "添加平台默认" + }, + "mwOverviewChart": { + "mysqlConnections": "MySQL 连接" + }, + "portPolicyDialog": { + "neverReport": "永远不上报", + "filterMode": "过滤模式", + "title": "端口监控策略", + "desc": "配置 Agent 端口上报过滤规则" + }, + "prometheusDashb": { + "connecting": "连接中…" + }, + "queryHistoryPan": { + "emptyHistory": "暂无查询记录", + "autoRecordHint": "执行查询后将自动记录", + "runQuery": "执行查询" + }, + "savedQueriesPan": { + "emptySaved": "暂无保存的查询" + }, + "siteMonitor": { + "probeTaskTitle": "拨测任务", + "probeDesc": "按协议类型配置探活任务,系统将按间隔自动拨测", + "taskNotFound": "拨测任务不存在或已删除", + "clickToObserve": "点击可观测进入详情页", + "alerting": "告警中" + }, + "snmpMonitor": { + "addDeviceDesc": "选择厂商 OID 模板,配置管理 IP 与 Community", + "addDeviceTitle": "添加 SNMP 设备", + "deviceName": "设备名称" + }, + "snmpOverviewChart": { + "noCpuMetrics": "暂无 CPU 指标,请先完成采集", + "cpuCompare": "设备 CPU 对比", + "deviceStatus": "设备状态" + }, + "zabbixDashboard": { + "noHostFound": "未找到被监控的 Zabbix 主机" + }, + "zabbixDatasource": { + "readonlyConfirm": "只读用户禁用确认", + "disableAlign": "禁用数据对齐", + "configDesc": "配置 Zabbix API 连接,获取主机监控数据", + "directDb": "直连DB", + "emptyDatasource": "暂无 Zabbix 数据源" } }, "task": { @@ -5910,48 +5954,78 @@ "loadFailed": "加载失败", "notFound": "资源不存在" }, - "podmetricspaget.s58173b22": "所有命名空间", - "podexecterminal.sc8107726": "\\r\\n\\x1b[31m[连接发生错误]\\x1b[0m\\r\\n", - "podlogsviewerts.s58b02a7a": "最近 100 行", - "podlogsviewerts.s9a036801": "最近 500 行", - "podlogsviewerts.sf89a330c": "最近 1000 行", - "podlogsviewerts.sd9c71f71": "实时跟踪", - "podlogsviewerts.sf3280b73": " (缓冲已满)", - "podlogsviewerts.sd7eb1e98": "跟随底部", - "podlogsviewerts.s130db316": "已暂停跟随", - "deploymentedita.s9762d0a4": "高级设置已保存", - "deploymentedita.s13a8310b": "容忍 (Tolerations)", - "deploymentedita.s8bc06bde": "未配置容忍", - "deploymentedita.s2a6eb2dd": "任意", - "deploymentviewt.s6d2d954e": "容器组 IP", - "deploymentedits.sb8eef7f0": "选择器:", - "deploymentedits.sd0ad85b8": "仅显示 selector 匹配此 Deployment 的关联 Service", - "deploymentedits.s1c3cf7f5": "关联", - "deploymentedits.s83907cde": "快速添加常用端口", - "deploymentedits.s5847b0f9": "未检测到", - "deploymentedits.s3a77522f": "返回查看", - "deploymentbundl.s47161e05": "YAML 内容为空或解析失败", - "eventspagetsx.s841389c5": "筛选:", - "eventspagetsx.s0e5b83cc": "告警事件", - "eventspagetsx.s98c99f62": "全部时间", - "eventspagetsx.sfb995166": "所有类型", - "namespaceresour.s64e327ed": "搜索...", - "namespaceresour.s1d8d6e2e": "现状详情", - "namespacemanage.sa01a9963": "年龄", - "podfilebrowsert.sf42649da": "(空文件)", - "resourcevisuale.s54c78d4f": "切换到 YAML 编辑", - "deploymentedits.sa3119d33": "数据卷名称", - "deploymentedits.sf4b25a22": "子路径 subPath", - "kubernetesclust.sbf23eb8e": "版本(可选)", - "kubernetesclust.saaa159b7": "接入方式", - "deploymentworkl.sf2e0208b": "调整镜像", - "deploymentworkl.s8be2521d": "已暂停更新", - "workloadviewpag.sf339d471": "更新中", - "workloadviewpag.sea639697": "副本就绪", - "workloadviewpag.s23c944c1": "全部就绪", - "workloadviewpag.sac100213": "部分未就绪", - "workloadviewpag.se4b61048": "暂无容器数据,请查看 YAML", - "workloadviewpag.s7f541ee2": "伸缩 StatefulSet" + "deploymentBundle": { + "yamlEmpty": "YAML 内容为空或解析失败" + }, + "deploymentEditAdvanced": { + "tolerations": "容忍 (Tolerations)", + "any": "任意", + "noTolerations": "未配置容忍", + "saved": "高级设置已保存" + }, + "deploymentEditService": { + "associated": "关联", + "backToView": "返回查看", + "notDetected": "未检测到", + "quickAddPorts": "快速添加常用端口", + "volumeName": "数据卷名称", + "selectorLabel": "选择器:", + "selectorHint": "仅显示 selector 匹配此 Deployment 的关联 Service", + "subPath": "子路径 subPath" + }, + "deploymentView": { + "podIp": "容器组 IP" + }, + "deploymentWorkload": { + "paused": "已暂停更新", + "adjustImage": "调整镜像" + }, + "eventsPage": { + "alertEvents": "告警事件", + "filterLabel": "筛选:", + "allTime": "全部时间", + "allTypes": "所有类型" + }, + "kubernetesCluster": { + "accessMethod": "接入方式", + "versionOptional": "版本(可选)" + }, + "namespaceManage": { + "age": "年龄" + }, + "namespaceResource": { + "conditionsDetail": "现状详情", + "searchPlaceholder": "搜索..." + }, + "podExecTerminal": { + "connectError": "\\r\\n\\x1b[31m[连接发生错误]\\x1b[0m\\r\\n" + }, + "podFileBrowser": { + "emptyFile": "(空文件)" + }, + "podLogsViewer": { + "followPaused": "已暂停跟随", + "last100": "最近 100 行", + "last500": "最近 500 行", + "followBottom": "跟随底部", + "liveTail": "实时跟踪", + "bufferFull": " (缓冲已满)", + "last1000": "最近 1000 行" + }, + "podMetricsPage": { + "allNamespaces": "所有命名空间" + }, + "resourceVisualEditor": { + "switchToYaml": "切换到 YAML 编辑" + }, + "workloadViewPage": { + "allReady": "全部就绪", + "scaleStatefulSet": "伸缩 StatefulSet", + "partialReady": "部分未就绪", + "noContainerData": "暂无容器数据,请查看 YAML", + "replicasReady": "副本就绪", + "updating": "更新中" + } }, "pipeline": { "title": "流水线", @@ -6246,12 +6320,18 @@ "username": "用户名", "usernamePlaceholder": "输入用户名", "usernameRequired": "请输入用户名", - "deployrbactsx.sef9548ee": "该用户尚未分配 Job 权限", - "buildnodesmanag.sa419fe03": "默认调度", - "buildnodesmanag.s8e408e28": "最大并发", - "buildnodesmanag.sbcfcd088": "工作区路径", - "deploytargetfie.sb4240171": "暂无可用主机", - "deploytargetfie.sb2b6db98": "构建完成后 SCP 上传 jar/tar.gz 到远程目录并执行部署命令" + "buildNodesManage": { + "maxConcurrency": "最大并发", + "defaultSchedule": "默认调度", + "workspacePath": "工作区路径" + }, + "deployRbac": { + "noJobPermission": "该用户尚未分配 Job 权限" + }, + "deployTargetField": { + "scpDeployHint": "构建完成后 SCP 上传 jar/tar.gz 到远程目录并执行部署命令", + "noHostAvailable": "暂无可用主机" + } }, "automation": { "title": "作业任务", @@ -6611,19 +6691,6 @@ "editDomainDesc": "修改域名注册信息、DNS 配置和 SSL 证书状态", "addDomainDesc": "录入域名信息,包括注册商、DNS 服务商和到期时间", "daysLeft": "{{count}}天", - "platformmanager.s452abbb1": "确定删除此云平台?此操作不可撤销。", - "billingrecorddi.s09e541fd": "记录一条每日云资源成本", - "billingrecorddi.sb11d8416": "厂商 *", - "billingrecorddi.s3abdefe2": "日期 *", - "billingrecorddi.s6f252687": "费用(元) *", - "billingruledial.s75227f20": "设置成本阈值,超标时自动预警", - "billingruledial.sc356f198": "全部厂商", - "billingruledial.sd7650ece": "比较", - "billingruledial.s3dba9756": "大于 >", - "billingruledial.s8e1e26d1": "大于等于 ≥", - "billingruledial.s0196c18c": "小于 <", - "billingruledial.s45c301a8": "小于等于 ≤", - "billingruledial.s11f9fb4c": "阈值(元) *", "platform": { "publicCloud": "公有云", "searchPlaceholder": "搜索平台名称或编码...", @@ -6642,12 +6709,27 @@ "fillFields": "请填写规则名称和阈值", "editRule": "编辑预警规则", "addRule": "添加预警规则", - "namePlaceholder": "如:日成本超 500 元预警" + "namePlaceholder": "如:日成本超 500 元预警", + "lt": "小于 <", + "thresholdLabel": "阈值(元) *", + "gt": "大于 >", + "lte": "小于等于 ≤", + "desc": "设置成本阈值,超标时自动预警", + "gte": "大于等于 ≥", + "allProviders": "全部厂商", + "compare": "比较" }, "billingRecordDialog": { "fillFields": "请填写必填字段", "editRecord": "编辑成本记录", - "mainAccount": "主账号" + "mainAccount": "主账号", + "desc": "记录一条每日云资源成本", + "dateLabel": "日期 *", + "costLabel": "费用(元) *", + "providerLabel": "厂商 *" + }, + "platformManager": { + "deleteConfirm": "确定删除此云平台?此操作不可撤销。" } }, "agent": { @@ -6783,7 +6865,12 @@ "noAgentData": "暂无 Agent 上报数据", "agentCount": "{{count}} 个 Agent", "agentManage": "Agent 管理", - "agentMonitor": "Agent 监控", + "agentMonitor": { + "title": "Agent 监控", + "refresh": "刷新", + "deployAgent": "部署Agent", + "subtitle": "实时监控 Agent 上报的主机指标" + }, "agentMetrics": "Agent 指标", "agentConfig": "Agent 配置", "agentLog": "Agent 日志", @@ -6800,18 +6887,6 @@ "agentServiceRestart": "重启", "agentServiceEnable": "启用", "agentServiceDisable": "禁用", - "agentalertstsx.sbfdcf242": "指标:", - "agentalertstsx.s2d13763b": "当前值:", - "agentmonitortsx.sa75d7519": "实时监控 Agent 上报的主机指标", - "hostdetaildialo.sffa4f720": "查看主机详情和指标趋势", - "hostdetaildialo.s3851af2c": "最近 1 小时", - "hostdetaildialo.s2d59b172": "最近 6 小时", - "hostdetaildialo.s768a1b34": "最近 24 小时", - "hostdetaildialo.sdc73dbe9": "暂无历史数据", - "hostdetaildialo.se7887d60": "暂无端口数据", - "agentmonitortsx.s1a2b3c4d": "Agent 监控", - "agentmonitortsx.s2b3c4d5e": "刷新", - "agentmonitortsx.s3c4d5e6f": "部署Agent", "agentmonitortsx.s4d5e6f7g": "立即部署", "agentmonitortsx.s5e6f7g8h": "在线", "agentmonitortsx.s6f7g8h9i": "离线", @@ -6897,7 +6972,19 @@ "monitor2": { "commandPlaceholder2": "例如:free -m && df -h" }, - "portCount": "端口数" + "portCount": "端口数", + "agentAlerts": { + "currentValue": "当前值:", + "metric": "指标:" + }, + "hostDetailDialog": { + "last6h": "最近 6 小时", + "last1h": "最近 1 小时", + "last24h": "最近 24 小时", + "noHistoryData": "暂无历史数据", + "noPortData": "暂无端口数据", + "desc": "查看主机详情和指标趋势" + } }, "system": { "title": "系统管理", @@ -7308,9 +7395,6 @@ "authHeaderValue": "X-AIOps-Access-Key: <你的访问凭证>", "auditWebssh": "审计在线 WebSSH 会话", "ldapClickRefresh": "点击「刷新」加载 LDAP 用户", - "useauditsetting.s32e8a76e": "加载审计设置失败", - "useauditsetting.s51680af0": "请选择有效的保留天数", - "useauditsetting.s7d55bd57": ",无超期记录", "useldapmanageme.ouExists": "OU \"{{name}}\" 已存在,请使用其他名称", "useldapmanageme.createOuFailed": "创建 OU 失败:", "ldapMgmt": { @@ -7320,6 +7404,11 @@ "verifyFailed": "验证失败", "selectUsers": "请至少选择一个用户", "importFailed": "导入失败: " + }, + "auditSetting": { + "loadFailed": "加载审计设置失败", + "invalidRetentionDays": "请选择有效的保留天数", + "noExpiredRecords": ",无超期记录" } }, "aiops": { @@ -7613,21 +7702,6 @@ "noModelContent": "(模型未返回内容)", "selfEvolveDesc": "四层记忆异步学习,同类任务自动注入历史经验,越用越聪明。", "zhipuCodingHint": "需单独购买编码套餐,走 Anthropic 协议;Key 与通用 GLM 不互通", - "aianalysisresul.s52bbd52d": "选择左侧告警进行AI智能分析", - "aianalysisresul.sf7d04a0f": "正在关联日志、指标和历史案例", - "analyzerhelpers.sc4e238d7": "===== 系统负载 =====", - "analyzerhelpers.sfaca56f5": "===== 高 CPU 进程详情 =====", - "analyzerhelpers.s303a9855": "最高 CPU 进程: PID=$PID", - "analyzerhelpers.s5b91c16b": "===== 清理前磁盘使用 =====", - "analyzerhelpers.s3b1993da": "===== 清理 30 天前日志 =====", - "analyzerhelpers.sb513e117": "===== 清理系统缓存 =====", - "analyzerhelpers.s4c139c9f": "===== 清理后磁盘使用 =====", - "analyzerhelpers.se59337b9": "===== 检查服务状态 =====", - "analyzerhelpers.scdd631f0": "===== 检查端口监听 =====", - "analyzerhelpers.sad3e7bba": "===== 重启失败服务 =====", - "agentclimessage.s21d68b2d": "思考", - "assistantts.s16f94bee": "流式响应不可用", - "assistantts.sfeeaa489": "LLM 流式响应错误", "history": "历史", "examplePrefix": "例:", "roundTokens": "第 {{round}} 轮 · {{tokens}}t", @@ -7666,7 +7740,11 @@ "durationM": "{{mins}}分钟", "confidencePercent": "置信度 {{n}}%", "noAnalysisYet": "选择左侧告警查看 AI 分析", - "aiAnalysisResult": "AI 分析结果", + "aiAnalysisResult": { + "selectAlertHint": "选择左侧告警进行AI智能分析", + "correlatingHint": "正在关联日志、指标和历史案例", + "title": "AI 分析结果" + }, "analyzingRootCause": "AI正在分析告警根因...", "rootCauseAnalysis": "根因分析", "impactScopeLabel": "影响范围", @@ -7712,8 +7790,6 @@ "daysToThreshold": "{{days}} 天后触及阈值", "forecastSummary": "- {{resource}}:当前 {{current}}% → 7天后预测 {{predicted}}%(阈值 {{threshold}}%),{{risk}}", "safetyBalancedExamples": "cat/grep/df 自动 · rm/reboot 确认", - "predictutilsts.se4b7a5d2": "检查{{scope}}今日高消费服务,暂停非必要资源或调整弹性伸缩策略", - "predictutilsts.sf2d8c6b4": "复盘{{scope}}本月账单构成,优化存储/CDN/计算规格,必要时下调预算外资源配额", "predictutilsts.sg5a3d8e1": "全部", "predictutilsts.sh7c2b9d6": "其他", "predictutilsts.providerAliyun": "阿里云", @@ -8018,6 +8094,29 @@ "stop": "停止", "execute": "执行" } + }, + "agentCliMessage": { + "thinking": "思考" + }, + "analyzerHelpers": { + "topCpuProcess": "最高 CPU 进程: PID=$PID", + "cleanOldLogs": "===== 清理 30 天前日志 =====", + "diskAfterClean": "===== 清理后磁盘使用 =====", + "diskBeforeClean": "===== 清理前磁盘使用 =====", + "restartFailedService": "===== 重启失败服务 =====", + "cleanSystemCache": "===== 清理系统缓存 =====", + "systemLoad": "===== 系统负载 =====", + "checkPortListen": "===== 检查端口监听 =====", + "checkServiceStatus": "===== 检查服务状态 =====", + "highCpuProcessDetail": "===== 高 CPU 进程详情 =====" + }, + "assistant": { + "streamUnavailable": "流式响应不可用", + "streamError": "LLM 流式响应错误" + }, + "predictUtils": { + "dailyCostHint": "检查{{scope}}今日高消费服务,暂停非必要资源或调整弹性伸缩策略", + "monthlyBillHint": "复盘{{scope}}本月账单构成,优化存储/CDN/计算规格,必要时下调预算外资源配额" } }, "breadcrumb": { diff --git a/frontend/src/pages/monitor/HostMonitor.tsx b/frontend/src/pages/monitor/HostMonitor.tsx index 66c6e2b..6fe02a8 100644 --- a/frontend/src/pages/monitor/HostMonitor.tsx +++ b/frontend/src/pages/monitor/HostMonitor.tsx @@ -217,7 +217,7 @@ export function HostMonitor({ embedded = false }: { embedded?: boolean }) { } toolbar={toolbar} - loading={loading && !history.length} loadingLabel={t('monitor.hostmonitortsx.sc23e802e')} + loading={loading && !history.length} loadingLabel={t('monitor.hostMonitor.loadingData')} contentClassName="space-y-3"> {monitorBody} {dialogs} diff --git a/frontend/src/pages/monitor/MetricsExplorer.tsx b/frontend/src/pages/monitor/MetricsExplorer.tsx index 80b3ae1..611efbe 100644 --- a/frontend/src/pages/monitor/MetricsExplorer.tsx +++ b/frontend/src/pages/monitor/MetricsExplorer.tsx @@ -162,7 +162,7 @@ export function MetricsExplorer() {
-

{t('monitor.metricsexplorer.s3ec50388')}

+

{t('monitor.metricsExplorer.metricList')}

{selectedMetrics.length} 已选
diff --git a/frontend/src/pages/monitor/MiddlewareMonitor.tsx b/frontend/src/pages/monitor/MiddlewareMonitor.tsx index 9fb7281..5219f98 100644 --- a/frontend/src/pages/monitor/MiddlewareMonitor.tsx +++ b/frontend/src/pages/monitor/MiddlewareMonitor.tsx @@ -70,7 +70,7 @@ export function MiddlewareMonitor() { setLoading(false); setRefreshing(false); } - }, [syncSelection]); + }, [syncSelection, t]); useEffect(() => { loadTargets(); }, [loadTargets]); @@ -194,10 +194,10 @@ export function MiddlewareMonitor() { -

{t('monitor.middlewaremonit.sbbe62a10')}

+

{t('monitor.middlewareMonit.emptyTargets')}

- - + +
@@ -252,7 +252,7 @@ export function MiddlewareMonitor() { 暂无 {tab === 'redis' ? 'Redis' : 'MySQL'} 实例, - + ) : ( diff --git a/frontend/src/pages/monitor/SNMPMonitor.tsx b/frontend/src/pages/monitor/SNMPMonitor.tsx index 1b992ca..7439ebc 100644 --- a/frontend/src/pages/monitor/SNMPMonitor.tsx +++ b/frontend/src/pages/monitor/SNMPMonitor.tsx @@ -198,12 +198,12 @@ export function SNMPMonitor() { - {t('monitor.snmpmonitortsx.s29b90990')} - {t('monitor.snmpmonitortsx.s11ea7d0c')} + {t('monitor.snmpMonitor.addDeviceTitle')} + {t('monitor.snmpMonitor.addDeviceDesc')}
- + setForm({ ...form, name: e.target.value })} placeholder={t('monitor.lbl.demoSwitch')} />
diff --git a/frontend/src/pages/monitor/SiteMonitor.tsx b/frontend/src/pages/monitor/SiteMonitor.tsx index 08962d5..04192d6 100644 --- a/frontend/src/pages/monitor/SiteMonitor.tsx +++ b/frontend/src/pages/monitor/SiteMonitor.tsx @@ -45,7 +45,7 @@ const FILTER_TYPES: Array = ['ALL', ...PROBE_TYPE_OPTIONS]; function alertStatusBadge(status?: string) { if (status === 'alerting') { - return {i18n.t('monitor.sitemonitortsx.sb2da5804')} ; + return {i18n.t('monitor.siteMonitor.alerting')} ; } return {i18n.t('agent.heartbeatNormal')} ; } @@ -194,7 +194,7 @@ export function SiteMonitor() { if (!detailTask) { return (
-

{t('monitor.sitemonitortsx.s62a0023a')}

+

{t('monitor.siteMonitor.taskNotFound')}

); @@ -247,8 +247,8 @@ export function SiteMonitor() {
-

{t('monitor.sitemonitortsx.s30319e1c')}

- {t('monitor.sitemonitortsx.sa5e6b654')} +

{t('monitor.siteMonitor.probeTaskTitle')}

+ {t('monitor.siteMonitor.clickToObserve')}
{FILTER_TYPES.map((type) => { @@ -346,7 +346,7 @@ export function SiteMonitor() { {editingTaskId ? t('monitor.editProbe') : t('monitor.addProbe')} - {t('monitor.sitemonitortsx.s6173cf9a')} + {t('monitor.siteMonitor.probeDesc')}
diff --git a/frontend/src/pages/monitor/host-monitor/PortPolicyDialog.tsx b/frontend/src/pages/monitor/host-monitor/PortPolicyDialog.tsx index b5f7ec0..283a7c0 100644 --- a/frontend/src/pages/monitor/host-monitor/PortPolicyDialog.tsx +++ b/frontend/src/pages/monitor/host-monitor/PortPolicyDialog.tsx @@ -32,12 +32,12 @@ export function PortPolicyDialog({ - {t('monitor.portpolicydialo.s868e3dd0')} - {t('monitor.portpolicydialo.scd27ad47')} + {t('monitor.portPolicyDialog.title')} + {t('monitor.portPolicyDialog.desc')}
- +
diff --git a/frontend/src/pages/monitor/middleware-monitor/MwOverviewCharts.tsx b/frontend/src/pages/monitor/middleware-monitor/MwOverviewCharts.tsx index 25b91ea..d27a160 100644 --- a/frontend/src/pages/monitor/middleware-monitor/MwOverviewCharts.tsx +++ b/frontend/src/pages/monitor/middleware-monitor/MwOverviewCharts.tsx @@ -23,31 +23,31 @@ function shortName(name: string) { export function MwOverviewCharts({ targets }: Props) { const { t } = useTranslation(); const statusData = useMemo(() => { - const online = targets.filter((t) => t.status === 'online').length; + const online = targets.filter((tg) => tg.status === 'online').length; const offline = targets.length - online; return [ { name: t('agent.agentOnline'), value: online, fill: 'var(--dg-green)' }, { name: t('agent.agentOffline'), value: offline, fill: 'var(--dg-red)' }, ].filter((d) => d.value > 0); - }, [targets]); + }, [targets, t]); const redisHitData = useMemo(() => targets - .filter((t) => t.description === 'redis' && t.latest_metrics?.redis_hit_rate > 0) - .map((t) => ({ - name: shortName(t.name), fullName: t.name, - value: (t.latest_metrics.redis_hit_rate || 0) * 100, - fill: (t.latest_metrics.redis_hit_rate || 0) >= 0.9 ? 'var(--dg-green)' : 'var(--dg-yellow)', + .filter((tg) => tg.description === 'redis' && tg.latest_metrics?.redis_hit_rate > 0) + .map((tg) => ({ + name: shortName(tg.name), fullName: tg.name, + value: (tg.latest_metrics.redis_hit_rate || 0) * 100, + fill: (tg.latest_metrics.redis_hit_rate || 0) >= 0.9 ? 'var(--dg-green)' : 'var(--dg-yellow)', })) .sort((a, b) => a.value - b.value), [targets]); const redisQpsData = useMemo(() => targets - .filter((t) => t.description === 'redis' && t.latest_metrics?.redis_qps > 0) - .map((t) => ({ name: shortName(t.name), fullName: t.name, value: t.latest_metrics.redis_qps, fill: 'var(--dg-blue)' })) + .filter((tg) => tg.description === 'redis' && tg.latest_metrics?.redis_qps > 0) + .map((tg) => ({ name: shortName(tg.name), fullName: tg.name, value: tg.latest_metrics.redis_qps, fill: 'var(--dg-blue)' })) .sort((a, b) => b.value - a.value), [targets]); const mysqlConnData = useMemo(() => targets - .filter((t) => t.description === 'mysql' && t.latest_metrics?.mysql_connections > 0) - .map((t) => ({ name: shortName(t.name), fullName: t.name, value: t.latest_metrics.mysql_connections, fill: 'var(--dg-blue)' })) + .filter((tg) => tg.description === 'mysql' && tg.latest_metrics?.mysql_connections > 0) + .map((tg) => ({ name: shortName(tg.name), fullName: tg.name, value: tg.latest_metrics.mysql_connections, fill: 'var(--dg-blue)' })) .sort((a, b) => b.value - a.value), [targets]); if (targets.length === 0) return null; @@ -98,7 +98,7 @@ export function MwOverviewCharts({ targets }: Props) { )} - } empty={mysqlConnData.length === 0}> + } empty={mysqlConnData.length === 0}> {(h) => ( diff --git a/frontend/src/pages/monitor/middleware-monitor/MwTargetChartsPanel.tsx b/frontend/src/pages/monitor/middleware-monitor/MwTargetChartsPanel.tsx index b03ab98..78719c0 100644 --- a/frontend/src/pages/monitor/middleware-monitor/MwTargetChartsPanel.tsx +++ b/frontend/src/pages/monitor/middleware-monitor/MwTargetChartsPanel.tsx @@ -98,10 +98,10 @@ export function MwTargetChartsPanel({ target, chartDefs, accent }: Props) { diff --git a/frontend/src/pages/monitor/site-monitor/helpers.ts b/frontend/src/pages/monitor/site-monitor/helpers.ts index 2e6dac1..a6d8c5f 100644 --- a/frontend/src/pages/monitor/site-monitor/helpers.ts +++ b/frontend/src/pages/monitor/site-monitor/helpers.ts @@ -89,7 +89,7 @@ export const probeTypeMeta: Record d.value > 0); - }, [devices]); + }, [devices, t]); const cpuData = useMemo(() => { return overview @@ -49,10 +49,10 @@ export function SnmpOverviewCharts({ devices, overview }: Props) {
-

{t('monitor.snmpoverviewcha.s64f5a4da')}

+

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

{cpuData.length === 0 ? ( -

{t('monitor.snmpoverviewcha.s1f441890')}

+

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

) : ( @@ -100,7 +100,7 @@ export function SnmpOverviewCharts({ devices, overview }: Props) {
-

{t('monitor.snmpoverviewcha.sbb0ae97f')}

+

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