-
+
-
+
-
+
@@ -173,34 +173,34 @@
-
+
-
+
-
+
-
+
-
+
-
+
-
+
@@ -210,28 +210,28 @@
-
+
-
+
-
+
-
+
diff --git a/src/ClawdDotNet.Desktop/i18n/de.json b/src/ClawdDotNet.Desktop/i18n/de.json
new file mode 100644
index 0000000..10e6a7c
--- /dev/null
+++ b/src/ClawdDotNet.Desktop/i18n/de.json
@@ -0,0 +1,339 @@
+{
+ "desktop.mainWindow.title": "ClawdDotNet",
+ "desktop.mainWindow.sidebarTooltip": "Seitenleiste ein-/ausklappen",
+ "desktop.mainWindow.switchInstance": "Instanz wechseln",
+ "desktop.mainWindow.instance": "INSTANZ",
+ "desktop.mainWindow.themeLight": "Hellmodus",
+ "desktop.mainWindow.themeDark": "Dunkelmodus",
+ "desktop.mainWindow.themeToggle": "Farbschema umschalten",
+ "desktop.mainWindow.openInstanceFolder": "Instanz-Ordner öffnen",
+ "desktop.mainWindow.instanceManager": "Instanzmanager",
+ "desktop.mainWindow.exit": "Beenden",
+ "desktop.mainWindow.instanceLabel": "Instanz: {0}",
+ "desktop.mainWindow.apiStatus": "API {0}",
+ "desktop.mainWindow.credits": "Credits: ${0:F2} von ${1:F2}",
+ "desktop.mainWindow.creditsNone": "Credits: —",
+ "desktop.mainWindow.dismiss": "Ausblenden",
+
+ "desktop.nav.work": "Arbeiten",
+ "desktop.nav.analytics": "Analyse",
+ "desktop.nav.system": "System",
+
+ "desktop.status.unknown": "unbekannt",
+ "desktop.status.design": "Entwurf",
+ "desktop.status.noApiKey": "kein API-Key",
+ "desktop.status.noUsageData": "keine Nutzungsdaten",
+ "desktop.status.ready": "Bereit",
+ "desktop.status.reachable": "OK",
+ "desktop.status.unreachable": "nicht erreichbar",
+
+ "desktop.chat.agent": "Agent:",
+ "desktop.chat.clearHistory": "Verlauf leeren",
+ "desktop.chat.abort": "Abbrechen",
+ "desktop.chat.inputPlaceholder": "Nachricht eingeben… (Enter zum Senden, Shift+Enter für neue Zeile)",
+ "desktop.chat.send": "Senden",
+ "desktop.chat.statusReady": "Bereit",
+ "desktop.chat.statusSending": "Sende…",
+ "desktop.chat.statusDesign": "Entwurfsmodus",
+ "desktop.chat.noApiKey": "OpenRouter API-Key ist nicht konfiguriert. Bitte in den Einstellungen hinterlegen.",
+ "desktop.chat.noAgent": "Bitte einen Agenten auswählen.",
+ "desktop.chat.emptyMessage": "Bitte eine Nachricht eingeben.",
+
+ "desktop.agents.addAgent": "Agent",
+ "desktop.agents.removeAgent": "Agent",
+ "desktop.agents.runNow": "Jetzt ausf.",
+ "desktop.agents.identity": "Identity",
+ "desktop.agents.soul": "Soul",
+ "desktop.agents.folder": "Ordner",
+ "desktop.agents.save": "Speichern",
+ "desktop.agents.thDisplayName": "ANZEIGENAME",
+ "desktop.agents.thModel": "MODELL",
+ "desktop.agents.thSummary": "KURZINFO",
+ "desktop.agents.kickerGeneralModel": "ALLGEMEIN & MODELL",
+ "desktop.agents.agentId": "Agent-ID",
+ "desktop.agents.displayName": "Anzeigename",
+ "desktop.agents.model": "Modell",
+ "desktop.agents.promptCaching": "Prompt Caching",
+ "desktop.agents.roleDescription": "Rolle / Beschreibung",
+ "desktop.agents.systemPrompt": "System-Prompt (zusätzliche Anweisungen)",
+ "desktop.agents.kickerLimits": "GRENZEN",
+ "desktop.agents.limitsTitle": "Schutzgrenzen (LoopGuard & Budget)",
+ "desktop.agents.maxSteps": "Max. Schritte pro Run",
+ "desktop.agents.timeoutSeconds": "Timeout (Sekunden)",
+ "desktop.agents.maxContextTokens": "Max. Kontext-Tokens",
+ "desktop.agents.maxToolResultChars": "Max. Tool-Ergebnis (Zeichen)",
+ "desktop.agents.dailyCost": "Tagesbudget ($ USD)",
+ "desktop.agents.dailyTokens": "Tagesbudget (Tokens)",
+ "desktop.agents.allowedToolsFor": "ZUGELASSENE WERKZEUGE FÜR {0}",
+ "desktop.agents.thTool": "WERKZEUG",
+ "desktop.agents.thDescription": "BESCHREIBUNG",
+ "desktop.agents.toolSettingsKicker": "WERKZEUG-EINSTELLUNGEN",
+ "desktop.agents.apply": "Übernehmen",
+ "desktop.agents.saved": "Agenten erfolgreich gespeichert.",
+
+ "desktop.tasks.tabJobs": "Geplante Jobs",
+ "desktop.tasks.tabServices": "Dienste",
+ "desktop.tasks.tabHistory": "Verlauf",
+ "desktop.tasks.addJob": "Job hinzufügen",
+ "desktop.tasks.editJob": "Bearbeiten",
+ "desktop.tasks.removeJob": "Entfernen",
+ "desktop.tasks.toggleJob": "Aktivieren/Deaktivieren",
+ "desktop.tasks.runJobNow": "Jetzt ausführen",
+ "desktop.tasks.refresh": "Aktualisieren",
+ "desktop.tasks.thType": "TYP",
+ "desktop.tasks.thAgent": "AGENT",
+ "desktop.tasks.thTask": "TOOL / NACHRICHT",
+ "desktop.tasks.thCron": "CRON",
+ "desktop.tasks.thNextRun": "NÄCHSTER LAUF",
+ "desktop.tasks.thLastRun": "LETZTER LAUF",
+ "desktop.tasks.thStatus": "STATUS",
+
+ "desktop.services.addService": "Dienst hinzufügen",
+ "desktop.services.removeService": "Entfernen",
+ "desktop.services.toggleService": "Aktivieren/Deaktivieren",
+ "desktop.services.thName": "DIENSTNAME",
+ "desktop.services.thType": "TYP",
+ "desktop.services.thPort": "PORT",
+ "desktop.services.thStatus": "STATUS",
+ "desktop.services.thDescription": "BESCHREIBUNG",
+
+ "desktop.history.refresh": "Verlauf aktualisieren",
+ "desktop.history.thTime": "ZEITPUNKT",
+ "desktop.history.thJob": "JOB",
+ "desktop.history.thAgent": "AGENT",
+ "desktop.history.thDescription": "BESCHREIBUNG",
+ "desktop.history.thStatus": "STATUS",
+ "desktop.history.thDetails": "DETAILS",
+
+ "desktop.usage.kickerTokens7d": "TOKENS (7 TAGE)",
+ "desktop.usage.kickerCost7d": "KOSTEN (7 TAGE)",
+ "desktop.usage.kickerRuns7d": "RUNS (7 TAGE)",
+ "desktop.usage.refresh": "Aktualisieren",
+ "desktop.usage.tokensPerDay": "Tokens pro Tag",
+ "desktop.usage.breakdownTitle": "Aufschlüsselung nach Agent & Modell",
+ "desktop.usage.thAgent": "AGENT",
+ "desktop.usage.thModel": "MODELL",
+ "desktop.usage.thTokens": "TOKENS",
+ "desktop.usage.thCost": "KOSTEN",
+ "desktop.usage.thRuns": "RUNS",
+ "desktop.usage.empty": "Noch keine Tokennutzung aufgezeichnet.",
+
+ "desktop.agentChats.agentA": "Agent A:",
+ "desktop.agentChats.agentB": "Agent B:",
+ "desktop.agentChats.empty": "Noch keine Nachrichten zwischen diesen Agenten aufgezeichnet.",
+ "desktop.agentChats.needTwo": "Für einen Verlauf braucht es mindestens zwei Agenten in dieser Instanz.",
+
+ "desktop.backup.kickerManual": "MANUELL",
+ "desktop.backup.titleCreate": "Sicherung erstellen",
+ "desktop.backup.targetFolder": "Zielordner",
+ "desktop.backup.targetFolderPlaceholder": "Zielordner für Sicherungen…",
+ "desktop.backup.browse": "Durchsuchen…",
+ "desktop.backup.credentials": "Zugangsdaten",
+ "desktop.backup.credentialsExclude": "nicht mitsichern",
+ "desktop.backup.credentialsProtect": "mit Passphrase schützen",
+ "desktop.backup.passphrase": "Passphrase eingeben",
+ "desktop.backup.passphraseRepeat": "Passphrase wiederholen",
+ "desktop.backup.scope": "Umfang",
+ "desktop.backup.scopeChat": "Chatverläufe",
+ "desktop.backup.scopeLogs": "Protokolle",
+ "desktop.backup.createNow": "Sicherung jetzt erstellen",
+ "desktop.backup.kickerAuto": "AUTOMATIK",
+ "desktop.backup.titleAuto": "Automatische Sicherung",
+ "desktop.backup.autoDaily": "täglich sichern um",
+ "desktop.backup.time": "Uhrzeit",
+ "desktop.backup.keep": "Aufbewahren",
+ "desktop.backup.autoHint": "Die Automatik sichert ohne Zugangsdaten — eine gespeicherte Passphrase wäre wirkungslos.",
+ "desktop.backup.kickerExisting": "BESTAND",
+ "desktop.backup.titleExisting": "Vorhandene Sicherungen",
+ "desktop.backup.refresh": "Aktualisieren",
+ "desktop.backup.openFolder": "Ordner öffnen",
+ "desktop.backup.delete": "Löschen",
+ "desktop.backup.restore": "Wiederherstellen…",
+ "desktop.backup.thFilename": "DATEINAME",
+ "desktop.backup.thCreatedAt": "ERSTELLT AM",
+ "desktop.backup.thInstance": "INSTANZ",
+ "desktop.backup.thSize": "GRÖSSE",
+ "desktop.backup.thSecrets": "ZUGANGSDATEN",
+
+ "desktop.logs.module": "Modul:",
+ "desktop.logs.level": "Stufe:",
+ "desktop.logs.refresh": "Aktualisieren",
+ "desktop.logs.clear": "Leeren",
+ "desktop.logs.openFolder": "Ordner öffnen",
+ "desktop.logs.follow": "Mitlaufen",
+
+ "desktop.settings.discard": "Verwerfen",
+ "desktop.settings.save": "Speichern",
+ "desktop.settings.instance": "INSTANZ",
+ "desktop.settings.instanceName": "Instanz-Name",
+ "desktop.settings.apiKey": "OpenRouter API-Key",
+ "desktop.settings.autostart": "Autostart durch Manager",
+ "desktop.settings.autostartHint": "Der Instanzmanager startet diese Instanz, wenn er hochkommt, und wieder, wenn sie abstürzt. Nach mehreren Neustarts in kurzer Folge setzt er aus und meldet es.",
+ "desktop.settings.logDir": "Protokoll-Verzeichnis",
+ "desktop.settings.logDirHint": "Gilt nur für diese Instanz. Leer heißt: Unterordner Logs im Instanzverzeichnis.",
+ "desktop.settings.dailyCost": "Tagesbudget ($ USD)",
+ "desktop.settings.dailyTokens": "Tagesbudget (Tokens)",
+ "desktop.settings.general": "ALLGEMEIN",
+ "desktop.settings.instancesDir": "Instanzen-Verzeichnis",
+ "desktop.settings.minLogLevel": "Minimaler Log-Level",
+ "desktop.settings.openRouterUrl": "OpenRouter Base-URL",
+ "desktop.settings.language": "Sprache",
+ "desktop.settings.dcAndLicense": "DEPLOYMENTCENTER & LIZENZ",
+ "desktop.settings.dcUrl": "Server-URL",
+ "desktop.settings.dcToken": "Master-Token",
+ "desktop.settings.dcEnv": "Umgebung",
+ "desktop.settings.updateChannel": "Update-Kanal",
+ "desktop.settings.licenseKey": "Lizenzschlüssel",
+ "desktop.settings.errorReporting": "Fehler automatisch an Deploymentcenter melden",
+ "desktop.settings.updateCheck": "Beim Start automatisch auf Updates prüfen",
+ "desktop.settings.saved": "Einstellungen und Instanz-Konfiguration gespeichert.",
+ "desktop.settings.savedLogRestart": "Gespeichert. Das Protokoll-Verzeichnis gilt ab dem nächsten Start.",
+
+ "desktop.info.kickerApp": "ANWENDUNG",
+ "desktop.info.build": "Build",
+ "desktop.info.version": "Version",
+ "desktop.info.buildSummary": "Build-Zusammenfassung",
+ "desktop.info.kickerInstance": "INSTANZ",
+ "desktop.info.currentInstance": "Aktuelle Instanz",
+ "desktop.info.openFolder": "Instanz-Ordner öffnen",
+ "desktop.info.name": "Name",
+ "desktop.info.id": "ID",
+ "desktop.info.path": "Pfad",
+ "desktop.info.logDir": "Log-Ordner",
+ "desktop.info.openRouter": "OpenRouter",
+ "desktop.info.kickerModules": "MODULE",
+ "desktop.info.assemblies": "Baugruppen",
+ "desktop.info.thModule": "MODUL",
+ "desktop.info.thBuild": "BUILD",
+ "desktop.info.thBuildDate": "BUILD-DATUM",
+ "desktop.info.thChanges": "ÄNDERUNGEN",
+
+ "desktop.dialog.addAgent": "Neuen Agenten anlegen",
+ "desktop.dialog.agentId": "Agent-ID (eindeutiger Schlüssel):",
+ "desktop.dialog.agentDisplayName": "Anzeigename:",
+ "desktop.dialog.defaultModel": "Standard-Modell:",
+ "desktop.dialog.roleDescription": "Beschreibung / Rolle:",
+ "desktop.dialog.addJobTitle": "Job hinzufügen / bearbeiten",
+ "desktop.dialog.jobType": "Job-Typ:",
+ "desktop.dialog.agentWakeup": "Agent Wakeup (Periodische Ausführung)",
+ "desktop.dialog.toolJob": "Tool Job (Werkzeug-spezifischer Job)",
+ "desktop.dialog.jobTypeId": "Job-Typ-ID / Name:",
+ "desktop.dialog.taskMessage": "Aufgabenbeschreibung / Nachricht:",
+ "desktop.dialog.cronExpression": "Cron-Ausdruck:",
+ "desktop.dialog.cronHint": "Syntax: Min Std Tag Mon Wochentag (z.B. '*/15 * * * *' alle 15 Minuten)",
+ "desktop.dialog.runOnStart": "Beim Anwendungsstart einmalig sofort ausführen",
+ "desktop.dialog.addServiceTitle": "Dienst (Service) hinzufügen",
+ "desktop.dialog.serviceName": "Name des Dienstes:",
+ "desktop.dialog.serviceType": "Typ:",
+ "desktop.dialog.servicePort": "Port:",
+ "desktop.dialog.serviceDesc": "Beschreibung:",
+ "desktop.dialog.restoreTitle": "Sicherung wiederherstellen",
+ "desktop.dialog.backupInfo": "Sicherungsinformationen",
+ "desktop.dialog.backupInstance": "Instanz: {0}",
+ "desktop.dialog.backupCreated": "Erstellt: {0:g}",
+ "desktop.dialog.backupFiles": "Dateien: {0}",
+ "desktop.dialog.backupSecrets": "Zugangsdaten: {0}",
+ "desktop.dialog.targetDir": "Zielordner:",
+ "desktop.dialog.chooseFolder": "Ordner wählen",
+ "desktop.dialog.restoreHint": "Hinweis: Es wird empfohlen, in einen neuen Ordner wiederherzustellen, um Konflikte mit laufenden Prozessen zu vermeiden.",
+ "desktop.dialog.passphrase": "Passphrase:",
+ "desktop.dialog.passphraseProtected": "Diese Sicherung enthält geschützte Zugangsdaten.",
+ "desktop.dialog.overwriteExisting": "Vorhandene Dateien im Zielordner überschreiben",
+ "desktop.dialog.licenseTitle": "ClawdDotNet – Lizenz",
+ "desktop.dialog.licenseKey": "Lizenzschlüssel",
+ "desktop.dialog.hardwareId": "Hardware-ID (für den Support):",
+ "desktop.dialog.verify": "Prüfen",
+ "desktop.dialog.textEditorTitle": "Text bearbeiten",
+
+ "desktop.instancePicker.titleSwitch": "Instanz wechseln",
+ "desktop.instancePicker.titleSelect": "Instanz wählen",
+ "desktop.instancePicker.hintSwitch": "Jede Instanz läuft unabhängig mit eigenen Agenten und Daten. Wechseln startet ClawdDotNet mit der gewählten Instanz neu.",
+ "desktop.instancePicker.hintSelect": "Jede Instanz läuft unabhängig mit eigenen Agenten und Daten.",
+ "desktop.instancePicker.confirmSwitch": "Wechseln",
+ "desktop.instancePicker.confirmStart": "Starten",
+ "desktop.instancePicker.newInstancePlaceholder": "Name der neuen Instanz",
+ "desktop.instancePicker.create": "Anlegen",
+ "desktop.instancePicker.active": "Aktiv",
+ "desktop.instancePicker.dirLabel": "Verzeichnis: {0}",
+ "desktop.instancePicker.agentsCount": "{0} Agenten · API-Key {1}",
+ "desktop.instancePicker.apiKeyConfigured": "konfiguriert",
+ "desktop.instancePicker.apiKeyMissing": "fehlt",
+ "desktop.instancePicker.tooltipConfigured": "API-Key hinterlegt",
+ "desktop.instancePicker.tooltipMissing": "Kein API-Key — Agenten bleiben deaktiviert",
+ "desktop.instancePicker.nameRequired": "Bitte einen Instanznamen eingeben.",
+ "desktop.instancePicker.createFailed": "Instanz konnte nicht angelegt werden: {0}",
+
+ "desktop.startMode.title": "ClawdDotNet – Startmodus wählen",
+ "desktop.startMode.question": "Wie möchtest du ClawdDotNet starten?",
+ "desktop.startMode.managerBtn": "Instanzmanager starten (Empfohlen)",
+ "desktop.startMode.standaloneBtn": "Als Standalone-Instanz starten",
+ "desktop.startMode.explanation": "• Instanzmanager (Empfohlen):\n Startet den zentralen Hintergrund-Manager und öffnet die Verwaltung im Browser. Ermöglicht den stabilen Dauerbetrieb mehrerer Instanzen parallel ohne Absturzrisiko.\n\n• Standalone-Modus:\n Startet genau eine Instanz direkt als einzelnes Desktop-Fenster.",
+
+ "desktop.standaloneSwitch.title": "ClawdDotNet – Instanzwechsel (Standalone)",
+ "desktop.standaloneSwitch.warning": "Achtung: Standalone-Modus",
+ "desktop.standaloneSwitch.text": "Diese Instanz läuft eigenständig ohne Instanzmanager.\n\nWenn du die Instanz hier wechselst, wird diese Instanz vollständig beendet und alle laufenden Agenten und Hintergrunddienste werden gestoppt.\n\nEmpfehlung: Starte stattdessen den Instanzmanager, um mehrere Instanzen gleichzeitig und unabhängig voneinander zu betreiben.",
+ "desktop.standaloneSwitch.switchAnyway": "Instanz trotzdem wechseln",
+
+ "desktop.toolSettings.noSettings": "Dieses Werkzeug benötigt keine weiteren Einstellungen.",
+ "desktop.toolSettings.host": "Host",
+ "desktop.toolSettings.port": "Port",
+ "desktop.toolSettings.username": "Benutzername",
+ "desktop.toolSettings.password": "Passwort",
+ "desktop.toolSettings.rootPath": "Root-Pfad",
+ "desktop.toolSettings.imapHost": "IMAP-Host",
+ "desktop.toolSettings.imapPort": "IMAP-Port",
+ "desktop.toolSettings.smtpHost": "SMTP-Host",
+ "desktop.toolSettings.smtpPort": "SMTP-Port",
+ "desktop.toolSettings.allowedRecipients": "Erlaubte Empfänger",
+ "desktop.toolSettings.type": "Typ",
+ "desktop.toolSettings.connectionString": "Connection-String",
+ "desktop.toolSettings.accessLevel": "Zugriffsebene",
+ "desktop.toolSettings.allowedTables": "Erlaubte Tabellen",
+ "desktop.toolSettings.botToken": "Bot-Token",
+ "desktop.toolSettings.defaultChatId": "Standard Chat-ID",
+ "desktop.toolSettings.allowedChatIds": "Erlaubte Chat-IDs",
+ "desktop.toolSettings.defaultProvider": "Standard-Provider",
+ "desktop.toolSettings.cacheTtl": "Cache TTL (Sekunden)",
+ "desktop.toolSettings.twelveDataKey": "Twelve Data Key",
+ "desktop.toolSettings.alphaVantageKey": "Alpha Vantage Key",
+ "desktop.toolSettings.allowedDomains": "Erlaubte Domains",
+ "desktop.toolSettings.maxResponseKb": "Max. Antwortgröße (KB)",
+ "desktop.toolSettings.userAgent": "User Agent",
+ "desktop.toolSettings.xApiKey": "X (Twitter) API-Key",
+ "desktop.toolSettings.xAccounts": "X Accounts",
+ "desktop.toolSettings.subreddits": "Subreddits",
+ "desktop.toolSettings.redditPostLimit": "Reddit Post Limit",
+ "desktop.toolSettings.openRouterKey": "OpenRouter Key",
+ "desktop.toolSettings.sttModel": "STT-Modell",
+ "desktop.toolSettings.youtubeChannels": "YouTube-Kanäle",
+ "desktop.toolSettings.fileRwPersonalExt": "Erlaubte Dateiendungen (persönlich)",
+ "desktop.toolSettings.fileRwSharedAccess": "Zugriffsebene (geteilt)",
+ "desktop.toolSettings.fileRwSharedExt": "Erlaubte Dateiendungen (geteilt)",
+ "desktop.toolSettings.fileRwProtectedPaths": "Geschützte Pfade",
+
+ "nav.chat": "Chat",
+ "nav.agents": "Agenten",
+ "nav.tasks": "Aufgaben",
+ "nav.usage": "Tokennutzung",
+ "nav.agentChats": "Agenten-Chats",
+ "nav.backup": "Sicherung",
+ "nav.logs": "Protokoll",
+ "nav.settings": "Einstellungen",
+ "nav.info": "Info",
+
+ "common.all": "Alle",
+ "common.save": "Speichern",
+ "common.cancel": "Abbrechen",
+ "common.delete": "Löschen",
+ "common.edit": "Bearbeiten",
+ "common.refresh": "Aktualisieren",
+ "common.close": "Schließen",
+ "common.discard": "Verwerfen",
+ "common.ready": "Bereit",
+ "common.loading": "Lade…",
+ "common.create": "Anlegen",
+ "common.add": "Hinzufügen",
+ "common.apply": "Übernehmen",
+ "common.ok": "OK",
+ "common.exit": "Beenden"
+}
diff --git a/src/ClawdDotNet.Desktop/i18n/en.json b/src/ClawdDotNet.Desktop/i18n/en.json
new file mode 100644
index 0000000..a24da00
--- /dev/null
+++ b/src/ClawdDotNet.Desktop/i18n/en.json
@@ -0,0 +1,339 @@
+{
+ "desktop.mainWindow.title": "ClawdDotNet",
+ "desktop.mainWindow.sidebarTooltip": "Toggle sidebar",
+ "desktop.mainWindow.switchInstance": "Switch instance",
+ "desktop.mainWindow.instance": "INSTANCE",
+ "desktop.mainWindow.themeLight": "Light Mode",
+ "desktop.mainWindow.themeDark": "Dark Mode",
+ "desktop.mainWindow.themeToggle": "Toggle theme",
+ "desktop.mainWindow.openInstanceFolder": "Open Instance Folder",
+ "desktop.mainWindow.instanceManager": "Instance Manager",
+ "desktop.mainWindow.exit": "Exit",
+ "desktop.mainWindow.instanceLabel": "Instance: {0}",
+ "desktop.mainWindow.apiStatus": "API {0}",
+ "desktop.mainWindow.credits": "Credits: ${0:F2} of ${1:F2}",
+ "desktop.mainWindow.creditsNone": "Credits: —",
+ "desktop.mainWindow.dismiss": "Dismiss",
+
+ "desktop.nav.work": "Work",
+ "desktop.nav.analytics": "Analytics",
+ "desktop.nav.system": "System",
+
+ "desktop.status.unknown": "unknown",
+ "desktop.status.design": "Design",
+ "desktop.status.noApiKey": "no API key",
+ "desktop.status.noUsageData": "no usage data",
+ "desktop.status.ready": "Ready",
+ "desktop.status.reachable": "OK",
+ "desktop.status.unreachable": "unreachable",
+
+ "desktop.chat.agent": "Agent:",
+ "desktop.chat.clearHistory": "Clear History",
+ "desktop.chat.abort": "Abort",
+ "desktop.chat.inputPlaceholder": "Type message… (Enter to send, Shift+Enter for new line)",
+ "desktop.chat.send": "Send",
+ "desktop.chat.statusReady": "Ready",
+ "desktop.chat.statusSending": "Sending…",
+ "desktop.chat.statusDesign": "Design Mode",
+ "desktop.chat.noApiKey": "OpenRouter API key is not configured. Please enter the key in Settings.",
+ "desktop.chat.noAgent": "Please select an agent.",
+ "desktop.chat.emptyMessage": "Please enter a message.",
+
+ "desktop.agents.addAgent": "Agent",
+ "desktop.agents.removeAgent": "Agent",
+ "desktop.agents.runNow": "Run Now",
+ "desktop.agents.identity": "Identity",
+ "desktop.agents.soul": "Soul",
+ "desktop.agents.folder": "Folder",
+ "desktop.agents.save": "Save",
+ "desktop.agents.thDisplayName": "DISPLAY NAME",
+ "desktop.agents.thModel": "MODEL",
+ "desktop.agents.thSummary": "SUMMARY",
+ "desktop.agents.kickerGeneralModel": "GENERAL & MODEL",
+ "desktop.agents.agentId": "Agent ID",
+ "desktop.agents.displayName": "Display Name",
+ "desktop.agents.model": "Model",
+ "desktop.agents.promptCaching": "Prompt Caching",
+ "desktop.agents.roleDescription": "Role / Description",
+ "desktop.agents.systemPrompt": "System Prompt (additional instructions)",
+ "desktop.agents.kickerLimits": "LIMITS",
+ "desktop.agents.limitsTitle": "Guardrails (LoopGuard & Budget)",
+ "desktop.agents.maxSteps": "Max Steps per Run",
+ "desktop.agents.timeoutSeconds": "Timeout (seconds)",
+ "desktop.agents.maxContextTokens": "Max Context Tokens",
+ "desktop.agents.maxToolResultChars": "Max Tool Result (chars)",
+ "desktop.agents.dailyCost": "Daily Budget ($ USD)",
+ "desktop.agents.dailyTokens": "Daily Budget (Tokens)",
+ "desktop.agents.allowedToolsFor": "ALLOWED TOOLS FOR {0}",
+ "desktop.agents.thTool": "TOOL",
+ "desktop.agents.thDescription": "DESCRIPTION",
+ "desktop.agents.toolSettingsKicker": "TOOL SETTINGS",
+ "desktop.agents.apply": "Apply",
+ "desktop.agents.saved": "Agents saved successfully.",
+
+ "desktop.tasks.tabJobs": "Scheduled Jobs",
+ "desktop.tasks.tabServices": "Services",
+ "desktop.tasks.tabHistory": "History",
+ "desktop.tasks.addJob": "Add Job",
+ "desktop.tasks.editJob": "Edit",
+ "desktop.tasks.removeJob": "Remove",
+ "desktop.tasks.toggleJob": "Enable/Disable",
+ "desktop.tasks.runJobNow": "Run Now",
+ "desktop.tasks.refresh": "Refresh",
+ "desktop.tasks.thType": "TYPE",
+ "desktop.tasks.thAgent": "AGENT",
+ "desktop.tasks.thTask": "TOOL / MESSAGE",
+ "desktop.tasks.thCron": "CRON",
+ "desktop.tasks.thNextRun": "NEXT RUN",
+ "desktop.tasks.thLastRun": "LAST RUN",
+ "desktop.tasks.thStatus": "STATUS",
+
+ "desktop.services.addService": "Add Service",
+ "desktop.services.removeService": "Remove",
+ "desktop.services.toggleService": "Enable/Disable",
+ "desktop.services.thName": "SERVICE NAME",
+ "desktop.services.thType": "TYPE",
+ "desktop.services.thPort": "PORT",
+ "desktop.services.thStatus": "STATUS",
+ "desktop.services.thDescription": "DESCRIPTION",
+
+ "desktop.history.refresh": "Refresh History",
+ "desktop.history.thTime": "TIMESTAMP",
+ "desktop.history.thJob": "JOB",
+ "desktop.history.thAgent": "AGENT",
+ "desktop.history.thDescription": "DESCRIPTION",
+ "desktop.history.thStatus": "STATUS",
+ "desktop.history.thDetails": "DETAILS",
+
+ "desktop.usage.kickerTokens7d": "TOKENS (7 DAYS)",
+ "desktop.usage.kickerCost7d": "COST (7 DAYS)",
+ "desktop.usage.kickerRuns7d": "RUNS (7 DAYS)",
+ "desktop.usage.refresh": "Refresh",
+ "desktop.usage.tokensPerDay": "Tokens per Day",
+ "desktop.usage.breakdownTitle": "Breakdown by Agent & Model",
+ "desktop.usage.thAgent": "AGENT",
+ "desktop.usage.thModel": "MODEL",
+ "desktop.usage.thTokens": "TOKENS",
+ "desktop.usage.thCost": "COST",
+ "desktop.usage.thRuns": "RUNS",
+ "desktop.usage.empty": "No token usage recorded yet.",
+
+ "desktop.agentChats.agentA": "Agent A:",
+ "desktop.agentChats.agentB": "Agent B:",
+ "desktop.agentChats.empty": "No messages between these agents yet.",
+ "desktop.agentChats.needTwo": "At least two agents are required in this instance to view a conversation history.",
+
+ "desktop.backup.kickerManual": "MANUAL",
+ "desktop.backup.titleCreate": "Create Backup",
+ "desktop.backup.targetFolder": "Target Folder",
+ "desktop.backup.targetFolderPlaceholder": "Target folder for backups…",
+ "desktop.backup.browse": "Browse…",
+ "desktop.backup.credentials": "Credentials",
+ "desktop.backup.credentialsExclude": "do not include",
+ "desktop.backup.credentialsProtect": "protect with passphrase",
+ "desktop.backup.passphrase": "Enter passphrase",
+ "desktop.backup.passphraseRepeat": "Repeat passphrase",
+ "desktop.backup.scope": "Scope",
+ "desktop.backup.scopeChat": "Chat history",
+ "desktop.backup.scopeLogs": "Logs",
+ "desktop.backup.createNow": "Create Backup Now",
+ "desktop.backup.kickerAuto": "AUTOMATIC",
+ "desktop.backup.titleAuto": "Automatic Backup",
+ "desktop.backup.autoDaily": "daily backup at",
+ "desktop.backup.time": "Time",
+ "desktop.backup.keep": "Keep Count",
+ "desktop.backup.autoHint": "Automatic backup excludes credentials — a saved passphrase would be ineffective.",
+ "desktop.backup.kickerExisting": "EXISTING",
+ "desktop.backup.titleExisting": "Existing Backups",
+ "desktop.backup.refresh": "Refresh",
+ "desktop.backup.openFolder": "Open Folder",
+ "desktop.backup.delete": "Delete",
+ "desktop.backup.restore": "Restore…",
+ "desktop.backup.thFilename": "FILENAME",
+ "desktop.backup.thCreatedAt": "CREATED AT",
+ "desktop.backup.thInstance": "INSTANCE",
+ "desktop.backup.thSize": "SIZE",
+ "desktop.backup.thSecrets": "CREDENTIALS",
+
+ "desktop.logs.module": "Module:",
+ "desktop.logs.level": "Level:",
+ "desktop.logs.refresh": "Refresh",
+ "desktop.logs.clear": "Clear",
+ "desktop.logs.openFolder": "Open Folder",
+ "desktop.logs.follow": "Follow Tail",
+
+ "desktop.settings.discard": "Discard",
+ "desktop.settings.save": "Save",
+ "desktop.settings.instance": "INSTANCE",
+ "desktop.settings.instanceName": "Instance Name",
+ "desktop.settings.apiKey": "OpenRouter API Key",
+ "desktop.settings.autostart": "Autostart by Manager",
+ "desktop.settings.autostartHint": "The instance manager starts this instance on launch and restarts it if it crashes.",
+ "desktop.settings.logDir": "Log Directory",
+ "desktop.settings.logDirHint": "Applies only to this instance. Empty means: Logs subfolder in instance directory.",
+ "desktop.settings.dailyCost": "Daily Budget ($ USD)",
+ "desktop.settings.dailyTokens": "Daily Budget (Tokens)",
+ "desktop.settings.general": "GENERAL",
+ "desktop.settings.instancesDir": "Instances Directory",
+ "desktop.settings.minLogLevel": "Minimum Log Level",
+ "desktop.settings.openRouterUrl": "OpenRouter Base URL",
+ "desktop.settings.language": "Language",
+ "desktop.settings.dcAndLicense": "DEPLOYMENTCENTER & LICENSE",
+ "desktop.settings.dcUrl": "Server URL",
+ "desktop.settings.dcToken": "Master Token",
+ "desktop.settings.dcEnv": "Environment",
+ "desktop.settings.updateChannel": "Update Channel",
+ "desktop.settings.licenseKey": "License Key",
+ "desktop.settings.errorReporting": "Automatically report errors to Deploymentcenter",
+ "desktop.settings.updateCheck": "Check for updates automatically on startup",
+ "desktop.settings.saved": "Settings and instance configuration saved successfully.",
+ "desktop.settings.savedLogRestart": "Saved. The log directory will take effect upon next restart.",
+
+ "desktop.info.kickerApp": "APPLICATION",
+ "desktop.info.build": "Build",
+ "desktop.info.version": "Version",
+ "desktop.info.buildSummary": "Build Summary",
+ "desktop.info.kickerInstance": "INSTANCE",
+ "desktop.info.currentInstance": "Current Instance",
+ "desktop.info.openFolder": "Open Instance Folder",
+ "desktop.info.name": "Name",
+ "desktop.info.id": "ID",
+ "desktop.info.path": "Path",
+ "desktop.info.logDir": "Log Directory",
+ "desktop.info.openRouter": "OpenRouter",
+ "desktop.info.kickerModules": "MODULES",
+ "desktop.info.assemblies": "Assemblies",
+ "desktop.info.thModule": "MODULE",
+ "desktop.info.thBuild": "BUILD",
+ "desktop.info.thBuildDate": "BUILD DATE",
+ "desktop.info.thChanges": "CHANGES",
+
+ "desktop.dialog.addAgent": "Create New Agent",
+ "desktop.dialog.agentId": "Agent ID (unique key):",
+ "desktop.dialog.agentDisplayName": "Display Name:",
+ "desktop.dialog.defaultModel": "Default Model:",
+ "desktop.dialog.roleDescription": "Description / Role:",
+ "desktop.dialog.addJobTitle": "Add / Edit Job",
+ "desktop.dialog.jobType": "Job Type:",
+ "desktop.dialog.agentWakeup": "Agent Wakeup (Periodic Execution)",
+ "desktop.dialog.toolJob": "Tool Job (Tool-specific Job)",
+ "desktop.dialog.jobTypeId": "Job Type ID / Name:",
+ "desktop.dialog.taskMessage": "Task Description / Message:",
+ "desktop.dialog.cronExpression": "Cron Expression:",
+ "desktop.dialog.cronHint": "Syntax: Min Hour Day Month Weekday (e.g. '*/15 * * * *' every 15 minutes)",
+ "desktop.dialog.runOnStart": "Run once immediately on application startup",
+ "desktop.dialog.addServiceTitle": "Add Service",
+ "desktop.dialog.serviceName": "Service Name:",
+ "desktop.dialog.serviceType": "Type:",
+ "desktop.dialog.servicePort": "Port:",
+ "desktop.dialog.serviceDesc": "Description:",
+ "desktop.dialog.restoreTitle": "Restore Backup",
+ "desktop.dialog.backupInfo": "Backup Information",
+ "desktop.dialog.backupInstance": "Instance: {0}",
+ "desktop.dialog.backupCreated": "Created: {0:g}",
+ "desktop.dialog.backupFiles": "Files: {0}",
+ "desktop.dialog.backupSecrets": "Credentials: {0}",
+ "desktop.dialog.targetDir": "Target Directory:",
+ "desktop.dialog.chooseFolder": "Choose Folder",
+ "desktop.dialog.restoreHint": "Note: It is recommended to restore into a new folder to avoid conflicts with running processes.",
+ "desktop.dialog.passphrase": "Passphrase:",
+ "desktop.dialog.passphraseProtected": "This backup contains protected credentials.",
+ "desktop.dialog.overwriteExisting": "Overwrite existing files in target folder",
+ "desktop.dialog.licenseTitle": "ClawdDotNet – License",
+ "desktop.dialog.licenseKey": "License Key",
+ "desktop.dialog.hardwareId": "Hardware ID (for support):",
+ "desktop.dialog.verify": "Verify",
+ "desktop.dialog.textEditorTitle": "Edit Text",
+
+ "desktop.instancePicker.titleSwitch": "Switch Instance",
+ "desktop.instancePicker.titleSelect": "Choose Instance",
+ "desktop.instancePicker.hintSwitch": "Each instance runs independently with its own agents and data. Switching restarts ClawdDotNet with the selected instance.",
+ "desktop.instancePicker.hintSelect": "Each instance runs independently with its own agents and data.",
+ "desktop.instancePicker.confirmSwitch": "Switch",
+ "desktop.instancePicker.confirmStart": "Start",
+ "desktop.instancePicker.newInstancePlaceholder": "Name of new instance",
+ "desktop.instancePicker.create": "Create",
+ "desktop.instancePicker.active": "Active",
+ "desktop.instancePicker.dirLabel": "Directory: {0}",
+ "desktop.instancePicker.agentsCount": "{0} Agents · API Key {1}",
+ "desktop.instancePicker.apiKeyConfigured": "configured",
+ "desktop.instancePicker.apiKeyMissing": "missing",
+ "desktop.instancePicker.tooltipConfigured": "API key configured",
+ "desktop.instancePicker.tooltipMissing": "No API key — agents remain inactive",
+ "desktop.instancePicker.nameRequired": "Please enter an instance name.",
+ "desktop.instancePicker.createFailed": "Instance could not be created: {0}",
+
+ "desktop.startMode.title": "ClawdDotNet – Select Start Mode",
+ "desktop.startMode.question": "How would you like to start ClawdDotNet?",
+ "desktop.startMode.managerBtn": "Launch Instance Manager (Recommended)",
+ "desktop.startMode.standaloneBtn": "Start as Standalone Instance",
+ "desktop.startMode.explanation": "• Instance Manager (Recommended):\n Starts the central background manager and opens management in your browser. Enables stable parallel operation of multiple instances without crash risks.\n\n• Standalone Mode:\n Starts exactly one instance directly as a single desktop window.",
+
+ "desktop.standaloneSwitch.title": "ClawdDotNet – Instance Switch (Standalone)",
+ "desktop.standaloneSwitch.warning": "Attention: Standalone Mode",
+ "desktop.standaloneSwitch.text": "This instance runs standalone without the Instance Manager.\n\nIf you switch instances here, this instance will be fully stopped and all running agents and background services will end.\n\nRecommendation: Launch the Instance Manager instead to run multiple instances concurrently and independently.",
+ "desktop.standaloneSwitch.switchAnyway": "Switch Instance Anyway",
+
+ "desktop.toolSettings.noSettings": "This tool does not require additional settings.",
+ "desktop.toolSettings.host": "Host",
+ "desktop.toolSettings.port": "Port",
+ "desktop.toolSettings.username": "Username",
+ "desktop.toolSettings.password": "Password",
+ "desktop.toolSettings.rootPath": "Root Path",
+ "desktop.toolSettings.imapHost": "IMAP Host",
+ "desktop.toolSettings.imapPort": "IMAP Port",
+ "desktop.toolSettings.smtpHost": "SMTP Host",
+ "desktop.toolSettings.smtpPort": "SMTP Port",
+ "desktop.toolSettings.allowedRecipients": "Allowed Recipients",
+ "desktop.toolSettings.type": "Type",
+ "desktop.toolSettings.connectionString": "Connection String",
+ "desktop.toolSettings.accessLevel": "Access Level",
+ "desktop.toolSettings.allowedTables": "Allowed Tables",
+ "desktop.toolSettings.botToken": "Bot Token",
+ "desktop.toolSettings.defaultChatId": "Default Chat ID",
+ "desktop.toolSettings.allowedChatIds": "Allowed Chat IDs",
+ "desktop.toolSettings.defaultProvider": "Default Provider",
+ "desktop.toolSettings.cacheTtl": "Cache TTL (seconds)",
+ "desktop.toolSettings.twelveDataKey": "Twelve Data Key",
+ "desktop.toolSettings.alphaVantageKey": "Alpha Vantage Key",
+ "desktop.toolSettings.allowedDomains": "Allowed Domains",
+ "desktop.toolSettings.maxResponseKb": "Max Response Size (KB)",
+ "desktop.toolSettings.userAgent": "User Agent",
+ "desktop.toolSettings.xApiKey": "X (Twitter) API Key",
+ "desktop.toolSettings.xAccounts": "X Accounts",
+ "desktop.toolSettings.subreddits": "Subreddits",
+ "desktop.toolSettings.redditPostLimit": "Reddit Post Limit",
+ "desktop.toolSettings.openRouterKey": "OpenRouter Key",
+ "desktop.toolSettings.sttModel": "STT Model",
+ "desktop.toolSettings.youtubeChannels": "YouTube Channels",
+ "desktop.toolSettings.fileRwPersonalExt": "Allowed File Extensions (personal)",
+ "desktop.toolSettings.fileRwSharedAccess": "Access Level (shared)",
+ "desktop.toolSettings.fileRwSharedExt": "Allowed File Extensions (shared)",
+ "desktop.toolSettings.fileRwProtectedPaths": "Protected Paths",
+
+ "nav.chat": "Chat",
+ "nav.agents": "Agents",
+ "nav.tasks": "Tasks",
+ "nav.usage": "Token Usage",
+ "nav.agentChats": "Agent Chats",
+ "nav.backup": "Backup",
+ "nav.logs": "Logs",
+ "nav.settings": "Settings",
+ "nav.info": "Info",
+
+ "common.all": "All",
+ "common.save": "Save",
+ "common.cancel": "Cancel",
+ "common.delete": "Delete",
+ "common.edit": "Edit",
+ "common.refresh": "Refresh",
+ "common.close": "Close",
+ "common.discard": "Discard",
+ "common.ready": "Ready",
+ "common.loading": "Loading…",
+ "common.create": "Create",
+ "common.add": "Add",
+ "common.apply": "Apply",
+ "common.ok": "OK",
+ "common.exit": "Exit"
+}
diff --git a/src/ClawdDotNet.Manager.Web/wwwroot/app.js b/src/ClawdDotNet.Manager.Web/wwwroot/app.js
index 6595cf7..5f0f203 100644
--- a/src/ClawdDotNet.Manager.Web/wwwroot/app.js
+++ b/src/ClawdDotNet.Manager.Web/wwwroot/app.js
@@ -30,7 +30,7 @@ import { rendereInstanzen, stoppePolling as stoppeInstanzenPolling } from "./vie
import { rendereEinstellungen } from "./views/settings.js";
import { rendereSicherung } from "./views/backup.js";
import { rendereAgentenChats, trenneAgentenChatsStream } from "./views/agent-chats.js";
-import { loadLanguage, translateDocument } from "./modules/i18n.js";
+import { loadLanguage, translateDocument, setLanguage, currentLanguage, t } from "./modules/i18n.js";
import { renderUsageRuns } from "./views/usage-runs.js";
import { renderUsageTimeline } from "./views/usage-timeline.js";
import { renderRunDetail } from "./views/run-detail.js";
@@ -112,6 +112,18 @@ document.querySelectorAll(".nav-link").forEach((link) => {
});
});
+// Sprache umschalten
+const spracheSchalter = document.getElementById("sprache-schalter");
+spracheSchalter?.addEventListener("change", async (e) => {
+ await setLanguage(e.target.value);
+});
+
+window.addEventListener("clawd:language-changed", () => {
+ if (spracheSchalter) spracheSchalter.value = currentLanguage();
+ const hash = window.location.hash || "#/chat";
+ navigiere(hash);
+});
+
// Farbschema umschalten
themeSchalter?.addEventListener("click", () => {
wechsleTheme();
@@ -145,10 +157,10 @@ beiVerbindungsStatus((istOffen) => {
if (!verbindungPunkt) return;
if (istOffen) {
verbindungPunkt.classList.add("offen");
- verbindungPunkt.title = "Ereignisstrom: verbunden";
+ verbindungPunkt.title = t("header.eventStreamConnected");
} else {
verbindungPunkt.classList.remove("offen");
- verbindungPunkt.title = "Ereignisstrom: getrennt";
+ verbindungPunkt.title = t("header.eventStreamDisconnected");
}
});
@@ -190,7 +202,7 @@ function aktualisiereInstanzPlakette() {
kopfInstanzStatus.replaceWith(neuePlakette);
kopfInstanzStatus = neuePlakette;
} else {
- const text = laufende.length > 1 ? `${laufende.length} laufen` : "Keine aktiv";
+ const text = laufende.length > 1 ? t("header.multipleRunning", { count: laufende.length }) : t("header.noneActive");
const art = laufende.length > 1 ? "warnung" : "neutral";
const neuePlakette = erstellePlakette(text, art);
neuePlakette.id = "kopf-instanz-status";
@@ -203,10 +215,10 @@ function aktualisiereInstanzPlakette() {
if (aktive && aktive.zustand !== "Running") {
startBtn.hidden = false;
startBtn.disabled = false;
- startBtn.textContent = "Starten";
+ startBtn.textContent = t("header.startInstance");
startBtn.onclick = async () => {
startBtn.disabled = true;
- startBtn.textContent = "Startet…";
+ startBtn.textContent = t("header.starting");
try {
const res = await api(`/verwaltung/instanzen/${encodeURIComponent(aktive.id)}/start`, {
method: "POST"
@@ -223,7 +235,7 @@ function aktualisiereInstanzPlakette() {
zeigeMeldung(`Start fehlgeschlagen: ${err.message}`, "gefahr");
}
startBtn.disabled = false;
- startBtn.textContent = "Starten";
+ startBtn.textContent = t("header.startInstance");
}
};
} else {
@@ -266,7 +278,7 @@ async function aktualisiereInstanzenListe(vorhandene = null) {
kopfInstanzSelect.replaceChildren();
const placeholderOpt = erstelleElement("option", {
value: "",
- text: bekannteInstanzen.length === 0 ? "Keine Instanzen" : "— Instanz wählen —"
+ text: bekannteInstanzen.length === 0 ? t("header.noInstances") : t("header.selectInstancePlaceholder")
});
kopfInstanzSelect.append(placeholderOpt);
@@ -304,9 +316,9 @@ async function aktualisiereKopfStatus() {
} catch (err) {
if (kopfOpenRouter) {
if (err.instanzUnerreichbar) {
- kopfOpenRouter.textContent = "Instanz offline (502)";
+ kopfOpenRouter.textContent = t("header.instanceOffline");
} else if (err.instanzKonflikt) {
- kopfOpenRouter.textContent = "Instanz wählen (409)";
+ kopfOpenRouter.textContent = t("header.selectInstancePrompt");
} else {
kopfOpenRouter.textContent = "";
}
@@ -366,6 +378,7 @@ async function starteHauptAnwendung(instanzen) {
// #661: language packs before the first render
await loadLanguage();
translateDocument();
+ if (spracheSchalter) spracheSchalter.value = currentLanguage();
// Router initialisieren
initialisiereRouter();
diff --git a/src/ClawdDotNet.Manager.Web/wwwroot/i18n/de.json b/src/ClawdDotNet.Manager.Web/wwwroot/i18n/de.json
index 2d711ff..681e8dc 100644
--- a/src/ClawdDotNet.Manager.Web/wwwroot/i18n/de.json
+++ b/src/ClawdDotNet.Manager.Web/wwwroot/i18n/de.json
@@ -6,6 +6,496 @@
"common.loading": "Lade…",
"common.previous": "Zurück",
"common.next": "Weiter",
+ "common.save": "Speichern",
+ "common.cancel": "Abbrechen",
+ "common.delete": "Löschen",
+ "common.edit": "Bearbeiten",
+ "common.refresh": "Aktualisieren",
+ "common.close": "Schließen",
+ "common.discard": "Verwerfen",
+ "common.apply": "Anwenden",
+ "common.reset": "Zurücksetzen",
+ "common.search": "Suche",
+ "common.actions": "Aktionen",
+ "common.status": "Status",
+ "common.name": "Name",
+ "common.description": "Beschreibung",
+ "common.ready": "Bereit",
+ "common.none": "Keine",
+ "common.unknown": "Unbekannt",
+ "common.all": "Alle",
+ "common.details": "Details",
+ "common.language": "Sprache",
+ "common.logout": "Abmelden",
+ "common.confirm": "Bestätigen",
+ "common.yes": "Ja",
+ "common.no": "Nein",
+
+ "status.running": "Läuft",
+ "status.stopped": "Gestoppt",
+ "status.silent": "Verstummt",
+ "status.crashed": "Abgestürzt",
+ "status.unknown": "Unbekannt",
+ "status.ready": "Bereit",
+ "status.busy": "Beschäftigt",
+ "status.paused": "Pausiert",
+ "status.done": "Erledigt",
+ "status.failed": "Fehlgeschlagen",
+ "status.blocked": "Blockiert",
+ "status.inReview": "Im Review",
+ "status.canceled": "Verworfen",
+ "status.archived": "Archiviert",
+
+ "header.instanceLabel": "Instanz:",
+ "header.noInstance": "(Keine Instanz)",
+ "header.switchInstance": "Aktive Instanz wechseln",
+ "header.startInstance": "Starten",
+ "header.startInstanceTooltip": "Ausgewählte Instanz jetzt starten",
+ "header.toggleTheme": "Farbschema umschalten",
+ "header.eventStreamConnected": "Ereignisstrom: verbunden",
+ "header.eventStreamDisconnected": "Ereignisstrom: getrennt",
+ "header.multipleRunning": "{count} laufen",
+ "header.noneActive": "Keine aktiv",
+ "header.starting": "Startet…",
+ "header.noInstances": "Keine Instanzen",
+ "header.selectInstancePlaceholder": "— Instanz wählen —",
+ "header.instanceOffline": "Instanz offline (502)",
+ "header.selectInstancePrompt": "Instanz wählen (409)",
+
+ "nav.toggleSidebar": "Seitenleiste ein-/ausklappen",
+ "nav.group.work": "Arbeiten",
+ "nav.chat": "Chat",
+ "nav.agents": "Agenten",
+ "nav.tasks": "Aufgaben",
+ "nav.services": "Dienste",
+ "nav.group.analytics": "Analyse",
+ "nav.usage": "Tokennutzung",
+ "nav.agentChats": "Agenten-Chats",
+ "nav.group.system": "System",
+ "nav.instances": "Instanzen",
+ "nav.staging": "Freigaben",
+ "nav.logs": "Protokoll",
+ "nav.backup": "Sicherung",
+ "nav.settings": "Einstellungen",
+ "nav.info": "Info",
+
+ "login.prompt": "Bitte gib das Zugangstoken des Instanzmanagers ein (webUiToken in manager.json).",
+ "login.tokenPlaceholder": "Zugangstoken (mind. 20 Zeichen)",
+ "login.submit": "Anmelden",
+ "login.invalidToken": "Token ungültig oder kürzer als 20 Zeichen.",
+ "login.error": "Anmeldefehler: {error}",
+
+ "chat.agentLabel": "Agent: ",
+ "chat.noAgents": "Keine Agenten vorhanden",
+ "chat.wake": "Wecken",
+ "chat.wakeTooltip": "Agenten manuell ausführen / wecken",
+ "chat.clearHistory": "Verlauf leeren",
+ "chat.clearHistoryTooltip": "Chatverlauf dieses Agenten leeren",
+ "chat.cancel": "Abbrechen",
+ "chat.cancelTooltip": "Laufenden Lauf abbrechen",
+ "chat.placeholder": "Nachricht an den Agenten eingeben (Enter zum Senden, Umschalt+Enter für neue Zeile)…",
+ "chat.send": "Senden",
+ "chat.sendTooltip": "Nachricht senden",
+ "chat.loadingHistory": "Lade Verlauf…",
+ "chat.emptyHistory": "Noch keine Nachrichten im Verlauf vorhanden.",
+ "chat.historyLoadError": "Verlauf konnte nicht geladen werden: {error}",
+ "chat.sendError": "Nachricht konnte nicht gesendet werden: {error}",
+ "chat.cancelConfirm": "Lauf wurde abgebrochen.",
+ "chat.cancelError": "Abbruch fehlgeschlagen: {error}",
+ "chat.wakeSuccess": "Agent wurde manuell gestartet.",
+ "chat.wakeError": "Starten fehlgeschlagen: {error}",
+ "chat.clearConfirmPrompt": "Soll der gesamte Chatverlauf dieses Agenten unwiderruflich gelöscht werden?",
+ "chat.cleared": "Chatverlauf geleert.",
+ "chat.clearError": "Leeren fehlgeschlagen: {error}",
+ "chat.role.user": "Benutzer",
+ "chat.role.system": "System",
+ "chat.role.tool": "Werkzeug",
+
+ "agents.title": "Agenten",
+ "agents.newAgent": "Neuer Agent",
+ "agents.loading": "Lade Agenten…",
+ "agents.empty": "In dieser Instanz sind noch keine Agenten eingerichtet.",
+ "agents.createFirst": "Ersten Agenten anlegen",
+ "agents.id": "Kennung (ID)",
+ "agents.model": "Modell",
+ "agents.toolsActive": "{count} Werkzeuge aktiv",
+ "agents.details": "Agent-Details",
+ "agents.selectPrompt": "Wähle links einen Agenten aus.",
+ "agents.chat": "Chatten",
+ "agents.chatTooltip": "Mit diesem Agenten chatten",
+ "agents.delete": "Löschen",
+ "agents.deleteTooltip": "Diesen Agenten löschen",
+ "agents.name": "Name",
+ "agents.description": "Beschreibung",
+ "agents.availableTools": "Verfügbare Werkzeuge",
+ "agents.noTools": "Keine Werkzeuge für diesen Agenten konfiguriert.",
+ "agents.configuration": "Konfiguration",
+ "agents.configTooltip": "Werkzeug-Einstellungen einsehen",
+ "agents.toolToggled": "Werkzeug '{tool}' {status}.",
+ "agents.enabled": "aktiviert",
+ "agents.disabled": "deaktiviert",
+ "agents.saveFailed": "Änderung fehlgeschlagen: {error}",
+ "agents.newAgentTitle": "Neuen Agenten anlegen",
+ "agents.idLabel": "Agent-ID (eindeutiger Schlüssel):",
+ "agents.idPlaceholder": "z.B. scout",
+ "agents.nameLabel": "Anzeigename:",
+ "agents.namePlaceholder": "z.B. Scout Agent",
+ "agents.modelLabel": "Modell (OpenRouter):",
+ "agents.descLabel": "Beschreibung:",
+ "agents.descPlaceholder": "Optionale Beschreibung des Agenten…",
+ "agents.createButton": "Agent anlegen",
+ "agents.createdSuccess": "Agent '{name}' wurde erfolgreich angelegt.",
+ "agents.createFailed": "Fehler beim Anlegen: {error}",
+ "agents.deleteConfirm": "Soll der Agent '{name}' ({id}) wirklich gelöscht werden?",
+ "agents.deleted": "Agent '{name}' wurde gelöscht.",
+ "agents.deleteFailed": "Löschen fehlgeschlagen: {error}",
+ "agents.settingsTitle": "Einstellungen: {tool} ({agent})",
+ "agents.loadingSettings": "Lade Konfiguration…",
+ "agents.secretHint": "Geheime Werte (Passwörter, Schlüssel) werden vom Server maskiert ausgegeben.",
+ "agents.noSettings": "Keine individuellen Einstellungen hinterlegt.",
+ "agents.loadFailed": "Laden fehlgeschlagen: {error}",
+ "agents.rights": "Rechte",
+ "agents.noOperations": "Dieses Werkzeug kennt keine einzelnen Operationen. Es gilt die Standardregel.",
+ "agents.configuredHint": "Erlaubte Operationen laufen ohne Rückfrage, alle anderen werden einzeln zur Freigabe vorgelegt, verbotene gar nicht erst.",
+ "agents.notConfiguredHint": "Noch keine Rechte gesetzt: Es gilt die Vorgabe des Werkzeugs. Mit dem Speichern werden die Einstellungen unten verbindlich.",
+ "agents.operation": "Operation",
+ "agents.setting": "Einstellung",
+ "agents.effect": "Wirkung",
+ "agents.allowed": "erlaubt",
+ "agents.singleApproval": "einzeln freigeben",
+ "agents.forbidden": "verboten",
+ "agents.alwaysApprovalReason": "Änderungen an Agenten brauchen immer eine Freigabe.",
+ "agents.saveRights": "Rechte speichern",
+ "agents.rightsSaved": "Rechte gespeichert.",
+ "agents.effectAuto": "läuft",
+ "agents.effectApprove": "einzeln freigeben",
+ "agents.effectDeny": "gesperrt",
+ "agents.standingApproval": "Dauerfreigabe #{id}",
+
+ "tasks.title": "Aufgaben",
+ "tasks.newTask": "Neue Aufgabe",
+ "tasks.showCompleted": "Abgeschlossene anzeigen",
+ "tasks.empty": "Keine Aufgaben vorhanden",
+ "tasks.createTitle": "Aufgabe erstellen",
+ "tasks.agent": "Agent",
+ "tasks.taskMessage": "Aufgabenbeschreibung / Nachricht",
+ "tasks.schedule": "Zeitplan",
+ "tasks.scheduleType": "Planungsart",
+ "tasks.scheduleNone": "Keine (Nur manuell)",
+ "tasks.scheduleCron": "Cron-Ausdruck",
+ "tasks.scheduleInterval": "Intervall",
+ "tasks.scheduleAt": "Fester Zeitpunkt",
+ "tasks.runNow": "Jetzt ausführen",
+ "tasks.pause": "Pausieren",
+ "tasks.resume": "Fortsetzen",
+ "tasks.delete": "Löschen",
+ "tasks.saved": "Aufgabe gespeichert.",
+ "tasks.deleted": "Aufgabe gelöscht.",
+ "tasks.runTriggered": "Lauf ausgelöst.",
+
+ "services.title": "Dienste",
+ "services.newService": "Neuer Dienst",
+ "services.empty": "Keine Hintergrunddienste konfiguriert",
+ "services.serviceName": "Dienstname",
+ "services.serviceType": "Typ",
+ "services.port": "Port",
+ "services.active": "Aktiv",
+ "services.start": "Starten",
+ "services.stop": "Beenden",
+ "services.restart": "Neustarten",
+
+ "backup.title": "Datensicherung & Wiederherstellung",
+ "backup.refresh": "Aktualisieren",
+ "backup.refreshTooltip": "Sicherungen neu laden",
+ "backup.newBackup": "Neue Sicherung",
+ "backup.newBackupTooltip": "Neue Sicherung erstellen",
+ "backup.noInstance": "Keine Instanz ausgewählt",
+ "backup.selectInstancePrompt": "Bitte wähle oben im Kopfbereich eine Instanz aus, um deren Sicherungen zu verwalten.",
+ "backup.loading": "Lade Sicherungen…",
+ "backup.backupDir": "Sicherungsverzeichnis",
+ "backup.backupDirHint": "Sicherungen werden als Ganzes mit dem Lizenzschlüssel des Instanzmanagers verschlüsselt und enthalten die Zugangsdaten. Auf einer anderen Maschine lassen sie sich mit demselben Lizenzschlüssel zurückspielen.",
+ "backup.existingBackups": "Vorhandene Sicherungen ({count})",
+ "backup.noBackups": "Für diese Instanz gibt es noch keine Sicherung. Lege über die Schaltfläche oben eine an.",
+ "backup.restore": "Wiederherstellen",
+ "backup.restoreTooltip": "Diese Sicherung wiederherstellen",
+ "backup.deleteTooltip": "Sicherungsdatei unwiderruflich löschen",
+ "backup.archiveFile": "Archivdatei",
+ "backup.createdAt": "Erstellt am",
+ "backup.size": "Größe",
+ "backup.protection": "Schutz",
+ "backup.files": "Dateien",
+ "backup.actions": "Aktionen",
+ "backup.fileCount": "{count} Dateien",
+ "backup.foreignLicense": "Fremde Lizenz",
+ "backup.unreadable": "Unlesbar",
+ "backup.licenseProtection": "Lizenz ({count} Zugangsdaten)",
+ "backup.passphraseProtection": "Passphrase ({count})",
+ "backup.unencryptedProtection": "Unverschlüsselt, ohne Zugangsdaten",
+ "backup.dialogTitle": "Neue Sicherung erstellen",
+ "backup.dialogHint": "Die Sicherung wird mit dem Lizenzschlüssel des Instanzmanagers verschlüsselt und enthält die Zugangsdaten. Ist ein FTP-Upload eingerichtet, wird sie anschließend hochgeladen.",
+ "backup.includeChats": "Chatverläufe sichern",
+ "backup.includeLogs": "Protokolldateien (Logs) einschließen",
+ "backup.createButton": "Sicherung erstellen",
+ "backup.creating": "Erstelle Sicherung…",
+ "backup.created": "Sicherung erstellt.",
+ "backup.createFailed": "Fehler beim Sichern: {error}",
+ "backup.restoreTitle": "Sicherung wiederherstellen: {file}",
+ "backup.overwriteWarningTitle": "Achtung: Überschreiben bestehender Daten",
+ "backup.overwriteWarningText": "Die Wiederherstellung überschreibt die aktuellen Konfigurationen und Daten der Instanz mit dem Stand vom {date}.",
+ "backup.instanceStopNotice": "Die Instanz wird dafür geordnet angehalten und danach wieder gestartet.",
+ "backup.passphraseLabel": "Passphrase für Zugangsdaten",
+ "backup.passphrasePlaceholder": "Passphrase der Sicherung…",
+ "backup.passphraseRequired": "Bitte gib die Passphrase an.",
+ "backup.restoreNow": "Jetzt wiederherstellen",
+ "backup.restoring": "Stelle wieder her…",
+ "backup.restoreSuccess": "Wiederherstellung abgeschlossen.",
+ "backup.restoreFailed": "Wiederherstellung fehlgeschlagen: {error}",
+ "backup.foreignLicenseTitle": "Lizenzschlüssel der Quelle erforderlich",
+ "backup.sourceLicenseLabel": "Lizenzschlüssel der Quelle",
+ "backup.sourceLicenseHint": "Groß- und Kleinschreibung sowie Leerzeichen spielen keine Rolle.",
+ "backup.sourceLicensePlaceholder": "Lizenzschlüssel der Installation, von der die Sicherung stammt…",
+ "backup.restoreWithKey": "Mit diesem Schlüssel wiederherstellen",
+ "backup.keyMismatch": "Dieser Lizenzschlüssel passt nicht zu der Sicherung.",
+ "backup.deleteTitle": "Sicherung löschen",
+ "backup.deleteConfirm": "Soll die Sicherungsdatei '{file}' wirklich unwiderruflich gelöscht werden?",
+ "backup.deleted": "Sicherung gelöscht.",
+ "backup.deleteFailed": "Löschen fehlgeschlagen: {error}",
+ "backup.ftpTitle": "FTP-Upload der Sicherungen",
+ "backup.ftpLoading": "Lade FTP-Einstellungen…",
+ "backup.ftpHint": "Die Sicherungen sind verschlüsselt — wer den Server liest, liest nichts Brauchbares. Das Kennwort des Servers geht ohne TLS aber im Klartext über die Leitung.",
+ "backup.ftpAutoUpload": "Fertige Sicherungen automatisch hochladen",
+ "backup.ftpServer": "Server",
+ "backup.ftpPort": "Port",
+ "backup.ftpUser": "Benutzer",
+ "backup.ftpPassword": "Kennwort",
+ "backup.ftpPasswordSaved": "(gespeichert — leer lassen für unverändert)",
+ "backup.ftpDirectory": "Zielordner",
+ "backup.ftpDirectoryHint": "Darunter bekommt jede Instanz einen eigenen Ordner.",
+ "backup.ftpKeepCount": "Sicherungen je Instanz behalten",
+ "backup.ftpKeepCountHint": "Ältere werden auf dem Server gelöscht.",
+ "backup.ftpRequireTls": "Nur mit TLS verbinden",
+ "backup.ftpTest": "Verbindung testen",
+ "backup.ftpTestFailed": "Test fehlgeschlagen: {error}",
+ "backup.ftpSaved": "Gespeichert.",
+ "backup.ftpSaveFailed": "Speichern fehlgeschlagen: {error}",
+
+ "logs.title": "Protokoll",
+ "logs.connecting": "Verbinde…",
+ "logs.allInstances": "Alle Instanzen",
+ "logs.allModules": "Alle Module",
+ "logs.clear": "Leeren",
+ "logs.pause": "Pausieren",
+ "logs.resume": "Fortsetzen",
+ "logs.paused": "Pausiert",
+ "logs.autoScroll": "Autoscroll",
+ "logs.empty": "Noch keine Protokolleinträge vorhanden.",
+
+ "settings.title": "Einstellungen & Systemarchitektur",
+ "settings.intro": "Übersicht der Konfiguration nach dem Instanzmanager-Konzept: Strikte Trennung zwischen globaler Manager-Ebene (Installation) und isolierter Instanz-Ebene.",
+ "settings.managerLevel": "Instanzmanager",
+ "settings.managerBadge": "Manager-Ebene · Global",
+ "settings.managerIntro": "Gilt für alle Instanzen und die Weboberfläche. Gespeichert in manager.json im Anwendungs-Hauptverzeichnis.",
+ "settings.webUiAndNet": "Weboberfläche & Netzwerk",
+ "settings.configFile": "Konfigurationsdatei",
+ "settings.webUiPort": "WebUI-Port",
+ "settings.webUiPortDefault": "7000 (Vorgabe, webUiPort)",
+ "settings.networkBinding": "Netzwerk-Bindung",
+ "settings.networkBindingValue": "loopback (127.0.0.1, webUiBinding)",
+ "settings.accessProtection": "Zugangsschutz",
+ "settings.tokenActive": "Token aktiv (≥ 20 Zeichen)",
+ "settings.licenseAndUpdates": "Lizenz & Updates",
+ "settings.licenseScope": "Lizenz-Geltung",
+ "settings.licenseScopeValue": "Installationsebene (E-M3: Beliebig viele Instanzen)",
+ "settings.licenseKey": "Lizenzschlüssel",
+ "settings.licenseEncrypted": "●●●●-●●●●-●●●●-●●●● (verschlüsselt)",
+ "settings.updateChannel": "Update-Kanal",
+ "settings.updateChannelValue": "prod (Offizielle Release-Versionen)",
+ "settings.updateCheck": "Update-Prüfung",
+ "settings.updateCheckValue": "Zentral auf Manager-Ebene",
+ "settings.dcAndOversight": "Deploymentcenter & Aufsicht",
+ "settings.dcMasterToken": "Master-Token",
+ "settings.dcMasterTokenValue": "●●●●●●●● (erzeugt Sub-Token je Instanz)",
+ "settings.desktopWindows": "Desktop-Fenster",
+ "settings.desktopWindowsValue": "Aktiv (jede Instanz hat ein eigenes Fenster)",
+ "settings.crashProtection": "Absturz-Schutz",
+ "settings.crashProtectionValue": "Max. 5 Neustarts / 10 Minuten",
+ "settings.instanceSectionTitle": "Aktive Instanz: {name}",
+ "settings.instanceSectionTitleNone": "Instanzbezogene Einstellungen",
+ "settings.instanceBadge": "Instanz-Ebene · Isoliert",
+ "settings.noInstanceActive": "Keine Instanz aktiv",
+ "settings.instanceIntro": "Gilt ausschließlich für die aktuell ausgewählte Instanz. Alle Pfade, Protokolle, Agenten und Budgets sind strikt von anderen Instanzen isoliert.",
+ "settings.noInstanceSelected": "Keine Instanz ausgewählt",
+ "settings.noInstancePrompt": "Bitte wähle oben im Kopfbereich eine aktive Instanz aus oder wechsle in den Bereich 'Instanzen', um eine Instanz zu starten oder auszuwählen.",
+ "settings.toInstancesOverview": "Zur Instanzen-Übersicht",
+ "settings.identityAndProcess": "Identität & Prozess",
+ "settings.instanceName": "Instanzname",
+ "settings.instanceId": "Instanz-ID",
+ "settings.autostartByManager": "Autostart durch Manager",
+ "settings.autostartActive": "Aktiv (Am Laufen halten)",
+ "settings.autostartInactive": "Inaktiv (Manueller Start)",
+ "settings.communication": "Kommunikation",
+ "settings.communicationValue": "HTTP über Named Pipe (Windows) / Socket (Linux)",
+ "settings.isolatedPaths": "Isolierte Verzeichnisse",
+ "settings.logsPath": "Protokolle (Logs)",
+ "settings.backupsPath": "Datensicherungen",
+ "settings.stateDbPath": "Zustandsdatenbank",
+ "settings.stateDbValue": "Instances/{name}/state.db (exklusiv)",
+ "settings.workspacePath": "Arbeitsbereich (Shared)",
+ "settings.openRouterCard": "Modellanbindung (OpenRouter)",
+ "settings.openRouterStatus": "OpenRouter-Status",
+ "settings.connected": "Verbunden",
+ "settings.offline": "Offline",
+ "settings.statusMessage": "Statusmeldung",
+ "settings.credits": "Guthaben / Credits",
+ "settings.apiKey": "API-Schlüssel",
+ "settings.apiKeyMasked": "In InstanceSettings.json dieser Instanz maskiert hinterlegt",
+ "settings.openRouterNotRunning": "Instanz läuft nicht. Daten werden nach dem Start geladen.",
+ "settings.openRouterNoKey": "Kein Schlüssel hinterlegt oder Dienst nicht erreichbar.",
+ "settings.runtimeAndSubsystems": "Laufzeit & Teilsysteme",
+ "settings.agentEngine": "Agent Engine",
+ "settings.scheduler": "Scanner / Scheduler",
+ "settings.stagingService": "Freigabestelle (Staging)",
+ "settings.dcSubToken": "Deploymentcenter Sub-Token",
+ "settings.subsystemsLoading": "Laufzeitdaten werden abgefragt…",
+ "settings.subsystemsStopped": "Instanz ist beendet — Teilsysteme ruhen.",
+ "settings.save": "Einstellungen speichern",
+ "settings.discard": "Verwerfen",
+ "settings.saved": "Einstellungen erfolgreich gespeichert.",
+ "settings.saveError": "Fehler beim Speichern der Einstellungen: {error}",
+
+ "info.title": "System & Status",
+ "info.noInstanceSelected": "Keine Instanz ausgewählt",
+ "info.noInstanceHint": "Wähle oben im Kopfbereich eine aktive Instanz aus oder wechsle in den Bereich 'Instanzen', um eine Instanz zu starten.",
+ "info.loading": "Lade Systemdaten…",
+ "info.instanceAndVersion": "Instanz & Version",
+ "info.instanceName": "Instanzname",
+ "info.instanceId": "Instanz-ID",
+ "info.version": "Version",
+ "info.build": "Build",
+ "info.environment": "Umgebung",
+ "info.dataDirectory": "Datenverzeichnis",
+ "info.subsystems": "Teilsysteme",
+ "info.openRouterStatus": "OpenRouter & Guthaben",
+
+ "instances.title": "Instanzverwaltung",
+ "instances.refresh": "Aktualisieren",
+ "instances.newInstance": "Neue Instanz",
+ "instances.activeBadge": "Aktiv im WebUI",
+ "instances.selectActive": "Als aktiv wählen",
+ "instances.start": "Starten",
+ "instances.stop": "Beenden",
+ "instances.bringToFront": "Fenster nach vorn",
+ "instances.createTitle": "Neue Instanz anlegen",
+ "instances.instanceOfflineError": "Die Instanz ist nicht erreichbar.",
+ "instances.noInstanceActiveError": "Keine Instanz aktiv. Unter 'Instanzen' starten oder auswählen.",
+ "instances.instanceNameLabel": "Instanz-Name",
+ "instances.instanceNamePlaceholder": "z.B. production-1",
+ "instances.dailyBudgetUsd": "Tagesbudget ($ USD)",
+ "instances.dailyBudgetTokens": "Tagesbudget (Tokens)",
+ "instances.autostart": "Autostart durch Manager",
+ "instances.created": "Instanz erfolgreich angelegt.",
+ "instances.createError": "Fehler beim Anlegen der Instanz: {error}",
+
+ "staging.title": "Freigabestelle",
+ "staging.refresh": "Aktualisieren",
+ "staging.loading": "Lade Freigaben…",
+ "staging.empty": "Keine offenen Freigaben",
+ "staging.emptyHint": "Aktuell warten keine Werkzeug-Aufrufe auf eine manuelle Bestätigung.",
+ "staging.approve": "Freigeben",
+ "staging.reject": "Ablehnen",
+ "staging.callId": "Aufruf-ID",
+ "staging.agent": "Agent",
+ "staging.tool": "Werkzeug",
+ "staging.time": "Zeitpunkt",
+ "staging.frozenArgs": "Eingefrorene Argumente:",
+ "staging.suggestHint": "Diese Operation von {agent} wurde in den letzten 14 Tagen schon {approvals}-mal freigegeben. Soll {tool}.{action} für diesen Agenten künftig ohne Rückfrage laufen?",
+ "staging.allowSimilar": "Gleichartiges künftig erlauben: {agent} darf {tool}.{action} ab jetzt ohne Rückfrage (widerrufbar unten unter „Dauerfreigaben“).",
+ "staging.notActive": "Freigabestelle nicht aktiv",
+ "staging.notActiveHint": "In dieser Instanz ist keine Freigabestelle eingerichtet.",
+ "staging.approved": "Aufruf freigegeben{similar}: {message}",
+ "staging.similarSuffix": " und künftig erlaubt",
+ "staging.executedSuccess": "Erfolgreich ausgeführt",
+ "staging.approveFailed": "Freigabe fehlgeschlagen: {error}",
+ "staging.standingTitle": "Dauerfreigaben",
+ "staging.standingEmpty": "Keine. Beim Freigeben lässt sich „Gleichartiges künftig erlauben“ wählen; dauerhafte Rechte stehen sonst in der Werkzeugkonfiguration des Agenten.",
+ "staging.granted": "Erteilt",
+ "staging.occasion": "Anlass",
+ "staging.revoke": "Widerrufen",
+ "staging.revokeConfirm": "Dauerfreigabe widerrufen? {agent} muss {tool}.{action} dann wieder einzeln vorlegen.",
+ "staging.revoked": "Widerrufen.",
+ "staging.revokeFailed": "Widerruf fehlgeschlagen: {error}",
+ "staging.rejectTitle": "Werkzeug-Aufruf ablehnen",
+ "staging.rejectReasonLabel": "Begründung (optional):",
+ "staging.rejectReasonPlaceholder": "Begründung für die Ablehnung an den Agenten…",
+ "staging.rejectButton": "Aufruf ablehnen",
+ "staging.rejected": "Aufruf wurde abgelehnt.",
+ "staging.rejectFailed": "Ablehnen fehlgeschlagen: {error}",
+
+ "agentChats.title": "Agenten-Kommunikation (A2A)",
+ "agentChats.allAgents": "Alle Agenten",
+ "agentChats.filterTooltip": "Nach beteiligtem Agenten filtern (Absender oder Empfänger)",
+ "agentChats.fromTooltip": "Nachrichten ab diesem Tag",
+ "agentChats.toTooltip": "Nachrichten bis einschließlich diesem Tag",
+ "agentChats.searchPlaceholder": "Volltext…",
+ "agentChats.searchTooltip": "Suche im Nachrichtentext und in den Agentennamen",
+ "agentChats.refresh": "Aktualisieren",
+ "agentChats.refreshTooltip": "Kommunikation neu laden",
+ "agentChats.from": "von",
+ "agentChats.to": "bis",
+ "agentChats.noInstance": "Keine Instanz ausgewählt",
+ "agentChats.selectInstancePrompt": "Bitte wähle oben im Kopfbereich eine Instanz aus, um deren Agenten-Kommunikation anzuzeigen.",
+ "agentChats.infoTitle": "Interne Kommunikation",
+ "agentChats.infoHint": "Hier wird der direkte Nachrichtenaustausch zwischen Agenten protokolliert, wenn Agenten über das Werkzeug AgentComm (Aktion send_message) miteinander sprechen.",
+ "agentChats.loading": "Lade Kommunikationsverlauf…",
+ "agentChats.matchCount": "{filtered} von {total} Nachrichten",
+ "agentChats.totalCount": "{total} Nachrichten",
+ "agentChats.empty": "Keine Nachrichten",
+ "agentChats.emptyFilter": "Für diese Filter liegt keine interne Kommunikation vor.",
+ "agentChats.emptyInstance": "In dieser Instanz wurde bisher keine interne Agent-zu-Agent-Kommunikation protokolliert.",
+ "agentChats.replyTo": "➔ Antwort an",
+ "agentChats.arrow": "➔",
+ "agentChats.loadFailed": "Kommunikation konnte nicht geladen werden: {error}",
+
+ "usage.title": "Token-Verbrauch & Analyse",
+ "usage.loading": "Lade Verbrauchsdaten…",
+ "usage.empty": "Keine Daten",
+ "usage.emptyHint": "Noch keine Token-Verbrauchsdaten aufgezeichnet.",
+ "usage.totalCost": "Gesamtkosten ({runs} Läufe)",
+ "usage.totalTokens": "Tokens gesamt",
+ "usage.inputTokens": "Eingabe-Tokens (Prompt)",
+ "usage.outputTokens": "Ausgabe-Tokens (Completion)",
+ "usage.unknownCostRuns": "{count} Lauf/Läufe ohne bekannten Preis — deren Kosten sind in der Summe nicht enthalten.",
+ "usage.tokensByAgent": "Tokens nach Agent",
+ "usage.tokensByModel": "Tokens nach Modell",
+ "usage.recentRuns": "Letzte Agenten-Läufe",
+ "usage.time": "Zeitpunkt",
+ "usage.agent": "Agent",
+ "usage.model": "Modell",
+ "usage.status": "Status",
+ "usage.prompt": "Prompt",
+ "usage.completion": "Completion",
+ "usage.total": "Gesamt",
+ "usage.cost": "Kosten",
+ "usage.unknownPrice": "(Preis unbekannt)",
+ "usage.notAvailable": "Verbrauchsdaten nicht verfügbar",
+ "usage.forecastTitle": "Kostenprognose",
+ "usage.forecastDay": "Prognose je Tag",
+ "usage.forecastMonth": "Prognose je Monat (30 Tage)",
+ "usage.tasksDay": "davon Aufgaben je Tag",
+ "usage.otherDay": "sonstige Läufe je Tag (Ø 7 Tage)",
+ "usage.budgetWarning": "{agent}: Die geplanten Aufgaben kosten laut Prognose {cost} am Tag, das Tagesbudget erlaubt {budget}. Die späten Läufe eines Tages werden abgelehnt.",
+ "usage.withoutBasis": "{count} Aufgabe(n) ohne Grundlage (kein Lauf, kein Modellpreis) – nicht in der Summe enthalten.",
+ "usage.oneOffOpen": "Offene einmalige Aufgaben kosten zusätzlich etwa {cost}.",
+ "usage.basisHint": "Grundlage je Aufgabe: Mittelwert ihrer letzten Läufe, sonst der des Agenten, sonst eine Schätzung aus Promptlänge und Listenpreis (eher zu hoch).",
+ "usage.task": "Aufgabe",
+ "usage.runsDay": "Läufe/Tag",
+ "usage.perRun": "je Lauf",
+ "usage.basis": "Grundlage",
+ "usage.perDay": "je Tag",
+ "usage.basisRuns": "Ø letzte {n} Läufe",
+ "usage.basisAgent": "Ø des Agenten ({n} Läufe)",
+ "usage.basisEstimate": "Schätzung – noch kein Lauf",
+ "usage.basisUnknown": "keine Grundlage",
"filter.range": "Zeitraum",
"filter.range.24h": "Letzte 24 Stunden",
@@ -42,15 +532,15 @@
"runs.total.runs": "Läufe",
"runs.total.prompt": "Prompt-Tokens",
"runs.total.completion": "Antwort-Tokens",
- "runs.total.cached": "Aus dem Cache",
+ "runs.total.cached": "Aus Cache",
"runs.total.cost": "Kosten",
- "runs.total.notRun": "Abgewiesen (Budget, Herunterfahren)",
- "runs.unknownCost": "{n} Lauf/Läufe ohne bekannten Preis sind mit 0 $ gezählt.",
+ "runs.total.notRun": "Abgelehnt (Budget, Shutdown)",
+ "runs.unknownCost": "{n} Lauf/Läufe ohne bekannten Preis sind mit 0 $ gerechnet.",
"runs.empty.title": "Keine Läufe",
- "runs.empty.text": "Kein Lauf passt zu diesem Filter.",
+ "runs.empty.text": "Kein Lauf passt auf diesen Filter.",
"runs.list": "Läufe",
"runs.page": "{from}–{to} von {total}",
- "runs.col.time": "Zeit",
+ "runs.col.time": "Zeitpunkt",
"runs.col.agent": "Agent",
"runs.col.model": "Modell",
"runs.col.event": "Ereignis",
@@ -66,33 +556,33 @@
"detail.notFound": "Lauf nicht gefunden",
"detail.runId": "Lauf-ID",
"detail.tokens": "Tokens",
- "detail.tokensValue": "{prompt} Prompt · {completion} Antwort · {cached} aus dem Cache",
+ "detail.tokensValue": "{prompt} Prompt · {completion} Antwort · {cached} aus Cache",
"detail.result": "Ergebnis",
- "detail.receipt": "Beleg",
+ "detail.receipt": "Quittung",
"detail.transcript": "Prompt und Antwort",
- "detail.transcript.disabled": "Für diesen Agenten ist der Prompt-Verlauf abgeschaltet (Aufbewahrung: nie).",
+ "detail.transcript.disabled": "Prompt-Verlauf ist für diesen Agenten abgeschaltet (Aufbewahrung: nie).",
"detail.transcript.unavailable": "Diese Instanz zeichnet keinen Prompt-Verlauf auf.",
- "detail.transcript.missing": "Kein Transkript zu diesem Lauf – er lief vor Beginn der Aufzeichnung oder ist über seine Aufbewahrungsfrist hinaus.",
- "detail.transcript.truncated": "Dieser Lauf hat die Größengrenze des Prompt-Verlaufs überschritten; spätere Einträge sind gekürzt.",
+ "detail.transcript.missing": "Kein Verlauf für diesen Lauf — er lief vor Beginn der Aufzeichnung oder ist älter als die Aufbewahrungsfrist.",
+ "detail.transcript.truncated": "Dieser Lauf hat die Größengrenze des Verlaufs überschritten; spätere Einträge sind gekürzt.",
"detail.transcript.size": "{n} Einträge, {chars} Zeichen",
- "detail.systemPrompt": "Systemprompt ({n} Zeichen)",
- "detail.entry.user": "Auftrag / Nachricht",
- "detail.entry.engine": "Nachfrage der Engine",
+ "detail.systemPrompt": "System-Prompt ({n} Zeichen)",
+ "detail.entry.user": "Aufgabe / Nachricht",
+ "detail.entry.engine": "Nachfasslauf der Engine",
"detail.entry.event": "Ereignis",
"detail.entry.assistant": "Modellschritt {n}",
"detail.entry.usage": "{prompt} rein · {completion} raus",
"detail.entry.tool_result": "Ergebnis: {tool}",
- "detail.entry.call": "Ruft {tool} auf",
+ "detail.entry.call": "Ruft {tool}",
"detail.entry.clipped": "gekürzt",
"detail.tool": "Werkzeug",
"detail.arguments": "Argumente",
"detail.toolCalls": "Werkzeugaufrufe",
- "detail.toolCalls.hint": "Aus dem Audit-Log – auch ohne Transkript vorhanden.",
+ "detail.toolCalls.hint": "Aus dem Audit-Log — auch ohne Verlauf vorhanden.",
"detail.approvals": "Zur Freigabe vorgelegt",
"timeline.title": "Tokennutzung › Zeitverlauf",
"timeline.chart": "Zeitverlauf",
- "timeline.metric": "Maß",
+ "timeline.metric": "Messwert",
"timeline.metric.cost": "Kosten",
"timeline.metric.tokens": "Tokens",
"timeline.metric.runs": "Läufe",
@@ -106,21 +596,21 @@
"timeline.tooltipRuns": "{n} Lauf/Läufe",
"timeline.event.budget_exceeded": "Budget erschöpft",
"timeline.event.model_changed": "Modell gewechselt",
- "timeline.hint": "Ein Klick auf einen Balken zeigt dessen Läufe.",
+ "timeline.hint": "Klick auf einen Balken zeigt dessen Läufe.",
"history.title": "Prompt-Verlauf",
- "history.intro": "Prompt und Antwort jedes Laufs, durchsuchbar über das ganze Gespräch samt Werkzeugaufrufen und Ergebnissen.",
+ "history.intro": "Prompt und Antwort jedes Laufs, durchsuchbar über die gesamte Unterhaltung samt Werkzeugaufrufen und Ergebnissen.",
"history.unavailable": "Prompt-Verlauf nicht verfügbar",
"history.empty.title": "Nichts aufgezeichnet",
- "history.empty.text": "Keine Transkripte in diesem Zeitraum. Die Aufzeichnung beginnt mit Version 0.1.12 und folgt der Aufbewahrung unten.",
- "history.empty.search": "Kein Transkript enthält diesen Text.",
- "history.list": "Transkripte ({n})",
+ "history.empty.text": "Keine Verläufe in diesem Zeitraum. Die Aufzeichnung beginnt mit Version 0.1.12 und folgt den unten stehenden Fristen.",
+ "history.empty.search": "Kein Verlauf enthält diesen Text.",
+ "history.list": "Verläufe ({n})",
"history.prompt": "Prompt",
"history.response": "Antwort",
"history.truncated": "Größengrenze erreicht ({chars} Zeichen gespeichert).",
"history.settings.title": "Aufbewahrung",
- "history.settings.intro": "Wie lange Prompts und Antworten aufbewahrt werden. Die Vorgabe gilt für jeden Agenten ohne eigene Einstellung; „nie“ löscht auch, was vorher aufgezeichnet wurde.",
+ "history.settings.intro": "Wie lange Prompts und Antworten aufgehoben werden. Die Vorgabe gilt für jeden Agenten ohne eigene Angabe; „nie“ löscht auch, was vorher aufgezeichnet war.",
"history.settings.default": "Vorgabe für alle Agenten:",
"history.settings.agent": "Agent",
"history.settings.retention": "Aufbewahrung",
@@ -129,13 +619,65 @@
"history.settings.mode.inherit": "Vorgabe",
"history.settings.mode.never": "Nie aufzeichnen",
"history.settings.mode.days": "Tage",
- "history.settings.mode.forever": "Unbegrenzt",
+ "history.settings.mode.forever": "Für immer aufheben",
"history.settings.days": "Tage",
"history.settings.daysUnit": "Tage",
"history.settings.effective.never": "wird nicht aufgezeichnet",
- "history.settings.effective.forever": "unbegrenzt",
- "history.settings.effective.days": "{n} Tage",
+ "history.settings.effective.forever": "bleibt für immer",
+ "history.settings.effective.days": "bleibt {n} Tage",
"history.settings.save": "Aufbewahrung speichern",
"history.settings.saved": "Aufbewahrung gespeichert.",
- "history.settings.failed": "Speichern fehlgeschlagen: {error}"
+ "history.settings.failed": "Speichern fehlgeschlagen: {error}",
+
+ "desktop.mainWindow.title": "ClawdDotNet",
+ "desktop.mainWindow.sidebarTooltip": "Seitenleiste ein-/ausklappen",
+ "desktop.mainWindow.switchInstance": "Instanz wechseln",
+ "desktop.mainWindow.instance": "INSTANZ",
+ "desktop.mainWindow.themeLight": "Hellmodus",
+ "desktop.mainWindow.themeDark": "Dunkelmodus",
+ "desktop.mainWindow.openInstanceFolder": "Instanz-Ordner öffnen",
+ "desktop.mainWindow.instanceManager": "Instanzmanager",
+ "desktop.mainWindow.exit": "Beenden",
+ "desktop.nav.work": "Arbeiten",
+ "desktop.nav.analytics": "Analyse",
+ "desktop.nav.system": "System",
+ "desktop.status.unknown": "unbekannt",
+ "desktop.status.design": "Entwurf",
+ "desktop.status.noApiKey": "kein API-Key",
+ "desktop.status.noUsageData": "keine Nutzungsdaten",
+ "desktop.settings.discard": "Verwerfen",
+ "desktop.settings.save": "Speichern",
+ "desktop.settings.instance": "INSTANZ",
+ "desktop.settings.instanceName": "Instanz-Name",
+ "desktop.settings.apiKey": "OpenRouter API-Key",
+ "desktop.settings.autostart": "Autostart durch Manager",
+ "desktop.settings.autostartHint": "Der Instanzmanager startet diese Instanz, wenn er hochkommt, und wieder, wenn sie abstürzt.",
+ "desktop.settings.logDir": "Protokoll-Verzeichnis",
+ "desktop.settings.logDirHint": "Gilt nur für diese Instanz. Leer heißt: Unterordner Logs im Instanzverzeichnis.",
+ "desktop.settings.dailyCost": "Tagesbudget ($ USD)",
+ "desktop.settings.dailyTokens": "Tagesbudget (Tokens)",
+ "desktop.settings.general": "ALLGEMEIN",
+ "desktop.settings.instancesDir": "Instanzen-Verzeichnis",
+ "desktop.settings.minLogLevel": "Minimaler Log-Level",
+ "desktop.settings.openRouterUrl": "OpenRouter Base-URL",
+ "desktop.settings.language": "Sprache",
+ "desktop.settings.dcAndLicense": "DEPLOYMENTCENTER & LIZENZ",
+ "desktop.settings.dcUrl": "Server-URL",
+ "desktop.settings.dcToken": "Master-Token",
+ "desktop.settings.dcEnv": "Umgebung",
+ "desktop.settings.errorReporting": "Fehler automatisch melden",
+ "desktop.settings.updateCheck": "Beim Start auf Updates prüfen",
+ "desktop.settings.updateChannel": "Update-Kanal",
+ "desktop.settings.licenseKey": "Lizenzschlüssel",
+ "desktop.chat.inputPlaceholder": "Nachricht eingeben (Enter zum Senden, Shift+Enter für neue Zeile)...",
+ "desktop.chat.send": "Senden",
+ "desktop.chat.statusReady": "Bereit",
+ "desktop.chat.statusSending": "Sende…",
+ "desktop.chat.statusDesign": "Entwurfsmodus",
+ "desktop.dialog.addAgent": "Agent hinzufügen",
+ "desktop.dialog.addJob": "Job hinzufügen",
+ "desktop.dialog.addService": "Dienst hinzufügen",
+ "desktop.dialog.restoreBackup": "Sicherung wiederherstellen",
+ "desktop.dialog.license": "Lizenz-Aktivierung",
+ "desktop.dialog.instancePicker": "Instanz auswählen"
}
diff --git a/src/ClawdDotNet.Manager.Web/wwwroot/i18n/en.json b/src/ClawdDotNet.Manager.Web/wwwroot/i18n/en.json
index 4264f1b..e5044c2 100644
--- a/src/ClawdDotNet.Manager.Web/wwwroot/i18n/en.json
+++ b/src/ClawdDotNet.Manager.Web/wwwroot/i18n/en.json
@@ -6,6 +6,496 @@
"common.loading": "Loading…",
"common.previous": "Previous",
"common.next": "Next",
+ "common.save": "Save",
+ "common.cancel": "Cancel",
+ "common.delete": "Delete",
+ "common.edit": "Edit",
+ "common.refresh": "Refresh",
+ "common.close": "Close",
+ "common.discard": "Discard",
+ "common.apply": "Apply",
+ "common.reset": "Reset",
+ "common.search": "Search",
+ "common.actions": "Actions",
+ "common.status": "Status",
+ "common.name": "Name",
+ "common.description": "Description",
+ "common.ready": "Ready",
+ "common.none": "None",
+ "common.unknown": "Unknown",
+ "common.all": "All",
+ "common.details": "Details",
+ "common.language": "Language",
+ "common.logout": "Log Out",
+ "common.confirm": "Confirm",
+ "common.yes": "Yes",
+ "common.no": "No",
+
+ "status.running": "Running",
+ "status.stopped": "Stopped",
+ "status.silent": "Silent",
+ "status.crashed": "Crashed",
+ "status.unknown": "Unknown",
+ "status.ready": "Ready",
+ "status.busy": "Busy",
+ "status.paused": "Paused",
+ "status.done": "Done",
+ "status.failed": "Failed",
+ "status.blocked": "Blocked",
+ "status.inReview": "In Review",
+ "status.canceled": "Canceled",
+ "status.archived": "Archived",
+
+ "header.instanceLabel": "Instance:",
+ "header.noInstance": "(No instance)",
+ "header.switchInstance": "Switch active instance",
+ "header.startInstance": "Start",
+ "header.startInstanceTooltip": "Start selected instance now",
+ "header.toggleTheme": "Toggle color theme",
+ "header.eventStreamConnected": "Event stream: connected",
+ "header.eventStreamDisconnected": "Event stream: disconnected",
+ "header.multipleRunning": "{count} running",
+ "header.noneActive": "None active",
+ "header.starting": "Starting…",
+ "header.noInstances": "No instances",
+ "header.selectInstancePlaceholder": "— Select instance —",
+ "header.instanceOffline": "Instance offline (502)",
+ "header.selectInstancePrompt": "Select instance (409)",
+
+ "nav.toggleSidebar": "Toggle sidebar",
+ "nav.group.work": "Work",
+ "nav.chat": "Chat",
+ "nav.agents": "Agents",
+ "nav.tasks": "Tasks",
+ "nav.services": "Services",
+ "nav.group.analytics": "Analytics",
+ "nav.usage": "Token Usage",
+ "nav.agentChats": "Agent Chats",
+ "nav.group.system": "System",
+ "nav.instances": "Instances",
+ "nav.staging": "Approvals",
+ "nav.logs": "Logs",
+ "nav.backup": "Backup",
+ "nav.settings": "Settings",
+ "nav.info": "Info",
+
+ "login.prompt": "Please enter the instance manager access token (webUiToken in manager.json).",
+ "login.tokenPlaceholder": "Access token (at least 20 characters)",
+ "login.submit": "Sign In",
+ "login.invalidToken": "Token is invalid or shorter than 20 characters.",
+ "login.error": "Sign in error: {error}",
+
+ "chat.agentLabel": "Agent: ",
+ "chat.noAgents": "No agents available",
+ "chat.wake": "Wake",
+ "chat.wakeTooltip": "Manually trigger / wake agent",
+ "chat.clearHistory": "Clear history",
+ "chat.clearHistoryTooltip": "Clear chat history for this agent",
+ "chat.cancel": "Cancel",
+ "chat.cancelTooltip": "Cancel active run",
+ "chat.placeholder": "Type message to agent (Enter to send, Shift+Enter for new line)…",
+ "chat.send": "Send",
+ "chat.sendTooltip": "Send message",
+ "chat.loadingHistory": "Loading history…",
+ "chat.emptyHistory": "No messages in history yet.",
+ "chat.historyLoadError": "Failed to load history: {error}",
+ "chat.sendError": "Failed to send message: {error}",
+ "chat.cancelConfirm": "Run was canceled.",
+ "chat.cancelError": "Cancellation failed: {error}",
+ "chat.wakeSuccess": "Agent started manually.",
+ "chat.wakeError": "Failed to start agent: {error}",
+ "chat.clearConfirmPrompt": "Permanently clear the entire chat history for this agent?",
+ "chat.cleared": "Chat history cleared.",
+ "chat.clearError": "Failed to clear history: {error}",
+ "chat.role.user": "User",
+ "chat.role.system": "System",
+ "chat.role.tool": "Tool",
+
+ "agents.title": "Agents",
+ "agents.newAgent": "New Agent",
+ "agents.loading": "Loading agents…",
+ "agents.empty": "No agents configured in this instance yet.",
+ "agents.createFirst": "Create first agent",
+ "agents.id": "ID",
+ "agents.model": "Model",
+ "agents.toolsActive": "{count} tools active",
+ "agents.details": "Agent Details",
+ "agents.selectPrompt": "Select an agent on the left.",
+ "agents.chat": "Chat",
+ "agents.chatTooltip": "Chat with this agent",
+ "agents.delete": "Delete",
+ "agents.deleteTooltip": "Delete this agent",
+ "agents.name": "Name",
+ "agents.description": "Description",
+ "agents.availableTools": "Available Tools",
+ "agents.noTools": "No tools configured for this agent.",
+ "agents.configuration": "Configuration",
+ "agents.configTooltip": "View tool settings",
+ "agents.toolToggled": "Tool '{tool}' {status}.",
+ "agents.enabled": "enabled",
+ "agents.disabled": "disabled",
+ "agents.saveFailed": "Modification failed: {error}",
+ "agents.newAgentTitle": "Create New Agent",
+ "agents.idLabel": "Agent ID (unique key):",
+ "agents.idPlaceholder": "e.g. scout",
+ "agents.nameLabel": "Display Name:",
+ "agents.namePlaceholder": "e.g. Scout Agent",
+ "agents.modelLabel": "Model (OpenRouter):",
+ "agents.descLabel": "Description:",
+ "agents.descPlaceholder": "Optional description of the agent…",
+ "agents.createButton": "Create Agent",
+ "agents.createdSuccess": "Agent '{name}' created successfully.",
+ "agents.createFailed": "Failed to create agent: {error}",
+ "agents.deleteConfirm": "Really delete agent '{name}' ({id})?",
+ "agents.deleted": "Agent '{name}' deleted.",
+ "agents.deleteFailed": "Deletion failed: {error}",
+ "agents.settingsTitle": "Settings: {tool} ({agent})",
+ "agents.loadingSettings": "Loading configuration…",
+ "agents.secretHint": "Secret values (passwords, keys) are masked by the server.",
+ "agents.noSettings": "No custom settings configured.",
+ "agents.loadFailed": "Loading failed: {error}",
+ "agents.rights": "Permissions",
+ "agents.noOperations": "This tool has no individual operations. Default rule applies.",
+ "agents.configuredHint": "Allowed operations run without confirmation, others require single approval, forbidden are denied immediately.",
+ "agents.notConfiguredHint": "No permissions configured: Tool defaults apply. Saving below will make these settings binding.",
+ "agents.operation": "Operation",
+ "agents.setting": "Setting",
+ "agents.effect": "Effect",
+ "agents.allowed": "allowed",
+ "agents.singleApproval": "single approval",
+ "agents.forbidden": "forbidden",
+ "agents.alwaysApprovalReason": "Modifications to agents always require approval.",
+ "agents.saveRights": "Save Permissions",
+ "agents.rightsSaved": "Permissions saved.",
+ "agents.effectAuto": "runs",
+ "agents.effectApprove": "single approval",
+ "agents.effectDeny": "denied",
+ "agents.standingApproval": "Standing approval #{id}",
+
+ "tasks.title": "Tasks",
+ "tasks.newTask": "New Task",
+ "tasks.showCompleted": "Show completed",
+ "tasks.empty": "No tasks found",
+ "tasks.createTitle": "Create Task",
+ "tasks.agent": "Agent",
+ "tasks.taskMessage": "Task description / instruction",
+ "tasks.schedule": "Schedule",
+ "tasks.scheduleType": "Schedule Type",
+ "tasks.scheduleNone": "None (Manual run only)",
+ "tasks.scheduleCron": "Cron Expression",
+ "tasks.scheduleInterval": "Interval",
+ "tasks.scheduleAt": "Specific time",
+ "tasks.runNow": "Run Now",
+ "tasks.pause": "Pause",
+ "tasks.resume": "Resume",
+ "tasks.delete": "Delete",
+ "tasks.saved": "Task saved.",
+ "tasks.deleted": "Task deleted.",
+ "tasks.runTriggered": "Run triggered.",
+
+ "services.title": "Services",
+ "services.newService": "New Service",
+ "services.empty": "No background services configured",
+ "services.serviceName": "Service Name",
+ "services.serviceType": "Type",
+ "services.port": "Port",
+ "services.active": "Active",
+ "services.start": "Start",
+ "services.stop": "Stop",
+ "services.restart": "Restart",
+
+ "backup.title": "Backup & Restore",
+ "backup.refresh": "Refresh",
+ "backup.refreshTooltip": "Reload backups",
+ "backup.newBackup": "New Backup",
+ "backup.newBackupTooltip": "Create new backup",
+ "backup.noInstance": "No instance selected",
+ "backup.selectInstancePrompt": "Please select an instance in the header above to manage its backups.",
+ "backup.loading": "Loading backups…",
+ "backup.backupDir": "Backup Directory",
+ "backup.backupDirHint": "Backups are fully encrypted with the instance manager's license key and contain credentials. They can be restored on another machine using the same license key.",
+ "backup.existingBackups": "Existing Backups ({count})",
+ "backup.noBackups": "No backups exist for this instance yet. Create one using the button above.",
+ "backup.restore": "Restore",
+ "backup.restoreTooltip": "Restore this backup",
+ "backup.deleteTooltip": "Permanently delete backup file",
+ "backup.archiveFile": "Archive File",
+ "backup.createdAt": "Created At",
+ "backup.size": "Size",
+ "backup.protection": "Protection",
+ "backup.files": "Files",
+ "backup.actions": "Actions",
+ "backup.fileCount": "{count} files",
+ "backup.foreignLicense": "Foreign License",
+ "backup.unreadable": "Unreadable",
+ "backup.licenseProtection": "License ({count} credentials)",
+ "backup.passphraseProtection": "Passphrase ({count})",
+ "backup.unencryptedProtection": "Unencrypted, no credentials",
+ "backup.dialogTitle": "Create New Backup",
+ "backup.dialogHint": "The backup will be encrypted with the instance manager's license key and contains credentials. If FTP upload is configured, it will be uploaded afterwards.",
+ "backup.includeChats": "Backup chat history",
+ "backup.includeLogs": "Include log files",
+ "backup.createButton": "Create Backup",
+ "backup.creating": "Creating backup…",
+ "backup.created": "Backup created.",
+ "backup.createFailed": "Backup failed: {error}",
+ "backup.restoreTitle": "Restore Backup: {file}",
+ "backup.overwriteWarningTitle": "Caution: Overwriting Existing Data",
+ "backup.overwriteWarningText": "Restoring will overwrite the instance's current configuration and data with the state from {date}.",
+ "backup.instanceStopNotice": "The instance will be gracefully stopped and restarted afterwards.",
+ "backup.passphraseLabel": "Passphrase for credentials",
+ "backup.passphrasePlaceholder": "Backup passphrase…",
+ "backup.passphraseRequired": "Please enter the passphrase.",
+ "backup.restoreNow": "Restore Now",
+ "backup.restoring": "Restoring…",
+ "backup.restoreSuccess": "Restore completed.",
+ "backup.restoreFailed": "Restore failed: {error}",
+ "backup.foreignLicenseTitle": "Source License Key Required",
+ "backup.sourceLicenseLabel": "Source License Key",
+ "backup.sourceLicenseHint": "Case and spaces do not matter.",
+ "backup.sourceLicensePlaceholder": "License key of the installation where the backup originated…",
+ "backup.restoreWithKey": "Restore with this Key",
+ "backup.keyMismatch": "This license key does not match the backup.",
+ "backup.deleteTitle": "Delete Backup",
+ "backup.deleteConfirm": "Really permanently delete backup file '{file}'?",
+ "backup.deleted": "Backup deleted.",
+ "backup.deleteFailed": "Deletion failed: {error}",
+ "backup.ftpTitle": "Backup FTP Upload",
+ "backup.ftpLoading": "Loading FTP settings…",
+ "backup.ftpHint": "Backups are encrypted — anyone reading the server sees nothing usable. However, without TLS, the server password is sent in plain text.",
+ "backup.ftpAutoUpload": "Automatically upload completed backups",
+ "backup.ftpServer": "Server",
+ "backup.ftpPort": "Port",
+ "backup.ftpUser": "Username",
+ "backup.ftpPassword": "Password",
+ "backup.ftpPasswordSaved": "(saved — leave empty to keep unchanged)",
+ "backup.ftpDirectory": "Target Directory",
+ "backup.ftpDirectoryHint": "Each instance gets its own subfolder.",
+ "backup.ftpKeepCount": "Backups to keep per instance",
+ "backup.ftpKeepCountHint": "Older backups on the server will be deleted.",
+ "backup.ftpRequireTls": "Connect with TLS only",
+ "backup.ftpTest": "Test Connection",
+ "backup.ftpTestFailed": "Test failed: {error}",
+ "backup.ftpSaved": "Saved.",
+ "backup.ftpSaveFailed": "Save failed: {error}",
+
+ "logs.title": "Logs",
+ "logs.connecting": "Connecting…",
+ "logs.allInstances": "All Instances",
+ "logs.allModules": "All Modules",
+ "logs.clear": "Clear",
+ "logs.pause": "Pause",
+ "logs.resume": "Resume",
+ "logs.paused": "Paused",
+ "logs.autoScroll": "Autoscroll",
+ "logs.empty": "No log messages yet.",
+
+ "settings.title": "Settings & System Architecture",
+ "settings.intro": "Configuration overview following the instance manager concept: Strict separation between global manager level (installation) and isolated instance level.",
+ "settings.managerLevel": "Instance Manager",
+ "settings.managerBadge": "Manager Level · Global",
+ "settings.managerIntro": "Applies to all instances and the WebUI. Stored in manager.json in the application root directory.",
+ "settings.webUiAndNet": "WebUI & Network",
+ "settings.configFile": "Configuration File",
+ "settings.webUiPort": "WebUI Port",
+ "settings.webUiPortDefault": "7000 (default, webUiPort)",
+ "settings.networkBinding": "Network Binding",
+ "settings.networkBindingValue": "loopback (127.0.0.1, webUiBinding)",
+ "settings.accessProtection": "Access Protection",
+ "settings.tokenActive": "Token active (≥ 20 characters)",
+ "settings.licenseAndUpdates": "License & Updates",
+ "settings.licenseScope": "License Scope",
+ "settings.licenseScopeValue": "Installation level (E-M3: Unlimited instances)",
+ "settings.licenseKey": "License Key",
+ "settings.licenseEncrypted": "●●●●-●●●●-●●●●-●●●● (encrypted)",
+ "settings.updateChannel": "Update Channel",
+ "settings.updateChannelValue": "prod (Official release versions)",
+ "settings.updateCheck": "Update Check",
+ "settings.updateCheckValue": "Central at manager level",
+ "settings.dcAndOversight": "Deploymentcenter & Oversight",
+ "settings.dcMasterToken": "Master Token",
+ "settings.dcMasterTokenValue": "●●●●●●●● (generates sub-tokens per instance)",
+ "settings.desktopWindows": "Desktop Windows",
+ "settings.desktopWindowsValue": "Active (each instance has its own window)",
+ "settings.crashProtection": "Crash Protection",
+ "settings.crashProtectionValue": "Max 5 restarts / 10 minutes",
+ "settings.instanceSectionTitle": "Active Instance: {name}",
+ "settings.instanceSectionTitleNone": "Instance-Related Settings",
+ "settings.instanceBadge": "Instance Level · Isolated",
+ "settings.noInstanceActive": "No instance active",
+ "settings.instanceIntro": "Applies exclusively to the currently selected instance. All paths, logs, agents and budgets are strictly isolated from other instances.",
+ "settings.noInstanceSelected": "No instance selected",
+ "settings.noInstancePrompt": "Please select an active instance in the header above or switch to 'Instances' to start or select an instance.",
+ "settings.toInstancesOverview": "To Instances Overview",
+ "settings.identityAndProcess": "Identity & Process",
+ "settings.instanceName": "Instance Name",
+ "settings.instanceId": "Instance ID",
+ "settings.autostartByManager": "Autostart by Manager",
+ "settings.autostartActive": "Active (keep running)",
+ "settings.autostartInactive": "Inactive (manual start)",
+ "settings.communication": "Communication",
+ "settings.communicationValue": "HTTP over Named Pipe (Windows) / Socket (Linux)",
+ "settings.isolatedPaths": "Isolated Directories",
+ "settings.logsPath": "Logs",
+ "settings.backupsPath": "Backups",
+ "settings.stateDbPath": "State Database",
+ "settings.stateDbValue": "Instances/{name}/state.db (exclusive)",
+ "settings.workspacePath": "Shared Workspace",
+ "settings.openRouterCard": "Model Integration (OpenRouter)",
+ "settings.openRouterStatus": "OpenRouter Status",
+ "settings.connected": "Connected",
+ "settings.offline": "Offline",
+ "settings.statusMessage": "Status Message",
+ "settings.credits": "Credits",
+ "settings.apiKey": "API Key",
+ "settings.apiKeyMasked": "Masked in InstanceSettings.json of this instance",
+ "settings.openRouterNotRunning": "Instance is not running. Data will be loaded after start.",
+ "settings.openRouterNoKey": "No key configured or service unreachable.",
+ "settings.runtimeAndSubsystems": "Runtime & Subsystems",
+ "settings.agentEngine": "Agent Engine",
+ "settings.scheduler": "Scanner / Scheduler",
+ "settings.stagingService": "Approvals (Staging)",
+ "settings.dcSubToken": "Deploymentcenter Sub-Token",
+ "settings.subsystemsLoading": "Querying runtime data…",
+ "settings.subsystemsStopped": "Instance stopped — subsystems idle.",
+ "settings.save": "Save Settings",
+ "settings.discard": "Discard Changes",
+ "settings.saved": "Settings saved successfully.",
+ "settings.saveError": "Failed to save settings: {error}",
+
+ "info.title": "System & Status",
+ "info.noInstanceSelected": "No instance selected",
+ "info.noInstanceHint": "Select an active instance in the header above or switch to 'Instances' to start one.",
+ "info.loading": "Loading system data…",
+ "info.instanceAndVersion": "Instance & Version",
+ "info.instanceName": "Instance Name",
+ "info.instanceId": "Instance ID",
+ "info.version": "Version",
+ "info.build": "Build",
+ "info.environment": "Environment",
+ "info.dataDirectory": "Data Directory",
+ "info.subsystems": "Subsystems",
+ "info.openRouterStatus": "OpenRouter & Credits",
+
+ "instances.title": "Instance Management",
+ "instances.refresh": "Refresh",
+ "instances.newInstance": "New Instance",
+ "instances.activeBadge": "Active in WebUI",
+ "instances.selectActive": "Select as active",
+ "instances.start": "Start",
+ "instances.stop": "Stop",
+ "instances.bringToFront": "Bring window to front",
+ "instances.createTitle": "Create New Instance",
+ "instances.instanceOfflineError": "The instance is not reachable.",
+ "instances.noInstanceActiveError": "No instance is active. Start or select one under 'Instances'.",
+ "instances.instanceNameLabel": "Instance Name",
+ "instances.instanceNamePlaceholder": "e.g. production-1",
+ "instances.dailyBudgetUsd": "Daily Budget ($ USD)",
+ "instances.dailyBudgetTokens": "Daily Budget (Tokens)",
+ "instances.autostart": "Autostart with Manager",
+ "instances.created": "Instance created.",
+ "instances.createError": "Failed to create instance: {error}",
+
+ "staging.title": "Approvals",
+ "staging.refresh": "Refresh",
+ "staging.loading": "Loading approvals…",
+ "staging.empty": "No open approvals",
+ "staging.emptyHint": "Currently no tool calls are waiting for manual approval.",
+ "staging.approve": "Approve",
+ "staging.reject": "Reject",
+ "staging.callId": "Call ID",
+ "staging.agent": "Agent",
+ "staging.tool": "Tool",
+ "staging.time": "Timestamp",
+ "staging.frozenArgs": "Frozen Arguments:",
+ "staging.suggestHint": "This operation by {agent} was approved {approvals} times in the last 14 days. Should {tool}.{action} run without confirmation for this agent in the future?",
+ "staging.allowSimilar": "Allow similar in future: {agent} may run {tool}.{action} without confirmation from now on (revocable below under 'Standing Approvals').",
+ "staging.notActive": "Staging not active",
+ "staging.notActiveHint": "No staging service configured in this instance.",
+ "staging.approved": "Call approved{similar}: {message}",
+ "staging.similarSuffix": " and allowed for the future",
+ "staging.executedSuccess": "Executed successfully",
+ "staging.approveFailed": "Approval failed: {error}",
+ "staging.standingTitle": "Standing Approvals",
+ "staging.standingEmpty": "None. When approving, 'Allow similar in future' can be selected; permanent permissions are in the agent's tool config.",
+ "staging.granted": "Granted",
+ "staging.occasion": "Occasion",
+ "staging.revoke": "Revoke",
+ "staging.revokeConfirm": "Revoke standing approval? {agent} will have to submit {tool}.{action} individually again.",
+ "staging.revoked": "Revoked.",
+ "staging.revokeFailed": "Revocation failed: {error}",
+ "staging.rejectTitle": "Reject Tool Call",
+ "staging.rejectReasonLabel": "Reason (optional):",
+ "staging.rejectReasonPlaceholder": "Reason for rejection to the agent…",
+ "staging.rejectButton": "Reject Call",
+ "staging.rejected": "Call was rejected.",
+ "staging.rejectFailed": "Rejection failed: {error}",
+
+ "agentChats.title": "Agent Communication (A2A)",
+ "agentChats.allAgents": "All Agents",
+ "agentChats.filterTooltip": "Filter by participating agent (sender or receiver)",
+ "agentChats.fromTooltip": "Messages from this day",
+ "agentChats.toTooltip": "Messages up to and including this day",
+ "agentChats.searchPlaceholder": "Fulltext…",
+ "agentChats.searchTooltip": "Search message text and agent names",
+ "agentChats.refresh": "Refresh",
+ "agentChats.refreshTooltip": "Reload communication",
+ "agentChats.from": "from",
+ "agentChats.to": "to",
+ "agentChats.noInstance": "No instance selected",
+ "agentChats.selectInstancePrompt": "Please select an instance in the header above to view its agent communication.",
+ "agentChats.infoTitle": "Internal Communication",
+ "agentChats.infoHint": "Direct message exchanges between agents are logged here when agents communicate via the AgentComm tool (action send_message).",
+ "agentChats.loading": "Loading communication history…",
+ "agentChats.matchCount": "{filtered} of {total} messages",
+ "agentChats.totalCount": "{total} messages",
+ "agentChats.empty": "No Messages",
+ "agentChats.emptyFilter": "No internal communication matches these filters.",
+ "agentChats.emptyInstance": "No internal agent-to-agent communication has been logged in this instance yet.",
+ "agentChats.replyTo": "➔ Reply to",
+ "agentChats.arrow": "➔",
+ "agentChats.loadFailed": "Failed to load communication: {error}",
+
+ "usage.title": "Token Usage & Analysis",
+ "usage.loading": "Loading usage data…",
+ "usage.empty": "No Data",
+ "usage.emptyHint": "No token usage data recorded yet.",
+ "usage.totalCost": "Total Cost ({runs} runs)",
+ "usage.totalTokens": "Total Tokens",
+ "usage.inputTokens": "Input Tokens (Prompt)",
+ "usage.outputTokens": "Output Tokens (Completion)",
+ "usage.unknownCostRuns": "{count} run(s) without known price — their costs are not included in the total.",
+ "usage.tokensByAgent": "Tokens by Agent",
+ "usage.tokensByModel": "Tokens by Model",
+ "usage.recentRuns": "Recent Agent Runs",
+ "usage.time": "Timestamp",
+ "usage.agent": "Agent",
+ "usage.model": "Model",
+ "usage.status": "Status",
+ "usage.prompt": "Prompt",
+ "usage.completion": "Completion",
+ "usage.total": "Total",
+ "usage.cost": "Cost",
+ "usage.unknownPrice": "(price unknown)",
+ "usage.notAvailable": "Usage data not available",
+ "usage.forecastTitle": "Cost Forecast",
+ "usage.forecastDay": "Forecast per day",
+ "usage.forecastMonth": "Forecast per month (30 days)",
+ "usage.tasksDay": "thereof tasks per day",
+ "usage.otherDay": "other runs per day (Ø 7 days)",
+ "usage.budgetWarning": "{agent}: Planned tasks are forecast to cost {cost} per day, daily budget allows {budget}. Later runs of a day will be rejected.",
+ "usage.withoutBasis": "{count} task(s) without basis (no run, no model price) — not included in total.",
+ "usage.oneOffOpen": "Open one-off tasks cost approximately an additional {cost}.",
+ "usage.basisHint": "Basis per task: average of its recent runs, otherwise agent's average, otherwise an estimate from prompt length and list price (tends to be high).",
+ "usage.task": "Task",
+ "usage.runsDay": "Runs/Day",
+ "usage.perRun": "per Run",
+ "usage.basis": "Basis",
+ "usage.perDay": "per Day",
+ "usage.basisRuns": "Ø last {n} runs",
+ "usage.basisAgent": "Ø of agent ({n} runs)",
+ "usage.basisEstimate": "Estimate – no runs yet",
+ "usage.basisUnknown": "no basis",
"filter.range": "Period",
"filter.range.24h": "Last 24 hours",
@@ -137,5 +627,57 @@
"history.settings.effective.days": "kept {n} days",
"history.settings.save": "Save retention",
"history.settings.saved": "Retention saved.",
- "history.settings.failed": "Saving failed: {error}"
+ "history.settings.failed": "Saving failed: {error}",
+
+ "desktop.mainWindow.title": "ClawdDotNet",
+ "desktop.mainWindow.sidebarTooltip": "Toggle sidebar",
+ "desktop.mainWindow.switchInstance": "Switch instance",
+ "desktop.mainWindow.instance": "INSTANCE",
+ "desktop.mainWindow.themeLight": "Light Mode",
+ "desktop.mainWindow.themeDark": "Dark Mode",
+ "desktop.mainWindow.openInstanceFolder": "Open Instance Folder",
+ "desktop.mainWindow.instanceManager": "Instance Manager",
+ "desktop.mainWindow.exit": "Exit",
+ "desktop.nav.work": "Work",
+ "desktop.nav.analytics": "Analytics",
+ "desktop.nav.system": "System",
+ "desktop.status.unknown": "unknown",
+ "desktop.status.design": "Design",
+ "desktop.status.noApiKey": "No API Key",
+ "desktop.status.noUsageData": "No usage data",
+ "desktop.settings.discard": "Discard",
+ "desktop.settings.save": "Save",
+ "desktop.settings.instance": "INSTANCE",
+ "desktop.settings.instanceName": "Instance Name",
+ "desktop.settings.apiKey": "OpenRouter API Key",
+ "desktop.settings.autostart": "Autostart by Manager",
+ "desktop.settings.autostartHint": "The instance manager starts this instance on launch and restarts it if it crashes.",
+ "desktop.settings.logDir": "Log Directory",
+ "desktop.settings.logDirHint": "Applies only to this instance. Empty means: Logs subfolder in instance directory.",
+ "desktop.settings.dailyCost": "Daily Budget ($ USD)",
+ "desktop.settings.dailyTokens": "Daily Budget (Tokens)",
+ "desktop.settings.general": "GENERAL",
+ "desktop.settings.instancesDir": "Instances Directory",
+ "desktop.settings.minLogLevel": "Minimum Log Level",
+ "desktop.settings.openRouterUrl": "OpenRouter Base URL",
+ "desktop.settings.language": "Language",
+ "desktop.settings.dcAndLicense": "DEPLOYMENTCENTER & LICENSE",
+ "desktop.settings.dcUrl": "Server URL",
+ "desktop.settings.dcToken": "Master Token",
+ "desktop.settings.dcEnv": "Environment",
+ "desktop.settings.errorReporting": "Automatically report errors",
+ "desktop.settings.updateCheck": "Check for updates on startup",
+ "desktop.settings.updateChannel": "Update Channel",
+ "desktop.settings.licenseKey": "License Key",
+ "desktop.chat.inputPlaceholder": "Type message... (Enter to send, Shift+Enter for new line)",
+ "desktop.chat.send": "Send",
+ "desktop.chat.statusReady": "Ready",
+ "desktop.chat.statusSending": "Sending…",
+ "desktop.chat.statusDesign": "Design Mode",
+ "desktop.dialog.addAgent": "Add Agent",
+ "desktop.dialog.addJob": "Add Job",
+ "desktop.dialog.addService": "Add Service",
+ "desktop.dialog.restoreBackup": "Restore Backup",
+ "desktop.dialog.license": "License Activation",
+ "desktop.dialog.instancePicker": "Choose Instance"
}
diff --git a/src/ClawdDotNet.Manager.Web/wwwroot/index.html b/src/ClawdDotNet.Manager.Web/wwwroot/index.html
index e9e52a8..0f99b2b 100644
--- a/src/ClawdDotNet.Manager.Web/wwwroot/index.html
+++ b/src/ClawdDotNet.Manager.Web/wwwroot/index.html
@@ -1,5 +1,5 @@
-
+
@@ -14,12 +14,12 @@
ClawdDotNet
-
- Bitte gib das Zugangstoken des Instanzmanagers ein (webUiToken in manager.json).
+
+ Please enter the instance manager access token (webUiToken in manager.json).
@@ -33,7 +33,7 @@