# API תרגומים

> נקודות הקצה של התרגומים מחזירות כל גרסת שפה של רשומה בתגובה אחת: כותרת או שם, תקציר, סלוגן ואתר בית לסרטים ולסדרות, ושם ותקציר לפרקים. כל שורה נושאת 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` | נתיב   | כן         | מזהה סרט מספרי, למשל `550`.                              |
| `api_key`  | שאילתה | אחד משניים | המפתח שלכם. השתמשו בו או בכותרת `Authorization: Bearer`. |

### שדות התגובה

| שדה                           | סוג     | הערות                                                                                                                       |
| ----------------------------- | ------- | --------------------------------------------------------------------------------------------------------------------------- |
| `id`                          | integer | מזהה הסרט.                                                                                                                  |
| `translations`                | array   | שורה אחת לכל שפה עם טקסט, ממוינת לפי קוד שפה. סרט 550 מחזיר 50 שורות.                                                       |
| `translations[].iso_3166_1`   | string  | קוד המדינה שמתלווה לשפה, כמו `US` עבור `en` או `BR` עבור `pt`. בשפות מחוץ ל-14 המוגשות הוא חוזר על קוד השפה באותיות גדולות. |
| `translations[].iso_639_1`    | string  | קוד שפה כמו `ru` או `pt`. ייחודי במערך.                                                                                     |
| `translations[].name`         | string  | השפה כתובה בשפה עצמה.                                                                                                       |
| `translations[].english_name` | string  | שם השפה באנגלית.                                                                                                            |
| `translations[].data`         | object  | השדות המתורגמים. המפתחות תלויים במשאב, ראו בטבלה למטה.                                                                      |

### תגובה לדוגמה

מוצגות שתיים מתוך 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/he/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/he/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'`. סמנו בממשק טקסט משפת גיבוי, כדי שהמשתמש יבין למה עמוד באוקראינית מציג תקציר באנגלית.

## תרגומים או הפרמטר language

| צורך                                     | שימוש                                     |
| ---------------------------------------- | ----------------------------------------- |
| להציג שפה אחת למשתמש אחד                 | `language` בקריאת הפרטים                  |
| לרשום את כל השפות של כותר בעורך          | נקודת הקצה הזו                            |
| לקרוא שפה ש-`language` לא מגיש, כמו `ja` | נקודת הקצה הזו, בחרו שורה לפי `iso_639_1` |
| לבדוק לאילו מ-14 השפות המוגשות יש טקסט   | נקודת הקצה הזו, השוו `iso_639_1`          |
| לבנות קישורים בשפות חלופיות לעמוד        | נקודת הקצה הזו, קראו את הקודים הקיימים    |

את התגיות ש-`language` מקבל ראו בעמוד [שפות](https://amodb.dev/he/languages/). כל תגית אחרת חוזרת לאנגלית בקריאת פרטים.

## שגיאות

| HTTP | status_code | מתי                                                    |
| ---- | ----------- | ------------------------------------------------------ |
| 401  | 7           | המפתח חסר או שגוי.                                     |
| 402  | 36          | תקופת המסלול הסתיימה.                                  |
| 404  | 34          | אין עונה או פרק עם המזהה הזה, או מזהה שאינו מספר.      |
| 405  | 37          | השתמשתם בשיטת כתיבה בנתיב תרגומים.                     |
| 429  | 25          | עברתם את הבקשות שלכם לדקה. המתינו `Retry-After` שניות. |

מזהה סרט או סדרה שלא קיים אינו שגיאה בנתיב הזה: הוא עונה 200 עם `"translations": []`, ואילו נתיב הפרטים עונה 404. עוד על [שגיאות](https://amodb.dev/he/errors/) ו[מגבלות קצב](https://amodb.dev/he/rate-limits/).

## הערות מעשיות

- קריאה אחת מחליפה עד 14 קריאות פרטים. השתמשו בה כשצריך יותר משתי שפות של אותו כותר.
- השורות ממוינות לפי קוד שפה, וזה לא סדר עדיפות. בחרו שורות לפי `iso_639_1`, אף פעם לא לפי מיקום במערך.
- קריאות מסוג פרטים נשמרות בקצה במטמון 6 שעות, ולכן מטמון לקוח באותו אורך לא עולה כלום בטריות.
- כותרות מקוריות בכתבים אחרים, כמו יפנית או קוריאנית, זמינות תמיד ב-`original_title` וב-`original_name` ברשומת הפרטים.
- כדי להוסיף תרגומים לקריאת פרטים, העבירו `append_to_response=translations` וקראו את אותו מערך מהתגובה. זה עובד לסרטים, לסדרות ולפרקים. לבלוק המצורף אין `id`.

## שאלות ותשובות

### מתי להשתמש בתרגומים במקום בפרמטר language?

השתמשו ב-language כשמציגים שפה אחת למשתמש. השתמשו בתרגומים כשצריך כמה שפות של כותר אחד בבת אחת, למשל במסך עורך, בעמודים בשפות חלופיות או בבדיקת כיסוי. הם מחזירים גם שפות ש-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/he/movies/): API פרטי סרט עם אותם נתיבים ו-JSON כמו TMDB v3. קבלו סרט לפי מזהה, הוסיפו קרדיטים, דירוגים, מצבי רוח ופסקולים עם append_to_response, ב-14 שפות.
- [API סדרות טלוויזיה](https://amodb.dev/he/tv-series/): API סדרות טלוויזיה עם אותם נתיבים ו-JSON כמו TMDB v3. קבלו סדרה לפי מזהה ב-GET /3/tv/{series_id} עם עונות, רשתות והפרק הבא, וגם סיווגי גיל וספקי צפייה.
- [API פרטי אדם](https://amodb.dev/he/people/): API פרטי אדם עם אותם נתיבים ו-JSON כמו TMDB v3. קבלו שחקן או איש צוות לפי מזהה, עם ביוגרפיה, פילמוגרפיה, מזהים חיצוניים, תמונות פרופיל והרשימה הפופולרית.
- [API לאוספים](https://amodb.dev/he/collections/): API אוספי סרטים עם נתיבי TMDB v3: שלפו זיכיון ב-GET /3/collection/{collection_id} עם מערך parts, קראו את belongs_to_collection בסרט וחפשו אוספים לפי שם.
- [שפות](https://amodb.dev/he/languages/): amodb מגיש כותרים, תקצירים ושמות ב-14 שפות. העבירו בפרמטר language תגית בסגנון TMDB כמו ru-RU או pt-BR; כל תגית אחרת חוזרת לאנגלית, בלי שגיאה.
- [API מטא-נתונים רב-לשוני לסרטים](https://amodb.dev/he/multilingual-movie-metadata-api/): API מטא-נתונים רב-לשוני לסרטים ב-14 שפות עם מפתח אחד. השתמשו בתגיות שפה של TMDB, קראו את כל התרגומים של כותר, חזרו לאנגלית וטפלו בעברית מימין לשמאל.

עודכן: 2026-10-18. Source: https://amodb.dev/he/translations/
