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:
@@ -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),
|
||||
}));
|
||||
|
||||
@@ -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"
|
||||
}
|
||||
}
|
||||
@@ -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([]);
|
||||
});
|
||||
});
|
||||
|
||||
@@ -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([]);
|
||||
});
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user