Some checks failed
Deploy to Production / Build and Deploy (push) Failing after 2m14s
Foundations:
- TranslationSegment model + migration f7e8d9c0b1a2 (segments, workspaces,
workspace_members, glossaries.workspace_id)
- SegmentRecorder injected into all 4 translators: unique (source,
translation) pairs captured per job and persisted (best-effort)
- set_segment_overrides: human-reviewed translations applied verbatim on
rebuild — top priority over TM and provider, zero API calls
Review API (routes/review_routes.py):
- GET /translations/{id}/segments (owner or job token)
- PATCH /segments/{id} edit/approve — feeds the per-user TM so approved
translations are reused in later jobs
- POST /translations/{id}/rebuild — rebuild document with reviewed text
- GET/POST /translations/{id}/xliff — XLIFF 1.2 export/import (edited
segments export their reviewed text)
Review editor (frontend /dashboard/reviews/[jobId]):
- side-by-side source/translation table, inline edit, approve (single or
all), rebuild & download (auth blob), XLIFF export/import, 13 locales
- 'Relire et corriger' link on the translation-complete screen
Team workspaces (routes/workspace_routes.py + /dashboard/teams):
- Workspace/WorkspaceMember models, roles owner/admin/member
- create (Business plan), list with seat usage, invite by email with
seat-limit enforcement (Business=5, Enterprise unlimited), removal
- shared glossaries: workspace members can use a glossary shared to their
workspace (access check extended)
Tests: 1184 passed / 0 failed (11 new: recorder, overrides, docx
capture->rebuild e2e, XLIFF structure/escaping, seats, workspace CRUD,
shared glossary access)
117 lines
7.6 KiB
JSON
117 lines
7.6 KiB
JSON
{
|
|
"dashboard.nav.translate": "Traduire",
|
|
"dashboard.nav.profile": "Mon Profil",
|
|
"dashboard.nav.settings": "Paramètres",
|
|
"dashboard.nav.context": "Contexte",
|
|
"dashboard.nav.services": "Services",
|
|
"dashboard.nav.apiKeys": "Clés API",
|
|
"dashboard.nav.glossaries": "Glossaires & Contexte",
|
|
"dashboard.header.title": "Dashboard",
|
|
"dashboard.header.subtitle": "Gérez vos traductions",
|
|
"dashboard.header.toggleMenu": "Menu",
|
|
"dashboard.header.profileTitle": "Mon profil",
|
|
"dashboard.sidebar.theme": "Thème",
|
|
"dashboard.sidebar.signOut": "Déconnexion",
|
|
"dashboard.sidebar.backHome": "Retour à l'accueil",
|
|
"dashboard.sidebar.upgradeToPro": "Passer Pro →",
|
|
"dashboard.translate.pageTitle": "Traduire un document",
|
|
"dashboard.translate.pageSubtitle": "Importez un fichier et choisissez la langue cible",
|
|
"dashboard.translate.errorNotificationTitle": "Erreur",
|
|
"dashboard.translate.dropzone.uploadAria": "Zone de dépôt de fichier",
|
|
"dashboard.translate.dropzone.title": "Glissez-déposez votre fichier ici",
|
|
"dashboard.translate.dropzone.subtitle": "ou cliquez pour sélectionner (DOCX, XLSX, PPTX, PDF)",
|
|
"dashboard.translate.dropzone.replaceFile": "Remplacer le fichier",
|
|
"dashboard.translate.language.source": "Langue source",
|
|
"dashboard.translate.language.target": "Langue cible",
|
|
"dashboard.translate.language.loading": "Chargement des langues…",
|
|
"dashboard.translate.language.autoDetect": "Auto-détection",
|
|
"dashboard.translate.language.selectPlaceholder": "Sélectionner…",
|
|
"dashboard.translate.language.loadErrorPrefix": "Erreur de chargement des langues",
|
|
"dashboard.translate.provider.loading": "Chargement des fournisseurs…",
|
|
"dashboard.translate.provider.noneConfigured": "Aucun fournisseur configuré",
|
|
"dashboard.translate.provider.modelTitle": "Modèle",
|
|
"dashboard.translate.provider.sectionTitle": "Fournisseur",
|
|
"dashboard.translate.provider.llmDivider": "IA · Context-Aware",
|
|
"dashboard.translate.provider.llmDividerPro": "IA · Context-Aware (Pro)",
|
|
"dashboard.translate.provider.upgrade": "Passer Pro",
|
|
"dashboard.translate.provider.upgradeSuffix": "pour débloquer la traduction IA",
|
|
"dashboard.translate.provider.tabStandard": "Standard",
|
|
"dashboard.translate.provider.tabLLM": "Multi-Modèles IA",
|
|
"dashboard.translate.translateImages": "Traduire les images",
|
|
"dashboard.translate.translateImagesDesc": "Extraire et traduire le texte des images (vision requise)",
|
|
"dashboard.translate.trust.zeroRetention": "Rétention zéro",
|
|
"dashboard.translate.trust.deletedAfter": "Fichiers supprimés après traitement",
|
|
"dashboard.translate.actions.uploading": "Chargement…",
|
|
"dashboard.translate.actions.translate": "Traduire",
|
|
"dashboard.translate.actions.filePrefix": "Fichier : ",
|
|
"dashboard.translate.actions.cancel": "Annuler",
|
|
"dashboard.translate.actions.tryAgain": "Réessayer",
|
|
"dashboard.translate.steps.uploading": "Chargement du fichier…",
|
|
"dashboard.translate.steps.starting": "Démarrage de la traduction…",
|
|
"dashboard.translate.complete.title": "Traduction terminée !",
|
|
"dashboard.translate.complete.descNamed": "Votre fichier {name} a été traduit avec succès.",
|
|
"dashboard.translate.complete.descGeneric": "Votre fichier a été traduit avec succès.",
|
|
"dashboard.translate.complete.downloading": "Téléchargement…",
|
|
"dashboard.translate.complete.download": "Télécharger",
|
|
"dashboard.translate.complete.newTranslation": "Nouvelle traduction",
|
|
"dashboard.translate.complete.toastOkTitle": "Succès",
|
|
"dashboard.translate.complete.toastOkDesc": "{name} a été téléchargé avec succès.",
|
|
"dashboard.translate.complete.toastFailTitle": "Échec",
|
|
"dashboard.translate.complete.toastFailDesc": "La traduction a échoué. Veuillez réessayer.",
|
|
"dashboard.translate.sourceDocument": "Document source",
|
|
"dashboard.translate.configuration": "Configuration",
|
|
"dashboard.translate.translating": "Traduction en cours",
|
|
"dashboard.translate.liveMonitor": "Moniteur en direct",
|
|
"dashboard.translate.summary": "Résumé",
|
|
"dashboard.translate.engine": "Moteur",
|
|
"dashboard.translate.confidence": "Confiance",
|
|
"dashboard.translate.cancel": "Annuler",
|
|
"dashboard.translate.segments": "Segments",
|
|
"dashboard.translate.characters": "Caractères",
|
|
"dashboard.translate.elapsed": "Écoulé",
|
|
"dashboard.translate.segPerMin": "Seg/min",
|
|
"dashboard.translate.highQuality": "Haute qualité",
|
|
"dashboard.translate.quality": "Qualité",
|
|
"dashboard.translate.completed": "Traduction terminée",
|
|
"dashboard.translate.replace": "Remplacer",
|
|
"dashboard.translate.pdfMode.title": "Mode de traduction PDF",
|
|
"dashboard.translate.pdfMode.preserveLayout": "Préserver la mise en page",
|
|
"dashboard.translate.pdfMode.textOnly": "Texte uniquement",
|
|
"dashboard.translate.pdfMode.preserveLayoutDesc": "Conserve les images, tableaux et formatage. Idéal pour les PDF simples.",
|
|
"dashboard.translate.pdfMode.textOnlyDesc": "Traduit tout le texte parfaitement. Sortie propre, sans problème de mise en page.",
|
|
"dashboard.translate.pipeline.upload": "Upload",
|
|
"dashboard.translate.pipeline.analyze": "Analyse",
|
|
"dashboard.translate.pipeline.translate": "Traduction",
|
|
"dashboard.translate.pipeline.rebuild": "Reconstruction",
|
|
"dashboard.translate.pipeline.finalize": "Finalisation",
|
|
"dashboard.translate.progress.processingFallback": "Traitement en cours…",
|
|
"dashboard.translate.progress.connectionLost": "Connexion perdue. Reconnexion…",
|
|
"dashboard.translate.progress.failedTitle": "Traduction échouée",
|
|
"dashboard.translate.error.unexpected": "Une erreur inattendue est survenue. Réessayez.",
|
|
"dashboard.translate.error.noResult": "La traduction n'a produit aucun résultat. Vérifiez que le document contient du texte, puis réessayez ou choisissez un autre moteur.",
|
|
"dashboard.translate.error.apiKey": "Clé API invalide ou manquante. Contactez l'administrateur pour configurer les clés.",
|
|
"dashboard.translate.error.quota": "Limite d'utilisation atteinte. Réessayez dans quelques minutes ou choisissez un autre moteur.",
|
|
"dashboard.translate.error.timeout": "La connexion au service de traduction a expiré. Vérifiez votre réseau et réessayez.",
|
|
"dashboard.translate.error.sessionExpired": "La session a expiré. Cliquez sur Réessayer pour relancer la traduction.",
|
|
"dashboard.translate.error.empty": "Le document semble vide ou ne contient pas de texte traduisible (PDF image ?).",
|
|
"dashboard.translate.error.unsupported": "Format de fichier non supporté ou fichier corrompu.",
|
|
"dashboard.translate.error.connection": "Connexion perdue. Vérifiez votre réseau et réessayez.",
|
|
"dashboard.translate.error.generic": "Traduction échouée : {detail}",
|
|
"dashboard.translate.error.title": "Traduction échouée",
|
|
"dashboard.translate.retry": "Réessayer la traduction",
|
|
"dashboard.translate.newFile": "Nouveau fichier",
|
|
"dashboard.translate.modeAI": "Mode IA",
|
|
"dashboard.translate.modeClassic": "Mode Classique",
|
|
"dashboard.translate.glossaryLLMHint": "Glossaires disponibles en mode IA",
|
|
"dashboard.translate.submitting": "Envoi en cours...",
|
|
"dashboard.translate.submit": "Lancer la traduction",
|
|
"dashboard.translate.noFile": "Déposez d'abord un fichier",
|
|
"dashboard.translate.noTargetLang": "Sélectionnez une langue cible",
|
|
"dashboard.topbar.interfaceLabel": "Interface de traduction",
|
|
"dashboard.topbar.premiumAccess": "Accès Premium",
|
|
"dashboard.checkoutSyncError": "Erreur lors de la synchronisation du paiement.",
|
|
"dashboard.networkRefresh": "Erreur réseau. Veuillez rafraîchir la page.",
|
|
"dashboard.continueToTranslate": "Continuer vers la traduction",
|
|
"dashboard.nav.teams": "Équipe"
|
|
}
|