mirror of
https://github.com/Rain-kl/OpenFlare.git
synced 2026-09-28 05:46:36 +08:00
5a8722ff07
接入无 URL 前缀的 zh-CN/en,顶栏与外观设置可切换语言;选择写入 cookie 后刷新生效。
674 lines
28 KiB
JSON
674 lines
28 KiB
JSON
{
|
|
"dashboard": {
|
|
"title": "Overview",
|
|
"generatedAt": "Generated at {time}",
|
|
"refresh": "Refresh",
|
|
"loadingTitle": "Loading overview",
|
|
"loadingDesc": "Aggregating node health, traffic, and capacity metrics...",
|
|
"loadFailed": "Failed to load overview: {error}",
|
|
"emptyTitle": "No overview data",
|
|
"emptyDesc": "The system is running, but there is no aggregated overview to show yet.",
|
|
"requestFailed": "Request failed. Please try again later.",
|
|
"stats": {
|
|
"requests24h": "24h requests",
|
|
"requestsMeta": "24h unique visitors {visitors} · errors {errors} · estimated QPS {qps}",
|
|
"clusterCapacity": "Cluster capacity",
|
|
"avgMemoryHighLoad": "Avg memory {memory} · high-load nodes CPU {cpu} / memory {memoryNodes} / storage {storage}",
|
|
"nodeOverview": "Node overview",
|
|
"onlineOf": "/ {total} online",
|
|
"pending": "Pending {count}",
|
|
"unhealthyOffline": "Unhealthy {unhealthy} · offline {offline}"
|
|
},
|
|
"world": {
|
|
"title": "Global stage",
|
|
"description": "Summarizes node distribution, source-country heat, and recent runtime status.",
|
|
"legendSource": "Source",
|
|
"legendHealthy": "Healthy",
|
|
"legendPressure": "Under load",
|
|
"legendUnhealthy": "Unhealthy",
|
|
"modeVisitorSource": "Visitor sources",
|
|
"modeNodeCoords": "Node coordinates",
|
|
"modeCoverage": "Coverage signal",
|
|
"onlineCoverage": "Online coverage",
|
|
"onlineHint": "{online}/{total} online",
|
|
"runHealth": "Runtime health",
|
|
"unhealthyCount": "{count} unhealthy",
|
|
"requests24h": "24h requests",
|
|
"qpsReported": "QPS {qps} · {count} nodes reporting",
|
|
"nodeCoords": "Node coordinates",
|
|
"sourceCountries": "{count} source countries",
|
|
"fallbackPins": "Preset pins are used when coordinates are missing",
|
|
"avgCpu": "Avg CPU",
|
|
"highCount": "{count} high",
|
|
"avgMemory": "Avg memory",
|
|
"highStorage": "High storage",
|
|
"offlinePending": "{offline} offline · {pending} pending",
|
|
"mapPreparing": "Preparing map",
|
|
"mapPreparingDesc": "Loads when it enters the viewport",
|
|
"noNodesOverlay": "No nodes yet. Geographic distribution will appear after nodes join."
|
|
},
|
|
"map": {
|
|
"sourceRequests": "Source requests in the last 24 hours {count}",
|
|
"presetPin": "Preset pin",
|
|
"requestsErrors": "Requests {requests} · errors {errors}",
|
|
"eventsStatus": "Active events {events} · node status {status}",
|
|
"openrestyStatus": "OpenResty status {status}",
|
|
"loadFailed": "Failed to load world map",
|
|
"loading": "Loading world map",
|
|
"loadFailedDesc": "The ECharts world map failed to register. Refresh and try again.",
|
|
"loadingDesc": "Initializing the world map after the first screen is ready.",
|
|
"measuring": "Measuring map container size..."
|
|
},
|
|
"trafficTrend": {
|
|
"title": "24-hour request trend",
|
|
"description": "Hourly request totals and 2xx/4xx/5xx counts to spot abnormal status spikes.",
|
|
"summaryHint": "Last 24 hours",
|
|
"requests": "Requests",
|
|
"status2xx": "2xx requests",
|
|
"status4xx": "4xx requests",
|
|
"status5xx": "5xx requests"
|
|
},
|
|
"capacityTrend": {
|
|
"title": "24-hour capacity trend",
|
|
"description": "Hourly CPU and memory usage to see whether cluster capacity stays tight.",
|
|
"avgCpu": "Avg CPU",
|
|
"avgMemory": "Avg memory"
|
|
},
|
|
"trafficCapacity": {
|
|
"title": "24-hour traffic and capacity trend",
|
|
"networkHint": "Last 24 hours · from access logs",
|
|
"received": "Data received",
|
|
"provided": "Data served",
|
|
"capacityHint": "Last 24 hours · host capacity · average"
|
|
},
|
|
"distributions": {
|
|
"sourceTitle": "Source distribution",
|
|
"sourceDesc": "Top source countries over the last 24 hours.",
|
|
"sourceEmpty": "No source distribution data",
|
|
"statusTitle": "Status code distribution",
|
|
"statusDesc": "Check whether successful responses still dominate and whether errors are rising.",
|
|
"statusEmpty": "No status code distribution",
|
|
"httpLabel": "HTTP {code}",
|
|
"domainTitle": "Top Domain",
|
|
"domainDesc": "See which domains concentrate most of the traffic.",
|
|
"domainEmpty": "No domain distribution"
|
|
},
|
|
"nodeHealth": {
|
|
"title": "Node health",
|
|
"description": "Sorted by active incidents and resource pressure.",
|
|
"openNodes": "Open nodes",
|
|
"emptyTitle": "No nodes",
|
|
"emptyDesc": "After nodes join, this list will show health and capacity summaries.",
|
|
"colNode": "Node",
|
|
"colStatus": "Status",
|
|
"colCpuMem": "CPU / Memory",
|
|
"colReqErr": "Requests / Errors",
|
|
"colEvents": "Active incidents",
|
|
"colHeartbeat": "Last heartbeat",
|
|
"colActions": "Actions",
|
|
"noGeo": "Map point not configured",
|
|
"wsConnected": "WS connected",
|
|
"na": "N/A",
|
|
"detail": "Details"
|
|
},
|
|
"nodeRank": {
|
|
"title": "Top nodes",
|
|
"traffic": "Highest traffic",
|
|
"trafficEmpty": "No traffic ranking",
|
|
"pressure": "Highest capacity pressure",
|
|
"pressureEmpty": "No capacity pressure data"
|
|
}
|
|
},
|
|
"nodes": {
|
|
"title": "Nodes",
|
|
"applyLogs": "Apply logs",
|
|
"create": "Add node",
|
|
"listTitle": "Node list",
|
|
"refreshNow": "Refresh now",
|
|
"loadingList": "Loading nodes...",
|
|
"emptyAll": "No nodes yet. Create one to get started.",
|
|
"emptyFilter": "No nodes match the current filter",
|
|
"updated": "Node updated",
|
|
"created": "Node created",
|
|
"deleted": "Node deleted",
|
|
"deleteTitle": "Delete node",
|
|
"deleteDesc": "Delete node “{name}”? You will need to recreate and rejoin it.",
|
|
"deleting": "Deleting...",
|
|
"confirmDelete": "Delete",
|
|
"edit": "Edit",
|
|
"delete": "Delete",
|
|
"refresh": "Refresh",
|
|
"detail": "Details",
|
|
"na": "N/A",
|
|
"wsConnected": "WS connected",
|
|
"wsEstablished": "WebSocket connection established",
|
|
"requestFailed": "Request failed. Please try again later.",
|
|
"unknown": "Unknown",
|
|
"running": "Running",
|
|
"liveConfig": "Live config",
|
|
"notApplied": "Not applied",
|
|
"enabled": "Enabled",
|
|
"manual": "Manual",
|
|
"lockedSuffix": " (locked)",
|
|
"noGeo": "Map point not configured",
|
|
"notConfigured": "Not configured",
|
|
"ipLine": "IP: {ip}",
|
|
"locationLine": "Location: {location}",
|
|
"backToList": "Back to nodes",
|
|
"missingId": "Missing node ID. Open details from the node list.",
|
|
"loadingDetail": "Loading node details...",
|
|
"notFound": "Node not found. It may have been deleted or the ID is invalid.",
|
|
"syncing": "Syncing...",
|
|
"forceSync": "Force sync",
|
|
"dispatching": "Dispatching...",
|
|
"viewUpgrade": "View upgrade",
|
|
"tabOverview": "Overview",
|
|
"tabManage": "Status & deploy",
|
|
"kpiNodeId": "Node ID",
|
|
"kpiLastSeen": "Last heartbeat",
|
|
"kpiCurrentConfig": "Current config",
|
|
"filter": {
|
|
"all": "All nodes",
|
|
"descAll": "Showing all nodes.",
|
|
"descRelay": "Showing Relay nodes only.",
|
|
"descTunnel": "Showing Tunnel nodes only.",
|
|
"descEdge": "Showing Edge nodes only."
|
|
},
|
|
"status": {
|
|
"online": "Online",
|
|
"pending": "Pending",
|
|
"offline": "Offline",
|
|
"running": "Running",
|
|
"wsConnected": "WS connected"
|
|
},
|
|
"apply": {
|
|
"success": "Success",
|
|
"warning": "Warning",
|
|
"failed": "Failed",
|
|
"none": "N/A"
|
|
},
|
|
"health": {
|
|
"healthy": "Healthy",
|
|
"unhealthy": "Unhealthy",
|
|
"unknown": "Unknown"
|
|
},
|
|
"relative": {
|
|
"justNow": "Just now",
|
|
"minutesAgo": "{count} minutes ago",
|
|
"hoursAgo": "{count} hours ago",
|
|
"daysAgo": "{count} days ago",
|
|
"monthsAgo": "{count} months ago"
|
|
},
|
|
"uptime": {
|
|
"daysHours": "{days}d {hours}h",
|
|
"hoursMinutes": "{hours}h {minutes}m",
|
|
"minutes": "{minutes}m"
|
|
},
|
|
"channel": {
|
|
"preview": "preview",
|
|
"stable": "stable"
|
|
},
|
|
"table": {
|
|
"node": "Node",
|
|
"status": "Status",
|
|
"version": "Version",
|
|
"runHealth": "Runtime health",
|
|
"currentVersion": "Current version",
|
|
"latestApply": "Latest apply",
|
|
"lastSeen": "Last heartbeat",
|
|
"actions": "Actions"
|
|
},
|
|
"editor": {
|
|
"editTitle": "Edit node",
|
|
"createTitle": "Add node",
|
|
"description": "After creating a node, open its details for a dedicated token and deploy command.",
|
|
"nodeType": "Node type",
|
|
"typeEdge": "Edge node",
|
|
"typeRelay": "Relay node",
|
|
"typeTunnel": "Tunnel node",
|
|
"name": "Node name",
|
|
"namePlaceholder": "e.g. edge-hk-01",
|
|
"ip": "Node IP",
|
|
"ipPlaceholder": "Optional; reported automatically after join",
|
|
"lockIp": "Lock IP",
|
|
"lockIpDesc": "When enabled, the control plane will not overwrite the IP",
|
|
"autoUpdate": "Auto-update Agent",
|
|
"autoUpdateDesc": "When enabled, the node pulls stable updates automatically",
|
|
"bindPort": "Bind port",
|
|
"vhostPort": "VHost port",
|
|
"manualGeo": "Manual map point",
|
|
"manualGeoDesc": "Used on the overview map",
|
|
"geoName": "Location name",
|
|
"latitude": "Latitude",
|
|
"longitude": "Longitude",
|
|
"saving": "Saving...",
|
|
"saveEdit": "Save changes",
|
|
"createAction": "Add node",
|
|
"errName": "Enter a node name",
|
|
"errLockIp": "A node IP is required when IP is locked",
|
|
"errBindPort": "Enter a valid bind port",
|
|
"errVhostPort": "Enter a valid VHost port"
|
|
},
|
|
"install": {
|
|
"edgeTitle": "Edge node deploy",
|
|
"edgeDesc": "Use the Agent Token to join an edge node to the control plane.",
|
|
"relayTitle": "Relay deploy command",
|
|
"relayDesc": "Use the Discovery Token to join an frps relay node to the control plane.",
|
|
"tunnelTitle": "Tunnel deploy command",
|
|
"tunnelDesc": "Use the Tunnel Token to join an openflared client to the control plane.",
|
|
"agentToken": "Agent Token",
|
|
"discoveryToken": "Discovery Token",
|
|
"tunnelToken": "Tunnel Token",
|
|
"scriptLabel": "One-line script (Linux / macOS)",
|
|
"dockerLabel": "Docker container deploy",
|
|
"copyFailed": "Copy failed. Select the command text manually.",
|
|
"copiedScript": "Deploy script copied",
|
|
"copiedDocker": "Docker deploy command copied",
|
|
"copyScript": "Copy script",
|
|
"copyDocker": "Copy Docker",
|
|
"nodeId": "Node ID",
|
|
"serverUrl": "Server URL (control plane)",
|
|
"serverUrlHint": "The script and container will use this address to reach the OpenFlare control plane.",
|
|
"noToken": "This node has no access token yet. Refresh later.",
|
|
"needServerUrl": "Enter a valid Server URL to generate the deploy command."
|
|
},
|
|
"update": {
|
|
"title": "Agent upgrade",
|
|
"description": "Check GitHub releases and dispatch an upgrade. The node runs it after the next heartbeat.",
|
|
"currentVersion": "Current version",
|
|
"channel": "Release channel",
|
|
"updateStatus": "Update status",
|
|
"waitingPreview": "Waiting for preview update",
|
|
"waitingUpdate": "Waiting for update",
|
|
"notRequested": "Not dispatched",
|
|
"checking": "Checking releases...",
|
|
"hasUpdate": "Update available",
|
|
"upToDate": "Already up to date",
|
|
"previewRelease": "Preview release",
|
|
"stableRelease": "Stable release",
|
|
"targetVersion": "Target version",
|
|
"notFound": "Not found",
|
|
"publishedAt": "Published",
|
|
"noNotes": "No release notes",
|
|
"viewRelease": "View release",
|
|
"checkStable": "Check stable",
|
|
"checkPreview": "Check preview",
|
|
"upgradePreview": "Upgrade to preview",
|
|
"upgradeStable": "Upgrade to stable"
|
|
},
|
|
"edge": {
|
|
"upgrade": "Upgrade Agent",
|
|
"restartOpenresty": "Restart OpenResty",
|
|
"runStatus": "Runtime status",
|
|
"runStatusDesc": "Node online state and OpenResty health",
|
|
"openrestyHealth": "OpenResty health",
|
|
"lastSeen": "Last heartbeat",
|
|
"ip": "IP address",
|
|
"geo": "Map point",
|
|
"syncTitle": "Config sync",
|
|
"syncDesc": "Version catch-up and latest apply result",
|
|
"currentVersion": "Current config version",
|
|
"latestApply": "Latest apply",
|
|
"latestApplyAt": "Latest apply time",
|
|
"agentVersion": "Agent version",
|
|
"nginxVersion": "Nginx version",
|
|
"autoUpdate": "Auto update",
|
|
"runtimeMessages": "Runtime messages",
|
|
"runtimeMessagesDesc": "Status notes reported by OpenResty and Agent",
|
|
"openrestyMessage": "OpenResty status message",
|
|
"noExtraError": "No extra error reported.",
|
|
"restartPending": "Waiting for the node to restart OpenResty after the next heartbeat.",
|
|
"kpiAgent": "Agent version",
|
|
"connectionHint": "Current OpenResty connections",
|
|
"toastUpdated": "Node updated",
|
|
"toastForceSync": "Force-sync dispatched to node {name}",
|
|
"toastRestart": "OpenResty restart dispatched to node {name}",
|
|
"toastUpgrade": "{channel} upgrade dispatched to node {name}",
|
|
"toastDeleted": "Node deleted"
|
|
},
|
|
"relay": {
|
|
"upgrade": "Upgrade Relay",
|
|
"runStatus": "Relay runtime",
|
|
"runStatusDesc": "frps online state and load summary",
|
|
"health": "Relay health",
|
|
"connections": "Active connections / proxies",
|
|
"portsTitle": "Network ports",
|
|
"portsDesc": "frps control plane and HTTP vhost settings",
|
|
"bindPort": "Control bind port",
|
|
"vhostPort": "VHost HTTP port",
|
|
"agentAddr": "Agent access address",
|
|
"relayVersion": "Relay version",
|
|
"frpsVersion": "frps core version",
|
|
"webuiTitle": "FRPS WebUI",
|
|
"webuiDesc": "Enable the built-in frps web console and set its listen port",
|
|
"enableWebui": "Enable web console",
|
|
"enableWebuiHint": "When on, the node starts the built-in frps admin service.",
|
|
"webuiPort": "Web console port",
|
|
"webuiPortPlaceholder": "e.g. 17500",
|
|
"actualPort": "Currently listening on {port} (takes effect on the next heartbeat; default is bind port + 500).",
|
|
"openWebui": "Open FRPS WebUI",
|
|
"copiedLink": "Link copied",
|
|
"copyLink": "Copy link",
|
|
"webuiDisabled": "WebUI is disabled or the bind port is not set.",
|
|
"metadata": "Node metadata",
|
|
"createdAt": "Created",
|
|
"updatedAt": "Updated",
|
|
"kpiFrps": "frps core",
|
|
"connectionHint": "Relay active connections",
|
|
"invalidPort": "Port must be between 1 and 65535",
|
|
"portSaveFailed": "Failed to update port",
|
|
"toastPortSaved": "FRPS WebUI port updated",
|
|
"toastUpdated": "Relay node updated",
|
|
"toastWebui": "FRPS WebUI setting updated",
|
|
"toastForceSync": "Force-sync dispatched to relay {name}",
|
|
"toastUpgrade": "{channel} upgrade dispatched to relay {name}",
|
|
"toastDeleted": "Relay node deleted",
|
|
"deleteTitle": "Delete relay node",
|
|
"deleteDesc": "Delete relay node “{name}”? You will need to recreate and rejoin it."
|
|
},
|
|
"tunnel": {
|
|
"upgrade": "Upgrade openflared",
|
|
"runStatus": "Tunnel runtime",
|
|
"runStatusDesc": "openflared connection and online state",
|
|
"flaredStatus": "flared status",
|
|
"autoUpdate": "Auto update",
|
|
"syncTitle": "Config sync",
|
|
"syncDesc": "Tunnel client config catch-up",
|
|
"currentVersion": "Current config version",
|
|
"latestApply": "Latest apply",
|
|
"latestApplyAt": "Latest apply time",
|
|
"fileCount": "Synced files",
|
|
"fileCountValue": "{count}",
|
|
"upgradeStatus": "Upgrade status",
|
|
"credentials": "Join credentials",
|
|
"credentialsDesc": "Token required by the tunnel client",
|
|
"tunnelToken": "Tunnel Token",
|
|
"createdAt": "Created",
|
|
"updatedAt": "Updated",
|
|
"kpiOpenflared": "openflared",
|
|
"connectionHint": "Tunnel concurrent connections",
|
|
"toastUpdated": "Tunnel node updated",
|
|
"toastForceSync": "Force-sync dispatched to tunnel {name}",
|
|
"toastUpgrade": "{channel} upgrade dispatched to tunnel {name}",
|
|
"toastDeleted": "Tunnel node deleted",
|
|
"deleteTitle": "Delete tunnel node",
|
|
"deleteDesc": "Delete tunnel node “{name}”? You will need to recreate and rejoin it."
|
|
},
|
|
"obs": {
|
|
"hostname": "Hostname",
|
|
"os": "Operating system",
|
|
"kernelArch": "Kernel / arch",
|
|
"uptime": "Uptime",
|
|
"cpu": "CPU",
|
|
"cpuCores": "{count} cores",
|
|
"totalMemory": "Total memory",
|
|
"totalStorage": "Total storage",
|
|
"reportedAt": "Reported at",
|
|
"eventsTitle": "Health event timeline",
|
|
"eventsDesc": "Keeps active and recovered events to help judge runtime health.",
|
|
"cleanupLogs": "Clean logs",
|
|
"filterAll": "All events",
|
|
"filterActive": "Active",
|
|
"filterResolved": "Recovered",
|
|
"filterEmpty": "No health events for this filter.",
|
|
"noMessage": "No detailed message",
|
|
"firstTriggered": "First triggered:",
|
|
"lastTriggered": "Last triggered:",
|
|
"resolvedAt": "Recovered:",
|
|
"noEvents": "This node has not reported any health events yet.",
|
|
"cleaned": "Cleaned {count} health event logs",
|
|
"nothingToClean": "No health event logs to clean",
|
|
"loading": "Loading observability data...",
|
|
"diag": "Runtime diagnosis",
|
|
"activeIssues": "{count} active incidents",
|
|
"stable": "Stable",
|
|
"noActiveEvents": "No active health events",
|
|
"systemCore": "System core",
|
|
"uptimeFromProfile": "From the node system profile",
|
|
"profileTitle": "System profile",
|
|
"profileDesc": "Host and hardware info reported by the node",
|
|
"noProfile": "The node has joined but has not reported a full system profile yet.",
|
|
"noProfileLong": "The node has joined but has not reported a full system profile yet.",
|
|
"snapshotTitle": "Live resource snapshot",
|
|
"snapshotDesc": "Latest metrics report",
|
|
"realtimeResources": "Live resources",
|
|
"memory": "Memory",
|
|
"storage": "Storage",
|
|
"connections": "Connections",
|
|
"snapshotAgo": "Snapshot {time}",
|
|
"noSnapshot": "The node has joined but has not reported a resource snapshot yet.",
|
|
"noSnapshotLong": "The node has joined but has not reported a resource snapshot yet.",
|
|
"cleanupTitle": "Clean health event logs",
|
|
"cleanupDesc": "This deletes all health diagnosis history recorded for this node on the control plane. New events will still be reported.",
|
|
"cleaning": "Cleaning...",
|
|
"confirmCleanup": "Clean",
|
|
"windowRequests": "Window requests",
|
|
"windowVisitorsHint": "Window unique visitors {visitors} · error rate {rate}%",
|
|
"noWindowSummary": "No request window summary",
|
|
"capacityPressure": "Capacity pressure",
|
|
"needsAttention": "Needs attention",
|
|
"normalRange": "Normal",
|
|
"cpuStorage": "CPU {cpu} · storage {storage}",
|
|
"noResourceSnapshot": "No resource snapshot",
|
|
"sourceSignal": "Source signal",
|
|
"requestTimes": "{count} requests",
|
|
"noSourceDist": "No source distribution data",
|
|
"systemInfo": "System info",
|
|
"networkTraffic": "Network traffic",
|
|
"noActiveIssue": "No active incidents",
|
|
"openrestyConn": "OpenResty connections",
|
|
"currentConn": "Current connections:",
|
|
"throughputHint": "See access-log trends for business throughput (served / received)",
|
|
"windowVisitors": "Window unique visitors",
|
|
"reqQps": "Requests {requests} · estimated QPS {qps}",
|
|
"noTrafficSummary": "No window traffic summary",
|
|
"windowErrors": "Window errors",
|
|
"errorRate": "Error rate {rate}%",
|
|
"noErrorSummary": "No error-rate summary",
|
|
"noNetworkSnapshot": "The node has joined but has not reported a network traffic snapshot yet.",
|
|
"trafficTrendDesc": "Hourly request and error counts for this node.",
|
|
"capacityTrendDesc": "CPU and memory usage for this node over 24 hours.",
|
|
"structureTitle": "Request structure",
|
|
"structureDesc": "Last 24 hours: which status codes and domains concentrate traffic and errors.",
|
|
"mainStatus": "Top status code",
|
|
"times": "{count} times",
|
|
"noStatusDist": "No status code distribution",
|
|
"topDomain": "Top Domain",
|
|
"noDomainDist": "No domain distribution",
|
|
"resolvedEvents": "Recovered events",
|
|
"resolvedHint": "Health events recovered in the last 24 hours",
|
|
"statusDist": "Status code distribution",
|
|
"distEmpty": "No distribution data",
|
|
"unknownLabel": "Unknown"
|
|
},
|
|
"networkTrend": {
|
|
"title": "24-hour network trend",
|
|
"description": "Hourly data served / received from access logs; summary is the last-24h total.",
|
|
"summaryHint": "Last 24 hours",
|
|
"received": "Data received",
|
|
"provided": "Data served"
|
|
},
|
|
"diskIo": {
|
|
"title": "24-hour disk IO trend",
|
|
"description": "Hourly disk read/write rate (B/s) to spot log amplification, cache jitter, or disk pressure.",
|
|
"summaryHint": "Last 24 hours · average rate",
|
|
"read": "Disk read",
|
|
"write": "Disk write"
|
|
}
|
|
},
|
|
"performance": {
|
|
"title": "Performance",
|
|
"description": "Manage global OpenResty performance settings. Saving enters the unified config publish flow.",
|
|
"preview": "View config preview",
|
|
"saved": "Performance settings saved",
|
|
"saveFailed": "Save failed",
|
|
"loadingAuth": "Loading permissions...",
|
|
"forbiddenTitle": "Insufficient permissions",
|
|
"forbiddenDesc": "Only administrators can access performance settings.",
|
|
"loading": "Loading performance settings...",
|
|
"runtimeTitle": "Connections and events",
|
|
"runtimeDesc": "Workers, timeouts, and request body size",
|
|
"proxyTitle": "Proxy buffers and timeouts",
|
|
"proxyDesc": "Upstream connections, buffers, and WebSocket/HTTP3 switches",
|
|
"gzipTitle": "Compression",
|
|
"cacheTitle": "Cache",
|
|
"cacheDesc": "Single-node reverse-proxy cache",
|
|
"errors": {
|
|
"workerProcesses": "worker_processes must be auto or an integer greater than 0",
|
|
"timeouts": "Timeout and connection values must be integers greater than 0",
|
|
"statusCode": "Default server return status must be between 100 and 999",
|
|
"bodySize": "Invalid client_max_body_size format",
|
|
"headerBuffers": "large_client_header_buffers must look like \"4 16k\"",
|
|
"proxyTimeouts": "Proxy timeouts must be integers greater than 0 seconds",
|
|
"proxyBuffers": "proxy_buffers must look like \"16 16k\"",
|
|
"bufferSize": "Buffer sizes must be integers or values with k/m/g units",
|
|
"gzipMinLength": "gzip_min_length must be an integer greater than 0",
|
|
"gzipLevel": "gzip_comp_level must be between 1 and 9",
|
|
"cachePath": "proxy_cache_path is required when cache is enabled",
|
|
"cacheFormat": "Invalid cache levels, inactive, max_size, or lock_timeout format",
|
|
"cacheKey": "A cache key template is required when cache is enabled"
|
|
}
|
|
},
|
|
"applyLogs": {
|
|
"title": "Apply logs",
|
|
"description": "Inspect successful, warning, and failed config applies. Filter by node_id.",
|
|
"refresh": "Refresh",
|
|
"clear": "Clear logs",
|
|
"backToNodes": "Back to nodes",
|
|
"totalRecords": "Total records",
|
|
"currentPage": "Current page",
|
|
"totalPages": "Total pages",
|
|
"pageNodes": "Nodes on this page",
|
|
"nodeId": "Node ID",
|
|
"nodePlaceholder": "Filter apply logs by node_id",
|
|
"pageSize": "Page size",
|
|
"pageSizeOption": "{count}",
|
|
"filter": "Filter",
|
|
"reset": "Reset filters",
|
|
"emptyTitle": "No apply logs",
|
|
"emptyDesc": "No apply records match the current filters.",
|
|
"colNodeId": "Node ID",
|
|
"colVersion": "Version",
|
|
"colResult": "Result",
|
|
"colChecksum": "Checksum",
|
|
"colTime": "Time",
|
|
"colMessage": "Message",
|
|
"colActions": "Actions",
|
|
"detail": "Details",
|
|
"pageInfo": "Page {current} / {total}, {count} records.",
|
|
"prev": "Previous",
|
|
"next": "Next",
|
|
"loadFailed": "Load failed",
|
|
"cleared": "Apply logs cleared",
|
|
"clearedDesc": "Deleted {count} records",
|
|
"clearFailed": "Failed to clear apply logs",
|
|
"unknownError": "Unknown error",
|
|
"clearTitle": "Clear all apply logs?",
|
|
"clearDesc": "This deletes all {count} apply log records and cannot be undone. Nodes will continue to report new apply results.",
|
|
"clearing": "Clearing...",
|
|
"confirmClear": "Clear",
|
|
"success": "Success",
|
|
"warning": "Warning",
|
|
"failed": "Failed",
|
|
"sheetTitle": "Apply log details",
|
|
"sheetDesc": "Full result and checksum details for this apply log.",
|
|
"versionBadge": "Version: {version}",
|
|
"createdAt": "Created",
|
|
"targetChecksum": "Target Checksum",
|
|
"mainChecksum": "Main config digest",
|
|
"routeChecksum": "Route config digest",
|
|
"supportFiles": "Support files",
|
|
"message": "Message",
|
|
"close": "Close"
|
|
},
|
|
"configVersions": {
|
|
"title": "Config versions",
|
|
"description": "Browse historical snapshots, preview pending diffs, and reactivate an older version when needed.",
|
|
"refresh": "Refresh",
|
|
"cleanupOld": "Clean old versions",
|
|
"viewDiff": "View diff",
|
|
"forcePublish": "Force publish",
|
|
"previewPublish": "Preview and publish",
|
|
"emptyTitle": "No history",
|
|
"emptyDesc": "There are no published versions yet. Publish a config first.",
|
|
"colVersion": "Version",
|
|
"colStatus": "Status",
|
|
"colAuthor": "Created by",
|
|
"colChecksum": "Checksum",
|
|
"colCreatedAt": "Created",
|
|
"colActions": "Actions",
|
|
"active": "Active",
|
|
"history": "History",
|
|
"system": "System",
|
|
"snapshot": "Snapshot",
|
|
"activate": "Activate",
|
|
"loadFailed": "Load failed",
|
|
"previewLoadFailed": "Failed to load preview",
|
|
"diffLoadFailed": "Failed to load diff",
|
|
"publishSuccess": "Published",
|
|
"publishSuccessDesc": "Version {version}",
|
|
"publishFailed": "Publish failed",
|
|
"activateSuccess": "Activated",
|
|
"activateSuccessDesc": "Version {version}",
|
|
"activateFailed": "Activate failed",
|
|
"cleanupDone": "Cleanup complete",
|
|
"cleanupDoneDesc": "Deleted {count} historical snapshots",
|
|
"cleanupFailed": "Cleanup failed",
|
|
"unknownError": "Unknown error",
|
|
"confirmPublishTitle": "Publish config",
|
|
"confirmPublishDesc": "This creates a new version from the pending config and marks it active. Nodes will pull the update next.",
|
|
"confirmPublish": "Publish",
|
|
"confirmForceTitle": "Force publish",
|
|
"confirmForceDesc": "This ignores the change check and immediately creates a new version. Confirm you really need to republish.",
|
|
"confirmActivateTitle": "Activate version",
|
|
"confirmActivateDesc": "Set version {version} as the active version?",
|
|
"confirmActivate": "Activate",
|
|
"previewTitle": "Publish preview",
|
|
"previewDesc": "Rendered pending config and support files.",
|
|
"loadingPreview": "Loading preview...",
|
|
"routeCount": "{count} routes",
|
|
"websiteCount": "{count} websites",
|
|
"mainConfig": "Main config",
|
|
"routeConfig": "Route config",
|
|
"supportFiles": "Support files ({count})",
|
|
"noSupportFiles": "This publish has no extra support files.",
|
|
"noChanges": "Pending routes match the active version, so it cannot be published again.",
|
|
"close": "Close",
|
|
"publishing": "Publishing...",
|
|
"diffTitle": "Config diff",
|
|
"diffDesc": "Differences between the pending config and the active version.",
|
|
"loadingDiff": "Loading diff...",
|
|
"activeVersion": "Active version",
|
|
"none": "None",
|
|
"addedDomains": "Added domains",
|
|
"removedDomains": "Removed domains",
|
|
"modifiedDomains": "Modified domains",
|
|
"itemCount": "{count}",
|
|
"noChange": "No changes",
|
|
"emptyValue": "empty",
|
|
"mainChanged": "Main config changed",
|
|
"mainUnchanged": "Main config unchanged",
|
|
"wafChanged": "WAF changed",
|
|
"wafUnchanged": "WAF unchanged",
|
|
"websiteDelta": "Websites {from} → {to}",
|
|
"optionKey": "Option",
|
|
"activeValue": "Active value",
|
|
"pendingValue": "Pending value",
|
|
"noOptionChanges": "No OpenResty option changes.",
|
|
"snapshotTitle": "Version snapshot",
|
|
"snapshotVersion": "Version {version}",
|
|
"snapshotDesc": "Full snapshot of this historical config version.",
|
|
"loadingSnapshot": "Loading snapshot...",
|
|
"createdBy": "Created by",
|
|
"createdAt": "Created",
|
|
"snapshotLoadFailed": "Failed to load version snapshot",
|
|
"cleanupTitle": "Clean historical snapshots",
|
|
"cleanupDesc": "Delete older snapshots. The currently active version is always protected.",
|
|
"keepCount": "Keep latest snapshots",
|
|
"keepHint": "Default 10, minimum 3.",
|
|
"keepMin": "Keep at least 3 historical snapshots",
|
|
"cleaning": "Cleaning...",
|
|
"confirmCleanup": "Clean"
|
|
}
|
|
}
|