{
  "common": {
    "loading": "Загрузка...",
    "save": "Сохранить",
    "saving": "Сохранение...",
    "cancel": "Отмена",
    "back": "Назад",
    "delete": "Удалить",
    "retry": "Повторить",
    "create": "Создать",
    "edit": "Редактировать",
    "next": "Вперёд",
    "previous": "Назад",
    "unknown_error": "Произошла неизвестная ошибка",
    "from": "От",
    "unknown": "Неизвестно",
    "error": "Ошибка",
    "success": "Успешно",
    "close": "Закрыть"
  },
  "config": {
    "new_title": "Новое задание перевода",
    "edit_title": "Редактирование задания перевода",
    "basic_info": "Основная информация",
    "name": "Название",
    "name_placeholder": "Введите название задания",
    "description": "Описание",
    "description_placeholder": "Описание (необязательно)",
    "datasource": "Источник данных",
    "environment": "Окружение Superset",
    "select_environment": "Выберите окружение...",
    "datasource_id": "ID источника данных",
    "datasource_search_placeholder": "Поиск датасетов...",
    "datasource_unavailable": "Источник данных недоступен",
    "select_datasource_hint": "Выберите источник данных для просмотра колонок",
    "detected_dialect": "Обнаружен диалект: {dialect}",
    "column_mapping": "Маппинг колонок",
    "source_table": "Исходная таблица",
    "source_table_placeholder": "например, public.users",
    "source_dialect": "Диалект исходной БД",
    "target_dialect": "Диалект целевой БД",
    "key_columns": "Ключевые колонки (составной ключ)",
    "add_key_column": "+ Добавить ключевую колонку",
    "translation_column": "Колонка для перевода",
    "context_columns": "Контекстные колонки (необязательно)",
    "select_column": "Выберите колонку...",
    "available_columns": "Доступные колонки ({count})",
    "virtual": "виртуальная",
    "virtual_column_warning": "Виртуальные колонки нельзя использовать для перевода: {col}",
    "warnings_title": "Предупреждения",
    "clear_all": "Очистить всё",
    "target_table": "Целевая таблица",
    "target_table_title": "Целевая таблица",
    "target_schema": "Целевая схема",
    "target_schema_placeholder": "например, public",
    "target_table_placeholder": "например, users_translated",
    "target_language": "Язык перевода",
    "target_language_search_placeholder": "Поиск языков...",
    "target_language_required": "Выберите хотя бы один язык перевода",
    "status": "Статус",
    "status_draft": "Черновик",
    "status_ready": "Готово",
    "status_active": "Активно",
    "target_column_placeholder": "Целевая колонка",
    "target_column_mapping_title": "Маппинг целевых колонок",
    "target_column_mapping_description": "Настройте, в какие колонки писать перевод, коды языков, исходный текст и определённый язык источника при INSERT.",
    "target_column_label": "Целевая колонка (переведённый текст)",
    "target_column_placeholder": "translated_text",
    "target_column_hint": "Колонка, в которую будет вставлен переведённый текст",
    "target_language_column_label": "Колонка языка",
    "target_language_column_placeholder": "lang_code",
    "target_language_column_hint": "Колонка, в которую будет вставлен код языка (например, 'ru', 'en')",
    "target_source_column_label": "Колонка исходного текста",
    "target_source_column_placeholder": "source_text",
    "target_source_column_hint": "Колонка, в которую будет вставлен оригинальный исходный текст",
    "target_source_language_column_label": "Колонка языка источника",
    "target_source_language_column_placeholder": "src_lang",
    "target_source_language_column_hint": "Колонка, в которую будет вставлен обнаруженный язык источника (BCP-47)",
    "write_settings": "Настройки записи",
    "batch_size": "Размер пакета",
    "insert_method": "Метод вставки",
    "insert_method_sqllab": "Superset SQL Lab API",
    "insert_method_sqllab_hint": "Выполнение через Superset /api/v1/sqllab/execute/",
    "insert_method_direct_db": "Прямое подключение к БД",
    "insert_method_direct_db_hint": "Выполнение INSERT напрямую в целевую БД",
    "insert_method_select": "Выберите подключение",
    "insert_method_no_conns": "Нет настроенных подключений к БД.",
    "insert_method_go_settings": "Перейти в Settings - Connections",
    "insert_method_test": "Проверить подключение",
    "insert_method_testing": "Проверка...",
    "insert_method_no_compatible": "Нет совместимых подключений для диалекта: {dialect}",
    "insert_method_connection_label": "Подключение к БД",
    "insert_method_connection_help": "Прямое подключение к базе данных, настроенное в Settings → Connections. Используется для INSERT.",
    "upsert_strategy": "Стратегия",
    "upsert_merge": "UPSERT (MERGE)",
    "upsert_insert": "Только INSERT",
    "upsert_update": "Только UPDATE",
    "llm_settings": "Настройки LLM",
    "provider": "Провайдер",
    "select_provider": "Выберите провайдера...",
    "terminology_dictionaries": "Терминологические словари",
    "no_dictionaries": "Нет настроенных словарей",
    "run_translation": "Запустить перевод",
    "full_translate": "Полный перевод",
    "full_translate_title": "Перевести все строки из источника",
    "run_incremental": "Инкрементальный запуск",
    "run_incremental_desc": "Перевести только новые или изменённые строки. Быстро, меньше токенов LLM.",
    "run_full": "Полный перезапуск",
    "run_full_desc": "Перевести ВСЕ строки из источника. Используйте для полного обновления.",
    "run_started": "Запуск перевода начат",
    "running": "Выполняется...",
    "run_failed": "Ошибка запуска перевода",
    "cancel": "Отмена",
    "back_to_jobs": "← К списку заданий",
    "recent_runs": "Последние запуски",
    "id_label": "ID: {id}",
    "save": "Сохранить",
    "saving": "Сохранение...",
    "job_created": "Задание перевода создано",
    "job_updated": "Задание перевода обновлено",
    "job_not_found": "Задание не найдено: {id}",
    "save_failed": "Не удалось сохранить задание перевода",
    "name_required": "Название обязательно",
    "translation_column_required": "Колонка для перевода обязательна",
    "key_mapping_required": "Добавьте хотя бы одну ключевую колонку",
    "redundant_column_warning": "Колонка '{col}' присутствует в ключевых колонках источника и цели",
    "insert_retry_started": "Повторная вставка запущена",
    "insert_retry_failed": "Повторная вставка не удалась",
    "target_database": "База данных (SQL Lab)",
    "select_target_database": "Выберите базу данных для INSERT...",
    "target_database_hint": "Подключение к БД для записи переведённых данных через SQL Lab",
    "loading_databases": "Загрузка баз данных...",
    "include_source_reference": "Сохранять исходный текст как эталонную копию",
    "include_source_reference_hint": "Исходный текст будет сохранён как верифицированная эталонная копия на его обнаруженном языке",
    "disable_reasoning": "Отключить рассуждения (экономия токенов)",
    "disable_reasoning_hint": "Экономит токены на выходе, отключая цепочку рассуждений (Chain of Thought)",
    "mark_ready": "Пометить как готово",
    "save_job_first": "Сначала сохраните задание",
    "breadcrumb_job": "Задание",
    "help_name": "Уникальное название задания для быстрой идентификации в списке.",
    "help_description": "Опциональное описание — заметки для команды о назначении задания.",
    "help_environment": "Superset-окружение, в котором находится исходный датасет. Смена окружения сбросит выбор датасета.",
    "help_datasource": "Датасет (таблица или SQL-запрос) из Superset, содержащий текст для перевода. Начните печатать для поиска.",
    "help_translation_column": "Колонка с исходным текстом, который будет отправлен на перевод в LLM. Должна содержать строковые значения. Язык каждой строки определяется автоматически (lingua-детектор, BCP-47). Если строка пустая или язык не определён (und) — потребуется проверка.",
    "help_key_columns": "Колонки, образующие уникальный ключ строки. Используются для UPSERT/MERGE в целевую таблицу и для отслеживания изменений.",
    "help_context_columns": "Дополнительные колонки, передаваемые в LLM как контекст. Помогают улучшить качество перевода (например, категория, автор).",
    "help_provider": "LLM-провайдер, который будет выполнять перевод. Выберите провайдер с поддержкой нужных языков.",
    "help_target_language": "Языки, на которые нужно перевести текст. Можно выбрать несколько — за один проход LLM переведёт строку на все языки сразу. ⚠️ Важно: система автоматически определяет язык каждой исходной строки (lingua-детектор). Если обнаруженный язык совпадает с одним из целевых — для этой строки перевод на данный язык НЕ выполняется, а исходный текст сохраняется как есть. Пример: исходная строка 'Hello world' определена как 'en'. Если 'English (en)' выбран как целевой язык, эта строка будет пропущена для en-перевода (останется 'Hello world'), но будет переведена на остальные выбранные языки (например, 'Привет мир' для ru).",
    "help_batch_size": "Количество строк, отправляемых в LLM за один запрос. Меньше пакет = выше качество, но больше токенов на оверхед.",
    "help_upsert_strategy": "Стратегия записи в целевую таблицу: UPSERT (MERGE) — вставка или обновление; INSERT — только новые строки; UPDATE — только обновление существующих.",
    "help_include_source_reference": "Сохранить оригинальный текст в отдельной колонке как эталонную копию. Полезно для верификации и аудита.",
    "help_disable_reasoning": "Отключить Chain-of-Thought рассуждения LLM. Экономит токены (~20-30%), но может снизить качество сложных переводов.",
    "help_dictionaries": "Терминологические словари для принудительного сопоставления терминов. Повышают консистентность перевода в рамках предметной области.",
    "help_target_schema": "Схема (namespace) базы данных, в которую будут записаны переведённые данные. Например: public.",
    "help_target_table": "Имя целевой таблицы для записи переведённых данных. Если таблицы нет — данные будут вставлены через SQL Lab.",
    "help_target_database": "Подключение к базе данных (SQL Lab), через которое будет выполняться INSERT переведённых строк.",
    "help_target_column": "Колонка целевой таблицы, в которую будет записан переведённый текст. Должна поддерживать строковый тип.",
    "help_target_language_column": "Колонка для кода языка перевода (ISO 639-1, например 'en', 'ru'). Используется при мультиязычном хранении.",
    "help_target_source_column": "Колонка для сохранения оригинального исходного текста перед переводом. Требуется, если включена опция 'Сохранять исходный текст'.",
    "help_target_source_language_column": "Колонка для кода автоматически определённого языка источника (BCP-47). Заполняется LLM при переводе.",
    "help_incremental": "Переводит только строки с новыми значениями ключей (новые ключи). Ранее переведённые строки не перезапрашиваются у LLM — результат берётся из кэша. Быстрее и дешевле. Рекомендуется для регулярных обновлений. Для расписаний также проверяется 'baseline expiry': если последний успешный запуск был >90 дней назад — автоматически выполняется полный перевод.",
    "help_full": "Переводит ВСЕ строки из источника заново, игнорируя кэш предыдущих запусков. Полезно при изменении настроек, словарей или провайдера. Занимает больше времени и токенов. При каждом запуске выполняется автоматическое определение языка (detected_lang) для каждой строки.",
    "target_table_tab": "Целевая таблица",
    "confirm_run_title": "Запустить перевод?",
    "confirm_run_body": "Вы уверены, что хотите запустить инкрементальный перевод?",
    "confirm_full_run_title": "Запустить полный перевод?",
    "confirm_full_run_body": "Это переведёт ВСЕ строки из источника заново, игнорируя кэш. Действие может занять много времени и потребить много токенов LLM.",
    "confirm": "Подтвердить",
    "unsaved_changes_title": "Несохранённые изменения",
    "unsaved_changes_body": "У вас есть несохранённые изменения. Сохранить перед уходом?",
    "unsaved_changes_save": "Сохранить",
    "unsaved_changes_discard": "Отменить",
    "refresh_metrics": "Обновить",
    "copy_id": "Копировать ID",
    "copy_success": "ID скопирован",
    "copy_failed": "Не удалось скопировать",
    "error_normalized": "Ошибка выполнения перевода",
    "error_db_not_found": "Целевая база данных не найдена. Проверьте настройки подключения.",
    "error_connection_failed": "Не удалось подключиться к базе данных. Проверьте настройки подключения.",
    "error_generic": "Произошла ошибка. Попробуйте ещё раз.",
    "batch_size_suffix": "строк"
  },
  "preview": {
    "title": "Предпросмотр",
    "correct": "Исправить",
    "skip": "Пропустить",
    "accept_all": "Принять все",
    "applying": "Применение...",
    "apply_success": "Исправления применены",
    "apply_failed": "Не удалось применить исправления",
    "no_records": "Нет записей для предпросмотра",
    "loading": "Загрузка предпросмотра...",
    "fetch_failed": "Не удалось загрузить предпросмотр",
    "sample_size": "Размер выборки:",
    "cost_warning": "Большой размер выборки может привести к повышенным затратам",
    "run_preview": "Запустить предпросмотр",
    "running_preview": "Выполняется предпросмотр...",
    "retry_preview": "Повторить",
    "preview_loaded": "Загружено {count} записей",
    "preview_failed": "Не удалось выполнить предпросмотр",
    "accepted_badge": "Принято",
    "active_badge": "Активен",
    "cost_estimate": "Оценка стоимости",
    "sample_rows": "Строк в выборке:",
    "sample_tokens": "Токенов:",
    "sample_cost": "Стоимость выборки:",
    "est_total_cost": "Оценка общей стоимости:",
    "rows_count": "Всего: {count}",
    "approved_count": "Одобрено: {count}",
    "rejected_count": "Отклонено: {count}",
    "pending_count": "Ожидает: {count}",
    "approve_all": "Одобрить все",
    "re_run": "Запустить заново",
    "table_number": "№",
    "table_source": "Исходный SQL",
    "translation": "Перевод",
    "table_translation": "Перевод",
    "table_status": "Статус",
    "table_actions": "Действия",
    "empty_placeholder": "(пусто)",
    "pending_placeholder": "Ожидает перевода",
    "edited_label": "(изменено)",
    "save_edit": "Сохранить",
    "cancel_edit": "Отмена",
    "approve": "Одобрить",
    "edit": "Изменить",
    "reject": "Отклонить",
    "quality_gate": "Контроль качества",
    "quality_gate_ready": "Все строки проверены. Можно принять предпросмотр.",
    "quality_gate_pending": "Не все строки проверены. Принятие заблокировано.",
    "accepting": "Принятие...",
    "accept_preview": "Принять предпросмотр",
    "accepted_title": "Предпросмотр принят",
    "accepted_body": "Предпросмотр успешно принят. Теперь можно запустить перевод.",
    "run_preview_again": "Запустить повторно",
    "config_incomplete": "Конфигурация задания не заполнена",
    "config_requirements": "Колонка для перевода, источник данных, целевые языки и LLM-провайдер должны быть указаны",
    "approve_failed": "Не удалось одобрить строку",
    "reject_failed": "Не удалось отклонить строку",
    "edit_failed": "Не удалось сохранить изменения",
    "row_updated": "Строка обновлена",
    "accept_failed": "Не удалось принять предпросмотр",
    "detected_language": "Язык ист.",
    "languages_count": "Языков: {count}",
    "across_languages": "Для {count} язык(ов)",
    "language_label": "Язык"
    ,
    "status_approved": "Одобрено",
    "status_rejected": "Отклонено",
    "status_pending": "Ожидает"
  },
  "jobs": {
    "title": "Задания перевода",
    "subtitle": "Управление заданиями перевода",
    "new_job": "Новое задание",
    "create_job": "Создать задание",
    "status_draft": "Черновик",
    "status_ready": "Готово",
    "status_running": "Выполняется",
    "status_completed": "Завершено",
    "status_failed": "Ошибка",
    "no_jobs": "Заданий перевода ещё нет. Создайте первое задание чтобы начать.",
    "no_jobs_filtered": "Задания со статусом {status} не найдены.",
    "load_failed": "Не удалось загрузить задания",
    "an_error_occurred": "Произошла ошибка при загрузке заданий",
    "clear_filter": "Сбросить фильтр",
    "confirm_delete": "Вы уверены, что хотите удалить это задание перевода?",
    "cancel_delete": "Отмена",
    "by_label": "{by}",
    "updated_label": "Обновлено {date}",
    "column_label": "Колонка: {column}",
    "language_label": "Язык: {language}",
    "duplicate": "Дублировать",
    "job_duplicated": "Задание дублировано",
    "duplicate_failed": "Не удалось дублировать задание",
    "job_deleted": "Задание удалено",
    "delete_failed": "Не удалось удалить задание",
    "jobs_flow_hint": "Flow: создайте задание → настройте источник данных и LLM → запустите перевод → проверьте историю запусков."
  },
  "history": {
    "title": "История переводов",
    "subtitle": "Фильтруемая история запусков с агрегированными метриками",
    "refresh": "Обновить",
    "total_runs": "Всего запусков",
    "successful": "Успешных",
    "failed": "Ошибок",
    "records": "Записей",
    "all_jobs": "Все задания",
    "all_status": "Все статусы",
    "all_triggers": "Все триггеры",
    "status_pending": "Ожидает",
    "status_running": "Выполняется",
    "status_completed": "Завершён",
    "status_failed": "Ошибка",
    "status_cancelled": "Отменён",
    "trigger_manual": "Вручную",
    "trigger_scheduled": "По расписанию",
    "trigger_baseline_expired": "Истёк Baseline",
    "filter": "Фильтр",
    "no_runs": "Запуски перевода не найдены",
    "no_runs_hint": "Запуски появятся здесь после выполнения задания на перевод.",
    "showing": "Показано {count} из {total} запусков",
    "previous": "Назад",
    "next": "Вперёд",
    "run_detail": "Детали запуска",
    "status": "Статус",
    "trigger": "Триггер",
    "started": "Начат",
    "completed": "Завершён",
    "total": "Всего",
    "success": "Успешно",
    "skipped": "Пропущено",
    "config_snapshot": "Снимок конфигурации",
    "snapshots": "Снимки",
    "events": "События ({count})",
    "error": "Ошибка",
    "superset_query_id": "ID запроса Superset",
    "skipped_csv": "CSV пропущенных",
    "load_failed": "Не удалось загрузить запуски",
    "load_detail_failed": "Не удалось загрузить детали запуска",
    "records_label": "{count} записей",
    "ok_label": "{count} ок",
    "fail_label": "{count} ошибок",
    "by_label": "{user}",
    "download_failed": "Не удалось скачать"
  },
  "schedule": {
    "title": "Настройка расписания",
    "no_schedule": "Расписание не настроено",
    "no_schedule_hint": "Настройте регулярное расписание для автоматических переводов",
    "create_schedule": "Создать расписание",
    "cron_expression": "Cron-выражение",
    "timezone": "Часовой пояс",
    "next_executions": "Следующие выполнения",
    "enabled": "Включено",
    "disabled": "Отключено",
    "tab_label": "Расписание",
    "edit": "Редактировать",
    "update": "Обновить",
    "create": "Создать",
    "delete_confirm": "Удалить это расписание навсегда?",
    "delete_schedule": "Удалить расписание",
    "no_prior_run_warning": "Не было успешного ручного запуска. Расписание может работать с настройками по умолчанию. Рекомендуется сначала запустить вручную.",
    "saved": "Расписание сохранено",
    "save_failed": "Не удалось сохранить расписание",
    "deleted": "Расписание удалено",
    "delete_failed": "Не удалось удалить расписание",
    "enabled_toast": "Расписание включено",
    "disabled_toast": "Расписание отключено",
    "toggle_failed": "Не удалось переключить расписание",
    "preset_daily": "Ежедневно в 02:00",
    "preset_every_6h": "Каждые 6 часов",
    "preset_weekly": "Еженедельно (Вс 01:30)",
    "preset_monthly": "Ежемесячно (1-го в 03:00)",
    "execution_mode": "Режим выполнения",
    "mode_full": "Полный",
    "mode_full_desc": "Переводить все строки при каждом запуске",
    "mode_new_keys": "Только новые ключи",
    "mode_new_keys_desc": "Переводить только строки с новыми значениями ключей",
    "preset_every_15min": "Каждые 15 мин",
    "description_daily": "Ежедневно в {hour}:{minute}",
    "description_every_hour": "в :{minute} минут каждый час",
    "description_cron": "Cron: {cron}",
    "help_cron": "Cron-выражение для автоматического запуска задания перевода. Формат: минута час день месяц день_недели. Пример: 0 2 * * * (ежедневно в 02:00 UTC).",
    "help_timezone": "Часовой пояс для выполнения расписания. Время будет рассчитано в этом часовом поясе. По умолчанию: UTC.",
    "help_execution_mode": "Режим выполнения перевода:\n• full — перевести все записи в задании\n• incremental — переводить только записи, изменившиеся с прошлого запуска"
  },
  "dictionaries": {
    "title": "Словари",
    "new_title": "Новый словарь",
    "name": "Название",
    "name_placeholder": "Введите название словаря",
    "desc": "Описание",
    "desc_placeholder": "Описание (необязательно)",
    "no_description": "Нет описания",
    "entry_count": "{count} записей",
    "total_entries": "Всего: {count}",
    "create": "Создать словарь",
    "create_first": "Создайте первый словарь",
    "confirm_delete": "Удалить этот словарь?",
    "no_dicts": "Словарей пока нет",
    "inactive": "Неактивен",
    "page_info": "Страница {current} из {total}",
    "load_failed": "Не удалось загрузить словари",
    "load_entries_failed": "Не удалось загрузить записи",
    "name_required": "Название словаря обязательно",
    "dict_created": "Словарь создан",
    "create_failed": "Не удалось создать словарь",
    "delete_success": "Словарь удалён",
    "delete_failed": "Не удалось удалить словарь",
    "add_entry": "Добавить запись",
    "new_entry": "Новая запись",
    "save": "Сохранить",
    "loading": "Загрузка записей...",
    "languages": "Языки",
    "source_term": "Исходный термин",
    "target_term": "Целевой термин",
    "context_notes": "Контекстные заметки",
    "context_data": "Контекстные данные",
    "context_data_json": "Контекстные данные (JSON)",
    "import_csv": "Импорт CSV/TSV",
    "import_csv_tsv": "Импорт CSV/TSV",
    "import_entries": "Импорт записей",
    "import_title": "Импорт записей",
    "paste_csv": "Вставьте содержимое CSV...",
    "delimiter": "Разделитель (по умолчанию: табуляция)",
    "import_content_label": "CSV/TSV содержимое (колонки: source_term, target_term, source_language, target_language, context_notes, context_data, usage_notes)",
    "import_content_placeholder": "source_term,target_term,source_language,target_language,context_notes,context_data,usage_notes",
    "import_delimiter": "Разделитель",
    "import_delimiter_auto": "Автоопределение",
    "import_delimiter_comma": "Запятая (CSV)",
    "import_delimiter_tab": "Табуляция (TSV)",
    "import_on_conflict": "При конфликте",
    "conflict_overwrite": "Перезаписывать",
    "conflict_skip": "Пропустить",
    "import_conflict_overwrite": "Перезаписывать",
    "import_conflict_keep": "Оставить существующие",
    "import_conflict_cancel": "Отменить при конфликте",
    "preview": "Просмотр",
    "preview_count": "{count} строк",
    "import_btn": "Импорт",
    "import_preview_btn": "Предпросмотр импорта",
    "import_execute_btn": "Выполнить импорт ({count} строк)",
    "import_cancel_btn": "Отмена",
    "import_table_line": "Строка",
    "import_table_source": "Источник",
    "import_table_target": "Цель",
    "import_table_src_lang": "Язык ист.",
    "import_table_tgt_lang": "Язык цели",
    "import_table_context": "Контекст",
    "import_table_conflict": "Конфликт",
    "import_yes": "да",
    "import_notes": "заметки",
    "import_existing": "Существующий: {term}",
    "import_will_overwrite": "будет перезаписан",
    "import_will_skip": "будет пропущен",
    "import_new": "Новый",
    "import_errors": "Ошибки ({count}):",
    "import_error_line": "Строка {line}: {error}",
    "required_terms": "Обязательные термины",
    "entry_added": "Запись добавлена",
    "entry_add_failed": "Не удалось добавить запись",
    "entry_updated": "Запись обновлена",
    "entry_update_failed": "Не удалось обновить запись",
    "entry_deleted": "Запись удалена",
    "entry_delete_failed": "Не удалось удалить запись",
    "paste_content_first": "Сначала вставьте содержимое словаря",
    "preview_failed": "Предпросмотр не удался",
    "import_complete": "Импорт завершён: {count} записей",
    "import_failed": "Импорт не удался",
    "export_csv": "Экспорт CSV",
    "export_success": "Словарь экспортирован",
    "filter_by_language": "Фильтр по языку:",
    "filter_language": "Фильтр по языку источника",
    "filter_all_source": "Все языки источника",
    "filter_all_target": "Все языки цели",
    "filter_clear": "Сбросить фильтр",
    "filter_count": "({filtered} из {total} записей)",
    "table_source_term": "Исходный термин",
    "table_target_term": "Целевой термин",
    "table_lang": "Язык",
    "table_context": "Контекст",
    "table_actions": "Действия",
    "no_entries": "Записей пока нет.",
    "add_first_entry": "Добавить первую запись",
    "add_entry_title": "Добавить запись",
    "source_term_required": "Исходный термин *",
    "source_term_placeholder": "Оригинальный термин",
    "target_term_required": "Целевой термин *",
    "target_term_placeholder": "Переведённый термин",
    "source_language_label": "Язык источника",
    "source_lang_placeholder": "например, en",
    "target_language_label": "Язык цели",
    "target_lang_placeholder": "например, ru",
    "context_notes_label": "Контекстные заметки",
    "context_notes_placeholder": "Опционально",
    "add_entry_btn": "Добавить запись",
    "confirm_delete_entry": "Подтвердить?",
    "delete_entry_btn": "Удалить",
    "no_btn": "Нет",
    "edit_btn": "Редактировать",
    "context_data_label": "Контекстные данные:",
    "usage_notes_label": "Примечания к использованию:",
    "add_context": "Добавить контекст",
    "no_context_data": "Нет контекстных данных",
    "json_placeholder": "JSON объект или оставьте пустым",
    "usage_notes_placeholder": "Опциональные рекомендации по использованию...",
    "source_label": "Источник:",
    "save_btn": "Сохранить",
    "cancel_btn": "Отмена",
    "updated_toast": "Обновлено",
    "save_failed_toast": "Ошибка сохранения",
    "page_previous": "Назад",
    "page_next": "Вперёд"
  },
  "run": {
    "loading": "Загрузка статуса запуска...",
    "loading_result": "Загрузка результата...",
    "result_title": "Результат запуска",
    "translate_phase": "Перевод...",
    "insert_phase": "Вставка в Superset...",
    "completed": "Завершён",
    "completed_with_errors": "Завершён с ошибками",
    "translation_failed": "Перевод не удался",
    "pending_stuck": "Запуск создан, но не был выполнен",
    "pending_stuck_hint": "Фоновый процесс мог упасть. Отмените этот запуск и запустите новый.",
    "insert_failed": "Фаза вставки не удалась",
    "cancelled": "Отменён",
    "cancelling": "Отмена...",
    "cancel": "Отменить",
    "run_id": "ID запуска:",
    "run_cancelled": "Запуск отменён",
    "cancel_failed": "Не удалось отменить запуск",
    "total": "Всего",
    "success": "Успешно",
    "failed": "Ошибок",
    "skipped": "Пропущено",
    "total_records": "Всего записей",
    "batches_progress": "Пакетов: {count} ({pct}%)",
    "retry_failed": "Повторить ошибки",
    "retrying": "Повтор...",
    "retry_success": "Повтор запущен",
    "retry_failed_msg": "Повтор не удался",
    "retry_insert": "Повторить вставку",
    "retrying_insert": "Повтор вставки...",
    "insert_retry_success": "Повтор вставки запущен",
    "insert_retry_failed_msg": "Повтор вставки не удался",
    "insert_status": "Статус вставки",
    "insert_completed": "Вставка выполнена успешно",
    "copy_id": "Копировать ID",
    "copy_success": "ID скопирован в буфер обмена",
    "copy_failed": "Не удалось скопировать ID",
    "superset_query": "ID запроса Superset",
    "error_label": "Ошибка: {error}",
    "sql_audit": "SQL Аудит ({count})",
    "no_sql_audit": "SQL аудит недоступен",
    "event_invariants": "Инварианты событий:",
    "valid": "Допустимо",
    "violated": "Нарушено",
    "superset_query_id_label": "Superset запущен:",
    "started_yes": "Да",
    "started_no": "Нет",
    "terminal_events": "Терминальных событий: {count}",
    "per_language": "Статистика по языкам",
    "records_filter_all": "Все",
    "records_filter_success": "Успешно",
    "records_filter_failed": "Ошибки",
    "records_filter_skipped": "Пропущено",
    "records_title": "Записи перевода",
    "translated_label": "{count} переведено",
    "failed_label": "{count} с ошибками",
    "skipped_label": "{count} пропущено",
    "tokens_label": "{count} токенов",
    "cost_label": "${count}",
    "duration_label": "{seconds}с",
    "cache_rate": "Кэш: {pct}%",
    "trigger_manual": "Вручную",
    "trigger_scheduled": "По расписанию",
    "trigger_retry": "Повтор",
    "trigger_baseline_expired": "Истёк Baseline",
    "load_failed": "Не удалось загрузить статус запуска",
    "bulk_replace": "Массовая замена",
    "status_label": "Статус",
    "batches_title": "Пакеты ({count})",
    "batch_number": "№{n}",
    "batch_records": "{ok}/{total}",
    "batch_duration": "{seconds}с",
    "sum_metrics_title": "Метрики задания",
    "sum_total_runs": "Всего запусков",
    "sum_success_rate": "Успешность",
    "sum_total_records": "Записей",
    "sum_total_tokens": "Токенов",
    "sum_total_cost": "Стоимость",
    "load_more_records": "Загрузить ещё",
    "showing_records": "Показано {count} из {total} уникальных строк.",
    "sum_avg_duration": "Ср. длительность",
    "help_sum_total_runs": "Общее количество запусков перевода для этого задания, включая завершённые, с ошибками и отменённые.",
    "help_sum_success_rate": "Процент запусков, завершившихся успешно, от общего числа запусков.",
    "help_sum_total_records": "Общее количество записей БД, обработанных во всех запусках этого задания.",
    "help_sum_total_tokens": "Суммарное потребление токенов LLM во всех запусках. Токены — единица входных/выходных данных, обрабатываемых языковой моделью.",
    "help_sum_total_cost": "Оценка суммарной стоимости всех вызовов LLM API для этого задания, рассчитанная на основе использования токенов в каждом запуске.",
    "help_sum_avg_duration": "Средняя продолжительность запуска перевода по всем запускам. Измеряется от начала до завершения (реальное время, включая вызовы LLM и вставки в БД).",
    "disabled_draft": "Сначала переведите задание в статус ГОТОВО",
    "disabled_running": "Перевод уже выполняется",
    "disabled_schema": "Сначала проверьте схему целевой таблицы",
    "load_more_runs": "Загрузить ещё запуски",
    "correct": "Исправить",
    "dismiss": "× Закрыть",
    "download_csv": "CSV",
    "insert_method": "Метод вставки",
    "show_details": "Показать детали",
    "hide_details": "Скрыть детали"
  },
  "corrections": {
    "title": "Массовые исправления",
    "subtitle": "Применить исправления к нескольким переводам",
    "loading": "Загрузка исправлений...",
    "no_items": "Нет доступных исправлений",
    "add_hint": "Добавьте исходный и целевой термин для исправления",
    "source_term": "Исходный термин",
    "incorrect_target": "Неверный перевод",
    "corrected_target": "Исправленный перевод",
    "corrected_placeholder": "Введите правильный перевод",
    "remove": "Удалить",
    "submitting": "Отправка исправлений...",
    "submit_success": "Исправления успешно применены",
    "submit_partial": "Применено частично: {success} успешно, {failed} с ошибками",
    "submit_failed": "Не удалось отправить исправления",
    "submit_all": "Отправить все",
    "dictionary": "Словарь",
    "select_dictionary": "Выберите словарь...",
    "cell_saving": "Сохранение...",
    "cell_submitting": "Отправка в словарь...",
    "cell_submitted_badge": "Словарь ✓",
    "cell_saved_badge": "Сохранено в словарь",
    "cell_language_pair": "Языковая пара:",
    "cell_corrected_value": "Исправленное значение",
    "cell_select_dictionary": "Выберите словарь...",
    "cell_context_data": "Контекстные данные",
    "cell_edit": "Редактировать",
    "cell_cancel_edit": "Отменить редактирование",
    "cell_no_context_data": "Нет контекстных данных",
    "cell_context_json_placeholder": "Введите контекстные данные в формате JSON...",
    "cell_usage_notes": "Примечания к использованию",
    "cell_usage_notes_placeholder": "Опциональные примечания о том, когда/как использовать этот перевод...",
    "cell_save_success": "Исправление сохранено",
    "cell_save_failed": "Не удалось сохранить исправление",
    "cell_dict_load_failed": "Не удалось загрузить словари",
    "cell_select_dict_warning": "Пожалуйста, выберите словарь",
    "cell_dict_submit_success": "Запись в словаре создана",
    "cell_dict_submit_failed": "Не удалось отправить в словарь",
    "cell_retry": "Повторить",
    "cell_submit": "Отправить",
    "cell_cancel": "Отмена",
    "cell_submit_to_dict": "Отправить в словарь",
    "cell_save": "Сохранить",
    "cell_dict_submitted": "Сохранено в словарь"
  },
  "bulk_replace": {
    "title": "Массовая замена",
    "bulk_replace_all": "Массовая замена по всем запускам",
    "close": "Закрыть",
    "find_pattern": "Шаблон поиска",
    "find_placeholder": "Введите текст или регулярное выражение...",
    "regex": "Regex",
    "replace_with": "Заменить на",
    "replace_placeholder": "Текст замены...",
    "target_language": "Язык перевода",
    "select_language": "Выберите язык...",
    "preview_affected": "Предпросмотр изменяемых строк",
    "preview_count": "Предпросмотр: {count} запись(ей) будет изменена",
    "apply_changes": "Применить изменения",
    "table_number": "№",
    "table_before": "До",
    "table_after": "После",
    "showing_first": "Показаны первые {shown} из {total} записей. Примените изменения, чтобы увидеть все.",
    "no_matching": "Совпадений не найдено.",
    "no_matching_hint": "Попробуйте другой шаблон или язык перевода.",
    "confirm_title": "Применить {count} замену(ы)?",
    "confirm_body": "Это изменит переведённые значения в {language}. Это действие нельзя отменить.",
    "submit_to_dict": "Отправить изменённые термины в словарь",
    "usage_notes_placeholder": "Примечания (применяются ко всем отправленным записям)...",
    "cancel": "Отмена",
    "apply_count": "Применить {count} изменени(е/я)",
    "applying": "Применение массовой замены...",
    "applied_title": "Массовая замена завершена",
    "applied_body": "{count} запись(ей) обновлено",
    "done": "Готово",
    "retry": "Повторить",
    "confirm_count_input": "Введите {count} для подтверждения",
    "dictionary": "Словарь",
    "select_dictionary": "Выберите словарь...",
    "word_boundary_hint": "Подсказка: используйте \\bслово\\b для поиска только целых слов",
    "applied_toast": "Массовая замена применена к {count} записям",
    "preview_failed": "Не удалось загрузить предпросмотр замен",
    "apply_failed": "Не удалось применить массовую замену",
    "find_pattern_required": "Пожалуйста, введите шаблон поиска",
    "target_language_required": "Пожалуйста, выберите язык перевода"
  },
  "term_correction": {
    "title": "Отправить исправление термина",
    "loading_dictionaries": "Загрузка словарей...",
    "language_pair": "Языковая пара:",
    "detected": "обнаружен",
    "context_from_source": "Контекст из исходной строки",
    "edited_badge": "Изменено",
    "auto_badge": "Авто",
    "edit_context": "Редактировать контекст",
    "remove_context": "Удалить контекст",
    "restore_context": "Восстановить контекст",
    "no_context": "Нет контекстных данных",
    "usage_notes": "Примечания (опционально)",
    "usage_notes_placeholder": "Опишите, когда следует использовать это сопоставление терминов...",
    "source_term": "Исходный термин",
    "incorrect_target": "Неверный перевод",
    "source_language": "Язык источника",
    "target_language": "Язык перевода",
    "corrected_target": "Исправленный перевод",
    "corrected_placeholder": "Введите исправленный перевод...",
    "dictionary": "Словарь",
    "select_dictionary": "Выберите словарь...",
    "cancel": "Отмена",
    "submit_correction": "Отправить исправление",
    "submitting": "Отправка исправления...",
    "conflict_detected": "Обнаружен конфликт",
    "conflict_description": "\"{source}\" уже существует в этом словаре с переводом \"{existing}\".",
    "keep_existing": "Оставить существующий",
    "overwrite": "Перезаписать",
    "submitted": "Исправление отправлено",
    "close": "Закрыть",
    "submit_success": "Исправление отправлено",
    "overwrite_success": "Исправление перезаписано",
    "keep_success": "Существующая запись сохранена",
    "submit_failed": "Не удалось отправить исправление",
    "overwrite_failed": "Не удалось перезаписать",
    "dict_load_failed": "Не удалось загрузить словари",
    "auto_detected": "Авто-определение"
  },
  "metrics": {
    "title": "Метрики переводов",
    "subtitle": "Агрегированные метрики по всем запускам переводов",
    "load_failed": "Не удалось загрузить метрики",
    "refresh": "Обновить",
    "no_data": "Нет данных метрик",
    "total_runs": "Всего запусков",
    "success_rate": "Успешность",
    "failed_runs": "Неудачных запусков",
    "total_records": "Всего записей",
    "total_tokens": "Всего токенов",
    "total_cost": "Общая стоимость",
    "runs_per_job": "Запусков по заданиям",
    "job": "Задание",
    "runs": "Запуски",
    "successful": "Успешных",
    "tokens": "Токены",
    "cost": "Стоимость",
    "avg_latency": "Средняя задержка"
  },
  "target_schema": {
    "title": "Схема целевой таблицы",
    "region_label": "Проверка схемы целевой таблицы",
    "check_button": "Проверить схему",
    "check_again": "Проверить ещё раз",
    "checking": "Проверка…",
    "enter_table": "Укажите имя целевой таблицы и нажмите «Проверить схему».",
    "select_database": "Выберите целевую базу данных и нажмите «Проверить схему».",
    "press_button": "Нажмите «Проверить схему» для проверки колонок целевой таблицы.",
    "check_error": "Не удалось проверить схему. Убедитесь, что таблица существует и доступна.",
    "table_not_found": "Целевая таблица не найдена в базе данных.",
    "all_present": "Целевая таблица содержит все необходимые колонки.",
    "missing_columns_title": "В целевой таблице не хватает некоторых обязательных колонок.",
    "expected_columns": "Необходимые колонки для вставки переводов:",
    "add_columns": "Добавьте недостающие колонки в целевую таблицу или настройте кастомные имена колонок в «Маппинг целевых колонок» выше.",
    "validate_first": "Проверьте схему целевой таблицы перед запуском перевода.",
    "passed": "Схема проверена — можно запускать перевод."
  }
}
