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).
153 lines
8.6 KiB
JSON
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"
|
|
}
|