Files
open-design/src/i18n/locales/en.ts
T
pftom bbeb868040 feat(models): fetch live model lists from CLIs, allow custom ids
Each agent definition now declares an optional `listModels` spec; the
daemon runs the CLI's own list-models command (e.g. `opencode models`,
`cursor-agent models`) during agent detection and uses the result as
the dropdown options. Hardcoded entries shrink to a `fallbackModels`
hint that only kicks in when the CLI has no listing command (Claude,
Codex, Gemini, Qwen) or when the listing fails (e.g. unauth'd
cursor-agent).

UI groups `provider/model` ids by provider via <optgroup> so opencode's
~175 live models stay navigable, and the Settings dialog gains a
"Custom…" entry that opens a free-text input for any model id the
listing didn't surface yet. Daemon validates picks against the live
cache + fallback, with a permissive sanitizer for custom ids.
2026-04-29 00:32:03 +08:00

506 lines
21 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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, or Qwen, 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 CLIs 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.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',
'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 image',
'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 an image',
'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.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.download': 'Download',
'fileViewer.open': 'Open',
'fileViewer.imageMeta': 'Image · {size}',
'fileViewer.sketchMeta': 'Sketch · {size}',
'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': 'Claude',
'assistant.workingLabel': 'Working',
'assistant.doneLabel': 'Done',
'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 510s — 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:',
};