perf+security: fix build, secure downloads, dedupe translations, refactor i18n
All checks were successful
Deploy to Production / Build and Deploy (push) Successful in 2m49s
All checks were successful
Deploy to Production / Build and Deploy (push) Successful in 2m49s
Frontend:
- Fix Framer Motion / motion-dom build error by pinning framer-motion to
11.18.2 (compatible with React 19 and Next.js 16).
- Add cross-env and build:local script to bypass standalone symlink errors
on Windows without Developer Mode.
- Allow NEXT_OUTPUT=default to disable standalone output for local builds.
- Refactor i18n: split 14,177-line src/lib/i18n.tsx into per-locale,
per-namespace JSON files under src/lib/i18n/messages/.
- Load English synchronously; other locales loaded on demand via dynamic
imports (reduces initial bundle, improves maintainability).
- Remove unused next-intl message files src/messages/en.json and fr.json.
Backend:
- Remove insecure legacy /api/v1/download/{filename} and /api/v1/cleanup/{filename}
endpoints. The job-based /api/v1/download/{job_id} already enforces ownership.
- Deduplicate texts in TranslationService.translate_batch before sending them
to the provider, reducing API calls for repeated strings.
- Pin httpx to <0.28 to fix TestClient incompatibility with starlette 0.35.1.
- Add pytest-cov and ruff dev dependencies/config.
DevOps:
- Remove hardcoded Grafana password from docker-compose.yml and
docker-compose.monitoring.yml; use GRAFANA_PASSWORD env var.
- Change default TRANSLATION_SERVICE from ollama to google in
docker-compose.yml (Ollama is an optional profile).
- Add GRAFANA_PASSWORD to .env.example.
- Add .coverage and frontend/pnpm-workspace.yaml to .gitignore.
Tests:
- Update API versioning tests for removed legacy endpoints.
- Add tests/test_translation_service.py for deduplication behavior.
Verified:
- pnpm run build:local passes.
- uv run pytest tests/test_providers/* tests/test_translation_service.py
tests/test_story_3_5_api_versioning.py tests/test_download_endpoint.py
tests/test_translators/test_excel_translator.py: provider/translator tests
pass; one pre-existing French error-message test still fails (message is
returned in English, unrelated to this change).
This commit is contained in:
48
frontend/src/lib/i18n/messages/de/admin.json
Normal file
48
frontend/src/lib/i18n/messages/de/admin.json
Normal file
@@ -0,0 +1,48 @@
|
||||
{
|
||||
"admin.login.title": "Administration",
|
||||
"admin.login.required": "Anmeldung erforderlich",
|
||||
"admin.login.password": "Admin-Passwort",
|
||||
"admin.login.connecting": "Verbindung wird hergestellt...",
|
||||
"admin.login.access": "Admin-Panel öffnen",
|
||||
"admin.login.restricted": "Nur für Administratoren",
|
||||
"admin.layout.checking": "Authentifizierung wird überprüft...",
|
||||
"admin.dashboard.title": "Admin-Dashboard",
|
||||
"admin.dashboard.subtitle": "Administratorkontrollpanel",
|
||||
"admin.dashboard.refresh": "Aktualisieren",
|
||||
"admin.dashboard.refreshTooltip": "Dashboard-Daten aktualisieren",
|
||||
"admin.dashboard.config": "Systemkonfiguration",
|
||||
"admin.dashboard.maxFileSize": "Max. Dateigröße:",
|
||||
"admin.dashboard.translationService": "Übersetzungsdienst:",
|
||||
"admin.dashboard.formats": "Formate:",
|
||||
"admin.nav.dashboard": "Dashboard",
|
||||
"admin.nav.users": "Benutzer",
|
||||
"admin.nav.pricing": "Preise & Stripe",
|
||||
"admin.nav.providers": "Anbieter",
|
||||
"admin.nav.system": "System",
|
||||
"admin.nav.logs": "Protokolle",
|
||||
"admin.users.title": "Benutzerverwaltung",
|
||||
"admin.users.subtitle": "Benutzerkonten anzeigen und verwalten",
|
||||
"admin.users.planUpdated": "Plan aktualisiert",
|
||||
"admin.users.planChanged": "Der Plan wurde erfolgreich zu \\\"{plan}\\\" geändert.",
|
||||
"admin.users.unknownError": "Unbekannter Fehler",
|
||||
"admin.users.error": "Fehler",
|
||||
"admin.users.planUpdateError": "Plan konnte nicht aktualisiert werden: {message}",
|
||||
"admin.users.noKeys": "Keine Schlüssel",
|
||||
"admin.users.noKeysDesc": "Dieser Benutzer hat keine aktiven API-Schlüssel.",
|
||||
"admin.users.keysRevoked": "Schlüssel widerrufen",
|
||||
"admin.users.keysRevokedDesc": "{count} API-Schlüssel erfolgreich widerrufen.",
|
||||
"admin.users.revokeError": "Schlüssel konnten nicht widerrufen werden: {message}",
|
||||
"admin.users.retry": "Erneut versuchen",
|
||||
"admin.system.title": "System",
|
||||
"admin.system.subtitle": "Systemstatus überwachen und Ressourcen verwalten",
|
||||
"admin.system.quotas": "Übersetzungskontingente",
|
||||
"admin.system.resetQuotas": "Monatliche Kontingente zurücksetzen",
|
||||
"admin.system.resetting": "Zurücksetzen...",
|
||||
"admin.system.reset": "Zurücksetzen",
|
||||
"admin.system.allOperational": "Alle Systeme betriebsbereit",
|
||||
"admin.system.issuesDetected": "Systemprobleme erkannt",
|
||||
"admin.system.waitingData": "Warte auf Daten...",
|
||||
"admin.system.purging": "Bereinigung läuft...",
|
||||
"admin.system.clean": "Bereinigen",
|
||||
"admin.system.purge": "Bereinigen"
|
||||
}
|
||||
72
frontend/src/lib/i18n/messages/de/apiKeys.json
Normal file
72
frontend/src/lib/i18n/messages/de/apiKeys.json
Normal file
@@ -0,0 +1,72 @@
|
||||
{
|
||||
"apiKeys.webhook.title": "Intégration Webhook",
|
||||
"apiKeys.webhook.descriptionBefore": "Passez un paramètre ",
|
||||
"apiKeys.webhook.descriptionAfter": " pour recevoir une requête POST lorsque votre traduction est terminée.",
|
||||
"apiKeys.webhook.codeParam": "webhook_url",
|
||||
"apiKeys.title": "API-Schlüssel",
|
||||
"apiKeys.subtitle": "Verwalten Sie Ihre API-Schlüssel für den programmgesteuerten Zugriff auf die Übersetzungs-API.",
|
||||
"apiKeys.loading": "Laden...",
|
||||
"apiKeys.sectionTitle": "API & Automatisierung",
|
||||
"apiKeys.sectionDesc": "Generieren und verwalten Sie Ihre API-Schlüssel für Automatisierungs-Workflows",
|
||||
"apiKeys.keysUsed": "{total} von {max} Schlüsseln verwendet",
|
||||
"apiKeys.maxReached": "Maximale Anzahl an Schlüsseln erreicht. Widerrufen Sie einen Schlüssel, um einen neuen zu generieren.",
|
||||
"apiKeys.canGenerate": "Sie können {count} weiteren Schlüssel generieren",
|
||||
"apiKeys.canGeneratePlural": "Sie können {count} weitere Schlüssel generieren",
|
||||
"apiKeys.generateNew": "Neuen Schlüssel generieren",
|
||||
"apiKeys.keyRevoked": "Schlüssel widerrufen",
|
||||
"apiKeys.keyRevokedDesc": "Der API-Schlüssel wurde erfolgreich widerrufen.",
|
||||
"apiKeys.keyNotFound": "Schlüssel nicht gefunden",
|
||||
"apiKeys.keyNotFoundDesc": "Der API-Schlüssel existiert nicht mehr. Er wurde möglicherweise bereits widerrufen.",
|
||||
"apiKeys.error": "Fehler",
|
||||
"apiKeys.revokeError": "Der API-Schlüssel konnte nicht widerrufen werden. Bitte versuchen Sie es erneut.",
|
||||
"apiKeys.limitReached": "Limit erreicht",
|
||||
"apiKeys.limitReachedDesc": "Sie haben das Maximum von 10 API-Schlüsseln erreicht. Widerrufen Sie einen vorhandenen Schlüssel, um einen neuen zu generieren.",
|
||||
"apiKeys.proRequired": "Pro-Funktion erforderlich",
|
||||
"apiKeys.proRequiredDesc": "API-Schlüssel sind eine Pro-Funktion. Bitte upgraden Sie Ihr Konto.",
|
||||
"apiKeys.generateError": "API-Schlüssel konnte nicht generiert werden. Bitte versuchen Sie es erneut.",
|
||||
"apiKeys.upgrade.title": "API-Schlüssel",
|
||||
"apiKeys.upgrade.subtitle": "Automatisieren Sie Ihre Übersetzungen mit API-Zugang",
|
||||
"apiKeys.upgrade.feat1": "Generieren Sie unbegrenzt API-Schlüssel",
|
||||
"apiKeys.upgrade.feat2": "Automatisieren Sie die Dokumentübersetzung",
|
||||
"apiKeys.upgrade.feat3": "Webhook-Benachrichtigungen",
|
||||
"apiKeys.upgrade.feat4": "LLM-Übersetzungsmodi",
|
||||
"apiKeys.upgrade.proFeature": "API-Schlüssel sind eine {pro}-Funktion. Upgraden Sie, um API-Automatisierung freizuschalten.",
|
||||
"apiKeys.upgrade.pro": "Pro",
|
||||
"apiKeys.upgrade.cta": "Auf Pro upgraden",
|
||||
"apiKeys.dialog.maxTitle": "Maximale Anzahl an Schlüsseln erreicht",
|
||||
"apiKeys.dialog.maxDesc": "Sie haben das Maximum von 10 API-Schlüsseln erreicht. Bitte widerrufen Sie einen vorhandenen Schlüssel, bevor Sie einen neuen generieren.",
|
||||
"apiKeys.dialog.close": "Schließen",
|
||||
"apiKeys.dialog.generated": "API-Schlüssel generiert!",
|
||||
"apiKeys.dialog.generatedDesc": "Ihr neuer API-Schlüssel wurde erstellt. Kopieren Sie ihn jetzt – er wird nicht erneut angezeigt.",
|
||||
"apiKeys.dialog.important": "Wichtig:",
|
||||
"apiKeys.dialog.importantDesc": "Dies ist das einzige Mal, dass Sie diesen Schlüssel sehen. Speichern Sie ihn sicher.",
|
||||
"apiKeys.dialog.apiKey": "API-Schlüssel",
|
||||
"apiKeys.dialog.name": "Name:",
|
||||
"apiKeys.dialog.done": "Fertig",
|
||||
"apiKeys.dialog.copied": "Ich habe den Schlüssel kopiert",
|
||||
"apiKeys.dialog.generateTitle": "Neuen API-Schlüssel generieren",
|
||||
"apiKeys.dialog.generateDesc": "Erstellen Sie einen neuen API-Schlüssel für den programmgesteuerten Zugriff auf die Übersetzungs-API.",
|
||||
"apiKeys.dialog.keyName": "Schlüsselname (optional)",
|
||||
"apiKeys.dialog.keyNamePlaceholder": "z.B., Produktion, Staging",
|
||||
"apiKeys.dialog.keyNameHint": "Ein beschreibender Name, um diesen Schlüssel später zu identifizieren.",
|
||||
"apiKeys.dialog.nameTooLong": "Der Name muss {max} Zeichen oder weniger haben",
|
||||
"apiKeys.dialog.nameInvalid": "Der Name darf nur Buchstaben, Zahlen, Leerzeichen, Bindestriche und Unterstriche enthalten",
|
||||
"apiKeys.dialog.cancel": "Abbrechen",
|
||||
"apiKeys.dialog.generating": "Wird generiert...",
|
||||
"apiKeys.dialog.generate": "Schlüssel generieren",
|
||||
"apiKeys.table.name": "Name",
|
||||
"apiKeys.table.prefix": "Präfix",
|
||||
"apiKeys.table.created": "Erstellt",
|
||||
"apiKeys.table.lastUsed": "Zuletzt verwendet",
|
||||
"apiKeys.table.never": "Nie",
|
||||
"apiKeys.table.actions": "Aktionen",
|
||||
"apiKeys.table.revoke": "Widerrufen",
|
||||
"apiKeys.table.copyPrefix": "Schlüsselpräfix kopieren",
|
||||
"apiKeys.table.revokeKey": "Schlüssel widerrufen",
|
||||
"apiKeys.revokeDialog.title": "API-Schlüssel widerrufen",
|
||||
"apiKeys.revokeDialog.desc": "Sind Sie sicher, dass Sie den Schlüssel \\\"{name}\\\" widerrufen möchten? Diese Aktion kann nicht rückgängig gemacht werden.",
|
||||
"apiKeys.revokeDialog.confirm": "Ja, widerrufen",
|
||||
"apiKeys.revokeDialog.cancel": "Abbrechen",
|
||||
"apiKeys.noKeysGenerated": "Keine Schlüssel generiert",
|
||||
"apiKeys.copied": "Kopiert!"
|
||||
}
|
||||
3
frontend/src/lib/i18n/messages/de/auth.json
Normal file
3
frontend/src/lib/i18n/messages/de/auth.json
Normal file
@@ -0,0 +1,3 @@
|
||||
{
|
||||
"auth.brandName": "Wordly"
|
||||
}
|
||||
12
frontend/src/lib/i18n/messages/de/checkout.json
Normal file
12
frontend/src/lib/i18n/messages/de/checkout.json
Normal file
@@ -0,0 +1,12 @@
|
||||
{
|
||||
"checkout.activating": "Wird aktiviert…",
|
||||
"checkout.activatingDesc": "Wir aktualisieren Ihr Abonnement, bitte warten Sie.",
|
||||
"checkout.paymentConfirmed": "Zahlung bestätigt!",
|
||||
"checkout.subscriptionActivated": "Abonnement aktiviert!",
|
||||
"checkout.planActivated": "{plan}-Plan aktiviert!",
|
||||
"checkout.redirectingToProfile": "Weiterleitung zu Ihrem Profil…",
|
||||
"checkout.paymentReceived": "Zahlung erhalten",
|
||||
"checkout.redirecting": "Weiterleitung…",
|
||||
"checkout.syncError": "Synchronisierungsfehler",
|
||||
"checkout.networkError": "Netzwerkfehler. Ihre Zahlung ist bestätigt — bitte laden Sie Ihr Profil neu."
|
||||
}
|
||||
4
frontend/src/lib/i18n/messages/de/common.json
Normal file
4
frontend/src/lib/i18n/messages/de/common.json
Normal file
@@ -0,0 +1,4 @@
|
||||
{
|
||||
"common.loading": "Laden...",
|
||||
"common.backToHome": "Zurück zur Startseite"
|
||||
}
|
||||
25
frontend/src/lib/i18n/messages/de/context.json
Normal file
25
frontend/src/lib/i18n/messages/de/context.json
Normal file
@@ -0,0 +1,25 @@
|
||||
{
|
||||
"context.proTitle": "Pro-Funktion",
|
||||
"context.proDesc": "Kontext und professionelle Glossare sind mit den Plänen Pro, Business und Enterprise verfügbar. Sie bieten genauere Übersetzungen durch Anweisungen und domänenspezifisches Vokabular.",
|
||||
"context.viewPlans": "Pläne ansehen",
|
||||
"context.title": "Kontext & Glossar",
|
||||
"context.subtitle": "Verbessern Sie die Übersetzungsqualität mit Anweisungen und domänenspezifischem Vokabular.",
|
||||
"context.presets.title": "Professionelle Glossare",
|
||||
"context.presets.desc": "Laden Sie ein vollständiges Glossar mit Anweisungen und spezieller Terminologie",
|
||||
"context.instructions.title": "Kontextanweisungen",
|
||||
"context.instructions.desc": "Anweisungen, denen die KI während der Übersetzung folgt",
|
||||
"context.instructions.placeholder": "Z.B.: Sie übersetzen HVAC-Fachdokumente. Verwenden Sie präzise Ingenieurterminologie...",
|
||||
"context.glossary.title": "Technisches Glossar",
|
||||
"context.glossary.desc": "Format: Quelle=Ziel (eines pro Zeile). Über Voreinstellung geladene Glossare sind bearbeitbar.",
|
||||
"context.glossary.terms": "Begriffe im Glossar",
|
||||
"context.clearAll": "Alles löschen",
|
||||
"context.saving": "Wird gespeichert...",
|
||||
"context.save": "Speichern",
|
||||
"context.presets.createGlossary": "Glossar erstellen",
|
||||
"context.presets.created": "Glossar erstellt",
|
||||
"context.presets.createdDesc": "Das Glossar \\\"{name}\\\" wurde mit {count} Begriffen erstellt.",
|
||||
"context.presets.hint": "Klicken Sie auf ein Preset, um ein Glossar mit domänenspezifischen Begriffen zu erstellen. Verwalten Sie Ihre Glossare im Glossar-Bereich.",
|
||||
"context.glossary.manage": "Glossare verwalten",
|
||||
"context.saved": "Gespeichert",
|
||||
"context.savedDesc": "Ihre Kontextanweisungen wurden gespeichert."
|
||||
}
|
||||
7
frontend/src/lib/i18n/messages/de/cookieConsent.json
Normal file
7
frontend/src/lib/i18n/messages/de/cookieConsent.json
Normal file
@@ -0,0 +1,7 @@
|
||||
{
|
||||
"cookieConsent.title": "Cookies auf Wordly",
|
||||
"cookieConsent.description": "Wir verwenden essenzielle Cookies, damit die App funktioniert (Sitzung, Sicherheit, Sprache). Mit Ihrer Erlaubnis verwenden wir auch optionale Cookies zur Verkehrsmessung und Produktverbesserung.",
|
||||
"cookieConsent.acceptAll": "Alle akzeptieren",
|
||||
"cookieConsent.essentialOnly": "Nur Essenzielle",
|
||||
"cookieConsent.learnMore": "Mehr erfahren"
|
||||
}
|
||||
111
frontend/src/lib/i18n/messages/de/dashboard.json
Normal file
111
frontend/src/lib/i18n/messages/de/dashboard.json
Normal file
@@ -0,0 +1,111 @@
|
||||
{
|
||||
"dashboard.nav.translate": "Übersetzen",
|
||||
"dashboard.nav.profile": "Mein Profil",
|
||||
"dashboard.nav.settings": "Einstellungen",
|
||||
"dashboard.nav.context": "Kontext",
|
||||
"dashboard.nav.services": "Dienste",
|
||||
"dashboard.nav.apiKeys": "API-Schlüssel",
|
||||
"dashboard.nav.glossaries": "Glossare",
|
||||
"dashboard.header.title": "Dashboard",
|
||||
"dashboard.header.subtitle": "Verwalten Sie Ihre Übersetzungen",
|
||||
"dashboard.header.toggleMenu": "Menü",
|
||||
"dashboard.header.profileTitle": "Mein Profil",
|
||||
"dashboard.sidebar.theme": "Design",
|
||||
"dashboard.sidebar.signOut": "Abmelden",
|
||||
"dashboard.sidebar.backHome": "Zurück zur Startseite",
|
||||
"dashboard.sidebar.upgradeToPro": "Auf Pro upgraden →",
|
||||
"dashboard.translate.pageTitle": "Dokument übersetzen",
|
||||
"dashboard.translate.pageSubtitle": "Datei importieren und Zielsprache wählen",
|
||||
"dashboard.translate.errorNotificationTitle": "Fehler",
|
||||
"dashboard.translate.dropzone.uploadAria": "Datei-Ablagebereich",
|
||||
"dashboard.translate.dropzone.title": "Datei hierher ziehen und ablegen",
|
||||
"dashboard.translate.dropzone.subtitle": "oder klicken, um auszuwählen (DOCX, XLSX, PPTX, PDF)",
|
||||
"dashboard.translate.dropzone.replaceFile": "Datei ersetzen",
|
||||
"dashboard.translate.language.source": "Ausgangssprache",
|
||||
"dashboard.translate.language.target": "Zielsprache",
|
||||
"dashboard.translate.language.loading": "Sprachen werden geladen…",
|
||||
"dashboard.translate.language.autoDetect": "Automatisch erkennen",
|
||||
"dashboard.translate.language.selectPlaceholder": "Auswählen…",
|
||||
"dashboard.translate.language.loadErrorPrefix": "Fehler beim Laden der Sprachen",
|
||||
"dashboard.translate.provider.loading": "Anbieter werden geladen…",
|
||||
"dashboard.translate.provider.noneConfigured": "Keine Anbieter konfiguriert",
|
||||
"dashboard.translate.provider.modelTitle": "Modell",
|
||||
"dashboard.translate.provider.sectionTitle": "Anbieter",
|
||||
"dashboard.translate.provider.llmDivider": "KI · Kontextbasiert",
|
||||
"dashboard.translate.provider.llmDividerPro": "KI · Kontextbasiert (Pro)",
|
||||
"dashboard.translate.provider.upgrade": "Auf Pro upgraden",
|
||||
"dashboard.translate.provider.upgradeSuffix": "um KI-Übersetzung freizuschalten",
|
||||
"dashboard.translate.trust.zeroRetention": "Keine Datenspeicherung",
|
||||
"dashboard.translate.trust.deletedAfter": "Dateien nach Verarbeitung gelöscht",
|
||||
"dashboard.translate.actions.uploading": "Wird hochgeladen…",
|
||||
"dashboard.translate.actions.translate": "Übersetzen",
|
||||
"dashboard.translate.actions.filePrefix": "Datei: ",
|
||||
"dashboard.translate.actions.cancel": "Abbrechen",
|
||||
"dashboard.translate.actions.tryAgain": "Erneut versuchen",
|
||||
"dashboard.translate.steps.uploading": "Datei wird hochgeladen…",
|
||||
"dashboard.translate.steps.starting": "Übersetzung wird gestartet…",
|
||||
"dashboard.translate.complete.title": "Übersetzung abgeschlossen!",
|
||||
"dashboard.translate.complete.descNamed": "Ihre Datei {name} wurde erfolgreich übersetzt.",
|
||||
"dashboard.translate.complete.descGeneric": "Ihre Datei wurde erfolgreich übersetzt.",
|
||||
"dashboard.translate.complete.downloading": "Wird heruntergeladen…",
|
||||
"dashboard.translate.complete.download": "Herunterladen",
|
||||
"dashboard.translate.complete.newTranslation": "Neue Übersetzung",
|
||||
"dashboard.translate.complete.toastOkTitle": "Erfolgreich",
|
||||
"dashboard.translate.complete.toastOkDesc": "{name} wurde erfolgreich heruntergeladen.",
|
||||
"dashboard.translate.complete.toastFailTitle": "Fehlgeschlagen",
|
||||
"dashboard.translate.complete.toastFailDesc": "Übersetzung fehlgeschlagen. Bitte versuchen Sie es erneut.",
|
||||
"dashboard.translate.sourceDocument": "Quelldokument",
|
||||
"dashboard.translate.configuration": "Konfiguration",
|
||||
"dashboard.translate.translating": "Übersetzung läuft",
|
||||
"dashboard.translate.liveMonitor": "Live-Monitor",
|
||||
"dashboard.translate.summary": "Zusammenfassung",
|
||||
"dashboard.translate.engine": "Engine",
|
||||
"dashboard.translate.confidence": "Konfidenz",
|
||||
"dashboard.translate.cancel": "Abbrechen",
|
||||
"dashboard.translate.segments": "Segmente",
|
||||
"dashboard.translate.characters": "Zeichen",
|
||||
"dashboard.translate.elapsed": "Verstrichen",
|
||||
"dashboard.translate.segPerMin": "Seg/Min",
|
||||
"dashboard.translate.highQuality": "Hohe Qualität",
|
||||
"dashboard.translate.quality": "Qualität",
|
||||
"dashboard.translate.completed": "Übersetzung abgeschlossen",
|
||||
"dashboard.translate.replace": "Ersetzen",
|
||||
"dashboard.translate.pdfMode.title": "PDF-Übersetzungsmodus",
|
||||
"dashboard.translate.pdfMode.preserveLayout": "Layout beibehalten",
|
||||
"dashboard.translate.pdfMode.textOnly": "Nur Text",
|
||||
"dashboard.translate.pdfMode.preserveLayoutDesc": "Behält Bilder, Tabellen und Formatierung. Ideal für einfache PDFs.",
|
||||
"dashboard.translate.pdfMode.textOnlyDesc": "Übersetzt den gesamten Text perfekt. Saubere Ausgabe ohne Layoutprobleme.",
|
||||
"dashboard.translate.pipeline.upload": "Hochladen",
|
||||
"dashboard.translate.pipeline.analyze": "Analysieren",
|
||||
"dashboard.translate.pipeline.translate": "Übersetzung",
|
||||
"dashboard.translate.pipeline.rebuild": "Rekonstruieren",
|
||||
"dashboard.translate.pipeline.finalize": "Finalisieren",
|
||||
"dashboard.translate.progress.processingFallback": "Verarbeitung läuft…",
|
||||
"dashboard.translate.progress.connectionLost": "Verbindung verloren. Erneut versuchen…",
|
||||
"dashboard.translate.progress.failedTitle": "Übersetzung fehlgeschlagen",
|
||||
"dashboard.translate.error.unexpected": "Ein unerwarteter Fehler ist aufgetreten. Bitte versuchen Sie es erneut.",
|
||||
"dashboard.translate.error.noResult": "Die Übersetzung hat keine Ergebnisse geliefert. Stellen Sie sicher, dass das Dokument Text enthält, und versuchen Sie es erneut oder wählen Sie eine andere Engine.",
|
||||
"dashboard.translate.error.apiKey": "Ungültiger oder fehlender API-Schlüssel. Kontaktieren Sie den Administrator zur Konfiguration.",
|
||||
"dashboard.translate.error.quota": "Nutzungslimit erreicht. Versuchen Sie es in wenigen Minuten erneut oder wählen Sie eine andere Engine.",
|
||||
"dashboard.translate.error.timeout": "Verbindung zum Übersetzungsdienst zeitüberschritten. Prüfen Sie Ihr Netzwerk und versuchen Sie es erneut.",
|
||||
"dashboard.translate.error.sessionExpired": "Sitzung abgelaufen. Klicken Sie auf Erneut versuchen, um die Übersetzung neu zu starten.",
|
||||
"dashboard.translate.error.empty": "Das Dokument scheint leer zu sein oder enthält keinen übersetzbaren Text (eingescanntes PDF?).",
|
||||
"dashboard.translate.error.unsupported": "Nicht unterstütztes Dateiformat oder beschädigte Datei.",
|
||||
"dashboard.translate.error.connection": "Verbindung verloren. Prüfen Sie Ihr Netzwerk und versuchen Sie es erneut.",
|
||||
"dashboard.translate.error.generic": "Übersetzung fehlgeschlagen: {detail}",
|
||||
"dashboard.translate.error.title": "Übersetzung fehlgeschlagen",
|
||||
"dashboard.translate.retry": "Übersetzung erneut versuchen",
|
||||
"dashboard.translate.newFile": "Neue Datei",
|
||||
"dashboard.translate.modeAI": "KI-Modus",
|
||||
"dashboard.translate.modeClassic": "Klassischer Modus",
|
||||
"dashboard.translate.glossaryLLMHint": "Glossare im KI-Modus verfügbar",
|
||||
"dashboard.translate.submitting": "Wird gesendet...",
|
||||
"dashboard.translate.submit": "Übersetzung starten",
|
||||
"dashboard.translate.noFile": "Laden Sie zuerst eine Datei hoch",
|
||||
"dashboard.translate.noTargetLang": "Wählen Sie eine Zielsprache",
|
||||
"dashboard.topbar.interfaceLabel": "Übersetzungsoberfläche",
|
||||
"dashboard.topbar.premiumAccess": "Premium-Zugang",
|
||||
"dashboard.checkoutSyncError": "Fehler beim Synchronisieren der Zahlung.",
|
||||
"dashboard.networkRefresh": "Netzwerkfehler. Bitte aktualisieren Sie die Seite.",
|
||||
"dashboard.continueToTranslate": "Weiter zur Übersetzung"
|
||||
}
|
||||
31
frontend/src/lib/i18n/messages/de/fileUploader.json
Normal file
31
frontend/src/lib/i18n/messages/de/fileUploader.json
Normal file
@@ -0,0 +1,31 @@
|
||||
{
|
||||
"fileUploader.uploadDocument": "Dokument hochladen",
|
||||
"fileUploader.uploadDesc": "Datei per Drag & Drop ablegen oder klicken (Excel, Word, PowerPoint)",
|
||||
"fileUploader.dropHere": "Datei hier ablegen…",
|
||||
"fileUploader.dragAndDrop": "Dokument hierher ziehen",
|
||||
"fileUploader.orClickBrowse": "oder klicken Sie zum Durchsuchen",
|
||||
"fileUploader.preview": "Vorschau",
|
||||
"fileUploader.translationOptions": "Übersetzungsoptionen",
|
||||
"fileUploader.configureSettings": "Übersetzungseinstellungen anpassen",
|
||||
"fileUploader.targetLanguage": "Zielsprache",
|
||||
"fileUploader.selectLanguage": "Sprache wählen",
|
||||
"fileUploader.translationProvider": "Übersetzungsanbieter",
|
||||
"fileUploader.selectProvider": "Anbieter wählen",
|
||||
"fileUploader.advancedOptions": "Erweiterte Optionen",
|
||||
"fileUploader.translateImages": "Bilder übersetzen",
|
||||
"fileUploader.translating": "Übersetzung läuft…",
|
||||
"fileUploader.translateDocument": "Dokument übersetzen",
|
||||
"fileUploader.processing": "Verarbeitung…",
|
||||
"fileUploader.translationError": "Übersetzungsfehler",
|
||||
"fileUploader.translationComplete": "Übersetzung abgeschlossen!",
|
||||
"fileUploader.translationCompleteDesc": "Ihr Dokument wurde erfolgreich übersetzt und die Formatierung beibehalten.",
|
||||
"fileUploader.download": "Übersetztes Dokument herunterladen",
|
||||
"fileUploader.webgpuUnsupported": "WebGPU wird in diesem Browser nicht unterstützt. Bitte verwenden Sie Chrome 113+ oder Edge 113+.",
|
||||
"fileUploader.webllmNotLoaded": "WebLLM-Modell nicht geladen. Gehen Sie zu Einstellungen > Übersetzungsdienste, um ein Modell zu laden.",
|
||||
"fileUploader.extracting": "Texte aus Dokument extrahieren…",
|
||||
"fileUploader.noTranslatable": "Kein übersetzbarer Text im Dokument gefunden",
|
||||
"fileUploader.foundTexts": "{count} zu übersetzende Texte gefunden",
|
||||
"fileUploader.translatingItem": "Übersetze {current}/{total}: „{preview}\\\"",
|
||||
"fileUploader.reconstructing": "Dokument wird rekonstruiert…",
|
||||
"fileUploader.translatingLocally": "Lokale Übersetzung mit WebLLM…"
|
||||
}
|
||||
14
frontend/src/lib/i18n/messages/de/forgotPassword.json
Normal file
14
frontend/src/lib/i18n/messages/de/forgotPassword.json
Normal file
@@ -0,0 +1,14 @@
|
||||
{
|
||||
"forgotPassword.enterEmail": "Please enter your email address",
|
||||
"forgotPassword.error": "An error occurred",
|
||||
"forgotPassword.title": "Forgot Password",
|
||||
"forgotPassword.checkEmail": "Check your inbox",
|
||||
"forgotPassword.subtitle": "Enter your email to receive a reset link",
|
||||
"forgotPassword.sentMessage": "If an account exists with this address, a reset email has been sent.",
|
||||
"forgotPassword.emailLabel": "Email address",
|
||||
"forgotPassword.emailPlaceholder": "you@example.com",
|
||||
"forgotPassword.sending": "Sending...",
|
||||
"forgotPassword.sendLink": "Send reset link",
|
||||
"forgotPassword.backToLogin": "Back to login",
|
||||
"forgotPassword.loading": "Loading..."
|
||||
}
|
||||
189
frontend/src/lib/i18n/messages/de/glossaries.json
Normal file
189
frontend/src/lib/i18n/messages/de/glossaries.json
Normal file
@@ -0,0 +1,189 @@
|
||||
{
|
||||
"glossaries.yourGlossaries": "Ihre Glossare",
|
||||
"glossaries.title": "Glossare & Kontext",
|
||||
"glossaries.description": "Verwalten Sie Ihre Glossare und Kontextanweisungen für genauere Übersetzungen.",
|
||||
"glossaries.createNew": "Neu erstellen",
|
||||
"glossaries.empty": "Noch keine Glossare",
|
||||
"glossaries.emptyDesc": "Erstellen Sie Ihr erstes Glossar oder laden Sie eine professionelle Vorlage oben",
|
||||
"glossaries.defineTerms": "Begriffe",
|
||||
"glossaries.aboutTitle": "Über Glossare",
|
||||
"glossaries.aboutDesc": "Glossare ermöglichen es Ihnen, exakte Übersetzungen für bestimmte Begriffe zu definieren. Bei der Übersetzung werden die Glossarbegriffe für konsistente und präzise Übersetzungen verwendet.",
|
||||
"glossaries.aboutFormat": "Jeder Begriff hat ein Quellwort und Übersetzungen in mehreren Sprachen. Wählen Sie ein Glossar auf der Übersetzungsseite aus, um es anzuwenden.",
|
||||
"glossaries.toast.created": "Glossar erstellt",
|
||||
"glossaries.toast.createdDesc": "Das Glossar \\\"{name}\\\" wurde erstellt.",
|
||||
"glossaries.toast.imported": "Glossar importiert",
|
||||
"glossaries.toast.importedDesc": "Das Glossar \\\"{name}\\\" wurde importiert.",
|
||||
"glossaries.toast.updated": "Glossar aktualisiert",
|
||||
"glossaries.toast.updatedDesc": "Das Glossar \\\"{name}\\\" wurde aktualisiert.",
|
||||
"glossaries.toast.deleted": "Glossar gelöscht",
|
||||
"glossaries.toast.deletedDesc": "Das Glossar wurde gelöscht.",
|
||||
"glossaries.toast.error": "Fehler",
|
||||
"glossaries.toast.errorCreate": "Glossar konnte nicht erstellt werden",
|
||||
"glossaries.toast.errorImport": "Glossar konnte nicht importiert werden",
|
||||
"glossaries.toast.errorUpdate": "Glossar konnte nicht aktualisiert werden",
|
||||
"glossaries.toast.errorDelete": "Glossar konnte nicht gelöscht werden",
|
||||
"glossaries.dialog.title": "Neues Glossar",
|
||||
"glossaries.dialog.description": "Erstellen Sie ein Glossar für Ihre Übersetzungen",
|
||||
"glossaries.dialog.nameLabel": "Name",
|
||||
"glossaries.dialog.namePlaceholder": "Mein Glossar",
|
||||
"glossaries.dialog.tabTemplates": "Vorlagen",
|
||||
"glossaries.dialog.tabFile": "Datei",
|
||||
"glossaries.dialog.tabManual": "Manuell",
|
||||
"glossaries.dialog.cancel": "Abbrechen",
|
||||
"glossaries.dialog.creating": "Wird erstellt…",
|
||||
"glossaries.dialog.importing": "Wird importiert…",
|
||||
"glossaries.dialog.importBtn": "Importieren",
|
||||
"glossaries.dialog.selectPrompt": "Auswählen",
|
||||
"glossaries.dialog.createBtn": "Erstellen",
|
||||
"glossaries.dialog.createEmpty": "Leer erstellen",
|
||||
"glossaries.dialog.terms": "Begriffe",
|
||||
"glossaries.dialog.templatesDesc": "Wählen Sie eine vordefinierte Vorlage",
|
||||
"glossaries.dialog.templatesEmpty": "Keine Vorlagen verfügbar",
|
||||
"glossaries.dialog.dropTitle": "CSV-Datei hierher ziehen",
|
||||
"glossaries.dialog.dropOr": "oder",
|
||||
"glossaries.dialog.dropFormats": "CSV, TSV, TXT",
|
||||
"glossaries.termEditor.addTerm": "Begriff hinzufügen",
|
||||
"glossaries.termEditor.maxReached": "Maximal {max} Begriffe pro Glossar erreicht.",
|
||||
"glossaries.dialog.formatTitle": "Format",
|
||||
"glossaries.dialog.formatDesc": "Quelle,Ziel (eine pro Zeile)",
|
||||
"glossaries.dialog.formatNote": "Erste Zeile wird bei erkanntem Header übersprungen",
|
||||
"glossaries.dialog.errorFormat": "Nicht unterstütztes Format",
|
||||
"glossaries.dialog.errorSize": "Datei zu groß",
|
||||
"glossaries.dialog.errorEmpty": "Leere Datei",
|
||||
"glossaries.dialog.errorRead": "Lesefehler",
|
||||
"glossaries.dialog.parsing": "Wird analysiert…",
|
||||
"glossaries.dialog.termsImported": "Begriffe importiert",
|
||||
"glossaries.dialog.changeFile": "Datei ändern",
|
||||
"glossaries.dialog.retry": "Erneut versuchen",
|
||||
"glossaries.edit.title": "Modifier le glossaire",
|
||||
"glossaries.edit.description": "Modifiez le nom, la paire de langues et les termes du glossaire.",
|
||||
"glossaries.edit.nameLabel": "Nom du glossaire",
|
||||
"glossaries.edit.namePlaceholder": "Entrez le nom du glossaire...",
|
||||
"glossaries.edit.sourceLang": "Langue source",
|
||||
"glossaries.edit.targetLang": "Langue cible",
|
||||
"glossaries.edit.termsLabel": "Termes ({count} valides)",
|
||||
"glossaries.edit.exportCsv": "Exporter CSV",
|
||||
"glossaries.edit.importCsv": "Importer CSV",
|
||||
"glossaries.edit.cancel": "Annuler",
|
||||
"glossaries.edit.saving": "Enregistrement...",
|
||||
"glossaries.edit.saveChanges": "Enregistrer les modifications",
|
||||
"glossaries.edit.importFailedTitle": "Échec de l'importation",
|
||||
"glossaries.edit.importFailedMaxDesc": "Le CSV contient {count} termes, le maximum est de {max}. Veuillez réduire le nombre de termes.",
|
||||
"glossaries.edit.importSuccessTitle": "Importation réussie",
|
||||
"glossaries.edit.importSuccessDesc": "{count} termes importés avec succès.",
|
||||
"glossaries.edit.importFailedEmptyDesc": "Aucun terme valide trouvé dans le fichier CSV.",
|
||||
"glossaries.edit.importFailedReadDesc": "Impossible de lire le fichier CSV.",
|
||||
"glossaries.delete.title": "Supprimer le glossaire",
|
||||
"glossaries.delete.description": "Êtes-vous sûr de vouloir supprimer ce glossaire ?",
|
||||
"glossaries.delete.warning": "Cette action est irréversible",
|
||||
"glossaries.delete.warningDesc": "Toutes les paires de termes seront définitivement supprimées.",
|
||||
"glossaries.delete.cancel": "Annuler",
|
||||
"glossaries.delete.deleting": "Suppression...",
|
||||
"glossaries.delete.deleteBtn": "Supprimer",
|
||||
"glossaries.upgrade.title": "Glossaires",
|
||||
"glossaries.upgrade.description": "Personnalisez vos traductions avec une terminologie personnalisée",
|
||||
"glossaries.upgrade.feature1": "Créez plusieurs glossaires",
|
||||
"glossaries.upgrade.feature2": "Définissez des paires de termes source→cible",
|
||||
"glossaries.upgrade.feature3": "Importez/exportez via CSV",
|
||||
"glossaries.upgrade.feature4": "Appliquez aux traductions LLM",
|
||||
"glossaries.upgrade.proFeatureBefore": "Les glossaires sont une fonctionnalité ",
|
||||
"glossaries.upgrade.proFeatureAfter": ". Passez à un forfait supérieur pour débloquer la terminologie personnalisée.",
|
||||
"glossaries.upgrade.proLabel": "Pro",
|
||||
"glossaries.upgrade.upgradeBtn": "Passer à Pro",
|
||||
"glossaries.loading": "Chargement...",
|
||||
"glossaries.howItWorks.title": "Comment ces paramètres sont utilisés",
|
||||
"glossaries.howItWorks.step1Title": "Configurez ici",
|
||||
"glossaries.howItWorks.step1Desc": "Rédigez vos instructions de contexte ou créez/importez un glossaire de termes.",
|
||||
"glossaries.howItWorks.step2Title": "Activez dans Traduire",
|
||||
"glossaries.howItWorks.step2Desc": "Sur la page de traduction, dans la colonne de droite, sélectionnez votre glossaire.",
|
||||
"glossaries.howItWorks.warning": "Les instructions de contexte s'appliquent automatiquement à toutes vos traductions IA une fois enregistrées. Les glossaires doivent être sélectionnés manuellement sur la page Traduire.",
|
||||
"glossaries.howItWorks.goToTranslate": "Aller à Traduire",
|
||||
"glossaries.status.unsaved": "Non enregistré",
|
||||
"glossaries.status.active": "Actif · s'applique à toutes les traductions IA",
|
||||
"glossaries.status.inactive": "Inactif",
|
||||
"glossaries.instructions.whatForBold": "À quoi ça sert ?",
|
||||
"glossaries.instructions.whatForDesc": "Ces instructions sont envoyées automatiquement à l'IA avant chaque traduction, sans que vous ayez besoin de faire quoi que ce soit sur la page Traduire. Utilisez-les pour guider le style, le registre ou la terminologie générale.",
|
||||
"glossaries.instructions.example": "Exemple : « Vous traduisez des rapports financiers. Soyez formel, précis et conservez tous les chiffres. »",
|
||||
"glossaries.instructions.charCount": "{count} caractères",
|
||||
"glossaries.instructions.emptyHint": "Vide — aucune instruction envoyée à l'IA",
|
||||
"glossaries.instructions.clearAll": "Tout effacer",
|
||||
"glossaries.instructions.saving": "Enregistrement…",
|
||||
"glossaries.instructions.saved": "Enregistré",
|
||||
"glossaries.presets.whatForBold": "À quoi ça sert ?",
|
||||
"glossaries.presets.whatForDesc": "Cliquer sur une carte crée un glossaire pré-rempli avec les termes spécialisés du domaine. Ce glossaire apparaîtra dans vos glossaires ci-dessous, et vous pourrez le sélectionner manuellement sur la page Traduire pour forcer des traductions de termes précis.",
|
||||
"glossaries.presets.clickHint": "Cliquez sur une carte → glossaire créé → sélectionnez-le dans Traduire",
|
||||
"glossaries.presets.creating": "Création…",
|
||||
"glossaries.presets.alreadyImported": "Déjà importé",
|
||||
"glossaries.presets.it.title": "IT / Logiciel",
|
||||
"glossaries.presets.it.desc": "Développement, infrastructure, DevOps",
|
||||
"glossaries.presets.legal.title": "Juridique / Contrats",
|
||||
"glossaries.presets.legal.desc": "Droit des affaires, contentieux",
|
||||
"glossaries.presets.medical.title": "Médical / Santé",
|
||||
"glossaries.presets.medical.desc": "Pharmacologie, chirurgie, diagnostic",
|
||||
"glossaries.presets.finance.title": "Finance / Comptabilité",
|
||||
"glossaries.presets.finance.desc": "IFRS, bilans, fiscalité",
|
||||
"glossaries.presets.marketing.title": "Marketing / Publicité",
|
||||
"glossaries.presets.marketing.desc": "Digital, branding, analytics",
|
||||
"glossaries.presets.hr.title": "RH / Ressources Humaines",
|
||||
"glossaries.presets.hr.desc": "Contrats, politiques, recrutement",
|
||||
"glossaries.presets.scientific.title": "Scientifique / Recherche",
|
||||
"glossaries.presets.scientific.desc": "Publications, thèses, articles",
|
||||
"glossaries.presets.ecommerce.title": "E-commerce / Vente",
|
||||
"glossaries.presets.ecommerce.desc": "Boutiques en ligne, catalogues, CRM",
|
||||
"glossaries.grid.title": "Vos",
|
||||
"glossaries.grid.titleHighlight": "glossaires",
|
||||
"glossaries.grid.countWithAction": "{count} glossaire({plural}) — cliquez sur une carte pour la modifier",
|
||||
"glossaries.grid.emptyAction": "Créez votre premier glossaire ou importez un preset ci-dessus",
|
||||
"glossaries.grid.activeTranslation": "Traduction active :",
|
||||
"glossaries.grid.goToTranslate": "Aller à Traduire pour activer",
|
||||
"glossaries.badge.compatible": "Compatible",
|
||||
"glossaries.badge.otherTarget": "Autre cible",
|
||||
"glossaries.card.editTerms": "Modifier les termes",
|
||||
"glossaries.card.created": "Erstellt",
|
||||
"glossaries.card.term": "Begriff",
|
||||
"glossaries.card.delete": "Supprimer",
|
||||
"glossaries.grid.searchPlaceholder": "Search a glossary…",
|
||||
"glossaries.grid.noResults": "No results for this search.",
|
||||
"glossaries.detail.backToList": "Back to glossaries",
|
||||
"glossaries.detail.save": "Save",
|
||||
"glossaries.detail.savedTitle": "Saved",
|
||||
"glossaries.detail.savedDesc": "The glossary has been updated.",
|
||||
"glossaries.detail.settingsTitle": "Settings",
|
||||
"glossaries.detail.sourceLang": "Source language",
|
||||
"glossaries.detail.targetLang": "Target language",
|
||||
"glossaries.detail.termsTitle": "Terms",
|
||||
"glossaries.detail.terms": "terms",
|
||||
"glossaries.detail.searchTerms": "Filter…",
|
||||
"glossaries.detail.noTerms": "No terms yet.",
|
||||
"glossaries.detail.addFirstTerm": "Add the first term",
|
||||
"glossaries.detail.addTerm": "Add a term",
|
||||
"glossaries.detail.maxReached": "Maximum limit reached",
|
||||
"glossaries.detail.source": "Source",
|
||||
"glossaries.detail.target": "Target",
|
||||
"glossaries.detail.sourcePlaceholder": "source term",
|
||||
"glossaries.detail.targetPlaceholder": "target term",
|
||||
"glossaries.detail.csvTitle": "CSV",
|
||||
"glossaries.detail.csvDesc": "Export your terms as CSV or import new ones (replaces the current list).",
|
||||
"glossaries.detail.export": "Export",
|
||||
"glossaries.detail.import": "Import",
|
||||
"glossaries.detail.dangerTitle": "Danger zone",
|
||||
"glossaries.detail.dangerDesc": "Deletion is permanent. All associated terms will be lost.",
|
||||
"glossaries.detail.deleteGlossary": "Delete this glossary",
|
||||
"glossaries.detail.confirmDelete": "Confirm deletion?",
|
||||
"glossaries.detail.confirm": "Confirm",
|
||||
"glossaries.detail.cancel": "Cancel",
|
||||
"glossaries.detail.sourceLangNote": "'The original source is in French. For other languages, we read the term's translations field (if available).'",
|
||||
"glossaries.detail.sourceLocked": "fixed",
|
||||
"glossaries.detail.sourceLockedNote": "Templates only store the source in French. Multilingual source is on the roadmap.",
|
||||
"glossaries.detail.targetLangNote": "Pick a language to see the matching translations, or « Multilingual » for the default value.",
|
||||
"glossaries.detail.notFoundTitle": "Glossary not found",
|
||||
"glossaries.detail.notFoundDesc": "This glossary does not exist or you don't have access to it.",
|
||||
"glossaries.detail.maxTermsTitle": "Limit reached",
|
||||
"glossaries.detail.maxTermsDesc": "Maximum {max} terms per glossary.",
|
||||
"glossaries.detail.importEmptyTitle": "Empty file",
|
||||
"glossaries.detail.importEmptyDesc": "No terms detected in this file.",
|
||||
"glossaries.detail.importedTitle": "Imported",
|
||||
"glossaries.detail.importedDesc": "{count} terms imported.",
|
||||
"glossaries.detail.importErrorTitle": "Read error",
|
||||
"glossaries.detail.importErrorDesc": "Unable to read the file."
|
||||
}
|
||||
60
frontend/src/lib/i18n/messages/de/index.ts
Normal file
60
frontend/src/lib/i18n/messages/de/index.ts
Normal file
@@ -0,0 +1,60 @@
|
||||
// Auto-generated by scripts/generate_i18n_index.py
|
||||
// Merges all namespace JSON files for locale "de".
|
||||
|
||||
import admin from "./admin.json";
|
||||
import apiKeys from "./apiKeys.json";
|
||||
import auth from "./auth.json";
|
||||
import checkout from "./checkout.json";
|
||||
import common from "./common.json";
|
||||
import context from "./context.json";
|
||||
import cookieConsent from "./cookieConsent.json";
|
||||
import dashboard from "./dashboard.json";
|
||||
import fileUploader from "./fileUploader.json";
|
||||
import forgotPassword from "./forgotPassword.json";
|
||||
import glossaries from "./glossaries.json";
|
||||
import landing from "./landing.json";
|
||||
import langSelector from "./langSelector.json";
|
||||
import layout from "./layout.json";
|
||||
import login from "./login.json";
|
||||
import memento from "./memento.json";
|
||||
import pricing from "./pricing.json";
|
||||
import profile from "./profile.json";
|
||||
import providerSelector from "./providerSelector.json";
|
||||
import providerTheme from "./providerTheme.json";
|
||||
import register from "./register.json";
|
||||
import resetPassword from "./resetPassword.json";
|
||||
import services from "./services.json";
|
||||
import settings from "./settings.json";
|
||||
import translate from "./translate.json";
|
||||
import translateComplete from "./translateComplete.json";
|
||||
|
||||
const messages: Record<string, string> = {
|
||||
...admin,
|
||||
...apiKeys,
|
||||
...auth,
|
||||
...checkout,
|
||||
...common,
|
||||
...context,
|
||||
...cookieConsent,
|
||||
...dashboard,
|
||||
...fileUploader,
|
||||
...forgotPassword,
|
||||
...glossaries,
|
||||
...landing,
|
||||
...langSelector,
|
||||
...layout,
|
||||
...login,
|
||||
...memento,
|
||||
...pricing,
|
||||
...profile,
|
||||
...providerSelector,
|
||||
...providerTheme,
|
||||
...register,
|
||||
...resetPassword,
|
||||
...services,
|
||||
...settings,
|
||||
...translate,
|
||||
...translateComplete,
|
||||
};
|
||||
|
||||
export default messages;
|
||||
146
frontend/src/lib/i18n/messages/de/landing.json
Normal file
146
frontend/src/lib/i18n/messages/de/landing.json
Normal file
@@ -0,0 +1,146 @@
|
||||
{
|
||||
"landing.nav.why": "Warum wir?",
|
||||
"landing.nav.formats": "Formate",
|
||||
"landing.nav.pricing": "Preise",
|
||||
"landing.nav.login": "Anmelden",
|
||||
"landing.nav.startFree": "Kostenlos starten",
|
||||
"landing.hero.tag": "Professionelle Dokument-KI",
|
||||
"landing.hero.titleLine1": "Übersetzen Sie Ihre Dokumente.",
|
||||
"landing.hero.titleLine2": "Mit perfekter Formatierung.",
|
||||
"landing.hero.description": "Der einzige Übersetzer, der SmartArt, Diagramme, Inhaltsverzeichnisse, Formen und komplexe Layouts bewahrt — genau wie im Original.",
|
||||
"landing.hero.ctaMain": "Kostenlos starten — 2 Docs/Monat",
|
||||
"landing.hero.ctaSec": "Angebote sehen",
|
||||
"landing.hero.deleted": "Dateien nach 60 Min. gelöscht",
|
||||
"landing.hero.noHidden": "Keine versteckten Gebühren",
|
||||
"landing.hero.preview": "Vorschau vor Bezahlung",
|
||||
"landing.hero.formattedOk": "Formatierung OK",
|
||||
"landing.hero.aiActive": "KI-Übersetzung aktiv",
|
||||
"landing.steps.title": "Wie funktioniert es?",
|
||||
"landing.steps.subtitle": "Drei Schritte. Kein Formatverlust.",
|
||||
"landing.steps.step1.num": "01",
|
||||
"landing.steps.step1.title": "Datei hochladen",
|
||||
"landing.steps.step1.desc": "Drag & Drop Ihres Excel-, Word-, PowerPoint- oder PDF-Dokuments.",
|
||||
"landing.steps.step2.num": "02",
|
||||
"landing.steps.step2.title": "Sprache & Engine wählen",
|
||||
"landing.steps.step2.desc": "Zielsprache und Engine auswählen — klassisch oder kontextbewusste KI.",
|
||||
"landing.steps.step3.num": "03",
|
||||
"landing.steps.step3.title": "Ergebnis herunterladen",
|
||||
"landing.steps.step3.desc": "Erhalten Sie Ihr übersetztes Dokument mit identischer Formatierung wie das Original.",
|
||||
"landing.features.tag": "KI-Übersetzungsengine",
|
||||
"landing.features.title": "Übersetzung, die Ihr Handwerk versteht",
|
||||
"landing.features.description": "Unsere KI-Modelle analysieren den Kontext, respektieren Ihre Terminologie und übersetzen sogar Text in Bildern.",
|
||||
"landing.features.context.title": "Branchenkontext",
|
||||
"landing.features.context.desc": "Beschreiben Sie Ihr Fachgebiet und erhalten Sie maßgeschneiderte Übersetzungen — nicht generische.",
|
||||
"landing.features.glossary.title": "Fachglossare",
|
||||
"landing.features.glossary.desc": "Definieren Sie Ihre Fachbegriffe. CTA bleibt «Luftbehandlungsanlage», nie «Call To Action».",
|
||||
"landing.features.vision.title": "Bilderkennung",
|
||||
"landing.features.vision.desc": "Text in Bildern, Diagrammen und Grafiken wird erkannt und übersetzt.",
|
||||
"landing.features.demo.source": "Quelle (FR)",
|
||||
"landing.features.demo.google": "Google Translate",
|
||||
"landing.features.demo.ours": "Unsere KI",
|
||||
"landing.layout.title": "Ihre Formatierung,",
|
||||
"landing.layout.title2": "perfekt erhalten",
|
||||
"landing.layout.subtitle": "Andere Übersetzer zerstören Ihr Layout. Wir nicht.",
|
||||
"landing.layout.p1.title": "SmartArt & Diagramme",
|
||||
"landing.layout.p1.desc": "Organigramme, Flussdiagramme, Hierarchien — alles identisch übersetzt.",
|
||||
"landing.layout.p2.title": "Inhaltsverzeichnisse",
|
||||
"landing.layout.p2.desc": "Inhaltsverzeichniseinträge, Seitenzahlen und Querverweise korrekt aktualisiert.",
|
||||
"landing.layout.p3.title": "Diagramme & Grafiken",
|
||||
"landing.layout.p3.desc": "Titel, Achsenbeschriftungen, Legenden und Reihennamen — alles übersetzt.",
|
||||
"landing.layout.p4.title": "Formen & Textfelder",
|
||||
"landing.layout.p4.desc": "Rechtecke, abgerundete Blöcke, Legenden — überall lokalisiert.",
|
||||
"landing.layout.p5.title": "Kopf- & Fußzeilen",
|
||||
"landing.layout.p5.desc": "Kopfzeilen, Fußzeilen und Fußnoten werden nie übersehen.",
|
||||
"landing.layout.p6.title": "130+ Sprachen",
|
||||
"landing.layout.p6.desc": "Google Translate, DeepL und professionelle KI-Engines.",
|
||||
"landing.formats.title": "Jedes Format,",
|
||||
"landing.formats.title2": "jedes Element",
|
||||
"landing.formats.subtitle": "Wir übersetzen, was andere vergessen. Ihr Unternehmen verdient einwandfreie Dokumentation.",
|
||||
"landing.formats.word.name": "Word",
|
||||
"landing.formats.word.i1": "Absätze und Überschriften",
|
||||
"landing.formats.word.i2": "Tabellen und Diagramme",
|
||||
"landing.formats.word.i3": "SmartArt-Diagramme",
|
||||
"landing.formats.word.i4": "Inhaltsverzeichnis",
|
||||
"landing.formats.word.i5": "Kopf- und Fußzeilen",
|
||||
"landing.formats.word.i6": "Formen und Textfelder",
|
||||
"landing.formats.word.i7": "Fuß- und Endnoten",
|
||||
"landing.formats.excel.name": "Excel",
|
||||
"landing.formats.excel.i1": "Zellwerte",
|
||||
"landing.formats.excel.i2": "Blattnamen",
|
||||
"landing.formats.excel.i3": "Diagramme und Beschriftungen",
|
||||
"landing.formats.excel.i4": "Kopf- und Fußzeilen",
|
||||
"landing.formats.excel.i5": "Verbundene Zellen erhalten",
|
||||
"landing.formats.pptx.name": "PowerPoint",
|
||||
"landing.formats.pptx.i1": "Folientext und Notizen",
|
||||
"landing.formats.pptx.i2": "Diagramme und Grafiken",
|
||||
"landing.formats.pptx.i3": "Formen und Textfelder",
|
||||
"landing.formats.pptx.i4": "Folienmaster",
|
||||
"landing.formats.pptx.i5": "Animationen erhalten",
|
||||
"landing.formats.pdf.name": "PDF",
|
||||
"landing.formats.pdf.i1": "Textbasierte PDFs",
|
||||
"landing.formats.pdf.i2": "Layout erhalten",
|
||||
"landing.formats.pdf.i3": "Bilder an Ort und Stelle",
|
||||
"landing.formats.pdf.i4": "Tabellen beibehalten",
|
||||
"landing.formats.pdf.i5": "Ausgabe als DOCX oder PDF",
|
||||
"landing.pricing.title": "Einfache, ehrliche Preise",
|
||||
"landing.pricing.subtitle": "Was Sie sehen, ist was Sie zahlen. Keine versteckten Gebühren.",
|
||||
"landing.pricing.monthly": "Monatlich",
|
||||
"landing.pricing.annual": "Jährlich",
|
||||
"landing.pricing.bestValue": "Am beliebtesten",
|
||||
"landing.pricing.month": "/Monat",
|
||||
"landing.pricing.footer": "Der angezeigte Preis ist der Preis, den Sie zahlen. Keine versteckten Gebühren nach der Übersetzung.",
|
||||
"landing.pricing.starter.name": "Starter",
|
||||
"landing.pricing.starter.desc": "Für Einzelpersonen und kleine Projekte",
|
||||
"landing.pricing.starter.f1": "50 Dokumente / Monat",
|
||||
"landing.pricing.starter.f2": "Bis zu 50 Seiten pro Dokument",
|
||||
"landing.pricing.starter.f3": "Google Translate + DeepL",
|
||||
"landing.pricing.starter.f4": "Dateien bis zu 10 MB",
|
||||
"landing.pricing.starter.cta": "Loslegen",
|
||||
"landing.pricing.pro.name": "Pro",
|
||||
"landing.pricing.pro.desc": "Für anspruchsvolle Profis",
|
||||
"landing.pricing.pro.f1": "200 Dokumente / Monat",
|
||||
"landing.pricing.pro.f2": "Bis zu 200 Seiten pro Dokument",
|
||||
"landing.pricing.pro.f3": "KI-gestützte Übersetzung",
|
||||
"landing.pricing.pro.f4": "Google + DeepL inklusive",
|
||||
"landing.pricing.pro.f5": "Individuelle Glossare & Prompts",
|
||||
"landing.pricing.pro.f6": "Prioritäts-Support",
|
||||
"landing.pricing.pro.cta": "Pro testen",
|
||||
"landing.pricing.business.name": "Business",
|
||||
"landing.pricing.business.desc": "Für Teams mit hohem Bedarf",
|
||||
"landing.pricing.business.f1": "1 000 Dokumente / Monat",
|
||||
"landing.pricing.business.f2": "Bis zu 500 Seiten pro Dokument",
|
||||
"landing.pricing.business.f3": "Premium-KI (Claude)",
|
||||
"landing.pricing.business.f4": "Alle Anbieter + API-Zugang",
|
||||
"landing.pricing.business.f5": "Webhooks & Automatisierung",
|
||||
"landing.pricing.business.f6": "5 Teamplätze",
|
||||
"landing.pricing.business.cta": "Kontaktieren Sie uns",
|
||||
"landing.cta.title": "In 30 Sekunden mit der Übersetzung beginnen",
|
||||
"landing.cta.subtitle": "Keine Kreditkarte erforderlich. Probieren Sie es jetzt kostenlos und erwecken Sie Ihre mehrsprachigen Dokumente zum Leben.",
|
||||
"landing.cta.button": "Kostenloses Konto erstellen",
|
||||
"landing.cta.secure": "Geschützt durch AES-256-Verschlüsselung",
|
||||
"landing.footer.desc": "Experte für intelligente Dokumentenübersetzung. Wir verbinden die Kunst des Layouts mit der Wissenschaft kontextbezogener KI.",
|
||||
"landing.footer.product": "Produkt",
|
||||
"landing.footer.resources": "Ressourcen",
|
||||
"landing.footer.legal": "Rechtliches",
|
||||
"landing.footer.rights": "© 2026 Wordly.art — Alle Rechte vorbehalten.",
|
||||
"landing.hero.contextEngine": "Übersetzung erkannt: Technischer Wartungsbegriff für HVAC-Systeme...",
|
||||
"landing.hero.liveAnalysis": "Live-Analyse",
|
||||
"landing.hero.termsDetected": "Begriffe erkannt",
|
||||
"landing.steps.process": "PROZESS",
|
||||
"landing.translate.newProject": "Neues Projekt",
|
||||
"landing.translate.title": "Dokument übersetzen",
|
||||
"landing.translate.subtitle": "Datei importieren und Zielsprache wählen",
|
||||
"landing.translate.sourceDocument": "Quelldokument",
|
||||
"landing.translate.configuration": "Konfiguration",
|
||||
"landing.translate.sourceLang": "Quellsprache",
|
||||
"landing.translate.targetLang": "Zielsprache",
|
||||
"landing.translate.provider": "Anbieter",
|
||||
"landing.translate.startTranslation": "Übersetzung starten",
|
||||
"landing.translate.zeroRetention": "Keine Speicherung",
|
||||
"landing.translate.filesDeleted": "Dateien nach Verarbeitung gelöscht",
|
||||
"landing.translate.dropHere": "Hier ablegen",
|
||||
"landing.translate.supportedFormats": "DOCX, XLSX, PPTX oder PDF Dateien unterstützt",
|
||||
"landing.translate.aiAnalysis": "KI-Analyse aktiv",
|
||||
"landing.translate.processing": "Verarbeitung läuft",
|
||||
"landing.translate.preservingLayout": "Ihr Layout wird beibehalten"
|
||||
}
|
||||
7
frontend/src/lib/i18n/messages/de/langSelector.json
Normal file
7
frontend/src/lib/i18n/messages/de/langSelector.json
Normal file
@@ -0,0 +1,7 @@
|
||||
{
|
||||
"langSelector.search": "Suchen…",
|
||||
"langSelector.noResults": "Keine Ergebnisse",
|
||||
"langSelector.source": "Quelle",
|
||||
"langSelector.target": "Ziel",
|
||||
"langSelector.swap": "Tauschen"
|
||||
}
|
||||
5
frontend/src/lib/i18n/messages/de/layout.json
Normal file
5
frontend/src/lib/i18n/messages/de/layout.json
Normal file
@@ -0,0 +1,5 @@
|
||||
{
|
||||
"layout.nav.apiAccess": "API-Zugang",
|
||||
"layout.footer.terms": "AGB",
|
||||
"layout.footer.privacy": "Datenschutz"
|
||||
}
|
||||
18
frontend/src/lib/i18n/messages/de/login.json
Normal file
18
frontend/src/lib/i18n/messages/de/login.json
Normal file
@@ -0,0 +1,18 @@
|
||||
{
|
||||
"login.errorTitle": "Login Error",
|
||||
"login.welcomeBack": "Welcome back",
|
||||
"login.signInToContinue": "Sign in to continue translating",
|
||||
"login.email": "Email",
|
||||
"login.emailPlaceholder": "you@example.com",
|
||||
"login.password": "Password",
|
||||
"login.forgotPassword": "Forgot password?",
|
||||
"login.passwordPlaceholder": "••••••••",
|
||||
"login.signingIn": "Signing in...",
|
||||
"login.signIn": "Sign In",
|
||||
"login.noAccount": "Don't have an account?",
|
||||
"login.signUpFree": "Sign up for free",
|
||||
"login.orContinueWith": "oder mit E-Mail fortfahren",
|
||||
"login.google.connecting": "Verbinden…",
|
||||
"login.google.errorGeneric": "Bei der Google-Anmeldung ist ein Fehler aufgetreten.",
|
||||
"login.google.errorFailed": "Google-Anmeldung fehlgeschlagen. Bitte erneut versuchen."
|
||||
}
|
||||
6
frontend/src/lib/i18n/messages/de/memento.json
Normal file
6
frontend/src/lib/i18n/messages/de/memento.json
Normal file
@@ -0,0 +1,6 @@
|
||||
{
|
||||
"memento.title": "Entdecken Sie Momento",
|
||||
"memento.slogan": "Momento ist mehr als nur eine Notizen-App. Es ist ein intelligentes Ökosystem, das Ihre Ideen in Echtzeit verbindet, analysiert und weiterentwickelt – mit 6 KI-Agenten und semantischer Suche.",
|
||||
"memento.ctaFree": "Kostenlos starten",
|
||||
"memento.ctaMore": "Mehr erfahren"
|
||||
}
|
||||
151
frontend/src/lib/i18n/messages/de/pricing.json
Normal file
151
frontend/src/lib/i18n/messages/de/pricing.json
Normal file
@@ -0,0 +1,151 @@
|
||||
{
|
||||
"pricing.nav.back": "Zurück",
|
||||
"pricing.nav.home": "Startseite",
|
||||
"pricing.nav.mySubscription": "Mein Abonnement",
|
||||
"pricing.header.badge": "KI-Modelle aktualisiert — März 2026",
|
||||
"pricing.header.title": "Der passende Plan für jedes Bedürfnis",
|
||||
"pricing.header.subtitle": "Übersetzen Sie Ihre Word-, Excel- und PowerPoint-Dokumente unter Beibehaltung des Original-Layouts. Ohne API-Schlüssel.",
|
||||
"pricing.billing.monthly": "Monatlich",
|
||||
"pricing.billing.yearly": "Jährlich",
|
||||
"pricing.plans.free.name": "Kostenlos",
|
||||
"pricing.plans.starter.name": "Starter",
|
||||
"pricing.plans.pro.name": "Pro",
|
||||
"pricing.plans.business.name": "Business",
|
||||
"pricing.plans.enterprise.name": "Enterprise",
|
||||
"pricing.plans.free.description": "Perfekt zum Kennenlernen der App",
|
||||
"pricing.plans.starter.description": "Für Einzelpersonen und kleine Projekte",
|
||||
"pricing.plans.pro.description": "Für Professionals und wachsende Teams",
|
||||
"pricing.plans.business.description": "Für Teams und Organisationen",
|
||||
"pricing.plans.enterprise.description": "Maßgeschneiderte Lösungen für große Organisationen",
|
||||
"pricing.plans.pro.highlight": "Am beliebtesten",
|
||||
"pricing.plans.pro.badge": "BELIEBT",
|
||||
"pricing.plans.enterprise.badge": "AUF ANFRAGE",
|
||||
"pricing.plans.free.feat1": "5 Dokumente / Monat",
|
||||
"pricing.plans.free.feat2": "Bis zu 15 Seiten pro Dokument",
|
||||
"pricing.plans.free.feat3": "Google Übersetzer inklusive",
|
||||
"pricing.plans.free.feat4": "Alle Sprachen (130+)",
|
||||
"pricing.plans.free.feat5": "Community-Support",
|
||||
"pricing.plans.starter.feat1": "50 Dokumente / Monat",
|
||||
"pricing.plans.starter.feat2": "Bis zu 50 Seiten pro Dokument",
|
||||
"pricing.plans.starter.feat3": "Google Übersetzer + DeepL",
|
||||
"pricing.plans.starter.feat4": "Dateien bis zu 10 MB",
|
||||
"pricing.plans.starter.feat5": "E-Mail-Support",
|
||||
"pricing.plans.starter.feat6": "30 Tage Verlauf",
|
||||
"pricing.plans.pro.feat1": "200 Dokumente / Monat",
|
||||
"pricing.plans.pro.feat2": "Bis zu 200 Seiten pro Dokument",
|
||||
"pricing.plans.pro.feat3": "KI-Basisübersetzung",
|
||||
"pricing.plans.pro.feat4": "Google Übersetzer + DeepL",
|
||||
"pricing.plans.pro.feat5": "Dateien bis zu 25 MB",
|
||||
"pricing.plans.pro.feat6": "Benutzerdefinierte Glossare",
|
||||
"pricing.plans.pro.feat7": "Prioritäts-Support",
|
||||
"pricing.plans.pro.feat8": "90 Tage Verlauf",
|
||||
"pricing.plans.business.feat1": "1.000 Dokumente / Monat",
|
||||
"pricing.plans.business.feat2": "Bis zu 500 Seiten pro Dokument",
|
||||
"pricing.plans.business.feat3": "Basis- + Premium-KI (Claude Haiku)",
|
||||
"pricing.plans.business.feat4": "Alle Übersetzungsanbieter",
|
||||
"pricing.plans.business.feat5": "Dateien bis zu 50 MB",
|
||||
"pricing.plans.business.feat6": "API-Zugang (10.000 Aufrufe/Monat)",
|
||||
"pricing.plans.business.feat7": "Benachrichtigungs-Webhooks",
|
||||
"pricing.plans.business.feat8": "Dedizierter Support",
|
||||
"pricing.plans.business.feat9": "1 Jahr Verlauf",
|
||||
"pricing.plans.business.feat10": "Erweiterte Analysen",
|
||||
"pricing.plans.enterprise.feat1": "Unbegrenzte Dokumente",
|
||||
"pricing.plans.enterprise.feat2": "Alle KI-Modelle (GPT-5, Claude Opus 4.6…)",
|
||||
"pricing.plans.enterprise.feat3": "On-Premise oder dedizierte Cloud",
|
||||
"pricing.plans.enterprise.feat4": "99,9 % SLA garantiert",
|
||||
"pricing.plans.enterprise.feat5": "24/7 dedizierter Support",
|
||||
"pricing.plans.enterprise.feat6": "White-Label",
|
||||
"pricing.plans.enterprise.feat7": "Unbegrenzte Teams",
|
||||
"pricing.plans.enterprise.feat8": "Maßgeschneiderte Integrationen",
|
||||
"pricing.card.onRequest": "Auf Anfrage",
|
||||
"pricing.card.free": "Kostenlos",
|
||||
"pricing.card.perMonth": "/Monat",
|
||||
"pricing.card.billedYearly": "{price} € / Jahr abgerechnet",
|
||||
"pricing.card.documents": "Dokumente",
|
||||
"pricing.card.pagesMax": "Max. Seiten",
|
||||
"pricing.card.aiTranslation": "KI-Übersetzung",
|
||||
"pricing.card.unlimited": "Unbegrenzt",
|
||||
"pricing.card.perMonthStat": "/ Monat",
|
||||
"pricing.card.perDoc": "S. / Dok.",
|
||||
"pricing.card.aiEssential": "Basis",
|
||||
"pricing.card.aiEssentialPremium": "Basis + Premium",
|
||||
"pricing.card.aiCustom": "Maßgeschneidert",
|
||||
"pricing.card.myPlan": "Mein Plan",
|
||||
"pricing.card.managePlan": "Plan verwalten",
|
||||
"pricing.card.startFree": "Kostenlos starten",
|
||||
"pricing.card.contactUs": "Kontaktieren Sie uns",
|
||||
"pricing.card.choosePlan": "Diesen Plan wählen",
|
||||
"pricing.card.processing": "Wird verarbeitet…",
|
||||
"pricing.comparison.title": "Detaillierter Vergleich",
|
||||
"pricing.comparison.subtitle": "Alles, was in jedem Plan enthalten ist",
|
||||
"pricing.comparison.feature": "Funktion",
|
||||
"pricing.comparison.docsPerMonth": "Dokumente / Monat",
|
||||
"pricing.comparison.pagesMaxPerDoc": "Max. Seiten / Dokument",
|
||||
"pricing.comparison.maxFileSize": "Max. Dateigröße",
|
||||
"pricing.comparison.googleTranslation": "Google Übersetzer",
|
||||
"pricing.comparison.deepl": "DeepL",
|
||||
"pricing.comparison.aiEssential": "KI-Basisübersetzung",
|
||||
"pricing.comparison.aiPremium": "KI-Premiumübersetzung",
|
||||
"pricing.comparison.apiAccess": "API-Zugang",
|
||||
"pricing.comparison.priorityProcessing": "Prioritätsverarbeitung",
|
||||
"pricing.comparison.support": "Support",
|
||||
"pricing.comparison.support.community": "Community",
|
||||
"pricing.comparison.support.email": "E-Mail",
|
||||
"pricing.comparison.support.priority": "Priorität",
|
||||
"pricing.comparison.support.dedicated": "Dediziert",
|
||||
"pricing.comparison.mb": "MB",
|
||||
"pricing.credits.title": "Zusätzliche Guthaben",
|
||||
"pricing.credits.subtitle": "Mehr benötigt? Guthaben einzeln kaufen, ohne Abo.",
|
||||
"pricing.credits.perPage": "1 Guthaben = 1 übersetzte Seite.",
|
||||
"pricing.credits.bestValue": "Bestes Preis-Leistungs-Verhältnis",
|
||||
"pricing.credits.unit": "Guthaben",
|
||||
"pricing.credits.centsPerCredit": "ct / Guthaben",
|
||||
"pricing.credits.buy": "Kaufen",
|
||||
"pricing.trust.encryption.title": "Ende-zu-Ende-Verschlüsselung",
|
||||
"pricing.trust.encryption.sub": "TLS 1.3 + AES-256 im Ruhezustand",
|
||||
"pricing.trust.languages.title": "130+ Sprachen",
|
||||
"pricing.trust.languages.sub": "Einschließlich Arabisch, Persisch, Hebräisch (RTL)",
|
||||
"pricing.trust.parallel.title": "Parallele Verarbeitung",
|
||||
"pricing.trust.parallel.sub": "Ultraschnelle Multi-Thread-KI",
|
||||
"pricing.trust.availability.title": "24/7 verfügbar",
|
||||
"pricing.trust.availability.sub": "99,9 % garantierte Verfügbarkeit",
|
||||
"pricing.aiModels.title": "Unsere KI-Modelle — März 2026",
|
||||
"pricing.aiModels.essential.title": "KI-Basisübersetzung",
|
||||
"pricing.aiModels.essential.plan": "Pro-Plan",
|
||||
"pricing.aiModels.essential.descPrefix": "Basierend auf",
|
||||
"pricing.aiModels.essential.descSuffix": "— dem kosteneffizientesten KI-Modell 2026. Qualität vergleichbar mit Frontier-Modellen zu einem Bruchteil der Kosten.",
|
||||
"pricing.aiModels.essential.modelName": "unser Essentielles KI-Modell",
|
||||
"pricing.aiModels.essential.context": "163K Token Kontext",
|
||||
"pricing.aiModels.essential.value": "Hervorragendes Preis-Leistungs-Verhältnis",
|
||||
"pricing.aiModels.premium.title": "KI-Premiumübersetzung",
|
||||
"pricing.aiModels.premium.plan": "Business-Plan",
|
||||
"pricing.aiModels.premium.descPrefix": "Basierend auf",
|
||||
"pricing.aiModels.premium.descSuffix": "von Anthropic — präzise bei juristischen, medizinischen und komplexen technischen Dokumenten.",
|
||||
"pricing.aiModels.premium.context": "200K Token Kontext",
|
||||
"pricing.aiModels.premium.precision": "Höchste Genauigkeit",
|
||||
"pricing.faq.title": "Häufig gestellte Fragen",
|
||||
"pricing.faq.q1": "Kann ich jederzeit den Plan wechseln?",
|
||||
"pricing.faq.a1": "Ja. Ein Upgrade erfolgt sofort und anteilig. Ein Downgrade wird am Ende des aktuellen Zeitraums wirksam.",
|
||||
"pricing.faq.q2": "Was ist die «KI-Basisübersetzung»?",
|
||||
"pricing.faq.a2": "Unser KI-Motor versteht den Kontext Ihrer Dokumente, erhält das Layout und verarbeitet Fachbegriffe deutlich besser als klassische Übersetzungen.",
|
||||
"pricing.faq.q3": "Was ist der Unterschied zwischen Basis- und Premium-KI?",
|
||||
"pricing.faq.a3": "Die Basis-KI nutzt ein optimiertes Modell (hervorragendes Preis-Leistungs-Verhältnis). Die Premium-KI verwendet Claude 3.5 Haiku von Anthropic und ist genauer bei juristischen, medizinischen und komplexen technischen Dokumenten.",
|
||||
"pricing.faq.q4": "Werden meine Dokumente nach der Übersetzung gespeichert?",
|
||||
"pricing.faq.a4": "Übersetzte Dateien sind je nach Plan verfügbar (30 Tage Starter, 90 Tage Pro, 1 Jahr Business). Sie sind im Ruhezustand und bei der Übertragung verschlüsselt.",
|
||||
"pricing.faq.q5": "Was passiert, wenn ich mein monatliches Kontingent überschreite?",
|
||||
"pricing.faq.a5": "Sie können einzelne Guthaben kaufen oder Ihr Abo upgraden. Sie werden bei 80 % Nutzung benachrichtigt.",
|
||||
"pricing.faq.q6": "Gibt es eine kostenlose Testversion für kostenpflichtige Pläne?",
|
||||
"pricing.faq.a6": "Der Kostenlos-Plan ist dauerhaft und ohne Kreditkarte. Für Pro und Business kontaktieren Sie uns für eine 14-tägige Testphase.",
|
||||
"pricing.faq.q7": "Welche Dateiformate werden unterstützt?",
|
||||
"pricing.faq.a7": "Word (.docx), Excel (.xlsx/.xls), PowerPoint (.pptx) und bald PDF. Alle Pläne unterstützen dieselben Formate.",
|
||||
"pricing.cta.title": "Bereit loszulegen?",
|
||||
"pricing.cta.subtitle": "Starten Sie kostenlos, ohne Kreditkarte. Upgraden Sie, wenn Sie möchten.",
|
||||
"pricing.cta.createAccount": "Kostenloses Konto erstellen",
|
||||
"pricing.cta.login": "Anmelden",
|
||||
"pricing.toast.demo": "Demo-Modus — Stripe ist noch nicht konfiguriert. In der Produktion würden Sie zur Zahlung weitergeleitet, um den Plan {planId} zu aktivieren.",
|
||||
"pricing.toast.networkError": "Netzwerkfehler. Bitte versuchen Sie es erneut.",
|
||||
"pricing.toast.paymentError": "Fehler beim Erstellen der Zahlung.",
|
||||
"pricing.dashboard": "Dashboard",
|
||||
"pricing.okSymbol": "✓",
|
||||
"pricing.errSymbol": "✕"
|
||||
}
|
||||
58
frontend/src/lib/i18n/messages/de/profile.json
Normal file
58
frontend/src/lib/i18n/messages/de/profile.json
Normal file
@@ -0,0 +1,58 @@
|
||||
{
|
||||
"profile.header.title": "Mein Profil",
|
||||
"profile.header.subtitle": "Verwalten Sie Ihr Konto und Ihre Einstellungen.",
|
||||
"profile.tabs.account": "Konto",
|
||||
"profile.tabs.subscription": "Abonnement",
|
||||
"profile.tabs.preferences": "Einstellungen",
|
||||
"profile.account.user": "Benutzer",
|
||||
"profile.account.memberSince": "Mitglied seit",
|
||||
"profile.plan.label": "Plan",
|
||||
"profile.plan.free": "Kostenlos",
|
||||
"profile.plan.starter": "Starter",
|
||||
"profile.plan.pro": "Pro",
|
||||
"profile.plan.business": "Business",
|
||||
"profile.plan.enterprise": "Enterprise",
|
||||
"profile.plan.pricePerMonth": "{price} €/Monat",
|
||||
"profile.subscription.canceling": "Kündigung läuft",
|
||||
"profile.subscription.active": "Aktiv",
|
||||
"profile.subscription.unknown": "Unbekannt",
|
||||
"profile.subscription.accessUntil": "Zugang bis",
|
||||
"profile.subscription.renewalOn": "Verlängerung am",
|
||||
"profile.subscription.upgradePlan": "Auf einen kostenpflichtigen Plan upgraden",
|
||||
"profile.subscription.changePlan": "Plan ändern",
|
||||
"profile.subscription.manageBilling": "Abrechnung verwalten",
|
||||
"profile.subscription.billingUnavailable": "Abrechnungsportal nicht verfügbar.",
|
||||
"profile.subscription.billingError": "Fehler beim Zugriff auf das Abrechnungsportal.",
|
||||
"profile.subscription.cancelSuccess": "Abonnement gekündigt. Sie behalten den Zugang bis zum Ende des Zeitraums.",
|
||||
"profile.subscription.cancelError": "Fehler bei der Kündigung.",
|
||||
"profile.subscription.networkError": "Netzwerkfehler.",
|
||||
"profile.usage.title": "Nutzung diesen Monat",
|
||||
"profile.usage.resetOn": "Zurücksetzung am",
|
||||
"profile.usage.documents": "Dokumente",
|
||||
"profile.usage.pages": "Seiten",
|
||||
"profile.usage.extraCredits": "zusätzliches Guthaben",
|
||||
"profile.usage.extraCreditsPlural": "zusätzliches Guthaben",
|
||||
"profile.usage.quotaReached": "Kontingent erreicht",
|
||||
"profile.usage.quotaReachedDesc": "Upgraden Sie auf einen höheren Plan, um fortzufahren.",
|
||||
"profile.usage.unlockMore": "Schalten Sie mit einem kostenpflichtigen Plan mehr Übersetzungen frei.",
|
||||
"profile.usage.viewPlans": "Pläne ansehen",
|
||||
"profile.usage.includedInPlan": "In Ihrem Plan enthalten",
|
||||
"profile.danger.title": "Gefahrenzone",
|
||||
"profile.danger.description": "Die Kündigung wird am Ende Ihres aktuellen Zeitraums wirksam. Sie behalten den Zugang bis zu diesem Datum.",
|
||||
"profile.danger.confirm": "Sind Sie sicher? Diese Aktion kann nicht rückgängig gemacht werden.",
|
||||
"profile.danger.confirmCancel": "Kündigung bestätigen",
|
||||
"profile.danger.cancelSubscription": "Mein Abonnement kündigen",
|
||||
"profile.danger.keep": "Nein, behalten",
|
||||
"profile.prefs.interfaceLang": "Sprache der Benutzeroberfläche",
|
||||
"profile.prefs.interfaceLangDesc": "Die Sprache wird automatisch anhand Ihres Browsers erkannt. Sie können sie manuell ändern.",
|
||||
"profile.prefs.defaultTargetLang": "Standard-Zielsprache",
|
||||
"profile.prefs.selectLanguage": "Sprache auswählen",
|
||||
"profile.prefs.defaultTargetLangDesc": "Diese Sprache wird für Ihre Übersetzungen vorausgewählt.",
|
||||
"profile.prefs.save": "Speichern",
|
||||
"profile.prefs.theme": "Design",
|
||||
"profile.prefs.themeDesc": "Wählen Sie das Erscheinungsbild der Benutzeroberfläche",
|
||||
"profile.prefs.cache": "Cache",
|
||||
"profile.prefs.cacheDesc": "Das Löschen des lokalen Caches kann einige Anzeigeprobleme beheben.",
|
||||
"profile.prefs.clearing": "Wird gelöscht...",
|
||||
"profile.prefs.clearCache": "Cache löschen"
|
||||
}
|
||||
7
frontend/src/lib/i18n/messages/de/providerSelector.json
Normal file
7
frontend/src/lib/i18n/messages/de/providerSelector.json
Normal file
@@ -0,0 +1,7 @@
|
||||
{
|
||||
"providerSelector.noClassic": "Kein Standard-Übersetzer verfügbar.",
|
||||
"providerSelector.noLlm": "Kein KI-Modell konfiguriert.",
|
||||
"providerSelector.costOne": "Kosten: 1 Guthaben pro Seite",
|
||||
"providerSelector.costFive": "Kosten: 5 Guthaben pro Seite (Premium-Faktor)",
|
||||
"providerSelector.unlockContextual": "Premium-Kontextübersetzung für Ihre gesamten Dokumente freischalten."
|
||||
}
|
||||
29
frontend/src/lib/i18n/messages/de/providerTheme.json
Normal file
29
frontend/src/lib/i18n/messages/de/providerTheme.json
Normal file
@@ -0,0 +1,29 @@
|
||||
{
|
||||
"providerTheme.deepseek.badge": "Essenziell",
|
||||
"providerTheme.deepseek.subBadge": "Technisch & Sparsam",
|
||||
"providerTheme.deepseek.desc": "Ultrapräzise und wirtschaftliche Übersetzung, ideal für technische Dokumente und Code.",
|
||||
"providerTheme.openai.badge": "Premium",
|
||||
"providerTheme.openai.subBadge": "Hohe Treue",
|
||||
"providerTheme.openai.desc": "Der globale KI-Standard. Maximale Textkonsistenz und strenge Stileinhaltung.",
|
||||
"providerTheme.minimax.badge": "Erweitert",
|
||||
"providerTheme.minimax.subBadge": "Leistung",
|
||||
"providerTheme.minimax.desc": "Unglaubliche Ausführungsgeschwindigkeit und ausgezeichnetes Verständnis komplexer Strukturen.",
|
||||
"providerTheme.openrouter.badge": "Express",
|
||||
"providerTheme.openrouter.subBadge": "Multi-Modell",
|
||||
"providerTheme.openrouter.desc": "Einheitlicher Zugriff auf die besten Open-Source-Modelle, optimiert für Übersetzung.",
|
||||
"providerTheme.openrouter_premium.badge": "Ultra",
|
||||
"providerTheme.openrouter_premium.subBadge": "Maximaler Kontext",
|
||||
"providerTheme.openrouter_premium.desc": "Unterstützt durch modernste Modelle (GPT-4o, Claude Sonnet 4.6) für lange Dokumente.",
|
||||
"providerTheme.zai.badge": "Spezialisiert",
|
||||
"providerTheme.zai.subBadge": "Finanzen & Recht",
|
||||
"providerTheme.zai.desc": "Modell feinabgestimmt auf anspruchsvolle Geschäftsterminologien (Recht, Finanzen).",
|
||||
"providerTheme.default.badge": "Modern",
|
||||
"providerTheme.default.subBadge": "KI-Argumentation",
|
||||
"providerTheme.default.desc": "Großsprachmodell-Übersetzung (LLM) mit fortgeschrittener semantischer Analyse.",
|
||||
"providerTheme.classic.google.label": "Google Übersetzer",
|
||||
"providerTheme.classic.google.desc": "Ultraschnelle Übersetzung für über 130 Sprachen. Empfohlen für allgemeine Abläufe.",
|
||||
"providerTheme.classic.deepl.label": "DeepL Pro",
|
||||
"providerTheme.classic.deepl.desc": "Hochpräzise Übersetzung, bekannt für Flüssigkeit und natürliche Formulierungen.",
|
||||
"providerTheme.classic.google_cloud.label": "Google Cloud API",
|
||||
"providerTheme.classic.google_cloud.desc": "Professionelle Cloud-Engine, optimiert für die Verarbeitung großer Dokumentenmengen."
|
||||
}
|
||||
29
frontend/src/lib/i18n/messages/de/register.json
Normal file
29
frontend/src/lib/i18n/messages/de/register.json
Normal file
@@ -0,0 +1,29 @@
|
||||
{
|
||||
"register.title": "Konto erstellen",
|
||||
"register.subtitle": "Kostenlos mit dem Übersetzen beginnen",
|
||||
"register.error.failed": "Registrierung fehlgeschlagen",
|
||||
"register.name.label": "Name",
|
||||
"register.name.placeholder": "Ihr Name",
|
||||
"register.name.error": "Der Name muss mindestens 2 Zeichen lang sein",
|
||||
"register.email.label": "E-Mail-Adresse",
|
||||
"register.email.placeholder": "sie@beispiel.de",
|
||||
"register.email.error": "Ungültige E-Mail-Adresse",
|
||||
"register.password.label": "Passwort",
|
||||
"register.password.error": "Das Passwort muss mindestens 8 Zeichen haben, mit Großbuchstabe, Kleinbuchstabe und Ziffer",
|
||||
"register.password.show": "Passwort anzeigen",
|
||||
"register.password.hide": "Passwort verbergen",
|
||||
"register.password.strengthLabel": "Stärke:",
|
||||
"register.password.strength.weak": "Schwach",
|
||||
"register.password.strength.medium": "Mittel",
|
||||
"register.password.strength.strong": "Stark",
|
||||
"register.confirmPassword.label": "Passwort bestätigen",
|
||||
"register.confirmPassword.error": "Passwörter stimmen nicht überein",
|
||||
"register.confirmPassword.show": "Anzeigen",
|
||||
"register.confirmPassword.hide": "Verbergen",
|
||||
"register.submit.creating": "Konto wird erstellt...",
|
||||
"register.submit.create": "Mein Konto erstellen",
|
||||
"register.hasAccount": "Bereits ein Konto?",
|
||||
"register.login": "Anmelden",
|
||||
"register.terms.prefix": "Mit der Kontoerstellung akzeptieren Sie unsere",
|
||||
"register.terms.link": "Nutzungsbedingungen"
|
||||
}
|
||||
22
frontend/src/lib/i18n/messages/de/resetPassword.json
Normal file
22
frontend/src/lib/i18n/messages/de/resetPassword.json
Normal file
@@ -0,0 +1,22 @@
|
||||
{
|
||||
"resetPassword.passwordRequirements": "Password must contain at least 8 characters, one uppercase, one lowercase, and one number",
|
||||
"resetPassword.passwordMismatch": "Passwords do not match",
|
||||
"resetPassword.tokenMissing": "Missing token. Please use the link received by email.",
|
||||
"resetPassword.error": "An error occurred",
|
||||
"resetPassword.invalidLink": "Invalid link",
|
||||
"resetPassword.invalidLinkMessage": "This reset link is invalid. Please request a new one.",
|
||||
"resetPassword.requestNewLink": "Request new link",
|
||||
"resetPassword.successTitle": "Password reset",
|
||||
"resetPassword.newPasswordTitle": "New password",
|
||||
"resetPassword.successSubtitle": "You will be redirected to login",
|
||||
"resetPassword.subtitle": "Set your new password",
|
||||
"resetPassword.successMessage": "Your password has been successfully reset. You will be redirected to the login page.",
|
||||
"resetPassword.newPassword": "New password",
|
||||
"resetPassword.showPassword": "Show password",
|
||||
"resetPassword.hidePassword": "Hide password",
|
||||
"resetPassword.confirmPassword": "Confirm password",
|
||||
"resetPassword.resetting": "Resetting...",
|
||||
"resetPassword.resetPassword": "Reset password",
|
||||
"resetPassword.backToLogin": "Back to login",
|
||||
"resetPassword.loading": "Loading..."
|
||||
}
|
||||
14
frontend/src/lib/i18n/messages/de/services.json
Normal file
14
frontend/src/lib/i18n/messages/de/services.json
Normal file
@@ -0,0 +1,14 @@
|
||||
{
|
||||
"services.title": "Übersetzungsanbieter",
|
||||
"services.subtitle": "Anbieter werden vom Administrator konfiguriert. Sie können sehen, welche derzeit für Ihr Konto verfügbar sind.",
|
||||
"services.loading": "Anbieter werden geladen...",
|
||||
"services.noProviders": "Derzeit sind keine Anbieter konfiguriert. Wenden Sie sich an Ihren Administrator.",
|
||||
"services.classic": "Klassische Übersetzung",
|
||||
"services.llmPro": "LLM · Kontextbezogen (Pro)",
|
||||
"services.available": "Verfügbar",
|
||||
"services.model": "Modell",
|
||||
"services.adminOnly.title": "Anbieterkonfiguration ist nur für Administratoren",
|
||||
"services.adminOnly.desc": "API-Schlüssel, Modellauswahl und Anbieteraktivierung werden ausschließlich vom Administrator im Admin-Panel verwaltet. Sie müssen niemals einen API-Schlüssel eingeben.",
|
||||
"services.fallback.google.label": "Google Übersetzer",
|
||||
"services.fallback.google.desc": "Schnelle Übersetzung, über 130 Sprachen"
|
||||
}
|
||||
20
frontend/src/lib/i18n/messages/de/settings.json
Normal file
20
frontend/src/lib/i18n/messages/de/settings.json
Normal file
@@ -0,0 +1,20 @@
|
||||
{
|
||||
"settings.title": "Einstellungen",
|
||||
"settings.subtitle": "Allgemeine Anwendungskonfiguration",
|
||||
"settings.formats.title": "Unterstützte Formate",
|
||||
"settings.formats.subtitle": "Dokumenttypen, die Sie übersetzen können",
|
||||
"settings.formats.formulas": "Formeln",
|
||||
"settings.formats.styles": "Stile",
|
||||
"settings.formats.images": "Bilder",
|
||||
"settings.formats.headers": "Kopfzeilen",
|
||||
"settings.formats.tables": "Tabellen",
|
||||
"settings.formats.slides": "Folien",
|
||||
"settings.formats.notes": "Notizen",
|
||||
"settings.cache.title": "Cache",
|
||||
"settings.cache.desc": "Das Löschen des lokalen Caches kann einige Anzeigeprobleme beheben.",
|
||||
"settings.cache.clearing": "Wird gelöscht...",
|
||||
"settings.cache.clear": "Cache löschen",
|
||||
"settings.formats.excel.name": "Excel",
|
||||
"settings.formats.word.name": "Word",
|
||||
"settings.formats.powerpoint.name": "PowerPoint"
|
||||
}
|
||||
92
frontend/src/lib/i18n/messages/de/translate.json
Normal file
92
frontend/src/lib/i18n/messages/de/translate.json
Normal file
@@ -0,0 +1,92 @@
|
||||
{
|
||||
"translate.mode.label": "Mode de traduction",
|
||||
"translate.mode.classic": "Classique",
|
||||
"translate.mode.classicDesc": "Rapide",
|
||||
"translate.mode.proLlm": "Pro LLM",
|
||||
"translate.mode.proLlmDesc": "Contextuel",
|
||||
"translate.mode.tooltip": "Passez à Pro pour la traduction LLM",
|
||||
"translate.mode.upgradeLink": "Passer à Pro",
|
||||
"translate.mode.upgradeDesc": "pour des traductions alimentées par LLM",
|
||||
"translate.glossary.title": "Glossar",
|
||||
"translate.glossary.select": "Glossar auswählen",
|
||||
"translate.glossary.none": "Keins",
|
||||
"translate.glossary.terms": "Begriffe",
|
||||
"translate.glossary.proOnly": "Upgraden Sie auf Pro für Glossare",
|
||||
"translate.glossary.myGlossaries": "Meine Glossare",
|
||||
"translate.glossary.fromTemplate": "Aus Vorlage erstellen",
|
||||
"translate.glossary.noGlossaryForPair": "Kein Glossar für",
|
||||
"translate.glossary.noGlossaries": "Keine Glossare",
|
||||
"translate.glossary.loading": "Laden...",
|
||||
"translate.glossary.classicMode": "Neutraler Motor ohne Glossar (nur KI)",
|
||||
"translate.glossary.selectPlaceholder": "Glossar auswählen...",
|
||||
"translate.glossary.multilingual": "MEHRSPRACHIG",
|
||||
"translate.glossary.noGlossaryAvailable": "Kein Glossar verfügbar",
|
||||
"translate.glossary.filterByLang": "Nach Sprache filtern",
|
||||
"translate.glossary.active": "Aktiv",
|
||||
"translate.glossary.inactive": "Inaktiv",
|
||||
"translate.glossary.availableTemplates": "Verfügbare Vorlagen",
|
||||
"translate.glossary.importing": "Importiere...",
|
||||
"translate.glossary.imported": "(Importiert)",
|
||||
"translate.glossary.noGlossaryForSource": "Kein Glossar oder Vorlage für Ausgangssprache",
|
||||
"translate.glossary.createGlossary": "Glossar erstellen",
|
||||
"translate.glossary.showAll": "Alle Glossare anzeigen",
|
||||
"translate.glossary.activePreview": "Vorschau aktiver Zuordnungen:",
|
||||
"translate.glossary.total": "gesamt",
|
||||
"translate.glossary.moreTerms": "weitere Begriffe",
|
||||
"translate.glossary.noTerms": "Keine Begriffe in diesem Glossar.",
|
||||
"translate.glossary.sourceTerm": "Quellbegriff",
|
||||
"translate.glossary.translation": "Übersetzung",
|
||||
"translate.glossary.addTerm": "Begriff hinzufügen",
|
||||
"translate.glossary.disabledMode": "Neutraler Motor ohne angewandtes Glossar",
|
||||
"translate.glossary.addTermError": "Fehler beim Hinzufügen des Begriffs",
|
||||
"translate.glossary.networkError": "Netzwerkfehler",
|
||||
"translate.glossary.importFailed": "Import fehlgeschlagen ({status})",
|
||||
"translate.glossary.helpText": "Das Glossar erzwingt die präzise Übersetzung von Begriffen. Wählen Sie ein Glossar, dessen Ausgangssprache der Originalsprache Ihres Dokuments entspricht.",
|
||||
"translate.glossary.sourceWarning": "Achtung: Dieses Glossar verwendet die Ausgangssprache",
|
||||
"translate.glossary.sourceWarningBut": "aber Ihr Dokument ist konfiguriert auf",
|
||||
"translate.glossary.targetWarning": "Ziel-Inkompatibilität: Dieses Glossar ist für die Übersetzung in",
|
||||
"translate.glossary.targetWarningBut": "aber Ihr Dokument zielt auf",
|
||||
"translate.glossary.targetWarningEnd": "Die Begriffe sind möglicherweise nicht relevant.",
|
||||
"translate.header.processing": "Verarbeitung läuft",
|
||||
"translate.header.aiActive": "KI-Analyse aktiv",
|
||||
"translate.header.aiActiveDesc": "Ihr Layout wird von unserer kontextuellen Engine beibehalten.",
|
||||
"translate.header.completed": "Abgeschlossen",
|
||||
"translate.header.completedTitle": "Übersetzung abgeschlossen",
|
||||
"translate.header.proSpace": "Pro-Bereich",
|
||||
"translate.header.translateDoc": "Dokument übersetzen",
|
||||
"translate.header.translateDocDesc": "Behalten Sie das Originallayout mit unserer Ultra-High-Fidelity-Übersetzungs-Engine.",
|
||||
"translate.upload.nativeFormat": "Natives Format",
|
||||
"translate.fileType.word": "Word (.docx)",
|
||||
"translate.fileType.excel": "Excel (.xlsx)",
|
||||
"translate.fileType.slides": "Folien (.pptx)",
|
||||
"translate.fileType.pdf": "PDF (.pdf)",
|
||||
"translate.startTranslation": "Übersetzung starten",
|
||||
"translate.submit": "Wird gesendet…",
|
||||
"translate.chooseTargetLang": "Bitte wählen Sie eine Zielsprache",
|
||||
"translate.pleaseLoadFile": "Bitte laden Sie zuerst eine Datei hoch",
|
||||
"translate.contextEngineActive": "Kontextuelle Engine aktiv",
|
||||
"translate.phase1": "Phase 1: Initialisierung",
|
||||
"translate.phase2": "Phase 2: Kontextuelle Rekonstruktion",
|
||||
"translate.stat.segments": "Segmente",
|
||||
"translate.stat.precision": "Genauigkeit",
|
||||
"translate.stat.speedLabel": "Geschwindigkeit",
|
||||
"translate.stat.turbo": "Turbo",
|
||||
"translate.stat.time": "Zeit",
|
||||
"translate.complete.masterQuality": "✓ Meister-Qualität",
|
||||
"translate.download": "Herunterladen",
|
||||
"translate.newTranslation": "+ Neue Übersetzung",
|
||||
"translate.failedTitle": "Übersetzungsfehler",
|
||||
"translate.retry": "Erneut versuchen",
|
||||
"translate.uploadAnother": "Andere Datei hochladen",
|
||||
"translate.monitor": "KI-Monitor",
|
||||
"translate.summary": "Zusammenfassung",
|
||||
"translate.cancelProcess": "⟳ Prozess abbrechen",
|
||||
"translate.layoutIntegrity": "Layout-Integrität",
|
||||
"translate.secureHundred": "100% SICHER",
|
||||
"translate.okHundred": "100% OK",
|
||||
"translate.preserveLayout": "Layout beibehalten",
|
||||
"translate.preserveLayoutDesc": "Layout beibehalten",
|
||||
"translate.textOnly": "Nur Text",
|
||||
"translate.textOnlyDesc": "Schnelle Übersetzung nur des Textes",
|
||||
"translate.unavailableStandard": "Im Standardmodus nicht verfügbar (nur KI)"
|
||||
}
|
||||
6
frontend/src/lib/i18n/messages/de/translateComplete.json
Normal file
6
frontend/src/lib/i18n/messages/de/translateComplete.json
Normal file
@@ -0,0 +1,6 @@
|
||||
{
|
||||
"translateComplete.highQuality": "Hohe Qualität",
|
||||
"translateComplete.segments": "Segmente",
|
||||
"translateComplete.characters": "Zeichen",
|
||||
"translateComplete.confidence": "Vertrauen"
|
||||
}
|
||||
Reference in New Issue
Block a user