refactor(i18n): U19 i18n hash 键治理 — 删除 866 死键 + 重命名 21 高频键

死键清理: 从 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 测试通过
This commit is contained in:
attacker committed 2026-07-11 08:08:07 +08:00
1 parent 543365596d
commit bb2b50276a
12 files changed
+74 -73

No files matched your search

+1 -1
View File
@@ -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();
@@ -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 (
@@ -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({
<div className="flex items-center justify-between">
<CardTitle className="text-[var(--dg-text-primary)] flex items-center gap-2">
<Wallet className="h-5 w-5 dg-text-emerald" />
{t('aiops.predictivecost.s2b3c4d5e')}
{t('aiops.predictivecost.overview')}
</CardTitle>
{!loading && hasData && (
<Button
@@ -88,7 +88,7 @@ export function PredictiveCostTab({
) : (
<Sparkles className="h-3.5 w-3.5 mr-1" />
)}
{t('aiops.predictivecost.s3c4d5e6f')}
{t('aiops.predictivecost.aiInsight')}
</Button>
)}
</div>
@@ -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 () => {
@@ -47,7 +47,7 @@ export function TolerationsCard({ tolerations, onAdd, onRemove, onUpdate }: Tole
<option value="PreferNoSchedule">PreferNoSchedule</option>
<option value="NoExecute">NoExecute</option>
</select>
<Input value={t.tolerationSeconds} placeholder={i18n.t('k8s.editAdvanced.s0c1fec65')} disabled={t.effect !== 'NoExecute'}
<Input value={t.tolerationSeconds} placeholder={i18n.t('k8s.editAdvanced.seconds')} disabled={t.effect !== 'NoExecute'}
onChange={e => onUpdate(i, { tolerationSeconds: e.target.value })}
className="h-7 dg-input text-xs font-mono" />
<Button variant="ghost" size="icon" className="h-7 w-7 dg-text-red" onClick={() => onRemove(i)}>
@@ -146,7 +146,7 @@ export function useLdapManagement(onUsersChanged: () => Promise<void> | void) {
} catch (e) {
const msg = e?.message || '';
if (msg.includes('Already Exists') || msg.includes('68')) {
toast.error(i18n.t('system.useldapmanageme.s1a2b3c4d', { name: ouForm.ou_name }));
toast.error(i18n.t('system.useldapmanageme.ouExists', { name: ouForm.ou_name }));
} else {
toast.error(i18n.t('创建失败: ') + msg);
}
@@ -16,9 +16,9 @@ import {
} from 'lucide-react';
const categoryLabel: Record<string, string> = {
get monitor() { return i18n.t('task.systemtaskspanel.s1a2b3c4d'); },
get cleanup() { return i18n.t('task.systemtaskspanel.s2b3c4d5e'); },
get finops() { return i18n.t('task.systemtaskspanel.s3c4d5e6f'); },
get monitor() { return i18n.t('task.systemtaskspanel.monitor'); },
get cleanup() { return i18n.t('task.systemtaskspanel.cleanup'); },
get finops() { return i18n.t('task.systemtaskspanel.finops'); },
};
function statusBadge(status?: string) {
+3 -3
View File
@@ -412,7 +412,7 @@ export function DataTable<T = Record<string, unknown>>(
)}
{selectable && (selectedIds?.length ?? 0) > 0 && (
<Badge variant="secondary" className="bg-[var(--dg-bg-active)] text-[var(--dg-text-secondary)] border-[var(--dg-border)]">
{i18n.t("ui.datatable.s1a2b3c4d", { count: selectedIds!.length })}
{i18n.t("ui.datatable.selectedCount", { count: selectedIds!.length })}
</Badge>
)}
</div>
@@ -423,7 +423,7 @@ export function DataTable<T = Record<string, unknown>>(
<DropdownMenuTrigger asChild>
<Button variant="outline" size="sm" className="h-8 gap-1.5 border-[var(--dg-border)] text-[var(--dg-text-secondary)] hover:bg-[var(--dg-bg-hover)] hover:text-[var(--dg-text-primary)]">
<Eye className="h-3.5 w-3.5" />
<span className="hidden sm:inline">{i18n.t("ui.datatable.s2b3c4d5e")}</span>
<span className="hidden sm:inline">{i18n.t("ui.datatable.columns")}</span>
</Button>
</DropdownMenuTrigger>
<DropdownMenuContent align="end" className="bg-[var(--dg-bg-secondary)] border-[var(--dg-border)]">
@@ -579,7 +579,7 @@ export function DataTable<T = Record<string, unknown>>(
<div className="flex items-center justify-between gap-2 px-1 py-2 flex-wrap">
<div className="flex items-center gap-3">
<span className="text-sm text-[var(--dg-text-muted)]">
{i18n.t("ui.datatable.s3c4d5e6f", { count: sortedData.length })}
{i18n.t("ui.datatable.totalCount", { count: sortedData.length })}
</span>
{selectable && (selectedIds?.length ?? 0) > 0 && (
<span className="text-sm text-[var(--dg-text-muted)]">
+28 -28
View File
@@ -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",
+28 -28
View File
@@ -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": "仪表盘",
+1 -1
View File
@@ -101,7 +101,7 @@ async function request<T = any>(
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<T>;