const zh = { common: { help: "帮助说明", refresh: "刷新", refreshing: "刷新中…", query: "查询", clearFilters: "清除筛选", prevPage: "上一页", nextPage: "下一页", perPage: "{{n}}/页", pagerMeta: "共 {{total}} 条 · 第 {{page}}/{{pages}} 页", jumpPage: "跳转到页", pageSize: "每页条数", exportCsv: "导出 CSV", exporting: "导出中…", exportOk: "已导出 {{count}} 条", exportTruncated: "已导出前 {{count}} 条(共 {{total}},已截断)", exportFailed: "导出失败", opFailed: "操作失败", empty: "-", cancel: "取消", copy: "复制", copied: "已复制", }, workbench: { title: "工作台", modules: "可用模块", sections: "功能分区", moduleCount: "{{count}} 个模块", backToWorkbench: "返回工作台", openInNewTab: "在新标签页中打开", openModule: "打开或切换到该模块页签", monitoring: "系统对接", operations: "运维", system: "系统管理", welcomeEyebrow: "Workbench", welcomeTitle: "欢迎回来,{{name}}", welcomeSub: "在此总览同步、拓扑与后台任务状态。", today: "今天 · {{date}}", kpi: { uptime: "API 运行时长", health: "系统健康", tasks: "进行中任务", healthOk: "OK", healthWarn: "CHECK", healthUnknown: "N/A", }, statusTitle: "运行状态", hostHealth: "HOST", platformCapacity: "平台容量", channels: "CHANNELS", fleet: "FLEET", fleetNe: "网元", fleetNeUnit: "台", fleetNeKnown: "已知", fleetNePass: "已连通", fleetNeFail: "失败", fleetNeTesting: "测试中", fleetNeUnknown: "未测试", fleetNeNoTag: "无标签", fleetNeTags: "热门标签", fleetTopo: "拓扑", fleetTopoNodes: "节点", fleetTopoEdges: "边", fleetTopoOther: "其他区域", fleetTopoUnassigned: "未分区", fleetTopoNoRegion: "暂无区域", fleetTopoDiscover: "最近发现", fleetTopoUpdated: "摘要更新", fleetSched: "调度", fleetSchedConfig: "配置同步", fleetSchedLldp: "LLDP", fleetSchedPort: "端口流量", fleetSchedNeCollect: "网元采集", fleetSchedFabric: "拓扑对账", fleetSchedOn: "ON", fleetSchedOff: "OFF", fleetSchedMode: "模式", fleetSchedHeartbeat: "心跳", fleetSchedFresh: "新鲜", fleetSchedStale: "过期", sidePanel: "控制台侧栏", consoleId: "OPS CONSOLE", refreshedAt: "更新于 {{time}}", taskRail: "ACTIVE TASKS", taskRailAll: "ALL", taskRailEmpty: "No active tasks", taskTotal: "POOL {{count}}", announceTitle: "系统公告", recentTitle: "最近操作", recentMore: "查看全部", quickTitle: "快捷操作", emptyRecent: "暂无操作记录。", gauge: { cpu: "CPU", mem: "内存", storage: "存储", storageUsed: "已用", storageUnavailable: "不可用", cli: "CLI 并发", db: "数据库连接", webcrt: "WebCRT", tasks: "活跃任务", low: "低负载", normal: "正常", high: "繁忙", }, quick: { tasks: "任务概览", logs: "操作日志", users: "用户管理", apiKeys: "API Key", sessions: "登录会话", }, announce: { a1: "深色工作台已上线,其它模块将沿用同一套深色体系。", a1Date: "2026-08-04", a2: "LLDP 采集支持暂停/继续/停止;进程重启后会自动续跑。", a2Date: "2026-08-04", a3: "配置同步与 LLDP 看板在任务运行中可实时刷新 KPI。", a3Date: "2026-08-03", }, recentCols: { action: "操作内容", module: "模块", time: "时间", user: "用户", }, cards: { umeSync: "UME同步", network: "网络管理", managedNe: "网元管理", collect: "批量采集", webcrt: "WebCRT", topology: "拓扑管理", portTrafficWall: "流量大屏", users: "用户管理", audit: "操作审计", apiKeys: "API Key", sessions: "登录会话", }, }, network: { title: "网络管理", nav: { detail: "网络详情", tasks: "监控任务", cutoverCompare: "割接对比", topologyMgmt: "拓扑管理", devices: "设备列表", topology: "拓扑信息", lldpLinks: "LLDP", topoClassify: "分类", alarms: "告警信息", configs: "配置信息", webcrt: "WebCRT", collectTasks: "采集任务", configSync: "配置同步", portTraffic: "流量监控", portTrafficWall: "流量大屏", bizState: "业务监控", bizCompare: "业务对比", bizMigration: "割接监控", compareTemplates: "对比模板", monitorTemplates: "监控模板", }, collapseNav: "折叠侧栏", expandNav: "展开侧栏", placeholder: { title: "功能规划中", body: "该能力尚未开放。", }, }, bizState: { title: "业务监控", create: "创建任务", createHint: "从托管 / UME 等有效网元中选择(支持查找)", createModeDevice: "选择设备", createModeImport: "手动导入", createImportHint: "无网元也可建任务:上传会话日志或 zip,自动切分 show/display 并解析为首个批次。之后可在任务上多次「导入日志」追加批次(等同于多次采集)。", createImportSubmit: "创建并导入", created: "已创建任务", createFailed: "创建失败", empty: "暂无业务监控任务。", pickNe: "选择网元…", neKeywordPh: "名称 / IP / ID", allSource: "全部来源", selectedNe: "已选", neEmpty: "无匹配网元。", colSource: "来源", colVendor: "厂商", colConnect: "连通", start: "启动周期", pause: "暂停", statusPaused: "仅手动", scheduleEnabled: "启用周期调度", scheduleOn: "周期", scheduleOff: "手动", scheduleHint: "勾选后按周期自动采集;不勾选则仅支持「立即采集」。", collectNow: "立即采集", importLog: "导入日志", importLogHint: "向当前任务追加一批次(等同于一次采集):支持整段会话或 zip,丢掉 show/display 前杂讯,按 hostname#show 切分;整份无 show 则失败(无需 SSH)。", importVendor: "厂商", importVendorGeneric: "通用(show+display)", importFile: "日志文件", importNeName: "任务名称(可选)", importNeNamePh: "例如:PE1-offline", importSubmit: "导入为新批次", importing: "导入中", importStarted: "已开始导入({{count}} 段命令)", importOfflineOnly: "导入任务仅支持离线导入,无 SSH 采集", sourceImport: "导入", stopCollect: "停止采集", stopCollectOk: "已请求停止采集", stopCollectIdle: "当前没有进行中的采集", delete: "删除", confirmDelete: "删除该业务监控任务及所有批次?", deleted: "已删除", started: "已启用周期采集", paused: "已暂停周期(仅手动采集)", collecting: "采集中", statusCollecting: "采集中", detail: "详情", interval: "采集周期", intervalUnitDays: "天", intervalUnitHours: "小时", intervalUnitSeconds: "秒", retention: "保留天数", retentionHint: "超过天数的批次会自动清理;基线与比对/割接引用的批次不会删除。", dailyKeepEnabled: "每日保留策略", dailyKeepCount: "每天保留次数", dailyKeepHint: "开启后:过去每一天只保留最近 N 次,多余在次日清理(默认关闭)。", markBaseline: "标为基线", unmarkBaseline: "撤销基线", baseline: "基线", protected: "已保护", colAlias: "别名", setAlias: "设别名", aliasPrompt: "批次别名(比对/割接选择时优先显示;留空清除)", aliasSaved: "别名已保存", aliasEmpty: "未命名", workbookStats: "对比项 {{compare}} · 有数据 {{withData}} · 表格 {{sheets}}", deleteBatch: "删除", bulkDelete: "批量删除", confirmDeleteBatch: "删除该采集批次?受保护的批次无法删除。", confirmBulkDelete: "删除选中的 {{count}} 个批次?受保护的会自动跳过。", batchDeleted: "已删除批次", bulkDeleted: "已删除 {{deleted}} 个,跳过 {{skipped}} 个", purgeNow: "立即清理", purgeOk: "清理完成:删除 {{dropped}} 个批次", selectAll: "全选可删", colProtect: "保护", saveSchedule: "保存周期", scheduleSaved: "周期配置已保存", colInterval: "周期", profiles: "监控项", profilesSelectAll: "全选", profilesDeselectAll: "取消全选", profilesSelectAllOk: "已启用 {{n}} 项", profilesDeselectAllOk: "已全部取消启用", profilesSelectionStats: "已选 {{enabled}} / 共 {{total}} 项", profilesUnboundStats: "未关联 {{n}}", colLane: "采集车道", laneLight: "轻车道", laneHeavy: "重车道", laneLightHint: "与多数命令共用 SSH;整轮默认约 10 分钟上限", laneHeavyHint: "独立 SSH + 更长超时;整轮默认约 40 分钟上限", enable: "启用", command: "命令模板", colAux: "辅命令", params: "参数关联", discoverVrf: "发现 VRF", discoverBind: "发现 / 关联", saveBindings: "保存关联", cancel: "关闭", bindTitle: "选择参数关联", unbound: "未关联", bindHintRequired: "需关联参数后才可采集", paramsDblClickHint: "单击查看全部关联明细", paramsClickHint: "单击查看全部关联明细", paramsDetailTitle: "参数关联明细", paramsDetailCount: "共 {{n}} 条", discoverLoading: "正在发现…", discoverEmpty: "未发现可用选项", discoverCacheHit: "已复用(未重新登录)", discoverRefresh: "重新从设备拉取", selectAllVrfs: "全选", deselectAllVrfs: "取消全选", batches: "采集批次", viewBatch: "查看", batchDetail: "详情", export: "导出", exportCommands: "导出采集命令", exportCommandsOk: "已导出采集命令", exportRawLog: "导出为文本", exportRawLogOk: "日志已导出", noBatches: "尚无批次", batchCollectDetail: "采集详情", batchWorkbook: "批次工作簿", batchId: "批次 ID", copyBatchId: "复制批次 ID", batchMessageEmpty: "无额外说明或报错", batchCmdSummary: "命令 {{ok}} 成功 / {{fail}} 失败 / {{skipped}} 跳过 / {{other}} 其他 · 统计 {{total}} 条(批次计数 {{batchCmds}})", sheetCommands: "命令", sheetLldp: "LLDP 邻居", sheetVrfRoute: "VRF 路由摘要", sheetIsis: "ISIS 邻居", sheetIfaceBrief: "接口 Brief", sheetArp: "ARP", sheetNd6: "ND6 Cache", sheetBgpPeer: "BGP 对等体", sheetConfigIface: "接口 Intent", sheetConfigVrf: "VRF Intent", sheetConfigBgp: "BGP Intent", sheetFilterPh: "筛选当前表…", sheetEmpty: "本表无数据", sheetLoading: "加载中…", collectCommand: "采集命令", viewRawLog: "原始日志", rawLogTitle: "原始采集日志", rawLogEmpty: "无原始输出", rawLogStats: "采集 {{lines}} 行 · 入库 {{rows}} 条", rawLogDeclared: "声明 {{declared}}", openWorkbook: "打开工作簿", filterColumn: "筛选列", filterAllCols: "全部列", listFilterPh: "筛选网元 / IP / 厂商 / 状态", purposeFilter: "任务用途", purposeAll: "全部用途", purposePortrait: "画像", purposeCutoverHf: "割接高频", colPurpose: "用途", colNe: "网元", colStatus: "状态", colLast: "最近采集", colStarted: "开始时间", colEnded: "结束时间", colTime: "时间", colRows: "入库条数", colRawLines: "采集行数", colDeclared: "设备声明", colActions: "操作", colCommand: "命令", colMessage: "说明", pickTask: "打开详情查看任务", noNeedBind: "该监控项无需参数关联", discoverFailed: "发现失败", bindingsSaved: "参数关联已保存", }, bizCompare: { title: "业务对比", templates: "比对模板", newTemplate: "新建模板", editTemplate: "编辑模板", saveTemplate: "保存模板", templateSaved: "模板已保存", templateDeleted: "模板已删除", confirmDeleteTemplate: "删除该比对模板?", confirmDeleteJob: "删除该比对任务及全部比对记录?", confirmDeleteRun: "删除本次比对结果?任务配置将保留。", deleteJob: "删除任务", deleteRun: "删除本次", runDeleted: "比对记录已删除", emptyTemplates: "暂无模板。可新建,或从 JSON 文件导入。", exportTemplate: "导出", importTemplate: "导入", templateExported: "模板已导出", templateImported: "模板已导入", templateImportInvalid: "导入文件无效:需要 name 与 metrics", templateImportHint: "导入/导出 JSON,便于私下传递模板(不含任务/批次数据)", templateHint: "先勾选监控项,再配置 Key / 接口 / 比对 / 展示。比对可设完全相等、绝对容差或相对偏差%;展示列可含不参与比对的上下文。不勾比对字段则只校验条目存在性。", stepPickMetrics: "① 选择监控项", stepConfigRules: "② 配置比对规则", pickMetricsHint: "勾选后加入模板;可多选。选好后在下方按表配置参数。", pickMetricsHintShort: "点选加入 / 取消;配置在下方左侧表列表中切换。", showMetrics: "展开选表", hideMetrics: "收起选表", noMetricsYet: "请先勾选至少一个监控项", selectedCount: "已选 {{n}} 项", tabFields: "字段规则", tabFilters: "行过滤", fieldsHintShort: "Key 对齐行;比对勾选参与值 diff;不勾比对则只看存在性。", tagCompareN: "{{n}} 比对", colFields: "字段数", keyFields: "Key", ifaceFields: "接口", compareFields: "比对", compareMode: "方式", tolerance: "容差", displayField: "展示", keyAlwaysDisplay: "Key 列始终展示", modeEq: "完全相等", modeNumeric: "绝对偏差", modePercent: "相对偏差 %", normalizeField: "归一", ignoreFields: "忽略", field: "字段", note: "备注", keyRequired: "至少选择一个 Key 字段", keyIsIdentity: "Key 用于对齐行,不作为值比对字段", metricsRequired: "请至少添加一张监控表", noMetricFields: "该 metric 无字段定义", rowFilters: "行过滤规则", rowFiltersHint: "比对前按规则筛选行。组内条件为「且」,组与组之间为「或」。勾选 ARP 等监控项时会带上默认可编辑规则,可按需改删。", rowFiltersHintShort: "组内且 · 组间或 · 无过滤则比对全部行", rowFiltersEmpty: "无过滤则比对全部行。", filterClear: "清空", filterAddOr: "添加条件组(或)", filterAddAnd: "组内加条件(且)", filterAddOrShort: "+ 或组", filterAddAndShort: "+ 且", filterRemoveGroup: "删除本组", filterGroupN: "组 {{n}}", filterOr: "或", filterAnd: "且", filterField: "字段", filterOp: "运算", filterValue: "值", normalizeNone: "无", normalizeLower: "小写", normalizeUpper: "大写", normalizeMac: "MAC", normalizeEmpty: "空值归一", templateFilterPh: "筛选模板名 / metric", jobFilterPh: "筛选任务名 / 模板 / 状态", addMetric: "添加监控项", pickMetric: "选择监控项…", addSheet: "加入模板", removeSheet: "移出本表", sheetIdRequired: "请填写 sheet_id(拆表唯一标识)", duplicateSheetId: "sheet_id 不能重复", sheetTitle: "表标题", sheetId: "sheet_id", splitSheet: "拆表复制", colSheets: "监控表", sheetsUnit: "张表", presenceShort: "仅条目", modeFields: "模式:按比对字段检查值", modeFieldsShort: "字段比对", modePresence: "模式:仅校验前后条目一致(不比具体值)", mapping: "端口映射(可选)", newMapping: "新建映射…", mapName: "映射名称", saveMapping: "保存映射", validateMapping: "校验映射", validateNeed: "请先选择映射与前后批次", mapHint: "每行一对:操作前接口,操作后接口(逗号/Tab/竖线分隔)。例:\ngei-0/1/1,gei-0/1/2\nxgei-0/1/0,xgei-0/2/0\n# 井号开头为注释。不是 A,B/C,D 这种斜杠分组。", mappingSaved: "映射已保存", mappingOptionalHint: "可选。留空=忽略本端端口改名,按非接口 Key 对齐。填写后才做端口映射校验。主接口映射会自动覆盖 .子接口(后缀不变)。", ifaceNormalize: "接口归一化", ifaceNormalizeHint: "模板级规则,每行:简写,规范名。先归一化再端口映射。例:\nGE,gei\nSG,smartgroup\nXGE,xgei", createJob: "建立比对任务", defaultJobName: "割接比对", jobName: "名称", template: "模板", mode: "模式", modeManual: "手工选批次", modeAuto: "自动(钉死操作前,操作后取最新)", beforeTask: "操作前任务", beforeBatch: "操作前批次", afterTask: "操作后任务", afterBatch: "操作后批次", sideBefore: "操作前", sideAfter: "操作后", sidesVs: "比对", sidesTitle: "比对双方", pick: "选择…", sameAsBefore: "同操作前 / 选择…", autoHint: "auto:操作后任务新批次到达会自动跑比对", createCompare: "创建比对任务", createSteps: "创建步骤", stepBasics: "基本信息", stepSheets: "对比项", stepBatches: "批次", stepMapping: "端口映射", next: "下一步", back: "上一步", enabledSheets: "对比项", enabledSheetsHint: "点击开关;默认全部开启。关闭的项不参与本次比对。", noTemplateSheets: "该模板暂无对比表", needJobName: "请填写任务名称", needTemplate: "请选择比对模板", needSheets: "请至少开启一项对比", needBeforeBatch: "请选择操作前任务与批次", needAfterBatch: "请选择操作后批次", runNow: "立即比对", runStarted: "比对已在后台启动,可关闭本页;进度见历史记录", runFailed: "比对失败", runStatusRunning: "比对中", runStatusFailed: "失败", runStatusDoneSec: "完成 {{s}}s", runProgress: "{{phase}} · 表 {{i}}/{{n}} · {{sheet}} · 已用 {{s}}s", runRowsLoaded: "已加载 {{side}} {{n}} 行", runRowsSqlCount: "库内统计 {{side}} {{n}} 行", runPersisting: "已写入 {{done}}/{{total}} 行", runEngineSql: "引擎 SQL", runEnginePython: "引擎 Python", runEngineNote: "原因 {{note}}", sheetPending: "等待中", ranWithDuration: "比对完成(耗时 {{s}} 秒)", unchangedNotStored: "成功行仅统计数量未落库。可在任务配置将「成功行保存」改为抽样后重新比对(抽查用)。", unchangedSampleHint: "成功共 {{total}} 条,明细抽样 {{listed}} 条(从原表补全显示,割接抽查用)。通过率按全部 {{total}} 计。", storeUnchanged: "成功行保存", storeUnchangedAuto: "自动(小表全量 / 大表抽样 5000+原表补全)", storeUnchangedSample: "仅抽样(最多 5000,身份键+原表补全)", storeUnchangedKeys: "全量身份键(可翻完全部成功,大表写入仍较久)", storeUnchangedAlways: "始终全量 JSON(大表很慢,慎用)", storeUnchangedNever: "不保存(只计数量)", storeUnchangedHint: "割接优先看失败与通过率;成功默认抽样抽查。通过率始终按全部成功计数。", saveJob: "保存配置", jobSaved: "任务配置已保存", jobDeleted: "比对任务已删除", jobList: "比对任务", detail: "详情", edit: "编辑", delete: "删除", tabConfig: "任务配置", tabRuns: "对比批次", tabResult: "比对结果", runs: "历史比对", runsHint: "每次「立即比对」生成一条批次。重启后卡住的「比对中」会自动标为已取消;也可手动终止后重跑。", noRuns: "尚无比对记录,请先执行比对", result: "比对结果", viewResult: "查看结果", cancelRun: "终止", confirmCancelRun: "确定终止该比对批次?终止后可重新发起比对。", runCancelled: "比对已取消", runStatusCancelled: "已取消", compareAlreadyRunning: "已有比对在进行中,请先在「对比批次」中终止或等待完成", runBatchSummary: "失败 {{fail}} · 成功 {{ok}} · 新增 {{added}}", colTime: "时间", pickBatchRun: "选择比对记录", pickRun: "选择比对记录…", runCount: "{{n}} 次", resultEmpty: "无匹配失败/结果行", resultFilterPh: "筛选身份 / 字段值…", kindAll: "全部", kindDiff: "失败", kindAdded: "新增", kindRemoved: "仅缺失", kindChanged: "仅不一致", kindUnchanged: "成功", kindAddedShort: "新增", kindRemovedShort: "缺失", kindChangedShort: "不一致", kindUnchangedShort: "成功", kindFail: "失败", kindPass: "成功", kindSuccess: "成功", successCount: "成功", passRateShort: "通过率", verdictPass: "通过", verdictFail: "不通过", failCount: "失败条目", missCount: "缺失", extraCount: "多余", mismatchCount: "不一致", matchCount: "一致", failFields: "失败项", failFieldsEmpty: "—", failWholeRow: "整行", pairBefore: "pre", pairAfter: "post", sheetAllPass: "全部一致", filterFailField: "失败比对项", filterFailFieldAll: "全部失败项", diffCount: "失败 {{n}}", passRate: "通过率", passOk: "全部通过", passWarn: "存在失败", runOverview: "总裁决", sheetCurrent: "当前检查项", diffCountLabel: "失败条目", diffRate: "失败率", beforeCount: "操作前行数", afterCount: "操作后行数", matchedRows: "对齐条目", totalRows: "合计条目", sheetCount: "监控表", sheetNavTitle: "检查项", sheetNavHint: "共 {{n}} 项 · 点击切换", collapseSheetNav: "折叠检查项", expandSheetNav: "展开检查项", sheetFailCount: "{{n}} 项失败", topChangedFields: "失败字段 Top", exportTables: "下载表格", exportOk: "已导出比对表格", fullscreen: "大屏全屏", exitFullscreen: "退出全屏", emptyJobs: "暂无比对任务", created: "比对任务已创建", ran: "比对完成", colName: "名称", colMode: "模式", colStatus: "状态", colKind: "结论", colResult: "结果", colDetail: "明细", colFailFields: "失败项", colActions: "操作", colKey: "身份", colChange: "变更", }, bizMigration: { title: "割接监控", hint: "与业务对比独立:相对基线漂移 + 本批预期 + 老/新双端判定。复用采集任务与端口映射。", hintPort: "当前监控项:端口状态(interface_brief / admin·phy·prot)。选基线 → 勾选本批端口 → 判定看板。", hintShort: "选老/新设备与监控模板,创建后自动高频采集;基线来自业务监控画像。", create: "创建任务", createHint: "除画像基线外,整条割接流程在本页完成;创建后自动生成业务监控高频任务并按计划执行。", createHintShort: "选老/新设备 → 监控模板与采集项 → 周期/窗口 → 基线(画像)→ 端口映射 → 创建。后台自动建高频任务。", pickOldNe: "老设备", pickNewNe: "新设备", pickNe: "选择设备", pickNeHint: "点击选择网元", hideNePicker: "收起列表", nePairReady: "老/新设备已选好,可进入下一步;点击上方卡片可重新选择。", needNePair: "请填写任务名并选择老/新设备", needProjectName: "请填写任务名称", needMonitorTemplate: "请选择监控模板", needMetrics: "请至少勾选一项监控项", noPortraitBaseline: "该设备尚无画像采集任务或批次,请先在业务监控跑通画像后再选基线(可稍后补)。", baselineOptionalHint: "基线可稍后在详情里补;有画像批次时可在此直接选定。", metricInterval: "分项周期(秒)", metricIntervalOptional: "分项周期(可选)", metricIntervalHint: "留空则使用上方全局周期;填写后该监控项会单独建高频任务。", scheduleHint: "按本机时间填写窗口,入库为 UTC;窗口外调度器自动暂停高频任务。", sectionSchedule: "采集周期与窗口", sectionBaseline: "基线与映射", sectionDevices: "老 / 新设备", sectionMetrics: "监控项", createSteps: "创建步骤", stepDevices: "设备", stepTemplate: "模板", stepSchedule: "周期", stepBaseline: "基线", next: "下一步", back: "上一步", colHf: "高频", hfReady: "已建", hfMissing: "未建", showCreateMore: "更多:模板 / 映射 / 基线", hideCreateMore: "收起更多", setupHintShort: "画像任务用于基线;高频任务用于窗口内采集。此处配置模板、采集项、窗口与双基线。", createProject: "创建任务", projectName: "任务名称", projectNamePh: "例如:PE-A / PE-B 割接-1", sectionName: "1. 任务名称", sectionTasks: "2. 绑定采集任务(必填)", sectionTasksHint: "分别选择老设备、新设备上的业务监控任务;两侧不能为空。", sectionOptional: "3. 监控模板、映射与基线(可选)", sectionOptionalHint: "可先跳过,创建后再到「基线配置」里设置。未选监控模板时使用系统默认。", sectionPair: "已绑定采集任务", sectionPairHint: "采集任务在创建时绑定;此处可调整监控模板、映射与基线。", sectionBaselineHint: "老侧与新侧基线均必填;老侧用于列出本批预期对象,新侧参与双端判定。", optionalNone: "不选", monitorTemplate: "监控模板", monitorTemplateHint: "决定对比哪些 metric 与双端成功语义;默认绑定系统默认监控模板。", compareTemplate: "对比模板", compareTemplateBound: "绑定对比模板:{{name}}", portMappingHint: "有映射时,带接口字段的监控项只比映射内的口(这些口必须在割接后出现)。映射外的同名口不参与迁移对比;老口 down、新口同名 up 记为异常。未配映射则按同名直比。BGP/PW 仍用本批预期勾选。", baselineNeedTask: "请先选择对应采集任务", baselinePickHint: "从该任务的历史采集批次中选择", oldTask: "老设备画像任务", newTask: "新设备画像任务", portMapping: "端口映射", oldBaseline: "老设备基线批次", newBaseline: "新设备基线批次", needProjectFields: "请填写任务名并选择老/新画像任务", needExpectPorts: "请先勾选本批预期迁移的对象", needBaselineFirst: "先设基线", needBothBaselines: "请先保存老、新两侧基线批次后再评估", errOldBaselineRequired: "缺少老设备基线批次", errNewBaselineRequired: "缺少新设备基线批次", needBizStateTasks: "尚无业务监控(画像)任务,请先创建:", projectCreated: "任务已创建", projects: "任务", empty: "暂无割接任务。", emptyProjects: "暂无割接任务", listFilterPh: "筛选任务名 / 网元 / IP / 状态", kpiProjects: "任务数", kpiActive: "进行中", detail: "详情", cancel: "关闭", colName: "任务", colPair: "老 → 新", colBaseline: "基线", colCreated: "创建时间", colActions: "操作", baselineSet: "已设", baselineUnset: "未设", statusActive: "进行中", statusDone: "已完成", statusPaused: "已暂停", statusPending: "待开始", statusReview: "验收中", tabSetup: "基线配置", tabBatches: "割接批次", tabBoard: "判定看板", saveBaseline: "保存配置", baselineSaved: "基线已保存", pickExpectPorts: "本批预期", portFilterPh: "筛选", emptyBaselinePorts: "基线无数据", batchLabel: "批次标签", batchId: "批次 ID", copyBatchId: "复制批次 ID", defaultBatchLabel: "第N晚", expectPorts: "本批预期端口(老侧)", expectPortsPh: "逗号或换行分隔", createBatch: "新建", batchCreated: "批次已创建", batches: "批次", startBatch: "启动", finishBatch: "收工", evaluate: "立即判定", evaluated: "判定完成", statusUpdated: "状态已更新", board: "进度看板", metricPort: "端口状态", progress: "进度", anomaly: "异常", onlyExpect: "仅预期", onlyExpectHint: "默认显示全部漂移;勾选后只看本批预期", pinCurrentBatches: "当前采集批次", pinOldBatch: "老侧当前", pinNewBatch: "新侧当前", pinLatest: "最新", runHistory: "判定历史", runLatest: "最新一次", colRuleHit: "命中规则", colCommand: "采集命令", mappingBound: "映射已保存并绑定到本任务", allMetrics: "全部监控项", colMetric: "监控项", colKey: "对象", colPort: "老侧端口", openRedChip: "红单 {{n}}", metaPortrait: "画像", metaHf: "HF", metaBaseline: "基线", baselineOk: "已设", baselineMissing: "缺", needBaselineFirst: "先设基线", enableHighfreq: "开启高频", highfreqReady: "高频已就绪", collectNow: "立即采集", collectTriggered: "已触发采集", openBizState: "业务监控", hfNotBound: "未绑定", projectCollectMetrics: "采集项", hfInterval: "周期(秒)", hfStart: "开始", hfEnd: "结束", markProjectDone: "完成并停HF", confirmProjectDone: "确认完成项目并暂停全部高频?", projectMarkedDone: "已完成,高频已停", deleteProject: "删除", confirmDeleteProject: "确认删除项目?将停高频并清批次记录。", projectDeleted: "已删除", acceptPassedShort: "通过", acceptFailedShort: "未过", colMapped: "映射新口", colDesc: "描述", colOldPort: "老端口", colNewPort: "新端口", colOldStatus: "老状态 admin/phy/prot", colNewStatus: "新状态 admin/phy/prot", colOld: "老侧", colNew: "新侧", colVerdict: "判定", emptyDiffs: "暂无明细,请先「立即判定」", emptyRed: "暂无红单", verdictMigrated: "已迁移", verdictMigrating: "迁移中", verdictLost: "丢失", verdictAnomaly: "异常", verdictNotInvolved: "未涉及", verdictUnexpected: "意外新增", verdictOk: "正常", highfreqHint: "", boundTasks: "绑定任务", oldPortraitTask: "老画像", newPortraitTask: "新画像", oldHfTask: "老HF", newHfTask: "新HF", projectCollectHint: "", hfWindowInactive: "高频窗口未到/已结束,或项目已完成,当前不可采集", baselinePortraitOnly: "", collectSkipped: "未采", collectSkippedBanner: "未采:{{metrics}}", currentMissing: "缺当前", currentMissingBanner: "缺当前批次:{{metrics}}", highfreqReadyInactive: "高频已绑定(窗口未开,未立即采集)", collectPartial: "部分失败(成功 {{ok}} / 失败 {{fail}})", confirmProjectDone: "确认完成项目并暂停全部高频?", projectMarkedDone: "已完成,高频已停", confirmDeleteProject: "确认删除项目?将停高频并清批次记录。", projectDeleted: "已删除", errMetricNeedsBindings: "监控项「{{metric}}」需要参数绑定({{params}}),割接高频暂不支持,请去掉该项", errNoProfileForMetric: "监控项「{{metric}}」在当前设备厂商下无可用采集 profile", acceptTitle: "本批验收", acceptPassed: "验收通过", acceptFailed: "验收未过(红单 {{n}})", newBaselineMissingBanner: "缺新基线:{{metrics}}", acceptCarryHint: "可带红开下一批", openRedHint: "红单 {{n}}", redTitle: "红单", redOpen: "未关闭", resolveRed: "关闭", redResolved: "已关闭", batchCreatedWithRed: "已建批(红单 {{n}})", colStatus: "状态", verdictUnfinished: "未完成", }, bizMonitorTpl: { title: "监控模板", hint: "对比模板定义「怎么对齐/比对」;监控模板按同样的表(sheet)定义「怎样算搬迁成功/失败」。", create: "新建监控模板", edit: "编辑", save: "保存", cancel: "关闭", created: "已创建", saved: "已保存", deleted: "已删除", confirmDelete: "删除该监控模板?", delete: "删除", empty: "暂无监控模板。", listFilterPh: "筛选名称 / 对比模板 / 备注", kpiTotal: "模板数", colName: "名称", namePh: "例如:状态割接监控", colCompare: "对比模板", colCollect: "高频采集项", colNote: "备注", colActions: "操作", needName: "请填写名称", defaultsInvalid: "defaults JSON 无效", overridesInvalid: "sheet_overrides JSON 无效", exportTemplate: "导出", importTemplate: "导入", templateExported: "模板已导出", templateImported: "模板已导入", templateImportInvalid: "导入文件无效:需要 name 与 compare_template_id(或 compare_template_name)", templateImportHint: "导入/导出 JSON,便于私下传递监控模板(不含任务/批次数据)", templateImportCompareMissing: "未找到对应对比模板,请先导入或创建同名对比模板", formHint: "先选对比模板 → 出现与对比模板相同的表页签 → 为每张表配置成功条件。", compareHint: "决定有哪些表以及 Key/比对字段;此处只配置双端判定。", pickCompare: "选择对比模板…", openCompare: "管理对比模板", collectAll: "模板全量", collectPh: "interface_brief, bgp_peer(空=全量)", collectHint: "勾选高频采集的 metric;全不勾或点「模板全量」表示对比模板全部 sheets。", collectTitle: "高频采集子集", defaults: "defaults(JSON)", overrides: "sheet_overrides(JSON)", overridesHint: "可按 metric 声明 status_fields / success 模式。", globalPolicy: "全局策略", outOfExpect: "预期外对象", outOfExpectHint: "不在本批预期内的漂移如何处理。", ooeStrict: "严格(异常标红)", ooeWarn: "警告(仅标黄,不记红单)", ooeIgnore: "忽略(一律未涉及)", sheetRules: "各表搬迁判定", applyAllPresets: "全部套用推荐预设", applyAllPresetsShort: "全部预设", sheetsUnit: "张表", sheetHowReadonly: "对比模板(只读)", iface: "接口", compare: "比对", presenceOnly: "仅存在性", editInCompare: "改 HOW", presetAuto: "推荐预设", presetSkip: "跳过本表", skipDual: "本表不参与双端判定", skipDualHint: "该表在割接判定中跳过(计数器等请用业务对比 Job)。", statusFields: "用哪些字段判断 up/down", statusFieldsHint: "端口勾选 admin/phy/prot;BGP 勾选 state;ARP 可不勾(只看条目有无)。", statusOptionalHint: "未勾选状态字段时,只按「消失 / 新增」等存在性判定。", downValues: "算 down 的取值", upValues: "算 up 的取值", noFields: "无可用字段(先在对比模板勾选 metric)", successPatterns: "成功规则(老侧组间或 × 新侧组间或)", successPatternsShort: "成功规则", successPatternsHint: "存在性看条目有无;值变更绑定字段并选择怎么变。组内是且,组之间是或。", successPatternsHintShort: "组内且 · 组间或 · 老侧命中一组且新侧命中一组 → 成功", successPatternsHintFree: "每侧只有两种条件:存在性(不绑字段)或值变更(必须绑字段)。同一组内全部满足(且),组与组之间满足一组即可(或)。", anomalyPatternsShort: "异常规则", anomalyPatternsHint: "与成功同结构。命中后标红。某一侧可勾「不限制」表示只看另一侧(如新侧现网消失/down)。未成功≠异常,中间态仍是迁移动态。", anomalyPatternsHintShort: "先匹配成功;未命中再看异常。可勾「不限制」只盯一侧。中间态≠异常。", successRow: "成功 {{n}}", anomalyRow: "异常 {{n}}", removeRow: "删除", oldSideAny: "老设备", newSideAny: "新设备", groupLogicHint: "组内且,组之间或", sideDontCare: "不限制此侧", sideDontCareHint: "只按另一侧条件判定。", groupN: "组 {{n}}", addAnd: "组内再加一条(且)", addOr: "再加一组(或)", addAndShort: "+ 且", addOrShort: "+ 或组", addSuccessRow: "+ 成功规则", addAnomalyRow: "+ 异常规则", modeAny: "满足任一即可", modeAll: "全部同时满足", addCond: "添加条件", pickField: "选择字段…", condValue: "取值", opEmpty: "为空", opNotEmpty: "非空", opChanged: "相对基线变了", opUnchanged: "相对基线没变", op_eq: "等于", op_ne: "不等于", op_in: "属于", op_not_in: "不属于", op_empty: "为空", op_not_empty: "非空", op_changed: "相对基线变了", op_unchanged: "相对基线没变", and: "且", groupPresence: "存在性", groupValue: "值变更", groupStatus: "状态类", groupField: "字段条件", tokRemoved: "消失", tokAdded: "新增", tokUnchanged: "未变", tokChanged: "有变化", tokUp: "up", tokDown: "down", tokOther: "其它状态", or: "或", tagSkip: "跳过", tagRules: "{{n}} 条", tagEmpty: "未配", needCompareFirst: "请先选择带 sheets 的对比模板。", showMore: "更多:备注 / 高频采集 / JSON", hideMore: "收起更多", showJson: "高级:编辑 JSON", hideJson: "回到可视化编辑", }, portTraffic: { title: "端口流量监控", create: "添加设备监控", backList: "返回列表", created: "已添加设备监控", createFailed: "创建失败", updated: "已保存", interfacesSaved: "接口已更新", started: "已启动", paused: "已暂停", stopped: "已停止", statusRunning: "运行中", statusPaused: "已暂停", statusStopped: "已停止", statusDraft: "草稿", collecting: "采集中", deleted: "已删除", confirmDelete: "删除该设备监控及其采样数据?", empty: "暂无设备监控。请先选择网元并勾选接口。", keywordPh: "名称 / IP / 备注 / ID", allStatus: "全部状态", exportDevicesName: "port-traffic-devices", exportEventsName: "port-traffic-events", wall: "监控大屏", wallTitle: "端口流量大屏", toDevices: "设备管理", wallEmpty: "暂无监控设备。请先添加设备并勾选接口。", fullscreen: "全屏", exitFullscreen: "退出全屏", board: "大屏", boardPick: "选择大屏", boardPickHint: "请选择或新建一张流量大屏。", boardEmpty: "还没有大屏。可新建一张用于割接/值班监控。", boardDefaultName: "未命名大屏", boardName: "名称", boardCols: "列数", boardCreate: "新建大屏", boardEdit: "编辑布局", boardSave: "保存", boardCancel: "取消", boardSaved: "大屏已保存", boardCreated: "大屏已创建", boardDeleted: "大屏已删除", boardConfirmDelete: "删除该大屏及其图格配置?", boardUnsavedLeave: "有未保存的修改,确定离开?", boardOpenTab: "新页签打开", boardOpen: "打开大屏", boardListHint: "点击条目在独立页签打开大屏;从工作台打开网络管理不会刷新已打开的大屏。", boardPanelCount: "图格数", boardUpdated: "更新时间", boardClosedHint: "可关闭本页签;也可回到网络管理 → 流量大屏列表重新打开。", boardAddPanel: "添加图格", boardNoPanels: "该大屏还没有图格,请编辑并添加监控接口。", boardPickDevice: "选择设备", boardPanelSettings: "图格设置", boardPanelTitle: "标题(可选)", boardColSpan: "跨列", boardPanelStale: "接口已失效或不存在,请重新选择。", boardRetarget: "重选接口", edit: "编辑", save: "保存", start: "启动", pause: "暂停", stop: "停止", delete: "删除", wizStep1: "选设备", wizStep2: "选接口", wizStep3: "参数", step1: "参数", step2: "选网元", step3: "选接口", step4: "确认", prev: "上一步", next: "下一步", fieldTitle: "任务名称", titlePh: "例如:上联链路组", titleRequired: "请填写任务名称", portsRequired: "请至少选择一个接口", interval: "周期(秒)", retention: "保留(天)", retentionHintWizard: "若需上周同日对比,建议 ≥8 天", concurrency: "并发", note: "备注", notePh: "可选", startNow: "创建后立即启动", neKeywordPh: "名称 / IP / 厂商", deepLinkHint: "已从拓扑跳转:网元 {{ne}}{{ifname}}。请确认选中后继续。", deepLinkIfname: ",接口 {{ifname}}", selectedNe: "已选 {{count}} 台网元", selectedOneNe: "已选", selectedPorts: "已选 {{count}} 个接口", pickNeFirst: "请先选择一台网元", discover: "拉取接口", discoverDetail: "拉取详情", discoverCommand: "命令", discoverRaw: "原始日志", discoverOk: "拉取成功", discoverFail: "拉取失败", confirmCreate: "开始监控", wallTask: "任务", wallDevice: "设备", wallPort: "接口", wallDeviceLabel: "网元", pickPort: "选择接口", range: "时间范围", compare: "周期对比", compareOff: "关闭", compareDay: "昨日同时刻", compareWeek: "上周同日", compareShift: "前一窗", compareCustom: "自定义偏移", offsetHours: "偏移(小时)", aheadHours: "向后延长(小时)", aheadHoursHint: "图表终点相对当前时刻再往后延长。开启周期对比时可看到对照曲线在「现在」之后的走势;0 表示截止到现在。", mapBaselineHint: "映射基线可与周期对比叠加使用;需要昨日对照时请自行打开「昨日同时刻」。", baseline: "基线", baselineAt: "基线原时刻", baselineDevice: "基线网元", baselinePort: "基线接口", seriesCurrentIn: "当前 In", seriesCurrentOut: "当前 Out", seriesBaselineIn: "基线 In", seriesBaselineOut: "基线 Out", mapBaselinePort: "映射基线接口", mapBaselineTask: "映射基线任务", mapBaselineNone: "不映射", retentionHint: "周对比建议保留天数 ≥ 8;否则基线可能无数据。", collectNow: "立即采集", collectStarted: "已触发采集", collectBusy: "采集进行中", targetError: "接口最近错误", waitSamples: "设备运行后会按周期写入样点;也可点「立即采集」。图会每几秒自动刷新。", waitAfterError: "采集失败,请到「流量监控」操作中的日志查看详情,修复后可点「立即采集」重试。", log: "日志", logTitle: "采集日志", logEmpty: "暂无日志。", logDevice: "设备", logLevel: "级别", logTime: "时间", logMessage: "内容", logClose: "关闭", logHasError: "有错误", rebind: "重新绑定网元", rebindTitle: "重新绑定网元", rebindCurrent: "当前监控", rebindOk: "已重新绑定网元,可继续采集", rebindFailed: "重新绑定失败", rebindHint: "请手动选择正确的网元并确认。同 IP 不一定是同一台设备,且 IP 可能不唯一;历史采样会保留。", rebindEmpty: "没有可选网元,请先在设备管理中加回。", rebindSameIp: "同 IP", rebindSameIpHint: "与当前监控记录的 IP 相同,请仍核对手动选择", rebindSubmit: "确认绑定", rebindConfirm: "确认将监控绑定到 {{ne}}?绑定后将按该网元采集,历史采样保留。", err: { managedNeNotFound: "管理网元不存在(可能已删除后重建,ID 已变)。请点「重新绑定网元」手动选择。", targetErrors: "{{count}} 个接口采集失败", unsupportedVendor: "不支持的厂商/设备类型", invalidSource: "无效的网元来源", rebindPickFirst: "请先选择要绑定的网元", rebindNeMissing: "所选网元不存在,请刷新列表后重选", rebindSourceMismatch: "网元来源与监控不一致", alreadyMonitored: "目标网元已有另一条监控,无法绑定", }, kpiLatest: "最新", kpiBw: "带宽", latestAt: "最新样点", hoverPoint: "光标位置", wallLiveTitle: "实时流量", filterView: "视图", filterMap: "映射基线", yMode: "纵轴", yModeAuto: "自动(含基线)", yModeCurrent: "按当前流量", yModeUtil: "利用率 %", kpi: { tasks: "任务数", devices: "监控设备", running: "运行中", ports: "监控接口", samples24h: "24h 样点", }, col: { title: "任务", device: "设备", status: "状态", ports: "接口", interval: "周期", last: "最近采集", actions: "操作", source: "来源", name: "设备", vendor: "厂商", ifname: "接口", bw: "带宽", upDown: "Admin / Phy / Prot", admin: "Admin", phy: "Phy", prot: "Prot", description: "描述", }, }, lldpLinks: { title: "LLDP 链路", collectNow: "立即采集", retryFailed: "一键重试失败", started: "已启动 LLDP 采集", pause: "暂停", resume: "继续", stop: "停止", confirmStop: "停止后将取消未扫描的网元,确定停止本轮采集?", paused: "已暂停", resumed: "已继续", stopped: "已停止采集", policyTitle: "采集策略", policySaved: "策略已保存", enabled: "启用周期调度", autoAddUnmatched: "发现时自动入库未匹配网元(占位)", autoAddUnmatchedHint: "周期采集与画布单点发现共用;关闭则未匹配邻居只记未匹配、不建占位网元。默认开启。", intervalDays: "周期(天)", interval: "采集周期", intervalUnitDays: "天", intervalUnitHours: "小时", concurrency: "并发", historyKeep: "任务保留数", scope: "范围", scopeAll: "全部网元(纳管+UME)", scopeSelected: "指定网元", savePolicy: "保存策略", selectedCount: "已选 {{count}} 台", targetKeywordPh: "名称 / IP / 厂商", jobsTitle: "采集任务", jobDetailTitle: "任务明细", expand: "详情", edgesTitle: "Fabric 链路", edgeKeywordPh: "本端 / 对端名称或 IP", edgeStatusAll: "全部状态", edgeStatusActive: "活跃", edgeStatusMissing: "未发现", edgeSourceAll: "全部来源", exportEdgesName: "lldp-fabric-edges", exportJobsName: "lldp-collect-jobs", exportItemsName: "lldp-job-items", statusAll: "全部状态", jobKeywordPh: "任务 ID / 错误 / 范围", itemKeywordPh: "网元名称 / IP / 错误", itemResultAll: "全部结果", missCount: "未发现周期", replacedBy: "已被替换", kpi: { nodes: "Fabric 网元", edges: "活跃链路", missing: "未发现", running: "进行中", idle: "空闲", last: "最近任务", nextDue: "下次调度", }, col: { source: "来源", name: "设备", vendor: "厂商", trigger: "触发", scope: "范围", status: "状态", progress: "进度", edges: "链路", missingDelta: "未发现/清理", started: "开始", ended: "结束", neighbors: "邻居", error: "错误", aSide: "本端", bSide: "对端", aPort: "本端口", bPort: "对端口", lastSeen: "最近看见", }, jobStatus: { running: "运行中", pending: "排队中", paused: "已暂停", done: "已完成", failed: "失败", cancelled: "已取消", stopped: "已停止", }, triggerMode: { manual: "手动", schedule: "周期", topology: "拓扑画布", retry_failed: "重试失败", }, jobScope: { all: "全部网元", ne_ids: "指定网元", selected: "指定网元", }, itemResult: { ok: "成功", warn: "警告", fail: "失败", }, edgeSource: { lldp: "LLDP", manual: "手动", stale: "陈旧", }, }, configSync: { title: "配置同步", syncNow: "立即全量同步", retryFailed: "一键重试失败", pause: "暂停", resume: "继续", stop: "停止", confirmStop: "停止后将取消未执行的网元任务,确定停止本轮同步?", started: "已启动同步周期", paused: "已暂停", resumed: "已继续", stopped: "已停止同步周期", policyTitle: "同步策略", policySaved: "策略已保存", enabled: "启用周期调度", intervalDays: "周期(天)", concurrency: "并发", historyKeep: "配置历史保留", cycleKeep: "任务保留数", scope: "范围", scopeAll: "全部网元", scopeSelected: "指定网元", savePolicy: "保存策略", selectedCount: "已选 {{count}} 台", targetKeywordPh: "名称 / IP / 厂商", cyclesTitle: "同步周期", cyclesEmpty: "暂无同步周期", tasksTitle: "周期任务", taskKeywordPh: "名称 / IP / 消息", keywordPh: "ID / 触发 / 消息", statusAll: "全部状态", allStatus: "全部状态", exportCyclesName: "config-sync-cycles", exportTasksName: "config-sync-tasks", expand: "详情", collapse: "收起", kpi: { snapshots: "配置覆盖数", running: "进行中", idle: "空闲", last: "最近一轮", nextDue: "下次调度", }, col: { source: "来源", name: "设备", vendor: "厂商", trigger: "触发", status: "状态", progress: "进度", started: "开始", ended: "结束", message: "消息", actions: "操作", }, }, networkDevices: { title: "设备列表", keywordPh: "名称 / IP / ID", allSource: "全部来源", empty: "暂无网元。", exportName: "network-devices", col: { source: "来源", name: "名称", vendor: "厂商", deviceType: "设备类型", connect: "连通状态", actions: "操作", }, }, networkConfigs: { title: "配置信息", keywordPh: "名称 / IP / ID", vendorPh: "厂商", allSource: "全部来源", empty: "暂无已同步配置。请先在「配置同步」执行采集。", view: "查看", export: "导出", exportBoth: "导出全部", exportOk: "配置已导出", exportListName: "network-configs", close: "关闭", tabSet: "Set 格式", tabHier: "层级格式", col: { name: "设备", vendor: "厂商", source: "来源", size: "大小", collected: "采集时间", }, }, layout: { title: "UME 对接", titleUme: "UME同步", titleNetwork: "网络管理", titleManagedNe: "网元管理", titleCollect: "批量采集", titleWebcrt: "WebCRT", titleTopology: "拓扑管理", titlePortTrafficWall: "流量大屏", titleUsers: "用户管理", titleAudit: "操作审计", titleApiKeys: "API Key", titleSessions: "登录会话", navUme: "UME 对接", netxApi: "netx api", oclawBridge: "oclaw WSS", activeTasks: "活跃任务 {{count}}", activeTasksHint: "打开操作审计 · 任务概览", language: "语言", switchLanguage: "切换语言 / Switch language", moreMenu: "更多", langZh: "中文", langEn: "English", }, auth: { loginTitle: "登录", username: "用户名", password: "密码", login: "登录", loggingIn: "登录中…", loginFailed: "登录失败", logout: "退出", sessionsTitle: "登录会话", sessionsHint: "管理当前账号在各浏览器/设备上的登录。IP 经反代时会取真实客户端地址;同公网出口可用「客户端」列区分浏览器/系统。踢掉会话后对方需重新登录。", sessionsEmpty: "当前没有活跃会话。", revokeOtherSessions: "踢掉其他会话", revokeSession: "踢掉", sessionCurrent: "当前", sessionRevoked: "会话已吊销", sessionsRevokedOthers: "已踢掉 {{count}} 个其他会话", revokeCurrentConfirm: "这是当前会话,踢掉后需要重新登录。继续?", colSession: "会话", colClient: "客户端", colLastSeen: "最近活动", colCreated: "创建时间", usersTitle: "用户管理", usersHint: "仅管理员可创建与管理本地账号。", addUser: "添加用户", role: "角色", roleAdmin: "管理员", roleUser: "普通用户", status: "状态", active: "启用", disabled: "禁用", enable: "启用", disable: "禁用", actions: "操作", newPassword: "新密码", resetPassword: "重置密码", userCreated: "用户已创建", userUpdated: "用户已更新", auditTitle: "操作审计", auditHintAdmin: "查看所有用户的登录与操作记录。", auditHintUser: "查看你自己的操作记录。", filterUsername: "用户名筛选", filterAction: "动作筛选", colTime: "时间", colUser: "用户", colAction: "动作", colMethod: "方法", colPath: "路径", colStatus: "状态码", colIp: "IP", apiKeysTitle: "API Key 管理", apiKeysHelp: "网页登录不用 API Key,Key 给 MCP/脚本与 netxops 用。生成时默认 alarms:read + ne:read + ne:write + ne:exec + biz-monitor:read,之后用「改权限」增减(保存即生效,不必重生明文)。明文仅创建时显示一次。管理员可代其他用户签发,权限不能超过所属用户已有能力;未接的项为预留。全站未吊销 Key 上限 {{max}} 把(吊销后可再建)。", tokenQuota: "未吊销 {{active}} / {{max}}", tokenLimitReached: "已达 API Key 上限({{max}}),请先吊销不用的 Key", tokenName: "名称", expiresIn: "有效期", expire7d: "7 天", expire30d: "30 天", expire90d: "90 天", expire365d: "1 年", expireNever: "永不过期", tokenOwner: "所属用户", tokenOwnerSelf: "自己({{user}})", createToken: "生成 Key", tokenCreated: "API Key 已生成", tokenUpdated: "权限已更新", tokenRevoked: "已吊销", tokenOnceHint: "请立即复制保存,关闭后无法再次查看明文:", copyToken: "复制", tokenCopied: "已复制到剪贴板", tokenCopyFailed: "复制失败", expiresAt: "到期时间", lastUsed: "最近使用", tokenStatusActive: "有效", tokenStatusExpired: "已过期", tokenStatusRevoked: "已吊销", revokeToken: "吊销", revokeConfirm: "确定吊销该 API Key?", editScopes: "改权限", saveScopes: "保存权限", scopesUnsetLegacy: "未限定(等同所属用户)", scopesCol: "权限", scopesRequired: "请至少勾选一项权限", scopesNoneAvailable: "当前所属用户没有可授予的权限", scopeAlarmsRead: "alarms:read — 告警只读(netx MCP)", scopeNeRead: "ne:read — 网元/拓扑只读(MCP)", scopeNeWrite: "ne:write — 网元/拓扑写入、画图(MCP)", scopeNeExec: "ne:exec — 托管网元 CLI(netx MCP)", scopeBizMonitorRead: "biz-monitor:read — 业务监控/割接只读(netxops)", scopeSql: "sql:query — UME SQL(netx MCP)", scopeWebcrt: "webcrt:session — WebCRT(预留 MCP)", scopeAdminUsers: "admin:users — 用户管理(预留 MCP)", scopeOpsWrite: "ops:write — 运维写/订阅(预留 MCP)", forceChangeTitle: "请修改初始密码", forceChangeHint: "账号 {{user}} 仍在使用默认密码,登录前必须先修改。", oldPassword: "当前密码", confirmPassword: "确认新密码", savePassword: "保存新密码", savingPassword: "保存中…", passwordTooShort: "新密码至少 8 位", passwordMismatch: "两次输入的新密码不一致", passwordMustChange: "新密码不能与默认/旧密码相同", }, collect: { statusAll: "全部状态", keywordPh: "任务名称 / ID", exportJobsName: "collect-jobs", exportRunsName: "collect-runs", policyTitle: "采集策略", policyHint: "默认不启用周期(只采一次);勾选后按周期自动创建并执行。默认保留最近 3 次任务数据。", policySaved: "策略已保存", enabled: "启用周期调度", interval: "采集周期", intervalUnitDays: "天", intervalUnitHours: "小时", historyKeep: "任务保留数", scope: "范围", scopeAll: "全部网元(纳管+UME)", scopeSelected: "仅选中网元", savePolicy: "保存策略", collectNow: "立即采集", selectedCount: "已选 {{count}} 台", colSource: "来源", policyCommandsRequired: "启用周期或立即采集前,请先填写采集命令并保存策略", policyTargetsRequired: "选定范围内没有可用网元,请调整范围或勾选网元", create: { title: "新建采集任务", hint: "配置命令与网元后创建任务;创建后需在任务列表中点击「开始」执行采集。", selectedTitle: "已选择网元", selectedEmpty: "请从下方筛选并逐个添加网元。", selectedCount: "共 {{count}} 台", clearSelected: "清空已选", remove: "移除", pickTitle: "可选网元", pickHint: "可选网元管理与 UME 清单中的全部网元(不限连通性状态)。UME 使用 CLI 连接模板凭据。", pickEmpty: "没有匹配的网元。", filterKeyword: "筛选", filterKeywordPh: "名称 / IP / 厂商 / 设备类型", add: "添加", addBatch: "批量添加({{count}})", added: "已添加", create: "创建任务", creating: "创建中…", expand: "新建", collapse: "关闭", meta: "已选 {{ne}} 台网元 · {{cmd}} 条命令", }, eligible: { title: "可选网元", hint: "可选网元管理与 UME 清单中的全部网元(不限连通性状态)。", empty: "暂无网元。", }, form: { title: "采集配置", jobTitle: "任务名称", jobTitlePh: "留空则自动生成", commands: "采集命令(每行一条,# 开头为注释)", commandsPh: "display version\ndisplay current-configuration", commandsHint: "命令将按顺序在每台设备上执行,输出合并为一份文本日志。", meta: "已选 {{ne}} 台网元 · {{cmd}} 条命令", start: "开始采集", starting: "提交中…", }, created: "采集任务已创建:{{id}}", started: "采集已开始:{{id}}", paused: "任务已暂停", restarted: "已重新开始采集", retryFailedDone: "已开始重采失败网元", deleted: "任务已删除", nothingToRetry: "没有可重试的失败网元", neBusy: "部分网元正在被其他采集任务占用,请等待其完成后再开始", jobRunning: "该任务已在执行中", confirmDelete: "确定删除该采集任务?相关日志文件将一并删除。", jobs: { title: "采集任务", listTitle: "任务列表", col: { title: "任务", status: "状态", progress: "进度", created: "创建时间", lastRun: "最近执行", actions: "操作", }, ok: "成功", fail: "失败", expand: "详情", collapse: "收起", detailTitle: "任务明细", pause: "暂停", start: "开始", starting: "启动中…", restart: "重新开始", retryFailed: "重采失败网元", downloadResults: "下载结果", delete: "删除", autoRefresh: "任务进行中,每 2 秒自动刷新", runsInProgress: "部分网元仍在采集中,请稍候…", }, kpi: { jobs: "任务总数", running: "进行中", idle: "空闲", last: "最近任务", active: "活跃任务", nextDue: "下次周期", }, runs: { status: "状态", message: "说明", download: "日志", downloadFile: "下载", filterStatus: "状态筛选", filterDevice: "设备筛选", deviceKeywordPh: "名称 / IP", allStatus: "全部状态", }, }, managedNe: { title: "网元管理", credsNotConfigured: "未配置 NETX_CREDENTIAL_SECRET_KEY,无法保存密码。请在 .env 中设置 Fernet 密钥后重启 API。", add: "新增网元", importBtn: "批量导入", downloadTemplate: "下载导入模板", importing: "导入中…", edit: "编辑", delete: "删除", openTerminal: "终端", confirmDelete: "确定删除该网元?若拓扑中仅绑定此运维网元(无 UME),将同时删除对应 Fabric 节点及其直连链路。", batchDelete: "批量删除", batchDeleting: "删除中…", batchDeleteConfirm: "确定删除选中的 {{n}} 台网元?不可恢复。仅绑定运维侧的节点会级联清除 Fabric 节点与直连链路;仍绑 UME 的会保留拓扑。", batchDeleteDone: "已删除 {{n}} 台网元", batchDeleteSelectRequired: "请先勾选要删除的网元", keywordPh: "名称 / IP / 用户名 / 标签", allVendors: "全部厂商", allConnectStatus: "全部连通状态", stats: { title: "统计", total: "共 {{n}} 台网元", pass: "已连通", fail: "失败", unknown: "未测试", testing: "测试中", batchProxy: "一键添加代理", batchTest: "一键连通性测试", tagFilter: "按标签筛选", all: "全部", allTag: "全部(无标签筛选)", noTag: "无标签", tagStats: "按标签统计(Top)", confirm: "将对 {{n}} 台网元执行操作,确认继续?", proxyDone: "已为 {{n}} 台网元提交代理配置", testDone: "已提交 {{n}} 台网元连通性测试", loadingIds: "加载中…", }, col: { name: "名称", vendor: "厂商", deviceType: "设备类型", execPolicy: "CLI 执行策略", source: "来源", ip: "管理地址", port: "端口", protocol: "协议", user: "用户名", password: "密码", tags: "标签", remark: "备注", connect: "连通性", testedAt: "测试时间", actions: "操作", }, execPolicy: { readonly: "只读(show/display/ping)", linuxShell: "Shell/脚本(允许多行/heredoc)", unrestricted: "实验室全开(允许多行/heredoc)", hint: "仅影响 MCP/API 的 execManagedNe。默认只读;Linux 与 MikroTik(routeros/switchos)可选 shell / 实验室全开,支持多行脚本与 heredoc。", }, source: { manual: "手工", ume_sync: "UME 同步", webcrt: "WebCRT", lldp: "LLDP 占位", topology: "拓扑占位", }, connect: { run: "连通性测试", running: "测试中…", submitted: "已提交 {{n}} 台设备测试", retest: "重新测试", }, connectDetail: "详情", connectDetailTitle: "连通性测试日志", connectDetailEmpty: "暂无日志。请先执行连通性测试;失败时会记录完整错误与跳板上下文(不含密码)。", umeSync: { sync: "同步 UME 网元", syncing: "同步中…", delete: "删除 UME 网元", deleting: "删除中…", deleteConfirm: "确定删除所有通过 UME 同步到网元管理中的网元?不可恢复。仅绑定这些 ManagedNE、且无 UME 投影的 Fabric 节点会连同直连链路一并清除。", done: "UME 同步完成:新增 {{inserted}},更新 {{updated}},删除 {{deleted}},UME 清单共 {{total}} 台", deletedDone: "已删除 {{n}} 台 UME 同步网元", }, account: { batchAdd: "一键添加账号", batchByTag: "按标签添加账号", batchTitle: "批量添加账号", batchHint: "将以下账号信息应用到已选中的 {{n}} 台网元。", batchByTagHint: "将以下账号信息应用到指定标签下的网元;密码可留空,仅更新用户名。", batchDone: "已为 {{n}} 台网元更新账号", selectRequired: "请先勾选要配置账号的网元", applying: "应用中…", apply: "应用到网元", usernameOrPasswordRequired: "用户名和密码至少填写一项", passwordOptionalBatch: "留空则不修改", }, help: "【批量导入】\n" + "· 必填列:device_type、ip、username、port、protocol、name、vendor;可先下载模板。\n" + "· password 可留空(直连需填;堡垒机托管或后续批量添加代理时可空)。\n" + "· 推荐流程:先导入网元 → 勾选网元 → 点「批量添加代理」统一配置跳板/堡垒机。\n\n" + "【跳板 / 堡垒机】\n" + "· 堡垒机 SSH 用户名模板:{hop_user}@{target_user}@{target_ip}(堡垒机地址单独填在跳板地址);命令行等价:ssh 用户@目标@IP@堡垒机。\n" + "· 堡垒机托管时填「跳板密码」(Vault 密码),目标密码可留空;手动模式需填目标密码。\n" + "· JumpServer/CBH 常用跳板端口 2222,部分现场为 22。\n\n" + "【连通性 / 编辑】\n" + "· 保存密码需配置 NETX_CREDENTIAL_SECRET_KEY。\n" + "· 编辑时密码留空表示不修改;连通性失败请点「详情」查看 hop 上下文(不含密码)。", importResult: { done: "导入完成:新增 {{inserted}},更新 {{updated}},失败 {{failed}} 行", }, form: { requiredHint: "带 * 为必填项", nameConnectHint: "连通性测试成功后将自动更新为设备名称", createTitle: "新增网元", editTitle: "编辑网元", save: "保存", saving: "保存中…", cancel: "取消", created: "网元已创建", updated: "网元已更新", deleted: "网元已删除", passwordRequired: "请填写密码", passwordOptional: "留空则不修改", }, hop: { sectionTitle: "跳板 / 代理", type: "跳板类型", enable: "经跳板登录目标网元", vendor: { zte: "ZTE 设备(CLI 跳登)", huawei: "华为设备(CLI 跳登)", cisco: "思科设备(CLI 跳登)", linux: "Linux 服务器(SSH 隧道)", bastion: "堡垒机(SSH 协议代理)", }, zteHint: "在 ZTE 设备上执行 ssh/telnet 命令跳转到目标,目标账号由二次认证输入。", huaweiHint: "在华为设备上执行 telnet / stelnet(SSH)跳登;stelnet 即 SSH。目标账号由二次认证输入。", ciscoHint: "在思科设备上执行 ssh -vrf / telnet /vrf 跳登,目标账号由二次认证输入。", linuxHint: "先 SSH 登录 Linux 跳板,经 direct-tcpip 隧道连接目标 IP:端口(等同 ProxyJump)。", bastionHint: "SSH 复合用户名直连堡垒机(跳板地址可为 IP 或域名),由堡垒机协议代理到目标。示例:bastion-user@target-user@198.51.100.20@192.0.2.10 或 bastion-user@target-user@198.51.100.20@ssh-bastion.example.com;密码为 Vault/堡垒机密码。JumpServer/CBH 常用端口 2222。", targetAuthMode: "目标凭据", targetAuthBastionManaged: "堡垒机托管(目标密码可留空)", targetAuthManual: "手动输入(连接后二次认证)", targetAuthHint: "堡垒机托管时仅需堡垒机密码;手动模式需填写目标网元密码。", usernameTemplate: "SSH 用户名模板", templateHintBastion: "默认 {hop_user}@{target_user}@{target_ip},堡垒机地址(IP 或域名)填「跳板地址」。命令行示例:ssh bastion-user@target-user@198.51.100.20@ssh-bastion.example.com。", host: "跳板地址", hostPlaceholderBastion: "192.0.2.10 或 ssh-bastion.example.com", hostHintBastion: "支持 IP 或 FQDN。也可粘贴完整 SSH 目标串(如 bastion-user@target-user@198.51.100.20@ssh-bastion.example.com),失焦后自动拆成跳板用户名与地址。", port: "跳板端口", protocol: "跳板协议", protocolSshStelnet: "ssh(stelnet)", username: "跳板用户名", password: "跳板密码", vrf: "管理 VRF(可选)", vpnInstance: "VPN-Instance(可选)", vrfCisco: "VRF(可选,如 MGMT)", enterSystemView: "跳登前是否进入系统视图", enterSystemViewNo: "不进入(用户视图,默认)", enterSystemViewYes: "进入系统视图(system-view)", enterSystemViewHint: "部分华为跳板仅在系统视图下支持 stelnet/telnet。需自行选择;不会因失败自动重试。", commandTemplate: "跳登命令模板", templateHint: "ZTE 常用:telnet {target_ip}、telnet {target_ip} vrf {vrf}、ssh {target_ip}、ssh {target_ip} vrf {vrf}。按跳板协议与 VRF 自动推荐;留空时后端同样规则。目标账号密码由二次认证提示输入。", templateHintHuawei: "华为常用:telnet {target_ip}、telnet vpn-instance {vrf} {target_ip}、stelnet {target_ip}、stelnet {target_ip} -vpn-instance {vrf}。SSH 协议对应 stelnet。留空时按协议与 VPN-Instance 自动推荐。", templateHintCisco: "思科常用:ssh {target_ip}、ssh -vrf {vrf} {target_ip}、telnet {target_ip}、telnet {target_ip} /vrf {vrf}。留空时按协议与 VRF 自动推荐。", badge: { zte: "ZTE跳板", huawei: "华为跳板", cisco: "思科跳板", linux: "Linux跳板", bastion: "堡垒机", }, hostRequired: "请填写跳板地址", userRequired: "请填写跳板用户名", passwordRequired: "请填写跳板密码", batchAdd: "添加代理", batchTitle: "批量添加代理", batchHint: "将以下跳板配置应用到已选中的 {{n}} 台网元(会覆盖原有跳板设置)。", batchDone: "已为 {{n}} 台网元配置代理", selectRequired: "请先勾选要配置的网元", applying: "应用中…", apply: "应用到选中网元", }, }, ume: { token: { title: "UME Token 状态", disconnected: "disconnected", connected: "connected", connectedRenew: "connected (需续期)", expiresIn: "expires_in", needsRenew: "需续期 / 0s", preview: "preview", refreshStatus: "刷新状态", renewLogin: "手动续期/登录", renewing: "续期中…", disconnect: "断开 token", disconnecting: "断开中…", renewOkChanged: "续期成功,token 已更新", renewOkSame: "续期完成(与此前一致)", disconnectOk: "已断开 UME token", renewHint: "库中 token 缺少有效过期时间或已过期,请点「手动续期/登录」或等待后台自动续期", }, subscription: { title: "UME 告警订阅(WebSocket)", help: "订阅需手动建立/取消;建立后(或重启后若库中仍有有效订阅)后台会自动连接 WSS 接收实时告警。后台任务 alarms_current_ws_consumer 的 pause/resume 会停止或恢复 WSS 连接(不会取消 UME 订阅)。", sub: "订阅", subActive: "已建立", subInactive: "未建立", wssPaused: "已暂停", wssModeBanner: "当前告警由 WSS 实时维护(模式: {{mode}}),定时 REST 全量同步已暂停。需要全量对账时请使用下方「同步当前告警」。", serverLostBanner: "UME 服务器侧告警订阅已丢失或已过期,本地记录可能仍显示「已建立」。请确认清除本地记录后重新订阅。", establish: "建立告警订阅", establishing: "建立订阅…", reestablish: "清除本地并重新订阅", reestablishing: "重新订阅…", cancel: "取消告警订阅", cancelling: "取消订阅…", refreshStatus: "刷新订阅状态", clearLocalOnly: "仅清除本地记录", clearing: "清除中…", opFailed: "订阅操作失败", confirmClearDefault: "UME 侧告警订阅已不存在或已过期(服务器订阅已丢失)。\n\n是否清除本地订阅记录?清除后可点击「建立告警订阅」重新订阅。", confirmReestablish: "将清除本地订阅记录并在 UME 上重新建立告警订阅,是否继续?", titleLoginFirst: "请先登录 UME token", titleReestablish: "清除本地失效记录并重新向 UME 建立订阅", establishInvalid: "建立订阅未返回有效 id/uri", establishExists: "订阅已存在,未重复建立(WSS 将保持/恢复连接)", establishOk: "告警订阅已建立,WSS 将自动连接", clearLocalOk: "已清除本地订阅记录,可重新建立订阅", serverLostMsg: "UME 侧告警订阅已丢失。请确认是否清除本地订阅记录后重新订阅。", cancelFailed: "取消订阅失败:UME 侧订阅可能仍存在,请查看错误详情后重试", cancelOkMissing: "本地已清除(UME 侧订阅此前已不存在)", cancelOk: "告警订阅已取消", wsLogs: "WSS 运行日志", wsActivity: "最近活动 {{time}}", wsAutoRefresh: "自动刷新", wsLogsEmpty: "暂无日志(建立订阅并连接 WSS 后会出现连接、收包、重连等记录)", }, keyAlert: { title: "AI 告警监控", showPanel: "详情", hidePanel: "关闭", help: "按 notificationId 精确匹配,或按告警描述关键字模糊匹配(不区分大小写,匹配 nativeProbableCause 等字段);可选限定 UME Inventory 中的网元类型 (ne_type),不选则匹配全部设备。命中后由 NetX 作为服务器广播给已订阅的 Netx Ops(DSH)客户端。", hub: "DSH 订阅", hubConnected: "有订阅", hubEmpty: "无订阅", hubSubscribers: "订阅数", hubPublished: "已广播", hubDeliverOk: "投递成功", hubDeliverFail: "投递失败", hubConnections: "当前连接", hubColId: "连接 ID", hubColUser: "用户", hubColRemote: "远端", hubColClient: "客户端", hubColConnected: "连入时间", hubColLastSeen: "最近心跳", hubEmptyConnections: "当前没有 Netx Ops 客户端连入告警 hub", hubPath: "路径", matchType: "匹配方式", matchNotificationId: "告警码 (notificationId)", matchKeyword: "告警描述关键字", matchValuePhNotificationId: "输入 notificationId", matchValuePhKeyword: "输入匹配关键字(不区分大小写)", label: "规则描述", labelPh: "必填,如 BGP Down", neTypesLabel: "设备类型(可选,多选)", neTypesHint: "不选表示全部设备类型;选项来自 UME Inventory 同步后的 ne_type。", neTypesEmpty: "暂无设备类型,请先同步 Inventory", neTypesAll: "全部", forwardOnClear: "告警清除时也推送", forwardOnClearHelp: "全局开关:对所有监控规则生效。默认只在告警新增/更新时推送;勾选后,UME 上报告警已清除时也会向已订阅的 Netx Ops 推送清除通知。", add: "添加规则", adding: "添加中…", delete: "删除", edit: "修改", editTitle: "修改监控规则", save: "保存", saving: "保存中…", cancel: "取消", editOk: "规则已更新", pickFromAlarms: "加载当前告警参考", emptyRules: "尚未配置监控规则", colType: "类型", colMatch: "匹配内容", colLabel: "描述", colNeTypes: "设备类型", colForwardClear: "清除推送", colPublished: "发布次数", colAttempts: "尝试次数", colLast: "最近推送", colActions: "操作", colMonitor: "是否监控", monitorOn: "开启", monitorOff: "关闭", filterKeywordPh: "筛选匹配内容 / 描述", filterMatchAll: "全部类型", filterEnabledAll: "全部状态", filterEnabledOn: "监控中", filterEnabledOff: "已暂停", addOk: "已添加监控规则", deleteOk: "已删除", confirmDelete: "确定删除该监控规则?", yes: "是", no: "否", }, sync: { title: "UME 同步", inventory: "同步 Inventory", alarmsCurrent: "同步当前告警", full: "全量同步", failed: "同步失败", }, tasks: { currentTitle: "当前任务", running: "running", noRunning: "当前无运行中的任务", runtimeTitle: "后台任务", runtimeOpFailed: "后台任务操作失败", noRuntime: "暂无后台任务状态", intervalTitle: "Configured sleep between loop iterations (clamped at process start)", lastRunTitle: "Last finished sync for scheduled tasks; refreshed at each loop tick", deletedTitle: "全量对账删除条数:inventory 为网元行,alarms_current 为当前告警行,其余域多为 0", lastErrorCol: "last_error", runtimeError: { startup_alarm_sync_before_ws: "启动中:正在同步当前告警(完成后连接 WSS)…", startup_gate_waiting: "启动 REST 全量同步未完成,定时 REST 与 WSS 均待命", wss_active_skip_rest: "WSS 实时接收中,已跳过 REST 同步", pulling_alarms_current: "正在拉取 UME 当前告警…", alarms_sync_in_progress_skip: "另一条当前告警 REST 同步进行中,已跳过", pulling_inventory: "正在拉取 UME 网元清单…", pulling_topology: "正在拉取 UME 拓扑(节点/链路)…", topology_sync_busy: "拓扑同步进行中,已跳过", ume_ws_disabled_no_base_url: "未启用或未配置 UME_BASE_URL", resumed_sync_soon: "已恢复:将跳过本轮周期等待并尽快同步", resumed_wss_reconnect: "已恢复:将尽快重连 WSS", resumed: "已恢复", keepalive_failed: "Token 保活失败", }, wsState: { init: "初始化", connected: "已连接", connecting: "连接中", disconnected: "已断开", no_subscription: "无订阅", waiting_token: "等待 token", paused: "已暂停", error: "连接异常", reconnecting: "重连等待", subscription_lost: "UME 订阅已丢失", disabled_no_base_url: "未启用或未配置 UME_BASE_URL", }, runtimeTask: { token_keepalive: "UME Token 保活", alarms_current_auto_sync: "当前告警定时同步", alarms_current_ws_consumer: "UME 告警 WSS", inventory_auto_sync: "Inventory 定时同步", topology_auto_sync: "拓扑定时同步", }, }, syncStatus: { title: "同步状态", showPanel: "详情", hidePanel: "关闭", empty: "暂无同步记录", summary: "共 {{total}} 条记录,进行中 {{running}}", fabricGapTitle: "拓扑码头已更新,但尚未灌入拓扑管理(Fabric / UME World)", fabricGapHint: "码头 ME {{dock}},Fabric UME {{fabric}};可一键应用(不拉 UME)。上次状态:{{status}}", applyFabric: "应用到拓扑管理", applyingFabric: "正在应用…", applyFabricOk: "已应用到拓扑管理", }, ne: { title: "网元清单", showPanel: "详情", hidePanel: "关闭", keywordPh: "keyword(ne_id/ne_name/user_label/ip/host_name)", clearTitle: "清空 keyword,回到第 1 页", expand: "详情", collapse: "关闭", cliConnect: "CLI 连通", summary: "Inventory 网元 {{total}} 台", }, tabs: { main: "UME 同步", cli: "CLI 连接", }, cli: { title: "UME CLI 连接配置", showPanel: "详情", hidePanel: "关闭", hint: "为 UME 清单网元配置统一 SSH 凭据与跳板/堡垒机;OClaw MCP 可通过 ume_ne_id 直接执行 show 命令,无需逐台录入 managed_ne。", statusReady: "CLI 配置已就绪,可对 UME 网元执行命令。", statusNotReady: "请填写目标用户名,并配置跳板/堡垒机(若启用)。", profileName: "配置名称", targetUsername: "目标 SSH 用户名", targetPassword: "目标 SSH 密码", passwordKeep: "留空则不修改", newProfile: "新建配置", deleteConfirm: "确定删除该 CLI 配置?", deleted: "配置已删除", saved: "CLI 配置已保存", connectTestTitle: "样本网元连通性测试", sampleNePh: "筛选 UME 网元(名称 / IP / ID)", sampleNeRequired: "请先选择一个 UME 网元", sampleNeEmpty: "无匹配网元", sampleNeLoading: "加载中…", connectTestSubmitted: "已提交连通性测试", connectTestWaiting: "等待测试结果…", connectTestRunning: "连通性测试中…", connectTestResult: "测试结果", existingProfiles: "已有配置", default: "默认", }, alarms: { title: "当前告警", movedHint: "当前告警查询已迁至网络管理 →", showPanel: "展开", hidePanel: "收起", keywordPh: "keyword(告警键/原因/ne_name/host_name/ip 等)", hostNamePh: "host_name(含匹配)", allSeverity: "全部级别", clearedAll: "清除状态:全部", clearedYes: "已清除", clearedNo: "未清除", clearTitle: "清空 keyword、host_name、级别、is_cleared,回到第 1 页", filterByHost: "按该主机名筛选", noHostName: "无 host_name(需先同步网元)", col: { time: "告警时间", severity: "级别", neId: "网元 ID", hostName: "主机名", neType: "网元类型", cause: "原因", }, }, }, webcrt: { title: "WebCRT", deviceList: "设备列表", sessionManager: "设备列表", connect: "连接", hint: "选择网元,在浏览器中打开交互式终端。凭据由服务端解密,不会下发到前端。", hintCrt: "在左侧点击网元即可打开终端;支持托管、会话与 UME;也可用菜单「新建会话」快速登录。", filterKeyword: "筛选", filterKeywordPh: "按名称 / IP / 标签筛选", empty: "没有匹配的网元。可切换来源或调整搜索关键字。", open: "打开终端", opening: "连接中…", opened: "已打开 {{name}}", disconnect: "断开", closed: "会话已断开", termPlaceholder: "尚未打开终端会话", sessionMeta: "{{name}} · {{ip}}", source: { all: "全部", managed: "托管", webcrt: "会话", ume: "UME", }, newSession: { title: "新建会话", claimTitle: "完善占位会话", claimHint: "请填写可达地址;会话名默认使用占位名。连接成功后来源将更新为 WebCRT。", connect: "连接", connecting: "连接中…", protocol: "协议", host: "主机", port: "端口", sessionName: "会话名", sessionNamePh: "可选,默认使用 IP", authTitle: "SSH 登录", savePassword: "保存密码", ipRequired: "请填写主机地址", userRequired: "请填写用户名", passwordRequired: "请填写密码", }, status: { idle: "空闲", connecting: "连接中", connected: "已连接", error: "错误", closed: "已关闭", }, phase: { creating: "创建会话", authenticating: "正在认证", waitingPrompt: "等待设备提示符", hint: "登录过程会实时显示在终端中;设备较慢时可能需要十几秒", }, tabMenu: { close: "关闭", closeOthers: "关闭其他", closeAll: "关闭全部", copyIp: "复制 IP", copyIpOk: "已复制 {{ip}}", copyIpEmpty: "该标签没有 IP", }, treeMenu: { rename: "重命名", renameLabel: "会话名", renameSave: "保存", renameRequired: "请填写会话名", renamed: "会话已重命名", delete: "删除会话", deleteConfirm: "确定删除会话「{{name}}」?此操作不可恢复。", deleted: "会话已删除", }, keywordHl: { title: "关键字突出显示", enabled: "启用", newKeyword: "新建关键字", newKeywordPh: "输入关键字或正则", regex: "正则表达式", add: "添加", colKeyword: "关键字", colRegex: "正则", empty: "尚未添加关键字", moveUp: "上移", moveDown: "下移", remove: "删除", caseSensitive: "区分大小写", color: "字符颜色", saved: "关键字突出显示已保存", }, actions: { reconnect: "重新连接", recordLog: "记录日志", clear: "清空", copy: "拷贝", recording: "记录中", recordingOn: "已开始记录日志", recordingSaved: "日志已保存", copied: "已复制到剪贴板", copyEmpty: "终端内容为空", copyFailed: "复制失败", break: "Break", breakSent: "已发送 Break", broadcast: "广播", broadcastSent: "已广播到全部会话", postLogin: "登录后命令", }, favorites: "收藏", recent: "最近", favorite: "收藏/取消", encoding: "编码", fontSize: "字号", theme: "主题", themeDark: "深色", themeLight: "浅色", colorScheme: "配色方案", backgroundColor: "背景色", foregroundColor: "字体色", scheme: { dark: "深蓝(默认)", blackWhite: "白底黑字", whiteBlack: "黑底白字", greenBlack: "黑底绿字", amberBlack: "黑底琥珀", custom: "自定义", }, copyOnSelect: "选中即复制", pasteDelay: "粘贴最大行间隔", pasteDelayOff: "无延迟(整块发送)", keepalive: "SSH Keepalive", keepaliveOff: "关闭", keepaliveSec: "{{n}} 秒", options: "选项", globalSessionOptions: "全局会话选项", sessionOptionsSave: "保存", sessionOptionsCancel: "取消", sessionOptionsSaved: "已保存全局会话选项", disconnectBanner: "会话已断开", disconnectBannerError: "会话出错或连接中断", broadcastPh: "发送到全部标签…", buttonBarHint: "每行:按钮名|命令", postLoginPrompt: "登录后自动执行(每行一条,仅本设备)", postLoginSaved: "登录后命令已保存", sftp: { title: "SFTP", refresh: "刷新", up: "上级", upload: "上传", uploaded: "上传成功", uploading: "上传 {{done}}/{{total}} · {{name}} {{pct}}", downloading: "下载 {{done}}/{{total}} · {{name}} {{pct}}", downloaded: "已下载 {{count}} 个文件", downloadPartial: "下载完成 {{ok}} 个,失败 {{failed}} 个", uploadPartial: "上传完成 {{ok}} 个,失败 {{failed}} 个", retrying: "重试 {{name}}({{attempt}}/{{max}})…", cancel: "取消", dropHint: "松开以上传到当前目录", dropEmpty: "未识别到可上传的文件", mkdir: "新建", mkdirPrompt: "新建目录名称", mkdirInvalid: "目录名无效(不要包含 / 或 ..)", mkdirOk: "目录已创建", rename: "重命名", renamePrompt: "新名称", renameInvalid: "名称无效(不要包含 / 或 ..)", renamed: "已重命名", download: "下载", chmod: "权限", chmodPrompt: "权限模式(如 755 或 rwxr-xr-x)", chmodOk: "权限已更新", chmodPartial: "权限更新 {{ok}} 个,失败 {{failed}} 个", delete: "删除", deleteConfirm: "确定删除 {{name}}?", deleteRecursiveConfirm: "{{name}} 含目录,非空目录将递归删除,是否继续?", deletePartial: "删除完成 {{ok}} 个,失败 {{failed}} 个", deleted: "已删除", selectedCount: "已选 {{count}} 项", empty: "当前目录为空", listTruncated: "目录条目过多,仅显示前 {{count}} 项(上限 {{max}})", dir: "目录", loading: "正在加载…", enterHint: "单击选中;Ctrl/Shift 多选;双击进入", downloadHint: "单击选中;Ctrl/Shift 多选;双击下载", colName: "名称", colSize: "大小", colMtime: "修改时间", colOwner: "所有者", colGroup: "组", colMode: "权限", resizeHint: "拖动调整 SFTP / 终端宽度", colResizeHint: "拖动调整列宽", }, term: { findPh: "查找…", findPrev: "上一个", findNext: "下一个", findClose: "关闭查找", copy: "复制", paste: "粘贴", pasteEmpty: "剪贴板为空", pasteFailed: "无法读取剪贴板(HTTP 远程请用下方粘贴框,或 Ctrl+V)", pasteBridgeHint: "当前为非 HTTPS 访问,浏览器禁止直接读剪贴板。请在此框按 Ctrl+V 粘贴,内容会发送到终端。", pasteBridgePh: "在此按 Ctrl+V…", pasteBridgeCancel: "取消", clear: "清空", pasting: "粘贴中 {{done}}/{{total}} 行…", wsError: "[WebSocket 错误]", wsClosed: "[WebSocket 已关闭 code={{code}}]", sessionStatus: "[会话 {{state}}{{detail}}]", outputTruncated: "[输出过快,已丢弃 {{count}} 段]", }, err: { deviceType: "不支持的设备类型", ipConflictRestart: "数据库仍限制 IP 唯一,请重启 netx API 后再试", sessionLimit: "并发会话已达上限,请先关闭其他终端", neNotFound: "网元不存在", credsIncomplete: "网元账号或密码不完整", authRejected: "用户名或密码错误,请重新输入", cliProfile: "UME 网元需要先配置 CLI 连接模板(默认账号/跳板)", connectFailed: "登录设备失败:{{detail}}", sftpHop: "SFTP 暂不支持跳板设备,请使用直连 SSH", sftpSsh: "SFTP 仅支持 SSH 协议", sftpNeedPassword: "SFTP 需要已保存的 SSH 密码(会话弹窗密码不会用于文件传输)", sftpUnsupported: "当前 SSH 会话未提供 SFTP(设备可能未开启)", sftpTooLarge: "文件超过大小限制(默认 512MB)", sftpChmodInvalid: "权限模式无效(请用 755 或 rwxr-xr-x)", sftpAborted: "传输已取消", queueDropped: "终端输出过快,已丢弃约 {{count}} 段,内容可能不完整", websocket: "WebSocket 连接失败", }, }, topology: { title: "拓扑管理", maps: "拓扑图", tree: "拓扑树", treeLoading: "加载拓扑树…", treeLoadFailed: "拓扑树加载失败", treeRetry: "重试", graphLoading: "正在加载拓扑图…", graphLoadFailed: "拓扑图加载失败", graphRefreshing: "刷新中…", canvasEmpty: "这张图上还没有网元", canvasEmptyHint: "可用「添加网元」上图,或从左侧换到有设备的区域。", treeHint: "顶级为「根」(导航);其下唯一「根图」为画布。点根图或子区域打开设备画布。", treeSearch: "全拓扑搜索网元", treeSearchPh: "名称 / IP", treeSearchEmpty: "没有匹配的网元", treeSearchNoViews: "未上图", treeSearchNotOnMap: "该网元尚未出现在任何拓扑图上", locateNotOnCanvas: "当前世界地图抽样中没有该网元,且缺少世界坐标,请到下级区域画布查找。", treeSearchViewCount: "{{count}} 张图", treeSearchTruncated: "仅显示前 30 条(共 {{total}})", rootName: "根", selectRegion: "请选择根或区域", openMap: "打开本图", openRegion: "打开", kindPhysical: "物理拓扑", kindCustom: "自定义图", layerNodeHint: "{{count}} 个网元", layerNodeEmpty: "点击创建并打开", rootCanvasHint: "从左侧选择根进入目录。", regionCanvasHint: "点击根图打开设备画布;可在根图上新建子区域。", regionBrowseHint: "根目录:下方为唯一根图。点击打开。", browserTitle: "拓扑目录", browserRegionSub: "共 {{count}} 张拓扑图", browserRegionsSub: "共 {{count}} 个", browserEmptyMaps: "此根下还没有根图。", addNe: "添加网元", more: "更多", backUp: "返回", newRegion: "新建根", newRegionName: "新根", newRegionPrompt: "根名称", newSubRegion: "新建子区域", newSubRegionName: "新子区域", newSubRegionPrompt: "子区域名称", subRegionNotOnFlat: "世界地图不支持子区域,请在 World 或下级区域画布上创建。", worldMapNoDirectNes: "世界地图不能直接添加网元,请到某个子区域画布上添加。", worldMapName: "世界地图", worldMapOffline: "世界地图功能已暂时下线", rootMapName: "根图", worldHud: "世界 {{total}} · 近景 {{cached}} · z{{zoom}} · {{lod}}", worldEmptyCoords: "世界地图还没有坐标", worldEmptyCoordsHint: "码头已有 {{dock}} 个网元,但尚未灌入 Fabric / 世界坐标。可一键应用(不拉 UME)。", worldApply: "应用到世界地图", worldApplying: "正在应用…", worldApplyOk: "已应用到世界地图", subRegionNeedParent: "请先打开根图或区域画布,再新建子区域。", regionCreated: "已创建", regionDeleted: "已删除", deleteRegion: "删除", deleteRegionConfirm: "删除「{{name}}」?其下画布将一并删除。", deleteUmeWorldConfirm: "删除「{{name}}」?将级联删除其下全部 UME 区域与画布。之后若再跑 UME 拓扑同步/应用,可能重新生成。", renameRegion: "重命名", renameRegionPrompt: "名称", regionRenamed: "已重命名", collapseRegion: "折叠", expandRegion: "展开", newCustom: "自定义图", newCustomName: "自定义拓扑", newCustomPrompt: "自定义拓扑图名称", folderHint: "新建根时自动创建唯一「根图」。子区域请在根图画布上创建。", folderHintShort: "根目录", outsidePeers: "图外对端 {{count}} 个(有链路未上图)", outsidePeersView: "未上图网元 {{count}}", outsidePeersTitle: "图外对端", outsidePeersHint: "与画布有链路但未上图。勾选后按需添加,不必一次全部投影。", outsidePeersVia: "经 {{name}}", outsidePeersFilterPh: "筛选:名称 / IP / 经谁", outsidePeersEmpty: "没有匹配的图外对端", projectNeighbors: "投影邻居上图", projectedNeighbors: "已投影 {{count}} 个邻居上图", localBrowserOnly: "仅本浏览器", deleteEdgeConfirm: "从画布移除选中链路?仅在点击「保存」后才会从 Fabric 删除;LLDP 下次采集若仍存在可能再次出现。", edgeDeleted: "已标记删除 {{count}} 条链路(保存后生效)", discoverCancelled: "发现已取消", truncatedMembership: "视图已达成员上限,部分邻居未上图。可去分类页或新建视图。", truncatedFrozen: "当前视图已冻结成员,无法投影邻居。请在分类流程中处理或新建视图。", truncatedNodes: "画布节点过多已截断显示。建议新建视图或收紧成员范围。", truncatedEdges: "画布链路过多已截断显示。建议筛选状态或新建视图。", truncatedGeneric: "图数据已截断显示。建议收紧范围或新建视图。", deleteSelectionConfirm: "从本图移除 {{nodes}} 个网元、删除 {{edges}} 条链路?移出与链路删除均在点击「保存」后生效。", selectionDeleted: "已标记:移除 {{nodes}} 个网元、删除 {{edges}} 条链路(保存后生效)", newMap: "新建", newMapName: "新拓扑图", rename: "重命名", renamePrompt: "拓扑图名称", renameHint: "双击可重命名", renamed: "拓扑图已重命名", deleteMap: "删除图", deleteMapConfirm: "删除拓扑图「{{name}}」?节点与链路会一并删除。", emptyMaps: "还没有根,先点「新建根」。", palette: "网元库", paletteHint: "勾选后批量添加;也可拖到画布添加单台", paletteDragHint: "拖到画布添加", selectAllVisible: "全选当前列表", addSelected: "添加选中({{count}})", addSelectedDone: "已添加 {{count}} 台网元", addingNe: "添加中…", filterPh: "输入即筛:名称 / IP / 厂商", save: "保存", saveDirty: "保存 *", unsavedConfirm: "有未保存的更改,确定丢弃并切换吗?", saving: "保存中…", saved: "拓扑已保存", saveFailed: "保存失败:{{detail}}", readOnlyBanner: "只读模式(需要 ne:write 权限才能编辑)", readOnlyHint: "只读模式,无编辑权限", discoverTimeout: "发现任务超时,请稍后在 LLDP 任务页查看进度", policySyncFailed: "同步 LLDP 策略失败,本地开关仍对本页发现生效", discover: "发现链路", discovering: "发现中…", discoverOne: "发现链路", discovered: "发现完成:新增 {{added}},更新 {{updated}},未发现 {{stale}}", discoverFail: "发现失败:{{detail}}", discoverOneNeedNe: "该节点未关联可扫描网元", selectMap: "请选择或新建一张拓扑图", renameNode: "重命名", renameNodePrompt: "网元显示名称", sourcePort: "本端端口", targetPort: "对端端口", endpointA: "端点 A", endpointB: "端点 B", port: "端口", expandPhysicalLinks: "展开物理链路", scaleBundleWidth: "聚合线按条数加粗", linkMembers: "物理成员({{count}})", canvasHint: "左侧为区域目录(需自行添加画布);打开本图后进入设备画布,用「添加网元」上图并保存。", selected: "已选节点", selectedEdge: "已选链路", selectedCount: "已选 {{count}}", toolModes: "编辑模式", toolSelect: "选择", toolPan: "平移", toolDrag: "拖动", toolConnect: "连线", layout: "布局", layoutHierarchicalTb: "层次 · 自上而下", layoutHierarchicalLr: "层次 · 从左到右", layoutForce: "力导向", layoutGrid: "网格", layoutRadial: "环形", layoutSelected: "仅布局选中(层次)", layoutNeedSelection: "请先选中要布局的节点", align: "对齐", alignLeft: "左对齐", alignRight: "右对齐", alignTop: "顶对齐", alignBottom: "底对齐", alignHCenter: "水平居中", alignVCenter: "垂直居中", alignHDistribute: "水平分布", alignVDistribute: "垂直分布", alignNeedSelection: "请至少选中两个节点", snapGrid: "网格吸附", autoLayoutDiscover: "发现后自动布局", discoverAutoAddUnmatched: "发现时自动入库未匹配网元(占位)", discoverProjectNeighbors: "发现后将本次扫描网元的直连邻居加入画布(需保存才永久保留)", undo: "撤销", redo: "重做", discoverSelected: "发现链路({{count}})", removeSelected: "移除选中 ({{count}})", openWebcrt: "打开终端", openNe: "网元详情", openAlarms: "查看告警", noAlarmLink: "该节点无法定位告警过滤条件", removeNode: "从画布移除", deletePlaceholder: "删除占位网元", deletePlaceholderConfirm: "永久删除此占位网元(含库存记录与 Fabric 直连链路)?画布撤销无法恢复。", deletePlaceholderDone: "占位网元已删除", removeEdge: "删除链路", nodeMenu: "网元", paneMenu: "画布", edgeMenu: "链路", createNe: "新建网元", createNeModeHint: "选择创建正式运维网元,或仅建拓扑占位(可稍后完善登录信息)。", createNeManaged: "正式网元", createNeManagedHint: "与网元管理相同的完整表单;创建后自动上图。", createNePlaceholder: "占位网元", createNePlaceholderHint: "仅名称/IP,来源为拓扑占位,适合先构图再补齐凭据。", createNeTitle: "新建拓扑占位网元", createNeHint: "来源为拓扑占位;完善登录信息后可在 WebCRT 连接,或在网元管理升级为手工。", createNeName: "名称", createNeNamePh: "例如 SW-CORE-01", createNeNameRequired: "请填写网元名称", createNeIp: "IP(可选)", createNeIpPh: "可稍后在完善时填写", createNeDone: "已新建占位网元 {{name}}", createManagedNeDone: "已创建网元并上图 {{name}}", createManagedNePlaceFailed: "网元 {{name}} 已写入库存,但上图失败:{{error}}。请从网元管理或侧栏再次添加。", createManagedNePosFailed: "网元 {{name}} 已上图,但未能移到点击位置(保留默认布局坐标)", createNeBusy: "创建中…", connectTest: "连通性测试", connectTestSelected: "连通性测试 ({{count}})", connectTestNeedManaged: "该节点未绑定运维网元,无法做连通性测试", connectTestSkipped: "跳过 {{count}} 台无运维绑定", selectionMenu: "多选", edgeStyle: "链路样式", edgeColor: "颜色", edgeLineStyle: "线型", edgeLineSolid: "实线", edgeLineDashed: "虚线", edgeLineDotted: "点线", edgeWidth: "粗细", edgeStyleReset: "恢复默认", edgeDefaults: "默认链路样式", edgeDefaultsReset: "恢复出厂", noNeLink: "未关联托管网元", completeNeFirst: "该网元登录信息不完整(厂家、代理跳转等需在网元管理填写)。请先完善后再打开终端。", edgeManual: "人工", edgeUme: "UME", edgeDiscovered: "LLDP 发现", edgeStale: "未发现", fit: "适应画布", export: "导出", exportSvg: "SVG 矢量", exportXml: "XML 数据", exporting: "导出中…", exportEmpty: "画布上没有可导出的内容", exportedSvg: "已导出 SVG", exportedXml: "已导出 XML", exportFailed: "导出失败:{{detail}}", liveSync: "实时同步", liveSyncOn: "同步中…", liveSyncHint: "开启后约每 5 秒刷新左侧树、每 3 秒刷新当前画布(观看 MCP 建图/画拓扑);默认关闭", fullscreen: "全屏显示", exitFullscreen: "退出全屏", display: "显示", canvasBg: "画布背景", canvasBgColor: "背景色", canvasBgReset: "恢复默认", textColors: "文字颜色", textColorsReset: "恢复默认", labelColor: "网元名称", edgeLabelColor: "链路数字", vendorColors: "厂商图标色", vendorColorsReset: "恢复默认", vendorTone: { cisco: "Cisco", huawei: "华为", zte: "中兴", juniper: "Juniper", nokia: "Nokia", ericsson: "Ericsson", h3c: "H3C", ruijie: "锐捷", mikrotik: "MikroTik", gray: "未知/未托管", }, hideIp: "隐藏 IP", hideVendor: "隐藏厂商", showPlaceholderBadge: "显示占位角标(TOPO/LLDP)", showConnectStatus: "显示连通状态点", showAlarmOverlay: "显示告警叠层", showLevelColors: "按分类层级着色", levelUnmatched: "未分类", level: { external: "外部", core: "核心", aggregation: "汇聚", access: "接入", edge: "边缘", }, hidePorts: "隐藏端口", edgeFlow: "链路流动", collapseSidebar: "折叠侧栏", expandSidebar: "展开侧栏", resizeSidebar: "拖动调整侧栏宽度", hideAdded: "隐藏已添加", paletteEmpty: "没有匹配的网元。", paletteHiddenAll: "已添加网元已隐藏;取消勾选可重新显示。", paletteSource: "网元来源", paletteManaged: "托管网元", paletteUme: "UME 网元", paletteLoading: "加载中…", discoverReport: "发现进度", discoverClose: "关闭", discoverCancel: "取消发现", discoverProgress: "正在扫描画布上 {{count}} 台托管网元(串行登录采集 LLDP,请稍候)…", discoverProgressLive: "正在扫描 {{index}}/{{total}}:{{name}}", discoverSummary: "扫描 {{scanned}} 台 · 新增 {{added}} · 更新 {{updated}} · 未发现 {{stale}} · 失败 {{failed}}", discoverNeOk: "邻居 {{neighbors}} · 新增 {{added}} · 更新 {{updated}}", discoverNeFail: "采集失败", discoverUnmatched: "未匹配 {{count}}", discoverUnmatchedMore: "另有 {{count}} 条未列出", discoverVendorRequired: "未设置厂商/设备类型,已跳过下发 LLDP 命令", discoverParserStub: "厂商解析器「{{parser}}」仍为 stub,已采集到输出但未能解析邻居", discoverNoTargets: "画布上没有可扫描网元。请添加托管网元,或添加已配置 CLI 凭据的 UME 网元。", discoverViewDetail: "详情", discoverLinkCount: "链路 {{count}}", discoverLinksTitle: "匹配链路({{count}})", discoverLinksEmpty: "本次未匹配到画布上的对端网元链路。", discoverUnmatchedTitle: "未匹配邻居({{count}})", discoverUnmatchedEmpty: "无未匹配邻居。", discoverColPeer: "对端网元", discoverColRemote: "邻居", discoverColLocalPort: "本端端口", discoverColRemotePort: "对端端口", discoverColProtocol: "协议", discoverColAction: "结果", discoverLinkAdded: "新增", discoverLinkUpdated: "更新", discoverLinkKeptManual: "保留人工", discoverLocatePeer: "定位对端", discoverLocateNe: "定位本端", discoverRawPreview: "采集原文预览(过长会截断,不影响解析)", discoverGoLldp: "查看详情 → LLDP 链路", findNode: "定位", findNodePh: "输入即搜:名称 / IP / 厂商", findNoMatch: "画布上没有匹配的节点", findMore: "另有 {{count}} 条匹配…", locateOnCanvas: "点击定位到画布", openPortTraffic: "打开端口流量", removeStale: "清除未发现 ({{count}})", removeStaleHint: "标记删除红色未发现链路(保存后生效);周期采集连续 4 次未发现也会自动清理", staleRemoved: "已标记删除 {{count}} 条未发现链路(保存后生效)", connectHint: "连线模式:从网元中心锚点拖到目标网元(Esc 或切回选择退出)", }, topoClassify: { title: "分类", openTopo: "拓扑画布", inventory: "网元清单", keywordPh: "关键字筛选名称/IP", filterLevelAll: "全部层级", filterRegionAll: "全部区域", filterUnmatchedOff: "不过滤未分类", kindAny: "层级或区域未填", kindLevel: "层级未填", kindRegion: "区域未填", filterLinkAll: "全部关联", filterLinkLinked: "已关联库存", filterLinkOrphaned: "已解绑", colLink: "关联", linkManaged: "托管", linkUme: "UME", linkBoth: "托管+UME", linkOrphaned: "已解绑", levelExternal: "L0 外部", levelCore: "L1 核心", levelCoreSub: "L1.1 次核心", levelAgg: "L2 汇聚", levelAggSub: "L2.1 二级汇聚", levelAccess: "L3 接入", levelAccessSub: "L3.1 更深接入", levelInvalid: "层级无效(0–99.9,一位小数)", sourceManual: "手动", sourceUmeSync: "UME 同步", sourceLldp: "LLDP 占位", sourceTopology: "拓扑占位", sourceWebcrt: "WebCRT", regexTitle: "正则查找", patternPh: "正则,如 ^CORE- 或 -EDGE-", fieldName: "名称", fieldNameIp: "名称+IP", findMatches: "查找匹配", matchOk: "匹配 {{count}} 条,已勾选", matchHint: "当前匹配 {{count}} 条", assignLevel: "只改层级", assignRegion: "只改区域", assignBoth: "层级+区域", clearRegion: "清空区域", confirmAssign: "确认写入", bulkConfirm: "将给已选/匹配的 {{count}} 条网元写入分类,确定?", bulkOk: "已更新 {{count}} 条", selectedCount: "已选 {{count}}", selectPage: "全选本页", colNe: "网元", colLevel: "层级", colRegion: "区域", colActions: "操作", edit: "编辑", save: "保存", cancel: "取消", delete: "删除", deleteSelected: "删除节点 ({{count}})", deleteConfirm: "将从拓扑 Fabric 删除 {{count}} 个节点(含上图与边),不影响网元管理/UME 清单。确定?", deleteOk: "已删除 {{count}} 个节点", deleteHint: "仅可删除已解绑节点,或 LLDP/WebCRT 等非实际管理占位;仅 UME / 实际管理网元不可删", deleteBlocked: "仅 UME 或仍关联实际管理网元,不可在此删除", rowSaved: "已保存", loading: "加载中…", empty: "没有网元。", }, audit: { title: "操作审计", logsTitle: "操作日志", colSummary: "摘要", colDetail: "详情", showDetail: "展开", hideDetail: "收起", filterBusiness: "业务", filterAll: "全部", filterWebcrt: "设备终端", filterNeExec: "设备执行", filterAuth: "登录认证", filterHttp: "HTTP", summary: { connecting: "正在登录 {{device}}", loginOk: "登录 {{device}}", loginFail: "登录失败 {{device}}:{{error}}", logout: "断开 {{device}}", logoutReason: "断开 {{device}}({{reason}})", command: "{{device}} · 命令: {{command}}", neExec: "{{device}} · 执行: {{commands}}", neExecBatch: "批量执行 {{n}} 台(成功 {{ok}} / 失败 {{fail}})", }, nav: { tasks: "任务概览", logs: "操作日志", }, tasks: { title: "任务概览", hint: "汇总当前系统中正在运行或挂起的各类后台任务;发起人优先取近期审计记录,调度类任务显示为 scheduler/system。", empty: "当前没有可展示的任务。", open: "打开", inflight: "进行中 {{n}}", kpiActive: "活跃/在途", kpiTotal: "条目总数", kpiKinds: "按类型", kpiStatuses: "按状态", colKind: "类型", colTitle: "任务", colStatus: "状态", colActor: "发起人", colTrigger: "触发", colProgress: "进度", colStarted: "开始", colUpdated: "更新", colLink: "入口", kind: { port_traffic: "端口流量", config_sync: "配置同步", ne_collect: "批量采集", lldp_discover: "LLDP 发现", ume_sync: "UME 同步", ne_connect: "连通性测试", ume_runtime: "UME 后台", webcrt: "WebCRT", }, trigger: { manual: "手动", schedule: "调度", topology: "拓扑", system: "系统", retry_failed: "重试失败", }, status: { collecting: "采集中", running: "运行中", testing: "测试中", connecting: "登录中", ready: "已连接", detached: "已断开(宽限)", pending: "排队", paused: "暂停", idle: "空闲", error: "错误", failed: "失败", }, }, }, }; export default zh;