> 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.

# Dubba till flera språk

> **Note**
>
> **Instruktionsguide** · Förutsätter att du har skapat ett dubbningsprojekt, enligt [snabbstarten för dubbning ](/docs/sv/eleven-api/guides/cookbooks/dubbing).

Ett enda projekt innehåller ett källtranskript, och du kan lägga till så många språkmål som du behöver. Varje språk genereras oberoende och har sin egen status och utdata, så du översätter källan en gång och skapar varje dubbning från den.

## Lägg till flera språk

Lägg till ett språkmål för varje språk du vill dubba till. Varje mål börjar i statusen `queued` och börjar genereras när projektet är `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 })
  )
);
```

Du kan också köa det första språket när du skapar projektet genom att skicka `target_language` till `project.create`. Lägg till ytterligare språk med `language.create` enligt ovan.

Språk anges som BCP-47-taggar, till exempel `es` eller `fr-CA`. Se [språk och dialekter som stöds](/docs/sv/overview/capabilities/dubbing#supported-languages) för alla godkända värden.

## Följ varje språk oberoende

Språk genereras parallellt och blir klara vid olika tidpunkter. Lista projektets språk för att kontrollera statusen för varje språk, i stället för att kontrollera dem ett i taget.

```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));
}
```

## Ladda ned varje färdig dubbning

När ett språk når `completed` innehåller dess `outputs.lossless_audio` en signerad nedladdnings-URL. Ladda ned varje fil och hoppa över språk som misslyckades.

```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`);
}
```

Signerade URL:er upphör att gälla ungefär en timme efter att de har utfärdats. Om en nedladdning misslyckas eftersom URL:en har gått ut hämtar du språket igen med `language.get` för att få en ny URL.

> **Tip**
>
> Om ett språk inte kan genereras lägger du till det igen med `language.create` i samma projekt i
> stället för att skapa ett nytt projekt. Projektet och dess transkript kan återanvändas, så bara det
> misslyckade språket genereras om.