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
+1 -1
View File
@@ -19,7 +19,7 @@ const autonym = (code: string): string => {
return name.charAt(0).toUpperCase() + name.slice(1);
};
export const SHIPPED_LOCALES: ShippedLocale[] = ['en-GB', 'pt-PT', 'fr-FR'].map((code) => ({
export const SHIPPED_LOCALES: ShippedLocale[] = ['en-GB', 'pt-PT', 'fr-FR', 'de-DE'].map((code) => ({
code,
label: autonym(code),
}));
+704
View File
@@ -0,0 +1,704 @@
{
"common": {
"save": "Speichern",
"saving": "Wird gespeichert...",
"cancel": "Abbrechen"
},
"settings": {
"profile": {
"userData": {
"email": "E-Mail",
"username": "Benutzername",
"name": "Name",
"namePlaceholder": "Ihr Name",
"updated": "Profil aktualisiert",
"updateFailed": "Profil konnte nicht aktualisiert werden",
"selectImage": "Bitte wählen Sie eine Bilddatei aus",
"imageTooLarge": "Das Bild muss kleiner als 384 KB sein"
},
"apiKeys": {
"intro": "Ein API-Schlüssel meldet Sie an, ohne Passwort und ohne Ablauf. Ein Schlüssel funktioniert überall — ein Schlüssel ist nicht an eine App gebunden. Jedem Gerät einen eigenen zu geben, dient nur dazu, einen abzuschalten, ohne die anderen anzutasten. Senden Sie ihn als",
"loading": "Schlüssel werden geladen…",
"mintedTitle": "Schlüssel für “{{name}}” — wird nur einmal angezeigt",
"savedIt": "Ich habe ihn gespeichert",
"copyKey": "Schlüssel kopieren",
"copied": "Schlüssel kopiert",
"copyFailed": "Kopieren nicht möglich — bitte manuell auswählen und kopieren",
"newKey": "Neuer Schlüssel",
"namePlaceholder": "iPhone, Musik-App, Laptop-CLI…",
"create": "Erstellen",
"createFailed": "Der Schlüssel konnte nicht erstellt werden",
"noneYet": "Noch keine Schlüssel.",
"noneInUse": "Keine Schlüssel in Verwendung.",
"revoked": "widerrufen",
"expired": "abgelaufen",
"lastUsed": "zuletzt verwendet am {{date}}",
"neverUsed": "nie verwendet",
"forget": "Diesen Eintrag entfernen",
"forgetFailed": "Entfernen nicht möglich",
"revoke": "Widerrufen",
"revokeDone": "Widerrufen — alles, was diesen Schlüssel verwendet hat, wurde abgemeldet",
"revokeFailed": "Widerrufen nicht möglich",
"hideDead": "Widerrufene und abgelaufene ausblenden",
"showDead": {
"one": "{{count}} widerrufenen oder abgelaufenen Schlüssel anzeigen",
"other": "{{count}} widerrufene oder abgelaufene Schlüssel anzeigen"
}
},
"voice": {
"label": "Stimme",
"refresh": "Stimmen aktualisieren",
"serverDefault": "Server-Standard",
"hint": "Wählen Sie eine Stimme für die Sprachausgabe (Text-to-Speech). Belassen Sie es beim Server-Standard, um die vom Administrator konfigurierte Stimme zu verwenden.",
"stop": "Stopp",
"listen": "Anhören"
},
"dock": {
"visible": "Sichtbar",
"hidden": "Ausgeblendet",
"dragToShow": "Elemente hierher ziehen, um sie im Dock anzuzeigen",
"allVisible": "Alle Elemente sichtbar",
"reset": "Auf Standard zurücksetzen"
},
"languages": {
"spokenLabel": "Sprachen, die Sie sprechen",
"addLanguage": "Sprache hinzufügen...",
"defaultLabel": "Standardsprache",
"defaultHint": "Wird für die Lokalisierung der Oberfläche verwendet.",
"translateToLabel": "Übersetzen nach",
"translateToHint": "Zielsprache beim Übersetzen von Inhalten, die Sie nicht sprechen."
},
"changePassword": {
"currentPasswordLabel": "Aktuelles Passwort",
"currentPasswordPlaceholder": "Aktuelles Passwort",
"newPasswordLabel": "Neues Passwort",
"newPasswordPlaceholder": "Neues Passwort",
"confirmPasswordLabel": "Neues Passwort bestätigen",
"confirmPasswordPlaceholder": "Neues Passwort bestätigen",
"changeButton": "Passwort ändern",
"changingButton": "Wird geändert...",
"passwordChanged": "Passwort geändert",
"passwordChangeFailed": "Passwort konnte nicht geändert werden"
},
"models": {
"defaultModel": "Standardmodell",
"sameAsChat": "Wie Chat-Standard",
"taskDefaultsSaved": "Aufgaben-Standardeinstellungen gespeichert",
"saveFailed": "Einstellungen konnten nicht gespeichert werden",
"defaultChat": "Standard-Chat-Modell",
"defaultChatHint": "Wird beim Starten eines neuen Chats vom Startbildschirm verwendet",
"defaultProject": "Standard-Projektmodell",
"defaultProjectHint": "Wird beim Starten eines neuen Chats innerhalb eines Projekt-Dashboards verwendet",
"defaultTask": "Standard-Aufgabenmodell",
"defaultTaskHint": "Wird beim Ausführen von Aufgaben aus dem Datei-Browser verwendet",
"aiDefaultsSaved": "KI-Modell-Standardeinstellungen gespeichert"
}
},
"sections": {
"profile": {
"label": "Profil",
"hint": "Avatar, Name, E-Mail",
"description": "Avatar, Name und E-Mail"
},
"changePassword": {
"label": "Passwort ändern",
"description": "Aktualisieren Sie Ihr Passwort"
},
"apiKeys": {
"label": "API-Schlüssel",
"hint": "Schlüssel, die sich als Sie anmelden",
"description": "Schlüssel, die sich als Sie anmelden, einzeln widerrufbar"
},
"languages": {
"label": "Sprachen",
"hint": "gesprochen und Übersetzung",
"description": "Gesprochen, Standard und Übersetzung"
},
"voice": {
"label": "Stimme",
"hint": "Text-zu-Sprache",
"description": "Einstellung für die Sprachausgabe (Text-to-Speech)"
},
"dock": {
"label": "Dock",
"hint": "auswählen und anordnen",
"description": "Dock-Elemente auswählen und anordnen"
},
"myModels": {
"label": "Meine Modelle",
"description": "Modelle für sich selbst anzeigen oder ausblenden"
},
"channelModels": {
"label": "Kanalmodelle",
"description": "Modelle, die für Konten ohne Eigentümerrechte erreichbar sind"
},
"defaultModels": {
"label": "Standardmodelle",
"description": "Standardmodelle für Chat, Projekte und Aufgaben"
},
"providers": {
"label": "Anbieter",
"hint": "Harnesses",
"description": "Entfernte und lokale KI-Anbieter"
},
"tts": {
"label": "Text-zu-Sprache",
"description": "TTS-Anbieter und Stimme"
},
"stt": {
"label": "Sprache-zu-Text",
"description": "Whisper-Server-URL"
},
"ocr": {
"label": "OCR",
"description": "Vision-Modell für Textextraktion"
},
"maintenance": {
"label": "Neu erstellen & neu starten",
"hint": "Wartung",
"description": "Änderungen laden, ohne ein Terminal zu benötigen"
},
"smtp": {
"label": "SMTP",
"hint": "ausgehende E-Mail",
"description": "Anbieter für E-Mail-Zustellung"
},
"googleOauth": {
"label": "Google OAuth",
"description": "Client-ID und Secret für Google-APIs"
},
"apify": {
"label": "Apify",
"description": "API-Token für Web-Scraping-Actors"
},
"davSync": {
"label": "Kalender- und Kontaktabgleich",
"hint": "App-Passwörter",
"description": "Geräteweise Passwörter für CalDAV-/CardDAV-Clients"
},
"accounts": {
"label": "Konten",
"hint": "Benutzer",
"description": "Wer Zugriff hat, und worauf"
},
"permissions": {
"label": "Berechtigungen",
"description": "Was jede Rolle erreichen kann"
}
},
"searchPlaceholder": "Einstellungen durchsuchen…",
"selectSection": "Wählen Sie einen Bereich aus",
"groups": {
"models": "Modelle",
"defaults": "Standardwerte",
"providers": "Anbieter",
"ai": "KI",
"maintenance": "Wartung",
"email": "E-Mail"
},
"nav": {
"profile": "Profil",
"ai": "KI",
"system": "System",
"integrations": "Integrationen",
"users": "Benutzer"
},
"ai": {
"noModels": "Keine Modelle verfügbar. Konfigurieren Sie API-Schlüssel unter Anbieter.",
"dragToShow": "Modelle hierher ziehen, um sie anzuzeigen",
"allVisible": "Alle Modelle sichtbar",
"dragToEnable": "Modelle hierher ziehen, um sie zu aktivieren",
"allEnabled": "Alle Modelle aktiviert",
"visible": "Sichtbar",
"hidden": "Ausgeblendet",
"enabled": "Aktiviert",
"disabled": "Deaktiviert",
"refresh": "Modelle von Anbietern aktualisieren",
"refreshed": "Modelle aktualisiert",
"refreshFailed": "Modelle konnten nicht aktualisiert werden"
},
"integrations": {
"enterprise": "Unternehmen",
"personal": "Persönlich"
},
"server": {
"loading": "Wird geladen…",
"provider": "Anbieter",
"model": "Modell",
"voice": "Stimme",
"ocr": {
"serverUrl": "Server-URL des Vision-Modells",
"refreshModels": "Modelle aktualisieren",
"selectModel": "Wählen Sie ein Modell aus",
"saved": "OCR-Einstellungen gespeichert",
"saveFailed": "OCR-Einstellungen konnten nicht gespeichert werden",
"reachable": "Vision-Modell-Server ist erreichbar"
},
"stt": {
"serverUrl": "Whisper-Server-URL",
"saved": "STT-Einstellungen gespeichert",
"saveFailed": "STT-Einstellungen konnten nicht gespeichert werden",
"reachable": "Whisper-Server ist erreichbar"
},
"tts": {
"openaiCompatible": "OpenAI-kompatibel (Kokoro, OpenAI usw.)",
"elevenLabs": "ElevenLabs",
"refreshVoices": "Stimmen aktualisieren",
"selectVoice": "Wählen Sie eine Stimme aus",
"saved": "TTS-Einstellungen gespeichert",
"saveFailed": "TTS-Einstellungen konnten nicht gespeichert werden",
"playing": "Testaudio wird abgespielt",
"testFailed": "Test fehlgeschlagen — TTS-Server nicht erreichbar"
},
"smtp": {
"mailhog": "MailHog (lokaler Test)",
"resend": "Resend",
"custom": "Benutzerdefiniertes SMTP",
"apiKey": "API-Schlüssel",
"host": "Host",
"port": "Port",
"username": "Benutzername",
"password": "Passwort",
"tls": "TLS / SSL",
"fromName": "Absendername",
"fromEmail": "Absender-E-Mail",
"sendTest": "Test-E-Mail senden",
"userExample": "benutzer@beispiel.de",
"recipientExample": "empfänger@beispiel.de",
"saved": "SMTP-Einstellungen gespeichert",
"saveFailed": "SMTP-Einstellungen konnten nicht gespeichert werden",
"connected": "Verbindung erfolgreich",
"testSent": "Test-E-Mail an {{email}} gesendet"
},
"maintenance": {
"updateTitle": "Plattform aktualisieren",
"updateHint": "Ändert nichts, was gerade läuft. Was das Update benötigt, ist hier aufgeführt, und die Entscheidung liegt bei Ihnen.",
"rebuild": "Frontend neu erstellen",
"restart": "Server neu starten",
"upToDate": "Bereits aktuell",
"rebuilt": "Frontend neu erstellt — laden Sie diese Seite neu, um es zu sehen",
"restarting": "Wird neu gestartet — die Seite verbindet sich von selbst wieder",
"pulled": {
"one": "{{count}} Commit abgerufen",
"other": "{{count}} Commits abgerufen"
}
},
"harnesses": {
"piMono": "Pi Mono",
"checking": "Wird geprüft…",
"localProviders": "Lokale Anbieter",
"remoteProviders": "Entfernte Anbieter",
"connect": "Verbinden",
"authenticate": "Authentifizieren",
"connectLocal": "Lokalen Anbieter verbinden",
"connectProvider": "Anbieter verbinden",
"none": "Keine Anbieter gefunden.",
"updatePiMono": "Pi Mono aktualisieren",
"removeProvider": "Anbieter entfernen",
"namePlaceholder": "Name (z. B. Mein Ollama)",
"username": "Benutzername",
"password": "Passwort",
"apiKey": "API-Schlüssel",
"editKey": "Schlüssel bearbeiten",
"disconnect": "Anbieter trennen",
"saveKey": "Schlüssel speichern",
"enterKey": "API-Schlüssel eingeben",
"search": "Anbieter durchsuchen…",
"connectFailed": "Verbindung fehlgeschlagen",
"authFailed": "Authentifizierung fehlgeschlagen",
"saveFailed": "Anbieter konnte nicht gespeichert werden",
"connectedTo": "Mit {{name}} verbunden"
}
},
"users": {
"loadingPermissions": "Berechtigungen werden geladen…",
"permissionsFailed": "Berechtigungen konnten nicht geladen werden.",
"deniedUnlessGranted": "Alles ist verweigert, sofern es hier nicht gewährt wird.",
"read": "Lesen",
"full": "Vollständig",
"noAccess": "Kein Zugriff",
"role": "Rolle",
"permissionsSaved": "Gespeichert, was {{role}}s erreichen können",
"copyBeforeClosing": "Kopieren Sie, was Sie brauchen, bevor Sie schließen — nichts davon kann erneut angezeigt werden.",
"password": "Passwort",
"linuxAccount": "Linux-Konto",
"sshKey": "Ihr öffentlicher SSH-Schlüssel",
"addToGitea": "Fügen Sie dies zu ihrem Gitea-Konto hinzu",
"linuxIncomplete": "Das Konto funktioniert, aber die Linux-Seite wurde nicht fertiggestellt",
"done": "Fertig",
"addAccount": "Konto hinzufügen",
"newAccount": "Neues Konto",
"email": "E-Mail",
"name": "Name",
"username": "Benutzername",
"usernameHint": "Buchstaben, Zahlen, Punkte, Bindestriche und Unterstriche.",
"generatePassword": "Ein Passwort generieren",
"copyPassword": "Passwort kopieren",
"passwordHint": "Mindestens 12 Zeichen, mit Groß- und Kleinbuchstaben, einer Zahl und einem Symbol.",
"sshPlaceholder": "ssh-ed25519 AAAAC3Nza… ana@laptop",
"passwordCopied": "Passwort kopiert",
"loadingAccounts": "Konten werden geladen…",
"accountsFailed": "Konten konnten nicht geladen werden.",
"removeAccount": "Konto entfernen",
"generateNewPassword": "Ein neues Passwort generieren",
"serverOwner": "Servereigentümer",
"copySshTitle": "Ihren öffentlichen SSH-Schlüssel kopieren (fügen Sie ihn zu ihrem Gitea-Konto hinzu)",
"resetPasswordTitle": "Ein neues Passwort generieren — wird nur einmal angezeigt und meldet sie überall ab",
"copyNewPassword": "Das neue Passwort kopieren",
"publicKeyCopied": "Öffentlicher Schlüssel kopiert",
"copyFailed": "Kopieren nicht möglich — bitte manuell auswählen und kopieren",
"repairFor": "Linux-Konto von {{email}} reparieren",
"linuxAccountFor": "Linux-Konto: {{osUser}} — klicken, um es zu reparieren oder den SSH-Schlüssel zu ersetzen",
"copySshFor": "Öffentlichen SSH-Schlüssel von {{email}} kopieren",
"resetPasswordFor": "Passwort von {{email}} zurücksetzen",
"removeFor": "{{email}} entfernen",
"provisionPrompt": "Linux-Konto für {{email}}.\n\nFügen Sie einen öffentlichen SSH-Schlüssel ein, um SSH-Zugriff zu erlauben, oder lassen Sie das Feld leer, um den aktuellen zu behalten.",
"createLinux": "Ein Linux-Konto erstellen",
"noLinux": "Kein Linux-Konto — klicken, um eines zu erstellen",
"removeTitle": "{{email}} entfernen?",
"removeBody": "Dies löscht das Konto und alles, was dazugehört — Passkeys, Dashboards, gespeicherte Layouts und alles, was ein installiertes Plugin für dieses Konto speichert. Dies kann nicht rückgängig gemacht werden.",
"resetTitle": "Passwort für {{email}} zurücksetzen?",
"resetBody": "Ein neues Passwort wird generiert und Ihnen einmalig angezeigt — es wird nirgendwo gespeichert und kann danach nicht mehr abgerufen werden. Das bisherige Passwort funktioniert sofort nicht mehr, und die Person wird überall abgemeldet.",
"resetLinuxNote": "Das Linux-Konto ({{osUser}}) ist davon nicht betroffen: Es hat kein Passwort, und die SSH-Schlüssel bleiben unverändert."
},
"dav": {
"newDevice": "Neues Gerät",
"create": "Erstellen",
"none": "Noch keine Geräte.",
"placeholder": "Pixel 9, iPad, Thunderbird…",
"revoke": "Widerrufen",
"delete": "Löschen",
"copyFailed": "Kopieren nicht möglich — bitte manuell auswählen und kopieren",
"createFailed": "Das App-Passwort konnte nicht erstellt werden",
"revoked": "Widerrufen — dieses Gerät synchronisiert nicht mehr",
"revokeFailed": "Widerrufen nicht möglich",
"deleteFailed": "Löschen nicht möglich",
"copyField": "{{field}} kopieren",
"copied": "{{what}} kopiert"
},
"google": {
"guideToggle": "Schritt-für-Schritt-Anleitung",
"step1": {
"title": "Ein Google-Cloud-Projekt erstellen",
"body": "Öffnen Sie die Seite zur Projekterstellung, geben Sie ihm einen Namen (zum Beispiel “Officer”) und klicken Sie auf:",
"link": "New Project"
},
"step2": {
"title": "Die APIs aktivieren",
"body": "Öffnen Sie die API-Bibliothek, suchen Sie nach jeder dieser APIs und klicken Sie auf:",
"link": "API Library"
},
"step3": {
"title": "Den OAuth-Zustimmungsbildschirm konfigurieren",
"link": "OAuth Branding",
"appName": "Legen Sie den Namen Ihrer Organisation oder “Officer” fest als:",
"supportEmail": "Legen Sie die E-Mail-Adresse Ihres Administrators fest als:",
"devContact": "Fügen Sie die E-Mail-Adresse Ihres Administrators hinzu unter:",
"save": "Klicken Sie dann auf:"
},
"step4": {
"title": "Die Zielgruppe festlegen",
"link": "OAuth Audience",
"internal": "Wenn Ihr Team Google Workspace verwendet, wählen Sie dies — keine Überprüfung nötig:",
"external": "Andernfalls wählen Sie dies und fügen Sie die E-Mail-Adressen Ihres Teams unter Test users hinzu (erforderlich, solange die App nicht verifiziert ist; Grenze von 100 Testnutzern):"
},
"step5": {
"title": "Bereiche hinzufügen",
"link": "Data Access",
"body": "Öffnen Sie den Datenzugriff, suchen Sie die unten stehenden Bereiche, fügen Sie sie hinzu und klicken Sie dann auf:",
"note": "Google stuft den Kalenderbereich als sensibel und den Gmail-Bereich als eingeschränkt ein. Das ist unproblematisch für Internal-Apps (Google Workspace) und für External-Apps im Testmodus; die Veröffentlichung in Produktion mit eingeschränkten Bereichen erfordert eine Google-Verifizierung."
},
"step6": {
"title": "OAuth-Anmeldedaten erstellen",
"link": "Clients",
"body": "Öffnen Sie die Clients-Seite und klicken Sie auf:",
"appType": "Anwendungstyp:",
"nameAnything": "Name: beliebig (zum Beispiel “Officer”)",
"redirectUris": "Autorisierte Weiterleitungs-URIs — hinzufügen:",
"thenClick": "Klicken Sie dann auf:"
},
"step7": {
"title": "Die Anmeldedaten kopieren",
"body": "Ein Dialogfeld zeigt Ihre Client-ID und Ihr Client-Secret. Kopieren Sie beide und fügen Sie sie in die untenstehenden Felder ein."
},
"scopeGmail": "E-Mails lesen",
"scopeCalendar": "Kalenderereignisse lesen",
"verifying": "Anmeldedaten werden überprüft…",
"valid": "Anmeldedaten gültig",
"invalid": "Ungültige Anmeldedaten",
"verifyFailed": "Überprüfungsanfrage fehlgeschlagen",
"clientId": "Client-ID",
"clientSecret": "Client-Secret",
"redirectUri": "Weiterleitungs-URI",
"redirectUriHint": "Fügen Sie diese URI zu den autorisierten Weiterleitungs-URIs Ihres Google-OAuth-Clients hinzu",
"saved": "Google-OAuth-Konfiguration gespeichert",
"saveFailed": "Google-OAuth-Konfiguration konnte nicht gespeichert werden"
},
"googleAccount": {
"title": "Google-Konto",
"hint": "Verbinden Sie Ihr Google-Konto für Kalender, Kontakte und andere Google-Dienste.",
"connected": "Verbunden",
"disconnect": "Trennen",
"connect": "Google-Konto verbinden",
"connectedToast": "Google-Konto verbunden",
"connectFailed": "Google-Konto konnte nicht verbunden werden",
"disconnectedToast": "Google-Konto getrennt",
"disconnectFailed": "Google-Konto konnte nicht getrennt werden"
},
"apify": {
"token": "API-Token",
"saved": "Apify-API-Token gespeichert",
"saveFailed": "Apify-API-Token konnte nicht gespeichert werden"
}
},
"header": {
"userMenu": {
"profile": "Profil",
"systemSettings": "Systemeinstellungen",
"signOut": "Abmelden",
"ai": "KI",
"integrations": "Integrationen",
"userManagement": "Benutzerverwaltung"
},
"tabName": "Tab-Name",
"tabNameHint": "Klicken, um diesen Tab umzubenennen — leeren, um zum Seitennamen zurückzukehren",
"logoAlt": "Officer",
"navigation": "Navigation",
"jobsRunning": "Job läuft",
"jobsNothingRunning": "Nichts läuft",
"jobsQueued": "Jobs in Warteschlange"
},
"nav": {
"home": "Start",
"files": "Dateien",
"chat": "Chat",
"commandHq": "Command HQ",
"editor": "Editor",
"jobs": "Jobs",
"terminal": "Terminal",
"browser": "Browser",
"monitor": "Monitor",
"activity": "Aktivität",
"dashboards": "Dashboards",
"sendOff": "SendOff",
"calendar": "Kalender",
"contacts": "Kontakte",
"appStore": "App Store",
"marketplace": "Marketplace",
"codeEditor": "Code-Editor"
},
"theme": {
"pillTitle": "Design: {{name}} · Strg+Umschalt+←/→ durchblättern · Strg+Umschalt+Leertaste durchsuchen · Strg+Umschalt+F {{starAction}}",
"pillLabel": "Design: {{name}}",
"star": "markieren",
"unstar": "Markierung aufheben",
"cycleHint": "Strg+Umschalt+←/→ durchblättern · Strg+Umschalt+Leertaste durchsuchen",
"everyShortcutHint": "Strg+? für alle Tastenkombinationen",
"favouritesOnly": "Nur Favoriten ({{count}})",
"favourites": "Favoriten ({{count}})",
"noFavourites": "Noch keine Favoriten — markieren Sie einen mit der Schaltfläche in seiner Zeile.",
"starNamed": "{{name}} markieren",
"unstarNamed": "Markierung von {{name}} aufheben",
"addToFavourites": "Zu Favoriten hinzufügen",
"removeFromFavourites": "Aus Favoriten entfernen",
"addToFavouritesKey": "Zu Favoriten hinzufügen (f)",
"removeFromFavouritesKey": "Aus Favoriten entfernen (f)",
"active": "aktiv",
"browseHint": "j/k oder ↑/↓ bewegen · l oder → Vorschau · f markieren · h oder ← zurücksetzen · Eingabetaste behalten · Esc abbrechen"
},
"spotlight": {
"placeholder": "Gehe zu…",
"noResults": "Keine Treffer für “{{query}}”."
},
"shortcutsModal": {
"title": "Tastenkombinationen",
"hint": "Strg+? · Esc zum Schließen"
},
"screenError": {
"title": "Dieser Bildschirm konnte nicht angezeigt werden",
"description": "Nichts ist verloren gegangen — das ist ein Anzeigefehler, kein Datenfehler. Agenten-Transkripte, Jobs und Dateien sind unberührt.",
"unknownError": "Unbekannter Fehler",
"tryAgain": "Erneut versuchen",
"reload": "Neu laden",
"goHome": "Zum Start",
"resetHint": "Wenn es an derselben Stelle erneut fehlschlägt, ist meist ein gespeichertes Panel-Layout die Ursache. Zurücksetzen bringt die Panels aller Bildschirme auf ihre Standardwerte zurück.",
"dashboardsSafe": "Ihre Dashboards sind davon nicht betroffen.",
"resetting": "Wird zurückgesetzt…",
"resetConfirm": "Ja — Layout aller Bildschirme zurücksetzen",
"reset": "Bildschirm-Layouts zurücksetzen"
},
"rescan": {
"label": "Elemente erneut scannen",
"title": "officer-items erneut scannen (Änderungen übernehmen, ohne neu zu starten)",
"failed": "Elemente konnten nicht erneut gescannt werden",
"done": "Elemente erneut gescannt — {{summary}}",
"counts": {
"tasks": {
"one": "{{count}} Aufgabe",
"other": "{{count}} Aufgaben"
},
"agents": {
"one": "{{count}} Agent",
"other": "{{count}} Agenten"
},
"tools": {
"one": "{{count}} Werkzeug",
"other": "{{count}} Werkzeuge"
},
"skills": {
"one": "{{count}} Skill",
"other": "{{count}} Skills"
},
"processes": {
"one": "{{count}} Prozess",
"other": "{{count}} Prozesse"
},
"affordances": {
"one": "{{count}} Affordance",
"other": "{{count}} Affordances"
}
},
"newChatsOnly": "Gilt für neue Chats — ein bereits geöffneter behält, was er beim Start hatte.",
"noDescription": {
"one": "{{count}} Skill hat keine Beschreibung, daher wird sie keinem Agenten angeboten.",
"other": "{{count}} Skills haben keine Beschreibung, daher werden sie keinem Agenten angeboten."
}
},
"bugReport": {
"label": "Fehler melden",
"title": "Fehler melden",
"describePlaceholder": "Beschreiben Sie, was schiefgelaufen ist...",
"screenshot": "Screenshot",
"noScreenshot": "Kein Screenshot aufgenommen",
"collectedNote": "Konsolenprotokolle, Browserinformationen und aktuelle API-Fehler werden automatisch erfasst.",
"submitted": "Fehlerbericht gesendet",
"failed": "Fehlerbericht konnte nicht gesendet werden",
"submit": "Senden"
},
"auth": {
"signInTitle": "Willkommen zurück",
"signInSubtitle": "Melden Sie sich bei Ihrem Konto an",
"emailOrUsername": "E-Mail oder Benutzername",
"password": "Passwort",
"forgotPassword": "Passwort vergessen?",
"emailPlaceholder": "name@beispiel.de",
"passwordPlaceholder": "Ihr Passwort",
"forgotTitle": "Passwort vergessen",
"forgotSubtitle": "Geben Sie Ihre E-Mail-Adresse ein, um einen Link zum Zurücksetzen zu erhalten",
"email": "E-Mail",
"backToLogin": "Zurück zur Anmeldung",
"checkEmail": "Prüfen Sie Ihre E-Mails",
"checkEmailHint": "Klicken Sie darauf, um Ihr Passwort zurückzusetzen.",
"resetOk": "Passwort erfolgreich zurückgesetzt. Bitte melden Sie sich an.",
"verifying": "Wird überprüft…",
"invalidLink": "Ungültiger Link",
"invalidLinkHint": "Dieser Link zum Zurücksetzen ist ungültig oder abgelaufen.",
"resetTitle": "Passwort zurücksetzen",
"resetSubtitle": "Geben Sie Ihr neues Passwort ein",
"confirmPassword": "Passwort bestätigen",
"minChars": "Mindestens 12 Zeichen",
"confirmPlaceholder": "Bestätigen Sie Ihr Passwort",
"bootstrapTitle": "Willkommen, Administrator",
"bootstrapSubtitle": "Erstellen Sie Ihr Administratorkonto",
"name": "Name",
"username": "Benutzername",
"namePlaceholder": "Ihr Name",
"adminEmailPlaceholder": "admin@beispiel.de",
"bootstrapOk": "Administratorkonto erstellt. Bitte melden Sie sich an.",
"debug": {
"controls": "Steuerung:",
"camera": "Kamera:",
"model": "Modell:"
}
},
"shortcuts": {
"navigation": "Navigation",
"spotlight": "Spotlight — zu jedem Bildschirm, Plugin oder jeder Einstellung per Namen springen",
"thisList": "Diese Liste",
"themes": "Designs",
"themesNote": "Der Browser wendet die Änderung an, während Sie sich bewegen, sodass Sie sehen, wie sich die App verändert, statt Namen zu lesen.",
"openBrowser": "Den Design-Browser öffnen",
"prevNextTheme": "Vorheriges / nächstes Design, ohne etwas zu öffnen",
"starCurrent": "Das aktuelle Design von überall markieren oder die Markierung aufheben",
"inBrowser": "Im Design-Browser",
"moveList": "Durch die Liste bewegen",
"applyKeepBrowsing": "Das fokussierte Design anwenden und weiter durchsuchen",
"restoreStart": "Das Design wiederherstellen, mit dem Sie begonnen haben",
"starFocused": "Das fokussierte Design markieren oder die Markierung aufheben",
"keepLooking": "Behalten, was Sie sich gerade ansehen",
"cancelRestore": "Abbrechen und wiederherstellen",
"inSpotlight": "In Spotlight",
"moveResults": "Durch die Ergebnisse bewegen",
"goThere": "Dorthin gehen",
"close": "Schließen",
"chat": "Chat",
"chatNote": "Der Verlaufsabruf reagiert nur bei LEEREM Eingabefeld auf die Pfeiltaste, und jede andere Taste beendet ihn — so wird ein Entwurf nie überschrieben.",
"prevNextPrompt": "Vorheriger / nächster gesendeter Prompt, wie in einer Shell",
"send": "Senden · bei leerem Eingabefeld mit etwas in der Warteschlange wird das jetzt gesendet",
"newline": "Zeilenumbruch",
"stopTurn": "Den gerade laufenden Turn stoppen"
},
"jobs": {
"runningQueued": "In Ausführung und in Warteschlange",
"loading": "Wird geladen…",
"nothingRunning": "Nichts läuft",
"history": "Verlauf",
"clearAll": "Alles löschen",
"selectJob": "Wählen Sie einen Job aus",
"notFound": "Job nicht gefunden.",
"backToJobs": "Zurück zu den Jobs",
"stop": "Stopp",
"testNotification": "Eine Testbenachrichtigung an alle konfigurierten Kanäle senden",
"search": "Suchen…",
"deleteFinished": "Alle abgeschlossenen Jobs löschen",
"noChannels": "Keine Kanäle konfiguriert",
"notifyFailed": "Benachrichtigung konnte nicht gesendet werden",
"stopRequested": "Stopp angefordert",
"stopFailed": "Stopp fehlgeschlagen",
"titles": "Titel",
"download": "Herunterladen",
"input": "Eingabe",
"output": "Ausgabe",
"steps": "Schritte",
"selectStep": "Wählen Sie einen Schritt oder eine Unteraufgabe, um die Ausgabe anzuzeigen",
"noOutput": "Noch keine Ausgabe",
"tokens": "Tokens:",
"cost": "Kosten:",
"status": {
"running": "Läuft",
"queued": "In Warteschlange",
"completed": "Abgeschlossen",
"failed": "Fehlgeschlagen",
"stopped": "Gestoppt",
"interrupted": "Unterbrochen"
},
"failedWithCode": "Fehlgeschlagen (Exit {{code}})"
},
"activity": {
"title": "Aktivität",
"backgroundTasks": "Hintergrundaufgaben",
"detached": "Abgekoppelt",
"backToList": "Zurück zur Liste",
"selectTask": "Wählen Sie eine Aufgabe aus, um ihre Live-Ausgabe zu verfolgen",
"noneRunning": "keine läuft"
},
"passkeyGate": {
"setUp": "Richten Sie Ihren Passkey ein"
},
"chatHistory": {
"loadFailed": "Diese Unterhaltung konnte nicht geladen werden: {{reason}}"
},
"capability": {
"frontmatter": "Frontmatter",
"noMatches": "Keine Treffer",
"emptyFile": "Leere Datei",
"createFailed": "{{kind}} konnte nicht erstellt werden",
"deleteFailed": "{{kind}} konnte nicht gelöscht werden",
"searchPlaceholder": "{{kind}} durchsuchen…",
"selectOne": "{{kind}} auswählen",
"selectToView": "{{kind}} auswählen, um den Inhalt anzuzeigen",
"delete": "Löschen",
"createPrompt": "Hilf mir, den Inhalt für diese neue {{kind}}-Datei zu erstellen",
"improvePrompt": "Hilf mir, diese {{kind}}-Datei zu verstehen und zu verbessern"
}
}
+2 -1
View File
@@ -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('officer-web (app.*) 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([]);
});
});