localization: ship de-DE

Complete German catalog across all three namespaces, 1129 keys,
machine-translated then reviewed for terminology and plurals.

Fixed on review: "composer" (the chat input box) had been translated
as "Editor" in two shortcuts strings, colliding with this app's actual
Editor/Code-Editor feature — changed to "Eingabefeld". scopeDockers
had drifted from the lowercase, untranslated "dockers" every other
locale (including this one's own pt-PT/fr-FR precedent) uses for that
filter-scope label. All 17 plural entries verified at count 0/1/2 —
German uses the same one/other split as English, so this was mostly
confirming "0 Elemente" reads right, not hunting for a CLDR surprise
the way French needed.

SHIPPED_LOCALES and the three parity tests now include de-DE. es-ES
is drafted and under review — held out of the picker until it passes
its own pass.
This commit is contained in:
2026-08-23 17:19:59 +00:00
parent 0457bf9ff3
commit d6a3bea7c9
7 changed files with 1444 additions and 4 deletions
@@ -0,0 +1,81 @@
{
"button": {
"cancel": "Abbrechen",
"confirm": "Bestätigen",
"ok": "OK",
"close": "Schließen"
},
"search": {
"placeholder": "Suchen",
"open": "Suche öffnen",
"close": "Suche schließen",
"clear": "Suche leeren"
},
"select": {
"placeholder": "Auswählen..."
},
"tabs": {
"filterPlaceholder": "Filtern"
},
"commandBlock": {
"run": "Im Terminal ausführen",
"copy": "Befehl kopieren"
},
"colorPicker": {
"placeholder": "Hex-Farbe"
},
"state": {
"loading": "Wird geladen…"
},
"dataTable": {
"empty": "Keine Daten gefunden.",
"pagination": {
"showingPage": "Seite {{current}} von {{total}}",
"showingPageShort": "S. {{current}}/{{total}}",
"rowsPerPage": "Zeilen pro Seite",
"perPage": "{{size}} / Seite",
"perPageShort": "{{size}}/S.",
"first": "Erste",
"prev": "Zurück",
"next": "Weiter",
"last": "Letzte"
}
},
"pagination": {
"label": "Seitennummerierung",
"previous": "Zurück",
"next": "Weiter",
"morePages": "Weitere Seiten",
"goToPrevious": "Zur vorherigen Seite",
"goToNext": "Zur nächsten Seite"
},
"carousel": {
"previous": "Vorherige Folie",
"next": "Nächste Folie"
},
"breadcrumb": {
"more": "Mehr"
},
"theme": {
"toggle": "Farbmodus umschalten"
},
"error": {
"forbidden": {
"title": "Zugriff nicht autorisiert",
"description": "Sie sind nicht berechtigt, diese Aktion auszuführen.",
"hint": "Wenn Sie das für einen Fehler halten, wenden Sie sich an Ihre zuständige Person."
},
"unauthorized": {
"title": "Ungültige Anmeldedaten",
"description": "Ihr Zugriffstoken ist abgelaufen",
"hint": "Bitte melden Sie sich erneut an"
},
"server": {
"title": "Serverfehler"
}
},
"logo": {
"icon": "Officer-Symbol",
"logo": "Officer-Logo"
}
}
@@ -3,11 +3,12 @@ import { findMissingKeys } from 'i18n';
import en from './en-GB.json';
import ptPT from './pt-PT.json';
import frFR from './fr-FR.json';
import deDE from './de-DE.json';
// D2: every shipped locale ships a COMPLETE catalog. A key en-GB has and another locale lacks is a red
// build, not a warning — there is no regional fallback to paper over the gap.
describe('shared components (ui.*) locale catalogs', () => {
test('every shipped locale has every key en-GB has', () => {
expect(findMissingKeys(en, { 'pt-PT': ptPT, 'fr-FR': frFR })).toEqual([]);
expect(findMissingKeys(en, { 'pt-PT': ptPT, 'fr-FR': frFR, 'de-DE': deDE })).toEqual([]);
});
});
@@ -0,0 +1,652 @@
{
"common": {
"save": "Speichern",
"delete": "Löschen"
},
"minesweeper": {
"notInstalled": "Minesweeper ist auf diesem Server nicht installiert.",
"needs": "Es benötigt Wine, ein 32-Bit-Prefix und dieses Paket neben der Plattform:",
"notRunning": "Die Minesweeper-Sitzung läuft nicht.",
"error": {
"connectionFailed": "Die Verbindung zur Minesweeper-Sitzung ist fehlgeschlagen.",
"refused": "Der VNC-Server hat die Verbindung abgelehnt.",
"authUnsupported": "Der VNC-Server verlangt eine Authentifizierung, die dieser Client nicht unterstützt.",
"handshakeRejected": "Der VNC-Server hat den Handshake abgelehnt.",
"unknownMessage": "Der VNC-Server hat einen unbekannten Nachrichtentyp gesendet ({{type}}).",
"unknownEncoding": "Der VNC-Server hat die Kodierung {{encoding}} verwendet, die dieser Client nicht angefordert hat."
}
},
"qrTransfer": {
"chooseFile": "Wählen Sie eine Datei zum Senden",
"startScanning": "Scannen starten",
"receiveAnother": "Weitere empfangen",
"stop": "Stopp"
},
"dav": {
"empty": "Noch nichts hier. Fügen Sie eines von einem Telefon- oder Desktop-Client über CalDAV/CardDAV hinzu.",
"calendar": "Kalender",
"contacts": "Kontakte",
"readFailed": "{{name}} konnte nicht gelesen werden: {{reason}}"
},
"terminal": {
"title": "Terminal",
"find": "Suchen",
"runningShells": "Laufende Shells",
"loading": "Wird geladen…",
"noShells": "Keine laufenden Shells.",
"refresh": "Aktualisieren",
"kill": "Diese Shell beenden"
},
"appStore": {
"loading": "Wird geladen",
"loadFailed": "Der App Store konnte nicht geladen werden.",
"installed": "Installiert",
"available": "Verfügbar",
"needsYou": "Braucht Sie",
"needsYouShort": "braucht Sie",
"selectApp": "Wählen Sie eine App aus",
"installFailed": "Installation fehlgeschlagen",
"uninstall": "Deinstallieren",
"enable": "Aktivieren",
"disable": "Deaktivieren",
"enabled": "aktiviert",
"disabled": "deaktiviert",
"removalNote": "Deaktivieren stoppt den Sidecar und seinen Container. Deinstallieren entfernt auch die Container — Ihre Daten, die Konfiguration und die Tabellen dieser App bleiben in beiden Fällen erhalten.",
"installing": "wird installiert",
"failed": "fehlgeschlagen",
"installedIcon": "installiert"
},
"systemMonitor": {
"cpuPackage": "CPU-Paket",
"user": "Benutzer",
"cpuPct": "CPU%",
"memPct": "MEM%",
"command": "Befehl",
"memory": "Arbeitsspeicher",
"disks": "Laufwerke",
"temperature": "Temperatur",
"network": "Netzwerk",
"power": "Energie",
"topProcesses": "Top-Prozesse",
"filterPlaceholder": "nach Name oder Image filtern…",
"name": "Name",
"status": "Status",
"mem": "Mem",
"uptime": "Laufzeit",
"scopeDockers": "dockers"
},
"codeEditor": {
"closeFile": "{{name}} schließen",
"loading": "Wird geladen…",
"noFiles": "Keine Dateien",
"explorer": "Explorer",
"openAFile": "Öffnen Sie eine Datei im Explorer, um mit dem Bearbeiten zu beginnen",
"refresh": "Baum aktualisieren und unveränderte geöffnete Dateien neu laden",
"readFailed": "Datei konnte nicht gelesen werden",
"saved": "Datei gespeichert",
"saveFailed": "Datei konnte nicht gespeichert werden",
"title": "Code-Editor"
},
"widgets": {
"resync": "Widgets neu synchronisieren (neu laden, um neu bereitgestellte Widgets zu übernehmen)"
},
"preview": {
"title": "Vorschau",
"reload": "Neu laden",
"changeUrl": "URL ändern",
"openNewTab": "In neuem Tab öffnen",
"pointAtApp": "Dieses Panel auf eine laufende App richten",
"open": "Öffnen",
"hint": "Alles, was der Browser erreichen kann. Bleibt in diesem Panel erhalten und übersteht ein Neuladen.",
"connecting": "Verbindung wird hergestellt…"
},
"sendOff": {
"files": "Dateien",
"where": "Wohin",
"loading": "Wird geladen…",
"landsIn": "Landet in deren",
"landedIn": "Gelandet in",
"whoMaySend": "Wer mir senden darf",
"allowedLandIn": "Dateien von allen, die Sie zulassen, landen in",
"removeFile": "{{name}} entfernen",
"sendTo": "An {{name}} senden",
"turningOff": "Jemanden abzuschalten verhindert künftige Sendungen und lässt in Ruhe, was bereits gesendet wurde."
},
"panelName": {
"appStore": "App Store",
"appDetail": "App-Detail",
"calendar": "Kalender",
"contacts": "Kontakte",
"categories": "Kategorien",
"chat": "Chat",
"chatSessions": "Sitzungen",
"codeEditor": "Code-Editor",
"commander": "Commander",
"commanders": "Commander",
"dashboardPreview": "Dashboard-Vorschau",
"dashboards": "Dashboards",
"fileBrowser": "Dateibrowser",
"pluginDetail": "Plugin-Detail",
"plugins": "Plugins",
"preview": "Vorschau",
"qrReceive": "QR-Empfang",
"qrSend": "QR-Versand",
"scope": "Bereich",
"systemMonitor": "Systemmonitor",
"widgets": "Widgets",
"terminal": "Terminal",
"hostTerminal": "Host-Terminal",
"runningShells": "Laufende Shells",
"pm2Processes": "pm2-Prozesse"
},
"dashboards": {
"title": "Dashboards",
"new": "Neues Dashboard",
"delete": "Dashboard löschen",
"confirmDelete": "Sind Sie sicher, dass Sie löschen möchten",
"search": "Dashboards durchsuchen",
"name": "Name",
"description": "Beschreibung",
"open": "Dashboard öffnen",
"selectOne": "Wählen Sie ein Dashboard aus oder erstellen Sie ein neues",
"namePlaceholder": "Mein Dashboard",
"descriptionPlaceholder": "Wofür ist dieses Dashboard?",
"template": "Vorlage",
"create": "Erstellen",
"templates": {
"single": "Einzeln",
"twoColumns": "2 Spalten",
"mainSide": "Haupt + Seite",
"sidebar": "Seitenleiste",
"grid": "2x2-Raster",
"colsBottom": "Spalten + Unten"
}
},
"fileViewer": {
"readAloud": "Vorlesen",
"ocr": "Text extrahieren (OCR)",
"transcribe": "Transkribieren",
"extractAudio": "Audio extrahieren",
"extract": "Extrahieren",
"saveNextTo": "Neben dem Original speichern",
"download": "Herunterladen",
"pdfViewer": "PDF-Betrachter",
"videoFailed": "Video konnte nicht geladen werden",
"imageFailed": "Bild konnte nicht geladen werden",
"audioFailed": "Audiodatei konnte nicht geladen werden",
"audioTrack": "Audiospur",
"subtitles": "Untertitel",
"track": "Spur {{n}}",
"saved": "Datei gespeichert",
"saveFailed": "Datei konnte nicht gespeichert werden",
"scrollTop": "Nach oben scrollen",
"speechFailed": "Sprachaudio konnte nicht erzeugt werden",
"ocrFailed": "Text konnte nicht aus dem Bild extrahiert werden",
"transcribeFailed": "Audio konnte nicht transkribiert werden",
"extractAudioFailed": "Audio konnte nicht aus dem Video extrahiert werden",
"extractFailed": "Archiv konnte nicht extrahiert werden",
"savedAs": "Gespeichert als “{{name}}”",
"extractedTo": "Extrahiert nach “{{name}}”",
"downloadInstead": "Stattdessen herunterladen",
"archiveFile": "Archivdatei"
},
"plugins": {
"loading": "Wird geladen…",
"onThisMachine": "Auf diesem Rechner",
"noPluginsIn": "Keine Plugins in",
"available": "Verfügbar",
"needsOnThisMachine": "Benötigt auf diesem Rechner",
"install": "Installieren",
"clonesInto": "Klont das Repository nach",
"deleteData": "Auch alle zugehörigen Daten löschen",
"noTables": "Dieses Plugin deklariert keine Tabellen, daher gibt es keine Daten zu behalten.",
"selectOne": "Wählen Sie ein Plugin aus.",
"disable": "Deaktivieren",
"enable": "Aktivieren",
"publisher": "Herausgeber",
"version": "Version",
"needsPlatform": "Benötigt Plattform",
"wouldMount": "Würde einbinden",
"ships": "Enthält",
"permissions": "Berechtigungen",
"source": "Quelle",
"mountsAt": "Bindet ein unter",
"sidecar": "Sidecar",
"deleteNamed": "{{name}} löschen",
"updateTo": "Auf {{version}} aktualisieren"
},
"commandHq": {
"selectOne": "Wählen Sie einen Commander aus oder starten Sie einen neuen.",
"startConversation": "Unterhaltung starten",
"name": "Name",
"nameHint": "Wird der Unterhaltung bei ihrem Start zugewiesen, statt sie vom Harness anhand Ihrer ersten Nachricht benennen zu lassen.",
"workingDirectory": "Arbeitsverzeichnis",
"cwdHint": "Von hier aus werden alle ausgeführten Befehle aufgelöst, und hier wird der Verlauf gespeichert. Kann später nicht verschoben werden.",
"new": "Neuer Commander",
"spawned": "Gestartet",
"deleteQ": "Löschen?",
"uncategorised": "Nicht kategorisiert",
"loading": "Wird geladen…",
"platformDeploys": "Plattform-Deployments",
"endSession": "Sitzung beenden — gibt sie frei, damit sie andernorts fortgesetzt werden kann",
"confirmDeleteHint": "Löschen bestätigen — entfernt auch die Unterhaltung, nicht nur den Command-HQ-Eintrag",
"confirmDelete": "Löschen bestätigen",
"cancelDelete": "Löschen abbrechen",
"deleteCommander": "Commander löschen",
"none": "Noch keine Commander hier.",
"startOne": "Einen starten",
"confirmDeleteNamed": "Löschen von {{name}} bestätigen",
"deleteNamed": "{{name}} löschen",
"categories": "Kategorien",
"noCategories": "Noch keine Kategorien",
"newCategory": "Neue Kategorie",
"allCommanders": "Alle Commander",
"categoryName": "Kategoriename",
"guide": {
"whatIsIt": "Was ein Commander ist",
"starting": "Einen starten",
"examples": "Beispiele für eine erste Nachricht",
"whileRunning": "Während er läuft",
"whatIsItBody1": "Ein Agent, der weiterarbeitet, wenn Sie nicht hier sind — er wartet, bis etwas passiert, handelt danach und meldet zurück.",
"whatIsItBody2": "Es ist eine ganz normale Unterhaltung. Sie beginnen, indem Sie ihm in eigenen Worten sagen, worauf er achten und was er dabei tun soll.",
"startingBody1": "Beschreiben Sie hier die Aufgabe, wie Sie es jedem anderen erklären würden. Sagen Sie, worauf er achten soll, wo, und was zu tun ist, wenn es eintritt.",
"startingBody2": "TODO: die konkreten Schritte, sobald der Erstellungsablauf feststeht. Dies ersetzt “den Dialog für Hintergrundjobs öffnen und einen Beobachter scharfschalten”, was niemand hätte erraten können.",
"examplesBody1": "TODO: zwei oder drei Beispiele für Eröffnungs-Prompts, sobald der Erstellungsablauf feststeht. Sie sind es, die aus “die Aufgabe beschreiben” eine Anweisung machen, nach der ein Erstnutzer tatsächlich handeln kann.",
"whileRunningBody1": "TODO: was der Eigentümer sieht — wo die Kosten angezeigt werden, wie man erkennt, was die von ihm gestarteten Agenten gerade tun, und wie man ihn stoppt.",
"draft": "Entwurf"
},
"startHint": "Er sieht sich zunächst in diesem Verzeichnis um und fragt Sie dann, worauf Sie achten möchten.",
"startBlocked": "{{missing}} — dann startet dies ihn.",
"confirmDeletingNamed": "Löschen von {{name}} bestätigen"
},
"chatHistory": {
"newChat": "Neuer Chat",
"tryAgain": "Erneut versuchen",
"refresh": "Aktualisieren",
"refreshSessions": "Sitzungen aktualisieren",
"newChatInDir": "Neuer Chat in einem Verzeichnis…",
"loadFailed": "Sitzungen konnten nicht geladen werden",
"reading": "Transkripte werden gelesen…",
"noSessions": "Noch keine Sitzungen",
"liveFailed": "Aktive Sitzungen konnten nicht gelesen werden",
"asking": "Der Agent wird gefragt…",
"tabs": {
"tree": "Baum",
"latest": "Neueste",
"live": "Aktiv",
"agents": "Agenten",
"commanders": "Commander"
},
"notifyPreference": "Benachrichtigungseinstellung",
"notify": {
"everyTurn": "Nach jedem Turn",
"inputNeeded": "Nur wenn eine Eingabe nötig ist",
"none": "Keine"
},
"notificationsLabel": "Benachrichtigungen: {{choice}}",
"chooseDir": "Wählen Sie ein Arbeitsverzeichnis",
"create": "Erstellen",
"newFolder": "Neuer Ordner",
"selectFolder": "Diesen Ordner auswählen",
"newFolderName": "Name des neuen Ordners",
"noSubfolders": {
"one": "Keine sichtbaren Unterordner — {{count}} versteckter wird herausgefiltert",
"other": "Keine sichtbaren Unterordner — {{count}} versteckte werden herausgefiltert"
},
"showHidden": "Versteckte anzeigen",
"showHiddenCount": "Versteckte anzeigen ({{count}})",
"selectSession": "Wählen Sie eine Sitzung zum Anzeigen",
"endSession": "Sitzung beenden — beendet jeden laufenden Turn und gibt sie frei, damit sie andernorts fortgesetzt werden kann",
"noReadable": "Keine lesbaren Unterhaltungen hier.",
"noConversations": "Noch keine Unterhaltungen",
"newChatIn": "Neuer Chat in {{path}}",
"sessionTitle": "Sitzungstitel",
"saveTitle": "Titel speichern",
"cancelRename": "Umbenennen abbrechen",
"confirmDelete": "Löschen bestätigen",
"cancelDelete": "Löschen abbrechen",
"rename": "Umbenennen",
"deleteSession": "Sitzung löschen",
"renameFailed": "Die Sitzung konnte nicht umbenannt werden: {{reason}}",
"deleteFailed": "Die Sitzung konnte nicht gelöscht werden: {{reason}}",
"deleteAll": "Alle {{count}} löschen?",
"confirmDeletingNamed": "Löschen von {{name}} bestätigen",
"renameNamed": "{{name}} umbenennen",
"deleteNamed": "{{name}} löschen",
"newChatTitle": "Neuer Chat",
"renameHint": "Klicken, um diesen Chat umzubenennen",
"hideHidden": "Versteckte ausblenden"
},
"chat": {
"newChat": "Neuer Chat",
"rename": "Umbenennen",
"deleteQ": "“{{title}}” löschen?",
"duplicateAgent": "Es gibt bereits einen Agenten namens “{{name}}” auf diesem Dashboard",
"composerPlaceholder": "Woran möchten Sie jetzt arbeiten?",
"turnFinished": "Turn beendet · keine Abschlussnachricht",
"job": {
"title": "Hintergrundjob",
"runsIn": "Läuft in",
"command": "Befehl — genau das ausführen",
"prompt": "Prompt — beschreiben Sie es, der Agent findet den Weg",
"watch": "Auf etwas achten",
"watchHint": "In freiem Text. Der Agent fragt vor dem Scharfschalten nach, wenn etwas unklar ist.",
"handBack": "Beenden und an den Agenten zurückgeben, dann erneut scharfschalten",
"keepGoing": "Weitermachen — jedes Mal handeln und fortfahren",
"stopAfter": "Stoppen nach",
"start": "Starten",
"watchExample": "unsere Gitea-Repositories beobachten; bei jedem neuen Push, ihn holen und zum GitHub-Spiegel pushen",
"startJob": "Einen Hintergrundjob oder Beobachter starten"
},
"tasks": {
"restart": "Neu starten",
"pinned": "Angeheftet",
"clearFinished": "Alle abgeschlossenen löschen",
"clearFinishedTasks": "Alle abgeschlossenen Aufgaben löschen",
"stopJob": "Diesen Job stoppen",
"dismiss": "Verwerfen",
"rerun": "Stoppen und denselben Befehl erneut ausführen",
"collapse": "Einklappen",
"collapseDetail": "Aufgabendetail einklappen",
"stopNamed": "{{label}} stoppen",
"dismissNamed": "{{label}} verwerfen",
"status": "Aufgabe {{status}}."
},
"usage": {
"noSignIn": "Keine gespeicherte Anmeldung — führen Sie /login aus, um diese zu verwenden",
"updating": "Wird aktualisiert…",
"unreadable": "Die Nutzung auf diesem Rechner konnte nicht gelesen werden.",
"loading": "Wird geladen…",
"limits": "Limits",
"byDay": "Tokens pro Tag",
"byModel": "Tokens pro Modell",
"title": "Nutzung und Limits",
"modelBreakdown": "Ein {{input}} · aus {{output}} · Cache-Lesevorgänge {{cacheRead}} · Cache-Schreibvorgänge {{cacheWrite}}",
"switchTo": "Zu {{account}} wechseln",
"switchToOrg": "Zu {{account}} ({{org}}) wechseln",
"signInExpired": "{{account}} — Anmeldung abgelaufen, führen Sie /login aus"
},
"attach": {
"image": "Bild",
"textFile": "Textdatei",
"webpageUrl": "Webseiten-URL",
"attach": "Anhängen",
"readFailed": "{{name}} konnte nicht gelesen werden: {{reason}}",
"unknownError": "unbekannter Fehler",
"webpageTitle": "Webseite anhängen",
"webpageHint": "Geben Sie eine URL ein, um sie abzurufen und als Kontext anzuhängen.",
"scrapeFailed": "Webseite konnte nicht abgerufen werden",
"uploadFailed": "Bild konnte nicht hochgeladen werden",
"dropImages": "Bilder hier ablegen, um sie anzuhängen"
},
"signIn": {
"title": "Bei Claude anmelden",
"done": "Angemeldet. Neue Turns verwenden diese Anmeldedaten — kein Neustart nötig.",
"asking": "Die CLI wird nach einem Anmeldelink gefragt…",
"openHint": "Öffnen Sie diesen, autorisieren Sie, und fügen Sie den erhaltenen Code wieder ein.",
"authorise": "Auf claude.com autorisieren",
"copyLink": "Den Link kopieren, um ihn in einem anderen Browser oder auf dem Smartphone zu öffnen",
"pasteCode": "den Code einfügen"
},
"message": {
"copyCode": "Den Code kopieren",
"copyMarkdown": "Als Markdown-Block kopieren",
"showMore": "Mehr anzeigen ({{count}} weitere Zeilen)",
"subagent": "Subagent",
"outputError": "Ausgabe — Fehler",
"contextCleared": "Kontext geleert — nichts davor ist noch im Gedächtnis",
"interrupted": "Vom Benutzer unterbrochen",
"agentRestarted": "Agent neu gestartet — Turn abgebrochen",
"retry": "Erneut versuchen",
"planUnchanged": "Planmodus unverändert",
"approve": "Genehmigen",
"frontmatter": "Frontmatter",
"systemPrompt": "System-Prompt",
"reviseHint": "Was soll sich ändern? Der Agent überarbeitet den Plan auf dieser Grundlage.",
"waiting": "Wartet auf eine Antwort",
"narrationFailed": "Die Sprachausgabe wurde erzeugt, ließ sich aber nicht abspielen.",
"readAloudFailed": "Diese Nachricht konnte nicht vorgelesen werden: {{reason}}",
"compacted": "Kontext komprimiert",
"compactedAuto": "Kontext automatisch komprimiert",
"answerSent": "Antwort gesendet — wartet auf den Agenten",
"other": "Andere..."
},
"composer": {
"stop": "Stopp",
"sendIntoTurn": "In den bereits laufenden Turn einfügen",
"removeFromQueue": "Aus der Warteschlange entfernen",
"send": "Senden",
"startHint": "Senden Sie eine Nachricht, um zu beginnen",
"jumpToLatest": "Zur neuesten Nachricht springen",
"noAudio": "Es wurde kein Audio aufgenommen"
},
"agent": {
"gone": "Der Agent dieses Panels existiert nicht mehr.",
"forget": "Vergessen",
"name": "Diesen Agenten benennen",
"peers": "Peers: {{names}}"
},
"copy": "Kopieren"
},
"files": {
"folderGone": "Dieser Ordner existiert nicht mehr — zurück zum Anfang",
"searchFailed": "Suche fehlgeschlagen",
"createFolderFailed": "Ordner konnte nicht erstellt werden",
"createFileFailed": "Datei konnte nicht erstellt werden",
"uploadFailed": "Dateien konnten nicht hochgeladen werden",
"renameFailed": "Umbenennen fehlgeschlagen",
"deleteFailed": "Löschen fehlgeschlagen",
"deleteSomeFailed": "Einige Elemente konnten nicht gelöscht werden",
"downloadFailed": "Herunterladen fehlgeschlagen",
"pathCopied": "Pfad kopiert",
"generatingSpeech": "Sprachaudio wird erzeugt…",
"speechFailed": "Sprachaudio konnte nicht erzeugt werden",
"extracting": "Archiv wird extrahiert…",
"extractFailed": "Archiv konnte nicht extrahiert werden",
"cloned": "Repository geklont",
"cloneFailed": "Repository konnte nicht geklont werden",
"cloning": "Wird geklont…",
"duplicateFailed": "Duplizieren fehlgeschlagen",
"compressing": "Wird komprimiert…",
"compressFailed": "Komprimieren fehlgeschlagen",
"pasteFailed": "Einfügen fehlgeschlagen",
"pasteNeedsSecure": "Einfügen aus der Zwischenablage erfordert einen sicheren Kontext (https). Ziehen Sie die Datei stattdessen per Drag-and-Drop hierher.",
"copiedItems": {
"one": "{{count}} Element kopiert",
"other": "{{count}} Elemente kopiert"
},
"cutItems": {
"one": "{{count}} Element ausgeschnitten",
"other": "{{count}} Elemente ausgeschnitten"
},
"pastedItems": {
"one": "{{count}} Element eingefügt",
"other": "{{count}} Elemente eingefügt"
},
"uploadedFiles": {
"one": "{{count}} Datei hochgeladen",
"other": "{{count}} Dateien hochgeladen"
},
"deleteItemsQ": {
"one": "{{count}} Element löschen?",
"other": "{{count}} Elemente löschen?"
},
"deletedItems": {
"one": "{{count}} Element gelöscht",
"other": "{{count}} Elemente gelöscht"
},
"createdFolder": "Ordner “{{name}}” erstellt",
"created": "“{{name}}” erstellt",
"renamedTo": "Umbenannt in “{{name}}”",
"deleteQ": "“{{name}}” löschen?",
"deleted": "“{{name}}” gelöscht",
"extractedTo": "Extrahiert nach “{{name}}”",
"duplicated": "“{{name}}” dupliziert",
"pastedInto": "Eingefügt in “{{name}}”",
"unpinned": "“{{name}}” nicht mehr angeheftet",
"pinned": "“{{name}}” angeheftet",
"menu": {
"copyPath": "Pfad kopieren",
"chatAboutThis": "Darüber chatten",
"paste": "Einfügen",
"newFile": "Neue Datei",
"newFolder": "Neuer Ordner",
"uploadFiles": "Dateien hochladen",
"uploadFolder": "Ordner hochladen",
"cloneRepository": "Repository klonen",
"hideHiddenFiles": "Versteckte Dateien ausblenden",
"showHiddenFiles": "Versteckte Dateien anzeigen",
"createDashboardHere": "Dashboard hier erstellen",
"downloadVideo": "Video herunterladen",
"dictate": "Diktieren",
"dropToUpload": "Dateien hier ablegen, um sie hochzuladen",
"openFolder": "Ordner öffnen",
"showLocation": "Speicherort anzeigen",
"download": "Herunterladen",
"noResults": "Keine Ergebnisse gefunden",
"open": "Öffnen",
"openInEditor": "Im Editor öffnen",
"openInEditorTooLarge": "Im Editor öffnen (zu groß)",
"pasteIntoFolder": "In Ordner einfügen",
"readAloud": "Vorlesen",
"extract": "Extrahieren",
"runTask": "Aufgabe ausführen",
"runAgent": "Agent ausführen",
"cut": "Ausschneiden",
"copy": "Kopieren",
"duplicate": "Duplizieren",
"rename": "Umbenennen",
"compress": "Komprimieren",
"compressSelection": "Auswahl komprimieren",
"unpin": "Loslösen",
"pin": "Anheften",
"chat": "Chat...",
"delete": "Löschen",
"gitClone": "Git-Klon",
"searchFiles": "Dateien durchsuchen...",
"clearSelection": "Auswahl aufheben",
"selected": "ausgewählt",
"refresh": "Aktualisieren"
},
"grid": {
"empty": "Dieser Ordner ist leer",
"sort": "Sortieren:",
"name": "Name",
"type": "Typ",
"size": "Größe",
"date": "Datum"
}
},
"taskRunner": {
"stop": "Stopp",
"taskFailed": "Aufgabe fehlgeschlagen",
"taskComplete": "Aufgabe abgeschlossen",
"noSubtitles": "Keine Untertitel",
"none": "Keine",
"noVideos": "In diesem Ordner wurden keine Videos gefunden.",
"differentLayout": "Unterschiedliches Layout — diese separat ausführen:",
"skipped": "Übersprungen (separat konvertieren):",
"analyzing": "Dateien werden analysiert…",
"close": "Schließen",
"runningOn": "Läuft auf",
"queue": "Warteschlange",
"concurrency": "Parallelität",
"model": "Modell",
"steps": "Schritte",
"stopPipeline": "Pipeline stoppen",
"pipelineFailed": "Pipeline fehlgeschlagen",
"pipelineComplete": "Pipeline abgeschlossen",
"viewInJobs": "In Jobs anzeigen",
"copyOutput": "Ausgabe kopieren",
"track": "Spur {{n}}",
"runFromStep": "Ab Schritt {{n}} ausführen"
},
"newEntry": {
"nameReserved": "Dieser Name ist reserviert",
"nameSlash": "Der Name darf kein \"/\" enthalten",
"nameExists": "“{{name}}” existiert hier bereits",
"urlSpaces": "Eine URL darf keine Leerzeichen enthalten",
"cancel": "Abbrechen",
"file": {
"title": "Neue Datei",
"description": "Geben Sie die Dateiendung an — anhand dieser wählt der Editor die Sprache. Öffnet sich, sobald sie erstellt ist.",
"label": "Dateiname",
"placeholder": "notizen.txt",
"submit": "Erstellen und öffnen"
},
"folder": {
"title": "Neuer Ordner",
"description": "Wird im aktuell angezeigten Ordner erstellt.",
"label": "Ordnername",
"placeholder": "dokumente",
"submit": "Ordner erstellen"
},
"clone": {
"title": "Repository klonen",
"description": "Wird unter eigenem Namen in den aktuell angezeigten Ordner geklont.",
"label": "Repository-URL",
"placeholder": "https://github.com/owner/repo.git",
"submit": "Klonen"
}
},
"videoDownload": {
"title": "Video herunterladen",
"descriptionInput": "Fügen Sie eine Video- oder Playlist-URL ein — die Details werden vor dem Herunterladen abgerufen.",
"descriptionPreview": "Überprüfen und herunterladen.",
"urlPlaceholder": "https://www.youtube.com/watch?v=… oder …/playlist?list=…",
"audioOnly": "Nur Audio extrahieren (mp3)",
"fetch": "Abrufen",
"back": "Zurück",
"audioOnlyLabel": "Nur Audio",
"video": "Video",
"itemCount": {
"one": "{{count}} Element",
"other": "{{count}} Elemente"
},
"subfolderPlaceholder": "Unterordner (optional) — leer lassen für diesen Ordner",
"downloadAll": "Alle herunterladen",
"couldNotFetch": "Abrufen nicht möglich",
"downloading": "Wird heruntergeladen…",
"saving": "Wird gespeichert…",
"saved": "Gespeichert",
"retry": "Erneut versuchen",
"download": "Herunterladen",
"couldNotFetchInfo": "Informationen konnten nicht abgerufen werden",
"timedOut": "Zeitüberschreitung",
"downloadFailed": "Herunterladen fehlgeschlagen",
"couldNotStart": "Der Download konnte nicht gestartet werden"
},
"fileBrowserWidget": {
"title": "Dateibrowser",
"search": "Suchen...",
"browse": "Durchsuchen",
"recent": "Zuletzt verwendet",
"pinned": "Angeheftet",
"noResults": "Keine Ergebnisse",
"emptyDirectory": "Leeres Verzeichnis",
"noPinnedFiles": "Keine angehefteten Dateien",
"noRecentFiles": "Keine kürzlich verwendeten Dateien",
"uploading": "Wird hochgeladen...",
"empty": "Dieser Ordner ist leer",
"sort": "Sortieren:"
},
"agentRunner": {
"agentRunning": "Agent läuft",
"keepsGoing": "Läuft weiter, egal ob dieses Fenster geöffnet bleibt. Verfolgen Sie ihn im Chat — die neueste Sitzung steht oben.",
"openChat": "Chat öffnen",
"target": "Ziel",
"starting": "Wird gestartet…",
"runAgent": "Agent ausführen",
"startFailed": "Der Agent konnte nicht gestartet werden"
},
"dictate": {
"title": "Diktieren",
"description": "Audio wird aufgenommen. Drücken Sie Enter oder klicken Sie auf Stopp, um zu speichern.",
"recording": "Wird aufgenommen...",
"startingStatus": "Wird gestartet...",
"stopSave": "Stoppen & Speichern",
"noAudioCaptured": "Es wurde kein Audio aufgenommen",
"micAccessFailed": "Zugriff auf das Mikrofon nicht möglich",
"recordingFailed": "Aufnahme fehlgeschlagen"
}
}
@@ -3,11 +3,12 @@ import { findMissingKeys } from 'i18n';
import en from './en-GB.json';
import ptPT from './pt-PT.json';
import frFR from './fr-FR.json';
import deDE from './de-DE.json';
// D2: every shipped locale ships a COMPLETE catalog. A key en-GB has and another locale lacks is a red
// build, not a warning — there is no regional fallback to paper over the gap.
describe('officerdev (panel.*) locale catalogs', () => {
test('every shipped locale has every key en-GB has', () => {
expect(findMissingKeys(en, { 'pt-PT': ptPT, 'fr-FR': frFR })).toEqual([]);
expect(findMissingKeys(en, { 'pt-PT': ptPT, 'fr-FR': frFR, 'de-DE': deDE })).toEqual([]);
});
});