# API traduceri

> Endpoint-urile de traduceri întorc toate versiunile lingvistice ale unei înregistrări într-un singur răspuns: titlu sau nume, descriere, slogan și pagină web pentru filme și seriale, nume și descriere pentru episoade. Fiecare rând poartă iso_639_1, iso_3166_1 și english_name. Folosește-l ca să citești limbi pe care parametrul language nu le servește sau ca să construiești un lanț de rezervă.

## Endpoint

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

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

Răspuns:

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

## Obține traducerile unui film

`GET /3/movie/{movie_id}/translations` întoarce câte un rând pentru fiecare limbă care are text pentru film. Fiecare rând conține un obiect `data` cu câmpurile traduse. Apelul nu primește parametru de limbă, pentru că tocmai scopul este să vezi toate limbile deodată.

Exemplul găsește rândul în rusă și afișează titlul și începutul descrierii lui.

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

### Parametri

| Parametru  | Loc        | Obligatoriu          | Descriere                                                             |
| ---------- | ---------- | -------------------- | --------------------------------------------------------------------- |
| `movie_id` | cale       | da                   | ID numeric de film, de exemplu `550`.                                 |
| `api_key`  | interogare | una dintre cele două | Cheia ta. Folosește-o pe aceasta sau antetul `Authorization: Bearer`. |

### Câmpurile răspunsului

| Câmp                          | Tip          | Observații                                                                                                                                                    |
| ----------------------------- | ------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `id`                          | număr întreg | ID-ul filmului.                                                                                                                                               |
| `translations`                | array        | Un rând pentru fiecare limbă care are text, sortat după codul limbii. Filmul 550 întoarce 50 de rânduri.                                                      |
| `translations[].iso_3166_1`   | șir          | Codul de țară care însoțește limba, precum `US` pentru `en` sau `BR` pentru `pt`. Pentru limbile din afara celor 14 servite repetă codul limbii cu majuscule. |
| `translations[].iso_639_1`    | șir          | Cod de limbă precum `ru` sau `pt`. Unic în array.                                                                                                             |
| `translations[].name`         | șir          | Limba scrisă în acea limbă.                                                                                                                                   |
| `translations[].english_name` | șir          | Numele limbii în engleză.                                                                                                                                     |
| `translations[].data`         | obiect       | Câmpurile traduse. Cheile depind de resursă, vezi tabelul de mai jos.                                                                                         |

### Exemplu de răspuns

Sunt arătate două din cele 50 de rânduri, iar descrierile sunt tăiate.

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

În amodb `runtime` este mereu 0 într-un rând de traducere. Citește durata din fișa de [detalii film](https://amodb.dev/ro/movies/).

## Endpoint-uri de traduceri și cheile lor data

Toate căile au baza `https://api.amodb.dev/3`. Fiecare întoarce `id` și un array `translations` cu structura de rând de mai sus. Se schimbă doar cheile din `data`.

| Metodă și cale                                                                     | Chei `data`                                                     |
| ---------------------------------------------------------------------------------- | --------------------------------------------------------------- |
| `GET /movie/{movie_id}/translations`                                               | `title`, `overview`, `homepage`, `tagline`, `runtime` (mereu 0) |
| `GET /tv/{series_id}/translations`                                                 | `name`, `overview`, `homepage`, `tagline`                       |
| `GET /tv/{series_id}/season/{season_number}/translations`                          | niciuna, array-ul este mereu gol                                |
| `GET /tv/{series_id}/season/{season_number}/episode/{episode_number}/translations` | `name`, `overview`                                              |

Înregistrările de seriale listează aproximativ tot atâtea limbi ca filmele. Rândurile de episoade acoperă doar limbile servite care au text pentru acel episod, de la 2 la 14 în eșantioanele verificate. Tratează o cheie lipsă ca pe o valoare goală și ignoră cheile pe care nu le cunoști. Vezi [seriale TV](https://amodb.dev/ro/tv-series/) pentru înregistrările părinte.

amodb nu oferă traduceri pentru persoane sau colecții. Biografia unei persoane urmează parametrul `language` al apelului de detalii pentru persoană, iar descrierea unei colecții vine așa cum este stocată.

## Revino la alt text când lipsește

Un titlu poate exista în 14 limbi și totuși să aibă o descriere goală în cea aleasă de utilizator. Parcurge un lanț de limbi, ia prima valoare nevidă și ține minte din ce limbă provine.

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

Pentru un serial, transmite `'name'` ca nume de câmp în loc de `'title'`. Marchează în interfață textul dintr-o limbă de rezervă, ca utilizatorul să știe de ce o pagină în ucraineană arată o sinopsis în engleză.

## Traduceri sau parametrul language

| Nevoie                                                        | Folosește                                     |
| ------------------------------------------------------------- | --------------------------------------------- |
| Arăți o limbă unui utilizator                                 | `language` la apelul de detalii               |
| Listezi toate limbile unui titlu într-un editor               | Acest endpoint                                |
| Citești o limbă pe care `language` nu o servește, precum `ja` | Acest endpoint, alege rândul după `iso_639_1` |
| Verifici care dintre cele 14 limbi servite au text            | Acest endpoint, compară `iso_639_1`           |
| Construiești linkuri de limbă alternativă pentru o pagină     | Acest endpoint, citește codurile prezente     |

Pentru etichetele pe care le acceptă `language`, vezi [limbi](https://amodb.dev/ro/languages/). Orice altă etichetă revine la engleză la un apel de detalii.

## Erori

| HTTP | status_code | Când                                                                         |
| ---- | ----------- | ---------------------------------------------------------------------------- |
| 401  | 7           | Cheia lipsește sau este greșită.                                             |
| 402  | 36          | Perioada planului s-a încheiat.                                              |
| 404  | 34          | Niciun sezon sau episod cu acel ID sau un ID care nu este număr.             |
| 405  | 37          | Ai folosit o metodă de scriere pe o cale de traduceri.                       |
| 429  | 25          | Ai depășit cererile pe minut. Așteaptă numărul de secunde din `Retry-After`. |

Un ID de film sau de serial care nu există nu este o eroare pe această cale: răspunde 200 cu `"translations": []`, în timp ce calea de detalii răspunde 404. Mai multe la [erori](https://amodb.dev/ro/errors/) și [limite de cereri](https://amodb.dev/ro/rate-limits/).

## Note practice

- Un singur apel înlocuiește până la 14 apeluri de detalii. Folosește-l când ai nevoie de mai mult de două limbi ale aceluiași titlu.
- Rândurile sunt sortate după codul limbii, ceea ce nu este o ordine de prioritate. Alege rândurile după `iso_639_1`, niciodată după poziția în array.
- Apelurile de tip detalii sunt ținute în cache la margine 6 ore, deci un cache de client de aceeași durată nu costă nimic în prospețime.
- Titlurile originale în alte scrieri, precum japoneza sau coreeana, sunt mereu disponibile în `original_title` și `original_name` în fișa de detalii.
- Ca să adaugi traduceri la un apel de detalii, transmite `append_to_response=translations` și citește același array din răspuns. Funcționează pentru filme, seriale și episoade. Blocul atașat nu are `id`.

## Întrebări și răspunsuri

### Când să folosesc translations în loc de parametrul language?

Folosește language când arăți o singură limbă unui utilizator. Folosește translations când ai nevoie de mai multe limbi ale aceluiași titlu deodată, de exemplu un ecran de editor, pagini în limbi alternative sau o verificare de acoperire. Întoarce și limbi pe care language nu le servește, precum ja sau de.

### Care este diferența dintre iso_639_1 și iso_3166_1?

iso_639_1 este codul limbii, precum pt. iso_3166_1 este țara care o însoțește, precum BR. Pentru limbile din afara celor 14 servite repetă codul limbii cu majuscule, de exemplu DA pentru da, deci potrivește mereu după iso_639_1.

### De ce este un câmp gol în data?

Un șir gol sau un zero înseamnă că nu există text pentru acel câmp în acea limbă. Nu-l afișa. Revino la următoarea limbă din lanțul tău, de obicei engleza, sau la titlul original.

### Ce limbi acoperă endpoint-ul?

Înregistrările de film și de serial listează fiecare limbă pe care o ține catalogul, adesea 40 până la 80 de rânduri. Asta include cele 14 servite: en, ru, uk, be, zh, pt, bg, he, cs, ro, fr, pl, it și es. Episoadele listează doar unele dintre cele 14.

## Pagini conexe

- [API detalii film](https://amodb.dev/ro/movies/): API detalii film cu aceleași căi și același JSON ca TMDB v3. Preia un film după ID, adaugă credite, evaluări și atmosferă cu append_to_response, în 14 limbi.
- [API seriale TV](https://amodb.dev/ro/tv-series/): API seriale TV cu căile și JSON-ul TMDB v3. Preia un serial după ID cu sezoane, rețele și următorul episod, plus clasificări de conținut și furnizori.
- [API detalii persoană](https://amodb.dev/ro/people/): API detalii persoană cu căile și JSON-ul TMDB v3. Preia un actor sau membru al echipei după ID, cu biografie, filmografie, ID-uri externe și lista populară.
- [API colecții](https://amodb.dev/ro/collections/): API colecții de filme cu căi TMDB v3: preia o franciză după ID cu toate părțile, citește belongs_to_collection la un film și caută colecții după nume.
- [Limbi](https://amodb.dev/ro/languages/): amodb servește titluri, descrieri și nume în 14 limbi. Trimite în language o etichetă în stil TMDB, precum ru-RU sau pt-BR; altă etichetă revine la engleză.
- [API multilingv de metadate pentru filme](https://amodb.dev/ro/multilingual-movie-metadata-api/): API multilingv de metadate pentru filme, 14 limbi. Etichete de limbă TMDB, toate traducerile, revenire la engleză și ebraică de la dreapta la stânga.

Actualizat: 2026-10-18. Source: https://amodb.dev/ro/translations/
