mirror of
https://github.com/Rain-kl/OpenFlare.git
synced 2026-09-28 05:46:36 +08:00
refactor(i18n): fragments 为唯一源,主包改为生成物
- 一次性回灌:主包最新内容(含 565 个未同步键)全量写回 6 个 fragment 文件,fragments 成为完整唯一源;新增 core fragment(common/docs/home 等 9 个此前仅存在于主包的命名空间)
- merge-i18n-fragments.mjs 改为从零重建主包(不再以主包为基础),重建结果与原主包语义零差异
- 主包 messages/{zh-CN,en}.json 移出跟踪并加入 .gitignore
- 生成接入入口:predev/prebuild/prebuild:embed/precheck:i18n 钩子 + Makefile code-check 与 checks.sh vitest 前置生成
- 修复既有漂移:configVersions.title 现以 fragments(Config versions)为准
This commit is contained in:
+1
-1
@@ -24,7 +24,7 @@ fi
|
||||
|
||||
# 前端测试(vitest;2026-08-16 起全绿)
|
||||
echo "==> pnpm exec vitest run (frontend)"
|
||||
(cd frontend && pnpm exec vitest run --reporter=dot > /tmp/auto_vitest.log 2>&1) || {
|
||||
(cd frontend && node scripts/merge-i18n-fragments.mjs && pnpm exec vitest run --reporter=dot > /tmp/auto_vitest.log 2>&1) || {
|
||||
tail -30 /tmp/auto_vitest.log
|
||||
exit 1
|
||||
}
|
||||
|
||||
@@ -83,3 +83,7 @@ profile.cov
|
||||
/.superpowers/
|
||||
/.worktrees/
|
||||
/.pi-subagents/
|
||||
|
||||
# i18n 生成物(由 scripts/merge-i18n-fragments.mjs 从 fragments 生成)
|
||||
frontend/messages/zh-CN.json
|
||||
frontend/messages/en.json
|
||||
|
||||
@@ -45,7 +45,7 @@ code-check:
|
||||
exit 1; \
|
||||
fi
|
||||
golangci-lint run
|
||||
cd frontend && pnpm tsc --noEmit --jsx preserve && npx eslint . --max-warnings 0
|
||||
cd frontend && node scripts/merge-i18n-fragments.mjs && pnpm tsc --noEmit --jsx preserve && npx eslint . --max-warnings 0
|
||||
|
||||
build-backend:
|
||||
@echo "==> Building backend version=$(VERSION) build_date=$(BUILD_DATE)..."
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,477 @@
|
||||
{
|
||||
"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"
|
||||
},
|
||||
"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"
|
||||
}
|
||||
},
|
||||
"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."
|
||||
}
|
||||
}
|
||||
},
|
||||
"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"
|
||||
}
|
||||
},
|
||||
"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"
|
||||
}
|
||||
},
|
||||
"metadata": {
|
||||
"title": "OpenFlare",
|
||||
"description": "OpenFlare edge node and reverse proxy control plane"
|
||||
},
|
||||
"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"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,477 @@
|
||||
{
|
||||
"common": {
|
||||
"save": "保存",
|
||||
"cancel": "取消",
|
||||
"confirm": "确认",
|
||||
"delete": "删除",
|
||||
"loading": "加载中...",
|
||||
"retry": "重试",
|
||||
"optional": "(可选)",
|
||||
"settings": "设置",
|
||||
"search": "搜索",
|
||||
"unknownError": "发生错误,请重试",
|
||||
"loadFailed": "加载失败"
|
||||
},
|
||||
"contexts": {
|
||||
"adminUsers": {
|
||||
"userStatusChanged": "已{action}用户 {username}",
|
||||
"enabled": "启用",
|
||||
"disabled": "禁用",
|
||||
"updateStatusFailed": "更新状态失败",
|
||||
"userCreated": "已成功创建用户 {username}",
|
||||
"createUserFailed": "创建用户失败",
|
||||
"userDeleted": "已删除用户 {username}",
|
||||
"deleteUserFailed": "删除用户失败",
|
||||
"updateUserSuccess": "更新用户信息成功",
|
||||
"updateUserFailed": "更新用户信息失败"
|
||||
},
|
||||
"admin": {
|
||||
"loadConfigFailed": "加载系统配置失败",
|
||||
"updateConfigFailed": "更新系统配置失败"
|
||||
},
|
||||
"user": {
|
||||
"getUserInfoFailed": "获取用户信息失败",
|
||||
"logoutFailed": "登出失败"
|
||||
}
|
||||
},
|
||||
"docs": {
|
||||
"backToHome": "返回首页",
|
||||
"sectionCount": "共 {count} 个章节",
|
||||
"lastUpdated": "最后更新",
|
||||
"copied": "已复制",
|
||||
"copyMarkdown": "复制 Markdown",
|
||||
"toc": "目录",
|
||||
"haveQuestions": "还有疑问?",
|
||||
"contactSupport": "联系客服支持",
|
||||
"api": {
|
||||
"title": "接口文档",
|
||||
"description": "Wavelet Platform 后端 API 完整参考,涵盖认证、用户、令牌与配置管理。",
|
||||
"field": "字段",
|
||||
"type": "类型",
|
||||
"descriptionLabel": "说明",
|
||||
"endpoint": "端点",
|
||||
"desc": "描述",
|
||||
"param": "参数",
|
||||
"required": "必需",
|
||||
"yes": "是",
|
||||
"no": "否",
|
||||
"username": "用户名",
|
||||
"password": "密码",
|
||||
"optional": "可选",
|
||||
"default": "默认",
|
||||
"section1": {
|
||||
"title": "通用约定",
|
||||
"desc": "所有 API 响应遵循统一信封格式。",
|
||||
"responseFormat": "响应格式",
|
||||
"responseFormatDesc": "所有接口均返回以下 JSON 结构:",
|
||||
"errorMsgDesc": "成功时为空字符串,失败时为可读错误信息",
|
||||
"dataDesc": "业务数据,结构因接口而异",
|
||||
"successExample": "成功响应示例",
|
||||
"failExample": "失败响应示例",
|
||||
"failExampleErrorMsg": "错误信息",
|
||||
"authentication": "认证方式",
|
||||
"authenticationDesc": "系统支持两种认证方式,所有受保护的接口均需携带其一:",
|
||||
"sessionCredential": "Session 凭证",
|
||||
"sessionCredentialDesc": "登录后由服务端 Set-Cookie 返回,浏览器自动携带。",
|
||||
"accessTokenCredential": "AccessToken 凭证",
|
||||
"accessTokenCredentialDesc": "通过 Header 传递,适用于 API 调用与第三方集成:",
|
||||
"supportedHeaders": "支持的 Header"
|
||||
},
|
||||
"section2": {
|
||||
"title": "认证接口",
|
||||
"register": "注册",
|
||||
"registerDesc": "创建新用户账号并自动登录。",
|
||||
"usernameDesc": "用户名,唯一,至少 3 位",
|
||||
"passwordDesc": "密码,至少 8 位",
|
||||
"nicknameDesc": "昵称(可选)",
|
||||
"passwordLogin": "密码登录",
|
||||
"passwordLoginDesc": "使用邮箱/用户名 + 密码登录,成功后 Set-Cookie。",
|
||||
"logout": "登出",
|
||||
"logoutDesc": "销毁当前会话。",
|
||||
"getProfile": "获取当前用户信息",
|
||||
"getProfileDesc": "返回当前已登录用户的完整档案。"
|
||||
},
|
||||
"section3": {
|
||||
"title": "访问令牌管理",
|
||||
"desc": "管理个人 API 访问令牌(AccessToken),用于无浏览器场景的 API 调用。",
|
||||
"listTokens": "列出令牌",
|
||||
"listTokensDesc": "获取当前用户的所有活跃访问令牌。",
|
||||
"createToken": "创建令牌",
|
||||
"tokenName": "令牌名称",
|
||||
"createTokenDesc": "创建新的访问令牌,返回一次性密钥。",
|
||||
"isAdminDesc": "是否授予管理员权限(默认 false)",
|
||||
"endpoint": "端点",
|
||||
"successResponseExample": "成功响应示例",
|
||||
"deleteToken": "删除令牌",
|
||||
"deleteTokenDesc": "撤销指定的访问令牌。",
|
||||
"rotateToken": "轮换令牌",
|
||||
"rotateTokenDesc": "为指定令牌生成新密钥,旧密钥立即失效。"
|
||||
},
|
||||
"section4": {
|
||||
"title": "系统配置管理",
|
||||
"publicConfig": "获取公开配置",
|
||||
"publicConfigDesc": "返回所有标记为公开的系统配置项,无需认证。",
|
||||
"responseExample": "响应示例",
|
||||
"adminConfigs": "管理员配置接口",
|
||||
"adminConfigsDesc": "以下接口需要管理员权限。",
|
||||
"getConfigList": "获取配置列表",
|
||||
"createConfig": "创建配置",
|
||||
"updateConfig": "更新配置",
|
||||
"deleteConfig": "删除配置"
|
||||
}
|
||||
},
|
||||
"howToUse": {
|
||||
"title": "使用文档",
|
||||
"description": "Wavelet Platform 快速上手指南,涵盖认证、令牌、配置、任务与可观测性。",
|
||||
"section1": {
|
||||
"title": "系统架构概览",
|
||||
"desc": "Wavelet Platform 采用 Go + Next.js 前后端分离架构。",
|
||||
"architecture": "技术栈",
|
||||
"architectureDesc": "Go 1.25+ / Gin / GORM / PostgreSQL / Redis / Asynq",
|
||||
"authSystem": "认证系统",
|
||||
"authSystemDesc": "支持密码登录 + OIDC 第三方认证",
|
||||
"accessToken": "访问令牌",
|
||||
"accessTokenDesc": "用于 API 调用的 Personal Access Token",
|
||||
"observability": "可观测性",
|
||||
"observabilityDesc": "OpenTelemetry + 结构化日志"
|
||||
},
|
||||
"section2": {
|
||||
"title": "认证与注册",
|
||||
"desc": "系统支持多种认证方式,可通过管理后台灵活配置。",
|
||||
"passwordAuth": "密码认证",
|
||||
"selfRegister": "自主注册",
|
||||
"selfRegisterDesc": "用户可通过注册页面创建账号。",
|
||||
"bcryptDesc": "密码使用 bcrypt 加密存储。",
|
||||
"switchControl": "开关控制",
|
||||
"switchControlDesc": "管理员可在后台独立控制:",
|
||||
"oidc": "OIDC 第三方登录",
|
||||
"oidcDesc": "支持配置任意 OIDC 兼容的认证源(如 Google、GitHub、企业 SSO)。",
|
||||
"oidcStep1": "在「系统设置 → 安全设置」中新增认证源",
|
||||
"oidcStep2": "填写 Discovery URL、Client ID、Client Secret",
|
||||
"oidcStep3": "启用后,登录页将自动显示对应入口"
|
||||
},
|
||||
"section3": {
|
||||
"title": "访问令牌 (AccessToken)",
|
||||
"desc": "用于无浏览器场景的 API 调用。",
|
||||
"generation": "生成与管理",
|
||||
"oneTimeDisplay": "一次性显示",
|
||||
"oneTimeDisplayDesc": "创建令牌后,密钥仅显示一次。",
|
||||
"oneTimeDisplayHint": "请务必在创建后立即复制保存。",
|
||||
"secureHash": "安全存储",
|
||||
"secureHashDesc": "系统仅存储令牌的 SHA-256 哈希,原始密钥不可恢复。",
|
||||
"headerUsage": "使用方式",
|
||||
"headerUsageDesc": "在请求 Header 中携带令牌:",
|
||||
"bearerHeader": "Bearer Token 方式",
|
||||
"customHeader": "自定义 Header 方式"
|
||||
},
|
||||
"section4": {
|
||||
"title": "系统配置",
|
||||
"desc": "通过管理后台或 API 动态管理系统配置。",
|
||||
"cacheAccel": "缓存加速",
|
||||
"cacheAccelDesc": "公开配置项支持多级缓存(内存 → Redis → 数据库),高频读取场景下性能优异。",
|
||||
"coreConfigs": "核心配置项",
|
||||
"siteName": "站点名称",
|
||||
"passwordLoginEnabled": "密码登录开关",
|
||||
"registrationEnabled": "注册开关",
|
||||
"maxApiKeys": "最大 API Key 数量"
|
||||
},
|
||||
"section5": {
|
||||
"title": "异步任务",
|
||||
"desc": "基于 Asynq 的分布式任务队列系统。",
|
||||
"scheduler": "定时任务 (Scheduler)",
|
||||
"schedulerDesc": "支持 Cron 表达式配置定时任务。",
|
||||
"worker": "Worker",
|
||||
"workerDesc": "后台 Worker 进程负责消费和执行任务。"
|
||||
},
|
||||
"section6": {
|
||||
"title": "可观测性",
|
||||
"desc": "内置 OpenTelemetry 支持。",
|
||||
"tracing": "链路追踪",
|
||||
"tracingDesc": "支持将 Trace 数据导出到 Jaeger、Zipkin 等后端。",
|
||||
"structuredLog": "结构化日志",
|
||||
"structuredLogDesc": "基于 Zap 的高性能结构化日志,支持按级别输出。"
|
||||
}
|
||||
},
|
||||
"terms": {
|
||||
"title": "服务协议",
|
||||
"description": "使用 Wavelet Platform 前,请仔细阅读以下服务条款。",
|
||||
"section1": {
|
||||
"title": "总则",
|
||||
"subject": "协议主体",
|
||||
"subjectDesc": "本协议是您与 Wavelet Platform 运营方之间关于使用平台服务所订立的协议。",
|
||||
"readCarefully": "请仔细阅读",
|
||||
"readCarefullyDesc": "请您在使用服务前仔细阅读本协议全部内容。如您不同意本协议的任何条款,请勿使用本平台服务。",
|
||||
"composition": "协议构成",
|
||||
"compositionDesc": "本协议正文包括协议正文、平台已经发布或将来可能发布的各类规则。所有规则为本协议不可分割的组成部分,与协议正文具有同等法律效力。"
|
||||
},
|
||||
"section2": {
|
||||
"title": "服务内容",
|
||||
"liability": "责任范围",
|
||||
"liabilityDesc": "本平台仅提供技术基础设施和开发工具服务。用户应自行承担使用平台过程中产生的所有责任。"
|
||||
},
|
||||
"section3": {
|
||||
"title": "用户账号",
|
||||
"accountSystem": "账号体系",
|
||||
"accountSystemDesc": "用户在本平台注册并获得账号后,应妥善保管其账号和密码。用户应对其账号项下的所有行为负责。",
|
||||
"securityResponsibility": "安全责任",
|
||||
"passwordSecurity": "密码安全",
|
||||
"passwordSecurityDesc": "用户应使用安全强度足够的密码,并定期更换。因用户密码保管不当导致的损失,由用户自行承担。",
|
||||
"tokenSecurity": "令牌安全",
|
||||
"tokenSecurityDesc": "访问令牌(AccessToken)等同于账号凭证,用户应妥善保管。",
|
||||
"tokenLeakLiability": "因令牌泄露导致的任何损失,由用户自行承担。"
|
||||
},
|
||||
"section4": {
|
||||
"title": "使用规范",
|
||||
"desc": "用户在使用本平台服务时,必须遵守以下规范:",
|
||||
"redLine": "禁止行为红线",
|
||||
"nationalSecurity": "危害国家安全",
|
||||
"nationalSecurityDesc": "不得利用平台服务制作、复制、发布含有危害国家安全的信息。",
|
||||
"illegalInfo": "违法信息",
|
||||
"illegalInfoDesc": "不得制作、复制、发布违反国家法律法规的信息。",
|
||||
"harmfulContent": "有害内容",
|
||||
"harmfulContentDesc": "不得发布含有骚扰、侮辱、恐吓或其他有害内容的信息。",
|
||||
"ipInfringement": "知识产权侵权",
|
||||
"ipInfringementDesc": "不得侵犯他人知识产权、商业秘密等合法权益。",
|
||||
"otherIllegal": "其他违法行为",
|
||||
"otherIllegalDesc": "不得利用平台服务从事其他违反法律法规的行为。",
|
||||
"enforcement": "违规处理",
|
||||
"enforcementDesc": "如用户违反上述规范,平台有权采取以下措施:",
|
||||
"enforcementAction": "警告、暂停或终止服务"
|
||||
},
|
||||
"section5": {
|
||||
"title": "免责声明",
|
||||
"basicDisclaimer": "基本免责",
|
||||
"basicDisclaimerDesc": "平台将尽最大努力确保服务的安全性和稳定性,但不对以下情形承担责任:",
|
||||
"techInterruption": "技术中断",
|
||||
"techInterruptionDesc": "因以下原因导致的服务中断或数据丢失:",
|
||||
"naturalDisaster": "自然灾害等不可抗力",
|
||||
"govAction": "政府行为或法律法规变更",
|
||||
"telecomFailure": "电信运营商故障",
|
||||
"hacking": "黑客攻击或计算机病毒"
|
||||
},
|
||||
"section6": {
|
||||
"title": "法律适用与争议解决",
|
||||
"applicableLaw": "适用法律",
|
||||
"applicableLawDesc": "本协议的签订、履行和解释均适用:",
|
||||
"lawName": "中华人民共和国法律",
|
||||
"lawScope": "不含冲突法规则",
|
||||
"disputeResolution": "争议解决",
|
||||
"disputeResolutionDesc": "因本协议引起的或与本协议有关的任何争议,双方应友好协商解决。协商不成的,任何一方均有权向有管辖权的人民法院提起诉讼。"
|
||||
}
|
||||
},
|
||||
"privacy": {
|
||||
"title": "隐私政策",
|
||||
"description": "Wavelet Platform 重视用户隐私保护。本政策说明我们如何收集、使用和保护您的个人信息。",
|
||||
"descriptionRights": "请在使用我们的服务前仔细阅读本政策。",
|
||||
"section1": {
|
||||
"title": "信息收集",
|
||||
"desc": "我们收集以下类型的信息:",
|
||||
"authInfo": "认证信息",
|
||||
"authInfoDesc": "包括用户名、邮箱地址、加密后的密码哈希。",
|
||||
"authInfoNote": "我们不会存储您的明文密码。",
|
||||
"logInfo": "访问日志",
|
||||
"logInfoDesc": "包括 IP 地址、浏览器类型、访问时间、请求路径。"
|
||||
},
|
||||
"section2": {
|
||||
"title": "信息使用",
|
||||
"desc": "我们收集的信息用于以下目的:",
|
||||
"storageSecurity": "存储安全",
|
||||
"storageSecurityDesc": "所有用户数据均加密存储于安全的服务器环境中。",
|
||||
"encryption": "加密措施",
|
||||
"encryptionDesc": "密码使用 bcrypt 单向哈希加密,令牌使用 SHA-256 哈希存储。",
|
||||
"accessControl": "访问控制",
|
||||
"accessControlDesc": "严格的权限管理机制确保只有授权人员才能访问用户数据。"
|
||||
},
|
||||
"section3": {
|
||||
"title": "信息使用目的",
|
||||
"desc": "我们收集的信息将用于以下目的:",
|
||||
"identity": "身份验证",
|
||||
"identityDesc": "验证用户身份,确保账号安全。",
|
||||
"business": "业务运营",
|
||||
"businessDesc": "提供、维护和改进我们的服务。",
|
||||
"riskControl": "风险控制",
|
||||
"riskControlDesc": "检测、预防和处理安全风险及欺诈行为。",
|
||||
"prohibited": "禁止用途",
|
||||
"prohibitedDesc": "我们承诺不会将用户信息用于以下用途:出售给第三方、发送未经许可的商业推广。"
|
||||
},
|
||||
"section4": {
|
||||
"title": "信息共享与披露",
|
||||
"sharingPrinciple": "共享原则",
|
||||
"sharingPrincipleDesc": "未经用户同意,我们不会向第三方共享用户个人信息,但以下情况除外:",
|
||||
"sharingException1": "法律法规要求、政府机关依法定程序调取",
|
||||
"sharingException2": "为保护平台或公众的合法权益所必需",
|
||||
"transfer": "信息转让",
|
||||
"transferDesc": "如平台发生合并、收购等情形,我们会要求新的持有者继续受本政策约束。"
|
||||
},
|
||||
"section5": {
|
||||
"title": "用户权利",
|
||||
"desc": "用户对其个人信息享有以下权利:",
|
||||
"viewManage": "查看与管理",
|
||||
"viewManageDesc": "用户可随时在个人设置中查看和修改其个人信息。",
|
||||
"deleteAccount": "账号删除",
|
||||
"deleteAccountDesc": "用户可申请删除其账号及关联的所有个人数据。"
|
||||
},
|
||||
"section6": {
|
||||
"title": "政策更新",
|
||||
"desc": "我们可能会不时更新本隐私政策。政策更新后,我们会在平台上发布通知。",
|
||||
"notification": "重大变更将通过站内通知或邮件方式告知用户。"
|
||||
}
|
||||
}
|
||||
},
|
||||
"files": {
|
||||
"uploadSuccess": "文件上传成功",
|
||||
"uploadFailed": "上传失败",
|
||||
"deleteSuccess": "文件已成功删除",
|
||||
"deleteFailed": "删除失败",
|
||||
"searchPlaceholder": "搜索文件名...",
|
||||
"private": "私有",
|
||||
"public": "公开",
|
||||
"uploading": "正在上传...",
|
||||
"uploadFile": "上传文件",
|
||||
"noFiles": "还没有上传文件",
|
||||
"noMatchingFiles": "未搜索到匹配的文件",
|
||||
"uploadFirstFile": "上传您的第一个文件,支持图片、视频、文档和压缩包等格式。",
|
||||
"selectFileUpload": "选择文件上传",
|
||||
"downloadFile": "下载文件",
|
||||
"deleteFile": "删除文件",
|
||||
"prevPage": "上一页",
|
||||
"nextPage": "下一页",
|
||||
"confirmDeleteFile": "确认删除文件",
|
||||
"confirmDeleteFileDesc": "确定要删除文件「{name}」吗?删除后此文件将无法恢复。",
|
||||
"cancel": "取消",
|
||||
"confirmDelete": "确认删除",
|
||||
"myFiles": "我的文件"
|
||||
},
|
||||
"general": {
|
||||
"manage": {
|
||||
"saveSuccess": "保存成功",
|
||||
"saveFailed": "保存失败",
|
||||
"unknownError": "未知错误",
|
||||
"deleteSuccess": "删除成功",
|
||||
"deleteFailed": "删除失败",
|
||||
"loading": "加载中",
|
||||
"noData": "暂无数据",
|
||||
"configList": "配置列表",
|
||||
"confirmDelete": "确认删除?",
|
||||
"confirmDeleteDesc": "此操作无法撤销。这将永久删除该配置。",
|
||||
"cancel": "取消",
|
||||
"confirmDeleteAction": "确认删除",
|
||||
"configInfo": "配置信息",
|
||||
"selectConfigToView": "请选择配置查看详情",
|
||||
"updating": "更新中",
|
||||
"update": "更新",
|
||||
"actions": "操作"
|
||||
},
|
||||
"passwordDialog": {
|
||||
"enterPassword": "请输入密码",
|
||||
"enterPasswordDesc": "为了您的账户安全,请输入6位认证密码进行验证",
|
||||
"cancel": "取消",
|
||||
"verifying": "验证中...",
|
||||
"confirm": "确认"
|
||||
}
|
||||
},
|
||||
"home": {
|
||||
"banner": {
|
||||
"description": "这是一个通用的二次开发基础平台,内置用户管理、认证鉴权、文件存储、任务调度、通知推送和可观测性等常用功能模块,帮助开发者快速启动新项目。",
|
||||
"getStarted": "快速开始",
|
||||
"hideHint": "收起提示"
|
||||
},
|
||||
"navigation": {
|
||||
"title": "导航"
|
||||
},
|
||||
"quickLinks": {
|
||||
"profile": {
|
||||
"title": "个人资料",
|
||||
"description": "查看和编辑您的账户信息"
|
||||
},
|
||||
"apiDocs": {
|
||||
"title": "接口文档",
|
||||
"description": "API 接口完整参考"
|
||||
},
|
||||
"userDocs": {
|
||||
"title": "使用文档",
|
||||
"description": "快速上手指南"
|
||||
}
|
||||
},
|
||||
"adminLinks": {
|
||||
"settings": {
|
||||
"title": "系统设置",
|
||||
"description": "配置系统安全、业务与外观参数"
|
||||
},
|
||||
"systemConfig": {
|
||||
"title": "系统配置",
|
||||
"description": "管理 Key-Value 系统配置项"
|
||||
},
|
||||
"userManagement": {
|
||||
"title": "用户管理",
|
||||
"description": "查看和管理所有注册用户"
|
||||
},
|
||||
"tasks": {
|
||||
"title": "任务管理",
|
||||
"description": "异步任务队列与定时任务调度"
|
||||
},
|
||||
"logs": {
|
||||
"title": "系统日志",
|
||||
"description": "用户访问日志与应用运行日志"
|
||||
}
|
||||
},
|
||||
"jumpNow": "立即跳转",
|
||||
"enterNow": "立即进入",
|
||||
"adminConsole": "管理后台",
|
||||
"developerSection": {
|
||||
"heading": "开发者友好",
|
||||
"description": "内置完整的 RESTful API 文档、Swagger UI 与 TypeScript SDK 示例,帮助您快速集成。",
|
||||
"features": {
|
||||
"restful": "完整 RESTful API",
|
||||
"swagger": "在线 Swagger 文档",
|
||||
"typescript": "TypeScript SDK 示例",
|
||||
"examples": "丰富的使用示例"
|
||||
},
|
||||
"apiDocs": "查看接口文档",
|
||||
"codeComment": "// 快速开始 — API 调用示例",
|
||||
"codeQuickStart": "快速开始"
|
||||
},
|
||||
"hero": {
|
||||
"subtitle": "内置用户认证、文件存储、任务调度",
|
||||
"subtitleLine2": "通知推送与可观测性,帮助您快速启动下一个项目。",
|
||||
"getStarted": "快速开始",
|
||||
"learnMore": "了解更多",
|
||||
"features": {
|
||||
"readyToUse": "开箱即用",
|
||||
"highlyExtensible": "高度可扩展",
|
||||
"industrialGrade": "工业级品质"
|
||||
}
|
||||
},
|
||||
"footer": {
|
||||
"description": "通用二次开发标准范式平台",
|
||||
"product": "产品",
|
||||
"dashboard": "控制台",
|
||||
"personalSettings": "个人设置",
|
||||
"development": "开发",
|
||||
"quickStart": "快速开始",
|
||||
"apiDocs": "接口文档",
|
||||
"sourceCode": "源代码",
|
||||
"community": "社区",
|
||||
"discussions": "Discussions",
|
||||
"privacyPolicy": "隐私政策",
|
||||
"termsOfService": "服务条款"
|
||||
}
|
||||
},
|
||||
"metadata": {
|
||||
"title": "OpenFlare",
|
||||
"description": "OpenFlare 边缘节点与反向代理管理平台"
|
||||
},
|
||||
"notFound": {
|
||||
"description": "抱歉,您访问的页面似已迷失在数字星云中。请检查路径或返回安全地带。",
|
||||
"previousPage": "上一页",
|
||||
"home": "首页"
|
||||
},
|
||||
"providers": {
|
||||
"titleUpdater": {
|
||||
"login": "登录",
|
||||
"register": "注册",
|
||||
"admin": "后台管理",
|
||||
"dashboard": "控制台"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,12 +1,92 @@
|
||||
{
|
||||
"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",
|
||||
@@ -39,6 +119,21 @@
|
||||
"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"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,12 +1,92 @@
|
||||
{
|
||||
"layout": {
|
||||
"nav": {
|
||||
"home": "首页",
|
||||
"myFiles": "我的文件",
|
||||
"users": "用户管理",
|
||||
"tasks": "任务管理",
|
||||
"storage": "存储管理",
|
||||
"database": "数据管理",
|
||||
"push": "通知推送",
|
||||
"messageGateway": "消息通道",
|
||||
"logs": "系统日志",
|
||||
"system": "系统配置",
|
||||
"adminSettings": "系统设置",
|
||||
"demo": "规范示例",
|
||||
"apiDocs": "接口文档",
|
||||
"usageDocs": "使用文档",
|
||||
"dashboard": "数据看板",
|
||||
"nodes": "节点管理",
|
||||
"proxyRoutes": "规则管理",
|
||||
"websites": "域名列表",
|
||||
"certificates": "TLS证书",
|
||||
"dnsAccounts": "DNS账号",
|
||||
"cloudflare": "Cloudflare",
|
||||
"origins": "源站地址",
|
||||
"responses": "响应页面",
|
||||
"waf": "WAF",
|
||||
"ipGroups": "IP 组",
|
||||
"rateLimits": "限流",
|
||||
"pages": "Pages",
|
||||
"configVersions": "版本发布",
|
||||
"accessLogs": "访问日志",
|
||||
"performance": "性能调优",
|
||||
"applyLogs": "应用日志"
|
||||
},
|
||||
"groups": {
|
||||
"admin": "管理",
|
||||
"docs": "文档库",
|
||||
"security": "安全性",
|
||||
"websites": "网站管理"
|
||||
},
|
||||
"user": {
|
||||
"adminRole": "系统管理员",
|
||||
"userRole": "普通用户",
|
||||
"notLoggedIn": "未登录",
|
||||
"syncing": "正在同步账户",
|
||||
"profile": "我的资料",
|
||||
"settings": "设置",
|
||||
"help": "使用帮助",
|
||||
"logout": "退出登录",
|
||||
"unknownUser": "未知用户"
|
||||
},
|
||||
"logoutDialog": {
|
||||
"title": "确认登出",
|
||||
"description": "您确定要登出当前账户吗?",
|
||||
"loggingOut": "正在登出,请稍候...",
|
||||
"confirm": "确认登出",
|
||||
"inProgress": "登出中...",
|
||||
"failed": "登出失败",
|
||||
"failedDescription": "登出时发生错误,请重试"
|
||||
},
|
||||
"header": {
|
||||
"notifications": "通知",
|
||||
"settings": "设置",
|
||||
"search": "搜索",
|
||||
"toggleFullWidth": "切换全宽",
|
||||
"toggleTheme": "主题切换",
|
||||
"changePasswordBanner": "为了您的账号安全,请立即修改密码!",
|
||||
"changePasswordAction": "去修改密码",
|
||||
"bannerTitle": "最新通知",
|
||||
"bannerLink": "查看详情",
|
||||
"dismiss": "关闭",
|
||||
"guest": "访客"
|
||||
},
|
||||
"search": {
|
||||
"categoryPage": "页面",
|
||||
"categoryFeature": "功能",
|
||||
"categorySetting": "设置",
|
||||
"categoryAdmin": "管理",
|
||||
"tipPrefix": "Tips:",
|
||||
"tipSlash": "还可以使用 / 来打开此界面",
|
||||
"tipArrow": "来切换选中项",
|
||||
"tipNewTab": "在新标签页打开",
|
||||
"tipDidYouKnow": "你知道吗:搜索功能还在持续升级中",
|
||||
"searchPlaceholder": "搜索页面和功能...",
|
||||
"noResults": "没有找到相关内容,换个词试试?",
|
||||
"openInNewTab": "在新标签页打开",
|
||||
"open": "打开",
|
||||
"closeSearch": "关闭搜索界面",
|
||||
"items": {
|
||||
"globalSettings": "全局设置",
|
||||
"appearance": "外观设置",
|
||||
@@ -39,6 +119,21 @@
|
||||
"pushDesc": "配置与下发邮件、Lark 和 Telegram 渠道通知推送 (管理员专属)",
|
||||
"logsDesc": "查看系统日志与后台异步任务执行日志 (管理员专属)"
|
||||
}
|
||||
},
|
||||
"error": {
|
||||
"loadFailed": "加载失败",
|
||||
"retry": "重试",
|
||||
"unknownError": "发生未知错误,请稍后重试",
|
||||
"viewDetails": "查看详细错误信息",
|
||||
"unknownErrorShort": "发生未知错误"
|
||||
},
|
||||
"loading": {
|
||||
"loading": "加载中",
|
||||
"loadingDesc": "正在获取活动数据..."
|
||||
},
|
||||
"empty": {
|
||||
"noData": "暂无数据",
|
||||
"noContent": "当前没有任何记录"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -582,7 +582,7 @@
|
||||
"close": "Close"
|
||||
},
|
||||
"configVersions": {
|
||||
"title": "Config versions",
|
||||
"title": "Release versions",
|
||||
"description": "Browse historical snapshots, preview pending diffs, and reactivate an older version when needed.",
|
||||
"refresh": "Refresh",
|
||||
"cleanupOld": "Clean",
|
||||
|
||||
@@ -588,7 +588,7 @@
|
||||
"cleanupOld": "清理旧版本",
|
||||
"viewDiff": "查看差异",
|
||||
"forcePublish": "强制发布",
|
||||
"previewPublish": "发布",
|
||||
"previewPublish": "预览并发布",
|
||||
"emptyTitle": "暂无历史版本",
|
||||
"emptyDesc": "当前还没有可查看的发布记录,请先触发一次配置发布。",
|
||||
"colVersion": "版本号",
|
||||
|
||||
@@ -181,7 +181,6 @@
|
||||
"deleting": "Deleting...",
|
||||
"confirmDelete": "Delete",
|
||||
"operationFailed": "Operation failed",
|
||||
"autoConfigMustBeObject": "Automatic configuration must be a JSON object.",
|
||||
"types": {
|
||||
"manual": "Manual",
|
||||
"automatic": "Automatic",
|
||||
@@ -274,7 +273,8 @@
|
||||
"deleteDesc": "Remove {ip} from IP group “{name}”?",
|
||||
"deleting": "Deleting...",
|
||||
"confirmDelete": "Delete"
|
||||
}
|
||||
},
|
||||
"autoConfigMustBeObject": "Automatic configuration must be a JSON object."
|
||||
},
|
||||
"rateLimits": {
|
||||
"title": "Rate limits",
|
||||
|
||||
@@ -181,7 +181,6 @@
|
||||
"deleting": "删除中...",
|
||||
"confirmDelete": "确认删除",
|
||||
"operationFailed": "操作失败",
|
||||
"autoConfigMustBeObject": "自动配置必须是 JSON 对象。",
|
||||
"types": {
|
||||
"manual": "手动",
|
||||
"automatic": "自动",
|
||||
@@ -274,7 +273,8 @@
|
||||
"deleteDesc": "确认从 IP 组「{name}」中移除 {ip} 吗?",
|
||||
"deleting": "删除中...",
|
||||
"confirmDelete": "确认删除"
|
||||
}
|
||||
},
|
||||
"autoConfigMustBeObject": "自动配置必须是 JSON 对象。"
|
||||
},
|
||||
"rateLimits": {
|
||||
"title": "限流",
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -3,8 +3,10 @@
|
||||
"version": "dev",
|
||||
"private": true,
|
||||
"scripts": {
|
||||
"predev": "node scripts/generate-themes.js",
|
||||
"prebuild": "node scripts/generate-themes.js",
|
||||
"predev": "node scripts/generate-themes.js && node scripts/merge-i18n-fragments.mjs",
|
||||
"prebuild": "node scripts/generate-themes.js && node scripts/merge-i18n-fragments.mjs",
|
||||
"prebuild:embed": "node scripts/merge-i18n-fragments.mjs",
|
||||
"precheck:i18n": "node scripts/merge-i18n-fragments.mjs",
|
||||
"dev": "next dev --turbopack -p 3001",
|
||||
"build": "next build",
|
||||
"build:embed": "NEXT_STANDALONE_EXPORT=true next build",
|
||||
|
||||
@@ -25,7 +25,8 @@ function deepMerge(target, source) {
|
||||
|
||||
function mergeLocale(locale) {
|
||||
const mainPath = resolve(root, `messages/${locale}.json`);
|
||||
const data = JSON.parse(readFileSync(mainPath, 'utf8'));
|
||||
// 主包是纯生成物:从空对象开始合并全部 fragment(fragments 为唯一源)
|
||||
const data = {};
|
||||
const suffix = `.${locale}.json`;
|
||||
for (const name of readdirSync(fragmentsDir).sort()) {
|
||||
if (!name.endsWith(suffix)) continue;
|
||||
|
||||
Reference in New Issue
Block a user