diff --git a/ROADMAP.md b/ROADMAP.md index ee8fcff..e5ac329 100644 --- a/ROADMAP.md +++ b/ROADMAP.md @@ -1,7 +1,7 @@ # AIOps 智能运维平台 — 优化路线图 > 基于全量审计(96,102 行代码 / 374 文件),从「K8s 功能开发」全面转向「工程质量 + 功能补全 + 架构治理」。 -> 最后更新: 2026-06-25 +> 最后更新: 2026-07-03 --- @@ -273,6 +273,7 @@ services/api.ts (1324L) |------|--------|------| | Dashboard/ServerManager/AlertCenter/Approval/安全审计/Deploy/Kubernetes/Cloud/Task/Monitor | 3800+ | 已迁移 | | **监控大屏 (GrafanaDashboard)** | 108 (monitor.dashboard.*) | GrafanaDashboard.tsx (AgentTab/ZabbixTab/PrometheusTab/DashboardTab) | +| **AIOps 智能运维模块** | 83 (aiops.*) | AgentCLI/LLMConfig/AIOpsAssistant/AIAlertAnalyzer/AIAnalysisResult/AutoFixDialog/PredictiveCapacityTab/AIPredictiveAnalytics/AgentCLIMessages/AgentCLIHistory/predictUtils/analyzerHelpers (12 文件) | **已完成 (2026-06-27)**: - ✅ **i18n 基础设施搭建** — 安装 `i18next` + `react-i18next`,配置翻译实例 (`src/i18n/index.ts`),支持 `zh-CN` / `en-US` 双语 diff --git a/frontend/src/components/aiops/AIAlertAnalyzer.tsx b/frontend/src/components/aiops/AIAlertAnalyzer.tsx index 994ea2f..520a7e9 100644 --- a/frontend/src/components/aiops/AIAlertAnalyzer.tsx +++ b/frontend/src/components/aiops/AIAlertAnalyzer.tsx @@ -156,7 +156,7 @@ export function AIAlertAnalyzer() { )} actions={( - AI 引擎运行中 + {t('aiops.aiEngineRunning')} )} contentClassName="grid grid-cols-2 gap-6 h-[calc(100vh-200px)]" @@ -170,7 +170,7 @@ export function AIAlertAnalyzer() { {t('dashboard.ops.firingAlerts')} - {alerts.filter(a => a.status === 'active').length} 个活跃 + {t('aiops.activeCount', { count: alerts.filter(a => a.status === 'active').length })} @@ -203,7 +203,7 @@ export function AIAlertAnalyzer() { {alert.name} - {alert.severity === 'critical' ? '严重' : alert.severity === 'warning' ? '警告' : '提示'} + {alert.severity === 'critical' ? t('aiops.severityCritical') : alert.severity === 'warning' ? t('aiops.severityWarning') : t('aiops.severityInfo')}
{alert.description}
diff --git a/frontend/src/components/aiops/AIAnalysisResult.tsx b/frontend/src/components/aiops/AIAnalysisResult.tsx index 8d81602..4954db0 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 - AI 分析结果 + {i18n.t('aiops.aiAnalysisResult')} @@ -33,7 +33,7 @@ export function AIAnalysisResult({ selectedAlert, isAnalyzing, analysis, onAutoF ) : isAnalyzing ? (
-

AI正在分析告警根因...

+

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

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

) : analysis ? ( @@ -59,7 +59,7 @@ export function AIAnalysisResult({ selectedAlert, isAnalyzing, analysis, onAutoF

- 根因分析 + {i18n.t('aiops.rootCauseAnalysis')}

{analysis.rootCause}

@@ -70,7 +70,7 @@ export function AIAnalysisResult({ selectedAlert, isAnalyzing, analysis, onAutoF

- 影响范围 + {i18n.t('aiops.impactScopeLabel')}

{analysis.impact}

@@ -81,7 +81,7 @@ export function AIAnalysisResult({ selectedAlert, isAnalyzing, analysis, onAutoF

- 修复建议 + {i18n.t('aiops.fixSuggestions')}

{analysis.recommendations.map((rec, idx) => ( @@ -102,7 +102,7 @@ export function AIAnalysisResult({ selectedAlert, isAnalyzing, analysis, onAutoF
- 发现 {analysis.similarCases} 个相似历史案例 + {i18n.t('aiops.similarCasesFound', { count: analysis.similarCases })}
@@ -111,7 +111,7 @@ export function AIAnalysisResult({ selectedAlert, isAnalyzing, analysis, onAutoF

- 自动修复脚本 + {i18n.t('aiops.autoFixScriptTitle')}

{analysis.autoFixScript}
@@ -121,7 +121,7 @@ export function AIAnalysisResult({ selectedAlert, isAnalyzing, analysis, onAutoF onClick={onAutoFix} > - 执行自动修复 + {i18n.t('aiops.executeAutoFix')}
)} diff --git a/frontend/src/components/aiops/AIOpsAssistant.tsx b/frontend/src/components/aiops/AIOpsAssistant.tsx index 7fccb5d..4661bb4 100644 --- a/frontend/src/components/aiops/AIOpsAssistant.tsx +++ b/frontend/src/components/aiops/AIOpsAssistant.tsx @@ -342,7 +342,7 @@ export function AIOpsAssistant() { - 能力展示 + {t('aiops.capabilities')}
@@ -355,7 +355,7 @@ export function AIOpsAssistant() {
- 自动报告生成 + {t('aiops.autoReportGen')}
diff --git a/frontend/src/components/aiops/AIPredictiveAnalytics.tsx b/frontend/src/components/aiops/AIPredictiveAnalytics.tsx index 68f9175..4fa58ba 100644 --- a/frontend/src/components/aiops/AIPredictiveAnalytics.tsx +++ b/frontend/src/components/aiops/AIPredictiveAnalytics.tsx @@ -159,18 +159,18 @@ export function AIPredictiveAnalytics() {
- 关键指标预测 + {t('aiops.keyMetricForecast')} - 线性回归预测 + {t('aiops.linearRegressionForecast')}
{loading ? (
- 加载指标数据... + {t('aiops.loadingMetricData')}
) : predictions.length === 0 ? (
{t('aiops.noMetricData')}
@@ -181,15 +181,15 @@ export function AIPredictiveAnalytics() {
{prediction.name.includes('CPU') && } - {prediction.name.includes('内存') && } - {prediction.name.includes('磁盘') && } - {prediction.name.includes('网络') && } + {prediction.name.includes(t('aiops.memoryKeyword')) && } + {prediction.name.includes(t('aiops.diskKeyword')) && } + {prediction.name.includes(t('aiops.networkKeyword')) && } {prediction.name}
{getTrendIcon(prediction.trend)} - {prediction.trend === 'up' ? '上升' : prediction.trend === 'down' ? '下降' : '平稳'} + {prediction.trend === 'up' ? t('aiops.trendUp') : prediction.trend === 'down' ? t('aiops.trendDown') : t('aiops.trendStable')}
@@ -203,7 +203,7 @@ export function AIPredictiveAnalytics() {

-

预测值 ({prediction.timeRange})

+

{t('aiops.predictedValueLabel', { range: prediction.timeRange })}

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

{anomaly.timeframe} - 概率:{' '} + {t('aiops.probabilityColon')} = 70 ? 'dg-text-red' : 'dg-text-yellow'}> {anomaly.probability}% diff --git a/frontend/src/components/aiops/AgentCLI.tsx b/frontend/src/components/aiops/AgentCLI.tsx index e2b5532..918b371 100644 --- a/frontend/src/components/aiops/AgentCLI.tsx +++ b/frontend/src/components/aiops/AgentCLI.tsx @@ -68,7 +68,7 @@ const SAFETY_MODES = [ label: i18n.t('aiops.safetyBalanced'), short: i18n.t('aiops.safetyHighRiskConfirm'), desc: i18n.t('aiops.safetyBalancedDesc'), - examples: 'cat/grep/df 自动 · rm/reboot 确认', + examples: i18n.t('aiops.safetyBalancedExamples'), recommended: true, }, { @@ -82,7 +82,7 @@ const SAFETY_MODES = [ // formatServerLabel 主机下拉展示文案 // Logan.Li function formatServerLabel(s: { hostname: string; ip: string }) { - return `${s.hostname}(${s.ip})`; + return i18n.t('aiops.hostIpFormat', { hostname: s.hostname, ip: s.ip }); } export default function AgentCLI() { @@ -291,7 +291,7 @@ export default function AgentCLI() { } case 'error': case 'aborted': - push({ kind: type === 'aborted' ? 'info' : 'error', content: ev.message || (type === 'aborted' ? '任务已中断' : '发生错误') }); + push({ kind: type === 'aborted' ? 'info' : 'error', content: ev.message || (type === 'aborted' ? t('aiops.taskAborted') : t('aiops.errorOccurred')) }); setRunning(false); setCanContinue(type !== 'aborted'); setHistoryRefresh((k) => k + 1); @@ -303,13 +303,13 @@ export default function AgentCLI() { const handleConfirm = async (ev: WsEvent) => { const ok = await confirm({ title: t('aiops.confirmHighRisk'), - description: `工具:${ev.tool_name}\n风险:${ev.risk}\n命令:${ev.command || t('system.none')}`, + description: t('aiops.confirmToolExec', { tool: ev.tool_name, risk: ev.risk, cmd: ev.command || t('system.none') }), confirmText: t('aiops.assistantConfirmExec'), cancelText: t('common.deny'), variant: 'destructive', }); wsRef.current?.send(JSON.stringify({ type: ok ? 'confirm' : 'deny', confirm_id: ev.confirm_id })); - if (!ok) push({ kind: 'info', content: `已拒绝执行:${ev.command || ev.tool_name}` }); + if (!ok) push({ kind: 'info', content: t('aiops.rejectedExec', { cmd: ev.command || ev.tool_name }) }); }; // 发送任务 // Logan.Li @@ -342,7 +342,7 @@ export default function AgentCLI() { setItems([ { id: nextId(), kind: 'info', - content: `查看历史记录:${sess.title}(${sess.status === 'done' ? '已完成' : sess.status})— 仅浏览,点击「继续追问」可在此基础上接着执行`, + content: t('aiops.viewHistoryDetail', { title: sess.title, status: sess.status === 'done' ? t('aiops.taskDone') : sess.status }), }, ...replayItems, ]); @@ -357,7 +357,7 @@ export default function AgentCLI() { return; } wsRef.current.send(JSON.stringify({ type: 'resume', session_id: viewSession.id })); - push({ kind: 'info', content: `正在恢复会话「${viewSession.title}」…` }); + push({ kind: 'info', content: t('aiops.resumingSession', { title: viewSession.title }) }); }; const handleNewTask = () => { @@ -439,7 +439,7 @@ export default function AgentCLI() { )}

{m.desc}

-

例:{m.examples}

+

{t('aiops.examplePrefix')}{m.examples}

))} @@ -454,7 +454,7 @@ export default function AgentCLI() { title={historyOpen ? t('aiops.collapseHistory') : t('aiops.expandHistory')} > {historyOpen ? : } - 历史 + {t('aiops.history')}
@@ -472,7 +472,7 @@ export default function AgentCLI() { )} {running && ( - 第 {round} 轮 · {tokens}t + {t('aiops.roundTokens', { round, tokens })} )} @@ -513,7 +513,7 @@ export default function AgentCLI() { {viewMode && viewSession && (
- 历史记录(只读)· {viewSession.title} + {t('aiops.historyReadonly', { title: viewSession.title })} {canResumeView && ( {onCollapse && (
diff --git a/frontend/src/components/aiops/LLMConfig.tsx b/frontend/src/components/aiops/LLMConfig.tsx index 042f03d..de8452f 100644 --- a/frontend/src/components/aiops/LLMConfig.tsx +++ b/frontend/src/components/aiops/LLMConfig.tsx @@ -307,7 +307,7 @@ export default function LLMConfigPage() { )} - 云服务 + {t('aiops.cloudService')} {CLOUD_GENERAL_PROVIDERS.map((p) => ( {p.name} ))} @@ -319,7 +319,7 @@ export default function LLMConfigPage() { ))} - 自定义接入 + {t('aiops.customAccess')} {CUSTOM_PROVIDERS.map((p) => ( {p.name} ))} @@ -356,7 +356,7 @@ export default function LLMConfigPage() { {unknownProvider && (
- 当前提供商「{cfg.provider}」不在预设列表中,可继续使用或切换到其他提供商。 + {t('aiops.unknownProviderHint', { provider: cfg.provider })}
)} @@ -365,7 +365,7 @@ export default function LLMConfigPage() {
- {prov.planHint || `使用 ${prov.name} 需先开通服务并获取 API Key`} + {prov.planHint || t('aiops.providerNeedsKey', { name: prov.name })}
- 推理 / Plan 模式 + {t('aiops.reasoningPlanMode')} @@ -420,7 +420,7 @@ export default function LLMConfigPage() {
{t('aiops.enableReasoning')}
- 适用于 OpenAI o-series / DeepSeek R1 / Claude 3.7 Sonnet 等推理模型;普通模型开启后可能报错。 + {t('aiops.reasoningModelHint')}
set('reasoning_enabled', v)} /> @@ -437,17 +437,17 @@ export default function LLMConfigPage() { {testing ? : } - 测试连接 + {t('aiops.testConnectionBtn')} {isVerified ? ( - 已验证,可保存 + {t('aiops.verifiedCanSave')} ) : ( {t('system.switchProviderTest')} @@ -459,7 +459,7 @@ export default function LLMConfigPage() { - 测试结果 + {t('aiops.testResultTitle')} @@ -467,9 +467,9 @@ export default function LLMConfigPage() { {testResult.answer || t('aiops.noModelContent')}
- 模型: {testResult.model || t('common.unknown')} - 提供商: {testResult.provider} - 消耗 Token: {testResult.tokens_used ?? '-'} + {t('aiops.modelColon')}{testResult.model || t('common.unknown')} + {t('aiops.providerColon')}{testResult.provider} + {t('aiops.tokensConsumed')}{testResult.tokens_used ?? '-'} {testResult.reasoning_enabled && ( {t('aiops.reasoningOn')} )} @@ -481,11 +481,7 @@ export default function LLMConfigPage() {
- 云服务:选择提供商 → 开通并填写 API Key → 测试连接 → 保存。 - 编码套餐:GLM / Kimi / MiniMax 固定月费套餐,适合 Agent CLI 高频调用(注意 Key 与按量版不互通)。 - 大模型自定义:填请求地址 + API Key + 模型名,兼容 OpenRouter 等 OpenAI 格式服务。 - 本地/自建(Ollama、vLLM):填写 Endpoint 与模型名即可,API Key 可留空。 - 测试时会发送「你是什么模型?请简短回答。」以确认接入目标模型。 + {t('aiops.configHelpText')}
diff --git a/frontend/src/components/aiops/PredictiveCapacityTab.tsx b/frontend/src/components/aiops/PredictiveCapacityTab.tsx index f570f1d..f4956b7 100644 --- a/frontend/src/components/aiops/PredictiveCapacityTab.tsx +++ b/frontend/src/components/aiops/PredictiveCapacityTab.tsx @@ -40,7 +40,7 @@ export function PredictiveCapacityTab({
- 容量规划预警 + {i18n.t('aiops.capacityWarning')} {!loading && forecasts.length > 0 && ( )}
@@ -63,7 +63,7 @@ export function PredictiveCapacityTab({ {loading ? (
- 加载容量数据... + {i18n.t('aiops.loadingCapacityData')}
) : forecasts.length === 0 ? (
{i18n.t('aiops.predictivecapac.sf803eb75')}
@@ -74,7 +74,7 @@ export function PredictiveCapacityTab({
- AI 深度解读 + {i18n.t('aiops.aiDeepAnalysis')}

{insight}

@@ -106,15 +106,13 @@ export function PredictiveCapacityTab({
- 7天使用率预测 + {i18n.t('aiops.sevenDayForecast')} {forecast.daysUntilThreshold >= 999 ? ( i18n.t('aiops.predictutilsts.s179fd5a9') ) : ( <> - 预计{' '} - {forecast.daysUntilThreshold}天{' '} - 后达到阈值 + {i18n.t('aiops.expectedReachThreshold', { days: forecast.daysUntilThreshold })} )} @@ -131,9 +129,9 @@ export function PredictiveCapacityTab({
- 当前 {forecast.currentUsage}% - 预测 {forecast.predictedUsage}% - 阈值 {forecast.threshold}% + {i18n.t('aiops.currentUsageLabel', { n: forecast.currentUsage })} + {i18n.t('aiops.predictedUsageLabel', { n: forecast.predictedUsage })} + {i18n.t('aiops.thresholdLabel', { n: forecast.threshold })}
@@ -141,7 +139,7 @@ export function PredictiveCapacityTab({
- AI建议: + {i18n.t('aiops.aiSuggestionColon')}

{forecast.recommendation}

diff --git a/frontend/src/components/aiops/analyzerHelpers.ts b/frontend/src/components/aiops/analyzerHelpers.ts index 4501de2..893292f 100644 --- a/frontend/src/components/aiops/analyzerHelpers.ts +++ b/frontend/src/components/aiops/analyzerHelpers.ts @@ -162,7 +162,7 @@ export function mapAlertEvent(event: JsonData): AlertItem { const endTime = event.resolved_at ? new Date(event.resolved_at) : new Date(); const startTime = new Date(event.started_at); const diffMin = Math.max(1, Math.round((endTime.getTime() - startTime.getTime()) / 60000)); - const duration = diffMin >= 60 ? `${Math.floor(diffMin / 60)}小时${diffMin % 60}分钟` : `${diffMin}分钟`; + const duration = diffMin >= 60 ? i18n.t('aiops.durationHM', { hours: Math.floor(diffMin / 60), mins: diffMin % 60 }) : i18n.t('aiops.durationM', { mins: diffMin }); const startedAt = startTime.toLocaleString('zh-CN', { hour12: false }); diff --git a/frontend/src/components/aiops/predictUtils.ts b/frontend/src/components/aiops/predictUtils.ts index a44d19e..a9b5e92 100644 --- a/frontend/src/components/aiops/predictUtils.ts +++ b/frontend/src/components/aiops/predictUtils.ts @@ -251,18 +251,18 @@ export function computePredictions(input: ComputePredictionsInput): ComputedPred probability = Math.max(5, Math.min(90, probability)); // 时间范围:基于斜率估算何时触及阈值 - let timeframe = '未来24小时'; + let timeframe = i18n.t('aiops.next24Hours'); if (slope > 0.01 && threshold > current) { const hours = (threshold - current) / slope; - if (hours < 4) timeframe = '未来4小时'; - else if (hours < 12) timeframe = '未来12小时'; - else if (hours < 24) timeframe = '未来24小时'; - else timeframe = `未来${Math.ceil(hours / 24)}天`; + if (hours < 4) timeframe = i18n.t('aiops.next4Hours'); + else if (hours < 12) timeframe = i18n.t('aiops.next12Hours'); + else if (hours < 24) timeframe = i18n.t('aiops.next24Hours'); + else timeframe = i18n.t('aiops.nextNDays', { n: Math.ceil(hours / 24) }); } anomalyPredictions.push({ metric: rule.name, - predictedAnomaly: rule.description || `${rule.name}可能触发`, + predictedAnomaly: rule.description || i18n.t('aiops.mayTrigger', { name: rule.name }), probability, timeframe, suggestedAction: anomalyAction(matchedDef.key), @@ -276,7 +276,7 @@ export function computePredictions(input: ComputePredictionsInput): ComputedPred const exprKey = exprLower.includes('service') ? 'service' : exprLower.includes('pod') ? 'pod' : 'service'; anomalyPredictions.push({ metric: rule.name, - predictedAnomaly: rule.description || `${rule.name}可能再次发生`, + predictedAnomaly: rule.description || i18n.t('aiops.mayRecur', { name: rule.name }), probability: Math.min(60, 20 + eventCount * 5), timeframe: i18n.t('aiops.predictutilsts.s658d6e80'), suggestedAction: anomalyAction(exprKey), @@ -328,8 +328,8 @@ export function trendColorClass(trend: string): string { export function buildCapacityInsightPrompt(forecasts: CapacityForecast[]): string { if (forecasts.length === 0) return ''; const lines = forecasts.map((f) => { - const risk = f.daysUntilThreshold >= 999 ? i18n.t('aiops.predictutilsts.s179fd5a9') : `${f.daysUntilThreshold} 天后触及阈值`; - return `- ${f.resource}:当前 ${f.currentUsage}% → 7天后预测 ${f.predictedUsage}%(阈值 ${f.threshold}%),${risk}`; + const risk = f.daysUntilThreshold >= 999 ? i18n.t('aiops.predictutilsts.s179fd5a9') : i18n.t('aiops.daysToThreshold', { days: f.daysUntilThreshold }); + return i18n.t('aiops.forecastSummary', { resource: f.resource, current: f.currentUsage, predicted: f.predictedUsage, threshold: f.threshold, risk }); }); return [ i18n.t('aiops.predictutilsts.s3b46e5a0'), diff --git a/frontend/src/locales/en-US.json b/frontend/src/locales/en-US.json index 8a1dedb..44e075b 100644 --- a/frontend/src/locales/en-US.json +++ b/frontend/src/locales/en-US.json @@ -6537,6 +6537,90 @@ "predictivecapac.sf803eb75": "暂无容量数据", "predictivecapac.scb0ed5ef": "紧急", "assistantts.s16f94bee": "流式响应不可用", - "assistantts.sfeeaa489": "LLM 流式响应错误" + "assistantts.sfeeaa489": "LLM 流式响应错误", + "history": "History", + "examplePrefix": "Ex: ", + "roundTokens": "Round {{round}} · {{tokens}}t", + "historyReadonly": "History (read-only) · {{title}}", + "describeTaskHint": "Describe the task you want to execute, e.g. \"Check disk usage and clean up large files\"", + "currentSafetyMode": "Current safety mode: {{label}} ({{short}})", + "taskAborted": "Task aborted", + "errorOccurred": "An error occurred", + "confirmToolExec": "Tool: {{tool}}\nRisk: {{risk}}\nCommand: {{cmd}}", + "rejectedExec": "Execution rejected: {{cmd}}", + "viewHistoryDetail": "Viewing history: {{title}} ({{status}}) — Read-only. Click \"Continue\" to resume execution", + "resumingSession": "Resuming session \"{{title}}\"...", + "hostIpFormat": "{{hostname}} ({{ip}})", + "cloudService": "Cloud Services", + "customAccess": "Custom Access", + "unknownProviderHint": "Current provider \"{{provider}}\" is not in the preset list. You can continue using it or switch to another provider.", + "providerNeedsKey": "To use {{name}}, you need to activate the service and obtain an API Key first", + "reasoningPlanMode": "Reasoning / Plan Mode", + "reasoningModelHint": "Suitable for reasoning models like OpenAI o-series / DeepSeek R1 / Claude 3.7 Sonnet. May cause errors with standard models.", + "testConnectionBtn": "Test Connection", + "saveConfigBtn": "Save Config", + "verifiedCanSave": "Verified, ready to save", + "testResultTitle": "Test Result", + "modelColon": "Model: ", + "providerColon": "Provider: ", + "tokensConsumed": "Tokens Used: ", + "configHelpText": "Cloud Services: Select a provider → Activate and enter API Key → Test Connection → Save.\n Coding Plans: GLM / Kimi / MiniMax fixed monthly plans, ideal for frequent Agent CLI usage (note: keys are not shared with pay-as-you-go versions).\n Custom LLM: Enter endpoint + API Key + model name, compatible with OpenRouter and other OpenAI-format services.\n Local/Self-hosted (Ollama, vLLM): Enter endpoint and model name; API Key can be left blank.\n Testing sends \"What model are you? Please answer briefly.\" to confirm the target model.", + "capabilities": "Capabilities", + "autoReportGen": "Automated Reporting", + "aiEngineRunning": "AI Engine Active", + "activeCount": "{{count}} active", + "severityCritical": "Critical", + "severityWarning": "Warning", + "severityInfo": "Info", + "durationHM": "{{hours}}h {{mins}}m", + "durationM": "{{mins}}m", + "confidencePercent": "Confidence {{n}}%", + "noAnalysisYet": "Select an alert to view AI analysis", + "aiAnalysisResult": "AI Analysis Result", + "analyzingRootCause": "AI is analyzing alert root cause...", + "rootCauseAnalysis": "Root Cause Analysis", + "impactScopeLabel": "Impact Scope", + "fixSuggestions": "Fix Suggestions", + "similarCasesFound": "Found {{count}} similar historical cases", + "autoFixScriptTitle": "Auto-Fix Script", + "executeAutoFix": "Execute Auto-Fix", + "autoFixDialogDesc": "AI-generated auto-fix script. Please confirm before execution.", + "autoFixWarning": "Warning: Ensure important data is backed up before executing the script", + "confirmExecute": "Confirm Execute", + "aiDeepAnalysis": "AI Deep Analysis", + "loadingCapacityData": "Loading capacity data...", + "sevenDayForecast": "7-Day Usage Forecast", + "expectedReachThreshold": "Expected to reach threshold in {{days}} days", + "currentUsageLabel": "Current {{n}}%", + "predictedUsageLabel": "Predicted {{n}}%", + "thresholdLabel": "Threshold {{n}}%", + "aiSuggestionColon": "AI Suggestion: ", + "keyMetricForecast": "Key Metric Forecast", + "linearRegressionForecast": "Linear Regression Forecast", + "loadingMetricData": "Loading metric data...", + "trendUp": "Up", + "trendDown": "Down", + "trendStable": "Stable", + "predictedValueLabel": "Predicted ({{range}})", + "probabilityColon": "Probability: ", + "memoryKeyword": "Memory", + "diskKeyword": "Disk", + "networkKeyword": "Network", + "roundN": "Round {{round}}", + "toolCountLabel": "{{count}} tools", + "roundThinking": "Round {{round}} Thinking", + "durationLabel": "Duration {{duration}}", + "confirmDeleteSession": "Delete \"{{title}}\"? This action cannot be undone.", + "newSessionBtn": "New", + "roundsTokensSummary": "{{rounds}} rounds · {{tokens}}t", + "next4Hours": "Next 4 hours", + "next12Hours": "Next 12 hours", + "next24Hours": "Next 24 hours", + "nextNDays": "Next {{n}} days", + "mayTrigger": "{{name}} may trigger", + "mayRecur": "{{name}} may recur", + "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" } } diff --git a/frontend/src/locales/zh-CN.json b/frontend/src/locales/zh-CN.json index c4a3eed..164a45e 100644 --- a/frontend/src/locales/zh-CN.json +++ b/frontend/src/locales/zh-CN.json @@ -6537,6 +6537,90 @@ "predictivecapac.sf803eb75": "暂无容量数据", "predictivecapac.scb0ed5ef": "紧急", "assistantts.s16f94bee": "流式响应不可用", - "assistantts.sfeeaa489": "LLM 流式响应错误" + "assistantts.sfeeaa489": "LLM 流式响应错误", + "history": "历史", + "examplePrefix": "例:", + "roundTokens": "第 {{round}} 轮 · {{tokens}}t", + "historyReadonly": "历史记录(只读)· {{title}}", + "describeTaskHint": "描述你要执行的任务,例如「检查磁盘使用率并清理大文件」", + "currentSafetyMode": "当前安全模式:{{label}}({{short}})", + "taskAborted": "任务已中断", + "errorOccurred": "发生错误", + "confirmToolExec": "工具:{{tool}}\n风险:{{risk}}\n命令:{{cmd}}", + "rejectedExec": "已拒绝执行:{{cmd}}", + "viewHistoryDetail": "查看历史记录:{{title}}({{status}})— 仅浏览,点击「继续追问」可在此基础上接着执行", + "resumingSession": "正在恢复会话「{{title}}」…", + "hostIpFormat": "{{hostname}}({{ip}})", + "cloudService": "云服务", + "customAccess": "自定义接入", + "unknownProviderHint": "当前提供商「{{provider}}」不在预设列表中,可继续使用或切换到其他提供商。", + "providerNeedsKey": "使用 {{name}} 需先开通服务并获取 API Key", + "reasoningPlanMode": "推理 / Plan 模式", + "reasoningModelHint": "适用于 OpenAI o-series / DeepSeek R1 / Claude 3.7 Sonnet 等推理模型;普通模型开启后可能报错。", + "testConnectionBtn": "测试连接", + "saveConfigBtn": "保存配置", + "verifiedCanSave": "已验证,可保存", + "testResultTitle": "测试结果", + "modelColon": "模型:", + "providerColon": "提供商:", + "tokensConsumed": "消耗 Token:", + "configHelpText": "云服务:选择提供商 → 开通并填写 API Key → 测试连接 → 保存。\n 编码套餐:GLM / Kimi / MiniMax 固定月费套餐,适合 Agent CLI 高频调用(注意 Key 与按量版不互通)。\n 大模型自定义:填请求地址 + API Key + 模型名,兼容 OpenRouter 等 OpenAI 格式服务。\n 本地/自建(Ollama、vLLM):填写 Endpoint 与模型名即可,API Key 可留空。\n 测试时会发送「你是什么模型?请简短回答。」以确认接入目标模型。", + "capabilities": "能力展示", + "autoReportGen": "自动报告生成", + "aiEngineRunning": "AI 引擎运行中", + "activeCount": "{{count}} 个活跃", + "severityCritical": "严重", + "severityWarning": "警告", + "severityInfo": "提示", + "durationHM": "{{hours}}小时{{mins}}分钟", + "durationM": "{{mins}}分钟", + "confidencePercent": "置信度 {{n}}%", + "noAnalysisYet": "选择左侧告警查看 AI 分析", + "aiAnalysisResult": "AI 分析结果", + "analyzingRootCause": "AI正在分析告警根因...", + "rootCauseAnalysis": "根因分析", + "impactScopeLabel": "影响范围", + "fixSuggestions": "修复建议", + "similarCasesFound": "发现 {{count}} 个相似历史案例", + "autoFixScriptTitle": "自动修复脚本", + "executeAutoFix": "执行自动修复", + "autoFixDialogDesc": "AI生成的自动修复脚本,请确认后执行", + "autoFixWarning": "警告:执行脚本前请确保已备份重要数据", + "confirmExecute": "确认执行", + "aiDeepAnalysis": "AI 深度解读", + "loadingCapacityData": "加载容量数据...", + "sevenDayForecast": "7天使用率预测", + "expectedReachThreshold": "预计 {{days}} 天后达到阈值", + "currentUsageLabel": "当前 {{n}}%", + "predictedUsageLabel": "预测 {{n}}%", + "thresholdLabel": "阈值 {{n}}%", + "aiSuggestionColon": "AI建议:", + "keyMetricForecast": "关键指标预测", + "linearRegressionForecast": "线性回归预测", + "loadingMetricData": "加载指标数据...", + "trendUp": "上升", + "trendDown": "下降", + "trendStable": "平稳", + "predictedValueLabel": "预测值 ({{range}})", + "probabilityColon": "概率:", + "memoryKeyword": "内存", + "diskKeyword": "磁盘", + "networkKeyword": "网络", + "roundN": "第 {{round}} 轮", + "toolCountLabel": "{{count}} 个工具", + "roundThinking": "第 {{round}} 轮思考", + "durationLabel": "耗时 {{duration}}", + "confirmDeleteSession": "确定删除「{{title}}」?此操作不可恢复。", + "newSessionBtn": "新建", + "roundsTokensSummary": "{{rounds}}轮 · {{tokens}}t", + "next4Hours": "未来4小时", + "next12Hours": "未来12小时", + "next24Hours": "未来24小时", + "nextNDays": "未来{{n}}天", + "mayTrigger": "{{name}}可能触发", + "mayRecur": "{{name}}可能再次发生", + "daysToThreshold": "{{days}} 天后触及阈值", + "forecastSummary": "- {{resource}}:当前 {{current}}% → 7天后预测 {{predicted}}%(阈值 {{threshold}}%),{{risk}}", + "safetyBalancedExamples": "cat/grep/df 自动 · rm/reboot 确认" } -} \ No newline at end of file +}