recognition: глобальный переключатель языка вывода [general].language

- новое поле [general].language (ru|en, дефолт en) — единый источник языка
  локализованного title детектора и локали запросов к метабазам; original_title
  всегда на языке оригинала
- локаль TMDB (поиск + credits) выводится из него, [metadata.tmdb].language убран
- промпт LLM явно задаёт язык title с fallback на оригинал
This commit is contained in:
av
2026-07-24 14:09:04 +03:00
parent 8309ce0664
commit a2d8140e22
18 changed files with 556 additions and 48 deletions
@@ -0,0 +1,28 @@
## 1. Конфиг
- [x] 1.1 Добавить поле `Language string` в `[general]`-секцию `internal/config` (рядом с `Timezone`), парсинг из TOML
- [x] 1.2 `Default()` сеет `Language = "en"`; `validate()` остаётся чистым (не мутирует Config), только отвергает значение вне {`ru`,`en`} по образцу `llm.type` — сообщение `unsupported language %q (supported: ru, en)`
- [x] 1.3 Нормализацию «пусто → `en`» и выдачу абстрактного кода вынести в аксессор `Config` по образцу `DisplayLocation()` (не в `validate()`)
- [x] 1.4 Удалить поле `Language` из `MetadataProvider`/TMDB-секции и его дефолт `ru-RU` в `Default()`
- [x] 1.5 Обновить `config.example.toml`: добавить `[general].language` с комментарием, убрать `[metadata.tmdb].language`
- [x] 1.6 Обновить `docs/conventions/config.md`, если там упомянута локаль TMDB
- [x] 1.7 Тесты config: дефолт `en` (пустой конфиг → `en`); приём `ru`/`en`; **отказ старта на значении вне ru/en** (напр. `de` → ошибка конфига)
## 2. Локаль TMDB из глобального языка
- [x] 2.1 `TMDBConfig` принимает абстрактный `ru`/`en`; диалект `ru``ru-RU`, `en``en-US` выводит сам `tmdb.go` тотальным `switch` с default-веткой `en-US`
- [x] 2.2 Удалить остаточный `tmdbDefaultLanguage = "ru-RU"` и его fallback в `NewTMDB` (скрытый второй дефолт); поправить комментарии, ссылающиеся на дефолт `ru-RU`
- [x] 2.3 Прокинуть абстрактный `language` из конфига в конструктор TMDB-клиента (`cmd/jellybit/serve.go`)
- [x] 2.4 Передавать выведенную локаль в запрос credits (`Director`), не только в поиск
- [x] 2.5 Тесты TMDB: `en``en-US` и `ru``ru-RU` в параметрах `Search` и `Director`; пустой/непокрытый вход → `en-US` (default-ветка)
## 3. Язык title в промпте LLM
- [x] 3.1 Прокинуть абстрактный `language` из конфига в `Recognizer` (поле `recognize.Config`, дефолт в `New`) и в сборку промпта (`systemPrompt` const → builder-функция с параметром языка)
- [x] 3.2 Директива в промпте: `title` на выбранном языке, при отсутствии перевода — оригинал (не выдумывать); `original_title` не трогать
- [x] 3.3 Тесты: промпт содержит корректную языковую директиву при `en` и при `ru`; при незаданном языке — английскую (дефолт)
## 4. Верификация
- [x] 4.1 `task gate` зелёный (build/vet/lint/test/race/покрытие/секреты)
- [x] 4.2 `openspec validate content-language-switch --strict` проходит