// German dictionary. Mirror the shape of src/lang/en.ts — // missing keys fall back to English per createI18n's fallbackLocale. const deMessages = { common: { downloadZip: "ZIP", downloadFailed: "Download fehlgeschlagen", save: "Speichern", cancel: "Abbrechen", loading: "Wird geladen...", close: "Schließen", dismiss: "Verwerfen", add: "Hinzufügen", remove: "Entfernen", yes: "Ja", no: "Nein", saving: "Wird gespeichert...", saved: "Gespeichert", noResultsYet: "Noch keine Ergebnisse", noImageYet: "Noch kein Bild", sendChat: "Neuen Chat starten", }, sessionTabBar: { newSession: "Neue Sitzung", activeSessions: "{count} aktive Sitzung (Agent läuft) | {count} aktive Sitzungen (Agent läuft)", unreadReplies: "{count} ungelesene Antwort | {count} ungelesene Antworten", unreadDot: "Neue Antwort", origin: { scheduler: "Vom Scheduler gestartet", skill: "Von einer Skill gestartet", bridge: "Von einem Bridge gestartet", }, }, chatInput: { placeholder: "Nachricht an Claude…", send: "Senden", stop: "Stoppen", runningPlaceholder: "Läuft… Enter reiht die Nachricht ein", removeBuffered: "Nachricht aus Warteschlange entfernen", attachFile: "Datei anhängen", fileTooLarge: "Datei zu groß ({sizeMB} MB). Das Maximum beträgt 30 MB.", unsupportedFileType: "Dateityp nicht unterstützt. Akzeptiert: Bilder, PDF, DOCX, XLSX, PPTX, Textdateien.", attachImageFailed: "Anhängen des Bildes fehlgeschlagen: {error}", stopFailed: "Stoppen der Ausführung fehlgeschlagen: {error}", dropHint: "Datei zum Anhängen ablegen", tooManyFiles: "Sie können maximal {max} Dateien gleichzeitig anhängen.", removeAttachment: "{name} entfernen", attachmentFallbackName: "Anhang", voice: { start: "Spracheingabe starten", stop: "Spracheingabe stoppen", }, }, cspViolation: { notice: "⚠ Eine Ansicht wollte {host} laden, aber die Content Security Policy hat es blockiert ({directive}). Zum Erlauben den Host in config/csp.json eintragen – nur wenn Sie ihm vertrauen.", dismiss: "Schließen", }, sessionHistoryPanel: { filters: { all: "Alle", unread: "Ungelesen", bookmarked: "Gemerkt", longRunning: "Langlaufend (24h+)", human: "Mensch", scheduler: "Scheduler", skill: "Skill", bridge: "Bridge", }, failedToRefresh: "⚠ Aktualisieren fehlgeschlagen: {error}", showingLastKnown: " — zeigt die zuletzt bekannte Liste.", noSessions: "Noch keine Sitzungen.", noMatching: "Keine passenden Sitzungen.", running: "Läuft", noMessages: "(keine Nachrichten)", openRowAria: "Sitzung öffnen: {preview}", rowMenuAria: "Sitzungsaktionen", bookmark: "Merken", unbookmark: "Lesezeichen entfernen", delete: "Löschen", deleteConfirm: "Diese Sitzung löschen?\n\n{preview}\n\nDies kann nicht rückgängig gemacht werden.", }, notificationBell: { notifications: "Benachrichtigungen", activeSection: "Aktiv", historySection: "Verlauf", noActive: "Keine aktiven Benachrichtigungen", noHistory: "Keine kürzlichen Aktivitäten", clearAll: "Alle löschen", dismiss: "Verwerfen", cancel: "Abbrechen", showMore: "Mehr anzeigen ({count})", showLess: "Weniger anzeigen", openTarget: "Öffnen", expandDetails: "Details anzeigen", }, pluginDiagnostics: { title: "Plugin-Konfigurationsproblem", hostBody: "Das Plugin „{plugin}“ hat versucht, den {label}-Schlüssel „{key}“ zu registrieren, aber er ist vom Host reserviert. Der Plugin-Eintrag wurde verworfen.", intraBody: "Die Plugins „{first}“ und „{second}“ registrieren beide {dimension} „{key}“. „{first}“ hat ihn zuerst beansprucht, daher wird die Registrierung von „{second}“ ignoriert.", }, shadowedEnv: { title: "Shell-Umgebung überschreibt .env", body: "Sowohl in der Shell als auch in .env gesetzt: {keys}. Der Wert aus der Shell gewinnt, daher wird .env ignoriert. Wenn Sie .env bearbeitet haben, aktualisieren oder entfernen Sie den Wert in der Shell und starten Sie neu.", }, optionalDeps: { // Generischer `title` aus Abwärtskompatibilität für persistierte // History-Einträge vor der Aufteilung nach Grund; neue Pfade // verwenden `titleNotFound` / `titleNotResponding`. title: "Optionale Abhängigkeit nicht verfügbar", titleNotFound: "{command} ist nicht installiert", titleNotResponding: "{command} läuft nicht", notFound: "{command} nicht gefunden — zugehörige Funktionen wurden deaktiviert. Installieren Sie {command} und starten Sie MulmoClaude neu, um sie zu aktivieren.", notResponding: "{command} ist installiert, läuft aber nicht — zugehörige Funktionen wurden deaktiviert. Starten Sie {command} und starten Sie MulmoClaude neu, um sie zu aktivieren.", }, billingMigration: { title: "Die Rechnungsstellung wird jetzt bei Bedarf eingerichtet", body: "Die gebündelten Sammlungen clients, worklog, invoice und profile wurden aus deinem Dashboard entfernt, deine Daten sind jedoch sicher und unverändert. Bitte um die Einrichtung der Kunden- und Zeiterfassung und anschließend der Rechnungsstellung, um sie neu zu erstellen – deine vorhandenen Datensätze werden wieder angezeigt.", }, backendOffline: { title: "Backend nicht erreichbar", body: "Der MulmoClaude-Server läuft möglicherweise nicht. Prüfe den Dev-Server und versuche es erneut.", retry: "Erneut versuchen", }, pluginErrorBoundary: { title: "Plugin {pkg} ist abgestürzt", subtitle: "Das Plugin konnte nicht gerendert werden. Der Fehler wurde in der Konsole protokolliert.", showDetails: "Details anzeigen", hideDetails: "Details ausblenden", retry: "Erneut versuchen", }, remoteHostOffline: { title: "Remote-Host getrennt", body: "Ihr Telefon kann erst nach dem erneuten Verbinden an dieses Gerät senden.", reconnect: "Erneut verbinden", }, remoteHost: { title: "Remote-Host", online: "Remote-Host online", offline: "Remote-Host offline", uid: "uid {uid}", signIn: "Mit Google anmelden", connecting: "Verbinden…", disconnect: "Trennen", disconnecting: "Wird getrennt…", noToken: "Google-Anmeldung hat kein idToken zurückgegeben", connectFailed: "Verbindung fehlgeschlagen", disconnectFailed: "Trennen fehlgeschlagen", signInFailed: "Google-Anmeldung fehlgeschlagen", statusFailed: "Status konnte nicht geladen werden", description: "Mit Remote-Zugriff kann ein Mobilgerät auf die Sammlungen und Feeds dieser MulmoClaude-Instanz zugreifen.", howTo: "Öffne auf deinem Smartphone {url} und melde dich mit demselben Google-Konto an.", customViewHint: "Für eine mobiltaugliche Ansicht bitte Claude, statt einer normalen Custom View eine {keyword} zu bauen.", qrHint: "Oder scanne diesen QR-Code mit der Handykamera.", }, sidebarHeader: { newMessages: "Neue Nachrichten", home: "Zum neuesten Chat", toolCallHistory: "Tool-Aufrufverlauf", settings: "Einstellungen", settingsGeminiMissing: "Einstellungen — Gemini-API-Schlüssel fehlt", todayJournal: "Heutige Zusammenfassung", todayJournalNotFound: "Noch keine Zusammenfassung — chatte etwas und das Journal erstellt eine.", todayJournalLoadFailed: "Journal konnte nicht geladen werden (Status {status}): {error}", copyMarkdown: "Chat als Markdown kopieren", copiedMarkdown: "Kopiert!", }, rightSidebar: { permalink: "Permalink zur ausgewählten Nachricht", copyPermalink: "Permalink zur ausgewählten Nachricht kopieren", copiedPermalink: "Kopiert!", toggleSystemPrompt: "System-Prompt umschalten", systemPrompt: "System-Prompt", availableTools: "Verfügbare Tools", toggleToolDescription: "Tool-Beschreibung umschalten", toolCallHistory: "Tool-Aufrufverlauf", copyHistory: "Tool-Aufrufverlauf kopieren", copiedHistory: "Kopiert!", noToolCalls: "Noch keine Tool-Aufrufe", arguments: "Argumente", error: "Fehler", result: "Ergebnis", running: "Läuft...", mcpHint: { title: (ctx: { named: (key: "server") => string }) => `Einrichtungshinweis: ${ctx.named("server")}`, requiredKeys: "Erforderliche Schlüssel", setupGuide: "Einrichtungsanleitung öffnen", }, }, fileTreePane: { sort: "Sortieren:", sortByName: "Nach Name sortieren", name: "Name", sortByRecent: "Nach Änderungsdatum sortieren (neueste zuerst)", recent: "Zuletzt", reference: "Referenz", // "RO" = Read-Only. Englische Abkürzung bleibt erhalten, um als // kompaktes Badge neben dem Label "Referenz" zu passen. readOnlyBadge: "RO", showSystemFiles: "Systemdateien anzeigen", showSystemFilesTitle: "Zeigt agent-interne Top-Level-Verzeichnisse (conversations/, feeds/ usw.) zusätzlich zu den Nutzer-Daten (data/, artifacts/, config/) an.", }, fileTree: { dropHint: "Dateien hier ablegen, um sie in diesem Ordner zu speichern", upload: { progress: "Hochladen {done} von {total}…", done: "{count} Datei(en) gespeichert", failed: "{count} Datei(en) konnten nicht gespeichert werden", }, workspace: "(Arbeitsbereich)", recentlyChanged: "Kürzlich geändert", newFileMenuItem: "Neue Datei", newFileInputAria: "Name der neuen Datei", newFilePlaceholder: { wikiPage: "seiten-slug", summary: "zusammenfassungsname", document: "dokumentname", html: "seitenname", story: "story-name", }, newFileError: { empty: "Der Dateiname darf nicht leer sein.", unsafe: "Der Dateiname enthält ungültige Zeichen.", exists: "Eine Datei mit dem Namen {filename} existiert hier bereits.", saveFailed: "Datei konnte nicht erstellt werden. Bitte erneut versuchen.", }, }, lockStatusPopup: { sandboxEnabledTooltip: "Sandbox aktiviert (Docker)", noSandboxTooltip: "Keine Sandbox (Docker nicht gefunden)", sandboxEnabledLabel: "Sandbox aktiviert:", sandboxEnabledBody: "Docker läuft. Der Dateisystemzugriff ist isoliert.", noSandboxLabel: "Keine Sandbox:", noSandboxBodyPrefix: "Claude kann auf alle Dateien auf Ihrem Rechner zugreifen. Installieren Sie", noSandboxBodySuffix: ", um die Dateisystem-Isolation zu aktivieren.", dockerDesktop: "Docker Desktop", hostCredentials: "Angehängte Host-Zugangsdaten:", credsLoading: "wird geladen…", sshAgent: "SSH-Agent:", forwarded: "weitergeleitet", notForwarded: "nicht weitergeleitet", mountedConfigs: "Eingebundene Konfigurationen:", none: "keine", testIsolation: "Sandbox-Isolation testen:", }, settingsModal: { title: "Einstellungen", version: "MulmoClaude v{version}", tabs: { gemini: "Gemini-API-Schlüssel", tools: "Erlaubte Tools", mcp: "MCP-Server", dirs: "Verzeichnisse", refs: "Referenzverzeichnisse", map: "Karte", photos: "Fotos", google: "Google", model: "Modell", voice: "Sprache", chatIndex: "Chat-Index", journal: "Journal", notifications: "Web Push", skills: "Skills", roles: "Rollen", quit: "Beenden", }, groups: { llm: "LLM", servers: "Server", workspace: "Arbeitsbereich", notifications: "Benachrichtigungen", plugins: "Plugins", management: "Verwaltung", server: "Server", }, navAriaLabel: "Einstellungsbereiche", googleTab: { description: "Verknüpfe dein Google-Konto, damit dieser Rechner Google-APIs direkt aufrufen kann (zuerst Kalender). Das Refresh-Token wird nur auf diesem Rechner gespeichert und außer an Google an keinen Server gesendet.", statusLinked: "Verknüpft", statusNotLinked: "Nicht verknüpft", statusPending: "Warte auf Abschluss der Einwilligung im Browser…", connect: "Google-Konto verknüpfen", unlink: "Verknüpfung aufheben", unlinkConfirm: "Google-Konto-Verknüpfung aufheben? Das gespeicherte Token wird widerrufen und von diesem Rechner gelöscht.", clientSecretAmbiguous: "In ~/.secrets/ wurden mehrere client_secret_*.json-Dateien gefunden. Behalte genau eine, damit das gespeicherte Token dem richtigen OAuth-Client zugeordnet bleibt.", loadError: "Der Google-Verknüpfungsstatus konnte nicht geladen werden.", connectError: "Der Google-Autorisierungsablauf konnte nicht gestartet werden.", unlinkError: "Die Google-Verknüpfung konnte nicht aufgehoben werden.", }, mapTab: { description: "Legt den Google-Maps-API-Schlüssel fest, den das Karten-Plugin verwendet. Der Schlüssel wird lokal gespeichert und nur an Google Maps gesendet.", apiKeyLabel: "Google-Maps-API-Schlüssel", apiKeyPlaceholder: "AIza…", helperText: "Erstelle oder kopiere einen Schlüssel aus {consoleLink}.", requiredApis: "Erforderliche APIs: Maps JavaScript API, Geocoding API, Places API (New), Directions API.", configured: "Konfiguriert", notConfigured: "Nicht konfiguriert", clear: "Löschen", loadError: "Einstellungen konnten nicht geladen werden", saveError: "Speichern fehlgeschlagen", }, photosTab: { description: "Datenschutzeinstellungen für Fotos, die per Chat oder verbundener Bridge empfangen wurden. EXIF-Standortdaten sind sensibel — Häkchen entfernen, um die automatische Erfassung zu deaktivieren.", autoCaptureLabel: "Fotostandort automatisch erfassen", autoCaptureHint: "Aktiv: Für jedes hochgeladene Bild mit EXIF-GPS wird ein Standort-Sidecar in data/locations/ erzeugt. Aus: Es wird nichts automatisch erfasst; das LLM kann EXIF weiterhin auf Anforderung lesen.", statusOn: "Automatische Erfassung AN", statusOff: "Automatische Erfassung AUS", loadError: "Einstellungen konnten nicht geladen werden", saveError: "Speichern fehlgeschlagen", }, quitTab: { description: "Beendet den MulmoClaude-Server auf diesem Rechner. Über das Symbol gestartet, läuft er weiter, auch wenn du diesen Tab schließt — hier beendest du ihn ohne Terminal.", // Message function form — skips vue-i18n's message compiler so the // literal `@` in `mulmoclaude@latest` is not parsed as a linked-message // reference (the compiler throws, and the whole tab renders as nothing). restartHint: () => "Zum erneuten Starten doppelklicke auf das MulmoClaude-Symbol (oder führe `npx mulmoclaude@latest` aus).", quitLabel: "MulmoClaude beenden", confirmBody: "Der Server hält an und diese Seite funktioniert nicht mehr. Laufende Vorgänge werden abgebrochen.", confirmLabel: "Beenden", stopping: "Wird beendet…", stoppedTitle: "MulmoClaude wurde beendet", stoppedBody: "Du kannst diesen Tab schließen. Doppelklicke auf das Symbol, um neu zu starten.", error: "Server konnte nicht beendet werden", }, notificationsTab: { description: "Erhalte eine Push-Benachrichtigung auf deinen registrierten Geräten, wenn eine hier gestartete Aufgabe abgeschlossen ist — praktisch, wenn du etwas fragst, weggehst und wissen willst, sobald die Antwort fertig ist.", enableLabel: "Web Push senden, wenn eine Aufgabe abgeschlossen ist", enableHint: "Wird ausgelöst, wenn ein hier gestarteter Chat abgeschlossen ist. Geplante und Hintergrundaufgaben lösen es nicht aus.", remoteHostNote: "Erfordert die RemoteHost-Verbindung (sie liefert die Anmeldung) und mindestens ein registriertes Gerät. Fehlt eines davon, passiert nichts.", macosRemindersLabel: "Bei Aufgabenende eine macOS-Erinnerung anlegen", macosRemindersHint: "Legt die erledigte Aufgabe in deiner Standard-Erinnerungsliste an. Die iCloud-Synchronisierung spiegelt sie auf dein iPhone, das die Mitteilung zustellt.", macosRemindersForcedOff: "Beim Start durch --disable-macos-reminders oder DISABLE_MACOS_REMINDER_NOTIFICATIONS deaktiviert. Entferne die Option oder die Umgebungsvariable und starte neu, um sie hier zu steuern.", statusOn: "Web Push ist AN", statusOff: "Web Push ist AUS", loadError: "Einstellungen konnten nicht geladen werden", saveError: "Speichern fehlgeschlagen", }, modelTab: { description: "Steuert den Reasoning-Effort, den Claude Code pro Zug verwendet. Ohne Einstellung wird der Standard von Claude verwendet.", effortLabel: "Reasoning-Effort", effortUnset: "(nicht gesetzt — Standard von Claude verwenden)", helperText: "Höhere Stufen erlauben mehr Denkzeit, erhöhen aber Latenz und Token-Verbrauch.", configured: "Effort: {level}", notConfigured: "Nicht gesetzt", loadError: "Einstellungen konnten nicht geladen werden", saveError: "Speichern fehlgeschlagen", }, voiceTab: { description: "Diktieren Sie Chat-Nachrichten mit Ihrer Stimme. Das Audio wird lokal auf dem Rechner transkribiert, der MulmoClaude ausführt — nichts wird an einen externen Dienst gesendet.", requirements: "Nur unter macOS verfügbar. Erfordert den whisper.cpp-Server — bauen Sie ihn mit yarn build:whisper (siehe Abschnitt Local Voice Input in der README).", unsupported: "Spracheingabe erfordert macOS mit installiertem whisper.cpp-Server. Auf diesem Rechner ist sie nicht verfügbar.", enableLabel: "Spracheingabe aktivieren", enableHint: "Beim Aktivieren wird das Sprachmodell (1–3 GB) einmalig heruntergeladen. Anschließend erscheint eine Mikrofon-Schaltfläche im Chat-Eingabefeld.", modelLabel: "Sprachmodell", downloading: "Modell wird heruntergeladen… {percent}%", ready: "Modell bereit", downloadError: "Modell-Download fehlgeschlagen.", retry: "Erneut versuchen", loadError: "Einstellungen konnten nicht geladen werden", saveError: "Speichern fehlgeschlagen", }, chatIndexTab: { description: "Automatische KI-Titel und Zusammenfassungen für den Chat-Verlauf. Standardmäßig aus — Automatisierungs-Sessions (Scheduler / System-Worker) werden auch bei aktivierter Option immer übersprungen; menschliche Sessions kosten pro beendetem Turn genau einen Summarizer-Aufruf.", modeLabel: "Chat-Index-Modell", helperText: "Haiku ist günstiger; Sonnet liefert schärfere Titel bei langen, themenwechselnden Sessions.", mode: { off: "Aus", haiku: "Haiku", sonnet: "Sonnet", }, status: { off: "Indizierung ist AUS", haiku: "Indizierung läuft mit Haiku", sonnet: "Indizierung läuft mit Sonnet", }, loadError: "Einstellungen konnten nicht geladen werden", saveError: "Speichern fehlgeschlagen", }, journalTab: { description: "Automatisiertes Tages-Journal — fasst kürzliche Chat-Sessions in journal/*.md zusammen und extrahiert dauerhafte Memory-Notizen. Standardmäßig aus. Automatisierungs-Sessions (Scheduler / System-Worker) werden unabhängig von dieser Einstellung immer ausgeschlossen.", modeLabel: "Journal-Modell", helperText: "Haiku ist günstiger; Sonnet liefert reichhaltigere Tages- und Themen-Zusammenfassungen. Der stündliche Lauf startet nur, wenn dies gesetzt ist.", mode: { off: "Aus", haiku: "Haiku", sonnet: "Sonnet", }, status: { off: "Journal ist AUS", haiku: "Journal läuft mit Haiku", sonnet: "Journal läuft mit Sonnet", }, loadError: "Einstellungen konnten nicht geladen werden", saveError: "Speichern fehlgeschlagen", }, // ``-Slots — die Namen `envKey` / `envFile` werden in // SettingsModal.vue als Inline-`` gerendert, sodass die // literalen Variablen- und Dateinamen unübersetzt bleiben. geminiRequired: "Die Bildgenerierung erfordert {envKey}. Fügen Sie ihn zu {envFile} hinzu und starten Sie die App neu.", geminiAskButton: "Claude fragen", geminiAskMessage: "Welche Rolle spielt der Gemini-API-Schlüssel in dieser App?", toolNamesLabel: "Tool-Namen", invalidToolNamesPrefix: "Diese sehen nicht standardmäßig aus (erwartetes Präfix", invalidToolNamesSuffix: "):", mcpToolsError: "⚠ MCP-Tool-Status konnte nicht abgerufen werden: {error}. Alle Tools werden unabhängig von der Aktivierung angezeigt.", changesHint: "Änderungen werden bei der nächsten Nachricht wirksam. Kein Neustart erforderlich.", cannotSaveTooltip: "Kann nicht gespeichert werden, bis die Einstellungen erfolgreich geladen sind", saving: "Wird gespeichert…", loadingLabel: "Wird geladen…", unsavedMarker: "●", unsavedToolsConfirm: "Allowed Tools enthält ungespeicherte Änderungen. Trotzdem schließen?", unsavedMcpDraftConfirm: "Ein MCP-Server-Entwurf ist noch offen. Trotzdem schließen?", mcpSaveFailed: "Änderungen an den MCP-Servern konnten nicht gespeichert werden.", }, canvasViewToggle: { stackViewTooltip: "Stapelansicht · klicken, um zur Einzelansicht zu wechseln", singleViewTooltip: "Einzelansicht · klicken, um zur Stapelansicht zu wechseln", switchToSingle: "Zur Einzelansicht wechseln", switchToStack: "Zur Stapelansicht wechseln", }, sessionHistoryToggle: { showTooltip: "Sitzungsverlauf-Panel links anzeigen", hideTooltip: "Sitzungsverlauf-Panel ausblenden", show: "Sitzungsverlauf anzeigen", hide: "Sitzungsverlauf ausblenden", }, sessionHistoryExpand: { expandTooltip: "Sitzungsverlauf-Panel auf volle Breite erweitern", collapseTooltip: "Sitzungsverlauf-Panel verkleinern", expand: "Sitzungsverlauf erweitern", collapse: "Sitzungsverlauf verkleinern", }, settingsWorkspaceDirs: { explanation: "Benutzerdefinierte Verzeichnisse zur Organisation von Dateien unter {dataDir} und {artifactsDir}. Claude nutzt sie, um das Speichern von Dateien zu steuern.", noEntries: "Keine benutzerdefinierten Verzeichnisse konfiguriert.", addDirTitle: "Verzeichnis hinzufügen", pathPlaceholder: "data/kunden oder artifacts/berichte", descPlaceholder: "Beschreibung (was in diesen Ordner gehört)", errPathRequired: "Pfad ist erforderlich", errMustStartWith: "Muss mit data/ oder artifacts/ beginnen", errAlreadyExists: "Existiert bereits", }, settingsReferenceDirs: { explanation: "Externe Verzeichnisse, die Claude lesen, aber nicht ändern kann. Im Docker-Modus werden sie schreibgeschützt eingebunden. Nützlich, um Obsidian-Vaults, Projektcode oder Dokumentordner zu referenzieren.", noEntries: "Keine Referenzverzeichnisse konfiguriert.", addDirTitle: "Referenzverzeichnis hinzufügen", pathPlaceholder: "/Users/ich/ObsidianVault oder ~/Dokumente/notizen", labelPlaceholder: "Label (optional — Standardwert ist der Ordnername)", readOnlyBadge: "schreibgeschützt", errPathRequired: "Pfad ist erforderlich", errMustBeAbsolute: "Muss ein absoluter Pfad sein oder mit ~/ beginnen", errAlreadyExists: "Existiert bereits", errLabelConflict: 'Label "{label}" existiert bereits', }, dashboard: { empty: "Noch keine Lieblingssammlungen.", emptyHint: "Hefte eine Sammlung (★) an, um sie hier zu sehen.", viewTable: "Tabelle", viewCalendar: "Kalender", viewKanban: "Kanban", viewPickerLabel: "Ansicht wählen", openFull: "Zum Öffnen der Vollansicht doppelklicken", dragHint: "Zum Neuordnen ziehen", resizeHint: "Zum Ändern der Höhe ziehen", }, pluginLauncher: { chat: { label: "Chat" }, dashboard: { label: "Dashboard" }, automations: { label: "Aktionen" }, wiki: { label: "Wiki" }, collections: { label: "Sammlungen" }, feeds: { label: "Feeds" }, accounting: { label: "Buchhaltung" }, files: { label: "Dateien" }, }, shortcuts: { pin: "An Launcher anheften", unpin: "Vom Launcher lösen", zoneAriaLabel: "Angeheftete Verknüpfungen", reorder: { open: "Verknüpfungen neu anordnen", title: "Neu anordnen", moveUp: "Nach oben", moveDown: "Nach unten", }, }, fileContentHeader: { showRendered: "Gerendertes Markdown anzeigen", showRaw: "Rohquelltext anzeigen", rendered: "Gerendert", raw: "Roh", closeFile: "Datei schließen", revealInOs: "Im Ordner anzeigen", revealInOsFailed: "Ordner konnte nicht geöffnet werden", }, fileContentRenderer: { download: "ZIP", downloadZip: "Als eigenständiges ZIP herunterladen (Assets gebündelt)", downloadError: "Download fehlgeschlagen", selectFile: "Datei auswählen", htmlPreview: "HTML-Vorschau", pdfPreview: "PDF-Vorschau", parseError: "Parse-Fehler", editJson: "JSON bearbeiten", jsonEditorLabel: "JSON-Editor", invalidJson: "Ungültiges JSON", undo: "Rückgängig", redo: "Wiederholen", editMarp: "Folienquelle bearbeiten", marpEditorLabel: "Marp-Folienquelle", openInOs: "Im Betriebssystem oeffnen", openingInOs: "Wird geoeffnet…", openInOsFailed: "Konnte nicht im Betriebssystem geoeffnet werden", }, filesView: { chatPlaceholder: "Frage zu dieser Datei stellen…", }, systemFiles: { schemaLabel: "Schema", showDetails: "Details anzeigen", hideDetails: "Details ausblenden", editPolicy: { "agent-managed-but-hand-editable": "Agent-verwaltet (manuelle Bearbeitung erlaubt)", "user-editable": "Benutzer-bearbeitbar", "agent-managed": "Agent-verwaltet", "fragile-format": "Empfindliches Format", ephemeral: "Flüchtig", }, mcp: { title: "MCP-Server", summary: "Externe Model-Context-Protocol-Server, die mit dem Agenten verbunden sind. HTTP- oder Stdio-Server hinzufügen, um die Werkzeugauswahl zu erweitern.", }, settings: { title: "App-Einstellungen", summary: "Vom Benutzer bearbeitbare Verhaltenseinstellungen — Gemini-API-Schlüssel, erlaubte Werkzeuge, Sandbox-Konfiguration usw.", }, schedulerTasks: { title: "Scheduler-Aufgaben", summary: "Wiederkehrende Agent-Automationen, die nach Zeitplan ausgelöst werden. Verwaltet über die Automations-UI; diese Datei ist die Quelle auf Festplatte.", }, schedulerOverrides: { title: "Scheduler-Überschreibungen", summary: "Pro-Aufgabe Zeit-/Intervall-Überschreibungen über dem Systemzeitplan. Der Agent bearbeitet dies, wenn du den Zeitpunkt einer wiederkehrenden Aufgabe änderst.", }, schedulerItems: { title: "Scheduler-Item-Warteschlange", summary: "Geplante Aufrufe, die zur Auslösung bereitstehen. Agent-verwaltet; nicht von Hand bearbeiten, ohne jedes Feld zu verstehen.", }, wikiIndex: { title: "Wiki-Index", summary: "Automatisch erzeugter Index aller Wiki-Seiten. Wird bei jeder Wiki-Bearbeitung aktualisiert; nicht von Hand bearbeiten (Änderungen werden überschrieben).", }, wikiLog: { title: "Wiki-Bearbeitungsprotokoll", summary: "Aktivitätsprotokoll der Erstellungs- und Bearbeitungsvorgänge im Wiki. Agent-verwaltet und nur anhängend — nützlich als Feed der letzten Änderungen.", }, wikiSummary: { title: "Wiki-Übersicht", summary: "Automatisch erzeugte Übersicht des Wikis — Themencluster, Seitenzahl, jüngste Aktivitäten. Vom Agenten aktualisiert.", }, wikiSchema: { title: "Wiki-Schema", summary: "Formatspezifikation, die der Agent liest, um Wiki-Seiten konsistent zu halten. Empfindlich — eine bestimmte Struktur wird erwartet; bevorzuge Agent-getriebene Bearbeitung.", }, memory: { title: "Memory", summary: "Destillierte Fakten über dich, immer als Kontext für neue Gespräche geladen. Der Journal-Extraktor hängt automatisch an; manuelle Bearbeitung ebenfalls möglich.", }, summariesIndex: { title: "Zusammenfassungs-Index", summary: "Durchsuchbarer Index, der zu den vom Journal erzeugten Tages- und Themen-Zusammenfassungen verlinkt. Agent-verwaltet; bei jedem Journal-Lauf aktualisiert.", }, rolesJson: { title: "Rollendefinition (JSON)", summary: "Rollenkonfiguration — Modellauswahl, MCP-Server, erlaubte Plugins, Anfragen-Vorschläge. Vom Benutzer bearbeitbar, kein Neustart nötig.", }, rolesMd: { title: "Rollenbeschreibung (Markdown)", summary: "Persona und System-Prompt-Text der Rolle, geladen als Kontext, wenn diese Rolle aktiv ist. Vom Benutzer bearbeitbar; Änderungen wirken ab der nächsten Nachricht.", }, journalDaily: { title: "Tägliche Journal-Zusammenfassung", summary: "Automatisch erzeugte Rückschau auf deine Aktivitäten an einem Kalendertag, vom Journal-Lauf aus den Chat-Sitzungen destilliert.", }, journalTopic: { title: "Themen-Journal", summary: "Langlaufende Notizen zu einem bestimmten Thema, gesammelt und überarbeitet, während du weiter darüber sprichst. Agent-verwaltet.", }, }, settingsMcpTab: { explanation: "Externe MCP-Server hinzufügen. HTTP-Server funktionieren in allen Modi. Stdio-Server nutzen {npx} / {node} / {tsx} aus dem Sandbox-Image; wenn Docker aktiviert ist, müssen die Pfade im Workspace liegen.", localhostRewrite: "Im Docker-Modus wird {localhost} zu {hostDockerInternal} umgeschrieben.", noServers: "Noch keine MCP-Server konfiguriert.", enabled: "aktiviert", urlLabel: "URL:", commandLabel: "Befehl:", dockerStdioUnsupported: "⚠ Wird nicht ausgeführt, solange die Docker-Sandbox aktiv ist.", dockerStdioHostExecActive: "⚠ Läuft auf dem Host — dieser Server verlässt die Docker-Sandbox.", dockerStdioHostExecOptIn: "Trotzdem auf dem Host ausführen (fortgeschritten). Dieser Server läuft über ein lokales HTTP-Gateway außerhalb der Docker-Sandbox und kann auf Ihren Rechner zugreifen.", learnMore: "Mehr erfahren", addServerButton: "+ MCP-Server hinzufügen", nameLabel: "Name", namePlaceholder: "mein-server", typeHttp: "HTTP", typeStdio: "Stdio (Befehl)", urlFieldLabel: "URL", urlPlaceholder: "https://example.com/mcp", commandFieldLabel: "Befehl", argsLabel: "Argumente (eins pro Zeile)", // Message-Function-Form — umgeht den Message-Compiler von vue-i18n, // damit das literale `@` nicht als Linked-Message-Referenz // interpretiert wird. argsPlaceholder: () => "-y\n@modelcontextprotocol/server-filesystem\n/workspace/path", errNoName: "Bitte einen Namen angeben oder eine URL / Argumente eingeben, aus denen sich einer ableiten lässt.", errBadName: "Der Name muss mit einem Kleinbuchstaben beginnen und darf nur [a-z0-9_-] enthalten.", errIdExists: 'Die Server-ID "{id}" existiert bereits.', errBadHttpUrl: "Die HTTP-URL muss mit http:// oder https:// beginnen", pendingEntryWarning: "Schließen Sie den ausstehenden MCP-Servereintrag zuerst ab oder brechen Sie ihn ab.", customHeading: "Benutzerdefinierte Server", catalog: { heading: "Vorkonfigurierte MCP-Server", audience: { general: "🟢 Allgemein", developer: "🔵 Entwickler" }, risk: { low: "niedrig", medium: "mittel", high: "hoch" }, upstream: "📦 Quelle", setupGuide: "📚 Einrichtung", entry: { memory: { displayName: "Memory", description: "Lässt Claude den Gesprächskontext über Sitzungen hinweg merken.", }, sequentialThinking: { displayName: "Sequenzielles Denken", description: "Hilft Claude, komplexe Probleme schrittweise zu lösen.", }, context7: { displayName: "Context7 (Bibliotheksdokumentation)", description: "Aktuelle Dokumentation gängiger Bibliotheken — geht über das Trainings-Cutoff des Modells hinaus.", }, deepwiki: { displayName: "DeepWiki (Wiki für GitHub-Repositories)", description: "Stelle Fragen zu beliebigen GitHub-Repositories und erhalte eine strukturierte Antwort im Wiki-Stil.", }, notion: { displayName: "Notion", description: "Lese und schreibe in deinem Notion-Workspace — Seiten, Datenbanken und Suche.", field: { apiKey: { label: "Notion-Integrationstoken", help: "Erstelle eine Notion-Integration und kopiere das Internal Integration Secret. 🔑 öffnet die Integrationen-Seite.", }, }, }, slack: { displayName: "Slack", description: "Kanäle auflisten, Nachrichten senden und den Verlauf deines Slack-Workspaces durchsuchen.", field: { botToken: { label: "Bot-Token", help: "Slack-App → OAuth & Permissions → Bot User OAuth Token. Beginnt mit xoxb-.", }, teamId: { label: "Team- / Workspace-ID", help: "Rufe team.info auf oder prüfe die Workspace-URL — etwa T01ABC23DEF.", }, }, }, googleMaps: { displayName: "Google Maps", description: "Orte suchen, Routen berechnen und Standortdetails abrufen.", field: { apiKey: { label: "Google-Maps-API-Key", help: "Google Cloud Console → APIs & Services → Credentials → API-Key erstellen. Aktiviere Places + Directions.", }, }, }, appleNative: { displayName: "Native Apple-Apps (macOS)", description: "Liest und schreibt Erinnerungen, Kalender, Notizen, Mail und Karten via AppleScript. Nur macOS — keine Zugangsdaten nötig.", }, gmail: { displayName: "Gmail", description: "Liest, sendet und beschriftet dein Gmail. Nutzt einen Google-OAuth-Client, den du selbst in deinem eigenen Google-Cloud-Projekt erstellst (keine App-Verifizierung nötig).", field: { credentials: { label: "Pfad zu credentials.json", help: "Google Cloud Console → APIs & Services → Credentials → OAuth-Client-ID (Desktop app). Lade credentials.json herunter und füge den absoluten Pfad ein.", }, }, }, googleCalendar: { displayName: "Google Kalender", description: "Liest und erstellt Termine im Google Kalender. Gleiches BYO-credentials.json-Muster wie Gmail.", field: { credentials: { label: "Pfad zu credentials.json", help: "Verwende denselben Google-Cloud-OAuth-Client wie Gmail, oder erstelle einen separaten nur für Calendar.", }, }, }, googleDrive: { displayName: "Google Drive", description: "Sucht und liest Google-Drive-Dateien. BYO Google-OAuth-Zugangsdaten — Token wird lokal neben der Datei zwischengespeichert.", field: { credentials: { label: "Pfad zu credentials.json", help: "Google Cloud Console → APIs & Services → Credentials → OAuth-Client-ID (Desktop app). Aktiviere die Google-Drive-API im selben Projekt.", }, }, }, github: { displayName: "GitHub", description: "Liest Repos, Issues, PRs und führt Suchen mit einem Personal Access Token aus. Begrenze den Token-Scope — Schreibrechte (z.B. `repo`) erlauben dem Agenten Pushes auf jeden zugänglichen Repo.", field: { token: { label: "Personal Access Token", help: "GitHub → Settings → Developer settings → Personal access tokens. Bevorzuge fine-grained tokens, die nur auf Repos beschränkt sind, in denen der Agent arbeiten soll.", }, }, }, linear: { displayName: "Linear", description: "Liest und aktualisiert Linear-Issues, -Projekte und -Cycles mit einem persönlichen API-Key.", field: { apiKey: { label: "Linear-API-Key", help: "Linear → Settings → API → Personal API keys. Klicke auf 🔑, um die Seite zu öffnen, und dann auf Create key.", }, }, }, weatherOpenMeteo: { displayName: "Wetter (Open-Meteo)", description: "Kostenlose Wettervorhersagen und aktuelle Bedingungen weltweit — ohne API-Key.", }, spotify: { displayName: "Spotify", description: "Suche Tracks, verwalte Playlists, steuere die Wiedergabe. BYO Spotify-Developer-App — nur Client ID (PKCE-Flow, kein Client Secret nötig).", field: { clientId: { label: "Client ID", help: "Spotify Developer Dashboard → Create app, setze die Redirect URI auf http://127.0.0.1:8888/callback, kopiere die Client ID. Führe dann einmal im Terminal `SPOTIFY_CLIENT_ID= npx spotify-mcp@latest auth` aus, um dich anzumelden (Refresh-Token wird in ~/.spotify-mcp/tokens.json gecacht).", }, }, }, youtubeTranscript: { displayName: "YouTube-Transkript", description: "Holt die Untertitel zu jedem öffentlichen YouTube-Video per URL. Keine Zugangsdaten nötig.", }, }, config: { howToGet: "So erhältst du den Wert", install: "Installieren", errMissingRequired: "Pflichtfelder fehlen: {fields}", requiredMarker: "*", requiredAria: "Pflichtfeld", }, }, }, pluginScheduler: { previewIcon: "📅", previewAutomations: "{count} Automatisierung | {count} Automatisierungen", previewMore: "+ {count} weitere…", }, pluginSchedulerTasks: { recommendedFrequencies: "Empfohlene Häufigkeiten", tableTaskType: "Aufgabentyp", tableSuggestedSchedule: "Empfohlener Zeitplan", noTasks: "Keine geplanten Aufgaben", runNow: "Jetzt ausführen", enable: "Aktivieren", disable: "Deaktivieren", delete: "Löschen", nextRun: "Nächste: {time}", originSystem: "System", originUser: "Benutzer", originSkill: "Skill", runFailed: "Ausführung fehlgeschlagen: {error}", toggleFailed: "Umschalten fehlgeschlagen: {error}", deleteFailed: "Löschen fehlgeschlagen: {error}", detailsToggle: "Details anzeigen", promptLabel: "Prompt", roleLabel: "Rolle", confirmDelete: "Aufgabe {name} löschen? Dies kann nicht rückgängig gemacht werden.", hintNewsRss: "News- / RSS-Abruf", hintJournal: "Täglicher Journallauf", hintWiki: "Wiki-Wartung", hintMemory: "Speicherextraktion", hintCalendar: "Kalender- / Kontaktsynchronisierung", }, pluginCanvas: { undo: "Rückgängig", redo: "Wiederherstellen", clear: "Löschen", styleLabel: "Stil:", stylePromptWithPath: "Wandle das Bild unter `{path}` in ein Bild im {style}-Stil um.", stylePromptNoPath: "Wandle meine Zeichnung auf dem Canvas in ein Bild im {style}-Stil um.", saveFailed: "Nicht gespeichert", }, pluginWiki: { backToIndex: "Zurück zum Index", pdf: "PDF", pdfFailed: "⚠ PDF fehlgeschlagen", tabIndex: "Index", tabLog: "Protokoll", tabLint: "Lint", tabGraph: "Graph", graphEmpty: "Noch keine Verknüpfungen für den Graphen.", linkedReferences: "Eingehende Verweise", empty: "Das Wiki ist leer. Bitten Sie den Wiki Manager, eine Quelle einzulesen.", previewMore: "+ {count} weitere…", chatPlaceholder: "Fragen Sie zu dieser Seite…", emptyPage: "Die Seite „{title}“ existiert noch nicht.", emptyContent: "Die Seite „{title}“ existiert, hat aber keinen Inhalt.", createPage: "Erstellung dieser Wiki-Seite anfordern", updatePage: "Aktualisierung dieser Wiki-Seite anfordern", tagFilterAll: "Alle", noMatches: "Keine Seiten mit dem Tag #{tag}", lintChat: "Wiki prüfen", taskCountMismatch: "Wiki-Quelle und gerendertes Ergebnis stimmen in der Anzahl der Aufgaben nicht überein. Die Umschaltung wurde abgelehnt, um eine Beschädigung der Datei zu vermeiden.", metadataCreated: "Erstellt", metadataUpdated: "Aktualisiert", metadataEditor: "Bearbeiter", pageEditHeader: "Wiki-Bearbeitung", snapshotExpired: "Snapshot abgelaufen — aktuelle Seite wird angezeigt", snapshotLoadError: "Snapshot konnte nicht geladen werden — die Seite existiert möglicherweise noch. Bitte aktualisieren.", pageDeleted: "Seite gelöscht", history: { tabContent: "Inhalt", tabHistory: "Verlauf", empty: "Noch kein Verlauf — bearbeite diese Seite, und die erste Version erscheint hier.", loading: "Verlauf wird geladen…", backToList: "Zurück zum Verlauf", restoreButton: "Diese Version wiederherstellen", restoreConfirmTitle: "Diese Version wiederherstellen?", restoreConfirmBody: "Seite auf die Version vom {ts} von {editor} zurücksetzen. Die aktuelle Seite wird ersetzt. Der bestehende Verlauf bleibt erhalten.", restoreConfirmAction: "Wiederherstellen", restoreConfirmCancel: "Abbrechen", restoreSuccessToast: "Seite wiederhergestellt.", restoreFailureBanner: "Wiederherstellung fehlgeschlagen: {error}", compareCurrent: "Mit aktueller Seite vergleichen", comparePrevious: "Mit vorheriger Version vergleichen", diffNoPrevious: "Keine vorherige Version zum Vergleichen vorhanden.", diffNoChanges: "Zwischen dieser Version und dem Vergleichsobjekt gibt es keine inhaltlichen Unterschiede.", editorBadgeUser: "Benutzer", editorBadgeLLM: "LLM", editorBadgeSystem: "System", hiddenLines: "{count} unveränderte Zeilen ausgeblendet", expandHidden: "Anzeigen", }, }, pluginPresentForm: { fallbackTitle: "Formular", fieldCount: "{count} Feld | {count} Felder", submitted: "Gesendet", errorSummary: "Bitte korrigieren Sie die folgenden Fehler", requiredMarker: "*", selectOption: "Bitte auswählen", charactersCount: "{current} / {max} Zeichen", charactersCountNoMax: "{current} Zeichen", submit: "Senden", progress: "{filled} von {total} Pflichtfeldern ausgefüllt", }, pluginPresentSvg: { saveAsPng: "Als PNG herunterladen", png: "PNG", saveAsPdf: "Als PDF speichern (öffnet Druckdialog)", pdf: "PDF", untitled: "SVG-Zeichnung", editSource: "SVG-Quelltext bearbeiten", cancel: "Abbrechen", applyChanges: "Änderungen anwenden", saving: "Wird gespeichert...", saveError: "⚠ Speichern fehlgeschlagen: {error}", exportError: "⚠ Export fehlgeschlagen: {error}", loadingSource: "Quelltext wird geladen…", sourceError: "Quelltext konnte nicht geladen werden: {error}", }, photoLocations: { title: "Fotostandorte", summary: "{total} erfasst · {withGps} mit GPS", mapHint: 'Bitte Claude um "auf der Karte anzeigen", um sie mit dem Google-Map-Plugin einzuzeichnen.', loading: "Lädt…", empty: "Noch keine Fotostandorte erfasst. Sende ein Foto mit GPS-Tag über den Chat oder eine verbundene Bridge, um zu beginnen.", noGps: "Keine GPS-Daten", }, pluginManageSkills: { deleteProjectSkill: "Diese Projekt-Skill löschen", unstarPresetSkill: "Markierung dieser Preset-Skill entfernen — sie kehrt in den Katalog zurück", heading: "Skills", previewCount: "{count} Skill | {count} Skills", previewMore: "+{count} weitere", subheading: ({ named }: { named: (key: string) => unknown }) => `${named("count")} verfügbar · zum Anzeigen klicken · "Run" ruft sie als / auf`, emptyWithPath: "Keine Skills gefunden. Fügen Sie Skill-Ordner unter {path} hinzu.", emptySkillPath: "~/.claude/skills/", selectHint: "Wählen Sie links eine Skill aus, um ihre SKILL.md anzuzeigen.", loading: "Wird geladen…", fieldDescription: "Beschreibung", fieldBody: "Inhalt (Markdown)", emptyBody: "(leerer Inhalt)", btnEdit: "Bearbeiten", btnDelete: "Löschen", btnUnstar: "Markierung entfernen", errListFailed: "Skills konnten nicht geladen werden: {error}", errDetailFailed: "Skill konnte nicht geladen werden: {error}", errSaveFailed: "Speichern fehlgeschlagen: {error}", errDeleteFailed: "Löschen fehlgeschlagen", confirmDelete: 'Skill "{name}" löschen? Dies entfernt ~/mulmoclaude/.claude/skills/{name}/SKILL.md.', confirmUnstar: 'Skill "{name}" zurück in den Katalog verschieben? Sie wird nicht mehr in den Prompt geladen, aber die Katalog-Kopie bleibt erhalten — du kannst sie jederzeit erneut markieren.', sectionActive: "Aktiv", sectionCatalog: "Katalog", sectionLegendActive: "Skills, die Claude jetzt verwenden kann. Claude verwendet sie automatisch im Verlauf des Gesprächs, oder du kannst eine durch Eingabe ihres Namens aufrufen. {system} System (mc- mitgeliefert) / {project} Projekt (bearbeitbar, nur in diesem Workspace) / {user} Nutzer (Skills in ~/.claude/skills/).", sectionLegendCatalog: "Katalog: Skills, die durch {star} Markieren Aktiv werden. {star} in Aktiv entfernen bringt eine Skill zurück in den Katalog — Claude verwendet sie dann nicht mehr (die Skill wird nicht gelöscht).", catalogEmpty: "Keine Preset-Skills verfügbar.", catalogPresetHeading: "Presets", catalogStar: "Markieren", catalogStarred: "Markiert", sourceUserTitle: "Benutzer-Skill (~/.claude/skills/, in allen Workspaces verfügbar)", sourceSystemTitle: "System-Skill (mitgeliefert, mc- Präfix — schreibgeschützt, vom Launcher überschrieben)", sourceProjectTitle: "Projekt-Skill (.claude/skills/ des Workspaces, nur dieser Workspace)", sourcePresetTitle: "Preset-Katalog — Markieren anklicken, um in diesem Workspace zu aktivieren", errCatalogListFailed: "Katalog konnte nicht geladen werden: {error}", errCatalogStarFailed: "Skill konnte nicht markiert werden: {error}", errCatalogPreviewFailed: "Skill-Vorschau konnte nicht geladen werden: {error}", catalogAddRepo: "Skill-Repository hinzufügen", catalogAddRepoTitle: "Ein Skill-Repository hinzufügen", catalogRepoUrlLabel: "GitHub-URL", catalogRepoUrlPlaceholder: "https://github.com/owner/repo", catalogRepoSubpathLabel: "Unterpfad (optional)", catalogRepoSubpathPlaceholder: "skills", catalogAddRepoSubmit: "Installieren", catalogAddRepoSuggestions: "Vorgeschlagene Repositories", catalogUninstallRepo: "Repository deinstallieren", catalogUpdateRepo: "Repository aktualisieren (neueste Version erneut laden)", catalogRepoOpenLink: "Repository auf GitHub öffnen (neuer Tab)", catalogUninstallConfirm: "Dieses Repository deinstallieren? Bereits mit Stern markierte Skills bleiben in deiner aktiven Liste.", catalogRepoInstalling: "Installiere…", catalogRepoEmpty: "In diesem Repository wurden keine Skills gefunden.", sourceExternalTitle: "Externe Skill (aus einem GitHub-Repository installiert — zum Aktivieren auf den Stern klicken)", errCatalogRepoListFailed: "Installierte Repositories konnten nicht geladen werden: {error}", errCatalogRepoInstallFailed: "Repository konnte nicht installiert werden: {error}", errCatalogRepoUninstallFailed: "Repository konnte nicht deinstalliert werden: {error}", errCatalogRepoInvalidUrl: "Gib eine GitHub-Repository-URL ein.", }, pluginManageRoles: { heading: "Benutzerdefinierte Rollen", roleCount: "{count} Rolle | {count} Rollen", addButton: "+ Hinzufügen", createPanel: "Neue Rolle erstellen", fieldId: "ID", fieldName: "Name", fieldIcon: "Symbol", fieldPrompt: "Prompt", fieldPlugins: "Plugins", fieldStarterQueries: "Einstiegsfragen", onePerLine: "(eine pro Zeile)", helpLink: "?", idFormatted: "({id})", missingEnv: "({env} fehlt)", requiresEnv: "Erfordert {env} in .env", collapse: "Einklappen", expand: "Ausklappen", idPlaceholder: "eindeutige-id", creating: "Wird erstellt…", create: "Erstellen", updating: "Wird aktualisiert…", update: "Aktualisieren", cancel: "Abbrechen", delete: "Löschen", emptyHint: 'Noch keine benutzerdefinierten Rollen. Klicken Sie auf "+ Hinzufügen" oder bitten Sie Claude, eine zu erstellen.', errIdRequired: "Die ID ist erforderlich.", errIdInvalid: "Die ID darf nur Buchstaben, Zahlen, '-' und '_' enthalten.", errNameRequired: "Der Name ist erforderlich.", errIdDuplicate: "Eine Rolle mit der ID '{id}' existiert bereits.", errCreateFailed: "Erstellen fehlgeschlagen", errSaveFailed: "Speichern fehlgeschlagen", errDeleteFailed: "Löschen fehlgeschlagen", errNetworkError: "Netzwerkfehler", errServerError: "Serverfehler: {status}", errRefreshFailed: "Gespeichert, aber die Liste konnte nicht aktualisiert werden.", confirmDelete: "Rolle {name} löschen? Dies kann nicht rückgängig gemacht werden.", }, pluginUiImage: { promptLabel: "{label}:", }, markdownMermaid: { loadFailed: "⚠ Mermaid konnte nicht geladen werden: {error}", renderFailed: "⚠ Mermaid-Rendering fehlgeschlagen: {error}", }, pluginTextResponse: { pdf: "PDF", pdfFailed: "⚠ PDF fehlgeschlagen", editContent: "Textinhalt bearbeiten", applyChanges: "Änderungen übernehmen", copyLabel: "Kopieren", speakerSystem: "System", speakerUser: "Sie", speakerAssistant: "Assistent", copiedLabel: "Kopiert!", cancel: "Abbrechen", seededByPlugin: "von {pkg}", seededByPluginTooltip: "Diese Nachricht wurde vom Plugin {pkg} erstellt und nicht von Ihnen gesendet.", truncatedForRender: "Diese Nachricht ist ungewöhnlich lang (insgesamt {total} Zeichen). Nur der erste Teil wird angezeigt – {omitted} Zeichen ausgeblendet, damit der Tab reaktionsfähig bleibt. Nutze „Kopieren“ für den vollständigen Text.", }, pluginSkill: { noDescription: "(keine Beschreibung)", }, pluginSpreadsheet: { previewUntitled: "Tabelle", previewSheets: "{count} Blatt | {count} Blätter", untitled: "Tabelle", excel: "Excel", valuePlaceholder: "Wert", valueOrFormulaPlaceholder: "Wert oder Formel (z. B. 100 oder SUM(B2:B11))", formatPlaceholder: "Format (z. B. $#,##0.00)", loading: "Tabelle wird geladen...", noData: "Keine Tabellendaten verfügbar", editData: "Tabellendaten bearbeiten", applyChanges: "Änderungen übernehmen", dataMustBeArray: "Daten müssen ein Array von Blättern sein", loadFailed: "Laden der Tabelle fehlgeschlagen: {error}", invalidJsonAlert: "Ungültiges JSON-Format: {error}", unknownError: "Unbekannter Fehler", update: "Aktualisieren", stringType: "Zeichenkette", formulaType: "Formel", }, app: { startConversation: "Gespräch beginnen", thinking: "Denkt nach…", }, suggestionsPanel: { suggestions: "Vorschläge", skills: "Skills", tooltip: "Vorschläge und Skills", emptySuggestions: "Keine Vorschläge.", emptySkills: "Keine Skills installiert.", skillsError: "Fehler beim Laden der Skills: {error}", sendEditHint: "klicken zum Senden · Shift+Klick zum Bearbeiten", }, settingsToolsTab: { // Wird über mit den benannten Slots `allowedTools` und // `claudeMcp` gerendert, damit die Inline-``-Tags ihren Stil // behalten, während der Text übersetzbar ist. explanation: "Zusätzliche Tool-Namen, die Claude über {allowedTools} übergeben werden sollen. Einer pro Zeile. Nützlich für in Claude Code integrierte MCP-Server wie Gmail / Google Kalender, nachdem Sie sich über {claudeMcp} authentifiziert haben.", connectorsSectionTitle: "Verbundene Konnektoren", connectorsEmpty: "Keine Konnektoren gefunden.", connectorConnected: "Verbunden", connectorDisconnected: "Nicht verbunden", connectorsGuide: "Konnektoren wie Slack und Gmail erlauben Claude den Zugriff auf Ihre Konten. Konnektoren können in Claude Desktop oder {configLink} hinzugefügt oder entfernt werden. (Öffnet claude.ai)", connectorsConfigLinkText: "hier", }, confirmModal: { defaultTitle: "Bestätigen", defaultConfirm: "Bestätigen", defaultCancel: "Abbrechen", }, }; export default deMessages;