Files
opsx-vpn/frontend/src/locales/en-US.json
T

1481 lines
65 KiB
JSON
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
{
"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",
"batchOperation": "Batch Operation",
"copyFailed": "Copy failed"
},
"login": {
"title": "VPN Management Platform",
"subtitle": "Unified multi-protocol VPN management — simple, secure, and controllable",
"protocols": "WireGuard · IPSec · IKEv2 · L2TP · GRE · FRP · OpenVPN",
"feature1Title": "Multi-Protocol Unified Management",
"feature1Desc": "WireGuard / IPSec / IKEv2 / L2TP / GRE / 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: {account} — 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",
"hostReadinessWarning": "Host prerequisites are incomplete. VPN forwarding or NAT may not work correctly.",
"readinessRoot": "Service is not running as root",
"readinessForwarding": "IPv4 forwarding is disabled",
"readinessRoute": "No default egress route detected",
"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",
"aptDefault": "apt default",
"oneClickInstall": "Install",
"oneClickFix": "Auto Fix",
"fixSuccess": "Fixed: {items}",
"fixFailed": "Fix failed: {items}",
"fixNeedRoot": "Root privileges required to modify system config",
"fixNothing": "Nothing to auto-fix",
"quickErrorTunnels": "Unhealthy tunnels",
"quickErrorHint": "Tunnels in error state",
"quickOnline": "Online sessions",
"quickOnlineHint": "Currently connected users",
"quickAlerts": "Open alerts",
"quickAlertsHint": "Traffic and quota alerts"
},
"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",
"authMethod": "Authentication",
"authUnknown": "Unspecified",
"wgAuthPassword": "Client account + device key",
"wgAuthHint": "The client account obtains device authorization; WireGuard authenticates using keys. Manually added static peers still connect by key.",
"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",
"stopFailed": "Stop failed",
"selected": "{count} selected",
"batchStart": "Batch Start",
"batchStop": "Batch Stop",
"batchDelete": "Batch Delete",
"batchStartConfirm": "Confirm batch start {count} tunnels?",
"batchStopConfirm": "Confirm batch stop {count} tunnels?",
"batchDeleteConfirm": "Confirm batch delete {count} tunnels? This cannot be undone!",
"batchStarted": "Batch operation submitted, executing in background",
"taskProgress": "Task Progress",
"taskPending": "Pending",
"taskRunning": "Running",
"taskDone": "Done",
"taskFailed": "Failed",
"taskSuccess": "Success {count}/{total}",
"taskFailedCount": "Failed {count}",
"taskInProgress": "In progress ({done}/{total})",
"taskComplete": "All done",
"taskPartialFail": "Partial failure",
"viewTasks": "View Tasks",
"noTasks": "No task history",
"trafficTrend": "Traffic Trend",
"noTrafficData": "No traffic data yet (waiting for samples…)",
"pageDescription": "Manage VPN tunnels and runtime status",
"title": "Tunnels"
},
"oidcGuide": {
"title": "Feishu / OIDC browser authentication",
"externalService": "Requires openvpn-auth-oauth2",
"componentReady": "Authentication component installed v{version}",
"authEntryPending": "HTTPS is ready at {domain}; sync the authentication route on the Feishu / OIDC Identity page after starting the tunnel.",
"app": "Create app",
"appShort": "Feishu developer console",
"identity": "Enter identity settings",
"identityShort": "OIDC and credentials",
"builtinIdentityShort": "Enter Feishu credentials on the Feishu / OIDC Identity page",
"callback": "Set public callback",
"callbackShort": "HTTPS reverse proxy",
"test": "Test client",
"testShort": "Browser sign-in",
"appTip": "Ask a Feishu administrator to create and publish an app with the appropriate sign-in capability.",
"builtinAppTip": "Manage Feishu App ID and App Secret on the Feishu / OIDC Identity page, not in each tunnel.",
"openConsole": "Open Feishu app console",
"appInstruction1": "Create an enterprise app, obtain its credentials, and enable the web sign-in capability.",
"appInstruction2": "Register a redirect URL under the app's security/redirect settings. If using a broker, use the broker's upstream callback here.",
"builtinAppInstruction2": "Register the Feishu app callback shown below in the app's redirect settings, not the VPN client callback.",
"appInstruction3": "Publish the app and restrict its available users to people allowed to access this VPN.",
"scopeTip": "Restrict who can use the Feishu app. LDAP dial-in users are not automatically linked to Feishu identities.",
"providerTip": "Use the built-in Feishu issuer configured on the Feishu / OIDC Identity page, or provide an external issuer with OIDC discovery and ID tokens. A Feishu app URL alone is not an issuer.",
"source": "Identity source",
"builtinSource": "Built-in Feishu",
"externalSource": "External OIDC",
"configureBuiltIn": "The built-in Feishu issuer is not enabled. Save app credentials and enable it on the Feishu / OIDC Identity page first.",
"manageFeishu": "Open Feishu / OIDC Identity",
"builtinSummary": "The Feishu App ID, App Secret, and tenant are managed on the Feishu / OIDC Identity page; this tunnel references the issuer and its own public authentication entry.",
"useBuiltIn": "Use built-in Feishu issuer",
"builtInSecret": "The server supplies the VPN Client Secret. Do not enter the Feishu App Secret here.",
"builtInGatewayPending": "The public Nginx route for the built-in issuer is pending; sync it on the Feishu / OIDC Identity page before testing.",
"issuer": "OIDC issuer URL",
"issuerTip": "Use an HTTPS issuer that provides standard discovery (/.well-known/openid-configuration) and ID tokens, not an authorization page URL.",
"clientId": "OIDC Client ID",
"clientIdTip": "Get the credentials from the provider named by the issuer. With a broker, create a VPN client in the broker; the Feishu App ID/Secret belong in its upstream Feishu configuration.",
"clientSecret": "OIDC Client Secret",
"copySecret": "Copy from the OIDC provider; hidden after saving",
"keepSecret": "Leave blank to retain current secret",
"secretTip": "Encrypted server-side and stored only in the auth service's 0600 configuration file.",
"baseUrl": "Public sign-in URL",
"baseTip": "Automatic filling reuses the domain and certificate only. The management site does not yet proxy OAuth2 paths to the auth component. Sign-in needs that Nginx route. Recheck saved tunnel callbacks if the domain changes.",
"builtinBaseTip": "Uses the system HTTPS domain automatically. The auth component listens locally; sync public routes on the Feishu / OIDC Identity page after starting the tunnel.",
"reuseDomain": "Use current public domain",
"linkedDomain": "Using the HTTPS domain from system settings; you can edit it.",
"listenPort": "Local auth service port",
"portTip": "Listens only on 127.0.0.1; no public access needed. New tunnels increment from 19090; +/- and manual entry skip configured and locally occupied ports.",
"portLookupFailed": "Could not find an available port. Retry or enter one manually.",
"callbackTitle": "Register this callback with the final OIDC provider",
"callbackTip": "With an identity broker, register this URL in the broker's OIDC client, and register the broker's upstream callback in Feishu. Reverse proxy the public endpoint to 127.0.0.1:{port}; :18080 does not handle this callback.",
"builtinCallbackTitle": "The VPN client and Feishu app use different callbacks",
"builtinCallbackTip": "The VPN client callback above is handled by openvpn-auth-oauth2. Register only the Feishu app callback below in Feishu. After starting the tunnel, sync /oauth2/ to local port 127.0.0.1:{port} on the Feishu / OIDC Identity page.",
"feishuCallbackLabel": "Feishu app callback",
"testTip": "Install openvpn-auth-oauth2 and OpenVPN ≥ 2.6.2, then test with a WebAuth-capable client (e.g. OpenVPN Community for Windows or Tunnelblick/Viscosity for macOS). OpenVPN Connect v3 needs individual testing.",
"startFailed": "Configuration generated, but the tunnel did not start. Resolve the error below and retry from the tunnel list.",
"fillRequired": "Configure an identity source, OIDC issuer, VPN client credentials, and public sign-in URL"
},
"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",
"coreOptions": "Core Connection Settings",
"advancedOptions": "Detailed Settings",
"trafficMode": "Traffic Egress",
"trafficGateway": "All Traffic via VPN Gateway",
"trafficStatic": "Static Routes Only",
"trafficCustom": "Custom",
"trafficGatewayTip": "Routes all client traffic through the VPN gateway with NAT egress.",
"trafficStaticTip": "Pushes only the target networks below and preserves the client's default Internet route.",
"trafficCustomTip": "Control the default route, static routes, and NAT separately in detailed settings.",
"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",
"onDemandHint": "Dependencies are checked without installing anything. Choose a protocol, then install only that protocol's missing dependencies from its card.",
"installCmd": "Install Command",
"customPlugin": "Custom Protocol Plugin",
"customScene": "Custom Integration",
"tunnelName": "Tunnel Name",
"namePlaceholder": "e.g., HQ-Branch Interconnect",
"protocolType": "Protocol Type",
"reselect": "Reselect",
"coreOptions": "Core Connection Settings",
"trafficMode": "Traffic Egress",
"trafficGateway": "All Traffic via VPN Gateway",
"trafficStatic": "Static Routes Only",
"trafficCustom": "Custom",
"trafficGatewayTip": "Routes all client traffic through the VPN gateway with NAT egress.",
"trafficStaticTip": "Pushes only the target networks below and preserves the client's default Internet route.",
"trafficCustomTip": "Control the default route, static routes, and NAT separately in detailed settings.",
"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}",
"groupEmployee": "Employee access",
"groupSite": "Site interconnect",
"groupPenetrate": "Intranet penetration",
"groupMore": "More"
},
"users": {
"title": "Admins",
"clientLoginHint": "These accounts sign in to the admin console. Desktop VPN clients use dial-in accounts assigned to a WireGuard line.",
"batchImport": "Batch Import",
"ldapImport": "LDAP Import",
"addUser": "Add User",
"role": "Role",
"roleAdmin": "Admin",
"roleOperator": "Operator",
"roleViewer": "Viewer",
"noUsers": "No users yet",
"ldapTitle": "LDAP / Active Directory",
"ldapHint": "LDAP users can be auto-synced on first login, or pre-imported using the \"LDAP Import\" on the left.",
"ldapConfigHint": "Configure an LDAP server for centralized identity authentication",
"ldapEnabled": "Enable LDAP",
"ldapServerAddress": "LDAP Server Address",
"ldapServerAddressPlaceholder": "e.g. 8.217.205.92 or ldap.example.com",
"ldapPort": "Port",
"ldapProtocol": "Protocol",
"ldapProtocolLDAPS": "LDAPS (Recommended)",
"ldapProtocolLDAP": "LDAP",
"bindDn": "Administrator Bind DN",
"bindPassword": "Administrator Password",
"keepOriginal": "Leave empty to keep original",
"baseDn": "Base DN (User Search Base)",
"userFilter": "Search Filter (optional; %s is the username)",
"enableLdaps": "Enable LDAPS (SSL encryption)",
"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",
"ldapTestRequired": "Test the LDAP connection successfully before saving",
"ldapConnectFailed": "Connection failed",
"emptyUsername": "(empty)",
"errorDetails": "Error details:"
},
"clientDevices": {
"title": "Client Devices",
"hint": "Devices registered by desktop/mobile clients; revocation takes effect immediately",
"deviceName": "Device",
"platform": "Platform",
"tunnel": "Line",
"address": "Assigned IP",
"lastHandshake": "Last Handshake",
"revoked": "Revoked",
"revoke": "Revoke",
"revokeConfirm": "The device will be disconnected immediately and cannot reconnect. Continue?",
"revokeDone": "Device revoked",
"empty": "No client devices registered"
},
"vpnUsers": {
"title": "Dial-in Accounts",
"mfaHint": "OpenVPN Two-Factor Auth (TOTP / Static Challenge / PIN+OTP)",
"addUser": "Add User",
"bulkImport": "Bulk Import",
"bulkImportTitle": "Import Platform Users",
"bulkImportHint": "Only OpenVPN supports platform local or LDAP account imports. Create dedicated accounts for L2TP/IKEv2.",
"importSelected": "Import Selected",
"importedCount": "Imported {count} users",
"importFailed": "Bulk import failed",
"selectOpenVPNTunnel": "Select OpenVPN Tunnel",
"selectTunnelAndUsers": "Select an OpenVPN tunnel and platform users",
"searchPlaceholder": "Search username, name, or email",
"allTunnels": "All Tunnels",
"selectedUsers": "{count} users selected",
"batchDelete": "Bulk Delete",
"batchDeleteConfirm": "Delete the selected {count} VPN dial-in users?",
"batchDeleteDone": "Selected VPN dial-in users deleted",
"displayName": "Name",
"tunnel": "Tunnel",
"otpMfa": "OTP / MFA",
"bound": "Bound",
"unbound": "Unbound",
"locked": "Locked",
"lastOnline": "Last Online",
"downloadConfig": "Download Config",
"otpManagement": "OTP Management",
"addVpnUserTitle": "Add Dial-in Account",
"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.",
"mfaNotEnabled": "Two-factor authentication is not enabled",
"mfaDisabledHint": "Bind an Authenticator app to require a one-time code when this user signs in to VPN.",
"mfaEnabledHint": "This user must provide both their password and a one-time code to sign in to VPN.",
"mfaSetupIntro": "Bind an Authenticator app to protect this user's VPN dial-in access.",
"manualSetup": "Can't scan? Use a manual key",
"verifySetup": "Confirm Binding",
"verifySetupHint": "After scanning in Authenticator, enter the current 6-digit code to verify the binding.",
"securityDetails": "Security Details",
"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",
"totpCompatible": "TOTP standard (compatible with Google/Microsoft Authenticator)",
"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",
"identityUnknown": "Identity unknown",
"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"
},
"logs": {
"auditTitle": "Audit Logs",
"connTitle": "Connection Logs",
"alertTitle": "Traffic Alerts",
"statsTitle": "Log Statistics",
"keywordPlaceholder": "Search target/detail",
"startDate": "Start Date",
"endDate": "End Date",
"exportCsv": "Export CSV",
"exportFailed": "Could not export logs. Please retry.",
"eventType": "Event Type",
"tunnelId": "Tunnel ID",
"auditCount": "Audit Logs",
"sessionCount": "Sessions",
"from": "From",
"cleanup": "Cleanup Logs",
"cleanupHint": "Delete log data older than specified days",
"cleanupPrompt": "Keep logs from the last how many days?",
"cleanupInputError": "Please enter a positive integer",
"cleanupDone": "Cleanup done: {audit} audit logs, {session} session records",
"loadFailed": "Failed to load logs",
"noAlerts": "No traffic alerts"
},
"identity": {
"tab": "Feishu identity",
"title": "Built-in Feishu identity service",
"description": "Issue OIDC identities for VPN using your existing HTTPS domain. Feishu app credentials stay upstream; this platform creates separate VPN client credentials.",
"guideTitle": "Feishu app setup",
"guideApp": "Enter the enterprise app ID and secret; grant the three scopes below as needed.",
"guidePermission": "",
"guidePublish": "Publish the app and include VPN users in its availability scope.",
"guideCallback": "Security Settings → Redirect URL:",
"guideCallbackPending": "Configure an HTTPS domain first.",
"guideVerify": "",
"guideManual": "",
"guideScope": "",
"tenantPermission": "tenant:tenant:readonly · enterprise lookup",
"userPermission": "contact:user.base:readonly · browser sign-in",
"basicProfilePermission": "contact:user.basic_profile:readonly · name lookup by open_id (app identity)",
"permissionSteps": "Grant the app identity scope and publish the app; after a member signs in, check their name below.",
"openFeishuPermission": "Open Feishu permissions ↗",
"checkNamePending": "Check name below",
"checking": "Checking",
"checked": "Verified",
"checkFailed": "Check failed",
"checkPending": "Not checked",
"checkedByLogin": "Login verified",
"loginPending": "Verify on first login",
"appId": "Feishu App ID",
"appSecret": "Feishu App Secret",
"secretPlaceholder": "Leave blank if saved; enter a new secret to rotate",
"tenant": "Allowed Feishu tenant_key",
"tenantPlaceholder": "Fetched automatically or enter manually",
"fetchTenant": "Check again",
"fetchingTenant": "Checking ({seconds}s)…",
"tenantFetched": "Enterprise permission verified",
"tenantFailed": "Enterprise permission check failed",
"tenantNotEnabled": "",
"enabled": "Enable built-in issuer",
"httpsOnly": "You are on HTTP. You can still configure identity; prefer the HTTPS public Base URL in production.",
"openHttps": "Open HTTPS management site",
"httpsRequired": "Built-in issuer needs a configured public entry; HTTP is allowed when scheme/port are set.",
"gatewayPending": "The identity provider is saved but Nginx does not yet route /id/; sync the gateway.",
"addresses": "Addresses and client credentials",
"issuer": "OIDC issuer",
"feishuCallback": "Callback registered in Feishu",
"vpnCallback": "VPN client callback",
"clientId": "VPN Client ID",
"oneTimeSecret": "New VPN Client Secret is displayed only once. Store it safely; rotation of active tunnel credentials requires separate planning.",
"routeHint": "Sync identity routes first. After starting the one OpenVPN OIDC tunnel using this domain, sync again to route /oauth2/ to its local auth component.",
"syncGateway": "Sync identity gateway",
"gatewaySynced": "Gateway routes updated",
"gatewayFailed": "Gateway update failed",
"loadFailed": "Could not load identity settings",
"saved": "Identity settings saved",
"saveFailed": "Could not save identity settings",
"pageDescription": "Configure Feishu app credentials, OIDC issuer, and directory sync.",
"credentialsTitle": "Credentials",
"addressSyncTitle": "Addresses & sync",
"tagEnabled": "Enabled",
"tagDisabled": "Disabled",
"tagTlsOk": "Entry ready",
"tagTlsPending": "Entry pending",
"tagGatewayOk": "Gateway synced",
"tagGatewayPending": "Gateway pending",
"tagDirSynced": "Directory synced",
"tagDirIdle": "Directory idle",
"retryGateway": "Retry gateway sync",
"goPublicEntry": "Open public entry"
},
"settings": {
"pageDescription": "Manage account security, the public gateway, and server setup.",
"securityTab": "Account Security",
"gatewayTab": "Public Gateway",
"hostTab": "Server Setup",
"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)",
"auditMigrated": "Audit logs have been moved to Operation Audit with pagination, filtering, and CSV export",
"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",
"identityMovedHint": "Feishu / OIDC platform settings moved to a dedicated sidebar page; they are no longer configured here.",
"identityMovedLink": "Open Feishu / OIDC Identity"
},
"plugins": {
"title": "Custom Protocol Plugins (Preview)",
"registerPlugin": "Register Plugin",
"commandHooks": "command hooks",
"pluginHint": "Plugins implement the unified protocol contract via {hooks}: the platform pipes tunnel config JSON to hook commands via stdin.",
"pluginContract": "Contract: {contract}; Status hook outputs {running} or {stopped} 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",
"soonHint": "Protocol plugins are an early preview; contracts and stability are still evolving."
},
"nodes": {
"title": "Node Management (Preview)",
"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.",
"soonHint": "Node management is an early multi-relay entry point; use with caution in production."
},
"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."
},
"alertSettings": {
"title": "Lark alerts",
"hint": "The rate threshold detects traffic spikes; per-tunnel quotas remain in tunnel details. Notifications are off by default.",
"threshold": "Spike threshold (Mbps)",
"webhook": "Feishu / Lark group bot webhook",
"secret": "Signing secret (optional)",
"optional": "Set if bot signing is enabled",
"keepWebhook": "Configured; leave blank to keep",
"keepSecret": "Configured; leave blank to keep",
"enabled": "Send traffic alerts automatically",
"secretHint": "Webhook and signing secret are never shown after saving. The same tunnel event is sent at most once every 5 minutes.",
"configure": "Alert settings",
"logHint": "Traffic spikes use the platform threshold; quota alerts use each tunnel's traffic policy.",
"save": "Save settings",
"clear": "Remove bot",
"clearConfirm": "This stops notifications and removes bot credentials. In-app alerts remain. Continue?",
"cleared": "Bot configuration removed",
"saved": "Alert settings saved",
"test": "Send test message",
"testSent": "Test message sent; check the group",
"loadFailed": "Could not load alert settings",
"saveFailed": "Could not save alert settings",
"testFailed": "Could not send test message"
},
"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)",
"advancedOptions": "Advanced settings · IKE / ESP",
"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 (Preview)",
"users": "Admins",
"vpnUsers": "Dial-in Accounts",
"clientDevices": "Client Devices",
"plugins": "Protocol Plugins (Preview)",
"settings": "Settings",
"logs": "Operation Audit",
"notFound": "Page Not Found",
"sidebarOps": "Tunnels",
"sidebarResource": "Identity & Devices",
"sidebarSystem": "System",
"sidebarWorkspace": "Workspace",
"console": "Admin Console",
"navigation": "Main navigation",
"openNavigation": "Open navigation",
"closeNavigation": "Close navigation",
"collapseNavigation": "Collapse sidebar",
"expandNavigation": "Expand sidebar",
"identityAccess": "Feishu / OIDC Identity",
"sidebarIntegration": "Integrations"
},
"protocolIcon": {
"custom": "Custom Protocol"
},
"tls": {
"title": "Domain & certificate",
"description": "Configure a public domain and use Nginx / Certbot for HTTP-01 issuance and renewal.",
"domain": "Configured domain",
"activeDomain": "Active domain",
"saveDomain": "Save domain",
"restartRequired": "Public entry saved; check the gateway site status",
"siteActivationRequired": "Entry saved; prepare and enable the Nginx site below for first use",
"pendingEntry": "Nginx still serves {address}; save to validate and apply the new entry",
"applied": "Public entry updated; Nginx configuration is active",
"saveFailed": "Could not save domain",
"dns": "DNS",
"certificate": "Certificate",
"valid": "Valid",
"pending": "Pending first HTTPS handshake",
"notConfigured": "Disabled",
"saved": "Public entry saved",
"issuer": "Issuer",
"expires": "Expires",
"renewal": "Renewal",
"automatic": "Automatic (autocert)",
"ports": "HTTP / HTTPS ports",
"externalPorts": "Managed by external Nginx; listener status not checked",
"setupHint": "Nginx owns the public gateway. Active sites reload on save; initial HTTPS setup needs a certificate.",
"refresh": "Refresh status",
"openHttps": "Open HTTPS health check",
"loadFailed": "Could not load certificate status",
"legacyModeHint": "This server still uses the legacy Go public listener. Migrate to Nginx using the deployment guide before editing the gateway.",
"nginxHint": "An active Nginx gateway reloads on save. Initial setup requires enabling the site separately; the management service remains on port 18080.",
"externalRenewal": "Managed by Certbot",
"previewNginx": "Preview Nginx configuration",
"previewOnly": "Configuration preview; HTTP handles issuance and HTTPS starts after the certificate exists.",
"httpSite": "HTTP-01 site",
"httpsSite": "HTTPS management site",
"siteStage": "Site stage",
"stage_none": "Inactive",
"stage_http": "HTTP-01 ready; certificate pending",
"stage_https": "HTTPS configuration enabled",
"activateSite": "Enable site and issue certificate",
"activateHint": "Checks existing sites and ports first. Certbot registration uses no email address, so renewal failures cannot be reported by email.",
"siteReady": "HTTPS site and certificate are ready",
"siteFailed": "Gateway or certificate setup failed; see output",
"directPortWarning": "The management service still listens publicly on port 18080, bypassing Nginx path rules. Migrate clients using the old HTTP address, then bind the service to 127.0.0.1:18080.",
"setupTitle": "Nginx gateway and certificate",
"setupStepCheck": "Detect system",
"setupStepInstall": "Install dependencies",
"setupStepConfigure": "Configure gateway and certificate",
"detectedSystem": "Server OS",
"setupUnsupported": "Automatic setup requires root on Ubuntu or TencentOS Server 4",
"setupScope": "Installs Nginx / Certbot and prepares the validation directory. It does not install VPN protocol dependencies, enable ports, or issue certificates.",
"setupButton": "Prepare Nginx / Certbot",
"setupComplete": "Dependencies are ready; configure the site and certificate next",
"setupFailed": "Initialization failed; inspect the output",
"setupInterrupted": "Log connection interrupted; refresh status. Installation may still be running on the server",
"commonSetupTitle": "First-time shared network setup",
"commonSetupHint": "Check permissions, default route and IPv4 forwarding. Enable shared forwarding only when needed; install protocol-specific dependencies separately in Create Tunnel.",
"hostRoot": "Privileges",
"hostRoute": "Default route",
"hostForward": "IPv4 forwarding",
"enableForwarding": "Enable IPv4 forwarding",
"forwardingEnabled": "IPv4 forwarding enabled",
"publicEntryTitle": "Public entry",
"publicEntryDesc": "Scheme, host, and port define the public Base URL used by the OIDC issuer, Feishu identity, and tunnel callbacks.",
"scheme": "Scheme",
"host": "Domain / IPv4 address",
"port": "Port",
"publicBase": "Public Base URL",
"publicBaseHint": "Generated from scheme, address and port; no input needed. Feishu / OIDC callbacks use this address.",
"httpRisk": "HTTP is plaintext. Prefer HTTPS in production; HTTP is for intranet or temporary ICP workarounds.",
"saveEntry": "Save public entry",
"hostRequired": "Enter a domain or IPv4 address",
"certListTitle": "Certificates",
"addCert": "Add certificate",
"replaceCert": "Replace",
"certSource": "Source",
"sourceUpload": "Upload",
"sourceHttp01": "HTTP-01",
"noCerts": "No certificates yet",
"renewalFailed": "Renewal failed",
"methodUpload": "Upload existing certificate",
"methodHttp01": "Request free certificate",
"certPem": "Certificate",
"keyPem": "Private key",
"certPemPlaceholder": "Paste PEM certificate or upload .crt / .pem",
"keyPemPlaceholder": "Paste PEM private key or upload .key",
"uploadCertFile": "Upload certificate file (.crt)",
"uploadKeyFile": "Upload private key file (.key)",
"applyEmail": "Email",
"multiDomainHint": "Domain name",
"http01Hint": "Let’s Encrypt HTTP-01. Port 80 must be reachable. Auto-renewal status appears in the list.",
"certKeyRequired": "Certificate and private key are required",
"certUploaded": "Certificate uploaded",
"uploadApiPending": "Upload API is not ready yet (POST /system/tls/certificate). Use HTTP-01 for now.",
"dropHint": "Drop a file here, or click to choose",
"pastePem": "Or paste PEM text",
"importCert": "Import certificate",
"startIssue": "Start issuance",
"http01CheckDns": "DNS already points to this public entry",
"http01CheckPort": "Issuance port is reachable (usually 80, or matches entry port)"
},
"feishuSync": {
"title": "Feishu directory",
"publishAll": "Publish the Feishu app, set availability to All Employees, and include departments in directory visibility.",
"hint": "Sync manually or every 30 minutes; imports do not grant VPN access.",
"permissions": "Grant department and user-list access; Feishu error codes show missing permissions.",
"liveCheck": "Access check",
"recheck": "Check again",
"checking": "Checking…",
"checkFailed": "Access check failed",
"liveVisibility": "App visibility: {departments} departments · {users} individual users (not the enterprise total)",
"scopeMissing": "Departments are not visible. Check department access and directory scope, then publish.",
"permissionMissing": "Departments: {department}; users: {users}. Grant scopes indicated by the error codes.",
"apiReady": "Endpoints work. Confirm publication and All Employees in Feishu.",
"ok": "Available",
"auto": "Auto sync (30 min)",
"run": "Sync now",
"lastSuccess": "Last success",
"counts": "Departments {departments} · members {members}",
"visibility": "Last scope: {departments} departments · {users} individual users",
"noDepartments": "Departments are not visible yet. Check the app's access and directory scope.",
"numberName": "Feishu still returns a 'User + number' name. Sync saved that value; if you just renamed them, check app visibility and retry later.",
"name": "Name",
"departments": "Department IDs",
"firstMembers": "Showing the first 500 members",
"saved": "Sync settings saved",
"started": "Sync started",
"done": "Directory sync complete",
"failed": "Directory sync failed"
},
"feishuDirectory": {
"title": "Feishu directory lookup",
"hint": "After sign-in, check the name. The basic name API requires the app identity scope contact:user.basic_profile:readonly and a published app.",
"choose": "Select a signed-in member",
"check": "Check name",
"found": "Directory name: {name}",
"basicUnavailable": "The basic name API did not return a result. Grant app identity scope contact:user.basic_profile:readonly and publish the app.",
"failed": "Lookup failed"
},
"feishuAdmission": {
"title": "Feishu member access",
"mode": "Who can connect",
"all": "All coworkers in this tenant",
"allowlist": "Selected members only",
"modeHint": "Members appear here after their first Feishu sign-in. Add them before enabling the allowlist; revocation applies to their next login.",
"members": "Authorized members",
"choose": "Select a member who has signed in",
"add": "Add",
"remove": "Revoke",
"empty": "No authorized members",
"saveFirst": "Save the built-in Feishu tunnel before managing members.",
"adminOnly": "Only administrators can manage member access.",
"loadFailed": "Could not load Feishu members"
},
"protocols": {
"wireguard": {
"name": "WireGuard",
"desc": "High-performance modern VPN with kernel-level implementation, roaming-friendly",
"scenes": "Internal Access / Mobile Office",
"fields": {
"address": {
"label": "Server VPN Subnet Address",
"tip": "Server's address within the VPN subnet (CIDR)"
},
"auth_mode": {
"label": "Client Authentication",
"tip": "Account login grants a device; the tunnel uses key authentication. Static peers still connect by key. Browser OIDC requires a client callback and explicit user grants.",
"options": {
"password": "Client account + device key",
"oidc": "Third-party OAuth2 / OIDC (not available yet)"
}
},
"listen_port": {
"label": "Listen Port"
},
"client_address": {
"label": "First Client Address",
"tip": "Add more peers in the detail page after creation"
},
"public_endpoint": {
"label": "Public Endpoint",
"tip": "For client connections — public IP:port"
},
"dns": {
"label": "DNS"
},
"allowed_ips": {
"label": "Client AllowedIPs",
"tip": "Use 0.0.0.0/0 for full tunnel; specify internal CIDRs for split tunnel"
},
"latency_probe": {
"label": "Tunnel probe target",
"tip": "Reachable IP:port through this line, e.g. 10.88.0.1:22; defaults to 223.5.5.5:443. Measures TCP setup time."
},
"keepalive": {
"label": "Keepalive (sec)",
"tip": "Recommended 15–25 for clients behind NAT"
},
"mtu": {
"label": "MTU",
"tip": "0 for default; common range 1280–1420 over public networks"
},
"enable_nat": {
"label": "Enable NAT Outbound",
"tip": "Enable when clients need internet or other subnet access"
},
"egress_interface": {
"label": "NAT Egress Interface",
"tip": "Leave empty to auto-detect the default route interface"
}
}
},
"ipsec": {
"name": "IPSec Site-to-Site",
"desc": "Site-to-site connectivity with third-party devices (Cisco/Huawei/FortiGate, etc.)",
"scenes": "Third-Party Integration / Site-to-Site",
"fields": {
"vendor_template": {
"label": "Vendor Template",
"tip": "Auto-fills Phase 1/Phase 2 proposals, still manually editable",
"options": {
"generic": "Generic Standard (Recommended)",
"cisco": "Cisco ISR/ASR",
"fortigate": "FortiGate",
"huawei": "Huawei USG/AR",
"h3c": "H3C"
}
},
"public_endpoint": {
"label": "Local Public IP"
},
"remote_gateway": {
"label": "Remote Gateway"
},
"local_subnets": {
"label": "Local Subnets",
"tip": "Separate multiple subnets with commas"
},
"remote_subnets": {
"label": "Remote Subnets"
},
"psk": {
"label": "Pre-Shared Key (PSK)"
},
"ike_version": {
"label": "IKE Version",
"options": {
"ikev2": "IKEv2",
"ikev1": "IKEv1"
}
},
"ike_proposal": {
"label": "Phase 1 Proposal",
"tip": "Encryption-Auth-DH group, must match remote side"
},
"esp_proposal": {
"label": "Phase 2 Proposal"
},
"pfs_group": {
"label": "PFS DH Group"
},
"ike_lifetime": {
"label": "IKE Lifetime (sec)"
},
"local_id": {
"label": "Local ID"
},
"remote_id": {
"label": "Remote ID"
}
}
},
"ikev2": {
"name": "IKEv2 Remote Access",
"desc": "Native VPN dial-in from phones and laptops, more modern than L2TP",
"scenes": "Remote Office / Native VPN",
"fields": {
"public_endpoint": {
"label": "Server Public Address"
},
"local_id": {
"label": "Server ID / Remote ID",
"tip": "Must match the client's Remote ID"
},
"psk": {
"label": "Machine Auth PSK",
"tip": "Leave empty to auto-generate; shared key for iOS/Android"
},
"address_pool": {
"label": "Client Address Pool"
},
"dns": {
"label": "Push DNS"
},
"local_ts": {
"label": "Allowed Subnets",
"tip": "0.0.0.0/0 for full tunnel; change to internal CIDR for split tunnel"
},
"ike_proposal": {
"label": "IKE Proposal"
},
"esp_proposal": {
"label": "ESP Proposal"
}
}
},
"l2tp": {
"name": "L2TP/IPSec",
"desc": "Best compatibility — natively supported by phones, legacy devices, and routers",
"scenes": "Mobile Devices / Legacy Compatibility",
"fields": {
"public_endpoint": {
"label": "Server Public IP"
},
"psk": {
"label": "IPSec Pre-Shared Key",
"tip": "Leave blank to generate a high-strength random key; retrieve it securely from client configuration after creation"
},
"ip_range": {
"label": "Client Address Pool"
},
"local_ip": {
"label": "Server Tunnel Address"
},
"dns": {
"label": "Push DNS"
}
}
},
"gre": {
"name": "GRE Tunnel",
"desc": "Standard IP protocol 47 tunnel for point-to-point Layer 3 connectivity between Linux, routers, and firewalls",
"scenes": "Network Device Interconnect / Site-to-Site Routing",
"fields": {
"local_endpoint": {
"label": "Local Public IP"
},
"remote_endpoint": {
"label": "Remote Public IP"
},
"local_tunnel_ip": {
"label": "Local Tunnel IP",
"tip": "Use a /30, for example 10.255.0.1/30"
},
"remote_tunnel_ip": {
"label": "Remote Tunnel IP",
"tip": "Must share the local tunnel IP subnet"
},
"remote_subnet": {
"label": "Remote LAN Subnet",
"tip": "Adds a static route through the GRE peer"
},
"enable_nat": {
"label": "NAT Remote Traffic",
"tip": "Enable only when the remote subnet needs Internet egress via this host"
},
"outbound_interface": {
"label": "NAT Egress Interface"
},
"ttl": {
"label": "TTL"
},
"mtu": {
"label": "GRE MTU",
"tip": "1476 is typical over public Internet GRE; lower it for additional encapsulation"
}
}
},
"frp": {
"name": "FRP NAT Traversal",
"desc": "TCP/UDP/HTTP port forwarding and reverse proxy for NAT traversal",
"scenes": "NAT Traversal / Port Forwarding",
"fields": {
"mode": {
"label": "Mode",
"tip": "server = frps (public side), client = frpc (LAN side)",
"options": {
"server": "server (frps — public side)",
"client": "client (frpc — LAN side)"
}
},
"bind_port": {
"label": "Bind Port (server)"
},
"public_endpoint": {
"label": "Public Address (server)"
},
"dashboard_port": {
"label": "Dashboard Port (server)"
},
"dashboard_user": {
"label": "Dashboard User (server)"
},
"dashboard_password": {
"label": "Dashboard Password (server)",
"tip": "Auto-generates a strong password if left empty; keeps current password when editing"
},
"vhost_http_port": {
"label": "HTTP VHost Port",
"tip": "0 = disabled; must be >0 for HTTP proxying"
},
"vhost_https_port": {
"label": "HTTPS VHost Port",
"tip": "0 = disabled"
},
"allow_ports": {
"label": "Allowed Port Range",
"tip": "Restricts which remotePorts frpc can request"
},
"server_addr": {
"label": "frps Address (client)"
},
"server_port": {
"label": "frps Port (client)"
},
"token": {
"label": "Auth Token",
"tip": "Leave empty to auto-generate"
},
"proxy_name": {
"label": "Proxy Name"
},
"proxy_type": {
"label": "Proxy Type",
"options": {
"tcp": "TCP",
"udp": "UDP",
"http": "HTTP",
"https": "HTTPS",
"stcp": "STCP (Secure P2P)",
"xtcp": "XTCP (P2P)"
}
},
"local_ip": {
"label": "Local Target IP"
},
"local_port": {
"label": "Local Target Port"
},
"remote_port": {
"label": "Public Mapped Port"
},
"custom_domains": {
"label": "Custom Domains",
"tip": "Required for HTTP/HTTPS proxy"
},
"secret_key": {
"label": "STCP/XTCP Secret Key",
"tip": "Must match between visitor and server"
}
}
},
"openvpn": {
"name": "OpenVPN",
"desc": "Most mature open-source VPN, compatible with legacy systems and projects",
"scenes": "Legacy Compatibility / General Access",
"fields": {
"public_endpoint": {
"label": "Public Endpoint"
},
"port": {
"label": "Port"
},
"proto": {
"label": "Transport Protocol",
"tip": "Can be switched in edit mode; requires tunnel restart and client re-download",
"options": {
"udp": "UDP (Recommended, better performance)",
"tcp-server": "TCP (More stable through restrictive networks)"
}
},
"subnet": {
"label": "VPN Subnet",
"tip": "e.g., 10.8.0.0 255.255.240.0 for more clients (/20)"
},
"cipher": {
"label": "Cipher",
"options": {
"AES-256-GCM": "AES-256-GCM",
"AES-128-GCM": "AES-128-GCM",
"AES-256-CBC": "AES-256-CBC"
}
},
"auth_mode": {
"label": "Authentication Mode",
"tip": "Password mode aligns with verify-client-cert none + username-as-common-name",
"options": {
"certificate": "Certificate Only",
"password": "Username + Password",
"certificate+password": "Certificate + Password",
"oidc": "Third-party OAuth2 / OIDC (Feishu)"
}
},
"mfa_mode": {
"label": "Dial-in MFA (2FA)",
"tip": "static-challenge + TOTP; manage OTP in VPN Dial-in Users",
"options": {
"off": "Disabled",
"optional": "Optional (verified after user binds)",
"required": "Required (all dial-in users must use MFA)"
}
},
"otp_slop": {
"label": "OTP Clock Tolerance (sec)"
},
"otp_max_failures": {
"label": "OTP Lockout Threshold"
},
"otp_lockout_sec": {
"label": "OTP Lockout Duration (sec)"
},
"otp_disallow_reuse": {
"label": "Disallow OTP Reuse"
},
"dns": {
"label": "Push DNS"
},
"redirect_gateway": {
"label": "Full Tunnel",
"tip": "When off, only pushes internal routes below (common in production)"
},
"push_routes": {
"label": "Push Routes",
"tip": "One IP or CIDR per line; # comments are supported",
"placeholder": "# VPC networks\n172.16.0.0/16\n# Staging\n43.129.24.233",
"format_error": "Invalid route format: {route}"
},
"enable_nat": {
"label": "Enable NAT Outbound"
},
"max_clients": {
"label": "Max Clients",
"tip": "0 = unlimited; 1000 is common in production"
},
"keepalive_interval": {
"label": "Keepalive Interval",
"tip": "Production typical: keepalive 5 30"
},
"keepalive_timeout": {
"label": "Keepalive Timeout"
},
"tun_mtu": {
"label": "tun-mtu",
"tip": "Production typical: 1500"
},
"tun_mtu_extra": {
"label": "tun-mtu-extra"
},
"mssfix": {
"label": "mssfix",
"tip": "0 = unset; TCP production typical 1450; defaults to 1450 when TCP is selected"
},
"duplicate_cn": {
"label": "Allow duplicate-cn",
"tip": "Same username/cert on multiple devices simultaneously; auto-enabled in password mode"
},
"reneg_sec": {
"label": "reneg-sec",
"tip": "0 = disable TLS re-negotiation (recommended for production/MFA); cert-only default can be 3600"
},
"run_as_user": {
"label": "Drop Privileges User",
"tip": "Maps to 'user openvpn'; user must exist on the system; leave empty to run as root"
},
"run_as_group": {
"label": "Drop Privileges Group",
"tip": "Maps to 'group openvpn'"
}
}
},
"custom": {
"fields": {
"endpoint": {
"label": "Endpoint"
},
"token": {
"label": "Auth Credential"
},
"extra": {
"label": "Extra Parameters (JSON)"
}
}
}
}
}