## Why

Глобальная настройка `[general].language` правит только промпт LLM и клиент TMDB;
до клиента TVDB она не доезжает вовсе. TVDB отдаёт primary name — название на
языке оригинала, — и оно попадает в карточку ревью и в имя папки Jellyfin как
есть: у [movie 131155](https://www.thetvdb.com/movies/131155-) это `哪吒之魔童降世`
вместо «Нэчжа», хотя русский перевод у записи есть. Плюс `Candidate.OriginalTitle`
у TVDB не заполняется вовсе, хотя это ось сравнения при матче: сегодня TVDB
сравнивается только по одному названию из двух возможных.

## What Changes

- `TVDBConfig` получает поле `Language` — абстрактный код (`ru`|`en`) из
  `cfg.ContentLanguage()`, как уже сделано для TMDB. Диалект (у TVDB это
  трёхбуквенный код ISO 639-2: `rus`/`eng`) выводит сам `internal/metadata/tvdb.go`
  тотальным `switch` с default-веткой — по решению 2 архивного
  [design content-language-switch](../archive/2026-07-24-content-language-switch/design.md).
- Разбор ответа `/search` дополняется картой `translations` (код языка → название).
  `Candidate.Title` берётся из `translations[код]`, при отсутствии перевода —
  из primary `name` (молчаливой пустоты быть не должно).
- `Candidate.OriginalTitle` заполняется primary `name`.
- **Параметр `language` в запрос `/search` НЕ добавляется.** По
  [swagger TVDB v4 4.7.10](https://raw.githubusercontent.com/thetvdb/v4-api/main/docs/swagger.yml)
  этот параметр — фильтр («Restrict results to a specific primary language»), а не
  селектор перевода: он сузил бы выдачу и отрезал именно те записи, ради которых
  задача заводилась. Разбор ведётся по ответу, а не по запросу. Расхождение с
  критерием приёмки задачи вынесено вопросом человеку — см. `## Открытый вопрос`.
- **Форма ответа TVDB живым API не сверялась** — только по публичной документации
  (см. `docs/research/tvdb-search-translations.md`). Интеграционный тест за
  env-гейтом `TVDB_API_KEY` написан, но не запускался.

Ломающих изменений нет: конфиг не меняется, новых настроек не появляется.

## Capabilities

### New Capabilities

Новых нет.

### Modified Capabilities

- `metadata-match`: требование «Локаль запроса к TMDB» получает соседа —
  «Локализованное название кандидата TVDB». Обобщать существующее требование на
  всех провайдеров нельзя: механика у TMDB и TVDB разная (параметр запроса против
  разбора ответа), и одно требование на двоих скрыло бы эту разницу.

## Impact

- `internal/metadata/tvdb.go` — `TVDBConfig.Language`, вывод кода языка, разбор
  `translations` в `tvdbSearchResp`, заполнение `Title`/`OriginalTitle`.
- `internal/metadata/tvdb_test.go` — стенд `httptest` с блоком `translations`,
  табличный тест на перевод/фолбэк/`OriginalTitle`.
- `internal/metadata/integration_test.go` — интеграционный тест за `TVDB_API_KEY`
  печатает `Title` и `OriginalTitle`. **Пишется, но не запускается.**
- `cmd/jellybit/serve.go` — сборка провайдера TVDB получает `Language`.
- `internal/config/config.go` — в `validate` живёт единственный перечень
  потребителей кода языка («при добавлении кода синхронно расширь мапперы
  `metadata.tmdbLocale` и `recognize.languageDirective`»); третий маппер
  дописывается в этот перечень.
- `docs/research/tvdb-search-translations.md` — новая записка о форме ответа
  `/search` с честным провенансом.
- Поведение матча: `strongMatches` сравнивает план и с `Title`, и с
  `OriginalTitle`. У TVDB сегодня `OriginalTitle` пуст, поэтому сравнение идёт по
  одному названию; после изменения их станет два (локализованное + оригинальное).
  Логика гейта не трогается, но его **вход** меняется, и следствие двустороннее:
  запись, которую отсекал иероглифический primary name, теперь может пройти по
  переводу (задача уйдёт в авто вместо review) — и наоборот, две разные записи
  могут совпасть с планом разными названиями, тогда единичный сильный матч
  станет двумя и задача уйдёт в review вместо авто. Второе направление —
  в сторону человека, то есть безопасную. Инвариант «авто-раскладка только при
  подтверждённом матче» не двигается.
- Внешний контракт: TheTVDB API v4 `/search`. Живых запросов в рамках задачи не
  делалось (запрет `CLAUDE.md` → «Запреты»: лимиты метабаз не расходуем).

## Открытый вопрос

Форма ответа `/search` не сверена живым API. Вопрос человеку записан в
`docs/tasks/items/tvdb-title-locale.md` → раздел «Вопросы».
