# API překladů

> Endpointy překladů vracejí všechny jazykové verze záznamu v jedné odpovědi: title nebo name, overview, tagline a homepage u filmů a seriálů, name a overview u epizod. Každý řádek nese iso_639_1, iso_3166_1 a english_name. Použijte je pro jazyky, které parametr language neobsluhuje, nebo k sestavení řetězce záloh.

## Endpoint

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

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

Odpověď:

```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
      }
    }
  ]
}
```

## Získání překladů filmu

`GET /3/movie/{movie_id}/translations` vrací jeden řádek na každý jazyk, který má pro film text. Každý řádek obsahuje objekt `data` s přeloženými poli. Volání nepřijímá parametr jazyka, protože celý smysl je vidět všechny jazyky najednou.

Příklad najde ruský řádek a vypíše jeho název a začátek popisu.

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

### Parametry

| Parametr   | Kde   | Povinný       | Popis                                                          |
| ---------- | ----- | ------------- | -------------------------------------------------------------- |
| `movie_id` | path  | ano           | Číselné ID filmu, například `550`.                             |
| `api_key`  | query | jeden ze dvou | Váš klíč. Použijte jej, nebo hlavičku `Authorization: Bearer`. |

### Pole odpovědi

| Pole                          | Typ     | Poznámky                                                                                                                                  |
| ----------------------------- | ------- | ----------------------------------------------------------------------------------------------------------------------------------------- |
| `id`                          | integer | ID filmu.                                                                                                                                 |
| `translations`                | array   | Jeden řádek na každý jazyk, který má text, seřazeno podle kódu jazyka. Film 550 vrací 50 řádků.                                           |
| `translations[].iso_3166_1`   | string  | Kód země patřící k jazyku, například `US` pro `en` nebo `BR` pro `pt`. U jazyků mimo 14 podporovaných opakuje kód jazyka velkými písmeny. |
| `translations[].iso_639_1`    | string  | Kód jazyka, například `ru` nebo `pt`. V poli jedinečný.                                                                                   |
| `translations[].name`         | string  | Jazyk zapsaný v tomto jazyce.                                                                                                             |
| `translations[].english_name` | string  | Název jazyka anglicky.                                                                                                                    |
| `translations[].data`         | object  | Přeložená pole. Klíče závisejí na zdroji, viz tabulka níže.                                                                               |

### Příklad odpovědi

Zobrazeny jsou dva z 50 řádků a popisy jsou zkráceny.

```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
      }
    }
  ]
}
```

V amodb je `runtime` v řádku překladu vždy 0. Délku čtěte ze záznamu [detailu filmu](https://amodb.dev/cs/movies/).

## Endpointy překladů a jejich klíče data

Všechny cesty sdílejí základ `https://api.amodb.dev/3`. Každá vrací `id` a pole `translations` s tvarem řádku výše. Mění se jen klíče uvnitř `data`.

| Metoda a cesta                                                                     | Klíče `data`                                                   |
| ---------------------------------------------------------------------------------- | -------------------------------------------------------------- |
| `GET /movie/{movie_id}/translations`                                               | `title`, `overview`, `homepage`, `tagline`, `runtime` (vždy 0) |
| `GET /tv/{series_id}/translations`                                                 | `name`, `overview`, `homepage`, `tagline`                      |
| `GET /tv/{series_id}/season/{season_number}/translations`                          | žádné, pole je vždy prázdné                                    |
| `GET /tv/{series_id}/season/{season_number}/episode/{episode_number}/translations` | `name`, `overview`                                             |

Záznamy seriálů uvádějí zhruba tolik jazyků jako filmy. Řádky epizod pokrývají jen podporované jazyky, které mají pro danou epizodu text, ve zkontrolovaných vzorcích od 2 do 14. Chybějící klíč berte jako prázdnou hodnotu a neznámé klíče ignorujte. Nadřazené záznamy viz [seriály](https://amodb.dev/cs/tv-series/).

amodb nenabízí překlady pro osoby ani kolekce. Biografie osoby se řídí parametrem `language` volání detailů osoby a popis kolekce přichází tak, jak je uložen.

## Záloha, když text chybí

Titul může existovat ve 14 jazycích a přesto mít prázdný popis v jazyce, který uživatel zvolil. Projděte řetězec jazyků, vezměte první neprázdnou hodnotu a zapamatujte si, z jakého jazyka pochází.

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

U seriálu předejte jako pole `'name'` místo `'title'`. Text ze záložního jazyka v rozhraní označte, aby uživatel věděl, proč ukrajinská stránka ukazuje anglický obsah.

## Překlady, nebo parametr language

| Potřeba                                                  | Použijte                                        |
| -------------------------------------------------------- | ----------------------------------------------- |
| Zobrazit jeden jazyk jednomu uživateli                   | `language` ve volání detailů                    |
| Vypsat všechny jazyky titulu v editoru                   | Tento endpoint                                  |
| Číst jazyk, který `language` neobsluhuje, například `ja` | Tento endpoint, řádek vyberte podle `iso_639_1` |
| Zjistit, které ze 14 podporovaných jazyků mají text      | Tento endpoint, porovnejte `iso_639_1`          |
| Sestavit odkazy na alternativní jazyky stránky           | Tento endpoint, čtěte přítomné kódy             |

Tagy, které `language` přijímá, viz [jazyky](https://amodb.dev/cs/languages/). Jakýkoli jiný tag se ve volání detailů vrátí k angličtině.

## Chyby

| HTTP | status_code | Kdy                                                                                         |
| ---- | ----------- | ------------------------------------------------------------------------------------------- |
| 401  | 7           | Klíč chybí nebo je nesprávný.                                                               |
| 402  | 36          | Platnost tarifu skončila.                                                                   |
| 404  | 34          | Sezóna ani epizoda s tímto ID neexistuje, nebo ID není číslo.                               |
| 405  | 37          | Použili jste metodu pro zápis na cestě překladů.                                            |
| 429  | 25          | Překročili jste počet požadavků za minutu. Počkejte tolik sekund, kolik říká `Retry-After`. |

ID filmu nebo seriálu, které neexistuje, na této cestě není chyba: odpoví 200 s `"translations": []`, zatímco cesta detailů odpoví 404. Více viz [chyby](https://amodb.dev/cs/errors/) a [limity požadavků](https://amodb.dev/cs/rate-limits/).

## Praktické poznámky

- Jedno volání nahradí až 14 volání detailů. Použijte je, když potřebujete víc než dva jazyky téhož titulu.
- Řádky jsou seřazeny podle kódu jazyka, což není pořadí priority. Řádky vybírejte podle `iso_639_1`, nikdy podle pozice v poli.
- Volání typu detailů se na edge cachují 6 hodin, takže stejně dlouhá cache u klienta nic nestojí na čerstvosti.
- Původní názvy v jiných písmech, například japonských nebo korejských, jsou vždy dostupné v `original_title` a `original_name` v záznamu detailů.
- Chcete-li přidat překlady k volání detailů, předejte `append_to_response=translations` a čtěte stejné pole z odpovědi. Funguje pro filmy, seriály i epizody. Přidaný blok nemá `id`.

## Otázky a odpovědi

### Kdy použít překlady místo parametru language?

Parametr language použijte, když uživateli zobrazujete jeden jazyk. Překlady použijte, když potřebujete více jazyků jednoho titulu najednou, například v editoru, na stránkách v alternativních jazycích nebo při kontrole pokrytí. Vrací také jazyky, které language neobsluhuje, například ja nebo de.

### Jaký je rozdíl mezi iso_639_1 a iso_3166_1?

iso_639_1 je kód jazyka, například pt. iso_3166_1 je k němu patřící země, například BR. U jazyků mimo 14 podporovaných opakuje kód jazyka velkými písmeny, například DA pro da, proto vždy párujte podle iso_639_1.

### Proč je pole uvnitř data prázdné?

Prázdný řetězec nebo nula znamená, že pro toto pole v daném jazyce žádný text neexistuje. Nezobrazujte ho. Přejděte na další jazyk ve svém řetězci, obvykle angličtinu, nebo na původní název.

### Které jazyky endpoint pokrývá?

Záznamy filmů a seriálů uvádějí každý jazyk, který katalog drží, často 40 až 80 řádků. Zahrnuje to 14 podporovaných: en, ru, uk, be, zh, pt, bg, he, cs, ro, fr, pl, it a es. Epizody uvádějí jen některé z těchto 14.

## Související stránky

- [API detailu filmu](https://amodb.dev/cs/movies/): API detailu filmu se stejnými cestami a JSON jako TMDB v3. Načtěte film podle ID, přidejte obsazení, hodnocení a nálady přes append_to_response, 14 jazyků.
- [API detailu seriálu](https://amodb.dev/cs/tv-series/): API detailu seriálu se stejnými cestami a JSON jako TMDB v3. Seriál podle ID se sezónami, sítěmi, věkovým hodnocením a poskytovateli streamování.
- [API detailu osoby](https://amodb.dev/cs/people/): API detailu osoby se stejnými cestami a JSON jako TMDB v3. Herec či člen štábu podle ID s biografií, filmografií, externími ID a seznamem populárních osob.
- [API kolekcí](https://amodb.dev/cs/collections/): API kolekcí filmů s cestami TMDB v3: načtěte franšízu podle ID se všemi filmy, čtěte belongs_to_collection u filmu a hledejte kolekce podle názvu.
- [Jazyky](https://amodb.dev/cs/languages/): amodb vrací názvy, popisy a jména ve 14 jazycích. Do language předejte tag ve stylu TMDB, např. ru-RU nebo pt-BR; jakýkoli jiný tag použije angličtinu.
- [API vícejazyčných metadat filmů](https://amodb.dev/cs/multilingual-movie-metadata-api/): API vícejazyčných metadat filmů ve 14 jazycích: tagy TMDB, všechny překlady, návrat k angličtině a podpora hebrejštiny zprava doleva. Jeden klíč.

Aktualizováno: 2026-10-18. Source: https://amodb.dev/cs/translations/
