{
  "forms": {
    "upload_dir_error": "Ошибка при создании папки загрузки",
    "file_create_error": "Ошибка при создании файла",
    "multipart_stream_error": "Ошибка в потоке multipart",
    "file_write_error": "Ошибка при записи файла",
    "required": "Это поле обязательно для заполнения",
    "too_short": "Слишком короткое (мин {})",
    "too_long": "Слишком длинное (макс {})",
    "email_invalid": "Неверный формат email адреса",
    "url_invalid": "Пожалуйста, введите корректный URL",
    "phone_invalid": "Неверный номер телефона (цифры, +, пробелы, дефисы, 7-15 цифр)",
    "hash_error": "Ошибка хеширования: {}",
    "password_empty": "Пароль не может быть пустым",
    "filter_invalid_value": "Фильтр static/media получил неверное значение ({}) вместо пути к файлу.",
    "number_invalid": "Неверное число",
    "number_required": "Обязательно",
    "integer_required": "Должно быть целым числом",
    "decimal_required": "Должно быть в десятичном формате",
    "min_value": "Требуется мин {}",
    "max_value": "Превышен макс {}",
    "precision_max": "Максимальная точность {} цифр после запятой",
    "precision_min": "Минимальная точность {} цифр после запятой",
    "color_invalid": "Неверный цвет (формат: #RRGGBB или #RGB)",
    "color_no_hash": "Цвет должен начинаться с #",
    "color_bad_hex": "Содержит не шестнадцатеричные символы",
    "slug_invalid": "Неверный slug",
    "slug_no_dash": "Slug не должен начинаться или заканчиваться дефисом",
    "uuid_invalid": "Неверный формат UUID (ожидается: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx)",
    "json_invalid": "Неверный JSON: {}",
    "ipv4_only": "Принимаются только IPv4 адреса",
    "ipv6_only": "Принимаются только IPv6 адреса",
    "ip_invalid": "Неверный IP адрес",
    "date_invalid": "Неверный формат даты",
    "date_too_old": "Слишком старая (мин : {})",
    "date_too_far": "Слишком далеко (макс : {})",
    "time_invalid": "Неверный формат времени",
    "file_required": "Пожалуйста, выберите хотя бы один файл",
    "file_extension_blocked": "Файл '{}' не разрешён. Разрешённые расширения: {}",
    "finalize_error": "Ошибка при финализации поля '{}': {}",
    "template_missing": "Отсутствует шаблон: {}",
    "render_js_error": "Ошибка рендеринга JS: {}",
    "tera_not_configured": "Tera не настроен",
    "config_not_found": "Конфигурация не найдена в расширениях",
    "hint_slug": "Формат: буквы-цифры-дефисы",
    "hint_uuid": "Формат: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
    "hint_json": "Требуется корректный формат JSON",
    "hint_ip_v4": "Формат IPv4: 192.168.1.1",
    "hint_ip_v6": "Формат IPv6: 2001:0db8:85a3::8a2e:0370:7334",
    "hint_ip": "Формат IPv4 или IPv6",
    "validation_overflow": "Обнаружено переполнение стека: бесконечная рекурсия в валидации",
    "choice_invalid": "Неверный выбор",
    "choice_invalid_value": "Неверный выбор: {}",
    "select_required": "Пожалуйста, выберите опцию",
    "checkbox_required": "Пожалуйста, выберите хотя бы одну опцию",
    "multipart_error": "Ошибка multipart",
    "body_error": "Ошибка чтения тела запроса",
    "aegis_query_error": "Ошибка разбора строки запроса: {}",
    "aegis_urlencoded_error": "Ошибка разбора urlencoded тела: {}",
    "aegis_json_error": "Ошибка разбора JSON тела: {}",
    "auth_required": "Требуется аутентификация",
    "role_insufficient": "Недостаточно прав",
    "time_too_old": "Слишком рано (мин : {})",
    "time_too_far": "Слишком поздно (макс : {})",
    "datetime_too_old": "Слишком рано (мин : {})",
    "datetime_too_far": "Слишком поздно (макс : {})",
    "duration_invalid": "Неверная длительность (ожидается количество секунд)",
    "duration_too_short": "Минимальная длительность: {} секунд",
    "duration_too_long": "Максимальная длительность: {} секунд",
    "file_max_count": "Разрешено максимум {} файлов",
    "file_too_large": "Файл '{}' слишком большой ({}МБ > макс {}МБ)",
    "file_invalid_image": "Файл '{}' не является корректным изображением",
    "image_too_wide": "Изображение '{}' слишком широкое ({}px > {}px)",
    "image_too_tall": "Изображение '{}' слишком высокое ({}px > {}px)",
    "boolean_required": "Вы должны принять это поле",
    "slug_unicode_invalid": "Разрешены только буквы, цифры, дефисы и подчёркивания",
    "unique_field_taken": "Этот {} уже используется.",
    "unique_value_taken": "Значение поля '{}' уже используется.",
    "unique_constraint_violated": "Нарушено ограничение уникальности.",
    "db_error": "Ошибка БД: {}",
    "text_field_too_large": "Поле слишком большое (макс 1 МБ)",
    "upload_too_large": "Файл слишком большой (макс {}МБ)"
  },
  "csrf": {
    "missing": "Отсутствует CSRF токен",
    "invalid": "Неверный CSRF токен",
    "invalid_or_missing": "Неверный или отсутствующий CSRF токен",
    "forbidden": "Неверный CSRF токен",
    "session_write_error": "Ошибка записи сессии"
  },
  "error": {
    "source": "Источник: {}",
    "AppError": "Ошибка приложения",
    "build": "Ошибка сборки: {}",
    "internal": "Внутренняя ошибка",
    "forbidden": "Доступ запрещён",
    "not_found": "Ресурс не найден",
    "validation": "Ошибка валидации: {}",
    "database": "Ошибка базы данных: {}",
    "io": "Ошибка ввода-вывода: {}",
    "template": "Ошибка шаблона: {}",
    "custom": "Пользовательская ошибка: {}",
    "title": {
      "not_found": "Страница не найдена",
      "forbidden": "Доступ запрещён",
      "validation": "Ошибка валидации",
      "database": "Ошибка базы данных",
      "template": "Ошибка рендеринга шаблона",
      "internal": "Внутренняя ошибка сервера"
    },
    "path_not_found": "Запрошенный путь '{}' не найден",
    "internal_occurred": "Произошла внутренняя ошибка",
    "context_occurred": "Произошла ошибка AppError"
  },
  "title": {
    "template": "Ошибка шаблона в '{}'"
  },
  "build": {
    "validation_failed": "Ошибка валидации сборки: {}",
    "check_failed": "Ошибка сборки с {} ошибками проверки",
    "template_failed": "Ошибка загрузки шаблона: {}",
    "db_missing": "Требуется подключение к базе данных при включённой функции 'orm'",
    "component_not_ready": "Компонент '{}' не готов"
  },
  "middleware": {
    "host_invalid": "Неверный хост: '{}' (Разрешённые хосты: {})",
    "host_debug": "Неверный хост: '{}'. Добавьте его в RUNIQUE_ALLOWED_HOSTS.",
    "bad_request": "Неверный запрос"
  },
  "html": {
    "404_title": "404",
    "404_text": "Страница не найдена",
    "500_title": "500",
    "500_text": "На сервере произошла ошибка",
    "500_notice": "Наша команда уведомлена и работает над проблемой.",
    "429_title": "429",
    "429_text": "Слишком много запросов. Пожалуйста, подождите немного и повторите попытку.",
    "back_home": "Вернуться на главную",
    "critical_error_title": "Критическая ошибка",
    "critical_error_text": "Система обработки ошибок сама столкнулась с ошибкой.",
    "critical_error_contact": "Эта ситуация никогда не должна была произойти. Пожалуйста, свяжитесь с системным администратором."
  },
  "debug": {
    "stack_trace_title": "Подробная трассировка ошибки",
    "stack_trace_tip": "Самая верхняя ошибка (уровень 0) обычно является корневой причиной. Последующие ошибки показывают, как ошибка распространилась в коде."
  },
  "flash": {
    "welcome": "Добро пожаловать, {}, ваш аккаунт создан!",
    "fix_errors": "Пожалуйста, исправьте ошибки",
    "success_demo": "Это сообщение об успехе.",
    "info_demo": "Это информационное сообщение.",
    "warning_demo": "Это предупреждающее сообщение.",
    "error_demo": "Это сообщение об ошибке."
  },
  "log": {
    "db_connecting": "Подключение к базе данных {}...",
    "db_connected": "База данных успешно подключена ({})",
    "db_failed": "Не удалось подключиться к базе данных",
    "db_engine": "Движок: {}",
    "template_render_error": "Ошибка рендеринга шаблона",
    "error_handler": "Произошла критическая ошибка",
    "error_handled": "Ошибка обработана",
    "files_count": "добавление JS файлов в форму",
    "js_file_skip": "JS файл пропущен",
    "already_initialized": "Логгер уже инициализирован"
  },
  "cli": {
    "creating_project": "Создание проекта '{}'...",
    "admin_detected": "Обнаружен admin → запуск daemon",
    "add_admin_hint": "Добавьте .with_admin(...) в ваш builder для активации панели администратора.",
    "daemon_error": "[Daemon] Ошибка: {}",
    "cargo_run_failed": "Приложение не запустилось корректно (cargo run)",
    "file_not_found": "Файл не найден: {}\nУбедитесь, что вы находитесь в корне вашего проекта Runique.",
    "admin_not_found": "Файл admin не найден: {}\nСоздайте src/admin.rs с макросом admin!{{}}.",
    "name_empty": "Имя проекта не может быть пустым",
    "name_invalid": "Имя проекта должно содержать только буквы, цифры, _ или -",
    "name_dash": "Имя проекта не может начинаться с -",
    "folder_exists": "Папка '{}' уже существует",
    "cargo_run_expect": "Не удалось запустить cargo run",
    "project_created": "Проект '{}' успешно создан!",
    "getting_started": "Для начала:",
    "cd_hint": "cd {}",
    "cargo_run_hint": "cargo run"
  },
  "daemon": {
    "modification_detected": "Обнаружено изменение → регенерация...",
    "unable_read": "Невозможно прочитать: {}",
    "parse_error": "Ошибка разбора: {}",
    "no_resource": "Нет ресурсов в admin!{{}} — нечего генерировать",
    "with_admin_disabled": "with_admin отключён → daemon остановлен",
    "operational": "Daemon работает → src/admin/generated.rs",
    "generation_error": "Ошибка генерации: {}",
    "watcher_error": "Ошибка наблюдателя: {}",
    "unable_create": "Невозможно создать наблюдателя: {}",
    "unable_watch": "Невозможно наблюдать за {} : {}"
  },
  "macro": {
    "named_fields_only": "Только структуры с именованными полями",
    "structs_only": "Работает только со структурами",
    "forms_field_required": "Структура '{}' должна иметь поле 'Forms'",
    "field_no_name": "Поле без имени",
    "model_form_named_only": "DeriveModelForm: только структуры с именованными полями",
    "model_form_structs_only": "DeriveModelForm: только структуры"
  },
  "parser": {
    "string_expected": "Ожидалась строка, найдено: {}",
    "string_eof": "Ожидалась строка, конец файла",
    "array_expected": "Ожидался массив [...] для разрешений, найдено: {}",
    "array_eof": "Ожидался массив [...] для разрешений, конец файла",
    "role_required": "Требуется хотя бы одна роль в permissions: [...]",
    "punct_expected": "Ожидалось '{}', найдено: {}",
    "punct_eof": "Ожидалось '{}', конец файла",
    "title_required": "admin!: 'title' обязателен",
    "permissions_required": "admin!: 'permissions' обязателен",
    "list_display_exclude_exclusive": "admin!: 'list_display' и 'list_exclude' взаимно исключают друг друга"
  },
  "TemplateMessage": {
    "debug_info_title": "Отладочная информация",
    "debug_field_title": "Заголовок",
    "debug_field_count": "Количество полей",
    "debug_error_count": "Ошибки",
    "debug_main_message": "Основное сообщение",
    "debug_root_cause": "Корневая причина",
    "debug_details": "Дополнительные детали",
    "debug_request_info": "Информация о запросе",
    "debug_http_method": "HTTP метод",
    "debug_path": "Путь",
    "debug_query_params": "Параметры запроса",
    "debug_http_headers": "HTTP заголовки",
    "debug_template_info": "Информация о шаблоне",
    "debug_template_name": "Имя шаблона",
    "debug_error_line": "Строка ошибки",
    "debug_template_source": "Исходный код шаблона",
    "debug_available_templates": "Доступные шаблоны",
    "debug_stack_trace_title": "Подробная трассировка ошибки",
    "debug_stack_trace_tip": "Самая верхняя ошибка (уровень 0) обычно является корневой причиной. Последующие ошибки показывают, как ошибка распространилась в коде.",
    "debug_environment": "Окружение",
    "debug_debug_mode": "Режим отладки",
    "debug_enabled": "Включено",
    "debug_disabled": "Отключено",
    "debug_rust_version": "Версия Rust",
    "debug_app_version": "Версия приложения",
    "debug_status_code": "Код статуса",
    "debug_header_name": "Имя",
    "debug_header_value": "Значение"
  },
  "admin": {
    "group": "Группа",
    "groups": "Группы",
    "resource": "Ресурс",
    "resources": "Ресурсы",
    "can_create": "Создать",
    "can_read": "Чтение",
    "can_update": "Изменение",
    "can_delete": "Удалить",
    "can_update_own": "Изменение",
    "can_delete_own": "Удалить",
    "name": "Имя",
    "username": "Имя пользователя",
    "email": "Email",
    "staff": "Сотрудник",
    "superuser": "Суперпользователь",
    "active": "Активен",
    "user": {
      "username_too_short": "Имя пользователя слишком короткое (минимум 3 символа)",
      "invalid_email": "Неверный формат email адреса"
    },

    "login": {
      "title": "Вход",
      "subtitle": "Войдите для доступа к панели администратора",
      "label_username": "Имя пользователя",
      "label_password": "Пароль",
      "btn_submit": "Войти",
      "error_session": "Ошибка при открытии сессии.",
      "error_credentials": "Неверные учётные данные или недостаточно прав.",
      "error_locked": "Слишком много попыток. Аккаунт временно заблокирован. Повторите через {} секунд."
    },
    "logout": {
      "success": "Выход выполнен успешно."
    },
    "access": {
      "no_auth_handler": "Обработчик аутентификации не настроен. Вызовите .auth(MyAuth) на AdminConfig.",
      "insufficient_rights": "Недостаточно прав для доступа к администрированию"
    },
    "dashboard": {
      "title": "Панель управления",
      "subtitle": "Обзор приложения",
      "card_resources": "Ресурсы",
      "th_resource": "Ресурс",
      "th_key": "Ключ",
      "th_permissions": "Разрешения",
      "th_actions": "Действия",
      "btn_list": "Список",
      "btn_create": "Создать",
      "see_list": "Посмотреть список →",
      "empty_title": "Нет зарегистрированных ресурсов",
      "empty_desc": "Объявите ваши ресурсы в src/admin.rs с макросом admin!{{}} затем запустите runique start"
    },
    "list": {
      "breadcrumb_admin": "Администрирование",
      "entries_count_one": "запись",
      "entries_count_many": "записей",
      "btn_create": "Создать",
      "th_id": "id",
      "th_actions": "Действия",
      "bool_true": "Да",
      "bool_false": "Нет",
      "btn_detail": "Детали",
      "btn_edit": "Изменить",
      "btn_delete": "Удалить",
      "confirm_delete": "Действительно удалить?",
      "empty_title": "Нет записей",
      "empty_desc": "Начните с создания элемента.",
      "btn_create_first": "Создать первый",
      "search_placeholder": "Поиск..."
    },
    "create": {
      "title": "Создать",
      "breadcrumb": "Создать",
      "card_info": "Информация",
      "no_fields": "Пока нет доступных полей.",
      "btn_cancel": "Отмена",
      "btn_submit": "Создать",
      "success": "Запись успешно создана!"
    },
    "edit": {
      "title": "Изменить",
      "breadcrumb": "Изменить",
      "card_info": "Информация",
      "no_fields": "Пока нет доступных полей.",
      "btn_cancel": "Отмена",
      "btn_submit": "Сохранить",
      "success": "Запись успешно обновлена!"
    },
    "detail": {
      "title": "Детали",
      "breadcrumb": "Детали",
      "entry_label": "Запись",
      "btn_list": "← Список",
      "btn_edit": "Изменить",
      "btn_delete": "Удалить",
      "confirm_delete": "Удалить эту запись?"
    },
    "reset_password": {
      "btn": "Сбросить пароль",
      "success_email": "Reset link sent to {}.",
      "success_link": "Reset link (mailer not configured): {}",
      "error_no_email": "No email field found for this user.",
      "error_send": "Error sending email: {}",
      "email_subject": "Сброс пароля",
      "email_title": "Сброс пароля",
      "email_greeting": "Здравствуйте,",
      "email_body": "Нажмите на ссылку, чтобы сбросить пароль (действительна 1 час):",
      "email_btn": "Сбросить пароль",
      "email_ignore": "Если вы не запрашивали сброс, проигнорируйте это сообщение."
    },
    "user_created": {
      "email_subject": "Добро пожаловать — установите пароль",
      "email_sent": "Приветственное письмо отправлено на {}.",
      "email_greeting": "Добро пожаловать,",
      "email_body": "Для вас создан аккаунт. Нажмите на ссылку, чтобы установить пароль:",
      "email_btn": "Установить пароль",
      "email_validity": "Ссылка действительна 1 час. Если вы не ожидали этого сообщения, проигнорируйте его."
    },
    "delete": {
      "title": "Удалить",
      "breadcrumb": "Удалить",
      "heading": "Подтвердить удаление",
      "btn_cancel": "← Отмена",
      "btn_confirm": "Да, удалить безвозвратно",
      "success": "Запись успешно удалена!",
      "warning": {
        "title": "Внимание!",
        "desc": "Вы собираетесь удалить запись",
        "of": "ресурса",
        "irreversible": "Это действие необратимо."
      },
      "not_found": "Ресурс не найден."
    },
    "bulk": {
      "no_selection": "Элементы не выбраны.",
      "no_field_selected": "Ни одно поле не изменено.",
      "delete_success": "элемент(ов) удалено.",
      "update_success": "элемент(ов) обновлено."
    },
    "base": {
      "title": "Администрирование",
      "breadcrumb": "Админ",
      "toggle": "Свернуть меню",
      "logout_title": "Выход"
    },
    "superuser_wizard": {
      "title": "=== Создать суперпользователя ===",
      "algo_prompt": "[1/5] Алгоритм хэширования",
      "algo_argon2": "Argon2 (рекомендуется)",
      "algo_bcrypt": "Bcrypt",
      "algo_scrypt": "Scrypt",
      "algo_custom": "Пользовательский провайдер",
      "provider_path": "Путь к провайдеру",
      "invalid_path": "Неверный путь.",
      "username_prompt": "[2/5] Имя пользователя",
      "username_empty": "Имя пользователя не может быть пустым.",
      "username_taken": "Пользователь с таким именем уже существует.",
      "email_prompt": "[3/5] Email",
      "email_invalid": "Недействительный email.",
      "email_taken": "Пользователь с таким email уже существует.",
      "password_prompt": "[4/5] Пароль",
      "password_too_short": "Пароль должен содержать не менее 10 символов.",
      "confirm_prompt": "[5/5] Подтвердите пароль",
      "password_mismatch": "Пароли не совпадают. Попробуйте снова.",
      "review_algo": "  Алгоритм  : {}",
      "review_username": "  Логин     : {}",
      "review_email": "  Email     : {}",
      "review_password": "  Пароль    : ••••••••",
      "review_action": "Действие",
      "confirm_create": "Подтвердить и создать",
      "change_algo": "Изменить алгоритм",
      "modify_password": "Изменить пароль",
      "success": "✓ Суперпользователь успешно создан!",
      "id_line": "  ID        : {}",
      "username_line": "  Логин     : {}",
      "email_line": "  Email     : {}"
    },
    "builtin": {
      "invalid_id": "Недопустимый идентификатор.",
      "droit_resource_required": "Пожалуйста, выберите хотя бы один ресурс.",
      "droit_exists": "Право \"{}\" уже существует.",
      "groupe_exists": "Группа с именем \"{}\" уже существует.",
      "user_username_exists": "Имя пользователя \"{}\" уже занято.",
      "user_email_exists": "Адрес электронной почты \"{}\" уже зарегистрирован."
    }
  },
  "makemigrations": {
    "scanning": "Сканирование сущностей в '{}'...",
    "found_schema": "-> Схема найдена: {}",
    "found_extend": "-> Найдено расширение таблицы фреймворка: {}",
    "no_schema": "Функции schema() не найдены в '{}'.",
    "schema_count": "Найдено {} схем(а).",
    "updated_lib": "Обновлено {}",
    "no_changes": "Изменений не обнаружено. Ваша схема актуальна.",
    "destructive_detected": "Обнаружены деструктивные изменения:",
    "destructive_require_force": "Используйте --force для применения этих деструктивных изменений.",
    "generated": "Сгенерировано: {}",
    "snapshot_updated": "Снимок обновлён: {}",
    "seaorm_alter": "Сгенерирована миграция SeaORM ALTER: {}",
    "batch_up": "Сгенерирован пакет up: {}",
    "batch_down": "Сгенерирован пакет down: {}",
    "apply_hint": "Запустите 'sea-orm-cli migrate up' для применения.",
    "extend_unknown_table": "extend!{{}} : \"{}\" не является известной таблицей фреймворка. Разрешённые таблицы: {}. Для расширения таблицы приложения измените её model!{{}} напрямую.",
    "extend_invalid_syntax": "extend!{{}} : неверный синтаксис. Ожидается: table: \"имя_таблицы\", fields: {{ ... }}",
    "admin_positioned": "AdminTableMigration размещена после миграции '{}'",
    "files_ready": "{} файл(ов) готов(о) к миграции."
  },
  "migrate": {
    "applying": "Применение миграций из '{}'...",
    "run_hint": "Выполните: sea-orm-cli migrate up",
    "complete_up": "Миграция завершена.",
    "complete": "Откат завершён.",
    "available_for": "Доступные файлы отката для '{}':",
    "rolling_back_batch": "Откат пакета: {}",
    "done": "Готово: {}",
    "rolling_back": "Откат: {}",
    "no_applied_dir": "Каталог applied/ не найден.",
    "by_time_header": "by_time (полные пакеты):",
    "none_available": "Файлы отката отсутствуют.",
    "usage": "Использование:",
    "usage_files": "runique migration down --files <table/timestamp> [<table/timestamp> ...]",
    "usage_batch": "runique migration down --batch <timestamp>",
    "no_down": "Инструкции down не найдены.",
    "executing": "Выполняется: {}"
  },
  "reset": {
    "forgot_title": "Забыли пароль",
    "reset_title": "Новый пароль",
    "success_title": "Пароль сброшен",
    "email_label": "Адрес электронной почты",
    "new_password_label": "Новый пароль",
    "confirm_label": "Подтвердите пароль",
    "email_mismatch": "Адрес электронной почты не соответствует ссылке.",
    "invalid_link": "Недействительная ссылка.",
    "invalid_or_expired": "Ссылка для сброса недействительна или истекла.",
    "password_min_length": "Пароль должен содержать не менее {} символов.",
    "password_mismatch": "Пароли не совпадают.",
    "check_inbox": "Если этот адрес связан с аккаунтом, вы получите письмо для сброса пароля.",
    "email_subject": "Сброс пароля",
    "email_body": "<p>Здравствуйте, {},</p><p>Перейдите по ссылке ниже для сброса пароля (действительна 1 час):</p><p><a href=\"{}\">{}</a></p>"
  },
  "permission": {
    "col.id": "ID",
    "col.can_create": "Создание",
    "col.can_delete": "Удаление",
    "col.can_delete_own": "Удаление (своё)",
    "col.can_read": "Чтение",
    "col.can_update": "Изменение",
    "col.can_update_own": "Изменение (своё)",
    "col.groupes": "Группы",
    "col.resource_key": "Ресурс",
    "col.actions": "Действия"
  }
}
