From bb2b50276a7c1c620145961e2847368e8000b2e9 Mon Sep 17 00:00:00 2001 From: attacker Date: Sat, 11 Jul 2026 08:08:07 +0800 Subject: [PATCH] =?UTF-8?q?refactor(i18n):=20U19=20i18n=20hash=20=E9=94=AE?= =?UTF-8?q?=E6=B2=BB=E7=90=86=20=E2=80=94=20=E5=88=A0=E9=99=A4=20866=20?= =?UTF-8?q?=E6=AD=BB=E9=94=AE=20+=20=E9=87=8D=E5=91=BD=E5=90=8D=2021=20?= =?UTF-8?q?=E9=AB=98=E9=A2=91=E9=94=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 死键清理: 从 zh-CN.json 和 en-US.json 移除 866 个重构遗弃的 unreferenced hash keys (filename.hash 格式)。这些键在组件迁移到语义化键后成为孤儿。 Live 键重命名 (21 个): ui.datatable.s1a2b3c4d → selectedCount ui.datatable.s2b3c4d5e → columns ui.datatable.s3c4d5e6f → totalCount aiops.predictive.s{1-3} → metricsTab/capacityTab/costTab aiops.predictivecost.s{1-3} → aiFailed/overview/aiInsight task.systemtaskspanel.s{1-3} → monitor/cleanup/finops aiops.agentcli.s{1-3} → archLayer/archDesc/securityLayer system.useldapmanageme.s{1-2} → ouExists/createOuFailed common.requestts.sd3ab821c → common.request.tokenExpired k8s.editAdvanced.s0c1fec65 → secondsPlaceholder k8s.{kubectl,podExec}.sc8107726 → connectErrorAnsi 影响: zh/en 7597→6731 keys 对齐, 文件 328KB→276KB (-16%) 仍有 172 个 live hash keys 待后续重命名 tsc -b=0, npm build✓ (17.45s), ESLint=0/66/0, go build=0, 17/17 测试通过 --- ROADMAP.md | 1 + frontend/src/api/aiops/assistant.ts | 2 +- .../aiops/AIPredictiveAnalytics.tsx | 6 +- .../components/aiops/PredictiveCostTab.tsx | 6 +- .../components/kubernetes/KubectlTerminal.tsx | 2 +- .../TolerationsCard.tsx | 2 +- .../components/system/useLdapManagement.ts | 2 +- .../src/components/task/SystemTasksPanel.tsx | 6 +- frontend/src/components/ui/data-table.tsx | 6 +- frontend/src/locales/en-US.json | 56 +++++++++---------- frontend/src/locales/zh-CN.json | 56 +++++++++---------- frontend/src/utils/request.ts | 2 +- 12 files changed, 74 insertions(+), 73 deletions(-) diff --git a/ROADMAP.md b/ROADMAP.md index c3f5b35..d8db8fd 100644 --- a/ROADMAP.md +++ b/ROADMAP.md @@ -512,6 +512,7 @@ services/api.ts (1324L) | Q37 | 前端巨型工具文件拆分(k8s-yaml-utils.ts 504L→451L + k8s-helpers.ts 67L 新文件,提取 7 个通用工具函数 parseScalar/STATUS_COLORS/statusColor/aggregateByImage/formatK8sTime/elapsedSeconds/formatDuration,barrel re-export 保持 8 个消费者零修改) | P0 | **done** | | Q38 | 前端巨型组件拆分(UnifiedQueryPanel 529L→353L (-33%),提取 unified-query/useLogQueryEngine.ts 295L 查询执行引擎 Hook + useLogExport.ts 62L 导出/复制 Hook,全项目最后一个 ≥500L 业务组件清零) | P0 | **done** | | U17 | K8s 残余组件 i18n 补全(NodeDetailPage 16 处硬编码中文清零 + 8 个 hash 键替换为语义化 k8s.nodeDetail.* 键 + DeploymentWorkload 12 处 toast/confirm 硬编码中文清零,zh/en 7564→7597 +33 键对齐) | P3 | **done** | +| U19 | i18n hash 键清理(删除 866 个死 hash 键 + 重命名 21 个高频 live hash 键为语义化键名,zh/en 7597→6731 keys 对齐,文件 328KB→276KB (-16%),tsc -b=0,npm build✓,ESLint=0/66/0,17/17 测试通过) | P3 | **done** | --- diff --git a/frontend/src/api/aiops/assistant.ts b/frontend/src/api/aiops/assistant.ts index 51f45ec..7ad9729 100644 --- a/frontend/src/api/aiops/assistant.ts +++ b/frontend/src/api/aiops/assistant.ts @@ -216,7 +216,7 @@ export const aiApi = { if (res.status === 401) { clearToken(); useUserStore.getState().logout(); - throw new Error(i18n.t('common.requestts.sd3ab821c')); + throw new Error(i18n.t('common.request.tokenExpired')); } if (!res.body) throw new Error(i18n.t('aiops.assistantts.s16f94bee')); const reader = res.body.getReader(); diff --git a/frontend/src/components/aiops/AIPredictiveAnalytics.tsx b/frontend/src/components/aiops/AIPredictiveAnalytics.tsx index 1ea7453..24bf4a6 100644 --- a/frontend/src/components/aiops/AIPredictiveAnalytics.tsx +++ b/frontend/src/components/aiops/AIPredictiveAnalytics.tsx @@ -120,9 +120,9 @@ export function AIPredictiveAnalytics() { }; const pageTabs = [ - { id: 'metrics', label: t('aiops.predictive.s1a2b3c4d') }, - { id: 'capacity', label: t('aiops.predictive.s2b3c4d5e') }, - { id: 'cost', label: t('aiops.predictive.s3c4d5e6f') }, + { id: 'metrics', label: t('aiops.predictive.metricsTab') }, + { id: 'capacity', label: t('aiops.predictive.capacityTab') }, + { id: 'cost', label: t('aiops.predictive.costTab') }, ]; return ( diff --git a/frontend/src/components/aiops/PredictiveCostTab.tsx b/frontend/src/components/aiops/PredictiveCostTab.tsx index 48c3a72..023f86e 100644 --- a/frontend/src/components/aiops/PredictiveCostTab.tsx +++ b/frontend/src/components/aiops/PredictiveCostTab.tsx @@ -60,7 +60,7 @@ export function PredictiveCostTab({ const res = await aiApi.chat([{ role: 'user', content: prompt }]); setInsight(res?.content || ''); } catch { - toast.error(t('aiops.predictivecost.s1a2b3c4d')); + toast.error(t('aiops.predictivecost.aiFailed')); } finally { setAnalyzing(false); } @@ -73,7 +73,7 @@ export function PredictiveCostTab({
- {t('aiops.predictivecost.s2b3c4d5e')} + {t('aiops.predictivecost.overview')} {!loading && hasData && ( )}
diff --git a/frontend/src/components/kubernetes/KubectlTerminal.tsx b/frontend/src/components/kubernetes/KubectlTerminal.tsx index 4332cdf..cebe571 100644 --- a/frontend/src/components/kubernetes/KubectlTerminal.tsx +++ b/frontend/src/components/kubernetes/KubectlTerminal.tsx @@ -109,7 +109,7 @@ export function KubectlTerminal({ open, onOpenChange, clusterId, clusterName }: ws.onerror = () => { setError(i18n.t('k8s.kubectl.failed')); setHasOutput(true); - term.write(i18n.t('k8s.kubectl.sc8107726')); + term.write(i18n.t('k8s.kubectl.connectError')); }; return () => { diff --git a/frontend/src/components/kubernetes/deployment-edit-advanced/TolerationsCard.tsx b/frontend/src/components/kubernetes/deployment-edit-advanced/TolerationsCard.tsx index 2a7b2df..389de29 100644 --- a/frontend/src/components/kubernetes/deployment-edit-advanced/TolerationsCard.tsx +++ b/frontend/src/components/kubernetes/deployment-edit-advanced/TolerationsCard.tsx @@ -47,7 +47,7 @@ export function TolerationsCard({ tolerations, onAdd, onRemove, onUpdate }: Tole - onUpdate(i, { tolerationSeconds: e.target.value })} className="h-7 dg-input text-xs font-mono" /> @@ -579,7 +579,7 @@ export function DataTable>(
- {i18n.t("ui.datatable.s3c4d5e6f", { count: sortedData.length })} + {i18n.t("ui.datatable.totalCount", { count: sortedData.length })} {selectable && (selectedIds?.length ?? 0) > 0 && ( diff --git a/frontend/src/locales/en-US.json b/frontend/src/locales/en-US.json index c5025ef..43cbd75 100644 --- a/frontend/src/locales/en-US.json +++ b/frontend/src/locales/en-US.json @@ -376,7 +376,6 @@ "remark": "Remark", "rename": "Rename", "report": "Report", - "requestts.sd3ab821c": "Session expired, please log in again", "required": "Required", "reset": "Reset", "restart": "Restart", @@ -511,7 +510,8 @@ "createFailed": "Create failed", "created": "Created", "severity": "Severity", - "critical": "Critical" + "critical": "Critical", + "request.tokenExpired": "Session expired, please log in again" }, "menu": { "dashboard": "Dashboard", @@ -2979,7 +2979,6 @@ "namespace": "所有命名空间" }, "editAdvanced": { - "s0c1fec65": "seconds", "noManifest": "Manifest data not loaded. Please use YAML editor to modify directly.", "updateStrategy": "Update Strategy", "rollingUpdate": "Rolling Update", @@ -3002,7 +3001,8 @@ "hostPIDDesc": "Share host PID namespace", "shareProcessDesc": "Share process namespace", "save": "Save", - "saved": "update submitted" + "saved": "update submitted", + "secondsPlaceholder": "seconds" }, "editBasic": { "synced": "Synced", @@ -3040,8 +3040,8 @@ "kubectl": { "disconnected": "\\r\\n\\x1b[31m[连接已断开]\\x1b[0m\\r\\n", "failed": "WebSocket 连接失败", - "sc8107726": "\\r\\n\\x1b[31m[连接发生错误]\\x1b[0m\\r\\n", - "cluster": "正在连接集群..." + "cluster": "正在连接集群...", + "connectErrorAnsi": "\\r\\n\\x1b[31m[连接发生错误]\\x1b[0m\\r\\n" }, "misc": { "cluster1": "加载集群列表失败:", @@ -3069,7 +3069,6 @@ "execError": "Execution error", "reconnect": "\\r\\n\\x1b[33m⚠ bash 不可用,请切换 /bin/sh 后重连。\\x1b[0m", "close": "\\r\\n\\x1b[33m[连接已关闭]\\x1b[0m\\r\\n", - "sc8107726": "\\r\\n\\x1b[31m[连接发生错误]\\x1b[0m\\r\\n", "connected": "Connected", "connecting": "Connecting", "connectionError": "Connection error", @@ -3082,7 +3081,8 @@ "fullscreen": "Fullscreen", "close1": "Close", "container1": "正在进入容器...", - "enterPod": "Enter Pod container to execute commands" + "enterPod": "Enter Pod container to execute commands", + "connectErrorAnsi": "\\r\\n\\x1b[31m[连接发生错误]\\x1b[0m\\r\\n" }, "podMetrics": { "resources2": "Pod 资源用量", @@ -4473,9 +4473,6 @@ "cronjobformdial.s2e10ee70": "Configure Cron Job", "cronjobformdial.s3b56b1f9": "Format: min hour day month weekday", "cronjobformdial.s15d864c1": "Execution Type", - "systemtaskspanel.s1a2b3c4d": "Monitor", - "systemtaskspanel.s2b3c4d5e": "Cleanup", - "systemtaskspanel.s3c4d5e6f": "Cost", "systemtaskspanel.s4d5e6f7g": "Built-in", "systemtaskspanel.s5e6f7g8h": "Process-level built-in scheduling, not editable; cleanup and cost tasks support manual trigger", "systemtaskspanel.s6f7g8h9i": "{{count}} tasks", @@ -4493,7 +4490,10 @@ "systemtaskspanel.s8r9s0t1u": "Execution completed", "systemtaskspanel.s9s0t1u2v": "Execution failed", "systemtaskspanel.s0t1u2v3w": "Failed to load system tasks", - "systemtaskspanel.s1u2v3w4x": "No system tasks" + "systemtaskspanel.s1u2v3w4x": "No system tasks", + "systemtaskspanel.monitor": "Monitor", + "systemtaskspanel.cleanup": "Cleanup", + "systemtaskspanel.finops": "Cost" }, "rbac": { "logRole": { @@ -4571,12 +4571,12 @@ "codeSnippet": { "copyDisabled": "Copy disabled" }, - "datatable.s1a2b3c4d": "{{count}} selected", - "datatable.s2b3c4d5e": "Cols", - "datatable.s3c4d5e6f": "{{count}} total", "datatable.s4d5e6f7g": "{{count}} selected", "datatable.s5e6f7g8h": "Yes", - "datatable.s6f7g8h9i": "No" + "datatable.s6f7g8h9i": "No", + "datatable.selectedCount": "{{count}} selected", + "datatable.columns": "Cols", + "datatable.totalCount": "{{count}} total" }, "kubernetes": { "cluster": { @@ -6608,8 +6608,8 @@ "useauditsetting.s32e8a76e": "Failed to load audit settings", "useauditsetting.s51680af0": "Please select valid retention days", "useauditsetting.s7d55bd57": ", no expired records", - "useldapmanageme.s1a2b3c4d": "OU \"{{name}}\" already exists, please use a different name", - "useldapmanageme.s2b3c4d5e": "Failed to create OU: " + "useldapmanageme.ouExists": "OU \"{{name}}\" already exists, please use a different name", + "useldapmanageme.createOuFailed": "Failed to create OU: " }, "aiops": { "title": "AIOps", @@ -7009,9 +7009,6 @@ "predictutilsts.providerTencent": "Tencent Cloud", "predictutilsts.providerHuawei": "Huawei Cloud", "predictutilsts.daysUntilThreshold": "Threshold in {{days}} days", - "agentcli.s1a2b3c4d": "LLM + Tool Layer", - "agentcli.s2b3c4d5e": "OpenAI-compatible LLM; tools include ssh_execute (remote execution) and analyze_output (output analysis).", - "agentcli.s3c4d5e6f": "Security + Prompt", "agentcli.s4d5e6f7g": "Five-level risk assessment + three-level safety mode; dangerous commands blocked, high-risk requires confirmation.", "agentcli.s5e6f7g8h": "ReAct Core Engine", "agentcli.s6f7g8h9i": "Think-Act-Observe loop (up to 16 rounds), retry on failure, loop detection to prevent infinite loops.", @@ -7078,9 +7075,6 @@ "agentcli.s7y8z9a0b": "Denied execution: {{name}}", "agentcli.s8z9a0b1c": "Please select a target host first", "agentcli.s4f5g6h7i": "Connection not ready, please try again later", - "predictivecost.s1a2b3c4d": "AI analysis failed, check LLM configuration or try again later", - "predictivecost.s2b3c4d5e": "Cloud Cost Prediction Overview", - "predictivecost.s3c4d5e6f": "AI Deep Analysis", "predictivecost.s4d5e6f7g": "Loading billing data...", "predictivecost.s5e6f7g8h": "No billing data, add cost records in Cloud Billing Management first", "predictivecost.s6f7g8h9i": "Bills front-loaded at month start, recent 7-day avg {{avg}}; may contain pre-paid or retired resources; prediction uses recent run rate.", @@ -7104,9 +7098,6 @@ "predictivecost.s4x5y6z7a": "Monthly budget", "predictivecost.s5y6z7a8b": "Current {{current}} / Threshold {{threshold}}, Predicted {{predicted}}", "predictivecost.s6z7a8b9c": "Breach probability", - "predictive.s1a2b3c4d": "Metric Forecast", - "predictive.s2b3c4d5e": "Capacity Planning", - "predictive.s3c4d5e6f": "Cost Forecast", "predictive.s4d5e6f7g": "Predictive Analysis", "predictive.s5e6f7g8h": "Linear regression prediction, capacity planning and cost forecasting based on real-time metrics and cloud billing", "predictive.s6f7g8h9i": "Confidence", @@ -7142,7 +7133,16 @@ "predictutilsts.su1v2w3x4": "1. Use **bold subtitles** for sections with 1 key point each, e.g.: **Data Anomalies**, **Idle Resource Cleanup**, **Billing Mode Optimization**, **Storage Lifecycle**", "predictutilsts.sv2w3x4y5": "2. If monthly avg and recent 7-day avg clearly contradict predicted month-end, explain in 'Data Anomalies' (pre-paid/shutdown etc.)", "predictutilsts.sw3x4y5z6": "3. Give actionable recommendations per top service (EIP/disk/ECS spec/OSS lifecycle/reserved instances etc.)", - "predictutilsts.sx4y5z6a7": "4. Pick 3-5 most relevant recommendations, under 350 words, no generic platitudes" + "predictutilsts.sx4y5z6a7": "4. Pick 3-5 most relevant recommendations, under 350 words, no generic platitudes", + "predictive.metricsTab": "Metric Forecast", + "predictive.capacityTab": "Capacity Planning", + "predictive.costTab": "Cost Forecast", + "predictivecost.aiFailed": "AI analysis failed, check LLM configuration or try again later", + "predictivecost.overview": "Cloud Cost Prediction Overview", + "predictivecost.aiInsight": "AI Deep Analysis", + "agentcli.archLayer": "LLM + Tool Layer", + "agentcli.archDesc": "OpenAI-compatible LLM; tools include ssh_execute (remote execution) and analyze_output (output analysis).", + "agentcli.securityLayer": "Security + Prompt" }, "breadcrumb": { "dashboard": "Dashboard", diff --git a/frontend/src/locales/zh-CN.json b/frontend/src/locales/zh-CN.json index e055423..db0bc67 100644 --- a/frontend/src/locales/zh-CN.json +++ b/frontend/src/locales/zh-CN.json @@ -376,7 +376,6 @@ "remark": "备注", "rename": "重命名", "report": "报告", - "requestts.sd3ab821c": "登录已过期,请重新登录", "required": "必填", "reset": "重置", "restart": "重启", @@ -511,7 +510,8 @@ "createFailed": "创建失败", "created": "已创建", "severity": "级别", - "critical": "严重" + "critical": "严重", + "request.tokenExpired": "登录已过期,请重新登录" }, "menu": { "dashboard": "仪表盘", @@ -2979,7 +2979,6 @@ "namespace": "所有命名空间" }, "editAdvanced": { - "s0c1fec65": "秒", "noManifest": "未获取到 manifest 数据,请使用 YAML 编辑模式直接修改。", "updateStrategy": "更新策略 (Strategy)", "rollingUpdate": "滚动更新", @@ -3002,7 +3001,8 @@ "hostPIDDesc": "共享主机 PID 命名空间", "shareProcessDesc": "共享进程命名空间", "save": "保存", - "saved": "更新已提交" + "saved": "更新已提交", + "secondsPlaceholder": "秒" }, "editBasic": { "synced": "已同步", @@ -3040,8 +3040,8 @@ "kubectl": { "disconnected": "\\r\\n\\x1b[31m[连接已断开]\\x1b[0m\\r\\n", "failed": "WebSocket 连接失败", - "sc8107726": "\\r\\n\\x1b[31m[连接发生错误]\\x1b[0m\\r\\n", - "cluster": "正在连接集群..." + "cluster": "正在连接集群...", + "connectErrorAnsi": "\\r\\n\\x1b[31m[连接发生错误]\\x1b[0m\\r\\n" }, "misc": { "cluster1": "加载集群列表失败:", @@ -3069,7 +3069,6 @@ "execError": "执行错误", "reconnect": "\\r\\n\\x1b[33m⚠ bash 不可用,请切换 /bin/sh 后重连。\\x1b[0m", "close": "\\r\\n\\x1b[33m[连接已关闭]\\x1b[0m\\r\\n", - "sc8107726": "\\r\\n\\x1b[31m[连接发生错误]\\x1b[0m\\r\\n", "connected": "已连接", "connecting": "正在连接", "connectionError": "连接错误", @@ -3082,7 +3081,8 @@ "fullscreen": "全屏", "close1": "关闭", "container1": "正在进入容器...", - "enterPod": "进入 Pod 容器执行命令" + "enterPod": "进入 Pod 容器执行命令", + "connectErrorAnsi": "\\r\\n\\x1b[31m[连接发生错误]\\x1b[0m\\r\\n" }, "podMetrics": { "resources2": "Pod 资源用量", @@ -4473,9 +4473,6 @@ "cronjobformdial.s2e10ee70": "配置 Cron 定时任务", "cronjobformdial.s3b56b1f9": "格式: 分 时 日 月 周", "cronjobformdial.s15d864c1": "执行类型", - "systemtaskspanel.s1a2b3c4d": "监控", - "systemtaskspanel.s2b3c4d5e": "清理", - "systemtaskspanel.s3c4d5e6f": "成本", "systemtaskspanel.s4d5e6f7g": "内置", "systemtaskspanel.s5e6f7g8h": "进程内置调度,不可编辑;清理与成本类任务支持手动触发", "systemtaskspanel.s6f7g8h9i": "{{count}} 个任务", @@ -4493,7 +4490,10 @@ "systemtaskspanel.s8r9s0t1u": "执行完成", "systemtaskspanel.s9s0t1u2v": "执行失败", "systemtaskspanel.s0t1u2v3w": "加载系统任务失败", - "systemtaskspanel.s1u2v3w4x": "暂无系统任务" + "systemtaskspanel.s1u2v3w4x": "暂无系统任务", + "systemtaskspanel.monitor": "监控", + "systemtaskspanel.cleanup": "清理", + "systemtaskspanel.finops": "成本" }, "rbac": { "logRole": { @@ -4571,12 +4571,12 @@ "codeSnippet": { "copyDisabled": "不可复制" }, - "datatable.s1a2b3c4d": "已选 {{count}} 项", - "datatable.s2b3c4d5e": "列", - "datatable.s3c4d5e6f": "共 {{count}} 条", "datatable.s4d5e6f7g": "已选 {{count}}", "datatable.s5e6f7g8h": "是", - "datatable.s6f7g8h9i": "否" + "datatable.s6f7g8h9i": "否", + "datatable.selectedCount": "已选 {{count}} 项", + "datatable.columns": "列", + "datatable.totalCount": "共 {{count}} 条" }, "kubernetes": { "cluster": { @@ -6608,8 +6608,8 @@ "useauditsetting.s32e8a76e": "加载审计设置失败", "useauditsetting.s51680af0": "请选择有效的保留天数", "useauditsetting.s7d55bd57": ",无超期记录", - "useldapmanageme.s1a2b3c4d": "OU \"{{name}}\" 已存在,请使用其他名称", - "useldapmanageme.s2b3c4d5e": "创建 OU 失败:" + "useldapmanageme.ouExists": "OU \"{{name}}\" 已存在,请使用其他名称", + "useldapmanageme.createOuFailed": "创建 OU 失败:" }, "aiops": { "title": "AIOps 智能", @@ -7009,9 +7009,6 @@ "predictutilsts.providerTencent": "腾讯云", "predictutilsts.providerHuawei": "华为云", "predictutilsts.daysUntilThreshold": "{{days}} 天后触及阈值", - "agentcli.s1a2b3c4d": "LLM + 工具层", - "agentcli.s2b3c4d5e": "OpenAI 兼容 LLM;工具含 ssh_execute(远程执行)与 analyze_output(输出分析)。", - "agentcli.s3c4d5e6f": "安全 + Prompt", "agentcli.s4d5e6f7g": "五级风险评估 + 三级安全模式;危险命令硬性拒绝,高危命令弹框确认。", "agentcli.s5e6f7g8h": "ReAct 核心引擎", "agentcli.s6f7g8h9i": "思考→行动→观察循环(最多 16 轮),失败换法重试,循环检测防死循环。", @@ -7078,9 +7075,6 @@ "agentcli.s7y8z9a0b": "已拒绝执行:{{name}}", "agentcli.s8z9a0b1c": "请先选择目标主机", "agentcli.s4f5g6h7i": "连接未就绪,请稍后重试", - "predictivecost.s1a2b3c4d": "AI 解读失败,请检查大模型配置或稍后重试", - "predictivecost.s2b3c4d5e": "云成本预测总览", - "predictivecost.s3c4d5e6f": "AI 深度解读", "predictivecost.s4d5e6f7g": "加载账单数据...", "predictivecost.s5e6f7g8h": "暂无账单数据,请先在云账单管理中录入费用记录", "predictivecost.s6f7g8h9i": "账单呈月初集中、近7日日均 {{avg}},可能含预付费或资源已停用;预测已按近期运行费率外推。", @@ -7104,9 +7098,6 @@ "predictivecost.s4x5y6z7a": "月预算", "predictivecost.s5y6z7a8b": "当前 {{current}} / 阈值 {{threshold}},预测 {{predicted}}", "predictivecost.s6z7a8b9c": "触线概率", - "predictive.s1a2b3c4d": "指标预测", - "predictive.s2b3c4d5e": "容量规划", - "predictive.s3c4d5e6f": "成本预测", "predictive.s4d5e6f7g": "预测分析", "predictive.s5e6f7g8h": "基于实时指标与云账单的线性回归预测、容量规划与成本前瞻", "predictive.s6f7g8h9i": "置信度", @@ -7142,7 +7133,16 @@ "predictutilsts.su1v2w3x4": "1. 用 **加粗小标题** 分段,每段下 1 条要点,例如:**数据疑点**、**闲置资源清理**、**计费模式优化**、**存储生命周期**", "predictutilsts.sv2w3x4y5": "2. 若全月日均与近7日日均、预测月末存在明显矛盾,必须在「数据疑点」中说明原因(预付费/资源停机等)", "predictutilsts.sw3x4y5z6": "3. 结合 Top 服务给出可落地建议(EIP/云盘/ECS规格/OSS生命周期/预留实例等)", - "predictutilsts.sx4y5z6a7": "4. 选 3~5 条最相关建议,总字数 350 字以内,不要空泛套话" + "predictutilsts.sx4y5z6a7": "4. 选 3~5 条最相关建议,总字数 350 字以内,不要空泛套话", + "predictive.metricsTab": "指标预测", + "predictive.capacityTab": "容量规划", + "predictive.costTab": "成本预测", + "predictivecost.aiFailed": "AI 解读失败,请检查大模型配置或稍后重试", + "predictivecost.overview": "云成本预测总览", + "predictivecost.aiInsight": "AI 深度解读", + "agentcli.archLayer": "LLM + 工具层", + "agentcli.archDesc": "OpenAI 兼容 LLM;工具含 ssh_execute(远程执行)与 analyze_output(输出分析)。", + "agentcli.securityLayer": "安全 + Prompt" }, "breadcrumb": { "dashboard": "仪表盘", diff --git a/frontend/src/utils/request.ts b/frontend/src/utils/request.ts index 62ced36..89eaa60 100644 --- a/frontend/src/utils/request.ts +++ b/frontend/src/utils/request.ts @@ -101,7 +101,7 @@ async function request( clearToken(); useUserStore.getState().logout(); window.location.href = '/login'; - throw new Error(i18n.t('common.requestts.sd3ab821c')); + throw new Error(i18n.t('common.request.tokenExpired')); } let json: ApiResponse;