Files
office_translator/frontend/src/lib/i18n/messages/en/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

153 lines
8.6 KiB
JSON

{
"landing.nav.why": "Why Us?",
"landing.nav.formats": "Formats",
"landing.nav.pricing": "Pricing",
"landing.nav.login": "Log in",
"landing.nav.startFree": "Start Free",
"landing.hero.tag": "Professional Document AI",
"landing.hero.titleLine1": "Translate your documents.",
"landing.hero.titleLine2": "Keep the formatting perfect.",
"landing.hero.description": "The only translator that preserves SmartArt, charts, tables of contents, shapes, and complex layouts — exactly as they were.",
"landing.hero.ctaMain": "Start Free — 2 docs/month",
"landing.hero.ctaSec": "See Offers",
"landing.hero.deleted": "Files deleted after 60 min",
"landing.hero.noHidden": "No hidden fees",
"landing.hero.preview": "Preview before payment",
"landing.hero.formattedOk": "Formatting OK",
"landing.hero.aiActive": "AI Translation active",
"landing.steps.title": "How it works?",
"landing.steps.subtitle": "Three steps. Zero formatting loss.",
"landing.steps.step1.num": "01",
"landing.steps.step1.title": "Upload your file",
"landing.steps.step1.desc": "Drag & drop your Excel, Word, PowerPoint or PDF document.",
"landing.steps.step2.num": "02",
"landing.steps.step2.title": "Pick language & engine",
"landing.steps.step2.desc": "Select target language and engine — classic or context-aware AI.",
"landing.steps.step3.num": "03",
"landing.steps.step3.title": "Download the result",
"landing.steps.step3.desc": "Get your translated document with formatting identical to the original.",
"landing.features.tag": "AI Translation Engine",
"landing.features.title": "Translation that understands your craft",
"landing.features.description": "Our AI models analyze context, respect your terminology, and even translate text inside images.",
"landing.features.context.title": "Industry Context",
"landing.features.context.desc": "Describe your field and get tailored translations, not generic ones.",
"landing.features.glossary.title": "Industry Glossaries",
"landing.features.glossary.desc": "Define your technical terms. CTA stays 'Air Handling Unit', never 'Call To Action'.",
"landing.features.vision.title": "Image Vision",
"landing.features.vision.desc": "Text embedded in images, diagrams and charts is detected and translated.",
"landing.features.demo.source": "Source (FR)",
"landing.features.demo.google": "Google Translate",
"landing.features.demo.ours": "Our AI",
"landing.layout.title": "Your formatting,",
"landing.layout.title2": "perfectly preserved",
"landing.layout.subtitle": "Other translators break your layout. We don't.",
"landing.layout.p1.title": "SmartArt & Diagrams",
"landing.layout.p1.desc": "Org charts, flowcharts, hierarchies — all translated identically.",
"landing.layout.p2.title": "Tables of Contents",
"landing.layout.p2.desc": "TOC entries, page numbers and cross-references updated correctly.",
"landing.layout.p3.title": "Charts & Graphs",
"landing.layout.p3.desc": "Titles, axis labels, legends and series names — everything is translated.",
"landing.layout.p4.title": "Shapes & Text Boxes",
"landing.layout.p4.desc": "Rectangles, rounded blocks, callouts — localized everywhere.",
"landing.layout.p5.title": "Headers & Footers",
"landing.layout.p5.desc": "Headers, footers and footnotes are never missed.",
"landing.layout.p6.title": "130+ Languages",
"landing.layout.p6.desc": "Google Translate, DeepL and professional-grade AI engines.",
"landing.formats.title": "Every format,",
"landing.formats.title2": "every element",
"landing.formats.subtitle": "We translate what others miss. Your business deserves irreproachable documentation.",
"landing.formats.word.name": "Word",
"landing.formats.word.i1": "Paragraphs & headings",
"landing.formats.word.i2": "Tables & charts",
"landing.formats.word.i3": "SmartArt diagrams",
"landing.formats.word.i4": "Table of contents",
"landing.formats.word.i5": "Headers & footers",
"landing.formats.word.i6": "Shapes & text boxes",
"landing.formats.word.i7": "Footnotes & endnotes",
"landing.formats.excel.name": "Excel",
"landing.formats.excel.i1": "Cell values",
"landing.formats.excel.i2": "Sheet names",
"landing.formats.excel.i3": "Charts & labels",
"landing.formats.excel.i4": "Headers & footers",
"landing.formats.excel.i5": "Merged cells preserved",
"landing.formats.pptx.name": "PowerPoint",
"landing.formats.pptx.i1": "Slide text & notes",
"landing.formats.pptx.i2": "Charts & diagrams",
"landing.formats.pptx.i3": "Shapes & text boxes",
"landing.formats.pptx.i4": "Master layouts",
"landing.formats.pptx.i5": "Animations preserved",
"landing.formats.pdf.name": "PDF",
"landing.formats.pdf.i1": "Text-based PDFs",
"landing.formats.pdf.i2": "Layout preserved",
"landing.formats.pdf.i3": "Images kept in place",
"landing.formats.pdf.i4": "Tables maintained",
"landing.formats.pdf.i5": "Output as DOCX or PDF",
"landing.pricing.title": "Simple, honest pricing",
"landing.pricing.subtitle": "What you see is what you pay. No hidden fees.",
"landing.pricing.monthly": "Monthly",
"landing.pricing.annual": "Annual",
"landing.pricing.bestValue": "Most Popular",
"landing.pricing.month": "/month",
"landing.pricing.footer": "The displayed price is the price you pay. No hidden fees after translation.",
"landing.pricing.starter.name": "Starter",
"landing.pricing.starter.desc": "For individuals and small projects",
"landing.pricing.starter.f1": "50 documents / month",
"landing.pricing.starter.f2": "Up to 50 pages per doc",
"landing.pricing.starter.f3": "Google Translate + DeepL",
"landing.pricing.starter.f4": "Files up to 10 MB",
"landing.pricing.starter.cta": "Get Started",
"landing.pricing.pro.name": "Pro",
"landing.pricing.pro.desc": "For demanding professionals",
"landing.pricing.pro.f1": "200 documents / month",
"landing.pricing.pro.f2": "Up to 200 pages per doc",
"landing.pricing.pro.f3": "AI-powered translation",
"landing.pricing.pro.f4": "Google + DeepL included",
"landing.pricing.pro.f5": "Custom glossaries & prompts",
"landing.pricing.pro.f6": "Priority support",
"landing.pricing.pro.cta": "Try Pro",
"landing.pricing.business.name": "Business",
"landing.pricing.business.desc": "For teams with high-volume needs",
"landing.pricing.business.f1": "1,000 documents / month",
"landing.pricing.business.f2": "Up to 500 pages per doc",
"landing.pricing.business.f3": "Premium AI (Claude)",
"landing.pricing.business.f4": "All providers + API access",
"landing.pricing.business.f5": "Webhooks & automation",
"landing.pricing.business.f6": "5 team seats",
"landing.pricing.business.cta": "Contact Us",
"landing.pricing.free.name": "Free",
"landing.pricing.free.desc": "Perfect to discover the app",
"landing.pricing.free.cta": "Choose this plan",
"landing.pricing.enterprise.name": "Enterprise",
"landing.pricing.enterprise.desc": "Custom solutions for large organizations",
"landing.pricing.enterprise.cta": "Contact us",
"landing.cta.title": "Start translating in 30 seconds",
"landing.cta.subtitle": "No credit card required. Try for free now and bring your multilingual documents back to life.",
"landing.cta.button": "Create Free Account",
"landing.cta.secure": "Secured by AES-256 encryption",
"landing.footer.desc": "Expert in intelligent document translation. We blend the art of layout with the science of contextual AI.",
"landing.footer.product": "Product",
"landing.footer.resources": "Resources",
"landing.footer.legal": "Legal",
"landing.footer.rights": "© 2026 Wordly.art — All rights reserved.",
"landing.hero.contextEngine": "Translation detected: Technical maintenance term for HVAC systems...",
"landing.hero.liveAnalysis": "Live Analysis",
"landing.hero.termsDetected": "terms detected",
"landing.steps.process": "PROCESS",
"landing.translate.newProject": "New Project",
"landing.translate.title": "Translate a document",
"landing.translate.subtitle": "Import a file and choose the target language",
"landing.translate.sourceDocument": "Source Document",
"landing.translate.configuration": "Configuration",
"landing.translate.sourceLang": "Source Language",
"landing.translate.targetLang": "Target Language",
"landing.translate.provider": "Provider",
"landing.translate.startTranslation": "Start Translation",
"landing.translate.zeroRetention": "Zero retention",
"landing.translate.filesDeleted": "Files deleted after processing",
"landing.translate.dropHere": "Drag & drop here",
"landing.translate.supportedFormats": "DOCX, XLSX, PPTX or PDF files supported",
"landing.translate.aiAnalysis": "Active AI Analysis",
"landing.translate.processing": "Processing",
"landing.translate.preservingLayout": "Your layout is being preserved"
}