mirror of
https://github.com/Rain-kl/OpenFlare.git
synced 2026-09-28 05:46:36 +08:00
4405 lines
201 KiB
JSON
4405 lines
201 KiB
JSON
{
|
||
"common": {
|
||
"save": "Save",
|
||
"cancel": "Cancel",
|
||
"confirm": "Confirm",
|
||
"delete": "Delete",
|
||
"loading": "Loading...",
|
||
"retry": "Retry",
|
||
"optional": "(optional)",
|
||
"settings": "Settings",
|
||
"search": "Search",
|
||
"unknownError": "Something went wrong. Please try again.",
|
||
"loadFailed": "Load failed"
|
||
},
|
||
"layout": {
|
||
"nav": {
|
||
"home": "Home",
|
||
"myFiles": "My Files",
|
||
"users": "Users",
|
||
"tasks": "Tasks",
|
||
"storage": "Storage",
|
||
"database": "Database",
|
||
"push": "Notifications",
|
||
"messageGateway": "Messaging",
|
||
"logs": "System Logs",
|
||
"system": "System Config",
|
||
"adminSettings": "System Settings",
|
||
"demo": "Demo",
|
||
"apiDocs": "API Docs",
|
||
"usageDocs": "User Guide",
|
||
"dashboard": "Dashboard",
|
||
"nodes": "Nodes",
|
||
"proxyRoutes": "Proxy Routes",
|
||
"websites": "Domains",
|
||
"certificates": "TLS Certificates",
|
||
"dnsAccounts": "DNS Accounts",
|
||
"cloudflare": "Cloudflare",
|
||
"origins": "Origins",
|
||
"responses": "Response Pages",
|
||
"waf": "WAF",
|
||
"ipGroups": "IP Groups",
|
||
"rateLimits": "Rate Limits",
|
||
"pages": "Pages",
|
||
"configVersions": "Releases",
|
||
"accessLogs": "Access Logs",
|
||
"performance": "Performance",
|
||
"applyLogs": "Apply Logs"
|
||
},
|
||
"groups": {
|
||
"admin": "Admin",
|
||
"docs": "Docs",
|
||
"security": "Security",
|
||
"websites": "Websites"
|
||
},
|
||
"user": {
|
||
"adminRole": "Administrator",
|
||
"userRole": "User",
|
||
"notLoggedIn": "Not signed in",
|
||
"syncing": "Syncing account",
|
||
"profile": "My Profile",
|
||
"settings": "Settings",
|
||
"help": "Help",
|
||
"logout": "Sign out",
|
||
"unknownUser": "Unknown user"
|
||
},
|
||
"logoutDialog": {
|
||
"title": "Sign out",
|
||
"description": "Are you sure you want to sign out?",
|
||
"loggingOut": "Signing out…",
|
||
"confirm": "Sign out",
|
||
"inProgress": "Signing out…",
|
||
"failed": "Sign-out failed",
|
||
"failedDescription": "An error occurred while signing out. Please try again."
|
||
},
|
||
"header": {
|
||
"notifications": "Notifications",
|
||
"settings": "Settings",
|
||
"search": "Search",
|
||
"toggleFullWidth": "Toggle full width",
|
||
"toggleTheme": "Toggle theme",
|
||
"changePasswordBanner": "For your account security, please change your password now.",
|
||
"changePasswordAction": "Change password",
|
||
"bannerTitle": "Announcement",
|
||
"bannerLink": "Learn more",
|
||
"dismiss": "Dismiss",
|
||
"guest": "Guest"
|
||
},
|
||
"search": {
|
||
"categoryPage": "Page",
|
||
"categoryFeature": "Feature",
|
||
"categorySetting": "Setting",
|
||
"categoryAdmin": "Admin",
|
||
"tipPrefix": "Tips:",
|
||
"tipSlash": "You can also press / to open this dialog",
|
||
"tipArrow": "to navigate items",
|
||
"tipNewTab": "Open in new tab",
|
||
"tipDidYouKnow": "Did you know: search is still being improved",
|
||
"searchPlaceholder": "Search pages and features...",
|
||
"noResults": "No results found. Try a different term?",
|
||
"openInNewTab": "Open in new tab",
|
||
"open": "Open",
|
||
"closeSearch": "Close search",
|
||
"items": {
|
||
"globalSettings": "Settings",
|
||
"appearance": "Appearance",
|
||
"homeDesc": "Return to the console dashboard",
|
||
"usageDocsDesc": "View getting-started guides and integration examples",
|
||
"nodesDesc": "Manage edge nodes, relays, and intranet tunnels",
|
||
"proxyRoutesDesc": "Configure reverse proxies, match rules, WAF policies, and cache settings",
|
||
"websitesDesc": "Manage hosted domains, certificate bindings, and listeners",
|
||
"certificatesDesc": "Issue and manage SSL/TLS certificates with auto-renewal",
|
||
"dnsAccountsDesc": "Configure DNS provider credentials for certificate issuance and records",
|
||
"originsDesc": "Manage reverse-proxy backends and load-balancing groups",
|
||
"responsesDesc": "Configure origin error pages and offline fallback contact pages",
|
||
"wafDesc": "Configure Web Application Firewall rules to block malicious requests",
|
||
"ipGroupsDesc": "Define IP lists for allow/deny control in WAF or routes",
|
||
"rateLimitsDesc": "Configure default concurrency and bandwidth limits for edge sites",
|
||
"pagesDesc": "Upload or deploy static sites with global CDN hosting",
|
||
"configVersionsDesc": "View, compare, publish, and roll back configuration versions",
|
||
"accessLogsDesc": "Search full-site access logs and network analytics",
|
||
"applyLogsDesc": "View history of node config delivery, sync, and activation",
|
||
"performanceDesc": "Tune connections, proxy timeouts, and core performance settings",
|
||
"settingsDesc": "Configure personal application preferences",
|
||
"profileDesc": "Edit nickname, avatar, and profile attributes",
|
||
"appearanceDesc": "Configure the display theme (light/dark)",
|
||
"adminSettingsDesc": "Manage login, registration, and auth sources (admin only)",
|
||
"systemDesc": "Change core platform runtime configuration (admin only)",
|
||
"usersDesc": "Manage registered users and their status (admin only)",
|
||
"tasksDesc": "Dispatch and inspect background scheduled tasks (admin only)",
|
||
"storageDesc": "Browse, search, and clean files in object storage (admin only)",
|
||
"databaseDesc": "Monitor table size, browse physical tables, and run interactive SQL (admin only)",
|
||
"pushDesc": "Configure email, Lark, and Telegram notification channels (admin only)",
|
||
"logsDesc": "View system logs and background task execution logs (admin only)"
|
||
}
|
||
},
|
||
"error": {
|
||
"loadFailed": "Load failed",
|
||
"retry": "Retry",
|
||
"unknownError": "An unknown error occurred. Please try again later.",
|
||
"viewDetails": "View error details",
|
||
"unknownErrorShort": "Unknown error"
|
||
},
|
||
"loading": {
|
||
"loading": "Loading",
|
||
"loadingDesc": "Fetching data..."
|
||
},
|
||
"empty": {
|
||
"noData": "No data",
|
||
"noContent": "No records found"
|
||
}
|
||
},
|
||
"auth": {
|
||
"login": {
|
||
"title": "Sign in to your account",
|
||
"description": "Welcome back. Enter your credentials to continue.",
|
||
"username": "Email or username",
|
||
"usernamePlaceholder": "Enter email or username",
|
||
"password": "Password",
|
||
"passwordPlaceholder": "Enter your password",
|
||
"showPassword": "Show password",
|
||
"hidePassword": "Hide password",
|
||
"submit": "Sign in",
|
||
"submitting": "Signing in…",
|
||
"success": "Signed in successfully",
|
||
"failed": "Sign-in failed. Please try again.",
|
||
"incomplete": "Email/username or password is incomplete",
|
||
"incompleteDesc": "Please enter both email/username and password before signing in",
|
||
"capPending": "Human verification is still running…",
|
||
"capRequired": "Please complete human verification first",
|
||
"orUse": "Or continue with",
|
||
"oauthLogin": "Sign in with {name}",
|
||
"oauthFailed": "Third-party sign-in failed",
|
||
"noAccount": "Don't have an account?",
|
||
"registerNow": "Register",
|
||
"codeSent": "A sign-in code was sent to your email",
|
||
"codeTipMasked": "A sign-in code was sent to your secure email {email}.",
|
||
"codeTipGeneric": "Please enter your sign-in verification code.",
|
||
"needBind": "Your third-party account is not linked to a local account, and registration is closed. Sign in with an existing local account to bind it.",
|
||
"bindSuccess": "Account bound",
|
||
"checkingSession": "Checking sign-in status",
|
||
"checkingSessionDesc": "Please wait while we confirm your session...",
|
||
"redirecting": "Redirecting to the console...",
|
||
"verifyingCredentials": "Verifying credentials",
|
||
"establishingSession": "Please wait while we establish a secure session..."
|
||
},
|
||
"otp": {
|
||
"title": "Verify your sign-in",
|
||
"description": "Enter the 6-digit code sent to your secure email.",
|
||
"code": "Verification code",
|
||
"resend": "Resend",
|
||
"resendIn": "Resend in {seconds}s",
|
||
"submit": "Verify",
|
||
"submitting": "Verifying…",
|
||
"help": "Having trouble signing in?",
|
||
"contactSupport": "Contact support"
|
||
},
|
||
"register": {
|
||
"title": "Create your account",
|
||
"description": "Fill in the details below to get started.",
|
||
"username": "Username",
|
||
"usernamePlaceholder": "Enter username",
|
||
"nickname": "Nickname",
|
||
"nicknamePlaceholder": "Enter nickname",
|
||
"email": "Email",
|
||
"emailPlaceholder": "Enter email",
|
||
"password": "Password",
|
||
"passwordPlaceholder": "Enter password (at least 8 characters)",
|
||
"emailCode": "Email verification code",
|
||
"emailCodePlaceholder": "Enter 6-digit code",
|
||
"getCode": "Get code",
|
||
"resendIn": "Resend in {seconds}s",
|
||
"submit": "Create account",
|
||
"submitting": "Creating…",
|
||
"success": "Registered and signed in",
|
||
"failed": "Registration failed. Please try again.",
|
||
"closed": "Registration is currently disabled",
|
||
"codeSent": "Verification code sent to your email",
|
||
"sendCodeFailed": "Failed to send verification code",
|
||
"emailRequired": "Please enter an email address first",
|
||
"emailInvalid": "Please enter a valid email address",
|
||
"usernamePasswordRequired": "Username and password are required",
|
||
"passwordTooShort": "Password must be at least 8 characters",
|
||
"emailEmpty": "Email is required",
|
||
"codeRequired": "Verification code is required",
|
||
"capPending": "Human verification is still running…",
|
||
"capRequired": "Please complete human verification first",
|
||
"hasAccount": "Already have an account?",
|
||
"backToLogin": "Back to sign in"
|
||
},
|
||
"capWidget": {
|
||
"clickToStart": "Click to start verification",
|
||
"waitingVerification": "Waiting for verification…",
|
||
"verifying": "Completing verification…",
|
||
"verificationPassed": "Verification passed",
|
||
"verificationFailed": "Verification failed",
|
||
"retry": "Retry"
|
||
},
|
||
"requireAuth": {
|
||
"accessDenied": "Access denied",
|
||
"noPermission": "You don't have permission to access this page"
|
||
}
|
||
},
|
||
"settings": {
|
||
"title": "Settings",
|
||
"categories": {
|
||
"personal": "Personal",
|
||
"account": "Account"
|
||
},
|
||
"items": {
|
||
"profile": "Profile",
|
||
"profileDesc": "View your account information",
|
||
"accessToken": "Access tokens",
|
||
"accessTokenDesc": "Manage personal tokens for API access",
|
||
"notifications": "Notifications",
|
||
"notificationsDesc": "Manage your notification preferences",
|
||
"appearance": "Appearance",
|
||
"appearanceDesc": "Customize theme and display"
|
||
},
|
||
"appearance": {
|
||
"breadcrumb": "Appearance",
|
||
"themeMode": "Theme mode",
|
||
"themeModeDesc": "Choose the overall light or dark theme",
|
||
"modeLight": "Light",
|
||
"modeDark": "Dark",
|
||
"modeSystem": "System",
|
||
"interface": "Interface",
|
||
"interfaceDesc": "Choose color scheme and visual style",
|
||
"switched": "Appearance switched to {name}",
|
||
"switchFailed": "Failed to switch appearance",
|
||
"language": "Language",
|
||
"languageDesc": "Choose the interface language",
|
||
"comingSoon": "Coming soon",
|
||
"comingSoonBody": "More customization options are on the way…"
|
||
},
|
||
"notifications": {
|
||
"breadcrumb": "Notifications",
|
||
"display": "Notification display",
|
||
"displayDesc": "Configure notification-related display options",
|
||
"showBell": "Show notification bell",
|
||
"showBellDesc": "Show the notification bell in the top navigation bar"
|
||
},
|
||
"accessToken": {
|
||
"breadcrumb": "Access tokens",
|
||
"title": "Personal access tokens",
|
||
"generate": "Generate token",
|
||
"securityTitle": "Security note:",
|
||
"securityBody": "Access tokens have full API permissions for your account. Never share them via source control, chat, or public channels. Create tokens on demand and revoke unused ones promptly.",
|
||
"listTitle": "Active tokens",
|
||
"listDesc": "All currently available access tokens",
|
||
"userToken": "User token",
|
||
"empty": "You have not created any access tokens yet",
|
||
"generateFirst": "Generate your first token",
|
||
"createTitle": "Generate token",
|
||
"createDesc": "Give the token a recognizable name for easier management later.",
|
||
"name": "Token name",
|
||
"adminHint": "When enabled, this token can access /admin/** endpoints (off by default)",
|
||
"generateAction": "Generate",
|
||
"readyTitle": "Token secret is ready",
|
||
"readyBody": "This is the only time you can view the plaintext secret. Copy it now and store it securely.",
|
||
"nameRequired": "Please enter a token name",
|
||
"createSuccess": "Access token created",
|
||
"createFailed": "Failed to create access token",
|
||
"deleteSuccess": "Access token revoked",
|
||
"deleteFailed": "Failed to delete access token",
|
||
"rotateSuccess": "Access token rotated; the old secret is invalid",
|
||
"rotateFailed": "Failed to rotate access token",
|
||
"deleteConfirm": "Revoke token “{name}”? It will stop working immediately and cannot be recovered.",
|
||
"rotateConfirm": "Rotate the secret for token “{name}”? A new secret will be issued and the old one will stop working immediately.",
|
||
"deleteConfirmTitle": "Confirm token revocation",
|
||
"rotateConfirmTitle": "Confirm token rotation",
|
||
"confirmRevoke": "Confirm revoke",
|
||
"confirmRotate": "Confirm rotate",
|
||
"revoking": "Revoking...",
|
||
"rotating": "Rotating...",
|
||
"subtitle": "Manage API access secrets for development or third-party tools",
|
||
"adminBadge": "Admin",
|
||
"adminPermission": "Admin permission",
|
||
"createdAt": "Created: {date}",
|
||
"copy": "Copy",
|
||
"rotate": "Rotate",
|
||
"revoke": "Revoke",
|
||
"copySuccess": "Copied",
|
||
"copyFailed": "Copy failed",
|
||
"namePlaceholder": "e.g. my-development-key",
|
||
"generating": "Generating…",
|
||
"importantTitle": "Important:",
|
||
"savedConfirm": "I have copied and stored it securely"
|
||
},
|
||
"profile": {
|
||
"passwordChangeSuccess": "Password changed successfully",
|
||
"passwordChangeFailed": "Failed to change password. Please try again.",
|
||
"passwordMismatch": "New passwords do not match",
|
||
"passwordTooShort": "New password must be at least 8 characters",
|
||
"profileUpdateSuccess": "Profile updated successfully",
|
||
"profileUpdateFailed": "Failed to update profile. Please try again.",
|
||
"bindSourceFailed": "Failed to bind authentication source",
|
||
"avatarUploadSuccess": "Avatar uploaded. Click save to apply.",
|
||
"avatarUploadFailed": "Failed to upload avatar",
|
||
"genderMale": "Male",
|
||
"genderFemale": "Female",
|
||
"genderSecret": "Prefer not to say",
|
||
"title": "Profile",
|
||
"userNotFound": "User information not found",
|
||
"breadcrumbSettings": "Settings",
|
||
"breadcrumbProfile": "Profile",
|
||
"basicInfo": "Basic information",
|
||
"basicInfoDesc": "Your account basic information",
|
||
"editProfile": "Edit profile",
|
||
"account": "Account",
|
||
"nickname": "Nickname",
|
||
"notSet": "Not set",
|
||
"uid": "User ID (UID)",
|
||
"email": "Email",
|
||
"notBound": "Not bound",
|
||
"phone": "Phone number",
|
||
"gender": "Gender",
|
||
"website": "Website",
|
||
"location": "Location",
|
||
"isAdmin": "Administrator",
|
||
"yes": "Yes",
|
||
"no": "No",
|
||
"bio": "Bio",
|
||
"bioDefault": "This user hasn't written anything yet.",
|
||
"changePassword": "Change password",
|
||
"changePasswordDesc": "Change your account password for security. Must be at least 8 characters.",
|
||
"passwordRiskWarning": "Password security warning",
|
||
"mustChangePassword": "For your account security, you must change the initial password.",
|
||
"currentPassword": "Current password",
|
||
"currentPasswordPlaceholder": "Enter current password",
|
||
"newPassword": "New password",
|
||
"newPasswordPlaceholder": "New password (at least 8 characters)",
|
||
"confirmNewPassword": "Confirm new password",
|
||
"confirmNewPasswordPlaceholder": "Confirm new password",
|
||
"submitting": "Submitting...",
|
||
"confirmChange": "Confirm change",
|
||
"thirdPartyBinding": "Third-party account binding",
|
||
"thirdPartyBindingDesc": "Manage and link third-party authorized accounts for quick login and verification",
|
||
"boundAccounts": "Bound accounts",
|
||
"noAccountIdentifier": "No account identifier provided",
|
||
"unbind": "Unbind",
|
||
"bindingRemoved": "Binding removed",
|
||
"noBoundAccounts": "No third-party accounts bound yet",
|
||
"bindNewAccount": "Bind new account",
|
||
"bindSource": "Bind {name}",
|
||
"noAvailableSources": "No available third-party authentication sources",
|
||
"editProfileTitle": "Edit profile",
|
||
"editProfileDesc": "Update your basic information. Changes take effect immediately after saving.",
|
||
"uploadAvatar": "Click to upload/change avatar",
|
||
"nicknamePlaceholder": "Enter your nickname",
|
||
"emailPlaceholder": "Enter your email",
|
||
"phonePlaceholder": "Enter phone number",
|
||
"genderPlaceholder": "Select gender",
|
||
"locationPlaceholder": "e.g. New York",
|
||
"bioPlaceholder": "Tell us about yourself...",
|
||
"cancel": "Cancel",
|
||
"saving": "Saving...",
|
||
"saveChanges": "Save changes",
|
||
"cropAvatar": "Crop avatar",
|
||
"cropAvatarDesc": "Adjust the avatar position and size to fit within the centered circular area."
|
||
},
|
||
"botBinding": {
|
||
"title": "Bind a bot",
|
||
"description": "Link your Telegram or QQ private-chat identity to this account so messages you send the bot can be saved.",
|
||
"bound": "Bound",
|
||
"empty": "No bots bound yet",
|
||
"unbind": "Unbind",
|
||
"bind": "Enter pairing code",
|
||
"bindDialogTitle": "Bind a bot",
|
||
"bindDialogDescription": "Choose an enabled channel and enter the pairing code the bot sent you.",
|
||
"selectChannel": "Select a channel",
|
||
"pairingCode": "Pairing code",
|
||
"pairingCodePlaceholder": "ABCD-EFGH",
|
||
"submit": "Bind",
|
||
"cancel": "Cancel",
|
||
"bindSuccess": "Bound successfully",
|
||
"bindFailed": "Failed to bind",
|
||
"unbindSuccess": "Unbound",
|
||
"unbindFailed": "Failed to unbind",
|
||
"platformUserId": "Platform user ID",
|
||
"noChannels": "No channels available. Ask an admin to add one.",
|
||
"typeTelegram": "Telegram",
|
||
"typeQQ": "QQ",
|
||
"loadFailed": "Failed to load bindings"
|
||
},
|
||
"security": {
|
||
"passwordLoginEnabled": "Allow password login",
|
||
"passwordLoginEnabledDesc": "When disabled, only third-party OIDC authentication sources are available for login.",
|
||
"registrationEnabled": "Allow registration",
|
||
"registrationEnabledDesc": "When disabled, new users cannot self-register.",
|
||
"passwordRegisterEnabled": "Allow password registration",
|
||
"passwordRegisterEnabledDesc": "When disabled, accounts can only be created by admins or linked via third-party auth.",
|
||
"oidcLoginEnabled": "Allow OIDC login",
|
||
"oidcLoginEnabledDesc": "When disabled, all third-party OIDC login buttons will be hidden.",
|
||
"emailLoginVerification": "Email login verification",
|
||
"emailLoginVerificationDesc": "When enabled, password login requires a 6-digit verification code sent via email.",
|
||
"emailRegisterVerification": "Email registration verification",
|
||
"emailRegisterVerificationDesc": "When enabled, registration requires a 6-digit verification code sent via email.",
|
||
"loginSessionTTLUpdated": "Login session duration updated",
|
||
"updateConfigFailed": "Failed to update configuration",
|
||
"invalidHours": "Please enter a valid number of hours (positive integer)",
|
||
"securityConfigUpdated": "Security configuration updated",
|
||
"authSourceStatusUpdated": "Authentication source status updated",
|
||
"toggleStatusFailed": "Failed to toggle status",
|
||
"authSourceDeleted": "Authentication source deleted",
|
||
"deleteAuthSourceFailed": "Failed to delete authentication source",
|
||
"captchaConfigSaved": "CAPTCHA configuration saved",
|
||
"saveConfigFailed": "Failed to save configuration",
|
||
"loginRegistrationSettings": "Login / Registration settings",
|
||
"loginRegistrationSettingsDesc": "Configure login restrictions and user self-registration permissions",
|
||
"loginSessionTTL": "Login session duration",
|
||
"loginSessionTTLDesc": "Configure how long login sessions persist in the browser. Set to \"Off\" to sign out when the browser closes.",
|
||
"selectRetentionTime": "Select retention time",
|
||
"sessionOff": "Off (sign out when browser closes)",
|
||
"session7Days": "7 days",
|
||
"session30Days": "30 days",
|
||
"sessionNeverExpire": "Never expire",
|
||
"sessionCustom": "Custom duration",
|
||
"hoursPlaceholder": "hours",
|
||
"authSourceManagement": "Authentication source management",
|
||
"authSourceManagementDesc": "Add, modify, and enable custom OIDC authentication sources",
|
||
"addAuthSource": "Add authentication source",
|
||
"enabled": "Enabled",
|
||
"disabled": "Disabled",
|
||
"identifier": "Identifier",
|
||
"type": "Type",
|
||
"secretConfigured": "Secret configured",
|
||
"secretNotConfigured": "Secret not configured",
|
||
"deleteAuthSourceConfirm": "Delete authentication source “{name}”? This cannot be undone.",
|
||
"deleteAuthSourceTitle": "Confirm delete authentication source",
|
||
"confirmDelete": "Confirm delete",
|
||
"deleting": "Deleting...",
|
||
"noAuthSources": "No authentication sources configured. Click the button above to add one.",
|
||
"captchaConfig": "CAPTCHA configuration (Cap CAPTCHA)",
|
||
"captchaConfigDesc": "Configure Proof-of-Work (PoW) based invisible CAPTCHA to protect login from brute-force and credential-stuffing attacks",
|
||
"autoStartSolving": "Start solving automatically when page loads",
|
||
"challengeCount": "Challenge count",
|
||
"challengeCountDesc": "Number of challenges the client must solve. Default 1, recommended 1 to 5",
|
||
"challengeDifficulty": "Difficulty",
|
||
"challengeDifficultyDesc": "PoW prefix hash bits; each increment doubles computation time. Default 4, recommended 4",
|
||
"challengeSize": "Salt size",
|
||
"challengeSizeDesc": "Challenge salt obfuscation character length. Default 32",
|
||
"challengeTTL": "Challenge TTL (seconds)",
|
||
"challengeTTLDesc": "Challenge validity period. Default 600s (10 minutes)",
|
||
"tokenTTL": "Token TTL (seconds)",
|
||
"tokenTTLDesc": "Validity period of the signed login token after PoW completion. Default 1200s (20 minutes)",
|
||
"saving": "Saving...",
|
||
"saveConfig": "Save configuration"
|
||
},
|
||
"system": {
|
||
"addressAutoDetected": "Current domain detected and filled automatically",
|
||
"configUpdated": "Configuration updated",
|
||
"updateConfigFailed": "Failed to update configuration",
|
||
"generalConfigSaved": "General configuration saved",
|
||
"saveConfigFailed": "Failed to save configuration",
|
||
"smtpConfigSaved": "SMTP mail configuration saved",
|
||
"connectingTest": "Sending test request...",
|
||
"testEmailSent": "Test email sent successfully",
|
||
"sendFailedCheckConfig": "Send failed. Please check configuration and logs.",
|
||
"testEmailFailed": "Failed to send test email",
|
||
"requestFailed": "Request failed",
|
||
"requestError": "[Request error]",
|
||
"testRequestFailed": "Test request failed",
|
||
"enterTargetEmail": "Enter target email address",
|
||
"generalSettings": "General settings",
|
||
"generalSettingsDesc": "Configure site identity, server address, and search engine indexing policy",
|
||
"siteName": "Site name",
|
||
"siteNameDesc": "Used in page titles, login/register pages, admin panel, and system emails.",
|
||
"serverAddress": "Server address",
|
||
"useCurrentDomain": "Use current domain",
|
||
"serverAddressDesc": "Restrict allowed API origins; leave empty to allow any origin.",
|
||
"searchEngineIndexing": "Search engine indexing",
|
||
"indexingAllowed": "Allow indexing",
|
||
"indexingDenied": "Deny indexing",
|
||
"searchEngineIndexingDesc": "Control whether Google, Baidu, Bing and other search engines can index public pages.",
|
||
"addressChangeWarning": "Changing the address affects CORS policy. Please enter the full URL with protocol and domain.",
|
||
"saving": "Saving...",
|
||
"saveConfig": "Save configuration",
|
||
"smtpSettings": "SMTP mail settings",
|
||
"smtpSettingsDesc": "Configure the system's email sending service (SMTP)",
|
||
"smtpHost": "SMTP host",
|
||
"smtpPort": "SMTP port",
|
||
"smtpUsername": "SMTP username",
|
||
"smtpPassword": "SMTP password",
|
||
"smtpPasswordMasked": "•••••• (configured, leave empty to keep)",
|
||
"smtpPasswordPlaceholder": "Enter password",
|
||
"testSend": "Send test",
|
||
"smtpTestTitle": "SMTP send test",
|
||
"smtpTestDesc": "Enter an email address to receive the test message. The system will use the SMTP configuration you've entered in the form above.",
|
||
"targetEmail": "Target email address",
|
||
"connectionLog": "Connection and transmission log",
|
||
"testSuccess": "Test succeeded! Email sent successfully.",
|
||
"testFailed": "Test failed",
|
||
"close": "Close",
|
||
"testing": "Testing...",
|
||
"startTest": "Start test"
|
||
},
|
||
"other": {
|
||
"menuDisplayUpdated": "Menu display configuration updated",
|
||
"updateConfigFailed": "Failed to update configuration",
|
||
"menuDisplayManagement": "Menu display management",
|
||
"menuDisplayManagementDesc": "Configure the visibility of sidebar menu items for all logged-in users.",
|
||
"notHideable": "Cannot be hidden",
|
||
"securityTipTitle": "Security note:",
|
||
"securityTipDesc": "To prevent admins from being locked out after hiding \"System Settings\", the system restricts disabling this menu item. All other menu items can be freely toggled. When hidden, empty group headers are also automatically hidden.",
|
||
"groupBusiness": "Business menu",
|
||
"groupAdmin": "Admin menu",
|
||
"groupDocs": "Docs menu",
|
||
"descDashboard": "View multi-dimensional charts for edge requests, visitors, and traffic",
|
||
"descNodes": "Register and manage reverse-proxy edge node status",
|
||
"descProxyRoutes": "Configure and publish proxy routes, load balancing, and origin bindings",
|
||
"descWebsites": "Configure root domains and view linked website details",
|
||
"descCertificates": "Manage and distribute website SSL/TLS certificates",
|
||
"descDnsAccounts": "Configure Cloudflare/Alidns and other DNS provider API credentials",
|
||
"descOrigins": "Centrally maintain backend origin server groups",
|
||
"descWaf": "Configure WAF custom rules and rate limits",
|
||
"descIpGroups": "Manage allow/deny IP sets used by WAF rules",
|
||
"descPages": "Host and publish static site projects with automatic domain binding",
|
||
"descConfigVersions": "View rule snapshots and perform hot updates or rollbacks",
|
||
"descAccessLogs": "Browse real-time edge request access details",
|
||
"descPerformance": "Configure cache, image compression, and other acceleration policies",
|
||
"descUsers": "View and manage system users and their status",
|
||
"descTasks": "View and schedule asynchronous and cron tasks",
|
||
"descStorage": "Manage file storage and clean unused files",
|
||
"descDatabase": "Monitor the physical database, browse tables, and run interactive SQL",
|
||
"descPush": "Configure and send system notifications",
|
||
"descLogs": "View async task execution logs and system runtime status",
|
||
"descSystem": "Manage core system key-value configuration",
|
||
"descAdminSettings": "Configure captcha, email, and menu visibility",
|
||
"descUsageDocs": "Deployment and operations guide for developers"
|
||
},
|
||
"templates": {
|
||
"templateCreated": "Notification template created",
|
||
"createTemplateFailed": "Failed to create template",
|
||
"templateSaved": "Notification template saved",
|
||
"updateTemplateFailed": "Failed to update template",
|
||
"templateDeleted": "Notification template deleted",
|
||
"deleteTemplateFailed": "Failed to delete template",
|
||
"templateManagement": "Notification template management",
|
||
"templateManagementDesc": "Configure and edit notification email/SMS templates with dynamic variable rendering",
|
||
"addTemplate": "Add template",
|
||
"systemBuiltIn": "System built-in",
|
||
"custom": "Custom",
|
||
"identifier": "Identifier",
|
||
"subject": "Subject",
|
||
"deleteTemplateConfirm": "Delete template “{name}”? This cannot be undone.",
|
||
"deleteTemplateTitle": "Confirm delete template",
|
||
"confirmDelete": "Confirm delete",
|
||
"deleting": "Deleting...",
|
||
"noTemplates": "No notification templates configured. Click the button above to add one.",
|
||
"editTemplate": "Edit notification template",
|
||
"addTemplateTitle": "Add notification template",
|
||
"templateDesc": "Configure template rendering logic. Supports Go `text/template` syntax (e.g. `{{.Code}}` for verification code).",
|
||
"templateKey": "Template key",
|
||
"templateKeyDesc": "Unique identifier used to reference this template in code.",
|
||
"templateName": "Template name",
|
||
"templateNameDesc": "Human-readable name for admin identification.",
|
||
"templateType": "Template type",
|
||
"templateTypeDesc": "Template category. Currently supports `email`.",
|
||
"templateSubject": "Subject",
|
||
"templateSubjectDesc": "Email subject line (effective when type is email).",
|
||
"templateDescription": "Description and variable documentation",
|
||
"templateContent": "Content",
|
||
"cancel": "Cancel",
|
||
"saving": "Saving...",
|
||
"saveConfig": "Save configuration"
|
||
},
|
||
"info": {
|
||
"upgradeVerified": "Upgrade package verified. Service is restarting.",
|
||
"applyUpgradeFailed": "Failed to apply upgrade",
|
||
"appUpdate": "Application update",
|
||
"appUpdateDesc": "Check upstream GitHub Actions Release and upgrade the current service",
|
||
"newVersionAvailable": "New version available",
|
||
"alreadyLatest": "Already up to date",
|
||
"cannotGetVersion": "Unable to fetch upstream version info",
|
||
"recheck": "Re-check",
|
||
"currentVersion": "Current version",
|
||
"latestVersion": "Latest version",
|
||
"buildTime": "Build time",
|
||
"platform": "Platform",
|
||
"upstreamRepo": "Upstream repo",
|
||
"releaseAsset": "Release asset",
|
||
"releaseNotes": "Release notes",
|
||
"checkUpdate": "Check for update",
|
||
"viewRelease": "View release",
|
||
"upgradeNow": "Upgrade now",
|
||
"upgradeTo": "Upgrade to {version}?",
|
||
"upgradeDesc": "The service will download and verify {asset}, then replace the current binary and restart. Ensure the install directory is writable and the service supports in-place restart.",
|
||
"cancel": "Cancel",
|
||
"confirmUpgrade": "Confirm upgrade",
|
||
"devBuildNoUpgrade": "Development builds have no comparable release version. Auto-upgrade is not available.",
|
||
"platformNotSupported": "Auto-upgrade is not supported on this platform. Please upgrade manually from the Release page.",
|
||
"noUpgradeNeeded": "Current version does not need an upgrade."
|
||
},
|
||
"operation": {
|
||
"whitelistUpdated": "File access whitelist updated",
|
||
"updateWhitelistFailed": "Failed to update whitelist",
|
||
"fileAccessControl": "File access control",
|
||
"fileAccessControlDesc": "Configure file business types that can be accessed without login. Files not in the whitelist require authentication.",
|
||
"addAuthFreeType": "Add auth-free type:",
|
||
"selectBusinessType": "Select business type...",
|
||
"allTypesAdded": "All types added",
|
||
"currentAuthFreeList": "Current auth-free list",
|
||
"whitelistEmpty": "Whitelist is empty. All file types require login.",
|
||
"typeAvatar": "Avatar (avatar)",
|
||
"typeAttachment": "Attachment (attachment)",
|
||
"typeDoc": "Document (doc)",
|
||
"typeGeneric": "Generic (generic)",
|
||
"logRetentionTitle": "Log retention",
|
||
"logRetentionDesc": "Configure retention days for each log database. Expired logs are cleaned automatically after switching the log store.",
|
||
"days": "days",
|
||
"save": "Save",
|
||
"logRetentionUpdated": "Log retention updated",
|
||
"logRetentionUpdateFailed": "Failed to update log retention",
|
||
"retentionInvalid": "{label} must be an integer greater than or equal to 1",
|
||
"retentionPostgresDesc": "Retention days for access logs and observability metrics",
|
||
"retentionSqliteDesc": "SQLite log retention days",
|
||
"retentionClickhouseDesc": "ClickHouse log retention days"
|
||
},
|
||
"authSourceModal": {
|
||
"authSourceSaved": "Authentication source saved",
|
||
"saveAuthSourceFailed": "Failed to save authentication source",
|
||
"editAuthSource": "Edit authentication source",
|
||
"addAuthSource": "Add authentication source",
|
||
"editAuthSourceDesc": "Modify custom OIDC authentication source parameters.",
|
||
"addAuthSourceDesc": "Configure a new custom OIDC authentication source.",
|
||
"identifier": "Identifier (English name)",
|
||
"displayName": "Display name",
|
||
"keepOriginalIfEmpty": "Leave empty to keep current value",
|
||
"discoveryURL": "Discovery URL (OIDC issuer URL)",
|
||
"iconURL": "Icon URL (optional)",
|
||
"enableAuthSource": "Enable authentication source",
|
||
"enableAuthSourceDesc": "When enabled, it will appear on the login page and account binding.",
|
||
"cancel": "Cancel",
|
||
"saving": "Saving...",
|
||
"save": "Save"
|
||
}
|
||
},
|
||
"admin": {
|
||
"files": {
|
||
"pageTitle": "Storage",
|
||
"tabStats": "File statistics",
|
||
"tabList": "File list",
|
||
"tabStorage": "Storage config",
|
||
"stats": {
|
||
"noData": "No upload data yet",
|
||
"noDataDesc": "Upload files to see capacity and distribution analysis here.",
|
||
"totalFiles": "Total files",
|
||
"countUnit": "",
|
||
"totalFilesDesc": "Total number of available uploaded files",
|
||
"totalSize": "Storage used",
|
||
"totalSizeDesc": "Total disk/S3 space occupied by files",
|
||
"weeklyNewFiles": "New files (7 days)",
|
||
"weeklyNewFilesDesc": "Files uploaded successfully in the last 7 days",
|
||
"weeklyNewSize": "New size (7 days)",
|
||
"weeklyNewSizeDesc": "Storage bandwidth consumed by uploads in the last 7 days",
|
||
"trendTitle": "7-day upload trend",
|
||
"trendDesc": "Daily upload statistics over the past week",
|
||
"trendCount": "New count",
|
||
"trendSize": "New size (MB)",
|
||
"chartLabelCount": "New files",
|
||
"chartLabelSize": "New size",
|
||
"countDistTitle": "File format distribution (count)",
|
||
"countDistDesc": "Percentage of files by format type",
|
||
"noCategoryData": "No category data",
|
||
"maxCountHint": "The most common file type is “{name}” with {count} files uploaded.",
|
||
"sizeDistTitle": "File format distribution (size)",
|
||
"sizeDistDesc": "Percentage of storage by format type",
|
||
"noSizeData": "No size data",
|
||
"maxSizeHint": "The largest storage consumer is “{name}”, using {size} of storage.",
|
||
"catImages": "Images",
|
||
"catVideos": "Videos",
|
||
"catAudio": "Audio",
|
||
"catDocuments": "Documents",
|
||
"catArchives": "Archives",
|
||
"catOthers": "Others",
|
||
"none": "None"
|
||
},
|
||
"list": {
|
||
"searchPlaceholder": "Search file name...",
|
||
"selectAll": "Select all on this page",
|
||
"deselectAll": "Deselect all",
|
||
"selectedCount": "{count} selected",
|
||
"batchDownload": "Download as archive",
|
||
"batchDownloadSuccess": "Batch download started",
|
||
"batchDownloadFailed": "Batch download failed",
|
||
"totalFiles": "{count} files total",
|
||
"noMatch": "No matching files",
|
||
"noFiles": "No files uploaded yet",
|
||
"colPreview": "Preview",
|
||
"colName": "File name",
|
||
"colPath": "Path",
|
||
"colType": "Business type",
|
||
"colMime": "MIME type",
|
||
"colSize": "Size",
|
||
"colUploadedAt": "Uploaded at",
|
||
"colActions": "Actions",
|
||
"viewDetail": "View details",
|
||
"download": "Download",
|
||
"delete": "Delete",
|
||
"prevPage": "Previous",
|
||
"nextPage": "Next",
|
||
"detailTitle": "File details",
|
||
"detailDesc": "View the complete metadata and configuration properties of the file.",
|
||
"detailId": "File ID",
|
||
"detailName": "File name",
|
||
"detailPath": "Storage path",
|
||
"detailSize": "Size",
|
||
"bytes": "bytes",
|
||
"detailMime": "MIME type",
|
||
"detailExtension": "Extension",
|
||
"detailBizType": "Business type",
|
||
"detailDriver": "Storage driver",
|
||
"detailUploaderId": "Uploader ID",
|
||
"detailUploadedAt": "Uploaded at",
|
||
"detailMetadata": "Extra metadata",
|
||
"deleteTitle": "Confirm file deletion",
|
||
"deleteConfirm": "Delete file “{name}”? This action cannot be undone.",
|
||
"cancel": "Cancel",
|
||
"confirmDelete": "Confirm delete",
|
||
"deleteSuccess": "File deleted",
|
||
"deleteFailed": "Delete failed",
|
||
"extensionFile": "{ext} file"
|
||
},
|
||
"storage": {
|
||
"maintenanceMode": "Storage maintenance mode",
|
||
"maintenanceDesc": "{source} → {target}. During migration, files are read-only; upload, delete, and cleanup are disabled.",
|
||
"migrationProgress": "Check task execution log for migration progress: {taskId}",
|
||
"notDispatched": "Not dispatched yet",
|
||
"retryMigration": "Retry migration",
|
||
"fileStorage": "File storage",
|
||
"fileStorageDesc": "Default is local storage. Configure the storage medium for system files. When switching storage type with existing files, the system enters maintenance mode and migrates files automatically.",
|
||
"storageType": "Storage type",
|
||
"rootDir": "Root directory",
|
||
"endpoint": "Endpoint",
|
||
"username": "Username",
|
||
"password": "Password",
|
||
"basePath": "Base path",
|
||
"switchWarning": "⚠️ You've switched storage types. Clicking “Save configuration” will switch the active storage engine and update existing file driver tags. Use “Start migration” only when physical file copying is needed.",
|
||
"saveConfig": "Save configuration",
|
||
"startMigration": "Start migration",
|
||
"keyPrefix": "Object prefix",
|
||
"cdnUrl": "CDN URL",
|
||
"pathStyleDesc": "Self-hosted S3 like MinIO usually requires path-style enabled.",
|
||
"saveSuccess": "Storage configuration saved",
|
||
"saveFailed": "Failed to save storage configuration",
|
||
"migrateSuccess": "Storage migration task dispatched",
|
||
"migrateFailed": "Failed to dispatch storage migration task",
|
||
"retrySuccess": "Storage migration task re-dispatched",
|
||
"retryFailed": "Failed to run storage migration",
|
||
"driverLocal": "Local filesystem",
|
||
"driverS3": "AWS S3",
|
||
"driverR2": "Cloudflare R2",
|
||
"driverMinio": "MinIO",
|
||
"driverOss": "Alibaba Cloud OSS",
|
||
"driverWebdav": "WebDAV",
|
||
"driverUnknown": "Unknown"
|
||
}
|
||
},
|
||
"users": {
|
||
"pageTitle": "Users",
|
||
"createUser": "Create user",
|
||
"colUser": "User",
|
||
"colEmail": "Email",
|
||
"colLastLogin": "Last login",
|
||
"colRegisteredAt": "Registered at",
|
||
"colLastUpdate": "Last update",
|
||
"colActions": "Actions",
|
||
"loadingUsers": "Loading users...",
|
||
"noUsers": "No users found",
|
||
"adminAccount": "Admin account",
|
||
"disableAccount": "Disable account",
|
||
"enableAccount": "Enable account",
|
||
"viewDetail": "View details",
|
||
"editUser": "Edit user",
|
||
"editTitle": "Edit user",
|
||
"editDesc": "Modify user profile, grant/revoke admin access, or reset password.",
|
||
"usernameImmutable": "Username (immutable)",
|
||
"nicknameOptional": "Nickname (optional)",
|
||
"nicknamePlaceholder": "Enter nickname",
|
||
"email": "Email",
|
||
"emailPlaceholder": "Enter email address",
|
||
"resetPasswordOptional": "Reset password (optional)",
|
||
"resetPasswordPlaceholder": "Leave empty to keep current password, or enter new one (at least 8 characters)",
|
||
"adminPermission": "Admin permission",
|
||
"adminPermissionDesc": "When enabled, this account will have admin access.",
|
||
"cannotRevokeSelfAdmin": "Cannot revoke admin permission from the currently logged-in user.",
|
||
"deleteUser": "Delete user",
|
||
"cancel": "Cancel",
|
||
"save": "Save",
|
||
"saving": "Saving...",
|
||
"deleteConfirmTitle": "Confirm user deletion",
|
||
"deleteConfirmDesc": "Delete user {name}? This will remove the account and cannot be undone.",
|
||
"confirmDelete": "Confirm delete",
|
||
"createTitle": "Create user",
|
||
"createDesc": "Create a new local password-login account.",
|
||
"username": "Username",
|
||
"usernamePlaceholder": "Enter username (at least 3 characters)",
|
||
"password": "Password",
|
||
"passwordPlaceholder": "Enter password (at least 8 characters)",
|
||
"enableAccountLabel": "Enable account",
|
||
"enableAccountDesc": "When disabled, this account cannot log in.",
|
||
"create": "Create",
|
||
"creating": "Creating...",
|
||
"userProfile": "User profile",
|
||
"refreshingDetail": "Refreshing details",
|
||
"registeredAt": "Registered at",
|
||
"personalInfo": "Personal info",
|
||
"phone": "Phone",
|
||
"gender": "Gender",
|
||
"location": "Location",
|
||
"website": "Website",
|
||
"bio": "Bio",
|
||
"systemRecords": "System records",
|
||
"accountStatus": "Account status",
|
||
"statusActive": "Active",
|
||
"statusDisabled": "Disabled",
|
||
"isAdmin": "Admin",
|
||
"yes": "Yes",
|
||
"no": "No",
|
||
"lastLogin": "Last login",
|
||
"lastUpdate": "Last update",
|
||
"banAccount": "Ban account",
|
||
"unbanAccount": "Unban account",
|
||
"search": "Search",
|
||
"searchUserIdPlaceholder": "Enter user ID...",
|
||
"searchUsernamePlaceholder": "Enter username...",
|
||
"searchEmailPlaceholder": "Enter email...",
|
||
"clear": "Clear",
|
||
"status": "Status",
|
||
"statusAll": "All statuses",
|
||
"clearFilters": "Clear filters",
|
||
"totalRecords": "{total} records",
|
||
"perPage": "{count}/page",
|
||
"refreshData": "Refresh data",
|
||
"validation": {
|
||
"emailRequired": "Email is required",
|
||
"emailInvalid": "Invalid email format",
|
||
"passwordTooShort": "Password must be at least 8 characters",
|
||
"usernameRequired": "Username is required",
|
||
"usernameTooShort": "Username must be at least 3 characters",
|
||
"passwordRequired": "Password is required"
|
||
}
|
||
},
|
||
"tasks": {
|
||
"pageTitle": "Tasks",
|
||
"tabTasks": "Task manager",
|
||
"tabSchedules": "Scheduled tasks",
|
||
"tabExecutions": "Execution log",
|
||
"unknownError": "Unknown error",
|
||
"statusPending": "Pending",
|
||
"statusRunning": "Running",
|
||
"statusSucceeded": "Succeeded",
|
||
"statusFailed": "Failed",
|
||
"triggerSystem": "System",
|
||
"triggerManual": "Manual",
|
||
"triggerRetry": "Retry",
|
||
"triggerSchedule": "Scheduled",
|
||
"allStatuses": "All statuses",
|
||
"allTasks": "All tasks",
|
||
"refresh": "Refresh",
|
||
"loadingExecutions": "Loading execution records...",
|
||
"noExecutions": "No execution records found",
|
||
"colTask": "Task",
|
||
"colStatus": "Status",
|
||
"colTrigger": "Trigger",
|
||
"colRetry": "Retry",
|
||
"colDuration": "Duration",
|
||
"colResult": "Result / Error",
|
||
"colCreatedAt": "Created at",
|
||
"paginationInfo": "{total} records, page {current}/{totalPages}",
|
||
"prevPage": "Previous",
|
||
"nextPage": "Next",
|
||
"executionDetailTitle": "Execution details",
|
||
"loadingDetail": "Loading task details...",
|
||
"detailStatus": "Status",
|
||
"detailTrigger": "Trigger source",
|
||
"detailRetryCount": "Retry count",
|
||
"detailDuration": "Duration",
|
||
"detailTaskId": "Task ID",
|
||
"detailCreatedAt": "Created at",
|
||
"detailStartedAt": "Started at",
|
||
"detailFinishedAt": "Finished at",
|
||
"detailUpdatedAt": "Updated at",
|
||
"detailResult": "Result",
|
||
"detailError": "Error",
|
||
"detailPayload": "Payload",
|
||
"detailLog": "Execution log",
|
||
"noLog": "No log available",
|
||
"noExecutionSelected": "No execution record selected",
|
||
"refreshDetail": "Refresh details",
|
||
"retryTask": "Retry task",
|
||
"retrySuccess": "Task re-dispatched",
|
||
"retrySuccessDesc": "New task ID: {taskId}",
|
||
"retryFailed": "Task retry failed",
|
||
"loadSchedulesFailed": "Failed to load scheduled tasks",
|
||
"scheduleEnabled": "Scheduled task enabled: {name}",
|
||
"scheduleDisabled": "Scheduled task disabled: {name}",
|
||
"changeScheduleStatusFailed": "Failed to change task status",
|
||
"scheduleNameRequired": "Task name is required",
|
||
"cronRequired": "Cron expression is required",
|
||
"scheduleUpdateSuccess": "Scheduled task updated",
|
||
"scheduleCreateSuccess": "Scheduled task created",
|
||
"submitFailed": "Submission failed",
|
||
"scheduleDeleteSuccess": "Scheduled task deleted",
|
||
"deleteFailed": "Delete failed",
|
||
"addSchedule": "Add scheduled task",
|
||
"loadingSchedules": "Loading scheduled tasks...",
|
||
"noSchedules": "No scheduled tasks configured. Click the button above to add one.",
|
||
"colScheduleName": "Task name",
|
||
"colAssociatedTask": "Associated async task",
|
||
"colCron": "Cron expression",
|
||
"colPayload": "Payload",
|
||
"colEnabled": "Enabled",
|
||
"colActions": "Actions",
|
||
"editSchedule": "Edit scheduled task",
|
||
"scheduleDialogDesc": "Configure scheduling parameters and runtime payload for the scheduled task.",
|
||
"scheduleName": "Task name",
|
||
"scheduleNamePlaceholder": "e.g. daily-data-cleanup",
|
||
"associatedTask": "Associated async task",
|
||
"cronExpression": "Cron expression",
|
||
"cronPlaceholder": "e.g. 0 */2 * * * or @daily",
|
||
"cronHint": "Uses standard 5-field Cron format (minute, hour, day of month, month, day of week).",
|
||
"scheduleActive": "Enabled",
|
||
"scheduleActiveDesc": "Determines whether this scheduled task will be triggered on schedule.",
|
||
"noParamsRequired": "Selected task type does not require runtime parameters.",
|
||
"payloadConfig": "Payload configuration",
|
||
"paramOn": "On",
|
||
"paramOff": "Off",
|
||
"saveChanges": "Save changes",
|
||
"confirmCreate": "Confirm create",
|
||
"deleteScheduleTitle": "Delete scheduled task",
|
||
"deleteScheduleDesc": "Delete this scheduled task? This cannot be undone and will immediately cancel its schedule.",
|
||
"cancel": "Cancel",
|
||
"confirmDelete": "Confirm delete",
|
||
"loadTaskTypesFailed": "Failed to load task types",
|
||
"dispatchSuccess": "Task dispatched",
|
||
"dispatchSuccessDesc": "Task {name} added to queue: {taskId}",
|
||
"dispatchFailed": "Task dispatch failed",
|
||
"loadingTaskTypes": "Loading task types...",
|
||
"noTaskTypes": "No task types available",
|
||
"taskType": "Type:",
|
||
"taskRetry": "Retry:",
|
||
"executeNow": "Execute now",
|
||
"dispatchTask": "Dispatch task",
|
||
"dispatchTaskDesc": "Configure parameters and start. The task runs asynchronously in the background.",
|
||
"executeTask": "Execute task",
|
||
"startTime": "Start time",
|
||
"startTimeDesc": "Select the start time for sync",
|
||
"endTime": "End time",
|
||
"endTimeDesc": "Select the end time for sync",
|
||
"noParamsHint": "This task requires no additional parameters. It will be dispatched directly on confirmation.",
|
||
"start": "Start",
|
||
"dispatching": "Dispatching...",
|
||
"selectDate": "Select date",
|
||
"logPrimaryDb": "Log primary database",
|
||
"retentionDays": "Retention days",
|
||
"migrationStatus": "Migration status",
|
||
"migrating": "Migrating",
|
||
"idle": "Idle",
|
||
"selectLogDb": "Select log database",
|
||
"dbPostgresPrimary": "PostgreSQL (primary)",
|
||
"dbSqlitePrimary": "SQLite (primary)",
|
||
"dbClickhouse": "ClickHouse",
|
||
"taskTypeFilter": "Task type",
|
||
"executionRecord": "Execution record"
|
||
},
|
||
"push": {
|
||
"pageTitle": "Push notifications",
|
||
"eventsTab": "Event management",
|
||
"historiesTab": "Notification history",
|
||
"settingsTab": "Channel management & settings",
|
||
"events": {
|
||
"eventUpdateSuccess": "Event updated",
|
||
"eventUpdateFailed": "Event update failed",
|
||
"operationFailed": "Operation failed",
|
||
"eventCreateSuccess": "Event created",
|
||
"eventCreateFailed": "Event creation failed",
|
||
"configDeleteSuccess": "Configuration deleted",
|
||
"configDeleteFailed": "Configuration deletion failed",
|
||
"templateInvalidJson": "Message template is not valid JSON",
|
||
"selectSystemEvent": "Please select a system event",
|
||
"selectAsyncTask": "Please select an async task",
|
||
"addEvent": "Add notification event",
|
||
"loadingEvents": "Loading notification events...",
|
||
"noEvents": "No notification events configured. Click the button above to add one.",
|
||
"colEvent": "Event",
|
||
"colChannels": "Channels",
|
||
"colTargets": "Targets",
|
||
"colStatus": "Status",
|
||
"colActions": "Actions",
|
||
"taskBadge": "Task",
|
||
"noChannelSpecified": "No channel specified",
|
||
"emailChannel": "Email",
|
||
"configure": "Configure",
|
||
"deleteEventConfirm": "Delete this notification event configuration? This cannot be undone.",
|
||
"deleteEventTitle": "Confirm delete notification event",
|
||
"confirmDelete": "Confirm delete",
|
||
"deleting": "Deleting...",
|
||
"delete": "Delete",
|
||
"addEventDialogTitle": "Add notification event",
|
||
"addEventDialogDesc": "Select a system event and bind push channels. It will be active immediately after creation.",
|
||
"eventType": "Event type",
|
||
"builtinEventType": "System built-in event",
|
||
"taskEventType": "Task completion event",
|
||
"systemEvent": "System event",
|
||
"loadingSystemEvents": "Loading system events...",
|
||
"allBuiltinEventsConfigured": "All built-in events are already configured. No new events available.",
|
||
"selectSystemEventPlaceholder": "Select system event",
|
||
"systemAsyncTask": "System async task",
|
||
"loadingAsyncTasks": "Loading async tasks...",
|
||
"noAvailableTasks": "No system tasks available.",
|
||
"selectAsyncTaskPlaceholder": "Select async task",
|
||
"eventDescription": "Event description:",
|
||
"noDescription": "No description",
|
||
"taskDescription": "Task description:",
|
||
"pushChannelsMulti": "Push channels (multi-select)",
|
||
"selectConfiguredChannels": "Select configured push channels",
|
||
"emailPush": "Email push",
|
||
"noAvailableChannels": "No channels available. Please create or enable one in “Channel management & settings” first.",
|
||
"pushTargets": "Push targets (email and similar channels only)",
|
||
"pushTargetsPlaceholder": "Separate multiple targets with commas, e.g.: user1@test.com, user2@test.com",
|
||
"contentTemplate": "Content template (JSON)",
|
||
"taskTemplateVars": "Supported variables: {{task_name}}, {{task_status}}, {{task_duration}}, {{user.username}}",
|
||
"eventTemplateVars": "Supported variables: {{user.username}}, {{ip}}, {{time}}",
|
||
"enableStatus": "Enabled",
|
||
"enableStatusDesc": "Whether to start receiving notifications for this event immediately after creation",
|
||
"cancel": "Cancel",
|
||
"enableSave": "Enable and save",
|
||
"editEventDialogTitle": "Event notification channel configuration",
|
||
"editEventDialogDesc": "Customize the push channels and recipient configuration for this event",
|
||
"eventName": "Event name",
|
||
"eventKey": "Event key",
|
||
"relatedAsyncTask": "Associated async task",
|
||
"noAvailableChannelsEdit": "No channels available. Please create and enable one in “Channel management & settings” first.",
|
||
"saveChanges": "Save changes",
|
||
"taskCompleteTitle": "Task completed: {name}",
|
||
"taskCompleteContent": "Async task {{task_name}} completed. Status: {{task_status}}, duration: {{task_duration}} ms."
|
||
},
|
||
"settings": {
|
||
"channelCreateSuccess": "Channel created",
|
||
"channelCreateFailed": "Channel creation failed",
|
||
"channelUpdateSuccess": "Channel updated",
|
||
"channelUpdateFailed": "Channel update failed",
|
||
"channelDeleteSuccess": "Channel deleted",
|
||
"channelDeleteFailed": "Channel deletion failed",
|
||
"channelNameRequired": "Channel name is required",
|
||
"channelNameFormat": "Channel name can only contain letters, numbers, and underscores",
|
||
"invalidChannelType": "Invalid channel type",
|
||
"httpsRequired": "URL must start with https:// for security",
|
||
"jsonFormatRequired": "Request body must be valid JSON",
|
||
"larkTemplateFormat": "Custom card template must be valid JSON",
|
||
"sendingTestPush": "Sending test push...",
|
||
"testPushSuccess": "Test push sent. Please check the target platform.",
|
||
"connectivityTestFailed": "Connectivity test failed",
|
||
"customPushChannels": "Custom push channels",
|
||
"customPushChannelsDesc": "Add, configure, and manage custom data push channels for third-party Webhook integration",
|
||
"createChannel": "Create channel",
|
||
"loadingChannels": "Loading channels...",
|
||
"noCustomChannels": "No custom channels configured. Click the button above to create one.",
|
||
"colName": "Name",
|
||
"colType": "Type",
|
||
"colRemark": "Remark",
|
||
"colStatus": "Status",
|
||
"colActions": "Actions",
|
||
"noRemark": "No remark",
|
||
"test": "Test",
|
||
"edit": "Edit",
|
||
"deleteChannelConfirm": "Delete channel \"{name}\"? This cannot be undone.",
|
||
"deleteChannelTitle": "Confirm delete channel",
|
||
"confirmDelete": "Confirm delete",
|
||
"deleting": "Deleting...",
|
||
"delete": "Delete",
|
||
"editChannelDialogTitle": "Edit channel",
|
||
"createChannelDialogTitle": "Create channel",
|
||
"channelDialogDesc": "Configure a custom notification push channel. Supports POST requests to third-party Webhooks or push services.",
|
||
"channelName": "Name",
|
||
"channelNamePlaceholder": "Enter channel name. Use only English letters and underscores. Must be unique.",
|
||
"channelNameHint": "Unique channel identifier. Cannot be changed after creation.",
|
||
"channelRemark": "Remark",
|
||
"channelRemarkPlaceholder": "Enter remark",
|
||
"channelType": "Channel type",
|
||
"selectChannelType": "Select channel type",
|
||
"quickLoadTemplates": "Quick-load template examples:",
|
||
"loadedFeishuTemplate": "Feishu Webhook template loaded",
|
||
"loadedDingTalkTemplate": "DingTalk robot template loaded",
|
||
"loadedWeChatTemplate": "WeCom robot template loaded",
|
||
"loadedBarkTemplate": "Bark App template loaded",
|
||
"cancel": "Cancel",
|
||
"confirm": "Confirm",
|
||
"sendTestNotification": "Send test notification",
|
||
"sendTestNotificationDesc": "Enter the test target and click send. The system will run a connectivity push test via this channel.",
|
||
"pushChannelName": "Push channel name",
|
||
"testPushTarget": "Test target (template variable $to)",
|
||
"testPushTargetPlaceholder": "Enter test target identifier, such as Bark token or email",
|
||
"sendTest": "Send test",
|
||
"fieldRequired": "{label} is required",
|
||
"configHelp": "{name} configuration help"
|
||
},
|
||
"histories": {
|
||
"searchPlaceholder": "Filter by event key...",
|
||
"sendStatus": "Send status",
|
||
"allStatus": "All statuses",
|
||
"sendSuccess": "Sent",
|
||
"sendFailed": "Failed",
|
||
"colEvent": "Event",
|
||
"colChannel": "Channel",
|
||
"colTarget": "Target",
|
||
"colTitle": "Title",
|
||
"colLevel": "Level",
|
||
"colStatus": "Status",
|
||
"colTime": "Time",
|
||
"loadingHistories": "Loading push history...",
|
||
"noHistoryData": "No push history data",
|
||
"emailChannel": "Email",
|
||
"success": "Success",
|
||
"failed": "Failed",
|
||
"totalRecords": "{total} history records",
|
||
"pushNotificationDetail": "Push notification details",
|
||
"pushNotificationDetailDesc": "View detailed audit information and content of this notification",
|
||
"eventIdentifier": "Event identifier",
|
||
"sendChannel": "Send channel",
|
||
"emailPush": "Email push",
|
||
"pushTarget": "Push target",
|
||
"sendTime": "Send time",
|
||
"notificationLevel": "Notification level",
|
||
"failureReason": "Failure reason",
|
||
"notificationTitle": "Notification title",
|
||
"notificationContent": "Notification content",
|
||
"close": "Close"
|
||
}
|
||
},
|
||
"messageGateway": {
|
||
"pageTitle": "Messaging channels",
|
||
"pageDescription": "Configure instance-level Telegram and QQ bots. Users bind their private-chat identity with a pairing code.",
|
||
"addChannel": "Add channel",
|
||
"emptyTitle": "No messaging channels yet",
|
||
"emptyDescription": "Add a shared bot so users can bind it on their profile and send private messages.",
|
||
"enabled": "Enabled",
|
||
"disabled": "Disabled",
|
||
"delete": "Delete",
|
||
"deleteConfirmTitle": "Delete this channel?",
|
||
"deleteConfirmDescription": "Bindings and unused pairing codes for this channel will also be removed. This cannot be undone.",
|
||
"createSuccess": "Channel created",
|
||
"createFailed": "Failed to create channel",
|
||
"updateSuccess": "Channel updated",
|
||
"updateFailed": "Failed to update channel",
|
||
"deleteSuccess": "Channel deleted",
|
||
"deleteFailed": "Failed to delete channel",
|
||
"testSuccess": "Connectivity test passed",
|
||
"testFailed": "Connectivity test failed",
|
||
"name": "Name",
|
||
"namePlaceholder": "e.g. Ops bot",
|
||
"type": "Type",
|
||
"typeTelegram": "Telegram",
|
||
"typeQQ": "QQ",
|
||
"selectType": "Select a channel type",
|
||
"botToken": "Bot token",
|
||
"botTokenPlaceholder": "From BotFather",
|
||
"baseUrl": "API base URL",
|
||
"baseUrlPlaceholder": "https://api.telegram.org",
|
||
"appId": "App ID",
|
||
"appSecret": "App Secret",
|
||
"portalHost": "Portal host",
|
||
"portalHostPlaceholder": "q.qq.com",
|
||
"keepSecretHint": "Leave blank to keep the saved secret",
|
||
"cancel": "Cancel",
|
||
"create": "Create",
|
||
"testConnection": "Test connection",
|
||
"loadFailed": "Failed to load channels"
|
||
},
|
||
"database": {
|
||
"pageTitle": "Database",
|
||
"refreshData": "Refresh data",
|
||
"fetchOverviewFailed": "Failed to fetch database overview",
|
||
"fetchTablesFailed": "Failed to fetch table list",
|
||
"exportSuccess": "Database exported",
|
||
"exportSuccessDesc": "Downloaded archive: {filename}",
|
||
"exportFailed": "Database export failed",
|
||
"dbType": "Database type",
|
||
"versionInfo": "Version info",
|
||
"nameOrPath": "Name / Path",
|
||
"dbSize": "Database size",
|
||
"physicalTables": "Physical tables",
|
||
"activeConnections": "Active connections",
|
||
"featureArea": "Features",
|
||
"featureAreaDesc": "Database export and custom advanced SQL terminal",
|
||
"dbBackupExport": "Database backup export",
|
||
"dbBackupExportDesc": "Export and download the physical database image (SQLite exports .db, PostgreSQL exports a packaged .sql text file)",
|
||
"preparing": "Preparing...",
|
||
"startExport": "Start export",
|
||
"sqlQueryConsole": "SQL query console",
|
||
"sqlQueryConsoleDesc": "Open an online SQL terminal to execute native SQL for data filtering, updates, debugging, or performance tuning",
|
||
"enterConsole": "Enter console",
|
||
"cache": {
|
||
"fetchCacheStatusFailed": "Failed to fetch disk cache status",
|
||
"saveFailed": "Save failed",
|
||
"maxSizeMustBePositive": "Max size must be an integer >= 1",
|
||
"ttlMustBeNonNegative": "Default TTL must be an integer >= 0",
|
||
"saveSuccess": "Saved",
|
||
"cachePolicyHotUpdated": "Disk cache policy hot-reloaded",
|
||
"saveConfigFailed": "Failed to save configuration",
|
||
"clearSuccess": "Cleared",
|
||
"cacheDataCleared": "All cache data cleared",
|
||
"clearCacheFailed": "Failed to clear cache",
|
||
"cacheManagement": "Cache management",
|
||
"cacheManagementDesc": "Manage and monitor system-level disk cache resource usage, lifecycle, and eviction policy",
|
||
"refreshStatus": "Refresh status",
|
||
"runtimeStatus": "Runtime status",
|
||
"usedSpace": "Used space",
|
||
"cacheKeysCount": "Cache key count",
|
||
"files": "files",
|
||
"cacheBaseDirectory": "Cache base directory",
|
||
"clearCacheNow": "Clear cache now",
|
||
"policyConfig": "Policy configuration",
|
||
"maxSizeLimit": "Max size limit (MB)",
|
||
"maxSizeHint": "Eviction is triggered when total size exceeds this value",
|
||
"ttlLimit": "TTL limit (minutes)",
|
||
"ttlHint": "Maximum lifetime of a cache item. Expired items are cleaned up.",
|
||
"enableLru": "Enable LRU eviction",
|
||
"enableLruDesc": "When the max size limit is reached, automatically remove the least recently accessed items. When disabled, only expired items are cleaned.",
|
||
"saving": "Saving...",
|
||
"saveSettings": "Save settings",
|
||
"noCacheStatus": "No cache status information loaded",
|
||
"confirmClearAllCache": "Clear all cache?",
|
||
"confirmClearDesc": "This will permanently delete all cache files from the disk directory (including temporary extracts, processed images, and block files), resetting key count to 0. This cannot be undone and may cause a temporary slowdown for users fetching resources.",
|
||
"cancel": "Cancel",
|
||
"clearing": "Clearing...",
|
||
"confirmClear": "Confirm clear",
|
||
"unknownError": "Unknown error",
|
||
"maxSizePlaceholder": "e.g. 100",
|
||
"ttlPlaceholder": "e.g. 60, 0 means never expire"
|
||
},
|
||
"sql": {
|
||
"sqlExecSuccess": "SQL executed successfully",
|
||
"sqlExecFailed": "SQL execution failed",
|
||
"sqlQueryTerminal": "SQL query terminal",
|
||
"sqlEditor": "SQL editor",
|
||
"quickTemplates": "Quick templates:",
|
||
"selectPresetSQL": "Select preset SQL",
|
||
"queryUsers": "Query users (SELECT users)",
|
||
"queryFiles": "Query files (SELECT uploads)",
|
||
"queryTaskExecutions": "Query task executions (SELECT task_executions)",
|
||
"sqliteVersion": "SQLite version (SQLite only)",
|
||
"postgresVersion": "PostgreSQL version (Postgres only)",
|
||
"running": "Running...",
|
||
"run": "Run",
|
||
"executionOutput": "Output",
|
||
"type": "Type",
|
||
"duration": "Duration",
|
||
"executingQuery": "Executing query, please wait...",
|
||
"queryResultEmpty": "Query result is empty",
|
||
"sqlExecSuccessTitle": "SQL executed successfully",
|
||
"affectedRows": "Affected rows: {rows}, duration: {ms}ms.",
|
||
"editorReady": "Editor ready. Write SQL above and run to see results.",
|
||
"unknownExecError": "Unknown execution error",
|
||
"clearEditor": "Clear editor",
|
||
"dragResize": "Drag to resize",
|
||
"execErrorTitle": "SQL execution error:"
|
||
},
|
||
"tableBrowser": {
|
||
"tableBrowser": "Table browser",
|
||
"tableBrowserDesc": "Browse physical database table details and contents",
|
||
"selectTable": "Select table",
|
||
"noRecordsInTable": "No records in this table",
|
||
"totalRows": "Total rows",
|
||
"records": "records",
|
||
"prevPage": "Previous",
|
||
"nextPage": "Next",
|
||
"pageIndicator": "Page {current} / {total}",
|
||
"noTableSelected": "No table selected or table structure cannot be loaded",
|
||
"fetchTableFailed": "Failed to fetch data for table {table}",
|
||
"unknownError": "Unknown error"
|
||
},
|
||
"unknownError": "Unknown error",
|
||
"exportException": "Export failed"
|
||
},
|
||
"logs": {
|
||
"pageTitle": "System logs",
|
||
"accessAnalytics": "Access analytics",
|
||
"userAccessLogs": "User access logs",
|
||
"appRuntimeLogs": "Application logs",
|
||
"accessLogs": {
|
||
"clickhouseDisabled": "ClickHouse disabled",
|
||
"clickhouseDisabledDesc": "ClickHouse storage is not enabled in the current system configuration. User access logs are not collected. To use this feature, configure and enable ClickHouse in the backend config.yaml file.",
|
||
"username": "Username",
|
||
"usernamePlaceholder": "Search by username...",
|
||
"apiPath": "API path",
|
||
"pathPlaceholder": "Fuzzy match path...",
|
||
"startTime": "Start time",
|
||
"endTime": "End time",
|
||
"search": "Search",
|
||
"reset": "Reset",
|
||
"loadingAccessLogs": "Loading access logs...",
|
||
"noAccessLogs": "No access log data found",
|
||
"colMethod": "Method",
|
||
"colPath": "Path",
|
||
"colUser": "User",
|
||
"colIp": "IP",
|
||
"colStatus": "Status",
|
||
"colLatency": "Latency",
|
||
"colRequestTime": "Request time",
|
||
"colDetail": "Detail",
|
||
"unknownUser": "Unknown user",
|
||
"paginationInfo": "{total} records, page {page}/{totalPages}",
|
||
"prevPage": "Previous",
|
||
"nextPage": "Next",
|
||
"accessLogDetail": "Access log details",
|
||
"method": "Method",
|
||
"responseStatus": "Response status",
|
||
"latency": "Latency",
|
||
"ipAddress": "IP address",
|
||
"user": "User",
|
||
"noNickname": "No nickname",
|
||
"unknownGuest": "Unknown / Guest",
|
||
"requestPath": "Request path",
|
||
"requestTime": "Request time",
|
||
"noLogSelected": "No log entry selected",
|
||
"copiedToClipboard": "{subject} copied to clipboard",
|
||
"noHeaderData": "No header data",
|
||
"accessId": "Access ID: {id}",
|
||
"copyUserAgent": "Copy User-Agent",
|
||
"copyHeaders": "Copy Headers"
|
||
},
|
||
"analytics": {
|
||
"clickhouseDisabled": "ClickHouse disabled",
|
||
"clickhouseDisabledDesc": "ClickHouse storage is not enabled in the current system configuration. User access logs are not collected. To use this feature, configure and enable ClickHouse in the backend config.yaml file.",
|
||
"loadingAnalytics": "Loading access analytics...",
|
||
"totalRequests7d": "Total requests (7 days)",
|
||
"totalRequests7dDesc": "Total authenticated API requests recorded by the system",
|
||
"activeBrowserTypes": "Active browser types",
|
||
"activeBrowserTypesDesc": "Number of browser agent categories that made requests this week",
|
||
"activeUsers": "Active unique users",
|
||
"activeUsersDesc": "Registered accounts with high-frequency requests in the past week",
|
||
"weeklyAccessTrend": "Weekly access trend",
|
||
"weeklyAccessTrendDesc": "Daily API request curve over the last 7 days",
|
||
"noTrendData": "No trend data",
|
||
"browserRanking": "Browser ranking",
|
||
"browserRankingDesc": "Weekly distribution based on User-Agent header classification",
|
||
"noBrowserData": "No browser ranking data",
|
||
"topActiveUsers": "Most active users (Top 10)",
|
||
"topActiveUsersDesc": "Accounts with the most API requests in the past week",
|
||
"noActiveUsersData": "No active user data",
|
||
"unknown": "Unknown",
|
||
"noNickname": "(no nickname)",
|
||
"requests": "requests",
|
||
"fetchFailed": "Failed to fetch analytics",
|
||
"requestVolume": "Requests",
|
||
"requestCount": "Request count",
|
||
"countTimes": "{count} ({percent}%)"
|
||
},
|
||
"appLogs": {
|
||
"loading": "Loading...",
|
||
"loadOlderLogs": "Load older logs",
|
||
"noLogs": "No logs",
|
||
"backToLatest": "Back to latest",
|
||
"fetchFailed": "Failed to fetch logs",
|
||
"loadOlderFailed": "Failed to load older logs"
|
||
}
|
||
},
|
||
"system": {
|
||
"pageTitle": "System config",
|
||
"configKey": "Key",
|
||
"configValue": "Value",
|
||
"required": "Required",
|
||
"configDescription": "Description",
|
||
"optionalDescription": "Optional description",
|
||
"publicVisibility": "Public visibility",
|
||
"configType": "Config type",
|
||
"systemConfig": "System config",
|
||
"businessConfig": "Business config",
|
||
"createdAt": "Created at",
|
||
"emptyDescription": "No system configuration found",
|
||
"loadingDescription": "Loading configuration...",
|
||
"visible": "Visible",
|
||
"invisible": "Hidden",
|
||
"description": "Description"
|
||
},
|
||
"settings": {
|
||
"pageTitle": "System settings",
|
||
"tabs": {
|
||
"security": "Security",
|
||
"operation": "Operation",
|
||
"system": "System",
|
||
"other": "Other",
|
||
"status": "Status",
|
||
"info": "Info",
|
||
"openflare": "OpenFlare"
|
||
},
|
||
"status": {
|
||
"pageTitle": "System status",
|
||
"fetchFailed": "Failed to fetch system status",
|
||
"unknownRequestError": "An unknown error occurred during the request",
|
||
"autoRefresh": "Auto refresh",
|
||
"refresh": "Refresh",
|
||
"cards": {
|
||
"serviceOverview": "Service overview",
|
||
"serviceOverviewDesc": "Basic service health indicators",
|
||
"memoryStats": "Memory statistics",
|
||
"memoryStatsDesc": "Main memory consumption overview",
|
||
"heapStack": "Heap / Stack details",
|
||
"heapStackDesc": "Runtime heap and stack memory space details",
|
||
"internalStructs": "Internal structures",
|
||
"internalStructsDesc": "Runtime internal management structure overhead",
|
||
"gcAndAlloc": "GC & allocation counts",
|
||
"gcAndAllocDesc": "GC history data and allocation frequency"
|
||
},
|
||
"metrics": {
|
||
"uptime": "Service uptime",
|
||
"goroutines": "Current goroutines",
|
||
"heapObjects": "Heap objects",
|
||
"alloc": "Current memory usage",
|
||
"totalAlloc": "Total allocated memory",
|
||
"sys": "Memory footprint",
|
||
"nextGc": "Next GC memory target",
|
||
"memoryUsagePercent": "Current usage (Alloc / Sys)",
|
||
"heapAlloc": "Current heap memory usage",
|
||
"heapSys": "Heap memory footprint",
|
||
"heapIdle": "Heap memory idle",
|
||
"heapInuse": "Heap memory in use",
|
||
"heapReleased": "Heap memory released",
|
||
"stackInuse": "Stack memory in use",
|
||
"stackSys": "Allocated stack memory",
|
||
"mspanInuse": "MSpan structure memory in use",
|
||
"mspanSys": "Allocated MSpan memory",
|
||
"mcacheInuse": "MCache structure memory in use",
|
||
"mcacheSys": "Allocated MCache memory",
|
||
"buckHashSys": "Allocated profiling hash table memory",
|
||
"gcSys": "Allocated GC metadata memory",
|
||
"otherSys": "Other allocated system memory",
|
||
"numGc": "GC execution count",
|
||
"lastGcTime": "Time since last GC",
|
||
"pauseTotalNs": "Total GC pause time",
|
||
"lastPause": "Last GC pause time",
|
||
"mallocs": "Memory allocation count",
|
||
"frees": "Memory free count",
|
||
"lookups": "Pointer lookup count"
|
||
}
|
||
}
|
||
},
|
||
"demo": {
|
||
"pageTitle": "Development standards demo",
|
||
"specTitle": "Specification notes",
|
||
"specDescription": "This page demonstrates the standard title bar layout for sidebar-linked pages, for development reference.",
|
||
"coreSpecTitle": "Core specification details and writing principles:",
|
||
"rules": {
|
||
"structureFocus": {
|
||
"title": "Structure focus",
|
||
"description": ": Page title area must be kept absolutely clean. Do not place any description paragraphs or small subtitles below the title. Keep the page minimal and information-pure at first glance."
|
||
},
|
||
"containerAlignment": {
|
||
"title": "Container and top-margin alignment",
|
||
"description": "As the base container for the title row (without bottom border), the outer wrapper uniformly uses",
|
||
"description2": "for top-margin visual alignment, ensuring consistent top height feel when switching menus."
|
||
},
|
||
"iconPresentation": {
|
||
"title": "Icon presentation",
|
||
"description": "style. Do not wrap icons in any background cards, rounded corners, or decorative borders."
|
||
},
|
||
"textStyle": {
|
||
"title": "Text style standard",
|
||
"description": ". No bold weight (e.g.",
|
||
"description2": ") or any gradients. Maintain consistent typography site-wide."
|
||
},
|
||
"tabsModular": {
|
||
"title": "Tabs modular decomposition",
|
||
"description": "or place locally under",
|
||
"description2": "). The main page file only maintains the active tab state and outer skeleton layout."
|
||
},
|
||
"complexityDriven": {
|
||
"title": "Complexity-driven block decomposition",
|
||
"description": "lines, high-density blocks must be decomposed into sub-components. Route-specific, non-reusable sub-components go in the route's feature directory (e.g.",
|
||
"description2": "). Only truly cross-page reusable components go into the global",
|
||
"description3": ". A typical reference case is \"Database\" ("
|
||
}
|
||
},
|
||
"tabs": {
|
||
"dashboard": "Dashboard & metric cards",
|
||
"table": "Data table standards",
|
||
"controls": "Input controls & forms"
|
||
},
|
||
"controls": {
|
||
"formDemoTitle": "Form & input interaction demo",
|
||
"formDemoDesc": "Includes button variants, dropdown selects, checkboxes, and standard input styles",
|
||
"taskName": "Task name",
|
||
"taskNamePlaceholder": "Enter task description...",
|
||
"taskNameHint": "Task name is used for human-readable display in execution records",
|
||
"taskCategory": "Task category",
|
||
"categoryDatabase": "Database ops",
|
||
"categorySync": "Batch data sync",
|
||
"categoryCleanup": "Expired disk cleanup",
|
||
"allowNotify": "Allow async push notifications",
|
||
"allowNotifyDesc": "When checked, multi-channel push notifications will be dispatched after successful task completion.",
|
||
"buttonStyles": "Button style alignment:",
|
||
"primaryButton": "Primary action",
|
||
"secondaryButton": "Secondary action",
|
||
"outlineButton": "Outline",
|
||
"ghostButton": "Ghost",
|
||
"formDesignSpec": "Form design specification",
|
||
"spec": {
|
||
"unifiedHeight": "1. Unified control height and shadow:",
|
||
"checkboxAlignment": "2. Checkbox and text alignment:",
|
||
"buttonStrategy": "3. Button usage strategy:"
|
||
}
|
||
},
|
||
"table": {
|
||
"mockData": {
|
||
"syncExport": "Batch user info sync export",
|
||
"dbBackup": "Weekly automatic database backup archive",
|
||
"s3Cleanup": "Remote S3 expired cache object auto-cleanup task"
|
||
},
|
||
"mockType": {
|
||
"dataSync": "Data sync",
|
||
"dbOps": "Database ops",
|
||
"diskCleanup": "Disk cleanup"
|
||
},
|
||
"mockDuration": {
|
||
"running": "Running"
|
||
},
|
||
"searchPlaceholder": "Search by task name...",
|
||
"filter": "Filter",
|
||
"newTask": "New task",
|
||
"columns": {
|
||
"taskId": "Task ID",
|
||
"taskName": "Task name",
|
||
"taskType": "Type",
|
||
"status": "Status",
|
||
"duration": "Duration",
|
||
"triggerTime": "Trigger time",
|
||
"actions": "Actions"
|
||
},
|
||
"status": {
|
||
"success": "Success",
|
||
"running": "Running",
|
||
"failed": "Failed"
|
||
},
|
||
"tableDesignSpec": "Table design specification and code template",
|
||
"spec": {
|
||
"container": "Table containers must use dashed-border containers, i.e. class name:",
|
||
"headerBg": "Table header background is",
|
||
"headerStyle": ". Header cell font is small and bold.",
|
||
"cellDivider": "Cells use dashed dividers between rows and columns (",
|
||
"rowHover": "). Table row hover uses a gentle transition.",
|
||
"monoFont": "Encoded, primary key, or unique ID fields must use monospace font:",
|
||
"badgeStyle": "Badges should be rounded (",
|
||
"badgeStyle2": ") with light backgrounds and corresponding icon dots for a modern, high-contrast visual feel."
|
||
}
|
||
},
|
||
"dashboard": {
|
||
"cpuUsage": "Container CPU usage",
|
||
"cpuStatus": "Container running normally, load stable",
|
||
"storageUsage": "Storage used",
|
||
"storageStatus": "Data synced to remote S3 bucket, supports auto-expiry",
|
||
"database": "Physical database",
|
||
"activeConnections": "Active connections:",
|
||
"totalTables": "Total tables:",
|
||
"dbStatus": "Connection pool auto-maintained, max connections: 100",
|
||
"dashboardDesignSpec": "Metric cards & dashboard design specification",
|
||
"spec": {
|
||
"dashedBorder": "Metric cards uniformly use",
|
||
"dashedBorder2": "for border and shadow.",
|
||
"headerLayout": "Header uses",
|
||
"headerLayout2": "layout: small title text on the left, Lucide icon on the right.",
|
||
"valueStyle": "Numeric emphasis uses and only uses",
|
||
"valueStyle2": "display.",
|
||
"progressBar": "Progress bars use",
|
||
"progressBar2": "thin bar height, not overpowering.",
|
||
"secondaryText": "Secondary description text at the bottom must uniformly use",
|
||
"secondaryText2": "and similar utility classes."
|
||
}
|
||
}
|
||
}
|
||
},
|
||
"docs": {
|
||
"backToHome": "Back to home",
|
||
"sectionCount": "{count} sections",
|
||
"lastUpdated": "Last updated",
|
||
"copied": "Copied",
|
||
"copyMarkdown": "Copy Markdown",
|
||
"toc": "Table of contents",
|
||
"haveQuestions": "Have questions?",
|
||
"contactSupport": "Contact support",
|
||
"api": {
|
||
"title": "API documentation",
|
||
"description": "Complete reference for the Wavelet Platform backend API, covering authentication, users, tokens, and configuration management.",
|
||
"field": "Field",
|
||
"type": "Type",
|
||
"descriptionLabel": "Description",
|
||
"endpoint": "Endpoint",
|
||
"desc": "Description",
|
||
"param": "Parameter",
|
||
"required": "Required",
|
||
"yes": "Yes",
|
||
"no": "No",
|
||
"username": "Username",
|
||
"password": "Password",
|
||
"optional": "Optional",
|
||
"default": "Default",
|
||
"section1": {
|
||
"title": "General conventions",
|
||
"desc": "All API responses follow a unified envelope format.",
|
||
"responseFormat": "Response format",
|
||
"responseFormatDesc": "All endpoints return the following JSON structure:",
|
||
"errorMsgDesc": "Empty string on success, human-readable error message on failure",
|
||
"dataDesc": "Business data; structure varies by endpoint",
|
||
"successExample": "Success response example",
|
||
"failExample": "Failure response example",
|
||
"failExampleErrorMsg": "Error message",
|
||
"authentication": "Authentication",
|
||
"authenticationDesc": "The system supports two authentication methods. All protected endpoints require one of them:",
|
||
"sessionCredential": "Session credential",
|
||
"sessionCredentialDesc": "Returned via Set-Cookie after login. Browsers carry it automatically.",
|
||
"accessTokenCredential": "AccessToken credential",
|
||
"accessTokenCredentialDesc": "Passed via Header. Suitable for API calls and third-party integrations:",
|
||
"supportedHeaders": "Supported headers"
|
||
},
|
||
"section2": {
|
||
"title": "Authentication endpoints",
|
||
"register": "Register",
|
||
"registerDesc": "Create a new user account and log in automatically.",
|
||
"usernameDesc": "Username, unique, at least 3 characters",
|
||
"passwordDesc": "Password, at least 8 characters",
|
||
"nicknameDesc": "Nickname (optional)",
|
||
"passwordLogin": "Password login",
|
||
"passwordLoginDesc": "Log in with email/username + password. Sets cookie on success.",
|
||
"logout": "Logout",
|
||
"logoutDesc": "Destroy the current session.",
|
||
"getProfile": "Get current user info",
|
||
"getProfileDesc": "Returns the complete profile of the currently logged-in user."
|
||
},
|
||
"section3": {
|
||
"title": "Access token management",
|
||
"desc": "Manage personal API access tokens (AccessToken) for non-browser API usage.",
|
||
"listTokens": "List tokens",
|
||
"listTokensDesc": "Get all active access tokens for the current user.",
|
||
"createToken": "Create token",
|
||
"tokenName": "Token name",
|
||
"createTokenDesc": "Create a new access token. Returns the secret once.",
|
||
"isAdminDesc": "Whether to grant admin permissions (default false)",
|
||
"endpoint": "Endpoint",
|
||
"successResponseExample": "Success response example",
|
||
"deleteToken": "Delete token",
|
||
"deleteTokenDesc": "Revoke the specified access token.",
|
||
"rotateToken": "Rotate token",
|
||
"rotateTokenDesc": "Generate a new secret for the specified token. The old secret is immediately invalidated."
|
||
},
|
||
"section4": {
|
||
"title": "System configuration management",
|
||
"publicConfig": "Get public configuration",
|
||
"publicConfigDesc": "Returns all system configuration items marked as public. No authentication required.",
|
||
"responseExample": "Response example",
|
||
"adminConfigs": "Admin configuration endpoints",
|
||
"adminConfigsDesc": "The following endpoints require admin permissions.",
|
||
"getConfigList": "Get configuration list",
|
||
"createConfig": "Create configuration",
|
||
"updateConfig": "Update configuration",
|
||
"deleteConfig": "Delete configuration"
|
||
}
|
||
},
|
||
"howToUse": {
|
||
"title": "User guide",
|
||
"description": "Quick start guide for Wavelet Platform, covering authentication, tokens, configuration, tasks, and observability.",
|
||
"section1": {
|
||
"title": "System architecture overview",
|
||
"desc": "Wavelet Platform uses a Go + Next.js frontend-backend separated architecture.",
|
||
"architecture": "Tech stack",
|
||
"architectureDesc": "Go 1.25+ / Gin / GORM / PostgreSQL / Redis / Asynq",
|
||
"authSystem": "Authentication system",
|
||
"authSystemDesc": "Supports password login + OIDC third-party authentication",
|
||
"accessToken": "Access tokens",
|
||
"accessTokenDesc": "Personal Access Tokens for API calls",
|
||
"observability": "Observability",
|
||
"observabilityDesc": "OpenTelemetry + structured logging"
|
||
},
|
||
"section2": {
|
||
"title": "Authentication & registration",
|
||
"desc": "The system supports multiple authentication methods, configurable via the admin panel.",
|
||
"passwordAuth": "Password authentication",
|
||
"selfRegister": "Self-registration",
|
||
"selfRegisterDesc": "Users can create accounts via the registration page.",
|
||
"bcryptDesc": "Passwords are stored with bcrypt encryption.",
|
||
"switchControl": "Toggle controls",
|
||
"switchControlDesc": "Admins can independently control:",
|
||
"oidc": "OIDC third-party login",
|
||
"oidcDesc": "Supports configuring any OIDC-compatible authentication source (e.g. Google, GitHub, enterprise SSO).",
|
||
"oidcStep1": "Add an authentication source in “System settings → Security”",
|
||
"oidcStep2": "Enter Discovery URL, Client ID, Client Secret",
|
||
"oidcStep3": "Once enabled, the login page will show the corresponding button"
|
||
},
|
||
"section3": {
|
||
"title": "Access tokens (AccessToken)",
|
||
"desc": "Used for non-browser API calls.",
|
||
"generation": "Generation & management",
|
||
"oneTimeDisplay": "One-time display",
|
||
"oneTimeDisplayDesc": "The secret is only shown once when the token is created.",
|
||
"oneTimeDisplayHint": "Copy and save it immediately after creation.",
|
||
"secureHash": "Secure storage",
|
||
"secureHashDesc": "The system only stores a SHA-256 hash of the token. The original secret cannot be recovered.",
|
||
"headerUsage": "Usage",
|
||
"headerUsageDesc": "Include the token in the request header:",
|
||
"bearerHeader": "Bearer Token method",
|
||
"customHeader": "Custom header method"
|
||
},
|
||
"section4": {
|
||
"title": "System configuration",
|
||
"desc": "Manage system configuration dynamically via the admin panel or API.",
|
||
"cacheAccel": "Cache acceleration",
|
||
"cacheAccelDesc": "Public configuration items support multi-level caching (memory → Redis → database), performing well in high-frequency read scenarios.",
|
||
"coreConfigs": "Core configuration items",
|
||
"siteName": "Site name",
|
||
"passwordLoginEnabled": "Password login toggle",
|
||
"registrationEnabled": "Registration toggle",
|
||
"maxApiKeys": "Max API keys"
|
||
},
|
||
"section5": {
|
||
"title": "Async tasks",
|
||
"desc": "Distributed task queue system based on Asynq.",
|
||
"scheduler": "Scheduler",
|
||
"schedulerDesc": "Supports Cron expression configuration for scheduled tasks.",
|
||
"worker": "Worker",
|
||
"workerDesc": "Background worker processes consume and execute tasks."
|
||
},
|
||
"section6": {
|
||
"title": "Observability",
|
||
"desc": "Built-in OpenTelemetry support.",
|
||
"tracing": "Distributed tracing",
|
||
"tracingDesc": "Supports exporting trace data to Jaeger, Zipkin, and other backends.",
|
||
"structuredLog": "Structured logging",
|
||
"structuredLogDesc": "High-performance structured logging based on Zap, with level-based output."
|
||
}
|
||
},
|
||
"terms": {
|
||
"title": "Terms of service",
|
||
"description": "Please read the following terms of service carefully before using Wavelet Platform.",
|
||
"section1": {
|
||
"title": "General provisions",
|
||
"subject": "Agreement parties",
|
||
"subjectDesc": "This agreement is between you and the operator of Wavelet Platform regarding the use of platform services.",
|
||
"readCarefully": "Please read carefully",
|
||
"readCarefullyDesc": "Please read all contents of this agreement before using the service. If you disagree with any terms, please do not use the platform.",
|
||
"composition": "Agreement composition",
|
||
"compositionDesc": "This agreement includes the agreement text and all rules that the platform has published or may publish in the future. All rules are integral parts of this agreement and have the same legal effect as the agreement text."
|
||
},
|
||
"section2": {
|
||
"title": "Service content",
|
||
"liability": "Scope of responsibility",
|
||
"liabilityDesc": "This platform provides only technical infrastructure and development tool services. Users bear all responsibilities arising from their use of the platform."
|
||
},
|
||
"section3": {
|
||
"title": "User accounts",
|
||
"accountSystem": "Account system",
|
||
"accountSystemDesc": "After registering and obtaining an account on this platform, users should properly keep their account and password. Users are responsible for all actions under their account.",
|
||
"securityResponsibility": "Security responsibility",
|
||
"passwordSecurity": "Password security",
|
||
"passwordSecurityDesc": "Users should use sufficiently strong passwords and change them regularly. Losses caused by improper password keeping are the user's responsibility.",
|
||
"tokenSecurity": "Token security",
|
||
"tokenSecurityDesc": "Access tokens (AccessToken) are equivalent to account credentials and should be properly safeguarded.",
|
||
"tokenLeakLiability": "Any losses caused by token leakage are the user's responsibility."
|
||
},
|
||
"section4": {
|
||
"title": "Usage rules",
|
||
"desc": "Users must comply with the following rules when using platform services:",
|
||
"redLine": "Prohibited actions",
|
||
"nationalSecurity": "Endangering national security",
|
||
"nationalSecurityDesc": "Must not use platform services to produce, copy, or publish information that endangers national security.",
|
||
"illegalInfo": "Illegal information",
|
||
"illegalInfoDesc": "Must not produce, copy, or publish information that violates national laws and regulations.",
|
||
"harmfulContent": "Harmful content",
|
||
"harmfulContentDesc": "Must not publish information containing harassment, insults, intimidation, or other harmful content.",
|
||
"ipInfringement": "Intellectual property infringement",
|
||
"ipInfringementDesc": "Must not infringe on others' intellectual property, trade secrets, or other legitimate rights.",
|
||
"otherIllegal": "Other illegal acts",
|
||
"otherIllegalDesc": "Must not use platform services to engage in other acts that violate laws and regulations.",
|
||
"enforcement": "Enforcement",
|
||
"enforcementDesc": "If users violate the above rules, the platform reserves the right to take the following actions:",
|
||
"enforcementAction": "Warning, suspension, or termination of service"
|
||
},
|
||
"section5": {
|
||
"title": "Disclaimer",
|
||
"basicDisclaimer": "Basic disclaimer",
|
||
"basicDisclaimerDesc": "The platform will make every effort to ensure service security and stability, but is not responsible for the following situations:",
|
||
"techInterruption": "Technical interruption",
|
||
"techInterruptionDesc": "Service interruption or data loss caused by:",
|
||
"naturalDisaster": "Natural disasters and other force majeure",
|
||
"govAction": "Government actions or legal changes",
|
||
"telecomFailure": "Telecom operator failures",
|
||
"hacking": "Hacker attacks or computer viruses"
|
||
},
|
||
"section6": {
|
||
"title": "Governing law & dispute resolution",
|
||
"applicableLaw": "Governing law",
|
||
"applicableLawDesc": "The conclusion, performance, and interpretation of this agreement are governed by:",
|
||
"lawName": "The laws of the People's Republic of China",
|
||
"lawScope": "Excluding conflict of laws rules",
|
||
"disputeResolution": "Dispute resolution",
|
||
"disputeResolutionDesc": "Any dispute arising from or related to this agreement shall be resolved through friendly negotiation. If negotiation fails, either party may file a lawsuit with a court of competent jurisdiction."
|
||
}
|
||
},
|
||
"privacy": {
|
||
"title": "Privacy policy",
|
||
"description": "Wavelet Platform values user privacy. This policy explains how we collect, use, and protect your personal information.",
|
||
"descriptionRights": "Please read this policy carefully before using our services.",
|
||
"section1": {
|
||
"title": "Information collection",
|
||
"desc": "We collect the following types of information:",
|
||
"authInfo": "Authentication information",
|
||
"authInfoDesc": "Including username, email address, and encrypted password hash.",
|
||
"authInfoNote": "We do not store your plaintext password.",
|
||
"logInfo": "Access logs",
|
||
"logInfoDesc": "Including IP address, browser type, access time, and request path."
|
||
},
|
||
"section2": {
|
||
"title": "Information usage",
|
||
"desc": "The information we collect is used for the following purposes:",
|
||
"storageSecurity": "Storage security",
|
||
"storageSecurityDesc": "All user data is encrypted and stored in secure server environments.",
|
||
"encryption": "Encryption measures",
|
||
"encryptionDesc": "Passwords use bcrypt one-way hash encryption. Tokens use SHA-256 hash storage.",
|
||
"accessControl": "Access control",
|
||
"accessControlDesc": "Strict permission management ensures only authorized personnel can access user data."
|
||
},
|
||
"section3": {
|
||
"title": "Purpose of information use",
|
||
"desc": "The information we collect is used for the following purposes:",
|
||
"identity": "Identity verification",
|
||
"identityDesc": "Verify user identity and ensure account security.",
|
||
"business": "Business operations",
|
||
"businessDesc": "Provide, maintain, and improve our services.",
|
||
"riskControl": "Risk control",
|
||
"riskControlDesc": "Detect, prevent, and handle security risks and fraudulent activities.",
|
||
"prohibited": "Prohibited uses",
|
||
"prohibitedDesc": "We commit not to use user information for: selling to third parties, sending unsolicited commercial promotions."
|
||
},
|
||
"section4": {
|
||
"title": "Information sharing & disclosure",
|
||
"sharingPrinciple": "Sharing principle",
|
||
"sharingPrincipleDesc": "We do not share personal information with third parties without user consent, except in the following situations:",
|
||
"sharingException1": "Required by laws, regulations, or government authorities through legal procedures",
|
||
"sharingException2": "Necessary to protect the platform's or the public's legitimate rights",
|
||
"transfer": "Information transfer",
|
||
"transferDesc": "In the event of a merger, acquisition, or similar transaction, we will require the new holder to continue to be bound by this policy."
|
||
},
|
||
"section5": {
|
||
"title": "User rights",
|
||
"desc": "Users have the following rights regarding their personal information:",
|
||
"viewManage": "View and manage",
|
||
"viewManageDesc": "Users can view and modify their personal information at any time in their settings.",
|
||
"deleteAccount": "Account deletion",
|
||
"deleteAccountDesc": "Users can request deletion of their account and all associated personal data."
|
||
},
|
||
"section6": {
|
||
"title": "Policy updates",
|
||
"desc": "We may update this privacy policy from time to time. After updates, we will post a notice on the platform.",
|
||
"notification": "Significant changes will be notified via in-app notification or email."
|
||
}
|
||
}
|
||
},
|
||
"home": {
|
||
"banner": {
|
||
"description": "A general-purpose secondary development platform with built-in user management, authentication, file storage, task scheduling, push notifications, and observability to help developers quickly start new projects.",
|
||
"getStarted": "Get started",
|
||
"hideHint": "Dismiss"
|
||
},
|
||
"navigation": {
|
||
"title": "Navigation"
|
||
},
|
||
"quickLinks": {
|
||
"profile": {
|
||
"title": "Profile",
|
||
"description": "View and edit your account information"
|
||
},
|
||
"apiDocs": {
|
||
"title": "API docs",
|
||
"description": "Complete API reference"
|
||
},
|
||
"userDocs": {
|
||
"title": "User guide",
|
||
"description": "Quick start guide"
|
||
}
|
||
},
|
||
"adminLinks": {
|
||
"settings": {
|
||
"title": "System settings",
|
||
"description": "Configure security, operations, and appearance"
|
||
},
|
||
"systemConfig": {
|
||
"title": "System config",
|
||
"description": "Manage key-value system configuration items"
|
||
},
|
||
"userManagement": {
|
||
"title": "User management",
|
||
"description": "View and manage all registered users"
|
||
},
|
||
"tasks": {
|
||
"title": "Tasks",
|
||
"description": "Async task queue and scheduled task scheduling"
|
||
},
|
||
"logs": {
|
||
"title": "System logs",
|
||
"description": "User access logs and application runtime logs"
|
||
}
|
||
},
|
||
"jumpNow": "Jump now",
|
||
"enterNow": "Enter now",
|
||
"adminConsole": "Admin console",
|
||
"developerSection": {
|
||
"heading": "Developer friendly",
|
||
"description": "Built-in complete RESTful API docs, Swagger UI, and TypeScript SDK examples for quick integration.",
|
||
"features": {
|
||
"restful": "Complete RESTful API",
|
||
"swagger": "Online Swagger docs",
|
||
"typescript": "TypeScript SDK examples",
|
||
"examples": "Rich usage examples"
|
||
},
|
||
"apiDocs": "View API docs",
|
||
"codeComment": "// Quick start — API call example",
|
||
"codeQuickStart": "Quick start"
|
||
},
|
||
"hero": {
|
||
"subtitle": "Built-in user authentication, file storage, task scheduling,",
|
||
"subtitleLine2": "push notifications, and observability to help you quickly launch your next project.",
|
||
"getStarted": "Get started",
|
||
"learnMore": "Learn more",
|
||
"features": {
|
||
"readyToUse": "Ready to use",
|
||
"highlyExtensible": "Highly extensible",
|
||
"industrialGrade": "Industrial grade"
|
||
}
|
||
},
|
||
"footer": {
|
||
"description": "A general-purpose platform scaffold for secondary development",
|
||
"product": "Product",
|
||
"dashboard": "Dashboard",
|
||
"personalSettings": "Personal settings",
|
||
"development": "Development",
|
||
"quickStart": "Quick start",
|
||
"apiDocs": "API docs",
|
||
"sourceCode": "Source code",
|
||
"community": "Community",
|
||
"discussions": "Discussions",
|
||
"privacyPolicy": "Privacy policy",
|
||
"termsOfService": "Terms of service"
|
||
}
|
||
},
|
||
"files": {
|
||
"uploadSuccess": "File uploaded successfully",
|
||
"uploadFailed": "Upload failed",
|
||
"deleteSuccess": "File deleted successfully",
|
||
"deleteFailed": "Delete failed",
|
||
"searchPlaceholder": "Search file name...",
|
||
"private": "Private",
|
||
"public": "Public",
|
||
"uploading": "Uploading...",
|
||
"uploadFile": "Upload file",
|
||
"noFiles": "No files uploaded yet",
|
||
"noMatchingFiles": "No matching files found",
|
||
"uploadFirstFile": "Upload your first file. Supports images, videos, documents, and archives.",
|
||
"selectFileUpload": "Select file to upload",
|
||
"downloadFile": "Download file",
|
||
"deleteFile": "Delete file",
|
||
"prevPage": "Previous",
|
||
"nextPage": "Next",
|
||
"confirmDeleteFile": "Confirm file deletion",
|
||
"confirmDeleteFileDesc": "Delete file “{name}”? This file cannot be recovered after deletion.",
|
||
"cancel": "Cancel",
|
||
"confirmDelete": "Confirm delete",
|
||
"myFiles": "My files"
|
||
},
|
||
"general": {
|
||
"manage": {
|
||
"saveSuccess": "Saved",
|
||
"saveFailed": "Save failed",
|
||
"unknownError": "Unknown error",
|
||
"deleteSuccess": "Deleted",
|
||
"deleteFailed": "Delete failed",
|
||
"loading": "Loading",
|
||
"noData": "No data",
|
||
"configList": "Configuration list",
|
||
"confirmDelete": "Confirm delete?",
|
||
"confirmDeleteDesc": "This cannot be undone. This will permanently delete the configuration.",
|
||
"cancel": "Cancel",
|
||
"confirmDeleteAction": "Confirm delete",
|
||
"configInfo": "Configuration info",
|
||
"selectConfigToView": "Select a configuration to view details",
|
||
"updating": "Updating",
|
||
"update": "Update",
|
||
"actions": "Actions"
|
||
},
|
||
"passwordDialog": {
|
||
"enterPassword": "Enter password",
|
||
"enterPasswordDesc": "For your account security, please enter the 6-digit verification password",
|
||
"cancel": "Cancel",
|
||
"verifying": "Verifying...",
|
||
"confirm": "Confirm"
|
||
}
|
||
},
|
||
"contexts": {
|
||
"adminUsers": {
|
||
"userStatusChanged": "User {username} has been {action}",
|
||
"enabled": "enabled",
|
||
"disabled": "disabled",
|
||
"updateStatusFailed": "Failed to update status",
|
||
"userCreated": "User {username} created successfully",
|
||
"createUserFailed": "Failed to create user",
|
||
"userDeleted": "User {username} deleted",
|
||
"deleteUserFailed": "Failed to delete user",
|
||
"updateUserSuccess": "User information updated",
|
||
"updateUserFailed": "Failed to update user information"
|
||
},
|
||
"admin": {
|
||
"loadConfigFailed": "Failed to load system configuration",
|
||
"updateConfigFailed": "Failed to update system configuration"
|
||
},
|
||
"user": {
|
||
"getUserInfoFailed": "Failed to get user information",
|
||
"logoutFailed": "Logout failed"
|
||
}
|
||
},
|
||
"notFound": {
|
||
"description": "Sorry, the page you're looking for seems lost in the digital nebula. Please check the path or return to safety.",
|
||
"previousPage": "Previous page",
|
||
"home": "Home"
|
||
},
|
||
"providers": {
|
||
"titleUpdater": {
|
||
"login": "Login",
|
||
"register": "Register",
|
||
"admin": "Admin",
|
||
"dashboard": "Dashboard"
|
||
}
|
||
},
|
||
"metadata": {
|
||
"title": "OpenFlare",
|
||
"description": "OpenFlare edge node and reverse proxy control plane"
|
||
},
|
||
"dashboard": {
|
||
"title": "Overview",
|
||
"generatedAt": "Generated at {time}",
|
||
"refresh": "Refresh",
|
||
"loadingTitle": "Loading overview",
|
||
"loadingDesc": "Aggregating node health, traffic, and capacity metrics...",
|
||
"loadFailed": "Failed to load overview: {error}",
|
||
"emptyTitle": "No overview data",
|
||
"emptyDesc": "The system is running, but there is no aggregated overview to show yet.",
|
||
"requestFailed": "Request failed. Please try again later.",
|
||
"stats": {
|
||
"requests24h": "24h requests",
|
||
"requestsMeta": "24h unique visitors {visitors} · errors {errors} · estimated QPS {qps}",
|
||
"clusterCapacity": "Cluster capacity",
|
||
"avgMemoryHighLoad": "Avg memory {memory} · high-load nodes CPU {cpu} / memory {memoryNodes} / storage {storage}",
|
||
"nodeOverview": "Node overview",
|
||
"onlineOf": "/ {total} online",
|
||
"pending": "Pending {count}",
|
||
"unhealthyOffline": "Unhealthy {unhealthy} · offline {offline}"
|
||
},
|
||
"world": {
|
||
"title": "Global stage",
|
||
"description": "Summarizes node distribution, source-country heat, and recent runtime status.",
|
||
"legendSource": "Source",
|
||
"legendHealthy": "Healthy",
|
||
"legendPressure": "Under load",
|
||
"legendUnhealthy": "Unhealthy",
|
||
"modeVisitorSource": "Visitor sources",
|
||
"modeNodeCoords": "Node coordinates",
|
||
"modeCoverage": "Coverage signal",
|
||
"onlineCoverage": "Online coverage",
|
||
"onlineHint": "{online}/{total} online",
|
||
"runHealth": "Runtime health",
|
||
"unhealthyCount": "{count} unhealthy",
|
||
"requests24h": "24h requests",
|
||
"qpsReported": "QPS {qps} · {count} nodes reporting",
|
||
"nodeCoords": "Node coordinates",
|
||
"sourceCountries": "{count} source countries",
|
||
"fallbackPins": "Preset pins are used when coordinates are missing",
|
||
"avgCpu": "Avg CPU",
|
||
"highCount": "{count} high",
|
||
"avgMemory": "Avg memory",
|
||
"highStorage": "High storage",
|
||
"offlinePending": "{offline} offline · {pending} pending",
|
||
"mapPreparing": "Preparing map",
|
||
"mapPreparingDesc": "Loads when it enters the viewport",
|
||
"noNodesOverlay": "No nodes yet. Geographic distribution will appear after nodes join."
|
||
},
|
||
"map": {
|
||
"sourceRequests": "Source requests in the last 24 hours {count}",
|
||
"presetPin": "Preset pin",
|
||
"requestsErrors": "Requests {requests} · errors {errors}",
|
||
"eventsStatus": "Active events {events} · node status {status}",
|
||
"openrestyStatus": "OpenResty status {status}",
|
||
"loadFailed": "Failed to load world map",
|
||
"loading": "Loading world map",
|
||
"loadFailedDesc": "The ECharts world map failed to register. Refresh and try again.",
|
||
"loadingDesc": "Initializing the world map after the first screen is ready.",
|
||
"measuring": "Measuring map container size..."
|
||
},
|
||
"trafficTrend": {
|
||
"title": "24-hour request trend",
|
||
"description": "Hourly request totals and 2xx/4xx/5xx counts to spot abnormal status spikes.",
|
||
"summaryHint": "Last 24 hours",
|
||
"requests": "Requests",
|
||
"status2xx": "2xx requests",
|
||
"status4xx": "4xx requests",
|
||
"status5xx": "5xx requests"
|
||
},
|
||
"capacityTrend": {
|
||
"title": "24-hour capacity trend",
|
||
"description": "Hourly CPU and memory usage to see whether cluster capacity stays tight.",
|
||
"avgCpu": "Avg CPU",
|
||
"avgMemory": "Avg memory"
|
||
},
|
||
"trafficCapacity": {
|
||
"title": "24-hour traffic and capacity trend",
|
||
"networkHint": "Last 24 hours · from access logs",
|
||
"received": "Data received",
|
||
"provided": "Data served",
|
||
"capacityHint": "Last 24 hours · host capacity · average"
|
||
},
|
||
"distributions": {
|
||
"sourceTitle": "Source distribution",
|
||
"sourceDesc": "Top source countries over the last 24 hours.",
|
||
"sourceEmpty": "No source distribution data",
|
||
"statusTitle": "Status code distribution",
|
||
"statusDesc": "Check whether successful responses still dominate and whether errors are rising.",
|
||
"statusEmpty": "No status code distribution",
|
||
"httpLabel": "HTTP {code}",
|
||
"domainTitle": "Top Domain",
|
||
"domainDesc": "See which domains concentrate most of the traffic.",
|
||
"domainEmpty": "No domain distribution"
|
||
},
|
||
"nodeHealth": {
|
||
"title": "Node health",
|
||
"description": "Sorted by active incidents and resource pressure.",
|
||
"openNodes": "Open nodes",
|
||
"emptyTitle": "No nodes",
|
||
"emptyDesc": "After nodes join, this list will show health and capacity summaries.",
|
||
"colNode": "Node",
|
||
"colStatus": "Status",
|
||
"colCpuMem": "CPU / Memory",
|
||
"colReqErr": "Requests / Errors",
|
||
"colEvents": "Active incidents",
|
||
"colHeartbeat": "Last heartbeat",
|
||
"colActions": "Actions",
|
||
"noGeo": "Map point not configured",
|
||
"wsConnected": "WS connected",
|
||
"na": "N/A",
|
||
"detail": "Details"
|
||
},
|
||
"nodeRank": {
|
||
"title": "Top nodes",
|
||
"traffic": "Highest traffic",
|
||
"trafficEmpty": "No traffic ranking",
|
||
"pressure": "Highest capacity pressure",
|
||
"pressureEmpty": "No capacity pressure data"
|
||
}
|
||
},
|
||
"nodes": {
|
||
"title": "Nodes",
|
||
"applyLogs": "Apply logs",
|
||
"create": "Add node",
|
||
"listTitle": "Node list",
|
||
"refreshNow": "Refresh now",
|
||
"loadingList": "Loading nodes...",
|
||
"emptyAll": "No nodes yet. Create one to get started.",
|
||
"emptyFilter": "No nodes match the current filter",
|
||
"updated": "Node updated",
|
||
"created": "Node created",
|
||
"deleted": "Node deleted",
|
||
"deleteTitle": "Delete node",
|
||
"deleteDesc": "Delete node “{name}”? You will need to recreate and rejoin it.",
|
||
"deleting": "Deleting...",
|
||
"confirmDelete": "Delete",
|
||
"edit": "Edit",
|
||
"delete": "Delete",
|
||
"refresh": "Refresh",
|
||
"detail": "Details",
|
||
"na": "N/A",
|
||
"wsConnected": "WS connected",
|
||
"wsEstablished": "WebSocket connection established",
|
||
"requestFailed": "Request failed. Please try again later.",
|
||
"unknown": "Unknown",
|
||
"running": "Running",
|
||
"liveConfig": "Live config",
|
||
"notApplied": "Not applied",
|
||
"enabled": "Enabled",
|
||
"manual": "Manual",
|
||
"lockedSuffix": " (locked)",
|
||
"noGeo": "Map point not configured",
|
||
"notConfigured": "Not configured",
|
||
"ipLine": "IP: {ip}",
|
||
"locationLine": "Location: {location}",
|
||
"backToList": "Back to nodes",
|
||
"missingId": "Missing node ID. Open details from the node list.",
|
||
"loadingDetail": "Loading node details...",
|
||
"notFound": "Node not found. It may have been deleted or the ID is invalid.",
|
||
"syncing": "Syncing...",
|
||
"forceSync": "Force sync",
|
||
"dispatching": "Dispatching...",
|
||
"viewUpgrade": "View upgrade",
|
||
"tabOverview": "Overview",
|
||
"tabManage": "Status & deploy",
|
||
"kpiNodeId": "Node ID",
|
||
"kpiLastSeen": "Last heartbeat",
|
||
"kpiCurrentConfig": "Current config",
|
||
"filter": {
|
||
"all": "All nodes",
|
||
"descAll": "Showing all nodes.",
|
||
"descRelay": "Showing Relay nodes only.",
|
||
"descTunnel": "Showing Tunnel nodes only.",
|
||
"descEdge": "Showing Edge nodes only."
|
||
},
|
||
"status": {
|
||
"online": "Online",
|
||
"pending": "Pending",
|
||
"offline": "Offline",
|
||
"running": "Running",
|
||
"wsConnected": "WS connected"
|
||
},
|
||
"apply": {
|
||
"success": "Success",
|
||
"warning": "Warning",
|
||
"failed": "Failed",
|
||
"none": "N/A"
|
||
},
|
||
"health": {
|
||
"healthy": "Healthy",
|
||
"unhealthy": "Unhealthy",
|
||
"unknown": "Unknown"
|
||
},
|
||
"relative": {
|
||
"justNow": "Just now",
|
||
"minutesAgo": "{count} minutes ago",
|
||
"hoursAgo": "{count} hours ago",
|
||
"daysAgo": "{count} days ago",
|
||
"monthsAgo": "{count} months ago"
|
||
},
|
||
"uptime": {
|
||
"daysHours": "{days}d {hours}h",
|
||
"hoursMinutes": "{hours}h {minutes}m",
|
||
"minutes": "{minutes}m"
|
||
},
|
||
"channel": {
|
||
"preview": "preview",
|
||
"stable": "stable"
|
||
},
|
||
"table": {
|
||
"node": "Node",
|
||
"status": "Status",
|
||
"version": "Version",
|
||
"runHealth": "Runtime health",
|
||
"currentVersion": "Current version",
|
||
"latestApply": "Latest apply",
|
||
"lastSeen": "Last heartbeat",
|
||
"actions": "Actions"
|
||
},
|
||
"editor": {
|
||
"editTitle": "Edit node",
|
||
"createTitle": "Add node",
|
||
"description": "After creating a node, open its details for a dedicated token and deploy command.",
|
||
"nodeType": "Node type",
|
||
"typeEdge": "Edge node",
|
||
"typeRelay": "Relay node",
|
||
"typeTunnel": "Tunnel node",
|
||
"name": "Node name",
|
||
"namePlaceholder": "e.g. edge-hk-01",
|
||
"ip": "Node IP",
|
||
"ipPlaceholder": "Optional; reported automatically after join",
|
||
"lockIp": "Lock IP",
|
||
"lockIpDesc": "When enabled, the control plane will not overwrite the IP",
|
||
"autoUpdate": "Auto-update Agent",
|
||
"autoUpdateDesc": "When enabled, the node pulls stable updates automatically",
|
||
"bindPort": "Bind port",
|
||
"vhostPort": "VHost port",
|
||
"manualGeo": "Manual map point",
|
||
"manualGeoDesc": "Used on the overview map",
|
||
"geoName": "Location name",
|
||
"latitude": "Latitude",
|
||
"longitude": "Longitude",
|
||
"saving": "Saving...",
|
||
"saveEdit": "Save changes",
|
||
"createAction": "Add node",
|
||
"errName": "Enter a node name",
|
||
"errLockIp": "A node IP is required when IP is locked",
|
||
"errBindPort": "Enter a valid bind port",
|
||
"errVhostPort": "Enter a valid VHost port"
|
||
},
|
||
"install": {
|
||
"edgeTitle": "Edge node deploy",
|
||
"edgeDesc": "Use the Agent Token to join an edge node to the control plane.",
|
||
"relayTitle": "Relay deploy command",
|
||
"relayDesc": "Use the Discovery Token to join an frps relay node to the control plane.",
|
||
"tunnelTitle": "Tunnel deploy command",
|
||
"tunnelDesc": "Use the Tunnel Token to join an openflared client to the control plane.",
|
||
"agentToken": "Agent Token",
|
||
"discoveryToken": "Discovery Token",
|
||
"tunnelToken": "Tunnel Token",
|
||
"scriptLabel": "One-line script (Linux / macOS)",
|
||
"dockerLabel": "Docker container deploy",
|
||
"copyFailed": "Copy failed. Select the command text manually.",
|
||
"copiedScript": "Deploy script copied",
|
||
"copiedDocker": "Docker deploy command copied",
|
||
"copyScript": "Copy script",
|
||
"copyDocker": "Copy Docker",
|
||
"nodeId": "Node ID",
|
||
"serverUrl": "Server URL (control plane)",
|
||
"serverUrlHint": "The script and container will use this address to reach the OpenFlare control plane.",
|
||
"noToken": "This node has no access token yet. Refresh later.",
|
||
"needServerUrl": "Enter a valid Server URL to generate the deploy command."
|
||
},
|
||
"update": {
|
||
"title": "Agent upgrade",
|
||
"description": "Check GitHub releases and dispatch an upgrade. The node runs it after the next heartbeat.",
|
||
"currentVersion": "Current version",
|
||
"channel": "Release channel",
|
||
"updateStatus": "Update status",
|
||
"waitingPreview": "Waiting for preview update",
|
||
"waitingUpdate": "Waiting for update",
|
||
"notRequested": "Not dispatched",
|
||
"checking": "Checking releases...",
|
||
"hasUpdate": "Update available",
|
||
"upToDate": "Already up to date",
|
||
"previewRelease": "Preview release",
|
||
"stableRelease": "Stable release",
|
||
"targetVersion": "Target version",
|
||
"notFound": "Not found",
|
||
"publishedAt": "Published",
|
||
"noNotes": "No release notes",
|
||
"viewRelease": "View release",
|
||
"checkStable": "Check stable",
|
||
"checkPreview": "Check preview",
|
||
"upgradePreview": "Upgrade to preview",
|
||
"upgradeStable": "Upgrade to stable"
|
||
},
|
||
"edge": {
|
||
"upgrade": "Upgrade Agent",
|
||
"restartOpenresty": "Restart OpenResty",
|
||
"runStatus": "Runtime status",
|
||
"runStatusDesc": "Node online state and OpenResty health",
|
||
"openrestyHealth": "OpenResty health",
|
||
"lastSeen": "Last heartbeat",
|
||
"ip": "IP address",
|
||
"geo": "Map point",
|
||
"syncTitle": "Config sync",
|
||
"syncDesc": "Version catch-up and latest apply result",
|
||
"currentVersion": "Current config version",
|
||
"latestApply": "Latest apply",
|
||
"latestApplyAt": "Latest apply time",
|
||
"agentVersion": "Agent version",
|
||
"nginxVersion": "Nginx version",
|
||
"autoUpdate": "Auto update",
|
||
"runtimeMessages": "Runtime messages",
|
||
"runtimeMessagesDesc": "Status notes reported by OpenResty and Agent",
|
||
"openrestyMessage": "OpenResty status message",
|
||
"noExtraError": "No extra error reported.",
|
||
"restartPending": "Waiting for the node to restart OpenResty after the next heartbeat.",
|
||
"kpiAgent": "Agent version",
|
||
"connectionHint": "Current OpenResty connections",
|
||
"toastUpdated": "Node updated",
|
||
"toastForceSync": "Force-sync dispatched to node {name}",
|
||
"toastRestart": "OpenResty restart dispatched to node {name}",
|
||
"toastUpgrade": "{channel} upgrade dispatched to node {name}",
|
||
"toastDeleted": "Node deleted"
|
||
},
|
||
"relay": {
|
||
"upgrade": "Upgrade Relay",
|
||
"runStatus": "Relay runtime",
|
||
"runStatusDesc": "frps online state and load summary",
|
||
"health": "Relay health",
|
||
"connections": "Active connections / proxies",
|
||
"portsTitle": "Network ports",
|
||
"portsDesc": "frps control plane and HTTP vhost settings",
|
||
"bindPort": "Control bind port",
|
||
"vhostPort": "VHost HTTP port",
|
||
"agentAddr": "Agent access address",
|
||
"relayVersion": "Relay version",
|
||
"frpsVersion": "frps core version",
|
||
"webuiTitle": "FRPS WebUI",
|
||
"webuiDesc": "Enable the built-in frps web console and set its listen port",
|
||
"enableWebui": "Enable web console",
|
||
"enableWebuiHint": "When on, the node starts the built-in frps admin service.",
|
||
"webuiPort": "Web console port",
|
||
"webuiPortPlaceholder": "e.g. 17500",
|
||
"actualPort": "Currently listening on {port} (takes effect on the next heartbeat; default is bind port + 500).",
|
||
"openWebui": "Open FRPS WebUI",
|
||
"copiedLink": "Link copied",
|
||
"copyLink": "Copy link",
|
||
"webuiDisabled": "WebUI is disabled or the bind port is not set.",
|
||
"metadata": "Node metadata",
|
||
"createdAt": "Created",
|
||
"updatedAt": "Updated",
|
||
"kpiFrps": "frps core",
|
||
"connectionHint": "Relay active connections",
|
||
"invalidPort": "Port must be between 1 and 65535",
|
||
"portSaveFailed": "Failed to update port",
|
||
"toastPortSaved": "FRPS WebUI port updated",
|
||
"toastUpdated": "Relay node updated",
|
||
"toastWebui": "FRPS WebUI setting updated",
|
||
"toastForceSync": "Force-sync dispatched to relay {name}",
|
||
"toastUpgrade": "{channel} upgrade dispatched to relay {name}",
|
||
"toastDeleted": "Relay node deleted",
|
||
"deleteTitle": "Delete relay node",
|
||
"deleteDesc": "Delete relay node “{name}”? You will need to recreate and rejoin it."
|
||
},
|
||
"tunnel": {
|
||
"upgrade": "Upgrade openflared",
|
||
"runStatus": "Tunnel runtime",
|
||
"runStatusDesc": "openflared connection and online state",
|
||
"flaredStatus": "flared status",
|
||
"autoUpdate": "Auto update",
|
||
"syncTitle": "Config sync",
|
||
"syncDesc": "Tunnel client config catch-up",
|
||
"currentVersion": "Current config version",
|
||
"latestApply": "Latest apply",
|
||
"latestApplyAt": "Latest apply time",
|
||
"fileCount": "Synced files",
|
||
"fileCountValue": "{count}",
|
||
"upgradeStatus": "Upgrade status",
|
||
"credentials": "Join credentials",
|
||
"credentialsDesc": "Token required by the tunnel client",
|
||
"tunnelToken": "Tunnel Token",
|
||
"createdAt": "Created",
|
||
"updatedAt": "Updated",
|
||
"kpiOpenflared": "openflared",
|
||
"connectionHint": "Tunnel concurrent connections",
|
||
"toastUpdated": "Tunnel node updated",
|
||
"toastForceSync": "Force-sync dispatched to tunnel {name}",
|
||
"toastUpgrade": "{channel} upgrade dispatched to tunnel {name}",
|
||
"toastDeleted": "Tunnel node deleted",
|
||
"deleteTitle": "Delete tunnel node",
|
||
"deleteDesc": "Delete tunnel node “{name}”? You will need to recreate and rejoin it."
|
||
},
|
||
"obs": {
|
||
"hostname": "Hostname",
|
||
"os": "Operating system",
|
||
"kernelArch": "Kernel / arch",
|
||
"uptime": "Uptime",
|
||
"cpu": "CPU",
|
||
"cpuCores": "{count} cores",
|
||
"totalMemory": "Total memory",
|
||
"totalStorage": "Total storage",
|
||
"reportedAt": "Reported at",
|
||
"eventsTitle": "Health event timeline",
|
||
"eventsDesc": "Keeps active and recovered events to help judge runtime health.",
|
||
"cleanupLogs": "Clean logs",
|
||
"filterAll": "All events",
|
||
"filterActive": "Active",
|
||
"filterResolved": "Recovered",
|
||
"filterEmpty": "No health events for this filter.",
|
||
"noMessage": "No detailed message",
|
||
"firstTriggered": "First triggered:",
|
||
"lastTriggered": "Last triggered:",
|
||
"resolvedAt": "Recovered:",
|
||
"noEvents": "This node has not reported any health events yet.",
|
||
"cleaned": "Cleaned {count} health event logs",
|
||
"nothingToClean": "No health event logs to clean",
|
||
"loading": "Loading observability data...",
|
||
"diag": "Runtime diagnosis",
|
||
"activeIssues": "{count} active incidents",
|
||
"stable": "Stable",
|
||
"noActiveEvents": "No active health events",
|
||
"systemCore": "System core",
|
||
"uptimeFromProfile": "From the node system profile",
|
||
"profileTitle": "System profile",
|
||
"profileDesc": "Host and hardware info reported by the node",
|
||
"noProfile": "The node has joined but has not reported a full system profile yet.",
|
||
"noProfileLong": "The node has joined but has not reported a full system profile yet.",
|
||
"snapshotTitle": "Live resource snapshot",
|
||
"snapshotDesc": "Latest metrics report",
|
||
"realtimeResources": "Live resources",
|
||
"memory": "Memory",
|
||
"storage": "Storage",
|
||
"connections": "Connections",
|
||
"snapshotAgo": "Snapshot {time}",
|
||
"noSnapshot": "The node has joined but has not reported a resource snapshot yet.",
|
||
"noSnapshotLong": "The node has joined but has not reported a resource snapshot yet.",
|
||
"cleanupTitle": "Clean health event logs",
|
||
"cleanupDesc": "This deletes all health diagnosis history recorded for this node on the control plane. New events will still be reported.",
|
||
"cleaning": "Cleaning...",
|
||
"confirmCleanup": "Clean",
|
||
"windowRequests": "Window requests",
|
||
"windowVisitorsHint": "Window unique visitors {visitors} · error rate {rate}%",
|
||
"noWindowSummary": "No request window summary",
|
||
"capacityPressure": "Capacity pressure",
|
||
"needsAttention": "Needs attention",
|
||
"normalRange": "Normal",
|
||
"cpuStorage": "CPU {cpu} · storage {storage}",
|
||
"noResourceSnapshot": "No resource snapshot",
|
||
"sourceSignal": "Source signal",
|
||
"requestTimes": "{count} requests",
|
||
"noSourceDist": "No source distribution data",
|
||
"systemInfo": "System info",
|
||
"networkTraffic": "Network traffic",
|
||
"noActiveIssue": "No active incidents",
|
||
"openrestyConn": "OpenResty connections",
|
||
"currentConn": "Current connections:",
|
||
"throughputHint": "See access-log trends for business throughput (served / received)",
|
||
"windowVisitors": "Window unique visitors",
|
||
"reqQps": "Requests {requests} · estimated QPS {qps}",
|
||
"noTrafficSummary": "No window traffic summary",
|
||
"windowErrors": "Window errors",
|
||
"errorRate": "Error rate {rate}%",
|
||
"noErrorSummary": "No error-rate summary",
|
||
"noNetworkSnapshot": "The node has joined but has not reported a network traffic snapshot yet.",
|
||
"trafficTrendDesc": "Hourly request and error counts for this node.",
|
||
"capacityTrendDesc": "CPU and memory usage for this node over 24 hours.",
|
||
"structureTitle": "Request structure",
|
||
"structureDesc": "Last 24 hours: which status codes and domains concentrate traffic and errors.",
|
||
"mainStatus": "Top status code",
|
||
"times": "{count} times",
|
||
"noStatusDist": "No status code distribution",
|
||
"topDomain": "Top Domain",
|
||
"noDomainDist": "No domain distribution",
|
||
"resolvedEvents": "Recovered events",
|
||
"resolvedHint": "Health events recovered in the last 24 hours",
|
||
"statusDist": "Status code distribution",
|
||
"distEmpty": "No distribution data",
|
||
"unknownLabel": "Unknown"
|
||
},
|
||
"networkTrend": {
|
||
"title": "24-hour network trend",
|
||
"description": "Hourly data served / received from access logs; summary is the last-24h total.",
|
||
"summaryHint": "Last 24 hours",
|
||
"received": "Data received",
|
||
"provided": "Data served"
|
||
},
|
||
"diskIo": {
|
||
"title": "24-hour disk IO trend",
|
||
"description": "Hourly disk read/write rate (B/s) to spot log amplification, cache jitter, or disk pressure.",
|
||
"summaryHint": "Last 24 hours · average rate",
|
||
"read": "Disk read",
|
||
"write": "Disk write"
|
||
}
|
||
},
|
||
"performance": {
|
||
"title": "Performance",
|
||
"description": "Manage global OpenResty performance settings. Saving enters the unified config publish flow.",
|
||
"preview": "View config preview",
|
||
"saved": "Performance settings saved",
|
||
"saveFailed": "Save failed",
|
||
"loadingAuth": "Loading permissions...",
|
||
"forbiddenTitle": "Insufficient permissions",
|
||
"forbiddenDesc": "Only administrators can access performance settings.",
|
||
"loading": "Loading performance settings...",
|
||
"runtimeTitle": "Connections and events",
|
||
"runtimeDesc": "Workers, timeouts, and request body size",
|
||
"proxyTitle": "Proxy buffers and timeouts",
|
||
"proxyDesc": "Upstream connections, buffers, and WebSocket/HTTP3 switches",
|
||
"gzipTitle": "Compression",
|
||
"cacheTitle": "Cache",
|
||
"cacheDesc": "Single-node reverse-proxy cache",
|
||
"errors": {
|
||
"workerProcesses": "worker_processes must be auto or an integer greater than 0",
|
||
"timeouts": "Timeout and connection values must be integers greater than 0",
|
||
"statusCode": "Default server return status must be between 100 and 999",
|
||
"bodySize": "Invalid client_max_body_size format",
|
||
"headerBuffers": "large_client_header_buffers must look like \"4 16k\"",
|
||
"proxyTimeouts": "Proxy timeouts must be integers greater than 0 seconds",
|
||
"proxyBuffers": "proxy_buffers must look like \"16 16k\"",
|
||
"bufferSize": "Buffer sizes must be integers or values with k/m/g units",
|
||
"gzipMinLength": "gzip_min_length must be an integer greater than 0",
|
||
"gzipLevel": "gzip_comp_level must be between 1 and 9",
|
||
"cachePath": "proxy_cache_path is required when cache is enabled",
|
||
"cacheFormat": "Invalid cache levels, inactive, max_size, or lock_timeout format",
|
||
"cacheKey": "A cache key template is required when cache is enabled"
|
||
}
|
||
},
|
||
"applyLogs": {
|
||
"title": "Apply logs",
|
||
"description": "Inspect successful, warning, and failed config applies. Filter by node_id.",
|
||
"refresh": "Refresh",
|
||
"clear": "Clear logs",
|
||
"backToNodes": "Back to nodes",
|
||
"totalRecords": "Total records",
|
||
"currentPage": "Current page",
|
||
"totalPages": "Total pages",
|
||
"pageNodes": "Nodes on this page",
|
||
"nodeId": "Node ID",
|
||
"nodePlaceholder": "Filter apply logs by node_id",
|
||
"pageSize": "Page size",
|
||
"pageSizeOption": "{count}",
|
||
"filter": "Filter",
|
||
"reset": "Reset filters",
|
||
"emptyTitle": "No apply logs",
|
||
"emptyDesc": "No apply records match the current filters.",
|
||
"colNodeId": "Node ID",
|
||
"colVersion": "Version",
|
||
"colResult": "Result",
|
||
"colChecksum": "Checksum",
|
||
"colTime": "Time",
|
||
"colMessage": "Message",
|
||
"colActions": "Actions",
|
||
"detail": "Details",
|
||
"pageInfo": "Page {current} / {total}, {count} records.",
|
||
"prev": "Previous",
|
||
"next": "Next",
|
||
"loadFailed": "Load failed",
|
||
"cleared": "Apply logs cleared",
|
||
"clearedDesc": "Deleted {count} records",
|
||
"clearFailed": "Failed to clear apply logs",
|
||
"unknownError": "Unknown error",
|
||
"clearTitle": "Clear all apply logs?",
|
||
"clearDesc": "This deletes all {count} apply log records and cannot be undone. Nodes will continue to report new apply results.",
|
||
"clearing": "Clearing...",
|
||
"confirmClear": "Clear",
|
||
"success": "Success",
|
||
"warning": "Warning",
|
||
"failed": "Failed",
|
||
"sheetTitle": "Apply log details",
|
||
"sheetDesc": "Full result and checksum details for this apply log.",
|
||
"versionBadge": "Version: {version}",
|
||
"createdAt": "Created",
|
||
"targetChecksum": "Target Checksum",
|
||
"mainChecksum": "Main config digest",
|
||
"routeChecksum": "Route config digest",
|
||
"supportFiles": "Support files",
|
||
"message": "Message",
|
||
"close": "Close"
|
||
},
|
||
"configVersions": {
|
||
"title": "Release versions",
|
||
"description": "Browse historical snapshots, preview pending diffs, and reactivate an older version when needed.",
|
||
"refresh": "Refresh",
|
||
"cleanupOld": "Clean",
|
||
"viewDiff": "Diff",
|
||
"forcePublish": "Force publish",
|
||
"previewPublish": "Publish",
|
||
"emptyTitle": "No history",
|
||
"emptyDesc": "There are no published versions yet. Publish a config first.",
|
||
"colVersion": "Version",
|
||
"colStatus": "Status",
|
||
"colAuthor": "Created by",
|
||
"colChecksum": "Checksum",
|
||
"colCreatedAt": "Created",
|
||
"colActions": "Actions",
|
||
"active": "Active",
|
||
"history": "History",
|
||
"system": "System",
|
||
"snapshot": "Snapshot",
|
||
"activate": "Activate",
|
||
"loadFailed": "Load failed",
|
||
"previewLoadFailed": "Failed to load preview",
|
||
"diffLoadFailed": "Failed to load diff",
|
||
"publishSuccess": "Published",
|
||
"publishSuccessDesc": "Version {version}",
|
||
"publishFailed": "Publish failed",
|
||
"activateSuccess": "Activated",
|
||
"activateSuccessDesc": "Version {version}",
|
||
"activateFailed": "Activate failed",
|
||
"cleanupDone": "Cleanup complete",
|
||
"cleanupDoneDesc": "Deleted {count} historical snapshots",
|
||
"cleanupFailed": "Cleanup failed",
|
||
"unknownError": "Unknown error",
|
||
"confirmPublishTitle": "Publish config",
|
||
"confirmPublishDesc": "This creates a new version from the pending config and marks it active. Nodes will pull the update next.",
|
||
"confirmPublish": "Publish",
|
||
"confirmForceTitle": "Force publish",
|
||
"confirmForceDesc": "This ignores the change check and immediately creates a new version. Confirm you really need to republish.",
|
||
"confirmActivateTitle": "Activate version",
|
||
"confirmActivateDesc": "Set version {version} as the active version?",
|
||
"confirmActivate": "Activate",
|
||
"previewTitle": "Publish preview",
|
||
"previewDesc": "Rendered pending config and support files.",
|
||
"loadingPreview": "Loading preview...",
|
||
"routeCount": "{count} routes",
|
||
"websiteCount": "{count} websites",
|
||
"mainConfig": "Main config",
|
||
"routeConfig": "Route config",
|
||
"supportFiles": "Support files ({count})",
|
||
"noSupportFiles": "This publish has no extra support files.",
|
||
"noChanges": "Pending routes match the active version, so it cannot be published again.",
|
||
"close": "Close",
|
||
"publishing": "Publishing...",
|
||
"diffTitle": "Config diff",
|
||
"diffDesc": "Differences between the pending config and the active version.",
|
||
"loadingDiff": "Loading diff...",
|
||
"activeVersion": "Active version",
|
||
"none": "None",
|
||
"addedDomains": "Added domains",
|
||
"removedDomains": "Removed domains",
|
||
"modifiedDomains": "Modified domains",
|
||
"itemCount": "{count}",
|
||
"noChange": "No changes",
|
||
"emptyValue": "empty",
|
||
"mainChanged": "Main config changed",
|
||
"mainUnchanged": "Main config unchanged",
|
||
"wafChanged": "WAF changed",
|
||
"wafUnchanged": "WAF unchanged",
|
||
"websiteDelta": "Websites {from} → {to}",
|
||
"optionKey": "Option",
|
||
"activeValue": "Active value",
|
||
"pendingValue": "Pending value",
|
||
"noOptionChanges": "No OpenResty option changes.",
|
||
"snapshotTitle": "Version snapshot",
|
||
"snapshotVersion": "Version {version}",
|
||
"snapshotDesc": "Full snapshot of this historical config version.",
|
||
"loadingSnapshot": "Loading snapshot...",
|
||
"createdBy": "Created by",
|
||
"createdAt": "Created",
|
||
"snapshotLoadFailed": "Failed to load version snapshot",
|
||
"cleanupTitle": "Clean historical snapshots",
|
||
"cleanupDesc": "Delete older snapshots. The currently active version is always protected.",
|
||
"keepCount": "Keep latest snapshots",
|
||
"keepHint": "Default 10, minimum 3.",
|
||
"keepMin": "Keep at least 3 historical snapshots",
|
||
"cleaning": "Cleaning...",
|
||
"confirmCleanup": "Clean"
|
||
},
|
||
"waf": {
|
||
"title": "WAF",
|
||
"createRule": "New rule",
|
||
"ruleGroups": "Rule groups",
|
||
"ruleGroupsDesc": "Build WAF protection rules with a visual flow. Global rules always apply to every site.",
|
||
"refresh": "Refresh",
|
||
"loading": "Loading WAF rule groups...",
|
||
"empty": "No rule groups yet. The system usually creates a global group automatically.",
|
||
"created": "Rule created",
|
||
"groupDeleted": "Rule group deleted",
|
||
"deleteTitle": "Delete rule group",
|
||
"deleteDesc": "Delete rule group “{name}”? This cannot be undone.",
|
||
"deleting": "Deleting...",
|
||
"confirmDelete": "Delete",
|
||
"operationFailed": "Operation failed",
|
||
"autoConfigMustBeObject": "Automatic configuration must be a JSON object.",
|
||
"autoConfigInvalid": "Invalid automatic configuration format",
|
||
"saveFailed": "Save failed",
|
||
"enabled": "Enabled",
|
||
"disabled": "Disabled",
|
||
"enable": "Enabled",
|
||
"disable": "Disabled",
|
||
"global": "Global",
|
||
"custom": "Custom",
|
||
"allSites": "All sites",
|
||
"siteCount": "{count} sites",
|
||
"columns": {
|
||
"name": "Name",
|
||
"type": "Type",
|
||
"status": "Status",
|
||
"nodeCount": "Nodes",
|
||
"scope": "Scope",
|
||
"updatedAt": "Updated",
|
||
"actions": "Actions"
|
||
},
|
||
"actions": {
|
||
"compose": "Edit",
|
||
"delete": "Delete"
|
||
},
|
||
"createDialog": {
|
||
"title": "New WAF rule",
|
||
"description": "After creation you will open the editor and configure the processing flow.",
|
||
"name": "Rule name",
|
||
"namePlaceholder": "e.g. Edge protection",
|
||
"submit": "Create and edit"
|
||
},
|
||
"editor": {
|
||
"missingId": "A valid rule ID is required.",
|
||
"loadFailed": "Failed to load the rule. Please try again.",
|
||
"reload": "Reload",
|
||
"back": "Back",
|
||
"graphValid": "Graph is valid",
|
||
"issueCount": "{count} issues",
|
||
"unsaved": "Unsaved",
|
||
"enableRule": "Enable rule",
|
||
"format": "Format",
|
||
"formatTitle": "Auto-arrange nodes and edges",
|
||
"saving": "Saving...",
|
||
"save": "Save",
|
||
"saved": "Rule graph saved",
|
||
"conflict": "This rule was updated elsewhere. Please reload.",
|
||
"saveCheckNodes": "Save failed. Check the highlighted nodes and edges.",
|
||
"ruleEnabled": "Rule enabled",
|
||
"ruleDisabled": "Rule disabled",
|
||
"leaveTitle": "Unsaved changes",
|
||
"leaveDesc": "You have unsaved changes. Leave anyway?",
|
||
"leaveConfirm": "Leave",
|
||
"deleteNode": "Delete node",
|
||
"systemNodeLocked": "System nodes cannot be deleted",
|
||
"deleteEdge": "Delete edge",
|
||
"propsTitle": "Node properties",
|
||
"propsDesc": "Configure this processing unit",
|
||
"systemNodeNoConfig": "System nodes do not need configuration.",
|
||
"displayName": "Display name",
|
||
"ips": "IP addresses",
|
||
"cidrs": "CIDR ranges",
|
||
"ipGroups": "IP groups",
|
||
"countries": "Country codes",
|
||
"countriesDesc": "{count} countries/regions, showing names and ISO codes",
|
||
"regions": "Region codes",
|
||
"regionsDesc": "{count} first-level regions. Search by name or code.",
|
||
"uaCheck": "UA check",
|
||
"enableUaCheck": "Enable UA check",
|
||
"enableUaCheckTip": "When enabled, requests without a User-Agent return False",
|
||
"block": "Block",
|
||
"blockTip": "A match returns false and takes priority over match rules",
|
||
"blockBots": "Block common crawler UAs",
|
||
"blockBotsTip": "Browser or OS classified as Bot (bot / spider / crawler / slurp, e.g. Googlebot)",
|
||
"blockAbnormal": "Block abnormal UAs",
|
||
"blockAbnormalTip": "Browser classified as Other or Unknown (excludes search-engine bots; use the switch above for crawlers)",
|
||
"blockCustom": "Block custom UAs",
|
||
"blockCustomTip": "Returns false if the raw User-Agent matches any regex (Lua pattern syntax)",
|
||
"customUaPatterns": "Custom UA regex",
|
||
"customUaPatternsTip": "One Lua-pattern regex per line. Any match returns false. Max 32.",
|
||
"uaMatch": "UA match",
|
||
"matchMode": "Match mode",
|
||
"matchModeTip": "Used when both browser and OS selections are set",
|
||
"matchOr": "OR",
|
||
"matchAnd": "AND",
|
||
"browsers": "Browsers",
|
||
"os": "Operating systems",
|
||
"security": "Security checks",
|
||
"securityTip": "Any enabled rule match returns False",
|
||
"basicProtection": "Basic protection",
|
||
"help": "Help",
|
||
"oneValuePerLine": "One value per line",
|
||
"selectedCount": "{count} selected",
|
||
"pleaseSelect": "Select",
|
||
"createLabel": "New {label}",
|
||
"searchNameOrCode": "Search name or code",
|
||
"addCode": "Add code",
|
||
"searchOptions": "Search {count} options by name or code",
|
||
"noMatchingOptions": "No matching options",
|
||
"algorithm": "Algorithm",
|
||
"algorithmFast": "Fast",
|
||
"algorithmSlow": "Robust",
|
||
"difficulty": "Difficulty",
|
||
"sessionTtl": "Session TTL (seconds)",
|
||
"challengeTtl": "Challenge TTL (seconds)",
|
||
"statusCode": "HTTP status code",
|
||
"responseBody": "HTML response body",
|
||
"bytes": "bytes",
|
||
"securityRules": {
|
||
"path_traversal": {
|
||
"label": "Path traversal",
|
||
"tip": "Detect ../ and encoded variants in Path / Query / Body"
|
||
},
|
||
"file_inclusion": {
|
||
"label": "File inclusion (LFI/RFI)",
|
||
"tip": "Detect php://, file://, /etc/passwd, and similar in Path / Query / Body"
|
||
},
|
||
"sql_injection": {
|
||
"label": "SQL injection",
|
||
"tip": "Detect SQL injection patterns in Query / Body / Header / Cookie"
|
||
},
|
||
"command_injection": {
|
||
"label": "Command injection",
|
||
"tip": "Detect OS command injection patterns in Query / Body / Header"
|
||
},
|
||
"xss": {
|
||
"label": "XSS",
|
||
"tip": "Detect reflected XSS patterns in Query / Body / Header"
|
||
},
|
||
"ssrf": {
|
||
"label": "SSRF",
|
||
"tip": "Detect private addresses and dangerous protocols in Query / Body"
|
||
},
|
||
"malicious_upload": {
|
||
"label": "Malicious upload",
|
||
"tip": "Detect dangerous multipart filenames and extensions"
|
||
},
|
||
"xxe": {
|
||
"label": "XXE",
|
||
"tip": "Detect external-entity patterns in XML bodies"
|
||
},
|
||
"crlf_injection": {
|
||
"label": "CRLF injection",
|
||
"tip": "Detect newline injection in Header / Query / Body"
|
||
}
|
||
}
|
||
}
|
||
},
|
||
"ipGroups": {
|
||
"title": "IP groups",
|
||
"create": "New IP group",
|
||
"listTitle": "IP groups",
|
||
"listDesc": "Maintain manual, automatic, and subscription IP sets that WAF allow/deny lists can reference.",
|
||
"refresh": "Refresh",
|
||
"loading": "Loading IP groups...",
|
||
"empty": "No IP groups yet. Create one first.",
|
||
"updated": "IP group updated",
|
||
"created": "IP group created",
|
||
"deleted": "IP group deleted",
|
||
"synced": "Sync completed",
|
||
"ipRemoved": "IP removed",
|
||
"testHit": "Rule test finished. {count} IPs matched.",
|
||
"testMiss": "Rule test finished. No IPs matched.",
|
||
"deleteTitle": "Delete IP group",
|
||
"deleteDesc": "Delete IP group “{name}”? This cannot be undone.",
|
||
"deleting": "Deleting...",
|
||
"confirmDelete": "Delete",
|
||
"operationFailed": "Operation failed",
|
||
"types": {
|
||
"manual": "Manual",
|
||
"automatic": "Automatic",
|
||
"subscription": "Subscription"
|
||
},
|
||
"enabled": "Enabled",
|
||
"disabled": "Disabled",
|
||
"noSyncRecord": "No sync history",
|
||
"columns": {
|
||
"name": "Name",
|
||
"type": "Type",
|
||
"status": "Status",
|
||
"ipCount": "IPs",
|
||
"refCount": "References",
|
||
"syncStatus": "Sync status",
|
||
"updatedAt": "Updated",
|
||
"actions": "Actions"
|
||
},
|
||
"actions": {
|
||
"view": "View",
|
||
"edit": "Edit",
|
||
"test": "Test rule",
|
||
"runNow": "Run now",
|
||
"syncNow": "Sync now",
|
||
"delete": "Delete"
|
||
},
|
||
"ban": {
|
||
"permanent": "Permanent",
|
||
"expired": "Expired",
|
||
"minutesLater": "in {count} min",
|
||
"hoursLater": "in {count} hr"
|
||
},
|
||
"presets": {
|
||
"scan404": "High-frequency 404 scan from one IP",
|
||
"directAccess": "Abnormal direct access from one IP"
|
||
},
|
||
"dialog": {
|
||
"editTitle": "Edit {name}",
|
||
"createTitle": "New IP group",
|
||
"description": "Maintain manual, automatic, and subscription IP sets that WAF allow/deny lists can reference.",
|
||
"name": "IP group name",
|
||
"nameRequired": "Enter an IP group name",
|
||
"type": "Type",
|
||
"enable": "Enable IP group",
|
||
"enableDesc": "When disabled, the configuration is kept but not expanded into the WAF runtime list on publish.",
|
||
"subscriptionUrl": "Subscription URL",
|
||
"subscriptionUrlRequired": "Subscription type requires a URL",
|
||
"subscriptionFormat": "Subscription format",
|
||
"formatText": "Text list",
|
||
"syncInterval": "Sync interval (minutes)",
|
||
"syncIntervalDesc": "Minimum 1 minute. Default 1440 minutes.",
|
||
"mappingRule": "JSON mapping rule",
|
||
"mappingPlaceholder": "Leave empty for the root array",
|
||
"autoIntervalDesc": "How often to mine malicious IPs from request logs. Minimum 1 minute, default 1440 minutes.",
|
||
"presetRules": "Preset rules",
|
||
"autoConfigJson": "Automatic configuration JSON",
|
||
"ipList": "IPs / CIDRs",
|
||
"ipListSubscriptionHint": "The next subscription sync overwrites this list. You can still save the current contents first.",
|
||
"ipListManualHint": "One IP or CIDR per line.",
|
||
"saving": "Saving...",
|
||
"save": "Save IP group"
|
||
},
|
||
"testDialog": {
|
||
"title": "Automatic rule test result",
|
||
"description": "Replay request logs against the current automatic configuration JSON.",
|
||
"testing": "Testing...",
|
||
"summary": "Lookback {lookback} · {rules} rules · {matched} IPs matched",
|
||
"testedAt": "Tested at: {time}",
|
||
"noMatch": "No IPs matched.",
|
||
"empty": "No test result yet.",
|
||
"close": "Close"
|
||
},
|
||
"viewDialog": {
|
||
"titleNamed": "View {name}",
|
||
"title": "View IP group",
|
||
"summary": "{type} · {count} IPs",
|
||
"fallbackDesc": "View IPs in this group and remove entries you no longer need.",
|
||
"loading": "Loading IP list...",
|
||
"noGroup": "No IP group selected.",
|
||
"emptyAuto": "This automatic rule has not captured any IPs yet. Click “Run now” to trigger a capture.",
|
||
"empty": "This IP group has no IPs.",
|
||
"subscriptionHint": "Subscription groups may restore deleted IPs on the next sync.",
|
||
"ipAddress": "IP address",
|
||
"capturedAt": "Captured at",
|
||
"banRemaining": "Ban remaining",
|
||
"actions": "Actions",
|
||
"deleteIp": "Delete {ip}",
|
||
"close": "Close",
|
||
"deleteTitle": "Delete IP",
|
||
"deleteDesc": "Remove {ip} from IP group “{name}”?",
|
||
"deleting": "Deleting...",
|
||
"confirmDelete": "Delete"
|
||
},
|
||
"autoConfigMustBeObject": "Automatic configuration must be a JSON object."
|
||
},
|
||
"rateLimits": {
|
||
"title": "Rate limits",
|
||
"subtitle": "Inspect edge request pressure and configure default concurrency and bandwidth limits.",
|
||
"loadingAuth": "Loading permissions...",
|
||
"forbiddenTitle": "Insufficient permissions",
|
||
"forbiddenDesc": "Only administrators can access rate-limit settings.",
|
||
"tabAnalysis": "Analysis",
|
||
"tabConfig": "Configuration",
|
||
"loadingPage": "Loading rate limits...",
|
||
"loadingPressure": "Loading request pressure...",
|
||
"loadFailed": "Load failed",
|
||
"emptyTitle": "No data",
|
||
"emptyDesc": "There are no access logs in the current time range.",
|
||
"topHost": "Highest average RPS host",
|
||
"topIp": "Highest average RPS IP",
|
||
"avgRate": "Average request rate for {range}",
|
||
"range": {
|
||
"h24": "24 hours",
|
||
"h72": "3 days"
|
||
},
|
||
"chart": {
|
||
"title": "Request pressure",
|
||
"empty": "No request-pressure data",
|
||
"requestRate": "Request rate",
|
||
"uniqueVisitors": "Unique visitors",
|
||
"visitorsPerBucket": "Visitors / bucket"
|
||
},
|
||
"config": {
|
||
"saved": "Rate-limit settings saved",
|
||
"saveFailed": "Save failed",
|
||
"loading": "Loading rate-limit settings...",
|
||
"preview": "View config preview",
|
||
"title": "Global default rate limits",
|
||
"description": "0 or empty means disabled by default. Sites without their own settings inherit these values. Publish a release to apply changes.",
|
||
"save": "Save",
|
||
"connPerServer": "Default concurrency (per site)",
|
||
"connPerServerHint": "Default maximum concurrent connections per site",
|
||
"connPerIp": "Default concurrency per IP",
|
||
"connPerIpHint": "Default maximum concurrent connections per IP",
|
||
"limitRate": "Default bandwidth limit",
|
||
"limitRateHint": "Default per-request bandwidth, e.g. 512k or 1m",
|
||
"reqPerIp": "Default request-rate limit per IP",
|
||
"reqPerIpHint": "Default request rate per IP, e.g. 10r/s or 100r/m. Leave empty to disable.",
|
||
"invalidConn": "Enter a non-negative integer for concurrency, or leave empty to disable",
|
||
"invalidRate": "Invalid rate format. Use 512k, 1m, a number, or leave empty to disable",
|
||
"invalidReq": "Invalid request-rate format. Use values like 10r/s or 100r/m, or leave empty to disable"
|
||
}
|
||
},
|
||
"pages": {
|
||
"title": "Pages",
|
||
"subtitle": "Host static sites at the edge. Upload a static package and select Pages as the upstream in proxy rules.",
|
||
"refresh": "Refresh",
|
||
"create": "New project",
|
||
"loadFailed": "Load failed",
|
||
"emptyTitle": "No Pages projects yet",
|
||
"emptyDesc": "Create a project, then upload a static deployment package.",
|
||
"enabled": "Enabled",
|
||
"disabled": "Disabled",
|
||
"spaFallback": "SPA fallback",
|
||
"strict404": "Strict 404",
|
||
"currentActive": "Currently active",
|
||
"none": "None",
|
||
"activatedAt": "Activated: ",
|
||
"notActivated": "Not activated",
|
||
"viewDetail": "View details",
|
||
"saveFailed": "Save failed",
|
||
"updated": "Project updated",
|
||
"created": "Project created",
|
||
"deleted": "Project deleted",
|
||
"deleteFailed": "Delete failed",
|
||
"editTitle": "Edit Pages project",
|
||
"createTitle": "New Pages project",
|
||
"editorDesc": "Configure static hosting settings. After uploading a package, select Pages as the upstream in proxy rules.",
|
||
"settingsDesc": "Configure static hosting settings. Saving syncs the project details and proxy references.",
|
||
"reset": "Reset",
|
||
"saving": "Saving...",
|
||
"saveChanges": "Save changes",
|
||
"createProject": "Create project",
|
||
"form": {
|
||
"name": "Project name",
|
||
"nameRequired": "Enter a project name",
|
||
"slug": "Project slug",
|
||
"slugPlaceholder": "Leave empty to auto-generate",
|
||
"entryFile": "Entry file",
|
||
"entryRequired": "Enter an entry file",
|
||
"rootDir": "Root directory",
|
||
"optional": "Optional",
|
||
"spaFallback": "SPA fallback",
|
||
"spaFallbackDesc": "Fall back to the specified path when no static file matches",
|
||
"fallbackPath": "Fallback path",
|
||
"fallbackPathPrefix": "Fallback path must start with /",
|
||
"apiProxy": "API reverse proxy",
|
||
"apiProxyDesc": "Attach API proxy rules to the static site",
|
||
"matchPath": "Match path",
|
||
"matchPathPrefix": "Match path must start with /",
|
||
"backend": "Backend URL",
|
||
"backendPrefix": "Backend URL must start with http:// or https://",
|
||
"rewrite": "Rewrite rule"
|
||
},
|
||
"detail": {
|
||
"invalidId": "A valid Pages project ID is required.",
|
||
"loading": "Loading project details...",
|
||
"loadFailed": "Failed to load project details",
|
||
"back": "Back to list",
|
||
"notFound": "This Pages project does not exist or has been deleted.",
|
||
"deploymentCount": "{count} deployments",
|
||
"tabDeployments": "Deployments",
|
||
"tabSettings": "Settings"
|
||
},
|
||
"danger": {
|
||
"title": "Danger zone",
|
||
"deleteProject": "Delete project",
|
||
"deleteHint": "Permanently delete {name} ({slug}) and all of its deployments.",
|
||
"confirmTitle": "Delete Pages project",
|
||
"confirmDesc": "Delete project {name}? This cannot be undone.",
|
||
"confirm": "Delete"
|
||
},
|
||
"upload": {
|
||
"selectFile": "Select a deployment package",
|
||
"success": "Deployment package uploaded",
|
||
"failed": "Upload failed",
|
||
"unsupported": "Only zip, tar.gz, tar.xz, tar.bz2, tar, and 7z packages are supported",
|
||
"title": "Upload deployment package",
|
||
"description": "Upload an immutable static archive. You can activate it from deployment history afterward.",
|
||
"localPackage": "Local package",
|
||
"dropHint": "Drop a package here, or click to choose a file",
|
||
"selected": "Selected {name} ({size})",
|
||
"chooseArchive": "Choose a supported archive.",
|
||
"entry": "Deployment entry",
|
||
"entryHint": "The entry comes from project settings. Uploading a package does not overwrite it.",
|
||
"processing": "Processing on server",
|
||
"progress": "Upload progress",
|
||
"pleaseWait": "Please wait",
|
||
"uploading": "Uploading...",
|
||
"submit": "Upload and create deployment"
|
||
},
|
||
"files": {
|
||
"loadFailed": "Failed to load file list",
|
||
"empty": "No file records",
|
||
"path": "Path",
|
||
"size": "Size"
|
||
},
|
||
"history": {
|
||
"source": {
|
||
"manual_upload": "Local upload",
|
||
"manual_url": "URL import"
|
||
},
|
||
"trigger": {
|
||
"manual_upload": "Manual upload",
|
||
"manual_url": "Manual import",
|
||
"manual_sync": "Manual sync",
|
||
"scheduled_auto_update": "Scheduled update"
|
||
},
|
||
"fileMeta": "{checksum} · {count} files · ",
|
||
"createdAt": "Created {time}",
|
||
"activatedAt": " · Activated {time}",
|
||
"collapseFiles": "Collapse file list",
|
||
"expandFiles": "Expand file list",
|
||
"deploymentNumber": "Deployment #{number}",
|
||
"activate": "Activate",
|
||
"delete": "Delete",
|
||
"activated": "Historical deployment activated. Auto-update (if enabled) has been turned off.",
|
||
"activateFailed": "Activation failed",
|
||
"deleted": "Deployment deleted",
|
||
"deleteFailed": "Delete failed",
|
||
"activateTitle": "Activate historical deployment",
|
||
"deleteTitle": "Delete deployment",
|
||
"activateDesc": "Activating another historical deployment stops the current source task. If auto-update is enabled, it will be turned off.",
|
||
"deleteDesc": "Delete deployment #{number}? This cannot be undone.",
|
||
"confirm": "Confirm",
|
||
"loading": "Loading deployment history...",
|
||
"loadFailed": "Failed to load deployment history",
|
||
"productionHint": "This is the live production deployment. Changing the active deployment takes effect immediately.",
|
||
"manualUpload": "Manual upload",
|
||
"emptyProductionTitle": "No production deployment",
|
||
"emptyProductionDesc": "Upload a local package, or configure a Remote URL / GitHub Release source and sync.",
|
||
"historyHint": "Deployments are immutable. Source info is a snapshot from creation time. You can activate or delete historical deployments.",
|
||
"emptyTitle": "No deployments",
|
||
"emptyDesc": "Upload a local package, or configure a Remote URL / GitHub Release source and sync."
|
||
},
|
||
"source": {
|
||
"status": {
|
||
"idle": "Idle",
|
||
"checking": "Checking",
|
||
"update_available": "Update available",
|
||
"syncing": "Syncing",
|
||
"failed": "Last sync failed",
|
||
"attention": "Needs confirmation"
|
||
},
|
||
"check": "Check",
|
||
"syncPublish": "Sync and publish",
|
||
"missingExecutionId": "Missing task execution ID",
|
||
"actionDone": "Source {action} completed",
|
||
"actionFailed": "Source {action} failed",
|
||
"checkQueued": "Check task queued",
|
||
"checkQueueFailed": "Failed to queue check task",
|
||
"syncQueued": "Sync task queued",
|
||
"syncQueueFailed": "Failed to queue sync task",
|
||
"title": "Deployment source",
|
||
"loadingDesc": "Loading source configuration...",
|
||
"independentDesc": "Source configuration is independent of deployment history.",
|
||
"loadFailed": "Failed to load deployment source",
|
||
"configDesc": "Configure a remote source and sync to publish. Results appear in deployment history.",
|
||
"manualBadge": "Manual deploy",
|
||
"localPackage": "Local package",
|
||
"noRemote": "No persistent remote source. Upload a package, then activate it from deployment history.",
|
||
"submitFailed": "Failed to queue source task",
|
||
"statusFailed": "Failed to read task status",
|
||
"waitStopped": "Automatic waiting stopped. The task may still be running in the background.",
|
||
"refreshStatus": "Refresh task status",
|
||
"configure": "Configure",
|
||
"checkUpdate": "Check for updates",
|
||
"refresh": "Refresh",
|
||
"confirmTitle": "Publish the current GitHub revision",
|
||
"confirmLead": "This publishes the exact revision currently shown on the card:",
|
||
"revisionUnavailable": "The current revision is no longer available. Refresh and try again.",
|
||
"confirmPublish": "Confirm and publish",
|
||
"updated": "Deployment source updated",
|
||
"updateFailed": "Failed to update deployment source",
|
||
"switchedManual": "Switched back to manual deploy",
|
||
"switchFailed": "Switch failed",
|
||
"urlRequired": "Enter a Remote URL",
|
||
"urlInvalid": "Enter a valid HTTP(S) URL",
|
||
"githubUrlInvalid": "Enter a public repository URL in https://github.com/'{owner}'/'{repo}' format",
|
||
"tagInvalid": "Release tag must be a valid Git ref (1–255 bytes; / # & = are allowed)",
|
||
"assetInvalid": "Asset name must be 1–255 bytes and cannot be a path or contain control, newline, or bidi characters",
|
||
"intervalInvalid": "Check interval must be an integer between 5 and 1440 minutes",
|
||
"useManual": "Use manual deploy",
|
||
"saveRemote": "Save Remote source",
|
||
"saveGithub": "Save GitHub source",
|
||
"settingsTitle": "Deployment source",
|
||
"settingsDesc": "Choose a deployment source.",
|
||
"mode": "Source type",
|
||
"manual": "Manual deploy",
|
||
"manualHint": "Keep existing deployments and the current production version. Create new deployments with “Upload package”.",
|
||
"urlHint": "Enter an HTTP(S) URL that downloads a deployment package directly.",
|
||
"allowInsecure": "Allow insecure connections",
|
||
"allowInsecureDesc": "Public and private addresses are allowed by default. Enabling this skips TLS certificate verification for self-signed or private CAs.",
|
||
"switchManualTitle": "Switch back to manual deploy",
|
||
"switchManualDesc": "The current source configuration will be deleted. Existing deployments and the current production version are kept.",
|
||
"githubUrl": "GitHub repository URL",
|
||
"githubUrlHint": "Only public github.com repositories are supported.",
|
||
"releaseSelect": "Release selection",
|
||
"latestRelease": "Latest release",
|
||
"pinnedTag": "Pinned tag",
|
||
"pinnedTagHint": "Check and sync this exact tag.",
|
||
"autoUpdate": "Auto-update",
|
||
"autoUpdateHint": "Automatically sync and publish when a new release is found.",
|
||
"checkInterval": "Check interval (minutes)",
|
||
"checkIntervalHint": "Can be set to 5–1440 minutes.",
|
||
"assetName": "Release asset filename",
|
||
"noRecord": "No record yet",
|
||
"address": "URL",
|
||
"verifyCert": "Verify certificate",
|
||
"lastSync": "Last sync",
|
||
"neverSynced": "Not synced yet",
|
||
"applied": "Applied",
|
||
"latestReleaseLabel": "Latest release",
|
||
"pinnedTagLabel": "Pinned tag · {tag}",
|
||
"tagMissing": "Not provided",
|
||
"assetChangedTitle": "Release asset changed and needs confirmation",
|
||
"assetChangedDesc": "The remote revision does not match the published content. Verify the version and assets, then confirm publishing this exact revision.",
|
||
"autoUpdateOn": "On",
|
||
"autoUpdateOff": "Off",
|
||
"intervalMinutes": "{count} minutes",
|
||
"nextCheck": "Next check",
|
||
"waitingSchedule": "Waiting for schedule",
|
||
"lastCheck": "Last check",
|
||
"neverChecked": "Not checked yet",
|
||
"remote": "Remote"
|
||
}
|
||
},
|
||
"accessLogs": {
|
||
"title": "Access logs",
|
||
"subtitle": "View traffic overview, IP details, and request logs.",
|
||
"refresh": "Refresh",
|
||
"cleanup": "Clean up logs",
|
||
"tabOverview": "Overview",
|
||
"tabIps": "IPs",
|
||
"tabList": "Logs",
|
||
"cleaned": "Cleaned up {count} logs",
|
||
"cleanupFailed": "Cleanup failed",
|
||
"loadingTitle": "Loading access logs",
|
||
"loadingDesc": "Preparing the page...",
|
||
"loadFailed": "Load failed",
|
||
"range": {
|
||
"h24": "24 hours",
|
||
"h168": "7 days",
|
||
"h360": "15 days",
|
||
"h720": "30 days"
|
||
},
|
||
"rangeHint": {
|
||
"hours24": "Last 24 hours",
|
||
"days": "Last {count} days",
|
||
"hours": "Last {count} hours"
|
||
},
|
||
"sort": {
|
||
"logged_at:desc": "Newest first",
|
||
"logged_at:asc": "Oldest first",
|
||
"status_code:desc": "Status high to low",
|
||
"status_code:asc": "Status low to high",
|
||
"remote_addr:asc": "IP A–Z",
|
||
"remote_addr:desc": "IP Z–A",
|
||
"total_requests:desc": "Requests high to low",
|
||
"total_requests:asc": "Requests low to high",
|
||
"request_length:desc": "Inbound high to low",
|
||
"request_length:asc": "Inbound low to high",
|
||
"bytes_sent:desc": "Outbound high to low",
|
||
"bytes_sent:asc": "Outbound low to high",
|
||
"success_ratio:desc": "2xx ratio high to low",
|
||
"success_ratio:asc": "2xx ratio low to high",
|
||
"last_seen_at:desc": "Last seen newest first",
|
||
"last_seen_at:asc": "Last seen oldest first"
|
||
},
|
||
"cache": {
|
||
"hit": "Hit",
|
||
"origin": "Origin",
|
||
"uncached": "Uncached"
|
||
},
|
||
"filters": {
|
||
"pickTime": "Pick a time",
|
||
"remoteAddr": "Source IP",
|
||
"remoteAddrPlaceholder": "Search by IP",
|
||
"host": "Host",
|
||
"hostPlaceholder": "Search by host",
|
||
"statusCode": "Status code",
|
||
"statusCodePlaceholder": "Enter a status code, e.g. 404",
|
||
"more": "More filters",
|
||
"nodeId": "Node ID",
|
||
"nodeIdPlaceholder": "Search by node_id",
|
||
"path": "Path",
|
||
"pathPlaceholder": "Search by path",
|
||
"timeRange": "Time range",
|
||
"pageSize": "Per page",
|
||
"pageSizeItem": "{count} items",
|
||
"apply": "Filter",
|
||
"clear": "Clear"
|
||
},
|
||
"cleanupDialog": {
|
||
"invalidDays": "Retention days must be greater than 0",
|
||
"title": "Clean up access logs",
|
||
"description": "Delete access logs older than the retention period. This cannot be undone.",
|
||
"policy": "Retention policy",
|
||
"keepDays": "Keep last {days} days",
|
||
"custom": "Custom days",
|
||
"customDays": "Custom retention days",
|
||
"cleaning": "Cleaning...",
|
||
"confirm": "Clean up"
|
||
},
|
||
"detail": {
|
||
"title": "Access log details",
|
||
"description": "All fields for this request. Use the IPs tab for IP analysis.",
|
||
"logId": "Log ID",
|
||
"requestTime": "Request time",
|
||
"storedAt": "Stored at",
|
||
"node": "Node",
|
||
"nodeId": "Node ID",
|
||
"clientIp": "Client IP",
|
||
"region": "Region",
|
||
"host": "Host",
|
||
"status": "Status",
|
||
"cache": "Cache",
|
||
"bytesSent": "Outbound",
|
||
"requestLength": "Inbound",
|
||
"duration": "Duration",
|
||
"path": "Path",
|
||
"page": "Page {page}",
|
||
"prev": "Previous",
|
||
"next": "Next",
|
||
"listTitle": "Logs",
|
||
"empty": "No access logs",
|
||
"time": "Time",
|
||
"view": "View details"
|
||
},
|
||
"ip": {
|
||
"needRange": "Enter a start and end time",
|
||
"invalidTime": "Invalid time format",
|
||
"endAfterStart": "End time must be after start time",
|
||
"maxRange": "Time range cannot exceed 30 days",
|
||
"page": "Page {page}",
|
||
"total": " · {count} IPs",
|
||
"prev": "Previous",
|
||
"next": "Next",
|
||
"customRange": "Custom range",
|
||
"customPending": "Custom (not applied)",
|
||
"timeRange": "Time range",
|
||
"current": "Current: {range}",
|
||
"custom": "Custom",
|
||
"start": "Start",
|
||
"end": "End",
|
||
"apply": "Apply",
|
||
"applyHint": "Click Apply after changing the time. The detail window matches the list range.",
|
||
"sort": "Sort",
|
||
"pageSize": "Per page",
|
||
"title": "IPs",
|
||
"empty": "No IP data",
|
||
"region": "Region",
|
||
"requests": "Requests",
|
||
"successRatio": "2xx ratio",
|
||
"inbound": "Inbound",
|
||
"outbound": "Outbound",
|
||
"lastSeen": "Last seen",
|
||
"view": "View IP details",
|
||
"dialogTitle": "IP details",
|
||
"dialogDesc": ". View this IP’s traffic trend, distribution, and WAF IP-group actions."
|
||
},
|
||
"analysis": {
|
||
"emptySeries": "No {title} data",
|
||
"selectGroup": "Select an IP group to join",
|
||
"added": "Added {ip} to IP group “{name}”",
|
||
"addFailed": "Failed to add to IP group",
|
||
"removed": "Removed {ip} from IP group “{name}”",
|
||
"removeFailed": "Remove failed",
|
||
"joinTitle": "Add IP to IP group",
|
||
"targetIp": "Target IP:",
|
||
"loadingGroups": "Loading IP groups",
|
||
"loadGroupsFailed": "Failed to load IP groups",
|
||
"alreadyIn": "This IP is already in these IP groups",
|
||
"alreadyInHint": "You can remove it, or add it to another IP group.",
|
||
"entryCount": "{type} · {count} entries",
|
||
"delete": "Delete",
|
||
"cannotDelete": "Cannot delete manually",
|
||
"notInAny": "This IP is not in any IP group yet.",
|
||
"addToOther": "Add to another IP group",
|
||
"noWritable": "No writable manual IP groups (or they already contain this IP).",
|
||
"selectManual": "Select a manual IP group",
|
||
"close": "Close",
|
||
"processing": "Working...",
|
||
"joinSelected": "Add to selected IP group",
|
||
"recentHours": "Last {hours} hours",
|
||
"invalidIp": "No valid IP.",
|
||
"addToGroup": "Add IP to IP group",
|
||
"loading": "Loading IP analysis",
|
||
"loadFailed": "Failed to load IP analysis",
|
||
"totalRequests": "Total requests",
|
||
"errors": "Errors",
|
||
"bandwidth": "Bandwidth served",
|
||
"received": "Data received",
|
||
"uniqueHosts": "Unique hosts",
|
||
"uniquePaths": "Unique paths",
|
||
"trend": "IP request trend",
|
||
"trendMeta": "{ip} · {range} · {minutes}-minute buckets",
|
||
"refresh": "Refresh",
|
||
"trendFailed": "Failed to load trend",
|
||
"trendEmpty": "This IP has no requests in {range}."
|
||
},
|
||
"overview": {
|
||
"loadingTitle": "Loading traffic overview",
|
||
"loadingDesc": "Aggregating requests, visits, and bandwidth trends...",
|
||
"loadFailed": "Failed to load traffic overview",
|
||
"emptyTitle": "No overview data",
|
||
"emptyDesc": "There are no traffic stats in the current time range.",
|
||
"uniqueVisitors": "{hint} · unique visitors",
|
||
"served": "{hint} · data served",
|
||
"requestsHint": "Watch for unusual spikes or drops in request volume.",
|
||
"requests": "Requests",
|
||
"deviceDesc": "Request share by device type.",
|
||
"deviceEmpty": "No device-type data",
|
||
"statusDesc": "Request share by HTTP status code.",
|
||
"statusEmpty": "No status-code data",
|
||
"topPathsDesc": "Most requested paths.",
|
||
"topHostsDesc": "Hosts with the most traffic.",
|
||
"topIpsDesc": "Source IPs with the most requests.",
|
||
"browsersDesc": "Requests aggregated by browser.",
|
||
"osDesc": "Requests aggregated by operating system.",
|
||
"uaDesc": "Requests ranked by raw User-Agent."
|
||
},
|
||
"toolbar": {
|
||
"hostsFiltered": "{count} hosts filtered",
|
||
"filterByHost": "Filter by host",
|
||
"filterHosts": "Filter hosts",
|
||
"clear": "Clear",
|
||
"searchPlaceholder": "Search zone or host",
|
||
"loadingHosts": "Loading hosts…",
|
||
"loadHostsFailed": "Failed to load hosts",
|
||
"retry": "Retry",
|
||
"noRegistered": "No registered hosts",
|
||
"noMatch": "No matching hosts",
|
||
"selectZone": "Select zone {name}",
|
||
"selectHost": "Select host {name}",
|
||
"selectedCount": "{count} hosts selected"
|
||
}
|
||
},
|
||
"cloudflare": {
|
||
"title": "Cloudflare",
|
||
"connectionSettings": "Connection settings",
|
||
"addGroup": "New group",
|
||
"loadingOverview": "Loading Cloudflare overview...",
|
||
"notReadyTitle": "Cloudflare connection is not ready",
|
||
"notReadyDesc": "Import an existing Cloudflare DNS account, or enter a standalone API token and test the connection.",
|
||
"configure": "Configure connection",
|
||
"groupsTitle": "Pointing groups",
|
||
"groupsDesc": "Manage the nodes and domain members behind Cloudflare A records.",
|
||
"loadingGroups": "Loading pointing groups...",
|
||
"emptyTitle": "No pointing groups",
|
||
"emptyDesc": "After creating a group, you can sync domain members to selected edge nodes.",
|
||
"enabled": "Enabled",
|
||
"disabled": "Disabled",
|
||
"memberSummary": "{count} members · new members default orange-cloud {proxy}",
|
||
"proxyOn": "on",
|
||
"proxyOff": "off",
|
||
"manage": "Manage",
|
||
"sync": "Sync",
|
||
"delete": "Delete",
|
||
"created": "Pointing group created",
|
||
"syncQueued": "Group sync queued",
|
||
"deleted": "Pointing group and remote records deleted",
|
||
"deleteTitle": "Delete pointing group",
|
||
"deleteDesc": "This deletes all members of {name} and the remote A records managed by this module. This cannot be undone.",
|
||
"confirmDelete": "Delete",
|
||
"loadingDetail": "Loading group details...",
|
||
"groupUpdated": "Group settings updated",
|
||
"memberAddedOne": "Domain added and queued for sync",
|
||
"memberAddedMany": "Added {count} domains and queued them for sync",
|
||
"memberAddFailed": "Failed to add {count} domains",
|
||
"memberPartial": "Partial success: {succeeded} added, {failed} failed",
|
||
"proxyUpdated": "Orange-cloud setting updated and queued for sync",
|
||
"memberSyncQueued": "Member sync queued",
|
||
"memberDeleted": "Member and remote A record deleted",
|
||
"back": "Back to list",
|
||
"refresh": "Refresh",
|
||
"edit": "Edit",
|
||
"addDomain": "Add domain",
|
||
"currentPoint": "Current target",
|
||
"activeNode": "Active node {name} · {ip}",
|
||
"syncEnabled": "Sync enabled",
|
||
"syncDisabled": "Sync disabled",
|
||
"primaryNode": "Primary {name}",
|
||
"backupNode": "Backup {name}",
|
||
"backupUnset": "Not set",
|
||
"members": "Domain members",
|
||
"membersDesc": "Per-member orange-cloud is the only source of truth during sync.",
|
||
"noMembers": "No domain members yet.",
|
||
"columns": {
|
||
"domain": "Domain",
|
||
"desiredIp": "Desired IP",
|
||
"status": "Status",
|
||
"proxied": "Orange cloud",
|
||
"actions": "Actions"
|
||
},
|
||
"pendingSync": "Pending sync",
|
||
"remove": "Remove",
|
||
"groupDialog": {
|
||
"editTitle": "Edit pointing group",
|
||
"createTitle": "New pointing group",
|
||
"description": "Phase 1 uses the primary node as the active node. Backup nodes are saved only and do not fail over automatically.",
|
||
"name": "Group name",
|
||
"primary": "Primary node",
|
||
"primaryPlaceholder": "Select an edge node with IPv4",
|
||
"noIp": "No IP configured",
|
||
"backup": "Backup node",
|
||
"none": "None",
|
||
"defaultProxied": "Enable orange cloud for new members by default",
|
||
"enableSync": "Enable sync",
|
||
"save": "Save"
|
||
},
|
||
"memberDialog": {
|
||
"title": "Add domain members",
|
||
"description": "Search and select in bulk. Joining creates or takes over the unique same-name A record. Multiple same-name A records are rejected.",
|
||
"zoneDomain": "Zone domain",
|
||
"searchPlaceholder": "Search domains or zones…",
|
||
"selected": "{count} selected",
|
||
"visible": "{count} visible",
|
||
"unselectAll": "Clear visible",
|
||
"selectVisible": "Select visible",
|
||
"clear": "Clear",
|
||
"noAvailable": "No available domains (already in a group, or not added in website management).",
|
||
"noMatch": "No matching domains",
|
||
"groupByZone": "Group by zone",
|
||
"selectZone": "Select zone {name}",
|
||
"zone": "Zone",
|
||
"proxied": "Enable orange-cloud proxy",
|
||
"submitCount": "Add and sync ({count})",
|
||
"submit": "Add and sync"
|
||
},
|
||
"tasks": {
|
||
"pending": "Pending",
|
||
"running": "Running",
|
||
"succeeded": "Succeeded",
|
||
"failed": "Failed",
|
||
"system": "System",
|
||
"manual": "Manual",
|
||
"retry": "Retry",
|
||
"schedule": "Scheduled",
|
||
"retried": "Sync task re-queued",
|
||
"newTaskId": "New task ID: {id}",
|
||
"retryFailed": "Failed to retry task",
|
||
"unknownError": "Unknown error",
|
||
"title": "Sync tasks",
|
||
"description": "Shows Cloudflare domain sync (sync_member) and group sync (sync_group) executions only.",
|
||
"statusPlaceholder": "Status",
|
||
"allStatus": "All statuses",
|
||
"refresh": "Refresh",
|
||
"loadFailed": "Failed to load sync tasks",
|
||
"loading": "Loading sync tasks...",
|
||
"emptyTitle": "No sync tasks",
|
||
"emptyDesc": "After adding domains or syncing a group, Cloudflare domain/group sync executions appear here.",
|
||
"columns": {
|
||
"task": "Task",
|
||
"status": "Status",
|
||
"trigger": "Trigger",
|
||
"duration": "Duration",
|
||
"result": "Result / error",
|
||
"createdAt": "Created"
|
||
},
|
||
"pageSummary": "{total} total, page {page}/{pages}",
|
||
"prev": "Previous",
|
||
"next": "Next",
|
||
"detailTitle": "Sync task details",
|
||
"defaultName": "Cloudflare sync",
|
||
"loadingDetail": "Loading task details...",
|
||
"status": "Status",
|
||
"trigger": "Trigger",
|
||
"retries": "Retries",
|
||
"duration": "Duration",
|
||
"taskId": "Task ID",
|
||
"createdAt": "Created",
|
||
"finishedAt": "Finished",
|
||
"result": "Result",
|
||
"error": "Error",
|
||
"logs": "Logs",
|
||
"close": "Close"
|
||
},
|
||
"settings": {
|
||
"saved": "Cloudflare connection saved",
|
||
"verified": "Cloudflare connection verified",
|
||
"cleared": "Cloudflare connection cleared",
|
||
"back": "Back to list",
|
||
"title": "Cloudflare connection",
|
||
"sourceTitle": "Credential source",
|
||
"sourceDesc": "The token should have Zone:Read and DNS:Edit. Tokens are never echoed in the API or UI.",
|
||
"source": "Connection source",
|
||
"importDns": "Import existing DNS account",
|
||
"standalone": "Standalone API token",
|
||
"dnsAccount": "Cloudflare DNS account",
|
||
"selectAccount": "Select a DNS account",
|
||
"dnsHint": "Only cloudflare-type DNS accounts are shown. Add one in",
|
||
"dnsLink": "DNS accounts",
|
||
"dnsHintAfter": ".",
|
||
"tokenKeep": "Leave empty to keep the existing token; saving replaces it",
|
||
"tokenEnter": "Enter a Cloudflare API token",
|
||
"save": "Save settings",
|
||
"test": "Test connection",
|
||
"clear": "Clear connection",
|
||
"statusTitle": "Current status",
|
||
"ready": "Token verified. Cloudflare pointing sync can run.",
|
||
"notReady": "After saving, you still need to test the connection. Sync is rejected until it is verified."
|
||
}
|
||
},
|
||
"openflareOps": {
|
||
"saved": "OpenFlare operations settings saved",
|
||
"saveFailed": "Save failed",
|
||
"tokenRotated": "Discovery token regenerated",
|
||
"tokenRotateFailed": "Failed to rotate token",
|
||
"kumaSynced": "Uptime Kuma sync ran",
|
||
"syncFailed": "Sync failed",
|
||
"invalidParams": "Validation failed",
|
||
"loading": "Loading OpenFlare operations settings...",
|
||
"loadFailed": "Load failed",
|
||
"save": "Save",
|
||
"agent": {
|
||
"title": "Agent runtime",
|
||
"description": "Heartbeat interval and offline threshold sync to nodes on the next heartbeat.",
|
||
"heartbeat": "Heartbeat interval ({duration})",
|
||
"offline": "Offline threshold ({duration})",
|
||
"wsUpgrade": "Enable WebSocket upgrade",
|
||
"wsUpgradeDesc": "After a successful HTTP heartbeat, try upgrading to WebSocket so config publishes can notify immediately.",
|
||
"updateRepo": "Agent update repository"
|
||
},
|
||
"geo": {
|
||
"title": "IP geolocation",
|
||
"description": "Controls the GeoIP source for node maps and similar views. Visitor access-log geolocation always uses MaxMind mmdb.",
|
||
"mode": "Lookup method",
|
||
"disabled": "Off",
|
||
"testIp": "Test IP",
|
||
"querying": "Looking up...",
|
||
"query": "Look up",
|
||
"country": "Country / region"
|
||
},
|
||
"pages": {
|
||
"title": "Pages static hosting",
|
||
"description": "Configure the upload size limit and how many historical deployments each project keeps.",
|
||
"maxSize": "Package size limit (MiB)",
|
||
"history": "Historical deployments to keep (0 = unlimited)",
|
||
"historyHint": "Each project keeps at most N deployments: the active one is always kept, then the rest fill newest-first. Extra inactive deployments are cleaned up after a successful upload. zip, tar.gz, tar.xz, tar.bz2, tar, and 7z are supported."
|
||
},
|
||
"discovery": {
|
||
"title": "Discovery token and deploy",
|
||
"description": "New nodes use the discovery token on first join. Rotate it from node management or the action below.",
|
||
"manageNodes": "Node management",
|
||
"rotate": "Rotate token",
|
||
"tokenReadonly": "Discovery token (read-only)",
|
||
"loading": "Loading...",
|
||
"notGenerated": "Not generated",
|
||
"command": "One-line deploy command",
|
||
"commandHint": "Enter a reachable Server URL and fetch a token first.",
|
||
"copied": "Command copied",
|
||
"copy": "Copy command"
|
||
},
|
||
"kuma": {
|
||
"title": "Uptime Kuma integration",
|
||
"description": "Diff-sync reverse-proxy sites to an Uptime Kuma instance.",
|
||
"syncNow": "Sync now",
|
||
"enable": "Enable Uptime Kuma",
|
||
"url": "Uptime Kuma URL",
|
||
"username": "Username",
|
||
"password": "Password",
|
||
"passwordKeep": "Leave empty to keep the current password",
|
||
"syncInterval": "Sync interval (minutes)",
|
||
"scope": "Monitor scope",
|
||
"allSites": "All sites",
|
||
"selectedSites": "Selected sites",
|
||
"selectedLabel": "Selected sites",
|
||
"pickSites": "Choose monitored sites",
|
||
"noneSelected": "No sites selected",
|
||
"interval": "Check interval (seconds)",
|
||
"retry": "Retries",
|
||
"retryInterval": "Retry interval (seconds)",
|
||
"timeout": "Request timeout (seconds)"
|
||
},
|
||
"duration": {
|
||
"minutes": "{count} min",
|
||
"seconds": "{count} sec"
|
||
},
|
||
"errors": {
|
||
"heartbeatMin": "Heartbeat interval cannot be less than 1000 milliseconds.",
|
||
"offlineMin": "Offline threshold cannot be less than 10000 milliseconds.",
|
||
"offlineRatio": "Offline threshold should be at least 3× the heartbeat interval.",
|
||
"kumaUrl": "Enter an Uptime Kuma URL.",
|
||
"kumaUser": "Enter an Uptime Kuma username.",
|
||
"syncInterval": "Sync interval must be a positive integer.",
|
||
"interval": "Heartbeat interval must be a positive integer.",
|
||
"retry": "Retry count must be a non-negative integer.",
|
||
"retryInterval": "Heartbeat retry interval must be a positive integer.",
|
||
"timeout": "Request timeout must be a positive integer.",
|
||
"pagesSize": "Pages package size limit must be between 1 and 2048 MiB.",
|
||
"pagesHistory": "Pages history count must be an integer ≥ 0 (0 means unlimited)."
|
||
},
|
||
"status": {
|
||
"title": "System status",
|
||
"loadFailed": "Failed to load system status",
|
||
"unknownError": "An unknown error occurred",
|
||
"autoRefresh": "Auto-refresh",
|
||
"refresh": "Refresh",
|
||
"overview": "Service overview",
|
||
"overviewDesc": "Basic service health metrics",
|
||
"uptime": "Uptime",
|
||
"goroutines": "Goroutines",
|
||
"heapObjects": "Heap objects",
|
||
"memory": "Memory",
|
||
"memoryDesc": "Primary memory usage",
|
||
"alloc": "Current allocation",
|
||
"totalAlloc": "Total allocated",
|
||
"sys": "System memory",
|
||
"nextGc": "Next GC target",
|
||
"usageRatio": "Current usage (Alloc / Sys)",
|
||
"heapStack": "Heap / stack",
|
||
"heapStackDesc": "Runtime heap and stack details",
|
||
"heapAlloc": "Heap allocated",
|
||
"heapSys": "Heap system",
|
||
"heapIdle": "Heap idle",
|
||
"heapInuse": "Heap in use",
|
||
"heapReleased": "Heap released",
|
||
"stackInuse": "Stack in use",
|
||
"stackSys": "Stack system",
|
||
"structs": "Internal structures",
|
||
"structsDesc": "Runtime management structure overhead",
|
||
"mspanInuse": "MSpan in use",
|
||
"mspanSys": "MSpan system",
|
||
"mcacheInuse": "MCache in use",
|
||
"mcacheSys": "MCache system",
|
||
"buckHashSys": "Profiling hash table",
|
||
"gcSys": "GC metadata",
|
||
"otherSys": "Other system memory",
|
||
"gc": "GC and allocations",
|
||
"gcDesc": "GC history and allocation counts",
|
||
"numGc": "GC runs",
|
||
"lastGc": "Time since last GC",
|
||
"pauseTotal": "Total GC pause",
|
||
"lastPause": "Last GC pause",
|
||
"mallocs": "Allocations",
|
||
"frees": "Frees",
|
||
"lookups": "Pointer lookups"
|
||
},
|
||
"siteModal": {
|
||
"title": "Choose monitored sites",
|
||
"description": "Select reverse-proxy sites to sync to Uptime Kuma. Search by site name or domain.",
|
||
"search": "Search sites",
|
||
"searchPlaceholder": "Search by name or domain...",
|
||
"selectFiltered": "Select filtered",
|
||
"clearFiltered": "Clear filtered",
|
||
"loading": "Loading sites...",
|
||
"loadFailed": "Failed to load sites",
|
||
"noMatch": "No matching sites",
|
||
"select": "Select",
|
||
"siteName": "Site name",
|
||
"primaryDomain": "Primary domain",
|
||
"selectedCount": "{count} monitored sites selected",
|
||
"save": "Save selection"
|
||
}
|
||
},
|
||
"websites": {
|
||
"title": "Websites",
|
||
"createZone": "Add Zone",
|
||
"searchRoot": "Search Zone root domain",
|
||
"loadingList": "Loading Zone list...",
|
||
"requestFailed": "Request failed. Please try again later.",
|
||
"emptySearch": "No matching Zone found.",
|
||
"emptyList": "No Zones yet. Click “Add Zone” in the top right to get started.",
|
||
"rootDomain": "Root domain",
|
||
"domainCount": "Domains",
|
||
"createdAt": "Created",
|
||
"updatedAt": "Updated",
|
||
"actions": "Actions",
|
||
"manage": "Manage",
|
||
"manageZone": "Manage Zone",
|
||
"loadingDetail": "Loading Zone details...",
|
||
"invalidId": "Invalid website ID. Open the details page from the website list.",
|
||
"notFound": "Website not found. It may have been deleted or the ID is invalid.",
|
||
"back": "Back",
|
||
"detailSubtitle": "Zone website management",
|
||
"tabOverview": "Overview",
|
||
"tabDomains": "Domains ({count})",
|
||
"tabCertificates": "Certificates ({count})",
|
||
"basicInfo": "Basic information",
|
||
"basicInfoDesc": "Maintain the Zone’s registrable root domain. After changing the root, confirm that its domains still belong to it.",
|
||
"currentRoot": "Current root domain",
|
||
"editRoot": "Edit root domain",
|
||
"dangerZone": "Dangerous actions",
|
||
"dangerZoneDesc": "Clear all domains under the Zone before deleting it. Deletion cannot be undone.",
|
||
"deleteZone": "Delete Zone",
|
||
"deleteZoneTitle": "Delete Zone",
|
||
"deleteZoneDesc": "Delete {domain}? Domains under it must be unbound from routes first. This cannot be undone.",
|
||
"deleting": "Deleting…",
|
||
"confirmDelete": "Delete",
|
||
"zoneDeleted": "Zone deleted",
|
||
"editZone": "Edit Zone",
|
||
"editorDesc": "A Zone accepts only a registrable root domain, such as example.com.",
|
||
"rootRequired": "Enter a Zone root domain",
|
||
"rootInvalid": "Enter a root domain without a protocol or wildcard",
|
||
"zoneUpdated": "Zone updated",
|
||
"zoneCreated": "Zone created",
|
||
"saveFailed": "Save failed",
|
||
"saveChanges": "Save changes",
|
||
"range24h": "24 hours",
|
||
"range7d": "7 days",
|
||
"range30d": "30 days",
|
||
"chartUv": "Bucket UV",
|
||
"chartBytes": "Data served",
|
||
"statsFailed": "Failed to load traffic stats",
|
||
"analyticsUnavailable": "Analytics storage is unavailable, so charts may be empty. Confirm that ClickHouse is enabled.",
|
||
"uniqueVisitors": "Unique visitors in query window",
|
||
"uniqueVisitorsDesc": "The top total is de-duplicated across the whole window; the curve is UV per time bucket and buckets cannot be added together",
|
||
"totalRequests": "Total requests",
|
||
"totalBytes": "Total data served",
|
||
"zoneInfo": "Zone information",
|
||
"addDomain": "Add domain",
|
||
"emptyDomains": "No domains added yet",
|
||
"certificate": "Certificate",
|
||
"upstream": "Upstream",
|
||
"certNumber": "Certificate #{id}",
|
||
"unbound": "Unbound",
|
||
"unlinkedRoute": "No linked route",
|
||
"loadingEllipsis": "Loading…",
|
||
"upstreamUnset": "No upstream configured",
|
||
"viewRoute": "View route details",
|
||
"deleteDomain": "Delete domain",
|
||
"domainDeleted": "Domain deleted",
|
||
"deleteFailed": "Delete failed",
|
||
"deleteDomainTitle": "Delete domain",
|
||
"deleteDomainDesc": "Delete {domain}? This cannot be undone.",
|
||
"zoneCertsTitle": "Certificates used by this Zone",
|
||
"zoneCertsDesc": "Certificates are managed in the global certificate library. This list only shows certificates bound to domains in this Zone.",
|
||
"certLibrary": "Certificate library",
|
||
"unboundCertHint": "{count} domains still have no certificate. Choose one in the Domains tab.",
|
||
"emptyBoundCerts": "No bound certificates. Choose a certificate on a domain row, or import/apply one in the certificate library.",
|
||
"status": "Status",
|
||
"coverage": "Covered domains",
|
||
"expiresAt": "Expires",
|
||
"selectZone": "Select a Zone first",
|
||
"enterDomain": "Enter a domain",
|
||
"noWildcard": "Zone domains do not support wildcards",
|
||
"invalidFormat": "Invalid domain format",
|
||
"invalidSubdomain": "Invalid subdomain name format",
|
||
"mustBelongToZone": "The domain must belong to Zone {root}",
|
||
"domainAdded": "Domain added",
|
||
"addFailed": "Add failed",
|
||
"quickCreateTitle": "Quick add domain",
|
||
"quickCreateDesc": "After selecting a Zone, enter a subdomain name (such as api), @ (the root), or a full FQDN.",
|
||
"selectRegisteredRoot": "Select registered root domain",
|
||
"zoneLabel": "Zone:",
|
||
"domain": "Domain",
|
||
"domainPlaceholderWithZone": "api or @ or api.{domain}",
|
||
"domainPlaceholder": "api / @ / full domain",
|
||
"willCreate": "Will create:",
|
||
"domainExample": "Example: enter <api>api</api> → <fqdn>api.zone.com</fqdn>; <apex>@</apex> → the root itself",
|
||
"certOptional": "Certificate (optional)",
|
||
"noCert": "No certificate"
|
||
},
|
||
"certificates": {
|
||
"title": "Certificates",
|
||
"refresh": "Refresh certificates",
|
||
"importCert": "Import certificate",
|
||
"applyTitle": "Apply for certificate",
|
||
"listTitle": "Certificate list",
|
||
"listDesc": "Shows certificate validity, remarks, and status. You can view details, edit contents, or delete certificates.",
|
||
"loadingList": "Loading certificate list...",
|
||
"requestFailed": "Request failed. Please try again later.",
|
||
"emptyList": "No certificates yet. Click “Import certificate” or “Apply for certificate” in the top right to get started.",
|
||
"notBeforeLabel": "Valid from: {value}",
|
||
"notAfterLabel": "Expires: {value}",
|
||
"sourceLabel": "Source: {value}",
|
||
"sourceAcme": "ACME application",
|
||
"sourceUpload": "Manual upload",
|
||
"statusLabel": "Status: {value}",
|
||
"converting": "Conversion in progress...",
|
||
"applying": "Applying...",
|
||
"statusError": "Status: {value} ({message})",
|
||
"convertFailed": "Conversion failed",
|
||
"applyFailed": "Application failed",
|
||
"remarkLabel": "Remark: {value}",
|
||
"noRemark": "No remark",
|
||
"view": "View",
|
||
"edit": "Edit",
|
||
"renew": "Renew",
|
||
"deleted": "Certificate deleted",
|
||
"renewSubmitted": "Renewal task submitted for certificate {name}",
|
||
"imported": "Certificate {name} imported",
|
||
"applySubmitted": "Application task submitted for certificate {name}",
|
||
"convertSubmitted": "Conversion application submitted for certificate {name}",
|
||
"reapplySubmitted": "Certificate {name} updated and is being re-applied...",
|
||
"updated": "Certificate {name} updated",
|
||
"deleteTitle": "Delete certificate",
|
||
"deleteDesc": "Delete certificate {name}?",
|
||
"applyEditTitle": "Edit and re-apply certificate",
|
||
"applyConvertTitle": "Convert to applied certificate",
|
||
"applyEditDesc": "Change the ACME certificate settings. After saving, the certificate will be re-applied with the new settings.",
|
||
"applyConvertDesc": "Fill in the ACME application details. After a successful application, the current manual certificate is converted in place to an auto-renewable applied certificate.",
|
||
"applyDesc": "Use ACME (Let's Encrypt and others) to automatically apply for and renew certificates, including wildcard domains.",
|
||
"name": "Certificate name",
|
||
"namePlaceholder": "For example: main site certificate",
|
||
"primaryDomain": "Primary domain",
|
||
"primaryDomainPlaceholder": "example.com or *.example.com",
|
||
"otherDomains": "Other domains",
|
||
"otherDomainsHint": "One domain per line. For a wildcard certificate, also enter the corresponding root domain so it can be issued together.",
|
||
"dnsAccount": "DNS provider account",
|
||
"selectDnsAccount": "Select a DNS account",
|
||
"keyAlgorithm": "Key algorithm",
|
||
"remark": "Remark",
|
||
"remarkPlaceholder": "Optional. Record what this certificate is used for.",
|
||
"autoRenew": "Enable auto-renewal",
|
||
"autoRenewDesc": "When enabled, the certificate is renewed automatically 7 days before it expires.",
|
||
"advanced": "Advanced options",
|
||
"dnsServer1": "DNS validation server 1",
|
||
"dnsServer2": "DNS validation server 2",
|
||
"dnsServerPlaceholder": "Leave empty to use the default authoritative DNS",
|
||
"skipCname": "Skip CNAME check",
|
||
"skipCnameDesc": "Do not follow CNAME records during DNS-01 validation.",
|
||
"skipDns": "Skip DNS pre-check",
|
||
"skipDnsDesc": "Ask Let's Encrypt to validate directly without a local check.",
|
||
"submitting": "Submitting...",
|
||
"saveAndApply": "Save and apply",
|
||
"startConvert": "Start conversion",
|
||
"startApply": "Start application",
|
||
"editTitle": "Edit certificate",
|
||
"editDesc": "You can change the certificate name and remark, and re-upload the PEM certificate and private key.",
|
||
"loadingContent": "Loading certificate contents...",
|
||
"notFound": "Certificate not found. It may have been deleted.",
|
||
"certPem": "Certificate PEM",
|
||
"keyPem": "Private key PEM",
|
||
"convertSource": "Convert source",
|
||
"saving": "Saving...",
|
||
"saveCert": "Save certificate",
|
||
"importTitle": "Add certificate",
|
||
"importDesc": "Paste PEM manually or upload certificate files. After import, you can select it immediately in website forms.",
|
||
"manualImport": "Manual import",
|
||
"fileImport": "File import",
|
||
"remarkProdPlaceholder": "For example: production certificate for the main site",
|
||
"importing": "Importing...",
|
||
"remarkWildcardPlaceholder": "For example: production wildcard certificate",
|
||
"certFile": "Certificate file",
|
||
"keyFile": "Private key file",
|
||
"fileSelected": "Selected: {name}",
|
||
"selectCertFile": "Select a PEM/CRT file",
|
||
"selectKeyFile": "Select a KEY/PEM file",
|
||
"uploading": "Uploading...",
|
||
"uploadFiles": "Upload files",
|
||
"clearFiles": "Clear files",
|
||
"selectFiles": "Select a certificate file and a private key file.",
|
||
"detailTitle": "Certificate details",
|
||
"detailDesc": "View certificate metadata, remarks, and the currently saved PEM contents.",
|
||
"loadingDetail": "Loading certificate details...",
|
||
"status": "Status",
|
||
"notBefore": "Valid from",
|
||
"notAfter": "Expires",
|
||
"certPemCopied": "Certificate PEM copied",
|
||
"keyPemCopied": "Private key PEM copied",
|
||
"copy": "Copy",
|
||
"close": "Close",
|
||
"editCert": "Edit certificate",
|
||
"deleting": "Deleting...",
|
||
"deleteCert": "Delete certificate",
|
||
"certStatus": {
|
||
"unknownExpiry": "Expiry unknown",
|
||
"expired": "Expired",
|
||
"expiresInDays": "Expires within {days} days",
|
||
"valid": "Valid"
|
||
},
|
||
"validation": {
|
||
"nameRequired": "Enter a certificate name",
|
||
"nameTooLong": "Certificate name cannot exceed 255 characters",
|
||
"certPemRequired": "Enter the certificate PEM",
|
||
"keyPemRequired": "Enter the private key PEM",
|
||
"remarkTooLong": "Remark cannot exceed 255 characters",
|
||
"primaryDomainRequired": "Enter a primary domain",
|
||
"dnsAccountRequired": "Select a DNS account"
|
||
}
|
||
},
|
||
"dnsAccounts": {
|
||
"title": "DNS accounts",
|
||
"addAccount": "Add account",
|
||
"listTitle": "DNS account list",
|
||
"listDesc": "Centrally manage DNS provider accounts used for ACME certificate DNS validation.",
|
||
"loadingList": "Loading DNS accounts...",
|
||
"requestFailed": "Request failed. Please try again later.",
|
||
"emptyList": "No DNS accounts yet. Click “Add account” in the top right to get started.",
|
||
"createdAt": "Created: {date}",
|
||
"created": "DNS account added",
|
||
"deleted": "DNS account deleted",
|
||
"deleteTitle": "Delete DNS account",
|
||
"deleteDesc": "Delete DNS account {name}?",
|
||
"createTitle": "Add DNS account",
|
||
"createDesc": "Centrally manage DNS provider accounts used for ACME certificate DNS validation.",
|
||
"accountName": "Account name",
|
||
"accountNamePlaceholder": "Cloudflare email account",
|
||
"provider": "DNS provider",
|
||
"tokenPlaceholder": "Do not use a Global API Key",
|
||
"nameRequired": "Enter a name",
|
||
"tokenRequired": "Enter a token",
|
||
"submitting": "Submitting...",
|
||
"submit": "Submit"
|
||
},
|
||
"origins": {
|
||
"title": "Origins",
|
||
"subtitle": "Centrally maintain origin addresses reused by routes, so bulk address changes need less repeated work.",
|
||
"refresh": "Refresh",
|
||
"create": "Add origin",
|
||
"loadFailed": "Load failed",
|
||
"emptyTitle": "No origins",
|
||
"emptyDesc": "Click Add origin in the top right. Later routes can reuse these addresses directly.",
|
||
"routeCount": "{count} routes",
|
||
"noRemark": "No remark",
|
||
"lastUpdated": "Last updated: {date}",
|
||
"detail": "Details",
|
||
"edit": "Edit",
|
||
"deleted": "Origin deleted",
|
||
"deleteFailed": "Delete failed",
|
||
"deleteTitle": "Delete origin",
|
||
"deleteDesc": "Delete origin {name}?",
|
||
"confirmDelete": "Delete",
|
||
"missingId": "A valid origin ID is missing.",
|
||
"loadingDetail": "Loading origin details...",
|
||
"backToList": "Back to list",
|
||
"notFound": "Origin not found or already deleted.",
|
||
"editOrigin": "Edit origin",
|
||
"deleteOrigin": "Delete origin",
|
||
"boundRoutes": "Bound routes",
|
||
"createdAt": "Created",
|
||
"updatedAt": "Updated",
|
||
"remark": "Remark",
|
||
"relatedRoutes": "Related routes",
|
||
"relatedRoutesDesc": "Shows routes that bind this origin as the primary origin.",
|
||
"noRelatedRoutes": "No related routes",
|
||
"noRelatedRoutesDesc": "This origin is not referenced by any route yet.",
|
||
"domain": "Domain",
|
||
"address": "Origin address",
|
||
"status": "Status",
|
||
"enabled": "Enabled",
|
||
"disabled": "Disabled",
|
||
"addressRequired": "Enter an origin address",
|
||
"addressInvalid": "Invalid origin address format",
|
||
"updated": "Origin updated",
|
||
"created": "Origin created",
|
||
"saveFailed": "Save failed",
|
||
"editorDesc": "Origins are a reusable address directory for routes. Protocol and port are still decided by the route.",
|
||
"name": "Origin name",
|
||
"namePlaceholder": "Main origin",
|
||
"saving": "Saving...",
|
||
"saveChanges": "Save changes"
|
||
},
|
||
"proxyRoutes": {
|
||
"title": "Route configuration",
|
||
"refresh": "Refresh",
|
||
"createRule": "New route",
|
||
"listTitle": "Route list",
|
||
"searchPlaceholder": "Search sites, domains, or upstreams...",
|
||
"emptyTitle": "No websites",
|
||
"emptyDesc": "Create a website first, then open the configuration page to finish HTTPS, cache, and rate limits.",
|
||
"noMatches": "No matching results",
|
||
"noMatchesDesc": "Try a different search term, or clear the filter.",
|
||
"siteName": "Site name",
|
||
"domain": "Domain",
|
||
"status": "Status",
|
||
"upstream": "Upstream",
|
||
"actions": "Actions",
|
||
"enabled": "Enabled",
|
||
"disabled": "Disabled",
|
||
"configure": "Configure",
|
||
"siteCreated": "Website created",
|
||
"siteDeleted": "Website deleted",
|
||
"deleteFailed": "Delete failed",
|
||
"loadListFailed": "Failed to load route list",
|
||
"unknownError": "Unknown error",
|
||
"deleteSiteTitle": "Delete website",
|
||
"deleteSiteDesc": "Delete website {name}? This deletes all domains and configuration under the site.",
|
||
"deleting": "Deleting...",
|
||
"missingId": "A valid route ID is missing.",
|
||
"notFound": "Route not found",
|
||
"notFoundDesc": "Return to the list and try again.",
|
||
"saving": "Saving...",
|
||
"saveFailed": "Save failed",
|
||
"requestFailed": "Request failed. Please try again later.",
|
||
"back": "Back",
|
||
"publish": "Publish configuration",
|
||
"diffFailed": "Failed to load configuration diff",
|
||
"noPublishNeeded": "The current configuration matches the active version. Nothing to publish.",
|
||
"publishSuccess": "Published successfully",
|
||
"versionLabel": "Version {version}",
|
||
"publishFailed": "Publish failed",
|
||
"publishTitle": "Publish configuration",
|
||
"publishDesc": "This creates a new version from the pending configuration and sets it as active. Nodes will then pull the update.",
|
||
"confirmPublish": "Publish",
|
||
"createDesc": "Choose bindings from registered Zone domains. After creating the route, you can continue configuring cache, rate limits, and other advanced options.",
|
||
"siteId": "Site identifier",
|
||
"siteIdOptionalDesc": "Optional. If left empty, the first domain is used automatically.",
|
||
"siteIdStableDesc": "Use a stable, readable business identifier. It does not have to match the domain exactly.",
|
||
"bindDomains": "Bound domains",
|
||
"bindDomainsHint": "Select registered domains to bind. Use “Quick add domain” to create an FQDN under a Zone and select it automatically.",
|
||
"upstreamType": "Origin mode",
|
||
"upstreamDirect": "Direct upstream",
|
||
"upstreamTunnel": "Tunnel",
|
||
"upstreamPages": "Pages static site",
|
||
"upstreamAddresses": "Upstream addresses",
|
||
"upstreamUrlsHint": "One full URL per line. The first line is the primary origin. In multi-upstream mode, keep the same protocol and do not include a path or query.",
|
||
"selectTunnel": "Select a tunnel",
|
||
"pleaseSelect": "Please select...",
|
||
"online": "Online",
|
||
"offline": "Offline",
|
||
"tunnelForwardHint": "Forward requests to the client node connected by this tunnel.",
|
||
"tunnelProtocol": "Internal service protocol",
|
||
"tunnelAddress": "Internal service address",
|
||
"tunnelAddressHint": "For example: 127.0.0.1:8080 or 192.168.1.10:80",
|
||
"selectPagesProject": "Select a Pages project",
|
||
"pagesProjectHint": "Only enabled Pages projects with an active deployment are shown.",
|
||
"enableSite": "Enable site",
|
||
"enableSiteDesc": "When disabled, the configuration is kept but not included in publish.",
|
||
"createFailed": "Create failed. Please try again later.",
|
||
"creating": "Creating…",
|
||
"create": "Create",
|
||
"searchDomainOrZone": "Search domain or Zone…",
|
||
"quickAddDomain": "Quick add domain",
|
||
"noZoneDomains": "No Zone domains available. Add an FQDN in <websites>Website management</websites> first, or use “Quick add domain”.",
|
||
"noBindableDomains": "No bindable domains (the rest are already bound to other routes). Use “Quick add domain” to create one.",
|
||
"noMatchingDomains": "No matching domains",
|
||
"certNumber": "Certificate #{id}",
|
||
"noCert": "No certificate",
|
||
"zoneName": "Zone {name}",
|
||
"zoneId": "Zone #{id}",
|
||
"unboundDomain": "No domain bound",
|
||
"pagesProjectId": "Pages project #{id}",
|
||
"pagesUnbound": "Pages project not bound",
|
||
"tunnelTargetUnset": "Target not configured",
|
||
"upstreamUnset": "No upstream configured",
|
||
"domainSettings": "Domain settings",
|
||
"domainSettingsDesc": "Bind FQDNs already registered in a Zone. Maintain certificates in Zone domain management.",
|
||
"redirectNeedsCert": "Bind a certificate to the selected domains (in the Zone) before enabling HTTP redirect",
|
||
"domainSettingsSaved": "Domain settings saved",
|
||
"redirectHttp": "Automatically redirect HTTP to HTTPS",
|
||
"redirectHttpEnabledHint": "When enabled, extra port-80 redirect rules are generated.",
|
||
"redirectHttpNeedsCert": "At least one selected domain must have a bound certificate before this can be enabled.",
|
||
"reverseProxy": "Reverse proxy",
|
||
"reverseProxyDesc": "Configure the origin strategy and upstream addresses.",
|
||
"proxySaved": "Reverse proxy settings saved",
|
||
"originHostHint": "If left empty, the request hostname $host is passed through by default.",
|
||
"customHeaders": "Custom request headers",
|
||
"customHeadersHint": "One per line, in Key: Value format.",
|
||
"limits": "Traffic limits",
|
||
"limitsDesc": "Site rate limits. Empty or 0 inherits the global default; -1 turns it off explicitly; greater than 0 is custom.",
|
||
"limitsSaved": "Traffic limits saved",
|
||
"connLimit": "Concurrency limit",
|
||
"connLimitHint": "Empty or 0 inherits the global default; -1 turns it off; greater than 0 is a custom concurrency cap.",
|
||
"ipLimit": "Per-IP limit",
|
||
"ipLimitHint": "Empty or 0 inherits the global default; -1 turns it off; greater than 0 is a custom per-IP cap.",
|
||
"rateLimit": "Rate limit",
|
||
"rateLimitPlaceholder": "512k/1m or -1",
|
||
"rateLimitHint": "Empty or 0 inherits the global default; -1 turns it off; for example 512k or 1m is a custom bandwidth.",
|
||
"reqLimit": "Per-IP request rate",
|
||
"reqLimitPlaceholder": "10r/s / 100r/m or -1",
|
||
"reqLimitHint": "Empty or 0 inherits the global default; -1 turns it off; for example 10r/s or 100r/m is a custom rate.",
|
||
"cache": "Cache",
|
||
"cacheDesc": "Configure the site edge cache policy.",
|
||
"cacheSaved": "Cache settings saved",
|
||
"enableCache": "Enable site cache",
|
||
"enableCacheDesc": "New sites should use “Standard static assets”.",
|
||
"cachePolicy": "Cache policy",
|
||
"policyStatic": "Standard static assets (recommended)",
|
||
"policyAll": "All cacheable GET (advanced)",
|
||
"policySuffix": "Custom suffix",
|
||
"policyPrefix": "Path prefix",
|
||
"policyExact": "Exact path",
|
||
"advancedRiskTitle": "Advanced policy risk",
|
||
"advancedRiskDesc": "Personalized HTML may be edge-cached and served to other users if the origin does not declare private / no-store. See the help next to the title for details.",
|
||
"cacheRules": "Cache rules",
|
||
"cacheHelpTitle": "Cache usage notes",
|
||
"cacheHelpIntro": "The extension/policy decides whether a response can be cached. Origin headers and Set-Cookie decide whether it is stored. Global OpenResty cache in performance settings must also be enabled.",
|
||
"cacheHelpRecommendLabel": "Recommended policy:",
|
||
"cacheHelpRecommend": "New sites should use “Standard static assets” (includes css/js/map/images/fonts/media, excludes HTML/JSON).",
|
||
"cacheHelpGeneralLabel": "General rules:",
|
||
"cacheHelpGeneral": "Non-GET is not cached; login cookies do not skip cache on their own; origin private/no-store or a Set-Cookie response is not written to the edge.",
|
||
"cacheHelpAllGetLabel": "All cacheable GET:",
|
||
"cacheHelpAllGet": "An advanced option, similar to Cache Everything. Personalized pages must be declared private/no-store by the origin, or HTML may be edge-cached and served to other users.",
|
||
"cacheHelpCustomLabel": "Custom rules:",
|
||
"cacheHelpCustom": "Use suffixes such as jpg/css/js; path prefixes such as /assets; exact paths such as /robots.txt. After saving, republish a configuration version before it takes effect on nodes.",
|
||
"cacheHintSuffix": "One suffix per line, for example jpg, css, js.",
|
||
"cacheHintPrefix": "One path prefix per line, for example /assets, /static.",
|
||
"cacheHintExact": "One exact path per line, for example /robots.txt.",
|
||
"cacheHintStatic": "Standard static assets use the built-in extension list. No extra rules are needed.",
|
||
"cacheHintNone": "The current policy does not need extra path rules.",
|
||
"cachePlaceholderNone": "No extra rules for the current policy",
|
||
"auth": "Authentication",
|
||
"authDesc": "Configure Basic Auth to block unauthorized access. Configure PoW protection in a WAF rule group.",
|
||
"authSaved": "Authentication settings saved",
|
||
"authFormInvalid": "Check the authentication form",
|
||
"authMode": "Authentication mode",
|
||
"authNone": "No authentication",
|
||
"powHint": "PoW protection can only be enabled in a WAF rule group and bound to a site.",
|
||
"username": "Username",
|
||
"password": "Password",
|
||
"wafDesc": "Global rule groups always apply. Here you can add custom rule groups for the current website.",
|
||
"wafUpdated": "WAF rule groups updated",
|
||
"loadingWaf": "Loading WAF rule groups...",
|
||
"alwaysOn": "Always on",
|
||
"selectCustomRules": "Select custom rules",
|
||
"selectCustomRulesDesc": "Selected rules run in the execution order below.",
|
||
"selectRule": "Select {name}",
|
||
"ruleEnabled": "Enabled",
|
||
"ruleDisabled": "Disabled",
|
||
"nodeCount": "{count} nodes",
|
||
"executionOrder": "Execution order",
|
||
"executionOrderDesc": "Custom rules run in this order. Drag them or use the up/down buttons to change the order.",
|
||
"noCustomWaf": "No custom WAF rule groups",
|
||
"dragRule": "Drag {name}",
|
||
"moveUpRule": "Move {name} up",
|
||
"moveDownRule": "Move {name} down",
|
||
"sections": {
|
||
"domains": "Domain settings",
|
||
"domainsDesc": "Maintain the site identifier and choose bound domains from a Zone.",
|
||
"limits": "Traffic limits",
|
||
"limitsDesc": "Set connection limits and rate limits (can inherit global defaults).",
|
||
"proxy": "Reverse proxy",
|
||
"proxyDesc": "Configure the primary origin and upstream addresses.",
|
||
"cache": "Cache",
|
||
"cacheDesc": "Configure the site cache policy.",
|
||
"waf": "WAF",
|
||
"wafDesc": "Bind WAF rule groups and view the policies that apply to this site.",
|
||
"auth": "Authentication",
|
||
"authDesc": "Configure basic authentication so visitors must enter a username and password."
|
||
},
|
||
"validation": {
|
||
"enterDomain": "Enter a domain",
|
||
"invalidDomain": "Invalid domain format",
|
||
"enterAtLeastOneDomain": "Enter at least one domain",
|
||
"invalidDomainWithValue": "Invalid domain format: {domain}",
|
||
"duplicateDomain": "Duplicate domain: {domain}",
|
||
"enterAtLeastOneUpstream": "Enter at least one upstream address",
|
||
"invalidUpstream": "Invalid upstream address format: {url}",
|
||
"upstreamMustBeHttp": "Upstream address must start with http:// or https://: {url}",
|
||
"upstreamMissingHost": "Upstream address is missing a hostname: {url}",
|
||
"multiUpstreamNoPath": "Multi-upstream mode does not support addresses with a path or query",
|
||
"multiUpstreamSameProtocol": "Multiple upstreams for the same site must use the same protocol",
|
||
"invalidOriginHost": "Invalid origin Host format",
|
||
"invalidHeader": "Invalid custom request header format: {line}",
|
||
"invalidHeaderName": "Invalid custom request header name: {key}",
|
||
"invalidLimitRate": "Invalid rate-limit format. Use 512k, 1m, a number, or -1 to turn it off",
|
||
"invalidLimitReq": "Invalid request-rate format. Use 10r/s, 100r/m, or -1 to turn it off",
|
||
"cacheRuleRequired": "The current cache policy needs at least one rule",
|
||
"invalidCacheSuffix": "Invalid cache suffix format: {rule}",
|
||
"invalidCachePath": "Invalid cache path rule format: {rule}",
|
||
"siteNameTooLong": "Site identifier cannot exceed 255 characters",
|
||
"selectAtLeastOneDomain": "Select at least one domain",
|
||
"selectTunnel": "Select a tunnel",
|
||
"enterTunnelTarget": "Enter an internal service address (for example 127.0.0.1:8080)",
|
||
"selectPagesProject": "Select a Pages project",
|
||
"enterSiteId": "Enter a site identifier",
|
||
"enterIntegerOrMinusOne": "Enter -1, 0, or a positive integer",
|
||
"enterUsername": "Enter a username",
|
||
"enterPassword": "Enter a password"
|
||
}
|
||
},
|
||
"responses": {
|
||
"title": "Response pages",
|
||
"subtitle": "Configure origin error pages and offline pages.",
|
||
"loadingPermission": "Loading permission information...",
|
||
"loadingConfig": "Loading response page settings...",
|
||
"loadingPage": "Loading response pages...",
|
||
"loadingErrorConfig": "Loading error page settings...",
|
||
"loadingOfflineConfig": "Loading offline page settings...",
|
||
"loadFailed": "Load failed",
|
||
"forbidden": "Insufficient permission",
|
||
"forbiddenSettings": "Only administrators can access response page settings.",
|
||
"forbiddenPreviewError": "Only administrators can preview the error page.",
|
||
"forbiddenPreviewOffline": "Only administrators can preview the offline page.",
|
||
"forbiddenEditError": "Only administrators can edit the error page HTML.",
|
||
"forbiddenEditOffline": "Only administrators can edit the offline page HTML.",
|
||
"errorPage": "Error page",
|
||
"offlinePage": "Offline page",
|
||
"saveFailed": "Save failed",
|
||
"policySaved": "Trigger policy saved. Publish a version for the configuration to take effect.",
|
||
"triggerPolicy": "Trigger policy",
|
||
"triggerPolicyDesc": "Configure when the origin error page is enabled and which status codes trigger it.",
|
||
"enableErrorPage": "Enable origin error page",
|
||
"enableErrorPageDesc": "When disabled, the origin or Nginx default error response is passed through.",
|
||
"getOnly": "GET requests only",
|
||
"getOnlyDesc": "When enabled, the custom error page is returned only for matching error status codes on GET requests.",
|
||
"statusCodes": "Trigger status codes",
|
||
"statusCodesDesc": "Supports a single code (such as 502) or a closed range (such as 500-599).",
|
||
"statusCodesPlaceholder": "For example 502 or 500-599, then press Enter",
|
||
"pagePreview": "Page preview",
|
||
"preview": "Preview",
|
||
"edit": "Edit",
|
||
"errorPagePreview": "Origin error page preview",
|
||
"errorPreview": "Error page preview",
|
||
"offlinePreview": "Offline page preview",
|
||
"offlinePageDesc": "When enabled, a Service Worker is issued to HTTPS websites. If the domain is unreachable, the browser shows this offline page from cache.",
|
||
"offlineSaved": "Offline page saved. Publish a version for the configuration to take effect.",
|
||
"enableOffline": "Enable Service Worker offline page",
|
||
"enableOfflineDesc": "Only takes effect on HTTPS websites.",
|
||
"enableOfflineAria": "Enable offline page",
|
||
"scope": "Scope",
|
||
"scopeDesc": "Applies only to the selected HTTPS domains. If empty, nothing is injected.",
|
||
"addDomain": "Add domain",
|
||
"noScopeSelected": "No scope domains selected. After saving, nothing is injected into any site.",
|
||
"enableThenSelectScope": "Enable the offline fallback before choosing scope domains.",
|
||
"removeDomain": "Remove {domain}",
|
||
"selectScopeTitle": "Select scope domains",
|
||
"selectScopeDesc": "Inject the offline fallback only for selected HTTPS domains. Search, filter, and bulk-select.",
|
||
"domain": "Domain",
|
||
"searchDomainOrZone": "Search domain or apex…",
|
||
"selectedCount": "Selected {count}",
|
||
"visibleCount": "Visible {count}",
|
||
"unselectVisible": "Clear visible",
|
||
"selectVisible": "Select visible",
|
||
"clear": "Clear",
|
||
"noAvailableDomains": "No domains available. Register domains in Zone management first.",
|
||
"noMatchingDomains": "No matching domains",
|
||
"selectZone": "Select apex {domain}",
|
||
"apex": "Apex",
|
||
"confirm": "OK",
|
||
"backToError": "Back to error page",
|
||
"backToOffline": "Back to offline page",
|
||
"closePreview": "Close preview",
|
||
"fullscreen": "Full-screen view",
|
||
"htmlTooLarge": "HTML exceeds the size limit (max 256KB)",
|
||
"errorHtmlSaved": "Origin error page HTML saved. Publish a version for the configuration to take effect.",
|
||
"offlineHtmlSaved": "Offline page HTML saved. Publish a version for the configuration to take effect.",
|
||
"templateNotFound": "Selected template not found",
|
||
"templateLoaded": "Loaded template “{name}” into the editor",
|
||
"errorRestored": "Cleared to use the server built-in default template (save to apply)",
|
||
"offlineRestored": "Cleared to use the built-in default template (save to apply)",
|
||
"editErrorHtml": "Edit error page HTML",
|
||
"editOfflineHtml": "Edit offline page HTML",
|
||
"offlineLivePreview": "Offline page live preview",
|
||
"builtinTemplates": "Built-in templates",
|
||
"selectTemplate": "Select a template",
|
||
"loadTemplate": "Load template",
|
||
"restoreDefault": "Restore default",
|
||
"restoreTitle": "Restore default HTML?",
|
||
"restoreErrorDesc": "This clears the editor. After saving, the server built-in default template is used. This action does not save automatically.",
|
||
"restoreOfflineDesc": "This clears the editor. After saving, the built-in default template is used. This action does not save automatically.",
|
||
"confirmRestore": "Restore"
|
||
}
|
||
}
|