feat: 全协议一键安装 + 国内GitHub镜像加速 + 中英文i18n国际化

后端:
- binmgr.go: 新增 detectChina() 国内/海外自动判断(ipinfo.io)
- binmgr.go: 国内自动走 gh-proxy.com 镜像加速 GitHub 下载
- binmgr.go: 新增 InstallViaPackageManager() 包管理器一键安装
- binmgr.go: 新增 GetDeploySpec()/ProtocolAlias() 导出函数
- api.go: installBinary 支持全部7个协议(FRP/WireGuard/OpenVPN/IPSec/IKEv2/L2TP/StrongSwan)
- api.go: 策略: GitHub下载失败 → 自动降级包管理器安装

前端:
- 安装 vue-i18n@9, 支持中英文切换
- 新增 locales/zh-CN.json + en-US.json (548个翻译key, 17个模块)
- 新增 i18n.js 配置, localStorage 持久化语言偏好
- Layout.vue 右上角语言切换下拉菜单
- 所有17个Vue文件中文文本转为 $t() 调用
- Element Plus 组件语言跟随切换
- TunnelWizard: 所有协议显示「一键安装」按钮(带loading)
- 前端构建零错误
This commit is contained in:
opsx-tools committed 2026-07-23 03:01:46 +08:00
1 parent 1e2f8ef24f
commit 021d012478
25 files changed
+2313 -746

No files matched your search

+584
View File
@@ -0,0 +1,584 @@
{
"common": {
"appName": "VPN Management Platform",
"confirm": "Confirm",
"cancel": "Cancel",
"save": "Save",
"delete": "Delete",
"edit": "Edit",
"add": "Add",
"create": "Create",
"close": "Close",
"search": "Search",
"refresh": "Refresh",
"back": "Back",
"submit": "Submit",
"yes": "Yes",
"no": "No",
"enabled": "Enabled",
"disabled": "Disabled",
"loading": "Loading",
"operation": "Actions",
"status": "Status",
"name": "Name",
"description": "Description",
"username": "Username",
"password": "Password",
"email": "Email",
"source": "Source",
"local": "Local",
"ldap": "LDAP",
"remark": "Remark",
"protocol": "Protocol",
"node": "Node",
"time": "Time",
"target": "Target",
"action": "Action",
"traffic": "Traffic ↓ / ↑",
"ipAddress": "IP Address",
"detail": "Detail",
"copy": "Copy",
"copied": "Copied",
"download": "Download",
"permanent": "Permanent",
"saveSuccess": "Saved",
"saveFailed": "Save failed",
"deleteSuccess": "Deleted",
"deleteFailed": "Delete failed",
"loadFailed": "Failed to load",
"operationFailed": "Operation failed",
"deleteConfirm": "Confirm Delete",
"noData": "No data",
"never": "Never",
"copiedToClipboard": "Copied to clipboard",
"logout": "Logout"
},
"login": {
"title": "VPN Management Platform",
"subtitle": "Unified multi-protocol VPN management — simple, secure, and controllable",
"protocols": "WireGuard · IPSec · L2TP · FRP · OpenVPN · Custom Protocol Plugins",
"feature1Title": "Multi-Protocol Unified Management",
"feature1Desc": "WireGuard / IPSec / L2TP / FRP / OpenVPN",
"feature2Title": "Enterprise-Grade Security",
"feature2Desc": "AES-GCM encrypted keys + Two-Factor Authentication",
"feature3Title": "One-Click Configuration",
"feature3Desc": "Wizard-driven generation, instant client config download",
"feature4Title": "Lightweight & Zero Dependencies",
"feature4Desc": "Single binary delivery, no Docker required",
"welcome": "Welcome Back",
"welcomeHint": "Please enter your credentials to sign in",
"usernameLabel": "Username",
"usernamePlaceholder": "Enter username",
"passwordLabel": "Password",
"passwordPlaceholder": "Enter password",
"loginButton": "Sign In",
"defaultAccount": "Default account: <strong>admin / admin123</strong> — please change password after first login",
"errorEmpty": "Please enter username and password",
"loginSuccess": "Login successful",
"changePasswordFirst": "Please change your password first",
"loginFailed": "Login failed. Please check your network or contact the administrator."
},
"dashboard": {
"welcomeTitle": "Welcome to VPN Management Platform",
"welcomeDesc": "No tunnels yet — create your first one in 3 steps: Choose protocol → Fill parameters → Auto-generate config",
"createNow": "Create Tunnel Now",
"totalTunnels": "Total Tunnels",
"running": "Running",
"onlineUsers": "Online Users",
"totalTraffic": "Total Traffic ↓↑",
"protocolDistribution": "Protocol Distribution",
"protocolEngineStatus": "Protocol Engine Status",
"depCheckResult": "System dependency check results",
"depReady": "Ready",
"demoMode": "Demo Mode",
"deploy": "Deploy",
"installCmd": "Install Command",
"expiringTunnels": "Tunnels Expiring Soon (within 7 days)",
"expiryTime": "Expiry Time",
"noTunnels": "No tunnels yet",
"deploySuccess": "{name} {version} deployed successfully",
"deployFailed": "Failed to deploy {name}",
"contactAdmin": "Please contact the system administrator to install",
"recommendedCmd": "Recommended Command",
"otherDistros": "Other Distros",
"copyRecommended": "Copy Recommended",
"getInstallCmdFailed": "Failed to get install command"
},
"tunnels": {
"searchPlaceholder": "Search by name",
"allProtocols": "All Protocols",
"allStates": "All States",
"stateRunning": "Running",
"stateStopped": "Stopped",
"stateError": "Error",
"stateUndeployed": "Undeployed",
"createTunnel": "Create Tunnel",
"createFirst": "Create First Tunnel",
"noTunnels": "No tunnels yet",
"expireTime": "Expiry Time",
"localNode": "Local",
"start": "Start",
"stop": "Stop",
"started": "Started",
"startFailed": "Start failed",
"stopped": "Stopped",
"more": "More",
"viewLogs": "View Logs",
"downloadConfig": "Download Config",
"showQrCode": "Show QR Code",
"ipsecTest": "IPSec Test",
"delete": "Delete",
"detail": "Detail",
"protocol": "Protocol",
"createTime": "Created",
"autoStart": "Auto Start",
"runningParams": "Runtime Parameters",
"clientConfig": "Client Configuration",
"noClientConfig": "No client config available for this protocol",
"downloadClientConfig": "Download Client Config",
"ipsecParamCheck": "IPSec Parameter Check & Connectivity Test",
"trafficPolicy": "Traffic Policy",
"quotaGB": "Quota (GB)",
"quotaUnlimited": "0 = Unlimited. Used: {used}",
"rateLimitMbps": "Rate Limit (Mbps)",
"rateUnlimited": "0 = Unlimited",
"exceedAction": "Exceed Action",
"actionWarn": "Warn Only",
"actionBlock": "Auto Stop",
"actionThrottle": "Throttle to 1Mbps",
"resetCycle": "Reset Cycle",
"resetNone": "Never",
"resetDaily": "Daily",
"resetMonthly": "Monthly",
"savePolicy": "Save Policy",
"policySaved": "Traffic policy saved",
"peerList": "Peer List",
"addPeer": "Add Peer",
"peerId": "Peer ID",
"address": "Address",
"peerOnline": "Online",
"peerOffline": "Offline",
"config": "Config",
"qrCode": "QR Code",
"scanQrTitle": "Scan to Import WireGuard Client",
"scanQrHint": "Use WireGuard App's \"Add from QR code\"",
"addPeerTitle": "Add WireGuard Peer",
"autoGenId": "Leave empty for auto-generated client-N",
"peerNamePlaceholder": "Phone / Laptop",
"clientAddress": "Client Address",
"defaultAllowedIPs": "Leave empty for tunnel default",
"externalPublicKey": "External Public Key",
"externalKeyHint": "Leave empty for platform-managed key; fill in for external device",
"logTitle": "Instance Log — {name}",
"liveOutput": "● Live output",
"logStopped": "Stopped",
"pause": "Pause",
"resume": "Resume",
"clearScreen": "Clear",
"waitingLog": "Waiting for log output...",
"fillClientAddress": "Please enter client address",
"peerAdded": "Peer added",
"addFailed": "Add failed",
"deletePeerConfirm": "Delete peer \"{id}\"?",
"downloadFailed": "Download failed",
"qrFailed": "Failed to generate QR code",
"noClientConfigWarn": "No client config available",
"deleteTunnelConfirm": "Delete tunnel \"{name}\"? Configuration and keys will be permanently removed.",
"peerAlreadyAdded": "Peer already added"
},
"tunnelEditor": {
"title": "Edit Tunnel",
"backToList": "Back to List",
"sensitiveFieldHint": "Sensitive fields like passwords, PSK, and tokens are not displayed. Leave empty to keep the current value.",
"tunnelName": "Tunnel Name",
"protocolType": "Protocol Type",
"keepOriginal": "Leave empty to keep original",
"expireTime": "Expiry Time",
"expirePlaceholder": "Leave empty for permanent",
"autoStart": "Auto Start",
"saveConfig": "Save Configuration",
"loadFailed": "Failed to load tunnel",
"fillName": "Please enter tunnel name",
"configSaved": "Configuration saved"
},
"tunnelWizard": {
"step1": "Select Protocol",
"step2": "Fill Parameters",
"step3": "Generate Config",
"recommend": "Recommended",
"depReady": "✓ Dependencies Ready",
"notDeployed": "Not Deployed",
"oneClickInstall": "One-Click Install",
"installCmd": "Install Command",
"customPlugin": "Custom Protocol Plugin",
"customScene": "Custom Integration",
"tunnelName": "Tunnel Name",
"namePlaceholder": "e.g., HQ-Branch Interconnect",
"protocolType": "Protocol Type",
"reselect": "Reselect",
"advancedOptions": "Advanced Options",
"expireTime": "Expiry Time",
"expirePlaceholder": "Leave empty for permanent",
"autoStartAfterCreate": "Auto-start after creation",
"previousStep": "Previous",
"generateConfig": "Generate Config",
"createSuccess": "Tunnel Created Successfully",
"configGenerated": "\"{name}\" configuration has been generated",
"clientConfig": "Client Configuration",
"downloadConfigFile": "Download Config File",
"showQrCode": "Show QR Code",
"goIpsecPeer": "Go to IPSec Peer Page",
"backToList": "Back to List",
"installCmdTitle": "{name} Install Command",
"pkgManagerDetected": "System package manager detected: {pm}. Recommended command below.",
"noPkgManager": "No system package manager detected. Install commands for various platforms below.",
"aptDefault": "apt (default)",
"recommended": "Recommended",
"copyThisCmd": "Copy This Command",
"otherDistros": "Other Distros",
"fillName": "Please enter tunnel name",
"fillRequired": "Please fill in required field: {label}",
"createFailed": "Creation failed",
"installSuccess": "{protocol} {version} installed successfully {method}",
"methodPackageManager": "(Package Manager)",
"methodDownload": "(One-Click Install)",
"installFailed": "Failed to install {protocol}"
},
"users": {
"title": "User Management",
"batchImport": "Batch Import",
"ldapImport": "LDAP Import",
"addUser": "Add User",
"role": "Role",
"roleAdmin": "Admin",
"roleOperator": "Operator",
"roleViewer": "Viewer",
"noUsers": "No users yet",
"ldapTitle": "LDAP Identity Source",
"ldapHint": "LDAP users can be auto-synced on first login, or pre-imported using the \"LDAP Import\" on the left.",
"ldapUrl": "LDAP URL",
"bindDn": "Bind DN",
"bindPassword": "Bind Password",
"keepOriginal": "Leave empty to keep original",
"baseDn": "Base DN",
"userFilter": "User Filter",
"usernameAttr": "Username Attribute",
"testConnection": "Test Connection",
"editUser": "Edit User",
"loginUsername": "Login username",
"keepUnchanged": "Leave empty to keep unchanged",
"min8Chars": "At least 8 characters",
"batchImportTitle": "Batch Import Users",
"batchHint": "One user per line: username,password or just username (auto-generates password). Password must be at least 8 characters.",
"batchPlaceholder": "One per line: username,password (e.g., user1,Pass1234); or username only for auto-generated password",
"defaultRole": "Default Role",
"startImport": "Start Import",
"ldapImportTitle": "Import Users from LDAP",
"ldapNotEnabled": "LDAP is not enabled. Please configure and test the connection on the right.",
"refreshUserList": "Refresh User List",
"userCount": "{count} users total, {selected} selected",
"fullName": "Name",
"imported": "Imported",
"pendingImport": "Pending",
"clickRefreshHint": "Click refresh above to load LDAP users",
"ldapDisabled": "LDAP is not enabled",
"importSelected": "Import Selected ({count})",
"updated": "Updated",
"fillUsername": "Please enter username",
"passwordMin8": "Password must be at least 8 characters",
"userCreated": "User created",
"deleteUserConfirm": "Delete user \"{username}\"?",
"enterAtLeastOne": "Please enter at least one line of user data",
"importResult": "Success: {success}, Skipped: {skipped}, Failed: {failed}",
"importResultTitle": "Import Result",
"importFailed": "Import failed",
"ldapLoadFailed": "LDAP load failed",
"ldapConfigSaved": "LDAP configuration saved",
"ldapConnected": "LDAP connection successful",
"ldapConnectFailed": "Connection failed"
},
"vpnUsers": {
"title": "VPN Dial-in Users",
"mfaHint": "OpenVPN Two-Factor Auth (TOTP / Static Challenge / PIN+OTP)",
"addUser": "Add User",
"displayName": "Name",
"tunnel": "Tunnel",
"otpMfa": "OTP / MFA",
"bound": "Bound",
"unbound": "Unbound",
"locked": "Locked",
"lastOnline": "Last Online",
"downloadConfig": "Download Config",
"otpManagement": "OTP Management",
"addVpnUserTitle": "Add VPN Dial-in User",
"dialTunnel": "Dial-in Tunnel",
"pickFromUsers": "Pick from Users",
"displayNameLabel": "Display Name",
"authSource": "Auth Source",
"min8Chars": "At least 8 characters",
"ldapDn": "LDAP DN",
"create": "Create",
"pickUserTitle": "Select Platform User",
"noPlatformUsers": "No platform users",
"clickRowHint": "Click a row to select and auto-fill",
"otpDialogTitle": "Two-Factor Auth — {username}",
"otpHint": "TOTP-based two-factor authentication (SHA1 / base32 / 30s / 6 digits), compatible with major Authenticator apps. Supports static challenge and PIN+OTP combo mode.",
"bindStatus": "Bind Status",
"boundTotp": "TOTP Bound",
"staticPin": "Static PIN",
"pinSet": "Set",
"pinNotSet": "Not Set",
"failCount": "Fail Count",
"lockStatus": "Lock",
"lockedUntil": "Yes (until {time})",
"lastOtpSuccess": "Last OTP Success",
"compatible": "Compatible",
"bindAuthenticator": "Bind Authenticator",
"disableMfa": "Disable MFA",
"regenBackupCodes": "Regenerate Backup Codes",
"setClearPin": "Set / Clear PIN",
"unlock": "Unlock",
"exportKeys": "Export Keys",
"scanHint": "Scan with Google Authenticator / Microsoft Authenticator / FreeOTP",
"base32Key": "Base32 key: {key}",
"input6DigitCode": "Enter 6-digit code to confirm binding",
"verifyAndEnable": "Verify & Enable",
"clientConnectHint": "Client connection: enter login password in the password field, enter 6-digit TOTP code as the second factor (if PIN is set, enter PIN+code, e.g., 1234123456). You can also append the 6-digit code directly to the password.",
"setPinTitle": "Set Static PIN",
"pinHint": "Second factor requires PIN + 6-digit TOTP code (concatenated without spaces). Leave empty to clear the PIN.",
"pinPlaceholder": "4-32 digit PIN, leave empty to clear",
"userFilled": "Filled user \"{username}\" info",
"vpnUserCreated": "VPN dial-in user created",
"createFailed": "Creation failed",
"downloadFailed": "Download failed",
"mfaSetupFailed": "Unable to start MFA setup",
"inputCode": "Please enter verification code",
"mfaEnabledMsg": "Two-factor authentication enabled.\n\nOne-time backup codes (save these — used when you lose your phone):\n{codes}\n\nClient connection: enter login password in the password field, enter 6-digit TOTP code as the second factor (if PIN is set, enter PIN+code).",
"bindSuccess": "Binding Successful",
"verifyFailed": "Verification failed",
"disableMfaConfirm": "Disable MFA for {username}?",
"mfaClosed": "MFA disabled",
"backupCodesTitle": "Backup Codes",
"newBackupCodes": "New backup codes (old codes invalidated):\n\n{codes}",
"generateFailed": "Generation failed",
"pinSetSuccess": "PIN set",
"pinCleared": "PIN cleared",
"unlocked": "Unlocked",
"unlockFailed": "Unlock failed",
"exportKeysTitle": "Export Keys",
"otpSecretsMsg": "TOTP key line (sensitive — do not share):\n\n{line}\n\nFormat: {format}",
"exportFailed": "Export failed",
"deleteVpnUserConfirm": "Delete VPN dial-in user {username}?"
},
"sessions": {
"title": "Online Sessions",
"onlineCount": "{count} online",
"publicAddress": "Public Address",
"vpnIp": "VPN IP",
"connectedDuration": "Duration",
"kickOffline": "Kick",
"noOnlineUsers": "No online users",
"trafficAlert": "⚠ Abnormal Traffic Alert",
"userTunnel": "User/Tunnel",
"alertType": "Type",
"rateAlert": "Traffic Burst",
"quotaExceed": "Quota Exceeded",
"auditLog": "Connection Audit Log",
"event": "Event",
"eventConnect": "Connect",
"eventDisconnect": "Disconnect",
"eventAuthFail": "Auth Failed",
"eventQuotaExceed": "Quota Exceeded",
"eventRateAlert": "Traffic Burst",
"seconds": "{n}s",
"minutes": "{n}m",
"hoursMinutes": "{h}h {m}m",
"loadDataFailed": "Failed to load data",
"kickConfirm": "Kick user \"{username}\" offline?",
"kicked": "User kicked offline"
},
"settings": {
"mustChangePassword": "First login or password has been reset by admin. You must change your password before using other features.",
"changePassword": "Change Password",
"oldPassword": "Current Password",
"newPassword": "New Password",
"min8Chars": "At least 8 characters",
"confirmNewPassword": "Confirm New Password",
"change": "Change",
"mfaTitle": "Two-Factor Authentication (MFA)",
"mfaHint": "Scan the QR code with Microsoft Authenticator, Google Authenticator, etc. Backup codes can be used to log in when you lose your phone.",
"setupMfa": "Set Up MFA",
"disableMfa": "Disable MFA",
"input6DigitCode": "Enter the 6-digit code from your app",
"verifyAndEnable": "Verify & Enable",
"deployTitle": "Deployment Info",
"deliveryForm": "Delivery",
"deliveryDesc": "Single binary (frontend embedded), no Docker required",
"dataDir": "Data Directory",
"dataDirDesc": "./data (override with VPN_DATA_DIR)",
"listenAddr": "Listen Address",
"listenAddrDesc": ":8080 (override with VPN_LISTEN_ADDR)",
"keyStorage": "Key Storage",
"keyStorageDesc": "PSK / Private keys encrypted with AES-GCM, config files with 0600 permissions",
"systemDeps": "System Dependencies",
"systemDepsDesc": "wireguard-tools / strongswan / xl2tpd / openvpn / frp",
"prodSuggestion": "Production Tip",
"prodSuggestionDesc": "Expose via Nginx/Caddy reverse proxy with TLS termination",
"auditTitle": "Audit Log (Latest 100)",
"noAuditLogs": "No audit logs yet",
"mfaEnabledTitle": "MFA Enabled — Please Save Backup Codes",
"backupCodesHint": "These backup codes are shown only once. Use them to log in if you lose your phone. Copy and save them now!",
"copyAll": "Copy All",
"savedConfirm": "I've Saved Them",
"passwordMismatch": "New passwords do not match",
"passwordMin8": "New password must be at least 8 characters",
"passwordChanged": "Password changed",
"changeFailed": "Change failed",
"setupFailed": "Setup failed",
"verifyFailed": "Verification failed",
"mfaClosed": "MFA disabled",
"closeFailed": "Disable failed",
"mustChangeHint": "First login or password has been reset. Please change your password first.",
"confirmChange": "Confirm Change",
"strength": "Strength: {level}",
"strengthVeryWeak": "Very Weak",
"strengthWeak": "Weak",
"strengthFair": "Fair",
"strengthStrong": "Strong",
"strengthVeryStrong": "Very Strong"
},
"plugins": {
"title": "Custom Protocol Plugins",
"registerPlugin": "Register Plugin",
"pluginHint": "Plugins implement the unified protocol contract via <b>command hooks</b>: the platform pipes tunnel config JSON to hook commands via stdin.",
"pluginContract": "Contract: <code>Create / Start / Stop / Status / Config</code>; Status hook outputs <code>running</code> or <code>stopped</code> on stdout; Config hook outputs client config text.",
"protocolId": "Protocol ID",
"enabled": "Enabled",
"disabled": "Disabled",
"noPlugins": "No custom protocol plugins yet",
"editPlugin": "Edit Plugin",
"registerPluginTitle": "Register Protocol Plugin",
"protocolIdPlaceholder": "e.g., myproto (alphanumeric)",
"displayName": "Display Name",
"optional": "Optional",
"protocolIdRequired": "Protocol ID and Start hook are required"
},
"nodes": {
"title": "Node Management",
"addNode": "Add Node",
"nodeHint": "Nodes are used to deploy tunnels to relay servers. The local node is the built-in default; remote nodes support SSH credential verification (password/private key). Verified nodes show \"Verified\" status.",
"type": "Type",
"typeLocal": "Local",
"typeRemote": "Remote",
"sshUser": "SSH User",
"authMethod": "Auth Method",
"authPassword": "Password",
"authKey": "Private Key",
"statusReady": "Ready",
"statusVerified": "Verified",
"statusFailed": "Failed",
"statusUnverified": "Unverified",
"verify": "Verify",
"noNodes": "No remote nodes yet. Click the button above to add one.",
"editNode": "Edit Node",
"namePlaceholder": "e.g., Beijing Relay Node",
"addressPlaceholder": "IP or domain, e.g., 192.168.1.100",
"sshPort": "SSH Port",
"remoteNode": "Remote Node",
"localNode": "Local Node",
"defaultRoot": "Default: root",
"keepUnchanged": "Leave empty to keep unchanged",
"sshPasswordPlaceholder": "SSH login password",
"privateKeyPlaceholder": "Paste OpenSSH/PEM format private key",
"testConnection": "Test Connection",
"determine": "OK",
"fillAddressFirst": "Please enter the address first",
"requestFailed": "Request failed",
"fillNameAndAddress": "Please enter name and address",
"added": "Added",
"updated": "Updated",
"verifySuccess": "Verification successful: {msg}",
"verifyFailed": "Verification failed: {msg}",
"deleteNodeConfirm": "Delete node \"{name}\"? This action cannot be undone."
},
"notFound": {
"title": "404",
"subtitle": "The page you visited does not exist or has been removed",
"backHome": "Back to Home"
},
"mfaVerify": {
"title": "Two-Factor Authentication",
"hint": "Enter the 6-digit code from your Authenticator app",
"verifyAndLogin": "Verify & Login",
"backToLogin": "Back to Login",
"inputFullCode": "Please enter the full 6-digit code",
"sessionExpired": "Login session expired. Please log in again.",
"verifySuccess": "Verification successful",
"codeError": "Incorrect code. Please try again."
},
"ipsecPeer": {
"localParams": "Local IPSec Parameters",
"loadTemplate": "Load Device Template",
"localPublicIp": "Local Public IP",
"remoteGateway": "Remote Gateway",
"localSubnets": "Local Subnets",
"remoteSubnets": "Remote Subnets",
"psk": "Pre-Shared Key",
"phase1": "Phase 1 (IKE SA)",
"ikeVersion": "IKE Version",
"proposal": "Proposal",
"localId": "Local ID",
"remoteId": "Remote ID",
"phase2": "Phase 2 (IPSec SA)",
"espProposal": "ESP Proposal",
"pfsGroup": "PFS Group",
"dpdPolicy": "DPD Policy",
"dpdRestart": "restart (reconnect on disconnect)",
"dpdClear": "clear (remove SA)",
"dpdTrap": "trap (trigger on demand)",
"createIpsecTunnel": "Create IPSec Tunnel",
"paramConsistency": "Parameter Consistency Check",
"peerIkeVersion": "Peer IKE Version",
"peerPhase1": "Peer Phase 1",
"peerPhase2": "Peer Phase 2",
"peerPfsGroup": "Peer PFS Group",
"peerLocalSubnets": "Peer Local Subnets",
"peerIkePlaceholder": "Peer's IKE proposal",
"peerEspPlaceholder": "Peer's ESP proposal",
"peerSubnetsPlaceholder": "Peer's local (= your remote)",
"startCompare": "Start Comparison",
"paramsConsistent": "Parameters are consistent. Tunnel can be established.",
"paramsInconsistent": "Parameter inconsistencies found:",
"connectivityTest": "One-Click Connectivity Test",
"selectIpsecTunnel": "Select an existing IPSec tunnel",
"testConnectivity": "Test connectivity to remote gateway",
"reachable": "Reachable",
"unreachable": "Unreachable",
"latency": "Latency",
"templateLoaded": "Loaded \"{name}\" template: {note}",
"fillRequiredFields": "Please fill in all required fields (gateway/subnets/PSK)",
"ipsecCreated": "IPSec tunnel created and started",
"createFailed": "Creation failed",
"testFailed": "Test failed"
},
"router": {
"dashboard": "Dashboard",
"tunnels": "Tunnels",
"sessions": "Sessions",
"createTunnel": "Create Tunnel",
"editTunnel": "Edit Tunnel",
"ipsecPeer": "IPSec Peer Test",
"nodes": "Nodes",
"users": "Users",
"vpnUsers": "VPN Dial-in Users",
"plugins": "Protocol Plugins",
"settings": "Settings",
"notFound": "Page Not Found",
"sidebarOps": "Tunnel Ops",
"sidebarResource": "Resource Mgmt",
"sidebarSystem": "System"
},
"protocolIcon": {
"custom": "Custom Protocol"
}
}