Files
office_translator/frontend/src/lib/i18n/messages/de/landing.json
sepehr fa637abff0
All checks were successful
Deploy to Production / Build and Deploy (push) Successful in 2m49s
perf+security: fix build, secure downloads, dedupe translations, refactor i18n
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).
2026-06-14 16:44:18 +02:00

147 lines
8.8 KiB
JSON

{
"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"
}