mirror of
https://github.com/hansjone/netx.git
synced 2026-10-15 15:53:20 +08:00
Refactor web UI: feature-first structure, tokenized styles, modern blue theme.
Structure
- pages/ -> features/<domain>/{Page, components, hooks, lib}; 95 files moved,
333 imports rewritten, verified with tsc.
- services/api.ts -> services/api/<domain>.ts (250 exports preserved),
types.ts -> types/<domain>.ts, i18n zh/en -> locales/<lang>/<namespace>.ts
(2696 messages deep-equal before/after).
- ESLint rule: shared layers must not import features/.
Styles
- index.css (16k lines) split losslessly into styles/{base,layout,components,
pages,legacy,theme}; compiled CSS was byte-identical before tokenizing.
- ~930 hard-coded colors replaced by --nx-* tokens (theme/tokens.css); WebCRT
off-palette colors unified; fixed dark-on-dark text introduced by mapping.
- theme/theme.css: modern blue design language (rounded shapes, gradients,
unified buttons/fields/tables/modals), form-grid alignment fix, flat nav list
without tree indent, soft selected state instead of left accent bar.
Docs: WEB.md documents code structure and style rules.
Not touched: the large Biz*/Webcrt/Topology page components (to be split later).
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
parent
3b45d6abe3
commit
0d894efe5e
196 changed files with 26947 additions and 28091 deletions
|
|
@ -1,6 +1,6 @@
|
|||
import { createContext, useCallback, useContext, useEffect, useMemo, useState, type ReactNode } from "react";
|
||||
import en from "./en";
|
||||
import zh from "./zh";
|
||||
import en from "./locales/en";
|
||||
import zh from "./locales/zh";
|
||||
|
||||
export type Locale = "zh" | "en";
|
||||
|
||||
|
|
|
|||
2987
web/src/i18n/en.ts
2987
web/src/i18n/en.ts
File diff suppressed because it is too large
Load diff
80
web/src/i18n/locales/en/audit.ts
Normal file
80
web/src/i18n/locales/en/audit.ts
Normal file
|
|
@ -0,0 +1,80 @@
|
|||
const audit = {
|
||||
title: "Audit & ops",
|
||||
logsTitle: "Operation logs",
|
||||
colSummary: "Summary",
|
||||
colDetail: "Detail",
|
||||
showDetail: "Expand",
|
||||
hideDetail: "Collapse",
|
||||
filterBusiness: "Business",
|
||||
filterAll: "All",
|
||||
filterWebcrt: "Device terminal",
|
||||
filterNeExec: "Device exec",
|
||||
filterAuth: "Auth",
|
||||
filterHttp: "HTTP",
|
||||
summary: {
|
||||
connecting: "Connecting to {{device}}",
|
||||
loginOk: "Logged in to {{device}}",
|
||||
loginFail: "Login failed {{device}}: {{error}}",
|
||||
logout: "Disconnected {{device}}",
|
||||
logoutReason: "Disconnected {{device}} ({{reason}})",
|
||||
command: "{{device}} · cmd: {{command}}",
|
||||
neExec: "{{device}} · exec: {{commands}}",
|
||||
neExecBatch: "Batch exec {{n}} NE(s) (ok {{ok}} / fail {{fail}})",
|
||||
},
|
||||
nav: {
|
||||
tasks: "Task overview",
|
||||
logs: "Operation logs",
|
||||
},
|
||||
tasks: {
|
||||
title: "Task overview",
|
||||
hint: "Live view of running or pending background work. Actor prefers recent audit entries; scheduled work shows as scheduler/system.",
|
||||
empty: "No tasks to show right now.",
|
||||
open: "Open",
|
||||
inflight: "running {{n}}",
|
||||
kpiActive: "Active / in-flight",
|
||||
kpiTotal: "Total rows",
|
||||
kpiKinds: "By kind",
|
||||
kpiStatuses: "By status",
|
||||
colKind: "Kind",
|
||||
colTitle: "Task",
|
||||
colStatus: "Status",
|
||||
colActor: "Actor",
|
||||
colTrigger: "Trigger",
|
||||
colProgress: "Progress",
|
||||
colStarted: "Started",
|
||||
colUpdated: "Updated",
|
||||
colLink: "Open",
|
||||
kind: {
|
||||
port_traffic: "Port traffic",
|
||||
config_sync: "Config sync",
|
||||
ne_collect: "Batch collect",
|
||||
lldp_discover: "LLDP discover",
|
||||
ume_sync: "UME sync",
|
||||
ne_connect: "Connect test",
|
||||
ume_runtime: "UME runtime",
|
||||
webcrt: "WebCRT",
|
||||
},
|
||||
trigger: {
|
||||
manual: "Manual",
|
||||
schedule: "Schedule",
|
||||
topology: "Topology",
|
||||
system: "System",
|
||||
retry_failed: "Retry failed",
|
||||
},
|
||||
status: {
|
||||
collecting: "Collecting",
|
||||
running: "Running",
|
||||
testing: "Testing",
|
||||
connecting: "Logging in",
|
||||
ready: "Connected",
|
||||
detached: "Detached (grace)",
|
||||
pending: "Pending",
|
||||
paused: "Paused",
|
||||
idle: "Idle",
|
||||
error: "Error",
|
||||
failed: "Failed",
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
export default audit;
|
||||
112
web/src/i18n/locales/en/auth.ts
Normal file
112
web/src/i18n/locales/en/auth.ts
Normal file
|
|
@ -0,0 +1,112 @@
|
|||
const auth = {
|
||||
loginTitle: "Sign in",
|
||||
username: "Username",
|
||||
password: "Password",
|
||||
login: "Sign in",
|
||||
loggingIn: "Signing in…",
|
||||
loginFailed: "Login failed",
|
||||
logout: "Sign out",
|
||||
sessionsTitle: "Login sessions",
|
||||
sessionsHelp:
|
||||
"Behind a proxy, IP is the real client; use Client to tell browsers apart. Revoked sessions must sign in again.",
|
||||
sessionsHint:
|
||||
"Manage browser/device logins for this account. Behind a reverse proxy, IP is taken from trusted forwarded headers; use the Client column to tell browsers apart on the same public IP. Revoked sessions must sign in again.",
|
||||
sessionsEmpty: "No active sessions.",
|
||||
revokeOtherSessions: "Revoke other sessions",
|
||||
revokeSession: "Revoke",
|
||||
sessionCurrent: "Current",
|
||||
sessionRevoked: "Session revoked",
|
||||
sessionsRevokedOthers: "Revoked {{count}} other session(s)",
|
||||
revokeCurrentConfirm: "This is your current session; revoking it requires signing in again. Continue?",
|
||||
colSession: "Session",
|
||||
colClient: "Client",
|
||||
colLastSeen: "Last seen",
|
||||
colCreated: "Created",
|
||||
usersTitle: "User management",
|
||||
usersHint: "Only admins can create and manage local accounts.",
|
||||
addUser: "Add user",
|
||||
role: "Role",
|
||||
roleAdmin: "Admin",
|
||||
roleUser: "User",
|
||||
status: "Status",
|
||||
active: "Active",
|
||||
disabled: "Disabled",
|
||||
enable: "Enable",
|
||||
disable: "Disable",
|
||||
actions: "Actions",
|
||||
newPassword: "New password",
|
||||
resetPassword: "Reset password",
|
||||
userCreated: "User created",
|
||||
userUpdated: "User updated",
|
||||
auditTitle: "Audit log",
|
||||
auditHintAdmin: "View login and operation records for all users.",
|
||||
auditHintUser: "View your own operation records.",
|
||||
filterUsername: "Filter username",
|
||||
filterAction: "Filter action",
|
||||
colTime: "Time",
|
||||
colUser: "User",
|
||||
colAction: "Action",
|
||||
colMethod: "Method",
|
||||
colPath: "Path",
|
||||
colStatus: "Status",
|
||||
colIp: "IP",
|
||||
apiKeysTitle: "API Key management",
|
||||
apiKeysHelp:
|
||||
"For MCP/scripts and netxops (web UI uses sessions). Secret shown once; Edit scopes later. Cap {{max}} non-revoked keys.",
|
||||
tokenQuota: "Active {{active}} / {{max}}",
|
||||
tokenLimitReached: "API key limit reached ({{max}}). Revoke or delete unused keys first.",
|
||||
tokenName: "Name",
|
||||
expiresIn: "Expiry",
|
||||
expire7d: "7 days",
|
||||
expire30d: "30 days",
|
||||
expire90d: "90 days",
|
||||
expire365d: "1 year",
|
||||
expireNever: "Never",
|
||||
tokenOwner: "Owner",
|
||||
tokenOwnerSelf: "Myself ({{user}})",
|
||||
createToken: "Create key",
|
||||
tokenCreated: "API key created",
|
||||
tokenUpdated: "Scopes updated",
|
||||
tokenRevoked: "Revoked",
|
||||
tokenDeleted: "Deleted",
|
||||
tokenOnceHint: "Copy and store this secret now; it will not be shown again:",
|
||||
copyToken: "Copy",
|
||||
tokenCopied: "Copied",
|
||||
tokenCopyFailed: "Copy failed",
|
||||
expiresAt: "Expires",
|
||||
lastUsed: "Last used",
|
||||
tokenStatusActive: "Active",
|
||||
tokenStatusExpired: "Expired",
|
||||
tokenStatusRevoked: "Revoked",
|
||||
revokeToken: "Revoke",
|
||||
revokeConfirm: "Revoke this API key? It stops working immediately; the record remains.",
|
||||
deleteToken: "Delete",
|
||||
deleteConfirm: "Permanently delete this API key? This cannot be undone.",
|
||||
editScopes: "Edit scopes",
|
||||
saveScopes: "Save scopes",
|
||||
scopesUnsetLegacy: "Unrestricted (same as owner)",
|
||||
scopesCol: "Scopes",
|
||||
scopesRequired: "Select at least one scope",
|
||||
scopesNoneAvailable: "This owner has no grantable scopes",
|
||||
scopeAlarmsRead: "alarms:read — Alarms read (netx MCP)",
|
||||
scopeNeRead: "ne:read — NE / topology read (MCP)",
|
||||
scopeNeWrite: "ne:write — NE / topology write / draw (MCP)",
|
||||
scopeNeExec: "ne:exec — Managed NE CLI (netx MCP)",
|
||||
scopeBizMonitorRead: "biz-monitor:read — Biz monitor / cutover read (netxops)",
|
||||
scopeSql: "sql:query — UME SQL (netx MCP)",
|
||||
scopeWebcrt: "webcrt:session — WebCRT (reserved MCP)",
|
||||
scopeAdminUsers: "admin:users — User admin (reserved MCP)",
|
||||
scopeOpsWrite: "ops:write — Ops write / subscriptions (reserved MCP)",
|
||||
|
||||
forceChangeTitle: "Change initial password",
|
||||
forceChangeHint: "Account {{user}} is still using the default password. You must change it before continuing.",
|
||||
oldPassword: "Current password",
|
||||
confirmPassword: "Confirm new password",
|
||||
savePassword: "Save new password",
|
||||
savingPassword: "Saving…",
|
||||
passwordTooShort: "New password must be at least 8 characters",
|
||||
passwordMismatch: "New passwords do not match",
|
||||
passwordMustChange: "New password must differ from the default/old password",
|
||||
};
|
||||
|
||||
export default auth;
|
||||
331
web/src/i18n/locales/en/bizCompare.ts
Normal file
331
web/src/i18n/locales/en/bizCompare.ts
Normal file
|
|
@ -0,0 +1,331 @@
|
|||
const bizCompare = {
|
||||
title: "Business compare",
|
||||
templates: "Compare templates",
|
||||
newTemplate: "New template",
|
||||
editTemplate: "Edit template",
|
||||
saveTemplate: "Save template",
|
||||
templateSaved: "Template saved",
|
||||
templateDeleted: "Template deleted",
|
||||
confirmDeleteTemplate: "Delete this compare template?",
|
||||
confirmDeleteJob: "Delete this compare job and all runs?",
|
||||
confirmDeleteRun: "Delete this compare run? Job config is kept.",
|
||||
deleteJob: "Delete job",
|
||||
deleteRun: "Delete run",
|
||||
runDeleted: "Compare run deleted",
|
||||
emptyTemplates: "No templates yet. Create one or import a JSON file.",
|
||||
exportTemplate: "Export",
|
||||
importTemplate: "Import",
|
||||
templateExported: "Template exported",
|
||||
templateImported: "Template imported",
|
||||
templateImportInvalid: "Invalid file: need name and metrics",
|
||||
templateValidationFailed: "Template validation failed; correct the indicated settings",
|
||||
filterOperator: "Filter operator",
|
||||
complexFiltersPreserved: "These nested filters are preserved in full. Export, edit the JSON and import it to update them.",
|
||||
portPolicy: "Port change policy",
|
||||
portPolicyHint: "Port mappings take priority. This policy controls whether interface identity fields participate in matching without a mapping.",
|
||||
portPolicyAuto: "Automatic",
|
||||
portPolicyStrict: "Interfaces must match",
|
||||
portPolicyIgnore: "Allow port changes",
|
||||
missingSheets: "Configured checks were removed or renamed; select the scope again",
|
||||
enableCurrentSheets: "Enable all current checks",
|
||||
templateUsage: "Used by {{n}} jobs",
|
||||
templateImportHint: "Import/export JSON to share templates privately (no job/batch data)",
|
||||
templateHint:
|
||||
"Pick metrics, then set Key / interface / compare / display. Compare modes: exact, abs delta, or relative %. Display can include context-only columns. Empty compare = presence-only.",
|
||||
stepPickMetrics: "① Pick metrics",
|
||||
stepConfigRules: "② Configure compare rules",
|
||||
pickMetricsHint: "Check metrics to add. Then configure each sheet below.",
|
||||
pickMetricsHintShort: "Click to add/remove; switch sheets in the left list below.",
|
||||
showMetrics: "Show metric picker",
|
||||
hideMetrics: "Hide metric picker",
|
||||
noMetricsYet: "Select at least one metric first",
|
||||
selectedCount: "{{n}} selected",
|
||||
tabFields: "Field rules",
|
||||
tabFilters: "Row filters",
|
||||
fieldsHintShort:
|
||||
"Key aligns rows; Compare fields take part in value diff; empty compare = presence-only.",
|
||||
tagCompareN: "{{n}} cmp",
|
||||
colFields: "Fields",
|
||||
keyFields: "Key",
|
||||
ifaceFields: "Interface",
|
||||
compareFields: "Compare",
|
||||
compareMode: "Mode",
|
||||
tolerance: "Tolerance",
|
||||
displayField: "Display",
|
||||
keyAlwaysDisplay: "Key columns are always shown",
|
||||
modeEq: "Exact equal",
|
||||
modeNumeric: "Abs delta",
|
||||
modePercent: "Relative %",
|
||||
normalizeField: "Norm",
|
||||
ignoreFields: "Ignore",
|
||||
field: "Field",
|
||||
note: "Note",
|
||||
keyRequired: "Select at least one key field",
|
||||
keyIsIdentity: "Key aligns rows; not used as a value-compare field",
|
||||
metricsRequired: "Add at least one metric sheet",
|
||||
noMetricFields: "No fields for this metric",
|
||||
rowFilters: "Row filter rules",
|
||||
rowFiltersHint:
|
||||
"Filter rows before compare. Conditions in a group are AND; groups are OR. Selecting ARP seeds editable default rules you can change.",
|
||||
rowFiltersHintShort: "AND in group · OR across groups · empty = all rows",
|
||||
rowFiltersEmpty: "No filters → compare all rows.",
|
||||
filterClear: "Clear",
|
||||
filterAddOr: "Add group (OR)",
|
||||
filterAddAnd: "Add condition (AND)",
|
||||
filterAddOrShort: "+ OR group",
|
||||
filterAddAndShort: "+ AND",
|
||||
filterRemoveGroup: "Remove group",
|
||||
filterGroupN: "Group {{n}}",
|
||||
filterOr: "OR",
|
||||
filterAnd: "AND",
|
||||
filterField: "Field",
|
||||
filterOp: "Op",
|
||||
filterValue: "Value",
|
||||
normalizeNone: "None",
|
||||
normalizeLower: "lower",
|
||||
normalizeUpper: "upper",
|
||||
normalizeMac: "MAC",
|
||||
normalizeEmpty: "empty→blank",
|
||||
templateFilterPh: "Filter template / metric",
|
||||
jobFilterPh: "Filter job / template / status",
|
||||
addMetric: "Add metric",
|
||||
pickMetric: "Pick metric…",
|
||||
addSheet: "Add to template",
|
||||
removeSheet: "Remove sheet",
|
||||
sheetIdRequired: "sheet_id is required (unique per split)",
|
||||
duplicateSheetId: "sheet_id must be unique",
|
||||
sheetTitle: "Sheet title",
|
||||
sheetId: "sheet_id",
|
||||
splitSheet: "Split / duplicate",
|
||||
colSheets: "Sheets",
|
||||
sheetsUnit: "sheets",
|
||||
presenceShort: "presence",
|
||||
modeFields: "Mode: compare selected field values",
|
||||
modeFieldsShort: "fields",
|
||||
modePresence: "Mode: presence-only (entry set match)",
|
||||
mapping: "Port mapping (optional)",
|
||||
newMapping: "New mapping…",
|
||||
mapName: "Mapping name",
|
||||
saveMapping: "Save mapping",
|
||||
validateMapping: "Validate",
|
||||
validateNeed: "Select mapping and before/after batches first",
|
||||
mapHint:
|
||||
"One pair per line: before_if,after_if (comma / tab / pipe). Example:\ngei-0/1/1,gei-0/1/2\nxgei-0/1/0,xgei-0/2/0\n# comments start with #. Not slash-grouped A,B/C,D.",
|
||||
mappingSaved: "Mapping saved",
|
||||
mappingOptionalHint:
|
||||
"Optional. Empty = ignore local port renames (match on non-interface keys). Fill to apply port map. Main-port pairs also cover .subinterfaces (suffix kept).",
|
||||
ifaceNormalize: "Interface normalize",
|
||||
ifaceNormalizeHint:
|
||||
"Template rules, one per line: alias,canonical. Applied before port mapping. Example:\nGE,gei\nSG,smartgroup\nXGE,xgei",
|
||||
createJob: "Create compare job",
|
||||
defaultJobName: "Cutover compare",
|
||||
jobName: "Name",
|
||||
template: "Template",
|
||||
mode: "Mode",
|
||||
modeManual: "Manual batches",
|
||||
modeAuto: "Auto (pin before; latest after batch)",
|
||||
beforeTask: "Before task",
|
||||
beforeBatch: "Before batch",
|
||||
afterTask: "After task",
|
||||
afterBatch: "After batch",
|
||||
sideBefore: "Before",
|
||||
sideAfter: "After",
|
||||
sidesVs: "vs",
|
||||
sidesTitle: "Compare sides",
|
||||
configSnapshot: "Execution settings saved",
|
||||
configSnapshotHint: "Template rules and port mapping are fixed for this run. Later edits do not affect historical lookup. The downloaded report includes the execution settings.",
|
||||
configLegacy: "Legacy run: settings not saved",
|
||||
configLegacyHint: "This run has no configuration snapshot. Success lookup and compact row reconstruction use the current settings, which may differ from the original execution.",
|
||||
pick: "Select…",
|
||||
sameAsBefore: "Same as before / select…",
|
||||
autoHint: "auto: new after-task batches trigger compare",
|
||||
createCompare: "Create job",
|
||||
createSteps: "Create steps",
|
||||
stepBasics: "Basics",
|
||||
stepSheets: "Sheets",
|
||||
stepBatches: "Batches",
|
||||
stepMapping: "Port mapping",
|
||||
next: "Next",
|
||||
back: "Back",
|
||||
enabledSheets: "Compare sheets",
|
||||
enabledSheetsHint: "Toggle sheets; all on by default. Off sheets are skipped.",
|
||||
noTemplateSheets: "This template has no sheets",
|
||||
needJobName: "Enter a job name",
|
||||
needTemplate: "Select a compare template",
|
||||
needSheets: "Enable at least one sheet",
|
||||
needBeforeBatch: "Select before task and batch",
|
||||
needAfterBatch: "Select after batch",
|
||||
runNow: "Run now",
|
||||
runStarted: "Compare started in background — you can close this page; check run history for progress",
|
||||
runFailed: "Compare failed",
|
||||
runStatusRunning: "Running",
|
||||
runStatusFailed: "Failed",
|
||||
runStatusDoneSec: "Done {{s}}s",
|
||||
runProgress: "{{phase}} · sheet {{i}}/{{n}} · {{sheet}} · {{s}}s elapsed",
|
||||
runSheetProgress: "sheet {{i}}/{{n}}",
|
||||
runElapsed: "{{s}}s elapsed",
|
||||
runRowsLoaded: "Loaded {{side}} {{n}} rows",
|
||||
runRowsSqlCount: "DB count {{side}} {{n}} rows",
|
||||
runPersisting: "Wrote {{done}}/{{total}} rows",
|
||||
runEngineSql: "engine SQL",
|
||||
runEnginePython: "engine Python",
|
||||
runEngineNote: "reason {{note}}",
|
||||
phaseQueued: "Queued",
|
||||
phaseLoading: "Loading",
|
||||
phaseSqlCount: "Counting",
|
||||
phaseSqlProject: "Preparing tables",
|
||||
phaseSqlJoin: "Joining",
|
||||
phaseSqlFailFetch: "Fetching fails",
|
||||
phaseComparing: "Comparing",
|
||||
phasePersisting: "Writing",
|
||||
phasePersistingFail: "Writing fails",
|
||||
phasePersistingOk: "Writing passes",
|
||||
phaseDone: "Done",
|
||||
phaseFailed: "Failed",
|
||||
phaseCancelled: "Cancelled",
|
||||
sheetPending: "Pending",
|
||||
colProgress: "Progress / result",
|
||||
passRateScope: "all rows",
|
||||
keyFiltersToggle: "Field filters",
|
||||
hideDisplayCols: "Hide display cols",
|
||||
showDisplayCols: "Show display cols",
|
||||
displayColsToggle: "Display cols",
|
||||
hideDisplayColsHint: "Compact: display-only columns are hidden by default; highlight means they are shown",
|
||||
ranWithDuration: "Compare finished ({{s}}s)",
|
||||
unchangedNotStored: "Success rows were counted but not stored. Set “Store success rows” to sample and re-run for spot-check.",
|
||||
unchangedSampleHint: "{{total}} success rows total; browsing a stratified sample of {{listed}}. Search any route for live source lookup. Pass rate uses all {{total}}.",
|
||||
liveSearchHint: "Pairs are completed from source batches before filtering. Pass rate still uses the full sheet.",
|
||||
liveSearchTruncatedHint: "Search limit reached; some entries are omitted. Narrow the filters. Incomplete key groups were skipped.",
|
||||
clearSearch: "Clear filters",
|
||||
resultLoading: "Loading comparison details…",
|
||||
resultRange: "{{from}}–{{to}} of {{total}}",
|
||||
resultLoadFailed: "Could not load comparison details",
|
||||
retry: "Retry",
|
||||
searchEmpty: "No results match these filters. Clear filters or select another result type.",
|
||||
clearKeyFilters: "Clear fields",
|
||||
storeUnchanged: "Store success rows",
|
||||
storeUnchangedAuto: "Auto (full if small / sample 5k + hydrate if large)",
|
||||
storeUnchangedSample: "Sample only (up to 5k keys + hydrate)",
|
||||
storeUnchangedKeys: "All success keys (full browse; large write still slow)",
|
||||
storeUnchangedAlways: "Always full JSON (slow on huge sheets)",
|
||||
storeUnchangedNever: "Never (counts only)",
|
||||
storeUnchangedHint: "Cutover focuses on fails and pass rate; success defaults to a stratified sample. Type a filter to look up any route from source tables. Pass rate uses the full success count.",
|
||||
saveJob: "Save config",
|
||||
jobSaved: "Job config saved",
|
||||
jobDeleted: "Compare job deleted",
|
||||
jobList: "Compare jobs",
|
||||
detail: "Details",
|
||||
edit: "Edit",
|
||||
delete: "Delete",
|
||||
tabConfig: "Job config",
|
||||
tabRuns: "Compare batches",
|
||||
tabResult: "Result",
|
||||
detailTabs: "Business comparison workspace",
|
||||
jobReady: "Ready",
|
||||
configBasics: "Job parameters",
|
||||
configSources: "Before and after sources",
|
||||
configScope: "Check scope",
|
||||
selectMapping: "Select mapping",
|
||||
mappingPairs: "Interface pairs",
|
||||
sourceBaseline: "Fixed baseline",
|
||||
sourceTarget: "Acceptance target",
|
||||
sourceLatest: "Latest batch",
|
||||
sourceRows: "{{n}} collected rows",
|
||||
autoSourceHint: "Keep the before batch fixed. Compare against the latest completed batch from the after task.",
|
||||
runHistoryTitle: "Execution history",
|
||||
runHistoryHint: "Showing the latest 50 runs. Execution status and business verdicts are displayed separately. Open results to inspect.",
|
||||
refreshRuns: "Refresh history",
|
||||
loadedRuns: "Loaded runs",
|
||||
activeRuns: "In progress",
|
||||
completedRuns: "Completed",
|
||||
stoppedRuns: "Failed / cancelled",
|
||||
runFinished: "Completed",
|
||||
runStatusQueued: "Queued",
|
||||
runsLoading: "Loading execution history…",
|
||||
runsLoadError: "Could not load execution history",
|
||||
runs: "Run history",
|
||||
runsHint: "Each “Run now” creates a batch. Stuck “Running” after restart is auto-cancelled; you can also cancel manually and re-run.",
|
||||
noRuns: "No runs yet — run a compare first",
|
||||
result: "Result",
|
||||
viewResult: "View result",
|
||||
cancelRun: "Cancel",
|
||||
confirmCancelRun: "Cancel this compare batch? You can start a new run afterward.",
|
||||
runCancelled: "Compare cancelled",
|
||||
runStatusCancelled: "Cancelled",
|
||||
compareAlreadyRunning: "A compare is already running — cancel it under Compare batches or wait",
|
||||
runBatchSummary: "Fail {{fail}} · Pass {{ok}} · Added {{added}}",
|
||||
colTime: "Time",
|
||||
pickBatchRun: "Select compare run",
|
||||
pickRun: "Select run…",
|
||||
runCount: "{{n}} runs",
|
||||
kindAll: "All",
|
||||
kindDiff: "Fail",
|
||||
kindAdded: "Added",
|
||||
kindRemoved: "Missing only",
|
||||
kindChanged: "Mismatch only",
|
||||
kindUnchanged: "Pass",
|
||||
kindAddedShort: "Added",
|
||||
kindRemovedShort: "Missing",
|
||||
kindChangedShort: "Mismatch",
|
||||
kindUnchangedShort: "Pass",
|
||||
kindFail: "Fail",
|
||||
kindPass: "Pass",
|
||||
kindSuccess: "Pass",
|
||||
successCount: "Pass",
|
||||
passRateShort: "Pass %",
|
||||
verdictPass: "Pass",
|
||||
verdictFail: "Fail",
|
||||
failCount: "Failed rows",
|
||||
missCount: "Missing",
|
||||
extraCount: "Extra",
|
||||
mismatchCount: "Mismatch",
|
||||
matchCount: "Match",
|
||||
failFields: "Failed fields",
|
||||
failFieldsEmpty: "—",
|
||||
failWholeRow: "Whole row",
|
||||
pairBefore: "pre",
|
||||
pairAfter: "post",
|
||||
sheetAllPass: "All match",
|
||||
filterFailField: "Failed compare field",
|
||||
filterFailFieldAll: "Any failed field",
|
||||
resultEmpty: "No matching rows",
|
||||
resultFilterPh: "Free text, or direction:out network:1.1.1.1",
|
||||
diffCount: "{{n}} failed",
|
||||
passRate: "Pass rate",
|
||||
passOk: "All passed",
|
||||
passWarn: "Has failures",
|
||||
runOverview: "Verdict",
|
||||
sheetCurrent: "Current check",
|
||||
diffCountLabel: "Failed rows",
|
||||
diffRate: "Fail rate",
|
||||
beforeCount: "Before rows",
|
||||
afterCount: "After rows",
|
||||
matchedRows: "Matched",
|
||||
totalRows: "Total rows",
|
||||
sheetCount: "Sheets",
|
||||
sheetNavTitle: "Checks",
|
||||
sheetNavHint: "{{n}} checks · click to switch",
|
||||
collapseSheetNav: "Collapse checks",
|
||||
expandSheetNav: "Expand checks",
|
||||
sheetFailCount: "{{n}} failed",
|
||||
topChangedFields: "Top failed fields",
|
||||
exportTables: "Download tables",
|
||||
exportOk: "Compare tables exported",
|
||||
fullscreen: "Fullscreen board",
|
||||
exitFullscreen: "Exit fullscreen",
|
||||
emptyJobs: "No compare jobs yet",
|
||||
created: "Compare job created",
|
||||
ran: "Compare finished",
|
||||
colName: "Name",
|
||||
colMode: "Mode",
|
||||
colStatus: "Status",
|
||||
colKind: "Verdict",
|
||||
colResult: "Result",
|
||||
colDetail: "Detail",
|
||||
colFailFields: "Failed fields",
|
||||
colActions: "Actions",
|
||||
colKey: "Identity",
|
||||
colChange: "Changes",
|
||||
};
|
||||
|
||||
export default bizCompare;
|
||||
302
web/src/i18n/locales/en/bizMigration.ts
Normal file
302
web/src/i18n/locales/en/bizMigration.ts
Normal file
|
|
@ -0,0 +1,302 @@
|
|||
const bizMigration = {
|
||||
fullscreen: "Wall mode",
|
||||
exitFullscreen: "Exit wall mode",
|
||||
fullscreenHint: "Display cutover status fullscreen. Press Esc to return; use a full-window layout when fullscreen is unavailable.",
|
||||
wallTitle: "Cutover monitoring · Service migration",
|
||||
wallProgress: "Wave migration progress · Current snapshot",
|
||||
wallFilters: "Show filters and evaluation controls",
|
||||
wallState_waiting: "Awaiting evaluation",
|
||||
wallState_unknown: "Data needs confirmation",
|
||||
wallState_anomaly: "Service anomalies detected",
|
||||
wallState_normal: "No service anomalies in current samples",
|
||||
pairCollectionHint: "Each metric has a paired collection round. Saving settings updates task bindings. Route tables are manual-only for final checks; use a separate business comparison for millions of routes. Actual cadence depends on command duration and device availability.",
|
||||
pairedSampling: "Paired sampling · Timeliness",
|
||||
manualRoute: "Manual final check",
|
||||
pairedPeriodic: "Paired periodic",
|
||||
samplingMode: "Sampling mode",
|
||||
samplingDuration: "Duration old / new",
|
||||
samplingQueue: "Queue old / new",
|
||||
startSkew: "Start skew",
|
||||
sameRound: "Round",
|
||||
metricBaselineMissing: "This metric needs a matching baseline receipt",
|
||||
samplePhase_idle: "Not collected",
|
||||
samplePhase_queued: "Queued",
|
||||
samplePhase_running: "Collecting",
|
||||
samplePhase_success: "Complete",
|
||||
samplePhase_partial: "Partial",
|
||||
samplePhase_failed: "Failed",
|
||||
samplePhase_cancelled: "Stopped",
|
||||
collect_pair_invalid: "Incomplete collection pair",
|
||||
collect_pair_missing: "No complete paired sample",
|
||||
collect_pair_pending: "Waiting for both sides of this round",
|
||||
collect_pair_failed: "Current round failed; older samples cannot replace it",
|
||||
collect_round_mismatch: "Samples belong to different rounds",
|
||||
sample_start_skew: "Actual collection starts are too far apart",
|
||||
latestSnapshot: "Latest snapshot",
|
||||
steadyOutside: "{{n}} stable items outside scope",
|
||||
"followLive": "Follow live",
|
||||
"historySnapshot": "Historical snapshot",
|
||||
"evaluatedAt": "Evaluated",
|
||||
"refreshBoard": "Refresh board",
|
||||
"oldestSample": "Oldest sample",
|
||||
"liveOverview": "Business migration overview",
|
||||
"remaining": "Remaining items",
|
||||
"anomalyInBatch": "Current wave anomalies",
|
||||
"anomalyOutsideBatch": "Outside wave anomalies",
|
||||
"coverageUnknown": "Uncertain coverage; acceptance cannot pass",
|
||||
"coverageUnknownHint": "Resolve missing, stale or misaligned samples and duplicate keys. Healthy samples cover their own monitor items.",
|
||||
"awaitingPeer": "Awaiting target sample",
|
||||
"migratedPrevious": "Previous wave received",
|
||||
"unfinishedPrevious": "Previous wave unfinished",
|
||||
"sample_time_missing": "Sample time missing",
|
||||
"sample_skew": "Samples too far apart",
|
||||
"sample_stale": "Stale samples",
|
||||
"duplicateKeys": "Duplicate business keys",
|
||||
"uncoveredScope": "Missing scope sheets",
|
||||
"refreshFailed": "Refresh failed; showing retained snapshot:",
|
||||
"lastAcceptance": "Last acceptance",
|
||||
"diffSearch": "Search business key / verdict / status",
|
||||
"verdictFilter": "Verdict filter",
|
||||
"allVerdicts": "All verdicts",
|
||||
"warningVerdict": "In progress / warning",
|
||||
"healthyVerdict": "Received / healthy",
|
||||
"unknownVerdict": "Uncertain",
|
||||
"loadingBoard": "Updating…",
|
||||
"rowsMatched": "{{n}} matching items",
|
||||
"showOutsideAnomalies": "Show outside anomalies",
|
||||
"scopeCurrent": "Current wave",
|
||||
"scopePrevious": "Previous wave",
|
||||
"scopeOutside": "Outside scope",
|
||||
"fieldChanges": "{{n}} changed fields",
|
||||
"outsideProtection": "Protect businesses outside this wave",
|
||||
"outsideProtectionHint": "Report drift outside this wave. Continue checking migrated businesses from previous waves without counting them in current progress.",
|
||||
"reason_service_not_received": "Source departed; target not healthy",
|
||||
"reason_target_unhealthy": "Target unhealthy",
|
||||
"reason_old_service_not_in_baseline": "Business missing from source baseline",
|
||||
"reason_service_content_changed": "Received business content differs",
|
||||
"reason_old_service_still_present": "Business still on source",
|
||||
"reason_target_sample_predates_source": "Target sample predates source departure",
|
||||
"reason_previous_batch_received": "Previous wave remains healthy",
|
||||
"reason_previous_batch_not_received": "Previous wave not received",
|
||||
"reason_unmapped_same_iface": "Drift on unmapped interface",
|
||||
"reason_out_of_expect:anomaly": "Business drift outside scope",
|
||||
"reason_out_of_expect:lost": "Business lost outside scope",
|
||||
title: "Cutover monitor",
|
||||
hint: "Separate from business compare: baseline drift, expect set, dual-device verdict. Reuses collect tasks and port mappings.",
|
||||
hintPort:
|
||||
"Metric focus: port status (interface_brief / admin·phy·prot). Baseline → pick ports → evaluate board.",
|
||||
hintShort: "Monitor template sets rules; bind collect + dual baselines → expect → evaluate board.",
|
||||
create: "Create task",
|
||||
createHint:
|
||||
"Except portrait baselines, the full cutover flow runs on this page; create auto-spawns HF biz-monitor tasks on schedule.",
|
||||
createHintShort:
|
||||
"Pick old/new NEs → monitor template & metrics → interval/window → baselines → port map → create. HF tasks are auto-created.",
|
||||
pickOldNe: "Old NE",
|
||||
pickNewNe: "New NE",
|
||||
pickNe: "Pick NE",
|
||||
pickNeHint: "Click to pick a device",
|
||||
hideNePicker: "Hide list",
|
||||
nePairReady: "Both NEs selected — continue, or click a card to re-pick.",
|
||||
needNePair: "Enter a name and select old/new NEs",
|
||||
needProjectName: "Enter a task name",
|
||||
needMonitorTemplate: "Select a monitor template",
|
||||
needMetrics: "Select at least one metric",
|
||||
noPortraitBaseline:
|
||||
"No portrait task/batches for this NE yet — run portrait collect in business monitor first (baselines can be set later).",
|
||||
baselineOptionalHint: "Baselines can be set later in detail; pick from portrait batches when available.",
|
||||
metricInterval: "Per-metric interval (sec)",
|
||||
metricIntervalOptional: "Per-metric interval (optional)",
|
||||
metricIntervalHint: "Leave blank to use the global interval; a filled value creates a separate HF task.",
|
||||
scheduleHint:
|
||||
"Enter the window in your local time; stored as UTC. Scheduler pauses HF outside the window.",
|
||||
sectionSchedule: "Collect interval & window",
|
||||
sectionBaseline: "Baselines & mapping",
|
||||
sectionDevices: "Old / new NEs",
|
||||
sectionMetrics: "Collect metrics",
|
||||
createSteps: "Create steps",
|
||||
stepDevices: "Devices",
|
||||
stepTemplate: "Template",
|
||||
stepSchedule: "Schedule",
|
||||
stepBaseline: "Baselines",
|
||||
next: "Next",
|
||||
back: "Back",
|
||||
colHf: "HF",
|
||||
hfReady: "Ready",
|
||||
hfMissing: "Missing",
|
||||
showCreateMore: "More: template / mapping / baselines",
|
||||
hideCreateMore: "Hide more",
|
||||
setupHintShort: "Portrait tasks feed baselines; HF tasks feed cutover collect. Configure template, metrics, window and dual baselines here.",
|
||||
createProject: "Create task",
|
||||
projectName: "Task name",
|
||||
projectNamePh: "e.g. PE-A / PE-B cutover-1",
|
||||
sectionName: "1. Task name",
|
||||
sectionTasks: "2. Bind collect tasks (required)",
|
||||
sectionTasksHint: "Pick the old-device and new-device business-monitor tasks.",
|
||||
sectionOptional: "3. Monitor template, mapping & baselines (optional)",
|
||||
sectionOptionalHint:
|
||||
"Skip for now if needed; set later under Baseline. Defaults to the system monitor template when omitted.",
|
||||
sectionPair: "Bound collect tasks",
|
||||
sectionPairHint: "Collect tasks are fixed at create time; adjust monitor template, mapping and baselines here.",
|
||||
sectionBaselineHint: "Both old and new baselines are required; old lists expect objects, new feeds dual-side verdict.",
|
||||
optionalNone: "None",
|
||||
monitorTemplate: "Monitor template",
|
||||
monitorTemplateHint: "Chooses which metrics to compare and dual-side success semantics. Defaults to the system monitor template.",
|
||||
compareTemplate: "Compare template",
|
||||
compareTemplateBound: "Bound compare template: {{name}}",
|
||||
portMappingHint:
|
||||
"With a mapping, iface metrics compare only mapped ports (they must appear after cutover). Same-name ports outside the map are not a migration; old down + new up is an anomaly. No mapping means same-name compare. BGP/PW still use the batch expect set.",
|
||||
baselineNeedTask: "Select the matching collect task first",
|
||||
baselinePickHint: "Choose from that task’s collect batches",
|
||||
oldTask: "Old-device portrait task",
|
||||
newTask: "New-device portrait task",
|
||||
portMapping: "Port mapping",
|
||||
oldBaseline: "Old baseline batch",
|
||||
newBaseline: "New baseline batch",
|
||||
needProjectFields: "Enter a name and pick old/new portrait tasks",
|
||||
needExpectPorts: "Select at least one expected object for this batch",
|
||||
needBothBaselines: "Save both old and new baseline batches before evaluating",
|
||||
errOldBaselineRequired: "Old baseline batch is required",
|
||||
errNewBaselineRequired: "New baseline batch is required",
|
||||
needBizStateTasks: "No portrait business-monitor tasks yet. Create one first:",
|
||||
projectCreated: "Task created",
|
||||
projects: "Tasks",
|
||||
empty: "No cutover tasks yet.",
|
||||
emptyProjects: "No cutover tasks yet",
|
||||
listFilterPh: "Filter name / NE / IP / status",
|
||||
kpiProjects: "Tasks",
|
||||
kpiActive: "Active",
|
||||
detail: "Detail",
|
||||
cancel: "Close",
|
||||
colName: "Task",
|
||||
colPair: "Old → New",
|
||||
colBaseline: "Baseline",
|
||||
colCreated: "Created",
|
||||
colActions: "Actions",
|
||||
baselineSet: "Set",
|
||||
baselineUnset: "Unset",
|
||||
statusActive: "Active",
|
||||
statusDone: "Done",
|
||||
statusPaused: "Paused",
|
||||
statusPending: "Pending",
|
||||
statusReview: "Review",
|
||||
tabSetup: "Baseline",
|
||||
tabBatches: "Batches",
|
||||
tabBoard: "Board",
|
||||
saveBaseline: "Save",
|
||||
baselineSaved: "Baseline saved",
|
||||
errPairCapacity: "Paired sampling needs at least two collection slots. Check task concurrency, collection threads and the CLI budget.",
|
||||
errPairBusy: "This metric is still collecting or queued on either side. Wait for the round to finish.",
|
||||
errPairInvalid: "The collector pair is incomplete. Save configuration again to restore it.",
|
||||
errPairSameDevice: "Cutover monitoring requires two different devices.",
|
||||
pickExpectPorts: "Expect",
|
||||
portFilterPh: "Filter",
|
||||
emptyBaselinePorts: "No baseline data",
|
||||
batchLabel: "Batch label",
|
||||
batchId: "Batch ID",
|
||||
copyBatchId: "Copy batch ID",
|
||||
defaultBatchLabel: "Night N",
|
||||
expectPorts: "Expected ports (old side)",
|
||||
expectPortsPh: "Comma or newline separated",
|
||||
createBatch: "New",
|
||||
batchCreated: "Batch created",
|
||||
batches: "Batches",
|
||||
startBatch: "Start",
|
||||
finishBatch: "Finish",
|
||||
evaluate: "Evaluate",
|
||||
evaluated: "Done",
|
||||
statusUpdated: "Status updated",
|
||||
board: "Board",
|
||||
metricPort: "Port status",
|
||||
progress: "Progress",
|
||||
anomaly: "Anomaly",
|
||||
onlyExpect: "Expect only",
|
||||
onlyExpectHint: "Shows all drift by default; check to filter to this batch's expect set",
|
||||
pinCurrentBatches: "Current collect batches",
|
||||
pinOldBatch: "Old current",
|
||||
pinNewBatch: "New current",
|
||||
pinLatest: "Latest",
|
||||
runHistory: "Runs",
|
||||
runLatest: "Latest",
|
||||
colRuleHit: "Rule hit",
|
||||
colCommand: "Collect command",
|
||||
mappingBound: "Mapping saved and bound to this project",
|
||||
allMetrics: "All metrics",
|
||||
colMetric: "Metric",
|
||||
colKey: "Object",
|
||||
colPort: "Old port",
|
||||
openRedChip: "Red {{n}}",
|
||||
metaPortrait: "Portrait",
|
||||
metaHf: "HF",
|
||||
metaBaseline: "Baseline",
|
||||
baselineOk: "set",
|
||||
baselineMissing: "missing",
|
||||
needBaselineFirst: "Set baseline first",
|
||||
enableHighfreq: "Enable HF",
|
||||
highfreqReady: "HF ready",
|
||||
collectNow: "Collect now",
|
||||
collectTriggered: "Collect triggered",
|
||||
openBizState: "Biz monitor",
|
||||
hfNotBound: "Unbound",
|
||||
projectCollectMetrics: "Metrics",
|
||||
hfInterval: "Interval(s)",
|
||||
hfStart: "Start",
|
||||
hfEnd: "End",
|
||||
markProjectDone: "Done / stop HF",
|
||||
confirmProjectDone: "Complete project and pause all HF?",
|
||||
projectMarkedDone: "Done; HF paused",
|
||||
deleteProject: "Delete",
|
||||
confirmDeleteProject: "Delete project? HF will pause and batches removed.",
|
||||
projectDeleted: "Deleted",
|
||||
acceptPassedShort: "Pass",
|
||||
acceptFailedShort: "Fail",
|
||||
colMapped: "Mapped new",
|
||||
colDesc: "Description",
|
||||
colOldPort: "Old business key",
|
||||
colNewPort: "New business key",
|
||||
colOldStatus: "Old admin/phy/prot",
|
||||
colNewStatus: "New admin/phy/prot",
|
||||
colOld: "Old",
|
||||
colNew: "New",
|
||||
colVerdict: "Verdict",
|
||||
emptyDiffs: "No rows yet — run Evaluate",
|
||||
emptyRed: "No red tickets",
|
||||
verdictMigrated: "Migrated",
|
||||
verdictMigrating: "Migrating",
|
||||
verdictLost: "Lost",
|
||||
verdictAnomaly: "Anomaly",
|
||||
verdictNotInvolved: "Not involved",
|
||||
verdictUnexpected: "Unexpected new",
|
||||
verdictOk: "OK",
|
||||
highfreqHint: "",
|
||||
boundTasks: "Bound tasks",
|
||||
oldPortraitTask: "Old portrait",
|
||||
newPortraitTask: "New portrait",
|
||||
oldHfTask: "Old HF",
|
||||
newHfTask: "New HF",
|
||||
projectCollectHint: "",
|
||||
hfWindowInactive: "HF window inactive or project done",
|
||||
baselinePortraitOnly: "",
|
||||
collectSkipped: "skipped",
|
||||
collectSkippedBanner: "Skipped: {{metrics}}",
|
||||
currentMissing: "no current",
|
||||
currentMissingBanner: "No current: {{metrics}}",
|
||||
highfreqReadyInactive: "HF bound (window inactive, no collect)",
|
||||
collectPartial: "Partial fail (ok {{ok}} / fail {{fail}})",
|
||||
errMetricNeedsBindings: "Metric \"{{metric}}\" needs bindings ({{params}}); not supported for cutover HF — remove it",
|
||||
errNoProfileForMetric: "Metric \"{{metric}}\" has no collect profile for this vendor",
|
||||
acceptTitle: "Acceptance",
|
||||
acceptPassed: "Passed",
|
||||
acceptFailed: "Failed ({{n}} red)",
|
||||
newBaselineMissingBanner: "Missing new baseline: {{metrics}}",
|
||||
acceptCarryHint: "May continue with red",
|
||||
openRedHint: "Red {{n}}",
|
||||
redTitle: "Red tickets",
|
||||
redOpen: "open",
|
||||
resolveRed: "Resolve",
|
||||
redResolved: "Resolved",
|
||||
batchCreatedWithRed: "Batch created ({{n}} red)",
|
||||
colStatus: "Status",
|
||||
verdictUnfinished: "Unfinished",
|
||||
};
|
||||
|
||||
export default bizMigration;
|
||||
137
web/src/i18n/locales/en/bizMonitorTpl.ts
Normal file
137
web/src/i18n/locales/en/bizMonitorTpl.ts
Normal file
|
|
@ -0,0 +1,137 @@
|
|||
const bizMonitorTpl = {
|
||||
title: "Monitor templates",
|
||||
help: "Compare templates define align/diff; monitor templates define migrate success on the same sheets.",
|
||||
hint: "Compare templates define HOW to align/diff; monitor templates define WHEN dual-device migrate succeeds — one sheet tab per compare sheet.",
|
||||
create: "New monitor template",
|
||||
edit: "Edit",
|
||||
save: "Save",
|
||||
cancel: "Close",
|
||||
created: "Created",
|
||||
saved: "Saved",
|
||||
deleted: "Deleted",
|
||||
confirmDelete: "Delete this monitor template?",
|
||||
delete: "Delete",
|
||||
empty: "No monitor templates yet.",
|
||||
listFilterPh: "Filter name / compare template / note",
|
||||
kpiTotal: "Templates",
|
||||
colName: "Name",
|
||||
namePh: "e.g. Status cutover monitor",
|
||||
colCompare: "Compare template",
|
||||
colCollect: "HF collect metrics",
|
||||
colNote: "Note",
|
||||
colActions: "Actions",
|
||||
needName: "Name is required",
|
||||
defaultsInvalid: "Invalid defaults JSON",
|
||||
overridesInvalid: "Invalid sheet_overrides JSON",
|
||||
exportTemplate: "Export",
|
||||
importTemplate: "Import",
|
||||
templateExported: "Template exported",
|
||||
templateImported: "Template imported",
|
||||
templateImportInvalid:
|
||||
"Invalid import file: need name and compare_template_id (or compare_template_name)",
|
||||
templateImportHint: "Import/export JSON to share monitor templates (no job/batch data)",
|
||||
templateImportCompareMissing:
|
||||
"Matching compare template not found — import or create it first",
|
||||
formHint: "Pick a compare template → same sheet tabs appear → set success conditions per sheet.",
|
||||
compareHint: "Owns which sheets and Key/compare fields; here you only set dual verdict rules.",
|
||||
pickCompare: "Pick compare template…",
|
||||
openCompare: "Manage compare templates",
|
||||
collectAll: "All sheets",
|
||||
collectPh: "interface_brief, bgp_peer (empty = all)",
|
||||
collectHint: "HF collect metrics; empty / “All sheets” uses every compare-template sheet.",
|
||||
collectTitle: "High-freq collect subset",
|
||||
defaults: "defaults (JSON)",
|
||||
overrides: "sheet_overrides (JSON)",
|
||||
overridesHint: "Optional per-metric status_fields / success patterns.",
|
||||
globalPolicy: "Global policy",
|
||||
outOfExpect: "Out-of-expect objects",
|
||||
outOfExpectHint: "How to treat drift outside the batch expect set.",
|
||||
ooeStrict: "Strict (red anomaly)",
|
||||
ooeWarn: "Warn (yellow only, no red tickets)",
|
||||
ooeIgnore: "Ignore (always not involved)",
|
||||
sheetRules: "Per-sheet migrate rules",
|
||||
applyAllPresets: "Apply recommended presets to all",
|
||||
applyAllPresetsShort: "All presets",
|
||||
sheetsUnit: " sheets",
|
||||
sheetHowReadonly: "Compare template (read-only)",
|
||||
iface: "Interface",
|
||||
compare: "Compare",
|
||||
presenceOnly: "presence only",
|
||||
editInCompare: "Edit HOW",
|
||||
presetAuto: "Recommended",
|
||||
presetSkip: "Skip sheet",
|
||||
skipDual: "Skip dual for this sheet",
|
||||
skipDualHint: "Skipped in cutover evaluate (use a compare job for counters).",
|
||||
statusFields: "Fields used for up/down",
|
||||
statusFieldsHint: "Ports: admin/phy/prot; BGP: state; ARP: leave empty (presence only).",
|
||||
statusOptionalHint: "With no status fields, only presence (gone/added) is used.",
|
||||
downValues: "Down values",
|
||||
upValues: "Up values",
|
||||
noFields: "No fields (pick metrics on the compare template first)",
|
||||
successPatterns: "Success rules (old OR-groups × new OR-groups)",
|
||||
successPatternsShort: "Success",
|
||||
successPatternsHint:
|
||||
"Presence is whether the row exists. Value change binds a field and a strategy. AND inside a group, OR between groups.",
|
||||
successPatternsHintShort: "AND in group · OR across groups · old+new both match ⇒ success",
|
||||
successPatternsHintFree:
|
||||
"Each side has two condition kinds: presence (no field) or value change (must bind a field). Inside a group everything must match (AND). Between groups, any group is enough (OR).",
|
||||
anomalyPatternsShort: "Anomaly",
|
||||
anomalyPatternsHint:
|
||||
"Same shape as success. Match ⇒ red. Check “don’t care” on one side to watch only the other (e.g. new-side gone/down). Not-yet-success is still migrating, not anomaly.",
|
||||
anomalyPatternsHintShort: "Success first; then anomaly. Don’t-care watches one side. Mid-state ≠ anomaly.",
|
||||
successRow: "Success {{n}}",
|
||||
anomalyRow: "Anomaly {{n}}",
|
||||
removeRow: "Remove",
|
||||
oldSideAny: "Old",
|
||||
newSideAny: "New",
|
||||
groupLogicHint: "AND inside a group, OR between groups",
|
||||
sideDontCare: "Don’t care this side",
|
||||
sideDontCareHint: "Judged by the other side only.",
|
||||
groupN: "Group {{n}}",
|
||||
addAnd: "Add to this group (AND)",
|
||||
addOr: "Add another group (OR)",
|
||||
addAndShort: "+ AND",
|
||||
addOrShort: "+ OR group",
|
||||
addSuccessRow: "+ Success rule",
|
||||
addAnomalyRow: "+ Anomaly rule",
|
||||
modeAny: "Match any",
|
||||
modeAll: "Match all",
|
||||
addCond: "Add condition",
|
||||
pickField: "Pick field…",
|
||||
condValue: "Value",
|
||||
opEmpty: "empty",
|
||||
opNotEmpty: "not empty",
|
||||
opChanged: "changed vs baseline",
|
||||
opUnchanged: "same as baseline",
|
||||
op_eq: "equals",
|
||||
op_ne: "not equals",
|
||||
op_in: "in",
|
||||
op_not_in: "not in",
|
||||
op_empty: "empty",
|
||||
op_not_empty: "not empty",
|
||||
op_changed: "changed vs baseline",
|
||||
op_unchanged: "same as baseline",
|
||||
and: "and",
|
||||
groupPresence: "Presence",
|
||||
groupValue: "Value change",
|
||||
groupStatus: "Status class",
|
||||
groupField: "Field condition",
|
||||
tokRemoved: "Gone",
|
||||
tokAdded: "Added",
|
||||
tokUnchanged: "Unchanged",
|
||||
tokChanged: "Changed",
|
||||
tokUp: "up",
|
||||
tokDown: "down",
|
||||
tokOther: "other",
|
||||
or: "or",
|
||||
tagSkip: "skip",
|
||||
tagRules: "{{n}}",
|
||||
tagEmpty: "empty",
|
||||
needCompareFirst: "Pick a compare template that has sheets first.",
|
||||
showMore: "More: note / HF collect / JSON",
|
||||
hideMore: "Hide more",
|
||||
showJson: "Advanced: edit JSON",
|
||||
hideJson: "Back to visual editor",
|
||||
};
|
||||
|
||||
export default bizMonitorTpl;
|
||||
196
web/src/i18n/locales/en/bizState.ts
Normal file
196
web/src/i18n/locales/en/bizState.ts
Normal file
|
|
@ -0,0 +1,196 @@
|
|||
const bizState = {
|
||||
title: "Business monitor",
|
||||
loadedTasks: "Loaded tasks",
|
||||
loadedBatches: "Recent batches · {{n}} loaded (up to 200)",
|
||||
collectErrors: "Recent collection errors",
|
||||
retry: "Retry",
|
||||
taskLoading: "Loading task configuration…",
|
||||
tasksLoadError: "Could not load tasks",
|
||||
taskLoadError: "Could not load task configuration",
|
||||
batchLoadError: "Could not load batch",
|
||||
sheetLoadError: "Could not load structured data",
|
||||
statusQueued: "Queued",
|
||||
batchSuccess: "Collected",
|
||||
batchPartial: "Partially completed",
|
||||
batchFailed: "Collection failed",
|
||||
batchCancelled: "Cancelled",
|
||||
create: "Create task",
|
||||
createHint: "Pick any valid NE (managed / UME); search supported",
|
||||
createModeDevice: "Pick device",
|
||||
createModeImport: "Import log",
|
||||
createImportHint:
|
||||
"No NE needed: upload a session log or zip to create an Import task and parse the first batch. Re-import later on the task to append batches (same as multiple collects).",
|
||||
createImportSubmit: "Create & import",
|
||||
created: "Task created",
|
||||
createFailed: "Create failed",
|
||||
empty: "No business-state tasks yet.",
|
||||
pickNe: "Select NE…",
|
||||
neKeywordPh: "Name / IP / ID",
|
||||
allSource: "All sources",
|
||||
selectedNe: "Selected",
|
||||
neEmpty: "No matching NEs.",
|
||||
colSource: "Source",
|
||||
colVendor: "Vendor",
|
||||
colConnect: "Connect",
|
||||
start: "Start schedule",
|
||||
pause: "Pause",
|
||||
statusPaused: "Manual only",
|
||||
scheduleEnabled: "Enable schedule",
|
||||
scheduleOn: "Scheduled",
|
||||
scheduleOff: "Manual",
|
||||
scheduleHint: "When checked, collect on interval; otherwise only Collect now.",
|
||||
collectNow: "Collect now",
|
||||
importLog: "Import log",
|
||||
importLogHint:
|
||||
"Append a new batch to this task (same as one collect): full session or zip; discard noise before show/display; split on hostname#show; fail if no show (no SSH).",
|
||||
importVendor: "Vendor",
|
||||
importVendorGeneric: "Generic (show+display)",
|
||||
importFile: "Log file",
|
||||
importNeName: "Task name (optional)",
|
||||
importNeNamePh: "e.g. PE1-offline",
|
||||
importSubmit: "Import as new batch",
|
||||
importing: "Importing",
|
||||
importStarted: "Import started ({{count}} segments)",
|
||||
importOfflineOnly: "Import tasks are offline-only (no SSH collect)",
|
||||
sourceImport: "Import",
|
||||
stopCollect: "Stop collect",
|
||||
stopCollectOk: "Stop collect requested",
|
||||
stopCollectIdle: "No collect in progress",
|
||||
delete: "Delete",
|
||||
confirmDelete: "Delete this task and all batches?",
|
||||
deleted: "Deleted",
|
||||
started: "Schedule enabled",
|
||||
paused: "Schedule paused (manual only)",
|
||||
collecting: "Collecting",
|
||||
statusCollecting: "Collecting",
|
||||
detail: "Details",
|
||||
interval: "Interval",
|
||||
intervalUnit: "Interval unit",
|
||||
intervalUnitDays: "days",
|
||||
intervalUnitHours: "hours",
|
||||
intervalUnitSeconds: "seconds",
|
||||
retention: "Retention days",
|
||||
retentionHint: "Batches older than this are purged; baselines and compare/cutover refs are kept.",
|
||||
dailyKeepEnabled: "Daily keep policy",
|
||||
dailyKeepCount: "Keep per day",
|
||||
dailyKeepHint: "When on: keep only the newest N batches per past day; extras purge next day (off by default).",
|
||||
markBaseline: "Mark baseline",
|
||||
unmarkBaseline: "Unmark baseline",
|
||||
baseline: "Baseline",
|
||||
protected: "Protected",
|
||||
colAlias: "Alias",
|
||||
setAlias: "Set alias",
|
||||
aliasPrompt: "Batch alias (preferred in compare/cutover pickers; empty clears)",
|
||||
aliasSaved: "Alias saved",
|
||||
aliasEmpty: "Untitled",
|
||||
workbookStats: "Compare {{compare}} · With data {{withData}} · Sheets {{sheets}}",
|
||||
deleteBatch: "Delete",
|
||||
bulkDelete: "Bulk delete",
|
||||
confirmDeleteBatch: "Delete this batch? Protected batches cannot be deleted.",
|
||||
confirmBulkDelete: "Delete {{count}} selected batches? Protected ones are skipped.",
|
||||
batchDeleted: "Batch deleted",
|
||||
bulkDeleted: "Deleted {{deleted}}, skipped {{skipped}}",
|
||||
purgeNow: "Purge now",
|
||||
purgeOk: "Purge done: dropped {{dropped}}",
|
||||
selectAll: "Select deletable",
|
||||
colProtect: "Protect",
|
||||
saveSchedule: "Save schedule",
|
||||
scheduleSaved: "Schedule saved",
|
||||
colInterval: "Interval",
|
||||
profiles: "Monitor items",
|
||||
profilesSelectAll: "Select all",
|
||||
profilesDeselectAll: "Deselect all",
|
||||
profilesSelectAllOk: "Enabled {{n}} item(s)",
|
||||
profilesDeselectAllOk: "All items disabled",
|
||||
profilesSelectionStats: "Selected {{enabled}} / {{total}}",
|
||||
profilesUnboundStats: "{{n}} unbound",
|
||||
colLane: "Collect lane",
|
||||
laneLight: "Light",
|
||||
laneHeavy: "Heavy",
|
||||
laneLightHint: "Shared SSH with most commands; ~10 min lane cap by default",
|
||||
laneHeavyHint: "Dedicated SSH + longer timeouts; ~40 min lane cap by default",
|
||||
enable: "On",
|
||||
command: "Command template",
|
||||
colAux: "Aux commands",
|
||||
params: "Bindings",
|
||||
discoverVrf: "Discover VRFs",
|
||||
discoverBind: "Discover / Bind",
|
||||
saveBindings: "Save bindings",
|
||||
cancel: "Close",
|
||||
bindTitle: "Select bindings",
|
||||
unbound: "Not bound",
|
||||
bindHintRequired: "Bind params before collect",
|
||||
paramsDblClickHint: "Click to view all bindings",
|
||||
paramsClickHint: "Click to view all bindings",
|
||||
paramsDetailTitle: "Bound parameters",
|
||||
paramsDetailCount: "{{n}} binding(s)",
|
||||
discoverLoading: "Discovering…",
|
||||
discoverEmpty: "No candidates discovered",
|
||||
discoverCacheHit: "reused (no re-login)",
|
||||
discoverRefresh: "Refresh from device",
|
||||
selectAllVrfs: "Select all",
|
||||
deselectAllVrfs: "Deselect all",
|
||||
batches: "Batches",
|
||||
viewBatch: "Open",
|
||||
batchDetail: "Detail",
|
||||
export: "Export",
|
||||
exportCommands: "Export collect commands",
|
||||
exportCommandsOk: "Collect commands exported",
|
||||
exportRawLog: "Export as text",
|
||||
exportRawLogOk: "Log exported",
|
||||
noBatches: "No batches yet",
|
||||
batchCollectDetail: "Collect detail",
|
||||
batchWorkbook: "Batch workbook",
|
||||
batchId: "Batch ID",
|
||||
copyBatchId: "Copy batch ID",
|
||||
batchMessageEmpty: "No message or error",
|
||||
batchCmdSummary:
|
||||
"{{ok}} ok / {{fail}} failed / {{skipped}} skipped / {{other}} other · {{total}} counted (batch {{batchCmds}} cmds)",
|
||||
sheetCommands: "Commands",
|
||||
sheetLldp: "LLDP neighbors",
|
||||
sheetVrfRoute: "VRF route summary",
|
||||
sheetIsis: "ISIS adjacency",
|
||||
sheetIfaceBrief: "Interface brief",
|
||||
sheetArp: "ARP",
|
||||
sheetNd6: "ND6 cache",
|
||||
sheetBgpPeer: "BGP peers",
|
||||
sheetConfigIface: "Interface intent",
|
||||
sheetConfigVrf: "VRF intent",
|
||||
sheetConfigBgp: "BGP intent",
|
||||
sheetFilterPh: "Filter this sheet…",
|
||||
sheetEmpty: "No rows in this sheet",
|
||||
sheetLoading: "Loading…",
|
||||
collectCommand: "Collect command",
|
||||
viewRawLog: "Raw log",
|
||||
rawLogTitle: "Raw collect log",
|
||||
rawLogEmpty: "No raw output",
|
||||
rawLogStats: "{{lines}} lines collected · {{rows}} rows stored",
|
||||
rawLogDeclared: "declared {{declared}}",
|
||||
openWorkbook: "Open workbook",
|
||||
filterColumn: "Column",
|
||||
filterAllCols: "All columns",
|
||||
listFilterPh: "Filter NE / IP / vendor / status",
|
||||
purposeFilter: "Task purpose",
|
||||
purposeAll: "All purposes",
|
||||
purposePortrait: "Portrait",
|
||||
purposeCutoverHf: "Cutover HF",
|
||||
colPurpose: "Purpose",
|
||||
colNe: "NE",
|
||||
colStatus: "Status",
|
||||
colLast: "Last collect",
|
||||
colStarted: "Started",
|
||||
colEnded: "Ended",
|
||||
colTime: "Time",
|
||||
colRows: "DB rows",
|
||||
colRawLines: "CLI lines",
|
||||
colDeclared: "Declared",
|
||||
colActions: "Actions",
|
||||
colCommand: "Command",
|
||||
colMessage: "Message",
|
||||
pickTask: "Open details to manage a task",
|
||||
noNeedBind: "This item needs no parameter bindings",
|
||||
discoverFailed: "Discover failed",
|
||||
bindingsSaved: "Bindings saved",
|
||||
};
|
||||
|
||||
export default bizState;
|
||||
118
web/src/i18n/locales/en/collect.ts
Normal file
118
web/src/i18n/locales/en/collect.ts
Normal file
|
|
@ -0,0 +1,118 @@
|
|||
const collect = {
|
||||
statusAll: "All statuses",
|
||||
keywordPh: "Job title / ID",
|
||||
exportJobsName: "collect-jobs",
|
||||
exportRunsName: "collect-runs",
|
||||
policyTitle: "Collect policy",
|
||||
policyHint:
|
||||
"Periodic schedule is off by default (one-shot / manual). Enable it to auto-create and run jobs on an interval. Keeps the last 3 finished jobs by default.",
|
||||
policySaved: "Policy saved",
|
||||
enabled: "Enable scheduled collect",
|
||||
interval: "Collect interval",
|
||||
intervalUnitDays: "days",
|
||||
intervalUnitHours: "hours",
|
||||
historyKeep: "Jobs to keep",
|
||||
scope: "Scope",
|
||||
scopeAll: "All NEs (managed + UME)",
|
||||
scopeSelected: "Selected NEs only",
|
||||
savePolicy: "Save policy",
|
||||
collectNow: "Collect now",
|
||||
selectedCount: "{{count}} selected",
|
||||
colSource: "Source",
|
||||
policyCommandsRequired: "Add commands and save the policy before enabling schedule or collecting now",
|
||||
policyTargetsRequired: "No eligible NEs in scope; adjust scope or select NEs",
|
||||
create: {
|
||||
title: "New collection job",
|
||||
hint: "Configure commands and NEs, then create the job. Click Start in the job list to run collection.",
|
||||
selectedTitle: "Selected NEs",
|
||||
selectedEmpty: "Filter below and add NEs one by one.",
|
||||
selectedCount: "{{count}} selected",
|
||||
clearSelected: "Clear selection",
|
||||
remove: "Remove",
|
||||
pickTitle: "Eligible NEs",
|
||||
pickHint: "All managed and UME inventory NEs are selectable (any connect status). UME uses CLI connect profile credentials.",
|
||||
pickEmpty: "No matching NEs.",
|
||||
filterKeyword: "Filter",
|
||||
filterKeywordPh: "Name / IP / vendor / device type",
|
||||
add: "Add",
|
||||
addBatch: "Add selected ({{count}})",
|
||||
added: "Added",
|
||||
create: "Create job",
|
||||
creating: "Creating…",
|
||||
expand: "New",
|
||||
collapse: "Close",
|
||||
meta: "{{ne}} NE(s) selected · {{cmd}} command(s)",
|
||||
},
|
||||
eligible: {
|
||||
title: "Eligible NEs",
|
||||
hint: "All managed and UME inventory NEs are selectable (any connect status).",
|
||||
empty: "No NEs.",
|
||||
},
|
||||
form: {
|
||||
title: "Collection setup",
|
||||
jobTitle: "Job title",
|
||||
jobTitlePh: "Auto-generated if empty",
|
||||
commands: "Commands (one per line, # for comments)",
|
||||
commandsPh: "display version\ndisplay current-configuration",
|
||||
commandsHint: "Commands run in order on each device; output is saved as a text log.",
|
||||
meta: "{{ne}} NE(s) selected · {{cmd}} command(s)",
|
||||
start: "Start collection",
|
||||
starting: "Submitting…",
|
||||
},
|
||||
created: "Collection job created: {{id}}",
|
||||
started: "Collection started: {{id}}",
|
||||
paused: "Job paused",
|
||||
restarted: "Collection restarted",
|
||||
retryFailedDone: "Retrying failed devices",
|
||||
deleted: "Job deleted",
|
||||
nothingToRetry: "No failed devices to retry",
|
||||
neBusy: "Some NEs are busy in another collection job; wait for it to finish before starting",
|
||||
jobRunning: "This job is already running",
|
||||
confirmDelete: "Delete this collection job and its log files?",
|
||||
jobs: {
|
||||
title: "Collection jobs",
|
||||
listTitle: "Job list",
|
||||
col: {
|
||||
title: "Job",
|
||||
status: "Status",
|
||||
progress: "Progress",
|
||||
created: "Created",
|
||||
lastRun: "Last run",
|
||||
actions: "Actions",
|
||||
},
|
||||
ok: "ok",
|
||||
fail: "fail",
|
||||
expand: "Details",
|
||||
collapse: "Hide",
|
||||
detailTitle: "Job details",
|
||||
pause: "Pause",
|
||||
start: "Start",
|
||||
starting: "Starting…",
|
||||
restart: "Restart",
|
||||
retryFailed: "Retry failed",
|
||||
downloadResults: "Download results",
|
||||
delete: "Delete",
|
||||
autoRefresh: "Auto-refresh every 2s while jobs are running",
|
||||
runsInProgress: "Some devices are still being collected…",
|
||||
},
|
||||
kpi: {
|
||||
jobs: "Jobs",
|
||||
running: "In progress",
|
||||
idle: "Idle",
|
||||
last: "Last job",
|
||||
active: "Active jobs",
|
||||
nextDue: "Next due",
|
||||
},
|
||||
runs: {
|
||||
status: "Status",
|
||||
message: "Message",
|
||||
download: "Log",
|
||||
downloadFile: "Download",
|
||||
filterStatus: "Status filter",
|
||||
filterDevice: "Device filter",
|
||||
deviceKeywordPh: "Name / IP",
|
||||
allStatus: "All statuses",
|
||||
},
|
||||
};
|
||||
|
||||
export default collect;
|
||||
25
web/src/i18n/locales/en/common.ts
Normal file
25
web/src/i18n/locales/en/common.ts
Normal file
|
|
@ -0,0 +1,25 @@
|
|||
const common = {
|
||||
help: "Help",
|
||||
refresh: "Refresh",
|
||||
refreshing: "Refreshing…",
|
||||
query: "Search",
|
||||
clearFilters: "Clear filters",
|
||||
prevPage: "Previous",
|
||||
nextPage: "Next",
|
||||
perPage: "{{n}}/page",
|
||||
pagerMeta: "{{total}} items · page {{page}}/{{pages}}",
|
||||
jumpPage: "Go to page",
|
||||
pageSize: "Page size",
|
||||
exportCsv: "Export CSV",
|
||||
exporting: "Exporting…",
|
||||
exportOk: "Exported {{count}} rows",
|
||||
exportTruncated: "Exported first {{count}} of {{total}} rows (truncated)",
|
||||
exportFailed: "Export failed",
|
||||
opFailed: "Operation failed",
|
||||
empty: "-",
|
||||
cancel: "Cancel",
|
||||
copy: "Copy",
|
||||
copied: "Copied",
|
||||
};
|
||||
|
||||
export default common;
|
||||
58
web/src/i18n/locales/en/configSync.ts
Normal file
58
web/src/i18n/locales/en/configSync.ts
Normal file
|
|
@ -0,0 +1,58 @@
|
|||
const configSync = {
|
||||
title: "Config sync",
|
||||
syncNow: "Sync now",
|
||||
retryFailed: "Retry failed",
|
||||
pause: "Pause",
|
||||
resume: "Resume",
|
||||
stop: "Stop",
|
||||
confirmStop: "Stop this cycle and cancel remaining NE tasks?",
|
||||
started: "Sync cycle started",
|
||||
paused: "Paused",
|
||||
resumed: "Resumed",
|
||||
stopped: "Sync cycle stopped",
|
||||
policyTitle: "Sync policy",
|
||||
policySaved: "Policy saved",
|
||||
enabled: "Enable scheduled sync",
|
||||
intervalDays: "Interval (days)",
|
||||
concurrency: "Concurrency",
|
||||
historyKeep: "Config versions to keep",
|
||||
cycleKeep: "Jobs to keep",
|
||||
scope: "Scope",
|
||||
scopeAll: "All NEs",
|
||||
scopeSelected: "Selected NEs",
|
||||
savePolicy: "Save policy",
|
||||
selectedCount: "{{count}} selected",
|
||||
targetKeywordPh: "Name / IP / vendor",
|
||||
cyclesTitle: "Sync cycles",
|
||||
cyclesEmpty: "No sync cycles yet",
|
||||
tasksTitle: "Cycle tasks",
|
||||
taskKeywordPh: "Name / IP / message",
|
||||
keywordPh: "ID / trigger / message",
|
||||
statusAll: "All statuses",
|
||||
allStatus: "All statuses",
|
||||
exportCyclesName: "config-sync-cycles",
|
||||
exportTasksName: "config-sync-tasks",
|
||||
expand: "Details",
|
||||
collapse: "Collapse",
|
||||
kpi: {
|
||||
snapshots: "Snapshots",
|
||||
running: "In progress",
|
||||
idle: "Idle",
|
||||
last: "Last cycle",
|
||||
nextDue: "Next due",
|
||||
},
|
||||
col: {
|
||||
source: "Source",
|
||||
name: "Device",
|
||||
vendor: "Vendor",
|
||||
trigger: "Trigger",
|
||||
status: "Status",
|
||||
progress: "Progress",
|
||||
started: "Started",
|
||||
ended: "Ended",
|
||||
message: "Message",
|
||||
actions: "Actions",
|
||||
},
|
||||
};
|
||||
|
||||
export default configSync;
|
||||
48
web/src/i18n/locales/en/index.ts
Normal file
48
web/src/i18n/locales/en/index.ts
Normal file
|
|
@ -0,0 +1,48 @@
|
|||
// en messages, one file per namespace (key prefix of t("ns.key")).
|
||||
import common from "./common";
|
||||
import workbench from "./workbench";
|
||||
import network from "./network";
|
||||
import bizState from "./bizState";
|
||||
import bizCompare from "./bizCompare";
|
||||
import bizMigration from "./bizMigration";
|
||||
import bizMonitorTpl from "./bizMonitorTpl";
|
||||
import portTraffic from "./portTraffic";
|
||||
import lldpLinks from "./lldpLinks";
|
||||
import configSync from "./configSync";
|
||||
import networkDevices from "./networkDevices";
|
||||
import networkConfigs from "./networkConfigs";
|
||||
import layout from "./layout";
|
||||
import auth from "./auth";
|
||||
import collect from "./collect";
|
||||
import managedNe from "./managedNe";
|
||||
import ume from "./ume";
|
||||
import webcrt from "./webcrt";
|
||||
import topology from "./topology";
|
||||
import topoClassify from "./topoClassify";
|
||||
import audit from "./audit";
|
||||
|
||||
const en = {
|
||||
common,
|
||||
workbench,
|
||||
network,
|
||||
bizState,
|
||||
bizCompare,
|
||||
bizMigration,
|
||||
bizMonitorTpl,
|
||||
portTraffic,
|
||||
lldpLinks,
|
||||
configSync,
|
||||
networkDevices,
|
||||
networkConfigs,
|
||||
layout,
|
||||
auth,
|
||||
collect,
|
||||
managedNe,
|
||||
ume,
|
||||
webcrt,
|
||||
topology,
|
||||
topoClassify,
|
||||
audit,
|
||||
};
|
||||
|
||||
export default en;
|
||||
26
web/src/i18n/locales/en/layout.ts
Normal file
26
web/src/i18n/locales/en/layout.ts
Normal file
|
|
@ -0,0 +1,26 @@
|
|||
const layout = {
|
||||
title: "UME Integration",
|
||||
titleUme: "UME Sync",
|
||||
titleNetwork: "Network Management",
|
||||
titleManagedNe: "NE Management",
|
||||
titleCollect: "Batch Collect",
|
||||
titleWebcrt: "WebCRT",
|
||||
titleTopology: "Topology",
|
||||
titlePortTrafficWall: "Traffic wall",
|
||||
titleUsers: "Users",
|
||||
titleAudit: "Audit",
|
||||
titleApiKeys: "API Keys",
|
||||
titleSessions: "Login sessions",
|
||||
navUme: "UME",
|
||||
netxApi: "netx api",
|
||||
oclawBridge: "oclaw WSS",
|
||||
activeTasks: "Active {{count}}",
|
||||
activeTasksHint: "Open Audit · Task overview",
|
||||
language: "Language",
|
||||
switchLanguage: "Switch language / 切换语言",
|
||||
moreMenu: "More",
|
||||
langZh: "中文",
|
||||
langEn: "English",
|
||||
};
|
||||
|
||||
export default layout;
|
||||
110
web/src/i18n/locales/en/lldpLinks.ts
Normal file
110
web/src/i18n/locales/en/lldpLinks.ts
Normal file
|
|
@ -0,0 +1,110 @@
|
|||
const lldpLinks = {
|
||||
title: "LLDP links",
|
||||
collectNow: "Collect now",
|
||||
retryFailed: "Retry failed",
|
||||
started: "LLDP collect started",
|
||||
pause: "Pause",
|
||||
resume: "Resume",
|
||||
stop: "Stop",
|
||||
confirmStop: "Stop this job and skip remaining NEs?",
|
||||
paused: "Paused",
|
||||
resumed: "Resumed",
|
||||
stopped: "Collect stopped",
|
||||
policyTitle: "Collect policy",
|
||||
policySaved: "Policy saved",
|
||||
enabled: "Enable scheduled collect",
|
||||
autoAddUnmatched: "Auto-add unmatched neighbors as placeholders on discover",
|
||||
autoAddUnmatchedHint:
|
||||
"Shared by scheduled collect and canvas discover. Off = record unmatched only, no placeholder NE. Default on.",
|
||||
intervalDays: "Interval (days)",
|
||||
interval: "Collect interval",
|
||||
intervalUnitDays: "days",
|
||||
intervalUnitHours: "hours",
|
||||
concurrency: "Concurrency",
|
||||
historyKeep: "Jobs to keep",
|
||||
scope: "Scope",
|
||||
scopeAll: "All NEs (managed + UME)",
|
||||
scopeSelected: "Selected NEs",
|
||||
savePolicy: "Save policy",
|
||||
selectedCount: "{{count}} selected",
|
||||
targetKeywordPh: "Name / IP / vendor",
|
||||
jobsTitle: "Collect jobs",
|
||||
jobDetailTitle: "Job details",
|
||||
expand: "Details",
|
||||
edgesTitle: "Fabric links",
|
||||
edgeKeywordPh: "Endpoint name or IP",
|
||||
edgeStatusAll: "All statuses",
|
||||
edgeStatusActive: "Active",
|
||||
edgeStatusMissing: "Missing",
|
||||
edgeSourceAll: "All sources",
|
||||
exportEdgesName: "lldp-fabric-edges",
|
||||
exportJobsName: "lldp-collect-jobs",
|
||||
exportItemsName: "lldp-job-items",
|
||||
statusAll: "All statuses",
|
||||
jobKeywordPh: "Job ID / error / scope",
|
||||
itemKeywordPh: "NE name / IP / error",
|
||||
itemResultAll: "All results",
|
||||
missCount: "Miss cycles",
|
||||
replacedBy: "Replaced",
|
||||
kpi: {
|
||||
nodes: "Fabric nodes",
|
||||
edges: "Active links",
|
||||
missing: "Missing",
|
||||
running: "In progress",
|
||||
idle: "Idle",
|
||||
last: "Last job",
|
||||
nextDue: "Next due",
|
||||
},
|
||||
col: {
|
||||
source: "Source",
|
||||
name: "Device",
|
||||
vendor: "Vendor",
|
||||
trigger: "Trigger",
|
||||
scope: "Scope",
|
||||
status: "Status",
|
||||
progress: "Progress",
|
||||
edges: "Edges",
|
||||
missingDelta: "Missing/purged",
|
||||
started: "Started",
|
||||
ended: "Ended",
|
||||
neighbors: "Neighbors",
|
||||
error: "Error",
|
||||
aSide: "Side A",
|
||||
bSide: "Side B",
|
||||
aPort: "Port A",
|
||||
bPort: "Port B",
|
||||
lastSeen: "Last seen",
|
||||
},
|
||||
jobStatus: {
|
||||
running: "Running",
|
||||
pending: "Pending",
|
||||
paused: "Paused",
|
||||
done: "Done",
|
||||
failed: "Failed",
|
||||
cancelled: "Cancelled",
|
||||
stopped: "Stopped",
|
||||
},
|
||||
triggerMode: {
|
||||
manual: "Manual",
|
||||
schedule: "Scheduled",
|
||||
topology: "Topology canvas",
|
||||
retry_failed: "Retry failed",
|
||||
},
|
||||
jobScope: {
|
||||
all: "All NEs",
|
||||
ne_ids: "Selected NEs",
|
||||
selected: "Selected NEs",
|
||||
},
|
||||
itemResult: {
|
||||
ok: "OK",
|
||||
warn: "Warn",
|
||||
fail: "Fail",
|
||||
},
|
||||
edgeSource: {
|
||||
lldp: "LLDP",
|
||||
manual: "Manual",
|
||||
stale: "Stale",
|
||||
},
|
||||
};
|
||||
|
||||
export default lldpLinks;
|
||||
202
web/src/i18n/locales/en/managedNe.ts
Normal file
202
web/src/i18n/locales/en/managedNe.ts
Normal file
|
|
@ -0,0 +1,202 @@
|
|||
const managedNe = {
|
||||
title: "Network Elements",
|
||||
credsNotConfigured:
|
||||
"NETX_CREDENTIAL_SECRET_KEY is not set. Configure a Fernet key in .env and restart the API to store passwords.",
|
||||
add: "Add NE",
|
||||
importBtn: "Import",
|
||||
downloadTemplate: "Download template",
|
||||
importing: "Importing…",
|
||||
edit: "Edit",
|
||||
delete: "Delete",
|
||||
openTerminal: "Terminal",
|
||||
confirmDelete:
|
||||
"Delete this network element? If its Fabric node is managed-only (no UME binding), that node and its direct links will also be removed.",
|
||||
batchDelete: "Batch delete",
|
||||
batchDeleting: "Deleting…",
|
||||
batchDeleteConfirm:
|
||||
"Delete {{n}} selected network element(s)? Cannot be undone. Managed-only Fabric nodes cascade (node + direct links); nodes still bound to UME keep topology.",
|
||||
batchDeleteDone: "Deleted {{n}} network element(s)",
|
||||
batchDeleteSelectRequired: "Select network elements to delete",
|
||||
keywordPh: "name / IP / user / tags",
|
||||
allVendors: "All vendors",
|
||||
allConnectStatus: "All connect status",
|
||||
stats: {
|
||||
title: "Overview",
|
||||
total: "{{n}} NEs managed",
|
||||
pass: "Connected",
|
||||
fail: "Failed",
|
||||
unknown: "Untested",
|
||||
testing: "Testing",
|
||||
batchProxy: "Batch add proxy",
|
||||
batchTest: "Batch connect-test",
|
||||
tagFilter: "Filter by tag",
|
||||
all: "All",
|
||||
allTag: "All (no tag filter)",
|
||||
noTag: "No tags",
|
||||
tagStats: "Top tags",
|
||||
confirm: "Apply to {{n}} NE(s). Continue?",
|
||||
proxyDone: "Proxy applied to {{n}} NE(s)",
|
||||
testDone: "Connect-test submitted for {{n}} NE(s)",
|
||||
loadingIds: "Loading…",
|
||||
},
|
||||
col: {
|
||||
name: "Name",
|
||||
vendor: "Vendor",
|
||||
deviceType: "Device type",
|
||||
execPolicy: "CLI exec policy",
|
||||
source: "Source",
|
||||
ip: "Management IP",
|
||||
port: "Port",
|
||||
protocol: "Protocol",
|
||||
user: "Username",
|
||||
password: "Password",
|
||||
tags: "Tags",
|
||||
remark: "Remark",
|
||||
connect: "Connect",
|
||||
testedAt: "Tested at",
|
||||
actions: "Actions",
|
||||
},
|
||||
execPolicy: {
|
||||
readonly: "Read-only (show/display/ping)",
|
||||
linuxShell: "Shell / script (multiline / heredoc OK)",
|
||||
unrestricted: "Lab open (multiline / heredoc OK)",
|
||||
hint: "Applies to MCP/API execManagedNe only. Default is read-only; Linux and MikroTik (routeros/switchos) may use shell / lab-open for multiline scripts and heredoc.",
|
||||
},
|
||||
source: {
|
||||
manual: "Manual",
|
||||
ume_sync: "UME sync",
|
||||
webcrt: "WebCRT",
|
||||
lldp: "LLDP placeholder",
|
||||
topology: "Topology placeholder",
|
||||
},
|
||||
connect: {
|
||||
run: "Connectivity test",
|
||||
running: "Testing…",
|
||||
submitted: "Submitted tests for {{n}} device(s)",
|
||||
retest: "Test again",
|
||||
},
|
||||
connectDetail: "Details",
|
||||
connectDetailTitle: "Connectivity test log",
|
||||
connectDetailEmpty:
|
||||
"No log yet. Run a connectivity test first; failures store full errors and hop context (passwords excluded).",
|
||||
umeSync: {
|
||||
sync: "Sync UME NEs",
|
||||
syncing: "Syncing…",
|
||||
delete: "Delete UME NEs",
|
||||
deleting: "Deleting…",
|
||||
deleteConfirm:
|
||||
"Delete all managed NEs created from UME sync? Cannot be undone. Fabric nodes that become fully orphaned (no UME left) are removed with their direct links.",
|
||||
done: "UME sync done: {{inserted}} inserted, {{updated}} updated, {{deleted}} deleted, {{total}} inventory total",
|
||||
deletedDone: "Deleted {{n}} UME-synced NEs",
|
||||
},
|
||||
account: {
|
||||
batchAdd: "Batch add account",
|
||||
batchByTag: "Batch account by tag",
|
||||
batchTitle: "Batch add account",
|
||||
batchHint: "Apply the account info below to {{n}} selected NE(s).",
|
||||
batchByTagHint: "Apply the account info below to NEs under the selected tag; leave password blank to update only username.",
|
||||
batchDone: "Account updated for {{n}} NE(s)",
|
||||
selectRequired: "Select network elements first",
|
||||
applying: "Applying…",
|
||||
apply: "Apply to NEs",
|
||||
usernameOrPasswordRequired: "Enter at least a username or a password",
|
||||
passwordOptionalBatch: "leave blank to keep unchanged",
|
||||
},
|
||||
help:
|
||||
"[Bulk import]\n" +
|
||||
"· Required: device_type, ip, username, port, protocol, name, vendor (download template first)\n" +
|
||||
"· password may be empty for bastion-managed / later Batch add proxy; required for direct login\n" +
|
||||
"· Flow: import → select rows → Batch add proxy\n\n" +
|
||||
"[Jump / bastion]\n" +
|
||||
"· Username template: {hop_user}@{target_user}@{target_ip} (bastion host filled separately)\n" +
|
||||
"· Managed mode: Jump password (Vault); target password optional. Manual mode needs target password\n" +
|
||||
"· JumpServer/CBH ports often 2222; some sites use 22\n\n" +
|
||||
"[Connectivity / edit]\n" +
|
||||
"· Storing passwords needs NETX_CREDENTIAL_SECRET_KEY\n" +
|
||||
"· Blank password on edit keeps current; use Details hop context after failed connect (no secrets)",
|
||||
importResult: {
|
||||
done: "Import done: {{inserted}} inserted, {{updated}} updated, {{failed}} failed row(s)",
|
||||
},
|
||||
form: {
|
||||
requiredHint: "Fields marked with * are required",
|
||||
nameConnectHint: "After a successful connectivity test, name is replaced with the device hostname",
|
||||
createTitle: "Add network element",
|
||||
editTitle: "Edit network element",
|
||||
save: "Save",
|
||||
saving: "Saving…",
|
||||
cancel: "Cancel",
|
||||
created: "Network element created",
|
||||
updated: "Network element updated",
|
||||
deleted: "Network element deleted",
|
||||
passwordRequired: "Password is required",
|
||||
passwordOptional: "leave blank to keep unchanged",
|
||||
},
|
||||
hop: {
|
||||
sectionTitle: "Jump host / proxy",
|
||||
type: "Jump type",
|
||||
enable: "Connect to target via jump host",
|
||||
vendor: {
|
||||
zte: "ZTE device (CLI jump)",
|
||||
huawei: "Huawei device (CLI jump)",
|
||||
cisco: "Cisco device (CLI jump)",
|
||||
linux: "Linux server (SSH tunnel)",
|
||||
bastion: "Bastion host (SSH protocol proxy)",
|
||||
},
|
||||
zteHint: "Run ssh/telnet on the ZTE device to reach the target; target credentials use secondary auth.",
|
||||
huaweiHint: "Run telnet / stelnet (SSH) on the Huawei hop; stelnet is SSH. Target credentials use secondary auth.",
|
||||
ciscoHint: "Run Cisco ssh -vrf / telnet /vrf jump commands; target credentials use secondary auth.",
|
||||
linuxHint: "SSH to the Linux bastion, then direct-tcpip tunnel to target IP:port (ProxyJump-style).",
|
||||
bastionHint:
|
||||
"SSH with composite username via bastion protocol proxy. Hop host may be an IP or FQDN. Examples: bastion-user@target-user@198.51.100.20@192.0.2.10 or bastion-user@target-user@198.51.100.20@ssh-bastion.example.com; password is the bastion/Vault password. JumpServer/CBH often use port 2222.",
|
||||
targetAuthMode: "Target credentials",
|
||||
targetAuthBastionManaged: "Bastion-managed (target password optional)",
|
||||
targetAuthManual: "Manual (secondary auth after connect)",
|
||||
targetAuthHint: "Bastion-managed needs only bastion password; manual mode requires target NE password.",
|
||||
usernameTemplate: "SSH username template",
|
||||
templateHintBastion:
|
||||
"Default {hop_user}@{target_user}@{target_ip}. Bastion address (IP or FQDN) goes in Jump host. CLI example: ssh bastion-user@target-user@198.51.100.20@ssh-bastion.example.com.",
|
||||
host: "Jump host",
|
||||
hostPlaceholderBastion: "192.0.2.10 or ssh-bastion.example.com",
|
||||
hostHintBastion:
|
||||
"IP or FQDN. You can paste a full SSH destination (e.g. bastion-user@target-user@198.51.100.20@ssh-bastion.example.com); on blur it splits into jump username + host.",
|
||||
port: "Jump port",
|
||||
protocol: "Jump protocol",
|
||||
protocolSshStelnet: "ssh (stelnet)",
|
||||
username: "Jump username",
|
||||
password: "Jump password",
|
||||
vrf: "Mgmt VRF (optional)",
|
||||
vpnInstance: "VPN-Instance (optional)",
|
||||
vrfCisco: "VRF (optional, e.g. MGMT)",
|
||||
enterSystemView: "Huawei system-view before jump",
|
||||
enterSystemViewNo: "Stay in user-view (default)",
|
||||
enterSystemViewYes: "Enter system-view first",
|
||||
enterSystemViewHint:
|
||||
"Some Huawei hops only accept stelnet/telnet in system-view. Choose explicitly; NetX will not auto-retry.",
|
||||
commandTemplate: "Jump command template",
|
||||
templateHint:
|
||||
"ZTE CLI: telnet {target_ip}, telnet {target_ip} vrf {vrf}, ssh {target_ip}, ssh {target_ip} vrf {vrf}. Auto-suggested from jump protocol/VRF; same when left blank. Target credentials via secondary auth prompts.",
|
||||
templateHintHuawei:
|
||||
"Huawei CLI: telnet {target_ip}, telnet vpn-instance {vrf} {target_ip}, stelnet {target_ip}, stelnet {target_ip} -vpn-instance {vrf}. SSH protocol maps to stelnet. Auto-suggested when left blank.",
|
||||
templateHintCisco:
|
||||
"Cisco CLI: ssh {target_ip}, ssh -vrf {vrf} {target_ip}, telnet {target_ip}, telnet {target_ip} /vrf {vrf}. Auto-suggested when left blank.",
|
||||
badge: {
|
||||
zte: "ZTE hop",
|
||||
huawei: "Huawei hop",
|
||||
cisco: "Cisco hop",
|
||||
linux: "Linux hop",
|
||||
bastion: "Bastion",
|
||||
},
|
||||
hostRequired: "Jump host is required",
|
||||
userRequired: "Jump username is required",
|
||||
passwordRequired: "Jump password is required",
|
||||
batchAdd: "Add proxy",
|
||||
batchTitle: "Batch add jump proxy",
|
||||
batchHint: "Apply the jump-host settings below to {{n}} selected NE(s) (overwrites existing proxy config).",
|
||||
batchDone: "Proxy applied to {{n}} NE(s)",
|
||||
selectRequired: "Select network elements first",
|
||||
applying: "Applying…",
|
||||
apply: "Apply to selected",
|
||||
},
|
||||
};
|
||||
|
||||
export default managedNe;
|
||||
33
web/src/i18n/locales/en/network.ts
Normal file
33
web/src/i18n/locales/en/network.ts
Normal file
|
|
@ -0,0 +1,33 @@
|
|||
const network = {
|
||||
title: "Network Management",
|
||||
nav: {
|
||||
detail: "Network details",
|
||||
tasks: "Monitoring tasks",
|
||||
cutoverCompare: "Cutover compare",
|
||||
topologyMgmt: "Topology management",
|
||||
devices: "Device list",
|
||||
topology: "Topology",
|
||||
lldpLinks: "LLDP",
|
||||
topoClassify: "Classify",
|
||||
alarms: "Alarms",
|
||||
configs: "Configurations",
|
||||
webcrt: "WebCRT",
|
||||
collectTasks: "Collection tasks",
|
||||
configSync: "Config sync",
|
||||
portTraffic: "Port traffic",
|
||||
portTrafficWall: "Traffic wall",
|
||||
bizState: "Business monitor",
|
||||
bizCompare: "Business compare",
|
||||
bizMigration: "Cutover monitor",
|
||||
compareTemplates: "Compare templates",
|
||||
monitorTemplates: "Monitor templates",
|
||||
},
|
||||
collapseNav: "Collapse sidebar",
|
||||
expandNav: "Expand sidebar",
|
||||
placeholder: {
|
||||
title: "Coming soon",
|
||||
body: "This capability is not available yet.",
|
||||
},
|
||||
};
|
||||
|
||||
export default network;
|
||||
24
web/src/i18n/locales/en/networkConfigs.ts
Normal file
24
web/src/i18n/locales/en/networkConfigs.ts
Normal file
|
|
@ -0,0 +1,24 @@
|
|||
const networkConfigs = {
|
||||
title: "Configurations",
|
||||
keywordPh: "Name / IP / ID",
|
||||
vendorPh: "Vendor",
|
||||
allSource: "All sources",
|
||||
empty: "No synced configs yet. Run Config sync first.",
|
||||
view: "View",
|
||||
export: "Export",
|
||||
exportBoth: "Export all",
|
||||
exportOk: "Config exported",
|
||||
exportListName: "network-configs",
|
||||
close: "Close",
|
||||
tabSet: "Set format",
|
||||
tabHier: "Hierarchical",
|
||||
col: {
|
||||
name: "Device",
|
||||
vendor: "Vendor",
|
||||
source: "Source",
|
||||
size: "Size",
|
||||
collected: "Collected",
|
||||
},
|
||||
};
|
||||
|
||||
export default networkConfigs;
|
||||
17
web/src/i18n/locales/en/networkDevices.ts
Normal file
17
web/src/i18n/locales/en/networkDevices.ts
Normal file
|
|
@ -0,0 +1,17 @@
|
|||
const networkDevices = {
|
||||
title: "Device list",
|
||||
keywordPh: "Name / IP / ID",
|
||||
allSource: "All sources",
|
||||
empty: "No network elements.",
|
||||
exportName: "network-devices",
|
||||
col: {
|
||||
source: "Source",
|
||||
name: "Name",
|
||||
vendor: "Vendor",
|
||||
deviceType: "Device type",
|
||||
connect: "Connect",
|
||||
actions: "Actions",
|
||||
},
|
||||
};
|
||||
|
||||
export default networkDevices;
|
||||
207
web/src/i18n/locales/en/portTraffic.ts
Normal file
207
web/src/i18n/locales/en/portTraffic.ts
Normal file
|
|
@ -0,0 +1,207 @@
|
|||
const portTraffic = {
|
||||
title: "Port traffic",
|
||||
create: "Monitor device",
|
||||
backList: "Back to list",
|
||||
created: "Device monitoring added",
|
||||
createFailed: "Create failed",
|
||||
updated: "Saved",
|
||||
interfacesSaved: "Interfaces updated",
|
||||
started: "Started",
|
||||
paused: "Paused",
|
||||
stopped: "Stopped",
|
||||
statusRunning: "Running",
|
||||
statusPaused: "Paused",
|
||||
statusStopped: "Stopped",
|
||||
statusDraft: "Draft",
|
||||
collecting: "Collecting",
|
||||
deleted: "Deleted",
|
||||
confirmDelete: "Delete this device monitoring and its samples?",
|
||||
empty: "No devices monitored yet. Pick a NE and interfaces to start.",
|
||||
keywordPh: "Name / IP / note / ID",
|
||||
allStatus: "All statuses",
|
||||
exportDevicesName: "port-traffic-devices",
|
||||
exportEventsName: "port-traffic-events",
|
||||
wall: "Ops wall",
|
||||
wallTitle: "Port traffic wall",
|
||||
toDevices: "Manage devices",
|
||||
wallEmpty: "No monitored devices yet. Add a device and pick interfaces first.",
|
||||
fullscreen: "Fullscreen",
|
||||
exitFullscreen: "Exit fullscreen",
|
||||
board: "Board",
|
||||
boardPick: "Select board",
|
||||
boardPickHint: "Select or create a traffic wall board.",
|
||||
boardEmpty: "No boards yet. Create one for cutover or duty monitoring.",
|
||||
boardDefaultName: "Untitled board",
|
||||
boardName: "Name",
|
||||
boardCols: "Columns",
|
||||
boardCreate: "New board",
|
||||
boardEdit: "Edit layout",
|
||||
boardSave: "Save",
|
||||
boardCancel: "Cancel",
|
||||
boardSaved: "Board saved",
|
||||
boardCreated: "Board created",
|
||||
boardDeleted: "Board deleted",
|
||||
boardConfirmDelete: "Delete this board and its panels?",
|
||||
boardUnsavedLeave: "You have unsaved changes. Leave anyway?",
|
||||
boardOpenTab: "Open in new tab",
|
||||
boardOpen: "Open wall",
|
||||
boardListHint: "Open a board in its own browser tab; launching Network from the workbench will not refresh open walls.",
|
||||
boardPanelCount: "Panels",
|
||||
boardUpdated: "Updated",
|
||||
boardClosedHint: "You can close this tab, or reopen from Network → Traffic wall list.",
|
||||
boardAddPanel: "Add panel",
|
||||
boardNoPanels: "No panels yet. Edit the board and add interfaces.",
|
||||
boardPickDevice: "Select device",
|
||||
boardPanelSettings: "Panel settings",
|
||||
boardPanelTitle: "Title (optional)",
|
||||
boardColSpan: "Column span",
|
||||
boardPanelStale: "Interface missing or inactive. Please reselect.",
|
||||
boardRetarget: "Reselect port",
|
||||
edit: "Edit",
|
||||
save: "Save",
|
||||
start: "Start",
|
||||
pause: "Pause",
|
||||
stop: "Stop",
|
||||
delete: "Delete",
|
||||
wizStep1: "Device",
|
||||
wizStep2: "Interfaces",
|
||||
wizStep3: "Params",
|
||||
step1: "Params",
|
||||
step2: "NEs",
|
||||
step3: "Interfaces",
|
||||
step4: "Confirm",
|
||||
prev: "Back",
|
||||
next: "Next",
|
||||
fieldTitle: "Task name",
|
||||
titlePh: "e.g. Uplink group",
|
||||
titleRequired: "Task name is required",
|
||||
portsRequired: "Select at least one interface",
|
||||
interval: "Interval (sec)",
|
||||
retention: "Retention (days)",
|
||||
retentionHintWizard: "Use ≥8 days for week-over-week compare",
|
||||
concurrency: "Concurrency",
|
||||
note: "Note",
|
||||
notePh: "Optional",
|
||||
startNow: "Start after create",
|
||||
neKeywordPh: "Name / IP / vendor",
|
||||
deepLinkHint: "Opened from topology: NE {{ne}}{{ifname}}. Confirm selection, then continue.",
|
||||
deepLinkIfname: ", interface {{ifname}}",
|
||||
selectedNe: "{{count}} NE(s) selected",
|
||||
selectedOneNe: "Selected",
|
||||
selectedPorts: "{{count}} interface(s) selected",
|
||||
pickNeFirst: "Select one NE first",
|
||||
discover: "Discover interfaces",
|
||||
discoverDetail: "Discover detail",
|
||||
discoverCommand: "Command",
|
||||
discoverRaw: "Raw log",
|
||||
discoverOk: "Discover succeeded",
|
||||
discoverFail: "Discover failed",
|
||||
confirmCreate: "Start monitoring",
|
||||
wallTask: "Task",
|
||||
wallPort: "Interface",
|
||||
wallDevice: "Device",
|
||||
wallDeviceLabel: "Device",
|
||||
pickPort: "Select interface",
|
||||
range: "Range",
|
||||
compare: "Compare",
|
||||
compareOff: "Off",
|
||||
compareDay: "Yesterday (same TOD)",
|
||||
compareWeek: "Last week (same weekday)",
|
||||
compareShift: "Previous window",
|
||||
compareCustom: "Custom offset",
|
||||
offsetHours: "Offset (hours)",
|
||||
aheadHours: "Extend past now (hours)",
|
||||
aheadHoursHint:
|
||||
"Push the chart end past now. With period compare enabled, the overlay can show trend after the current clock; 0 ends at now.",
|
||||
mapBaselineHint:
|
||||
"Mapped baseline can be combined with period compare; turn on Yesterday yourself when you need that contrast.",
|
||||
baseline: "Baseline",
|
||||
baselineAt: "Baseline time",
|
||||
baselineDevice: "Baseline device",
|
||||
baselinePort: "Baseline interface",
|
||||
seriesCurrentIn: "Current In",
|
||||
seriesCurrentOut: "Current Out",
|
||||
seriesBaselineIn: "Baseline In",
|
||||
seriesBaselineOut: "Baseline Out",
|
||||
mapBaselinePort: "Mapped baseline interface",
|
||||
mapBaselineTask: "Mapped baseline task",
|
||||
mapBaselineNone: "None",
|
||||
retentionHint: "Week compare needs retention_days ≥ 8 or the baseline may be empty.",
|
||||
collectNow: "Collect now",
|
||||
collectStarted: "Collect triggered",
|
||||
collectBusy: "Collect already running",
|
||||
targetError: "Last interface error",
|
||||
waitSamples: "Samples appear after the device runs; or click Collect now. Chart auto-refreshes.",
|
||||
waitAfterError: "Collect failed — open Logs under Traffic monitoring for details, then Collect now.",
|
||||
log: "Logs",
|
||||
logTitle: "Collect logs",
|
||||
logEmpty: "No log entries yet.",
|
||||
logDevice: "Device",
|
||||
logLevel: "Level",
|
||||
logTime: "Time",
|
||||
logMessage: "Message",
|
||||
logClose: "Close",
|
||||
logHasError: "Has error",
|
||||
rebind: "Rebind NE",
|
||||
rebindTitle: "Rebind network element",
|
||||
rebindOk: "Rebound to selected NE; collect can resume",
|
||||
rebindFailed: "Rebind failed",
|
||||
rebindHint:
|
||||
"Pick the correct NE and confirm. IPs may not be unique, and a matching IP does not mean the same device. History is kept.",
|
||||
rebindCurrent: "Current binding",
|
||||
rebindEmpty: "No NEs found — add the device back under inventory first.",
|
||||
rebindSameIp: "Same IP",
|
||||
rebindSameIpHint: "IP matches current monitor — still verify name and ID",
|
||||
rebindSubmit: "Confirm rebind",
|
||||
rebindConfirm: "Bind monitoring to {{ne}}? History samples are kept.",
|
||||
err: {
|
||||
managedNeNotFound:
|
||||
"Managed NE not found (often deleted then re-created with a new id). Use Rebind NE and pick manually.",
|
||||
targetErrors: "{{count}} interface(s) failed",
|
||||
unsupportedVendor: "Unsupported vendor / device type",
|
||||
invalidSource: "Invalid NE source",
|
||||
rebindPickFirst: "Select an NE first",
|
||||
rebindNeMissing: "Selected NE not found — refresh and try again",
|
||||
rebindSourceMismatch: "NE source does not match this monitor device",
|
||||
alreadyMonitored: "That NE is already monitored by another device entry",
|
||||
},
|
||||
kpiLatest: "latest",
|
||||
kpiBw: "Bandwidth",
|
||||
latestAt: "Latest sample",
|
||||
hoverPoint: "Cursor",
|
||||
wallLiveTitle: "Live traffic",
|
||||
filterView: "View",
|
||||
filterMap: "Mapped baseline",
|
||||
yMode: "Y axis",
|
||||
yModeAuto: "Auto (incl. baseline)",
|
||||
yModeCurrent: "Fit current",
|
||||
yModeUtil: "Utilization %",
|
||||
kpi: {
|
||||
tasks: "Tasks",
|
||||
devices: "Devices",
|
||||
running: "Running",
|
||||
ports: "Interfaces",
|
||||
samples24h: "Samples 24h",
|
||||
},
|
||||
col: {
|
||||
title: "Task",
|
||||
device: "Device",
|
||||
status: "Status",
|
||||
ports: "Interfaces",
|
||||
interval: "Interval",
|
||||
last: "Last collect",
|
||||
actions: "Actions",
|
||||
source: "Source",
|
||||
name: "Device",
|
||||
vendor: "Vendor",
|
||||
ifname: "Interface",
|
||||
bw: "BW",
|
||||
upDown: "Admin / Phy / Prot",
|
||||
admin: "Admin",
|
||||
phy: "Phy",
|
||||
prot: "Prot",
|
||||
description: "Description",
|
||||
},
|
||||
};
|
||||
|
||||
export default portTraffic;
|
||||
69
web/src/i18n/locales/en/topoClassify.ts
Normal file
69
web/src/i18n/locales/en/topoClassify.ts
Normal file
|
|
@ -0,0 +1,69 @@
|
|||
const topoClassify = {
|
||||
title: "Classify",
|
||||
openTopo: "Topology",
|
||||
inventory: "NE inventory",
|
||||
keywordPh: "Filter by name/IP",
|
||||
filterLevelAll: "All levels",
|
||||
filterRegionAll: "All regions",
|
||||
filterUnmatchedOff: "No unmatched filter",
|
||||
kindAny: "Missing level or region",
|
||||
kindLevel: "Missing level",
|
||||
kindRegion: "Missing region",
|
||||
filterLinkAll: "All link states",
|
||||
filterLinkLinked: "Linked inventory",
|
||||
filterLinkOrphaned: "Detached",
|
||||
colLink: "Link",
|
||||
linkManaged: "Managed",
|
||||
linkUme: "UME",
|
||||
linkBoth: "Managed+UME",
|
||||
linkOrphaned: "Detached",
|
||||
levelExternal: "L0 external",
|
||||
levelCore: "L1 core",
|
||||
levelCoreSub: "L1.1 core′",
|
||||
levelAgg: "L2 aggregation",
|
||||
levelAggSub: "L2.1 agg′",
|
||||
levelAccess: "L3 access",
|
||||
levelAccessSub: "L3.1 deeper access",
|
||||
levelInvalid: "Invalid level (0–99.9, one decimal)",
|
||||
sourceManual: "Manual",
|
||||
sourceUmeSync: "UME sync",
|
||||
sourceLldp: "LLDP placeholder",
|
||||
sourceTopology: "Topology placeholder",
|
||||
sourceWebcrt: "WebCRT",
|
||||
regexTitle: "Regex find",
|
||||
patternPh: "Regex, e.g. ^CORE- or -EDGE-",
|
||||
fieldName: "Name",
|
||||
fieldNameIp: "Name+IP",
|
||||
findMatches: "Find matches",
|
||||
matchOk: "Matched {{count}}; selected",
|
||||
matchHint: "{{count}} matched",
|
||||
assignLevel: "Level only",
|
||||
assignRegion: "Region only",
|
||||
assignBoth: "Level + region",
|
||||
clearRegion: "Clear region",
|
||||
confirmAssign: "Confirm assign",
|
||||
bulkConfirm: "Write tags to {{count}} selected/matched NE(s)?",
|
||||
bulkOk: "Updated {{count}}",
|
||||
selectedCount: "{{count}} selected",
|
||||
selectPage: "Select page",
|
||||
colNe: "NE",
|
||||
colLevel: "Level",
|
||||
colRegion: "Region",
|
||||
colActions: "Actions",
|
||||
edit: "Edit",
|
||||
save: "Save",
|
||||
cancel: "Cancel",
|
||||
delete: "Delete",
|
||||
deleteSelected: "Delete nodes ({{count}})",
|
||||
deleteConfirm:
|
||||
"Delete {{count}} fabric node(s) (placements and edges)? Managed/UME inventory is not touched.",
|
||||
deleteOk: "Deleted {{count}} node(s)",
|
||||
deleteHint:
|
||||
"Only orphaned or LLDP/WebCRT placeholder fabric nodes can be deleted; UME-only and real managed NEs cannot",
|
||||
deleteBlocked: "UME-only or still linked to real managed inventory — cannot delete here",
|
||||
rowSaved: "Saved",
|
||||
loading: "Loading…",
|
||||
empty: "No NEs.",
|
||||
};
|
||||
|
||||
export default topoClassify;
|
||||
344
web/src/i18n/locales/en/topology.ts
Normal file
344
web/src/i18n/locales/en/topology.ts
Normal file
|
|
@ -0,0 +1,344 @@
|
|||
const topology = {
|
||||
title: "Topology",
|
||||
maps: "Maps",
|
||||
tree: "Topology tree",
|
||||
treeLoading: "Loading tree…",
|
||||
treeLoadFailed: "Failed to load topology tree",
|
||||
treeRetry: "Retry",
|
||||
graphLoading: "Loading topology…",
|
||||
graphLoadFailed: "Failed to load topology",
|
||||
graphRefreshing: "Refreshing…",
|
||||
canvasEmpty: "No NEs on this map yet",
|
||||
canvasEmptyHint: "Use Add NE, or pick a region that already has devices.",
|
||||
treeHint: "Top level is a Root (nav only); its unique Root Map is the canvas. Open the root map or a sub-region to edit devices.",
|
||||
treeSearch: "Search NEs across maps",
|
||||
treeSearchPh: "Name / IP",
|
||||
treeSearchEmpty: "No matching NEs",
|
||||
treeSearchNoViews: "Not on any map",
|
||||
treeSearchNotOnMap: "This NE is not placed on any topology map yet",
|
||||
locateNotOnCanvas:
|
||||
"This NE is missing from the world-map sample and has no world coordinates. Open a region map instead.",
|
||||
treeSearchViewCount: "{{count}} map(s)",
|
||||
treeSearchTruncated: "Showing first 30 of {{total}}",
|
||||
rootName: "Roots",
|
||||
selectRegion: "Select a root or region",
|
||||
openMap: "Open map",
|
||||
openRegion: "Open",
|
||||
kindPhysical: "Physical",
|
||||
kindCustom: "Custom",
|
||||
layerNodeHint: "{{count}} NE(s)",
|
||||
layerNodeEmpty: "Click to create & open",
|
||||
rootCanvasHint: "Pick a root from the left tree.",
|
||||
regionCanvasHint: "Open the root map to edit devices; create sub-regions on that canvas.",
|
||||
regionBrowseHint: "Root folder: unique root map below. Click to open.",
|
||||
browserTitle: "Topology folder",
|
||||
browserRegionSub: "{{count}} map(s)",
|
||||
browserRegionsSub: "{{count}} item(s)",
|
||||
browserEmptyMaps: "No root map under this root yet.",
|
||||
addNe: "Add NE",
|
||||
more: "More",
|
||||
backUp: "Back",
|
||||
newRegion: "New root",
|
||||
newRegionName: "New root",
|
||||
newRegionPrompt: "Root name",
|
||||
newSubRegion: "New sub-region",
|
||||
newSubRegionName: "New sub-region",
|
||||
newSubRegionPrompt: "Sub-region name",
|
||||
subRegionNotOnFlat: "The world map has no regions. Create sub-regions on World or a lower-level canvas.",
|
||||
worldMapNoDirectNes: "Cannot add NEs on the world map — add them on a sub-region canvas.",
|
||||
worldMapName: "World map",
|
||||
worldMapOffline: "World map is temporarily offline",
|
||||
rootMapName: "Root map",
|
||||
worldHud: "World {{total}} · close-up {{cached}} · z{{zoom}} · {{lod}}",
|
||||
worldEmptyCoords: "World map has no coordinates yet",
|
||||
worldEmptyCoordsHint:
|
||||
"Dock has {{dock}} NEs, but Fabric / world coords are empty. Apply without pulling UME.",
|
||||
worldApply: "Apply to world map",
|
||||
worldApplying: "Applying…",
|
||||
worldApplyOk: "Applied to world map",
|
||||
subRegionNeedParent: "Open a root map or region canvas first, then create a sub-region.",
|
||||
regionCreated: "Created",
|
||||
regionDeleted: "Deleted",
|
||||
deleteRegion: "Delete",
|
||||
deleteRegionConfirm: "Delete \"{{name}}\"? Its maps will also be deleted.",
|
||||
deleteUmeWorldConfirm:
|
||||
"Delete \"{{name}}\"? This cascades all UME regions and maps under it. A later UME topology apply may recreate it.",
|
||||
renameRegion: "Rename",
|
||||
renameRegionPrompt: "Name",
|
||||
regionRenamed: "Renamed",
|
||||
collapseRegion: "Collapse",
|
||||
expandRegion: "Expand",
|
||||
newCustom: "Custom map",
|
||||
newCustomName: "Custom topology",
|
||||
newCustomPrompt: "Custom map name",
|
||||
folderHint: "Creating a root auto-creates its unique root map. Add sub-regions on that canvas.",
|
||||
folderHintShort: "Root folder",
|
||||
outsidePeers: "{{count}} outside peer(s) linked but not on this map",
|
||||
outsidePeersView: "Off-map NEs {{count}}",
|
||||
outsidePeersTitle: "Outside peers",
|
||||
outsidePeersHint: "Linked to this map but not placed. Select and add only what you need.",
|
||||
outsidePeersVia: "via {{name}}",
|
||||
outsidePeersFilterPh: "Filter: name / IP / via",
|
||||
outsidePeersEmpty: "No matching outside peers",
|
||||
projectNeighbors: "Project neighbors",
|
||||
projectedNeighbors: "Projected {{count}} neighbor(s) onto the map",
|
||||
localBrowserOnly: "this browser only",
|
||||
deleteEdgeConfirm:
|
||||
"Remove selected link(s) from the canvas? They are deleted from Fabric only when you Save. LLDP may recreate them on the next collect.",
|
||||
edgeDeleted: "Queued {{count}} link delete(s) — Save to apply",
|
||||
discoverCancelled: "Discovery cancelled",
|
||||
truncatedMembership: "Membership cap reached; some neighbors were not placed. Use classify or a new map.",
|
||||
truncatedFrozen: "This map membership is frozen; neighbors cannot be projected. Unfreeze via classify workflow or create a new map.",
|
||||
truncatedNodes: "Too many view nodes; display truncated. Narrow membership or create another map.",
|
||||
truncatedEdges: "Too many edges; display truncated. Filter status or create another map.",
|
||||
truncatedGeneric: "Graph data truncated. Narrow scope or create another map.",
|
||||
deleteSelectionConfirm:
|
||||
"Remove {{nodes}} NE(s) from this map and {{edges}} link(s)? Link deletes apply on Save; NE remove from map applies on Save.",
|
||||
selectionDeleted: "Queued: remove {{nodes}} NE(s), delete {{edges}} link(s) — Save to apply",
|
||||
newMap: "New",
|
||||
newMapName: "New topology",
|
||||
rename: "Rename",
|
||||
renamePrompt: "Topology map name",
|
||||
renameHint: "Double-click to rename",
|
||||
renamed: "Topology map renamed",
|
||||
deleteMap: "Delete map",
|
||||
deleteMapConfirm: "Delete map \"{{name}}\"? Nodes and edges will be removed.",
|
||||
emptyMaps: "No roots yet. Create a root first.",
|
||||
palette: "NE library",
|
||||
paletteHint: "Select multiple to add in batch, or drag one onto the canvas",
|
||||
paletteDragHint: "Drag onto canvas to add",
|
||||
selectAllVisible: "Select all visible",
|
||||
addSelected: "Add selected ({{count}})",
|
||||
addSelectedDone: "Added {{count}} NE(s)",
|
||||
addingNe: "Adding…",
|
||||
filterPh: "Type to filter: name / IP / vendor",
|
||||
save: "Save",
|
||||
saveDirty: "Save *",
|
||||
unsavedConfirm: "You have unsaved changes. Discard and switch maps?",
|
||||
saving: "Saving…",
|
||||
saved: "Topology saved",
|
||||
saveFailed: "Save failed: {{detail}}",
|
||||
readOnlyBanner: "Read-only (ne:write scope required to edit)",
|
||||
readOnlyHint: "Read-only — no write permission",
|
||||
discoverTimeout: "Discovery timed out; check LLDP tasks for progress",
|
||||
policySyncFailed: "Failed to sync LLDP policy; local toggle still applies to canvas discovery",
|
||||
discover: "Discover links",
|
||||
discovering: "Discovering…",
|
||||
discoverOne: "Discover links",
|
||||
discovered: "Discovery done: +{{added}} updated {{updated}} missing {{stale}}",
|
||||
discoverFail: "Discovery failed: {{detail}}",
|
||||
discoverOneNeedNe: "This node is not linked to a scannable NE",
|
||||
selectMap: "Select or create a topology map",
|
||||
renameNode: "Rename",
|
||||
renameNodePrompt: "Node display name",
|
||||
sourcePort: "Local port",
|
||||
targetPort: "Remote port",
|
||||
endpointA: "Endpoint A",
|
||||
endpointB: "Endpoint B",
|
||||
port: "port",
|
||||
expandPhysicalLinks: "Expand physical links",
|
||||
scaleBundleWidth: "Thicken bundles by link count",
|
||||
linkMembers: "Physical members ({{count}})",
|
||||
canvasHint:
|
||||
"Left tree lists regions; add maps yourself, then open a map to edit devices with Add NE and save positions.",
|
||||
selected: "Selected",
|
||||
selectedEdge: "Selected edge",
|
||||
selectedCount: "{{count}} selected",
|
||||
toolModes: "Edit modes",
|
||||
toolSelect: "Select",
|
||||
toolPan: "Pan",
|
||||
toolDrag: "Drag",
|
||||
toolConnect: "Connect",
|
||||
layout: "Layout",
|
||||
layoutHierarchicalTb: "Hierarchical · top-bottom",
|
||||
layoutHierarchicalLr: "Hierarchical · left-right",
|
||||
layoutForce: "Force-directed",
|
||||
layoutGrid: "Grid",
|
||||
layoutRadial: "Radial",
|
||||
layoutSelected: "Selected only (hierarchical)",
|
||||
layoutNeedSelection: "Select nodes to lay out first",
|
||||
align: "Align",
|
||||
alignLeft: "Align left",
|
||||
alignRight: "Align right",
|
||||
alignTop: "Align top",
|
||||
alignBottom: "Align bottom",
|
||||
alignHCenter: "Align center X",
|
||||
alignVCenter: "Align center Y",
|
||||
alignHDistribute: "Distribute horizontally",
|
||||
alignVDistribute: "Distribute vertically",
|
||||
alignNeedSelection: "Select at least two nodes",
|
||||
snapGrid: "Snap to grid",
|
||||
autoLayoutDiscover: "Auto-layout after discover",
|
||||
discoverAutoAddUnmatched: "Auto-add unmatched NEs as placeholders on discover",
|
||||
discoverProjectNeighbors:
|
||||
"After discover, project neighbors of scanned NEs onto the canvas (Save to keep permanently)",
|
||||
undo: "Undo",
|
||||
redo: "Redo",
|
||||
discoverSelected: "Discover links ({{count}})",
|
||||
removeSelected: "Remove selected ({{count}})",
|
||||
openWebcrt: "Open terminal",
|
||||
openNe: "NE details",
|
||||
openAlarms: "View alarms",
|
||||
noAlarmLink: "Cannot build an alarm filter for this node",
|
||||
removeNode: "Remove from canvas",
|
||||
deletePlaceholder: "Delete placeholder",
|
||||
deletePlaceholderConfirm:
|
||||
"Permanently delete this placeholder NE (inventory + Fabric links)? This cannot be undone with canvas Undo.",
|
||||
deletePlaceholderDone: "Placeholder deleted",
|
||||
removeEdge: "Delete edge",
|
||||
nodeMenu: "Node",
|
||||
paneMenu: "Canvas",
|
||||
edgeMenu: "Edge",
|
||||
createNe: "New NE",
|
||||
createNeModeHint:
|
||||
"Create a full managed NE, or a topology placeholder (credentials can be filled later).",
|
||||
createNeManaged: "Managed NE",
|
||||
createNeManagedHint: "Same full form as NE management; placed on the canvas after create.",
|
||||
createNePlaceholder: "Placeholder NE",
|
||||
createNePlaceholderHint: "Name/IP only; topology placeholder for sketching first.",
|
||||
createNeTitle: "New topology placeholder NE",
|
||||
createNeHint:
|
||||
"Source is topology placeholder. Complete login via WebCRT, or promote in NE management.",
|
||||
createNeName: "Name",
|
||||
createNeNamePh: "e.g. SW-CORE-01",
|
||||
createNeNameRequired: "NE name is required",
|
||||
createNeIp: "IP (optional)",
|
||||
createNeIpPh: "Can fill later during setup",
|
||||
createNeDone: "Created placeholder {{name}}",
|
||||
createManagedNeDone: "Created and placed {{name}}",
|
||||
createManagedNePlaceFailed:
|
||||
"{{name}} was created in inventory, but placing on the map failed: {{error}}. Add it again from NE management or the sidebar.",
|
||||
createManagedNePosFailed:
|
||||
"{{name}} is on the map, but could not move to the click position (kept default layout coords)",
|
||||
createNeBusy: "Creating…",
|
||||
connectTest: "Connectivity test",
|
||||
connectTestSelected: "Connectivity test ({{count}})",
|
||||
connectTestNeedManaged: "Node is not linked to a managed NE; cannot run connectivity test",
|
||||
connectTestSkipped: "skipped {{count}} without managed link",
|
||||
selectionMenu: "Selection",
|
||||
edgeStyle: "Edge style",
|
||||
edgeColor: "Color",
|
||||
edgeLineStyle: "Line",
|
||||
edgeLineSolid: "Solid",
|
||||
edgeLineDashed: "Dashed",
|
||||
edgeLineDotted: "Dotted",
|
||||
edgeWidth: "Width",
|
||||
edgeStyleReset: "Reset style",
|
||||
edgeDefaults: "Default edge styles",
|
||||
edgeDefaultsReset: "Factory reset",
|
||||
noNeLink: "Not linked to a managed NE",
|
||||
completeNeFirst:
|
||||
"Login details are incomplete (vendor, hop/proxy, etc. belong in NE inventory). Complete the NE first, then open the terminal.",
|
||||
edgeManual: "Manual",
|
||||
edgeUme: "UME",
|
||||
edgeDiscovered: "LLDP",
|
||||
edgeStale: "Missing",
|
||||
fit: "Fit view",
|
||||
export: "Export",
|
||||
exportSvg: "SVG vector",
|
||||
exportXml: "XML data",
|
||||
exporting: "Exporting…",
|
||||
exportEmpty: "Nothing on the canvas to export",
|
||||
exportedSvg: "SVG exported",
|
||||
exportedXml: "XML exported",
|
||||
exportFailed: "Export failed: {{detail}}",
|
||||
liveSync: "Live sync",
|
||||
liveSyncOn: "Syncing…",
|
||||
liveSyncHint: "Poll the tree about every 5s and the open map every 3s (watch MCP create/draw). Off by default",
|
||||
fullscreen: "Fullscreen",
|
||||
exitFullscreen: "Exit fullscreen",
|
||||
display: "Display",
|
||||
canvasBg: "Canvas background",
|
||||
canvasBgColor: "Background color",
|
||||
canvasBgReset: "Reset default",
|
||||
textColors: "Text colors",
|
||||
textColorsReset: "Reset default",
|
||||
labelColor: "NE name",
|
||||
edgeLabelColor: "Link numbers",
|
||||
vendorColors: "Vendor icon colors",
|
||||
vendorColorsReset: "Reset default",
|
||||
vendorTone: {
|
||||
cisco: "Cisco",
|
||||
huawei: "Huawei",
|
||||
zte: "ZTE",
|
||||
juniper: "Juniper",
|
||||
nokia: "Nokia",
|
||||
ericsson: "Ericsson",
|
||||
h3c: "H3C",
|
||||
ruijie: "Ruijie",
|
||||
mikrotik: "MikroTik",
|
||||
gray: "Unknown / unmanaged",
|
||||
},
|
||||
hideIp: "Hide IP",
|
||||
hideVendor: "Hide vendor",
|
||||
showPlaceholderBadge: "Show placeholder badge (TOPO/LLDP)",
|
||||
showConnectStatus: "Show connect-status dots",
|
||||
showAlarmOverlay: "Show alarm overlay",
|
||||
showLevelColors: "Color by classify level",
|
||||
levelUnmatched: "Unclassified",
|
||||
level: {
|
||||
external: "External",
|
||||
core: "Core",
|
||||
aggregation: "Aggregation",
|
||||
access: "Access",
|
||||
edge: "Edge",
|
||||
},
|
||||
hidePorts: "Hide ports",
|
||||
edgeFlow: "Edge flow",
|
||||
collapseSidebar: "Collapse sidebar",
|
||||
expandSidebar: "Expand sidebar",
|
||||
resizeSidebar: "Drag to resize sidebar",
|
||||
hideAdded: "Hide added",
|
||||
paletteEmpty: "No matching NEs.",
|
||||
paletteHiddenAll: "Added NEs are hidden; uncheck to show them again.",
|
||||
paletteSource: "NE source",
|
||||
paletteManaged: "Managed",
|
||||
paletteUme: "UME",
|
||||
paletteLoading: "Loading…",
|
||||
discoverReport: "Discovery progress",
|
||||
discoverClose: "Close",
|
||||
discoverCancel: "Cancel discovery",
|
||||
discoverProgress: "Scanning {{count}} managed NE(s) on the map (serial LLDP; please wait)…",
|
||||
discoverProgressLive: "Scanning {{index}}/{{total}}: {{name}}",
|
||||
discoverSummary: "Scanned {{scanned}} · added {{added}} · updated {{updated}} · missing {{stale}} · failed {{failed}}",
|
||||
discoverNeOk: "neighbors {{neighbors}} · added {{added}} · updated {{updated}}",
|
||||
discoverNeFail: "Collect failed",
|
||||
discoverUnmatched: "unmatched {{count}}",
|
||||
discoverUnmatchedMore: "{{count}} more not listed",
|
||||
discoverVendorRequired: "Vendor/device type missing; skipped LLDP command",
|
||||
discoverParserStub: "Parser \"{{parser}}\" is still a stub; output was collected but neighbors were not parsed",
|
||||
discoverNoTargets:
|
||||
"No scannable NEs on the map. Add managed NEs, or UME NEs with a CLI connect profile.",
|
||||
discoverViewDetail: "Detail",
|
||||
discoverLinkCount: "{{count}} link(s)",
|
||||
discoverLinksTitle: "Matched links ({{count}})",
|
||||
discoverLinksEmpty: "No on-map peer links matched in this scan.",
|
||||
discoverUnmatchedTitle: "Unmatched neighbors ({{count}})",
|
||||
discoverUnmatchedEmpty: "No unmatched neighbors.",
|
||||
discoverColPeer: "Peer NE",
|
||||
discoverColRemote: "Neighbor",
|
||||
discoverColLocalPort: "Local port",
|
||||
discoverColRemotePort: "Remote port",
|
||||
discoverColProtocol: "Protocol",
|
||||
discoverColAction: "Result",
|
||||
discoverLinkAdded: "Added",
|
||||
discoverLinkUpdated: "Updated",
|
||||
discoverLinkKeptManual: "Kept manual",
|
||||
discoverLocatePeer: "Locate peer",
|
||||
discoverLocateNe: "Locate NE",
|
||||
discoverRawPreview: "Raw output preview (truncated when long; parsing uses full output)",
|
||||
discoverGoLldp: "Details → LLDP links",
|
||||
findNode: "Find",
|
||||
findNodePh: "Type to search: name / IP / vendor",
|
||||
findNoMatch: "No matching node on the canvas",
|
||||
findMore: "{{count}} more matches…",
|
||||
locateOnCanvas: "Click to locate on canvas",
|
||||
openPortTraffic: "Open port traffic",
|
||||
removeStale: "Clear missing ({{count}})",
|
||||
removeStaleHint:
|
||||
"Queue delete of red missing edges (applies on Save); scheduled collect also purges after 4 consecutive misses",
|
||||
staleRemoved: "Queued {{count}} missing edge delete(s) — Save to apply",
|
||||
connectHint: "Connect mode: drag from the NE center anchor to the target (Esc or Select to exit)",
|
||||
};
|
||||
|
||||
export default topology;
|
||||
278
web/src/i18n/locales/en/ume.ts
Normal file
278
web/src/i18n/locales/en/ume.ts
Normal file
|
|
@ -0,0 +1,278 @@
|
|||
const ume = {
|
||||
token: {
|
||||
title: "UME Token",
|
||||
disconnected: "disconnected",
|
||||
connected: "connected",
|
||||
connectedRenew: "connected (renew required)",
|
||||
expiresIn: "expires_in",
|
||||
needsRenew: "renew / 0s",
|
||||
preview: "preview",
|
||||
refreshStatus: "Refresh status",
|
||||
renewLogin: "Renew / login",
|
||||
renewing: "Renewing…",
|
||||
disconnect: "Disconnect token",
|
||||
disconnecting: "Disconnecting…",
|
||||
renewOkChanged: "Token renewed and updated",
|
||||
renewOkSame: "Renew completed (unchanged)",
|
||||
disconnectOk: "UME token disconnected",
|
||||
renewHint: "Token missing expiry or expired. Use Renew / login or wait for background keepalive.",
|
||||
},
|
||||
subscription: {
|
||||
title: "UME alarm subscription (WebSocket)",
|
||||
help:
|
||||
"[Subscription]\n" +
|
||||
"· Create / cancel manually\n" +
|
||||
"· After establish (or restart with a valid DB record), backend auto-connects WSS\n\n" +
|
||||
"[Task control]\n" +
|
||||
"· alarms_current_ws_consumer pause/resume only stops/starts WSS\n" +
|
||||
"· Does not cancel the UME subscription",
|
||||
sub: "subscription",
|
||||
subActive: "active",
|
||||
subInactive: "inactive",
|
||||
wssPaused: "paused",
|
||||
wssModeBanner:
|
||||
"Current alarms are maintained via WSS (mode: {{mode}}); scheduled REST full sync is paused. Use Sync current alarms below for full reconcile.",
|
||||
serverLostBanner:
|
||||
"UME server subscription is missing or expired; local state may still show active. Clear local record and re-subscribe.",
|
||||
establish: "Establish subscription",
|
||||
establishing: "Establishing…",
|
||||
reestablish: "Clear local & re-subscribe",
|
||||
reestablishing: "Re-subscribing…",
|
||||
cancel: "Cancel subscription",
|
||||
cancelling: "Cancelling…",
|
||||
refreshStatus: "Refresh subscription",
|
||||
clearLocalOnly: "Clear local only",
|
||||
clearing: "Clearing…",
|
||||
opFailed: "Subscription operation failed",
|
||||
confirmClearDefault:
|
||||
"UME alarm subscription no longer exists or has expired.\n\nClear local subscription record? You can establish again afterwards.",
|
||||
confirmReestablish: "Clear local record and re-establish subscription on UME. Continue?",
|
||||
titleLoginFirst: "Log in to UME token first",
|
||||
titleReestablish: "Clear stale local record and re-establish on UME",
|
||||
establishInvalid: "Establish did not return a valid id/uri",
|
||||
establishExists: "Subscription already exists (WSS will stay/connect)",
|
||||
establishOk: "Subscription established; WSS will connect",
|
||||
clearLocalOk: "Local subscription cleared; you can establish again",
|
||||
serverLostMsg: "UME subscription lost. Clear local record and re-subscribe?",
|
||||
cancelFailed: "Cancel failed: subscription may still exist on UME",
|
||||
cancelOkMissing: "Local cleared (UME subscription was already missing)",
|
||||
cancelOk: "Subscription cancelled",
|
||||
wsLogs: "WSS runtime log",
|
||||
wsActivity: "Last activity {{time}}",
|
||||
wsAutoRefresh: "Auto refresh",
|
||||
wsLogsEmpty: "No logs yet (connect WSS after establishing subscription)",
|
||||
},
|
||||
keyAlert: {
|
||||
title: "AI alarm monitor",
|
||||
showPanel: "Details",
|
||||
hidePanel: "Close",
|
||||
help:
|
||||
"[Match]\n" +
|
||||
"· Exact notificationId\n" +
|
||||
"· Or description keyword (case-insensitive; includes nativeProbableCause)\n\n" +
|
||||
"[Scope]\n" +
|
||||
"· Optional Inventory ne_type filter; empty = all devices\n\n" +
|
||||
"[Deliver]\n" +
|
||||
"· NetX broadcasts hits to subscribed Netx Ops (DSH) clients",
|
||||
hub: "DSH subscribers",
|
||||
hubConnected: "subscribed",
|
||||
hubEmpty: "no subscribers",
|
||||
hubSubscribers: "subscribers",
|
||||
hubPublished: "published",
|
||||
hubDeliverOk: "deliver ok",
|
||||
hubDeliverFail: "deliver fail",
|
||||
hubConnections: "Active connections",
|
||||
hubColId: "id",
|
||||
hubColUser: "user",
|
||||
hubColRemote: "remote",
|
||||
hubColClient: "client",
|
||||
hubColConnected: "connected",
|
||||
hubColLastSeen: "last seen",
|
||||
hubEmptyConnections: "No Netx Ops clients are connected to the alarm hub",
|
||||
hubPath: "path",
|
||||
matchType: "Match by",
|
||||
matchNotificationId: "notificationId",
|
||||
matchKeyword: "description keyword",
|
||||
matchValuePhNotificationId: "Enter notificationId",
|
||||
matchValuePhKeyword: "Enter keyword (case-insensitive)",
|
||||
label: "Rule description",
|
||||
labelPh: "Required, e.g. BGP Down",
|
||||
neTypesLabel: "Device types (optional, multi-select)",
|
||||
neTypesHint: "Leave empty to match all device types. Options come from synced UME Inventory ne_type.",
|
||||
neTypesEmpty: "No device types yet — sync Inventory first",
|
||||
neTypesAll: "All",
|
||||
forwardOnClear: "Push on alarm clear",
|
||||
forwardOnClearHelp: "Global switch for all monitor rules. By default only new/updated alarms are pushed; when enabled, clear notifications are also sent to subscribed Netx Ops clients.",
|
||||
add: "Add rules",
|
||||
adding: "Adding…",
|
||||
delete: "Delete",
|
||||
edit: "Edit",
|
||||
editTitle: "Edit monitor rule",
|
||||
save: "Save",
|
||||
saving: "Saving…",
|
||||
cancel: "Cancel",
|
||||
editOk: "Rule updated",
|
||||
pickFromAlarms: "Load alarm hints",
|
||||
emptyRules: "No monitor rules yet",
|
||||
colType: "type",
|
||||
colMatch: "match",
|
||||
colLabel: "description",
|
||||
colNeTypes: "device types",
|
||||
colForwardClear: "on clear",
|
||||
colPublished: "published",
|
||||
colAttempts: "attempts",
|
||||
colLast: "last push",
|
||||
colActions: "actions",
|
||||
colMonitor: "monitor",
|
||||
monitorOn: "on",
|
||||
monitorOff: "off",
|
||||
filterKeywordPh: "Filter match / label",
|
||||
filterMatchAll: "All types",
|
||||
filterEnabledAll: "All states",
|
||||
filterEnabledOn: "Monitoring on",
|
||||
filterEnabledOff: "Monitoring off",
|
||||
addOk: "Monitor rule added",
|
||||
deleteOk: "Deleted",
|
||||
confirmDelete: "Delete this monitor rule?",
|
||||
yes: "yes",
|
||||
no: "no",
|
||||
},
|
||||
sync: {
|
||||
title: "UME sync",
|
||||
inventory: "Sync inventory",
|
||||
alarmsCurrent: "Sync current alarms",
|
||||
full: "Full sync",
|
||||
failed: "Sync failed",
|
||||
},
|
||||
tasks: {
|
||||
currentTitle: "Running jobs",
|
||||
running: "running",
|
||||
noRunning: "No running jobs",
|
||||
runtimeTitle: "Background tasks",
|
||||
runtimeOpFailed: "Background task operation failed",
|
||||
noRuntime: "No background task status",
|
||||
intervalTitle: "Configured sleep between loop iterations (clamped at process start)",
|
||||
lastRunTitle: "Last finished sync for scheduled tasks; refreshed at each loop tick",
|
||||
deletedTitle: "Reconcile deletes: inventory = NE rows; alarms_current = current alarm rows",
|
||||
lastErrorCol: "last_error",
|
||||
runtimeError: {
|
||||
startup_alarm_sync_before_ws: "Starting up: syncing current alarms (WSS connects after completion)…",
|
||||
startup_gate_waiting: "Startup REST snapshot pending; scheduled REST and WSS on standby",
|
||||
wss_active_skip_rest: "WSS receiving live alarms; REST sync skipped",
|
||||
pulling_alarms_current: "Pulling UME current alarms…",
|
||||
alarms_sync_in_progress_skip: "Another current-alarm REST sync in progress; skipped",
|
||||
pulling_inventory: "Pulling UME inventory…",
|
||||
pulling_topology: "Pulling UME topology (nodes/links)…",
|
||||
topology_sync_busy: "Topology sync already running; skipped",
|
||||
ume_ws_disabled_no_base_url: "Disabled or UME_BASE_URL not configured",
|
||||
resumed_sync_soon: "Resumed: skipping debounce wait, sync soon",
|
||||
resumed_wss_reconnect: "Resumed: reconnecting WSS soon",
|
||||
resumed: "Resumed",
|
||||
keepalive_failed: "Token keepalive failed",
|
||||
},
|
||||
wsState: {
|
||||
init: "Initializing",
|
||||
connected: "Connected",
|
||||
connecting: "Connecting",
|
||||
disconnected: "Disconnected",
|
||||
no_subscription: "No subscription",
|
||||
waiting_token: "Waiting for token",
|
||||
paused: "Paused",
|
||||
error: "Connection error",
|
||||
reconnecting: "Reconnecting",
|
||||
subscription_lost: "UME subscription lost",
|
||||
disabled_no_base_url: "Disabled or UME_BASE_URL not configured",
|
||||
},
|
||||
runtimeTask: {
|
||||
token_keepalive: "UME token keepalive",
|
||||
alarms_current_auto_sync: "Current alarms auto sync",
|
||||
alarms_current_ws_consumer: "UME alarm WSS",
|
||||
inventory_auto_sync: "Inventory auto sync",
|
||||
topology_auto_sync: "Topology auto sync",
|
||||
},
|
||||
},
|
||||
syncStatus: {
|
||||
title: "Sync history",
|
||||
showPanel: "Details",
|
||||
hidePanel: "Close",
|
||||
empty: "No sync records",
|
||||
summary: "{{total}} record(s), {{running}} running",
|
||||
fabricGapTitle: "Topology dock is newer than Fabric / UME World",
|
||||
fabricGapHint:
|
||||
"Dock ME {{dock}}, Fabric UME {{fabric}}. Apply without pulling UME. Last status: {{status}}",
|
||||
applyFabric: "Apply to topology",
|
||||
applyingFabric: "Applying…",
|
||||
applyFabricOk: "Applied to topology",
|
||||
},
|
||||
ne: {
|
||||
title: "Network elements",
|
||||
showPanel: "Details",
|
||||
hidePanel: "Close",
|
||||
keywordPh: "keyword(ne_id/ne_name/user_label/ip/host_name)",
|
||||
clearTitle: "Clear keyword and reset to page 1",
|
||||
expand: "Details",
|
||||
collapse: "Close",
|
||||
cliConnect: "CLI connect",
|
||||
summary: "{{total}} inventory NE(s)",
|
||||
},
|
||||
tabs: {
|
||||
main: "UME sync",
|
||||
cli: "CLI connect",
|
||||
},
|
||||
cli: {
|
||||
title: "UME CLI connection profile",
|
||||
showPanel: "Details",
|
||||
hidePanel: "Close",
|
||||
hint:
|
||||
"[Purpose]\n" +
|
||||
"· Unified SSH credentials and hop/bastion for Inventory NEs\n\n" +
|
||||
"[MCP]\n" +
|
||||
"· Exec show via ume_ne_id without per-device managed_ne entries",
|
||||
statusReady: "CLI profile is ready for UME NE command execution.",
|
||||
statusNotReady: "Set target username and hop/bastion settings (if enabled).",
|
||||
profileName: "Profile name",
|
||||
targetUsername: "Target SSH username",
|
||||
targetPassword: "Target SSH password",
|
||||
passwordKeep: "Leave blank to keep unchanged",
|
||||
newProfile: "New profile",
|
||||
deleteConfirm: "Delete this CLI profile?",
|
||||
deleted: "Profile deleted",
|
||||
saved: "CLI profile saved",
|
||||
connectTestTitle: "Sample NE connectivity test",
|
||||
sampleNePh: "Filter UME NEs (name / IP / ID)",
|
||||
sampleNeRequired: "Select a UME NE first",
|
||||
sampleNeEmpty: "No matching NE",
|
||||
sampleNeLoading: "Loading…",
|
||||
connectTestSubmitted: "Connectivity test submitted",
|
||||
connectTestWaiting: "Waiting for test result…",
|
||||
connectTestRunning: "Connectivity test in progress…",
|
||||
connectTestResult: "Test result",
|
||||
existingProfiles: "Existing profiles",
|
||||
default: "default",
|
||||
},
|
||||
alarms: {
|
||||
title: "Current alarms",
|
||||
movedHint: "Current alarm query moved to Network Management →",
|
||||
showPanel: "Expand",
|
||||
hidePanel: "Collapse",
|
||||
keywordPh: "keyword(alarm key/cause/ne_name/host_name/ip…)",
|
||||
hostNamePh: "host_name (contains)",
|
||||
allSeverity: "All severities",
|
||||
clearedAll: "Cleared: all",
|
||||
clearedYes: "Cleared",
|
||||
clearedNo: "Active",
|
||||
clearTitle: "Clear filters and reset to page 1",
|
||||
filterByHost: "Filter by this host",
|
||||
noHostName: "No host_name (sync inventory first)",
|
||||
col: {
|
||||
time: "Time",
|
||||
severity: "Severity",
|
||||
neId: "NE ID",
|
||||
hostName: "Host",
|
||||
neType: "NE type",
|
||||
cause: "Cause",
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
export default ume;
|
||||
235
web/src/i18n/locales/en/webcrt.ts
Normal file
235
web/src/i18n/locales/en/webcrt.ts
Normal file
|
|
@ -0,0 +1,235 @@
|
|||
const webcrt = {
|
||||
title: "WebCRT",
|
||||
deviceList: "Device list",
|
||||
sessionManager: "Device list",
|
||||
connect: "Connect",
|
||||
hint: "Pick an NE and open an interactive terminal in the browser. Credentials stay on the server.",
|
||||
hintCrt: "Click an NE on the left to open a terminal. Includes managed, Sessions, and UME; or use New Session for a quick login.",
|
||||
filterKeyword: "Filter",
|
||||
filterKeywordPh: "Filter by name / IP / tag",
|
||||
empty: "No matching NEs. Switch source or refine the search.",
|
||||
open: "Open terminal",
|
||||
opening: "Connecting…",
|
||||
opened: "Opened {{name}}",
|
||||
disconnect: "Disconnect",
|
||||
closed: "Session closed",
|
||||
termPlaceholder: "No terminal session open",
|
||||
sessionMeta: "{{name}} · {{ip}}",
|
||||
source: {
|
||||
all: "All",
|
||||
managed: "Managed",
|
||||
webcrt: "Sessions",
|
||||
ume: "UME",
|
||||
},
|
||||
newSession: {
|
||||
title: "New Session",
|
||||
claimTitle: "Complete placeholder session",
|
||||
claimHint:
|
||||
"Enter a reachable host. Session name defaults to the placeholder name. On success, source becomes WebCRT.",
|
||||
connect: "Connect",
|
||||
connecting: "Connecting…",
|
||||
protocol: "Protocol",
|
||||
host: "Hostname",
|
||||
port: "Port",
|
||||
sessionName: "Session name",
|
||||
sessionNamePh: "Optional; defaults to IP",
|
||||
authTitle: "SSH Authentication",
|
||||
savePassword: "Save password",
|
||||
ipRequired: "Hostname is required",
|
||||
userRequired: "Username is required",
|
||||
passwordRequired: "Password is required",
|
||||
},
|
||||
status: {
|
||||
idle: "Idle",
|
||||
connecting: "Connecting",
|
||||
connected: "Connected",
|
||||
error: "Error",
|
||||
closed: "Closed",
|
||||
},
|
||||
phase: {
|
||||
creating: "Creating session",
|
||||
authenticating: "Authenticating",
|
||||
waitingPrompt: "Waiting for device prompt",
|
||||
hint: "Login progress streams into the terminal; slow devices may take >10s",
|
||||
},
|
||||
tabMenu: {
|
||||
close: "Close",
|
||||
closeOthers: "Close others",
|
||||
closeAll: "Close all",
|
||||
copyIp: "Copy IP",
|
||||
copyIpOk: "Copied {{ip}}",
|
||||
copyIpEmpty: "No IP on this tab",
|
||||
},
|
||||
treeMenu: {
|
||||
rename: "Rename",
|
||||
renameLabel: "Session name",
|
||||
renameSave: "Save",
|
||||
renameRequired: "Session name is required",
|
||||
renamed: "Session renamed",
|
||||
delete: "Delete session",
|
||||
deleteConfirm: "Delete session \"{{name}}\"? This cannot be undone.",
|
||||
deleted: "Session deleted",
|
||||
},
|
||||
keywordHl: {
|
||||
title: "Keyword Highlighting",
|
||||
enabled: "Enabled",
|
||||
newKeyword: "New keyword",
|
||||
newKeywordPh: "Keyword or regex",
|
||||
regex: "Regular expression",
|
||||
add: "Add",
|
||||
colKeyword: "Keyword",
|
||||
colRegex: "Regex",
|
||||
empty: "No keywords yet",
|
||||
moveUp: "Move up",
|
||||
moveDown: "Move down",
|
||||
remove: "Remove",
|
||||
caseSensitive: "Case sensitive",
|
||||
color: "Text color",
|
||||
saved: "Keyword highlighting saved",
|
||||
},
|
||||
actions: {
|
||||
reconnect: "Reconnect",
|
||||
recordLog: "Record log",
|
||||
clear: "Clear",
|
||||
copy: "Copy",
|
||||
recording: "Recording",
|
||||
recordingOn: "Log recording started",
|
||||
recordingSaved: "Log saved",
|
||||
copied: "Copied to clipboard",
|
||||
copyEmpty: "Terminal is empty",
|
||||
copyFailed: "Copy failed",
|
||||
break: "Break",
|
||||
breakSent: "Break sent",
|
||||
broadcast: "Broadcast",
|
||||
broadcastSent: "Sent to all sessions",
|
||||
postLogin: "Post-login cmds",
|
||||
},
|
||||
favorites: "Favorites",
|
||||
recent: "Recent",
|
||||
favorite: "Toggle favorite",
|
||||
encoding: "Encoding",
|
||||
fontSize: "Font size",
|
||||
theme: "Theme",
|
||||
themeDark: "Dark",
|
||||
themeLight: "Light",
|
||||
colorScheme: "Color scheme",
|
||||
backgroundColor: "Background",
|
||||
foregroundColor: "Font color",
|
||||
scheme: {
|
||||
dark: "Deep blue (default)",
|
||||
blackWhite: "Black on white",
|
||||
whiteBlack: "White on black",
|
||||
greenBlack: "Green on black",
|
||||
amberBlack: "Amber on black",
|
||||
custom: "Custom",
|
||||
},
|
||||
copyOnSelect: "Copy on select",
|
||||
rightClickPaste: "Paste on right click",
|
||||
rightClickPasteHint: "Shift + right click opens the menu. Turn off to always show the menu.",
|
||||
pasteDelay: "Paste max line wait",
|
||||
pasteDelayOff: "No delay (bulk send)",
|
||||
keepalive: "SSH keepalive",
|
||||
keepaliveOff: "Off",
|
||||
keepaliveSec: "{{n}} sec",
|
||||
options: "Options",
|
||||
globalSessionOptions: "Global Session Options",
|
||||
sessionOptionsSave: "Save",
|
||||
sessionOptionsCancel: "Cancel",
|
||||
sessionOptionsSaved: "Global session options saved",
|
||||
disconnectBanner: "Session disconnected",
|
||||
disconnectBannerError: "Session error or connection lost",
|
||||
broadcastPh: "Send to all tabs…",
|
||||
buttonBarHint: "One per line: label|command",
|
||||
postLoginPrompt: "Post-login commands (one per line, this device)",
|
||||
postLoginSaved: "Post-login commands saved",
|
||||
sftp: {
|
||||
title: "SFTP",
|
||||
refresh: "Refresh",
|
||||
up: "Up",
|
||||
upload: "Upload",
|
||||
uploaded: "Upload complete",
|
||||
uploading: "Upload {{done}}/{{total}} · {{name}} {{pct}}",
|
||||
downloading: "Download {{done}}/{{total}} · {{name}} {{pct}}",
|
||||
downloaded: "Downloaded {{count}} file(s)",
|
||||
downloadPartial: "Downloaded {{ok}}, failed {{failed}}",
|
||||
uploadPartial: "Uploaded {{ok}}, failed {{failed}}",
|
||||
retrying: "Retrying {{name}} ({{attempt}}/{{max}})…",
|
||||
cancel: "Cancel",
|
||||
dropHint: "Drop to upload into current folder",
|
||||
dropEmpty: "No uploadable files found",
|
||||
mkdir: "New",
|
||||
mkdirPrompt: "New folder name",
|
||||
mkdirInvalid: "Invalid folder name (no / or ..)",
|
||||
mkdirOk: "Folder created",
|
||||
rename: "Rename",
|
||||
renamePrompt: "New name",
|
||||
renameInvalid: "Invalid name (no / or ..)",
|
||||
renamed: "Renamed",
|
||||
download: "Download",
|
||||
chmod: "chmod",
|
||||
chmodPrompt: "Mode (e.g. 755 or rwxr-xr-x)",
|
||||
chmodOk: "Permissions updated",
|
||||
chmodPartial: "chmod ok {{ok}}, failed {{failed}}",
|
||||
delete: "Delete",
|
||||
deleteConfirm: "Delete {{name}}?",
|
||||
deleteRecursiveConfirm: "{{name}} includes folders; non-empty folders will be removed recursively. Continue?",
|
||||
deletePartial: "Deleted {{ok}}, failed {{failed}}",
|
||||
deleted: "Deleted",
|
||||
selectedCount: "{{count}} selected",
|
||||
empty: "This folder is empty",
|
||||
listTruncated: "Folder is large; showing first {{count}} entries (limit {{max}})",
|
||||
dir: "dir",
|
||||
loading: "Loading…",
|
||||
enterHint: "Click to select; Ctrl/Shift multi-select; double-click to open",
|
||||
downloadHint: "Click to select; Ctrl/Shift multi-select; double-click to download",
|
||||
colName: "Name",
|
||||
colSize: "Size",
|
||||
colMtime: "Modified",
|
||||
colOwner: "Owner",
|
||||
colGroup: "Group",
|
||||
colMode: "Access",
|
||||
resizeHint: "Drag to resize SFTP / terminal",
|
||||
colResizeHint: "Drag to resize column",
|
||||
},
|
||||
term: {
|
||||
findPh: "Find…",
|
||||
findPrev: "Previous",
|
||||
findNext: "Next",
|
||||
findClose: "Close find",
|
||||
copy: "Copy",
|
||||
paste: "Paste",
|
||||
pasteEmpty: "Clipboard is empty",
|
||||
pasteFailed: "Cannot read clipboard (on HTTP use the paste box, or Ctrl+V)",
|
||||
pasteBridgeHint:
|
||||
"This page is not HTTPS, so the browser blocks clipboard reads. Press Ctrl+V in this box to send text to the terminal.",
|
||||
pasteBridgePh: "Press Ctrl+V here…",
|
||||
pasteBridgeCancel: "Cancel",
|
||||
clear: "Clear",
|
||||
pasting: "Pasting {{done}}/{{total}} lines…",
|
||||
wsError: "[WebSocket error]",
|
||||
wsClosed: "[WebSocket closed code={{code}}]",
|
||||
sessionStatus: "[session {{state}}{{detail}}]",
|
||||
outputTruncated: "[output truncated: {{count}} chunk(s) dropped]",
|
||||
},
|
||||
err: {
|
||||
deviceType: "Unsupported device type",
|
||||
ipConflictRestart: "Database still enforces unique IP; restart the netx API and retry",
|
||||
sessionLimit: "Session limit reached; close other terminals first",
|
||||
neNotFound: "Network element not found",
|
||||
credsIncomplete: "Incomplete username/password on this NE",
|
||||
authRejected: "Wrong username or password. Please try again.",
|
||||
cliProfile: "UME NEs require a CLI connect profile (default account / hop)",
|
||||
connectFailed: "Device login failed: {{detail}}",
|
||||
sftpHop: "SFTP does not support hop devices yet (direct SSH only)",
|
||||
sftpSsh: "SFTP requires SSH",
|
||||
sftpNeedPassword: "SFTP needs a saved SSH password (one-shot dialog passwords are not reused for files)",
|
||||
sftpUnsupported: "This SSH session has no SFTP channel (device may not offer it)",
|
||||
sftpTooLarge: "File exceeds size limit (default 512MB)",
|
||||
sftpChmodInvalid: "Invalid mode (use 755 or rwxr-xr-x)",
|
||||
sftpAborted: "Transfer cancelled",
|
||||
queueDropped: "Terminal output too fast; about {{count}} chunk(s) dropped — transcript may be incomplete",
|
||||
websocket: "WebSocket connection failed",
|
||||
},
|
||||
};
|
||||
|
||||
export default webcrt;
|
||||
121
web/src/i18n/locales/en/workbench.ts
Normal file
121
web/src/i18n/locales/en/workbench.ts
Normal file
|
|
@ -0,0 +1,121 @@
|
|||
const workbench = {
|
||||
title: "Workbench",
|
||||
modules: "Modules",
|
||||
sections: "Sections",
|
||||
moduleCount: "{{count}} modules",
|
||||
backToWorkbench: "Back to Workbench",
|
||||
openInNewTab: "Open in new tab",
|
||||
openModule: "Open or switch to this module tab",
|
||||
monitoring: "Integration",
|
||||
operations: "Operations",
|
||||
system: "System",
|
||||
welcomeEyebrow: "Workbench",
|
||||
welcomeTitle: "Welcome back, {{name}}",
|
||||
welcomeSub: "Monitor sync, topology, and ops tasks from one place.",
|
||||
today: "Today · {{date}}",
|
||||
kpi: {
|
||||
uptime: "API uptime",
|
||||
health: "System health",
|
||||
tasks: "Active tasks",
|
||||
healthOk: "OK",
|
||||
healthWarn: "CHECK",
|
||||
healthUnknown: "N/A",
|
||||
},
|
||||
statusTitle: "Runtime status",
|
||||
hostHealth: "HOST",
|
||||
platformCapacity: "Platform capacity",
|
||||
channels: "CHANNELS",
|
||||
fleet: "FLEET",
|
||||
fleetNe: "NE",
|
||||
fleetNeUnit: "units",
|
||||
fleetNeKnown: "Known",
|
||||
fleetNePass: "Pass",
|
||||
fleetNeFail: "Fail",
|
||||
fleetNeTesting: "Testing",
|
||||
fleetNeUnknown: "Untested",
|
||||
fleetNeNoTag: "No tag",
|
||||
fleetNeTags: "Top tags",
|
||||
fleetTopo: "Topology",
|
||||
fleetTopoNodes: "nodes",
|
||||
fleetTopoEdges: "edges",
|
||||
fleetTopoOther: "Other regions",
|
||||
fleetTopoUnassigned: "Unassigned",
|
||||
fleetTopoNoRegion: "No regions",
|
||||
fleetTopoDiscover: "Last discover",
|
||||
fleetTopoUpdated: "Summary updated",
|
||||
fleetSched: "Schedulers",
|
||||
fleetSchedConfig: "Config sync",
|
||||
fleetSchedLldp: "LLDP",
|
||||
fleetSchedPort: "Port traffic",
|
||||
fleetSchedNeCollect: "NE collect",
|
||||
fleetSchedFabric: "Fabric reconcile",
|
||||
fleetSchedOn: "ON",
|
||||
fleetSchedOff: "OFF",
|
||||
fleetSchedMode: "Mode",
|
||||
fleetSchedHeartbeat: "Heartbeat",
|
||||
fleetSchedFresh: "Fresh",
|
||||
fleetSchedStale: "Stale",
|
||||
|
||||
sidePanel: "Console side panel",
|
||||
consoleId: "OPS CONSOLE",
|
||||
refreshedAt: "Updated {{time}}",
|
||||
taskRail: "ACTIVE TASKS",
|
||||
taskRailAll: "ALL",
|
||||
taskRailEmpty: "No active tasks",
|
||||
taskTotal: "POOL {{count}}",
|
||||
announceTitle: "Announcements",
|
||||
recentTitle: "Recent operations",
|
||||
recentMore: "View all",
|
||||
quickTitle: "Quick actions",
|
||||
emptyRecent: "No recent audit entries.",
|
||||
gauge: {
|
||||
cpu: "CPU",
|
||||
mem: "Memory",
|
||||
storage: "Storage",
|
||||
storageUsed: "Used",
|
||||
storageUnavailable: "Unavailable",
|
||||
cli: "CLI budget",
|
||||
db: "DB pool",
|
||||
webcrt: "WebCRT",
|
||||
tasks: "Active tasks",
|
||||
low: "Low load",
|
||||
normal: "Normal",
|
||||
high: "Busy",
|
||||
},
|
||||
quick: {
|
||||
tasks: "Task overview",
|
||||
logs: "Audit logs",
|
||||
users: "User admin",
|
||||
apiKeys: "API keys",
|
||||
sessions: "Sessions",
|
||||
},
|
||||
announce: {
|
||||
a1: "Dark workbench shell is live — other modules follow the same palette.",
|
||||
a1Date: "2026-08-04",
|
||||
a2: "LLDP collect supports pause / resume / stop; interrupted jobs resume after restart.",
|
||||
a2Date: "2026-08-04",
|
||||
a3: "Config sync and LLDP KPI boards refresh while jobs are running.",
|
||||
a3Date: "2026-08-03",
|
||||
},
|
||||
recentCols: {
|
||||
action: "Action",
|
||||
module: "Module",
|
||||
time: "Time",
|
||||
user: "User",
|
||||
},
|
||||
cards: {
|
||||
umeSync: "UME Sync",
|
||||
network: "Network Management",
|
||||
managedNe: "NE Management",
|
||||
collect: "Batch Collect",
|
||||
webcrt: "WebCRT",
|
||||
topology: "Topology",
|
||||
portTrafficWall: "Traffic wall",
|
||||
users: "Users",
|
||||
audit: "Audit",
|
||||
apiKeys: "API Keys",
|
||||
sessions: "Login sessions",
|
||||
},
|
||||
};
|
||||
|
||||
export default workbench;
|
||||
80
web/src/i18n/locales/zh/audit.ts
Normal file
80
web/src/i18n/locales/zh/audit.ts
Normal file
|
|
@ -0,0 +1,80 @@
|
|||
const 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 audit;
|
||||
110
web/src/i18n/locales/zh/auth.ts
Normal file
110
web/src/i18n/locales/zh/auth.ts
Normal file
|
|
@ -0,0 +1,110 @@
|
|||
const auth = {
|
||||
loginTitle: "登录",
|
||||
username: "用户名",
|
||||
password: "密码",
|
||||
login: "登录",
|
||||
loggingIn: "登录中…",
|
||||
loginFailed: "登录失败",
|
||||
logout: "退出",
|
||||
sessionsTitle: "登录会话",
|
||||
sessionsHelp: "反代后 IP 取真实客户端;同公网可用「客户端」列区分。踢掉后需重新登录。",
|
||||
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:
|
||||
"供 MCP/脚本与 netxops 使用(网页登录用会话)。明文仅创建时显示一次;可用「改权限」调整。未吊销上限 {{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: "已吊销",
|
||||
tokenDeleted: "已删除",
|
||||
tokenOnceHint: "请立即复制保存,关闭后无法再次查看明文:",
|
||||
copyToken: "复制",
|
||||
tokenCopied: "已复制到剪贴板",
|
||||
tokenCopyFailed: "复制失败",
|
||||
expiresAt: "到期时间",
|
||||
lastUsed: "最近使用",
|
||||
tokenStatusActive: "有效",
|
||||
tokenStatusExpired: "已过期",
|
||||
tokenStatusRevoked: "已吊销",
|
||||
revokeToken: "吊销",
|
||||
revokeConfirm: "确定吊销该 API Key?吊销后立即失效,记录仍保留。",
|
||||
deleteToken: "删除",
|
||||
deleteConfirm: "确定永久删除该 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: "新密码不能与默认/旧密码相同",
|
||||
};
|
||||
|
||||
export default auth;
|
||||
330
web/src/i18n/locales/zh/bizCompare.ts
Normal file
330
web/src/i18n/locales/zh/bizCompare.ts
Normal file
|
|
@ -0,0 +1,330 @@
|
|||
const bizCompare = {
|
||||
title: "业务对比",
|
||||
templates: "比对模板",
|
||||
newTemplate: "新建模板",
|
||||
editTemplate: "编辑模板",
|
||||
saveTemplate: "保存模板",
|
||||
templateSaved: "模板已保存",
|
||||
templateDeleted: "模板已删除",
|
||||
confirmDeleteTemplate: "删除该比对模板?",
|
||||
confirmDeleteJob: "删除该比对任务及全部比对记录?",
|
||||
confirmDeleteRun: "删除本次比对结果?任务配置将保留。",
|
||||
deleteJob: "删除任务",
|
||||
deleteRun: "删除本次",
|
||||
runDeleted: "比对记录已删除",
|
||||
emptyTemplates: "暂无模板。可新建,或从 JSON 文件导入。",
|
||||
exportTemplate: "导出",
|
||||
importTemplate: "导入",
|
||||
templateExported: "模板已导出",
|
||||
templateImported: "模板已导入",
|
||||
templateImportInvalid: "导入文件无效:需要 name 与 metrics",
|
||||
templateValidationFailed: "模板校验失败,请修正标明的配置项",
|
||||
filterOperator: "过滤运算符",
|
||||
complexFiltersPreserved: "该过滤规则包含复杂嵌套,已完整保留。可通过导出、修改 JSON 后重新导入来更新。",
|
||||
portPolicy: "端口变化策略",
|
||||
portPolicyHint: "存在端口映射时按映射匹配;此策略控制无映射时接口身份字段是否参与配对。",
|
||||
portPolicyAuto: "自动判断",
|
||||
portPolicyStrict: "接口必须匹配",
|
||||
portPolicyIgnore: "允许端口变化",
|
||||
missingSheets: "配置中的检查项已被移除或改名,请重新选择检查范围",
|
||||
enableCurrentSheets: "启用当前全部检查项",
|
||||
templateUsage: "已被 {{n}} 个任务引用",
|
||||
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: "比对双方",
|
||||
configSnapshot: "执行配置已保存",
|
||||
configSnapshotHint: "此记录的模板规则和端口映射已固定;后续编辑不影响历史回查,下载报告包含执行配置。",
|
||||
configLegacy: "旧记录:未保存执行配置",
|
||||
configLegacyHint: "此记录创建时未保存配置快照;成功行回查和精简明细还原使用当前配置,修改配置后可能与当时结果不同。",
|
||||
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",
|
||||
runSheetProgress: "表 {{i}}/{{n}}",
|
||||
runElapsed: "已用 {{s}}s",
|
||||
runRowsLoaded: "已加载 {{side}} {{n}} 行",
|
||||
runRowsSqlCount: "库内统计 {{side}} {{n}} 行",
|
||||
runPersisting: "已写入 {{done}}/{{total}} 行",
|
||||
runEngineSql: "引擎 SQL",
|
||||
runEnginePython: "引擎 Python",
|
||||
runEngineNote: "原因 {{note}}",
|
||||
phaseQueued: "排队中",
|
||||
phaseLoading: "加载数据",
|
||||
phaseSqlCount: "库内统计",
|
||||
phaseSqlProject: "准备比对表",
|
||||
phaseSqlJoin: "库内比对",
|
||||
phaseSqlFailFetch: "拉取失败行",
|
||||
phaseComparing: "比对中",
|
||||
phasePersisting: "写入结果",
|
||||
phasePersistingFail: "写入失败行",
|
||||
phasePersistingOk: "写入成功行",
|
||||
phaseDone: "完成",
|
||||
phaseFailed: "失败",
|
||||
phaseCancelled: "已取消",
|
||||
sheetPending: "等待中",
|
||||
colProgress: "进度 / 结果",
|
||||
passRateScope: "全表",
|
||||
keyFiltersToggle: "字段筛选",
|
||||
hideDisplayCols: "隐藏展示列",
|
||||
showDisplayCols: "显示展示列",
|
||||
displayColsToggle: "展示列",
|
||||
hideDisplayColsHint: "紧凑模式:默认隐藏不参与比对的展示列;高亮表示当前已显示",
|
||||
ranWithDuration: "比对完成(耗时 {{s}} 秒)",
|
||||
unchangedNotStored: "成功行仅统计数量未落库。可在任务配置将「成功行保存」改为抽样后重新比对(抽查用)。",
|
||||
unchangedSampleHint: "成功共 {{total}} 条,明细抽样 {{listed}} 条(分层抽查)。要查任意路由请输入筛选条件——将按原表即时判定。通过率按全部 {{total}} 计。",
|
||||
liveSearchHint: "从原始批次补齐同一业务的前后数据后筛选;通过率仍按全表统计。",
|
||||
liveSearchTruncatedHint: "搜索已达上限,部分业务未展示。请收窄条件;不完整的业务分组已跳过。",
|
||||
clearSearch: "清空筛选",
|
||||
resultLoading: "正在加载对比明细…",
|
||||
resultRange: "{{from}}–{{to}} / {{total}} 条",
|
||||
resultLoadFailed: "对比明细加载失败",
|
||||
retry: "重试",
|
||||
searchEmpty: "当前筛选条件下没有匹配结果,可清空筛选或切换结果类型。",
|
||||
clearKeyFilters: "清空字段",
|
||||
storeUnchanged: "成功行保存",
|
||||
storeUnchangedAuto: "自动(小表全量 / 大表抽样 5000+原表补全)",
|
||||
storeUnchangedSample: "仅抽样(最多 5000,身份键+原表补全)",
|
||||
storeUnchangedKeys: "全量身份键(可翻完全部成功,大表写入仍较久)",
|
||||
storeUnchangedAlways: "始终全量 JSON(大表很慢,慎用)",
|
||||
storeUnchangedNever: "不保存(只计数量)",
|
||||
storeUnchangedHint: "割接优先看失败与通过率;成功默认分层抽样。输入筛选可回查原表(不依赖抽样)。通过率按全部成功计数。",
|
||||
saveJob: "保存配置",
|
||||
jobSaved: "任务配置已保存",
|
||||
jobDeleted: "比对任务已删除",
|
||||
jobList: "比对任务",
|
||||
detail: "详情",
|
||||
edit: "编辑",
|
||||
delete: "删除",
|
||||
tabConfig: "任务配置",
|
||||
tabRuns: "对比批次",
|
||||
tabResult: "比对结果",
|
||||
detailTabs: "业务对比工作区",
|
||||
jobReady: "已就绪",
|
||||
configBasics: "作业参数",
|
||||
configSources: "前后数据源",
|
||||
configScope: "检查范围",
|
||||
selectMapping: "选择映射",
|
||||
mappingPairs: "接口对应关系",
|
||||
sourceBaseline: "固定基准",
|
||||
sourceTarget: "验收目标",
|
||||
sourceLatest: "最新批次",
|
||||
sourceRows: "采集 {{n}} 条",
|
||||
autoSourceHint: "保持操作前批次固定;操作后任务采集完成时,自动取最新批次进行对比。",
|
||||
runHistoryTitle: "执行记录",
|
||||
runHistoryHint: "展示最近 50 条记录。执行状态与业务判定分别显示,可打开结果核查。",
|
||||
refreshRuns: "刷新记录",
|
||||
loadedRuns: "已载入批次",
|
||||
activeRuns: "正在执行",
|
||||
completedRuns: "执行完成",
|
||||
stoppedRuns: "失败 / 取消",
|
||||
runFinished: "已完成",
|
||||
runStatusQueued: "排队中",
|
||||
runsLoading: "正在读取执行记录…",
|
||||
runsLoadError: "执行记录读取失败",
|
||||
runs: "历史比对",
|
||||
runsHint: "每次「立即比对」生成一条批次。重启后卡住的「比对中」会自动标为已取消;也可手动终止后重跑。",
|
||||
noRuns: "尚无比对记录,请先执行比对",
|
||||
result: "比对结果",
|
||||
viewResult: "查看结果",
|
||||
cancelRun: "终止",
|
||||
confirmCancelRun: "确定终止该比对批次?终止后可重新发起比对。",
|
||||
runCancelled: "比对已取消",
|
||||
runStatusCancelled: "已取消",
|
||||
compareAlreadyRunning: "已有比对在进行中,请先在「对比批次」中终止或等待完成",
|
||||
runBatchSummary: "失败 {{fail}} · 成功 {{ok}} · 新增 {{added}}",
|
||||
colTime: "时间",
|
||||
pickBatchRun: "选择比对记录",
|
||||
pickRun: "选择比对记录…",
|
||||
runCount: "{{n}} 次",
|
||||
resultEmpty: "无匹配失败/结果行",
|
||||
resultFilterPh: "自由词,或 direction:out network:1.1.1.1",
|
||||
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: "变更",
|
||||
};
|
||||
|
||||
export default bizCompare;
|
||||
298
web/src/i18n/locales/zh/bizMigration.ts
Normal file
298
web/src/i18n/locales/zh/bizMigration.ts
Normal file
|
|
@ -0,0 +1,298 @@
|
|||
const bizMigration = {
|
||||
fullscreen: "大屏模式",
|
||||
exitFullscreen: "退出大屏",
|
||||
fullscreenHint: "全屏展示割接状态,按 Esc 返回看板;浏览器不支持全屏时使用窗口大屏。",
|
||||
wallTitle: "割接监控 · 业务迁移",
|
||||
wallProgress: "本批迁移进度 · 当前快照",
|
||||
wallFilters: "显示筛选与判定操作",
|
||||
wallState_waiting: "等待判定",
|
||||
wallState_unknown: "数据待确认",
|
||||
wallState_anomaly: "存在业务异常",
|
||||
wallState_normal: "当前样本无业务异常",
|
||||
pairCollectionHint: "每个指标两侧同轮关联采集。保存配置会同步增删采集任务;路由项仅手动采集,收尾时再选择,百万路由建议使用独立业务对比任务。频率是目标间隔,实际周期受命令耗时与设备占用影响。",
|
||||
pairedSampling: "双端关联采集 · 及时性",
|
||||
manualRoute: "手动收尾",
|
||||
pairedPeriodic: "关联周期采集",
|
||||
samplingMode: "采集方式",
|
||||
samplingDuration: "采集耗时 老 / 新",
|
||||
samplingQueue: "排队耗时 老 / 新",
|
||||
startSkew: "启动时差",
|
||||
sameRound: "同轮",
|
||||
metricBaselineMissing: "基线未覆盖此指标,需要补充对应基线",
|
||||
samplePhase_idle: "尚未采集",
|
||||
samplePhase_queued: "排队",
|
||||
samplePhase_running: "采集中",
|
||||
samplePhase_success: "完成",
|
||||
samplePhase_partial: "部分完成",
|
||||
samplePhase_failed: "采集失败",
|
||||
samplePhase_cancelled: "已停止",
|
||||
collect_pair_invalid: "双端关联配置不完整",
|
||||
collect_pair_missing: "尚无完整同轮样本",
|
||||
collect_pair_pending: "等待两侧同轮采集完成",
|
||||
collect_pair_failed: "本轮采集失败,不能复用旧样本代替",
|
||||
collect_round_mismatch: "两侧样本不属于同一轮次",
|
||||
sample_start_skew: "两侧实际启动时差过大",
|
||||
latestSnapshot: "最新快照",
|
||||
steadyOutside: "范围外稳定 {{n}} 条",
|
||||
"followLive": "实时跟随",
|
||||
"historySnapshot": "历史快照",
|
||||
"evaluatedAt": "最近判定",
|
||||
"refreshBoard": "刷新看板",
|
||||
"oldestSample": "最早采集",
|
||||
"liveOverview": "业务迁移概览",
|
||||
"remaining": "待迁移条目",
|
||||
"anomalyInBatch": "本批异常",
|
||||
"anomalyOutsideBatch": "范围外异常",
|
||||
"coverageUnknown": "数据待确认,不能视为验收通过",
|
||||
"coverageUnknownHint": "采集缺失、过期、不同步或键冲突需要处理;正常样本仅代表对应监控条目。",
|
||||
"awaitingPeer": "等待新侧采集确认",
|
||||
"migratedPrevious": "前批已接续",
|
||||
"unfinishedPrevious": "前批未接续",
|
||||
"sample_time_missing": "采集时间缺失",
|
||||
"sample_skew": "两侧采集间隔过大",
|
||||
"sample_stale": "采集已过期",
|
||||
"duplicateKeys": "重复业务键",
|
||||
"uncoveredScope": "范围对应表已失效",
|
||||
"refreshFailed": "获取失败,当前显示保留快照:",
|
||||
"lastAcceptance": "上次终验",
|
||||
"diffSearch": "搜索业务键 / 判定 / 状态",
|
||||
"verdictFilter": "判定筛选",
|
||||
"allVerdicts": "全部判定",
|
||||
"warningVerdict": "迁移中 / 提示",
|
||||
"healthyVerdict": "已接续 / 正常",
|
||||
"unknownVerdict": "待确认",
|
||||
"loadingBoard": "正在更新…",
|
||||
"rowsMatched": "匹配 {{n}} 条",
|
||||
"showOutsideAnomalies": "查看范围外异常",
|
||||
"scopeCurrent": "本批范围",
|
||||
"scopePrevious": "前批范围",
|
||||
"scopeOutside": "范围之外",
|
||||
"fieldChanges": "字段变化 {{n}} 项",
|
||||
"outsideProtection": "范围外业务持续保护",
|
||||
"outsideProtectionHint": "本批之外的业务漂移仍报异常;前批已迁移业务持续检查新侧健康,不计入本批进度。",
|
||||
"reason_service_not_received": "老侧退出,新侧未健康接续",
|
||||
"reason_target_unhealthy": "新侧业务状态异常",
|
||||
"reason_old_service_not_in_baseline": "老基线中未找到业务",
|
||||
"reason_service_content_changed": "接续业务内容不一致",
|
||||
"reason_old_service_still_present": "老侧业务尚未退出",
|
||||
"reason_target_sample_predates_source": "新侧样本早于老侧退出",
|
||||
"reason_previous_batch_received": "前批业务持续健康",
|
||||
"reason_previous_batch_not_received": "前批业务未正常接续",
|
||||
"reason_unmapped_same_iface": "未映射端口发生迁移变化",
|
||||
"reason_out_of_expect:anomaly": "范围外业务漂移",
|
||||
"reason_out_of_expect:lost": "范围外业务丢失",
|
||||
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: "基线已保存",
|
||||
errPairCapacity: "双端关联采集至少需要两个采集并发槽位,请检查任务并发、采集线程和 CLI 预算配置。",
|
||||
errPairBusy: "该指标的两侧仍在采集或排队,请等待本轮结束。",
|
||||
errPairInvalid: "双端采集关联不完整,请重新保存配置建立关联。",
|
||||
errPairSameDevice: "割接监控需要选择两台不同设备。",
|
||||
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: "缺",
|
||||
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}})",
|
||||
errMetricNeedsBindings: "监控项「{{metric}}」需要参数绑定({{params}}),割接高频暂不支持,请去掉该项",
|
||||
errNoProfileForMetric: "监控项「{{metric}}」在当前设备厂商下无可用采集 profile",
|
||||
acceptTitle: "本批验收",
|
||||
acceptPassed: "验收通过",
|
||||
acceptFailed: "验收未过(红单 {{n}})",
|
||||
newBaselineMissingBanner: "缺新基线:{{metrics}}",
|
||||
acceptCarryHint: "可带红开下一批",
|
||||
openRedHint: "红单 {{n}}",
|
||||
redTitle: "红单",
|
||||
redOpen: "未关闭",
|
||||
resolveRed: "关闭",
|
||||
redResolved: "已关闭",
|
||||
batchCreatedWithRed: "已建批(红单 {{n}})",
|
||||
colStatus: "状态",
|
||||
verdictUnfinished: "未完成",
|
||||
};
|
||||
|
||||
export default bizMigration;
|
||||
134
web/src/i18n/locales/zh/bizMonitorTpl.ts
Normal file
134
web/src/i18n/locales/zh/bizMonitorTpl.ts
Normal file
|
|
@ -0,0 +1,134 @@
|
|||
const bizMonitorTpl = {
|
||||
title: "监控模板",
|
||||
help: "对比模板定义怎么对齐/比对;监控模板按同表定义搬迁成功条件。",
|
||||
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: "回到可视化编辑",
|
||||
};
|
||||
|
||||
export default bizMonitorTpl;
|
||||
196
web/src/i18n/locales/zh/bizState.ts
Normal file
196
web/src/i18n/locales/zh/bizState.ts
Normal file
|
|
@ -0,0 +1,196 @@
|
|||
const bizState = {
|
||||
title: "业务监控",
|
||||
loadedTasks: "已载入任务",
|
||||
loadedBatches: "最近批次 · 已载入 {{n}} 条(最多 200)",
|
||||
collectErrors: "最近采集异常",
|
||||
retry: "重试",
|
||||
taskLoading: "正在读取任务配置…",
|
||||
tasksLoadError: "任务列表读取失败",
|
||||
taskLoadError: "任务配置读取失败",
|
||||
batchLoadError: "批次读取失败",
|
||||
sheetLoadError: "结构化数据读取失败",
|
||||
statusQueued: "排队中",
|
||||
batchSuccess: "采集成功",
|
||||
batchPartial: "部分完成",
|
||||
batchFailed: "采集失败",
|
||||
batchCancelled: "已取消",
|
||||
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: "采集周期",
|
||||
intervalUnit: "周期单位",
|
||||
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: "参数关联已保存",
|
||||
};
|
||||
|
||||
export default bizState;
|
||||
117
web/src/i18n/locales/zh/collect.ts
Normal file
117
web/src/i18n/locales/zh/collect.ts
Normal file
|
|
@ -0,0 +1,117 @@
|
|||
const 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: "全部状态",
|
||||
},
|
||||
};
|
||||
|
||||
export default collect;
|
||||
25
web/src/i18n/locales/zh/common.ts
Normal file
25
web/src/i18n/locales/zh/common.ts
Normal file
|
|
@ -0,0 +1,25 @@
|
|||
const 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: "已复制",
|
||||
};
|
||||
|
||||
export default common;
|
||||
58
web/src/i18n/locales/zh/configSync.ts
Normal file
58
web/src/i18n/locales/zh/configSync.ts
Normal file
|
|
@ -0,0 +1,58 @@
|
|||
const 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: "操作",
|
||||
},
|
||||
};
|
||||
|
||||
export default configSync;
|
||||
48
web/src/i18n/locales/zh/index.ts
Normal file
48
web/src/i18n/locales/zh/index.ts
Normal file
|
|
@ -0,0 +1,48 @@
|
|||
// zh messages, one file per namespace (key prefix of t("ns.key")).
|
||||
import common from "./common";
|
||||
import workbench from "./workbench";
|
||||
import network from "./network";
|
||||
import bizState from "./bizState";
|
||||
import bizCompare from "./bizCompare";
|
||||
import bizMigration from "./bizMigration";
|
||||
import bizMonitorTpl from "./bizMonitorTpl";
|
||||
import portTraffic from "./portTraffic";
|
||||
import lldpLinks from "./lldpLinks";
|
||||
import configSync from "./configSync";
|
||||
import networkDevices from "./networkDevices";
|
||||
import networkConfigs from "./networkConfigs";
|
||||
import layout from "./layout";
|
||||
import auth from "./auth";
|
||||
import collect from "./collect";
|
||||
import managedNe from "./managedNe";
|
||||
import ume from "./ume";
|
||||
import webcrt from "./webcrt";
|
||||
import topology from "./topology";
|
||||
import topoClassify from "./topoClassify";
|
||||
import audit from "./audit";
|
||||
|
||||
const zh = {
|
||||
common,
|
||||
workbench,
|
||||
network,
|
||||
bizState,
|
||||
bizCompare,
|
||||
bizMigration,
|
||||
bizMonitorTpl,
|
||||
portTraffic,
|
||||
lldpLinks,
|
||||
configSync,
|
||||
networkDevices,
|
||||
networkConfigs,
|
||||
layout,
|
||||
auth,
|
||||
collect,
|
||||
managedNe,
|
||||
ume,
|
||||
webcrt,
|
||||
topology,
|
||||
topoClassify,
|
||||
audit,
|
||||
};
|
||||
|
||||
export default zh;
|
||||
26
web/src/i18n/locales/zh/layout.ts
Normal file
26
web/src/i18n/locales/zh/layout.ts
Normal file
|
|
@ -0,0 +1,26 @@
|
|||
const 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",
|
||||
};
|
||||
|
||||
export default layout;
|
||||
109
web/src/i18n/locales/zh/lldpLinks.ts
Normal file
109
web/src/i18n/locales/zh/lldpLinks.ts
Normal file
|
|
@ -0,0 +1,109 @@
|
|||
const 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: "陈旧",
|
||||
},
|
||||
};
|
||||
|
||||
export default lldpLinks;
|
||||
200
web/src/i18n/locales/zh/managedNe.ts
Normal file
200
web/src/i18n/locales/zh/managedNe.ts
Normal file
|
|
@ -0,0 +1,200 @@
|
|||
const 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" +
|
||||
"· 用户名模板:{hop_user}@{target_user}@{target_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: "应用到选中网元",
|
||||
},
|
||||
};
|
||||
|
||||
export default managedNe;
|
||||
33
web/src/i18n/locales/zh/network.ts
Normal file
33
web/src/i18n/locales/zh/network.ts
Normal file
|
|
@ -0,0 +1,33 @@
|
|||
const 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: "该能力尚未开放。",
|
||||
},
|
||||
};
|
||||
|
||||
export default network;
|
||||
24
web/src/i18n/locales/zh/networkConfigs.ts
Normal file
24
web/src/i18n/locales/zh/networkConfigs.ts
Normal file
|
|
@ -0,0 +1,24 @@
|
|||
const 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: "采集时间",
|
||||
},
|
||||
};
|
||||
|
||||
export default networkConfigs;
|
||||
17
web/src/i18n/locales/zh/networkDevices.ts
Normal file
17
web/src/i18n/locales/zh/networkDevices.ts
Normal file
|
|
@ -0,0 +1,17 @@
|
|||
const networkDevices = {
|
||||
title: "设备列表",
|
||||
keywordPh: "名称 / IP / ID",
|
||||
allSource: "全部来源",
|
||||
empty: "暂无网元。",
|
||||
exportName: "network-devices",
|
||||
col: {
|
||||
source: "来源",
|
||||
name: "名称",
|
||||
vendor: "厂商",
|
||||
deviceType: "设备类型",
|
||||
connect: "连通状态",
|
||||
actions: "操作",
|
||||
},
|
||||
};
|
||||
|
||||
export default networkDevices;
|
||||
204
web/src/i18n/locales/zh/portTraffic.ts
Normal file
204
web/src/i18n/locales/zh/portTraffic.ts
Normal file
|
|
@ -0,0 +1,204 @@
|
|||
const 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: "描述",
|
||||
},
|
||||
};
|
||||
|
||||
export default portTraffic;
|
||||
67
web/src/i18n/locales/zh/topoClassify.ts
Normal file
67
web/src/i18n/locales/zh/topoClassify.ts
Normal file
|
|
@ -0,0 +1,67 @@
|
|||
const 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: "没有网元。",
|
||||
};
|
||||
|
||||
export default topoClassify;
|
||||
334
web/src/i18n/locales/zh/topology.ts
Normal file
334
web/src/i18n/locales/zh/topology.ts
Normal file
|
|
@ -0,0 +1,334 @@
|
|||
const 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 或切回选择退出)",
|
||||
};
|
||||
|
||||
export default topology;
|
||||
278
web/src/i18n/locales/zh/ume.ts
Normal file
278
web/src/i18n/locales/zh/ume.ts
Normal file
|
|
@ -0,0 +1,278 @@
|
|||
const 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:
|
||||
"【订阅】\n" +
|
||||
"· 需手动建立 / 取消\n" +
|
||||
"· 建立后(或重启且库中仍有效)后台自动连 WSS 收实时告警\n\n" +
|
||||
"【任务控制】\n" +
|
||||
"· alarms_current_ws_consumer 的 pause/resume 只停/启 WSS\n" +
|
||||
"· 不会取消 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:
|
||||
"【匹配】\n" +
|
||||
"· notificationId 精确匹配\n" +
|
||||
"· 或告警描述关键字模糊匹配(不区分大小写,含 nativeProbableCause 等)\n\n" +
|
||||
"【范围】\n" +
|
||||
"· 可选限定 Inventory 的 ne_type;不选则匹配全部设备\n\n" +
|
||||
"【投递】\n" +
|
||||
"· 命中后由 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:
|
||||
"【用途】\n" +
|
||||
"· 为 Inventory 网元配置统一 SSH 凭据与跳板/堡垒机\n\n" +
|
||||
"【MCP】\n" +
|
||||
"· 可用 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: "原因",
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
export default ume;
|
||||
233
web/src/i18n/locales/zh/webcrt.ts
Normal file
233
web/src/i18n/locales/zh/webcrt.ts
Normal file
|
|
@ -0,0 +1,233 @@
|
|||
const 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: "选中即复制",
|
||||
rightClickPaste: "右键直接粘贴",
|
||||
rightClickPasteHint: "Shift + 右键打开菜单;关闭此项后,右键始终打开菜单。",
|
||||
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 连接失败",
|
||||
},
|
||||
};
|
||||
|
||||
export default webcrt;
|
||||
121
web/src/i18n/locales/zh/workbench.ts
Normal file
121
web/src/i18n/locales/zh/workbench.ts
Normal file
|
|
@ -0,0 +1,121 @@
|
|||
const 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: "登录会话",
|
||||
},
|
||||
};
|
||||
|
||||
export default workbench;
|
||||
2956
web/src/i18n/zh.ts
2956
web/src/i18n/zh.ts
File diff suppressed because it is too large
Load diff
Loading…
Add table
Add a link
Reference in a new issue