/**
 * Alvin Bot — i18n Bilingual (DE/EN)
 * Simple key-value translation system
 */

const STRINGS = {
  de: {
    // General
    'app.title': 'Alvin Bot',
    'app.subtitle': 'AI Assistant Dashboard',
    'connecting': 'Verbinde...',
    'connected': 'Verbunden',
    'reconnecting': 'Verbindung wird wiederhergestellt...',
    'loading': 'Lade...',
    'save': 'Speichern',
    'cancel': 'Abbrechen',
    'delete': 'Löschen',
    'edit': 'Bearbeiten',
    'close': 'Schließen',
    'confirm': 'Bestätigen',
    'yes': 'Ja',
    'no': 'Nein',
    'error': 'Fehler',
    'success': 'Erfolg',
    'search': 'Suchen',
    'reset': 'Zurücksetzen',
    'back': 'Zurück',
    'next': 'Weiter',
    'all': 'Alle',
    'none': 'Keine',
    'active': 'Aktiv',
    'inactive': 'Inaktiv',
    'enabled': 'Aktiviert',
    'disabled': 'Deaktiviert',
    'online': 'Online',
    'offline': 'Offline',
    'restart.needed': 'Neustart nötig',
    'no.data': 'Keine Daten',

    // Nav sections
    'nav.main': 'Hauptmenü',
    'nav.ai': 'KI',
    'nav.data': 'Daten',
    'nav.system': 'System',

    // Nav items
    'nav.chat': 'Chat',
    'nav.dashboard': 'Dashboard',
    'nav.models': 'Modelle',
    'nav.personality': 'Persönlichkeit',
    'nav.memory': 'Gedächtnis',
    'nav.sessions': 'Sessions',
    'nav.files': 'Dateien',
    'nav.cron': 'Cron',
    'nav.tools': 'Tools',
    'nav.plugins': 'Plugins',
    'nav.platforms': 'Plattformen',
    'nav.users': 'Benutzer',
    'nav.terminal': 'Terminal',
    'nav.reliability': 'Zuverlässigkeit',
    'nav.maintenance': 'Wartung',
    'nav.settings': 'Einstellungen',

    // Reliability panel (v5.19.0)
    'reliability.restart.title': 'Restart-Storm-Brake',
    'reliability.restart.attempts': 'Versuche im Fenster',
    'reliability.restart.window': 'Fenstergröße',
    'reliability.restart.lastBrake': 'Letzte Bremse',
    'reliability.restart.help': 'Bot verweigert den 4. Self-Restart innerhalb von 10 Minuten und meldet sich per DM.',
    'reliability.state.title': 'State-Dateien',
    'reliability.state.help': 'Korrupte oder zu große State-Dateien werden beim Boot in Quarantäne gestellt.',
    'reliability.exec.title': 'EXEC_SECURITY',
    'reliability.exec.help.allowlist': 'Default — nur Binaries aus der Allowlist, kein Pipes/Redirects. Cron-Auto-Fix erweitert die Allowlist automatisch für Owner-Jobs.',
    'reliability.exec.help.full': 'Power-Mode — alle Shell-Commands erlaubt. Owner-Setup, nicht für geteilte Installs.',
    'reliability.exec.help.deny': 'Shell-Execution komplett deaktiviert.',
    'reliability.subsystems.title': 'Subsysteme',
    'reliability.subsystems.help': 'Live-Heartbeats der internen Loops. Stale nicht-kritische Subsysteme heilt der Bot in-process selbst; kritische lösen einen Voll-Restart aus.',
    'reliability.subsystems.never': 'noch kein Signal',
    'reliability.subsystems.ago': 'vor {s}s',
    'reliability.tts.title': 'Text-to-Speech',
    'reliability.tts.current': 'Aktueller Provider',
    'reliability.tts.supertonic': 'Supertonic (lokal)',
    'reliability.tts.apply': 'Übernehmen',
    'reliability.tts.help': 'Nach dem Wechsel startet der Bot kurz neu (~5 s). Eine Bestätigung kommt per Telegram-DM zurück.',
    'reliability.tts.applied': 'TTS-Provider aktualisiert',
    'reliability.tts.restarting': 'Bot startet neu …',
    'reliability.incidents.title': 'Aktuelle Incidents',
    'reliability.incidents.when': 'Wann',
    'reliability.incidents.kind': 'Typ',
    'reliability.incidents.help': 'Forensische Dumps unter ~/.alvin-bot/incidents/. Werden nach 30 Tagen automatisch gelöscht.',
    'reliability.incidents.none': 'Keine Incidents in letzter Zeit.',

    // Sidebar footer
    'sidebar.theme': 'Theme',
    'sidebar.reset': 'Reset',
    'sidebar.lang': 'Sprache',

    // Chat
    'chat.welcome': 'Willkommen bei Alvin Bot! Schreib etwas um zu beginnen.',
    'chat.placeholder': 'Nachricht eingeben... (Enter = senden, Shift+Enter = Zeile)',
    'chat.send': 'Senden',
    'chat.model': 'Model',
    'chat.effort': 'Effort',
    'chat.effort.low': 'Low',
    'chat.effort.medium': 'Medium',
    'chat.effort.high': 'High',
    'chat.effort.max': 'Max',
    'chat.export': 'Export',
    'chat.export.md': 'Markdown',
    'chat.export.json': 'JSON',
    'chat.no.export': 'Kein Chat zum Exportieren',
    'chat.exported': 'Chat exportiert!',
    'chat.new.session': 'Neue Session',
    'chat.session.reset': 'Session zurückgesetzt.',
    'chat.reply.you': 'Du',
    'chat.reply.bot': 'Alvin Bot',
    'chat.reply': 'Antworten',
    'chat.file.attach': 'Datei anhängen',
    'chat.file.drop': 'Datei hier ablegen',
    'chat.tools.used': '{count} Tool(s) verwendet',
    'chat.fallback': 'Fallback',

    // Dashboard
    'dashboard.model': 'Modell',
    'dashboard.uptime': 'Laufzeit',
    'dashboard.memory': 'Gedächtnis',
    'dashboard.memory.days': 'Tage',
    'dashboard.memory.vectors': 'Vektoren',
    'dashboard.memory.today': 'heute',
    'dashboard.tokens': 'Tokens',
    'dashboard.tokens.in': 'In',
    'dashboard.tokens.out': 'Out',
    'dashboard.plugins': 'Plugins',
    'dashboard.plugins.loaded': 'geladen',
    'dashboard.mcp': 'MCP',
    'dashboard.mcp.servers': 'Server',
    'dashboard.users': 'Benutzer',
    'dashboard.users.profiles': 'Profile',

    // Models
    'models.title': 'KI-Modelle & Provider',
    'models.desc': 'API Keys einrichten, Modelle aktivieren und Custom Models hinzufügen.',
    'models.key.set': 'Key gesetzt',
    'models.key.none': 'Kein Key',
    'models.free': 'Gratis verfügbar',
    'models.setup.guide': 'Setup-Anleitung',
    'models.key.placeholder': 'API Key eingeben...',
    'models.key.save': 'Speichern',
    'models.key.test': 'Testen',
    'models.key.testing': 'Teste...',
    'models.key.works': 'Key funktioniert!',
    'models.key.saved': 'Key gespeichert! Bot-Neustart nötig.',
    'models.key.fill': 'Bitte einen vollständigen Key eingeben',
    'models.live.title': 'Verfügbare Modelle (live von API laden)',
    'models.live.loading': 'Modelle werden geladen...',
    'models.live.none': 'Keine Modelle gefunden oder Key nicht gesetzt.',
    'models.live.count': '{count} Modelle',
    'models.live.available': 'Verfügbare Modelle',
    'models.activate': 'Aktivieren',
    'models.activated': 'aktiviert!',
    'models.activate.error': 'Fehler beim Aktivieren',
    'models.switched': 'Model gewechselt',
    'models.custom': 'Custom Models',
    'models.custom.desc': 'Eigene OpenAI-kompatible Endpunkte hinzufügen (LM Studio, vLLM, Together AI, etc.)',
    'models.custom.add': 'Custom Model hinzufügen',
    'models.custom.added': 'Custom Model hinzugefügt! Neustart nötig.',
    'models.custom.fill': 'Bitte alle Pflichtfelder ausfüllen',
    'models.custom.remove': 'Custom Model "{key}" entfernen?',
    'models.custom.removed': 'Entfernt',
    'models.custom.key': 'Eindeutiger Key (z.B. my-llama)',
    'models.custom.name': 'Anzeigename (z.B. My Llama 3)',
    'models.custom.model': 'Model ID (z.B. meta-llama/Llama-3-70b)',
    'models.custom.url': 'Base URL (z.B. http://localhost:1234/v1)',
    'models.custom.envkey': 'API Key Env-Var (optional)',
    'models.custom.apikey': 'API Key (optional)',
    'models.fallback': 'Fallback-Reihenfolge',
    'models.fallback.desc': 'Wenn der primäre Provider fehlschlägt, werden diese der Reihe nach probiert. Per Pfeile umsortieren.',
    'models.fallback.primary': 'Primär',
    'models.fallback.healthy': 'Healthy',
    'models.fallback.unhealthy': 'Unhealthy',
    'models.fallback.none': 'Keine Fallback-Provider konfiguriert.',
    'models.fallback.add': 'Hinzufügen',
    'models.fallback.added': '{key} hinzugefügt',
    'models.fallback.removed': '{key} entfernt',
    'models.provider.add': 'Provider hinzufügen',
    'models.claude.setup': 'Claude SDK einrichten',
    'models.claude.installed': 'Installiert',
    'models.claude.not.installed': 'Nicht installiert',
    'models.claude.guide.title': 'Claude SDK Setup',
    'models.claude.guide.step1': '1. CLI installieren: npm install -g @anthropic-ai/claude-code',
    'models.claude.guide.step2': '2. Anmelden: claude login',
    'models.claude.guide.step3': '3. Status hier prüfen',

    // Personality
    'personality.title': 'Persönlichkeit (SOUL.md)',
    'personality.desc': 'Definiert wie Alvin Bot spricht und sich verhält. Änderungen werden sofort aktiv.',
    'personality.save': 'Speichern & Aktivieren',
    'personality.reload': 'Neu laden',
    'personality.saved': 'Persönlichkeit aktualisiert!',
    'personality.placeholder': 'SOUL.md laden...',

    // Memory
    'memory.longterm': 'MEMORY.md (Langzeit)',
    'memory.saved': 'Gespeichert!',

    // Sessions
    'sessions.none': 'Keine Sessions',
    'sessions.none.desc': 'Sessions werden erstellt wenn User chatten.',
    'sessions.msgs': 'Msgs',
    'sessions.tools': 'Tools',
    'sessions.active': 'Aktiv',
    'sessions.idle': 'Idle',

    // Plugins
    'plugins.none': 'Keine Plugins',
    'plugins.none.desc': 'Plugins in plugins/ ablegen.',

    // Files
    'files.new': 'Neue Datei',
    'files.up': 'Hoch',
    'files.lines': '{count} Zeilen',
    'files.binary': 'Binärdatei — kann nicht im Editor geöffnet werden.',
    'files.open.error': 'Datei kann nicht geöffnet werden',
    'files.saved': 'Gespeichert!',
    'files.created': 'Datei erstellt!',
    'files.create.error': 'Fehler beim Erstellen',
    'files.delete.confirm': 'Datei löschen?\n\n{path}',
    'files.deleted': 'Gelöscht!',
    'files.delete.error': 'Fehler beim Löschen',
    'files.name.prompt': 'Dateiname (z.B. notes.md):',

    // Cron
    'cron.title': 'Cron Jobs',
    'cron.desc': 'Geplante wiederkehrende oder einmalige Aufgaben.',
    'cron.create': 'Job erstellen',
    'cron.none': 'Keine Jobs',
    'cron.none.desc': 'Erstelle einen Job oben oder via Telegram: /cron add 5m reminder Text',
    'cron.next.run': 'Nächster Lauf',
    'cron.runs': 'Runs',
    'cron.last.run': 'Zuletzt',
    'cron.never': 'nie',
    'cron.pause': 'Pause',
    'cron.start': 'Start',
    'cron.run.now': 'Jetzt',
    'cron.edit': 'Bearbeiten',
    'cron.delete.confirm': 'Job löschen?',
    'cron.deleted': 'Gelöscht',
    'cron.created': 'Job erstellt!',
    'cron.name.required': 'Name ist Pflicht',
    'cron.updated': 'Timing aktualisiert!',
    'cron.executed': 'Ausgeführt!',
    'cron.executing': 'Wird ausgeführt...',
    'cron.name.placeholder': 'Name (z.B. Health Check)',
    'cron.payload.placeholder': 'Payload (Text, Command, URL, Prompt)',
    'cron.type.reminder': 'Reminder',
    'cron.type.shell': 'Shell Command',
    'cron.type.http': 'HTTP Request',
    'cron.type.message': 'Nachricht',
    'cron.type.ai': 'AI Query',
    'cron.single': 'Einmalig',
    'cron.recurring': 'Wiederkehrend',
    'cron.schedule.repeat': 'Wiederholung',
    'cron.schedule.interval': 'Intervall',
    'cron.schedule.daily': 'Täglich',
    'cron.schedule.weekly': 'Wöchentlich',
    'cron.schedule.monthly': 'Monatlich',
    'cron.schedule.every': 'Alle',
    'cron.schedule.at': 'Um',
    'cron.schedule.oclock': 'Uhr',
    'cron.schedule.onday': 'Am',
    'cron.schedule.ofmonth': '. des Monats',
    'cron.schedule.type': 'Typ',
    'cron.schedule.weekday.min': 'Mindestens einen Wochentag wählen',
    'cron.weekdays': 'So,Mo,Di,Mi,Do,Fr,Sa',
    'cron.units.seconds': 'Sekunden',
    'cron.units.minutes': 'Minuten',
    'cron.units.hours': 'Stunden',
    'cron.units.days': 'Tage',

    // Tools
    'tools.search.placeholder': 'Tool suchen...',
    'tools.count': '{count} Tools',
    'tools.none': 'Keine Tools',
    'tools.none.desc': 'Tools in TOOLS.md konfigurieren.',
    'tools.running': 'Running {name}...',
    'tools.executed': 'Tool ausgeführt!',
    'tools.cat.system': 'System',
    'tools.cat.email': 'Email',
    'tools.cat.automation': 'Automation',
    'tools.cat.pdf': 'PDF',
    'tools.cat.dev': 'Dev Tools',
    'tools.cat.network': 'Netzwerk',
    'tools.cat.media': 'Medien',
    'tools.cat.clipboard': 'Zwischenablage',
    'tools.cat.files': 'Dateien',
    'tools.cat.other': 'Sonstige',

    // Users
    'users.none': 'Keine Benutzer',
    'users.none.desc': 'Werden automatisch erfasst sobald jemand schreibt.',
    'users.kill.confirm': 'User "{name}" wirklich löschen?\n\nDas löscht:\n• Aktive Session (+ laufende Anfrage)\n• Profil-Daten\n• Chat-History\n• Memory-Verzeichnis\n\nDiese Aktion kann nicht rückgängig gemacht werden!',
    'users.deleted': 'User gelöscht.',
    'users.deleted.summary': 'Gelöscht: {items}',
    'users.nothing': 'Nichts zu löschen',
    'users.no.session': 'Keine aktive Session',
    'users.processing': 'Verarbeitet...',
    'users.query.active': 'Query aktiv',
    'users.in.queue': '{count} in Queue',
    'users.cost': 'Kosten',
    'users.msgs': 'Nachrichten',
    'users.tools': 'Tools',
    'users.history': 'History',
    'users.effort': 'Effort',
    'users.just.now': 'gerade eben',
    'users.min.ago': 'vor {n} Min',
    'users.hrs.ago': 'vor {n} Std',
    'users.messages.total': '{n} Nachrichten',
    'users.last.active': 'Zuletzt aktiv',
    'users.platform.unknown': 'Unbekannt',

    // Platforms
    'platforms.title': 'Messaging-Plattformen',
    'platforms.desc': 'Verbinde Alvin Bot mit verschiedenen Messaging-Diensten. Mehrere gleichzeitig möglich.',
    'platforms.ready': 'Bereit',
    'platforms.deps.missing': 'Deps fehlen',
    'platforms.not.configured': 'Nicht eingerichtet',
    'platforms.setup.guide': 'Setup-Anleitung',
    'platforms.save': 'Speichern',
    'platforms.saved': 'Gespeichert!',
    'platforms.saved.restart': 'Gespeichert! Neustart nötig für Änderungen.',
    'platforms.install.deps': 'Dependencies installieren',
    'platforms.installing': 'Installiere Dependencies...',
    'platforms.installed': 'Dependencies installiert!',
    'platforms.test': 'Verbindung testen',
    'platforms.testing': 'Teste...',
    'platforms.connected': 'Verbunden',
    'platforms.disable': 'Deaktivieren',
    'platforms.disable.confirm': '{id} wirklich deaktivieren?',
    'platforms.disabled': 'Plattform deaktiviert. Neustart nötig.',
    'platforms.status.connected': 'Verbunden',
    'platforms.status.connecting': 'Verbinde...',
    'platforms.status.qr': 'QR-Code scannen!',
    'platforms.status.error': 'Fehler',
    'platforms.status.disconnected': 'Nicht verbunden',
    'platforms.status.logged.out': 'Abgemeldet',

    // WhatsApp
    'wa.status.loading': 'Status wird geladen...',
    'wa.check.status': 'Status prüfen',
    'wa.disconnect': 'Trennen & Reset',
    'wa.disconnect.confirm': 'WhatsApp-Verbindung trennen und Auth-Daten löschen?\n\nDu musst danach erneut den QR-Code scannen.',
    'wa.disconnected': 'Auth-Daten gelöscht. Bitte Bot neustarten.',
    'wa.scan.qr': 'Scanne mit WhatsApp → Verknüpfte Geräte → Gerät hinzufügen',
    'wa.qr.ready': 'QR-Code bereit — jetzt scannen!',
    'wa.qr.available': 'QR bereit',
    'wa.not.connected': 'WhatsApp nicht verbunden — zuerst oben verbinden.',
    'wa.groups': 'Gruppen-Verwaltung',
    'wa.groups.loading': 'Lade WhatsApp-Gruppen...',
    'wa.groups.count': '{count} Gruppen',
    'wa.groups.active': '{count} aktiv',
    'wa.groups.participants': '{count} Teilnehmer',
    'wa.groups.enabled': '{name} aktiviert',
    'wa.groups.disabled': '{name} deaktiviert',
    'wa.groups.configured': '{name} konfiguriert und aktiviert!',
    'wa.groups.rule.deleted': 'Regel gelöscht',
    'wa.groups.rule.delete.confirm': 'Regel für diese Gruppe löschen?',
    'wa.groups.no.config': 'Nicht konfiguriert',
    'wa.groups.allowed': '{count} erlaubte Kontakte',
    'wa.groups.all.allowed': 'Alle Teilnehmer erlaubt',
    'wa.groups.mention.required': '@ Erwähnung erforderlich',
    'wa.groups.all.messages': 'Alle Nachrichten',
    'wa.groups.media': 'Medien verarbeiten',
    'wa.groups.approval': 'Approval vor Verarbeitung',
    'wa.groups.allowed.contacts': 'Erlaubte Kontakte',
    'wa.groups.select.all': 'Alle',
    'wa.groups.select.none': 'Keine',
    'wa.groups.no.selection': 'Keine Auswahl = alle dürfen ansprechen',
    'wa.groups.admin': 'Admin',
    'wa.approval': 'Approval',
    'wa.auto': 'Auto',

    // Terminal
    'terminal.placeholder': 'Befehl eingeben...',
    'terminal.run': 'Ausführen',

    // Settings
    'settings.sudo': 'Sudo / Admin-Rechte',
    'settings.sudo.desc': 'Erlaube Alvin Bot, Befehle mit Administratorrechten auszuführen',
    'settings.sudo.active': 'Aktiv & verifiziert',
    'settings.sudo.configured': 'Konfiguriert, Verifikation nötig',
    'settings.sudo.not.set': 'Nicht eingerichtet',
    'settings.sudo.status': 'Status',
    'settings.sudo.storage': 'Speicher',
    'settings.sudo.system': 'System',
    'settings.sudo.accessibility': 'Accessibility',
    'settings.sudo.fda': 'Full Disk Access',
    'settings.sudo.open': 'Öffnen',
    'settings.sudo.password': 'System-Passwort eingeben...',
    'settings.sudo.setup': 'Einrichten',
    'settings.sudo.stored.secure': 'Das Passwort wird sicher gespeichert — nie im Klartext.',
    'settings.sudo.setup.ok': 'Sudo eingerichtet & verifiziert!',
    'settings.sudo.verify': 'Verifizieren',
    'settings.sudo.verifying': 'Verifiziere...',
    'settings.sudo.verified': 'Sudo funktioniert!',
    'settings.sudo.test': 'Test-Command',
    'settings.sudo.test.prompt': 'Sudo-Befehl zum Testen:',
    'settings.sudo.admin.dialog': 'Admin-Dialog',
    'settings.sudo.admin.reason': 'Grund für Admin-Rechte:',
    'settings.sudo.admin.default.reason': 'Alvin Bot benötigt Administrator-Rechte',
    'settings.sudo.admin.showing': 'macOS Admin-Dialog wird angezeigt...',
    'settings.sudo.admin.confirmed': 'Bestätigt!',
    'settings.sudo.admin.denied': 'Abgelehnt oder Fehler',
    'settings.sudo.revoke': 'Widerrufen',
    'settings.sudo.revoke.confirm': 'Sudo-Zugriff wirklich widerrufen? Gespeichertes Passwort wird gelöscht.',
    'settings.sudo.revoked': 'Sudo-Zugriff widerrufen',
    'settings.sudo.executing': 'Ausführen...',
    'settings.sudo.output': 'Output',
    'settings.env': 'Environment Variables',
    'settings.env.add': 'Variable hinzufügen',
    'settings.env.name.prompt': 'Variable Name (z.B. DISCORD_TOKEN):',
    'settings.env.value.prompt': 'Wert für {key}:',
    'settings.env.new.prompt': 'Neuer Wert für {key}:',
    'settings.env.saved': '{key} gespeichert! Neustart nötig.',
    'settings.env.added': '{key} hinzugefügt!',
    'settings.sysopen': 'Systemeinstellungen geöffnet',

    // Maintenance
    'maint.doctor': 'System-Doktor',
    'maint.doctor.errors': '{errors} Fehler, {warns} Warnungen',
    'maint.doctor.check': 'Prüfen',
    'maint.doctor.fix.all': 'Alles reparieren',
    'maint.doctor.fix.all.confirm': 'Alle Probleme automatisch reparieren?',
    'maint.doctor.fixed': '{ok} repariert',
    'maint.doctor.failed': '{fail} fehlgeschlagen',
    'maint.backup': 'Backup & Wiederherstellung',
    'maint.backup.desc': 'Sichere und stelle Config, Memory, Tools, SOUL.md wieder her',
    'maint.backup.create': 'Backup erstellen',
    'maint.backup.creating': 'Erstelle Backup...',
    'maint.backup.name.prompt': 'Backup-Name (optional):',
    'maint.backup.created': 'Backup "{id}" erstellt ({count} Dateien)',
    'maint.backup.files': 'Dateien',
    'maint.backup.files.in': 'Dateien in {id}',
    'maint.backup.restore': 'Wiederherstellen',
    'maint.backup.restore.confirm': 'Backup "{id}" wiederherstellen?\n\nAktuelle Config-Dateien werden überschrieben!\nBot-Neustart nötig danach.',
    'maint.backup.restored': '{count} Dateien wiederhergestellt! Bot-Neustart nötig.',
    'maint.backup.delete.confirm': 'Backup "{id}" unwiderruflich löschen?',
    'maint.backup.deleted': 'Gelöscht',
    'maint.backup.none': 'Noch keine Backups vorhanden.',
    'maint.pm2': 'Prozess-Steuerung (PM2)',
    'maint.pm2.desc': 'Bot-Prozess starten, stoppen und überwachen',
    'maint.pm2.status': 'Status',
    'maint.pm2.loading': 'Lade PM2-Status...',
    'maint.pm2.unreachable': 'Nicht erreichbar',
    'maint.pm2.restart': 'Restart',
    'maint.pm2.restart.confirm': 'Bot neustarten? Laufende Anfragen werden abgebrochen.',
    'maint.pm2.reload': 'Reload',
    'maint.pm2.stop': 'Stop',
    'maint.pm2.stop.confirm': 'Bot wirklich stoppen? Der Bot wird offline gehen!',
    'maint.pm2.start': 'Start',
    'maint.pm2.flush': 'Logs leeren',
    'maint.pm2.action.ok': 'PM2 {action} erfolgreich',
    'maint.pm2.action.fail': 'PM2 {action} fehlgeschlagen',
    'maint.pm2.lost': 'Verbindung verloren (Bot gestoppt?)',
    'maint.logs': 'Letzte Logs',
    'maint.logs.desc': 'Die letzten 30 Zeilen der Bot-Ausgabe',
    'maint.logs.refresh': 'Aktualisieren',
    'maint.logs.load': 'Klicke "Aktualisieren" um Logs zu laden.',
    'maint.bot.restart': 'Bot neustarten',
    'maint.bot.restart.confirm': 'Bot wirklich neustarten? Laufende Anfragen werden abgebrochen.',
    'maint.bot.restarting': 'Bot wird neugestartet...',
    'maint.bot.reconnecting': 'Bot sollte gleich wieder verfügbar sein...',

    // Command Palette
    'cmd.title': 'Befehlspalette',
    'cmd.placeholder': 'Suche Seiten, Aktionen...',
    'cmd.goto': 'Gehe zu',
    'cmd.actions': 'Aktionen',
    'cmd.action.reset': 'Chat zurücksetzen',
    'cmd.action.theme': 'Theme wechseln',
    'cmd.action.export': 'Chat exportieren',
    'cmd.action.lang': 'Sprache wechseln',
    'cmd.no.results': 'Keine Ergebnisse',

    // Provider Add
    'provider.add.title': 'Provider hinzufügen',
    'provider.add.desc': 'Neuen KI-Provider konfigurieren und aktivieren.',
    'provider.add.select': 'Provider auswählen',
    'provider.add.key': 'API Key',
    'provider.add.test': 'Key testen',
    'provider.add.save': 'Speichern & Aktivieren',
    'provider.add.chain': 'In Fallback-Chain einsortieren',

    // Claude SDK
    'claude.sdk.title': 'Claude SDK einrichten',
    'claude.sdk.checking': 'Prüfe CLI-Installation...',
    'claude.sdk.step1': 'Schritt 1: CLI installieren',
    'claude.sdk.step1.cmd': 'npm install -g @anthropic-ai/claude-code',
    'claude.sdk.step2': 'Schritt 2: Anmelden',
    'claude.sdk.step2.cmd': 'claude login',
    'claude.sdk.step3': 'Schritt 3: Status prüfen',

    // Setup Wizard
    'wizard.title': 'Willkommen bei Alvin Bot!',
    'wizard.subtitle': 'In 3 einfachen Schritten ist dein AI-Assistent einsatzbereit.',
    'wizard.step': 'Schritt {n} von {total}',
    'wizard.step1.title': 'Telegram Bot erstellen',
    'wizard.step1.desc': 'Erstelle deinen eigenen Bot bei Telegram.',
    'wizard.step1.instruction1': '1. Öffne Telegram und suche nach',
    'wizard.step1.instruction2': '2. Sende /newbot und wähle einen Namen',
    'wizard.step1.instruction3': '3. Kopiere den Bot-Token hierher',
    'wizard.step1.token.placeholder': 'Bot-Token einfügen (z.B. 123456:ABC-DEF...)',
    'wizard.step1.token.validate': 'Token prüfen',
    'wizard.step1.token.valid': 'Bot gefunden:',
    'wizard.step1.token.invalid': 'Ungültiger Token',
    'wizard.step1.userid': 'Deine Telegram User-ID',
    'wizard.step1.userid.placeholder': 'Deine User-ID (z.B. 123456789)',
    'wizard.step1.userid.help': 'Sende eine Nachricht an @userinfobot um deine ID zu erfahren.',
    'wizard.step2.title': 'KI-Provider wählen',
    'wizard.step2.desc': 'Wähle welche KI deinen Bot antreiben soll.',
    'wizard.step2.recommended': 'Empfohlen',
    'wizard.step2.free': 'Kostenlos',
    'wizard.step2.premium': 'Premium',
    'wizard.step2.key.placeholder': 'API Key eingeben...',
    'wizard.step3.title': 'Fast geschafft!',
    'wizard.step3.desc': 'Optionale Einstellungen — kannst du auch später ändern.',
    'wizard.step3.password': 'Web-Dashboard Passwort (optional)',
    'wizard.step3.password.placeholder': 'Passwort für dieses Dashboard',
    'wizard.step3.password.help': 'Schützt den Zugang zu diesem Dashboard. Leer lassen = offener Zugang.',
    'wizard.finish': 'Setup abschließen',
    'wizard.finish.success': 'Setup abgeschlossen! Bot wird neugestartet...',
    'wizard.finish.restart': 'Bitte starte den Bot neu: pm2 restart alvin-bot',
    'wizard.skip': 'Überspringen',
    'wizard.back': 'Zurück',
    'wizard.next': 'Weiter',
    'wizard.alreadySet': 'bereits konfiguriert — leer lassen zum Behalten',
    'wizard.keepHint': 'Bereits konfiguriert — leer lassen, um den aktuellen Wert zu behalten.',
  },

  en: {
    // General
    'app.title': 'Alvin Bot',
    'app.subtitle': 'AI Assistant Dashboard',
    'connecting': 'Connecting...',
    'connected': 'Connected',
    'reconnecting': 'Reconnecting...',
    'loading': 'Loading...',
    'save': 'Save',
    'cancel': 'Cancel',
    'delete': 'Delete',
    'edit': 'Edit',
    'close': 'Close',
    'confirm': 'Confirm',
    'yes': 'Yes',
    'no': 'No',
    'error': 'Error',
    'success': 'Success',
    'search': 'Search',
    'reset': 'Reset',
    'back': 'Back',
    'next': 'Next',
    'all': 'All',
    'none': 'None',
    'active': 'Active',
    'inactive': 'Inactive',
    'enabled': 'Enabled',
    'disabled': 'Disabled',
    'online': 'Online',
    'offline': 'Offline',
    'restart.needed': 'Restart required',
    'no.data': 'No data',

    // Nav sections
    'nav.main': 'Main',
    'nav.ai': 'AI',
    'nav.data': 'Data',
    'nav.system': 'System',

    // Nav items
    'nav.chat': 'Chat',
    'nav.dashboard': 'Dashboard',
    'nav.models': 'Models',
    'nav.personality': 'Personality',
    'nav.memory': 'Memory',
    'nav.sessions': 'Sessions',
    'nav.files': 'Files',
    'nav.cron': 'Cron',
    'nav.tools': 'Tools',
    'nav.plugins': 'Plugins',
    'nav.platforms': 'Platforms',
    'nav.users': 'Users',
    'nav.terminal': 'Terminal',
    'nav.reliability': 'Reliability',
    'nav.maintenance': 'Maintenance',
    'nav.settings': 'Settings',

    // Reliability panel (v5.19.0)
    'reliability.restart.title': 'Restart-Storm Brake',
    'reliability.restart.attempts': 'Attempts in window',
    'reliability.restart.window': 'Window size',
    'reliability.restart.lastBrake': 'Last brake',
    'reliability.restart.help': 'The bot refuses the 4th self-restart inside a 10-minute window and DMs you the reason.',
    'reliability.state.title': 'State Files',
    'reliability.state.help': 'Corrupted or oversized state files are quarantined at boot.',
    'reliability.exec.title': 'EXEC_SECURITY',
    'reliability.exec.help.allowlist': 'Default — only allowlisted binaries, no pipes/redirects. Cron auto-fix extends the allowlist silently for Owner jobs.',
    'reliability.exec.help.full': 'Power-Mode — all shell commands allowed. Owner setup, not for shared installs.',
    'reliability.exec.help.deny': 'Shell execution fully disabled.',
    'reliability.subsystems.title': 'Subsystems',
    'reliability.subsystems.help': 'Live heartbeats of the internal loops. Stale non-critical subsystems are self-healed in-process; critical ones trigger a full restart.',
    'reliability.subsystems.never': 'no signal yet',
    'reliability.subsystems.ago': '{s}s ago',
    'reliability.tts.title': 'Text-to-Speech',
    'reliability.tts.current': 'Current provider',
    'reliability.tts.supertonic': 'Supertonic (local)',
    'reliability.tts.apply': 'Apply',
    'reliability.tts.help': 'After switching, the bot restarts briefly (~5 s). A Telegram DM confirms when it is back.',
    'reliability.tts.applied': 'TTS provider updated',
    'reliability.tts.restarting': 'Bot restarting …',
    'reliability.incidents.title': 'Recent Incidents',
    'reliability.incidents.when': 'When',
    'reliability.incidents.kind': 'Kind',
    'reliability.incidents.help': 'Forensic dumps under ~/.alvin-bot/incidents/. Auto-pruned after 30 days.',
    'reliability.incidents.none': 'No incidents recently.',

    // Sidebar footer
    'sidebar.theme': 'Theme',
    'sidebar.reset': 'Reset',
    'sidebar.lang': 'Language',

    // Chat
    'chat.welcome': 'Welcome to Alvin Bot! Type something to get started.',
    'chat.placeholder': 'Type a message... (Enter = send, Shift+Enter = newline)',
    'chat.send': 'Send',
    'chat.model': 'Model',
    'chat.effort': 'Effort',
    'chat.effort.low': 'Low',
    'chat.effort.medium': 'Medium',
    'chat.effort.high': 'High',
    'chat.effort.max': 'Max',
    'chat.export': 'Export',
    'chat.export.md': 'Markdown',
    'chat.export.json': 'JSON',
    'chat.no.export': 'No chat to export',
    'chat.exported': 'Chat exported!',
    'chat.new.session': 'New session',
    'chat.session.reset': 'Session reset.',
    'chat.reply.you': 'You',
    'chat.reply.bot': 'Alvin Bot',
    'chat.reply': 'Reply',
    'chat.file.attach': 'Attach file',
    'chat.file.drop': 'Drop file here',
    'chat.tools.used': '{count} Tool(s) used',
    'chat.fallback': 'Fallback',

    // Dashboard
    'dashboard.model': 'Model',
    'dashboard.uptime': 'Uptime',
    'dashboard.memory': 'Memory',
    'dashboard.memory.days': 'Days',
    'dashboard.memory.vectors': 'Vectors',
    'dashboard.memory.today': 'today',
    'dashboard.tokens': 'Tokens',
    'dashboard.tokens.in': 'In',
    'dashboard.tokens.out': 'Out',
    'dashboard.plugins': 'Plugins',
    'dashboard.plugins.loaded': 'loaded',
    'dashboard.mcp': 'MCP',
    'dashboard.mcp.servers': 'Servers',
    'dashboard.users': 'Users',
    'dashboard.users.profiles': 'Profiles',

    // Models
    'models.title': 'AI Models & Providers',
    'models.desc': 'Set up API keys, activate models and add custom models.',
    'models.key.set': 'Key set',
    'models.key.none': 'No Key',
    'models.free': 'Free available',
    'models.setup.guide': 'Setup Guide',
    'models.key.placeholder': 'Enter API Key...',
    'models.key.save': 'Save',
    'models.key.test': 'Test',
    'models.key.testing': 'Testing...',
    'models.key.works': 'Key works!',
    'models.key.saved': 'Key saved! Bot restart needed.',
    'models.key.fill': 'Please enter a complete key',
    'models.live.title': 'Available Models (load live from API)',
    'models.live.loading': 'Loading models...',
    'models.live.none': 'No models found or key not set.',
    'models.live.count': '{count} Models',
    'models.live.available': 'Available Models',
    'models.activate': 'Activate',
    'models.activated': 'activated!',
    'models.activate.error': 'Error activating',
    'models.switched': 'Model switched',
    'models.custom': 'Custom Models',
    'models.custom.desc': 'Add your own OpenAI-compatible endpoints (LM Studio, vLLM, Together AI, etc.)',
    'models.custom.add': 'Add Custom Model',
    'models.custom.added': 'Custom Model added! Restart needed.',
    'models.custom.fill': 'Please fill all required fields',
    'models.custom.remove': 'Remove custom model "{key}"?',
    'models.custom.removed': 'Removed',
    'models.custom.key': 'Unique Key (e.g. my-llama)',
    'models.custom.name': 'Display Name (e.g. My Llama 3)',
    'models.custom.model': 'Model ID (e.g. meta-llama/Llama-3-70b)',
    'models.custom.url': 'Base URL (e.g. http://localhost:1234/v1)',
    'models.custom.envkey': 'API Key Env Var (optional)',
    'models.custom.apikey': 'API Key (optional)',
    'models.fallback': 'Fallback Order',
    'models.fallback.desc': 'When the primary provider fails, these are tried in order. Use arrows to reorder.',
    'models.fallback.primary': 'Primary',
    'models.fallback.healthy': 'Healthy',
    'models.fallback.unhealthy': 'Unhealthy',
    'models.fallback.none': 'No fallback providers configured.',
    'models.fallback.add': 'Add',
    'models.fallback.added': '{key} added',
    'models.fallback.removed': '{key} removed',
    'models.provider.add': 'Add Provider',
    'models.claude.setup': 'Set up Claude SDK',
    'models.claude.installed': 'Installed',
    'models.claude.not.installed': 'Not installed',
    'models.claude.guide.title': 'Claude SDK Setup',
    'models.claude.guide.step1': '1. Install CLI: npm install -g @anthropic-ai/claude-code',
    'models.claude.guide.step2': '2. Login: claude login',
    'models.claude.guide.step3': '3. Check status here',

    // Personality
    'personality.title': 'Personality (SOUL.md)',
    'personality.desc': 'Defines how Alvin Bot speaks and behaves. Changes take effect immediately.',
    'personality.save': 'Save & Activate',
    'personality.reload': 'Reload',
    'personality.saved': 'Personality updated!',
    'personality.placeholder': 'Loading SOUL.md...',

    // Memory
    'memory.longterm': 'MEMORY.md (Long-term)',
    'memory.saved': 'Saved!',

    // Sessions
    'sessions.none': 'No Sessions',
    'sessions.none.desc': 'Sessions are created when users chat.',
    'sessions.msgs': 'Msgs',
    'sessions.tools': 'Tools',
    'sessions.active': 'Active',
    'sessions.idle': 'Idle',

    // Plugins
    'plugins.none': 'No Plugins',
    'plugins.none.desc': 'Place plugins in plugins/ folder.',

    // Files
    'files.new': 'New File',
    'files.up': 'Up',
    'files.lines': '{count} lines',
    'files.binary': 'Binary file — cannot be opened in editor.',
    'files.open.error': 'Cannot open file',
    'files.saved': 'Saved!',
    'files.created': 'File created!',
    'files.create.error': 'Error creating file',
    'files.delete.confirm': 'Delete file?\n\n{path}',
    'files.deleted': 'Deleted!',
    'files.delete.error': 'Error deleting file',
    'files.name.prompt': 'File name (e.g. notes.md):',

    // Cron
    'cron.title': 'Cron Jobs',
    'cron.desc': 'Scheduled recurring or one-time tasks.',
    'cron.create': 'Create Job',
    'cron.none': 'No Jobs',
    'cron.none.desc': 'Create a job above or via Telegram: /cron add 5m reminder Text',
    'cron.next.run': 'Next run',
    'cron.runs': 'Runs',
    'cron.last.run': 'Last',
    'cron.never': 'never',
    'cron.pause': 'Pause',
    'cron.start': 'Start',
    'cron.run.now': 'Now',
    'cron.edit': 'Edit',
    'cron.delete.confirm': 'Delete job?',
    'cron.deleted': 'Deleted',
    'cron.created': 'Job created!',
    'cron.name.required': 'Name is required',
    'cron.updated': 'Schedule updated!',
    'cron.executed': 'Executed!',
    'cron.executing': 'Executing...',
    'cron.name.placeholder': 'Name (e.g. Health Check)',
    'cron.payload.placeholder': 'Payload (Text, Command, URL, Prompt)',
    'cron.type.reminder': 'Reminder',
    'cron.type.shell': 'Shell Command',
    'cron.type.http': 'HTTP Request',
    'cron.type.message': 'Message',
    'cron.type.ai': 'AI Query',
    'cron.single': 'One-time',
    'cron.recurring': 'Recurring',
    'cron.schedule.repeat': 'Repeat',
    'cron.schedule.interval': 'Interval',
    'cron.schedule.daily': 'Daily',
    'cron.schedule.weekly': 'Weekly',
    'cron.schedule.monthly': 'Monthly',
    'cron.schedule.every': 'Every',
    'cron.schedule.at': 'At',
    'cron.schedule.oclock': '',
    'cron.schedule.onday': 'On the',
    'cron.schedule.ofmonth': 'of the month',
    'cron.schedule.type': 'Type',
    'cron.schedule.weekday.min': 'Select at least one weekday',
    'cron.weekdays': 'Sun,Mon,Tue,Wed,Thu,Fri,Sat',
    'cron.units.seconds': 'Seconds',
    'cron.units.minutes': 'Minutes',
    'cron.units.hours': 'Hours',
    'cron.units.days': 'Days',

    // Tools
    'tools.search.placeholder': 'Search tools...',
    'tools.count': '{count} Tools',
    'tools.none': 'No Tools',
    'tools.none.desc': 'Configure tools in TOOLS.md.',
    'tools.running': 'Running {name}...',
    'tools.executed': 'Tool executed!',
    'tools.cat.system': 'System',
    'tools.cat.email': 'Email',
    'tools.cat.automation': 'Automation',
    'tools.cat.pdf': 'PDF',
    'tools.cat.dev': 'Dev Tools',
    'tools.cat.network': 'Network',
    'tools.cat.media': 'Media',
    'tools.cat.clipboard': 'Clipboard',
    'tools.cat.files': 'Files',
    'tools.cat.other': 'Other',

    // Users
    'users.none': 'No Users',
    'users.none.desc': 'Users are automatically tracked when someone writes.',
    'users.kill.confirm': 'Really delete user "{name}"?\n\nThis deletes:\n• Active session (+ running query)\n• Profile data\n• Chat history\n• Memory directory\n\nThis action cannot be undone!',
    'users.deleted': 'User deleted.',
    'users.deleted.summary': 'Deleted: {items}',
    'users.nothing': 'Nothing to delete',
    'users.no.session': 'No active session',
    'users.processing': 'Processing...',
    'users.query.active': 'Query active',
    'users.in.queue': '{count} in queue',
    'users.cost': 'Cost',
    'users.msgs': 'Messages',
    'users.tools': 'Tools',
    'users.history': 'History',
    'users.effort': 'Effort',
    'users.just.now': 'just now',
    'users.min.ago': '{n} min ago',
    'users.hrs.ago': '{n} hrs ago',
    'users.messages.total': '{n} messages',
    'users.last.active': 'Last active',
    'users.platform.unknown': 'Unknown',

    // Platforms
    'platforms.title': 'Messaging Platforms',
    'platforms.desc': 'Connect Alvin Bot with various messaging services. Multiple can be active.',
    'platforms.ready': 'Ready',
    'platforms.deps.missing': 'Deps missing',
    'platforms.not.configured': 'Not configured',
    'platforms.setup.guide': 'Setup Guide',
    'platforms.save': 'Save',
    'platforms.saved': 'Saved!',
    'platforms.saved.restart': 'Saved! Restart needed for changes.',
    'platforms.install.deps': 'Install Dependencies',
    'platforms.installing': 'Installing dependencies...',
    'platforms.installed': 'Dependencies installed!',
    'platforms.test': 'Test Connection',
    'platforms.testing': 'Testing...',
    'platforms.connected': 'Connected',
    'platforms.disable': 'Disable',
    'platforms.disable.confirm': 'Really disable {id}?',
    'platforms.disabled': 'Platform disabled. Restart needed.',
    'platforms.status.connected': 'Connected',
    'platforms.status.connecting': 'Connecting...',
    'platforms.status.qr': 'Scan QR Code!',
    'platforms.status.error': 'Error',
    'platforms.status.disconnected': 'Not connected',
    'platforms.status.logged.out': 'Logged out',

    // WhatsApp
    'wa.status.loading': 'Loading status...',
    'wa.check.status': 'Check Status',
    'wa.disconnect': 'Disconnect & Reset',
    'wa.disconnect.confirm': 'Disconnect WhatsApp and delete auth data?\n\nYou\'ll need to scan the QR code again.',
    'wa.disconnected': 'Auth data deleted. Please restart bot.',
    'wa.scan.qr': 'Scan with WhatsApp → Linked Devices → Link a Device',
    'wa.qr.ready': 'QR code ready — scan now!',
    'wa.qr.available': 'QR ready',
    'wa.not.connected': 'WhatsApp not connected — connect above first.',
    'wa.groups': 'Group Management',
    'wa.groups.loading': 'Loading WhatsApp groups...',
    'wa.groups.count': '{count} groups',
    'wa.groups.active': '{count} active',
    'wa.groups.participants': '{count} participants',
    'wa.groups.enabled': '{name} enabled',
    'wa.groups.disabled': '{name} disabled',
    'wa.groups.configured': '{name} configured and enabled!',
    'wa.groups.rule.deleted': 'Rule deleted',
    'wa.groups.rule.delete.confirm': 'Delete rule for this group?',
    'wa.groups.no.config': 'Not configured',
    'wa.groups.allowed': '{count} allowed contacts',
    'wa.groups.all.allowed': 'All participants allowed',
    'wa.groups.mention.required': '@ Mention required',
    'wa.groups.all.messages': 'All messages',
    'wa.groups.media': 'Process media',
    'wa.groups.approval': 'Approval before processing',
    'wa.groups.allowed.contacts': 'Allowed Contacts',
    'wa.groups.select.all': 'All',
    'wa.groups.select.none': 'None',
    'wa.groups.no.selection': 'No selection = everyone can interact',
    'wa.groups.admin': 'Admin',
    'wa.approval': 'Approval',
    'wa.auto': 'Auto',

    // Terminal
    'terminal.placeholder': 'Enter command...',
    'terminal.run': 'Run',

    // Settings
    'settings.sudo': 'Sudo / Admin Rights',
    'settings.sudo.desc': 'Allow Alvin Bot to execute commands with administrator privileges',
    'settings.sudo.active': 'Active & verified',
    'settings.sudo.configured': 'Configured, verification needed',
    'settings.sudo.not.set': 'Not set up',
    'settings.sudo.status': 'Status',
    'settings.sudo.storage': 'Storage',
    'settings.sudo.system': 'System',
    'settings.sudo.accessibility': 'Accessibility',
    'settings.sudo.fda': 'Full Disk Access',
    'settings.sudo.open': 'Open',
    'settings.sudo.password': 'Enter system password...',
    'settings.sudo.setup': 'Set up',
    'settings.sudo.stored.secure': 'Password is stored securely — never in plain text.',
    'settings.sudo.setup.ok': 'Sudo set up & verified!',
    'settings.sudo.verify': 'Verify',
    'settings.sudo.verifying': 'Verifying...',
    'settings.sudo.verified': 'Sudo works!',
    'settings.sudo.test': 'Test Command',
    'settings.sudo.test.prompt': 'Sudo command to test:',
    'settings.sudo.admin.dialog': 'Admin Dialog',
    'settings.sudo.admin.reason': 'Reason for admin rights:',
    'settings.sudo.admin.default.reason': 'Alvin Bot needs administrator rights',
    'settings.sudo.admin.showing': 'Showing macOS Admin dialog...',
    'settings.sudo.admin.confirmed': 'Confirmed!',
    'settings.sudo.admin.denied': 'Denied or error',
    'settings.sudo.revoke': 'Revoke',
    'settings.sudo.revoke.confirm': 'Really revoke sudo access? Stored password will be deleted.',
    'settings.sudo.revoked': 'Sudo access revoked',
    'settings.sudo.executing': 'Executing...',
    'settings.sudo.output': 'Output',
    'settings.env': 'Environment Variables',
    'settings.env.add': 'Add Variable',
    'settings.env.name.prompt': 'Variable Name (e.g. DISCORD_TOKEN):',
    'settings.env.value.prompt': 'Value for {key}:',
    'settings.env.new.prompt': 'New value for {key}:',
    'settings.env.saved': '{key} saved! Restart needed.',
    'settings.env.added': '{key} added!',
    'settings.sysopen': 'System settings opened',

    // Maintenance
    'maint.doctor': 'System Doctor',
    'maint.doctor.errors': '{errors} errors, {warns} warnings',
    'maint.doctor.check': 'Check',
    'maint.doctor.fix.all': 'Fix All',
    'maint.doctor.fix.all.confirm': 'Automatically repair all issues?',
    'maint.doctor.fixed': '{ok} fixed',
    'maint.doctor.failed': '{fail} failed',
    'maint.backup': 'Backup & Restore',
    'maint.backup.desc': 'Backup and restore Config, Memory, Tools, SOUL.md',
    'maint.backup.create': 'Create Backup',
    'maint.backup.creating': 'Creating backup...',
    'maint.backup.name.prompt': 'Backup name (optional):',
    'maint.backup.created': 'Backup "{id}" created ({count} files)',
    'maint.backup.files': 'Files',
    'maint.backup.files.in': 'Files in {id}',
    'maint.backup.restore': 'Restore',
    'maint.backup.restore.confirm': 'Restore backup "{id}"?\n\nCurrent config files will be overwritten!\nBot restart needed after.',
    'maint.backup.restored': '{count} files restored! Bot restart needed.',
    'maint.backup.delete.confirm': 'Permanently delete backup "{id}"?',
    'maint.backup.deleted': 'Deleted',
    'maint.backup.none': 'No backups yet.',
    'maint.pm2': 'Process Control (PM2)',
    'maint.pm2.desc': 'Start, stop and monitor the bot process',
    'maint.pm2.status': 'Status',
    'maint.pm2.loading': 'Loading PM2 status...',
    'maint.pm2.unreachable': 'Unreachable',
    'maint.pm2.restart': 'Restart',
    'maint.pm2.restart.confirm': 'Restart bot? Running queries will be aborted.',
    'maint.pm2.reload': 'Reload',
    'maint.pm2.stop': 'Stop',
    'maint.pm2.stop.confirm': 'Really stop bot? The bot will go offline!',
    'maint.pm2.start': 'Start',
    'maint.pm2.flush': 'Flush Logs',
    'maint.pm2.action.ok': 'PM2 {action} successful',
    'maint.pm2.action.fail': 'PM2 {action} failed',
    'maint.pm2.lost': 'Connection lost (bot stopped?)',
    'maint.logs': 'Recent Logs',
    'maint.logs.desc': 'Last 30 lines of bot output',
    'maint.logs.refresh': 'Refresh',
    'maint.logs.load': 'Click "Refresh" to load logs.',
    'maint.bot.restart': 'Restart Bot',
    'maint.bot.restart.confirm': 'Really restart bot? Running queries will be aborted.',
    'maint.bot.restarting': 'Bot is restarting...',
    'maint.bot.reconnecting': 'Bot should be available shortly...',

    // Command Palette
    'cmd.title': 'Command Palette',
    'cmd.placeholder': 'Search pages, actions...',
    'cmd.goto': 'Go to',
    'cmd.actions': 'Actions',
    'cmd.action.reset': 'Reset chat',
    'cmd.action.theme': 'Toggle theme',
    'cmd.action.export': 'Export chat',
    'cmd.action.lang': 'Switch language',
    'cmd.no.results': 'No results',

    // Provider Add
    'provider.add.title': 'Add Provider',
    'provider.add.desc': 'Configure and activate a new AI provider.',
    'provider.add.select': 'Select provider',
    'provider.add.key': 'API Key',
    'provider.add.test': 'Test Key',
    'provider.add.save': 'Save & Activate',
    'provider.add.chain': 'Add to fallback chain',

    // Claude SDK
    'claude.sdk.title': 'Set up Claude SDK',
    'claude.sdk.checking': 'Checking CLI installation...',
    'claude.sdk.step1': 'Step 1: Install CLI',
    'claude.sdk.step1.cmd': 'npm install -g @anthropic-ai/claude-code',
    'claude.sdk.step2': 'Step 2: Login',
    'claude.sdk.step2.cmd': 'claude login',
    'claude.sdk.step3': 'Step 3: Check status',

    // Setup Wizard
    'wizard.title': 'Welcome to Alvin Bot!',
    'wizard.subtitle': 'Your AI assistant will be ready in 3 simple steps.',
    'wizard.step': 'Step {n} of {total}',
    'wizard.step1.title': 'Create Telegram Bot',
    'wizard.step1.desc': 'Create your own bot on Telegram.',
    'wizard.step1.instruction1': '1. Open Telegram and search for',
    'wizard.step1.instruction2': '2. Send /newbot and choose a name',
    'wizard.step1.instruction3': '3. Paste the bot token here',
    'wizard.step1.token.placeholder': 'Paste bot token (e.g. 123456:ABC-DEF...)',
    'wizard.step1.token.validate': 'Validate token',
    'wizard.step1.token.valid': 'Bot found:',
    'wizard.step1.token.invalid': 'Invalid token',
    'wizard.step1.userid': 'Your Telegram User ID',
    'wizard.step1.userid.placeholder': 'Your User ID (e.g. 123456789)',
    'wizard.step1.userid.help': 'Send a message to @userinfobot to get your ID.',
    'wizard.step2.title': 'Choose AI Provider',
    'wizard.step2.desc': 'Choose which AI powers your bot.',
    'wizard.step2.recommended': 'Recommended',
    'wizard.step2.free': 'Free',
    'wizard.step2.premium': 'Premium',
    'wizard.step2.key.placeholder': 'Enter API key...',
    'wizard.step3.title': 'Almost done!',
    'wizard.step3.desc': 'Optional settings — you can change these later.',
    'wizard.step3.password': 'Web Dashboard Password (optional)',
    'wizard.step3.password.placeholder': 'Password for this dashboard',
    'wizard.step3.password.help': 'Protects access to this dashboard. Leave empty = open access.',
    'wizard.finish': 'Complete Setup',
    'wizard.finish.success': 'Setup complete! Bot is restarting...',
    'wizard.finish.restart': 'Please restart the bot: pm2 restart alvin-bot',
    'wizard.skip': 'Skip',
    'wizard.back': 'Back',
    'wizard.next': 'Next',
    'wizard.alreadySet': 'already configured — leave blank to keep',
    'wizard.keepHint': 'Already configured — leave blank to keep the current value.',
  },
};

// Current language
let _currentLang = localStorage.getItem('lang') || (navigator.language?.startsWith('de') ? 'de' : 'en');

/**
 * Get translated string
 * @param {string} key - Translation key
 * @param {Object} params - Parameters for interpolation {count: 5} → replaces {count}
 * @returns {string} Translated string or key if not found
 */
function t(key, params = {}) {
  let str = STRINGS[_currentLang]?.[key] || STRINGS.en[key] || key;
  for (const [k, v] of Object.entries(params)) {
    str = str.replace(new RegExp(`\\{${k}\\}`, 'g'), v);
  }
  return str;
}

/**
 * Get current language
 */
function getLang() {
  return _currentLang;
}

/**
 * Set language and refresh UI
 * @param {string} lang - 'de' or 'en'
 */
function setLang(lang) {
  _currentLang = lang;
  localStorage.setItem('lang', lang);
  // Re-render the entire UI by re-triggering the active page
  if (typeof refreshUI === 'function') refreshUI();
}

/**
 * Toggle between DE and EN
 */
function toggleLang() {
  setLang(_currentLang === 'de' ? 'en' : 'de');
}
