netx/web/src/i18n/zh.ts
oliver b54a6e5ad4 fix(ume): global clear-push setting, schema migration, and help hints
Make forward-on-clear a global monitor toggle, run key-alert DDL in an
isolated startup transaction, and fix HelpHint popovers plus API errors
when the server returns non-JSON responses.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-22 17:26:49 +08:00

420 lines
18 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: "-",
},
workbench: {
title: "工作台",
backToWorkbench: "返回工作台",
openInNewTab: "在新标签页中打开",
openModule: "打开或切换到该模块页签",
monitoring: "监控",
operations: "运维",
cards: {
umeSync: "UME同步",
umeSyncDesc: "UME 告警同步、订阅与清单",
managedNe: "网元管理",
managedNeDesc: "多厂商 SSH/Telnet 网元与连通性测试",
collect: "批量采集",
collectDesc: "对已连通网元执行定制 CLI 命令并保存日志",
},
},
layout: {
title: "UME 对接",
titleUme: "UME同步",
titleManagedNe: "网元管理",
titleCollect: "批量采集",
navUme: "UME 对接",
netxApi: "netx api",
oclawBridge: "oclaw WSS",
language: "语言",
moreMenu: "更多",
langZh: "中文",
langEn: "English",
},
collect: {
create: {
title: "新建采集任务",
hint: "配置命令与网元后创建任务;创建后需在任务列表中点击「开始」执行采集。",
selectedTitle: "已选择网元",
selectedEmpty: "请从下方筛选并逐个添加网元。",
selectedCount: "共 {{count}} 台",
clearSelected: "清空已选",
remove: "移除",
pickTitle: "可选网元(连通性已通过)",
pickHint: "仅展示 connect_status=pass 的网元。请先在「网元管理」完成连通性测试。",
pickEmpty: "没有匹配的网元。",
filterKeyword: "筛选",
filterKeywordPh: "名称 / IP / 厂商 / 设备类型",
add: "添加",
addBatch: "批量添加({{count}})",
added: "已添加",
create: "创建任务",
creating: "创建中…",
expand: "展开",
collapse: "收起",
meta: "已选 {{ne}} 台网元 · {{cmd}} 条命令",
},
eligible: {
title: "可选网元(连通性已通过)",
hint: "仅展示 connect_status=pass 的网元。请先在「网元管理」完成连通性测试。",
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: "删除",
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: "设备类型",
ip: "管理地址",
port: "端口",
protocol: "协议",
user: "用户名",
password: "密码",
tags: "标签",
remark: "备注",
connect: "连通性",
testedAt: "测试时间",
actions: "操作",
},
connect: {
run: "连通性测试",
running: "测试中…",
submitted: "已提交 {{n}} 台设备测试",
retest: "重新测试",
},
connectDetail: "详情",
connectDetailTitle: "连通性测试日志",
connectDetailEmpty: "暂无日志。请先执行连通性测试;失败时会记录完整错误与跳板上下文(不含密码)。",
help:
"【批量导入】\n" +
"· 必填列:device_type、ip、username、port、protocol、name、vendor;可先下载模板。\n" +
"· password 可留空(直连需填;堡垒机托管或后续批量添加代理时可空)。\n" +
"· 推荐流程:先导入网元 → 勾选网元 → 点「批量添加代理」统一配置跳板/堡垒机。\n\n" +
"【跳板 / 堡垒机】\n" +
"· 堡垒机 SSH 用户名模板:{hop_user}@{target_user}@{target_ip}@{hop_host};目标账号填网元「用户名」。\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}@{hop_host}。留空时后端同样规则。示例: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)",
help: "按 notificationId 精确匹配,或按告警描述关键字模糊匹配(不区分大小写,匹配 nativeProbableCause 等字段),经 OClaw WebSocket 推送到 WhatsApp 群。鉴权与 NETX_OCLAW_ANALYZE_TOKEN 共用。",
ws: "OClaw WSS",
wsConnected: "已连接",
wsDisconnected: "未连接",
wsDisabled: "未启用",
publishedOk: "发布成功",
publishedFail: "发布失败",
queue: "待发队列",
matchType: "匹配方式",
matchNotificationId: "告警码 (notificationId)",
matchKeyword: "告警描述关键字",
matchValuePhNotificationId: "输入 notificationId",
matchValuePhKeyword: "输入匹配关键字(不区分大小写)",
label: "规则描述",
labelPh: "必填,如 BGP Down",
forwardOnClear: "告警清除时也推送",
forwardOnClearHelp: "全局开关:对所有监控规则生效。默认只在告警新增/更新时推送;勾选后,UME 上报告警已清除时也会向 WhatsApp 发送清除通知。",
add: "添加规则",
adding: "添加中…",
delete: "删除",
pickFromAlarms: "加载当前告警参考",
emptyRules: "尚未配置监控规则",
colType: "类型",
colMatch: "匹配内容",
colLabel: "描述",
colForwardClear: "清除推送",
colPublished: "发布次数",
colAttempts: "尝试次数",
colLast: "最近推送",
colActions: "操作",
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",
},
syncStatus: {
title: "同步状态",
empty: "暂无同步记录",
},
ne: {
title: "网元清单",
showPanel: "展开",
hidePanel: "收起",
keywordPh: "keyword(ne_id/ne_name/user_label/ip/host_name)",
clearTitle: "清空 keyword,回到第 1 页",
expand: "展开详情",
collapse: "收起详情",
},
alarms: {
title: "当前告警",
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(需先同步网元)",
},
},
};
export default zh;