# Cahier des Charges — Refonte Design & Positionnement IA **Auteur** : Mary (Business Analyst), basé sur l'audit du 2026-05-08 **Projet** : Office Translator **Objectif** : Transformer l'IA d'une feature cachée en différentiateur central, et corriger les problèmes UX prioritaires --- ## 1. Contexte et Enjeux ### 1.1 État des lieux Office Translator dispose d'un moteur de traduction IA complet (DeepSeek V3, Claude 3.5 Haiku, glossaires métier, system prompts, vision sur images). Cependant, l'audit révèle que : - L'IA est **invisible** pour les utilisateurs Free (provider selector masqué) - La landing page **ne mentionne pas** la traduction IA comme différenciateur principal - Les métriques de qualité sont **fictives** (confiance 96% hardcodée, segments 142 hardcodés) - Plusieurs pages mélangent **texte hardcodé et clés i18n**, cassant l'internationalisation - Aucune section **"Comment ça marche"**, aucune **preuve sociale**, aucun **playground de démo** ### 1.2 Objectifs mesurables | KPI | Actuel (estimé) | Cible | |-----|-----------------|-------| | Taux de conversion Free → Pro | < 2% | 5-8% | | Taux de rebond landing page | Inconnu | -30% | | Feature discovery IA (Free users) | ~0% | 80% | | Score de confiance utilisateur | Variable (métriques fausses) | Données réelles, toujours pertinentes | --- ## 2. Périmètre des Travaux ### Phase 1 — Correction UX / i18n (P0) ### Phase 2 — Positionnement IA sur la Landing (P1) ### Phase 3 — Freemium IA & Conversion (P1) ### Phase 4 — Enrichissement Landing & Social Proof (P2) ### Phase 5 — Nettoyage technique (P3) --- ## 3. Phase 1 — Correction UX / i18n (P0) ### 3.1 Internationalisation des pages **Problème** : Les pages `translate/page.tsx`, `services/page.tsx`, et `features-section.tsx` contiennent du texte hardcodé (anglais et français) au lieu d'utiliser les clés i18n. #### 3.1.1 Page de traduction (`translate/page.tsx`) Textes à migrer vers i18n : | Texte hardcodé | Clé i18n proposée | Fichier | |---|---|---| | "Source Document" | `dashboard.translate.sourceDocument` | translate/page.tsx | | "Configuration" | `dashboard.translate.configuration` | translate/page.tsx | | "Traduction en cours" | `dashboard.translate.translating` | translate/page.tsx | | "Moniteur en direct" | `dashboard.translate.liveMonitor` | translate/page.tsx | | "Résumé" | `dashboard.translate.summary` | translate/page.tsx | | "Moteur" | `dashboard.translate.engine` | translate/page.tsx | | "Confiance" | `dashboard.translate.confidence` | translate/page.tsx | | "Annuler" | `dashboard.translate.cancel` | translate/page.tsx | | "Segments" | `dashboard.translate.segments` | translate/page.tsx | | "Caractères" | `dashboard.translate.characters` | translate/page.tsx | | "Écoulé" | `dashboard.translate.elapsed` | translate/page.tsx | | "Seg/min" | `dashboard.translate.segPerMin` | translate/page.tsx | | "Haute qualité" | `dashboard.translate.highQuality` | translate/page.tsx | | "Qualité" | `dashboard.translate.quality` | translate/page.tsx | | "Traduction terminée" | `dashboard.translate.completed` | translate/page.tsx | | "Remplacer" | `dashboard.translate.replace` | translate/page.tsx | | "PDF Translation Mode" | `dashboard.translate.pdfMode.title` | translate/page.tsx | | "Preserve Layout" | `dashboard.translate.pdfMode.preserveLayout` | translate/page.tsx | | "Text Only" | `dashboard.translate.pdfMode.textOnly` | translate/page.tsx | | Descriptions PDF mode (2 paragraphes) | `dashboard.translate.pdfMode.preserveLayoutDesc` / `textOnlyDesc` | translate/page.tsx | | Labels du pipeline (Upload, Analyse, Traduction, Reconstruction, Finalisation) | `dashboard.translate.pipeline.upload` etc. | translate/page.tsx | **Critères d'acceptation** : - Toutes les 13 locales (`en`, `fr`, `es`, `de`, `pt`, `it`, `nl`, `ru`, `ja`, `ko`, `zh`, `ar`, `fa`) doivent avoir une traduction pour chaque clé - Aucun texte visible en dur dans le code source - Test visuel sur 3 locales minimum (en, fr, fa) pour vérifier l'affichage #### 3.1.2 Page Services (`services/page.tsx`) Textes à migrer : | Texte hardcodé | Clé i18n proposée | |---|---| | "Translation Providers" | `dashboard.services.title` | | "Providers are configured by the administrator..." | `dashboard.services.subtitle` | | "Classic Translation" | `dashboard.services.classicTitle` | | "LLM · Context-Aware (Pro)" | `dashboard.services.llmTitle` | | "Available" | `dashboard.services.available` | | "Provider configuration is admin-only" | `dashboard.services.adminOnly.title` | | Description du panneau admin | `dashboard.services.adminOnly.description` | | "Loading providers..." | `dashboard.services.loading` | | "No providers are currently configured..." | `dashboard.services.none` | | "Model:" | `dashboard.services.model` | #### 3.1.3 Composant features (`features-section.tsx`) Ce composant est un composant legacy non utilisé par la landing actuelle (`landing-page.tsx` a sa propre section features). Il doit être soit supprimé, soit intégré avec i18n complète. Voir Phase 5 — section 7.3. ### 3.2 Métriques dynamiques **Problème** : Les statistiques affichées pendant et après la traduction sont hardcodées et fictives. #### 3.2.1 Données fictives identifiées Fichier `translate/page.tsx`, lignes 128-129 : ```typescript const totalSegments = 142; const totalChars = 12847; ``` Et le score de confiance est calculé avec une formule arbitraire : ```typescript Math.min(96, Math.round(82 + submit.progress * 0.14)) ``` #### 3.2.2 Solution — Données réelles depuis le backend **Backend** : L'endpoint de progression (`/api/v1/translate/{session_id}/progress`) doit retourner : ```json { "progress": 65, "current_step": "Translating segment 87/134", "total_segments": 134, "completed_segments": 87, "total_chars": 12450, "completed_chars": 8092, "elapsed_seconds": 23, "estimated_remaining_seconds": 12, "segments_per_minute": 227, "provider": "openrouter" } ``` **Frontend** : Remplacer les constantes hardcodées par les valeurs retournées par l'API de progression. Si l'API ne retourne pas ces champs, les calculer côté frontend à partir des données disponibles, ou afficher "—" au lieu d'un chiffre inventé. **Critères d'acceptation** : - Le nombre de segments affiché correspond au nombre réel de segments dans le document - Le score de confiance est soit basé sur des métriques réelles, soit retiré et remplacé par un indicateur qualitatif ("Standard" / "Haute précision" selon le provider) - Aucun chiffre fictif visible par l'utilisateur ### 3.3 Suppression du score de confiance fictif Si le calcul d'un vrai score de confiance est trop complexe pour cette phase, remplacer par un indicateur qualitatif du provider : | Provider | Label affiché | |---|---| | Google / LibreTranslate | "Traduction standard" | | DeepL | "Haute qualité" | | DeepSeek / LLM Essential | "IA Contextuelle" | | Claude / LLM Premium | "IA Expert — Haute précision" | Ce label remplace le pourcentage fictif "96%" et est purement informatif, basé sur le type de provider sélectionné. --- ## 4. Phase 2 — Positionnement IA sur la Landing (P1) ### 4.1 Nouvelle section "AI Translation Engine" **Emplacement** : Sur la landing page (`landing-page.tsx`), entre le Hero et la section "Why Us" existante. #### 4.1.1 Structure de la section ``` ┌──────────────────────────────────────────────────────────┐ │ Badge : 🧠 AI-Powered Translation Engine │ │ │ │ Titre : La traduction qui comprend votre métier │ │ Sous-titre : Nos modèles IA analysent le contexte, │ │ respectent votre terminologie et traduisent même │ │ le texte dans vos images. │ │ │ │ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │ │ │ 📋 Contexte │ │ 📖 Glossaire│ │ 👁️ Vision │ │ │ │ │ │ │ │ │ │ │ │ Décrivez │ │ Définissez │ │ Le texte │ │ │ │ votre │ │ vos termes │ │ dans les │ │ │ │ domaine │ │ métier │ │ images est │ │ │ │ technique │ │ (CTA=AHU) │ │ traduit │ │ │ └─────────────┘ └─────────────┘ └─────────────┘ │ │ │ │ ┌──── Comparaison visuelle ────────────────────────┐ │ │ │ Source (FR) : "La batterie de chauffe est │ │ │ │ raccordée sur la CTA" │ │ │ │ │ │ │ │ Google : "The heating battery is connected │ │ │ │ on the call to action" ❌ │ │ │ │ │ │ │ │ Notre IA : "The heating coil is connected │ │ │ │ to the AHU" ✅ │ │ │ └────────────────────────────────────────────────────┘ │ └──────────────────────────────────────────────────────────┘ ``` #### 4.1.2 Clés i18n de la section | Clé | FR | EN | |---|---|---| | `landing.ai.badge` | Moteur de Traduction IA | AI-Powered Translation Engine | | `landing.ai.title` | La traduction qui comprend votre métier | Translation that understands your craft | | `landing.ai.subtitle` | Nos modèles IA analysent le contexte, respectent votre terminologie et traduisent même le texte dans vos images. | Our AI models analyze context, respect your terminology, and even translate text inside images. | | `landing.ai.context.title` | Contexte métier | Industry Context | | `landing.ai.context.desc` | Décrivez votre domaine et obtenez des traductions adaptées, pas génériques. | Describe your field and get tailored translations, not generic ones. | | `landing.ai.glossary.title` | Glossaires métier | Industry Glossaries | | `landing.ai.glossary.desc` | Définissez vos termes techniques. CTA restera "Air Handling Unit", jamais "Call To Action". | Define your technical terms. CTA stays "Air Handling Unit", never "Call To Action". | | `landing.ai.vision.title` | Vision sur images | Image Vision | | `landing.ai.vision.desc` | Le texte incrusté dans vos images, diagrammes et graphiques est détecté et traduit. | Text embedded in images, diagrams and charts is detected and translated. | | `landing.ai.comparison.source` | Source (FR) | Source (FR) | | `landing.ai.comparison.google` | Google Translate | Google Translate | | `landing.ai.comparison.ai` | Notre IA | Our AI | #### 4.1.3 Critères d'acceptation - La section est responsive (mobile : colonne unique, desktop : 3 colonnes pour les features) - L'exemple de comparaison est statique mais réaliste (pas d'appel API) - L'animation au scroll est fluide (fade-in des cartes) - La section est entièrement i18n-ready (13 locales) ### 4.2 Section "Comment ça marche" **Emplacement** : Après la section AI Engine, avant "Why Us". #### 4.2.1 Structure ``` ┌──────────────────────────────────────────────────────────┐ │ Comment ça marche ? │ │ │ │ ① Déposez ② Configurez ③ Téléchargez │ │ ┌────────┐ ┌────────┐ ┌────────┐ │ │ │ Upload │ ──▶ │ Choix │ ──▶ │ Fichier│ │ │ │ fichier│ │ langue │ │ traduit│ │ │ └────────┘ │ + IA │ │ + même │ │ │ └────────┘ │ format │ │ │ └────────┘ │ │ │ │ DOCX, XLSX, PPTX, PDF — Votre format est préservé │ └──────────────────────────────────────────────────────────┘ ``` #### 4.2.2 Clés i18n | Clé | FR | EN | |---|---|---| | `landing.howItWorks.title` | Comment ça marche ? | How it works | | `landing.howItWorks.subtitle` | Trois étapes. Zéro perte de format. | Three steps. Zero formatting loss. | | `landing.howItWorks.step1.title` | Déposez votre fichier | Upload your file | | `landing.howItWorks.step1.desc` | Glissez-déposez votre document Excel, Word, PowerPoint ou PDF. | Drag & drop your Excel, Word, PowerPoint or PDF document. | | `landing.howItWorks.step2.title` | Choisissez la langue et le moteur | Pick language & engine | | `landing.howItWorks.step2.desc` | Sélectionnez la langue cible et le moteur de traduction — classique ou IA contextuelle. | Select target language and engine — standard or context-aware AI. | | `landing.howItWorks.step3.title` | Téléchargez le résultat | Download the result | | `landing.howItWorks.step3.desc` | Récupérez votre document traduit avec un formatage identique à l'original. | Get your translated document with formatting identical to the original. | ### 4.3 Refonte de la section "Why Us" existante La section actuelle ("Why Us") se concentre sur la préservation du format. Elle doit intégrer l'IA comme dimension : Ajouter 2 cartes aux 6 existantes : | Carte | Icône | Clé i18n | |---|---|---| | Traduction IA contextuelle | `Brain` | `landing.why.aiContext.title` / `landing.why.aiContext.desc` | | Glossaires personnalisés | `BookOpen` | `landing.why.glossary.title` / `landing.why.glossary.desc` | Passer de 6 à 8 cartes, disposées en 2 lignes de 4 sur desktop, 4+4 sur tablette, colonne sur mobile. --- ## 5. Phase 3 — Freemium IA & Conversion (P1) ### 5.1 Visibilité du Provider Selector pour tous les utilisateurs **Problème actuel** : `translate/page.tsx` ligne 339 : `{config.isPro && ()}` — le sélecteur est complètement masqué pour les utilisateurs Free. **Solution** : Afficher le Provider Selector pour tous les utilisateurs avec les providers LLM en état "verrouillé" : ``` ┌─ Provider ──────────────────────────────────┐ │ ○ Google Traduction — 130+ langues │ │ ○ DeepL — Haute qualité │ │ │ │ ── ✨ AI · Context-Aware ─── PRO ── │ │ │ │ 🔒 DeepSeek V3 — Contexte + Glossaire │ │ 🔒 Claude 3.5 Haiku — Haute précision │ │ │ │ → Débloquer l'IA — Essai gratuit │ └──────────────────────────────────────────────┘ ``` **Critères d'acceptation** : - Les providers "classic" sont utilisables par tous - Les providers LLM sont visibles mais grisés avec une icône 🔒 - Un CTA "Débloquer l'IA" apparaît sous les providers verrouillés - Le CTA mène vers la page pricing avec ancre sur le plan Pro - L'utilisateur Free peut toujours traduire avec les providers classiques ### 5.2 Quota de traductions IA gratuites **Règle** : Chaque utilisateur Free dispose de **5 crédits IA** par mois. #### 5.2.1 Backend — Compteur de crédits - Ajouter un champ `ai_credits_used` et `ai_credits_limit` dans la table utilisateur - Free : `ai_credits_limit = 5` par mois (reset au 1er de chaque mois) - Starter : `ai_credits_limit = 0` (pas d'IA) - Pro : `ai_credits_limit = -1` (illimité) - Business : `ai_credits_limit = -1` (illimité) #### 5.2.2 Endpoint API ``` GET /api/v1/auth/me ``` Ajouter dans la réponse : ```json { "ai_credits_used": 2, "ai_credits_limit": 5, "ai_credits_remaining": 3 } ``` ``` POST /api/v1/translate ``` Si l'utilisateur sélectionne un provider LLM et `ai_credits_remaining <= 0`, retourner : ```json { "error": "ai_credits_exhausted", "message": "Vous avez utilisé vos 5 traductions IA gratuites ce mois-ci. Passez au plan Pro pour un accès illimité.", "upgrade_url": "/pricing" } ``` #### 5.2.3 Frontend — Affichage du compteur Dans le Provider Selector, quand un utilisateur Free a des crédits IA restants : ``` ✨ AI · Context-Aware — 3/5 essais gratuits ce mois-ci ``` Quand les crédits sont épuisés : ``` ✨ AI · Context-Aware — Essais épuisés → Voir les plans ``` ### 5.3 Page de démo interactive (Mini-Playground) **Emplacement** : Landing page, optionnel, section dédiée après la comparaison IA. #### 5.3.1 Fonctionnement L'utilisateur saisit une phrase technique (ou choisit un exemple prédéfini) et voit en temps réel la différence entre Google Translate et l'IA avec glossaire. **Exemples prédéfinis** : - "La batterie de chauffe est raccordée sur la CTA n°3" (HVAC) - "Le serveur proxy reverse les requêtes vers le load balancer" (IT) - "Le tribunal d'instance a prononcé la résiliation du bail" (Legal) **Backend** : Endpoint dédié sans authentification : ``` POST /api/v1/demo/translate { "text": "La batterie de chauffe est raccordée sur la CTA", "source_lang": "fr", "target_lang": "en" } ``` Réponse : ```json { "google": "The heating battery is connected on the CTA", "ai": "The heating coil is connected to the AHU", "glossary_applied": ["batterie=coil", "CTA=AHU"] } ``` **Rate limiting** : Maximum 10 requêtes par IP par heure pour éviter l'abus. **Critères d'acceptation** : - Fonctionne sans inscription - Affiche les deux résultats côte à côte - Surligne les termes où le glossaire a été appliqué - 3 exemples prédéfinis cliquables - Champ libre pour saisie personnalisée - Responsive mobile (résultats empilés) --- ## 6. Phase 4 — Enrichissement Landing & Social Proof (P2) ### 6.1 Section Preuve Sociale **Emplacement** : Après "How it works", avant le pricing. #### 6.1.1 Éléments - **Compteur animé** : "X documents traduits ce mois-ci" (données réelles depuis l'admin dashboard) - **Logos clients** (si disponibles) ou "Utilisé par des équipes dans X pays" - **3 témoignages** (citations fictives mais réalistes en attendant de vrais retours) : | Personne | Contexte | Citation | |---|---|---| | Marie D., Responsable CVC | "Nos documents techniques HVAC étaient toujours mal traduits. Avec les glossaires, c'est comme avoir un traducteur spécialisé." | | Thomas K., DSI | "L'API s'est intégrée en une heure. 200 documents par mois, zéro retouche de mise en page." | | Sophie L., Cabinet juridique | "Les contrats multilingues nécessitaient 2h de reformatage. Maintenant, c'est immédiat." | #### 6.1.2 Clés i18n | Clé | FR | |---|---| | `landing.social.title` | Ils traduisent plus intelligemment | | `landing.social.subtitle` | Des professionnels dans 12 pays font confiance à Office Translator | | `landing.social.documentsCount` | documents traduits ce mois-ci | ### 6.2 FAQ sur la Landing Ajouter une section FAQ directement sur la landing page (pas seulement sur /pricing). Questions prioritaires : 1. "Quelle est la différence entre traduction classique et IA ?" 2. "Mon format sera-t-il vraiment préservé ?" 3. "Mes documents sont-ils sécurisés ?" 4. "Puis-je utiliser mes propres termes techniques ?" 5. "Quels formats de fichier sont supportés ?" --- ## 7. Phase 5 — Nettoyage technique (P3) ### 7.1 Suppression des composants legacy Les fichiers suivants semblent être d'anciennes versions de la landing page, redondants avec `landing-page.tsx` : - `components/landing/hero-section.tsx` — supprimer (le hero est dans `landing-page.tsx`) - `components/landing/features-section.tsx` — supprimer (la section features est dans `landing-page.tsx`) **Action** : Vérifier qu'aucun import ne référence ces fichiers, puis supprimer. ### 7.2 Vérification des imports Avant suppression, vérifier avec `grep` qu'aucun composant n'importe `HeroSection` ou `FeaturesSection`. ### 7.3 Audit des clés i18n orphelines Après la Phase 1, certaines clés i18n pourraient ne plus être utilisées. Faire un passage pour identifier et nettoyer les clés mortes. --- ## 8. Matrice de Dépendances ``` Phase 1 (i18n + métriques) ├── Bloque rien, mais tout le reste bénéficie d'une base propre │ Phase 2 (Landing IA) ├── Dépend de Phase 1 pour les clés i18n de la landing │ Phase 3 (Freemium IA) ├── Dépend partiellement de Phase 2 (CTA "Débloquer l'IA" vers pricing) ├── Backend indépendant (compteur crédits) ├── Mini-playground peut être parallélisé │ Phase 4 (Social proof) ├── Indépendant des autres phases ├── Peut être fait en parallèle │ Phase 5 (Nettoyage) └── Faire en dernier, une fois que tout est stable ``` ## 9. Estimation d'Effort | Phase | Effort frontend | Effort backend | Complexité | |---|---|---|---| | Phase 1 — i18n + métriques | 2-3 jours | 1 jour (endpoint progress enrichi) | Moyenne | | Phase 2 — Landing IA | 2 jours | 0 | Faible | | Phase 3 — Freemium IA | 1 jour | 2 jours (crédits + demo endpoint) | Moyenne | | Phase 3 — Mini-playground | 1.5 jours | 0.5 jour | Moyenne | | Phase 4 — Social proof | 1 jour | 0 | Faible | | Phase 5 — Nettoyage | 0.5 jour | 0 | Faible | | **Total** | **~8 jours** | **~3.5 jours** | | ## 10. Risques et Mitigations | Risque | Probabilité | Impact | Mitigation | |---|---|---|---| | L'endpoint de progression ne retourne pas les segments | Moyenne | Faible | Afficher "—" au lieu de chiffres faux, et itérer côté backend | | Les 5 crédits IA Free génèrent un trafic excessif sur les LLM | Faible | Moyenne | Rate limiting strict par IP +监控 des coûts LLM | | Les témoignages fictifs posent un problème éthique | Faible | Moyenne | Les marquer comme "exemples illustratifs" ou les remplacer par des beta-testeurs réels | | Traduction de 13 locales pour toutes les nouvelles clés | Élevée | Faible | Commencer par EN + FR, ajouter les autres locales progressivement | --- ## 11. Critères de Succès Globaux Le cahier des charges sera considéré comme rempli quand : 1. ✅ Aucun texte hardcodé visible dans les pages translate, services, landing 2. ✅ Les métriques de traduction reflètent la réalité du document en cours 3. ✅ La landing page comporte une section IA Engine avec comparaison visuelle 4. ✅ La landing page comporte une section "Comment ça marche" 5. ✅ Le Provider Selector est visible pour les utilisateurs Free (avec LLM verrouillé) 6. ✅ Les utilisateurs Free disposent de 5 crédits IA mensuels 7. ✅ Le score de confiance fictif est remplacé par un indicateur qualitatif réel 8. ✅ Les composants legacy sont supprimés