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).
147 lines
8.8 KiB
JSON
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"
|
|
}
|