# API des traductions

> Les points de terminaison de traductions renvoient chaque version linguistique d'une fiche en une réponse : titre ou nom, résumé, slogan et site pour les films et séries, nom et résumé pour les épisodes. Chaque ligne porte iso_639_1, iso_3166_1 et english_name. Servez-vous-en pour les langues que language ne sert pas ou pour une chaîne de repli.

## Point de terminaison

`GET /3/movie/{movie_id}/translations`

```bash
curl "https://api.amodb.dev/3/movie/550/translations" \
  -H "Authorization: Bearer $AMODB_KEY"
```

Réponse:

```json
{
  "id": 550,
  "translations": [
    {
      "iso_3166_1": "AR",
      "iso_639_1": "ar",
      "name": "العربية",
      "english_name": "Arabic",
      "data": {
        "title": "نادي القتال",
        "overview": "يعيش موظف مكتبي يعاني من الأرق والملل حياة روتينية فارغة، إلى أن يلتقي بالرجل الغامض تايلر ديردن، الذي يختلف عنه تمامًا ويؤمن بأن التحرر من قيود المجتمع يبدأ برفض الحياة التقليدية. تنشأ بينهما صداقة غريبة تقودهما إلى تأسيس نادٍ سري يتجمع في...",
        "homepage": "",
        "tagline": "نادي القتال هو نادي يوجد في العقل الباطن لكل واحد منا !",
        "runtime": 0
      }
    },
    {
      "iso_3166_1": "AZ",
      "iso_639_1": "az",
      "name": "Azərbaycan",
      "english_name": "Azerbaijani",
      "data": {
        "title": "Döyüş Klubu",
        "overview": "Xəyalları olmayan bir gənc yuxusuzluğa qarşı mübarizə aparır, bəlkə də boz və gündəlik həyatı ilə cansıxıcılığının nəticəsidir. Təyyarə gəzintisində o, çox xüsusi bir fəlsəfəyə sahib olan xarizmatik sabun satıcısı Tyler Durden ilə tanış olu...",
        "homepage": "",
        "tagline": "",
        "runtime": 0
      }
    },
    {
      "iso_3166_1": "BY",
      "iso_639_1": "be",
      "name": "Беларуская",
      "english_name": "Belarusian",
      "data": {
        "title": "Байцоўскі клуб",
        "overview": "A ticking-time-bomb insomniac and a slippery soap salesman channel primal male aggression into a shocking new form of therapy. Their concept catches on, with underground \"fight clubs\" forming in every town, until an eccentric gets in the wa...",
        "homepage": "",
        "tagline": "",
        "runtime": 0
      }
    }
  ]
}
```

## Obtenir les traductions d'un film

`GET /3/movie/{movie_id}/translations` renvoie une ligne par langue qui a du texte pour le film. Chaque ligne contient un objet `data` avec les champs traduits. L'appel n'accepte aucun paramètre de langue, car tout l'intérêt est de voir toutes les langues à la fois.

L'exemple trouve la ligne russe et affiche son titre et le début de son résumé.

```bash
curl -s "https://api.amodb.dev/3/movie/550/translations" \
  -H "Authorization: Bearer $AMODB_KEY"
```

```js
const url = 'https://api.amodb.dev/3/movie/550/translations';
const res = await fetch(url, { headers: { Authorization: `Bearer ${process.env.AMODB_KEY}` } });
if (!res.ok) throw new Error(`amodb returned ${res.status}`);
const { translations } = await res.json();
const ru = translations.find((t) => t.iso_639_1 === 'ru');
console.log(ru ? `${ru.data.title}: ${ru.data.overview.slice(0, 80)}` : 'no Russian row');
```

```python
import os
import requests

r = requests.get(
    "https://api.amodb.dev/3/movie/550/translations",
    headers={"Authorization": f"Bearer {os.environ['AMODB_KEY']}"},
    timeout=10,
)
r.raise_for_status()
ru = next((t for t in r.json()["translations"] if t["iso_639_1"] == "ru"), None)
print(f"{ru['data']['title']}: {ru['data']['overview'][:80]}" if ru else "no Russian row")
```

```php
<?php
$ch = curl_init('https://api.amodb.dev/3/movie/550/translations');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_TIMEOUT => 10,
    CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . getenv('AMODB_KEY')],
]);
$body = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
if ($status !== 200) {
    throw new RuntimeException("amodb returned $status");
}
foreach (json_decode($body, true)['translations'] as $t) {
    if ($t['iso_639_1'] === 'ru') {
        echo $t['data']['title'], ': ', mb_substr($t['data']['overview'], 0, 80), PHP_EOL;
        exit;
    }
}
echo 'no Russian row', PHP_EOL;
```

```go
package main

import (
	"encoding/json"
	"fmt"
	"net/http"
	"os"
	"time"
)

type Translations struct {
	Translations []struct {
		ISO6391 string `json:"iso_639_1"`
		Data    struct {
			Title    string `json:"title"`
			Overview string `json:"overview"`
		} `json:"data"`
	} `json:"translations"`
}

func main() {
	req, _ := http.NewRequest("GET", "https://api.amodb.dev/3/movie/550/translations", nil)
	req.Header.Set("Authorization", "Bearer "+os.Getenv("AMODB_KEY"))
	client := &http.Client{Timeout: 10 * time.Second}
	res, err := client.Do(req)
	if err != nil {
		panic(err)
	}
	defer res.Body.Close()
	if res.StatusCode != http.StatusOK {
		panic(res.Status)
	}
	var t Translations
	if err := json.NewDecoder(res.Body).Decode(&t); err != nil {
		panic(err)
	}
	for _, row := range t.Translations {
		if row.ISO6391 == "ru" {
			text := []rune(row.Data.Overview)
			if len(text) > 80 {
				text = text[:80]
			}
			fmt.Printf("%s: %s\n", row.Data.Title, string(text))
			return
		}
	}
	fmt.Println("no Russian row")
}
```

### Paramètres

| Paramètre  | Dans    | Requis        | Description                                                  |
| ---------- | ------- | ------------- | ------------------------------------------------------------ |
| `movie_id` | chemin  | oui           | Identifiant numérique du film, par exemple `550`.            |
| `api_key`  | requête | l'un des deux | Votre clé. Utilisez-la ou l'en-tête `Authorization: Bearer`. |

### Champs de la réponse

| Champ                         | Type    | Remarques                                                                                                                                                         |
| ----------------------------- | ------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `id`                          | entier  | Identifiant du film.                                                                                                                                              |
| `translations`                | tableau | Une ligne par langue qui a du texte, triée par code de langue. Le film 550 renvoie 50 lignes.                                                                     |
| `translations[].iso_3166_1`   | chaîne  | Code pays qui accompagne la langue, comme `US` pour `en` ou `BR` pour `pt`. Pour les langues en dehors des 14 servies, il répète le code de langue en majuscules. |
| `translations[].iso_639_1`    | chaîne  | Code de langue comme `ru` ou `pt`. Unique dans le tableau.                                                                                                        |
| `translations[].name`         | chaîne  | La langue écrite dans cette langue.                                                                                                                               |
| `translations[].english_name` | chaîne  | Le nom de la langue en anglais.                                                                                                                                   |
| `translations[].data`         | objet   | Les champs traduits. Les clés dépendent de la ressource, voir le tableau ci-dessous.                                                                              |

### Exemple de réponse

Deux des 50 lignes sont montrées, et les résumés sont coupés.

```json
{
  "id": 550,
  "translations": [
    {
      "iso_3166_1": "US",
      "iso_639_1": "en",
      "name": "English",
      "english_name": "English",
      "data": {
        "title": "Fight Club",
        "overview": "A ticking-time-bomb insomniac and a slippery soap salesman channel primal male aggression into a shocking new form of therapy....",
        "homepage": "https://www.20thcenturystudios.com/movies/fight-club",
        "tagline": "Mischief. Mayhem. Soap.",
        "runtime": 0
      }
    },
    {
      "iso_3166_1": "RU",
      "iso_639_1": "ru",
      "name": "Русский",
      "english_name": "Russian",
      "data": {
        "title": "Бойцовский клуб",
        "overview": "Сотрудник страховой компании страдает хронической бессонницей и отчаянно пытается вырваться из мучительно скучной жизни. Однажд...",
        "homepage": "https://www.20thcenturystudios.com/movies/fight-club",
        "tagline": "«Интриги. Хаос. Мыло»",
        "runtime": 0
      }
    }
  ]
}
```

Dans amodb, `runtime` vaut toujours 0 dans une ligne de traduction. Lisez la durée dans la fiche de [détails du film](https://amodb.dev/fr/movies/).

## Points de terminaison de traductions et leurs clés de données

Tous les chemins partagent la base `https://api.amodb.dev/3`. Chacun renvoie `id` et un tableau `translations` de la forme de ligne ci-dessus. Seules les clés à l'intérieur de `data` changent.

| Méthode et chemin                                                                  | Clés de `data`                                                     |
| ---------------------------------------------------------------------------------- | ------------------------------------------------------------------ |
| `GET /movie/{movie_id}/translations`                                               | `title`, `overview`, `homepage`, `tagline`, `runtime` (toujours 0) |
| `GET /tv/{series_id}/translations`                                                 | `name`, `overview`, `homepage`, `tagline`                          |
| `GET /tv/{series_id}/season/{season_number}/translations`                          | aucune, le tableau est toujours vide                               |
| `GET /tv/{series_id}/season/{season_number}/episode/{episode_number}/translations` | `name`, `overview`                                                 |

Les fiches de séries listent à peu près autant de langues que les films. Les lignes d'épisodes ne couvrent que les langues servies qui ont du texte pour cet épisode, de 2 à 14 dans les échantillons vérifiés. Traitez une clé manquante comme une valeur vide, et ignorez les clés que vous ne connaissez pas. Voir [séries TV](https://amodb.dev/fr/tv-series/) pour les fiches parentes.

amodb ne propose pas de traductions pour les personnes ni pour les collections. La biographie d'une personne suit le paramètre `language` de l'appel de détails de la personne, et le résumé d'une collection est fourni tel que stocké.

## Se replier quand le texte manque

Un titre peut exister en 14 langues et avoir quand même un résumé vide dans celle que votre utilisateur a choisie. Parcourez une chaîne de langues, prenez la première valeur non vide et retenez de quelle langue elle vient.

```js
function pickText(translations, wanted, field) {
  for (const code of [...wanted, 'en']) {
    const row = translations.find((t) => t.iso_639_1 === code);
    const value = row?.data?.[field];
    if (value) return { code, value };
  }
  return null;
}

// Prefer Ukrainian, then Russian, then English.
// const hit = pickText(translations, ['uk', 'ru'], 'overview');
```

Pour une série, passez `'name'` comme champ au lieu de `'title'`. Signalez dans votre interface le texte issu d'une langue de repli, pour que l'utilisateur sache pourquoi une page ukrainienne affiche un synopsis en anglais.

## Translations ou paramètre language

| Besoin                                                     | À utiliser                                                |
| ---------------------------------------------------------- | --------------------------------------------------------- |
| Montrer une langue à un utilisateur                        | `language` sur l'appel de détails                         |
| Lister toutes les langues d'un titre dans un éditeur       | Ce point de terminaison                                   |
| Lire une langue que `language` ne sert pas, comme `ja`     | Ce point de terminaison, choisir la ligne par `iso_639_1` |
| Vérifier lesquelles des 14 langues servies ont du texte    | Ce point de terminaison, comparer `iso_639_1`             |
| Construire des liens de langues alternatives pour une page | Ce point de terminaison, lire les codes présents          |

Pour les balises qu'accepte `language`, voir [langues](https://amodb.dev/fr/languages/). Toute autre balise se replie sur l'anglais lors d'un appel de détails.

## Erreurs

| HTTP | status_code | Quand                                                                                           |
| ---- | ----------- | ----------------------------------------------------------------------------------------------- |
| 401  | 7           | La clé est absente ou fausse.                                                                   |
| 402  | 36          | La période de l'offre est terminée.                                                             |
| 404  | 34          | Aucune saison ni aucun épisode avec cet identifiant, ou un identifiant qui n'est pas un nombre. |
| 405  | 37          | Vous avez utilisé une méthode d'écriture sur un chemin de traductions.                          |
| 429  | 25          | Vous avez dépassé vos requêtes par minute. Attendez les secondes de `Retry-After`.              |

Un identifiant de film ou de série qui n'existe pas n'est pas une erreur sur ce chemin : il répond 200 avec `"translations": []`, alors que le chemin de détails répond 404. Plus d'informations sur [erreurs](https://amodb.dev/fr/errors/) et [limites de débit](https://amodb.dev/fr/rate-limits/).

## Remarques pratiques

- Un appel remplace jusqu'à 14 appels de détails. Utilisez-le quand vous avez besoin de plus de deux langues du même titre.
- Les lignes sont triées par code de langue, ce qui n'est pas un ordre de priorité. Choisissez les lignes par `iso_639_1`, jamais par position dans le tableau.
- Les appels de type détails sont mis en cache 6 heures en périphérie : un cache client de même durée ne coûte donc rien en fraîcheur.
- Les titres originaux dans d'autres écritures, comme le japonais ou le coréen, sont toujours disponibles dans `original_title` et `original_name` sur la fiche de détails.
- Pour ajouter les traductions à un appel de détails, passez `append_to_response=translations` et lisez le même tableau dans la réponse. Cela fonctionne pour les films, les séries et les épisodes. Le bloc ajouté n'a pas d'`id`.

## Questions et réponses

### Quand utiliser translations plutôt que le paramètre language ?

Utilisez language quand vous montrez une seule langue à un utilisateur. Utilisez translations quand vous avez besoin de plusieurs langues d'un même titre à la fois, par exemple pour un écran d'édition, des pages en langues alternatives ou un contrôle de couverture. Il renvoie aussi des langues que language ne sert pas, comme ja ou de.

### Quelle est la différence entre iso_639_1 et iso_3166_1 ?

iso_639_1 est le code de langue, comme pt. iso_3166_1 est le pays qui l'accompagne, comme BR. Pour les langues en dehors des 14 servies, il répète le code de langue en majuscules, par exemple DA pour da : faites donc toujours la correspondance sur iso_639_1.

### Pourquoi un champ est-il vide dans data ?

Une chaîne vide ou un zéro signifie qu'aucun texte n'existe pour ce champ dans cette langue. Ne l'affichez pas. Repliez-vous sur la langue suivante de votre chaîne, généralement l'anglais, ou sur le titre original.

### Quelles langues le point de terminaison couvre-t-il ?

Les fiches de films et de séries listent toutes les langues que détient le catalogue, souvent de 40 à 80 lignes. Cela inclut les 14 servies : en, ru, uk, be, zh, pt, bg, he, cs, ro, fr, pl, it et es. Les épisodes n'en listent que quelques-unes parmi ces 14.

## Pages liées

- [API de détails de film](https://amodb.dev/fr/movies/): API de détails de film aux chemins et au JSON de TMDB v3. Obtenez un film par id, ajoutez crédits, notes et ambiances avec append_to_response, en 14 langues.
- [API des séries TV](https://amodb.dev/fr/tv-series/): API de séries TV aux chemins et au JSON de TMDB v3 : une série par id avec saisons, chaînes et prochain épisode, plus classifications et plateformes.
- [API de détails de personne](https://amodb.dev/fr/people/): API de détails de personne aux chemins et au JSON de TMDB v3 : biographie, filmographie, ids externes et liste populaire d'un acteur ou d'un membre de l'équipe.
- [API des collections](https://amodb.dev/fr/collections/): API collections avec chemins TMDB v3 : récupérez une saga par id avec ses parties, lisez belongs_to_collection sur un film et cherchez par nom.
- [Langues](https://amodb.dev/fr/languages/): amodb sert titres, résumés et noms en 14 langues. Passez une balise TMDB comme ru-RU ou pt-BR dans language ; toute autre balise se replie sur l'anglais.
- [API de métadonnées de films multilingue](https://amodb.dev/fr/multilingual-movie-metadata-api/): API de métadonnées de films en 14 langues. Balises de langue TMDB, toutes les traductions, repli sur l'anglais et gestion de l'hébreu de droite à gauche.

Mis à jour: 2026-10-18. Source: https://amodb.dev/fr/translations/
