import type { TranslationMap } from './types';

const en: TranslationMap = {
  // Navigation
  'nav.home': 'Home',
  'nav.human': 'Human',
  'nav.chat': 'Chat',
  'nav.connections': 'Connections',
  'nav.memory': 'Intelligence',
  'nav.alerts': 'Alerts',
  'nav.rewards': 'Rewards',
  'nav.settings': 'Settings',

  // Common
  'common.cancel': 'Cancel',
  'common.save': 'Save',
  'common.confirm': 'Confirm',
  'common.delete': 'Delete',
  'common.edit': 'Edit',
  'common.create': 'Create',
  'common.search': 'Search',
  'common.loading': 'Loading…',
  'common.error': 'Error',
  'common.success': 'Success',
  'common.back': 'Back',
  'common.next': 'Next',
  'common.finish': 'Finish',
  'common.close': 'Close',
  'common.enabled': 'Enabled',
  'common.disabled': 'Disabled',
  'common.on': 'On',
  'common.off': 'Off',
  'common.yes': 'Yes',
  'common.no': 'No',
  'common.ok': 'Got it',
  'common.retry': 'Try again',
  'common.copy': 'Copy',
  'common.copied': 'Copied',
  'common.learnMore': 'Learn more',
  'common.seeAll': 'View',
  'common.dismiss': 'Dismiss',
  'common.clear': 'Clear',
  'common.reset': 'Reset',
  'common.refresh': 'Refresh',
  'common.export': 'Export',
  'common.import': 'Import',
  'common.upload': 'Upload',
  'common.download': 'Download',
  'common.add': 'Add',
  'common.remove': 'Remove',
  'common.showMore': 'Show more',
  'common.showLess': 'Show less',
  'common.submit': 'Submit',
  'common.continue': 'Continue',

  // Settings Home
  'settings.general': 'General',
  'settings.featuresAndAI': 'Features & AI',
  'settings.billingAndRewards': 'Billing & Rewards',
  'settings.support': 'Support',
  'settings.advanced': 'Advanced',
  'settings.dangerZone': 'Danger Zone',
  'settings.account': 'Account',
  'settings.accountDesc': 'Recovery phrase, team, connections, and privacy',
  'settings.notifications': 'Notifications',
  'settings.notificationsDesc': 'Do Not Disturb and per-account notification controls',
  'settings.features': 'Features',
  'settings.featuresDesc': 'Screen awareness, messaging, and tools',
  'settings.aiModels': 'AI & Models',
  'settings.aiModelsDesc': 'Local AI model setup, downloads, and LLM provider',
  'settings.ai': 'AI Configuration',
  'settings.aiDesc': 'Cloud providers, local Ollama models, and per-workload routing',
  'settings.billingUsage': 'Billing & Usage',
  'settings.billingUsageDesc': 'Subscription plan, credits, and payment methods',
  'settings.rewards': 'Rewards',
  'settings.rewardsDesc': 'Referrals, coupons, and earned credits',
  'settings.restartTour': 'Restart Tour',
  'settings.restartTourDesc': 'Replay the product walkthrough from the beginning',
  'settings.about': 'About',
  'settings.aboutDesc': 'App version and software updates',
  'settings.developerOptions': 'Advanced',
  'settings.developerOptionsDesc':
    'AI configuration, messaging channels, tools, diagnostics, and debug panels',
  'settings.clearAppData': 'Clear App Data',
  'settings.clearAppDataDesc': 'Sign out and permanently clear all local app data',
  'settings.logOut': 'Log out',
  'settings.logOutDesc': 'Sign out of your account',
  'settings.language': 'Language',
  'settings.languageDesc': 'Display language for the app interface',
  'settings.alerts': 'Alerts',
  'settings.alertsDesc': 'View recent alerts and activity in your inbox',

  // Settings: Account
  'settings.account.recoveryPhrase': 'Recovery Phrase',
  'settings.account.recoveryPhraseDesc': 'View and back up your account recovery phrase',
  'settings.account.team': 'Team',
  'settings.account.teamDesc': 'Manage team members and permissions',
  'settings.account.connections': 'Connections',
  'settings.account.connectionsDesc': 'Manage linked accounts and services',
  'settings.account.privacy': 'Privacy',
  'settings.account.privacyDesc': 'Control what data leaves your computer',
  'migration.title': 'Import from another assistant',
  'migration.description':
    'Migrate memory and notes from another local assistant into this workspace. Start with a Preview to see exactly what would change, then Apply to copy the data over. Your current memory is backed up first.',
  'migration.vendorLabel': 'Source vendor',
  'migration.sourceLabel': 'Source workspace path (optional)',
  'migration.sourcePlaceholder': 'Leave blank to auto-detect (e.g. ~/.openclaw/workspace)',
  'migration.sourceHint':
    "Defaults to the vendor's standard location when blank. Set an explicit path if you've moved the workspace elsewhere.",
  'migration.previewAction': 'Preview',
  'migration.previewRunning': 'Previewing…',
  'migration.applyAction': 'Apply import',
  'migration.applyRunning': 'Importing…',
  'migration.applyDisclaimer':
    'Apply is unlocked after a successful Preview of the same source. Existing memory is backed up before any import.',
  'migration.reportTitlePreview': 'Preview — nothing imported yet',
  'migration.reportTitleApplied': 'Import complete',
  'migration.report.source': 'Source workspace',
  'migration.report.target': 'Target workspace',
  'migration.report.fromSqlite': 'From SQLite (brain.db)',
  'migration.report.fromMarkdown': 'From Markdown',
  'migration.report.imported': 'Imported',
  'migration.report.skippedUnchanged': 'Skipped (unchanged)',
  'migration.report.renamedConflicts': 'Renamed on conflict',
  'migration.report.warnings': 'Warnings',
  'migration.report.previewHint':
    'No data has been imported yet. Click Apply import to copy it over.',
  'migration.report.appliedHint':
    'Imported entries are now in your memory. Re-run Preview if you want to compare again.',
  'migration.hermesComingSoonPrefix': 'Hermes importer is on the roadmap — see ',
  'migration.hermesComingSoonSuffix':
    ' for context. Pick OpenClaw to migrate today; Hermes lands in a follow-up.',
  'migration.hermesLinkText': '#1440',
  'migration.confirmImport.singular':
    'Import {count} entry into the current workspace?\n\nSource: {source}\nTarget: {target}\n\nExisting memory will be backed up before the import runs.',
  'migration.confirmImport.plural':
    'Import {count} entries into the current workspace?\n\nSource: {source}\nTarget: {target}\n\nExisting memory will be backed up before the import runs.',

  // Settings: Notifications
  'settings.notifications.doNotDisturb': 'Do Not Disturb',
  'settings.notifications.doNotDisturbDesc': 'Pause all notifications for a set period',
  'settings.notifications.channelControls': 'Per-Channel Controls',
  'settings.notifications.channelControlsDesc':
    'Configure notification preferences for each channel',

  // Settings: Features
  'settings.features.screenAwareness': 'Screen Awareness',
  'settings.features.screenAwarenessDesc': 'Let the assistant see your active window',
  'settings.features.messaging': 'Messaging',
  'settings.features.messagingDesc': 'Channel and messaging integration settings',
  'settings.features.tools': 'Tools',
  'settings.features.toolsDesc': 'Manage connected tools and integrations',

  // Settings: AI & Models
  'settings.ai.localSetup': 'Local AI Setup',
  'settings.ai.localSetupDesc': 'Download and configure local AI models',
  'settings.ai.llmProvider': 'LLM Provider',
  'settings.ai.llmProviderDesc': 'Choose and configure your AI provider',

  // Clear App Data modal
  'clearData.title': 'Clear App Data',
  'clearData.warning': 'This will sign you out and permanently delete local app data including:',
  'clearData.bulletSettings': 'App settings and conversations',
  'clearData.bulletCache': 'All local integration cache data',
  'clearData.bulletWorkspace': 'Workspace data',
  'clearData.bulletOther': 'All other local data',
  'clearData.irreversible': 'This action cannot be undone.',
  'clearData.clearing': 'Clearing App Data...',
  'clearData.failed': 'Failed to clear data and logout. Please try again.',
  'clearData.failedLogout': 'Failed to log out. Please try again.',
  'clearData.failedPersist': 'Failed to clear persisted app state. Please try again.',

  // Welcome page
  'welcome.title': 'Welcome to OpenHuman',
  'welcome.subtitle':
    'Your personal AI super intelligence. Private, simple and extremely powerful.',
  'welcome.connectPrompt': 'Configure RPC URL (Advanced)',
  'welcome.selectRuntime': 'Select a Runtime',
  'welcome.urlPlaceholder': 'http://localhost:8089',
  'welcome.invalidUrl': 'Please enter a valid HTTP or HTTPS URL',
  'welcome.connecting': 'Testing',
  'welcome.connect': 'Test',

  // Home page
  'home.greeting': 'Good morning',
  'home.greetingAfternoon': 'Good afternoon',
  'home.greetingEvening': 'Good evening',
  'home.askAssistant': 'Ask your assistant anything...',
  'home.statusOk':
    'Your device is connected. Keep the app running to keep the connection alive. Message your agent with the button below.',
  'home.statusBackendOnly': 'Reconnecting to backend… your agent will be available again shortly.',
  'home.statusCoreUnreachable':
    "The OpenHuman core isn't responding. The background process may have crashed or failed to start.",
  'home.statusInternetOffline':
    'Your device is offline right now. Check your network or restart the app to reconnect.',
  'home.restartCore': 'Restart Core',
  'home.restartingCore': 'Restarting core…',
  'home.themeToggle.toLight': 'Switch to light mode',
  'home.themeToggle.toDark': 'Switch to dark mode',

  // Chat / Conversations
  'chat.newThread': 'New thread',
  'chat.typeMessage': 'Type a message...',
  'chat.send': 'Send message',
  'chat.thinking': 'Thinking...',
  'chat.noMessages': 'No messages yet',
  'chat.startConversation': 'Start a conversation',
  'chat.regenerate': 'Regenerate',
  'chat.copyResponse': 'Copy response',
  'chat.citations': 'Citations',
  'chat.toolUsed': 'Tool used',

  // Skills / Connections
  'scope.legacy': 'Legacy',
  'scope.user': 'User',
  'scope.project': 'Project',
  'skills.title': 'Connections',
  'skills.search': 'Search connections...',
  'skills.noResults': 'No connections found',
  'skills.connect': 'Connect',
  'skills.disconnect': 'Disconnect',
  'skills.configure': 'Manage',
  'skills.connected': 'Connected',
  'skills.available': 'Available',
  'skills.addAccount': 'Add Account',
  'skills.channels': 'Channels',
  'skills.integrations': 'Integrations',

  // Intelligence / Memory
  'memory.title': 'Memory',
  'memory.search': 'Search memories...',
  'memory.noResults': 'No memories found',
  'memory.empty': 'No memories yet. Memories are created automatically as you interact.',
  'memory.tab.memory': 'Memory',
  'memory.tab.subconscious': 'Subconscious',
  'memory.tab.dreams': 'Dreams',
  'memory.tab.calls': 'Calls',
  'memory.tab.settings': 'Settings',
  'memory.analyzeNow': 'Analyze Now',

  // Notifications / Alerts
  'alerts.title': 'Alerts',
  'alerts.empty': 'No alerts yet',
  'alerts.markAllRead': 'Mark all as read',
  'alerts.unread': 'unread',

  // Rewards
  'rewards.title': 'Rewards',
  'rewards.referrals': 'Referrals',
  'rewards.coupons': 'Redeem',
  'rewards.credits': 'Credits',
  'rewards.referralCode': 'Your referral code',
  'rewards.copyCode': 'Copy code',
  'rewards.share': 'Share',

  // Onboarding
  'onboarding.welcome': "Hi. I'm OpenHuman.",
  'onboarding.welcomeDesc':
    'Your super-intelligent AI assistant that runs on your computer. Private, simple, and extremely powerful.',
  'onboarding.context': 'Context Gathering',
  'onboarding.contextDesc': 'Connect the tools and services you use every day.',
  'onboarding.localAI': 'Local AI',
  'onboarding.localAIDesc': 'Set up a local AI model that runs on your machine.',
  'onboarding.chatProvider': 'Chat Provider',
  'onboarding.chatProviderDesc': 'Choose how you want to interact with your assistant.',
  'onboarding.referral': 'Referral',
  'onboarding.referralDesc': 'Apply a referral code if you have one.',
  'onboarding.finish': 'Finish Setup',
  'onboarding.finishDesc': "You're all set! Start using OpenHuman.",
  'onboarding.skip': 'Skip',
  'onboarding.getStarted': 'Get Started',

  // Onboarding: runtime-choice step (Cloud vs Custom)
  'onboarding.runtimeChoice.title': 'How would you like to run OpenHuman?',
  'onboarding.runtimeChoice.subtitle':
    'Pick how much OpenHuman manages for you. You can change this later in Settings.',
  'onboarding.runtimeChoice.cloud.title': 'Simple',
  'onboarding.runtimeChoice.cloud.tagline':
    'Use OpenHuman-hosted sign-in, model routing, search, and managed integrations.',
  'onboarding.runtimeChoice.cloud.f1': 'Backend-brokered OAuth and model routing',
  'onboarding.runtimeChoice.cloud.f2': 'Token compression to stretch your usage further',
  'onboarding.runtimeChoice.cloud.f3': 'One subscription, every model included',
  'onboarding.runtimeChoice.cloud.f4': 'No model, search, or Composio keys to manage',
  'onboarding.runtimeChoice.cloud.f5': 'Local Memory Tree, managed network services',
  'onboarding.runtimeChoice.custom.title': 'Run Custom',
  'onboarding.runtimeChoice.custom.tagline':
    'Bring your own keys. Choose which services OpenHuman should call.',
  'onboarding.runtimeChoice.custom.f1': "You'll need API keys for almost everything",
  'onboarding.runtimeChoice.custom.f2': 'Reuses services you already pay for',
  'onboarding.runtimeChoice.custom.f3': 'Keep supported workloads on your machine',
  'onboarding.runtimeChoice.custom.f4': 'More setup, more knobs',
  'onboarding.runtimeChoice.custom.f5': 'Best for power users and developers',
  'onboarding.runtimeChoice.cloud.creditHighlight': '$1 free credit to try it out',
  'onboarding.runtimeChoice.continueCloud': 'Continue with Simple',
  'onboarding.runtimeChoice.continueCustom': 'Continue with Custom',
  'onboarding.runtimeChoice.recommended': 'Recommended',

  // Onboarding: API keys step (only when Custom is picked)
  'onboarding.apiKeys.title': "Let's Add Your API Keys",
  'onboarding.apiKeys.subtitle':
    'You can paste them now or skip and add them later in Settings › AI. Keys are stored on this device, encrypted at rest.',
  'onboarding.apiKeys.openaiLabel': 'OpenAI API key',
  'onboarding.apiKeys.openaiPlaceholder': 'sk-...',
  'onboarding.apiKeys.anthropicLabel': 'Anthropic API key',
  'onboarding.apiKeys.anthropicPlaceholder': 'sk-ant-...',
  'onboarding.apiKeys.saveError': "Couldn't save that key. Please double-check it and try again.",
  'onboarding.apiKeys.skipForNow': 'Skip for now',
  'onboarding.apiKeys.continue': 'Save and continue',
  'onboarding.apiKeys.saving': 'Saving…',

  // Onboarding: Custom wizard (Inference / Voice / OAuth / Search / Memory)
  'onboarding.custom.stepperInference': 'Inference',
  'onboarding.custom.stepperVoice': 'Voice',
  'onboarding.custom.stepperOAuth': 'OAuth',
  'onboarding.custom.stepperSearch': 'Search',
  'onboarding.custom.stepperMemory': 'Memory',
  'onboarding.custom.stepCounter': 'Step {n} of {total}',
  'onboarding.custom.defaultTitle': 'Default',
  'onboarding.custom.defaultSubtitle': 'Let OpenHuman manage it for you.',
  'onboarding.custom.configureTitle': 'Configure',
  'onboarding.custom.configureSubtitle': "I'll pick what to use.",
  'onboarding.custom.progressAriaLabel': 'Onboarding progress',
  'onboarding.custom.continue': 'Continue',
  'onboarding.custom.back': 'Back',
  'onboarding.custom.finish': 'Finish Setup',
  'onboarding.custom.configureLater':
    "You can finish wiring this up after onboarding. We'll drop you on the matching Settings page once you're done.",
  'onboarding.custom.openSettings': 'Open in Settings',

  // Onboarding: Custom > Inference (text)
  'onboarding.custom.inference.title': 'Inference (Text)',
  'onboarding.custom.inference.subtitle':
    'Which language model should answer your questions and run your agents?',
  'onboarding.custom.inference.defaultDesc':
    'OpenHuman routes workloads through its managed backend by default. No keys, no setup.',
  'onboarding.custom.inference.configureDesc':
    'Bring your own OpenAI or Anthropic key. We use it for every text-based workload.',

  // Onboarding: Custom > Voice
  'onboarding.custom.voice.title': 'Voice',
  'onboarding.custom.voice.subtitle': 'Speech-to-text and text-to-speech for voice mode.',
  'onboarding.custom.voice.defaultDesc':
    'OpenHuman ships with managed STT/TTS providers that may send audio/text to hosted services.',
  'onboarding.custom.voice.configureDesc':
    'Use your own ElevenLabs / OpenAI Whisper / etc. Configure in Settings › Voice.',

  // Onboarding: Custom > OAuth (Composio)
  'onboarding.custom.oauth.title': 'Connections (OAuth)',
  'onboarding.custom.oauth.subtitle':
    'Gmail, Slack, Notion, and other connected services that need OAuth.',
  'onboarding.custom.oauth.defaultDesc':
    'OpenHuman brokers OAuth and tool calls through a managed Composio workspace.',
  'onboarding.custom.oauth.configureDesc':
    'Bring your own Composio account / API key. Configure in Settings › Connections.',

  // Onboarding: Custom > Search
  'onboarding.custom.search.title': 'Web Search',
  'onboarding.custom.search.subtitle': 'How OpenHuman searches the web on your behalf.',
  'onboarding.custom.search.defaultDesc':
    'OpenHuman uses a managed search proxy by default. No search API key needed.',
  'onboarding.custom.search.configureDesc':
    'Bring your own search provider key (Tavily, Brave, etc.). Configure in Settings › Tools.',

  // Onboarding: Custom > Memory
  'onboarding.custom.memory.title': 'Memory',
  'onboarding.custom.memory.subtitle':
    'How OpenHuman remembers your context, preferences, and prior conversations.',
  'onboarding.custom.memory.defaultDesc':
    'OpenHuman manages memory storage and retrieval automatically. Nothing to set up.',
  'onboarding.custom.memory.configureDesc':
    'Inspect, export, or wipe memory yourself. Configure in Settings › Memory.',

  // Accounts
  'accounts.addAccount': 'Add Account',
  'accounts.manageAccounts': 'Manage Accounts',
  'accounts.noAccounts': 'No accounts connected',
  'accounts.connectAccount': 'Connect an account to get started',
  'accounts.agent': 'Agent',
  'accounts.respondQueue': 'Respond Queue',
  'accounts.disconnect': 'Disconnect',
  'accounts.disconnectConfirm': 'Are you sure you want to disconnect this account?',
  'accounts.searchAccounts': 'Search accounts...',

  // Channels
  'channels.title': 'Channels',
  'channels.configure': 'Configure Channel',
  'channels.setup': 'Setup',
  'channels.noChannels': 'No channels configured',
  'channels.addChannel': 'Add Channel',
  'channels.status.connected': 'Connected',
  'channels.status.disconnected': 'Disconnected',
  'channels.status.error': 'Error',
  'channels.status.configuring': 'Configuring',
  'channels.defaultMessaging': 'Default Messaging Channel',

  // Webhooks
  'webhooks.title': 'Webhooks',
  'webhooks.create': 'Create Webhook',
  'webhooks.noWebhooks': 'No webhooks configured',
  'webhooks.url': 'URL',
  'webhooks.secret': 'Secret',
  'webhooks.events': 'Events',
  'webhooks.archiveDirectory': 'Archive Directory',
  'webhooks.todayFile': "Today's File",

  // Invites
  'invites.title': 'Invites',
  'invites.create': 'Create Invite',
  'invites.noInvites': 'No pending invites',
  'invites.code': 'Invite Code',
  'invites.copyLink': 'Copy Link',

  // Developer Options
  'devOptions.title': 'Advanced',
  'devOptions.diagnostics': 'Diagnostics',
  'devOptions.diagnosticsDesc': 'System health, logs, and performance metrics',
  'devOptions.debugPanels': 'Debug Panels',
  'devOptions.debugPanelsDesc': 'Feature flags, state inspection, and debugging tools',
  'devOptions.webhooks': 'Webhooks',
  'devOptions.webhooksDesc': 'Configure and test webhook integrations',
  'devOptions.memoryInspection': 'Memory Inspection',
  'devOptions.memoryInspectionDesc': 'Browse, query, and manage memory entries',

  // Voice / Dictation
  'voice.pushToTalk': 'Push to Talk',
  'voice.recording': 'Recording...',
  'voice.processing': 'Processing...',
  'voice.languageHint': 'Language',

  // Misc
  'misc.rehydrating': 'Loading your data...',
  'misc.checkingServices': 'Checking services...',
  'misc.serviceUnavailable': 'Service Unavailable',
  'misc.somethingWentWrong': 'Something went wrong',
  'misc.tryAgainLater': 'Please try again later.',
  'misc.restartApp': 'Restart App',
  'misc.updateAvailable': 'Update Available',
  'misc.updateNow': 'Update Now',
  'misc.updateLater': 'Later',
  'misc.downloading': 'Downloading...',
  'misc.installing': 'Installing...',
  'misc.beta':
    'OpenHuman is in early beta. Feel free to share feedback or report any bugs you run into — every report helps us ship faster.',
  'misc.betaFeedback': 'Send feedback',

  // Mnemonic / Recovery
  'mnemonic.title': 'Recovery Phrase',
  'mnemonic.warning': 'Write down these words in order and store them somewhere safe.',
  'mnemonic.copyWarning':
    'Never share your recovery phrase. Anyone with these words can access your account.',
  'mnemonic.copied': 'Recovery phrase copied to clipboard',
  'mnemonic.reveal': 'Reveal phrase',
  'mnemonic.hidden': 'Recovery phrase is hidden',

  // What Leaves My Computer
  'privacy.title': 'Privacy & Security',
  'privacy.description': 'Transparency report of data sent to external services.',
  'privacy.empty': 'No external data transfers detected.',
  'privacy.whatLeavesComputer': 'What leaves your computer',
  'privacy.loading': 'Loading privacy details...',
  'privacy.loadError': 'Could not load the live privacy list. Analytics controls below still work.',
  'privacy.noCapabilities': 'No capabilities currently disclose data movement.',
  'privacy.sentTo': 'Sent to',
  'privacy.leavesDevice': 'Leaves device',
  'privacy.staysLocal': 'Stays local',
  'privacy.anonymizedAnalytics': 'Anonymized Analytics',
  'privacy.shareAnonymizedData': 'Share Anonymized Usage Data',
  'privacy.shareAnonymizedDataDesc':
    'Help improve OpenHuman by sharing anonymous crash reports and usage analytics. All data is fully anonymized — no personal data, messages, wallet keys, or session information is ever collected.',
  'privacy.meetingFollowUps': 'Meeting follow-ups',
  'privacy.autoHandoffMeet': 'Auto-handoff Google Meet transcripts to the orchestrator',
  'privacy.autoHandoffMeetDesc':
    "When a Google Meet call ends, OpenHuman's orchestrator can read the transcript and may take actions like drafting messages, scheduling follow-ups, or posting summaries to your connected Slack workspace. Off by default.",
  'privacy.analyticsDisclaimer':
    'All analytics and bug reports are fully anonymized. When enabled, we collect only crash information, device type, and the file location of errors. We never access your messages, session data, wallet keys, API keys, or any personally identifiable information. You can change this setting at any time.',

  // Settings: About
  'settings.about.version': 'Version',
  'settings.about.updateAvailable': 'is available',
  'settings.about.softwareUpdates': 'Software updates',
  'settings.about.lastChecked': 'Last checked',
  'settings.about.checking': 'Checking...',
  'settings.about.checkForUpdates': 'Check for updates',
  'settings.about.releases': 'Releases',
  'settings.about.releasesDesc': 'Browse release notes and earlier builds on GitHub.',
  'settings.about.openReleases': 'Open GitHub releases',

  // Settings: AI
  'settings.ai.overview': 'AI System Overview',
  'settings.ai.configStatus': 'Configuration Status',
  'settings.ai.fallbackMode': 'Fallback Mode',
  'settings.ai.loadedFromRuntime': 'Loaded from Runtime',
  'settings.ai.loadingDuration': 'Loading Duration',
  'settings.ai.localRuntime': 'Local Model Runtime',
  'settings.ai.openManager': 'Open Manager',
  'settings.ai.retryDownload': 'Retry Download',
  'settings.ai.state': 'State',
  'settings.ai.targetModel': 'Target Model',
  'settings.ai.download': 'Download',
  'settings.ai.localModelUnavailable': 'Local model status unavailable.',
  'settings.ai.soulConfig': 'SOUL Persona Configuration',
  'settings.ai.refreshing': 'Refreshing...',
  'settings.ai.refreshSoul': 'Refresh SOUL',
  'settings.ai.loadingSoul': 'Loading SOUL configuration...',
  'settings.ai.identity': 'Identity',
  'settings.ai.personality': 'Personality',
  'settings.ai.safetyRules': 'Safety Rules',
  'settings.ai.source': 'Source',
  'settings.ai.loaded': 'Loaded',
  'settings.ai.toolsConfig': 'TOOLS Configuration',
  'settings.ai.refreshTools': 'Refresh TOOLS',
  'settings.ai.toolsAvailable': 'Tools Available',
  'settings.ai.tools': 'tools',
  'settings.ai.activeSkills': 'Active Skills',
  'settings.ai.skills': 'skills',
  'settings.ai.skillsOverview': 'Skills Overview',
  'settings.ai.refreshingAll': 'Refreshing All...',
  'settings.ai.refreshAll': 'Refresh All AI Configuration',

  // Settings: Notifications
  'settings.notifications.suppressAll': 'Suppress all notifications',
  'settings.notifications.suppressAllDesc':
    'Block all OS notification toasts from embedded apps regardless of focus state.',
  'settings.notifications.toggleDnd': 'Toggle Do Not Disturb',
  'settings.notifications.categories': 'Categories',
  'settings.notifications.categoryFooter':
    'Disabling a category stops new notifications of that type from appearing in the notification center. Existing notifications remain until cleared.',

  // Settings: Billing
  'settings.billing.movedToWeb': 'Billing moved to the web',
  'settings.billing.openDashboard': 'Open billing dashboard',
  'settings.billing.movedToWebDesc':
    'Subscription changes, payment methods, credits, and invoices are now managed at TinyHumans on the web.',
  'settings.billing.backToSettings': 'Back to settings',
  'settings.billing.openingBrowser': 'Opening your browser...',
  'settings.billing.browserNotOpen': 'If your browser did not open, use the button above.',
  'settings.billing.browserOpenFailed':
    'The browser could not be opened automatically. Use the button above.',

  // Settings: Tools
  'settings.tools.chooseCapabilities':
    'Choose which capabilities OpenHuman can use on your behalf.',
  'settings.tools.saveChanges': 'Save Changes',
  'settings.tools.preferencesSaved': 'Preferences saved',
  'settings.tools.saveFailed': 'Failed to save preferences. Try again.',

  // Settings: Screen Awareness
  'settings.screenAwareness.mode': 'Mode',
  'settings.screenAwareness.allExceptBlacklist': 'All Except Blacklist',
  'settings.screenAwareness.whitelistOnly': 'Whitelist Only',
  'settings.screenAwareness.screenMonitoring': 'Screen Monitoring',
  'settings.screenAwareness.saveSettings': 'Save Settings',
  'settings.screenAwareness.session': 'Session',
  'settings.screenAwareness.status': 'Status',
  'settings.screenAwareness.active': 'Active',
  'settings.screenAwareness.stopped': 'Stopped',
  'settings.screenAwareness.remaining': 'Remaining',
  'settings.screenAwareness.startSession': 'Start Session',
  'settings.screenAwareness.stopSession': 'Stop Session',
  'settings.screenAwareness.analyzeNow': 'Analyze Now',
  'settings.screenAwareness.macosOnly':
    'Screen Awareness desktop capture and permission controls are currently supported on macOS only.',

  // Connections
  'connections.comingSoon': 'Coming soon',
  'connections.setUp': 'Set up',
  'connections.configured': 'Configured',
  'connections.unavailable': 'Unavailable',
  'connections.checking': 'Checking…',
  'connections.walletConfigured':
    'Local EVM, BTC, Solana, and Tron identities are configured from your recovery phrase.',
  'connections.walletReady':
    'Set up local EVM, BTC, Solana, and Tron identities from one recovery phrase.',
  'connections.walletError':
    'Could not check wallet status. Tap to retry from the Recovery Phrase panel.',
  'connections.walletChecking': 'Checking wallet status...',
  'connections.walletIdentities': 'Wallet identities',
  'connections.walletDerived':
    'Derived locally from your recovery phrase and stored as safe metadata only.',
  'connections.privacySecurity': 'Privacy & Security',
  'connections.privacySecurityDesc':
    'All data and credentials are stored locally with zero-data retention policy. Your information is encrypted and never shared with third parties.',

  // Channels
  'channels.status.connecting': 'Connecting',
  'channels.status.notConfigured': 'Not configured',
  'channels.noActiveRoute': 'No active route',
  'channels.activeRoute': 'Active route',
  'channels.loadingDefinitions': 'Loading channel definitions...',
  'channels.channelConnections': 'Channel Connections',
  'channels.configureAuthModes': 'Configure auth modes for each messaging channel.',
  'channels.configNotAvailable': 'Configuration for',
  'channels.channel': 'channel',

  // Dev Options
  'devOptions.coreModeNotSet': 'Core mode: not set',
  'devOptions.coreModeNotSetDesc':
    "The boot-check picker hasn't been confirmed yet. Use Switch mode on the picker to choose Local or Cloud.",
  'devOptions.local': 'Local',
  'devOptions.embeddedCoreSidecar': 'Embedded core sidecar',
  'devOptions.sidecarSpawned': 'Spawned in-process by the Tauri shell on app launch.',
  'devOptions.cloud': 'Cloud',
  'devOptions.remoteCoreRpc': 'Remote core RPC',
  'devOptions.token': 'Token',
  'devOptions.tokenNotSet': 'not set — RPC will 401',
  'devOptions.triggerSentryTest': 'Trigger Sentry Test (staging)',
  'devOptions.triggerSentryTestDesc':
    'Fires a tagged error to verify the Sentry pipeline. Issue #1072 — remove after verification.',
  'devOptions.sendTestEvent': 'Send test event',
  'devOptions.sending': 'Sending…',
  'devOptions.eventSent': 'Event sent',
  'devOptions.failed': 'Failed',
  'devOptions.appLogs': 'App logs',
  'devOptions.appLogsDesc':
    'Open the folder containing rolling daily log files. Attach the most recent file when reporting an issue.',
  'devOptions.openLogsFolder': 'Open logs folder',

  // Mnemonic
  'mnemonic.phraseSaved': 'Recovery phrase saved',
  'mnemonic.walletReady': 'Multi-chain wallet identities are ready. Returning to settings...',
  'mnemonic.writeDownWords': 'Write down these',
  'mnemonic.wordsInOrder':
    'words in order and store them somewhere safe. This phrase secures your local encryption key and your EVM, BTC, Solana, and Tron wallet identities.',
  'mnemonic.cannotRecover':
    'This phrase can never be recovered if lost and should stay fully local to your device.',
  'mnemonic.copyToClipboard': 'Copy to Clipboard',
  'mnemonic.alreadyHavePhrase': 'I already have a recovery phrase',
  'mnemonic.consentSaved': 'I saved this phrase and consent to using it for local wallet setup',
  'mnemonic.enterPhraseToRestore':
    'Enter your recovery phrase below to restore your local wallet identities, or paste the full phrase into any field (12 words for new backups; 24-word phrases from older versions still work).',
  'mnemonic.words': 'Words',
  'mnemonic.validPhrase': 'Valid recovery phrase',
  'mnemonic.generateNewPhrase': 'Generate a new recovery phrase instead',
  'mnemonic.securingData': 'Securing Your Data...',
  'mnemonic.saveRecoveryPhrase': 'Save Recovery Phrase',
  'mnemonic.userNotLoaded': 'User not loaded. Please sign in again or refresh the page.',
  'mnemonic.invalidPhrase': 'Invalid recovery phrase. Please check your words and try again.',
  'mnemonic.somethingWentWrong': 'Something went wrong. Please try again.',

  // Team
  'team.failedToCreate': 'Failed to create team',
  'team.invalidInviteCode': 'Invalid or expired invite code',
  'team.failedToSwitch': 'Failed to switch team',
  'team.failedToLeave': 'Failed to leave team',
  'team.role.owner': 'Owner',
  'team.role.admin': 'Admin',
  'team.role.billingManager': 'Billing Manager',
  'team.role.member': 'Member',
  'team.active': 'Active',
  'team.personalTeam': 'Personal team',
  'team.manageTeam': 'Manage Team',
  'team.switching': 'Switching...',
  'team.switch': 'Switch',
  'team.leaving': 'Leaving...',
  'team.leave': 'Leave',
  'team.yourTeams': 'Your Teams',
  'team.createNewTeam': 'Create New Team',
  'team.teamName': 'Team name',
  'team.creating': 'Creating...',
  'team.joinExistingTeam': 'Join Existing Team',
  'team.inviteCode': 'Invite code',
  'team.joining': 'Joining...',
  'team.join': 'Join',
  'team.leaveTeam': 'Leave Team',
  'team.confirmLeave': 'Are you sure you want to leave',
  'team.leaveWarning':
    "You will lose access to the team and all team resources. You'll need a new invite to rejoin.",
  'team.management': 'Team Management',
  'team.notFound': 'Team not found',
  'team.accessDenied': 'Access denied',
  'team.members': 'Members',

  // Voice
  'voice.title': 'Voice Dictation',
  'voice.settings': 'Voice Settings',
  'voice.settingsDesc': 'Hold the hotkey to dictate and insert text into the active field.',
  'voice.hotkey': 'Hotkey',
  'voice.activationMode': 'Activation Mode',
  'voice.tapToToggle': 'Tap to toggle',
  'voice.writingStyle': 'Writing Style',
  'voice.verbatimTranscription': 'Verbatim transcription',
  'voice.naturalCleanup': 'Natural cleanup',
  'voice.autoStart': 'Start voice server automatically with the core',
  'voice.customDictionary': 'Custom Dictionary',
  'voice.customDictionaryDesc':
    'Add names, technical terms, and domain words to improve recognition accuracy.',
  'voice.addWord': 'Add a word...',
  'voice.sttDisabled':
    'Voice dictation is disabled until the local STT model is downloaded and ready.',
  'voice.openLocalAiModel': 'Open Local AI Model',
  'voice.serverRestarted': 'Voice server restarted with the new settings.',
  'voice.settingsSaved': 'Voice settings saved.',
  'voice.serverStarted': 'Voice server started.',
  'voice.serverStopped': 'Voice server stopped.',
  'voice.saveVoiceSettings': 'Save Voice Settings',
  'voice.startVoiceServer': 'Start Voice Server',
  'voice.stopVoiceServer': 'Stop Voice Server',
  'voice.debugTitle': 'Voice Debug',

  // Autocomplete
  'autocomplete.title': 'Autocomplete',
  'autocomplete.settings': 'Settings',
  'autocomplete.acceptWithTab': 'Accept With Tab',
  'autocomplete.stylePreset': 'Style Preset',
  'autocomplete.style.balanced': 'Balanced',
  'autocomplete.style.concise': 'Concise',
  'autocomplete.style.formal': 'Formal',
  'autocomplete.style.casual': 'Casual',
  'autocomplete.style.custom': 'Custom',
  'autocomplete.disabledApps': 'Disabled Apps (one bundle/app token per line)',
  'autocomplete.saveSettings': 'Save Settings',
  'autocomplete.saving': 'Saving…',
  'autocomplete.runtime': 'Runtime',
  'autocomplete.running': 'Running',
  'autocomplete.start': 'Start',
  'autocomplete.stop': 'Stop',
  'autocomplete.settingsSaved': 'Autocomplete settings saved.',
  'autocomplete.started': 'Autocomplete started.',
  'autocomplete.didNotStart': 'Autocomplete did not start. Check if it is enabled.',
  'autocomplete.stopped': 'Autocomplete stopped.',
  'autocomplete.advancedSettings': 'Advanced settings',
  'autocomplete.debugTitle': 'Autocomplete Debug',

  // Chat
  'chat.agentChat': 'Agent Chat',
  'chat.overrides': 'Overrides',
  'chat.model': 'Model',
  'chat.temperature': 'Temperature',
  'chat.conversation': 'Conversation',
  'chat.startAgentConversation': 'Start a conversation with the agent.',
  'chat.you': 'You',
  'chat.agent': 'Agent',
  'chat.askAgent': 'Ask the agent anything...',
  'chat.sendMessage': 'Send Message',

  // Composio
  'composio.triageTitle': 'Integration Triggers',
  'composio.triageDesc':
    'When active, each incoming Composio trigger runs through an AI triage step that classifies the event and may kick off automated actions — one local LLM turn per trigger. Disable globally or per integration if you prefer manual review. If the environment variable',
  'composio.disableAllTriage': 'Disable AI triage for all triggers',
  'composio.triggersStillRecorded': 'Triggers are still recorded to history — no LLM turn is run.',
  'composio.disableSpecificIntegrations': 'Disable AI triage for specific integrations',
  'composio.settingsSaved': 'Settings saved',
  'composio.saveFailed': 'Failed to save. Try again.',

  // Cron
  'cron.title': 'Cron Jobs',
  'cron.scheduledJobs': 'Scheduled Jobs',
  'cron.manageCronJobs': 'Manage cron jobs from the core scheduler.',
  'cron.refreshCronJobs': 'Refresh Cron Jobs',

  // Local Model
  'localModel.modelStatus': 'Model Status',
  'localModel.downloadModels': 'Download Models',
  'localModel.usage': 'Usage',
  'localModel.usageDesc':
    'Choose which subsystems run on the local model. Anything off uses the cloud.',
  'localModel.enableRuntime': 'Enable local AI runtime',
  'localModel.enableRuntimeDesc':
    'Master switch. Off by default — Ollama stays idle. When on, the tree summarizer, screen intelligence, and autocomplete always use the local model.',
  'localModel.advancedSettings': 'Advanced settings',
  'localModel.debugTitle': 'Local Model Debug',

  // Screen Awareness
  'screenAwareness.debugTitle': 'Screen Awareness Debug',

  // Memory
  'memory.debugTitle': 'Memory Debug',

  // Webhooks
  'webhooks.debugTitle': 'Webhooks Debug',

  // Notifications
  'notifications.routingTitle': 'Notification Routing',

  // Common (additional)
  'common.reload': 'Reload',
  'common.skip': 'Skip',
  'common.disable': 'Disable',
  'common.enable': 'Enable',

  // Chat (additional)
  'chat.safetyTimeout':
    'No response from the agent after 2 minutes. Try again or check your connection.',
  'chat.filter.all': 'All',
  'chat.filter.work': 'Work',
  'chat.filter.briefing': 'Briefing',
  'chat.filter.notification': 'Notification',
  'chat.filter.workers': 'Workers',
  'chat.selectThread': 'Select a thread',
  'chat.threads': 'Threads',
  'chat.noThreads': 'No threads yet',
  'chat.noLabelThreads': 'No "{label}" threads',
  'chat.noWorkerThreads': 'No worker threads yet',
  'chat.deleteThread': 'Delete thread',
  'chat.deleteThreadConfirm': 'Are you sure you want to delete "{title}"?',
  'chat.untitledThread': 'Untitled thread',
  'chat.hideSidebar': 'Hide sidebar',
  'chat.showSidebar': 'Show sidebar',
  'chat.newThreadShortcut': 'New thread (/new)',
  'chat.new': 'New',
  'chat.failedToLoadMessages': 'Failed to load messages',
  'chat.thinkingIteration': 'Thinking... ({n})',
  'chat.thinkingDots': 'Thinking...',
  'chat.approachingLimit': 'Approaching usage limit',
  'chat.approachingLimitMsg': 'You have used {pct}% of your available quota.',
  'chat.upgrade': 'Upgrade',
  'chat.weeklyLimitHit': "You've used your included cycle budget.",
  'chat.resets': 'Resets',
  'chat.topUpToContinue': 'Top up to continue.',
  'chat.budgetComplete': 'Your included budget is complete. Add credits or upgrade to continue.',
  'chat.topUp': 'Top Up',
  'chat.cycle': 'Cycle',
  'chat.cycleSpent': 'Spent this cycle',
  'chat.cycleRemaining': 'Remaining',
  'chat.left': 'left',
  'chat.setup': 'Set up',
  'chat.switchToText': 'Switch to text',
  'chat.transcribing': 'Transcribing...',
  'chat.stopAndSend': 'Stop and send',
  'chat.startTalking': 'Start talking',
  'chat.playingVoiceReply': 'Playing voice reply',
  'chat.voiceHint': 'Use the mic to speak',
  'chat.micUnavailable': 'Microphone unavailable',
  'chat.turn': 'turn',
  'chat.turns': 'turns',
  'chat.openWorkerThread': 'Open worker thread',

  // Memory (additional)
  'memory.searchAria': 'Search memory',
  'memory.searchPlaceholder': 'Search memory entries...',
  'memory.sourceFilter.all': 'All sources',
  'memory.sourceFilter.email': 'Email',
  'memory.sourceFilter.calendar': 'Calendar',
  'memory.sourceFilter.telegram': 'Telegram',
  'memory.sourceFilter.aiInsight': 'AI Insight',
  'memory.sourceFilter.system': 'System',
  'memory.sourceFilter.trading': 'Trading',
  'memory.sourceFilter.security': 'Security',
  'memory.ingestionActivity': 'Ingestion Activity',
  'memory.events': 'events',
  'memory.event': 'event',
  'memory.overTheLast': 'over the last',
  'memory.months': 'months',
  'memory.peak': 'Peak',
  'memory.perDay': '/day',
  'memory.less': 'Less',
  'memory.more': 'More',
  'memory.on': 'on',
  'memory.loading': 'Loading Memory',
  'memory.fetching': 'Fetching your memory entries...',
  'memory.analyzing': 'Analyzing Memory',
  'memory.analyzingHint': 'Processing your memories to extract insights...',
  'memory.noMatches': 'No Matches Found',
  'memory.noMatchesHint': 'Try changing your search terms or filters.',
  'memory.allCaughtUp': 'All Caught Up',
  'memory.allCaughtUpHint': 'No new memory entries to process.',
  'memory.noAnalysis': 'No Analysis Yet',
  'memory.noAnalysisHint': 'Run an analysis to discover patterns in your memories.',
  'memory.emptyHint': 'Start interacting to create your first memories.',

  // Mic
  'mic.unavailable': 'Microphone is not available',
  'mic.permissionDenied': 'Microphone permission denied',
  'mic.failedToStartRecorder': 'Failed to start recorder',
  'mic.transcribing': 'Transcribing...',
  'mic.tapToSend': 'Tap to send',
  'mic.waitingForAgent': 'Waiting for agent...',
  'mic.tapAndSpeak': 'Tap and speak',
  'mic.stopRecording': 'Stop recording and send',
  'mic.startRecording': 'Start recording',

  // Token
  'token.usageLimitReached': 'Usage limit reached',
  'token.approachingLimit': 'Approaching limit',
  'token.planClickForDetails': 'plan - click for details',
  'token.sessionTokens': 'In: {in} | Out: {out} | Turns: {turns}',
  'token.limit': 'Limit Reached',

  // Catalog
  'catalog.noCapabilityBinding': 'No capability binding',
  'catalog.downloadFailed': 'Download failed',
  'catalog.active': 'Active',
  'catalog.installed': 'Installed',
  'catalog.notDownloaded': 'Not downloaded',
  'catalog.inUse': 'In Use',
  'catalog.use': 'Use',
  'catalog.deleteModel': 'Delete model',
  'catalog.download': 'Download',

  // Navigator
  'navigator.recent': 'Recent',
  'navigator.today': 'Today',
  'navigator.thisWeek': 'This Week',
  'navigator.sources': 'Sources',
  'navigator.email': 'Email',
  'navigator.slack': 'Slack',
  'navigator.chat': 'Chat',
  'navigator.documents': 'Documents',
  'navigator.people': 'People',
  'navigator.topics': 'Topics',

  // Dreams
  'dreams.description':
    'Dreams are AI-generated reflections that synthesize patterns from your memories.',
  'dreams.comingSoon': 'Coming soon',

  // Assignment
  'assignment.memoryLlm': 'Memory LLM',
  'assignment.memoryLlmAria': 'Memory LLM selection',
  'assignment.embedder': 'Embedder',
  'assignment.loaded': 'Loaded',
  'assignment.notDownloaded': 'Not downloaded',
  'assignment.usedForExtractSummarise': 'Used for extraction and summarization',

  // Insights
  'insights.knownFacts': 'Known Facts',
  'insights.preferences': 'Preferences',
  'insights.relationships': 'Relationships',
  'insights.skills': 'Skills',
  'insights.opinions': 'Opinions',
  'insights.other': 'Other',
  'insights.title': 'Insights',
  'insights.empty': 'No insights yet. Insights are generated as your memory grows.',
  'insights.description': 'Based on {count} relations in your memory graph.',
  'insights.items': 'items',
  'insights.more': 'more',

  // Calls
  'calls.joiningCall': 'Joining call',
  'calls.meetWindowOpening': 'The Meet window is opening...',
  'calls.failedToStart': 'Failed to start Meet call',
  'calls.couldNotStart': 'Could not start call',
  'calls.failedToClose': 'Failed to close call',
  'calls.couldNotClose': 'Could not close call',
  'calls.joinMeet': 'Join a Google Meet call',
  'calls.joinMeetDescription': 'Enter a Google Meet link to join.',
  'calls.meetLink': 'Meet Link',
  'calls.displayName': 'Display Name',
  'calls.openingMeet': 'Opening Meet...',
  'calls.joinCall': 'Join Call',
  'calls.activeCalls': 'Active Calls',
  'calls.leave': 'Leave',

  // Workspace
  'workspace.wipeConfirm': 'Are you sure you want to wipe all memory? This cannot be undone.',
  'workspace.resetTreeConfirm': 'Are you sure you want to rebuild the memory tree?',
  'workspace.wipeTitle': 'Wipe Memory',
  'workspace.resetting': 'Resetting...',
  'workspace.resetMemory': 'Reset Memory',
  'workspace.resetTreeTitle': 'Rebuild Memory Tree',
  'workspace.rebuilding': 'Rebuilding...',
  'workspace.resetMemoryTree': 'Reset Memory Tree',
  'workspace.building': 'Building...',
  'workspace.buildSummaryTrees': 'Build Summary Trees',
  'workspace.viewVault': 'View Vault',
  'workspace.openingVaultTitle': 'Opening vault in Obsidian',
  'workspace.openingVaultMessage':
    "If Obsidian doesn't open, install it from obsidian.md or use Reveal Folder. Vault path:",
  'workspace.openVaultFailedTitle': "Couldn't open vault in Obsidian",
  'workspace.openVaultFailedMessage':
    'Use Reveal Folder to open the vault directory directly. Vault path:',
  'workspace.revealVaultFailed': "Couldn't reveal vault folder",
  'workspace.revealFolder': 'Reveal Folder',
  'workspace.graphLoadFailed': 'Failed to load memory graph',
  'workspace.loadingGraph': 'Loading memory graph...',
  'workspace.graphViewMode': 'Memory graph view mode',
  'workspace.trees': 'Trees',
  'workspace.contacts': 'Contacts',

  // Graph
  'graph.noContactMentions': 'No contact mentions',
  'graph.noMemory': 'No memory',
  'graph.source': 'Source',
  'graph.topic': 'Topic',
  'graph.global': 'Global',
  'graph.document': 'Document',
  'graph.contact': 'Contact',
  'graph.nodes': 'nodes',
  'graph.parentChild': 'parent-child',
  'graph.documentContact': 'document-contact',
  'graph.link': 'link',
  'graph.links': 'links',
  'graph.children': 'children',
  'graph.clickToOpenObsidian': 'Click to open in Obsidian',
  'graph.person': 'Person',

  // Modal
  'modal.dontShowAgain': "Don't show similar suggestions",

  // Reflections
  'reflections.loading': 'Loading reflections...',
  'reflections.empty': 'No reflections yet',
  'reflections.title': 'Reflections',
  'reflections.proposedAction': 'Proposed Action',
  'reflections.act': 'Act',
  'reflections.dismiss': 'Dismiss',

  // WhatsApp
  'whatsapp.chatsSynced': 'chats synced',
  'whatsapp.chatSynced': 'chat synced',

  // Sync
  'sync.active': 'Active',
  'sync.recent': 'Recent',
  'sync.idle': 'Idle',
  'sync.memorySources': 'Memory Sources',
  'sync.noConnectedSources': 'No connected sources',
  'sync.chunks': 'chunks',
  'sync.lastChunk': 'Last chunk:',
  'sync.pending': 'pending',
  'sync.processed': 'processed',
  'sync.syncing': 'Syncing…',
  'sync.sync': 'Sync',
  'sync.failedToLoad': 'Failed to load sync status',
  'sync.noContent': 'No content has been synced into memory yet. Connect an integration to start.',

  // Backend
  'backend.aiBackend': 'AI Backend',
  'backend.cloud': 'Cloud',
  'backend.recommended': 'Recommended',
  'backend.cloudDescription':
    'Fast, powerful models routed through the OpenHuman backend. Ready to use immediately.',
  'backend.privacyNote':
    'Prompts and selected context may be sent to the configured backend/provider. Use local mode for supported on-device workloads.',
  'backend.local': 'Local',
  'backend.advanced': 'Advanced',
  'backend.localDescription':
    'Run models on your own machine using Ollama. Full privacy, requires setup.',
  'backend.ramRecommended': '16GB+ RAM recommended',

  // Subconscious
  'subconscious.tasks': 'tasks',
  'subconscious.ticks': 'ticks',
  'subconscious.last': 'Last',
  'subconscious.failed': 'failed',
  'subconscious.tickInterval': 'Tick Interval',
  'subconscious.runNow': 'Run Now',
  'subconscious.providerUnavailableTitle': 'Subconscious is paused',
  'subconscious.providerSettings': 'AI settings',
  'subconscious.approvalNeeded': 'Approval Needed',
  'subconscious.requiresApproval': 'Requires approval',
  'subconscious.fixInConnections': 'Fix in Connections',
  'subconscious.goAhead': 'Go Ahead',
  'subconscious.activeTasks': 'Active Tasks',
  'subconscious.noActiveTasks': 'No active tasks',
  'subconscious.default': 'Default',
  'subconscious.addTaskPlaceholder': 'Add a new task...',
  'subconscious.activityLog': 'Activity Log',
  'subconscious.noActivity': 'No activity yet',
  'subconscious.decision.nothingNew': 'Nothing new',
  'subconscious.decision.completed': 'Completed',
  'subconscious.decision.evaluating': 'Evaluating',
  'subconscious.decision.waitingApproval': 'Waiting for approval',
  'subconscious.decision.failed': 'Failed',
  'subconscious.decision.cancelled': 'Cancelled',
  'subconscious.decision.skipped': 'Skipped',

  // Actionable
  'actionable.complete': 'Complete',
  'actionable.dismiss': 'Dismiss',
  'actionable.snooze': 'Snooze',
  'actionable.new': 'New',

  // Stats
  'stats.storage': 'Storage',
  'stats.files': 'files',
  'stats.documents': 'Documents',
  'stats.today': 'today',
  'stats.namespaces': 'Namespaces',
  'stats.relations': 'Relations',
  'stats.firstMemory': 'First Memory',
  'stats.latest': 'Latest',
  'stats.sessions': 'Sessions',
  'stats.tokens': 'tokens',

  // Boot Check Gate
  'bootCheck.invalidUrl': 'Please enter a runtime URL.',
  'bootCheck.urlMustStartWith': 'The URL needs to start with http:// or https://',
  'bootCheck.validUrlRequired':
    "That doesn't look like a valid URL (try https://core.example.com/rpc)",
  'bootCheck.tokenRequired': "We'll need an auth token to connect.",
  'bootCheck.chooseCoreMode': 'Select a Runtime',
  'bootCheck.connectToCore': 'Connect to Your Runtime',
  'bootCheck.desktopDescription': 'OpenHuman needs a runtime to think. Pick where it should live.',
  'bootCheck.webDescription':
    'On the web, OpenHuman connects to a runtime you control. Drop in its URL and auth token below, or grab the desktop app to run one right on your machine.',
  'bootCheck.preferDesktop': 'Rather keep everything on your own device?',
  'bootCheck.downloadDesktop': 'Get the Desktop App',
  'bootCheck.localRecommended': 'Run Locally (Recommended)',
  'bootCheck.localDescription':
    'Runs right here on your computer. Fastest, fully private, nothing to set up.',
  'bootCheck.cloudMode': 'Run on the Cloud (Complex)',
  'bootCheck.cloudDescription':
    "Connect to a runtime you're hosting elsewhere. Stays online 24×7 so you don't need to keep this device running.",
  'bootCheck.coreRpcUrl': 'Runtime URL',
  'bootCheck.rpcUrlPlaceholder': 'https://core.example.com/rpc',
  'bootCheck.authToken': 'Auth Token',
  'bootCheck.bearerTokenPlaceholder': 'The bearer token from your remote runtime',
  'bootCheck.storedLocally': 'Kept on this device only. Sent as ',
  'bootCheck.testing': 'Testing…',
  'bootCheck.testConnection': 'Test Connection',
  'bootCheck.connectedOk': "Connected. You're good to go.",
  'bootCheck.authFailed': "That token didn't work. Double-check it and try again.",
  'bootCheck.unreachablePrefix': "Couldn't reach it:",
  'bootCheck.checkingCore': 'Waking up your runtime…',
  'bootCheck.cannotReach': "Can't Reach the Runtime",
  'bootCheck.cannotReachDesc': "We couldn't connect to your runtime. Want to try a different one?",
  'bootCheck.switchMode': 'Pick a Different Runtime',
  'bootCheck.quit': 'Quit',
  'bootCheck.legacyDetected': 'Legacy Background Runtime Detected',
  'bootCheck.legacyDescription':
    'A separately-installed OpenHuman daemon is already running on this device. We need to clear it out before the built-in runtime can take over.',
  'bootCheck.removing': 'Removing…',
  'bootCheck.removeContinue': 'Remove and Continue',
  'bootCheck.localNeedsRestart': 'Local Runtime Needs a Restart',
  'bootCheck.localNeedsRestartDesc':
    'Your local runtime is on a different version than this app. A quick restart will get them back in sync.',
  'bootCheck.restarting': 'Restarting…',
  'bootCheck.restartCore': 'Restart Runtime',
  'bootCheck.cloudNeedsUpdate': 'Cloud Runtime Needs an Update',
  'bootCheck.cloudNeedsUpdateDesc':
    'Your cloud runtime is on a different version than this app. Run the updater to bring them back in sync.',
  'bootCheck.updating': 'Updating…',
  'bootCheck.updateCloudCore': 'Update Cloud Runtime',
  'bootCheck.versionCheckFailed': 'Runtime Version Check Failed',
  'bootCheck.versionCheckFailedDesc':
    "Your runtime is up but isn't reporting its version. It may be outdated. Restart or update it to continue.",
  'bootCheck.working': 'Working…',
  'bootCheck.restartUpdateCore': 'Restart / Update Runtime',
  'bootCheck.unexpectedError': 'Unexpected Boot-Check Error',
  'bootCheck.actionFailed': 'Something went wrong. Please try again.',

  // Notifications: category labels & timestamps
  'notifications.justNow': 'just now',
  'notifications.minAgo': '{n}m ago',
  'notifications.hrAgo': '{n}h ago',
  'notifications.dayAgo': '{n}d ago',
  'notifications.category.messages': 'Messages',
  'notifications.category.agents': 'Agents',
  'notifications.category.skills': 'Skills',
  'notifications.category.system': 'System',
  'notifications.category.meetings': 'Meetings',
  'notifications.category.reminders': 'Reminders',
  'notifications.category.important': 'Important',

  // About / Updates: status summary phrases
  'about.update.status.checking': 'Checking...',
  'about.update.status.available': 'v{version} available',
  'about.update.status.availableNoVersion': 'Update available',
  'about.update.status.downloading': 'Downloading...',
  'about.update.status.readyToInstall': 'v{version} ready to install',
  'about.update.status.readyToInstallNoVersion':
    'A new version is downloaded and ready. Restart to apply.',
  'about.update.status.installing': 'Installing...',
  'about.update.status.restarting': 'Restarting...',
  'about.update.status.upToDate': 'You are running the latest version.',
  'about.update.status.error': 'Update check failed',
  'about.update.status.default': 'Check for updates',

  // Welcome: connection error messages
  'welcome.connectionFailed': 'Connection failed: {status} {statusText}',
  'welcome.connectionFailedMsg': 'Connection failed: {message}',

  // Chat: Agent chat panel description
  'chat.agentChatDesc': 'Open a direct chat session with the agent.',

  // Channels: active route interpolated value
  'channels.activeRouteValue': '{channel} via {authMode}',

  // Privacy: data kind labels for What Leaves My Computer
  'privacy.dataKind.messages': 'Messages',
  'privacy.dataKind.agents': 'Agents',
  'privacy.dataKind.skills': 'Skills',
  'privacy.dataKind.system': 'System',
  'privacy.dataKind.meetings': 'Meetings',
  'privacy.dataKind.reminders': 'Reminders',
  'privacy.dataKind.important': 'Important',

  // Onboarding: supplementary keys
  'onboarding.enableLocalAI': 'Enable Local AI',
  'onboarding.skills.status.available': 'Available',
  'onboarding.skills.status.connected': 'Connected',
  'onboarding.skills.status.connecting': 'Connecting',
  'onboarding.skills.status.error': 'Error',
  'onboarding.skills.status.unavailable': 'Unavailable',

  // Composio: miscellaneous
  'composio.statusUnavailable': 'Status unavailable',
  'composio.authExpired': 'Auth expired',
  'composio.reconnect': 'Reconnect',
  'composio.envVarOverrides': 'is set, it overrides this setting.',
  'composio.previewBadge': 'Preview',
  'composio.previewTooltip':
    'Agent integration coming soon — you can connect, but the agent can’t use this toolkit yet.',

  // Memory: day-of-week labels for heatmap
  'memory.day.sun': 'Sun',
  'memory.day.mon': 'Mon',
  'memory.day.tue': 'Tue',
  'memory.day.wed': 'Wed',
  'memory.day.thu': 'Thu',
  'memory.day.fri': 'Fri',
  'memory.day.sat': 'Sat',

  // Memory: ingestion status labels
  'memory.ingesting': 'Ingesting',
  'memory.ingestionQueued': 'Queued',
  'memory.ingestingTitle': 'Ingesting {title}',

  // Mic: error messages
  'mic.noAudioCaptured': 'No audio captured',
  'mic.noSpeechDetected': 'No speech detected',
  'mic.failedToStopRecording': 'Failed to stop recording: {message}',
  'mic.transcriptionFailed': 'Transcription failed: {message}',

  // Reflections: kind labels
  'reflections.kind.retrospective': 'Retrospective',
  'reflections.kind.derivedFact': 'Derived Fact',
  'reflections.kind.moodInsight': 'Mood Insight',
  'reflections.kind.relationshipInsight': 'Relationship Insight',

  // Graph: tooltip keys
  'graph.tooltip.summary': 'Summary',
  'graph.tooltip.contact': 'Contact',

  // Local Model: usage labels
  'localModel.usage.never': 'Never',
  'localModel.usage.mediumLoad': 'Medium load',
  'localModel.usage.lowLoad': 'Low load',
  'localModel.usage.idleMode': 'Idle mode',
  'localModel.rebootstrapComplete': 'Model re-bootstrap complete.',
  'localModel.modelsVerified': 'Local models verified.',

  // === i18n migration: extracted strings (auto-merged) ===
  'accounts.addModal.allConnected': 'All connected',
  'accounts.addModal.title': 'Add account',
  'accounts.respondQueue.empty': 'Empty',
  'accounts.respondQueue.hide': 'Hide respond queue',
  'accounts.respondQueue.loadFailed': 'Failed to load respond queue',
  'accounts.respondQueue.loading': 'Loading queue…',
  'accounts.respondQueue.pending': 'Pending',
  'accounts.respondQueue.show': 'Show respond queue',
  'accounts.respondQueue.title': 'Respond queue',
  'accounts.webviewHost.almostReady': 'Almost ready...',
  'accounts.webviewHost.loadTimeout': 'Webview load timeout',
  'accounts.webviewHost.loading': 'Loading {providerName}...',
  'accounts.webviewHost.loadingAccount': 'Loading account',
  'accounts.webviewHost.restoringSession': 'Restoring session...',
  'accounts.webviewHost.retryLoading': 'Retry loading',
  'accounts.webviewHost.takingLonger': '{providerName} is taking longer than expected.',
  'accounts.webviewHost.timeoutHint': 'Timeout hint',
  'app.connectionBadge.composio': 'Composio',
  'app.connectionBadge.messaging': 'Messaging',
  'app.connectionIndicator.connected': 'Connected to OpenHuman AI 🚀',
  'app.connectionIndicator.connecting': 'Connecting',
  'app.connectionIndicator.coreOffline': 'Core offline',
  'app.connectionIndicator.disconnected': 'Disconnected',
  'app.connectionIndicator.offline': 'Offline',
  'app.connectionIndicator.reconnecting': 'Reconnecting…',
  'app.errorFallback.componentStack': 'Component stack',
  'app.errorFallback.downloadLatest': 'Download latest',
  'app.errorFallback.heading': 'Something went wrong',
  'app.errorFallback.hint':
    'Try reloading the app. If the problem persists, download the latest version.',
  'app.errorFallback.reloadApp': 'Reload app',
  'app.errorFallback.subheading': 'An unexpected error occurred',
  'app.errorFallback.tryRecover': 'Try recover',
  'app.localAiDownload.installing': 'Installing...',
  'app.localAiDownload.preparing': 'Preparing...',
  'app.openhumanLink.accounts.continueWith': 'Continue with {label} sign-in',
  'app.openhumanLink.accounts.done': 'Done',
  'app.openhumanLink.accounts.intro':
    'Connect your apps to give OpenHuman access to your accounts.',
  'app.openhumanLink.accounts.webviewNote':
    'Your credentials stay on this device and are never shared.',
  'app.openhumanLink.billing.openDashboard': 'Open dashboard',
  'app.openhumanLink.billing.stayOnTrial': 'Stay on trial',
  'app.openhumanLink.billing.trialCredit': 'Trial credit',
  'app.openhumanLink.billing.trialDesc': 'Trial desc',
  'app.openhumanLink.defaultBody':
    "Not ready in the popup yet. Open the full settings page when you're done.",
  'app.openhumanLink.discord.intro': 'Join the OpenHuman community on Discord.',
  'app.openhumanLink.discord.openInvite': 'Open invite link',
  'app.openhumanLink.discord.perk1': 'Early access to new features',
  'app.openhumanLink.discord.perk2': 'Connect with other OpenHuman users',
  'app.openhumanLink.discord.perk3': 'Share feedback directly with the team',
  'app.openhumanLink.discord.perk4': 'Community help and support',
  'app.openhumanLink.done': 'Done',
  'app.openhumanLink.loadingChannelSetup': 'Loading channel setup',
  'app.openhumanLink.maybeLater': 'Maybe later',
  'app.openhumanLink.notifications.asking': 'Asking your OS…',
  'app.openhumanLink.notifications.blocked': 'Notifications blocked',
  'app.openhumanLink.notifications.blockedStep1': 'Open System Settings',
  'app.openhumanLink.notifications.blockedStep2': 'Go to Notifications → OpenHuman',
  'app.openhumanLink.notifications.blockedStep3': 'Enable Allow Notifications',
  'app.openhumanLink.notifications.intro': 'Allow OpenHuman to send you notifications.',
  'app.openhumanLink.notifications.promptHint': 'Click Allow when your system asks for permission.',
  'app.openhumanLink.notifications.retry': 'Retry test notification',
  'app.openhumanLink.notifications.send': 'Send test notification',
  'app.openhumanLink.notifications.sendFailed': "Couldn't send: {error}",
  'app.openhumanLink.notifications.sent':
    'Test notification sent. If you didn’t receive it, go to System Settings → Notifications → OpenHuman, turn on Allow Notifications, and set Banner Style to Persistent.',
  'app.openhumanLink.skipForNow': 'Skip for now',
  'app.openhumanLink.telegramUnavailable': 'Telegram unavailable',
  'app.openhumanLink.title.accounts': 'Connect your apps',
  'app.openhumanLink.title.billing': 'Billing & credits',
  'app.openhumanLink.title.discord': 'Join the community',
  'app.openhumanLink.title.messaging': 'Connect a chat channel',
  'app.openhumanLink.title.notifications': 'Allow notifications',
  'app.persistRehydration.body': 'Loading your saved settings…',
  'app.persistRehydration.heading': 'Restoring your data',
  'app.persistRehydration.resetCta': 'Resetting…',
  'app.persistRehydration.resetting': 'Resetting…',
  'app.routeLoading.initializing': 'Initializing OpenHuman...',
  'app.update.currentlyOn': '{version}',
  'app.update.errorFallback': 'Something went wrong while updating.',
  'app.update.header.default': 'Update',
  'app.update.header.error': 'Update failed',
  'app.update.header.installing': 'Installing update',
  'app.update.header.readyToInstall': 'Update ready to install',
  'app.update.header.restarting': 'Restarting…',
  'app.update.later': 'Later',
  'app.update.newVersionReady': 'A new version is ready to install.',
  'app.update.progress.downloaded': '${formatBytes(downloaded)} downloaded',
  'app.update.progress.installing': 'Installing the new version…',
  'app.update.progress.restarting': 'Relaunching the app…',
  'app.update.progress.working': '{percent}%',
  'app.update.restartNote': 'The app will restart to apply the update.',
  'app.update.restartNow': 'Restart now',
  'app.update.versionReady': 'Version {newVersion} is ready to install.',
  'channels.discord.accountLinked': 'Account linked',
  'channels.discord.connect': 'Connect',
  'channels.discord.linkTokenExpired': 'Link token expired. Please try again.',
  'channels.discord.linkTokenInstruction': '{token}',
  'channels.discord.linkTokenLabel': 'Link token',
  'channels.discord.linkTokenOnce': 'This token can only be used once.',
  'channels.discord.picker.allPermissionsOk': 'Bot has all required permissions in this channel.',
  'channels.discord.picker.botNotInServers': 'Bot not in servers',
  'channels.discord.picker.category': 'Category',
  'channels.discord.picker.channel': 'Channel',
  'channels.discord.picker.checkingPermissions': 'Checking permissions',
  'channels.discord.picker.loadingChannels': 'Loading channels...',
  'channels.discord.picker.loadingServers': 'Loading servers...',
  'channels.discord.picker.missingPermissions': 'Missing permissions',
  'channels.discord.picker.noChannels': 'No text channels found',
  'channels.discord.picker.noServers': 'No servers found',
  'channels.discord.picker.selectChannel': 'Select a channel',
  'channels.discord.picker.selectServer': 'Select a server',
  'channels.discord.picker.server': 'Server',
  'channels.discord.picker.serverChannelSelection': 'Server & Channel Selection',
  'channels.discord.savedRestartRequired': 'Channel saved. Restart the app to activate it.',
  'channels.telegram.connect': 'Connect',
  'channels.telegram.managedDmConnecting': 'Connecting your Telegram account…',
  'channels.telegram.managedDmTimeout': 'Connection timed out. Please try again.',
  'channels.telegram.reconnect': 'Reconnect',
  'channels.telegram.savedRestartRequired': 'Channel saved. Restart the app to activate it.',
  'channels.web.alwaysAvailable': 'Always available',
  'chat.unsubscribeApproval.approve': 'Approve & Unsubscribe',
  'chat.unsubscribeApproval.approved': '✓ Successfully unsubscribed.',
  'chat.unsubscribeApproval.denied': '✕ Request denied.',
  'chat.unsubscribeApproval.deny': 'Deny',
  'chat.unsubscribeApproval.processing': 'Processing...',
  'chat.unsubscribeApproval.title': 'Unsubscribe Request',
  'commandPalette.ariaLabel': 'Command palette',
  'commandPalette.description': 'Description',
  'commandPalette.label': 'Commands',
  'commandPalette.noResults': 'No results',
  'commandPalette.placeholder': 'Type a command or search…',
  'commandPalette.searchAria': 'Search commands',
  'commandPalette.shortcutHint': 'Press ? for all shortcuts',
  'commandPalette.title': 'Command palette',
  'composio.connect.additionalConfigRequired': 'Additional config required',
  'composio.connect.atlassianSubdomainHint': 'acme',
  'composio.connect.atlassianSubdomainLabel': 'Atlassian subdomain',
  'composio.connect.connect': 'Connect',
  'composio.connect.dynamicsOrgNameHint':
    'For example, "myorg" for myorg.crm.dynamics.com. Enter the short org name only, not the full URL.',
  'composio.connect.dynamicsOrgNameLabel': 'Dynamics 365 Organization Name',
  'composio.connect.connectionFailed': 'Connection failed (status: ${hit.status}).',
  'composio.connect.disconnectFailed': 'Disconnect failed: {msg}',
  'composio.connect.disconnecting': 'Disconnecting…',
  'composio.connect.idleDescription': 'Connect your',
  'composio.connect.idleDescriptionSuffix':
    "account. We'll open a browser window, you approve access there, and this app will detect the connection automatically.",
  'composio.connect.isConnected': 'is connected.',
  'composio.connect.manage': 'Manage',
  'composio.connect.needsFieldsPrefix': 'To connect',
  'composio.connect.needsFieldsSuffix':
    'we need a bit more information. Fill in the missing fields below and try again.',
  'composio.connect.needsSubdomain': 'To connect',
  'composio.connect.needsSubdomainSuffix':
    'enter your Atlassian subdomain (e.g. acme for acme.atlassian.net) and try again.',
  'composio.connect.oauthComplete': 'OAuth to complete…',
  'composio.connect.oauthTimeout': 'OAuth timed out. Please try again.',
  'composio.connect.permissions': 'Permissions',
  'composio.connect.permissionsDefault': 'Read + Write enabled by default',
  'composio.connect.permissionsNote': 'can expose',
  'composio.connect.permissionsNoteSuffix':
    "OpenHuman's own agent permissions are controlled below as read, write, and admin toggles.",
  'composio.connect.reopenBrowser': 'Reopen browser',
  'composio.connect.requestingUrl': 'Requesting connect URL…',
  'composio.connect.requiredFieldEmpty': 'This field is required.',
  'composio.connect.retryConnection': 'Retry connection',
  'composio.connect.scopeLoadError': "Couldn't load scope preferences: {msg}",
  'composio.connect.scopeSaveError': "Couldn't save {key} scope: {msg}",
  'composio.connect.subdomainInvalid':
    'Enter the short subdomain only (e.g. "acme"), not the full URL. It should contain only letters, numbers, and hyphens.',
  'composio.connect.subdomainRequired': 'Please enter your Atlassian subdomain to continue.',
  'composio.connect.wabaIdHint':
    'Find it via GET /me/businesses then GET /{business_id}/owned_whatsapp_business_accounts using your Meta access token.',
  'composio.connect.wabaIdLabel': 'WhatsApp Business Account ID (WABA ID)',
  'composio.connect.wabaIdRequired':
    'Please enter your WhatsApp Business Account ID (WABA ID) to continue.',
  'composio.connect.waitingFor': 'Waiting for',
  'composio.connect.waitingHint': 'Complete the connection in the browser window that just opened.',
  'composio.triggers.heading': 'Triggers',
  'composio.triggers.listenFrom': 'Listen for events from',
  'composio.triggers.loadError': "Couldn't load triggers",
  'composio.triggers.needsConfiguration': 'Needs configuration',
  'composio.triggers.noneAvailable': 'No triggers are currently available for',
  'conversations.taskKanban.moveLeft': 'Move left',
  'conversations.taskKanban.moveRight': 'Move right',
  'conversations.taskKanban.title': 'Tasks',
  'conversations.toolTimeline.turn': 'turn',
  'conversations.toolTimeline.workerThread': 'worker thread',
  'daemon.serviceBlockingGate.body':
    'Retrying in the background. This usually resolves in a few seconds.',
  'daemon.serviceBlockingGate.downloadHint':
    'If this keeps happening, download the latest version.',
  'daemon.serviceBlockingGate.downloadLatest': 'Download Latest Version',
  'daemon.serviceBlockingGate.retryCore': 'Retry Core',
  'daemon.serviceBlockingGate.retryFailed':
    'Retry failed. Download the latest app build and try again.',
  'daemon.serviceBlockingGate.retrying': 'Retrying...',
  'daemon.serviceBlockingGate.title': 'OpenHuman core is unavailable',
  'home.banners.discordSubtitle': 'Get support, share feedback, and meet the community.',
  'home.banners.discordTitle': 'Join Our Discord',
  'home.banners.earlyBirdDismiss': 'Dismiss early bird banner',
  'home.banners.earlyBirdFirstSub': 'first subscription.',
  'home.banners.earlyBirdOn': 'Early bird on',
  'home.banners.earlyBirdTitle': 'The first 1,000 users get 60% off.',
  'home.banners.earlyBirdUseCode': 'Use code',
  'home.banners.getSubscription': 'Get a subscription',
  'home.banners.promoCreditsBody': 'in promo credits added to your account.',
  'home.banners.promoCreditsTitle': '{amount}',
  'home.banners.promoCreditsUsage': 'Apply them toward any AI workload.',
  'intelligence.memoryChunk.detail.chunk': 'Chunk',
  'intelligence.memoryChunk.detail.copyChunkId': 'Copy chunk id',
  'intelligence.memoryChunk.detail.embeddingInfo': 'bge-m3 1024dim',
  'intelligence.memoryChunk.detail.noEmbedding': 'No embedding',
  'intelligence.memoryChunk.letterhead.from': 'from',
  'intelligence.memoryChunk.letterhead.to': 'to',
  'intelligence.memoryChunk.mentioned.chunkOne': '1 chunk',
  'intelligence.memoryChunk.mentioned.chunkOther': '{count} chunks',
  'intelligence.memoryChunk.mentioned.heading': 'm e n t i o n e d',
  'intelligence.memoryChunk.scoreBars.ariaScore': '{name} score {pct} percent',
  'intelligence.memoryChunk.scoreBars.atThreshold': 'at {threshold}',
  'intelligence.memoryChunk.scoreBars.dropped': 'dropped',
  'intelligence.memoryChunk.scoreBars.heading': 'w h y   k e p t',
  'intelligence.memoryChunk.scoreBars.kept': 'kept',
  'intelligence.memoryText.entityTypePrefix': 'Entity type',
  'intelligence.screenDebug.active': 'Active',
  'intelligence.screenDebug.app': 'App',
  'intelligence.screenDebug.bounds': 'Bounds',
  'intelligence.screenDebug.captureAlt': 'Capture test result',
  'intelligence.screenDebug.captureFailed': 'Failed',
  'intelligence.screenDebug.captureSuccess': 'Success',
  'intelligence.screenDebug.captureTest': 'Capture test',
  'intelligence.screenDebug.capturing': 'Capturing',
  'intelligence.screenDebug.frames': 'Frames',
  'intelligence.screenDebug.idle': 'Idle',
  'intelligence.screenDebug.lastApp': 'Last App',
  'intelligence.screenDebug.mode': 'Mode',
  'intelligence.screenDebug.permAccessibility': 'Perm accessibility',
  'intelligence.screenDebug.permInput': 'Perm input',
  'intelligence.screenDebug.permScreen': 'Accessibility',
  'intelligence.screenDebug.permissions': 'Permissions',
  'intelligence.screenDebug.platformNotSupported': 'Platform not supported',
  'intelligence.screenDebug.recentVisionSummaries': 'Recent vision summaries',
  'intelligence.screenDebug.session': 'Session',
  'intelligence.screenDebug.size': 'Size',
  'intelligence.screenDebug.status': 'Status',
  'intelligence.screenDebug.testCapture': 'Test capture',
  'intelligence.screenDebug.time': 'Time',
  'intelligence.screenDebug.title': 'Title',
  'intelligence.screenDebug.unknown': 'Unknown',
  'intelligence.screenDebug.visionQueue': 'Vision Queue',
  'intelligence.screenDebug.visionState': 'Vision State',
  'intelligence.tasks.activeBoardOne': '1 active board across conversations',
  'intelligence.tasks.activeBoardOther': '{count} active boards across conversations',
  'intelligence.tasks.empty': 'No agent task boards yet',
  'intelligence.tasks.emptyHint':
    'Task boards appear here when your agent is running multi-step jobs.',
  'intelligence.tasks.failedToLoad': 'Failed to load',
  'intelligence.tasks.live': 'live',
  'intelligence.tasks.loadingBoards': 'Loading task boards…',
  'intelligence.tasks.threadPrefix': 'Thread {id}',
  'notifications.card.dismiss': 'Dismiss notification',
  'notifications.card.importanceTitle': 'Importance: {pct}%',
  'notifications.center.empty': 'No notifications yet',
  'notifications.center.emptyHint': "You're all caught up.",
  'notifications.center.filterAll': 'Filter all',
  'notifications.center.markAllRead': 'Mark all read',
  'notifications.center.title': 'Notifications',
  'oauth.button.connecting': 'Connecting...',
  'oauth.login.continueWith': 'Continue with',
  'onboarding.contextGathering.buildingDesc': 'Gathering context from your connected accounts…',
  'onboarding.contextGathering.buildingProfile': 'Building your profile...',
  'onboarding.contextGathering.continueToChat': 'Continue to chat',
  'onboarding.contextGathering.coreAlive': 'Core is reachable — first launch can take a minute.',
  'onboarding.contextGathering.coreAliveProbing': 'Checking core connection…',
  'onboarding.contextGathering.coreUnreachable':
    'Core is not responding. You can continue and try again later.',
  'onboarding.contextGathering.errorDesc':
    "Your chat is ready. We'll keep building your full profile in the background, so you can continue now and refine it over time.",
  'onboarding.contextGathering.stillWorkingDesc':
    'First launch can take 30–60 seconds while we warm up your local model and tools. You can continue to chat at any time — profile build keeps running in the background.',
  'onboarding.contextGathering.stillWorkingTitle': 'Still working on your profile…',
  'onboarding.contextGathering.title': 'Context Gathering',
  'openhuman.team_list_teams': 'Team list teams',
  'overlay.ariaAttention': 'Attention message',
  'overlay.ariaCompanion': 'Companion active',
  'overlay.ariaOrb': 'OpenHuman overlay',
  'overlay.ariaVoiceActive': 'Voice input active',
  'overlay.companion.error': 'Error',
  'overlay.companion.listening': 'Listening…',
  'overlay.companion.pointing': 'Pointing…',
  'overlay.companion.speaking': 'Speaking…',
  'overlay.companion.thinking': 'Thinking…',
  'overlay.orbTitle': 'Drag to move · Double-click to reset position',
  'pages.settings.account.connections': 'Connections',
  'pages.settings.account.connectionsDesc': 'Review and manage linked account connections',
  'pages.settings.account.migration': 'Import from another assistant',
  'pages.settings.account.migrationDesc':
    'Bring memory and notes over from OpenClaw (Hermes coming soon)',
  'pages.settings.account.privacy': 'Privacy',
  'pages.settings.account.privacyDesc': 'Control what data leaves your computer',
  'pages.settings.account.recoveryPhrase': 'Recovery phrase',
  'pages.settings.account.recoveryPhraseDesc': 'View and back up your account recovery phrase',
  'pages.settings.account.team': 'Team',
  'pages.settings.account.teamDesc': 'Manage team members and permissions',
  'pages.settings.accountSection.description':
    'Recovery phrase, team, connections, and privacy settings.',
  'pages.settings.accountSection.title': 'Account',
  'pages.settings.ai.llm': 'LLM',
  'pages.settings.ai.llmDesc': 'Language model provider and routing',
  'pages.settings.ai.voice': 'Voice',
  'pages.settings.ai.voiceDesc': 'Speech-to-text and text-to-speech settings',
  'pages.settings.aiSection.description':
    'Language model providers, local Ollama, and voice (STT / TTS).',
  'pages.settings.aiSection.title': 'AI',
  'pages.settings.features.desktopCompanion': 'Desktop Companion',
  'pages.settings.features.desktopCompanionDesc':
    'Voice assistant with screen awareness — listens, sees, speaks, points',
  'pages.settings.features.messagingChannels': 'Messaging channels',
  'pages.settings.features.messagingChannelsDesc': 'Messaging channels desc',
  'pages.settings.features.notifications': 'Notifications',
  'pages.settings.features.notificationsDesc': 'Notifications desc',
  'pages.settings.features.screenAwareness': 'Screen awareness',
  'pages.settings.features.screenAwarenessDesc': 'Screen awareness desc',
  'pages.settings.features.tools': 'Tools',
  'pages.settings.features.toolsDesc': 'Tools desc',
  'pages.settings.featuresSection.description': 'Screen awareness, messaging, and tools.',
  'pages.settings.featuresSection.title': 'Features',
  'privacy.dataKind.credentials': 'Credentials',
  'privacy.dataKind.derived': 'Derived',
  'privacy.dataKind.diagnostics': 'Diagnostics',
  'privacy.dataKind.metadata': 'Metadata',
  'privacy.dataKind.raw': 'Raw',
  'privacy.whatLeaves.link.label': 'What leaves my computer?',
  'rewards.community.achievementsUnlocked': '{unlocked} of {total} achievements unlocked',
  'rewards.community.connectDiscord': 'Connect discord',
  'rewards.community.cumulativeTokens': 'Cumulative tokens',
  'rewards.community.currentStreak': 'Current streak',
  'rewards.community.discordLinkedNotInGuild': 'Discord linked — not yet a server member',
  'rewards.community.discordMember': 'Joined the server',
  'rewards.community.discordNotLinked': 'Discord not connected',
  'rewards.community.discordServer': 'Discord server',
  'rewards.community.discordStatusUnavailable': 'Discord status unavailable',
  'rewards.community.discordWaiting': 'Waiting for Discord…',
  'rewards.community.heroSubtitle': 'Refer friends and complete challenges to earn credits.',
  'rewards.community.heroTitle': 'Earn rewards with OpenHuman',
  'rewards.community.joinDiscord': 'Join Discord',
  'rewards.community.loadingRewards': 'Loading rewards…',
  'rewards.community.locked': 'Locked',
  'rewards.community.retrying': 'Retrying…',
  'rewards.community.rolesAndRewards': 'Roles & Rewards',
  'rewards.community.streakDays': '{n}',
  'rewards.community.syncPending': 'Rewards sync pending',
  'rewards.community.syncPendingDesc': 'Your rewards are syncing. Check back shortly.',
  'rewards.community.syncUnavailable': 'Sync unavailable',
  'rewards.community.tryAgain': 'Retrying…',
  'rewards.community.unknown': 'Unknown',
  'rewards.community.unlocked': 'Unlocked',
  'rewards.community.yourProgress': 'Your Progress',
  'rewards.coupon.colCode': 'Code',
  'rewards.coupon.colRedeemed': 'Redeemed',
  'rewards.coupon.colReward': 'Reward',
  'rewards.coupon.colStatus': 'Status',
  'rewards.coupon.loadingHistory': 'Loading reward history…',
  'rewards.coupon.noCodes': 'No reward codes redeemed yet.',
  'rewards.coupon.pending': 'Pending',
  'rewards.coupon.placeholder': 'Coupon code',
  'rewards.coupon.promoCredits': 'Promo credits',
  'rewards.coupon.recentRedemptions': 'Recent redemptions',
  'rewards.coupon.redeemAccepted':
    '{code} accepted. {amount} will unlock after the required action is completed.',
  'rewards.coupon.redeemButton': 'Redeem Code',
  'rewards.coupon.redeemSuccess': '{code} redeemed. {amount} was added to your credits.',
  'rewards.coupon.redeemedCodes': 'Redeemed codes',
  'rewards.coupon.redeeming': 'Redeeming...',
  'rewards.coupon.statusApplied': 'Applied',
  'rewards.coupon.statusPendingAction': 'Pending action',
  'rewards.coupon.statusRedeemed': 'Redeemed',
  'rewards.coupon.subtitle': 'Enter a coupon code to add credits to your account.',
  'rewards.coupon.title': 'Redeem a coupon code',
  'rewards.referralSection.activity': 'Referral activity',
  'rewards.referralSection.apply': 'Applying…',
  'rewards.referralSection.applying': 'Applying…',
  'rewards.referralSection.colReferredUser': 'Referred user',
  'rewards.referralSection.colReward': 'Reward',
  'rewards.referralSection.colStatus': 'Status',
  'rewards.referralSection.colUpdated': 'Updated',
  'rewards.referralSection.completed': 'Completed',
  'rewards.referralSection.copyCode': 'Copy code',
  'rewards.referralSection.copyFailed': 'Copy failed',
  'rewards.referralSection.haveCode': 'Have a referral code?',
  'rewards.referralSection.haveCodeDesc': 'Enter it below to link it to your account.',
  'rewards.referralSection.linked': 'Linked',
  'rewards.referralSection.linkedCode': 'Linked',
  'rewards.referralSection.loading': 'Loading referral program…',
  'rewards.referralSection.noReferrals': 'No referrals',
  'rewards.referralSection.pendingReferrals': 'Pending referrals',
  'rewards.referralSection.placeholder': 'Referral code',
  'rewards.referralSection.share': 'Share',
  'rewards.referralSection.statusCompleted': 'Completed',
  'rewards.referralSection.statusExpired': 'Expired',
  'rewards.referralSection.statusJoined': 'Joined',
  'rewards.referralSection.subtitle':
    'Share your code and earn credits for every friend who joins.',
  'rewards.referralSection.title': 'Invite friends, earn credits',
  'rewards.referralSection.totalEarned': 'Total earned',
  'rewards.referralSection.yourCode': 'Your code',
  'settings.ai.addCloudProvider': 'Add cloud provider',
  'settings.ai.addProvider': 'Add Provider',
  'settings.ai.apiKeyFieldLabel': 'API Key',
  'settings.ai.apiKeyRequired': 'Please paste your API key to continue.',
  'settings.ai.apiKeyStoredEncrypted': 'Your API key is stored encrypted on this device.',
  'settings.ai.apiKeysEncrypted': 'auth-profiles.json',
  'settings.ai.clearStoredKey': 'Clear stored key',
  'settings.ai.connectProvider': 'Connect',
  'settings.ai.customRouting': 'Custom routing',
  'settings.ai.defaultResolvesTo': 'OpenHuman',
  'settings.ai.discard': 'Discard',
  'settings.ai.editProvider': 'Edit {label}',
  'settings.ai.llmProviders': 'LLM Providers',
  'settings.ai.llmProvidersDesc': 'Add and configure language model providers.',
  'settings.ai.localOllama': 'Local (Ollama)',
  'settings.ai.modelLabel': 'Model',
  'settings.ai.noCustomProviders': 'No custom providers',
  'settings.ai.providerLabel': 'Provider',
  'settings.ai.routing': 'Routing',
  'settings.ai.routingCustom': 'Custom routing',
  'settings.ai.routingDefault': 'Default',
  'settings.ai.routingDesc': 'Choose which model handles each type of workload.',
  'settings.ai.saveChanges': 'Save Changes',
  'settings.ai.saving': 'Saving…',
  'settings.ai.unsavedChange': 'unsaved change',
  'settings.ai.unsavedChanges': 'unsaved changes',
  'settings.ai.workloadGroupBackground': 'Background tasks',
  'settings.ai.workloadGroupChat': 'Chat and conversations',
  'settings.autocomplete.appFilter.acceptSuggestion': 'Accept suggestion',
  'settings.autocomplete.appFilter.contextOverride': 'Context Override (optional)',
  'settings.autocomplete.appFilter.debugFocus': 'Debug focus',
  'settings.autocomplete.appFilter.getSuggestion': 'Get suggestion',
  'settings.autocomplete.appFilter.liveLogs': 'Live Logs',
  'settings.autocomplete.appFilter.noLogs': ') :',
  'settings.autocomplete.appFilter.refreshStatus': 'Refreshing…',
  'settings.autocomplete.appFilter.refreshing': 'Refreshing…',
  'settings.autocomplete.appFilter.runtime': 'Runtime',
  'settings.autocomplete.appFilter.test': 'Test',
  'settings.autocomplete.completionStyle.acceptedCompletion':
    '{count} accepted completion stored — used to personalize future suggestions.',
  'settings.autocomplete.completionStyle.acceptedCompletions':
    '{count} accepted completions stored — used to personalize future suggestions.',
  'settings.autocomplete.completionStyle.clearHistory': 'Clear History',
  'settings.autocomplete.completionStyle.clearing': 'Clearing…',
  'settings.autocomplete.completionStyle.debounce': 'Debounce (ms)',
  'settings.autocomplete.completionStyle.enabled': 'Enabled',
  'settings.autocomplete.completionStyle.maxChars': 'Max Chars',
  'settings.autocomplete.completionStyle.noHistory':
    'No accepted completions yet. Accept suggestions with Tab to start personalising.',
  'settings.autocomplete.completionStyle.overlayTtl': 'Overlay TTL (ms)',
  'settings.autocomplete.completionStyle.personalizationHistory': 'Personalization History',
  'settings.autocomplete.completionStyle.styleExamples': 'Style Examples (one per line)',
  'settings.autocomplete.completionStyle.styleInstructions': 'Style Instructions',
  'settings.billing.autoRecharge.addAmount': 'Add this amount',
  'settings.billing.autoRecharge.addCard': 'Add card',
  'settings.billing.autoRecharge.amountHint': 'Will be charged to your default payment method.',
  'settings.billing.autoRecharge.defaultCard': 'Default card',
  'settings.billing.autoRecharge.lastRechargeFailed': 'Last recharge failed',
  'settings.billing.autoRecharge.lastRecharged': 'Last recharged',
  'settings.billing.autoRecharge.noCards': 'No cards',
  'settings.billing.autoRecharge.paymentMethods': 'Payment Methods',
  'settings.billing.autoRecharge.rechargeInProgress': 'Recharge in progress',
  'settings.billing.autoRecharge.rechargeWhen': 'Recharge when balance drops below',
  'settings.billing.autoRecharge.saveSettings': 'Save Settings',
  'settings.billing.autoRecharge.saving': 'Saving…',
  'settings.billing.autoRecharge.setDefault': 'Set as default',
  'settings.billing.autoRecharge.subtitle':
    'Top up your credits automatically when your balance runs low.',
  'settings.billing.autoRecharge.title': 'Enable Auto-Recharge',
  'settings.billing.autoRecharge.toggleAriaLabel': 'Toggle auto-recharge',
  'settings.billing.autoRecharge.weeklyLimit': 'Weekly spending limit',
  'settings.billing.history.desc': 'Your recent transactions and invoices',
  'settings.billing.history.empty': 'No billing history yet',
  'settings.billing.history.openPortal': 'Open portal',
  'settings.billing.history.posted': 'Posted',
  'settings.billing.history.title': 'Billing History',
  'settings.billing.inferenceBudget.cycleEnds': 'Cycle ends',
  'settings.billing.inferenceBudget.exhausted': 'Exhausted',
  'settings.billing.inferenceBudget.loadError': 'Failed to load budget information.',
  'settings.billing.inferenceBudget.noBudgetDesc':
    'No recurring budget configured for this period.',
  'settings.billing.inferenceBudget.noRecurringBudget': 'No recurring budget',
  'settings.billing.inferenceBudget.remaining': 'Remaining',
  'settings.billing.inferenceBudget.tenHourCap': '10-hour cap',
  'settings.billing.inferenceBudget.title': 'Inference Budget',
  'settings.billing.payAsYouGo.available': 'Available',
  'settings.billing.payAsYouGo.chargeCustomAmount': 'Opening…',
  'settings.billing.payAsYouGo.chooseTopUpDesc': 'Select an amount to add to your credit balance.',
  'settings.billing.payAsYouGo.chooseTopUpTitle': 'Top Up Credits',
  'settings.billing.payAsYouGo.creditBalanceDesc': 'Your available credit for AI usage.',
  'settings.billing.payAsYouGo.creditBalanceTitle': 'Credit Balance',
  'settings.billing.payAsYouGo.customAmount': 'Custom amount',
  'settings.billing.payAsYouGo.enterAmount': 'Enter amount',
  'settings.billing.payAsYouGo.opening': '{amount}',
  'settings.billing.payAsYouGo.promotionalCredits': 'Promotional Credits',
  'settings.billing.payAsYouGo.topUpBalance': 'Top-up Balance',
  'settings.billing.payAsYouGo.topUpCredits': 'Top Up Credits',
  'settings.billing.payAsYouGo.unableToLoad': 'Unable to load balance.',
  'settings.billing.subscription.annual': 'Annual',
  'settings.billing.subscription.billedAnnually': 'Billed annually',
  'settings.billing.subscription.chooseSubtitle': 'Upgrade to unlock more usage and features.',
  'settings.billing.subscription.chooseTitle': 'Choose a Plan',
  'settings.billing.subscription.cryptoDesc': 'Pay with cryptocurrency via our payment gateway.',
  'settings.billing.subscription.cryptoQuestion': 'Want to pay with crypto?',
  'settings.billing.subscription.current': 'Current',
  'settings.billing.subscription.currentPlan': 'Current plan',
  'settings.billing.subscription.monthly': 'Monthly',
  'settings.billing.subscription.paymentConfirmed': 'Payment confirmed',
  'settings.billing.subscription.perMonth': 'Per month',
  'settings.billing.subscription.popular': 'Popular',
  'settings.billing.subscription.save': '{pct}',
  'settings.billing.subscription.upgrade': 'Upgrade',
  'settings.billing.subscription.waiting': 'Waiting',
  'settings.billing.subscription.waitingPayment': 'Waiting payment',
  'settings.composio.apiKeyDesc': 'A Composio API key is currently stored on this device.',
  'settings.composio.apiKeyLabel': 'Composio API key',
  'settings.composio.apiKeyStored': 'API key stored',
  'settings.composio.apiKeyStoredPlaceholder': '••••••••••••••••',
  'settings.composio.clearedToBackend': 'Switched to Backend mode',
  'settings.composio.confirmItem1': 'An account at app.composio.dev with an API key',
  'settings.composio.confirmItem2':
    'To re-link each integration through your personal Composio account',
  'settings.composio.confirmItem3':
    "Note: Composio triggers (real-time webhooks) don't fire in Direct mode yet — only synchronous tool calls",
  'settings.composio.confirmNeedItems': "You'll need:",
  'settings.composio.confirmSwitch': 'I understand, switch to Direct',
  'settings.composio.confirmTitle': '⚠️ Switching to Direct mode',
  'settings.composio.confirmWarning':
    "Your existing integrations (Gmail, Slack, GitHub, etc. linked through OpenHuman) won't be visible — they live in the OpenHuman-managed Composio tenant.",
  'settings.composio.intro':
    'Composio integrates 250+ external apps as tools your agent can call. Choose how those tool calls are routed.',
  'settings.composio.modeDirect': 'Direct (bring your own API key)',
  'settings.composio.modeDirectDesc':
    'Calls go to backend.composio.dev directly. Sovereign / offline-friendly. Tool execution works synchronously; real-time trigger webhooks are not yet routed in direct mode (follow-up issue).',
  'settings.composio.modeManaged': 'Managed (OpenHuman handles it for you)',
  'settings.composio.modeManagedDesc':
    'OpenHuman proxies tool calls through our backend (recommended). Auth is brokered; you never paste a Composio API key. Webhooks are fully routed.',
  'settings.composio.routingMode': 'Routing mode',
  'settings.composio.saveErrorNoKey': 'Failed to save. Direct mode requires a non-empty API key.',
  'settings.composio.saving': 'Saving…',
  'settings.composio.switching': 'Switching…',
  'settings.cron.jobs.desc': 'View and manage scheduled jobs running in the core.',
  'settings.cron.jobs.empty': 'No core cron jobs found.',
  'settings.cron.jobs.lastStatus': 'Last status',
  'settings.cron.jobs.loading': 'Loading cron jobs...',
  'settings.cron.jobs.loadingRuns': 'Loading runs…',
  'settings.cron.jobs.nextRun': 'Next run',
  'settings.cron.jobs.pause': 'Pause',
  'settings.cron.jobs.paused': 'Paused',
  'settings.cron.jobs.recentRuns': 'Recent runs',
  'settings.cron.jobs.removing': 'Removing…',
  'settings.cron.jobs.resume': 'Resume',
  'settings.cron.jobs.runningNow': 'Running now…',
  'settings.cron.jobs.saving': 'Saving…',
  'settings.cron.jobs.schedule': 'Schedule',
  'settings.cron.jobs.title': 'Core Cron Jobs',
  'settings.cron.jobs.viewRuns': 'View runs',
  'settings.localModel.deviceCapability.active': 'Active',
  'settings.localModel.deviceCapability.appliedTier': 'Applied tier',
  'settings.localModel.deviceCapability.applying': 'Applying',
  'settings.localModel.deviceCapability.cores': '{count}',
  'settings.localModel.deviceCapability.couldNotLoadPresets': 'Could not load presets',
  'settings.localModel.deviceCapability.cpu': 'CPU',
  'settings.localModel.deviceCapability.customModelIds': 'Custom model IDs',
  'settings.localModel.deviceCapability.detected': 'Detected',
  'settings.localModel.deviceCapability.disabled': 'Disabled',
  'settings.localModel.deviceCapability.disabledDesc':
    'Local AI is off. All inference uses the cloud.',
  'settings.localModel.deviceCapability.downloadingModels': '(downloading models)',
  'settings.localModel.deviceCapability.downloadingSetupDesc':
    'Downloading the OllamaSetup installer (~2 GB) and unpacking it. This can take a minute on first install.',
  'settings.localModel.deviceCapability.failedToApplyPreset': 'Failed to apply preset',
  'settings.localModel.deviceCapability.gpu': 'GPU',
  'settings.localModel.deviceCapability.installFailed': 'Ollama install failed',
  'settings.localModel.deviceCapability.installFailedDesc':
    'The installer exited before Ollama was usable. Click retry to try again, or install manually from ollama.com.',
  'settings.localModel.deviceCapability.installFirst': 'Run Ollama first.',
  'settings.localModel.deviceCapability.installFirstDesc':
    'Local tiers depend on an externally managed Ollama endpoint. Start it yourself, pull the models you want, and keep using "Disabled (cloud fallback)" until the runtime is reachable.',
  'settings.localModel.deviceCapability.installOllamaFirst': 'Run Ollama first to use this tier',
  'settings.localModel.deviceCapability.installingOllama': 'Installing Ollama',
  'settings.localModel.deviceCapability.loadingDeviceInfo': 'Loading device info',
  'settings.localModel.deviceCapability.localAiDisabled':
    'Local AI disabled — using cloud fallback.',
  'settings.localModel.deviceCapability.modelTier': 'Model Tier',
  'settings.localModel.deviceCapability.needsOllama': 'Needs Ollama',
  'settings.localModel.deviceCapability.notDetected': 'Not detected',
  'settings.localModel.deviceCapability.ram': 'RAM',
  'settings.localModel.deviceCapability.recommended': 'Recommended',
  'settings.localModel.deviceCapability.retryInstall': 'Retrying…',
  'settings.localModel.deviceCapability.retrying': 'Retrying…',
  'settings.localModel.deviceCapability.starting': 'Starting…',
  'settings.localModel.download.audioPathPlaceholder': 'Absolute path to audio file',
  'settings.localModel.download.capabilityAssets': 'Capability Assets',
  'settings.localModel.download.downloading': 'Downloading...',
  'settings.localModel.download.embeddingPlaceholder': 'One input string per line...',
  'settings.localModel.download.noThinkMode': 'No think mode',
  'settings.localModel.download.promptPlaceholder':
    'Type any prompt and run it against the local model...',
  'settings.localModel.download.quantizationPref': 'Quantization preference',
  'settings.localModel.download.runEmbeddingTest': 'Run Embedding Test',
  'settings.localModel.download.runPromptTest': 'Run Prompt Test',
  'settings.localModel.download.runSummaryTest': 'Run Summary Test',
  'settings.localModel.download.runTranscriptionTest': 'Run Transcription Test',
  'settings.localModel.download.runTtsTest': 'Run TTS Test',
  'settings.localModel.download.runVisionTest': 'Run Vision Test',
  'settings.localModel.download.running': 'Running...',
  'settings.localModel.download.runningPrompt': 'Running prompt',
  'settings.localModel.download.summarizePlaceholder':
    'Paste text to summarize with the local model...',
  'settings.localModel.download.testCustomPrompt': 'Test Custom Prompt',
  'settings.localModel.download.testEmbeddings': 'Test Embeddings',
  'settings.localModel.download.testSummarization': 'Test Summarization',
  'settings.localModel.download.testVisionPrompt': 'Test Vision Prompt',
  'settings.localModel.download.testVoiceInput': 'Test Voice Input (STT)',
  'settings.localModel.download.testVoiceOutput': 'Test Voice Output (TTS)',
  'settings.localModel.download.ttsOutputPlaceholder': 'Optional output WAV path',
  'settings.localModel.download.ttsPlaceholder': 'Enter text to synthesize...',
  'settings.localModel.download.visionImagePlaceholder':
    'One image reference per line (data URI, URL, or local path marker)',
  'settings.localModel.download.visionPromptPlaceholder': 'Enter a prompt for the vision model...',
  'settings.localModel.status.allChecksPassed': 'All checks passed',
  'settings.localModel.status.artifact': 'Artifact',
  'settings.localModel.status.backend': 'Backend',
  'settings.localModel.status.binary': 'Binary',
  'settings.localModel.status.bootstrapResume': 'Bootstrap / Resume',
  'settings.localModel.status.checking': 'Checking...',
  'settings.localModel.status.checkingOllama': 'Checking Ollama',
  'settings.localModel.status.customLocation': 'Custom location',
  'settings.localModel.status.customLocationDesc': 'Point to a custom Ollama binary location.',
  'settings.localModel.status.diagnosticsHint':
    'Click "Run Diagnostics" to verify Ollama is running and models are installed.',
  'settings.localModel.status.downloadingUnknown': 'Downloading (size unknown)',
  'settings.localModel.status.eta': 'ETA',
  'settings.localModel.status.expectedModels': 'Expected models',
  'settings.localModel.status.forceRebootstrap': 'Force Re-bootstrap',
  'settings.localModel.status.generationTps': 'Generation TPS',
  'settings.localModel.status.hideErrorDetails': 'Hide error details',
  'settings.localModel.status.installManually': 'Install manually',
  'settings.localModel.status.installManuallyFrom': 'Install manually from',
  'settings.localModel.status.installOllama': 'Install Ollama',
  'settings.localModel.status.installedModels': 'Installed models',
  'settings.localModel.status.installing': 'Installing...',
  'settings.localModel.status.installingOllama': 'Installing Ollama runtime...',
  'settings.localModel.status.issues': 'Issues',
  'settings.localModel.status.issuesFound': '{count} issue(s) found',
  'settings.localModel.status.lastLatency': 'Last Latency',
  'settings.localModel.status.model': 'Model',
  'settings.localModel.status.notFound': 'Not found',
  'settings.localModel.status.notRunning': 'Not running',
  'settings.localModel.status.ollamaBinaryPath': 'Ollama binary path',
  'localModel.ollamaServer.helperText': 'Example: http://192.168.1.5:11434',
  'localModel.ollamaServer.label': 'Ollama Server URL',
  'localModel.ollamaServer.modelCount': 'models',
  'localModel.ollamaServer.placeholder': 'http://localhost:11434',
  'localModel.ollamaServer.reachable': 'Reachable',
  'localModel.ollamaServer.resetButton': 'Reset to default',
  'localModel.ollamaServer.saveButton': 'Save',
  'localModel.ollamaServer.testButton': 'Test Connection',
  'localModel.ollamaServer.unreachable': 'Unreachable',
  'localModel.ollamaServer.validationError': 'Must be a valid http:// or https:// URL',
  'settings.localModel.status.ollamaDiagnostics': 'Ollama Diagnostics',
  'settings.localModel.status.ollamaNotInstalled': 'Ollama runtime unavailable',
  'settings.localModel.status.ollamaNotInstalledDesc':
    'OpenHuman now treats Ollama as an external inference runtime. Start your own Ollama server, pull the models you want, and point workload routing at it.',
  'settings.localModel.status.progress': 'Progress',
  'settings.localModel.status.provider': 'Provider',
  'settings.localModel.status.retryBootstrap': 'Retry Bootstrap',
  'settings.localModel.status.runDiagnostics': 'Run Diagnostics',
  'settings.localModel.status.running': 'Running',
  'settings.localModel.status.runningExternalProcess': 'Running via external process',
  'settings.localModel.status.runtimeStatus': 'Runtime Status',
  'settings.localModel.status.server': 'Server',
  'settings.localModel.status.setPath': 'Set Path',
  'settings.localModel.status.setting': 'Setting...',
  'settings.localModel.status.showErrorDetails': 'Show error details',
  'settings.localModel.status.showInstallErrorDetails': 'Show error details',
  'settings.localModel.status.suggestedFixes': 'Suggested fixes',
  'settings.localModel.status.thenSetPath': 'Then set path',
  'settings.localModel.status.triggering': 'Triggering...',
  'settings.localModel.status.unavailable': 'Unavailable',
  'settings.localModel.status.working': 'Working...',
  'settings.developerMenu.ai.title': 'AI Configuration',
  'settings.developerMenu.ai.desc':
    'Cloud providers, local Ollama models, and per-workload routing',
  'settings.developerMenu.screenAwareness.title': 'Screen Awareness',
  'settings.developerMenu.screenAwareness.desc':
    'Screen capture permissions, monitoring policy, and session controls',
  'settings.developerMenu.messagingChannels.title': 'Messaging Channels',
  'settings.developerMenu.messagingChannels.desc':
    'Configure Telegram/Discord auth modes and default channel routing',
  'settings.developerMenu.tools.title': 'Tools',
  'settings.developerMenu.tools.desc':
    'Enable or disable capabilities OpenHuman can use on your behalf',
  'settings.developerMenu.agentChat.title': 'Agent Chat',
  'settings.developerMenu.agentChat.desc':
    'Test agent conversation with model and temperature overrides',
  'settings.developerMenu.cronJobs.title': 'Cron Jobs',
  'settings.developerMenu.cronJobs.desc': 'View and configure scheduled jobs for runtime skills',
  'settings.developerMenu.localModelDebug.title': 'Local Model Debug',
  'settings.developerMenu.localModelDebug.desc':
    'Ollama config, asset downloads, model tests, and diagnostics',
  'settings.developerMenu.webhooks.title': 'Webhooks',
  'settings.developerMenu.webhooks.desc':
    'Inspect runtime webhook registrations and captured request logs',
  'settings.developerMenu.intelligence.title': 'Intelligence',
  'settings.developerMenu.intelligence.desc':
    'Memory workspace, subconscious engine, dreams, and settings',
  'settings.developerMenu.notificationRouting.title': 'Notification Routing',
  'settings.developerMenu.notificationRouting.desc':
    'AI importance scoring and orchestrator escalation for integration alerts',
  'settings.developerMenu.composeioTriggers.title': 'ComposeIO Triggers',
  'settings.developerMenu.composeioTriggers.desc': 'View ComposeIO trigger history and archive',
  'settings.developerMenu.composioRouting.title': 'Composio Routing (Direct Mode)',
  'settings.developerMenu.composioRouting.desc':
    'Bring your own Composio API key and route calls directly to backend.composio.dev',
  'settings.developerMenu.integrationTriggers.title': 'Integration Triggers',
  'settings.developerMenu.integrationTriggers.desc':
    'Configure AI triage settings for Composio integration triggers',
  'settings.developerMenu.mcpServer.title': 'MCP Server',
  'settings.developerMenu.mcpServer.desc': 'Configure external MCP clients to connect to OpenHuman',
  'settings.mcpServer.title': 'MCP Server',
  'settings.mcpServer.toolsSectionTitle': 'Available Tools',
  'settings.mcpServer.toolsSectionDesc':
    'Tools exposed via the MCP stdio server when running openhuman-core mcp',
  'settings.mcpServer.configSectionTitle': 'Client Configuration',
  'settings.mcpServer.configSectionDesc':
    'Select your MCP client to generate the correct configuration snippet',
  'settings.mcpServer.copySnippet': 'Copy to Clipboard',
  'settings.mcpServer.copied': 'Copied!',
  'settings.mcpServer.openConfigFile': 'Open Config File',
  'settings.mcpServer.binaryPathNotFound':
    'OpenHuman binary not found. If running from source, build with: cargo build --bin openhuman-core',
  'settings.mcpServer.openConfigError': 'Failed to open config file',
  'settings.mcpServer.clientClaudeDesktop': 'Claude Desktop',
  'settings.mcpServer.clientCursor': 'Cursor',
  'settings.mcpServer.clientCodex': 'Codex',
  'settings.mcpServer.clientZed': 'Zed',
  'settings.mcpServer.configFilePath': 'Config file',
  'settings.mcpServer.clientSelectorAriaLabel': 'MCP client selector',
  'settings.appearance.menuDesc': 'Pick light, dark, or match your system theme',
  'settings.appearance.title': 'Appearance',
  'settings.appearance.themeHeading': 'Theme',
  'settings.appearance.themeAria': 'Theme',
  'settings.appearance.modeLight': 'Light',
  'settings.appearance.modeLightDesc': 'Bright surfaces, dark text.',
  'settings.appearance.modeDark': 'Dark',
  'settings.appearance.modeDarkDesc': 'Dim surfaces, easier on the eyes after dusk.',
  'settings.appearance.modeSystem': 'Match system',
  'settings.appearance.modeSystemDesc': 'Follow your OS appearance setting.',
  'settings.appearance.helperText':
    'Dark mode switches the entire app — chat, settings, panels — to a dim palette. "Match system" follows your OS appearance and updates live.',
  'settings.mascot.active': 'Active',
  'settings.mascot.characterDesc': 'Choose your OpenHuman character.',
  'settings.mascot.characterHeading': 'Character',
  'settings.mascot.characterPreview': 'Preview',
  'settings.mascot.characterStates': 'states',
  'settings.mascot.characterVisemes': 'visemes',
  'settings.mascot.colorAria': 'OpenHuman color',
  'settings.mascot.colorDesc': 'Pick a color theme for your character.',
  'settings.mascot.colorHeading': 'Color',
  'settings.mascot.colorBlack': 'Black',
  'settings.mascot.colorBurgundy': 'Burgundy',
  'settings.mascot.colorGreen': 'Green',
  'settings.mascot.colorNavy': 'Navy',
  'settings.mascot.colorYellow': 'Yellow',
  'settings.mascot.libraryUnavailable': 'OpenHuman library unavailable',
  'settings.mascot.title': 'OpenHuman',
  'settings.mascot.loadingLibrary': 'Loading OpenHuman library…',
  'settings.mascot.localDefault': 'Local OpenHuman (default)',
  'settings.mascot.menuTitle': 'Mascot',
  'settings.mascot.menuDesc': 'Pick the mascot color used across the app',
  'settings.mascot.noCharacters': 'No OpenHuman characters are available yet',
  'settings.mascot.noColorVariants': 'No color variants',
  'settings.mascot.voice.current': 'current',
  'settings.mascot.voice.customDesc':
    'Find voice ids at api.elevenlabs.io/v1/voices or your ElevenLabs dashboard. Only the id is stored — your API key stays on the backend.',
  'settings.mascot.voice.customHeading': 'Custom voice id',
  'settings.mascot.voice.customOption': 'Other (paste voice id)…',
  'settings.mascot.voice.desc':
    'Pick the ElevenLabs voice the mascot uses for spoken replies. Filter by gender, pick from the curated list, paste a custom id, or let the app pick a voice that matches your interface language.',
  'settings.mascot.voice.genderFemale': 'Female',
  'settings.mascot.voice.genderHeading': 'Voice gender',
  'settings.mascot.voice.genderMale': 'Male',
  'settings.mascot.voice.heading': 'Voice',
  'settings.mascot.voice.preset': 'Voice preset',
  'settings.mascot.voice.presetHeading': 'Voice preset',
  'settings.mascot.voice.preview': 'Preview voice',
  'settings.mascot.voice.previewError': 'Voice preview failed',
  'settings.mascot.voice.previewing': 'Previewing…',
  'settings.mascot.voice.reset': 'Reset to default',
  'settings.mascot.voice.useLocaleDefault': 'Match the app language',
  'settings.mascot.voice.useLocaleDefaultDesc':
    'Auto-pick a voice for the current interface language.',
  'settings.memoryWindow.balanced.badge': 'Recommended',
  'settings.memoryWindow.balanced.hint':
    'Sensible default — good continuity without burning extra tokens on every run.',
  'settings.memoryWindow.balanced.label': 'Balanced',
  'settings.memoryWindow.description':
    'How much remembered context OpenHuman injects into every new agent run. Larger windows feel more aware of past conversations but use more tokens — and cost more — on every run.',
  'settings.memoryWindow.extended.badge': 'More context',
  'settings.memoryWindow.extended.hint':
    'More long-term memory injected into each run. Higher token cost per turn.',
  'settings.memoryWindow.extended.label': 'Extended',
  'settings.memoryWindow.maximum.badge': 'Highest cost',
  'settings.memoryWindow.maximum.hint':
    'The largest safe window. Best continuity, meaningfully higher token bill on every run.',
  'settings.memoryWindow.maximum.label': 'Maximum',
  'settings.memoryWindow.minimal.badge': 'Cheapest',
  'settings.memoryWindow.minimal.hint':
    'Smallest memory window. Cheapest, fastest, least continuity between runs.',
  'settings.memoryWindow.minimal.label': 'Minimal',
  'settings.memoryWindow.title': 'Long-term memory window',
  'settings.screenIntel.permissions.accessibility': 'Accessibility',
  'settings.screenIntel.permissions.grantHint':
    'Grant these permissions in System Settings, then restart the core.',
  'settings.screenIntel.permissions.inputMonitoring': 'Input Monitoring',
  'settings.screenIntel.permissions.macosAppliesPrivacy':
    'macOS controls these under System Settings → Privacy & Security.',
  'settings.screenIntel.permissions.openInputMonitoring': 'Open Input Monitoring',
  'settings.screenIntel.permissions.refreshStatus': 'Refreshing…',
  'settings.screenIntel.permissions.refreshing': 'Refreshing…',
  'settings.screenIntel.permissions.requestAccessibility': 'Request Accessibility',
  'settings.screenIntel.permissions.requestScreenRecording': 'Request Screen Recording',
  'settings.screenIntel.permissions.requesting': 'Requesting…',
  'settings.screenIntel.permissions.restartRefresh': 'Restarting core…',
  'settings.screenIntel.permissions.restartingCore': 'Restarting core…',
  'settings.screenIntel.permissions.screenRecording': 'Screen Recording',
  'settings.screenIntel.permissions.title': 'Permissions',
  'skills.card.moreActions': 'More actions',
  'skills.create.allowedTools': 'Allowed tools',
  'skills.create.author': 'Author',
  'skills.create.authorPlaceholder': 'Your name',
  'skills.create.commaSeparated': '(comma-separated)',
  'skills.create.createBtn': 'Create skill',
  'skills.create.createError': 'Could not create skill',
  'skills.create.creating': 'Creating…',
  'skills.create.description': 'Description',
  'skills.create.descriptionPlaceholder': 'What does this skill do?',
  'skills.create.license': 'License',
  'skills.create.name': 'Name',
  'skills.create.namePlaceholder': 'e.g. Trade Journal',
  'skills.create.scope': 'Scope',
  'skills.create.scopeProjectHint': '/.openhuman/skills/',
  'skills.create.scopeUserHint':
    'Written to ~/.openhuman/skills/<slug>/SKILL.md — available across all workspaces.',
  'skills.create.slugLabel': 'Slug',
  'skills.create.subtitle': 'SKILL.md',
  'skills.create.tags': 'Tags',
  'skills.create.title': 'New skill',
  'skills.detail.allowedTools': 'Allowed tools',
  'skills.detail.author': 'Author',
  'skills.detail.bundledResources': 'Bundled resources',
  'skills.detail.closeAriaLabel': 'Close skill details',
  'skills.detail.location': 'Location',
  'skills.detail.noBundledResources': 'No bundled resources.',
  'skills.detail.tags': 'Tags',
  'skills.detail.warnings': 'Warnings',
  'skills.install.fetchLog': 'Fetch log',
  'skills.install.installBtn': 'Installing…',
  'skills.install.installComplete': 'Install complete',
  'skills.install.installing': 'Installing…',
  'skills.install.parseWarnings': 'Parse warnings',
  'skills.install.rawError': 'Raw error',
  'skills.install.timeoutHint': '(seconds, optional)',
  'skills.install.timeoutLabel': 'Timeout',
  'skills.install.title': 'Install skill from URL',
  'skills.install.urlLabel': 'Skill URL',
  'skills.meetingBots.bannerDesc':
    'OpenHuman joins calls silently and handles notes and follow-ups automatically.',
  'skills.meetingBots.bannerTitle': 'Send OpenHuman to your next meeting',
  'skills.meetingBots.busyTitle': 'OpenHuman is busy',
  'skills.meetingBots.comingSoon': '{label} coming soon',
  'skills.meetingBots.couldNotStartTitle': 'Could not start OpenHuman',
  'skills.meetingBots.displayName': 'Display name',
  'skills.meetingBots.failedToStart': 'Failed to start OpenHuman.',
  'skills.meetingBots.joiningMessage': 'It should appear as a participant in a few seconds.',
  'skills.meetingBots.joiningTitle': 'OpenHuman is joining the meeting',
  'skills.meetingBots.meetingLink': 'Meeting link',
  'skills.meetingBots.modalAriaLabel': 'Send OpenHuman to a meeting',
  'skills.meetingBots.modalDesc':
    'OpenHuman will join as a silent participant and help with notes and follow-ups.',
  'skills.meetingBots.modalTitle': 'Send OpenHuman to a meeting',
  'skills.meetingBots.newBadge': 'New',
  'skills.meetingBots.sendTo': 'Send to {label}',
  'skills.meetingBots.starting': 'Starting…',
  'skills.resource.preview.closeAriaLabel': 'Close preview',
  'skills.resource.preview.failed': 'Preview failed',
  'skills.resource.preview.loading': 'Loading preview…',
  'skills.resource.tree.empty': 'No bundled resources.',
  'skills.search.placeholder': 'Search skills…',
  'skills.setup.autocomplete.acceptKey': 'Accept key',
  'skills.setup.autocomplete.activeDesc': 'Inline completions are running and ready.',
  'skills.setup.autocomplete.activeTitle': 'Auto-Complete is Active',
  'skills.setup.autocomplete.customizeSettings': 'Customize settings',
  'skills.setup.autocomplete.debounce': 'Debounce',
  'skills.setup.autocomplete.description': 'AI-powered inline text completions as you type.',
  'skills.setup.autocomplete.enableBtn': 'Enabling...',
  'skills.setup.autocomplete.enableError': 'Failed to enable autocomplete',
  'skills.setup.autocomplete.enabling': 'Enabling...',
  'skills.setup.autocomplete.notSupported': 'Not supported',
  'skills.setup.autocomplete.stepEnable': 'Enable inline completions',
  'skills.setup.autocomplete.stepSuccess': 'Ready to go',
  'skills.setup.autocomplete.stylePreset': 'Style preset',
  'skills.setup.autocomplete.stylePresetValue': 'Balanced (configurable later)',
  'skills.setup.autocomplete.title': 'Text Auto-Complete',
  'skills.setup.screenIntel.activeDesc':
    'Screen Intelligence is running and reading your active window.',
  'skills.setup.screenIntel.activeTitle': 'Screen Intelligence is Enabled',
  'skills.setup.screenIntel.advancedSettings': 'Advanced settings',
  'skills.setup.screenIntel.allGranted': 'All permissions granted',
  'skills.setup.screenIntel.captureMode': 'Capture mode',
  'skills.setup.screenIntel.captureModeValue': 'All windows (configurable later)',
  'skills.setup.screenIntel.deniedHint':
    'After granting permissions in System Settings, click below to restart and pick up the changes.',
  'skills.setup.screenIntel.enableBtn': 'Enabling...',
  'skills.setup.screenIntel.enableDesc':
    'Reads what is on your screen and feeds useful context into your agent.',
  'skills.setup.screenIntel.enableError': 'Failed to enable Screen Intelligence',
  'skills.setup.screenIntel.enabling': 'Enabling...',
  'skills.setup.screenIntel.grant': 'Opening...',
  'skills.setup.screenIntel.granted': 'Granted',
  'skills.setup.screenIntel.macosOnly': 'macOS only',
  'skills.setup.screenIntel.opening': 'Opening...',
  'skills.setup.screenIntel.panicHotkey': 'Panic hotkey',
  'skills.setup.screenIntel.permAccessibility': 'Accessibility',
  'skills.setup.screenIntel.permInputMonitoring': 'Input Monitoring',
  'skills.setup.screenIntel.permScreenRecording': 'Screen Recording',
  'skills.setup.screenIntel.permissionsDesc':
    'Screen Intelligence requires accessibility, input monitoring, and screen recording permissions.',
  'skills.setup.screenIntel.refreshStatus': 'Refresh status',
  'skills.setup.screenIntel.restartRefresh': 'Restarting...',
  'skills.setup.screenIntel.restarting': 'Restarting...',
  'skills.setup.screenIntel.stepEnable': 'Enable the skill',
  'skills.setup.screenIntel.stepPermissions': 'Grant permissions',
  'skills.setup.screenIntel.stepSuccess': 'Ready to go',
  'skills.setup.screenIntel.title': 'Screen Intelligence',
  'skills.setup.screenIntel.visionModel': 'Vision model',
  'skills.setup.voice.activation': 'Activation',
  'skills.setup.voice.activeDescPrefix': 'Fn',
  'skills.setup.voice.activeDescSuffix': 'Fn',
  'skills.setup.voice.activeTitle': 'Voice Intelligence is Active',
  'skills.setup.voice.customizeSettings': 'Customize settings',
  'skills.setup.voice.downloadSttBtn': 'Download STT model',
  'skills.setup.voice.enableDesc': 'Dictate text hands-free using your microphone.',
  'skills.setup.voice.hotkey': 'Hotkey',
  'skills.setup.voice.startBtn': 'Starting...',
  'skills.setup.voice.startError': 'Failed to start voice server',
  'skills.setup.voice.starting': 'Starting...',
  'skills.setup.voice.stepEnable': 'Start voice server',
  'skills.setup.voice.stepSetup': 'Model download required',
  'skills.setup.voice.stepSuccess': 'Ready to go',
  'skills.setup.voice.sttNotReady': 'Speech-to-text model not ready',
  'skills.setup.voice.sttNotReadyDesc':
    'Voice Intelligence requires a local Whisper model for transcription. Download it from the Local Model settings.',
  'skills.setup.voice.sttReady': 'Speech-to-text model ready',
  'skills.setup.voice.sttReturnHint': 'The speech-to-text model is loading. Come back in a moment.',
  'skills.setup.voice.title': 'Voice Intelligence',
  'skills.uninstall.couldNotUninstall': 'Could not uninstall',
  'skills.uninstall.description':
    'This permanently deletes the skill directory and all its bundled resources. The agent will stop seeing it at the next turn.',
  'skills.uninstall.title': 'Uninstall',
  'skills.uninstall.uninstallBtn': 'Uninstall',
  'skills.uninstall.uninstalling': 'Uninstalling…',
  'upsell.global.limitMessage': 'Upgrade your plan or top up credits to continue',
  'upsell.global.limitTitle': 'Usage limit reached',
  'upsell.global.nearLimitMessage':
    "You've used {pct}% of your usage limit. Upgrade for higher limits.",
  'upsell.global.nearLimitTitle': 'Approaching usage limit',
  'upsell.usageLimit.bodyBudget': "You've hit your weekly limit. {resetTime}",
  'upsell.usageLimit.bodyRate': "You've hit your 10-hour inference rate limit. {resetTime}",
  'upsell.usageLimit.heading': 'Usage Limit Reached',
  'upsell.usageLimit.notNow': 'Not now',
  'upsell.usageLimit.perWindow': '{amount}',
  'upsell.usageLimit.planIncludes': '{plan}',
  'upsell.usageLimit.resetsIn': 'Resets in {time}',
  'upsell.usageLimit.upgradePlan': 'Upgrade plan',
  'upsell.usageLimit.weeklyInference': '{amount}',
  'walkthrough.tooltip.letsGo': "Let's go!",
  'walkthrough.tooltip.next': 'Next →',
  'walkthrough.tooltip.skip': 'Skip tour',
  'walkthrough.tooltip.stepCounter': '{n} of {total}',
  'webhooks.activity.empty': 'No recent activity',
  'webhooks.activity.title': 'Recent Activity',
  'webhooks.composioHistory.empty': 'Empty',
  'webhooks.composioHistory.metadataId': 'Metadata ID',
  'webhooks.composioHistory.metadataUuid': 'Metadata UUID',
  'webhooks.composioHistory.payload': 'Payload',
  'webhooks.composioHistory.title': 'Composio Trigger History',
  'webhooks.tunnels.active': 'Active',
  'webhooks.tunnels.createFailed': 'Failed to create tunnel',
  'webhooks.tunnels.creating': 'Creating...',
  'webhooks.tunnels.deleteFailed': 'Failed to delete tunnel',
  'webhooks.tunnels.descriptionPlaceholder': 'Description (optional)',
  'webhooks.tunnels.echo': 'Echo',
  'webhooks.tunnels.empty': 'No tunnels configured',
  'webhooks.tunnels.enableEcho': 'Enable Echo',
  'webhooks.tunnels.inactive': 'Inactive',
  'webhooks.tunnels.namePlaceholder': 'Tunnel name (e.g. telegram-bot)',
  'webhooks.tunnels.newTunnel': 'New tunnel',
  'webhooks.tunnels.removeEcho': 'Remove Echo',
  'webhooks.tunnels.title': 'Webhook Tunnels',
  'webhooks.tunnels.toggleFailed': 'Failed to toggle echo',
  'composio.directModeRequiresKey': 'Failed to save. Direct mode requires a non-empty API key.',
  'composio.notYetRouted': 'not yet routed',
  'composio.triggers.loading': 'Loading…',
  'conversations.taskKanban.todo': 'To do',
  'settings.composio.loading': 'Loading…',
  'settings.mascot.noCharactersAvailable': 'No OpenHuman characters are available yet',
  'skills.uninstall.confirmTitle': 'Uninstall {name}?',
  'conversations.taskKanban.blocked': 'Blocked',
  'conversations.taskKanban.done': 'Done',
  'conversations.taskKanban.inProgress': 'In progress',
  'intelligence.memoryChunk.detail.copiedHint': 'copied',
  'settings.composio.notYetRouted': 'not yet routed',
  'settings.localModel.download.manageExternal': 'Manage this model in your external runtime.',
  'settings.localModel.status.manageOllamaExternal':
    'Manage the Ollama process and model pulls outside OpenHuman, then rerun diagnostics.',
  'settings.localModel.status.ollamaDocs': 'Ollama docs',
  'settings.localModel.status.thenRetry':
    'for setup instructions, then retry after your runtime is reachable.',
  // Developer options menu items (#2225)
  'devOptions.menuAi': 'AI Configuration',
  'devOptions.menuAiDesc': 'Cloud providers, local Ollama models, and per-workload routing',
  'devOptions.menuScreenAware': 'Screen Awareness',
  'devOptions.menuScreenAwareDesc':
    'Screen capture permissions, monitoring policy, and session controls',
  'devOptions.menuMessaging': 'Messaging Channels',
  'devOptions.menuMessagingDesc':
    'Configure Telegram/Discord auth modes and default channel routing',
  'devOptions.menuTools': 'Tools',
  'devOptions.menuToolsDesc': 'Enable or disable capabilities OpenHuman can use on your behalf',
  'devOptions.menuAgentChat': 'Agent Chat',
  'devOptions.menuAgentChatDesc': 'Test agent conversation with model and temperature overrides',
  'devOptions.menuCronJobs': 'Cron Jobs',
  'devOptions.menuCronJobsDesc': 'View and configure scheduled jobs for runtime skills',
  'devOptions.menuLocalModelDebug': 'Local Model Debug',
  'devOptions.menuLocalModelDebugDesc':
    'Ollama config, asset downloads, model tests, and diagnostics',
  'devOptions.menuWebhooksDebug': 'Webhooks',
  'devOptions.menuWebhooksDebugDesc':
    'Inspect runtime webhook registrations and captured request logs',
  'devOptions.menuIntelligence': 'Intelligence',
  'devOptions.menuIntelligenceDesc': 'Memory workspace, subconscious engine, dreams, and settings',
  'devOptions.menuNotificationRouting': 'Notification Routing',
  'devOptions.menuNotificationRoutingDesc':
    'AI importance scoring and orchestrator escalation for integration alerts',
  'devOptions.menuComposeIOTriggers': 'ComposeIO Triggers',
  'devOptions.menuComposeIOTriggersDesc': 'View ComposeIO trigger history and archive',
  'devOptions.menuComposioRouting': 'Composio Routing (Direct Mode)',
  'devOptions.menuComposioRoutingDesc':
    'Bring your own Composio API key and route calls directly to backend.composio.dev',
  'devOptions.menuComposioTriggers': 'Integration Triggers',
  'devOptions.menuComposioTriggersDesc':
    'Configure AI triage settings for Composio integration triggers',
  // Settings menu: Appearance + Mascot (#2225)
  'settings.appearance': 'Appearance',
  'settings.appearanceDesc': 'Pick light, dark, or match your system theme',
  'settings.mascot': 'Mascot',
  'settings.mascotDesc': 'Pick the mascot color used across the app',
};

export default en;
