diff --git a/packages/docs/CONTRIBUTING.md b/packages/docs/CONTRIBUTING.md index 76d6efbf..133cc359 100644 --- a/packages/docs/CONTRIBUTING.md +++ b/packages/docs/CONTRIBUTING.md @@ -203,13 +203,14 @@ other language mirrors the English files under a locale folder. | Korean | `ko/` | `ko` | | Polish | `pl/` | `pl` | | French | `fr/` | `fr` | +| German | `de/` | `de` | | Japanese | `ja/` | `ja` | > [!IMPORTANT] > The **content folder** uses the lowercase locale key (`zh-cn`, `pt-br`); the > **sidebar `translations`** key uses the BCP-47 language tag (`zh-CN`, `pt-BR`). > They look similar but are not interchangeable — Starlight resolves them with -> different rules. Everything else (`uk`, `es`, `ko`, `pl`, `fr`, `ja`, `en`) is identical +> different rules. Everything else (`uk`, `es`, `ko`, `pl`, `fr`, `de`, `ja`, `en`) is identical > in both columns. This locale set is mirrored in the website at @@ -269,6 +270,7 @@ to each section and item in `sidebar.config.json`: "ko": "여기서 시작", "pl": "Zacznij tutaj", "fr": "Commencer ici", + "de": "Hier starten", "ja": "ここから開始" }, "items": [ @@ -283,6 +285,7 @@ to each section and item in `sidebar.config.json`: "ko": "설치", "pl": "Instalacja", "fr": "Installation", + "de": "Installation", "ja": "インストール" } } diff --git a/packages/docs/content/docs/de/agent-control-tool.mdx b/packages/docs/content/docs/de/agent-control-tool.mdx new file mode 100644 index 00000000..c3b8dec6 --- /dev/null +++ b/packages/docs/content/docs/de/agent-control-tool.mdx @@ -0,0 +1,39 @@ +--- +title: Agent-Steuerungswerkzeug +description: Lass einen Agenten OpenChamber-Sitzungen, Worktrees und geplante Aufgaben direkt aus dem Chat verwalten. +--- + +# Agent-Steuerungswerkzeug + +Verwende das Agentenwerkzeug `openchamber`, um Arbeit in der App direkt aus dem Chat zu verwalten. Es ist standardmäßig aktiviert, wenn OpenChamber seinen eigenen lokalen OpenCode-Server ausführt; du musst kein separates Werkzeug installieren und keinen Shell-Befehl ausführen. + +## Was du anfragen kannst + +Sprich einfach in natürlicher Sprache mit dem Agenten. Zum Beispiel: + +- "Erstelle in diesem Projekt eine neue OpenChamber-Sitzung, verwende das Modell `openai/gpt-5.6-sol` und sende ihr diese Aufforderung: überprüfe den Authentifizierungsfluss." +- "Erstelle für diese Aufgabe eine neue OpenChamber-Sitzung in einem separaten Worktree und bitte sie, Tests für den Login-Fluss hinzuzufügen." +- "Verwende OpenChamber, um meine 10 neuesten Sitzungen aufzulisten und ihren aktuellen Status anzuzeigen." +- "Erstelle eine geplante OpenChamber-Aufgabe mit dem Namen Weekday review, die diese Aufforderung werktags um 09:00 sendet: review changes since the last run." +- "Führe die geplante OpenChamber-Aufgabe mit dem Namen Weekday review jetzt aus." +- "Prüfe die OpenChamber-Sitzung mit dem Namen Authentication review und zeige mir die neueste Antwort des Assistenten." + +Das Werkzeug kann Projekte und Modelleinstellungen auflisten, Sitzungen erstellen und weiterführen, eine Sitzung forken, isolierte Worktree-Sitzungen erstellen und geplante Aufgaben verwalten. Auf diese Weise gestartete Sitzungen erscheinen in OpenChamber wie jede andere Sitzung auch, sodass du sie öffnen und die Arbeit selbst fortsetzen kannst. + +## Beachten + +- Neue Sitzungsaufforderungen kehren standardmäßig sofort zurück. Verfolge die Sitzung in OpenChamber oder bitte den Agenten, sie später noch einmal zu prüfen. +- Ein separater Worktree wird nur erstellt, wenn du ausdrücklich danach fragst. Nicht-committete Änderungen aus deinem aktuellen Worktree werden nicht dorthin kopiert. +- Das Werkzeug kann keine Sitzungen oder Worktrees löschen, keine Projektpfade registrieren, keine beliebigen Shell-Befehle ausführen und keine beliebigen URLs aufrufen. + +## Werkzeug ein- oder ausschalten + +Öffne **Einstellungen → Allgemein → OpenCode CLI**, ändere **Agent control tool** und wähle dann **Save + Reload**. Die Einstellung gilt, nachdem der verwaltete OpenCode-Server neu gestartet wurde. + +Das Werkzeug ist nicht verfügbar, wenn OpenChamber über `OPENCODE_HOST` oder skip-start mit einem externen OpenCode-Server verbunden ist oder innerhalb der VS-Code-Erweiterung läuft. Desktop- und Web-Installationen, die den verwalteten OpenCode-Server von OpenChamber verwenden, unterstützen es automatisch. + +## Verwandt + +- [Geplante Aufgaben](/scheduled-tasks/) +- [Worktree-Sitzungen](/worktrees/) +- [Sitzungsziele](/session-goals/) diff --git a/packages/docs/content/docs/de/commands-snippets.mdx b/packages/docs/content/docs/de/commands-snippets.mdx new file mode 100644 index 00000000..e4a7c68f --- /dev/null +++ b/packages/docs/content/docs/de/commands-snippets.mdx @@ -0,0 +1,39 @@ +--- +title: Befehle & Snippets +description: Wiederverwendbare Slash-Befehle und Text-Snippets für den Chat erstellen. +--- + +# Befehle & Snippets + +Sowohl Befehle als auch Snippets ersparen dir das wiederholte Tippen derselben Dinge. Befehle sind ganze Prompts, die du mit `/` aufrufst; Snippets sind Textbausteine, die du mit `#` in eine Nachricht einfügst. + +## Befehle + +Ein Befehl ist ein gespeicherter Prompt, den du mit einem Slash aufrufst, etwa `/review`. Du verwaltest ihn unter **Einstellungen → Befehle**. + +1. Öffne **Einstellungen → Befehle** und erstelle einen Befehl. +2. Gib ihm einen Namen, eine Beschreibung und den Prompt-Text, den er senden soll. +3. Optional kannst du ihn an einen bestimmten Agenten oder ein Modell binden. +4. Wähle den Geltungsbereich: persönlich oder projektbezogen. + +Gib im Chat als **erstes** Zeichen der Nachricht `/` ein, um Befehle anzuzeigen, und wähle dann einen aus. Dein Text kann Platzhalter verwenden: + +- `$ARGUMENTS` — alles, was du nach dem Befehl eingibst +- `@filename` — fügt den Inhalt einer Datei ein +- `` !`command` `` — fügt die Ausgabe eines Shell-Befehls ein + +Die eingebauten Befehle `init` und `review` können zurückgesetzt, aber nicht gelöscht werden. + +## Snippets + +Ein Snippet ist wiederverwendbarer Text, auf den du inline mit einer Raute verweist, zum Beispiel `#signoff`. Du verwaltest ihn unter **Einstellungen → Snippets**. + +1. Öffne **Einstellungen → Snippets** und erstelle ein Snippet. +2. Gib ihm einen Namen und den Text, für den es steht. Füge Aliase hinzu, wenn du mehr als einen Auslöser möchtest. +3. Wähle den persönlichen oder projektbezogenen Geltungsbereich. + +Gib im Chat `#` ein und wähle ein Snippet aus. OpenChamber ersetzt es vor dem Senden durch den vollständigen Text. + +## Weiterführend + +- [Skills](/skills/) — größere Anweisungssätze bei Bedarf laden diff --git a/packages/docs/content/docs/de/connect-devices.mdx b/packages/docs/content/docs/de/connect-devices.mdx new file mode 100644 index 00000000..e3d19233 --- /dev/null +++ b/packages/docs/content/docs/de/connect-devices.mdx @@ -0,0 +1,68 @@ +--- +title: Ein Gerät verbinden +description: Kopple dein Telefon, deinen Desktop oder einen anderen Browser mit deinem OpenChamber-Server über einen einmaligen QR-Code. +--- + +# Ein Gerät verbinden + +Kopple ein weiteres Gerät — die Mobile App, die Desktop-App oder einen Browser auf einem anderen Rechner — mit deinem OpenChamber-Server, indem du einen einmaligen QR-Code scannst. Das ist der empfohlene Weg, Geräte zu verbinden; du musst keine Ports öffnen und keine Adressen eintippen. + +## Gerät koppeln + +1. Öffne auf dem Rechner mit OpenChamber **Settings → Remote Instances → Connect to this server** und drücke **Add a device**. +2. Gib dem Gerät einen Namen (z. B. *Mein iPhone*), damit du es später wiedererkennst. +3. Wähle, wo du das Gerät nutzen wirst: + - **This computer only** — für Apps, die auf genau diesem Rechner laufen + - **Home network only** — verbindet sich direkt über dein WLAN; funktioniert außerhalb dieses Netzwerks nicht + - **Anywhere** — funktioniert zu Hause und unterwegs; Daten außerhalb deines Netzwerks laufen über das [Private Relay](/private-relay/), ein Ende-zu-Ende-verschlüsselter Tunnel ohne zusätzliche Einrichtung +4. Drücke **Create QR code**. +5. Scanne den Code auf dem anderen Gerät: + - **mobile app** — tippe auf dem Verbindungsbildschirm (oder in der Instanzliste) auf **Scan QR code** + - **desktop app** — kopiere stattdessen den Verbindungslink und füge ihn unter **Settings → Remote Instances → Other OpenChamber servers → Import Link** ein + +Der Dialog schließt sich von selbst, sobald das Gerät verbunden ist, und das Gerät erscheint mit Live-Status in der Liste. Das war’s — die Kopplung ist abgeschlossen. + +## So bleibt die Kopplung sicher + +- **Der QR-Code ist nur einmal verwendbar.** Er funktioniert in dem Moment nicht mehr, in dem ein Gerät ihn einlöst, und läuft von selbst ab, wenn er nie benutzt wird. +- **Jedes Gerät erhält sein eigenes Token.** Beim Scannen wird niemals dein UI-Passwort offengelegt, und das Token eines Geräts kann nicht verwendet werden, um sich als ein anderes auszugeben. +- **Du behältst die Kontrolle.** Jedes gekoppelte Gerät wird mit Name, Plattform und Verbindungsstatus angezeigt — du kannst jedes davon jederzeit widerrufen. +- **Verkehr von unterwegs ist Ende-zu-Ende verschlüsselt.** Bei **Anywhere** läuft Verkehr außerhalb deines Netzwerks über das [Private Relay](/private-relay/), das nicht lesen kann, was hindurchläuft. + +## Gekoppelte Geräte verwalten + +**Settings → Remote Instances → Connect to this server** listet jedes Gerät, das diesen Server erreichen kann, mit einem grünen Punkt, wenn es online ist, und zeigt an, ob es über das lokale Netzwerk oder das Relay verbunden ist. + +- **Revoke** trennt ein Gerät sofort. Kopple es mit einem neuen QR-Code erneut, wenn du es dir anders überlegst. +- **Clear revoked** räumt die Liste auf. + +Dasselbe physische Gerät bleibt nur in einem Eintrag, auch wenn es sich später erneut anmeldet — du sammelst keine Duplikate an. + +## Über die Kommandozeile verbinden + +Wenn der Server ohne UI läuft (also headless), erstelle einen Verbindungslink in einem Terminal auf diesem Rechner. + +Für ein Gerät im selben Netzwerk: + +```bash +openchamber connect-url --port 3000 --qr +``` + +Für ein Gerät, das sich von **überall** verbinden soll — das entspricht der Wahl von **Anywhere** im Dialog: + +```bash +openchamber connect-url --relay --qr +``` + +Ein `--relay`-Link enthält beide Routen, genau wie der Dialog: Das Gerät verbindet sich direkt über dein lokales Netzwerk, wenn es den Server erreichen kann, und fällt auf das [Private Relay](/private-relay/) zurück, wenn es unterwegs ist. Das Relay startet von selbst: Eine laufende Instanz übernimmt den Link innerhalb einer Minute, eine gestoppte Instanz beim nächsten Start. + +> Die direkte Route funktioniert nur, wenn der Server tatsächlich im Netzwerk lauscht. Standardmäßig lauscht OpenChamber nur auf dem Rechner selbst — starte es mit `--lan`, damit es über WLAN erreichbar ist. Der Befehl warnt dich (`[LAN_UNREACHABLE]`), wenn die direkte Route des Links von anderen Geräten nicht nutzbar ist; ein `--relay`-Link funktioniert dann trotzdem, nur immer über das Relay. + +Der ausgegebene Link und QR-Code funktionieren genau wie die aus dem Einstellungsdialog — nur einmal verwendbar, mit Ablaufzeit und widerrufbar. + +## Verwandt + +- [Private Relay](/private-relay/) — wie "Anywhere"-Verbindungen funktionieren +- [Mobile Apps](/mobile/) — die iOS- oder Android-App installieren +- [Remote Instances](/remote-instances/) — die Desktop-App per SSH oder Link mit Servern verbinden +- [Remote access](/troubleshooting/remote-access/) — wenn sich ein Gerät nicht verbinden kann diff --git a/packages/docs/content/docs/de/context.mdx b/packages/docs/content/docs/de/context.mdx new file mode 100644 index 00000000..9973d1d4 --- /dev/null +++ b/packages/docs/content/docs/de/context.mdx @@ -0,0 +1,38 @@ +--- +title: Kontext +description: Sieh, wie viel des Modellgedächtnisses eine Session verwendet. +--- + +# Kontext + +Jedes Modell kann immer nur so viel von einer Unterhaltung gleichzeitig halten — seinen Kontext. OpenChamber zeigt dir, wie voll er ist, damit du erkennst, wenn eine Session an die Grenze kommt und eine Antwort vielleicht ältere Details fallen lässt. + +## Die schnelle Anzeige + +Während du chattest, zeigt eine kleine Anzeige den prozentualen Kontextverbrauch. Die Farbe ändert sich, während er voller wird: + +- grün — noch reichlich Platz +- gelb — wird voll (etwa drei Viertel) +- rot — fast voll + +Bewege den Mauszeiger darüber (oder tippe sie auf dem Handy an), um die genauen Token-Zahlen zu sehen. + +## Das vollständige Kontext-Panel + +Öffne den Tab **Kontext** in der rechten Seitenleiste für ein vollständigeres Bild der aktuellen Session: + +- das verwendete Modell und wann die Session gestartet wurde +- Gesamtzahl der Tokens im Verhältnis zum Limit des Modells +- Gesamtzahlen für Nachrichten und Kosten +- eine Aufschlüsselung der Token der letzten Antwort +- eine grobe Aufteilung dessen, was den Kontext belegt (deine Nachrichten, die des Agenten, Tool-Ausgaben) + +Die Aufschlüsselung ist eine Schätzung, keine exakte Zahl — nutze sie, um zu erkennen, was das Fenster füllt, nicht für die Abrechnung. + +## Was tun, wenn es voll ist + +Starte für eine neue Aufgabe eine frische Session, statt eine Session endlos wachsen zu lassen. Ein kürzerer Kontext ist schneller und hält das Modell fokussiert. + +## Verwandtes + +- [Projekte](/projects/) — Sessions werden pro Projekt gruppiert diff --git a/packages/docs/content/docs/de/desktop-browser.mdx b/packages/docs/content/docs/de/desktop-browser.mdx new file mode 100644 index 00000000..8860ee8f --- /dev/null +++ b/packages/docs/content/docs/de/desktop-browser.mdx @@ -0,0 +1,22 @@ +--- +title: Desktop-Browser +description: Durchsuche jede Seite in der Desktop-App mit Inspektion und Konsolenaufzeichnung. +--- + +# Desktop-Browser + +Die Desktop-App hat einen eingebauten Browser, damit du jede Seite direkt neben deinem Chat öffnen, auf Elemente zeigen und danach fragen sowie die Konsole der Seite aufzeichnen kannst. Öffne ihn über die Globus-Schaltfläche im App-Kopfbereich. + +> Der Desktop-Browser ist eine Funktion **nur für den Desktop**. Im Web bietet das [Preview](/preview/)-Panel dieselben Inspektions- und Konsolentools für deinen lokalen Dev-Server. + +## Inspizieren und annotieren + +Aktiviere **inspect** und klicke auf ein beliebiges Element auf der Seite. OpenChamber erstellt dazu eine Notiz — was es ist, welche Stile es hat, wo es sich befindet und einen Screenshot — und hängt sie an deine Chatnachricht an. Das ist der schnellste Weg, dem Agenten zu sagen: „dieses Element, genau hier“. + +## Konsolenaufzeichnung + +Der Browser sammelt die Konsolenausgabe der Seite — Fehler, Warnungen und Logs — damit du sie filtern und lesen kannst, ohne die Entwicklertools zu öffnen. + +## Verwandt + +- [Preview & Dev Servers](/preview/) — dieselben Tools für deinen lokalen Dev-Server diff --git a/packages/docs/content/docs/de/desktop-tunnels.mdx b/packages/docs/content/docs/de/desktop-tunnels.mdx new file mode 100644 index 00000000..6b3d80ad --- /dev/null +++ b/packages/docs/content/docs/de/desktop-tunnels.mdx @@ -0,0 +1,41 @@ +--- +title: Desktop-Tunnel +description: Erstelle Cloudflare- oder Ngrok-Tunnel aus der Desktop-App. +--- + +# Desktop-Tunnel + +Die Desktop-App kann unter **Settings → OpenChamber → Tunnel** einen öffentlichen Tunnel erstellen. Für diesen Weg musst du OpenChamber nicht per CLI starten. + +## Anbieter installieren + +OpenChamber startet das Provider-CLI auf deinem Rechner. Installiere zuerst den Anbieter, den du verwenden möchtest: + +```bash +brew install cloudflared +brew install ngrok +``` + +Cloudflare verwendet `cloudflared`. Ngrok benötigt ein ngrok-Konto und ein Authtoken aus dem ngrok-Dashboard: + +```bash +ngrok config add-authtoken +``` + +## In der App starten + +1. Öffne **Settings → OpenChamber → Tunnel**. +2. Wähle **Cloudflare** oder **Ngrok**. +3. Starte einen Quick Tunnel. +4. Scanne den erzeugten QR-Code mit deinem Telefon. + +Ngrok unterstützt derzeit Quick Tunnels. Cloudflare unterstützt Quick Tunnels und verwaltete Cloudflare-Modi. + +## Zugriffsschutz + +Auch wenn die Anbieter-URL selbst öffentlich ist, schützt OpenChamber den Zugriff weiterhin mit seinem eigenen Verbindungs-Token. Der erzeugte Verbindungslink enthält ein Einmal-Token, hat eine TTL, und alte unbenutzte Links werden widerrufen, wenn du einen neuen erzeugst oder den Tunnel stoppst bzw. neu startest. + +## Verwandt + +- [Tunnels](/tunnels/) — Tunnel-Nutzung per CLI und verwaltete Cloudflare-Modi +- [PWA & Mobile](/mobile/) — OpenChamber vom Telefon aus erreichen diff --git a/packages/docs/content/docs/de/environment.mdx b/packages/docs/content/docs/de/environment.mdx new file mode 100644 index 00000000..8e48b703 --- /dev/null +++ b/packages/docs/content/docs/de/environment.mdx @@ -0,0 +1,138 @@ +--- +title: Umgebungsvariablen +description: Konfiguriere die OpenChamber- und OpenCode-Integration mit Umgebungsvariablen. +--- + +# Umgebungsvariablen + +OpenChamber liest diese Umgebungsvariablen beim Start. Für Startdienste speichert `openchamber startup enable` die aktuelle Umgebung standardmäßig als Schnappschuss, also führe den Befehl nach Änderungen an den Variablen, die der Dienst verwenden soll, erneut aus. + +## OpenChamber-Server + +### `OPENCHAMBER_HOST` + +Bind-Adresse für den OpenChamber-Webserver. Verwende `0.0.0.0`, um Zugriff von anderen Maschinen zu erlauben. + +### `OPENCHAMBER_UI_PASSWORD` + +Passwort für die Browser-Oberfläche. Verwende es, wenn du außerhalb von localhost bindest, Tunnels nutzt oder hinter einem Reverse Proxy läufst. + +### `OPENCHAMBER_API_ONLY` + +Startet OpenChamber im Headless-Modus, wenn auf `true` oder `1` gesetzt. API-Routen bleiben für Desktop- und Mobile-Clients verfügbar, aber die Browser-Oberfläche wird nicht ausgeliefert. + +### `OPENCHAMBER_DATA_DIR` + +Überschreibt das OpenChamber-Datenverzeichnis. Standard ist `~/.config/openchamber`. + +### `OPENCHAMBER_COMPRESS_API` + +Steuert die Komprimierung von API-Antworten. Verwende `true` oder `1`, um sie zu erzwingen, und `false` oder `0`, um sie zu deaktivieren. + +### `OPENCHAMBER_SKIP_API_COMPRESSION` + +Deaktiviert die Komprimierung von API-Antworten, wenn auf `true` oder `1` gesetzt. Das hat Vorrang vor `OPENCHAMBER_COMPRESS_API`. + +### `OPENCHAMBER_VERBOSE_REQUEST_LOGS` + +Aktiviert ausführliche HTTP-Request-Logs, wenn auf `true` oder `1` gesetzt. + +### `OPENCHAMBER_UPDATE_API_URL` + +Überschreibt den API-Endpunkt für Update-Prüfungen. Die meisten Nutzer sollten das nicht setzen. + +### `OPENCHAMBER_PACKAGE_MANAGER` + +Erzwingt den Paketmanager, den Update-Operationen verwenden, wenn die automatische Erkennung falsch liegt. + +## OpenCode-Server + +### `OPENCODE_HOST` + +Verbindet OpenChamber mit einem vorhandenen OpenCode-Server. Der Wert muss ein `http`- oder `https`-Origin mit explizitem Port und ohne Pfad, Query oder Hash sein. `OPENCODE_HOST` hat Vorrang vor `OPENCODE_PORT`. + +### `OPENCODE_PORT` + +Legt den Port des OpenCode-Servers fest. Bei verwaltetem OpenCode fordert dies den verwalteten Port an; mit `OPENCODE_SKIP_START=true` verbindet es sich mit einem externen Server auf diesem Port. + +### `OPENCODE_SKIP_START` + +Verhindert, dass OpenChamber einen eigenen OpenCode-Server startet, wenn auf `true` gesetzt. + +### `OPENCHAMBER_OPENCODE_HOSTNAME` + +Bind-Hostname für den von OpenChamber verwalteten OpenCode-Server. Standard ist `127.0.0.1`. + +### `OPENCODE_BINARY` + +Pfad zur ausführbaren `opencode`-Datei, die OpenChamber ausführen soll. + +### `OPENCODE_CONFIG` + +Pfad zu einer bestimmten OpenCode-Konfigurationsdatei. + +### `OPENCODE_CONFIG_DIR` + +Pfad zu einem bestimmten OpenCode-Konfigurationsverzeichnis für Agents, Skills, Snippets und Konfigurationssuche. + +### `OPENCODE_DATA_DIR` + +Benutzerdefiniertes Datenverzeichnis für den verwalteten OpenCode-Server. + +### `OPENCODE_WSL_DISTRO` + +Wählt die WSL-Distribution für die OpenCode-Integration unter Windows aus. + +### `OPENCHAMBER_OPENCODE_WSL_DISTRO` + +OpenChamber-spezifischer Alias zur Auswahl der WSL-Distribution. `OPENCODE_WSL_DISTRO` hat Vorrang, wenn beide gesetzt sind. + +### `OPENCODE_JWT_SECRET` + +Geheimnis zum Signieren von UI-Authentifizierungstokens. Verwende für dauerhafte Diensteinrichtungen einen langen, zufälligen Wert. + +## Terminal und Git + +### `OPENCHAMBER_TERMINAL_SHELL` + +Shell-Executable, die OpenChamber für Terminal-Sessions verwendet. + +### `OPENCHAMBER_GIT_BINARY` + +Git-Executable, die OpenChamber-Git-Funktionen verwenden. + +### `GIT_BINARY` + +Alternative Git-Executable-Überschreibung. Bevorzuge `OPENCHAMBER_GIT_BINARY` für OpenChamber-spezifische Konfiguration. + +### `OPENCHAMBER_GIT_READ_CACHE_TTL_MS` + +Lebensdauer in Millisekunden für zwischengespeicherte Git-gestützte Dateilesevorgänge. Setze `0`, um diesen Cache beim Debuggen zu deaktivieren. + +## Voice und Tunnels + +### `OPENAI_API_KEY` + +API-Schlüssel, den OpenChamber-Voice-Funktionen für OpenAI-kompatible Dienste verwenden. + +### `OPENCHAMBER_ALLOW_REMOTE_OPENAI_COMPAT_URLS` + +Erlaubt entfernte OpenAI-kompatible Basis-URLs für Voice-Funktionen, wenn auf `true` oder `1` gesetzt. + +### `NGROK_AUTHTOKEN` + +ngrok-Auth-Token, den OpenChamber-Tunnel-Befehle verwenden. Du kannst ngrok auch mit `ngrok config add-authtoken ` konfigurieren. + +## Laufzeit-Helfer + +### `BUN_BINARY` + +Bun-Executable, die OpenChamber beim Starten von Daemon-Prozessen verwenden soll. + +### `BUN_INSTALL` + +Installationswurzel von Bun. OpenChamber verwendet sie, um `bin/bun` für Daemon-Start und Updates zu finden. + +### `VITE_OPENCODE_URL` + +Build-Zeit-API-Basis-URL für die mit Vite gebaute Web-App. Die meisten Nutzer sollten sie für die normale CLI- oder Desktop-Nutzung nicht setzen. diff --git a/packages/docs/content/docs/de/git-identities.mdx b/packages/docs/content/docs/de/git-identities.mdx new file mode 100644 index 00000000..7c02f83b --- /dev/null +++ b/packages/docs/content/docs/de/git-identities.mdx @@ -0,0 +1,30 @@ +--- +title: Git-Identitäten +description: Committe mit dem richtigen Namen und der richtigen E-Mail für jedes Repository. +--- + +# Git-Identitäten + +Eine Git-Identität ist der Name und die E-Mail-Adresse, mit denen deine Commits signiert werden. Wenn du zwischen privaten und Arbeits-Repos wechselst, kannst du Identitäten speichern und pro Repository die richtige anwenden, statt dich auf eine einzige globale Einstellung zu verlassen. Verwalte sie unter **Einstellungen → Git**. + +## Eine Identität hinzufügen + +1. Öffne **Einstellungen → Git** und wähle **New**. +2. Gib den **name** und die **email** ein, mit denen committen werden soll. +3. Wähle aus, wie sie sich beim Remote authentifiziert: + - **SSH** — verweise auf einen SSH-Schlüssel + - **token** — verwende eine gespeicherte Anmeldedaten für einen Host +4. Gib ihr optional eine Farbe und ein Symbol, damit sie leicht zu erkennen ist. + +Auch deine globale System-Identität wird angezeigt, allerdings nur lesbar. + +## Eine Identität auf ein Repo anwenden + +Das Anwenden einer Identität schreibt sie in die **lokale** Git-Konfiguration dieses Repositories — sie betrifft nur dieses Repo, nicht deine globale Einstellung. SSH-Identitäten setzen außerdem den zu verwendenden SSH-Befehl auf deinen Schlüssel; Token-Identitäten richten die Anmeldedatenspeicherung für den Host ein. + +Du kannst Identitäten importieren, die OpenChamber aus deinen vorhandenen Git-Anmeldedaten erkennt, und sie als Token-Identitäten speichern. + +## Verwandt + +- [Git- & GitHub-Workflows](/git/) — mit der von dir festgelegten Identität committen +- [GitHub Issues & PRs](/github/) — ein GitHub-Konto für PRs verbinden diff --git a/packages/docs/content/docs/de/git.mdx b/packages/docs/content/docs/de/git.mdx new file mode 100644 index 00000000..fc2d4b54 --- /dev/null +++ b/packages/docs/content/docs/de/git.mdx @@ -0,0 +1,41 @@ +--- +title: Git- & GitHub-Workflows +description: Änderungen vormerken, committen und Branches verwalten, ohne OpenChamber zu verlassen. +--- + +# Git- & GitHub-Workflows + +OpenChamber hat eine integrierte Git-Ansicht, damit du Änderungen prüfen, committen und Branches verwalten kannst, ohne in ein Terminal zu wechseln. Öffne sie über den **Git**-Tab in der rechten Seitenleiste. + +## Prüfen und committen + +Die Git-Ansicht teilt deine Änderungen in **staged** und **unstaged** auf: + +- klicke auf das **+** einer Datei, um sie zu stage'n, oder auf **−**, um sie wieder unstaged zu machen +- stage oder unstage ganze Gruppen auf einmal +- klicke auf eine Datei, um ihren Diff zu sehen + +Schreibe dann eine Commit-Nachricht und committe. Du kannst OpenChamber eine **Commit-Nachricht generieren** lassen, basierend auf deinen gestagten Änderungen — dabei wird das Modell der aktuellen Sitzung verwendet, also brauchst du eine geöffnete Sitzung. + +## Branches und Verlauf + +Die Git-Ansicht deckt auch den üblichen Rest von Git ab: + +- Branches erstellen, wechseln, umbenennen und löschen +- pushen, pullen und fetchen +- Verlauf und Diffs pro Commit durchsuchen +- Änderungen stashen und wiederherstellen + +## Pull Requests + +Verbinde GitHub (siehe [GitHub Issues & PRs](/github/)) und der **PR**-Tab lässt dich einen Pull Request öffnen, aktualisieren, als bereit markieren oder mergen — und seinen Titel und seine Beschreibung auf dieselbe Weise wie Commit-Nachrichten generieren. + +## Konflikte übernehmen + +Wenn ein Merge, Rebase oder Integrate auf einen Konflikt stößt, zeigt OpenChamber, was festhängt, und lässt dich es lösen — einschließlich der Übergabe an den Agenten. + +## Verwandt + +- [GitHub Issues & PRs](/github/) — GitHub verbinden und mit Issues mit der Arbeit beginnen +- [Worktree-Sitzungen](/worktrees/) — einen Branch in seinem eigenen Ordner isolieren +- [Git-Identitäten](/git-identities/) — als die richtige Person pro Repo committen diff --git a/packages/docs/content/docs/de/github.mdx b/packages/docs/content/docs/de/github.mdx new file mode 100644 index 00000000..e2de6f5a --- /dev/null +++ b/packages/docs/content/docs/de/github.mdx @@ -0,0 +1,34 @@ +--- +title: GitHub Issues & PRs +description: Verbinde GitHub und starte Sitzungen aus Issues und Pull Requests. +--- + +# GitHub Issues & PRs + +Verbinde dein GitHub-Konto und OpenChamber kann Issues und Pull Requests einlesen, direkt daraus eine Sitzung starten und PRs für dich öffnen oder aktualisieren. + +## GitHub verbinden + +1. Öffne **Einstellungen → Git**. +2. Wähle unter GitHub **Connect**. OpenChamber zeigt einen Link und einen kurzen Code an. +3. Öffne den Link, gib den Code ein und bestätige. + +Wenn die Verbindung steht, erscheint dein Konto im GitHub-Bereich. Du kannst mehr als ein Konto verbinden und zwischen ihnen wechseln oder dich jederzeit trennen. + +## Arbeit aus einem Issue oder PR starten + +Wenn du mit verbundenem GitHub eine [Worktree-Sitzung](/worktrees/) erstellst, kannst du **Start from GitHub issue/PR** wählen: + +- wähle ein **issue** und OpenChamber benennt den Branch danach und öffnet die Sitzung mit dem Issue und seinen Kommentaren als erster Nachricht +- wähle einen **pull request** und OpenChamber checkt den Branch des PR aus; du kannst den Diff des PR einbeziehen, damit der Agent die komplette Änderung hat + +So landest du direkt in einer Sitzung, in der der Kontext bereits geladen ist. + +## Pull Requests öffnen und verwalten + +Im **PR**-Tab der [Git-Ansicht](/git/) kannst du einen Pull Request erstellen, aktualisieren, einen Entwurf als bereit markieren oder mergen. OpenChamber kann den PR-Titel und die Beschreibung aus deinen Änderungen generieren. + +## Verwandt + +- [Git- & GitHub-Workflows](/git/) — committen und Branches verwalten +- [Worktree-Sitzungen](/worktrees/) — dort starten Issue- und PR-Sitzungen diff --git a/packages/docs/content/docs/de/index.mdx b/packages/docs/content/docs/de/index.mdx new file mode 100644 index 00000000..617013ad --- /dev/null +++ b/packages/docs/content/docs/de/index.mdx @@ -0,0 +1,32 @@ +--- +title: OpenChamber-Dokumentation +description: Ein Einrichtungs- und Bedienhandbuch für OpenChamber für Web, Desktop und VS Code. +--- + +# OpenChamber-Dokumentation + +OpenChamber ist der visuelle Arbeitsbereich rund um OpenCode (den KI-Coding-Agenten, der in deinem Terminal läuft). Er gibt dir einen Bildschirm, auf dem du diese Arbeit beobachten und steuern kannst, statt nur auf der Befehlszeile zu arbeiten. + +Nutze diese Doku, um: + +- die richtige App für deine Arbeitsweise zu installieren +- OpenChamber für den sicheren Remote-Einsatz zu öffnen +- das Aussehen anzupassen und häufige Probleme zu beheben + +## Lies zuerst das hier + +- [Install](/install/) +- [Quickstart](/quickstart/) +- [Tunnels](/tunnels/) +- [Troubleshooting](/troubleshooting/) + +## Entdecken + +- [Projects](/projects/) und [Worktree Sessions](/worktrees/) — deine Arbeit organisieren und isolieren +- [Providers, Models & Agents](/providers/) — OpenCode verbinden und ein Modell wählen +- [Git & GitHub Workflows](/git/) — commits erstellen, prüfen und PRs öffnen +- [Security](/security/) und [Tunnels](/tunnels/) — deine Instanz schützen und erreichen + +## Wofür OpenChamber gedacht ist + +OpenChamber ist für die Teile des KI-Codings gedacht, die von einer Leitstelle profitieren: verzweigende Sessions, Diffs prüfen, Terminals verwalten, den Fortschritt von Tools beobachten, Projektaktionen ausführen und das gesamte Board sichtbar halten, während der Agent arbeitet. diff --git a/packages/docs/content/docs/de/install.mdx b/packages/docs/content/docs/de/install.mdx new file mode 100644 index 00000000..097ce2a0 --- /dev/null +++ b/packages/docs/content/docs/de/install.mdx @@ -0,0 +1,33 @@ +--- +title: Installieren +description: Installiere OpenChamber für Desktop, Web oder VS Code. +--- + +# Installieren + +Es gibt drei Möglichkeiten, OpenChamber auszuführen: + +- Desktop-App für macOS +- Web-App, die vom CLI gehostet wird und die du wie eine Handy-App installieren kannst (eine PWA) +- VS-Code-Erweiterung + +## Voraussetzung + +Installiere zuerst [OpenCode](https://opencode.ai) — OpenChamber läuft darauf auf. + +## Web + PWA + +```bash +curl -fsSL https://raw.githubusercontent.com/openchamber/openchamber/main/scripts/install.sh | bash +openchamber --ui-password be-creative-here +``` + +Öffne die URL, die das CLI ausgibt (normalerweise `http://localhost:3000`). Du solltest die OpenChamber-Session-Liste sehen. Damit du sie griffbereit hast, kannst du im Adressfeld deines Browsers über die Option „Installieren“ daraus eine App machen. + +## Desktop + +Lade den aktuellen Desktop-Build von der GitHub-Releases-Seite oder der OpenChamber-Downloadseite herunter. Öffne ihn und melde dich in deinem gewohnten OpenCode-Workflow an. + +## VS Code + +Installiere sie aus dem VS Code Marketplace und melde dich in deinem gewohnten OpenCode-Workflow an. Die OpenChamber-Ansicht öffnet sich dann in der Seitenleiste. diff --git a/packages/docs/content/docs/de/magic-prompts.mdx b/packages/docs/content/docs/de/magic-prompts.mdx new file mode 100644 index 00000000..d6dd2c68 --- /dev/null +++ b/packages/docs/content/docs/de/magic-prompts.mdx @@ -0,0 +1,26 @@ +--- +title: Magische Prompts +description: Passe die eingebauten Prompts an, die hinter OpenChambers automatisierten Abläufen stehen. +--- + +# Magische Prompts + +OpenChamber verwendet im Hintergrund eingebaute Prompts, wenn etwas automatisch geschieht — eine Commit-Nachricht schreiben, einen PR entwerfen, ein Issue prüfen, einen Konflikt lösen oder eine Sitzung zusammenfassen. Hier kannst du diese Prompts ansehen und umschreiben. Öffne die Seite unter **Einstellungen → Magische Prompts**. + +Für die normale Nutzung brauchst du diese Seite nicht. Nutze sie, wenn ein Ablauf sich anders verhalten soll — etwa bei Commit-Nachrichten in einem bestimmten Stil. + +## Einen Prompt bearbeiten + +1. Öffne **Einstellungen → Magische Prompts**. +2. Wähle einen Prompt aus den Gruppen in der Seitenleiste — Git, GitHub, Planung und Sitzung. +3. Bearbeite den Text und speichere ihn. + +Einige Prompts haben einen sichtbaren Teil (die Nachricht, die du sehen würdest) und einen Anweisungsteil (versteckte Hinweise für den Agenten). Prompts können `{{placeholders}}` enthalten, die OpenChamber einsetzt, zum Beispiel den Diff oder den Issue-Titel — lass diese unverändert. + +## Zurücksetzen + +Anders entschieden? Jeder Prompt hat **Auf Standard zurücksetzen**, und es gibt **Alle zurücksetzen**, wenn du überall neu anfangen möchtest. + +## Weiterführend + +- [Git- & GitHub-Workflows](/git/) — viele dieser Prompts treiben die Git-Abläufe an diff --git a/packages/docs/content/docs/de/mcp.mdx b/packages/docs/content/docs/de/mcp.mdx new file mode 100644 index 00000000..24841978 --- /dev/null +++ b/packages/docs/content/docs/de/mcp.mdx @@ -0,0 +1,30 @@ +--- +title: MCP-Server +description: Füge MCP-Server hinzu, damit Agents zusätzliche Werkzeuge erhalten. +--- + +# MCP-Server + +Ein MCP-Server gibt deinen Agents zusätzliche Werkzeuge — etwa um eine Datenbank zu durchsuchen, eine API aufzurufen oder einen genutzten Dienst auszulesen. Du fügst sie unter **Einstellungen → MCP** hinzu. + +## Einen Server hinzufügen + +1. Öffne **Einstellungen → MCP**. +2. Füge einen Server hinzu und wähle seinen Typ: + - **lokal** — OpenChamber führt einen Befehl auf deinem Rechner aus. Du gibst den auszuführenden Befehl an und, falls nötig, Umgebungsvariablen. + - **entfernt** — OpenChamber verbindet sich mit einer URL, die jemand anderes hostet. Du gibst die URL und alle nötigen Header an (zum Beispiel ein Auth-Token). +3. Speichere. Der Server ist standardmäßig eingeschaltet; du kannst ihn deaktivieren, ohne ihn zu löschen. + +## Wo es gilt + +Wähle den Geltungsbereich, wenn du einen Server hinzufügst: + +- **persönlich** — in jedem Projekt verfügbar +- **projektbezogen** — nur im aktuellen Projekt verfügbar und zusammen mit den übrigen Projekteinstellungen gespeichert + +Servernamen verwenden Kleinbuchstaben, Ziffern, Bindestriche und Unterstriche. + +## Weiterführend + +- [Provider, Modelle & Agents](/providers/) — verbinde zuerst ein Modell +- [Skills](/skills/) — eine weitere Möglichkeit, die Fähigkeiten von Agents zu erweitern diff --git a/packages/docs/content/docs/de/mobile.mdx b/packages/docs/content/docs/de/mobile.mdx new file mode 100644 index 00000000..b0f9ed2e --- /dev/null +++ b/packages/docs/content/docs/de/mobile.mdx @@ -0,0 +1,43 @@ +--- +title: Mobile Apps & PWA +description: Installiere die OpenChamber-App auf iOS oder Android und verbinde sie mit deinem Server. +--- + +# Mobile Apps & PWA + +OpenChamber hat native Apps für iPhone und Android, damit du Sitzungen verfolgen, auf Agenten antworten und Arbeiten von deinem Telefon aus verwalten kannst — zu Hause über WLAN oder von überall über das [Private Relay](/private-relay/). + +## App installieren + +- **iPhone/iPad** — tritt der [TestFlight-Beta](https://testflight.apple.com/join/5ek6GU1E) bei +- **Android** — lade das APK aus dem [latest release](https://github.com/openchamber/openchamber/releases/latest) herunter + +## Mit deinem Server verbinden + +1. Öffne auf dem Computer mit OpenChamber **Settings → Remote Instances → Connect to this server** und drücke **Add a device**. +2. Wähle **Anywhere** (oder **Home network only**, wenn du das Telefon nur zu Hause nutzt) und drücke **Create QR code**. +3. Tippe in der Mobile App auf **Scan QR code** und halte die Kamera darauf. + +Die App verbindet sich und merkt sich den Server. Der QR-Code ist nur einmal verwendbar, und jedes Gerät erhält sein eigenes, widerrufbares Token — siehe [Connect a Device](/connect-devices/) für die sichere Kopplung. + +Du kannst die App mit mehreren Servern koppeln und im Instanzenbereich zwischen ihnen wechseln; die App zeigt bei jedem an, ob er erreichbar ist und ob du über das lokale Netzwerk oder das Relay verbunden bist. + +## PWA (Browser-Installation) + +Du willst gar keinen App-Store? Die Web-App lässt sich direkt aus dem Browser installieren: + +- **desktop browser** — nutze die Option **Install** in der Adressleiste +- **iPhone/iPad (Safari)** — Teilen → **Add to Home Screen** +- **Android (Chrome)** — Menü → **Install app** / **Add to Home Screen** + +Um die PWA von außerhalb deines Netzwerks zu erreichen, brauchst du einen [Tunnel](/tunnels/) und ein starkes [UI password](/security/) — die nativen Apps übernehmen das für dich über das Relay. + +## Mobile Einstellungen + +Unter **Settings → OpenChamber** passen ein paar Optionen die mobile und installierte Nutzung an — der Installationsname der App, die Bildschirmausrichtung und das Verhalten der Bildschirmtastatur. + +## Verwandt + +- [Connect a Device](/connect-devices/) — Kopplung, einmalige QR-Codes und Geräteverwaltung +- [Private Relay](/private-relay/) — wie "Anywhere"-Zugriff funktioniert +- [Security](/security/) — die UI schützen, bevor du sie freigibst diff --git a/packages/docs/content/docs/de/multi-run.mdx b/packages/docs/content/docs/de/multi-run.mdx new file mode 100644 index 00000000..197a1210 --- /dev/null +++ b/packages/docs/content/docs/de/multi-run.mdx @@ -0,0 +1,34 @@ +--- +title: Multi-run +description: Führe dieselbe Aufforderung gleichzeitig über mehrere Modelle oder Sitzungen aus. +--- + +# Multi-run + +Multi-run startet mehrere Sitzungen aus einem einzigen Formular — praktisch, um dieselbe Aufgabe mit verschiedenen Modellen zu testen und die Ergebnisse zu vergleichen. Öffne es über die Schaltfläche oben in der Sitzungs-Seitenleiste. + +## Einen Multi-run starten + +1. Öffne den Multi-run-Startbildschirm. +2. Wähle das Projekt und benenne die Run-Gruppe. +3. Schreibe die Aufforderung und wähle die Modelle aus, mit denen sie ausgeführt werden soll (bis zu fünf pro Gruppe). +4. Entscheide, ob du **Runs isolieren** möchtest. +5. Starte. + +Jedes Modell erhält seine eigene Sitzung, und alle beginnen mit deiner Aufforderung. + +## Isolierte Runs + +Aktiviere **Runs isolieren**, damit jeder Run seinen eigenen [Worktree](/worktrees/) und Branch bekommt und sie sich nie dieselben Dateien teilen. Dafür brauchst du ein Git-Repo — für Ordner, die keines sind, wird es automatisch deaktiviert. Wähle den Branch, von dem die Runs starten. + +Ohne Isolation ist jeder Run einfach eine normale Sitzung im Projektordner. + +## Ergebnisse vergleichen + +Jeder Run ist eine normale Sitzung, die du öffnen, lesen und behalten oder verwerfen kannst. Wenn du Runs gestartet hast, um Ansätze zu vergleichen, prüfe sie nebeneinander und nimm den besten mit. + +Wenn ein einzelner Run nicht startet, werden die anderen trotzdem ausgeführt — du siehst dann nur weniger Sitzungen, als du angefordert hast. + +## Verwandt + +- [Worktree-Sitzungen](/worktrees/) — wie Isolation unter der Haube funktioniert diff --git a/packages/docs/content/docs/de/notes-todos-plans.mdx b/packages/docs/content/docs/de/notes-todos-plans.mdx new file mode 100644 index 00000000..3a196aee --- /dev/null +++ b/packages/docs/content/docs/de/notes-todos-plans.mdx @@ -0,0 +1,37 @@ +--- +title: Projektnotizen, Todos & Pläne +description: Halte Notizen, eine Todo-Liste und gespeicherte Pläne für jedes Projekt fest. +--- + +# Projektnotizen, Todos & Pläne + +Jedes Projekt hat seinen eigenen Arbeitsbereich für Notizen, eine Todo-Liste und gespeicherte Pläne. Sie gehören zum Projekt und nicht zu einer einzelnen Session, also bleiben sie erhalten, wenn du zwischen Sessions wechselst. Du findest sie im Tab **Kontext** der rechten Seitenleiste (auf Mobilgeräten ein eigener Tab). + +## Notizen + +Ein freies Notizfeld für alles, woran du dich zum Projekt erinnern möchtest. Es speichert automatisch, während du tippst. + +## Todos + +Eine einfache Checkliste. Füge Einträge hinzu, hake sie ab, ordne sie per Drag-and-drop um und lösche die erledigten. + +Jedes Todo hat ein Menü **Senden**, damit du es an den Agenten übergeben kannst: + +- an die aktuelle Session senden +- mit ihm eine neue Session starten +- mit ihm eine neue [Worktree-Session](/worktrees/) starten (nur wenn das Projekt ein Git-Repo ist) + +## Pläne + +Ein Ort, um längere Pläne als gespeicherte Dateien aufzubewahren. Du kannst: + +- einen Plan aus einer Markdown- oder Textdatei importieren +- einen Plan öffnen, um ihn im Seitenpanel zu lesen +- Pläne löschen, die du nicht mehr brauchst + +Du solltest danach wieder im Kontext-Tab landen — mit gespeicherter Notiz, abgehakter Todo oder gelistetem Plan; so erkennst du, dass es geklappt hat. + +## Verwandtes + +- [Worktree-Sessions](/worktrees/) — eine Todo in einem eigenen Branch ausführen +- [Projekte](/projects/) — diese gehören zum aktiven Projekt diff --git a/packages/docs/content/docs/de/notifications.mdx b/packages/docs/content/docs/de/notifications.mdx new file mode 100644 index 00000000..268779ce --- /dev/null +++ b/packages/docs/content/docs/de/notifications.mdx @@ -0,0 +1,34 @@ +--- +title: Benachrichtigungen +description: Lass dich benachrichtigen, wenn eine Sitzung deine Aufmerksamkeit braucht oder fertig ist. +--- + +# Benachrichtigungen + +Benachrichtigungen sagen dir, wenn etwas deine Aufmerksamkeit braucht, damit du nicht ständig auf den Bildschirm schauen musst — eine Sitzung ist fertig, hat einen Fehler, stellt eine Frage oder braucht eine Berechtigung für etwas. Du richtest sie unter **Einstellungen → OpenChamber → Benachrichtigungen** ein. + +## Aktivieren + +1. Öffne **Einstellungen → OpenChamber → Benachrichtigungen**. +2. Erlaube Benachrichtigungen, wenn dein Browser oder System dich danach fragt. +3. Wähle aus, worüber du informiert werden möchtest: + - eine Sitzung **endet** + - eine Sitzung **hat einen Fehler** + - eine Sitzung **stellt eine Frage** + - eine Sitzung braucht **eine Berechtigung** + - **Unteraufgaben** sind abgeschlossen + +## Wie sie bei dir ankommen + +- auf dem **Desktop** bekommst du native Systembenachrichtigungen +- in einem **Browser oder einer installierten App** bekommst du Web-Push-Benachrichtigungen, damit sie auch ankommen, wenn der Tab im Hintergrund ist + +Sitzungen, die auf automatisches Annehmen gesetzt sind, belästigen dich nicht mit Berechtigungsbenachrichtigungen. + +## Die Formulierungen anpassen + +Jede Art von Benachrichtigung hat einen Titel und eine Nachrichtenvorlage, die du bearbeiten kannst, mit Feldern wie Agentenname und Modell. Außerdem gibt es eine Begrenzung, wie viel der letzten Nachricht eingefügt wird, damit Benachrichtigungen kurz bleiben. + +## Weiterführend + +- [Sprachmodus](/voice/) — lass dir Antworten stattdessen vorlesen diff --git a/packages/docs/content/docs/de/opencode-server.mdx b/packages/docs/content/docs/de/opencode-server.mdx new file mode 100644 index 00000000..8ee05494 --- /dev/null +++ b/packages/docs/content/docs/de/opencode-server.mdx @@ -0,0 +1,97 @@ +--- +title: OpenCode-Server +description: Verbinde OpenChamber mit einem lokalen oder entfernten OpenCode-Server. +--- + +# OpenCode-Server + +OpenChamber läuft auf einem OpenCode-Server auf. Standardmäßig startet es einen für dich, sodass du nichts tun musst. Diese Seite brauchst du nur, wenn du OpenChamber auf einen Server zeigen lassen willst, den du bereits betreibst, oder den Server verwalten willst, den es startet. + +## Wie OpenChamber einen Server findet + +Wenn OpenChamber startet, sucht es in dieser Reihenfolge nach einem Server: + +1. einen Server wiederverwenden, den es bereits gestartet hat +2. zu einem externen verbinden, wenn du es so angegeben hast (siehe unten) +3. einen Server am Standard-Port automatisch erkennen (`4096`) +4. andernfalls den eigenen starten und verwalten + +Wenn nichts konfiguriert ist, geschieht Schritt 4 automatisch und du bist startklar. + +## Mit einem Server verbinden, den du bereits betreibst + +Setze diese Variablen, bevor du OpenChamber startest: + +```bash +OPENCODE_HOST=http://localhost:4096 OPENCODE_SKIP_START=true openchamber +``` + +- `OPENCODE_HOST` — die vollständige Adresse deines OpenCode-Servers einschließlich des Ports (ein Wert wie `http://localhost:4096`). Sie darf am Ende keinen Pfad haben. +- `OPENCODE_SKIP_START=true` — weist OpenChamber an, keinen eigenen Server zu starten. + +Wenn du nur den Port ändern musst, setze `OPENCODE_PORT` statt `OPENCODE_HOST`. + +Wenn `OPENCODE_HOST` keinen Port hat oder einen Pfad enthält, ignoriert OpenChamber ihn und fällt darauf zurück, den eigenen Server zu starten. Achte beim Start auf eine `[config]`-Warnung in den Logs, wenn eine erwartete Verbindung nicht zustande kam. + +## Den Server über das CLI verwalten + +```bash +openchamber status +openchamber logs +openchamber restart +openchamber stop +``` + +`openchamber` allein startet den Server im Hintergrund. Füge `--foreground` hinzu, damit er an dein Terminal gebunden bleibt. + +## OpenChamber beim Anmelden starten + +Verwende `startup enable`, um einen nativen Benutzerdienst zu installieren. OpenChamber nutzt `launchd` auf macOS, `systemd --user` auf Linux und den Taskplaner auf Windows. + +```bash +openchamber startup enable +openchamber startup status +openchamber startup disable +``` + +Um die UI zu schützen, setze das Passwort beim Aktivieren des Dienstes: + +```bash +OPENCHAMBER_UI_PASSWORD='secret' openchamber startup enable +``` + +Für einen headless Server, der sich beim Anmelden startet und für Desktop- oder Mobile-Clients gedacht ist, füge `--api-only` und einen erreichbaren Host hinzu: + +```bash +openchamber startup enable --port 3000 --api-only --host 0.0.0.0 --ui-password secret +``` + +`startup enable` speichert deine aktuelle Umgebung als Schnappschuss im Dienst, damit er sich eher so verhält, als würdest du `openchamber` aus derselben Shell starten. So bleiben Provider-Tokens, `PATH`, SSH-Agent-Einstellungen und andere CLI-Auth-/Konfigurationsvariablen verfügbar. Verwende `--no-env-snapshot`, wenn du eine minimale Dienstenumgebung willst. + +Der Startup-Dienst merkt sich `--port`, `--host`, `--ui-password` und `--api-only`. CLI-Neustarts und Update-Neustarts verwenden diese gespeicherten Einstellungen wieder. + +Um einen Verbindungslink für eine andere OpenChamber-App zu erstellen, verwende: + +```bash +openchamber connect-url --port 3000 --server http://your-host:3000 --qr +``` + +Führe `openchamber connect-url --help` aus, um alle Link-Optionen zu sehen, einschließlich `--name`, `--lan`, `--server`, `--api-only`, `--ui-password` und `--qr`. + +Du kannst Tunnel für diesen laufenden Dienst weiterhin unabhängig verwalten: + +```bash +openchamber tunnel start --port 3000 +openchamber tunnel stop --port 3000 +``` + +Das Stoppen des Tunnels startet weder den Dienst noch die App neu. + +## „OpenCode wird neu gestartet“ + +Während der Server startet oder neu startet, zeigt OpenChamber den Status „OpenCode wird neu gestartet“ an und pausiert Anfragen, bis er bereit ist. Das ist direkt nach dem Start oder einem Neustart normal. Wenn er nie verschwindet, siehe [OpenCode-Verbindung](/troubleshooting/opencode-connection/). + +## Verwandtes + +- [Providers, Models & Agents](/providers/) — festlegen, womit der Server spricht +- [OpenCode-Verbindung](/troubleshooting/opencode-connection/) — falls keine Verbindung möglich ist diff --git a/packages/docs/content/docs/de/preview.mdx b/packages/docs/content/docs/de/preview.mdx new file mode 100644 index 00000000..555f5023 --- /dev/null +++ b/packages/docs/content/docs/de/preview.mdx @@ -0,0 +1,32 @@ +--- +title: Vorschau & Entwicklungsserver +description: Öffne einen laufenden Entwicklungsserver direkt in OpenChamber. +--- + +# Vorschau & Entwicklungsserver + +Wenn du einen Entwicklungsserver startest, kann OpenChamber ihn direkt in der App öffnen statt in einem separaten Browser-Tab — so kannst du deine Seite neben dem Chat sehen, ihre Konsole aufzeichnen und Elemente anstupsen, um Fragen dazu zu stellen. + +## Eine Vorschau öffnen + +OpenChamber überwacht die Terminalausgabe auf eine lokale Adresse (die `Local:`-Zeile, die Werkzeuge wie Vite, Next.js oder Astro ausgeben). Sobald es eine findet: + +- erscheint im Terminal eine Schaltfläche **Open preview** +- öffnet eine [Projektaktion](/project-actions/) mit aktiviertem Auto-Open die Vorschau für dich +- kann auch ein lokaler Link in einer Chatnachricht sie öffnen + +Die Seite lädt im Seitenbereich. Nur lokale Adressen (auf deinem eigenen Rechner) können als Vorschau geöffnet werden. + +## Konsole und Inspektion + +Im Vorschau-Bereich kannst du: + +- die **Konsole** der Seite beobachten — Fehler, Warnungen und Protokolle, so gefiltert, wie du möchtest +- **inspect** einschalten, auf ein beliebiges Element klicken und eine Notiz dazu senden — Selektor, Stile, Position und ein Screenshot — direkt in den Chat + +Das ist der schnellste Weg, dem Agenten "diese Schaltfläche hier" zu sagen, ohne sie beschreiben zu müssen. + +## Verwandt + +- [Projektaktionen](/project-actions/) — einen Server automatisch öffnen, wenn du ihn startest +- [Desktop-Browser](/desktop-browser/) — dieselben Werkzeuge für jede Seite, auf dem Desktop diff --git a/packages/docs/content/docs/de/private-relay.mdx b/packages/docs/content/docs/de/private-relay.mdx new file mode 100644 index 00000000..e14ad627 --- /dev/null +++ b/packages/docs/content/docs/de/private-relay.mdx @@ -0,0 +1,44 @@ +--- +title: Privates Relay +description: Erreiche deinen OpenChamber-Server von überall über ein Ende-zu-Ende-verschlüsseltes Relay — ohne Ports, ohne Tunnel, ohne Einrichtung. +--- + +# Privates Relay + +Das OpenChamber Private Relay ermöglicht es deinen gekoppelten Geräten, deinen Server von überall aus zu erreichen — im Mobilfunknetz, im Café, in einer anderen Stadt — ohne Ports zu öffnen, einen Tunnel einzurichten oder deinen Rechner direkt mit dem Internet zu verbinden. Die Einrichtung ist selbstständig: Ein Gerät mit **Anywhere** unter [Connect a Device](/connect-devices/) zu koppeln reicht aus. + +## So funktioniert es + +Dein Server baut eine ausgehende Verbindung zur Relay-Infrastruktur von OpenChamber auf und hält sie offen. Wenn eines deiner Geräte außerhalb deines Netzwerks ist, verbindet es sich ebenfalls mit dem Relay, und das Relay leitet die verschlüsselten Daten zwischen beiden weiter. Auf deinem Rechner lauscht nichts auf eingehende Verbindungen aus dem Internet. + +Wenn eine direkte Verbindung verfügbar ist — du bist wieder zu Hause im selben WLAN — bevorzugen deine Geräte sie und umgehen das Relay vollständig. + +## Was das Relay sehen kann und was nicht + +Das Relay ist ein blinder Kurier, kein Vermittler: + +- **Ende-zu-Ende verschlüsselt.** Dein Gerät und dein Server handeln Verschlüsselungsschlüssel direkt miteinander aus. Das Relay leitet nur versiegelte Daten weiter, für die es keine Schlüssel hat — es kann weder deinen Code noch deine Prompts oder Passwörter lesen. +- **Nur deine Geräte können sich verbinden.** Ein Gerät muss ein Token besitzen, das über [one-time pairing](/connect-devices/) von *deinem* Server ausgestellt wurde. Niemand kann deinen Server über das Relay entdecken oder ohne ein von dir erstelltes Token darauf zugreifen — und du kannst jedes Token jederzeit widerrufen. +- **Pairing-Links sind nur einmal verwendbar.** Ein QR-Code zum Koppeln funktioniert genau einmal und läuft ab, wenn er nicht verwendet wird; ein geleakter alter Link ist also wertlos. +- **Nichts wird geteilt, bevor du es erlaubst.** Das Relay bleibt aus, bis du es aktivierst oder ein Gerät darüber koppelst, und du kannst es jederzeit deaktivieren — Geräte, die darüber verbunden sind, werden sofort getrennt. + +## Wann es läuft + +Das Relay verwaltet seinen Lebenszyklus selbst — es gibt keinen Schalter, den du dir merken musst: + +- **Es startet bei Bedarf.** Das Erstellen einer **Anywhere**-Kopplung schaltet das Relay ein, und es kommt nach einem Neustart zurück, solange noch ein gekoppeltes Gerät davon abhängt. +- **Es stoppt von selbst.** Sobald kein Gerät und keine ausstehende Kopplung das Relay mehr nutzt — zum Beispiel nachdem du das letzte Relay-gekoppelte Gerät widerrufen hast — fährt es automatisch herunter. + +**Settings → Remote Instances → OpenChamber Relay** zeigt den Live-Status (Connected, Reconnecting, …) und wie viele Geräte gerade darüber verbunden sind. Dort kannst du auch **Disable** drücken, um den Relay-Zugriff sofort zu beenden; Geräte im lokalen Netzwerk sind davon nicht betroffen. + +## Relay oder ein Tunnel? + +- Nutze das **Relay**, um von deinen eigenen gekoppelten Geräten aus deinen eigenen Server zu erreichen. Es kommt ohne Einrichtung aus, und nichts ist öffentlich exponiert. +- Nutze einen [Tunnel](/tunnels/), wenn du eine einfache **öffentliche URL** brauchst — zum Beispiel um OpenChamber in einem normalen Browser auf einem Rechner zu öffnen, den du nicht koppeln kannst, oder um Zugriff hinter einem [UI password](/security/) zu teilen. + +## Verwandt + +- [Connect a Device](/connect-devices/) — ein Gerät mit einem einmaligen QR-Code koppeln +- [Mobile Apps](/mobile/) — die iOS- oder Android-App installieren +- [Security](/security/) — Passwörter, Passkeys und Grundlagen der Freigabe +- [Remote access](/troubleshooting/remote-access/) — wenn eine Verbindung nicht zustande kommt diff --git a/packages/docs/content/docs/de/project-actions.mdx b/packages/docs/content/docs/de/project-actions.mdx new file mode 100644 index 00000000..a0ef9b78 --- /dev/null +++ b/packages/docs/content/docs/de/project-actions.mdx @@ -0,0 +1,28 @@ +--- +title: Projektaktionen +description: Speichere Befehle, die du oft ausführst, und starte sie mit einem Klick. +--- + +# Projektaktionen + +Eine Projektaktion ist ein Shell-Befehl, den du einmal speicherst und dann mit einem Klick ausführst — dein Entwicklungsserver, ein Build, ein Testlauf. Jedes Projekt hat seine eigene Liste. Richte sie unter **Einstellungen → Projekte → Projektaktionen** ein. + +## Eine Aktion hinzufügen + +1. Öffne **Einstellungen → Projekte** und suche den Bereich **Projektaktionen**. +2. Füge eine Aktion hinzu, gib ihr einen Namen, wähle ein Symbol und gib den auszuführenden Befehl ein. +3. Speichern. + +Du kannst eine Aktion auf bestimmte Betriebssysteme beschränken, wenn ein Befehl nur auf einem davon sinnvoll ist. + +## Eine Aktion ausführen + +Aktionen liegen in einem Menü im App-Header. Klicke auf eine und OpenChamber führt sie in einem Terminal in deinem Projektordner aus und wechselt dich in die Terminalansicht, damit du die Ausgabe verfolgen kannst. Stoppe sie über dasselbe Menü. + +## Einen Entwicklungsserver automatisch öffnen + +Aktiviere **auto-open URL** für eine Aktion, die einen Server startet. OpenChamber überwacht die Ausgabe auf eine lokale Adresse und bietet an, sie zu öffnen — siehe [Vorschau & Entwicklungsserver](/preview/). Auf dem Desktop kannst du sie außerdem über einen SSH-Port-Forward leiten. + +## Verwandt + +- [Vorschau & Entwicklungsserver](/preview/) — einen laufenden Entwicklungsserver in OpenChamber öffnen diff --git a/packages/docs/content/docs/de/project-icons.mdx b/packages/docs/content/docs/de/project-icons.mdx new file mode 100644 index 00000000..3e0775ec --- /dev/null +++ b/packages/docs/content/docs/de/project-icons.mdx @@ -0,0 +1,20 @@ +--- +title: Projektsymbole +description: Geben Sie jedem Projekt ein wiedererkennbares Symbol. +--- + +# Projektsymbole + +Ein Projektsymbol macht es leicht, Ihre Projekte auf einen Blick zu unterscheiden. OpenChamber versucht, eines für Sie zu finden, und Sie können jederzeit Ihr eigenes setzen. Verwalten Sie es unter **Einstellungen → Projekte**. + +## Automatische Erkennung + +Wenn Sie ein Projekt hinzufügen, sucht OpenChamber darin nach einer `favicon`-Datei und verwendet sie als Symbol des Projekts. Wenn Ihr Repo bereits ein Favicon ausliefert, erscheint das Symbol meist einfach — Sie müssen nichts tun. + +## Eigenes festlegen + +Öffnen Sie **Einstellungen → Projekte** und laden Sie ein Bild hoch (PNG, JPEG oder SVG, bis zu 5 MB). Ein benutzerdefiniertes Bild hat Vorrang vor dem automatisch erkannten. Sie können stattdessen auch eine Farbe wählen oder das Bild entfernen, um zur Erkennung zurückzukehren. + +## Verwandt + +- [Projekte](/projects/) — Ihre Projekte benennen, einfärben und organisieren diff --git a/packages/docs/content/docs/de/projects.mdx b/packages/docs/content/docs/de/projects.mdx new file mode 100644 index 00000000..8baf4c22 --- /dev/null +++ b/packages/docs/content/docs/de/projects.mdx @@ -0,0 +1,34 @@ +--- +title: Projekte +description: Organisiere deine Arbeit in Projekten und wechsle zwischen ihnen. +--- + +# Projekte + +Ein Projekt ist ein Ordner auf deinem Computer, den OpenChamber im Blick behält — normalerweise eine Codebasis. Wenn du das Projekt wechselst, wechselt der Ordner, in dem der Agent arbeitet, zusammen mit den Sessions und Einstellungen dieses Projekts. + +## Ein Projekt hinzufügen + +Du kannst ein Projekt an ein paar Stellen hinzufügen: + +- der Eintrag **Projekt hinzufügen** in der Befehlspalette +- die Schaltfläche **+** oben in der Session-Seitenleiste +- der Ordnerbrowser, wenn du ein Verzeichnis auswählst + +Zeige auf einen Ordner, und OpenChamber merkt ihn sich. Der Name kommt vom Ordner; du kannst ihn später ändern. + +## Projekte wechseln + +Wähle ein Projekt in der Seitenleiste aus, um es aktiv zu machen. Alles — Sessions, Git, Notizen — folgt dem Projekt, das du geöffnet hast. + +## Ein Projekt wiedererkennbar machen + +Öffne **Einstellungen → Projekte**, um einem Projekt einen eigenen Namen, eine Farbe oder ein Symbol zu geben. OpenChamber versucht, automatisch ein Symbol zu finden — siehe [Projekt-Symbole](/project-icons/). + +> In VS Code verwendet OpenChamber immer den Ordner, den du geöffnet hast, als einziges Projekt. Es gibt dort also nichts hinzuzufügen oder umzuschalten. Die Seite mit den Projekteinstellungen ist dort ausgeblendet. + +## Verwandtes + +- [Projektnotizen, Todos & Pläne](/notes-todos-plans/) — Arbeitsnotizen pro Projekt behalten +- [Projektaktionen](/project-actions/) — Befehle speichern, die du oft ausführst +- [Kontext](/context/) — sehen, wie viel des Modellgedächtnisses eine Session verbraucht diff --git a/packages/docs/content/docs/de/providers.mdx b/packages/docs/content/docs/de/providers.mdx new file mode 100644 index 00000000..4d5738f5 --- /dev/null +++ b/packages/docs/content/docs/de/providers.mdx @@ -0,0 +1,49 @@ +--- +title: Provider, Modelle & Agents +description: Verbinde KI-Provider, wähle Modelle aus und richte Agents ein. +--- + +# Provider, Modelle & Agents + +Bevor OpenChamber etwas tun kann, braucht es mindestens einen verbundenen KI-Provider. Diese Seite erklärt, wie du einen Provider verbindest, ein Modell auswählst und Agents anpasst. + +## Einen Provider verbinden + +1. Öffne **Einstellungen → Provider**. +2. Öffne das Menü **Provider hinzufügen** und wähle einen Provider aus, der noch nicht verbunden ist. +3. Melde dich auf eine von zwei Arten an, je nach Provider: + - **API-Schlüssel** — füge deinen Schlüssel ein und speichere. + - **Anmeldung (Gerätefluss)** — OpenChamber zeigt einen Link und einen kurzen Code an. Öffne den Link, gib den Code ein und bestätige. OpenChamber schließt die Verbindung dann selbstständig ab. + +Wenn ein Provider als verbunden angezeigt wird, sind seine Modelle im Chat verfügbar. + +Zum Trennen öffnest du den Provider und entfernst seine Anmeldung. + +## Ein Modell auswählen + +Du wählst das Modell dort aus, wo du arbeitest: + +- im Chat verwendest du den Modellwähler in der Nachrichtenleiste, um Provider und Modell für diese Sitzung festzulegen +- pro Agent legst du unten ein Standardmodell fest + +## Agents einrichten + +Ein Agent ist eine benannte Konfiguration — ein Modell, eine Persönlichkeit und das, was er tun darf. + +1. Öffne **Einstellungen → Agents**. +2. Wähle einen Agenten aus oder erstelle einen neuen. +3. Bearbeite beliebige dieser Felder: + - **Beschreibung** — wofür der Agent gedacht ist + - **Modell** — sein Standardmodell + - **Temperatur** — wie kreativ seine Antworten sind + - **Prompt** — dauerhafte Anweisungen, denen er immer folgt + - **Tool-Regeln** — welche Werkzeuge er verwenden darf + +## Wo deine Anmeldungen gespeichert werden + +Provider-Anmeldungen werden von OpenCode gespeichert, nicht von OpenChamber, daher sind sie mit der OpenCode-CLI geteilt. Wenn du denselben Provider an mehr als einem Ort einrichtest, gewinnt die spezifischste Einstellung: Eine projektbezogene Einstellung überschreibt deine persönliche. + +## Weiterführend + +- [MCP-Server](/mcp/) — füge Agents zusätzliche Werkzeuge hinzu +- [Nutzung & Kontingente](/usage/) — verfolge, wie viel du verbraucht hast diff --git a/packages/docs/content/docs/de/quickstart.mdx b/packages/docs/content/docs/de/quickstart.mdx new file mode 100644 index 00000000..5411db01 --- /dev/null +++ b/packages/docs/content/docs/de/quickstart.mdx @@ -0,0 +1,26 @@ +--- +title: Schnellstart +description: Starte OpenChamber schnell und wähle die richtige App für die Aufgabe. +--- + +# Schnellstart + +## Schnellster Weg + +1. Installiere [OpenCode](https://opencode.ai). +2. Installiere das OpenChamber-CLI (siehe [Installieren](/install/) für den Einzeilenbefehl). +3. Führe `openchamber --ui-password be-creative-here` aus. +4. Öffne die URL, die das CLI ausgibt (normalerweise `http://localhost:3000`). +5. Um es auf deinem Handy zu nutzen, starte einen [Tunnel](/tunnels/) und scanne den QR-Code. + +Du solltest die OpenChamber-Session-Liste in deinem Browser sehen. Wenn sie geladen wird, bist du startklar. + +Verwende ein starkes UI-Passwort, besonders wenn du die Instanz ins Internet öffnen willst. + +Wenn die Seite nicht lädt, sieh unter [Troubleshooting](/troubleshooting/) nach. + +## Welche App soll ich verwenden? + +- verwende **Desktop** für die tägliche Arbeit auf macOS +- verwende **Web** für den Remote-Zugriff und zum Prüfen vom Handy aus +- verwende **VS Code** für Sessions direkt neben deinem Code diff --git a/packages/docs/content/docs/de/remote-instances.mdx b/packages/docs/content/docs/de/remote-instances.mdx new file mode 100644 index 00000000..91bb8216 --- /dev/null +++ b/packages/docs/content/docs/de/remote-instances.mdx @@ -0,0 +1,48 @@ +--- +title: Remote-Instanzen +description: Verbinde die Desktop-App per SSH mit OpenChamber auf einem anderen Rechner. +--- + +# Remote-Instanzen + +Die Desktop-App kann per SSH mit OpenChamber auf einem anderen Rechner verbunden werden — einem Arbeitsserver, einer Cloud-Box, einem Homelab — und dessen UI so auf deinen Bildschirm bringen, als wäre sie lokal. Richte das unter **Settings → Remote Instances** ein. + +> Remote-Instanzen sind eine Funktion **nur für den Desktop**. Im Web oder in VS Code verbindest du dich stattdessen über die Umgebungsvariablen in [OpenCode Server](/opencode-server/) mit einem Remote-Server. + +## Remote-Instanz hinzufügen + +1. Öffne **Settings → Remote Instances** und füge eine hinzu. +2. Gib den SSH-Befehl an, den du normalerweise für den Zugriff auf den Rechner verwendest, plus einen Spitznamen. +3. Wähle, wie OpenChamber dort läuft: + - **managed** — OpenChamber installiert und startet sich auf dem entfernten Rechner selbst + - **external** — verbinde dich mit einer Instanz, die bereits läuft +4. Verbinde dich. + +OpenChamber geht die Schritte durch — Verbindung prüfen, Remote einrichten, Server starten und den Port weiterleiten — und zeigt bei jedem Schritt, wo es gerade ist. Wenn **ready** erreicht ist, wird die entfernte UI lokal geladen. + +## Anmeldedaten + +Du entscheidest, ob SSH- und UI-Passwörter gespeichert werden oder ob du sie jedes Mal eingibst. Wenn die Verbindung abbricht, meldet OpenChamber, welcher Schritt fehlgeschlagen ist, damit du ihn beheben kannst — siehe [Remote access](/troubleshooting/remote-access/). + +## Verbindungslinks + +Wenn auf einem entfernten Rechner bereits OpenChamber läuft, ist ein Kopplungslink der einfachste Weg, die Desktop-App zu verbinden. Öffne auf der UI des entfernten Servers **Settings → Remote Instances → Connect to this server → Add a device**, erstelle einen Link und importiere ihn auf deinem Desktop unter **Settings → Remote Instances → Other OpenChamber servers → Import Link**. Den vollständigen Ablauf findest du unter [Connect a Device](/connect-devices/). + +Ein mit **Anywhere** erstellter Link enthält sowohl eine direkte Adresse als auch eine Route über das [Private Relay](/private-relay/): Die Desktop-App verbindet sich direkt, wenn sie den Server erreichen kann (gleiches Netzwerk), und fällt auf das Ende-zu-Ende-verschlüsselte Relay zurück, wenn du unterwegs bist. Der Status neben jedem gespeicherten Server zeigt, welche Route gerade verwendet wird. + +Du kannst einen Link auch in einem Terminal auf dem entfernten Rechner erstellen: + +```bash +openchamber connect-url --port 3000 --server http://your-host:3000 --qr +``` + +`connect-url` startet den Server zuerst, wenn auf diesem Port nichts läuft. Füge `--api-only` für einen headless Server hinzu, `--lan`, um beim Starten an das LAN zu binden, `--ui-password`, um den Browserzugriff zu schützen, und `--name`, um die gespeicherte Verbindung zu benennen. Füge `--relay` für einen Link hinzu, der auch außerhalb des lokalen Netzwerks funktioniert: Das Gerät bevorzugt die direkte Verbindung, wenn sie erreichbar ist, und fällt auf das [Private Relay](/private-relay/) zurück — die Instanz startet das Relay selbstständig. + +Der erzeugte Link enthält ein Einmal-Geheimnis zum Koppeln. Nach dem Import besitzt das Gerät sein eigenes Client-Token — getrennt vom UI password des Browsers —, das Server-Neustarts überdauert, bis du es auf dem ausstellenden Server widerrufst. + +## Verwandt + +- [Connect a Device](/connect-devices/) — Kopplungslinks, QR-Codes und Geräteverwaltung +- [Private Relay](/private-relay/) — wie "Anywhere"-Verbindungen funktionieren +- [OpenCode Server](/opencode-server/) — eine Verbindung zu einem entfernten Server in Web oder VS Code herstellen +- [Remote access](/troubleshooting/remote-access/) — wenn eine Verbindung nicht zustande kommt diff --git a/packages/docs/content/docs/de/reverse-proxy.mdx b/packages/docs/content/docs/de/reverse-proxy.mdx new file mode 100644 index 00000000..40e4221b --- /dev/null +++ b/packages/docs/content/docs/de/reverse-proxy.mdx @@ -0,0 +1,347 @@ +--- +title: Reverse Proxy +description: Konfigurieren Sie OpenChamber korrekt hinter Nginx, Nginx Proxy Manager oder einem anderen Reverse Proxy. +--- + +# Reverse Proxy + +Nutzen Sie diese Seite, wenn OpenChamber hinter Nginx, Nginx Proxy Manager, Caddy, Cloudflare oder einem anderen Reverse Proxy läuft. + +## Bevor Sie es proxyen + +1. Bestätigen Sie zuerst, dass OpenChamber direkt funktioniert. +2. Öffnen Sie `http://:3000` oder Ihren benutzerdefinierten Port aus demselben Netzwerk. +3. Fügen Sie den Reverse Proxy erst hinzu, wenn die Direktverbindung funktioniert. + +## Was der Proxy unterstützen muss + +- WebSockets für den Live-Nachrichtenverkehr: + - `/api/event/ws` + - `/api/global/event/ws` + - `/api/terminal/ws` +- SSE ohne Buffering: + - `/api/event` + - `/api/global/event` + - `/api/notifications/stream` + - `/api/openchamber/events` + - `/api/terminal/:sessionId/stream` +- Große Request-Bodies für Anhänge und Dateioperationen +- Lange Read-Timeouts für Live-Streams und Terminal-Sitzungen + +## Wichtige Regeln + +- Aktivieren Sie das Proxying für WebSockets. +- Deaktivieren Sie Buffering auf SSE-Routen. +- Deaktivieren Sie gzip auf dem Proxy, wenn OpenChamber Antworten bereits komprimiert. +- Halten Sie Komprimierung nur in einer Ebene aktiv. +- Leiten Sie normale Proxy-Header wie `Host`, `X-Forwarded-For` und `X-Forwarded-Proto` weiter. +- Erhöhen Sie die Body-Größenlimits, wenn Nutzer Dateien hochladen. + +## Kurze Checkliste + +- OpenChamber direkt im LAN erreichbar +- WebSockets im Proxy aktiviert +- SSE-Routen ohne Buffering +- `gzip off` auf dem Proxy-Host oder Komprimierung anderweitig deaktiviert +- `client_max_body_size` groß genug für Anhänge +- `proxy_read_timeout` lang genug für Streams + +## Beispiel: Nginx + +
+Beispielkonfiguration anzeigen + +```nginx +client_max_body_size 50M; +client_body_buffer_size 50M; +proxy_request_buffering off; + +proxy_http_version 1.1; +proxy_set_header Connection ""; +proxy_set_header Host $host; +proxy_set_header X-Real-IP $remote_addr; +proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; +proxy_set_header X-Forwarded-Proto $scheme; +proxy_set_header X-Forwarded-Host $host; + +gzip off; + +location = /api/terminal/ws { + proxy_pass http://127.0.0.1:3000; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection "upgrade"; + proxy_buffering off; + proxy_cache off; + proxy_read_timeout 3600s; + proxy_send_timeout 3600s; +} + +location = /api/global/event/ws { + proxy_pass http://127.0.0.1:3000; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection "upgrade"; + proxy_buffering off; + proxy_cache off; + proxy_read_timeout 3600s; + proxy_send_timeout 3600s; +} + +location = /api/event/ws { + proxy_pass http://127.0.0.1:3000; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection "upgrade"; + proxy_buffering off; + proxy_cache off; + proxy_read_timeout 3600s; + proxy_send_timeout 3600s; +} + +location ~ ^/api/(event|global/event|notifications/stream|openchamber/events)$ { + proxy_pass http://127.0.0.1:3000; + proxy_set_header Accept "text/event-stream"; + proxy_set_header Cache-Control "no-cache"; + proxy_buffering off; + proxy_cache off; + gzip off; + add_header X-Accel-Buffering "no" always; + add_header Cache-Control "no-cache, no-transform" always; + proxy_read_timeout 3600s; + proxy_send_timeout 3600s; +} + +location ~ ^/api/terminal/.+/stream$ { + proxy_pass http://127.0.0.1:3000; + proxy_set_header Accept "text/event-stream"; + proxy_set_header Cache-Control "no-cache"; + proxy_buffering off; + proxy_cache off; + gzip off; + add_header X-Accel-Buffering "no" always; + add_header Cache-Control "no-cache, no-transform" always; + proxy_read_timeout 3600s; + proxy_send_timeout 3600s; +} + +location /api { + proxy_pass http://127.0.0.1:3000; + proxy_read_timeout 3600s; + proxy_send_timeout 3600s; +} + +location / { + proxy_pass http://127.0.0.1:3000; +} +``` + +
+ +## Beispiel: Nginx Proxy Manager + +
+Beispiel für den Tab „Advanced“ anzeigen + +```nginx +client_max_body_size 50M; +client_body_buffer_size 50M; +proxy_request_buffering off; + +proxy_http_version 1.1; +proxy_set_header Connection ""; +proxy_set_header Host $host; +proxy_set_header X-Real-IP $remote_addr; +proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; +proxy_set_header X-Forwarded-Proto $scheme; +proxy_set_header X-Forwarded-Host $host; + +gzip off; + +location = /api/terminal/ws { + proxy_pass http://127.0.0.1:3000; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection "upgrade"; + proxy_buffering off; + proxy_cache off; + proxy_read_timeout 3600s; + proxy_send_timeout 3600s; + proxy_connect_timeout 30s; +} + +location = /api/global/event/ws { + proxy_pass http://127.0.0.1:3000; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection "upgrade"; + proxy_buffering off; + proxy_cache off; + proxy_read_timeout 3600s; + proxy_send_timeout 3600s; + proxy_connect_timeout 30s; +} + +location = /api/event/ws { + proxy_pass http://127.0.0.1:3000; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection "upgrade"; + proxy_buffering off; + proxy_cache off; + proxy_read_timeout 3600s; + proxy_send_timeout 3600s; + proxy_connect_timeout 30s; +} + +location = /api/event { + proxy_pass http://127.0.0.1:3000; + proxy_set_header Accept "text/event-stream"; + proxy_set_header Cache-Control "no-cache"; + proxy_buffering off; + proxy_cache off; + gzip off; + add_header X-Accel-Buffering "no" always; + add_header Cache-Control "no-cache, no-transform" always; + proxy_read_timeout 3600s; + proxy_send_timeout 3600s; + proxy_connect_timeout 30s; +} + +location = /api/global/event { + proxy_pass http://127.0.0.1:3000; + proxy_set_header Accept "text/event-stream"; + proxy_set_header Cache-Control "no-cache"; + proxy_buffering off; + proxy_cache off; + gzip off; + add_header X-Accel-Buffering "no" always; + add_header Cache-Control "no-cache, no-transform" always; + proxy_read_timeout 3600s; + proxy_send_timeout 3600s; + proxy_connect_timeout 30s; +} + +location = /api/notifications/stream { + proxy_pass http://127.0.0.1:3000; + proxy_set_header Accept "text/event-stream"; + proxy_set_header Cache-Control "no-cache"; + proxy_buffering off; + proxy_cache off; + gzip off; + add_header X-Accel-Buffering "no" always; + add_header Cache-Control "no-cache, no-transform" always; + proxy_read_timeout 3600s; + proxy_send_timeout 3600s; + proxy_connect_timeout 30s; +} + +location = /api/openchamber/events { + proxy_pass http://127.0.0.1:3000; + proxy_set_header Accept "text/event-stream"; + proxy_set_header Cache-Control "no-cache"; + proxy_buffering off; + proxy_cache off; + gzip off; + add_header X-Accel-Buffering "no" always; + add_header Cache-Control "no-cache, no-transform" always; + proxy_read_timeout 3600s; + proxy_send_timeout 3600s; + proxy_connect_timeout 30s; +} + +location ~ ^/api/terminal/.+/stream$ { + proxy_pass http://127.0.0.1:3000; + proxy_set_header Accept "text/event-stream"; + proxy_set_header Cache-Control "no-cache"; + proxy_buffering off; + proxy_cache off; + gzip off; + add_header X-Accel-Buffering "no" always; + add_header Cache-Control "no-cache, no-transform" always; + proxy_read_timeout 3600s; + proxy_send_timeout 3600s; + proxy_connect_timeout 30s; +} + +location /api { + proxy_pass http://127.0.0.1:3000; + proxy_read_timeout 3600s; + proxy_send_timeout 3600s; + proxy_connect_timeout 30s; +} + +location / { + proxy_pass http://127.0.0.1:3000; +} +``` + +
+ +Aktivieren Sie für diesen Host außerdem `Websockets Support` in Nginx Proxy Manager. + +## Häufige Fehlersymptome + +### Seite lädt, aber das Senden von Nachrichten schlägt fehl + +- WebSockets sind im Proxy nicht aktiviert +- `/api/event/ws` oder `/api/global/event/ws` wird nicht korrekt weitergeleitet + +### Benachrichtigungen oder Live-Status werden nicht aktualisiert + +- eine der SSE-Routen wird gepuffert oder gecacht +- `X-Accel-Buffering "no"` fehlt + +### Datei-Uploads schlagen fehl + +- `client_max_body_size` ist zu klein + +### Alles funktioniert lokal, bricht aber nur hinter dem Proxy + +- der Proxy komprimiert und puffert Live-Verkehr +- dem Proxy fehlt WebSocket-Unterstützung + +## Beispiel: Caddy + +
+Beispielkonfiguration anzeigen + +```caddy +reverse_proxy 127.0.0.1:3000 { + # WebSocket-Unterstützung ist in Caddy automatisch vorhanden + + # SSE-Antworten sofort flushen + flush_interval -1 + + # Host- und Proxy-Header weiterreichen + header_up Host {host} + header_up X-Real-IP {remote_host} + header_up X-Forwarded-For {remote_host} + header_up X-Forwarded-Proto {scheme} + + # Timeouts für langlebige Streams erhöhen + transport http { + read_timeout 3600s + write_timeout 3600s + } +} +``` + +
+ +Caddy behandelt WebSocket-Upgrades automatisch — keine zusätzliche Konfiguration nötig. Die Direktive `flush_interval -1` sorgt dafür, dass SSE-Teilstücke ohne Buffering sofort weitergeleitet werden. + +## Warnung zu CDN und doppelter Komprimierung + +Wenn Sie ein CDN (wie Cloudflare) vor Ihren Reverse Proxy setzen, achten Sie auf doppelte Komprimierung: + +- OpenChamber komprimiert HTTP-Antworten mit gzip (Schwelle 1 KB). +- Cloudflare und andere CDNs komprimieren Antworten standardmäßig ebenfalls. +- Das kann zu doppelt komprimierten Antworten oder falschen `Content-Encoding`-Headern führen. + +Um das zu vermeiden, deaktivieren Sie die Komprimierung auf **einer** Ebene: + +- **Cloudflare:** Rules → Compression → deaktivieren (oder den Modus „Passthrough“ verwenden). +- **Nginx:** `gzip off` (oben in den Beispielen bereits gezeigt). +- **Caddy:** Caddy komprimiert standardmäßig nicht erneut, wenn der Upstream bereits komprimierte Inhalte sendet. + +SSE-Streaming-Routen sind von OpenChamber von der Komprimierung ausgeschlossen, das CDN kann sie aber trotzdem puffern. Prüfen Sie in der CDN-Dokumentation, wie sich Buffering auf SSE-Pfaden deaktivieren lässt. + +## Verwandt + +- [Tunnels](/tunnels/) +- [Fehlerbehebung](/troubleshooting/) diff --git a/packages/docs/content/docs/de/scheduled-tasks.mdx b/packages/docs/content/docs/de/scheduled-tasks.mdx new file mode 100644 index 00000000..ac80c229 --- /dev/null +++ b/packages/docs/content/docs/de/scheduled-tasks.mdx @@ -0,0 +1,35 @@ +--- +title: Geplante Aufgaben +description: Führe einen Prompt automatisch nach Zeitplan aus. +--- + +# Geplante Aufgaben + +Eine geplante Aufgabe führt für dich nach Zeitplan einen Prompt aus — zum Beispiel täglich „die Änderungen von gestern zusammenfassen“ oder wöchentlich eine Bereinigung. Wenn sie läuft, startet OpenChamber eine neue Session und sendet den Prompt selbst. Öffne den Scheduler über die Schaltfläche oben in der Session-Seitenleiste. + +## Eine Aufgabe erstellen + +1. Öffne den Dialog für geplante Aufgaben in der Session-Seitenleiste. +2. Füge eine Aufgabe hinzu und gib ihr einen Namen. +3. Wähle, wann sie läuft: + - **daily** — zu einer oder mehreren Zeiten pro Tag + - **weekly** — an ausgewählten Wochentagen und Uhrzeiten + - **once** — ein einzelnes Datum und eine einzelne Uhrzeit +4. Lege fest, was sie tut: den zu sendenden Prompt sowie Provider, Modell und Agent, die verwendet werden sollen. Der Prompt kann ein Slash-Befehl sein, zum Beispiel `/review`. +5. Speichern und sicherstellen, dass die Aufgabe aktiviert ist. + +Du kannst jede Aufgabe sofort mit **run now** ausführen, um zu prüfen, ob sie das tut, was du erwartest. + +Aktiviere **Run as goal**, damit der Lauf seinen Prompt bis zum Abschluss verfolgt, statt nach einer Antwort zu stoppen — siehe [Session Goals](/session-goals/). + +## Woran du Erfolg erkennst + +Nach einem Lauf zeigt die Aufgabe, wann sie zuletzt gelaufen ist, ob sie erfolgreich war und einen Link zur Session, die sie erstellt hat. Wenn ein Lauf fehlschlägt, wird dort auch der Fehler angezeigt. + +## Wichtig zu wissen + +Aufgaben werden nur ausgelöst, während der OpenChamber-Server läuft. Wenn du ihn schließt, sind geplante Läufe pausiert, bis er wieder online ist. + +## Verwandtes + +- [Commands & Snippets](/commands-snippets/) — einen Slash-Befehl als Prompt wiederverwenden diff --git a/packages/docs/content/docs/de/security.mdx b/packages/docs/content/docs/de/security.mdx new file mode 100644 index 00000000..e00bb7cd --- /dev/null +++ b/packages/docs/content/docs/de/security.mdx @@ -0,0 +1,44 @@ +--- +title: Sicherheit +description: Schützen Sie die UI mit einem Passwort und Passkeys, bevor Sie sie freigeben. +--- + +# Sicherheit + +OpenChamber gewährt Zugriff auf Ihren Rechner und Ihren Code. Sperren Sie es also ab, bevor jemand außer Ihnen darauf zugreifen kann. Diese Seite behandelt das UI-Passwort, Passkeys und was Sie wissen sollten, bevor Sie OpenChamber in ein Netzwerk exponieren. + +## UI-Passwort setzen + +Starten Sie OpenChamber mit einem Passwort, und die Browser-UI fragt danach: + +```bash +openchamber --ui-password be-creative-here +``` + +Sie können es auch über die Umgebungsvariable `OPENCHAMBER_UI_PASSWORD` setzen, statt es in die Befehlszeile zu schreiben. Nach der Anmeldung merkt sich OpenChamber das Gerät für eine Weile, damit Sie nicht jedes Mal gefragt werden. + +Setzen Sie immer ein Passwort, wenn die Instanz für andere erreichbar ist — besonders über einen [Tunnel](/tunnels/) oder das öffentliche Internet. + +## Passkeys + +Sobald ein Passwort gesetzt ist, können Sie Passkeys (Face ID, Touch ID, ein Sicherheitsschlüssel) für eine schnellere Anmeldung hinzufügen. Fügen Sie sie unter **Einstellungen → OpenChamber → Passkeys** hinzu. + +Passkeys sind an das aktuelle Passwort gebunden. Wenn Sie das Passwort ändern oder entfernen, werden gespeicherte Passkeys gelöscht und Sie fügen sie erneut hinzu. + +## Geräte-Tokens + +Geräte, die über [Ein Gerät verbinden](/connect-devices/) gekoppelt werden, authentifizieren sich mit eigenen gerätespezifischen Tokens, nicht mit dem UI-Passwort. Pairing-Links sind nur einmal nutzbar und laufen ab, wenn sie nicht verwendet werden; jedes gekoppelte Gerät wird unter **Einstellungen → Remote-Instanzen → Mit diesem Server verbinden** aufgeführt, wo Sie es jederzeit widerrufen können. Verbindungen von außerhalb laufen über das [Private Relay](/private-relay/), das Ende-zu-Ende verschlüsselt ist und Ihren Traffic nicht lesen kann. + +## Bevor Sie es freigeben + +- Standardmäßig lauscht OpenChamber nur auf Ihrem eigenen Rechner (`127.0.0.1`). Es braucht eine bewusste Änderung, um breiter zu lauschen, und Sie sollten vorher ein Passwort setzen. +- Für Ihre eigenen Geräte bevorzugen Sie [Pairing](/connect-devices/) mit dem [Private Relay](/private-relay/) — dabei wird überhaupt nichts öffentlich freigegeben. +- Wenn Sie eine öffentliche URL brauchen, verwenden Sie lieber einen [Tunnel](/tunnels/) oder ein privates Netzwerk (z. B. VPN), statt einen Port ins Internet zu öffnen. +- Wenn Sie OpenChamber hinter Ihrem eigenen HTTPS-Server betreiben, sehen Sie sich [Reverse Proxy](/reverse-proxy/) an. + +## Verwandt + +- [Ein Gerät verbinden](/connect-devices/) — einmaliges Pairing und gerätespezifische Tokens +- [Private Relay](/private-relay/) — Ende-zu-Ende-verschlüsselter Zugriff von überall +- [Tunnel](/tunnels/) — eine öffentliche URL freigeben, wenn Sie eine brauchen +- [Reverse Proxy](/reverse-proxy/) — OpenChamber hinter Ihrem eigenen Server betreiben diff --git a/packages/docs/content/docs/de/session-goals.mdx b/packages/docs/content/docs/de/session-goals.mdx new file mode 100644 index 00000000..3b7a2bf1 --- /dev/null +++ b/packages/docs/content/docs/de/session-goals.mdx @@ -0,0 +1,73 @@ +--- +title: Sitzungsziele +description: Verwandelt eine Aufforderung in ein Ziel, auf das der Agent automatisch hinarbeitet. +--- + +# Sitzungsziele + +Ein Ziel macht aus einer Aufforderung eine Ziellinie. Statt den Agenten nach jeder Antwort mit "continue" anzustupsen, legst du das Ziel einmal fest — und OpenChamber hält die Sitzung automatisch darauf ausgerichtet und prüft nach jedem Zug mit einem unabhängigen Prüfer den Fortschritt. Es läuft weiter, auch wenn du nicht da bist. + +## Ein Ziel starten + +1. Drücke in der Composer-Ansicht die Zielschaltfläche. Sie leuchtet auf — der Zielmodus ist aktiviert. +2. Gib deine Aufforderung ein und sende sie ab. Diese Nachricht wird zum Ziel des Vorhabens. + +Das funktioniert in einer bestehenden Sitzung ebenso wie in einem neuen Sitzungsentwurf: Zielmodus aktivieren, die erste Nachricht schreiben, senden — die neue Sitzung startet mit dem bereits aktiven Ziel. + +### Weitere Wege, ein Ziel zu starten + +- **Aus einer Antwort des Agenten**: Im Dialog "Start new session from this answer" aktiviere **Run as goal** — die Antwort wird als Aufgabe übergeben, die die neue Sitzung bis zum Abschluss ausführt (kombiniere das mit **Create worktree** für einen isolierten Lauf). +- **Aus einem Plan**: Wenn du einen gespeicherten Plan in einer neuen Sitzung oder einem Worktree umsetzt, aktiviere im Dialog **Run as goal**. Das Ziel übernimmt den Planinhalt als seine Aufgabe, sodass der Prüfer den Fortschritt am tatsächlichen Plan misst. +- **Nach Zeitplan**: Aktiviere bei einer [geplanten Aufgabe](/scheduled-tasks/) **Run as goal**, damit wiederkehrende Läufe ihre Aufforderung bis zum Abschluss verfolgen. + +## Eine eigenständige Zielbeschreibung schreiben + +Der Fortschrittsprüfer sieht nur deine Zielbeschreibung und die neueste Antwort des Agenten — nicht den Chatverlauf. Formuliere die Zielnachricht also so, dass auch jemand ohne Gesprächskontext versteht, wie der fertige Zustand aussieht. + +- Gut: "Füge Tests für das Exportmodul hinzu und sorge dafür, dass die gesamte Test-Suite besteht." +- Nicht so gut: "Beheb das" oder "Mach mit der Idee weiter." + +Für kleine nachgelagerte Rückfragen mit Kontext brauchst du kein Ziel — sende einfach eine normale Nachricht. + +## So funktioniert es + +Nachdem der Agent anhält und die Sitzung für einen Moment ruhig bleibt, macht OpenChamber Folgendes: + +1. Es bittet ein kleines, günstiges Modell, den letzten Zug gegen das Ziel zu prüfen: weitermachen, fertig oder festgefahren? +2. Wenn das Urteil "weitermachen" lautet, sendet es eine Fortsetzungsaufforderung und der Agent nimmt die Arbeit wieder auf. +3. Wenn das Ziel nachweislich erreicht ist, ist es abgeschlossen und du bekommst eine Benachrichtigung. +4. Wenn der Agent wirklich feststeckt (deine Eingabe braucht), wird das Ziel erst dann als blockiert gestoppt — aber nur nachdem der Prüfer das dreimal in Folge gesagt hat, damit ein einzelner Ausrutscher das Ziel nie beendet. + +Es gibt auch harte Sicherheitsstopps: ein optionales Token-Budget, eine Obergrenze für automatische Fortsetzungen und ein Stopp bei Fehlern in einem Zug. Wenn der Kontext der Sitzung mitten in der Arbeit komprimiert wird, geht das Ziel einfach weiter — in das Kontextfenster zu laufen ist ein Beweis dafür, dass die Arbeit noch nicht fertig war. + +### Stoppen und fortsetzen + +- Die **Stopp-Schaltfläche** bricht den laufenden Zug ab und pausiert das Ziel — dein ausdrückliches "stop" gewinnt immer gegen die Schleife. +- **Pause** in der Zielleiste macht aus der anderen Richtung dasselbe: Es pausiert das Ziel und stoppt den laufenden Zug. +- Während der Pause kannst du normal chatten — die Schleife bleibt dir aus dem Weg. +- **Resume** aktiviert die Schleife neu: Bei einer ruhenden Sitzung geht der Fortsetzungsanstupser sofort raus; wenn der Agent gerade arbeitet, hängt sich die Schleife beim nächsten Halt stillschweigend wieder an. + +## Beobachten und verwalten + +- Die Leiste über dem Composer zeigt die neueste Fortschrittsnotiz, den Status und die Token-Nutzung des Ziels sowie eine Inline-Schaltfläche zum Pausieren/Fortsetzen. Wenn der Agent angehalten hat und das Ziel aktiv ist, zeigt die Leiste ein drehendes **Evaluating…** — das ist das ruhige Zeitfenster und der laufende Audit. +- Die Zielschaltfläche bleibt während der Laufzeit blau beleuchtet, wird bei Abschluss grün und bei Blockierung oder erreichtem Budget rot. Drücke sie, um den Zieldialog zu öffnen: Bearbeite das Ziel oder das Budget oder entferne das Ziel. Ein abgeschlossenes Ziel ist schreibgeschützt — entferne es und aktiviere dann ein neues. +- In der Sitzungs-Seitenleiste erscheint neben dem Sitzungsdatum ein kleines Zielsymbol, dessen Farbe den Zustand des Ziels widerspiegelt. + +## Benachrichtigungen + +Während ein Ziel aktiv ist, werden die "Agent ist bereit"-Benachrichtigungen pro Zug unterdrückt — sie würden nur die eigenen Fortsetzungen der Zielschleife wiederholen. Wenn das Ziel zur Ruhe kommt (abgeschlossen, blockiert oder Budget erreicht), bekommst du stattdessen eine letzte Benachrichtigung, auf dem Desktop und als mobile Push-Nachricht. Sie folgt derselben Einstellung "bei Abschluss benachrichtigen"; Berechtigungsanfragen, Fragen und Fehlermeldungen funktionieren währenddessen wie gewohnt weiter. + +## Token-Budget + +In **Einstellungen → Chat → Goal** kannst du ein Standard-Token-Budget für neue Ziele festlegen. Wenn ein Ziel sein Budget erreicht, stoppt es als "budget reached" statt weiter zu verbrauchen — du kannst das Budget erhöhen und im Zieldialog fortsetzen. + +## Beachten + +- Die Zielschleife läuft im OpenChamber-Server, nicht in deinem Browser-Tab. Schließe den Tab, sperre das Telefon — der Agent arbeitet weiter, und du bekommst eine Benachrichtigung, wenn das Ziel zur Ruhe kommt. Der Server (Desktop-App oder `openchamber`-Prozess) muss weiterlaufen. +- Ziele verwenden den eigenen Provider und das Modell deiner Sitzung, einschließlich der Prüferaufrufe — nichts verlässt die Provider, die du bereits nutzt. +- Pro Sitzung immer nur ein Ziel gleichzeitig. + +## Verwandt + +- [Geplante Aufgaben](/scheduled-tasks/) — eine Aufforderung nach Zeitplan ausführen; dort "Run as goal" aktivieren, damit ein geplanter Lauf seine Aufforderung bis zum Abschluss verfolgt +- [Benachrichtigungen](/notifications/) — wie du von einem fertigen Ziel erfährst diff --git a/packages/docs/content/docs/de/skills-catalog.mdx b/packages/docs/content/docs/de/skills-catalog.mdx new file mode 100644 index 00000000..1b1c35a7 --- /dev/null +++ b/packages/docs/content/docs/de/skills-catalog.mdx @@ -0,0 +1,27 @@ +--- +title: Skills-Katalog +description: Fertige Skills durchsuchen und installieren. +--- + +# Skills-Katalog + +Im Skills-Katalog kannst du Skills installieren, die andere veröffentlicht haben, statt selbst welche zu schreiben. Du öffnest ihn unter **Einstellungen → Skills → Katalog**. + +Zum Schreiben eigener Skills siehe [Skills](/skills/). + +## Einen Skill installieren + +1. Öffne den Katalog. +2. Durchsuche die eingebauten Quellen — das Anthropic-Skills-Repo und die ClawdHub-Community-Registry — oder nutze die Suche. +3. Wähle einen Skill aus und installiere ihn. +4. Entscheide, wo er installiert werden soll: für alles, was du tust, oder nur für das aktuelle Projekt. + +Wenn bereits ein Skill mit demselben Namen existiert, fragt OpenChamber, was geschehen soll — überspringen, überschreiben oder für jeden Skill einzeln entscheiden. + +## Eigene Quelle hinzufügen + +Du kannst jedes Git-Repository als Quelle hinzufügen — entweder mit seinem `owner/repo`-Namen oder mit einer vollständigen Git-URL. Private Repositories brauchen Zugriff auf deinem Rechner (einen SSH-Schlüssel oder gespeicherte Anmeldedaten); wenn sich eine Quelle nicht authentifizieren kann, weist der Katalog darauf hin, statt still zu scheitern. + +## Weiterführend + +- [Skills](/skills/) — installierte Skills erstellen und verwalten diff --git a/packages/docs/content/docs/de/skills.mdx b/packages/docs/content/docs/de/skills.mdx new file mode 100644 index 00000000..f0aabce4 --- /dev/null +++ b/packages/docs/content/docs/de/skills.mdx @@ -0,0 +1,30 @@ +--- +title: Skills +description: Erstelle wiederverwendbare Anweisungen, die Agents bei Bedarf laden. +--- + +# Skills + +Ein Skill ist ein wiederverwendbarer Satz von Anweisungen, den ein Agent bei Bedarf laden kann — zum Beispiel „wie wir Commit-Nachrichten schreiben“ oder „unsere API-Konventionen“. Du verwaltest sie unter **Einstellungen → Skills**. + +Wenn du fertige Skills installieren statt eigene schreiben möchtest, siehe [Skills-Katalog](/skills-catalog/). + +## Einen Skill erstellen + +1. Öffne **Einstellungen → Skills**. +2. Erstelle einen Skill und gib ihm einen Namen und eine kurze Beschreibung. Die Beschreibung ist die Grundlage dafür, wann der Agent den Skill anwendet. Sei daher konkret. +3. Schreibe die Anweisungen. Füge unterstützende Dateien hinzu, falls der Skill sie braucht. +4. Wähle den Speicherort: + - **persönlich** — in jedem Projekt verfügbar + - **projektbezogen** — nur im aktuellen Projekt verfügbar + +## Einen Skill im Chat verwenden + +Gib mitten in einer Nachricht `/` ein, um die Skill-Auswahl zu öffnen, und wähle dann einen Skill aus. Der Agent lädt für die Antwort die Anweisungen dieses Skills. + +Ein `/` ganz am Anfang der Nachricht öffnet stattdessen [Befehle](/commands-snippets/). + +## Weiterführend + +- [Skills-Katalog](/skills-catalog/) — installiere Skills, die andere veröffentlicht haben +- [Befehle & Snippets](/commands-snippets/) — weitere Möglichkeiten, Text im Chat wiederzuverwenden diff --git a/packages/docs/content/docs/de/ssh-hosts-proxying.mdx b/packages/docs/content/docs/de/ssh-hosts-proxying.mdx new file mode 100644 index 00000000..4ce4021a --- /dev/null +++ b/packages/docs/content/docs/de/ssh-hosts-proxying.mdx @@ -0,0 +1,48 @@ +--- +title: SSH-Hosts & Proxying +description: Importiere gespeicherte SSH-Hosts und füge in der Desktop-App zusätzliche SSH-Portweiterleitungen hinzu. +--- + +# SSH-Hosts & Proxying + +Verwende in der Desktop-App **Settings → Remote Instances**, um gespeicherte SSH-Hosts zu importieren, dich mit einem entfernten Rechner zu verbinden und über dieselbe SSH-Verbindung zusätzliche Ports bereitzustellen. + +> SSH-Hosts und SSH-Proxying sind Funktionen **nur für den Desktop**. Sie verwenden den SSH-Client auf deinem Rechner. + +## SSH-Host importieren + +OpenChamber kann Hosts aus deiner lokalen SSH-Konfiguration lesen, also aus demselben Ort, den auch Befehle wie `ssh work-server` verwenden. + +1. Öffne **Settings → Remote Instances**. +2. Wähle einen Host unter **Saved SSH hosts**. +3. Wenn es sich um ein Muster handelt, gib das tatsächliche Ziel ein, zum Beispiel `deploy@app.example.com`. +4. Speichern und verbinden. + +OpenChamber erstellt mit diesem SSH-Befehl eine Remote-Instanz. Wenn sie **ready** erreicht, öffnet sich die entfernte OpenChamber-UI in der Desktop-App. + +## Zusätzliche Portweiterleitungen hinzufügen + +Jede Remote-Instanz hat den Bereich **Port Forwards**. Verwende ihn, wenn etwas auf einer Seite der SSH-Verbindung einen Port auf der anderen Seite erreichen muss. + +OpenChamber unterstützt drei Weiterleitungstypen: + +- **Local (-L)** — öffne einen Port auf deinem Rechner, der mit etwas auf dem entfernten Rechner verbunden ist. +- **Remote (-R)** — öffne einen Port auf dem entfernten Rechner, der zurück zu deinem Rechner verbindet. +- **Dynamic (-D)** — öffne einen lokalen SOCKS-Proxy über die SSH-Verbindung. + +Für die meisten App-Vorschauen und Dashboards, die auf dem entfernten Rechner laufen, verwende **Local (-L)**. + +## Den SOCKS-Proxy verwenden + +Wähle **Dynamic (-D)**, wenn andere Tools auf deinem Rechner über den entfernten Rechner browsen sollen. OpenChamber öffnet dafür einen lokalen SOCKS-Proxy-Port für diese SSH-Verbindung. + +Sobald die Verbindung bereit ist, kopiere oder verwende die lokale Proxy-Adresse aus der Weiterleitungszeile. Konfiguriere deinen Browser oder dein Tool so, dass es sie als SOCKS5-Proxy verwendet. + +## Privat halten + +Verwende `127.0.0.1` oder `localhost` für den lokalen Bind-Host, es sei denn, du möchtest ausdrücklich, dass andere Geräte in deinem Netzwerk den weitergeleiteten Port erreichen. + +## Verwandt + +- [Remote Instances](/remote-instances/) — die Desktop-App mit OpenChamber auf einem anderen Rechner verbinden +- [Remote access](/troubleshooting/remote-access/) — wenn SSH oder Remote-Zugriff keine Verbindung herstellen diff --git a/packages/docs/content/docs/de/themes.mdx b/packages/docs/content/docs/de/themes.mdx new file mode 100644 index 00000000..2d4a3c4c --- /dev/null +++ b/packages/docs/content/docs/de/themes.mdx @@ -0,0 +1,30 @@ +--- +title: Themes +description: Passe OpenChamber mit eingebauten und benutzerdefinierten Themes an. +--- + +# Themes + +OpenChamber unterstützt eingebaute Themes und benutzerdefinierte Theme-JSON-Dateien. + +## Ein benutzerdefiniertes Theme hinzufügen + +1. Erstelle das Themes-Verzeichnis: + +```bash +mkdir -p ~/.config/openchamber/themes +``` + +2. Füge deine JSON-Datei in dieses Verzeichnis ein (zum Beispiel `my-theme.json`). +3. Öffne OpenChamber und gehe dann zu **Einstellungen -> Theme -> Themes neu laden**. +4. Wähle dein Theme im Dropdown aus. Es wird sofort angewendet. + +## Speicherort der Themes + +- macOS/Linux: `~/.config/openchamber/themes/` + +## Vollständige Referenz des JSON-Formats + +Verwende die vollständige Formatbeschreibung in den Haupt-Repository-Dokumenten: + +- [`docs/CUSTOM_THEMES.md`](https://github.com/openchamber/openchamber/blob/main/docs/CUSTOM_THEMES.md) diff --git a/packages/docs/content/docs/de/troubleshooting.mdx b/packages/docs/content/docs/de/troubleshooting.mdx new file mode 100644 index 00000000..4e83f2d5 --- /dev/null +++ b/packages/docs/content/docs/de/troubleshooting.mdx @@ -0,0 +1,40 @@ +--- +title: Fehlerbehebung +description: Häufige Einrichtungs- und Laufzeitprobleme mit schnellen Lösungen. +--- + +# Fehlerbehebung + +Hakt es irgendwo? Suchen Sie unten das Symptom und probieren Sie die Lösung. + +## OpenChamber-Befehl beendet sich oder startet nicht + +- bestätigen Sie Node.js `>=22` +- führen Sie `openchamber --version` aus +- installieren Sie die neueste CLI bei Bedarf neu + +## Web-UI ist nicht erreichbar + +- prüfen Sie die Server-Logs mit `openchamber logs` +- verifizieren Sie den aktiven Port (standardmäßig `3000`) +- öffnen Sie `http://localhost:3000` zuerst direkt, bevor Sie Tunnel-Links testen + +## Remote-/Tunnel-Link funktioniert nicht + +- führen Sie `openchamber tunnel status --all` aus +- starten Sie den Tunnel von derselben Instanz / demselben Port neu +- erzeugen Sie den Connect-Link neu, wenn das vorherige Token bereits verwendet wurde + +Die vollständige Einrichtung steht unter [Tunnel](/tunnels/) und [Reverse Proxy](/reverse-proxy/), falls Sie einen nutzen. + +## VS-Code-Erweiterung verbindet sich nicht + +- bestätigen Sie, dass der OpenChamber-Server läuft +- prüfen Sie, ob die Erweiterung aktualisiert ist +- laden Sie das VS-Code-Fenster neu und versuchen Sie die Verbindung erneut + +## Verwandt + +- [Schnellstart](/quickstart/) +- [Tunnel](/tunnels/) +- [Reverse Proxy](/reverse-proxy/) diff --git a/packages/docs/content/docs/de/troubleshooting/opencode-connection.mdx b/packages/docs/content/docs/de/troubleshooting/opencode-connection.mdx new file mode 100644 index 00000000..dd14cdc6 --- /dev/null +++ b/packages/docs/content/docs/de/troubleshooting/opencode-connection.mdx @@ -0,0 +1,34 @@ +--- +title: OpenCode-Verbindung +description: Beheben Sie, dass OpenChamber keine Verbindung zu seinem OpenCode-Server herstellt. +--- + +# OpenCode-Verbindung + +Wenn OpenChamber lädt, aber nie über „OpenCode is restarting“ hinauskommt, oder der Chat nicht antwortet, ist der Server, mit dem es spricht, nicht erreichbar. Gehen Sie diese Punkte durch. + +## Es hängt bei „OpenCode is restarting“ + +- geben Sie ihm direkt nach dem Start einen Moment — dieser Zustand ist normal, während der Server hochfährt +- prüfen Sie mit `openchamber status`, ob der Server noch läuft +- starten Sie ihn mit `openchamber restart` neu +- sehen Sie sich mit `openchamber logs` die Startdetails an + +## Sie verbinden sich mit Ihrem eigenen Server + +Wenn Sie OpenChamber so konfiguriert haben, dass es einen vorhandenen Server nutzt, prüfen Sie die Einrichtung aus [OpenCode Server](/opencode-server/) noch einmal: + +- `OPENCODE_HOST` muss den Port enthalten, aber keinen Pfad — zum Beispiel `http://localhost:4096` +- setzen Sie `OPENCODE_SKIP_START=true`, damit OpenChamber nicht auch noch seinen eigenen Server startet +- wenn die Adresse ungültig ist, ignoriert OpenChamber sie und startet stattdessen seinen eigenen Server — achten Sie in den Logs auf eine `[config]`-Warnung + +## Es schlägt immer noch fehl + +- bestätigen Sie, dass Node.js Version `20` oder neuer ist +- installieren Sie die neueste CLI neu +- öffnen Sie `http://localhost:3000` direkt, bevor Sie einen Tunnel- oder Remote-Link testen + +## Verwandt + +- [OpenCode Server](/opencode-server/) — wie OpenChamber den Server findet und verwaltet +- [Fehlerbehebung](/troubleshooting/) — weitere häufige Probleme diff --git a/packages/docs/content/docs/de/troubleshooting/remote-access.mdx b/packages/docs/content/docs/de/troubleshooting/remote-access.mdx new file mode 100644 index 00000000..377c6eaa --- /dev/null +++ b/packages/docs/content/docs/de/troubleshooting/remote-access.mdx @@ -0,0 +1,47 @@ +--- +title: Remote-Zugriff +description: Beheben Sie Tunnel, Remote-Instanzen und den Zugriff auf OpenChamber von einem anderen Gerät aus. +--- + +# Remote-Zugriff + +Wenn Sie OpenChamber von Ihrem Telefon oder einem anderen Rechner aus nicht erreichen, hängt die Lösung davon ab, wie Sie sich verbinden. + +## Prüfen Sie zuerst die Grundlagen + +- öffnen Sie zuerst `http://localhost:3000` auf demselben Computer — wenn das fehlschlägt, ist es kein Remote-Problem; sehen Sie unter [OpenCode-Verbindung](/troubleshooting/opencode-connection/) nach +- bestätigen Sie mit `openchamber status`, dass der Server läuft + +## Gekoppeltes Gerät verbindet sich nicht + +- der QR-Code / Pairing-Link ist **nur einmal nutzbar** — wenn er bereits gescannt wurde (oder abgelaufen ist), erstellen Sie über **Gerät hinzufügen** einen neuen +- wenn das Gerät mit **Nur Heimnetzwerk** gekoppelt wurde, kann es sich von außerhalb dieses Netzwerks nicht verbinden — koppeln Sie es erneut mit **Überall** +- prüfen Sie bei **Überall**-Pairing auf dem Server **Einstellungen → Remote-Instanzen → OpenChamber Relay**: Dort sollte **Verbunden** stehen; wenn nicht, deaktivieren und reaktivieren Sie es +- wenn ein Gerät **widerrufen** wurde, ist sein Token endgültig weg — koppeln Sie es mit einem neuen QR-Code erneut + +Wie diese Verbindungen funktionieren, steht unter [Ein Gerät verbinden](/connect-devices/) und [Private Relay](/private-relay/). + +## Tunnel-Link funktioniert nicht + +- führen Sie `openchamber tunnel status --all` aus +- starten Sie den Tunnel von derselben Instanz und demselben Port neu +- erzeugen Sie den Connect-Link neu, wenn der vorherige bereits verwendet wurde + +Die vollständige Einrichtung steht unter [Tunnel](/tunnels/). + +## Remote-Instanz verbindet sich nicht (Desktop) + +Wenn eine [Remote-Instanz](/remote-instances/) hängen bleibt, nennt OpenChamber den fehlgeschlagenen Schritt: + +- **auth** — Ihr SSH- oder UI-Passwort wurde abgelehnt; geben Sie es erneut ein +- **install / start** — OpenChamber konnte den Server auf dem entfernten Rechner nicht einrichten oder starten; prüfen Sie die Anforderungen dieses Rechners +- **forwarding** — die Verbindung steht, aber der Port erreicht Sie nicht; versuchen Sie einen anderen lokalen Port + +## Hinter Ihrem eigenen Server + +Wenn Sie OpenChamber hinter einen Reverse Proxy setzen und es seltsam lädt oder keine Verbindung herstellt, sehen Sie sich [Reverse Proxy](/reverse-proxy/) an. + +## Verwandt + +- [Ein Gerät verbinden](/connect-devices/) · [Private Relay](/private-relay/) · [Tunnel](/tunnels/) · [Remote-Instanzen](/remote-instances/) · [Reverse Proxy](/reverse-proxy/) +- [Sicherheit](/security/) — schützen Sie die UI, bevor Sie sie freigeben diff --git a/packages/docs/content/docs/de/troubleshooting/worktrees-git.mdx b/packages/docs/content/docs/de/troubleshooting/worktrees-git.mdx new file mode 100644 index 00000000..4f36d1ac --- /dev/null +++ b/packages/docs/content/docs/de/troubleshooting/worktrees-git.mdx @@ -0,0 +1,35 @@ +--- +title: Worktrees & Git +description: Häufige Probleme mit Worktrees und Git beheben. +--- + +# Worktrees & Git + +Probleme, die bei [Worktree-Sitzungen](/worktrees/) und der [Git-Ansicht](/git/) auftreten, und wie Sie sie beheben. + +## Ein Worktree braucht Aufmerksamkeit + +OpenChamber markiert einen Worktree, wenn etwas nicht stimmt: + +- **Ordner fehlt** — der Ordner des Worktrees wurde gelöscht oder außerhalb von OpenChamber verschoben; entfernen Sie die Sitzung und erstellen Sie einen frischen Worktree +- **abgetrennter oder noch nicht angelegter Branch** — der Worktree liegt nicht auf einem normalen Branch; checken Sie ihn auf einen aus +- **Merge, Rebase oder Cherry-Pick läuft noch** — eine Operation wurde halb fertig gelassen; beenden oder abbrechen Sie sie in der Git-Ansicht + +## Worktree lässt sich nicht erstellen + +- **Branch existiert bereits** — wählen Sie einen anderen Branchnamen oder verwenden Sie die Option für einen bestehenden Branch +- **Name bereits vergeben** — wählen Sie einen anderen Worktree-Namen + +## Commit- oder PR-Erstellung schlägt fehl + +Das Erzeugen einer Commit-Nachricht oder einer PR-Beschreibung läuft in Ihrer aktiven Sitzung, daher brauchen Sie eine geöffnete Sitzung mit ausgewähltem Arbeitsmodell. Öffnen oder wählen Sie eine Sitzung und versuchen Sie es erneut. + +## SSH- oder Windows-Pfadprobleme + +- stellen Sie sicher, dass der SSH-Schlüssel, den das Repo verwendet, derselbe ist, den Sie in Ihrer [Git-Identität](/git-identities/) gesetzt haben +- unter Windows verwendet Git Unix-ähnliche Pfade (wie `/c/Users/...`) — OpenChamber handhabt das, aber benutzerdefinierte SSH-Schlüsselpfade sollten dieselbe Form haben + +## Verwandt + +- [Worktree-Sitzungen](/worktrees/) — wie Worktrees erstellt und entfernt werden +- [Git-Identitäten](/git-identities/) — für jedes Repo den richtigen Schlüssel und die richtige Identität setzen diff --git a/packages/docs/content/docs/de/tunnels.mdx b/packages/docs/content/docs/de/tunnels.mdx new file mode 100644 index 00000000..69475a93 --- /dev/null +++ b/packages/docs/content/docs/de/tunnels.mdx @@ -0,0 +1,120 @@ +--- +title: Tunnel +description: Stelle OpenChamber sicher für Remote- und Mobilzugriff bereit. +--- + +# Tunnel + +Ein Tunnel ist ein öffentlicher Link zu deinem OpenChamber, damit du ihn von einem normalen Browser in einem anderen Netzwerk aus erreichen kannst. Nutze `openchamber tunnel`, um einen für eine laufende Instanz zu erstellen. + +> Wenn du **deine eigenen Geräte** verbindest (die Mobile App, einen anderen Desktop), brauchst du normalerweise keinen Tunnel — [kopple sie](/connect-devices/) stattdessen und lass das Ende-zu-Ende-verschlüsselte [Private Relay](/private-relay/) den Zugriff von unterwegs ohne zusätzliche Einrichtung übernehmen. + +## Voraussetzungen + +OpenChamber startet das CLI des Tunnel-Anbieters auf deinem Rechner. Installiere zuerst den Anbieter, den du verwenden möchtest: + +```bash +brew install cloudflared +brew install ngrok +``` + +Cloudflare Quick Tunnels können mit `cloudflared` laufen. Ngrok benötigt ein ngrok-Konto und ein Authtoken aus dem ngrok-Dashboard: + +```bash +ngrok config add-authtoken +``` + +## Schnellstart + +1. Starte OpenChamber: + +```bash +openchamber +``` + +Wenn du diesen Schritt überspringst, kann `openchamber tunnel start` automatisch einen CLI-Server starten. Beim automatischen Start kannst du Serveroptionen wie `--port`, `--host`, `--lan`, `--ui-password` und `--api-only` mitgeben. + +2. Starte einen Cloudflare-Tunnel: + +```bash +openchamber tunnel start --provider cloudflare --mode quick +``` + +Oder starte einen Ngrok-Tunnel: + +```bash +openchamber tunnel start --provider ngrok --mode quick +``` + +3. Status prüfen: + +```bash +openchamber tunnel status +``` + +Sobald der Tunnel aktiv ist, zeigt `status` eine öffentliche URL. Öffne sie oder scanne den QR-Code, um OpenChamber von überall aus zu erreichen. + +Standardmäßig druckt OpenChamber in interaktiven TTY-Sitzungen einen QR-Code. Mit `--qr` erzwingst du die QR-Ausgabe, mit `--no-qr` deaktivierst du sie. + +## Anbieter + +- `cloudflare`: Quick-, Managed-Remote- und Managed-Local-Modi +- `ngrok`: Quick-Modus + +## Verwaltete Modi + +### Managed Remote + +Verwende ein von Cloudflare verwaltetes Token und einen Hostnamen: + +```bash +openchamber tunnel start --provider cloudflare --mode managed-remote --token-file ~/.secrets/cf-token --hostname app.example.com +``` + +### Managed Local + +Verwende eine lokale `cloudflared`-Konfiguration: + +```bash +openchamber tunnel start --provider cloudflare --mode managed-local --config ~/.cloudflared/config.yml +``` + +## Profile (managed-remote) + +Ein wiederverwendbares Profil speichern: + +```bash +openchamber tunnel profile add --provider cloudflare --mode managed-remote --name prod-main --hostname app.example.com --token-file ~/.secrets/cf-token +``` + +Mit dem gespeicherten Profil starten: + +```bash +openchamber tunnel start --profile prod-main +``` + +## Nützliche Befehle + +```bash +openchamber tunnel providers +openchamber tunnel ready --provider cloudflare +openchamber tunnel ready --provider ngrok +openchamber tunnel doctor --provider cloudflare +openchamber tunnel doctor --provider ngrok +openchamber tunnel stop --port 3000 +``` + +## Hinweise zum Verhalten + +- ein aktiver Tunnel pro OpenChamber-Instanz (Port) +- wenn auf derselben Instanz ein neuer Modus oder Anbieter startet, ersetzt er den vorherigen Tunnel +- das Erstellen eines neuen Verbindungslinks widerruft den vorherigen unbenutzten Link +- das automatische Starten des Tunnels bewahrt Server-Flags wie `--ui-password` und `--api-only` in den Instanzeinstellungen auf, die von Neustart-/Update-Flows verwendet werden + +## Verwandt + +- [Connect a Device](/connect-devices/) — eigene Geräte ohne öffentliche URL koppeln +- [Security](/security/) — die UI schützen, bevor du sie freigibst +- [Desktop Tunnels](/desktop-tunnels/) — Tunnel-Einrichtung in der Desktop-App ohne CLI-Start +- [PWA & Mobile](/mobile/) — OpenChamber vom Telefon aus erreichen +- [Troubleshooting](/troubleshooting/) — wenn der Tunnel-Link nicht funktioniert diff --git a/packages/docs/content/docs/de/updates.mdx b/packages/docs/content/docs/de/updates.mdx new file mode 100644 index 00000000..725de9e1 --- /dev/null +++ b/packages/docs/content/docs/de/updates.mdx @@ -0,0 +1,31 @@ +--- +title: Updates +description: Halten Sie OpenChamber auf Desktop, Web und VS Code auf dem neuesten Stand. +--- + +# Updates + +Wie Sie OpenChamber aktualisieren, hängt davon ab, wie Sie es installiert haben. In jedem Fall können Sie Ihre aktuelle Version unter **Einstellungen → OpenChamber → Über** prüfen. + +## Desktop-App + +Die Desktop-App prüft GitHub-Releases auf Updates. Wenn eines verfügbar ist, informiert OpenChamber Sie, lädt es auf Wunsch herunter und installiert es beim nächsten Neustart. Sie behalten immer die Kontrolle — nichts wird ohne Ihr Zutun installiert. + +## Web / CLI + +Wenn Sie die CLI installiert haben, aktualisieren Sie sie im Bereich **Über** mit den Schaltflächen zum Prüfen und Aktualisieren oder im Terminal: + +```bash +openchamber update +``` + +OpenChamber erkennt, wie es installiert wurde (npm, pnpm, yarn oder bun), und führt das passende Update für Sie aus. + +## Der OpenCode-Server + +OpenChamber und OpenCode werden getrennt aktualisiert. Wenn eine neue OpenCode-Version verfügbar ist, bietet OpenChamber an, sie zu aktualisieren, und startet den Server danach neu. Wie dieser Server verwaltet wird, steht unter [OpenCode Server](/opencode-server/). + +## Verwandt + +- [Installieren](/install/) — wie die jeweilige App überhaupt installiert wird +- [OpenCode Server](/opencode-server/) — den zugrunde liegenden Server aktualisieren diff --git a/packages/docs/content/docs/de/usage.mdx b/packages/docs/content/docs/de/usage.mdx new file mode 100644 index 00000000..d0129fbf --- /dev/null +++ b/packages/docs/content/docs/de/usage.mdx @@ -0,0 +1,28 @@ +--- +title: Nutzung & Kontingente +description: Verfolge, wie viel deines Provider-Tarifs du bereits genutzt hast. +--- + +# Nutzung & Kontingente + +Die Seite Nutzung zeigt, wie viel du von den Tarifen der einzelnen Provider bereits verbraucht hast, damit du sehen kannst, wie nah du an einem Limit bist. Du öffnest sie unter **Einstellungen → Nutzung**. + +## Was du siehst + +Für jeden verbundenen Provider zeigt OpenChamber: + +- wie viel des aktuellen Zeitfensters du bereits genutzt hast, als Balken +- eine Aufschlüsselung nach Modell +- einen Tempoindikator, damit du siehst, ob du rechtzeitig am Limit ankommen wirst + +Du kannst auswählen, welche Provider angezeigt werden, und dieselbe Zusammenfassung ist auch über ein Dropdown in der App-Kopfzeile verfügbar. + +## Unterstützte Provider + +Die Nutzung funktioniert für die Provider, die ein Kontingent veröffentlichen, darunter Claude, Codex, GitHub Copilot, Google, OpenRouter, Kimi, NanoGPT, z.ai, Zhipu, MiniMax, Ollama Cloud und Wafer. + +Ein Anbieter zeigt Nutzung erst dann an, wenn du dich auf der [Seite „Anbieter“](/providers/) dort angemeldet hast. Einige Anbieter brauchen noch einen zusätzlichen Schritt — Ollama Cloud liest zum Beispiel eine Sitzungsdatei, die du separat einrichtest. Wenn ein Anbieter keine Daten anzeigt, fehlt meist diese zusätzliche Anmeldeinformation. + +## Weiterführend + +- [Provider, Modelle & Agents](/providers/) — zuerst anmelden, damit Nutzung angezeigt wird diff --git a/packages/docs/content/docs/de/voice.mdx b/packages/docs/content/docs/de/voice.mdx new file mode 100644 index 00000000..02f174bd --- /dev/null +++ b/packages/docs/content/docs/de/voice.mdx @@ -0,0 +1,36 @@ +--- +title: Sprachmodus +description: Sprich mit OpenChamber und lass dir Antworten vorlesen. +--- + +# Sprachmodus + +Mit dem Sprachmodus kannst du Nachrichten diktieren und dir Antworten vorlesen lassen. Schalte ihn unter **Einstellungen → OpenChamber → Sprache** ein. + +## Antworten vorlesen lassen (Text-zu-Sprache) + +Wähle aus, wie Antworten gesprochen werden: + +- **Browser** — die integrierten Stimmen deines Browsers, keine Einrichtung nötig +- **OpenAI** — die Stimmen von OpenAI; füge deinen API-Schlüssel ein und wähle eine Stimme +- **OpenAI-kompatibel** — jeder Dienst, der das OpenAI-Format unterstützt; gib seine URL und, falls nötig, einen API-Schlüssel an +- **macOS say** — der eingebaute `say`-Befehl, auf Macs mit dieser Funktion + +Sobald es aktiviert ist, erscheint bei Nachrichten eine Abspieltaste, mit der du sie vorlesen lassen kannst. + +## Nachrichten diktieren (Sprache-zu-Text) + +Wähle aus, wie deine Sprache transkribiert wird: + +- **Browser** — die integrierte Spracherkennung deines Browsers, keine Einrichtung nötig +- **Server** — ein OpenAI-kompatibler Transkriptionsdienst; gib seine URL und, falls nötig, einen API-Schlüssel an +- **Gerätebasiert** — ein Sprachmodell, das in deinem Browser läuft und beim ersten Verwenden heruntergeladen wird + +## Hinweis für Telefone + +Beim Vorlesen auf einem Telefon sind die Optionen OpenAI oder OpenAI-kompatibel am zuverlässigsten — mobile Browser begrenzen die integrierten Stimmen. + +## Weiterführend + +- [Benachrichtigungen](/notifications/) — lasse dich statt durch Zuhören per Ping informieren +- [Provider, Modelle & Agents](/providers/) — dort liegt möglicherweise bereits dein OpenAI-Schlüssel diff --git a/packages/docs/content/docs/de/walkthrough.mdx b/packages/docs/content/docs/de/walkthrough.mdx new file mode 100644 index 00000000..04744a4f --- /dev/null +++ b/packages/docs/content/docs/de/walkthrough.mdx @@ -0,0 +1,71 @@ +--- +title: Änderungen durchgehen +description: Lesen Sie einen Diff in der Reihenfolge, in der er Sinn ergibt, nicht alphabetisch. +--- + +# Änderungen durchgehen + +Ein Diff ist nach Dateipfad sortiert, und das ist fast nie die Reihenfolge, in der die Änderung Sinn ergibt. Das Walkthrough ordnet ihn neu: Zusammengehörige Änderungen werden in **Stops** gruppiert, jeder Stop erklärt, was der Code jetzt anders macht, und die Stops sind so angeordnet, dass jeder auf dem vorherigen aufbaut. + +Es erklärt und ordnet. Es bewertet Ihren Code nicht und fällt kein Urteil — dafür ist [Review](/git/) da. + +Öffnen Sie es über das **Walkthrough**-Symbol in der rechten Leiste oder über die Schaltfläche **AI walkthrough** in den Bereichen Changes und Pull Request. Beides öffnet nur das Panel; generiert wird erst, wenn Sie **Generate walkthrough** drücken. + +## Was es prüfen kann + +| Bereich | Was enthalten ist | +| --- | --- | +| Alle uncommitteten | Alles, was noch nicht committet ist: gestagte, ungestagte und neue Dateien | +| Gestaged | Nur das, was jetzt in einen Commit gehen würde | +| Ungestaged | Arbeitsbaum und neue Dateien | +| Dieser Branch | Jeder Commit auf diesem Branch, der nicht auf seinem Basis-Stand ist | +| Pull Request | Die Änderung so, wie sie auf GitHub existiert | + +**Dieser Branch** bedeutet nicht „nicht gepushte Commits“ — es ist alles, was der Branch gegenüber seiner Basis hinzufügt, egal ob gepusht oder nicht. Nach einem Commit, aber vor dem Push, unterscheiden sich also Branch und Pull Request absichtlich: Der eine zeigt, was Sie getan haben, der andere, was Reviewer gerade sehen. + +Jeder Bereich wird separat gespeichert, sodass der Wechsel zwischen ihnen nichts verliert. + +## Das Modell wählen + +Walkthroughs nutzen standardmäßig Ihr kleines Modell. Wählen Sie unter **Einstellungen → Sitzungen → Modell für Änderungen durchgehen** ein anderes aus oder für eine einzelne Prüfung im Kopfbereich des Panels — nützlich, wenn eine Änderung riskant genug ist, ein stärkeres Modell zu brauchen. + +Die Auswahl zeigt nur Modelle an, die strukturierten Output zurückgeben können, weil sich das Walkthrough ohne ihn nicht zusammensetzen lässt. Wenn ein Modell für den Diff zu klein ist, wird die Generierung mit einer Erklärung abgelehnt, statt die Eingabe stillschweigend zu kürzen: Ein Walkthrough über einen halben Diff wirkt sicher und ist falsch. + +Wenn Sie ein Panel erneut öffnen, sehen Sie das Modell, das den aktuellen Inhalt erzeugt hat, sodass **Regenerate** mit demselben Modell wiederholt, sofern Sie es nicht ändern. + +## Die Sprache wählen + +Walkthroughs werden standardmäßig in Ihrer UI-Sprache geschrieben. Der Sprachwähler im Panelkopf startet dort, und Sie können für eine einzelne Prüfung jede andere Sprache wählen, in die OpenChamber übersetzt ist — eine geführte Erklärung ist nur in einer Sprache nützlich, die Sie bequem lesen. + +Übersetzt wird nur der Fließtext. Bezeichner, Dateipfade und API-Namen bleiben genau so, wie sie im Code erscheinen, damit das, was ein Stop nennt, weiterhin suchbar bleibt. + +Wenn in der von Ihnen gewählten Sprache noch nichts erzeugt wurde, zeigt das Panel weiterhin das vorhandene Walkthrough an und sagt das auch, statt leer zu werden. Drücken Sie **Generate walkthrough**, um eines in der neuen Sprache zu erhalten. + +## Kosten und Caching + +Nichts wird von selbst generiert. Die Generierung startet nur, wenn Sie sie anfordern, und auch das erneute Generieren ist manuell. + +Ergebnisse werden gegen den exakten Inhalt des Diffs gecacht. Wenn Sie den Arbeitsbaum auf einen früheren Stand zurücksetzen, erscheint das frühere Walkthrough kostenlos wieder, ohne Modellaufruf. Sprache und Modell sind ebenfalls Teil dieses Schlüssels, also wird jede Kombination separat gespeichert: Hat ein Diff einmal Walkthroughs in zwei Sprachen, ist das Umschalten zwischen ihnen sofort und kostenlos. + +Die Generierung läuft auf dem OpenChamber-Server, nicht in Ihrem Browser-Tab. Laden Sie die Seite neu oder schließen Sie das Panel, und sie läuft weiter; wenn Sie zurückkommen, wartet das Ergebnis. Nur **Cancel** beendet sie. + +## Ehrlich mit Aktualität umgehen + +Jeder Stop ist an den exakten Codeinhalt gebunden, den er beschreibt, damit das Panel Ihnen sagen kann, wenn sich dieser Code weiterentwickelt hat: + +- **Veraltete Schritte** — der Code, den ein Stop beschrieben hat, wurde geändert oder ist verschwunden. Das Walkthrough bleibt sichtbar und markiert, damit Sie entscheiden können, ob Sie es neu generieren. +- **Nicht abgedeckt** — Änderungen im aktuellen Diff, die kein Stop beschreibt. Dazu gehören spätere Bearbeitungen nach der Generierung, Änderungen, die das Walkthrough als Routine eingestuft hat, sowie Lockfiles und andere generierte Dateien, die absichtlich aus der Modelleingabe herausgehalten werden. Sie werden alle am Ende des Streams aufgelistet, damit nichts stillschweigend verschwindet. + +Neu generieren bedeutet neu schreiben statt patchen: Das vorherige Walkthrough geht als Kontext an das Modell, damit richtige Teile erhalten bleiben, und alles wird neu an den aktuellen Code angeheftet. + +## Hinweise + +- Kommentieren Sie im Walkthrough jede Zeile genau wie in der Diff-Ansicht; Kommentare werden an den Chat-Composer angehängt. +- Verfügbar auf Desktop- und Tablet-Breiten. In der VS-Code-Erweiterung oder der mobilen App nicht angeboten. +- Eine Pull-Request-Review benötigt ein verbundenes GitHub-Konto — siehe [GitHub Issues & PRs](/github/). + +## Verwandt + +- [Git & GitHub](/git/) — das Changes-Panel, aus dem dies liest, und die Review-Aktion, die tatsächlich Code bewertet +- [GitHub Issues & PRs](/github/) — GitHub verbinden, um Pull Requests zu prüfen +- [Anbieter, Modelle & Agents](/providers/) — woher das kleine Modell kommt diff --git a/packages/docs/content/docs/de/worktrees.mdx b/packages/docs/content/docs/de/worktrees.mdx new file mode 100644 index 00000000..eabdda54 --- /dev/null +++ b/packages/docs/content/docs/de/worktrees.mdx @@ -0,0 +1,36 @@ +--- +title: Worktree-Sitzungen +description: Gib einer Sitzung einen eigenen Branch und Ordner, damit die Arbeit isoliert bleibt. +--- + +# Worktree-Sitzungen + +Eine Worktree-Sitzung läuft in einer eigenen ausgecheckten Kopie deines Repos auf einem eigenen Branch (einem Git-Worktree). So kommen sich parallele Sitzungen nicht in die Quere — die eine kann refaktorieren, während eine andere einen Fehler behebt, ohne ständiges Hin- und Herwechseln. + +## Eine erstellen + +1. Öffne den Dialog für einen neuen Worktree über die Schaltfläche oben in der Sitzungs-Seitenleiste. +2. Wähle einen Startpunkt: + - **new branch** — benenne den Branch und wähle, von welchem Branch aus gestartet werden soll + - **existing branch** — checke einen bereits vorhandenen Branch aus +3. Bestätige den Worktree-Ordner (OpenChamber schlägt einen anhand des Branchnamens vor). +4. Erstelle ihn. + +OpenChamber legt den Branch an, richtet den Ordner ein und startet dort eine Sitzung. Du kannst auch direkt von einer [todo](/notes-todos-plans/) oder einem [GitHub issue or PR](/github/) aus damit beginnen. + +## Die Arbeit zurückbringen + +Wenn die Arbeit gut ist, verwende **Integrate** in der Git-Ansicht, um die Commits des Worktrees auf einen anderen Branch (etwa `main`) zu übertragen. Wenn ein Konflikt auftritt, kannst du den Konflikt dem Agenten zur Lösung geben. + +## Aufräumen + +Das Löschen oder Archivieren der Sitzung kann den Worktree entfernen. Du entscheidest, ob auch der Branch gelöscht werden soll — lokal und, falls vorhanden, remote. Nichts wird gelöscht, ohne dass du es anforderst. + +## Wenn etwas seltsam aussieht + +Ein Worktree braucht möglicherweise Aufmerksamkeit, wenn sein Ordner fehlt, sein Branch in einem detached-Zustand ist oder ein Merge oder Rebase noch nicht abgeschlossen wurde. OpenChamber markiert das, damit du es beheben kannst — siehe [Worktrees & Git](/troubleshooting/worktrees-git/). + +## Verwandt + +- [Multi-run](/multi-run/) — viele Worktree-Sitzungen gleichzeitig starten +- [Git- & GitHub-Workflows](/git/) — von innen in OpenChamber committen und integrieren diff --git a/packages/docs/sidebar.config.json b/packages/docs/sidebar.config.json index 22d8183d..15673b20 100644 --- a/packages/docs/sidebar.config.json +++ b/packages/docs/sidebar.config.json @@ -10,7 +10,8 @@ "ko": "여기서 시작", "pl": "Zacznij tutaj", "fr": "Commencer ici", - "ja": "ここから開始" + "ja": "ここから開始", + "de": "Hier starten" }, "items": [ { @@ -24,7 +25,8 @@ "ko": "개요", "pl": "Przegląd", "fr": "Vue d’ensemble", - "ja": "概要" + "ja": "概要", + "de": "Übersicht" } }, { @@ -38,7 +40,8 @@ "ko": "설치", "pl": "Instalacja", "fr": "Installation", - "ja": "インストール" + "ja": "インストール", + "de": "Installation" } }, { @@ -52,7 +55,8 @@ "ko": "빠른 시작", "pl": "Szybki start", "fr": "Démarrage rapide", - "ja": "クイックスタート" + "ja": "クイックスタート", + "de": "Schnellstart" } }, { @@ -66,7 +70,8 @@ "ko": "OpenCode 서버", "pl": "Serwer OpenCode", "fr": "Serveur OpenCode", - "ja": "OpenCode サーバー" + "ja": "OpenCode サーバー", + "de": "OpenCode-Server" } }, { @@ -80,7 +85,8 @@ "ko": "환경 변수", "pl": "Zmienne środowiskowe", "fr": "Variables d’environnement", - "ja": "環境変数" + "ja": "環境変数", + "de": "Umgebungsvariablen" } } ] @@ -95,7 +101,8 @@ "ko": "워크플로", "pl": "Przepływy pracy", "fr": "Workflows", - "ja": "ワークフロー" + "ja": "ワークフロー", + "de": "Abläufe" }, "items": [ { @@ -109,7 +116,8 @@ "ko": "프로젝트", "pl": "Projekty", "fr": "Projets", - "ja": "プロジェクト" + "ja": "プロジェクト", + "de": "Projekte" } }, { @@ -123,7 +131,8 @@ "ko": "컨텍스트", "pl": "Kontekst", "fr": "Contexte", - "ja": "コンテキスト" + "ja": "コンテキスト", + "de": "Kontext" } }, { @@ -137,7 +146,8 @@ "ko": "메모, 할 일, 계획", "pl": "Notatki, zadania i plany", "fr": "Notes, todos et plans", - "ja": "メモ、Todo、計画" + "ja": "メモ、Todo、計画", + "de": "Notizen, Aufgaben und Pläne" } }, { @@ -151,7 +161,8 @@ "ko": "예약 작업", "pl": "Zaplanowane zadania", "fr": "Tâches planifiées", - "ja": "スケジュールタスク" + "ja": "スケジュールタスク", + "de": "Geplante Aufgaben" } }, { @@ -165,7 +176,8 @@ "ko": "에이전트 제어 도구", "pl": "Narzędzie sterowania dla agentów", "fr": "Outil de contrôle pour les agents", - "ja": "エージェント制御ツール" + "ja": "エージェント制御ツール", + "de": "Agenten-Steuerungstool" } }, { @@ -179,7 +191,8 @@ "ko": "세션 목표", "pl": "Cele sesji", "fr": "Objectifs de session", - "ja": "セッションゴール" + "ja": "セッションゴール", + "de": "Sitzungsziele" } }, { @@ -193,7 +206,8 @@ "ko": "프로젝트 작업", "pl": "Akcje projektu", "fr": "Actions de projet", - "ja": "プロジェクトアクション" + "ja": "プロジェクトアクション", + "de": "Projektaktionen" } }, { @@ -207,7 +221,8 @@ "ko": "미리보기 및 개발 서버", "pl": "Podgląd i serwery deweloperskie", "fr": "Aperçu et serveurs de dev", - "ja": "プレビューと開発サーバー" + "ja": "プレビューと開発サーバー", + "de": "Vorschau und Entwicklungsserver" } }, { @@ -221,7 +236,8 @@ "ko": "Worktree 세션", "pl": "Sesje worktree", "fr": "Sessions worktree", - "ja": "Worktree セッション" + "ja": "Worktree セッション", + "de": "Worktree-Sitzungen" } }, { @@ -229,7 +245,8 @@ "link": "/multi-run/", "translations": { "fr": "Multi-run", - "ja": "Multi-run" + "ja": "Multi-run", + "de": "Mehrfachausführung" } }, { @@ -237,7 +254,8 @@ "link": "/git/", "translations": { "fr": "Git et GitHub", - "ja": "Git と GitHub" + "ja": "Git と GitHub", + "de": "Git und GitHub" } }, { @@ -251,7 +269,8 @@ "ko": "변경 워크스루", "pl": "Przewodnik po zmianach", "fr": "Parcours des modifications", - "ja": "変更のウォークスルー" + "ja": "変更のウォークスルー", + "de": "Änderungsrundgang" } }, { @@ -265,7 +284,8 @@ "ko": "GitHub 이슈 및 PR", "pl": "Zgłoszenia i PR-y GitHub", "fr": "Issues et PR GitHub", - "ja": "GitHub Issues と PR" + "ja": "GitHub Issues と PR", + "de": "GitHub-Issues und PRs" } }, { @@ -279,7 +299,8 @@ "ko": "매직 프롬프트", "pl": "Magiczne prompty", "fr": "Magic Prompts", - "ja": "マジックプロンプト" + "ja": "マジックプロンプト", + "de": "Magische Prompts" } }, { @@ -293,7 +314,8 @@ "ko": "Git 아이덴티티", "pl": "Tożsamości Git", "fr": "Identités Git", - "ja": "Git ID" + "ja": "Git ID", + "de": "Git-Identitäten" } } ] @@ -308,7 +330,8 @@ "ko": "OpenCode 설정", "pl": "Konfiguracja OpenCode", "fr": "Configuration OpenCode", - "ja": "OpenCode 設定" + "ja": "OpenCode 設定", + "de": "OpenCode-Einrichtung" }, "items": [ { @@ -322,7 +345,8 @@ "ko": "공급자, 모델, 에이전트", "pl": "Dostawcy, modele i agenci", "fr": "Fournisseurs, modèles et agents", - "ja": "プロバイダー、モデル、エージェント" + "ja": "プロバイダー、モデル、エージェント", + "de": "Anbieter, Modelle und Agenten" } }, { @@ -336,7 +360,8 @@ "ko": "MCP 서버", "pl": "Serwery MCP", "fr": "Serveurs MCP", - "ja": "MCP サーバー" + "ja": "MCP サーバー", + "de": "MCP-Server" } }, { @@ -350,7 +375,8 @@ "ko": "스킬", "pl": "Umiejętności", "fr": "Skills", - "ja": "スキル" + "ja": "スキル", + "de": "Fähigkeiten" } }, { @@ -364,7 +390,8 @@ "ko": "스킬 카탈로그", "pl": "Katalog umiejętności", "fr": "Catalogue de skills", - "ja": "スキルカタログ" + "ja": "スキルカタログ", + "de": "Fähigkeitenkatalog" } }, { @@ -378,7 +405,8 @@ "ko": "명령 및 스니펫", "pl": "Polecenia i fragmenty", "fr": "Commandes et snippets", - "ja": "コマンドとスニペット" + "ja": "コマンドとスニペット", + "de": "Befehle und Snippets" } }, { @@ -392,7 +420,8 @@ "ko": "사용량 및 할당량", "pl": "Zużycie i limity", "fr": "Utilisation et quotas", - "ja": "使用量とクォータ" + "ja": "使用量とクォータ", + "de": "Nutzung und Kontingente" } } ] @@ -407,7 +436,8 @@ "ko": "원격 접속", "pl": "Dostęp zdalny", "fr": "Accès distant", - "ja": "リモートアクセス" + "ja": "リモートアクセス", + "de": "Zugriff von außen" }, "items": [ { @@ -421,7 +451,8 @@ "ko": "기기 연결", "pl": "Podłączanie urządzenia", "fr": "Connecter un appareil", - "ja": "デバイスを接続" + "ja": "デバイスを接続", + "de": "Gerät verbinden" } }, { @@ -435,7 +466,8 @@ "ko": "프라이빗 릴레이", "pl": "Prywatny relay", "fr": "Relay privé", - "ja": "プライベートリレー" + "ja": "プライベートリレー", + "de": "Privates Relay" } }, { @@ -449,7 +481,8 @@ "ko": "터널", "pl": "Tunele", "fr": "Tunnels", - "ja": "トンネル" + "ja": "トンネル", + "de": "Tunnel" } }, { @@ -463,7 +496,8 @@ "ko": "리버스 프록시", "pl": "Reverse proxy", "fr": "Reverse proxy", - "ja": "リバースプロキシ" + "ja": "リバースプロキシ", + "de": "Reverse Proxy" } }, { @@ -477,7 +511,8 @@ "ko": "모바일 앱 및 PWA", "pl": "Aplikacje mobilne i PWA", "fr": "Apps mobiles et PWA", - "ja": "モバイルアプリと PWA" + "ja": "モバイルアプリと PWA", + "de": "Mobile Apps und PWA" } }, { @@ -491,7 +526,8 @@ "ko": "보안", "pl": "Bezpieczeństwo", "fr": "Sécurité", - "ja": "セキュリティ" + "ja": "セキュリティ", + "de": "Sicherheit" } } ] @@ -506,7 +542,8 @@ "ko": "맞춤 설정", "pl": "Dostosuj", "fr": "Personnaliser", - "ja": "カスタマイズ" + "ja": "カスタマイズ", + "de": "Anpassen" }, "items": [ { @@ -520,7 +557,8 @@ "ko": "테마", "pl": "Motywy", "fr": "Thèmes", - "ja": "テーマ" + "ja": "テーマ", + "de": "Designs" } }, { @@ -534,7 +572,8 @@ "ko": "알림", "pl": "Powiadomienia", "fr": "Notifications", - "ja": "通知" + "ja": "通知", + "de": "Benachrichtigungen" } }, { @@ -548,7 +587,8 @@ "ko": "음성 모드", "pl": "Tryb głosowy", "fr": "Mode vocal", - "ja": "音声モード" + "ja": "音声モード", + "de": "Sprachmodus" } }, { @@ -562,7 +602,8 @@ "ko": "프로젝트 아이콘", "pl": "Ikony projektów", "fr": "Icônes de projet", - "ja": "プロジェクトアイコン" + "ja": "プロジェクトアイコン", + "de": "Projektsymbole" } } ] @@ -577,7 +618,8 @@ "ko": "데스크톱", "pl": "Pulpit", "fr": "Desktop", - "ja": "デスクトップ" + "ja": "デスクトップ", + "de": "Desktop" }, "items": [ { @@ -591,7 +633,8 @@ "ko": "원격 인스턴스", "pl": "Zdalne instancje", "fr": "Instances distantes", - "ja": "リモートインスタンス" + "ja": "リモートインスタンス", + "de": "Entfernte Instanzen" } }, { @@ -605,7 +648,8 @@ "ko": "데스크톱 브라우저", "pl": "Przeglądarka na pulpicie", "fr": "Navigateur desktop", - "ja": "デスクトップブラウザ" + "ja": "デスクトップブラウザ", + "de": "Desktop-Browser" } }, { @@ -619,7 +663,8 @@ "ko": "데스크톱 터널", "pl": "Tunele w aplikacji desktopowej", "fr": "Tunnels desktop", - "ja": "デスクトップトンネル" + "ja": "デスクトップトンネル", + "de": "Desktop-Tunnel" } }, { @@ -633,7 +678,8 @@ "ko": "SSH 호스트 및 프록시", "pl": "Hosty SSH i proxy", "fr": "Hosts SSH et proxy", - "ja": "SSH ホストとプロキシ" + "ja": "SSH ホストとプロキシ", + "de": "SSH-Hosts und Proxying" } }, { @@ -647,7 +693,8 @@ "ko": "업데이트", "pl": "Aktualizacje", "fr": "Mises à jour", - "ja": "更新" + "ja": "更新", + "de": "Aktualisierungen" } } ] @@ -662,7 +709,8 @@ "ko": "도움말", "pl": "Pomoc", "fr": "Aide", - "ja": "ヘルプ" + "ja": "ヘルプ", + "de": "Hilfe" }, "items": [ { @@ -676,7 +724,8 @@ "ko": "문제 해결", "pl": "Rozwiązywanie problemów", "fr": "Dépannage", - "ja": "トラブルシューティング" + "ja": "トラブルシューティング", + "de": "Fehlerbehebung" } }, { @@ -690,7 +739,8 @@ "ko": "OpenCode 연결", "pl": "Połączenie z OpenCode", "fr": "Connexion à OpenCode", - "ja": "OpenCode 接続" + "ja": "OpenCode 接続", + "de": "OpenCode-Verbindung" } }, { @@ -704,7 +754,8 @@ "ko": "Worktree 및 Git", "pl": "Worktree i Git", "fr": "Worktrees et Git", - "ja": "Worktrees と Git" + "ja": "Worktrees と Git", + "de": "Worktrees und Git" } }, { @@ -718,7 +769,8 @@ "ko": "원격 접속", "pl": "Dostęp zdalny", "fr": "Accès distant", - "ja": "リモートアクセス" + "ja": "リモートアクセス", + "de": "Externer Zugriff" } } ] diff --git a/packages/ui/src/lib/i18n/bootstrap.ts b/packages/ui/src/lib/i18n/bootstrap.ts index dc712f63..0daa25c5 100644 --- a/packages/ui/src/lib/i18n/bootstrap.ts +++ b/packages/ui/src/lib/i18n/bootstrap.ts @@ -209,12 +209,32 @@ const JA_MESSAGES: BootstrapMessages = { loadingData: (providersText, agentsText) => `データを読み込み中 (${providersText}, ${agentsText})…`, }; +const DE_MESSAGES: BootstrapMessages = { + startingApi: 'OpenCode API wird gestartet…', + initializing: 'Initialisierung…', + connecting: 'Verbindung wird hergestellt…', + connected: 'Verbunden!', + connectionError: 'Verbindungsfehler', + disconnected: 'Verbindung getrennt', + reconnecting: 'Verbindung wird wiederhergestellt…', + initialDataLoadFailed: 'OpenCode ist verbunden, aber die Anfangsdaten konnten nicht geladen werden.', + cliNotFound: 'OpenCode CLI wurde nicht gefunden. Installieren Sie es zuerst.', + providersReady: '✓ Anbieter', + providersLoading: '… Anbieter', + agentsReady: '✓ Agents', + agentsLoading: '… Agents', + startingDevServer: (hostLabel) => `Webview-Entwicklungsserver wird gestartet (${hostLabel})...`, + waitingDevServer: (hostLabel, attempt) => `Warten auf den Webview-Entwicklungsserver (${hostLabel})... Versuch ${attempt}`, + loadingData: (providersText, agentsText) => `Daten werden geladen (${providersText}, ${agentsText})…`, +}; + export const getBootstrapMessages = (locale: Locale): BootstrapMessages => { return BOOTSTRAP_MESSAGES[locale]; }; const BOOTSTRAP_MESSAGES: Record = { en: EN_MESSAGES, + de: DE_MESSAGES, fr: FR_MESSAGES, 'zh-CN': ZH_CN_MESSAGES, 'zh-TW': ZH_TW_MESSAGES, diff --git a/packages/ui/src/lib/i18n/intl.ts b/packages/ui/src/lib/i18n/intl.ts index b5d7f80b..ab6f4686 100644 --- a/packages/ui/src/lib/i18n/intl.ts +++ b/packages/ui/src/lib/i18n/intl.ts @@ -3,6 +3,7 @@ import type { Locale } from './runtime'; const INTL_LOCALE_BY_LOCALE: Record = { en: 'en-US', + de: 'de-DE', fr: 'fr-FR', 'zh-CN': 'zh-CN', 'zh-TW': 'zh-TW', diff --git a/packages/ui/src/lib/i18n/messages.test.ts b/packages/ui/src/lib/i18n/messages.test.ts index bb4c2b3e..6ea5035f 100644 --- a/packages/ui/src/lib/i18n/messages.test.ts +++ b/packages/ui/src/lib/i18n/messages.test.ts @@ -2,6 +2,7 @@ import { describe, expect, test } from 'bun:test'; import { dict as enDict } from './messages/en'; import { dict as esDict } from './messages/es'; +import { dict as deDict } from './messages/de'; import { dict as frDict } from './messages/fr'; import { dict as jaDict } from './messages/ja'; import { dict as koDict } from './messages/ko'; @@ -13,6 +14,7 @@ import { dict as zhTwDict } from './messages/zh-TW'; const localeDictionaries = { en: enDict, + de: deDict, fr: frDict, es: esDict, ja: jaDict, @@ -35,6 +37,7 @@ describe('i18n dictionaries', () => { test('all locales expose language label keys', () => { for (const [, dictionary] of Object.entries(localeDictionaries)) { + expect(dictionary['common.language.german']).toBeTruthy(); expect(dictionary['common.language.french']).toBeTruthy(); expect(dictionary['common.language.japanese']).toBeTruthy(); } diff --git a/packages/ui/src/lib/i18n/messages/de.settings.ts b/packages/ui/src/lib/i18n/messages/de.settings.ts new file mode 100644 index 00000000..8bc4fe64 --- /dev/null +++ b/packages/ui/src/lib/i18n/messages/de.settings.ts @@ -0,0 +1,2043 @@ +export const settingsDict = { + 'settings.providers.page.openCodeGo.title': 'OpenCode Go Nutzungsverfolgung', + 'settings.providers.page.openCodeGo.description': 'Verbinden Sie das OpenCode Go Dashboard, um rollierenden, wöchentlichen und monatlichen Verbrauch anzuzeigen.', + 'settings.providers.page.openCodeGo.workspaceId': 'Workspace-ID', + 'settings.providers.page.openCodeGo.authCookie': 'Auth-Cookie', + 'settings.providers.page.openCodeGo.help': 'Kopieren Sie die Workspace-ID aus der Dashboard-URL und den Auth-Cookie aus den Browser-Entwicklertools. OpenChamber liest niemals den Browser-Cookie-Speicher aus.', + 'settings.providers.page.openCodeGo.save': 'Speichern und validieren', + 'settings.providers.page.openCodeGo.replace': 'Ersetzen', + 'settings.providers.page.openCodeGo.validate': 'Validieren', + 'settings.providers.page.openCodeGo.delete': 'Löschen', + 'settings.providers.page.quotaCredentials.saved': '{provider}-Anmeldedaten gespeichert.', + 'settings.providers.page.openCodeGo.saveFailed': 'OpenCode Go-Anmeldedaten konnten nicht validiert werden.', + 'settings.providers.page.openCodeGo.valid': 'OpenCode Go-Anmeldedaten sind gültig.', + 'settings.providers.page.openCodeGo.invalid': 'OpenCode Go-Anmeldedaten sind ungültig oder abgelaufen.', + 'settings.providers.page.openCodeGo.deleted': 'OpenCode Go-Anmeldedaten gelöscht.', + 'settings.providers.page.openCodeGo.deleteFailed': 'OpenCode Go-Anmeldedaten konnten nicht gelöscht werden.', + 'settings.appearance.language.label': 'Sprache', + 'settings.appearance.language.description': 'Wählen Sie die Oberflächensprache.', + 'settings.appearance.language.select': 'Sprache auswählen', + 'settings.window.description': 'OpenChamber-Einstellungsfenster.', + 'settings.view.home.title': 'Einstellungen', + 'settings.view.home.description': 'Zu häufig verwendeten Seiten springen.', + 'settings.view.home.cards.providers.title': 'Anbieter', + 'settings.view.home.cards.providers.description': 'Modelle + Anmeldedaten verbinden', + 'settings.view.home.cards.agents.title': 'Agenten', + 'settings.view.home.cards.agents.description': 'Prompts, Tools, Berechtigungen', + 'settings.view.home.cards.skillsCatalog.title': 'Skills Catalog', + 'settings.view.home.cards.skillsCatalog.description': 'Skills aus Katalogen installieren', + 'settings.view.home.cards.mcp.title': 'MCP', + 'settings.view.home.cards.mcp.description': 'MCP-Server + Verbindungen konfigurieren', + 'settings.view.home.cards.plugins.title': 'Plugins', + 'settings.view.home.cards.plugins.description': 'OpenCode-Plugins verwalten', + 'settings.view.home.cards.usage.title': 'Nutzung', + 'settings.view.home.cards.usage.description': 'Kontingent + Verbrauchsübersicht', + 'settings.view.unavailable.title': 'Nicht verfügbar', + 'settings.view.unavailable.description': 'Diese Einstellungsseite ist in dieser Laufzeitumgebung nicht verfügbar.', + 'settings.view.badge.beta': 'Beta', + 'settings.view.actions.reloadOpenCode': 'OpenCode neu laden', + 'settings.view.actions.reloadOpenCodeTooltip': 'OpenCode neu starten und Konfiguration neu laden.', + 'settings.view.actions.backToSettings': 'Zurück zu Einstellungen', + 'settings.view.actions.closeSettings': 'Einstellungen schließen', + 'settings.view.actions.openSectionList': 'Abschnittsliste öffnen', + 'settings.view.actions.closeSettingsWithShortcut': 'Einstellungen schließen ({shortcut}+,)', + 'settings.view.actions.back': 'Zurück', + 'settings.view.actions.resizeNavigation': 'Einstellungsnavigation skalieren', + 'settings.view.search.placeholder': 'Einstellungen durchsuchen', + 'settings.view.search.aria': 'Einstellungen durchsuchen', + 'settings.view.search.clear': 'Einstellungsuche löschen', + 'settings.view.search.noResults': 'Keine passenden Einstellungen', + 'settings.page.projects.title': 'Projekte', + 'settings.page.remoteInstances.title': 'Remote-Instanzen', + 'settings.page.providers.title': 'Anbieter', + 'settings.page.usage.title': 'Nutzung', + 'settings.page.agents.title': 'Agenten', + 'settings.page.commands.title': 'Befehle', + 'settings.page.mcp.title': 'MCP', + 'settings.page.plugins.title': 'Plugins', + 'settings.page.skills.title': 'Skills', + 'settings.page.skillsCatalog.title': 'Skills Catalog', + 'settings.page.git.title': 'Git', + 'settings.page.appearance.title': 'Erscheinungsbild', + 'settings.page.chat.title': 'Chat', + 'settings.page.shortcuts.title': 'Tastenkombinationen', + 'settings.page.sessions.title': 'Sitzungen', + 'settings.page.magicPrompts.title': 'Magic Prompts', + 'settings.page.notifications.title': 'Benachrichtigungen', + 'settings.page.voice.title': 'Sprache', + 'settings.page.tunnel.title': 'Remote-Tunnel', + 'settings.page.about.title': 'Über', + 'settings.page.snippets.title': 'Snippets', + 'settings.snippets.sidebar.title': 'Snippets', + 'settings.snippets.sidebar.total': 'Gesamt: {count}', + 'settings.snippets.sidebar.actions.create': 'Snippet erstellen', + 'settings.snippets.sidebar.actions.more': 'Weitere Aktionen für {name}', + 'settings.snippets.sidebar.toast.deleted': 'Snippet gelöscht', + 'settings.snippets.sidebar.toast.deleteFailed': 'Snippet konnte nicht gelöscht werden', + 'settings.snippets.sidebar.dialog.deleteTitle': 'Snippet löschen?', + 'settings.snippets.sidebar.dialog.deleteDescription': 'Dadurch wird #{name} dauerhaft gelöscht.', + 'settings.snippets.page.empty.title': 'Snippet auswählen', + 'settings.snippets.page.empty.description': 'Wählen Sie ein Snippet aus der Seitenleiste, um es zu bearbeiten.', + 'settings.snippets.page.title.new': 'Neues Snippet', + 'settings.snippets.page.field.namePlaceholder': 'snippet-name', + 'settings.snippets.page.field.descriptionPlaceholder': 'Was dieses Snippet tut', + 'settings.snippets.page.field.aliases': 'Aliasse', + 'settings.snippets.page.field.aliasesPlaceholder': 'sicher, vorsichtig', + 'settings.snippets.page.field.content': 'Inhalt', + 'settings.snippets.page.field.contentPlaceholder': 'Snippet-Markdown...', + 'settings.snippets.page.hint': 'Verwenden Sie #name in Prompts. Unterstützt Aliasse und Voranstellen/Anhängen von Blöcken.', + 'settings.snippets.page.toast.nameRequired': 'Snippet-Name ist erforderlich', + 'settings.snippets.page.toast.contentRequired': 'Snippet-Inhalt ist erforderlich', + 'settings.snippets.page.toast.saveFailed': 'Snippet konnte nicht gespeichert werden', + 'settings.snippets.page.toast.saved': 'Snippet gespeichert', + 'settings.page.promptTemplates.title': 'Prompt-Vorlagen', + 'settings.promptTemplates.sidebar.title': 'Prompt-Vorlagen', + 'settings.promptTemplates.sidebar.total': 'Gesamt: {count}', + 'settings.promptTemplates.sidebar.empty.title': 'Keine Prompt-Vorlagen', + 'settings.promptTemplates.sidebar.empty.description': 'Erstellen Sie eine Prompt-Vorlage, um zu beginnen.', + 'settings.promptTemplates.sidebar.toast.deleted': 'Vorlage "{name}" gelöscht', + 'settings.promptTemplates.sidebar.toast.deleteFailed': 'Vorlage konnte nicht gelöscht werden', + 'settings.promptTemplates.sidebar.toast.nameRequired': 'Vorlagenname ist erforderlich', + 'settings.promptTemplates.sidebar.toast.renamed': 'Vorlage umbenannt', + 'settings.promptTemplates.sidebar.toast.renameFailed': 'Vorlage konnte nicht umbenannt werden', + 'settings.promptTemplates.sidebar.dialog.deleteTitle': 'Vorlage löschen?', + 'settings.promptTemplates.sidebar.dialog.deleteDescription': 'Dadurch wird "{name}" dauerhaft gelöscht. Diese Aktion kann nicht rückgängig gemacht werden.', + 'settings.promptTemplates.sidebar.renameDialog.title': 'Vorlage umbenennen', + 'settings.promptTemplates.sidebar.renameDialog.description': 'Geben Sie einen neuen Namen für "{name}" ein.', + 'settings.promptTemplates.sidebar.renameDialog.placeholder': 'Vorlagenname', + 'settings.promptTemplates.sidebar.badge.default': 'Standard', + 'settings.promptTemplates.page.empty.title': 'Vorlage auswählen', + 'settings.promptTemplates.page.empty.description': 'Wählen Sie eine Vorlage aus der Seitenleiste, um sie zu bearbeiten.', + 'settings.promptTemplates.page.title.new': 'Neue Vorlage', + 'settings.promptTemplates.page.subtitle.edit': 'Vorlage bearbeiten', + 'settings.promptTemplates.page.subtitle.new': 'Neue Prompt-Vorlage erstellen', + 'settings.promptTemplates.page.section.identity': 'Identität', + 'settings.promptTemplates.page.field.name': 'Name', + 'settings.promptTemplates.page.field.namePlaceholder': 'Vorlagenname', + 'settings.promptTemplates.page.section.template': 'Vorlage', + 'settings.promptTemplates.page.field.templatePlaceholder': 'Prompt-Vorlagentext eingeben...', + 'settings.promptTemplates.page.templateHint': 'Dieser Text wird dem Prompt des Benutzers vorangestellt, wenn er in einer Multi-Run-Gruppe ausgewählt wird.', + 'settings.promptTemplates.page.toast.nameRequired': 'Vorlagenname ist erforderlich', + 'settings.promptTemplates.page.toast.updated': 'Vorlage aktualisiert', + 'settings.promptTemplates.page.toast.updateFailed': 'Vorlage konnte nicht aktualisiert werden', + 'settings.promptTemplates.page.toast.created': 'Vorlage erstellt', + 'settings.promptTemplates.page.toast.createFailed': 'Vorlage konnte nicht erstellt werden', + 'settings.promptTemplates.page.toast.saveUnexpectedError': 'Beim Speichern ist ein unerwarteter Fehler aufgetreten', + 'settings.openchamber.tunnel.title': 'Remote-Tunnel', + 'settings.openchamber.tunnel.description': 'Sicheren Remote-Zugriff konfigurieren.', + 'settings.openchamber.tunnel.note.serverSideEnforced': 'Sicherer Tunnel-Zugriff wird serverseitig erzwungen.', + 'settings.openchamber.tunnel.note.connectLinksOneTime': 'Verbindungslinks sind einmalig.', + 'settings.openchamber.tunnel.note.cloudflareConnectorTarget': 'Cloudflare-Connector-Ziel:', + 'settings.openchamber.tunnel.note.cloudflareConnectorTargetUse': 'Als Cloudflare-Connector-Ziel verwenden Sie', + 'settings.openchamber.tunnel.note.tokensSavedPerTunnel': 'Tokens werden pro Tunnel gespeichert.', + 'settings.openchamber.tunnel.note.customConfigUsed': 'Eine benutzerdefinierte Konfigurationsdatei wird verwendet.', + 'settings.openchamber.tunnel.note.defaultConfigUsed': 'Wenn leer, verwendet cloudflared seine Standardkonfiguration.', + 'settings.openchamber.tunnel.note.managedRemoteRequiresDomain': 'Verwaltete Remote-Tunnel erfordern eine Domain.', + 'settings.openchamber.tunnel.note.managedLocalUsesConfig': 'Verwaltete lokale Tunnel verwenden Ihre cloudflared-Konfiguration.', + 'settings.openchamber.tunnel.note.startModeAndGenerateLink': 'Einen {mode}-Tunnel starten und einen einmaligen Verbindungslink generieren.', + 'settings.openchamber.tunnel.note.scanQrToConnect': 'Scannen Sie mit Ihrem Smartphone, um eine Verbindung herzustellen.', + 'settings.openchamber.tunnel.section.redeemedAccessLinks': 'Eingelöste Zugriffslinks', + 'settings.openchamber.tunnel.section.savedManagedRemoteTunnels': 'Gespeicherte verwaltete Remote-Tunnel', + 'settings.openchamber.tunnel.notAvailable.cloudflaredNotFound': 'cloudflared nicht gefunden', + 'settings.openchamber.tunnel.notAvailable.dependencyNotFound': '{dependency} wurde nicht gefunden.', + 'settings.openchamber.tunnel.notAvailable.installHint': 'Installieren Sie es, um Remote-Tunnelzugriff zu aktivieren:', + 'settings.openchamber.tunnel.field.provider': 'Anbieter', + 'settings.openchamber.tunnel.field.providerPlaceholder': 'Anbieter auswählen', + 'settings.openchamber.tunnel.field.tunnelType': 'Tunneltyp', + 'settings.openchamber.tunnel.field.connectLinkTtl': 'Verbindungslink-TTL', + 'settings.openchamber.tunnel.field.tunnelSessionTtl': 'Tunnel-Sitzungs-TTL', + 'settings.openchamber.tunnel.field.hostnameLabel': 'Hostname:', + 'settings.openchamber.tunnel.field.savedTokenAvailablePlaceholder': 'Gespeicherter Token verfügbar (optional ersetzen)', + 'settings.openchamber.tunnel.field.pasteTokenPlaceholder': 'Token für diesen Tunnel einfügen', + 'settings.openchamber.tunnel.field.newPresetNamePlaceholder': 'Tunnelname (z. B. Produktion)', + 'settings.openchamber.tunnel.field.newPresetHostnamePlaceholder': 'Hostname (z. B. oc.example.com)', + 'settings.openchamber.tunnel.field.newPresetTokenPlaceholder': 'Token', + 'settings.openchamber.tunnel.field.managedRemoteTokenInfoAria': 'Token-Info für verwalteten Remote-Tunnel', + 'settings.openchamber.tunnel.field.configurationFile': 'Konfigurationsdatei', + 'settings.openchamber.tunnel.field.configurationFilePlaceholder': 'Standard-cloudflared-Konfiguration wird verwendet', + 'settings.openchamber.tunnel.field.managedRemoteTunnelToConnect': 'Verwalteter Remote-Tunnel zur Verbindung', + 'settings.openchamber.tunnel.field.selectSavedTunnelPlaceholder': 'Gespeicherten Tunnel auswählen', + 'settings.openchamber.tunnel.field.publicUrlHint': 'Public URL', + 'settings.openchamber.tunnel.field.connectLink': 'Verbindungslink', + 'settings.openchamber.tunnel.field.expires': 'Läuft ab', + 'settings.openchamber.tunnel.field.connectQrAlt': 'Tunnel-Verbindungs-QR-Code', + 'settings.openchamber.tunnel.actions.removePresetAria': '{name} entfernen', + 'settings.openchamber.tunnel.actions.saveToken': 'Token speichern', + 'settings.openchamber.tunnel.actions.browseConfigFileAria': 'Konfigurationsdatei durchsuchen', + 'settings.openchamber.tunnel.actions.clearConfigFileAria': 'Konfigurationsdatei leeren', + 'settings.openchamber.tunnel.actions.openManagedRemoteDocs': 'Dokumentation aufrufen', + 'settings.openchamber.tunnel.actions.openManagedLocalDocs': 'Dokumentation aufrufen', + 'settings.openchamber.tunnel.actions.startTunnel': 'Tunnel starten', + 'settings.openchamber.tunnel.actions.startingTunnel': 'Tunnel wird gestartet...', + 'settings.openchamber.tunnel.actions.stopTunnel': 'Tunnel stoppen', + 'settings.openchamber.tunnel.actions.stopping': 'Wird gestoppt...', + 'settings.openchamber.tunnel.actions.newConnectLink': 'Neuer Verbindungslink', + 'settings.openchamber.tunnel.actions.copied': 'Kopiert', + 'settings.openchamber.tunnel.actions.retry': 'Wiederholen', + 'settings.openchamber.tunnel.option.moreProvidersSoon': 'Weitere Anbieter folgen bald', + 'settings.openchamber.tunnel.option.mode.quick.label': 'Schnell', + 'settings.openchamber.tunnel.option.mode.quick.tooltip': 'Quick Tunnel ohne Verfügbarkeitsgarantie.', + 'settings.openchamber.tunnel.option.mode.managedRemote.label': 'Verwaltetes Remote', + 'settings.openchamber.tunnel.option.mode.managedRemote.tooltip': 'Verwendet Ihr Cloudflare-Konto für dauerhaften Zugriff.', + 'settings.openchamber.tunnel.option.mode.managedLocal.label': 'Verwaltetes Lokal', + 'settings.openchamber.tunnel.option.mode.managedLocal.tooltip': 'Verwendet Ihre lokale cloudflared-Konfigurationsdatei.', + 'settings.openchamber.tunnel.warning.quickModeReliability': 'Für zuverlässigeren Zugriff wechseln Sie zu "Verwaltetes Remote" oder "Verwaltetes Lokal".', + 'settings.openchamber.tunnel.warning.replacesActiveTunnel': 'Das Starten ersetzt den aktiven Tunnel.', + 'settings.openchamber.tunnel.badge.quick': 'SCHNELL', + 'settings.openchamber.tunnel.badge.remote': 'REMOTE', + 'settings.openchamber.tunnel.badge.local': 'LOKAL', + 'settings.openchamber.tunnel.state.loading': 'Wird geladen', + 'settings.openchamber.tunnel.state.expired': 'Abgelaufen', + 'settings.openchamber.tunnel.state.revoked': 'Widerrufen', + 'settings.openchamber.tunnel.state.inactive': 'Inaktiv', + 'settings.openchamber.tunnel.state.noExpiry': 'Kein Ablaufdatum', + 'settings.openchamber.tunnel.state.never': 'Nie', + 'settings.openchamber.tunnel.state.tunnelReady': 'Tunnel bereit', + 'settings.openchamber.tunnel.session.redeemedAt': 'Eingelöst {time}', + 'settings.openchamber.tunnel.session.expiresIn': 'Läuft ab in {remaining}', + 'settings.openchamber.tunnel.session.inactiveWithReason': 'Inaktiv ({reason})', + 'settings.openchamber.tunnel.error.invalidConfigExtension': 'Konfigurationsdatei muss .yml, .yaml oder .json verwenden.', + 'settings.openchamber.tunnel.tooltip.tokensSavedPath': 'Tokens werden unter ~/.config/openchamber/cloudflare-managed-remote-tunnels.json gespeichert.', + 'settings.openchamber.tunnel.empty.noManagedRemoteTunnels': 'Noch keine verwalteten Remote-Tunnel gespeichert.', + 'settings.openchamber.tunnel.toast.checkAvailabilityFailed': 'Tunnel-Verfügbarkeit konnte nicht geprüft werden', + 'settings.openchamber.tunnel.toast.saveSettingsFailed': 'Tunnel-Einstellungen konnten nicht gespeichert werden', + 'settings.openchamber.tunnel.toast.saveTtlFailed': 'Tunnel-TTL-Einstellungen konnten nicht gespeichert werden', + 'settings.openchamber.tunnel.toast.saveTokenFailed': 'Token konnte nicht gespeichert werden', + 'settings.openchamber.tunnel.toast.selectOrAddManagedRemoteFirst': 'Wählen oder fügen Sie zuerst einen verwalteten Remote-Tunnel hinzu', + 'settings.openchamber.tunnel.toast.managedRemoteTokenRequiredBeforeStarting': 'Token ist vor dem Start erforderlich', + 'settings.openchamber.tunnel.toast.addManagedRemoteTokenBeforeStarting': 'Fügen Sie vor dem Start einen Token hinzu', + 'settings.openchamber.tunnel.toast.startFailed': 'Tunnel konnte nicht gestartet werden', + 'settings.openchamber.tunnel.toast.startedButNoPublicUrl': 'Tunnel gestartet, aber keine Public URL zurückgegeben', + 'settings.openchamber.tunnel.toast.replacedTunnelSingleSingle': 'Vorherigen Tunnel ersetzt: 1 Link widerrufen, 1 Sitzung ungültig.', + 'settings.openchamber.tunnel.toast.replacedTunnelSingleManySessions': 'Vorherigen Tunnel ersetzt: 1 Link widerrufen, {invalidatedSessionCount} Sitzungen ungültig.', + 'settings.openchamber.tunnel.toast.replacedTunnelManyLinksSingleSession': 'Vorherigen Tunnel ersetzt: {revokedBootstrapCount} Links widerrufen, 1 Sitzung ungültig.', + 'settings.openchamber.tunnel.toast.replacedTunnelManyMany': 'Vorherigen Tunnel ersetzt: {revokedBootstrapCount} Links widerrufen, {invalidatedSessionCount} Sitzungen ungültig.', + 'settings.openchamber.tunnel.toast.linkReady': 'Tunnel-Link bereit', + 'settings.openchamber.tunnel.toast.stopped': 'Tunnel gestoppt', + 'settings.openchamber.tunnel.toast.stopFailed': 'Tunnel konnte nicht gestoppt werden', + 'settings.openchamber.tunnel.toast.connectLinkCopied': 'Verbindungslink kopiert', + 'settings.openchamber.tunnel.toast.copyUrlFailed': 'URL konnte nicht kopiert werden', + 'settings.openchamber.tunnel.toast.saveSelectedManagedRemoteFailed': 'Ausgewählter Tunnel konnte nicht gespeichert werden', + 'settings.openchamber.tunnel.toast.tunnelNameRequired': 'Tunnelname ist erforderlich', + 'settings.openchamber.tunnel.toast.managedRemoteHostnameRequired': 'Hostname ist erforderlich', + 'settings.openchamber.tunnel.toast.managedRemoteTokenRequired': 'Token ist erforderlich', + 'settings.openchamber.tunnel.toast.hostnameAlreadyExists': 'Dieser Hostname existiert bereits', + 'settings.openchamber.tunnel.toast.managedRemoteSaved': 'Verwalteter Remote-Tunnel gespeichert', + 'settings.openchamber.tunnel.toast.managedRemoteRemoved': 'Verwalteter Remote-Tunnel entfernt', + 'settings.magicPrompts.sidebar.title': 'Magic Prompts', + 'settings.magicPrompts.sidebar.description': 'Eine Prompt-Vorlage zum Bearbeiten auswählen.', + 'settings.magicPrompts.sidebar.group.git': 'Git', + 'settings.magicPrompts.sidebar.group.github': 'GitHub', + 'settings.magicPrompts.sidebar.group.planning': 'Planung', + 'settings.magicPrompts.sidebar.group.session': 'Sitzung', + 'settings.magicPrompts.sidebar.item.gitCommitGenerate': 'Commit-Generierung', + 'settings.magicPrompts.sidebar.item.gitPrGenerate': 'PR-Generierung', + 'settings.magicPrompts.sidebar.item.gitConflictResolve': 'Merge/Rebase-Konfliktauflösung', + 'settings.magicPrompts.sidebar.item.gitCherrypickConflictResolve': 'Cherry-pick-Konfliktauflösung', + 'settings.magicPrompts.sidebar.item.githubPrReview': 'PR-Review', + 'settings.magicPrompts.sidebar.item.githubIssueReview': 'Issue-Review', + 'settings.magicPrompts.sidebar.item.githubPrFailedChecksReview': 'PR-Review fehlgeschlagener Prüfungen', + 'settings.magicPrompts.sidebar.item.githubPrCommentsReview': 'PR-Kommentar-Review', + 'settings.magicPrompts.sidebar.item.githubSinglePrCommentReview': 'Einzelner PR-Kommentar-Review', + 'settings.magicPrompts.sidebar.item.planTodo': 'Aufgabenplanung', + 'settings.magicPrompts.sidebar.item.planImprove': 'Plan verbessern', + 'settings.magicPrompts.sidebar.item.planImplement': 'Plan umsetzen', + 'settings.magicPrompts.sidebar.item.sessionSummary': 'Sitzungszusammenfassung', + 'settings.magicPrompts.sidebar.item.sessionWorkspaceReview': 'Workspace-Review', + 'settings.magicPrompts.sidebar.item.sessionExplore': 'Codebase-Tour', + 'settings.magicPrompts.sidebar.item.sessionFeaturePlan': 'Feature-Planung', + 'settings.magicPrompts.sidebar.item.sessionCraftGoal': 'Zielformulierung', + 'settings.magicPrompts.page.group.sessionCraftGoal.title': 'Zielformulierung', + 'settings.magicPrompts.page.group.sessionCraftGoal.description': 'Prompts, die vom /craft-goal-Slash-Befehl verwendet werden: sichtbare Benutzermitteilung + versteckte Anweisungen. Wandelt eine Idee oder Aufgabe in ein klares, belegbares Ziel durch geführte Entdeckung um.', + 'settings.magicPrompts.sidebar.item.sessionCatchUp': 'Nachholen', + 'settings.magicPrompts.sidebar.item.sessionDebug': 'Fehlersuche', + 'settings.magicPrompts.sidebar.item.sessionWeigh': 'Gewichtungsoptionen', + 'settings.magicPrompts.sidebar.item.sessionFusion': 'Fusion', + 'settings.remoteInstances.sidebar.title': 'Remote-Instanzen', + 'settings.remoteInstances.sidebar.total': 'Gesamt {count}', + 'settings.remoteInstances.sidebar.newSshInstanceName': 'Neue SSH-Verbindung', + 'settings.remoteInstances.sidebar.actions.addSshInstance': 'SSH-Verbindung hinzufügen', + 'settings.remoteInstances.sidebar.actions.connect': 'Verbinden', + 'settings.remoteInstances.sidebar.actions.disconnect': 'Trennen', + 'settings.remoteInstances.sidebar.actions.retry': 'Wiederholen', + 'settings.remoteInstances.sidebar.actions.remove': 'Entfernen', + 'settings.remoteInstances.sidebar.confirm.localPortInUseRetry': 'Lokaler Port ist belegt. Zufälligen Port wählen und erneut versuchen?', + 'settings.remoteInstances.sidebar.toast.createFailed': 'SSH-Verbindung konnte nicht erstellt werden', + 'settings.remoteInstances.sidebar.toast.retriedWithRandomPort': 'Mit zufälligem lokalem Port erneut versucht', + 'settings.remoteInstances.sidebar.toast.connectFailed': 'Instanz konnte nicht verbunden werden', + 'settings.remoteInstances.sidebar.toast.disconnectFailed': 'Instanz konnte nicht getrennt werden', + 'settings.remoteInstances.sidebar.toast.retryFailed': 'Verbindungswiederholung fehlgeschlagen', + 'settings.remoteInstances.sidebar.toast.removeFailed': 'Instanz konnte nicht entfernt werden', + 'settings.remoteInstances.direct.sidebarTitle': 'Server-Links', + 'settings.remoteInstances.direct.sidebarDescription': 'Mit einem Link oder Token verbinden', + 'settings.remoteInstances.direct.title': 'Andere OpenChamber-Server', + 'settings.remoteInstances.direct.description': 'Server, zu denen diese App wechseln kann. Importiere einen Verbindungslink vom anderen Server oder füge einen per Adresse hinzu.', + 'settings.remoteInstances.direct.addDialog.description': 'Füge einen weiteren OpenChamber-Server per URL hinzu. Verwende dies, wenn der Server bereits läuft und du über einen Verbindungstoken verfügst.', + 'settings.remoteInstances.direct.field.labelPlaceholder': 'Bezeichnung (optional)', + 'settings.remoteInstances.direct.field.urlPlaceholder': 'https://host:port', + 'settings.remoteInstances.direct.field.tokenPlaceholder': 'Verbindungstoken (optional für vertrauenswürdige lokale Server)', + 'settings.remoteInstances.direct.note': 'Verbindungstoken werden auf diesem Gerät gespeichert und nur verwendet, wenn diese App eine Verbindung zu diesem Server herstellt.', + 'settings.remoteInstances.direct.headers.title': 'Zusätzliche Header', + 'settings.remoteInstances.direct.headers.description': 'Optionale HTTP-Header für Desktop-API-Anfragen. Autorisierung ist für den Verbindungstoken reserviert.', + 'settings.remoteInstances.direct.headers.field.namePlaceholder': 'Header-Name', + 'settings.remoteInstances.direct.headers.field.valuePlaceholder': 'Header-Wert', + 'settings.remoteInstances.direct.headers.actions.add': 'Header hinzufügen', + 'settings.remoteInstances.direct.headers.removeAria': 'Header entfernen', + 'settings.remoteInstances.direct.actions.add': 'Server hinzufügen', + 'settings.remoteInstances.direct.import.description': 'Füge einen Verbindungslink von einem anderen OpenChamber-Server ein.', + 'settings.remoteInstances.direct.import.placeholder': 'openchamber://connect?...', + 'settings.remoteInstances.direct.import.action': 'Link importieren', + 'settings.remoteInstances.direct.error.invalidConnectLink': 'Ungültiger OpenChamber-Verbindungslink.', + 'settings.remoteInstances.direct.state.loading': 'Instanzen werden geladen...', + 'settings.remoteInstances.direct.state.empty': 'Noch keine anderen Server hinzugefügt.', + 'settings.remoteInstances.clientAuth.title': 'Mit diesem Server verbinden', + 'settings.remoteInstances.clientAuth.description': 'Erstelle einen sicheren Link oder Token, damit OpenChamber Desktop eine Verbindung zu diesem Server herstellen kann.', + 'settings.remoteInstances.clientAuth.field.labelPlaceholder': 'Gerätename — z. B. Mein iPhone', + 'settings.remoteInstances.clientAuth.actions.create': 'Token erstellen', + 'settings.remoteInstances.clientAuth.actions.pair': 'Link erstellen', + 'settings.remoteInstances.clientAuth.actions.revoke': 'Widerrufen', + 'settings.remoteInstances.clientAuth.actions.clearRevoked': 'Widerrufene löschen', + 'settings.remoteInstances.clientAuth.qrAlt': 'OpenChamber-Verbindungs-QR-Code', + 'settings.remoteInstances.clientAuth.qrEnlarge': 'QR-Code vergrößern', + 'settings.remoteInstances.clientAuth.qrScanHint': 'Scanne diesen mit der OpenChamber-App auf deinem anderen Gerät. Er ist einmalig und läuft ab.', + 'settings.remoteInstances.clientAuth.qrDialogTitle': 'Zum Verbinden scannen', + 'settings.remoteInstances.clientAuth.actions.addDevice': 'Gerät hinzufügen', + 'settings.remoteInstances.clientAuth.actions.copied': 'Kopiert', + 'settings.remoteInstances.clientAuth.addDevice.transportLabel': 'Wo wirst du dieses Gerät verwenden?', + 'settings.remoteInstances.clientAuth.addDevice.subtitle': 'Erstelle einen Einmal-QR-Code, der ein weiteres Gerät mit diesem Server verbindet.', + 'settings.remoteInstances.clientAuth.addDevice.transport.local': 'Nur diesen Computer', + 'settings.remoteInstances.clientAuth.addDevice.transport.localHint': 'Für Apps, die auf derselben Maschine laufen.', + 'settings.remoteInstances.clientAuth.addDevice.transport.lan': 'Nur Heimnetzwerk', + 'settings.remoteInstances.clientAuth.addDevice.transport.lanHint': 'Verbindet direkt über dein Wi-Fi. Funktioniert nicht außerhalb dieses Netzwerks.', + 'settings.remoteInstances.clientAuth.addDevice.transport.relay': 'Überall', + 'settings.remoteInstances.clientAuth.addDevice.transport.relayHint': 'Funktioniert zu Hause und unterwegs. Verkehr außerhalb des Heimnetzwerks geht über OpenChamber Private Relay — einen Ende-zu-Ende-verschlüsselten Tunnel. Keine Einrichtung nötig.', + 'settings.remoteInstances.clientAuth.addDevice.fallback.relay': 'Verschlüsselte Relay-Verbindung auch außerhalb des Heimnetzwerks erlauben', + 'settings.remoteInstances.clientAuth.addDevice.fallback.preferLocal': 'Direkte Heimverbindung vorziehen, wenn verfügbar', + 'settings.remoteInstances.clientAuth.addDevice.create': 'QR-Code erstellen', + 'settings.remoteInstances.clientAuth.addDevice.done': 'Fertig', + 'settings.remoteInstances.clientAuth.addDevice.connectedToast': 'Gerät verbunden.', + 'settings.remoteInstances.clientAuth.pairingUrl': 'Verbindungslink', + 'settings.remoteInstances.clientAuth.createdToken': 'Kopieren Sie jetzt diesen Token. Aus Sicherheitsgründen wird er nicht erneut angezeigt.', + 'settings.remoteInstances.clientAuth.state.loading': 'Tokens werden geladen...', + 'settings.remoteInstances.clientAuth.state.empty': 'Noch keine Geräte verbunden.', + 'settings.remoteInstances.clientAuth.state.revoked': 'Widerrufen', + 'settings.remoteInstances.clientAuth.state.thisDevice': 'Dieses Gerät', + 'settings.remoteInstances.clientAuth.state.pending': 'Warten auf Verbindung…', + 'settings.remoteInstances.clientAuth.state.viaRelay': 'Relay', + 'settings.remoteInstances.clientAuth.state.connectedDirect': 'Verbunden · Lokales Netzwerk', + 'settings.remoteInstances.clientAuth.state.connectedRelay': 'Verbunden · Relay', + 'settings.remoteInstances.clientAuth.lastUsed': 'Zuletzt verwendet {date}', + 'settings.remoteInstances.clientAuth.neverUsed': 'Nie verwendet', + 'settings.remoteInstances.relay.title': 'OpenChamber Relay', + 'settings.remoteInstances.relay.autoHint': 'Schaltet automatisch ein, wenn Sie ein Gerät über das Relay koppeln.', + 'settings.remoteInstances.relay.description': 'Lassen Sie Ihre anderen Geräte von überall aus verbinden, ohne Ports zu öffnen. Der Datenverkehr ist Ende-zu-Ende verschlüsselt – der Relay kann ihn nicht lesen.', + 'settings.remoteInstances.relay.enableHint': 'Es wird nichts geteilt, bis Sie den Relay auf diesem Server aktivieren.', + 'settings.remoteInstances.relay.actions.enable': 'Relay aktivieren', + 'settings.remoteInstances.relay.actions.disable': 'Deaktivieren', + 'settings.remoteInstances.relay.confirm.disable': 'Relay deaktivieren? Geräte, die über ihn verbunden sind, werden sofort getrennt.', + 'settings.remoteInstances.relay.state.loading': 'Relay-Status wird überprüft...', + 'settings.remoteInstances.relay.state.disabled': 'Deaktiviert', + 'settings.remoteInstances.relay.state.connecting': 'Verbindung herstellen', + 'settings.remoteInstances.relay.state.connected': 'Verbunden', + 'settings.remoteInstances.relay.state.reconnecting': 'Erneut verbinden', + 'settings.remoteInstances.relay.state.error': 'Fehler', + 'settings.remoteInstances.relay.status.clientsOne': '{count} Gerät verbunden', + 'settings.remoteInstances.relay.status.clientsMany': '{count} Geräte verbunden', + 'settings.remoteInstances.relay.pair.title': 'Gerät koppeln', + 'settings.remoteInstances.relay.pair.labelPlaceholder': 'Gerätename (optional)', + 'settings.remoteInstances.relay.pair.includeToken': 'Zugriffstoken einbinden (Ein-Scan-Kopplung)', + 'settings.remoteInstances.relay.pair.noTokenHint': 'Ohne Token meldet sich das Gerät mit dem UI-Kennwort dieses Servers an, nachdem es verbunden ist.', + 'settings.remoteInstances.relay.pair.generate': 'Kopplungslink erstellen', + 'settings.remoteInstances.relay.pair.requiresConnected': 'Kopplung wird verfügbar, sobald der Relay verbunden ist.', + 'settings.remoteInstances.relay.pair.linkLabel': 'Kopplungslink', + 'settings.remoteInstances.relay.pair.warning': 'Dieser Link gewährt Zugriff auf diesen Server. Teile ihn nicht.', + 'settings.remoteInstances.relay.pair.qrAlt': 'Relay-Kopplungs-QR-Code', + 'settings.remoteInstances.relay.pair.showQr': 'QR-Code anzeigen', + 'settings.remoteInstances.relay.pair.qrDialogTitle': 'Zum Koppeln scannen', + 'settings.remoteInstances.relay.pair.qrDialogDescription': 'Scanne diesen QR-Code mit der OpenChamber-App auf deinem anderen Gerät.', + 'settings.remoteInstances.relay.pair.manageHint': 'Verwalte oder widerrufe gekoppelte Geräte in der Liste „Mit diesem Server verbinden“ oben.', + 'settings.remoteInstances.relay.toast.enableFailed': 'Aktivierung des Relays fehlgeschlagen', + 'settings.remoteInstances.relay.toast.disableFailed': 'Deaktivierung des Relays fehlgeschlagen', + 'settings.remoteInstances.relay.toast.offerFailed': 'Erstellung des Kopplungslinks fehlgeschlagen', + 'settings.remoteInstances.relay.toast.linkCopied': 'Kopplungslink kopiert', + 'settings.remoteInstances.sidebar.phase.ready': 'Bereit', + 'settings.remoteInstances.sidebar.phase.error': 'Fehler', + 'settings.remoteInstances.sidebar.phase.reconnect': 'Wiederverbinden', + 'settings.remoteInstances.sidebar.phase.installing': 'Wird installiert', + 'settings.remoteInstances.sidebar.phase.updating': 'Wird aktualisiert', + 'settings.remoteInstances.sidebar.phase.forwarding': 'Weiterleitung aktiv', + 'settings.remoteInstances.sidebar.phase.starting': 'Wird gestartet', + 'settings.remoteInstances.sidebar.phase.connecting': 'Verbindung wird hergestellt', + 'settings.remoteInstances.sidebar.phase.idle': 'Leerlauf', + 'settings.remoteInstances.page.section.instance': 'Instanz', + 'settings.remoteInstances.page.section.instanceDescription': 'SSH-Befehl und Anzeigename für diese Verbindung wählen.', + 'settings.remoteInstances.page.field.mode': 'Modus', + 'settings.remoteInstances.page.field.modeHint': 'Wählen Sie, ob OpenChamber den Server starten soll oder ob Sie sich zu einem laufenden verbinden.', + 'settings.remoteInstances.page.field.modePlaceholder': 'Modus auswählen', + 'settings.remoteInstances.page.field.modeManaged': 'Für mich starten', + 'settings.remoteInstances.page.field.modeExternal': 'Läuft bereits', + 'settings.remoteInstances.page.field.preferredRemotePort': 'Bevorzugter Remote-Port', + 'settings.remoteInstances.page.field.preferredRemotePortHint': 'Leer lassen für automatische Auswahl.', + 'settings.remoteInstances.page.field.keepServerRunning': 'Server am Laufen halten', + 'settings.remoteInstances.page.field.keepServerRunningHint': 'OpenChamber auf der Remote-Maschine weiterlaufen lassen nach Verbindungstrennung.', + 'settings.remoteInstances.page.field.bindHost': 'Bind-Host', + 'settings.remoteInstances.page.field.bindHostHint': 'Verwenden Sie 127.0.0.1 oder localhost, es sei denn, Sie benötigen LAN-Zugriff.', + 'settings.remoteInstances.page.field.preferredLocalPort': 'Bevorzugter lokaler Port', + 'settings.remoteInstances.page.field.preferredLocalPortHint': 'Leer lassen für automatische Auswahl.', + 'settings.remoteInstances.page.field.forwardType': 'Weiterleitungstyp', + 'settings.remoteInstances.page.field.localHostPlaceholder': '127.0.0.1', + 'settings.remoteInstances.page.field.remoteHostPlaceholder': '127.0.0.1', + 'settings.remoteInstances.page.field.auto': 'Automatisch', + 'settings.remoteInstances.page.confirm.bindAllInterfaces': 'Das Binden an 0.0.0.0 macht Ports für Ihr lokales Netzwerk sichtbar. Fortfahren?', + 'settings.remoteInstances.page.preview.localSocks5': '(lokales SOCKS5)', + 'settings.remoteInstances.page.preview.local': '(lokal)', + 'settings.remoteInstances.page.preview.remote': '(remote)', + 'settings.remoteInstances.page.toast.openLocalEndpointFailed': 'Lokale Adresse konnte nicht geöffnet werden', + 'settings.remoteInstances.page.toast.localUrlCopied': 'Lokale URL kopiert', + 'settings.remoteInstances.page.actions.copyLocalUrl': 'Lokale URL kopieren', + 'settings.remoteInstances.page.actions.open': 'Öffnen', + 'settings.remoteInstances.page.logsDialog.selectedInstanceFallback': 'Ausgewählte Instanz', + 'settings.remoteInstances.page.patternDialog.descriptionWithHost': '{host} erfordert ein konkretes Ziel.', + 'settings.remoteInstances.page.patternDialog.description': 'Ziel eingeben.', + 'settings.common.actions.cancel': 'Abbrechen', + 'settings.common.actions.create': 'Erstellen', + 'settings.common.actions.delete': 'Löschen', + 'settings.common.actions.reset': 'Zurücksetzen', + 'settings.common.actions.rename': 'Umbenennen', + 'settings.common.actions.duplicate': 'Duplizieren', + 'settings.common.actions.import': 'Importieren', + 'settings.common.actions.copyAll': 'Alles kopieren', + 'settings.common.actions.clear': 'Leeren', + 'settings.common.actions.saving': 'Wird gespeichert...', + 'settings.common.actions.saveChanges': 'Änderungen speichern', + 'settings.common.scope.global': 'Global', + 'settings.common.scope.project': 'Projekt', + 'settings.common.field.description': 'Beschreibung', + 'settings.common.badge.new': 'Neu', + 'settings.common.badge.modified': 'Geändert', + 'settings.common.permission.allow': 'Erlauben', + 'settings.common.permission.ask': 'Fragen', + 'settings.common.permission.deny': 'Ablehnen', + 'settings.common.state.comingSoon': 'Demnächst verfügbar...', + 'settings.projects.actions.title': 'Aktionen', + 'settings.projects.actions.description': 'Projektspezifische Befehle im Header.', + 'settings.projects.actions.validation.fillNameAndCommand': 'Bitte Aktionsname und Befehl ausfüllen.', + 'settings.projects.actions.state.loading': 'Wird geladen...', + 'settings.projects.actions.state.empty': 'Noch keine Aktionen konfiguriert.', + 'settings.projects.actions.state.untitled': 'Unbenannte Aktion', + 'settings.projects.actions.state.noDesktopSshForwards': 'Keine aktivierten lokalen SSH-Weiterleitungen verfügbar.', + 'settings.projects.actions.field.selectIconAria': 'Symbol auswählen', + 'settings.projects.actions.field.iconAria': 'Symbol {icon}', + 'settings.projects.actions.field.actionNamePlaceholder': 'Aktionsname', + 'settings.projects.actions.field.command': 'Befehl', + 'settings.projects.actions.field.commandPlaceholder': 'z. B. bun run lint', + 'settings.projects.actions.field.autoOpenUrl': 'URL automatisch öffnen', + 'settings.projects.actions.field.autoOpenUrlForAria': 'URL für {title} automatisch öffnen', + 'settings.projects.actions.field.autoOpenUrlDescription': 'URL aus der Ausgabe oder benutzerdefinierte URL unten öffnen', + 'settings.projects.actions.field.overrideUrlPlaceholder': 'URL überschreiben (optional)', + 'settings.projects.actions.field.overrideUrlTooltip': 'Wenn dieses Feld ausgefüllt ist, wird die benutzerdefinierte URL verwendet. Wenn leer, öffnet die App die beste URL aus der Ausgabe.', + 'settings.projects.actions.field.desktopSshForward': 'Desktop SSH-Weiterleitung', + 'settings.projects.actions.field.useOutputManualUrl': 'Ausgabe-/manuelle URL verwenden', + 'settings.projects.actions.actions.add': 'Aktion hinzufügen', + 'settings.projects.actions.actions.save': 'Aktionen speichern', + 'settings.projects.actions.toast.saveFailed': 'Aktionen konnten nicht gespeichert werden', + 'settings.projects.actions.toast.saved': 'Projektaktionen gespeichert', + 'settings.openchamber.about.title': 'Über OpenChamber', + 'settings.openchamber.about.field.version': 'Version', + 'settings.openchamber.about.field.openCodeVersion': 'OpenCode-Version', + 'settings.openchamber.about.state.checking': 'Wird geprüft...', + 'settings.openchamber.about.state.upToDate': 'Aktuell', + 'settings.openchamber.about.state.unknown': 'unbekannt', + 'settings.openchamber.about.actions.checkUpdates': 'Updates prüfen', + 'settings.openchamber.about.actions.update': 'Aktualisieren', + 'settings.openchamber.about.actions.updateToVersion': 'Auf {version} aktualisieren', + 'settings.openchamber.about.actions.checkForUpdates': 'Nach Updates suchen', + 'settings.openchamber.about.toast.latestVersion': 'Sie verwenden die neueste Version', + 'settings.agents.sidebar.title': 'Agents', + 'settings.agents.sidebar.total': 'Gesamt {count}', + 'settings.agents.sidebar.empty.title': 'Keine Agents konfiguriert', + 'settings.agents.sidebar.empty.description': 'Verwenden Sie die Schaltfläche + oben, um einen zu erstellen', + 'settings.agents.sidebar.section.builtIn': 'Integrierte Agents', + 'settings.agents.sidebar.section.custom': 'Benutzerdefinierte Agents', + 'settings.agents.sidebar.badge.system': 'system', + 'settings.agents.sidebar.dialog.deleteTitle': 'Agent löschen', + 'settings.agents.sidebar.dialog.resetTitle': 'Agent zurücksetzen', + 'settings.agents.sidebar.dialog.deleteDescription': 'Möchten Sie den Agent "{name}" wirklich löschen?', + 'settings.agents.sidebar.dialog.resetDescription': 'Möchten Sie den Agent "{name}" wirklich auf seine Standardkonfiguration zurücksetzen?', + 'settings.agents.sidebar.renameDialog.title': 'Agent umbenennen', + 'settings.agents.sidebar.renameDialog.description': 'Geben Sie einen neuen Namen für den Agent "@{name}" ein', + 'settings.agents.sidebar.renameDialog.placeholder': 'Neuer Agent-Name...', + 'settings.agents.sidebar.toast.builtInCannotDelete': 'Integrierte Agents können nicht gelöscht werden', + 'settings.agents.sidebar.toast.agentDeleted': 'Agent "{name}" erfolgreich gelöscht', + 'settings.agents.sidebar.toast.agentReset': 'Agent "{name}" auf Standard zurückgesetzt', + 'settings.agents.sidebar.toast.deleteFailed': 'Agent konnte nicht gelöscht werden', + 'settings.agents.sidebar.toast.definitionNotFound': 'Agent-Definition nicht gefunden. Es wurden keine Änderungen vorgenommen.', + 'settings.agents.sidebar.toast.resetFailed': 'Agent konnte nicht zurückgesetzt werden', + 'settings.agents.sidebar.toast.agentNameRequired': 'Agent-Name ist erforderlich', + 'settings.agents.sidebar.toast.agentExists': 'Ein Agent mit diesem Namen existiert bereits', + 'settings.agents.sidebar.toast.removeOldAfterRenameFailed': 'Alter Agent konnte nach Umbenennung nicht entfernt werden', + 'settings.agents.sidebar.toast.renameFailed': 'Agent konnte nicht umbenannt werden', + 'settings.agents.sidebar.toast.agentRenamed': 'Agent umbenannt in "{name}"', + 'settings.agents.page.toast.permissionNameRequired': 'Berechtigungsname ist erforderlich', + 'settings.agents.page.toast.created': 'Agent erfolgreich erstellt', + 'settings.agents.page.toast.updated': 'Agent erfolgreich aktualisiert', + 'settings.agents.page.toast.createFailed': 'Agent konnte nicht erstellt werden', + 'settings.agents.page.toast.updateFailed': 'Agent konnte nicht aktualisiert werden', + 'settings.agents.page.toast.saveUnexpectedError': 'Beim Speichern ist ein Fehler aufgetreten', + 'settings.agents.page.toast.savedManualRestart': 'Auf Datenträger gespeichert. Starten Sie Ihren verbundenen OpenCode-Server neu, um die Änderungen anzuwenden.', + 'settings.agents.page.empty.title': 'Wählen Sie einen Agent aus der Seitenleiste', + 'settings.agents.page.empty.description': 'oder erstellen Sie einen neuen', + 'settings.agents.page.title.new': 'Neuer Agent', + 'settings.agents.page.subtitle.new': 'Neue Assistenten-Persona konfigurieren', + 'settings.agents.page.subtitle.edit': 'Agent-Einstellungen bearbeiten', + 'settings.agents.page.section.identityRole': 'Identität & Rolle', + 'settings.agents.page.section.modelParameters': 'Modell & Parameter', + 'settings.agents.page.section.systemPrompt': 'System-Prompt', + 'settings.agents.page.section.toolPermissions': 'Tool-Berechtigungen', + 'settings.agents.page.field.agentName': 'Agent-Name', + 'settings.agents.page.field.agentNamePlaceholder': 'agent-name', + 'settings.agents.page.field.scopePlaceholder': 'Geltungsbereich', + 'settings.agents.page.field.descriptionPlaceholder': 'Was macht dieser Agent?', + 'settings.agents.page.field.mode': 'Modus', + 'settings.agents.page.field.modeTooltip': 'Sichtbarkeit: Primär vs. Subagent', + 'settings.agents.page.field.overrideModel': 'Modell überschreiben', + 'settings.agents.page.field.temperature': 'Temperatur', + 'settings.agents.page.field.temperatureTooltip': 'Steuert die Zufälligkeit. Höher = kreativ, Niedriger = fokussiert.', + 'settings.agents.page.field.temperatureRange': '0,0 bis 2,0', + 'settings.agents.page.field.clearTemperatureAria': 'Temperatur-Überschreibung zurücksetzen', + 'settings.agents.page.field.topP': 'Top P', + 'settings.agents.page.field.topPTooltip': 'Nucleus-Sampling-Vielfalt. Niedriger = nur wahrscheinliche Token.', + 'settings.agents.page.field.topPRange': '0,0 bis 1,0', + 'settings.agents.page.field.clearTopPAria': 'Top-P-Überschreibung zurücksetzen', + 'settings.agents.page.field.variant': 'Denk-Variante', + 'settings.agents.page.field.variantTooltip': 'Steuert die Denk-/Reasoning-Tiefe für diesen Agent.', + 'settings.agents.page.field.variantHint': 'z. B. high, max, low', + 'settings.agents.page.field.variantPlaceholder': 'Standard', + 'settings.agents.page.field.systemPromptPlaceholder': 'Sie sind ein erfahrener Programmierassistent...', + 'settings.agents.page.mode.primary': 'Primär', + 'settings.agents.page.mode.subagent': 'Subagent', + 'settings.agents.page.mode.all': 'Alle', + 'settings.agents.page.permissions.defaultLabel': 'Standard', + 'settings.agents.page.permissions.hideEditor': 'Editor ausblenden', + 'settings.agents.page.permissions.advancedEditor': 'Erweiterter Editor', + 'settings.agents.page.permissions.globalSummary': 'Global: {summary}', + 'settings.agents.page.permissions.rulesSummary': 'Regeln: {summary}', + 'settings.agents.page.permissions.globalDefault': 'Globaler Standard', + 'settings.agents.page.permissions.pattern': 'Muster', + 'settings.agents.page.permissions.addCustomRule': 'Benutzerdefinierte Regel hinzufügen', + 'settings.agents.page.permissions.permissionPlaceholder': 'Berechtigung...', + 'settings.agents.page.permissions.patternPlaceholder': 'Muster (z. B. *)', + 'settings.page.behavior.title': 'Verhalten', + 'settings.behavior.page.title': 'Verhalten', + 'settings.behavior.page.warning.title': 'Globale Regeln werden mit Projektregeln kombiniert', + 'settings.behavior.page.warning.description': 'Hier vorgenommene Änderungen aktualisieren {path}. OpenCode berücksichtigt auch alle AGENTS.md-Regeln auf Projektebene, sofern vorhanden.', + 'settings.behavior.page.section.systemPrompt': 'Globale AGENTS.md', + 'settings.behavior.page.field.systemPromptPlaceholder': 'Sie sind ein hilfreicher KI-Assistent...\n\nVerwenden Sie diesen Bereich, um absolute Regeln für das Verhalten der KI über alle Sitzungen und Anbieter hinweg festzulegen.', + 'settings.behavior.page.section.responseStyle': 'Antwortstil', + 'settings.behavior.page.responseStyle.tooltip': 'Wenn aktiviert, steuern diese Anweisungen, wie der Assistent in jedem neuen Gespräch antwortet.', + 'settings.behavior.page.responseStyle.enableAria': 'Antwortstil-Anweisungen aktivieren', + 'settings.behavior.page.responseStyle.enable': 'Antwortstil-Anweisungen zu neuen Gesprächen hinzufügen', + 'settings.behavior.page.responseStyle.preset': 'Voreinstellung', + 'settings.behavior.page.responseStyle.option.concise': 'Prägnant', + 'settings.behavior.page.responseStyle.option.detailed': 'Detailliert', + 'settings.behavior.page.responseStyle.option.mentor': 'Mentor', + 'settings.behavior.page.responseStyle.option.pushback': 'Kritisch hinterfragen', + 'settings.behavior.page.responseStyle.option.noFiller': 'Ohne Fülltext', + 'settings.behavior.page.responseStyle.option.matchEnergy': 'Meinem Ton anpassen', + 'settings.behavior.page.responseStyle.option.warmPeer': 'Freundlich & kollegial', + 'settings.behavior.page.responseStyle.option.custom': 'Benutzerdefiniert', + 'settings.behavior.page.responseStyle.customPlaceholder': 'Schreiben Sie die Anweisung, die der ersten Nachricht hinzugefügt werden soll...', + 'settings.behavior.page.toast.saved': 'Verhalten erfolgreich gespeichert', + 'settings.behavior.page.toast.saveFailed': 'Verhalten konnte nicht gespeichert werden', + 'settings.commands.sidebar.title': 'Befehle', + 'settings.commands.sidebar.total': 'Gesamt {count}', + 'settings.commands.sidebar.empty.title': 'Keine Befehle konfiguriert', + 'settings.commands.sidebar.empty.description': 'Verwenden Sie die Schaltfläche + oben, um einen zu erstellen', + 'settings.commands.sidebar.section.builtIn': 'Integrierte Befehle', + 'settings.commands.sidebar.section.custom': 'Benutzerdefinierte Befehle', + 'settings.commands.sidebar.dialog.deleteTitle': 'Befehl löschen', + 'settings.commands.sidebar.dialog.resetTitle': 'Befehl zurücksetzen', + 'settings.commands.sidebar.dialog.deleteDescription': 'Möchten Sie den Befehl "{name}" wirklich löschen?', + 'settings.commands.sidebar.dialog.resetDescription': 'Möchten Sie den Befehl "{name}" wirklich auf seine Standardkonfiguration zurücksetzen?', + 'settings.commands.sidebar.renameDialog.title': 'Befehl umbenennen', + 'settings.commands.sidebar.renameDialog.description': 'Geben Sie einen neuen Namen für den Befehl "/{name}" ein', + 'settings.commands.sidebar.renameDialog.placeholder': 'Neuer Befehlsname...', + 'settings.commands.sidebar.toast.builtInCannotDelete': 'Integrierte Befehle können nicht gelöscht werden', + 'settings.commands.sidebar.toast.commandDeleted': 'Befehl "{name}" erfolgreich gelöscht', + 'settings.commands.sidebar.toast.commandReset': 'Befehl "{name}" auf Standard zurückgesetzt', + 'settings.commands.sidebar.toast.deleteFailed': 'Befehl konnte nicht gelöscht werden', + 'settings.commands.sidebar.toast.resetFailed': 'Befehl konnte nicht zurückgesetzt werden', + 'settings.commands.sidebar.toast.commandNameRequired': 'Befehlsname ist erforderlich', + 'settings.commands.sidebar.toast.commandExists': 'Ein Befehl mit diesem Namen existiert bereits', + 'settings.commands.sidebar.toast.removeOldAfterRenameFailed': 'Alter Befehl konnte nach Umbenennung nicht entfernt werden', + 'settings.commands.sidebar.toast.renameFailed': 'Befehl konnte nicht umbenannt werden', + 'settings.commands.page.toast.templateRequired': 'Befehlsvorlage ist erforderlich', + 'settings.commands.page.toast.created': 'Befehl erfolgreich erstellt', + 'settings.commands.page.toast.updated': 'Befehl erfolgreich aktualisiert', + 'settings.commands.page.toast.createFailed': 'Befehl konnte nicht erstellt werden', + 'settings.commands.page.toast.updateFailed': 'Befehl konnte nicht aktualisiert werden', + 'settings.commands.page.toast.saveUnexpectedError': 'Beim Speichern ist ein Fehler aufgetreten', + 'settings.commands.page.empty.title': 'Wählen Sie einen Befehl aus der Seitenleiste', + 'settings.commands.page.empty.description': 'oder erstellen Sie einen neuen', + 'settings.commands.page.title.new': 'Neuer Befehl', + 'settings.commands.page.subtitle.new': 'Neuen Slash-Befehl konfigurieren', + 'settings.commands.page.subtitle.edit': 'Befehlseinstellungen bearbeiten', + 'settings.commands.page.section.identity': 'Identität', + 'settings.commands.page.section.executionContext': 'Ausführungskontext', + 'settings.commands.page.section.template': 'Befehlsvorlage', + 'settings.commands.page.field.commandName': 'Befehlsname', + 'settings.commands.page.field.commandNamePlaceholder': 'befehlsname', + 'settings.commands.page.field.descriptionPlaceholder': 'Was macht dieser Befehl?', + 'settings.commands.page.field.overrideAgent': 'Agent überschreiben', + 'settings.commands.page.field.templatePlaceholder': 'Ihre Befehlsvorlage hier...', + 'settings.commands.page.templateHint.userInput': 'Benutzereingabe', + 'settings.commands.page.templateHint.shellOutput': 'Shell-Ausgabe', + 'settings.commands.page.templateHint.fileContents': 'Dateiinhalt', + 'settings.commands.agentSelector.title': 'Agent auswählen', + 'settings.commands.agentSelector.notSelected': 'Nicht ausgewählt', + 'settings.commands.agentSelector.selectAgentPlaceholder': 'Agent auswählen...', + 'settings.gitIdentities.page.section.title': 'Identitäten', + 'settings.gitIdentities.page.empty.title': 'Keine Identitäten konfiguriert', + 'settings.gitIdentities.page.empty.description': 'Erstellen Sie eine, um Git-Autoreneinstellungen pro Projekt zu verwalten', + 'settings.gitIdentities.page.discoveredCredentials.title': 'Gefunden in ~/.git-credentials', + 'settings.gitIdentities.page.badge.default': 'Standard', + 'settings.gitIdentities.page.actions.setAsDefault': 'Als Standard festlegen', + 'settings.gitIdentities.page.actions.unsetDefault': 'Standard aufheben', + 'settings.gitIdentities.page.actions.import': 'Importieren', + 'settings.gitIdentities.page.toast.updateDefaultFailed': 'Standard-Identität konnte nicht aktualisiert werden', + 'settings.gitIdentities.page.toast.defaultUpdated': 'Standard-Identität aktualisiert', + 'settings.gitIdentities.page.toast.defaultUnset': 'Standard-Identität aufgehoben', + 'settings.gitIdentities.page.toast.profileDeleted': 'Profil "{name}" gelöscht', + 'settings.gitIdentities.page.toast.deleteProfileFailed': 'Profil konnte nicht gelöscht werden', + 'settings.gitIdentities.page.deleteDialog.title': 'Profil löschen', + 'settings.gitIdentities.page.deleteDialog.description': 'Möchten Sie "{name}" wirklich löschen?', + 'settings.gitIdentities.editor.title.importCredential': 'Anmeldedaten importieren', + 'settings.gitIdentities.editor.title.newIdentity': 'Neue Identität', + 'settings.gitIdentities.editor.title.globalIdentity': 'Globale Identität', + 'settings.gitIdentities.editor.title.editIdentity': 'Identität bearbeiten', + 'settings.gitIdentities.editor.description.globalReadOnly': 'Systemweite Git-Identität (schreibgeschützt)', + 'settings.gitIdentities.editor.description.newProfile': 'Neues Git-Identitätsprofil erstellen', + 'settings.gitIdentities.editor.description.editProfile': 'Identitätsprofil-Einstellungen bearbeiten', + 'settings.gitIdentities.editor.section.commitSigning': 'Commit-Signierung', + 'settings.gitIdentities.editor.field.profileName': 'Profilname', + 'settings.gitIdentities.editor.field.profileNamePlaceholder': 'Arbeitsprofil, Privat usw.', + 'settings.gitIdentities.editor.field.color': 'Farbe', + 'settings.gitIdentities.editor.field.icon': 'Icon', + 'settings.gitIdentities.editor.field.userName': 'Benutzername', + 'settings.gitIdentities.editor.field.userNameTooltip': 'Der Name, der in Git-Commit-Nachrichten angezeigt wird.', + 'settings.gitIdentities.editor.field.userNamePlaceholder': 'Max Mustermann', + 'settings.gitIdentities.editor.field.emailAddress': 'E-Mail-Adresse', + 'settings.gitIdentities.editor.field.emailAddressTooltip': 'Sollte Ihrer E-Mail-Adresse in GitHub/GitLab entsprechen.', + 'settings.gitIdentities.editor.field.emailAddressPlaceholder': 'max@beispiel.de', + 'settings.gitIdentities.editor.field.authMethod': 'Authentifizierungsmethode', + 'settings.gitIdentities.editor.field.authToken': 'Token', + 'settings.gitIdentities.editor.field.sshKeyPath': 'SSH-Schlüsselpfad', + 'settings.gitIdentities.editor.field.sshKeyPathTooltip': 'Optionaler Pfad zum privaten Schlüssel. Z. B. ~/.ssh/id_ed25519', + 'settings.gitIdentities.editor.field.sshKeyPathPlaceholder': '~/.ssh/id_ed25519', + 'settings.gitIdentities.editor.field.signCommits': 'Commits mit dieser Identität signieren', + 'settings.gitIdentities.editor.field.signingKey': 'Signierschlüssel', + 'settings.gitIdentities.editor.field.signingKeyPlaceholder': '~/.ssh/id_ed25519.pub', + 'settings.gitIdentities.editor.field.host': 'Host', + 'settings.gitIdentities.editor.field.hostTooltip': 'Das Token wird für diesen Host aus ~/.git-credentials gelesen.', + 'settings.gitIdentities.editor.field.hostPlaceholder': 'github.com', + 'settings.gitIdentities.editor.actions.close': 'Schließen', + 'settings.gitIdentities.editor.actions.create': 'Erstellen', + 'settings.gitIdentities.editor.actions.save': 'Speichern', + 'settings.gitIdentities.editor.toast.userNameEmailRequired': 'Benutzername und E-Mail sind erforderlich', + 'settings.gitIdentities.editor.toast.hostRequiredForToken': 'Host ist für tokenbasierte Authentifizierung erforderlich', + 'settings.gitIdentities.editor.toast.signingKeyRequired': 'Signierschlüssel ist erforderlich, wenn die Commit-Signierung aktiviert ist', + 'settings.gitIdentities.editor.toast.profileCreated': 'Profil erstellt', + 'settings.gitIdentities.editor.toast.profileUpdated': 'Profil aktualisiert', + 'settings.gitIdentities.editor.toast.createProfileFailed': 'Profil konnte nicht erstellt werden', + 'settings.gitIdentities.editor.toast.updateProfileFailed': 'Profil konnte nicht aktualisiert werden', + 'settings.gitIdentities.editor.toast.saveUnexpectedError': 'Beim Speichern ist ein Fehler aufgetreten', + 'settings.gitIdentities.editor.toast.profileDeleted': 'Profil gelöscht', + 'settings.gitIdentities.editor.toast.deleteProfileFailed': 'Profil konnte nicht gelöscht werden', + 'settings.gitIdentities.editor.toast.deleteUnexpectedError': 'Beim Löschen ist ein Fehler aufgetreten', + 'settings.skills.sidebar.title': 'Skills', + 'settings.skills.sidebar.total': 'Gesamt {count}', + 'settings.skills.sidebar.section.project': 'Projekt-Skills', + 'settings.skills.sidebar.section.user': 'Benutzer-Skills', + 'settings.skills.sidebar.empty.title': 'Keine Skills konfiguriert', + 'settings.skills.sidebar.empty.description': 'Verwenden Sie die Schaltfläche + oben, um einen zu erstellen', + 'settings.skills.sidebar.badge.claude': 'claude', + 'settings.skills.sidebar.badge.agents': 'agents', + 'settings.skills.sidebar.badge.opencode': 'opencode', + 'settings.skills.sidebar.toast.skillDeleted': 'Skill "{name}" erfolgreich gelöscht', + 'settings.skills.sidebar.toast.deleteSkillFailed': 'Skill konnte nicht gelöscht werden', + 'settings.skills.sidebar.toast.duplicateLoadFailed': 'Skill-Details für Duplizierung konnten nicht geladen werden', + 'settings.skills.sidebar.toast.renameLoadFailed': 'Skill-Details konnten nicht geladen werden', + 'settings.skills.sidebar.toast.removeOldAfterRenameFailed': 'Alter Skill konnte nach Umbenennung nicht entfernt werden', + 'settings.skills.sidebar.toast.renameFailed': 'Skill konnte nicht umbenannt werden', + 'settings.skills.sidebar.deleteDialog.title': 'Skill löschen', + 'settings.skills.sidebar.deleteDialog.description': 'Möchten Sie den Skill "{name}" wirklich löschen?', + 'settings.skills.sidebar.renameDialog.title': 'Skill umbenennen', + 'settings.skills.sidebar.renameDialog.description': 'Geben Sie einen neuen Namen für den Skill "{name}" ein', + 'settings.skills.sidebar.renameDialog.placeholder': 'Neuer Skill-Name...', + 'settings.skills.page.title.newSkill': 'Neuer Skill', + 'settings.skills.page.subtitle.newSkill': 'Neuen Skill konfigurieren', + 'settings.skills.page.subtitle.skillLocation': '{location} Skill', + 'settings.skills.page.section.basicInformation': 'Grundlegende Informationen', + 'settings.skills.page.section.instructions': 'Anweisungen', + 'settings.skills.page.section.supportingFiles': 'Unterstützende Dateien', + 'settings.skills.page.field.skillNameLocation': 'Skill-Name & Speicherort', + 'settings.skills.page.field.skillNameHint': 'Kleinbuchstaben, Zahlen, Bindestriche', + 'settings.skills.page.field.skillNamePlaceholder': 'skill-name', + 'settings.skills.page.field.descriptionHint': 'Der Agent verwendet dies, um zu entscheiden, wann der Skill geladen wird', + 'settings.skills.page.field.descriptionPlaceholder': 'Kurze Beschreibung, was dieser Skill tut...', + 'settings.skills.page.field.instructionsPlaceholder': 'Schritt-für-Schritt-Anweisungen, Richtlinien oder Referenzinhalte...', + 'settings.skills.page.badge.claudeCompatible': 'Claude-kompatibel', + 'settings.skills.page.badge.pending': 'Ausstehend', + 'settings.skills.page.actions.addFile': 'Datei hinzufügen', + 'settings.skills.page.actions.createSkill': 'Skill erstellen', + 'settings.skills.page.actions.createFile': 'Datei erstellen', + 'settings.skills.page.supportingFiles.empty': 'Keine unterstützenden Dateien. Verwenden Sie "Datei hinzufügen", um Referenzmaterialien einzubinden.', + 'settings.skills.page.loading.details': 'Skill-Details werden geladen...', + 'settings.skills.page.loading.fileContent': 'Dateiinhalt wird geladen...', + 'settings.skills.page.empty.title': 'Wählen Sie einen Skill aus der Seitenleiste', + 'settings.skills.page.empty.description': 'oder erstellen Sie einen neuen', + 'settings.skills.page.deleteFileDialog.title': 'Unterstützende Datei löschen', + 'settings.skills.page.deleteFileDialog.description': 'Möchten Sie "{path}" wirklich löschen?', + 'settings.skills.page.fileDialog.titleEdit': 'Unterstützende Datei bearbeiten', + 'settings.skills.page.fileDialog.titleAdd': 'Unterstützende Datei hinzufügen', + 'settings.skills.page.fileDialog.descriptionEdit': 'Dateiinhalt bearbeiten', + 'settings.skills.page.fileDialog.descriptionAdd': 'Neue Datei im Skill-Verzeichnis erstellen', + 'settings.skills.page.fileDialog.field.filePath': 'Dateipfad', + 'settings.skills.page.fileDialog.field.filePathPlaceholder': 'beispiel.md oder docs/referenz.txt', + 'settings.skills.page.fileDialog.field.filePathHint': 'Relativer Pfad innerhalb des Skill-Verzeichnisses. Unterverzeichnisse werden automatisch erstellt.', + 'settings.skills.page.fileDialog.field.content': 'Inhalt', + 'settings.skills.page.fileDialog.field.contentPlaceholder': 'Dateiinhalt...', + 'settings.skills.page.toast.skillNameRequired': 'Skill-Name ist erforderlich', + 'settings.skills.page.toast.invalidSkillName': 'Der Skill-Name muss 1–64 alphanumerische Kleinbuchstaben mit Bindestrichen enthalten', + 'settings.skills.page.toast.descriptionRequired': 'Beschreibung ist erforderlich', + 'settings.skills.page.toast.skillExists': 'Ein Skill mit diesem Namen existiert bereits', + 'settings.skills.page.toast.skillCreated': 'Skill erfolgreich erstellt', + 'settings.skills.page.toast.skillUpdated': 'Skill erfolgreich aktualisiert', + 'settings.skills.page.toast.createSkillFailed': 'Skill konnte nicht erstellt werden', + 'settings.skills.page.toast.updateSkillFailed': 'Skill konnte nicht aktualisiert werden', + 'settings.skills.page.toast.saveUnexpectedError': 'Beim Speichern ist ein Fehler aufgetreten', + 'settings.skills.page.toast.loadFileContentFailed': 'Dateiinhalt konnte nicht geladen werden', + 'settings.skills.page.toast.fileNameRequired': 'Dateiname ist erforderlich', + 'settings.skills.page.toast.fileExists': 'Eine Datei mit diesem Namen existiert bereits', + 'settings.skills.page.toast.noSkillSelected': 'Kein Skill ausgewählt', + 'settings.skills.page.toast.fileAdded': 'Datei "{path}" hinzugefügt', + 'settings.skills.page.toast.fileCreated': 'Datei "{path}" erstellt', + 'settings.skills.page.toast.fileUpdated': 'Datei "{path}" aktualisiert', + 'settings.skills.page.toast.fileRemoved': 'Datei "{path}" entfernt', + 'settings.skills.page.toast.fileDeleted': 'Datei "{path}" gelöscht', + 'settings.skills.page.toast.createFileFailed': 'Datei konnte nicht erstellt werden', + 'settings.skills.page.toast.updateFileFailed': 'Datei konnte nicht aktualisiert werden', + 'settings.skills.page.toast.deleteFileFailed': 'Datei konnte nicht gelöscht werden', + 'settings.skills.location.option.userOpencode.label': 'Benutzer / OpenCode', + 'settings.skills.location.option.userOpencode.description': 'Globaler OpenCode-Konfigurationsspeicherort', + 'settings.skills.location.option.projectOpencode.label': 'Projekt / OpenCode', + 'settings.skills.location.option.projectOpencode.description': 'Aktuelles Projekt .opencode-Speicherort', + 'settings.skills.location.option.userClaude.label': 'Benutzer / Claude', + 'settings.skills.location.option.userClaude.description': 'Globaler Claude Skills-Speicherort', + 'settings.skills.location.option.projectClaude.label': 'Projekt / Claude', + 'settings.skills.location.option.projectClaude.description': 'Aktuelles Projekt .claude-Speicherort', + 'settings.skills.location.option.userAgents.label': 'Benutzer / Agents', + 'settings.skills.location.option.userAgents.description': 'Globaler .agents-Kompatibilitätsspeicherort', + 'settings.skills.location.option.projectAgents.label': 'Projekt / Agents', + 'settings.skills.location.option.projectAgents.description': 'Aktuelles Projekt .agents-Kompatibilitätsspeicherort', + 'settings.skills.catalog.shared.field.repository': 'Repository', + 'settings.skills.catalog.shared.field.repositoryPlaceholder': 'owner/repo oder git@github.com:owner/repo.git', + 'settings.skills.catalog.shared.field.optionalSubpath': 'Optionaler Unterpfad', + 'settings.skills.catalog.shared.field.subpathPlaceholder': 'z. B. skills', + 'settings.skills.catalog.shared.field.targetLocation': 'Zielspeicherort', + 'settings.skills.catalog.shared.field.project': 'Projekt', + 'settings.skills.catalog.shared.field.noProjects': 'Keine Projekte verfügbar', + 'settings.skills.catalog.shared.field.chooseProjectPlaceholder': 'Projekt auswählen', + 'settings.skills.catalog.shared.field.searchSkillsPlaceholder': 'Skills suchen…', + 'settings.skills.catalog.shared.toast.repositoryRequired': 'Repository-Quelle ist erforderlich', + 'settings.skills.catalog.shared.toast.privateRepoNotSupportedVsCode': 'Private Repositories werden in VS Code noch nicht unterstützt', + 'settings.skills.catalog.shared.toast.foundSkills': '{count} Skill(s) gefunden', + 'settings.skills.catalog.shared.noDescription': 'Keine Beschreibung angegeben', + 'settings.skills.catalog.shared.actions.scan': 'Scannen', + 'settings.skills.catalog.shared.actions.scanning': 'Wird gescannt...', + 'settings.skills.catalog.shared.actions.install': 'Installieren', + 'settings.skills.catalog.shared.actions.installing': 'Wird installiert...', + 'settings.skills.catalog.shared.auth.title': 'Authentifizierung erforderlich', + 'settings.skills.catalog.shared.auth.description': 'Git-Identität auswählen (SSH-Schlüssel)', + 'settings.skills.catalog.shared.auth.chooseIdentity': 'Identität auswählen', + 'settings.skills.catalog.shared.auth.footerHint': 'Konfigurieren Sie Identitäten in Einstellungen - Git-Identitäten.', + 'settings.skills.catalog.shared.auth.footerHintArrow': 'Konfigurieren Sie Identitäten in Einstellungen → Git-Identitäten.', + 'settings.skills.catalog.conflicts.title': 'Fähigkeiten existieren bereits', + 'settings.skills.catalog.conflicts.description': 'Einige ausgewählte Fähigkeiten sind bereits in diesem Bereich installiert. Wählen Sie aus, ob sie übersprungen oder überschrieben werden sollen.', + 'settings.skills.catalog.conflicts.count': '{count} Konflikt(e)', + 'settings.skills.catalog.conflicts.installedIn': 'Installiert in {scope} / {source}', + 'settings.skills.catalog.conflicts.scope.user': 'Benutzer', + 'settings.skills.catalog.conflicts.scope.project': 'Projekt', + 'settings.skills.catalog.conflicts.source.opencode': 'opencode', + 'settings.skills.catalog.conflicts.source.agents': 'Agents', + 'settings.skills.catalog.conflicts.decision.skip': 'Überspringen', + 'settings.skills.catalog.conflicts.decision.overwrite': 'Überschreiben', + 'settings.skills.catalog.conflicts.actions.skipAll': 'Alle überspringen', + 'settings.skills.catalog.conflicts.actions.overwriteAll': 'Alle überschreiben', + 'settings.skills.catalog.conflicts.actions.continue': 'Weiter', + 'settings.skills.catalog.installSkill.title': 'Fähigkeit installieren', + 'settings.skills.catalog.installSkill.descriptionPrefix': 'Installiere', + 'settings.skills.catalog.installSkill.descriptionSuffix': 'in eine der vier Zielorte.', + 'settings.skills.catalog.installSkill.field.destination': 'Zielort', + 'settings.skills.catalog.installSkill.field.project': 'Projekt', + 'settings.skills.catalog.installSkill.field.noProjects': 'Keine Projekte verfügbar', + 'settings.skills.catalog.installSkill.field.chooseProjectPlaceholder': 'Projekt auswählen', + 'settings.skills.catalog.installSkill.actions.install': 'Installieren', + 'settings.skills.catalog.installSkill.actions.installing': 'Wird installiert...', + 'settings.skills.catalog.installSkill.toast.installed': 'Fertigkeit erfolgreich installiert', + 'settings.skills.catalog.installSkill.toast.authRequired': 'Authentifizierung erforderlich', + 'settings.skills.catalog.installSkill.toast.installFailed': 'Fertigkeit konnte nicht installiert werden', + 'settings.skills.catalog.add.title': 'Fertigkeiten-Katalog hinzufügen', + 'settings.skills.catalog.add.descriptionPrefix': 'Füge ein Git-Repository als neue Katalogquelle hinzu. OpenChamber durchsucht es nach Ordnern, die folgende enthalten', + 'settings.skills.catalog.add.descriptionSuffix': '.', + 'settings.skills.catalog.add.field.catalogName': 'Katalogname', + 'settings.skills.catalog.add.field.catalogNamePlaceholder': 'z. B. Team-Fertigkeiten', + 'settings.skills.catalog.add.field.repository': 'Repository', + 'settings.skills.catalog.add.field.optionalSubpath': 'Optionaler Unterpfad', + 'settings.skills.catalog.add.field.repositoryHint': 'Öffentliche Repos funktionieren überall. Private Repos benötigen SSH-Identität (Desktop/Web only).', + 'settings.skills.catalog.add.scanResult': 'Scan-Ergebnis: {count} Fertigkeit(en) gefunden', + 'settings.skills.catalog.add.duplicateMessage': 'Dieser Katalog wurde bereits hinzugefügt.', + 'settings.skills.catalog.add.actions.addCatalog': 'Katalog hinzufügen', + 'settings.skills.catalog.add.toast.repositoryRequired': 'Repository-Quelle ist erforderlich', + 'settings.skills.catalog.add.toast.authenticationRequiredScan': 'Authentifizierung erforderlich. Wähle eine Git-Identität aus und scanne erneut.', + 'settings.skills.catalog.add.toast.scanFailed': 'Repository konnte nicht gescannt werden', + 'settings.skills.catalog.add.toast.noSkillsFound': 'Keine Fertigkeiten in diesem Repository gefunden', + 'settings.skills.catalog.add.toast.catalogNameRequired': 'Katalogname ist erforderlich', + 'settings.skills.catalog.add.toast.scanBeforeAdd': 'Scanne das Repository, bevor dieser Katalog hinzugefügt wird', + 'settings.skills.catalog.add.toast.catalogAlreadyExists': 'Dieser Katalog existiert bereits', + 'settings.skills.catalog.add.toast.catalogAdded': 'Katalog hinzugefügt', + 'settings.skills.catalog.add.toast.saveFailed': 'Katalog konnte nicht gespeichert werden', + 'settings.skills.catalog.installFromRepo.title': 'Aus Git-Repository installieren', + 'settings.skills.catalog.installFromRepo.descriptionPrefix': 'Durchsuche ein Repository nach Ordnern, die folgende enthalten', + 'settings.skills.catalog.installFromRepo.descriptionSuffix': ', dann ausgewählte Fähigkeiten installieren.', + 'settings.skills.catalog.installFromRepo.repositoryHintPrefix': 'Für GitHub-Kurzform können Sie einen Unterpfad wie', + 'settings.skills.catalog.installFromRepo.authDescription': 'Wählen Sie eine Git-Identität (SSH-Schlüssel) aus, die auf dieses Repository zugreifen kann.', + 'settings.skills.catalog.installFromRepo.empty.noScanResultsTitle': 'Noch keine Scan-Ergebnisse', + 'settings.skills.catalog.installFromRepo.empty.noScanResultsDescription': 'Scannen Sie ein Repository, um Fähigkeiten zu entdecken', + 'settings.skills.catalog.installFromRepo.actions.selectAll': 'Alle auswählen', + 'settings.skills.catalog.installFromRepo.actions.selectNone': 'Nichts auswählen', + 'settings.skills.catalog.installFromRepo.actions.installSelected': 'Ausgewählte installieren', + 'settings.skills.catalog.installFromRepo.badge.installed': 'installiert ({scope}/{source})', + 'settings.skills.catalog.installFromRepo.selectedCount': 'Ausgewählt: {selected} / {total}', + 'settings.skills.catalog.installFromRepo.toast.authenticationRequiredScan': 'Authentifizierung erforderlich. Wählen Sie eine Git-Identität und versuchen Sie erneut zu scannen.', + 'settings.skills.catalog.installFromRepo.toast.authenticationRequiredInstall': 'Authentifizierung erforderlich. Wählen Sie eine Git-Identität und versuchen Sie erneut zu installieren.', + 'settings.skills.catalog.installFromRepo.toast.scanFailed': 'Fehler beim Scannen des Repositorys', + 'settings.skills.catalog.installFromRepo.toast.selectAtLeastOne': 'Wählen Sie mindestens eine Fähigkeit zur Installation aus', + 'settings.skills.catalog.installFromRepo.toast.installedCount': '{count} Fähigkeit(en) installiert', + 'settings.skills.catalog.installFromRepo.toast.installCompleted': 'Installation abgeschlossen', + 'settings.skills.catalog.installFromRepo.toast.installFailed': 'Fehler beim Installieren der Fähigkeiten', + 'settings.skills.catalog.page.mode.manual': 'Manuell', + 'settings.skills.catalog.page.mode.external': 'Extern', + 'settings.skills.catalog.page.title': 'Fähigkeitskatalog', + 'settings.skills.catalog.page.section.sourceRepository': 'Quell-Repository', + 'settings.skills.catalog.page.field.selectSourcePlaceholder': 'Quelle auswählen', + 'settings.skills.catalog.page.actions.refreshTitle': 'Aktualisieren', + 'settings.skills.catalog.page.actions.removeCatalogTitle': 'Katalog entfernen', + 'settings.skills.catalog.page.actions.addCatalog': 'Katalog hinzufügen', + 'settings.skills.catalog.page.actions.removeCatalog': 'Katalog entfernen', + 'settings.skills.catalog.page.actions.loadMoreSkills': 'Weitere Fähigkeiten laden', + 'settings.skills.catalog.page.loading.catalog': 'Wird geladen...', + 'settings.skills.catalog.page.loading.skills': 'Fähigkeiten werden geladen...', + 'settings.skills.catalog.page.loading.more': 'Wird geladen...', + 'settings.skills.catalog.page.foundCount': '{count} Fähigkeit(en) gefunden', + 'settings.skills.catalog.page.error.catalogTitle': 'Katalogfehler', + 'settings.skills.catalog.page.empty.noSkillsTitle': 'Keine Fähigkeiten gefunden', + 'settings.skills.catalog.page.empty.noSkillsDescription': 'Versuchen Sie eine andere Suche oder aktualisieren Sie den Katalog', + 'settings.skills.catalog.page.badge.installed': 'installiert ({scope})', + 'settings.skills.catalog.page.badge.notInstallable': 'nicht installierbar', + 'settings.skills.catalog.page.badge.unknown': 'unbekannt', + 'settings.skills.catalog.page.byOwnerPrefix': 'von', + 'settings.skills.catalog.page.removeDialog.title': 'Katalog entfernen', + 'settings.skills.catalog.page.removeDialog.description': 'Sind Sie sicher, dass Sie diesen Katalog entfernen möchten?', + 'settings.openchamber.passkeys.title': 'Passkeys', + 'settings.openchamber.passkeys.field.currentDevice': 'Aktuelles Gerät', + 'settings.openchamber.passkeys.actions.add': 'Passkey hinzufügen', + 'settings.openchamber.passkeys.actions.cancelSetup': 'Passkey-Einrichtung abbrechen', + 'settings.openchamber.passkeys.actions.signOutEverywhere': 'Überall abmelden', + 'settings.openchamber.passkeys.actions.signingOut': 'Abmeldung läuft…', + 'settings.openchamber.passkeys.actions.removing': 'Entfernung läuft…', + 'settings.openchamber.passkeys.state.uiPasswordRequired': 'Passkeys sind nur verfügbar, wenn die UI-Passwortsperre aktiviert ist.', + 'settings.openchamber.passkeys.state.loading': 'Passkeys werden geladen...', + 'settings.openchamber.passkeys.state.noneSaved': 'Für diesen Host wurden noch keine Passkeys gespeichert.', + 'settings.openchamber.passkeys.item.lastUsed': 'Zuletzt verwendet {time}', + 'settings.openchamber.passkeys.item.added': 'Hinzugefügt {time}', + 'settings.openchamber.passkeys.time.neverUsed': 'Nie verwendet', + 'settings.openchamber.passkeys.toast.loadFailed': 'Konnte Passkeys nicht laden.', + 'settings.openchamber.passkeys.toast.enableUiPasswordFirst': 'Aktiviere zuerst die UI-Passwortsperre, bevor du Passkeys hinzufügst.', + 'settings.openchamber.passkeys.toast.added': 'Passkey hinzugefügt', + 'settings.openchamber.passkeys.toast.setupCanceled': 'Passkey-Einrichtung abgebrochen', + 'settings.openchamber.passkeys.toast.addFailed': 'Konnte Passkey nicht hinzufügen.', + 'settings.openchamber.passkeys.toast.removed': 'Passkey entfernt', + 'settings.openchamber.passkeys.toast.removeFailed': 'Konnte Passkey nicht entfernen.', + 'settings.openchamber.passkeys.toast.clearAuthFailed': 'Konnte gespeicherte Authentifizierung nicht löschen.', + 'settings.openchamber.sessionRetention.title': 'Sitzungsaufbewahrung', + 'settings.openchamber.sessionRetention.tooltip': 'Automatisches Archivieren oder Löschen inaktiver Sitzungen basierend auf letzter Aktivität. Behält die 5 neuesten Sitzungen bei.', + 'settings.openchamber.sessionRetention.field.enableAutoCleanupAria': 'Automatische Bereinigung aktivieren', + 'settings.openchamber.sessionRetention.field.enableAutoCleanup': 'Automatische Bereinigung aktivieren', + 'settings.openchamber.sessionRetention.field.retentionPeriod': 'Aufbewahrungszeitraum', + 'settings.openchamber.sessionRetention.field.retentionPeriodAria': 'Aufbewahrungszeitraum in Tagen', + 'settings.openchamber.sessionRetention.field.days': 'Tage', + 'settings.openchamber.sessionRetention.field.whenSessionsExpire': 'Wenn Sitzungen ablaufen', + 'settings.openchamber.sessionRetention.actions.resetRetentionAria': 'Aufbewahrungszeitraum zurücksetzen', + 'settings.openchamber.sessionRetention.actions.runCleanupNow': 'Bereinigung jetzt ausführen', + 'settings.openchamber.sessionRetention.actions.cleaningUp': 'Bereinigung läuft...', + 'settings.openchamber.sessionRetention.action.archive': 'Archivieren', + 'settings.openchamber.sessionRetention.action.delete': 'Löschen', + 'settings.openchamber.sessionRetention.manualCleanup.title': 'Manuelle Bereinigung', + 'settings.openchamber.sessionRetention.manualCleanup.eligibleArchiveNow': 'Verfügbar für Archivierung jetzt: {count}', + 'settings.openchamber.sessionRetention.manualCleanup.eligibleDeleteNow': 'Verfügbar für Löschung jetzt: {count}', + 'settings.openchamber.sessionRetention.toast.noneEligibleArchive': 'Keine Sitzungen zur Archivierung verfügbar', + 'settings.openchamber.sessionRetention.toast.noneEligibleDelete': 'Keine Sitzungen zur Löschung verfügbar', + 'settings.openchamber.sessionRetention.toast.archivedCount': '{count} Sitzung(en) archiviert', + 'settings.openchamber.sessionRetention.toast.deletedCount': '{count} Sitzung(en) gelöscht', + 'settings.openchamber.sessionRetention.toast.failedArchiveCount': 'Fehler beim Archivieren von {count} Sitzung(en)', + 'settings.openchamber.sessionRetention.toast.failedDeleteCount': 'Fehler beim Löschen von {count} Sitzung(en)', + 'settings.openchamber.desktopNetwork.title': 'Desktop-Netzwerkzugriff', + 'settings.openchamber.desktopNetwork.field.windowControlsPosition': 'Position der Fenstersteuerung', + 'settings.openchamber.desktopNetwork.field.windowControlsPositionDescription': 'Wählen Sie aus, wo die Schaltflächen zum Minimieren, Maximieren und Schließen angezeigt werden. Auto folgt Ihrem Betriebssystem.', + 'settings.openchamber.desktopNetwork.field.windowControlsPositionAria': 'Position der Fenstersteuerung', + 'settings.openchamber.desktopNetwork.option.windowControlsLeft': 'Links', + 'settings.openchamber.desktopNetwork.option.windowControlsRight': 'Rechts', + 'settings.openchamber.desktopNetwork.field.launchAtLoginAria': 'OpenChamber bei Anmeldung starten', + 'settings.openchamber.desktopNetwork.field.launchAtLogin': 'OpenChamber beim Einloggen starten', + 'settings.openchamber.desktopNetwork.field.launchAtLoginDescription': 'Startet die App im Hintergrund ohne Öffnen eines Fensters. Verwenden Sie das Desktop-Statussymbol, um sie zu öffnen.', + 'settings.openchamber.desktopNetwork.field.minimizeToTrayAria': 'OpenChamber in die Systemleiste minimieren und schließen', + 'settings.openchamber.desktopNetwork.field.minimizeToTray': 'In die Systemleiste minimieren und schließen', + 'settings.openchamber.desktopNetwork.field.minimizeToTrayDescription': 'Lässt OpenChamber im Windows-Systemtray laufen, wenn das Hauptfenster minimiert oder geschlossen wird.', + 'settings.openchamber.desktopNetwork.field.keepAwakeAria': 'Computer wach halten, während OpenChamber läuft', + 'settings.openchamber.desktopNetwork.field.keepAwake': 'Computer wach halten, während OpenChamber läuft', + 'settings.openchamber.desktopNetwork.field.keepAwakeDescription': 'Verhindert den Ruhezustand des Systems, damit Geräte diese App erreichen können. Der Bildschirm kann weiterhin ausgeschaltet werden.', + 'settings.openchamber.desktopNetwork.field.allowLanAccessAria': 'LAN-Zugriff auf die Desktop-Seite erlauben', + 'settings.openchamber.desktopNetwork.field.allowLanAccess': 'Lassen Sie andere Geräte in Ihrem lokalen Netzwerk diese App öffnen', + 'settings.openchamber.desktopNetwork.field.allowLanAccessDescription': 'Startet die App neu, damit Smartphones, Tablets und andere Computer in Ihrem WLAN sie öffnen können.', + 'settings.openchamber.desktopNetwork.field.warning': 'Warnung: Solange aktiviert, ist die App für jeden im selben lokalen Netzwerk erreichbar.', + 'settings.openchamber.desktopNetwork.field.passwordRequiredWarning': 'LAN-Zugriff erfordert ein Desktop-UI-Kennwort. Bis ein Kennwort festgelegt ist, startet die Desktop-App nur lokal.', + 'settings.openchamber.desktopPassword.field.password': 'Desktop-UI-Kennwort', + 'settings.openchamber.desktopPassword.field.passwordPlaceholder': 'Kein Kennwort erforderlich', + 'settings.openchamber.desktopPassword.field.passwordDescription': 'OpenChamber fragt nach dem Neustart und dann, wenn die Anmeldesitzung abläuft: nach 12 Stunden oder 7 Tagen mit Vertrauen in dieses Gerät. Leer lassen, um die Anmeldung zu deaktivieren.', + 'settings.openchamber.desktopNetwork.hint.openAfterRestart': 'Nach dem Neustart von einem anderen Gerät aus öffnen: ', + 'settings.openchamber.desktopNetwork.hint.openNow': 'Von einem anderen Gerät aus öffnen: ', + 'settings.openchamber.desktopNetwork.actions.saveAndRestart': 'Speichern + Neustarten', + 'settings.openchamber.desktopNetwork.error.loadFailed': 'Fehler beim Laden der Desktop-Einstellungen', + 'settings.openchamber.desktopNetwork.error.saveFailed': 'Fehler beim Speichern der Desktop-Einstellungen', + 'settings.openchamber.desktopNetwork.error.savedRestartFailed': 'Gespeichert, aber Fehler beim Neustart der App', + 'settings.openchamber.desktopNetwork.error.launchAtLoginUnsupported': 'Starten bei Anmeldung wird auf diesem System nicht unterstützt', + 'settings.openchamber.desktopNetwork.error.launchAtLoginSaveFailed': 'Fehler beim Aktualisieren der Einstellung für Start bei Anmeldung', + 'settings.openchamber.desktopNetwork.error.minimizeToTrayUnsupported': 'Hintergrundmodus der Systemleiste wird auf diesem System nicht unterstützt', + 'settings.openchamber.desktopNetwork.error.minimizeToTraySaveFailed': 'Fehler beim Aktualisieren der Einstellung für Systemleiste', + 'settings.openchamber.desktopNetwork.error.keepAwakeUnsupported': 'Verhindern des Schlafens wird auf diesem System nicht unterstützt', + 'settings.openchamber.desktopNetwork.error.keepAwakeSaveFailed': 'Fehler beim Aktualisieren der Einstellung für Wachbleiben', + 'settings.openchamber.opencodeCli.title': 'OpenCode CLI', + 'settings.openchamber.opencodeCli.tooltipPrefix': 'Optionaler absoluter Pfad zur', + 'settings.openchamber.opencodeCli.tooltipSuffix': 'Binary.', + 'settings.openchamber.opencodeCli.field.binaryPath': 'OpenCode Binary-Pfad', + 'settings.openchamber.opencodeCli.field.binaryPathPlaceholder': '/Users/you/.bun/bin/opencode', + 'settings.openchamber.opencodeCli.field.showUpdateNotifications': 'OpenCode-Update-Benachrichtigungen anzeigen', + 'settings.openchamber.opencodeCli.field.showUpdateNotificationsAria': 'OpenCode-Update-Benachrichtigungen anzeigen', + 'settings.openchamber.opencodeCli.actions.browseAria': 'Nach OpenCode-Binärpfad suchen', + 'settings.openchamber.opencodeCli.actions.browse': 'Durchsuchen', + 'settings.openchamber.opencodeCli.actions.saveAndReload': 'Speichern + Neuladen', + 'settings.openchamber.opencodeCli.actions.restartingOpenCode': 'OpenCode wird neu gestartet…', + 'settings.openchamber.opencodeCli.dialog.selectBinaryTitle': 'opencode-Binärdatei auswählen', + 'settings.openchamber.opencodeCli.tipPrefix': 'Tipp: Sie können auch', + 'settings.openchamber.opencodeCli.tipMiddle': 'Umgebungsvariable verwenden, aber diese Einstellung bleibt in', + 'settings.mcp.sidebar.title': 'MCP-Server', + 'settings.mcp.sidebar.total': 'Gesamt {count}', + 'settings.mcp.sidebar.actions.refreshStatusAria': 'MCP-Status aktualisieren', + 'settings.mcp.sidebar.actions.refreshStatusTitle': 'MCP-Status aktualisieren', + 'settings.mcp.sidebar.actions.addServerTitle': 'MCP-Server hinzufügen', + 'settings.mcp.sidebar.actions.deleting': 'Wird gelöscht…', + 'settings.mcp.sidebar.empty.title': 'Keine MCP-Server konfiguriert', + 'settings.mcp.sidebar.empty.description': 'Verwenden Sie die + Schaltfläche oben, um einen hinzuzufügen', + 'settings.mcp.sidebar.group.projectServers': 'Projektserver', + 'settings.mcp.sidebar.group.userServers': 'Benutzerserver', + 'settings.mcp.sidebar.serverType.localTitle': 'Lokaler Server', + 'settings.mcp.sidebar.serverType.remoteTitle': 'Remote-Server', + 'settings.mcp.sidebar.deleteDialog.title': 'MCP-Server löschen', + 'settings.mcp.sidebar.deleteDialog.descriptionPrefix': 'Sind Sie sicher, dass Sie "{name}" löschen möchten? Dadurch wird es aus', + 'settings.mcp.sidebar.toast.deleteFailed': 'Fehler beim Löschen des MCP-Servers', + 'settings.mcp.sidebar.toast.serverDeleted': 'MCP-Server "{name}" gelöscht', + 'settings.mcp.sidebar.toast.refreshListIfStale': 'Aktualisieren Sie die MCP-Liste, wenn die Benutzeroberfläche veraltet aussieht.', + 'settings.plugins.sidebar.title': 'Plugins', + 'settings.plugins.sidebar.total': 'Gesamt {count}', + 'settings.plugins.sidebar.actions.addTitle': 'Plugin hinzufügen', + 'settings.plugins.sidebar.actions.deleting': 'Wird gelöscht…', + 'settings.plugins.sidebar.empty.title': 'Keine Plugins konfiguriert', + 'settings.plugins.sidebar.empty.description': 'Verwenden Sie die + Schaltfläche oben, um eines hinzuzufügen', + 'settings.plugins.sidebar.group.userEntries': 'Benutzerkonfiguration', + 'settings.plugins.sidebar.group.userFiles': 'Benutzer-Plugin-Datei', + 'settings.plugins.sidebar.group.projectEntries': 'Projektkonfiguration', + 'settings.plugins.sidebar.group.projectFiles': 'Projekt-Plugin-Datei', + 'settings.plugins.sidebar.kind.npm': 'npm-Paket', + 'settings.plugins.sidebar.kind.path': 'Lokaler Pfad', + 'settings.plugins.sidebar.kind.file': 'Plugin-Datei', + 'settings.plugins.sidebar.deleteDialog.title': 'Plugin löschen', + 'settings.plugins.sidebar.deleteDialog.description': 'Sind Sie sicher, dass Sie „{name}“ löschen möchten?', + 'settings.plugins.sidebar.toast.deleted': 'Plugin „{name}“ gelöscht', + 'settings.plugins.sidebar.toast.deleteFailed': 'Fehler beim Löschen des Plugins', + 'settings.plugins.page.empty.select': 'Wählen Sie ein Plugin aus, um es anzuzeigen oder zu bearbeiten', + 'settings.plugins.page.empty.add': 'Oder klicken Sie auf +, um ein neues Plugin hinzuzufügen', + 'settings.plugins.page.header.entry': 'Installiertes Plugin', + 'settings.plugins.page.header.file': 'Plugin-Datei', + 'settings.plugins.page.field.spec': 'Spezifikation', + 'settings.plugins.page.field.spec.placeholder': 'npm-package@version oder /absolute/pfad', + 'settings.plugins.page.field.options': 'Optionen (JSON)', + 'settings.plugins.page.field.options.invalidJson': 'Ungültiges JSON', + 'settings.plugins.page.field.fileName': 'Dateiname', + 'settings.plugins.page.field.content': 'Inhalt', + 'settings.plugins.page.field.scope': 'Bereich', + 'settings.plugins.scope.user': 'Benutzer', + 'settings.plugins.scope.project': 'Projekt', + 'settings.plugins.page.action.save': 'Speichern', + 'settings.plugins.page.action.discard': 'Verwerfen', + 'settings.plugins.dialog.add.title': 'Plugin hinzufügen', + 'settings.plugins.dialog.add.tab.npm': 'Von npm', + 'settings.plugins.dialog.add.tab.path': 'Von lokalem Pfad', + 'settings.plugins.dialog.add.tab.file': 'Neue Datei', + 'settings.plugins.dialog.add.action.submit': 'Hinzufügen', + 'settings.plugins.dialog.add.action.cancel': 'Abbrechen', + 'settings.plugins.toast.created': 'Plugin hinzugefügt', + 'settings.plugins.toast.updated': 'Plugin aktualisiert', + 'settings.plugins.toast.reloadFailed': 'opencode Neuladen fehlgeschlagen — Neustart erforderlich', + 'settings.plugins.validation.fileName': 'Dateiname muss klein geschrieben sein und auf .js / .ts / .mjs / .cjs enden', + 'settings.plugins.validation.specRequired': 'Spezifikation ist erforderlich', + 'settings.plugins.registry.badge.update.label': '↑ {version}', + 'settings.plugins.registry.badge.update.tooltip': 'Aktualisierung verfügbar: {current} → {latest}', + 'settings.plugins.registry.badge.malformed.tooltip': 'Spezifikation ist fehlerhaft', + 'settings.plugins.registry.badge.missingPackage.tooltip': 'Paket {name} nicht auf npm gefunden', + 'settings.plugins.registry.badge.missingVersion.tooltip': 'Version {version} von {name} nicht veröffentlicht', + 'settings.plugins.registry.badge.pathMissing.tooltip': 'Datei nicht gefunden: {path}', + 'settings.plugins.registry.badge.pathUnreadable.tooltip': 'Datei nicht lesbar: {path}', + 'settings.plugins.registry.badge.network.tooltip': 'Konnte npm-Registry nicht erreichen', + 'settings.plugins.registry.banner.updateAvailable.title': 'Update verfügbar', + 'settings.plugins.registry.banner.updateAvailable.description': '{current} → {latest}', + 'settings.plugins.registry.banner.updateAvailable.action': 'Auf {latest} aktualisieren', + 'settings.plugins.registry.banner.invalid.title': 'Ungültiges Plugin', + 'settings.plugins.registry.banner.invalid.malformed': 'Spec-Syntax ist fehlerhaft', + 'settings.plugins.registry.banner.invalid.missingPackage': 'Paket nicht auf npm gefunden', + 'settings.plugins.registry.banner.invalid.missingVersion': 'Version nicht veröffentlicht', + 'settings.plugins.registry.banner.invalid.pathMissing': 'Datei existiert nicht', + 'settings.plugins.registry.banner.invalid.pathUnreadable': 'Datei ist nicht lesbar', + 'settings.plugins.sidebar.actions.updateToLatest': 'Auf neueste Version aktualisieren', + 'settings.plugins.sidebar.actions.refresh': 'Nach Updates suchen', + 'settings.plugins.sidebar.group.updatesAvailable_one': '{count} Update verfügbar', + 'settings.plugins.sidebar.group.updatesAvailable_other': '{count} Updates verfügbar', + 'settings.plugins.toast.updatedToLatest': 'Plugin auf {version} aktualisiert', + 'settings.plugins.toast.refreshing': 'Suche nach Updates in npm…', + 'settings.plugins.toast.refreshFailed': 'Konnte npm-Registry nicht prüfen', + 'settings.openchamber.keyboardShortcuts.title': 'Tastenkombinationen', + 'settings.openchamber.keyboardShortcuts.actions.resetAll': 'Alle zurücksetzen', + 'settings.openchamber.keyboardShortcuts.actions.overwrite': 'Überschreiben', + 'settings.openchamber.keyboardShortcuts.tooltip': 'Neue Tastenkombination aufnehmen, speichern und Bindings werden sofort aktualisiert.', + 'settings.openchamber.keyboardShortcuts.overwritePrompt': 'Diese Kombination wird bereits von einem anderen Shortcut verwendet. Überschreiben und die andere Zuordnung löschen?', + 'settings.openchamber.keyboardShortcuts.field.pressKeys': 'Tasten drücken...', + 'settings.openchamber.keyboardShortcuts.error.captureFirst': 'Verwende zuerst eine Tastenkombination.', + 'settings.openchamber.keyboardShortcuts.warning.riskyBrowserShortcut': 'Diese Tastenkombination kann mit Standard-Tastenkombinationen des Browsers kollidieren. Sie wird dennoch gespeichert.', + 'settings.openchamber.keyboardShortcuts.action.open_go_to_line.label': 'Gehe zu Zeile (Datei-Editor)', + 'settings.openchamber.keyboardShortcuts.action.open_command_palette.label': 'Befehlspalette öffnen', + 'settings.openchamber.keyboardShortcuts.action.focus_input.label': 'Eingabe fokussieren', + 'settings.openchamber.keyboardShortcuts.action.open_settings.label': 'Einstellungen öffnen', + 'settings.openchamber.keyboardShortcuts.action.toggle_terminal.label': 'Terminal-Dock umschalten', + 'settings.openchamber.keyboardShortcuts.action.toggle_terminal_expanded.label': 'Terminal erweitert umschalten', + 'settings.openchamber.keyboardShortcuts.action.toggle_sidebar.label': 'Seitenleiste umschalten', + 'settings.openchamber.keyboardShortcuts.action.toggle_right_sidebar.label': 'Rechte Seitenleiste umschalten', + 'settings.openchamber.keyboardShortcuts.action.open_right_sidebar_git.label': 'Git-Tab der rechten Seitenleiste öffnen', + 'settings.openchamber.keyboardShortcuts.action.open_right_sidebar_files.label': 'Datei-Tab der rechten Seitenleiste öffnen', + 'settings.openchamber.keyboardShortcuts.action.new_chat.label': 'Neue Sitzung', + 'settings.openchamber.keyboardShortcuts.action.new_chat_worktree.label': 'Neuer Worktree-Entwurf', + 'settings.openchamber.keyboardShortcuts.action.new_mini_chat.label': 'Neues Mini-Chat-Fenster', + 'settings.openchamber.keyboardShortcuts.action.open_help.label': 'Tastenkürzel öffnen', + 'settings.openchamber.keyboardShortcuts.action.toggle_context_plan.label': 'Plan-Kontextpanel umschalten', + 'settings.openchamber.keyboardShortcuts.action.toggle_services_menu.label': 'Dienstemenü umschalten', + 'settings.openchamber.keyboardShortcuts.action.cycle_services_tab.label': 'Dienste-Tab durchschalten', + 'settings.openchamber.keyboardShortcuts.action.cycle_theme.label': 'Thema wechseln', + 'settings.openchamber.keyboardShortcuts.action.cycle_agent.label': 'Agent wechseln', + 'settings.openchamber.keyboardShortcuts.action.cycle_favorite_model_forward.label': 'Favorites Modell vorwärts durchschalten', + 'settings.openchamber.keyboardShortcuts.action.cycle_favorite_model_backward.label': 'Favorites Modell rückwärts durchschalten', + 'settings.openchamber.keyboardShortcuts.action.open_model_selector.label': 'Modellauswahl öffnen', + 'settings.openchamber.keyboardShortcuts.action.expand_input.label': 'Eingabe erweitern', + 'settings.openchamber.keyboardShortcuts.action.open_timeline_dialog.label': 'Konversations-Zeitleiste öffnen', + 'settings.openchamber.keyboardShortcuts.action.toggle_prompt_navigator.label': 'Prompt-Navigator umschalten', + 'settings.projects.sidebar.total': 'Gesamt {count}', + 'settings.projects.sidebar.actions.addProject': 'Projekt hinzufügen', + 'settings.projects.page.empty.noProjects': 'Keine Projekte verfügbar.', + 'settings.projects.page.title.default': 'Projekt-Einstellungen', + 'settings.projects.page.section.worktree': 'Arbeitsbaum', + 'settings.projects.page.field.projectName': 'Projektname', + 'settings.projects.page.field.projectNamePlaceholder': 'Projektname', + 'settings.projects.page.field.defaultModel': 'Standardmodell für neue Chats', + 'settings.projects.page.field.defaultModelDescription': 'Wird verwendet, wenn ein neuer Chat in diesem Projekt gestartet wird. Fallback auf globale Standardeinstellungen, wenn nicht gesetzt.', + 'settings.projects.page.field.accentColor': 'Akzentfarbe', + 'settings.projects.page.field.projectIcon': 'Projekt-Icon', + 'settings.projects.page.field.projectIconBackgroundAria': 'Hintergrundfarbe des Projekt-Icons', + 'settings.projects.page.field.clearIconBackgroundAria': 'Hintergrund des Icons löschen', + 'settings.projects.page.field.clearBackground': 'Hintergrund löschen', + 'settings.projects.page.field.none': 'Keine', + 'settings.projects.page.field.preview': 'Vorschau', + 'settings.projects.page.actions.uploadIcon': 'Icon hochladen', + 'settings.projects.page.actions.uploading': 'Hochladen...', + 'settings.projects.page.actions.discoverFavicon': 'Favicon entdecken', + 'settings.projects.page.actions.discovering': 'Entdecken...', + 'settings.projects.page.actions.removeProjectIcon': 'Projekt-Icon entfernen', + 'settings.projects.page.actions.removing': 'Entfernen...', + 'settings.projects.page.actions.undoRemove': 'Entfernen rückgängig machen', + 'settings.projects.page.toast.uploadIconFailed': 'Fehler beim Hochladen des Projekt-Icons', + 'settings.projects.page.toast.iconUpdated': 'Projekt-Icon aktualisiert', + 'settings.projects.page.toast.removeIconFailed': 'Fehler beim Entfernen des Projekt-Symbols', + 'settings.projects.page.toast.iconRemoved': 'Projekt-Symbol entfernt', + 'settings.projects.page.toast.discoverIconFailed': 'Fehler beim Suchen des Projekt-Symbols', + 'settings.projects.page.toast.customIconAlreadySet': 'Benutzerdefiniertes Symbol bereits für dieses Projekt festgelegt', + 'settings.projects.page.toast.iconDiscovered': 'Projekt-Symbol gefunden', + 'settings.projects.page.toast.saveFailed': 'Fehler beim Speichern der Projekteinstellungen', + 'settings.usage.sidebar.title': 'Nutzung', + 'settings.usage.sidebar.total': 'Gesamt {count}', + 'settings.usage.sidebar.actions.toggleAutoRefreshAria': 'Automatisches Aktualisieren umschalten', + 'settings.usage.sidebar.actions.refreshAria': 'Nutzung aktualisieren', + 'settings.usage.sidebar.actions.refreshTitle': 'Nutzung aktualisieren', + 'settings.usage.sidebar.tooltip.autoRefresh': 'Aktualisiere Nutzungsdaten automatisch in festgelegtem Intervall', + 'settings.usage.sidebar.field.intervalPlaceholder': 'Intervall', + 'settings.usage.sidebar.field.display': 'Anzeige', + 'settings.usage.sidebar.field.displayModePlaceholder': 'Anzeigemodus', + 'settings.usage.sidebar.field.displayModeUsage': 'Nutzung', + 'settings.usage.sidebar.field.displayModeRemaining': 'Verbleibendes Kontingent', + 'settings.usage.sidebar.field.showPredictions': 'Vorhersagen anzeigen', + 'settings.usage.sidebar.status.notSet': 'Nicht festgelegt', + 'settings.usage.page.empty.selectProvider': 'Wählen Sie einen Anbieter aus, um Nutzungsdetails anzuzeigen.', + 'settings.usage.page.header.providerUsage': '{provider} Nutzung', + 'settings.usage.page.header.refreshing': 'Aktualisiere Nutzung...', + 'settings.usage.page.header.lastUpdated': 'Zuletzt aktualisiert: {time}', + 'settings.usage.page.options.showInHeaderAria': 'Im Kopfmenü anzeigen', + 'settings.usage.page.options.showInHeader': 'Im Kopfmenü anzeigen', + 'settings.usage.page.options.showInHeaderTooltip': 'Wenn aktiviert, ist die Nutzung dieses Anbieters im Schnellzugriff-Menü in der App-Kopfzeile sichtbar.', + 'settings.usage.page.state.noData': 'Noch keine Nutzungsdaten verfügbar.', + 'settings.usage.page.state.refreshFailedTitle': 'Aktualisierung der Nutzungsdaten fehlgeschlagen', + 'settings.usage.page.state.providerNotConfiguredTitle': 'Anbieter nicht konfiguriert', + 'settings.usage.page.state.providerNotConfiguredDescription': 'Fügen Sie Anmeldeinformationen auf der Registerkarte \'Anbieter\' hinzu, um die Nutzungsverfolgung zu aktivieren.', + 'settings.usage.page.section.modelQuotas': 'Modell-Kontingente', + 'settings.usage.page.section.otherModels': 'Andere Modelle', + 'settings.usage.page.state.noQuotaWindowsTitle': 'Keine Kontingentfenster berichtet', + 'settings.usage.page.state.noQuotaWindowsDescription': 'Dieser Anbieter meldet derzeit keine Ratenbegrenzungen oder Nutzungsquoten.', + 'settings.usage.pace.status.onTrack': 'Im Plan', + 'settings.usage.pace.status.slightlyFast': 'Leicht zu schnell', + 'settings.usage.pace.status.tooFast': 'Zu schnell', + 'settings.usage.pace.status.usedUp': 'Verbraucht', + 'settings.usage.pace.predictionTooltip': 'Vorhergesagte Nutzung zum Fensterende basierend auf aktuellem Tempo: {prediction}', + 'settings.usage.pace.wait': 'Warten {duration}', + 'settings.usage.pace.prediction': 'Vorh.: {prediction}', + 'settings.usage.pace.rate': 'Tempo: {rate}', + 'settings.usage.pace.waitSeparator': ' · Warten ', + 'settings.usage.pace.predictionLabel': 'Vorh.: ', + 'settings.remoteInstances.page.title': 'Remote-Instanz', + 'settings.remoteInstances.page.description': 'Stellen Sie eine Verbindung zu einem anderen Computer über SSH her und öffnen Sie dort OpenChamber.', + 'settings.remoteInstances.page.empty.selectInstance': 'Wählen Sie eine Instanz aus, um ihre Einstellungen anzuzeigen und zu bearbeiten.', + 'settings.remoteInstances.page.empty.noExtraForwards': 'Keine zusätzlichen Portweiterleitungen konfiguriert.', + 'settings.remoteInstances.page.section.actions': 'Aktionen', + 'settings.remoteInstances.page.section.actionsDescription': 'Verbinden, erneut verbinden, Protokolle anzeigen oder diese Verbindung entfernen.', + 'settings.remoteInstances.page.section.remoteServer': 'OpenChamber auf dem Remote-Rechner', + 'settings.remoteInstances.page.section.remoteServerDescription': 'Wählen Sie aus, wie OpenChamber nach dem SSH-Verbindungsaufbau ausgeführt werden soll.', + 'settings.remoteInstances.page.section.mainTunnel': 'Lokaler Zugriff', + 'settings.remoteInstances.page.section.mainTunnelDescription': 'Wählen Sie die lokale Adresse, die zum Öffnen des Remote-OpenChamber-Servers verwendet wird.', + 'settings.remoteInstances.page.section.authentication': 'Authentifizierung', + 'settings.remoteInstances.page.section.authenticationDescription': 'Optionale Anmeldedaten für SSH und die Remote-OpenChamber-Benutzeroberfläche.', + 'settings.remoteInstances.page.section.portForwards': 'Portweiterleitungen', + 'settings.remoteInstances.page.section.portForwardsDescription': 'Zusätzliche Ports, die über diese SSH-Verbindung verfügbar gemacht werden sollen.', + 'settings.remoteInstances.page.field.sshCommand': 'SSH-Befehl', + 'settings.remoteInstances.page.field.sshCommandPlaceholder': 'ssh user@host', + 'settings.remoteInstances.page.field.nickname': 'Spitzname', + 'settings.remoteInstances.page.field.nicknamePlaceholder': 'Arbeitslaptop', + 'settings.remoteInstances.page.field.connectionTimeoutSeconds': 'Verbindungs-Timeout (Sekunden)', + 'settings.remoteInstances.page.field.installMethod': 'Installationsmethode', + 'settings.remoteInstances.page.field.installMethodHint': 'Wie OpenChamber auf dem Remote-Rechner platziert werden soll, wenn diese Anwendung es für Sie startet.', + 'settings.remoteInstances.page.field.selectInstallMethodPlaceholder': 'Installationsmethode auswählen', + 'settings.remoteInstances.page.field.installMethodDownloadRelease': 'Release herunterladen', + 'settings.remoteInstances.page.field.installMethodUploadBundle': 'Bundle hochladen', + 'settings.remoteInstances.page.field.selectBindHostPlaceholder': 'Bind-Host auswählen', + 'settings.remoteInstances.page.field.sshPasswordOptional': 'SSH-Passwort (optional)', + 'settings.remoteInstances.page.field.sshPasswordPlaceholder': 'SSH-Passwort eingeben', + 'settings.remoteInstances.page.field.uiPasswordOptional': 'UI-Passwort (optional)', + 'settings.remoteInstances.page.field.uiPasswordPlaceholder': 'UI-Passwort eingeben', + 'settings.remoteInstances.page.field.forwardTypeHint': 'Wählen Sie aus, welche Art von Port-Zugriff diese SSH-Verbindung bereitstellen soll.', + 'settings.remoteInstances.page.field.typePlaceholder': 'Typ', + 'settings.remoteInstances.page.forwardType.local': 'Lokal (-L)', + 'settings.remoteInstances.page.forwardType.remote': 'Entfernt (-R)', + 'settings.remoteInstances.page.forwardType.dynamic': 'Dynamisch (-D)', + 'settings.remoteInstances.page.forwardTypeDescription.local': 'Öffnet einen lokalen Port, der eine Verbindung zu etwas auf dem entfernten Rechner herstellt.', + 'settings.remoteInstances.page.forwardTypeDescription.remote': 'Öffnet einen Port auf dem entfernten Rechner, der eine Verbindung zu Ihrem Computer herstellt.', + 'settings.remoteInstances.page.forwardTypeDescription.dynamic': 'Öffnet einen lokalen SOCKS-Proxy über die SSH-Verbindung.', + 'settings.remoteInstances.page.actions.create': 'Erstellen', + 'settings.remoteInstances.page.actions.cancel': 'Abbrechen', + 'settings.remoteInstances.page.actions.connecting': 'Verbinden...', + 'settings.remoteInstances.page.actions.reconnecting': 'Neuverbinden...', + 'settings.remoteInstances.page.actions.reconnectNow': 'Jetzt neu verbinden', + 'settings.remoteInstances.page.actions.logs': 'SSH-Protokolle', + 'settings.remoteInstances.page.actions.pickRandomPort': 'Zufälligen Port wählen', + 'settings.remoteInstances.page.actions.enableForwardAria': 'Weiterleitung aktivieren', + 'settings.remoteInstances.page.actions.openLocal': 'Lokal öffnen', + 'settings.remoteInstances.page.actions.addForward': 'Weiterleitung hinzufügen', + 'settings.remoteInstances.page.import.sectionTitle': 'Gespeicherte SSH-Hosts', + 'settings.remoteInstances.page.import.loading': 'SSH-Hosts werden geladen...', + 'settings.remoteInstances.page.import.noneFound': 'Keine SSH-Hosts gefunden.', + 'settings.remoteInstances.page.import.noneAvailable': 'Keine SSH-Hosts zum Importieren verfügbar.', + 'settings.remoteInstances.page.import.patternSuffix': '(Muster)', + 'settings.remoteInstances.page.status.currentLocalUrl': 'Aktuelle lokale URL:', + 'settings.remoteInstances.page.status.reconnectStale': 'Neuverbindung scheint blockiert zu sein. Sie können es jetzt erneut versuchen.', + 'settings.remoteInstances.page.logsDialog.title': 'SSH-Protokolle', + 'settings.remoteInstances.page.logsDialog.loading': 'Protokolle werden geladen...', + 'settings.remoteInstances.page.logsDialog.empty': 'Noch keine SSH-Protokolle.', + 'settings.remoteInstances.page.patternDialog.title': 'Wählen Sie ein SSH-Ziel', + 'settings.remoteInstances.page.patternDialog.destinationPlaceholder': 'benutzer@rechner', + 'settings.remoteInstances.page.phase.resolvingConfiguration': 'Konfiguration wird aufgelöst', + 'settings.remoteInstances.page.phase.checkingAuth': 'Authentifizierung wird überprüft', + 'settings.remoteInstances.page.phase.establishingSsh': 'SSH-Verbindung wird hergestellt', + 'settings.remoteInstances.page.phase.probingRemote': 'Entfernte Maschine wird überprüft', + 'settings.remoteInstances.page.phase.installingOpenChamber': 'OpenChamber wird installiert', + 'settings.remoteInstances.page.phase.updatingOpenChamber': 'OpenChamber wird aktualisiert', + 'settings.remoteInstances.page.phase.detectingServer': 'Server wird erkannt', + 'settings.remoteInstances.page.phase.startingServer': 'Server wird gestartet', + 'settings.remoteInstances.page.phase.forwardingPorts': 'Ports werden weitergeleitet', + 'settings.remoteInstances.page.phase.reconnecting': 'Verbindung wird wiederhergestellt', + 'settings.remoteInstances.page.confirm.storeSshPasswordPlaintext': 'SSH-Kennwort im Klartext auf Festplatte speichern?', + 'settings.remoteInstances.page.confirm.storeUiPasswordPlaintext': 'UI-Kennwort im Klartext auf Festplatte speichern?', + 'settings.remoteInstances.page.confirm.removeInstance': 'Diese Remote-Instanz entfernen?', + 'settings.remoteInstances.page.toast.sshCommandRequired': 'SSH-Befehl ist erforderlich', + 'settings.remoteInstances.page.toast.saveFailed': 'Fehler beim Speichern der Instanz', + 'settings.remoteInstances.page.toast.instanceSaved': 'Instanz gespeichert', + 'settings.remoteInstances.page.toast.instanceCreated': 'Instanz erstellt', + 'settings.remoteInstances.page.toast.destinationRequired': 'Ziel ist erforderlich', + 'settings.remoteInstances.page.toast.noLogsToCopy': 'Keine Protokolle zum Kopieren', + 'settings.remoteInstances.page.toast.logsCopied': 'Protokolle kopiert', + 'settings.remoteInstances.page.toast.logsCleared': 'Protokolle gelöscht', + 'settings.remoteInstances.page.toast.clearLogsFailed': 'Fehler beim Löschen der Protokolle', + 'settings.remoteInstances.page.toast.instanceUrlUnavailable': 'Instanz-URL ist nicht verfügbar', + 'settings.remoteInstances.page.toast.connectFailed': 'Verbindung zur Instanz fehlgeschlagen', + 'settings.remoteInstances.page.toast.cancelConnectionFailed': 'Abbrechen der Verbindung fehlgeschlagen', + 'settings.remoteInstances.page.toast.disconnectFailed': 'Trennung der Instanz fehlgeschlagen', + 'settings.remoteInstances.page.toast.retryFailed': 'Wiederholung der Verbindung fehlgeschlagen', + 'settings.remoteInstances.page.toast.instanceRemoved': 'Instanz entfernt', + 'settings.remoteInstances.page.toast.removeInstanceFailed': 'Entfernen der Instanz fehlgeschlagen', + 'settings.openchamber.worktrees.state.selectProject': 'Wählen Sie ein Projekt aus, um Worktrees zu verwalten.', + 'settings.openchamber.worktrees.state.gitOnly': 'Worktree-Einstellungen sind nur für Git-Repositories verfügbar.', + 'settings.openchamber.worktrees.setup.title': 'Setup-Befehle', + 'settings.openchamber.worktrees.setup.tooltipPrefix': 'Automatisch im neuen Worktree-Verzeichnis ausführen, wenn ein Worktree erstellt wird. Verwenden Sie', + 'settings.openchamber.worktrees.setup.tooltipSuffix': 'für das Projektstammverzeichnis.', + 'settings.openchamber.worktrees.setup.loading': 'Wird geladen...', + 'settings.openchamber.worktrees.setup.commandPlaceholder': 'z. B. bun install', + 'settings.openchamber.worktrees.setup.removeCommandAria': 'Befehl entfernen', + 'settings.openchamber.worktrees.setup.addCommand': 'Befehl hinzufügen', + 'settings.openchamber.worktrees.setup.waitForCommands': 'Warten auf Setup-Befehle vor dem Erstellen oder Senden einer Sitzung', + 'settings.openchamber.worktrees.setup.waitForCommandsAria': 'Warten auf Worktree-Setup-Befehle vor dem Erstellen oder Senden einer Sitzung', + 'settings.openchamber.worktrees.setup.toast.saveFailed': 'Speichern der Worktree-Setup-Befehle fehlgeschlagen', + 'settings.openchamber.worktrees.list.title': 'Vorhandene Worktrees', + 'settings.openchamber.worktrees.list.tooltip': 'Worktrees befinden sich außerhalb des Repos (von OpenCode verwaltet). Das Löschen eines Worktrees entfernt auch verknüpfte Sitzungen.', + 'settings.openchamber.worktrees.list.loading': 'Worktrees werden geladen...', + 'settings.openchamber.worktrees.list.empty': 'Keine Worktrees für dieses Projekt gefunden', + 'settings.openchamber.worktrees.list.detachedHead': 'Detached HEAD', + 'settings.openchamber.worktrees.list.deleteWorktreeAria': 'Worktree {name} löschen', + 'settings.agents.modelSelector.title': 'Modell auswählen', + 'settings.agents.modelSelector.searchPlaceholder': 'Modelle durchsuchen', + 'settings.agents.modelSelector.selectPlaceholder': 'Modell auswählen...', + 'settings.agents.modelSelector.notSelected': 'Nicht ausgewählt', + 'settings.agents.modelSelector.noModelOptional': 'Kein Modell (optional)', + 'settings.agents.modelSelector.section.favorites': 'Favoriten', + 'settings.agents.modelSelector.section.recents': 'Kürzlich verwendet', + 'settings.agents.modelSelector.section.recent': 'Kürzlich', + 'settings.agents.modelSelector.badge.current': 'Aktuell', + 'settings.agents.modelSelector.actions.favorite': 'Favorit', + 'settings.agents.modelSelector.actions.unfavorite': 'Favorit entfernen', + 'settings.agents.modelSelector.actions.addToFavorites': 'Zu Favoriten hinzufügen', + 'settings.agents.modelSelector.actions.removeFromFavorites': 'Aus Favoriten entfernen', + 'settings.agents.modelSelector.state.noModelsFound': 'Keine Modelle gefunden', + 'settings.agents.modelSelector.keyboardHints': '↑↓ navigieren • Enter auswählen • Esc schließen', + 'settings.providers.sidebar.title': 'Anbieter', + 'settings.providers.sidebar.total': 'Gesamt {count}', + 'settings.providers.sidebar.actions.connectProviderAria': 'Anbieter verbinden', + 'settings.providers.sidebar.actions.connectProviderTitle': 'Anbieter verbinden', + 'settings.providers.sidebar.empty.title': 'Keine Anbieter gefunden', + 'settings.providers.sidebar.empty.description': 'Überprüfen Sie Ihre OpenCode-Konfiguration', + 'settings.providers.sidebar.section.userProviders': 'Benutzer-Anbieter', + 'settings.providers.sidebar.section.projectProviders': 'Projekt-Anbieter', + 'settings.providers.page.state.loading': 'Wird geladen...', + 'settings.providers.page.state.unableToLoadProviderList': 'Anbieterliste konnte nicht geladen werden', + 'settings.providers.page.empty.noProvidersDetected': 'Keine Anbieter erkannt', + 'settings.providers.page.empty.checkOpenCodeConfiguration': 'Überprüfen Sie Ihre OpenCode-Konfiguration', + 'settings.providers.page.empty.selectProviderFromSidebar': 'Wählen Sie einen Anbieter aus der Seitenleiste', + 'settings.providers.page.empty.reviewDetailsAndConfigureAuth': 'Details überprüfen und Authentifizierung konfigurieren', + 'settings.providers.page.connect.title': 'Anbieter verbinden', + 'settings.providers.page.connect.selectProviderTitle': 'Anbieter auswählen', + 'settings.providers.page.connect.providerField': 'Anbieter', + 'settings.providers.page.connect.selectProviderPlaceholder': 'Anbieter auswählen', + 'settings.providers.page.connect.searchProvidersPlaceholder': 'Suche...', + 'settings.providers.page.connect.noProvidersFound': 'Keine Anbieter gefunden', + 'settings.providers.page.connect.allProvidersConnected': 'Alle Anbieter verbunden.', + 'settings.providers.page.auth.title': 'Authentifizierung', + 'settings.providers.page.auth.loadingMethods': 'Lade Authentifizierungsmethoden...', + 'settings.providers.page.auth.apiKeyLabel': 'API-Schlüssel', + 'settings.providers.page.auth.apiKeyTooltip': 'Schlüssel werden direkt an OpenCode gesendet und nie von OpenChamber gespeichert.', + 'settings.providers.page.auth.apiKeyPlaceholder': 'sk-...', + 'settings.providers.page.auth.oauthMethodFallback': 'OAuth-Methode {index}', + 'settings.providers.page.auth.pasteAuthorizationCodePlaceholder': 'Autorisierungscode einfügen', + 'settings.providers.page.auth.connected': 'Verbunden', + 'settings.providers.page.auth.useReconnectHint': '· Verwenden Sie „Erneut verbinden“, um Anmeldedaten zu aktualisieren', + 'settings.providers.page.connectionDetails.title': 'Verbindungsdetails', + 'settings.providers.page.connectionDetails.configuredIn': 'Konfiguriert in:', + 'settings.providers.page.connectionDetails.noActiveSource': 'Keine aktive Konfigurationsquelle', + 'settings.providers.page.connectionDetails.source.authCredentials': 'Anmeldedaten', + 'settings.providers.page.connectionDetails.source.userConfig': 'Benutzerkonfiguration', + 'settings.providers.page.connectionDetails.source.projectConfig': 'Projektkonfiguration', + 'settings.providers.page.connectionDetails.source.customConfig': 'Benutzerkonfiguration', + 'settings.providers.page.models.title': 'Verfügbare Modelle', + 'settings.providers.page.models.filterPlaceholder': 'Modelle filtern...', + 'settings.providers.page.models.noModelsMatchFilter': 'Keine Modelle entsprechen diesem Filter.', + 'settings.providers.page.models.capability.toolCalling': 'Tool-Aufruf', + 'settings.providers.page.models.capability.reasoning': 'Reasoning', + 'settings.providers.page.models.capability.imageInput': 'Bildeingabe', + 'settings.providers.page.models.tokenBadge.context': 'ctx', + 'settings.providers.page.models.tokenBadge.output': 'out', + 'settings.providers.page.models.actions.hideModelFromSelectors': 'Modell aus Selektoren ausblenden', + 'settings.providers.page.models.actions.showModelInSelectors': 'Modell in Selektoren anzeigen', + 'settings.providers.page.models.actions.hideModel': 'Modell ausblenden', + 'settings.providers.page.models.actions.showModel': 'Modell anzeigen', + 'settings.providers.page.actions.saving': 'Speichern...', + 'settings.providers.page.actions.saveKey': 'Schlüssel speichern', + 'settings.providers.page.actions.connect': 'Verbinden', + 'settings.providers.page.actions.copyCode': 'Code kopieren', + 'settings.providers.page.actions.open': 'Öffnen', + 'settings.providers.page.actions.copy': 'Kopieren', + 'settings.providers.page.actions.complete': 'Vervollständigen', + 'settings.providers.page.actions.hide': 'Ausblenden', + 'settings.providers.page.actions.reconnect': 'Erneut verbinden', + 'settings.providers.page.actions.disconnecting': 'Trennen...', + 'settings.providers.page.actions.disconnect': 'Trennen', + 'settings.providers.page.actions.hideAll': 'Alle ausblenden', + 'settings.providers.page.actions.showAll': 'Alle anzeigen', + 'settings.providers.page.toast.authMethodsLoadFailed': 'Fehler beim Laden der Anbieter-Authentifizierungsmethoden', + 'settings.providers.page.toast.providerSourcesLoadFailed': 'Fehler beim Laden der Anbieter-Quellen', + 'settings.providers.page.toast.apiKeyRequired': 'API-Schlüssel ist erforderlich', + 'settings.providers.page.toast.apiKeySaveFailed': 'Fehler beim Speichern des API-Schlüssels', + 'settings.providers.page.toast.apiKeySaved': 'API-Schlüssel gespeichert', + 'settings.providers.page.toast.oauthStartFailed': 'Fehler beim Starten des OAuth-Flows', + 'settings.providers.page.toast.oauthDetailsMissing': 'Keine OAuth-Details zurückgegeben', + 'settings.providers.page.toast.completeOAuthInBrowser': 'Schließen Sie den OAuth-Flow in Ihrem Browser ab', + 'settings.providers.page.toast.oauthCompleteFailed': 'Fehler beim Abschließen des OAuth-Flows', + 'settings.providers.page.toast.oauthCompleted': 'OAuth-Verbindung abgeschlossen', + 'settings.providers.page.toast.oauthLinkCopied': 'OAuth-Link kopiert', + 'settings.providers.page.toast.oauthLinkCopyFailed': 'Fehler beim Kopieren des OAuth-Links', + 'settings.providers.page.toast.deviceCodeCopied': 'Gerätecode kopiert', + 'settings.providers.page.toast.deviceCodeCopyFailed': 'Fehler beim Kopieren des Gerätecodes', + 'settings.providers.page.toast.providerDisconnected': 'Anbieter getrennt', + 'settings.providers.page.toast.providerDisconnectFailed': 'Fehler beim Trennen des Anbieters', + 'settings.mcp.page.empty.selectServer': 'Wählen Sie einen MCP-Server aus der Seitenleiste', + 'settings.mcp.page.empty.addNewOne': 'oder fügen Sie einen neuen hinzu', + 'settings.mcp.page.header.newServer': 'Neuer MCP-Server', + 'settings.mcp.page.header.configureNewServer': 'Konfigurieren Sie einen neuen MCP-Server', + 'settings.mcp.page.header.transport': '{type} Transport', + 'settings.mcp.page.transport.local': 'Lokal · stdio', + 'settings.mcp.page.transport.remote': 'Entfernt · SSE', + 'settings.mcp.page.status.label.connected': 'Verbunden', + 'settings.mcp.page.status.label.failed': 'Fehlgeschlagen', + 'settings.mcp.page.status.label.needsAuth': 'Autorisierung erforderlich', + 'settings.mcp.page.status.label.needsRegistration': 'Registrierung erforderlich', + 'settings.mcp.page.status.description.connected': 'Verbunden und bereit, Tools und Ressourcen zu entdecken.', + 'settings.mcp.page.status.description.failedDefault': 'OpenCode konnte diesen MCP-Server nicht erreichen.', + 'settings.mcp.page.status.description.needsAuth': 'Dieser entfernte MCP-Server erfordert Autorisierung, bevor eine Verbindung hergestellt werden kann.', + 'settings.mcp.page.status.description.needsClientRegistrationDefault': 'Dieser entfernte MCP-Server erfordert Client-Registrierung, bevor die Autorisierung abgeschlossen werden kann.', + 'settings.mcp.page.status.description.disabled': 'Dieser MCP-Server ist in der Konfiguration deaktiviert.', + 'settings.mcp.page.status.description.default': 'Aktualisieren oder Testen Sie die Verbindung, um den Live-Status zu laden.', + 'settings.mcp.page.status.runtimeStatus': 'Laufzeitstatus', + 'settings.mcp.page.status.projectScopedTo': 'Projektbezogen auf {directory}', + 'settings.mcp.page.status.userScoped': 'Benutzerbezogene Konfiguration', + 'settings.mcp.page.status.activeProject': 'das aktive Projekt', + 'settings.mcp.page.actions.connect': 'Verbinden', + 'settings.mcp.page.actions.disconnect': 'Trennen', + 'settings.mcp.page.actions.authorize': 'Autorisieren', + 'settings.mcp.page.actions.reauthorize': 'Erneut autorisieren', + 'settings.mcp.page.actions.clearAuth': 'Autorisierung löschen', + 'settings.mcp.page.actions.test': 'Testen', + 'settings.mcp.page.actions.testConnection': 'Verbindung testen', + 'settings.mcp.page.actions.working': 'Arbeite...', + 'settings.mcp.page.actions.starting': 'Starte...', + 'settings.mcp.page.actions.clearing': 'Lösche...', + 'settings.mcp.page.actions.testing': 'Teste...', + 'settings.mcp.page.actions.completing': 'Abschließen...', + 'settings.mcp.page.actions.completeAuthorization': 'Autorisierung abschließen', + 'settings.mcp.page.actions.openInBrowser': 'Im Browser öffnen', + 'settings.mcp.page.actions.copyLink': 'Link kopieren', + 'settings.mcp.page.actions.deleting': 'Löschen…', + 'settings.mcp.page.auth.authorizationUrl': 'Autorisierungs-URL', + 'settings.mcp.page.auth.manualFallbackTitle': 'Manueller Autorisierungsfallback', + 'settings.mcp.page.auth.manualFallbackDescription': 'Wenn der Browser auf eine andere Maschine zurückkehrt oder eine Callback-URL mit einem Code anzeigt, fügen Sie diese vollständige URL oder den Rohcode hier ein.', + 'settings.mcp.page.auth.callbackInputPlaceholder': 'Fügen Sie die Callback-URL oder den Autorisierungscode ein', + 'settings.mcp.page.auth.waitingForOpenCode': 'Warten auf OpenCode, um den abgeschlossenen Browser-Autorisierungsfluss zu beobachten...', + 'settings.mcp.page.server.title': 'Server', + 'settings.mcp.page.server.name': 'Servername', + 'settings.mcp.page.server.namePlaceholder': 'mein-mcp-server', + 'settings.mcp.page.server.importJson': 'Aus JSON-Snippet importieren', + 'settings.mcp.page.server.importJsonTitle': 'Eine vollständige MCP-Server-Konfiguration aus einem JSON-Snippet importieren', + 'settings.mcp.page.server.enable': 'Server aktivieren', + 'settings.mcp.page.server.enableAria': 'Server aktivieren', + 'settings.mcp.page.server.transportMode': 'Transportmodus', + 'settings.mcp.page.connection.command': 'Befehl', + 'settings.mcp.page.connection.serverUrl': 'Server-URL', + 'settings.mcp.page.connection.serverUrlPlaceholder': 'https://mcp.example.com/mcp', + 'settings.mcp.page.connection.pasteCommand': 'Befehl einfügen', + 'settings.mcp.page.connection.pasteCommandTitle': 'Einen lokalen Befehl aus der Zwischenablage einfügen und automatisch aufteilen', + 'settings.mcp.page.connection.previewArgs': 'Vorschau ({count} Argumente)', + 'settings.mcp.page.advanced.title': 'Erweiterte Remote-Optionen', + 'settings.mcp.page.advanced.configure': 'Erweiterte Optionen konfigurieren', + 'settings.mcp.page.advanced.autoDetect': 'Automatische Erkennung', + 'settings.mcp.page.advanced.custom': 'Benutzerdefiniert', + 'settings.mcp.page.advanced.headers': 'Header', + 'settings.mcp.page.advanced.timeoutMs': 'Timeout (ms)', + 'settings.mcp.page.advanced.timeoutHint': 'Leer lassen, um den Standard-MCP-Timeout von OpenCode zu verwenden.', + 'settings.mcp.page.advanced.requestHeaders': 'Anfrage-Header', + 'settings.mcp.page.advanced.headerNamePlaceholder': 'Header-Name', + 'settings.mcp.page.advanced.pasteHeaders': 'Header einfügen', + 'settings.mcp.page.advanced.pasteHeadersTitle': 'KEY=VALUE-Headerzeilen aus der Zwischenablage einfügen', + 'settings.mcp.page.advanced.oauthAutoDetection': 'OAuth-Auto-Erkennung aktivieren', + 'settings.mcp.page.advanced.oauthAutoDetectionAria': 'OAuth-Auto-Erkennung aktivieren', + 'settings.mcp.page.advanced.oauthClientIdPlaceholder': 'OAuth Client-ID', + 'settings.mcp.page.advanced.oauthClientSecretPlaceholder': 'OAuth Client-Geheimnis', + 'settings.mcp.page.advanced.oauthScopesPlaceholder': 'Bereiche (Leerzeichen-getrennt)', + 'settings.mcp.page.advanced.oauthRedirectUriPlaceholder': 'Weiterleitungs-URI', + 'settings.mcp.page.advanced.oauthHint': 'Lassen Sie diese Felder leer, damit OpenCode die OAuth-Einstellungen vom MCP-Server ableiten kann.', + 'settings.mcp.page.advanced.oauthCallbackHint': 'Browserbasierte MCP-Autorisierung verwendet diese Callback-URL, wenn der Redirect-URI leer ist:', + 'settings.mcp.page.env.title': 'Umgebungsvariablen', + 'settings.mcp.page.env.key': 'Schlüssel', + 'settings.mcp.page.env.value': 'Wert', + 'settings.mcp.page.env.valuePlaceholder': 'Wert', + 'settings.mcp.page.env.hide': 'Verstecken', + 'settings.mcp.page.env.show': 'Anzeigen', + 'settings.mcp.page.env.addVariable': 'Variable hinzufügen', + 'settings.mcp.page.env.addEnvironmentVariable': 'Umgebungsvariable hinzufügen', + 'settings.mcp.page.env.keyPlaceholder': 'API_SCHLÜSSEL', + 'settings.mcp.page.env.pasteEnv': '.env einfügen', + 'settings.mcp.page.env.pasteEnvTitle': 'KEY=VALUE-Zeilen aus der Zwischenablage einfügen', + 'settings.mcp.page.env.plainTextWarning': '⚠ Werte werden als Klartext in opencode.json gespeichert', + 'settings.mcp.page.env.removeVariableAria': 'Variable entfernen', + 'settings.mcp.page.importDialog.title': 'JSON-Schnipsel importieren', + 'settings.mcp.page.importDialog.description': 'Fügen Sie einen vollständigen MCP-JSON-Schnipsel aus Dokumentationen oder einer anderen Konfigurationsdatei ein. Die geparsten Werte werden dieses Formular zur Überprüfung vor dem Speichern ausfüllen.', + 'settings.mcp.page.importDialog.pasteFromClipboard': 'JSON aus der Zwischenablage einfügen', + 'settings.mcp.page.deleteDialog.title': '"{name}" löschen?', + 'settings.mcp.page.deleteDialog.descriptionPrefix': 'Dadurch wird der Server entfernt aus', + 'settings.mcp.page.deleteDialog.descriptionSuffix': 'OpenCode muss neu geladen werden.', + 'settings.mcp.page.toast.clipboardReadFailed': 'Kann Zwischenablage nicht lesen', + 'settings.mcp.page.toast.configImported': 'MCP-Konfiguration importiert', + 'settings.mcp.page.toast.nameRequired': 'Name ist erforderlich', + 'settings.mcp.page.toast.serverNameExists': 'Ein Server mit diesem Namen existiert bereits', + 'settings.mcp.page.toast.localCommandRequired': 'Befehl darf für einen lokalen Server nicht leer sein', + 'settings.mcp.page.toast.remoteUrlRequired': 'URL darf für einen Remote-Server nicht leer sein', + 'settings.mcp.page.toast.serverCreatedReloadFailed': 'MCP-Server erstellt, aber OpenCode-Neuladen fehlgeschlagen.', + 'settings.mcp.page.toast.savedReloadFailed': 'Gespeichert, aber OpenCode-Neuladen fehlgeschlagen.', + 'settings.mcp.page.toast.retryRefreshHint': 'Aktualisierung erneut versuchen oder Einstellungen vor der Autorisierung dieses Servers neu öffnen.', + 'settings.mcp.page.toast.serverCreatedReloading': 'MCP-Server erstellt. OpenCode wird neu geladen…', + 'settings.mcp.page.toast.savedReloading': 'Gespeichert. OpenCode wird neu geladen…', + 'settings.mcp.page.toast.saveFailed': 'Speichern fehlgeschlagen', + 'settings.mcp.page.toast.unexpectedError': 'Ein Fehler ist aufgetreten', + 'settings.mcp.page.toast.serverDeletedReloadFailed': '"{name}" gelöscht, aber OpenCode-Neuladen fehlgeschlagen', + 'settings.mcp.page.toast.refreshListIfStale': 'Aktualisiere die MCP-Liste, falls die Benutzeroberfläche veraltet aussieht.', + 'settings.mcp.page.toast.serverDeleted': '"{name}" gelöscht', + 'settings.mcp.page.toast.deleteFailed': 'Löschen fehlgeschlagen', + 'settings.mcp.page.toast.disconnected': 'Getrennt', + 'settings.mcp.page.toast.connected': 'Verbunden', + 'settings.mcp.page.toast.connectionNeedsAuthorization': 'Verbindung erfordert Autorisierung', + 'settings.mcp.page.toast.connectionNeedsClientRegistration': 'Verbindung erfordert Client-Registrierung', + 'settings.mcp.page.toast.connectionFailed': 'Verbindung fehlgeschlagen', + 'settings.mcp.page.toast.connectionAttemptFinished': 'Verbindungsversuch abgeschlossen. Aktualisiere den Status für Details.', + 'settings.mcp.page.toast.createServerBeforeLiveActions': 'Erstelle den Server, bevor du Live-Aktionen ausführst', + 'settings.mcp.page.toast.saveBeforeLiveActions': 'Speichere Änderungen, bevor du Live-Aktionen ausführst', + 'settings.mcp.page.toast.refreshStatusFailed': 'Aktualisierung des MCP-Status fehlgeschlagen', + 'settings.mcp.page.toast.oauthRedirectUrlBuildFailed': 'Kann die MCP OAuth-Umleitungs-URL nicht erstellen', + 'settings.mcp.page.toast.oauthBrowserCallbackSaveFailed': 'Fehler beim Speichern der Browser-Callback-URL für MCP-Autorisierung', + 'settings.mcp.page.toast.openCodeReloadFailedAfterCallbackSave': 'OpenCode-Neuladen fehlgeschlagen nach dem Speichern der Browser-Callback-URL', + 'settings.mcp.page.toast.completeAuthorizationInBrowserWithPaste': 'Schließe den MCP-Autorisierungsprozess in deinem Browser ab, füge dann den zurückgegebenen Code oder die Callback-URL hier ein', + 'settings.mcp.page.toast.completeAuthorizationInBrowser': 'Schließe den MCP-Autorisierungsprozess in deinem Browser ab', + 'settings.mcp.page.toast.openAuthorizationUrlFailed': 'Konnte die Autorisierungs-URL nicht automatisch öffnen', + 'settings.mcp.page.toast.authorizationStartFailed': 'Fehler beim Starten der Autorisierung', + 'settings.mcp.page.toast.authSessionExpired': 'Autorisierungssitzung abgelaufen oder während des Neuladens gelöscht. Klicke erneut auf Autorisieren.', + 'settings.mcp.page.toast.savedAuthorizationRemoved': 'Gespeicherte MCP-Autorisierung wurde entfernt', + 'settings.mcp.page.toast.clearAuthorizationFailed': 'Fehler beim Löschen der Autorisierung', + 'settings.mcp.page.toast.authorizationUrlCopied': 'Autorisierungs-URL kopiert', + 'settings.mcp.page.toast.authorizationUrlCopyFailed': 'Fehler beim Kopieren der Autorisierungs-URL', + 'settings.mcp.page.toast.pasteCallbackOrCodeFirst': 'Füge zuerst die Callback-URL oder den Autorisierungscode ein', + 'settings.mcp.page.toast.missingServerDetails': 'Fehlende MCP-Serverdetails. Wähle den Server erneut aus oder füge die vollständige Callback-URL ein.', + 'settings.mcp.page.toast.authorizationCompleted': 'MCP-Autorisierung abgeschlossen', + 'settings.mcp.page.toast.authorizationCompletedFor': 'MCP-Autorisierung abgeschlossen für {name}', + 'settings.mcp.page.toast.authorizationCompleteFailed': 'Fehler beim Abschließen der MCP-Autorisierung', + 'settings.mcp.page.toast.enableServerBeforeTest': 'Aktiviere diesen Server, bevor du die Verbindung testest', + 'settings.mcp.page.toast.connectionTestSucceeded': 'Verbindungstest erfolgreich', + 'settings.mcp.page.toast.connectionTestFailed': 'Verbindungstest fehlgeschlagen', + 'settings.mcp.page.toast.connectionTestFinished': 'Verbindungstest abgeschlossen. Aktualisiere den Status für Details.', + 'settings.mcp.page.toast.authorizationFailed': 'Autorisierung fehlgeschlagen', + 'settings.mcp.page.toast.authorizationStillInProgress': 'Autorisierung läuft noch in deinem Browser. Füge die Callback-URL oder den Code ein, falls nötig.', + 'settings.mcp.page.toast.noKeyValuePairsFound': 'Keine KEY=VALUE-Paare im Clipboard gefunden', + 'settings.mcp.page.toast.importedVariablesCount': 'Importierte Variablen: {count}', + 'settings.mcp.page.toast.pastedArgumentsCount': 'Eingefügte Argumente: {count}', + 'settings.shared.projectSelector.fallbackProject': 'Projekt', + 'settings.shared.projectSelector.switchProjectAria': 'Projekt wechseln', + 'settings.shared.projectSelector.switchProjectTitle': 'Projekt wechseln', + 'settings.openchamber.defaults.title': 'Sitzungsstandardwerte', + 'settings.openchamber.defaults.summaryPrefix': 'Neue Sitzungen starten mit:', + 'settings.openchamber.defaults.summaryOpenCodeDefault': 'OpenCode-Agent-Standard', + 'settings.openchamber.defaults.field.defaultModel': 'Standardmodell', + 'settings.openchamber.defaults.field.defaultThinking': 'Standard-Denken', + 'settings.openchamber.defaults.field.thinkingPlaceholder': 'Denken', + 'settings.openchamber.defaults.field.defaultAgent': 'Standard-Agent', + 'settings.openchamber.defaults.field.showDeletionDialogAria': 'Löschdialog anzeigen', + 'settings.openchamber.defaults.field.showDeletionDialog': 'Löschdialog anzeigen', + 'settings.openchamber.defaults.smallModel.title': 'Kleines Modell', + 'settings.openchamber.defaults.smallModel.description': 'Ein günstiges Modell für schnelle Dienstaufgaben wie kurze Zusammenfassungen und Faziten.', + 'settings.openchamber.defaults.smallModel.useDefault': 'Standardmodell verwenden', + 'settings.openchamber.defaults.smallModel.useDefaultAria': 'Standardmodell verwenden', + 'settings.openchamber.defaults.smallModel.overrideModel': 'Modell überschreiben', + 'settings.openchamber.defaults.field.openFilesPreviewAria': 'Vorschau-fähige Dateien im Vorschaumodus öffnen', + 'settings.openchamber.defaults.field.openFilesPreview': 'Vorschau-fähige Dateien im Vorschaumodus öffnen', + 'settings.openchamber.defaults.option.default': 'Standard', + 'settings.openchamber.defaults.option.defaultLowercase': 'Standard', + 'settings.openchamber.git.title': 'Git-Einstellungen', + 'settings.openchamber.git.changesViewTitle': 'Änderungsansicht', + 'settings.openchamber.git.changesViewAria': 'Git-Änderungsansichtsmodus', + 'settings.openchamber.git.option.flatList': 'Flache Liste', + 'settings.openchamber.git.option.treeView': 'Baumansicht', + 'settings.openchamber.git.optionAria': 'Git-Änderungsansichtsmodus: {option}', + 'settings.openchamber.git.enableGitmojiAria': 'Gitmoji-Auswähler aktivieren', + 'settings.openchamber.git.enableGitmoji': 'Gitmoji-Auswähler aktivieren', + 'settings.openchamber.git.showGitignoredAria': 'Git-ignorierte Dateien anzeigen', + 'settings.openchamber.git.showGitignored': 'Git-ignorierte Dateien anzeigen', + 'settings.github.page.tooltip.connectAccount': 'Verbinden Sie ein GitHub-Konto für PR- und Issue-Workflows innerhalb der App.', + 'settings.github.page.avatarAlt.withLogin': '{login} Avatar', + 'settings.github.page.avatarAlt.fallback': 'GitHub-Avatar', + 'settings.github.page.label.unknownUser': 'unbekannt', + 'settings.github.page.label.scopes': 'Bereiche: {value}', + 'settings.github.page.label.otherAccounts': 'Andere Konten', + 'settings.github.page.accountSource.oauth': 'OAuth', + 'settings.github.page.accountSource.cli': 'CLI', + 'settings.github.page.actions.disconnect': 'Trennen', + 'settings.github.page.actions.connect': 'GitHub verbinden', + 'settings.github.page.actions.switchTo': 'Wechseln zu', + 'settings.github.page.actions.addAccount': 'Konto hinzufügen', + 'settings.github.page.actions.openGithub': 'GitHub öffnen', + 'settings.github.page.status.notConnected': 'Nicht verbunden', + 'settings.github.page.status.active': 'Aktiv', + 'settings.github.page.flow.title': 'OpenChamber autorisieren', + 'settings.github.page.flow.description': 'Geben Sie in GitHub den folgenden Code ein, um dieses Gerät zu autorisieren:', + 'settings.github.page.flow.waiting': 'Warten auf Genehmigung… (Auto-Refresh)', + 'settings.github.page.toast.startConnectFailed': 'Fehler beim Starten der GitHub-Verbindung', + 'settings.github.page.toast.connected': 'GitHub verbunden', + 'settings.github.page.toast.authorizationFailed': 'GitHub-Autorisierung fehlgeschlagen', + 'settings.github.page.toast.disconnected': 'GitHub getrennt', + 'settings.github.page.toast.disconnectFailed': 'Fehler beim Trennen von GitHub', + 'settings.github.page.toast.accountSwitched': 'GitHub-Konto gewechselt', + 'settings.github.page.toast.accountSwitchFailed': 'Fehler beim Wechseln des GitHub-Kontos', + 'settings.github.page.oauth.title': 'GitHub OAuth-Token', + 'settings.github.page.ghCli.title': 'GitHub CLI-Token', + 'settings.github.page.ghCli.activeDescription': 'Authentifiziert über die gh CLI', + 'settings.github.page.ghCli.fallbackDescription': 'Verfügbar als Fallback, falls OpenChamber-Auth entfernt wird', + 'settings.github.page.ghCli.disabledDescription': 'Installiert, aber nicht als Fallback verwendet', + 'settings.github.page.ghCli.actions.disable': 'Deaktivieren', + 'settings.github.page.ghCli.actions.enable': 'Aktivieren', + 'settings.github.page.toast.ghCliEnabled': 'gh CLI Fallback aktiviert', + 'settings.github.page.toast.ghCliDisabled': 'gh CLI Fallback deaktiviert', + 'settings.github.page.toast.ghCliUpdateFailed': 'Fehler beim Aktualisieren der gh CLI Einstellung', + 'settings.notifications.page.delivery.title': 'Benachrichtigungsübermittlung', + 'settings.notifications.page.delivery.enableAria': 'Benachrichtigungen aktivieren', + 'settings.notifications.page.delivery.enableLabel': 'Benachrichtigungen aktivieren', + 'settings.notifications.page.delivery.focusedAria': 'Benachrichtigen, wenn App im Vordergrund ist', + 'settings.notifications.page.delivery.focusedLabel': 'Benachrichtigen, wenn App im Vordergrund ist', + 'settings.notifications.page.delivery.testAction': 'Testbenachrichtigung senden', + 'settings.notifications.page.delivery.browserPermissionHint': 'Ihr Browser könnte die Berechtigung beim ersten Mal abfragen.', + 'settings.notifications.page.delivery.permissionDenied': 'Benachrichtigungsberechtigung verweigert. Aktivieren Sie sie in Ihren Browsereinstellungen.', + 'settings.notifications.page.delivery.permissionGrantedButDisabled': 'Berechtigung erteilt, aber Benachrichtigungen sind deaktiviert.', + 'settings.notifications.page.delivery.vscodeHint': 'Wenn aktiviert, werden Benachrichtigungen über VS Codes native Benachrichtigungen zugestellt.', + 'settings.notifications.page.events.title': 'Benachrichtigungsereignisse', + 'settings.notifications.page.events.completionAria': 'Agentenabschluss', + 'settings.notifications.page.events.completionLabel': 'Agentenabschluss', + 'settings.notifications.page.events.subtaskAria': 'Unteragentenabschluss', + 'settings.notifications.page.events.subtaskLabel': 'Unteragentenabschluss', + 'settings.notifications.page.events.errorAria': 'Agentenfehler', + 'settings.notifications.page.events.errorLabel': 'Agentenfehler', + 'settings.notifications.page.events.questionAria': 'Agentenfragen', + 'settings.notifications.page.events.questionLabel': 'Agentenfragen', + 'settings.notifications.page.template.title': 'Benachrichtigungsvorlagen', + 'settings.notifications.page.template.variablesLabel': 'Variablen:', + 'settings.notifications.page.template.event.completion': 'Abschluss', + 'settings.notifications.page.template.event.subtask': 'Teilaufgabe abgeschlossen', + 'settings.notifications.page.template.event.error': 'Fehler', + 'settings.notifications.page.template.event.question': 'Frage', + 'settings.notifications.page.template.field.title': 'Titel', + 'settings.notifications.page.template.field.message': 'Nachricht', + 'settings.notifications.page.template.defaults.completion.title': '{agent_name} ist bereit', + 'settings.notifications.page.template.defaults.completion.message': '{model_name} hat die Aufgabe abgeschlossen', + 'settings.notifications.page.template.defaults.error.title': 'Werkzeugfehler', + 'settings.notifications.page.template.defaults.error.message': '{last_message}', + 'settings.notifications.page.template.defaults.question.title': 'Eingabe erforderlich', + 'settings.notifications.page.template.defaults.question.message': '{last_message}', + 'settings.notifications.page.template.defaults.subtask.title': '{agent_name} ist bereit', + 'settings.notifications.page.template.defaults.subtask.message': '{model_name} hat die Aufgabe abgeschlossen', + 'settings.notifications.page.summary.title': 'KI-Zusammenfassung', + 'settings.notifications.page.summary.toggleAria': 'Letzte Nachricht zusammenfassen', + 'settings.notifications.page.summary.toggleLabel': 'Letzte Nachricht zusammenfassen', + 'settings.notifications.page.summary.requiresTemplateVariable': 'Erfordert', + 'settings.notifications.page.summary.modelLabel': 'Zusammenfassungsmodell', + 'settings.notifications.page.summary.modelTooltip': 'Wird für Benachrichtigungs- und Sprachzusammenfassungen verwendet.', + 'settings.notifications.page.summary.notSelected': 'Nicht ausgewählt', + 'settings.notifications.page.summary.thresholdLabel': 'Schwellenwert', + 'settings.notifications.page.summary.thresholdHint': 'Nachrichten, die länger sind als dieser Wert, werden zusammengefasst', + 'settings.notifications.page.summary.resetThresholdAria': 'Schwellenwert zurücksetzen', + 'settings.notifications.page.summary.lengthLabel': 'Länge', + 'settings.notifications.page.summary.lengthHint': 'Zielzeichenlänge der Zusammenfassung', + 'settings.notifications.page.summary.resetLengthAria': 'Zusammenfassungslänge zurücksetzen', + 'settings.notifications.page.summary.maxLengthLabel': 'Maximale Länge', + 'settings.notifications.page.summary.maxLengthHint': '{last_message} auf diese Länge kürzen', + 'settings.notifications.page.summary.resetMaxLengthAria': 'Maximale Nachrichtenlänge zurücksetzen', + 'settings.notifications.page.push.title': 'Hintergrund-Push-Benachrichtigungen', + 'settings.notifications.page.push.enableAria': 'Push-Benachrichtigungen aktivieren', + 'settings.notifications.page.push.enableLabel': 'Push-Benachrichtigungen aktivieren', + 'settings.notifications.page.push.unsupportedHint': 'Push wird nicht unterstützt. Desktop Chrome/Edge und Android unterstützen Push. iOS erfordert eine installierte PWA.', + 'settings.notifications.page.push.supportedHint': 'Empfange Benachrichtigungen über den Hintergrunddienst deines Betriebssystems', + 'settings.notifications.page.push.loadingAria': 'Wird geladen', + 'settings.notifications.page.toast.permissionDenied.title': 'Benachrichtigungsberechtigung verweigert', + 'settings.notifications.page.toast.permissionDenied.description': 'Bitte aktiviere Benachrichtigungen in deinen Browser-Einstellungen.', + 'settings.notifications.page.toast.permissionDenied.enableInBrowser': 'Aktiviere Benachrichtigungen in deinen Browser-Einstellungen.', + 'settings.notifications.page.toast.requestPermissionFailed': 'Fehler beim Anfordern der Benachrichtigungsberechtigung', + 'settings.notifications.page.toast.notificationsApiUnavailable': 'Benachrichtigungs-API nicht verfügbar', + 'settings.notifications.page.toast.testNotificationSent': 'Testbenachrichtigung erfolgreich gesendet', + 'settings.notifications.page.toast.testNotificationFailed': 'Fehler beim Senden der Testbenachrichtigung', + 'settings.notifications.page.toast.pushUnsupported': 'Push-Benachrichtigungen werden nicht unterstützt', + 'settings.notifications.page.toast.pushApiUnavailable': 'Push-API nicht verfügbar', + 'settings.notifications.page.toast.pushKeyLoadFailed': 'Fehler beim Laden des Push-Schlüssels', + 'settings.notifications.page.toast.enableBackgroundFailed': 'Fehler beim Aktivieren von Hintergrundbenachrichtigungen', + 'settings.notifications.page.toast.backgroundEnabled': 'Hintergrundbenachrichtigungen aktiviert', + 'settings.notifications.page.toast.backgroundDisabled': 'Hintergrundbenachrichtigungen deaktiviert', + 'settings.notifications.page.testNotification.title': 'Testbenachrichtigung', + 'settings.notifications.page.testNotification.body': 'Dies ist eine Testbenachrichtigung von OpenChamber.', + 'settings.voice.page.section.speechRecognition': 'Spracherkennung', + 'settings.voice.page.field.enableVoiceInput': 'Spracheingabe aktivieren', + 'settings.voice.page.field.enableVoiceInputAria': 'Spracheingabe aktivieren (Diktat)', + 'settings.voice.page.section.playbackAndSummary': 'Wiedergabe', + 'settings.voice.page.field.provider': 'Anbieter', + 'settings.voice.page.provider.browser': 'Browser', + 'settings.voice.page.provider.custom': 'Benutzerdefiniert', + 'settings.voice.page.provider.say': 'Sagen', + 'settings.voice.page.provider.server': 'Server', + 'settings.voice.page.provider.local': 'Lokal', + 'settings.voice.page.tooltip.sttLocal': 'On-device Transkription auf dem OpenChamber-Server. Modelle werden automatisch heruntergeladen; kein API-Schlüssel erforderlich.', + 'settings.voice.page.tooltip.localTts': 'On-device Synthese auf dem OpenChamber-Server (Kokoro, Englisch). Das Modell wird automatisch heruntergeladen; kein API-Schlüssel erforderlich.', + 'settings.voice.page.stt.model.parakeetV2': 'Parakeet v2 (Englisch)', + 'settings.voice.page.stt.model.parakeetV3': 'Parakeet v3 (25 europäische Sprachen)', + 'settings.voice.page.stt.model.whisperBase': 'Whisper base (mehrsprachig)', + 'settings.voice.page.stt.model.whisperTiny': 'Whisper tiny (mehrsprachig)', + 'settings.voice.page.stt.badge.bestForEnglish': 'Am besten für Englisch', + 'settings.voice.page.stt.badge.bestForMultilingual': 'Am besten für mehrsprachig', + 'settings.voice.page.stt.meta.accuracy': 'Genauigkeit', + 'settings.voice.page.stt.meta.speed': 'Geschwindigkeit', + 'settings.voice.page.stt.modelInstalled': 'Modell installiert', + 'settings.voice.page.stt.modelDownloading': 'Modell wird heruntergeladen...', + 'settings.voice.page.stt.modelDownloadingProgress': 'Modell wird heruntergeladen... {percent}%', + 'settings.voice.page.stt.modelNotInstalled': 'Modell nicht heruntergeladen', + 'settings.voice.page.stt.modelDownload': 'Herunterladen', + 'settings.voice.page.stt.modelDelete': 'Modell löschen', + 'settings.voice.page.stt.modelRetry': 'Wiederholen', + 'settings.voice.page.provider.wasm': 'Lokal', + 'settings.voice.page.stt.wasmModel': 'Whisper-Modell', + 'settings.voice.page.stt.wasmLoaded': 'Modell geladen, bereit', + 'settings.voice.page.stt.wasmDownloading': 'Modell wird heruntergeladen...', + 'settings.voice.page.stt.wasmLoading': 'Modell wird geladen...', + 'settings.voice.page.stt.wasmNotLoaded': 'Modell wird beim ersten Sprachgebrauch geladen', + 'settings.voice.page.stt.wasmDownload': 'Laden', + 'settings.voice.page.stt.wasmRetry': 'Wiederholen', + 'settings.voice.page.tooltip.browser': 'Kostenlos, offline, begrenzte mobile Unterstützung.', + 'settings.voice.page.tooltip.openai': 'Hohe Qualität, mobil bereit, benötigt API-Schlüssel.', + 'settings.voice.page.tooltip.custom': 'OpenAI-kompatibler Server (z. B. Kokoro).', + 'settings.voice.page.tooltip.say': 'Nativ auf macOS. Schnell, kostenlos, offline.', + 'settings.voice.page.tooltip.sttBrowser': 'Web Speech API (Chrome/Edge). Kostenlos, keine Einrichtung.', + 'settings.voice.page.tooltip.sttServer': 'OpenAI-kompatibler Whisper-Server. Bessere Genauigkeit, beliebige Sprache.', + 'settings.voice.page.field.apiKey': 'API-Schlüssel', + 'settings.voice.page.field.apiKeyHintUsingConfig': 'Verwendeter Schlüssel aus Konfiguration', + 'settings.voice.page.field.apiKeyHintRequired': 'OpenAI TTS benötigt einen API-Schlüssel', + 'settings.voice.page.field.apiKeyHintProvide': 'Geben Sie Ihren OpenAI-Schlüssel ein', + 'settings.voice.page.field.serverUrl': 'Server-URL', + 'settings.voice.page.field.serverUrlHint': 'Basis-URL des OpenAI-kompatiblen TTS-Servers', + 'settings.voice.page.field.model': 'Modell', + 'settings.voice.page.field.voice': 'Stimme', + 'settings.voice.page.field.voiceIdentifierHint': 'Vom Server unterstützter Sprachidentifier', + 'settings.voice.page.field.configuredAbove': 'Oben konfiguriert', + 'settings.voice.page.actions.preview': 'Vorschau', + 'settings.voice.page.field.selectVoicePlaceholder': 'Sprache auswählen', + 'settings.voice.page.field.auto': 'Automatisch', + 'settings.voice.page.field.speechRate': 'Sprachgeschwindigkeit', + 'settings.voice.page.field.speechPitch': 'Sprachpitch', + 'settings.voice.page.field.speechVolume': 'Sprachlautstärke', + 'settings.voice.page.field.language': 'Sprache', + 'settings.voice.page.field.selectLanguagePlaceholder': 'Sprache auswählen', + 'settings.voice.page.field.sttBrowserSupportError': 'MediaRecorder oder AudioContext ist in diesem Browser nicht verfügbar. Server-STT funktioniert möglicherweise nicht.', + 'settings.voice.page.field.sttServerUrlHint': 'Basis-URL des Whisper-kompatiblen Servers', + 'settings.voice.page.field.sttLanguageHint': 'BCP-47-Code (z.B. en, fr). Leer lassen für automatische Erkennung.', + 'settings.voice.page.field.silenceThreshold': 'Schwellenwert für Stille', + 'settings.voice.page.field.silenceHold': 'Halten bei Stille', + 'settings.voice.page.field.transcribeOnStopAria': 'Transkribieren beim Beenden der Aufnahme', + 'settings.voice.page.field.transcribeOnStop': 'Beim Stoppen transkribieren', + 'settings.voice.page.field.millisecondsUnit': 'ms', + 'settings.voice.page.field.messageReadAloudButtonAria': 'Schaltfläche für Vorlesen der Nachricht', + 'settings.voice.page.field.messageReadAloudButton': 'Nachricht vorlesen-Taste', + 'settings.voice.page.field.summarizeBeforePlaybackAria': 'Zusammenfassen vor der Wiedergabe', + 'settings.voice.page.field.summarizeBeforePlayback': 'Vor der Wiedergabe zusammenfassen', + 'settings.voice.page.field.summarizeVoiceModeResponsesAria': 'Antworten im Sprachmodus zusammenfassen', + 'settings.voice.page.field.summarizeVoiceModeResponses': 'Antworten im Sprachmodus zusammenfassen', + 'settings.voice.page.field.summarizationThreshold': 'Zusammenfassungsschwellenwert', + 'settings.voice.page.field.summaryMaxLength': 'Maximale Länge der Zusammenfassung', + 'settings.voice.page.hint.shiftClickPrefix': 'Drücken Sie', + 'settings.voice.page.hint.shiftClickSuffix': 'auf die Mikrofon-Schaltfläche, um den kontinuierlichen Modus umzuschalten', + 'settings.voice.page.preview.browserVoiceFallback': 'Ihre Browserstimme', + 'settings.voice.page.preview.voiceLine': 'Hallo! Ich bin {voiceName}. So klinge ich.', + 'settings.voice.page.preview.customServerLine': 'Hallo! Das ist eine Vorschau des benutzerdefinierten TTS-Servers.', + 'settings.voice.page.field.ttsInputMode': 'TTS-Eingabemodus', + 'settings.voice.page.field.ttsInputModeSanitized': 'Gereinigt', + 'settings.voice.page.field.ttsInputModeRaw': 'Rohes Markdown', + 'settings.voice.page.field.ttsInputModeSummarized': 'zusammengefasst', + 'settings.openchamber.visual.section.colorMode': 'Farbmodus', + 'settings.openchamber.visual.section.mobileLayout': 'Mobiles Layout', + 'settings.openchamber.visual.option.mobileLayout.default': 'Alt', + 'settings.openchamber.visual.option.mobileLayout.new': 'Neu', + 'settings.openchamber.visual.section.localization': 'Lokalisierung', + 'settings.openchamber.visual.section.spacingAndLayout': 'Abstand & Layout', + 'settings.openchamber.visual.section.navigation': 'Navigation', + 'settings.openchamber.visual.section.chatRenderMode': 'Chat-Darstellungsmodus', + 'settings.openchamber.visual.section.chatRenderModeAria': 'Chat-Darstellungsmodus', + 'settings.openchamber.visual.section.messageStreamTransport': 'Nachrichtenstrom-Transport', + 'settings.openchamber.visual.section.activityDefault': 'Aktivitätsstandard', + 'settings.openchamber.visual.section.activityDefaultAria': 'Aktivitätsstandardmodus', + 'settings.openchamber.visual.section.showToolsOpenedByDefault': 'Werkzeuge standardmäßig geöffnet anzeigen:', + 'settings.openchamber.visual.section.sessionAssistance': 'Sitzungshilfe', + 'settings.openchamber.visual.section.reasoning': 'Reasoning', + 'settings.openchamber.visual.section.messageAppearance': 'Nachrichten-Erscheinungsbild', + 'settings.openchamber.visual.section.toolsAndFiles': 'Werkzeuge & Dateien', + 'settings.openchamber.visual.section.composer': 'Komponist', + 'settings.openchamber.visual.section.userMessageRendering': 'Benutzer-Nachrichtendarstellung', + 'settings.openchamber.visual.section.userMessageRenderingAria': 'Modus der Benutzer-Nachrichtendarstellung', + 'settings.openchamber.visual.section.mermaidRendering': 'Mermaid-Darstellung', + 'settings.openchamber.visual.section.mermaidRenderingAria': 'Mermaid-Darstellungsmodus', + 'settings.openchamber.visual.section.diffLayout': 'Diff-Layout', + 'settings.openchamber.visual.section.diffLayoutAria': 'Diff-Layout', + 'settings.openchamber.visual.section.privacy': 'Datenschutz', + 'settings.openchamber.visual.field.lightTheme': 'Helles Design', + 'settings.openchamber.visual.field.darkTheme': 'Dunkles Design', + 'settings.openchamber.visual.field.selectLightThemeAria': 'Helles Design auswählen', + 'settings.openchamber.visual.field.selectDarkThemeAria': 'Dunkles Design auswählen', + 'settings.openchamber.visual.field.selectThemePlaceholder': 'Design auswählen', + 'settings.openchamber.visual.field.timeFormat': 'Zeitformat', + 'settings.openchamber.visual.field.weekStartsOn': 'Woche beginnt am', + 'settings.openchamber.visual.field.selectTimeFormatAria': 'Zeitformat auswählen', + 'settings.openchamber.visual.field.selectWeekStartAria': 'Wochenstart auswählen', + 'settings.openchamber.visual.actions.reloadThemes': 'Designs neu laden', + 'settings.openchamber.visual.actions.reloadingThemes': 'Designs werden neu geladen...', + 'settings.openchamber.visual.field.macVibrancy': 'Fenstertransparenz', + 'settings.openchamber.visual.field.macVibrancyHint': 'Verwenden Sie den nativen macOS-Blur (Vibrancy) hinter der Seitenleiste. Ausschalten für vollständig solide, undurchsichtige Oberflächen.', + 'settings.openchamber.visual.field.dockBadge': 'Dock-Badge', + 'settings.openchamber.visual.field.dockBadgeHint': 'Zeigt eine Anzahl an Chats mit nicht gesehenem Aktivität auf dem macOS-Dock-Icon an.', + 'settings.openchamber.visual.actions.saveAndRestart': 'Speichern & Neustart', + 'settings.openchamber.visual.actions.restarting': 'Neustarten…', + 'settings.openchamber.visual.field.themeImportInfoAria': 'Informationen zum Importieren von Designs', + 'settings.openchamber.visual.field.themeImportInfoTooltip': 'Benutzerdefinierte Designs aus ~/.config/openchamber/themes/ importieren', + 'settings.openchamber.visual.field.installAppName': 'App-Name installieren', + 'settings.openchamber.visual.field.installAppNameHint': 'Wird vom PWA-Installationsprozess verwendet.', + 'settings.openchamber.visual.field.pwaInstallAppNameAria': 'PWA-Installations-App-Name', + 'settings.openchamber.visual.actions.resetInstallAppNameAria': 'Installations-App-Namen zurücksetzen', + 'settings.openchamber.visual.field.installOrientation': 'Ausrichtung installieren', + 'settings.openchamber.visual.field.installOrientationHint': 'Wird von der installierten Web-App verwendet. PWA neu installieren nach Änderung.', + 'settings.openchamber.visual.field.pwaInstallOrientationAria': 'PWA-Installationsorientierung', + 'settings.openchamber.visual.field.selectOrientationPlaceholder': 'Ausrichtung auswählen', + 'settings.openchamber.visual.actions.resetInstallOrientationAria': 'Installationsorientierung zurücksetzen', + 'settings.openchamber.visual.field.mobileKeyboardMode': 'Verhalten der mobilen Tastatur', + 'settings.openchamber.visual.field.mobileKeyboardModeHint': 'Das Standard-Verhalten des Browsers ist am sichersten. Das Größenändern des Inhalts bittet unterstützte Browser dazu, die App zu verkleinern, wenn die On-Screen-Tastatur geöffnet wird.', + 'settings.openchamber.visual.field.mobileKeyboardModeAria': 'Verhalten der mobilen Tastatur', + 'settings.openchamber.visual.field.selectMobileKeyboardModePlaceholder': 'Tastaturverhalten auswählen', + 'settings.openchamber.visual.actions.resetMobileKeyboardModeAria': 'Tastaturverhalten zurücksetzen', + 'settings.openchamber.visual.field.interfaceFontSize': 'Schriftgröße der Benutzeroberfläche', + 'settings.openchamber.visual.field.interfaceFont': 'Schriftart der Benutzeroberfläche', + 'settings.openchamber.visual.field.selectInterfaceFontAria': 'Schriftart der Benutzeroberfläche auswählen', + 'settings.openchamber.visual.actions.resetInterfaceFontAria': 'Schriftart der Benutzeroberfläche zurücksetzen', + 'settings.openchamber.visual.field.fontSizePercentageAria': 'Prozentsatz der Schriftgröße', + 'settings.openchamber.visual.actions.resetFontSizeAria': 'Schriftgröße zurücksetzen', + 'settings.openchamber.visual.field.terminalFontSize': 'Schriftgröße des Terminals', + 'settings.openchamber.visual.field.editorFontSize': 'Schriftgröße des Editors', + 'settings.openchamber.visual.field.codeFont': 'Schriftart für Code', + 'settings.openchamber.visual.field.selectCodeFontAria': 'Schriftart für Code auswählen', + 'settings.openchamber.visual.actions.resetCodeFontAria': 'Schriftart für Code zurücksetzen', + 'settings.openchamber.visual.actions.resetTerminalFontSizeAria': 'Schriftgröße des Terminals zurücksetzen', + 'settings.openchamber.visual.actions.resetEditorFontSizeAria': 'Schriftgröße des Editors zurücksetzen', + 'settings.openchamber.visual.field.spacingDensity': 'Abstandsdichte', + 'settings.openchamber.visual.actions.resetSpacingAria': 'Abstände zurücksetzen', + 'settings.openchamber.visual.field.inputBarOffset': 'Versatz der Eingabeleiste', + 'settings.openchamber.visual.field.inputBarOffsetTooltip': 'Eingabeleiste anheben, um Bildschirmverdeckungen auf Betriebssystemebene wie Home-Bars zu vermeiden.', + 'settings.openchamber.visual.actions.resetInputBarOffsetAria': 'Versatz der Eingabeleiste zurücksetzen', + 'settings.openchamber.visual.field.terminalQuickKeysAria': 'Schnelltasten des Terminals', + 'settings.openchamber.visual.field.terminalQuickKeys': 'Schnelltasten des Terminals', + 'settings.openchamber.visual.field.terminalQuickKeysTooltip': 'Esc, Strg, Pfeiltasten in der Terminalansicht anzeigen', + 'settings.openchamber.visual.field.fileEditorKeymap': 'Tastaturlayout für Datei-Editor', + 'settings.openchamber.visual.option.fileEditorKeymap.default': 'Standard', + 'settings.openchamber.visual.option.fileEditorKeymap.vim': 'Vim', + 'settings.openchamber.visual.field.activityDefaultModeAria': 'Aktivitäts-Standardmodus: {option}', + 'settings.openchamber.visual.field.showExpandedBashToolsAria': 'Erweiterte Bash-Tools anzeigen', + 'settings.openchamber.visual.field.showExpandedEditToolsAria': 'Erweiterte Bearbeitungstools anzeigen', + 'settings.openchamber.visual.field.bash': 'Bash', + 'settings.openchamber.visual.field.editTools': 'Bearbeitungstools', + 'settings.openchamber.visual.field.userMessageRenderingAria': 'Benutzernachrichten-Rendering: {option}', + 'settings.openchamber.visual.field.mermaidRenderingAria': 'Mermaid-Rendering: {option}', + 'settings.openchamber.visual.field.diffLayoutAria': 'Diff-Layout: {option}', + 'settings.openchamber.visual.field.sessionRecap': 'Sitzungs-Zusammenfassung generieren', + 'settings.openchamber.visual.field.sessionRecapAria': 'Eine Zusammenfassung nach Abschluss des Agents generieren', + 'settings.openchamber.visual.field.sessionSuggestion': 'Nächste Benutzernachricht vorschlagen', + 'settings.openchamber.visual.field.sessionSuggestionAria': 'Eine vorgeschlagene nächste Benutzernachricht nach Abschluss des Agents generieren', + 'settings.openchamber.visual.field.sessionGoal': 'Sitzungsziele aktivieren', + 'settings.openchamber.visual.field.sessionGoalAria': 'Die Sitzung automatisch auf ein Ziel hin arbeiten lassen', + 'settings.openchamber.visual.goal.sectionTitle': 'Ziel', + 'settings.openchamber.visual.goal.budgetLabel': 'Standard-Token-Budget', + 'settings.openchamber.visual.goal.budgetAria': 'Ein Standard-Token-Budget für neue Ziele anwenden', + 'settings.openchamber.visual.goal.description': 'Aktiviere die Ziel-Schaltfläche im Composer. Die nächste Nachricht wird zu einem Ziel: Der Agent arbeitet automatisch daran, auch wenn du weg bist, kontrolliert vom kleinen Modell.', + 'settings.openchamber.visual.field.showReasoningTracesAria': 'Denkspuren anzeigen', + 'settings.openchamber.visual.field.showReasoningTraces': 'Denkspuren anzeigen', + 'settings.openchamber.visual.field.collapsibleThinkingBlocksAria': 'Zusammenklappbare Denkblöcke aktivieren', + 'settings.openchamber.visual.field.collapsibleThinkingBlocks': 'Zusammenklappbare Denkblöcke aktivieren', + 'settings.openchamber.visual.field.collapsibleUserMessagesAria': 'Lange Benutzernachrichten einklappen', + 'settings.openchamber.visual.field.collapsibleUserMessages': 'Lange Benutzernachrichten einklappen', + 'settings.openchamber.visual.field.stickyUserHeaderAria': 'Fixierter Benutzerheader', + 'settings.openchamber.visual.field.stickyUserHeader': 'Fixierter Benutzerkopf', + 'settings.openchamber.visual.field.promptNavigatorEnabledAria': 'Prompt-Navigator', + 'settings.openchamber.visual.field.promptNavigatorEnabled': 'Prompt-Navigator', + 'settings.openchamber.visual.field.expandedEditorToolbarAria': 'Editor-Werkzeugleiste immer anzeigen', + 'settings.openchamber.visual.field.expandedEditorToolbar': 'Editor-Werkzeugleiste immer anzeigen (unter den Datei-Reitern angeheftet)', + 'settings.openchamber.visual.field.wideChatLayoutAria': 'Breites Chat-Layout', + 'settings.openchamber.visual.field.wideChatLayout': 'Breites Chat-Layout', + 'settings.openchamber.visual.field.codeBlockLineWrapAria': 'Codeblock-Zeilen umbrechen', + 'settings.openchamber.visual.field.codeBlockLineWrap': 'Codeblock-Zeilen umbrechen', + 'settings.openchamber.visual.field.showSplitAssistantMessageActionsAria': 'Inline-Assistant-Aktionen', + 'settings.openchamber.visual.field.showSplitAssistantMessageActions': 'Inline-Assistant-Aktionen', + 'settings.openchamber.visual.field.showSplitAssistantMessageActionsTooltip': 'Kopieren Sie Antwort, Speichern als Bild und Vorlesen in Assistant-Textblöcken anzeigen, die vor späteren Tool-Aufrufen in derselben Antwort erscheinen.', + 'settings.openchamber.visual.field.allowPromptingSubagentSessionsAria': 'Erlaube Prompting von Subagent-Sitzungen', + 'settings.openchamber.visual.field.allowPromptingSubagentSessions': 'Erlaube Prompting von Subagent-Sitzungen', + 'settings.openchamber.visual.field.showToolFileIconsAria': 'Tool-Datei-Symbole anzeigen', + 'settings.openchamber.visual.field.showToolFileIcons': 'Tool-Datei-Symbole anzeigen', + 'settings.openchamber.visual.field.showTurnChangedFilesAria': 'Geänderte Dateien für abgeschlossene Züge anzeigen', + 'settings.openchamber.visual.field.showTurnChangedFiles': 'Geänderte Dateien für abgeschlossene Züge anzeigen', + 'settings.openchamber.visual.field.showDotfilesAria': 'Dotfiles anzeigen', + 'settings.openchamber.visual.field.showDotfiles': 'Dotfiles anzeigen', + 'settings.openchamber.visual.field.queueMessagesByDefaultAria': 'Nachrichten standardmäßig in die Warteschlange stellen', + 'settings.openchamber.visual.field.queueMessagesByDefault': 'Nachrichten standardmäßig in die Warteschlange stellen', + 'settings.openchamber.visual.field.queueMessagesByDefaultTooltip': 'Wenn aktiviert, stellt Enter Nachrichten in die Warteschlange. Verwenden Sie {modifier}+Enter zum Senden.', + 'settings.openchamber.visual.field.persistDraftMessagesAria': 'Entwurfsnachrichten speichern', + 'settings.openchamber.visual.field.persistDraftMessages': 'Entwurfsnachrichten speichern', + 'settings.openchamber.visual.field.enableSpellcheckInTextInputsAria': 'Rechtschreibprüfung in Texteingaben aktivieren', + 'settings.openchamber.visual.field.enableSpellcheckInTextInputs': 'Rechtschreibprüfung in Texteingaben aktivieren', + 'settings.openchamber.visual.field.sendAnonymousUsageReportsAria': 'Anonyme Nutzungsberichte senden', + 'settings.openchamber.visual.field.sendAnonymousUsageReports': 'Anonyme Nutzungsberichte senden', + 'settings.openchamber.visual.field.sendAnonymousUsageReportsHint': 'Hilft uns zu verstehen, welche App-Versionen aktiv genutzt werden, damit wir Verbesserungen priorisieren können. Es werden nur die App-Version, Plattform und Laufzeit gesammelt - keine persönlichen Daten oder Code.', + 'settings.openchamber.visual.option.themeMode.system': 'System', + 'settings.openchamber.visual.option.themeMode.light': 'Hell', + 'settings.openchamber.visual.option.themeMode.dark': 'Dunkel', + 'settings.openchamber.visual.option.diffLayout.dynamic.label': 'Dynamisch', + 'settings.openchamber.visual.option.diffLayout.dynamic.description': 'Neu inline, geändert nebeneinander.', + 'settings.openchamber.visual.option.diffLayout.inline.label': 'Immer inline', + 'settings.openchamber.visual.option.diffLayout.inline.description': 'Als einheitliche Ansicht anzeigen.', + 'settings.openchamber.visual.option.diffLayout.sideBySide.label': 'Immer nebeneinander', + 'settings.openchamber.visual.option.diffLayout.sideBySide.description': 'Vergleiche Original- und geänderte Dateien.', + 'settings.openchamber.visual.option.mermaidRendering.svg.label': 'SVG', + 'settings.openchamber.visual.option.mermaidRendering.svg.description': 'Diagramme als skalierbare Grafiken rendern.', + 'settings.openchamber.visual.option.mermaidRendering.ascii.label': 'ASCII', + 'settings.openchamber.visual.option.mermaidRendering.ascii.description': 'Diagramme als Textblöcke rendern.', + 'settings.openchamber.visual.option.pwaOrientation.system.label': 'System folgen', + 'settings.openchamber.visual.option.pwaOrientation.system.description': 'Die Geräteorientierungseinstellung respektieren.', + 'settings.openchamber.visual.option.pwaOrientation.portrait.label': 'Hochformat sperren', + 'settings.openchamber.visual.option.pwaOrientation.portrait.description': 'App installieren, gesperrt im Hochformat.', + 'settings.openchamber.visual.option.pwaOrientation.landscape.label': 'Querformat sperren', + 'settings.openchamber.visual.option.pwaOrientation.landscape.description': 'App installieren, gesperrt im Querformat.', + 'settings.openchamber.visual.option.mobileKeyboardMode.native.label': 'Browser folgen', + 'settings.openchamber.visual.option.mobileKeyboardMode.native.description': 'Die Browser-Vorgabe für Panning und Viewport-Änderungen bei geöffneter Tastatur verwenden.', + 'settings.openchamber.visual.option.mobileKeyboardMode.resizeContent.label': 'Inhalt skalieren', + 'settings.openchamber.visual.option.mobileKeyboardMode.resizeContent.description': 'Fordert unterstützte Browser auf, das App-Layout zu verkleinern, anstatt nur auf Panning zu setzen.', + 'settings.openchamber.visual.option.userMessageRendering.markdown.label': 'Markdown', + 'settings.openchamber.visual.option.userMessageRendering.markdown.description': 'Benutzer-Text mit Markdown-Formatierung darstellen.', + 'settings.openchamber.visual.option.userMessageRendering.plain.label': 'Klartext', + 'settings.openchamber.visual.option.userMessageRendering.plain.description': 'Benutzer-Text mit erhaltenen Leerzeichen und Links darstellen.', + 'settings.openchamber.visual.option.chatRenderMode.sorted.label': 'Sortiert', + 'settings.openchamber.visual.option.chatRenderMode.sorted.description': 'Beendet Nachrichten des Assistenten ohne Live-Streaming darstellen.', + 'settings.openchamber.visual.option.chatRenderMode.live.label': 'Live', + 'settings.openchamber.visual.option.chatRenderMode.live.description': 'Streamt den Text und Werkzeuge des Assistenten, sobald sie eintreffen.', + 'settings.openchamber.visual.option.messageTransport.auto.label': 'Auto', + 'settings.openchamber.visual.option.messageTransport.auto.description': 'Bevorzugt WebSocket und wechselt bei Bedarf zu SSE.', + 'settings.openchamber.visual.option.messageTransport.ws.label': 'WebSocket', + 'settings.openchamber.visual.option.messageTransport.ws.description': 'Verwendet WebSocket für das Streamen von Nachrichten.', + 'settings.openchamber.visual.option.messageTransport.sse.label': 'SSE', + 'settings.openchamber.visual.option.messageTransport.sse.description': 'Verwendet Server-Sent Events für das Streamen von Nachrichten.', + 'settings.openchamber.visual.option.activityRenderMode.collapsed.label': 'Einklappen', + 'settings.openchamber.visual.option.activityRenderMode.collapsed.description': 'Aktivität standardmäßig einklappen.', + 'settings.openchamber.visual.option.activityRenderMode.summary.label': 'Erweitert', + 'settings.openchamber.visual.option.activityRenderMode.summary.description': 'Aktivität standardmäßig erweitern.', + 'settings.openchamber.visual.option.timeFormat.auto.label': 'Auto', + 'settings.openchamber.visual.option.timeFormat.auto.description': 'Verwendet die System-Lokalisierungseinstellung.', + 'settings.openchamber.visual.option.timeFormat.24h.label': '24-Stunden', + 'settings.openchamber.visual.option.timeFormat.24h.description': 'Zeigt die Zeit als 14:15 an.', + 'settings.openchamber.visual.option.timeFormat.12h.label': '12-Stunden', + 'settings.openchamber.visual.option.timeFormat.12h.description': 'Zeit als 02:15 PM anzeigen.', + 'settings.openchamber.visual.option.weekStart.auto.label': 'Automatisch', + 'settings.openchamber.visual.option.weekStart.auto.description': 'Lokale Wochenbeginn verwenden.', + 'settings.openchamber.visual.option.weekStart.monday.label': 'Montag', + 'settings.openchamber.visual.option.weekStart.sunday.label': 'Sonntag', + 'settings.magicPrompts.page.loading.aria': 'Wird geladen', + 'settings.magicPrompts.page.loading.text': 'Magic Prompts werden geladen...', + 'settings.magicPrompts.page.block.visiblePrompt': 'Sichtbare Eingabeaufforderung', + 'settings.magicPrompts.page.block.instructions': 'Anweisungen', + 'settings.magicPrompts.page.group.gitCommitGenerate.title': 'Commit-Erstellung', + 'settings.magicPrompts.page.group.gitCommitGenerate.description': 'Eingabeaufforderungen zur Commit-Nachrichtenerstellung: Sichtbare Benutzernachricht + versteckte Anweisungen.', + 'settings.magicPrompts.page.group.gitPrGenerate.title': 'PR-Erstellung', + 'settings.magicPrompts.page.group.gitPrGenerate.description': 'Eingabeaufforderungen zur PR-Titel-/Inhalts-Erstellung: Sichtbare Benutzernachricht + versteckte Anweisungen.', + 'settings.magicPrompts.page.group.githubPrReview.title': 'PR-Überprüfung', + 'settings.magicPrompts.page.group.githubPrReview.description': 'Eingabeaufforderungen für den PR-Überprüfungsprozess: Sichtbare Benutzernachricht + versteckte Anweisungspayload.', + 'settings.magicPrompts.page.group.githubIssueReview.title': 'Problem-Überprüfung', + 'settings.magicPrompts.page.group.githubIssueReview.description': 'Eingabeaufforderungen für den Problem-Überprüfungsprozess: Sichtbare Benutzernachricht + versteckte Anweisungspayload.', + 'settings.magicPrompts.page.group.githubPrFailedChecksReview.title': 'PR-Fehlgeschlagene Checks Überprüfung', + 'settings.magicPrompts.page.group.githubPrFailedChecksReview.description': 'Eingabeaufforderungen zur Analyse fehlgeschlagener PR-Checks.', + 'settings.magicPrompts.page.group.githubPrCommentsReview.title': 'PR-Kommentar-Überprüfung', + 'settings.magicPrompts.page.group.githubPrCommentsReview.description': 'Eingabeaufforderungen zur Analyse von PR-Kommentaren.', + 'settings.magicPrompts.page.group.githubSinglePrCommentReview.title': 'Einzelner PR-Kommentar-Überprüfung', + 'settings.magicPrompts.page.group.githubSinglePrCommentReview.description': 'Eingabeaufforderungen zur Analyse eines einzelnen PR-Kommentars.', + 'settings.magicPrompts.page.group.gitConflictResolve.title': 'Merge/Rebase Konfliktlösung', + 'settings.magicPrompts.page.group.gitConflictResolve.description': 'Eingabeaufforderungen beim Auflösen von Merge-/Rebase-Konflikten mit KI.', + 'settings.magicPrompts.page.group.gitCherrypickConflictResolve.title': 'Cherry-pick-Konfliktlösung', + 'settings.magicPrompts.page.group.gitCherrypickConflictResolve.description': 'Prompts, die bei der Auflösung von Cherry-pick-Konflikten im Integrierungsfluss verwendet werden.', + 'settings.magicPrompts.page.group.planImprove.title': 'Plan verbessern', + 'settings.magicPrompts.page.group.planImprove.description': 'Versteckter Prompt, der beim Senden eines gespeicherten Plans in einen Verbesserungsfluss verwendet wird.', + 'settings.magicPrompts.page.group.planTodo.title': 'Todo-Planung', + 'settings.magicPrompts.page.group.planTodo.description': 'Versteckter Prompt, der beim Senden einer Todo in eine neue Planungssitzung verwendet wird.', + 'settings.magicPrompts.page.group.planImplement.title': 'Plan umsetzen', + 'settings.magicPrompts.page.group.planImplement.description': 'Versteckter Prompt, der beim Senden eines gespeicherten Plans in einen Umsetzungsfluss verwendet wird.', + 'settings.magicPrompts.page.group.sessionSummary.title': 'Sitzungszusammenfassung', + 'settings.magicPrompts.page.group.sessionSummary.description': 'Prompts, die vom /summary-Slash-Befehl verwendet werden: sichtbare Benutzermitteilung + versteckte Anweisungen. Nicht-destructiv - komprimiert nicht die Sitzungshistorie.', + 'settings.magicPrompts.page.group.sessionWorkspaceReview.title': 'Arbeitsbereichsüberprüfung', + 'settings.magicPrompts.page.group.sessionExplore.title': 'Codebase-Tour', + 'settings.magicPrompts.page.group.sessionExplore.description': 'Von dem /explore-Slash-Befehl verwendete Prompts: sichtbare Benutzer-Nachricht + versteckte Anweisungen. Untersucht das Repository und gibt eine strukturierte Orientierung – den Überblick, Hauptmodule, wie sie miteinander verbunden sind und wo man beginnen sollte – anstelle einer Datei-für-Datei-Ausgabe.', + 'settings.magicPrompts.page.group.sessionWorkspaceReview.description': 'Prompts, die vom /workspace-review-Slash-Befehl verwendet werden: sichtbare Benutzermitteilung + versteckte Anweisungen. Überprüft die Arbeitsbereichsdifferenz, ob sie ihr Ziel erreicht und korrekt sowie angemessen ist, klassifiziert Ergebnisse nach Schweregrad.', + 'settings.magicPrompts.page.group.sessionFeaturePlan.title': 'Feature-Planung', + 'settings.magicPrompts.page.group.sessionFeaturePlan.description': 'Von dem /plan-feature-Slash-Befehl verwendete Prompts: sichtbare Benutzer-Nachricht + versteckte Anweisungen. Führt einen geführten Dialog durch, der die Codebasis erforscht und klärende Fragen in kleinen Mengen stellt, bevor ein Implementierungsplan erstellt wird.', + 'settings.magicPrompts.page.group.sessionCatchUp.title': 'Nachholen', + 'settings.magicPrompts.page.group.sessionCatchUp.description': 'Von dem /catch-up-Slash-Befehl verwendete Prompts: sichtbare Benutzer-Nachricht + versteckte Anweisungen. Erstellt branch-awareen Kontext – die Commits des Branches, seinen PR und uncommittede Arbeit zusammen – um zu verstehen, was du getan hast, dann gibt es eine übersichtliche Zusammenfassung und einen produktorientierten nächsten Schritt.', + 'settings.magicPrompts.page.group.sessionDebug.title': 'Fehlersuche', + 'settings.magicPrompts.page.group.sessionDebug.description': 'Von dem /debug-Slash-Befehl verwendete Prompts: sichtbare Benutzer-Nachricht + versteckte Anweisungen. Führt eine geführte Ursachenforschung durch – erfasst das Symptom, bildet Hypothesen, prüft diese gegen den Code und bestätigt die Ursache, bevor eine Lösung vorgeschlagen wird.', + 'settings.magicPrompts.page.group.sessionWeigh.title': 'Optionen bewerten', + 'settings.magicPrompts.page.group.sessionWeigh.description': 'Von dem /weigh-Slash-Befehl verwendete Prompts: sichtbare Benutzer-Nachricht + versteckte Anweisungen. Untersucht den Code, legt dann 2-3 verschiedene Ansätze mit Kompromissen und einer Empfehlung dar – ohne einen Plan oder Code zu schreiben.', + 'settings.magicPrompts.page.group.sessionFusion.title': 'Fusion', + 'settings.magicPrompts.page.group.sessionFusion.description': 'Prompts, die verwendet werden, wenn mehrere Lauf-Ergebnisse in eine endgültige Antwort zusammengeführt werden: sichtbare Benutzer-Nachricht + versteckte Anweisungen vor den Quell-Ergebnissen.', + 'settings.magicPrompts.page.actions.resetting': 'Zurücksetzen...', + 'settings.magicPrompts.page.actions.resetAllOverrides': 'Alle Überschreibungen zurücksetzen', + 'settings.magicPrompts.page.actions.resetToDefault': 'Auf Standard zurücksetzen', + 'settings.magicPrompts.page.actions.save': 'Speichern', + 'settings.magicPrompts.page.placeholdersLabel': 'Platzhalter:', + 'settings.magicPrompts.page.validation.visiblePromptRequired': 'Sichtbarer Prompt darf nicht leer sein.', + 'settings.magicPrompts.page.status.unsavedChanges': 'Nicht gespeicherte Änderungen', + 'settings.magicPrompts.page.status.usingSavedOverride': 'Gespeicherte Überschreibung wird verwendet', + 'settings.magicPrompts.page.status.usingBuiltinDefault': 'Eingebaute Standardeinstellung wird verwendet', + 'settings.magicPrompts.page.toast.loadFailed': 'Fehler beim Laden der Magic Prompts', + 'settings.magicPrompts.page.toast.visiblePromptRequired': 'Sichtbarer Prompt darf nicht leer sein', + 'settings.magicPrompts.page.toast.saved': 'Magic Prompt gespeichert', + 'settings.magicPrompts.page.toast.saveFailed': 'Fehler beim Speichern des Magic Prompts', + 'settings.magicPrompts.page.toast.resetSuccess': 'Prompt auf Standard zurückgesetzt', + 'settings.magicPrompts.page.toast.resetFailed': 'Fehler beim Zurücksetzen des Prompts', + 'settings.magicPrompts.page.toast.resetAllSuccess': 'Alle Prompt-Überschreibungen zurückgesetzt', + 'settings.magicPrompts.page.toast.resetAllFailed': 'Fehler beim Zurücksetzen aller Prompts', + 'settings.openchamber.visual.section.followUpBehavior': 'Follow-up-Verhalten', + 'settings.openchamber.visual.section.followUpBehaviorAria': 'Follow-up-Verhalten', + 'settings.openchamber.visual.field.followUpBehaviorAria': 'Follow-up-Verhalten: {option}', + 'settings.openchamber.visual.field.followUpBehaviorDescription': 'Wählen Sie aus, was passiert, wenn Sie Enter auf einer Follow-up-Nachricht drücken, während der Agent noch antwortet.', + 'settings.openchamber.visual.option.followUpBehavior.steer.label': 'Steuerung', + 'settings.openchamber.visual.option.followUpBehavior.queue.label': 'Warteschlange', + + 'settings.providers.page.quotaCredentials.accessToken': 'Zugriffstoken', + 'settings.providers.page.quotaCredentials.refreshToken': 'Aktualisierungstoken', + 'settings.providers.page.quotaCredentials.tokenPlaceholder': 'Token einfügen', + 'settings.view.nav.group.general': 'OpenChamber', + 'settings.view.nav.group.projects': 'Arbeitsbereich', + 'settings.view.nav.group.opencode': 'OpenCode', + 'settings.view.nav.group.content': 'Bibliothek', + 'settings.page.appearance.description': 'Passe an, wie OpenChamber aussieht und sich anfühlt.', + 'settings.page.chat.description': 'Konfiguriere, wie Nachrichten und Werkzeuge angezeigt werden.', + 'settings.page.shortcuts.description': 'Tastenkürzel anpassen.', + 'settings.page.general.title': 'Allgemein', + 'settings.page.general.description': 'App-Start, Sicherheit, Verbindung und Datenschutz.', + 'settings.page.sessions.description': 'Standardwerte und Aufbewahrung für Sitzungen festlegen.', + 'settings.page.notifications.description': 'Wähle, wann und wie du benachrichtigt wirst.', + 'settings.page.voice.description': 'Spracheingabe und Diktat konfigurieren.', + 'settings.page.tunnel.description': 'Diese Instanz über einen Remote-Tunnel bereitstellen.', + 'settings.common.infoAria': 'Weitere Informationen', + 'settings.common.status.saved': 'Gespeichert', + 'settings.common.status.saveFailed': 'Speichern fehlgeschlagen', + 'settings.agents.page.permissionsEditor.sectionInfo': 'Bearbeitet die eigenen Berechtigungsregeln dieses Agenten genau so, wie sie in seiner Konfiguration gespeichert sind. „Vererben“ lässt einen Schlüssel unset, damit globale Konfiguration und Standardwerte gelten.', + 'settings.agents.page.permissionsEditor.defaultLabel': 'Standard für alle Werkzeuge', + 'settings.agents.page.permissionsEditor.defaultAria': 'Standardberechtigung für alle Werkzeuge', + 'settings.agents.page.permissionsEditor.defaultInfo': 'Der agentenweite Fallback (der *-Schlüssel). Gilt für jedes Werkzeug ohne eigene Regel.', + 'settings.agents.page.permissionsEditor.effectiveHint': '→ {action}', + 'settings.agents.page.permissionsEditor.ruleCount': '{count} Regeln', + 'settings.agents.page.permissionsEditor.keyAria': 'Berechtigung für {key}', + 'settings.agents.page.permissionsEditor.patternPlaceholder': 'Muster, z. B. rm -rf * oder /pfad/**', + 'settings.agents.page.permissionsEditor.patternActionAria': 'Aktion für das Muster {key}', + 'settings.agents.page.permissionsEditor.customKeyPlaceholder': 'Benutzerdefinierter Berechtigungsschlüssel…', + 'settings.agents.page.permissionsEditor.sessionRulesTitle': 'In Sitzung gewährt (nicht gespeichert)', + 'settings.agents.page.permissionsEditor.sessionRulesInfo': 'Regeln, die während aktiver Sitzungen gewährt wurden (z. B. Antworten wie „immer erlauben“). Sie gelten sofort, sind aber kein Teil der gespeicherten Konfiguration und verschwinden beim Neustart.', + 'settings.agents.page.permissionsEditor.action.default': 'Standard', + 'settings.agents.page.permissionsEditor.action.inherit': 'Vererben', + 'settings.agents.page.permissionsEditor.action.allow': 'Erlauben', + 'settings.agents.page.permissionsEditor.action.ask': 'Nachfragen', + 'settings.agents.page.permissionsEditor.action.deny': 'Verweigern', + 'settings.agents.page.permissionsEditor.actions.save': 'Berechtigungen speichern', + 'settings.agents.page.permissionsEditor.actions.discard': 'Verwerfen', + 'settings.agents.page.permissionsEditor.actions.addRule': 'Regel hinzufügen', + 'settings.agents.page.permissionsEditor.actions.addKey': 'Schlüssel hinzufügen', + 'settings.agents.page.permissionsEditor.actions.removeRuleAria': 'Regel entfernen', + 'settings.agents.page.permissionsEditor.actions.retry': 'Erneut versuchen', + 'settings.agents.page.permissionsEditor.state.loadFailed': 'Agenten-Berechtigungskonfiguration konnte nicht geladen werden.', + 'settings.agents.page.permissionsEditor.toast.saved': 'Berechtigungen gespeichert', + 'settings.agents.page.permissionsEditor.toast.savedRestartRequired': 'Berechtigungen gespeichert — OpenCode-Server neu starten, um sie anzuwenden', + 'settings.agents.page.permissionsEditor.toast.saveFailed': 'Berechtigungen konnten nicht gespeichert werden', + 'settings.page.behavior.description': 'Lege fest, wie der Agent reagiert.', + 'settings.behavior.page.section.systemPromptOptimization': 'System-Prompt-Optimierung', + 'settings.behavior.page.systemPromptOptimization.enable': 'Größe des System-Prompts optimieren', + 'settings.behavior.page.systemPromptOptimization.enableAria': 'Größe des OpenCode-System-Prompts optimieren', + 'settings.behavior.page.systemPromptOptimization.info': 'Reduziert den System-Prompt für die Build- und Plan-Agenten schätzungsweise um 40 %. Andere Agenten bleiben unverändert. Dadurch können benutzerdefinierte Definitionen entfernt werden, die Build oder Plan überschreiben, daher nicht für Workflows aktivieren, die diese Agenten anpassen. Ein Neustart von OpenCode wendet die Änderung an.', + 'settings.behavior.page.systemPromptOptimization.restarting': 'OpenCode wird neu gestartet, um die System-Prompt-Optimierung anzuwenden…', + 'settings.openchamber.desktopNetwork.field.windowControls': 'Fenstersteuerungen', + 'settings.openchamber.desktopNetwork.field.windowControlsStyle': 'Stil', + 'settings.openchamber.desktopNetwork.field.windowControlsStyleAria': 'Stil der Fenstersteuerungen', + 'settings.openchamber.desktopNetwork.option.windowControlsClassic': 'Klassisch', + 'settings.openchamber.desktopNetwork.option.windowControlsTrafficLights': 'Ampeln', + 'settings.openchamber.desktopNetwork.field.macMenuBarAria': 'OpenChamber in der macOS-Menüleiste anzeigen', + 'settings.openchamber.desktopNetwork.field.macMenuBar': 'OpenChamber in der Menüleiste anzeigen', + 'settings.openchamber.desktopNetwork.field.macMenuBarDescription': 'Erfordert einen Neustart der App. Wenn deaktiviert, erstellt OpenChamber weder den Menüleisten-Eintrag noch führt es dessen Sitzungs-, Genehmigungs- und Nutzungsaktualisierungen aus.', + 'settings.openchamber.desktopPassword.actions.showPassword': 'Passwort anzeigen', + 'settings.openchamber.desktopPassword.actions.hidePassword': 'Passwort verbergen', + 'settings.openchamber.opencodeCli.field.agentControlTool': 'Agenten-Steuerungswerkzeug', + 'settings.openchamber.opencodeCli.field.agentControlToolAria': 'Das Agenten-Steuerungswerkzeug aktivieren', + 'settings.openchamber.opencodeCli.field.agentControlToolInfo': 'Lässt Agenten deine Arbeit per Chat orchestrieren: Sitzungen und Arbeitsbereiche starten, Prompts an andere Agenten delegieren und geplante Aufgaben verwalten. Fügt jeder Sitzung eine kleine Werkzeugbeschreibung hinzu. Gilt nach Speichern + Neuladen.', + 'settings.openchamber.defaults.walkthroughModel.title': 'Walkthrough-Modell ändern', + 'settings.openchamber.defaults.walkthroughModel.description': 'Die KI-Prüfung deiner Änderungen benötigt strukturierten Output und Platz für einen ganzen Diff, den ein günstiges kleines Modell oft nicht liefern kann. Modelle, die der Katalog als nicht in der Lage zu strukturiertem Output meldet, werden in diesem Auswahlfeld ausgeblendet. Lasse es leer, dann wird das kleine Modell verwendet.', + 'settings.openchamber.defaults.walkthroughModel.overrideModel': 'Walkthrough-Modell', + 'settings.openchamber.defaults.walkthroughModel.usesSmallModel': 'Kleines Modell', + 'settings.voice.page.provider.openai': 'OpenAI', + 'settings.openchamber.visual.section.colorModeAndTheme': 'Farbmodus & Theme', + 'settings.openchamber.visual.section.densityAndType': 'Dichte & Typografie', + 'settings.openchamber.visual.section.appInstall': 'App-Installation', + 'settings.openchamber.visual.section.chatDisplay': 'Anzeige', + 'settings.openchamber.visual.section.chatMessageOptions': 'Nachrichtenoptionen', + 'settings.openchamber.visual.section.chatFeatures': 'Funktionen', + 'settings.openchamber.visual.field.terminalShell': 'Terminal-Shell', + 'settings.openchamber.visual.field.terminalShellAria': 'Terminal-Shell auswählen', + 'settings.openchamber.visual.field.terminalShellHint': 'Terminal neu starten, um diese Änderung auf die aktuelle Sitzung anzuwenden.', + 'settings.openchamber.visual.field.terminalLoginShell': 'Als Login-Shell starten', + 'settings.openchamber.visual.option.terminalShell.auto': 'Automatisch', + 'settings.openchamber.visual.field.autoSaveEnabledAria': 'Dateien automatisch speichern', + 'settings.openchamber.visual.field.autoSaveEnabled': 'Dateien automatisch speichern', + 'settings.openchamber.visual.field.autoSaveEnabledInfo': 'Dateiänderungen automatisch speichern, nachdem du mit dem Tippen aufgehört hast. Deaktivieren, um manuelles Speichern zu verlangen.', + 'settings.openchamber.visual.field.draftStartersVisible': 'Starter auf dem Bildschirm für neue Sitzungen anzeigen', + 'settings.openchamber.visual.field.draftStartersVisibleAria': 'Starter auf dem Bildschirm für neue Sitzungen anzeigen', + 'settings.openchamber.visual.option.themeMode.system.description': 'Systemeinstellung übernehmen', + 'settings.openchamber.visual.option.themeMode.light.description': 'Immer helles Erscheinungsbild verwenden', + 'settings.openchamber.visual.option.themeMode.dark.description': 'Immer dunkles Erscheinungsbild verwenden', + 'chat.message.userText.collapseAria': 'Benutzernachricht einklappen', +}; diff --git a/packages/ui/src/lib/i18n/messages/de.ts b/packages/ui/src/lib/i18n/messages/de.ts new file mode 100644 index 00000000..f9d325b9 --- /dev/null +++ b/packages/ui/src/lib/i18n/messages/de.ts @@ -0,0 +1,2908 @@ +import { settingsDict } from './de.settings'; + +export const dict = { + ...settingsDict, + 'common.language.german': 'Deutsch', + 'common.loading': 'Wird geladen...', + 'common.unavailable': 'Nicht verfügbar', + 'common.language.english': 'Englisch', + 'common.language.french': 'Französisch', + 'common.language.simplifiedChinese': 'Chinesisch (Vereinfacht)', + 'common.language.traditionalChinese': 'Chinesisch (Traditionell)', + 'common.language.ukrainian': 'Ukrainisch', + 'common.language.spanish': 'Spanisch', + 'common.language.brazilianPortuguese': 'Brasilianisches Portugiesisch', + 'common.language.korean': 'Koreanisch', + 'common.language.polish': 'Polnisch', + 'common.language.japanese': 'Japanisch', + 'common.revealPath.finder': 'Im Finder anzeigen', + 'common.revealPath.fileExplorer': 'In Datei-Explorer öffnen', + 'common.revealPath.fileManager': 'In Dateimanager öffnen', + 'pwa.installPrompt.description': 'Installiere OpenChamber für schnelleren Zugriff', + 'pwa.installPrompt.action': 'Installieren', + 'pwa.installPrompt.dismiss': 'Schließen', + 'pwa.installPrompt.started': 'Installation gestartet', + 'pwa.installPrompt.installed': 'OpenChamber installiert', + 'layout.mainTab.chat': 'Chat', + 'layout.mainTab.plan': 'Plan', + 'layout.mainTab.diff': 'Diff', + 'layout.mainTab.diagram': 'Diagramm', + 'layout.mainTab.files': 'Dateien', + 'layout.mainTab.terminal': 'Terminal', + 'layout.mainTab.context': 'Kontext', + 'mobile.nav.aria': 'Mobile Navigation', + 'mobile.connect.welcome.title': 'Mit OpenChamber verbinden', + 'mobile.connect.welcome.description': 'Füge eine Server-URL hinzu oder scanne einen Pairing-QR-Code, um die mobile App zu nutzen.', + 'mobile.connect.url.label': 'Server-URL', + 'mobile.connect.url.placeholder': 'http://192.168.1.74:2606', + 'mobile.connect.token.label': 'Client-Token', + 'mobile.connect.token.placeholder': 'Zugriffstoken einfügen', + 'mobile.connect.token.hint': 'Nur erforderlich, wenn Ihr Server ein Token anstelle eines Passworts erfordert.', + 'mobile.connect.password.label': 'Passwort', + 'mobile.connect.password.placeholder': 'OpenChamber-Passwort', + 'mobile.connect.connectButton': 'Verbinden', + 'mobile.connect.unlockButton': 'Entsperren und verbinden', + 'mobile.connect.cancelPassword': 'Anderen Server verwenden', + 'mobile.connect.connecting': 'Verbindung herstellen...', + 'mobile.connect.scanQr': 'QR-Code scannen', + 'mobile.connect.welcome.scanHint': 'Öffnen Sie auf Ihrem Computer «Gerät hinzufügen», um einen QR-Code anzuzeigen, und scannen Sie ihn dann hier.', + 'mobile.connect.advanced': 'Erweitert', + 'mobile.connect.manual.toggle': 'Verbindung über Adresse', + 'mobile.connect.scan.permissionDenied': 'Kamerazugriff ist ausgeschaltet. Aktivieren Sie ihn in den Einstellungen, um einen QR-Code zu scannen.', + 'mobile.connect.scan.failed': 'Konnte diesen QR-Code nicht scannen. Versuchen Sie es erneut oder geben Sie die URL manuell ein.', + 'mobile.connect.scan.invalid': 'Dieser QR-Code ist kein OpenChamber-Verbindungscode.', + 'mobile.connect.scan.unsupported': 'QR-Scanning ist nur in der installierten mobilen App verfügbar.', + 'mobile.connect.saved.title': 'Gespeicherte Verbindungen', + 'mobile.connect.saved.empty': 'Noch keine gespeicherten Verbindungen.', + 'mobile.connect.relay.badge': 'über OpenChamber Relay', + 'mobile.connect.error.urlRequired': 'Geben Sie eine Server-URL ein.', + 'mobile.connect.splash.connectingTo': 'Verbindung zum Gerät:', + 'mobile.connect.error.invalidUrl': 'Diese Server-URL ist ungültig.', + 'mobile.connect.error.unreachable': 'Konnte den OpenChamber-Server nicht erreichen.', + 'mobile.connect.error.authRequired': 'Dieser Server benötigt ein Passwort oder ein Client-Token.', + 'mobile.connect.error.passwordFailed': 'Konnte diesen Server nicht entsperren. Überprüfen Sie das Passwort.', + 'mobile.instances.addTitle': 'Instanz hinzufügen', + 'mobile.instances.addManual': 'Nach Adresse hinzufügen', + 'mobile.instances.editTitle': 'Instanz bearbeiten', + 'mobile.instances.edit': 'Bearbeiten', + 'mobile.instances.delete': 'Löschen', + 'mobile.instances.deleteAria': 'Lösche {label}', + 'mobile.instances.confirmDeleteAria': 'Löschen bestätigen {label}', + 'mobile.instances.cancelDeleteAria': '{label} behalten', + 'mobile.instances.cancelEdit': 'Abbrechen', + 'mobile.instances.label.label': 'Name', + 'mobile.instances.label.placeholder': 'Optionaler Anzeigename', + 'mobile.instances.saveNew': 'Instanz speichern', + 'mobile.instances.status.connectedDirect': 'Verbunden · Lokales Netzwerk', + 'mobile.instances.status.connectedRelay': 'Verbunden · Privater Relay', + 'mobile.instances.saveEdit': 'Änderungen speichern', + 'mobile.nav.changes': 'Änderungen', + 'mobile.nav.settings': 'Einstellungen', + 'mobile.surface.closeAria': 'Schließen', + 'mobile.header.openMetadataAria': 'Sitzungs-Metadaten öffnen', + 'mobile.header.metadata.context': 'Kontext', + 'mobile.header.metadata.usage': 'Nutzung', + 'mobile.menu.titleAria': 'Arbeitsbereichstools', + 'mobile.menu.files': 'Dateien', + 'mobile.menu.changes': 'Änderungen', + 'mobile.menu.mcp': 'MCP', + 'mobile.menu.instances': 'Instanzen', + 'mobile.menu.update': 'Aktualisieren', + 'mobile.menu.settings': 'Einstellungen', + 'mobile.sessions.newChatCta': 'Neuer Chat in {project}', + 'mobile.sessions.dateGroup.today': 'Heute', + 'mobile.sessions.dateGroup.yesterday': 'Gestern', + 'mobile.sessions.dateGroup.thisWeek': 'Früher diese Woche', + 'mobile.sessions.dateGroup.older': 'Älter', + 'mobile.sessions.section.worktrees': 'Worktrees', + 'mobile.sessions.section.otherProjects': 'Projekt wechseln', + 'mobile.sessions.section.projects': 'Projekte', + 'mobile.sessions.empty.noProjectsTitle': 'Noch keine Projekte', + 'mobile.sessions.empty.noProjectsDescription': 'Füge ein Projekt hinzu, um mit deinem Code zu chatten.', + 'mobile.sessions.empty.noSessionsTitle': 'Noch keine Sitzungen', + 'mobile.sessions.empty.noSessionsDescription': 'Starte deinen ersten Chat, um ihn hier zu sehen.', + 'mobile.sessions.empty.searchTitle': 'Keine Treffer', + 'mobile.sessions.empty.searchDescription': 'Versuche einen anderen Suchbegriff.', + 'mobile.sessions.showArchived': 'Archivierte anzeigen ({count})', + 'mobile.sessions.hideArchived': 'Archivierte ausblenden', + 'mobile.sessions.activeWorktreeAria': 'Aktives Worktree', + 'mobile.sessions.activeProjectAria': 'Aktives Projekt', + 'mobile.sessions.startNewChat': 'Neuen Chat starten', + 'mobile.sessions.newChat': 'Neuer Chat', + 'mobile.sessions.editOrder': 'Projekte neu anordnen', + 'mobile.sessions.doneEditing': 'Fertig', + 'mobile.sessions.editOrderHint': 'Ziehe den Griff, um die Projekte neu anzuordnen. Tippe auf das Häkchen, um zu beenden.', + 'mobile.sessions.editProjectAria': '{label} bearbeiten', + 'mobile.sessions.dragHandleAria': '{label} ziehen, um neu anzuordnen', + 'mobile.sessions.moveUpAria': '{label} nach oben verschieben', + 'mobile.sessions.moveDownAria': '{label} nach unten verschieben', + 'mobile.sessions.removeProjectAria': '{label} entfernen', + 'mobile.sessions.confirmRemoveProjectAria': 'Entfernen von {label} bestätigen', + 'mobile.sessions.toast.projectRemoved': '{label} entfernt', + 'mobile.sessions.archiveSessionAria': '{title} archivieren', + 'mobile.sessions.cancelArchiveAria': 'Archivierung von {title} abbrechen', + 'mobile.projectEdit.worktreesTitle': 'Worktrees', + 'mobile.projectEdit.worktreesEmpty': 'Noch keine Worktrees in diesem Projekt.', + 'mobile.projectEdit.reorderHint': 'Ziehen, um Worktrees neu anzuordnen.', + 'mobile.projectEdit.dragWorktreeAria': '{label} ziehen, um neu anzuordnen', + 'mobile.projectEdit.deleteWorktreeAria': 'Worktree {label} entfernen', + 'mobile.projectEdit.deleteWorktreeTitle': 'Worktree entfernen', + 'mobile.projectEdit.deleteWorktreeConfirmButton': 'Entfernen', + 'mobile.projectEdit.deleteWorktreeConfirm': 'Worktree „{name}“ entfernen? Dies kann nicht rückgängig gemacht werden.', + 'mobile.projectEdit.deleteWorktreeDirty': 'Dieser Worktree hat uncommittete Änderungen, die verloren gehen werden.', + 'mobile.projectEdit.deleteWorktreeArchiveNote': '{count} angehängte Sitzung(en) werden archiviert.', + 'mobile.projectEdit.deleteLocalBranch': 'Lokale Branch auch löschen', + 'mobile.projectEdit.deleteRemoteBranch': 'Entferne Remote-Branch', + 'mobile.sessions.showMore': '{count} weitere anzeigen', + 'mobile.sessions.search.section.sessions': 'Sitzungen', + 'mobile.sessions.search.section.archived': 'Archiviert', + 'mobile.sessions.search.section.projects': 'Projekte', + 'mobile.sessions.clearSearchAria': 'Suche löschen', + 'mobile.header.noProject': 'Projekt auswählen', + 'mobile.header.activeSession': 'Aktive Sitzung', + 'mobile.header.noSession': 'Keine aktive Sitzung', + 'mobile.sessions.openSheetAria': 'Sitzungen und Projekte öffnen', + 'mobile.sessions.closeSheetAria': 'Sitzungen und Projekte schließen', + 'mobile.sessions.sheet.title': 'Sitzungen', + 'mobile.sessions.sheet.description': 'Projekte wechseln, Sitzungen öffnen oder einen neuen Chat starten.', + 'mobile.sessions.search.placeholder': 'Sitzungen durchsuchen', + 'mobile.sessions.empty': 'Keine Sitzungen gefunden.', + 'mobile.sessions.unassignedProject': 'Andere Sitzungen', + 'mobile.sessions.newSessionAria': 'Neue Sitzung in diesem Projekt starten', + 'mobile.sessions.untitled': 'Unbenannte Sitzung', + 'mobile.sessions.project.sessionsSingle': '1 Sitzung', + 'mobile.sessions.project.sessionsPlural': '{count} Sitzungen', + 'mobile.files.refreshAria': 'Dateien aktualisieren', + 'mobile.files.backToParentAria': 'Zurück zu {name}', + 'mobile.files.rootDirectory': 'Projektdateien', + 'mobile.files.search.placeholder': 'Dateien durchsuchen', + 'mobile.files.search.empty': 'Keine Dateien gefunden.', + 'mobile.files.parentDirectory': 'Übergeordnetes Verzeichnis', + 'mobile.files.empty.noDirectory': 'Wählen Sie ein Projekt aus, um Dateien zu durchsuchen.', + 'mobile.files.empty.directory': 'Dieses Verzeichnis ist leer.', + 'mobile.files.error.listFailed': 'Fehler beim Laden der Dateien', + 'mobile.files.error.readUnavailable': 'Dateivorschau ist in dieser Laufzeit nicht verfügbar.', + 'mobile.files.file.truncated': 'Dateivorschau für mobile Geräte gekürzt.', + 'mobile.files.copyPathAria': 'Dateipfad kopieren', + 'mobile.files.copyContent': 'Inhalt kopieren', + 'mobile.files.copyContentAria': 'Dateiinhalt kopieren', + 'mobile.files.toast.pathCopied': 'Pfad kopiert', + 'mobile.files.toast.contentCopied': 'Inhalt kopiert', + 'mobile.files.toast.copyFailed': 'Kopieren fehlgeschlagen', + 'mobile.changes.placeholder.title': 'Änderungen', + 'mobile.changes.placeholder.description': 'Arbeitsbaum-Überprüfung, Synchronisierung und Commit-Aktionen werden hier angezeigt.', + 'mobile.changes.branchLabel': 'Branch: {branch}', + 'mobile.changes.noRemote': 'Kein Remote verfügbar', + 'mobile.changes.cleanDescription': 'Es gibt keine geänderten Dateien in dieser Arbeitsumgebung.', + 'mobile.changes.diffDetail.subtitle': 'Read-only Diff', + 'mobile.changes.diffDetail.loadFailed': 'Fehler beim Laden des Diffs', + 'mobile.changes.diffDetail.missingTitle': 'Datei wurde nicht mehr geändert', + 'mobile.changes.diffDetail.missingDescription': 'Zurück zu Änderungen gehen und Liste aktualisieren.', + 'mobile.changes.diffDetail.imageUnavailable': 'Bild-Diffs sind in mobilen Änderungen noch nicht verfügbar.', + 'mobile.settings.placeholder.title': 'Einstellungen', + 'mobile.settings.placeholder.description': 'Fokussierte mobile Verbindungs- und App-Einstellungen werden hier angezeigt.', + 'layout.rightSidebar.git': 'Git', + 'layout.rightSidebar.files': 'Dateien', + 'layout.rightSidebar.context': 'Kontext', + 'layout.services.instance': 'Instanz', + 'layout.services.usage': 'Nutzung', + 'sessions.sidebar.header.actions.closeSessions': 'Sitzungen schließen', + 'sessions.sidebar.header.actions.addProject': 'Projekt hinzufügen', + 'sessions.sidebar.header.actions.newSession': 'Neue Sitzung', + 'sessions.sidebar.header.actions.newMultiRun': 'Neuer Multi-Run', + 'sessions.sidebar.header.actions.scheduledTasks': 'Geplante Aufgaben', + 'sessions.scheduledTasks.dialog.title': 'Geplante Aufgaben', + 'sessions.scheduledTasks.dialog.description': 'Serverseitige Aufgaben, die eine neue Sitzung erstellen und einen konfigurierten Prompt senden.', + 'sessions.scheduledTasks.dialog.project.label': 'Projekt', + 'sessions.scheduledTasks.dialog.project.placeholder': 'Projekt auswählen', + 'sessions.scheduledTasks.dialog.project.empty': 'Keine Projekte', + 'sessions.scheduledTasks.dialog.actions.newTask': 'Neue Aufgabe', + 'sessions.scheduledTasks.dialog.actions.runNow': 'Jetzt ausführen', + 'sessions.scheduledTasks.dialog.actions.edit': 'Bearbeiten', + 'sessions.scheduledTasks.dialog.actions.editAria': 'Bearbeite {taskName}', + 'sessions.scheduledTasks.dialog.actions.deleteAria': 'Lösche {taskName}', + 'sessions.scheduledTasks.dialog.loading': 'Aufgaben werden geladen...', + 'sessions.scheduledTasks.dialog.empty.noTasks': 'Noch keine geplanten Aufgaben.', + 'sessions.scheduledTasks.dialog.empty.selectProject': 'Wählen Sie ein Projekt aus, um geplante Aufgaben zu verwalten.', + 'sessions.scheduledTasks.dialog.error.chooseProjectFirst': 'Wählen Sie zuerst ein Projekt', + 'sessions.scheduledTasks.dialog.toast.loadFailed': 'Fehler beim Laden der geplanten Aufgaben', + 'sessions.scheduledTasks.dialog.toast.saved': 'Geplante Aufgabe gespeichert', + 'sessions.scheduledTasks.dialog.toast.updateFailed': 'Fehler beim Aktualisieren der Aufgabe', + 'sessions.scheduledTasks.dialog.toast.deleted': 'Geplante Aufgabe gelöscht', + 'sessions.scheduledTasks.dialog.toast.deleteFailed': 'Fehler beim Löschen der Aufgabe', + 'sessions.scheduledTasks.dialog.toast.started': 'Aufgabe gestartet', + 'sessions.scheduledTasks.dialog.toast.runFailed': 'Fehler beim Ausführen der Aufgabe', + 'sessions.scheduledTasks.dialog.confirm.deleteTask': 'Geplante Aufgabe "{taskName}" löschen?', + 'sessions.scheduledTasks.dialog.schedule.daily': 'Täglich {time}', + 'sessions.scheduledTasks.dialog.schedule.dailyWithTimezone': 'Täglich {time} ({timezone})', + 'sessions.scheduledTasks.dialog.schedule.weekly': 'Wöchentlich {days} {time}', + 'sessions.scheduledTasks.dialog.schedule.weeklyWithTimezone': 'Wöchentlich {days} {time} ({timezone})', + 'sessions.scheduledTasks.dialog.schedule.once': 'Einmalig {date} {time}', + 'sessions.scheduledTasks.dialog.schedule.onceWithTimezone': 'Einmalig {date} {time} ({timezone})', + 'sessions.scheduledTasks.dialog.schedule.cron': 'Cron: {cron}', + 'sessions.scheduledTasks.dialog.schedule.cronWithTimezone': 'Cron: {cron} ({timezone})', + 'sessions.scheduledTasks.dialog.schedule.unknownDate': 'Unbekanntes Datum', + 'sessions.scheduledTasks.dialog.schedule.weekdayShort.sun': 'So', + 'sessions.scheduledTasks.dialog.schedule.weekdayShort.mon': 'Mo', + 'sessions.scheduledTasks.dialog.schedule.weekdayShort.tue': 'Di', + 'sessions.scheduledTasks.dialog.schedule.weekdayShort.wed': 'Mi', + 'sessions.scheduledTasks.dialog.schedule.weekdayShort.thu': 'Do', + 'sessions.scheduledTasks.dialog.schedule.weekdayShort.fri': 'Fr', + 'sessions.scheduledTasks.dialog.schedule.weekdayShort.sat': 'Sa', + 'sessions.scheduledTasks.dialog.schedule.weekdayShort.unknown': '?', + 'sessions.scheduledTasks.dialog.relativeTime.inLessThanOneMinute': 'in <1m', + 'sessions.scheduledTasks.dialog.relativeTime.justNow': 'gerade jetzt', + 'sessions.scheduledTasks.dialog.relativeTime.inMinutes': 'in {count}m', + 'sessions.scheduledTasks.dialog.relativeTime.minutesAgo': '{count}m her', + 'sessions.scheduledTasks.dialog.relativeTime.inDuration': 'in {duration}', + 'sessions.scheduledTasks.dialog.relativeTime.durationAgo': '{duration} her', + 'sessions.scheduledTasks.dialog.status.success': 'Erfolg', + 'sessions.scheduledTasks.dialog.status.error': 'Fehler', + 'sessions.scheduledTasks.dialog.status.running': 'Läuft', + 'sessions.scheduledTasks.dialog.status.idle': 'Leerlauf', + 'sessions.scheduledTasks.dialog.nextRun.label': 'Nächste', + 'sessions.scheduledTasks.dialog.lastRun.label': 'Letzte Ausführung', + 'sessions.scheduledTasks.dialog.lastRun.runningNow': 'läuft gerade', + 'sessions.scheduledTasks.dialog.lastRun.never': 'nie', + 'sessions.scheduledTasks.dialog.taskToggle.enableAria': '{taskName} aktivieren', + 'sessions.scheduledTasks.dialog.taskToggle.pauseAria': '{taskName} pausieren', + 'sessions.scheduledTasks.dialog.taskToggle.enabled': 'Aktiviert', + 'sessions.scheduledTasks.dialog.taskToggle.paused': 'Pausiert', + 'sessions.scheduledTasks.editor.title.edit': 'Geplante Aufgabe bearbeiten', + 'sessions.scheduledTasks.editor.title.new': 'Neue geplante Aufgabe', + 'sessions.scheduledTasks.editor.description': 'Konfigurieren Sie eine serverseitige Aufgabe, die eine neue Sitzung erstellt und eine Eingabeaufforderung sendet.', + 'sessions.scheduledTasks.editor.taskName.label': 'Aufgabenname', + 'sessions.scheduledTasks.editor.taskName.placeholder': 'Tägliche Synchronisierung', + 'sessions.scheduledTasks.editor.scheduleType.label': 'Zeitplan-Typ', + 'sessions.scheduledTasks.editor.scheduleType.daily': 'Täglich', + 'sessions.scheduledTasks.editor.scheduleType.weekly': 'Wöchentlich', + 'sessions.scheduledTasks.editor.scheduleType.once': 'Einmalig', + 'sessions.scheduledTasks.editor.scheduleType.cron': 'Cron', + 'sessions.scheduledTasks.editor.date.label': 'Datum', + 'sessions.scheduledTasks.editor.date.placeholder': 'Datum auswählen', + 'sessions.scheduledTasks.editor.date.previousMonth': 'Vorheriger Monat', + 'sessions.scheduledTasks.editor.date.nextMonth': 'Nächster Monat', + 'sessions.scheduledTasks.editor.date.jumpToToday': 'Zu heute springen', + 'sessions.scheduledTasks.editor.date.today': 'Heute', + 'sessions.scheduledTasks.editor.time.label': 'Uhrzeit', + 'sessions.scheduledTasks.editor.time.hourAria': 'Stunden', + 'sessions.scheduledTasks.editor.time.minuteAria': 'Minuten', + 'sessions.scheduledTasks.editor.time.periodAria': 'Zeitperiode', + 'sessions.scheduledTasks.editor.time.period.am': 'AM', + 'sessions.scheduledTasks.editor.time.period.pm': 'PM', + 'sessions.scheduledTasks.editor.times.label': 'Zeiten', + 'sessions.scheduledTasks.editor.times.add': 'Zeit hinzufügen', + 'sessions.scheduledTasks.editor.times.removeAria': 'Zeit entfernen', + 'sessions.scheduledTasks.editor.timezone.label': 'Zeitzone', + 'sessions.scheduledTasks.editor.weekdays.label': 'Wochentage', + 'sessions.scheduledTasks.editor.model.label': 'Modell', + 'sessions.scheduledTasks.editor.thinkingLevel.label': 'Denklevel', + 'sessions.scheduledTasks.editor.thinkingLevel.default': 'Standard', + 'sessions.scheduledTasks.editor.agent.label': 'Agent', + 'sessions.scheduledTasks.editor.prompt.label': 'Prompt', + 'sessions.scheduledTasks.editor.prompt.placeholder': 'Zusammenfassung offener Aufgaben und Vorschläge für nächste Schritte', + 'sessions.scheduledTasks.editor.enabled.aria': 'Aufgabe aktivieren', + 'sessions.scheduledTasks.editor.enabled.label': 'Aktiviert', + 'sessions.scheduledTasks.editor.goal.label': 'Als Ziel ausführen', + 'sessions.scheduledTasks.editor.goal.aria': 'Führe diese Aufgabe als Ziel aus, das der Agent bis zum Abschluss verfolgt', + 'sessions.scheduledTasks.editor.goal.budgetLabel': 'Token-Budget', + 'sessions.scheduledTasks.editor.goal.budgetAria': 'Begrenze das Ziel auf ein Token-Budget', + 'sessions.scheduledTasks.editor.actions.closeAria': 'Schließen', + 'sessions.scheduledTasks.editor.actions.cancel': 'Abbrechen', + 'sessions.scheduledTasks.editor.actions.save': 'Speichern', + 'sessions.scheduledTasks.editor.actions.saving': 'Speichern...', + 'sessions.scheduledTasks.editor.toast.saveFailed': 'Fehler beim Speichern der Aufgabe', + 'sessions.scheduledTasks.editor.validation.taskNameRequired': 'Aufgabenname ist erforderlich', + 'sessions.scheduledTasks.editor.validation.promptRequired': 'Prompt ist erforderlich', + 'sessions.scheduledTasks.editor.validation.modelRequired': 'Modell ist erforderlich', + 'sessions.scheduledTasks.editor.validation.dateFormat': 'Datum muss im Format YYYY-MM-DD sein', + 'sessions.scheduledTasks.editor.validation.timeFormat': 'Zeit muss im Format HH:mm sein', + 'sessions.scheduledTasks.editor.validation.atLeastOneTime': 'Fügen Sie mindestens eine gültige Zeit hinzu', + 'sessions.scheduledTasks.editor.validation.atLeastOneWeekday': 'Wählen Sie mindestens einen Wochentag aus', + 'sessions.scheduledTasks.editor.validation.timezoneRequired': 'Zeitzone ist erforderlich', + 'sessions.scheduledTasks.editor.validation.cronRequired': 'Cron-Ausdruck ist erforderlich', + 'sessions.scheduledTasks.editor.validation.cronInvalid': 'Ungültiger Cron-Ausdruck', + 'sessions.scheduledTasks.editor.cronExpression.label': 'Cron-Ausdruck', + 'sessions.scheduledTasks.editor.cronExpression.placeholder': '*/5 * * * *', + 'sessions.scheduledTasks.editor.cronExpression.nextRuns': 'Nächste Ausführungen', + 'sessions.scheduledTasks.editor.cronExpression.examples': 'Beispiele', + 'sessions.scheduledTasks.editor.cronExpression.examples.every5min': 'Alle 5 Minuten', + 'sessions.scheduledTasks.editor.cronExpression.examples.everyHour': 'Stündlich', + 'sessions.scheduledTasks.editor.cronExpression.examples.monday9am': 'Jeden Montag um 9 Uhr', + 'sessions.scheduledTasks.editor.cronExpression.examples.9am5pm': 'Täglich 9 Uhr und 17 Uhr', + 'sessions.scheduledTasks.editor.cronExpression.examples.firstOfMonth': 'Erster Tag jeden Monats', + 'multirun.launcher.title': 'Neuer Multi-Run', + 'multirun.launcher.actions.closeEsc': 'Schließen (Esc)', + 'multirun.launcher.actions.cancel': 'Abbrechen', + 'multirun.launcher.actions.creating': 'Erstellen...', + 'multirun.launcher.actions.startWithModelCount': 'Start ({count} Modelle)', + 'multirun.launcher.project.label': 'Projekt', + 'multirun.launcher.project.placeholder': 'Projekt auswählen', + 'multirun.launcher.project.empty': 'Fügen Sie zunächst ein Projekt hinzu.', + 'multirun.launcher.project.gitRequired': 'Keine Worktree-Isolation: Laufende Prozesse verwenden dasselbe Verzeichnis.', + 'multirun.launcher.groupName.label': 'Gruppenname', + 'multirun.launcher.groupName.info': 'Wird für Worktree-Verzeichnis und Branch-Namen verwendet', + 'multirun.launcher.groupName.placeholder': 'feature-auth, bugfix-login', + 'multirun.launcher.baseBranch.label': 'Basis-Branch', + 'multirun.launcher.baseBranch.info': 'Neuer Branch wird von diesem Basis-Branch pro Modell erstellt', + 'multirun.launcher.isolateRuns.label': 'Lauf isolation', + 'multirun.launcher.agent.label': 'Agent', + 'multirun.launcher.agent.info': 'Agent, der für alle Laufenden verwendet wird. Standardmäßig Ihr konfigurierter Agent.', + 'multirun.launcher.setupCommands.label': 'Setup-Befehle', + 'multirun.launcher.setupCommands.loading': 'Laden...', + 'multirun.launcher.setupCommands.commandPlaceholder': 'bun install', + 'multirun.launcher.setupCommands.removeCommandAria': 'Befehl entfernen', + 'multirun.launcher.setupCommands.addCommand': 'Befehl hinzufügen', + 'multirun.launcher.prompt.label': 'Eingabeaufforderung', + 'multirun.launcher.prompt.placeholder': 'Geben Sie die Eingabeaufforderung ein, die an alle Modelle gesendet werden soll...', + 'multirun.launcher.attachments.attach': 'Anhängen', + 'multirun.launcher.attachments.tooltip': 'Denselben Dateien an alle Durchläufe senden', + 'multirun.launcher.models.label': 'Modelle', + 'multirun.launcher.models.info': 'Wählen Sie 2-{max} Modelle. Das gleiche Modell kann mehrfach hinzugefügt werden.', + 'multirun.launcher.toast.fileTooLarge': 'Datei "{fileName}" ist zu groß (max. 10MB)', + 'multirun.launcher.toast.attachFailed': 'Fehler beim Anhängen von "{fileName}"', + 'multirun.launcher.toast.attachedSingle': '{count} Datei angehängt', + 'multirun.launcher.toast.attachedPlural': '{count} Dateien angehängt', + 'multirun.modelMultiSelect.actions.addModel': 'Modell hinzufügen', + 'multirun.modelMultiSelect.search.placeholder': 'Modelle durchsuchen', + 'multirun.modelMultiSelect.search.noResults': 'Keine Modelle gefunden', + 'multirun.modelMultiSelect.sections.favorites': 'Favoriten', + 'multirun.modelMultiSelect.sections.recent': 'Kürzlich', + 'multirun.modelMultiSelect.variant.placeholder': 'Wird nachgedacht', + 'multirun.modelMultiSelect.variant.default': 'Standard', + 'multirun.modelMultiSelect.keyboard.hint': '↑↓ navigieren • Enter auswählen • Esc schließen', + 'multirun.modelMultiSelect.validation.minOnly': 'Wählen Sie mindestens {min} Modelle.', + 'multirun.modelMultiSelect.validation.minToMax': 'Wählen Sie zwischen {min} und {max} Modellen.', + 'multirun.agentSelector.placeholder': 'Einen Agenten auswählen', + 'multirun.fusion.title': 'Fusion starten', + 'multirun.fusion.description': 'Kombinieren Sie die ausgewählten Multi-Run-Ergebnisse zu einer stärkeren Antwort.', + 'multirun.fusion.provider.placeholder': 'Anbieter', + 'multirun.fusion.model.placeholder': 'Modell', + 'multirun.fusion.sources.label': 'Quellen ({count})', + 'multirun.fusion.actions.cancel': 'Abbrechen', + 'multirun.fusion.actions.start': 'Fusion starten', + 'multirun.fusion.actions.starting': 'Starte...', + 'multirun.fusion.toast.noOutputs': 'Keine Assistentenausgaben zum Zusammenführen gefunden.', + 'multirun.fusion.toast.failed': 'Start des Zusammenführens fehlgeschlagen.', + 'multirun.launcher.attachments.label': 'Dateien', + 'multirun.launcher.actions.startWithRunCount': 'Start ({count} Durchläufe)', + 'multirun.launcher.groups.addGroup': 'Durchlaufgruppe hinzufügen', + 'multirun.launcher.groups.removeGroup': 'Gruppe entfernen', + 'multirun.launcher.groups.groupLabel': 'Durchlaufgruppe {index}', + 'multirun.launcher.groups.template.label': 'Vorlage', + 'multirun.launcher.groups.template.placeholder': 'Eine Vorlage auswählen...', + 'multirun.launcher.groups.template.custom': 'Benutzerdefinierter Prompt', + 'multirun.launcher.groups.prompt.label': 'Prompt', + 'multirun.launcher.groups.prompt.placeholder': 'Prompt für diese Gruppe eingeben...', + 'sessions.sidebar.header.actions.searchSessions': 'Sitzungen durchsuchen', + 'sessions.sidebar.header.actions.exitSelection': 'Auswahl beenden', + 'sessions.sidebar.header.actions.selectSessions': 'Sitzungen auswählen', + 'sessions.sidebar.header.actions.sortProjects': 'Projekte sortieren', + 'sessions.sidebar.header.actions.sessionDisplayMode': 'Sitzungs-Anzeigemodus', + 'sessions.sidebar.header.displayMode.label': 'Anzeigemodus', + 'sessions.sidebar.header.displayMode.default': 'Standard', + 'sessions.sidebar.header.displayMode.minimal': 'Minimal', + 'sessions.sidebar.header.displayMode.showRecent': 'Letzten Abschnitt anzeigen', + 'sessions.sidebar.header.displayMode.showArchived': 'Archivierte Sitzungen anzeigen', + 'sessions.sidebar.header.displayMode.collapseAll': 'Alle einklappen', + 'sessions.sidebar.header.displayMode.expandAll': 'Alle ausklappen', + 'sessions.sidebar.header.projectSort.manual': 'Manuell', + 'sessions.sidebar.header.projectSort.aToZ': 'A → Z', + 'sessions.sidebar.header.projectSort.zToA': 'Z → A', + 'sessions.sidebar.header.projectSort.dateAdded': 'Neueste', + 'sessions.sidebar.header.projectSort.recent': 'Kürzlich', + 'sessions.sidebar.header.search.matchCountSingle': '{count} Treffer', + 'sessions.sidebar.header.search.matchCountPlural': '{count} Treffer', + 'sessions.sidebar.header.search.escapeHint': 'Esc zum Löschen', + 'sessions.sidebar.header.search.placeholder': 'Sitzungen durchsuchen...', + 'sessions.sidebar.header.search.clear': 'Suche löschen', + 'sessions.sidebar.footer.actions.settings': 'Einstellungen', + 'sessions.sidebar.footer.actions.shortcuts': 'Tastenkürzel', + 'sessions.sidebar.footer.actions.aboutOpenChamber': 'Über OpenChamber', + 'sessions.sidebar.footer.actions.update': 'Aktualisieren', + 'sessions.sidebar.empty.noSessions.title': 'Noch keine Sitzungen', + 'sessions.sidebar.empty.noSessions.description': 'Erstellen Sie Ihre erste Sitzung, um zu coden.', + 'sessions.sidebar.empty.noMatches.title': 'Keine passenden Sitzungen', + 'sessions.sidebar.empty.noMatches.description': 'Versuchen Sie einen anderen Titel, Branch, Ordner oder Pfad.', + 'sessions.sidebar.activity.recentTitle': 'kürzlich', + 'sessions.switcher.openAria': 'Sitzungswechsler öffnen', + 'sessions.switcher.empty': 'Keine kürzlichen Sitzungen', + 'sessions.switcher.draftTitle': 'Neue Sitzung', + 'sessions.sidebar.updateCheck.errorTitle': 'Fehler beim Prüfen auf Aktualisierungen', + 'sessions.sidebar.updateCheck.latestVersion': 'Sie verwenden die neueste Version', + 'sessions.sidebar.directory.errorAddProjectTitle': 'Fehler beim Hinzufügen des Projekts', + 'sessions.sidebar.directory.errorAddProjectDescription': 'Bitte wählen Sie ein gültiges Verzeichnis aus.', + 'sessions.sidebar.directory.errorSelectDirectoryTitle': 'Fehler beim Auswählen des Verzeichnisses', + 'sessions.sidebar.folder.newFolderName': 'Neuer Ordner', + 'sessions.sidebar.bulkActions.delete': 'Löschen', + 'sessions.sidebar.bulkActions.archive': 'Archivieren', + 'sessions.sidebar.bulkActions.selectedCount': '{count} ausgewählt', + 'sessions.sidebar.bulkActions.moveToFolder': 'In Ordner verschieben', + 'sessions.sidebar.bulkActions.deletedSingle': '{count} Sitzung gelöscht', + 'sessions.sidebar.bulkActions.deletedPlural': '{count} Sitzungen gelöscht', + 'sessions.sidebar.bulkActions.failedDeleteSingle': 'Fehler beim Löschen von {count} Sitzung', + 'sessions.sidebar.bulkActions.failedDeletePlural': 'Fehler beim Löschen von {count} Sitzungen', + 'sessions.sidebar.bulkActions.archivedSingle': '{count} Sitzung archiviert', + 'sessions.sidebar.bulkActions.archivedPlural': '{count} Sitzungen archiviert', + 'sessions.sidebar.bulkActions.failedArchiveSingle': 'Fehler beim Archivieren von {count} Sitzung', + 'sessions.sidebar.bulkActions.failedArchivePlural': 'Fehler beim Archivieren von {count} Sitzungen', + 'sessions.sidebar.folders.none': 'Noch keine Ordner', + 'sessions.sidebar.folders.newFolderEllipsis': 'Neuer Ordner...', + 'sessions.sidebar.folders.removeFromFolder': 'Aus Ordner entfernen', + 'sessions.sidebar.folders.moveToFolder': 'In Ordner verschieben', + 'sessions.sidebar.project.actions.newWorktree': 'Neuer Worktree', + 'sessions.sidebar.project.actions.newWorktreeEllipsis': 'Neuer Worktree...', + 'sessions.sidebar.project.actions.projectMenu': 'Projektmenü', + 'sessions.sidebar.project.actions.newSession': 'Neue Sitzung', + 'sessions.sidebar.project.actions.edit': 'Bearbeiten', + 'sessions.sidebar.project.actions.closeProject': 'Projekt schließen', + 'sessions.sidebar.project.actions.newDraftSession': 'Neue Entwurfs-Sitzung', + 'sessions.sidebar.session.menu.rename': 'Umbenennen', + 'sessions.sidebar.session.rename.save': 'Sitzungsnamen speichern', + 'sessions.sidebar.session.rename.cancel': 'Umbenennung abbrechen', + 'sessions.sidebar.session.menu.unpin': 'Sitzung lösen', + 'sessions.sidebar.session.menu.pin': 'Sitzung anheften', + 'sessions.sidebar.session.menu.share': 'Teilen', + 'sessions.sidebar.session.menu.copied': 'Kopiert', + 'sessions.sidebar.session.menu.copyLink': 'Link kopieren', + 'sessions.sidebar.session.menu.unshare': 'Freigabe aufheben', + 'sessions.sidebar.session.menu.exportMarkdown': 'Als Markdown exportieren', + 'sessions.sidebar.session.menu.runFusion': 'Fusion ausführen', + 'sessions.sidebar.session.menu.openInSidePanel': 'In Seitenleiste öffnen', + 'sessions.sidebar.session.actions.openInEditor': 'Im Editor öffnen', + 'sessions.sidebar.session.menu.betaBadge': 'Beta', + 'sessions.sidebar.session.menu.label': 'Sitzungsmenü', + 'sessions.sidebar.session.untitled': 'Unbenannte Sitzung', + 'sessions.sidebar.session.export.nothingToExport': 'Nichts zum Exportieren', + 'sessions.sidebar.session.export.success': 'Sitzung exportiert', + 'sessions.sidebar.session.export.failedRevealPath': 'Pfad konnte nicht angezeigt werden', + 'sessions.sidebar.session.export.untitledSubagent': 'Unbenanntes Sub-Agent', + 'sessions.sidebar.session.export.skippedSubtaskSingle': 'Sitzung exportiert, aber {count} Unteraufgabe des Sub-Agents wurde übersprungen, da sie nicht geladen werden konnte.', + 'sessions.sidebar.session.export.skippedSubtaskMany': 'Sitzung exportiert, aber {count} Unteraufgaben des Sub-Agents wurden übersprungen, da sie nicht geladen werden konnten.', + 'sessions.sidebar.session.export.dialog.title': 'Markdown exportieren', + 'sessions.sidebar.session.export.dialog.descriptionSingle': 'Diese Sitzung hat {count} Unteraufgabe des Sub-Agents. Soll diese in den Export inkludiert werden?', + 'sessions.sidebar.session.export.dialog.descriptionMany': 'Diese Sitzung hat {count} Unteraufgaben des Sub-Agents. Sollen diese in den Export inkludiert werden?', + 'sessions.sidebar.session.export.dialog.includeSubtasks': 'Unteraufgaben des Sub-Agents einbeziehen', + 'sessions.sidebar.session.export.dialog.confirm': 'Exportieren', + 'sessions.sidebar.session.status.active': 'Sitzung aktiv', + 'sessions.sidebar.session.status.unread': 'Ungelesene Updates', + 'sessions.sidebar.session.status.pinned': 'Angeheftete Sitzung', + 'sessions.sidebar.session.status.permissionRequired': 'Berechtigung erforderlich', + 'sessions.sidebar.session.subsessions.collapse': 'Untersitzungen einklappen', + 'sessions.sidebar.session.subsessions.expand': 'Untersitzungen ausklappen', + 'sessions.sidebar.dialogs.deleteSession.title': 'Sitzung löschen?', + 'sessions.sidebar.dialogs.archiveSession.title': 'Sitzung archivieren?', + 'sessions.sidebar.dialogs.deleteSession.withOneSubtask': '"{sessionTitle}" und seine {count} Unteraufgabe werden dauerhaft gelöscht.', + 'sessions.sidebar.dialogs.deleteSession.withManySubtasks': '"{sessionTitle}" und seine {count} Unteraufgaben werden dauerhaft gelöscht.', + 'sessions.sidebar.dialogs.archiveSession.withOneSubtask': '"{sessionTitle}" und seine {count} Unteraufgabe werden archiviert.', + 'sessions.sidebar.dialogs.archiveSession.withManySubtasks': '"{sessionTitle}" und seine {count} Unteraufgaben werden archiviert.', + 'sessions.sidebar.dialogs.deleteSession.single': '"{sessionTitle}" wird dauerhaft gelöscht.', + 'sessions.sidebar.dialogs.archiveSession.single': '"{sessionTitle}" wird archiviert.', + 'sessions.sidebar.dialogs.neverAsk': 'Nicht mehr fragen', + 'sessions.sidebar.dialogs.cancel': 'Abbrechen', + 'sessions.sidebar.dialogs.deleteSession.titleAction': 'Sitzung löschen', + 'sessions.sidebar.dialogs.deleteSessions.titleAction': 'Sitzungen löschen', + 'sessions.sidebar.dialogs.deleteSessions.title': 'Sitzungen löschen?', + 'sessions.sidebar.dialogs.archiveSessions.title': 'Sitzungen archivieren?', + 'sessions.sidebar.dialogs.deleteSessions.singleDescription': '{count} Sitzung wird dauerhaft gelöscht.', + 'sessions.sidebar.dialogs.deleteSessions.pluralDescription': '{count} Sitzungen werden dauerhaft gelöscht.', + 'sessions.sidebar.dialogs.archiveSessions.singleDescription': '{count} Sitzung wird archiviert.', + 'sessions.sidebar.dialogs.archiveSessions.pluralDescription': '{count} Sitzungen werden archiviert.', + 'sessions.sidebar.dialogs.deleteFolder.title': 'Ordner löschen?', + 'sessions.sidebar.dialogs.deleteFolder.withOneSubfolder': '"{folderName}" wird zusammen mit {count} Unterordner gelöscht. Sitzungen darin werden nicht gelöscht.', + 'sessions.sidebar.dialogs.deleteFolder.withManySubfolders': '"{folderName}" wird zusammen mit {count} Unterordnern gelöscht. Sitzungen darin werden nicht gelöscht.', + 'sessions.sidebar.dialogs.deleteFolder.withContentsNoSubfolders': '"{folderName}" wird gelöscht. Sitzungen darin werden nicht gelöscht.', + 'sessions.sidebar.dialogs.deleteFolder.single': '"{folderName}" wird dauerhaft gelöscht.', + 'sessions.sidebar.dialogs.deleteResult.singleFailedToDelete': '{count} Sitzung konnte nicht gelöscht werden.', + 'sessions.sidebar.dialogs.deleteResult.manyFailedToDelete': '{count} Sitzungen konnten nicht gelöscht werden.', + 'sessions.sidebar.dialogs.deleteResult.singleFailedToArchive': '{count} Sitzung konnte nicht archiviert werden.', + 'sessions.sidebar.dialogs.deleteResult.manyFailedToArchive': '{count} Sitzungen konnten nicht archiviert werden.', + 'sessions.sidebar.dialogs.deleteResult.removedFromDate': 'Alle Sitzungen vom {dateLabel} entfernt.', + 'sessions.sidebar.dialogs.deleteResult.tryAgain': 'Bitte versuchen Sie es in einem Moment erneut.', + 'sessions.sidebar.dialogs.worktreeDelete.descriptionNoLinked': 'Dies entfernt den ausgewählten Worktree.', + 'sessions.sidebar.dialogs.worktreeDelete.descriptionOneLinked': 'Dies entfernt den ausgewählten Worktree und archiviert {count} verknüpfte Sitzung.', + 'sessions.sidebar.dialogs.worktreeDelete.descriptionManyLinked': 'Dies entfernt den ausgewählten Worktree und archiviert {count} verknüpfte Sitzungen.', + 'sessions.sidebar.dialogs.sessionDelete.descriptionOne': 'Diese Aktion entfernt dauerhaft 1 Sitzung.', + 'sessions.sidebar.dialogs.sessionDelete.descriptionOneWithDate': 'Diese Aktion entfernt dauerhaft 1 Sitzung vom {dateLabel}.', + 'sessions.sidebar.dialogs.sessionDelete.descriptionMany': 'Diese Aktion entfernt dauerhaft {count} Sitzungen.', + 'sessions.sidebar.dialogs.sessionDelete.descriptionManyWithDate': 'Diese Aktion entfernt dauerhaft {count} Sitzungen vom {dateLabel}.', + 'sessions.sidebar.dialogs.sessionList.more': '+{count} weitere', + 'sessions.sidebar.session.share.successTitle': 'Sitzung geteilt', + 'sessions.sidebar.session.share.successDescription': 'Sie können den Link aus dem Menü kopieren.', + 'sessions.sidebar.session.share.error': 'Sitzung kann nicht geteilt werden', + 'sessions.sidebar.session.share.copyUrlError': 'URL konnte nicht kopiert werden', + 'sessions.sidebar.session.unshare.success': 'Teilen der Sitzung aufgehoben', + 'sessions.sidebar.session.unshare.error': 'Sitzung kann nicht mehr geteilt werden', + 'sessions.sidebar.session.delete.success': 'Sitzung gelöscht', + 'sessions.sidebar.session.delete.error': 'Fehler beim Löschen der Sitzung', + 'sessions.sidebar.session.archive.success': 'Sitzung archiviert', + 'sessions.sidebar.session.archive.error': 'Fehler beim Archivieren der Sitzung', + 'sessions.sidebar.group.pr.checksPassed': '{success}/{total} Checks bestanden', + 'sessions.sidebar.group.pr.failingCount': '{count} fehlgeschlagen', + 'sessions.sidebar.group.pr.pendingCount': '{count} ausstehend', + 'sessions.sidebar.group.pr.conflictsOrBlocked': 'Konflikte oder blockiert', + 'sessions.sidebar.group.pr.mergeable': 'Zusammenführen möglich', + 'sessions.sidebar.group.pr.mergeState': 'Zusammenführungszustand: {state}', + 'sessions.sidebar.group.pr.status.merged': 'Zusammengeführt', + 'sessions.sidebar.group.pr.status.readyToMerge': 'Bereit zum Zusammenführen', + 'sessions.sidebar.group.pr.status.open': 'PR offen', + 'sessions.sidebar.group.pr.status.mergeConflicts': 'Zusammenführungskonflikte', + 'sessions.sidebar.group.pr.status.mergeBlocked': 'Zusammenführung blockiert', + 'sessions.sidebar.group.pr.status.draft': 'Entwurf PR', + 'sessions.sidebar.group.pr.status.closed': 'Geschlossen', + 'sessions.sidebar.group.empty.noArchivedSessions': 'Noch keine archivierten Sitzungen.', + 'sessions.sidebar.group.empty.noSessionsInWorkspace': 'Noch keine Sitzungen in diesem Arbeitsbereich.', + 'sessions.sidebar.group.showMore': 'Weitere Sitzungen anzeigen', + 'sessions.sidebar.group.showMoreSingle': '{count} weitere Sitzung anzeigen', + 'sessions.sidebar.group.showMorePlural': '{count} weitere Sitzungen anzeigen', + 'sessions.sidebar.group.showFewer': 'Weniger Sitzungen anzeigen', + 'sessions.sidebar.group.expandAria': '{label} erweitern', + 'sessions.sidebar.group.collapseAria': '{label} einklappen', + 'sessions.sidebar.group.actions.deleteArchivedInGroupAria': 'Archivierte Sitzungen in {label} löschen', + 'sessions.sidebar.group.actions.deleteArchivedSessions': 'Archivierte Sitzungen löschen', + 'sessions.sidebar.group.actions.deleteGroupAria': '{label} löschen', + 'sessions.sidebar.group.actions.deleteWorktree': 'Worktree löschen', + 'sessions.sidebar.group.actions.newDraftInGroupAria': 'Neue Entwurfs-Sitzung in {label}', + 'sessions.sidebar.grouping.projectRoot': 'Projektstamm', + 'sessions.sidebar.grouping.projectRootWithBranch': 'Projektstamm: {branch}', + 'sessions.sidebar.grouping.archived': 'archiviert', + 'sessions.sidebar.grouping.archivedDescription': 'Archivierte und nicht zugewiesene Sitzungen', + 'sessions.sidebar.folderItem.expandAria': 'Ordner {folderName} ausklappen', + 'sessions.sidebar.folderItem.collapseAria': 'Ordner {folderName} einklappen', + 'sessions.sidebar.folderItem.namePlaceholder': 'Ordnername', + 'sessions.sidebar.folderItem.newSessionAria': 'Neue Sitzung in {folderName}', + 'sessions.sidebar.folderItem.newSubfolderAria': 'Neuer Unterordner in {folderName}', + 'sessions.sidebar.folderItem.newSubfolder': 'Neuer Unterordner', + 'sessions.sidebar.folderItem.renameAria': 'Ordner {folderName} umbenennen', + 'sessions.sidebar.folderItem.deleteArchivedInFolderAria': 'Archivierte Sitzungen im Ordner {folderName} löschen', + 'sessions.sidebar.folderItem.deleteFolderAria': 'Ordner {folderName} löschen', + 'sessions.sidebar.folderItem.emptyFolder': 'Leerer Ordner', + 'sessions.sidebar.sessionDialogs.ok': 'OK', + 'sessions.sidebar.sessionDialogs.linkedSessionSingle': 'Verknüpfte Sitzung', + 'sessions.sidebar.sessionDialogs.linkedSessionPlural': 'Verknüpfte Sitzungen', + 'sessions.sidebar.sessionDialogs.delete.note': 'Worktree-Verzeichnisse bleiben unverändert. Untersitzungen, die mit den ausgewählten Sitzungen verknüpft sind, werden ebenfalls entfernt.', + 'sessions.sidebar.sessionDialogs.directory.errorSelectTitle': 'Fehler beim Auswählen des Verzeichnisses', + 'sessions.sidebar.sessionDialogs.directory.errorOpenTitle': 'Fehler beim Öffnen des Verzeichnisses', + 'sessions.sidebar.sessionDialogs.directory.errorOpenDescription': 'Desktop konnte keinen Dateizugriff gewähren.', + 'sessions.sidebar.sessionDialogs.directory.errorAddProjectTitle': 'Fehler beim Hinzufügen des Projekts', + 'sessions.sidebar.sessionDialogs.directory.errorAddProjectDescription': 'Bitte wählen Sie einen gültigen Verzeichnispfad aus.', + 'sessions.sidebar.sessionDialogs.worktree.errorRemoveTitle': 'Fehler beim Entfernen des Worktrees', + 'sessions.sidebar.sessionDialogs.worktree.removedTitle': 'Worktree entfernt', + 'sessions.sidebar.sessionDialogs.worktree.removed': 'Worktree entfernt.', + 'sessions.sidebar.sessionDialogs.worktree.removedWithRemote': 'Worktree und Remote-Branch entfernt.', + 'sessions.sidebar.sessionDialogs.worktree.attachedArchived': 'Angefügter Worktree archiviert.', + 'sessions.sidebar.sessionDialogs.worktree.attachedArchivedPlural': 'Angefügte Worktrees archiviert.', + 'sessions.sidebar.sessionDialogs.worktree.archivedAndRemoteRemoved': 'Archivierte Worktrees und entfernte Remote-Branches.', + 'sessions.sidebar.sessionDialogs.worktree.label': 'Worktree', + 'sessions.sidebar.sessionDialogs.worktree.pathUnavailable': 'Worktree-Pfad nicht verfügbar.', + 'sessions.sidebar.sessionDialogs.worktree.uncommittedWarning': 'Nicht committete Änderungen werden verworfen.', + 'sessions.sidebar.sessionDialogs.actions.deleteRemoteBranch': 'Entfernten Branch löschen', + 'sessions.sidebar.sessionDialogs.actions.remoteBranchInfoUnavailable': 'Informationen zum entfernten Branch nicht verfügbar', + 'sessions.sidebar.sessionDialogs.actions.deleteLocalBranch': 'Lokalen Branch löschen', + 'sessions.sidebar.sessionDialogs.actions.deleting': 'Wird gelöscht…', + 'sessions.sidebar.sessionDialogs.actions.deleteWorktree': 'Worktree löschen', + 'gitView.branch.branchToMergeInto': 'Branch zum Mergen in {branch}', + 'gitView.branch.branchToRebaseOnto': 'Branch zum Rebase auf', + 'gitView.branch.create': 'Neuen Branch erstellen...', + 'gitView.branch.currentBadge': 'Aktuell', + 'gitView.branch.currentBranchFallback': 'aktueller Branch', + 'gitView.branch.currentBranchTooltip': 'Aktueller Branch', + 'gitView.branch.detachedHead': 'Detached HEAD', + 'gitView.branch.dialogDescriptionPrefix': 'Wählen Sie, wie Sie einen anderen Branch in', + 'gitView.branch.empty': 'Keine Branches gefunden.', + 'gitView.branch.localBranches': 'Lokale Branches', + 'gitView.branch.mergeDescription': 'Erstellt einen Merge-Commit und erhält den Branch-Verlauf.', + 'gitView.branch.mergeRebase': 'Merge/Rebase', + 'gitView.branch.mergeRebaseTooltip': 'Aktualisiert diesen Branch von einem anderen Branch.', + 'gitView.branch.mergingInProgress': 'Merge läuft', + 'gitView.branch.namePlaceholder': 'Branch-Name', + 'gitView.branch.newBranchPlaceholder': 'Neuer Branch-Name', + 'gitView.branch.noLocalBranches': 'Keine lokalen Branches', + 'gitView.branch.noRemoteBranches': 'Keine entfernten Branches', + 'gitView.branch.operation': 'Operation', + 'gitView.branch.operationCompleted': 'Operation abgeschlossen', + 'gitView.branch.operationFailed': 'Operation fehlgeschlagen', + 'gitView.branch.pushToPrefix': 'Push zu Präfix', + 'gitView.branch.pushToSuffix': 'Push zu Suffix', + 'gitView.branch.rebaseDescription': 'Wende deine Commits auf den ausgewählten Branch an.', + 'gitView.branch.rebasingInProgress': 'Rebasing in Bearbeitung', + 'gitView.branch.remoteBranches': 'Remote-Branches', + 'gitView.branch.renameTitle': 'Branch umbenennen', + 'gitView.branch.renameSave': 'Branch-Namen speichern', + 'gitView.branch.renameSaving': 'Speichere Branch-Name', + 'gitView.branch.renameCancel': 'Umbenennung abbrechen', + 'gitView.branch.searchPlaceholder': 'Branches durchsuchen...', + 'gitView.branch.selectBranch': 'Branch auswählen', + 'gitView.branch.summaryMergeInfix': 'in', + 'gitView.branch.summaryMergePrefix': 'Dies wird zusammenführen', + 'gitView.branch.summaryRebaseInfix': 'auf', + 'gitView.branch.summaryRebasePrefix': 'Dies wird rebasen', + 'gitView.branch.updateDescriptionPrefix': 'Bringe die neuesten Änderungen in', + 'gitView.branch.updateTitle': 'Branch aktualisieren', + 'gitView.changes.changedFilesAria': 'Geänderte Dateien', + 'gitView.changes.clearSelectionAria': 'Dateiauswahl aufheben', + 'gitView.changes.collapseDirectoryAria': 'Verzeichnis {path} einklappen', + 'gitView.changes.expandDirectoryAria': 'Verzeichnis {path} ausklappen', + 'gitView.changes.revertAll': 'Alle rückgängig machen', + 'gitView.changes.revertAllDescriptionPlural': '{count} geänderte Dateien rückgängig machen? Dies kann nicht rückgängig gemacht werden.', + 'gitView.changes.revertAllDescriptionSingle': '{count} geänderte Datei rückgängig machen? Dies kann nicht rückgängig gemacht werden.', + 'gitView.changes.revertAllDialogTitle': 'Alle Änderungen rückgängig machen?', + 'gitView.changes.revertDirectoryAria': 'Änderungen in {path} rückgängig machen', + 'gitView.changes.revertDirectory': 'Ordner rückgängig machen', + 'gitView.changes.revertDirectoryDescriptionPlural': 'Dies wird lokale Änderungen in {count} Dateien unter {path} verwerfen.', + 'gitView.changes.revertDirectoryDescriptionSingle': 'Dies wird lokale Änderungen in {count} Datei unter {path} verwerfen.', + 'gitView.changes.revertDirectoryDialogTitle': 'Ordneränderungen rückgängig machen?', + 'gitView.changes.revertDirectoryTooltip': 'Ordneränderungen rückgängig machen', + 'gitView.changes.revertFileAria': 'Änderungen in {path} rückgängig machen', + 'gitView.changes.revertFileTooltip': 'Änderungen rückgängig machen', + 'gitView.changes.reverting': 'Rückgängig machen...', + 'gitView.changes.selectAllAria': 'Alle Dateien auswählen', + 'gitView.changes.selectFileAria': '{path} auswählen', + 'gitView.changes.stagedTitle': 'Bereitgestellt', + 'gitView.changes.resizeSplitAria': 'Größe der bereitgestellten und nicht-bereitgestellten Änderungen anpassen', + 'gitView.changes.stageAllAria': 'Alle Änderungen bereitstellen', + 'gitView.changes.stageDirectoryAria': 'Alle Änderungen in {path} bereitstellen', + 'gitView.changes.stageFileAria': '{path} bereitstellen', + 'gitView.changes.title': 'Änderungen', + 'gitView.changes.toggleDirectorySelectionAria': 'Auswahl für {path} umschalten', + 'gitView.changes.unstageAllAria': 'Alle Änderungen nicht mehr bereitstellen', + 'gitView.changes.unstageDirectoryAria': 'Alle Änderungen in {path} nicht mehr bereitstellen', + 'gitView.changes.unstageFileAria': '{path} nicht mehr bereitstellen', + 'gitView.commit.addGitmoji': 'Gitmoji hinzufügen', + 'gitView.commit.aiHighlights.insertAria': 'Einfügen aria-Label', + 'gitView.commit.aiHighlights.insertTooltip': 'Einfügen tooltip', + 'gitView.commit.aiHighlights.title': 'Highlights', + 'gitView.commit.commit': 'Commit', + 'gitView.commit.commitAria': 'Commit aria-Label', + 'gitView.commit.committing': 'Committen...', + 'gitView.commit.generate': 'Generieren', + 'gitView.commit.generateAria': 'Commit-Nachricht generieren', + 'gitView.commit.messagePlaceholder': 'Commit-Nachricht', + 'gitView.commit.push': 'Commit & synchronisieren', + 'gitView.commit.pushAria': 'Commit und synchronisieren', + 'gitView.commit.pushing': 'Synchronisieren...', + 'gitView.commit.selectFilesHint': 'Dateien in Änderungen auswählen, um Commit zu aktivieren.', + 'gitView.commit.stageFilesHint': 'Stagen Sie Dateien, um Commit zu aktivieren.', + 'gitView.commit.title': 'Commit', + 'gitView.common.cancel': 'Abbrechen', + 'gitView.common.close': 'Schließen', + 'gitView.common.done': 'Fertig', + 'gitView.common.processing': 'Verarbeitung läuft...', + 'gitView.common.reset': 'Zurücksetzen', + 'gitView.conflict.abortOperation': '{operation} abbrechen', + 'gitView.conflict.conflictedFiles': 'Konflikte in Dateien:', + 'gitView.conflict.continueLater': 'Später fortfahren', + 'gitView.conflict.detectedDescription': 'Lösen Sie die {operation}-Konflikte, um fortzufahren.', + 'gitView.conflict.detectedTitle': '{operation}-Konflikte erkannt', + 'gitView.conflict.errorLoadingDetails': 'Fehler beim Laden der Konflikt-Details: {message}', + 'gitView.conflict.headInfo': 'HEAD-Information:', + 'gitView.conflict.loadFailed': 'Fehler beim Laden der Konflikt-Details', + 'gitView.conflict.loading': 'Konflikt-Details werden geladen...', + 'gitView.conflict.noActiveSession': 'Keine aktive Sitzung', + 'gitView.conflict.noActiveSessionDescription': 'Öffnen oder erstellen Sie eine Sitzung, um Konflikte zu lösen.', + 'gitView.conflict.resolveCurrentSession': 'In aktueller Sitzung auflösen', + 'gitView.conflict.resolveNewSession': 'In neuer Sitzung auflösen', + 'gitView.empty.cleanDescription': 'Alle Änderungen wurden committet', + 'gitView.empty.cleanTitle': 'Arbeitsbaum ist sauber', + 'gitView.empty.pullBehindPlural': '{count} Commits abrufen', + 'gitView.empty.pullBehindSingle': '{count} Commit abrufen', + 'gitView.header.identityTooltip': 'Git-Identität', + 'gitView.header.noIdentity': 'Keine Identität', + 'gitView.header.noProfiles': 'Keine Profile zum Anwenden verfügbar.', + 'gitView.header.repositoryViews': 'Repository-Ansichten', + 'gitView.header.removeRemoteAria': 'Entferne Remote {name}', + 'gitView.header.removeRemoteTitle': 'Entferne Remote {name}', + 'gitView.header.upstreamSynced': 'synchronisiert', + 'gitView.header.upstreamTooltip': 'Verglichen mit {target}.', + 'gitView.header.upstreamTooltipTracking': 'Verglichen mit {target}. Die primären Synchronisierungs-Kennzeichen spiegeln immer noch {tracking} wider.', + 'gitView.history.actions.cancelButton': 'Abbrechen', + 'gitView.history.actions.checkout': 'Checkout', + 'gitView.history.actions.checkoutConfirm': 'Diesen Commit als getrennte HEAD auschecken?', + 'gitView.history.actions.cherryPick': 'Cherry-pick', + 'gitView.history.actions.cherryPickConfirm': 'Diesen Commit auf den aktuellen Branch cherry-picken?', + 'gitView.history.actions.conflictToastDescription': 'Konflikte in: {files}. Manuelles Auflösen und committen oder mit git cherry-pick/revert --abort abbrechen.', + 'gitView.history.actions.conflictToastTitle': 'Konflikt', + 'gitView.history.actions.confirmButton': 'Bestätigen', + 'gitView.history.actions.createBranch': 'Hier neuen Branch erstellen', + 'gitView.history.actions.createBranchConfirm': 'Erstellen', + 'gitView.history.actions.createBranchPlaceholder': 'Branch-Name', + 'gitView.history.actions.detachedHead': 'Ausgecheckt (getrennte HEAD)', + 'gitView.history.actions.merge': 'In aktuellen Branch mergen', + 'gitView.history.actions.mergeConfirm': 'Diesen Commit in den aktuellen Branch mergen?', + 'gitView.history.actions.rebase': 'Auf diesen rebasen', + 'gitView.history.actions.rebaseConfirm': 'Aktuellen Branch auf diesen Commit rebasen?', + 'gitView.history.actions.reset': 'Zurücksetzen...', + 'gitView.history.actions.resetHard': 'Hart — alle Änderungen verwerfen', + 'gitView.history.actions.resetHardConfirm': 'Hartes Zurücksetzen — HEAD bewegt sich, alle nicht committeten Änderungen werden dauerhaft verworfen.', + 'gitView.history.actions.resetHardConfirmButton': 'Änderungen verwerfen', + 'gitView.history.actions.resetMixed': 'Gemischt — Änderungen unstagen', + 'gitView.history.actions.resetMixedConfirm': 'Gemischtes Zurücksetzen — HEAD bewegt sich, Änderungen werden unstaged.', + 'gitView.history.actions.resetSoft': 'Weich — staged Änderungen behalten', + 'gitView.history.actions.resetSoftConfirm': 'Weiches Zurücksetzen — HEAD bewegt sich, staged Änderungen bleiben erhalten.', + 'gitView.history.actions.revert': 'Revert', + 'gitView.history.actions.revertConfirm': 'Einen Revert dieses Commits stagen?', + 'gitView.history.binary': 'Binär', + 'gitView.history.binaryNoDiff': 'Binäre Datei — kein Diff verfügbar', + 'gitView.history.commitsPlaceholder': 'Commits', + 'gitView.history.copySha': 'SHA kopieren', + 'gitView.history.diffError': 'Fehler beim Laden des Diffs. Klicken zum Wiederholen.', + 'gitView.history.largeDiffDescription': 'Die Darstellung kann langsam sein. Sie können den Diff dennoch durch Klicken unten ansehen.', + 'gitView.history.largeDiffTitle': 'Großer Diff ({count} geänderte Zeilen)', + 'gitView.history.loadingDiff': 'Lade Diff...', + 'gitView.history.loadingFiles': 'Lade Dateien...', + 'gitView.history.loadMore': 'Mehr laden', + 'gitView.history.loadingMore': 'Laden...', + 'gitView.history.logSize100': '100 Commits', + 'gitView.history.logSize25': '25 Commits', + 'gitView.history.logSize50': '50 Commits', + 'gitView.history.noCommits': 'Keine Commits gefunden', + 'gitView.history.noFiles': 'Keine Dateien', + 'gitView.history.renamedNoDiff': 'Umbenannte Datei — Diff nicht unterstützt', + 'gitView.history.renderDiffAnyway': 'Dennoch rendern', + 'gitView.history.title': 'Verlauf', + 'gitView.graph.title': 'Graph', + 'gitView.integrate.checking': 'Überprüfe…', + 'gitView.integrate.cherryPickAbortedToast': 'Cherry-pick abgebrochen', + 'gitView.integrate.cherryPickConflictDescription': 'Lösen Sie die Cherry-pick-Konflikte, um fortzufahren.', + 'gitView.integrate.cherryPickConflictToast': 'Cherry-pick-Konflikte erkannt', + 'gitView.integrate.cherryPickContinueFailedToast': 'Fehler beim Fortsetzen des Cherry-picks', + 'gitView.integrate.cherryPickFinishedToast': 'Cherry-pick abgeschlossen', + 'gitView.integrate.commitsMovedDescriptionPlural': '{count} Commits nach {branch} verschoben.', + 'gitView.integrate.commitsMovedDescriptionSingle': '{count} Commit nach {branch} verschoben.', + 'gitView.integrate.commitsMovedToast': 'Commits verschoben', + 'gitView.integrate.commitsToMove': 'Zu verschiebende Commits', + 'gitView.integrate.conflictsInFiles': 'Konflikte in Dateien', + 'gitView.integrate.currentCommit': 'Aktueller Commit', + 'gitView.integrate.currentSession': 'Aktuelle Sitzung', + 'gitView.integrate.failedToMoveToast': 'Fehler beim Verschieben der Commits', + 'gitView.integrate.moreFiles': 'Weitere Dateien', + 'gitView.integrate.move': 'Verschieben', + 'gitView.integrate.moveCommits': 'Commits verschieben', + 'gitView.integrate.moving': 'Wird verschoben…', + 'gitView.integrate.newSession': 'Neue Sitzung', + 'gitView.integrate.noActiveSession': 'Keine aktive Sitzung', + 'gitView.integrate.noActiveSessionDescription': 'Öffne oder erstelle eine Sitzung, um fortzufahren.', + 'gitView.integrate.noCommitsToMove': 'Keine Commits zum Verschieben.', + 'gitView.integrate.noCommitsToMoveToast': 'Keine Commits zum Verschieben', + 'gitView.integrate.previewUnavailable': 'Vorschau nicht verfügbar', + 'gitView.integrate.showAll': 'Alle anzeigen', + 'gitView.integrate.showLess': 'Weniger anzeigen', + 'gitView.integrate.showingFirstCommits': 'Erste Commits werden angezeigt', + 'gitView.integrate.target': 'Ziel', + 'gitView.integrate.title': 'Commits erneut integrieren', + 'gitView.integrate.toMoveCount': 'Zu verschieben', + 'gitView.operation.abort': 'Abbrechen', + 'gitView.operation.continue': 'Fortsetzen', + 'gitView.operation.inProgressTitle': '{operation} in Bearbeitung', + 'gitView.operation.merge': 'Merge', + 'gitView.operation.mergeInProgressWithHead': 'Merge von {head}', + 'gitView.operation.mergingMessage': 'Merge: {message}', + 'gitView.operation.rebase': 'Rebase', + 'gitView.operation.rebaseInProgress': 'Rebase in Bearbeitung', + 'gitView.operation.rebasingOnto': 'Rebase von {headName} auf {onto}', + 'gitView.operation.resolveConflictsHint': 'Löse Konflikte und fahre dann mit dem Vorgang fort.', + 'gitView.operation.resolveWithAi': 'Mit KI auflösen', + 'gitView.stash.confirmButton': '{operation}', + 'gitView.stash.description': 'Stash Sie Ihre lokalen Änderungen vor dem Start der {operation}.', + 'gitView.stash.mergeWith': 'mit', + 'gitView.stash.rebaseOnto': 'auf', + 'gitView.stash.restoreAfterOperation': 'Stashed Änderungen nach {operation} wiederherstellen', + 'gitView.stash.restoreAria': 'Stashed Änderungen nach Operation wiederherstellen', + 'gitView.stash.stepRestore': 'Stashed Änderungen wiederherstellen', + 'gitView.stash.stepStash': 'Nicht committete Änderungen stashen', + 'gitView.stash.thisWill': 'Das wird folgendes tun:', + 'gitView.stash.title': 'Nicht committete Änderungen', + 'gitView.stashes.actions.apply': 'Anwenden', + 'gitView.stashes.actions.drop': 'Verwerfen', + 'gitView.stashes.actions.pop': 'Pop', + 'gitView.stashes.actions.stashCurrent': 'Aktuelle Änderungen stashen', + 'gitView.stashes.actions.stashCurrentWithCount': '{count} Dateien stashen', + 'gitView.stashes.confirm.drop': '{ref} verwerfen?', + 'gitView.stashes.description': 'Speichern, wiederherstellen und aufräumen von Git-Stashes für dieses Repository.', + 'gitView.stashes.empty.list': 'Noch keine Stashes.', + 'gitView.stashes.empty.search': 'Keine passenden Stashes gefunden.', + 'gitView.stashes.includeUntrackedHint': 'Nicht verfolgte Dateien werden automatisch mit einbezogen.', + 'gitView.stashes.fileCount': '{count} Dateien', + 'gitView.stashes.fileCountLoading': 'Dateien werden gezählt...', + 'gitView.stashes.itemNumber': '#{number}', + 'gitView.stashes.latestLabel': 'Neueste', + 'gitView.stashes.messagePlaceholder': 'Stash-Name', + 'gitView.stashes.searchPlaceholder': 'Stashes durchsuchen', + 'gitView.stashes.title': 'Stashes', + 'gitView.stashes.toast.applyFailed': 'Fehler beim Anwenden des Stashes', + 'gitView.stashes.toast.applySuccess': 'Stash angewendet', + 'gitView.stashes.toast.createFailed': 'Fehler beim Stashen der Änderungen', + 'gitView.stashes.toast.created': 'Änderungen gestappt', + 'gitView.stashes.toast.dropFailed': 'Fehler beim Löschen des Stash', + 'gitView.stashes.toast.dropSuccess': 'Stash gelöscht', + 'gitView.stashes.toast.loadFailed': 'Fehler beim Laden der Stashes', + 'gitView.stashes.toast.noChanges': 'Keine lokalen Änderungen zum Stapeln', + 'gitView.stashes.toast.popFailed': 'Fehler beim Abrufen des Stash', + 'gitView.stashes.toast.popSuccess': 'Stash abgerufen', + 'gitView.stashes.untitled': 'Unbenannter Stash', + 'gitView.sync.fetch': 'Abrufen', + 'gitView.sync.fetchFromRemote': 'Von {name} abrufen', + 'gitView.sync.fetchTooltip': 'Vom Remote abrufen', + 'gitView.sync.commitOrStashTooltip': 'Committen oder Stapeln Sie Ihre Änderungen vor der Synchronisation', + 'gitView.sync.moreActionsAria': 'Weitere Synchronisationsaktionen', + 'gitView.sync.noRemoteTooltip': 'Keine Remotes konfiguriert', + 'gitView.sync.pull': 'Herunterziehen', + 'gitView.sync.pullTooltip': 'Änderungen herunterziehen', + 'gitView.sync.pullTooltipBehind': 'Änderungen herunterziehen ({count} hinterher)', + 'gitView.sync.push': 'Hochladen', + 'gitView.sync.pushTooltip': 'Änderungen hochladen', + 'gitView.sync.pushTooltipAhead': 'Änderungen hochladen ({count} voraus)', + 'gitView.sync.sync': 'synchronisieren', + 'gitView.sync.syncChanges': 'Änderungen synchronisieren', + 'gitView.sync.syncChangesTooltip': 'Änderungen synchronisieren ({behind} runter, {ahead} rauf)', + 'gitView.sync.syncChangesWithCounts': 'Änderungen synchronisieren {behind}↓ {ahead}↑', + 'gitView.sync.syncCounts': '{behind}↓ {ahead}↑', + 'gitView.branch.actionsUnavailable': 'Zweigaktionen nicht verfügbar in diesem Repository-Zustand', + 'gitView.conflict.noDetailsAvailable': 'Keine Konfliktdetails verfügbar', + 'gitView.empty.notGitRepository': 'Dieses Verzeichnis ist kein Git-Repository', + 'gitView.empty.notGitRepositoryDescription': 'Initialisieren Sie Git in diesem Verzeichnis oder öffnen Sie ein Repository.', + 'gitView.empty.selectSessionOrDirectory': 'Wählen Sie eine Sitzung oder ein Verzeichnis aus, um den Git-Status anzuzeigen', + 'gitView.empty.worktreeFeaturesUnavailable': 'Worktree-Funktionen sind in diesem Arbeitsbereichsmodus nicht verfügbar.', + 'gitView.empty.worktreeSetupDescription': 'Arbeitstruktur-Einrichtung wird abgeschlossen und Repository-Zustand wird vorbereitet.', + 'gitView.empty.worktreeSetupInProgress': 'Worktree-Einrichtung läuft', + 'worktree.bootstrap.toast.failed': 'Worktree-Einrichtung fehlgeschlagen', + 'worktree.bootstrap.toast.failedDescription': 'Die Worktree wurde erstellt, aber die Hintergrund-Einrichtung wurde nicht abgeschlossen.', + 'worktree.bootstrap.toast.timeoutDescription': 'Die Worktree wurde erstellt, aber die Hintergrund-Einrichtung hat ein Timeout.', + 'gitView.gitmoji.empty': 'Keine Gitmojis gefunden', + 'gitView.gitmoji.searchPlaceholder': 'Gitmojis durchsuchen...', + 'gitView.gitmoji.title': 'Gitmoji einfügen', + 'gitView.history.dialogDescription': 'Letzte Commits durchsuchen und geänderte Dateien prüfen.', + 'gitView.loading.checkingRepository': 'Repository wird überprüft...', + 'gitView.loading.loading': 'Wird geladen...', + 'gitView.pr.actions.add': 'Hinzufügen', + 'gitView.pr.actions.cancelEditing': 'Bearbeitung abbrechen', + 'gitView.pr.actions.cancelEditingAria': 'PR-Bearbeitung abbrechen', + 'gitView.pr.actions.createPr': 'PR erstellen', + 'gitView.pr.actions.edit': 'Bearbeiten', + 'gitView.pr.actions.editPr': 'PR bearbeiten', + 'gitView.pr.actions.editPrAria': 'Pull Request bearbeiten', + 'gitView.pr.actions.hide': 'Verstecken', + 'gitView.pr.actions.markReady': 'Als bereit markieren', + 'gitView.pr.actions.markReadyAria': 'Pull Request als bereit für Review markieren', + 'gitView.pr.actions.mergePr': 'PR mergen', + 'gitView.pr.actions.mergePrAria': 'Pull Request mergen', + 'gitView.pr.actions.openChecks': 'Prüfungen öffnen', + 'gitView.pr.actions.openChecksAria': 'Fehlgeschlagene Prüfungen öffnen', + 'gitView.pr.actions.openComments': 'Kommentare öffnen', + 'gitView.pr.actions.openCommentsAria': 'Pull Request-Kommentare öffnen', + 'gitView.pr.actions.openOnGitHub': 'Auf GitHub öffnen', + 'gitView.pr.actions.openOnGitHubAria': 'Pull Request auf GitHub öffnen', + 'gitView.pr.actions.openSettings': 'Einstellungen öffnen', + 'gitView.pr.actions.repo': 'Repository', + 'gitView.pr.actions.resolveFailedChecks': 'Fehlgeschlagene Checks auflösen', + 'gitView.pr.actions.resolveFailedChecksAria': 'Fehlgeschlagene Checks an Agent senden', + 'gitView.pr.actions.savePr': 'PR speichern', + 'gitView.pr.actions.savePrAria': 'Pull-Request-Änderungen speichern', + 'gitView.pr.actions.sendCommentToAgent': 'Kommentar an Agent senden', + 'gitView.pr.actions.sendCommentToAgentAria': 'Diesen Kommentar an Agent senden', + 'gitView.pr.actions.sendToAgent': 'An Agent senden', + 'gitView.pr.actions.shareComments': 'Kommentare teilen', + 'gitView.pr.actions.shareCommentsAria': 'Pull-Request-Kommentare an Agent senden', + 'gitView.pr.actions.toggleDraftAria': 'Entwurfsstatus umschalten', + 'gitView.pr.actions.refresh': 'PR-Status aktualisieren', + 'gitView.pr.actions.refreshAria': 'Pull-Request-Status aktualisieren', + 'gitView.pr.additionalContext.added': 'Hinzugefügt', + 'gitView.pr.additionalContext.hint': 'Zusätzlichen Kontext hinzufügen für bessere Review-Qualität.', + 'gitView.pr.additionalContext.optional': 'Optional', + 'gitView.pr.additionalContext.title': 'Zusätzlicher Kontext', + 'gitView.pr.checkDetails.empty': 'Keine Check-Details verfügbar', + 'gitView.pr.checkDetails.title': 'Details zu fehlgeschlagenen Checks', + 'gitView.pr.checkingStatus': 'Pull-Request-Status wird überprüft...', + 'gitView.pr.checks.label': 'Checks', + 'gitView.pr.checks.completedLabel': 'Abgeschlossen', + 'gitView.pr.checks.conclusionLabel': 'Ergebnis', + 'gitView.pr.checks.startedLabel': 'Gestartet', + 'gitView.pr.checks.statusLabel': 'Status', + 'gitView.pr.checks.stepLabel': 'Schritt', + 'gitView.pr.checks.steps': 'Schritte', + 'gitView.pr.comments.empty': 'Keine Kommentare gefunden', + 'gitView.pr.comments.generalContext': 'Allgemeiner Kommentar', + 'gitView.pr.comments.reviewContext': 'Kommentar überprüfen', + 'gitView.pr.comments.title': 'Kommentare', + 'gitView.pr.comments.unknownAuthor': 'Unbekannter Autor', + 'gitView.pr.createTitle': 'Pull-Request erstellen', + 'gitView.pr.draftMustBeReady': 'Draft PR muss als bereit zum Merge markiert werden.', + 'gitView.pr.field.baseBranch': 'Basis-Branch', + 'gitView.pr.field.description': 'Beschreibung', + 'gitView.pr.field.draft': 'Entwurf', + 'gitView.pr.field.title': 'Titel', + 'gitView.pr.githubNotConnected': 'GitHub ist nicht verbunden', + 'gitView.pr.loadingDescription': 'Beschreibung wird geladen...', + 'gitView.pr.mergeMethod.merge': 'Einen Merge-Commit erstellen', + 'gitView.pr.mergeMethod.rebase': 'Rebase und Merge', + 'gitView.pr.mergeMethod.squash': 'Squash und Merge', + 'gitView.pr.noDescription': 'Keine Beschreibung', + 'gitView.pr.noMergePermission': 'Sie haben keine Berechtigung, diesen Pull-Request zu mergen.', + 'gitView.pr.notMergeable': 'Nicht mergebar', + 'gitView.pr.numberLabel': 'PR #{number}', + 'gitView.pr.placeholder.additionalContext': 'Beliebige Einschränkungen, Rollout-Hinweise oder Kontext für die Reviewer...', + 'gitView.pr.placeholder.description': 'Beschreiben Sie die Änderung...', + 'gitView.pr.placeholder.main': 'Zusammenfassung Ihres Pull-Requests', + 'gitView.pr.placeholder.selectBaseBranch': 'Basis-Branch auswählen', + 'gitView.pr.placeholder.title': 'Pull-Request-Titel', + 'gitView.pr.placeholder.whatChanged': 'Was hat sich geändert und warum?', + 'gitView.pr.statusUnavailable': 'Pull-Request-Status nicht verfügbar', + 'gitView.pr.toast.baseBranchRequired': 'Wählen Sie einen Basis-Branch aus', + 'gitView.pr.toast.baseMustDifferFromHead': 'Basis-Branch muss sich vom aktuellen Branch unterscheiden', + 'gitView.pr.toast.createPrFailed': 'Fehler beim Erstellen des Pull-Requests', + 'gitView.pr.toast.generateDescriptionFailed': 'Fehler bei der Generierung der Pull-Request-Beschreibung', + 'gitView.pr.toast.githubApiUnavailable': 'GitHub-API ist nicht verfügbar', + 'gitView.pr.toast.loadCheckDetailsFailed': 'Fehler beim Laden der Prüfungsdetails', + 'gitView.pr.toast.loadChecksFailed': 'Fehler beim Laden der Pull-Request-Prüfungen', + 'gitView.pr.toast.loadCommentsFailed': 'Fehler beim Laden der Kommentare', + 'gitView.pr.toast.loadPrCommentsFailed': 'Fehler beim Laden der Pull-Request-Kommentare', + 'gitView.pr.toast.markReadyFailed': 'Fehler beim Markieren des Pull-Requests als bereit', + 'gitView.pr.toast.markedReady': 'Pull-Request als bereit für die Überprüfung markiert', + 'gitView.pr.toast.mergeFailed': 'Fehler beim Zusammenführen des Pull-Requests', + 'gitView.pr.toast.noActiveSession': 'Keine aktive Chat-Sitzung', + 'gitView.pr.toast.noActiveSessionDescription': 'Öffne oder erstelle eine Chat-Sitzung, um Kontext an einen Agenten zu senden.', + 'gitView.pr.toast.noFailedChecks': 'Keine fehlgeschlagenen Prüfungen gefunden', + 'gitView.pr.toast.noModelSelected': 'Wähle zuerst ein Modell aus', + 'gitView.pr.toast.noPrComments': 'Keine Pull-Request-Kommentare gefunden', + 'gitView.pr.toast.prCreated': 'Pull-Request erstellt', + 'gitView.pr.toast.prMerged': 'Pull-Request zusammengeführt', + 'gitView.pr.toast.prNotMerged': 'Pull-Request wurde nicht zusammengeführt', + 'gitView.pr.toast.prUpdated': 'Pull-Request aktualisiert', + 'gitView.pr.toast.sendMessageFailed': 'Fehler beim Senden der Nachricht an den Agenten', + 'gitView.pr.toast.titleRequired': 'Titel ist erforderlich', + 'gitView.pr.toast.updatePrFailed': 'Fehler beim Aktualisieren des Pull-Requests', + 'gitView.pullRequest.createHint': 'Erstelle und verwalte Pull-Requests aus diesem Branch.', + 'gitView.pullRequest.availableOnFeatureBranches': 'Verfügbar, wenn der aktuelle Branch einen Pull-Request öffnen kann.', + 'gitView.pullRequest.title': 'Pull-Request', + 'gitView.tabs.worktree': 'Worktree', + 'gitView.toast.abortOperationFailed': 'Fehler beim Abbrechen der Operation', + 'gitView.toast.appliedIdentity': 'Identität angewendet: {name}', + 'gitView.toast.applyIdentityFailed': 'Fehler beim Anwenden der Identität', + 'gitView.toast.branchCreatedLocally': 'Branch lokal erstellt, aber Fehler beim Festlegen des Upstreams.', + 'gitView.toast.cannotCheckout': 'Kann Branch nicht auschecken: {reason}', + 'gitView.toast.cannotCreateBranch': 'Kann Branch nicht erstellen: {reason}', + 'gitView.toast.cannotRemoveOriginRemote': 'Kann den origin-Remote nicht entfernen', + 'gitView.toast.cannotRenameBranch': 'Kann Branch nicht umbenennen: {reason}', + 'gitView.toast.checkedOut': 'Ausgecheckt {name}', + 'gitView.toast.checkoutFailed': 'Fehler beim Auschecken von {name}', + 'gitView.toast.commitCreated': 'Commit erstellt', + 'gitView.toast.commitHashCopied': 'Commit-Hash kopiert', + 'gitView.toast.continueOperationFailed': 'Fehler beim Fortsetzen der Operation', + 'gitView.toast.copyFailed': 'Fehler beim Kopieren', + 'gitView.toast.createBranchFailed': 'Fehler beim Erstellen des Branches', + 'gitView.toast.createCommitFailed': 'Fehler beim Erstellen des Commits', + 'gitView.toast.createdBranch': 'Branch {name} erstellt', + 'gitView.toast.enterCommitMessage': 'Geben Sie eine Commit-Nachricht ein', + 'gitView.toast.fetchedFromRemote': 'Von {name} abgerufen', + 'gitView.toast.generateCommitMessageFailed': 'Fehler beim Generieren der Commit-Nachricht', + 'gitView.toast.mergeAborted': 'Merge abgebrochen', + 'gitView.toast.mergeCompleted': 'Merge abgeschlossen', + 'gitView.toast.mergeConflictsDetected': 'Merge-Konflikte erkannt', + 'gitView.toast.mergedIntoBranch': '{branch} in {currentBranch} gemerged', + 'gitView.toast.pulledFilesPlural': '{count} Dateien von {name} abgerufen', + 'gitView.toast.pulledFilesSingle': '{count} Datei von {name} abgerufen', + 'gitView.toast.pushedToUpstream': 'Zu {name} gepusht', + 'gitView.toast.commitOrStashBeforeSync': 'Committen oder stashen Sie Ihre Änderungen vor dem Sync', + 'gitView.toast.alreadyUpToDate': 'Bereits auf dem neuesten Stand', + 'gitView.toast.syncedPulledPluralAndPushed': '{count} Dateien von {name} abgerufen und zu Upstream gepusht', + 'gitView.toast.syncedPulledSingleAndPushed': '{count} Datei von {name} abgerufen und zu Upstream gepusht', + 'gitView.toast.syncedChanges': 'Änderungen synchronisiert', + 'gitView.toast.rebaseAborted': 'Rebase abgebrochen', + 'gitView.toast.rebaseConflictsDetected': 'Rebase-Konflikte erkannt', + 'gitView.toast.rebaseStepCompleted': 'Rebase-Schritt abgeschlossen', + 'gitView.toast.rebasedOntoBranch': '{currentBranch} neu basiert auf {branch}', + 'gitView.toast.refreshRepositoryFailed': 'Fehler beim Aktualisieren des Repositorys', + 'gitView.toast.remoteNameRequired': 'Remote-Name ist erforderlich', + 'gitView.toast.removedRemote': 'Remote {name} entfernt', + 'gitView.toast.renameBranchFailed': 'Fehler beim Umbenennen von {oldName} in {newName}', + 'gitView.toast.renamedBranch': '{oldName} umbenannt in {newName}', + 'gitView.toast.restoreStashFailed': 'Fehler beim Wiederherstellen des Stashes', + 'gitView.toast.restoreStashManually': 'Manuelles Wiederherstellen des Stashes erforderlich', + 'gitView.toast.revertFailed': 'Fehler beim Rückgängig machen der Änderungen', + 'gitView.toast.revertedFile': '{path} rückgängig gemacht', + 'gitView.toast.revertedFilesPlural': '{count} Dateien rückgängig gemacht', + 'gitView.toast.revertedFilesSingle': '{count} Datei rückgängig gemacht', + 'gitView.toast.revertedSomePlural': '{success} Dateien rückgängig gemacht, {failed} fehlgeschlagen', + 'gitView.toast.revertedSomeSingle': '{success} Datei rückgängig gemacht, {failed} fehlgeschlagen', + 'gitView.toast.stageFileFailed': 'Fehler beim Stagen der Änderungen', + 'gitView.toast.stageFileToCommit': 'Stage mindestens eine Datei zum Commit', + 'gitView.toast.stageFileToDescribe': 'Stage mindestens eine Datei zur Beschreibung', + 'gitView.toast.selectFileToCommit': 'Wähle mindestens eine Datei zum Commit aus', + 'gitView.toast.selectFileToDescribe': 'Wähle mindestens eine Datei zur Beschreibung aus', + 'gitView.toast.stashedRestored': 'Gestashete Änderungen wiederhergestellt', + 'gitView.toast.syncActionFailed': '{action} fehlgeschlagen', + 'gitView.toast.unstageFileFailed': 'Fehler beim Aufheben des Stages der Änderungen', + 'gitView.toast.upstreamSet': 'Upstream für {branch} auf {remote} gesetzt', + 'gitView.worktree.availableInWorktreeMode': 'Nur im Worktree-Modus verfügbar', + 'contextPanel.mode.chat': 'Chat', + 'contextPanel.mode.files': 'Dateien', + 'contextPanel.mode.diff': 'Änderungen', + 'contextPanel.mode.stagedDiff': 'Staged Diff', + 'contextPanel.mode.workingDiff': 'Working Diff', + 'contextPanel.mode.plan': 'Plan', + 'contextPanel.mode.context': 'Kontext', + 'contextPanel.mode.preview': 'Vorschau', + 'contextPanel.mode.browser': 'Browser', + 'contextPanel.browser.open': 'Browser-Panel öffnen', + 'contextPanel.browser.addressAria': 'Browser-Adresse', + 'contextPanel.browser.empty': 'Webbrowser', + 'contextPanel.browser.emptyHint': 'Geben Sie oben eine Adresse ein, um mit dem Surfen im Web zu beginnen', + 'contextPanel.browser.inspectUnavailable': 'Diese Seite kann nicht aus dem Browser-Panel inspectiert werden.', + 'contextPanel.browser.trustNotice': 'Seiten, die hier geöffnet werden, laufen mit vollständigem Zugriff auf OpenChamber — erforderlich für Inspect und Screenshots. Öffnen Sie nur Seiten, denen Sie vertrauen: Eine bösartige Seite könnte Ihre Daten lesen oder in Ihrem Namen handeln.', + 'contextPanel.tab.closeTabAria': '{label}-Registerkarte schließen', + 'contextPanel.actions.collapsePanel': 'Panel einklappen', + 'contextPanel.actions.expandPanel': 'Panel ausklappen', + 'contextPanel.actions.closePanel': 'Panel schließen', + 'contextPanel.actions.resizePanelAria': 'Größe des Kontextpanels ändern', + 'contextPanel.iframe.sessionChatTitle': 'Sitzungschat {sessionID}', + 'contextPanel.preview.actions.reload': 'Vorschau neu laden', + 'contextPanel.preview.actions.openExternal': 'Im Browser öffnen', + 'contextPanel.preview.actions.retry': 'Erneut versuchen', + 'contextPanel.preview.iframeTitle': 'Vorschau', + 'contextPanel.preview.invalidUrl': 'Vorschau benötigt eine gültige http(s)-URL.', + 'contextPanel.preview.empty': 'Keine Vorschau-URL', + 'contextPanel.preview.loading': 'Vorschau-Proxy wird verbunden...', + 'contextPanel.preview.proxyError': 'Konnte Vorschau-Proxy nicht starten.', + 'contextPanel.preview.upstreamUnreachable': 'Dev-Server antwortet nicht.', + 'contextPanel.preview.upstreamUnreachableHint': 'Stellen Sie sicher, dass Ihr Dev-Server noch läuft, und versuchen Sie es dann erneut.', + 'contextPanel.preview.startingServer': 'Dev-Server wird gestartet...', + 'contextPanel.preview.startingServerHint': 'Warten auf Annahme von Verbindungen durch den Server.', + 'contextPanel.preview.title': 'Vorschau', + 'contextPanel.preview.description': 'Verwenden Sie Projektaktionen oder eine Vorschau-Schaltfläche im Terminal, um eine Vorschau zu öffnen.', + 'contextPanel.preview.startPreview': 'Vorschau starten', + 'contextPanel.preview.starting': 'Starte...', + 'contextPanel.preview.noDevServer': 'Kein Dev-Server-Befehl gefunden. Konfiguriere eine Projektaktion oder füge einen "dev"-Skript in package.json hinzu.', + 'contextPanel.preview.startFailed': 'Fehler beim Starten des Vorschau-Servers.', + 'contextPanel.preview.serverExited': 'Dev-Server wurde unerwartet beendet.', + 'contextPanel.preview.noUrlDetected': 'Dev-Server gestartet, aber keine URL in der Ausgabe erkannt. Öffne den Vorschau-Terminal-Tab, um die Protokolle zu prüfen.', + 'contextPanel.preview.serverExitedWithLog': 'Dev-Server wurde unerwartet beendet. Letzte Ausgabe:\n\n{log}', + 'contextPanel.preview.noUrlDetectedWithLog': 'Dev-Server ist nicht erreichbar geworden. Letzte Ausgabe:\n\n{log}', + 'contextPanel.preview.console.open': 'Vorschau-Konsole öffnen', + 'contextPanel.preview.console.waiting': 'Warte auf Vorschau-Konsole', + 'contextPanel.preview.console.title': 'Vorschau-Konsole', + 'contextPanel.preview.console.attach': 'Anhängen', + 'contextPanel.preview.console.copy': 'Kopieren', + 'contextPanel.preview.console.clear': 'Leeren', + 'contextPanel.preview.console.empty': 'Noch keine Vorschau-Konsole-Ereignisse.', + 'contextPanel.preview.console.noFilteredEvents': 'Keine Ereignisse entsprechen diesem Filter.', + 'contextPanel.preview.console.runtimeError': 'Laufzeitfehler', + 'contextPanel.preview.console.copied': 'Vorschau-Konsole kopiert', + 'contextPanel.preview.console.copyFailed': 'Fehler beim Kopieren der Vorschau-Konsole', + 'contextPanel.preview.console.attached': 'Vorschau-Konsole an Chat angehängt', + 'contextPanel.preview.console.attachNoSession': 'Öffne eine Chat-Sitzung, bevor du Vorschau-Protokolle anhängst', + 'contextPanel.preview.console.attachAnnotation': 'Dies sind Browser-Konsole-Protokolle vom Dev-Server, der für dieses Projekt läuft.', + 'contextPanel.preview.inspect.toggle': 'Vorschau-Element untersuchen', + 'contextPanel.preview.inspect.attached': 'Vorschau-Anmerkung an Chat angehängt', + 'contextPanel.preview.inspect.attachNoSession': 'Öffne eine Chat-Sitzung, bevor du Vorschau-Anmerkungen anhängst', + 'contextPanel.preview.inspect.attachAnnotation': 'Dies ist ein ausgewähltes DOM-Element aus der In-App-Vorschau.', + 'contextPanel.preview.inspect.attachAnnotationWithScreenshot': 'Dies ist ein ausgewähltes DOM-Element aus der In-App-Vorschau. Ein Screenshot des sichtbaren Vorschau-Bereichs mit dem ausgewählten Element hervorgehoben ist angehängt.', + 'contextPanel.preview.console.filter.all': 'Alle', + 'contextPanel.preview.console.filter.errors': 'Fehler', + 'contextPanel.preview.console.filter.warnings': 'Warnungen', + 'contextPanel.preview.console.filter.logs': 'Protokolle', + 'terminalView.preview.open': 'Vorschau', + 'terminalView.preview.openTitle': 'Vorschaubereich öffnen', + 'sidebarFilesTree.menu.rename': 'Umbenennen', + 'sidebarFilesTree.menu.copyPath': 'Pfad kopieren', + 'sidebarFilesTree.menu.save': 'Speichern', + 'sidebarFilesTree.menu.newFile': 'Neue Datei', + 'sidebarFilesTree.menu.newFolder': 'Neuer Ordner', + 'sidebarFilesTree.menu.delete': 'Löschen', + 'sidebarFilesTree.toast.pathCopied': 'Pfad kopiert', + 'sidebarFilesTree.toast.copyFailed': 'Kopieren fehlgeschlagen', + 'sidebarFilesTree.toast.revealFailed': 'Pfad konnte nicht angezeigt werden', + 'sidebarFilesTree.toast.filenameRequired': 'Dateiname ist erforderlich', + 'sidebarFilesTree.toast.writeNotSupported': 'Schreiben nicht unterstützt', + 'sidebarFilesTree.toast.fileCreated': 'Datei erstellt', + 'sidebarFilesTree.toast.operationFailed': 'Operation fehlgeschlagen', + 'sidebarFilesTree.toast.folderNameRequired': 'Ordnername ist erforderlich', + 'sidebarFilesTree.toast.folderCreated': 'Ordner erstellt', + 'sidebarFilesTree.toast.nameRequired': 'Name ist erforderlich', + 'sidebarFilesTree.toast.renameNotSupported': 'Umbenennen nicht unterstützt', + 'sidebarFilesTree.toast.renamedSuccessfully': 'Erfolgreich umbenannt', + 'sidebarFilesTree.toast.deleteNotSupported': 'Löschen nicht unterstützt', + 'sidebarFilesTree.toast.deletedSuccessfully': 'Erfolgreich gelöscht', + 'sidebarFilesTree.search.placeholder': 'Dateien suchen...', + 'sidebarFilesTree.search.clearAria': 'Suche löschen', + 'sidebarFilesTree.actions.newFileTitle': 'Neue Datei', + 'sidebarFilesTree.actions.newFolderTitle': 'Neuer Ordner', + 'sidebarFilesTree.actions.refreshTitle': 'Aktualisieren', + 'sidebarFilesTree.actions.fileMenuTitle': 'Dateimenü', + 'sidebarFilesTree.state.searching': 'Suche läuft...', + 'sidebarFilesTree.state.loading': 'Wird geladen...', + 'sidebarFilesTree.dialog.createFile.title': 'Datei erstellen', + 'sidebarFilesTree.dialog.createFolder.title': 'Ordner erstellen', + 'sidebarFilesTree.dialog.rename.title': 'Umbenennen', + 'sidebarFilesTree.dialog.delete.title': 'Löschen', + 'sidebarFilesTree.dialog.createFile.description': 'Erstelle eine neue Datei in {path}', + 'sidebarFilesTree.dialog.createFolder.description': 'Erstelle einen neuen Ordner in {path}', + 'sidebarFilesTree.dialog.rename.description': '{name} umbenennen', + 'sidebarFilesTree.dialog.delete.description': 'Sind Sie sicher, dass Sie {name} löschen möchten? Diese Aktion kann nicht rückgängig gemacht werden.', + 'sidebarFilesTree.dialog.rootFallback': 'root', + 'sidebarFilesTree.dialog.rename.placeholder': 'Neuer Name', + 'sidebarFilesTree.dialog.namePlaceholder': 'Name', + 'sidebarFilesTree.dialog.cancel': 'Abbrechen', + 'sidebarFilesTree.dialog.confirm': 'Bestätigen', + 'sidebarFilesTree.dialog.delete.confirm': 'Löschen', + 'filesView.dialog.createFile.title': 'Datei erstellen', + 'filesView.dialog.createFolder.title': 'Ordner erstellen', + 'filesView.dialog.rename.title': 'Umbenennen', + 'filesView.dialog.delete.title': 'Löschen', + 'filesView.dialog.createFile.description': 'Erstelle eine neue Datei in {path}', + 'filesView.dialog.createFolder.description': 'Erstelle einen neuen Ordner in {path}', + 'filesView.dialog.rename.description': '{name} umbenennen', + 'filesView.dialog.delete.description': 'Sind Sie sicher, dass Sie {name} löschen möchten? Diese Aktion kann nicht rückgängig gemacht werden.', + 'filesView.dialog.rootFallback': 'root', + 'filesView.dialog.rename.placeholder': 'Neuer Name', + 'filesView.dialog.namePlaceholder': 'Name', + 'filesView.dialog.cancel': 'Abbrechen', + 'filesView.dialog.confirm': 'Bestätigen', + 'filesView.dialog.delete.confirm': 'Löschen', + 'filesView.editor.saving': 'Speichern...', + 'filesView.editor.saved': 'Gespeichert', + 'filesView.editor.autoSaveOn': 'Automatisch speichern ein', + 'filesView.editor.manualSave': 'Manuelles Speichern', + 'filesView.editor.saveNowTitle': 'Jetzt speichern ({shortcut}) - automatisches Speichern nach 1,5s', + 'filesView.editor.saveNowManualTitle': 'Jetzt speichern ({shortcut})', + 'filesView.editor.saveAria': 'Speichern ({shortcut})', + 'filesView.editor.openInDesktopApp': 'In Desktop-App öffnen', + 'filesView.editor.refreshApps': 'Apps aktualisieren', + 'filesView.editor.disableLineWrap': 'Zeilenumbruch deaktivieren', + 'filesView.editor.enableLineWrap': 'Zeilenumbruch aktivieren', + 'filesView.editor.findInFile': 'In Datei suchen', + 'filesView.editor.goToLine': 'Gehe zu Zeile', + 'filesView.editor.switchToEditMode': 'Zum Bearbeitungsmodus wechseln', + 'filesView.editor.switchToPreviewMode': 'Zum Vorschau-Modus wechseln', + 'filesView.editor.switchToTextView': 'Zur Textansicht wechseln', + 'filesView.editor.switchToTreeView': 'Zur Baumansicht wechseln', + 'filesView.toast.copyFailed': 'Kopieren fehlgeschlagen', + 'filesView.toast.openInAppFailed': 'Öffnen in {app} fehlgeschlagen', + 'filesView.toast.savingNotSupported': 'Speichern nicht unterstützt', + 'filesView.toast.writeFileFailed': 'Schreiben der Datei fehlgeschlagen', + 'filesView.toast.saveFailed': 'Speichern fehlgeschlagen', + 'filesView.editor.copyFileContents': 'Dateiinhalte kopieren', + 'filesView.editor.copyFilePathTitle': 'Dateipfad kopieren ({path})', + 'filesView.editor.saveFile': 'Datei speichern', + 'filesView.editor.exitFullscreen': 'Vollbild beenden', + 'filesView.editor.fullscreen': 'Vollbild', + 'filesView.unsaved.title': 'Ungespeicherte Änderungen', + 'filesView.unsaved.description': 'Änderungen speichern, bevor Sie fortfahren?', + 'filesView.unsaved.saveChanges': 'Änderungen speichern', + 'filesView.unsaved.discard': 'Verwerfen', + 'filesView.editor.back': 'Zurück', + 'filesView.editor.openFilesAria': 'Offene Dateien', + 'filesView.editor.closeFileAria': 'Schließe {name}', + 'filesView.editor.selectFile': 'Datei auswählen', + 'filesView.editor.showControlsAria': 'Editor-Kontrollen anzeigen', + 'filesView.editor.controlsTitle': 'Editor-Kontrollen', + 'filesView.editor.pickFileFromTree': 'Wählen Sie eine Datei aus dem Baum aus.', + 'filesView.state.loading': 'Laden...', + 'filesView.state.openingFileAtChange': 'Öffne Datei bei Änderung...', + 'filesView.tree.search.placeholder': 'Dateien durchsuchen...', + 'filesView.tree.search.clearAria': 'Suche löschen', + 'filesView.tree.search.searching': 'Suche...', + 'filesView.tree.actions.newFileTitle': 'Neue Datei', + 'filesView.tree.actions.newFolderTitle': 'Neuer Ordner', + 'filesView.tree.actions.refreshTitle': 'Aktualisieren', + 'filesView.editor.imageAltFallback': 'Bild', + 'filesView.error.jsonViewerUnavailable': 'JSON-Betrachter nicht verfügbar', + 'filesView.error.switchToTextMode': 'Wechseln Sie zum Textmodus, um den Rohinhalt anzuzeigen.', + 'filesView.warning.largeFilePreviewLimited': 'Diese Datei ist groß ({sizeKb}KB). Die Vorschau kann eingeschränkt sein.', + 'filesView.error.previewUnavailable': 'Vorschau nicht verfügbar', + 'filesView.error.switchToEditMode': 'Wechseln Sie zum Bearbeitungsmodus, um das Problem zu beheben.', + 'filesView.error.readFileFailed': 'Fehler beim Lesen der Datei', + 'filesView.editor.htmlPreviewTitle': 'HTML-Vorschau', + 'filesView.diagram.closeDiagramView': 'Diagrammansicht schließen', + 'filesView.diagram.saveDiagram': 'Diagramm speichern', + 'contextUsage.aria.label': 'Kontextnutzung', + 'contextUsage.mobile.title': 'Kontextnutzung', + 'contextUsage.mobile.usedTokens': 'Verwendete Tokens', + 'contextUsage.mobile.contextLimit': 'Kontextlimit', + 'contextUsage.mobile.outputLimit': 'Ausgabelimit', + 'contextUsage.mobile.usage': 'Nutzung', + 'contextUsage.tooltip.usedTokens': 'Verwendete Tokens: {tokens}', + 'contextUsage.tooltip.contextLimit': 'Kontextlimit: {tokens}', + 'contextUsage.tooltip.outputLimit': 'Ausgabelimit: {tokens}', + 'contextSidebar.session.untitled': 'Unbenannte Sitzung', + 'contextSidebar.empty.openSession': 'Öffnen Sie eine Sitzung, um den Kontext zu prüfen.', + 'contextSidebar.section.context': 'Kontext', + 'contextSidebar.section.lastAssistantMessage': 'Letzte Assistentennachricht', + 'contextSidebar.section.rawMessages': 'Rohmeldungen', + 'contextSidebar.context.percentUsed': '{percent}% verwendet', + 'contextSidebar.breakdown.user': 'Benutzer', + 'contextSidebar.breakdown.assistant': 'Assistent', + 'contextSidebar.breakdown.toolCalls': 'Werkzeugaufrufe', + 'contextSidebar.breakdown.other': 'Andere', + 'contextSidebar.stats.messages': 'Nachrichten', + 'contextSidebar.stats.user': 'Benutzer', + 'contextSidebar.stats.assistant': 'Assistent', + 'contextSidebar.stats.cost': 'Kosten', + 'contextSidebar.tokens.input': 'Eingabe', + 'contextSidebar.tokens.output': 'Ausgabe', + 'contextSidebar.tokens.reasoning': 'Reasoning', + 'contextSidebar.tokens.cacheRead': 'Cache-Lesevorgang', + 'contextSidebar.tokens.cacheWrite': 'Cache-Schreibvorgang', + 'contextSidebar.tokens.cacheHit': 'Cache-Treffer', + 'contextSidebar.actions.copyJson': 'JSON kopieren', + 'contextSidebar.actions.copy': 'Kopieren', + 'contextSidebar.actions.copied': 'Kopiert', + 'planView.file.defaultName': 'plan', + 'planView.title.default': 'Plan', + 'planView.error.saveFailed': 'Speichern fehlgeschlagen', + 'planView.error.previewUnavailable': 'Vorschau nicht verfügbar', + 'planView.error.switchToEditMode': 'Wechseln Sie zum Bearbeitungsmodus, um das Problem zu beheben.', + 'planView.error.writeFailed': 'Schreiben fehlgeschlagen', + 'planView.error.writePlanFileFailed': 'Fehler beim Schreiben der Plan-Datei ({status})', + 'planView.actions.improvePlanAria': 'Plan verbessern', + 'planView.actions.improve': 'Verbessern', + 'planView.actions.implementPlanAria': 'Plan implementieren', + 'planView.actions.implement': 'Implementieren', + 'planView.actions.sendToNewSession': 'An neue Sitzung senden', + 'planView.actions.sendToNewWorktreeSession': 'An neue Worktree-Sitzung senden', + 'planView.actions.copyPlanContents': 'Plan-Inhalt kopieren', + 'planView.state.loading': 'Wird geladen...', + 'diffView.binary.unavailable': 'Der Inhalt dieser Datei kann nicht angezeigt werden.', + 'diffView.change.untracked': 'Nicht überwachte Datei', + 'diffView.change.new': 'Neue Datei', + 'diffView.change.deleted': 'Gelöschte Datei', + 'diffView.change.renamed': 'Umbenannte Datei', + 'diffView.change.copied': 'Kopierte Datei', + 'diffView.change.modified': 'Geänderte Datei', + 'diffView.selector.selectFile': 'Datei auswählen', + 'diffView.image.original': 'Original', + 'diffView.image.modified': 'Geändert', + 'diffView.image.new': 'Neu', + 'diffView.image.originalAlt': 'Original: {path}', + 'diffView.image.modifiedAlt': 'Geändert: {path}', + 'diffView.section.files': 'Dateien', + 'diffView.state.selectSessionDirectory': 'Wählen Sie ein Sitzungsverzeichnis aus, um Unterschiede anzuzeigen', + 'diffView.state.loadingRepositoryStatus': 'Repository-Status wird geladen...', + 'diffView.state.notGitRepository': 'Kein Git-Repository. Verwenden Sie den Git-Tab, um es zu initialisieren oder ein Verzeichnis zu wechseln.', + 'diffView.state.cleanWorkingTree': 'Arbeitsverzeichnis ist sauber, keine Änderungen zum Anzeigen', + 'diffView.state.noLastTurnChanges': 'Keine Änderungen im letzten Zug zum Anzeigen', + 'diffView.state.failedToLoadDiff': 'Fehler beim Laden des Diffs', + 'diffView.state.loadingDiff': 'Lade Diff...', + 'diffView.state.loadingChanges': 'Lade Änderungen...', + 'diffView.state.largeDiff': 'Großer Diff ({count} geänderte Zeilen)', + 'diffView.state.largeDiffDescription': 'Die Darstellung kann langsam sein. Sie können den Diff dennoch anzeigen, indem Sie unten klicken.', + 'diffView.summary.changedFilesSingle': '{count} Datei geändert', + 'diffView.summary.changedFilesPlural': '{count} Dateien geändert', + 'diffView.scope.changed': 'Geändert', + 'diffView.scope.staged': 'Staged', + 'diffView.scope.lastTurn': 'Letzter Zug', + 'diffView.scope.selectorAria': 'Änderungsmodus auswählen', + 'diffView.actions.retry': 'Erneut versuchen', + 'diffView.actions.renderAnyway': 'Trotzdem rendern', + 'diffView.actions.expandAll': 'Alle erweitern', + 'diffView.actions.collapseAll': 'Alle reduzieren', + 'diffView.actions.loadFullFiles': 'Vollständige Dateien laden', + 'diffView.actions.disableFullFiles': 'Vollständige Dateien entladen', + 'diffView.actions.disableLineWrap': 'Zeilenumbruch deaktivieren', + 'diffView.actions.enableLineWrap': 'Zeilenumbruch aktivieren', + 'diffView.actions.openFileInEditorAtChange': 'Diese Datei im Editor bei der Änderung öffnen', + 'diffView.actions.openFileAtFirstChangedLine': 'Diese Datei an erster geänderter Zeile öffnen', + 'diffView.actions.review': 'Überprüfen', + 'diffView.actions.reviewAria': 'Änderungen überprüfen', + 'diffView.reviewDialog.title': 'Änderungen überprüfen', + 'diffView.reviewDialog.description': 'Starten Sie eine separate Überprüfungs-Sitzung für die aktuellen Änderungen.', + 'diffView.reviewDialog.generateHandoff': 'Übergabe generieren', + 'diffView.reviewDialog.autoReview': 'Automatische Überprüfungs-Schleife ausführen', + 'diffView.reviewDialog.info': 'Dieser Ablauf funktioniert am besten, wenn er aus der Sitzung gestartet wird, in der die Änderungen implementiert wurden.', + 'diffView.reviewDialog.actions.cancel': 'Abbrechen', + 'diffView.reviewDialog.actions.start': 'Überprüfen', + 'diffView.reviewDialog.actions.starting': 'Starte...', + 'diffView.reviewDialog.toast.noSessionDirectory': 'Sitzungsverzeichnis ist nicht verfügbar', + 'diffView.reviewDialog.toast.startFailed': 'Fehler beim Starten des Überprüfungsflusses', + 'chat.history.loadOlder': 'Ältere Nachrichten laden', + 'chat.autoReview.title': 'Code-Überprüfungs-Schleife läuft', + 'chat.autoReview.status.waitingForReviewer': 'Warte auf Überprüfer', + 'chat.autoReview.status.waitingForImplementer': 'Warte auf Implementierer', + 'chat.autoReview.reviewSessionLabel': 'Überprüfungssitzung', + 'chat.autoReview.actions.open': 'Öffnen', + 'chat.autoReview.actions.stop': 'Stoppen', + 'diffView.hunk.label': 'Stücke', + 'diffView.hunk.stage': 'Zu Staging hinzufügen', + 'diffView.hunk.unstage': 'Aus Staging entfernen', + 'diffView.hunk.discard': 'Verwerfen', + 'diffView.hunk.stageTitle': 'Stück {index} zu Staging hinzufügen', + 'diffView.hunk.unstageTitle': 'Stück {index} aus Staging entfernen', + 'diffView.hunk.discardTitle': 'Stück {index} verwerfen', + 'diffView.hunk.unavailable': 'Dieses Stück ist nicht länger verfügbar. Aktualisiere die Diff-Ansicht und versuche es erneut.', + 'diffView.hunk.unsupported': 'Das Staging einzelner Stücke wird in dieser Laufzeitumgebung nicht unterstützt.', + 'rightSidebar.contextNotesTodo.plan.defaultTitle': 'Plan', + 'rightSidebar.contextNotesTodo.empty.selectProject': 'Wähle ein Projekt aus, um Notizen und Aufgaben hinzuzufügen.', + 'rightSidebar.contextNotesTodo.notes.title': 'Schnelle Notizen - {project}', + 'rightSidebar.contextNotesTodo.notes.placeholder': 'Kontext, Erinnerungen oder Links festhalten', + 'rightSidebar.contextNotesTodo.todo.title': 'Aufgaben', + 'rightSidebar.contextNotesTodo.todo.itemsSingle': '{count} Element', + 'rightSidebar.contextNotesTodo.todo.itemsPlural': '{count} Elemente', + 'rightSidebar.contextNotesTodo.todo.clearCompleted': 'Abgeschlossene löschen', + 'rightSidebar.contextNotesTodo.todo.inputPlaceholder': 'Eine Aufgabe hinzufügen', + 'rightSidebar.contextNotesTodo.todo.addAria': 'Aufgabe hinzufügen', + 'rightSidebar.contextNotesTodo.todo.empty': 'Noch keine Aufgaben. Fügen Sie eine kleine Checkliste für dieses Projekt hinzu.', + 'rightSidebar.contextNotesTodo.todo.actions.markComplete': 'Markiere "{text}" als erledigt', + 'rightSidebar.contextNotesTodo.todo.actions.collapse': 'Aufgabe "{text}" einklappen', + 'rightSidebar.contextNotesTodo.todo.actions.expand': 'Aufgabe "{text}" ausklappen', + 'rightSidebar.contextNotesTodo.todo.actions.delete': 'Lösche "{text}"', + 'rightSidebar.contextNotesTodo.todo.actions.send': 'Sende "{text}"', + 'rightSidebar.contextNotesTodo.todo.actions.reorder': 'Ordne "{text}" neu', + 'rightSidebar.contextNotesTodo.todo.resizeAria': 'Größe der Aufgabenliste ändern', + 'rightSidebar.contextNotesTodo.todo.sendMenu.currentSession': 'An aktuelle Sitzung senden', + 'rightSidebar.contextNotesTodo.todo.sendMenu.newSession': 'An neue Sitzung senden', + 'rightSidebar.contextNotesTodo.todo.sendMenu.newWorktreeSession': 'An neue Worktree-Sitzung senden', + 'rightSidebar.contextNotesTodo.plans.title': 'Pläne', + 'rightSidebar.contextNotesTodo.plans.filesSingle': '{count} Datei', + 'rightSidebar.contextNotesTodo.plans.filesPlural': '{count} Dateien', + 'rightSidebar.contextNotesTodo.plans.importFromFile': 'Plan aus Datei importieren', + 'rightSidebar.contextNotesTodo.plans.empty': 'Noch keine gespeicherten Pläne.', + 'rightSidebar.contextNotesTodo.plans.deletePlan': 'Plan löschen', + 'rightSidebar.contextNotesTodo.plans.deletePlanWithTitle': 'Lösche Plan "{title}"', + 'rightSidebar.contextNotesTodo.sendDialog.title.newSession': 'An neue Sitzung senden', + 'rightSidebar.contextNotesTodo.sendDialog.title.newWorktree': 'An neuen Worktree senden', + 'rightSidebar.contextNotesTodo.sendDialog.variant.default': 'Standard', + 'rightSidebar.contextNotesTodo.sendDialog.actions.cancel': 'Abbrechen', + 'rightSidebar.contextNotesTodo.sendDialog.actions.send': 'Senden', + 'rightSidebar.contextNotesTodo.sendDialog.actions.sending': 'Senden', + 'rightSidebar.contextNotesTodo.toast.saveNotesFailed': 'Fehler beim Speichern der Projektnotizen', + 'rightSidebar.contextNotesTodo.toast.loadNotesFailed': 'Fehler beim Laden der Projektnotizen', + 'rightSidebar.contextNotesTodo.toast.noActiveSession': 'Keine aktive Sitzung ausgewählt', + 'rightSidebar.contextNotesTodo.toast.sentToCurrentSession': 'Aufgabe an aktuelle Sitzung gesendet', + 'rightSidebar.contextNotesTodo.toast.worktreeRequiresGitRepo': 'Worktree-Aktionen sind nur für Git-Repositories verfügbar', + 'rightSidebar.contextNotesTodo.toast.createSessionFailed': 'Fehler beim Erstellen der Sitzung', + 'rightSidebar.contextNotesTodo.toast.sentToNewSession': 'Todo an neue Sitzung gesendet', + 'rightSidebar.contextNotesTodo.toast.sentToNewWorktreeSession': 'Todo an neue Worktree-Sitzung gesendet', + 'rightSidebar.contextNotesTodo.toast.sendTodoFailed': 'Fehler beim Senden des Todos', + 'rightSidebar.contextNotesTodo.toast.deletePlanFailed': 'Fehler beim Löschen des Plans', + 'rightSidebar.contextNotesTodo.toast.planFileEmpty': 'Plan-Datei ist leer', + 'rightSidebar.contextNotesTodo.toast.importPlanFailed': 'Fehler beim Importieren des Plans', + 'rightSidebar.contextNotesTodo.toast.planImported': 'Plan importiert', + 'rightSidebar.contextNotesTodo.toast.readPlanFileFailed': 'Fehler beim Lesen der Plan-Datei', + 'inlineComment.range.lines': 'Zeilen {start}-{end}', + 'inlineComment.input.placeholder': 'Kommentar hinzufügen... (Cmd+Enter zum Speichern)', + 'inlineComment.input.placeholderShort': 'Kommentar hinzufügen...', + 'inlineComment.actions.cancel': 'Abbrechen', + 'inlineComment.actions.save': 'Speichern', + 'inlineComment.actions.comment': 'Kommentieren', + 'inlineComment.actions.showLess': 'Weniger anzeigen', + 'inlineComment.actions.showMore': 'Mehr anzeigen', + 'inlineComment.actions.editComment': 'Kommentar bearbeiten', + 'inlineComment.actions.deleteComment': 'Kommentar löschen', + 'inlineComment.toast.selectSessionToSave': 'Sitzung zum Speichern des Kommentars auswählen', + 'header.github.connectedWithLogin': 'GitHub: {login}', + 'header.github.connected': 'GitHub verbunden', + 'header.github.avatarWithLogin': '{login} Avatar', + 'header.github.avatar': 'GitHub-Avatar', + 'header.github.accountsTitle': 'GitHub-Konten', + 'header.github.accountSource.oauth': 'OAuth', + 'header.github.accountSource.cli': 'CLI', + 'header.services.openWithCurrent': 'Instanz öffnen, Nutzung und MCP (aktuell: {current})', + 'header.services.open': 'Dienste öffnen, Nutzung und MCP', + 'header.services.tooltip.currentInstanceWithShortcuts': 'Aktuelle Instanz: {current} ({toggle}; nächster Tab {nextTab})', + 'header.services.tooltip.servicesWithShortcuts': 'Dienste ({toggle}; nächster Tab {nextTab})', + 'header.services.title': 'Dienste', + 'header.services.viewAria': 'Dienste anzeigen', + 'header.services.closeAria': 'Dienste schließen', + 'header.services.rateLimits': 'Ratenlimits', + 'header.services.refreshRateLimitsAria': 'Ratenlimits aktualisieren', + 'header.services.noRateLimits': 'Keine Ratenlimits verfügbar.', + 'header.services.noRateLimitsReported': 'Keine Ratenlimits berichtet.', + 'header.services.remoteUpdate.title': 'Remote-Instanz-Update', + 'header.services.remoteUpdate.checking': 'Suche nach Updates...', + 'header.services.remoteUpdate.upToDate': 'Diese Instanz ist auf dem neuesten Stand.', + 'header.services.remoteUpdate.available': 'Version {version} ist für diese Instanz verfügbar.', + 'header.services.remoteUpdate.error': 'Fehler beim Prüfen von Remote-Instanz-Updates', + 'header.services.remoteUpdate.actions.open': 'Aktualisieren', + 'header.services.used': 'Verwendet', + 'header.services.remaining': 'Verbleibend', + 'header.services.modelFamily.other': 'Andere', + 'header.services.shutdownDev': 'OpenChamber stoppen', + 'header.actions.openPlanAria': 'Plan öffnen', + 'header.actions.toggleChangesPanel': 'Änderungspanel', + 'header.actions.toggleChangesPanelAria': 'Änderungspanel umschalten', + 'header.actions.planWithShortcut': 'Plan ({shortcut})', + 'header.actions.terminalPanelWithShortcut': 'Terminalpanel ({shortcut})', + 'chat.recap.aria': 'Sitzungs-Zusammenfassung', + 'chat.recap.label': 'Zusammenfassung:', + 'chat.goal.dialog.titleCreate': 'Sitzungsziel festlegen', + 'chat.goal.dialog.titleManage': 'Sitzungsziel', + 'chat.goal.dialog.objectiveLabel': 'Ziel', + 'chat.goal.dialog.objectivePlaceholder': 'Beschreiben Sie den Endzustand, den der Agent erreichen und überprüfen sollte...', + 'chat.goal.dialog.budgetLabel': 'Token-Budget', + 'chat.goal.status.active': 'Aktiv', + 'chat.goal.status.evaluating': 'Wird bewertet…', + 'chat.goal.status.paused': 'Pausiert', + 'chat.goal.status.blocked': 'Gesperrt', + 'chat.goal.status.budgetLimited': 'Budget erreicht', + 'chat.goal.status.complete': 'Abgeschlossen', + 'chat.goal.usage.tokens': '{used} Tokens', + 'chat.goal.usage.tokensWithBudget': '{used}/{budget} Tokens', + 'chat.goal.usage.turns': '{turns} Fortsetzungen', + 'chat.goal.action.pause': 'Pausieren', + 'chat.goal.action.resume': 'Fortsetzen', + 'chat.goal.action.markComplete': 'Als abgeschlossen markieren', + 'chat.goal.action.clear': 'Ziel entfernen', + 'chat.goal.action.cancel': 'Abbrechen', + 'chat.goal.action.save': 'Ziel speichern', + 'chat.goal.action.start': 'Ziel starten', + 'chat.goal.toast.actionFailed': 'Aktualisierung des Ziels fehlgeschlagen', + 'chat.goal.row.aria': 'Sitzungsziel — Details öffnen', + 'chat.goal.button.createAria': 'Sitzungsziel festlegen', + 'chat.goal.button.manageAria': 'Sitzungsziel verwalten', + 'chat.goal.button.armAria': 'Ein Ziel mit der nächsten Nachricht starten', + 'chat.goal.counter.aria': 'Längenlimit des Ziels', + 'chat.goal.button.disarmAria': 'Ziel aktiv — tippen, um es zu deaktivieren', + 'chat.goal.button.cancelAria': 'Ziel läuft — tippen, um es abzubrechen', + 'chat.goal.cancelDialog.title': 'Dieses Ziel abbrechen?', + 'chat.goal.cancelDialog.description': 'Der Agent wird automatisch mit der Erreichung dieses Ziels aufhören.', + 'chat.goal.cancelDialog.keep': 'Ziel behalten', + 'chat.goal.cancelDialog.confirm': 'Ziel abbrechen', + 'chat.suggestion.applyAria': 'Vorgeschlagene Nachricht verwenden', + 'chat.suggestion.dismissAria': 'Vorschlag ablehnen', + 'header.actions.toggleTerminalPanelAria': 'Terminalbereich ein-/ausblenden', + 'terminalView.stream.processExitedMessage': '[Prozess beendet{exitCodeSegment}{signalSegment}]', + 'terminalView.stream.processExitedWithCode': ' mit Code {exitCode}', + 'terminalView.stream.processExitedWithSignal': ' (Signal {signal})', + 'terminalView.error.sessionEnded': 'Terminal-Sitzung beendet', + 'terminalView.error.connectionFailed': 'Verbindung fehlgeschlagen: {message}', + 'terminalView.error.startSessionFailed': 'Start der Terminal-Sitzung fehlgeschlagen', + 'terminalView.error.restartFailed': 'Neustart des Terminals fehlgeschlagen', + 'terminalView.error.sendInputFailed': 'Senden der Eingabe fehlgeschlagen', + 'terminalView.empty.noWorkingDirectory': 'Kein Arbeitsverzeichnis für das Terminal verfügbar.', + 'terminalView.empty.selectSession': 'Wählen Sie eine Sitzung aus, um das Terminal zu öffnen.', + 'terminalView.empty.noWorkingDirectoryForSession': 'Kein Arbeitsverzeichnis für diese Sitzung verfügbar.', + 'terminalView.actions.retry': 'Erneut versuchen', + 'terminalView.actions.hardRestart': 'Harter Neustart', + 'terminalView.actions.hardRestartTitle': 'Erzwinge Beenden und erstelle neue Sitzung', + 'terminalView.quickKeys.escape': 'Esc', + 'terminalView.quickKeys.tabAria': 'Tab', + 'terminalView.quickKeys.controlLabel': 'Strg', + 'terminalView.quickKeys.controlModifierAria': 'Steuerungsmodifikator', + 'terminalView.quickKeys.commandModifierAria': 'Befehlsmodifikator', + 'terminalView.quickKeys.arrowUpAria': 'Pfeil nach oben', + 'terminalView.quickKeys.arrowLeftAria': 'Pfeil nach links', + 'terminalView.quickKeys.arrowDownAria': 'Pfeil nach unten', + 'terminalView.quickKeys.arrowRightAria': 'Pfeil nach rechts', + 'terminalView.quickKeys.enterAria': 'Enter', + 'terminalView.tabs.closeTabTitle': 'Registerkarte schließen', + 'terminalView.tabs.newTabTitle': 'Neue Registerkarte', + 'terminalView.viewport.inputAria': 'Terminal-Eingabe', + 'directoryExplorerDialog.title': 'Projektverzeichnis hinzufügen', + 'directoryExplorerDialog.description': 'Wählen Sie einen Ordner aus, der als Projekt hinzugefügt werden soll.', + 'directoryExplorerDialog.toggle.showHidden': 'Versteckte anzeigen', + 'directoryExplorerDialog.pathInput.placeholder': 'Pfad eingeben oder aus Baumstruktur auswählen...', + 'directoryExplorerDialog.actions.openingFinder': 'Öffne...', + 'directoryExplorerDialog.actions.openInFinder': 'Im Finder öffnen', + 'directoryExplorerDialog.actions.adding': 'Füge hinzu...', + 'directoryExplorerDialog.actions.addProject': 'Projekt hinzufügen', + 'directoryExplorerDialog.actions.addLocalProject': 'Lokales Projekt hinzufügen', + 'directoryExplorerDialog.actions.cloneRepository': 'Repository klonen', + 'directoryExplorerDialog.actions.cloneAndAdd': 'Klonen & hinzufügen', + 'directoryExplorerDialog.actions.cloning': 'Klone...', + 'directoryExplorerDialog.actions.createAndAdd': 'Erstellen & hinzufügen', + 'directoryExplorerDialog.actions.alreadyAdded': 'Bereits hinzugefügt', + 'directoryExplorerDialog.clone.remoteUrlPlaceholder': 'Repository-URL (HTTPS oder SSH)', + 'directoryExplorerDialog.browse.directories': 'Verzeichnisse', + 'directoryExplorerDialog.browse.loading': 'Lade Verzeichnisse...', + 'directoryExplorerDialog.browse.empty': 'Keine passenden Verzeichnisse.', + 'directoryExplorerDialog.browse.parentDirectory': 'Übergeordnetes Verzeichnis', + 'directoryExplorerDialog.browse.addedBadge': 'Hinzugefügt', + 'directoryExplorerDialog.browse.quickAdd': 'Hinzufügen', + 'directoryExplorerDialog.footer.navigate': 'Navigieren', + 'directoryExplorerDialog.footer.select': 'Auswählen', + 'directoryExplorerDialog.footer.add': 'Hinzufügen', + 'directoryExplorerDialog.shortcut.enter': 'Enter', + 'directoryExplorerDialog.toast.unableToAccessDirectory': 'Auf Verzeichnis konnte nicht zugegriffen werden', + 'directoryExplorerDialog.toast.desktopDeniedAccess': 'Desktop hat den Zugriff auf das Verzeichnis verweigert.', + 'directoryExplorerDialog.toast.failedToOpenDirectory': 'Fehler beim Öffnen des Verzeichnisses', + 'directoryExplorerDialog.toast.desktopCouldNotGrantAccess': 'Desktop konnte keinen Dateizugriff gewähren.', + 'directoryExplorerDialog.toast.failedToAddProject': 'Fehler beim Hinzufügen des Projekts', + 'directoryExplorerDialog.toast.cloneUrlRequired': 'Geben Sie eine Repository-URL ein, bevor Sie klonen.', + 'directoryExplorerDialog.toast.selectValidDirectoryPath': 'Bitte wählen Sie einen gültigen Verzeichnispfad aus.', + 'directoryExplorerDialog.toast.failedToSelectDirectory': 'Fehler beim Auswählen des Verzeichnisses', + 'directoryExplorerDialog.toast.unknownError': 'Ein unbekannter Fehler ist aufgetreten.', + 'directoryTree.actions.createNewDirectory': 'Neues Verzeichnis erstellen', + 'directoryTree.actions.pinDirectory': 'Verzeichnis anheften', + 'directoryTree.actions.unpinDirectory': 'Verzeichnis lösen', + 'directoryTree.actions.createDirectory': 'Verzeichnis erstellen', + 'directoryTree.actions.cancel': 'Abbrechen', + 'directoryTree.actions.selectWorkingDirectoryAria': 'Arbeitsverzeichnis auswählen', + 'directoryTree.state.locatingHomeDirectory': 'Heimatverzeichnis wird gesucht...', + 'directoryTree.state.loading': 'Wird geladen...', + 'directoryTree.state.noDirectoriesFound': 'Keine Verzeichnisse gefunden', + 'directoryTree.section.pinned': 'Angeheftet', + 'directoryTree.section.browse': 'Durchsuchen', + 'aboutDialog.versionLabel': 'Version {version}', + 'aboutDialog.openChamberVersionLabel': 'OpenChamber Version {version}', + 'aboutDialog.openCodeVersionLabel': 'OpenCode Version {version}', + 'aboutDialog.actions.copyDiagnostics': 'Diagnose kopieren', + 'aboutDialog.actions.preparingDiagnostics': 'Diagnose wird vorbereitet...', + 'aboutDialog.actions.diagnosticsCopied': 'Diagnose kopiert', + 'aboutDialog.diagnosticsDescription': 'Enthält den OpenChamber-Zustand, die OpenCode-Integrität, Verzeichnisse und Projekte.', + 'aboutDialog.footerNote': 'Mit Liebe für die Community gemacht', + 'aboutDialog.toast.copyFailed': 'Kopieren fehlgeschlagen', + 'aboutDialog.toast.diagnosticsNotReady': 'Diagnose noch nicht bereit. Warten Sie eine Sekunde und versuchen Sie es erneut.', + 'aboutDialog.toast.diagnosticsCopied': 'Diagnose kopiert', + 'helpDialog.title': 'Tastaturkürzel', + 'helpDialog.description': 'Verwenden Sie diese Tastaturkürzel, um effizient durch OpenChamber zu navigieren', + 'helpDialog.section.navigationCommands': 'Navigation & Befehle', + 'helpDialog.section.sessionManagement': 'Sitzungsverwaltung', + 'helpDialog.section.panels': 'Panels', + 'helpDialog.section.interface': 'Oberfläche', + 'helpDialog.item.openCommandPalette': 'Befehlspalette öffnen', + 'helpDialog.item.showKeyboardShortcuts': 'Tastaturkürzel anzeigen (dieses Dialogfeld)', + 'helpDialog.item.toggleSessionSidebar': 'Sitzungs-Seitenleiste umschalten', + 'helpDialog.item.cycleAgent': 'Agent wechseln (Chat-Eingabe)', + 'helpDialog.item.openModelSelector': 'Modell-Auswahldialog öffnen', + 'helpDialog.item.navigateModels': 'Modelle navigieren (in Auswahl)', + 'helpDialog.item.adjustThinkingMode': 'Denkmodus anpassen (in Auswahl, wenn unterstützt)', + 'helpDialog.item.cycleThinkingVariant': 'Denkvariante wechseln (globale Tastenkombination)', + 'helpDialog.item.newWindow': 'Neues Fenster (nur Desktop)', + 'helpDialog.item.createNewSession': 'Neue Sitzung erstellen', + 'helpDialog.item.createNewWorktreeDraft': 'Neuer Worktree-Entwurf erstellen', + 'helpDialog.item.focusChatInput': 'Chat-Eingabe fokussieren', + 'helpDialog.item.togglePromptNavigator': 'Aufforderungs-Navigator umschalten', + 'helpDialog.item.abortActiveRun': 'Aktuelle Ausführung abbrechen (Doppeltaste)', + 'helpDialog.item.toggleRightSidebar': 'Rechte Seitenleiste umschalten', + 'helpDialog.item.openRightSidebarGitTab': 'Git-Registerkarte der rechten Seitenleiste öffnen', + 'helpDialog.item.openRightSidebarFilesTab': 'Datei-Registerkarte der rechten Seitenleiste öffnen', + 'helpDialog.item.toggleTerminalDock': 'Terminal-Dock umschalten', + 'helpDialog.item.toggleTerminalExpanded': 'Terminal erweitert umschalten', + 'helpDialog.item.togglePlanContextPanel': 'Plan-Kontext-Panel umschalten', + 'helpDialog.item.cycleTheme': 'Thema wechseln (Hell → Dunkel → System)', + 'helpDialog.item.switchProject': 'Projekt wechseln', + 'helpDialog.item.toggleServicesMenu': 'Dienstemenü umschalten', + 'helpDialog.item.cycleServicesTab': 'Dienste-Registerkarte durchgehen', + 'helpDialog.item.openSettings': 'Einstellungen öffnen', + 'helpDialog.keyCombiner.or': 'oder', + 'helpDialog.proTips.title': 'Pro-Tipps:', + 'helpDialog.proTips.commandPalette': 'Verwenden Sie die Befehlspalette ({shortcut}), um schnell auf alle Aktionen zuzugreifen', + 'helpDialog.proTips.recentSessions': 'Die 5 zuletzt verwendeten Sitzungen erscheinen in der Befehlspalette', + 'helpDialog.proTips.themeCycling': 'Themenwechsel merken sich Ihre Einstellung über Sitzungen hinweg', + 'header.actions.rightSidebarWithShortcut': 'Rechte Seitenleiste ({shortcut})', + 'header.actions.toggleRightSidebarAria': 'Rechte Seitenleiste umschalten', + 'header.actions.openAppMenu': 'OpenChamber-Menü', + 'header.actions.openAppMenuAria': 'OpenChamber-Menü öffnen', + 'header.actions.openSessionsWithShortcut': 'Sitzungen öffnen ({shortcut})', + 'header.actions.openSessionsAria': 'Sitzungen öffnen', + 'header.actions.closeSessionsAria': 'Sitzungen schließen', + 'header.actions.newSessionAria': 'Neue Sitzung', + 'header.actions.newSessionWithShortcut': 'Neue Sitzung ({shortcut})', + 'header.actions.backAria': 'Zurück', + 'header.navigation.mainAria': 'Hauptnavigation', + 'header.sessions.title': 'Sitzungen', + 'header.changes.availableAria': 'Änderungen verfügbar', + 'session.githubIssuePicker.error.noActiveProject': 'Kein aktives Projekt', + 'session.githubIssuePicker.error.runtimeUnavailable': 'GitHub-Laufzeit-API nicht verfügbar', + 'session.githubIssuePicker.error.notConnected': 'GitHub nicht verbunden', + 'session.githubIssuePicker.error.repoNotResolvable': 'Repository kann nicht aufgelöst werden', + 'session.githubIssuePicker.error.repoMustBeGithub': 'Das origin-Remote muss eine GitHub-URL sein', + 'session.githubIssuePicker.error.issueNotFound': 'Problem nicht gefunden', + 'session.githubIssuePicker.error.noModelSelected': 'Kein Modell ausgewählt', + 'session.githubIssuePicker.toast.loadMoreFailed': 'Fehler beim Laden weiterer Probleme', + 'session.githubIssuePicker.toast.loadIssueDetailsFailed': 'Fehler beim Laden der Problem-details', + 'session.githubIssuePicker.toast.sendContextFailed': 'Fehler beim Senden des Problem-Kontexts', + 'session.githubIssuePicker.toast.sessionCreated': 'Sitzung aus Problem erstellt', + 'session.githubIssuePicker.toast.startSessionFailed': 'Fehler beim Starten der Sitzung', + 'session.githubIssuePicker.title.select': 'GitHub-Probleme verknüpfen', + 'session.githubIssuePicker.title.createSession': 'Neue Sitzung aus GitHub-Problem', + 'session.githubIssuePicker.description.select': 'Wählen Sie ein Problem, um es mit dieser Sitzung zu verknüpfen.', + 'session.githubIssuePicker.description.createSession': 'Erstellt eine neue Sitzung mit verstecktem Problem-Kontext (Titel/Inhalt/Labels/Kommentare).', + 'session.githubIssuePicker.searchPlaceholder': 'Suche unter Verwendung der GitHub-Code-Suchsyntax', + 'session.githubIssuePicker.empty.noActiveProject': 'Kein aktives Projekt ausgewählt.', + 'session.githubIssuePicker.empty.runtimeUnavailable': 'GitHub-Laufzeit-API nicht verfügbar.', + 'session.githubIssuePicker.empty.notConnected': 'GitHub nicht verbunden. Verbinden Sie Ihr GitHub-Konto in den Einstellungen.', + 'session.githubIssuePicker.empty.noIssuesFound': 'Keine Probleme gefunden', + 'session.githubIssuePicker.empty.noOpenIssuesFound': 'Keine offenen Probleme gefunden', + 'session.githubIssuePicker.loading.issues': 'Probleme werden geladen...', + 'session.githubIssuePicker.loading.more': 'Wird geladen...', + 'session.githubIssuePicker.actions.openSettings': 'Einstellungen öffnen', + 'session.githubIssuePicker.actions.useIssue': 'Problem #{number} verwenden', + 'session.githubIssuePicker.actions.openInGitHubAria': 'In GitHub öffnen', + 'session.githubIssuePicker.actions.loadMore': 'Mehr laden', + 'session.githubIssuePicker.actions.sectionTitle': 'Aktionen', + 'session.githubIssuePicker.actions.toggleWorktreeAria': 'Worktree umschalten', + 'session.githubIssuePicker.actions.createInWorktree': 'In Worktree erstellen', + 'session.githubIssuePicker.actions.openRepo': 'Repository öffnen', + 'session.githubIssuePicker.actions.refresh': 'Aktualisieren', + 'session.githubPrPicker.error.noActiveProject': 'Kein aktives Projekt', + 'session.githubPrPicker.error.runtimeUnavailable': 'GitHub-Laufzeit-API nicht verfügbar', + 'session.githubPrPicker.error.notConnected': 'GitHub nicht verbunden', + 'session.githubPrPicker.error.prNotFound': 'Pull-Request nicht gefunden', + 'session.githubPrPicker.error.repoNotResolvable': 'Repository kann nicht aufgelöst werden', + 'session.githubPrPicker.error.repoMustBeGithub': 'Das origin-Remote muss eine GitHub-URL sein', + 'session.githubPrPicker.toast.loadMoreFailed': 'Fehler beim Laden weiterer Pull Requests', + 'session.githubPrPicker.toast.loadDetailsFailed': 'Fehler beim Laden der Pull Request-Details', + 'session.githubPrPicker.title': 'GitHub-Pull Request verknüpfen', + 'session.githubPrPicker.description': 'Wählen Sie einen Pull Request aus, um den Überprüfungs-Kontext zu dieser Nachricht hinzuzufügen.', + 'session.githubPrPicker.searchPlaceholder': 'Suche mit GitHub-Code-Suchsyntax', + 'session.githubPrPicker.includeDiffAria': 'PR-Diff in angehängten Kontext einfügen', + 'session.githubPrPicker.includeDiff': 'PR-Diff einfügen', + 'session.githubPrPicker.empty.noActiveProject': 'Kein aktives Projekt ausgewählt.', + 'session.githubPrPicker.empty.runtimeUnavailable': 'GitHub-Laufzeit-API nicht verfügbar.', + 'session.githubPrPicker.empty.notConnected': 'GitHub nicht verbunden. Verbinden Sie Ihr GitHub-Konto in den Einstellungen.', + 'session.githubPrPicker.empty.noPullRequestsFound': 'Keine Pull Requests gefunden', + 'session.githubPrPicker.empty.noOpenPullRequestsFound': 'Keine offenen Pull Requests gefunden', + 'session.githubPrPicker.loading.pullRequests': 'Pull Requests werden geladen...', + 'session.githubPrPicker.loading.more': 'Wird geladen...', + 'session.githubPrPicker.actions.openSettings': 'Einstellungen öffnen', + 'session.githubPrPicker.actions.usePullRequest': 'Pull Request #{number} verwenden', + 'session.githubPrPicker.actions.openInGitHubAria': 'In GitHub öffnen', + 'session.githubPrPicker.actions.loadMore': 'Mehr laden', + 'session.newWorktree.title': 'Neuer Worktree', + 'session.newWorktree.mode.newBranch': 'Neue Branch', + 'session.newWorktree.mode.existingBranch': 'Vorhandener Branch', + 'session.newWorktree.selectBranch': 'Branch auswählen', + 'session.newWorktree.chooseBranch': 'Einen Branch wählen...', + 'session.newWorktree.fetchBranches': 'Branches abrufen', + 'session.newWorktree.searchBranches': 'Branches durchsuchen...', + 'session.newWorktree.loadingBranches': 'Branches werden geladen...', + 'session.newWorktree.noBranchesFound': 'Keine Branches gefunden', + 'session.newWorktree.matchingBranches': 'Übereinstimmende Branches', + 'session.newWorktree.noMatchingBranches': 'Keine übereinstimmenden Branches', + 'session.newWorktree.localBranches': 'Lokale Branches', + 'session.newWorktree.remoteBranches': 'Remote-Branches', + 'session.newWorktree.otherLocalBranches': 'Andere lokale Branches', + 'session.newWorktree.otherRemoteBranches': 'Andere Remote-Branches', + 'session.newWorktree.branchName': 'Branch-Name', + 'session.newWorktree.branchNamePlaceholder': 'feature/mein-geil-feature', + 'session.newWorktree.actions.change': 'Ändern', + 'session.newWorktree.actions.startFromGitHubIssuePr': 'Starte von GitHub Issue/PR', + 'session.newWorktree.usingPrBranch': 'Verwende PR-Branch: {branch}', + 'session.newWorktree.fromIssue': 'Von Issue #{number}: {title}', + 'session.newWorktree.worktreeDirectory': 'Worktree-Verzeichnis', + 'session.newWorktree.worktreeDirectoryPlaceholder': 'mein-worktree-verzeichnis', + 'session.newWorktree.resetToMatchBranchName': 'Zurücksetzen, um mit Branch-Namen übereinzustimmen', + 'session.newWorktree.sourceBranch': 'Quell-Branch', + 'session.newWorktree.selectSourceBranch': 'Quell-Branch auswählen', + 'session.newWorktree.selectSourceBranchPlaceholder': 'Quell-Branch auswählen...', + 'session.newWorktree.newBranchFromSource': 'Neuer Branch wird erstellt von {source}', + 'session.newWorktree.issueNumber': 'Issue #{number}', + 'session.newWorktree.prNumber': 'PR #{number}', + 'session.newWorktree.includeDiffBadge': '+diff', + 'session.newWorktree.newSessionTitle': 'Neue Sitzung', + 'session.newWorktree.fromSource': 'von {source}', + 'session.newWorktree.actions.cancel': 'Abbrechen', + 'session.newWorktree.actions.creating': 'Erstelle...', + 'session.newWorktree.actions.createWorktree': 'Worktree erstellen', + 'session.newWorktree.actions.reset': 'Zurücksetzen', + 'session.newWorktree.error.noModelSelected': 'Kein Modell ausgewählt', + 'session.newWorktree.error.noActiveProject': 'Kein aktives Projekt', + 'session.newWorktree.error.branchNameRequired': 'Branch-Name ist erforderlich', + 'session.newWorktree.error.worktreeDirectoryRequired': 'Worktree-Verzeichnis ist erforderlich', + 'session.newWorktree.error.sendGitHubContextFailed': 'Fehler beim Senden des GitHub-Kontexts', + 'session.newWorktree.error.createWorktreeFailed': 'Fehler beim Erstellen des Worktrees', + 'session.newWorktree.toast.sessionFromIssue': 'Sitzung aus Problem erstellt', + 'session.newWorktree.toast.sessionFromPr': 'Sitzung aus Pull Request erstellt', + 'session.newWorktree.toast.worktreeCreated': 'Worktree erstellt', + 'session.newWorktree.toast.worktreeCreatedDescription': '{target} - im Hintergrund initialisiert', + 'session.githubIntegration.title': 'Aus GitHub auswählen', + 'session.githubIntegration.tabs.issues': 'Probleme', + 'session.githubIntegration.tabs.pullRequests': 'Pull Requests', + 'session.githubIntegration.connect.title': 'Mit GitHub verbinden', + 'session.githubIntegration.connect.description': 'Verknüpfen Sie Probleme oder Pull Requests, um Worktree-Details automatisch auszufüllen', + 'session.githubIntegration.connect.action': 'GitHub verbinden', + 'session.githubIntegration.search.issuesPlaceholder': 'Suche mit GitHub-Code-Suchsyntax', + 'session.githubIntegration.search.prsPlaceholder': 'Suche mit GitHub-Code-Suchsyntax', + 'session.githubIntegration.empty.noIssuesFound': 'Keine Probleme gefunden', + 'session.githubIntegration.empty.noPullRequestsFound': 'Keine Pull Requests gefunden', + 'session.githubIntegration.actions.loadMore': 'Mehr laden', + 'session.githubIntegration.actions.cancel': 'Abbrechen', + 'session.githubIntegration.actions.select': 'Auswählen', + 'session.githubIntegration.selected.issueNumber': 'Problem #{number}', + 'session.githubIntegration.selected.prNumber': 'PR #{number}', + 'session.githubIntegration.includeDiffAria': 'PR-Diff in Sitzungskontext einbeziehen', + 'session.githubIntegration.includeDiff': 'PR-Diff einbeziehen', + 'session.githubIntegration.error.notConnected': 'GitHub nicht verbunden', + 'session.githubIntegration.error.loadDataFailed': 'Fehler beim Laden der Daten', + 'session.githubIntegration.validation.branchAlreadyCheckedOut': 'Branch ist bereits in einem Worktree ausgecheckt', + 'session.githubIntegration.validation.branchAlreadyExists': 'Branch existiert bereits lokal', + 'session.githubIntegration.validation.failed': 'Validierung fehlgeschlagen', + 'chat.fileAttachment.toast.attachFailed': 'Fehler beim Anhängen der Datei', + 'chat.fileAttachment.toast.someFilesSkipped': 'Einige Dateien wurden übersprungen:\n{summary}', + 'chat.fileAttachment.toast.vscodePickFailed': 'Fehler beim Auswählen von Dateien in VS Code', + 'chat.fileAttachment.fileFallback': 'Datei', + 'chat.fileAttachment.skippedFallback': 'übersprungen', + 'chat.fileAttachment.actions.attachAria': 'Dateien anhängen', + 'chat.fileAttachment.actions.attach': 'Dateien anhängen', + 'chat.fileAttachment.actions.removeNamed': '{name} entfernen', + 'chat.fileAttachment.actions.removeImage': 'Bild entfernen', + 'chat.fileAttachment.activeEditor.addFile': 'Datei:{name} zum Kontext hinzufügen', + 'chat.fileAttachment.activeEditor.pinSelection': 'Auswahl zum Kontext hinzufügen', + 'chat.fileAttachment.activeEditor.remove': 'Aus Kontext entfernen', + 'chat.fileAttachment.openInDiagram': 'In Diagrammansicht öffnen', + 'chat.pendingChanges.fileCountSingle': '{count} Datei', + 'chat.pendingChanges.fileCountPlural': '{count} Dateien', + 'chat.pendingChanges.changedInWorkspace': 'im Workspace geändert', + 'chat.changedFiles.title': 'Geänderte Dateien', + 'chat.changedFiles.actions.openFileTitle': '{path} öffnen', + 'chat.emptyState.opencodeUnreachable': 'OpenCode ist nicht erreichbar', + 'chat.emptyState.startNewChat': 'Neuen Chat starten', + 'chat.emptyState.draftTitle': 'Worüber arbeiten wir?', + 'chat.emptyState.draftTitleWithProject': 'Worüber arbeiten wir in {project}?', + 'chat.draftPresets.explore.label': 'Codebase erkunden', + 'chat.draftPresets.catchup.label': 'Aktuellstand', + 'chat.draftPresets.weigh.label': 'Meine Optionen bewerten', + 'chat.draftPresets.plan.label': 'Feature-Planung starten', + 'chat.draftPresets.craftGoal.label': 'Ein Ziel formulieren', + 'chat.draftPresets.debug.label': 'Ein Problem debuggen', + 'chat.draftPresets.review.label': 'Meine Änderungen überprüfen', + 'chat.draftStarters.add': 'Einen Starter hinzufügen', + 'chat.draftStarters.searchPlaceholder': 'Befehle und Fähigkeiten durchsuchen…', + 'chat.draftStarters.empty': 'Nichts zum Hinzufügen', + 'chat.draftStarters.sectionBuiltIn': 'Integriert', + 'chat.draftStarters.sectionCommands': 'Befehle', + 'chat.draftStarters.sectionSkills': 'Fähigkeiten', + 'chat.draftStarters.remove': 'Entfernen', + 'chat.scrollToBottom.aria': 'Zum Ende scrollen', + 'chat.promptNavigator.aria': 'Prompt-Navigation', + 'chat.promptNavigator.currentPrompt': 'Aktueller Prompt', + 'chat.promptNavigator.loadMore': 'Weitere Prompts laden', + 'chat.timeline.relative.justNow': 'gerade jetzt', + 'chat.timeline.relative.minutesAgo': '{count}m her', + 'chat.timeline.relative.hoursAgo': '{count}h her', + 'chat.timeline.relative.daysAgo': '{count}d her', + 'chat.timeline.title': 'Konversations-Zeitleiste', + 'chat.timeline.description': 'Navigieren Sie zu einem beliebigen Punkt in der Konversation oder erstellen Sie eine neue Sitzung', + 'chat.timeline.searchPlaceholder': 'Nachrichten durchsuchen...', + 'chat.timeline.empty.search': 'Keine Nachrichten gefunden', + 'chat.timeline.empty.session': 'Noch keine Nachrichten in dieser Sitzung', + 'chat.timeline.noTextContent': '[Kein Textinhalt]', + 'chat.timeline.actions.title': 'Aktionen', + 'chat.timeline.actions.revertFromHere': 'Hierher zurücksetzen', + 'chat.timeline.actions.forkFromHere': 'Hier abzweigen', + 'chat.timeline.actions.previousTurn': 'Vorheriger Zug', + 'chat.timeline.actions.latest': 'Neueste', + 'chat.timeline.help.clickMessage': 'Klicken Sie auf eine Nachricht, um zur entsprechenden Stelle in der Konversation zu scrollen', + 'chat.timeline.help.undoToPoint': 'Zu diesem Punkt rückgängig machen (Nachrichtentext wird in das Eingabefeld übernommen)', + 'chat.timeline.help.createSessionFromHere': 'Neue Sitzung ab hier starten', + 'chat.statusRow.todo.status.inProgress': 'In Bearbeitung', + 'chat.statusRow.todo.status.pending': 'Ausstehend', + 'chat.statusRow.todo.status.completed': 'Abgeschlossen', + 'chat.statusRow.todo.status.cancelled': 'Abgebrochen', + 'chat.statusRow.todo.priority.high': 'Hohe Priorität', + 'chat.statusRow.todo.priority.medium': 'Mittlere Priorität', + 'chat.statusRow.todo.priority.low': 'Niedrige Priorität', + 'chat.statusRow.actions.stopGeneratingAria': 'Generierung stoppen', + 'chat.statusRow.tasksTitle': 'Aufgaben', + 'chat.statusRow.summary.activeLeft': '{active} aktiv · {left} übrig', + 'chat.statusRow.aborted': 'Abgebrochen', + 'chat.revertIndicator.redo': 'Wiederholen', + 'chat.revertIndicator.redoAria': 'Wiederholen — wiederhergestellte Nachrichten', + 'chat.revertPopover.title': 'Zurückgesetzt', + 'chat.revertPopover.noTextContent': 'Kein Textinhalt', + 'chat.revertPopover.forkFromHere': 'Hier forken', + 'chat.revertPopover.forkFromMessage': 'Von dieser Nachricht forken', + 'chat.revertPopover.restoreAll': 'Alle wiederherstellen', + 'chat.revertPopover.restore': 'Wiederherstellen', + 'chat.revertPopover.revert': 'Zurücksetzen', + 'chat.revertPopover.fork': 'Fork', + 'chat.revert.toast.undo': 'Zurückgesetzt auf {preview}', + 'chat.revert.toast.redo': 'Wiederholt', + 'chat.revert.toast.restored': 'Alle Nachrichten wiederhergestellt', + 'chat.errorBoundary.title': 'Chat-Fehler', + 'chat.errorBoundary.description': 'Die Chat-Oberfläche hat einen Fehler festgestellt. Dies könnte auf ein vorübergehendes Netzwerkproblem oder beschädigte Nachrichtendaten zurückzuführen sein.', + 'chat.errorBoundary.sessionLabel': 'Sitzung', + 'chat.errorBoundary.detailsSummary': 'Fehlerdetails', + 'chat.errorBoundary.resetAction': 'Chat zurücksetzen', + 'chat.errorBoundary.persistentHint': 'Wenn das Problem weiterhin besteht, versuchen Sie, die Seite neu zu laden.', + 'chat.autocomplete.tabs.commands': 'Befehle', + 'chat.autocomplete.tabs.agents': 'Agenten', + 'chat.autocomplete.tabs.files': 'Dateien', + 'chat.autocomplete.keyboardHint': '↑↓ navigieren • Enter auswählen • Esc schließen', + 'chat.commandAutocomplete.command.initDescription': 'AGENTS.md-Datei erstellen/aktualisieren', + 'chat.commandAutocomplete.command.undoDescription': 'Letzte Nachricht rückgängig machen', + 'chat.commandAutocomplete.command.redoDescription': 'Zuvor rückgängig gemachte Nachrichten erneut ausführen', + 'chat.commandAutocomplete.command.timelineDescription': 'Konversations-Zeitleiste öffnen', + 'chat.commandAutocomplete.command.compactDescription': 'Sitzungsverlauf mit KI komprimieren, um die Kontextgröße zu reduzieren', + 'chat.commandAutocomplete.command.summaryDescription': 'Nicht-destructive Zusammenfassung der Sitzung. Optionaler Themenhinweis nach dem Befehl.', + 'chat.commandAutocomplete.command.workspaceReviewDescription': 'Überprüfung des Arbeitsbereichs-Unterschieds hinsichtlich Absicht, Richtigkeit und Angemessenheit, bewertet nach Schweregrad.', + 'chat.commandAutocomplete.command.handoffReviewDescription': 'Erstellen oder Wiederverwenden einer separaten Überprüfungssitzung aus einem generierten Handoff.', + 'chat.commandAutocomplete.command.featurePlanDescription': 'Starte eine geführte, hin und her gehende Planungssitzung für eine neue Funktion.', + 'chat.commandAutocomplete.command.craftGoalDescription': 'Verwandelt eine Idee oder Aufgabe in ein klares, überprüfbares Ziel.', + 'chat.chatInput.toast.craftGoalFailed': 'Fehler beim Starten der Ziel-Erstellung', + 'chat.commandAutocomplete.command.catchUpDescription': 'Kontext wiederherstellen: Was du getan hast und wo du weitermachen sollst.', + 'chat.commandAutocomplete.command.debugDescription': 'Geführte Ursachenforschung für einen Fehler, bevor eine Lösung vorgeschlagen wird.', + 'chat.commandAutocomplete.command.weighDescription': 'Zwei bis drei Ansätze mit Kompromissen und einer Empfehlung bewerten, bevor du dich entscheidest.', + 'chat.commandAutocomplete.command.exploreDescription': 'Vertraut machen mit diesem Codebase: Eine Übersicht über die Architektur und Hauptbestandteile.', + 'chat.commandAutocomplete.badge.skill': 'Fähigkeit', + 'chat.commandAutocomplete.badge.command': 'Befehl', + 'chat.commandAutocomplete.badge.system': 'System', + 'chat.commandAutocomplete.empty': 'Keine Befehle gefunden', + 'chat.agentMentionAutocomplete.badge.system': 'System', + 'chat.agentMentionAutocomplete.empty': 'Keine Agenten gefunden', + 'chat.fileMentionAutocomplete.searchMoreAgents': 'Tippe, um mehr Agenten zu suchen', + 'chat.fileMentionAutocomplete.empty': 'Keine Übereinstimmungen gefunden', + 'chat.queuedMessage.attachments': '+{count} Datei(en)', + 'chat.queuedMessage.empty': '(leer)', + 'chat.queuedMessage.title': 'Nachrichten in der Warteschlange', + 'chat.queuedMessage.edit': 'bearbeiten', + 'chat.queuedMessage.send': 'senden', + 'chat.queuedMessage.removeAria': 'Aus der Warteschlange entfernen', + 'chat.queuedMessage.reorderAria': 'Ziehen, um neu anzuordnen', + 'chat.container.returnToParent.aria': 'Zurück zur übergeordneten Sitzung', + 'chat.container.returnToParent.titleNamed': 'Zurück zu: {title}', + 'chat.container.returnToParent.title': 'Zurück zur übergeordneten Sitzung', + 'chat.container.returnToParent.label': 'Übergeordnet', + 'chat.container.readOnlySubagentPromptBanner': 'Subagent-Sitzungen können nicht abgefragt werden.', + 'chat.unifiedControls.title': 'Steuerung', + 'chat.unifiedControls.model.title': 'Modell', + 'chat.unifiedControls.model.noRecent': 'Keine kürzlichen Modelle', + 'chat.unifiedControls.model.moreAria': 'Weitere Modelle', + 'chat.unifiedControls.effort.title': 'Aufwand', + 'chat.unifiedControls.effort.moreAria': 'Weitere Aufwandsoptionen', + 'chat.questionCard.summaryTab': 'Zusammenfassung', + 'chat.questionCard.noAnswer': '(keine Antwort)', + 'chat.questionCard.inputNeeded': 'Eingabe erforderlich', + 'chat.questionCard.fromSubagent': 'Von Subagent', + 'chat.questionCard.questionFallback': 'Frage {index}', + 'chat.questionCard.selectMultiple': 'Mehrere auswählen', + 'chat.questionCard.recommended': 'empfohlen', + 'chat.questionCard.other': 'Andere…', + 'chat.questionCard.yourAnswer': 'Ihre Antwort', + 'chat.questionCard.submit': 'Senden', + 'chat.questionCard.next': 'Weiter', + 'chat.questionCard.dismiss': 'Verwerfen', + 'chat.questionCard.copyMarkdown': 'Als Markdown kopieren', + 'chat.questionCard.copyJson': 'Als JSON kopieren', + 'chat.questionCard.copiedMarkdown': 'Frage als Markdown kopiert', + 'chat.questionCard.copiedJson': 'Frage als JSON kopiert', + 'chat.questionCard.copyFailed': 'Fehler beim Kopieren der Frage', + 'chat.questionCard.submitFailed': 'Fehler beim Senden der Antwort', + 'chat.questionCard.dismissFailed': 'Fehler beim Verwerfen der Frage', + 'chat.questionCard.noLongerPending': 'Diese Frage wartet nicht mehr auf eine Antwort.', + 'chat.questionCard.tryAgain': 'Bitte versuchen Sie es in einem Moment erneut.', + 'chat.textSelection.toast.noProject': 'Kein Projekt für diese Sitzung gefunden', + 'chat.textSelection.toast.addToNotesFailed': 'Fehler beim Hinzufügen zu Notizen', + 'chat.textSelection.toast.addToNotesSuccess': 'Ausgewählter Text zu Notizen hinzugefügt', + 'chat.textSelection.toast.addToNotesSummaryFailed': 'Zusammenfassung der Auswahl nicht möglich, ausgewählter Text wurde zu Notizen hinzugefügt', + 'chat.textSelection.actions.addToChat': 'Zum Chat hinzufügen', + 'chat.textSelection.actions.newSession': 'Neue Sitzung', + 'chat.textSelection.actions.copy': 'Kopieren', + 'chat.textSelection.actions.addToNotes': 'Zu Notizen hinzufügen', + 'chat.textSelection.title.addToCurrentChat': 'Zum aktuellen Chat hinzufügen', + 'chat.textSelection.title.newSessionWithSelection': 'Neue Sitzung mit Auswahl erstellen', + 'chat.textSelection.title.saveInsightToNotes': 'Ausgewählten Text zu Notizen speichern', + 'chat.messageBody.actions.revertAria': 'Zu dieser Nachricht zurückkehren', + 'chat.messageBody.actions.revert': 'Von hier zurückkehren', + 'chat.messageBody.actions.forkAria': 'Abzweigen von dieser Nachricht', + 'chat.messageBody.actions.fork': 'Abzweigen von hier', + 'chat.messageBody.actions.copyMessageAria': 'Nachrichtentext kopieren', + 'chat.messageBody.actions.copyMessage': 'Nachricht kopieren', + 'chat.messageBody.actions.openPreviewAria': 'Vorschau öffnen', + 'chat.messageBody.actions.openPreview': 'Vorschau öffnen', + 'chat.messageBody.actions.copyAnswer': 'Antwort kopieren', + 'chat.messageBody.actions.savingImage': 'Bild wird gespeichert...', + 'chat.messageBody.actions.saveAsImage': 'Als Bild speichern', + 'chat.messageBody.actions.saveAsPlan': 'Als Plan speichern', + 'chat.messageBody.actions.startNewSession': 'Neue Sitzung von dieser Antwort starten', + 'chat.messageBody.actions.startNewMultiRun': 'Neuer Multi-Run von dieser Antwort starten', + 'chat.messageBody.forkDialog.instructions.label': 'Anweisungen', + 'chat.messageBody.forkDialog.instructions.placeholder': 'Fügen Sie Anweisungen für die neue Sitzung hinzu…', + 'chat.messageBody.forkDialog.createWorktree': 'Worktree erstellen', + 'chat.generatedResult.actions.copy': 'Kopieren', + 'chat.generatedResult.actions.copied': 'Kopiert', + 'chat.generatedResult.commit.title': 'Generierte Commit-Nachricht', + 'chat.generatedResult.commit.highlights': 'Highlights', + 'chat.generatedResult.pullRequest.title': 'Generierter Pull Request', + 'chat.generatedResult.pullRequest.titleLabel': 'Titel', + 'chat.generatedResult.pullRequest.bodyLabel': 'Inhalt', + 'chat.messageBody.tts.stopSpeaking': 'Sprache stoppen', + 'chat.messageBody.tts.readAloud': 'Vorlesen', + 'chat.messageBody.tts.readAloudWithProvider': 'Vorlesen ({provider} Stimme)', + 'planView.tts.readAloud': 'Plan vorlesen', + 'planView.tts.stopSpeaking': 'Sprache stoppen', + 'filesView.tts.readAloud': 'Datei vorlesen', + 'filesView.tts.stopSpeaking': 'Sprache stoppen', + 'chat.messageBody.toast.noProject': 'Kein Projekt für diese Sitzung gefunden', + 'chat.messageBody.toast.savePlanFailed': 'Fehler beim Speichern des Plans', + 'chat.messageBody.toast.planSaved': 'Plan gespeichert', + 'chat.messageBody.toast.imageSaved': 'Bild gespeichert', + 'chat.messageBody.toast.generateImageFailed': 'Fehler bei der Bildgenerierung', + 'chat.chatInput.actions.commands': 'Befehle', + 'chat.chatInput.actions.attachFiles': 'Dateien anhängen', + 'chat.chatInput.actions.addAttachment': 'Anhang hinzufügen', + 'chat.chatInput.actions.linkGithubIssue': 'GitHub-Issue verknüpfen', + 'chat.chatInput.actions.linkGithubPr': 'GitHub-PR verknüpfen', + 'chat.chatInput.actions.modelAgentSettings': 'Modell- und Agenteneinstellungen', + 'chat.chatInput.actions.sendMessageAria': 'Nachricht senden', + 'chat.chatInput.actions.queueMessageAria': 'Nachricht in die Warteschlange stellen', + 'chat.chatInput.actions.stopGeneratingAria': 'Generierung stoppen', + 'chat.chatInput.focusMode.toggleAria': 'Fokusmodus umschalten', + 'chat.chatInput.focusMode.label': 'Fokusmodus', + 'chat.chatInput.permissionAutoAccept.disable': 'Automatische Zustimmung für Berechtigungen deaktivieren', + 'chat.chatInput.permissionAutoAccept.enable': 'Automatische Zustimmung für Berechtigungen aktivieren', + 'chat.chatInput.permissionAutoAccept.on': 'Automatische Zustimmung für Berechtigungen: an', + 'chat.chatInput.permissionAutoAccept.off': 'Automatische Zustimmung für Berechtigungen: aus', + 'chat.chatInput.linked.byAuthor': 'von {author}', + 'chat.chatInput.linked.issue.openInBrowserAria': 'Issue im Browser öffnen', + 'chat.chatInput.linked.issue.removeAria': 'Verknüpftes Issue entfernen', + 'chat.chatInput.linked.pr.number': 'PR #{number}', + 'chat.chatInput.linked.pr.openInBrowserAria': 'Pull Request im Browser öffnen', + 'chat.chatInput.linked.pr.removeAria': 'Verknüpften Pull Request entfernen', + 'chat.chatInput.placeholder.shell': 'Shell-Befehl eingeben...', + 'chat.chatInput.placeholder.chat': '@ für Dateien/Agenten; / für Befehle und Fähigkeiten; ! für Shell; # für Snippets', + 'chat.chatInput.placeholder.chatCompact': 'Verwende @ / ! # für Hilfsmittel', + 'chat.chatInput.placeholder.selectSession': 'Sitzung auswählen oder erstellen, um zu chatten', + 'chat.dictation.start': 'Dictation starten', + 'chat.dictation.overlayAria': 'Dictation', + 'chat.dictation.downloadingModel': 'Sprachmodell wird heruntergeladen...', + 'chat.dictation.downloadingModelProgress': 'Sprachmodell wird heruntergeladen... {percent}%', + 'chat.dictation.listening': 'Hören...', + 'chat.dictation.processing': 'Transkribieren...', + 'chat.dictation.failed': 'Transkription fehlgeschlagen', + 'chat.dictation.cancel': 'Dictation verwerfen', + 'chat.dictation.insert': 'Transkript einfügen', + 'chat.dictation.insertAndSend': 'Einfügen und senden', + 'chat.dictation.retry': 'Transkription erneut versuchen', + 'chat.dictation.discard': 'Aufnahme verwerfen', + 'chat.snippetAutocomplete.action.addNew': '+ Neues Snippet hinzufügen', + 'chat.snippetAutocomplete.empty': 'Keine Snippets gefunden', + 'chat.snippetAutocomplete.footer': '↑↓ navigieren • Enter auswählen • Esc schließen', + 'snippets.source.global': 'global', + 'snippets.source.project': 'Projekt', + 'chat.chatInput.toast.compactFailed': 'Fehler beim Komprimieren der Sitzung', + 'chat.chatInput.toast.summaryFailed': 'Fehler bei der Erstellung der Zusammenfassung', + 'chat.messageBody.actions.sendReviewFeedback': 'Feedback zur Überprüfung an den implementierenden Agenten senden', + 'chat.messageBody.actions.sendImplementationResponse': 'Implementierungsantwort an den überprüfenden Agenten senden', + 'chat.chatInput.toast.reviewFailed': 'Fehler bei der Überprüfung der Änderungen', + 'chat.chatInput.toast.planFeatureFailed': 'Fehler beim Starten der Funktionsplanung', + 'chat.chatInput.toast.catchUpFailed': 'Fehler beim Aufholen', + 'chat.chatInput.toast.debugFailed': 'Fehler beim Starten der Debugging', + 'chat.chatInput.toast.weighFailed': 'Fehler beim Vergleichen der Optionen', + 'chat.chatInput.toast.exploreFailed': 'Fehler beim Starten der Tour', + 'chat.chatInput.toast.attachmentsTooLarge': 'Anhänge sind zu groß zum Senden. Bitte versuche, die Anzahl oder Größe der Bilder zu reduzieren.', + 'chat.chatInput.toast.sendAttachmentsFailed': 'Fehler beim Senden der Anhänge. Versuche weniger Dateien oder kleinere Bilder.', + 'chat.chatInput.toast.messageSendFailed': 'Nachricht konnte nicht gesendet werden. Anhänge wurden wiederhergestellt.', + 'chat.chatInput.toast.clipboardAttachFailed': 'Fehler beim Anhängen des Bildes aus der Zwischenablage', + 'chat.chatInput.toast.addedFileMentions': '{count} Datei(er) hinzugefügt', + 'chat.chatInput.toast.attachFileFailed': 'Fehler beim Anhängen der Datei', + 'chat.chatInput.toast.attachNamedFailed': 'Fehler beim Anhängen von {name}', + 'chat.chatInput.toast.someFilesSkipped': 'Einige Dateien wurden übersprungen:\n{summary}', + 'chat.chatInput.toast.vscodePickFailed': 'Fehler beim Auswählen der Dateien in VS Code', + 'chat.chatInput.toast.openSessionFirst': 'Öffne zuerst eine Sitzung', + 'chat.chatInput.toast.togglePermissionAutoAcceptFailed': 'Fehler beim Umschalten der automatischen Zustimmung zur Berechtigung', + 'chat.chatInput.reviewComments': 'Kommentare zur Überprüfung:', + 'chat.chatInput.reviewCommentsRemove': 'Kommentare zur Überprüfung entfernen', + 'chat.chatInput.devServerLogs': 'Entwicklungsserver-Protokolle:', + 'chat.chatInput.devServerLogsRemove': 'Entwicklungsserver-Protokolle entfernen', + 'chat.chatInput.previewAnnotations': 'Vorschau-Anmerkungen:', + 'chat.chatInput.previewContext': 'Vorschau-Kontext:', + 'chat.chatInput.previewContextRemove': 'Vorschau-Kontext entfernen', + 'chat.chatInput.projectRoot': 'Projektstamm', + 'chat.chatInput.branch': 'Zweig', + 'chat.chatInput.draftPicker.projectTitle': 'Projekt', + 'chat.chatInput.draftPicker.searchProjects': 'Projekte durchsuchen...', + 'chat.chatInput.draftPicker.searchBranches': 'Branches durchsuchen...', + 'chat.chatInput.worktrees': 'Worktrees', + 'chat.chatInput.worktreeNew': '+ Neu', + 'chat.chatInput.drop.insertMention': 'Hier ablegen, um als Erwähnung einzufügen', + 'chat.chatInput.drop.attachFiles': 'Dateien hier ablegen, um sie anzuhängen', + 'chat.chatInput.fileFallback': 'Datei', + 'chat.toolOutputDialog.image.previousAria': 'Vorheriges Bild', + 'chat.toolOutputDialog.image.nextAria': 'Nächstes Bild', + 'chat.toolOutputDialog.image.closeAria': 'Bildvorschau schließen', + 'chat.toolOutputDialog.mermaid.missingSource': 'Fehlende Mermaid-Quell-URL.', + 'chat.toolOutputDialog.mermaid.loadFailed': 'Kann Mermaid-Diagramm nicht laden.', + 'chat.toolOutputDialog.mermaid.dataUrlMalformed': 'Die Mermaid-Daten-URL ist fehlerhaft formatiert.', + 'chat.toolOutputDialog.mermaid.invalidLocalPath': 'Der lokale Mermaid-Dateipfad ist ungültig.', + 'chat.toolOutputDialog.mermaid.readFileFailedWithStatus': 'Kann Mermaid-Datei nicht lesen. Status: {status}.', + 'chat.toolOutputDialog.mermaid.unsupportedUrlProtocol': 'Das Mermaid-URL-Protokoll wird nicht unterstützt.', + 'chat.toolOutputDialog.mermaid.loadFailedWithStatus': 'Kann Mermaid-Diagramm nicht laden. Status: {status}.', + 'chat.toolOutputDialog.mermaid.closeAria': 'Diagrammvorschau schließen', + 'chat.toolOutputDialog.mermaid.loading': 'Diagramm wird geladen...', + 'chat.toolOutputDialog.mermaid.renderFailed': 'Kann Mermaid-Diagramm nicht rendern.', + 'chat.toolOutputDialog.mermaid.retry': 'Wiederholen', + 'chat.toolOutputDialog.commandCompleted': 'Befehl erfolgreich abgeschlossen', + 'chat.toolOutputDialog.noOutputProduced': 'Keine Ausgabe erzeugt', + 'chat.toolPart.lspErrors': 'LSP-Fehler', + 'chat.toolPart.moreErrors': '+{count} weitere Fehler', + 'chat.toolPart.error': 'Fehler:', + 'chat.toolPart.awaitingResponse': 'Warte auf Antwort...', + 'chat.toolPart.noOutputProduced': 'Keine Ausgabe erzeugt', + 'chat.toolPart.output': 'Ausgabe', + 'chat.toolPart.showRawJson': 'Rohe JSON anzeigen', + 'chat.toolPart.showFormattedJson': 'Formatierte JSON anzeigen', + 'chat.toolPart.showNavigableJson': 'Navigierbare JSON anzeigen', + 'chat.toolPart.openFileAtFirstChange': 'Datei bei erster Änderung öffnen', + 'chat.toolPart.openFileDiff': 'Datei-Unterschied öffnen', + 'chat.toolPart.copyOutput': 'Ausgabe kopieren', + 'chat.toolPart.copiedOutput': 'Ausgabe kopiert', + 'chat.toolPart.copyOutputFailed': 'Kopieren der Ausgabe fehlgeschlagen', + 'chat.toolPart.openSubtask': '{type}-Unteraufgabe öffnen', + 'chat.todo.total': 'Gesamt', + 'chat.todo.inProgress': 'In Bearbeitung', + 'chat.todo.pending': 'Ausstehend', + 'chat.todo.completed': 'Abgeschlossen', + 'chat.todo.cancelled': 'Abgebrochen', + 'chat.permissionCard.workingDirectory': 'Arbeitsverzeichnis:', + 'chat.permissionCard.timeout': 'Timeout:', + 'chat.permissionCard.request': 'Anfrage:', + 'chat.permissionCard.headers': 'Headers:', + 'chat.permissionCard.body': 'Body:', + 'chat.permissionCard.action': 'Aktion:', + 'chat.permissionCard.details': 'Details:', + 'chat.permissionCard.patterns': 'Muster:', + 'chat.permissionToast.sessionFallback': 'Sitzung', + 'chat.permissionToast.permissionFallback': 'Berechtigungsdetails nicht verfügbar', + 'chat.permissionToast.labels.session': 'Sitzung:', + 'chat.permissionToast.labels.permission': 'Berechtigung:', + 'chat.permissionToast.actions.once': 'Einmal', + 'chat.permissionToast.actions.always': 'Immer', + 'chat.permissionToast.actions.deny': 'Ablehnen', + 'chat.permissionToast.actions.approveOnceAria': 'Einmal genehmigen', + 'chat.permissionToast.actions.approveOnceAriaWithSession': 'Einmal für {session} genehmigen', + 'chat.permissionToast.actions.approveAlwaysAria': 'Immer genehmigen', + 'chat.permissionToast.actions.approveAlwaysAriaWithSession': 'Immer für {session} genehmigen', + 'chat.permissionToast.actions.denyAria': 'Berechtigung ablehnen', + 'chat.permissionToast.actions.denyAriaWithSession': 'Berechtigung für {session} ablehnen', + 'chat.permissionRequest.required': 'Berechtigung erforderlich:', + 'chat.permissionRequest.actions.once': 'Einmal', + 'chat.permissionRequest.actions.always': 'Immer', + 'chat.permissionRequest.actions.reject': 'Ablehnen', + 'chat.modelControls.provider': 'Anbieter', + 'chat.modelControls.capability.toolCalling': 'Tool-Aufruf', + 'chat.modelControls.capability.reasoning': 'Reasoning', + 'chat.modelControls.modality.text': 'Text', + 'chat.modelControls.modality.image': 'Bild', + 'chat.modelControls.modality.video': 'Video', + 'chat.modelControls.modality.audio': 'Audio', + 'chat.modelControls.modality.pdf': 'PDF', + 'chat.modelControls.capabilities': 'Fähigkeiten', + 'chat.modelControls.modalities': 'Modalitäten', + 'chat.modelControls.input': 'Eingabe', + 'chat.modelControls.output': 'Ausgabe', + 'chat.modelControls.limits': 'Grenzen', + 'chat.modelControls.context': 'Kontext', + 'chat.modelControls.metadata': 'Metadaten', + 'chat.modelControls.knowledge': 'Wissen', + 'chat.modelControls.release': 'Veröffentlichung', + 'chat.modelControls.mode': 'Modus', + 'chat.modelControls.model': 'Modell', + 'chat.modelControls.temperature': 'Temperatur', + 'chat.modelControls.topP': 'Top P', + 'chat.modelControls.permissions': 'Berechtigungen', + 'chat.modelControls.edit': 'Bearbeiten', + 'chat.modelControls.bash': 'Bash', + 'chat.modelControls.webFetch': 'WebFetch', + 'chat.modelControls.customPrompt': 'Benutzerdefinierte Eingabeaufforderung', + 'chat.modelControls.selectModel': 'Modell auswählen', + 'chat.modelControls.searchProvidersOrModels': 'Anbieter oder Modelle suchen', + 'chat.modelControls.clearSearch': 'Suche löschen', + 'chat.modelControls.current': 'Aktuell', + 'chat.modelControls.thinking': 'Denken', + 'chat.modelControls.default': 'Standard', + 'chat.modelControls.selectAgent': 'Agent auswählen', + 'chat.modelControls.costPerMillion': 'Kosten ($/1M Tokens)', + 'chat.modelControls.metadataUnavailable': 'Modell-Metadaten nicht verfügbar.', + 'chat.modelControls.addNewProvider': 'Neuen Anbieter hinzufügen', + 'chat.modelControls.noAgentSelected': 'Kein Agent ausgewählt.', + 'chat.modelControls.resetToDefault': 'Auf Standard zurücksetzen', + 'chat.modelControls.searchModels': 'Modelle suchen', + 'chat.modelControls.searchAgents': 'Agenten suchen', + 'chat.modelControls.noModelsFound': 'Keine Modelle gefunden', + 'chat.modelControls.favorites': 'Favoriten', + 'chat.modelControls.recent': 'Kürzlich', + 'chat.modelControls.addToFavorites': 'Zu Favoriten hinzufügen', + 'chat.modelControls.removeFromFavorites': 'Aus Favoriten entfernen', + 'chat.modelControls.favoriteAria': 'Favorit', + 'chat.modelControls.unfavoriteAria': 'Nicht favorit', + 'chat.modelControls.collapseProvider': 'Anbieter einklappen', + 'chat.modelControls.expandProvider': 'Anbieter ausklappen', + 'chat.modelControls.keyboardHint': '↑↓ navigieren{thinking} • Enter auswählen • Esc schließen', + 'chat.modelControls.keyboardHintNavigate': '↑↓ navigieren', + 'chat.modelControls.keyboardHintSwitchAgent': '{shortcut} Agent wechseln', + 'chat.modelControls.keyboardHintThinking': '←→ denken', + 'chat.modelControls.showThinkingModes': 'Denkmodi anzeigen', + 'chat.modelControls.hideThinkingModes': 'Denkmodi ausblenden', + 'chat.modelControls.moreThinkingModes': 'Weitere Denkmodi', + 'chat.modelControls.noProvidersOrModelsFound': 'Keine Anbieter oder Modelle entsprechen Ihrer Suche.', + 'chat.modelControls.reorderFavoriteAria': 'Favorit neu anordnen', + 'chat.modelControls.reorderFavoriteTitle': 'Ziehen, um Favorit neu anzuordnen', + 'chat.modelControls.reorderProviderTitle': 'Ziehen, um Anbieter neu anzuordnen', + 'chat.modelControls.permissionLabel.custom': 'Benutzerdefiniert', + 'chat.modelControls.permissionLabel.allow': 'Erlauben', + 'chat.modelControls.permissionLabel.deny': 'Ablehnen', + 'chat.modelControls.permissionLabel.ask': 'Fragen', + 'chat.modelControls.modeValue.primary': 'Primär', + 'chat.modelControls.modeValue.subagent': 'Unteragent', + 'chat.modelControls.modeValue.all': 'Alle', + 'chat.modelControls.modeValue.none': '—', + 'chat.reasoningTrace.thinking': 'Denken', + 'chat.reasoningTrace.justification': 'Begründung', + 'chat.reasoningTrace.expandAria': 'Begründungstrace erweitern', + 'chat.reasoningTrace.collapseAria': 'Begründungstrace reduzieren', + 'chat.reasoningTrace.thought': 'Gedanke', + 'chat.messageBody.subtask.title': 'Delegierte Aufgabe', + 'chat.messageBody.subtask.hidePrompt': 'Eingabe ausblenden', + 'chat.messageBody.subtask.showPrompt': 'Eingabe anzeigen', + 'chat.messageBody.subtask.openSession': 'Unteraufgaben-Sitzung öffnen', + 'chat.messageBody.shellCommand.title': 'Shell-Befehl', + 'chat.messageBody.shellCommand.hideOutput': 'Ausgabe ausblenden', + 'chat.messageBody.shellCommand.showOutput': 'Ausgabe anzeigen', + 'chat.messageBody.shellCommand.copied': 'Kopiert', + 'chat.messageBody.shellCommand.copyOutput': 'Ausgabe kopieren', + 'commandPalette.title': 'Befehlspalette', + 'commandPalette.description': 'Dateien, Sitzungen und Befehle durchsuchen.', + 'commandPalette.input.placeholder': 'Dateien, Sitzungen, Befehle durchsuchen...', + 'commandPalette.empty.noResults': 'Keine Ergebnisse gefunden.', + 'commandPalette.empty.searchingFiles': 'Dateien werden durchsucht...', + 'commandPalette.item.newSession': 'Neue Sitzung', + 'commandPalette.item.newMiniChat': 'Neues Mini-Chat-Fenster', + 'commandPalette.item.newWorktreeDraft': 'Neuer Worktree-Entwurf', + 'commandPalette.item.addProject': 'Projekt hinzufügen', + 'commandPalette.item.showSessionSwitcher': 'Sitzungsumschalter anzeigen', + 'commandPalette.item.toggleSidebar': 'Seitenleiste umschalten', + 'commandPalette.item.showContextUsage': 'Kontextnutzung anzeigen', + 'commandPalette.item.toggleTerminal': 'Terminal umschalten', + 'commandPalette.item.openSettings': 'Einstellungen öffnen...', + 'commandPalette.session.untitled': 'Unbenannte Sitzung', + 'openCodeStatusDialog.title': 'OpenCode-Status', + 'openCodeStatusDialog.description': 'Aktuellen OpenCode-Status und Diagnoseergebnisse prüfen.', + 'openCodeStatusDialog.actions.copy': 'Kopieren', + 'openCodeStatusDialog.empty.noData': 'Keine Daten.', + 'openCodeStatusDialog.toast.copiedTitle': 'Kopiert', + 'openCodeStatusDialog.toast.copiedDescription': 'Status in die Zwischenablage kopiert', + 'openCodeStatusDialog.toast.copyFailed': 'Fehler beim Kopieren des Status', + 'saveProjectPlanDialog.title': 'Projektplan speichern', + 'saveProjectPlanDialog.description': 'Diesen Plan als Markdown-Datei in Ihrem Projekt speichern.', + 'saveProjectPlanDialog.field.title': 'Titel', + 'saveProjectPlanDialog.field.titlePlaceholder': 'Plan-Titel', + 'saveProjectPlanDialog.field.contentPreview': 'Inhaltsvorschau', + 'saveProjectPlanDialog.actions.cancel': 'Abbrechen', + 'saveProjectPlanDialog.actions.save': 'Speichern', + 'saveProjectPlanDialog.actions.saving': 'Speichern...', + 'branchPickerDialog.title': 'Branch-Auswähler', + 'branchPickerDialog.description.localBranchesForProject': 'Lokale Branches für {project}', + 'branchPickerDialog.description.selectProject': 'Projekt auswählen, um Branches anzuzeigen', + 'branchPickerDialog.search.placeholder': 'Branches durchsuchen...', + 'branchPickerDialog.search.renameBranchPlaceholder': 'Branch umbenennen', + 'branchPickerDialog.state.noProjectSelected': 'Kein Projekt ausgewählt', + 'branchPickerDialog.state.loadingBranches': 'Branches werden geladen...', + 'branchPickerDialog.state.noMatchingBranches': 'Keine passenden Branches', + 'branchPickerDialog.state.noBranchesFound': 'Keine Branches gefunden', + 'branchPickerDialog.badge.head': 'HEAD', + 'branchPickerDialog.badge.worktree': 'Worktree', + 'branchPickerDialog.actions.createWorktreeAria': 'Worktree aus Branch erstellen', + 'branchPickerDialog.actions.renameAria': 'Branch umbenennen', + 'branchPickerDialog.actions.deleteAria': 'Branch löschen', + 'branchPickerDialog.actions.deleteWorktreeAria': 'Arbeitsbaum entfernen', + 'branchPickerDialog.actions.confirmRenameAria': 'Umbenennen bestätigen', + 'branchPickerDialog.actions.cancelRenameAria': 'Umbenennen abbrechen', + 'branchPickerDialog.actions.confirmDeleteAria': 'Löschen des Branches bestätigen', + 'branchPickerDialog.actions.cancelDeleteAria': 'Löschen des Branches abbrechen', + 'branchPickerDialog.actions.deletePrompt': 'Löschen', + 'branchPickerDialog.actions.forceDeletePrompt': 'Löschen erzwingen', + 'branchPickerDialog.tooltip.createWorktree': 'Arbeitsbaum erstellen', + 'branchPickerDialog.tooltip.worktreeAlreadyExists': 'Arbeitsbaum existiert bereits', + 'branchPickerDialog.tooltip.rename': 'Branch umbenennen', + 'branchPickerDialog.tooltip.renameDisabledForRoot': 'Root-Branch kann nicht umbenannt werden', + 'branchPickerDialog.tooltip.delete': 'Branch löschen', + 'branchPickerDialog.tooltip.deleteCurrentBranch': 'Aktueller Branch kann nicht gelöscht werden', + 'branchPickerDialog.tooltip.deleteDisabledForRoot': 'Root-Branch kann nicht gelöscht werden', + 'branchPickerDialog.tooltip.deleteWorktree': 'Arbeitsbaum entfernen', + 'branchPickerDialog.tooltip.deleteWorktreeRootProtected': 'Root-Arbeitsbaum kann nicht entfernt werden', + 'branchPickerDialog.toast.branchRenamed': 'Branch umbenannt', + 'branchPickerDialog.toast.failedToRenameBranch': 'Fehler beim Umbenennen des Branches', + 'branchPickerDialog.toast.branchDeleted': 'Branch gelöscht', + 'branchPickerDialog.toast.branchNotMerged': 'Branch ist nicht vollständig gemerged', + 'branchPickerDialog.toast.confirmAgainToForceDelete': 'Erneut bestätigen, um Löschen zu erzwingen', + 'branchPickerDialog.toast.failedToDeleteBranch': 'Fehler beim Löschen des Branches', + 'branchPickerDialog.toast.worktreeCreated': 'Arbeitsbaum erstellt', + 'branchPickerDialog.toast.failedToCreateWorktree': 'Fehler beim Erstellen des Arbeitsbaums', + 'branchPickerDialog.error.failedToLoad': 'Fehler beim Laden der Branches', + 'branchPickerDialog.error.renameRejected': 'Umbenennen wurde abgelehnt', + 'branchPickerDialog.error.renameFailed': 'Fehler beim Umbenennen des Branches', + 'branchPickerDialog.error.deleteRejected': 'Löschen wurde abgelehnt', + 'branchPickerDialog.error.deleteFailed': 'Fehler beim Löschen des Branches', + 'branchPickerDialog.error.createWorktreeFailed': 'Fehler beim Erstellen des Worktrees', + 'projectEditDialog.title': 'Projekt bearbeiten', + 'projectEditDialog.field.name': 'Name', + 'projectEditDialog.field.namePlaceholder': 'Projektname', + 'projectEditDialog.field.color': 'Farbe', + 'projectEditDialog.field.icon': 'Symbol', + 'projectEditDialog.field.preview': 'Vorschau', + 'projectEditDialog.field.iconBackground': 'Symbol-Hintergrund', + 'projectEditDialog.field.iconBackgroundAria': 'Projekt-Symbol-Hintergrundfarbe', + 'projectEditDialog.option.none': 'Keine', + 'projectEditDialog.actions.uploadIcon': 'Symbol hochladen', + 'projectEditDialog.actions.uploading': 'Hochladen...', + 'projectEditDialog.actions.discoverFavicon': 'Favicon entdecken', + 'projectEditDialog.actions.discovering': 'Entdecken...', + 'projectEditDialog.actions.removeProjectIcon': 'Projekt-Symbol entfernen', + 'projectEditDialog.actions.removing': 'Entfernen...', + 'projectEditDialog.actions.undoRemove': 'Entfernen rückgängig machen', + 'projectEditDialog.actions.clear': 'Leeren', + 'projectEditDialog.actions.cancel': 'Abbrechen', + 'projectEditDialog.actions.save': 'Speichern', + 'projectEditDialog.toast.failedToUploadIcon': 'Fehler beim Hochladen des Projekt-Symbols', + 'projectEditDialog.toast.iconUpdated': 'Projekt-Symbol aktualisiert', + 'projectEditDialog.toast.failedToRemoveIcon': 'Fehler beim Entfernen des Projekt-Symbols', + 'projectEditDialog.toast.iconRemoved': 'Projekt-Symbol entfernt', + 'projectEditDialog.toast.failedToDiscoverIcon': 'Fehler bei der Erkennung des Projekt-Symbols', + 'projectEditDialog.toast.customIconAlreadySet': 'Benutzerdefiniertes Symbol bereits für dieses Projekt festgelegt', + 'projectEditDialog.toast.iconDiscovered': 'Projekt-Symbol entdeckt', + 'agentManager.sidebar.search.placeholder': 'Agent-Gruppen durchsuchen...', + 'agentManager.sidebar.actions.newAgentGroup': 'Neue Agent-Gruppe', + 'agentManager.sidebar.actions.more': '... Mehr ({count})', + 'agentManager.sidebar.actions.showLess': 'Weniger anzeigen', + 'agentManager.sidebar.section.agentGroups': 'Agentengruppen', + 'agentManager.sidebar.state.loading': 'Laden...', + 'agentManager.sidebar.state.noGroupsFound': 'Keine Gruppen gefunden', + 'agentManager.sidebar.state.noGroupsYet': 'Noch keine Agentengruppen', + 'agentManager.sidebar.state.createToGetStarted': 'Erstellen Sie eine neue Agentengruppe, um loszulegen', + 'agentManager.sidebar.item.modelCountSingle': '{count} Modell', + 'agentManager.sidebar.item.modelCountPlural': '{count} Modelle', + 'agentManager.sidebar.item.groupMenuAria': 'Gruppenmenü', + 'agentManager.sidebar.item.delete': 'Löschen', + 'agentManager.sidebar.relativeTime.now': 'jetzt', + 'agentManager.sidebar.relativeTime.minutes': '{count}m', + 'agentManager.sidebar.relativeTime.hours': '{count}h', + 'agentManager.sidebar.relativeTime.days': '{count}d', + 'agentManager.sidebar.dialog.deleteGroupTitle': 'Agentengruppe löschen', + 'agentManager.sidebar.dialog.deleteGroupDescription': '"{group}" löschen? Dadurch werden alle Worktrees und Sitzungen in dieser Gruppe entfernt.', + 'agentManager.sidebar.dialog.cancel': 'Abbrechen', + 'agentManager.sidebar.dialog.delete': 'Löschen', + 'agentManager.sidebar.dialog.deleting': 'Löschen...', + 'agentManager.sidebar.toast.deletingGroup': '"{group}" wird gelöscht...', + 'agentManager.sidebar.toast.deletedGroup': '"{group}" gelöscht', + 'agentManager.sidebar.toast.failedToDeleteGroup': 'Vollständiges Löschen von "{group}" fehlgeschlagen', + 'agentManager.detail.header.modelCountSingle': '{count} Modell', + 'agentManager.detail.header.modelCountPlural': '{count} Modelle', + 'agentManager.detail.header.noBranch': 'Kein Branch', + 'agentManager.detail.actions.worktreeActionsAria': 'Worktree-Aktionen', + 'agentManager.detail.actions.removeThisWorktree': 'Diesen Worktree entfernen', + 'agentManager.detail.actions.keepThisRemoveOthers': 'Diesen behalten, andere entfernen', + 'agentManager.detail.actions.copyWorktreePath': 'Worktree-Pfad kopieren', + 'agentManager.detail.dialog.removeWorktreeTitle': 'Worktree entfernen', + 'agentManager.detail.dialog.removeOtherWorktreesTitle': 'Andere Worktrees entfernen', + 'agentManager.detail.dialog.removeWorktreeDescription': '"{label}" entfernen? Dadurch werden alle Sitzungen in diesem Worktree gelöscht und der Worktree selbst entfernt.', + 'agentManager.detail.dialog.removeOtherWorktreesDescription': '"{label}" behalten und die anderen Worktrees in "{group}" entfernen.', + 'agentManager.detail.dialog.cancel': 'Abbrechen', + 'agentManager.detail.dialog.remove': 'Entfernen', + 'agentManager.detail.dialog.removeOthers': 'Andere entfernen', + 'agentManager.detail.dialog.working': 'Arbeite...', + 'agentManager.detail.state.loadingSessionFor': 'Lade Sitzung für {label}', + 'agentManager.detail.state.sessionId': 'Sitzungs-ID: {id}', + 'agentManager.detail.state.noSessionsInGroup': 'Keine Sitzungen in dieser Gruppe', + 'agentManager.detail.toast.noWorktreePath': 'Kein Worktree-Pfad verfügbar', + 'agentManager.detail.toast.worktreePathCopied': 'Worktree-Pfad kopiert', + 'agentManager.detail.toast.failedToCopyPath': 'Fehler beim Kopieren des Pfads', + 'agentManager.detail.toast.removingWorktree': 'Entferne Worktree...', + 'agentManager.detail.toast.removingOtherWorktrees': 'Entferne andere Worktrees...', + 'agentManager.detail.toast.failedToFullyRemoveWorktree': 'Fehler beim vollständigen Entfernen des Worktrees', + 'agentManager.detail.toast.worktreeRemoved': 'Worktree entfernt', + 'agentManager.detail.toast.otherWorktreesRemoved': 'Andere Worktrees entfernt', + 'agentManager.empty.groupName.label': 'Gruppenname', + 'agentManager.empty.groupName.placeholder': 'z.B. feature-auth, bugfix-login', + 'agentManager.empty.groupName.description': 'Wird für Verzeichnis- und Branch-Namen verwendet', + 'agentManager.empty.baseBranch.label': 'Basis-Branch', + 'agentManager.empty.baseBranch.description': 'Erstellt neue Branches aus {branch}', + 'agentManager.empty.setupCommands.label': 'Setup-Befehle', + 'agentManager.empty.setupCommands.configured': '{count} konfiguriert', + 'agentManager.empty.setupCommands.description': 'Befehle, die in jedem neuen Worktree ausgeführt werden. Verwende $ROOT_PROJECT_PATH für das Projekt-Root.', + 'agentManager.empty.setupCommands.loading': 'Laden...', + 'agentManager.empty.setupCommands.commandPlaceholder': 'z.B., bun install', + 'agentManager.empty.setupCommands.removeCommandAria': 'Befehl entfernen', + 'agentManager.empty.setupCommands.addCommand': 'Befehl hinzufügen', + 'agentManager.empty.agent.label': 'Agent', + 'agentManager.empty.agent.description': 'Verwendet standardmäßig Ihren konfigurierten Standard-Agent', + 'agentManager.empty.models.label': 'Modelle', + 'agentManager.empty.models.addModel': 'Modell hinzufügen', + 'agentManager.empty.models.selectedSingle': '{count} Modell ausgewählt', + 'agentManager.empty.models.selectedPlural': '{count} Modelle ausgewählt', + 'agentManager.empty.prompt.label': 'Prompt', + 'agentManager.empty.prompt.placeholder': 'Frage alles...', + 'agentManager.empty.prompt.addAttachmentAria': 'Anhang hinzufügen', + 'agentManager.empty.actions.startAgentGroupAria': 'Agent-Gruppe starten', + 'agentManager.empty.toast.fileTooLarge': 'Datei "{fileName}" ist zu groß (max. 10MB)', + 'agentManager.empty.toast.failedToAttach': 'Fehler beim Anhängen von "{fileName}"', + 'agentManager.empty.toast.attachedSingle': '{count} Datei angehängt', + 'agentManager.empty.toast.attachedPlural': '{count} Dateien angehängt', + 'agentManager.empty.toast.failedToCreateGroup': 'Fehler beim Erstellen der Agent-Gruppe', + 'openInApp.actions.open': 'Öffnen', + 'openInApp.actions.openInAria': 'In {app} öffnen', + 'openInApp.actions.chooseAppAria': 'App zum Öffnen auswählen', + 'openInApp.actions.copyPath': 'Pfad kopieren', + 'openInApp.actions.refreshApps': 'Apps aktualisieren', + 'openInApp.toast.pathCopied': 'Pfad in die Zwischenablage kopiert', + 'projectActions.actions.addActionAria': 'Aktion hinzufügen', + 'projectActions.actions.addAction': 'Aktion hinzufügen', + 'projectActions.actions.addNewAction': 'Neue Aktion hinzufügen', + 'projectActions.actions.autoDiscover': 'Automatisch entdecken', + 'projectActions.actions.chooseActionAria': 'Projektaktion auswählen', + 'projectActions.actions.openPreview': 'Vorschau öffnen', + 'projectActions.actions.runNamedAria': '{name} ausführen', + 'projectActions.actions.stopNamedAria': '{name} stoppen', + 'projectActions.label.fallbackAction': 'Aktion', + 'projectActions.toast.openedUrlFromOutput': 'URL aus der Aktionsausgabe geöffnet', + 'projectActions.toast.openedForwardedUrl': 'Weitergeleitete URL geöffnet', + 'projectActions.toast.openedActionUrl': 'Aktions-URL geöffnet', + 'projectActions.error.noActiveDirectory': 'Kein aktives Verzeichnis', + 'projectActions.error.noActiveDirectoryForAction': 'Kein aktives Verzeichnis für Aktion', + 'projectActions.error.failedToCreateTerminalSession': 'Erstellung der Terminal-Sitzung fehlgeschlagen', + 'projectActions.error.invalidCustomUrlFormat': 'Ungültiges benutzerdefiniertes URL-Format', + 'projectActions.error.selectedDesktopSshForwardUnavailable': 'Ausgewählte Desktop-SSH-Weiterleitung ist nicht verfügbar', + 'projectActions.error.failedToRunAction': 'Aktion konnte nicht ausgeführt werden', + 'mcpDropdown.title': 'MCP-Server', + 'mcpDropdown.actions.refreshAria': 'Aktualisieren', + 'mcpDropdown.actions.openAria': 'MCP-Server', + 'mcpDropdown.statusAria': 'MCP-Status', + 'mcpDropdown.status.unknown': 'Unbekannt', + 'mcpDropdown.status.connected': 'Verbunden', + 'mcpDropdown.status.failed': 'Fehlgeschlagen: {error}', + 'mcpDropdown.status.unknownError': 'Unbekannter Fehler', + 'mcpDropdown.status.needsAuth': 'Authentifizierung erforderlich', + 'mcpDropdown.status.needsRegistration': 'Registrierung erforderlich: {error}', + 'mcpDropdown.empty.configureInConfig': 'Konfigurieren Sie MCP-Server in den Einstellungen.', + 'sessionAuth.error.rateLimitTitle': 'Zu viele Versuche', + 'sessionAuth.error.networkTitle': 'Server nicht erreichbar', + 'sessionAuth.error.rateLimitDescriptionSingle': 'Bitte warten Sie {minutes} Minute, bevor Sie es erneut versuchen.', + 'sessionAuth.error.rateLimitDescriptionPlural': 'Bitte warten Sie {minutes} Minuten, bevor Sie es erneut versuchen.', + 'sessionAuth.error.networkDescription': 'Wir konnten die UI-Sitzung nicht verifizieren. Wenn Sie OpenChamber von einem anderen Gerät in Ihrem lokalen Netzwerk öffnen, stellen Sie sicher, dass Desktop-Netzwerkzugriff in der Desktop-Anwendung aktiviert ist und verwenden Sie die im Einstellungen angezeigte LAN-Adresse.', + 'sessionAuth.error.retry': 'Erneut versuchen', + 'sessionAuth.error.passkeySetupFailed': 'Einrichtung des Passkeys fehlgeschlagen.', + 'sessionAuth.error.incorrectPassword': 'Falsches Passwort. Bitte erneut versuchen.', + 'sessionAuth.error.unexpectedResponse': 'Unerwartete Antwort vom Server.', + 'sessionAuth.error.networkRetry': 'Netzwerkfehler. Verbindung prüfen und erneut versuchen.', + 'sessionAuth.error.passkeySignInCanceled': 'Passkey-Anmeldung wurde abgebrochen.', + 'sessionAuth.error.enterPasswordForPasskey': 'Geben Sie Ihr Passwort ein, um einen Passkey hinzuzufügen.', + 'sessionAuth.locked.tunnelTitle': 'Tunnel-Zugriff erforderlich', + 'sessionAuth.locked.unlockTitle': 'OpenChamber entsperren', + 'sessionAuth.locked.tunnelDescription': 'Öffnen Sie diesen Tunnel über den Einmal-Verbindungslink aus der Desktop-Anwendung.', + 'sessionAuth.locked.passwordDescription': 'Diese Sitzung ist passwortgeschützt.', + 'sessionAuth.locked.hostSwitcherHint': 'Verwenden Sie Local, wenn Remote nicht erreichbar ist.', + 'sessionAuth.actions.cancelPasskey': 'Passkey abbrechen', + 'sessionAuth.actions.usePasskey': 'Passkey verwenden', + 'sessionAuth.actions.unlockingAria': 'Entsperren', + 'sessionAuth.actions.unlockAria': 'Entsperren', + 'sessionAuth.actions.trustDevice': 'Dieses Gerät vertrauen', + 'sessionAuth.actions.trustDeviceAria': 'Dieses Gerät vertrauen', + 'sessionAuth.actions.cancelPasskeySetup': 'Passkey-Einrichtung abbrechen', + 'sessionAuth.actions.addPasskey': 'Passkey hinzufügen', + 'sessionAuth.password.placeholder': 'Passwort eingeben', + 'sessionAuth.toast.passkeyAdded': 'Passkey hinzugefügt', + 'sessionAuth.toast.passkeySetupCanceled': 'Passkey-Einrichtung abgebrochen', + 'desktopHostSwitcher.title': 'Instanz', + 'desktopHostSwitcher.description': 'Zwischen lokalen und Remote-OpenChamber-Servern wechseln', + 'desktopHostSwitcher.header.current': 'Aktuell', + 'desktopHostSwitcher.header.default': 'Standard', + 'desktopHostSwitcher.header.currentColon': 'Aktuell:', + 'desktopHostSwitcher.header.currentDefaultColon': 'Aktueller Standard:', + 'desktopHostSwitcher.status.connected': 'Verbunden', + 'desktopHostSwitcher.status.authRequired': 'Authentifizierung erforderlich', + 'desktopHostSwitcher.status.checking': 'Überprüfung', + 'desktopHostSwitcher.status.updateRecommended': 'Aktualisierung empfohlen', + 'desktopHostSwitcher.status.incompatible': 'Nicht kompatibel', + 'desktopHostSwitcher.status.wrongService': 'Falscher Dienst', + 'desktopHostSwitcher.status.unreachable': 'Nicht erreichbar', + 'desktopHostSwitcher.status.unknown': 'Unbekannt', + 'desktopHostSwitcher.status.ping': ' · {ms}ms Ping', + 'desktopHostSwitcher.statusAria': 'Instanzstatus', + 'desktopHostSwitcher.sshPhase.ready': 'Bereit', + 'desktopHostSwitcher.sshPhase.error': 'Fehler', + 'desktopHostSwitcher.sshPhase.reconnecting': 'Verbindung wird wiederhergestellt', + 'desktopHostSwitcher.sshPhase.resolvingConfig': 'Konfiguration wird aufgelöst', + 'desktopHostSwitcher.sshPhase.checkingAuth': 'Authentifizierung wird überprüft', + 'desktopHostSwitcher.sshPhase.connectingSsh': 'SSH-Verbindung wird hergestellt', + 'desktopHostSwitcher.sshPhase.probingRemote': 'Entfernte Systeme werden untersucht', + 'desktopHostSwitcher.sshPhase.installing': 'Wird installiert', + 'desktopHostSwitcher.sshPhase.updating': 'Wird aktualisiert', + 'desktopHostSwitcher.sshPhase.detectingServer': 'Server wird erkannt', + 'desktopHostSwitcher.sshPhase.startingServer': 'Server wird gestartet', + 'desktopHostSwitcher.sshPhase.forwardingPorts': 'Ports werden weitergeleitet', + 'desktopHostSwitcher.sshPhase.idle': 'Leerlauf', + 'desktopHostSwitcher.ssh.needInstancesHint': 'Benötigen Sie SSH-Instanzen? Verwalten Sie diese in den Einstellungen.', + 'desktopHostSwitcher.ssh.instanceFallback': 'SSH-Instanz', + 'desktopHostSwitcher.ssh.connectingTo': 'Verbindung zu {host} wird hergestellt', + 'desktopHostSwitcher.actions.refresh': 'Aktualisieren', + 'desktopHostSwitcher.actions.refreshInstancesAria': 'Instanzen aktualisieren', + 'desktopHostSwitcher.actions.remoteSsh': 'Entferntes SSH', + 'desktopHostSwitcher.actions.instanceActionsAria': 'Instanzaktionen', + 'desktopHostSwitcher.actions.edit': 'Bearbeiten', + 'desktopHostSwitcher.actions.delete': 'Löschen', + 'desktopHostSwitcher.actions.connect': 'Verbinden', + 'desktopHostSwitcher.actions.defaultInstanceAria': 'Standardinstanz', + 'desktopHostSwitcher.actions.setAsDefaultAria': 'Als Standard festlegen', + 'desktopHostSwitcher.actions.setAsDefault': 'Als Standard festlegen', + 'desktopHostSwitcher.actions.openInNewWindowAria': 'In neuem Fenster öffnen', + 'desktopHostSwitcher.actions.openInNewWindow': 'In neuem Fenster öffnen', + 'desktopHostSwitcher.actions.addInstance': 'Instanz hinzufügen', + 'desktopHostSwitcher.actions.cancel': 'Abbrechen', + 'desktopHostSwitcher.actions.save': 'Speichern', + 'desktopHostSwitcher.actions.add': 'Hinzufügen', + 'desktopHostSwitcher.actions.switchToLocal': 'Zu Lokal wechseln', + 'desktopHostSwitcher.actions.retry': 'Wiederholen', + 'desktopHostSwitcher.actions.switchInstanceAria': 'Instanz wechseln', + 'desktopHostSwitcher.actions.switchInstance': 'Instanz wechseln', + 'desktopHostSwitcher.actions.switchToAria': 'Zu {instance} wechseln', + 'desktopHostSwitcher.field.labelPlaceholder': 'Bezeichnung', + 'desktopHostSwitcher.field.labelOptionalPlaceholder': 'Bezeichnung (optional)', + 'desktopHostSwitcher.field.urlPlaceholder': 'https://host:port', + 'desktopHostSwitcher.state.limitedOnPage': 'Instanzwechsler ist auf dieser Seite begrenzt. Verwenden Sie Lokal, um wiederherzustellen.', + 'desktopHostSwitcher.state.loading': 'Wird geladen...', + 'desktopHostSwitcher.state.instanceUnreachable': 'Instanz nicht erreichbar', + 'desktopHostSwitcher.edit.title': 'Instanz bearbeiten', + 'desktopHostSwitcher.add.title': 'Instanz hinzufügen', + 'desktopHostSwitcher.error.failedToSave': 'Speichern fehlgeschlagen', + 'desktopHostSwitcher.error.failedToLoad': 'Laden fehlgeschlagen', + 'desktopHostSwitcher.error.invalidUrl': 'Ungültige URL (muss http/https sein)', + 'desktopHostSwitcher.error.failedToOpenNewWindow': 'Öffnen eines neuen Fensters fehlgeschlagen', + 'desktopHostSwitcher.instance.local': 'Lokal', + 'desktopHostSwitcher.instance.fallback': 'Instanz', + 'desktopHostSwitcher.startup.title': 'Standard-SSH-Instanz nicht verfügbar', + 'desktopHostSwitcher.startup.connectingTo': 'Verbindung zu {host} herstellen...', + 'desktopHostSwitcher.startup.failed': 'Verbindung zur Standard-SSH-Instanz fehlgeschlagen.', + 'desktopHostSwitcher.toast.sshConnected': 'SSH-Instanz "{host}" verbunden', + 'desktopHostSwitcher.toast.sshFailedToConnect': 'SSH-Instanz "{host}" konnte keine Verbindung herstellen', + 'desktopHostSwitcher.toast.instanceUnreachable': 'Instanz "{host}" ist nicht erreichbar', + 'miniChat.header.newSession': 'Neue Sitzung', + 'miniChat.header.session': 'Sitzung', + 'miniChat.header.defaultAgent': 'Standard-Agent', + 'miniChat.header.noModel': 'Kein Modell', + 'miniChat.status.busy': 'Läuft', + 'miniChat.status.retry': 'Wiederholen', + 'miniChat.status.idle': 'Leerlauf', + 'miniChat.actions.pin': 'Oben über anderen Fenstern anheften', + 'miniChat.actions.unpin': 'Fenster lösen', + 'miniChat.actions.pinAria': 'Mini Chat-Fenster anheften', + 'miniChat.actions.unpinAria': 'Mini Chat-Fenster lösen', + 'miniChat.actions.openMain': 'In Hauptfenster öffnen', + 'miniChat.actions.openMainAria': 'Sitzung im Hauptfenster öffnen', + 'miniChat.unavailable.title': 'Sitzung nicht verfügbar', + 'miniChat.unavailable.description': 'Diese Sitzung konnte nicht geladen werden. Sie wurde möglicherweise gelöscht, archiviert oder aus einem anderen Projekt-Kontext geöffnet.', + 'sessions.sidebar.session.menu.openMiniChatWindow': 'In Mini Chat-Fenster öffnen', + 'header.actions.newMiniChat': 'Neues Mini Chat-Fenster', + 'header.actions.newMiniChatAria': 'Ein neues Mini Chat-Fenster öffnen', + 'header.actions.openSessionMiniChat': 'Sitzung in Mini Chat öffnen', + 'header.actions.openSessionMiniChatAria': 'Aktuelle Sitzung in Mini Chat öffnen', + 'header.windowControls.groupAria': 'Fenstersteuerung', + 'header.windowControls.minimize': 'Fenster minimieren', + 'header.windowControls.maximize': 'Fenster maximieren', + 'header.windowControls.restore': 'Fenster wiederherstellen', + 'header.windowControls.close': 'Fenster schließen', + 'errorBoundary.title': 'Etwas ist schiefgelaufen', + 'errorBoundary.description': 'Die Anwendung hat einen unerwarteten Fehler festgestellt. Dies wurde zur Fehlersuche protokolliert.', + 'errorBoundary.state.unknownError': 'Unbekannter Fehler', + 'errorBoundary.state.componentStackLabel': 'Komponentenstapel:', + 'errorBoundary.actions.errorDetails': 'Fehlerdetails', + 'errorBoundary.actions.tryAgain': 'Erneut versuchen', + 'errorBoundary.actions.copy': 'Kopieren', + 'errorBoundary.actions.copied': 'Kopiert', + 'jsonTreeView.error.emptyJson': 'Leerer JSON-Inhalt', + 'jsonTreeView.error.invalidJson': 'Ungültiges JSON', + 'jsonTreeView.error.invalidJsonTitle': 'Ungültiges JSON', + 'jsonTreeView.actions.expandAll': 'Alle erweitern', + 'jsonTreeView.actions.collapseAll': 'Alle reduzieren', + 'numberInput.actions.decreaseAria': 'Wert verringern', + 'numberInput.actions.increaseAria': 'Wert erhöhen', + 'goToLineDialog.field.linePlaceholderShort': 'Zeile', + 'goToLineDialog.field.linePlaceholder': 'Zeilennummer', + 'goToLineDialog.actions.go': 'Gehe zu', + 'goToLineDialog.helper.editorUnavailable': 'Editor nicht verfügbar.', + 'goToLineDialog.helper.currentLineRange': 'Aktuelle Zeile: {current}. Geben Sie eine Zeilennummer zwischen 1 und {max} ein, um zur gewünschten Zeile zu navigieren.', + 'goToLineDialog.helper.goToLine': 'Gehe zu Zeile {line}', + 'dialog.common.actions.close': 'Schließen', + 'filesView.toast.relativePathCopied': 'Relativer Pfad kopiert', + 'filesView.tree.menu.copyRelativePath': 'Relativen Pfad kopieren', + 'multiRun.branchSelector.placeholder.selectSourceBranch': 'Quell-Branch auswählen...', + 'multiRun.branchSelector.status.loadingBranches': 'Lade Branches...', + 'multiRun.branchSelector.status.noBranchesFound': 'Keine Branches gefunden', + 'multiRun.branchSelector.status.notInGitRepository': 'Nicht in einem Git-Repository.', + 'multiRun.branchSelector.groups.localBranches': 'Lokale Branches', + 'multiRun.branchSelector.groups.remoteBranches': 'Remote-Branches', + 'multiRun.window.actions.closeAria': 'Multi-Run schließen', + 'multiRun.window.description': 'OpenChamber Multi-Run Fenster.', + 'voice.status.idle': 'Sprache bereit', + 'voice.status.listening': 'Höre...', + 'voice.status.processing': 'Verarbeite...', + 'voice.status.speaking': 'Spricht...', + 'voice.status.error': 'Sprachfehler', + 'voice.status.conversationModeActiveAria': 'Konversationsmodus aktiv', + 'voice.action.finishAndTranscribe': 'Spracheingabe beenden und transkribieren', + 'onboarding.common.actions.back': 'Zurück', + 'onboarding.common.copyToClipboard': 'In Zwischenablage kopieren', + 'onboarding.common.status.copiedToClipboard': 'In Zwischenablage kopiert', + 'onboarding.chooser.title': 'Willkommen bei OpenChamber', + 'onboarding.chooser.description': 'Wählen Sie, wie Sie sich verbinden möchten, um loszulegen.', + 'onboarding.chooser.tabs.localInstall': 'Lokale Installation', + 'onboarding.chooser.tabs.connectRemote': 'Entfernte Verbindung', + 'onboarding.localSetup.title': 'Einrichtung von OpenCode', + 'onboarding.localSetup.description': 'Installieren Sie die OpenCode CLI, um fortzufahren.', + 'onboarding.localSetup.dialog.selectOpencodeBinary': 'opencode-Binärdatei auswählen', + 'onboarding.localSetup.errors.cliNotReady': 'OpenCode CLI ist noch nicht bereit. Bitte bestätigen Sie, dass die Installation abgeschlossen ist, und versuchen Sie es erneut.', + 'onboarding.localSetup.errors.detectionFailed': 'Erkennung fehlgeschlagen', + 'onboarding.localSetup.windows.title': 'Windows-Einrichtung', + 'onboarding.localSetup.windows.stepInstallWsl': 'Installieren Sie OpenCode mit dem folgenden Befehl.', + 'onboarding.localSetup.windows.stepRunInstallInWsl': 'Führen Sie den Installationsbefehl unten in einer Windows-Konsole aus.', + 'onboarding.localSetup.windows.stepSetBinaryPath': 'Wenn OpenChamber OpenCode nicht automatisch erkennt, legen Sie den Binärpfad unten fest.', + 'onboarding.localSetup.intro': 'OpenCode ist das Herz von OpenChamber – installieren Sie es, um loszulegen.', + 'onboarding.localSetup.docs.windows': 'OpenCode-Dokumentation', + 'onboarding.localSetup.docs.default': 'OpenCode-Dokumentation', + 'onboarding.localSetup.actions.checking': 'Überprüfe…', + 'onboarding.localSetup.actions.checkNow': 'Jetzt überprüfen', + 'onboarding.localSetup.helper.checkAndContinue': 'Klicken Sie, um zu prüfen, ob OpenCode CLI verfügbar ist. Bei Erfolg gelangen Sie automatisch zum Hauptbildschirm.', + 'onboarding.localSetup.status.watching': 'Warte auf OpenCode', + 'onboarding.localSetup.field.alreadyInstalled': 'Bereits installiert? Legen Sie den OpenCode CLI-Pfad fest:', + 'onboarding.localSetup.advanced.title': 'Benutzerdefinierten Binärpfad festlegen', + 'onboarding.localSetup.troubleshoot.title': 'Probleme beim Verbinden?', + 'onboarding.localSetup.actions.browse': 'Durchsuchen', + 'onboarding.localSetup.actions.apply': 'Anwenden', + 'onboarding.localSetup.helper.saveAndReload': 'Speichert in die OpenChamber-Einstellungen und lädt die OpenCode-Konfiguration neu.', + 'onboarding.localSetup.remotePreference': 'Bevorzugen Sie die Verwendung eines Remote-Servers?', + 'onboarding.localSetup.actions.connectRemoteServer': 'Mit Remote-Server verbinden →', + 'onboarding.localSetup.windows.hintInstallInWsl': 'Unter Windows installieren und führen Sie OpenCode nativ aus.', + 'onboarding.localSetup.windows.hintDetectionFailed': 'Falls die Erkennung fehlschlägt, legen Sie einen nativen Pfad wie opencode.cmd oder opencode.exe fest.', + 'onboarding.localSetup.hint.ensurePath': 'Bereits installiert? Stellen Sie sicher, dass opencode in Ihrem PATH enthalten ist.', + 'onboarding.localSetup.hint.setEnv': 'Oder legen Sie die Umgebungsvariable OPENCODE_BINARY fest.', + 'onboarding.localSetup.hint.missingRuntime': 'Wenn Sie „env: node: No such file or directory“ oder „env: bun: No such file or directory“ sehen, installieren Sie diese Laufzeitumgebung oder stellen Sie sicher, dass sie im PATH enthalten ist.', + 'onboarding.remoteConnection.title': 'Mit Remote-Server verbinden', + 'onboarding.remoteConnection.titleRecovery': 'Mit einem anderen Server verbinden', + 'onboarding.remoteConnection.description': 'Geben Sie die Adresse eines OpenChamber-Servers ein, mit dem Sie sich verbinden möchten.', + 'onboarding.remoteConnection.field.serverAddress': 'Server-Adresse', + 'onboarding.remoteConnection.field.serverAddressPlaceholder': 'https://your-server.example.com:4096', + 'onboarding.remoteConnection.field.nameOptional': 'Name (optional)', + 'onboarding.remoteConnection.field.namePlaceholder': 'Mein Remote-Server', + 'onboarding.remoteConnection.errors.connectionTestFailed': 'Verbindungstest fehlgeschlagen', + 'onboarding.remoteConnection.errors.failedToSaveConnection': 'Speichern der Verbindung fehlgeschlagen', + 'onboarding.remoteConnection.status.connectedSuccessfully': 'Erfolgreich verbunden ({latencyMs}ms)', + 'onboarding.remoteConnection.status.authWarning': 'Server erfordert Authentifizierung. Sie können sich immer noch verbinden.', + 'onboarding.remoteConnection.status.connectionFailed': 'Verbindung fehlgeschlagen', + 'onboarding.remoteConnection.status.suggestionsUnreachable': 'Vorschläge: Überprüfen Sie die Serveradresse, stellen Sie sicher, dass der Server läuft, oder prüfen Sie Ihre Netzwerkverbindung.', + 'onboarding.remoteConnection.status.suggestionsWrongService': 'Vorschläge: Stellen Sie sicher, dass die URL auf einen OpenChamber-Server zeigt, oder kontaktieren Sie den Server-Administrator.', + 'onboarding.remoteConnection.actions.testing': 'Teste…', + 'onboarding.remoteConnection.actions.testConnection': 'Verbindung testen', + 'onboarding.remoteConnection.actions.connectAndRestart': 'Verbinden & Neustarten', + 'onboarding.remoteConnection.actions.whatToDo': 'Was möchten Sie tun?', + 'onboarding.remoteConnection.actions.chooseDifferentServer': 'Anderen Server auswählen', + 'onboarding.remoteConnection.actions.useLocalInstead': 'Lokal stattdessen verwenden', + 'onboarding.remoteConnection.probe.authMessage': 'Der Server erfordert Authentifizierung. Sie können sich immer noch verbinden, aber müssen möglicherweise Anmeldedaten bereitstellen.', + 'onboarding.remoteConnection.probe.updateRecommendedMessage': 'Diese Instanz verwendet eine andere OpenChamber-Version. Sie können sich verbinden, aber aktualisieren Sie beide Apps, falls etwas nicht funktioniert.', + 'onboarding.remoteConnection.probe.incompatibleMessage': 'Der Server läuft unter OpenChamber, ist aber nicht kompatibel mit dieser App-Version. Aktualisieren Sie OpenChamber auf dem Server und versuchen Sie es dann erneut.', + 'onboarding.remoteConnection.probe.wrongServiceMessage': 'Der Server hat geantwortet, aber es läuft kein OpenChamber. Überprüfen Sie, ob die Adresse auf einen OpenChamber-Server zeigt.', + 'onboarding.remoteConnection.probe.unreachableMessage': 'Der Server ist nicht erreichbar. Überprüfen Sie Ihre Netzwerkverbindung und die Serveradresse.', + 'onboarding.desktopRecovery.localUnavailable.title': 'Lokales OpenCode nicht verfügbar', + 'onboarding.desktopRecovery.localUnavailable.description': 'OpenCode CLI konnte nicht gestartet werden oder ist nicht installiert. Installieren Sie OpenCode oder verbinden Sie sich stattdessen mit einem Remote-Server.', + 'onboarding.desktopRecovery.localUnavailable.retry': 'Lokal erneut versuchen', + 'onboarding.desktopRecovery.localUnavailable.useLocal': 'Lokale Einrichtung', + 'onboarding.desktopRecovery.noDefaultConnection.title': 'Keine Standardverbindung', + 'onboarding.desktopRecovery.noDefaultConnection.description': 'Ihre gespeicherte Standardverbindung konnte nicht gefunden werden. Wählen Sie aus, wie Sie sich verbinden möchten.', + 'onboarding.desktopRecovery.remoteUnreachable.title': 'Remote-Server nicht erreichbar', + 'onboarding.desktopRecovery.remoteUnreachable.description': 'Konnte keine Verbindung zu "{host}" herstellen. Überprüfen Sie Ihre Netzwerkverbindung und die Serveradresse.', + 'onboarding.desktopRecovery.remoteUnreachable.retry': 'Verbindung erneut versuchen', + 'onboarding.desktopRecovery.incompatibleServer.title': 'Inkompatibler Server', + 'onboarding.desktopRecovery.incompatibleServer.description': 'Der Server unter "{host}" läuft nicht unter OpenChamber. Überprüfen Sie, ob die Adresse auf einen OpenChamber-Server zeigt.', + 'onboarding.desktopRecovery.remoteIncompatible.title': 'Server-Update erforderlich', + 'onboarding.desktopRecovery.remoteIncompatible.description': 'Der OpenChamber-Server unter "{host}" ist nicht kompatibel mit dieser App-Version. Aktualisieren Sie OpenChamber auf dem Server und versuchen Sie es dann erneut.', + 'onboarding.desktopRecovery.common.useLocal': 'Lokal verwenden', + 'onboarding.desktopRecovery.common.useRemote': 'Remote verwenden', + 'onboarding.desktopRecovery.actions.retrying': 'Erneuter Versuch…', + 'onboarding.desktopRecovery.actions.retryConnection': 'Verbindung erneut versuchen', + 'startup.initRecovery.title': 'Start fehlgeschlagen', + 'startup.initRecovery.description': 'OpenChamber konnte die Initialisierung nicht abschließen. Überprüfen Sie, ob der Server läuft, und versuchen Sie es dann erneut.', + 'startup.initRecovery.retry': 'Erneut versuchen', + 'startup.initRecovery.retrying': 'Erneuter Versuch…', + 'onboarding.desktopRecovery.placeholders.remoteServer': 'der Remote-Server', + 'onboarding.desktopRecovery.placeholders.unknownServer': 'unbekannt', + 'vscodeLayout.title.chat': 'Chat', + 'vscodeLayout.title.newSession': 'Neue Sitzung', + 'vscodeLayout.title.sessions': 'Sitzungen', + 'vscodeLayout.title.sessionFallback': 'Sitzung', + 'vscodeLayout.actions.backToSessionsAria': 'Zurück zu den Sitzungen', + 'vscodeLayout.actions.archiveAllAria': 'Alle Sitzungen archivieren', + 'vscodeLayout.actions.archiveAllConfirm': 'Alle archivieren', + 'vscodeLayout.actions.archiveAllSuccess': '{count} Sitzung(en) archiviert', + 'vscodeLayout.actions.archiveAllError': 'Fehler beim Archivieren von {count} Sitzung(en)', + 'vscodeLayout.actions.cancel': 'Abbrechen', + 'vscodeLayout.actions.newSessionAria': 'Neue Sitzung', + 'vscodeLayout.actions.openAgentManagerAria': 'Agenten-Manager öffnen', + 'vscodeLayout.actions.resizeSessionsSidebarAria': 'Größe der Sitzungs-Seitenleiste anpassen', + 'vscodeLayout.actions.settingsAria': 'Einstellungen', + 'vscodeLayout.quota.title': 'Ratenlimits', + 'vscodeLayout.quota.mode.used': 'Verwendet', + 'vscodeLayout.quota.mode.remaining': 'Verbleibend', + 'vscodeLayout.quota.lastUpdated': 'Zuletzt aktualisiert {time}', + 'vscodeLayout.quota.noRateLimitsAvailable': 'Keine Ratenlimits verfügbar.', + 'vscodeLayout.quota.noRateLimitsReported': 'Keine Ratenlimits gemeldet.', + 'vscodeLayout.quota.actions.rateLimitsAria': 'Ratenlimits', + 'vscodeLayout.quota.actions.showUsedAria': 'Verwendete Quote anzeigen', + 'vscodeLayout.quota.actions.showRemainingAria': 'Verbleibende Quote anzeigen', + 'vscodeLayout.quota.actions.refreshAria': 'Ratenlimits aktualisieren', + 'updateDialog.header.updateAvailable': 'Update verfügbar', + 'updateDialog.header.updating': 'OpenChamber wird aktualisiert...', + 'updateDialog.status.installingUpdate': 'Update wird installiert...', + 'updateDialog.status.serverRestarting': 'Server wird neu gestartet...', + 'updateDialog.status.waitingForServer': 'Warten auf Server...', + 'updateDialog.status.autoReloadHint': 'Die Seite wird automatisch neu geladen, wenn das Update abgeschlossen ist.', + 'updateDialog.fallback.updateViaTerminal': 'Oder aktualisieren über Terminal:', + 'updateDialog.actions.copyCommand': 'Befehl kopieren', + 'updateDialog.actions.copied': 'Kopiert!', + 'updateDialog.status.downloadingPayload': 'Update-Payload wird heruntergeladen...', + 'updateDialog.actions.downloadUpdate': 'Update herunterladen', + 'updateDialog.status.downloading': 'Herunterladen...', + 'updateDialog.actions.restartToUpdate': 'Neu starten zum Aktualisieren', + 'updateDialog.actions.updateNow': 'Jetzt aktualisieren', + 'updateDialog.actions.openMobileUpdate': 'Update öffnen', + 'updateDialog.status.updating': 'Aktualisierung läuft...', + 'updateDialog.error.updateFailed': 'Aktualisierung fehlgeschlagen', + 'updateDialog.error.takingLonger': 'Die Aktualisierung dauert länger als erwartet. Warten Sie einen Moment und aktualisieren Sie die Seite oder führen Sie folgenden Befehl aus: openchamber update', + 'mobileUpdate.toast.available.title': 'OpenChamber-Update verfügbar', + 'mobileUpdate.toast.available.description': 'Version {version} ist für Android bereit.', + 'mobileUpdate.toast.actions.download': 'Herunterladen', + 'mobileUpdate.toast.actions.dismiss': 'Ablehnen', + 'opencodeUpdate.toast.available.title': 'OpenCode-Update', + 'opencodeUpdate.toast.available.description': 'Version {version} verfügbar.', + 'opencodeUpdate.toast.actions.update': 'Aktualisieren', + 'opencodeUpdate.toast.actions.dismiss': 'Ablehnen', + 'opencodeUpdate.toast.actions.reload': 'OpenCode neu laden', + 'opencodeUpdate.toast.upgrading.title': 'OpenCode wird aktualisiert...', + 'opencodeUpdate.toast.upgrading.description': 'Behalten Sie OpenChamber geöffnet.', + 'opencodeUpdate.toast.updated.title': 'OpenCode aktualisiert', + 'opencodeUpdate.toast.updated.description': 'Update installiert.', + 'opencodeUpdate.toast.updated.descriptionWithVersion': 'Version {version} installiert.', + 'opencodeUpdate.toast.failed.title': 'Konnte OpenCode nicht aktualisieren', + 'opencodeUpdate.toast.failed.description': 'Das OpenCode-Upgrade ist fehlgeschlagen.', + 'opencodeUpdate.toast.reload.message': 'OpenCode wird neu gestartet...', + 'memoryDebugPanel.title': 'Debug Panel', + 'memoryDebugPanel.tabs.memory': 'Speicher', + 'memoryDebugPanel.tabs.streaming': 'Streaming', + 'memoryDebugPanel.section.sessionsInMemory': 'Sitzungen im Speicher', + 'memoryDebugPanel.section.uiStreamingMetrics': 'UI-Streaming-Metriken', + 'memoryDebugPanel.section.vscodeBridgeMetrics': 'VS Code Bridge Metriken', + 'memoryDebugPanel.section.noUiSamples': 'Noch keine UI-Streaming-Proben. Starten Sie einen Stream und lassen Sie dieses Panel geöffnet.', + 'memoryDebugPanel.section.noVscodeSamples': 'Noch keine VS Code Bridge Proben.', + 'memoryDebugPanel.metric.totalMessages': 'Gesamte Nachrichten', + 'memoryDebugPanel.metric.cachedSessions': 'Zwischengespeicherte Sitzungen', + 'memoryDebugPanel.metric.userMessages': 'Benutzernachrichten', + 'memoryDebugPanel.metric.assistantMessages': 'Assistentennachrichten', + 'memoryDebugPanel.metric.viewportWindow': 'Viewport-Fenster', + 'memoryDebugPanel.metric.zombieTimeout': 'Zombie-Timeout', + 'memoryDebugPanel.metric.githubTotalRequests': 'GitHub Gesamtanfragen', + 'memoryDebugPanel.metric.metrics': 'Metriken', + 'memoryDebugPanel.metric.samples': 'Proben', + 'memoryDebugPanel.metric.lastUpdate': 'Letzte Aktualisierung', + 'memoryDebugPanel.metric.uiMetrics': 'UI-Metriken', + 'memoryDebugPanel.metric.vscodeMetrics': 'VS Code Metriken', + 'memoryDebugPanel.metric.messageListRenders': 'MsgList Rendern', + 'memoryDebugPanel.metric.messageListStreamRenders': 'MsgList Stream Rendern', + 'memoryDebugPanel.metric.chatMessageRenders': 'ChatMessage Rendern', + 'memoryDebugPanel.metric.chatMessageStreamRenders': 'ChatMessage Stream Rendern', + 'memoryDebugPanel.metric.chatMessageStaticDuringStream': 'ChatMessage statisch während Stream', + 'memoryDebugPanel.metric.chatMessageStaticOutsideActiveTurn': 'ChatMessage statisch außerhalb aktiver Runde', + 'memoryDebugPanel.metric.messagesValue': '{count} Nachrichten', + 'memoryDebugPanel.metric.minutesValue': '{count} Minuten', + 'memoryDebugPanel.metric.msgsValue': '{count} msgs', + 'memoryDebugPanel.metric.roleMsgsValue': 'U {user} / A {assistant}', + 'memoryDebugPanel.metric.countValue': 'count {value}', + 'memoryDebugPanel.metric.avgValue': 'avg {value}', + 'memoryDebugPanel.metric.maxValue': 'max {value}', + 'memoryDebugPanel.metric.totalValue': 'total {value}', + 'memoryDebugPanel.actions.logState': 'Status protokollieren', + 'memoryDebugPanel.actions.copyJson': 'JSON kopieren', + 'memoryDebugPanel.tooltip.logCurrentState': 'Aktuellen Speicherstatus in die Browser-Konsole protokollieren', + 'memoryDebugPanel.streaming.copy.copied': 'Streaming-Debug-JSON kopiert', + 'memoryDebugPanel.streaming.copy.failed': 'Fehler beim Kopieren der JSON-Datei', + 'memoryDebugPanel.streaming.copy.hint': 'Kopieren exportiert sowohl UI- als auch VS Code-Streaming-Metriken als JSON', + 'memoryDebugPanel.common.idle': 'inaktiv', + 'memoryDebugPanel.common.live': 'live', + 'memoryDebugPanel.common.notAvailable': 'n/a', + 'memoryDebugPanel.common.untitled': 'Unbenannt', + 'directoryTree.field.newDirectoryPlaceholder': 'neues_verzeichnis', + 'textarea.resizeHandleAria': 'Größe des Textbereichs ändern', + 'sidebar.resize.leftPanelAria': 'Größe des linken Panels ändern', + 'sidebar.resize.rightPanelAria': 'Größe des rechten Panels ändern', + 'mainLayout.mobile.closeDrawerAria': 'Drawer schließen', + 'sortableTabsStrip.aria.tabs': 'Tabs', + 'openChamberLogo.aria.logo': 'OpenChamber-Logo', + 'markdownRenderer.code.actions.copyTitle': 'Code kopieren', + 'markdownRenderer.code.actions.copiedTitle': 'Kopiert', + 'markdownRenderer.table.actions.copyTitle': 'Tabelle kopieren', + 'markdownRenderer.code.actions.enableWrapTitle': 'Zeilenumbruch aktivieren', + 'markdownRenderer.code.actions.disableWrapTitle': 'Zeilenumbruch deaktivieren', + 'markdownRenderer.table.actions.downloadTitle': 'Tabelle herunterladen', + 'markdownRenderer.table.toast.downloadedAsFormat': 'Tabelle als {format} heruntergeladen', + 'markdownRenderer.mermaid.actions.copyTitle': 'Kopieren', + 'markdownRenderer.mermaid.actions.copySourceTitle': 'Quelle kopieren', + 'markdownRenderer.mermaid.actions.downloadSvgTitle': 'SVG herunterladen', + 'markdownRenderer.mermaid.actions.zoomInTitle': 'Vergrößern', + 'markdownRenderer.mermaid.actions.zoomOutTitle': 'Verkleinern', + 'markdownRenderer.mermaid.actions.resetViewTitle': 'Ansicht zurücksetzen', + 'markdownRenderer.mermaid.toast.downloadFailed': 'Fehler beim Herunterladen des Diagramms', + 'common.date.today': 'Heute', + 'common.date.yesterday': 'Gestern', + 'common.date.yesterdayWithTime': 'Gestern {time}', + 'common.relative.justNow': 'Gerade jetzt', + 'common.relative.minutesAgoShort': '{count}min her', + 'common.relative.hoursAgoShort': '{count}h her', + 'common.relative.daysAgoShort': '{count}d her', + 'common.relative.weeksAgoShort': '{count}w her', + 'common.relative.yearsAgoShort': '{count}y her', + 'common.relative.daysAgoCompact': '{count}d her', + 'common.relative.weeksAgoCompact': '{count}w her', + 'common.relative.yearsAgoCompact': '{count}y her', + 'contextFileOpen.failure.tooLarge': 'Datei ist zu groß zum Öffnen (>{count} Zeilen)', + 'contextFileOpen.failure.missing': 'Datei nicht gefunden', + 'contextFileOpen.failure.unreadable': 'Fehler beim Öffnen der Datei', + 'quota.window.5h': '5-Stunden-Limit', + 'quota.window.7d': '7-Tage-Limit', + 'quota.window.7dSonnet': '7-Tage Sonnet-Limit', + 'quota.window.7dOpus': '7-Tage Opus-Limit', + 'quota.window.weekly': 'Wöchentliches Limit', + 'quota.window.daily': 'Täglich', + 'quota.window.monthly': 'Monatliches Limit', + 'quota.window.credits': 'Credits', + 'quota.window.creditsBalance': 'Kreditguthaben', + 'quota.window.billingCycle': 'Abrechnungszyklus', + 'quota.window.auto': 'Automatisch', + 'quota.window.api': 'API', + 'quota.window.planLimit': 'Planlimit', + 'quota.window.onDemand': 'On-Demand', + 'quota.window.session': 'Sitzung', + 'quota.window.premium': 'Premium-Interaktionen', + 'quota.window.chat': 'Chat-Anfragen', + 'quota.window.completions': 'Vervollständigungen', + 'quota.window.premiumInteractions': 'Premium-Interaktionen', + 'terminalView.actions.attachSelection': 'Ausgewählte Ausgabe anhängen', + 'terminalView.actions.restart': 'Terminal neu starten', + 'chat.message.terminalContext': '{terminal}, Zeilen {start}-{end}', + 'chat.chatInput.terminalContext': '{terminal}, Zeilen {start}-{end}', + 'chat.chatInput.terminalContextRemove': 'Terminal-Kontext entfernen', + 'chat.chatInput.prCommentContext': 'PR-Kommentare', + 'chat.chatInput.prCommentContextRemove': 'PR-Kommentarkontext entfernen', + 'chat.chatInput.prCheckContext': 'Fehlgeschlagene PR-Prüfungen', + 'chat.chatInput.prCheckContextRemove': 'Kontext der PR-Prüfungen entfernen', + 'mobile.connect.notice.unreachable': '{label} konnte nicht erreicht werden. Prüfen Sie, ob der Server läuft.', + 'mobile.connect.notice.authExpired': 'Der Zugriff auf {label} ist abgelaufen oder wurde widerrufen. Melden Sie sich erneut an.', + 'mobile.connect.recovery.description': 'Verbindung mit dem gespeicherten Server nicht möglich. Prüfen Sie, ob er läuft, oder wählen Sie eine andere Instanz.', + 'mobile.header.openWorkspaceAria': 'Arbeitsbereich öffnen', + 'mobile.menu.terminal': 'Terminal', + 'mobile.sessions.renameSessionAria': '{title} umbenennen', + 'mobile.sessions.renameError': 'Sitzung konnte nicht umbenannt werden', + 'mobile.sessions.deleteSessionAria': '{title} löschen', + 'mobile.sessions.confirmDeleteSessionAria': 'Löschen von {title} bestätigen', + 'mobile.files.editAria': 'Datei bearbeiten', + 'mobile.files.doneEditingAria': 'Bearbeitung abschließen', + 'sessions.scheduledTasks.editor.permissionAutoAccept.label': 'Berechtigungen automatisch akzeptieren', + 'sessions.scheduledTasks.editor.permissionAutoAccept.aria': 'Die Sitzung der Aufgabe mit aktivierter automatischer Berechtigungsannahme starten', + 'sessions.archivePage.allDirectories': 'Alle Verzeichnisse', + 'sessions.sidebar.header.displayMode.stickyHeaders': 'Angeheftete Projektüberschriften', + 'sessions.sidebar.header.grouping.label': 'Sitzungen gruppieren', + 'sessions.sidebar.header.grouping.byWorktree': 'Nach Worktree', + 'sessions.sidebar.header.grouping.flat': 'Flache Liste', + 'sessions.sidebar.project.actions.manageWorktrees': 'Worktrees verwalten', + 'sessions.worktreesPage.title': 'Worktrees in {project}', + 'sessions.worktreesPage.description': 'Git-Worktrees für dieses Projekt erstellen, prüfen und entfernen.', + 'sessions.worktreesPage.closeAria': 'Worktrees schließen', + 'sessions.scheduledTasks.page.closeAria': 'Geplante Aufgaben schließen', + 'sessions.sidebar.nav.archive': 'Archiv', + 'sessions.archivePage.title': 'Archiv', + 'sessions.archivePage.countSingle': '{count} archivierte Sitzung', + 'sessions.archivePage.countPlural': '{count} archivierte Sitzungen', + 'sessions.archivePage.closeAria': 'Archiv schließen', + 'sessions.archivePage.searchPlaceholder': 'Archivierte Sitzungen durchsuchen', + 'sessions.archivePage.empty.noArchived': 'Keine archivierten Sitzungen', + 'sessions.archivePage.empty.noMatches': 'Keine passenden archivierten Sitzungen', + 'sessions.archivePage.otherProjects': 'andere Projekte', + 'sessions.archivePage.deleteProject': 'Alle archivierten Sitzungen in diesem Projekt löschen', + 'sessions.archivePage.deleteProjectAria': 'Alle archivierten Sitzungen in {label} löschen', + 'sessions.archivePage.deleteSessionAria': '{title} löschen', + 'header.sessionActions.openAria': 'Sitzungsaktionen öffnen', + 'sessions.sidebar.session.menu.copyId': 'Sitzungs-ID kopieren', + 'sessions.sidebar.session.copyId.success': 'Sitzungs-ID kopiert', + 'sessions.sidebar.session.copyId.error': 'Sitzungs-ID konnte nicht kopiert werden', + 'sessions.sidebar.session.menu.moveToWorktree': 'In neuen Worktree verschieben', + 'sessions.sidebar.session.moveToWorktree.success': 'Sitzung in einen neuen Worktree verschoben', + 'sessions.sidebar.session.moveToWorktree.failed': 'Sitzung konnte nicht in einen neuen Worktree verschoben werden', + 'sessions.sidebar.session.moveToWorktree.tooltip': 'Erstellt einen neuen Worktree aus dem aktuellen Branch, überträgt nicht gespeicherte Änderungen und verschiebt diese Sitzung samt Untersitzungen dorthin.', + 'sessions.sidebar.session.moveToWorktree.tooltipBusy': 'Verfügbar, wenn die Sitzung inaktiv ist. Warten Sie oder beenden Sie die aktuelle Aktivität.', + 'sessions.sidebar.session.moveToWorktree.tooltipMoving': 'Diese Sitzung wird bereits in einen neuen Worktree verschoben.', + 'sessions.sidebar.session.export.failedLoadHistory': 'Die vollständige Sitzungshistorie konnte nicht geladen werden', + 'sessions.sidebar.session.status.movingToWorktree': 'Sitzung wird in einen neuen Worktree verschoben', + 'gitView.header.updateBranch': 'Branch aktualisieren', + 'gitView.header.openPullRequest': 'Pull Request öffnen', + 'gitView.history.refresh': 'Verlauf aktualisieren', + 'gitView.operation.inProgressTitleManyConflicts': 'Operation {operation} läuft: {count} Konflikte', + 'gitView.operation.inProgressTitleOneConflict': 'Operation {operation} läuft: {count} Konflikt', + 'gitView.operation.readyToContinueHint': 'Bereit zum Fortfahren', + 'gitView.pr.segment.overview': 'Übersicht', + 'gitView.pr.segment.checks': 'Prüfungen', + 'gitView.pr.segment.comments': 'Kommentare', + 'gitView.pr.comments.addAll': 'Alle hinzufügen', + 'contextPanel.mode.pr': 'PR', + 'contextRail.aria.rail': 'Kontextleiste', + 'contextPanel.editorEmpty.title': 'Kein Kontext ausgewählt', + 'contextPanel.editorEmpty.description': 'Wählen Sie etwas aus der Seitenleiste aus, um Kontext anzuzeigen.', + 'contextRail.surface.editor.description': 'Bearbeitungskontext', + 'contextRail.surface.git.description': 'Git-Kontext', + 'contextRail.surface.terminal.description': 'Terminal-Kontext', + 'contextRail.surface.diff.description': 'Diff-Kontext', + 'contextPanel.mode.walkthrough': 'Walkthrough', + 'contextRail.surface.walkthrough.description': 'Walkthrough-Kontext', + 'walkthrough.scope.all': 'Alle', + 'walkthrough.scope.group.workingTree': 'Arbeitsbaum', + 'walkthrough.scope.group.committed': 'Eingecheckt', + 'walkthrough.scope.staged': 'Bereitgestellt', + 'walkthrough.scope.working': 'Arbeitsstand', + 'walkthrough.scope.branch': 'Branch', + 'walkthrough.scope.selectorAria': 'Walkthrough-Bereich auswählen', + 'walkthrough.language.menuLabel': 'Sprache', + 'walkthrough.missing.language': 'Noch kein Walkthrough auf {requested} vorhanden — zeige den Walkthrough auf {shown}.', + 'walkthrough.missing.model': 'Noch kein Walkthrough von {model} vorhanden — zeige den zuletzt hier erstellten.', + 'walkthrough.missing.languageAndModel': 'Noch kein Walkthrough auf dieser Sprache von diesem Modell vorhanden — zeige den zuletzt hier erstellten.', + 'walkthrough.language.selectorAria': 'Sprache auswählen', + 'walkthrough.scope.pullRequest': 'PR #{number}', + 'walkthrough.action.generate': 'Generieren', + 'walkthrough.action.regenerate': 'Erneut generieren', + 'walkthrough.action.cancel': 'Abbrechen', + 'walkthrough.action.next': 'Weiter', + 'walkthrough.action.previous': 'Zurück', + 'walkthrough.action.refresh': 'Aktualisieren', + 'walkthrough.action.open': 'Öffnen', + 'walkthrough.stage.collecting': 'Sammeln', + 'walkthrough.stage.asking': 'Fragen', + 'walkthrough.stage.assembling': 'Zusammenstellen', + 'walkthrough.empty.title': 'Noch nichts vorhanden', + 'walkthrough.empty.description': 'Wählen Sie Inhalte aus, um einen Walkthrough zu erstellen.', + 'walkthrough.stale.banner': 'Der Code hat sich nach diesem Review geändert. Veraltete Schritte: {count}', + 'walkthrough.stop.staleAll': 'Alle veralteten Inhalte stoppen', + 'walkthrough.stop.stalePartial': 'Ein Teil des vom Schritt beschriebenen Codes hat sich geändert. Fehlende Teile: {count}', + 'walkthrough.stop.staleShort': 'Veraltete stoppen', + 'walkthrough.stop.noCode': 'Kein Code vorhanden', + 'walkthrough.uncovered.title': 'Vom Review ausgelassene Änderungen: {count}', + 'walkthrough.uncovered.description': 'Diese Bereiche wurden noch nicht in den Walkthrough aufgenommen.', + 'walkthrough.toc.moreFiles': 'Weitere Dateien: {count}', + 'walkthrough.toc.uncovered': 'Nicht abgedeckt: {count}', + 'walkthrough.toc.resize': 'Größe ändern', + 'walkthrough.importance.critical': 'Kritisch', + 'walkthrough.importance.context': 'Kontext', + 'walkthrough.blocked.noModel.title': 'Kein Modell ausgewählt', + 'walkthrough.blocked.noModel.description': 'Wählen Sie zuerst ein Modell aus.', + 'walkthrough.blocked.emptyDiff.title': 'Kein Diff vorhanden', + 'walkthrough.blocked.emptyDiff.description': 'Es gibt keine Änderungen, die zusammengefasst werden können.', + 'walkthrough.blocked.contextTooSmall.title': 'Kontext zu klein', + 'walkthrough.blocked.contextTooSmall.description': '{model} passt in etwa {available}K Zeichen, und dieser Diff braucht etwa {required}K. Nichts wird abgeschnitten — wähle stattdessen ein Modell mit größerem Kontext.', + 'walkthrough.blocked.structuredOutput.title': 'Strukturierte Ausgabe nicht verfügbar', + 'walkthrough.blocked.structuredOutput.description': '{model} unterstützt die strukturierten Antworten nicht, die ein Walkthrough benötigt.', + 'walkthrough.blocked.chooseModel': 'Modell auswählen', + 'walkthrough.blocked.outputExhausted.title': 'Ausgabelimit erreicht', + 'walkthrough.blocked.outputExhausted.description': '{model} hat sein gesamtes Ausgabelimit fürs Nachdenken verbraucht und nichts zurückgegeben. Denkende Modelle tun das bei großen Diffs oft — ein Modell, das weniger denkt, oder ein schmalerer Review-Bereich reicht eher aus.', + 'walkthrough.blocked.outputExhausted.descriptionUnknownModel': 'Das kleine Modell hat sein gesamtes Ausgabelimit fürs Nachdenken verbraucht und nichts zurückgegeben. Denkende Modelle tun das bei großen Diffs oft — ein Modell, das weniger denkt, oder ein schmalerer Review-Bereich reicht eher aus.', + 'walkthrough.blocked.onlyGenerated.title': 'Nur generierter Inhalt', + 'walkthrough.blocked.onlyGenerated.description': 'Es ist nur generierter Inhalt vorhanden.', + 'walkthrough.blocked.contextTooSmall.descriptionUnknownModel': 'Das kleine Modell passt in etwa {available}K Zeichen, und dieser Diff braucht etwa {required}K. Nichts wird abgeschnitten — wähle stattdessen ein Modell mit größerem Kontext.', + 'walkthrough.blocked.structuredOutput.descriptionUnknownModel': 'Das kleine Modell unterstützt die strukturierten Antworten nicht, die ein Walkthrough benötigt.', + 'contextRail.surface.plan.description': 'Plankontext', + 'contextRail.surface.pr.description': 'PR-Kontext', + 'contextRail.surface.notes.description': 'Notizkontext', + 'contextRail.surface.context.description': 'Allgemeiner Kontext', + 'contextRail.surface.browser.description': 'Browserkontext', + 'contextRail.surface.preview.description': 'Vorschaukontext', + 'contextRail.surface.chat.description': 'Chatkontext', + 'contextRail.surface.notes': 'Notizen', + 'contextRail.editorTree.toggle': 'Editorbaum umschalten', + 'sidebarFilesTree.actions.collapseAllTitle': 'Alle einklappen', + 'filesView.editor.cannotPreviewBinary': 'Binärdatei kann nicht in der Vorschau angezeigt werden', + 'filesView.editor.binaryFileDescription': 'Diese Datei ist binär und kann nicht als Text angezeigt werden.', + 'chat.goal.dialog.evaluationModelLabel': 'Bewertungsmodell', + 'terminalView.quickKeys.altLabel': 'Alt', + 'terminalView.quickKeys.altModifierAria': 'Alt-Taste', + 'chat.draftPresets.scheduleTask.label': 'Aufgabe planen', + 'chat.statusRow.modelStatus': '{model} ist {status}', + 'chat.commandAutocomplete.command.scheduleTaskDescription': 'Eine geplante Aufgabe erstellen', + 'chat.chatInput.toast.scheduleTaskFailed': 'Aufgabe konnte nicht geplant werden', + 'chat.container.sessionLoadError.title': 'Sitzung konnte nicht geladen werden', + 'chat.container.sessionLoadError.description': 'Die Sitzung konnte nicht geladen werden.', + 'chat.container.sessionLoadError.retry': 'Erneut versuchen', + 'sessions.sidebar.group.empty.loadingSessions': 'Sitzungen werden geladen...', + 'sessions.sidebar.group.empty.loadFailed': 'Sitzungen konnten nicht geladen werden', + 'sessions.sidebar.group.empty.retry': 'Erneut versuchen', + 'chat.messageBody.actions.pinContext': 'Kontext anheften', + 'chat.messageBody.actions.unpinContext': 'Kontext lösen', + 'chat.messageBody.actions.contextPinFailed': 'Kontext konnte nicht angeheftet werden', + 'chat.chatInput.toast.unsupportedAttachmentModalities': '{model} unterstützt den von {files} benötigten Eingabetyp {modalities} nicht. Du kannst die Nachricht trotzdem senden, aber diese Anhänge werden möglicherweise ignoriert.', + 'projectActions.actions.autoDiscoverTooltip': 'Automatisch erkannte Aktionen', + 'onboarding.localSetup.windows.stepInstallWslSuffix': 'WSL installieren', + 'chat.goal.toast.distillFallback': 'Das Ziel überschritt das Limit und konnte nicht verdichtet werden — für die Auswertung wird eine gekürzte Version verwendet', + 'onboarding.localSetup.actions.checkAndContinue': 'Installation abgeschlossen, prüfen und fortfahren', + 'onboarding.localSetup.status.autoContinue': 'Wir fahren automatisch fort, sobald die Installation erkannt wurde.', + 'updateDialog.changelog.title': 'Neuigkeiten', +}; diff --git a/packages/ui/src/lib/i18n/messages/en.ts b/packages/ui/src/lib/i18n/messages/en.ts index 703c09de..7b63e05e 100644 --- a/packages/ui/src/lib/i18n/messages/en.ts +++ b/packages/ui/src/lib/i18n/messages/en.ts @@ -14,6 +14,7 @@ export const dict = { 'common.loading': 'Loading...', 'common.unavailable': 'Unavailable', 'common.language.english': 'English', + 'common.language.german': 'German', 'common.language.french': 'French', 'common.language.simplifiedChinese': 'Chinese (Simplified)', 'common.language.traditionalChinese': 'Chinese (Traditional)', diff --git a/packages/ui/src/lib/i18n/messages/es.ts b/packages/ui/src/lib/i18n/messages/es.ts index 8bf0a3d9..08a3f727 100644 --- a/packages/ui/src/lib/i18n/messages/es.ts +++ b/packages/ui/src/lib/i18n/messages/es.ts @@ -15,6 +15,7 @@ export const dict: Record = { "common.loading": "Cargando...", "common.unavailable": "No disponible", "common.language.english": "Inglés", + "common.language.german": "Alemán", "common.language.french": "Francés", "common.language.simplifiedChinese": "Chino (simplificado)", "common.language.traditionalChinese": "Chino (tradicional)", diff --git a/packages/ui/src/lib/i18n/messages/fr.ts b/packages/ui/src/lib/i18n/messages/fr.ts index 8fe1e83a..2f99e4f4 100644 --- a/packages/ui/src/lib/i18n/messages/fr.ts +++ b/packages/ui/src/lib/i18n/messages/fr.ts @@ -14,6 +14,7 @@ export const dict = { 'common.loading': 'Chargement...', 'common.unavailable': 'Indisponible', 'common.language.english': 'Anglais', + 'common.language.german': 'Allemand', 'common.language.french': 'Français', 'common.language.simplifiedChinese': 'Chinois (simplifié)', 'common.language.traditionalChinese': 'Chinois (traditionnel)', diff --git a/packages/ui/src/lib/i18n/messages/ja.ts b/packages/ui/src/lib/i18n/messages/ja.ts index 1fa51ddf..e7c7d111 100644 --- a/packages/ui/src/lib/i18n/messages/ja.ts +++ b/packages/ui/src/lib/i18n/messages/ja.ts @@ -15,6 +15,7 @@ export const dict: Record = { 'common.loading': '読み込み中...', 'common.unavailable': '利用できません', 'common.language.english': '英語', + 'common.language.german': 'ドイツ語', 'common.language.french': 'フランス語', 'common.language.simplifiedChinese': '中国語(簡体字)', 'common.language.traditionalChinese': '中国語(繁体字)', diff --git a/packages/ui/src/lib/i18n/messages/ko.ts b/packages/ui/src/lib/i18n/messages/ko.ts index 4b1c9a8f..5e2983be 100644 --- a/packages/ui/src/lib/i18n/messages/ko.ts +++ b/packages/ui/src/lib/i18n/messages/ko.ts @@ -15,6 +15,7 @@ export const dict: Record = { 'common.loading': '로딩 중...', 'common.unavailable': '사용할 수 없음', 'common.language.english': '영어', + 'common.language.german': '독일어', 'common.language.french': '프랑스어', 'common.language.simplifiedChinese': '중국어(간체)', 'common.language.traditionalChinese': '중국어(번체)', diff --git a/packages/ui/src/lib/i18n/messages/pl.ts b/packages/ui/src/lib/i18n/messages/pl.ts index 657a331e..f4129c47 100644 --- a/packages/ui/src/lib/i18n/messages/pl.ts +++ b/packages/ui/src/lib/i18n/messages/pl.ts @@ -16,6 +16,7 @@ export const dict: Record = { 'common.loading': 'Ładowanie...', 'common.unavailable': 'Niedostępne', 'common.language.english': 'Angielski', + 'common.language.german': 'Niemiecki', 'common.language.french': 'Francuski', 'common.language.simplifiedChinese': 'Chiński (Uproszczony)', 'common.language.traditionalChinese': 'Chiński (Tradycyjny)', diff --git a/packages/ui/src/lib/i18n/messages/pt-BR.ts b/packages/ui/src/lib/i18n/messages/pt-BR.ts index 0f6b1730..a9c3bca9 100644 --- a/packages/ui/src/lib/i18n/messages/pt-BR.ts +++ b/packages/ui/src/lib/i18n/messages/pt-BR.ts @@ -15,6 +15,7 @@ export const dict: Record = { "common.loading": "Carregando...", "common.unavailable": "Indisponível", "common.language.english": "Inglês", + "common.language.german": "Alemão", "common.language.french": "Francês", "common.language.simplifiedChinese": "Chinês (simplificado)", "common.language.traditionalChinese": "Chinês (tradicional)", diff --git a/packages/ui/src/lib/i18n/messages/uk.ts b/packages/ui/src/lib/i18n/messages/uk.ts index 71f45507..c1c3d7cc 100644 --- a/packages/ui/src/lib/i18n/messages/uk.ts +++ b/packages/ui/src/lib/i18n/messages/uk.ts @@ -15,6 +15,7 @@ export const dict: Record = { "common.loading": "Завантаження...", "common.unavailable": "Недоступно", "common.language.english": "англійська", + "common.language.german": "Німецька", "common.language.french": "Французька", "common.language.simplifiedChinese": "Китайська (спрощена)", "common.language.traditionalChinese": "Китайська (традиційна)", diff --git a/packages/ui/src/lib/i18n/messages/zh-CN.ts b/packages/ui/src/lib/i18n/messages/zh-CN.ts index ae9126f6..9fef7f48 100644 --- a/packages/ui/src/lib/i18n/messages/zh-CN.ts +++ b/packages/ui/src/lib/i18n/messages/zh-CN.ts @@ -15,6 +15,7 @@ export const dict: Record = { 'common.loading': '加载中...', 'common.unavailable': '不可用', 'common.language.english': 'English', + 'common.language.german': '德语', 'common.language.french': '法语', 'common.language.simplifiedChinese': '简体中文', 'common.language.traditionalChinese': '繁体中文', diff --git a/packages/ui/src/lib/i18n/messages/zh-TW.ts b/packages/ui/src/lib/i18n/messages/zh-TW.ts index cc1c707c..2615292a 100644 --- a/packages/ui/src/lib/i18n/messages/zh-TW.ts +++ b/packages/ui/src/lib/i18n/messages/zh-TW.ts @@ -15,6 +15,7 @@ export const dict: Record = { 'common.loading': '載入中...', 'common.unavailable': '無法使用', 'common.language.english': 'English', + 'common.language.german': '德語', 'common.language.french': '法語', 'common.language.simplifiedChinese': '簡體中文', 'common.language.traditionalChinese': '繁體中文', diff --git a/packages/ui/src/lib/i18n/runtime.ts b/packages/ui/src/lib/i18n/runtime.ts index a80ad5a0..3fcd25ec 100644 --- a/packages/ui/src/lib/i18n/runtime.ts +++ b/packages/ui/src/lib/i18n/runtime.ts @@ -1,10 +1,10 @@ -export type Locale = 'en' | 'fr' | 'zh-CN' | 'zh-TW' | 'uk' | 'es' | 'pt-BR' | 'ko' | 'pl' | 'ja'; +export type Locale = 'en' | 'de' | 'fr' | 'zh-CN' | 'zh-TW' | 'uk' | 'es' | 'pt-BR' | 'ko' | 'pl' | 'ja'; -export const LOCALES = ['en', 'fr', 'zh-CN', 'zh-TW', 'uk', 'es', 'pt-BR', 'ko', 'pl', 'ja'] as const satisfies readonly Locale[]; +export const LOCALES = ['en', 'de', 'fr', 'zh-CN', 'zh-TW', 'uk', 'es', 'pt-BR', 'ko', 'pl', 'ja'] as const satisfies readonly Locale[]; export const DEFAULT_LOCALE: Locale = 'en'; -export const LOCALE_LABEL_KEYS: Record = { +export const LOCALE_LABEL_KEYS: Record = { en: 'common.language.english', fr: 'common.language.french', 'zh-CN': 'common.language.simplifiedChinese', @@ -14,6 +14,7 @@ export const LOCALE_LABEL_KEYS: Record { ? await import('./messages/ko') as { dict: I18nDictionary } : locale === 'pl' ? await import('./messages/pl') as { dict: I18nDictionary } - : locale === 'ja' - ? await import('./messages/ja') as { dict: I18nDictionary } - : { dict: enDict }; + : locale === 'de' + ? await import('./messages/de') as { dict: I18nDictionary } + : locale === 'ja' + ? await import('./messages/ja') as { dict: I18nDictionary } + : { dict: enDict }; dictionaries.set(locale, mod.dict); return mod.dict; }