Files
geo/apps/admin-web/src/i18n/messages/en-US.ts
T

756 lines
28 KiB
TypeScript
Raw Normal View History

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",
search: "Search",
save: "Save",
back: "Back",
next: "Next",
previous: "Previous",
submit: "Submit",
submitGenerate: "Generate",
actions: "Actions",
title: "Title",
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",
},
nav: {
workspace: "Workspace",
articleCreation: "Article Creation",
templates: "Templates",
custom: "Custom Generation",
optimize: "Optimization",
media: "Media",
brandManagement: "Brand Management",
brands: "Brand Library",
tracking: "Tracking",
trackingDetail: "Data Details",
contentManagement: "Content Management",
knowledge: "Knowledge Base",
},
auth: {
welcomeBack: "Welcome back",
tenantAdminLogin: "Tenant Admin Login",
loginAndEnter: "Sign in to workspace",
email: "Email",
password: "Password",
defaultTestAccount: "Default account",
defaultTestPassword: "Default password",
},
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: "Choose a suitable template or use the batch feature to quickly generate GEO content.",
},
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.",
},
optimize: {
title: "Article Optimization",
description: "No matching backend APIs exist in this repository yet.",
},
media: {
title: "Media Management",
description: "Manage media bindings, local extension state, and one-click publishing from a single control plane.",
},
brands: {
title: "Brand Library",
description: "Manage keywords, question sets, and competitors around each brand.",
},
tracking: {
title: "Data Details",
description: "No matching backend APIs exist in this repository yet.",
},
knowledge: {
title: "Knowledge Base",
description: "No matching backend APIs exist in this repository yet.",
},
},
workspace: {
eyebrow: "Dashboard",
metrics: {
articles: "Generated",
published: "Published",
brands: "Brands",
platforms: "Platforms",
},
sections: {
templates: "Article 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",
},
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",
},
},
templates: {
eyebrow: "Article Creation",
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: {
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",
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: "Upload a cover asset before publishing. This is local preview only for now.",
coverUpload: "Upload cover image",
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",
},
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: "This version uses a cover asset URL. Upload and crop can be wired later.",
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.",
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.",
},
},
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",
},
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.",
},
},
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.",
},
} as const;
export default enUS;