netx/web/src/i18n/zh.ts
oliver bee86eea0d Require vendor when completing unmanaged NEs from topology.
Persist vendor on create/update and refresh the canvas node so icon tone matches inventory.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-04 11:50:05 +08:00

1604 lines
62 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

const zh = {
common: {
help: "帮助说明",
refresh: "刷新",
refreshing: "刷新中…",
query: "查询",
clearFilters: "清除筛选",
prevPage: "上一页",
nextPage: "下一页",
perPage: "{{n}}/页",
pagerMeta: "共 {{total}} 条 · 第 {{page}}/{{pages}} 页",
opFailed: "操作失败",
empty: "-",
cancel: "取消",
},
workbench: {
title: "工作台",
modules: "可用模块",
sections: "功能分区",
moduleCount: "{{count}} 个模块",
backToWorkbench: "返回工作台",
openInNewTab: "在新标签页中打开",
openModule: "打开或切换到该模块页签",
monitoring: "监控",
operations: "运维",
system: "系统管理",
cards: {
umeSync: "UME同步",
umeSyncDesc: "UME 告警同步、订阅与清单",
network: "网络管理",
networkDesc: "网元清单、告警、配置同步与监控任务",
managedNe: "网元管理",
managedNeDesc: "多厂商 SSH/Telnet 网元与连通性测试",
collect: "批量采集",
collectDesc: "对已连通网元执行定制 CLI 命令并保存日志",
webcrt: "WebCRT",
webcrtDesc: "浏览器内交互登录已连通网元(SSH/Telnet)",
topology: "拓扑管理",
topologyDesc: "Fabric 拓扑视图;LLDP 发现物理链路,MCP 可分页拉图",
portTrafficWall: "流量大屏",
portTrafficWallDesc: "独立页签打开命名流量大屏",
users: "用户管理",
usersDesc: "管理员添加、禁用用户并重置密码",
audit: "操作审计",
auditDesc: "任务概览与操作日志",
apiKeys: "API Key",
apiKeysDesc: "为用户生成 MCP/脚本用 Token,可设有效期",
},
},
network: {
title: "网络管理",
nav: {
detail: "网络详情",
tasks: "监控任务",
topologyMgmt: "拓扑管理",
devices: "设备列表",
topology: "拓扑信息",
lldpLinks: "LLDP",
topoClassify: "分类切片",
alarms: "告警信息",
configs: "配置信息",
webcrt: "WebCRT",
collectTasks: "采集任务",
configSync: "配置同步",
portTraffic: "流量监控",
portTrafficWall: "流量大屏",
},
collapseNav: "折叠侧栏",
expandNav: "展开侧栏",
placeholder: {
title: "功能规划中",
body: "该能力尚未开放。",
},
},
portTraffic: {
title: "端口流量监控",
create: "添加设备监控",
backList: "返回列表",
created: "已添加设备监控",
createFailed: "创建失败",
updated: "已保存",
interfacesSaved: "接口已更新",
started: "已启动",
paused: "已暂停",
stopped: "已停止",
statusRunning: "运行中",
statusPaused: "已暂停",
statusStopped: "已停止",
collecting: "采集中",
deleted: "已删除",
confirmDelete: "删除该设备监控及其采样数据?",
empty: "暂无设备监控。请先选择网元并勾选接口。",
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: "立即采集",
started: "已启动 LLDP 采集",
policyTitle: "采集策略",
policySaved: "策略已保存",
enabled: "启用周期调度",
autoAddUnmatched: "未纳管邻居建 SSH 占位网元",
intervalDays: "周期(天)",
interval: "采集周期",
intervalUnitDays: "天",
intervalUnitHours: "小时",
concurrency: "并发",
historyKeep: "任务保留数",
scope: "范围",
scopeAll: "全部纳管网元",
scopeSelected: "指定网元",
savePolicy: "保存策略",
selectedCount: "已选 {{count}} 台",
targetKeywordPh: "名称 / IP / 厂商",
jobsTitle: "采集任务",
jobDetailTitle: "任务明细",
edgesTitle: "Fabric 链路",
edgeKeywordPh: "本端 / 对端名称或 IP",
edgeStatusAll: "全部状态",
edgeStatusActive: "活跃",
edgeStatusMissing: "未发现",
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: "最近看见",
},
},
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 / 消息",
allStatus: "全部状态",
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: "暂无网元。",
col: {
source: "来源",
name: "名称",
vendor: "厂商",
deviceType: "设备类型",
connect: "连通状态",
},
},
networkConfigs: {
title: "配置信息",
keywordPh: "名称 / IP / ID",
vendorPh: "厂商",
allSource: "全部来源",
empty: "暂无已同步配置。请先在「配置同步」执行采集。",
view: "查看",
export: "导出",
exportBoth: "导出全部",
exportOk: "配置已导出",
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",
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: "退出",
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/脚本用。生成时默认 alarms:read + ne:read + ne:write + ne:exec,之后用「改权限」增减(保存即生效,不必重生明文)。明文仅创建时显示一次。管理员可代其他用户签发,权限不能超过所属用户已有能力;未接 MCP 的项为预留。",
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)",
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: "新密码至少 6 位",
passwordMismatch: "两次输入的新密码不一致",
passwordMustChange: "新密码不能与默认/旧密码相同",
},
collect: {
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: "命令将按顺序在每台设备上执行,输出合并为一份文本日志(格式与旧版 NetX 采集一致)。",
meta: "已选 {{ne}} 台网元 · {{cmd}} 条命令",
start: "开始采集",
starting: "提交中…",
},
created: "采集任务已创建:{{id}}",
started: "采集已开始:{{id}}",
paused: "任务已暂停",
restarted: "已重新开始采集",
retryFailedDone: "已开始重采失败网元",
deleted: "任务已删除",
nothingToRetry: "没有可重试的失败网元",
neBusy: "部分网元正在被其他采集任务占用,请等待其完成后再开始",
jobRunning: "该任务已在执行中",
confirmDelete: "确定删除该采集任务?相关日志文件将一并删除。",
jobs: {
title: "采集任务",
col: {
title: "任务",
status: "状态",
progress: "进度",
created: "创建时间",
lastRun: "最近执行",
actions: "操作",
},
ok: "成功",
fail: "失败",
expand: "详情",
collapse: "收起",
pause: "暂停",
start: "开始",
starting: "启动中…",
restart: "重新开始",
retryFailed: "重采失败网元",
downloadResults: "下载结果",
delete: "删除",
autoRefresh: "任务进行中,每 2 秒自动刷新",
runsInProgress: "部分网元仍在采集中,请稍候…",
},
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: "确定删除该网元?",
batchDelete: "批量删除",
batchDeleting: "删除中…",
batchDeleteConfirm: "确定删除选中的 {{n}} 台网元?此操作不可恢复。",
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: "设备类型",
source: "来源",
ip: "管理地址",
port: "端口",
protocol: "协议",
user: "用户名",
password: "密码",
tags: "标签",
remark: "备注",
connect: "连通性",
testedAt: "测试时间",
actions: "操作",
},
source: {
manual: "手工",
ume_sync: "UME 同步",
webcrt: "WebCRT",
lldp: "LLDP 占位",
},
connect: {
run: "连通性测试",
running: "测试中…",
submitted: "已提交 {{n}} 台设备测试",
retest: "重新测试",
},
connectDetail: "详情",
connectDetailTitle: "连通性测试日志",
connectDetailEmpty: "暂无日志。请先执行连通性测试;失败时会记录完整错误与跳板上下文(不含密码)。",
umeSync: {
sync: "同步 UME 网元",
syncing: "同步中…",
delete: "删除 UME 网元",
deleting: "删除中…",
deleteConfirm: "确定删除所有通过 UME 同步到网元管理中的网元?此操作不可恢复。",
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 复合用户名直连堡垒机,由堡垒机协议代理到目标。示例:bastion-user@target-user@2.2.2.2@1.1.1.1;密码为 Vault/堡垒机密码。JumpServer/CBH 常用端口 2222。",
targetAuthMode: "目标凭据",
targetAuthBastionManaged: "堡垒机托管(目标密码可留空)",
targetAuthManual: "手动输入(连接后二次认证)",
targetAuthHint: "堡垒机托管时仅需堡垒机密码;手动模式需填写目标网元密码。",
usernameTemplate: "SSH 用户名模板",
templateHintBastion:
"默认 {hop_user}@{target_user}@{target_ip},堡垒机地址填「跳板地址」。命令行示例:ssh bastion-user@target-user@2.2.2.2@1.1.1.1。",
host: "跳板地址",
port: "跳板端口",
protocol: "跳板协议",
protocolSshStelnet: "ssh(stelnet)",
username: "跳板用户名",
password: "跳板密码",
vrf: "管理 VRF(可选)",
vpnInstance: "VPN-Instance(可选)",
vrfCisco: "VRF(可选,如 MGMT)",
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 告警监控(OClaw WhatsApp)",
showPanel: "展开",
hidePanel: "收起",
help: "按 notificationId 精确匹配,或按告警描述关键字模糊匹配(不区分大小写,匹配 nativeProbableCause 等字段);可选限定 UME Inventory 中的网元类型 (ne_type),不选则匹配全部设备。经 OClaw WebSocket 推送到 WhatsApp 群。鉴权与 NETX_OCLAW_ANALYZE_TOKEN 共用。",
ws: "OClaw WSS",
wsConnected: "已连接",
wsDisconnected: "未连接",
wsDisabled: "未启用",
wsPaused: "已暂停",
publishedOk: "发布成功",
publishedFail: "发布失败",
queue: "待发队列",
matchType: "匹配方式",
matchNotificationId: "告警码 (notificationId)",
matchKeyword: "告警描述关键字",
matchValuePhNotificationId: "输入 notificationId",
matchValuePhKeyword: "输入匹配关键字(不区分大小写)",
label: "规则描述",
labelPh: "必填,如 BGP Down",
neTypesLabel: "设备类型(可选,多选)",
neTypesHint: "不选表示全部设备类型;选项来自 UME Inventory 同步后的 ne_type。",
neTypesEmpty: "暂无设备类型,请先同步 Inventory",
neTypesAll: "全部",
forwardOnClear: "告警清除时也推送",
forwardOnClearHelp: "全局开关:对所有监控规则生效。默认只在告警新增/更新时推送;勾选后,UME 上报告警已清除时也会向 WhatsApp 发送清除通知。",
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 网元清单…",
ume_ws_disabled_no_base_url: "未启用或未配置 UME_BASE_URL",
oclaw_fwd_disabled: "未启用或未配置 NETX_OCLAW_ALARM_WS / token / url",
resumed_sync_soon: "已恢复:将跳过本轮周期等待并尽快同步",
resumed_wss_reconnect: "已恢复:将尽快重连 WSS",
resumed_oclaw_wss_reconnect: "已恢复:将尽快重连 OClaw 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",
},
fwdState: {
paused: "已暂停",
disabled: "未启用",
connecting: "连接中",
connected: "已连接",
},
runtimeTask: {
token_keepalive: "UME Token 保活",
alarms_current_auto_sync: "当前告警定时同步",
alarms_current_ws_consumer: "UME 告警 WSS",
oclaw_alarm_forwarder: "OClaw 关键告警 WSS",
inventory_auto_sync: "Inventory 定时同步",
},
},
syncStatus: {
title: "同步状态",
showPanel: "展开",
hidePanel: "收起",
empty: "暂无同步记录",
},
ne: {
title: "网元清单",
showPanel: "展开",
hidePanel: "收起",
keywordPh: "keyword(ne_id/ne_name/user_label/ip/host_name)",
clearTitle: "清空 keyword,回到第 1 页",
expand: "展开详情",
collapse: "收起详情",
cliConnect: "CLI 连通",
},
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_ne_id(从下方网元清单复制)",
sampleNeRequired: "请填写 ume_ne_id",
connectTestSubmitted: "已提交连通性测试",
connectTestWaiting: "等待测试结果…",
connectTestRunning: "连通性测试中…",
connectTestResult: "测试结果",
existingProfiles: "已有配置",
default: "默认",
},
alarms: {
title: "当前告警",
movedHint: "当前告警查询已迁至网络管理 →",
showPanel: "展开",
hidePanel: "收起",
keywordPh: "keyword(告警键/原因/ne_name/host_name/ip 等)",
hostNamePh: "host_name(含匹配)",
allSeverity: "全部级别",
clearedAll: "is_cleared: all",
clearTitle: "清空 keyword、host_name、级别、is_cleared,回到第 1 页",
filterByHost: "按该主机名筛选",
noHostName: "无 host_name(需先同步网元)",
},
},
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: "新建会话",
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: "无法读取剪贴板(请用 Ctrl+Shift+V 或检查浏览器权限)",
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: "加载拓扑树…",
treeHint: "区域下为物理拓扑与自定义图;点图打开设备画布。",
treeSearch: "全拓扑搜索网元",
treeSearchPh: "名称 / IP",
treeSearchEmpty: "没有匹配的网元",
treeSearchNoViews: "未上图",
treeSearchNotOnMap: "该网元尚未出现在任何拓扑图上",
treeSearchViewCount: "{{count}} 张图",
treeSearchTruncated: "仅显示前 30 条(共 {{total}})",
rootName: "区域",
selectRegion: "请选择区域",
openMap: "打开本图",
openRegion: "打开区域",
kindPhysical: "物理拓扑",
kindCustom: "自定义图",
regionNodeHint: "{{count}}P",
layerNodeHint: "{{count}} 个网元",
layerNodeEmpty: "点击创建并打开",
rootCanvasHint: "从左侧选择区域进入目录。",
regionCanvasHint: "点击图打开设备画布,或新建自定义图。",
regionBrowseHint: "区域目录:物理拓扑 + 自定义图。点击打开。",
browserTitle: "拓扑目录",
browserRegionSub: "共 {{count}} 张拓扑图",
browserRegionsSub: "共 {{count}} 个区域",
browserEmptyMaps: "此区域还没有拓扑图。",
addNe: "添加网元",
backUp: "返回区域",
newRegion: "新建区域",
newRegionName: "新区域",
newRegionPrompt: "区域名称",
regionCreated: "区域已创建",
regionDeleted: "区域已删除",
deleteRegion: "删除区域",
deleteRegionConfirm: "删除区域「{{name}}」?其下物理拓扑与自定义图将一并删除。",
renameRegion: "重命名区域",
renameRegionPrompt: "区域名称",
regionRenamed: "区域已重命名",
collapseRegion: "折叠区域",
expandRegion: "展开区域",
newCustom: "自定义图",
newCustomName: "自定义拓扑",
newCustomPrompt: "自定义拓扑图名称",
folderHint: "区域用于分组。每区有一张物理拓扑,可再加自定义图。",
folderHintShort: "区域目录",
outsidePeers: "图外对端 {{count}} 个(有链路未上图)",
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: "拓扑已保存",
discover: "发现全量链路",
discovering: "发现中…",
discoverOne: "发现链路",
discovered: "发现完成:新增 {{added}},更新 {{updated}},未发现 {{stale}}",
discoverFail: "发现失败:{{detail}}",
discoverOneNeedNe: "该节点未关联可扫描网元",
selectMap: "请选择或新建一张拓扑图",
renameNode: "重命名",
renameNodePrompt: "网元显示名称",
sourcePort: "本端端口",
targetPort: "对端端口",
endpointA: "端点 A",
endpointB: "端点 B",
port: "端口",
expandPhysicalLinks: "展开物理链路",
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: "网元详情",
removeNode: "从画布移除",
removeEdge: "删除链路",
nodeMenu: "网元",
selectionMenu: "多选",
edgeStyle: "链路样式",
edgeColor: "颜色",
edgeLineStyle: "线型",
edgeLineSolid: "实线",
edgeLineDashed: "虚线",
edgeLineDotted: "点线",
edgeWidth: "粗细",
edgeStyleReset: "恢复默认",
edgeDefaults: "默认链路样式",
edgeDefaultsReset: "恢复出厂",
noNeLink: "未关联托管网元",
termConnect: {
title: "补全登录信息",
titleCreate: "新建网元并登录",
hint: "该网元尚未纳管或缺少登录信息,请填写 IP、厂家与协议后连接(等同新建/补全网元)。",
name: "名称",
vendor: "厂家",
ip: "IP 地址",
port: "端口",
protocol: "协议",
username: "用户名",
password: "密码",
connect: "保存并打开终端",
connecting: "连接中…",
cancel: "取消",
ipRequired: "请填写 IP 地址",
userRequired: "SSH 请填写用户名",
passwordRequired: "SSH 请填写密码",
saved: "登录信息已保存",
},
edgeManual: "人工",
edgeDiscovered: "发现",
edgeStale: "未发现",
fit: "适应画布",
liveSync: "实时同步",
liveSyncOn: "同步中…",
liveSyncHint: "开启后约每 5 秒刷新左侧树、每 3 秒刷新已打开的图(观看 MCP 建图/画拓扑);默认关闭。不需要先打开画布",
fullscreen: "全屏显示",
exitFullscreen: "退出全屏",
display: "显示",
hideIp: "隐藏 IP",
hideVendor: "隐藏厂商",
hidePorts: "隐藏端口",
edgeFlow: "链路流动",
collapseSidebar: "折叠侧栏",
expandSidebar: "展开侧栏",
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 网元。",
discoverFilter: "结果筛选",
discoverFilterIssues: "问题",
discoverFilterFail: "失败",
discoverFilterWarn: "警告",
discoverFilterOk: "成功",
discoverFilterAll: "全部",
discoverFilterDetail: "详情",
discoverListTitle: "发现详情",
discoverListEmpty: "当前筛选下没有网元。",
discoverShowLimited: "仅显示前 {{shown}} / {{total}} 条(请用筛选缩小范围)",
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",
filterRoleAll: "全部角色",
filterRegionAll: "全部区域",
filterUnmatchedOff: "不过滤未分类",
kindAny: "角色或区域未填",
kindRole: "角色未填",
kindRegion: "区域未填",
filterLinkAll: "全部关联",
filterLinkLinked: "已关联库存",
filterLinkOrphaned: "已解绑",
colLink: "关联",
linkManaged: "Managed",
linkUme: "UME",
linkBoth: "Managed+UME",
linkOrphaned: "已解绑",
regexTitle: "正则查找",
patternPh: "正则,如 ^CORE- 或 -BJ-",
fieldName: "名称",
fieldNameIp: "名称+IP",
findMatches: "查找匹配",
matchOk: "匹配 {{count}} 条,已勾选",
matchHint: "当前匹配 {{count}} 条",
assignRole: "只改角色",
assignRegion: "只改区域",
assignBoth: "角色+区域",
clearRegion: "清空区域",
confirmAssign: "确认写入",
bulkConfirm: "将给已选/匹配的 {{count}} 条网元写入分类,确定?",
bulkOk: "已更新 {{count}} 条",
selectedCount: "已选 {{count}}",
selectPage: "全选本页",
colNe: "网元",
colRole: "角色",
colRegion: "区域",
colActions: "操作",
edit: "编辑",
save: "保存",
cancel: "取消",
delete: "删除",
deleteSelected: "删除节点 ({{count}})",
deleteConfirm: "将从拓扑 Fabric 删除 {{count}} 个节点(含上图与边),不影响网元管理/UME 清单。确定?",
deleteOk: "已删除 {{count}} 个节点",
deleteHint: "仅可删除已解绑节点,或 LLDP/WebCRT 等非实际管理占位;仅 UME / 实际管理网元不可删",
deleteBlocked: "仅 UME 或仍关联实际管理网元,不可在此删除",
rowSaved: "已保存",
loading: "加载中…",
empty: "没有网元。",
showSlices: "展开切片建图",
hideSlices: "收起切片建图",
slices: "切片建图",
pickRegion: "选择区域",
tplCore: "仅 Core",
tplCoreAgg: "Core + 邻接 Agg",
tplAggAcc: "Agg + 邻接 Access",
seedPhysical: "同时给物理总览上 Core",
slicePreview: "预览切片",
sliceApply: "生成切片图",
sliceConfirm: "将创建自定义拓扑图并上图冻结,确定?",
sliceOk: "已创建 {{count}} 张切片图",
sliceStats: "计划 {{maps}} 张图,重复上图网元 {{overlap}} 个",
nodeCount: "{{count}} 个网元",
},
audit: {
title: "操作审计",
logsTitle: "操作日志",
nav: {
tasks: "任务概览",
logs: "操作日志",
},
tasks: {
title: "任务概览",
hint: "汇总当前系统中正在运行或挂起的各类后台任务;发起人优先取近期审计记录,调度类任务显示为 scheduler/system。",
empty: "当前没有可展示的任务。",
open: "打开",
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",
},
status: {
collecting: "采集中",
running: "运行中",
testing: "测试中",
connecting: "登录中",
ready: "已连接",
detached: "已断开(宽限)",
pending: "排队",
paused: "暂停",
error: "错误",
failed: "失败",
},
},
},
};
export default zh;