import type { TranslationDictionary } from '@/types/i18n.types';

export const ru: TranslationDictionary = {
  common: {
    save: 'Сохранить',
    cancel: 'Отмена',
    delete: 'Удалить',
    edit: 'Изменить',
    create: 'Создать',
    search: 'Поиск',
    filter: 'Фильтр',
    loading: 'Загрузка...',
    noResults: 'Результаты не найдены',
    confirm: 'Подтвердить',
    back: 'Назад',
    next: 'Далее',
    previous: 'Предыдущий',
    close: 'Закрыть',
    retry: 'Повторить',
    error: 'Ошибка',
    success: 'Успех',
    warning: 'Предупреждение',
    info: 'Информация',
    healthy: 'Работает',
    degraded: 'Снижено',
    unhealthy: 'Не работает',
    up: 'Доступен',
    down: 'Недоступен',
    responseTime: 'Время отклика',
    unknown: 'Неизвестно',
    operational: 'Работает',
    notAvailable: 'Н/Д',
    yes: 'Да',
    no: 'Нет',
    never: 'Никогда',
    accessDenied: 'У вас нет прав для доступа к этой странице.',
    brandName: 'Claw',
    brandVersion: 'Claw v{version}',
    select: 'Выбрать',
    download: 'Скачать',
    noDataAvailable: 'Данные недоступны',
    showingPage: 'Страница {page} из {total}',
  },
  auth: {
    login: 'Вход',
    logout: 'Выход',
    email: 'Эл. почта',
    password: 'Пароль',
    loginTitle: 'Вход в Claw',
    loginSubtitle: 'Введите учётные данные для продолжения',
    loginButton: 'Войти',
    logoutButton: 'Выйти',
    sessionExpired: 'Сессия истекла. Войдите снова.',
    invalidCredentials: 'Неверный email или пароль',
    welcomeTitle: 'Добро пожаловать в Claw',
    welcomeSubtitle: 'Платформа оркестрации ИИ',
    passwordPlaceholder: 'Введите пароль',
    signingIn: 'Выполняется вход...',
    loginFailed: 'Не удалось войти. Попробуйте снова.',
    tagline: 'Claw — локально-первая оркестрация ИИ',
    authenticating: 'Аутентификация...',
    emailPlaceholder: 'you@example.com',
  },
  nav: {
    dashboard: 'Панель управления',
    chat: 'Чат',
    compareModels: 'Сравнение моделей',
    consensusMode: 'Режим консенсуса',
    escalationChain: 'Цепочка эскалации',
    repairLab: 'Лаборатория исправлений',
    decomposeLab: 'Декомпозиция задач',
    bestOfNLab: 'Генерация Best-of-N',
    verifierLab: 'Верификатор',
    pipelineLab: 'Лаборатория конвейеров',
    costEnsemble: 'Ансамбль по стоимости',
    rolePackLab: 'Набор ролей',
    connectors: 'Коннекторы',
    models: 'Модели',
    modelCatalog: 'Каталог моделей',
    modelLocalFrontier: 'Frontier-модели',
    localModels: 'Локальные модели',
    routing: 'Маршрутизация',
    replayLab: 'Лаборатория воспроизведения',
    recoveryLab: 'Движок восстановления',
    adaptiveInsights: 'Адаптивная аналитика',
    memory: 'Память',
    context: 'Пакеты контекста',
    files: 'Файлы',
    observability: 'Наблюдаемость',
    audits: 'Журналы аудита',
    logs: 'Логи',
    admin: 'Администрирование',
    settings: 'Настройки',
    workspace: 'Рабочая область',
    workspaceActions: 'Действия',
    workspaceApprovals: 'Согласования',
    workspaceSyncHealth: 'Состояние синхронизации',
    agent: 'Агент',
    agentTerminal: 'Терминал',
    agentRepos: 'Репозитории',
    agentCapabilities: 'Возможности',
    agentActivity: 'Активность',
    agentRecipes: 'Рецепты',
    agentMarketplace: 'Магазин',
    agentActivityMemory: 'Память активности',
    discovery: 'Обнаружение моделей',
    workspaceProviders: 'Провайдеры',
    workspaceAppConfigs: 'Конфигурации приложений',
    workspaceGmail: 'Gmail',
    workspaceJira: 'Jira',
    workspaceSourceControl: 'Контроль версий',
    workspaceSlack: 'Slack',
    workspaceDocs: 'Документы',
    workspaceConfluence: 'Confluence',
    workspaceFigma: 'Figma',
    workspaceWorkflows: 'Рабочие процессы',
    researchProviders: 'Провайдеры исследований',
    researchRuns: 'Запуски исследований',
    research: 'Исследования',
    workspaceInbox: 'Входящие',
    workspaceSemanticSearch: 'Семантический поиск',
    workspaceDigest: 'Сводка',
    workspaceAutomationPreferences: 'Настройки автоматизации',
    workspaceEmailSignatures: 'Подписи писем',
    workspaceEmailTemplates: 'Шаблоны писем',
    workspaceImplHandoffs: 'Передача кода',
    adminAiActionPolicies: 'Политики действий ИИ',
    adminSuggestionRules: 'Правила предложений',
    adminWebhookDeliveries: 'Доставки вебхуков',
  },
  chat: {
    newThread: 'Новый чат',
    threads: 'Чаты',
    searchThreads: 'Поиск чатов...',
    noThreads: 'Чатов пока нет',
    noThreadsDesc: 'Начните новый разговор, чтобы продолжить',
    sendMessage: 'Отправить сообщение',
    typeMessage: 'Введите сообщение...',
    deleteThread: 'Удалить чат',
    deleteThreadConfirm: 'Вы уверены, что хотите удалить этот чат?',
    threadCreated: 'Чат создан',
    threadCreateFailed: 'Не удалось создать чат',
    threadDeleted: 'Чат удалён',
    threadDeleteFailed: 'Не удалось удалить чат',
    threadUpdateFailed: 'Не удалось обновить чат',
    messageSendFailed: 'Не удалось отправить сообщение',
    feedbackFailed: 'Не удалось сохранить отзыв',
    regenerateFailed: 'Не удалось повторно сгенерировать сообщение',
    aiThinking: 'ИИ думает...',
    fallbackRetrying: 'Повтор через резервный...',
    providerFailed: 'сбой',
    tryingProvider: 'пробуем',
    allProvidersFailed: 'Все провайдеры не смогли сгенерировать ответ',
    imageGeneration: 'Генерация изображений',
    generatedImage: 'Сгенерированное изображение',
    downloadImage: 'Скачать изображение',
    fileGeneration: 'Генерация файла',
    generatingFile: 'Создание файла...',
    fileGenerationFailed: 'Не удалось сгенерировать файл',
    downloadFile: 'Скачать файл',
    convertingFile: 'Преобразование файла',
    providerModel: 'Провайдер / Модель',
    pinThread: 'Закрепить чат',
    unpinThread: 'Открепить чат',
    archiveThread: 'Архивировать чат',
    unarchiveThread: 'Разархивировать чат',
    threadPinned: 'Чат закреплён',
    threadUnpinned: 'Чат откреплён',
    threadArchived: 'Чат в архиве',
    threadUnarchived: 'Чат извлечён из архива',
    pinFailed: 'Не удалось обновить статус закрепления',
    archiveFailed: 'Не удалось обновить статус архива',
    showArchived: 'Показать архивные',
    hideArchived: 'Скрыть архивные',
    provenance: 'Происхождение сообщения',
    provenanceProvider: 'Провайдер',
    provenanceModel: 'Модель',
    provenanceLatency: 'Задержка',
    provenanceInputTokens: 'Входные токены',
    provenanceOutputTokens: 'Выходные токены',
    provenanceEstimatedCost: 'Оценочная стоимость',
    provenanceRoutingMode: 'Режим маршрутизации',
    provenanceFallbackUsed: 'Использован резерв',
    provenanceYes: 'Да',
    provenanceNo: 'Нет',
    globalSearch: 'Поиск чатов',
    globalSearchPlaceholder: 'Поиск по всем чатам...',
    globalSearchNoResults: 'Чаты не найдены',
    systemPrompt: 'Системная подсказка',
    systemPromptPlaceholder: 'Инструкции для ИИ...',
    temperature: 'Температура',
    temperatureDescription: 'Управляет случайностью. Ниже = сфокусированнее, выше = креативнее.',
    maxTokens: 'Макс. токенов',
    maxTokensDescription: 'Максимальная длина ответа ИИ.',
    threadSettings: 'Настройки чата',
    preferredModel: 'Модель ИИ по умолчанию',
    preferredModelDescription:
      'Модель по умолчанию для этого чата. Может быть переопределена для каждого сообщения.',
    settingsSaved: 'Настройки чата сохранены',
    helpful: 'Полезно',
    notHelpful: 'Бесполезно',
    feedbackSaved: 'Отзыв сохранён',
    attachFiles: 'Прикрепить файлы',
    noFiles: 'Файлы ещё не загружены',
    selectedFiles: 'Прикреплено файлов: {count}',
    contextPacks: 'Пакеты контекста',
    contextPacksDescription: 'Выберите пакеты контекста для этого чата.',
    noContextPacks: 'Пакеты контекста ещё не созданы',
    reRouted: 'Перемаршрутизировано',
    reRoutedFrom: 'Перемаршрутизировано из {provider}/{model}',
    weakResponse: 'Обнаружен слабый ответ',
    qualityScore: 'Качество: {score}%',
    judgeReferee: 'Судья и арбитр',
    judgeRefereeDescription:
      'Включить критику и проверку ответов на базе ИИ для повышения точности.',
    judgeVerified: 'Проверено',
    judgeRevised: 'Пересмотрено',
    judgeEscalated: 'Эскалировано',
    judgeCriticFeedback: 'Отзыв критика',
    judgeReasoning: 'Обоснование судьи',
    judgeEvaluating: 'Проверка ответа...',
    judgeModelLabel: 'Модель судьи',
    judgeModelAuto: 'Авто (qwen3:1.7b)',
    judgeModelDescription: 'Переопределить локальную модель, используемую для итогового вердикта',
    judgeOpenReview: 'Просмотреть ответ судьи',
    judgeReviewTitle: 'Проверка судьи',
    judgeReviewDescription: 'Изучите исходный ответ, решение судьи и сгенерированный судьёй ответ.',
    judgeDecisionLabel: 'Решение',
    judgeConfidenceLabel: 'Уверенность',
    judgeSummary: 'Резюме судьи',
    judgeResponse: 'Ответ судьи',
    judgeOriginalAnswer: 'Исходный ответ',
    judgeRevisedAnswer: 'Пересмотренный ответ',
    judgeEscalatedAnswer: 'Эскалированный ответ',
    judgeExecutionModel: 'Модель выполнения',
    judgeJudgeModel: 'Модель судьи',
    judgeCriticModel: 'Модель критика',
    judgeCriticScore: 'Оценка критика',
    judgeJudgeLatency: 'Задержка судьи',
    judgeTotalLatency: 'Общая задержка проверки',
    judgeRecommendedChanges: 'Рекомендуемые изменения',
    judgeNoCriticFeedback: 'Отзыв критика не был записан для этой проверки.',
    judgeResponseTypeSummary: 'Резюме',
    judgeResponseTypeRevisedAnswer: 'Пересмотренный ответ',
    judgeResponseTypeEscalatedAnswer: 'Эскалированный ответ',
    judgeResponseTypeVerificationNote: 'Заметка проверки',
    qualityThreshold: 'Порог качества',
    qualityThresholdDescription:
      'Минимальная оценка качества до перемаршрутизации (0 = принимать всё, 1 = очень строго)',
    maxReRouteAttempts: 'Макс. попыток перемаршрутизации',
    maxReRouteAttemptsDescription:
      'Максимальное число попыток перемаршрутизации на сообщение (0–5)',
    reRouteReasonShort: 'Слишком коротко',
    reRouteReasonRefusal: 'Обнаружен отказ',
    reRouteReasonRepetition: 'Чрезмерное повторение',
    reRouteReasonEcho: 'Эхо подсказки',
    reRouteReasonLowWords: 'Слишком мало слов',
    backToThreads: 'Назад к чатам',
    loadingThread: 'Загрузка чата...',
    selectOrStartTitle: 'Выберите чат или начните новый',
    selectOrStartDesc:
      'Выберите существующий разговор в боковой панели или создайте новый для взаимодействия с вашими настроенными моделями ИИ.',
    untitled: 'Без названия',
    attachedFile: 'Прикреплённый файл',
    beginningOfConversation: 'Начало разговора',
    composerPlaceholder: 'Введите ваше сообщение...',
    currentAiProgress: 'Текущий прогресс ИИ',
    fileGenerationCancelled: 'Создание файла отменено',
    fileGenerationFailedRetry: 'Не удалось создать файл. Повторить?',
    generationCancelled: 'Генерация отменена',
    imageGenerationFailedRetry: 'Не удалось создать изображение. Повторить?',
    judge: 'Арбитр',
    live: 'В эфире',
    loadingImage: 'Загрузка изображения...',
    loadingMessages: 'Загрузка сообщений...',
    loadingMoreThreads: 'Загрузка дополнительных тредов...',
    loadingOlderMessages: 'Загрузка старых сообщений...',
    loadingThreads: 'Загрузка тредов...',
    manyMemories: '{count} воспоминаний',
    modelThinking: 'Модель думает...',
    noMatchingThreads: 'Нет подходящих тредов',
    noMessagesYet: 'Сообщений пока нет',
    noVisibleAnswer: 'Нет видимого ответа',
    oneMemory: '1 воспоминание',
    open: 'Открыть',
    preparingDownload: 'Подготовка загрузки...',
    regenerate: 'Сгенерировать заново',
    searching: 'Поиск...',
    threadActions: 'Действия с тредом',
    toggleProvenance: 'Переключить источник',
    tryAnotherModel: 'Попробовать другую модель',
    tryingFallback: 'Пробуем резервный вариант...',
    verifyingWith: 'Проверка с помощью {model}',
    visibleAiProgress: 'Видимый прогресс ИИ',
    useMemoryLabel: 'Использовать память в этом разговоре',
    useMemoryDescription: 'Когда выключено, никакие воспоминания не вставляются в запрос.',
    useContextLabel: 'Использовать пакеты контекста в этом разговоре',
    useContextDescription: 'Когда выключено, прикреплённые пакеты игнорируются.',
  },
  receipt: {
    openLabel: 'Показать, что использовал ИИ',
    contextUsed: 'Использованный контекст',
    dialogTitle: 'Почему этот ответ',
    dialogDescription: 'Воспоминания и элементы пакета, повлиявшие на этот ответ.',
    loading: 'Загрузка квитанции...',
    notAvailable: 'Для этого сообщения квитанция недоступна.',
    memoriesCount: '{value} воспоминаний',
    packItemsCount: '{value} элементов пакета',
    tokenBudget: 'Токены: {used} / {total}',
    memoriesHeading: 'Воспоминания',
    packItemsHeading: 'Элементы пакета',
    warningsHeading: 'Предупреждения',
    scoreLabel: 'оценка {value}',
    pinnedBadge: 'закреплено',
    redactedPlaceholder: '(отредактировано — содержимое скрыто)',
  },
  preview: {
    openLabel: 'Предварительный просмотр контекста',
    dialogTitle: 'Что бы увидел ИИ',
    dialogDescription:
      'Пробный запуск получения памяти и пакетов контекста для текущего черновика.',
    loading: 'Создание предварительного просмотра...',
    failed:
      'Не удалось создать предварительный просмотр; следующая отправка всё равно будет работать.',
    empty: 'Для этого черновика контекст не будет внедрён.',
    memoryCount: '{value} воспоминаний',
    packCount: '{value} элементов пакета',
    tokenBudget: 'Токены: {used} / {total}',
    memoriesHeading: 'Воспоминания',
    packItemsHeading: 'Элементы пакета',
    redactedPlaceholder: '(отредактировано — содержимое скрыто)',
  },
  connectors: {
    title: 'Коннекторы',
    description: 'Управляйте подключениями к провайдерам ИИ',
    createConnector: 'Создать коннектор',
    editConnector: 'Изменить коннектор',
    deleteConnector: 'Удалить коннектор',
    testConnection: 'Проверить соединение',
    testingConnection: 'Проверка...',
    syncModels: 'Синхронизировать модели',
    name: 'Название',
    nameHelp: 'Удобное имя для идентификации этого коннектора на панели.',
    provider: 'Провайдер',
    providerHelp: 'Провайдер ИИ, с которым будет взаимодействовать этот коннектор.',
    authType: 'Тип аутентификации',
    authTypeHelp:
      'Способ аутентификации у провайдера. Большинство провайдеров используют API-ключ.',
    apiKey: 'API-ключ',
    apiKeyHelp: 'Ваш секретный API-ключ от провайдера. Он будет зашифрован.',
    baseUrl: 'Базовый URL',
    baseUrlHelp:
      'Переопределить API-эндпоинт по умолчанию. Оставьте пустым для значения по умолчанию.',
    region: 'Регион',
    regionHelp: 'Регион AWS, в котором развернут ваш эндпоинт Bedrock.',
    status: 'Статус',
    healthy: 'Работает',
    degraded: 'Снижено',
    error: 'Ошибка',
    noConnectors: 'Коннекторы не настроены',
    noConnectorsDesc: 'Добавьте коннектор, чтобы начать использовать провайдеров ИИ',
    connectorCreated: 'Коннектор создан',
    connectorCreateFailed: 'Не удалось создать коннектор',
    connectorUpdated: 'Коннектор обновлён',
    connectorUpdateFailed: 'Не удалось обновить коннектор',
    connectorDeleted: 'Коннектор удалён',
    connectorDeleteFailed: 'Не удалось удалить коннектор',
    testSuccessful: 'Проверка соединения успешна',
    testFailed: 'Проверка соединения не удалась',
    modelsSynced: 'Модели успешно синхронизированы',
    syncFailed: 'Не удалось синхронизировать модели',
    testBeforeCreate: 'Сначала сохраните коннектор, затем проверьте его из списка коннекторов.',
    loadingConnectors: 'Загрузка коннекторов...',
    loadingConnector: 'Загрузка коннектора...',
    addConnector: 'Добавить коннектор',
    loadFailed: 'Не удалось загрузить коннекторы.',
    connectorDetail: 'Детали коннектора',
    connectorNotFound: 'Коннектор не найден',
    backToConnectors: 'Назад к коннекторам',
    syncing: 'Синхронизация...',
    enabled: 'Включено',
    disabled: 'Отключено',
    configuration: 'Конфигурация',
    healthHistory: 'История состояния',
    healthHistoryDesc: 'Отслеживание истории состояния будет доступно в будущем обновлении.',
    models: 'Модели',
    oneModel: '{count} модель',
    manyModels: '{count} моделей',
    updatedAt: 'Обновлено {date}',
    addConnectorDesc: 'Добавить новый коннектор провайдера ИИ',
    apiKeyPlaceholder: 'Введите API Key',
    apiKeyPlaceholderEdit: 'Оставьте пустым, чтобы сохранить существующий',
    baseUrlOptional: 'Базовый URL (необязательно)',
    baseUrlPlaceholder: 'https://api.example.com',
    defaultLabel: 'По умолчанию',
    editConnectorDesc: 'Обновить конфигурацию коннектора',
    namePlaceholder: 'например, OpenAI Production',
    regionPlaceholder: 'например, us-east-1',
    saveFirstThenTest: 'Сначала сохраните коннектор, затем протестируйте',
    selectProvider: 'Выберите провайдера',
  },
  memory: {
    title: 'Память',
    description: 'Управление записями памяти ИИ',
    createMemory: 'Создать запись',
    editMemory: 'Изменить запись',
    deleteMemory: 'Удалить запись',
    type: 'Тип',
    content: 'Содержимое',
    enabled: 'Включено',
    disabled: 'Отключено',
    noMemories: 'Записей памяти нет',
    noMemoriesDesc: 'Создавайте записи памяти, чтобы давать ИИ контекст',
    memoryCreated: 'Запись создана',
    memoryCreateFailed: 'Не удалось создать запись',
    memoryUpdated: 'Запись обновлена',
    memoryUpdateFailed: 'Не удалось обновить запись',
    memoryDeleted: 'Запись удалена',
    memoryDeleteFailed: 'Не удалось удалить запись',
    memoryToggled: 'Статус записи изменён',
    memoryToggleFailed: 'Не удалось переключить запись',
    loadFailed: 'Не удалось загрузить записи памяти.',
    loadingMemories: 'Загрузка записей памяти...',
    addMemory: 'Добавить запись',
    contentPlaceholder: 'Введите содержимое воспоминания...',
    createMemoryDesc: 'Создать новую запись воспоминания',
    editMemoryDesc: 'Обновить детали воспоминания',
    source: 'Источник',
    typeSummary: 'Сводка',
    typeFact: 'Факт',
    typePreference: 'Предпочтение',
    typeInstruction: 'Инструкция',
    filterAllTypes: 'Все типы',
    tabSaved: 'Сохранённые',
    tabSuggestions: 'Предложения',
    tabAudit: 'Аудит',
    searchPlaceholder: 'Поиск воспоминаний...',
    filterAllScopes: 'Все области',
    filterAllSources: 'Все источники',
    filterAllSensitivities: 'Все уровни чувствительности',
    scopeUser: 'Личная',
    scopeThread: 'Этот разговор',
    scopeWorkspace: 'Рабочая область',
    scopeProject: 'Проект',
    sourceUserManual: 'Создано вручную',
    sourceAiExtracted: 'Извлечено из чата',
    sourceAutomation: 'Изучено автоматизацией',
    sourceImported: 'Импортировано',
    sensitivityNormal: 'Обычная',
    sensitivitySensitive: 'Конфиденциальная',
    sensitivityRedacted: 'Отредактировано',
    loadingSuggestions: 'Загрузка предложений...',
    loadingAudit: 'Загрузка аудита...',
    noSuggestions: 'Сейчас нет предложений',
    noAudit: 'Записей аудита пока нет',
    auditNoMemoryId: '(память удалена)',
    approveSuggestion: 'Принять',
    rejectSuggestion: 'Отклонить',
    rejectAndSuppress: 'Отклонить и подавить похожие',
    suggestionConfidence: 'Уверенность: {value}%',
    suggestionReason: 'Причина: {value}',
  },
  files: {
    title: 'Файлы',
    description: 'Загружайте и управляйте файлами для контекста ИИ',
    uploadFile: 'Загрузить файл',
    deleteFile: 'Удалить файл',
    dragDrop: 'Перетащите файлы сюда или нажмите для выбора',
    maxSize: 'Максимальный размер файла: 50 МБ',
    noFiles: 'Файлы не загружены',
    noFilesDesc: 'Загрузите файлы для использования в качестве контекста ИИ',
    fileUploaded: 'Файл загружен',
    fileUploadFailed: 'Не удалось загрузить файл',
    fileDeleted: 'Файл удалён',
    fileDeleteFailed: 'Не удалось удалить файл',
    uploadFailed: 'Не удалось загрузить файл',
    loadFailed: 'Не удалось загрузить файлы.',
    loadingFiles: 'Загрузка файлов...',
    allTypesAccepted: 'Принимаются все типы файлов',
    chunkIndex: 'Фрагмент №{index}',
    chunksTitle: 'Фрагменты файла',
    dropFileHere: 'Перетащите файл сюда',
    dropOrClick: 'Перетащите файл сюда или нажмите для выбора',
    fileFallback: 'Файл',
    noChunks: 'Нет доступных фрагментов',
    uploading: 'Загрузка...',
    uploadNewFile: 'Загрузить новый файл',
    viewChunks: 'Просмотреть фрагменты',
    statusPending: 'Ожидание',
    statusProcessing: 'Обработка',
    statusCompleted: 'Завершено',
    statusFailed: 'Не удалось',
  },
  context: {
    title: 'Пакеты контекста',
    description: 'Организуйте контекст для разговоров с ИИ',
    createPack: 'Создать пакет контекста',
    addItem: 'Добавить элемент',
    name: 'Название',
    scope: 'Область',
    noContextPacks: 'Пакетов контекста нет',
    noContextPacksDesc: 'Создавайте пакеты контекста для организации контекста ИИ',
    packCreated: 'Пакет контекста создан',
    packCreateFailed: 'Не удалось создать пакет контекста',
    packUpdated: 'Пакет контекста обновлён',
    packUpdateFailed: 'Не удалось обновить пакет контекста',
    packDeleted: 'Пакет контекста удалён',
    packDeleteFailed: 'Не удалось удалить пакет контекста',
    itemAdded: 'Элемент добавлен в пакет контекста',
    itemAddFailed: 'Не удалось добавить элемент',
    itemUpdated: 'Элемент пакета контекста обновлён',
    itemUpdateFailed: 'Не удалось обновить элемент',
    itemRemoved: 'Элемент удалён из пакета контекста',
    itemRemoveFailed: 'Не удалось удалить элемент',
    loadFailed: 'Не удалось загрузить пакеты контекста.',
    contextPack: 'Пакет контекста',
    packDetailsDesc: 'Детали пакета и элементы',
    backToPacks: 'Назад к пакетам',
    deletePack: 'Удалить пакет',
    deleting: 'Удаление...',
    loadingPackDetails: 'Загрузка деталей пакета...',
    noItems: 'В этом пакете нет элементов',
    noItemsDesc:
      'Добавьте текстовые заметки, инструкции или ссылки на файлы в этот пакет контекста.',
    loadingContextPacks: 'Загрузка пакетов контекста...',
    addItemDesc:
      'Добавьте текстовую заметку, инструкцию или ссылку на файл в этот пакет контекста.',
    adding: 'Добавление...',
    content: 'Содержимое',
    contentPlaceholder: 'Введите содержимое...',
    fileId: 'ID файла',
    fileIdPlaceholder: 'Введите ID файла',
    itemType: 'Тип',
    selectType: 'Выберите тип',
    createPackDesc: 'Создать новый пакет контекста',
    creating: 'Создание...',
    descriptionOptional: 'Описание (необязательно)',
    descriptionPlaceholder: 'Опишите назначение этого пакета',
    namePlaceholder: 'например, Контекст Project Alpha',
    scopeOptional: 'Область (необязательно)',
    scopePlaceholder: 'например, global, project, user',
    typeNote: 'Заметка',
    typeInstruction: 'Инструкция',
    typeFileReference: 'Ссылка на файл',
  },
  routing: {
    title: 'Политики маршрутизации',
    description: 'Настройка маршрутизации моделей ИИ',
    createPolicy: 'Создать политику',
    editPolicy: 'Изменить политику',
    deletePolicy: 'Удалить политику',
    name: 'Название',
    mode: 'Режим маршрутизации',
    priority: 'Приоритет',
    active: 'Активна',
    noPolicies: 'Политик маршрутизации нет',
    noPoliciesDesc: 'Создавайте политики маршрутизации для управления выбором модели',
    policyCreated: 'Политика создана',
    policyCreateFailed: 'Не удалось создать политику',
    policyUpdated: 'Политика обновлена',
    policyUpdateFailed: 'Не удалось обновить политику',
    policyDeleted: 'Политика удалена',
    policyDeleteFailed: 'Не удалось удалить политику',
    status: 'Статус',
    inactive: 'Неактивна',
    activate: 'Активировать',
    deactivate: 'Деактивировать',
    loadFailed: 'Не удалось загрузить конфигурацию маршрутизации.',
    defaultRoutingMode: 'Режим маршрутизации по умолчанию',
    defaultRoutingModeDesc:
      'Выберите, как локальный маршрутизатор распределяет запросы между моделями',
    defaultMode: 'Режим по умолчанию',
    fallbackSettings: 'Настройки резерва',
    fallbackSettingsDesc: 'Настройка повторных попыток и таймаутов',
    maxRetries: 'Макс. повторов',
    timeoutMs: 'Таймаут (мс)',
    loadingPolicies: 'Загрузка политик...',
    noPoliciesConfigured: 'Политики маршрутизации не настроены.',
    complexityLabel: 'Сложность',
    complexitySimple: 'Простая',
    complexityMedium: 'Средняя',
    complexityComplex: 'Сложная',
    complexityExpert: 'Экспертная',
    routingExplanation: 'Объяснение маршрутизации',
    explanationSummary: 'Сводка решения',
    explanationFactors: 'Факторы решения',
    routingDurationMs: 'Длительность маршрутизации',
    modalityLabel: 'Обнаруженная модальность',
    modalityText: 'Текст',
    modalityCode: 'Код',
    modalityImageInput: 'Понимание изображений',
    modalityImageOutput: 'Генерация изображений',
    modalityAudioInput: 'Аудио / речь',
    modalityVideoInput: 'Анализ видео',
    modalityPdfInput: 'Документ / PDF',
    modalityWebSearch: 'Веб-поиск',
    modalityToolCalling: 'Вызов инструментов',
    modalityStructuredOutput: 'Структурированный вывод',
    modalityOcr: 'OCR / извлечение текста',
    modalityReasoning: 'Глубокое рассуждение',
    namePlaceholder: 'Моя политика маршрутизации',
    selectModePlaceholder: 'Выберите режим маршрутизации',
    editPolicyDesc: 'Обновить конфигурацию политики маршрутизации.',
    createPolicyDesc:
      'Создать новую политику маршрутизации для управления распределением запросов.',
    weightsJsonLabel: 'Весовые коэффициенты (JSON, необязательно)',
    weightsJsonPlaceholder: '{"capability": 0.2, "domain": 0.1, ...}',
    weightsJsonHelp:
      'Необязательно. Переопределяет веса по умолчанию для режима. Должны быть указаны все 14 измерений с суммой 1,0.',
    weightsJsonError: {
      invalidJson: 'JSON весов не является корректным JSON.',
      notAnObject: 'Веса должны быть объектом JSON.',
      missingDimension: 'JSON весов должен содержать каждое измерение как число.',
      sumNotOne: 'Сумма весов должна равняться 1,0 (±0,001).',
    },
    models: {
      title: 'Реестр моделей',
      description:
        'Просмотр всех моделей, известных маршрутизатору. Переопределите стоимость, жизненный цикл или флаги маршрутизации.',
      updateSucceeded: 'Модель обновлена.',
      updateFailed: 'Не удалось обновить модель.',
      overrideCleared: 'Переопределение удалено.',
      overrideClearFailed: 'Не удалось удалить переопределение.',
      softDeleteSucceeded: 'Модель помечена как удалённая.',
      softDeleteFailed: 'Не удалось удалить модель.',
      columnProvider: 'Поставщик',
      columnModelKey: 'Модель',
      columnLifecycle: 'Жизненный цикл',
      columnQuality: 'Качество',
      columnCost: 'Стоимость',
      columnLatency: 'Задержка',
      filterByProvider: 'Фильтр по поставщику',
      filterByLifecycle: 'Фильтр по жизненному циклу',
    },
  },
  models: {
    title: 'Модели',
    description: 'Просмотр всех доступных моделей ИИ',
    localTitle: 'Локальные модели',
    localDescription: 'Управление локально установленными моделями ИИ',
    pullModel: 'Загрузить модель',
    assignRole: 'Назначить роль',
    noModels: 'Моделей нет',
    noModelsDesc: 'Подключите провайдера или загрузите локальные модели',
    modelPullStarted: 'Загрузка модели начата',
    modelPullFailed: 'Не удалось загрузить модель',
    roleAssigned: 'Роль назначена',
    roleAssignFailed: 'Не удалось назначить роль',
    loadFailed: 'Не удалось загрузить модели.',
    loadingModels: 'Загрузка моделей...',
    allProviders: 'Все провайдеры',
    allLifecycle: 'Весь жизненный цикл',
    noModelsMatch: 'Нет моделей, соответствующих текущим фильтрам.',
    localLoadFailed: 'Не удалось загрузить локальные модели.',
    runtimeHealth: 'Состояние среды выполнения',
    runtimeHealthDesc: 'Текущий статус локальной среды выполнения модели',
    pullModelDesc: 'Загрузите новую модель из реестра',
    modelName: 'Имя модели',
    runtime: 'Среда выполнения',
    pulling: 'Загрузка...',
    pull: 'Загрузить',
    installedModels: 'Установленные модели',
    loadingLocalModels: 'Загрузка локальных моделей...',
    noLocalModels: 'Локальные модели не установлены',
    noLocalModelsDesc: 'Загрузите модель с помощью формы выше, чтобы начать локальный вывод.',
    colModel: 'Модель',
    colRuntime: 'Среда выполнения',
    colSize: 'Размер',
    colFamily: 'Семейство',
    colParameters: 'Параметры',
    colRoles: 'Роли',
    noneRole: 'Нет',
    modelNamePlaceholder: 'llama3:8b',
    capabilities: 'Возможности',
    context: 'Контекст',
    lifecycle: 'Жизненный цикл',
    noSyncedModels: 'Нет синхронизированных моделей',
    streaming: 'Потоковая передача',
    tools: 'Инструменты',
    vision: 'Зрение',
  },
  observability: {
    title: 'Наблюдаемость',
    description: 'Мониторинг использования ИИ и производительности',
    totalRequests: 'Всего запросов',
    totalCost: 'Общая стоимость',
    avgLatency: 'Средняя задержка',
    activeModels: 'Активные модели',
    clientLogs: 'Логи клиента',
    serverLogs: 'Логи сервера',
    auditTrail: 'Журнал аудита',
    loadingData: 'Загрузка данных наблюдаемости...',
    failedToLoad: 'Не удалось загрузить данные',
    failedToLoadDesc: 'Не удалось получить данные наблюдаемости. Попробуйте позже.',
    noDataYet: 'Данных наблюдаемости пока нет',
    noDataDesc:
      'Метрики и данные производительности появятся здесь, как только запросы начнут поступать через уровень оркестрации.',
    fullDescription: 'Мониторинг состояния системы, задержек запросов и производительности моделей',
    totalRequestsLabel: 'Всего запросов',
    acrossProviders: 'По всем провайдерам',
    estimatedCost: 'Оценочная стоимость',
    estimatedCostLabel: 'Оценочная стоимость',
    recentFailures: 'Последние сбои',
    highCriticalSeverity: 'События HIGH и CRITICAL',
    providerUsage: 'Использование провайдеров',
    modelUsage: 'Использование моделей',
    latencyBreakdown: 'Разбивка задержек',
    costSummary: 'Сводка по стоимости',
    avg: 'Среднее',
    p50Median: 'P50 (медиана)',
    p95: 'P95',
    totalTokens: 'Всего токенов',
    requests: 'запросов',
    tokens: 'токенов',
    noData: 'Нет данных',
  },
  audits: {
    title: 'Журналы аудита',
    description: 'Просмотр логов активности системы',
    action: 'Действие',
    severity: 'Важность',
    entity: 'Сущность',
    timestamp: 'Метка времени',
    noAudits: 'Логов аудита нет',
    noAuditsDesc: 'Активность появится здесь по мере использования платформы',
    actor: 'Исполнитель',
    details: 'Детали',
    loadingAudits: 'Загрузка логов аудита...',
    loadFailed: 'Не удалось загрузить аудит',
    loadFailedDesc: 'Не удалось получить логи аудита. Попробуйте позже.',
    noMatchingAudits: 'Нет логов аудита, соответствующих фильтрам.',
    allActions: 'Все действия',
    allSeverities: 'Вся важность',
    searchPlaceholder: 'Поиск...',
    ipAddress: 'IP-адрес',
  },
  admin: {
    title: 'Администрирование',
    description: 'Управление пользователями и системными настройками',
    users: 'Пользователи',
    createUser: 'Создать пользователя',
    changeRole: 'Изменить роль',
    deactivate: 'Деактивировать',
    reactivate: 'Реактивировать',
    noUsers: 'Пользователи не найдены',
    checkingServices: 'Проверка сервисов...',
    healthUnreachable: 'Не удалось связаться со службой состояния.',
    loadingUsers: 'Загрузка пользователей...',
    loadUsersFailed: 'Не удалось загрузить пользователей',
    loadUsersFailedDesc: 'Не удалось получить список пользователей. Попробуйте позже.',
    userRoleUpdated: 'Роль пользователя обновлена',
    userRoleUpdateFailed: 'Не удалось обновить роль пользователя',
    userDeactivated: 'Пользователь деактивирован',
    userDeactivateFailed: 'Не удалось деактивировать пользователя',
    userStats: 'Статистика пользователей',
    userStatsDesc: 'Обзор пользователей платформы',
    totalUsers: 'Всего пользователей',
    activeUsers: 'Активных пользователей',
    platformHealth: 'Состояние платформы',
    systemStatusOverview: 'Обзор состояния системы',
    userManagement: 'Управление пользователями',
    colUsername: 'Имя пользователя',
    colEmail: 'Эл. почта',
    colRole: 'Роль',
    colStatus: 'Статус',
    colJoined: 'Присоединился',
    colActions: 'Действия',
    roleAdmin: 'Администратор',
    roleOperator: 'Оператор',
    roleViewer: 'Наблюдатель',
  },
  settings: {
    title: 'Настройки',
    description: 'Управление настройками аккаунта',
    profile: 'Профиль',
    profileDescription: 'Ваша личная информация. Эти поля доступны только для чтения.',
    username: 'Имя пользователя',
    email: 'Эл. почта',
    emailReadOnly: 'Обратитесь к администратору, чтобы изменить email.',
    role: 'Роль',
    selectLanguage: 'Выберите язык',
    preferences: 'Предпочтения',
    language: 'Язык',
    languageDescription: 'Выберите предпочитаемый язык отображения',
    appearance: 'Оформление',
    appearanceDescription: 'Выберите, как выглядит приложение',
    system: 'Системная',
    light: 'Светлая',
    dark: 'Тёмная',
    theme: 'Тема',
    changePassword: 'Изменить пароль',
    currentPassword: 'Текущий пароль',
    newPassword: 'Новый пароль',
    confirmPassword: 'Подтвердите пароль',
    passwordChanged: 'Пароль успешно изменён',
    passwordChangeFailed: 'Не удалось изменить пароль',
    passwordRequirements:
      'Пароль должен содержать не менее 8 символов, включая заглавные, строчные буквы и цифру',
    preferencesUpdated: 'Предпочтения успешно обновлены',
    preferencesUpdateFailed: 'Не удалось обновить предпочтения',
    devices: {
      title: 'Устройства',
      description: 'Управляйте настольными агентами, связанными с вашим аккаунтом.',
      emptyTitle: 'Устройства не связаны',
      emptyBody: 'Выполните `claw-agent login` на вашей машине для связывания устройства.',
      revoke: 'Отозвать',
      rename: 'Переименовать',
      scopesHeading: 'Разрешения',
      revokedBanner: 'Это устройство отозвано',
    },
    langEnglish: 'Английский',
    langArabic: 'Арабский',
    langFrench: 'Французский',
    langItalian: 'Итальянский',
    langGerman: 'Немецкий',
    langSpanish: 'Испанский',
    langRussian: 'Русский',
    langPortuguese: 'Португальский',
    langHindi: 'Хинди',
    appearanceSystem: 'Системная',
    appearanceLight: 'Светлая',
    appearanceDark: 'Тёмная',
  },
  dashboard: {
    title: 'Панель управления',
    description: 'Обзор вашей платформы ИИ',
    quickActions: 'Быстрые действия',
    recentActivity: 'Недавняя активность',
    totalThreads: 'Всего чатов',
    activeConnectors: 'Активные коннекторы',
    localModels: 'Локальные модели',
    systemHealth: 'Состояние системы',
    startNewChat: 'Начать новый чат',
    addConnector: 'Добавить коннектор',
    configureRouting: 'Настроить маршрутизацию',
    serviceStatus: 'Статус сервисов',
    checkingHealth: 'Проверка состояния сервисов...',
    healthUnreachable:
      'Не удалось связаться с агрегатором состояния. Убедитесь, что служба состояния работает.',
    servicesOperational: '{up} из {total} сервисов работают',
    responseTimeMs: '{ms} мс',
    unreachable: 'недоступен',
    newChatLabel: 'Новый чат',
    newChatDesc: 'Начать новый диалог',
    manageConnectorsLabel: 'Управление коннекторами',
    manageConnectorsDesc: 'Настройте коннекторы поставщиков ИИ',
    routingSettingsLabel: 'Настройки маршрутизации',
    routingSettingsDesc: 'Настройте маршрутизацию запросов',
  },
  catalog: {
    title: 'Каталог моделей',
    description: 'Просмотр и загрузка моделей ИИ',
    searchPlaceholder: 'Поиск моделей...',
    allCategories: 'Все',
    coding: 'Программирование',
    fileGeneration: 'Генерация файлов',
    imageGeneration: 'Генерация изображений',
    routing: 'Маршрутизация',
    reasoning: 'Рассуждение',
    thinking: 'Мышление и поиск',
    download: 'Загрузить',
    downloading: 'Загрузка...',
    installed: 'Установлено',
    failed: 'Сбой',
    unavailable: 'Недоступно',
    cloudOnly: 'Только облако',
    cancel: 'Отмена',
    recommended: 'Рекомендуется',
    noModels: 'Модели не найдены',
    activeDownloads: 'Активные загрузки',
    parameterCount: 'Параметры',
    modelSize: 'Размер',
    capabilities: 'Возможности',
    models: 'моделей',
    scrollForMore: 'Прокрутите для большего',
    allLoaded: 'Все модели загружены',
    searchBrowserHelpers: 'Помощники поиска/браузера',
    searchBrowserScoreLabel: 'Помощник',
    searchBrowserScoreTooltip:
      'Пригодность для сценариев поиска и браузера (оценка на основе метаданных, 0.00–1.00)',
    cancelDownloadFailed: 'Не удалось отменить загрузку',
    downloadCancelled: 'Загрузка отменена',
    downloadStarted: 'Загрузка начата',
    downloadStartFailed: 'Не удалось начать загрузку',
    modelRemoved: 'Модель удалена',
    modelRemoveFailed: 'Не удалось удалить модель',
  },
  replay: {
    title: 'Лаборатория воспроизведения маршрутизации',
    description:
      'Повторный запуск исторических решений маршрутизации относительно текущего маршрутизатора и сравнение результатов',
    runReplay: 'Запустить воспроизведение',
    running: 'Воспроизведение...',
    totalReplayed: 'Всего воспроизведено',
    changed: 'Изменено',
    unchanged: 'Без изменений',
    oldRoute: 'Исходный маршрут',
    newRoute: 'Новый маршрут',
    improvement: 'Улучшение',
    noResults: 'Результатов воспроизведения пока нет',
    confidenceOld: 'Средняя уверенность (старая)',
    confidenceNew: 'Средняя уверенность (новая)',
    replayComplete: 'Воспроизведение маршрутизации завершено',
    replayFailed: 'Не удалось выполнить воспроизведение маршрутизации',
    saveRun: 'Сохранить запуск',
    runName: 'Имя запуска',
    runNamePlaceholder: 'напр. baseline-2026-04',
    threadIdFilter: 'ID чата',
    threadIdPlaceholder: 'Фильтр по чату...',
    startDate: 'Дата начала',
    endDate: 'Дата окончания',
    suspicious: 'Подозрительно',
    avgImprovement: 'Ср. улучшение',
    needsReview: 'Требует проверки',
    noSuspiciousCases: 'Подозрительных случаев не обнаружено',
    noSuspiciousCasesDesc: 'Все результаты воспроизведения выглядят чистыми',
    confirmedRegression: 'Подтверждённая регрессия',
    markConfirmedRegression: 'Отметить как регрессию',
    caseReviewed: 'Случай успешно проверен',
    caseReviewFailed: 'Не удалось проверить случай',
    copyBundle: 'Копировать экспортный пакет',
    bundleCopied: 'Экспортный пакет скопирован в буфер обмена',
    exportFailed: 'Не удалось экспортировать пакет',
    runsHistory: 'История запусков',
    noRunsHistory: 'Сохранённых запусков пока нет',
    noRunsHistoryDesc:
      'Включите «Сохранить запуск» при выполнении воспроизведения для отслеживания истории',
    runResults: 'Результаты',
    correct_improvement: 'Улучшение',
    bad_regression: 'Регрессия',
    cost_win: 'Выигрыш по стоимости',
    quality_win: 'Выигрыш по качеству',
    uncertain: 'Неопределённо',
    badRegression: 'Регрессии',
    noOriginalContent: 'Исходная подсказка не сохранена',
    promoteCase: 'Продвинуть в тест',
    promoted: 'Случай продвинут в тестовую фикстуру',
    promoteFailed: 'Не удалось продвинуть случай',
    compareRuns: 'Сравнить запуски',
    compareRunsTitle: 'Сравнение запусков',
    compareRunsDesc: 'Выберите два запуска для сравнения решений маршрутизации',
    selectRunToCompare: 'Выберите запуск для сравнения',
    runA: 'Запуск A',
    runB: 'Запуск B',
    improved: 'Улучшено',
    regressed: 'Регрессия',
    suspiciousReasons: {
      empty_message_content: 'Отсутствует исходная подсказка',
      large_confidence_drop: 'Большое падение уверенности',
      large_cost_increase: 'Большое увеличение стоимости',
      route_changed_with_negative_improvement: 'Маршрут изменён с негативным эффектом',
    },
  },
  compare: {
    title: 'Сравнение моделей',
    description: 'Выберите 2–5 моделей и введите подсказку, чтобы сравнить ответы рядом',
    selectModels: 'Выбрать модели',
    minModels: 'Выберите не менее {min} моделей',
    maxModels: 'Максимум {max} моделей',
    sendPrompt: 'Сравнить модели',
    comparing: 'Сравнение...',
    compareFailed: 'Не удалось сравнить модели',
    results: 'Результаты',
    fastest: 'Самая быстрая',
    completed: 'Завершено',
    failed: 'Сбой',
    latency: 'Задержка',
    tokens: 'Токены',
    noResults: 'Результатов сравнения пока нет',
    modelCount: '{count} моделей',
    expand: 'Развернуть',
    bestResponse: 'Лучший ответ',
    viewInThread: 'Открыть в чате',
    totalTokens: 'Всего токенов',
    avgLatencyLabel: 'Ср. задержка',
    completedCount: 'Завершено: {count}',
    failedCount: 'Сбой: {count}',
    timeoutCount: 'Таймаут: {count}',
    modelsCompared: 'Сравнено моделей',
    summaryTitle: 'Сводка сравнения',
    showMore: 'Показать больше',
    showLess: 'Показать меньше',
    timeout: 'Таймаут',
    noContent: 'Содержимое недоступно',
    noJudge: 'Без судьи',
    judgeAwaiting: 'Ожидание судьи',
    judgeSkipped: 'Судья пропущен',
    judgeFailed: 'Сбой судьи',
    judgeUnavailable: 'Судья недоступен',
    judgeVerified: 'Проверено',
    judgeRevised: 'Пересмотрено',
    judgeEscalated: 'Эскалировано',
    modelsProcessing: 'Модели обрабатывают...',
    processingMessage: 'Обработка вашего сообщения...',
  },
  consensus: {
    title: 'Режим консенсуса',
    description: 'Выберите 2–5 моделей и дайте ИИ синтезировать согласованный ответ',
    selectModels: 'Выбрать модели',
    minModels: 'Выберите не менее {min} моделей',
    maxModels: 'Максимум {max} моделей',
    sendPrompt: 'Запустить консенсус',
    running: 'Выполняется консенсус...',
    sendFailed: 'Не удалось запустить консенсус',
    synthesizing: 'Синтез ответов...',
    synthesisReady: 'Синтез готов',
    synthesisTitle: 'Синтез консенсуса',
    agreementScore: 'Оценка согласия',
    confidenceLevel: 'Уверенность',
    agreements: 'Согласия',
    disagreements: 'Несогласия',
    contradictions: 'Противоречия',
    synthesisRationale: 'Обоснование',
    modelBreakdown: 'Разбивка по моделям',
    completed: 'Завершено',
    failed: 'Сбой',
    timeout: 'Таймаут',
    contentLength: 'Длина содержимого',
    noResults: 'Результатов консенсуса пока нет',
    viewInThread: 'Открыть в чате',
    high: 'Высокая',
    medium: 'Средняя',
    low: 'Низкая',
    modelsSelected: 'Выбрано моделей: {count}',
    synthesisRationaleLabel: 'Обоснование синтеза',
  },
  escalation: {
    title: 'Цепочка эскалации',
    description:
      'Определите цепочку моделей — дешёвые первыми, мощные последними. ИИ эскалирует автоматически при низком качестве',
    chainBuilder: 'Создайте цепочку',
    addModel: 'Добавить модель',
    removeModel: 'Удалить',
    moveUp: 'Переместить вверх',
    moveDown: 'Переместить вниз',
    minSteps: 'Добавьте не менее {min} моделей',
    maxSteps: 'Максимум {max} моделей в цепочке',
    sendPrompt: 'Запустить цепочку',
    running: 'Выполняется цепочка...',
    sendFailed: 'Не удалось запустить цепочку эскалации',
    synthesizing: 'Выполняется эскалация...',
    synthesisReady: 'Результат готов',
    resultTitle: 'Результат эскалации',
    stepUsed: 'Шаг использован',
    totalSteps: 'Всего шагов',
    escalated: 'Эскалировано',
    notEscalated: 'Эскалация не требуется',
    status: 'Статус',
    statusSingleStep: 'Решено на первом шаге',
    statusResolved: 'Решено после эскалации',
    statusExhausted: 'Все шаги исчерпаны',
    qualityScore: 'Оценка качества',
    latency: 'Задержка',
    step: 'Шаг',
    passed: 'Пройдено',
    failed: 'Сбой',
    finalModel: 'Итоговая модель',
    noResults: 'Результатов эскалации пока нет',
    viewInThread: 'Открыть в чате',
    stepsTimeline: 'Хронология шагов',
    finalAnswer: 'Итоговый ответ',
  },
  repair: {
    title: 'Лаборатория исправления ответов',
    description:
      'Исправляйте некорректные, поверхностные, неполные или галлюцинированные ответы без перезапуска.',
    contentLabel: 'Ответ для исправления',
    contentPlaceholder: 'Вставьте ответ, который хотите исправить...',
    repairTypes: 'Типы исправлений',
    schemaLabel: 'Схема',
    schemaDesc: 'Исправить некорректный JSON, неверную структуру или проблемы формата данных.',
    formatLabel: 'Формат',
    formatDesc:
      'Исправить форматирование markdown, заголовки, списки, блоки кода и общую структуру.',
    completenessLabel: 'Полнота',
    completenessDesc:
      'Расширить поверхностные или неполные разделы, добавить недостающие ключевые моменты.',
    factualityLabel: 'Фактологичность',
    factualityDesc:
      'Выявить и исправить фактические ошибки, галлюцинации или неверные утверждения.',
    sendPrompt: 'Исправить ответ',
    running: 'Исправление...',
    sendFailed: 'Не удалось запустить исправление. Попробуйте снова.',
    synthesizing: 'Исправление выполняется...',
    resultTitle: 'Исправленный ответ',
    noResults: 'Результатов исправления пока нет',
    viewInThread: 'Открыть в чате',
    finalAnswer: 'Итоговый ответ',
    provider: 'Провайдер',
    model: 'Модель',
  },
  decompose: {
    title: 'Маршрутизатор декомпозиции задач',
    description:
      'Разбейте сложные задачи на подзадачи, выполните каждую лучшей моделью и синтезируйте результаты.',
    contentLabel: 'Сложная задача',
    contentPlaceholder:
      'Опишите сложную задачу для декомпозиции, напр. «Исследуйте тренды ИИ в 2025, создайте план из 3 пунктов и напишите резюме для руководства».',
    maxSubTasks: 'Макс. подзадач',
    sendPrompt: 'Декомпозировать и выполнить',
    running: 'Декомпозиция…',
    synthesizing: 'Выполнение подзадач и синтез результатов…',
    resultTitle: 'Синтезированный результат',
    viewInThread: 'Открыть в чате',
    subTasksHeader: 'Результаты подзадач',
    subTaskResult: 'Результат',
    category: 'Категория',
    model: 'Модель',
    latencyMs: 'Задержка',
    noResults: 'Результатов декомпозиции нет',
    sendFailed: 'Декомпозиция задачи не удалась. Попробуйте снова.',
  },
  bestOfN: {
    title: 'Генерация кандидатов Best-of-N',
    description:
      'Сгенерируйте несколько ответов-кандидатов и автоматически выберите самый качественный.',
    contentLabel: 'Подсказка',
    contentPlaceholder: 'Введите подсказку для генерации нескольких кандидатов…',
    nCandidates: 'Кандидатов (N)',
    sendPrompt: 'Сгенерировать Best-of-N',
    running: 'Генерация кандидатов…',
    synthesizing: 'Оценка и выбор лучшего кандидата…',
    resultTitle: 'Лучший кандидат',
    viewInThread: 'Открыть в чате',
    candidatesHeader: 'Все кандидаты',
    rank: 'Ранг',
    score: 'Оценка',
    model: 'Модель',
    latency: 'Задержка',
    noResults: 'Кандидаты не сгенерированы',
    sendFailed: 'Генерация кандидатов не удалась. Попробуйте снова.',
  },
  recovery: {
    title: 'Восстановление после сбоев маршрутов',
    description:
      'Отслеживайте сбои провайдеров и события автоматического резервного восстановления.',
    totalDecisions: 'Всего решений',
    totalFallbacks: 'Событий резерва',
    fallbackRate: 'Частота резерва',
    providerTable: 'Разбивка сбоев провайдеров',
    provider: 'Провайдер',
    fallbackCount: 'Резервы',
    rate: 'Частота',
    recentFallbacks: 'Недавние события резерва',
    originalProvider: 'Исходный',
    originalModel: 'Модель',
    fallbackProvider: 'Резерв',
    fallbackModel: 'Резервная модель',
    mode: 'Режим',
    time: 'Время',
    noFallbacks: 'Событий резерва нет',
    noData: 'Решений маршрутизации пока не записано.',
    loading: 'Загрузка данных восстановления…',
    error: 'Не удалось загрузить статистику восстановления.',
  },
  verify: {
    title: 'Верификатор',
    description: 'Сгенерируйте и проверьте ответ перед отправкой',
    contentLabel: 'Ваша подсказка',
    contentPlaceholder: 'Введите ваш вопрос или задачу...',
    maxRevisionsLabel: 'Макс. ревизий',
    sendPrompt: 'Проверить и отправить',
    running: 'Проверка...',
    synthesizing: 'Генерация и проверка ответа...',
    noResults: 'Проверенного ответа пока нет',
    sendFailed: 'Проверка не удалась. Попробуйте снова.',
    verified: 'Проверено',
    verifierScore: 'Оценка качества',
    revisions: 'Ревизии',
    issues: 'Проблемы',
    viewInThread: 'Открыть в чате',
  },
  adaptiveLearning: {
    title: 'Адаптивное обучение маршрутизации',
    description: 'Инсайты из истории маршрутизации для улучшения будущих решений',
    loading: 'Загрузка инсайтов...',
    error: 'Не удалось загрузить инсайты',
    windowDays: 'Окно',
    days: 'дней',
    totalDecisions: 'Всего решений',
    avgConfidence: 'Ср. уверенность',
    topReasonTags: 'Топ тегов причин',
    providerTable: 'Производительность провайдеров',
    modeBreakdown: 'Разбивка по режимам',
    noData: 'В этом окне нет решений маршрутизации',
    provider: 'Провайдер',
    fallbackRate: 'Частота резерва',
    totalCalls: 'Всего вызовов',
    topModes: 'Топ режимов',
    mode: 'Режим',
    count: 'Количество',
    percentage: 'Процент',
  },
  pipeline: {
    title: 'Многоэтапный конвейер',
    description: 'Направляйте запрос через цепочку специализированных этапов',
    contentLabel: 'Ваш запрос',
    contentPlaceholder: 'Опишите, что вам нужно...',
    templateLabel: 'Шаблон конвейера',
    templateAnalyze: 'Анализ → Рассуждение → Форматирование',
    templateCode: 'Код → Отладка → Ревью',
    templateDraft: 'Черновик → Критика → Ревизия',
    sendPrompt: 'Запустить конвейер',
    running: 'Выполняется конвейер...',
    synthesizing: 'Обработка этапов...',
    noResults: 'Результатов конвейера пока нет',
    sendFailed: 'Конвейер завершился сбоем. Попробуйте снова.',
    stageBreakdown: 'Разбивка по этапам',
    stage: 'Этап',
    model: 'Модель',
    latency: 'Задержка',
    viewInThread: 'Открыть в чате',
  },
  costEnsemble: {
    title: 'Ансамбль с учётом стоимости',
    description:
      'Умное выполнение: используйте одну, две или три модели в зависимости от сложности задачи',
    contentLabel: 'Ваша подсказка',
    contentPlaceholder: 'Введите ваш вопрос или задачу...',
    sendPrompt: 'Анализировать и отправить',
    running: 'Анализ стоимости...',
    synthesizing: 'Выбор оптимального ансамбля...',
    noResults: 'Результатов пока нет',
    sendFailed: 'Ансамбль по стоимости не удался. Попробуйте снова.',
    tier: 'Уровень',
    tierSingle: 'Одиночный',
    tierDuo: 'Дуэт',
    tierTrio: 'Трио',
    complexity: 'Сложность',
    risk: 'Риск',
    ambiguity: 'Неоднозначность',
    reasoning: 'Рассуждение',
    candidates: 'Кандидаты',
    viewInThread: 'Открыть в чате',
  },
  rolePack: {
    title: 'Ансамбль на основе ролей',
    description: 'Отправьте запрос команде специализированных ролей ИИ',
    contentLabel: 'Ваш запрос',
    contentPlaceholder: 'Опишите, что вам нужно...',
    packLabel: 'Выберите команду',
    packCoding: 'Команда разработчиков',
    packResearch: 'Исследовательская команда',
    packMarketing: 'Маркетинговая команда',
    packLegal: 'Юридическая команда',
    sendPrompt: 'Запустить команду',
    running: 'Команда обрабатывает...',
    synthesizing: 'Запуск всех ролей параллельно...',
    noResults: 'Результатов команды пока нет',
    sendFailed: 'Запуск команды не удался. Попробуйте снова.',
    teamBreakdown: 'Результаты команды',
    role: 'Роль',
    model: 'Модель',
    latency: 'Задержка',
    viewInThread: 'Открыть в чате',
  },
  advancedModelSelector: {
    label: 'Модель выполнения',
    auto: 'Авто (выбрать лучшую локальную модель)',
    loading: 'Загрузка моделей...',
    description:
      'Выберите Авто или конкретную локально установленную модель Ollama для этой лаборатории.',
    empty: 'Локальных текстовых моделей для этой лаборатории пока нет.',
  },
  workspaceConnectors: {
    title: 'Коннекторы рабочей области',
    description:
      'Подключите инструменты рабочей области — GitHub, Slack, Jira, Google Drive и другие.',
    createConnector: 'Создать коннектор',
    editConnector: 'Изменить коннектор',
    deleteConnector: 'Удалить коннектор',
    testHealth: 'Проверить состояние',
    triggerSync: 'Синхронизировать',
    name: 'Название',
    nameHelp: 'Отображаемое имя для этого коннектора',
    provider: 'Провайдер',
    providerHelp: 'Инструмент рабочей области для подключения',
    permissionLevel: 'Уровень разрешений',
    permissionLevelHelp: 'Уровень доступа, предоставленный этому коннектору',
    status: 'Статус',
    connected: 'Подключено',
    degraded: 'Снижено',
    disconnected: 'Отключено',
    pendingAuth: 'Ожидание аутентификации',
    unknown: 'Неизвестно',
    noConnectors: 'Коннекторов рабочей области нет',
    noConnectorsDesc: 'Подключите первый инструмент рабочей области для начала.',
    noConnectorsGuidance:
      'Подключения начинаются с конфигураций приложений. Зарегистрируйте там OAuth-приложение, затем нажмите «Подключить», чтобы связать его здесь.',
    overviewDescription:
      'Ваши подключённые инструменты рабочей области. Добавьте новые в конфигурациях приложений.',
    manageAppConfigs: 'Управление конфигурациями приложений',
    goToAppConfigs: 'Перейти к конфигурациям',
    connectorCreated: 'Коннектор успешно создан.',
    connectorCreateFailed: 'Не удалось создать коннектор.',
    connectorDeleted: 'Коннектор успешно удалён.',
    connectorDeleteFailed: 'Не удалось удалить коннектор.',
    healthCheckStarted: 'Проверка состояния запущена.',
    healthCheckFailed: 'Проверка состояния не удалась.',
    syncStarted: 'Синхронизация запущена.',
    syncFailed: 'Не удалось запустить синхронизацию.',
    loadFailed: 'Не удалось загрузить коннекторы.',
    loadingConnectors: 'Загрузка коннекторов...',
    addConnector: 'Добавить коннектор',
    connectViaOAuth: 'Подключиться через OAuth',
    lastSync: 'Последняя синхронизация',
    never: 'Никогда',
    syncRuns: 'Запуски синхронизации',
    healthEvents: 'События состояния',
    enabled: 'Включено',
    disabled: 'Отключено',
    deleteConfirm: 'Вы уверены, что хотите удалить этот коннектор? Это действие нельзя отменить.',
    namePlaceholder: 'например, GitHub Workspace',
    paused: 'На паузе',
  },
  workspaceObjects: {
    title: 'Синхронизированные объекты',
    description: 'Объекты, синхронизированные из подключённых инструментов рабочей области.',
    loading: 'Загрузка объектов...',
    loadFailed: 'Не удалось загрузить объекты рабочей области.',
    noObjects: 'Объекты ещё не синхронизированы.',
    noObjectsDesc:
      'Запустите синхронизацию коннектора, чтобы импортировать объекты рабочей области.',
    selectConnector: 'Выберите коннектор, чтобы увидеть синхронизированные объекты.',
    source: 'Источник',
    viewObject: 'Просмотреть объект',
  },
  workspaceSearch: {
    title: 'Поиск по рабочей области',
    description: 'Поиск по всем синхронизированным объектам рабочей области.',
    placeholder: 'Поиск документов, задач, сообщений...',
    searching: 'Поиск...',
    noResults: 'Результаты не найдены.',
    noResultsDesc: 'Попробуйте другой поисковый запрос или синхронизируйте больше коннекторов.',
    searchFailed: 'Поиск не удался. Попробуйте снова.',
    resultCount: 'Результатов: {count}',
    viewSource: 'Просмотреть источник',
    score: 'Релевантность',
  },
  workspaceObjectDetail: {
    title: 'Детали объекта',
    description: 'Изучите синхронизированный объект и обновите его от провайдера.',
    loadFailed: 'Не удалось загрузить объект.',
    refresh: 'Обновить от провайдера',
    refreshing: 'Обновление...',
    refreshFailed: 'Обновление не удалось.',
    content: 'Содержимое',
    metadata: 'Метаданные',
    externalCreated: 'Создано во внешней системе',
    externalUpdated: 'Обновлено во внешней системе',
    openInProvider: 'Открыть у провайдера',
    author: 'Автор: {author}',
  },
  connectorDetail: {
    title: 'Детали коннектора',
    description:
      'История синхронизации, события состояния и недавно синхронизированные объекты для этого коннектора.',
    loadFailed: 'Не удалось загрузить коннектор.',
    never: 'никогда',
    lastSync: 'Последняя синхронизация: {value}',
    syncRunsCount: 'Запусков синхронизации: {count}',
    objectsCount: 'Объектов: {count}',
    recentObjects: 'Недавние объекты',
    noObjects:
      'Синхронизированных объектов пока нет. Запустите синхронизацию, чтобы получить объекты от провайдера.',
    syncHistory: 'История синхронизации',
    noSyncRuns: 'Запусков синхронизации пока нет.',
    syncRunLine: '{synced} синхр. · {failed} сбоев',
    healthHistory: 'История состояния',
    noHealthEvents: 'Проверок состояния пока не записано.',
    healthOk: 'OK',
    activating:
      'Активация этого коннектора — импортируется первый набор объектов от провайдера. Вы можете продолжать использовать Claw, пока это выполняется.',
    askAi: 'Спросить ИИ об этом',
    askAiTitle: 'О {name}',
    reconnect: 'Переподключить',
    reconnectTitle: 'Этот коннектор отключён',
    reconnectDescription:
      'Сохранённые учётные данные больше недействительны. Авторизуйтесь заново в конфигурациях приложений для восстановления доступа.',
  },
  workspaceSyncRuns: {
    title: 'Запуски синхронизации',
    description: 'История недавних синхронизаций для этого коннектора.',
    loading: 'Загрузка запусков синхронизации...',
    loadFailed: 'Не удалось загрузить запуски синхронизации.',
    empty: 'Запусков синхронизации пока нет.',
    started: 'Начато',
    status: 'Статус',
    type: 'Тип',
    delta: 'Дельта',
    found: 'Найдено',
    synced: 'Синхронизировано',
    failed: 'Сбои',
    duration: 'Длительность',
  },
  workspaceSync: {
    dashboard: {
      title: 'Состояние синхронизации рабочей области',
      description:
        'Актуальный обзор запланированных заданий синхронизации по всем коннекторам рабочей области.',
      error_title: 'Не удалось загрузить панель синхронизации',
      empty_title: 'Коннекторов пока нет',
      empty_description:
        'Как только вы подключите инструмент рабочей области, его состояние синхронизации появится здесь.',
      scheduler_title: 'Планировщик',
      scheduler_enabled: 'Планировщик включён',
      last_tick: 'Последний тик',
      active_runs: 'Активные запуски',
      dlq_backlog: 'Очередь DLQ',
      connectors_title: 'Коннекторы',
      col: {
        connector: 'Коннектор',
        freshness: 'Свежесть',
        last_sync: 'Последняя синхр.',
        cadence: 'Периодичность',
        success_rate: 'Успех за 24 ч',
        avg_duration: 'Ср. длительность',
        status: 'Статус',
      },
    },
    band: {
      fresh: 'Свежее',
      slow: 'Медленно',
      stale: 'Устарело',
    },
    cadence: {
      label: 'Синхронизировать каждые',
      '1m': '1 минута',
      '5m': '5 минут',
      '10m': '10 минут',
      '30m': '30 минут',
      '1h': '1 час',
      save: 'Сохранить периодичность',
      saving: 'Сохранение...',
      saved: 'Периодичность обновлена',
    },
    pause: {
      pause: 'Приостановить синхронизацию',
      resume: 'Возобновить синхронизацию',
      paused_label: 'Синхронизация приостановлена',
      reason_placeholder: 'Причина (опционально)',
    },
    chip: {
      synced_ago: 'Синхронизировано {ago} назад',
      stale: 'Устарело',
      paused: 'Приостановлено',
    },
  },
  aiActions: {
    dialog: {
      title: 'Запуск действия ИИ · {action}',
      description:
        'Выберите модель и сгенерируйте. AUTO позволяет маршрутизатору выбирать на основе типа действия и класса приватности.',
      model_label: 'Модель',
      generate: 'Сгенерировать',
      regenerate: 'Перегенерировать',
      resolving: 'Генерация…',
      cancel: 'Отмена',
      close: 'Закрыть',
      copy: 'Копировать',
      copied: 'Скопировано',
      generated_by: 'Сгенерировано {model}',
      resolution_mode: 'Режим: {mode}',
      resolution_primary: 'Основная: {model}',
      resolution_fallback: 'Резервных моделей в очереди: {count}',
    },
  },
  approvals: {
    page: {
      title: 'Центр согласований',
      description:
        'Проверяйте и согласовывайте ожидающие действия, подготовленные ИИ, для ваших коннекторов рабочей области.',
      empty_title: 'Ожидающих согласований нет',
      empty_description:
        'Когда ИИ подготовит действие от вашего имени, оно появится здесь для проверки.',
      error_title: 'Не удалось загрузить согласования',
      error_description: 'Что-то пошло не так при загрузке списка согласований. Попробуйте снова.',
    },
    card: {
      approve: 'Согласовать',
      reject: 'Отклонить',
      edit: 'Изменить',
      edited: 'Изменено · v{version}',
      source_stale: 'Источник устарел',
      attribution_auto: 'AUTO · {model}',
      attribution_manual: 'Вручную · {model}',
    },
    bulk: {
      selected: 'Выбрано: {count}',
      approve_all: 'Согласовать все выбранные',
      clear: 'Очистить выбор',
    },
    edit: {
      title: 'Изменить черновик',
      description: 'Измените полезную нагрузку действия. Исходный черновик сохраняется в истории.',
      payload_label: 'Полезная нагрузка (JSON)',
      reason_placeholder: 'Причина изменения (опционально)',
      save: 'Сохранить и согласовать позже',
      cancel: 'Отмена',
      invalid_json: 'Полезная нагрузка должна быть корректным JSON',
    },
    reject: {
      title: 'Отклонить действие',
      description: 'При желании опишите, почему вы отклоняете это действие.',
      reason_placeholder: 'Причина (опционально)',
      confirm: 'Отклонить',
      cancel: 'Отмена',
    },
  },
  automationPreferences: {
    page: {
      title: 'Настройки автоматизации',
      description:
        'Управление по типу действия. Побеждает самое строгое: политика администратора — это нижняя граница; ваши настройки могут только ужесточить её.',
      loading: 'Загрузка настроек…',
      error: 'Не удалось загрузить настройки. Обновите.',
      empty: 'Типы действий пока не доступны.',
    },
    row: {
      enabled: 'Включено',
      disabled: 'Отключено',
      toggleAria: 'Переключить автоматизацию для {kind}',
      autoApproveBelowRisk: 'Авто-одобрение, когда риск ≤ порога',
      autoApproveDisabled: 'Авто-одобрение отключено (всегда в очередь)',
      autoApproveAt: 'Авто-одобрение при риске ≤ {score}',
      perDayBudget: 'Дневной лимит',
      perDayBudgetPlaceholder: 'unlimited',
      clear: 'Очистить',
    },
  },
  connectorGrants: {
    title: 'Доступ',
    description:
      'Поделитесь этим коннектором с другими пользователями. Владелец всегда имеет полный доступ; получатели видят выбранный вами уровень доступа.',
    loading: 'Загрузка прав…',
    error: 'Не удалось загрузить права.',
    empty: 'Прав пока нет. Этот коннектор доступен только вам.',
    granteeUserIdLabel: 'ID пользователя-получателя',
    granteeUserIdPlaceholder: 'cmnkgdc2c00009w92riuztmmd',
    accessLevelLabel: 'Уровень доступа',
    grant: 'Предоставить доступ',
    granting: 'Предоставление…',
    revoke: 'Отозвать',
    revoking: 'Отзыв…',
    grantedBy: 'предоставлено',
    levelReadOnly: 'Только чтение',
    levelAiActions: 'AI-действия',
    levelFull: 'Полный',
  },
  emailSignatures: {
    page: {
      title: 'Подписи писем',
      description:
        'Управляйте подписями, добавляемыми к письмам, составленным ИИ. Отметьте одну как основную для автоматического использования.',
      loading: 'Загрузка подписей…',
      error: 'Не удалось загрузить подписи. Обновите страницу.',
      empty: 'Подписей пока нет. Создайте, чтобы начать.',
      create: 'Новая подпись',
      edit: 'Изменить',
      delete: 'Удалить',
      deleting: 'Удаление…',
      defaultBadge: 'Основная',
    },
    dialog: {
      createTitle: 'Создать подпись',
      editTitle: 'Изменить подпись',
      nameLabel: 'Название',
      namePlaceholder: 'Рабочая подпись',
      bodyLabel: 'Содержимое',
      bodyPlaceholder: 'С уважением,\nAlice\nВП по инженерии · Example Inc.',
      defaultLabel: 'Использовать как основную',
      save: 'Сохранить',
      saving: 'Сохранение…',
      cancel: 'Отмена',
    },
  },
  research: {
    toggle: {
      placeholder: 'Исследование',
      autoProvider: 'Авто провайдер',
      noProviders: 'Провайдеры не настроены',
    },
    modes: {
      off: 'Без исследования',
      searchOnly: 'Веб-поиск',
      searchThenFetch: 'Поиск + загрузка',
      searchFetchExtract: 'Поиск + извлечение',
    },
    providers: {
      title: 'Провайдеры исследований',
      description: 'Динамические провайдеры поиска, загрузки и доказательств.',
      createButton: 'Новый провайдер',
      createTitle: 'Добавить провайдера исследований',
      createDescription: 'Зарегистрируйте провайдера Tavily / SearXNG / Ollama Web.',
      create: 'Создать',
      creating: 'Создание...',
      kind: 'Тип',
      name: 'Название',
      baseUrl: 'Базовый URL',
      apiKey: 'API-ключ (хранится зашифрованным)',
      test: 'Проверить',
      secretStored: 'Секрет сохранён',
      healthy: 'Работает',
      unhealthy: 'Не работает',
      loadFailed: 'Не удалось загрузить провайдеров.',
      emptyTitle: 'Провайдеров исследований нет',
      emptyDescription: 'Добавьте провайдера, чтобы обогатить чат живыми доказательствами.',
      col: {
        name: 'Название',
        kind: 'Тип',
        baseUrl: 'Базовый URL',
        status: 'Статус',
        secret: 'Секрет',
        actions: 'Действия',
      },
      namePlaceholder: 'например, Tavily Production',
    },
    runs: {
      title: 'Запуски исследований',
      description: 'История запусков исследований из чата.',
      loadFailed: 'Не удалось загрузить запуски.',
      emptyTitle: 'Запусков исследований пока нет',
      emptyDescription: 'Включите исследование в чате, чтобы получить доказательства.',
    },
    evidence: {
      title: 'Живые доказательства исследования',
      empty: 'Элементы доказательств не возвращены.',
      noTitle: '(без названия)',
      confidence: 'Уверенность',
      warnings: 'Предупреждения',
      requestedModel: 'Запрошенная модель',
      toolsUsed: 'Инструменты',
    },
    results: {
      open: 'Результаты поиска',
      title: 'Результаты исследования',
      description:
        'Изучите выбор провайдера, цепочку резерва, пакет доказательств и трассировку исследования.',
      provider: 'Провайдер',
      selectionMode: 'Выбор',
      selectionAuto: 'Авто',
      selectionExplicit: 'Явный',
      fallbackUsed: 'Использован резерв',
      query: 'Запрос исследования',
      evidenceCount: 'Элементы доказательств',
      attempts: 'Попытки провайдеров',
      trace: 'Трассировка исследования',
    },
  },
  workspaceActions: {
    title: 'Действия рабочей области',
    description: 'Проверяйте и согласовывайте автоматические действия записи перед их выполнением.',
    approve: 'Согласовать',
    reject: 'Отклонить',
    cancel: 'Отмена',
    rejectTitle: 'Отклонить действие',
    rejectDesc: 'Укажите необязательную причину отклонения этого действия.',
    rejectReasonPlaceholder: 'Причина (опционально)',
    confirmReject: 'Подтвердить отклонение',
    connector: 'Коннектор',
    rejectionReason: 'Причина отклонения',
    pendingApproval: 'Ожидает согласования',
    executing: 'Выполняется',
    executed: 'Выполнено',
    failed: 'Сбой',
    rejected: 'Отклонено',
    noActions: 'Действия не найдены',
    noActionsDesc:
      'Автоматические действия записи, созданные ИИ, появятся здесь для вашей проверки.',
    loadFailed: 'Не удалось загрузить действия.',
    viewPayload: 'Просмотреть полезную нагрузку',
    requestedAt: 'запрошено {value}',
    reviewedAt: 'проверено {value}',
    executedAt: 'выполнено {value}',
    approved: 'Одобрено',
    expired: 'Истекло',
    edited: 'Отредактировано',
  },
  workspaceProviders: {
    catalog: {
      title: 'Каталог провайдеров рабочей области',
      description: 'Просмотр поддерживаемых интеграций рабочей области.',
      loadFailed: 'Не удалось загрузить каталог провайдеров.',
      emptyTitle: 'Нет доступных провайдеров',
      emptyDescription: 'Провайдеры рабочей области ещё не зарегистрированы.',
      available: 'Доступно',
      comingSoon: 'Скоро',
      objectTypes: 'типы объектов',
      docs: 'Документация',
    },
    appConfigs: {
      title: 'Конфигурации приложений провайдеров',
      description:
        'Регистрируйте OAuth-приложения и учётные данные для провайдеров рабочей области.',
      createButton: 'Новая конфигурация',
      createTitle: 'Создать конфигурацию приложения провайдера',
      createDescription: 'Зарегистрируйте учётные данные OAuth или персональный токен доступа.',
      create: 'Создать',
      creating: 'Создание...',
      editTitle: 'Изменить конфигурацию приложения поставщика',
      editDescription:
        'Обновите значения конфигурации и метаданные этого поставщика. Оставьте секретные поля пустыми, чтобы сохранить их без изменений.',
      editSecretHint:
        'Секретные поля, оставленные пустыми, сохранят ранее сохранённое значение. Заполняйте их только для ротации учётных данных.',
      save: 'Сохранить',
      saving: 'Сохранение…',
      provider: 'Провайдер',
      providerPlaceholder: 'Выберите провайдера...',
      name: 'Название',
      namePlaceholder: 'напр. GitHub production app',
      authMode: 'Режим аутентификации',
      descriptionLabel: 'Описание',
      descriptionPlaceholder: 'Необязательные заметки об этой конфигурации',
      test: 'Проверить',
      connect: 'Подключить',
      testResult: 'Результат проверки: {status} ({latency} мс)',
      secretStored: 'Секрет сохранён',
      emptyTitle: 'Конфигураций провайдеров пока нет',
      emptyDescription:
        'Добавьте первые учётные данные провайдера, чтобы включить коннекторы рабочей области.',
      loadFailed: 'Не удалось загрузить конфигурации приложений.',
      fields: {
        secret: '(секрет)',
      },
      columns: {
        name: 'Название',
        provider: 'Провайдер',
        authMode: 'Аутентификация',
        status: 'Статус',
        secret: 'Секрет',
        lastValidated: 'Последняя проверка',
        actions: 'Действия',
      },
      errors: {
        nameRequired: 'Название обязательно.',
      },
    },
    oauthCallback: {
      exchangingTitle: 'Завершение подключения...',
      exchangingDescription: 'Обмен кода авторизации с провайдером.',
      successTitle: 'Подключено!',
      successDescription: 'Перенаправление обратно в рабочую область...',
      successDescriptionNamed: '{name} подключён. Перенаправление обратно...',
      errorTitle: 'Сбой подключения',
      errorUnknown: 'Произошла неизвестная ошибка.',
    },
  },
  agent: {
    title: 'Настольный агент',
    description: 'Управление подключёнными настольными агентами и командами терминала.',
    loading: 'Загрузка сессий агента...',
    loadFailed: 'Не удалось загрузить данные агента.',
    noSessions: 'Активных сессий нет',
    noSessionsDesc: 'Запустите настольный агент Claw на вашей машине для подключения.',
    noCommands: 'Команд нет',
    noCommandsDesc: 'Ожидающие команды терминала появятся здесь.',
    noRepos: 'Репозиториев нет',
    noReposDesc: 'Репозитории, обнаруженные агентом, появятся здесь.',
    terminal: 'Команды терминала',
    terminalDesc: 'Согласовывайте или отклоняйте команды терминала, запрошенные агентом.',
    capabilities: 'Очередь возможностей',
    capabilitiesDesc:
      'Согласовывайте или отклоняйте вызовы возможностей в файловой системе, процессах, браузере и других классах.',
    capabilityClass: 'Класс',
    capabilityOperation: 'Операция',
    blastRadius: 'Радиус воздействия',
    reversibility: 'Обратимость',
    riskScore: 'Оценка риска',
    matchedPolicy: 'Совпадающая политика',
    activity: 'Активность агента',
    activityDesc: 'Недавние возможности и запуски рецептов на всех ваших устройствах.',
    autoApproved: 'Авто-одобрено',
    denied: 'Отклонено',
    rolledBack: 'Откачено',
    recipes: 'Рецепты',
    recipesDesc: 'Многошаговые автоматизации, связывающие вызовы возможностей в цепочки.',
    noRecipes: 'Пока нет рецептов',
    noRecipesDesc: 'Создайте рецепт, чтобы автоматизировать многошаговые рабочие процессы.',
    recipeRunDetail: 'Детали запуска',
    recipeRunDetailDesc: 'Живой прогресс запуска рецепта.',
    runStatus: 'Статус запуска',
    cancelRun: 'Отменить запуск',
    steps: 'Шаги',
    marketplace: 'Магазин рецептов',
    marketplaceDesc: 'Просмотр и установка подписанных рецептов от сообщества.',
    noListings: 'Пока нет объявлений',
    noListingsDesc: 'Когда издатели публикуют подписанные рецепты, они появляются здесь.',
    install: 'Установить',
    activityMemory: 'Память активности',
    activityMemoryDesc: 'Записи активности, синхронизированные в облаке с ваших устройств.',
    noActivity: 'Пока нет записей активности',
    noActivityDesc:
      'Активность с ваших устройств появляется здесь только после opt-in облачной синхронизации.',
    repos: 'Репозитории',
    reposDesc: 'обнаружено репозиториев',
    pendingCommands: 'Ожидающие команды',
    pendingApproval: 'Ожидает согласования',
    recentCommands: 'Недавние команды',
    approve: 'Согласовать',
    reject: 'Отклонить',
    version: 'Версия',
    commands: 'команд',
    files: 'файлов',
    dirty: 'Изменён',
    connect: {
      title: 'Подключить устройство',
      approveDescription: 'Проверьте детали устройства и разрешения перед согласованием.',
      scopesLabel: 'Разрешения (области)',
      approveButton: 'Согласовать',
      denyButton: 'Отмена',
      successTitle: 'Устройство связано',
      successBody: 'Вы можете закрыть эту вкладку и вернуться в терминал.',
      expiredTitle: 'Ссылка сопряжения недействительна или истекла',
      expiredBody: 'Повторно выполните `claw-agent login`, чтобы начать новое сопряжение.',
      deniedTitle: 'Согласование отменено',
      deniedBody: 'Учётные данные не выданы. Вы можете закрыть эту вкладку.',
      accountMismatchTitle: 'Неверный аккаунт',
      accountMismatchBody: 'Войдите с аккаунтом, к которому хотите привязать это устройство.',
      deviceNamePlaceholder: 'например, My MacBook Pro',
    },
    rejectedByUser: 'Отклонено пользователем',
  },
  discovery: {
    title: 'Обнаружение моделей',
    description: 'Обнаруживайте, классифицируйте и согласовывайте новые модели Ollama динамически.',
    searchPlaceholder: 'Поиск кандидатов...',
    filter: {
      status: 'Статус',
      all: 'Все',
      pending: 'Ожидает',
      approved: 'Согласовано',
      rejected: 'Отклонено',
      imported: 'Импортировано',
      duplicate: 'Дубликат',
    },
    actions: {
      refresh: 'Запустить обнаружение',
      dryRun: 'Тестовый запуск',
      approve: 'Согласовать',
      reject: 'Отклонить',
    },
    runs: {
      title: 'Недавние запуски обнаружения',
      empty: 'Запусков обнаружения пока нет. Нажмите «Запустить обнаружение», чтобы начать.',
      discovered: 'обнаружено',
      imported: 'импортировано',
      skipped: 'пропущено',
    },
    candidates: {
      title: 'Кандидаты',
      empty: {
        title: 'Кандидатов нет',
        description: 'Запустите обнаружение, чтобы найти новые модели.',
      },
    },
    candidate: {
      size: 'Размер',
      confidence: 'Уверенность',
    },
    packs: {
      title: 'Аппаратные наборы',
      empty: 'Аппаратных наборов не настроено.',
      install: 'Установить набор',
      noModelsYet: 'Пока нет моделей, соответствующих этому профилю.',
    },
  },
  validation: {
    required: 'Это поле обязательно',
    invalidEmail: 'Введите корректный email',
    tooShort: 'Должно быть не менее {min} символов',
    tooLong: 'Должно быть не более {max} символов',
    invalidUrl: 'Введите корректный URL',
    fileTooLarge: 'Размер файла превышает допустимый максимум',
    invalidFileType: 'Этот тип файла не поддерживается',
  },
  toast: {
    loginSuccess: 'Вход выполнен успешно',
    loginFailed: 'Не удалось войти',
    logoutFailed: 'Не удалось выйти',
    sessionExpired: 'Сессия истекла, войдите снова',
  },
  accessibility: {
    closeSidebar: 'Закрыть боковую панель',
    openSidebar: 'Открыть боковую панель',
    toggleSidebar: 'Переключить боковую панель',
    userMenu: 'Меню пользователя',
    closeDialog: 'Закрыть диалог',
    openMenu: 'Открыть меню',
    search: 'Поиск',
    openSearch: 'Открыть поиск',
    closeSearch: 'Закрыть поиск',
    navigation: 'Основная навигация',
    notifications: 'Уведомления',
    languageSelector: 'Выбрать язык',
    themeToggle: 'Переключить тему',
    resizeInput: 'Изменить размер поля ввода',
  },
  actions: {
    test: 'Проверить',
    testing: 'Проверка...',
    sync: 'Синхронизация',
    syncing: 'Синхронизация...',
    archive: 'Архивировать',
    unarchive: 'Разархивировать',
    pin: 'Закрепить',
    unpin: 'Открепить',
    duplicate: 'Дублировать',
    copy: 'Копировать',
    copied: 'Скопировано',
    copyToClipboard: 'Копировать в буфер обмена',
    view: 'Просмотреть',
    viewAll: 'Просмотреть все',
    viewDetails: 'Просмотреть детали',
    download: 'Скачать',
    upload: 'Загрузить',
    refresh: 'Обновить',
    reset: 'Сбросить',
    apply: 'Применить',
    approve: 'Согласовать',
    approving: 'Согласование...',
    reject: 'Отклонить',
    rejecting: 'Отклонение...',
    reload: 'Перезагрузить',
    reconnect: 'Переподключить',
    expand: 'Развернуть',
    collapse: 'Свернуть',
    enable: 'Включить',
    disable: 'Отключить',
    remove: 'Удалить',
    add: 'Добавить',
    select: 'Выбрать',
    selectAll: 'Выбрать все',
    deselectAll: 'Снять выбор',
    clear: 'Очистить',
    submit: 'Отправить',
    more: 'Больше',
    less: 'Меньше',
    showMore: 'Показать больше',
    showLess: 'Показать меньше',
  },
  logs: {
    allLevels: 'Все уровни',
    allActions: 'Все действия',
    allSeverities: 'Вся важность',
    allMethods: 'Все методы',
    methodPlaceholder: 'Метод',
    componentPlaceholder: 'Компонент...',
    actionPlaceholder: 'Действие...',
    routePlaceholder: 'Маршрут...',
    routeRegexPlaceholder: 'Маршрут (regex)...',
    userIdPlaceholder: 'ID пользователя...',
    messageContainsPlaceholder: 'Сообщение содержит...',
    servicePlaceholder: 'Сервис...',
    controllerPlaceholder: 'Контроллер...',
    entityTypePlaceholder: 'Тип сущности...',
    startDate: 'Дата начала',
    endDate: 'Дата окончания',
    fullTextSearch: 'Полнотекстовый поиск...',
    searchAllFields: 'Поиск по всем полям...',
    avgLatency: 'Средняя задержка',
    errors: 'Ошибки',
    failedToLoadClient: 'Не удалось загрузить журналы клиента',
    failedToLoadClientDesc: 'Не удалось получить журналы клиента с сервера',
    failedToLoadServer: 'Не удалось загрузить журналы сервера',
    failedToLoadServerDesc: 'Не удалось получить журналы сервера с сервера',
    levelDistribution: 'Распределение по уровням',
    loadingClient: 'Загрузка журналов клиента...',
    loadingServer: 'Загрузка журналов сервера...',
    noActionData: 'Нет данных о действиях',
    noClientLogs: 'Нет журналов клиента',
    noClientLogsActivityDesc: 'Активность в журналах клиента пока не зафиксирована',
    noComponentData: 'Нет данных о компонентах',
    noServerLogs: 'Нет журналов сервера',
    noServerLogsActivityDesc: 'Активность в журналах сервера пока не зафиксирована',
    noServiceData: 'Нет данных о сервисах',
    percentOfTotal: '% от общего',
    topActions: 'Топ действий',
    topComponents: 'Топ компонентов',
    topServices: 'Топ сервисов',
    totalLogs: 'Всего записей',
  },
  gmail: {
    page: {
      title: 'Gmail',
      description: 'Просматривайте синхронизированные сообщения Gmail и управляйте ими.',
      empty_title: 'Письма не синхронизированы',
      empty_description:
        'Ещё не синхронизировано ни одного письма. Запустите синхронизацию на вашем Gmail-коннекторе.',
      error_title: 'Не удалось загрузить письма',
      no_connector_title: 'Gmail-коннектор не найден',
      no_connector_description:
        'Подключите аккаунт Gmail в коннекторах рабочего пространства для просмотра входящих.',
    },
    message: {
      from: 'От кого',
      to: 'Кому',
      date: 'Дата',
      subject: 'Тема',
      reply: 'Ответить',
      open_in_gmail: 'Открыть в Gmail',
      unread: 'Непрочитанное',
      attachments: 'Вложения ({count})',
      download: 'Скачать {name}',
      htmlIframeTitle: 'Текст письма',
      toggleHtml: 'Переключить HTML',
      showHtml: 'Показать HTML',
      toggleImages: 'Переключить изображения',
      loadImages: 'Загрузить изображения',
      imagesBlocked: 'Изображения заблокированы',
    },
    actions: {
      summarize: 'Резюмировать',
      draft_reply: 'Составить ответ',
      extract_tasks: 'Извлечь задачи',
      send_email: 'Отправить письмо',
      draft_sent: 'Черновик создан — проверьте в разделе Согласований',
      draft_failed: 'Не удалось создать черновик',
    },
  },
  jira: {
    page: {
      title: 'Jira',
      description: 'Просматривайте и управляйте синхронизированными тикетами Jira.',
      empty_title: 'Тикеты не синхронизированы',
      empty_description:
        'Тикеты Jira ещё не синхронизированы. Запустите синхронизацию в коннекторе Jira, чтобы загрузить тикеты.',
      error_title: 'Не удалось загрузить тикеты',
      no_connector_title: 'Коннектор Jira не найден',
      no_connector_description:
        'Подключите аккаунт Jira в Коннекторах Workspace, чтобы начать просмотр тикетов.',
    },
    ticket: {
      status: 'Статус',
      priority: 'Приоритет',
      assignee: 'Исполнитель',
      reporter: 'Автор',
      project: 'Проект',
      sprint: 'Спринт',
      story_points: 'Story Points',
      due_date: 'Срок',
      labels: 'Метки',
      issue_type: 'Тип',
      open_in_jira: 'Открыть в Jira',
      unassigned: 'Не назначен',
      no_sprint: 'Без спринта',
    },
    actions: {
      summarize: 'Резюме',
      write_comment: 'Написать комментарий',
      extract_tasks: 'Извлечь задачи',
    },
  },
  source_control: {
    page: {
      title: 'Контроль версий',
      description: 'Просматривайте pull request из GitHub, GitLab и Bitbucket.',
      empty_title: 'Pull request не синхронизированы',
      empty_description:
        'Pull request ещё не синхронизированы. Запустите синхронизацию в коннекторе контроля версий.',
      error_title: 'Не удалось загрузить pull request',
      no_connector_title: 'Коннектор контроля версий не найден',
      no_connector_description: 'Подключите GitHub, GitLab или Bitbucket в Коннекторах Workspace.',
    },
    pr: {
      author: 'Автор',
      source_branch: 'Из',
      target_branch: 'В',
      reviewers: 'Ревьюеры',
      additions: 'Добавления',
      deletions: 'Удаления',
      labels: 'Метки',
      draft: 'Черновик',
      open_pr: 'Открыть PR',
      state_open: 'Открыт',
      state_closed: 'Закрыт',
      state_merged: 'Слит',
      review_approved: 'Одобрен',
      review_changes: 'Запрошены изменения',
      review_pending: 'Ожидает проверки',
    },
    actions: {
      review: 'Проверить PR',
      summarize: 'Резюме',
      extract_tasks: 'Извлечь задачи',
    },
  },
  slack: {
    page: {
      title: 'Slack',
      description: 'Просматривайте и управляйте синхронизированными сообщениями Slack.',
      empty_title: 'Сообщения не синхронизированы',
      empty_description:
        'Сообщения Slack ещё не синхронизированы. Запустите синхронизацию в коннекторе Slack.',
      error_title: 'Не удалось загрузить сообщения',
      no_connector_title: 'Коннектор Slack не найден',
      no_connector_description: 'Подключите workspace Slack в Коннекторах Workspace.',
    },
    message: {
      channel: 'Канал',
      sender: 'От',
      date: 'Дата',
      thread_reply: 'Ответ в треде',
      open_in_slack: 'Открыть в Slack',
      reactions: 'Реакции',
    },
    actions: {
      summarize: 'Резюме',
      reply: 'Составить ответ',
      extract_tasks: 'Извлечь задачи',
    },
  },
  confluence: {
    page: {
      title: 'Confluence',
      description: 'Просматривайте и управляйте синхронизированными страницами Confluence.',
      empty_title: 'Страницы не синхронизированы',
      empty_description:
        'Страницы Confluence ещё не синхронизированы. Запустите синхронизацию на коннекторе Confluence.',
      error_title: 'Не удалось загрузить страницы',
      no_connector_title: 'Коннектор Confluence не найден',
      no_connector_description:
        'Подключите Confluence в Workspace Connectors для просмотра страниц.',
    },
    article: {
      space: 'Пространство',
      author: 'Автор',
      modified_by: 'Изменил',
      version: 'Версия',
      labels: 'Метки',
      parent: 'Родитель',
      open_page: 'Открыть в Confluence',
    },
    actions: {
      summarize: 'Резюме',
      extract_tasks: 'Извлечь задачи',
      write_comment: 'Написать комментарий',
    },
  },
  docs: {
    page: {
      title: 'Документы',
      description:
        'Просматривайте и управляйте синхронизированными документами из Google Drive, OneDrive и SharePoint.',
      empty_title: 'Документы не синхронизированы',
      empty_description:
        'Документы ещё не синхронизированы. Запустите синхронизацию на коннекторе Drive или SharePoint.',
      error_title: 'Не удалось загрузить документы',
      no_connector_title: 'Коннектор документов не найден',
      no_connector_description:
        'Подключите Google Drive, OneDrive или SharePoint в Workspace Connectors для просмотра документов.',
    },
    file: {
      owner: 'Владелец',
      modified_by: 'Изменил',
      size: 'Размер',
      type: 'Тип',
      open_file: 'Открыть файл',
      shared_with: 'Поделился',
      path: 'Путь',
    },
    actions: {
      summarize: 'Резюме',
      extract_tasks: 'Извлечь задачи',
      draft_email: 'Составить письмо',
    },
  },
  figma: {
    page: {
      title: 'Figma',
      description: 'Просмотр и управление синхронизированными файлами дизайна Figma.',
      empty_title: 'Дизайны не найдены',
      empty_description: 'Файлы дизайна Figma ещё не синхронизированы.',
      error_title: 'Не удалось загрузить дизайны',
      no_connector_title: 'Figma не подключена',
      no_connector_description: 'Подключите рабочее пространство Figma для просмотра дизайнов.',
    },
    design: {
      team: 'Команда',
      project: 'Проект',
      modified_by: 'Изменено',
      components: 'Компоненты',
      open_in_figma: 'Открыть в Figma',
      last_updated: 'Последнее обновление',
    },
    actions: {
      summarize: 'Резюме дизайна',
      extract_components: 'Извлечь компоненты',
      draft_spec: 'Составить спецификацию',
    },
  },
  workflow: {
    page: {
      title: 'Кросс-рабочие процессы',
      description:
        'Выберите объекты из нескольких провайдеров и запускайте действия ИИ на комбинированном контексте.',
      empty_title: 'Объекты не найдены',
      empty_description: 'Объекты рабочего пространства ещё не синхронизированы.',
      error_title: 'Не удалось загрузить объекты',
    },
    object: {
      add: 'Добавить',
      remove: 'Удалить',
      selected_count: 'объектов выбрано',
      clear_all: 'Очистить всё',
    },
    actions: {
      summarize_all: 'Резюмировать всё',
      extract_requirements: 'Извлечь требования',
      draft_prd: 'Составить PRD',
    },
  },
  gpuBadge: {
    cpuOnly: 'Только CPU',
    noGpu: 'GPU не обнаружен — нажмите, чтобы увидеть локальные модели',
    vendor: {
      nvidia: 'NVIDIA',
      amd: 'AMD ROCm',
      metal: 'Metal',
      intel: 'Intel/Vulkan',
      unknown: 'GPU',
      cpu: 'CPU',
    },
  },
  localFrontier: {
    title: 'Локальные frontier-модели',
    subtitle:
      'Запускайте frontier-LLM с открытыми весами (Kimi K2, GLM-5.1, DeepSeek V3.2/V4) полностью локально.',
    loading: 'Загрузка каталога…',
    catalogEmpty: 'Ни одна модель не соответствует фильтрам.',
    catalogError: 'Не удалось загрузить каталог. Проверьте claw-llamacpp-service.',
    contextLength: 'токенов контекста',
    requiresRamGb: 'ГБ ОЗУ',
    sourceLink: 'HuggingFace',
    actions: {
      download: 'Скачать',
      load: 'Загрузить',
      unload: 'Выгрузить',
      deleteWeights: 'Удалить веса',
      configure: 'Настроить рантайм',
    },
    download: { start: 'Скачать', cancel: 'Отмена', retry: 'Повторить' },
    compat: {
      fits: 'Подходит под оборудование',
      warns: 'Граничное оборудование',
      refuses: 'Недостаточно оборудования',
    },
    qualityTier: { survival: 'Выживание', balanced: 'Сбалансированно', best: 'Лучшее' },
    preflight: {
      RAM_INSUFFICIENT: 'Недостаточно ОЗУ для этой модели.',
      DISK_INSUFFICIENT: 'Недостаточно места на диске (нельзя обойти).',
      GPU_INSUFFICIENT: 'Совместимый GPU не обнаружен.',
      BINARY_NOT_INSTALLED: 'Бинарник llama-server ещё не установлен.',
      RUNTIME_INCOMPATIBLE: 'Установленная среда не может запустить эту модель.',
    },
    override: {
      warning: 'Оборудование ниже требований. Обходите проверку только если понимаете риск.',
      confirmTypeSize: 'Введите размер модели в ГБ для подтверждения обхода:',
    },
    delete: {
      confirm: 'Удалить веса?',
      confirmTypePrompt: 'Введите имя модели (например glm-5.1:Q4_K_M) для подтверждения удаления.',
    },
    hardware: {
      title: 'Оборудование и рантайм',
      subtitle: 'Текущий снимок этой машины и бинарника llama.cpp.',
      refresh: 'Обновить',
      ram: 'ОЗУ',
      disk: 'Диск',
      cpu: 'CPU',
      gpu: 'GPU',
      binary: 'Бинарник',
      cores: 'ядер',
      noGpu: 'GPU не обнаружен',
      notInstalled: 'Не установлен',
      loadedModel: 'Загруженная модель',
      noLoadedModel: 'Ничего не загружено',
    },
    filters: {
      category: 'Категория',
      qualityTier: 'Уровень качества',
      compatibleOnly: 'Только совместимые',
      refreshCatalog: 'Обновить каталог',
      refreshing: 'Обновление…',
      allCategories: 'Все категории',
      allTiers: 'Все уровни',
      categoryCoding: 'Код',
      categoryReasoning: 'Рассуждение',
      categoryThinking: 'Мышление',
      categoryGeneral: 'Общий',
      categoryFileGen: 'Генерация файлов',
    },
    downloads: {
      title: 'Активные загрузки',
      empty: 'Нет активных или недавних загрузок.',
      cancel: 'Отмена',
      retry: 'Повторить',
      remove: 'Закрыть',
      status: 'Статус',
      bytes: 'Байты',
      files: 'Файлы',
      rate: 'Скорость',
      eta: 'Расч. время',
      unknown: 'Подготовка…',
    },
    deleteDialog: {
      title: 'Удалить веса',
      description: 'Это безвозвратно удалит загруженные веса с диска.',
      promptLabel: 'Введите для подтверждения',
      placeholder: 'модель:тег',
      cancel: 'Отмена',
      confirm: 'Удалить веса',
      warning: 'Нельзя отменить. Для повторного использования модель придётся скачать заново.',
    },
    overrideDialog: {
      title: 'Обойти проверку оборудования?',
      description: 'Ваша машина не соответствует рекомендуемым требованиям.',
      reasonsTitle: 'Причины:',
      cancel: 'Отмена',
      proceed: 'Скачать всё равно',
    },
    configDialog: {
      title: 'Конфигурация рантайма',
      description: 'Настройте параметры llama.cpp для загруженной модели.',
      ngpuLayers: 'Слои GPU',
      ngpuLayersHint: 'Количество слоёв на GPU. Пусто = автоматически.',
      ctxSize: 'Размер контекста',
      ctxSizeHint: 'Максимальное окно контекста в токенах.',
      threads: 'Потоки CPU',
      threadsHint: 'Количество CPU-потоков. Пусто = автоматически.',
      cpuMoe: 'CPU MoE',
      cpuMoeHint: 'Выполнять слои mixture-of-experts только на CPU.',
      customArgs: 'Пользовательские args',
      customArgsHint: 'Дополнительные флаги llama-server (allowlist применяется).',
      cancel: 'Отмена',
      save: 'Сохранить',
    },
  },

  emailTemplates: {
    page: {
      title: 'Шаблоны писем',
      description:
        'Многоразовые заготовки (тема + текст) для писем, составленных ИИ. {{placeholders}} заполняются при использовании шаблона.',
      loading: 'Загрузка шаблонов…',
      error: 'Не удалось загрузить шаблоны. Обновите страницу.',
      empty: 'Шаблонов пока нет. Создайте, чтобы начать.',
      create: 'Новый шаблон',
      edit: 'Изменить',
      delete: 'Удалить',
      deleting: 'Удаление…',
      defaultBadge: 'Основной',
      subjectLabel: 'Тема',
    },
    dialog: {
      createTitle: 'Создать шаблон',
      editTitle: 'Изменить шаблон',
      nameLabel: 'Название',
      namePlaceholder: 'Письмо-напоминание',
      subjectLabel: 'Тема',
      subjectPlaceholder: 'Напоминание по {{topic}}',
      bodyLabel: 'Текст',
      bodyPlaceholder: 'Здравствуйте, {{name}}!\n\nВозвращаюсь к теме {{topic}}…',
      defaultLabel: 'Использовать как основной',
      save: 'Сохранить',
      saving: 'Сохранение…',
      cancel: 'Отмена',
    },
  },

  inbox: {
    page: {
      title: 'Входящие рабочего пространства',
      description:
        'Cross-provider feed of every recent workspace object — filter by provider, type, attention.',
      loading: 'Загрузка входящих…',
      loadingMore: 'Загрузка…',
      loadMore: 'Загрузить ещё',
      empty: 'Нет элементов по фильтрам.',
      error: 'Не удалось загрузить входящие. Обновите.',
    },
    filter: {
      providers: 'Поставщик:',
      types: 'Тип:',
      needsAttention: 'Требует внимания',
      hasSuggestion: 'Есть предложение',
      reset: 'Сбросить фильтры',
    },
    row: {
      needsAttention: 'Требует внимания',
      hasSuggestion: 'Есть предложение',
      mark: 'Отметить для внимания',
      unmark: 'Снять отметку',
      openExternal: 'Открыть',
      viewFile: 'Открыть файл',
    },
  },
  fileViewer: {
    loading: 'Загрузка файла…',
    error: 'Не удалось загрузить этот файл.',
    unsupported:
      'Предпросмотр недоступен для этого типа файла. Используйте «Скачать», чтобы открыть его локально.',
    download: 'Скачать',
    close: 'Закрыть',
  },
  search: {
    page: {
      title: 'Семантический поиск',
      description: 'Поиск по всем вашим объектам — локальные эмбеддинги с конфиденциальностью.',
      placeholder: 'Type a natural-language question…',
      submit: 'Поиск',
      searching: 'Поиск…',
      reset: 'Сбросить',
      local: 'Локальные эмбеддинги ({model})',
      noResults: 'Нет совпадений. Попробуйте другие слова.',
      error: 'Поиск не удался. Попробуйте ещё раз.',
    },
  },
  digest: {
    page: {
      title: 'Сводка',
      description: 'Утренний дайджест: что изменилось в подключённых рабочих пространствах.',
      loading: 'Загрузка сводки…',
      error: 'Не удалось загрузить сводку.',
      noTodayDigest: 'Сводки на сегодня нет. Запустите вручную или ждите крон.',
      today: 'Сводка за сегодня',
      history: 'Предыдущие сводки',
      generatedAt: 'Создано {ts}',
      sectionsCount: '{n} sections',
      triggerDaily: 'Запустить ежедневную сводку',
      triggerWeekly: 'Запустить еженедельную сводку',
      triggering: 'Создание…',
      preferenceHint: 'Ежедневно в {hour}:00 ({tz})',
    },
    section: {
      highlights: 'Важное',
      actionItems: 'Задачи',
    },
  },
  adminAutomation: {
    dismiss: 'Закрыть',
    retry: 'Повторить',
    policies: {
      title: 'Политики действий ИИ',
      description:
        'Строгие правила одобрения по умолчанию. Системные настройки по умолчанию можно отключить, но нельзя удалить.',
      loading: 'Загрузка политик…',
      error: 'Не удалось загрузить политики.',
      empty: 'Политики ещё не настроены.',
      systemDefault: 'Системное по умолчанию',
      priority: 'Приоритет {p}',
      providerRegex: 'Регекс поставщика',
      actionKindRegex: 'Регекс вида действия',
      riskCeiling: 'Лимит риска',
      delete: 'Удалить',
      cannotDelete: 'Системные значения нельзя удалить',
      toggleActive: 'Переключить активность',
      toggleSucceeded: 'Политика обновлена.',
      toggleFailed: 'Не удалось обновить политику.',
      deleteSucceeded: 'Политика удалена.',
      deleteFailed: 'Не удалось удалить политику.',
      mutationError: 'Произошла ошибка при обновлении политики.',
      addPolicy: 'Добавить политику',
      editPolicy: 'Редактировать политику',
      createTitle: 'Создать политику',
      editTitle: 'Редактировать политику',
      createDescription:
        'Определите новое правило одобрения для рабочих действий, подготовленных ИИ.',
      editDescription: 'Обновите это правило одобрения. Имя нельзя изменить.',
      createSucceeded: 'Политика создана.',
      createFailed: 'Не удалось создать политику.',
      updateSucceeded: 'Политика обновлена.',
      updateFailed: 'Не удалось обновить политику.',
      submit: 'Сохранить политику',
      submitting: 'Сохранение…',
      nameLabel: 'Имя',
      nameHelp: 'Идентификатор в нижнем регистре в kebab-case (например, deny-pii).',
      descriptionLabel: 'Описание',
      kindFieldLabel: 'Тип',
      requireReasonLabel: 'Требовать причину для HIGH/CRITICAL',
      isActiveLabel: 'Активна',
      riskMaxScoreLabel: 'Максимальный рейтинг риска (0–100)',
      priorityLabel: 'Приоритет (0–10000)',
      kindLabel: {
        DENY: 'Отказать',
        ALLOW: 'Разрешить',
        AUTO_APPROVE: 'Авто-одобрение',
      },
      riskLabel: {
        LOW: 'Низкий',
        MEDIUM: 'Средний',
        HIGH: 'Высокий',
        CRITICAL: 'Критический',
      },
    },
    rules: {
      title: 'Правила запуска',
      description:
        'Правила, превращающие необработанные события провайдера в черновые предложения. Редактируйте, отключайте или удаляйте.',
      loading: 'Загрузка правил…',
      error: 'Не удалось загрузить правила.',
      empty: 'Правила ещё не настроены.',
      systemDefault: 'Системное по умолчанию',
      priority: 'Приоритет {p}',
      eventType: 'Тип события',
      actionKind: 'Вид действия',
      providerRegex: 'Регекс поставщика',
      contentRegex: 'Регекс содержимого',
      delete: 'Удалить',
      cannotDelete: 'Системные значения нельзя удалить',
      toggleActive: 'Переключить активность',
      toggleSucceeded: 'Правило обновлено.',
      toggleFailed: 'Не удалось обновить правило.',
      deleteSucceeded: 'Правило удалено.',
      deleteFailed: 'Не удалось удалить правило.',
      mutationError: 'Произошла ошибка при обновлении правила.',
      addRule: 'Добавить правило',
      editRule: 'Редактировать правило',
      createTitle: 'Создать правило',
      editTitle: 'Редактировать правило',
      createDescription: 'Определите, когда составлять предложение по событию рабочей области.',
      editDescription: 'Обновите это правило-триггер. Имя нельзя изменить.',
      createSucceeded: 'Правило создано.',
      createFailed: 'Не удалось создать правило.',
      updateSucceeded: 'Правило обновлено.',
      updateFailed: 'Не удалось обновить правило.',
      submit: 'Сохранить правило',
      submitting: 'Сохранение…',
      nameLabel: 'Имя',
      nameHelp: 'Идентификатор в нижнем регистре в kebab-case (например, github-pr-opened).',
      descriptionLabel: 'Описание',
      eventTypeHelp: 'Шаблон события, например workspace.webhook.received.',
      actionKindHelp: 'Тип действия, например SUMMARIZE, DRAFT, REWRITE.',
      isActiveLabel: 'Активна',
      priorityLabel: 'Приоритет (0–10000)',
    },
  },
  adminWebhooks: {
    page: {
      title: 'Доставки вебхуков',
      description:
        'Просматривайте и воспроизводите входящие доставки вебхуков от ваших провайдеров.',
      loading: 'Загрузка доставок…',
      error: 'Не удалось загрузить доставки вебхуков.',
      empty: 'Нет доставок, соответствующих фильтрам.',
    },
    filter: {
      providerPlaceholder: 'Фильтр по провайдеру (например, GITHUB)',
      connectorPlaceholder: 'Фильтр по ID коннектора',
      signaturePlaceholder: 'Состояние подписи',
      signatureAny: 'Любая подпись',
      signatureValid: 'Действительная подпись',
      signatureInvalid: 'Недействительная подпись',
      clear: 'Очистить фильтры',
    },
    row: {
      deliveryId: 'ID доставки',
      connector: 'Коннектор',
      bytes: 'Байты тела',
      processedAt: 'Обработано в',
    },
    status: {
      accepted: 'Принято',
      rejected: 'Отклонено',
      idempotent: 'Идемпотентно',
    },
    replay: 'Воспроизвести',
    replaying: 'Повторная отправка…',
    replaySucceeded: 'Доставка вебхука повторена.',
    replayFailed: 'Не удалось повторить доставку вебхука.',
  },
  implHandoff: {
    page: {
      title: 'Передача кода',
      description:
        'Approved IMPL_PROMPT actions delivered to chat threads, agent terminals, or clipboard.',
      loading: 'Загрузка передач…',
      error: 'Не удалось загрузить передачи.',
      empty: 'Передач пока нет. Одобрите IMPL_PROMPT в очереди.',
      openThread: 'Открыть цепочку →',
    },
    picker: {
      title: 'Отправить IMPL_PROMPT в…',
      description: 'Выберите, куда доставить одобренный бриф кода.',
      cancel: 'Отмена',
      CHAT: { hint: 'Открыть новую цепочку с загруженным брифом' },
      AGENT: { hint: 'Поместить в очередь терминала агента' },
      CLIPBOARD: { hint: 'Копировать для внешних инструментов' },
    },
  },
  learned: {
    panel: {
      title: 'Что мы узнали',
      subtitle: '{count} preferences',
      description:
        'Patterns derived from your approve / reject / edit decisions. Used to personalise future suggestions.',
      loading: 'Загрузка…',
      error: 'Не удалось загрузить настройки.',
      empty: 'Учимся на ваших одобрениях — настроек пока нет.',
    },
  },
};
