mirror of
https://github.com/nexu-io/open-design.git
synced 2026-05-31 19:04:39 +07:00
* fix chat runs surviving web disconnects * fix chat run create abort propagation Generated-By: looper 0.0.0-dev (runner=fixer, agent=openai/gpt-5.5) * fix daemon keepalive reconnect budget Generated-By: looper 0.0.0-dev (runner=fixer, agent=gpt-5.5) * fix daemon stream disconnect cancellation Generated-By: looper 0.0.0-dev (runner=fixer, agent=openai/gpt-5.5) * fix daemon stream abort cancellation race Generated-By: looper 0.0.0-dev (runner=fixer, agent=openai/gpt-5.5) * fix daemon run cancellation semantics * fix load * doc * 2 * add run refresh recovery * fix active run refresh status * fix reattach abort handling * fix * fix chat initial scroll * fix daemon start failures Generated-By: looper 0.2.7 (runner=fixer, agent=openai/gpt-5.5) * fix background run recovery Generated-By: looper 0.2.7 (runner=fixer, agent=openai/gpt-5.5) * fix stop run status Generated-By: looper 0.2.7 (runner=fixer, agent=openai/gpt-5.5) * fix background run recovery Generated-By: looper 0.2.7 (runner=fixer, agent=openai/gpt-5.5) * extract daemon run service * move prompt composition to daemon * fix prompt module resolution * fix project id generation * add project run status * add designs kanban view with awaiting_input status - add grid/kanban view toggle on Designs tab; persist choice in localStorage - introduce awaiting_input project display status (daemon-derived from unanswered <question-form>) so projects asking the user aren't shown as Completed; ordered between Running and Completed with amber accent - hide transient queued state from users: coerce queued/starting to running in daemon /api/projects projection and drop the queued kanban column - a11y polish on Designs cards: Space activation, aria-labels on delete, focus-visible outlines, reveal delete on focus-within and touch, prefers-reduced-motion handling - kanban layout uses flex sizing instead of viewport math; scoped icon- only pill button rule fixes view-toggle icon alignment --------- Co-authored-by: mrcfps <mrc@powerformer.com>
537 lines
23 KiB
TypeScript
537 lines
23 KiB
TypeScript
import type { Dict } from '../types';
|
||
|
||
export const en: Dict = {
|
||
'common.cancel': 'Cancel',
|
||
'common.save': 'Save',
|
||
'common.close': 'Close',
|
||
'common.delete': 'Delete',
|
||
'common.rename': 'Rename',
|
||
'common.preview': 'Preview',
|
||
'common.share': 'Share',
|
||
'common.search': 'Search',
|
||
'common.searchEllipsis': 'Search…',
|
||
'common.loading': 'Loading…',
|
||
'common.all': 'All',
|
||
'common.none': 'None',
|
||
'common.default': 'Default',
|
||
'common.installed': 'installed',
|
||
'common.notInstalled': 'not installed',
|
||
'common.active': 'active',
|
||
'common.offline': 'offline',
|
||
'common.selected': 'selected',
|
||
'common.create': 'Create',
|
||
'common.openPreview': 'Open preview',
|
||
'common.exitFullscreen': 'Exit fullscreen',
|
||
'common.fullscreen': 'Fullscreen',
|
||
'common.openInNewTab': 'Open in new tab',
|
||
'common.exportPdf': 'Export as PDF',
|
||
'common.exportZip': 'Download as .zip',
|
||
'common.exportHtml': 'Export as standalone HTML',
|
||
'common.justNow': 'just now',
|
||
'common.minutesAgo': '{n}m ago',
|
||
'common.hoursAgo': '{n}h ago',
|
||
'common.daysAgo': '{n}d ago',
|
||
'common.now': 'now',
|
||
'common.minutesShort': '{n}m',
|
||
'common.hoursShort': '{n}h',
|
||
'common.daysShort': '{n}d',
|
||
'common.untitled': 'Untitled',
|
||
|
||
'app.brand': 'Open Design',
|
||
'app.brandPill': 'Research Preview',
|
||
'app.brandSubtitle': 'by Nexu Labs',
|
||
'app.welcomeLoading': 'Loading workspace…',
|
||
|
||
'settings.welcomeKicker': 'Welcome',
|
||
'settings.welcomeTitle': 'Set up Open Design',
|
||
'settings.welcomeSubtitle':
|
||
"Pick how you'd like to run generations. You can change this any time from the Settings button in the top bar.",
|
||
'settings.kicker': 'Settings',
|
||
'settings.title': 'Execution & model',
|
||
'settings.subtitle':
|
||
'Choose between a local code-agent CLI and the Anthropic API (BYOK). Your API key is stored only in this browser.',
|
||
'settings.modeAria': 'Execution mode',
|
||
'settings.modeDaemon': 'Local CLI',
|
||
'settings.modeDaemonHelp': 'Run via a code-agent CLI on your machine',
|
||
'settings.modeDaemonOffline': 'Daemon is not running',
|
||
'settings.modeDaemonOfflineMeta': 'daemon offline',
|
||
'settings.modeDaemonInstalledMeta': '{count} installed',
|
||
'settings.modeApi': 'Anthropic API',
|
||
'settings.modeApiMeta': 'BYOK',
|
||
'settings.codeAgent': 'Code agent',
|
||
'settings.codeAgentHint':
|
||
'Detected by scanning your PATH. Pick the CLI you want generations to flow through.',
|
||
'settings.rescan': '↻ Rescan',
|
||
'settings.rescanTitle': 'Re-scan PATH',
|
||
'settings.noAgentsDetected':
|
||
'No agents detected yet. Install one of Claude Code, Codex, Gemini CLI, OpenCode, Cursor Agent, Qwen, or GitHub Copilot CLI, then click Rescan.',
|
||
'settings.apiSection': 'Anthropic API',
|
||
'settings.apiKey': 'API key',
|
||
'settings.showKey': 'Show key',
|
||
'settings.hideKey': 'Hide key',
|
||
'settings.show': 'Show',
|
||
'settings.hide': 'Hide',
|
||
'settings.model': 'Model',
|
||
'settings.baseUrl': 'Base URL',
|
||
'settings.apiHint':
|
||
'Calls go directly from this browser to the base URL you set. No proxy. The key never leaves localStorage.',
|
||
'settings.skipForNow': 'Skip for now',
|
||
'settings.getStarted': 'Get started',
|
||
'settings.envConfigure': 'Configure execution mode',
|
||
'settings.localCli': 'Local CLI',
|
||
'settings.anthropicApi': 'Anthropic API',
|
||
'settings.noAgentSelected': 'no agent selected',
|
||
'settings.language': 'Language',
|
||
'settings.languageHint': 'Switch the interface language. Saved to this browser.',
|
||
'settings.modelPicker': 'Model',
|
||
'settings.reasoningPicker': 'Reasoning effort',
|
||
'settings.modelPickerHint':
|
||
'Fetched from the CLI when it exposes a `models` command. "Default" leaves the choice to the CLI’s own config; "Custom…" lets you type any model id the CLI accepts.',
|
||
'settings.modelCustom': 'Custom (type below)…',
|
||
'settings.modelCustomLabel': 'Custom model id',
|
||
'settings.modelCustomPlaceholder': 'e.g. anthropic/claude-sonnet-4-6',
|
||
|
||
'entry.tabDesigns': 'Designs',
|
||
'entry.tabExamples': 'Examples',
|
||
'entry.tabDesignSystems': 'Design systems',
|
||
'entry.openSettingsTitle': 'Settings',
|
||
'entry.openSettingsAria': 'Open settings',
|
||
'entry.resizeAria': 'Resize sidebar',
|
||
'entry.loadingWorkspace': 'Loading workspace…',
|
||
|
||
'newproj.tabPrototype': 'Prototype',
|
||
'newproj.tabDeck': 'Slide deck',
|
||
'newproj.tabTemplate': 'From template',
|
||
'newproj.tabOther': 'Other',
|
||
'newproj.titlePrototype': 'New prototype',
|
||
'newproj.titleDeck': 'New slide deck',
|
||
'newproj.titleTemplate': 'Start from a template',
|
||
'newproj.titleOther': 'New project',
|
||
'newproj.namePlaceholder': 'Project name',
|
||
'newproj.fidelityLabel': 'Fidelity',
|
||
'newproj.fidelityWireframe': 'Wireframe',
|
||
'newproj.fidelityHigh': 'High fidelity',
|
||
'newproj.toggleSpeakerNotes': 'Use speaker notes',
|
||
'newproj.toggleSpeakerNotesHint': 'Less text on slides — keep talking points in notes.',
|
||
'newproj.toggleAnimations': 'Include animations',
|
||
'newproj.toggleAnimationsHint':
|
||
'Add motion (entrance, hover, transitions) on top of the template.',
|
||
'newproj.templateLabel': 'Template',
|
||
'newproj.noTemplatesTitle': 'No templates yet',
|
||
'newproj.noTemplatesBody':
|
||
'Open any project, then use the Share menu inside the file viewer to convert it into a template. Templates show up here.',
|
||
'newproj.savedTemplate': 'Saved template',
|
||
'newproj.fileSingular': 'file',
|
||
'newproj.filePlural': 'files',
|
||
'newproj.create': 'Create',
|
||
'newproj.createFromTemplate': 'Create from template',
|
||
'newproj.createDisabledTitle':
|
||
'Save a project as a template first (Share menu inside any project).',
|
||
'newproj.importClaudeZip': 'Import Claude Design ZIP',
|
||
'newproj.importClaudeZipTitle': 'Import a Claude Design .zip export',
|
||
'newproj.importingClaudeZip': 'Importing…',
|
||
'newproj.privacyFooter': 'Only you can see your project by default.',
|
||
'newproj.designSystem': 'Design system',
|
||
'newproj.dsNoneFreeform': 'None — freeform',
|
||
'newproj.dsNoneSubtitleEmpty': 'No system tokens, choose your own palette',
|
||
'newproj.dsNoneSubtitleSelected': 'Skip system tokens. The agent picks its own palette.',
|
||
'newproj.dsCategoryFallback': 'Design system',
|
||
'newproj.dsSearch': 'Search design systems…',
|
||
'newproj.dsModeAria': 'Selection mode',
|
||
'newproj.dsModeSingle': 'Single',
|
||
'newproj.dsModeMulti': 'Multi',
|
||
'newproj.dsNoneTitle': 'None — freeform',
|
||
'newproj.dsNoneSub': 'Skip system tokens. The agent picks its own palette.',
|
||
'newproj.dsEmpty': 'No design systems match “{query}”.',
|
||
'newproj.dsFootSingular': 'is inspiration only.',
|
||
'newproj.dsFootPlural': 'are inspiration only.',
|
||
'newproj.dsFootClear': 'Clear',
|
||
'newproj.dsBadgeDefault': 'DEFAULT',
|
||
'newproj.dsPrimaryFallback': 'Primary',
|
||
|
||
'designs.subRecent': 'Recent',
|
||
'designs.subYours': 'Your designs',
|
||
'designs.filterAria': 'Filter projects',
|
||
'designs.searchPlaceholder': 'Search…',
|
||
'designs.emptyNoProjects': 'No projects yet. Create one on the left.',
|
||
'designs.emptyNoMatch': 'No projects match your search.',
|
||
'designs.deleteTitle': 'Delete project',
|
||
'designs.deleteConfirm': 'Delete "{name}"?',
|
||
'designs.cardFreeform': 'freeform',
|
||
'designs.status.notStarted': 'Not started',
|
||
'designs.status.queued': 'Queued',
|
||
'designs.status.running': 'Running',
|
||
'designs.status.awaitingInput': 'Needs input',
|
||
'designs.status.succeeded': 'Completed',
|
||
'designs.status.failed': 'Failed',
|
||
'designs.status.canceled': 'Canceled',
|
||
'designs.viewToggleAria': 'View mode',
|
||
'designs.viewGrid': 'Grid view',
|
||
'designs.viewKanban': 'Board view',
|
||
'designs.kanbanEmptyColumn': 'No designs',
|
||
'designs.deleteAria': 'Delete project {name}',
|
||
|
||
'examples.typeLabel': 'Type',
|
||
'examples.scenarioLabel': 'Scenario',
|
||
'examples.modeAll': 'All',
|
||
'examples.modePrototypeDesktop': 'Prototypes · Desktop',
|
||
'examples.modePrototypeMobile': 'Prototypes · Mobile',
|
||
'examples.modeDeck': 'Slides',
|
||
'examples.modeDocument': 'Docs & templates',
|
||
'examples.scenarioGeneral': 'General',
|
||
'examples.scenarioEngineering': 'Engineering',
|
||
'examples.scenarioProduct': 'Product',
|
||
'examples.scenarioDesign': 'Design',
|
||
'examples.scenarioMarketing': 'Marketing',
|
||
'examples.scenarioSales': 'Sales',
|
||
'examples.scenarioFinance': 'Finance',
|
||
'examples.scenarioHr': 'HR',
|
||
'examples.scenarioOperations': 'Operations',
|
||
'examples.scenarioSupport': 'Support',
|
||
'examples.scenarioLegal': 'Legal',
|
||
'examples.scenarioEducation': 'Education',
|
||
'examples.scenarioPersonal': 'Personal',
|
||
'examples.emptyNoSkills': 'No skills available. Is the daemon running?',
|
||
'examples.emptyNoMatch': 'No examples match these filters.',
|
||
'examples.openPreview': '⤢ Open preview',
|
||
'examples.loadingPreview': 'Loading preview…',
|
||
'examples.hoverPreview': 'Hover to preview',
|
||
'examples.usePrompt': 'Use this prompt',
|
||
'examples.previewModalTitle': 'Open full preview (modal)',
|
||
'examples.shareTitle': 'Share this example',
|
||
'examples.shareLoadFirst': 'Hover to load preview first',
|
||
'examples.shareMenu': 'Share ▾',
|
||
'examples.exportPdfAllSlides': 'Export as PDF (all slides)',
|
||
'examples.exportPptxLocked': 'Export as PPTX… (open template first)',
|
||
'examples.tagSlideDeck': 'Slide deck',
|
||
'examples.tagTemplate': 'Template',
|
||
'examples.tagDesignSystem': 'Design system',
|
||
'examples.tagMobilePrototype': 'Mobile prototype',
|
||
'examples.tagDesktopPrototype': 'Desktop prototype',
|
||
'examples.previewLabel': 'Preview',
|
||
|
||
'ds.searchPlaceholder': 'Search design systems…',
|
||
'ds.emptyNoMatch': 'No design systems match your search.',
|
||
'ds.badgeDefault': 'DEFAULT',
|
||
'ds.preview': 'Preview',
|
||
'ds.previewTitle': 'Preview design system',
|
||
'ds.categoryAll': 'All',
|
||
'ds.categoryUncategorized': 'Uncategorized',
|
||
'ds.showcase': 'Showcase',
|
||
'ds.tokens': 'Tokens',
|
||
|
||
'avatar.title': 'Account & settings',
|
||
'avatar.localCli': 'Local CLI',
|
||
'avatar.anthropicApi': 'Anthropic API',
|
||
'avatar.useLocal': 'Use Local CLI',
|
||
'avatar.useApi': 'Use Anthropic API',
|
||
'avatar.codeAgent': 'Code agent',
|
||
'avatar.rescan': 'Rescan PATH',
|
||
'avatar.settings': 'Settings',
|
||
'avatar.backToProjects': 'Back to projects',
|
||
'avatar.metaActive': 'active',
|
||
'avatar.metaOffline': 'offline',
|
||
'avatar.metaSelected': 'selected',
|
||
'avatar.noAgentSelected': 'no agent selected',
|
||
'avatar.modelSection': 'Model',
|
||
'avatar.modelLabel': 'Model',
|
||
'avatar.reasoningLabel': 'Reasoning',
|
||
'avatar.customSuffix': '(custom)',
|
||
|
||
'project.backToProjects': 'Back to projects',
|
||
'project.metaFreeform': 'freeform',
|
||
'chat.tabChat': 'Chat',
|
||
'chat.tabComments': 'Comments',
|
||
'chat.commentsSoon': 'Comments — coming soon',
|
||
'chat.conversationsTitle': 'Conversations',
|
||
'chat.conversationsAria': 'Conversation history',
|
||
'chat.newConversation': 'New conversation',
|
||
'chat.newConversationsTitle': 'New conversation',
|
||
'chat.conversationsHeading': 'Conversations',
|
||
'chat.new': 'New',
|
||
'chat.emptyConversations': 'No conversations yet.',
|
||
'chat.deleteConversation': 'Delete conversation',
|
||
'chat.deleteConversationConfirm':
|
||
'Delete "{title}"? This removes its messages.',
|
||
'chat.untitledConversation': 'Untitled conversation',
|
||
'chat.startTitle': 'Start a conversation',
|
||
'chat.startHint':
|
||
'Drop or paste images for visual reference, or type @ to attach a file from this project. Or try one of these starters:',
|
||
'chat.fillInputTitle': 'Click to fill the input',
|
||
'chat.jumpToLatest': 'Jump to latest',
|
||
'chat.scrollToLatest': 'Scroll to latest',
|
||
'chat.you': 'You',
|
||
'chat.openFile': 'Open {name}',
|
||
'chat.composerPlaceholder':
|
||
'Describe the design you want — paste or drop images, or @ a file…',
|
||
'chat.composerHint':
|
||
'⌘/Ctrl + Enter to send · paste images · @ to reference files',
|
||
'chat.cliSettingsTitle': 'CLI & model settings',
|
||
'chat.cliSettingsAria': 'Open CLI and model settings',
|
||
'chat.attachTitle': 'Attach files (or paste / drop)',
|
||
'chat.attachAria': 'Attach files',
|
||
'chat.importTitle': 'Import sources (coming soon)',
|
||
'chat.importLabel': 'Import',
|
||
'chat.importComingSoon': 'Coming soon',
|
||
'chat.importSoon': 'Soon',
|
||
'chat.importFig': 'Upload .fig file',
|
||
'chat.importGitHub': 'Connect GitHub',
|
||
'chat.importWeb': 'Grab web element',
|
||
'chat.importFolder': 'Link code folder',
|
||
'chat.importSkills': 'Skills and design systems',
|
||
'chat.importProject': 'Reference another project',
|
||
'chat.send': 'Send',
|
||
'chat.stop': 'Stop',
|
||
'chat.removeAria': 'Remove {name}',
|
||
'chat.example1Title': 'Editorial pitch deck',
|
||
'chat.example1Tag': 'Magazine',
|
||
'chat.example1Prompt':
|
||
'A 10-slide editorial pitch deck for a design studio raising a seed round — Swiss-grid layout, oversized serif headlines with bold drop caps, monospace section numbers, generous negative space, and full-bleed photo slides interleaved with text-heavy ones. Cover, vision, market, product, traction, team, ask, contact.',
|
||
'chat.example2Title': 'SaaS analytics dashboard',
|
||
'chat.example2Tag': 'Data',
|
||
'chat.example2Prompt':
|
||
'A dense analytics dashboard for a developer-tools SaaS — KPI strip with week-over-week deltas, two stacked line charts (MRR and active workspaces), a world heatmap of usage, a cohort retention grid, a top-customers leaderboard, and a real-time event feed. Dark theme, tabular monospace numerals, sparkline accents.',
|
||
'chat.example3Title': 'Annual report long-scroll',
|
||
'chat.example3Tag': 'Editorial',
|
||
'chat.example3Prompt':
|
||
'An interactive annual report for a climate non-profit — long-scroll editorial layout mixing big pull-quote blocks, data visualizations (stacked bars, animated counters, a choropleth map of project sites), photography breakers, donor wall, and a final call-to-action. Modern serif body, sans-serif chart labels, earthy paper palette.',
|
||
|
||
'preview.shareMenu': 'Share ▾',
|
||
'preview.openInNewTab': 'Open in new tab',
|
||
'preview.exit': '⤓ Exit',
|
||
'preview.fullscreen': '⤢ Fullscreen',
|
||
'preview.closeTitle': 'Close (Esc)',
|
||
'preview.loading': 'Loading {label}…',
|
||
|
||
'misc.savedTemplate': 'Saved template',
|
||
'misc.primary': 'Primary',
|
||
'misc.designSystem': 'Design system',
|
||
|
||
'workspace.designFiles': 'Design Files',
|
||
'workspace.closeTab': 'Close tab',
|
||
'workspace.deleteFileConfirm': 'Delete "{name}" from the project folder?',
|
||
'workspace.openFromDesignFiles': 'Open a file from',
|
||
'workspace.designFilesLink': 'Design Files',
|
||
'workspace.loadingSketch': 'Loading sketch…',
|
||
'designFiles.title': 'Design Files',
|
||
'designFiles.upload': 'Upload files',
|
||
'designFiles.pasteText': 'Paste as text file',
|
||
'designFiles.newSketch': 'New sketch',
|
||
'designFiles.empty':
|
||
'Nothing here yet. Drop files below, or create a sketch / paste text.',
|
||
'designFiles.refresh': 'Refresh',
|
||
'designFiles.delete': 'Delete',
|
||
'designFiles.searchPlaceholder': 'Search files…',
|
||
'designFiles.up': 'Up',
|
||
'designFiles.back': 'Back',
|
||
'designFiles.crumbs': 'project',
|
||
'designFiles.rowMenu': 'Row menu',
|
||
'designFiles.openInTab': 'Open in tab',
|
||
'designFiles.download': 'Download',
|
||
'designFiles.dropTitle': '⤓ Drop files here',
|
||
'designFiles.dropDesc':
|
||
'Images, docs, references, Figma links, or folders — Claude will use them as context.',
|
||
'designFiles.upload.title': 'Upload files',
|
||
'designFiles.paste.title': 'Paste text as a file',
|
||
'designFiles.upload.label': 'Upload',
|
||
'designFiles.paste.label': 'Paste',
|
||
'designFiles.previewOpen': 'Open',
|
||
'designFiles.previewClose': 'Close preview',
|
||
'designFiles.modified': 'Modified {time} · {size}',
|
||
'designFiles.weeksAgo': '{n}w ago',
|
||
'designFiles.sectionPages': 'Pages',
|
||
'designFiles.sectionScripts': 'Scripts',
|
||
'designFiles.sectionImages': 'Images',
|
||
'designFiles.sectionSketches': 'Sketches',
|
||
'designFiles.sectionOther': 'Other',
|
||
'designFiles.kindHtml': 'HTML page',
|
||
'designFiles.kindImage': 'Image',
|
||
'designFiles.kindSketch': 'Sketch',
|
||
'designFiles.kindText': 'Text',
|
||
'designFiles.kindCode': 'Script',
|
||
'designFiles.kindPdf': 'PDF',
|
||
'designFiles.kindDocument': 'Document',
|
||
'designFiles.kindPresentation': 'Presentation',
|
||
'designFiles.kindSpreadsheet': 'Spreadsheet',
|
||
'designFiles.kindBinary': 'Binary',
|
||
'pasteDialog.title': 'Paste text',
|
||
'pasteDialog.hint': 'Saved into the project folder. Pick any name.',
|
||
'pasteDialog.fileNameLabel': 'File name',
|
||
'pasteDialog.namePlaceholder': 'notes.txt',
|
||
'pasteDialog.contentLabel': 'Content',
|
||
'pasteDialog.contentPlaceholder': 'Paste anything…',
|
||
'pasteDialog.save': 'Save',
|
||
'pasteDialog.cancel': 'Cancel',
|
||
'sketch.save': 'Save sketch',
|
||
'sketch.cancel': 'Cancel',
|
||
'sketch.saving': 'Saving…',
|
||
'sketch.tooltipDirty': 'Unsaved changes',
|
||
'sketch.tooltipClean': 'Saved',
|
||
'fileViewer.empty': 'Select a file to view.',
|
||
'fileViewer.loading': 'Loading…',
|
||
'fileViewer.exportPptx': 'Export as PPTX',
|
||
'fileViewer.openInNewTab': 'Open in new tab',
|
||
'fileViewer.copyPath': 'Copy path',
|
||
'fileViewer.copied': 'Copied!',
|
||
'fileViewer.share': 'Share',
|
||
'fileViewer.binaryMeta': 'Binary · {size}',
|
||
'fileViewer.binaryNote':
|
||
'Binary file ({size} bytes). Download or open from disk to inspect.',
|
||
'fileViewer.pdfMeta': 'PDF · {size}',
|
||
'fileViewer.documentMeta': 'Document',
|
||
'fileViewer.presentationMeta': 'Presentation',
|
||
'fileViewer.spreadsheetMeta': 'Spreadsheet',
|
||
'fileViewer.previewUnavailable': 'Preview unavailable. Download or open the file to inspect.',
|
||
'fileViewer.download': 'Download',
|
||
'fileViewer.open': 'Open',
|
||
'fileViewer.imageMeta': 'Image · {size}',
|
||
'fileViewer.sketchMeta': 'Sketch · {size}',
|
||
'fileViewer.markdownStreamingMeta': 'Streaming preview…',
|
||
'fileViewer.markdownErrorMeta': 'Preview may be incomplete (generation error).',
|
||
'fileViewer.markdownStreamingStatus': 'Streaming… showing partial markdown.',
|
||
'fileViewer.markdownErrorStatus': 'Generation error. Showing last available content.',
|
||
'fileViewer.reload': 'Reload',
|
||
'fileViewer.reloadDisk': 'Reload from disk',
|
||
'fileViewer.copy': 'Copy',
|
||
'fileViewer.copyTitle': 'Copy file contents',
|
||
'fileViewer.saveDisabled': 'Save (read-only viewer)',
|
||
'fileViewer.save': 'Save',
|
||
'fileViewer.preview': 'Preview',
|
||
'fileViewer.source': 'Source',
|
||
'fileViewer.tweaks': 'Tweaks',
|
||
'fileViewer.comment': 'Comment',
|
||
'fileViewer.edit': 'Edit',
|
||
'fileViewer.draw': 'Draw',
|
||
'fileViewer.zoomOut': 'Zoom out',
|
||
'fileViewer.zoomIn': 'Zoom in',
|
||
'fileViewer.resetZoom': 'Reset zoom',
|
||
'fileViewer.reloadAria': 'Reload',
|
||
'fileViewer.previousSlide': 'Previous slide',
|
||
'fileViewer.nextSlide': 'Next slide',
|
||
'fileViewer.slideNavAria': 'Slide navigation',
|
||
'fileViewer.present': 'Present',
|
||
'fileViewer.presentInTab': 'In this tab',
|
||
'fileViewer.presentFullscreen': 'Fullscreen',
|
||
'fileViewer.presentNewTab': 'New tab',
|
||
'fileViewer.exitPresentation': 'Exit presentation',
|
||
'fileViewer.shareLabel': 'Share',
|
||
'fileViewer.exportPdf': 'Export as PDF',
|
||
'fileViewer.exportPdfAllSlides': 'Export as PDF (all slides)',
|
||
'fileViewer.exportPptxBusy': 'Wait for the current turn to finish.',
|
||
'fileViewer.exportPptxHint':
|
||
'Send a request to the agent to convert this design to PPTX.',
|
||
'fileViewer.exportPptxNa': 'PPTX export is not available here.',
|
||
'fileViewer.exportZip': 'Download as .zip',
|
||
'fileViewer.exportHtml': 'Export as standalone HTML',
|
||
'fileViewer.saveAsTemplate': 'Save as template…',
|
||
'fileViewer.savingTemplate': 'Saving template…',
|
||
'fileViewer.savedTemplate': 'Saved as "{name}"',
|
||
'fileViewer.savedTemplateFail': 'Could not save template — try again.',
|
||
'fileViewer.templateNamePrompt': 'Template name',
|
||
'fileViewer.templateNameDefault': 'Untitled template',
|
||
'fileViewer.templateDescPrompt':
|
||
'Short description (optional — what makes this template useful?)',
|
||
|
||
'questionForm.submit': 'Submit',
|
||
'questionForm.skip': 'Skip',
|
||
'questionForm.locked': 'Answered',
|
||
|
||
'conv.switch': 'Switch conversation',
|
||
'conv.label': 'Conversation',
|
||
'conv.heading': 'Conversations',
|
||
'conv.new': '+ New',
|
||
'conv.empty': 'No conversations yet.',
|
||
'conv.untitled': 'Untitled conversation',
|
||
'conv.renameTooltip': 'Double-click to rename',
|
||
'conv.delete': 'Delete conversation',
|
||
'conv.deleteConfirm': 'Delete "{title}"? This removes its messages.',
|
||
|
||
'agentPicker.label': 'Agent',
|
||
'agentPicker.modeChoose': 'Choose execution mode',
|
||
'agentPicker.localCli': 'Local CLI',
|
||
'agentPicker.daemonOff': 'daemon off',
|
||
'agentPicker.byok': 'Anthropic API · BYOK',
|
||
'agentPicker.selectAgent': 'Select a detected code-agent CLI',
|
||
'agentPicker.noAgents': 'no agents on PATH',
|
||
'agentPicker.notInstalled': 'not installed',
|
||
'agentPicker.rescan': 'Re-scan local PATH for agents',
|
||
|
||
'tool.openInTab': 'Open {name} in a tab',
|
||
'tool.open': 'open',
|
||
'tool.todos': 'Todos',
|
||
'tool.write': 'Write',
|
||
'tool.edit': 'Edit',
|
||
'tool.read': 'Read',
|
||
'tool.bash': 'Bash',
|
||
'tool.glob': 'Glob',
|
||
'tool.grep': 'Grep',
|
||
'tool.fetch': 'Fetch',
|
||
'tool.search': 'Search',
|
||
'tool.lines': '{n} lines',
|
||
'tool.changeSingular': 'change',
|
||
'tool.changePlural': 'changes',
|
||
'tool.in': 'in {path}',
|
||
'tool.hide': 'hide',
|
||
'tool.output': 'output',
|
||
'tool.running': 'running…',
|
||
'tool.error': 'error',
|
||
'tool.done': 'done',
|
||
|
||
'assistant.role': 'Assistant',
|
||
'assistant.workingLabel': 'Working',
|
||
'assistant.doneLabel': 'Done',
|
||
'assistant.unfinishedLabel': 'Stopped with unfinished work',
|
||
'assistant.unfinishedSummary': '{n} task(s) remain',
|
||
'assistant.unfinishedMore': '+{n} more',
|
||
'assistant.continueRemaining': 'Continue remaining tasks',
|
||
'assistant.outTokens': '{n} out',
|
||
'assistant.producedFiles': 'Files from this turn',
|
||
'assistant.openFile': 'Open',
|
||
'assistant.downloadFile': 'Download',
|
||
'assistant.thinking': 'Thinking',
|
||
'assistant.systemReminder': 'System reminder',
|
||
'assistant.waitingFirstOutput': 'Waiting for first output',
|
||
'assistant.statusBootingAgent': 'Booting agent',
|
||
'assistant.statusStarting': 'Starting',
|
||
'assistant.statusRequesting': 'Sending request',
|
||
'assistant.statusThinking': 'Thinking',
|
||
'assistant.statusStreaming': 'Streaming',
|
||
'assistant.slowHint':
|
||
'Taking longer than usual. The form usually shows in 5–10s — you can Stop and rephrase.',
|
||
'assistant.verbEditing': 'Editing',
|
||
'assistant.verbWriting': 'Writing',
|
||
'assistant.verbReading': 'Reading',
|
||
'assistant.verbSearching': 'Searching',
|
||
'assistant.verbRunning': 'Running',
|
||
'assistant.verbTodos': 'Todos',
|
||
'assistant.verbFetching': 'Fetching',
|
||
'assistant.verbCalling': 'Calling',
|
||
|
||
'qf.answered': 'answered',
|
||
'qf.choose': 'Choose…',
|
||
'qf.required': 'required',
|
||
'qf.lockedSubmitted':
|
||
'Answers sent — agent is using these for the rest of the session.',
|
||
'qf.lockedPrev': 'This form is from a previous turn.',
|
||
'qf.hint':
|
||
"Pick what fits. Skip optional fields you don't care about — the agent will use sensible defaults.",
|
||
'qf.submitDefault': 'Send answers',
|
||
'qf.submitDisabledTitle': 'Fill in the required fields first',
|
||
'qf.submitTitle': 'Send answers',
|
||
'qf.cardSelected': 'selected',
|
||
'qf.cardRefs': 'Refs:',
|
||
'qf.cardSampleText': 'The quick brown fox · 0123',
|
||
|
||
'sketch.toolSelect': 'Select (no-op)',
|
||
'sketch.toolPen': 'Pen',
|
||
'sketch.toolText': 'Text',
|
||
'sketch.toolRect': 'Rectangle',
|
||
'sketch.toolArrow': 'Arrow',
|
||
'sketch.toolEraser': 'Eraser',
|
||
'sketch.color': 'Color',
|
||
'sketch.strokeSize': 'Stroke size',
|
||
'sketch.undo': 'Undo',
|
||
'sketch.clear': 'Clear',
|
||
'sketch.close': 'Close',
|
||
'sketch.textPrompt': 'Text:',
|
||
};
|