const en = {
  // ── Common ──
  'common.rename': 'Rename',
  'common.duplicate': 'Duplicate',
  'common.delete': 'Delete',
  'common.cancel': 'Cancel',
  'common.save': 'Save',
  'common.close': 'Close',
  'common.connect': 'Connect',
  'common.disconnect': 'Disconnect',
  'common.yes': 'Yes',
  'common.no': 'No',
  'common.import': 'Import',
  'common.export': 'Export',
  'common.name': 'Name',
  'common.untitled': 'Untitled',
  'common.best': 'Best',
  'common.selected': '{{count}} selected',

  // ── Toolbar ──
  'toolbar.select': 'Select',
  'toolbar.text': 'Text',
  'toolbar.frame': 'Frame',
  'toolbar.hand': 'Hand',
  'toolbar.undo': 'Undo',
  'toolbar.redo': 'Redo',
  'toolbar.variables': 'Variables',
  'toolbar.uikitBrowser': 'UIKit Browser',

  // ── Shapes ──
  'shapes.rectangle': 'Rectangle',
  'shapes.ellipse': 'Ellipse',
  'shapes.polygon': 'Polygon',
  'shapes.line': 'Line',
  'shapes.icon': 'Icon',
  'shapes.importImageSvg': 'Import Image or SVG\u2026',
  'shapes.pen': 'Pen',
  'shapes.shapeTools': 'Shape tools',
  'shapes.moreShapeTools': 'More shape tools',

  // ── Top Bar ──
  'topbar.hideLayers': 'Hide layers',
  'topbar.showLayers': 'Show layers',
  'topbar.new': 'New',
  'topbar.open': 'Open',
  'topbar.save': 'Save',
  'topbar.importFigma': 'Import Figma',
  'topbar.codePanel': 'Code',
  'topbar.lightMode': 'Light mode',
  'topbar.darkMode': 'Dark mode',
  'topbar.fullscreen': 'Fullscreen',
  'topbar.exitFullscreen': 'Exit fullscreen',
  'topbar.edited': '— Edited',
  'topbar.closeConfirmMessage': 'Do you want to save changes before closing?',
  'topbar.closeConfirmDetail': "Your changes will be lost if you don't save them.",
  'topbar.dontSave': "Don't Save",
  'topbar.agentsAndMcp': 'Agents & MCP',
  'topbar.setupAgentsMcp': 'Setup Agents & MCP',
  'topbar.connected': 'connected',
  'topbar.agentStatus': '{{agents}} agent{{agentSuffix}} · {{mcp}} MCP',

  // ── Git Panel ──
  'git.openPanel': 'Open Git panel',
  'git.closePanel': 'Close Git panel',
  'git.title': 'Git · {{fileName}}',
  'git.titleNoFile': 'Git · (No file selected)',
  'git.close': 'Close',
  'git.initializing': 'Initializing repository…',
  'git.conflict.title': 'Merge conflict',
  'git.conflict.description': 'Resolve each conflict using the cards below, then apply the merge.',
  'git.conflict.abort': 'Abort merge',
  'git.conflict.nonOp.title': 'Merge paused on non-.op files',
  'git.conflict.nonOp.description':
    'The .op merge finished, but other files in this repo are still unresolved. Fix them outside OpenPencil, then continue.',
  'git.conflict.nonOp.unresolvedHeading_one': '1 file needs attention',
  'git.conflict.nonOp.unresolvedHeading_other': '{{count}} files need attention',
  'git.conflict.nonOp.continue': 'Continue merge',
  'git.conflict.nonOp.abort': 'Abort merge',

  // ── Git Conflict Banner (Phase 7b) ──
  'git.conflict.banner.progress': 'Resolved {{resolved}} / {{total}}',
  'git.conflict.banner.apply': 'Apply merge',
  'git.conflict.banner.continue': 'Continue',
  'git.conflict.banner.finalizeError': 'Could not apply: {{message}}',
  'git.conflict.banner.pollError': 'Status polling paused due to an error: {{message}}',
  // I2: shown when the panel is reopened mid-merge and in-memory state was lost.
  'git.conflict.banner.reopenMessage':
    'Panel reopened mid-merge — in-memory conflict state was lost. Please abort and re-pull.',

  // ── Git Conflict List (Phase 7c) ──
  'git.conflict.list.heading': 'All conflicts',
  'git.conflict.list.progress': '{{resolved}} / {{total}} resolved',
  'git.conflict.list.allResolved': 'All resolved',
  'git.conflict.list.allOurs': 'All mine',
  'git.conflict.list.allTheirs': 'All theirs',

  // ── Git Conflict Item (Phase 7c) ──
  'git.conflict.item.nodeConflict': 'Node conflict',
  'git.conflict.item.fieldConflict': 'Field conflict',
  'git.conflict.item.resolved': 'Resolved',

  // ── Git Conflict Card (Phase 7c) ──
  'git.conflict.card.ours': 'Mine',
  'git.conflict.card.theirs': 'Theirs',
  'git.conflict.card.base': 'Base',
  'git.conflict.card.keepMine': 'Keep mine',
  'git.conflict.card.keepTheirs': 'Keep theirs',
  'git.conflict.card.oursThumbnailAlt': 'Our version',
  'git.conflict.card.theirsThumbnailAlt': 'Their version',

  // ── Git Conflict JSON Editor (Phase 7c) ──
  'git.conflict.editor.editManually': 'Edit manually',
  'git.conflict.editor.cancel': 'Cancel',
  'git.conflict.editor.apply': 'Apply',
  'git.conflict.editor.invalidJson': 'Invalid JSON',
  'git.conflict.editor.textareaLabel': 'Edit JSON value',

  // ── Git Tracked-File Picker Back (Phase 7b) ──
  'git.picker.back': 'Back',
  'git.picker.backClose': 'Cancel',
  'git.error.dismiss': 'Dismiss',
  'git.error.retry': 'Retry',
  'git.error.title': 'Something went wrong',

  // ── Git Empty State ──
  'git.empty.heading': 'No version history yet',
  'git.empty.optional': 'Git is optional — skipping is fine',
  'git.empty.requireSavedFile': 'Save the .op file first to enable history',
  'git.empty.newCard': 'Init',
  'git.empty.newCardDescription': 'Create local history',
  'git.empty.openCard': 'Open',
  'git.empty.openCardDescription': 'Existing repo',
  'git.empty.cloneCard': 'Clone',
  'git.empty.cloneCardDescription': 'From a remote',

  // ── Git Author Form ──
  'git.author.heading': 'Your commit author',
  'git.author.subheading': 'Saving the first commit needs a name and email',
  'git.author.nameLabel': 'Name',
  'git.author.namePlaceholder': 'Your name',
  'git.author.emailLabel': 'Email',
  'git.author.emailPlaceholder': 'you@example.com',
  'git.author.submit': 'Save',
  'git.author.cancel': 'Cancel',
  'git.author.validationName': 'Name is required',
  'git.author.validationEmail': 'A valid email is required',

  // ── Git Picker (Phase 4b) ──
  'git.picker.heading': '{{count}} .op files in this repo:',
  'git.picker.milestoneCount': '{{count}} milestones',
  'git.picker.noHistory': 'No history',
  'git.picker.lastCommit': '{{message}} · {{time}}',
  'git.picker.bindButton': 'Track this file',
  'git.picker.bindAndOpenButton': 'Track and open',
  'git.picker.empty.heading': 'No .op files in this repo',
  'git.picker.empty.body': 'The Git panel needs at least one .op file to work.',
  'git.picker.empty.close': 'Close panel',

  // ── Git Auto-Bind Banner (Phase 4b) ──
  'git.autoBind.confirmHeading': 'Found {{fileName}} — open it?',
  'git.autoBind.openButton': 'Open',
  'git.autoBind.dismissButton': 'Skip',

  // ── Git Relative Time (Phase 4b — also used by Phase 4c history list) ──
  'git.relativeTime.justNow': 'just now',
  'git.relativeTime.minutesAgo': '{{count}}m ago',
  'git.relativeTime.hoursAgo': '{{count}}h ago',
  'git.relativeTime.daysAgo': '{{count}}d ago',

  // ── Git Commit Input (Phase 4c) ──
  'git.commit.placeholder': 'Describe this change…',
  'git.commit.submitButton': 'Save milestone',
  'git.commit.saveRequiredTitle': 'Save the document first',
  'git.commit.saveRequiredBody':
    'You have unsaved changes. Save the document to continue: {{label}}',
  'git.commit.saveRequiredSave': 'Save',
  'git.commit.saveRequiredCancel': 'Cancel',

  // ── Git Header (Phase 4c → 6c) ──
  'git.header.autosaveError': 'Autosave error',
  'git.header.autosaveErrorTitle': 'Last autosave failed',
  'git.header.authorMissingWarning': 'Set your commit author to record attribution',
  'git.header.overflowSwitchTracked': 'Switch tracked file…',
  'git.header.overflowClearAuthor': 'Clear commit author',
  'git.header.overflowCloseRepo': 'Close repository',
  'git.header.overflowRemoteSettings': 'Remote settings…',
  'git.header.overflowSshKeys': 'SSH keys…',
  'git.header.overflowMoreActions': 'More actions',

  // ── Git History List (Phase 4c) ──
  'git.history.empty': 'No history yet',
  'git.history.autosaveGroup_one': '1 autosave',
  'git.history.autosaveGroup_other': '{{count}} autosaves',
  'git.history.autosaveLabel': 'auto {{time}}',
  'git.history.milestoneDetailTitle': 'Milestone details',
  'git.history.restoreButton': 'Restore',
  'git.history.copyHashButton': 'Copy hash',
  'git.history.copiedToast': 'Copied',
  // ── Git History Diff (Phase 7b) ──
  'git.history.diff.loading': 'Loading diff…',
  'git.history.diff.initialCommit': 'Initial commit — no parent to diff against',
  'git.history.diff.noChanges': 'No changes detected',
  'git.history.diff.error': 'Diff unavailable: {{message}}',
  'git.history.diff.framesChanged_one': '1 frame changed',
  'git.history.diff.framesChanged_other': '{{count}} frames changed',
  'git.history.diff.nodesAdded_one': '1 node added',
  'git.history.diff.nodesAdded_other': '{{count}} nodes added',
  'git.history.diff.nodesRemoved_one': '1 node removed',
  'git.history.diff.nodesRemoved_other': '{{count}} nodes removed',
  'git.history.diff.nodesModified_one': '1 node modified',
  'git.history.diff.nodesModified_other': '{{count}} nodes modified',
  'git.history.promoteButton': 'Promote to milestone',
  'git.history.promoteSuccessToast': 'Promoted to milestone',
  'git.history.loadMore': 'Load more',
  'git.autosave.messagePrefix': 'auto',
  'git.autosave.messageDiffSuffix': '',

  // ── Git Branch Picker (Phase 5) ──
  'git.branch.listHeading': 'Branches',
  'git.branch.createAction': 'New branch',
  'git.branch.createPlaceholder': 'feature/login-redesign',
  'git.branch.createSubmit': 'Create branch',
  'git.branch.createEmpty': 'Enter a branch name',
  'git.branch.createExists': 'Branch {{name}} already exists',
  'git.branch.mergeAction': 'Merge branch…',
  'git.branch.mergeHeading': 'Merge into {{name}}',
  'git.branch.deletePrompt': 'Delete branch {{name}}?',
  'git.branch.deleteLabel': 'Delete branch {{name}}',
  'git.branch.deleteWarning': 'Branch {{name}} has unmerged commits',
  'git.branch.deleteConfirm': 'Delete',
  'git.branch.deleteForce': 'Force delete',
  'git.branch.cancel': 'Cancel',
  'git.branch.conflictDisabled': 'Finish the merge before switching branches',
  'git.branch.noCommits': 'No commits yet',

  // ── Git Clone Wizard (Phase 6a) ──
  'git.wizard.clone.heading': 'Clone a remote repository',
  'git.wizard.clone.subheading': 'Pick a remote URL and a destination folder.',
  'git.wizard.clone.urlLabel': 'Remote URL',
  'git.wizard.clone.urlPlaceholder': 'https://github.com/owner/repo.git',
  'git.wizard.clone.destLabel': 'Destination folder',
  'git.wizard.clone.destPlaceholder': '/path/to/clone',
  'git.wizard.clone.destPickButton': 'Browse…',
  'git.wizard.clone.usernameLabel': 'Username (optional)',
  'git.wizard.clone.tokenLabel': 'Access token (optional)',
  'git.wizard.clone.tokenPlaceholder': 'ghp_… or leave blank for public',
  'git.wizard.clone.anonymousHint': 'Leave blank to clone anonymously (public repos only).',
  'git.wizard.clone.sshHint': 'SSH key authentication is required for this URL.',
  'git.wizard.clone.hostDetected': 'Detected: {{host}} · {{mode}}',
  'git.wizard.clone.authMode.token-or-anon': 'token or anonymous',
  'git.wizard.clone.authMode.ssh': 'SSH key',
  'git.wizard.clone.cancel': 'Cancel',
  'git.wizard.clone.submit': 'Clone',
  'git.wizard.clone.validationUrl': 'Remote URL is required',
  'git.wizard.clone.validationDest': 'Destination folder is required',
  'git.wizard.clone.validationTokenUsername': 'Username is required when a token is provided',
  'git.wizard.clone.error.clone-network':
    'Network error while cloning. Check your connection and try again.',
  'git.wizard.clone.error.network': 'Network error. Check your connection and try again.',
  'git.wizard.clone.error.timeout': 'Clone timed out. Try again or use a smaller repository.',
  'git.wizard.clone.error.auth-required': 'Authentication is required for this repository.',
  'git.wizard.clone.error.auth-failed': 'Authentication failed. Check your username and token.',
  'git.wizard.clone.error.auth-token-invalid':
    'The access token was rejected. Generate a new one and try again.',
  'git.wizard.clone.error.clone-failed':
    'Clone failed. Verify the URL points at a real repository.',
  'git.wizard.clone.error.clone-target-exists':
    'The destination folder already exists or is not empty.',

  // ── Git Pull / Push (Phase 6b) ──
  'git.pull.label': 'Pull',
  'git.pull.tooltip': 'Pull from origin',
  'git.pull.noRemote': 'No remote configured — add one in Git settings',
  'git.pull.retry': 'Retry pull',
  'git.push.label': 'Push',
  'git.push.tooltip_one': 'Push 1 commit to origin',
  'git.push.tooltip_other': 'Push {{count}} commits to origin',
  'git.push.noRemote': 'No remote configured — add one in Git settings',
  'git.push.upToDate': 'Nothing to push — you are up to date',
  'git.push.retry': 'Retry push',
  'git.push.rejectedBody':
    'The remote has commits you do not have yet. Pull first, then push again.',
  'git.push.rejectedDismiss': 'Dismiss',
  'git.push.rejectedPull': 'Pull now',
  'git.remote.dismissError': 'Dismiss',

  // ── Git Remote Settings (Phase 6c) ──
  'git.remote.settingsLabel': 'Remote settings',
  'git.remote.settingsHeading': 'Remote',
  'git.remote.back': 'Back',
  'git.remote.cancel': 'Cancel',
  'git.remote.emptyNoOrigin': 'No remote configured yet. Add one:',
  'git.remote.urlLabel': 'Origin URL',
  'git.remote.urlPlaceholder': 'https://github.com/owner/repo.git',
  'git.remote.saveButton': 'Save',
  'git.remote.clearButton': 'Clear',
  'git.remote.clearConfirmHeading': 'Clear origin?',
  'git.remote.clearConfirmBody': 'This will remove the origin remote from this repository.',
  'git.remote.clearConfirmAction': 'Confirm',
  'git.remote.aheadBehind': '{{ahead}} ahead · {{behind}} behind',
  'git.remote.fetchButton': 'Fetch',
  'git.remote.sshIsoUnsupported':
    'SSH transport is not supported on the built-in engine. Install system git or switch to an HTTPS remote URL.',
  'git.remote.storedAuthLabel': 'Stored credentials',
  'git.remote.storedAuth.token': 'Token',
  'git.remote.storedAuth.ssh': 'SSH key',
  'git.remote.storedAuth.none': 'None',
  'git.remote.storedAuth.loading': 'Loading…',
  'git.remote.storedAuth.noHost': 'No host detected',
  'git.remote.clearAuthButton': 'Clear saved auth',

  // ── Git SSH Keys (Phase 6c) ──
  'git.ssh.label': 'SSH keys',
  'git.ssh.heading': 'SSH keys',
  'git.ssh.back': 'Back',
  'git.ssh.cancel': 'Cancel',
  'git.ssh.isoUnsupported':
    'The current remote uses SSH but the built-in engine cannot perform SSH transport. Install system git or switch the remote URL to HTTPS.',
  'git.ssh.emptyList': 'No SSH keys yet.',
  'git.ssh.generateAction': 'Generate new',
  'git.ssh.importAction': 'Import existing',
  'git.ssh.copyPublicKey': 'Copy public key',
  'git.ssh.copiedHint': 'Copied',
  'git.ssh.copyUnsupported': 'Clipboard not available — copy this key manually.',
  'git.ssh.deleteKey': 'Delete {{name}}',
  'git.ssh.deletePrompt': 'Delete SSH key {{name}}?',
  'git.ssh.deleteConfirm': 'Delete',
  'git.ssh.currentHostBadge': 'current host',
  'git.ssh.hostLabel': 'Host',
  'git.ssh.hostPlaceholder': 'github.com',
  'git.ssh.commentLabel': 'Comment',
  'git.ssh.commentPlaceholder': 'laptop@home',
  'git.ssh.generateSubmit': 'Generate',
  'git.ssh.importPathLabel': 'Private key path',
  'git.ssh.importPathPlaceholder': '/path/to/id_ed25519',
  'git.ssh.importBrowse': 'Browse…',
  'git.ssh.importSubmit': 'Import',
  'git.ssh.validationHost': 'Host is required',
  'git.ssh.validationComment': 'Comment is required',
  'git.ssh.validationImportPath': 'Pick a private key file to import',
  'git.ssh.providerLink': 'Open {{host}} SSH key settings',
  'git.ssh.genericGuidance':
    'Copy the public key and add it to your Git provider’s SSH key settings.',

  // ── Git Auth form (Phase 6b) ──
  'git.auth.formLabel': 'Git credentials',
  'git.auth.heading': 'Authenticate with {{host}}',
  'git.auth.headingUnknown': 'Authenticate with this remote',
  'git.auth.modeToggleLabel': 'Credential type',
  'git.auth.modeToken': 'Token',
  'git.auth.modeSsh': 'SSH',
  'git.auth.usernameLabel': 'Username (optional)',
  'git.auth.tokenLabel': 'Access token',
  'git.auth.tokenPlaceholder': 'ghp_… or PAT',
  'git.auth.sshKeyLabel': 'SSH key',
  'git.auth.sshNoKeys': 'No SSH keys available. Import or generate one in Git settings first.',
  'git.auth.rememberLabel': 'Remember this credential for this host',
  'git.auth.rememberHint': 'Remember this credential for this host',
  'git.auth.cancel': 'Cancel',
  'git.auth.validationToken': 'Access token is required',
  'git.auth.validationSshKey': 'Select an SSH key',
  'git.auth.error.auth-required': 'Authentication is required for this remote.',
  'git.auth.error.auth-failed': 'Authentication failed. Check your credentials and try again.',
  'git.auth.error.auth-token-invalid':
    'The access token was rejected. Generate a new one and try again.',

  // ── Right Panel ──
  'rightPanel.design': 'Design',
  'rightPanel.code': 'Code',
  'rightPanel.noSelection': 'Select an element',

  // ── Pages ──
  'pages.title': 'Pages',
  'pages.addPage': 'Add page',
  'pages.moveUp': 'Move Up',
  'pages.moveDown': 'Move Down',

  // ── Status Bar ──
  'statusbar.zoomOut': 'Zoom out',
  'statusbar.zoomIn': 'Zoom in',
  'statusbar.resetZoom': 'Reset zoom',
  'statusbar.focusContent': 'Fit all content',
  'statusbar.focusSelection': 'Focus selection',

  // ── Updater ──
  'updater.softwareUpdate': 'Software Update',
  'updater.dismiss': 'Dismiss',
  'updater.current': 'Current',
  'updater.latest': 'Latest',
  'updater.unknown': 'Unknown',
  'updater.checking': 'Checking...',
  'updater.downloadProgress': 'Download Progress',
  'updater.checkAgain': 'Check Again',
  'updater.restartInstall': 'Restart & Install',
  'updater.installing': 'Installing...',
  'updater.releaseDate': 'Release date: {{date}}',
  'updater.restartHint': 'Restart to apply update. Relaunch usually takes 10-15 seconds.',
  'updater.unknownError': 'Unknown updater error.',
  'updater.title.checking': 'Checking for updates',
  'updater.title.available': 'Update found',
  'updater.title.downloading': 'Downloading update',
  'updater.title.downloaded': 'Ready to install',
  'updater.title.error': 'Update failed',
  'updater.subtitle.checking': 'Looking for the latest release...',
  'updater.subtitle.available': 'Version {{version}} is available.',
  'updater.subtitle.availableGeneric': 'A new version is available.',
  'updater.subtitle.downloading': 'Version {{version}} is downloading in the background.',
  'updater.subtitle.downloadingGeneric': 'Downloading update package in the background.',
  'updater.subtitle.downloaded': 'Version {{version}} has been downloaded.',
  'updater.subtitle.downloadedGeneric': 'The update has been downloaded.',
  'updater.subtitle.error': 'Unable to check or download the update.',

  // ── Layers ──
  'layers.title': 'Layers',
  'layers.empty': 'No layers yet. Use the toolbar to draw shapes.',

  // ── Layer Context Menu ──
  'layerMenu.groupSelection': 'Group Selection',
  'layerMenu.createComponent': 'Create Component',
  'layerMenu.detachComponent': 'Detach Component',
  'layerMenu.detachInstance': 'Detach Instance',
  'layerMenu.booleanUnion': 'Union',
  'layerMenu.booleanSubtract': 'Subtract',
  'layerMenu.booleanIntersect': 'Intersect',
  'layerMenu.toggleLock': 'Toggle Lock',
  'layerMenu.toggleVisibility': 'Toggle Visibility',

  // ── Property Panel ──
  'property.createComponent': 'Create Component',
  'property.detachComponent': 'Detach Component',
  'property.goToComponent': 'Go to component',
  'property.detachInstance': 'Detach instance',

  // ── Fill ──
  'fill.title': 'Fill',
  'fill.solid': 'Solid',
  'fill.linear': 'Linear',
  'fill.radial': 'Radial',
  'fill.image': 'Image',
  'fill.stops': 'Stops',
  'fill.angle': 'Angle',

  // ── Image ──
  'image.title': 'Image',
  'image.fit': 'Fit Mode',
  'image.fill': 'Fill',
  'image.fitMode': 'Fit',
  'image.crop': 'Crop',
  'image.tile': 'Tile',
  'image.clickToUpload': 'Click to upload',
  'image.changeImage': 'Change image',
  'image.adjustments': 'Adjustments',
  'image.exposure': 'Exposure',
  'image.contrast': 'Contrast',
  'image.saturation': 'Saturation',
  'image.temperature': 'Temperature',
  'image.tint': 'Tint',
  'image.highlights': 'Highlights',
  'image.shadows': 'Shadows',
  'image.reset': 'Reset',

  // ── Stroke ──
  'stroke.title': 'Stroke',

  // ── Appearance ──
  'appearance.layer': 'Layer',
  'appearance.opacity': 'Opacity',

  // ── Layout ──
  'layout.flexLayout': 'Flex Layout',
  'layout.freedom': 'Freedom (no layout)',
  'layout.vertical': 'Vertical layout',
  'layout.horizontal': 'Horizontal layout',
  'layout.alignment': 'Alignment',
  'layout.gap': 'Gap',
  'layout.spaceBetween': 'Space Between',
  'layout.spaceAround': 'Space Around',
  'layout.dimensions': 'Dimensions',
  'layout.fillWidth': 'Fill Width',
  'layout.fillHeight': 'Fill Height',
  'layout.hugWidth': 'Hug Width',
  'layout.hugHeight': 'Hug Height',
  'layout.clipContent': 'Clip Content',

  // ── Padding ──
  'padding.title': 'Padding',
  'padding.paddingMode': 'Padding mode',
  'padding.paddingValues': 'Padding Values',
  'padding.oneValue': 'One value for all sides',
  'padding.horizontalVertical': 'Horizontal/Vertical',
  'padding.topRightBottomLeft': 'Top/Right/Bottom/Left',

  // ── Typography ──
  'text.typography': 'Typography',
  'text.lineHeight': 'Line height',
  'text.letterSpacing': 'Letter spacing',
  'text.horizontal': 'Horizontal',
  'text.vertical': 'Vertical',
  'text.alignLeft': 'Align left',
  'text.alignCenter': 'Align center',
  'text.alignRight': 'Align right',
  'text.justify': 'Justify',
  'text.top': 'Top',
  'text.middle': 'Middle',
  'text.bottom': 'Bottom',
  'text.weight.thin': 'Thin',
  'text.weight.light': 'Light',
  'text.weight.regular': 'Regular',
  'text.weight.medium': 'Medium',
  'text.weight.semibold': 'Semibold',
  'text.weight.bold': 'Bold',
  'text.weight.black': 'Black',
  'text.font.search': 'Search fonts…',
  'text.font.bundled': 'Bundled',
  'text.font.system': 'System',
  'text.font.loading': 'Loading fonts…',
  'text.font.noResults': 'No fonts found',

  // ── Text Layout ──
  'textLayout.title': 'Layout',
  'textLayout.dimensions': 'Dimensions',
  'textLayout.resizing': 'Resizing',
  'textLayout.autoWidth': 'Auto W',
  'textLayout.autoWidthDesc': 'Auto Width \u2014 text expands horizontally',
  'textLayout.autoHeight': 'Auto H',
  'textLayout.autoHeightDesc': 'Auto Height \u2014 fixed width, height auto-sizes',
  'textLayout.fixed': 'Fixed',
  'textLayout.fixedDesc': 'Fixed Size \u2014 both width and height are fixed',
  'textLayout.fillWidth': 'Fill Width',
  'textLayout.fillHeight': 'Fill Height',

  // ── Effects ──
  'effects.title': 'Effects',
  'effects.dropShadow': 'Drop shadow',
  'effects.blur': 'Blur',
  'effects.spread': 'Spread',
  'effects.color': 'Color',

  // ── Export ──
  'export.title': 'Export',
  'export.format': 'Format',
  'export.scale': 'Scale',
  'export.selectedOnly': 'Export selected only',
  'export.exportFormat': 'Export {{format}}',
  'export.exportLayer': 'Export layer',
  'export.pdfMultiPage': 'PDF will include all {{count}} pages.',

  // ── Polygon ──
  'polygon.sides': 'Sides',

  // ── Ellipse ──
  'ellipse.start': 'Start',
  'ellipse.sweep': 'Sweep',
  'ellipse.innerRadius': 'Inner',

  // ── Corner Radius ──
  'cornerRadius.title': 'Corner Radius',

  // ── Size / Position ──
  'size.position': 'Position',

  // ── Icon ──
  'icon.title': 'Icon',
  'icon.searchIcons': 'Search icons...',
  'icon.noIconsFound': 'No icons found',
  'icon.typeToSearch': 'Type to search Iconify icons',
  'icon.iconsCount': '{{count}} icons',

  // ── Variables Panel ──
  'variables.addTheme': 'Add theme',
  'variables.addVariant': 'Add variant',
  'variables.addVariable': 'Add variable',
  'variables.searchVariables': 'Search variables...',
  'variables.noMatch': 'No variables match your search',
  'variables.noDefined': 'No variables defined',
  'variables.closeShortcut': 'Close (\u2318\u21e7V)',
  'variables.presets': 'Presets',
  'variables.savePreset': 'Save Current as Preset\u2026',
  'variables.loadPreset': 'Load Preset',
  'variables.importPreset': 'Import from File\u2026',
  'variables.exportPreset': 'Export to File\u2026',
  'variables.presetName': 'Preset name',
  'variables.noPresets': 'No saved presets',

  // ── Design System (design.md) ──
  'designMd.title': 'Design System',
  'designMd.import': 'Import design.md',
  'designMd.export': 'Export design.md',
  'designMd.autoGenerate': 'Auto-generate from design',
  'designMd.empty': 'No design system loaded',
  'designMd.importCta': 'Import design.md',
  'designMd.autoGenerateCta': 'Auto-generate',
  'designMd.visualTheme': 'Visual Theme',
  'designMd.colors': 'Colors',
  'designMd.typography': 'Typography',
  'designMd.font': 'Font',
  'designMd.headings': 'Headings',
  'designMd.body': 'Body',
  'designMd.componentStyles': 'Component Styles',
  'designMd.layoutPrinciples': 'Layout Principles',
  'designMd.generationNotes': 'Generation Notes',
  'designMd.syncAllToVariables': 'Sync all to variables',
  'designMd.addAsVariable': '+Var',
  'designMd.copyHex': 'Copy hex',
  'designMd.remove': 'Remove design system',
  'toolbar.designSystem': 'Design System',

  // ── AI Chat ──
  'ai.newChat': 'New chat',
  'ai.collapse': 'Collapse',
  'ai.tryExample': 'Try an example to design...',
  'ai.tipSelectElements': 'Tip: Select elements on canvas before chatting for context.',
  'ai.generating': 'Generating...',
  'ai.designWithAgent': 'Design with Agent...',
  'ai.attachImage': 'Attach image',
  'ai.stopGenerating': 'Stop generating',
  'ai.sendMessage': 'Send message',
  'ai.loadingModels': 'Loading models...',
  'ai.noModelsConnected': 'No models connected',
  'ai.searchModels': 'Search models...',
  'ai.noModelsFound': 'No models found',
  'ai.quickAction.loginScreen': 'Design a mobile login screen',
  'ai.quickAction.loginScreenPrompt':
    'Design a modern mobile login screen with email input, password input, login button, and social login options',
  'ai.quickAction.foodApp': 'Food app homepage',
  'ai.quickAction.foodAppPrompt': 'Generate a well-designed food mobile app homepage',
  'ai.quickAction.bottomNav': 'Design a bottom navigation bar',
  'ai.quickAction.bottomNavPrompt':
    'Design a mobile app bottom navigation bar with 5 tabs: Home, Search, Add, Messages, Profile',
  'ai.quickAction.colorPalette': 'Suggest a color palette for my app',
  'ai.quickAction.colorPalettePrompt': 'Suggest a modern color palette for a pet care app',
  'ai.startDesigning': 'Start designing with AI',
  'ai.maximize': 'Maximize',
  'ai.restore': 'Restore',
  'ai.quickAction.loginScreenDesc': 'Mobile login with social auth',
  'ai.quickAction.foodAppDesc': 'App homepage design',
  'ai.quickAction.bottomNavDesc': '5-tab navigation bar',
  'ai.quickAction.colorPaletteDesc': 'Color palette recommendation',

  // ── File Menu ──
  'fileMenu.newFile': 'New file',
  'fileMenu.openFile': 'Open file...',
  'fileMenu.save': 'Save',
  'fileMenu.saveAs': 'Save as...',
  'fileMenu.exportImage': 'Export image...',
  'fileMenu.recentFiles': 'Recent files',
  'fileMenu.clearHistory': 'Clear history',
  'fileMenu.noRecentFiles': 'No recent files',
  'fileMenu.saved': 'Saved',
  'fileMenu.justNow': 'just now',
  'fileMenu.minutesAgo': '{{count}}m ago',
  'fileMenu.hoursAgo': '{{count}}h ago',
  'fileMenu.yesterday': 'yesterday',
  'fileMenu.daysAgo': '{{count}}d ago',

  // ── Unsaved Changes ──
  'unsaved.title': 'Unsaved changes',
  'unsaved.message': 'Save changes to "{{name}}"?',
  'unsaved.dontSave': "Don't Save",

  // ── Code Panel ──
  'code.reactTailwind': 'React + Tailwind',
  'code.htmlCss': 'HTML + CSS',
  'code.cssVariables': 'CSS Variables',
  'code.copyClipboard': 'Copy to clipboard',
  'code.copied': 'Copied!',
  'code.download': 'Download code file',
  'code.closeCodePanel': 'Close code panel',
  'code.genCssVars': 'Generating CSS variables for entire document',
  'code.genSelected': 'Generating code for {{count}} selected element(s)',
  'code.genDocument': 'Generating code for entire document',
  'code.aiEnhance': 'AI Enhance',
  'code.cancelEnhance': 'Cancel enhancement',
  'code.resetEnhance': 'Reset to original',
  'code.enhancing': 'AI is enhancing code...',
  'code.enhanced': 'Enhanced by AI',

  // ── Save Dialog ──
  'save.saveAs': 'Save As',
  'save.fileName': 'File name',

  // ── Agent Settings ──
  'agents.title': 'Setup Agents & MCP',
  'agents.agentsOnCanvas': 'Agents on Canvas',
  'agents.mcpIntegrations': 'MCP Integrations in Terminal',
  'agents.transport': 'Transport',
  'agents.port': 'Port',
  'agents.mcpRestart': 'MCP integrations will take effect after restarting the terminal.',
  'agents.mcpReinstallHint':
    'After upgrading OpenPencil, please reinstall MCP integrations to ensure compatibility.',
  'agents.modelCount': '{{count}} model(s)',
  'agents.connectionFailed': 'Connection failed',
  'agents.serverError': 'Server error {{status}}',
  'agents.failedTo': 'Failed to {{action}}',
  'agents.failedToMcp': 'Failed to {{action}} MCP server',
  'agents.failedTransport': 'Failed to update transport',
  'agents.failedMcpTransport': 'Failed to update MCP transport',
  'agents.claudeCode': 'Claude Code',
  'agents.claudeModels': 'Claude models',
  'agents.codexCli': 'Codex CLI',
  'agents.openaiModels': 'OpenAI models',
  'agents.opencode': 'OpenCode',
  'agents.opencodeDesc': '75+ LLM providers',
  'agents.copilot': 'GitHub Copilot',
  'agents.copilotDesc': 'GitHub Copilot models',
  'agents.geminiCli': 'Gemini CLI',
  'agents.geminiDesc': 'Google Gemini models',
  'agents.mcpServer': 'MCP Server',
  'agents.mcpServerStart': 'Start',
  'agents.mcpServerStop': 'Stop',
  'agents.mcpServerRunning': 'Running',
  'agents.mcpServerStopped': 'Stopped',
  'agents.mcpLanAccess': 'LAN Access',
  'agents.mcpClientConfig': 'Client Config',
  'agents.stdio': 'stdio',
  'agents.http': 'http',
  'agents.stdioHttp': 'stdio + http',
  'agents.autoUpdate': 'Auto-check for updates',
  'agents.notInstalled': 'Not installed',
  'agents.install': 'Install',
  'agents.installing': 'Installing...',
  'agents.installFailed': 'Installation failed',
  'agents.viewDocs': 'Docs',
  'settings.title': 'Settings',
  'settings.agents': 'Agents',
  'settings.mcp': 'MCP',
  'settings.images': 'Images',
  'settings.system': 'System',
  'settings.autoUpdateDesc': 'Automatically check for new versions on startup',
  'settings.systemDesktopOnly': 'System settings are available in the desktop app.',
  'settings.envHint': 'You can set additional environment variables in {{path}}.',

  // ── Builtin Providers ──
  'builtin.title': 'Built-in Providers',
  'builtin.description': 'Configure API keys directly — no CLI tools required.',
  'builtin.addProvider': 'Add Provider',
  'builtin.empty': 'No built-in providers configured yet.',
  'builtin.displayName': 'Display Name',
  'builtin.displayNamePlaceholder': 'e.g. My Anthropic Key',
  'builtin.provider': 'Provider',
  'builtin.region': 'Region',
  'builtin.regionChina': 'China',
  'builtin.regionGlobal': 'Global',
  'builtin.apiKey': 'API Key',
  'builtin.model': 'Model',
  'builtin.searchModels': 'Search available models',
  'builtin.filterModels': 'Filter models...',
  'builtin.noModels': 'No models found',
  'builtin.baseUrl': 'Base URL',
  'builtin.baseUrlRequired': 'Base URL (required)',
  'builtin.apiFormat': 'API Format',
  'builtin.openaiCompat': 'OpenAI Compatible',
  'builtin.ready': 'Ready',
  'builtin.add': 'Add',
  'builtin.searchError': 'Base URL is required to search models',
  'builtin.custom': 'Custom',
  'builtin.apiKeyBadge': 'API Key',
  'builtin.viaApiKey': 'via {{name}} API Key',
  'builtin.errorProviderNotFound': 'Built-in provider not found. Please check your settings.',
  'builtin.errorApiKeyEmpty': 'API key is empty. Please add your API key in settings.',
  'builtin.parallelAgents': 'Parallel sub-agents: {{count}}x (click to cycle)',
  'builtin.baseUrlPlaceholder': 'https://api.example.com/v1',
  'builtin.teamDescription':
    'Select a model for design generation. When set, design tasks are automatically delegated to a specialist agent using this model.',
  'builtin.teamDesignModel': 'Design Model',
  'builtin.teamSelectModel': 'None (single agent)',

  // ── ACP Agents ──
  'acp.title': 'ACP Agents',
  'acp.description': 'Connect external ACP-compatible agents.',
  'acp.addAgent': 'Add Agent',
  'acp.empty': 'No ACP agents configured yet.',
  'acp.displayName': 'Display Name',
  'acp.displayNamePlaceholder': 'e.g. My Design Agent',
  'acp.connectionType': 'Connection Type',
  'acp.local': 'Local',
  'acp.remote': 'Remote',
  'acp.command': 'Command',
  'acp.commandPlaceholder': '/usr/bin/myagent',
  'acp.args': 'Arguments',
  'acp.argsPlaceholder': '--stdio',
  'acp.env': 'Environment Variables',
  'acp.envPlaceholder': 'KEY=VALUE (one per line)',
  'acp.url': 'URL',
  'acp.urlPlaceholder': 'ws://localhost:8100',
  'acp.connected': 'Connected',
  'acp.notConnected': 'Not connected',
  'acp.connect': 'Connect',
  'acp.disconnect': 'Disconnect',
  'acp.localDesktopOnly': 'Local agents are only available in the desktop app.',

  // ── Figma Import ──
  'figma.title': 'Import from Figma',
  'figma.dropFile': 'Drop a .fig file here',
  'figma.orBrowse': 'or click to browse',
  'figma.exportTip': 'Export from Figma: File \u2192 Save local copy (.fig)',
  'figma.selectFigFile': 'Please select a .fig file',
  'figma.noPages': 'No pages found in the .fig file',
  'figma.parseFailed': 'Failed to parse .fig file',
  'figma.convertFailed': 'Failed to convert Figma file',
  'figma.parsing': 'Parsing .fig file...',
  'figma.converting': 'Converting nodes...',
  'figma.selectPage': 'This file has {{count}} pages. Select which to import:',
  'figma.layers': '{{count}} layers',
  'figma.importAll': 'Import All Pages',
  'figma.importComplete': 'Import complete!',
  'figma.moreWarnings': '...and {{count}} more warnings',
  'figma.tryAgain': 'Try Again',
  'figma.layoutMode': 'Layout mode:',
  'figma.preserveLayout': 'Preserve Figma layout',
  'figma.autoLayout': 'OpenPencil auto layout',
  'figma.comingSoon': 'Coming soon',

  // ── Landing Page ──
  'landing.open': 'Open',
  'landing.pencil': 'Pencil',
  'landing.tagline': 'Open-source vector design tool. Design as Code.',
  'landing.newDesign': 'New Design',
  'landing.shortcutHint': 'Press {{key1}} + {{key2}} to create a new design',

  // ── 404 ──
  'notFound.message': 'Page not found',

  // ── Component Browser ──
  'componentBrowser.title': 'UIKit Browser',
  'componentBrowser.exportKit': 'Export kit',
  'componentBrowser.importKit': 'Import kit',
  'componentBrowser.kit': 'Kit:',
  'componentBrowser.all': 'All',
  'componentBrowser.imported': '(imported)',
  'componentBrowser.components': 'components',
  'componentBrowser.searchComponents': 'Search components...',
  'componentBrowser.deleteKit': 'Delete {{name}}',
  'componentBrowser.category.all': 'All',
  'componentBrowser.category.buttons': 'Buttons',
  'componentBrowser.category.inputs': 'Inputs',
  'componentBrowser.category.cards': 'Cards',
  'componentBrowser.category.nav': 'Nav',
  'componentBrowser.category.layout': 'Layout',
  'componentBrowser.category.feedback': 'Feedback',
  'componentBrowser.category.data': 'Data',
  'componentBrowser.category.other': 'Other',

  // ── Variable Picker ──
  'variablePicker.boundTo': 'Bound to --{{name}}',
  'variablePicker.bindToVariable': 'Bind to variable',
  'variablePicker.unbind': 'Unbind variable',
  'variablePicker.noVariables': 'No {{type}} variables defined',
} as const;

export default en;
export type TranslationKeys = { [K in keyof typeof en]: string };
