// SPDX-License-Identifier: AGPL-3.0-only
// Copyright 2026-present the Unsloth AI Inc. team. All rights reserved. See /studio/LICENSE.AGPL-3.0

import type { DeepPartialMessageTree } from "../types";
import type { en } from "./en";

export const ru = {
  picker: {
    onDevice: "На устройстве",
    huggingFace: "Hugging Face",
    retry: "Повторить",
    loadMore: "Загрузить ещё",
    offlineTitle: "Нет подключения к сети",
    offlineBody:
      "Переключитесь на «Устройство», чтобы использовать локальные или кэшированные {noun}.",
    offlineSwitchDevice: "Устройство",
    searchAriaLabel: "Поиск: {noun}",
    modelSourceAriaLabel: "Источник модели",
    hubSectionAriaLabel: "Раздел Hub",
    modelDropped: "Больше не предлагается",
    modelDroppedByProvider: "{provider} · больше не предлагается",
    modelDisabled: "Не включена",
    modelDisabledByProvider: "{provider} · не включена",
    multipleMatches:
      "В категории «{noun}» найдено несколько совпадений. Выберите одно из списка.",
    rateLimitedTitle: "Достигнут лимит запросов Hugging Face",
    rateLimitedBody:
      "Подождите немного, затем повторите поиск в категории «{noun}».",
    hfToken: {
      label: "Токен HF",
      saved: "Сохранён",
      add: "Добавить",
      savedAriaLabel: "Токен Hugging Face сохранён",
      addAriaLabel: "Задать токен Hugging Face",
      savedHint: "Токен сохранён. Доступ проверяется при его использовании.",
      addHint:
        "Задайте токен для доступа к закрытым и защищённым репозиториям.",
    },
  },
  common: {
    cancel: "Отмена",
    close: "Закрыть",
    delete: "Удалить",
    done: "Готово",
    error: "Ошибка",
    export: "Экспорт",
    help: "Справка",
    loading: "Загрузка…",
    new: "Новое",
    rename: "Переименовать",
    save: "Сохранить",
    saving: "Сохранение…",
    search: "Поиск",
    shutdown: "Выключить",
  },
  shell: {
    beta: "BETA",
    brand: "unsloth",
    product: "Unsloth",
    accountMenu: "Меню аккаунта {name}",
    updateAvailable: "Доступно обновление",
    resize: {
      collapse: "Нажмите, чтобы свернуть",
      expand: "Нажмите, чтобы развернуть",
      drag: "Потяните, чтобы изменить размер",
    },
    aria: {
      home: "Главная Unsloth",
      closeSidebar: "Закрыть боковую панель",
      openSidebar: "Открыть боковую панель",
      resizeSidebar: "Изменить размер или свернуть боковую панель",
      resizeRunSettings: "Изменить размер или закрыть настройки запуска",
      openRunSettings: "Открыть настройки запуска",
      chatOptions: "Параметры чата",
      runOptions: "Параметры запуска",
    },
    navigation: {
      newChat: "Новый чат",
      returnToChat: "Вернуться к чату",
      returnToChats: "Вернуться к чатам ({count})",
      chatGenerating: "Генерация",
      compare: "Сравнить",
      search: "Поиск",
      hub: "Хаб моделей",
      projects: "Проекты",
      train: "Обучение",
      recipes: "Рецепты",
      images: "Изображения",
      video: "Видео",
      audio: "Аудио",
      trainChecking: "Проверка поддержки обучения на этой машине...",
      videoChecking: "Проверка поддержки видео на этой машине...",
      more: "Ещё",
      customizeSidebar: "Настроить боковую панель",
      newBadge: "Новое",
      export: "Экспорт",
      recents: "Недавние",
      noChatsYet: "Пока нет чатов",
      settings: "Настройки",
      api: "API",
      lightMode: "Светлая тема",
      darkMode: "Тёмная тема",
      guidedTour: "Обзор интерфейса",
      help: "Справка",
      logOut: "Выйти",
      shutdown: "Выключить",
    },
    notFound: {
      title: "Страница не найдена",
      description: "{path} не существует.",
      backToChat: "Вернуться к чату",
    },
    dialog: {
      deleteChat: {
        title: "Удалить чат",
        description: 'Вы уверены, что хотите удалить чат «{name}»?',
      },
      deleteRun: {
        title: "Удалить запуск обучения",
        description: 'Вы уверены, что хотите удалить запуск «{name}»?',
      },
      renameChat: {
        title: "Переименовать чат",
        placeholder: "Название чата",
      },
      renameRun: {
        title: "Переименовать запуск",
        placeholder: "Название запуска",
      },
    },
    toast: {
      cannotDeleteRunningRun: "Нельзя удалить выполняющийся запуск обучения",
      failedToDeleteChat: "Не удалось удалить чат",
      failedToDeleteRun: "Не удалось удалить запуск",
      failedToRenameChat: "Не удалось переименовать чат",
      failedToRenameRun: "Не удалось переименовать запуск",
    },
  },
  settings: {
    title: "Настройки",
    dialog: {
      title: "Настройки",
      description: "Управление настройками Unsloth.",
      closeAriaLabel: "Закрыть настройки",
      searchPlaceholder: "Поиск по настройкам…",
      searchNoResults: "Настройки не найдены.",
    },
    tabs: {
      general: "Общие",
      profile: "Профиль",
      appearance: "Оформление",
      resources: "Система",
      chat: "Чат",
      connections: "Подключения",
      apiKeys: "API",
      about: "О программе",
      data: "Данные",
      agents: "Агенты",
      debugging: "Журналы",
      voice: "Голос",
    },
    debugging: {
      logSection: "Файл журнала",
      source: "Файл журнала",
      sourceHint: "Средства запуска моделей ведут собственные журналы, поэтому причина неудачной загрузки или генерации чаще всего указана именно в них, а не в журнале сервера.",
      path: "Расположение",
      pathCopy: "Копировать путь",
      refreshSection: "Обновление",
      mode: "Режим",
      modeLive: "В реальном времени",
      modeInterval: "Каждые 3 секунды",
      modeManual: "Вручную",
      refreshNow: "Обновить сейчас",
      privacyNote: "В этом окне учётные данные скрыты. В файле на диске они не скрыты.",
      copyVisible: "Копировать видимую часть журнала",
      empty: "Пока ничего не записано.",
      disabled: "Запись журнала в файл отключена (UNSLOTH_STUDIO_NO_FILE_LOG=1).",
      missing: "Файл журнала не найден.",
      unreadable: "Не удалось прочитать файл журнала.",
      timeout: "Истекло время ожидания запроса журнала. Возможно, сервер недоступен.",
      droppedNotice: "Часть строк пропущена: журнал записывался быстрее, чем его удавалось читать.",
      morePending: "Ещё строки продолжают читаться; они появятся при следующем обновлении.",
      staleSession: "Запись журнала в файл отключена, поэтому это предыдущий сеанс, который не будет обновляться.",
      keywords: "отладка журнал журналы лог логи ошибка ошибки сбой трассировка диагностика поиск неисправностей debug log",
    },
    voice: {
      title: "Голос",
      description: "Микрофон, диктовка, распознавание речи и чтение вслух",
      dictation: {
        sectionTitle: "Диктовка",
        engineLabel: "Движок диктовки",
        engineBrowser: "Браузер",
        engineBrowserDescription:
          "Распознаёт речь через речевую службу вашего браузера. Выберите «Локальное распознавание», чтобы использовать модель STT.",
        engineModel: "Локальное распознавание",
        engineModelDescription:
          "Запускает модель распознавания речи (STT) локально и работает офлайн. Скачайте модель, затем загрузите её; после простоя она выгружается.",
        sttModelLabel: "Модель распознавания речи",
        sttModelDescription:
          "Выберите или найдите модель STT для локального запуска.",
        sttModelSearchPlaceholder: "Поиск модели",
        sttModelSearching: "Поиск на Hugging Face…",
        sttModelValidating: "Проверка совместимости с Whisper…",
        sttModelNoResults: "Модели Whisper не найдены",
        sttModelInvalid: "Этот репозиторий нельзя использовать для диктовки",
        sttModelFailed: "Не удалось загрузить модель STT",
        sttModelUnsupported: "Запись не поддерживается в этом браузере",
        sttChecking: "Проверка…",
        sttOnDemand: "Скачано",
        sttLoadingModel: "Загрузка модели…",
        sttReady: "Загружено на {device}",
        sttLoaded: "Загружено",
        sttUnavailable:
          "Компонент не установлен на этом сервере. Выполните `unsloth studio update`, чтобы включить локальную диктовку.",
        sttRetry: "Повторить",
        sttDownloadChecking: "Проверка состояния скачивания…",
        sttNotDownloaded: "Не скачано",
        sttDownloadStatusFailed: "Не удалось проверить состояние скачивания",
        sttDownload: "Скачать",
        sttDownloadConfirmTitle: "Скачать {model}?",
        sttDownloadConfirmBody:
          "Локальная диктовка работает полностью офлайн, но сначала ей нужна речевая модель {model}. Около {size}, скачивается один раз в ваш кэш Hugging Face.",
        sttDownloadConfirmBodyUnsized:
          "Локальная диктовка работает полностью офлайн, но сначала ей нужна речевая модель {model}. Она скачивается один раз в ваш кэш Hugging Face.",
        sttOpenVoiceSettings: "Открыть настройки «Голос»",
        sttDownloadStarted: "Скачивание {model}",
        sttDownloading: "Скачивание… {progress}%",
        sttCancelDownload: "Отмена",
        sttCancellingDownload: "Отмена скачивания…",
        sttCancelDownloadFailed: "Не удалось отменить скачивание",
        sttDownloadComplete: "Модель распознавания речи скачана",
        sttModelReady: "Модель {model} готова к диктовке",
        sttRecommended: "Рекомендуется",
        sttDownloadFailed: "Не удалось скачать модель распознавания речи",
        sttLoad: "Загрузить",
        sttUnload: "Выгрузить",
        sttUnloading: "Выгрузка…",
        microphoneLabel: "Микрофон",
        microphoneFallbackName: "Микрофон {index}",
        microphoneDescription: "Используется для диктовки",
        microphoneFallbackHint:
          "Используется для диктовки. Если речевой движок браузера не может работать с этим устройством, будет использовано системное устройство по умолчанию",
        microphoneGrantDescription:
          "Разрешите доступ к микрофону, чтобы видеть названия устройств",
        allowMicrophone: "Разрешить доступ к микрофону",
        micAccessBlocked:
          "Доступ к микрофону заблокирован. Разрешите доступ к микрофону для этой страницы Unsloth и повторите попытку.",
        micAccessUnsupported:
          "Доступ к микрофону не поддерживается в этом браузере или контексте.",
        systemDefault: "По умолчанию в системе",
        savedMicDisconnected: "Сохранённый микрофон (не подключён)",
        languageLabel: "Язык диктовки",
        languageDescription: "Язык для распознавания",
        languageAuto: "Автоматически (язык браузера)",
      },
      dictionary: {
        sectionTitle: "Словарь диктовки",
        sectionDescription:
          "Задайте, как диктовка записывает определённые слова и выражения",
        manageLabel: "Особые варианты написания",
        manage: "Управление",
        backToVoice: "Назад к настройкам голоса",
        addEntry: "Добавить запись",
        newEntryAria: "Новая словарная запись",
        entryPlaceholder: "Анна Иванова",
        entryAria: "Словарная запись {index}",
        removeEntryAria: "Удалить словарную запись {index}",
      },
      recents: {
        sectionTitle: "История диктовок",
        sectionDescription:
          "Каждая диктовка сохраняется здесь, чтобы вы могли восстановить текст",
        manageLabel: "История диктовок",
        manage: "Управление",
        pageDescription:
          "Каждая диктовка сохраняется. Просматривайте, копируйте и удаляйте их или открывайте чат, в котором диктовка использовалась.",
        searchPlaceholder: "Поиск по диктовкам",
        sortLabel: "Сортировать диктовки",
        sortNewest: "Сначала новые",
        sortOldest: "Сначала старые",
        sortAlpha: "От А до Я",
        noMatches: "Нет диктовок, соответствующих запросу",
        detailTitle: "Сохранённая диктовка",
        backToVoice: "Назад к настройкам голоса",
        backToRecents: "Назад к недавним диктовкам",
        view: "Посмотреть диктовку целиком",
        empty: "Диктовок пока нет",
        dictationColumn: "Диктовка",
        dateColumn: "Дата создания",
        copy: "Копировать диктовку",
        copied: "Скопировано в буфер обмена",
        copyFailed: "Не удалось скопировать в буфер обмена",
        delete: "Удалить диктовку",
        deleteTitle: "Удалить диктовку",
        deleteDescription:
          "Удалить эту сохранённую диктовку? Действие необратимо.",
        deleteLinkedDescription:
          "Удалить эту сохранённую диктовку? Можно также удалить чат, в котором она использовалась. Действие необратимо.",
        deleteWithChat: "Удалить чат и диктовку",
        deleteWithChatFailed: "Не удалось удалить чат",
        clear: "Очистить историю",
        clearTitle: "Очистить историю диктовок",
        clearDescription:
          "Удалить все сохранённые диктовки? Действие необратимо.",
        clearConfirm: "Очистить всё",
        showMore: "Показать ещё ({count})",
        openChat: "Открыть чат",
      },
      readAloud: {
        sectionTitle: "Чтение вслух",
        buttonLabel: "Кнопка чтения вслух",
        buttonDescription: "Показывать в ответах ассистента",
        engineLabel: "Движок TTS",
        engineSystemDescription: "Встроенные голоса устройства",
        engineStudioDescription:
          "Использует загруженную аудиомодель (например, Orpheus)",
        engineSystem: "Системные голоса",
        engineStudio: "Загрузить модель TTS",
        modelLabel: "Модель TTS",
        modelDescription:
          "Загрузите аудиомодель из списка моделей (например, Orpheus TTS)",
        voiceLabel: "Голос",
        voiceDescription: "Лучшие голоса на этом устройстве",
        speedLabel: "Скорость",
        pitchLabel: "Высота тона",
        volumeLabel: "Громкость",
        previewLabel: "Прослушать голос",
        previewDescription: "Воспроизвести короткий пример",
        previewFailed: "Не удалось воспроизвести пример синтеза речи",
        previewAction: "Прослушать",
        stopAction: "Остановить",
        ttsLabel: "Синтез речи",
        notSupported: "Не поддерживается в этом браузере",
      },
    },
    general: {
      title: "Общие",
      description: "Глобальные настройки Unsloth.",
      account: "Аккаунт",
      huggingFaceToken: "Токен Hugging Face",
      huggingFaceTokenDescription:
        "Используется для загрузки закрытых моделей и публикации артефактов.",
      hideToken: "Скрыть токен",
      showToken: "Показать токен",
      clearToken: "Очистить",
      checkingToken: "Проверка токена...",
      tokenValidated: "Токен проверен",
      password: "Пароль",
      passwordDescription: "Изменить пароль для этого аккаунта Unsloth.",
      passwordDialog: {
        trigger: "Изменить пароль",
        title: "Изменить пароль",
        description:
          "Введите текущий пароль и выберите новый (не менее {minLength} символов).",
        setTrigger: "Задать удалённый пароль",
        setTitle: "Задать удалённый пароль",
        setDescription:
          "Выберите пароль, с которым удалённые браузеры входят как unsloth (не менее {minLength} символов). Настольное приложение Unsloth продолжит входить автоматически.",
        setSubmit: "Задать пароль",
        setting: "Установка...",
        setDone: "Пароль задан.",
        currentPassword: "Текущий пароль",
        newPassword: "Новый пароль",
        confirmPassword: "Подтвердите новый пароль",
        currentTooShort:
          "Текущий пароль должен содержать не менее {minLength} символов.",
        newTooShort: "Новый пароль должен содержать не менее {minLength} символов.",
        mismatch: "Пароли не совпадают.",
        samePassword:
          "Новый пароль должен отличаться от текущего.",
        update: "Обновить пароль",
        updating: "Обновление...",
        updated: "Пароль обновлён.",
        updateFailed: "Не удалось обновить пароль.",
        newHasSpaces: "Новый пароль не может содержать пробелы.",
      },
      chatDefaults: "Настройки чата по умолчанию",
      autoTitleNewChats: "Автоматически называть новые чаты",
      autoTitleNewChatsDescription:
        "Создавать короткое название по первому сообщению.",
      helperLlm: {
        sectionTitle: "Вспомогательная LLM",
        preloadOnStartup: "Предзагружать вспомогательную LLM при запуске",
        preloadOnStartupDescription:
          "Скачивать вспомогательную модель AI Assist в фоновом режиме при запуске. По умолчанию выключено; AI Assist всё равно может скачать её по запросу.",
        disabledByEnv:
          "Отключено переменной UNSLOTH_HELPER_MODEL_DISABLE в окружении бэкенда.",
        loadError: "Не удалось загрузить настройки вспомогательной LLM.",
        saveError: "Не удалось сохранить настройки вспомогательной LLM.",
      },
      modelAutoSwitch: {
        sectionTitle: "Автопереключение модели (OpenAI API)",
        enable: "Переключать модель по запросу",
        enableDescription:
          "Загружать скачанную модель GGUF, указанную в запросе к API, перед обработкой запроса. По умолчанию выключено.",
        idleUnload: "Автовыгрузка при простое",
        idleUnloadDescription:
          "Освобождать VRAM после указанного числа секунд простоя. 0 оставляет модель загруженной; минимальное значение: 60.",
        idleSecondsAriaLabel: "Число секунд до автовыгрузки при простое",
        mediaIdleUnload: "Автовыгрузка при простое для изображений и видео",
        mediaIdleUnloadDescription:
          "Освобождать VRAM, выгружая модели изображений и видео после указанного числа секунд простоя. Это отдельная настройка: та, что выше, относится только к модели чата. 0 оставляет их загруженными; минимальное значение: 60.",
        mediaIdleSecondsAriaLabel:
          "Число секунд до автовыгрузки при простое для изображений и видео",
        mediaIdlePaused:
          "Приостановлено, пока включено «Держать модель в памяти GPU» или «Выгружать только модели, загруженные через API».",
        idleNeedsEnable: "Сначала включите «Переключать модель по запросу».",
        idleActiveViaEnv: "Активно через UNSLOTH_MODEL_IDLE_TTL.",
        loadError: "Не удалось загрузить настройки автопереключения модели.",
        saveError: "Не удалось сохранить настройки автопереключения модели.",
        idleError: "Введите 0, чтобы модель оставалась загруженной, или не менее 60 секунд.",
        autoDownload: "Скачивать недостающие модели",
        autoDownloadDescription:
          "Скачивает GGUF, указанный в запросе к API, если его ещё нет. Тогда любой, у кого есть ключ API, сможет расходовать место на диске и трафик.",
        keepKv: "Сохранять контекст чата при автовыгрузке",
        keepKvDescription:
          "Сохраняет KV-кеш перед автовыгрузкой при простое, чтобы возобновлённые чаты не перечитывали историю. До 10 ГБ на диске.",
        apiOnly: "Выгружать только модели, загруженные через API",
        apiOnlyDescription:
          "Автовыгрузка при простое оставляет в памяти модель, которую вы загрузили в Studio, и освобождает только те, что загрузил запрос через API.",
      },
      previewSharing: {
        sectionTitle: "Публикация предпросмотра",
        enableLabel: "Публичные ссылки предпросмотра",
        enableDescription:
          "Позволяет любому по подписанной ссылке общаться с готовой моделью без входа в систему. Отключите, чтобы закрыть публичный предпросмотр; опубликованные ссылки перестанут работать.",
        loadError: "Не удалось загрузить настройки публикации предпросмотра.",
        saveError: "Не удалось сохранить настройки публикации предпросмотра.",
        revokeLabel: "Отозвать все ссылки предпросмотра",
        revokeDescription:
          "Сменить секрет подписи, чтобы все опубликованные ссылки перестали работать. Ссылки, скопированные заново, продолжат работать.",
        revokeAction: "Отозвать ссылки",
        revoking: "Отзыв...",
        revokeConfirmTitle: "Отозвать все ссылки предпросмотра?",
        revokeConfirmDescription:
          "Все опубликованные ссылки предпросмотра немедленно перестанут работать. Это действие нельзя отменить.",
        revokeConfirmAction: "Отозвать все ссылки",
        revoked: "Все ссылки предпросмотра отозваны",
        revokeError: "Не удалось отозвать ссылки предпросмотра",
      },
      notifications: {
        sectionTitle: "Уведомления",
        showLlamaUpdates: "Уведомления об обновлениях llama.cpp",
        showLlamaUpdatesDescription:
          "Уведомлять о доступности новой сборки llama.cpp для запуска новых моделей. Отключите, если вы только обучаете модели.",
        showLoadedModels: "Индикатор загруженных моделей",
        showLoadedModelsDescription:
          "Показывает в правом нижнем углу небольшую карточку со всеми моделями, находящимися сейчас в памяти (чат, речь, изображения, видео), и кнопку для выгрузки каждой из них.",
      },
      startup: {
        sectionTitle: "Автозапуск",
        launchAtLogin: "Запускать Unsloth при входе в систему",
        launchAtLoginDescription:
          "Запускает Unsloth в фоновом режиме при входе в систему. Приложение остаётся в строке меню или системном трее, пока вы его не откроете.",

        closeToTray: "Закрывать в системный трей",
        closeToTrayDescription:
          "Оставлять Unsloth и его сервер работающими в фоне при закрытии главного окна.",
        closeToTraySaveError:
          "Не удалось обновить настройку закрытия в системный трей.",
        loadError: "Не удалось загрузить настройку автозапуска.",
        saveError: "Не удалось обновить настройку автозапуска.",
      },
      uploads: {
        sectionTitle: "Загрузки",
        maxUploadSize: "Лимит загрузки датасета для обучения",
        maxUploadSizeDescription: "По умолчанию {defaultSize} МБ.",
      },
      rag: {
        sectionTitle: "Документы и RAG",
        embeddingModel: "Модель эмбеддингов",
        embeddingModelDescription:
          "Модель Hugging Face или локальный путь для индексации и поиска по вашим документам. По умолчанию {defaultModel}.",
        reindexWarning:
          "Влияет только на вновь индексируемые документы. После смены модели загрузите существующие документы заново.",
        emptyError: "Введите ID модели Hugging Face или локальный путь.",
        loadError: "Не удалось загрузить настройку модели эмбеддингов.",
        saveError: "Не удалось сохранить модель эмбеддингов.",
        saved: "Модель эмбеддингов сохранена.",
        saveAnyway: "Всё равно сохранить",
        resetAction: "Восстановить значение по умолчанию",
      },
      storage: {
        sectionTitle: "Хранилище",
        modelsFolder: "Папка моделей",
        modelsFolderDescription: "Где хранятся загруженные модели.",
        openAction: "Открыть",
        copyAction: "Копировать путь",
        copied: "Путь скопирован",
        openError: "Не удалось открыть папку",
        copyError: "Не удалось скопировать путь",
      },
      resetPreferences: {
        sectionTitle: "Опасная зона",
        label: "Сбросить все локальные настройки",
        description:
          "Очищает только локальные настройки. Чаты, доступ по API и настройки в базе данных сохраняются.",
        action: "Сбросить настройки",
        confirmTitle: "Сбросить все локальные настройки?",
        confirmDescription:
          "Очищает только локальные настройки и перезагружает Unsloth. Чаты, доступ по API и настройки в базе данных сохраняются.",
        confirmAction: "Сбросить и перезагрузить",
      },
      permissions: {
        sectionTitle: "Разрешения",
        bypassLabel: "Разрешения инструментов",
        bypassDescription:
          "Как Unsloth подтверждает вызовы инструментов в чате (терминал, python, веб, MCP) перед запуском. Режим «Full access» отключает подтверждения и песочницу для кода.",
      },
    },
    profile: {
      title: "Профиль",
      description: "Как ваш профиль отображается в Unsloth.",
      changePicture: "Изменить фото профиля",
      displayName: "Отображаемое имя",
      nickname: "Как Unsloth к вам обращаться?",
      nicknamePlaceholder: "Псевдоним",
      nicknameSaved: "Предпочитаемое имя сохранено",
      avatarShape: "Форма фото профиля",
      avatarShapeCircle: "Круг",
      avatarShapeRounded: "Скруглённый",
      chooseSloth: "Или выберите ленивца",
      nameSaved: "Имя профиля сохранено",
      namePersistErrorTitle: "Не удалось сохранить имя профиля",
      namePersistErrorDescription:
        "Имя обновлено для этой сессии, но может не сохраниться после перезагрузки.",
      photoUpdated: "Фото профиля обновлено",
      photoPersistErrorTitle: "Не удалось сохранить фото профиля",
      photoPersistErrorDescription:
        "Фото обновлено для этой сессии, но может не сохраниться после перезагрузки.",
      photoUpdateErrorTitle: "Не удалось обновить фото профиля",
      imageUseError: "Не удалось использовать это изображение.",
      uploadPhoto: "Загрузить фото",
      removePhoto: "Удалить",
      pictureOptions: "Параметры фото профиля",
      greetingSloth: "Ленивец в приветствии",
      greetingSlothDescription: "Показывать ленивца в приветствии чата.",
      noPicture: "Нет фото профиля",
      noneLabel: "Нет",
      stats: {
        title: "Ваша статистика",
        subtitle:
          "Всё ниже считается по вашей собственной истории. Ничего не собирается и не отправляется в Unsloth.",
        retry: "Повторить",
        privacyNote:
          "Статистика рассчитывается по истории чатов и обучения, которая хранится в вашей установке Unsloth. Ничего не собирается и ничего не отправляется ни в Unsloth, ни третьим лицам.",
        emptyChats:
          "Чатов пока нет. Начните разговор, и статистика появится здесь.",
        lifetimeTokens: "Токенов за всё время",
        peakTokens: "Пиковый день",
        longestChat: "Самый длинный чат",
        currentStreak: "Текущая серия",
        longestStreak: "Самая длинная серия",
        activityTitle: "Активность по токенам",
        activityDescription: "Период: {weeks} · {total}",
        mode: {
          daily: "По дням",
          weekly: "По неделям",
          cumulative: "Накопительно",
        },
        cellTooltip: "{date} · {tokens}, {messages}",
        weekTooltip: "Неделя с {date} · {tokens}",
        less: "Меньше",
        more: "Больше",
        insightsTitle: "Сводка по активности",
        totalChats: "Всего чатов",
        totalMessages: "Всего сообщений",
        tokensIn: "Отправлено токенов",
        tokensOut: "Сгенерировано токенов",
        cachedTokens: "Токенов из кеша",
        cachedValue: "{tokens} ({percent}% ввода)",
        avgTokensPerChat: "В среднем токенов на чат",
        timeInChat: "Время в чате",
        activeDays: "Активных дней",
        toolCalls: "Вызовов инструментов",
        attachments: "Прикреплено файлов",
        avgSpeed: "Средняя скорость",
        bestSpeed: "Самый быстрый ответ",
        firstToken: "Среднее время до первого токена",
        tokensPerSecond: "{value} ток/с",
        topModelsTitle: "Самые используемые модели",
        topModelsDescription: "По количеству обработанных токенов",
        modelSummary: "{tokens} · {messages}",
        noModels: "Использование моделей пока не зафиксировано.",
        trainingTitle: "Обучение",
        trainingDescription: "Запуски дообучения в этом рабочем пространстве",
        trainingRuns: "Запуски",
        trainingCompleted: "Завершено",
        trainingSteps: "Шаги",
        trainingTokens: "Обработано токенов",
        trainingTime: "Время обучения",
        bestLoss: "Минимальная функция потерь",
        runSteps: "{steps}",
        runLoss: "loss {loss}",
      },
    },
    appearance: {
      title: "Оформление",
      description: "Как Unsloth выглядит на этом устройстве.",
      theme: {
        title: "Тема",
        label: "Цветовая схема",
        description: "Светлая, тёмная или как в системе.",
        system: "Системная",
        light: "Светлая",
        dark: "Тёмная",
      },
      palette: {
        label: "Цветовая палитра",
        description: "Цвета, используемые в Unsloth в светлой и тёмной теме.",
        standard: "Стандартная",
        classic: "Классическая",
        minimal: "Минималистичная",
      },
      custom: {
        reset: "Сбросить",
        resetAll: "Сбросить настройки оформления",
        preferencesTitle: "Параметры",
        colors: {
          lightGroup: "Светлая тема",
          darkGroup: "Тёмная тема",
          accent: "Акцент",
          background: "Фон",
          foreground: "Текст",
        },
        fontDefault: "По умолчанию",
        fontBundledGroup: "Встроенные",
        fontImportedGroup: "Импортированные",
        fontDeviceGroup: "На этом устройстве",
        fontFolderGroup: "Из папки",
        fontDeviceLoading: "Поиск шрифтов на устройстве…",
        fontSearch: "Поиск шрифтов…",
        fontNoResults: "Шрифты не найдены.",
        colorPicker: {
          hue: "Оттенок",
          hex: "Цвет в HEX",
          eyedropper: "Выбрать цвет с экрана",
        },
        uiFont: {
          label: "Шрифт интерфейса",
        },
        headingFont: {
          label: "Шрифт заголовков",
        },
        chatFont: {
          label: "Шрифт чата",
        },
        codeFont: {
          label: "Шрифт кода",
        },
        importFont: {
          upload: "Загрузить",
          scanFolder: "Выбрать папку",
          alreadyAvailable:
            "Этот шрифт уже доступен, поэтому используется имеющаяся копия.",
          folderNoFonts: "В этой папке не найдено файлов шрифтов.",
          remove: "Удалить",
          errorInvalidType:
            "Неподдерживаемый тип файла. Используйте .woff2, .woff, .ttf или .otf.",
          errorTooLarge: "Файл шрифта слишком большой (максимум 1,5 МБ).",
          errorLimit: "Можно импортировать не более 3 шрифтов.",
          errorStorageFull:
            "Недостаточно локального хранилища для этого шрифта. Сначала удалите один из импортированных.",
          errorFailed: "Не удалось загрузить этот файл шрифта.",
        },
        uiFontSize: {
          label: "Размер шрифта интерфейса",
          description: "Настройте базовый размер шрифта интерфейса Unsloth.",
        },
        codeFontSize: {
          label: "Размер шрифта кода",
          description: "Настройте базовый размер шрифта для кода.",
        },
        fontSmoothing: {
          label: "Сглаживание шрифтов",
          description: "Использовать сглаживание шрифтов.",
        },
        contrast: {
          label: "Контраст",
          description: "Выраженность границ и второстепенного текста.",
        },
        reduceMotion: {
          label: "Уменьшить анимацию",
          description: "Уменьшить анимацию или использовать системную настройку.",
          system: "Системная",
          on: "Вкл.",
          off: "Выкл.",
        },
        pointerCursors: {
          label: "Курсор-указатель",
          description:
            "Менять курсор на указатель при наведении на интерактивные элементы.",
        },
      },
      language: {
        title: "Язык",
        label: "Язык интерфейса",
        description: "Язык, используемый Unsloth.",
        autoDetect: "Автоопределение",
      },
      layout: {
        title: "Макет",
        compactSidebar: "Закреплять боковую панель по умолчанию",
        compactSidebarDescription:
          "Держать боковую панель развёрнутой, а не свёрнутой в значки.",
      },
      sidebarNav: {
        title: "Навигация боковой панели",
        description:
          "Закрепляйте вкладки боковой панели и меняйте их порядок. Незакреплённые вкладки собираются в меню «Ещё»; если незакреплённая вкладка всего одна, она просто скрывается, а не превращается в меню из одного пункта. «Новый чат» остаётся на месте.",
        dragToReorder: "Перетащите, чтобы изменить порядок",
        pinToSidebar: "Закрепить на боковой панели: {name}",
        moreHolds: "Ещё ({count})",
      },
      sidebarMenu: {
        title: "Меню боковой панели",
        description:
          "Показывайте, скрывайте и меняйте порядок пунктов в меню профиля на боковой панели. «Настройки», «Справка», «Выйти» и «Выключить» остаются на месте.",
        darkModeToggle: "Переключатель тёмной темы",
        dragToReorder: "Перетащите, чтобы изменить порядок",
      },
    },
    resources: {
      title: "Система",
      description: "Мониторинг оборудования и хранилища этого сервера Unsloth.",
      liveUpdates: "Обновления в реальном времени",
      floatingWindow: "Плавающее окно",
      disableOverlay: "Отключить оверлей",
      liveMonitor: {
        title: "Монитор в реальном времени",
        apiTitle: "Монитор API",
        summary: "Активные запросы, ошибки и использование токенов",
        status: "активных: {active} · недавних: {recent} · {model}",
        noModelLoaded: "модель не загружена",
        autoOpen: "Автоматически показывать плавающий монитор",
        autoOpenDescription:
          "Открывает небольшую панель при появлении трафика API.",
        cpu: "CPU",
        ram: "RAM",
        disk: "Диск",
        vram: "VRAM",
        cpuCores: "{logical} логич. / {physical} физич. ядер",
        currentLoad: "Текущая нагрузка",
        free: "{value} свободно",
        noGpu: "GPU не обнаружен",
      },
      gpu: {
        title: "Устройства GPU",
        ggufInference: "Инференс GGUF",
        unavailable: "недоступно",
        noGpu:
          "Доступные GPU не обнаружены. Выше показаны ресурсы только для CPU.",
        unknownDevice: "Неизвестный GPU",
        deviceWithIndex: "GPU {index}",
        vramUtilization: "VRAM",
        used: "{value} использовано",
        free: "{value} свободно",
        total: "{value} всего",
      },
      llamaBackend: {
        title: "Движок инференса GGUF",
        label: "Вычислительный бэкенд",
        description: "Бэкенд, на котором llama.cpp выполняет модели GGUF.",
        runningOn: "Сейчас llama.cpp работает на {backend}.",
        hint: "Устанавливает сборку llama.cpp для этого бэкенда и сохраняет выбор при обновлениях. Пригодится, если автоматический выбор падает или драйвер видеокарты его не поддерживает. Показаны только бэкенды, для которых есть сборка под этот компьютер; на обучение это не влияет.",
        autoWith: "Автоматически ({backend})",
        apply: "Применить",
        applying: "Установка...",
        applyHint: "Скачает новую сборку и перезапустит llama.cpp. Загруженная модель будет выгружена.",
        applyHintWithSize: "Скачает {size} и перезапустит llama.cpp. Загруженная модель будет выгружена.",
        switchedTo: "Теперь llama.cpp работает на {backend}.",
        switchFailed: "Не удалось изменить бэкенд llama.cpp.",
        switchInterrupted: "Переключение было прервано до завершения.",
        envLocked: "Значение {backend} задано переменной окружения UNSLOTH_LLAMA_CPP_BACKEND, она важнее этой настройки.",
        backends: {
          auto: "Автоматически",
          cpu: "CPU",
          cuda: "CUDA",
          rocm: "ROCm",
          vulkan: "Vulkan",
          metal: "Metal",
        },
        unsupported: {
          notInstalled: "Управляемая установка llama.cpp не найдена, поэтому менять нечего.",
          localLink: "llama.cpp, это локальный каталог, который вы подключили сами, и Unsloth его не заменяет.",
          sourceBuild: "Этот llama.cpp собран из исходников, его бэкенд нельзя переключить отсюда.",
          unresolved: "Не удалось проверить доступные бэкенды. Проверьте подключение и повторите попытку.",
        },
        // Не отображается: дополнительные слова для поиска по настройкам.
        llamaBackendKeywords:
          "llama.cpp backend gguf инференс cuda rocm hip vulkan metal cpu gpu ускоритель prebuilt переключить движок",
      },
      modelMemory: {
        title: "Память модели",
        keepResident: "Держать модель в памяти GPU",
        keepResidentDescription: "Остаётся в видеопамяти между запросами.",
        keepResidentHint: "Веса не возвращаются в системную ОЗУ, пока модель загружена. Отключает автовыгрузку по простою, а если веса действительно находятся в ОЗУ хоста (единая память или частичная выгрузка на GPU), дополнительно передаёт --mlock, чтобы ОС не вытесняла их и не загружала заново при следующем запросе.",
        noRamReserve: "Не резервировать системную ОЗУ под модель",
        noRamReserveDescription: "Не хранит полную копию в ОЗУ.",
        noRamReserveHint: "Веса передаются в видеопамять вместо хранения полной копии в ОЗУ. Сохраняет загрузку через отображение файла в память в llama.cpp и убирает --no-mmap и --mlock.",
        mlockVetoed: "--mlock остаётся выключенным: закрепление модели зарезервировало бы ОЗУ под неё целиком. Автовыгрузка по простою по-прежнему отключена.",
        memlockCapped: "Система ограничивает блокируемую память значением {limit}. Модель большего размера не будет закреплена полностью; увеличьте лимит через ulimit -l.",
        reloadRequired: "Перезагрузите модель, чтобы применить новые параметры памяти.",
        loadError: "Не удалось загрузить настройки памяти модели",
        saveError: "Не удалось сохранить настройки памяти модели",
        // Not rendered: extra terms the settings search matches these rows on.
        modelMemoryKeywords:
          "mlock memlock ulimit vram gpu память озу резидентный закрепить блокировать держать загружен выгрузка простой mmap no-mmap load-mode подкачка",
      },
      storage: {
        title: "Хранилище",
        systemDisk: "Системный диск",
        diskUsage: "{used} использовано / {total}",
        diskFree: "{free} свободно",
        modelsFolder: "Папка моделей",
        modelsFolderKeywords:
          "модели папка каталог путь расположение загрузки кэш хранилище диск перенести изменить models folder path hugging face",
        modelsFolderDescription: "Где хранятся загруженные модели.",
        modelsFolderHint: "Где хранятся загруженные модели. Измените путь, чтобы модели не занимали системный диск. Применяется только к новым загрузкам. Уже имеющиеся модели останутся на прежнем месте.",
        openAction: "Открыть",
        copyAction: "Копировать путь",
        copied: "Путь скопирован",
        openError: "Не удалось открыть папку",
        copyError: "Не удалось скопировать путь",
        futureDownloads: "Только новые загрузки",
        environmentManaged: "Управляется переменной окружения {variable}.",
        locationFree: "{free} свободно",
        changeAction: "Изменить",
        resetAction: "По умолчанию",
        chooseTitle: "Выбор папки для загрузки моделей",
        chooseAction: "Использовать для будущих загрузок",
        cacheSaved: "Папка для загрузки моделей обновлена",
        cacheSaveError: "Не удалось обновить папку для загрузки моделей",
        cachePickerError: "Не удалось открыть окно выбора папки",
      },
      environment: {
        title: "Окружение",
        backend: "Бэкенд",
        python: "Python",
        torch: "Torch",
        transformers: "Transformers",
        uptime: "Время работы",
        processMemory: "Память процесса",
        notInstalled: "Не установлено",
        unknown: "Неизвестно",
      },
    },
    agents: {
      title: "Агенты",
      description:
        "Подключение кодинг-агентов, таких как Claude Code и Codex, к локальной модели с помощью unsloth start.",
      intro:
        "подключает Claude Code, Codex, Hermes, OpenClaw, OpenCode и других агентов к модели, которую Unsloth обслуживает локально, полностью офлайн. Запускается OpenAI-совместимый сервер, а файлы конфигурации вашего агента остаются нетронутыми.",
      readDocs: "Открыть документацию",
      copy: "Копировать",
      copied: "Скопировано",
      commandBuilder: "Конструктор команды",
      agent: "Кодинг-агент",
      model: "Модель",
      searchModels: "Поиск моделей GGUF…",
      noModels: "Подходящих моделей GGUF нет.",
      showingModels:
        "Показано {shown} из {total} совпадений. Продолжайте вводить, чтобы сузить список.",
      quantization: "Квантизация",
      loadingQuantizations: "Загрузка квантизаций…",
      noQuantizations: "Без отдельной квантизации",
      recommended: "Рекомендуется",
      downloaded: "Скачано",
      quantizationLoadError:
        "Не удалось загрузить все квантизации. Команда использует доступное значение модели.",
      generatedCommand: "Сформированная команда",
      docs: "Документация",
      agentDocs: "Открыть документацию по настройке {agent}",
      copyGeneratedCommand: "Копировать сформированную команду",
      modelNote:
        "Codex требует модель GGUF, обслуживаемую llama-server. Другие агенты могут работать и с моделями на основе transformers; уберите --model, чтобы использовать модель, уже загруженную в Unsloth.",
      subagent: {
        title: "Использовать локальную модель в качестве субагента",
        description:
          "Оставьте {agent} на текущей модели и делегируйте отдельные задачи этой локальной модели Unsloth.",
        setupCommand: "Команда настройки",
        copySetupCommand: "Копировать команду настройки субагента",
        usagePrompt: "Затем в {agent} введите:",
        copyUsagePrompt: "Копировать промпт для вызова субагента",
        defaultPrompt:
          "Запусти локального агента, чтобы реализовать эту функцию.",
        opencodePrompt: "@unsloth найди причину этого падения теста",
      },
      quickstart: {
        title: "Собрать команду",
        description:
          "Запустите агента на модели, уже загруженной в Studio. Сначала загрузите модель, затем замените claude на любого поддерживаемого агента из списка ниже.",
        noneDetected:
          "В PATH не найдено ни одного поддерживаемого агента с интерфейсом командной строки.",
        installed: "Установлен",
      },
      supportedAgents: {
        title: "Поддерживаемые агенты",
        description: "Каждый агент запускается своей командой:",
        requiresGguf: "Нужна модель GGUF",
      },
      models: {
        title: "Выбор модели",
        description:
          "Используйте --model, чтобы выбрать модель и квантизацию, и --context-length, чтобы задать окно контекста. Укажите суффикс квантизации или явный флаг --gguf-variant.",
        suffixLabel: "С суффиксом квантизации",
        variantLabel: "С явным флагом варианта",
      },
      options: {
        title: "Основные параметры",
        description:
          "Сначала разбираются флаги Unsloth; всё, что не распознано, передаётся агенту без изменений.",
        model:
          "Выбирает модель. Без --model команда unsloth start использует модель, уже загруженную в Studio, и завершается ошибкой, если модели нет.",
        contextLength:
          "Задаёт запрашиваемую длину контекста (псевдоним: --max-seq-length).",
        ggufVariant: "Выбирает вариант квантизации GGUF.",
        loadIn4bit:
          "Включает или выключает 4-битную загрузку моделей Hugging Face.",
        tensorParallel:
          "Включает или выключает тензорный параллелизм на нескольких GPU.",
        serve: "Включает или выключает автоматический локальный сервер.",
        launch: "Запускает агента либо только выводит команду и окружение.",
        persist:
          "Сохраняет между запусками хранилище агента, управляемое Unsloth.",
        asSubagent:
          "Оставляет родительского агента на текущей модели и регистрирует Unsloth как локального субагента (Claude Code, Codex и OpenCode).",
        apiKey:
          "Передаёт ваш ключ API Unsloth (альтернатива: переменная UNSLOTH_API_KEY).",
        yolo:
          "Пропускает запросы подтверждения. Используйте только в доверенных средах.",
      },
      remote: {
        title: "Подключение к удалённому Studio",
        description:
          "Чтобы подключить unsloth start к удалённому экземпляру Studio, задайте перед запуском следующие переменные (или передайте --api-key напрямую):",
      },
      passthrough: {
        title: "Передача аргументов агенту",
        description:
          "Аргументы после флагов Unsloth передаются самому агенту, поэтому его собственные команды вроде resume продолжают работать:",
      },
      dryRun: {
        title: "Предпросмотр без запуска",
        description:
          "Добавьте --no-launch, чтобы вывести окружение и команду вместо запуска агента. Если задан --model, модель всё равно может быть определена и загружена.",
      },
    },
    chat: {
      title: "Чат",
      description: "Настройка поведения чата на этом устройстве.",
      modelSelection: {
        title: "Настройки выбора модели",
        expandQuantizations: "Раскрывать квантизации",
        expandQuantizationsDescription:
          "Включено: квантизации моделей GGUF из раздела «On Device» отображаются сразу. Выключено: нажмите модель, чтобы просмотреть её квантизации.",
        showAllQuantizations: "Показывать все квантизации",
        showAllQuantizationsDescription:
          "Включено: показываются все квантизации из раздела «On Device», в том числе не скачанные. Выключено: показываются только скачанные квантизации.",
      },
      menu: {
        title: "Меню чата",
        description:
          "Закрепляйте пункты в боковом меню «+» чата. Остальные будут доступны в разделе «Ещё».",
        chatWithFiles: "Чат с файлами (RAG)",
        mcp: "MCP",
        savedPrompts: "Сохранённые промпты",
        compareChat: "Сравнить чаты",
        exportChat: "Экспортировать чат",
      },
      showResponseModel: "Показывать модель в ответах",
      showResponseModelDescription:
        "Показывать метаданные модели в ответах ассистента.",
      modelDisclaimer: "Показывать предупреждение о модели",
      modelDisclaimerDescription:
        "Показывать сообщение «LLM могут ошибаться» под полем ввода.",
      thinking: {
        collapseByDefault: "Сворачивать размышления по умолчанию",
        collapseByDefaultDescription:
          "Размышления остаются свёрнутыми, пока модель думает, вместо автоматического раскрытия. Разверните блок, чтобы прочитать его.",
      },
      artifacts: {
        title: "Canvas",
        collapseHtmlBlocks: "Сворачивать блоки HTML",
        collapseHtmlBlocksDescription:
          "Режим Canvas автоматически сворачивает полный HTML. Включите, чтобы также сворачивать HTML-документы в блоках кода, когда Canvas выключен.",
        allowNetworkAccess: "Разрешить сетевой доступ Canvas",
        allowNetworkAccessDescription:
          "Позволяет предпросмотрам Canvas загружать скрипты, стили, шрифты, медиа и сетевые ресурсы из CDN. Оставьте выключенным для полностью офлайн-предпросмотров.",
        blockedBanner: "Заблокирован {count} внешний ресурс с {hosts}.",
        blockedBannerPlural: "Заблокировано внешних ресурсов: {count} с {hosts}.",
        blockedBannerAction: "Разрешить для этого Canvas",
      },
      data: "Данные",
      exportHistory: "Экспортировать историю чатов",
      exportHistoryDescription: "Скачать все чаты и сообщения в формате JSON.",
      exportAction: "Экспорт",
      exportingAction: "Экспорт…",
      exportConversations: "Экспортировать «Недавние» и проекты",
      exportConversationsDescription:
        "Скачать «Недавние» или «Недавние» вместе с чатами проектов в формате Raw JSONL, CSV или ShareGPT JSONL, объединённо или по чатам.",
      exportConversationsAction: "Экспорт",
      exportScopeRecents: "Недавние",
      exportScopeAll: "Недавние + проекты",
      exportCombinedSuffix: "(объединённо)",
      exportPerChatSuffix: "(по чатам)",
      importChats: "Импортировать чаты",
      importChatsDescription:
        "Импортируйте экспорт Open WebUI, JSONL, NDJSON или CSV в Недавние.",
      importChatsAction: "Импорт",
      importNoConversations: "В файле не найдено диалогов.",
      importedOneChat: "Импортирован 1 диалог в «Недавние».",
      importedChatCount: "Импортировано диалогов в «Недавние»: {count}.",
      importingChats: "Импорт чатов: пока {count} ({percent}%)...",
      importedChatCountPartial: "Импортировано {count} бесед в Недавние; {failed} не удалось сохранить.",
      importFailed: "Импорт не удался.",
      clearHistory: "Очистить историю чатов",
      clearHistoryDescription: "Удалить историю чатов с этого устройства.",
      clearAction: "Очистить",
      clearAllChats: "Очистить все чаты",
      clearAllChatsDescription: "Безвозвратно удалить все чаты на этом устройстве.",
      noChatsToClear: "Нет чатов для очистки.",
      clearOneChatDescription:
        "Безвозвратно удалить единственный чат на этом устройстве.",
      clearChatCountDescription:
        "Безвозвратно удалить все чаты на этом устройстве: {count}.",
      clearChatsAction: "Очистить чаты",
      clearOneChatTitle: "Очистить 1 чат?",
      clearChatsTitle: "Очистить чаты ({count})?",
      clearChatsConfirmDescription:
        "Безвозвратно удаляет все чаты на этом устройстве. Это действие нельзя отменить.",
      clearingAction: "Очистка…",
      clearOneChatAction: "Очистить 1 чат",
      clearChatCountAction: "Очистить чаты ({count})",
      clearedAllChats: "Все чаты очищены",
      clearedOneChat: "Очищен 1 чат",
      clearedChatCount: "Очищено чатов: {count}",
      someChatsCouldNotBeCleared: "Некоторые чаты не удалось очистить",
      chatsClearedRemainOne:
        "Очищено чатов: {clearedCount}; остался 1 чат. Повторите попытку.",
      chatsClearedRemain:
        "Очищено чатов: {clearedCount}; осталось чатов: {remainingCount}. Повторите попытку.",
      oneChatClearedRemain:
        "Очищен 1 чат; осталось чатов: {remainingCount}. Повторите попытку.",
      oneChatClearedRemainOne: "Очищен 1 чат; остался 1 чат. Повторите попытку.",
      storageClearFailedOne:
        "Не удалось очистить хранилище; возможно, остался 1 чат. Повторите попытку.",
      storageClearFailed:
        "Не удалось очистить хранилище; возможно, осталось чатов: {count}. Повторите попытку.",
      failedToClearChats: "Не удалось очистить чаты",
    },
    data: {
      title: "Данные",
      backToData: "Вернуться к данным",
      exportFailed: "Не удалось экспортировать чаты",
      description:
        "Управление историей чатов и загруженными файлами, которые хранятся на этом устройстве.",
      archivedChats: "Архивные чаты",
      archivedChatsDescription:
        "Просматривайте чаты, отправленные в архив, и управляйте ими.",
      archivedImages: "Архивные изображения",
      archivedImagesDescription: "Просмотр и управление изображениями, которые вы архивировали.",
      archivedVideos: "Архивные видео",
      archivedVideosDescription: "Просмотр и управление видео, которые вы архивировали.",
      manageAction: "Управлять",
      exportArchivedChats: "Экспорт",
      exportingArchivedChats: "Экспорт…",
      exportedOneArchivedChat: "Экспортирован 1 архивный чат",
      exportedArchivedChatCount: "Экспортировано архивных чатов: {count}",
      noArchivedChatsToExport: "Нет архивных чатов для экспорта.",
      failedToExportArchivedChats: "Не удалось экспортировать архивные чаты",
      archiveAllChats: "Архивировать все чаты",
      archiveAllChatsDescription:
        "Переносит в архив все чаты из «Недавних» и проектов.",
      noChatsToArchive: "Нет чатов для архивации.",
      archiveAllAction: "Архивировать все",
      archivingAction: "Архивация…",
      archiveAllChatsTitle: "Архивировать все чаты?",
      archiveAllChatsConfirmDescription:
        "Переносит в архив все чаты на этом устройстве. Архивные чаты остаются доступными, их можно вернуть из архива в любой момент.",
      archivedAllChats: "Все чаты архивированы",
      archivedOneChat: "Архивирован 1 чат",
      archivedChatCount: "Архивировано чатов: {count}",
      failedToArchiveChats: "Не удалось архивировать чаты",
      confirmBeforeDeleting: "Подтверждать перед удалением",
      confirmBeforeDeletingDescription:
        "Запрашивает подтверждение перед удалением чата. Отключите, чтобы удалять сразу.",
      filesSection: "Файлы",
      uploadedFiles: "Загруженные файлы",
      uploadedFilesDescription:
        "Просматривайте файлы, загруженные в чаты, проекты и базы знаний, и управляйте ими.",
      fineTuneExport: "Использовать чаты как обучающие данные",
      fineTuneExportDescription:
        "Создайте из своих чатов датасет JSONL для дообучения. Загрузите его в «Обучение», доработайте в «Рецептах» или экспортируйте.",
      fineTuneExportAction: "Экспорт в JSONL",
      fineTuneRunAction: "Запустить",
      fineTuneExportingAction: "Экспорт…",
      fineTuneOpenRecipesAction: "Открыть в «Рецептах»",
      fineTuneOpeningRecipesAction: "Открытие…",
      fineTuneTrainAction: "Загрузить во вкладку «Обучение»",
      fineTuneTrainingAction: "Загрузка…",
      fineTuneExportFailed: "Не удалось экспортировать обучающие данные",
      fineTuneRecipeFailed: "Не удалось открыть чаты в «Рецептах»",
      fineTuneTrainFailed:
        "Не удалось загрузить датасет во вкладку «Обучение»",
    },
    connections: {
      title: "Подключения",
      description: "Управление провайдерами и внешними подключениями.",
    },
    apiKeys: {
      title: "API",
      description: "Доступ к Unsloth через OpenAI-совместимый API.",
      readDocs: "Читать документацию API",
      noAccess: "Доступа к API пока нет.",
      accessTokens: "Токены доступа",
      loadError: "Не удалось загрузить доступ к API.",
      createError: "Не удалось создать токен доступа.",
      revokeError: "Не удалось отозвать токен доступа.",
      never: "Никогда",
      tokenNamePlaceholder: "Имя токена (например, production)",
      newAccessTokenName: "Имя нового токена доступа",
      createToken: "Создать токен",
      creating: "Создание...",
      newTokenCreated: "Новый токен доступа создан",
      accessTokenCopied: "Токен доступа скопирован",
      copyAccessToken: "Копировать токен доступа",
      copyNow: "Скопируйте сейчас: он больше не будет показан.",
      usageExamples: "Примеры использования",
      usageTools: "Инструменты",
      exampleCurlTools: "curl + инструменты",
      examplePythonTools: "Python + инструменты",
      exampleJavaScriptTools: "JavaScript + инструменты",
      exampleCurlAdvanced: "curl + расширенное",
      examplePythonAdvanced: "Python + расширенное",
      exampleJavaScriptAdvanced: "JavaScript + расширенное",
      osUnix: "Linux / macOS / WSL",
      osWindows: "Windows",
      secureHttps: "Защищённый HTTPS",
      secureHttpsHint:
        "Порт, привязанный к адресу 0.0.0.0, по-прежнему доступен глобально. Для полной безопасности запустите Unsloth с флагом --secure, чтобы оставить доступ только по этой HTTPS-ссылке.",
      copyTunnelUrl: "Копировать URL туннеля",
      copySnippet: "Копировать фрагмент",
      copy: "Копировать",
      copied: "Скопировано",
      setupDocs: "Документация по настройке:",
      codingAgents: "Кодинг-агенты",
      codingAgentsHint:
        "Запустите кодинг-агента, подключив его к этому серверу. Он будет использовать загруженную модель; локальный сервер автоматически создаст ключ API, а удалённый добавит его в команду.",
      codingAgentsSwap: "Замените claude на codex, openclaw, opencode или hermes.",
      codingAgentDetected: "Установлен на этой машине",
      codingAgentsDetectedHint: "Обнаружены на этой машине: {agents}.",
      relativeNever: "никогда",
      relativeJustNow: "только что",
      expired: "истёк",
      today: "сегодня",
      created: "Создан {value}",
      used: "Использование: {value}",
      expires: "Срок действия: {value}",
      actionsFor: "Действия для {name}",
      copyPrefix: "Копировать префикс",
      revokeToken: "Отозвать токен",
      revokeTitle: 'Отозвать токен доступа «{name}»?',
      revokeDescription:
        "Приложения, использующие этот токен, немедленно потеряют доступ. Это действие нельзя отменить.",
      revokeAction: 'Отозвать «{name}»',
      revoking: "Отзыв...",
      usageNoModel:
        "Загрузите или скачайте модель, чтобы увидеть готовые к запуску примеры. На этом сервере пока нет модели, которую можно подставить в примеры.",
    },
    about: {
      title: "О программе",
      description:
        "Документация, заметки о выпусках, обратная связь и сведения о сборке.",
      studioVersion: "Версия Unsloth",
      packageVersion: "Версия пакета",
      desktopAppVersion: "Версия настольного приложения",
      desktopAppVersionUnavailable: "Недоступно",
      llamaCppVersion: "Версия llama.cpp",
      hardware: "Оборудование",
      gpu: "GPU",
      cuda: "CUDA",
      rocm: "ROCm",
      xpu: "XPU",
      updates: "Обновление",
      help: "Справка",
      documentation: "Документация",
      releaseNotes: "Заметки о выпуске",
      whatsNew: "Что нового",
      feedback: "Обратная связь",
      reportIssue: "Сообщить о проблеме",
      license: {
        sectionTitle: "Лицензия",
        studioLabel: "Unsloth",
        studioLicense: "AGPL-3.0",
        studioDescription:
          "Исходный код открыт и распространяется по лицензии GNU AGPL v3.0.",
        libraryLabel: "Unsloth Core",
        libraryLicense: "Apache-2.0",
        libraryDescription: "Распространяется по лицензии Apache 2.0.",
      },
      dangerZone: "Опасная зона",
      shutDownStudio: "Выключить Unsloth",
      shutDownStudioDescription:
        "Останавливает сервер Unsloth и завершает вашу сессию.",
      shutDown: "Выключить",
      update: {
        title: "Обновить Unsloth",
        commandText: "Текст «{label}»",
        copied: "Скопировано",
        copyCommand: "Копировать команду",
        commandCopied: "Скопировано: {label}",
        copyNamedCommand: "Копировать «{label}»",
        checkingInstall: "Проверка способа установки Unsloth...",
        installIntro: "Чтобы установить или обновить Unsloth:",
        localUpdateHeading: "Локальное обновление",
        installCommandUnix: "Команда установки для macOS/Linux",
        installCommandWindows: "Команда установки для Windows",
        localInstallDetected:
          "Обнаружена установка из локальной рабочей копии. Обновляйте Unsloth из исходной рабочей копии, чтобы не заменить эту установку пакетом из PyPI.",
        pullThenUpdate:
          "Загрузите последние изменения, затем запустите локальный установщик:",
        gitPullCommand: "Команда git pull",
        localInstallerCommand: "Команда локального установщика",
        sourceInstallDetected:
          "Обнаружена установка из исходников или VCS-пакета. Переустановите из исходного локального пути или Git URL.",
        repoCheckoutFallback:
          "Если рабочая копия репозитория сохранилась, запустите из неё локальный установщик:",
        restartAfterUpdate: "После обновления перезапустите Unsloth.",
        desktopManaged:
          "Настольное приложение автоматически проверяет наличие новых версий. Здесь также можно в любое время проверить наличие обновлений или установить их.",
        desktopReady: "Обновления настольного приложения",
        desktopReadyDescription:
          "Проверьте, доступна ли более новая версия настольного приложения.",
        desktopChecking: "Проверка обновлений",
        desktopCheckingDescription: "Обычно это занимает несколько секунд.",
        desktopAvailable:
          "Доступна версия {version} настольного приложения",
        desktopAvailableDescription:
          "Установите обновление сейчас. После установки настольное приложение перезапустится.",
        desktopExternalServer:
          "Выполните `unsloth studio update` в терминале, из которого был запущен сервер.",
        desktopManualInstall:
          "Откройте страницу выпуска, чтобы установить последнюю версию пакета для Linux.",
        desktopCheckFailed: "Не удалось проверить наличие обновлений",
        desktopCheckFailedDescription:
          "Проверьте подключение к сети и повторите попытку.",
        desktopCurrent:
          "Установлена последняя версия настольного приложения",
        desktopCurrentDescription:
          "Unsloth продолжит автоматически проверять наличие обновлений.",
        checkForUpdates: "Проверить наличие обновлений",
        checkAgain: "Проверить снова",
        retryCheck: "Повторить попытку",
        checking: "Проверка…",
        updateNow: "Обновить сейчас",
        openReleasePage: "Открыть страницу выпуска",
        unknownInstall:
          "Не удалось определить способ установки Unsloth. Для установки через установщик или PyPI используйте команды выше.",
        localCheckout:
          "Для установки из локальной рабочей копии запустите установщик из этой копии:",
        docs: "Документация по установке:",
        docsInstall: "Установка",
        docsUpdating: "Обновление",
        docsMac: "Mac",
        docsWindows: "Windows",
      },
    },
  },
  studio: {
    imageTraining: "Обучение изображений",
    goToImageTraining: "Перейти к обучению изображений",
    routeTitle: "Обучение",
    wizard: {
      modelTitle: "Модель",
      modelDescription: "Выберите модель и метод обучения",
      datasetTitle: "Датасет",
      datasetDescription: "Выберите или загрузите данные для обучения",
      paramsTitle: "Параметры",
      paramsDescription: "Настройте параметры обучения",
      configTitle: "Конфигурация",
      configDescription: "Сохраняйте и загружайте конфигурации",
      modelLabel: "Модель",
      methodLabel: "Метод",
      datasetLabel: "Датасет",
      modelTooltip: "Базовая модель, которую вы хотите дообучить.",
      methodTooltip: "Как обучается модель. LoRA и QLoRA обновляют небольшие адаптеры вместо всех весов.",
      datasetTooltip: "Обучающие данные для дообучения модели.",
      hfTokenDescription:
        "Необходим для моделей и наборов данных с ограниченным или закрытым доступом.",
      uploadLocalLabel: "Или загрузите локальный файл",
      sourceBrowse: "Обзор",
      releaseToUpload: "Отпустите для загрузки",
      loadYaml: "Загрузить YAML",
      saveYaml: "Сохранить YAML",
      resetDefaults: "Сбросить по умолчанию",
      cachedModelGoneTitle: "Кэшированная модель больше недоступна",
      cachedModelGoneDescription:
        "Файлов модели больше нет на этом устройстве, поэтому при запуске обучения они будут загружены снова.",
      cachedDatasetGoneTitle: "Кэшированный датасет больше недоступен",
      cachedDatasetGoneDescription:
        "Файлов датасета больше нет на этом устройстве, поэтому при запуске обучения они будут загружены снова.",
    },
    preview: {
      title: "Предпросмотр запуска",
      ready: "Готово",
      notReady: "Не готово",
      modelPending: "Ожидание модели",
      datasetPending: "Ожидание датасета",
      method: "Метод",
      length: "Длительность",
      stepZero: "{count} шагов",
      step: "{count} шаг",
      stepTwo: "{count} шага",
      stepFew: "{count} шага",
      stepMany: "{count} шагов",
      steps: "{count} шагов",
      epochZero: "{count} эпох",
      epoch: "{count} эпоха",
      epochTwo: "{count} эпохи",
      epochFew: "{count} эпохи",
      epochMany: "{count} эпох",
      epochs: "{count} эпохи",
      batch: "Батч",
      context: "Контекст",
      lr: "LR",
      hardware: "Оборудование",
      noGpu: "GPU не обнаружен",
      hfToken: "Токен HF",
      saved: "Сохранён",
      notSet: "Не задан",
      files: "Файлы",
      model: "Модель",
      dataset: "Датасет",
      downloadsOnStart: "Будет загружено при запуске",
      continuesOnStart: "Будет продолжено при запуске",
      noticeModelDownload:
        "Этой модели пока нет на устройстве. При запуске обучения она будет загружена автоматически.",
      noticeModelPartial:
        "Перед загрузкой модели обучение завершит скачивание недостающих файлов.",
      noticeDatasetDownload:
        "Этого датасета пока нет на устройстве. При запуске обучения он будет загружен автоматически.",
      noticeDatasetPartial:
        "Перед чтением датасета обучение завершит скачивание недостающих файлов.",
      noticeTransformersUpgrade:
        "Ни одна установленная версия transformers пока не поддерживает эту архитектуру. При запуске сначала будет предложено установить transformers {version}.",
      noticeSixteenBitOnly:
        "Эта архитектура обучается в 16-битном LoRA: 4-битный режим недоступен, поэтому запуску нужно значительно больше VRAM, чем QLoRA.",
      noticeInstallSwitchesSixteenBit:
        "Установка этого выпуска вместо использования собственного кода модели переводит запуск в 16-битный LoRA, которому нужно значительно больше VRAM, чем QLoRA.",
      advancedSettings: "Расширенные настройки",
      defaultAdvancedSettings: "По умолчанию",
      nonDefaultAdvancedSettings: "Нестандартных: {count}",
    },
    datasetPicker: {
      noun: "датасеты",
      selectDataset: "Выберите датасет",
      hubPlaceholder: "Поиск датасетов Hugging Face...",
      devicePlaceholder: "Поиск локальных датасетов...",
      useAsHubDataset: "Использовать как датасет Hugging Face",
      hfCacheLabel: "Кэш HF",
      sourceRecipe: "Рецепт",
      sourceUpload: "Загрузка",
      sourceLocal: "Локальный",
      scanningLocal: "Сканирование датасетов на этом устройстве…",
      couldntScan: "Не удалось просканировать локальные датасеты",
      someLocationsUnscanned:
        "Не удалось просканировать некоторые расположения датасетов.",
      noLocalDatasets:
        "На этом устройстве пока ничего нет. Скачайте датасет с Hugging Face, создайте его в разделе «Рецепты» или загрузите файл.",
      openDataRecipes: "Открыть рецепты данных",
      searchingHub: "Поиск в Hugging Face…",
      noDatasetsFound: "Датасеты не найдены.",
      tokenRejectedTitle: "Токен Hugging Face отклонён",
      tokenRejectedBody:
        "Обновите токен в разделе «Настройки» → «Общие», затем повторите попытку.",
      hubUnreachable: "Не удалось подключиться к Hugging Face",
      cantUseDataset: "Датасет нельзя использовать",
      reasonInvalidHubId:
        "Введите допустимый ID датасета Hugging Face: repo или owner/repo. Используйте только латинские буквы, цифры, ., _ или - (не более 96 символов в каждой части).",
    },
    modelPicker: {
      noun: "модели",
      selectModel: "Выберите модель",
      hubPlaceholder: "Найдите или вставьте ID Hugging Face...",
      devicePlaceholder:
        "Найдите локальную модель или вставьте путь к папке...",
      useAsHubModel: "Использовать как модель Hugging Face",
      useAsLocalPath: "Использовать как локальный путь",
      hfCacheLabel: "Кэш HF",
      sourceModelsFolder: "Папка моделей",
      sourceHfCache: "Кэш HF",
      sourceLmStudio: "LM Studio",
      sourceOllama: "Ollama",
      sourceCustomFolder: "Пользовательская папка",
      sourceLocalModel: "Локальная модель",
      scanningLocal: "Сканирование локальных моделей…",
      couldntScan: "Не удалось просканировать локальные модели",
      someLocationsUnscanned:
        "Не удалось просканировать некоторые локальные расположения.",
      noLocalModels: "Локальные модели не найдены.",
      noLocalModelsHint:
        "Вставьте путь к папке выше или переключитесь на Hugging Face.",
      searchingHub: "Поиск в Hugging Face…",
      noModelsFound: "Модели не найдены.",
      tokenRejectedTitle: "Токен Hugging Face отклонён",
      tokenRejectedBody:
        "Обновите токен в разделе «Настройки» → «Общие», затем повторите попытку.",
      hubUnreachable: "Не удалось подключиться к Hugging Face",
      cantUseModel: "Модель нельзя использовать для обучения",
      reasonTypeMismatch:
        "Эта модель не соответствует типу обучения, выбранному на предыдущем шаге.",
      reasonInvalidHubId:
        "Введите допустимый ID модели Hugging Face: repo или owner/repo. Используйте только латинские буквы, цифры, ., _ или - (не более 96 символов в каждой части).",
      reasonEmptyId: "Введите ID модели или путь к локальной модели.",
      reasonGguf: "Модели GGUF нельзя использовать для обучения.",
      reasonAdapter:
        "Выходные файлы адаптера нельзя использовать как базовые модели для обучения.",
      reasonNotTrainable: "Эта модель на устройстве не поддерживает обучение.",
      reasonUnsupportedFormat:
        "Этот формат модели не поддерживается для обучения.",
      vramNeeds: "Требуется ~{est} ГБ VRAM (GPU: {total} ГБ)",
      vramTight: "~{est} ГБ VRAM (впритык для {total} ГБ)",
      vramApprox: "~{est} ГБ VRAM",
      vramOomBadge: "OOM",
      vramTightBadge: "Впритык",
    },
    methods: {
      qlora: {
        label: "QLoRA",
        hint: "4-битная квантизация. Минимум VRAM и самый быстрый запуск.",
        note: "4 бита",
      },
      lora: {
        label: "LoRA",
        hint: "16-битные адаптеры. Баланс качества и памяти.",
        note: "16 бит",
      },
      full: {
        label: "Полное дообучение",
        hint: "Обучает все веса. Максимальное качество и расход VRAM.",
        note: "fp16",
      },
      cpt: {
        label: "Продолженное предобучение",
        hint:
          "Продолженное предобучение для новых предметных областей или языков.",
        note: "продолженное",
      },
    },
    subtitles: {
      configure: "Настройте и запустите обучение",
      trainingInProgress: "Обучение выполняется",
      viewPastRuns: "Просмотр прошлых запусков обучения",
      viewingPastRun: "Просмотр прошлого запуска",
    },
    tabs: {
      configure: "Настройка",
      currentRun: "Текущий запуск",
      history: "История",
    },
    loadingRuntime: "Загрузка среды обучения...",
    checkingSupport: "Проверка поддержки обучения на этой машине...",
    backToHistory: "Назад к истории",
    dataset: {
      selectors: {
        subset: "Поднабор",
        subsetTooltip:
          "Выберите поднабор (конфигурацию) датасета для использования.",
        trainSplit: "Обучающая выборка",
        trainSplitTooltip: "Выберите выборку для обучения.",
        evaluationSplit: "Оценочная выборка",
        evaluationSplitTooltip:
          "Выберите выборку для оценки. «Нет» означает, что оценка во время обучения выполняться не будет.",
        selectSubset: "Выберите поднабор...",
        selectSplit: "Выберите выборку...",
        none: "Нет",
        loading: "Загрузка конфигураций и выборок датасета...",
        manualTitle: "Введите параметры датасета вручную",
        manualDescription:
          "Введите точные имена конфигурации и выборок Hugging Face, которые нужно использовать.",
        manualSubsetPlaceholder: "Необязательное имя конфигурации",
        manualRequired: "Необходимо указать обучающую выборку.",
        manualTooLong: "Используйте не более 128 символов.",
        manualInvalid: "Это значение содержит неподдерживаемые символы.",
      },
      sourceAriaLabel: "Источник датасета",
      localDataset: "Локальный датасет",
      localDatasetRows: " / {count} строк",
      huggingFaceDataset: "Датасет Hugging Face",
      localDatasetMetadata: "Метаданные локального датасета",
      dataRecipeOutput: "Вывод Data Recipe.",
      rows: "Строки",
      columns: "Столбцы",
      batches: "Батчи",
      updated: "Обновлено",
      evalDataset: "Датасет для оценки",
      uploading: "Загрузка...",
      uploadEvalFile: "Загрузить файл для оценки",
      fileTooLarge: "Файл слишком большой",
      fileTooLargeDescription:
        "Размер файла {file} — {size}. Для загрузки обучающих данных поддерживается размер до {limit}.",
      documentRedirect: {
        title: "Сначала преобразуйте этот файл",
        genericFile: "Этот файл",
        description:
          "{file} — это исходный материал, а не готовый датасет для обучения. Преобразуйте документ в датасет с помощью Data Recipes, затем вернитесь сюда для дообучения.",
        nextStepTitle: "Рекомендуемый следующий шаг",
        nextStepDescription:
          "Откройте Learning Recipes и начните с рецепта на основе документов, например PDF grounded QA.",
        openAction: "Открыть Learning Recipes",
      },
      evalDatasetDescription:
        "Необязательно. Если не указан, небольшая часть будет выделена из обучающих данных.",
      advanced: "Дополнительно",
      targetFormat: "Целевой формат",
      targetFormatTooltip:
        "Формат ваших обучающих данных. Автоопределение работает для большинства датасетов.",
      streamingInfoAriaLabel: "Информация о потоковой передаче датасета",
      streaming: {
        label: "Включить потоковую передачу",
        description:
          "Передавать текстовые датасеты Hugging Face потоком вместо их скачивания.",
        unavailable: "Потоковая передача недоступна. Чтобы включить её:",
        completionsUnavailable:
          "Недоступно, пока включена потоковая передача датасета.",
        blockers: {
          source:
            "Используйте датасет Hugging Face, а не локальный файл или источник S3.",
          maxSteps:
            "Задайте «Макс. шагов» > 0 — длина потоковых датасетов неизвестна.",
          trainOnCompletions:
            "Отключите «Только ответы ассистента».",
          evalSplit:
            "Выберите отдельную выборку для оценки — оценка включена, но отдельная выборка не задана.",
          visionModel:
            "Модели зрения не поддерживают потоковую передачу.",
          audioModel:
            "Аудиомодели не поддерживают потоковую передачу.",
          embeddingModel:
            "Модели эмбеддингов не поддерживают потоковую передачу: для обучения нужен весь датасет.",
          imageDataset:
            "Похоже, этот датасет содержит изображения, поэтому его нельзя передавать потоком.",
          audioDataset:
            "Похоже, этот датасет содержит аудио, поэтому его нельзя передавать потоком.",
          appleSilicon:
            "Потоковая передача на Apple Silicon (MLX) пока не поддерживается.",
        },
        options: {
          trainOnCompletions: "только ответы ассистента",
          evaluation: "оценка (нужна отдельная выборка)",
        },
        notifications: {
          disabledForDetectedModality:
            "Потоковая передача отключена: датасеты с изображениями или аудио необходимо скачивать полностью. Проверьте настройку и снова запустите обучение.",
          turnedOffMaxSteps:
            "Потоковая передача отключена: для неё требуется фиксированное значение «Макс. шагов» > 0.",
          adjusted:
            "Настройки скорректированы для потоковой передачи. Отключены несовместимые параметры: {options}.",
          needsMaxSteps:
            "Для потоковой передачи требуется фиксированное значение «Макс. шагов»: длина потоковых датасетов неизвестна. Сначала задайте «Макс. шагов» > 0.",
          enabledAdjusted:
            "Потоковая передача включена. Отключены несовместимые параметры: {options}.",
        },
      },
      auto: "Авто",
      rawText: "Сырой текст",
      trainSplitStart: "Начало обучающей выборки",
      trainSplitStartTooltip:
        "Обучаться только на подмножестве обучающей выборки, указав индекс начальной строки (включительно, с нуля). Оставьте пустым, чтобы начать с первой строки.",
      trainSplitEnd: "Конец обучающей выборки",
      trainSplitEndTooltip:
        "Индекс последней строки из обучающей выборки (включительно, с нуля). Например, задайте Начало 0 и Конец 99, чтобы обучаться на первых 100 строках. Оставьте пустым, чтобы использовать все оставшиеся строки.",
      endPlaceholder: "Конец",
      clear: "Очистить",
      dropFileOrClick: "Перетащите 1 файл сюда или нажмите для загрузки",
      uploadDetails: "Сведения о загрузке",
      uploadDetailsTooltip:
        "До {limit} на файл. PDF, DOCX и TXT не являются готовыми датасетами для обучения, поэтому сначала преобразуйте их в разделе «Рецепты».",
      viewDataset: "Просмотреть датасет",
      uploadFailed: "Загрузка не удалась",
      unknownError: "Неизвестная ошибка",
      unsupportedFileType: "Неподдерживаемый тип файла",
      uploadOneFileType: "Загрузите один файл {types}.",
      datasetUploaded: "Датасет загружен",
      evalDatasetUploaded: "Датасет для оценки загружен",
      uploadOneFileAtATime: "Загружайте по одному файлу за раз",
      uploadSingleFileDescription:
        "Загрузка датасета для обучения принимает один файл.",
      previewLoadingHuggingFace:
        "Получение предпросмотра датасета из Hugging Face...",
      previewLoading: "Загрузка предпросмотра...",
      mappingRequirements: {
        audioAndText: "аудио и текст",
        imageAndText: "изображение и текст",
        instructionAndOutput: "инструкцию и ответ",
        humanAndGpt: "человека и GPT",
        userAndAssistant: "пользователя и ассистента",
      },
      mappingStatus: {
        heuristicTitle: "Сопоставление определено эвристически",
        readyTitle: "Сопоставление готово",
        requiredTitle: "Сопоставьте столбцы датасета",
        heuristicDescription:
          "Мы автоматически определили сопоставление столбцов с помощью эвристик. Проверьте и измените его в выпадающих списках заголовков или используйте ИИ-помощник для более точного сопоставления.",
        readyDescription:
          "Всё готово. Этот датасет будет преобразован автоматически.",
        requiredDescription:
          "Назначьте роли столбцам с помощью выпадающих списков в заголовках. Как минимум назначьте {required}.",
      },
      s3: {
        title: "Конфигурация S3",
        description:
          "Загрузка датасетов .parquet, .json, .jsonl или .csv из Amazon S3",
        bucket: "Имя бакета",
        bucketPlaceholder: "my-training-data-bucket",
        region: "Регион AWS",
        regionPlaceholder: "us-east-1",
        prefix: "Префикс пути",
        prefixPlaceholder: "datasets/whisper/",
        accessKeyId: "Access Key ID",
        accessKeyIdPlaceholder: "AKIAIOSFODNN7EXAMPLE",
        secretAccessKey: "Secret Access Key",
        secretAccessKeyPlaceholder: "Ваш AWS secret access key",
        useIamRole: "Использовать роль IAM",
      },
    },
    params: {
      mode: {
        simple: "Простой",
        advanced: "Расширенный",
        ariaLabel: "Режим параметров",
      },
      projectName: "Название проекта",
      optional: "Необязательно",
      projectNameDescription:
        "Используется в именах папок вывода обучения, значениях экспорта по умолчанию и истории.",
      loraSettings: "Настройки LoRA",
      trainingHyperparameters: "Гиперпараметры обучения",
      maxSteps: "Макс. шагов",
      epochs: "Эпохи",
      useMaxSteps: "Использовать макс. шаги",
      useEpochs: "Использовать эпохи",
      maxStepsTooltip: "Переопределить общее число шагов оптимизатора.",
      epochsTooltip: "Количество полных проходов по датасету.",
      contextLength: "Длина контекста",
      contextLengthTooltip: "Максимальное число токенов на обучающий образец.",
      customContextLength: "Введите своё значение",
      learningRate: "Скорость обучения",
      learningRateTooltip:
        "Размер шага обновления весов. Меньшие значения обучают медленнее, но стабильнее.",
      learningRateDescription:
        "Рекомендуется: 2e-4 для LoRA, 5e-5 для CPT, 2e-5 для полного дообучения",
      embeddingLearningRate: "Скорость обучения эмбеддингов",
      embeddingLearningRateTooltip:
        "Используется только когда CPT обучает embed_tokens. Эмбеддинги легче дестабилизировать, чем веса LoRA, поэтому им обычно нужна меньшая скорость обучения. Оставьте пустым, чтобы использовать lr/10; типичный рабочий диапазон в 2-10 раз меньше основной скорости обучения. Повышайте только если адаптация словаря или доменных токенов идёт слишком медленно.",
      rank: "Ранг",
      rankTooltip:
        "Размерность низкоранговых матриц. Чем выше, тем больше ёмкость.",
      alpha: "Alpha",
      alphaTooltip: "Коэффициент масштабирования обновлений LoRA. Обычно 2× ранга.",
      dropout: "Dropout",
      dropoutTooltip:
        "Вероятность dropout для слоёв LoRA для уменьшения переобучения.",
      visionLayers: "Слои зрения",
      languageLayers: "Языковые слои",
      attentionModules: "Модули внимания",
      mlpModules: "Модули MLP",
      targetModules: "Целевые модули",
      enableLora: "Включить LoRA",
      trainWithLora: "Обучать с LoRA",
      stableRank: "Стабильный ранг",
      memoryEfficient: "Экономия памяти",
      weightDecomposed: "Декомпозиция весов",
      notSupportedAppleSilicon: "Не поддерживается на Apple Silicon",
      optimization: "Оптимизация",
      schedule: "Расписание",
      memory: "Память",
      optimizer: "Оптимизатор",
      optimizerTooltip:
        "Алгоритм оптимизации. 8-битные варианты снижают потребление памяти. Fused рекомендуется для моделей зрения.",
      optimizerTooltipMlx:
        "Алгоритм оптимизации. По умолчанию используется AdamW. Lion потребляет меньше памяти, но обычно требует меньшей скорости обучения.",
      lrScheduler: "Планировщик LR",
      lrSchedulerTooltip:
        "Как скорость обучения меняется в процессе обучения. Linear убывает равномерно; cosine убывает по кривой.",
      optimizerOptions: {
        adamw8bit: "AdamW 8-bit",
        pagedAdamw8bit: "Paged AdamW 8-bit",
        adamwBnb8bit: "AdamW BNB 8-bit",
        pagedAdamw32bit: "Paged AdamW 32-bit",
        adamwTorch: "AdamW (PyTorch)",
        adamwTorchFused: "AdamW (PyTorch Fused)",
      },
      lrSchedulerOptions: {
        linear: "Линейный",
        cosine: "Косинусный",
      },
      batchSize: "Размер батча",
      batchSizeTooltip: "Образцов на шаг. Чем больше, тем больше VRAM.",
      gradAccum: "Накопление градиента",
      gradAccumTooltip: "Имитирует больший размер батча без дополнительного VRAM.",
      weightDecay: "Затухание весов",
      weightDecayTooltip: "L2-регуляризация для предотвращения переобучения.",
      warmupSteps: "Шаги прогрева",
      warmupStepsTooltip:
        "Постепенно повышать LR в начале обучения для стабильности.",
      scheduleEpochsTooltip:
        "Количество полных проходов по датасету. Задайте 0, чтобы работать по макс. шагам.",
      saveSteps: "Шаги сохранения",
      saveStepsTooltip: "Сохранять чекпоинт каждые N шагов. 0 для отключения.",
      evalSteps: "Шаги оценки",
      evalStepsTooltip:
        "Доля от общего числа шагов обучения между оценками (0-1). Задайте 0, чтобы отключить оценку. Например, 0.01 = оценка каждый 1% шагов.",
      seed: "Seed",
      seedTooltip: "Случайный seed для воспроизводимости.",
      gradCheckpoint: "Чекпоинт градиента",
      gradCheckpointTooltip:
        "Обменять вычисления на память, пересчитывая активации.",
      none: "Нет",
      standard: "Стандартный",
      enablePacking: "Включить packing",
      assistantCompletionsOnly: "Только ответы ассистента",
      readMore: "Подробнее",
    },
    training: {
      startTraining: "Начать обучение",
      starting: "Запуск...",
      loadingModel: "Загрузка модели...",
      checkingDataset: "Проверка датасета...",
      startFailed: "Не удалось запустить обучение",
      startUnconfirmed:
        "Unsloth не удалось подтвердить запуск обучения. Состояние проверяется в фоновом режиме.",
      stopFailed: "Не удалось остановить обучение",
      trainingStillActiveTitle: "Обучение ещё выполняется",
      stopBeforeConfig:
        "Сначала остановите обучение, затем вернитесь к настройке.",
      resumeFailed: "Не удалось возобновить обучение",
      resumeFailedTitle: "Не удалось возобновить обучение",
      resumeUnavailable:
        "Возобновить можно только остановленные или завершившиеся с ошибкой запуски с сохранённым чекпоинтом.",
      chooseModel: "Выберите модель",
      chooseDataset: "Выберите датасет",
      chooseModelAndDataset: "Выберите модель и датасет",
      modelUnverified:
        "Не удалось проверить настройки этой модели. Проверьте подключение или токен Hugging Face, затем повторите попытку.",
      legacyDatasetScriptUnsupported:
        "Этот датасет Hub использует устаревший пользовательский скрипт и не поддерживается в этом процессе обучения.",
      hfModelAccessDenied:
        "Hugging Face отклонил доступ к этой модели. Добавьте действительный токен Hugging Face с доступом к репозиторию, примите необходимые условия доступа и повторите попытку.",
      hfModelVerificationRateLimited:
        "Проверка модели Hugging Face ограничена по частоте запросов. Повторите попытку позже.",
      hfModelVerificationFailed:
        "Не удалось проверить модель Hugging Face. Проверьте идентификатор репозитория и токен доступа.",
      hfModelMetadataUnavailable:
        "Метаданные модели Hugging Face временно недоступны. Повторите попытку перед запуском обучения.",
      datasetUnverified:
        "Не удалось проверить совместимость датасета с этой моделью. Проверьте подключение или токен Hugging Face — проверка повторится при запуске обучения.",
      setupChanged:
        "Настройки обучения изменились во время проверки. Проверьте их и снова запустите обучение.",
      validation: {
        s3MultimodalUnsupported:
          "Датасеты S3 пока не поддерживаются для обучения моделей зрения или аудио.",
        s3BucketRequired: "Сначала введите имя бакета S3.",
        s3CredentialsRequired:
          "Укажите ключи доступа S3 или включите роль IAM.",
        modelRequired: "Сначала выберите базовую модель.",
        learningRatePositive: "Введите скорость обучения больше нуля.",
        embeddingLearningRateRange:
          "Введите скорость обучения эмбеддингов больше 0 и меньше 1.",
        hfDatasetRequired: "Сначала выберите датасет Hugging Face.",
        hfDatasetSplitRequired:
          "Сначала выберите или введите обучающую выборку.",
        localDatasetRequired: "Сначала выберите локальный датасет.",
        unsupportedDatasetSource: "Источник датасета не поддерживается.",
      },
      uploadConfigTooltip: "Загрузить сохранённую конфигурацию YAML",
      saveConfigTooltip: "Скачать текущую конфигурацию как YAML",
      resetConfigTooltip: "Сбросить к значениям модели по умолчанию",
      configLoaded: "Конфигурация загружена",
      failedToLoadConfig: "Не удалось загрузить конфигурацию",
      invalidYamlFile: "Недопустимый файл YAML",
      configTooLarge:
        "Файл конфигурации обучения слишком большой (максимум 1 МиБ).",
      failedToReadFile: "Не удалось прочитать файл",
      failedToSaveConfig: "Не удалось сохранить конфигурацию",
      parametersReset: "Параметры сброшены к значениям модели по умолчанию",
      audioIncompatible:
        "Эта модель не поддерживает аудио. Переключитесь на модель с поддержкой аудио или выберите не-аудио датасет.",
      visionIncompatible:
        "Текстовая модель несовместима с мультимодальным датасетом. Переключитесь на модель зрения или выберите текстовый датасет.",
      cancelTitle: "Отменить обучение",
      cancelDescription: "Вы хотите отменить текущий запуск обучения?",
      continueAction: "Продолжить обучение",
      cancelAction: "Отменить обучение",
      stopTitle: "Остановить обучение",
      stopDescription:
        "Выберите, как остановить текущий запуск обучения. «Остановить и сохранить» создаст чекпоинт, с которого позже можно продолжить обучение; если остановить без сохранения, продолжить обучение будет нельзя.",
      stopAction: "Остановить",
      stopping: "Остановка...",
      stopAndSave: "Остановить и сохранить",
      compareInChat: "Сравнить в чате",
      exportModel: "Экспортировать модель",
      milestone: "Веха",
      halfwayDone: "Половина позади. Обучение прошло 50%.",
      doneNextStep:
        "Обучение завершено. Следующий шаг: сравните выводы базовой и дообученной модели.",
    },
    history: {
      title: "История",
      filesDeleted: "Файлы удалены",
      deleteArtifactsLabel: "Также удалить файлы адаптера с диска",
      deleteArtifactsDescription:
        "Удаляет папку результатов запуска, включая адаптеры и сохранённые чекпоинты.",
      deleteArtifactsSharedNote:
        "Эту папку результатов использует другой запуск. Файлы сохранятся, пока не будет удалён последний использующий их запуск.",
      artifactsKeptShared:
        "Запуск удалён. Файлы адаптера сохранены, поскольку эту папку использует другой запуск.",
      deleteArtifactsActiveError:
        "Эти файлы используются текущим обучением. Остановите обучение перед их удалением.",
      deleteArtifactsFailed:
        "Запуск удалён, но удалить его файлы не удалось.",
      deleteArtifactsRetainedError:
        "Не удалось удалить файлы адаптера, поэтому запуск обучения сохранён в истории.",
      emptyDescription:
        "Пока нет запусков обучения. Запустите первое обучение на вкладке «Настройка».",
      loadError: "Не удалось загрузить запуски обучения",
      deleteError: "Не удалось удалить запуск обучения. Повторите попытку.",
      retry: "Повторить",
      loadMore: "Загрузить ещё",
      loading: "Загрузка...",
      loadingRun: "Загрузка запуска обучения...",
      runNotFound: "Запуск не найден",
      deleteTitle: "Удалить запуск обучения?",
      deleteDescription:
        "Это безвозвратно удалит этот запуск обучения и все его метрики. Это действие нельзя отменить.",
      resumeTraining: "Продолжить обучение",
      resuming: "Продолжение...",
      deleteRun: "Удалить запуск",
      loss: "Loss",
      steps: "Шаги",
      lossTrendSparkline: "Мини-график динамики функции потерь",
      relativeJustNow: "только что",
      status: {
        completed: "Завершено",
        stopped: "Остановлено",
        error: "Ошибка",
        running: "Выполняется",
        continued: "Продолжено",
      },
      message: {
        completed: "Обучение завершено",
        stopped: "Обучение остановлено",
        running: "Обучение выполняется",
        errored: "Ошибка обучения",
      },
      copyPreviewLink: "Копировать ссылку предпросмотра",
      previewLinkCopied: "Ссылка предпросмотра скопирована",
      previewLinkCopyFailed: "Не удалось скопировать ссылку",
    },
    charts: {
      settings: "Настройки графика",
      settingsDescription:
        "Настройте отображение графика, пока обучение продолжается.",
      openSettings: "Открыть настройки графика",
      viewWindow: "Окно просмотра",
      viewWindowDescription: "Показывать только последние шаги или всю историю.",
      window: "Окно",
      all: "Все",
      trainingLoss: "Loss обучения",
      trainingLossDescription: "Управление наложениями и EMA-сглаживанием.",
      smoothing: "Сглаживание",
      smoothingDescription: "Двигайте вправо для большего сглаживания. `0` = без обработки.",
      showRawLoss: "Показывать сырой loss",
      showSmoothedLoss: "Показывать сглаженный loss",
      showAverageLine: "Показывать линию среднего",
      scaleAndCleanup: "Масштаб и очистка",
      linear: "Линейный",
      log: "Логарифмический",
      noClip: "Без обрезки",
      clipP99: "Обрезка p99",
      clipP95: "Обрезка p95",
      lossAxis: "Ось loss",
      gradientNormAxis: "Ось нормы градиента",
      learningRateAxis: "Ось скорости обучения",
      resetDefaults: "Сбросить к умолчанию",
      loss: "Loss",
      smoothed: "Сглажено",
      evalLoss: "Eval Loss",
      learningRate: "Скорость обучения",
      lr: "LR",
      gradNorm: "Норма градиента",
      gradientNorm: "Норма градиента",
      step: "Шаг {step}",
      averageValue: "среднее {value}",
      waitingForFirstEvaluationStep: "Ожидание первого шага оценки...",
      evaluationNotConfigured: "Оценка не настроена",
      evalChartWillAppear: "График появится по достижении eval_steps",
      setEvalDatasetAndSteps:
        "Задайте датасет для оценки и eval_steps для отслеживания eval loss",
    },
    progress: {
      title: "Прогресс обучения",
      liveMetrics: "Метрики обучения в реальном времени",
      exportGguf: "Экспортировать в GGUF",
      openConfig: "Открыть конфигурацию обучения",
      configLabel: "Конфигурация обучения",
      hyperparams: "Гиперпараметры",
      epochs: "Эпохи",
      batchSize: "Размер батча",
      learningRate: "Скорость обучения",
      optimizer: "Оптимизатор",
      maxSteps: "Макс. шагов",
      contextLength: "Длина контекста",
      warmupSteps: "Шаги прогрева",
      rank: "Ранг",
      alpha: "Alpha",
      dropout: "Dropout",
      variant: "Вариант",
      epoch: "Эпоха {value}",
      percentComplete: "{percent}% завершено",
      stepProgress: "Шаг {current} / {total}",
      loss: "Loss",
      lr: "LR",
      gradNorm: "Норма градиента",
      project: "Проект",
      model: "Модель",
      method: "Метод",
      elapsed: "Прошло: {value}",
      eta: "Осталось: {value}",
      stepsPerSecond: "{value} шаг/с",
      noStepsPerSecond: "-- шаг/с",
      tokens: "Токены: {value}",
      gpuMonitor: "Монитор GPU",
      live: "В реальном времени",
      utilization: "Загрузка",
      temperature: "Температура",
      vram: "VRAM",
      power: "Мощность",
      phase: {
        idle: "Простой",
        downloadingModel: "Загрузка модели",
        downloadingDataset: "Загрузка датасета",
        loadingModel: "Загрузка модели",
        loadingDataset: "Загрузка датасета",
        configuring: "Настройка",
        training: "Обучение",
        finalizing: "Сохранение модели",
        completed: "Завершено",
        error: "Ошибка",
        stopped: "Остановлено",
      },
    },
    trainingStart: {
      ready: "Готово",
      downloading: "Загрузка",
      preparing: "Подготовка",
      left: "осталось {eta}",
      downloaded: "загружено {size}",
      terminalStart: "> обучение unsloth начинается...",
      preparingResources: "> Подготовка модели и датасета...",
      gettingReady: "> Мы готовим всё для вашего запуска...",
      waitingForFirstStep: "> {message} | ожидание первого шага... ({step})",
      resumingTraining: "Продолжение обучения...",
      startingTraining: "начало обучения...",
      dataset: "Датасет",
      datasetStreaming: "Датасет: потоковая передача (без полной загрузки)",
      modelWeights: "Веса модели",
    },
  },
} satisfies DeepPartialMessageTree<typeof en>;
