# 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 && (<ProviderSelector ... />)}` — 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
