# API перакладаў

> Эндпоінты перакладаў вяртаюць усе моўныя версіі запісу ў адным адказе: title або name, overview, tagline і homepage для фільмаў і серыялаў, name і overview для эпізодаў. Кожны радок нясе iso_639_1, iso_3166_1 і english_name. Выкарыстоўвайце яго, каб чытаць мовы, якіх не аддае параметр language, або каб будаваць ланцужок запасных моў.

## Эндпоінт

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

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

Адказ:

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

## Атрыманне перакладаў фільма

`GET /3/movie/{movie_id}/translations` вяртае адзін радок на кожную мову, у якой ёсць тэкст для фільма. Кожны радок змяшчае аб’ект `data` з перакладзенымі палямі. Выклік не прымае параметр мовы, бо сэнс якраз у тым, каб убачыць усе мовы адразу.

У прыкладзе знаходзіцца руская радок і друкуюцца яго назва і пачатак апісання.

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

### Параметры

| Параметр   | Дзе   | Абавязковы   | Апісанне                                                             |
| ---------- | ----- | ------------ | -------------------------------------------------------------------- |
| `movie_id` | шлях  | так          | Лікавы id фільма, напрыклад `550`.                                   |
| `api_key`  | запыт | адзін з двух | Ваш ключ. Выкарыстоўвайце яго або загаловак `Authorization: Bearer`. |

### Палі адказу

| Поле                          | Тып      | Заўвагі                                                                                                                                        |
| ----------------------------- | -------- | ---------------------------------------------------------------------------------------------------------------------------------------------- |
| `id`                          | цэлы лік | Id фільма.                                                                                                                                     |
| `translations`                | масіў    | Адзін радок на кожную мову з тэкстам, адсартаваныя па коду мовы. Для фільма 550 вяртаецца 50 радкоў.                                           |
| `translations[].iso_3166_1`   | радок    | Код краіны, што ідзе з мовай, напрыклад `US` для `en` або `BR` для `pt`. Для моў па-за 14 падтрымліванымі паўтарае код мовы вялікімі літарамі. |
| `translations[].iso_639_1`    | радок    | Код мовы, напрыклад `ru` або `pt`. Унікальны ў масіве.                                                                                         |
| `translations[].name`         | радок    | Назва мовы, напісаная на гэтай мове.                                                                                                           |
| `translations[].english_name` | радок    | Назва мовы па-англійску.                                                                                                                       |
| `translations[].data`         | аб’ект   | Перакладзеныя палі. Ключы залежаць ад рэсурсу, гл. табліцу ніжэй.                                                                              |

### Прыклад адказу

Паказаны два з 50 радкоў, апісанні скарочаны.

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

У amodb `runtime` у радку перакладу заўсёды роўны 0. Працягласць чытайце з запісу [дэталяў фільма](https://amodb.dev/be/movies/).

## Эндпоінты перакладаў і іх ключы data

Усе шляхі маюць агульную аснову `https://api.amodb.dev/3`. Кожны вяртае `id` і масіў `translations` з формай радка вышэй. Змяняюцца толькі ключы ўнутры `data`.

| Метад і шлях                                                                       | Ключы `data`                                                      |
| ---------------------------------------------------------------------------------- | ----------------------------------------------------------------- |
| `GET /movie/{movie_id}/translations`                                               | `title`, `overview`, `homepage`, `tagline`, `runtime` (заўсёды 0) |
| `GET /tv/{series_id}/translations`                                                 | `name`, `overview`, `homepage`, `tagline`                         |
| `GET /tv/{series_id}/season/{season_number}/translations`                          | няма, масіў заўсёды пусты                                         |
| `GET /tv/{series_id}/season/{season_number}/episode/{episode_number}/translations` | `name`, `overview`                                                |

Запісы серыялаў пералічваюць прыкладна столькі ж моў, што і фільмы. Радкі эпізодаў ахопліваюць толькі падтрымліваныя мовы, у якіх ёсць тэкст для гэтага эпізода, ад 2 да 14 у праверанай выбарцы. Лічыце адсутны ключ пустым значэннем і ігнаруйце ключы, якіх не ведаеце. Бацькоўскія запісы гл. на старонцы [серыялы](https://amodb.dev/be/tv-series/).

amodb не прапануе пераклады для персон і калекцый. Біяграфія персоны залежыць ад параметра `language` у выкліку дэталяў персоны, а апісанне калекцыі прыходзіць у тым выглядзе, як захавана.

## Запасны варыянт, калі тэксту няма

Назва можа быць на 14 мовах і ўсё роўна мець пустое апісанне на той, што абраў карыстальнік. Прайдзіце па ланцужку моў, вазьміце першае непустое значэнне і запомніце, з якой мовы яно ўзята.

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

Для серыяла перадайце `'name'` як поле замест `'title'`. Пазначайце ў інтэрфейсе тэкст з запасной мовы, каб карыстальнік разумеў, чаму ўкраінская старонка паказвае англійскі сюжэт.

## Translations ці параметр language

| Патрэба                                                  | Што выкарыстаць                             |
| -------------------------------------------------------- | ------------------------------------------- |
| Паказаць адну мову аднаму карыстальніку                  | `language` у выкліку дэталяў                |
| Пералічыць усе мовы назвы ў рэдактары                    | Гэты эндпоінт                               |
| Прачытаць мову, якой `language` не аддае, напрыклад `ja` | Гэты эндпоінт, абярыце радок па `iso_639_1` |
| Праверыць, у якіх з 14 падтрымліваных моў ёсць тэкст     | Гэты эндпоінт, параўнайце `iso_639_1`       |
| Пабудаваць спасылкі на старонкі на іншых мовах           | Гэты эндпоінт, чытайце наяўныя коды         |

Тэгі, якія прымае `language`, гл. на старонцы [мовы](https://amodb.dev/be/languages/). Любы іншы тэг у выкліку дэталяў замяняецца англійскай.

## Памылкі

| HTTP | status_code | Калі                                                                   |
| ---- | ----------- | ---------------------------------------------------------------------- |
| 401  | 7           | Ключ адсутнічае або няправільны.                                       |
| 402  | 36          | Тэрмін дзеяння плана скончыўся.                                        |
| 404  | 34          | Няма сезона або эпізода з гэтым id, або id не з’яўляецца лікам.        |
| 405  | 37          | Вы выкарысталі метад запісу на шляху перакладаў.                       |
| 429  | 25          | Вы перавысілі ліміт запытаў у хвіліну. Пачакайце `Retry-After` секунд. |

Id фільма або серыяла, якога не існуе, на гэтым шляху не памылка: ён адказвае 200 з `"translations": []`, а шлях дэталяў адказвае 404. Больш на старонках [памылкі](https://amodb.dev/be/errors/) і [ліміты запытаў](https://amodb.dev/be/rate-limits/).

## Практычныя заўвагі

- Адзін выклік замяняе да 14 выклікаў дэталяў. Выкарыстоўвайце яго, калі патрэбна больш за дзве мовы адной назвы.
- Радкі адсартаваныя па коду мовы, а гэта не парадак прыярытэту. Абірайце радкі па `iso_639_1`, ніколі па месцы ў масіве.
- Выклікі тыпу дэталяў кэшуюцца на edge на 6 гадзін, таму кліенцкі кэш такой жа даўжыні нічога не каштуе ў свежасці.
- Арыгінальныя назвы на іншых пісьмах, такіх як японскае або карэйскае, заўсёды даступныя ў `original_title` і `original_name` запісу дэталяў.
- Каб дадаць пераклады да выкліку дэталяў, перадайце `append_to_response=translations` і чытайце той жа масіў з адказу. Гэта працуе для фільмаў, серыялаў і эпізодаў. Далучаны блок не мае `id`.

## Пытанні і адказы

### Калі выкарыстоўваць translations замест параметра language?

Выкарыстоўвайце language, калі паказваеце карыстальніку адну мову. Выкарыстоўвайце translations, калі патрэбна адразу некалькі моў адной назвы, напрыклад для экрана рэдактара, старонак на іншых мовах або праверкі пакрыцця. Ён таксама вяртае мовы, якіх language не аддае, такія як ja або de.

### Чым iso_639_1 адрозніваецца ад iso_3166_1?

iso_639_1 гэта код мовы, напрыклад pt. iso_3166_1 гэта краіна, што ідзе з ёй, напрыклад BR. Для моў па-за 14 падтрымліванымі ён паўтарае код мовы вялікімі літарамі, напрыклад DA для da, таму заўсёды супастаўляйце па iso_639_1.

### Чаму поле ўнутры data пустое?

Пусты радок або нуль азначае, што тэксту для гэтага поля на гэтай мове няма. Не паказвайце яго. Пераходзьце да наступнай мовы ў вашым ланцужку, звычайна англійскай, або да арыгінальнай назвы.

### Якія мовы ахоплівае эндпоінт?

Запісы фільмаў і серыялаў пералічваюць кожную мову, якую мае каталог, часта ад 40 да 80 радкоў. Сюды ўваходзяць 14 падтрымліваных: en, ru, uk, be, zh, pt, bg, he, cs, ro, fr, pl, it і es. Эпізоды пералічваюць толькі частку з гэтых 14.

## Звязаныя старонкі

- [API дэталяў фільма](https://amodb.dev/be/movies/): API дэталяў фільма з тымі ж шляхамі і JSON, што ў TMDB v3. Адзін фільм па id, а акцёры, рэйтынгі і настрой праз append_to_response, на 14 мовах.
- [API серыялаў](https://amodb.dev/be/tv-series/): API серыялаў з тымі ж шляхамі і JSON, што ў TMDB v3. Серыял па id з сезонамі, тэлеканаламі і наступным эпізодам, плюс узроставыя рэйтынгі і сэрвісы прагляду.
- [API дэталяў персоны](https://amodb.dev/be/people/): API дэталяў персоны з тымі ж шляхамі і JSON, што ў TMDB v3. Акцёр ці член групы па id з біяграфіяй, фільмаграфіяй, вонкавымі id і спісам папулярных.
- [API калекцый](https://amodb.dev/be/collections/): API калекцый фільмаў з шляхамі TMDB v3: чытайце франшызу па id з усімі часткамі, belongs_to_collection у фільме і шукайце калекцыі па назве.
- [Мовы](https://amodb.dev/be/languages/): amodb аддае назвы, апісанні і імёны на 14 мовах. Перадайце тэг у стылі TMDB, напрыклад ru-RU або pt-BR, у language; любы іншы тэг замяняецца англійскай мовай.
- [Шматмоўнае API метаданых фільмаў](https://amodb.dev/be/multilingual-movie-metadata-api/): Шматмоўнае API метаданых фільмаў на 14 мовах. Тэгі мовы TMDB, усе пераклады, запасны варыянт на англійскай і правільны вывад іўрыту справа налева.

Абноўлена: 2026-10-18. Source: https://amodb.dev/be/translations/
