From a0de00a4e78d44c72f5d554d064b5fbd5b16cf35 Mon Sep 17 00:00:00 2001 From: sepehr Date: Sun, 31 May 2026 10:28:12 +0200 Subject: [PATCH] fix(translate): ajout des cles de traduction manquantes et re-positionnement intelligent du bouton de traduction --- frontend/src/app/dashboard/translate/page.tsx | 97 ++++++++++++------- frontend/src/lib/i18n.tsx | 10 ++ 2 files changed, 71 insertions(+), 36 deletions(-) diff --git a/frontend/src/app/dashboard/translate/page.tsx b/frontend/src/app/dashboard/translate/page.tsx index 856da1b..c9ebbd0 100644 --- a/frontend/src/app/dashboard/translate/page.tsx +++ b/frontend/src/app/dashboard/translate/page.tsx @@ -184,7 +184,7 @@ export default function TranslatePage() { const qualityLabel = useMemo(() => getQualityLabel(t, config.provider), [t, config.provider]); return ( -
+
{/* ── HEADER (Landing Page Style) ───────────────────────── */} @@ -296,6 +296,44 @@ export default function TranslatePage() {
)} + {/* ── Desktop Submit Button & Actions (shown when not processing/complete) ── */} + {(showUpload || showConfiguring) && ( +
+ + + {!upload.file && ( +

{t('dashboard.translate.noFile') || 'Veuillez charger un fichier'}

+ )} + {upload.file && !config.targetLang && ( +

{t('dashboard.translate.noTargetLang') || 'Veuillez choisir une langue cible'}

+ )} + +
+ + {t('landing.translate.zeroRetention') || 'Rétention Zéro'} + + + {t('landing.translate.filesDeleted') || 'Fichiers supprimés post-traitement'} + +
+
+ )} + {/* ── PROCESSING STATE: Rich progress ───────────────── */} {showProcessing && (
@@ -570,41 +608,6 @@ export default function TranslatePage() { )}
- - {/* ── TRANSLATE BUTTON — fixed at bottom, never scrolls away ── */} -
- - {!upload.file && ( -

↑ Veuillez charger un fichier pour commencer

- )} - {upload.file && !config.targetLang && ( -

↑ Veuillez choisir une langue cible

- )} -
- -
- - {t('landing.translate.zeroRetention') || 'Rétention Zéro'} - - - {t('landing.translate.filesDeleted') || 'Fichiers supprimés post-traitement'} - -
)} @@ -747,6 +750,28 @@ export default function TranslatePage() { )} + + {/* Mobile Sticky Action Bar (visible on mobile, hidden on lg) */} + {(showUpload || showConfiguring) && ( +
+ +
+ )} ); diff --git a/frontend/src/lib/i18n.tsx b/frontend/src/lib/i18n.tsx index a573943..e399245 100644 --- a/frontend/src/lib/i18n.tsx +++ b/frontend/src/lib/i18n.tsx @@ -195,6 +195,11 @@ const messages: Record> = { "dashboard.translate.provider.upgrade": "Upgrade to Pro", "dashboard.translate.provider.upgradeSuffix": "to unlock AI translation", + "dashboard.translate.provider.tabStandard": "Standard", + "dashboard.translate.provider.tabLLM": "AI Multi-Models", + "translate.glossary.selectGlossary": "Select a glossary...", + "dashboard.translate.translateImages": "Translate images", + "dashboard.translate.translateImagesDesc": "Extract and translate text inside images (vision required)", "dashboard.translate.trust.zeroRetention": "Zero retention", "dashboard.translate.trust.deletedAfter": "Files deleted after processing", @@ -1004,6 +1009,11 @@ const messages: Record> = { "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", + "translate.glossary.selectGlossary": "Sélectionner un glossaire...", + "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",