const enUS = { app: { name: "GEO Console", loginIntro: "A workspace for brand assets and GEO content operations.", }, locale: { "zh-CN": "Simplified Chinese", "en-US": "English", }, common: { cancel: "Cancel", close: "Close", confirm: "Confirm", create: "Create", edit: "Edit", delete: "Delete", reset: "Reset", refresh: "Refresh", loading: "Loading", search: "Search", save: "Save", back: "Back", next: "Next", previous: "Previous", submit: "Submit", submitGenerate: "Generate", actions: "Actions", title: "Title", name: "Name", description: "Description", website: "Website", wordCount: "Words", createdAt: "Created At", updatedAt: "Updated At", status: "Status", required: "Required", noData: "No data", optional: "Optional", preview: "Preview", details: "Details", versions: "Versions", total: "Total", balance: "Balance", used: "Used", source: "Source", templateType: "Template", generateStatus: "Generation", publishStatus: "Publish", selectPlease: "Please select", inputPlease: "Please input", upgrade: "Upgrade", copy: "Copy", copySuccess: "Content copied", yes: "Yes", no: "No", imageUploadProgress: { title: "Processing image", stages: { idle: "Waiting to start", validating: "Validating file", decoding: "Decoding image", encoding: "Converting to WebP", uploading: "Uploading to server", finishing: "Finishing", }, }, }, nav: { workspace: "Workspace", articleCreation: "Article Creation", templates: "Templates", custom: "Custom Generation", freeCreate: "Free Create", imitation: "Imitation Create", media: "Media", brandManagement: "Brand Management", brands: "Brand Library", tracking: "Tracking", trackingDetail: "Data Details", contentManagement: "Content Management", knowledge: "Knowledge Base", images: "Image Management", kolMarket: "Refined Template Marketplace", kolMarketplace: "Refined Template Marketplace", kolWorkspace: "KOL Workspace", kolManage: "Prompt Management", kolDashboard: "Dashboard", kolProfile: "Profile", personalCenter: "Personal Center", aiPointUsage: "AI Point Usage", }, auth: { welcomeBack: "Welcome back", loginAndEnter: "Sign in to workspace", email: "Email", loginIdentifier: "Phone / Email", password: "Password", rememberPassword: "Remember password", forgotPassword: "Forgot password", }, membershipBlocked: { eyebrow: "Access Paused", title: "This tenant plan is unavailable", expiredMessage: "Membership expired. Please renew or contact support.", userDisabledMessage: "User has been disabled. Please contact support.", reasonUserDisabled: "This user has been disabled. Business pages are now locked. Please contact support to restore access.", reasonTrialExpired: "The free trial's 3-day page access window has ended. All business pages are now locked. Please contact an administrator to reactivate trial access.", reasonRequired: "This tenant does not have an active plan. All business pages are now locked. Please contact an administrator.", reasonInactive: "This tenant plan has expired or been disabled. All business pages are now locked. Please contact an administrator to restore access.", plan: "Current Plan", expiredAt: "Expired At", articleLimit: "Article Limit", companyLimit: "Company Limit", contactAdmin: "Once the administrator reactivates access, refresh this page to continue.", logout: "Log out", refresh: "Check again", refreshing: "Checking…", stillBlocked: "Access is still blocked. Please contact your administrator before checking again.", }, shell: { localeLabel: "Language", quotaTitle: "Plan & Quota", quotaStatus: "Healthy", membershipExpiresAt: "Expires", remainingQuota: "Article quota", aiPoints: "AI points", resetAt: "Reset at", userFallback: "Admin", logout: "Logout", planFallback: "Free Plan", aiUsageTitle: "AI Point Usage", aiUsageRecent: "Recent Usage", aiUsageEmpty: "No AI point usage yet", aiUsageBase: "Tiered every {base} chars", aiUsageRule: "{chars} chars / base {base}", aiUsagePendingHelp: "Points have been reserved. They will be confirmed once the AI task completes; if generation fails, the points are returned automatically.", aiUsageTypes: { article_selection_optimize: "Article Selection Optimize", template_analyze: "AI Analysis", template_title_generate: "AI Title Generation", template_outline_generate: "AI Outline Generation", kol_prompt_generate: "KOL Prompt Generation", kol_prompt_optimize: "KOL Prompt Optimize", }, aiUsageStatus: { pending: "Processing", completed: "Charged", refunded: "Refunded", failed: "Failed", }, }, route: { login: { title: "Welcome back", description: "Sign in with a real tenant account.", }, workspace: { title: "Workspace", description: "Template shortcuts, overview data, and recent generations in one place.", }, templates: { title: "Template Creation", description: "Manage both general-purpose and refined templates, with all related generation records gathered here.", }, wizard: { title: "Template Wizard", description: "Follow the template-driven three-step flow to fill inputs, confirm structure, and generate the article.", }, articleEditor: { title: "Article Editor", description: "Edit titles, content, and publishing settings in a dedicated workspace.", }, custom: { title: "Custom Generation", description: "Generate articles with custom prompt rules, instant or scheduled.", }, freeCreate: { title: "Free Create", description: "Create and edit articles freely, no templates or AI generation required.", }, imitation: { title: "Imitation Create", description: "Manage rewritten articles generated from citation sources or external URLs.", }, imitationCreate: { title: "Imitation Create", description: "Extract an article from a URL, then generate a new article in one step.", }, media: { title: "Media Management", description: "Review desktop-managed media bindings, authorization state, and sync results in one place.", }, brands: { title: "Brand Library", description: "Manage keywords, question sets, and competitors around each brand.", }, tracking: { title: "Data Details", description: "Inspect plugin-sampled brand performance, platform coverage, hot questions, and citation attribution.", }, trackingQuestion: { title: "Question Detail", description: "Inspect answer content, citation sources, citation analysis, and content citations for a single question.", }, knowledge: { title: "Knowledge Base", description: "No matching backend APIs exist in this repository yet.", }, images: { title: "Image Management", description: "Manage image assets, including folders, reference analysis, and cover library usage.", }, aiPoints: { title: "AI Point Usage", description: "Review AI point balance, cycle rules, and recent usage records.", }, }, aiPoints: { balance: "Available Points", baseChars: "Base Characters", ledgerTitle: "Usage Ledger", ledgerLimit: "Latest {limit} records", ledgerTotal: "{total} records", table: { usageType: "Usage", points: "Points", requestChars: "Metered Chars", }, }, kol: { marketplace: { title: "Refined Templates", filter: { industry: "Industry", keyword: "Keyword", all: "All", }, empty: "No published subscription packages yet", subscribers: "{count} subscribed tenants", prompts: "{count} refined templates", }, package: { subscribe: "Request subscription", pending: "Pending", subscribed: "Subscribed", revoked: "Revoked", expired: "Expired", notSubscribed: "Not subscribed", }, generate: { title: "Refined Template Generation", submit: "Generate", fillVariables: "Please fill in the following variables and click generate", }, manage: { title: "KOL Prompt Management", subtitle: "Manage refined template packages, prompts, platforms, variables, and publishing status.", packageTitle: "Packages", promptTitle: "Prompts", createPackage: "Create package", editPackage: "Edit package", publishPackage: "Publish", archivePackage: "Archive", createPrompt: "Create prompt", activatePrompt: "Go live", archivePrompt: "Take offline", confirmDeletePackage: "Are you sure you want to delete this package?", confirmDeletePrompt: "Are you sure you want to delete this prompt?", emptyPromptSelection: "Select a package on the left to view its prompts", platformHint: "Platform", platformHintDefault: "General", packageStatus: { draft: "Draft", published: "Published", archived: "Archived", }, messages: { packageCreated: "Package created successfully", packageUpdated: "Package updated successfully", packagePublished: "Package published successfully", packageArchived: "Package archived successfully", packageDeleted: "Package deleted successfully", promptCreated: "Prompt created successfully", promptActivated: "Prompt is live", promptArchived: "Prompt is offline", promptDeleted: "Prompt deleted successfully", }, packageForm: { tags: "Tags", tagsPlaceholder: "Type a tag and press Enter", priceNote: "Price Note", priceNotePlaceholder: "For example: Contact me for pricing", cover: "Cover Image", coverHint: "Choose from the image library or upload a local image and convert it to WebP automatically.", selectCover: "Select cover image", changeCover: "Change cover image", removeCover: "Remove cover image", noCover: "No cover image selected", nameRequired: "Package title is required", coverPicker: { title: "Select package cover", localTab: "Local upload", emptyTitle: "Choose an image for this package cover", emptyHint: "Choose from the image library or upload a local image and convert it to WebP automatically.", }, }, status: { draft: "Draft", active: "Live", archived: "Offline", }, editor: { basicInfo: "Basic info", saveMeta: "Save basic info", saveDraft: "Save draft", publish: "Publish", preview: "Preview form", aiGenerate: "AI Generate", aiOptimize: "AI Optimize", aiPlaceholder: "Describe the prompt effect you want, and AI will generate it...", aiOptimizePromptPlaceholder: "For example: make this prompt clearer, keep variable placeholders, and reduce ambiguity.", aiOptimizeDisclaimer: "AI output is for reference only. Review it before replacing the selected prompt text.", aiOptimizeReplace: "Replace selection", }, variable: { input: "Input", textarea: "Textarea", select: "Select", number: "Number", checkbox: "Checkbox", key: "Variable key", label: "Label", required: "Required", placeholder: "Placeholder", options: "Options (comma separated)", maxLength: "Max length", defaultValue: "Default value", minValue: "Min number", maxValue: "Max number", defaultNumber: "Default number", }, }, dashboard: { title: "KOL Dashboard", subtitle: "Track subscriptions and generation metrics in real time.", totalSubs: "Total subscribed tenants", monthSubs: "New this month", totalUsage: "Total usage", monthUsage: "Usage this month", failRate: "Failure rate", byPackage: "By package", trend: "Trend", }, profile: { title: "KOL Profile", subtitle: "These fields are shown in the KOL Marketplace and are separate from your account settings.", persona: { displayNameLabel: "Display name", displayNamePlaceholder: "Enter your public display name", bioLabel: "Bio", bioPlaceholder: "A short intro for your subscribers", avatarLabel: "Avatar", avatarHint: "PNG/JPG/GIF/WebP, up to 2 MB", avatarUploading: "Uploading avatar…", saveSuccess: "Updated", saveError: "Failed to update", displayNameRequired: "Display name is required", displayNameTooLong: "Display name must be at most 40 characters", bioTooLong: "Bio must be at most 500 characters", avatarInvalidType: "Only PNG/JPG/GIF/WebP are supported", avatarTooLarge: "Avatar size cannot exceed 2 MB", notActive: "You are not an active KOL", }, }, }, workspace: { eyebrow: "Dashboard", metrics: { articles: "Generated", published: "Published", brands: "Brands", platforms: "Platforms", }, sections: { generalTemplates: "General-Purpose Templates", recent: "Recent Generations", overview: "Overview", quota: "Plan & Quota", }, actions: { enterTemplates: "Open Templates", }, quota: { remaining: "Remaining quota", total: "Total quota", used: "Used quota", }, emptyTemplates: "No template cards available yet", noRecentArticles: "No recent generations yet", }, tracking: { eyebrow: "AI Brand Monitoring", brandPlaceholder: "Select brand", keywordPlaceholder: "Select keyword", collectNow: "Collect Now", collectBrandRequired: "Select a brand before collecting.", collectKeywordRequired: "Select a keyword before collecting the current question set.", collectTodayOnly: "Collect Now only supports today's data. Switch back to today to continue.", collectClientChecking: "Checking whether the current account's desktop client is online.", collectClientOnlineRequired: "The current account's desktop client must be online before collecting.", noDesktopClientCollectReason: "This account has no registered desktop client, so collection cannot start.", noAuthorizedPlatformsCollectReason: "This account has no authorized AI platforms, so collection cannot start.", collectPlatformUnauthorized: "The selected platform is not authorized for this account.", pluginMode: "Plugin sampling", pluginHint: "Plugin-mode data depends on device uptime. Low coverage should be treated as directional only.", awaitingSnapshot: "Waiting for the next valid snapshot", infoStrip: "{mode} · target {desired} · planned {planned} · sampled {actual} · coverage {coverage} · updated {updatedAt} · {trigger}", latestSnapshot: "Latest Snapshot", coverage: "Coverage", coverageTitle: "Sampling Coverage", coverageSummary: "Target {desired} · Sampled {actual} · Coverage {coverage}", platformMatrix: "Platform Matrix", platformMatrixTitle: "Platform Comparison Matrix", hotQuestions: "Hot Questions", hotQuestionsTitle: "Hot Questions", hotQuestionsHint: "Questions come from the brand library under the selected keyword.", questionSearchPlaceholder: "Search questions under the selected keyword", questionDetailEyebrow: "Question Detail", questionDetailCollectedAt: "Collected at {time}", questionDetailFallback: "Question Detail", backToQuestions: "Back to questions", citationRanking: "Citation Ranking", citationRankingTitle: "Citation Ranking", citationRankingHint: "Attribute SaaS-published content by registrable domain across model citation sources.", citationWindow7: "Last 7 days", citationWindow30: "Last 30 days", citationWindowLabel: "Last {days} days", citedArticles: "Cited Articles", citedArticlesTitle: "Cited Articles", answerContent: "Answer Content", citationSources: "Citation Sources", citationSourcesTitle: "Citation Sources", citationAnalysis: "Citation Analysis", citationAnalysisTitle: "Citation Analysis", contentCitations: "Content Citations", contentCitationsTitle: "Content Citations", imitationAction: "Imitation create", taskDebugTitle: "Async Task Debug", taskDebugHint: "For troubleshooting the callback -> queue -> worker flow only. The four main content sections above stay unchanged.", contentCitationBadge: "Content Citation", noQuestions: "No hot questions for the current filters", noCitationRanking: "No attributable citations in the current window", noCitedArticles: "No content citations in the current window", noAnswer: "No sampled answer for this platform", noCitations: "No citations for this platform", noCitationAnalysis: "No citation analysis for this platform", noContentCitations: "No content citations for the active platform", noTaskDebug: "No async task debug data for the current filters", noPlatformBreakdown: "No platform data is available for the current filters", selectedPlatformUnauthorizedTitle: "Selected Platform Not Authorized", selectedPlatformUnauthorizedDescription: "This AI platform has no active authorization for the current account. Switch to an authorized platform or authorize it in the desktop client.", noDetailPlatformsTitle: "No Platforms Available", noDetailPlatformsDescription: "No AI platform data is available for the current filters.", platformAuthorization: { authorized: { title: "AI Platform Authorization Active", description: "This account has AI platform authorization available for monitoring collection.", }, no_desktop_client: { title: "No Desktop Client Detected", description: "This account has not registered a desktop client. Daily tasks will wait for an eligible client before dispatch, and the dashboard will not show collection as available.", }, no_authorized_platforms: { title: "No Authorized AI Platforms", description: "This account has no bound or authorized AI platform accounts. The system will not generate or dispatch collection tasks for unauthorized platforms.", }, }, samples: "samples", citations: "citations", citedArticleMeta: "{count} cited articles", contentCitationMeta: "{count} content references", manual: "Manual", automatic: "Automatic", noChange: "Flat", metrics: { mentionRate: "Mention Rate", top1MentionRate: "Top-1 Mention Rate", firstRecommendRate: "First Recommendation Rate", positiveMentionRate: "Positive Mention Rate", }, columns: { platform: "Platform", appearances: "Appearances", citedAnswers: "Cited Answers", citedArticles: "Cited Articles", citationRate: "Citation Rate", saasSourceRate: "Source Share", citations: "Citations", sourcePlatform: "Source", channelName: "Channel", domain: "Domain", share: "Share", contentName: "Content", publishPlatform: "Publish Platform", distinctSites: "Distinct Sites", brandContent: "Has Brand Content", }, status: { sampled: "Sampled", partial: "Partially Sampled", unsampled: "Unsampled", pending: "Pending", not_logged_in: "Not Logged In", unavailable: "Unavailable", }, confidence: { high: "High confidence", medium: "Medium confidence", low: "Low confidence", }, taskDebug: { labels: { plannedAt: "Planned At", leasedAt: "Leased At", callbackReceivedAt: "Callback Received At", queueEnqueuedAt: "Queued At", completedAt: "Completed At", leaseExpiresAt: "Lease Expires At", runId: "Run ID", runStatus: "Run Status", providerModel: "Model", requestId: "Request ID", providerRequestId: "Provider Request ID", receivedAlertCount: "Received Alert Count", receivedAlertedAt: "Last Alerted At", skipReason: "Skip Reason", errorMessage: "Task Error", lastQueuePublishError: "Queue Publish Error", }, taskStatus: { pending: "Pending", leased: "Leased", received: "Received", completed: "Completed", failed: "Failed", skipped: "Skipped", expired: "Expired", }, queueStatus: { pending: "Pending Queue", queued: "Queued", publish_failed: "Publish Failed", invalid_payload: "Invalid Payload", }, }, }, templateMeta: { top_x_article: { eyebrow: "Ranked Content", helper: "Good for listicles, comparisons, and recommendation-driven output.", accent: "Top X", action: "Create ranking", }, product_review: { eyebrow: "Product Review", helper: "Good for benefits, trade-offs, and suitability analysis.", accent: "Review", action: "Start review", }, research_report: { eyebrow: "Research Report", helper: "Good for longer analysis, trends, and market insight.", accent: "Report", action: "Create report", }, brand_search_expansion: { eyebrow: "Brand Expansion", helper: "Expand brand plus search intent into a richer GEO article.", accent: "GEO", action: "Expand", }, default: { eyebrow: "Content Template", helper: "This template is already usable and can go straight into generation.", accent: "Ready", action: "Open template", }, }, status: { generate: { draft: "Draft", queued: "Queued", generating: "Generating", running: "Running", completed: "Completed", failed: "Failed", }, publish: { unpublished: "Unpublished", publishing: "Publishing", success: "Published", failed: "Failed", partial_success: "Partially Published", published: "Published", publish_success: "Published", publish_failed: "Failed", pending_review: "Pending Review", }, sourceType: { template: "Template generation", custom_generation: "Custom generation", instant_task: "Instant task", schedule_task: "Scheduled task", free_create: "Free create", imitation: "Imitation create", kol: "Refined template generation", }, }, imitation: { actions: { create: "New Rewrite", submit: "Submit and generate", }, filters: { publishStatus: "Publish status", generateStatus: "Generation status", keyword: "Search", createdTime: "Created time", createdTimeStart: "Start time", createdTimeEnd: "End time", keywordPlaceholder: "Search by article title", }, list: { eyebrow: "Imitation Create", count: "{count} articles", sourceArticle: "Source", empty: "No rewritten articles yet. Start from a citation source or create one manually.", deleteConfirm: "Delete this rewritten article?", deleteSuccess: "Article deleted.", deleteError: "Failed to delete article.", }, create: { title: "Create rewritten article", subtitle: "The backend fetches the source article first, then generates a new original article from your settings.", sourceSection: "Source article", settingsSection: "Rewrite settings", sourceURL: "Article URL", sourceTitle: "Source title", language: "Article language", industry: "Industry / scenario", brandName: "Brand / subject", region: "Region", targetAudience: "Target audience", contentGoal: "Content goal", tone: "Tone", lengthGoal: "Length", keywords: "Keywords", preservePoints: "Keep / emphasize", avoidPoints: "Avoid", extraRequirements: "Extra requirements", enableWebSearch: "Allow web search supplement", webSearchHint: "When enabled, generation can reference live web information for newer facts or industry context.", knowledgeBase: "Reference knowledge base", knowledgeBasePlaceholder: "Optional. Add facts, brand material, and industry background.", knowledgeBaseHint: "Selected groups are retrieved in the backend and passed to generation as reference context.", sourceURLPlaceholder: "https://example.com/article", sourceTitlePlaceholder: "Optional. Citation titles are prefilled automatically.", industryPlaceholder: "For example: home improvement, education, SaaS, healthcare", brandNamePlaceholder: "Optional. Helps the article fit a specific brand or subject.", regionPlaceholder: "For example: Shanghai, East China, nationwide, North America", targetAudiencePlaceholder: "For example: first-time buyers, channel partners, procurement leads", contentGoalPlaceholder: "For example: education, conversion, brand trust, selection advice", tonePlaceholder: "For example: professional, conversational, comparative, news analysis", lengthGoalPlaceholder: "For example: around 1200 words, short post, long-form guide", keywordsPlaceholder: "Type keywords and press Enter", preservePointsPlaceholder: "List facts, data, arguments, or examples that must be kept.", avoidPointsPlaceholder: "List claims, competitors, compliance risks, or wording to avoid.", extraRequirementsPlaceholder: "Add channel, structure, title style, or industry-specific instructions.", queued: "Rewrite task submitted and queued.", sourceURLRequired: "Enter the source article URL first.", submitError: "Failed to submit rewrite task.", backToList: "Back to rewrites", }, }, freeCreate: { actions: { create: "New Article", }, filters: { publishStatus: "Publish Status", keyword: "Search", createdTime: "Created Time", createdTimeStart: "Start", createdTimeEnd: "End", keywordPlaceholder: "Search by title", }, list: { eyebrow: "Free Create", count: "{count} articles", empty: "No articles yet. Click \"New Article\" to start creating.", edit: "Edit article", deleteConfirm: "Are you sure you want to delete this article?", deleteSuccess: "Article deleted", deleteError: "Failed to delete article", }, createError: "Failed to create article", }, templates: { eyebrow: "Article Creation", sections: { generalTemplates: "General-Purpose Templates", refinedTemplates: "Refined Templates", records: "Template Creation Records", }, actions: { batchGenerate: "Batch generate", chooseTemplate: "Choose template", }, filters: { template: "Template", publishStatus: "Publish status", generateStatus: "Generation status", keyword: "Search", generationTime: "Generation time", generationTimeStart: "Start time", generationTimeEnd: "End time", keywordPlaceholder: "Search by article title", }, list: { eyebrow: "Template Creation Records", count: "{count} articles", empty: "No articles have been created yet.", preview: "Preview", edit: "Edit article", editDisabled: "Only draft, failed, or completed articles can be edited", publishDisabled: "Only completed articles can be published", versions: "Versions", deleteConfirm: "Delete this article?", deleteSuccess: "Article deleted.", deleteError: "Failed to delete article.", }, picker: { title: "Choose the template you want to use", empty: "Choose either general-purpose templates or refined template generation first", generalDescription: "Choose a general-purpose template to start creating", refinedDescription: "Choose a refined template and start refined generation directly", viewExample: "View example", }, wizard: { drawerTitle: "Template generation", steps: { basic: "Basic info", basicDesc: "Language, template fields, and brand context", structure: "Structure", structureDesc: "Title and outline", generate: "Generate", generateDesc: "Confirm the outline, add key points, and submit the task", }, sections: { templateFields: "Template fields", brandContext: "Brand context", language: "Language", brandInfo: "Brand", brandLibrary: "Brand library", brandName: "Brand name", website: "Official website", brandSummary: "AI brand summary", keywords: "Keywords", competitors: "Competitors", chooseTitle: "Choose a title", customTitle: "Custom title", structure: "Article structure", customOutline: "Custom section", preview: "Article preview", generatedOutline: "Confirm outline", outlinePreview: "Outline preview", keyPoints: "Key points", review: "Review", notes: "Notes", inputParams: "Input params", }, hints: { brandContext: "Optional. Selecting a brand pulls in keywords and competitor context.", brandFlow: "You can pick a brand from the library or type one manually. AI analysis will expand keywords, competitors, and title options.", brandSummaryPlaceholder: "After analysis, AI will summarize the brand angle, positioning, and content opportunities here.", keywords: "Type keywords directly or reuse brand-library keywords. AI results will be merged into this list.", competitors: "Competitors stay editable. You can add rows manually; saving to the competitor library is only available after choosing a library brand.", competitorEmptyEditable: "No competitors yet. Add one manually or let AI fill the list first.", templateFields: "Keep any extra template-specific fields here to constrain the writing direction.", titleSelection: "AI will return 5 better title options before you move forward. Choose one or rewrite it.", structure: "Keep the default outline or trim sections for this draft.", preview: "The panel on the right updates the article frame in real time.", previewEmpty: "Select one or more sections to preview the article frame here.", generatedOutline: "AI generates the full article outline first. You can edit, add, or delete nodes before creating the final article.", outlinePreview: "The panel on the right updates from the current outline in real time.", outlineEmpty: "Generate the outline first to edit the article structure here.", review: "Check the final setup before creating the generation task.", competitorEmpty: "No competitors are available under this brand yet.", customTitle: "Use this field if you want to override the title manually.", keyPoints: "Add any key messages, angles, or style notes here.", async: "The backend creates the article and task first, then completes content generation asynchronously.", }, actions: { analyze: "Analyze", addCompetitor: "Add competitor", addSection: "Add section", addOutlineNode: "Add node", addOutlineChild: "Add child", favorite: "Save", saved: "Saved", submit: "Submit and generate", }, review: { templateName: "Template", articleTitle: "Article title", brandContext: "Brand context", outline: "Outline", currentTemplate: "Current template", promptVisibility: "Prompt visibility", selectedKeywords: "Selected keywords", selectedCompetitors: "Selected competitors", }, localeOptions: { zh: "Simplified Chinese", en: "English", }, table: { website: "Website", name: "Name", description: "Description", actions: "Actions", }, placeholders: { brandLibrary: "Choose an existing brand from the library", brandName: "Enter a brand name, or refine the selected library brand", website: "Official website, optional", keywords: "Type keywords and press Enter", customTitle: "Override the AI title here if needed", customOutline: "Add another section, for example “Buying advice”", keyPoints: "Add any extra instructions, key angles, or constraints for the article", competitorWebsite: "Official site or landing page", competitorName: "Competitor name", competitorDescription: "One-line positioning or summary", outlineNode: "Enter a title", }, promptVisible: "Prompt visible", promptSealed: "Prompt sealed", assist: { analyzeTitle: "AI is analyzing keywords and competitors. Please wait…", titleTitle: "AI is generating titles. Please wait…", outlineTitle: "AI is generating the article outline. Please wait…", analyzeStages: { brand: "Analyzing the brand context…", keywords: "Extracting keyword opportunities…", competitors: "Mapping competitors and websites…", }, titleStages: { context: "Preparing the current brief…", strategy: "Generating title directions from keywords and competitors…", finalize: "Returning 5 title options…", }, outlineStages: { context: "Preparing the title, keywords, and competitor context…", structure: "Generating the article outline from the selected structure…", finalize: "Returning the editable outline result…", }, }, messages: { requiredField: "Please fill in {field} first.", missingBrand: "Choose a brand from the library or enter a brand name first.", missingTitle: "Please choose or enter an article title.", missingOutline: "Please select at least one outline section.", missingGeneratedOutline: "Please generate and confirm the article outline first.", customOutlineTooLong: "Custom sections cannot exceed {count} characters.", selectBrandBeforeFavorite: "Choose a brand from the library before saving competitors.", missingCompetitorName: "Enter a competitor name before saving it to the library.", savedCompetitor: "Competitor saved to the brand library.", assistReady: "AI analysis is ready. You can keep refining the draft.", assistFailed: "AI analysis failed. Please try again.", assistTimeout: "AI analysis timed out. Please try again.", titleFailed: "Title generation failed. Please try again.", titleTimeout: "Title generation timed out. Please try again.", outlineFailed: "Outline generation failed. Please try again.", outlineTimeout: "Outline generation timed out. Please try again.", draftSaved: "Draft saved. Returning to the template list.", draftSaveFailed: "Failed to save the draft. Please try again.", queued: "Task submitted. The article is now waiting in the generation queue.", submitted: "Generation task submitted. Refreshing article data.", }, }, }, article: { drawerTitle: "Article details", preview: "Content preview", versionHistory: "Version history", publishedDetails: "Published details", untitled: "Untitled article", noContent: "This article does not have generated content yet.", editor: { publish: "Publish", titlePlaceholder: "Enter article title", leaveConfirm: { title: "Unsaved changes", description: "This article has unsaved edits. Leave now to discard them, or save first before going back.", discard: "Discard changes", saveAndLeave: "Save and leave", }, platformsTitle: "Publish platforms", platformsHint: "This stays in sync with Media Management so you can edit the article's publish platforms directly.", coverTitle: "Cover image", coverHint: "Off by default. Once uploaded, the cover is saved with the article.", coverRequired: "A selected publishing platform requires a cover image.", coverUpload: "Upload cover image", coverReplace: "Choose again", coverRemove: "Remove cover", coverSaved: "Cover asset saved", coverOff: "Cover image is currently off. Turn it on to upload and crop a cover asset.", coverTagRequired: "Required", coverTagOptional: "Optional", imagePrompt: "Enter image URL", tablePicker: { empty: "Drag to choose a table size", hint: "Keep dragging near the edge to expand the grid", }, tableMenu: { addRowBefore: "Insert row above", addRowAfter: "Insert row below", deleteRow: "Delete row", addColBefore: "Insert left column", addColAfter: "Insert right column", deleteCol: "Delete column", alignLeft: "Align left", alignCenter: "Align center", alignRight: "Align right", deleteTable: "Delete table", }, imageMenu: { replace: "Replace image", caption: "Toggle caption", alignLeft: "Align left", alignCenter: "Align center", alignRight: "Align right", resetSize: "Reset size", delete: "Delete image", }, imagePicker: { title: "Select image", emptyTitle: "Choose an image for the article body", emptyHint: "Pick from the image library or upload locally. Local uploads are converted to WebP before upload.", }, aiOptimize: { title: "AI Optimize", subtitle: "Supports contiguous multi-block selections and generates a rewrite from your instruction", originalLabel: "Selected text", previewLabel: "Preview", previewPlaceholder: "After you enter an instruction, the AI rewrite will stream here.", generating: "Generating...", streamingHint: "Building a stronger version of the selected text in real time...", disclaimer: "AI output is for reference only. Review it before replacing the original text.", promptLabel: "Instruction", promptPlaceholder: "For example: make it more natural, classroom-friendly, and persuasive while keeping the facts unchanged.", generate: "Generate", regenerate: "Regenerate", stop: "Stop", replace: "Replace selection", close: "Keep original", messages: { selectionRequired: "Select one block or multiple contiguous blocks of article text first.", promptRequired: "Enter an instruction first.", selectionChanged: "The original selection changed. Please select it again before replacing.", empty: "There is no AI content ready to replace yet.", failed: "AI optimization failed. Please try again later.", }, }, messages: { saved: "Article saved.", generating: "This article is still generating. Try editing it later.", locked: "Only completed articles can be edited.", publishPending: "Save the article first, then choose the target platforms.", }, platforms: { zhihu: "Zhihu", }, }, meta: { templateType: "Template", currentVersion: "Current version", source: "Source label", sourceArticle: "Source article", wordCount: "Word count", }, versionUntitled: "Untitled version", }, media: { hero: { eyebrow: "Publisher", }, plugin: { title: "Browser Publisher", ready: "Extension connected", notInstalled: "Extension not connected", installTitle: "Install and open the GEO Publisher extension first", installDesc: "Binding and publishing depend on the browser's local platform sessions. The extension stores its own installation identity so future background checks can continue after the SaaS page is closed.", backgroundHint: "The extension should not reuse the web app's access token directly. This implementation already registers a dedicated installation identity for future background scanning and inclusion checks.", versionLabel: "Extension version", installationLabel: "Installation ID", connectedSummary: "Locally signed-in platforms", registerRequired: "The extension installation is not registered yet. Please re-detect first.", }, actions: { redetect: "Re-detect", bind: "Bind", rebind: "Rebind", unbind: "Unbind", }, card: { bound: "Bound", unbound: "Unbound", unboundHint: "{platform} has not been bound to this tenant yet.", needsAttention: "Needs attention", expiredHint: "This account is no longer healthy. Rebind it to restore publishing.", localMissing: "Local session missing", localMismatch: "Local account mismatch", readyHint: "The correct local account is available and ready for publish or future background checks.", accountLabel: "SaaS account", uidLabel: "Platform UID", localLabel: "Local state", localConnected: "Session detected", localDisconnected: "No session detected", updatedAt: "Last sync", multiAccount: "{count} accounts bound", openPlatform: "Open platform", }, account: { localMissing: "The tenant account is bound, but this browser does not currently have the matching local session.", localMismatch: "This browser is signed in to a different account. Rebind or switch the local account first.", ready: "Ready", selectable: "Selectable", unavailable: "Unavailable", }, empty: { accounts: "No publishable media accounts are bound yet.", }, messages: { bindSuccess: "{platform} bound successfully.", bindSuccessTitle: "Binding successful", bindSuccessDetail: "Bound account [{account}] on [{platform}]", bindPending: "The extension did not detect a local session for this platform yet. Sign in via the extension and retry.", bindPendingTitle: "Binding incomplete", bindFailureTitle: "Binding failed", unbindSuccess: "Account unbound.", unbindSuccessTitle: "Unbind successful", unbindFailureTitle: "Unbind failed", unbindConfirm: "Unbind this platform account? Publishing will no longer be available until it is bound again.", }, publish: { title: "Publish", subtitle: "Multi-platform Dispatch", description: "Choose tenant-bound accounts that are currently signed in locally. The extension executes the real publish flow and writes back the resulting links.", platformsTitle: "Target platforms", platformsHint: "Previously selected and bound accounts are prefilled first. Unbound or locally unavailable platforms stay disabled.", coverTitle: "Cover image", coverHint: "Off by default. Uploading opens the cover picker and cropper.", coverUpload: "Upload cover image", coverPlaceholder: "Enter an optional cover asset URL", messages: { success: "{count} publish tasks submitted.", successTitle: "Publish successful", partial: "Publish finished with {success} succeeded and {failed} failed.", partialTitle: "Partial publish failure", selectPlatform: "Choose at least one available platform first.", coverRequired: "A selected publishing platform requires a cover image. Please upload one first.", failureTitle: "Publish failed", failureItem: "Publishing to [{platform}] failed: [{reason}]", unknownFailure: "Unknown error", }, }, records: { tabTitle: "Published details", platform: "Platform", status: "Status", publishedAt: "Published at", link: "Published link", open: "Open", copy: "Copy", empty: "No publish records yet", linkEmpty: "No link is available for this record yet.", copySuccess: "Link copied.", }, }, coverPicker: { title: "Select cover image", tabs: { local: "Body / Local Upload", ai: "AI Cover", }, dropzoneTitle: "Upload image", dropzoneHint: "Supports PNG, JPG, GIF, and WebP up to 10MB. Uploads are converted to WebP in the browser first.", previewTitle: "Cover crop preview", previewHintLocked: "A selected platform requires a fixed cover ratio, so the cover will be exported using the current platform requirement.", previewHintFree: "There is no forced cover ratio right now. You can upload the original image directly or adjust framing before confirming.", requirementsTitle: "Platform requirements", requirementsHint: "Requirements switch automatically based on the selected publish platforms. WeChat Official Account, Baijiahao, and Dongchedi require a cover image.", recommendedRatio: "Recommended ratio", recommendedSize: "Recommended size", required: "Required", optional: "Optional", zoom: "Zoom", fileLabel: "Current cover", emptyTitle: "No publish platform selected", emptyPlatforms: "Choose publish platforms first and each platform's cover requirements will appear here.", emptyHint: "Supports PNG, JPG, JPEG, GIF, WebP, BMP, SVG, and AVIF up to 10MB.", aiTitle: "AI cover is coming soon", aiHint: "For now this flow supports local upload and cropping. AI cover generation can be plugged in here later.", actions: { upload: "Local upload", reset: "Reset framing", remove: "Remove cover", }, notes: { required: "This platform currently requires a cover image in the publish flow. Publishing is blocked until one is uploaded.", optional: "This platform already supports standalone covers and reuses the current crop when publishing.", unsupported: "This platform's current integration does not consume a standalone cover yet and falls back to body content or the platform default.", }, messages: { invalidType: "Only PNG, JPG, JPEG, GIF, WebP, BMP, SVG, and AVIF images are supported.", tooLarge: "Image size cannot exceed 10MB.", missingImage: "Select a cover image first.", missingArticle: "The article is not ready yet. Refresh and try again.", imageLoadFailed: "Failed to load the cover image. Please choose another image.", }, }, brands: { eyebrow: "Brand Library", title: "Brand Library", description: "Manage keywords, question sets, and competitor assets around each brand.", railTitle: "Brands", selectBrand: "Pick a brand to continue managing keywords and question sets.", newBrand: "New brand", editBrand: "Edit brand", deleteBrand: "Delete brand", tabs: { keywords: "Keywords", competitors: "Competitors", }, quota: { plan: "Current plan", planHint: "Brand library limits are enforced from the active plan.", brands: "Brand companies", brandsHint: "Free defaults to 1 and paid defaults to 2.", keywords: "Total keywords", keywordsHint: "The total number of keywords this account can bind.", questions: "Questions per keyword", questionsHint: "The maximum number of questions allowed under one keyword.", }, meta: { keywordCount: "{count} keywords", questionCount: "{count} questions", brandKeywordCount: "{count} keywords under this brand", globalKeywordUsage: "Total keywords used {used} / {total}", keywordQuestionUsage: "Questions {used} / {total}", }, sections: { keywords: "Keywords", questions: "Question set", competitors: "Competitor library", versions: "Version history", }, actions: { newKeyword: "New keyword", newQuestion: "New question", newCompetitor: "New competitor", viewVersions: "View versions", }, empty: { brands: "No brand data yet. Create your first brand to start.", questions: "No questions under this keyword yet.", competitors: "No competitors under this brand yet.", }, form: { brandName: "Brand name", brandWebsite: "Company website (optional)", brandDescription: "Brand description", keywordName: "Keyword", questionText: "Question text", competitorName: "Competitor name", competitorWebsite: "Competitor website", competitorDescription: "Competitor description", competitorLines: "Product lines", competitorLinesHint: "Separate multiple product lines with commas.", }, messages: { createBrand: "Brand created.", updateBrand: "Brand updated.", deleteBrand: "Brand deleted.", createKeyword: "Keyword created.", updateKeyword: "Keyword updated.", deleteKeyword: "Keyword deleted.", createQuestion: "Question created.", updateQuestion: "Question updated.", deleteQuestion: "Question deleted.", createCompetitor: "Competitor created.", updateCompetitor: "Competitor updated.", deleteCompetitor: "Competitor deleted.", chooseBrand: "Please choose a brand first.", chooseKeyword: "Please choose a keyword first.", brandLimitReached: "Your current plan allows up to {limit} brand companies.", keywordLimitReached: "This account allows up to {limit} keywords.", questionLimitReached: "This keyword allows up to {limit} questions.", }, }, custom: { eyebrow: "Custom Generation", title: "Custom Generation", description: "Generate articles with custom prompt rules, instant or scheduled.", cards: { instantTitle: "Instant Generation", instantDesc: "Quickly create custom content tasks", scheduleTitle: "Scheduled Generation", scheduleDesc: "Set up automated content generation plans", }, tabs: { articles: "Articles", instantTasks: "Instant Tasks", scheduleTasks: "Scheduled Tasks", promptRules: "Prompt Rules", }, promptRule: { name: "Rule name", namePlaceholder: "Enter prompt name", content: "Prompt content", scene: "Scene", tone: "Default tone", wordCount: "Default word count", status: "Status", articleCount: "Article count", createTitle: "Create Prompt Rule", editTitle: "Edit Prompt Rule", deleteConfirm: "Delete this rule?", enabled: "Enabled", disabled: "Disabled", ungrouped: "Ungrouped", groupPlaceholder: "Select a prompt group", contentPlaceholder: "Enter prompt content, variables supported", }, task: { basicSection: "I Basic Information", advancedSection: "I Advanced Settings", name: "Task name", namePlaceholder: "Use a simple name so the task is easy to identify later.", prompt: "Select Prompt", promptPlaceholder: "Select a prompt", createPrompt: "New Prompt", platforms: "Publish platforms", platformsHint: "Synced from Media Management. This field is optional and supports multiple selection.", platformConnected: "Connected", platformUnauthorized: "Unauthorized", platformEmptyTitle: "No publish platforms", platformEmptyHint: "No platform data is available yet. Please verify the Media Management setup first.", publishSection: "Publish Settings", autoPublish: "Auto publish", autoPublishHint: "When enabled, scheduled articles enter the publish queue after generation.", publishAccounts: "Media accounts", publishAccountsHint: "Choose specific accounts. Offline clients queue first and continue after reconnecting.", publishAccountEmptyTitle: "No media accounts", publishAccountEmptyHint: "Bind media accounts in the desktop client before configuring auto publish.", cover: "Cover image", coverHint: "Keep the cover clear, complete, and visually polished.", scheduleCoverHint: "Cover is off by default. Enable it to save a cover to generated articles for publishing.", scheduleCoverRequiredHint: "A selected account platform requires a cover image before publishing.", coverUpload: "Upload cover image", coverUploadHint: "Local preview only for now", scheduleCoverUploadHint: "Choose from local files or the asset library", scheduleTime: "Schedule article generation", scheduleEveryDay: "Every day", enableWebSearch: "Enable web search for generation", generateCount: "Article count", submit: "Create task", }, group: { title: "Rule Groups", createTitle: "Create Group", editTitle: "Edit Group", deleteConfirm: "Deleting this group will move its rules to ungrouped. Continue?", name: "Group name", allRules: "All Rules", }, schedule: { name: "Task name", rule: "Prompt rule", cron: "Frequency", autoPublishPlatforms: "Auto publish platforms", autoPublish: "Auto publish", manualPublish: "Manual publish", nextRun: "Next run", startAt: "Start time", endAt: "End time", brand: "Brand", createTitle: "Create Scheduled Task", editTitle: "Edit Scheduled Task", deleteConfirm: "Delete this scheduled task?", enabled: "Enabled", disabled: "Disabled", cronOptions: { daily: "Once daily", twiceDaily: "Twice daily", weekly: "Once weekly", custom: "Custom Cron", }, }, instant: { title: "Instant Generate", createTitle: "Create Instant Task", selectRule: "Select prompt rule", selectBrand: "Select brand", selectPlatform: "Target platform", submit: "Generate now", extraParams: "Extra parameters", name: "Task name", executionStatus: "Execution status", executionTime: "Execution time", createdTime: "Created time", empty: "No instant tasks yet.", }, filters: { promptRule: "Prompt rule", publishStatus: "Publish status", generateStatus: "Generation status", title: "Title", generateTime: "Generation time", status: "Status", name: "Name", namePlaceholder: "Search by task name", createdTime: "Created time", }, article: { titleColumn: "Article title", titleGenerating: "Generating title", }, messages: { ruleCreated: "Rule created.", ruleUpdated: "Rule updated.", ruleDeleted: "Rule deleted.", ruleEnabled: "Rule enabled.", ruleDisabled: "Rule disabled.", groupCreated: "Group created.", groupUpdated: "Group updated.", groupDeleted: "Group deleted.", scheduleCreated: "Scheduled task created.", scheduleUpdated: "Scheduled task updated.", scheduleDeleted: "Scheduled task deleted.", scheduleEnabled: "Scheduled task enabled.", scheduleDisabled: "Scheduled task disabled.", generateSubmitted: "Generation task submitted.", missingTaskName: "Enter a task name first.", missingPromptRule: "Choose a prompt first.", invalidGenerateCount: "Article count must be at least 1.", invalidScheduleTime: "Choose a valid schedule time.", missingPublishAccounts: "Choose at least one media account when auto publish is enabled.", missingScheduleCover: "A selected media account platform requires a cover image.", missingPromptName: "Enter a prompt name first.", missingPromptContent: "Enter prompt content first.", }, }, featureStub: { eyebrow: "Feature Placeholder", currentStatus: "Current status", nextPriority: "Next priority", integrationStrategy: "Integration strategy", currentStatusText: "The page shell is ready with navigation and auth guard support.", integrationStrategyText: "Keep the UI aligned with tenant-api envelopes and wire real read flows before write flows.", }, images: { title: "Image Management", description: "Manage image library with folder organization and reference analysis.", uploadBtn: "Upload Image", folders: "Folders", uncategorized: "Uncategorized", searchPlaceholder: "Search image name...", newFolder: "New Folder", folderName: "Folder Name", rename: "Rename", move: "Move", deleteImage: "Delete Image", deleteFolder: "Delete Folder", forceDelete: "Force Delete", confirmDeleteTitle: "Confirm Delete", confirmDeleteImage: "Are you sure you want to delete this image? This action cannot be undone.", confirmDeleteFolder: "Confirm delete folder {name}?", imageInUse: "Image is in use", folderHasRefs: "This folder contains {count} images. They may already be referenced by articles. Deleting the folder will also delete these images permanently.", refArticleBody: "Body reference", refArticleCover: "Cover reference", storageUsage: "Storage Usage", storageUsageDetail: "{used} / {total} ({percent}%)", quotaExceeded: "Storage is full, please clean up before uploading more.", uploadSuccess: "Image uploaded successfully", uploadReusedSuccess: "Matching image already exists in the library and was reused", uploadFailed: "Image upload failed", deleteSuccess: "Deleted successfully", folderCreated: "Folder created successfully", folderRenamed: "Folder renamed successfully", folderDeleted: "Folder deleted", imageRenamed: "Image renamed successfully", imageMoved: "Image moved successfully", noImages: "No images yet. Click upload to start.", allFolders: "All Folders", selectImage: "Select Image", libraryTab: "Library", }, } as const; export default enUS;