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:
1 parent
1e2f8ef24f
commit
021d012478
25 files changed
+2313
-746
No files matched your search
@@ -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"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,584 @@
|
||||
{
|
||||
"common": {
|
||||
"appName": "VPN 管理平台",
|
||||
"confirm": "确认",
|
||||
"cancel": "取消",
|
||||
"save": "保存",
|
||||
"delete": "删除",
|
||||
"edit": "编辑",
|
||||
"add": "添加",
|
||||
"create": "创建",
|
||||
"close": "关闭",
|
||||
"search": "搜索",
|
||||
"refresh": "刷新",
|
||||
"back": "返回",
|
||||
"submit": "提交",
|
||||
"yes": "是",
|
||||
"no": "否",
|
||||
"enabled": "启用",
|
||||
"disabled": "禁用",
|
||||
"loading": "加载中",
|
||||
"operation": "操作",
|
||||
"status": "状态",
|
||||
"name": "名称",
|
||||
"description": "说明",
|
||||
"username": "用户名",
|
||||
"password": "密码",
|
||||
"email": "邮箱",
|
||||
"source": "来源",
|
||||
"local": "本地",
|
||||
"ldap": "LDAP",
|
||||
"remark": "备注",
|
||||
"protocol": "协议",
|
||||
"node": "节点",
|
||||
"time": "时间",
|
||||
"target": "对象",
|
||||
"action": "动作",
|
||||
"traffic": "流量 ↓ / ↑",
|
||||
"ipAddress": "IP 地址",
|
||||
"detail": "详情",
|
||||
"copy": "复制",
|
||||
"copied": "已复制",
|
||||
"download": "下载",
|
||||
"permanent": "永久",
|
||||
"saveSuccess": "已保存",
|
||||
"saveFailed": "保存失败",
|
||||
"deleteSuccess": "已删除",
|
||||
"deleteFailed": "删除失败",
|
||||
"loadFailed": "加载失败",
|
||||
"operationFailed": "操作失败",
|
||||
"deleteConfirm": "删除确认",
|
||||
"noData": "暂无数据",
|
||||
"never": "不",
|
||||
"copiedToClipboard": "已复制到剪贴板",
|
||||
"logout": "退出登录"
|
||||
},
|
||||
"login": {
|
||||
"title": "VPN 专线管理平台",
|
||||
"subtitle": "统一管理多协议 VPN,配置简单、安全可控",
|
||||
"protocols": "WireGuard · IPSec · L2TP · FRP · OpenVPN · 自定义协议插件",
|
||||
"feature1Title": "多协议统一管理",
|
||||
"feature1Desc": "WireGuard / IPSec / L2TP / FRP / OpenVPN",
|
||||
"feature2Title": "企业级安全",
|
||||
"feature2Desc": "密钥 AES-GCM 加密 + 双因素认证",
|
||||
"feature3Title": "一键创建配置",
|
||||
"feature3Desc": "向导式生成,客户端配置秒级下载",
|
||||
"feature4Title": "轻量零依赖",
|
||||
"feature4Desc": "单二进制交付,无需 Docker",
|
||||
"welcome": "欢迎登录",
|
||||
"welcomeHint": "请输入账号密码登录管理平台",
|
||||
"usernameLabel": "用户名",
|
||||
"usernamePlaceholder": "请输入用户名",
|
||||
"passwordLabel": "密码",
|
||||
"passwordPlaceholder": "请输入密码",
|
||||
"loginButton": "登 录",
|
||||
"defaultAccount": "默认账号 <strong>admin / admin123</strong>,登录后请立即修改",
|
||||
"errorEmpty": "请输入用户名和密码",
|
||||
"loginSuccess": "登录成功",
|
||||
"changePasswordFirst": "首次登录请先修改密码",
|
||||
"loginFailed": "登录失败,请检查网络或联系管理员"
|
||||
},
|
||||
"dashboard": {
|
||||
"welcomeTitle": "欢迎使用 VPN 管理平台",
|
||||
"welcomeDesc": "还没有专线,3 步即可创建第一条:选择协议 → 填写参数 → 自动生成配置",
|
||||
"createNow": "立即创建专线",
|
||||
"totalTunnels": "专线总数",
|
||||
"running": "运行中",
|
||||
"onlineUsers": "在线用户",
|
||||
"totalTraffic": "累计流量 ↓↑",
|
||||
"protocolDistribution": "协议分布",
|
||||
"protocolEngineStatus": "协议引擎状态",
|
||||
"depCheckResult": "系统依赖检测结果",
|
||||
"depReady": "已就绪",
|
||||
"demoMode": "演示模式",
|
||||
"deploy": "下载部署",
|
||||
"installCmd": "安装命令",
|
||||
"expiringTunnels": "即将到期的专线(7 天内)",
|
||||
"expiryTime": "到期时间",
|
||||
"noTunnels": "暂无专线",
|
||||
"deploySuccess": "{name} {version} 部署成功",
|
||||
"deployFailed": "{name} 部署失败",
|
||||
"contactAdmin": "请联系系统管理员安装",
|
||||
"recommendedCmd": "推荐命令",
|
||||
"otherDistros": "其他发行版",
|
||||
"copyRecommended": "复制推荐命令",
|
||||
"getInstallCmdFailed": "获取安装命令失败"
|
||||
},
|
||||
"tunnels": {
|
||||
"searchPlaceholder": "搜索名称",
|
||||
"allProtocols": "全部协议",
|
||||
"allStates": "全部状态",
|
||||
"stateRunning": "运行中",
|
||||
"stateStopped": "已停止",
|
||||
"stateError": "异常",
|
||||
"stateUndeployed": "未部署",
|
||||
"createTunnel": "创建专线",
|
||||
"createFirst": "创建第一条专线",
|
||||
"noTunnels": "还没有专线",
|
||||
"expireTime": "到期时间",
|
||||
"localNode": "本机节点",
|
||||
"start": "启动",
|
||||
"stop": "停止",
|
||||
"started": "已启动",
|
||||
"startFailed": "启动失败",
|
||||
"stopped": "已停止",
|
||||
"more": "更多",
|
||||
"viewLogs": "查看日志",
|
||||
"downloadConfig": "下载配置",
|
||||
"showQrCode": "显示二维码",
|
||||
"ipsecTest": "IPSec 对接测试",
|
||||
"delete": "删除",
|
||||
"detail": "详情",
|
||||
"protocol": "协议",
|
||||
"createTime": "创建时间",
|
||||
"autoStart": "自动启动",
|
||||
"runningParams": "运行参数",
|
||||
"clientConfig": "客户端配置",
|
||||
"noClientConfig": "该协议暂无客户端配置",
|
||||
"downloadClientConfig": "下载客户端配置",
|
||||
"ipsecParamCheck": "IPSec 参数检查与连通性测试",
|
||||
"trafficPolicy": "流量策略",
|
||||
"quotaGB": "配额(GB)",
|
||||
"quotaUnlimited": "0 = 不限。已用:{used}",
|
||||
"rateLimitMbps": "限速(Mbps)",
|
||||
"rateUnlimited": "0 = 不限",
|
||||
"exceedAction": "超额动作",
|
||||
"actionWarn": "仅告警",
|
||||
"actionBlock": "自动停止",
|
||||
"actionThrottle": "限速至1Mbps",
|
||||
"resetCycle": "重置周期",
|
||||
"resetNone": "不重置",
|
||||
"resetDaily": "每天",
|
||||
"resetMonthly": "每月",
|
||||
"savePolicy": "保存策略",
|
||||
"policySaved": "流量策略已保存",
|
||||
"peerList": "Peer 列表",
|
||||
"addPeer": "添加 Peer",
|
||||
"peerId": "Peer ID",
|
||||
"address": "地址",
|
||||
"peerOnline": "在线",
|
||||
"peerOffline": "离线",
|
||||
"config": "配置",
|
||||
"qrCode": "二维码",
|
||||
"scanQrTitle": "扫码导入 WireGuard 客户端",
|
||||
"scanQrHint": "使用 WireGuard App「从二维码添加」",
|
||||
"addPeerTitle": "添加 WireGuard Peer",
|
||||
"autoGenId": "留空自动生成 client-N",
|
||||
"peerNamePlaceholder": "手机 / 笔记本",
|
||||
"clientAddress": "客户端地址",
|
||||
"defaultAllowedIPs": "留空使用隧道默认",
|
||||
"externalPublicKey": "外部公钥",
|
||||
"externalKeyHint": "留空则平台托管生成密钥;填写则为外部设备",
|
||||
"logTitle": "实例日志 — {name}",
|
||||
"liveOutput": "● 实时输出中",
|
||||
"logStopped": "已停止",
|
||||
"pause": "暂停",
|
||||
"resume": "继续",
|
||||
"clearScreen": "清屏",
|
||||
"waitingLog": "等待日志输出...",
|
||||
"fillClientAddress": "请填写客户端地址",
|
||||
"peerAdded": "Peer 已添加",
|
||||
"addFailed": "添加失败",
|
||||
"deletePeerConfirm": "删除 Peer「{id}」?",
|
||||
"downloadFailed": "下载失败",
|
||||
"qrFailed": "生成二维码失败",
|
||||
"noClientConfigWarn": "无客户端配置",
|
||||
"deleteTunnelConfirm": "确定删除专线「{name}」?配置与密钥将一并清除。",
|
||||
"peerAlreadyAdded": "Peer 已添加"
|
||||
},
|
||||
"tunnelEditor": {
|
||||
"title": "编辑专线",
|
||||
"backToList": "返回列表",
|
||||
"sensitiveFieldHint": "密码、PSK、Token 等敏感字段不会回显;留空表示继续使用原值。",
|
||||
"tunnelName": "专线名称",
|
||||
"protocolType": "协议类型",
|
||||
"keepOriginal": "留空保持原值",
|
||||
"expireTime": "到期时间",
|
||||
"expirePlaceholder": "留空为永久",
|
||||
"autoStart": "自动启动",
|
||||
"saveConfig": "保存配置",
|
||||
"loadFailed": "加载专线失败",
|
||||
"fillName": "请填写专线名称",
|
||||
"configSaved": "配置已保存"
|
||||
},
|
||||
"tunnelWizard": {
|
||||
"step1": "选择协议",
|
||||
"step2": "填写参数",
|
||||
"step3": "生成配置",
|
||||
"recommend": "推荐",
|
||||
"depReady": "✓ 依赖就绪",
|
||||
"notDeployed": "未部署",
|
||||
"oneClickInstall": "一键安装",
|
||||
"installCmd": "安装命令",
|
||||
"customPlugin": "自定义协议插件",
|
||||
"customScene": "自定义对接",
|
||||
"tunnelName": "专线名称",
|
||||
"namePlaceholder": "例如:总部-分支互联",
|
||||
"protocolType": "协议类型",
|
||||
"reselect": "重新选择",
|
||||
"advancedOptions": "高级选项",
|
||||
"expireTime": "到期时间",
|
||||
"expirePlaceholder": "留空为永久",
|
||||
"autoStartAfterCreate": "创建后自动启动",
|
||||
"previousStep": "上一步",
|
||||
"generateConfig": "生成配置",
|
||||
"createSuccess": "专线创建成功",
|
||||
"configGenerated": "「{name}」配置已生成",
|
||||
"clientConfig": "客户端配置",
|
||||
"downloadConfigFile": "下载配置文件",
|
||||
"showQrCode": "显示二维码",
|
||||
"goIpsecPeer": "前往 IPSec 对接页",
|
||||
"backToList": "返回列表",
|
||||
"installCmdTitle": "{name} 安装命令",
|
||||
"pkgManagerDetected": "检测到当前系统包管理器:{pm},推荐使用以下命令",
|
||||
"noPkgManager": "未检测到系统包管理器,以下是各平台安装命令供参考",
|
||||
"aptDefault": "apt (默认)",
|
||||
"recommended": "推荐",
|
||||
"copyThisCmd": "复制此命令",
|
||||
"otherDistros": "其他发行版",
|
||||
"fillName": "请填写专线名称",
|
||||
"fillRequired": "请填写必填项:{label}",
|
||||
"createFailed": "创建失败",
|
||||
"installSuccess": "{protocol} {version} 安装成功 {method}",
|
||||
"methodPackageManager": "(包管理器安装)",
|
||||
"methodDownload": "(一键安装)",
|
||||
"installFailed": "{protocol} 安装失败"
|
||||
},
|
||||
"users": {
|
||||
"title": "管理用户",
|
||||
"batchImport": "批量导入",
|
||||
"ldapImport": "LDAP 导入",
|
||||
"addUser": "添加用户",
|
||||
"role": "角色",
|
||||
"roleAdmin": "管理员",
|
||||
"roleOperator": "运维",
|
||||
"roleViewer": "只读",
|
||||
"noUsers": "还没有用户",
|
||||
"ldapTitle": "LDAP 身份源",
|
||||
"ldapHint": "LDAP 用户可首次登录后自动同步,也可使用左侧「LDAP 导入」预先添加。",
|
||||
"ldapUrl": "LDAP URL",
|
||||
"bindDn": "Bind DN",
|
||||
"bindPassword": "Bind 密码",
|
||||
"keepOriginal": "留空保持原值",
|
||||
"baseDn": "Base DN",
|
||||
"userFilter": "用户过滤",
|
||||
"usernameAttr": "用户名属性",
|
||||
"testConnection": "测试连接",
|
||||
"editUser": "编辑用户",
|
||||
"loginUsername": "登录用户名",
|
||||
"keepUnchanged": "留空不修改",
|
||||
"min8Chars": "至少 8 位",
|
||||
"batchImportTitle": "批量导入用户",
|
||||
"batchHint": "每行一个用户,格式:用户名,密码 或仅用户名(自动生成密码)。密码至少 8 位。",
|
||||
"batchPlaceholder": "每行一个:用户名,密码(如 user1,Pass1234);或仅用户名自动生成密码",
|
||||
"defaultRole": "默认角色",
|
||||
"startImport": "开始导入",
|
||||
"ldapImportTitle": "从 LDAP 导入用户",
|
||||
"ldapNotEnabled": "LDAP 未启用,请先在右侧配置并测试连接",
|
||||
"refreshUserList": "刷新用户列表",
|
||||
"userCount": "共 {count} 个用户,已选 {selected} 个",
|
||||
"fullName": "姓名",
|
||||
"imported": "已导入",
|
||||
"pendingImport": "待导入",
|
||||
"clickRefreshHint": "点击上方刷新加载 LDAP 用户",
|
||||
"ldapDisabled": "LDAP 未启用",
|
||||
"importSelected": "导入入选中 ({count})",
|
||||
"updated": "已更新",
|
||||
"fillUsername": "请填写用户名",
|
||||
"passwordMin8": "密码至少 8 位",
|
||||
"userCreated": "用户已创建",
|
||||
"deleteUserConfirm": "确定删除用户「{username}」?",
|
||||
"enterAtLeastOne": "请输入至少一行用户数据",
|
||||
"importResult": "成功 {success},跳过 {skipped},失败 {failed}",
|
||||
"importResultTitle": "导入结果",
|
||||
"importFailed": "导入失败",
|
||||
"ldapLoadFailed": "LDAP 加载失败",
|
||||
"ldapConfigSaved": "LDAP 配置已保存",
|
||||
"ldapConnected": "LDAP 连接成功",
|
||||
"ldapConnectFailed": "连接失败"
|
||||
},
|
||||
"vpnUsers": {
|
||||
"title": "VPN 拨号用户",
|
||||
"mfaHint": "OpenVPN 双因素认证(TOTP / 静态挑战 / PIN+OTP)",
|
||||
"addUser": "添加用户",
|
||||
"displayName": "姓名",
|
||||
"tunnel": "隧道",
|
||||
"otpMfa": "OTP / MFA",
|
||||
"bound": "已绑定",
|
||||
"unbound": "未绑定",
|
||||
"locked": "锁定",
|
||||
"lastOnline": "最近在线",
|
||||
"downloadConfig": "下载配置",
|
||||
"otpManagement": "OTP 管理",
|
||||
"addVpnUserTitle": "添加 VPN 拨号用户",
|
||||
"dialTunnel": "拨号隧道",
|
||||
"pickFromUsers": "从已有用户选",
|
||||
"displayNameLabel": "显示名",
|
||||
"authSource": "认证来源",
|
||||
"min8Chars": "至少 8 位",
|
||||
"ldapDn": "LDAP DN",
|
||||
"create": "创建",
|
||||
"pickUserTitle": "选择已有平台用户",
|
||||
"noPlatformUsers": "暂无平台用户",
|
||||
"clickRowHint": "点击行即选中并自动填充",
|
||||
"otpDialogTitle": "双因素认证 — {username}",
|
||||
"otpHint": "基于 TOTP 的双因素认证(SHA1 / base32 / 30s / 6 位),兼容主流 Authenticator 应用。支持静态挑战二次输入与 PIN+OTP 组合模式。",
|
||||
"bindStatus": "绑定状态",
|
||||
"boundTotp": "已绑定 TOTP",
|
||||
"staticPin": "静态 PIN",
|
||||
"pinSet": "已设置",
|
||||
"pinNotSet": "未设置",
|
||||
"failCount": "失败次数",
|
||||
"lockStatus": "锁定",
|
||||
"lockedUntil": "是(至 {time})",
|
||||
"lastOtpSuccess": "最近 OTP 成功",
|
||||
"compatible": "兼容",
|
||||
"bindAuthenticator": "绑定 Authenticator",
|
||||
"disableMfa": "关闭 MFA",
|
||||
"regenBackupCodes": "重新生成备用码",
|
||||
"setClearPin": "设置/清除 PIN",
|
||||
"unlock": "解锁",
|
||||
"exportKeys": "导出密钥",
|
||||
"scanHint": "使用 Google Authenticator / Microsoft Authenticator / FreeOTP 扫描",
|
||||
"base32Key": "base32 密钥:{key}",
|
||||
"input6DigitCode": "输入 6 位验证码确认绑定",
|
||||
"verifyAndEnable": "验证并启用",
|
||||
"clientConnectHint": "客户端连接方式:密码框填登录密码,第二因子填 6 位动态验证码(若设置了 PIN,则填 PIN+验证码,如 1234123456)。也支持密码后直接附加 6 位码。",
|
||||
"setPinTitle": "设置静态 PIN",
|
||||
"pinHint": "连接时第二因子需输入 PIN + 6 位动态验证码(无空格拼接)。留空保存可清除已设置的 PIN。",
|
||||
"pinPlaceholder": "4-32 位 PIN,留空清除",
|
||||
"userFilled": "已填充用户「{username}」信息",
|
||||
"vpnUserCreated": "拨号用户已创建",
|
||||
"createFailed": "创建失败",
|
||||
"downloadFailed": "下载失败",
|
||||
"mfaSetupFailed": "无法开始 MFA 设置",
|
||||
"inputCode": "请输入验证码",
|
||||
"mfaEnabledMsg": "双因素认证已启用。\n\n一次性备用码(请妥善保存,丢失手机时用于登录):\n{codes}\n\n客户端连接方式:密码框填登录密码,第二因子填 6 位动态验证码(若设置了 PIN 则填 PIN+验证码)。",
|
||||
"bindSuccess": "绑定成功",
|
||||
"verifyFailed": "验证失败",
|
||||
"disableMfaConfirm": "关闭 {username} 的 MFA?",
|
||||
"mfaClosed": "MFA 已关闭",
|
||||
"backupCodesTitle": "备用码",
|
||||
"newBackupCodes": "新备用码(旧码失效):\n\n{codes}",
|
||||
"generateFailed": "生成失败",
|
||||
"pinSetSuccess": "PIN 已设置",
|
||||
"pinCleared": "PIN 已清除",
|
||||
"unlocked": "已解锁",
|
||||
"unlockFailed": "解锁失败",
|
||||
"exportKeysTitle": "导出密钥",
|
||||
"otpSecretsMsg": "TOTP 密钥行(敏感信息,请勿泄露):\n\n{line}\n\n格式说明:{format}",
|
||||
"exportFailed": "导出失败",
|
||||
"deleteVpnUserConfirm": "删除拨号用户 {username}?"
|
||||
},
|
||||
"sessions": {
|
||||
"title": "在线会话",
|
||||
"onlineCount": "{count} 个在线",
|
||||
"publicAddress": "公网地址",
|
||||
"vpnIp": "VPN IP",
|
||||
"connectedDuration": "已连接时长",
|
||||
"kickOffline": "踢下线",
|
||||
"noOnlineUsers": "当前无在线用户",
|
||||
"trafficAlert": "⚠ 异常流量告警",
|
||||
"userTunnel": "用户/隧道",
|
||||
"alertType": "类型",
|
||||
"rateAlert": "突发流量",
|
||||
"quotaExceed": "配额超额",
|
||||
"auditLog": "连接审计日志",
|
||||
"event": "事件",
|
||||
"eventConnect": "连接",
|
||||
"eventDisconnect": "断开",
|
||||
"eventAuthFail": "认证失败",
|
||||
"eventQuotaExceed": "配额超额",
|
||||
"eventRateAlert": "突发流量",
|
||||
"seconds": "{n}秒",
|
||||
"minutes": "{n}分钟",
|
||||
"hoursMinutes": "{h}小时{m}分",
|
||||
"loadDataFailed": "加载数据失败",
|
||||
"kickConfirm": "确定踢用户「{username}」下线?",
|
||||
"kicked": "已踢下线"
|
||||
},
|
||||
"settings": {
|
||||
"mustChangePassword": "首次登录或密码已被管理员重置,必须修改密码后才能使用其他功能",
|
||||
"changePassword": "修改密码",
|
||||
"oldPassword": "原密码",
|
||||
"newPassword": "新密码",
|
||||
"min8Chars": "至少 8 位",
|
||||
"confirmNewPassword": "确认新密码",
|
||||
"change": "修改",
|
||||
"mfaTitle": "双因素认证(MFA)",
|
||||
"mfaHint": "使用 Microsoft Authenticator、Google Authenticator 等应用扫描二维码。备用码可在丢失手机时登录。",
|
||||
"setupMfa": "设置 MFA",
|
||||
"disableMfa": "关闭 MFA",
|
||||
"input6DigitCode": "输入 App 显示的 6 位验证码",
|
||||
"verifyAndEnable": "验证并启用",
|
||||
"deployTitle": "部署说明",
|
||||
"deliveryForm": "交付形态",
|
||||
"deliveryDesc": "单二进制(前端已内嵌),无需 Docker",
|
||||
"dataDir": "数据目录",
|
||||
"dataDirDesc": "./data(可用 VPN_DATA_DIR 覆盖)",
|
||||
"listenAddr": "监听地址",
|
||||
"listenAddrDesc": ":8080(VPN_LISTEN_ADDR 覆盖)",
|
||||
"keyStorage": "密钥存储",
|
||||
"keyStorageDesc": "PSK / 私钥 AES-GCM 加密落库,配置文件 0600 权限",
|
||||
"systemDeps": "系统依赖",
|
||||
"systemDepsDesc": "wireguard-tools / strongswan / xl2tpd / openvpn / frp",
|
||||
"prodSuggestion": "生产建议",
|
||||
"prodSuggestionDesc": "经 Nginx/Caddy 反向代理终止 TLS 后暴露",
|
||||
"auditTitle": "操作审计(最近 100 条)",
|
||||
"noAuditLogs": "暂无审计日志",
|
||||
"mfaEnabledTitle": "MFA 已启用 — 请保存备用码",
|
||||
"backupCodesHint": "这些备用码仅显示一次,丢失手机时用于登录。请立即复制保存!",
|
||||
"copyAll": "复制全部",
|
||||
"savedConfirm": "我已保存",
|
||||
"passwordMismatch": "两次新密码不一致",
|
||||
"passwordMin8": "新密码至少 8 位",
|
||||
"passwordChanged": "密码已修改",
|
||||
"changeFailed": "修改失败",
|
||||
"setupFailed": "设置失败",
|
||||
"verifyFailed": "验证失败",
|
||||
"mfaClosed": "MFA 已关闭",
|
||||
"closeFailed": "关闭失败",
|
||||
"mustChangeHint": "首次登录或密码已被重置,请先修改密码",
|
||||
"confirmChange": "确认修改",
|
||||
"strength": "强度:{level}",
|
||||
"strengthVeryWeak": "很弱",
|
||||
"strengthWeak": "弱",
|
||||
"strengthFair": "一般",
|
||||
"strengthStrong": "较强",
|
||||
"strengthVeryStrong": "强"
|
||||
},
|
||||
"plugins": {
|
||||
"title": "自定义协议插件",
|
||||
"registerPlugin": "注册插件",
|
||||
"pluginHint": "插件通过<b>命令钩子</b>实现统一协议契约:平台将专线配置 JSON 通过 stdin 传给钩子命令。",
|
||||
"pluginContract": "契约:<code>Create / Start / Stop / Status / Config</code>;Status 钩子 stdout 输出 <code>running</code> 或 <code>stopped</code>;Config 钩子 stdout 输出客户端配置文本。",
|
||||
"protocolId": "协议标识",
|
||||
"enabled": "启用",
|
||||
"disabled": "停用",
|
||||
"noPlugins": "还没有自定义协议插件",
|
||||
"editPlugin": "编辑插件",
|
||||
"registerPluginTitle": "注册协议插件",
|
||||
"protocolIdPlaceholder": "如 myproto(字母数字)",
|
||||
"displayName": "显示名称",
|
||||
"optional": "可选",
|
||||
"protocolIdRequired": "协议标识与 Start 钩子必填"
|
||||
},
|
||||
"nodes": {
|
||||
"title": "节点管理",
|
||||
"addNode": "添加节点",
|
||||
"nodeHint": "节点用于将专线部署到中继服务器。本机节点为内置默认节点;远程节点支持 SSH 凭证验证(密码/私钥),验证通过后状态显示为「已验证」。",
|
||||
"type": "类型",
|
||||
"typeLocal": "本机",
|
||||
"typeRemote": "远程",
|
||||
"sshUser": "SSH 用户",
|
||||
"authMethod": "认证方式",
|
||||
"authPassword": "密码",
|
||||
"authKey": "私钥",
|
||||
"statusReady": "就绪",
|
||||
"statusVerified": "已验证",
|
||||
"statusFailed": "验证失败",
|
||||
"statusUnverified": "未验证",
|
||||
"verify": "验证",
|
||||
"noNodes": "还没有远程节点,点击右上角添加",
|
||||
"editNode": "编辑节点",
|
||||
"namePlaceholder": "例如:北京中继节点",
|
||||
"addressPlaceholder": "IP 或域名,如 192.168.1.100",
|
||||
"sshPort": "SSH 端口",
|
||||
"remoteNode": "远程节点",
|
||||
"localNode": "本机节点",
|
||||
"defaultRoot": "默认 root",
|
||||
"keepUnchanged": "留空表示不修改",
|
||||
"sshPasswordPlaceholder": "SSH 登录密码",
|
||||
"privateKeyPlaceholder": "粘贴 OpenSSH/PEM 格式私钥内容",
|
||||
"testConnection": "测试连接",
|
||||
"determine": "确定",
|
||||
"fillAddressFirst": "请先填写地址",
|
||||
"requestFailed": "请求失败",
|
||||
"fillNameAndAddress": "请填写名称与地址",
|
||||
"added": "已添加",
|
||||
"updated": "已更新",
|
||||
"verifySuccess": "验证成功:{msg}",
|
||||
"verifyFailed": "验证失败:{msg}",
|
||||
"deleteNodeConfirm": "确定删除节点「{name}」?该操作不可撤销。"
|
||||
},
|
||||
"notFound": {
|
||||
"title": "404",
|
||||
"subtitle": "您访问的页面不存在或已被移除",
|
||||
"backHome": "返回首页"
|
||||
},
|
||||
"mfaVerify": {
|
||||
"title": "双因素认证",
|
||||
"hint": "请输入 Authenticator 应用中显示的 6 位动态验证码",
|
||||
"verifyAndLogin": "验证并登录",
|
||||
"backToLogin": "返回登录",
|
||||
"inputFullCode": "请输入完整的 6 位验证码",
|
||||
"sessionExpired": "登录会话已过期,请重新登录",
|
||||
"verifySuccess": "验证成功",
|
||||
"codeError": "验证码错误,请重试"
|
||||
},
|
||||
"ipsecPeer": {
|
||||
"localParams": "本端 IPSec 参数",
|
||||
"loadTemplate": "载入设备模板",
|
||||
"localPublicIp": "本端公网 IP",
|
||||
"remoteGateway": "对端网关",
|
||||
"localSubnets": "本端网段",
|
||||
"remoteSubnets": "对端网段",
|
||||
"psk": "预共享密钥",
|
||||
"phase1": "Phase 1(IKE SA)",
|
||||
"ikeVersion": "IKE 版本",
|
||||
"proposal": "提议",
|
||||
"localId": "本端 ID",
|
||||
"remoteId": "对端 ID",
|
||||
"phase2": "Phase 2(IPSec SA)",
|
||||
"espProposal": "ESP 提议",
|
||||
"pfsGroup": "PFS 组",
|
||||
"dpdPolicy": "DPD 策略",
|
||||
"dpdRestart": "restart(断线重连)",
|
||||
"dpdClear": "clear(清除)",
|
||||
"dpdTrap": "trap(按需触发)",
|
||||
"createIpsecTunnel": "创建 IPSec 专线",
|
||||
"paramConsistency": "双方参数一致性检查",
|
||||
"peerIkeVersion": "对端 IKE 版本",
|
||||
"peerPhase1": "对端 Phase1",
|
||||
"peerPhase2": "对端 Phase2",
|
||||
"peerPfsGroup": "对端 PFS 组",
|
||||
"peerLocalSubnets": "对端本端网段",
|
||||
"peerIkePlaceholder": "对端的 IKE 提议",
|
||||
"peerEspPlaceholder": "对端的 ESP 提议",
|
||||
"peerSubnetsPlaceholder": "对端视角的 local(=我方 remote)",
|
||||
"startCompare": "开始对比检查",
|
||||
"paramsConsistent": "双方参数一致,可以建立隧道",
|
||||
"paramsInconsistent": "发现参数不一致:",
|
||||
"connectivityTest": "一键连通性测试",
|
||||
"selectIpsecTunnel": "选择已有 IPSec 专线",
|
||||
"testConnectivity": "测试与对端网关连通性",
|
||||
"reachable": "可达",
|
||||
"unreachable": "不可达",
|
||||
"latency": "耗时",
|
||||
"templateLoaded": "已载入「{name}」模板:{note}",
|
||||
"fillRequiredFields": "请填写完整的必填项(网关/网段/PSK)",
|
||||
"ipsecCreated": "IPSec 专线已创建并启动",
|
||||
"createFailed": "创建失败",
|
||||
"testFailed": "测试失败"
|
||||
},
|
||||
"router": {
|
||||
"dashboard": "总览",
|
||||
"tunnels": "专线列表",
|
||||
"sessions": "在线会话",
|
||||
"createTunnel": "创建专线",
|
||||
"editTunnel": "编辑专线",
|
||||
"ipsecPeer": "IPSec 第三方对接",
|
||||
"nodes": "节点管理",
|
||||
"users": "用户管理",
|
||||
"vpnUsers": "VPN 拨号用户",
|
||||
"plugins": "协议插件",
|
||||
"settings": "系统设置",
|
||||
"notFound": "页面不存在",
|
||||
"sidebarOps": "专线运维",
|
||||
"sidebarResource": "资源管理",
|
||||
"sidebarSystem": "系统"
|
||||
},
|
||||
"protocolIcon": {
|
||||
"custom": "自定义协议"
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user