7abac1e9c4
- Added a new Qwen adapter to facilitate monitoring through Playwright, leveraging internal text/chat managers. - Updated account detection logic to recognize Qwen sessions based on persisted cookies, improving binding reliability. - Relaxed authentication requirements for monitor tasks, allowing anonymous execution for certain AI platforms. - Enhanced the generic AI platform detection to include Qwen-specific logic, ensuring accurate session identification. - Modified the monitoring dashboard to include runtime state indicating if the current user's desktop client is online. - Updated various files including `account-binder.ts`, `runtime-controller.ts`, and `monitoring_service.go` to support new features and improvements.
1245 lines
48 KiB
TypeScript
1245 lines
48 KiB
TypeScript
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",
|
|
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",
|
|
},
|
|
auth: {
|
|
welcomeBack: "Welcome back",
|
|
tenantAdminLogin: "Tenant Admin Login",
|
|
loginAndEnter: "Sign in to workspace",
|
|
email: "Email",
|
|
password: "Password",
|
|
defaultTestAccount: "Default account",
|
|
defaultTestPassword: "Default password",
|
|
},
|
|
membershipBlocked: {
|
|
eyebrow: "Access Paused",
|
|
title: "This tenant plan is unavailable",
|
|
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",
|
|
remainingQuota: "Article quota",
|
|
resetAt: "Reset at",
|
|
userFallback: "Admin",
|
|
logout: "Logout",
|
|
planFallback: "Free Plan",
|
|
},
|
|
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.",
|
|
},
|
|
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.",
|
|
},
|
|
},
|
|
kol: {
|
|
marketplace: {
|
|
title: "Refined Templates",
|
|
filter: {
|
|
industry: "Industry",
|
|
keyword: "Keyword",
|
|
all: "All",
|
|
},
|
|
empty: "No published subscription packages yet",
|
|
subscribers: "{count} subscribed tenants",
|
|
prompts: "{count} prompts",
|
|
},
|
|
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",
|
|
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 or optimize it...",
|
|
},
|
|
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",
|
|
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.",
|
|
collectClientChecking: "Checking whether the current account's desktop client is online.",
|
|
collectClientOnlineRequired: "The current account's desktop client must be online before collecting.",
|
|
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: "Track how often content published from this system appears across model answers.",
|
|
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",
|
|
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",
|
|
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",
|
|
citations: "Citations",
|
|
sourcePlatform: "Source",
|
|
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: "Partial Success",
|
|
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",
|
|
kol: "Refined template generation",
|
|
},
|
|
},
|
|
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 and save useful ones back into the competitor library.",
|
|
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.",
|
|
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: "Baijiahao is selected, so the cover image becomes required.",
|
|
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",
|
|
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: "Baidu Baijiahao is selected. Please upload a cover image 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: "Baijiahao is selected, so the cover will be exported as 16:9 when you confirm.",
|
|
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. Baijiahao is mandatory.",
|
|
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.",
|
|
cover: "Cover image",
|
|
coverHint: "Keep the cover clear, complete, and visually polished.",
|
|
coverUpload: "Upload cover image",
|
|
coverUploadHint: "Local preview only for now",
|
|
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",
|
|
platform: "Target platform",
|
|
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.",
|
|
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;
|