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).
59 lines
3.3 KiB
JSON
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"
|
|
}
|