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

59 lines
3.3 KiB
JSON

{
"profile.header.title": "Mon Profil",
"profile.header.subtitle": "Gérez votre compte et vos préférences.",
"profile.tabs.account": "Compte",
"profile.tabs.subscription": "Abonnement",
"profile.tabs.preferences": "Préférences",
"profile.account.user": "Utilisateur",
"profile.account.memberSince": "Membre depuis",
"profile.plan.label": "Forfait",
"profile.plan.free": "Gratuit",
"profile.plan.starter": "Starter",
"profile.plan.pro": "Pro",
"profile.plan.business": "Business",
"profile.plan.enterprise": "Enterprise",
"profile.plan.pricePerMonth": "{price} €/mois",
"profile.subscription.canceling": "Annulation en cours",
"profile.subscription.active": "Actif",
"profile.subscription.unknown": "Inconnu",
"profile.subscription.accessUntil": "Accès jusqu'au",
"profile.subscription.renewalOn": "Renouvellement le",
"profile.subscription.upgradePlan": "Passer à un forfait payant",
"profile.subscription.changePlan": "Changer de forfait",
"profile.subscription.manageBilling": "Gérer la facturation",
"profile.subscription.billingUnavailable": "Portail de facturation non disponible.",
"profile.subscription.billingError": "Erreur lors de l'accès au portail.",
"profile.subscription.cancelSuccess": "Abonnement annulé. Vous conservez l'accès jusqu'à la fin de la période.",
"profile.subscription.cancelError": "Erreur lors de l'annulation.",
"profile.subscription.networkError": "Erreur réseau.",
"profile.usage.title": "Utilisation ce mois-ci",
"profile.usage.resetOn": "Reset le",
"profile.usage.documents": "Documents",
"profile.usage.pages": "Pages",
"profile.usage.extraCredits": "crédit supplémentaire",
"profile.usage.extraCreditsPlural": "crédits supplémentaires",
"profile.usage.quotaReached": "Quota atteint",
"profile.usage.quotaReachedDesc": "Passez à un forfait supérieur pour continuer.",
"profile.usage.unlockMore": "Débloquez plus de traductions avec un forfait payant.",
"profile.usage.viewPlans": "Voir les forfaits",
"profile.usage.includedInPlan": "Inclus dans votre forfait",
"profile.danger.title": "Zone danger",
"profile.danger.description": "L'annulation prend effet à la fin de votre période en cours. Vous conservez l'accès jusqu'à cette date.",
"profile.danger.confirm": "Êtes-vous sûr(e) ? Cette action ne peut pas être annulée.",
"profile.danger.confirmCancel": "Confirmer l'annulation",
"profile.danger.cancelSubscription": "Annuler mon abonnement",
"profile.danger.keep": "Non, garder",
"profile.prefs.interfaceLang": "Langue de l'interface",
"profile.prefs.interfaceLangDesc": "La langue est détectée automatiquement selon votre navigateur. Vous pouvez la changer manuellement.",
"profile.prefs.defaultTargetLang": "Langue cible par défaut",
"profile.prefs.selectLanguage": "Sélectionner une langue",
"profile.prefs.defaultTargetLangDesc": "Cette langue sera pré-sélectionnée lors de vos traductions.",
"profile.prefs.save": "Enregistrer",
"profile.prefs.theme": "Thème",
"profile.prefs.themeDesc": "Choisissez l'apparence de l'interface",
"profile.prefs.cache": "Cache",
"profile.prefs.cacheDesc": "Effacer le cache local peut résoudre certains problèmes d'affichage.",
"profile.prefs.clearing": "Effacement...",
"profile.prefs.clearCache": "Effacer le cache"
}