Skip to content
··11 min de lecture

J'ai ajouté 5 langues à DIALØGUE en 48 heures

J'ai créé des documents de planification qui ont appris à Claude Code comment localiser—pas seulement traduire—puis je l'ai regardé exécuter en parallèle sur 5 langues, transformant des phrases littérales en texte qui sonne natif.

Il y a quelques jours, un utilisateur m'a demandé si DIALØGUE supportait l'espagnol.

Ce n'était pas le cas.

48 heures plus tard, il supporte cinq langues — l'espagnol, le vietnamien, le japonais, le coréen et le chinois mandarin. Pas des boutons d'interface traduits à la va-vite. Une localisation native complète. Des podcasts qui semblent avoir été conçus pour chaque marché.

Cinq langues en 48 heures, ça ressemble à une équipe embauchée ou à des nuits blanches. Il n'en était rien.

J'ai donné une direction de haut niveau à Claude Code. Il a rédigé les documents de planification, puis les a exécutés — en lançant souvent des agents parallèles sur différents fichiers simultanément.

---

Le secret : planifier une fois, exécuter vite

Voici ce qui est intéressant : je n'ai pas rédigé les documents de planification. Claude Code l'a fait — avec mes orientations.

J'ai décrit ce que je voulais : "Crée un guide de style de localisation qui explique comment traduire naturellement, pas littéralement. Inclus des exemples pour l'espagnol, le vietnamien, le japonais, le coréen et le chinois. Couvre les niveaux de formalité et le contexte culturel."

Claude Code a produit un guide de style de plus de 1 000 lignes, une checklist complète et un playbook de pipeline backend. Puis il a suivi ses propres plans pour exécuter le travail.

1. Le guide de style

Pas un glossaire de traduction — un document de philosophie. Il explique *comment* localiser, avec des exemples avant/après pour chaque langue.

Exemple pour l'espagnol :

| Anglais | Littéral (faux) | Naturel (juste) |

|---------|-----------------|-----------------|

| "Ideas, Produced" | "Ideas, Producidas" | "De la Idea, al Podcast" |

| "Researched, Not Recycled" | "Investigado, No Reciclado" | "Contenido Original, Sin Copiar" |

| "You Direct" | "Tú Diriges" | "Tú Decides" |

Les traductions littérales sont grammaticalement correctes mais sonnent comme Google Traduction. Les versions naturelles capturent *l'intention* — c'est ce qu'un marketeur hispanophone écrirait vraiment.

Le guide couvre les niveaux de formalité (le japonais utilise la forme です/ます, le coréen utilise 합쇼체), le contexte culturel, les erreurs courantes à éviter. Quand Claude Code traduit, il suit ces principes — ceux qu'il a lui-même rédigés — automatiquement.

2. La checklist de localisation

Une checklist complète de chaque fichier à modifier pour une nouvelle langue :

Obligatoire (indispensable) :

- Frontend : `messages/{locale}.json` (~2 200 clés)

- Backend : `locales/{locale}.json` (~82 clés)

- Utilitaires de langue : 3 fonctions dans `language_utils.py`

- Génération vocale : 1 fonction dans `gemini_voice_instructions.py`

- Aperçu vocal : 7 phrases localisées

- Modération de contenu : mots-clés + prompts

- Tests de fumée : à ajouter à la matrice de tests

Optionnel (qualité améliorée) :

- Profils d'hôte/audience par style

- Templates de prompts localisés

- Instructions vocales par style

Cette checklist garantit qu'on ne rate rien. Claude Code la parcourt systématiquement.

3. Le playbook backend

Documente exactement comment la génération de podcasts gère la langue :

- Comment la génération de plan utilise Gemini 3 Flash avec les instructions de langue

- Comment la génération de dialogue utilise Claude Sonnet 4.5 avec le contexte culturel

- Comment la génération vocale utilise Gemini TTS avec des instructions propres à chaque langue

Avec ces trois documents en place, ajouter une nouvelle langue devient mécanique. Claude Code lit la checklist, suit le guide de style et met à jour les fichiers selon le playbook.

---

Le problème avec "traduis juste ça"

Je dois avouer que mon premier réflexe était de tout passer par une API de traduction et d'en rester là. "Create Podcast" devient "Crear Podcast" et on passe à autre chose, non ?

Cette approche produit des résultats médiocres. Je l'ai appris à la dure en grandissant entre le vietnamien et l'anglais — la traduction littéraire tue l'âme de ce qu'on essaie de dire.

La traduction préserve les mots, la localisation préserve le sens. Le guide de style encode cette différence.

| Langue | Traduction littérale | Localisation native |

|--------|---------------------|---------------------|

| Vietnamien | "Ý tưởng, Được Sản Xuất" | "Từ Ý Tưởng → Đến Podcast" |

| Japonais | "アイデア、制作された" | "アイデアを、カタチに" (Des idées en forme) |

| Coréen | "아이디어, 제작됨" | "아이디어를, 현실로" (Des idées en réalité) |

| Espagnol | "Ideas, Producidas" | "De la Idea, al Podcast" |

| Chinois | "想法,已制作" | "从想法,到播客" |

Chaque langue a exigé ce niveau d'attention. Chaque bouton, chaque message d'erreur, chaque contenu marketing.

Et ce n'est que l'interface. La génération réelle de podcasts est encore plus exigeante.

---

Les podcasts ont besoin d'hôtes natifs

Voici quelque chose que je n'avais pas anticipé : les noms des hôtes comptent. Vraiment beaucoup.

Dans la version anglaise, les hôtes par défaut s'appellent Alex et Maya. Génériques, sans relief, ça fonctionne.

Mais si tu génères un podcast en vietnamien et que les hôtes s'appellent encore Alex et Maya ? Ça sonne faux. En tant que Vietnamien, je peux te dire — ça ressemble à un mauvais doublage d'une émission américaine :D

Donc chaque langue a obtenu des noms d'hôtes natifs :

| Langue | Hôte 1 | Hôte 2 |

|--------|--------|--------|

| Anglais | Alex | Maya |

| Vietnamien | Minh | Lan |

| Japonais | 太郎 (Tarō) | 花子 (Hanako) |

| Coréen | 민준 (Minjun) | 수진 (Sujin) |

| Espagnol | Carlos | María |

| Chinois | 明辉 | 雅琴 |

Mais les noms seuls ne suffisent pas. L'IA doit comprendre le contexte culturel.

Un podcast tech au Japon a des normes conversationnelles différentes de celles aux États-Unis. Le niveau de formalité, la façon d'exprimer un désaccord, le rythme des échanges — tout est différent.

J'ai donc créé des instructions de prompt IA spécifiques à chaque langue. Les instructions en vietnamien précisent "bạn" (le "tu" informel mais respectueux). Les instructions en japonais précisent la forme です/ます (polie mais amicale). Les instructions en coréen précisent 합쇼체 (formel poli).

Ce genre de chose ne s'automatise pas. Avec mes années de travail sur les marchés Asie-Pacifique, ces schémas de communication me sont devenus intuitifs — l'astuce consistait à encoder cette connaissance culturelle dans des prompts qu'une IA pouvait suivre. Mais une fois encodés, Claude Code les applique de manière cohérente sur des milliers de chaînes de texte.

---

La sélection de modèles IA qui fonctionne vraiment

C'est là que ça devient intéressant d'un point de vue technique.

DIALØGUE utilise trois modèles d'IA différents pour trois tâches différentes. Non pas parce que je voulais de la complexité, mais parce que chaque modèle est véritablement meilleur dans son domaine spécifique.

Tâche 1 : Recherche et plan → Gemini 3 Flash

Quand un utilisateur saisit un sujet, la première étape est la recherche. L'IA doit :

1. Chercher des informations récentes sur le web

2. Synthétiser les résultats dans un plan structuré

3. Citer les sources correctement

Cela nécessite un ancrage (recherche web en temps réel) ET une sortie structurée (conformité au schéma JSON).

Voici le problème : la plupart des modèles ne peuvent pas faire les deux simultanément. Gemini 2.5 Flash supporte l'ancrage. Il supporte la sortie structurée. Mais pas ensemble. Il faut choisir.

Gemini 3 Flash Preview est le seul modèle que j'ai trouvé qui supporte les deux fonctionnalités en même temps. Il gère donc la génération de plan.

```python
GEMINI_MODEL = "gemini-3-flash-preview"

# Capacité clé :
GEMINI_MODEL_CONFIGS = \{
    "gemini-3-flash-preview": {
        "supports_grounding": True,
        "supports_structured_output": True,
        "supports_grounding_with_structured_output": True,  # C'est la clé
    \}
}
```

Le plan revient en environ 60 secondes avec de vraies sources, correctement structurées.

Tâche 2 : Génération de dialogue → Claude Sonnet 4.5

Une fois que l'utilisateur a approuvé le plan, l'IA rédige le script complet — chaque mot que les deux hôtes prononceront.

C'est de l'écriture créative. Il faut de la personnalité, un rythme naturel, le feeling d'une vraie conversation.

J'ai testé cela avec plusieurs modèles. Le dialogue de Claude sonne constamment plus humain. Les échanges semblent authentiques. Les hôtes se coupent la parole naturellement. Ils rebondissent sur les arguments de l'autre.

C'est subjectif, mais après avoir généré des centaines de podcasts de test, la différence est notable. Claude Sonnet 4.5 gère la génération de dialogue.

```python
ANTHROPIC_MODEL = "claude-sonnet-4-5-20250929"
```

Tâche 3 : Génération audio → Gemini 2.5 Flash TTS

Enfin, le script doit devenir audio. Deux voix, un bon rythme, une expression émotionnelle.

Gemini 2.5 Flash TTS propose 30 voix distinctes avec support multi-locuteur. Tu peux avoir Charon (informatif, masculin) et Kore (ferme, féminin) dans le même fichier audio, passant naturellement d'un locuteur à l'autre.

La qualité est suffisamment bonne pour que les utilisateurs demandent parfois si ce sont de vrais acteurs vocaux.

```python
# Synthèse multi-locuteur avec Gemini TTS
response = client.models.generate_content(
    model="gemini-2.5-flash-preview-tts",
    contents=transcript,
    config=types.GenerateContentConfig(
        response_modalities=["AUDIO"],
        speech_config=types.SpeechConfig(
            multi_speaker_voice_config=types.MultiSpeakerVoiceConfig(
                speaker_voice_configs=speaker_configs
            )
        )
    )
)
```

Le pipeline

Voici donc le flux complet :

```
Saisie utilisateur
    ↓
[Gemini 3 Flash] Recherche + Plan structuré (~60 sec)
    ↓
Révision et retour utilisateur
    ↓
[Claude Sonnet 4.5] Script de dialogue complet (~2-3 min)
    ↓
Révision et édition utilisateur
    ↓
[Gemini 2.5 Flash TTS] Audio multi-locuteur (~3-5 min)
    ↓
Podcast terminé
```

Chaque modèle fait ce qu'il fait le mieux. Le temps total de génération est d'environ 8-10 minutes pour un podcast de 15 à 30 minutes.

---

Une fonctionnalité qui m'a surpris

Les utilisateurs ont demandé quelque chose que je n'avais pas envisagé : générer des podcasts dans une langue différente de leur interface.

Un utilisateur vietnamien peut très bien naviguer dans l'app en vietnamien mais vouloir créer un podcast en anglais pour un public international. Ou un marketeur hispanophone peut vouloir tester du contenu en japonais.

J'ai donc ajouté un sélecteur de langue pour le podcast. Ton interface peut être en anglais pendant que tu génères un podcast en mandarin. Les hôtes auront des noms chinois (明辉 et 雅琴), le dialogue suivra les schémas conversationnels chinois, et l'audio utilisera des voix appropriées.

C'est une petite fonctionnalité, mais elle élargit considérablement ce que les utilisateurs peuvent faire.

---

Les agents parallèles : le multiplicateur de force

La vraie vitesse venait des agents parallèles. La checklist le note explicitement :

> "Lancer des agents parallèles pour les fichiers backend - Les fichiers backend sont plus petits et peuvent être traités en parallèle (language_utils.py, content_moderation.py, gemini_voice_instructions.py, locales/{locale}.json)."

Quand je disais "Ajoute le support coréen", Claude Code lançait plusieurs agents :

- Un agent mettant à jour le fichier de traduction frontend

- Un autre ajoutant les cas coréens dans `language_utils.py`

- Un autre mettant à jour `gemini_voice_instructions.py`

- Un autre ajoutant le coréen dans `content_moderation.py`

Tous tournant simultanément. Quand ils terminaient, Claude Code fusionnait les changements et lançait les tests.

C'est pourquoi la checklist distingue les fichiers "Obligatoires" des fichiers "Optionnels" — pour que Claude Code sache ce qu'il peut paralléliser par rapport à ce qui peut attendre.

Pour le fichier de traduction frontend (~2 200 clés), la checklist précise une stratégie de découpage :

- Partie 1 : `common`, `nav`, `bottomNav` (~110 clés)

- Partie 2 : `homepage`, `auth` (~180 clés)

- Partie 3 : `dashboard`, `create` (~330 clés)

- Et ainsi de suite...

Cela évite les problèmes de limite de tokens et permet à Claude Code de traduire espace de noms par espace de noms, en vérifiant chacun par rapport au guide de style.

La portée :

- 5 langues ajoutées

- ~2 500 chaînes de traduction au total par langue

- 10+ templates de prompts IA par langue

- 1 podcast de démonstration généré par langue

- Plusieurs agents parallèles par langue

L'insight clé : je n'ai pas écrit de code. Je n'ai pas rédigé de plans. J'ai donné une direction, revu le résultat, et laissé Claude Code s'occuper du reste — souvent en parallèle. Ça me laisse encore un peu bouche bée :P

---

Et maintenant ?

Les six langues couvrent environ 2 milliards d'utilisateurs potentiels. C'est une portée significative.

Mais je pense déjà à ce qui manque (le marketeur en moi ne s'arrête jamais) :

1. L'arabe — Le support de la mise en page de droite à gauche est complexe

2. Le hindi — Un marché immense, avec un alphabet différent

3. Le portugais — Le Brésil est un marché podcastique massif

4. Le français — L'expansion européenne

5. Le tagalog — Une forte communauté de créateurs philippins

Chacun nécessite le même niveau de soin. Localisation native, pas traduction. Prompts culturels, pas templates copiés. (Tout cela n'était possible que parce que j'avais reconstruit toute l'app en 14 jours avec une architecture propre.)

La bonne nouvelle : les documents de planification sont réutilisables. Ajouter la prochaine langue devrait être encore plus rapide. Et la localisation se répercute sur l'app iOS native que je construis maintenant — les 7 langues, avec le même backend Supabase.

---

Essaie toi-même

Je suis vraiment fier de la façon dont ça s'est terminé — surtout la localisation vietnamienne. Entendre un podcast qui semble avoir été fait pour un public vietnamien, pas traduit à leur intention, m'a touché d'une façon que je n'attendais pas.

DIALØGUE supporte maintenant :

- Anglais — L'original

- Vietnamien — Từ Ý Tưởng → Đến Podcast

- Japonais — アイデアを、カタチに

- Coréen — 아이디어를, 현실로

- Espagnol — De la Idea, al Podcast

- Chinois — 从想法,到播客

Crée un podcast dans ta langue →

L'interface suivra ta préférence choisie. Et souviens-toi — tu peux générer des podcasts dans n'importe laquelle de ces langues quel que soit ton paramètre d'interface.

Les nouveaux utilisateurs obtiennent 2 podcasts gratuits pour tester.

---

Les enseignements

En regardant en arrière, ce qui m'a le plus surpris, c'est à quel point mon background en publicité a compté. Des années d'adaptation de campagnes sur les marchés asiatiques m'ont appris que la localisation n'est jamais qu'une question de mots — c'est une question d'intuition culturelle. Je ne m'attendais pas à ce que ce soit la compétence la plus précieuse que j'apporterais à un projet de codage avec l'IA.

Pour les builders qui utilisent des assistants de codage IA :

1. Dirige, n'écris pas. Je n'ai pas rédigé les docs de planification — j'ai décrit ce que je voulais et Claude Code les a produits. Puis il a suivi ses propres plans. Ça semblait bizarre au début, comme déléguer à quelqu'un qui rédige aussi son propre brief. Mais ça fonctionne.

2. La structure permet la mise à l'échelle. Guides de style, checklists, playbooks — ce n'est plus seulement pour les humains. Je pense que c'est le plus grand déblocage : structure tes exigences pour qu'un agent IA puisse les exécuter systématiquement. (Mes années à rédiger des briefs marketing ont finalement porté leurs fruits d'une manière inattendue.)

3. Fais correspondre le modèle à la tâche. Je me trompe peut-être, mais je crois qu'aucun modèle n'est encore le meilleur dans tout. Pour DIALØGUE :

- Gemini 3 Flash pour la recherche structurée et ancrée

- Claude Sonnet 4.5 pour le dialogue naturel

- Gemini 2.5 Flash TTS pour l'audio multi-locuteur

4. Localise, ne traduis pas. Tes utilisateurs font la différence. Je ne peux pas insister assez là-dessus — en tant que quelqu'un qui a vécu dans trois pays et travaillé sur une douzaine de marchés, j'ai vu ce que la traduction bâclée fait à un produit. Encode la connaissance culturelle dans tes prompts et laisse l'IA l'appliquer de manière cohérente.

C'est tout de ma part sur ce sujet. Si tu construis quelque chose en multilingue — ou même si tu y penses — j'adorerais savoir comment tu aborde la localisation. Tu utilises l'IA pour ça ? Tu passes par la route de l'agence traditionnelle ? Tu es d'accord que le contexte culturel est la partie difficile, pas la traduction elle-même ? Dis-moi.

Cordialement,

Chandler

Continuer la lecture

Mon parcours
Me suivre
Langue
Preferences