mirror of
https://github.com/MHSanaei/3x-ui.git
synced 2026-09-01 16:07:17 +00:00
chore(i18n): delete 230 dead translation keys and guard against new ones (#6132)
* chore(i18n): delete 230 dead translation keys and guard against new ones The 13 locale files carried 230 keys (11% of the set) that nothing in the frontend or Go sources references — leftovers of renamed features (the email notifier reuses tgbot.messages.* for subjects, the old email.subject*/title* set was orphaned; likewise menu.*, the clients bulk-copy strings, and the secAlert* family). Nothing detected this: a missing key falls back to en-US and an unused key fails nothing. A new test now fails the build when an en-US key has no reference in frontend/src or internal Go sources (dynamic keys are covered by harvesting concatenation and template-literal prefixes), and pins that all 13 locales carry exactly the en-US key set, so parity drift surfaces at test time instead of as a silent fallback. Each locale shrinks by the same 230 keys; net -2,900 lines across the translation set. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * fix(i18n): restore the 29 live remarkVars keys, match whole tokens, unmask 9 more From review: the template-literal harvester required the prefix to end on a dot, so pages.hosts.remarkVars.desc${token} harvested nothing and all 29 desc* tooltip keys were wrongly deleted — and the guard shared the flawed logic, so CI stayed green while the Hosts page would have shown raw key names in 13 languages. Restored from the parent commit; the harvester now requires at least one dot but not a trailing one. Also from review: references are matched as whole dotted tokens instead of substrings (a dead key can no longer hide behind a longer sibling — that unmasked 9 more genuinely dead keys, each verified by hand before deletion), and the test excludes itself from the scan so its own prose cannot whitelist a subtree. Net: -210 keys per locale instead of the previous -230. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> --------- Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
@@ -48,7 +48,6 @@
|
||||
"copySuccess": "Copied successfully",
|
||||
"sure": "Sure",
|
||||
"encryption": "Encryption",
|
||||
"useIPv4ForHost": "Use IPv4 for host",
|
||||
"transmission": "Transmission",
|
||||
"host": "Host",
|
||||
"path": "Path",
|
||||
@@ -74,18 +73,9 @@
|
||||
"twoFactorCode": "Code",
|
||||
"remained": "Remaining",
|
||||
"security": "Security",
|
||||
"secAlertTitle": "Security Alert",
|
||||
"secAlertSsl": "This connection is not secure. Please avoid entering sensitive information until TLS is activated for data protection.",
|
||||
"secAlertConf": "Certain settings are vulnerable to attacks. It is recommended to reinforce security protocols to prevent potential breaches.",
|
||||
"secAlertSSL": "Panel lacks secure connection. Please install TLS certificate for data protection.",
|
||||
"secAlertPanelPort": "Panel default port is vulnerable. Please configure a random or specific port.",
|
||||
"secAlertPanelURI": "Panel default URI path is insecure. Please configure a complex URI path.",
|
||||
"secAlertSubURI": "Subscription default URI path is insecure. Please configure a complex URI path.",
|
||||
"secAlertSubJsonURI": "Subscription JSON default URI path is insecure. Please configure a complex URI path.",
|
||||
"emptyDnsDesc": "No added DNS servers.",
|
||||
"emptyFakeDnsDesc": "No added Fake DNS servers.",
|
||||
"emptyBalancersDesc": "No added balancers.",
|
||||
"emptyReverseDesc": "No added reverse proxies.",
|
||||
"somethingWentWrong": "Something went wrong",
|
||||
"subscription": {
|
||||
"title": "Subscription info",
|
||||
@@ -106,8 +96,6 @@
|
||||
},
|
||||
"menu": {
|
||||
"theme": "Theme",
|
||||
"dark": "Dark",
|
||||
"ultraDark": "Ultra Dark",
|
||||
"dashboard": "Overview",
|
||||
"inbounds": "Inbounds",
|
||||
"clients": "Clients",
|
||||
@@ -119,7 +107,6 @@
|
||||
"routing": "Routing",
|
||||
"outbounds": "Outbounds",
|
||||
"apiDocs": "API Docs",
|
||||
"logout": "Log Out",
|
||||
"link": "Manage",
|
||||
"donate": "Donate",
|
||||
"docs": "Documentation",
|
||||
@@ -139,7 +126,6 @@
|
||||
}
|
||||
},
|
||||
"index": {
|
||||
"title": "Overview",
|
||||
"cpu": "CPU",
|
||||
"logicalProcessors": "Logical Processors",
|
||||
"frequency": "Frequency",
|
||||
@@ -152,7 +138,6 @@
|
||||
"restartXray": "Restart",
|
||||
"xraySwitch": "Version",
|
||||
"xrayUpdates": "Xray Updates",
|
||||
"xraySwitchClick": "Choose the version you want to switch to.",
|
||||
"xraySwitchClickDesk": "Choose carefully, as older versions may not be compatible with current configurations.",
|
||||
"updatePanel": "Update Panel",
|
||||
"panelUpdateDesc": "This will update 3X-UI itself to the latest release and restart the panel service.",
|
||||
@@ -164,12 +149,10 @@
|
||||
"currentCommit": "Current commit",
|
||||
"latestCommit": "Latest commit",
|
||||
"updateChannelChanged": "Update channel changed",
|
||||
"upToDate": "Up to date",
|
||||
"xrayStatusUnknown": "Unknown",
|
||||
"xrayStatusRunning": "Running",
|
||||
"xrayStatusStop": "Stopped",
|
||||
"xrayStatusError": "Error",
|
||||
"xrayErrorPopoverTitle": "An error occurred while running Xray",
|
||||
"operationHours": "Uptime",
|
||||
"systemHistoryTitle": "System History",
|
||||
"historyTitleCpu": "CPU Usage",
|
||||
@@ -211,9 +194,6 @@
|
||||
"xrayObservatoryDead": "Down",
|
||||
"xrayObservatoryLastSeen": "Last seen",
|
||||
"xrayObservatoryLastTry": "Last try",
|
||||
"trendLast2Min": "Last 2 minutes",
|
||||
"systemLoad": "System Load",
|
||||
"systemLoadDesc": "System load average for the past 1, 5, and 15 minutes",
|
||||
"connectionCount": "Connection Stats",
|
||||
"ipAddresses": "IP Addresses",
|
||||
"toggleIpVisibility": "Toggle visibility of the IP",
|
||||
@@ -223,13 +203,11 @@
|
||||
"totalData": "Total Data",
|
||||
"sent": "Sent",
|
||||
"received": "Received",
|
||||
"documentation": "Documentation",
|
||||
"xraySwitchVersionDialog": "Do you really want to change the Xray version?",
|
||||
"xraySwitchVersionDialogDesc": "This will change the Xray version to #version#.",
|
||||
"xraySwitchVersionPopover": "Xray updated successfully",
|
||||
"panelUpdateDialog": "Do you really want to update the panel?",
|
||||
"panelUpdateDialogDesc": "This will update 3X-UI to #version# and restart the panel service.",
|
||||
"panelUpdateCheckPopover": "Panel update check failed",
|
||||
"panelUpdateStartedPopover": "Panel update started",
|
||||
"panelUpdateFailedTitle": "Panel update failed",
|
||||
"panelUpdateFailedDesc": "The update did not finish successfully. Check the server logs, or run 'x-ui update' from the command line.",
|
||||
@@ -258,7 +236,6 @@
|
||||
"accessLogs": "Access Logs",
|
||||
"autoUpdate": "Auto Update",
|
||||
"config": "Config",
|
||||
"backup": "Backup",
|
||||
"backupTitle": "Backup & Restore",
|
||||
"exportDatabase": "Back Up",
|
||||
"exportDatabaseDesc": "Click to download a .db file containing a backup of your current database to your device. The same file can also be restored into a panel running on PostgreSQL.",
|
||||
@@ -276,7 +253,6 @@
|
||||
"migrationDownloadPgDesc": "Click to download a .db SQLite database built from your PostgreSQL data, ready to run this panel on SQLite."
|
||||
},
|
||||
"inbounds": {
|
||||
"title": "Inbounds",
|
||||
"totalDownUp": "Total Sent/Received",
|
||||
"totalUsage": "Total Usage",
|
||||
"inboundCount": "Total Inbounds",
|
||||
@@ -288,21 +264,11 @@
|
||||
"localPanel": "Local panel",
|
||||
"fallbacks": {
|
||||
"title": "Fallbacks",
|
||||
"help": "When a connection on this inbound does not match any client, route it elsewhere. Pick a child inbound below to auto-fill the routing fields (SNI / ALPN / path / xver) from its transport, or leave the picker empty and set Dest directly (e.g. 8080 or 127.0.0.1:8080) to route to an external server such as Nginx. Each child inbound should listen on 127.0.0.1 with security=none.",
|
||||
"empty": "No fallbacks yet",
|
||||
"add": "Add fallback",
|
||||
"pickInbound": "Pick an inbound",
|
||||
"matchAny": "any",
|
||||
"destPlaceholder": "auto (child listen:port)",
|
||||
"rederive": "Re-fill from child",
|
||||
"rederived": "Re-filled from child",
|
||||
"editAdvanced": "Edit routing fields",
|
||||
"hideAdvanced": "Hide advanced",
|
||||
"quickAddAll": "Quick add all eligible",
|
||||
"quickAdded": "Added {n} fallback(s)",
|
||||
"quickAddedNone": "No new eligible inbounds to add",
|
||||
"routesWhen": "Routes when",
|
||||
"defaultCatchAll": "Default — catches anything else",
|
||||
"needsTls": "Fallbacks become available once Security is set to TLS or Reality on the Security tab (VLESS/Trojan over RAW only)."
|
||||
},
|
||||
"protocol": "Protocol",
|
||||
@@ -310,8 +276,6 @@
|
||||
"portMap": "Port Mapping",
|
||||
"traffic": "Traffic",
|
||||
"speed": "Speed",
|
||||
"details": "Details",
|
||||
"transportConfig": "Transport",
|
||||
"expireDate": "Duration",
|
||||
"createdAt": "Created",
|
||||
"updatedAt": "Updated",
|
||||
@@ -319,8 +283,6 @@
|
||||
"addInbound": "Add Inbound",
|
||||
"generalActions": "General Actions",
|
||||
"modifyInbound": "Modify Inbound",
|
||||
"deleteInbound": "Delete Inbound",
|
||||
"deleteInboundContent": "Are you sure you want to delete this inbound?",
|
||||
"deleteConfirmTitle": "Delete inbound \"{remark}\"?",
|
||||
"deleteConfirmContent": "This removes the inbound and all its clients. This cannot be undone.",
|
||||
"resetConfirmTitle": "Reset traffic for \"{remark}\"?",
|
||||
@@ -364,8 +326,6 @@
|
||||
"exportAllLinksFileName": "All-Inbounds",
|
||||
"exportAllSubsFileName": "All-Inbounds-Subs",
|
||||
"inboundJsonTitle": "Inbound JSON",
|
||||
"deleteClient": "Delete Client",
|
||||
"deleteClientContent": "Are you sure you want to delete this client?",
|
||||
"resetTrafficContent": "Are you sure you want to reset traffic?",
|
||||
"copyLink": "Copy URL",
|
||||
"address": "Address",
|
||||
@@ -376,36 +336,19 @@
|
||||
"meansNoLimit": "= Unlimited. (unit: GB)",
|
||||
"totalFlow": "Total Flow",
|
||||
"leaveBlankToNeverExpire": "Leave blank to never expire",
|
||||
"noRecommendKeepDefault": "It is recommended to keep the default",
|
||||
"certificatePath": "File Path",
|
||||
"certificateContent": "File Content",
|
||||
"publicKey": "Public Key",
|
||||
"privatekey": "Private Key",
|
||||
"clickOnQRcode": "Click on QR Code to Copy",
|
||||
"client": "Client",
|
||||
"export": "Export All URLs",
|
||||
"clone": "Clone",
|
||||
"cloneInbound": "Clone",
|
||||
"cloneInboundContent": "All settings of this inbound, except Port, Listening IP, and Clients, will be applied to the clone.",
|
||||
"cloneInboundOk": "Clone",
|
||||
"resetAllTraffic": "Reset Traffic for All Inbounds",
|
||||
"resetAllTrafficTitle": "Reset Traffic for All Inbounds",
|
||||
"resetAllTrafficContent": "Are you sure you want to reset the traffic of all inbounds?",
|
||||
"resetInboundClientTraffics": "Reset Clients' Traffic",
|
||||
"resetInboundClientTrafficTitle": "Reset Clients' Traffic",
|
||||
"resetInboundClientTrafficContent": "Are you sure you want to reset the traffic of this inbound's clients?",
|
||||
"resetAllClientTraffics": "Reset All Clients' Traffic",
|
||||
"resetAllClientTrafficTitle": "Reset All Clients' Traffic",
|
||||
"resetAllClientTrafficContent": "Are you sure you want to reset the traffic of all clients?",
|
||||
"delDepletedClients": "Delete Depleted Clients",
|
||||
"delDepletedClientsTitle": "Delete Depleted Clients",
|
||||
"delDepletedClientsContent": "Are you sure you want to delete all the depleted clients?",
|
||||
"email": "Email",
|
||||
"emailDesc": "Please provide a unique email address.",
|
||||
"IPLimit": "IP Limit",
|
||||
"IPLimitDesc": "Disables inbound if the count exceeds the set value. (0 = disable)",
|
||||
"IPLimitlog": "IP Log",
|
||||
"IPLimitlogDesc": "The IP history log. (to re-enable the inbound after disabling, clear the log)",
|
||||
"IPLimitlogclear": "Clear the Log",
|
||||
"setDefaultCert": "Set Cert from Panel",
|
||||
"setDefaultCertEmpty": "No certificate is configured for the panel. Set one under Settings first.",
|
||||
@@ -438,21 +381,15 @@
|
||||
"sniffing": "Sniffing",
|
||||
"sniffingHelp": "Xray sniffing block wrapper:",
|
||||
"stream": "Stream",
|
||||
"streamHelp": "Xray stream block wrapper:",
|
||||
"jsonErrorPrefix": "Advanced JSON"
|
||||
"streamHelp": "Xray stream block wrapper:"
|
||||
},
|
||||
"telegramDesc": "Please provide Telegram Chat ID. (use '/id' command in the bot) or ({'@'}userinfobot)",
|
||||
"subscriptionDesc": "To find your subscription URL, navigate to the 'Details'. Additionally, you can use the same name for several clients.",
|
||||
"subSortIndex": "Sub order",
|
||||
"same": "Same",
|
||||
"inboundInfo": "Inbound Information",
|
||||
"exportInbound": "Export Inbound",
|
||||
"import": "Import",
|
||||
"importInbound": "Import an Inbound",
|
||||
"periodicTrafficResetTitle": "Traffic Reset",
|
||||
"periodicTrafficResetDesc": "Automatically reset traffic counter at specified intervals",
|
||||
"periodicTrafficResetDay": "Monthly reset day",
|
||||
"lastReset": "Last Reset",
|
||||
"periodicTrafficReset": {
|
||||
"never": "Never",
|
||||
"daily": "Daily",
|
||||
@@ -464,7 +401,6 @@
|
||||
"obtain": "Obtain",
|
||||
"updateSuccess": "The update was successful.",
|
||||
"logCleanSuccess": "The log has been cleared.",
|
||||
"inboundsUpdateSuccess": "Inbounds have been successfully updated.",
|
||||
"inboundUpdateSuccess": "Inbound has been successfully updated.",
|
||||
"inboundCreateSuccess": "Inbound has been successfully created.",
|
||||
"bulkDeleted": "{count} inbounds deleted",
|
||||
@@ -474,7 +410,6 @@
|
||||
"inboundClientDeleteSuccess": "Inbound client has been deleted.",
|
||||
"inboundClientUpdateSuccess": "Inbound client has been updated.",
|
||||
"savedNodeOfflineWillSync": "Saved locally. A backing node is offline or disabled — the change will sync once it reconnects.",
|
||||
"delDepletedClientsSuccess": "All depleted clients have been deleted.",
|
||||
"resetAllClientTrafficSuccess": "Traffic for all clients has been reset.",
|
||||
"resetAllTrafficSuccess": "All traffic has been reset.",
|
||||
"resetInboundClientTrafficSuccess": "Traffic has been reset.",
|
||||
@@ -717,23 +652,6 @@
|
||||
"peerNumber": "Peer {n}",
|
||||
"peerNumberConfig": "Peer {n} config"
|
||||
},
|
||||
"stream": {
|
||||
"general": {
|
||||
"request": "Request",
|
||||
"response": "Response",
|
||||
"name": "Name",
|
||||
"value": "Value"
|
||||
},
|
||||
"tcp": {
|
||||
"version": "Version",
|
||||
"method": "Method",
|
||||
"path": "Path",
|
||||
"status": "Status",
|
||||
"statusDescription": "Status Desc",
|
||||
"requestHeader": "Request Header",
|
||||
"responseHeader": "Response Header"
|
||||
}
|
||||
},
|
||||
"sniffingDestOverride": "Destination override"
|
||||
},
|
||||
"clients": {
|
||||
@@ -747,24 +665,9 @@
|
||||
"addExternalSubscription": "Add External Subscription",
|
||||
"noExternalLinks": "No external links yet.",
|
||||
"noExternalSubscriptions": "No external subscriptions yet.",
|
||||
"add": "Add Client",
|
||||
"edit": "Edit Client",
|
||||
"submitAdd": "Add Client",
|
||||
"submitEdit": "Save Changes",
|
||||
"clientCount": "Number of Clients",
|
||||
"bulk": "Add Bulk",
|
||||
"copyFromInbound": "Copy Clients from Inbound",
|
||||
"copyToInbound": "Copy clients to",
|
||||
"copySelected": "Copy Selected",
|
||||
"copySource": "Source",
|
||||
"copyEmailPreview": "Resulting email preview",
|
||||
"copySelectSourceFirst": "Please select a source inbound first.",
|
||||
"copyResult": "Copy result",
|
||||
"copyResultSuccess": "Copied successfully",
|
||||
"copyResultNone": "Nothing to copy: no clients selected or source is empty",
|
||||
"copyResultErrors": "Copy errors",
|
||||
"copyFlowLabel": "Flow for new clients (VLESS)",
|
||||
"copyFlowHint": "Applied to all copied clients. Leave empty to skip.",
|
||||
"selectAll": "Select all",
|
||||
"clearAll": "Clear all",
|
||||
"method": "Method",
|
||||
@@ -775,7 +678,6 @@
|
||||
"postfix": "Postfix",
|
||||
"delayedStart": "Start After First Use",
|
||||
"expireDays": "Duration (days)",
|
||||
"days": "Day(s)",
|
||||
"renew": "Auto Renew",
|
||||
"renewDesc": "Auto-renewal after expiration. (0 = disable)(unit: day)",
|
||||
"renewDays": "Auto Renew (days)",
|
||||
@@ -798,7 +700,6 @@
|
||||
"sortExpiringSoonest": "Expiring soonest",
|
||||
"has": "Has",
|
||||
"hasNot": "Doesn't have",
|
||||
"title": "Clients",
|
||||
"actions": "Actions",
|
||||
"totalGB": "Traffic Limit (GB)",
|
||||
"totalGBDesc": "Data quota for this client. 0 = unlimited.",
|
||||
@@ -826,8 +727,6 @@
|
||||
"addClient": "Add Client",
|
||||
"qrCode": "QR Code",
|
||||
"clientInfo": "Client Information",
|
||||
"delete": "Delete",
|
||||
"reset": "Reset Traffic",
|
||||
"editClient": "Edit Client",
|
||||
"client": "Client",
|
||||
"enabled": "Enabled",
|
||||
@@ -841,13 +740,11 @@
|
||||
"noLinks": "No shareable links — attach this client to a protocol-capable inbound first.",
|
||||
"link": "Link",
|
||||
"resetNotPossible": "Attach this client to an inbound first.",
|
||||
"general": "General",
|
||||
"resetAllTraffics": "Reset all client traffic",
|
||||
"resetAllTrafficsTitle": "Reset all client traffic?",
|
||||
"resetAllTrafficsContent": "Every client's up/down counter drops to zero. Quotas and expiry are not affected. This cannot be undone.",
|
||||
"deleteConfirmTitle": "Delete client {email}?",
|
||||
"deleteConfirmContent": "This removes the client from every attached inbound and drops its traffic record. This cannot be undone.",
|
||||
"deleteSelected": "Delete ({count})",
|
||||
"adjustSelected": "Adjust ({count})",
|
||||
"subLinksSelected": "Sub links ({count})",
|
||||
"addToGroupTitle": "Add {count} client(s) to a group",
|
||||
@@ -869,12 +766,10 @@
|
||||
"bulkDisableConfirmTitle": "Disable {count} clients?",
|
||||
"bulkDisableConfirmContent": "Disables each selected client on every attached inbound. They lose access immediately but their records and traffic are kept.",
|
||||
"selectedCount": "{count} selected",
|
||||
"attachSelected": "Attach ({count})",
|
||||
"attachToInboundsTitle": "Attach {count} client(s) to inbound(s)",
|
||||
"attachToInboundsDesc": "Attaches the selected {count} client(s) (same UUID/password and shared traffic) to the chosen inbound(s). They keep their existing attachments too.",
|
||||
"attachToInboundsTargets": "Target inbounds",
|
||||
"attachToInboundsNoTargets": "No multi-user inbounds available to attach to.",
|
||||
"detachSelected": "Detach ({count})",
|
||||
"detach": "Detach",
|
||||
"detachFromInboundsTitle": "Detach {count} client(s) from inbound(s)",
|
||||
"detachFromInboundsDesc": "Removes the selected {count} client(s) from the chosen inbound(s). Pairs where the client wasn't attached are silently skipped. Client records are kept (use Delete to remove fully).",
|
||||
@@ -928,8 +823,6 @@
|
||||
"reverseTagPlaceholder": "Optional reverse tag",
|
||||
"telegramId": "Telegram user ID",
|
||||
"telegramIdPlaceholder": "Numeric Telegram user ID (0 = none)",
|
||||
"created": "Created",
|
||||
"updated": "Updated",
|
||||
"ipLimit": "IP limit",
|
||||
"toasts": {
|
||||
"deleted": "Client deleted",
|
||||
@@ -952,7 +845,6 @@
|
||||
}
|
||||
},
|
||||
"groups": {
|
||||
"title": "Groups",
|
||||
"name": "Name",
|
||||
"clientCount": "Clients",
|
||||
"totalGroups": "Total groups",
|
||||
@@ -1111,7 +1003,6 @@
|
||||
}
|
||||
},
|
||||
"nodes": {
|
||||
"title": "Nodes",
|
||||
"addNode": "Add Node",
|
||||
"editNode": "Edit Node",
|
||||
"totalNodes": "Total Nodes",
|
||||
@@ -1130,8 +1021,6 @@
|
||||
"apiTokenPlaceholder": "Token from the remote panel's Settings page",
|
||||
"apiTokenHint": "The remote panel exposes its API token under Authentication → API Token.",
|
||||
"apiTokenKeepHint": "Leave blank to keep the current token",
|
||||
"regenerate": "Regenerate Token",
|
||||
"regenerateConfirm": "Regenerating invalidates the current token. Any central panel using it will lose access until updated. Continue?",
|
||||
"allowPrivateAddress": "Allow private address",
|
||||
"allowPrivateAddressHint": "Enable only for nodes on a private network or VPN.",
|
||||
"outboundTag": "Connection outbound",
|
||||
@@ -1163,7 +1052,6 @@
|
||||
"updatePanel": "Update Panel",
|
||||
"updateSelected": "Update Selected ({count})",
|
||||
"updateAvailable": "Update available",
|
||||
"upToDate": "Up to date",
|
||||
"updateConfirmTitle": "Update {count} node(s) to the latest version?",
|
||||
"updateConfirmContent": "Each selected node downloads the latest release and restarts onto it. Only enabled, online nodes are updated.",
|
||||
"updateDevChannel": "Update to Dev channel (latest commit)",
|
||||
@@ -1564,13 +1452,8 @@
|
||||
"secretClearUndo": "Undo clear"
|
||||
},
|
||||
"xray": {
|
||||
"title": "Xray Configs",
|
||||
"save": "Save",
|
||||
"restart": "Restart Xray",
|
||||
"restartSuccess": "Xray has been successfully relaunched.",
|
||||
"restartOutputTitle": "Xray restart output",
|
||||
"restartConfirmTitle": "Restart xray?",
|
||||
"restartConfirmContent": "Reloads the xray service with the saved configuration.",
|
||||
"stopSuccess": "Xray has been successfully stopped.",
|
||||
"restartError": "There was an error when rebooting the Xray.",
|
||||
"stopError": "There was an error when stopping the Xray.",
|
||||
@@ -1580,7 +1463,6 @@
|
||||
"generalConfigsDesc": "These options will determine general adjustments.",
|
||||
"logConfigs": "Log",
|
||||
"logConfigsDesc": "Logs may affect your server's efficiency. It is recommended to enable them wisely only when needed.",
|
||||
"blockConfigsDesc": "These options will block traffic based on specific requested protocols and websites.",
|
||||
"basicRouting": "Basic Routing",
|
||||
"blockConnectionsConfigsDesc": "These options will block traffic based on the specific requested country.",
|
||||
"directConnectionsConfigsDesc": "A direct connection ensures that specific traffic is not routed through another server.",
|
||||
@@ -1590,10 +1472,6 @@
|
||||
"directdomains": "Direct Domains",
|
||||
"ipv4Routing": "IPv4 Routing",
|
||||
"ipv4RoutingDesc": "These options will route traffic based on a specific destination via IPv4.",
|
||||
"warpRouting": "WARP Routing",
|
||||
"warpRoutingDesc": "These options will route traffic based on a specific destination via WARP.",
|
||||
"nordRouting": "NordVPN Routing",
|
||||
"nordRoutingDesc": "These options will route traffic based on a specific destination via NordVPN.",
|
||||
"Template": "Advanced Xray Configuration Template",
|
||||
"TemplateDesc": "The final Xray config file will be generated based on this template.",
|
||||
"FreedomStrategy": "Freedom Protocol Strategy",
|
||||
@@ -1607,10 +1485,7 @@
|
||||
"outboundTestUrlDesc": "URL used when testing outbound connectivity.",
|
||||
"Torrent": "Block BitTorrent Protocol",
|
||||
"Inbounds": "Inbounds",
|
||||
"InboundsDesc": "Accepting the specific clients.",
|
||||
"Outbounds": "Outbounds",
|
||||
"OutboundSubscriptions": "Outbound Subscriptions",
|
||||
"OutboundSubscriptionsDesc": "Import outbounds from remote subscription URLs (vmess/vless/trojan/ss/...). Tags are kept stable for use in balancers and routing rules. Updates are automatic.",
|
||||
"Balancers": "Balancers",
|
||||
"balancerTagRequired": "Tag is required",
|
||||
"balancerSelectorRequired": "Pick at least one outbound",
|
||||
@@ -1629,9 +1504,7 @@
|
||||
"routeTesterMatchedOutbound": "Matched outbound",
|
||||
"routeTesterViaBalancer": "via balancer",
|
||||
"routeTesterDefaultOutbound": "No routing rule matched — traffic goes to the default (first) outbound.",
|
||||
"OutboundsDesc": "Set the outgoing traffic pathway.",
|
||||
"Routings": "Routing Rules",
|
||||
"RoutingsDesc": "The priority of each rule is important!",
|
||||
"importRules": "Import Rules",
|
||||
"exportRules": "Export Rules",
|
||||
"importOutbounds": "Import Outbounds",
|
||||
@@ -1650,13 +1523,9 @@
|
||||
"maskAddressDesc": "IP address mask, when enabled, will automatically replace the IP address that appears in the log.",
|
||||
"statistics": "Statistics",
|
||||
"statsInboundUplink": "Inbound Upload Statistics",
|
||||
"statsInboundUplinkDesc": "Enables the statistics collection for upstream traffic of all inbound proxies.",
|
||||
"statsInboundDownlink": "Inbound Download Statistics",
|
||||
"statsInboundDownlinkDesc": "Enables the statistics collection for downstream traffic of all inbound proxies.",
|
||||
"statsOutboundUplink": "Outbound Upload Statistics",
|
||||
"statsOutboundUplinkDesc": "Enables the statistics collection for upstream traffic of all outbound proxies.",
|
||||
"statsOutboundDownlink": "Outbound Download Statistics",
|
||||
"statsOutboundDownlinkDesc": "Enables the statistics collection for downstream traffic of all outbound proxies.",
|
||||
"metricsListen": "Metrics Endpoint",
|
||||
"metricsListenDesc": "Expose Xray's Prometheus-style metrics on this address:port (e.g. 127.0.0.1:11111). Leave empty to disable. Bind to localhost and reverse-proxy it — it is unauthenticated.",
|
||||
"metricsTag": "Metrics Tag",
|
||||
@@ -1669,18 +1538,10 @@
|
||||
"bufferSizePlaceholder": "auto",
|
||||
"seconds": "seconds",
|
||||
"rules": {
|
||||
"first": "First",
|
||||
"last": "Last",
|
||||
"up": "Up",
|
||||
"down": "Down",
|
||||
"source": "Source",
|
||||
"dest": "Destination",
|
||||
"inbound": "Inbound",
|
||||
"outbound": "Outbound",
|
||||
"balancer": "Balancer",
|
||||
"info": "Info",
|
||||
"add": "Add Rule",
|
||||
"edit": "Edit Rule",
|
||||
"useComma": "Comma-separated list"
|
||||
},
|
||||
"routing": {
|
||||
@@ -1721,7 +1582,6 @@
|
||||
"ruleN": "Rule {n}",
|
||||
"action": "Action",
|
||||
"redirect": "Redirect",
|
||||
"fragment": "Fragment",
|
||||
"finalRules": "Final Rules",
|
||||
"overrideXrayPrivateIp": "Override Xray's default private-IP block",
|
||||
"blockDelay": "Block delay (ms)",
|
||||
@@ -1747,43 +1607,17 @@
|
||||
"keepAliveInterval": "Keep alive interval",
|
||||
"markFwmark": "Mark (fwmark)",
|
||||
"interface": "Interface",
|
||||
"ipv6Only": "IPv6 only",
|
||||
"acceptProxyProtocol": "Accept proxy protocol",
|
||||
"proxyProtocol": "Proxy protocol",
|
||||
"tcpUserTimeoutMs": "TCP user timeout (ms)",
|
||||
"tcpKeepAliveIdleS": "TCP keep-alive idle (s)"
|
||||
},
|
||||
"outbound": {
|
||||
"addOutbound": "Add Outbound",
|
||||
"addReverse": "Add Reverse",
|
||||
"editOutbound": "Edit Outbound",
|
||||
"editReverse": "Edit Reverse",
|
||||
"reverseTag": "Reverse Tag",
|
||||
"reverseTagDesc": "VLESS simple reverse proxy tag. Leave empty to disable.",
|
||||
"reverseTagPlaceholder": "reverse tag (leave empty to disable)",
|
||||
"tag": "Tag",
|
||||
"tagDesc": "Unique Tag",
|
||||
"address": "Address",
|
||||
"egress": "Egress",
|
||||
"egressHint": "Run an HTTP test to show egress IP and country.",
|
||||
"reverse": "Reverse",
|
||||
"domain": "Domain",
|
||||
"type": "Type",
|
||||
"bridge": "Bridge",
|
||||
"portal": "Portal",
|
||||
"link": "Link",
|
||||
"intercon": "Interconnection",
|
||||
"settings": "Settings",
|
||||
"accountInfo": "Account Information",
|
||||
"outboundStatus": "Outbound Status",
|
||||
"sendThrough": "Send Through",
|
||||
"targetStrategy": "Target Strategy",
|
||||
"test": "Test",
|
||||
"testResult": "Test Result",
|
||||
"testing": "Testing connection...",
|
||||
"testSuccess": "Test successful",
|
||||
"testFailed": "Test failed",
|
||||
"testError": "Failed to test outbound",
|
||||
"modeRealDelay": "Real delay",
|
||||
"testModeTooltip": "TCP: fast dial-only probe. HTTP: full request through xray. Real delay: total time including connection setup.",
|
||||
"testAll": "Test all",
|
||||
@@ -1791,14 +1625,10 @@
|
||||
"breakdownConnect": "Proxy connect",
|
||||
"breakdownTls": "TLS via outbound",
|
||||
"breakdownTtfb": "First byte",
|
||||
"nordvpn": "NordVPN",
|
||||
"accessToken": "Access Token",
|
||||
"country": "Country",
|
||||
"server": "Server",
|
||||
"city": "City",
|
||||
"allCities": "All Cities",
|
||||
"privateKey": "Private Key",
|
||||
"load": "Load",
|
||||
"moveToTop": "Move to top"
|
||||
},
|
||||
"outboundSub": {
|
||||
@@ -1828,16 +1658,11 @@
|
||||
"active": "Active subscriptions",
|
||||
"empty": "No subscriptions yet. Add one above.",
|
||||
"colRemark": "Remark",
|
||||
"colPrefix": "Prefix",
|
||||
"colInterval": "Interval",
|
||||
"colLastFetch": "Last fetch",
|
||||
"colEnabled": "Enabled",
|
||||
"auto": "auto",
|
||||
"never": "never",
|
||||
"yes": "Yes",
|
||||
"no": "No",
|
||||
"refreshNow": "Refresh now",
|
||||
"lastError": "Last error",
|
||||
"deleteConfirm": "Delete this subscription?",
|
||||
"restartHint": "After adding or refreshing, restart Xray (or wait for the next auto-reload) to make the outbounds active.",
|
||||
"fromSubsTitle": "From outbound subscriptions (read-only)",
|
||||
@@ -1854,8 +1679,6 @@
|
||||
"tabBalancerSettings": "Balancer Settings",
|
||||
"tabObservatory": "Observatory",
|
||||
"observatory": {
|
||||
"title": "Observatory",
|
||||
"burstTitle": "Burst Observatory",
|
||||
"autoManaged": "Observers are managed automatically from your balancers. Tune how they probe below — the watched outbounds follow your balancer selectors.",
|
||||
"emptyHint": "No connection observer is active. One is added automatically when you create a Least Ping or Least Load balancer — or a Random / Round-robin balancer with a fallback — so observer-backed balancers can check outbound health before choosing a target.",
|
||||
"mixedLegacy": "This config contains both Observatory and Burst Observatory. Xray uses one global observer, so this mixed legacy state is not supported; saving balancers will normalize it to one observer.",
|
||||
@@ -1889,12 +1712,8 @@
|
||||
"balancerRemoved": "Balancer {tag} — removed (no targets left)"
|
||||
},
|
||||
"balancer": {
|
||||
"addBalancer": "Add Balancer",
|
||||
"editBalancer": "Edit Balancer",
|
||||
"balancerStrategy": "Strategy",
|
||||
"balancerSelectors": "Selectors",
|
||||
"tag": "Tag",
|
||||
"tagDesc": "Unique Tag",
|
||||
"tagDuplicate": "Tag already used by another balancer",
|
||||
"tagPlaceholder": "unique balancer tag",
|
||||
"selector": "Selector",
|
||||
@@ -1911,7 +1730,6 @@
|
||||
"tolerance": "Tolerance",
|
||||
"baselines": "Baselines",
|
||||
"costs": "Costs",
|
||||
"balancerDesc": "It is not possible to use balancerTag and outboundTag at the same time. If used at the same time, only outboundTag will work.",
|
||||
"costMatch": "Tag pattern",
|
||||
"costValue": "Weight",
|
||||
"costRegexp": "Regular expression match"
|
||||
@@ -1921,14 +1739,10 @@
|
||||
"publicKey": "Public Key",
|
||||
"allowedIPs": "Allowed IPs",
|
||||
"endpoint": "Endpoint",
|
||||
"psk": "PreShared Key",
|
||||
"domainStrategy": "Domain Strategy"
|
||||
},
|
||||
"tun": {
|
||||
"nameDesc": "The name of the TUN interface. Default is 'xray0'",
|
||||
"mtuDesc": "Maximum Transmission Unit. The maximum size of data packets. Default is 1500",
|
||||
"userLevel": "User Level",
|
||||
"userLevelDesc": "All connections made through this inbound will use this user level. Default is 0"
|
||||
"userLevel": "User Level"
|
||||
},
|
||||
"nord": {
|
||||
"accessToken": "Access token",
|
||||
@@ -2013,7 +1827,6 @@
|
||||
},
|
||||
"fakedns": {
|
||||
"add": "Add Fake DNS",
|
||||
"edit": "Edit Fake DNS",
|
||||
"ipPool": "IP Pool Subnet",
|
||||
"poolSize": "Pool Size"
|
||||
},
|
||||
@@ -2032,7 +1845,6 @@
|
||||
"add": "Add",
|
||||
"month": "Month",
|
||||
"months": "Months",
|
||||
"day": "Day",
|
||||
"days": "Days",
|
||||
"hours": "Hours",
|
||||
"minutes": "Minutes",
|
||||
@@ -2071,7 +1883,6 @@
|
||||
"userSaved": "✅ Telegram User saved.",
|
||||
"loginSuccess": "✅ Logged in to the panel successfully.\r\n",
|
||||
"loginFailed": "❗️Login attempt to the panel failed.\r\n",
|
||||
"2faFailed": "2FA Failed",
|
||||
"report": "🕰 Scheduled Reports: {{ .RunTime }}\r\n",
|
||||
"datetime": "⏰ Date&Time: {{ .DateTime }}\r\n",
|
||||
"hostname": "💻 Host: {{ .Hostname }}\r\n",
|
||||
@@ -2104,7 +1915,6 @@
|
||||
"download": "🔽 Download: ↓{{ .Download }}\r\n",
|
||||
"total": "📊 Total: ↑↓{{ .UpDown }} / {{ .Total }}\r\n",
|
||||
"TGUser": "👤 Telegram User: {{ .TelegramID }}\r\n",
|
||||
"exhaustedMsg": "🚨 Exhausted {{ .Type }}:\r\n",
|
||||
"exhaustedCount": "🚨 Exhausted {{ .Type }} count:\r\n",
|
||||
"onlinesCount": "🌐 Online Clients: {{ .Count }}\r\n",
|
||||
"disabled": "🛑 Disabled: {{ .Disabled }}\r\n",
|
||||
@@ -2113,16 +1923,10 @@
|
||||
"refreshedOn": "\r\n📋🔄 Refreshed On: {{ .Time }}\r\n\r\n",
|
||||
"yes": "✅ Yes",
|
||||
"no": "❌ No",
|
||||
"received_id": "🔑📥 ID updated.",
|
||||
"received_password": "🔑📥 Password updated.",
|
||||
"received_email": "📧📥 Email updated.",
|
||||
"received_comment": "💬📥 Comment updated.",
|
||||
"id_prompt": "🔑 Default ID: {{ .ClientId }}\n\nEnter your ID.",
|
||||
"pass_prompt": "🔑 Default Password: {{ .ClientPassword }}\n\nEnter your password.",
|
||||
"email_prompt": "📧 Default Email: {{ .ClientEmail }}\n\nEnter your email.",
|
||||
"comment_prompt": "💬 Default Comment: {{ .ClientComment }}\n\nEnter your comment.",
|
||||
"inbound_client_data_id": "🔄 Inbound: {{ .InboundRemark }}\n\n🔑 ID: {{ .ClientId }}\n📧 Email: {{ .ClientEmail }}\n📊 Traffic: {{ .ClientTraffic }}\n📅 Expire Date: {{ .ClientExp }}\n🌐 IP Limit: {{ .IpLimit }}\n💬 Comment: {{ .ClientComment }}\n\nYou can add the client to inbound now!",
|
||||
"inbound_client_data_pass": "🔄 Inbound: {{ .InboundRemark }}\n\n🔑 Password: {{ .ClientPass }}\n📧 Email: {{ .ClientEmail }}\n📊 Traffic: {{ .ClientTraffic }}\n📅 Expire Date: {{ .ClientExp }}\n🌐 IP Limit: {{ .IpLimit }}\n💬 Comment: {{ .ClientComment }}\n\nYou can add the client to inbound now!",
|
||||
"cancel": "❌ Process Canceled! \n\nYou can /start again anytime. 🔄",
|
||||
"error_add_client": "⚠️ Error:\n\n {{ .error }}",
|
||||
"using_default_value": "Okay, I'll stick with the default value. 😊",
|
||||
@@ -2139,8 +1943,6 @@
|
||||
"eventXrayCrashError": "Error: {{ .Error }}",
|
||||
"eventNodeDown": "Node {{ .Name }} is DOWN",
|
||||
"eventNodeUp": "Node {{ .Name }} is UP",
|
||||
"eventCPUHigh": "CPU high",
|
||||
"eventCPUHighDetail": "CPU: {{ .Detail }}",
|
||||
"eventLoginFallback": "Login failed from {{ .Source }}",
|
||||
"memoryThreshold": "Memory Load {{ .Percent }}% exceeds the threshold of {{ .Threshold }}%"
|
||||
},
|
||||
@@ -2181,11 +1983,8 @@
|
||||
"submitDisable": "Submit As Disable ☑️",
|
||||
"submitEnable": "Submit As Enable ✅",
|
||||
"use_default": "🏷️ Use default",
|
||||
"change_id": "⚙️🔑 ID",
|
||||
"change_password": "⚙️🔑 Password",
|
||||
"change_email": "⚙️📧 Email",
|
||||
"change_comment": "⚙️💬 Comment",
|
||||
"change_flow": "⚙️🚦 Flow",
|
||||
"ResetAllTraffics": "Reset All Traffic",
|
||||
"SortedTrafficUsageReport": "Sorted Traffic Usage Report"
|
||||
},
|
||||
@@ -2214,31 +2013,16 @@
|
||||
}
|
||||
},
|
||||
"email": {
|
||||
"subjectOutboundDown": "Outbound {{ .Tag }} is DOWN",
|
||||
"subjectOutboundUp": "Outbound {{ .Tag }} is UP",
|
||||
"subjectXrayCrash": "Xray CRASHED",
|
||||
"subjectCPUHigh": "CPU high",
|
||||
"subjectLoginSuccess": "Login successful",
|
||||
"subjectLoginFailed": "Login failed",
|
||||
"titleOutboundDown": "Outbound DOWN",
|
||||
"titleOutboundUp": "Outbound UP",
|
||||
"titleXrayCrash": "Xray CRASHED",
|
||||
"titleCPUHigh": "CPU high",
|
||||
"titleLoginSuccess": "Login successful",
|
||||
"titleLoginFailed": "Login failed",
|
||||
"labelStatus": "Status",
|
||||
"labelOutbound": "Outbound",
|
||||
"labelNode": "Node",
|
||||
"labelError": "Error",
|
||||
"labelDelay": "Delay",
|
||||
"labelDetail": "Detail",
|
||||
"labelUsername": "Username",
|
||||
"labelIP": "IP",
|
||||
"labelReason": "Reason",
|
||||
"labelSource": "Source",
|
||||
"labelTime": "Time",
|
||||
"statusCrashed": "CRASHED",
|
||||
"statusRunning": "Running",
|
||||
"statusHigh": "HIGH",
|
||||
"statusSuccess": "SUCCESS",
|
||||
"statusFailed": "FAILED",
|
||||
|
||||
Reference in New Issue
Block a user