> This is a page from the ElevenLabs documentation. For a complete page index, fetch https://elevenlabs.io/docs/llms.txt. For the full documentation in a single file, fetch https://elevenlabs.io/docs/llms-full.txt.

# Doubler dans plusieurs langues

> **Note**
>
> **Guide pratique** · Suppose que vous avez créé un projet de doublage, comme indiqué dans le [guide de démarrage rapide du doublage](/docs/fr/eleven-api/guides/cookbooks/dubbing).

Un même projet contient une transcription source et vous pouvez ajouter autant de cibles de langue que nécessaire. Chaque langue est générée indépendamment et possède son propre état et sa propre sortie. Vous traduisez ainsi la source une seule fois et produisez chaque doublage à partir de celle-ci.

## Ajouter plusieurs langues

Ajoutez une cible de langue pour chaque langue dans laquelle vous souhaitez doubler. Chacune commence avec le statut `queued` et débute sa génération lorsque le projet est `ready`.

```python
import os
from dotenv import load_dotenv
from elevenlabs.client import ElevenLabs

load_dotenv()

elevenlabs = ElevenLabs(api_key=os.getenv("ELEVENLABS_API_KEY"))

project_id = "proj_1601kwkyxp0hfzvtmyxwqxx6mcy3"
target_languages = ["es", "fr", "de", "ja"]

languages = [
    elevenlabs.dubbing.project.language.create(project_id, target_language=lang)
    for lang in target_languages
]
```

```typescript
import { ElevenLabsClient } from "@elevenlabs/elevenlabs-js";
import "dotenv/config";

const elevenlabs = new ElevenLabsClient();

const projectId = "proj_1601kwkyxp0hfzvtmyxwqxx6mcy3";
const targetLanguages = ["es", "fr", "de", "ja"];

const languages = await Promise.all(
  targetLanguages.map((lang) =>
    elevenlabs.dubbing.project.language.create(projectId, { targetLanguage: lang })
  )
);
```

Vous pouvez également mettre la première langue en file d’attente lors de la création du projet en transmettant `target_language` à `project.create`. Ajoutez les langues supplémentaires avec `language.create`, comme indiqué ci-dessus.

Les langues sont indiquées sous forme de balises BCP-47, par exemple `es` ou `fr-CA`. Consultez les [langues et dialectes pris en charge](/docs/fr/overview/capabilities/dubbing#supported-languages) pour connaître toutes les valeurs acceptées.

## Suivre chaque langue indépendamment

Les langues sont générées en parallèle et se terminent à des moments différents. Listez les langues du projet pour vérifier l’état de chacune, plutôt que de les interroger une par une.

```python
import time

while True:
    result = elevenlabs.dubbing.project.language.list(project_id)
    pending = [l for l in result.languages if l.status in ("queued", "processing")]
    if not pending:
        break
    print(f"{len(pending)} language(s) still generating...")
    time.sleep(5)
```

```typescript
while (true) {
  const result = await elevenlabs.dubbing.project.language.list(projectId);
  const pending = result.languages.filter(
    (l) => l.status === "queued" || l.status === "processing"
  );
  if (pending.length === 0) break;
  console.log(`${pending.length} language(s) still generating...`);
  await new Promise((resolve) => setTimeout(resolve, 5000));
}
```

## Télécharger chaque doublage terminé

Lorsqu’une langue atteint l’état `completed`, son `outputs.lossless_audio` contient une URL de téléchargement signée. Téléchargez-les toutes, en ignorant les langues ayant échoué.

```python
import requests

result = elevenlabs.dubbing.project.language.list(project_id)
for language in result.languages:
    if language.status != "completed":
        print(f"Skipping {language.target_language}: {language.status}")
        continue
    audio = requests.get(language.outputs.lossless_audio)
    with open(f"dubbed_{language.target_language}.wav", "wb") as f:
        f.write(audio.content)
    print(f"Saved dubbed_{language.target_language}.wav")
```

```typescript
import { writeFile } from "fs/promises";

const result = await elevenlabs.dubbing.project.language.list(projectId);
for (const language of result.languages) {
  if (language.status !== "completed") {
    console.log(`Skipping ${language.targetLanguage}: ${language.status}`);
    continue;
  }
  const response = await fetch(language.outputs!.losslessAudio!);
  const buffer = Buffer.from(await response.arrayBuffer());
  await writeFile(`dubbed_${language.targetLanguage}.wav`, buffer);
  console.log(`Saved dubbed_${language.targetLanguage}.wav`);
}
```

Les URL signées expirent environ une heure après leur émission. Si un téléchargement échoue parce que l’URL a expiré, récupérez à nouveau la langue avec `language.get` afin d’obtenir une nouvelle URL.

> **Tip**
>
> Si la génération d’une langue échoue, ajoutez-la de nouveau avec `language.create` dans le même projet
> plutôt que de créer un nouveau projet. Le projet et sa transcription sont réutilisables ; seule la
> langue ayant échoué est régénérée.